|
@@ -1,5 +1,6 @@
|
|
|
package com.malk.kuaikeli.service.impl;
|
|
|
|
|
|
+import cn.hutool.core.date.DateUtil;
|
|
|
import cn.hutool.core.util.NumberUtil;
|
|
|
import com.alibaba.fastjson.JSON;
|
|
|
import com.alibaba.fastjson.JSONArray;
|
|
@@ -7,10 +8,13 @@ import com.alibaba.fastjson.JSONObject;
|
|
|
import com.malk.kuaikeli.service.KKLService;
|
|
|
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_New;
|
|
|
import com.malk.service.aliwork.YDClient;
|
|
|
import com.malk.service.aliwork.YDService;
|
|
|
+import com.malk.service.dingtalk.DDClient;
|
|
|
import com.malk.utils.*;
|
|
|
import lombok.SneakyThrows;
|
|
|
import lombok.Synchronized;
|
|
@@ -41,6 +45,15 @@ public class KKLImplService implements KKLService {
|
|
|
@Autowired
|
|
|
private YDService ydService;
|
|
|
|
|
|
+ @Autowired
|
|
|
+ private YDClient ydClient;
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private DDClient ddClient;
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private DDConf ddConf;
|
|
|
+
|
|
|
/**
|
|
|
* [动态] 发起单据, 分供应商进行流程推送
|
|
|
*/
|
|
@@ -68,9 +81,6 @@ public class KKLImplService implements KKLService {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- @Autowired
|
|
|
- private YDClient ydClient;
|
|
|
-
|
|
|
/**
|
|
|
* 菜单计划, 编辑校验
|
|
|
* -
|
|
@@ -702,11 +712,18 @@ public class KKLImplService implements KKLService {
|
|
|
}
|
|
|
|
|
|
|
|
|
+ @Async
|
|
|
@Override
|
|
|
- public McR updateSuppliers(String formInstId) {
|
|
|
+ public void updateSuppliers(String formInstId) {
|
|
|
+ //获取当前时间戳
|
|
|
+ long beginTimestamp = System.currentTimeMillis();
|
|
|
+ log.info("开始更新定价单供应商:{}",DateUtil.format(new Date(beginTimestamp), "yyyy-MM-dd HH:mm:ss"));
|
|
|
+
|
|
|
//查询定价单供应商变更实例
|
|
|
- Map formData = ydClient.queryData(YDParam.builder()
|
|
|
- .formInstanceId(formInstId).build(), YDConf.FORM_QUERY.retrieve_id).getFormData();
|
|
|
+ DDR_New ddrNew = ydClient.queryData(YDParam.builder()
|
|
|
+ .formInstanceId(formInstId).build(), YDConf.FORM_QUERY.retrieve_id);
|
|
|
+ String userId = ((Map) ddrNew.getOriginator()).get("userId").toString();
|
|
|
+ Map formData = ddrNew.getFormData();
|
|
|
|
|
|
String oldSupplierCode = String.valueOf(formData.get("textField_lv3w1k1l"));//旧供应商编号
|
|
|
String newSupplierCode = String.valueOf(formData.get("textField_llzzbai8"));//新供应商编号
|
|
@@ -721,15 +738,15 @@ public class KKLImplService implements KKLService {
|
|
|
|
|
|
String projectCode = String.valueOf(formData.get("textField_lllovku7"));//定价单编号
|
|
|
|
|
|
- //新供应商差异原材料编号
|
|
|
- List<String> newDiffSupplierMaterialCodes = new ArrayList<>();
|
|
|
+ //新供应商未匹配原材料编号
|
|
|
+// List<String> newDiffSupplierMaterialCodes = new ArrayList<>();
|
|
|
//新供应商匹配原材料编号
|
|
|
List<String> newMatchSupplierMaterialCodes = new ArrayList<>();
|
|
|
//新供应商匹配原材料名称
|
|
|
List<String> newMatchSupplierMaterialNames = new ArrayList<>();
|
|
|
|
|
|
- //老供应商差异原材料编号
|
|
|
- List<String> oldDiffSupplierMaterialCodes = new ArrayList<>();
|
|
|
+ //老供应商未匹配原材料编号
|
|
|
+ List<String> oldNotMatchSupplierMaterialCodes = new ArrayList<>();
|
|
|
//老供应商匹配原材料编号
|
|
|
List<String> oldMatchSupplierMaterialCodes = new ArrayList<>();
|
|
|
|
|
@@ -756,17 +773,18 @@ public class KKLImplService implements KKLService {
|
|
|
newMatchSupplierMaterialCodes.add(newCode);
|
|
|
newMatchSupplierMaterialNames.add(newName);
|
|
|
}
|
|
|
- //未选择老供应商原材料且新供应商原材料不存在
|
|
|
- if ((Objects.isNull(diff.get("associationFormField_lywr2qcr_id")) && !newSupplierMaterialCodes.contains(newCode))){
|
|
|
- oldDiffSupplierMaterialCodes.add(oldCode);
|
|
|
- newDiffSupplierMaterialCodes.add(newCode);
|
|
|
+ //未选择新供应商原材料
|
|
|
+ if (Objects.isNull(diff.get("associationFormField_lywr2qcr_id"))){
|
|
|
+ oldNotMatchSupplierMaterialCodes.add(oldCode);
|
|
|
+// newDiffSupplierMaterialCodes.add(newCode);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- //校验新供应商原材料编号是否重复
|
|
|
- HashSet<String> set = new HashSet<>(newDiffSupplierMaterialCodes);
|
|
|
- if (set.size() != newDiffSupplierMaterialCodes.size()){
|
|
|
- return McR.errorUnknown("新供应商原材料编号存在重复!");
|
|
|
+ //校验已选择的新供应商原材料编号是否重复
|
|
|
+ HashSet<String> set = new HashSet<>(newMatchSupplierMaterialCodes);
|
|
|
+ if (set.size() != newMatchSupplierMaterialCodes.size()){
|
|
|
+ log.info("新供应商原材料编号存在重复!");
|
|
|
+ return;
|
|
|
}
|
|
|
|
|
|
/*for (Map diff : diffList) {
|
|
@@ -794,59 +812,12 @@ public class KKLImplService implements KKLService {
|
|
|
}*/
|
|
|
|
|
|
//未匹配上的原材料
|
|
|
- List<String> notMatchCodes = new ArrayList<>();
|
|
|
+// List<String> notMatchCodes = new ArrayList<>();
|
|
|
|
|
|
//获取旧供应商定价单明细中间表
|
|
|
List<Map> oldSupplierMaterials = getYdFormDataList(PRICE_DETAIL_MIDDLE, JSON.toJSONString(UtilMap.map("textField_llzzbyj1, textField_llm1vtjm", oldSupplierCode,projectCode)), YDConf.FORM_QUERY.retrieve_list);
|
|
|
- for (Map oldSupplierMaterial : oldSupplierMaterials) {
|
|
|
- Map oldSupplierMaterialFormData = (Map) oldSupplierMaterial.get("formData");
|
|
|
- String code = String.valueOf(oldSupplierMaterialFormData.get("textField_llkb7kd2"));
|
|
|
- String name = String.valueOf(oldSupplierMaterialFormData.get("textField_llkb7kd1"));
|
|
|
- String formInstanceId = String.valueOf(oldSupplierMaterial.get("formInstanceId"));
|
|
|
-
|
|
|
- String newCode = "";
|
|
|
-
|
|
|
- //更新定价单明细中间表
|
|
|
- oldSupplierMaterialFormData.put("textField_lmsli3bq", newSupplierName);//供应商名称
|
|
|
- oldSupplierMaterialFormData.put("textField_llzzbyj1", newSupplierCode);//供应商编号
|
|
|
-
|
|
|
- //未匹配上的原材料 将明细删除
|
|
|
- int index1 = oldDiffSupplierMaterialCodes.indexOf(code);
|
|
|
- if (index1 != -1){
|
|
|
- /*ydClient.operateData(YDParam.builder().formUuid(PRICE_DETAIL_MIDDLE)
|
|
|
- .formInstanceId(formInstanceId)
|
|
|
- .updateFormDataJson(JSON.toJSONString(UtilMap.map("textField_lm4lxur8","已停用"))).build(), YDConf.FORM_OPERATION.update);
|
|
|
-*/
|
|
|
- ydClient.operateData(YDParam.builder().formUuid(PRICE_DETAIL_MIDDLE)
|
|
|
- .formInstanceId(formInstanceId)
|
|
|
- .build(), YDConf.FORM_OPERATION.delete);
|
|
|
- notMatchCodes.add(code);
|
|
|
- continue;
|
|
|
- }
|
|
|
- //手动匹配上的原材料
|
|
|
- int index2 = oldMatchSupplierMaterialCodes.indexOf(code);
|
|
|
- if (index2 != -1){
|
|
|
- newCode = newMatchSupplierMaterialCodes.get(index2);
|
|
|
- oldSupplierMaterialFormData.put("textField_llkb7kd2", newCode);//物品编号
|
|
|
- oldSupplierMaterialFormData.put("textField_llkb7kd1",newMatchSupplierMaterialNames.get(index2));//物品名称
|
|
|
- ydClient.operateData(YDParam.builder().formUuid(PRICE_DETAIL_MIDDLE)
|
|
|
- .formInstanceId(formInstanceId)
|
|
|
- .updateFormDataJson(JSON.toJSONString(oldSupplierMaterialFormData)).build(), YDConf.FORM_OPERATION.update);
|
|
|
- continue;
|
|
|
- }
|
|
|
- //自动匹配上的原材料
|
|
|
- for (Map newSupplierMaterial : newSupplierMaterials) {
|
|
|
- Map newSupplierMaterialFormData = (Map) newSupplierMaterial.get("formData");
|
|
|
- if (String.valueOf(newSupplierMaterialFormData.get("textField_llkb7kd1")).equals(name)){
|
|
|
- newCode = newSupplierMaterialFormData.get("textField_llkb7kd2").toString();
|
|
|
- oldSupplierMaterialFormData.put("textField_llkb7kd2", newCode);//物品编号
|
|
|
- ydClient.operateData(YDParam.builder().formUuid(PRICE_DETAIL_MIDDLE)
|
|
|
- .formInstanceId(formInstanceId)
|
|
|
- .updateFormDataJson(JSON.toJSONString(oldSupplierMaterialFormData)).build(), YDConf.FORM_OPERATION.update);
|
|
|
- break;
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
+ //处理旧供应商定价单明细中间表
|
|
|
+ handleOldSupplierPriceDetailMiddle(oldSupplierMaterials,newSupplierName,newSupplierCode,oldNotMatchSupplierMaterialCodes,oldMatchSupplierMaterialCodes,newMatchSupplierMaterialCodes,newMatchSupplierMaterialNames,newSupplierMaterials);
|
|
|
|
|
|
//更新定价单
|
|
|
String supplierInstanceId = supplier.get(0).get("instanceId").toString();
|
|
@@ -883,7 +854,7 @@ public class KKLImplService implements KKLService {
|
|
|
for (Map material : materialList) {
|
|
|
String code = material.get("textField_lmk94yf5").toString();
|
|
|
//如果明细被删除
|
|
|
- if (notMatchCodes.contains(code)){
|
|
|
+ if (oldNotMatchSupplierMaterialCodes.contains(code)){
|
|
|
errorCodes.add(code);
|
|
|
continue;
|
|
|
}
|
|
@@ -927,10 +898,6 @@ public class KKLImplService implements KKLService {
|
|
|
.build(), YDConf.FORM_OPERATION.update);
|
|
|
|
|
|
/*for (Map material : materialList) {
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
String code = material.get("textField_lmk94yf5").toString();//老供应商原材料编号
|
|
|
if (changeCodeMap.containsKey(code)){
|
|
|
material.put("textField_lmk94yf5", changeCodeMap.get(code));//新供应商原材料编号
|
|
@@ -945,8 +912,110 @@ public class KKLImplService implements KKLService {
|
|
|
.build(),YDConf.FORM_OPERATION.update);*/
|
|
|
}
|
|
|
|
|
|
- return McR.success();
|
|
|
+ long endTimestamp = System.currentTimeMillis();
|
|
|
+ log.info("更新供应商结束:{}",DateUtil.format(new Date(endTimestamp), "yyyy-MM-dd HH:mm:ss"));
|
|
|
+ log.info("耗时:{}秒",(endTimestamp - beginTimestamp)/1000);
|
|
|
+ //发送工作通知给发起人
|
|
|
+ if (Objects.nonNull(userId)){
|
|
|
+ Map param2 = new HashMap();
|
|
|
+ param2.put("access_token",ddClient.getAccessToken("dingtydw7atg0yzh2trz","x47ctlj-H4frFAcJbWQ0jz8rBlvKp4BmSML3nXYgB99Br2MrVQsV6RGUxHBTN-m7"));
|
|
|
+ Map body3 = new HashMap();
|
|
|
+ body3.put("agent_id","3205833281");
|
|
|
+ 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 + ",耗时:" + (endTimestamp - beginTimestamp)/1000 + "秒"));
|
|
|
+ body3.put("msg",msg);
|
|
|
+ String s = UtilHttp.doPost("https://oapi.dingtalk.com/topapi/message/corpconversation/asyncsend_v2", null, param2, body3);
|
|
|
+
|
|
|
+ log.info("发送工作通知给发起人:{}",s);
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
|
|
|
+ //处理旧供应商定价单中间表
|
|
|
+ private void handleOldSupplierPriceDetailMiddle(List<Map> oldSupplierMaterials,String newSupplierName, String newSupplierCode,
|
|
|
+ List<String> oldNotMatchSupplierMaterialCodes,List<String> oldMatchSupplierMaterialCodes,
|
|
|
+ List<String> newMatchSupplierMaterialCodes,List<String> newMatchSupplierMaterialNames,
|
|
|
+ List<Map> newSupplierMaterials) {
|
|
|
+
|
|
|
+ int maxAttempts = 5; // 尝试的最大次数
|
|
|
+ int attempt = 0;
|
|
|
+ for (Map oldSupplierMaterial : oldSupplierMaterials) {
|
|
|
+ boolean success = false;
|
|
|
+ attempt = 0; // 重置当前迭代的尝试次数
|
|
|
+
|
|
|
+ Map oldSupplierMaterialFormData = (Map) oldSupplierMaterial.get("formData");
|
|
|
+ String code = String.valueOf(oldSupplierMaterialFormData.get("textField_llkb7kd2"));
|
|
|
+ String name = String.valueOf(oldSupplierMaterialFormData.get("textField_llkb7kd1"));
|
|
|
+ String formInstanceId = String.valueOf(oldSupplierMaterial.get("formInstanceId"));
|
|
|
+
|
|
|
+ String newCode = "";
|
|
|
+
|
|
|
+ //更新定价单明细中间表
|
|
|
+ oldSupplierMaterialFormData.put("textField_lmsli3bq", newSupplierName);//供应商名称
|
|
|
+ oldSupplierMaterialFormData.put("textField_llzzbyj1", newSupplierCode);//供应商编号
|
|
|
+
|
|
|
+ while (!success && attempt < maxAttempts){
|
|
|
+ try {
|
|
|
+ int index1 = oldNotMatchSupplierMaterialCodes.indexOf(code);
|
|
|
+ int index2 = oldMatchSupplierMaterialCodes.indexOf(code);
|
|
|
+
|
|
|
+ //未匹配上的原材料 将明细删除
|
|
|
+ if (index1 != -1){
|
|
|
+ /*ydClient.operateData(YDParam.builder().formUuid(PRICE_DETAIL_MIDDLE)
|
|
|
+ .formInstanceId(formInstanceId)
|
|
|
+ .updateFormDataJson(JSON.toJSONString(UtilMap.map("textField_lm4lxur8","已停用"))).build(), YDConf.FORM_OPERATION.update);*/
|
|
|
+ ydClient.operateData(YDParam.builder().formUuid(PRICE_DETAIL_MIDDLE)
|
|
|
+ .formInstanceId(formInstanceId)
|
|
|
+ .build(), YDConf.FORM_OPERATION.delete);
|
|
|
+ }else if (index2 != -1){
|
|
|
+ //手动匹配上的原材料
|
|
|
+ newCode = newMatchSupplierMaterialCodes.get(index2);
|
|
|
+ oldSupplierMaterialFormData.put("textField_llkb7kd2", newCode);//物品编号
|
|
|
+ oldSupplierMaterialFormData.put("textField_llkb7kd1",newMatchSupplierMaterialNames.get(index2));//物品名称
|
|
|
+ ydClient.operateData(YDParam.builder().formUuid(PRICE_DETAIL_MIDDLE)
|
|
|
+ .formInstanceId(formInstanceId)
|
|
|
+ .updateFormDataJson(JSON.toJSONString(oldSupplierMaterialFormData)).build(), YDConf.FORM_OPERATION.update);
|
|
|
+ }else {
|
|
|
+ //自动匹配上的原材料
|
|
|
+ for (Map newSupplierMaterial : newSupplierMaterials) {
|
|
|
+ Map newSupplierMaterialFormData = (Map) newSupplierMaterial.get("formData");
|
|
|
+ if (String.valueOf(newSupplierMaterialFormData.get("textField_llkb7kd1")).equals(name)){
|
|
|
+ newCode = newSupplierMaterialFormData.get("textField_llkb7kd2").toString();
|
|
|
+ oldSupplierMaterialFormData.put("textField_llkb7kd2", newCode);//物品编号
|
|
|
+ ydClient.operateData(YDParam.builder().formUuid(PRICE_DETAIL_MIDDLE)
|
|
|
+ .formInstanceId(formInstanceId)
|
|
|
+ .updateFormDataJson(JSON.toJSONString(oldSupplierMaterialFormData)).build(), YDConf.FORM_OPERATION.update);
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ success = true;
|
|
|
+ }catch (McException e){
|
|
|
+ if (e.getMessage().equals("The request has failed due to a temporary failure of the server.")){
|
|
|
+ attempt++;
|
|
|
+ // 线程睡眠3秒
|
|
|
+ try {
|
|
|
+ Thread.sleep(3000);
|
|
|
+ } catch (InterruptedException ie) {
|
|
|
+ Thread.currentThread().interrupt(); // 重新设置中断状态
|
|
|
+ System.err.println("Sleep interrupted: " + ie.getMessage());
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }catch (Exception e){
|
|
|
+ log.error("处理旧供应商定价单中间表失败,实例id:{},物料名称:{},物料编号:{},异常信息:{}", formInstanceId, name,code, e.getMessage());
|
|
|
+ success = true;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (!success) {
|
|
|
+ // 如果达到最大尝试次数后仍未成功,可以选择退出循环或做其他处理
|
|
|
+ log.info("处理旧供应商定价单中间表失败,实例id:{},物料名称:{},物料编号:{},尝试次数:{}", formInstanceId, name,code, attempt);
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
}
|