BatchModifyMattressInterfaceConfigExcutor.cs 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Data;
  4. using System.Data.SqlClient;
  5. using System.Linq;
  6. using DirectService.Tools;
  7. using JLHHJSvr.BLL;
  8. using JLHHJSvr.Com;
  9. using JLHHJSvr.Com.Model;
  10. using JLHHJSvr.Helper;
  11. using LJLib.DAL.SQL;
  12. using LJLib.Net.SPI.Server;
  13. using LJLib.SQLEX;
  14. using Newtonsoft.Json;
  15. namespace JLHHJSvr.Excutor
  16. {
  17. internal sealed class BatchModifyMattressInterfaceConfigExcutor : ExcutorBase<BatchModifyMattressInterfaceConfigRequest, BatchModifyMattressInterfaceConfigResponse>
  18. {
  19. protected override void ExcuteInternal(BatchModifyMattressInterfaceConfigRequest request, object state, BatchModifyMattressInterfaceConfigResponse rslt)
  20. {
  21. var tokendata = BllHelper.GetToken(request.token);
  22. rslt.items = new List<u_task_log_mx>();
  23. if (tokendata == null)
  24. {
  25. rslt.ErrMsg = "会话已经中断,请重新登录";
  26. return;
  27. }
  28. if (!ValidateRequest(request, rslt, out var inputList))
  29. {
  30. return;
  31. }
  32. using (var con = GlobalVar.ConnectionString.NewSqlConnection())
  33. using (var cmd = con.CreateCommand())
  34. {
  35. con.Open();
  36. if (!UserHelper.CheckFuncPower(cmd, tokendata.empid, 177))
  37. {
  38. rslt.ErrMsg = "没有床垫清单批量批改配置权限";
  39. return;
  40. }
  41. var mattressIds = inputList.Select(t => t).ToList();
  42. var context = new HelperBase.Context() { tokendata = tokendata };
  43. var mattressHelper = HelperBase.GetHelper<MattressHelper>(cmd, context);
  44. var mattressMap = mattressHelper.GetMattressList(mattressIds, "mattressid,mattresscode,mattressname,erp_configcodetype")
  45. .GroupBy(t => t.mattressid)
  46. .ToDictionary(t => t.Key, t => t.First());
  47. var targetRowsMap = GetTargetConfigRows(cmd, request, mattressIds)
  48. .GroupBy(t => t.mattressid.Value)
  49. .ToDictionary(t => t.Key, t => t.ToList());
  50. var l1InterfaceMap = GetL1InterfaceRows(cmd, mattressIds)
  51. .GroupBy(t => t.mattressid.Value)
  52. .ToDictionary(t => t.Key, t => t.ToList());
  53. var taskid = ScheduleTaskHelper.CreateTaskLog(cmd, new u_task_log
  54. {
  55. task_type = ScheduleTaskHelper.TaskTypeBatchModifyMattressInterfaceConfig,
  56. run_mode = 1,
  57. status = 1,
  58. total_count = inputList.Count,
  59. request_json = GetTaskRequestJson(request),
  60. create_emp = tokendata.username
  61. });
  62. rslt.taskid = taskid;
  63. var workItems = CreateWorkItems(inputList, mattressMap);
  64. ScheduleTaskHelper.InsertTaskLogItems(cmd, taskid, workItems.Select(t => new u_task_log_mx
  65. {
  66. printid = t.printid,
  67. biz_id = t.mattressid,
  68. biz_code = t.result.biz_code,
  69. biz_name = t.mattressname,
  70. status = 1
  71. }).ToList());
  72. foreach (var workItem in workItems)
  73. {
  74. mattressMap.TryGetValue(workItem.mattressid, out var mattress);
  75. if (!targetRowsMap.TryGetValue(workItem.mattressid, out var targetRows)) targetRows = new List<u_mattress_interface>();
  76. if (!l1InterfaceMap.TryGetValue(workItem.mattressid, out var interfaceRows)) interfaceRows = new List<u_mattress_interface>();
  77. var result = workItem.result;
  78. try
  79. {
  80. if (mattress == null)
  81. {
  82. result.err_msg = "床垫报价记录不存在,请检查!";
  83. return;
  84. }
  85. if (mattress.erp_configcodetype != request.configcodetype)
  86. {
  87. result.err_msg = "配置名称不匹配!";
  88. return;
  89. }
  90. if (LockHelper.CheckIsLock(cmd, MattressHelper.BillKeyWord, mattress.mattressid, tokendata.username, out string lockMsg)
  91. || LockHelper.CheckIsLock(cmd, InterfaceHelper.BillKeyWord, mattress.mattressid, tokendata.username, out lockMsg))
  92. {
  93. result.err_msg = lockMsg;
  94. return;
  95. }
  96. if (targetRows.Count == 0)
  97. {
  98. result.status = 4;
  99. result.err_msg = "配置行不存在";
  100. return;
  101. }
  102. if (targetRows.Count > 1)
  103. {
  104. result.err_msg = $"床垫报价:{mattress}存在重复配置行,请先手动处理!";
  105. return;
  106. }
  107. var target = targetRows[0];
  108. if (target.bj_inputtype != 1)
  109. {
  110. result.status = 4;
  111. result.err_msg = "配置不是录入类型,请检查!";
  112. return;
  113. }
  114. using (cmd.Transaction = cmd.Connection.BeginTransaction())
  115. {
  116. try
  117. {
  118. UpdateConfigName(cmd, request, mattress.mattressid, target.printid.Value);
  119. UpdatePrefetchedInterfaceName(interfaceRows, target.printid.Value, request.new_bj_namemx);
  120. //var l1Helper = HelperBase.GetHelper<ERPHelper>(cmd);
  121. //l1Helper.context = new HelperBase.Context() { tokendata = tokendata };
  122. //l1Helper.GetMattressMsg(mattress, interfaceRows);
  123. //var errMsg = l1Helper.SaveMtrldef(mattress, interfaceRows);
  124. //if (!string.IsNullOrEmpty(errMsg))
  125. //{
  126. // throw new Exception(errMsg);
  127. //}
  128. //if (mattress.erp_mtrlid > 0)
  129. //{
  130. // mattress.creatmtrl_flag = 1;
  131. // mattress.creatmtrl_auditingrep = tokendata.username;
  132. // mattress.creatmtrl_auditingdate = DateTime.Now;
  133. // DbSqlHelper.Update(cmd, mattress, "erp_mtrlid,creatmtrl_flag,erp_mtrlcode,creatmtrl_auditingrep,creatmtrl_auditingdate");
  134. //}
  135. cmd.Transaction.Commit();
  136. result.status = 2;
  137. result.err_msg = "Success.";
  138. }
  139. catch (Exception ex)
  140. {
  141. cmd.Transaction.Rollback();
  142. result.status = 3;
  143. result.err_msg = ex.Message;
  144. }
  145. }
  146. }
  147. catch (Exception ex)
  148. {
  149. result.status = 3;
  150. result.err_msg = ex.Message;
  151. }
  152. rslt.items.Add(result);
  153. }
  154. FinishTaskLog(cmd, taskid, rslt.items);
  155. }
  156. rslt.totalCount = rslt.items.Count;
  157. rslt.successCount = rslt.items.Count(t => t.status == 2);
  158. rslt.failCount = rslt.items.Count(t => t.status == 3);
  159. rslt.skipCount = rslt.items.Count(t => t.status == 4);
  160. }
  161. private bool ValidateRequest(BatchModifyMattressInterfaceConfigRequest request, BatchModifyMattressInterfaceConfigResponse rslt, out List<int> inputList)
  162. {
  163. inputList = new List<int>();
  164. if (request.list == null || !request.list.Any())
  165. {
  166. rslt.ErrMsg = "请选择需要批改的床垫清单";
  167. return false;
  168. }
  169. if (request.list.Count > 200)
  170. {
  171. rslt.ErrMsg = string.Format("单次最多批改{0}条,请分批处理", 200);
  172. return false;
  173. }
  174. request.bj_pzname = (request.bj_pzname ?? string.Empty).Trim();
  175. request.new_bj_namemx = (request.new_bj_namemx ?? string.Empty).Trim();
  176. if (request.configcodetype <= 0 || request.erp_pzid <= 0 || string.IsNullOrWhiteSpace(request.bj_pzname))
  177. {
  178. rslt.ErrMsg = "配置名称参数不完整";
  179. return false;
  180. }
  181. if (string.IsNullOrWhiteSpace(request.new_bj_namemx))
  182. {
  183. rslt.ErrMsg = "批改后明细名称不能为空";
  184. return false;
  185. }
  186. if (request.new_bj_namemx.Length > 200)
  187. {
  188. rslt.ErrMsg = "批改后明细名称长度不能超过200个字符";
  189. return false;
  190. }
  191. inputList = request.list
  192. .Where(t => t > 0)
  193. .GroupBy(t => t)
  194. .Select(t => t.First())
  195. .ToList();
  196. if (!inputList.Any())
  197. {
  198. rslt.ErrMsg = "床垫ID参数为空";
  199. return false;
  200. }
  201. return true;
  202. }
  203. private List<BatchModifyMattressInterfaceConfigWorkItem> CreateWorkItems(List<int> inputList, Dictionary<int, u_mattress> mattressMap)
  204. {
  205. var printid = 1;
  206. return inputList.Select(input =>
  207. {
  208. mattressMap.TryGetValue(input, out var mattress);
  209. return new BatchModifyMattressInterfaceConfigWorkItem
  210. {
  211. printid = printid++,
  212. mattressid = input,
  213. mattressname = mattress == null ? string.Empty : mattress.mattressname,
  214. result = new u_task_log_mx
  215. {
  216. biz_code = mattress.mattresscode,
  217. status = 3,
  218. err_msg = string.Empty
  219. }
  220. };
  221. }).ToList();
  222. }
  223. private string GetTaskRequestJson(BatchModifyMattressInterfaceConfigRequest request)
  224. {
  225. return JsonConvert.SerializeObject(new
  226. {
  227. request.list,
  228. request.configcodetype,
  229. request.erp_pzid,
  230. request.bj_pzname,
  231. request.new_bj_namemx
  232. });
  233. }
  234. private void FinishTaskLog(SqlCommand cmd, int taskid, List<u_task_log_mx> items)
  235. {
  236. var successCount = items.Count(t => t.status == 2);
  237. var failCount = items.Count(t => t.status == 3);
  238. var skipCount = items.Count(t => t.status == 4);
  239. ScheduleTaskHelper.UpdateTaskLogItemResults(cmd, taskid, items.Select((item, index) => new u_task_log_mx
  240. {
  241. printid = index + 1,
  242. status = item.status,
  243. result_json = JsonConvert.SerializeObject(item),
  244. err_msg = item.err_msg
  245. }).ToList());
  246. var logMsg = string.Format(
  247. "任务类型:{0} 总数:{1} 成功:{2} 失败:{3} 跳过:{4}",
  248. ScheduleTaskHelper.GetTaskTypeName(ScheduleTaskHelper.TaskTypeBatchModifyMattressInterfaceConfig),
  249. items.Count,
  250. successCount,
  251. failCount,
  252. skipCount);
  253. ScheduleTaskHelper.FinishTaskLog(cmd, taskid, items.Count, successCount, failCount, skipCount, logMsg);
  254. }
  255. private List<u_mattress_interface> GetTargetConfigRows(SqlCommand cmd, BatchModifyMattressInterfaceConfigRequest request, List<int> mattressIds)
  256. {
  257. var list = new List<u_mattress_interface>();
  258. var selectStr = @"SELECT u_mattress_interface.mattressid
  259. ,u_mattress_interface.printid
  260. ,u_mattress_interface.itemname
  261. ,u_mattress_interface.bj_pzname
  262. ,u_mattress_interface.bj_namemx
  263. ,u_mattress_interface.actual_size
  264. ,u_mattress_interface.sb_craft
  265. ,u_mattress_interface.actual_size_sb
  266. ,u_mattress_interface.erp_pzid
  267. ,u_mattress_interface.ss_rate
  268. ,u_mattress_interface.ls_rate
  269. ,u_mattress_interface.bj_inputtype
  270. FROM u_mattress_interface
  271. INNER JOIN u_mattress ON u_mattress.mattressid = u_mattress_interface.mattressid";
  272. var where = @"u_mattress_interface.mattressid IN " + ListEx.getString(mattressIds) + @"
  273. AND u_mattress.erp_configcodetype = @configcodetype
  274. AND u_mattress_interface.erp_pzid = @erp_pzid
  275. AND u_mattress_interface.bj_pzname = @bj_pzname";
  276. DbSqlHelper.SelectJoin(cmd, selectStr, where, new Dictionary<string, object>()
  277. {
  278. { "@configcodetype", request.configcodetype },
  279. { "@erp_pzid", request.erp_pzid },
  280. { "@bj_pzname", request.bj_pzname }
  281. }, "u_mattress_interface.mattressid,u_mattress_interface.printid", "mattressid,printid,itemname,bj_pzname,bj_namemx,actual_size,sb_craft,actual_size_sb,erp_pzid,ss_rate,ls_rate,bj_inputtype", 0, 0, list);
  282. return list;
  283. }
  284. private void UpdateConfigName(SqlCommand cmd, BatchModifyMattressInterfaceConfigRequest request, int mattressid, int printid)
  285. {
  286. cmd.CommandText = @"UPDATE u_mattress_interface
  287. SET bj_namemx = @new_bj_namemx
  288. WHERE mattressid = @mattressid
  289. AND printid = @printid
  290. AND erp_pzid = @erp_pzid
  291. AND bj_pzname = @bj_pzname
  292. AND bj_inputtype = 1
  293. AND EXISTS (
  294. SELECT 1
  295. FROM u_mattress
  296. WHERE u_mattress.mattressid = u_mattress_interface.mattressid
  297. AND u_mattress.erp_configcodetype = @configcodetype
  298. )";
  299. cmd.CommandType = CommandType.Text;
  300. cmd.Parameters.Clear();
  301. cmd.Parameters.AddWithValue("@new_bj_namemx", request.new_bj_namemx);
  302. cmd.Parameters.AddWithValue("@mattressid", mattressid);
  303. cmd.Parameters.AddWithValue("@printid", printid);
  304. cmd.Parameters.AddWithValue("@erp_pzid", request.erp_pzid);
  305. cmd.Parameters.AddWithValue("@bj_pzname", request.bj_pzname);
  306. cmd.Parameters.AddWithValue("@configcodetype", request.configcodetype);
  307. var count = cmd.ExecuteNonQuery();
  308. if (count != 1)
  309. {
  310. throw new Exception("Failed to update config row.");
  311. }
  312. }
  313. private List<u_mattress_interface> GetL1InterfaceRows(SqlCommand cmd, List<int> mattressIds)
  314. {
  315. var interfaceList = new List<u_mattress_interface>();
  316. var selectStr = @"SELECT u_mattress_interface.mattressid
  317. ,printid
  318. ,itemname
  319. ,bj_pzname
  320. ,bj_namemx
  321. ,actual_size
  322. ,sb_craft
  323. ,actual_size_sb
  324. ,erp_pzid
  325. ,ss_rate
  326. ,ls_rate
  327. ,bj_inputtype
  328. ,u_configure_code.pzcode
  329. ,u_configure_code.name AS pzname
  330. FROM u_mattress_interface
  331. INNER JOIN u_mattress on u_mattress.mattressid = u_mattress_interface.mattressid
  332. INNER JOIN u_configure_code on u_configure_code.typeid = u_mattress.erp_configcodetype
  333. AND u_mattress_interface.erp_pzid = u_configure_code.pzid";
  334. var where = "u_mattress_interface.mattressid IN " + ListEx.getString(mattressIds) + " AND u_mattress_interface.erp_pzid > 0 AND u_mattress_interface.bj_pzname <> '' ";
  335. DbSqlHelper.SelectJoin(cmd, selectStr, where, new Dictionary<string, object>(), "u_mattress_interface.mattressid,printid", "mattressid,printid,itemname,bj_pzname,bj_namemx,actual_size,sb_craft,actual_size_sb,erp_pzid,ss_rate,ls_rate,bj_inputtype,pzcode,pzname", 0, 0, interfaceList);
  336. return interfaceList;
  337. }
  338. private void UpdatePrefetchedInterfaceName(List<u_mattress_interface> interfaceRows, int printid, string newName)
  339. {
  340. var row = interfaceRows.FirstOrDefault(t => t.printid == printid);
  341. if (row != null)
  342. {
  343. row.bj_namemx = newName;
  344. }
  345. }
  346. private sealed class BatchModifyMattressInterfaceConfigWorkItem
  347. {
  348. public int printid { get; set; }
  349. public int mattressid { get; set; }
  350. public string mattressname { get; set; }
  351. public u_task_log_mx result { get; set; }
  352. }
  353. }
  354. }