McYdServiceImpl.java 67 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285
  1. package com.malk.mc.service.impl;
  2. import cn.hutool.core.date.DateUtil;
  3. import cn.hutool.core.io.IORuntimeException;
  4. import cn.hutool.core.util.NumberUtil;
  5. import cn.hutool.core.util.ObjectUtil;
  6. import cn.hutool.crypto.digest.MD5;
  7. import com.alibaba.fastjson.JSON;
  8. import com.alibaba.fastjson.JSONArray;
  9. import com.alibaba.fastjson.JSONObject;
  10. import com.malk.core.McProject;
  11. import com.malk.mc.service.McYdService;
  12. import com.malk.server.aliwork.YDConf;
  13. import com.malk.server.aliwork.YDParam;
  14. import com.malk.server.common.McException;
  15. import com.malk.server.common.McR;
  16. import com.malk.server.dingtalk.DDConf;
  17. import com.malk.server.dingtalk.DDR;
  18. import com.malk.server.dingtalk.DDR_New;
  19. import com.malk.service.aliwork.YDClient;
  20. import com.malk.service.aliwork.YDService;
  21. import com.malk.service.dingtalk.DDClient;
  22. import com.malk.service.dingtalk.DDClient_Contacts;
  23. import com.malk.service.dingtalk.DDClient_Notice;
  24. import com.malk.service.dingtalk.DDClient_Workflow;
  25. import com.malk.utils.*;
  26. import lombok.extern.slf4j.Slf4j;
  27. import org.apache.commons.codec.digest.DigestUtils;
  28. import org.apache.logging.log4j.util.Strings;
  29. import org.slf4j.MDC;
  30. import org.springframework.beans.factory.annotation.Autowired;
  31. import org.springframework.scheduling.annotation.Async;
  32. import org.springframework.stereotype.Service;
  33. import java.math.BigDecimal;
  34. import java.text.DecimalFormat;
  35. import java.text.SimpleDateFormat;
  36. import java.time.LocalDate;
  37. import java.time.LocalTime;
  38. import java.util.*;
  39. import java.util.stream.Collectors;
  40. @Slf4j
  41. @Service
  42. public class McYdServiceImpl implements McYdService {
  43. @Autowired
  44. private YDClient ydClient;
  45. @Autowired
  46. private DDClient ddClient;
  47. @Autowired
  48. private DDConf ddConf;
  49. @Autowired
  50. private YDConf ydConf;
  51. @Autowired
  52. private DDClient_Workflow ddClientWorkflow;
  53. @Autowired
  54. private DDClient_Notice ddClientNotice;
  55. @Autowired
  56. private DDClient_Contacts ddClient_contacts;
  57. @Override
  58. @Async
  59. public void updateFormDataVersion(Map map) {
  60. try {
  61. String pid = Objects.nonNull(map.get("pid")) ? map.get("pid").toString() : "";
  62. String formInstId = Objects.nonNull(map.get("formInstId")) ? map.get("formInstId").toString() : "";
  63. String formUuid = Objects.nonNull(map.get("formUuid")) ? map.get("formUuid").toString() : "";
  64. if (Strings.isNotBlank(pid)){
  65. MDC.put("MDC_KEY_PID",pid);
  66. if (Strings.isNotBlank(formInstId) && Strings.isBlank(formUuid)){
  67. ydClient.operateData(YDParam.builder()
  68. .formInstId(formInstId)
  69. .useLatestVersion(true)
  70. .updateFormDataJson("{}").build(), YDConf.FORM_OPERATION.update);
  71. }else if (Strings.isBlank(formInstId) && Strings.isNotBlank(formUuid)){
  72. int i = 1;
  73. int pageSize = 10;
  74. DDR_New ddrNew = null;
  75. do {
  76. int i1 =1 ;
  77. boolean flag1 = false;
  78. while (i1<=5 && !flag1) {
  79. try {
  80. ddrNew = ydClient.queryData(YDParam.builder()
  81. .formUuid(formUuid)
  82. .pageNumber(i)
  83. .pageSize(pageSize)
  84. .build(), YDConf.FORM_QUERY.retrieve_search_form_id);
  85. List<String> formInstIdList = (List<String>) ddrNew.getData();
  86. //noExecuteExpression字段不传或传false 传true会导致实例版本不更新或滞后更新
  87. ydClient.operateData(YDParam.builder()
  88. .formInstanceIdList(formInstIdList)
  89. .formUuid(formUuid)
  90. .useLatestFormSchemaVersion(true)
  91. .updateFormDataJson("{}")
  92. .noExecuteExpression(false)
  93. .asynchronousExecution(false)
  94. .build(),YDConf.FORM_OPERATION.multi_update);
  95. i++;
  96. flag1 = true;
  97. }catch (Exception e){
  98. log.error("更新表单实例版本失败:{}, 重试次数:{}",e.getMessage(),i1);
  99. try {
  100. Thread.sleep(3000);
  101. } catch (InterruptedException ex) {
  102. throw new RuntimeException(ex);
  103. }
  104. i1++;
  105. }
  106. }
  107. if (i1 > 5){
  108. throw new RuntimeException("更新表单实例版本失败,超过最大重试次数!");
  109. }
  110. }while (ddrNew.getTotalCount() > ddrNew.getPageNumber() * pageSize);
  111. }
  112. //发送工作通知给当前登陆人
  113. if (Objects.nonNull(map.get("userId"))){
  114. //获取当前时间 精确到秒
  115. String time = DateUtil.format(new Date(),"yyyy-MM-dd HH:mm:ss");
  116. sendDdMsg(ddClient.getAccessToken(),ddConf.getAgentId(),map.get("userId").toString(),"表单实例版本已更新 时间:" + time);
  117. }
  118. }
  119. }catch (Exception e){
  120. //发送工作通知
  121. if (Objects.nonNull(map.get("userId"))){
  122. String time = DateUtil.format(new Date(),"yyyy-MM-dd HH:mm:ss");//获取当前时间 精确到秒
  123. sendDdMsg(ddClient.getAccessToken(),ddConf.getAgentId(),map.get("userId").toString(),"更新表单实例版本异常:" + e.getMessage() + " 时间:" + time);
  124. }
  125. throw new RuntimeException(e);
  126. }
  127. }
  128. //发送工作通知
  129. public void sendDdMsg(String access_token,Number agent_id, String userid_list, String content){
  130. if (Objects.nonNull(userid_list)){
  131. Map param2 = new HashMap();
  132. param2.put("access_token",access_token);
  133. Map body3 = new HashMap();
  134. body3.put("agent_id",agent_id);
  135. body3.put("userid_list",userid_list);
  136. Map msg = new HashMap();
  137. msg.put("msgtype","text");
  138. //获取当前时间 精确到秒
  139. String time = DateUtil.format(new Date(),"yyyy-MM-dd HH:mm:ss");
  140. msg.put("text", UtilMap.map("content",content));
  141. body3.put("msg",msg);
  142. UtilHttp.doPost("https://oapi.dingtalk.com/topapi/message/corpconversation/asyncsend_v2",null,param2,body3);
  143. }
  144. }
  145. @Override
  146. public McR initiateApproval(Map map) {
  147. String pid = getString(map.get("pid"));
  148. String formUuid = getString(map.get("formUuid"));
  149. String processCode = getString(map.get("processCode"));
  150. String userId = getString(map.get("userId"));
  151. Map formData = (Map) map.get("formData");
  152. Map processData = new HashMap();
  153. if (Objects.nonNull(map.get("processData"))){
  154. processData = (Map) map.get("processData");
  155. }
  156. if (Strings.isNotBlank(pid)){
  157. //发起审批
  158. String[] yida = McProject.getYida(pid);
  159. Map<String,Object> body = new HashMap<>();
  160. if (!PublicUtil.isNull(pid) && yida != null && yida.length >= 2) {
  161. body.put("appType",yida[0]);
  162. body.put("systemToken",yida[1]);
  163. }
  164. body.put("userId",userId);
  165. body.put("formUuid",formUuid);
  166. body.put("processCode",processCode);
  167. body.put("formDataJson", JSONObject.toJSONString(formData));
  168. if (Objects.nonNull(processData) && processData.size() > 0){
  169. body.put("processData", JSONObject.toJSONString(processData));
  170. }
  171. UtilHttp.doPost("https://api.dingtalk.com/v1.0/yida/processes/instances/start", ddClient.initTokenHeader(), null, body, DDR_New.class);
  172. return McR.success();
  173. }
  174. return McR.errorParam("参数缺失!");
  175. }
  176. @Override
  177. public McR convertSubTableNumber(Map map) {
  178. String formInstId = getString(map.get("formInstId"));
  179. String tableField = getString(map.get("tableField"));
  180. String numberFieldCode = getString(map.get("numFileCodes"));
  181. String textFieldCode = getString(map.get("textFieldCodes"));
  182. if (Strings.isNotBlank(formInstId)){
  183. DDR_New ddrNew = ydClient.queryData(YDParam.builder()
  184. .formInstId(formInstId)
  185. .build(), YDConf.FORM_QUERY.retrieve_id);
  186. Map formData = ddrNew.getFormData();
  187. Map updateMap=new HashMap();
  188. if (!PublicUtil.isNull(tableField)&&tableField.startsWith("tableField_")) {
  189. List<Map<String, ?>> table = UtilMap.getList( formData,(tableField));
  190. for (Map item : table) {
  191. String[] numberFieldCodes=numberFieldCode.split(",");
  192. String[] textFieldCodes=textFieldCode.split(",");
  193. for (int i = 0; i < numberFieldCodes.length; i++) {
  194. String numstr=UtilMap.getNumberStr(item,numberFieldCodes[i]);
  195. if(PublicUtil.isNull(numstr)||numstr.equals("0")){
  196. updateMap.put(textFieldCodes[i],"0.00");
  197. continue;
  198. }
  199. BigDecimal number = NumberUtil.toBigDecimal(numstr);
  200. // 创建一个 DecimalFormat 实例,指定千位分隔符模式
  201. DecimalFormat df = new DecimalFormat("#,###.00");
  202. // 格式化 double 数值
  203. String formattedText = df.format(number);
  204. item.put(textFieldCodes[i],formattedText);
  205. }
  206. }
  207. updateMap.put(tableField,getTableData(table)); // 添加一层过滤
  208. }
  209. if(!PublicUtil.isNull(map,"mainNumKeys","mainTextKeys")){
  210. String[] mainNumKeys=UtilMap.getString(map,"mainNumKeys").split(",");
  211. String[] mainTextKeys=UtilMap.getString(map,"mainTextKeys").split(",");
  212. for (int i = 0; i < mainNumKeys.length; i++) {
  213. String numstr=UtilMap.getNumberStr(formData,(mainNumKeys[i]));
  214. if(PublicUtil.isNull(numstr)||numstr.equals("0")){
  215. updateMap.put(mainTextKeys[i],"0.00");
  216. continue;
  217. }
  218. BigDecimal number = NumberUtil.toBigDecimal(numstr);
  219. // 创建一个 DecimalFormat 实例,指定千位分隔符模式
  220. DecimalFormat df = new DecimalFormat("#,###.00");
  221. // 格式化 double 数值
  222. String formattedText = df.format(number);
  223. updateMap.put(mainTextKeys[i],formattedText);
  224. }
  225. }
  226. ydClient.operateData(YDParam.builder()
  227. .formInstId(formInstId)
  228. .useLatestVersion(true)
  229. .updateFormDataJson(JSONObject.toJSONString(updateMap))
  230. .build(), YDConf.FORM_OPERATION.update);
  231. }
  232. return McR.success();
  233. }
  234. @Override
  235. public McR saveApproverToForm(Map map) {
  236. try {
  237. Thread.sleep(5000);
  238. } catch (InterruptedException e) {
  239. throw new RuntimeException(e);
  240. }
  241. String key = UtilMap.getString(map,"key");
  242. String formInstId = UtilMap.getString(map,"formInstId");
  243. JSONArray jsonArray=(JSONArray) ydClient.queryData(YDParam.builder().processInstanceId(formInstId).build(),YDConf.FORM_QUERY.retrieve_approval_record).getResult();
  244. List<String> userIds = new ArrayList<>();
  245. extractOperatorIds(jsonArray,userIds);
  246. ydClient.operateData(YDParam.builder().updateFormDataJson(JSONObject.toJSONString(UtilMap.map(key, userIds))).formInstId(formInstId).build(), YDConf.FORM_OPERATION.update);
  247. return McR.success();
  248. }
  249. @Override
  250. public McR multiLocationOutbound(Map map) {
  251. String formInstId = UtilMap.getString(map,"formInstId");//实例id(出库单)
  252. log.info("出库单实例id:" + formInstId);
  253. Map d = ydClient.queryData(YDParam.builder().formInstId(formInstId)
  254. .formUuid("FORM-3208DFE5463549A9A57FB94358A75E80PV5F")
  255. .appType("APP_GNQ1RGK68X4JNZUEU8RQ")
  256. .systemToken("XH866P81QDOTQ0218TGZM9WCNXOF24WIP488M7A5")
  257. .userId("332051151139376769").build(),YDConf.FORM_QUERY.retrieve_id).getFormData();
  258. System.out.println("出库单数据:"+d);
  259. List<Map> mapList = (List<Map>)d.get("tableField_m8mo8506");
  260. System.out.println("出库单明细数据:"+mapList);
  261. ArrayList<Object> entries = new ArrayList<>();
  262. for(Map map1 : mapList){
  263. String LBJId = map1.get("textField_ma1usp6o").toString();//零部件的实例id
  264. entries.add(LBJId);
  265. System.out.println("物料名称:"+map1.get("textField_m99kztjo").toString());
  266. BigDecimal InventoryCount = BigDecimal.valueOf(0);//库存数量
  267. BigDecimal OutboundQuantity = BigDecimal.valueOf(0);//
  268. if(!map1.get("numberField_m9qdwvu1_value").toString().isEmpty()){
  269. InventoryCount = new BigDecimal( map1.get("numberField_m9qdwvu1").toString());
  270. }
  271. BigDecimal numberFieldM9qdwvu1 = InventoryCount.subtract( new BigDecimal( map1.get("numberField_m8mo8508").toString()));//存库数量 - 出库数量
  272. System.out.println("出库后数量:"+numberFieldM9qdwvu1);
  273. Map d1 = ydClient.queryData(YDParam.builder().formInstId(LBJId)
  274. .formUuid("FORM-2353BE632D97434DAD55AEBD0866C44DVAT5")
  275. .appType("APP_GNQ1RGK68X4JNZUEU8RQ")
  276. .systemToken("XH866P81QDOTQ0218TGZM9WCNXOF24WIP488M7A5")
  277. .userId("332051151139376769").build(),YDConf.FORM_QUERY.retrieve_id).getFormData();
  278. System.out.println(map1.get("textField_m99kztjo").toString()+"的数据明细:"+ d1.get("tableField_m96gje14").toString());
  279. String s = d1.get("tableField_m96gje14").toString();
  280. String warehouse = JSON.parseArray(s).getJSONObject(0).get("selectField_m88f1qi8").toString();//所属仓库
  281. String WarehouseLocation = JSON.parseArray(s).getJSONObject(0).get("textField_m8mnxgql").toString();//所属库位
  282. String SafetyValue = JSON.parseArray(s).getJSONObject(0).get("numberField_m8873fn4").toString();//安全库存值
  283. ArrayList<Map<String,String>> maps_YD = new ArrayList<>();
  284. Map sss=new HashMap<>();
  285. sss.put("selectField_m88f1qi8",warehouse);//所属仓库
  286. sss.put("textField_m8mnxgql",WarehouseLocation);//所属库位
  287. sss.put("numberField_m8873fn4",SafetyValue);//安全库存值
  288. sss.put("numberField_m9c8n9go",numberFieldM9qdwvu1);//仓库数量
  289. maps_YD.add(sss);
  290. ydClient.operateData(YDParam.builder().formInstId(LBJId)
  291. .formUuid("FORM-2353BE632D97434DAD55AEBD0866C44DVAT5")
  292. .appType("APP_GNQ1RGK68X4JNZUEU8RQ")
  293. .systemToken("XH866P81QDOTQ0218TGZM9WCNXOF24WIP488M7A5")
  294. .updateFormDataJson(JSONObject.toJSONString(UtilMap.map("tableField_m96gje14",maps_YD)))
  295. .userId("332051151139376769").build(),YDConf.FORM_OPERATION.update);
  296. BigDecimal InventoryQuantity = new BigDecimal( d1.get("numberField_m8obn6wk").toString());//库存数量
  297. BigDecimal FreezeQuantity = null;
  298. if(!d1.get("numberField_m8obn6wl_value").toString().isEmpty()){
  299. FreezeQuantity = new BigDecimal( d1.get("numberField_m8obn6wl").toString());//冻结数量
  300. }else {
  301. FreezeQuantity = BigDecimal.valueOf(0);
  302. }
  303. System.out.println("--------------------零部件子表数据修改完毕!---------------------");
  304. BigDecimal FreezeQuantity_AAA = FreezeQuantity.add( new BigDecimal( map1.get("numberField_m8mo8508").toString()));//冻结数量(新)
  305. BigDecimal AvailableQuantity_AAA = numberFieldM9qdwvu1;//可用存库数量(新)
  306. ydClient.operateData(YDParam.builder().formInstId(LBJId)
  307. .formUuid("FORM-2353BE632D97434DAD55AEBD0866C44DVAT5")
  308. .appType("APP_GNQ1RGK68X4JNZUEU8RQ")
  309. .systemToken("XH866P81QDOTQ0218TGZM9WCNXOF24WIP488M7A5")
  310. .updateFormDataJson(JSONObject.toJSONString(UtilMap.map("numberField_m8obn6wl, numberField_m8gz97nk",FreezeQuantity_AAA,AvailableQuantity_AAA)))
  311. .userId("332051151139376769")
  312. .build(),YDConf.FORM_OPERATION.update);
  313. System.out.println("----------------------零部件主表数据修改完毕!------------------");
  314. }
  315. return McR.success();
  316. }
  317. @Override
  318. public McR WarehouseStorage(Map map) {
  319. String formInstId = UtilMap.getString(map,"formInstId");//实例id(入库单)
  320. log.info("入库单实例id:"+formInstId);
  321. Map d = ydClient.queryData(YDParam.builder().formInstId(formInstId)
  322. .formUuid("FORM-6DED8EB4CF0446DB8841C7798E106F2886OH")
  323. .appType("APP_GNQ1RGK68X4JNZUEU8RQ")
  324. .systemToken("XH866P81QDOTQ0218TGZM9WCNXOF24WIP488M7A5")
  325. .userId("332051151139376769").build(),YDConf.FORM_QUERY.retrieve_id).getFormData();
  326. System.out.println("入库单数据:"+d);
  327. List<Map> mapList = (List<Map>)d.get("tableField_m8mseubi");
  328. System.out.println("入库单明细数据:"+mapList);
  329. ArrayList<Object> entries = new ArrayList<>();
  330. for(Map map1 : mapList){
  331. String LBJId = map1.get("textField_ma3jhnpr").toString();//零部件的实例id
  332. entries.add(LBJId);
  333. System.out.println("物料名称:"+map1.get("textField_m9b1vd2w").toString());
  334. BigDecimal numberFieldM9qdwvu1 = new BigDecimal( map1.get("numberField_ma3jwnr3").toString() ).add(new BigDecimal( map1.get("numberField_m8mseubm").toString()));//存库数量 + 入库数量
  335. System.out.println("入库后数量:"+numberFieldM9qdwvu1);
  336. Map d1 = ydClient.queryData(YDParam.builder().formInstId(LBJId)
  337. .formUuid("FORM-2353BE632D97434DAD55AEBD0866C44DVAT5")
  338. .appType("APP_GNQ1RGK68X4JNZUEU8RQ")
  339. .systemToken("XH866P81QDOTQ0218TGZM9WCNXOF24WIP488M7A5")
  340. .userId("332051151139376769").build(),YDConf.FORM_QUERY.retrieve_id).getFormData();
  341. System.out.println(map1.get("textField_m9b1vd2w").toString()+"的数据明细:"+ d1.get("tableField_m96gje14").toString());
  342. String s = d1.get("tableField_m96gje14").toString();
  343. String warehouse = JSON.parseArray(s).getJSONObject(0).get("selectField_m88f1qi8").toString();//所属仓库
  344. String WarehouseLocation = JSON.parseArray(s).getJSONObject(0).get("textField_m8mnxgql").toString();//所属库位
  345. String SafetyValue = JSON.parseArray(s).getJSONObject(0).get("numberField_m8873fn4").toString();//安全库存值
  346. ArrayList<Map<String,String>> maps_YD = new ArrayList<>();
  347. Map sss=new HashMap<>();
  348. sss.put("selectField_m88f1qi8",warehouse);//所属仓库
  349. sss.put("textField_m8mnxgql",WarehouseLocation);//所属库位
  350. sss.put("numberField_m8873fn4",SafetyValue);//安全库存值
  351. sss.put("numberField_m9c8n9go",numberFieldM9qdwvu1);//仓库数量
  352. maps_YD.add(sss);
  353. ydClient.operateData(YDParam.builder().formInstId(LBJId)
  354. .formUuid("FORM-2353BE632D97434DAD55AEBD0866C44DVAT5")
  355. .appType("APP_GNQ1RGK68X4JNZUEU8RQ")
  356. .systemToken("XH866P81QDOTQ0218TGZM9WCNXOF24WIP488M7A5")
  357. .updateFormDataJson(JSONObject.toJSONString(UtilMap.map("tableField_m96gje14",maps_YD)))
  358. .userId("332051151139376769").build(),YDConf.FORM_OPERATION.update);
  359. BigDecimal InventoryQuantity = null;
  360. if(!d1.get("numberField_m8gz97nk").toString().isEmpty()){
  361. InventoryQuantity = new BigDecimal( d1.get("numberField_m8gz97nk").toString());//可用库存数量
  362. }else {
  363. InventoryQuantity = BigDecimal.valueOf(0);
  364. }
  365. BigDecimal VirtualQuantity = null;
  366. if(!d1.get("numberField_m8obn6wq_value").toString().isEmpty()){
  367. VirtualQuantity = new BigDecimal( d1.get("numberField_m8obn6wq").toString());//虚拟数量
  368. }else {
  369. VirtualQuantity = BigDecimal.valueOf(0);
  370. }
  371. System.out.println("--------------------零部件子表数据修改完毕!---------------------");
  372. BigDecimal VirtualQuantity_AAA = VirtualQuantity.add( new BigDecimal( map1.get("numberField_m8mseubm").toString()));//虚拟数量(新)
  373. BigDecimal AvailableQuantity_AAA = InventoryQuantity .add (new BigDecimal( map1.get("numberField_m8mseubm").toString()));//可用存库数量(新)
  374. ydClient.operateData(YDParam.builder().formInstId(LBJId)
  375. .formUuid("FORM-2353BE632D97434DAD55AEBD0866C44DVAT5")
  376. .appType("APP_GNQ1RGK68X4JNZUEU8RQ")
  377. .systemToken("XH866P81QDOTQ0218TGZM9WCNXOF24WIP488M7A5")
  378. .updateFormDataJson(JSONObject.toJSONString(UtilMap.map("numberField_m8obn6wq, numberField_m8gz97nk",VirtualQuantity_AAA,AvailableQuantity_AAA)))
  379. .userId("332051151139376769")
  380. .build(),YDConf.FORM_OPERATION.update);
  381. System.out.println("----------------------零部件主表数据修改完毕!------------------");
  382. }
  383. return McR.success();
  384. }
  385. @Override
  386. public McR ProductReturn(Map map) {
  387. String formInstId = UtilMap.getString(map,"formInstId");//实例id(退货单)
  388. log.info("退货单实例id:"+formInstId);
  389. Map data = ydClient.queryData(YDParam.builder().formInstId(formInstId)
  390. .formUuid("FORM-E40A23253F2F43FEAF0E40F274A67B34OQC9")
  391. .appType("APP_GNQ1RGK68X4JNZUEU8RQ")
  392. .systemToken("XH866P81QDOTQ0218TGZM9WCNXOF24WIP488M7A5")
  393. .userId("332051151139376769").build(), YDConf.FORM_QUERY.retrieve_id).getFormData();
  394. System.out.println("退货单:"+data);
  395. List<Map> mapList = (List<Map>)data.get("tableField_m99koj01");
  396. System.out.println("退货单明细数据:"+mapList);
  397. ArrayList<Object> entries = new ArrayList<>();
  398. for (Map map1 : mapList){
  399. String LBJId = map1.get("textField_maki4tqo").toString();//零部件的实例id
  400. System.out.println("物料名称:"+map1.get("textField_m99koj02").toString());//物料名称
  401. System.out.println("所属库位:"+map1.get("textField_maki4tqp").toString());//产品库位
  402. System.out.println("退货数量:"+map1.get("numberField_ma0e13js").toString());//退货数量
  403. Map data1 = ydClient.queryData(YDParam.builder().formInstId(LBJId)
  404. .formUuid("FORM-2353BE632D97434DAD55AEBD0866C44DVAT5")
  405. .appType("APP_GNQ1RGK68X4JNZUEU8RQ")
  406. .systemToken("XH866P81QDOTQ0218TGZM9WCNXOF24WIP488M7A5")
  407. .userId("332051151139376769").build(), YDConf.FORM_QUERY.retrieve_id).getFormData();
  408. System.out.println(map1.get("textField_m99koj02")+"明细表数据:"+data1.get("tableField_m96gje14"));//零部件明细
  409. String s = data1.get("tableField_m96gje14").toString();
  410. String warehouse = JSON.parseArray(s).getJSONObject(0).get("selectField_m88f1qi8").toString();//所属仓库
  411. String WarehouseLocation = JSON.parseArray(s).getJSONObject(0).get("textField_m8mnxgql").toString();//所属库位
  412. String SafetyValue = JSON.parseArray(s).getJSONObject(0).get("numberField_m8873fn4").toString();//安全库存值
  413. BigDecimal numberFieldM9c8n9go = new BigDecimal(JSON.parseArray(s).getJSONObject(0).get("numberField_m9c8n9go").toString());//仓库数量
  414. BigDecimal numm = new BigDecimal(map1.get("numberField_ma0e13js").toString()).add(numberFieldM9c8n9go); //退货后的库存数量 = 退货数量 + 仓库数量(子)
  415. ArrayList<Map<String,String>> maps_YD = new ArrayList<>();
  416. Map sss=new HashMap<>();
  417. sss.put("selectField_m88f1qi8",warehouse);//所属仓库
  418. sss.put("textField_m8mnxgql",WarehouseLocation);//所属库位
  419. sss.put("numberField_m8873fn4",SafetyValue);//安全库存值
  420. sss.put("numberField_m9c8n9go",numm);//仓库数量
  421. maps_YD.add(sss);
  422. ydClient.operateData(YDParam.builder().formInstId(LBJId)
  423. .formUuid("FORM-2353BE632D97434DAD55AEBD0866C44DVAT5")
  424. .appType("APP_GNQ1RGK68X4JNZUEU8RQ")
  425. .systemToken("XH866P81QDOTQ0218TGZM9WCNXOF24WIP488M7A5")
  426. .updateFormDataJson(JSONObject.toJSONString(UtilMap.map("tableField_m96gje14",maps_YD)))
  427. .userId("332051151139376769").build(),YDConf.FORM_OPERATION.update);
  428. BigDecimal InventoryQuantity = null;
  429. if(!data1.get("numberField_m8gz97nk_value").toString().isEmpty()){
  430. InventoryQuantity = new BigDecimal( data1.get("numberField_m8gz97nk").toString());//可用库存数量
  431. }else {
  432. InventoryQuantity = BigDecimal.valueOf(0);
  433. }
  434. BigDecimal FreezeQuantity = null;
  435. if(!data1.get("numberField_m8obn6wl_value").toString().isEmpty()){
  436. FreezeQuantity = new BigDecimal( data1.get("numberField_m8obn6wl").toString());//冻结数量
  437. }else {
  438. FreezeQuantity = BigDecimal.valueOf(0);
  439. }
  440. System.out.println("---------------------------------------零部件子表数据修改完毕--------------------------------");
  441. BigDecimal FreezeQuantity_AAA = FreezeQuantity.subtract( new BigDecimal( map1.get("numberField_ma0e13js").toString()));//冻结数量(新) = 冻结数量 - 退货数量
  442. BigDecimal AvailableQuantity_AAA = InventoryQuantity.add(new BigDecimal( map1.get("numberField_ma0e13js").toString()));//可用存库数量(新) = 可用库存数量 + 退货数量
  443. ydClient.operateData(YDParam.builder().formInstId(LBJId)
  444. .formUuid("FORM-2353BE632D97434DAD55AEBD0866C44DVAT5")
  445. .appType("APP_GNQ1RGK68X4JNZUEU8RQ")
  446. .systemToken("XH866P81QDOTQ0218TGZM9WCNXOF24WIP488M7A5")
  447. .updateFormDataJson(JSONObject.toJSONString(UtilMap.map("numberField_m8obn6wl, numberField_m8gz97nk",FreezeQuantity_AAA,AvailableQuantity_AAA)))
  448. .userId("332051151139376769")
  449. .build(),YDConf.FORM_OPERATION.update);
  450. System.out.println("----------------------零部件主表数据修改完毕!------------------");
  451. }
  452. return McR.success();
  453. }
  454. @Override
  455. public McR allocateTransfer(Map map) {
  456. String formInstId = UtilMap.getString(map,"formInstId");//实例id(调拨流程)
  457. log.info("调拨流程实例id:"+formInstId);
  458. Map data = ydClient.queryData(YDParam.builder().formInstId(formInstId)
  459. .formUuid("FORM-C6360F0CA28543E8BA99A1DDCF90964FSJEM")
  460. .appType("APP_GNQ1RGK68X4JNZUEU8RQ")
  461. .systemToken("XH866P81QDOTQ0218TGZM9WCNXOF24WIP488M7A5")
  462. .userId("332051151139376769").build(), YDConf.FORM_QUERY.retrieve_id).getFormData();
  463. System.out.println("调拨单:"+data);
  464. List<Map> mapList = (List<Map>)data.get("tableField_m9grj2ih");
  465. System.out.println("调拨明细数据:"+mapList);
  466. ArrayList<Object> entries = new ArrayList<>();
  467. for (Map map1 : mapList){
  468. //TODO:1、调出零部件处理
  469. String LBJId = map1.get("textField_mawbt28t").toString();//(调出)零部件的实例id
  470. System.out.println("调出的所属库位:"+map1.get("textField_m9grj2il").toString());//产品库位
  471. System.out.println("调出的所属仓库:"+map1.get("textField_m9grj2ik").toString());//产品仓库
  472. System.out.println("调拨前数量:"+map1.get("numberField_m9gs7k82").toString());//调拨前数量
  473. Map data1 = ydClient.queryData(YDParam.builder().formInstId(LBJId)
  474. .formUuid("FORM-2353BE632D97434DAD55AEBD0866C44DVAT5")
  475. .appType("APP_GNQ1RGK68X4JNZUEU8RQ")
  476. .systemToken("XH866P81QDOTQ0218TGZM9WCNXOF24WIP488M7A5")
  477. .userId("332051151139376769").build(), YDConf.FORM_QUERY.retrieve_id).getFormData();
  478. String s = data1.get("tableField_m96gje14").toString();
  479. String warehouse = JSON.parseArray(s).getJSONObject(0).get("selectField_m88f1qi8").toString();//所属仓库
  480. String WarehouseLocation = JSON.parseArray(s).getJSONObject(0).get("textField_m8mnxgql").toString();//所属库位
  481. String SafetyValue = JSON.parseArray(s).getJSONObject(0).get("numberField_m8873fn4").toString();//安全库存值
  482. BigDecimal numberFieldM9c8n9go = new BigDecimal(JSON.parseArray(s).getJSONObject(0).get("numberField_m9c8n9go").toString());//仓库数量
  483. BigDecimal numm = numberFieldM9c8n9go.subtract(new BigDecimal(map1.get("numberField_m9grj2ij").toString())); //调拨后的库存数量 = 仓库数量 - 调拨数量
  484. ArrayList<Map<String,String>> maps_YD = new ArrayList<>();
  485. Map sss=new HashMap<>();
  486. sss.put("selectField_m88f1qi8",warehouse);//所属仓库
  487. sss.put("textField_m8mnxgql",WarehouseLocation);//所属库位
  488. sss.put("numberField_m8873fn4",SafetyValue);//安全库存值
  489. sss.put("numberField_m9c8n9go",numm);//仓库数量
  490. maps_YD.add(sss);
  491. ydClient.operateData(YDParam.builder().formInstId(LBJId)
  492. .formUuid("FORM-2353BE632D97434DAD55AEBD0866C44DVAT5")
  493. .appType("APP_GNQ1RGK68X4JNZUEU8RQ")
  494. .systemToken("XH866P81QDOTQ0218TGZM9WCNXOF24WIP488M7A5")
  495. .updateFormDataJson(JSONObject.toJSONString(UtilMap.map("tableField_m96gje14",maps_YD)))
  496. .userId("332051151139376769").build(),YDConf.FORM_OPERATION.update);
  497. //TODO:2、调入零部件处理
  498. String LBJId2 = map1.get("textField_maxendgs").toString();//(调入)零部件的实例id
  499. System.out.println("调入的所属库位:"+map1.get("textField_m9grj2il").toString());//产品库位
  500. System.out.println("调入的所属仓库:"+map1.get("textField_m9grj2ik").toString());//产品仓库
  501. System.out.println("调拨前数量:"+map1.get("numberField_maz574d0").toString());//调拨前数量
  502. Map data2 = ydClient.queryData(YDParam.builder().formInstId(LBJId2)
  503. .formUuid("FORM-2353BE632D97434DAD55AEBD0866C44DVAT5")
  504. .appType("APP_GNQ1RGK68X4JNZUEU8RQ")
  505. .systemToken("XH866P81QDOTQ0218TGZM9WCNXOF24WIP488M7A5")
  506. .userId("332051151139376769").build(), YDConf.FORM_QUERY.retrieve_id).getFormData();
  507. String s1 = data2.get("tableField_m96gje14").toString();
  508. String warehouse1 = JSON.parseArray(s1).getJSONObject(0).get("selectField_m88f1qi8").toString();//所属仓库
  509. String WarehouseLocation1 = JSON.parseArray(s1).getJSONObject(0).get("textField_m8mnxgql").toString();//所属库位
  510. String SafetyValue1 = JSON.parseArray(s1).getJSONObject(0).get("numberField_m8873fn4").toString();//安全库存值
  511. BigDecimal numberFieldM9c8n9go1 = new BigDecimal(JSON.parseArray(s1).getJSONObject(0).get("numberField_m9c8n9go").toString());//仓库数量
  512. BigDecimal numm1 = numberFieldM9c8n9go1.add(new BigDecimal(map1.get("numberField_m9grj2ij").toString())); //调拨后的库存数量 = 仓库数量 + 调拨数量
  513. ArrayList<Map<String,String>> maps_YD1 = new ArrayList<>();
  514. Map sss1=new HashMap<>();
  515. sss1.put("selectField_m88f1qi8",warehouse1);//所属仓库
  516. sss1.put("textField_m8mnxgql",WarehouseLocation1);//所属库位
  517. sss1.put("numberField_m8873fn4",SafetyValue1);//安全库存值
  518. sss1.put("numberField_m9c8n9go",numm1);//仓库数量
  519. maps_YD1.add(sss1);
  520. ydClient.operateData(YDParam.builder().formInstId(LBJId2)
  521. .formUuid("FORM-2353BE632D97434DAD55AEBD0866C44DVAT5")
  522. .appType("APP_GNQ1RGK68X4JNZUEU8RQ")
  523. .systemToken("XH866P81QDOTQ0218TGZM9WCNXOF24WIP488M7A5")
  524. .updateFormDataJson(JSONObject.toJSONString(UtilMap.map("tableField_m96gje14",maps_YD1)))
  525. .userId("332051151139376769").build(),YDConf.FORM_OPERATION.update);
  526. BigDecimal AvailableInventoryQuantity_AAA = null;
  527. BigDecimal InventoryQuantity_AAA = null;
  528. if(!data1.get("numberField_m8gz97nk_value").toString().isEmpty()){
  529. AvailableInventoryQuantity_AAA = new BigDecimal( data1.get("numberField_m8gz97nk").toString());//可用库存数量
  530. }else {
  531. AvailableInventoryQuantity_AAA = BigDecimal.valueOf(0);
  532. }
  533. if(!data1.get("numberField_m8obn6wk_value").toString().isEmpty()){
  534. InventoryQuantity_AAA = new BigDecimal(data1.get("numberField_m8obn6wk").toString());//存库数量
  535. }else {
  536. InventoryQuantity_AAA = BigDecimal.valueOf(0);
  537. }
  538. BigDecimal AvailableInventoryQuantity_BBB = null;
  539. BigDecimal InventoryQuantity_BBB = null;
  540. if(!data2.get("numberField_m8gz97nk_value").toString().isEmpty()){
  541. AvailableInventoryQuantity_BBB = new BigDecimal( data2.get("numberField_m8gz97nk").toString());//可用库存数量
  542. }else {
  543. AvailableInventoryQuantity_BBB = BigDecimal.valueOf(0);
  544. }
  545. if(!data2.get("numberField_m8obn6wk_value").toString().isEmpty()){
  546. InventoryQuantity_BBB = new BigDecimal(data2.get("numberField_m8obn6wk").toString());//可用库存数量
  547. }else {
  548. InventoryQuantity_BBB = BigDecimal.valueOf(0);
  549. }
  550. System.out.println("---------------------------------------零部件子表数据修改完毕--------------------------------");
  551. // BigDecimal FreezeQuantity_AAA = FreezeQuantity.subtract( new BigDecimal( map1.get("numberField_ma0e13js").toString()));//冻结数量(新) = 冻结数量 - 退货数量
  552. //TODO:3、调出物料的可用库存
  553. BigDecimal AvailableQuantity_AAA = AvailableInventoryQuantity_AAA.subtract(new BigDecimal( map1.get("numberField_m9grj2ij").toString()));//可用存库数量(新) = 可用库存数量 - 调拨数量
  554. BigDecimal Quantity_AAA = InventoryQuantity_AAA.subtract(new BigDecimal(map1.get("numberField_m9grj2ij").toString()));//存库数量(新) = 存库数量 - 调拨数量
  555. //TODO:4、调入物料的可用库存
  556. BigDecimal AvailableQuantity_BBB = AvailableInventoryQuantity_BBB.add(new BigDecimal( map1.get("numberField_m9grj2ij").toString()));//可用存库数量(新) = 可用库存数量 + 调拨数量
  557. BigDecimal Quantity_BBB = InventoryQuantity_BBB.add(new BigDecimal(map1.get("numberField_m9grj2ij").toString()));
  558. ydClient.operateData(YDParam.builder().formInstId(LBJId)
  559. .formUuid("FORM-2353BE632D97434DAD55AEBD0866C44DVAT5")
  560. .appType("APP_GNQ1RGK68X4JNZUEU8RQ")
  561. .systemToken("XH866P81QDOTQ0218TGZM9WCNXOF24WIP488M7A5")
  562. .updateFormDataJson(JSONObject.toJSONString(UtilMap.map("numberField_m8gz97nk, numberField_m8obn6wk",AvailableQuantity_AAA,Quantity_AAA)))
  563. .userId("332051151139376769")
  564. .build(),YDConf.FORM_OPERATION.update);
  565. ydClient.operateData(YDParam.builder().formInstId(LBJId2)
  566. .formUuid("FORM-2353BE632D97434DAD55AEBD0866C44DVAT5")
  567. .appType("APP_GNQ1RGK68X4JNZUEU8RQ")
  568. .systemToken("XH866P81QDOTQ0218TGZM9WCNXOF24WIP488M7A5")
  569. .updateFormDataJson(JSONObject.toJSONString(UtilMap.map("numberField_m8gz97nk, numberField_m8obn6wk",AvailableQuantity_BBB,Quantity_BBB)))
  570. .userId("332051151139376769")
  571. .build(),YDConf.FORM_OPERATION.update);
  572. System.out.println("----------------------零部件主表数据修改完毕!------------------");
  573. }
  574. return McR.success();
  575. }
  576. @Override
  577. public McR goodsInandOut(Map map) {
  578. String formInstId = UtilMap.getString(map,"formInstId");//实例id(进货退货流程)
  579. log.info("进货退货流程实例id:"+formInstId);
  580. Map data = ydClient.queryData(YDParam.builder().formInstId(formInstId)
  581. .formUuid("FORM-0D92610ED4AA4B81988CA190EE9A119EX37F")
  582. .appType("APP_GNQ1RGK68X4JNZUEU8RQ")
  583. .systemToken("XH866P81QDOTQ0218TGZM9WCNXOF24WIP488M7A5")
  584. .userId("332051151139376769").build(), YDConf.FORM_QUERY.retrieve_id).getFormData();
  585. System.out.println("进货退货流程:"+data);
  586. List<Map> mapList = (List<Map>)data.get("tableField_ml07z7bh");
  587. System.out.println("退货单明细数据:"+mapList);
  588. ArrayList<Object> entries = new ArrayList<>();
  589. for (Map map1 : mapList){
  590. String LBJId = map1.get("textField_ml09d5ys").toString();//零部件的实例id
  591. System.out.println("物料名称:"+map1.get("textField_ml07z7bi").toString());//物料名称
  592. System.out.println("所属库位:"+map1.get("textField_ml09riy7").toString());//产品库位
  593. System.out.println("退货数量:"+map1.get("numberField_ml07z7bp").toString());//退货数量
  594. Map data1 = ydClient.queryData(YDParam.builder().formInstId(LBJId)
  595. .formUuid("FORM-2353BE632D97434DAD55AEBD0866C44DVAT5")
  596. .appType("APP_GNQ1RGK68X4JNZUEU8RQ")
  597. .systemToken("XH866P81QDOTQ0218TGZM9WCNXOF24WIP488M7A5")
  598. .userId("332051151139376769").build(), YDConf.FORM_QUERY.retrieve_id).getFormData();
  599. System.out.println(map1.get("textField_ml07z7bi")+"明细表数据:"+data1.get("tableField_m96gje14"));//零部件明细
  600. String s = data1.get("tableField_m96gje14").toString();
  601. String warehouse = JSON.parseArray(s).getJSONObject(0).get("selectField_m88f1qi8").toString();//所属仓库
  602. String WarehouseLocation = JSON.parseArray(s).getJSONObject(0).get("textField_m8mnxgql").toString();//所属库位
  603. String SafetyValue = JSON.parseArray(s).getJSONObject(0).get("numberField_m8873fn4").toString();//安全库存值
  604. BigDecimal numberFieldM9c8n9go = new BigDecimal(JSON.parseArray(s).getJSONObject(0).get("numberField_m9c8n9go").toString());//仓库数量
  605. // new BigDecimal(map1.get("numberField_ma0e13js").toString()).add(numberFieldM9c8n9go);
  606. BigDecimal numm = numberFieldM9c8n9go.subtract(new BigDecimal(map1.get("numberField_ml07z7bp").toString()));//退货后的库存数量 = 仓库数量(子) - 退货数量
  607. ArrayList<Map<String,String>> maps_YD = new ArrayList<>();
  608. Map sss=new HashMap<>();
  609. sss.put("selectField_m88f1qi8",warehouse);//所属仓库
  610. sss.put("textField_m8mnxgql",WarehouseLocation);//所属库位
  611. sss.put("numberField_m8873fn4",SafetyValue);//安全库存值
  612. sss.put("numberField_m9c8n9go",numm);//仓库数量
  613. maps_YD.add(sss);
  614. ydClient.operateData(YDParam.builder().formInstId(LBJId)
  615. .formUuid("FORM-2353BE632D97434DAD55AEBD0866C44DVAT5")
  616. .appType("APP_GNQ1RGK68X4JNZUEU8RQ")
  617. .systemToken("XH866P81QDOTQ0218TGZM9WCNXOF24WIP488M7A5")
  618. .updateFormDataJson(JSONObject.toJSONString(UtilMap.map("tableField_m96gje14",maps_YD)))
  619. .userId("332051151139376769").build(),YDConf.FORM_OPERATION.update);
  620. BigDecimal InventoryQuantity = null;
  621. if(!data1.get("numberField_m8gz97nk_value").toString().isEmpty()){
  622. InventoryQuantity = new BigDecimal( data1.get("numberField_m8gz97nk").toString());//可用库存数量
  623. }else {
  624. InventoryQuantity = BigDecimal.valueOf(0);
  625. }
  626. BigDecimal VirtualQuantity1 = null;
  627. if(!data1.get("numberField_m8obn6wl_value").toString().isEmpty()){
  628. VirtualQuantity1 = new BigDecimal( data1.get("numberField_m8obn6wl").toString());//虚拟数量
  629. }else {
  630. VirtualQuantity1 = BigDecimal.valueOf(0);
  631. }
  632. System.out.println("---------------------------------------零部件子表数据修改完毕--------------------------------");
  633. BigDecimal VirtualQuantity1_AAA = VirtualQuantity1.subtract( new BigDecimal( map1.get("numberField_ml07z7bp").toString()));//虚拟数量(新) = 虚拟数量 - 退货数量
  634. BigDecimal AvailableQuantity_AAA = InventoryQuantity.subtract(new BigDecimal( map1.get("numberField_ml07z7bp").toString()));//可用存库数量(新) = 可用库存数量 - 退货数量
  635. ydClient.operateData(YDParam.builder().formInstId(LBJId)
  636. .formUuid("FORM-2353BE632D97434DAD55AEBD0866C44DVAT5")
  637. .appType("APP_GNQ1RGK68X4JNZUEU8RQ")
  638. .systemToken("XH866P81QDOTQ0218TGZM9WCNXOF24WIP488M7A5")
  639. .updateFormDataJson(JSONObject.toJSONString(UtilMap.map("numberField_m8obn6wq, numberField_m8gz97nk",VirtualQuantity1_AAA,AvailableQuantity_AAA)))
  640. .userId("332051151139376769")
  641. .build(),YDConf.FORM_OPERATION.update);
  642. System.out.println("----------------------零部件主表数据修改完毕!------------------");
  643. }
  644. return McR.success();
  645. }
  646. @Override
  647. public McR shareRecord(Map data) {
  648. String pid = getString(data.get("pid"));
  649. if (Strings.isNotBlank(pid)){
  650. //发起审批
  651. String[] dd = McProject.getDd(pid);
  652. String appKey = "";
  653. String appSecret = "";
  654. String agentId = "";
  655. if (!PublicUtil.isNull(pid) && dd != null && dd.length >= 3) {
  656. appKey = dd[0];
  657. appSecret = dd[1];
  658. agentId = dd[2];
  659. }
  660. String[] yida = McProject.getYida(pid);
  661. String appType = "";
  662. String systemToken = "";
  663. if (!PublicUtil.isNull(pid) && dd != null && dd.length >= 2) {
  664. appType = yida[0];
  665. systemToken = yida[1];
  666. }
  667. // 执行分享逻辑 [ 拼接后的权限组 ]
  668. McException.assertParamException_Null(data, "compId, userIds, userId, atUserId, isNotice");
  669. //开始抓取宜搭对应的子表数据
  670. String processInstanceId = data.get("processInstanceId").toString();
  671. List<String> atUserId = (List<String>) data.get("atUserId");
  672. Map map = new HashMap();
  673. map.put(UtilMap.getString(data, "compId"),UtilMap.getList(data, "userIds"));
  674. ydClient.operateData(YDParam.builder()
  675. .appType(appType)
  676. .systemToken(systemToken)
  677. .formInstId(processInstanceId)
  678. .updateFormDataJson(JSON.toJSONString(map))
  679. .build(), YDConf.FORM_OPERATION.update);
  680. String userIds = String.valueOf(data.get("atUserId"));
  681. String[] split = userIds.split(",");
  682. ArrayList<String> names = new ArrayList<>();
  683. for(Object auserId : split){
  684. DDR_New ddrNew = (DDR_New) UtilHttp.doPost("https://oapi.dingtalk.com/topapi/v2/user/get", null, ddClient.initTokenParams(), UtilMap.map("userid", auserId), DDR_New.class);
  685. Object result = ddrNew.getResult();
  686. if (result != null) {
  687. JSONObject jsonObject = JSONObject.parseObject(JSONObject.toJSONString(result));
  688. String name = jsonObject.getString("name");
  689. names.add(name);
  690. }
  691. }
  692. List<Map> searchCondition = new ArrayList<>();
  693. searchCondition.addAll(Arrays.asList(
  694. YDConf.searchCondition_TextFiled(data.get("processKey").toString(), data.get("processInstanceId").toString(),"eq")
  695. ));
  696. String title = UtilMap.getString(data, "content").isEmpty() || !ObjectUtil.isNotNull(UtilMap.getString(data, "content")) ? "单据分享" : UtilMap.getString(data, "content");
  697. ydClient.operateData(YDParam.builder()
  698. .appType(appType)
  699. .systemToken(systemToken)
  700. .searchCondition(JSON.toJSONString(searchCondition))
  701. .formUuid(data.get("formId").toString())
  702. .formDataJson(JSON.toJSONString(UtilMap.map(data.get("processKey").toString()+", "+data.get("empKey").toString()+", "+data.get("titleKey").toString(),
  703. data.get("processInstanceId").toString(),UtilMap.getList(data, "userIds"),title)))
  704. .useLatestVersion(true)
  705. .build(), YDConf.FORM_OPERATION.upsert);//upsert_v2
  706. if (UtilMap.getBoolean(data, "isNotice")) {
  707. // data.put("content", names.stream().collect(Collectors.joining(",")) + UtilMap.getString(data, "content"));
  708. String appUrl = data.get("appUrl").toString();
  709. String pcUrl = data.get("pcUrl").toString();
  710. if ( !ObjectUtil.isNotNull(UtilMap.getString(data,"sendType")) || UtilMap.getString(data,"sendType").isEmpty() || "工作通知".equals(UtilMap.getString(data,"sendType"))){
  711. Map<String, String> contentMap = new HashMap<>();
  712. contentMap.put("title",title);
  713. contentMap.put("text",title);
  714. contentMap.put("picUrl",pcUrl+"/processDetail"+"?procInsId="+processInstanceId);
  715. contentMap.put("messageUrl",pcUrl+"/processDetail"+"?procInsId="+processInstanceId);
  716. Map<String, Object> msg = new HashMap<>();
  717. msg.put("msgtype","link");
  718. msg.put("link",contentMap);
  719. sendNotification(ddClient.getAccessToken(appKey,appSecret),atUserId,null,false,msg,agentId);
  720. } else if ("钉钉代办".equals(UtilMap.getString(data, "sendType"))) {
  721. /*查询钉钉人员*/
  722. ddClientWorkflow.createTBTask(ddClient.getAccessToken(appKey,appSecret),UtilMap.getString(data, "userId"),"流程分享:"+UtilMap.getString(data, "content"),UtilMap.getString(data, "content"),
  723. UtilDateTime.getLocalDateTimeTimeStamp(LocalDate.now().plusDays(7).atTime(LocalTime.MAX)), atUserId,null
  724. ,UtilMap.map("appUrl, pcUrl",appUrl+"/processDetail"+"?procInsId="+processInstanceId,pcUrl+"/processDetail"+"?procInsId="+processInstanceId),false,30,UtilMap.map("dingNotify","1"));
  725. }
  726. }
  727. return McR.success();
  728. }
  729. return McR.errorParam("参数缺失!");
  730. }
  731. @Override
  732. public McR approveTask(Map map) {
  733. String outResult = UtilMap.getString(map, "outResult");
  734. String userId = UtilMap.getString(map, "userId");
  735. String processInstanceId = UtilMap.getString(map, "processInstanceId");
  736. String activityId = UtilMap.getString(map, "activityId");
  737. long taskId = 0;
  738. //获取审批记录
  739. List<Map> result = (List<Map>) ydClient.queryData(YDParam.builder()
  740. .processInstanceId(processInstanceId)
  741. .build(),YDConf.FORM_QUERY.retrieve_approval_record).getResult();
  742. for (Map approveInfo : result) {
  743. if (activityId.equals(UtilMap.getString(approveInfo, "activityId"))){
  744. //获取taskId
  745. taskId = UtilMap.getLong(approveInfo, "taskId");
  746. break;
  747. }
  748. }
  749. //审批
  750. Map body = new HashMap();
  751. body.put("outResult",outResult);//AGREE:同意 DISAGREE:拒绝。
  752. body.put("appType",ydConf.getAppType());
  753. body.put("systemToken",ydConf.getSystemToken());
  754. body.put("remark",outResult);//审批意见
  755. body.put("processInstanceId",processInstanceId);//审批实例id
  756. body.put("userId",userId);//用户userid
  757. body.put("taskId",taskId);//任务id
  758. UtilHttp.doPost("https://api.dingtalk.com/v1.0/yida/tasks/execute", ddClient.initTokenHeader(), null,body);
  759. return McR.success();
  760. }
  761. @Override
  762. public McR syncYdAuth(Map map) {
  763. String matrixId = UtilMap.getString(map, "matrixId");//矩阵id
  764. String corpId = UtilMap.getString(map, "corpId");//corpId
  765. String userId = UtilMap.getString(map, "userId");//userId
  766. String corpToken = UtilMap.getString(map, "corpToken");//corpToken
  767. String formInstId = UtilMap.getString(map, "formInstId");//实例id
  768. String[] conditionColumns = UtilMap.getString(map, "conditionColumns").split(",");//矩阵表条件列(名称)
  769. String[] conditionColumnValues = UtilMap.getString(map, "conditionColumnValues").split(",");;//矩阵表条件列值
  770. String[] resultColumns = UtilMap.getString(map, "resultColumns").split(",");;//矩阵表角色列(名称)
  771. String[] resultColumnFields = UtilMap.getString(map, "resultColumnFields").split(",");;//矩阵表角色列值(表单成员组件唯一标识)
  772. String[] conditionColumnIds = new String[conditionColumns.length];//矩阵表条件列(id)
  773. String[] resultColumnIds = new String[resultColumns.length];//矩阵表角色列(id)
  774. List<List<String>> resultColumnValues = new ArrayList<>();//矩阵表角色列值
  775. //md5加密corpId,userId,corpToken
  776. String token = DigestUtils.md5Hex(corpId + userId + corpToken).toUpperCase();
  777. //查询矩阵明细
  778. Map params = new HashMap();
  779. int pageSize = 100;
  780. int pageNumber = 0;
  781. params.put("pageSize",pageSize);
  782. params.put("matrixId",matrixId);
  783. params.put("corpId",corpId);
  784. params.put("userId",userId);
  785. params.put("token",token);
  786. List<Map> data = new ArrayList<>();
  787. String rowId = "";
  788. int totalCount = 0;
  789. //查询矩阵所有明细
  790. do {
  791. pageNumber++;
  792. params.put("pageNumber",pageNumber);
  793. DDR_New ddrNew = (DDR_New) UtilHttp.doGet("https://api.dingtalk.com/v2.0/yida/forms/resources/matrices", ddClient.initTokenHeader(), params, DDR_New.class);
  794. Map result = (Map) ddrNew.getResult();
  795. Map matrixData = UtilMap.getMap(result, "matrixData");
  796. data.addAll(UtilMap.getList(matrixData, "data"));
  797. totalCount = UtilMap.getInt(matrixData, "totalCount");
  798. //查询列id
  799. if (pageNumber == 1){
  800. Map matrixTable = UtilMap.getMap(result, "matrixTable");
  801. List<Map> conditionColumnList = UtilMap.getList(matrixTable, "conditionColumn");
  802. List<Map> resultColumnList = UtilMap.getList(matrixTable, "resultColumn");
  803. for (int i = 0; i < conditionColumns.length; i++) {
  804. int finalI = i;
  805. Map conditionColumn = conditionColumnList.stream().filter(item -> UtilMap.getString(item, "name").equals(conditionColumns[finalI])).findFirst().orElse(null);
  806. conditionColumnIds[i] = UtilMap.getString(conditionColumn, "columnId");
  807. }
  808. for (int i = 0; i < resultColumns.length; i++) {
  809. int finalI = i;
  810. Map resultColumn = resultColumnList.stream().filter(item -> UtilMap.getString(item, "name").equals(resultColumns[finalI])).findFirst().orElse(null);
  811. resultColumnIds[i] = UtilMap.getString(resultColumn, "columnId");
  812. }
  813. }
  814. }while (pageNumber * pageSize < totalCount);
  815. //查询实例详情获取矩阵表角色列值
  816. Map formData = ydClient.queryData(YDParam.builder().formInstId(formInstId).build(), YDConf.FORM_QUERY.retrieve_id).getFormData();
  817. for (int i = 0; i < resultColumnFields.length; i++) {
  818. List<String> employees = UtilMap.getList(formData, resultColumnFields[i] + "_id");
  819. resultColumnValues.add(employees);
  820. }
  821. boolean flag = false;
  822. //查询该矩阵条件是否存在
  823. for (Map datum : data) {
  824. for (int i = 0; i < conditionColumnIds.length; i++) {
  825. if (conditionColumnValues[i].equals(UtilMap.getString(datum, conditionColumnIds[i]))){
  826. flag = true;
  827. }else {
  828. flag = false;
  829. }
  830. }
  831. if (flag){
  832. rowId = UtilMap.getString(datum, "rowId");
  833. break;
  834. }
  835. }
  836. //更新矩阵明细
  837. Map matrixData = new HashMap();
  838. if (Strings.isBlank(rowId)){
  839. matrixData.put("isNew",1);//新增
  840. }else {
  841. matrixData.put("rowId",rowId);//更新
  842. }
  843. for (int i = 0; i < conditionColumnIds.length; i++) {
  844. matrixData.put(conditionColumnIds[i],conditionColumnValues[i]);
  845. }
  846. for (int i = 0; i < resultColumnIds.length; i++) {
  847. matrixData.put(resultColumnIds[i],resultColumnValues.get(i));
  848. }
  849. Map body = params;
  850. body.put("dataJson",JSONObject.toJSONString(Arrays.asList(matrixData)));
  851. UtilHttp.doPost("https://api.dingtalk.com/v2.0/yida/forms/resources/matrices/upsert", ddClient.initTokenHeader(), null,body, DDR_New.class);
  852. return McR.success();
  853. }
  854. @Override
  855. public McR delYdAuth(Map map) {
  856. String matrixId = UtilMap.getString(map, "matrixId");//矩阵id
  857. String corpId = UtilMap.getString(map, "corpId");//corpId
  858. String userId = UtilMap.getString(map, "userId");//userId
  859. String corpToken = UtilMap.getString(map, "corpToken");//corpToken
  860. String[] conditionColumns = UtilMap.getString(map, "conditionColumns").split(",");//矩阵表条件列(名称)
  861. String[] conditionColumnValues = UtilMap.getString(map, "conditionColumnValues").split(",");;//矩阵表条件列值
  862. String[] conditionColumnIds = new String[conditionColumns.length];//矩阵表条件列(id)
  863. //md5加密corpId,userId,corpToken
  864. String token = DigestUtils.md5Hex(corpId + userId + corpToken).toUpperCase();
  865. //查询矩阵明细
  866. Map params = new HashMap();
  867. int pageSize = 100;
  868. int pageNumber = 0;
  869. params.put("pageSize",pageSize);
  870. params.put("matrixId",matrixId);
  871. params.put("corpId",corpId);
  872. params.put("userId",userId);
  873. params.put("token",token);
  874. List<Map> data = new ArrayList<>();
  875. String rowId = "";
  876. int totalCount = 0;
  877. //查询矩阵所有明细
  878. do {
  879. pageNumber++;
  880. params.put("pageNumber",pageNumber);
  881. DDR_New ddrNew = (DDR_New) UtilHttp.doGet("https://api.dingtalk.com/v2.0/yida/forms/resources/matrices", ddClient.initTokenHeader(), params, DDR_New.class);
  882. Map result = (Map) ddrNew.getResult();
  883. Map matrixData = UtilMap.getMap(result, "matrixData");
  884. data.addAll(UtilMap.getList(matrixData, "data"));
  885. totalCount = UtilMap.getInt(matrixData, "totalCount");
  886. //查询列id
  887. if (pageNumber == 1){
  888. Map matrixTable = UtilMap.getMap(result, "matrixTable");
  889. List<Map> conditionColumnList = UtilMap.getList(matrixTable, "conditionColumn");
  890. for (int i = 0; i < conditionColumns.length; i++) {
  891. int finalI = i;
  892. Map conditionColumn = conditionColumnList.stream().filter(item -> UtilMap.getString(item, "name").equals(conditionColumns[finalI])).findFirst().orElse(null);
  893. conditionColumnIds[i] = UtilMap.getString(conditionColumn, "columnId");
  894. }
  895. }
  896. }while (pageNumber * pageSize < totalCount);
  897. boolean flag = false;
  898. //查询该矩阵条件是否存在
  899. for (Map datum : data) {
  900. for (int i = 0; i < conditionColumnIds.length; i++) {
  901. if (conditionColumnValues[i].equals(UtilMap.getString(datum, conditionColumnIds[i]))){
  902. flag = true;
  903. }else {
  904. flag = false;
  905. }
  906. }
  907. if (flag){
  908. rowId = UtilMap.getString(datum, "rowId");
  909. break;
  910. }
  911. }
  912. //删除矩阵明细
  913. if (Strings.isBlank(rowId)){
  914. return McR.errorUnknown("该矩阵条件不存在");
  915. }else {
  916. Map body = params;
  917. body.put("rowIds",rowId);
  918. UtilHttp.doPost("https://api.dingtalk.com/v2.0/yida/forms/resources/matrices/remove", ddClient.initTokenHeader(), null,body, DDR_New.class);
  919. }
  920. return McR.success();
  921. }
  922. @Override
  923. public void getCheckInData(JSONObject eventJson) {
  924. MDC.put("MDC_KEY_PID","1000");
  925. String baseId = "YMyQA2dXW7LkEz9LcDgZZDzPVzlwrZgb";//AI表格ID
  926. String sheetIdOrName = "签到数据";//数据表ID或数据表名称
  927. int retryCount = 0;
  928. int maxRetries = 5;
  929. long timeStamp = roundToNearestThousand(Long.parseLong(eventJson.getString("timeStamp")));//签到时间戳
  930. String staffId = eventJson.getString("StaffId");//签到人userId
  931. String eventId = eventJson.getString("eventId");//签到事件id
  932. while (retryCount <= maxRetries) {
  933. try {
  934. //获取签到数据
  935. Map body = new HashMap();
  936. body.put("cursor",0);
  937. body.put("size",100);
  938. body.put("start_time",timeStamp);
  939. body.put("end_time",timeStamp);
  940. body.put("userid_list",staffId);
  941. //查询用户详情
  942. DDR_New ddrNew1 = (DDR_New) UtilHttp.doPost("https://oapi.dingtalk.com/topapi/v2/user/get", null, ddClient.initTokenParams(), UtilMap.map("userid", staffId), DDR_New.class);
  943. Map result1 = (Map) ddrNew1.getResult();
  944. String userName = UtilMap.getString(result1, "name");
  945. String unionid = UtilMap.getString(result1, "unionid");
  946. //查询用户考勤数据
  947. DDR_New ddrNew = (DDR_New) UtilHttp.doPost("https://oapi.dingtalk.com/topapi/checkin/record/get", null, ddClient.initTokenParams(), body, DDR_New.class);
  948. Map result = (Map) ddrNew.getResult();
  949. List list = UtilMap.getList(result, "page_list");
  950. if (!list.isEmpty()){
  951. Map fields = new HashMap();
  952. Map checkInData = (Map) list.get(0);
  953. Long checkinTime = UtilMap.getLong(checkInData, "checkin_time");
  954. String detailPlace = UtilMap.getString(checkInData, "detail_place");
  955. String remark = UtilMap.getString(checkInData,"remark");
  956. Map user = new HashMap();
  957. user.put("unionId",unionid);
  958. fields.put("9XFXz5d",Arrays.asList(user));//签到人
  959. fields.put("mKUEya0",checkinTime);//签到时间
  960. fields.put("mHe1U1b",detailPlace);//签到地点
  961. fields.put("CngGPET",remark);//备注
  962. Map records = new HashMap();
  963. Map fieldsMap = new HashMap();
  964. fieldsMap.put("fields",fields);
  965. records.put("records",Arrays.asList(fieldsMap));
  966. Map param = new HashMap();
  967. param.put("operatorId",unionid);
  968. UtilHttp.doPost("https://api.dingtalk.com/v1.0/notable/bases/"+baseId+"/sheets/"+sheetIdOrName+"/records",ddClient.initTokenHeader(),param,records);
  969. }
  970. break;
  971. } catch (Exception e) {
  972. if (retryCount < maxRetries){
  973. retryCount++;
  974. log.info("eventId:{},第{}次重试,异常信息:{}",eventId, retryCount, e.getMessage());
  975. try {
  976. Thread.sleep(5000);
  977. } catch (InterruptedException ie) {
  978. Thread.currentThread().interrupt();// 如果线程在等待期间被中断,恢复中断状态
  979. throw new RuntimeException("Request interrupted", ie);// 抛出运行时异常,终止重试
  980. }
  981. continue;
  982. }
  983. throw new RuntimeException("eventId:" + eventId + ",超出最大重试次数,异常信息:" + e.getMessage());
  984. }
  985. }
  986. }
  987. public String sendNotification(String access_token, List<String> userid_list, List<String> dept_id_list, boolean to_all_user, Map msg, String agent_id) {
  988. Map body = UtilMap.map("agent_id, to_all_user, msg", new Object[]{agent_id, to_all_user, msg});
  989. if (UtilList.isNotEmpty(userid_list)) {
  990. body.put("userid_list", String.join(",", userid_list));
  991. }
  992. if (UtilList.isNotEmpty(dept_id_list)) {
  993. body.put("dept_id_list", String.join(",", dept_id_list));
  994. }
  995. DDR ddr = DDR.doPost("https://oapi.dingtalk.com/topapi/message/corpconversation/asyncsend_v2", (Map)null, DDConf.initTokenParams(access_token), body);
  996. return ddr.getTask_id();
  997. }
  998. public long roundToNearestThousand(long timestamp) {
  999. // 将时间戳除以1000,得到秒级部分(带毫秒的小数部分)
  1000. double seconds = timestamp / 1000.0;
  1001. // 对秒级部分的个位数进行四舍五入(即对毫秒的千位四舍五入)
  1002. long roundedSeconds = Math.round(seconds);
  1003. // 将四舍五入后的秒级部分转换回毫秒时间戳
  1004. return roundedSeconds * 1000;
  1005. }
  1006. @Async
  1007. @Override
  1008. public void batchUpdateSpecifiedQuantityData(Map map) {
  1009. try {
  1010. String pid = UtilMap.getString(map, "pid");
  1011. MDC.put("MDC_KEY_PID",pid);
  1012. String formInstId = UtilMap.getString(map, "formInstId");//当前表实例id
  1013. //查询当前表formData
  1014. Map formData = ydClient.queryData(YDParam.builder()
  1015. .formInstanceId(formInstId)
  1016. .build(), YDConf.FORM_QUERY.retrieve_id).getFormData();
  1017. //目标表筛选字段唯一标识
  1018. String[] searchFields = UtilMap.getString(map, "searchFieldStr").split(",");
  1019. //目标表筛选字段值
  1020. String[] searchFieldValues = UtilMap.getString(map, "searchFieldValueStr").split(",");
  1021. Map searchCondition = new HashMap();
  1022. if (searchFields.length == searchFieldValues.length){
  1023. for (int i = 0; i < searchFields.length; i++) {
  1024. searchCondition.put(searchFields[i],searchFieldValues[i]);
  1025. }
  1026. }else {
  1027. log.info("筛选字段和筛选值数量不一致");
  1028. }
  1029. int quantity = UtilMap.getInt(map, "quantity");//指定更新数量
  1030. if (quantity > 100){
  1031. log.info("更新数量不能大于100");
  1032. }
  1033. String formUuid = UtilMap.getString(map, "formUuid");//目标表uuid
  1034. List<Map> data = (List<Map>) ydClient.queryData(YDParam.builder()
  1035. .searchCondition(JSONObject.toJSONString(searchCondition))
  1036. .formUuid(formUuid)
  1037. .pageSize(quantity)
  1038. .build(), YDConf.FORM_QUERY.retrieve_list).getData();
  1039. //目标表更新字段唯一标识
  1040. String[] fieldStrs = UtilMap.getString(map, "fieldStr").split(",");
  1041. //当前表字段唯一标识
  1042. String[] currentFieldStrs = UtilMap.getString(map, "currentFieldStrs").split(",");
  1043. Map updateFormData = new HashMap();
  1044. if (fieldStrs.length == currentFieldStrs.length){
  1045. for (int i = 0; i < fieldStrs.length; i++) {
  1046. updateFormData.put(fieldStrs[i],YDConf.getDataByCompId(formData,currentFieldStrs[i]));
  1047. }
  1048. }else {
  1049. log.info("更新字段和当前表字段数量不一致");
  1050. }
  1051. for (Map datum : data) {
  1052. String formInstanceId = UtilMap.getString(datum, "formInstanceId");
  1053. ydClient.operateData(YDParam.builder()
  1054. .formInstanceId(formInstanceId)
  1055. .updateFormDataJson(JSONObject.toJSONString(updateFormData))
  1056. .build(), YDConf.FORM_OPERATION.update);
  1057. }
  1058. log.info("批量更新成功");
  1059. }catch (Exception e){
  1060. log.info("更新数据失败:{}",e.getMessage());
  1061. }
  1062. }
  1063. private static void extractOperatorIds(JSONArray array, List<String> result) {
  1064. for (Object item : array) {
  1065. JSONObject obj = (JSONObject) item;
  1066. // 提取当前层级的 operatorUserId 或 operator
  1067. String userId = obj.getString("operatorUserId");
  1068. if (userId == null) userId = obj.getString("operator"); // 处理 domainList 中的字段
  1069. if (userId != null) result.add(userId);
  1070. // 递归处理 domainList
  1071. JSONArray domainList = obj.getJSONArray("domainList");
  1072. if (domainList != null && !domainList.isEmpty()) {
  1073. extractOperatorIds(domainList, result);
  1074. }
  1075. }
  1076. }
  1077. private String getString(Object obj){
  1078. return obj == null ? "" : obj.toString();
  1079. }
  1080. private List<Map> getTableData(List<Map<String, ?>> details){
  1081. List<Map> table = new ArrayList<>();
  1082. for (Map detail : details) {
  1083. Map row = UtilMap.empty();
  1084. for (String subId : details.get(0).keySet()) {
  1085. // ppExt: 组件会返回带有_id/_value字段, 关联表单 & 成员组件赋值为原字段 [关联表单仅仅会返回带Id字段, 成员组件不带Id返回姓名过滤]
  1086. if (subId.endsWith("_value") || (subId.startsWith("employeeField_") && !subId.endsWith("_id"))) {
  1087. continue;
  1088. }
  1089. if (subId.endsWith("_id")) {
  1090. if (subId.startsWith("employeeField_") || subId.startsWith("associationFormField_")) {
  1091. subId = subId.replace("_id", "");
  1092. } else {
  1093. continue;
  1094. }
  1095. }
  1096. row.put(subId, YDConf.getDataByCompId(detail, subId));
  1097. }
  1098. table.add(row);
  1099. }
  1100. return table;
  1101. }
  1102. }