2025-09-13 09:42:55 +00:00
|
|
|
package tqq9.lc123.cloud.app.api.controller;
|
|
|
|
|
|
2025-09-19 08:50:17 +00:00
|
|
|
import com.alibaba.fastjson.JSONArray;
|
|
|
|
|
import com.alibaba.fastjson.JSONObject;
|
2025-09-13 09:42:55 +00:00
|
|
|
import com.drew.lang.annotations.NotNull;
|
2025-09-19 08:50:17 +00:00
|
|
|
import kd.bos.dataentity.OperateOption;
|
2025-09-13 09:42:55 +00:00
|
|
|
import kd.bos.dataentity.entity.DynamicObject;
|
|
|
|
|
import kd.bos.dataentity.utils.StringUtils;
|
2025-09-19 08:50:17 +00:00
|
|
|
import kd.bos.entity.botp.runtime.ConvertOperationResult;
|
2025-09-13 09:42:55 +00:00
|
|
|
import kd.bos.entity.botp.runtime.PushArgs;
|
2025-09-19 08:50:17 +00:00
|
|
|
import kd.bos.entity.botp.runtime.SourceBillReport;
|
|
|
|
|
import kd.bos.entity.operate.result.IOperateInfo;
|
|
|
|
|
import kd.bos.entity.operate.result.OperationResult;
|
2025-09-13 09:42:55 +00:00
|
|
|
import kd.bos.form.plugin.AbstractFormPlugin;
|
|
|
|
|
import kd.bos.openapi.common.custom.annotation.ApiController;
|
|
|
|
|
import kd.bos.openapi.common.custom.annotation.ApiParam;
|
|
|
|
|
import kd.bos.openapi.common.custom.annotation.ApiPostMapping;
|
|
|
|
|
import kd.bos.openapi.common.result.CustomApiResult;
|
|
|
|
|
import kd.bos.orm.query.QCP;
|
|
|
|
|
import kd.bos.orm.query.QFilter;
|
|
|
|
|
import kd.bos.servicehelper.BusinessDataServiceHelper;
|
2025-09-19 08:50:17 +00:00
|
|
|
import kd.bos.servicehelper.botp.ConvertServiceHelper;
|
|
|
|
|
import kd.bos.servicehelper.operation.OperationServiceHelper;
|
2025-09-13 09:42:55 +00:00
|
|
|
import kd.sdk.plugin.Plugin;
|
|
|
|
|
import tqq9.lc123.cloud.app.api.utils.ApiResultExt;
|
2025-09-19 08:50:17 +00:00
|
|
|
import tqq9.lc123.cloud.app.api.utils.Constants;
|
2025-09-13 09:42:55 +00:00
|
|
|
import tqq9.lc123.cloud.app.plugin.utils.BotpParamUtils;
|
|
|
|
|
|
2025-09-19 08:50:17 +00:00
|
|
|
import java.math.BigDecimal;
|
2025-09-13 09:42:55 +00:00
|
|
|
import java.util.*;
|
|
|
|
|
|
|
|
|
|
/**
|
2025-09-19 08:50:17 +00:00
|
|
|
* 入库回传java接口插件
|
2025-09-13 09:42:55 +00:00
|
|
|
*/
|
|
|
|
|
@ApiController(value = "AbstractFormPlugin", desc = "WMS-收获通知下推采购入库单")
|
|
|
|
|
public class WMSPurInController extends AbstractFormPlugin implements Plugin {
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private static String RECEIPTNOTICE = "pm_receiptnotice";
|
|
|
|
|
private static String PURINBILL = "im_purinbill";
|
|
|
|
|
private static String RECEIPTNOTICE_ENTRY = "billentry";
|
|
|
|
|
|
2025-09-19 08:50:17 +00:00
|
|
|
@ApiPostMapping(value = "/WMSPushPurIn", desc = "WMS-入库回传")
|
2025-09-13 09:42:55 +00:00
|
|
|
public CustomApiResult<ApiResultExt> WMS_PurInPush
|
|
|
|
|
(@NotNull @ApiParam(value = "入参", example = "") HashMap<String, Object> data) {
|
|
|
|
|
ApiResultExt resultExt = new ApiResultExt();
|
|
|
|
|
List<ApiResultExt.ResultBean> results = new ArrayList<>();
|
2025-09-19 08:50:17 +00:00
|
|
|
String VoucherType = (String) data.get("VoucherType");//单据类型
|
|
|
|
|
int index = 0;
|
|
|
|
|
if (StringUtils.equals("pm_receiptnotice", VoucherType)) {
|
|
|
|
|
String billno = (String) data.get("erpOrderCode");//收货通知单编号
|
2025-09-13 09:42:55 +00:00
|
|
|
//收货通知单
|
|
|
|
|
DynamicObject receiptnotice = BusinessDataServiceHelper.loadSingle(RECEIPTNOTICE, new QFilter[]{new QFilter("billno", QCP.equals, billno)});
|
2025-09-19 08:50:17 +00:00
|
|
|
JSONObject keys = new JSONObject();
|
|
|
|
|
keys.put("billno", billno);
|
|
|
|
|
ApiResultExt.ResultBean resultBean = new ApiResultExt.ResultBean();
|
|
|
|
|
ApiResultExt.Error error = new ApiResultExt.Error();
|
|
|
|
|
error.setRowMsg(new ArrayList<String>());
|
|
|
|
|
resultBean.setBillIndex(0);
|
|
|
|
|
resultBean.setKeys(keys);
|
|
|
|
|
resultBean.setNumber(billno);
|
|
|
|
|
resultBean.setType(Constants.TYPE_PUSH);
|
|
|
|
|
if (receiptnotice == null) {
|
|
|
|
|
index = 1;
|
|
|
|
|
List<String> rowMsg = error.getRowMsg();
|
|
|
|
|
rowMsg.add("根据传入编号:" + billno + "未找到对应收货通知单");
|
|
|
|
|
error.setRowMsg(rowMsg);
|
|
|
|
|
error.setEntityKey(Constants.IM_PURINBILL);
|
|
|
|
|
error.setKeys(keys);
|
|
|
|
|
resultBean.setId("");
|
|
|
|
|
resultBean.setBillStatus(false);
|
|
|
|
|
resultBean.setErrors(error);
|
|
|
|
|
results.add(resultBean);
|
|
|
|
|
} else {
|
|
|
|
|
Long id = receiptnotice.getLong("id");
|
|
|
|
|
Map<String, Object> param = new HashMap<>();//传入转换规则处理参数
|
|
|
|
|
HashMap<Long, Set<Long>> entitypkMap = new HashMap<>();//上下游id映射Map
|
|
|
|
|
JSONObject detailObject = new JSONObject();
|
|
|
|
|
JSONArray details = (JSONArray) data.get("details");
|
|
|
|
|
for (Object detail : details) {
|
|
|
|
|
JSONObject detail1 = (JSONObject) detail;
|
|
|
|
|
String entryId = detail1.getString("erpDetailId");//金蝶源头单据细单号
|
|
|
|
|
BigDecimal quantity = detail1.getBigDecimal("quantity");//入库数量
|
|
|
|
|
String uniqueCode = detail1.getString("uniqueCode");//商品编码
|
|
|
|
|
Date manufactureDate = detail1.getDate("manufactureDate");//生产日期
|
|
|
|
|
Date expirationDate = detail1.getDate("expirationDate");//失效期
|
|
|
|
|
String batch = detail1.getString("batch");//批次
|
|
|
|
|
String registrationCode = detail1.getString("registrationCode");//注册证号
|
|
|
|
|
String licenceCode = detail1.getString("licenceCode");//生产许可证
|
|
|
|
|
String producer = detail1.getString("producer");//生产厂商
|
|
|
|
|
detailObject.put("entryId", entryId);
|
|
|
|
|
detailObject.put("uniqueCode", uniqueCode);
|
|
|
|
|
detailObject.put("quantity", quantity);
|
|
|
|
|
detailObject.put("manufactureDate", manufactureDate);
|
|
|
|
|
detailObject.put("expirationDate", expirationDate);
|
|
|
|
|
detailObject.put("batch", batch);
|
|
|
|
|
detailObject.put("registrationCode", registrationCode);
|
|
|
|
|
detailObject.put("licenceCode", licenceCode);
|
|
|
|
|
detailObject.put("producer", producer);
|
|
|
|
|
entitypkMap.computeIfAbsent(id, k -> new HashSet<>()).add(detail1.getLong("erpDetailId"));
|
|
|
|
|
param.put(entryId, detailObject);
|
|
|
|
|
}
|
|
|
|
|
//开始下推
|
|
|
|
|
String rule = BotpParamUtils.getBotpRuleId(RECEIPTNOTICE, PURINBILL, "收货通知单_采购入库单_转换规则");
|
|
|
|
|
PushArgs pushArgs = BotpParamUtils.getPushArgs(RECEIPTNOTICE, PURINBILL, RECEIPTNOTICE_ENTRY, param, entitypkMap, rule);
|
|
|
|
|
ConvertOperationResult pushResult = ConvertServiceHelper.pushAndSave(pushArgs);
|
|
|
|
|
List<SourceBillReport> billReports = pushResult.getBillReports();
|
|
|
|
|
if (!pushResult.isSuccess()) {
|
|
|
|
|
for (SourceBillReport billReport : billReports) {
|
|
|
|
|
String billMessage = billReport.getFailMessage();
|
|
|
|
|
List<String> rowMsg = error.getRowMsg();
|
|
|
|
|
rowMsg.add(billMessage);
|
|
|
|
|
error.setRowMsg(rowMsg);
|
|
|
|
|
error.setEntityKey(Constants.IM_PURINBILL);
|
|
|
|
|
error.setKeys(keys);
|
|
|
|
|
resultBean.setId("");
|
|
|
|
|
resultBean.setBillStatus(false);
|
|
|
|
|
resultBean.setErrors(error);
|
|
|
|
|
results.add(resultBean);
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
results.add(resultBean);
|
|
|
|
|
Set<Object> targetBillIds = pushResult.getTargetBillIds();
|
|
|
|
|
DynamicObject[] load = new DynamicObject[targetBillIds.size()];
|
|
|
|
|
HashMap<Object, String> reMap = new HashMap<Object, String>();
|
|
|
|
|
Iterator<Object> iterator = targetBillIds.iterator();
|
|
|
|
|
for (int i = 0; iterator.hasNext(); i++) {
|
|
|
|
|
Object next = iterator.next();
|
|
|
|
|
DynamicObject dynamicObject = BusinessDataServiceHelper.loadSingle(PURINBILL, new QFilter[]{new QFilter("id", QCP.equals, next)});
|
|
|
|
|
load[i] = dynamicObject;
|
|
|
|
|
reMap.put(dynamicObject.get("id"), dynamicObject.getString("billno"));
|
|
|
|
|
resultBean.setId(next.toString());
|
|
|
|
|
resultBean.setBillStatus(true);
|
|
|
|
|
}
|
|
|
|
|
//开始提交
|
|
|
|
|
OperateOption operateOption = OperateOption.create();
|
|
|
|
|
OperationResult sumbitResult = OperationServiceHelper.executeOperate(Constants.TYPE_SUBMIT, RECEIPTNOTICE, load, operateOption);
|
|
|
|
|
if(!sumbitResult.isSuccess()){
|
|
|
|
|
List<IOperateInfo> allErrorOrValidateInfo = sumbitResult.getAllErrorOrValidateInfo();
|
|
|
|
|
if(allErrorOrValidateInfo.size()!=0){
|
|
|
|
|
for (IOperateInfo iOperateInfo : allErrorOrValidateInfo) {
|
|
|
|
|
HashMap<String, Object> returnMap = resultExt.addErrorToResultBeanByNumber(results, iOperateInfo, Constants.AR_SETTLERECORD);
|
|
|
|
|
results = (List<ApiResultExt.ResultBean>) returnMap.get("ResultBeanList");
|
|
|
|
|
}
|
|
|
|
|
}else{
|
|
|
|
|
HashMap<String, Object> returnMap = resultExt.addOneErrorToResultBeanByNumber(results, sumbitResult.getMessage(), Constants.AR_SETTLERECORD);
|
|
|
|
|
results = (List<ApiResultExt.ResultBean>) returnMap.get("ResultBeanList");
|
|
|
|
|
}
|
2025-09-13 09:42:55 +00:00
|
|
|
|
2025-09-19 08:50:17 +00:00
|
|
|
}else {
|
|
|
|
|
//开始审核
|
|
|
|
|
OperationResult auditResult = OperationServiceHelper.executeOperate(Constants.TYPE_AUDIT, RECEIPTNOTICE, load, operateOption);
|
2025-09-13 09:42:55 +00:00
|
|
|
|
2025-09-19 08:50:17 +00:00
|
|
|
if(!auditResult.isSuccess()){
|
|
|
|
|
List<IOperateInfo> allErrorOrValidateInfo1 = auditResult.getAllErrorOrValidateInfo();
|
|
|
|
|
if(allErrorOrValidateInfo1.size()!=0){
|
|
|
|
|
for (IOperateInfo iOperateInfo : allErrorOrValidateInfo1) {
|
|
|
|
|
HashMap<String, Object> returnMap = resultExt.addErrorToResultBeanByNumber(results, iOperateInfo, Constants.AR_SETTLERECORD);
|
|
|
|
|
results = (List<ApiResultExt.ResultBean>) returnMap.get("ResultBeanList");
|
|
|
|
|
}
|
|
|
|
|
}else{
|
|
|
|
|
HashMap<String, Object> returnMap = resultExt.addOneErrorToResultBeanByNumber(results, auditResult.getMessage(), Constants.AR_SETTLERECORD);
|
|
|
|
|
results = (List<ApiResultExt.ResultBean>) returnMap.get("ResultBeanList");
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
2025-09-13 09:42:55 +00:00
|
|
|
}
|
2025-09-19 08:50:17 +00:00
|
|
|
int failCount = index;//失败数量
|
|
|
|
|
int successCount = 1 - index;//成功数量
|
|
|
|
|
resultExt.setFailCount(failCount);
|
|
|
|
|
resultExt.setSuccessCount(successCount);
|
2025-09-13 09:42:55 +00:00
|
|
|
resultExt.setResult(results);
|
|
|
|
|
return CustomApiResult.success(resultExt);
|
2025-09-19 08:50:17 +00:00
|
|
|
|
|
|
|
|
|
2025-09-13 09:42:55 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|