EastarTbServiceImpl.java 38 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643
  1. package com.malk.eastar.service.impl;
  2. import cn.hutool.core.date.DateUtil;
  3. import com.alibaba.fastjson.JSONObject;
  4. import com.malk.eastar.conf.EastarParam;
  5. import com.malk.eastar.service.EastarTbService;
  6. import com.malk.eastar.util.ConfigDataProcessor;
  7. import com.malk.server.aliwork.YDConf;
  8. import com.malk.server.aliwork.YDParam;
  9. import com.malk.server.aliwork.YDSearch;
  10. import com.malk.server.common.McException;
  11. import com.malk.server.teambition.TBConf;
  12. import com.malk.service.aliwork.YDClient;
  13. import com.malk.service.aliwork.YDService;
  14. import com.malk.service.teambition.TBClient_Project;
  15. import com.malk.service.teambition.TBClient_Task;
  16. import com.malk.service.teambition.TBClient_User;
  17. import com.malk.utils.PublicUtil;
  18. import com.malk.utils.UtilMap;
  19. import lombok.extern.slf4j.Slf4j;
  20. import org.apache.commons.lang3.StringUtils;
  21. import org.springframework.beans.factory.annotation.Autowired;
  22. import org.springframework.stereotype.Service;
  23. import java.util.*;
  24. import java.util.stream.Collectors;
  25. import static com.malk.eastar.conf.EastarParam.TFNAME_YDKEY;
  26. @Slf4j
  27. @Service
  28. public class EastarTbServiceImpl implements EastarTbService {
  29. @Autowired
  30. private TBClient_Project tbProject;
  31. @Autowired
  32. private TBClient_Task tbTask;
  33. @Autowired
  34. private TBClient_User tbUser;
  35. @Autowired
  36. private TBConf tbConf;
  37. @Autowired
  38. private YDClient ydClient;
  39. @Autowired
  40. private YDService ydService;
  41. @Override
  42. public Map createProject(String projectCode, String templateId, String tbProjectId) {
  43. if(PublicUtil.isNull(tbProjectId)){
  44. Map result = tbProject.projectCreateWithTemplate(projectCode, templateId, tbConf.getOperatorId());
  45. tbProjectId = UtilMap.getString(result, "id");
  46. }
  47. return UtilMap.map("tbProjectId",tbProjectId);
  48. }
  49. private String creatMainProjectTask(String pId,String name,String id,List<Map> table,String executorId,List mainProjectcustomfields){
  50. Map taskMap = new HashMap();
  51. taskMap.put("content",name+"-"+id);
  52. taskMap.put("projectId",EastarParam.TB_MAINPROJECT_ID);
  53. taskMap.put("executorId",executorId); // 通过供应商确定执行人
  54. taskMap.put("customfields",mainProjectcustomfields);
  55. taskMap.put("startDate", DateUtil.format(new Date(UtilMap.getLong(table.get(0),"dateField_mgu5rm3g")),"yyyy-MM-dd"));
  56. taskMap.put("dueDate", DateUtil.format(new Date(UtilMap.getLong(table.get(table.size()-1),"dateField_mgu5rm3h")),"yyyy-MM-dd"));
  57. Map result=createTask(taskMap);
  58. for (Map map:table){
  59. Map son=new HashMap();
  60. son.put("content",name+"-"+id+"-"+map.get("textField_mgu5rm3f"));
  61. son.put("projectId",EastarParam.TB_MAINPROJECT_ID);
  62. son.put("executorId",executorId); // 通过供应商确定执行人
  63. son.put("parentTaskId",result.get("taskId"));
  64. son.put("startDate", DateUtil.format(new Date(UtilMap.getLong(map,"dateField_mgu5rm3g")),"yyyy-MM-dd"));
  65. son.put("dueDate", DateUtil.format(new Date(UtilMap.getLong(map,"dateField_mgu5rm3h")),"yyyy-MM-dd"));
  66. son.put("customfields",mainProjectcustomfields);
  67. Map sonResult=createTask( son);
  68. }
  69. return UtilMap.getString(result, "taskId");
  70. }
  71. private Map createTask(Map map){
  72. try {
  73. return tbTask.createTask(tbConf.getOperatorId(), map);
  74. }catch (McException e){
  75. if(e.getMessage().equals("截止时间必须晚于开始时间")||e.getMessage().equals("The end time should not be earlier than the start time.")){
  76. map.remove("startDate");
  77. return createTask(map);
  78. }else {
  79. throw e;
  80. }
  81. }
  82. }
  83. @Override
  84. public Map createTask(String formInstId) {
  85. // 查询立项数据
  86. Map data=ydClient.queryData(YDParam.builder().formInstId(formInstId).build(), YDConf.FORM_QUERY.retrieve_id).getFormData();
  87. String merName= UtilMap.getString(data,"textField_me87x1o0");// 客户名称
  88. String pMainName= UtilMap.getString(data,"textField_me9n24kq"); // 主项目名称
  89. String pMainId= UtilMap.getString(data,"textField_me2hyldb");// 主项目编号
  90. String pName= UtilMap.getString(data,"textField_me87x1nz"); // 项目名称
  91. String pId= UtilMap.getString(data,"textField_me2hyldc");// 项目编号
  92. String orderType= UtilMap.getString(data,"selectField_mdf997wp"); // 订单类型 大货 打样
  93. // String pTaskType= UtilMap.getAssFieldValue(data,"associationFormField_me9n24kk_id").get(0).title; // 项目任务类型
  94. String pTaskType = UtilMap.getString(data,"textField_mfqnsa9d");// 项目任务类型
  95. // 查询记录判断是否创建过看板
  96. List<Map> recodList = (List<Map>) ydClient.queryData(YDParam.builder().formUuid(EastarParam.YD_FORMUUID_RECOD).searchCondition(
  97. JSONObject.toJSONString(Arrays.asList(new YDSearch("textField_me2hyldb",pMainId,"主项目编号", YDSearch.Type.TEXT_FIELD,YDSearch.Operator.EQ)))
  98. ).build(), YDConf.FORM_QUERY.retrieve_list).getData();
  99. // 成员处理
  100. List<String> pmUserId = (List<String>) UtilMap.getList(data, "employeeField_me2hyld8_id");// 项目经理
  101. List<String> ssUserId = (List<String>) UtilMap.getList(data, "employeeField_me2hyld9_id");// 业务
  102. List<String> qeUserId = (List<String>) UtilMap.getList(data, "employeeField_me9n24ka_id");// QE
  103. pmUserId=tbUser.getUserIds(pmUserId, false);
  104. ssUserId=tbUser.getUserIds(ssUserId, false);
  105. List<String> programUsers=new ArrayList<>();
  106. programUsers.addAll(pmUserId);
  107. programUsers.addAll(ssUserId);
  108. programUsers.remove(tbConf.getOperatorId());
  109. Set<String> programUsersSet = new HashSet<>(programUsers);
  110. programUsers = new ArrayList<>(programUsersSet);
  111. // 项目创建
  112. String tbProjectId;
  113. if(recodList == null || recodList.size()<1){
  114. Map result = tbProject.projectCreateWithTemplate(pMainName, EastarParam.TB_PROJECT_TEMP, tbConf.getOperatorId());
  115. tbProjectId = UtilMap.getString(result, "id");
  116. // 同步项目集
  117. List<Map> programList = tbProject.queryProgramList("", merName);
  118. String programId = "";
  119. if (programList.size() > 0) {
  120. programId=UtilMap.getString(programList.get(0), "id");
  121. }else{
  122. Map program=tbProject.createProgramList(merName,"");
  123. programId=UtilMap.getString(program,"id");
  124. }
  125. tbProject.upsertProgramProject(programId, Arrays.asList(tbProjectId), tbConf.getOperatorId());
  126. tbProject.createProgramMember(programId,tbConf.getOperatorId(),programUsers);
  127. }else {
  128. tbProjectId = UtilMap.getString(UtilMap.getMap(recodList.get(0),"formData"),"textField_mecmytpo");
  129. }
  130. // 订单数据
  131. List<UtilMap.assDetail> projectOrder=UtilMap.getAssFieldValue(data,"associationFormField_me2hylda_id");
  132. String orderFid= projectOrder.get(0).instanceId; // 项目任务类型
  133. Map orderData=ydClient.queryData(YDParam.builder().formInstId(orderFid).build(), YDConf.FORM_QUERY.retrieve_id).getFormData();
  134. List<Map> orderLangConf=UtilMap.getList(orderData,"tableField_meqqj4we");// 语言配置
  135. List<Map> xlConf=UtilMap.getList(orderData,"tableField_mesc7nvj");// 系列源配置
  136. // 子任务拆分数据
  137. List<Map> sonConfData= ydService.queryDetails(YDParam.builder().formInstanceId("FINST-X1B66Y81IUFY9U417XIUE99I8YV93HGMJ8WEMF").formUuid(EastarParam.YD_FORMUUID_SONCONF).tableFieldId("tableField_mew7d9f3").build());// 全品类配件表
  138. Map<String,Map<String,List<String>>> sonConf= ConfigDataProcessor.processConfigData(sonConfData);
  139. List<Map> skuTypeListConfigData = ydService.queryAllFormData(YDParam.builder().formUuid(EastarParam.YD_FORMUUID_SKU_TYPE).build());
  140. Map skuIdMap=ConfigDataProcessor.skuTypeListConfigData(skuTypeListConfigData);
  141. // 成员处理
  142. qeUserId=tbUser.getUserIds(qeUserId, false);
  143. List<Map> mchTable= UtilMap.getList(data,"tableField_mec6juik");// 跟单
  144. List<String> mchList=new ArrayList<>();
  145. Map<String,String> mchMap=new HashMap<>();
  146. Map<String,String> mchDDIdMap=new HashMap<>();
  147. Map<String,String> userIdMap=new HashMap<>();
  148. for (Map map:mchTable){
  149. String ddId=String.valueOf(UtilMap.getList(map,"employeeField_me9n24kl_id").get(0));
  150. if(!mchList.contains(ddId)){
  151. mchList.add(ddId);
  152. userIdMap.put(ddId,tbUser.getUserId(ddId,false));
  153. }
  154. mchMap.put(UtilMap.getString(map,"textField_mec6juil"),userIdMap.get(ddId));
  155. mchDDIdMap.put(UtilMap.getString(map,"textField_mec6juil"),ddId);
  156. }
  157. mchList=tbUser.getUserIds(mchList, false);
  158. mchList.remove(tbConf.getOperatorId());
  159. List<String> userList = new ArrayList<>();
  160. userList.addAll(pmUserId); // 添加 list1 的所有元素
  161. userList.addAll(ssUserId);
  162. userList.addAll(qeUserId);
  163. userList.addAll(mchList);
  164. Set<String> set = new HashSet<>(userList);
  165. userList = new ArrayList<>(set);
  166. tbProject.createProjectMember(tbProjectId, userList, tbConf.getOperatorId());
  167. if (!mchList.isEmpty()) {
  168. String roleId = _getProjectRoleId(tbProjectId, "跟单(MCH)");
  169. tbProject.updateProjectMember(mchList, Arrays.asList(roleId), tbProjectId);
  170. }
  171. if (!qeUserId.isEmpty()) {
  172. String roleId = _getProjectRoleId(tbProjectId, "质控(QE)");
  173. tbProject.updateProjectMember(qeUserId, Arrays.asList(roleId), tbProjectId);
  174. }
  175. // 指定项目经理为编辑权限
  176. if (!pmUserId.isEmpty()) {
  177. String roleId = _getProjectRoleId(tbProjectId, "项目拥有者");
  178. tbProject.updateProjectMember(pmUserId, Arrays.asList(roleId), tbProjectId);
  179. }
  180. String projectTaskId= UtilMap.getString(data,"textField_mgu73usl");// 大看板任务编号
  181. if(PublicUtil.isNull(projectTaskId)){
  182. // 创建任务及看板
  183. List mainProjectcustomfields=new ArrayList();
  184. mainProjectcustomfields.add(tbConf.assembleCustomFieldName("项目类型",orderType));
  185. mainProjectcustomfields.add(tbConf.assembleCustomFieldName("订单金额(美金)",UtilMap.getString(orderData,"numberField_mdy6ezcu")));
  186. // mainProjectcustomfields.add(tbConf.assembleCustomFieldName("产品类型",orderType));
  187. List<String> gcNameList=new ArrayList<>(mchMap.keySet()); // 工厂
  188. mainProjectcustomfields.add(tbConf.assembleCustomField("工厂",getCustFiledValueTitle(gcNameList)));
  189. mainProjectcustomfields.add(tbConf.assembleCustomFieldName("客户",merName));
  190. mainProjectcustomfields.add(tbConf.assembleCustomField("业务(Sales)",getCustFiledValueId(ssUserId)));
  191. mainProjectcustomfields.add(tbConf.assembleCustomField("跟单人",getCustFiledValueId(mchList)));
  192. mainProjectcustomfields.add(tbConf.assembleCustomField("品控(QE)",getCustFiledValueId(qeUserId)));
  193. mainProjectcustomfields.add(tbConf.assembleCustomFieldName("Project Name",UtilMap.getString(data,"textField_me9n24l0")));
  194. mainProjectcustomfields.add(tbConf.assembleCustomFieldName("客户分级",UtilMap.getString(data,"textField_mgokximj")));
  195. projectTaskId=creatMainProjectTask(tbProjectId,pName,pId,UtilMap.getList(data,"tableField_mgu5rm3e"),pmUserId.get(0),mainProjectcustomfields);
  196. ydClient.operateData(YDParam.builder().formInstanceId(formInstId)
  197. .updateFormDataJson(JSONObject.toJSONString(UtilMap.map("textField_mgu73usl",projectTaskId))).build(), YDConf.FORM_OPERATION.update);
  198. }
  199. // 任务公用字段
  200. List maincustomfields=new ArrayList();
  201. maincustomfields.add(tbConf.assembleCustomFieldName("项目编号",pId));
  202. maincustomfields.add(tbConf.assembleCustomFieldName("项目名称",pName));
  203. maincustomfields.add(tbConf.assembleCustomFieldName("产品阶段",orderType));
  204. maincustomfields.add(tbConf.assembleCustomFieldName("客户",merName));
  205. maincustomfields.add(tbConf.assembleCustomField("业务(Sales)",getCustFiledValueId(ssUserId)));
  206. maincustomfields.add(tbConf.assembleCustomField("项目经理(PM)",getCustFiledValueId(pmUserId)));
  207. maincustomfields.add(tbConf.assembleCustomField("品控(QE)",getCustFiledValueId(qeUserId)));
  208. maincustomfields.add(tbConf.assembleCustomFieldName("Project Name",UtilMap.getString(data,"textField_me9n24l0")));
  209. maincustomfields.add(tbConf.assembleCustomFieldName("客户分级",UtilMap.getString(data,"textField_mgokximj")));
  210. // 任务类型
  211. String scenariofieldconfigId=_getTaskType(tbProjectId,pTaskType);
  212. String sonScenariofieldconfigId=_getTaskType(tbProjectId,"配件-子任务");
  213. String tasklistId=_getTaskList(tbProjectId,orderType+"项目");
  214. String stageId= tbTask.queryTaskStage(tbProjectId,tasklistId,"启动阶段");
  215. // 全品类任务生成
  216. List<Map> table= ydService.queryDetails(YDParam.builder().formInstanceId(formInstId).formUuid(EastarParam.YD_FORMUUID_PROJECT).tableFieldId("tableField_mdy8x198").build());// 全品类配件表
  217. List<Map> recodTable = new ArrayList<>();
  218. List<String> jds=UtilMap.getList(data,"checkboxField_me9n37rs");
  219. Map<String,List<Map>> gysOrderData=new HashMap<>(); // 采购需求数据 按照供应商拆分BOM
  220. Map<String,String> seriesDevNumMap = new HashMap<>(); //系列与研发部订单需求数量映射数据 add by Jason 20260320
  221. String nameSeries; //系列 add by Jason 20260320
  222. String devNum; //研发部订单需求数量 add by Jason 20260320
  223. for(Map map:table){
  224. //获取系列与研发部订单需求数量映射 add by Jason 20260320 start
  225. nameSeries = UtilMap.getString(map,"selectField_me2f7tw4"); //系列
  226. devNum = UtilMap.getString(map,"numberField_mmke3fdc"); //研发部订单需求数量
  227. if(seriesDevNumMap.get(nameSeries) == null){
  228. seriesDevNumMap.put(nameSeries,devNum);
  229. }
  230. //获取系列与研发部订单需求数量映射 add by Jason 20260320 end
  231. Map taskMap=UtilMap.map("projectId, tasklistId, scenariofieldconfigId, stageId",tbProjectId,tasklistId,scenariofieldconfigId,stageId);
  232. taskMap.put("content",getValue(map,"selectField_me2f7tw4","-")+getValue(map,"textField_me2f7tvo","")); //系列 配件
  233. String gysName=UtilMap.getString(map,"textField_me2f7tvz");
  234. taskMap.put("executorId",mchMap.get(gysName)); // 通过供应商确定执行人
  235. List<Map> customfields=getCustomfields(EastarParam.CUSTFIELD_ACCE,map);
  236. customfields.addAll(maincustomfields);
  237. List<Map> result=null;
  238. boolean isLang="是".equals(UtilMap.getString(map,"radioField_me2f7tvx"));
  239. String type=UtilMap.getString(map,"selectField_me2f7tvk"); // 配件大类
  240. Map<String,List<String>> sonconfs=sonConf.get(type);
  241. List<String> sonconf=new ArrayList<>();
  242. if(sonconfs!=null&&sonconfs.size()>0){
  243. for(String str:jds){
  244. if(sonconfs.containsKey(str)){
  245. List<String> list=sonconfs.get(str);
  246. for (String s: list) {
  247. sonconf.add(type+" / "+s);
  248. }
  249. }
  250. }
  251. }
  252. if(isLang){ // 区分语言
  253. result=saveTbTask(taskMap,orderLangConf,map,customfields,isLang,sonconf,sonScenariofieldconfigId,gysName,pId,pMainId,skuIdMap);
  254. }else{
  255. result=saveTbTask(taskMap,orderLangConf,map,customfields,isLang,sonconf,sonScenariofieldconfigId,gysName,pId,pMainId,skuIdMap);
  256. }
  257. if(gysOrderData.containsKey(gysName)){
  258. gysOrderData.get(gysName).addAll(result);
  259. }else{
  260. gysOrderData.put(gysName,result);
  261. }
  262. recodTable.addAll(result);
  263. }
  264. saveRecod(data,tbProjectId,recodTable);
  265. List<Map> projectPlan=UtilMap.getList(data,"tableField_mgu5rm3e");// 项目计划
  266. List<String> jdList=Arrays.asList("白样", "产前样","大货样", "大货");
  267. Object demoValue = orderData.get("textField_me2f7tvd");
  268. // 项目阶段处理
  269. String numOfSets; //工厂采购数量 add by Jason 20260320
  270. int allSupplyNum; //总采购数量 add by Jason 20260320
  271. for(String jd:jds){
  272. System.out.println("项目阶段:"+jd);
  273. if(jdList.contains(jd)){
  274. long sevenDaysAgoTimestamp = 0;
  275. long planTimestamp = 0;
  276. for(Map stage:projectPlan){
  277. if(jd.equals(UtilMap.getString(stage,"textField_mgu5rm3f"))){
  278. sevenDaysAgoTimestamp = UtilMap.getLong(stage,"dateField_mgu5rm3h") - 7L * 24 * 60 * 60 * 1000;
  279. planTimestamp = UtilMap.getLong(stage,"dateField_mgu5rm3h");
  280. }
  281. }
  282. // 循环保存采购任务
  283. for (String key:gysOrderData.keySet()){
  284. List<Map> arr=gysOrderData.get(key);
  285. List<Map> modifiedList = new ArrayList<>();
  286. String procuremenType ="";
  287. String taskStatus ="";
  288. String taskType="";
  289. for (Map<String, Object> map : arr) {
  290. if("大货".equals(jd)){
  291. procuremenType ="配件采购";
  292. taskStatus ="待排期";
  293. taskType ="大货";
  294. //计算总采购数量 add by Jason 20260320 start
  295. numOfSets = map.get("numberField_mifp03el")==null?null:map.get("numberField_mifp03el").toString();
  296. devNum = map.get("numberField_mmmwu4cg")==null?null:map.get("numberField_mmmwu4cg").toString();
  297. allSupplyNum = 0;
  298. if(StringUtils.isNotEmpty(devNum) && StringUtils.isNotEmpty(numOfSets)){
  299. allSupplyNum = Integer.parseInt(devNum) + Integer.parseInt(numOfSets); //计算总采购数量
  300. }
  301. //计算总采购数量 add by Jason 20260320 end
  302. Map<String, Object> copiedMap = new HashMap<>(map); // 关键:创建副本
  303. copiedMap.put("numberField_mmmwu4ci",allSupplyNum); //总采购数量 add by Jason 20260320
  304. copiedMap.put("dateField_mizvc5oi", planTimestamp);
  305. modifiedList.add(copiedMap);
  306. } else{
  307. if("大货样".equals(jd)){
  308. taskStatus ="无需合同";
  309. }else{
  310. taskStatus ="待排期";
  311. }
  312. procuremenType ="样品任务";
  313. taskType ="打样";
  314. Map<String, Object> copiedMap = new HashMap<>(map); // 关键:创建副本
  315. copiedMap.put("dateField_mizvc5oi", planTimestamp);
  316. copiedMap.put("numberField_mkosp94h", demoValue);
  317. copiedMap.put("numberField_mifp03el", demoValue);
  318. copiedMap.put("numberField_mmmwu4cg",0); //研发部订单需求数量 add by Jason 20260320
  319. copiedMap.put("numberField_mmmwu4ci",demoValue); //总采购数量 add by Jason 20260320
  320. modifiedList.add(copiedMap);
  321. }
  322. }
  323. System.out.println("arr"+arr);
  324. Map order=UtilMap.map("textField_mifp03ew, selectField_mifp03e7, tableField_mifp03em, selectField_mkf6qv9b, dateField_mifp03eb, selectField_ml0l206x",tbProjectId,taskStatus,modifiedList,procuremenType,planTimestamp,taskType);
  325. order.put("associationFormField_mifp03e9",projectOrder);
  326. order.put("associationFormField_mifp03e8",UtilMap.getAssFieldValue(data,"associationFormField_mdy7w1wn_id")); // 项目
  327. order.put("textField_mifp03e6",pName+"-"+key+"-"+jd);
  328. order.put("textField_mimwnauk",pId);
  329. order.put("textField_mizs3841",pMainId);
  330. order.put("employeeField_mifp03eu",Arrays.asList(mchDDIdMap.get(key)));
  331. List<Map> gysList = (List<Map>) ydClient.queryData(YDParam.builder().formUuid(EastarParam.YD_FORMUUID_GYS_YW).searchCondition(
  332. JSONObject.toJSONString(Arrays.asList(new YDSearch("textField_mec6lku3",key,"供应商简称", YDSearch.Type.TEXT_FIELD,YDSearch.Operator.EQ)))
  333. ).build(), YDConf.FORM_QUERY.retrieve_list).getData();
  334. if(gysList!=null&&gysList.size()>0){
  335. List<UtilMap.assDetail> gys=UtilMap.getAssFieldValue(UtilMap.getMap(gysList.get(0),"formData"),"associationFormField_mec6lku4_id");
  336. order.put("associationFormField_mifp03ea",gys);
  337. order.put("textField_mifp03ez",gys.get(0).subTitle); // 供应商编号
  338. }
  339. order.put("textField_mmikzhlb",jd); //里程碑 add by Jason 20260309
  340. ydClient.operateData(YDParam.builder().formUuid(EastarParam.YD_FORMUUID_CGTASK).formDataJson(JSONObject.toJSONString(order)).build(), YDConf.FORM_OPERATION.create);
  341. }
  342. }
  343. }
  344. // 生成包装任务:打样不需要生成包装
  345. if("大货".equals(orderType)){
  346. //seriesDevNumMap 系列与研发部订单需求数量映射数据 add by Jason 20260320
  347. savePackTask(tbProjectId, orderLangConf, data, pName, pId, pMainId, projectOrder, mchDDIdMap, seriesDevNumMap);
  348. }
  349. //更新【制作新订单】子表单【语言版本 - 数量拆分】的总套数 add by Jason 20260320 start
  350. List<Map> orderSubDataLangNew = new ArrayList<>();
  351. int numOfSetsSeries; //套数
  352. int numOfSetsAll; //总套数
  353. for(Map orderSubRecordLang : orderLangConf){ //遍历子表单记录
  354. nameSeries = UtilMap.getString(orderSubRecordLang,"textField_meqqj4wa"); // 系列【语言版本 - 数量拆分】
  355. numOfSetsSeries = UtilMap.getInt(orderSubRecordLang,"numberField_meqqj4wd"); // 套数【语言版本 - 数量拆分】
  356. numOfSetsAll = 0;
  357. devNum = seriesDevNumMap.get(nameSeries);
  358. if(StringUtils.isNotEmpty(devNum)){
  359. numOfSetsAll = numOfSetsSeries + Integer.parseInt(devNum); // 总套数【语言版本 - 数量拆分】,总套数=套数+研发部订单数量,立项完成自动更新总套数
  360. }
  361. orderSubRecordLang.put("numberField_mmtymctd",numOfSetsAll);
  362. orderSubDataLangNew.add(orderSubRecordLang);
  363. }
  364. System.out.println("更新【制作新订单】数据:"+ JSONObject.toJSONString(orderSubDataLangNew));
  365. ydClient.operateData(
  366. YDParam.builder()
  367. .formInstId(orderFid)
  368. .updateFormDataJson(
  369. JSONObject.toJSONString(UtilMap.map("tableField_meqqj4we",orderSubDataLangNew))
  370. ).build(),
  371. YDConf.FORM_OPERATION.update
  372. );
  373. //更新【制作新订单】子表单【语言版本 - 数量拆分】的总套数 add by Jason 20260320 end
  374. return Collections.emptyMap();
  375. }
  376. // 生成包装任务
  377. //seriesDevNumMap 系列与研发部订单需求数量映射数据 add by Jason 20260320
  378. private List<Map> savePackTask(String tbProjectId, List <Map> orderLangConf,Map data,String pName,String pId,String pMainId,List projectOrder,Map mchDDIdMap,Map<String,String> seriesDevNumMap) {
  379. Map<String, List<Map>> packOrderData = new HashMap<>();
  380. String nameSeries; //系列 add by Jason 20260320
  381. String devNum; //研发部订单需求数量 add by Jason 20260320
  382. int allSupplyNum; //总采购数量 add by Jason 20260320
  383. for (Map orderMap : orderLangConf) {
  384. String supplier = UtilMap.getString(orderMap, "textField_mkp7yv76");
  385. String setsValue = UtilMap.getString(orderMap, "numberField_meqqj4wd");
  386. //计算总采购数量 add by Jason 20260320 start
  387. nameSeries = UtilMap.getString(orderMap, "textField_meqqj4wa"); //系列
  388. devNum = seriesDevNumMap.get(nameSeries);
  389. allSupplyNum = 0;
  390. if(StringUtils.isNotEmpty(devNum) && StringUtils.isNotEmpty(setsValue)){
  391. allSupplyNum = Integer.parseInt(devNum) + Integer.parseInt(setsValue); //计算总采购数量
  392. }
  393. //计算总采购数量 add by Jason 20260320 end
  394. Map packTask = UtilMap.map(
  395. "textField_mecmytpr, textField_mifp03eo, textField_mjr129o4, selectField_me2f7tw4, numberField_mkosp94h, numberField_mifp03el, " +
  396. "numberField_mmmwu4cg, " + //研发部订单需求数量 add by Jason 20260312
  397. "numberField_mmmwu4ci, ", //总采购数量 add by Jason 20260312
  398. UtilMap.getString(orderMap, "textField_mizmmf8k"),
  399. UtilMap.getString(orderMap, "textField_mizmmf8j"),
  400. UtilMap.getString(orderMap, "textField_meqqj4wb"),
  401. UtilMap.getString(orderMap, "textField_meqqj4wa"),
  402. setsValue,
  403. setsValue,
  404. devNum, //研发部订单需求数量 add by Jason 20260320
  405. allSupplyNum //总采购数量 add by Jason 20260320
  406. );
  407. packOrderData.computeIfAbsent(supplier, k -> new ArrayList<>()).add(packTask);
  408. }
  409. for (String key:packOrderData.keySet()){
  410. List<Map> packdetails=packOrderData.get(key);
  411. Map packTaskorder=UtilMap.map("textField_mifp03ew, selectField_mifp03e7, tableField_mifp03em, selectField_mkf6qv9b, selectField_ml0l206x",tbProjectId,"待排期",packdetails,"成品包装","包装");
  412. packTaskorder.put("associationFormField_mifp03e9",projectOrder);
  413. packTaskorder.put("associationFormField_mifp03e8",UtilMap.getAssFieldValue(data,"associationFormField_mdy7w1wn_id")); // 项目
  414. packTaskorder.put("textField_mifp03e6",pName+"-"+key+"-包装");
  415. packTaskorder.put("textField_mimwnauk",pId);
  416. packTaskorder.put("textField_mizs3841",pMainId);
  417. packTaskorder.put("employeeField_mifp03eu",Arrays.asList(mchDDIdMap.get(key)));
  418. List<Map> gysList = (List<Map>) ydClient.queryData(YDParam.builder().formUuid(EastarParam.YD_FORMUUID_GYS_YW).searchCondition(
  419. JSONObject.toJSONString(Arrays.asList(new YDSearch("textField_mec6lku3",key,"供应商简称", YDSearch.Type.TEXT_FIELD,YDSearch.Operator.EQ)))
  420. ).build(), YDConf.FORM_QUERY.retrieve_list).getData();
  421. if(gysList!=null&&gysList.size()>0){
  422. List<UtilMap.assDetail> gys=UtilMap.getAssFieldValue(UtilMap.getMap(gysList.get(0),"formData"),"associationFormField_mec6lku4_id");
  423. packTaskorder.put("associationFormField_mifp03ea",gys);
  424. packTaskorder.put("textField_mifp03ez",gys.get(0).subTitle); // 供应商编号
  425. }
  426. packTaskorder.put("textField_mmikzhlb","包装"); //里程碑 add by Jason 20260309
  427. ydClient.operateData(YDParam.builder().formUuid(EastarParam.YD_FORMUUID_CGTASK).formDataJson(JSONObject.toJSONString(packTaskorder)).build(), YDConf.FORM_OPERATION.create);
  428. }
  429. return null;
  430. }
  431. private String getValue(Map map,String key,String s){
  432. String value=UtilMap.getString(map,key);
  433. return value.length()==0?"":value+s;
  434. }
  435. private List<Map> saveTbTask(Map taskMap,List<Map> orderConf,Map cgDetail,List<Map> customfields,boolean isLang,List<String> sonconf,String sonScenariofieldconfigId,String gysName,String pId,String pMainId,Map skuIdMap){
  436. log.info("创建任务:{},是否区分语言{}",taskMap.get("content"),isLang);
  437. List<Map> recodTable=new ArrayList<>();
  438. if (PublicUtil.isNull(taskMap,"executorId")){
  439. taskMap.remove("executorId");
  440. }
  441. String rdNum; //研发部订单需求数量 add by Jason 20260312
  442. for(Map map: orderConf){
  443. Map tMap=new HashMap();
  444. tMap.putAll(taskMap);
  445. String confSeries=UtilMap.getString_first(map,"textField_meqqj4wa","textField_mesc7nvf");// 系列
  446. if(!UtilMap.getString(cgDetail,"selectField_me2f7tw4").equals(confSeries)){
  447. continue; // 系列不匹配
  448. }
  449. List<Map> newCustomfields=new ArrayList<>(customfields);
  450. String skuId=String.valueOf(skuIdMap.get(UtilMap.getString(cgDetail,"selectField_mizsccds")));
  451. String reportId =UtilMap.getString(cgDetail,"textField_me2f7tvn");// 文档编号
  452. skuId=PublicUtil.isNull(skuId)?"000":skuId;
  453. String sku="2"+skuId+UtilMap.getString_first(map,"textField_mizmmf8h","textField_mizmmf8m")+reportId.substring(reportId.length()-2);// sku 添加系列编号及文档编号
  454. String lang=UtilMap.getString(map,"textField_meqqj4wb"); // 语言
  455. if(isLang){
  456. if(PublicUtil.isNull(lang)){
  457. lang="不区分";
  458. sku=sku+"AL"; // sku 不区分语言
  459. }
  460. tMap.put("content",tMap.get("content")+"-"+lang);
  461. newCustomfields.add(tbConf.assembleCustomFieldName("语言",lang));
  462. sku=sku+UtilMap.getString(map,"textField_mizmmf8i"); // sku 区分语言
  463. }else{
  464. lang ="不区分";
  465. sku=sku+"AL"; // sku 不区分语言
  466. }
  467. sku=sku+pMainId.substring(pMainId.length()-10); // sku 添加项目号
  468. String value=UtilMap.getString_first(map,"numberField_meqqj4wd","numberField_mesc7nvi"); // 数量
  469. newCustomfields.add(tbConf.assembleCustomFieldName("订单数量",value));
  470. newCustomfields.add(tbConf.assembleCustomFieldName("配件编号",sku));
  471. tMap.put("customfields",newCustomfields);
  472. log.info("最终任务名称:{},详细参数:{}",tMap.get("content"),tMap);
  473. Map result=tbTask.createTask(tbConf.getOperatorId(), tMap);// 更新任务所属任务列表
  474. Map recod=new HashMap(cgDetail);
  475. rdNum = UtilMap.getString(cgDetail,"numberField_mmke3fdc"); //研发部订单需求数量 add by Jason 20260312
  476. recod.putAll(
  477. UtilMap.map(
  478. "textField_mecmytpr, textField_mecmytps, textField_mecmytpt, numberField_mifp03el, " +
  479. "numberField_mmmwu4cg, " + //研发部订单需求数量 add by Jason 20260312
  480. "textField_mifp03eo, textField_miib17jx, textField_mizvc5oj, textField_mjr129o4, numberField_mkosp94h, numberField_me2f7tw0",
  481. result.get("content"),result.get("taskId"),"未开始",value,
  482. rdNum, //研发部订单需求数量 add by Jason 20260312
  483. sku,pId,result.get("taskId"),lang,value,UtilMap.getString(map, "numberField_mkf4bc4j")));
  484. recodTable.add(recod);
  485. // for (String son:sonconf){
  486. // Map sonMap=new HashMap();
  487. // sonMap.put("content",tMap.get("content")+"/"+son.replace("/","-"));
  488. // if(taskMap.containsKey("executorId")){
  489. // sonMap.put("executorId",taskMap.get("executorId"));
  490. // }
  491. // sonMap.put("stageId",taskMap.get("stageId"));
  492. // sonMap.put("tasklistId",taskMap.get("tasklistId"));
  493. // sonMap.put("scenariofieldconfigId",sonScenariofieldconfigId);
  494. // sonMap.put("parentTaskId",result.get("taskId"));
  495. // List soncustomfields=new ArrayList();
  496. // soncustomfields.add(tbConf.assembleCustomFieldName("SKU类型",son));
  497. // soncustomfields.add(tbConf.assembleCustomFieldName("工厂(SKU供应商)",gysName));
  498. // soncustomfields.add(tbConf.assembleCustomFieldName("订单数量",value));
  499. // sonMap.put("customfields",soncustomfields);
  500. // sonMap.put("projectId",taskMap.get("projectId"));
  501. // Map sonResult=tbTask.createTask(tbConf.getOperatorId(), sonMap);
  502. // log.info("子任务名称:{}",sonResult.get("content"));
  503. // }
  504. }
  505. if(recodTable.size()<1){
  506. log.info("该任务未匹配上区分规则:{}",taskMap.get("content"));
  507. }
  508. return recodTable;
  509. }
  510. @Override
  511. public Map taskStateChange(String taskIds,String tfsName) {
  512. String[] tasks=taskIds.split(",");
  513. for(String taskId:tasks){
  514. tbTask.updateTaskFlowStatusByName(taskId,tbConf.getOperatorId(),tfsName,"");
  515. }
  516. return Collections.emptyMap();
  517. }
  518. @Override
  519. public void taskCount(String pid, String tbPid, String fid, String taskTypeName, String projectState) {
  520. // 1.1循环所有项目
  521. // 1.2查询项目的自定义字段
  522. List<Map> tidList=tbProject.queryProjectCustomField(tbPid,UtilMap.map("q","项目编号"));
  523. String cfId=String.valueOf(tidList.get(0).get("id")); // 项目编号ID
  524. // 2.查询该项目的工作流
  525. String taskflowId=_getTaskType(tbPid,taskTypeName,"taskflowId"); // 任务工作流ID
  526. // 2.1循环工作流所有状态
  527. List<Map> tfsList=tbProject.queryProjectCustomFlowStatus(tbPid,"",taskflowId,UtilMap.map("",""));
  528. Map updateMap=new HashMap();
  529. for(Map map:tfsList){
  530. // 3.查询该状态下任务数量
  531. String q="tfsId = "+String.valueOf(map.get("id"))+" AND cf:"+cfId+"='"+pid+"'";
  532. int count=tbProject.taskCount(tbPid,q,false);
  533. log.info("{}阶段数量:{}",map.get("name"),count);
  534. updateMap.put(TFNAME_YDKEY.get(map.get("name")),count);
  535. }
  536. if(projectState.equals("立项阶段")){
  537. updateMap.put("selectField_me2hylde","样品阶段");
  538. }else if(projectState.equals("样品阶段")&&!isYp(updateMap,Arrays.asList("未开始","白样","制版","产前样"))){
  539. updateMap.put("selectField_me2hylde","生产阶段");
  540. }
  541. ydClient.operateData(YDParam.builder().formInstId(fid).updateFormDataJson(JSONObject.toJSONString(updateMap)).useLatestFormSchemaVersion(true).build(), YDConf.FORM_OPERATION.update);
  542. }
  543. private boolean isYp(Map updateMap,List<String> list){
  544. for (String key:list){
  545. if(updateMap.containsKey(TFNAME_YDKEY.get(key))){
  546. if(UtilMap.getInt(updateMap,TFNAME_YDKEY.get(key))>0){
  547. return true;
  548. }
  549. }
  550. }
  551. return false;
  552. }
  553. private void saveRecod(Map formData,String tbProjectId,List<Map> recodTable){
  554. Map map=new HashMap();
  555. map.put("textField_me87x1nz",formData.get("textField_me87x1nz"));
  556. map.put("textField_me2hyldc",formData.get("textField_me2hyldc"));
  557. map.put("textField_me9n24kq",formData.get("textField_me9n24kq"));
  558. map.put("textField_me2hyldb",formData.get("textField_me2hyldb"));
  559. map.put("selectField_mdf997wp",formData.get("selectField_mdf997wp"));
  560. map.put("selectField_me2hylde",formData.get("selectField_me2hylde"));
  561. map.put("checkboxField_me9n37rs",formData.get("checkboxField_me9n37rs"));
  562. map.put("associationFormField_me9n24kk",UtilMap.getAssFieldValue(formData,"associationFormField_me9n24kk_id"));
  563. map.put("textField_mecmytpo",tbProjectId);
  564. map.put("tableField_mecmytpp",recodTable);
  565. ydClient.operateData(YDParam.builder().formUuid(EastarParam.YD_FORMUUID_RECOD).formDataJson(JSONObject.toJSONString(map)).build(), YDConf.FORM_OPERATION.create);
  566. }
  567. private List<Map> getCustomfields(Map<String,String> CUSTFIELD_TEXT,Map tableItem){
  568. List<Map> customfields=new ArrayList<>();
  569. for (String key : CUSTFIELD_TEXT.keySet()) {
  570. customfields.add(tbConf.assembleCustomFieldName(key,UtilMap.getString(tableItem,CUSTFIELD_TEXT.get(key))));
  571. }
  572. return customfields;
  573. }
  574. private String _getProjectRoleId(String projectId, String roleName) {
  575. List<Map> roles = tbProject.queryProjectRoles(projectId);
  576. Optional optional = roles.stream().filter(item -> roleName.equals(item.get("name"))).findAny();
  577. McException.assertAccessException(!optional.isPresent(), roleName + ": 项目角色不存在");
  578. return UtilMap.getString((Map) optional.get(), "id");
  579. }
  580. private static List<Map> getCustFiledValueId(List<String> ssUserId){
  581. return ssUserId.stream().map(item->{
  582. return UtilMap.map("id, title",item,item);
  583. }).collect(Collectors.toList());
  584. }
  585. private static List<Map> getCustFiledValueTitle(List<String> values){
  586. return values.stream().map(item->{
  587. return UtilMap.map("title",item);
  588. }).collect(Collectors.toList());
  589. }
  590. String _getTaskType(String projectId, String taskTypeName) {
  591. return _getTaskType(projectId,taskTypeName,"id");
  592. }
  593. String _getTaskType(String projectId, String taskTypeName,String key) {
  594. List<Map> customFlowStatus = tbProject.queryProjectTaskType(projectId, UtilMap.map("q", taskTypeName));
  595. // 7.10 避免模糊匹配
  596. customFlowStatus = customFlowStatus.stream().filter(item -> taskTypeName.equals(UtilMap.getString(item, "name"))).collect(Collectors.toList());
  597. McException.assertAccessException(customFlowStatus.isEmpty(), "工作流名称未匹配");
  598. return String.valueOf(customFlowStatus.get(0).get(key));
  599. }
  600. String _getTaskList(String projectId, String taskListName) {
  601. List<Map> customFlowStatus = tbProject.queryProjectTaskList(projectId, UtilMap.map("q", taskListName));
  602. // 7.10 避免模糊匹配
  603. customFlowStatus = customFlowStatus.stream().filter(item -> taskListName.equals(UtilMap.getString(item, "title"))).collect(Collectors.toList());
  604. McException.assertAccessException(customFlowStatus.isEmpty(), "任务分组名称未匹配");
  605. return String.valueOf(customFlowStatus.get(0).get("id"));
  606. }
  607. }