|
|
@@ -0,0 +1,191 @@
|
|
|
+package cn.iocoder.yudao.module.order.service.impl;
|
|
|
+
|
|
|
+import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
|
|
|
+import cn.iocoder.yudao.framework.tenant.core.aop.TenantIgnore;
|
|
|
+import cn.iocoder.yudao.module.bpm.api.task.BpmProcessInstanceApi;
|
|
|
+import cn.iocoder.yudao.module.bpm.api.task.dto.BpmProcessInstanceCreateReqDTO;
|
|
|
+import cn.iocoder.yudao.module.bpm.enums.task.BpmTaskStatusEnum;
|
|
|
+import cn.iocoder.yudao.module.infra.api.config.ConfigApi;
|
|
|
+import cn.iocoder.yudao.module.order.controller.admin.order.vo.OrderChangeCreateReqVO;
|
|
|
+import cn.iocoder.yudao.module.order.controller.admin.order.vo.OrderChangeRespVO;
|
|
|
+import cn.iocoder.yudao.module.order.dal.dataobject.OrderChangeDO;
|
|
|
+import cn.iocoder.yudao.module.order.dal.dataobject.OrderDO;
|
|
|
+import cn.iocoder.yudao.module.order.dal.dataobject.OrderEntryDO;
|
|
|
+import cn.iocoder.yudao.module.order.dal.mysql.OrderChangeMapper;
|
|
|
+import cn.iocoder.yudao.module.order.dal.mysql.OrderEntryMapper;
|
|
|
+import cn.iocoder.yudao.module.order.dal.mysql.OrderMapper;
|
|
|
+import cn.iocoder.yudao.module.order.service.OrderChangeService;
|
|
|
+import jakarta.annotation.Resource;
|
|
|
+import org.springframework.stereotype.Service;
|
|
|
+import org.springframework.transaction.annotation.Transactional;
|
|
|
+import org.springframework.validation.annotation.Validated;
|
|
|
+
|
|
|
+import java.time.LocalDateTime;
|
|
|
+import java.util.HashMap;
|
|
|
+import java.util.List;
|
|
|
+import java.util.Map;
|
|
|
+
|
|
|
+import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
|
|
|
+import static cn.iocoder.yudao.module.order.enums.ErrorCodeConstants.ORDER_NOT_EXISTS;
|
|
|
+
|
|
|
+/**
|
|
|
+ * 订单变更流程 Service 实现类
|
|
|
+ */
|
|
|
+@Service
|
|
|
+@Validated
|
|
|
+public class OrderChangeServiceImpl implements OrderChangeService {
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 订单变更对应的流程定义 KEY
|
|
|
+ */
|
|
|
+ public static final String PROCESS_KEY = "Order_Change";
|
|
|
+
|
|
|
+ @Resource
|
|
|
+ private OrderMapper orderMapper;
|
|
|
+
|
|
|
+ @Resource
|
|
|
+ private OrderEntryMapper orderEntryMapper;
|
|
|
+
|
|
|
+ @Resource
|
|
|
+ private OrderChangeMapper orderChangeMapper;
|
|
|
+
|
|
|
+ @Resource
|
|
|
+ private BpmProcessInstanceApi processInstanceApi;
|
|
|
+
|
|
|
+ @Resource
|
|
|
+ private ConfigApi configApi;
|
|
|
+
|
|
|
+ @Override
|
|
|
+ @Transactional(rollbackFor = Exception.class)
|
|
|
+ @TenantIgnore
|
|
|
+ public Long createOrderChange(Long userId, OrderChangeCreateReqVO createReqVO) {
|
|
|
+ // 1. 校验订单是否存在
|
|
|
+ OrderDO order = orderMapper.selectById(createReqVO.getOrderId());
|
|
|
+ if (order == null) {
|
|
|
+ throw exception(ORDER_NOT_EXISTS);
|
|
|
+ }
|
|
|
+
|
|
|
+ // 2. 创建变更记录
|
|
|
+ OrderChangeDO changeDO = new OrderChangeDO();
|
|
|
+ changeDO.setSeorderId(String.valueOf(order.getId()));
|
|
|
+ changeDO.setBillNo(order.getBillNo());
|
|
|
+ changeDO.setOrderType(order.getOrderType());
|
|
|
+ changeDO.setCustomId(order.getCustomId());
|
|
|
+ changeDO.setCustomName(order.getCustomName());
|
|
|
+ changeDO.setCustomNo(order.getCustomNo());
|
|
|
+ changeDO.setCustomLevel(order.getCustomLevel());
|
|
|
+ changeDO.setDate(order.getDate());
|
|
|
+ changeDO.setRdate(order.getRdate());
|
|
|
+ changeDO.setUrgent(order.getUrgent());
|
|
|
+ changeDO.setChangeReason(createReqVO.getChangeReason());
|
|
|
+ changeDO.setChangeType(createReqVO.getChangeType());
|
|
|
+ changeDO.setChangeContent(createReqVO.getChangeContent());
|
|
|
+ changeDO.setFlowstate("审批中");
|
|
|
+ changeDO.setClosed(false);
|
|
|
+ changeDO.setIsDeleted(false);
|
|
|
+ changeDO.setCreateTime(LocalDateTime.now());
|
|
|
+ changeDO.setCreateBy(userId);
|
|
|
+ // 从配置管理获取默认租户编码设置到factory_id
|
|
|
+ String defaultDomain = configApi.getConfigValueByKey("order.default.domain");
|
|
|
+ if (defaultDomain != null) {
|
|
|
+ changeDO.setFactoryId(Long.parseLong(defaultDomain));
|
|
|
+ }
|
|
|
+ orderChangeMapper.insert(changeDO);
|
|
|
+
|
|
|
+ // 3. 更新订单的流程状态
|
|
|
+ OrderDO updateOrder = new OrderDO();
|
|
|
+ updateOrder.setId(order.getId());
|
|
|
+ updateOrder.setFlowstate("审批中");
|
|
|
+ orderMapper.updateById(updateOrder);
|
|
|
+
|
|
|
+ // 4. 发起 BPM 流程
|
|
|
+ Map<String, Object> processInstanceVariables = new HashMap<>();
|
|
|
+ processInstanceVariables.put("orderId", order.getId());
|
|
|
+ processInstanceVariables.put("changeId", changeDO.getId());
|
|
|
+ processInstanceVariables.put("billNo", order.getBillNo());
|
|
|
+ processInstanceVariables.put("changeReason", createReqVO.getChangeReason());
|
|
|
+ processInstanceVariables.put("changeType", createReqVO.getChangeType());
|
|
|
+ processInstanceVariables.put("changeContent", createReqVO.getChangeContent());
|
|
|
+
|
|
|
+ String processInstanceId = processInstanceApi.createProcessInstance(userId,
|
|
|
+ new BpmProcessInstanceCreateReqDTO()
|
|
|
+ .setProcessDefinitionKey(PROCESS_KEY)
|
|
|
+ .setVariables(processInstanceVariables)
|
|
|
+ .setBusinessKey(String.valueOf(changeDO.getId()))
|
|
|
+ .setStartUserSelectAssignees(createReqVO.getStartUserSelectAssignees()));
|
|
|
+
|
|
|
+ // 5. 将工作流的编号,更新到订单中
|
|
|
+ orderMapper.updateById(new OrderDO().setId(order.getId()).setProcessInstanceId(processInstanceId));
|
|
|
+
|
|
|
+ return changeDO.getId();
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ @TenantIgnore
|
|
|
+ public void updateOrderChangeStatus(Long id, Integer status) {
|
|
|
+ // 校验变更记录是否存在
|
|
|
+ OrderChangeDO changeDO = orderChangeMapper.selectById(id);
|
|
|
+ if (changeDO == null) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 根据流程状态更新
|
|
|
+ String flowstate;
|
|
|
+ if (BpmTaskStatusEnum.APPROVE.getStatus().equals(status)) {
|
|
|
+ flowstate = "审批完成";
|
|
|
+ // 审批通过后,更新订单明细的进度为0(再评审)
|
|
|
+ Long orderId = Long.parseLong(changeDO.getSeorderId());
|
|
|
+ orderEntryMapper.updateProgressByOrderId(orderId, 0);
|
|
|
+ // 更新订单的流程状态
|
|
|
+ orderMapper.updateById(new OrderDO().setId(orderId).setFlowstate(flowstate));
|
|
|
+ } else if (BpmTaskStatusEnum.REJECT.getStatus().equals(status)) {
|
|
|
+ flowstate = "审批拒绝";
|
|
|
+ Long orderId = Long.parseLong(changeDO.getSeorderId());
|
|
|
+ orderMapper.updateById(new OrderDO().setId(orderId).setFlowstate(flowstate));
|
|
|
+ } else if (BpmTaskStatusEnum.CANCEL.getStatus().equals(status)) {
|
|
|
+ flowstate = "已取消";
|
|
|
+ Long orderId = Long.parseLong(changeDO.getSeorderId());
|
|
|
+ orderMapper.updateById(new OrderDO().setId(orderId).setFlowstate(flowstate));
|
|
|
+ } else {
|
|
|
+ flowstate = "审批中";
|
|
|
+ }
|
|
|
+
|
|
|
+ // 更新变更记录的流程状态
|
|
|
+ OrderChangeDO updateChange = new OrderChangeDO();
|
|
|
+ updateChange.setId(id);
|
|
|
+ updateChange.setFlowstate(flowstate);
|
|
|
+ orderChangeMapper.updateById(updateChange);
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ @TenantIgnore
|
|
|
+ public OrderChangeRespVO getOrderChange(Long id) {
|
|
|
+ // 查询变更记录
|
|
|
+ OrderChangeDO changeDO = orderChangeMapper.selectById(id);
|
|
|
+ if (changeDO == null) {
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 转换为响应VO
|
|
|
+ OrderChangeRespVO respVO = new OrderChangeRespVO();
|
|
|
+ respVO.setId(changeDO.getId());
|
|
|
+ respVO.setBillNo(changeDO.getBillNo());
|
|
|
+ respVO.setOrderType(changeDO.getOrderType() != null ? String.valueOf(changeDO.getOrderType()) : null);
|
|
|
+ respVO.setCustomName(changeDO.getCustomName());
|
|
|
+ respVO.setCustomNo(changeDO.getCustomNo());
|
|
|
+ respVO.setCustomLevel(changeDO.getCustomLevel());
|
|
|
+ respVO.setDate(changeDO.getDate());
|
|
|
+ respVO.setUrgent(changeDO.getUrgent());
|
|
|
+ respVO.setFlowstate(changeDO.getFlowstate());
|
|
|
+ respVO.setChangeReason(changeDO.getChangeReason());
|
|
|
+ respVO.setChangeType(changeDO.getChangeType());
|
|
|
+ respVO.setChangeContent(changeDO.getChangeContent());
|
|
|
+
|
|
|
+ // 查询订单明细
|
|
|
+ Long orderId = Long.parseLong(changeDO.getSeorderId());
|
|
|
+ List<OrderEntryDO> entries = orderEntryMapper.selectListByOrderId(orderId);
|
|
|
+ respVO.setItems(BeanUtils.toBean(entries, OrderChangeRespVO.OrderEntryVO.class));
|
|
|
+
|
|
|
+ return respVO;
|
|
|
+ }
|
|
|
+}
|