diff --git a/zt-module-contract-order/zt-module-contract-order-api/src/main/java/com/zt/plat/module/contractorder/enums/purchaseorder/ErrorCodeConstants.java b/zt-module-contract-order/zt-module-contract-order-api/src/main/java/com/zt/plat/module/contractorder/enums/purchaseorder/ErrorCodeConstants.java index fd38656..6cc231a 100644 --- a/zt-module-contract-order/zt-module-contract-order-api/src/main/java/com/zt/plat/module/contractorder/enums/purchaseorder/ErrorCodeConstants.java +++ b/zt-module-contract-order/zt-module-contract-order-api/src/main/java/com/zt/plat/module/contractorder/enums/purchaseorder/ErrorCodeConstants.java @@ -12,6 +12,6 @@ import com.zt.plat.framework.common.exception.ErrorCode; public interface ErrorCodeConstants { ErrorCode PURCHASE_ORDER_NOT_EXISTS = new ErrorCode(1_008_000_001, "采购订单不存在"); - + ErrorCode ORDER_ID_NOT_EXISTS = new ErrorCode(1_008_000_010, "订单id不能为空"); ErrorCode PRCH_ORD_DTL_NOT_EXISTS = new ErrorCode(1_008_001_001, "采购订单明细不存在"); } diff --git a/zt-module-contract-order/zt-module-contract-order-api/src/main/java/com/zt/plat/module/contractorder/enums/purchaseorder/PurchaseOrderStatusEnum.java b/zt-module-contract-order/zt-module-contract-order-api/src/main/java/com/zt/plat/module/contractorder/enums/purchaseorder/PurchaseOrderStatusEnum.java new file mode 100644 index 0000000..b655a8b --- /dev/null +++ b/zt-module-contract-order/zt-module-contract-order-api/src/main/java/com/zt/plat/module/contractorder/enums/purchaseorder/PurchaseOrderStatusEnum.java @@ -0,0 +1,41 @@ +package com.zt.plat.module.contractorder.enums.purchaseorder; + +import lombok.Getter; + +@Getter +public enum PurchaseOrderStatusEnum { + // 草稿状态 + DRAFT("DRAFT", "草稿"), + // 审批中状态 + APPROVING("APPR", "审批中"), + // 待提交ERP状态 + TO_SUBMIT_ERP("SUB", "待提交ERP"), + // 执行中状态 + IN_PROGRESS("IN_PROGRESS", "执行中"), + // 关闭状态 + CLOSED("CLOSE", "关闭"); + + /** 状态编码 */ + private final String code; + /** 状态描述 */ + private final String description; + + PurchaseOrderStatusEnum(String code, String description) { + this.code = code; + this.description = description; + } + + /** + * 根据编码获取枚举实例 + * @param code 状态编码 + * @return 匹配的枚举,无匹配时返回 null + */ + public static PurchaseOrderStatusEnum getByCode(String code) { + for (PurchaseOrderStatusEnum status : PurchaseOrderStatusEnum.values()) { + if (status.getCode().equals(code)) { + return status; + } + } + return null; + } +} diff --git a/zt-module-contract-order/zt-module-contract-order-server/src/main/java/com/zt/plat/module/contractorder/controller/admin/purchaseorder/PurchaseOrderController.java b/zt-module-contract-order/zt-module-contract-order-server/src/main/java/com/zt/plat/module/contractorder/controller/admin/purchaseorder/PurchaseOrderController.java index 9224f1c..8fcc0a0 100644 --- a/zt-module-contract-order/zt-module-contract-order-server/src/main/java/com/zt/plat/module/contractorder/controller/admin/purchaseorder/PurchaseOrderController.java +++ b/zt-module-contract-order/zt-module-contract-order-server/src/main/java/com/zt/plat/module/contractorder/controller/admin/purchaseorder/PurchaseOrderController.java @@ -107,4 +107,20 @@ public class PurchaseOrderController implements BusinessControllerMarker { BeanUtils.toBean(list, PurchaseOrderRespVO.class)); } + //提交订单审核 + @PostMapping("/submit-order") + @Operation(summary = "提交订单审核") + @PreAuthorize("@ss.hasPermission('bse:purchase-order:update')") + public CommonResult submitOrder(@RequestParam("id") Long id) { + purchaseOrderService.submitOrder(id); + return success(true); + } + + //提交ERP订单 + @PostMapping("/submit-erp") + @Operation(summary = "提交ERP订单", description = "bse:purchase-order:update')") + public CommonResult submitErp(@RequestBody List ids) { + return success( purchaseOrderService.submitErp(ids)); + } + } diff --git a/zt-module-contract-order/zt-module-contract-order-server/src/main/java/com/zt/plat/module/contractorder/controller/admin/purchaseorder/vo/PurchaseOrderSaveReqVO.java b/zt-module-contract-order/zt-module-contract-order-server/src/main/java/com/zt/plat/module/contractorder/controller/admin/purchaseorder/vo/PurchaseOrderSaveReqVO.java index 9dc0f48..b07012c 100644 --- a/zt-module-contract-order/zt-module-contract-order-server/src/main/java/com/zt/plat/module/contractorder/controller/admin/purchaseorder/vo/PurchaseOrderSaveReqVO.java +++ b/zt-module-contract-order/zt-module-contract-order-server/src/main/java/com/zt/plat/module/contractorder/controller/admin/purchaseorder/vo/PurchaseOrderSaveReqVO.java @@ -1,6 +1,7 @@ package com.zt.plat.module.contractorder.controller.admin.purchaseorder.vo; import com.alibaba.excel.annotation.ExcelProperty; +import com.baomidou.mybatisplus.annotation.TableField; import io.swagger.v3.oas.annotations.media.Schema; import lombok.*; import java.util.*; @@ -148,4 +149,22 @@ public class PurchaseOrderSaveReqVO { @Schema(description = "订单明细") @ExcelProperty("订单明细") private List prchOrdDtlSaveReqVOS; + + + @Schema(description = "流程实例编号") + @ExcelProperty("流程实例编号") + @NotEmpty(message = "流程实例编号不能为空") + private String processInstanceId; + + @Schema(description = "流程当前任务节点id") + @ExcelProperty("流程当前任务节点id") + private String taskId; + + @Schema(description = " 审批意见") + @ExcelProperty(" 审批意见") + private String reviewOpinion; + + @Schema(description = "是否提交审核,value为0或1") + @ExcelProperty("是否提交审核") + private int isPush; } diff --git a/zt-module-contract-order/zt-module-contract-order-server/src/main/java/com/zt/plat/module/contractorder/controller/admin/purchaseorder/vo/PurchaseOrderWithDetailsVO.java b/zt-module-contract-order/zt-module-contract-order-server/src/main/java/com/zt/plat/module/contractorder/controller/admin/purchaseorder/vo/PurchaseOrderWithDetailsVO.java new file mode 100644 index 0000000..e015160 --- /dev/null +++ b/zt-module-contract-order/zt-module-contract-order-server/src/main/java/com/zt/plat/module/contractorder/controller/admin/purchaseorder/vo/PurchaseOrderWithDetailsVO.java @@ -0,0 +1,28 @@ +package com.zt.plat.module.contractorder.controller.admin.purchaseorder.vo; + +import com.zt.plat.module.contractorder.dal.dataobject.purchaseorder.PrchOrdDtlDO; +import com.zt.plat.module.contractorder.dal.dataobject.purchaseorder.PurchaseOrderDO; +import lombok.Data; +import java.util.List; + +/** + * 采购订单及明细查询结果 VO + */ +@Data +public class PurchaseOrderWithDetailsVO { + + /** + * 采购订单信息 + */ + private PurchaseOrderDO purchaseOrder; + + /** + * 订单明细列表 + */ + private List orderDetails; + + /** + * 订单号(用于分组) + */ + 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/purchaseorder/PurchaseOrderDO.java b/zt-module-contract-order/zt-module-contract-order-server/src/main/java/com/zt/plat/module/contractorder/dal/dataobject/purchaseorder/PurchaseOrderDO.java index c9b0c1c..90572eb 100644 --- a/zt-module-contract-order/zt-module-contract-order-server/src/main/java/com/zt/plat/module/contractorder/dal/dataobject/purchaseorder/PurchaseOrderDO.java +++ b/zt-module-contract-order/zt-module-contract-order-server/src/main/java/com/zt/plat/module/contractorder/dal/dataobject/purchaseorder/PurchaseOrderDO.java @@ -214,4 +214,27 @@ public class PurchaseOrderDO extends BusinessBaseDO { @TableField("PRCH_GRP_NAME") private String purchaseGroupName; + /** + * 流程实例编号 + */ + @TableField("PRCS_INSC_ID") + private String processInstanceId; + + /** + * 流程当前任务节点id + */ + @TableField("TSK_NDE_ID") + private String taskId; + + /** + * 审批意见 + */ + @TableField("RVW_ONN") + private String reviewOpinion; + + /** + * 是否需要审批 + */ + @TableField("IS_PUSH") + private int isPush; } diff --git a/zt-module-contract-order/zt-module-contract-order-server/src/main/java/com/zt/plat/module/contractorder/dal/mysql/purchaseorder/PurchaseOrderMapper.java b/zt-module-contract-order/zt-module-contract-order-server/src/main/java/com/zt/plat/module/contractorder/dal/mysql/purchaseorder/PurchaseOrderMapper.java index b8ad2b4..07087ef 100644 --- a/zt-module-contract-order/zt-module-contract-order-server/src/main/java/com/zt/plat/module/contractorder/dal/mysql/purchaseorder/PurchaseOrderMapper.java +++ b/zt-module-contract-order/zt-module-contract-order-server/src/main/java/com/zt/plat/module/contractorder/dal/mysql/purchaseorder/PurchaseOrderMapper.java @@ -7,8 +7,10 @@ import com.zt.plat.framework.mybatis.core.query.LambdaQueryWrapperX; import com.zt.plat.framework.mybatis.core.mapper.BaseMapperX; import com.zt.plat.module.contractorder.controller.admin.purchaseorder.vo.PurchaseOrderPageReqVO; +import com.zt.plat.module.contractorder.controller.admin.purchaseorder.vo.PurchaseOrderWithDetailsVO; import com.zt.plat.module.contractorder.dal.dataobject.purchaseorder.PurchaseOrderDO; import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; /** @@ -60,4 +62,5 @@ public interface PurchaseOrderMapper extends BaseMapperX { .orderByDesc(PurchaseOrderDO::getId)); } + List selectOrderById(@Param("ids") List id); } diff --git a/zt-module-contract-order/zt-module-contract-order-server/src/main/java/com/zt/plat/module/contractorder/service/purchaseorder/PurchaseOrderService.java b/zt-module-contract-order/zt-module-contract-order-server/src/main/java/com/zt/plat/module/contractorder/service/purchaseorder/PurchaseOrderService.java index d66bbf5..3d3e4e5 100644 --- a/zt-module-contract-order/zt-module-contract-order-server/src/main/java/com/zt/plat/module/contractorder/service/purchaseorder/PurchaseOrderService.java +++ b/zt-module-contract-order/zt-module-contract-order-server/src/main/java/com/zt/plat/module/contractorder/service/purchaseorder/PurchaseOrderService.java @@ -63,4 +63,8 @@ public interface PurchaseOrderService { */ PageResult getPurchaseOrderPage(PurchaseOrderPageReqVO pageReqVO); + String submitOrder(Long id); + + String submitErp(List ids); + } diff --git a/zt-module-contract-order/zt-module-contract-order-server/src/main/java/com/zt/plat/module/contractorder/service/purchaseorder/PurchaseOrderServiceImpl.java b/zt-module-contract-order/zt-module-contract-order-server/src/main/java/com/zt/plat/module/contractorder/service/purchaseorder/PurchaseOrderServiceImpl.java index c501234..15ad95d 100644 --- a/zt-module-contract-order/zt-module-contract-order-server/src/main/java/com/zt/plat/module/contractorder/service/purchaseorder/PurchaseOrderServiceImpl.java +++ b/zt-module-contract-order/zt-module-contract-order-server/src/main/java/com/zt/plat/module/contractorder/service/purchaseorder/PurchaseOrderServiceImpl.java @@ -1,28 +1,41 @@ package com.zt.plat.module.contractorder.service.purchaseorder; import cn.hutool.core.collection.CollUtil; -import com.zt.plat.module.contractorder.controller.admin.purchaseorder.vo.PrchOrdDtlRespVO; -import com.zt.plat.module.contractorder.controller.admin.purchaseorder.vo.PurchaseOrderPageReqVO; -import com.zt.plat.module.contractorder.controller.admin.purchaseorder.vo.PurchaseOrderRespVO; -import com.zt.plat.module.contractorder.controller.admin.purchaseorder.vo.PurchaseOrderSaveReqVO; +import com.zt.plat.framework.security.core.util.SecurityFrameworkUtils; +import com.zt.plat.module.bpm.api.task.BpmProcessInstanceApi; +import com.zt.plat.module.bpm.api.task.BpmTaskApi; +import com.zt.plat.module.bpm.api.task.dto.BpmApprovalDetailReqDTO; +import com.zt.plat.module.bpm.api.task.dto.BpmApprovalDetailRespDTO; +import com.zt.plat.module.bpm.api.task.dto.BpmProcessInstanceCreateReqDTO; +import com.zt.plat.module.bpm.api.task.dto.BpmTaskRespDTO; +import com.zt.plat.module.bpm.enums.task.BpmProcessInstanceStatusEnum; +import com.zt.plat.module.contractorder.controller.admin.purchaseorder.vo.*; import com.zt.plat.module.contractorder.dal.dataobject.purchaseorder.PurchaseOrderDO; import com.zt.plat.module.contractorder.dal.mysql.purchaseorder.PurchaseOrderMapper; +import com.zt.plat.module.contractorder.enums.purchaseorder.PurchaseOrderStatusEnum; +import com.zt.plat.module.contractorder.util.constants.ProcessDefinitionKeyConstants; +import com.zt.plat.module.erp.controller.admin.erp.vo.ErpOrderSaveReqVO; +import com.zt.plat.module.erp.service.erp.ErpOrderService; +import com.zt.plat.module.system.api.user.AdminUserApi; +import com.zt.plat.module.system.api.user.dto.AdminUserRespDTO; +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.springframework.stereotype.Service; import jakarta.annotation.Resource; import org.springframework.validation.annotation.Validated; import org.springframework.transaction.annotation.Transactional; import java.util.*; +import java.util.concurrent.atomic.AtomicInteger; import com.zt.plat.framework.common.pojo.PageResult; -import com.zt.plat.framework.common.pojo.PageParam; 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.framework.common.util.collection.CollectionUtils.convertList; -import static com.zt.plat.framework.common.util.collection.CollectionUtils.diffList; +import static com.zt.plat.module.contractorder.enums.purchaseorder.ErrorCodeConstants.ORDER_ID_NOT_EXISTS; import static com.zt.plat.module.contractorder.enums.purchaseorder.ErrorCodeConstants.PURCHASE_ORDER_NOT_EXISTS; @@ -31,23 +44,39 @@ import static com.zt.plat.module.contractorder.enums.purchaseorder.ErrorCodeCons * * @author 后台管理-1 */ +@Slf4j @Service @Validated public class PurchaseOrderServiceImpl implements PurchaseOrderService { + @Resource + private ErpOrderService erpOrderService; @Resource private PurchaseOrderMapper purchaseOrderMapper; @Resource private PrchOrdDtlService prchOrdDtlService; + @Resource + private BpmProcessInstanceApi bpmProcessInstanceApi; + @Resource + private AdminUserApi adminUserApi; + + @Resource + private BpmTaskApi bpmTaskApi; + @Override public PurchaseOrderRespVO createPurchaseOrder(PurchaseOrderSaveReqVO createReqVO) { // 插入 PurchaseOrderDO purchaseOrder = BeanUtils.toBean(createReqVO, PurchaseOrderDO.class); + if (Objects.equals(createReqVO.getIsPush(), 0)) { + purchaseOrder.setStatus(PurchaseOrderStatusEnum.DRAFT.getCode()); //设置初始状态 + } else { + purchaseOrder.setStatus(PurchaseOrderStatusEnum.TO_SUBMIT_ERP.getCode()); + } purchaseOrderMapper.insert(purchaseOrder); // 返回 //批量插入订单明细 - createReqVO.getPrchOrdDtlSaveReqVOS().forEach(prchOrdDtlSaveReqVO->prchOrdDtlSaveReqVO.setOrdId(purchaseOrder.getId())); + createReqVO.getPrchOrdDtlSaveReqVOS().forEach(prchOrdDtlSaveReqVO -> prchOrdDtlSaveReqVO.setOrdId(purchaseOrder.getId())); List prchOrdDtlRespVOS = prchOrdDtlService.batchCreatePrchOrdDtl(createReqVO.getPrchOrdDtlSaveReqVOS()); PurchaseOrderRespVO purchaseOrderRespVO = BeanUtils.toBean(purchaseOrder, PurchaseOrderRespVO.class); purchaseOrderRespVO.setPrchOrdDtlRespVOS(prchOrdDtlRespVOS); @@ -72,7 +101,7 @@ public class PurchaseOrderServiceImpl implements PurchaseOrderService { } @Override - public void deletePurchaseOrderListByIds(List ids) { + public void deletePurchaseOrderListByIds(List ids) { // 校验存在 validatePurchaseOrderExists(ids); // 删除 @@ -80,7 +109,7 @@ public class PurchaseOrderServiceImpl implements PurchaseOrderService { //删除根据订单号订单明细 prchOrdDtlService.deletePrchOrdDtlListByOrdIds(ids); - } + } private void validatePurchaseOrderExists(List ids) { List list = purchaseOrderMapper.selectByIds(ids); @@ -105,4 +134,111 @@ public class PurchaseOrderServiceImpl implements PurchaseOrderService { return purchaseOrderMapper.selectPage(pageReqVO); } + + @Override + @Transactional + public String submitOrder(Long id) { + if (ObjectUtils.isEmpty(id)) { + throw exception(ORDER_ID_NOT_EXISTS); + } + PurchaseOrderDO purchaseOrderDO = purchaseOrderMapper.selectById(id); + if (ObjectUtils.isEmpty(purchaseOrderDO)) { + throw exception(ORDER_ID_NOT_EXISTS); + } + AdminUserRespDTO adminUserRespDTO = adminUserApi.getUser(SecurityFrameworkUtils.getLoginUserId()).getData(); + if (ObjectUtils.isEmpty(purchaseOrderDO.getProcessInstanceId())) { + BpmProcessInstanceCreateReqDTO pidto = new BpmProcessInstanceCreateReqDTO(); + pidto.setProcessDefinitionKey(ProcessDefinitionKeyConstants.PURCHASE_ORDER_REVIEW_PROCESS); + pidto.setBusinessKey(String.valueOf(id)); + String data = bpmProcessInstanceApi.createProcessInstance(adminUserRespDTO.getId(), pidto).getData(); + if (StringUtils.isNotBlank(data)) { + // 获取流程当前审批的任务节点 + List taskList = bpmTaskApi.getTaskListByProcessInstanceId(data).getData(); + purchaseOrderDO.setProcessInstanceId(data); + if (CollectionUtils.isNotEmpty(taskList)) { + BpmTaskRespDTO undoTask = taskList.get(taskList.size() - 1);// 获取流程当前审批的任务节点 + purchaseOrderDO.setTaskId(undoTask.getId()); + } + purchaseOrderDO.setStatus(PurchaseOrderStatusEnum.APPROVING.getCode()); // + purchaseOrderMapper.updateById(purchaseOrderDO); + return "提交审批成功"; + } + + } else { + // 获取流程当前审批的任务节点 + List taskList = bpmTaskApi.getTaskListByProcessInstanceId(purchaseOrderDO.getProcessInstanceId()).getData(); + if (CollectionUtils.isNotEmpty(taskList)) { + BpmTaskRespDTO bpmTaskDto = taskList.get(taskList.size() - 1); + BpmApprovalDetailReqDTO badrDto = new BpmApprovalDetailReqDTO(); + badrDto.setProcessInstanceId(purchaseOrderDO.getProcessInstanceId()); // 流程实例id + badrDto.setTaskId(bpmTaskDto.getId()); // 当前审核任务节点id + BpmApprovalDetailRespDTO approvalDetail = bpmProcessInstanceApi.getApprovalDetail(SecurityFrameworkUtils.getLoginUserId(), badrDto).getData(); + if (BpmProcessInstanceStatusEnum.REJECT.getStatus().equals(approvalDetail.getStatus())) { + // 如果状态是驳回状态,需要重新创建一个流程实例 + BpmProcessInstanceCreateReqDTO pidtoNew = new BpmProcessInstanceCreateReqDTO(); + pidtoNew.setProcessDefinitionKey(ProcessDefinitionKeyConstants.PURCHASE_ORDER_REVIEW_PROCESS); + pidtoNew.setBusinessKey(String.valueOf(id)); + String data = bpmProcessInstanceApi.createProcessInstance(adminUserRespDTO.getId(), pidtoNew).getData(); + if (StringUtils.isNotBlank(data)) { + // 获取流程当前审批的任务节点 + List taskListNew = bpmTaskApi.getTaskListByProcessInstanceId(data).getData(); + purchaseOrderDO.setProcessInstanceId(data); + if (CollectionUtils.isNotEmpty(taskListNew)) { + BpmTaskRespDTO undoTask = taskListNew.get(taskListNew.size() - 1); + purchaseOrderDO.setTaskId(undoTask.getId()); + } + purchaseOrderDO.setStatus(PurchaseOrderStatusEnum.APPROVING.getCode()); + purchaseOrderMapper.updateById(purchaseOrderDO); + return "提交审批成功"; + } + } else if (BpmProcessInstanceStatusEnum.APPROVE.getStatus().equals(approvalDetail.getStatus())) { + return "该授信单审批流程已经审批通过"; + } + } + } + log.info("流程实例id:{}", purchaseOrderDO.getProcessInstanceId()); + return "提交审批成功"; + } + + @Override + public String submitErp(List ids) { + //通过订单号查询订单 + List purchaseOrderWithDetailsVOS = purchaseOrderMapper.selectOrderById(ids); + if (!purchaseOrderWithDetailsVOS.isEmpty()) { + purchaseOrderWithDetailsVOS.forEach(purchaseOrderWithDetailsVO -> { + ErpOrderSaveReqVO erpOrderSaveReqVO = new ErpOrderSaveReqVO(); + if (purchaseOrderWithDetailsVO.getPurchaseOrder() != null) { + erpOrderSaveReqVO.setOrderid(purchaseOrderWithDetailsVO.getPurchaseOrder().getOrderNumber()); + erpOrderSaveReqVO.setCompCode(purchaseOrderWithDetailsVO.getPurchaseOrder().getCompanyNumber());//公司代码 + erpOrderSaveReqVO.setVendor(purchaseOrderWithDetailsVO.getPurchaseOrder().getSupplierNumber());// 供应商帐号 + erpOrderSaveReqVO.setDocType(purchaseOrderWithDetailsVO.getPurchaseOrder().getType());//采购凭证类型 + erpOrderSaveReqVO.setDocDate(purchaseOrderWithDetailsVO.getPurchaseOrder().getVoucherDate()); //采购凭证日期 + erpOrderSaveReqVO.setPurchOrg(purchaseOrderWithDetailsVO.getPurchaseOrder().getPurchaseOrganizationCustomsDeclaration());//采购组织 + erpOrderSaveReqVO.setPurGroup(purchaseOrderWithDetailsVO.getPurchaseOrder().getPurchaseGroup());//采购组 + erpOrderSaveReqVO.setCurrency(purchaseOrderWithDetailsVO.getPurchaseOrder().getCurrencyNumber()); // 货币码 + erpOrderSaveReqVO.setExchRate(purchaseOrderWithDetailsVO.getPurchaseOrder().getExchangeRate());//汇率 + erpOrderSaveReqVO.setZzhth(purchaseOrderWithDetailsVO.getPurchaseOrder().getContractNumber());//纸质合同号 + erpOrderSaveReqVO.setZxxyh(purchaseOrderWithDetailsVO.getPurchaseOrder().getPaperContractNumber());//小协议号 + + } + if (purchaseOrderWithDetailsVO.getOrderDetails()!= null){ + purchaseOrderWithDetailsVO.getOrderDetails().forEach(orderDetail -> { + erpOrderSaveReqVO.setPoItem(orderDetail.getLineNum()); //行号 + erpOrderSaveReqVO.setMaterial(orderDetail.getRcvFactNum());//物料号 + erpOrderSaveReqVO.setQuantity(orderDetail.getQty());// 数量 + erpOrderSaveReqVO.setPoUnit(orderDetail.getUnt());// 计量单位 + erpOrderSaveReqVO.setNetPrice(orderDetail.getInTaxUprc());// 含税单价 + erpOrderSaveReqVO.setActsCtgrDtl(orderDetail.getActsCtgrDtl()); + }); + } + erpOrderService.submitOrderToErp(erpOrderSaveReqVO); + log.info("订单推送成功,订单id【{}】", purchaseOrderWithDetailsVO.getPurchaseOrder().getId()); + }); + return "ERP推送成功"; + } else { + return "订单不存在"; + } + } + + } diff --git a/zt-module-contract-order/zt-module-contract-order-server/src/main/java/com/zt/plat/module/contractorder/util/constants/ProcessDefinitionKeyConstants.java b/zt-module-contract-order/zt-module-contract-order-server/src/main/java/com/zt/plat/module/contractorder/util/constants/ProcessDefinitionKeyConstants.java new file mode 100644 index 0000000..03b5759 --- /dev/null +++ b/zt-module-contract-order/zt-module-contract-order-server/src/main/java/com/zt/plat/module/contractorder/util/constants/ProcessDefinitionKeyConstants.java @@ -0,0 +1,6 @@ +package com.zt.plat.module.contractorder.util.constants; + +public interface ProcessDefinitionKeyConstants { + + String PURCHASE_ORDER_REVIEW_PROCESS = "purchase_order_review_process"; +} diff --git a/zt-module-contract-order/zt-module-contract-order-server/src/main/resources/mapper/purchaseorder/PurchaseOrderMapper.xml b/zt-module-contract-order/zt-module-contract-order-server/src/main/resources/mapper/purchaseorder/PurchaseOrderMapper.xml index 1498f3e..4ae77e0 100644 --- a/zt-module-contract-order/zt-module-contract-order-server/src/main/resources/mapper/purchaseorder/PurchaseOrderMapper.xml +++ b/zt-module-contract-order/zt-module-contract-order-server/src/main/resources/mapper/purchaseorder/PurchaseOrderMapper.xml @@ -9,4 +9,203 @@ 文档可见:https://www.iocoder.cn/MyBatis/x-plugins/ --> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/zt-module-erp/zt-module-erp-server/src/main/java/com/zt/plat/module/erp/controller/admin/erp/vo/ErpOrderSaveReqVO.java b/zt-module-erp/zt-module-erp-server/src/main/java/com/zt/plat/module/erp/controller/admin/erp/vo/ErpOrderSaveReqVO.java new file mode 100644 index 0000000..5ddee76 --- /dev/null +++ b/zt-module-erp/zt-module-erp-server/src/main/java/com/zt/plat/module/erp/controller/admin/erp/vo/ErpOrderSaveReqVO.java @@ -0,0 +1,181 @@ +package com.zt.plat.module.erp.controller.admin.erp.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotEmpty; +import jakarta.validation.constraints.NotNull; +import lombok.Data; +import java.math.BigDecimal; +import java.time.LocalDateTime; + +/** + * ERP采购订单保存请求VO + */ +@Data +@Schema(description = "ERP采购订单保存请求参数") +public class ErpOrderSaveReqVO { + + @Schema(description = "公司代码") + @NotEmpty(message = "公司代码不能为空") + private String compCode; // BUKRS CHAR4 + + @Schema(description = "供应商帐号") + @NotEmpty(message = "供应商帐号不能为空") + private String vendor; // LIFNR CHAR10 + + @Schema(description = "采购凭证类型") + @NotEmpty(message = "采购凭证类型不能为空") + private String docType; // BSART CHAR4 + + @Schema(description = "采购凭证日期") + @NotEmpty(message = "采购凭证日期不能为空") + private LocalDateTime docDate; // BEDAT DATS8(格式:YYYYMMDD) + + @Schema(description = "采购组织") + @NotEmpty(message = "采购组织不能为空") + private String purchOrg; // EKORG CHAR4 + + @Schema(description = "采购组") + @NotEmpty(message = "采购组不能为空") + private String purGroup; // EKGRP CHAR3 + + @Schema(description = "货币码") + @NotEmpty(message = "货币码不能为空") + private String currency; // WAERS CUKY5 + + @Schema(description = "汇率") + private BigDecimal exchRate; // WKURS DEC9,5 + @NotEmpty(message = "纸质合同号不能为空(已启用财务共享单位)") + private String zzhth; // CHAR60 + + + @Schema(description = "小协议号(绿星链通填入合同名称)") + private String zxxyh; // CHAR60 + + @Schema(description = "备注(绿星链通填入系统采购订单头号)") + private String znote; // CHAR60 + + @Schema(description = "代理方(使用客商编码)") + private String zlifnr; // CHAR60 + + + @Schema(description = "行号") + @NotEmpty(message = "行号不能为空") + private Long poItem; // EBELP NUMC5 + + @Schema(description = "物料号") + private String material; // MATNR CHAR18 + + @Schema(description = "工厂") + @NotEmpty(message = "工厂不能为空") + private String plant; // WERKS CHAR4 + + @Schema(description = "库存地点") + private String stgeLoc; // LGORT CHAR4 + + @Schema(description = "数量") + @NotEmpty(message = "数量不能为空") + private String quantity; // MENGE QUAN13,3 + + @Schema(description = "计量单位") + @NotNull(message = "计量单位不能为空") + private BigDecimal poUnit; // MEINS UNIT3 + + @Schema(description = "含税单价") + @NotNull(message = "含税单价不能为空") + private BigDecimal netPrice; // NETPR CURR11,2 + + @Schema(description = "价格单位(默认值1,表示以上单价对应的采购单位数量)") + private Integer priceUnit; // PEINH DEC5 + + @Schema(description = "税码") + private String taxCode; // MWSKZ CHAR2 + + @Schema(description = "基于GR的发票校验") + private String grBasedIv; // WEBRE CHAR1 + + @Schema(description = "允许无限制过量交货") + private String unlimitedDlv; // UEBTK CHAR1 + + @Schema(description = "批次") + private String batch; // CHARG CHAR10 + + @Schema(description = "项目类别(委托加工订单时填入L)") + private String itemCat; // PSTYP CHAR1(原表CAHR为笔误,按CHAR处理) + + @Schema(description = "科目分配类别(固定资产采购:A;服务采购:S-销售服务费、K-成本中心、F-订单)") + private String acctassCat; // KNTTP CHAR1 + + @Schema(description = "物料组(服务采购订单必填)") + private String matlGroup; // MATKL CHAR9 + + @Schema(description = "短文本(服务采购订单必填,绿星链通系统必须填入)") + private String shortText; // TXZ01 CHAR40 + + @Schema(description = "退货项目标识(退货行项目填X)") + private String retItem; // RETPO CHAR1 + + @Schema(description = "免费项目标识(免费行项目填X)") + private String freeItem; // UMSON CHAR1 + + @Schema(description = "外部行项目号(绿星链通必填)") + private String vendrBatch; // LICHN CHAR15 + + @Schema(description = "备注信息-需求单位") + private String noteXq; // TDLINE CHAR132 + + @Schema(description = "备注信息-物料详细") + private String noteWl; // TDLINE CHAR132 + + @Schema(description = "交货起止日期(格式:YYYYMMDD-YYYYMMDD)") + private String vendMat; // IDNLF CHAR22(原表说明为交货起止日期,按说明定义) + + @Schema(description = "销售物料号(科目分配类别为S时必填)") + private String zmatnr; + + @Schema(description = "统计型内部订单") + private String zaufnr; + + @Schema(description = "采购类别(0-生产性物资类;1-项目投资类)") + private String zpurty; + + @Schema(description = "原料湿重") + private BigDecimal zmenge; + + + @Schema(description = "科目分配的序号(从1开始编号)") + @NotEmpty(message = "科目分配的序号不能为空") + private String serialNo; // DZEKKN NUMC2 + + @Schema(description = "总账科目编号") + private String glAccount; // SAKNR CHAR10 + + @Schema(description = "成本中心(科目分配类别为F时必填)") + private String costcenter; // KOSTL CHAR10 + + @Schema(description = "订单号(科目分配类别为F时必填)") + private String orderid; // AUFNR CHAR12 + + @Schema(description = "主资产号(科目分配类别为A时必填)") + private String assetNo; // ANLN1 CHAR12 + + @Schema(description = "资产子编号(科目分配类别为A时必填,固定值‘0’)") + private String subNumber; // ANLN2 CHAR4 + + + @Schema(description = "计划行号(从1开始编号)") + private String schedLine; // ETENR NUMC4 + + @Schema(description = "项目编号(从1开始编号)") + private String itemNo; // RSPOS NUMC4 + + @Schema(description = "委托加工需求数量") + @NotNull(message = "委托加工需求数量不能为空") + private BigDecimal entryQuantity; // MENGE QUAN13,3 + + @Schema(description = "组件计量单位(为空时使用基本计量单位)") + private String entryUom; // MEINS UNIT3 + + @Schema(description = " 科目分配详情") + private String actsCtgrDtl; + +} 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 new file mode 100644 index 0000000..2ff59bd --- /dev/null +++ b/zt-module-erp/zt-module-erp-server/src/main/java/com/zt/plat/module/erp/service/erp/ErpOrderService.java @@ -0,0 +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; + +public interface ErpOrderService { + + String submitOrderToErp(ErpOrderSaveReqVO createVo); +} 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 new file mode 100644 index 0000000..2dd9d23 --- /dev/null +++ b/zt-module-erp/zt-module-erp-server/src/main/java/com/zt/plat/module/erp/service/erp/ErpOrderServiceImpl.java @@ -0,0 +1,95 @@ +package com.zt.plat.module.erp.service.erp; + + +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 jakarta.annotation.Resource; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +@Service +public class ErpOrderServiceImpl implements ErpOrderService { + @Resource + public ErpExternalApi erpExternalApi; + @Override + public String submitOrderToErp(ErpOrderSaveReqVO createVo) { + + ErpSubmitReqDTO reqDTO = buildBaseReqDTO(createVo, "061"); + + Map req = new HashMap<>(); + Map head = new HashMap<>(); + // head + head.put("comp_code", createVo.getCompCode()); + head.put("vendor", createVo.getVendor()); + head.put("doc_type", createVo.getDocType()); + head.put("doc_date", createVo.getDocDate()); + head.put("purch_org", createVo.getPurchOrg()); + head.put("pur_group", createVo.getPurGroup()); + head.put("currency", createVo.getCurrency()); + head.put("exch_rate", createVo.getExchRate()); + req.put("head", head); + //exte + Map exte = new HashMap<>(); + exte.put("zzhth", createVo.getZzhth()); + exte.put("zxxyh", createVo.getZxxyh()); + exte.put("znote", createVo.getZnote()); + exte.put("zlifnr", createVo.getZlifnr()); + req.put("exte", exte); + getMaps(createVo, req); + reqDTO.setReq(req); + + return submitToErp(reqDTO); + } + + private ErpSubmitReqDTO buildBaseReqDTO(ErpOrderSaveReqVO vo, String funcnr) { + ErpSubmitReqDTO reqDTO = new ErpSubmitReqDTO(); + reqDTO.setFuncnr(funcnr); + reqDTO.setBskey(vo.getOrderid()); + reqDTO.setUsrid(String.valueOf(SecurityFrameworkUtils.getLoginUserId())); + reqDTO.setUsrnm((SecurityFrameworkUtils.getLoginUserNickname())); + return reqDTO; + } + + + private String submitToErp(ErpSubmitReqDTO reqDTO) { + HashMap response = erpExternalApi.submitDataToErp(reqDTO); + return response.get("resStr"); + } + private void getMaps(ErpOrderSaveReqVO vo, Map req) { + List> items = new ArrayList<>(); + Map item = new HashMap<>(); + item.put("po_item", vo.getPoItem()); + item.put("material", vo.getMaterial()); + item.put("plant", vo.getPlant()); + item.put("stge_loc", vo.getStgeLoc()); + item.put("quantity", vo.getQuantity()); + item.put("po_unit", vo.getPoUnit()); + item.put("net_price", vo.getNetPrice()); + item.put("price_unit", vo.getPriceUnit()); + item.put("tax_code", vo.getTaxCode()); + item.put("gr_based_iv", vo.getGrBasedIv()); + item.put("unlimited_dlv", vo.getUnlimitedDlv()); + item.put("batch", vo.getBatch()); + item.put("item_cat", vo.getItemCat()); + item.put("acctass_cat", vo.getAcctassCat()); + item.put("matl_group", vo.getMatlGroup()); + item.put("short_text", vo.getShortText()); + item.put("ret_item", vo.getRetItem()); + item.put("free_item", vo.getFreeItem()); + item.put("vendr_batch", vo.getVendrBatch()); + item.put("note_xq", vo.getNoteXq()); + item.put("note_wl", vo.getNoteWl()); + item.put("vend_mat", vo.getVendMat()); + items.add(item); + if ("K".equals(vo.getAcctassCat())||"P".equals(vo.getAcctassCat())){ + req.put("acct", vo.getActsCtgrDtl()); + } + req.put("item", items); + } +}