WorkFlowService.cs 40 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6. using PMS.EntityModels.WorkFlow;
  7. using QWPlatform.IService;
  8. using PMS.BusinessModels.Problem;
  9. using System.Data;
  10. using PMS.BusinessModels.MobileProblem;
  11. using QWPlatform.SystemLibrary.LogManager;
  12. using QWPlatform.SystemLibrary;
  13. using PMS.BusinessModels.Account;
  14. using PMS.Plugins.Common;
  15. namespace PMS.DBService.WorkFlow
  16. {
  17. /// <summary>
  18. /// 创 建 人:王海洋
  19. /// 创建日期:2019-01-25
  20. /// 功能描述:问题工作流服务
  21. /// </summary>
  22. public class WorkFlowService : DataServiceBase
  23. {
  24. protected override void DBFctory(string conName)
  25. {
  26. base.DBFctory(conName);
  27. }
  28. /// <summary>
  29. /// 列表查询(根据目录ID查询)
  30. /// </summary>
  31. /// <param name="CategoryID">目录ID</param>
  32. /// <returns>返回该目录下有效的工作流列表</returns>
  33. public List<WorkFlowModel> SelectList(int categoryID)
  34. {
  35. var model = new WorkFlowModel()
  36. {
  37. CategoryID = categoryID,
  38. Active = 1
  39. };
  40. model.SetDataFactory(this.DataFactoryObject);
  41. return model.SelectList<WorkFlowModel>();
  42. }
  43. /// <summary>
  44. /// 根据流程ID获取模型
  45. /// </summary>
  46. /// <param name="id">ID</param>
  47. /// <returns></returns>
  48. public WorkFlowModel GetModelById(int workflowid)
  49. {
  50. var model = new WorkFlowModel()
  51. {
  52. ID = workflowid
  53. };
  54. model.SetDataFactory(this.DataFactoryObject);
  55. var r = model.Select();
  56. if (r)
  57. { //返回查询结果的model
  58. return model;
  59. }
  60. return null;
  61. }
  62. /// <summary>
  63. /// 根据工作流返回上一工作流的ID
  64. /// </summary>
  65. /// <param name="id">ID</param>
  66. /// <returns></returns>
  67. public int? GetPreviousID(int workflowid)
  68. {
  69. var model = GetModelById(workflowid);
  70. if (model != null)
  71. {//获取到model
  72. return model.PreviousID;
  73. }
  74. return null;
  75. }
  76. #region 登记新问题
  77. /// <summary>
  78. /// 根据工作流ID获取下一工作流的ID
  79. /// </summary>
  80. /// <param name="categoryID">分类目录ID</param>
  81. /// <param name="personProperty">人员性质,1:本部人员,2:渠道人员,3: 操作员,4:医院管理员,5:卫计委管理员</param>
  82. /// <param name="problemProperty">问题性质,1:Bug,2:咨询,3:需求,4:优化</param>
  83. /// <returns>返回处理流程的ID</returns>
  84. public int? GetNewRequirementWorkFlowID(int categoryID, int personProperty, int problemProperty)
  85. {
  86. var sql = @"select t.ID
  87. from 问题工作流程 t , 问题流程环节 b
  88. where t.环节id = b.Id
  89. and t.目录ID =:categoryID
  90. and t.环节ID =5 ";//环节ID:5 为研发处理
  91. var result = this.SqlBuilder
  92. .SqlText(sql)
  93. .Parameters("categoryID", categoryID)
  94. .Select<int>();
  95. if (result == 0)
  96. {
  97. Logger.Instance.Error("调用GetNewRequirementWorkFlowID方法,获取进入流程ID为0!");
  98. }
  99. return result;
  100. }
  101. /// <summary>
  102. /// 登录一个新的Bug问题,返回新的流程ID
  103. /// </summary>
  104. /// <param name="categoryID">目录分类ID</param>
  105. /// <param name="personProperty">人员性质</param>
  106. /// <returns>返回登记bug跳到下一个流程ID</returns>
  107. public int? GetNewBugProblemWorkFlowID(int categoryID, int personProperty)
  108. {
  109. int? workflowid;
  110. ///如果登记的人员是客户
  111. if (personProperty == 3)
  112. {
  113. //获取目标流程ID
  114. var sql = @"select 目标ID from 问题工作流程 where 目录ID=:categoryID and 环节ID=0 ";
  115. workflowid = this.SqlBuilder
  116. .SqlText(sql)
  117. .Parameters("categoryID", categoryID)
  118. .Select<int>();
  119. }
  120. ///如果是其他管理员
  121. else
  122. {
  123. //获取目标流程ID
  124. var sql = @"select t.id
  125. from 问题工作流程 t , 问题流程环节 b
  126. where t.环节id >= b.Id
  127. and t.目录ID=:categoryID
  128. and b.人员性质=:personProperty
  129. and rownum=1 order by t.序号 asc ";
  130. workflowid = this.SqlBuilder
  131. .SqlText(sql)
  132. .Parameters("categoryID", categoryID)
  133. .Parameters("personProperty", personProperty)
  134. .Select<int>();
  135. }
  136. if (workflowid == 0)
  137. {
  138. Logger.Instance.Error("调用GetNewBugProblemWorkFlowID方法,获取进入流程ID为0!");
  139. }
  140. return workflowid;
  141. }
  142. #endregion
  143. #region 提交获取下个流程ID
  144. /// <summary>
  145. /// 获取正常流程的下一个ID
  146. /// </summary>
  147. /// <param name="personProperty">人员性质</param>
  148. /// <param name="problemId">问题ID</param>
  149. /// <returns>返回下个流程ID,如果人员性质不匹配,则返回为0</returns>
  150. public int GetSubmitNextWorkFlowID(int personProperty, string problemId)
  151. {
  152. var sql = @"select w.目标id from 问题记录 t,问题工作流程 w, 问题流程环节 b
  153. where t.流程id = w.Id
  154. and w.环节id =b.Id
  155. and t.id = :ID
  156. and b.人员性质=:人员性质";
  157. var workflowid = this.SqlBuilder
  158. .SqlText(sql)
  159. .Parameters("ID", problemId)
  160. .Parameters("人员性质", personProperty)
  161. .Select<int>();
  162. if (workflowid == 0)
  163. {
  164. Logger.Instance.Error("调用GetSubmitNextWorkFlowID方法,获取进入流程ID为0!");
  165. }
  166. return workflowid;
  167. }
  168. /// <summary>
  169. /// 跳转流程处理方式,即通过当前问题没有找到匹配的下一个流程ID,即根据人员性质与目录ID,获取当前人员处理的下一个流程ID
  170. /// 直接根据当前人员的性质进行判断下一步流转到哪里,例如,当前是卫计委管理员,则直接流程到项目处理,如果当前是项目处理
  171. /// 向上提交直接流转到技术支持,如果是项目支持人员,直接流转到研发,跟问题当前处于哪个环节无关。
  172. /// </summary>
  173. /// <param name="categoryId">目录ID</param>
  174. /// <param name="personProperty">人员性质</param>
  175. /// <returns></returns>
  176. public int GetSubmitSkipNextWorkFlowID(int personProperty, string problemId)
  177. {
  178. ///获取目录Id
  179. var categoryId = this.SelectBuilder.From("问题记录 a,问题工作流程 b").Columns("b.目录ID").Where("a.流程ID=b.ID").Where("a.ID", problemId).Select<int>();
  180. var sql = @"select t.目标id from 问题工作流程 t,问题流程环节 b
  181. where t.环节id >= b.Id
  182. and t.目录ID = :目录ID
  183. and b.人员性质= :人员性质 order by t.序号 asc ";
  184. var workflowid = this.SqlBuilder
  185. .SqlText(sql)
  186. .Parameters("目录ID", categoryId)
  187. .Parameters("人员性质", personProperty)
  188. .Select<int>();
  189. if (workflowid == 0)
  190. {
  191. Logger.Instance.Error("调用GetSubmitSkipNextWorkFlowID方法,获取进入流程ID为0!");
  192. }
  193. return workflowid;
  194. }
  195. #endregion
  196. #region 回退问题
  197. /// <summary>
  198. /// 获取回退的流程ID
  199. /// </summary>
  200. /// <param name="categoryId"></param>
  201. /// <param name="problemId"></param>
  202. /// <returns></returns>
  203. public int GetBackWorkFlowID(string problemId)
  204. {
  205. var sql = @"select t.来源流程ID from 问题记录过程 t, 问题记录 r
  206. where t.问题id = r.Id
  207. and r.id = :问题ID
  208. and t.当前流程id = r.流程id
  209. and t.当前流程id > t.来源流程ID
  210. order by t.记录时间 desc ";
  211. var workflowid = this.SqlBuilder
  212. .SqlText(sql)
  213. .Parameters("问题ID", problemId)
  214. .Select<int>();
  215. if (workflowid == 0)
  216. {
  217. Logger.Instance.Error("调用GetBackWorkFlowID方法,获取进入流程ID为0!");
  218. }
  219. return workflowid;
  220. }
  221. #endregion
  222. #region 问题操作相关
  223. /// <summary>
  224. /// 获取非提交回退类处理操作的一进入流程Id
  225. /// </summary>
  226. /// <param name="problemId"></param>
  227. /// <param name="personProperty"></param>
  228. /// <returns></returns>
  229. public int? GetDealWorkId(string problemId, int personProperty, string JobCode)
  230. {
  231. ///获取目录Id
  232. var categoryId = this.SelectBuilder.Columns("b.目录ID").From("问题记录 a,问题工作流程 b").Where("a.流程ID=b.ID").Where("a.ID", problemId).Select<int>();
  233. var sql = @"select t.id
  234. from 问题工作流程 t , 问题流程环节 b
  235. where t.环节id >= b.Id
  236. and t.目录ID=:categoryID
  237. and b.人员性质=:personProperty
  238. ";
  239. var SqlBuilder = this.SqlBuilder;
  240. SqlBuilder.Parameters("categoryID", categoryId)
  241. .Parameters("personProperty", personProperty);
  242. if (personProperty == 1)
  243. {
  244. sql += @" and Exists
  245. (select column_value from table(Select f_Split_String(x.职务代码1, ',') from 问题流程环节 x
  246. where id = b.Id)
  247. where Column_Value =:Job) ";
  248. SqlBuilder.Parameters("Job", Convert.ToInt32(JobCode));
  249. }
  250. sql += " order by t.序号 asc ";
  251. var workflowid = SqlBuilder
  252. .SqlText(sql)
  253. .Select<int>();
  254. if (workflowid == 0)
  255. {
  256. Logger.Instance.Warn("调用GetDealWorkId方法,获取进入流程ID为0!");
  257. }
  258. return workflowid;
  259. }
  260. /// <summary>
  261. /// 问题受理
  262. /// </summary>
  263. /// <param name="Model"></param>
  264. /// <returns></returns>
  265. public int ProblemAccept(ProblemDealModel Model)
  266. {
  267. //判断进入流程ID是否为0
  268. if (Model.NextWorkId == 0)
  269. {
  270. Logger.Instance.Error("调用ProblemAccept方法传入的进入流程ID为0,请检查获取进入流程ID方法");
  271. return 0;
  272. }
  273. return this.ProcedureBuilder
  274. .Procedure("B_问题处理.P_问题受理")
  275. .Paramter("问题ID_In", Model.ProblemId)
  276. .Paramter("进入流程ID_In", Model.NextWorkId)
  277. .Paramter("操作人_In", Model.DealPeronName)
  278. .Paramter("操作人ID_In", Model.DealPeronId)
  279. .Paramter("操作时间_In", this.DataBaseBuilder.GetDateTime)
  280. .Paramter("耗时_In", PassTime(Model.ProblemId))
  281. .Execute();
  282. }
  283. /// <summary>
  284. /// 问题回退
  285. /// </summary>
  286. /// <returns></returns>
  287. public int ProblemRollBack(ProblemDealModel Model, out string ProcessId)
  288. {
  289. //判断进入流程ID是否为0
  290. if (Model.NextWorkId == 0)
  291. {
  292. Logger.Instance.Error("调用ProblemRollBack方法传入的进入流程ID为0,请检查获取进入流程ID方法");
  293. ProcessId = "";
  294. return 0;
  295. }
  296. var Pro = this.ProcedureBuilder
  297. .Procedure("B_问题处理.P_问题回退")
  298. .Paramter("问题ID_In", Model.ProblemId)
  299. .Paramter("进入流程ID_In", Model.NextWorkId)
  300. .Paramter("操作描述_In", Model.Describe)
  301. .Paramter("操作人ID_In", Model.DealPeronId)
  302. .Paramter("操作时间_In", this.DataBaseBuilder.GetDateTime)
  303. .Paramter("耗时_In", PassTime(Model.ProblemId))
  304. .ParamterOut("过程ID_Out", DbType.String, 36);
  305. var result = Pro.Execute();
  306. ProcessId = Pro.ParameterValue<string>("过程ID_Out");
  307. try
  308. {
  309. if (!string.IsNullOrEmpty(Model.ProblemTypeID))
  310. {
  311. UpdateBuilder.Update("问题记录").Where("ID", Model.ProblemId).Column("技术支持分类ID", Model.ProblemTypeID).Execute();
  312. }
  313. }
  314. catch (Exception ex)
  315. {
  316. Logger.Instance.Error("[加分类ID是为了服务部方便统计咨询回退问题]问题回退分类出现异常:" + ex);
  317. }
  318. return result;
  319. }
  320. /// <summary>
  321. /// 问题终止
  322. /// </summary>
  323. /// <param name="Model"></param>
  324. /// <returns></returns>
  325. public int ProblemBreak(ProblemDealModel Model, out string ProcessId)
  326. {
  327. var Pro = this.ProcedureBuilder
  328. .Procedure("B_问题处理.P_问题终止")
  329. .Paramter("问题ID_In", Model.ProblemId)
  330. .Paramter("操作描述_In", Model.Describe)
  331. .Paramter("操作人ID_In", Model.DealPeronId)
  332. .Paramter("操作时间_In", this.DataBaseBuilder.GetDateTime)
  333. .Paramter("耗时_In", PassTime(Model.ProblemId))
  334. .ParamterOut("过程ID_Out", DbType.String, 36);
  335. var result = Pro.Execute();
  336. ProcessId = Pro.ParameterValue<string>("过程ID_Out");
  337. if (!string.IsNullOrEmpty(Model.ProblemTypeID))
  338. {
  339. if (SqlBuilder.SqlText("select 性质 from 人员信息 where id=:ID").Parameters("ID", Model.DealPeronId).Select().Rows[0]["性质"].ToInt32() == 1)
  340. {
  341. UpdateBuilder.Update("问题记录").Where("ID", Model.ProblemId).Column("技术支持分类ID", Model.ProblemTypeID).Execute();
  342. }
  343. else
  344. {
  345. UpdateBuilder.Update("问题记录").Where("ID", Model.ProblemId).Column("分类ID", Model.ProblemTypeID).Execute();
  346. }
  347. }
  348. return result;
  349. }
  350. /// <summary>
  351. /// 问题指派
  352. /// </summary>
  353. /// <param name="Model"></param>
  354. /// <returns></returns>
  355. public int ProblemAssgin(ProblemDealModel Model, out string ProcessId)
  356. {
  357. //判断进入流程ID是否为0
  358. if (Model.NextWorkId == 0)
  359. {
  360. Logger.Instance.Error("调用ProblemAssgin方法传入的进入流程ID为0,请检查获取进入流程ID方法");
  361. ProcessId = "";
  362. return 0;
  363. }
  364. try
  365. {
  366. var Pro = this.ProcedureBuilder
  367. .Procedure("B_问题处理.P_问题指派")
  368. .Paramter("问题ID_In", Model.ProblemId)
  369. .Paramter("进入流程ID_In", Model.NextWorkId)
  370. .Paramter("操作描述_In", Model.Describe)
  371. .Paramter("操作人ID_In", Model.DealPeronId)
  372. .Paramter("操作时间_In", this.DataBaseBuilder.GetDateTime)
  373. .Paramter("指派人_In", Model.AssignPersonName)
  374. .Paramter("指派人ID_In", Model.AssignPersonId)
  375. .Paramter("耗时_In", PassTime(Model.ProblemId))
  376. .ParamterOut("过程ID_Out", DbType.String, 36);
  377. var result = Pro.Execute();
  378. ProcessId = Pro.ParameterValue<string>("过程ID_Out");
  379. return result;
  380. }
  381. catch (Exception ex)
  382. {
  383. Logger.Instance.Error("调用问题指派存储过程失败", ex);
  384. ProcessId = "";
  385. return 0;
  386. }
  387. }
  388. /// <summary>
  389. /// 问题处理
  390. /// </summary>
  391. /// <param name="Model"></param>
  392. /// <returns></returns>
  393. public int ProblemDeal(ProblemDealModel Model, out string ProcessId)
  394. {
  395. //判断进入流程ID是否为0
  396. if (Model.NextWorkId == 0)
  397. {
  398. Logger.Instance.Error("调用ProblemDeal方法传入的进入流程ID为0,请检查获取进入流程ID方法");
  399. ProcessId = "";
  400. return 0;
  401. }
  402. var Pro = this.ProcedureBuilder
  403. .Procedure("B_问题处理.P_问题处理")
  404. .Paramter("问题ID_In", Model.ProblemId)
  405. .Paramter("进入流程ID_In", Model.NextWorkId)
  406. .Paramter("操作描述_In", Model.Describe)
  407. .Paramter("操作人_In", Model.DealPeronName)
  408. .Paramter("操作人ID_In", Model.DealPeronId)
  409. .Paramter("操作时间_In", this.DataBaseBuilder.GetDateTime)
  410. .Paramter("耗时_In", PassTime(Model.ProblemId))
  411. .ParamterOut("过程ID_Out", DbType.String, 36);
  412. var result = Pro.Execute();
  413. ProcessId = Pro.ParameterValue<string>("过程ID_Out");
  414. return result;
  415. }
  416. /// <summary>
  417. /// 问题完成
  418. /// </summary>
  419. /// <param name="Model"></param>
  420. /// <returns></returns>
  421. public int ProblemSolution(ProblemDealModel model, out string ProcessId, UserInfo user)
  422. {
  423. //判断进入流程ID是否为0
  424. if (model.NextWorkId == 0)
  425. {
  426. Logger.Instance.Error("调用ProblemSolution方法传入的进入流程ID为0,请检查获取进入流程ID方法");
  427. ProcessId = "";
  428. return 0;
  429. }
  430. var Pro = this.ProcedureBuilder.Procedure("B_完成处理提交.P_问题完成")
  431. .Paramter("问题ID_In", model.ProblemId)
  432. .Paramter("操作人_In", model.DealPeronName)
  433. .Paramter("操作人ID_In", model.DealPeronId)
  434. .Paramter("进入流程ID_In", model.NextWorkId)
  435. .Paramter("耗时_In", PassTime(model.ProblemId))
  436. .Paramter("解决方案_In", model.Describe)
  437. .Paramter("解决版本_In", model.Version)
  438. .Paramter("描述_In", model.Describe)
  439. .Paramter("操作时间_In", this.DataBaseBuilder.GetDateTime)
  440. .ParamterOut("过程ID_Out", DbType.String, 36);
  441. var result = Pro.Execute();
  442. var CSCLR = "";
  443. if (!model.TestPeronId.IsNullOrEmpty())//获取测试人员
  444. {
  445. CSCLR = SelectBuilder.From("人员信息").Columns("姓名").Where("ID", model.TestPeronId).Select().Rows[0]["姓名"].ToString();
  446. }
  447. //更新测试处理人有
  448. this.UpdateBuilder.Update("问题记录").Column("测试处理人ID", model.TestPeronId).Column("测试处理人", CSCLR).Column("解决版本ID", model.VersionID).Where("ID", model.ProblemId).Execute();
  449. //若处理人未研发人员则变更研发处理人为当前登录人
  450. foreach (var item in user.Roles)
  451. {
  452. if (item.ToInt32() == 7 || item.ToInt32() == 9 || item.ToInt32() == 10 || item.ToInt32() == 317 )
  453. {
  454. UpdateBuilder.Update("问题记录").Column("研发处理人ID", model.DealPeronId).Column("研发处理人", model.DealPeronName).Where("id",model.ProblemId).Execute();
  455. break;
  456. }
  457. }
  458. ProcessId = Pro.ParameterValue<string>("过程ID_Out");
  459. //如果选择了问题分类,则更新分类
  460. if (!string.IsNullOrEmpty(model.ProblemTypeID))
  461. {
  462. if (SqlBuilder.SqlText("select 性质 from 人员信息 where id=:ID").Parameters("ID", model.DealPeronId).Select().Rows[0]["性质"].ToInt32() == 1)
  463. {
  464. UpdateBuilder.Update("问题记录").Where("ID", model.ProblemId).Column("技术支持分类ID", model.ProblemTypeID).Execute();
  465. }
  466. else
  467. {
  468. UpdateBuilder.Update("问题记录").Where("ID", model.ProblemId).Column("分类ID", model.ProblemTypeID).Execute();
  469. }
  470. }
  471. var dt = this.SelectBuilder.Columns("a.产品ID").From("问题记录 a").Where("a.ID", model.ProblemId).Select();
  472. var ProductId = "";
  473. if (dt.Rows.Count>0)
  474. {
  475. ProductId = dt.Rows[0].GetValueByName<string>("产品ID");
  476. }
  477. //加入到版本计划中
  478. this.DeleteBulider.Delete("产品问题版本").Where("问题ID", model.ProblemId).Execute();
  479. this.InsertBuilder.Insert("产品问题版本").Column("ID", Guid.NewGuid().ToString())
  480. .Column("问题ID", model.ProblemId).Column("版本ID", model.VersionID).Column("产品ID", ProductId).Execute();
  481. return result;
  482. }
  483. /// <summary>
  484. /// 撤销完成/终止
  485. /// </summary>
  486. /// <param name="ProblemId"></param>
  487. /// <param name="PersonId"></param>
  488. /// <returns></returns>
  489. public bool UndoProblem(string ProblemId, string PersonId)
  490. {
  491. this.DeleteBulider.Delete("产品问题版本").Where("问题ID", ProblemId).Execute();
  492. using (var tran = this.DBTransaction.BeginTrans())
  493. {
  494. try
  495. {
  496. var t = this.UpdateBuilder
  497. .Column("是否终止", 0)
  498. .Column("是否解决", 0)
  499. .Column("终止说明", DBNull.Value)
  500. .Column("终止日期", DBNull.Value)
  501. .Column("解决方案", DBNull.Value)
  502. .Column("是否验证", 0)
  503. .Column("验证人ID", DBNull.Value)
  504. .Update("问题记录")
  505. .Where("ID", ProblemId)
  506. .Execute(tran);
  507. var dt = this.SqlBuilder.SqlText("Select * from (Select 当前流程ID,记录时间 from 问题记录过程 where 问题ID=:id order by 记录时间 desc) where rownum=1")
  508. .Parameters("id", ProblemId).Select();
  509. var ProcessId = dt.Rows[0].GetValueByName<int>("当前流程ID");
  510. //计算耗时
  511. var ProcessTime = dt.Rows[0].GetValueByName<DateTime>("记录时间");
  512. DateTime CurrentTime = this.DataBaseBuilder.GetDateTime;
  513. TimeSpan time = CurrentTime - ProcessTime;
  514. var PassTime = time.TotalMinutes / 60;
  515. //添加过程
  516. var inserProcess = this.InsertBuilder
  517. .Column("ID", Guid.NewGuid().ToString())
  518. .Column("问题ID", ProblemId)
  519. .Column("记录人ID", PersonId)
  520. .Column("记录时间", CurrentTime)
  521. .Column("当前流程ID", ProcessId)
  522. .Column("状态", 10)
  523. .Column("来源流程ID", ProcessId)
  524. .Column("耗时", PassTime)
  525. .Insert("问题记录过程")
  526. .Execute(tran);
  527. tran.CommitTrans();
  528. return (t > 0 && inserProcess > 0);
  529. }
  530. catch (Exception ex)
  531. {
  532. tran.Rollback();
  533. Logger.Instance.Error("撤销完成/终止失败", ex);
  534. return false;
  535. }
  536. }
  537. }
  538. /// <summary>
  539. /// 问题提交
  540. /// </summary>
  541. /// <param name="model"></param>
  542. /// <returns></returns>
  543. public bool ProblemSubmit(ProblemDealModel model)
  544. {
  545. //判断进入流程ID是否为0
  546. if (model.NextWorkId == 0)
  547. {
  548. Logger.Instance.Error("调用ProblemSubmit方法传入的进入流程ID为0,请检查获取进入流程ID方法");
  549. return false;
  550. }
  551. using (var tran = this.DBTransaction.BeginTrans())
  552. {
  553. try
  554. {
  555. var t = this.ProcedureBuilder.Procedure("B_完成处理提交.P_问题提交")
  556. .Paramter("问题ID_In", model.ProblemId)
  557. .Paramter("操作人ID_In", model.DealPeronId)
  558. .Paramter("耗时_In", PassTime(model.ProblemId))
  559. .Paramter("进入流程ID", model.NextWorkId)
  560. .Paramter("操作描述_In", !string.IsNullOrEmpty(model.Describe) ? model.Describe : "向上提交")
  561. .Paramter("操作时间_In", this.DataBaseBuilder.GetDateTime)
  562. .Paramter("被指派人ID", model.SubID)
  563. .Paramter("被指派人", model.SubName)
  564. .Execute(tran);
  565. var s = 1;
  566. ///如果有向上提交人
  567. if (!string.IsNullOrEmpty(model.SubID) && !string.IsNullOrEmpty(model.SubName))
  568. {
  569. s = this.UpdateBuilder.Column("是否受理", 1)
  570. .Column("受理人", model.SubName)
  571. .Column("受理人ID", model.SubID)
  572. .Column("指派人", model.SubName)
  573. .Column("指派人ID", model.SubID)
  574. .Column("指派时间", this.DataBaseBuilder.GetDateTime)
  575. .Column("受理时间", this.DataBaseBuilder.GetDateTime)
  576. .Where("ID", model.ProblemId)
  577. .Update("问题记录")
  578. .Execute(tran);
  579. }
  580. tran.CommitTrans();
  581. //如果选择了问题分类,则更新分类
  582. if (!string.IsNullOrEmpty(model.ProblemTypeID))
  583. {
  584. if (SqlBuilder.SqlText("select 性质 from 人员信息 where id=:ID").Parameters("ID", model.DealPeronId).Select().Rows[0]["性质"].ToInt32() == 1)
  585. {
  586. UpdateBuilder.Update("问题记录").Where("ID", model.ProblemId).Column("技术支持分类ID", model.ProblemTypeID).Execute();
  587. }
  588. else
  589. {
  590. UpdateBuilder.Update("问题记录").Where("ID", model.ProblemId).Column("分类ID", model.ProblemTypeID).Execute();
  591. }
  592. }
  593. return (t == -1 && s > 0);
  594. }
  595. catch (Exception ex)
  596. {
  597. Logger.Instance.Error("调用问题提交ProblemSubmit发生错误", ex);
  598. tran.Rollback();
  599. return false;
  600. }
  601. }
  602. }
  603. /// <summary>
  604. /// 计算耗时
  605. /// </summary>
  606. /// <param name="ProblemID"></param>
  607. /// <returns></returns>
  608. public Double PassTime(string ProblemID)
  609. {
  610. DateTime datime = SelectBuilder.From("问题记录过程").Columns("记录时间").Where("问题ID", ProblemID).OrderBy("记录时间 Desc").Select<DateTime>();
  611. DateTime CurrentTime = this.DataBaseBuilder.GetDateTime;
  612. TimeSpan time = CurrentTime - datime;
  613. return time.TotalMinutes / 60;
  614. }
  615. public int SaveProcessFile(ProcessFileModel Model)
  616. {
  617. try
  618. {
  619. ///获取问题ID
  620. var ProblemId = this.SelectBuilder.From("问题记录过程").Where("ID", Model.ProcessId).Columns("问题ID").Select<string>();
  621. return this.InsertBuilder.Insert("产品问题附件").Column("ID", Guid.NewGuid().ToString())
  622. .Column("问题ID", ProblemId)
  623. .Column("过程ID", Model.ProcessId)
  624. .Column("类型", Model.Type)
  625. .Column("附件ID", Model.FileId)
  626. .Column("添加时间", this.DataBaseBuilder.GetDateTime)
  627. .Column("添加人", Model.Name)
  628. .Execute();
  629. }
  630. catch (Exception ex)
  631. {
  632. Logger.Instance.Error("保存产品问题附件表失败", ex);
  633. return 0;
  634. }
  635. }
  636. #endregion
  637. /// <summary>
  638. /// 验证问题
  639. /// </summary>
  640. /// <param name="model"></param>
  641. /// <returns></returns>
  642. public bool AcceptancProblem(ProblemProcessModel model)
  643. {
  644. try
  645. {
  646. var r = false;
  647. if (model.Verification)
  648. {//验证通过
  649. r = CompleteAcceptanc(model);
  650. }
  651. else
  652. {
  653. //验证不通过
  654. r = UndoAcceptanc(model);
  655. }
  656. return r;
  657. }
  658. catch (Exception ex)
  659. {
  660. Logger.Instance.Error("问题验证失败,原因:" + ex);
  661. return false;
  662. }
  663. }
  664. /// <summary>
  665. /// 更新版本号
  666. /// </summary>
  667. /// <param name="model"></param>
  668. /// <returns></returns>
  669. public bool UpdateVersion(VersionManageModel model)
  670. {
  671. try
  672. {
  673. var r = false;
  674. r =this.UpdateBuilder.Update("问题记录").Where("id", model.问题id).Column("解决版本ID", model.版本ID).Column("解决版本", model.解决版本).Column("解决版本状态", model.解决版本状态)
  675. .Column("紧急补丁时间", model.紧急补丁时间).Execute() > 0;
  676. try
  677. {
  678. if(model.是否加入==1)
  679. {
  680. var dt = this.SqlBuilder.SqlText("select * from 产品问题版本 t where 问题ID=:问题id")
  681. .Parameters("问题id", model.问题id).Select();
  682. if(dt.Rows.Count>0)//已经加入,进行更新
  683. {
  684. this.DeleteBulider.Delete("产品问题版本").Where("问题ID", model.问题id).Execute();
  685. }
  686. this.InsertBuilder.Insert("产品问题版本").Column("ID", Guid.NewGuid().ToString())
  687. .Column("问题ID", model.问题id).Column("版本ID", model.版本ID).Column("是否紧急", model.是否紧急)
  688. .Column("产品ID", model.产品ID).Column("说明", model.说明).Column("操作人", model.操作人)
  689. .Column("紧急补丁时间", model.紧急补丁时间).Execute();
  690. }
  691. else
  692. {
  693. this.DeleteBulider.Delete("产品问题版本").Where("问题ID", model.问题id).Execute();
  694. }
  695. }
  696. catch (Exception ex)
  697. {
  698. Logger.Instance.Error("加入日常补丁失败,原因:" + ex);
  699. }
  700. return r;
  701. }
  702. catch (Exception ex)
  703. {
  704. Logger.Instance.Error("更新问题记录版本号失败,原因:" + ex);
  705. return false;
  706. }
  707. }
  708. /// <summary>
  709. /// 完成验证
  710. /// </summary>
  711. /// <param name="model"></param>
  712. /// <returns></returns>
  713. public bool CompleteAcceptanc(ProblemProcessModel model)
  714. {
  715. using (var tran = this.DBTransaction.BeginTrans())
  716. {
  717. try
  718. {
  719. var dt = this.SqlBuilder.SqlText("Select * from (Select 当前流程ID,记录时间 from 问题记录过程 where 问题ID=:id order by 记录时间 desc) where rownum=1")
  720. .Parameters("id", model.ProblemID).Select();
  721. var ProcessId = dt.Rows[0].GetValueByName<int>("当前流程ID");
  722. //计算耗时
  723. var ProcessTime = dt.Rows[0].GetValueByName<DateTime>("记录时间");
  724. DateTime CurrentTime = this.DataBaseBuilder.GetDateTime;
  725. TimeSpan time = CurrentTime - ProcessTime;
  726. var PassTime = time.TotalMinutes / 60;
  727. //更新问题记录
  728. var ProblemRecord = this.UpdateBuilder;
  729. ProblemRecord.Where("ID", model.ProblemID).Update("问题记录")
  730. .Column("是否验证", 1)
  731. .Column("验证人ID", model.CurrentUserID);
  732. //如果填写了问题分类
  733. if (!string.IsNullOrEmpty(model.ProblemTypeID))
  734. {
  735. ProblemRecord.Column("分类ID", model.ProblemTypeID);
  736. }
  737. var tran1 = ProblemRecord.Execute();
  738. //更新问题记录过程
  739. var tran2 = this.InsertBuilder.Insert("问题记录过程")
  740. .Column("ID", Guid.NewGuid().ToString())
  741. .Column("问题ID", model.ProblemID)
  742. .Column("记录人ID", model.CurrentUserID)
  743. .Column("记录时间", this.DataBaseBuilder.GetDateTime)
  744. .Column("当前流程ID", ProcessId)
  745. .Column("来源流程ID", ProcessId)
  746. .Column("状态", 11)
  747. .Column("描述", model.ProcessRemark)
  748. .Column("耗时", PassTime)
  749. .Column("结束时间", this.DataBaseBuilder.GetDateTime)
  750. .Execute();
  751. tran.CommitTrans();
  752. return (tran1 > 0 && tran2 > 0);
  753. }
  754. catch (Exception ex)
  755. {
  756. Logger.Instance.Error("调用问题完成验证CompleteAcceptanc失败,原因:" + ex);
  757. tran.Rollback();
  758. return false;
  759. }
  760. }
  761. }
  762. /// <summary>
  763. /// 问题验证不通过,回退完成状态
  764. /// </summary>
  765. /// <param name="ProblemId"></param>
  766. /// <param name="PersonId"></param>
  767. /// <returns></returns>
  768. public bool UndoAcceptanc(ProblemProcessModel model)
  769. {
  770. using (var tran = this.DBTransaction.BeginTrans())
  771. {
  772. try
  773. {
  774. var t = this.UpdateBuilder
  775. .Column("是否终止", 0)
  776. .Column("是否解决", 0)
  777. .Column("终止说明", DBNull.Value)
  778. .Column("终止日期", DBNull.Value)
  779. .Column("解决方案", DBNull.Value)
  780. .Column("是否验证", 0)
  781. .Column("验证人ID", DBNull.Value)
  782. .Update("问题记录")
  783. .Where("ID", model.ProblemID)
  784. .Execute(tran);
  785. var dt = this.SqlBuilder.SqlText("Select * from (Select 当前流程ID,记录时间 from 问题记录过程 where 问题ID=:id order by 记录时间 desc) where rownum=1")
  786. .Parameters("id", model.ProblemID).Select();
  787. var ProcessId = dt.Rows[0].GetValueByName<int>("当前流程ID");
  788. //计算耗时
  789. var ProcessTime = dt.Rows[0].GetValueByName<DateTime>("记录时间");
  790. DateTime CurrentTime = this.DataBaseBuilder.GetDateTime;
  791. TimeSpan time = CurrentTime - ProcessTime;
  792. var PassTime = time.TotalMinutes / 60;
  793. //添加过程
  794. var inserProcess = this.InsertBuilder
  795. .Column("ID", Guid.NewGuid().ToString())
  796. .Column("问题ID", model.ProblemID)
  797. .Column("记录人ID", model.CurrentUserID)
  798. .Column("记录时间", CurrentTime)
  799. .Column("当前流程ID", ProcessId)
  800. .Column("状态", 10)
  801. .Column("来源流程ID", ProcessId)
  802. .Column("耗时", PassTime)
  803. .Column("描述", model.ProcessRemark)
  804. .Column("结束时间", CurrentTime)
  805. .Insert("问题记录过程")
  806. .Execute(tran);
  807. tran.CommitTrans();
  808. return (t > 0 && inserProcess > 0);
  809. }
  810. catch (Exception ex)
  811. {
  812. tran.Rollback();
  813. Logger.Instance.Error("撤销完成/终止失败", ex);
  814. return false;
  815. }
  816. }
  817. }
  818. }
  819. }