diff --git a/zt-module-contract-order/zt-module-contract-order-api/src/main/java/com/zt/plat/module/contractorder/enums/ErpConstants.java b/zt-module-contract-order/zt-module-contract-order-api/src/main/java/com/zt/plat/module/contractorder/enums/ErpConstants.java index b30145eb..9fe15adb 100644 --- a/zt-module-contract-order/zt-module-contract-order-api/src/main/java/com/zt/plat/module/contractorder/enums/ErpConstants.java +++ b/zt-module-contract-order/zt-module-contract-order-api/src/main/java/com/zt/plat/module/contractorder/enums/ErpConstants.java @@ -13,4 +13,7 @@ public class ErpConstants { public static final String WAREHOUSE_MMSITYPE_ENT = "ENT";//委托加工 public static final String WAREHOUSE_MMSITYPE_ENTED = "ENTED";//来料加工 + public static final String SALES_DOCUMENT_REQUEST_FLAG_U = "U";//更新 + public static final String SALES_DOCUMENT_REQUEST_FLAG_D = "D";//删除 + public static final String SALES_DOCUMENT_REQUEST_FLAG_I = "I";//插入 } diff --git a/zt-module-contract-order/zt-module-contract-order-server/src/main/java/com/zt/plat/module/contractorder/controller/admin/salesorder/vo/SalesOrderSaveReqVO.java b/zt-module-contract-order/zt-module-contract-order-server/src/main/java/com/zt/plat/module/contractorder/controller/admin/salesorder/vo/SalesOrderSaveReqVO.java index ba2c6fc6..6b18a32c 100644 --- a/zt-module-contract-order/zt-module-contract-order-server/src/main/java/com/zt/plat/module/contractorder/controller/admin/salesorder/vo/SalesOrderSaveReqVO.java +++ b/zt-module-contract-order/zt-module-contract-order-server/src/main/java/com/zt/plat/module/contractorder/controller/admin/salesorder/vo/SalesOrderSaveReqVO.java @@ -199,4 +199,6 @@ public class SalesOrderSaveReqVO { @ExcelProperty("订单明细") private List details; + @Schema(description = "系统订单号", requiredMode = Schema.RequiredMode.REQUIRED) + private String systemOrderNumber; } diff --git a/zt-module-contract-order/zt-module-contract-order-server/src/main/java/com/zt/plat/module/contractorder/dal/dataobject/salesorder/SalesOrderDO.java b/zt-module-contract-order/zt-module-contract-order-server/src/main/java/com/zt/plat/module/contractorder/dal/dataobject/salesorder/SalesOrderDO.java index b85d077e..db5c5c90 100644 --- a/zt-module-contract-order/zt-module-contract-order-server/src/main/java/com/zt/plat/module/contractorder/dal/dataobject/salesorder/SalesOrderDO.java +++ b/zt-module-contract-order/zt-module-contract-order-server/src/main/java/com/zt/plat/module/contractorder/dal/dataobject/salesorder/SalesOrderDO.java @@ -251,7 +251,7 @@ public class SalesOrderDO extends BusinessBaseDO { private String mtrlTp; /** - * 订单分类 + * 订单分类(字典:SALE_ORD_TP) * */ @TableField("SPLY_BSN_TP") diff --git a/zt-module-contract-order/zt-module-contract-order-server/src/main/java/com/zt/plat/module/contractorder/service/contract/ContractServiceImpl.java b/zt-module-contract-order/zt-module-contract-order-server/src/main/java/com/zt/plat/module/contractorder/service/contract/ContractServiceImpl.java index ee614c12..e15e3a83 100644 --- a/zt-module-contract-order/zt-module-contract-order-server/src/main/java/com/zt/plat/module/contractorder/service/contract/ContractServiceImpl.java +++ b/zt-module-contract-order/zt-module-contract-order-server/src/main/java/com/zt/plat/module/contractorder/service/contract/ContractServiceImpl.java @@ -1560,7 +1560,9 @@ public class ContractServiceImpl implements ContractService { // 合同状态校验 if (!(DictEnum.BSE_CTRT_STS_WAIT_PUSH.getCode().equals(contractMainDO.getStatus()) || DictEnum.BSE_CTRT_STS_VOID.getCode().equals(contractMainDO.getStatus()) - || DictEnum.BSE_CTRT_STS_TERMINATED.getCode().equals(contractMainDO.getStatus()))) { + || DictEnum.BSE_CTRT_STS_TERMINATED.getCode().equals(contractMainDO.getStatus()) + || DictEnum.BSE_CTRT_STS_PUSH_ERROR.getCode().equals(contractMainDO.getStatus()) + )) { throw exception(CONTRACT_STATUS_NOT_SUBMIT_ERP, DictEnum.getByCodeAndType(contractMainDO.getStatus(), DictTypeConstants.BSE_CTRT_STS).getLabel()); diff --git a/zt-module-contract-order/zt-module-contract-order-server/src/main/java/com/zt/plat/module/contractorder/service/purchaseorder/PrchOrdDtlServiceImpl.java b/zt-module-contract-order/zt-module-contract-order-server/src/main/java/com/zt/plat/module/contractorder/service/purchaseorder/PrchOrdDtlServiceImpl.java index 04d43202..cadaa2ef 100644 --- a/zt-module-contract-order/zt-module-contract-order-server/src/main/java/com/zt/plat/module/contractorder/service/purchaseorder/PrchOrdDtlServiceImpl.java +++ b/zt-module-contract-order/zt-module-contract-order-server/src/main/java/com/zt/plat/module/contractorder/service/purchaseorder/PrchOrdDtlServiceImpl.java @@ -154,6 +154,7 @@ public class PrchOrdDtlServiceImpl implements PrchOrdDtlService { @Override public List batchCreatePrchOrdDtl(List createReqVOS) { List prchOrdDtlDOS = BeanUtils.toBean(createReqVOS, PrchOrdDtlDO.class); + prchOrdDtlDOS.forEach(this::setElemInfo); prchOrdDtlMapper.insertBatch(prchOrdDtlDOS); log.info("批量创建采购订单明细成功,工插入【{}】条数据", prchOrdDtlDOS.size()); return BeanUtils.toBean(prchOrdDtlDOS, PrchOrdDtlRespVO.class); @@ -167,6 +168,7 @@ public class PrchOrdDtlServiceImpl implements PrchOrdDtlService { if (p.getLineNum() == null) { exitsLineNumber(p); } + setElemInfo(p); }); prchOrdDtlMapper.insertOrUpdate(prchOrdDtlDOS); log.info("批量更新采购订单明细成功,更新【{}】条数据", prchOrdDtlDOS.size()); @@ -207,8 +209,9 @@ public class PrchOrdDtlServiceImpl implements PrchOrdDtlService { throw exception(PURCHASE_ORDER_DETAIL_NOT_EXISTS); } PurchaseOrderDO purchaseOrderDO = SpringUtils.getBean(PurchaseOrderMapper.class).selectById(purchaseOrderDetailsDOS.get(0).getOrdId()); - if (purchaseOrderDO == null) { - throw exception(PURCHASE_ORDER_NOT_EXISTS); + if (purchaseOrderDO.getOrderSAPNumber()==null){ + log.info("该订单尚未提交erp,ID:{}", purchaseOrderDetailsDOS.get(0).getOrdId()); + return; } ErpOrderUpdateReqVO erpOrderUpdateReqVO = new ErpOrderUpdateReqVO(); diff --git a/zt-module-contract-order/zt-module-contract-order-server/src/main/java/com/zt/plat/module/contractorder/service/salesorder/SalesOrderDetailServiceImpl.java b/zt-module-contract-order/zt-module-contract-order-server/src/main/java/com/zt/plat/module/contractorder/service/salesorder/SalesOrderDetailServiceImpl.java index 2caac902..af3cef44 100644 --- a/zt-module-contract-order/zt-module-contract-order-server/src/main/java/com/zt/plat/module/contractorder/service/salesorder/SalesOrderDetailServiceImpl.java +++ b/zt-module-contract-order/zt-module-contract-order-server/src/main/java/com/zt/plat/module/contractorder/service/salesorder/SalesOrderDetailServiceImpl.java @@ -1,8 +1,12 @@ package com.zt.plat.module.contractorder.service.salesorder; import cn.hutool.core.collection.CollUtil; +import com.alibaba.fastjson2.JSONArray; +import com.alibaba.fastjson2.JSONException; import com.zt.plat.framework.common.exception.ErrorCode; import com.zt.plat.framework.common.pojo.CommonResult; +import com.zt.plat.framework.common.util.spring.SpringUtils; +import com.zt.plat.module.base.api.materialinfomation.MaterialInfomationApi; import com.zt.plat.module.base.api.materialinfomation.dto.MaterialInfomationPageReqDTO; import com.zt.plat.module.base.api.materialinfomation.dto.MaterialInfomationRespDTO; import com.zt.plat.module.base.dal.dataobject.base.ElementDO; @@ -11,16 +15,23 @@ import com.zt.plat.module.contractorder.controller.admin.salesorder.vo.SalesOrde import com.zt.plat.module.contractorder.controller.admin.salesorder.vo.SalesOrderDetailRespVO; import com.zt.plat.module.contractorder.controller.admin.salesorder.vo.SalesOrderDetailSaveReqVO; import com.zt.plat.module.contractorder.dal.dataobject.purchaseorder.PrchOrdDtlDO; +import com.zt.plat.module.contractorder.dal.dataobject.salesorder.SalesOrderDO; import com.zt.plat.module.contractorder.dal.dataobject.salesorder.SalesOrderDetailDO; import com.zt.plat.module.contractorder.dal.mysql.salesorder.SalesOrderDetailMapper; +import com.zt.plat.module.contractorder.dal.mysql.salesorder.SalesOrderMapper; +import com.zt.plat.module.contractorder.enums.ErpConstants; +import com.zt.plat.module.erp.controller.admin.erp.vo.SalesDocumentRequestVO; +import com.zt.plat.module.erp.service.erp.ErpOrderService; import com.zt.plat.module.receivedeliver.api.bill.BillMainApi; import lombok.extern.slf4j.Slf4j; +import org.jetbrains.annotations.NotNull; import org.springframework.stereotype.Service; import jakarta.annotation.Resource; import org.springframework.validation.annotation.Validated; import org.springframework.transaction.annotation.Transactional; import java.math.BigDecimal; +import java.time.format.DateTimeFormatter; import java.util.*; import com.zt.plat.framework.common.pojo.PageResult; @@ -30,6 +41,7 @@ import com.zt.plat.framework.common.util.object.BeanUtils; import static com.zt.plat.framework.common.exception.util.ServiceExceptionUtil.exception; +import static com.zt.plat.module.contractorder.enums.purchaseorder.ErrorCodeConstants.MTRL_CODE_NOT_EXISTS; import static com.zt.plat.module.contractorder.enums.salesorder.ErrorCodeConstants.SALES_ORDER_DETAIL_NOT_EXISTS; /** @@ -81,8 +93,11 @@ public class SalesOrderDetailServiceImpl implements SalesOrderDetailService { public List createSalesOrderDetail(List createReqVOS) { List salesOrderDetailDOS = BeanUtils.toBean(createReqVOS, SalesOrderDetailDO.class); salesOrderDetailDOS.forEach(salesOrderDetail -> { + setElemInfo(salesOrderDetail); createReqVOS.forEach(createReqVO -> salesOrderDetail.setOrderId(Long.valueOf(createReqVO.getOrderId()))); }); + // 设置物料信息 + salesOrderDetailMapper.insertBatch(salesOrderDetailDOS); return BeanUtils.toBean(salesOrderDetailDOS, SalesOrderDetailRespVO.class); } @@ -116,9 +131,96 @@ public class SalesOrderDetailServiceImpl implements SalesOrderDetailService { validateBillMainCanDelete(ids); // 校验存在 validateSalesOrderDetailExists(ids); + // + // 提交erp删除 + submitErpDelete092(ids); // 删除 salesOrderDetailMapper.deleteByIds(ids); } + private void submitErpDelete092(List ids) { + //删除订单明细提交erp + log.info("开始处理ERP 092 删除订单明细:{}", ids); + //根据订单明细查询订单 + SalesOrderDO salesOrderDO = SpringUtils.getBean(SalesOrderMapper.class).selectById(ids.get(0)); + if(salesOrderDO.getOrderSAPNumber() == null){ + log.warn("订单编号【{}】尚未提交erp", ids.get(0)); + return; + } + List salesOrderDetailDOS = salesOrderDetailMapper.selectByIds(ids); + SalesDocumentRequestVO salesDocumentRequestVO = new SalesDocumentRequestVO(); + buildSalesDocumentRequestData(salesDocumentRequestVO, salesOrderDO, salesOrderDetailDOS); + String result = SpringUtils.getBean(ErpOrderService.class).submitOrderToErp092(salesDocumentRequestVO); + log.info("ERP 092 删除订单明细结果:{}", result); + } + public void buildSalesDocumentRequestData(SalesDocumentRequestVO salesDocumentRequestVO, SalesOrderDO salesOrderDO, List salesOrderDetailList) { + //head-抬头 + salesDocumentRequestVO.setSalesdocument(salesOrderDO.getOrderSAPNumber()); + salesDocumentRequestVO.setUpdateflag(ErpConstants.SALES_DOCUMENT_REQUEST_FLAG_U); + salesDocumentRequestVO.setPartn_es(salesOrderDO.getPayerNum()); + //Head + SalesDocumentRequestVO.Head head = new SalesDocumentRequestVO.Head(); + head.setSales_org(salesOrderDO.getSaleOrgzCd());//销售组织 + head.setDistr_chan(salesOrderDO.getSaleAcsCdg());//销售渠道 + head.setDivision(salesOrderDO.getPdtGrpCdg());//产品组编码 + head.setReq_date_h(salesOrderDO.getVoucherDate().format(DateTimeFormatter.ofPattern("yyyyMMdd")));//凭证日期 + //item + List items = new ArrayList<>(); + salesOrderDetailList.forEach(salesOrderDetail -> { + MaterialInfomationPageReqDTO infomationPageReqDTO=new MaterialInfomationPageReqDTO(); + infomationPageReqDTO.setPageSize(10000); + infomationPageReqDTO.setCode(salesOrderDetail.getMaterialNumber()); + CommonResult> materialInfomationPage = SpringUtils.getBean(MaterialInfomationApi.class).getMaterialInfomationPage(infomationPageReqDTO); + if (materialInfomationPage.getData()==null || materialInfomationPage.getData().getList().isEmpty()){ + throw exception(MTRL_CODE_NOT_EXISTS); + + } + MaterialInfomationRespDTO materialInfomationRespDTO = materialInfomationPage.getData().getList().get(0); + Map flatAttributes = materialInfomationRespDTO.getFlatAttributes(); + //获取中铜物料编码 + String mtrlZhongtongCode = flatAttributes.getOrDefault("mtrlZhongtongCode", "").toString(); + if (mtrlZhongtongCode.isEmpty()){ + throw exception(MTRL_CODE_NOT_EXISTS); + } + SalesDocumentRequestVO.Item item = getItem(salesOrderDetail, mtrlZhongtongCode); + items.add(item); + }); + List conds = new ArrayList<>(); + salesOrderDetailList.forEach(salesOrderDetailRespVO -> { + String priceConditionDetail = salesOrderDetailRespVO.getPriceConditionDetail(); + if (priceConditionDetail == null || priceConditionDetail.trim().isEmpty()) { + return; // 空字符串直接跳过 + } + try { + // 解析 JSON 数组,捕获格式错误 + List strList = JSONArray.parseArray(priceConditionDetail, String.class); + if (salesOrderDetailRespVO.getId() != null){ + + }else { + + } + conds.addAll(strList); + } catch (JSONException e) { + // 处理解析失败(例如打日志、忽略错误数据等) + log.error("解析价格条件详情失败,内容:{}", priceConditionDetail, e); + } + }); + salesDocumentRequestVO.setItemList(items);// 设置订单明细列表 + salesDocumentRequestVO.setCondList(conds); // 设置价格条件列表 + } + + private SalesDocumentRequestVO.@NotNull Item getItem(SalesOrderDetailDO salesOrderDetail, String mtrlZhongtongCode) { + SalesDocumentRequestVO.Item item = new SalesDocumentRequestVO.Item(); + item.setItm_number(Math.toIntExact(salesOrderDetail.getLineNumber())); + item.setUpdateflag(ErpConstants.SALES_DOCUMENT_REQUEST_FLAG_D);//更新标志 + item.setMaterial(mtrlZhongtongCode);//物料号 + item.setPlant(salesOrderDetail.getFactoryNumber());//工厂编码 + item.setStore_loc(salesOrderDetail.getWarehouseNumber());//库存地点 + item.setSales_unit(salesOrderDetail.getUnt());//单位 + //item.setDlvschduse();//开票类型 + item.setTarget_qty(salesOrderDetail.getQuantity()); //目标数量(暂估数量) + item.setShip_point(salesOrderDetail.getShippingPlace());//装运地点 + return item; + } private void validateBillMainCanDelete(List ids) { ids.forEach(id -> { CommonResult booleanCommonResult = billMainApi.notOffsetIsExistOrderDetailId(id); diff --git a/zt-module-contract-order/zt-module-contract-order-server/src/main/java/com/zt/plat/module/contractorder/service/salesorder/SalesOrderService.java b/zt-module-contract-order/zt-module-contract-order-server/src/main/java/com/zt/plat/module/contractorder/service/salesorder/SalesOrderService.java index 84a70119..46ecf6dd 100644 --- a/zt-module-contract-order/zt-module-contract-order-server/src/main/java/com/zt/plat/module/contractorder/service/salesorder/SalesOrderService.java +++ b/zt-module-contract-order/zt-module-contract-order-server/src/main/java/com/zt/plat/module/contractorder/service/salesorder/SalesOrderService.java @@ -128,4 +128,11 @@ public interface SalesOrderService { * */ SalesOrderDO getSalesOrderByOrderNo(String orderNo); + /** + * 提交erp092 + * + * @param orderId 销售订单更新请求erp + * + */ +// void submitErpUpdate092(String orderId); } diff --git a/zt-module-contract-order/zt-module-contract-order-server/src/main/java/com/zt/plat/module/contractorder/service/salesorder/SalesOrderServiceImpl.java b/zt-module-contract-order/zt-module-contract-order-server/src/main/java/com/zt/plat/module/contractorder/service/salesorder/SalesOrderServiceImpl.java index d44fed69..0c1bcad5 100644 --- a/zt-module-contract-order/zt-module-contract-order-server/src/main/java/com/zt/plat/module/contractorder/service/salesorder/SalesOrderServiceImpl.java +++ b/zt-module-contract-order/zt-module-contract-order-server/src/main/java/com/zt/plat/module/contractorder/service/salesorder/SalesOrderServiceImpl.java @@ -21,7 +21,6 @@ import com.zt.plat.module.contractorder.api.vo.contract.ContractRespVO; import com.zt.plat.module.contractorder.controller.admin.purchaseorder.vo.*; import com.zt.plat.module.contractorder.controller.admin.salesorder.vo.*; import com.zt.plat.module.contractorder.dal.dataobject.contract.SystemRelativityDO; -import com.zt.plat.module.contractorder.dal.dataobject.purchaseorder.PurchaseOrderDO; import com.zt.plat.module.contractorder.dal.dataobject.salesorder.SalesOrderDO; import com.zt.plat.module.contractorder.dal.mysql.contract.SystemRelativityMapper; import com.zt.plat.module.contractorder.dal.mysql.salesorder.SalesOrderMapper; @@ -31,6 +30,7 @@ import com.zt.plat.module.contractorder.enums.purchaseorder.OrderStatusEnum; import com.zt.plat.module.contractorder.service.contract.ContractService; import com.zt.plat.module.contractorder.util.constants.ProcessDefinitionKeyConstants; import com.zt.plat.module.erp.controller.admin.erp.vo.ErpSalesOrderSaveReqVO; +import com.zt.plat.module.erp.controller.admin.erp.vo.SalesDocumentRequestVO; import com.zt.plat.module.erp.controller.admin.erp.vo.WarehouseFactoryRespVO; import com.zt.plat.module.erp.dal.dataobject.erp.internalwarehouse.InternalWarehouseDO; import com.zt.plat.module.erp.service.erp.ErpOrderService; @@ -44,10 +44,12 @@ import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections.CollectionUtils; import org.apache.commons.lang3.ObjectUtils; import org.apache.commons.lang3.StringUtils; +import org.jetbrains.annotations.NotNull; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.validation.annotation.Validated; +import java.time.format.DateTimeFormatter; import java.util.*; import static com.zt.plat.framework.common.exception.util.ServiceExceptionUtil.exception; @@ -109,10 +111,10 @@ public class SalesOrderServiceImpl implements SalesOrderService { salesOrderDO.setSystemOrderNumber(orderNumber); salesOrderMapper.insert(salesOrderDO); //插入订单明细 - if (createReqVO.getDetails()==null||createReqVO.getDetails().isEmpty()) { + if (createReqVO.getDetails() == null || createReqVO.getDetails().isEmpty()) { throw exception(Sales_ORD_DTL_NOT_EXISTS); } - createReqVO.getDetails().forEach(details ->details.setOrderId(String.valueOf(salesOrderDO.getId()))); + createReqVO.getDetails().forEach(details -> details.setOrderId(String.valueOf(salesOrderDO.getId()))); List salesOrderDetail = salesOrderDetailService.createSalesOrderDetail(createReqVO.getDetails()); // 返回 SalesOrderRespVO bean = BeanUtils.toBean(salesOrderDO, SalesOrderRespVO.class); @@ -125,13 +127,17 @@ public class SalesOrderServiceImpl implements SalesOrderService { public void updateSalesOrder(SalesOrderSaveReqVO updateReqVO) { // 校验存在 validateSalesOrderExists(updateReqVO.getId()); - // 更新 + SalesOrderDO updateObj = BeanUtils.toBean(updateReqVO, SalesOrderDO.class); + updateReqVO.getDetails().forEach(details -> details.setOrderId(String.valueOf(updateObj.getId()))); + if (updateObj.getOrderSAPNumber() != null) { + submitErpUpdate092(updateObj, updateReqVO.getDetails());//更新 ERP + } + // 更新 salesOrderMapper.updateById(updateObj); - if (updateReqVO.getDetails()==null||updateReqVO.getDetails().isEmpty()) { + if (updateReqVO.getDetails() == null || updateReqVO.getDetails().isEmpty()) { return; } - updateReqVO.getDetails().forEach(details ->details.setOrderId(String.valueOf(updateObj.getId()))); salesOrderDetailService.updateSalesOrderDetailList(updateReqVO.getDetails()); } @@ -218,36 +224,36 @@ public class SalesOrderServiceImpl implements SalesOrderService { head.setDivision(salesOrderDO.getPdtGrpCdg());// 产品组 head.setReq_date_h(salesOrderDO.getVoucherDate()); // 交货日期 head.setSales_grp(salesOrderDO.getPurchaseGroup()); // 销售组 - // head.setSales_off(salesOrderDO.getSaleOrgzName()); // 销售办事处 - head.setCust_grp1("10"); // 客户组 - head.setPurch_no_c(salesOrderDO.getContractNumber()); + // head.setSales_off(salesOrderDO.getSaleOrgzName()); // 销售办事处 + // head.setCust_grp1("10"); // 客户组 + head.setPurch_no_c(salesOrderDO.getPaperContractNumber());//纸质合同编号 head.setName(salesOrderDO.getContractName()); - // head.setRef_1(); - // head.setPurch_date(); - // head.setOrd_reason(); + // head.setRef_1(); + // head.setPurch_date(); + // head.setOrd_reason(); head.setCurrency(salesOrderDO.getCurrencyNumber()); // 货币码 - // head.setTaxclass(1); + // head.setTaxclass(1); erpSalesOrderSaveReqVO.setHead(head); // 销售订单明细 List items = new ArrayList<>(); for (SalesOrderDetailRespVO salesOrderDetailRespVO : salesOrderDetailByOrderId) { - MaterialInfomationPageReqDTO infomationPageReqDTO=new MaterialInfomationPageReqDTO(); + MaterialInfomationPageReqDTO infomationPageReqDTO = new MaterialInfomationPageReqDTO(); infomationPageReqDTO.setPageSize(10000); infomationPageReqDTO.setCode(salesOrderDetailRespVO.getMaterialNumber()); CommonResult> materialInfomationPage = materialInfomationApi.getMaterialInfomationPage(infomationPageReqDTO); - if (materialInfomationPage.getData()==null || materialInfomationPage.getData().getList().isEmpty()){ - throw exception(MTRL_CODE_NOT_EXISTS); + if (materialInfomationPage.getData() == null || materialInfomationPage.getData().getList().isEmpty()) { + throw exception(MTRL_CODE_NOT_EXISTS); } MaterialInfomationRespDTO materialInfomationRespDTO = materialInfomationPage.getData().getList().get(0); Map flatAttributes = materialInfomationRespDTO.getFlatAttributes(); //获取中铜物料编码 String mtrlZhongtongCode = flatAttributes.getOrDefault("mtrlZhongtongCode", "").toString(); - if (mtrlZhongtongCode.isEmpty()){ - throw exception(MTRL_CODE_NOT_EXISTS); + if (mtrlZhongtongCode.isEmpty()) { + throw exception(MTRL_CODE_NOT_EXISTS); } //查询对应的库位和工厂 - // WarehouseFactoryRespVO boundFactoryAndWarehouse = getBoundFactoryAndWarehouse(salesOrderDetailRespVO.getFactoryNumber(), salesOrderDetailRespVO.getWarehouseNumber()); + // WarehouseFactoryRespVO boundFactoryAndWarehouse = getBoundFactoryAndWarehouse(salesOrderDetailRespVO.getFactoryNumber(), salesOrderDetailRespVO.getWarehouseNumber()); ErpSalesOrderSaveReqVO.Item item = new ErpSalesOrderSaveReqVO.Item(); item.setItem_categ(String.valueOf(salesOrderDetailRespVO.getLineNumber())); item.setMaterial(mtrlZhongtongCode); @@ -284,6 +290,7 @@ public class SalesOrderServiceImpl implements SalesOrderService { try { // 解析 JSON 数组,捕获格式错误 List strList = JSONArray.parseArray(priceConditionDetail, String.class); + // List jsonArrays = JSONArray.parseArray(priceConditionDetail, JSONArray.class); conds.addAll(strList); } catch (JSONException e) { // 处理解析失败(例如打日志、忽略错误数据等) @@ -291,28 +298,79 @@ public class SalesOrderServiceImpl implements SalesOrderService { } }); erpSalesOrderSaveReqVO.setConds(conds); - String result = erpOrderService.submitOrderToErp091(erpSalesOrderSaveReqVO); - if (result != null) { - JSONObject jsonObject = JSONObject.parseObject(JSONObject.toJSONString(Map.of("salesdocument",R()))); - String salesdocument = jsonObject.containsKey("salesdocument")?jsonObject.getString("salesdocument"):null; - if (salesdocument != null) { - SalesOrderDO upVo = new SalesOrderDO(); - upVo.setId(salesOrderDO.getId()); - upVo.setOrderSAPNumber(salesdocument); - upVo.setErpStatus(OrderStatusEnum.FIND.getCode()); - salesOrderMapper.updateById(upVo); - }else { - SalesOrderDO upVo = new SalesOrderDO(); - upVo.setId(salesOrderDO.getId()); - upVo.setOrderSAPNumber(salesdocument); - upVo.setErpStatus(OrderStatusEnum.RLBK.getCode()); - upVo.setCause("ERP返回结果为空");//TODO 这里先写死 - salesOrderMapper.updateById(upVo); - } + String result = erpOrderService.submitOrderToErp091(erpSalesOrderSaveReqVO); + log.info("ERP返回结果:{}", result); + SalesOrderDO upVo = new SalesOrderDO(); + upVo.setId(salesOrderDO.getId()); + if (result != null && !result.trim().isEmpty()) { + try { + // ========== FastJSON2 核心解析 ========== + // 1. 解析顶层JSON对象 + JSONObject rootObj = JSONObject.parseObject(result); + // 2. 提取顶层标识(S表示成功) + String flag = rootObj.getString("flag"); + + // 3. 解析E_RESP + String eRespStr = rootObj.getString("E_RESP"); + String salesdocument = null; + if (eRespStr != null && !eRespStr.trim().isEmpty()) { + JSONObject eRespObj = JSONObject.parseObject(eRespStr); + // 提取销售单号并去除空格 + salesdocument = eRespObj.getString("SALESDOCUMENT"); + if (salesdocument != null) { + salesdocument = salesdocument.trim(); + } + } + upVo.setOrderSAPNumber(salesdocument); + + String resStr = rootObj.getString("resStr"); + List msgList = null; + if (resStr != null && !resStr.trim().isEmpty()) { + JSONArray msgArray = JSONArray.parseArray(resStr); + msgList = msgArray.stream().map(item -> (JSONObject) item).toList(); + } + + // 5. 业务成功/失败判断 + if ("S".equals(flag) && salesdocument != null && !salesdocument.isEmpty()) { + // 成功:更新为FIND状态 + upVo.setErpStatus(OrderStatusEnum.FIND.getCode()); + upVo.setCause("ERP订单提交成功,SAP单号:" + salesdocument); + } else { + // 失败:拼接详细原因 + StringBuilder failMsg = new StringBuilder("ERP订单提交失败:"); + failMsg.append("flag=").append(flag).append(",SAP单号=").append(salesdocument).append(";"); + + if (msgList != null && !msgList.isEmpty()) { + for (JSONObject msg : msgList) { + String type = msg.getString("TYPE"); + String message = msg.getString("MESSAGE"); + String number = msg.getString("NUMBER"); + failMsg.append("[").append(type).append("]").append(number).append(":").append(message).append("; "); + } + } else { + failMsg.append("无具体返回消息"); + } + upVo.setErpStatus(OrderStatusEnum.RLBK.getCode()); + upVo.setCause(failMsg.toString()); + } + } catch (Exception e) { + // 捕获所有解析异常,保证流程不中断 + log.error("FastJSON2解析ERP返回结果失败", e); + upVo.setErpStatus(OrderStatusEnum.RLBK.getCode()); + upVo.setCause("解析ERP返回结果失败:" + e.getMessage()); + } + } else { + // result为空的情况 + upVo.setErpStatus(OrderStatusEnum.RLBK.getCode()); + upVo.setCause("ERP返回结果为空"); } + // 执行数据库更新 + salesOrderMapper.updateById(upVo); + } + @Override @Transactional public String submitOrder(String id) { @@ -323,7 +381,7 @@ public class SalesOrderServiceImpl implements SalesOrderService { if (ObjectUtils.isEmpty(salesOrderDO)) { throw exception(ORDER_ID_NOT_EXISTS); } - if (salesOrderDO.getIsPush()==0) { + if (salesOrderDO.getIsPush() == 0) { throw exception(ORDER_DONT_SUBMIT); } AdminUserRespDTO adminUserRespDTO = adminUserApi.getUser(SecurityFrameworkUtils.getLoginUserId()).getData(); @@ -431,7 +489,7 @@ public class SalesOrderServiceImpl implements SalesOrderService { // } @Override - @Transactional(rollbackFor=Exception.class) + @Transactional(rollbackFor = Exception.class) public boolean orderPassReject(SalesOrderReviewReqVO salesOrderReviewReqVO) { // 查询采购单 SalesOrderDO salesOrderDO = salesOrderMapper.selectById(salesOrderReviewReqVO.getId()); @@ -488,6 +546,7 @@ public class SalesOrderServiceImpl implements SalesOrderService { return true; } + @Override public boolean linkOrder(LinkOrderReqVO LinkOrderReqVO) { @@ -583,7 +642,6 @@ public class SalesOrderServiceImpl implements SalesOrderService { } - private void validateSalesOrderNosExists(List orderNos) { List list = salesOrderMapper.selectList(new LambdaQueryWrapper().in(SalesOrderDO::getSystemOrderNumber, orderNos)); if (CollUtil.isEmpty(list) || list.size() != orderNos.size()) { @@ -602,7 +660,7 @@ public class SalesOrderServiceImpl implements SalesOrderService { .orElseThrow(() -> new IllegalArgumentException("BPM状态码不能为null")); } - private String R(){ + private String R() { int number = (int) (Math.random() * 900000 + 100000); return String.valueOf(number); } @@ -612,6 +670,85 @@ public class SalesOrderServiceImpl implements SalesOrderService { return salesOrderMapper.selectOne(SalesOrderDO::getSystemOrderNumber, orderNo); } + public void submitErpUpdate092(SalesOrderDO salesOrderDO, List salesOrderDetailList) { + //提交092的参数 + SalesDocumentRequestVO salesDocumentRequestVO = new SalesDocumentRequestVO(); + buildSalesDocumentRequestData(salesDocumentRequestVO, salesOrderDO, salesOrderDetailList); + String result = erpOrderService.submitOrderToErp092(salesDocumentRequestVO); + log.info("销售订单ID:【{}】,提交092结果:【{}】", salesOrderDO.getId(), result); + + } + + public void buildSalesDocumentRequestData(SalesDocumentRequestVO salesDocumentRequestVO, SalesOrderDO salesOrderDO, List salesOrderDetailList) { + //head-抬头 + salesDocumentRequestVO.setOrderNo(salesOrderDO.getSystemOrderNumber()); + salesDocumentRequestVO.setSalesdocument(salesOrderDO.getOrderSAPNumber()); + salesDocumentRequestVO.setUpdateflag(ErpConstants.SALES_DOCUMENT_REQUEST_FLAG_U); + salesDocumentRequestVO.setPartn_es(salesOrderDO.getPayerNum()); + //Head + SalesDocumentRequestVO.Head head = new SalesDocumentRequestVO.Head(); + head.setSales_org(salesOrderDO.getSaleOrgzCd());//销售组织 + head.setDistr_chan(salesOrderDO.getSaleAcsCdg());//销售渠道 + head.setDivision(salesOrderDO.getPdtGrpCdg());//产品组编码 + head.setReq_date_h(salesOrderDO.getVoucherDate().format(DateTimeFormatter.ofPattern("yyyyMMdd")));//凭证日期 + //item + List items = new ArrayList<>(); + salesOrderDetailList.forEach(salesOrderDetail -> { + MaterialInfomationPageReqDTO infomationPageReqDTO = new MaterialInfomationPageReqDTO(); + infomationPageReqDTO.setPageSize(10000); + infomationPageReqDTO.setCode(salesOrderDetail.getMaterialNumber()); + CommonResult> materialInfomationPage = materialInfomationApi.getMaterialInfomationPage(infomationPageReqDTO); + if (materialInfomationPage.getData() == null || materialInfomationPage.getData().getList().isEmpty()) { + throw exception(MTRL_CODE_NOT_EXISTS); + + } + MaterialInfomationRespDTO materialInfomationRespDTO = materialInfomationPage.getData().getList().get(0); + Map flatAttributes = materialInfomationRespDTO.getFlatAttributes(); + //获取中铜物料编码 + String mtrlZhongtongCode = flatAttributes.getOrDefault("mtrlZhongtongCode", "").toString(); + if (mtrlZhongtongCode.isEmpty()) { + throw exception(MTRL_CODE_NOT_EXISTS); + } + SalesDocumentRequestVO.Item item = getItem(salesOrderDetail, mtrlZhongtongCode); + items.add(item); + }); + List conds = new ArrayList<>(); + salesOrderDetailList.forEach(salesOrderDetailRespVO -> { + String priceConditionDetail = salesOrderDetailRespVO.getPriceConditionDetail(); + if (priceConditionDetail == null || priceConditionDetail.trim().isEmpty()) { + return; // 空字符串直接跳过 + } + try { + // 解析 JSON 数组,捕获格式错误 + List strList = JSONArray.parseArray(priceConditionDetail, String.class); + // List jsonArrays = JSONArray.parseArray(priceConditionDetail, JSONArray.class); + conds.addAll(strList); + } catch (JSONException e) { + // 处理解析失败(例如打日志、忽略错误数据等) + log.error("解析价格条件详情失败,内容:{}", priceConditionDetail, e); + } + }); + salesDocumentRequestVO.setItemList(items);// 设置订单明细列表 + salesDocumentRequestVO.setCondList(conds); // 设置价格条件列表 + } + + private SalesDocumentRequestVO.@NotNull Item getItem(SalesOrderDetailSaveReqVO salesOrderDetail, String mtrlZhongtongCode) { + String flag = ErpConstants.SALES_DOCUMENT_REQUEST_FLAG_U; + if (salesOrderDetail.getId() == null) { + flag = ErpConstants.SALES_DOCUMENT_REQUEST_FLAG_I; + } + SalesDocumentRequestVO.Item item = new SalesDocumentRequestVO.Item(); + item.setItm_number(Math.toIntExact(salesOrderDetail.getLineNumber())); + item.setUpdateflag(flag);//更新标志 + item.setMaterial(mtrlZhongtongCode);//物料号 + item.setPlant(salesOrderDetail.getFactoryNumber());//工厂编码 + item.setStore_loc(salesOrderDetail.getWarehouseNumber());//库存地点 + item.setSales_unit(salesOrderDetail.getUnt());//单位 + //item.setDlvschduse();//开票类型 + item.setTarget_qty(salesOrderDetail.getQuantity()); //目标数量(暂估数量) + item.setShip_point(salesOrderDetail.getShippingPlace());//装运地点 + return item; + } public WarehouseFactoryRespVO getBoundFactoryAndWarehouse(String factoryCode, String warehouseCode) { // 1. 查询主库信息,空值直接抛异常(精准异常信息) diff --git a/zt-module-erp/zt-module-erp-server/src/main/java/com/zt/plat/module/erp/controller/admin/erp/vo/ErpSalesOrderSaveReqVO.java b/zt-module-erp/zt-module-erp-server/src/main/java/com/zt/plat/module/erp/controller/admin/erp/vo/ErpSalesOrderSaveReqVO.java index d81d1fde..77ed07bc 100644 --- a/zt-module-erp/zt-module-erp-server/src/main/java/com/zt/plat/module/erp/controller/admin/erp/vo/ErpSalesOrderSaveReqVO.java +++ b/zt-module-erp/zt-module-erp-server/src/main/java/com/zt/plat/module/erp/controller/admin/erp/vo/ErpSalesOrderSaveReqVO.java @@ -128,7 +128,7 @@ public class ErpSalesOrderSaveReqVO { private BigDecimal target_qty; // 销售数量 QUAN13,3 @Schema(description = "税分类(默认从客户和物料基础数据带出,创建物料销售视图时默认值为1-13%)") - private String tax_class1 = "1"; // 税分类 CHAR1 + private String tax_class1; // 税分类 CHAR1 @Schema(description = "项目类别") private String item_categ; // 项目类别 CHAR4 diff --git a/zt-module-erp/zt-module-erp-server/src/main/java/com/zt/plat/module/erp/controller/admin/erp/vo/SalesDocumentRequestVO.java b/zt-module-erp/zt-module-erp-server/src/main/java/com/zt/plat/module/erp/controller/admin/erp/vo/SalesDocumentRequestVO.java new file mode 100644 index 00000000..c3e304fe --- /dev/null +++ b/zt-module-erp/zt-module-erp-server/src/main/java/com/zt/plat/module/erp/controller/admin/erp/vo/SalesDocumentRequestVO.java @@ -0,0 +1,164 @@ +package com.zt.plat.module.erp.controller.admin.erp.vo; + +import lombok.Data; +import java.math.BigDecimal; +import java.util.List; + +/** + * 采购订单修改/删除请求实体类 + * 字段名严格按照需求清单定义,不使用驼峰命名法 + */ +@Data +public class SalesDocumentRequestVO { + + private String orderNo; + // ===================== 请求抬头字段(顶层) ===================== + /** 要修改的采购订单号(必填) */ + private String salesdocument; + + /** 操作标识(必填):U-修改;D-删除 */ + private String updateflag; + + /** 客户编号-付款人 */ + private String partn_es; + + // ===================== 请求抬头结构-head(独立实体) ===================== + /** 抬头结构信息 */ + private Head head; + + // ===================== 请求列表-item ===================== + /** 行项目列表 */ + private List itemList; + + // ===================== 请求列表-cond ===================== + /** 条件信息列表 */ + private List condList; + + // ===================== 请求列表-souce ===================== + /** 来料加工原料信息列表 */ + private List souceList; + + // -------------------- 内部实体类:Head -------------------- + /** + * 抬头结构实体类 + */ + @Data + public static class Head { + /** 销售组织 */ + private String sales_org; + + /** 分销渠道 */ + private String distr_chan; + + /** 产品组 */ + private String division; + + /** 要求的交货日期(DATS 8:格式为 YYYYMMDD) */ + private String req_date_h; + + /** 销售组 */ + private String sales_grp; + + /** 销售办事处 */ + private String sales_off; + + /** 业务分类 */ + private String cust_grp1; + + /** 客户参考 */ + private String purch_no_c; + + /** 客户参考日期(DATS 8:格式为 YYYYMMDD) */ + private String purch_date; + } + + // -------------------- 内部实体类:Item -------------------- + /** + * 行项目实体类 + */ + @Data + public static class Item { + /** 行号(必填) */ + private Integer itm_number; + + /** 标识(必填):U-修改;D-删除;I-插入 */ + private String updateflag; + + /** 物料编号 */ + private String material; + + /** 工厂 */ + private String plant; + + /** 存储地点 */ + private String store_loc; + + /** 销售单位(使用基本计量单位) */ + private String sales_unit; + + /** 使用标识(开票类型) */ + private String dlvschduse; + + /** 销售数量 */ + private BigDecimal target_qty; + + /** 税分类(为空时从客户和物料基础数据带出) */ + private String tax_class1; + + /** 装运地点 */ + private String ship_point; + } + + // -------------------- 内部实体类:Cond -------------------- + /** + * 条件信息实体类 + */ + @Data + public static class Cond { + /** 行号(必填) */ + private String itm_number; + + /** 标识:U-修改(默认);D-删除;I-插入 */ + private String updateflag; + + /** 条件类型(必填) */ + private String cond_type; + + /** 条件金额(必填) */ + private BigDecimal cond_value; + + /** 货币码(必填) */ + private String currency; + + /** 条件单位(使用基本计量单位,必填) */ + private String cond_unit; + + /** 条件定价单位(必填,固定值1) */ + private BigDecimal cond_p_unt; + } + + // -------------------- 内部实体类:Souce -------------------- + /** + * 来料加工原料信息实体类 + */ + @Data + public static class Souce { + /** 行号(必填) */ + private String itm_number; + + /** 原料物料编号(必填) */ + private String material; + + /** 原料物料描述 */ + private String mat_desc; + + /** 数量(必填,保留3位小数) */ + private BigDecimal quantity; + + /** 计量单位(必填) */ + private String unit; + + /** 备注 */ + private String remark; + } +} \ No newline at end of file diff --git a/zt-module-erp/zt-module-erp-server/src/main/java/com/zt/plat/module/erp/service/erp/ErpErpMaterialCorrServiceImpl.java b/zt-module-erp/zt-module-erp-server/src/main/java/com/zt/plat/module/erp/service/erp/ErpErpMaterialCorrServiceImpl.java index ab9c4ba3..39af9e95 100644 --- a/zt-module-erp/zt-module-erp-server/src/main/java/com/zt/plat/module/erp/service/erp/ErpErpMaterialCorrServiceImpl.java +++ b/zt-module-erp/zt-module-erp-server/src/main/java/com/zt/plat/module/erp/service/erp/ErpErpMaterialCorrServiceImpl.java @@ -39,8 +39,8 @@ public class ErpErpMaterialCorrServiceImpl implements ErpErpMaterialCorrService{ } CommonResult dept = deptApi.getDept(reqVO.getDeptId()); DeptRespDTO data = dept.getData(); - if (data==null) { - throw exception(new ErrorCode(1027004000, "部门不存在")); + if (data==null||data.getCode().isEmpty()) { + throw exception(new ErrorCode(1027004000, "部门或部门公司编码不存在,部门编号为:{}"), reqVO.getDeptId().toString()); } erpMaterialCorrDOS.add(ErpMaterialCorrDO.builder() .materialParentId(reqVO.getMaterialParentId()) diff --git a/zt-module-erp/zt-module-erp-server/src/main/java/com/zt/plat/module/erp/service/erp/ErpOrderService.java b/zt-module-erp/zt-module-erp-server/src/main/java/com/zt/plat/module/erp/service/erp/ErpOrderService.java index a6df36e4..740e1081 100644 --- a/zt-module-erp/zt-module-erp-server/src/main/java/com/zt/plat/module/erp/service/erp/ErpOrderService.java +++ b/zt-module-erp/zt-module-erp-server/src/main/java/com/zt/plat/module/erp/service/erp/ErpOrderService.java @@ -1,9 +1,9 @@ package com.zt.plat.module.erp.service.erp; -import com.zt.plat.module.erp.controller.admin.erp.vo.ErpBillMainSaveReqVO; -import com.zt.plat.module.erp.controller.admin.erp.vo.ErpOrderSaveReqVO; -import com.zt.plat.module.erp.controller.admin.erp.vo.ErpOrderUpdateReqVO; -import com.zt.plat.module.erp.controller.admin.erp.vo.ErpSalesOrderSaveReqVO; +import com.zt.plat.module.erp.controller.admin.erp.vo.*; + +import java.util.HashMap; +import java.util.Map; public interface ErpOrderService { @@ -12,4 +12,6 @@ public interface ErpOrderService { String submitOrderToErp062(ErpOrderUpdateReqVO createVo); String submitOrderToErp091(ErpSalesOrderSaveReqVO erpSalesOrderSaveReqVO); + + String submitOrderToErp092(SalesDocumentRequestVO salesDocumentRequest); } diff --git a/zt-module-erp/zt-module-erp-server/src/main/java/com/zt/plat/module/erp/service/erp/ErpOrderServiceImpl.java b/zt-module-erp/zt-module-erp-server/src/main/java/com/zt/plat/module/erp/service/erp/ErpOrderServiceImpl.java index 1af2053b..070e7b03 100644 --- a/zt-module-erp/zt-module-erp-server/src/main/java/com/zt/plat/module/erp/service/erp/ErpOrderServiceImpl.java +++ b/zt-module-erp/zt-module-erp-server/src/main/java/com/zt/plat/module/erp/service/erp/ErpOrderServiceImpl.java @@ -7,10 +7,7 @@ import com.zt.plat.framework.common.pojo.CommonResult; import com.zt.plat.framework.security.core.util.SecurityFrameworkUtils; import com.zt.plat.module.erp.api.ErpExternalApi; import com.zt.plat.module.erp.api.dto.ErpSubmitReqDTO; -import com.zt.plat.module.erp.controller.admin.erp.vo.ErpBillMainSaveReqVO; -import com.zt.plat.module.erp.controller.admin.erp.vo.ErpOrderSaveReqVO; -import com.zt.plat.module.erp.controller.admin.erp.vo.ErpOrderUpdateReqVO; -import com.zt.plat.module.erp.controller.admin.erp.vo.ErpSalesOrderSaveReqVO; +import com.zt.plat.module.erp.controller.admin.erp.vo.*; import com.zt.plat.module.system.api.user.AdminUserApi; import com.zt.plat.module.system.api.user.dto.AdminUserRespDTO; import jakarta.annotation.Resource; @@ -106,6 +103,30 @@ public class ErpOrderServiceImpl implements ErpOrderService { return submitToErp(reqDTO); } + @Override + public String submitOrderToErp092(SalesDocumentRequestVO salesDocumentRequest) { + ErpSubmitReqDTO reqDTO = buildBaseReqDTO092(salesDocumentRequest,"092"); + Map req = new HashMap<>(); + req.put("head", salesDocumentRequest.getHead()); + req.put("item", salesDocumentRequest.getItemList()); + req.put("cond", JSONArray.parseArray(salesDocumentRequest.getCondList().toString())); + req.put("salesdocument", salesDocumentRequest.getSalesdocument()); + req.put("updateflag", salesDocumentRequest.getUpdateflag()); + req.put("partn_es", salesDocumentRequest.getPartn_es()); + reqDTO.setReq(req); + String reqJson = com.alibaba.fastjson2.JSON.toJSONString(reqDTO); + return submitToErp(reqDTO); + } + private ErpSubmitReqDTO buildBaseReqDTO092(SalesDocumentRequestVO salesDocumentRequest,String funcnr){ + AdminUserRespDTO userRespDTO = getWorkId(); + ErpSubmitReqDTO reqDTO = new ErpSubmitReqDTO(); + reqDTO.setFuncnr(funcnr); + reqDTO.setBskey(salesDocumentRequest.getOrderNo()); + reqDTO.setUsrid(userRespDTO.getWorkcode()); + reqDTO.setUsrnm(userRespDTO.getUsername()); + return reqDTO; + } + private ErpSubmitReqDTO buildBaseReqDTO062(ErpOrderUpdateReqVO vo, String funcnr) { ErpSubmitReqDTO reqDTO = new ErpSubmitReqDTO(); // reqDTO.setFuncnr(funcnr);