人民医院API

WorkOrderBase.cs 17KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456
  1. using RMYY_CallCenter_Api.Models.Enum;
  2. using System;
  3. using System.Collections.Generic;
  4. using System.Linq;
  5. using System.Web;
  6. using RMYY_CallCenter_Api.Utility;
  7. using RMYY_CallCenter_Api.Models.Dto;
  8. using RMYY_CallCenter_Api.Models;
  9. using System.Data;
  10. namespace RMYY_CallCenter_Api
  11. {
  12. public class WorkOrderBase
  13. {
  14. private static Bll.T_Dis_WorkOrderItem itembll = new Bll.T_Dis_WorkOrderItem();
  15. public delegate string TranslationDelegate(int F_Id, string F_UserCode);
  16. public static string GetDisStateName(int F_Id, string F_UserCode)
  17. {
  18. return EnumHelper.GetDescription((EnumDisWorkOrderState)itembll.GetModelList("F_WoID=" + F_Id + " and (F_CreateUser=" + F_UserCode + " or F_NextUser=" + F_UserCode + ")").OrderByDescending(pp => pp.F_ID).FirstOrDefault().F_OptType);
  19. }
  20. public static string GetStateName(TranslationDelegate delegats, int F_Id, string F_UserCode)
  21. {
  22. return delegats.Invoke(F_Id, F_UserCode);
  23. }
  24. /// <summary>
  25. /// 获取工单状态
  26. /// </summary>
  27. /// <param name="type"></param>
  28. /// <returns></returns>
  29. public static List<TypeState> GetTypeState(int type, int ftype = 0)
  30. {
  31. List<TypeState> wlist = Common.GetGongDanState<EnumWorkOrderState>();
  32. List<TypeState> tlist = Common.GetGongDanState<EnumDisWorkOrderState>();
  33. List<TypeState> qlist = Common.GetGongDanState<EnumMatWorkOrderState>();
  34. List<TypeState> dlit = Common.GetGongDanState<EnumDevWorkOrderState>();
  35. List<TypeState> alit = Common.GetGongDanState<EnumAccWorkOrderState>();
  36. List<TypeState> hlit = Common.GetGongDanState<EnumHosWorkOrderState>();
  37. List<TypeState> newlist = new List<TypeState>();
  38. int parentid = ParentType(type);
  39. if (parentid != 0)
  40. ftype = parentid;
  41. if (ftype == 3000)
  42. {
  43. newlist.Add(new TypeState { StateId = "-1", StateValue = "", StateRemark = "全部" });
  44. newlist.Add(new TypeState { StateId = "0", StateValue = "", StateRemark = "代派工" });
  45. newlist.Add(new TypeState { StateId = "1", StateValue = "", StateRemark = "已转派" });
  46. newlist.Add(new TypeState { StateId = "2", StateValue = "", StateRemark = "已处理" });
  47. newlist.Add(new TypeState { StateId = "3", StateValue = "", StateRemark = "已完结" });
  48. newlist.Add(new TypeState { StateId = "4", StateValue = "", StateRemark = "异常结束" });
  49. newlist.Add(new TypeState { StateId = "5", StateValue = "", StateRemark = "已拒单" });
  50. newlist.Add(new TypeState { StateId = "6", StateValue = "", StateRemark = "外协作单子" });
  51. }
  52. else if (ftype == 1000 || ftype == 4000)
  53. {
  54. newlist = wlist;
  55. }
  56. else
  57. {
  58. switch (type)
  59. {
  60. case (int)EnumWorkOrder.RedDis:
  61. tlist.RemoveAll(p => ("'" + (int)EnumDisWorkOrderState.dealing + "','" + (int)EnumDisWorkOrderState.takeblood + "','" + (int)EnumDisWorkOrderState.send + "'").Contains(p.StateId));
  62. newlist = tlist;
  63. break;
  64. case (int)EnumWorkOrder.OrtherDis:
  65. case (int)EnumWorkOrder.UrgDis:
  66. tlist.RemoveAll(p => ("'" + (int)EnumDisWorkOrderState.stayred + "','" + (int)EnumDisWorkOrderState.staydrug + "','" + (int)EnumDisWorkOrderState.takeblood + "','" + (int)EnumDisWorkOrderState.send + "'").Contains(p.StateId));
  67. newlist = tlist;
  68. break;
  69. case (int)EnumWorkOrder.BloodDis:
  70. tlist.RemoveAll(p => ("'" + (int)EnumDisWorkOrderState.stayred + "','" + (int)EnumDisWorkOrderState.staydrug + "','" + (int)EnumDisWorkOrderState.dealing + "','" + (int)EnumDisWorkOrderState.send + "'").Contains(p.StateId));
  71. newlist = tlist;
  72. break;
  73. case (int)EnumWorkOrder.Mat:
  74. newlist = qlist;
  75. break;
  76. case (int)EnumWorkOrder.Dev:
  77. newlist = dlit;
  78. break;
  79. case (int)EnumWorkOrder.Hos:
  80. newlist = hlit;
  81. break;
  82. case (int)EnumWorkOrder.Serve:
  83. alit.RemoveAll(p => ("'" + (int)EnumAccWorkOrderState.dealing + "'").Contains(p.StateId));
  84. newlist = alit;
  85. break;
  86. case (int)EnumWorkOrder.TakeBlood:
  87. alit.RemoveAll(p => ("'" + (int)EnumAccWorkOrderState.arrive + "','" + (int)EnumAccWorkOrderState.keep + "'").Contains(p.StateId));
  88. newlist = alit;
  89. break;
  90. case (int)EnumWorkOrder.consultation:
  91. case (int)EnumWorkOrder.complaint:
  92. case (int)EnumWorkOrder.externalcons:
  93. case (int)EnumWorkOrder.appointment:
  94. case (int)EnumWorkOrder.maintain:
  95. newlist = wlist;
  96. break;
  97. }
  98. }
  99. return newlist;
  100. //return newlist.OrderBy(p => Convert.ToInt32(p.StateId));
  101. }
  102. /// <summary>
  103. /// 工单指派记录
  104. /// </summary>
  105. /// <param name="woid"></param>
  106. /// <param name="wostate"></param>
  107. /// <param name="type"></param>
  108. /// <param name="content"></param>
  109. /// <param name="itemtype"></param>
  110. /// <param name="opttype"></param>
  111. /// <param name="nextuser"></param>
  112. /// <param name="nextusername"></param>
  113. /// <param name="nextuserphon"></param>
  114. /// <param name="nextusertalkie"></param>
  115. /// <param name="nextdept"></param>
  116. /// <param name="nowUser"></param>
  117. /// <param name="F_IsUsed"></param>
  118. /// <returns></returns>
  119. public static long AddLogTrans(int woid, int wostate, int type, string content, int itemtype, int opttype, string nextuser, string nextusername, string nextuserphon, string nextusertalkie, int nextdept, Model.T_Sys_UserAccount nowUser, int F_IsUsed = 0)
  120. {
  121. Model.T_Dis_WorkOrderItem itemModel = new Model.T_Dis_WorkOrderItem();
  122. #region
  123. //处理当前工单的记录之前的记录过期
  124. var itemlast = itembll.GetModelList(" isnull(F_IsUsed,'0')='0' and F_OptType !=" + (int)EnumDisItemOpt.assign + " and F_ItemType=" + itemtype + " and F_WoID=" + woid + " and (F_CreateUser=" + nowUser.F_UserCode + ")");
  125. if (F_IsUsed == 0)
  126. {
  127. if (itemlast.Count > 0)
  128. {
  129. foreach (var it in itemlast)
  130. {
  131. it.F_IsUsed = 1;
  132. itembll.Update(it);
  133. }
  134. }
  135. }
  136. #endregion
  137. itemModel.F_WoID = woid;
  138. itemModel.F_WoState = wostate;
  139. itemModel.F_WoType = (int)(EnumWorkOrder)(type);//工单类型
  140. itemModel.F_ItemType = itemtype;
  141. itemModel.F_OptType = opttype;
  142. itemModel.F_OptContent = content;
  143. itemModel.F_NextUser = nextuser;
  144. itemModel.F_NextUserName = nextusername;
  145. itemModel.F_NextUserTalkie = nextusertalkie;
  146. itemModel.F_NexUserPhon = nextuserphon;
  147. itemModel.F_NextDept = nextdept;
  148. itemModel.F_IsUsed = F_IsUsed;
  149. itemModel.F_CreateTime = DateTime.Now;
  150. itemModel.F_CreateUser = nowUser.F_UserCode;
  151. var res = itembll.Add(itemModel);
  152. return res;
  153. }
  154. public static string GetWoTypeName(int wotype)
  155. {
  156. if (wotype > 0)
  157. {
  158. return ParentTypeName(wotype);
  159. }
  160. else return "";
  161. }
  162. /// <summary>
  163. /// 获取最大工单分类
  164. /// </summary>
  165. /// <param name="typeid"></param>
  166. /// <returns></returns>
  167. public static int ParentType(int typeid)
  168. {
  169. var model = new Bll.T_Sys_GongDan().GetModel(typeid);
  170. if (model.F_ParentID == 0)
  171. {
  172. return model.F_GDId;
  173. }
  174. else
  175. {
  176. return ParentType(Convert.ToInt32(model.F_ParentID));
  177. }
  178. }
  179. /// <summary>
  180. /// 获取工单类型名称
  181. /// </summary>
  182. /// <param name="typeid"></param>
  183. /// <returns></returns>
  184. private static string typename = "";
  185. public static string ParentTypeName(int typeid)
  186. {
  187. string restr = "";
  188. var model = new Bll.T_Sys_GongDan().GetModel(typeid);
  189. if (model != null)
  190. {
  191. typename = $"{model.F_Name}/" + typename;
  192. if (model.F_ParentID != 0)
  193. {
  194. typename=ParentTypeName(Convert.ToInt32(model.F_ParentID));
  195. }
  196. }
  197. restr = typename;
  198. typename = "";
  199. return restr;
  200. }
  201. /// <summary>
  202. /// 根据工单状态获取操作按钮
  203. /// </summary>
  204. /// <param name="type"></param>
  205. /// <param name="state"></param>
  206. /// <returns></returns>
  207. public static List<FaultButtonGroup.button> GetbuttonList(int type,int state)
  208. {
  209. List<FaultButtonGroup.button> buttons = new List<FaultButtonGroup.button>();
  210. if (type > 0)
  211. {
  212. string sql = $" F_Type={type} and F_State={state}";
  213. var modelist = new Bll.T_Wo_StatusOpt().GetModelList(sql);
  214. if (modelist.Count > 0)
  215. {
  216. foreach (var item in modelist)
  217. {
  218. FaultButtonGroup.button itembutton = new FaultButtonGroup.button(Convert.ToInt32(item.F_MenuId), new Bll.T_Sys_Menu().GetModel(Convert.ToInt32(item.F_MenuId))?.F_MenuName ?? "");
  219. buttons.Add(itembutton);
  220. }
  221. return buttons;
  222. }
  223. return null;
  224. }
  225. return null;
  226. }
  227. /// <summary>
  228. /// 组装列表数据,列表需要包含以下字段
  229. /// </summary>
  230. /// <param name="dt"></param>
  231. /// <returns></returns>
  232. public static DataTable SetOtherField(DataTable dt, MENUENUM menuName, int roleId = 0, int type = 0)
  233. {
  234. if (dt.Columns.Contains("Buttons") && dt.Columns.Contains("GapTime") && dt.Columns.Contains("StateName"))
  235. {
  236. return dt;
  237. }
  238. // 获取对应字段名
  239. string typeFieldName = "", stateFieldName = "", gapTimeFieldName = "", endTimeFieldName = "", assistanceStateFieldName = "";
  240. for (int i = 0; i < dt.Columns.Count; i++)
  241. {
  242. switch (dt.Columns[i].ColumnName)
  243. {
  244. case "F_Type": {
  245. if (typeFieldName == "")
  246. {
  247. typeFieldName = dt.Columns[i].ColumnName;
  248. }
  249. };break;
  250. case "F_WorkOrderState":
  251. case "F_Status":
  252. {
  253. if (stateFieldName == "")
  254. {
  255. stateFieldName = dt.Columns[i].ColumnName;
  256. }
  257. }; break;
  258. case "F_Deadline":
  259. case "F_TimeLimit":
  260. {
  261. if (gapTimeFieldName == "")
  262. {
  263. gapTimeFieldName = dt.Columns[i].ColumnName;
  264. }
  265. }; break;
  266. case "F_Endtime":
  267. {
  268. if (endTimeFieldName == "")
  269. {
  270. endTimeFieldName = dt.Columns[i].ColumnName;
  271. }
  272. }; break;
  273. case "AssistanceState":
  274. {
  275. if (assistanceStateFieldName == "")
  276. {
  277. assistanceStateFieldName = dt.Columns[i].ColumnName;
  278. }
  279. }; break;
  280. default: break;
  281. }
  282. }
  283. if ((type == 0 && typeFieldName == "") || stateFieldName == "")
  284. {
  285. return dt;
  286. }
  287. dt.Columns.Add("GapTime", typeof(string));//执行时限
  288. dt.Columns.Add("StateName", typeof(string));
  289. dt.Columns.Add("Buttons", typeof(object));//操作按钮
  290. foreach (DataRow dr in dt.Rows)
  291. {
  292. int thisTypeId = type;
  293. #region 按钮处理
  294. if (type == 0)
  295. {
  296. thisTypeId = int.Parse(dr[typeFieldName].ToString());
  297. }
  298. int assistanceState = 1;
  299. if (assistanceStateFieldName != "" && dr[assistanceStateFieldName].ToString() == "未完成")
  300. {
  301. assistanceState = 0;
  302. }
  303. var allButtons = WorkOrderButton.GetButtons(menuName, thisTypeId, int.Parse(dr[stateFieldName].ToString()), roleId, assistanceState);
  304. //TODO: 特殊逻辑处理
  305. dr["Buttons"] = allButtons;
  306. #endregion
  307. #region 超时时限处理
  308. if (!string.IsNullOrEmpty(dr[gapTimeFieldName].ToString()))
  309. {
  310. DateTime deadline = Convert.ToDateTime(dr[gapTimeFieldName]);
  311. DateTime thisDate = DateTime.Now;
  312. if (endTimeFieldName != "" && !string.IsNullOrEmpty(dr[endTimeFieldName].ToString()))
  313. {
  314. thisDate = Convert.ToDateTime(dr[endTimeFieldName].ToString());
  315. if (thisDate < deadline)
  316. {
  317. dr["GapTime"] = "-";
  318. }
  319. }
  320. if (dr["GapTime"].ToString() != "-")
  321. {
  322. TimeSpan ts = deadline.Subtract(thisDate);
  323. double tss = double.Parse(Math.Round(ts.TotalSeconds, 0).ToString());
  324. if (tss < 0) { tss = -tss; }
  325. string gshsj = DateTimeConvert.parseTimeSeconds(tss, 1);
  326. if (deadline > thisDate)
  327. {
  328. dr["GapTime"] = "剩余" + gshsj;
  329. }
  330. else
  331. {
  332. dr["GapTime"] = "超时" + gshsj;
  333. }
  334. }
  335. }
  336. else
  337. {
  338. dr["GapTime"] = "-";
  339. }
  340. #endregion
  341. #region 工单状态处理
  342. dr["StateName"] = GetWorkOrderStateStr(menuName, int.Parse(dr[stateFieldName].ToString()), thisTypeId);
  343. #endregion
  344. }
  345. return dt;
  346. }
  347. /// <summary>
  348. /// 获取工单对应状态文本
  349. /// </summary>
  350. /// <param name="menuName"></param>
  351. /// <param name="state"></param>
  352. /// <param name="type"></param>
  353. /// <returns></returns>
  354. private static string GetWorkOrderStateStr(MENUENUM menuName, int state, int type)
  355. {
  356. List<int> typeIdArray = null;
  357. if (type == 3000)
  358. {
  359. typeIdArray = new List<int> { -1,0, 1, 2, 3, 4, 5, 6 };
  360. }
  361. else if (type == 1000)
  362. {
  363. typeIdArray = new List<int> { 0, 1, 2, -1, -1, 10, -1, -1, -1, -1, -1 };
  364. }
  365. else
  366. {
  367. return "";
  368. }
  369. if (typeIdArray == null)
  370. {
  371. return "";
  372. }
  373. string str = "";
  374. List<string> strArr = null;
  375. switch (menuName)
  376. {
  377. case MENUENUM.我的提交:
  378. strArr = new List<string> { "待提交", "待接单", "待接单", "已接单", "待评价", "已完成", "已完成","已接单" }; break;
  379. case MENUENUM.工单列表:
  380. strArr = new List<string> { "待提交", "待派工", "待接单", "待完成", "已处理", "异常完成", "已完成", "已接单" }; break;
  381. case MENUENUM.报修列表:
  382. strArr = new List<string> { "待提交", "-", "待接单", "待完成", "已完成", "已完成", "已完成", "已接单" }; break;
  383. default: break;
  384. }
  385. int index = typeIdArray.IndexOf(state);
  386. if (index < 0)
  387. {
  388. return "";
  389. }
  390. return strArr[index];
  391. }
  392. }
  393. }