KKLImplService.java 57 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022
  1. package com.malk.kuaikeli.service.impl;
  2. import cn.hutool.core.date.DateUtil;
  3. import cn.hutool.core.util.NumberUtil;
  4. import com.alibaba.fastjson.JSON;
  5. import com.alibaba.fastjson.JSONArray;
  6. import com.alibaba.fastjson.JSONObject;
  7. import com.malk.kuaikeli.service.KKLService;
  8. import com.malk.server.aliwork.YDConf;
  9. import com.malk.server.aliwork.YDParam;
  10. import com.malk.server.common.McException;
  11. import com.malk.server.common.McR;
  12. import com.malk.server.dingtalk.DDConf;
  13. import com.malk.server.dingtalk.DDR_New;
  14. import com.malk.service.aliwork.YDClient;
  15. import com.malk.service.aliwork.YDService;
  16. import com.malk.service.dingtalk.DDClient;
  17. import com.malk.utils.*;
  18. import lombok.SneakyThrows;
  19. import lombok.Synchronized;
  20. import lombok.extern.slf4j.Slf4j;
  21. import org.apache.commons.lang3.StringEscapeUtils;
  22. import org.apache.logging.log4j.util.Strings;
  23. import org.apache.xmlbeans.impl.xb.xsdschema.Public;
  24. import org.springframework.beans.factory.annotation.Autowired;
  25. import org.springframework.scheduling.annotation.Async;
  26. import org.springframework.stereotype.Service;
  27. import java.time.LocalDateTime;
  28. import java.util.*;
  29. import java.util.stream.Collectors;
  30. @Service
  31. @Slf4j
  32. public class KKLImplService implements KKLService {
  33. //供应商原材料档案表
  34. private static final String SUPPLIER_MATERIALS = "FORM-12EB6BCE3C264630824721E7BBABCC03L8U9";
  35. private static final String SUPPLIER_CHANGE = "FORM-C939E9F486124464B17A6910D66A2425EWPX";
  36. //定价单明细中间表
  37. private static final String PRICE_DETAIL_MIDDLE = "FORM-E6766M811CKD2PIXEAKOM9S2DKBM2PBQU1MLL5";
  38. //菜品管理
  39. private static final String FOOD = "FORM-GP666M71DIGDE0ZADDLZ85VEFBD128OUH1MLLF";
  40. @Autowired
  41. private YDService ydService;
  42. @Autowired
  43. private YDClient ydClient;
  44. @Autowired
  45. private DDClient ddClient;
  46. @Autowired
  47. private DDConf ddConf;
  48. /**
  49. * [动态] 发起单据, 分供应商进行流程推送
  50. */
  51. @Override
  52. public void matchSupplier(Map data) {
  53. // ppExt: 供应商区分发起: 当前表:供应供子表组件ID,子表内供应商编号,名称,负责人
  54. String[] compIds_supplier = String.valueOf(data.get("compId_supplier")).split(", ");
  55. String compId_supplier = compIds_supplier[1];
  56. Map formData = (Map) JSON.parse(String.valueOf(data.get("formData")));
  57. List<Map> details = (List<Map>) formData.get(compIds_supplier[0]);
  58. // 供应商编号, 数据去重: 提取数据区分供应商发起
  59. List<Map> suppliers = UtilMc.distinctByKey(details, compId_supplier);
  60. for (Map supplier : suppliers) {
  61. List<Map> dataList = details.stream().filter(item -> supplier.get(compId_supplier).equals(item.get(compId_supplier))).collect(Collectors.toList());
  62. formData.put(compIds_supplier[0], dataList);
  63. // ppExt: 参数传递, 目标表组件ID, 对照当前表子表内的子表内供应商编号,名称,负责人已放置主表字段, 此处公共内容提前首条数据进行赋值
  64. for (int i = 1; i < compIds_supplier.length; i++) {
  65. formData.put(compIds_supplier[i], YDConf.getDataByCompId(dataList.get(0), compIds_supplier[i]));
  66. }
  67. data.put("formData", JSON.toJSONString(formData));
  68. ydService.copyFormData(data); // 发起流程
  69. }
  70. }
  71. /**
  72. * 菜单计划, 编辑校验
  73. * -
  74. * 前端提交动作: 校验是否审批通过, 是否当日之前计划, 是否当日且在16点及以后时间, 均不允许提交
  75. * 后端校验返回、加任何产品都要走审批,减少20%以内直接过,每一个原材料
  76. */
  77. @Override
  78. public boolean validateApprove(Map data) {
  79. boolean approve =UtilMap.getBoolean(data,"approveFlag");
  80. // boolean approve = false;
  81. List<Map> dataList = UtilMap.getList(data, "list");
  82. // for (Map row : dataList) {
  83. // 匹配切配工作单, 采购
  84. // List<Map> formList = (List<Map>) ydClient.queryData(YDParam.builder()
  85. // .formUuid("FORM-RK966E71T0LDSTW39WFHE9OQ5GU23FKRRDNLL2")
  86. // .searchFieldJson(JSON.toJSONString(UtilMap.map("textField_lmsuq8am, textField_lm8zta2z, textField_ln1ez5li, textField_llndm599", data.get("name"), data.get("area"), row.get("textField_ln1ez5li"), row.get("textField_llndm599"))))
  87. // .build(),
  88. // YDConf.FORM_QUERY.retrieve_search_form).getData();
  89. //
  90. // if (formList.size() == 0) {
  91. // approve = true;// 添加原材料 判断条件是否有对应的切配工作单
  92. // break;
  93. // }
  94. // Map formData = (Map) formList.get(0).get("formData");
  95. // float cur = UtilMap.getFloat(row, "numberField_lmym5628");// 计划数量
  96. // float src = UtilMap.getFloat(formData, "numberField_lln477o2");// 切配工作单数量
  97. // if (cur > src || (src - cur) / src > 0.2f) {
  98. // approve = true;
  99. // break;
  100. // }
  101. // }
  102. String poid=UtilMap.getString(data,"poid");
  103. if (approve) {
  104. // 发起菜单审批
  105. log.info("发起菜单审批");
  106. // 保存数据到备份表单
  107. String id=(String) ydService.mirrorFormData(poid,"FORM-1FD63CF820F3444D994F0486CA95F6E6UZ2E","",new HashMap(),"");
  108. Map form=UtilMap.getMap(data,"form");
  109. form.put("textField_lx2l5l2s",poid);
  110. form.put("textField_lx2l5l2t",id);
  111. form.put("textField_lx2omku4",data.get("user").toString());
  112. ydClient.operateData(YDParam.builder()
  113. .formUuid("FORM-UP96637100HD036TA1M05B74GHLV3DRS54NLLC")
  114. .processCode("TPROC--UP96637100HD036TA1M05B74GHLV3ERS54NLLD")
  115. .formDataJson(JSON.toJSONString(form)) // 前端数据组装
  116. .userId(data.get("user").toString())
  117. .build(), YDConf.FORM_OPERATION.start);
  118. }else{
  119. log.info("未触发审批 执行业务逻辑-编辑前后更新计划采购单");
  120. planUpdate(poid,dataList,data.get("user").toString());
  121. }
  122. return approve;
  123. }
  124. @Override
  125. public void planApproval(Map data) {
  126. String fid=UtilMap.getString(data,"fid");
  127. String backFid=UtilMap.getString(data,"backFid");
  128. String results=UtilMap.getString(data,"results");
  129. String userId=UtilMap.getString(data,"userId");
  130. if(results.equals("通过")){
  131. log.info("审批通过 保存变更信息");
  132. // 新数据
  133. Map formData=(Map) ydClient.queryData(YDParam.builder().formInstId(fid).build(), YDConf.FORM_QUERY.retrieve_id).getFormData();
  134. // 旧数据
  135. Map backData=(Map) ydClient.queryData(YDParam.builder().formInstId(backFid).build(), YDConf.FORM_QUERY.retrieve_id).getFormData();
  136. List<Map> list=UtilMap.getList(backData,"tableField_lln477nw");
  137. saveData(list,formData,false,userId);// -
  138. list=UtilMap.getList(formData,"tableField_lln477nw");
  139. saveData(list,formData,true,userId);// +
  140. }else{
  141. log.info("审批拒绝 还原备份数据");
  142. ydService.mirrorFormData(backFid,"FORM-IH966T61XJZDNT4D9N6D189RJ2CK3Q27NZ5ML0","",new HashMap(),fid);
  143. }
  144. }
  145. @Override
  146. public void updateState(String id) {
  147. try {
  148. log.info("异步修改状态,休眠3s");
  149. Thread.sleep(3000);
  150. } catch (InterruptedException e) {
  151. e.printStackTrace();
  152. }
  153. // 更新计划状态
  154. ydService.operateData(YDParam.builder()
  155. .formInstanceId(id)
  156. .updateFormDataJson(JSON.toJSONString(UtilMap.map("textField_lm8znr9n", "执行中")))
  157. .build(), YDConf.FORM_OPERATION.update);
  158. }
  159. private void planUpdate(String poid,List<Map> dataList,String userId){
  160. Map formData=(Map) ydClient.queryData(YDParam.builder().formInstId(poid).build(), YDConf.FORM_QUERY.retrieve_id).getFormData();
  161. List<Map> list=UtilMap.getList(formData,"tableField_lln477nw");
  162. saveData(list,formData,false,userId);// -
  163. saveData(dataList,formData,true,userId);// +
  164. }
  165. /***
  166. * 保存数据
  167. * @param list true:新数据 false:老数据
  168. * @param formData 菜单计划数据
  169. * @param isAdd true 加数据 false 减数据
  170. * @param userId 新增操作的用户编号
  171. */
  172. private void saveData(List<Map> list,Map formData,boolean isAdd,String userId){
  173. String formUuid="FORM-XHA66881J8KDA6V3FM6LZBUP9PDE37VESDNLL6";// 计划采购单
  174. for(Map map:list){
  175. Map queryMap=new HashMap();
  176. queryMap.put("dateField_llndtdwl", Arrays.asList(map.get("dateField_ln1ez5lg"),map.get("dateField_ln1ez5lg")));// 日期
  177. queryMap.put("textField_llq9x6ov",formData.get("textField_lln477nh"));// 项目编号
  178. queryMap.put("textField_lmk97m1v",map.get("textField_lmk97m1v"));// 原材料编号
  179. Map upMap=new HashMap();
  180. upMap.put("numberField_llojyfy3",map.get("numberField_lmsvfftq"));// 成本单价
  181. upMap.put("numberField_llojyfy4",map.get("numberField_lmsvfftr"));// 服务费率
  182. upMap.put("dateField_llndtdwl",map.get("dateField_ln1ez5lg"));// 计划日期
  183. upMap.put("textField_llndm599",map.get("textField_llndm599"));// 原材料名称
  184. upMap.put("textField_lluj4hu1",map.get("textField_lln3lmn2"));// 单位
  185. upMap.put("textField_llq9x6ov",formData.get("textField_lln477nh"));// 项目编号
  186. upMap.put("textField_lm5z7kvo",map.get("textField_ln1ez5li"));// 计划日期(文本)
  187. upMap.put("textField_lm5z4ioi",formData.get("textField_lmsvfftp"));// 项目名称
  188. upMap.put("textField_lmk97m1v",map.get("textField_lmk97m1v"));// 原材料编号
  189. upMap.put("selectField_lmqclyx9",map.get("selectField_lmqclyx9"));// 第一分类
  190. upMap.put("numberField_lmqclyxa",map.get("numberField_lmqclyxa"));// 供货价
  191. upMap.put("textField_lnsmha2j",map.get("textField_lnwxz9ji"));// 品牌
  192. upMap.put("textField_lpjet322",formData.get("textField_lpjet322"));// 档口名称
  193. upMap.put("textField_lpjet321",formData.get("textField_lpjet321"));// 档口编号
  194. upMap.put("textField_loe04txb",map.get("textField_lptgvips"));// 采购单位
  195. List<Map> list2=(List<Map>) ydClient.queryData(YDParam.builder().formUuid(formUuid).searchFieldJson(JSONObject.toJSONString(queryMap)).build(), YDConf.FORM_QUERY.retrieve_list).getData();
  196. if(list2==null||list2.size()<1){
  197. if(!isAdd){
  198. log.info("未找到对应的计划采购单,退出");
  199. continue;
  200. }
  201. upMap.put("numberField_lln477o2", map.get("numberField_lmym5628"));// 初始采购数量(kg)
  202. upMap.put("numberField_lm9008fq", map.get("numberField_lmym5628"));// 实际采购数量(kg)
  203. upMap.put("numberField_lns0dkzv", map.get("numberField_lns0dkzv"));// 投料数量(kg)
  204. upMap.put("numberField_loe04txa", map.get("numberField_lomyf89l"));// 采购量
  205. ydClient.operateData(YDParam.builder().formUuid(formUuid).formDataJson(JSONObject.toJSONString(upMap)).userId(userId).build(), YDConf.FORM_OPERATION.create);
  206. }else{
  207. Map oldMap=UtilMap.getMap(list2.get(0),"formData");
  208. if(isAdd){
  209. upMap.put("numberField_lln477o2", NumberUtil.add(UtilMap.getString(oldMap,"numberField_lln477o2"),UtilMap.getString(map,"numberField_lmym5628")));// 初始采购数量(kg)
  210. upMap.put("numberField_lm9008fq", NumberUtil.add(UtilMap.getString(oldMap,"numberField_lm9008fq"),UtilMap.getString(map,"numberField_lmym5628")));// 实际采购数量(kg)
  211. upMap.put("numberField_lns0dkzv", NumberUtil.add(UtilMap.getString(oldMap,"numberField_lns0dkzv"),UtilMap.getString(map,"numberField_lns0dkzv")));// 投料数量
  212. upMap.put("numberField_loe04txa", NumberUtil.add(UtilMap.getString(oldMap,"numberField_loe04txa"),UtilMap.getString(map,"numberField_lomyf89l")));// 采购量
  213. }else {
  214. upMap.put("numberField_lln477o2", NumberUtil.sub(UtilMap.getString(oldMap, "numberField_lln477o2"), UtilMap.getString(map, "numberField_lmym5628")));// 初始采购数量(kg)
  215. upMap.put("numberField_lm9008fq", NumberUtil.sub(UtilMap.getString(oldMap, "numberField_lm9008fq"), UtilMap.getString(map, "numberField_lmym5628")));// 实际采购数量(kg)
  216. upMap.put("numberField_lns0dkzv", NumberUtil.sub(UtilMap.getString(oldMap, "numberField_lns0dkzv"), UtilMap.getString(map, "numberField_lns0dkzv")));// 投料数量
  217. upMap.put("numberField_loe04txa", NumberUtil.sub(UtilMap.getString(oldMap,"numberField_loe04txa"),UtilMap.getString(map,"numberField_lomyf89l")));// 采购量
  218. }
  219. ydClient.operateData(YDParam.builder().formInstanceId(UtilMap.getString(list2.get(0),"formInstanceId")).updateFormDataJson(JSONObject.toJSONString(upMap)).build(), YDConf.FORM_OPERATION.update);
  220. }
  221. String formUuid2="FORM-RK966E71T0LDSTW39WFHE9OQ5GU23FKRRDNLL2";
  222. Map qMap=new HashMap();
  223. qMap.put("textField_lmsuq8am",formData.get("textField_lln477nh"));// 项目编号
  224. qMap.put("dateField_llndtdwl",Arrays.asList(map.get("dateField_ln1ez5lg"),map.get("dateField_ln1ez5lg")));// 日期
  225. qMap.put("textField_lm8zta2z",formData.get("selectField_llm1i9yl"));// 餐次
  226. qMap.put("selectField_lln3lmn5",map.get("textField_lm4m83rv"));// 切配类型
  227. qMap.put("textField_llndm599",map.get("textField_llndm599"));// 原材料名称
  228. Map addMap=new HashMap();
  229. addMap.putAll(qMap);
  230. String data=String.valueOf(formData.get("associationFormField_lln477nb_id"));
  231. addMap.put("associationFormField_llndtdwg",JSONObject.parseArray(data.substring(1,data.length()-1).replaceAll("\\\\","")));// 项目点
  232. addMap.put("textField_ln1ez5li",map.get("textField_ln1ez5li"));// 计划日期(文本)
  233. addMap.put("dateField_llndtdwl",map.get("dateField_ln1ez5lg"));// 日期
  234. List<Map> list3=(List<Map>) ydClient.queryData(YDParam.builder().formUuid(formUuid2).searchFieldJson(JSONObject.toJSONString(qMap)).build(),
  235. YDConf.FORM_QUERY.retrieve_list).getData();
  236. if(list3==null||list3.size()<1){
  237. if(!isAdd){
  238. log.info("未找到对应的切配工作单,退出");
  239. continue;
  240. }
  241. addMap.put("numberField_lln477o2",map.get("numberField_lmym5628"));// 数量(kg)
  242. addMap.put("numberField_lnrkgimz",map.get("numberField_lomyf89l"));// 初始采购数量
  243. ydClient.operateData(YDParam.builder().formUuid(formUuid2)
  244. .formDataJson(JSONObject.toJSONString(addMap))
  245. .userId(userId)
  246. .build(), YDConf.FORM_OPERATION.create);
  247. }else{
  248. Map oldMap=UtilMap.getMap(list3.get(0),"formData");
  249. if(isAdd){
  250. addMap.put("numberField_lln477o2", NumberUtil.add(UtilMap.getString(oldMap,"numberField_lln477o2"),UtilMap.getString(map,"numberField_lmym5628")));// 数量(kg)
  251. addMap.put("numberField_lnrkgimz", NumberUtil.add(UtilMap.getString(oldMap,"numberField_lnrkgimz"),UtilMap.getString(map,"numberField_lomyf89l")));// 初始采购数量
  252. }else {
  253. addMap.put("numberField_lln477o2", NumberUtil.sub(UtilMap.getString(oldMap,"numberField_lln477o2"), UtilMap.getString(map, "numberField_lmym5628")));// 数量(kg)
  254. addMap.put("numberField_lnrkgimz", NumberUtil.sub(UtilMap.getString(oldMap,"numberField_lnrkgimz"), UtilMap.getString(map, "numberField_lomyf89l")));// 初始采购数量
  255. }
  256. ydClient.operateData(YDParam.builder().formInstanceId(UtilMap.getString(list3.get(0),"formInstanceId"))
  257. .updateFormDataJson(JSONObject.toJSONString(addMap))
  258. .build(), YDConf.FORM_OPERATION.update);
  259. }
  260. }
  261. }
  262. /**
  263. * 定价单: 项目点 & 供应商大类, 数据匹配
  264. */
  265. @Override
  266. @SneakyThrows
  267. @Synchronized
  268. public void serviceRate(Map data) {
  269. // todo2: 宜搭更新,校验的超时等待在3s, 因此方法修改为异步. 容错定时任务?匹配不一致数据
  270. String supperCode = String.valueOf(data.get("code"));
  271. List<String> types = (List<String>) JSON.parse(String.valueOf(data.get("type")));
  272. List<String> rates = (List<String>) JSON.parse(String.valueOf(data.get("rate")));
  273. List<String> rates2 = (List<String>) JSON.parse(String.valueOf(data.get("rate2")));
  274. List<String> status = (List<String>) JSON.parse(String.valueOf(data.get("status")));
  275. String oldSupId=String.valueOf(data.get("oldSupId"));
  276. for (int i = 0; i < types.size(); i++) {
  277. List<Map> materials = supperMaterials(supperCode, types.get(i));
  278. List<Map> records = projectMaterials(supperCode, types.get(i));
  279. log.info("定价单同步, {}, {}", materials.size(), records.size());
  280. for (Map material : materials) {
  281. // 数据处理: 服务费率与供货价, 项目信息
  282. double rate = Double.valueOf(rates.get(i));
  283. double rate2 = Double.valueOf(rates2.get(i));
  284. material.putAll(UtilMap.map("numberField_llkb7kcy, numberField_lpalgz04, textField_lm4lxur8", rate, rate2, status.get(i)));
  285. double price1 = UtilNumber.formatPrecisionValue(UtilMap.getDouble(material, "numberField_llkknd6g") * (rate + 100) / 100f);
  286. double price2 = UtilNumber.formatPrecisionValue(UtilMap.getDouble(material, "numberField_lpalgz05") * (100 + rate2) / 100f);
  287. material.putAll(UtilMap.map("numberField_llkknd6h, numberField_lpalgz0a", price1, price2));
  288. material.putAll(UtilMap.map("textField_llm1vtjm, textField_loy1ep8r", data.get("proCode"), data.get("proName")));
  289. YDParam ydParam = YDParam.builder()
  290. .formUuid("FORM-E6766M811CKD2PIXEAKOM9S2DKBM2PBQU1MLL5")
  291. .formDataJson(JSON.toJSONString(material))
  292. .build();
  293. YDConf.FORM_OPERATION operation = YDConf.FORM_OPERATION.create;
  294. // ppExt: 提交校验逻辑, 匹配定价单数若存在则匹配服务费率, 不一致执行更新
  295. if (records.size() > 0) {
  296. Optional optional = records.stream().filter(item -> item.get("textField_llkb7kd2").equals(material.get("textField_llkb7kd2")) && // 物品编号
  297. item.get("textField_llm1vtjm").equals(material.get("textField_llm1vtjm"))// 项目编号)
  298. ).findAny();
  299. if (optional.isPresent()) {
  300. ydParam.setUpdateFormDataJson(JSON.toJSONString(material));
  301. ydParam.setFormInstanceId(String.valueOf(((Map) optional.get()).get("formInstanceId")));
  302. operation = YDConf.FORM_OPERATION.update;
  303. }
  304. }
  305. ydClient.operateData(ydParam, operation);
  306. }
  307. }
  308. }
  309. /// 原材料: 供应商第一分类下物料
  310. List<Map> supperMaterials(String code, String type) {
  311. List<Map> dataList = ydService.queryFormData_all(YDParam.builder()
  312. .formUuid("FORM-12EB6BCE3C264630824721E7BBABCC03L8U9")
  313. .searchFieldJson(JSON.toJSONString(UtilMap.map("textField_llzzbyj1, selectField_llkk6cms", code, type)))
  314. .build());
  315. log.info("supperMaterials, {}", dataList.size());
  316. return dataList;
  317. }
  318. /// 定价单: 供应商第一分类下物料
  319. List<Map> projectMaterials(String code, String type) {
  320. List<Map> dataList = ydService.queryFormData_all(YDParam.builder()
  321. .formUuid("FORM-E6766M811CKD2PIXEAKOM9S2DKBM2PBQU1MLL5")
  322. .searchFieldJson(JSON.toJSONString(UtilMap.map("textField_llzzbyj1, selectField_llkk6cms", code, type)))
  323. .build());
  324. log.info("projectMaterials, {}", dataList.size());
  325. return dataList;
  326. }
  327. /**
  328. * 物料档案: 价格调整
  329. */
  330. @Override
  331. public void adjustCost(Map data) {
  332. double cost1 = UtilMap.getDouble(data, "costPrice");
  333. double cost2 = UtilMap.getDouble(data, "nextCostPrice");
  334. String cost3 = UtilMap.getString(data,"timeLimit");
  335. String cost4 = UtilMap.getString(data,"packNumber");// 包装数量
  336. String cost5 = UtilMap.getString(data,"packUnit");// 包装单位
  337. String cost6 = UtilMap.getString(data,"state");// 原材料状态
  338. //todo2: 服务执行, 周日凌晨更新价格前, 是否重新匹配数据?
  339. List<Map> dataList = ydService.queryFormData_all(YDParam.builder()
  340. .formUuid("FORM-E6766M811CKD2PIXEAKOM9S2DKBM2PBQU1MLL5")
  341. .searchFieldJson(JSON.toJSONString(UtilMap.map("textField_llkb7kd2", data.get("itemNumber"))))
  342. .build());
  343. log.info("adjustCost, {}", dataList.size());
  344. for (Map record : dataList) {
  345. // if (cost1 == UtilMap.getDouble(record, "numberField_llkknd6g") && cost2 == UtilMap.getDouble(record, "numberField_lpalgz05")) {
  346. // continue;
  347. // }
  348. double rate = UtilMap.getDouble(record, "numberField_llkb7kcy");
  349. double rate2 = UtilMap.getDouble(record, "numberField_lpalgz04");
  350. double price1 = UtilNumber.formatPrecisionValue(cost1 * (rate + 100) / 100f);
  351. double price2 = UtilNumber.formatPrecisionValue(cost2 * (100 + rate2) / 100f);
  352. String state= cost6.equals("已启用") && Long.parseLong(cost3) > UtilDateTime.getLocalDateTimeTimeStamp()?"已启用":"已停用";
  353. Map update = UtilMap.map("numberField_llkknd6h, numberField_lpalgz0a", price1, price2);
  354. update.putAll(UtilMap.map("numberField_llkknd6g, numberField_lpalgz05, dateField_lm4lxur7, numberField_lnrzzg03, textField_lnrzzg04,textField_lm4lxur8", cost1, cost2, cost3, cost4, cost5,state ));
  355. ydClient.operateData(YDParam.builder()
  356. .formInstanceId(String.valueOf(record.get("formInstanceId")))
  357. .updateFormDataJson(JSON.toJSONString(update))
  358. .build(), YDConf.FORM_OPERATION.update);
  359. }
  360. }
  361. /**
  362. * 供应商原材料档案: 新增匹配
  363. */
  364. @Override
  365. public void additionMaterial(Map data) {
  366. // 通过供应商编号 查询项目
  367. List<Map> dataList = ydService.queryFormData_all(YDParam.builder()
  368. .formUuid("FORM-W2A66Z91B4KDWDIAA7SI1BRBRTKM3XL87BKLL0")
  369. .searchFieldJson(JSON.toJSONString(UtilMap.map("textField_llzzbai8", data.get("gysNumber"))))
  370. .build());
  371. dataList.forEach(dataItem -> {
  372. List<Map> mapList = (List<Map>) dataItem.get("tableField_llq74mwk");
  373. // 这里对比第二分类 selectField_llq74mwl ==> selectField_lv3v3911
  374. List<Map> maps = mapList.stream().filter(items -> items.get("selectField_lv3v3911").equals(data.get("firstName"))).collect(Collectors.toList());
  375. if(maps.size()>0){
  376. List<Map> goodList = ydService.queryFormData_all(YDParam.builder()
  377. .formUuid("FORM-12EB6BCE3C264630824721E7BBABCC03L8U9")
  378. .searchFieldJson(JSON.toJSONString(UtilMap.map("textField_llkb7kd2", data.get("goodNumber"))))
  379. .build());
  380. Map goodMap = goodList.get(0);
  381. Map hashMap = new HashMap();
  382. hashMap.put("textField_llzzbyj1",data.get("gysNumber")); //供应商编号
  383. hashMap.put("textField_lmsli3bq",dataItem.get("textField_lmsli3bq")); //供应商名称
  384. hashMap.put("textField_llm1vtjm",dataItem.get("textField_lllovku7")); //项目编号
  385. hashMap.put("textField_loy1ep8r",dataItem.get("textField_loy1ep8r"));//项目名称
  386. hashMap.put("textField_llkb7kd2",data.get("goodNumber")); //物品编号
  387. hashMap.put("textField_llkb7kd1",goodMap.get("textField_llkb7kd1")); //物品名称
  388. hashMap.put("textField_llkb7kd3",goodMap.get("textField_llkb7kd3")); //单位
  389. hashMap.put("textField_llkb7kd4",goodMap.get("textField_llkb7kd4")); //规格
  390. hashMap.put("selectField_llkb7kd5",data.get("firstName")); //第一分类
  391. hashMap.put("selectField_llkk6cms",goodMap.get("selectField_llkk6cms")); //第二分类
  392. double rate = UtilMap.getDouble(maps.get(0), "numberField_llq74mwm"); //本周费率
  393. double rate2 = UtilMap.getDouble(maps.get(0), "numberField_lpplr3im"); //下周费率
  394. double pce1 = UtilMap.getDouble(goodMap, "numberField_llkknd6g"); //成本单价
  395. double pce2 = UtilMap.getDouble(goodMap, "numberField_lpalgz05"); //下周成本单价
  396. double price1 = UtilNumber.formatPrecisionValue(pce1 * (rate + 100) / 100f); //下周成本价
  397. double price2 = UtilNumber.formatPrecisionValue(pce2 * (rate2 + 100 ) / 100f); //下周供货价
  398. hashMap.put("numberField_llkb7kcy",rate); //服务费率
  399. hashMap.put("numberField_lpalgz04",rate2); //下周服务费率
  400. hashMap.put("numberField_llkknd6g",pce1); //成本单价
  401. hashMap.put("numberField_lpalgz05",pce2); //下周成本单价
  402. hashMap.put("numberField_llkknd6h",price1); //供货价
  403. hashMap.put("numberField_lpalgz0a",price2); //下周供货价
  404. hashMap.put("dateField_lm4lxur7",goodMap.get("dateField_lm4lxur7")); //期限
  405. hashMap.put("textField_lm4lxur8","已启用"); //状态
  406. hashMap.put("numberField_lnrzzg03",goodMap.get("numberField_lnrzzg03")); //包装数量
  407. hashMap.put("textField_lnrzzg04",goodMap.get("textField_lnrzzg04")); //包装单位
  408. log.info("hashMap,{}", JSON.toJSONString(hashMap));
  409. ydClient.operateData(YDParam.builder()
  410. .formUuid("FORM-E6766M811CKD2PIXEAKOM9S2DKBM2PBQU1MLL5")
  411. .formDataJson(JSON.toJSONString(hashMap))
  412. .build(), YDConf.FORM_OPERATION.create);
  413. }
  414. });
  415. }
  416. /**
  417. * 周日同步更新价格
  418. */
  419. @Override
  420. @SneakyThrows
  421. public void syncPrice() {
  422. // 定价单明细表
  423. List<Map> dataList = ydService.queryFormData_all(YDParam.builder()
  424. .formUuid("FORM-E6766M811CKD2PIXEAKOM9S2DKBM2PBQU1MLL5")
  425. .build());
  426. for (Map record : dataList) {
  427. double price1 = UtilMap.getDouble(record, "numberField_llkknd6h");
  428. double price2 = UtilMap.getDouble(record, "numberField_lpalgz0a");
  429. if (price1 == price2) {
  430. continue;
  431. }
  432. // 本质上是对比供货价差异, 下周全覆盖
  433. Map update = UtilMap.map("numberField_llkknd6h, numberField_llkb7kcy, numberField_llkknd6g", price2, record.get("numberField_lpalgz04"), record.get("numberField_lpalgz05"));
  434. ydClient.operateData(YDParam.builder()
  435. .formInstanceId(String.valueOf(record.get("formInstanceId")))
  436. .updateFormDataJson(JSON.toJSONString(update))
  437. .build(), YDConf.FORM_OPERATION.update);
  438. }
  439. // 供应商原材料表
  440. List<Map> dataList2 = ydService.queryFormData_all(YDParam.builder()
  441. .formUuid("FORM-12EB6BCE3C264630824721E7BBABCC03L8U9")
  442. .build());
  443. for (Map record : dataList2) {
  444. double cost1 = UtilMap.getDouble(record, "numberField_llkknd6g");
  445. double cost2 = UtilMap.getDouble(record, "numberField_lpalgz05");
  446. if (cost1 == cost2) {
  447. continue;
  448. }
  449. Map update = UtilMap.map("numberField_llkknd6g", cost2);
  450. ydClient.operateData(YDParam.builder()
  451. .formInstanceId(String.valueOf(record.get("formInstanceId")))
  452. .updateFormDataJson(JSON.toJSONString(update))
  453. .build(), YDConf.FORM_OPERATION.update);
  454. }
  455. }
  456. @Override
  457. public List<Map<String, String>> getDiffMatchingSuppliers(String oldSupplierCode,String newSupplierCode) {
  458. List<Map<String,String>> diffList = new ArrayList<>();
  459. //获取旧供应商原材料信息
  460. List<Map> oldSupplierMaterials = getYdFormDataList(SUPPLIER_MATERIALS, JSON.toJSONString(UtilMap.map("textField_llzzbyj1", oldSupplierCode)), YDConf.FORM_QUERY.retrieve_list);
  461. List<Map<String,String>> oldSupplierMaterialsFormData = oldSupplierMaterials.stream()
  462. .map(item -> {
  463. Map<String, String> map = new HashMap<>();
  464. map.put("textField_lywr2qcq", String.valueOf(((Map) item.get("formData")).get("textField_llkb7kd1")));//物品名称
  465. map.put("textField_lyxr5c44", String.valueOf(((Map) item.get("formData")).get("textField_llkb7kd2")));//物品编号
  466. map.put("textField_lyxr5c46", String.valueOf(((Map) item.get("formData")).get("textField_llkb7kd4")));//物品规格
  467. return map;
  468. }).collect(Collectors.toList());
  469. //按物品名称进行分组
  470. Map<String, List<Map<String, String>>> groupOldSupplierMaterials = oldSupplierMaterialsFormData.stream()
  471. .collect(Collectors.groupingBy(map -> map.get("textField_lywr2qcq")));
  472. //物品名称重复的物品
  473. List<String> oldRepeatNames = new ArrayList<>();
  474. //物品名称未重复的物品
  475. List<String> oldNames = new ArrayList<>();
  476. groupOldSupplierMaterials.forEach((name, value) -> {
  477. if (value.size() > 1) {
  478. diffList.addAll(value);
  479. oldRepeatNames.add(name);
  480. }else {
  481. oldNames.add(name);
  482. }
  483. });
  484. //待匹配的物品
  485. oldSupplierMaterialsFormData = oldSupplierMaterialsFormData.stream().filter(item -> !oldRepeatNames.contains(item.get("name"))).collect(Collectors.toList());
  486. //获取新供应商原材料信息
  487. List<Map> newSupplierMaterials = getYdFormDataList(SUPPLIER_MATERIALS, JSON.toJSONString(UtilMap.map("textField_llzzbyj1", newSupplierCode)), YDConf.FORM_QUERY.retrieve_list);
  488. List<Map<String,String>> newSupplierMaterialsFormData = newSupplierMaterials.stream()
  489. .map(item -> {
  490. Map<String, String> map = new HashMap<>();
  491. map.put("textField_lywr2qcq", String.valueOf(((Map) item.get("formData")).get("textField_llkb7kd1")));//物品名称
  492. map.put("textField_lyxr5c44", String.valueOf(((Map) item.get("formData")).get("textField_llkb7kd2")));//物品编号
  493. map.put("textField_lyxr5c46", String.valueOf(((Map) item.get("formData")).get("textField_llkb7kd4")));//物品规格
  494. return map;
  495. }).collect(Collectors.toList());
  496. //按物品名称进行分组
  497. Map<String, List<Map<String, String>>> groupNewSupplierMaterials = newSupplierMaterialsFormData.stream()
  498. .collect(Collectors.groupingBy(map -> map.get("textField_lywr2qcq")));
  499. //物品名称重复的物品
  500. List<String> newRepeatNames = new ArrayList<>();
  501. //物品名称未重复的物品
  502. List<String> newNames = new ArrayList<>();
  503. groupNewSupplierMaterials.forEach((name, value) -> {
  504. if (value.size() > 1) {
  505. // diffList.addAll(value);
  506. newRepeatNames.add(name);
  507. }else {
  508. newNames.add(name);
  509. }
  510. });
  511. //待匹配的物品
  512. // newSupplierMaterialsFormData = newSupplierMaterialsFormData.stream().filter(item -> !newRepeatNames.contains(item.get("name"))).collect(Collectors.toList());
  513. List<String> matchNameList = new ArrayList<>();
  514. matchNameList.addAll(oldNames);
  515. matchNameList.retainAll(newNames);
  516. List<String> diffNameList = new ArrayList<>();
  517. diffNameList.addAll(oldNames);
  518. diffNameList.removeAll(newNames);
  519. // oldNames.removeAll(newNames);
  520. oldSupplierMaterialsFormData.forEach(item -> {
  521. if (diffNameList.contains(item.get("textField_lywr2qcq"))){
  522. diffList.add(item);
  523. }
  524. });
  525. return diffList;
  526. }
  527. @Override
  528. public List<Map<String, String>> getDiffMatchingSuppliers2(String projectCode,String oldSupplierCode, String newSupplierCode) {
  529. List<Map<String,String>> diffList = new ArrayList<>();
  530. //获取旧供应商定价单明细中间表
  531. List<Map> oldSupplierMaterials = getYdFormDataList(PRICE_DETAIL_MIDDLE, JSON.toJSONString(UtilMap.map("textField_llzzbyj1, textField_llm1vtjm", oldSupplierCode,projectCode)), YDConf.FORM_QUERY.retrieve_list);
  532. List<Map<String,String>> oldSupplierMaterialsFormData = oldSupplierMaterials.stream()
  533. .map(item -> {
  534. Map<String, String> map = new HashMap<>();
  535. map.put("textField_lywr2qcq", String.valueOf(((Map) item.get("formData")).get("textField_llkb7kd1")));//物品名称
  536. map.put("textField_lyxr5c44", String.valueOf(((Map) item.get("formData")).get("textField_llkb7kd2")));//物品编号
  537. map.put("textField_lyxr5c46", String.valueOf(((Map) item.get("formData")).get("textField_llkb7kd4")));//物品规格
  538. return map;
  539. }).collect(Collectors.toList());
  540. //按物品名称进行分组
  541. Map<String, List<Map<String, String>>> groupOldSupplierMaterials = oldSupplierMaterialsFormData.stream()
  542. .collect(Collectors.groupingBy(map -> map.get("textField_lywr2qcq")));
  543. //物品名称重复的物品
  544. List<String> oldRepeatNames = new ArrayList<>();
  545. //物品名称未重复的物品
  546. List<String> oldNames = new ArrayList<>();
  547. groupOldSupplierMaterials.forEach((name, value) -> {
  548. if (value.size() > 1) {
  549. diffList.addAll(value);
  550. oldRepeatNames.add(name);
  551. }else {
  552. oldNames.add(name);
  553. }
  554. });
  555. //待匹配的物品
  556. oldSupplierMaterialsFormData = oldSupplierMaterialsFormData.stream().filter(item -> !oldRepeatNames.contains(item.get("name"))).collect(Collectors.toList());
  557. //获取新供应商原材料信息
  558. List<Map> newSupplierMaterials = getYdFormDataList(SUPPLIER_MATERIALS, JSON.toJSONString(UtilMap.map("textField_llzzbyj1", newSupplierCode)), YDConf.FORM_QUERY.retrieve_list);
  559. List<Map<String,String>> newSupplierMaterialsFormData = newSupplierMaterials.stream()
  560. .map(item -> {
  561. Map<String, String> map = new HashMap<>();
  562. map.put("textField_lywr2qcq", String.valueOf(((Map) item.get("formData")).get("textField_llkb7kd1")));//物品名称
  563. map.put("textField_lyxr5c44", String.valueOf(((Map) item.get("formData")).get("textField_llkb7kd2")));//物品编号
  564. map.put("textField_lyxr5c46", String.valueOf(((Map) item.get("formData")).get("textField_llkb7kd4")));//物品规格
  565. return map;
  566. }).collect(Collectors.toList());
  567. //按物品名称进行分组
  568. Map<String, List<Map<String, String>>> groupNewSupplierMaterials = newSupplierMaterialsFormData.stream()
  569. .collect(Collectors.groupingBy(map -> map.get("textField_lywr2qcq")));
  570. //物品名称重复的物品
  571. List<String> newRepeatNames = new ArrayList<>();
  572. //物品名称未重复的物品
  573. List<String> newNames = new ArrayList<>();
  574. groupNewSupplierMaterials.forEach((name, value) -> {
  575. if (value.size() > 1) {
  576. // diffList.addAll(value);
  577. newRepeatNames.add(name);
  578. }else {
  579. newNames.add(name);
  580. }
  581. });
  582. //待匹配的物品
  583. // newSupplierMaterialsFormData = newSupplierMaterialsFormData.stream().filter(item -> !newRepeatNames.contains(item.get("name"))).collect(Collectors.toList());
  584. List<String> matchNameList = new ArrayList<>();
  585. matchNameList.addAll(oldNames);
  586. matchNameList.retainAll(newNames);
  587. List<String> diffNameList = new ArrayList<>();
  588. diffNameList.addAll(oldNames);
  589. diffNameList.removeAll(newNames);
  590. // oldNames.removeAll(newNames);
  591. oldSupplierMaterialsFormData.forEach(item -> {
  592. if (diffNameList.contains(item.get("textField_lywr2qcq"))){
  593. diffList.add(item);
  594. }
  595. });
  596. return diffList;
  597. }
  598. private List<Map> getYdFormDataList(String formUuid, String searchCondition, YDConf.FORM_QUERY formQuery) {
  599. List<Map> list = new ArrayList<>();
  600. DDR_New ddrNew;
  601. int pageNumber = 1;
  602. int pageSize = 100;
  603. do {
  604. ddrNew = ydClient.queryData(YDParam.builder().formUuid(formUuid)
  605. .searchCondition(searchCondition)
  606. .pageNumber(pageNumber)
  607. .pageSize(pageSize).build(), formQuery);
  608. list.addAll((List<Map>) ddrNew.getData());
  609. pageNumber++;
  610. }while (ddrNew.getTotalCount() > ddrNew.getPageNumber() * pageSize);
  611. return list;
  612. }
  613. private List<Map> getYdInnerTableList(String formUuid,String formInstId,String tableFieldId) {
  614. List<Map> list = new ArrayList<>();
  615. DDR_New ddrNew;
  616. int pageNumber = 1;
  617. int pageSize = 50;
  618. do {
  619. ddrNew = ydClient.queryData(YDParam.builder()
  620. .formUuid(formUuid)
  621. .formInstanceId(formInstId)
  622. .tableFieldId(tableFieldId)
  623. .pageNumber(pageNumber)
  624. .pageSize(pageSize).build(), YDConf.FORM_QUERY.retrieve_details);
  625. list.addAll((List<Map>) ddrNew.getData());
  626. pageNumber++;
  627. }while (ddrNew.getTotalCount() > ddrNew.getPageNumber() * pageSize);
  628. return list;
  629. }
  630. @Async
  631. @Override
  632. public void updateSuppliers(String formInstId) {
  633. //获取当前时间戳
  634. long beginTimestamp = System.currentTimeMillis();
  635. log.info("开始更新定价单供应商:{}",DateUtil.format(new Date(beginTimestamp), "yyyy-MM-dd HH:mm:ss"));
  636. //查询定价单供应商变更实例
  637. DDR_New ddrNew = ydClient.queryData(YDParam.builder()
  638. .formInstanceId(formInstId).build(), YDConf.FORM_QUERY.retrieve_id);
  639. String userId = ((Map) ddrNew.getOriginator()).get("userId").toString();
  640. Map formData = ddrNew.getFormData();
  641. String oldSupplierCode = String.valueOf(formData.get("textField_lv3w1k1l"));//旧供应商编号
  642. String newSupplierCode = String.valueOf(formData.get("textField_llzzbai8"));//新供应商编号
  643. String newSupplierName = String.valueOf(formData.get("textField_lmsli3bq"));//新供应商名称
  644. String jsonString = formData.get("associationFormField_llkb7kct_id").toString();
  645. String supplierJsonString = StringEscapeUtils.unescapeJava(jsonString.substring(1, jsonString.length() - 1));//新供应商(关联表单)
  646. List<Map> supplier =(List<Map>) JSONArray.parse(supplierJsonString);
  647. String jsonString2 = formData.get("associationFormField_llkb7kcs_id").toString();
  648. String orderJsonString = StringEscapeUtils.unescapeJava(jsonString2.substring(1, jsonString2.length() - 1));//定价单(关联表单)
  649. List<Map> order =(List<Map>) JSONArray.parse(orderJsonString);
  650. String projectCode = String.valueOf(formData.get("textField_lllovku7"));//定价单编号
  651. //新供应商未匹配原材料编号
  652. // List<String> newDiffSupplierMaterialCodes = new ArrayList<>();
  653. //新供应商匹配原材料编号
  654. List<String> newMatchSupplierMaterialCodes = new ArrayList<>();
  655. //新供应商匹配原材料名称
  656. List<String> newMatchSupplierMaterialNames = new ArrayList<>();
  657. //老供应商未匹配原材料编号
  658. List<String> oldNotMatchSupplierMaterialCodes = new ArrayList<>();
  659. //老供应商匹配原材料编号
  660. List<String> oldMatchSupplierMaterialCodes = new ArrayList<>();
  661. //校验新供应商原材料是否存在
  662. List<Map> newSupplierMaterials = getYdFormDataList(SUPPLIER_MATERIALS, JSON.toJSONString(UtilMap.map("textField_llzzbyj1", newSupplierCode)), YDConf.FORM_QUERY.retrieve_list);
  663. List<String> newSupplierMaterialCodes = newSupplierMaterials.stream()
  664. .map(item -> String.valueOf(((Map)item.get("formData")).get("textField_llkb7kd2")))
  665. .collect(Collectors.toList());
  666. //获取差异子表所有数据(可能超过50条)
  667. List<Map> diffList = getYdInnerTableList(SUPPLIER_CHANGE, formInstId, "tableField_lywr2qcp");
  668. // List<Map> diffList = (List<Map>) formData.get("tableField_lywr2qcp");
  669. for (Map diff : diffList) {
  670. String oldCode = String.valueOf(diff.get("textField_lyxr5c44"));//老供应商原材料编号
  671. String newCode = String.valueOf(diff.get("textField_lywr2qcv"));//新供应商原材料编号
  672. String newName = String.valueOf(diff.get("textField_lz70gmob"));//新供应商原材料名称
  673. //选择新供应商原材料且新供应商原材料编号存在
  674. if ((Objects.nonNull(diff.get("associationFormField_lywr2qcr_id")) && newSupplierMaterialCodes.contains(newCode))){
  675. oldMatchSupplierMaterialCodes.add(oldCode);
  676. newMatchSupplierMaterialCodes.add(newCode);
  677. newMatchSupplierMaterialNames.add(newName);
  678. }
  679. //未选择新供应商原材料
  680. if (Objects.isNull(diff.get("associationFormField_lywr2qcr_id"))){
  681. oldNotMatchSupplierMaterialCodes.add(oldCode);
  682. // newDiffSupplierMaterialCodes.add(newCode);
  683. }
  684. }
  685. //校验已选择的新供应商原材料编号是否重复
  686. HashSet<String> set = new HashSet<>(newMatchSupplierMaterialCodes);
  687. if (set.size() != newMatchSupplierMaterialCodes.size()){
  688. log.info("新供应商原材料编号存在重复!");
  689. return;
  690. }
  691. /*for (Map diff : diffList) {
  692. String oldCode = String.valueOf(diff.get("textField_lyxr5c44"));//老供应商原材料编号
  693. String newCode = String.valueOf(diff.get("textField_lywr2qcv"));//新供应商原材料编号
  694. if (!newMatchSupplierMaterialCodes.contains(newCode)){
  695. //查询旧供应商原材料信息
  696. List<Map> data = (List<Map>) ydClient.queryData(YDParam.builder()
  697. .formUuid(SUPPLIER_MATERIALS)
  698. .searchCondition(JSON.toJSONString(UtilMap.map("textField_llkb7kd2, textField_llzzbyj1", oldCode, oldSupplierCode)))
  699. .build(), YDConf.FORM_QUERY.retrieve_list).getData();
  700. //复制旧供应商原材料信息到新供应商
  701. if (Objects.nonNull(data) && !data.isEmpty()){
  702. Map diffFormData = (Map) data.get(0).get("formData");
  703. diffFormData.put("associationFormField_lphya7cq",supplierJsonString);//供应商(关联表单)
  704. diffFormData.put("textField_llzzbyj1", newSupplierCode);//供应商编号
  705. diffFormData.put("textField_lmsli3bq", newSupplierName);//供应商名称
  706. diffFormData.put("textField_llkb7kd2", newCode);//物品编号
  707. ydClient.operateData(YDParam.builder().formUuid(SUPPLIER_MATERIALS)
  708. .formDataJson(JSON.toJSONString(diffFormData)).build(), YDConf.FORM_OPERATION.create);
  709. }
  710. }
  711. }*/
  712. //未匹配上的原材料
  713. // List<String> notMatchCodes = new ArrayList<>();
  714. //获取旧供应商定价单明细中间表
  715. List<Map> oldSupplierMaterials = getYdFormDataList(PRICE_DETAIL_MIDDLE, JSON.toJSONString(UtilMap.map("textField_llzzbyj1, textField_llm1vtjm", oldSupplierCode,projectCode)), YDConf.FORM_QUERY.retrieve_list);
  716. //处理旧供应商定价单明细中间表
  717. handleOldSupplierPriceDetailMiddle(oldSupplierMaterials,newSupplierName,newSupplierCode,oldNotMatchSupplierMaterialCodes,oldMatchSupplierMaterialCodes,newMatchSupplierMaterialCodes,newMatchSupplierMaterialNames,newSupplierMaterials);
  718. //更新定价单
  719. String supplierInstanceId = supplier.get(0).get("instanceId").toString();
  720. Map supplierMap = ydClient.queryData(YDParam.builder()
  721. .formInstId(supplierInstanceId).build(), YDConf.FORM_QUERY.retrieve_id).getFormData();
  722. List<Map> employee = (List<Map>) supplierMap.get("employeeField_lllodwha_id");
  723. String orderInstanceId = order.get(0).get("instanceId").toString();
  724. Map updateFormData = new HashMap<>();
  725. updateFormData.put("associationFormField_llkb7kct",supplierJsonString);//供应商(关联表单)
  726. updateFormData.put("textField_llzzbai8", newSupplierCode);//供应商编号
  727. updateFormData.put("textField_lmsli3bq", newSupplierName);//供应商名称
  728. updateFormData.put("textField_lv3w1k1l", oldSupplierCode);//历史供应商编号
  729. updateFormData.put("employeeField_lmsli3br", employee);//供应商负责人
  730. ydClient.operateData(YDParam.builder()
  731. .formInstId(orderInstanceId)
  732. .updateFormDataJson(JSON.toJSONString(updateFormData))
  733. .build(), YDConf.FORM_OPERATION.update);
  734. //更新菜品
  735. List<Map> data = (List<Map>) ydClient.queryData(YDParam.builder()
  736. .formUuid(FOOD)
  737. .searchCondition(JSON.toJSONString(UtilMap.map("textField_lln3lmn1", projectCode)))
  738. .build(), YDConf.FORM_QUERY.retrieve_list_all).getData();
  739. for (Map datum : data) {
  740. //获取菜品管理信息
  741. Map foodFormData = (Map) datum.get("formData");
  742. List<Map> materialList = (List<Map>) foodFormData.get("tableField_llm1i9yy");
  743. List<String> errorCodes = new ArrayList<>();
  744. // Map foodFormData = ydClient.queryData(YDParam.builder().formInstanceId(formInstId).build(), YDConf.FORM_QUERY.retrieve_id).getFormData();
  745. // List<Map> materialList = (List<Map>) foodFormData.get("tableField_llm1i9yy");
  746. for (Map material : materialList) {
  747. String code = material.get("textField_lmk94yf5").toString();
  748. //如果明细被删除
  749. if (oldNotMatchSupplierMaterialCodes.contains(code)){
  750. errorCodes.add(code);
  751. continue;
  752. }
  753. String jsonString3 = material.get("associationFormField_lln3lmmv_id").toString();
  754. String materialJsonString = StringEscapeUtils.unescapeJava(jsonString3.substring(1, jsonString3.length() - 1));//新供应商原材料(关联表单)
  755. Map materialMap =(((List<Map>) JSONArray.parse(materialJsonString))).get(0);
  756. String instanceId = materialMap.get("instanceId").toString();
  757. //获取定价单明细中间表信息
  758. Map formData1 = ydClient.queryData(YDParam.builder().formInstanceId(instanceId).build(), YDConf.FORM_QUERY.retrieve_id).getFormData();
  759. materialMap.put("title",formData1.get("textField_llkb7kd1").toString());
  760. materialMap.put("subTitle",formData1.get("textField_lmkfg67e"));
  761. List<Map> list = new ArrayList<>();
  762. list.add(materialMap);
  763. material.put("associationFormField_lln3lmmv",list);//原材料(关联表单)
  764. material.put("textField_lln3lmn2",formData1.get("textField_llkb7kd3"));//单位
  765. material.put("textField_llyy3khw",formData1.get("textField_lmkfg67e"));//品牌
  766. material.put("textField_lz0ve9ct",formData1.get("textField_llkb7kd4"));//规格
  767. material.put("numberField_lnrzzg03",formData1.get("numberField_lnrzzg03"));//整包装数量
  768. material.put("textField_lnrzzg04",formData1.get("textField_lnrzzg04"));//整包装单位
  769. material.put("textField_llndm599",formData1.get("textField_llkb7kd1"));//原材料名称
  770. material.put("textField_lmk94yf5",formData1.get("textField_llkb7kd2"));//原材料编号
  771. material.put("selectField_lmqclyx9",formData1.get("selectField_llkb7kd5"));//第一分类
  772. material.put("numberField_lmqclyxa",formData1.get("numberField_llkknd6h"));//供货价
  773. material.put("numberField_lmsvffts",formData1.get("numberField_llkknd6g"));//成本单价
  774. material.put("numberField_lmsvfftt",formData1.get("numberField_llkb7kcy"));//服务费率
  775. }
  776. if (!errorCodes.isEmpty()){
  777. foodFormData.put("selectField_lzaq9r7i","异常");
  778. foodFormData.put("textField_lzaq9r7n",String.join(",",errorCodes));
  779. }
  780. foodFormData.put("tableField_llm1i9yy",materialList);
  781. ydClient.operateData(YDParam.builder()
  782. .formInstanceId(formInstId)
  783. .updateFormDataJson(JSON.toJSONString(foodFormData))
  784. .build(), YDConf.FORM_OPERATION.update);
  785. /*for (Map material : materialList) {
  786. String code = material.get("textField_lmk94yf5").toString();//老供应商原材料编号
  787. if (changeCodeMap.containsKey(code)){
  788. material.put("textField_lmk94yf5", changeCodeMap.get(code));//新供应商原材料编号
  789. }
  790. }
  791. foodFormData.put("tableField_llm1i9yy",materialList);
  792. ydClient.operateData(YDParam.builder()
  793. .formInstanceId(datum.get("formInstanceId").toString())
  794. .updateFormDataJson(JSON.toJSONString(foodFormData))
  795. .build(),YDConf.FORM_OPERATION.update);*/
  796. }
  797. long endTimestamp = System.currentTimeMillis();
  798. log.info("更新供应商结束:{}",DateUtil.format(new Date(endTimestamp), "yyyy-MM-dd HH:mm:ss"));
  799. log.info("耗时:{}秒",(endTimestamp - beginTimestamp)/1000);
  800. //发送工作通知给发起人
  801. if (Objects.nonNull(userId)){
  802. Map param2 = new HashMap();
  803. param2.put("access_token",ddClient.getAccessToken("dingtydw7atg0yzh2trz","x47ctlj-H4frFAcJbWQ0jz8rBlvKp4BmSML3nXYgB99Br2MrVQsV6RGUxHBTN-m7"));
  804. Map body3 = new HashMap();
  805. body3.put("agent_id","3205833281");
  806. body3.put("userid_list",userId);
  807. Map msg = new HashMap();
  808. msg.put("msgtype","text");
  809. //获取当前时间 精确到秒
  810. String time = DateUtil.format(new Date(),"yyyy-MM-dd HH:mm:ss");
  811. msg.put("text",UtilMap.map("content","定价单供应商变更完成,时间:" + time + ",耗时:" + (endTimestamp - beginTimestamp)/1000 + "秒"));
  812. body3.put("msg",msg);
  813. String s = UtilHttp.doPost("https://oapi.dingtalk.com/topapi/message/corpconversation/asyncsend_v2", null, param2, body3);
  814. log.info("发送工作通知给发起人:{}",s);
  815. }
  816. }
  817. //处理旧供应商定价单中间表
  818. private void handleOldSupplierPriceDetailMiddle(List<Map> oldSupplierMaterials,String newSupplierName, String newSupplierCode,
  819. List<String> oldNotMatchSupplierMaterialCodes,List<String> oldMatchSupplierMaterialCodes,
  820. List<String> newMatchSupplierMaterialCodes,List<String> newMatchSupplierMaterialNames,
  821. List<Map> newSupplierMaterials) {
  822. int maxAttempts = 5; // 尝试的最大次数
  823. int attempt = 0;
  824. for (Map oldSupplierMaterial : oldSupplierMaterials) {
  825. boolean success = false;
  826. attempt = 0; // 重置当前迭代的尝试次数
  827. Map oldSupplierMaterialFormData = (Map) oldSupplierMaterial.get("formData");
  828. String code = String.valueOf(oldSupplierMaterialFormData.get("textField_llkb7kd2"));
  829. String name = String.valueOf(oldSupplierMaterialFormData.get("textField_llkb7kd1"));
  830. String formInstanceId = String.valueOf(oldSupplierMaterial.get("formInstanceId"));
  831. String newCode = "";
  832. //更新定价单明细中间表
  833. oldSupplierMaterialFormData.put("textField_lmsli3bq", newSupplierName);//供应商名称
  834. oldSupplierMaterialFormData.put("textField_llzzbyj1", newSupplierCode);//供应商编号
  835. while (!success && attempt < maxAttempts){
  836. try {
  837. int index1 = oldNotMatchSupplierMaterialCodes.indexOf(code);
  838. int index2 = oldMatchSupplierMaterialCodes.indexOf(code);
  839. //未匹配上的原材料 将明细删除
  840. if (index1 != -1){
  841. /*ydClient.operateData(YDParam.builder().formUuid(PRICE_DETAIL_MIDDLE)
  842. .formInstanceId(formInstanceId)
  843. .updateFormDataJson(JSON.toJSONString(UtilMap.map("textField_lm4lxur8","已停用"))).build(), YDConf.FORM_OPERATION.update);*/
  844. ydClient.operateData(YDParam.builder().formUuid(PRICE_DETAIL_MIDDLE)
  845. .formInstanceId(formInstanceId)
  846. .build(), YDConf.FORM_OPERATION.delete);
  847. }else if (index2 != -1){
  848. //手动匹配上的原材料
  849. newCode = newMatchSupplierMaterialCodes.get(index2);
  850. oldSupplierMaterialFormData.put("textField_llkb7kd2", newCode);//物品编号
  851. oldSupplierMaterialFormData.put("textField_llkb7kd1",newMatchSupplierMaterialNames.get(index2));//物品名称
  852. ydClient.operateData(YDParam.builder().formUuid(PRICE_DETAIL_MIDDLE)
  853. .formInstanceId(formInstanceId)
  854. .updateFormDataJson(JSON.toJSONString(oldSupplierMaterialFormData)).build(), YDConf.FORM_OPERATION.update);
  855. }else {
  856. //自动匹配上的原材料
  857. for (Map newSupplierMaterial : newSupplierMaterials) {
  858. Map newSupplierMaterialFormData = (Map) newSupplierMaterial.get("formData");
  859. if (String.valueOf(newSupplierMaterialFormData.get("textField_llkb7kd1")).equals(name)){
  860. newCode = newSupplierMaterialFormData.get("textField_llkb7kd2").toString();
  861. oldSupplierMaterialFormData.put("textField_llkb7kd2", newCode);//物品编号
  862. ydClient.operateData(YDParam.builder().formUuid(PRICE_DETAIL_MIDDLE)
  863. .formInstanceId(formInstanceId)
  864. .updateFormDataJson(JSON.toJSONString(oldSupplierMaterialFormData)).build(), YDConf.FORM_OPERATION.update);
  865. break;
  866. }
  867. }
  868. }
  869. success = true;
  870. }catch (McException e){
  871. if (e.getMessage().equals("The request has failed due to a temporary failure of the server.")){
  872. attempt++;
  873. // 线程睡眠3秒
  874. try {
  875. Thread.sleep(3000);
  876. } catch (InterruptedException ie) {
  877. Thread.currentThread().interrupt(); // 重新设置中断状态
  878. System.err.println("Sleep interrupted: " + ie.getMessage());
  879. }
  880. }
  881. }catch (Exception e){
  882. log.error("处理旧供应商定价单中间表失败,实例id:{},物料名称:{},物料编号:{},异常信息:{}", formInstanceId, name,code, e.getMessage());
  883. success = true;
  884. }
  885. }
  886. if (!success) {
  887. // 如果达到最大尝试次数后仍未成功,可以选择退出循环或做其他处理
  888. log.info("处理旧供应商定价单中间表失败,实例id:{},物料名称:{},物料编号:{},尝试次数:{}", formInstanceId, name,code, attempt);
  889. }
  890. }
  891. }
  892. }