| | |
| | | import cn.iocoder.yudao.module.crm.service.permission.bo.CrmPermissionTransferReqBO; |
| | | import cn.iocoder.yudao.module.crm.service.product.CrmProductService; |
| | | import cn.iocoder.yudao.module.crm.service.receivable.CrmReceivableService; |
| | | import cn.iocoder.yudao.module.erp.api.sale.ErpSaleOrderApi; |
| | | import cn.iocoder.yudao.module.erp.api.sale.dto.ErpSaleOrderCreateReqDTO; |
| | | import cn.iocoder.yudao.module.erp.api.sale.dto.ErpSaleOrderRespDTO; |
| | | import cn.iocoder.yudao.module.system.api.user.AdminUserApi; |
| | | import com.mzt.logapi.context.LogRecordContext; |
| | | import com.mzt.logapi.service.impl.DiffParseFunction; |
| | |
| | | private AdminUserApi adminUserApi; |
| | | @Resource |
| | | private BpmProcessInstanceApi bpmProcessInstanceApi; |
| | | @Resource |
| | | private ErpSaleOrderApi saleOrderApi; |
| | | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | |
| | | return contractMapper.selectListByCustomerIdOwnerUserId(customerId, ownerUserId); |
| | | } |
| | | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | @LogRecord(type = CRM_CONTRACT_TYPE, subType = "生成销售订单", bizNo = "{{#id}}", |
| | | success = "合同【{{#contractName}}】生成销售订单【{{#orderNo}}】成功") |
| | | @CrmPermission(bizType = CrmBizTypeEnum.CRM_CONTRACT, bizId = "#id", level = CrmPermissionLevelEnum.WRITE) |
| | | public Long generateSaleOrder(Long id, Long userId) { |
| | | // 1. 校验合同存在且已审批通过 |
| | | CrmContractDO contract = validateContractExists(id); |
| | | if (!CrmAuditStatusEnum.APPROVE.getStatus().equals(contract.getAuditStatus())) { |
| | | throw exception(CONTRACT_GENERATE_ORDER_FAIL_NOT_APPROVE); |
| | | } |
| | | // 2. 校验是否已生成销售订单 |
| | | ErpSaleOrderRespDTO existOrder = saleOrderApi.getSaleOrderByContractId(id).getCheckedData(); |
| | | if (existOrder != null) { |
| | | throw exception(CONTRACT_GENERATE_ORDER_FAIL_EXISTS_ORDER, existOrder.getNo()); |
| | | } |
| | | |
| | | // 3. 获取合同产品列表 |
| | | List<CrmContractProductDO> contractProducts = contractProductMapper.selectListByContractId(id); |
| | | if (CollUtil.isEmpty(contractProducts)) { |
| | | throw exception(CONTRACT_GENERATE_ORDER_FAIL_NO_PRODUCT); |
| | | } |
| | | |
| | | // 4. 构建销售订单创建请求 |
| | | ErpSaleOrderCreateReqDTO createReqDTO = new ErpSaleOrderCreateReqDTO(); |
| | | createReqDTO.setCustomerId(contract.getCustomerId()); |
| | | createReqDTO.setContractId(contract.getId()); |
| | | createReqDTO.setContractNo(contract.getNo()); |
| | | createReqDTO.setSaleUserId(contract.getOwnerUserId()); |
| | | createReqDTO.setOrderTime(LocalDateTime.now().toString()); |
| | | createReqDTO.setDiscountPercent(contract.getDiscountPercent()); |
| | | createReqDTO.setRemark("由合同【" + contract.getNo() + "】自动生成"); |
| | | |
| | | // 5. 构建订单项 |
| | | List<ErpSaleOrderCreateReqDTO.Item> items = contractProducts.stream() |
| | | .map(cp -> { |
| | | ErpSaleOrderCreateReqDTO.Item item = new ErpSaleOrderCreateReqDTO.Item(); |
| | | item.setProductId(cp.getProductId()); |
| | | item.setProductPrice(cp.getContractPrice()); |
| | | item.setCount(cp.getCount()); |
| | | return item; |
| | | }) |
| | | .toList(); |
| | | createReqDTO.setItems(items); |
| | | |
| | | // 6. 创建销售订单 |
| | | Long orderId = saleOrderApi.createSaleOrder(createReqDTO).getCheckedData(); |
| | | ErpSaleOrderRespDTO order = saleOrderApi.getSaleOrder(orderId).getCheckedData(); |
| | | |
| | | // 7. 更新合同关联订单信息 |
| | | contractMapper.updateById(new CrmContractDO() |
| | | .setId(id) |
| | | .setOrderId(orderId) |
| | | .setOrderNo(order.getNo())); |
| | | |
| | | // 8. 记录操作日志 |
| | | LogRecordContext.putVariable("contractName", contract.getName()); |
| | | LogRecordContext.putVariable("orderNo", order.getNo()); |
| | | |
| | | return orderId; |
| | | } |
| | | |
| | | } |