public void AddCase(Case @case)
 {
     using (var connection = new SqlConnection(_connectionString))
     {
         connection.Open();
         connection.Insert(CaseTableName, ToKeyValuePairs(@case));
     }
 }
 public void UpdateCase(Case @case)
 {
     using (var connection = new SqlConnection(_connectionString))
     {
         connection.Open();
         connection.Update(CaseTableName,
                           new KeyValuePair<string, object>("编号", @case.编号),
                           ToKeyValuePairs(@case));
     }
 }
 public void StartCase(Case @case)
 {
     var resetEvent = new ManualResetEvent(false);
     WorkflowApplication wfApp = GetWorkflowApplication(new CaseWorkflow {CaseType = @case.案件类型}, @case.编号,
                                                        resetEvent);
     lock (this)
     {
         wfApp.Run();
         resetEvent.WaitOne(TimeSpan.FromMinutes(1));
     }
 }
 private static void 客户指示处理测试(Case @case, User user)
 {
     立案(@case);
     分案(@case.编号, user);
     办案(@case.编号, user, TaskNames.客户指示办案).Should().BeTrue();
     流程部质检(@case.编号, false);
     办案(@case.编号, user, TaskNames.客户指示办案).Should().BeTrue();
     流程部质检(@case.编号, false);
     办案(@case.编号, user, TaskNames.客户指示办案).Should().BeTrue();
     流程部质检(@case.编号, true);
     处理提交并确认(@case.编号);
 }
        private static void 官方来函测试(Case @case, User user)
        {
            立案(@case);
            分案(@case.编号, user);

            办案(@case.编号, user, TaskNames.官方来函办案);
            代理部内审(@case.编号, false);
            办案(@case.编号, user, TaskNames.官方来函办案);
            代理部内审(@case.编号, true);
            文员处理案件(@case.编号, TaskNames.制作官方格式函);
            流程部质检(@case.编号, false);
            办案(@case.编号, user, TaskNames.官方来函办案);
            代理部内审(@case.编号, true);
            文员处理案件(@case.编号, TaskNames.制作官方格式函);
            流程部质检(@case.编号, true);
            处理提交并确认(@case.编号);
        }
 private static IEnumerable<KeyValuePair<string, object>> ToKeyValuePairs(Case @case)
 {
     return new Dictionary<string, object>
                {
                    {"编号", @case.编号},
                    {"名称", @case.名称},
                    {"案件类型", @case.案件类型},
                    {"创建时间", @case.创建时间},
                    {"绝限日", @case.绝限日},
                    {"状态", @case.状态},
                    {"客户号", @case.客户号},
                    {"申请人证件号", @case.申请人证件号},
                    {"发明人身份证号", @case.发明人身份证号},
                    {"主办员用户名", @case.主办员用户名},
                    {"翻译用户名", @case.翻译用户名},
                    {"一校用户名", @case.一校用户名},
                    {"二校用户名", @case.二校用户名}
                };
 }
        private static void 新申请测试(Case @case, User 主办员, User 翻译, User 一校, User 二校)
        {
            立案(@case);
            分案(@case.编号, 主办员, 翻译, 一校, 二校);

            Action 处理新申请案件 =
                () => Parallel.Invoke(() => 办案(@case.编号, 主办员, TaskNames.撰写五书)
                                                .Should().BeTrue(),
                                      () =>
                                          {
                                              办案(@case.编号, 一校, TaskNames.原始资料翻译一校)
                                                  .Should().BeFalse();
                                              办案(@case.编号, 翻译, TaskNames.原始资料翻译)
                                                  .Should().BeTrue();

                                              办案(@case.编号, 二校, TaskNames.原始资料翻译二校)
                                                  .Should().BeFalse();
                                              办案(@case.编号, 一校, TaskNames.原始资料翻译一校)
                                                  .Should().BeTrue();

                                              办案(@case.编号, 二校, TaskNames.原始资料翻译二校)
                                                  .Should().BeTrue();
                                          });
            处理新申请案件();
            // 第一次内审不通过
            代理部内审(@case.编号, false);
            处理新申请案件();
            // 第二次内审通过
            代理部内审(@case.编号, true);

            办案(@case.编号, 主办员, TaskNames.定稿五书).Should().BeTrue();

            文员处理案件(@case.编号, TaskNames.制作专利请求书);

            流程部质检(@case.编号, true);
            处理提交并确认(@case.编号);
        }
 /// <summary>
 /// 返回与案件<param name="case" />相关的所有<see cref="CaseDoc"/>。
 /// </summary>
 public static IEnumerable<CaseDoc> GetDocsOf(this ICaseDocManager manager, Case @case)
 {
     return manager.GetDocsOf(@case.编号);
 }
 /// <summary>
 /// 返回与案件<param name="case" />相关的所有<see cref="CaseMessage"/>。
 /// </summary>
 public static IEnumerable<CaseMessage> GetDocsOf(this ICaseMessageManager manager, Case @case)
 {
     return manager.GetMessagesOf(@case.编号);
 }
 /// <summary>
 /// 表示的案件<param name="case"/>中名为<param name="taskName"/>的任务已被完成,案件流程可以继续。
 /// </summary>
 /// <returns>案件是否成功继续。</returns>
 public static bool ResumeCase(this ICaseWorkflowManager manager, Case @case, string taskName)
 {
     return manager.ResumeCase(@case, taskName, new object());
 }
 /// <summary>
 /// 表示的案件<param name="case"/>中名为<param name="taskName"/>的任务已被完成,案件流程可以继续。
 /// </summary>
 /// <param name="value">
 ///     任务结果,作为可能影响案件流程的参数。
 ///     <example>如对于内审任务,传入true/false表示内审是否通过。</example>
 /// </param>
 /// <returns>案件是否成功继续。</returns>
 public static bool ResumeCase(this ICaseWorkflowManager manager, Case @case, string taskName, object value)
 {
     return manager.ResumeCase(@case.编号, taskName, value);
 }
        private static void 立案(Case @case)
        {
            Debug.WriteLine("立案:" + @case.编号);
            var caseInfoManager = ServiceLocator.Current.GetInstance<ICaseInfoManager>();
            var caseWorkflowManager = ServiceLocator.Current.GetInstance<ICaseWorkflowManager>();

            @case.状态 = CaseState.OnGoing;
            // 首先保存案件信息
            caseInfoManager.AddCase(@case);
            
            // 然后启动案件流程
            caseWorkflowManager.StartCase(@case);

            // 应该已经保存了
            Case? caseGot = caseInfoManager.GetCaseById(@case.编号);
            caseGot.Should().NotBeNull();
            caseGot.Value.状态.Should().Be(CaseState.OnGoing);
        }