BatchModifyMattressInterfaceConfigExcutor.cs 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395
  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. if (mattress == null)
  79. {
  80. result.status = 3;
  81. result.err_msg = "床垫报价记录不存在,请检查!";
  82. rslt.items.Add(result);
  83. continue;
  84. }
  85. if (mattress.erp_configcodetype != request.configcodetype)
  86. {
  87. result.status = 3;
  88. result.err_msg = "配置名称不匹配!";
  89. rslt.items.Add(result);
  90. continue;
  91. }
  92. if (LockHelper.CheckIsLock(cmd, MattressHelper.BillKeyWord, mattress.mattressid, tokendata.username, out string lockMsg)
  93. || LockHelper.CheckIsLock(cmd, InterfaceHelper.BillKeyWord, mattress.mattressid, tokendata.username, out lockMsg))
  94. {
  95. result.status = 3;
  96. result.err_msg = lockMsg;
  97. rslt.items.Add(result);
  98. continue;
  99. }
  100. if (targetRows.Count == 0)
  101. {
  102. result.status = 4;
  103. result.err_msg = "配置行不存在";
  104. rslt.items.Add(result);
  105. continue;
  106. }
  107. if (targetRows.Count > 1)
  108. {
  109. result.status = 4;
  110. result.err_msg = $"床垫报价:{mattress}存在重复配置行,请先手动处理!";
  111. rslt.items.Add(result);
  112. continue;
  113. }
  114. var target = targetRows[0];
  115. if (target.bj_inputtype != 1)
  116. {
  117. result.status = 4;
  118. result.err_msg = "配置不是录入类型,请检查!";
  119. rslt.items.Add(result);
  120. continue;
  121. }
  122. using (cmd.Transaction = cmd.Connection.BeginTransaction())
  123. {
  124. try
  125. {
  126. UpdateConfigName(cmd, request, mattress.mattressid, target.printid.Value);
  127. UpdatePrefetchedInterfaceName(interfaceRows, target.printid.Value, request.new_bj_namemx);
  128. //var l1Helper = HelperBase.GetHelper<ERPHelper>(cmd);
  129. //l1Helper.context = new HelperBase.Context() { tokendata = tokendata };
  130. //l1Helper.GetMattressMsg(mattress, interfaceRows);
  131. //var errMsg = l1Helper.SaveMtrldef(mattress, interfaceRows);
  132. //if (!string.IsNullOrEmpty(errMsg))
  133. //{
  134. // throw new Exception(errMsg);
  135. //}
  136. //if (mattress.erp_mtrlid > 0)
  137. //{
  138. // mattress.creatmtrl_flag = 1;
  139. // mattress.creatmtrl_auditingrep = tokendata.username;
  140. // mattress.creatmtrl_auditingdate = DateTime.Now;
  141. // DbSqlHelper.Update(cmd, mattress, "erp_mtrlid,creatmtrl_flag,erp_mtrlcode,creatmtrl_auditingrep,creatmtrl_auditingdate");
  142. //}
  143. cmd.Transaction.Commit();
  144. result.status = 2;
  145. result.err_msg = "Success.";
  146. }
  147. catch (Exception ex)
  148. {
  149. cmd.Transaction.Rollback();
  150. result.status = 3;
  151. result.err_msg = ex.Message;
  152. }
  153. }
  154. rslt.items.Add(result);
  155. }
  156. FinishTaskLog(cmd, taskid, rslt.items);
  157. }
  158. rslt.totalCount = rslt.items.Count;
  159. rslt.successCount = rslt.items.Count(t => t.status == 2);
  160. rslt.failCount = rslt.items.Count(t => t.status == 3);
  161. rslt.skipCount = rslt.items.Count(t => t.status == 4);
  162. }
  163. private bool ValidateRequest(BatchModifyMattressInterfaceConfigRequest request, BatchModifyMattressInterfaceConfigResponse rslt, out List<int> inputList)
  164. {
  165. inputList = new List<int>();
  166. if (request.list == null || !request.list.Any())
  167. {
  168. rslt.ErrMsg = "请选择需要批改的床垫清单";
  169. return false;
  170. }
  171. if (request.list.Count > 200)
  172. {
  173. rslt.ErrMsg = string.Format("单次最多批改{0}条,请分批处理", 200);
  174. return false;
  175. }
  176. request.bj_pzname = (request.bj_pzname ?? string.Empty).Trim();
  177. request.new_bj_namemx = (request.new_bj_namemx ?? string.Empty).Trim();
  178. if (request.configcodetype <= 0 || request.erp_pzid <= 0 || string.IsNullOrWhiteSpace(request.bj_pzname))
  179. {
  180. rslt.ErrMsg = "配置名称参数不完整";
  181. return false;
  182. }
  183. if (string.IsNullOrWhiteSpace(request.new_bj_namemx))
  184. {
  185. rslt.ErrMsg = "批改后明细名称不能为空";
  186. return false;
  187. }
  188. if (request.new_bj_namemx.Length > 200)
  189. {
  190. rslt.ErrMsg = "批改后明细名称长度不能超过200个字符";
  191. return false;
  192. }
  193. inputList = request.list
  194. .Where(t => t > 0)
  195. .GroupBy(t => t)
  196. .Select(t => t.First())
  197. .ToList();
  198. if (!inputList.Any())
  199. {
  200. rslt.ErrMsg = "床垫ID参数为空";
  201. return false;
  202. }
  203. return true;
  204. }
  205. private List<BatchModifyMattressInterfaceConfigWorkItem> CreateWorkItems(List<int> inputList, Dictionary<int, u_mattress> mattressMap)
  206. {
  207. var printid = 1;
  208. return inputList.Select(input =>
  209. {
  210. mattressMap.TryGetValue(input, out var mattress);
  211. return new BatchModifyMattressInterfaceConfigWorkItem
  212. {
  213. printid = printid++,
  214. mattressid = input,
  215. mattressname = mattress == null ? string.Empty : mattress.mattressname,
  216. result = new u_task_log_mx
  217. {
  218. biz_code = mattress.mattresscode,
  219. status = 3,
  220. err_msg = string.Empty
  221. }
  222. };
  223. }).ToList();
  224. }
  225. private string GetTaskRequestJson(BatchModifyMattressInterfaceConfigRequest request)
  226. {
  227. return JsonConvert.SerializeObject(new
  228. {
  229. request.list,
  230. request.configcodetype,
  231. request.erp_pzid,
  232. request.bj_pzname,
  233. request.new_bj_namemx
  234. });
  235. }
  236. private void FinishTaskLog(SqlCommand cmd, int taskid, List<u_task_log_mx> items)
  237. {
  238. var successCount = items.Count(t => t.status == 2);
  239. var failCount = items.Count(t => t.status == 3);
  240. var skipCount = items.Count(t => t.status == 4);
  241. ScheduleTaskHelper.UpdateTaskLogItemResults(cmd, taskid, items.Select((item, index) => new u_task_log_mx
  242. {
  243. printid = index + 1,
  244. status = item.status,
  245. result_json = JsonConvert.SerializeObject(item),
  246. err_msg = item.err_msg
  247. }).ToList());
  248. var logMsg = string.Format(
  249. "任务类型:{0} 总数:{1} 成功:{2} 失败:{3} 跳过:{4}",
  250. ScheduleTaskHelper.GetTaskTypeName(ScheduleTaskHelper.TaskTypeBatchModifyMattressInterfaceConfig),
  251. items.Count,
  252. successCount,
  253. failCount,
  254. skipCount);
  255. ScheduleTaskHelper.FinishTaskLog(cmd, taskid, items.Count, successCount, failCount, skipCount, logMsg);
  256. }
  257. private List<u_mattress_interface> GetTargetConfigRows(SqlCommand cmd, BatchModifyMattressInterfaceConfigRequest request, List<int> mattressIds)
  258. {
  259. var list = new List<u_mattress_interface>();
  260. var selectStr = @"SELECT u_mattress_interface.mattressid
  261. ,u_mattress_interface.printid
  262. ,u_mattress_interface.itemname
  263. ,u_mattress_interface.bj_pzname
  264. ,u_mattress_interface.bj_namemx
  265. ,u_mattress_interface.actual_size
  266. ,u_mattress_interface.sb_craft
  267. ,u_mattress_interface.actual_size_sb
  268. ,u_mattress_interface.erp_pzid
  269. ,u_mattress_interface.ss_rate
  270. ,u_mattress_interface.ls_rate
  271. ,u_mattress_interface.bj_inputtype
  272. FROM u_mattress_interface
  273. INNER JOIN u_mattress ON u_mattress.mattressid = u_mattress_interface.mattressid";
  274. var where = @"u_mattress_interface.mattressid IN " + ListEx.getString(mattressIds) + @"
  275. AND u_mattress.erp_configcodetype = @configcodetype
  276. AND u_mattress_interface.erp_pzid = @erp_pzid
  277. AND u_mattress_interface.bj_pzname = @bj_pzname";
  278. DbSqlHelper.SelectJoin(cmd, selectStr, where, new Dictionary<string, object>()
  279. {
  280. { "@configcodetype", request.configcodetype },
  281. { "@erp_pzid", request.erp_pzid },
  282. { "@bj_pzname", request.bj_pzname }
  283. }, "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);
  284. return list;
  285. }
  286. private void UpdateConfigName(SqlCommand cmd, BatchModifyMattressInterfaceConfigRequest request, int mattressid, int printid)
  287. {
  288. cmd.CommandText = @"UPDATE u_mattress_interface
  289. SET bj_namemx = @new_bj_namemx
  290. WHERE mattressid = @mattressid
  291. AND printid = @printid
  292. AND erp_pzid = @erp_pzid
  293. AND bj_pzname = @bj_pzname
  294. AND bj_inputtype = 1
  295. AND EXISTS (
  296. SELECT 1
  297. FROM u_mattress
  298. WHERE u_mattress.mattressid = u_mattress_interface.mattressid
  299. AND u_mattress.erp_configcodetype = @configcodetype
  300. )";
  301. cmd.CommandType = CommandType.Text;
  302. cmd.Parameters.Clear();
  303. cmd.Parameters.AddWithValue("@new_bj_namemx", request.new_bj_namemx);
  304. cmd.Parameters.AddWithValue("@mattressid", mattressid);
  305. cmd.Parameters.AddWithValue("@printid", printid);
  306. cmd.Parameters.AddWithValue("@erp_pzid", request.erp_pzid);
  307. cmd.Parameters.AddWithValue("@bj_pzname", request.bj_pzname);
  308. cmd.Parameters.AddWithValue("@configcodetype", request.configcodetype);
  309. var count = cmd.ExecuteNonQuery();
  310. if (count != 1)
  311. {
  312. throw new Exception("Failed to update config row.");
  313. }
  314. }
  315. private List<u_mattress_interface> GetL1InterfaceRows(SqlCommand cmd, List<int> mattressIds)
  316. {
  317. var interfaceList = new List<u_mattress_interface>();
  318. var selectStr = @"SELECT u_mattress_interface.mattressid
  319. ,printid
  320. ,itemname
  321. ,bj_pzname
  322. ,bj_namemx
  323. ,actual_size
  324. ,sb_craft
  325. ,actual_size_sb
  326. ,erp_pzid
  327. ,ss_rate
  328. ,ls_rate
  329. ,bj_inputtype
  330. ,u_configure_code.pzcode
  331. ,u_configure_code.name AS pzname
  332. FROM u_mattress_interface
  333. INNER JOIN u_mattress on u_mattress.mattressid = u_mattress_interface.mattressid
  334. INNER JOIN u_configure_code on u_configure_code.typeid = u_mattress.erp_configcodetype
  335. AND u_mattress_interface.erp_pzid = u_configure_code.pzid";
  336. var where = "u_mattress_interface.mattressid IN " + ListEx.getString(mattressIds) + " AND u_mattress_interface.erp_pzid > 0 AND u_mattress_interface.bj_pzname <> '' ";
  337. 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);
  338. return interfaceList;
  339. }
  340. private void UpdatePrefetchedInterfaceName(List<u_mattress_interface> interfaceRows, int printid, string newName)
  341. {
  342. var row = interfaceRows.FirstOrDefault(t => t.printid == printid);
  343. if (row != null)
  344. {
  345. row.bj_namemx = newName;
  346. }
  347. }
  348. private sealed class BatchModifyMattressInterfaceConfigWorkItem
  349. {
  350. public int printid { get; set; }
  351. public int mattressid { get; set; }
  352. public string mattressname { get; set; }
  353. public u_task_log_mx result { get; set; }
  354. }
  355. }
  356. }