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 8f95c9d..bf0b692 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 @@ -11,6 +11,7 @@ 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.*; import com.zt.plat.module.bpm.enums.task.BpmProcessInstanceStatusEnum; +import com.zt.plat.module.bpm.enums.task.BpmTaskStatusEnum; 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.dal.dataobject.contract.SystemRelativityDO; @@ -40,6 +41,7 @@ import org.springframework.transaction.annotation.Transactional; import java.time.format.DateTimeFormatter; import java.util.*; +import java.util.stream.Collectors; import com.zt.plat.framework.common.pojo.PageResult; import com.zt.plat.framework.common.util.object.BeanUtils; @@ -554,53 +556,61 @@ public class PurchaseOrderServiceImpl implements PurchaseOrderService { return sequenceApi.getNextSequence("PURCHASE_ORDER_NUMBER", null, null).getData(); } - @Override - @Transactional(rollbackFor=Exception.class) - public boolean orderPassReject(PurchaseorderReqVO purchaseorderReqVO) { - PurchaseOrderDO purchaseOrderDO = purchaseOrderMapper.selectById(purchaseorderReqVO.getId()); - if (ObjectUtils.isEmpty(purchaseOrderDO)) { - throw exception(PURCHASE_ORDER_NOT_EXISTS); - } - // 获取当前流程正在审批的任务节点 - List taskList = bpmTaskApi.getTaskListByProcessInstanceId(purchaseOrderDO.getProcessInstanceId()).getData(); - BpmTaskRespDTO undoTask = taskList.get(taskList.size() - 1); +// @Override +// @Transactional(rollbackFor=Exception.class) +// public boolean orderPassReject(PurchaseorderReqVO purchaseorderReqVO) { +// PurchaseOrderDO purchaseOrderDO = purchaseOrderMapper.selectById(purchaseorderReqVO.getId()); +// if (ObjectUtils.isEmpty(purchaseOrderDO)) { +// throw exception(PURCHASE_ORDER_NOT_EXISTS); +// } +// // 获取当前流程正在审批的任务节点 +// List taskList = bpmTaskApi.getTaskListByProcessInstanceId(purchaseOrderDO.getProcessInstanceId()).getData(); +// BpmTaskRespDTO undoTask = taskList.get(taskList.size() - 1); +// +// // 判断是否流程已经通过、驳回 +// BpmApprovalDetailReqDTO badrDto = new BpmApprovalDetailReqDTO(); +// badrDto.setProcessInstanceId(purchaseOrderDO.getProcessInstanceId()); // 流程实例id +// badrDto.setTaskId(undoTask.getId()); // 当前审核任务节点id +// BpmApprovalDetailRespDTO approvalDetail = bpmProcessInstanceApi.getApprovalDetail(SecurityFrameworkUtils.getLoginUserId(), badrDto).getData(); +// //如果审核通过 +// if ("WAIT_PUSH".equals(purchaseorderReqVO.getStatus())) { +// purchaseOrderDO.setStatus(getStatusByBpmProcessInstanceCode(approvalDetail.getStatus())); +// } else { +// //如果审核不通过 +// purchaseOrderDO.setStatus(OrderStatusEnum.DRAFT.getCode()); +// } +// //设置审核意见 +// purchaseOrderDO.setReviewOpinion(purchaseorderReqVO.getReviewOpinion()); +// if (ObjectUtils.isNotEmpty(undoTask)) { +// purchaseOrderDO.setTaskId(undoTask.getId()); +// } +// purchaseOrderMapper.updateById(purchaseOrderDO); //更新状态 +// // 需要调用bpm 审核接口更新审批中的状态 +// if (DictEnum.BSE_CTRT_STS_WAIT_PUSH.getCode().equals(purchaseorderReqVO.getStatus()) && ObjectUtils.isNotEmpty(undoTask)) { +// if (approvalDetail.getStatus().equals(BpmProcessInstanceStatusEnum.RUNNING.getStatus())) { +// BpmTaskApproveReqDTO btarDto = new BpmTaskApproveReqDTO(); +// btarDto.setId(undoTask.getId()); +// btarDto.setReason(purchaseorderReqVO.getReviewOpinion()); +// CommonResult booleanCommonResult = bpmProcessInstanceApi.approveTask(btarDto); +// if (booleanCommonResult.isError()) { +// throw new RuntimeException(booleanCommonResult.getMsg()); +// } +// } +// } else if (DictEnum.BSE_CTRT_STS_REJECTED.getCode().equals(purchaseorderReqVO.getStatus()) && ObjectUtils.isNotEmpty(undoTask)) { +// if (approvalDetail.getStatus().equals(BpmProcessInstanceStatusEnum.RUNNING.getStatus())) { +// BpmTaskRejectReqDTO btrrDto = new BpmTaskRejectReqDTO(); +// btrrDto.setId(undoTask.getId()); +// btrrDto.setReason(purchaseorderReqVO.getReviewOpinion()); +// CommonResult booleanCommonResult = bpmProcessInstanceApi.rejectTask(btrrDto); +// if (booleanCommonResult.isError()) { +// throw new RuntimeException(booleanCommonResult.getMsg()); +// } +// } +// } +// return true; +// } + - // 判断是否流程已经通过、驳回 - BpmApprovalDetailReqDTO badrDto = new BpmApprovalDetailReqDTO(); - badrDto.setProcessInstanceId(purchaseOrderDO.getProcessInstanceId()); // 流程实例id - badrDto.setTaskId(undoTask.getId()); // 当前审核任务节点id - BpmApprovalDetailRespDTO approvalDetail = bpmProcessInstanceApi.getApprovalDetail(SecurityFrameworkUtils.getLoginUserId(), badrDto).getData(); - //如果审核通过 - if ("WAIT_PUSH".equals(purchaseorderReqVO.getStatus())) { - purchaseOrderDO.setStatus(OrderStatusEnum.TO_SUBMIT_ERP.getCode()); - } else { - //如果审核不通过 - purchaseOrderDO.setStatus(OrderStatusEnum.DRAFT.getCode()); - } - //设置审核意见 - purchaseOrderDO.setReviewOpinion(purchaseorderReqVO.getReviewOpinion()); - if (ObjectUtils.isNotEmpty(undoTask)) { - purchaseOrderDO.setTaskId(undoTask.getId()); - } - purchaseOrderMapper.updateById(purchaseOrderDO); //更新状态 - // 需要调用bpm 审核接口更新审批中的状态 - if (DictEnum.BSE_CTRT_STS_WAIT_PUSH.getCode().equals(purchaseorderReqVO.getStatus()) && ObjectUtils.isNotEmpty(undoTask)) { - if (approvalDetail.getStatus().equals(BpmProcessInstanceStatusEnum.RUNNING.getStatus())) { - BpmTaskApproveReqDTO btarDto = new BpmTaskApproveReqDTO(); - btarDto.setId(undoTask.getId()); - btarDto.setReason(purchaseorderReqVO.getReviewOpinion()); - bpmProcessInstanceApi.approveTask(btarDto); - } - } else if (DictEnum.BSE_CTRT_STS_REJECTED.getCode().equals(purchaseorderReqVO.getStatus()) && ObjectUtils.isNotEmpty(undoTask)) { - if (approvalDetail.getStatus().equals(BpmProcessInstanceStatusEnum.RUNNING.getStatus())) { - BpmTaskRejectReqDTO btrrDto = new BpmTaskRejectReqDTO(); - btrrDto.setId(undoTask.getId()); - btrrDto.setReason(purchaseorderReqVO.getReviewOpinion()); - bpmProcessInstanceApi.rejectTask(btrrDto); - } - } - return true; - } @Override public List getOrderByOrderIdAndType(DownOrUpOrderReqVO reqVO) { @@ -687,4 +697,90 @@ public class PurchaseOrderServiceImpl implements PurchaseOrderService { public List getOrdersByIds(List ids) { return purchaseOrderMapper.selectByIds(ids); } + + @Override + @Transactional(rollbackFor=Exception.class) + public boolean orderPassReject(PurchaseorderReqVO purchaseorderReqVO) { + // 查询采购单 + PurchaseOrderDO purchaseOrderDO = purchaseOrderMapper.selectById(purchaseorderReqVO.getId()); + if (ObjectUtils.isEmpty(purchaseOrderDO)) { + throw exception(PURCHASE_ORDER_NOT_EXISTS); + } + + // 获取当前流程的所有任务节点 + List taskList = bpmTaskApi.getTaskListByProcessInstanceId(purchaseOrderDO.getProcessInstanceId()).getData(); + + // 筛选出当前待处理的任务(未结束的任务) + BpmTaskRespDTO undoTask = taskList.stream() + .filter(task -> task.getEndTime() == null) + .findFirst() + .orElse(null); + + if (ObjectUtils.isEmpty(undoTask)) { + throw new RuntimeException("未找到待审批的任务节点"); + } + + // 先调用BPM审批接口,再更新本地状态 + if (DictEnum.BSE_CTRT_STS_WAIT_PUSH.getCode().equals(purchaseorderReqVO.getStatus())) { + // 审批通过 + BpmTaskApproveReqDTO btarDto = new BpmTaskApproveReqDTO(); + btarDto.setId(undoTask.getId()); + btarDto.setReason(purchaseorderReqVO.getReviewOpinion()); + CommonResult result = bpmProcessInstanceApi.approveTask(btarDto); + if (result.isError()) { + throw new RuntimeException(result.getMsg()); + } + } else if (DictEnum.BSE_CTRT_STS_REJECTED.getCode().equals(purchaseorderReqVO.getStatus())) { + // 审批驳回 + BpmTaskRejectReqDTO btrrDto = new BpmTaskRejectReqDTO(); + btrrDto.setId(undoTask.getId()); + btrrDto.setReason(purchaseorderReqVO.getReviewOpinion()); + CommonResult result = bpmProcessInstanceApi.rejectTask(btrrDto); + if (result.isError()) { + throw new RuntimeException(result.getMsg()); + } + } + + // 调用BPM接口后,查询最新的审批详情 + BpmApprovalDetailReqDTO badrDto = new BpmApprovalDetailReqDTO(); + badrDto.setProcessInstanceId(purchaseOrderDO.getProcessInstanceId()); + badrDto.setTaskId(undoTask.getId()); + BpmApprovalDetailRespDTO approvalDetail = bpmProcessInstanceApi.getApprovalDetail(SecurityFrameworkUtils.getLoginUserId(), badrDto).getData(); + + // 使用统一方法转换状态 + purchaseOrderDO.setStatus(getStatusByBpmProcessInstanceCode(approvalDetail.getStatus())); + purchaseOrderDO.setReviewOpinion(purchaseorderReqVO.getReviewOpinion()); + purchaseOrderDO.setTaskId(undoTask.getId()); + + purchaseOrderMapper.updateById(purchaseOrderDO); + + return true; + } + + private String getStatusByBpmProcessInstanceCode(Integer code) { + log.debug("转换BPM状态码 - 输入码: {}", code); + return Optional.ofNullable(code) + .map(c -> switch (c) { + case -1, 3, 4 -> { + log.debug("BPM状态码 {} 转换为: {}", c, OrderStatusEnum.DRAFT.getCode()); + yield OrderStatusEnum.DRAFT.getCode(); + } + case 1 -> { + log.debug("BPM状态码 {} 转换为: {}", c, OrderStatusEnum.APPROVING.getCode()); + yield OrderStatusEnum.APPROVING.getCode(); + } + case 2 -> { + log.debug("BPM状态码 {} 转换为: {}", c, OrderStatusEnum.TO_SUBMIT_ERP.getCode()); + yield OrderStatusEnum.TO_SUBMIT_ERP.getCode(); + } + default -> { + log.error("未定义的BPM状态码: {}", c); + throw new IllegalArgumentException("未定义的BPM状态码:" + c); + } + }) + .orElseThrow(() -> { + log.error("BPM状态码为null"); + return new IllegalArgumentException("BPM状态码不能为null"); + }); + } } 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 9348cdc..f7df661 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 @@ -6,6 +6,7 @@ import com.alibaba.fastjson2.JSONException; import com.alibaba.fastjson2.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; +import com.zt.plat.framework.common.pojo.CommonResult; import com.zt.plat.framework.common.pojo.PageResult; import com.zt.plat.framework.common.util.object.BeanUtils; import com.zt.plat.framework.security.core.util.SecurityFrameworkUtils; @@ -17,6 +18,7 @@ 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; @@ -40,6 +42,7 @@ import org.springframework.validation.annotation.Validated; import java.util.ArrayList; import java.util.List; +import java.util.Optional; import static com.zt.plat.framework.common.exception.util.ServiceExceptionUtil.exception; import static com.zt.plat.module.contractorder.enums.ErrorCodeConstants.CONTRACT_ORDER_EXISTS; @@ -311,55 +314,113 @@ public class SalesOrderServiceImpl implements SalesOrderService { return "提交审批成功"; } +// @Override +// @Transactional +// public boolean orderPassReject(SalesOrderReviewReqVO salesOrderReviewReqVO) { +// SalesOrderDO salesOrderDO = salesOrderMapper.selectById(salesOrderReviewReqVO.getId()); +// if (ObjectUtils.isEmpty(salesOrderDO)) { +// throw exception(PURCHASE_ORDER_NOT_EXISTS); +// } +// // 获取当前流程正在审批的任务节点 +// List taskList = bpmTaskApi.getTaskListByProcessInstanceId(salesOrderDO.getProcessInstanceId()).getData(); +// BpmTaskRespDTO undoTask = taskList.get(taskList.size() - 1); +// +// // 判断是否流程已经通过、驳回 +// BpmApprovalDetailReqDTO badrDto = new BpmApprovalDetailReqDTO(); +// badrDto.setProcessInstanceId(salesOrderDO.getProcessInstanceId()); // 流程实例id +// badrDto.setTaskId(undoTask.getId()); // 当前审核任务节点id +// BpmApprovalDetailRespDTO approvalDetail = bpmProcessInstanceApi.getApprovalDetail(SecurityFrameworkUtils.getLoginUserId(), badrDto).getData(); +// //如果审核通过 +// if ("WAIT_PUSH".equals(salesOrderReviewReqVO.getStatus())) { +// salesOrderDO.setStatus(getStatusByBpmProcessInstanceCode(approvalDetail.getStatus())); +// } else { +// //如果审核不通过 +// salesOrderDO.setStatus(OrderStatusEnum.DRAFT.getCode()); +// } +// //设置审核意见 +// salesOrderDO.setReviewOpinion(salesOrderDO.getReviewOpinion()); +// if (ObjectUtils.isNotEmpty(undoTask)) { +// salesOrderDO.setTaskId(undoTask.getId()); +// } +// salesOrderMapper.updateById(salesOrderDO); //更新状态 +// +// // 需要调用bpm 审核接口更新审批中的状态 +// if (DictEnum.BSE_CTRT_STS_WAIT_PUSH.getCode().equals(salesOrderDO.getStatus()) && ObjectUtils.isNotEmpty(undoTask)) { +// if (approvalDetail.getStatus().equals(BpmProcessInstanceStatusEnum.RUNNING.getStatus())) { +// BpmTaskApproveReqDTO btarDto = new BpmTaskApproveReqDTO(); +// btarDto.setId(undoTask.getId()); +// btarDto.setReason(salesOrderDO.getReviewOpinion()); +// bpmProcessInstanceApi.approveTask(btarDto); +// } +// } else if (DictEnum.BSE_CTRT_STS_REJECTED.getCode().equals(salesOrderDO.getStatus()) && ObjectUtils.isNotEmpty(undoTask)) { +// if (approvalDetail.getStatus().equals(BpmProcessInstanceStatusEnum.RUNNING.getStatus())) { +// BpmTaskRejectReqDTO btrrDto = new BpmTaskRejectReqDTO(); +// btrrDto.setId(undoTask.getId()); +// btrrDto.setReason(salesOrderDO.getReviewOpinion()); +// bpmProcessInstanceApi.rejectTask(btrrDto); +// } +// } +// return true; +// } + @Override - @Transactional + @Transactional(rollbackFor=Exception.class) public boolean orderPassReject(SalesOrderReviewReqVO salesOrderReviewReqVO) { + // 查询采购单 SalesOrderDO salesOrderDO = salesOrderMapper.selectById(salesOrderReviewReqVO.getId()); if (ObjectUtils.isEmpty(salesOrderDO)) { throw exception(PURCHASE_ORDER_NOT_EXISTS); } - // 获取当前流程正在审批的任务节点 + + // 获取当前流程的所有任务节点 List taskList = bpmTaskApi.getTaskListByProcessInstanceId(salesOrderDO.getProcessInstanceId()).getData(); - BpmTaskRespDTO undoTask = taskList.get(taskList.size() - 1); - // 判断是否流程已经通过、驳回 + // 筛选出当前待处理的任务(未结束的任务) + BpmTaskRespDTO undoTask = taskList.stream() + .filter(task -> task.getEndTime() == null) + .findFirst() + .orElse(null); + + if (ObjectUtils.isEmpty(undoTask)) { + throw new RuntimeException("未找到待审批的任务节点"); + } + + // 先调用BPM审批接口,再更新本地状态 + if (DictEnum.BSE_CTRT_STS_WAIT_PUSH.getCode().equals(salesOrderReviewReqVO.getStatus())) { + // 审批通过 + BpmTaskApproveReqDTO btarDto = new BpmTaskApproveReqDTO(); + btarDto.setId(undoTask.getId()); + btarDto.setReason(salesOrderReviewReqVO.getReviewOpinion()); + CommonResult result = bpmProcessInstanceApi.approveTask(btarDto); + if (result.isError()) { + throw new RuntimeException(result.getMsg()); + } + } else if (DictEnum.BSE_CTRT_STS_REJECTED.getCode().equals(salesOrderReviewReqVO.getStatus())) { + // 审批驳回 + BpmTaskRejectReqDTO btrrDto = new BpmTaskRejectReqDTO(); + btrrDto.setId(undoTask.getId()); + btrrDto.setReason(salesOrderReviewReqVO.getReviewOpinion()); + CommonResult result = bpmProcessInstanceApi.rejectTask(btrrDto); + if (result.isError()) { + throw new RuntimeException(result.getMsg()); + } + } + + // 调用BPM接口后,查询最新的审批详情 BpmApprovalDetailReqDTO badrDto = new BpmApprovalDetailReqDTO(); - badrDto.setProcessInstanceId(salesOrderDO.getProcessInstanceId()); // 流程实例id - badrDto.setTaskId(undoTask.getId()); // 当前审核任务节点id + badrDto.setProcessInstanceId(salesOrderDO.getProcessInstanceId()); + badrDto.setTaskId(undoTask.getId()); BpmApprovalDetailRespDTO approvalDetail = bpmProcessInstanceApi.getApprovalDetail(SecurityFrameworkUtils.getLoginUserId(), badrDto).getData(); - //如果审核通过 - if ("WAIT_PUSH".equals(salesOrderReviewReqVO.getStatus())) { - salesOrderDO.setStatus(OrderStatusEnum.TO_SUBMIT_ERP.getCode()); - } else { - //如果审核不通过 - salesOrderDO.setStatus(OrderStatusEnum.DRAFT.getCode()); - } - //设置审核意见 - salesOrderDO.setReviewOpinion(salesOrderDO.getReviewOpinion()); - if (ObjectUtils.isNotEmpty(undoTask)) { - salesOrderDO.setTaskId(undoTask.getId()); - } - salesOrderMapper.updateById(salesOrderDO); //更新状态 - // 需要调用bpm 审核接口更新审批中的状态 - if (DictEnum.BSE_CTRT_STS_WAIT_PUSH.getCode().equals(salesOrderDO.getStatus()) && ObjectUtils.isNotEmpty(undoTask)) { - if (approvalDetail.getStatus().equals(BpmProcessInstanceStatusEnum.RUNNING.getStatus())) { - BpmTaskApproveReqDTO btarDto = new BpmTaskApproveReqDTO(); - btarDto.setId(undoTask.getId()); - btarDto.setReason(salesOrderDO.getReviewOpinion()); - bpmProcessInstanceApi.approveTask(btarDto); - } - } else if (DictEnum.BSE_CTRT_STS_REJECTED.getCode().equals(salesOrderDO.getStatus()) && ObjectUtils.isNotEmpty(undoTask)) { - if (approvalDetail.getStatus().equals(BpmProcessInstanceStatusEnum.RUNNING.getStatus())) { - BpmTaskRejectReqDTO btrrDto = new BpmTaskRejectReqDTO(); - btrrDto.setId(undoTask.getId()); - btrrDto.setReason(salesOrderDO.getReviewOpinion()); - bpmProcessInstanceApi.rejectTask(btrrDto); - } - } + // 使用统一方法转换状态 + salesOrderDO.setStatus(getStatusByBpmProcessInstanceCode(approvalDetail.getStatus())); + salesOrderDO.setReviewOpinion(salesOrderReviewReqVO.getReviewOpinion()); + salesOrderDO.setTaskId(undoTask.getId()); + + salesOrderMapper.updateById(salesOrderDO); + return true; } - @Override public boolean linkOrder(LinkOrderReqVO LinkOrderReqVO) { @@ -460,4 +521,15 @@ public class SalesOrderServiceImpl implements SalesOrderService { throw exception(PURCHASE_ORDER_NOT_EXISTS); } } + + private String getStatusByBpmProcessInstanceCode(Integer code) { + return Optional.ofNullable(code) + .map(c -> switch (c) { + case -1, 3, 4 -> OrderStatusEnum.DRAFT.getCode(); + case 1 -> OrderStatusEnum.APPROVING.getCode(); + case 2 -> OrderStatusEnum.TO_SUBMIT_ERP.getCode(); + default -> throw new IllegalArgumentException("未定义的BPM状态码:" + c); + }) + .orElseThrow(() -> new IllegalArgumentException("BPM状态码不能为null")); + } }