McYdServiceImpl.java 46 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842
  1. package com.malk.mc.service.impl;
  2. import cn.hutool.core.date.DateUtil;
  3. import cn.hutool.core.util.NumberUtil;
  4. import cn.hutool.core.util.ObjectUtil;
  5. import com.alibaba.fastjson.JSON;
  6. import com.alibaba.fastjson.JSONArray;
  7. import com.alibaba.fastjson.JSONObject;
  8. import com.malk.core.McProject;
  9. import com.malk.mc.service.McYdService;
  10. import com.malk.server.aliwork.YDConf;
  11. import com.malk.server.aliwork.YDParam;
  12. import com.malk.server.common.McException;
  13. import com.malk.server.common.McR;
  14. import com.malk.server.dingtalk.DDConf;
  15. import com.malk.server.dingtalk.DDR;
  16. import com.malk.server.dingtalk.DDR_New;
  17. import com.malk.service.aliwork.YDClient;
  18. import com.malk.service.aliwork.YDService;
  19. import com.malk.service.dingtalk.DDClient;
  20. import com.malk.service.dingtalk.DDClient_Contacts;
  21. import com.malk.service.dingtalk.DDClient_Notice;
  22. import com.malk.service.dingtalk.DDClient_Workflow;
  23. import com.malk.utils.*;
  24. import lombok.extern.slf4j.Slf4j;
  25. import org.apache.logging.log4j.util.Strings;
  26. import org.slf4j.MDC;
  27. import org.springframework.beans.factory.annotation.Autowired;
  28. import org.springframework.scheduling.annotation.Async;
  29. import org.springframework.stereotype.Service;
  30. import java.math.BigDecimal;
  31. import java.text.DecimalFormat;
  32. import java.time.LocalDate;
  33. import java.time.LocalTime;
  34. import java.util.*;
  35. import java.util.stream.Collectors;
  36. @Slf4j
  37. @Service
  38. public class McYdServiceImpl implements McYdService {
  39. @Autowired
  40. private YDClient ydClient;
  41. @Autowired
  42. private DDClient ddClient;
  43. @Autowired
  44. private DDConf ddConf;
  45. @Autowired
  46. private YDConf ydConf;
  47. @Autowired
  48. private DDClient_Workflow ddClientWorkflow;
  49. @Autowired
  50. private DDClient_Notice ddClientNotice;
  51. @Autowired
  52. private DDClient_Contacts ddClient_contacts;
  53. @Override
  54. @Async
  55. public void updateFormDataVersion(Map map) {
  56. String pid = Objects.nonNull(map.get("pid")) ? map.get("pid").toString() : "";
  57. String formInstId = Objects.nonNull(map.get("formInstId")) ? map.get("formInstId").toString() : "";
  58. String formUuid = Objects.nonNull(map.get("formUuid")) ? map.get("formUuid").toString() : "";
  59. if (Strings.isNotBlank(pid)){
  60. MDC.put("MDC_KEY_PID",pid);
  61. if (Strings.isNotBlank(formInstId) && Strings.isBlank(formUuid)){
  62. ydClient.operateData(YDParam.builder()
  63. .formInstId(formInstId)
  64. .useLatestVersion(true)
  65. .updateFormDataJson("{}").build(), YDConf.FORM_OPERATION.update);
  66. }else if (Strings.isBlank(formInstId) && Strings.isNotBlank(formUuid)){
  67. int i = 1;
  68. int pageSize = 10;
  69. DDR_New ddrNew = null;
  70. do {
  71. int i1 =1 ;
  72. boolean flag1 = false;
  73. while (i1<=5 && !flag1) {
  74. try {
  75. ddrNew = ydClient.queryData(YDParam.builder()
  76. .formUuid(formUuid)
  77. .pageNumber(i)
  78. .pageSize(pageSize)
  79. .build(), YDConf.FORM_QUERY.retrieve_search_form_id);
  80. List<String> formInstIdList = (List<String>) ddrNew.getData();
  81. //noExecuteExpression字段不传或传false 传true会导致实例版本不更新或滞后更新
  82. ydClient.operateData(YDParam.builder()
  83. .formInstanceIdList(formInstIdList)
  84. .formUuid(formUuid)
  85. .useLatestFormSchemaVersion(true)
  86. .updateFormDataJson("{}")
  87. .noExecuteExpression(false)
  88. .asynchronousExecution(false)
  89. .build(),YDConf.FORM_OPERATION.multi_update);
  90. i++;
  91. flag1 = true;
  92. }catch (Exception e){
  93. log.error("更新表单实例版本失败:{}, 重试次数:{}",e.getMessage(),i1);
  94. try {
  95. Thread.sleep(3000);
  96. } catch (InterruptedException ex) {
  97. throw new RuntimeException(ex);
  98. }
  99. i1++;
  100. }
  101. }
  102. if (i1 > 5){
  103. log.error("更新表单实例版本失败:{}");
  104. break;
  105. }
  106. }while (ddrNew.getTotalCount() > ddrNew.getPageNumber() * pageSize);
  107. }
  108. //发送工作通知给当前登陆人
  109. if (Objects.nonNull(map.get("userId"))){
  110. String userId = map.get("userId").toString();
  111. Map param2 = new HashMap();
  112. param2.put("access_token",ddClient.getAccessToken());
  113. Map body3 = new HashMap();
  114. body3.put("agent_id",ddConf.getAgentId());
  115. body3.put("userid_list",userId);
  116. Map msg = new HashMap();
  117. msg.put("msgtype","text");
  118. //获取当前时间 精确到秒
  119. String time = DateUtil.format(new Date(),"yyyy-MM-dd HH:mm:ss");
  120. msg.put("text", UtilMap.map("content","表单实例版本已更新 时间:" + time));
  121. body3.put("msg",msg);
  122. UtilHttp.doPost("https://oapi.dingtalk.com/topapi/message/corpconversation/asyncsend_v2",null,param2,body3);
  123. }
  124. }
  125. }
  126. @Override
  127. public McR initiateApproval(Map map) {
  128. String pid = getString(map.get("pid"));
  129. String formUuid = getString(map.get("formUuid"));
  130. String processCode = getString(map.get("processCode"));
  131. String userId = getString(map.get("userId"));
  132. Map formData = (Map) map.get("formData");
  133. Map processData = new HashMap();
  134. if (Objects.nonNull(map.get("processData"))){
  135. processData = (Map) map.get("processData");
  136. }
  137. if (Strings.isNotBlank(pid)){
  138. //发起审批
  139. String[] yida = McProject.getYida(pid);
  140. Map<String,Object> body = new HashMap<>();
  141. if (!PublicUtil.isNull(pid) && yida != null && yida.length >= 2) {
  142. body.put("appType",yida[0]);
  143. body.put("systemToken",yida[1]);
  144. }
  145. body.put("userId",userId);
  146. body.put("formUuid",formUuid);
  147. body.put("processCode",processCode);
  148. body.put("formDataJson", JSONObject.toJSONString(formData));
  149. if (Objects.nonNull(processData) && processData.size() > 0){
  150. body.put("processData", JSONObject.toJSONString(processData));
  151. }
  152. UtilHttp.doPost("https://api.dingtalk.com/v1.0/yida/processes/instances/start", ddClient.initTokenHeader(), null, body, DDR_New.class);
  153. return McR.success();
  154. }
  155. return McR.errorParam("参数缺失!");
  156. }
  157. @Override
  158. public McR convertSubTableNumber(Map map) {
  159. String formInstId = getString(map.get("formInstId"));
  160. String tableField = getString(map.get("tableField"));
  161. String numberFieldCode = getString(map.get("numFileCodes"));
  162. String textFieldCode = getString(map.get("textFieldCodes"));
  163. if (Strings.isNotBlank(formInstId)){
  164. DDR_New ddrNew = ydClient.queryData(YDParam.builder()
  165. .formInstId(formInstId)
  166. .build(), YDConf.FORM_QUERY.retrieve_id);
  167. Map formData = ddrNew.getFormData();
  168. Map updateMap=new HashMap();
  169. if (!PublicUtil.isNull(tableField)&&tableField.startsWith("tableField_")) {
  170. List<Map<String, ?>> table = UtilMap.getList( formData,(tableField));
  171. for (Map item : table) {
  172. String[] numberFieldCodes=numberFieldCode.split(",");
  173. String[] textFieldCodes=textFieldCode.split(",");
  174. for (int i = 0; i < numberFieldCodes.length; i++) {
  175. String numstr=UtilMap.getNumberStr(item,numberFieldCodes[i]);
  176. if(PublicUtil.isNull(numstr)||numstr.equals("0")){
  177. updateMap.put(textFieldCodes[i],"0.00");
  178. continue;
  179. }
  180. BigDecimal number = NumberUtil.toBigDecimal(numstr);
  181. // 创建一个 DecimalFormat 实例,指定千位分隔符模式
  182. DecimalFormat df = new DecimalFormat("#,###.00");
  183. // 格式化 double 数值
  184. String formattedText = df.format(number);
  185. item.put(textFieldCodes[i],formattedText);
  186. }
  187. }
  188. updateMap.put(tableField,getTableData(table)); // 添加一层过滤
  189. }
  190. if(!PublicUtil.isNull(map,"mainNumKeys","mainTextKeys")){
  191. String[] mainNumKeys=UtilMap.getString(map,"mainNumKeys").split(",");
  192. String[] mainTextKeys=UtilMap.getString(map,"mainTextKeys").split(",");
  193. for (int i = 0; i < mainNumKeys.length; i++) {
  194. String numstr=UtilMap.getNumberStr(formData,(mainNumKeys[i]));
  195. if(PublicUtil.isNull(numstr)||numstr.equals("0")){
  196. updateMap.put(mainTextKeys[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. updateMap.put(mainTextKeys[i],formattedText);
  205. }
  206. }
  207. ydClient.operateData(YDParam.builder()
  208. .formInstId(formInstId)
  209. .useLatestVersion(true)
  210. .updateFormDataJson(JSONObject.toJSONString(updateMap))
  211. .build(), YDConf.FORM_OPERATION.update);
  212. }
  213. return McR.success();
  214. }
  215. @Override
  216. public McR saveApproverToForm(Map map) {
  217. try {
  218. Thread.sleep(5000);
  219. } catch (InterruptedException e) {
  220. throw new RuntimeException(e);
  221. }
  222. String key = UtilMap.getString(map,"key");
  223. String formInstId = UtilMap.getString(map,"formInstId");
  224. JSONArray jsonArray=(JSONArray) ydClient.queryData(YDParam.builder().processInstanceId(formInstId).build(),YDConf.FORM_QUERY.retrieve_approval_record).getResult();
  225. List<String> userIds = new ArrayList<>();
  226. extractOperatorIds(jsonArray,userIds);
  227. ydClient.operateData(YDParam.builder().updateFormDataJson(JSONObject.toJSONString(UtilMap.map(key, userIds))).formInstId(formInstId).build(), YDConf.FORM_OPERATION.update);
  228. return McR.success();
  229. }
  230. @Override
  231. public McR multiLocationOutbound(Map map) {
  232. String formInstId = UtilMap.getString(map,"formInstId");//实例id(出库单)
  233. Map d = ydClient.queryData(YDParam.builder().formInstId(formInstId)
  234. .formUuid("FORM-3208DFE5463549A9A57FB94358A75E80PV5F")
  235. .appType("APP_GNQ1RGK68X4JNZUEU8RQ")
  236. .systemToken("XH866P81QDOTQ0218TGZM9WCNXOF24WIP488M7A5")
  237. .userId("332051151139376769").build(),YDConf.FORM_QUERY.retrieve_id).getFormData();
  238. System.out.println("出库单数据:"+d);
  239. List<Map> mapList = (List<Map>)d.get("tableField_m8mo8506");
  240. System.out.println("出库单明细数据:"+mapList);
  241. ArrayList<Object> entries = new ArrayList<>();
  242. for(Map map1 : mapList){
  243. String LBJId = map1.get("textField_ma1usp6o").toString();//零部件的实例id
  244. entries.add(LBJId);
  245. System.out.println("物料名称:"+map1.get("textField_m99kztjo").toString());
  246. BigDecimal InventoryCount = BigDecimal.valueOf(0);//库存数量
  247. BigDecimal OutboundQuantity = BigDecimal.valueOf(0);//
  248. if(!map1.get("numberField_m9qdwvu1_value").toString().isEmpty()){
  249. InventoryCount = new BigDecimal( map1.get("numberField_m9qdwvu1").toString());
  250. }
  251. BigDecimal numberFieldM9qdwvu1 = InventoryCount.subtract( new BigDecimal( map1.get("numberField_m8mo8508").toString()));//存库数量 - 出库数量
  252. System.out.println("出库后数量:"+numberFieldM9qdwvu1);
  253. Map d1 = ydClient.queryData(YDParam.builder().formInstId(LBJId)
  254. .formUuid("FORM-2353BE632D97434DAD55AEBD0866C44DVAT5")
  255. .appType("APP_GNQ1RGK68X4JNZUEU8RQ")
  256. .systemToken("XH866P81QDOTQ0218TGZM9WCNXOF24WIP488M7A5")
  257. .userId("332051151139376769").build(),YDConf.FORM_QUERY.retrieve_id).getFormData();
  258. System.out.println(map1.get("textField_m99kztjo").toString()+"的数据明细:"+ d1.get("tableField_m96gje14").toString());
  259. String s = d1.get("tableField_m96gje14").toString();
  260. String warehouse = JSON.parseArray(s).getJSONObject(0).get("selectField_m88f1qi8").toString();//所属仓库
  261. String WarehouseLocation = JSON.parseArray(s).getJSONObject(0).get("textField_m8mnxgql").toString();//所属库位
  262. String SafetyValue = JSON.parseArray(s).getJSONObject(0).get("numberField_m8873fn4").toString();//安全库存值
  263. ArrayList<Map<String,String>> maps_YD = new ArrayList<>();
  264. Map sss=new HashMap<>();
  265. sss.put("selectField_m88f1qi8",warehouse);//所属仓库
  266. sss.put("textField_m8mnxgql",WarehouseLocation);//所属库位
  267. sss.put("numberField_m8873fn4",SafetyValue);//安全库存值
  268. sss.put("numberField_m9c8n9go",numberFieldM9qdwvu1);//仓库数量
  269. maps_YD.add(sss);
  270. ydClient.operateData(YDParam.builder().formInstId(LBJId)
  271. .formUuid("FORM-2353BE632D97434DAD55AEBD0866C44DVAT5")
  272. .appType("APP_GNQ1RGK68X4JNZUEU8RQ")
  273. .systemToken("XH866P81QDOTQ0218TGZM9WCNXOF24WIP488M7A5")
  274. .updateFormDataJson(JSONObject.toJSONString(UtilMap.map("tableField_m96gje14",maps_YD)))
  275. .userId("332051151139376769").build(),YDConf.FORM_OPERATION.update);
  276. BigDecimal InventoryQuantity = new BigDecimal( d1.get("numberField_m8obn6wk").toString());//库存数量
  277. BigDecimal FreezeQuantity = null;
  278. if(!d1.get("numberField_m8obn6wl_value").toString().isEmpty()){
  279. FreezeQuantity = new BigDecimal( d1.get("numberField_m8obn6wl").toString());//冻结数量
  280. }else {
  281. FreezeQuantity = BigDecimal.valueOf(0);
  282. }
  283. System.out.println("--------------------零部件子表数据修改完毕!---------------------");
  284. BigDecimal FreezeQuantity_AAA = FreezeQuantity.add( new BigDecimal( map1.get("numberField_m8mo8508").toString()));//冻结数量(新)
  285. BigDecimal AvailableQuantity_AAA = numberFieldM9qdwvu1;//可用存库数量(新)
  286. ydClient.operateData(YDParam.builder().formInstId(LBJId)
  287. .formUuid("FORM-2353BE632D97434DAD55AEBD0866C44DVAT5")
  288. .appType("APP_GNQ1RGK68X4JNZUEU8RQ")
  289. .systemToken("XH866P81QDOTQ0218TGZM9WCNXOF24WIP488M7A5")
  290. .updateFormDataJson(JSONObject.toJSONString(UtilMap.map("numberField_m8obn6wl, numberField_m8gz97nk",FreezeQuantity_AAA,AvailableQuantity_AAA)))
  291. .userId("332051151139376769")
  292. .build(),YDConf.FORM_OPERATION.update);
  293. System.out.println("----------------------零部件主表数据修改完毕!------------------");
  294. }
  295. return McR.success();
  296. }
  297. @Override
  298. public McR WarehouseStorage(Map map) {
  299. String formInstId = UtilMap.getString(map,"formInstId");//实例id(入库单)
  300. Map d = ydClient.queryData(YDParam.builder().formInstId(formInstId)
  301. .formUuid("FORM-6DED8EB4CF0446DB8841C7798E106F2886OH")
  302. .appType("APP_GNQ1RGK68X4JNZUEU8RQ")
  303. .systemToken("XH866P81QDOTQ0218TGZM9WCNXOF24WIP488M7A5")
  304. .userId("332051151139376769").build(),YDConf.FORM_QUERY.retrieve_id).getFormData();
  305. System.out.println("入库单数据:"+d);
  306. List<Map> mapList = (List<Map>)d.get("tableField_m8mseubi");
  307. System.out.println("入库单明细数据:"+mapList);
  308. ArrayList<Object> entries = new ArrayList<>();
  309. for(Map map1 : mapList){
  310. String LBJId = map1.get("textField_ma3jhnpr").toString();//零部件的实例id
  311. entries.add(LBJId);
  312. System.out.println("物料名称:"+map1.get("textField_m9b1vd2w").toString());
  313. BigDecimal numberFieldM9qdwvu1 = new BigDecimal( map1.get("numberField_ma3jwnr3").toString() ).add(new BigDecimal( map1.get("numberField_m8mseubm").toString()));//存库数量 + 入库数量
  314. System.out.println("入库后数量:"+numberFieldM9qdwvu1);
  315. Map d1 = ydClient.queryData(YDParam.builder().formInstId(LBJId)
  316. .formUuid("FORM-2353BE632D97434DAD55AEBD0866C44DVAT5")
  317. .appType("APP_GNQ1RGK68X4JNZUEU8RQ")
  318. .systemToken("XH866P81QDOTQ0218TGZM9WCNXOF24WIP488M7A5")
  319. .userId("332051151139376769").build(),YDConf.FORM_QUERY.retrieve_id).getFormData();
  320. System.out.println(map1.get("textField_m9b1vd2w").toString()+"的数据明细:"+ d1.get("tableField_m96gje14").toString());
  321. String s = d1.get("tableField_m96gje14").toString();
  322. String warehouse = JSON.parseArray(s).getJSONObject(0).get("selectField_m88f1qi8").toString();//所属仓库
  323. String WarehouseLocation = JSON.parseArray(s).getJSONObject(0).get("textField_m8mnxgql").toString();//所属库位
  324. String SafetyValue = JSON.parseArray(s).getJSONObject(0).get("numberField_m8873fn4").toString();//安全库存值
  325. ArrayList<Map<String,String>> maps_YD = new ArrayList<>();
  326. Map sss=new HashMap<>();
  327. sss.put("selectField_m88f1qi8",warehouse);//所属仓库
  328. sss.put("textField_m8mnxgql",WarehouseLocation);//所属库位
  329. sss.put("numberField_m8873fn4",SafetyValue);//安全库存值
  330. sss.put("numberField_m9c8n9go",numberFieldM9qdwvu1);//仓库数量
  331. maps_YD.add(sss);
  332. ydClient.operateData(YDParam.builder().formInstId(LBJId)
  333. .formUuid("FORM-2353BE632D97434DAD55AEBD0866C44DVAT5")
  334. .appType("APP_GNQ1RGK68X4JNZUEU8RQ")
  335. .systemToken("XH866P81QDOTQ0218TGZM9WCNXOF24WIP488M7A5")
  336. .updateFormDataJson(JSONObject.toJSONString(UtilMap.map("tableField_m96gje14",maps_YD)))
  337. .userId("332051151139376769").build(),YDConf.FORM_OPERATION.update);
  338. BigDecimal InventoryQuantity = null;
  339. if(!d1.get("numberField_m8gz97nk").toString().isEmpty()){
  340. InventoryQuantity = new BigDecimal( d1.get("numberField_m8gz97nk").toString());//可用库存数量
  341. }else {
  342. InventoryQuantity = BigDecimal.valueOf(0);
  343. }
  344. BigDecimal VirtualQuantity = null;
  345. if(!d1.get("numberField_m8obn6wq_value").toString().isEmpty()){
  346. VirtualQuantity = new BigDecimal( d1.get("numberField_m8obn6wq").toString());//虚拟数量
  347. }else {
  348. VirtualQuantity = BigDecimal.valueOf(0);
  349. }
  350. System.out.println("--------------------零部件子表数据修改完毕!---------------------");
  351. BigDecimal VirtualQuantity_AAA = VirtualQuantity.add( new BigDecimal( map1.get("numberField_m8mseubm").toString()));//虚拟数量(新)
  352. BigDecimal AvailableQuantity_AAA = InventoryQuantity .add (new BigDecimal( map1.get("numberField_m8mseubm").toString()));//可用存库数量(新)
  353. ydClient.operateData(YDParam.builder().formInstId(LBJId)
  354. .formUuid("FORM-2353BE632D97434DAD55AEBD0866C44DVAT5")
  355. .appType("APP_GNQ1RGK68X4JNZUEU8RQ")
  356. .systemToken("XH866P81QDOTQ0218TGZM9WCNXOF24WIP488M7A5")
  357. .updateFormDataJson(JSONObject.toJSONString(UtilMap.map("numberField_m8obn6wq, numberField_m8gz97nk",VirtualQuantity_AAA,AvailableQuantity_AAA)))
  358. .userId("332051151139376769")
  359. .build(),YDConf.FORM_OPERATION.update);
  360. System.out.println("----------------------零部件主表数据修改完毕!------------------");
  361. }
  362. return McR.success();
  363. }
  364. @Override
  365. public McR ProductReturn(Map map) {
  366. String formInstId = UtilMap.getString(map,"formInstId");//实例id(退货单)
  367. Map data = ydClient.queryData(YDParam.builder().formInstId(formInstId)
  368. .formUuid("FORM-E40A23253F2F43FEAF0E40F274A67B34OQC9")
  369. .appType("APP_GNQ1RGK68X4JNZUEU8RQ")
  370. .systemToken("XH866P81QDOTQ0218TGZM9WCNXOF24WIP488M7A5")
  371. .userId("332051151139376769").build(), YDConf.FORM_QUERY.retrieve_id).getFormData();
  372. System.out.println("退货单:"+data);
  373. List<Map> mapList = (List<Map>)data.get("tableField_m99koj01");
  374. System.out.println("退货单明细数据:"+mapList);
  375. ArrayList<Object> entries = new ArrayList<>();
  376. for (Map map1 : mapList){
  377. String LBJId = map1.get("textField_maki4tqo").toString();//零部件的实例id
  378. System.out.println("物料名称:"+map1.get("textField_m99koj02").toString());//物料名称
  379. System.out.println("所属库位:"+map1.get("textField_maki4tqp").toString());//产品库位
  380. System.out.println("退货数量:"+map1.get("numberField_ma0e13js").toString());//退货数量
  381. Map data1 = ydClient.queryData(YDParam.builder().formInstId(LBJId)
  382. .formUuid("FORM-2353BE632D97434DAD55AEBD0866C44DVAT5")
  383. .appType("APP_GNQ1RGK68X4JNZUEU8RQ")
  384. .systemToken("XH866P81QDOTQ0218TGZM9WCNXOF24WIP488M7A5")
  385. .userId("332051151139376769").build(), YDConf.FORM_QUERY.retrieve_id).getFormData();
  386. System.out.println(map1.get("textField_m99koj02")+"明细表数据:"+data1.get("tableField_m96gje14"));//零部件明细
  387. String s = data1.get("tableField_m96gje14").toString();
  388. String warehouse = JSON.parseArray(s).getJSONObject(0).get("selectField_m88f1qi8").toString();//所属仓库
  389. String WarehouseLocation = JSON.parseArray(s).getJSONObject(0).get("textField_m8mnxgql").toString();//所属库位
  390. String SafetyValue = JSON.parseArray(s).getJSONObject(0).get("numberField_m8873fn4").toString();//安全库存值
  391. BigDecimal numberFieldM9c8n9go = new BigDecimal(JSON.parseArray(s).getJSONObject(0).get("numberField_m9c8n9go").toString());//仓库数量
  392. BigDecimal numm = new BigDecimal(map1.get("numberField_ma0e13js").toString()).add(numberFieldM9c8n9go); //退货后的库存数量 = 退货数量 + 仓库数量(子)
  393. ArrayList<Map<String,String>> maps_YD = new ArrayList<>();
  394. Map sss=new HashMap<>();
  395. sss.put("selectField_m88f1qi8",warehouse);//所属仓库
  396. sss.put("textField_m8mnxgql",WarehouseLocation);//所属库位
  397. sss.put("numberField_m8873fn4",SafetyValue);//安全库存值
  398. sss.put("numberField_m9c8n9go",numm);//仓库数量
  399. maps_YD.add(sss);
  400. ydClient.operateData(YDParam.builder().formInstId(LBJId)
  401. .formUuid("FORM-2353BE632D97434DAD55AEBD0866C44DVAT5")
  402. .appType("APP_GNQ1RGK68X4JNZUEU8RQ")
  403. .systemToken("XH866P81QDOTQ0218TGZM9WCNXOF24WIP488M7A5")
  404. .updateFormDataJson(JSONObject.toJSONString(UtilMap.map("tableField_m96gje14",maps_YD)))
  405. .userId("332051151139376769").build(),YDConf.FORM_OPERATION.update);
  406. BigDecimal InventoryQuantity = null;
  407. if(!data1.get("numberField_m8gz97nk_value").toString().isEmpty()){
  408. InventoryQuantity = new BigDecimal( data1.get("numberField_m8gz97nk").toString());//可用库存数量
  409. }else {
  410. InventoryQuantity = BigDecimal.valueOf(0);
  411. }
  412. BigDecimal FreezeQuantity = null;
  413. if(!data1.get("numberField_m8obn6wl_value").toString().isEmpty()){
  414. FreezeQuantity = new BigDecimal( data1.get("numberField_m8obn6wl").toString());//冻结数量
  415. }else {
  416. FreezeQuantity = BigDecimal.valueOf(0);
  417. }
  418. System.out.println("---------------------------------------零部件子表数据修改完毕--------------------------------");
  419. BigDecimal FreezeQuantity_AAA = FreezeQuantity.subtract( new BigDecimal( map1.get("numberField_ma0e13js").toString()));//冻结数量(新) = 冻结数量 - 退货数量
  420. BigDecimal AvailableQuantity_AAA = InventoryQuantity.add(new BigDecimal( map1.get("numberField_ma0e13js").toString()));//可用存库数量(新) = 可用库存数量 + 退货数量
  421. ydClient.operateData(YDParam.builder().formInstId(LBJId)
  422. .formUuid("FORM-2353BE632D97434DAD55AEBD0866C44DVAT5")
  423. .appType("APP_GNQ1RGK68X4JNZUEU8RQ")
  424. .systemToken("XH866P81QDOTQ0218TGZM9WCNXOF24WIP488M7A5")
  425. .updateFormDataJson(JSONObject.toJSONString(UtilMap.map("numberField_m8obn6wl, numberField_m8gz97nk",FreezeQuantity_AAA,AvailableQuantity_AAA)))
  426. .userId("332051151139376769")
  427. .build(),YDConf.FORM_OPERATION.update);
  428. System.out.println("----------------------零部件主表数据修改完毕!------------------");
  429. }
  430. return McR.success();
  431. }
  432. @Override
  433. public McR allocateTransfer(Map map) {
  434. String formInstId = UtilMap.getString(map,"formInstId");//实例id(调拨流程)
  435. Map data = ydClient.queryData(YDParam.builder().formInstId(formInstId)
  436. .formUuid("FORM-C6360F0CA28543E8BA99A1DDCF90964FSJEM")
  437. .appType("APP_GNQ1RGK68X4JNZUEU8RQ")
  438. .systemToken("XH866P81QDOTQ0218TGZM9WCNXOF24WIP488M7A5")
  439. .userId("332051151139376769").build(), YDConf.FORM_QUERY.retrieve_id).getFormData();
  440. System.out.println("调拨单:"+data);
  441. List<Map> mapList = (List<Map>)data.get("tableField_m9grj2ih");
  442. System.out.println("调拨明细数据:"+mapList);
  443. ArrayList<Object> entries = new ArrayList<>();
  444. for (Map map1 : mapList){
  445. //TODO:1、调出零部件处理
  446. String LBJId = map1.get("textField_mawbt28t").toString();//(调出)零部件的实例id
  447. System.out.println("调出的所属库位:"+map1.get("textField_m9grj2il").toString());//产品库位
  448. System.out.println("调出的所属仓库:"+map1.get("textField_m9grj2ik").toString());//产品仓库
  449. System.out.println("调拨前数量:"+map1.get("numberField_m9gs7k82").toString());//调拨前数量
  450. Map data1 = ydClient.queryData(YDParam.builder().formInstId(LBJId)
  451. .formUuid("FORM-2353BE632D97434DAD55AEBD0866C44DVAT5")
  452. .appType("APP_GNQ1RGK68X4JNZUEU8RQ")
  453. .systemToken("XH866P81QDOTQ0218TGZM9WCNXOF24WIP488M7A5")
  454. .userId("332051151139376769").build(), YDConf.FORM_QUERY.retrieve_id).getFormData();
  455. String s = data1.get("tableField_m96gje14").toString();
  456. String warehouse = JSON.parseArray(s).getJSONObject(0).get("selectField_m88f1qi8").toString();//所属仓库
  457. String WarehouseLocation = JSON.parseArray(s).getJSONObject(0).get("textField_m8mnxgql").toString();//所属库位
  458. String SafetyValue = JSON.parseArray(s).getJSONObject(0).get("numberField_m8873fn4").toString();//安全库存值
  459. BigDecimal numberFieldM9c8n9go = new BigDecimal(JSON.parseArray(s).getJSONObject(0).get("numberField_m9c8n9go").toString());//仓库数量
  460. BigDecimal numm = numberFieldM9c8n9go.subtract(new BigDecimal(map1.get("numberField_m9grj2ij").toString())); //调拨后的库存数量 = 仓库数量 - 调拨数量
  461. ArrayList<Map<String,String>> maps_YD = new ArrayList<>();
  462. Map sss=new HashMap<>();
  463. sss.put("selectField_m88f1qi8",warehouse);//所属仓库
  464. sss.put("textField_m8mnxgql",WarehouseLocation);//所属库位
  465. sss.put("numberField_m8873fn4",SafetyValue);//安全库存值
  466. sss.put("numberField_m9c8n9go",numm);//仓库数量
  467. maps_YD.add(sss);
  468. ydClient.operateData(YDParam.builder().formInstId(LBJId)
  469. .formUuid("FORM-2353BE632D97434DAD55AEBD0866C44DVAT5")
  470. .appType("APP_GNQ1RGK68X4JNZUEU8RQ")
  471. .systemToken("XH866P81QDOTQ0218TGZM9WCNXOF24WIP488M7A5")
  472. .updateFormDataJson(JSONObject.toJSONString(UtilMap.map("tableField_m96gje14",maps_YD)))
  473. .userId("332051151139376769").build(),YDConf.FORM_OPERATION.update);
  474. //TODO:2、调入零部件处理
  475. String LBJId2 = map1.get("textField_maxendgs").toString();//(调入)零部件的实例id
  476. System.out.println("调入的所属库位:"+map1.get("textField_m9grj2il").toString());//产品库位
  477. System.out.println("调入的所属仓库:"+map1.get("textField_m9grj2ik").toString());//产品仓库
  478. System.out.println("调拨前数量:"+map1.get("numberField_maz574d0").toString());//调拨前数量
  479. Map data2 = ydClient.queryData(YDParam.builder().formInstId(LBJId2)
  480. .formUuid("FORM-2353BE632D97434DAD55AEBD0866C44DVAT5")
  481. .appType("APP_GNQ1RGK68X4JNZUEU8RQ")
  482. .systemToken("XH866P81QDOTQ0218TGZM9WCNXOF24WIP488M7A5")
  483. .userId("332051151139376769").build(), YDConf.FORM_QUERY.retrieve_id).getFormData();
  484. String s1 = data2.get("tableField_m96gje14").toString();
  485. String warehouse1 = JSON.parseArray(s1).getJSONObject(0).get("selectField_m88f1qi8").toString();//所属仓库
  486. String WarehouseLocation1 = JSON.parseArray(s1).getJSONObject(0).get("textField_m8mnxgql").toString();//所属库位
  487. String SafetyValue1 = JSON.parseArray(s1).getJSONObject(0).get("numberField_m8873fn4").toString();//安全库存值
  488. BigDecimal numberFieldM9c8n9go1 = new BigDecimal(JSON.parseArray(s1).getJSONObject(0).get("numberField_m9c8n9go").toString());//仓库数量
  489. BigDecimal numm1 = numberFieldM9c8n9go1.add(new BigDecimal(map1.get("numberField_m9grj2ij").toString())); //调拨后的库存数量 = 仓库数量 + 调拨数量
  490. ArrayList<Map<String,String>> maps_YD1 = new ArrayList<>();
  491. Map sss1=new HashMap<>();
  492. sss1.put("selectField_m88f1qi8",warehouse1);//所属仓库
  493. sss1.put("textField_m8mnxgql",WarehouseLocation1);//所属库位
  494. sss1.put("numberField_m8873fn4",SafetyValue1);//安全库存值
  495. sss1.put("numberField_m9c8n9go",numm1);//仓库数量
  496. maps_YD1.add(sss1);
  497. ydClient.operateData(YDParam.builder().formInstId(LBJId2)
  498. .formUuid("FORM-2353BE632D97434DAD55AEBD0866C44DVAT5")
  499. .appType("APP_GNQ1RGK68X4JNZUEU8RQ")
  500. .systemToken("XH866P81QDOTQ0218TGZM9WCNXOF24WIP488M7A5")
  501. .updateFormDataJson(JSONObject.toJSONString(UtilMap.map("tableField_m96gje14",maps_YD1)))
  502. .userId("332051151139376769").build(),YDConf.FORM_OPERATION.update);
  503. BigDecimal AvailableInventoryQuantity_AAA = null;
  504. BigDecimal InventoryQuantity_AAA = null;
  505. if(!data1.get("numberField_m8gz97nk_value").toString().isEmpty()){
  506. AvailableInventoryQuantity_AAA = new BigDecimal( data1.get("numberField_m8gz97nk").toString());//可用库存数量
  507. }else {
  508. AvailableInventoryQuantity_AAA = BigDecimal.valueOf(0);
  509. }
  510. if(!data1.get("numberField_m8obn6wk_value").toString().isEmpty()){
  511. InventoryQuantity_AAA = new BigDecimal(data1.get("numberField_m8obn6wk").toString());//存库数量
  512. }else {
  513. InventoryQuantity_AAA = BigDecimal.valueOf(0);
  514. }
  515. BigDecimal AvailableInventoryQuantity_BBB = null;
  516. BigDecimal InventoryQuantity_BBB = null;
  517. if(!data2.get("numberField_m8gz97nk_value").toString().isEmpty()){
  518. AvailableInventoryQuantity_BBB = new BigDecimal( data2.get("numberField_m8gz97nk").toString());//可用库存数量
  519. }else {
  520. AvailableInventoryQuantity_BBB = BigDecimal.valueOf(0);
  521. }
  522. if(!data2.get("numberField_m8obn6wk_value").toString().isEmpty()){
  523. InventoryQuantity_BBB = new BigDecimal(data2.get("numberField_m8obn6wk").toString());//可用库存数量
  524. }else {
  525. InventoryQuantity_BBB = BigDecimal.valueOf(0);
  526. }
  527. System.out.println("---------------------------------------零部件子表数据修改完毕--------------------------------");
  528. // BigDecimal FreezeQuantity_AAA = FreezeQuantity.subtract( new BigDecimal( map1.get("numberField_ma0e13js").toString()));//冻结数量(新) = 冻结数量 - 退货数量
  529. //TODO:3、调出物料的可用库存
  530. BigDecimal AvailableQuantity_AAA = AvailableInventoryQuantity_AAA.subtract(new BigDecimal( map1.get("numberField_m9grj2ij").toString()));//可用存库数量(新) = 可用库存数量 - 调拨数量
  531. BigDecimal Quantity_AAA = InventoryQuantity_AAA.subtract(new BigDecimal(map1.get("numberField_m9grj2ij").toString()));//存库数量(新) = 存库数量 - 调拨数量
  532. //TODO:4、调入物料的可用库存
  533. BigDecimal AvailableQuantity_BBB = AvailableInventoryQuantity_BBB.add(new BigDecimal( map1.get("numberField_m9grj2ij").toString()));//可用存库数量(新) = 可用库存数量 + 调拨数量
  534. BigDecimal Quantity_BBB = InventoryQuantity_BBB.add(new BigDecimal(map1.get("numberField_m9grj2ij").toString()));
  535. ydClient.operateData(YDParam.builder().formInstId(LBJId)
  536. .formUuid("FORM-2353BE632D97434DAD55AEBD0866C44DVAT5")
  537. .appType("APP_GNQ1RGK68X4JNZUEU8RQ")
  538. .systemToken("XH866P81QDOTQ0218TGZM9WCNXOF24WIP488M7A5")
  539. .updateFormDataJson(JSONObject.toJSONString(UtilMap.map("numberField_m8gz97nk, numberField_m8obn6wk",AvailableQuantity_AAA,Quantity_AAA)))
  540. .userId("332051151139376769")
  541. .build(),YDConf.FORM_OPERATION.update);
  542. ydClient.operateData(YDParam.builder().formInstId(LBJId2)
  543. .formUuid("FORM-2353BE632D97434DAD55AEBD0866C44DVAT5")
  544. .appType("APP_GNQ1RGK68X4JNZUEU8RQ")
  545. .systemToken("XH866P81QDOTQ0218TGZM9WCNXOF24WIP488M7A5")
  546. .updateFormDataJson(JSONObject.toJSONString(UtilMap.map("numberField_m8gz97nk, numberField_m8obn6wk",AvailableQuantity_BBB,Quantity_BBB)))
  547. .userId("332051151139376769")
  548. .build(),YDConf.FORM_OPERATION.update);
  549. System.out.println("----------------------零部件主表数据修改完毕!------------------");
  550. }
  551. return McR.success();
  552. }
  553. @Override
  554. public McR shareRecord(Map data) {
  555. String pid = getString(data.get("pid"));
  556. if (Strings.isNotBlank(pid)){
  557. //发起审批
  558. String[] dd = McProject.getDd(pid);
  559. String appKey = "";
  560. String appSecret = "";
  561. String agentId = "";
  562. if (!PublicUtil.isNull(pid) && dd != null && dd.length >= 3) {
  563. appKey = dd[0];
  564. appSecret = dd[1];
  565. agentId = dd[2];
  566. }
  567. String[] yida = McProject.getYida(pid);
  568. String appType = "";
  569. String systemToken = "";
  570. if (!PublicUtil.isNull(pid) && dd != null && dd.length >= 2) {
  571. appType = yida[0];
  572. systemToken = yida[1];
  573. }
  574. // 执行分享逻辑 [ 拼接后的权限组 ]
  575. McException.assertParamException_Null(data, "compId, userIds, userId, atUserId, isNotice");
  576. //开始抓取宜搭对应的子表数据
  577. String processInstanceId = data.get("processInstanceId").toString();
  578. List<String> atUserId = (List<String>) data.get("atUserId");
  579. Map map = new HashMap();
  580. map.put(UtilMap.getString(data, "compId"),UtilMap.getList(data, "userIds"));
  581. ydClient.operateData(YDParam.builder()
  582. .appType(appType)
  583. .systemToken(systemToken)
  584. .formInstId(processInstanceId)
  585. .updateFormDataJson(JSON.toJSONString(map))
  586. .build(), YDConf.FORM_OPERATION.update);
  587. String userIds = String.valueOf(data.get("atUserId"));
  588. String[] split = userIds.split(",");
  589. ArrayList<String> names = new ArrayList<>();
  590. for(Object auserId : split){
  591. 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);
  592. Object result = ddrNew.getResult();
  593. if (result != null) {
  594. JSONObject jsonObject = JSONObject.parseObject(JSONObject.toJSONString(result));
  595. String name = jsonObject.getString("name");
  596. names.add(name);
  597. }
  598. }
  599. List<Map> searchCondition = new ArrayList<>();
  600. searchCondition.addAll(Arrays.asList(
  601. YDConf.searchCondition_TextFiled(data.get("processKey").toString(), data.get("processInstanceId").toString(),"eq")
  602. ));
  603. String title = UtilMap.getString(data, "content").isEmpty() || !ObjectUtil.isNotNull(UtilMap.getString(data, "content")) ? "单据分享" : UtilMap.getString(data, "content");
  604. ydClient.operateData(YDParam.builder()
  605. .appType(appType)
  606. .systemToken(systemToken)
  607. .searchCondition(JSON.toJSONString(searchCondition))
  608. .formUuid(data.get("formId").toString())
  609. .formDataJson(JSON.toJSONString(UtilMap.map(data.get("processKey").toString()+", "+data.get("empKey").toString()+", "+data.get("titleKey").toString(),
  610. data.get("processInstanceId").toString(),UtilMap.getList(data, "userIds"),title)))
  611. .useLatestVersion(true)
  612. .build(), YDConf.FORM_OPERATION.upsert_v2);
  613. if (UtilMap.getBoolean(data, "isNotice")) {
  614. // data.put("content", names.stream().collect(Collectors.joining(",")) + UtilMap.getString(data, "content"));
  615. String appUrl = data.get("appUrl").toString();
  616. String pcUrl = data.get("pcUrl").toString();
  617. if ( !ObjectUtil.isNotNull(UtilMap.getString(data,"sendType")) || UtilMap.getString(data,"sendType").isEmpty() || "工作通知".equals(UtilMap.getString(data,"sendType"))){
  618. Map<String, String> contentMap = new HashMap<>();
  619. contentMap.put("title",title);
  620. contentMap.put("text",title);
  621. contentMap.put("picUrl",pcUrl+"/processDetail"+"?procInsId="+processInstanceId);
  622. contentMap.put("messageUrl",pcUrl+"/processDetail"+"?procInsId="+processInstanceId);
  623. Map<String, Object> msg = new HashMap<>();
  624. msg.put("msgtype","link");
  625. msg.put("link",contentMap);
  626. sendNotification(ddClient.getAccessToken(appKey,appSecret),atUserId,null,false,msg,agentId);
  627. } else if ("钉钉代办".equals(UtilMap.getString(data, "sendType"))) {
  628. /*查询钉钉人员*/
  629. ddClientWorkflow.createTBTask(ddClient.getAccessToken(appKey,appSecret),UtilMap.getString(data, "userId"),"流程分享:"+UtilMap.getString(data, "content"),UtilMap.getString(data, "content"),
  630. UtilDateTime.getLocalDateTimeTimeStamp(LocalDate.now().plusDays(7).atTime(LocalTime.MAX)), atUserId,null
  631. ,UtilMap.map("appUrl, pcUrl",appUrl+"/processDetail"+"?procInsId="+processInstanceId,pcUrl+"/processDetail"+"?procInsId="+processInstanceId),false,30,UtilMap.map("dingNotify","1"));
  632. }
  633. }
  634. return McR.success();
  635. }
  636. return McR.errorParam("参数缺失!");
  637. }
  638. public String sendNotification(String access_token, List<String> userid_list, List<String> dept_id_list, boolean to_all_user, Map msg, String agent_id) {
  639. Map body = UtilMap.map("agent_id, to_all_user, msg", new Object[]{agent_id, to_all_user, msg});
  640. if (UtilList.isNotEmpty(userid_list)) {
  641. body.put("userid_list", String.join(",", userid_list));
  642. }
  643. if (UtilList.isNotEmpty(dept_id_list)) {
  644. body.put("dept_id_list", String.join(",", dept_id_list));
  645. }
  646. DDR ddr = DDR.doPost("https://oapi.dingtalk.com/topapi/message/corpconversation/asyncsend_v2", (Map)null, DDConf.initTokenParams(access_token), body);
  647. return ddr.getTask_id();
  648. }
  649. @Async
  650. @Override
  651. public void batchUpdateSpecifiedQuantityData(Map map) {
  652. try {
  653. String pid = UtilMap.getString(map, "pid");
  654. MDC.put("MDC_KEY_PID",pid);
  655. String formInstId = UtilMap.getString(map, "formInstId");//当前表实例id
  656. //查询当前表formData
  657. Map formData = ydClient.queryData(YDParam.builder()
  658. .formInstanceId(formInstId)
  659. .build(), YDConf.FORM_QUERY.retrieve_id).getFormData();
  660. //目标表筛选字段唯一标识
  661. String[] searchFields = UtilMap.getString(map, "searchFieldStr").split(",");
  662. //目标表筛选字段值
  663. String[] searchFieldValues = UtilMap.getString(map, "searchFieldValueStr").split(",");
  664. Map searchCondition = new HashMap();
  665. if (searchFields.length == searchFieldValues.length){
  666. for (int i = 0; i < searchFields.length; i++) {
  667. searchCondition.put(searchFields[i],searchFieldValues[i]);
  668. }
  669. }else {
  670. log.info("筛选字段和筛选值数量不一致");
  671. }
  672. int quantity = UtilMap.getInt(map, "quantity");//指定更新数量
  673. if (quantity > 100){
  674. log.info("更新数量不能大于100");
  675. }
  676. String formUuid = UtilMap.getString(map, "formUuid");//目标表uuid
  677. List<Map> data = (List<Map>) ydClient.queryData(YDParam.builder()
  678. .searchCondition(JSONObject.toJSONString(searchCondition))
  679. .formUuid(formUuid)
  680. .pageSize(quantity)
  681. .build(), YDConf.FORM_QUERY.retrieve_list).getData();
  682. //目标表更新字段唯一标识
  683. String[] fieldStrs = UtilMap.getString(map, "fieldStr").split(",");
  684. //当前表字段唯一标识
  685. String[] currentFieldStrs = UtilMap.getString(map, "currentFieldStrs").split(",");
  686. Map updateFormData = new HashMap();
  687. if (fieldStrs.length == currentFieldStrs.length){
  688. for (int i = 0; i < fieldStrs.length; i++) {
  689. updateFormData.put(fieldStrs[i],YDConf.getDataByCompId(formData,currentFieldStrs[i]));
  690. }
  691. }else {
  692. log.info("更新字段和当前表字段数量不一致");
  693. }
  694. for (Map datum : data) {
  695. String formInstanceId = UtilMap.getString(datum, "formInstanceId");
  696. ydClient.operateData(YDParam.builder()
  697. .formInstanceId(formInstanceId)
  698. .updateFormDataJson(JSONObject.toJSONString(updateFormData))
  699. .build(), YDConf.FORM_OPERATION.update);
  700. }
  701. log.info("批量更新成功");
  702. }catch (Exception e){
  703. log.info("更新数据失败:{}",e.getMessage());
  704. }
  705. }
  706. private static void extractOperatorIds(JSONArray array, List<String> result) {
  707. for (Object item : array) {
  708. JSONObject obj = (JSONObject) item;
  709. // 提取当前层级的 operatorUserId 或 operator
  710. String userId = obj.getString("operatorUserId");
  711. if (userId == null) userId = obj.getString("operator"); // 处理 domainList 中的字段
  712. if (userId != null) result.add(userId);
  713. // 递归处理 domainList
  714. JSONArray domainList = obj.getJSONArray("domainList");
  715. if (domainList != null && !domainList.isEmpty()) {
  716. extractOperatorIds(domainList, result);
  717. }
  718. }
  719. }
  720. private String getString(Object obj){
  721. return obj == null ? "" : obj.toString();
  722. }
  723. private List<Map> getTableData(List<Map<String, ?>> details){
  724. List<Map> table = new ArrayList<>();
  725. for (Map detail : details) {
  726. Map row = UtilMap.empty();
  727. for (String subId : details.get(0).keySet()) {
  728. // ppExt: 组件会返回带有_id/_value字段, 关联表单 & 成员组件赋值为原字段 [关联表单仅仅会返回带Id字段, 成员组件不带Id返回姓名过滤]
  729. if (subId.endsWith("_value") || (subId.startsWith("employeeField_") && !subId.endsWith("_id"))) {
  730. continue;
  731. }
  732. if (subId.endsWith("_id")) {
  733. if (subId.startsWith("employeeField_") || subId.startsWith("associationFormField_")) {
  734. subId = subId.replace("_id", "");
  735. } else {
  736. continue;
  737. }
  738. }
  739. row.put(subId, YDConf.getDataByCompId(detail, subId));
  740. }
  741. table.add(row);
  742. }
  743. return table;
  744. }
  745. }