McYdServiceImpl.java 57 KB

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