package com.malk.mc.service.impl; import cn.hutool.core.date.DateUtil; import cn.hutool.core.util.NumberUtil; import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.malk.core.McProject; import com.malk.mc.service.McYdService; import com.malk.server.aliwork.YDConf; import com.malk.server.aliwork.YDParam; import com.malk.server.common.McException; import com.malk.server.common.McR; import com.malk.server.dingtalk.DDConf; import com.malk.server.dingtalk.DDR; import com.malk.server.dingtalk.DDR_New; import com.malk.service.aliwork.YDClient; import com.malk.service.aliwork.YDService; import com.malk.service.dingtalk.DDClient; import com.malk.service.dingtalk.DDClient_Contacts; import com.malk.service.dingtalk.DDClient_Notice; import com.malk.service.dingtalk.DDClient_Workflow; import com.malk.utils.*; import lombok.extern.slf4j.Slf4j; import org.apache.logging.log4j.util.Strings; import org.slf4j.MDC; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Service; import java.math.BigDecimal; import java.text.DecimalFormat; import java.time.LocalDate; import java.time.LocalTime; import java.util.*; import java.util.stream.Collectors; @Slf4j @Service public class McYdServiceImpl implements McYdService { @Autowired private YDClient ydClient; @Autowired private DDClient ddClient; @Autowired private DDConf ddConf; @Autowired private YDConf ydConf; @Autowired private DDClient_Workflow ddClientWorkflow; @Autowired private DDClient_Notice ddClientNotice; @Autowired private DDClient_Contacts ddClient_contacts; @Override @Async public void updateFormDataVersion(Map map) { String pid = Objects.nonNull(map.get("pid")) ? map.get("pid").toString() : ""; String formInstId = Objects.nonNull(map.get("formInstId")) ? map.get("formInstId").toString() : ""; String formUuid = Objects.nonNull(map.get("formUuid")) ? map.get("formUuid").toString() : ""; if (Strings.isNotBlank(pid)){ MDC.put("MDC_KEY_PID",pid); if (Strings.isNotBlank(formInstId) && Strings.isBlank(formUuid)){ ydClient.operateData(YDParam.builder() .formInstId(formInstId) .useLatestVersion(true) .updateFormDataJson("{}").build(), YDConf.FORM_OPERATION.update); }else if (Strings.isBlank(formInstId) && Strings.isNotBlank(formUuid)){ int i = 1; int pageSize = 10; DDR_New ddrNew = null; do { int i1 =1 ; boolean flag1 = false; while (i1<=5 && !flag1) { try { ddrNew = ydClient.queryData(YDParam.builder() .formUuid(formUuid) .pageNumber(i) .pageSize(pageSize) .build(), YDConf.FORM_QUERY.retrieve_search_form_id); List formInstIdList = (List) ddrNew.getData(); //noExecuteExpression字段不传或传false 传true会导致实例版本不更新或滞后更新 ydClient.operateData(YDParam.builder() .formInstanceIdList(formInstIdList) .formUuid(formUuid) .useLatestFormSchemaVersion(true) .updateFormDataJson("{}") .noExecuteExpression(false) .asynchronousExecution(false) .build(),YDConf.FORM_OPERATION.multi_update); i++; flag1 = true; }catch (Exception e){ log.error("更新表单实例版本失败:{}, 重试次数:{}",e.getMessage(),i1); try { Thread.sleep(3000); } catch (InterruptedException ex) { throw new RuntimeException(ex); } i1++; } } if (i1 > 5){ log.error("更新表单实例版本失败:{}"); break; } }while (ddrNew.getTotalCount() > ddrNew.getPageNumber() * pageSize); } //发送工作通知给当前登陆人 if (Objects.nonNull(map.get("userId"))){ String userId = map.get("userId").toString(); Map param2 = new HashMap(); param2.put("access_token",ddClient.getAccessToken()); Map body3 = new HashMap(); body3.put("agent_id",ddConf.getAgentId()); body3.put("userid_list",userId); Map msg = new HashMap(); msg.put("msgtype","text"); //获取当前时间 精确到秒 String time = DateUtil.format(new Date(),"yyyy-MM-dd HH:mm:ss"); msg.put("text", UtilMap.map("content","表单实例版本已更新 时间:" + time)); body3.put("msg",msg); UtilHttp.doPost("https://oapi.dingtalk.com/topapi/message/corpconversation/asyncsend_v2",null,param2,body3); } } } @Override public McR initiateApproval(Map map) { String pid = getString(map.get("pid")); String formUuid = getString(map.get("formUuid")); String processCode = getString(map.get("processCode")); String userId = getString(map.get("userId")); Map formData = (Map) map.get("formData"); Map processData = new HashMap(); if (Objects.nonNull(map.get("processData"))){ processData = (Map) map.get("processData"); } if (Strings.isNotBlank(pid)){ //发起审批 String[] yida = McProject.getYida(pid); Map body = new HashMap<>(); if (!PublicUtil.isNull(pid) && yida != null && yida.length >= 2) { body.put("appType",yida[0]); body.put("systemToken",yida[1]); } body.put("userId",userId); body.put("formUuid",formUuid); body.put("processCode",processCode); body.put("formDataJson", JSONObject.toJSONString(formData)); if (Objects.nonNull(processData) && processData.size() > 0){ body.put("processData", JSONObject.toJSONString(processData)); } UtilHttp.doPost("https://api.dingtalk.com/v1.0/yida/processes/instances/start", ddClient.initTokenHeader(), null, body, DDR_New.class); return McR.success(); } return McR.errorParam("参数缺失!"); } @Override public McR convertSubTableNumber(Map map) { String formInstId = getString(map.get("formInstId")); String tableField = getString(map.get("tableField")); String numberFieldCode = getString(map.get("numFileCodes")); String textFieldCode = getString(map.get("textFieldCodes")); if (Strings.isNotBlank(formInstId)){ DDR_New ddrNew = ydClient.queryData(YDParam.builder() .formInstId(formInstId) .build(), YDConf.FORM_QUERY.retrieve_id); Map formData = ddrNew.getFormData(); Map updateMap=new HashMap(); if (!PublicUtil.isNull(tableField)&&tableField.startsWith("tableField_")) { List> table = UtilMap.getList( formData,(tableField)); for (Map item : table) { String[] numberFieldCodes=numberFieldCode.split(","); String[] textFieldCodes=textFieldCode.split(","); for (int i = 0; i < numberFieldCodes.length; i++) { String numstr=UtilMap.getNumberStr(item,numberFieldCodes[i]); if(PublicUtil.isNull(numstr)||numstr.equals("0")){ updateMap.put(textFieldCodes[i],"0.00"); continue; } BigDecimal number = NumberUtil.toBigDecimal(numstr); // 创建一个 DecimalFormat 实例,指定千位分隔符模式 DecimalFormat df = new DecimalFormat("#,###.00"); // 格式化 double 数值 String formattedText = df.format(number); item.put(textFieldCodes[i],formattedText); } } updateMap.put(tableField,getTableData(table)); // 添加一层过滤 } if(!PublicUtil.isNull(map,"mainNumKeys","mainTextKeys")){ String[] mainNumKeys=UtilMap.getString(map,"mainNumKeys").split(","); String[] mainTextKeys=UtilMap.getString(map,"mainTextKeys").split(","); for (int i = 0; i < mainNumKeys.length; i++) { String numstr=UtilMap.getNumberStr(formData,(mainNumKeys[i])); if(PublicUtil.isNull(numstr)||numstr.equals("0")){ updateMap.put(mainTextKeys[i],"0.00"); continue; } BigDecimal number = NumberUtil.toBigDecimal(numstr); // 创建一个 DecimalFormat 实例,指定千位分隔符模式 DecimalFormat df = new DecimalFormat("#,###.00"); // 格式化 double 数值 String formattedText = df.format(number); updateMap.put(mainTextKeys[i],formattedText); } } ydClient.operateData(YDParam.builder() .formInstId(formInstId) .useLatestVersion(true) .updateFormDataJson(JSONObject.toJSONString(updateMap)) .build(), YDConf.FORM_OPERATION.update); } return McR.success(); } @Override public McR saveApproverToForm(Map map) { try { Thread.sleep(5000); } catch (InterruptedException e) { throw new RuntimeException(e); } String key = UtilMap.getString(map,"key"); String formInstId = UtilMap.getString(map,"formInstId"); JSONArray jsonArray=(JSONArray) ydClient.queryData(YDParam.builder().processInstanceId(formInstId).build(),YDConf.FORM_QUERY.retrieve_approval_record).getResult(); List userIds = new ArrayList<>(); extractOperatorIds(jsonArray,userIds); ydClient.operateData(YDParam.builder().updateFormDataJson(JSONObject.toJSONString(UtilMap.map(key, userIds))).formInstId(formInstId).build(), YDConf.FORM_OPERATION.update); return McR.success(); } @Override public McR multiLocationOutbound(Map map) { String formInstId = UtilMap.getString(map,"formInstId");//实例id(出库单) Map d = ydClient.queryData(YDParam.builder().formInstId(formInstId) .formUuid("FORM-3208DFE5463549A9A57FB94358A75E80PV5F") .appType("APP_GNQ1RGK68X4JNZUEU8RQ") .systemToken("XH866P81QDOTQ0218TGZM9WCNXOF24WIP488M7A5") .userId("332051151139376769").build(),YDConf.FORM_QUERY.retrieve_id).getFormData(); System.out.println("出库单数据:"+d); List mapList = (List)d.get("tableField_m8mo8506"); System.out.println("出库单明细数据:"+mapList); ArrayList entries = new ArrayList<>(); for(Map map1 : mapList){ String LBJId = map1.get("textField_ma1usp6o").toString();//零部件的实例id entries.add(LBJId); System.out.println("物料名称:"+map1.get("textField_m99kztjo").toString()); BigDecimal InventoryCount = BigDecimal.valueOf(0);//库存数量 BigDecimal OutboundQuantity = BigDecimal.valueOf(0);// if(!map1.get("numberField_m9qdwvu1_value").toString().isEmpty()){ InventoryCount = new BigDecimal( map1.get("numberField_m9qdwvu1").toString()); } BigDecimal numberFieldM9qdwvu1 = InventoryCount.subtract( new BigDecimal( map1.get("numberField_m8mo8508").toString()));//存库数量 - 出库数量 System.out.println("出库后数量:"+numberFieldM9qdwvu1); Map d1 = ydClient.queryData(YDParam.builder().formInstId(LBJId) .formUuid("FORM-2353BE632D97434DAD55AEBD0866C44DVAT5") .appType("APP_GNQ1RGK68X4JNZUEU8RQ") .systemToken("XH866P81QDOTQ0218TGZM9WCNXOF24WIP488M7A5") .userId("332051151139376769").build(),YDConf.FORM_QUERY.retrieve_id).getFormData(); System.out.println(map1.get("textField_m99kztjo").toString()+"的数据明细:"+ d1.get("tableField_m96gje14").toString()); String s = d1.get("tableField_m96gje14").toString(); String warehouse = JSON.parseArray(s).getJSONObject(0).get("selectField_m88f1qi8").toString();//所属仓库 String WarehouseLocation = JSON.parseArray(s).getJSONObject(0).get("textField_m8mnxgql").toString();//所属库位 String SafetyValue = JSON.parseArray(s).getJSONObject(0).get("numberField_m8873fn4").toString();//安全库存值 ArrayList> maps_YD = new ArrayList<>(); Map sss=new HashMap<>(); sss.put("selectField_m88f1qi8",warehouse);//所属仓库 sss.put("textField_m8mnxgql",WarehouseLocation);//所属库位 sss.put("numberField_m8873fn4",SafetyValue);//安全库存值 sss.put("numberField_m9c8n9go",numberFieldM9qdwvu1);//仓库数量 maps_YD.add(sss); ydClient.operateData(YDParam.builder().formInstId(LBJId) .formUuid("FORM-2353BE632D97434DAD55AEBD0866C44DVAT5") .appType("APP_GNQ1RGK68X4JNZUEU8RQ") .systemToken("XH866P81QDOTQ0218TGZM9WCNXOF24WIP488M7A5") .updateFormDataJson(JSONObject.toJSONString(UtilMap.map("tableField_m96gje14",maps_YD))) .userId("332051151139376769").build(),YDConf.FORM_OPERATION.update); BigDecimal InventoryQuantity = new BigDecimal( d1.get("numberField_m8obn6wk").toString());//库存数量 BigDecimal FreezeQuantity = null; if(!d1.get("numberField_m8obn6wl_value").toString().isEmpty()){ FreezeQuantity = new BigDecimal( d1.get("numberField_m8obn6wl").toString());//冻结数量 }else { FreezeQuantity = BigDecimal.valueOf(0); } System.out.println("--------------------零部件子表数据修改完毕!---------------------"); BigDecimal FreezeQuantity_AAA = FreezeQuantity.add( new BigDecimal( map1.get("numberField_m8mo8508").toString()));//冻结数量(新) BigDecimal AvailableQuantity_AAA = numberFieldM9qdwvu1;//可用存库数量(新) ydClient.operateData(YDParam.builder().formInstId(LBJId) .formUuid("FORM-2353BE632D97434DAD55AEBD0866C44DVAT5") .appType("APP_GNQ1RGK68X4JNZUEU8RQ") .systemToken("XH866P81QDOTQ0218TGZM9WCNXOF24WIP488M7A5") .updateFormDataJson(JSONObject.toJSONString(UtilMap.map("numberField_m8obn6wl, numberField_m8gz97nk",FreezeQuantity_AAA,AvailableQuantity_AAA))) .userId("332051151139376769") .build(),YDConf.FORM_OPERATION.update); System.out.println("----------------------零部件主表数据修改完毕!------------------"); } return McR.success(); } @Override public McR WarehouseStorage(Map map) { String formInstId = UtilMap.getString(map,"formInstId");//实例id(入库单) Map d = ydClient.queryData(YDParam.builder().formInstId(formInstId) .formUuid("FORM-6DED8EB4CF0446DB8841C7798E106F2886OH") .appType("APP_GNQ1RGK68X4JNZUEU8RQ") .systemToken("XH866P81QDOTQ0218TGZM9WCNXOF24WIP488M7A5") .userId("332051151139376769").build(),YDConf.FORM_QUERY.retrieve_id).getFormData(); System.out.println("入库单数据:"+d); List mapList = (List)d.get("tableField_m8mseubi"); System.out.println("入库单明细数据:"+mapList); ArrayList entries = new ArrayList<>(); for(Map map1 : mapList){ String LBJId = map1.get("textField_ma3jhnpr").toString();//零部件的实例id entries.add(LBJId); System.out.println("物料名称:"+map1.get("textField_m9b1vd2w").toString()); BigDecimal numberFieldM9qdwvu1 = new BigDecimal( map1.get("numberField_ma3jwnr3").toString() ).add(new BigDecimal( map1.get("numberField_m8mseubm").toString()));//存库数量 + 入库数量 System.out.println("入库后数量:"+numberFieldM9qdwvu1); Map d1 = ydClient.queryData(YDParam.builder().formInstId(LBJId) .formUuid("FORM-2353BE632D97434DAD55AEBD0866C44DVAT5") .appType("APP_GNQ1RGK68X4JNZUEU8RQ") .systemToken("XH866P81QDOTQ0218TGZM9WCNXOF24WIP488M7A5") .userId("332051151139376769").build(),YDConf.FORM_QUERY.retrieve_id).getFormData(); System.out.println(map1.get("textField_m9b1vd2w").toString()+"的数据明细:"+ d1.get("tableField_m96gje14").toString()); String s = d1.get("tableField_m96gje14").toString(); String warehouse = JSON.parseArray(s).getJSONObject(0).get("selectField_m88f1qi8").toString();//所属仓库 String WarehouseLocation = JSON.parseArray(s).getJSONObject(0).get("textField_m8mnxgql").toString();//所属库位 String SafetyValue = JSON.parseArray(s).getJSONObject(0).get("numberField_m8873fn4").toString();//安全库存值 ArrayList> maps_YD = new ArrayList<>(); Map sss=new HashMap<>(); sss.put("selectField_m88f1qi8",warehouse);//所属仓库 sss.put("textField_m8mnxgql",WarehouseLocation);//所属库位 sss.put("numberField_m8873fn4",SafetyValue);//安全库存值 sss.put("numberField_m9c8n9go",numberFieldM9qdwvu1);//仓库数量 maps_YD.add(sss); ydClient.operateData(YDParam.builder().formInstId(LBJId) .formUuid("FORM-2353BE632D97434DAD55AEBD0866C44DVAT5") .appType("APP_GNQ1RGK68X4JNZUEU8RQ") .systemToken("XH866P81QDOTQ0218TGZM9WCNXOF24WIP488M7A5") .updateFormDataJson(JSONObject.toJSONString(UtilMap.map("tableField_m96gje14",maps_YD))) .userId("332051151139376769").build(),YDConf.FORM_OPERATION.update); BigDecimal InventoryQuantity = null; if(!d1.get("numberField_m8gz97nk").toString().isEmpty()){ InventoryQuantity = new BigDecimal( d1.get("numberField_m8gz97nk").toString());//可用库存数量 }else { InventoryQuantity = BigDecimal.valueOf(0); } BigDecimal VirtualQuantity = null; if(!d1.get("numberField_m8obn6wq_value").toString().isEmpty()){ VirtualQuantity = new BigDecimal( d1.get("numberField_m8obn6wq").toString());//虚拟数量 }else { VirtualQuantity = BigDecimal.valueOf(0); } System.out.println("--------------------零部件子表数据修改完毕!---------------------"); BigDecimal VirtualQuantity_AAA = VirtualQuantity.add( new BigDecimal( map1.get("numberField_m8mseubm").toString()));//虚拟数量(新) BigDecimal AvailableQuantity_AAA = InventoryQuantity .add (new BigDecimal( map1.get("numberField_m8mseubm").toString()));//可用存库数量(新) ydClient.operateData(YDParam.builder().formInstId(LBJId) .formUuid("FORM-2353BE632D97434DAD55AEBD0866C44DVAT5") .appType("APP_GNQ1RGK68X4JNZUEU8RQ") .systemToken("XH866P81QDOTQ0218TGZM9WCNXOF24WIP488M7A5") .updateFormDataJson(JSONObject.toJSONString(UtilMap.map("numberField_m8obn6wq, numberField_m8gz97nk",VirtualQuantity_AAA,AvailableQuantity_AAA))) .userId("332051151139376769") .build(),YDConf.FORM_OPERATION.update); System.out.println("----------------------零部件主表数据修改完毕!------------------"); } return McR.success(); } @Override public McR ProductReturn(Map map) { String formInstId = UtilMap.getString(map,"formInstId");//实例id(退货单) Map data = ydClient.queryData(YDParam.builder().formInstId(formInstId) .formUuid("FORM-E40A23253F2F43FEAF0E40F274A67B34OQC9") .appType("APP_GNQ1RGK68X4JNZUEU8RQ") .systemToken("XH866P81QDOTQ0218TGZM9WCNXOF24WIP488M7A5") .userId("332051151139376769").build(), YDConf.FORM_QUERY.retrieve_id).getFormData(); System.out.println("退货单:"+data); List mapList = (List)data.get("tableField_m99koj01"); System.out.println("退货单明细数据:"+mapList); ArrayList entries = new ArrayList<>(); for (Map map1 : mapList){ String LBJId = map1.get("textField_maki4tqo").toString();//零部件的实例id System.out.println("物料名称:"+map1.get("textField_m99koj02").toString());//物料名称 System.out.println("所属库位:"+map1.get("textField_maki4tqp").toString());//产品库位 System.out.println("退货数量:"+map1.get("numberField_ma0e13js").toString());//退货数量 Map data1 = ydClient.queryData(YDParam.builder().formInstId(LBJId) .formUuid("FORM-2353BE632D97434DAD55AEBD0866C44DVAT5") .appType("APP_GNQ1RGK68X4JNZUEU8RQ") .systemToken("XH866P81QDOTQ0218TGZM9WCNXOF24WIP488M7A5") .userId("332051151139376769").build(), YDConf.FORM_QUERY.retrieve_id).getFormData(); System.out.println(map1.get("textField_m99koj02")+"明细表数据:"+data1.get("tableField_m96gje14"));//零部件明细 String s = data1.get("tableField_m96gje14").toString(); String warehouse = JSON.parseArray(s).getJSONObject(0).get("selectField_m88f1qi8").toString();//所属仓库 String WarehouseLocation = JSON.parseArray(s).getJSONObject(0).get("textField_m8mnxgql").toString();//所属库位 String SafetyValue = JSON.parseArray(s).getJSONObject(0).get("numberField_m8873fn4").toString();//安全库存值 BigDecimal numberFieldM9c8n9go = new BigDecimal(JSON.parseArray(s).getJSONObject(0).get("numberField_m9c8n9go").toString());//仓库数量 BigDecimal numm = new BigDecimal(map1.get("numberField_ma0e13js").toString()).add(numberFieldM9c8n9go); //退货后的库存数量 = 退货数量 + 仓库数量(子) ArrayList> maps_YD = new ArrayList<>(); Map sss=new HashMap<>(); sss.put("selectField_m88f1qi8",warehouse);//所属仓库 sss.put("textField_m8mnxgql",WarehouseLocation);//所属库位 sss.put("numberField_m8873fn4",SafetyValue);//安全库存值 sss.put("numberField_m9c8n9go",numm);//仓库数量 maps_YD.add(sss); ydClient.operateData(YDParam.builder().formInstId(LBJId) .formUuid("FORM-2353BE632D97434DAD55AEBD0866C44DVAT5") .appType("APP_GNQ1RGK68X4JNZUEU8RQ") .systemToken("XH866P81QDOTQ0218TGZM9WCNXOF24WIP488M7A5") .updateFormDataJson(JSONObject.toJSONString(UtilMap.map("tableField_m96gje14",maps_YD))) .userId("332051151139376769").build(),YDConf.FORM_OPERATION.update); BigDecimal InventoryQuantity = null; if(!data1.get("numberField_m8gz97nk_value").toString().isEmpty()){ InventoryQuantity = new BigDecimal( data1.get("numberField_m8gz97nk").toString());//可用库存数量 }else { InventoryQuantity = BigDecimal.valueOf(0); } BigDecimal FreezeQuantity = null; if(!data1.get("numberField_m8obn6wl_value").toString().isEmpty()){ FreezeQuantity = new BigDecimal( data1.get("numberField_m8obn6wl").toString());//冻结数量 }else { FreezeQuantity = BigDecimal.valueOf(0); } System.out.println("---------------------------------------零部件子表数据修改完毕--------------------------------"); BigDecimal FreezeQuantity_AAA = FreezeQuantity.subtract( new BigDecimal( map1.get("numberField_ma0e13js").toString()));//冻结数量(新) = 冻结数量 - 退货数量 BigDecimal AvailableQuantity_AAA = InventoryQuantity.add(new BigDecimal( map1.get("numberField_ma0e13js").toString()));//可用存库数量(新) = 可用库存数量 + 退货数量 ydClient.operateData(YDParam.builder().formInstId(LBJId) .formUuid("FORM-2353BE632D97434DAD55AEBD0866C44DVAT5") .appType("APP_GNQ1RGK68X4JNZUEU8RQ") .systemToken("XH866P81QDOTQ0218TGZM9WCNXOF24WIP488M7A5") .updateFormDataJson(JSONObject.toJSONString(UtilMap.map("numberField_m8obn6wl, numberField_m8gz97nk",FreezeQuantity_AAA,AvailableQuantity_AAA))) .userId("332051151139376769") .build(),YDConf.FORM_OPERATION.update); System.out.println("----------------------零部件主表数据修改完毕!------------------"); } return McR.success(); } @Override public McR allocateTransfer(Map map) { String formInstId = UtilMap.getString(map,"formInstId");//实例id(调拨流程) Map data = ydClient.queryData(YDParam.builder().formInstId(formInstId) .formUuid("FORM-C6360F0CA28543E8BA99A1DDCF90964FSJEM") .appType("APP_GNQ1RGK68X4JNZUEU8RQ") .systemToken("XH866P81QDOTQ0218TGZM9WCNXOF24WIP488M7A5") .userId("332051151139376769").build(), YDConf.FORM_QUERY.retrieve_id).getFormData(); System.out.println("调拨单:"+data); List mapList = (List)data.get("tableField_m9grj2ih"); System.out.println("调拨明细数据:"+mapList); ArrayList entries = new ArrayList<>(); for (Map map1 : mapList){ //TODO:1、调出零部件处理 String LBJId = map1.get("textField_mawbt28t").toString();//(调出)零部件的实例id System.out.println("调出的所属库位:"+map1.get("textField_m9grj2il").toString());//产品库位 System.out.println("调出的所属仓库:"+map1.get("textField_m9grj2ik").toString());//产品仓库 System.out.println("调拨前数量:"+map1.get("numberField_m9gs7k82").toString());//调拨前数量 Map data1 = ydClient.queryData(YDParam.builder().formInstId(LBJId) .formUuid("FORM-2353BE632D97434DAD55AEBD0866C44DVAT5") .appType("APP_GNQ1RGK68X4JNZUEU8RQ") .systemToken("XH866P81QDOTQ0218TGZM9WCNXOF24WIP488M7A5") .userId("332051151139376769").build(), YDConf.FORM_QUERY.retrieve_id).getFormData(); String s = data1.get("tableField_m96gje14").toString(); String warehouse = JSON.parseArray(s).getJSONObject(0).get("selectField_m88f1qi8").toString();//所属仓库 String WarehouseLocation = JSON.parseArray(s).getJSONObject(0).get("textField_m8mnxgql").toString();//所属库位 String SafetyValue = JSON.parseArray(s).getJSONObject(0).get("numberField_m8873fn4").toString();//安全库存值 BigDecimal numberFieldM9c8n9go = new BigDecimal(JSON.parseArray(s).getJSONObject(0).get("numberField_m9c8n9go").toString());//仓库数量 BigDecimal numm = numberFieldM9c8n9go.subtract(new BigDecimal(map1.get("numberField_m9grj2ij").toString())); //调拨后的库存数量 = 仓库数量 - 调拨数量 ArrayList> maps_YD = new ArrayList<>(); Map sss=new HashMap<>(); sss.put("selectField_m88f1qi8",warehouse);//所属仓库 sss.put("textField_m8mnxgql",WarehouseLocation);//所属库位 sss.put("numberField_m8873fn4",SafetyValue);//安全库存值 sss.put("numberField_m9c8n9go",numm);//仓库数量 maps_YD.add(sss); ydClient.operateData(YDParam.builder().formInstId(LBJId) .formUuid("FORM-2353BE632D97434DAD55AEBD0866C44DVAT5") .appType("APP_GNQ1RGK68X4JNZUEU8RQ") .systemToken("XH866P81QDOTQ0218TGZM9WCNXOF24WIP488M7A5") .updateFormDataJson(JSONObject.toJSONString(UtilMap.map("tableField_m96gje14",maps_YD))) .userId("332051151139376769").build(),YDConf.FORM_OPERATION.update); //TODO:2、调入零部件处理 String LBJId2 = map1.get("textField_maxendgs").toString();//(调入)零部件的实例id System.out.println("调入的所属库位:"+map1.get("textField_m9grj2il").toString());//产品库位 System.out.println("调入的所属仓库:"+map1.get("textField_m9grj2ik").toString());//产品仓库 System.out.println("调拨前数量:"+map1.get("numberField_maz574d0").toString());//调拨前数量 Map data2 = ydClient.queryData(YDParam.builder().formInstId(LBJId2) .formUuid("FORM-2353BE632D97434DAD55AEBD0866C44DVAT5") .appType("APP_GNQ1RGK68X4JNZUEU8RQ") .systemToken("XH866P81QDOTQ0218TGZM9WCNXOF24WIP488M7A5") .userId("332051151139376769").build(), YDConf.FORM_QUERY.retrieve_id).getFormData(); String s1 = data2.get("tableField_m96gje14").toString(); String warehouse1 = JSON.parseArray(s1).getJSONObject(0).get("selectField_m88f1qi8").toString();//所属仓库 String WarehouseLocation1 = JSON.parseArray(s1).getJSONObject(0).get("textField_m8mnxgql").toString();//所属库位 String SafetyValue1 = JSON.parseArray(s1).getJSONObject(0).get("numberField_m8873fn4").toString();//安全库存值 BigDecimal numberFieldM9c8n9go1 = new BigDecimal(JSON.parseArray(s1).getJSONObject(0).get("numberField_m9c8n9go").toString());//仓库数量 BigDecimal numm1 = numberFieldM9c8n9go1.add(new BigDecimal(map1.get("numberField_m9grj2ij").toString())); //调拨后的库存数量 = 仓库数量 + 调拨数量 ArrayList> maps_YD1 = new ArrayList<>(); Map sss1=new HashMap<>(); sss1.put("selectField_m88f1qi8",warehouse1);//所属仓库 sss1.put("textField_m8mnxgql",WarehouseLocation1);//所属库位 sss1.put("numberField_m8873fn4",SafetyValue1);//安全库存值 sss1.put("numberField_m9c8n9go",numm1);//仓库数量 maps_YD1.add(sss1); ydClient.operateData(YDParam.builder().formInstId(LBJId2) .formUuid("FORM-2353BE632D97434DAD55AEBD0866C44DVAT5") .appType("APP_GNQ1RGK68X4JNZUEU8RQ") .systemToken("XH866P81QDOTQ0218TGZM9WCNXOF24WIP488M7A5") .updateFormDataJson(JSONObject.toJSONString(UtilMap.map("tableField_m96gje14",maps_YD1))) .userId("332051151139376769").build(),YDConf.FORM_OPERATION.update); BigDecimal AvailableInventoryQuantity_AAA = null; BigDecimal InventoryQuantity_AAA = null; if(!data1.get("numberField_m8gz97nk_value").toString().isEmpty()){ AvailableInventoryQuantity_AAA = new BigDecimal( data1.get("numberField_m8gz97nk").toString());//可用库存数量 }else { AvailableInventoryQuantity_AAA = BigDecimal.valueOf(0); } if(!data1.get("numberField_m8obn6wk_value").toString().isEmpty()){ InventoryQuantity_AAA = new BigDecimal(data1.get("numberField_m8obn6wk").toString());//存库数量 }else { InventoryQuantity_AAA = BigDecimal.valueOf(0); } BigDecimal AvailableInventoryQuantity_BBB = null; BigDecimal InventoryQuantity_BBB = null; if(!data2.get("numberField_m8gz97nk_value").toString().isEmpty()){ AvailableInventoryQuantity_BBB = new BigDecimal( data2.get("numberField_m8gz97nk").toString());//可用库存数量 }else { AvailableInventoryQuantity_BBB = BigDecimal.valueOf(0); } if(!data2.get("numberField_m8obn6wk_value").toString().isEmpty()){ InventoryQuantity_BBB = new BigDecimal(data2.get("numberField_m8obn6wk").toString());//可用库存数量 }else { InventoryQuantity_BBB = BigDecimal.valueOf(0); } System.out.println("---------------------------------------零部件子表数据修改完毕--------------------------------"); // BigDecimal FreezeQuantity_AAA = FreezeQuantity.subtract( new BigDecimal( map1.get("numberField_ma0e13js").toString()));//冻结数量(新) = 冻结数量 - 退货数量 //TODO:3、调出物料的可用库存 BigDecimal AvailableQuantity_AAA = AvailableInventoryQuantity_AAA.subtract(new BigDecimal( map1.get("numberField_m9grj2ij").toString()));//可用存库数量(新) = 可用库存数量 - 调拨数量 BigDecimal Quantity_AAA = InventoryQuantity_AAA.subtract(new BigDecimal(map1.get("numberField_m9grj2ij").toString()));//存库数量(新) = 存库数量 - 调拨数量 //TODO:4、调入物料的可用库存 BigDecimal AvailableQuantity_BBB = AvailableInventoryQuantity_BBB.add(new BigDecimal( map1.get("numberField_m9grj2ij").toString()));//可用存库数量(新) = 可用库存数量 + 调拨数量 BigDecimal Quantity_BBB = InventoryQuantity_BBB.add(new BigDecimal(map1.get("numberField_m9grj2ij").toString())); ydClient.operateData(YDParam.builder().formInstId(LBJId) .formUuid("FORM-2353BE632D97434DAD55AEBD0866C44DVAT5") .appType("APP_GNQ1RGK68X4JNZUEU8RQ") .systemToken("XH866P81QDOTQ0218TGZM9WCNXOF24WIP488M7A5") .updateFormDataJson(JSONObject.toJSONString(UtilMap.map("numberField_m8gz97nk, numberField_m8obn6wk",AvailableQuantity_AAA,Quantity_AAA))) .userId("332051151139376769") .build(),YDConf.FORM_OPERATION.update); ydClient.operateData(YDParam.builder().formInstId(LBJId2) .formUuid("FORM-2353BE632D97434DAD55AEBD0866C44DVAT5") .appType("APP_GNQ1RGK68X4JNZUEU8RQ") .systemToken("XH866P81QDOTQ0218TGZM9WCNXOF24WIP488M7A5") .updateFormDataJson(JSONObject.toJSONString(UtilMap.map("numberField_m8gz97nk, numberField_m8obn6wk",AvailableQuantity_BBB,Quantity_BBB))) .userId("332051151139376769") .build(),YDConf.FORM_OPERATION.update); System.out.println("----------------------零部件主表数据修改完毕!------------------"); } return McR.success(); } @Override public McR shareRecord(Map data) { String pid = getString(data.get("pid")); if (Strings.isNotBlank(pid)){ //发起审批 String[] dd = McProject.getDd(pid); String appKey = ""; String appSecret = ""; String agentId = ""; if (!PublicUtil.isNull(pid) && dd != null && dd.length >= 3) { appKey = dd[0]; appSecret = dd[1]; agentId = dd[2]; } String[] yida = McProject.getYida(pid); String appType = ""; String systemToken = ""; if (!PublicUtil.isNull(pid) && dd != null && dd.length >= 2) { appType = yida[0]; systemToken = yida[1]; } // 执行分享逻辑 [ 拼接后的权限组 ] McException.assertParamException_Null(data, "compId, userIds, userId, atUserId, isNotice"); //开始抓取宜搭对应的子表数据 String processInstanceId = data.get("processInstanceId").toString(); List atUserId = (List) data.get("atUserId"); Map map = new HashMap(); map.put(UtilMap.getString(data, "compId"),UtilMap.getList(data, "userIds")); ydClient.operateData(YDParam.builder() .appType(appType) .systemToken(systemToken) .formInstId(processInstanceId) .updateFormDataJson(JSON.toJSONString(map)) .build(), YDConf.FORM_OPERATION.update); String userIds = String.valueOf(data.get("atUserId")); String[] split = userIds.split(","); ArrayList names = new ArrayList<>(); for(Object auserId : split){ 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); Object result = ddrNew.getResult(); if (result != null) { JSONObject jsonObject = JSONObject.parseObject(JSONObject.toJSONString(result)); String name = jsonObject.getString("name"); names.add(name); } } List searchCondition = new ArrayList<>(); searchCondition.addAll(Arrays.asList( YDConf.searchCondition_TextFiled(data.get("processKey").toString(), data.get("processInstanceId").toString(),"eq") )); String title = UtilMap.getString(data, "content").isEmpty() || !ObjectUtil.isNotNull(UtilMap.getString(data, "content")) ? "单据分享" : UtilMap.getString(data, "content"); ydClient.operateData(YDParam.builder() .appType(appType) .systemToken(systemToken) .searchCondition(JSON.toJSONString(searchCondition)) .formUuid(data.get("formId").toString()) .formDataJson(JSON.toJSONString(UtilMap.map(data.get("processKey").toString()+", "+data.get("empKey").toString()+", "+data.get("titleKey").toString(), data.get("processInstanceId").toString(),UtilMap.getList(data, "userIds"),title))) .useLatestVersion(true) .build(), YDConf.FORM_OPERATION.upsert_v2); if (UtilMap.getBoolean(data, "isNotice")) { // data.put("content", names.stream().collect(Collectors.joining(",")) + UtilMap.getString(data, "content")); String appUrl = data.get("appUrl").toString(); String pcUrl = data.get("pcUrl").toString(); if ( !ObjectUtil.isNotNull(UtilMap.getString(data,"sendType")) || UtilMap.getString(data,"sendType").isEmpty() || "工作通知".equals(UtilMap.getString(data,"sendType"))){ Map contentMap = new HashMap<>(); contentMap.put("title",title); contentMap.put("text",title); contentMap.put("picUrl",pcUrl+"/processDetail"+"?procInsId="+processInstanceId); contentMap.put("messageUrl",pcUrl+"/processDetail"+"?procInsId="+processInstanceId); Map msg = new HashMap<>(); msg.put("msgtype","link"); msg.put("link",contentMap); sendNotification(ddClient.getAccessToken(appKey,appSecret),atUserId,null,false,msg,agentId); } else if ("钉钉代办".equals(UtilMap.getString(data, "sendType"))) { /*查询钉钉人员*/ ddClientWorkflow.createTBTask(ddClient.getAccessToken(appKey,appSecret),UtilMap.getString(data, "userId"),"流程分享:"+UtilMap.getString(data, "content"),UtilMap.getString(data, "content"), UtilDateTime.getLocalDateTimeTimeStamp(LocalDate.now().plusDays(7).atTime(LocalTime.MAX)), atUserId,null ,UtilMap.map("appUrl, pcUrl",appUrl+"/processDetail"+"?procInsId="+processInstanceId,pcUrl+"/processDetail"+"?procInsId="+processInstanceId),false,30,UtilMap.map("dingNotify","1")); } } return McR.success(); } return McR.errorParam("参数缺失!"); } public String sendNotification(String access_token, List userid_list, List dept_id_list, boolean to_all_user, Map msg, String agent_id) { Map body = UtilMap.map("agent_id, to_all_user, msg", new Object[]{agent_id, to_all_user, msg}); if (UtilList.isNotEmpty(userid_list)) { body.put("userid_list", String.join(",", userid_list)); } if (UtilList.isNotEmpty(dept_id_list)) { body.put("dept_id_list", String.join(",", dept_id_list)); } DDR ddr = DDR.doPost("https://oapi.dingtalk.com/topapi/message/corpconversation/asyncsend_v2", (Map)null, DDConf.initTokenParams(access_token), body); return ddr.getTask_id(); } @Async @Override public void batchUpdateSpecifiedQuantityData(Map map) { try { String pid = UtilMap.getString(map, "pid"); MDC.put("MDC_KEY_PID",pid); String formInstId = UtilMap.getString(map, "formInstId");//当前表实例id //查询当前表formData Map formData = ydClient.queryData(YDParam.builder() .formInstanceId(formInstId) .build(), YDConf.FORM_QUERY.retrieve_id).getFormData(); //目标表筛选字段唯一标识 String[] searchFields = UtilMap.getString(map, "searchFieldStr").split(","); //目标表筛选字段值 String[] searchFieldValues = UtilMap.getString(map, "searchFieldValueStr").split(","); Map searchCondition = new HashMap(); if (searchFields.length == searchFieldValues.length){ for (int i = 0; i < searchFields.length; i++) { searchCondition.put(searchFields[i],searchFieldValues[i]); } }else { log.info("筛选字段和筛选值数量不一致"); } int quantity = UtilMap.getInt(map, "quantity");//指定更新数量 if (quantity > 100){ log.info("更新数量不能大于100"); } String formUuid = UtilMap.getString(map, "formUuid");//目标表uuid List data = (List) ydClient.queryData(YDParam.builder() .searchCondition(JSONObject.toJSONString(searchCondition)) .formUuid(formUuid) .pageSize(quantity) .build(), YDConf.FORM_QUERY.retrieve_list).getData(); //目标表更新字段唯一标识 String[] fieldStrs = UtilMap.getString(map, "fieldStr").split(","); //当前表字段唯一标识 String[] currentFieldStrs = UtilMap.getString(map, "currentFieldStrs").split(","); Map updateFormData = new HashMap(); if (fieldStrs.length == currentFieldStrs.length){ for (int i = 0; i < fieldStrs.length; i++) { updateFormData.put(fieldStrs[i],YDConf.getDataByCompId(formData,currentFieldStrs[i])); } }else { log.info("更新字段和当前表字段数量不一致"); } for (Map datum : data) { String formInstanceId = UtilMap.getString(datum, "formInstanceId"); ydClient.operateData(YDParam.builder() .formInstanceId(formInstanceId) .updateFormDataJson(JSONObject.toJSONString(updateFormData)) .build(), YDConf.FORM_OPERATION.update); } log.info("批量更新成功"); }catch (Exception e){ log.info("更新数据失败:{}",e.getMessage()); } } private static void extractOperatorIds(JSONArray array, List result) { for (Object item : array) { JSONObject obj = (JSONObject) item; // 提取当前层级的 operatorUserId 或 operator String userId = obj.getString("operatorUserId"); if (userId == null) userId = obj.getString("operator"); // 处理 domainList 中的字段 if (userId != null) result.add(userId); // 递归处理 domainList JSONArray domainList = obj.getJSONArray("domainList"); if (domainList != null && !domainList.isEmpty()) { extractOperatorIds(domainList, result); } } } private String getString(Object obj){ return obj == null ? "" : obj.toString(); } private List getTableData(List> details){ List table = new ArrayList<>(); for (Map detail : details) { Map row = UtilMap.empty(); for (String subId : details.get(0).keySet()) { // ppExt: 组件会返回带有_id/_value字段, 关联表单 & 成员组件赋值为原字段 [关联表单仅仅会返回带Id字段, 成员组件不带Id返回姓名过滤] if (subId.endsWith("_value") || (subId.startsWith("employeeField_") && !subId.endsWith("_id"))) { continue; } if (subId.endsWith("_id")) { if (subId.startsWith("employeeField_") || subId.startsWith("associationFormField_")) { subId = subId.replace("_id", ""); } else { continue; } } row.put(subId, YDConf.getDataByCompId(detail, subId)); } table.add(row); } return table; } }