feat(purchase-order): 实现采购订单分步提交功能

- 新增三个分步提交接口:savePurchaseOrderStep1、savePurchaseOrderStep2、savePurchaseOrderStep3
- 添加对应的服务层方法和网关方法支持分步提交逻辑
- 修改OrderDealerDO实体类,移除冗余字段并新增财务相关字段
- 更新OrderPackageDO和ShipOrderDO等实体类以支持新业务需求
- 调整DTO和VO对象,增加companyId和companyName等相关属性
- 优化查询条件构造逻辑,增强dealerRebateCustomer查询的灵活性
- 废弃原有的createPurchaseOrder接口,改为分步提交模式
This commit is contained in:
shenyifei 2025-11-12 18:41:20 +08:00
parent 2ac7654203
commit 61ebd14181
43 changed files with 859 additions and 426 deletions

25
.lingma/rules/addFiled.md Normal file
View File

@ -0,0 +1,25 @@
---
trigger: manual
---
注意:
不用管 erp-turbo-svc 这个目录的代码
增加字段规则,举例如果需要在 AAAA.java 增加 BBB 字段
那么需要增加的地方有以下地方:
> 必须加
- AAAA.java
- AAAADO.java
- AAAAVO.java
- AAAAMapper.java
- AAAAMapper.xml
- AAAACreateCmd.java
> 可加可不加
- AAAAListQry.java
- AAAAPageQry.java
> 判断加不加
- AAAAConvert.java
- AAAAAssembler.java

View File

@ -1,6 +1,7 @@
package com.xunhong.erp.turbo.admin.controller;
import cn.dev33.satoken.annotation.SaCheckLogin;
import cn.dev33.satoken.annotation.SaCheckPermission;
import cn.dev33.satoken.annotation.SaCheckRole;
import cn.dev33.satoken.annotation.SaMode;
import com.alibaba.cola.dto.MultiResponse;
@ -14,6 +15,7 @@ import com.xunhong.erp.turbo.api.biz.dto.qry.PurchaseOrderListQry;
import com.xunhong.erp.turbo.api.biz.dto.qry.PurchaseOrderPageQry;
import com.xunhong.erp.turbo.api.biz.dto.qry.PurchaseOrderShowQry;
import com.xunhong.erp.turbo.api.biz.dto.vo.PurchaseOrderVO;
import com.xunhong.erp.turbo.api.rbac.dto.constants.PermissionConstant;
import com.xunhong.erp.turbo.api.rbac.dto.constants.RoleConstant;
import com.xunhong.erp.turbo.api.user.api.AdminServiceI;
import com.xunhong.erp.turbo.api.user.dto.qry.AdminShowQry;
@ -59,12 +61,31 @@ public class PurchaseOrderController {
return SingleResponse.of(purchaseOrderService.countPurchaseOrderByState(purchaseOrderCountQry));
}
// 分步提交第一步车辆信息和经销商信息保存
@SaCheckLogin
// @SaCheckPermission(value = {PermissionConstant.MDB_BUSINESS_PURCHASE_ORDER_CREATE})
@PostMapping("createPurchaseOrder")
@Operation(summary = "创建采购订单(暂存)", method = "POST")
public SingleResponse<PurchaseOrderVO> createPurchaseOrder(@RequestBody @Validated PurchaseOrderCreateCmd purchaseOrderCreateCmd) {
return SingleResponse.of(purchaseOrderService.create(purchaseOrderCreateCmd));
@PostMapping("savePurchaseOrderStep1")
@Operation(summary = "采购订单第一步:车辆信息和经销商信息保存", method = "POST")
public SingleResponse<PurchaseOrderVO> savePurchaseOrderStep1(@RequestBody @Validated PurchaseOrderStep1Cmd purchaseOrderStep1Cmd) {
return SingleResponse.of(purchaseOrderService.saveStep1(purchaseOrderStep1Cmd));
}
// 分步提交第二步供应商信息保存
@SaCheckLogin
@PostMapping("savePurchaseOrderStep2")
@Operation(summary = "采购订单第二步:供应商信息保存", method = "POST")
public Response savePurchaseOrderStep2(@RequestBody @Validated PurchaseOrderStep2Cmd purchaseOrderStep2Cmd) {
purchaseOrderService.saveStep2(purchaseOrderStep2Cmd);
return Response.buildSuccess();
}
// 分步提交第三步人工和辅料等费用信息保存
@SaCheckLogin
@PostMapping("savePurchaseOrderStep3")
@Operation(summary = "采购订单第三步:人工和辅料等费用信息保存", method = "POST")
public Response savePurchaseOrderStep3(@RequestBody @Validated PurchaseOrderStep3Cmd purchaseOrderStep3Cmd) {
purchaseOrderService.saveStep3(purchaseOrderStep3Cmd);
return Response.buildSuccess();
}
@SaCheckLogin
@ -143,6 +164,17 @@ public class PurchaseOrderController {
return PageResponse.of(page.getRecords(), (int) page.getTotal(), (int) page.getSize(), (int) page.getCurrent());
}
// 注释掉原有的创建接口
@Deprecated
@SaCheckLogin
// @SaCheckPermission(value = {PermissionConstant.MDB_BUSINESS_PURCHASE_ORDER_CREATE})
@PostMapping("createPurchaseOrder")
@Operation(summary = "创建采购订单(暂存)", method = "POST")
public SingleResponse<PurchaseOrderVO> createPurchaseOrder(@RequestBody @Validated PurchaseOrderCreateCmd purchaseOrderCreateCmd) {
return SingleResponse.of(purchaseOrderService.create(purchaseOrderCreateCmd));
}
@Deprecated
@SaCheckLogin
// @SaCheckPermission(value = {PermissionConstant.MDB_BUSINESS_PURCHASE_ORDER_UPDATE})
@RequestMapping(value = "updatePurchaseOrder", method = {RequestMethod.PATCH, RequestMethod.PUT})

View File

@ -0,0 +1,27 @@
package com.xunhong.erp.turbo.biz.app.executor.cmd;
import com.xunhong.erp.turbo.api.biz.dto.cmd.PurchaseOrderStep1Cmd;
import com.xunhong.erp.turbo.api.biz.dto.vo.PurchaseOrderVO;
import com.xunhong.erp.turbo.biz.app.assembler.PurchaseOrderAssembler;
import com.xunhong.erp.turbo.biz.domain.entity.PurchaseOrder;
import com.xunhong.erp.turbo.biz.domain.gateway.PurchaseOrderGateway;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
/**
* @author shenyifei
*/
@Slf4j
@Component
@RequiredArgsConstructor
public class PurchaseOrderStep1CmdExe {
private final PurchaseOrderAssembler purchaseOrderAssembler;
private final PurchaseOrderGateway purchaseOrderGateway;
public PurchaseOrderVO execute(PurchaseOrderStep1Cmd purchaseOrderStep1Cmd) {
PurchaseOrder purchaseOrder = purchaseOrderGateway.saveStep1(purchaseOrderStep1Cmd);
return purchaseOrderAssembler.toPurchaseOrderVO(purchaseOrder);
}
}

View File

@ -0,0 +1,22 @@
package com.xunhong.erp.turbo.biz.app.executor.cmd;
import com.xunhong.erp.turbo.api.biz.dto.cmd.PurchaseOrderStep2Cmd;
import com.xunhong.erp.turbo.biz.domain.gateway.PurchaseOrderGateway;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
/**
* @author shenyifei
*/
@Slf4j
@Component
@RequiredArgsConstructor
public class PurchaseOrderStep2CmdExe {
private final PurchaseOrderGateway purchaseOrderGateway;
public void execute(PurchaseOrderStep2Cmd purchaseOrderStep2Cmd) {
purchaseOrderGateway.saveStep2(purchaseOrderStep2Cmd);
}
}

View File

@ -0,0 +1,22 @@
package com.xunhong.erp.turbo.biz.app.executor.cmd;
import com.xunhong.erp.turbo.api.biz.dto.cmd.PurchaseOrderStep3Cmd;
import com.xunhong.erp.turbo.biz.domain.gateway.PurchaseOrderGateway;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
/**
* @author shenyifei
*/
@Slf4j
@Component
@RequiredArgsConstructor
public class PurchaseOrderStep3CmdExe {
private final PurchaseOrderGateway purchaseOrderGateway;
public void execute(PurchaseOrderStep3Cmd purchaseOrderStep3Cmd) {
purchaseOrderGateway.saveStep3(purchaseOrderStep3Cmd);
}
}

View File

@ -43,6 +43,11 @@ public class PurchaseOrderServiceImpl implements PurchaseOrderServiceI {
private final PurchaseOrderRejectFinalCmdExe purchaseOrderRejectFinalCmdExe;
private final PurchaseOrderCountQryExe purchaseOrderCountQryExe;
// 新增分步提交执行器
private final PurchaseOrderStep1CmdExe purchaseOrderStep1CmdExe;
private final PurchaseOrderStep2CmdExe purchaseOrderStep2CmdExe;
private final PurchaseOrderStep3CmdExe purchaseOrderStep3CmdExe;
@Override
public PurchaseOrderVO create(PurchaseOrderCreateCmd purchaseOrderCreateCmd) {
return purchaseOrderCreateCmdExe.execute(purchaseOrderCreateCmd);
@ -107,5 +112,20 @@ public class PurchaseOrderServiceImpl implements PurchaseOrderServiceI {
public Long countPurchaseOrderByState(PurchaseOrderCountQry purchaseOrderCountQry) {
return purchaseOrderCountQryExe.execute(purchaseOrderCountQry);
}
}
// 新增分步提交方法
@Override
public PurchaseOrderVO saveStep1(PurchaseOrderStep1Cmd purchaseOrderStep1Cmd) {
return purchaseOrderStep1CmdExe.execute(purchaseOrderStep1Cmd);
}
@Override
public void saveStep2(PurchaseOrderStep2Cmd purchaseOrderStep2Cmd) {
purchaseOrderStep2CmdExe.execute(purchaseOrderStep2Cmd);
}
@Override
public void saveStep3(PurchaseOrderStep3Cmd purchaseOrderStep3Cmd) {
purchaseOrderStep3CmdExe.execute(purchaseOrderStep3Cmd);
}
}

View File

@ -56,6 +56,16 @@ public class ShipOrder extends DTO {
*/
private String warehouseName;
/**
* 公司ID
*/
private Long companyId;
/**
* 公司名称
*/
private String companyName;
/**
* 车次号
*/
@ -196,4 +206,3 @@ public class ShipOrder extends DTO {
*/
private List<ShipOrderPackage> shipOrderPackageList;
}

View File

@ -2,6 +2,7 @@ package com.xunhong.erp.turbo.biz.domain.entity;
import com.alibaba.cola.domain.Entity;
import com.alibaba.cola.dto.DTO;
import com.baomidou.mybatisplus.annotation.TableField;
import lombok.Data;
import lombok.EqualsAndHashCode;
@ -55,6 +56,16 @@ public class Supplier extends DTO {
*/
private Boolean status;
/**
* 创建人
*/
private String createdBy;
/**
* 创建人姓名
*/
private String createdByName;
/**
* 创建时间
*/

View File

@ -16,6 +16,11 @@ import java.util.List;
public interface PurchaseOrderGateway {
PurchaseOrder save(PurchaseOrderCreateCmd purchaseOrderCreateCmd);
// 新增分步提交方法
PurchaseOrder saveStep1(PurchaseOrderStep1Cmd purchaseOrderStep1Cmd);
void saveStep2(PurchaseOrderStep2Cmd purchaseOrderStep2Cmd);
void saveStep3(PurchaseOrderStep3Cmd purchaseOrderStep3Cmd);
IPage<PurchaseOrder> page(PurchaseOrderPageQry purchaseOrderPageQry);
List<PurchaseOrder> list(PurchaseOrderListQry purchaseOrderListQry);

View File

@ -17,5 +17,7 @@ public interface OrderDealerConvert {
@Mapping(target = "createdAt", ignore = true)
OrderDealerDO toOrderDealerDO(OrderDealer orderDealer);
@Mapping(target = "createdByName", ignore = true)
@Mapping(target = "createdBy", ignore = true)
OrderDealer toOrderDealer(OrderDealerDO orderDealerDO);
}

View File

@ -25,6 +25,8 @@ public interface OrderSupplierConvert {
List<OrderSupplier> toOrderSupplierList(List<OrderSupplierDO> orderSupplierDOList);
@Mapping(target = "createdByName", ignore = true)
@Mapping(target = "createdBy", ignore = true)
@Mapping(target = "orderPackageList", source = "orderPackageDOList")
OrderSupplier toOrderSupplier(OrderSupplierDO orderSupplierDO);
}

View File

@ -1,7 +1,6 @@
package com.xunhong.erp.turbo.biz.infrastructure.convert;
import com.xunhong.erp.turbo.api.biz.dto.cmd.PurchaseOrderCreateCmd;
import com.xunhong.erp.turbo.api.biz.dto.cmd.PurchaseOrderUpdateCmd;
import com.xunhong.erp.turbo.api.biz.dto.cmd.*;
import com.xunhong.erp.turbo.biz.domain.entity.PurchaseOrder;
import com.xunhong.erp.turbo.biz.infrastructure.entity.PurchaseOrderDO;
import org.mapstruct.Mapper;
@ -23,6 +22,18 @@ public interface PurchaseOrderConvert {
@Mapping(target = "orderVehicle", source = "orderVehicleDO")
PurchaseOrder toPurchaseOrder(PurchaseOrderDO purchaseOrderDO);
@Mapping(target = "totalCost", ignore = true)
@Mapping(target = "supplierCount", ignore = true)
@Mapping(target = "saleAmount", ignore = true)
@Mapping(target = "rebate", ignore = true)
@Mapping(target = "pricingMethod", ignore = true)
@Mapping(target = "packageFee", ignore = true)
@Mapping(target = "orderRebateDO", ignore = true)
@Mapping(target = "orderCompanyDO", ignore = true)
@Mapping(target = "netWeight", ignore = true)
@Mapping(target = "grossWeight", ignore = true)
@Mapping(target = "freightCharge", ignore = true)
@Mapping(target = "avgUnitPrice", ignore = true)
@Mapping(target = "orderDealerDO", ignore = true)
@Mapping(target = "orderCostDOList", ignore = true)
@Mapping(target = "orderSn", ignore = true)
@ -36,6 +47,18 @@ public interface PurchaseOrderConvert {
@Mapping(target = "createdAt", ignore = true)
PurchaseOrderDO toPurchaseOrderDO(PurchaseOrderCreateCmd purchaseOrderCreateCmd);
@Mapping(target = "totalCost", ignore = true)
@Mapping(target = "supplierCount", ignore = true)
@Mapping(target = "saleAmount", ignore = true)
@Mapping(target = "rebate", ignore = true)
@Mapping(target = "pricingMethod", ignore = true)
@Mapping(target = "packageFee", ignore = true)
@Mapping(target = "orderRebateDO", ignore = true)
@Mapping(target = "orderCompanyDO", ignore = true)
@Mapping(target = "netWeight", ignore = true)
@Mapping(target = "grossWeight", ignore = true)
@Mapping(target = "freightCharge", ignore = true)
@Mapping(target = "avgUnitPrice", ignore = true)
@Mapping(target = "orderDealerDO", ignore = true)
@Mapping(target = "orderCostDOList", ignore = true)
@Mapping(target = "orderVehicleDO", ignore = true)
@ -48,5 +71,37 @@ public interface PurchaseOrderConvert {
@Mapping(target = "isDelete", ignore = true)
@Mapping(target = "createdAt", ignore = true)
void toPurchaseOrderDO(@MappingTarget PurchaseOrderDO purchaseOrderDO, PurchaseOrderUpdateCmd purchaseOrderUpdateCmd);
PurchaseOrderStep1Cmd toPurchaseOrderStep1Cmd(PurchaseOrderCreateCmd purchaseOrderCreateCmd);
PurchaseOrderStep2Cmd toPurchaseOrderStep2Cmd(PurchaseOrderCreateCmd purchaseOrderCreateCmd);
PurchaseOrderStep3Cmd toPurchaseOrderStep3Cmd(PurchaseOrderCreateCmd purchaseOrderCreateCmd);
@Mapping(target = "originPrincipal", source = "createdByName")
@Mapping(target = "version", ignore = true)
@Mapping(target = "updatedAt", ignore = true)
@Mapping(target = "totalCost", ignore = true)
@Mapping(target = "supplierCount", ignore = true)
@Mapping(target = "state", ignore = true)
@Mapping(target = "saleAmount", ignore = true)
@Mapping(target = "remark", ignore = true)
@Mapping(target = "rebate", ignore = true)
@Mapping(target = "pricingMethod", ignore = true)
@Mapping(target = "packageFee", ignore = true)
@Mapping(target = "orderVehicleDO", ignore = true)
@Mapping(target = "orderSupplierDOList", ignore = true)
@Mapping(target = "orderSn", ignore = true)
@Mapping(target = "orderRebateDO", ignore = true)
@Mapping(target = "orderDealerDO", ignore = true)
@Mapping(target = "orderCostDOList", ignore = true)
@Mapping(target = "orderCompanyDO", ignore = true)
@Mapping(target = "netWeight", ignore = true)
@Mapping(target = "isDelete", ignore = true)
@Mapping(target = "grossWeight", ignore = true)
@Mapping(target = "freightCharge", ignore = true)
@Mapping(target = "createdAt", ignore = true)
@Mapping(target = "avgUnitPrice", ignore = true)
PurchaseOrderDO toPurchaseOrderDO(PurchaseOrderStep1Cmd purchaseOrderStep1Cmd);
}

View File

@ -2,6 +2,7 @@ package com.xunhong.erp.turbo.biz.infrastructure.convert;
import com.xunhong.erp.turbo.api.biz.dto.cmd.SupplierCreateCmd;
import com.xunhong.erp.turbo.api.biz.dto.cmd.SupplierUpdateCmd;
import com.xunhong.erp.turbo.api.biz.dto.common.OrderSupplier;
import com.xunhong.erp.turbo.biz.domain.entity.Supplier;
import com.xunhong.erp.turbo.biz.infrastructure.entity.SupplierDO;
import org.mapstruct.Mapper;
@ -28,5 +29,13 @@ public interface SupplierConvert {
@Mapping(target = "isDelete", ignore = true)
@Mapping(target = "createdAt", ignore = true)
void toSupplierDO(@MappingTarget SupplierDO supplierDO, SupplierUpdateCmd supplierUpdateCmd);
@Mapping(target = "version", ignore = true)
@Mapping(target = "updatedAt", ignore = true)
@Mapping(target = "status", ignore = true)
@Mapping(target = "remark", ignore = true)
@Mapping(target = "isDelete", ignore = true)
@Mapping(target = "createdAt", ignore = true)
SupplierDO toSupplierDO(OrderSupplier updatedSupplier);
}

View File

@ -87,88 +87,27 @@ public class OrderDealerDO extends BaseDO<OrderDealerDO> {
private String documentTypes;
/**
* 账户ID
* 税费补贴
*/
@TableField(value = "account_id")
private Long accountId;
@TableField(value = "tax_subsidy")
private BigDecimal taxSubsidy;
/**
* 公司名称
* 计提税金
*/
@TableField(value = "company_name")
private String companyName;
@TableField(value = "tax_provision")
private BigDecimal taxProvision;
/**
* 税号
* 成本差异
*/
@TableField(value = "tax_number")
private String taxNumber;
@TableField(value = "cost_difference")
private BigDecimal costDifference;
/**
* 银行账号
* 利润分成
*/
@TableField(value = "bank_account")
private String bankAccount;
/**
* 单位地址
*/
@TableField(value = "company_address")
private String companyAddress;
/**
* 电话
*/
@TableField(value = "phone")
private String phone;
/**
* 开户行
*/
@TableField(value = "opening_bank")
private String openingBank;
/**
* 仓库ID
*/
@TableField(value = "warehouse_id")
private Long warehouseId;
/**
* 仓库名称
*/
@TableField(value = "warehouse_name")
private String warehouseName;
/**
* 仓库地址
*/
@TableField(value = "warehouse_address")
private String warehouseAddress;
/**
* 联系人
*/
@TableField(value = "contact_person")
private String contactPerson;
/**
* 联系电话
*/
@TableField(value = "contact_phone")
private String contactPhone;
/**
* 收货人姓名
*/
@TableField(value = "receiver_name")
private String receiverName;
/**
* 收货人电话
*/
@TableField(value = "receiver_phone")
private String receiverPhone;
@TableField(value = "profit_sharing")
private BigDecimal profitSharing;
}

View File

@ -43,6 +43,12 @@ public class OrderPackageDO extends BaseDO<OrderPackageDO> {
@TableField(value = "box_brand_name")
private String boxBrandName;
/**
* 箱子品牌图片
*/
@TableField(value = "box_brand_image")
private String boxBrandImage;
/**
* 箱子分类ID
*/
@ -92,4 +98,3 @@ public class OrderPackageDO extends BaseDO<OrderPackageDO> {
private OrderPackageBoxTypeEnum boxType;
}

View File

@ -63,6 +63,18 @@ public class ShipOrderDO extends BaseDO<ShipOrderDO> {
@TableField(value = "warehouse_name")
private String warehouseName;
/**
* 公司ID
*/
@TableField(value = "company_id")
private Long companyId;
/**
* 公司名称
*/
@TableField(value = "company_name")
private String companyName;
/**
* 车次号
*/
@ -227,4 +239,3 @@ public class ShipOrderDO extends BaseDO<ShipOrderDO> {
private List<ShipOrderItemDO> shipOrderItemDOList;
}

View File

@ -71,6 +71,4 @@ public class ShipOrderPackageDO extends BaseDO<ShipOrderPackageDO> {
*/
@TableField(value = "total_weight")
private BigDecimal totalWeight;
}

View File

@ -58,6 +58,18 @@ public class SupplierDO extends BaseDO<SupplierDO> {
@TableField(value = "remark")
private String remark;
/**
* 创建人ID
*/
@TableField(value = "created_by")
private Long createdBy;
/**
* 创建人姓名
*/
@TableField(value = "created_by_name")
private String createdByName;
/**
* 状态1_启用0_禁用
*/

View File

@ -98,7 +98,11 @@ public class DealerRebateCustomerGatewayImpl implements DealerRebateCustomerGate
@Override
public DealerRebateCustomer show(DealerRebateCustomerShowQry dealerRebateCustomerShowQry) {
LambdaQueryWrapper<DealerRebateCustomerDO> queryWrapper = Wrappers.lambdaQuery(DealerRebateCustomerDO.class);
queryWrapper.eq(DealerRebateCustomerDO::getCustomerId, dealerRebateCustomerShowQry.getCustomerId());
queryWrapper.eq(Objects.nonNull(dealerRebateCustomerShowQry.getCustomerId()), DealerRebateCustomerDO::getCustomerId, dealerRebateCustomerShowQry.getCustomerId());
queryWrapper.eq(Objects.nonNull(dealerRebateCustomerShowQry.getDealerId()), DealerRebateCustomerDO::getDealerId, dealerRebateCustomerShowQry.getDealerId());
queryWrapper.eq(Objects.nonNull(dealerRebateCustomerShowQry.getStatus()), DealerRebateCustomerDO::getStatus, dealerRebateCustomerShowQry.getStatus());
queryWrapper.last("limit 1");
DealerRebateCustomerDO dealerRebateCustomerDO = dealerRebateCustomerMapper.selectOne(queryWrapper);

View File

@ -66,47 +66,17 @@ public class PurchaseOrderGatewayImpl implements PurchaseOrderGateway {
private final ShipOrderItemMapper shipOrderItemMapper;
private final ShipOrderPackageMapper shipOrderPackageMapper;
private final SupplierMapper supplierMapper;
private final SupplierConvert supplierConvert;
@Override
@Transactional
public PurchaseOrder save(PurchaseOrderCreateCmd purchaseOrderCreateCmd) {
PurchaseOrderDO purchaseOrderDO = purchaseOrderConvert.toPurchaseOrderDO(purchaseOrderCreateCmd);
purchaseOrderDO.setState(PurchaseOrderStateEnum.DRAFT);
purchaseOrderDO.setOrderSn("CG" + generateShipOrderSn());
purchaseOrderMapper.insert(purchaseOrderDO);
// 订单运输信息
OrderVehicle orderVehicle = purchaseOrderCreateCmd.getOrderVehicle();
orderVehicle.setOrderId(purchaseOrderDO.getOrderId());
OrderVehicleDO orderVehicleDO = orderVehicleConvert.toOrderVehicleDO(orderVehicle);
orderVehicleMapper.insert(orderVehicleDO);
// 订单经销商信息
OrderDealer orderDealer = purchaseOrderCreateCmd.getOrderDealer();
orderDealer.setOrderId(purchaseOrderDO.getOrderId());
OrderDealerDO orderDealerDO = orderDealerConvert.toOrderDealerDO(orderDealer);
orderDealerMapper.insert(orderDealerDO);
// 订单供应商信息
purchaseOrderCreateCmd.getOrderSupplierList().forEach(orderSupplier -> {
orderSupplier.setOrderId(purchaseOrderDO.getOrderId());
OrderSupplierDO orderSupplierDO = orderSupplierConvert.toOrderSupplierDO(orderSupplier);
orderSupplierMapper.insert(orderSupplierDO);
// 订单包材信息
orderSupplier.getOrderPackageList().forEach(orderPackage -> {
orderPackage.setOrderSupplierId(orderSupplierDO.getOrderSupplierId());
OrderPackageDO orderPackageDO = orderPackageConvert.toOrderPackageDO(orderPackage);
orderPackageMapper.insert(orderPackageDO);
});
});
// 订单费用信息
purchaseOrderCreateCmd.getOrderCostList().forEach(orderCost -> {
orderCost.setOrderId(purchaseOrderDO.getOrderId());
orderCostMapper.insert(orderCostConvert.toOrderCostDO(orderCost));
});
return purchaseOrderConvert.toPurchaseOrder(purchaseOrderDO);
PurchaseOrder purchaseOrder = saveStep1(purchaseOrderConvert.toPurchaseOrderStep1Cmd(purchaseOrderCreateCmd));
purchaseOrderCreateCmd.setOrderId(purchaseOrder.getOrderId());
saveStep2(purchaseOrderConvert.toPurchaseOrderStep2Cmd(purchaseOrderCreateCmd));
saveStep3(purchaseOrderConvert.toPurchaseOrderStep3Cmd(purchaseOrderCreateCmd));
return purchaseOrder;
}
@Override
@ -129,10 +99,9 @@ public class PurchaseOrderGatewayImpl implements PurchaseOrderGateway {
}
}
if (Objects.nonNull(purchaseOrderPageQry.getDealerId()) || Objects.nonNull(purchaseOrderPageQry.getDealerPaymentAccountId())) {
if (Objects.nonNull(purchaseOrderPageQry.getDealerId())) {
LambdaQueryWrapper<OrderDealerDO> queryWrapper1 = Wrappers.lambdaQuery(OrderDealerDO.class);
queryWrapper1.eq(Objects.nonNull(purchaseOrderPageQry.getDealerId()), OrderDealerDO::getDealerId, purchaseOrderPageQry.getDealerId());
queryWrapper1.eq(Objects.nonNull(purchaseOrderPageQry.getDealerPaymentAccountId()), OrderDealerDO::getAccountId, purchaseOrderPageQry.getDealerPaymentAccountId());
List<OrderDealerDO> orderDealerDOList = orderDealerMapper.selectList(queryWrapper1);
if (CollUtil.isNotEmpty(orderDealerDOList)) {
@ -174,159 +143,7 @@ public class PurchaseOrderGatewayImpl implements PurchaseOrderGateway {
@Override
@Transactional
public PurchaseOrder update(PurchaseOrderUpdateCmd purchaseOrderUpdateCmd) {
LambdaQueryWrapper<PurchaseOrderDO> queryWrapper = Wrappers.lambdaQuery(PurchaseOrderDO.class);
queryWrapper.eq(PurchaseOrderDO::getOrderId, purchaseOrderUpdateCmd.getOrderId());
queryWrapper.last("limit 1");
PurchaseOrderDO purchaseOrderDO = purchaseOrderMapper.selectOne(queryWrapper);
purchaseOrderConvert.toPurchaseOrderDO(purchaseOrderDO, purchaseOrderUpdateCmd);
purchaseOrderMapper.updateById(purchaseOrderDO);
// 更新车辆信息
OrderVehicle orderVehicle = purchaseOrderUpdateCmd.getOrderVehicle();
OrderVehicleDO orderVehicleDO = orderVehicleConvert.toOrderVehicleDO(orderVehicle);
orderVehicleDO.setOrderId(purchaseOrderDO.getOrderId());
orderVehicleMapper.updateById(orderVehicleDO);
// 更新经销商信息
OrderDealer orderDealer = purchaseOrderUpdateCmd.getOrderDealer();
orderDealer.setOrderId(purchaseOrderDO.getOrderId());
OrderDealerDO orderDealerDO = orderDealerConvert.toOrderDealerDO(orderDealer);
// 先尝试更新如果不存在则插入
if (orderDealerDO.getOrderDealerId() != null) {
orderDealerMapper.updateById(orderDealerDO);
} else {
LambdaQueryWrapper<OrderDealerDO> dealerQueryWrapper = Wrappers.lambdaQuery(OrderDealerDO.class);
dealerQueryWrapper.eq(OrderDealerDO::getOrderId, purchaseOrderDO.getOrderId());
OrderDealerDO existingDealer = orderDealerMapper.selectOne(dealerQueryWrapper);
if (existingDealer != null) {
orderDealerDO.setOrderDealerId(existingDealer.getOrderDealerId());
orderDealerMapper.updateById(orderDealerDO);
} else {
orderDealerMapper.insert(orderDealerDO);
}
}
// 更新供应商信息精细化处理
// 获取现有的供应商列表
LambdaQueryWrapper<OrderSupplierDO> supplierQueryWrapper = Wrappers.lambdaQuery(OrderSupplierDO.class);
supplierQueryWrapper.eq(OrderSupplierDO::getOrderId, purchaseOrderDO.getOrderId());
List<OrderSupplierDO> existingSuppliers = orderSupplierMapper.selectList(supplierQueryWrapper);
// 获取更新的供应商列表
List<OrderSupplier> updatedSuppliers = purchaseOrderUpdateCmd.getOrderSupplierList();
// 将现有供应商映射到ID字典中便于查找
Map<Long, OrderSupplierDO> existingSupplierMap = existingSuppliers.stream()
.collect(Collectors.toMap(OrderSupplierDO::getOrderSupplierId, Function.identity()));
// 收集需要更新和新增的供应商
List<OrderSupplierDO> suppliersToInsert = new ArrayList<>();
List<OrderSupplierDO> suppliersToUpdate = new ArrayList<>();
for (OrderSupplier updatedSupplier : updatedSuppliers) {
updatedSupplier.setOrderId(purchaseOrderDO.getOrderId());
OrderSupplierDO supplierDO = orderSupplierConvert.toOrderSupplierDO(updatedSupplier);
if (updatedSupplier.getOrderSupplierId() != null && existingSupplierMap.containsKey(updatedSupplier.getOrderSupplierId())) {
// 更新已存在的供应商
supplierDO.setOrderSupplierId(updatedSupplier.getOrderSupplierId());
suppliersToUpdate.add(supplierDO);
// 从现有映射中移除剩下的就是需要删除的
existingSupplierMap.remove(updatedSupplier.getOrderSupplierId());
} else {
// 新增供应商
suppliersToInsert.add(supplierDO);
}
}
// 删除不再需要的供应商
existingSupplierMap.values().forEach(supplier -> supplier.deleteById());
// 执行更新操作
suppliersToUpdate.forEach(orderSupplierMapper::updateById);
// 执行插入操作
suppliersToInsert.forEach(orderSupplierMapper::insert);
// 处理包材信息对更新和新增的供应商
List<OrderSupplierDO> allAffectedSuppliers = new ArrayList<>();
allAffectedSuppliers.addAll(suppliersToUpdate);
allAffectedSuppliers.addAll(suppliersToInsert);
for (OrderSupplierDO supplierDO : allAffectedSuppliers) {
// 查找对应的更新数据
OrderSupplier updatedSupplier = updatedSuppliers.stream()
.filter(s -> (s.getOrderSupplierId() != null && s.getOrderSupplierId().equals(supplierDO.getOrderSupplierId()))
|| (s.getOrderSupplierId() == null && supplierDO.getOrderSupplierId() != null
&& s.getSupplierId().equals(supplierDO.getSupplierId())))
.findFirst()
.orElse(null);
if (updatedSupplier != null && updatedSupplier.getOrderPackageList() != null && !updatedSupplier.getOrderPackageList().isEmpty()) {
// 删除旧的包材信息
LambdaQueryWrapper<OrderPackageDO> packageDeleteWrapper = Wrappers.lambdaQuery(OrderPackageDO.class);
packageDeleteWrapper.eq(OrderPackageDO::getOrderSupplierId, supplierDO.getOrderSupplierId());
orderPackageMapper.delete(packageDeleteWrapper);
// 插入新的包材信息
for (OrderPackage orderPackage : updatedSupplier.getOrderPackageList()) {
orderPackage.setOrderSupplierId(supplierDO.getOrderSupplierId());
OrderPackageDO orderPackageDO = orderPackageConvert.toOrderPackageDO(orderPackage);
orderPackageMapper.insert(orderPackageDO);
}
} else if (updatedSupplier != null) {
// 如果更新的数据中包材列表为空则删除所有包材信息
LambdaQueryWrapper<OrderPackageDO> packageDeleteWrapper = Wrappers.lambdaQuery(OrderPackageDO.class);
packageDeleteWrapper.eq(OrderPackageDO::getOrderSupplierId, supplierDO.getOrderSupplierId());
orderPackageMapper.delete(packageDeleteWrapper);
}
}
// 更新费用信息精细化处理
// 获取现有的费用列表
LambdaQueryWrapper<OrderCostDO> costQueryWrapper = Wrappers.lambdaQuery(OrderCostDO.class);
costQueryWrapper.eq(OrderCostDO::getOrderId, purchaseOrderDO.getOrderId());
List<OrderCostDO> existingCosts = orderCostMapper.selectList(costQueryWrapper);
// 获取更新的费用列表
List<OrderCost> updatedCosts = purchaseOrderUpdateCmd.getOrderCostList();
// 将现有费用映射到ID字典中便于查找
Map<Long, OrderCostDO> existingCostMap = existingCosts.stream()
.collect(Collectors.toMap(OrderCostDO::getOrderCostId, Function.identity()));
// 收集需要更新和新增的费用
List<OrderCostDO> costsToInsert = new ArrayList<>();
List<OrderCostDO> costsToUpdate = new ArrayList<>();
for (OrderCost updatedCost : updatedCosts) {
updatedCost.setOrderId(purchaseOrderDO.getOrderId());
OrderCostDO costDO = orderCostConvert.toOrderCostDO(updatedCost);
if (updatedCost.getOrderCostId() != null && existingCostMap.containsKey(updatedCost.getOrderCostId())) {
// 更新已存在的费用
costDO.setOrderCostId(updatedCost.getOrderCostId());
costsToUpdate.add(costDO);
// 从现有映射中移除剩下的就是需要删除的
existingCostMap.remove(updatedCost.getOrderCostId());
} else {
// 新增费用
costsToInsert.add(costDO);
}
}
// 删除不再需要的费用
existingCostMap.values().forEach(cost -> cost.deleteById());
// 执行更新操作
costsToUpdate.forEach(orderCostMapper::updateById);
// 执行插入操作
costsToInsert.forEach(orderCostMapper::insert);
return purchaseOrderConvert.toPurchaseOrder(purchaseOrderDO);
return save(purchaseOrderUpdateCmd);
}
@Override
@ -603,6 +420,7 @@ public class PurchaseOrderGatewayImpl implements PurchaseOrderGateway {
shipOrderDO.setDriverName(orderVehicleDO.getDriver());
shipOrderDO.setDriverPhone(orderVehicleDO.getPhone());
shipOrderDO.setShippingDate(orderVehicleDO.getDeliveryTime());
shipOrderDO.setShippingAddress(orderVehicleDO.getOrigin());
shipOrderDO.setFreightDebt(orderVehicleDO.getPrice());
if (orderVehicleDO.getOpenStrawCurtain()) {
shipOrderDO.setStrawMatDebt(orderVehicleDO.getStrawCurtainPrice());
@ -612,16 +430,23 @@ public class PurchaseOrderGatewayImpl implements PurchaseOrderGateway {
shipOrderDO.setVehicleNo(orderVehicleDO.getVehicleNo());
}
// 从公司信息中获取相关信息
OrderCompanyDO orderCompanyDO = orderCompanyMapper.selectOne(
Wrappers.lambdaQuery(OrderCompanyDO.class)
.eq(OrderCompanyDO::getOrderId, purchaseOrderDO.getOrderId())
);
if (orderCompanyDO != null) {
shipOrderDO.setCompanyId(orderCompanyDO.getCompanyId());
shipOrderDO.setCompanyName(orderCompanyDO.getFullName());
}
// 从经销商信息中获取相关信息
OrderDealerDO orderDealerDO = orderDealerMapper.selectOne(
Wrappers.lambdaQuery(OrderDealerDO.class)
.eq(OrderDealerDO::getOrderId, purchaseOrderDO.getOrderId())
);
if (orderDealerDO != null) {
shipOrderDO.setReceivingAddress(orderDealerDO.getWarehouseAddress());
}
// 设置其他基本信息
shipOrderDO.setCreatedBy(purchaseOrderFinalApproveCmd.getCreatedBy());
shipOrderDO.setCreatedByName(purchaseOrderFinalApproveCmd.getCreatedByName());
@ -734,8 +559,6 @@ public class PurchaseOrderGatewayImpl implements PurchaseOrderGateway {
BigDecimal totalAmount = unitPrice.multiply(BigDecimal.valueOf(totalQuantity));
shipOrderPackageDO.setItemAmount(totalAmount);
shipOrderPackageDO.setSingleWeight(shipOrderPackageDO.getTotalWeight().divide(shipOrderPackageDO.getUnitPrice(), 2, RoundingMode.HALF_UP));
// 计算总重量如果有
BigDecimal totalWeight = packages.stream()
.map(p -> {
@ -747,6 +570,8 @@ public class PurchaseOrderGatewayImpl implements PurchaseOrderGateway {
.reduce(BigDecimal.ZERO, BigDecimal::add);
shipOrderPackageDO.setTotalWeight(totalWeight);
shipOrderPackageDO.setSingleWeight(shipOrderPackageDO.getTotalWeight().divide(shipOrderPackageDO.getUnitPrice(), 2, RoundingMode.HALF_UP));
shipOrderPackageMapper.insert(shipOrderPackageDO);
}
@ -832,5 +657,269 @@ public class PurchaseOrderGatewayImpl implements PurchaseOrderGateway {
queryWrapper.eq(PurchaseOrderDO::getState, purchaseOrderCountQry.getState());
return purchaseOrderMapper.selectCount(queryWrapper);
}
@Override
@Transactional
public PurchaseOrder saveStep1(PurchaseOrderStep1Cmd purchaseOrderStep1Cmd) {
PurchaseOrderDO purchaseOrderDO;
// 如果订单ID为空则创建新订单
if (purchaseOrderStep1Cmd.getOrderId() == null) {
purchaseOrderDO = purchaseOrderConvert.toPurchaseOrderDO(purchaseOrderStep1Cmd);
purchaseOrderDO.setState(PurchaseOrderStateEnum.DRAFT);
purchaseOrderDO.setOrderSn("CG" + generateShipOrderSn());
purchaseOrderMapper.insert(purchaseOrderDO);
} else {
// 否则更新现有订单
LambdaQueryWrapper<PurchaseOrderDO> queryWrapper = Wrappers.lambdaQuery(PurchaseOrderDO.class);
queryWrapper.eq(PurchaseOrderDO::getOrderId, purchaseOrderStep1Cmd.getOrderId());
queryWrapper.select(PurchaseOrderDO::getOrderId, PurchaseOrderDO::getActive);
queryWrapper.last("limit 1");
purchaseOrderDO = purchaseOrderMapper.selectOne(queryWrapper);
purchaseOrderDO.setActive(purchaseOrderStep1Cmd.getActive());
purchaseOrderMapper.updateById(purchaseOrderDO);
}
// 保存或更新车辆信息
OrderVehicle orderVehicle = purchaseOrderStep1Cmd.getOrderVehicle();
orderVehicle.setOrderId(purchaseOrderDO.getOrderId());
OrderVehicleDO orderVehicleDO = orderVehicleConvert.toOrderVehicleDO(orderVehicle);
if (orderVehicle.getVehicleId() != null) {
orderVehicleMapper.updateById(orderVehicleDO);
} else {
// 检查是否已存在车辆信息
LambdaQueryWrapper<OrderVehicleDO> vehicleQueryWrapper = Wrappers.lambdaQuery(OrderVehicleDO.class);
vehicleQueryWrapper.eq(OrderVehicleDO::getOrderId, purchaseOrderDO.getOrderId());
OrderVehicleDO existingVehicle = orderVehicleMapper.selectOne(vehicleQueryWrapper);
if (existingVehicle != null) {
orderVehicleDO.setVehicleId(existingVehicle.getVehicleId());
orderVehicleMapper.updateById(orderVehicleDO);
} else {
orderVehicleMapper.insert(orderVehicleDO);
}
}
// 保存或更新经销商信息
OrderDealer orderDealer = purchaseOrderStep1Cmd.getOrderDealer();
orderDealer.setOrderId(purchaseOrderDO.getOrderId());
OrderDealerDO orderDealerDO = orderDealerConvert.toOrderDealerDO(orderDealer);
if (orderDealer.getOrderDealerId() != null) {
orderDealerMapper.updateById(orderDealerDO);
} else {
// 检查是否已存在经销商信息
LambdaQueryWrapper<OrderDealerDO> dealerQueryWrapper = Wrappers.lambdaQuery(OrderDealerDO.class);
dealerQueryWrapper.eq(OrderDealerDO::getOrderId, purchaseOrderDO.getOrderId());
OrderDealerDO existingDealer = orderDealerMapper.selectOne(dealerQueryWrapper);
if (existingDealer != null) {
orderDealerDO.setOrderDealerId(existingDealer.getOrderDealerId());
orderDealerMapper.updateById(orderDealerDO);
} else {
orderDealerMapper.insert(orderDealerDO);
}
}
return purchaseOrderConvert.toPurchaseOrder(purchaseOrderDO);
}
@Override
@Transactional
public void saveStep2(PurchaseOrderStep2Cmd purchaseOrderStep2Cmd) {
Long orderId = purchaseOrderStep2Cmd.getOrderId();
// 否则更新现有订单
LambdaQueryWrapper<PurchaseOrderDO> queryWrapper = Wrappers.lambdaQuery(PurchaseOrderDO.class);
queryWrapper.eq(PurchaseOrderDO::getOrderId, orderId);
queryWrapper.select(PurchaseOrderDO::getOrderId, PurchaseOrderDO::getActive);
queryWrapper.last("limit 1");
PurchaseOrderDO purchaseOrderDO = purchaseOrderMapper.selectOne(queryWrapper);
purchaseOrderDO.setActive(purchaseOrderStep2Cmd.getActive());
purchaseOrderMapper.updateById(purchaseOrderDO);
// 更新供应商信息精细化处理
// 获取现有的供应商列表
LambdaQueryWrapper<OrderSupplierDO> supplierQueryWrapper = Wrappers.lambdaQuery(OrderSupplierDO.class);
supplierQueryWrapper.eq(OrderSupplierDO::getOrderId, orderId);
List<OrderSupplierDO> existingSuppliers = orderSupplierMapper.selectList(supplierQueryWrapper);
// 获取更新的供应商列表
List<OrderSupplier> updatedSuppliers = purchaseOrderStep2Cmd.getOrderSupplierList();
// 将现有供应商映射到ID字典中便于查找
Map<Long, OrderSupplierDO> existingOrderSupplierMap = existingSuppliers.stream()
.collect(Collectors.toMap(OrderSupplierDO::getSupplierId, Function.identity()));
// 将更新后的供应商映射到ID字典中便于查找
Map<Long, Long> existingSupplierMap = existingSuppliers.stream().collect(Collectors.toMap(OrderSupplierDO::getSupplierId, OrderSupplierDO::getOrderSupplierId));
// 收集需要更新和新增的供应商
List<OrderSupplierDO> suppliersToInsert = new ArrayList<>();
List<OrderSupplierDO> suppliersToUpdate = new ArrayList<>();
for (OrderSupplier updatedSupplier : updatedSuppliers) {
// 检查供应商ID是否为空如果为空则创建新的供应商
if (Objects.isNull(updatedSupplier.getSupplierId())) {
SupplierDO supplierDO1 = supplierConvert.toSupplierDO(updatedSupplier);
supplierDO1.setStatus(Boolean.TRUE);
supplierDO1.setCreatedBy(purchaseOrderStep2Cmd.getCreatedBy());
supplierDO1.setCreatedByName(purchaseOrderStep2Cmd.getCreatedByName());
supplierMapper.insert(supplierDO1);
updatedSupplier.setSupplierId(supplierDO1.getSupplierId());
}
updatedSupplier.setOrderId(orderId);
OrderSupplierDO orderSupplierDO = orderSupplierConvert.toOrderSupplierDO(updatedSupplier);
if (updatedSupplier.getSupplierId() != null && existingOrderSupplierMap.containsKey(updatedSupplier.getSupplierId())) {
// 更新已存在的供应商
orderSupplierDO.setSupplierId(updatedSupplier.getSupplierId());
Long orderSupplierId = existingSupplierMap.get(updatedSupplier.getSupplierId());
orderSupplierDO.setOrderSupplierId(orderSupplierId);
updatedSupplier.setOrderSupplierId(orderSupplierId);
suppliersToUpdate.add(orderSupplierDO);
// 从现有映射中移除剩下的就是需要删除的
existingOrderSupplierMap.remove(updatedSupplier.getSupplierId());
} else {
// 新增供应商
suppliersToInsert.add(orderSupplierDO);
updatedSupplier.setOrderSupplierId(orderSupplierDO.getOrderSupplierId());
}
}
// 删除不再需要的供应商
existingOrderSupplierMap.values().forEach(supplier -> supplier.deleteById());
// 执行更新操作
suppliersToUpdate.forEach(orderSupplierMapper::updateById);
// 执行插入操作
suppliersToInsert.forEach(orderSupplierMapper::insert);
// 第三步处理包材
if (purchaseOrderStep2Cmd.getActive() == 4) {
// 处理包材信息对更新和新增的供应商
List<OrderSupplierDO> allAffectedSuppliers = new ArrayList<>();
allAffectedSuppliers.addAll(suppliersToUpdate);
allAffectedSuppliers.addAll(suppliersToInsert);
for (OrderSupplierDO supplierDO : allAffectedSuppliers) {
// 查找对应的更新数据
OrderSupplier updatedSupplier = updatedSuppliers.stream()
.filter(s -> (s.getOrderSupplierId() != null && s.getOrderSupplierId().equals(supplierDO.getOrderSupplierId()))
|| (s.getOrderSupplierId() == null && supplierDO.getOrderSupplierId() != null
&& s.getSupplierId().equals(supplierDO.getSupplierId())))
.findFirst()
.orElse(null);
if (updatedSupplier != null && updatedSupplier.getOrderPackageList() != null && !updatedSupplier.getOrderPackageList().isEmpty()) {
// 获取现有的包材信息
LambdaQueryWrapper<OrderPackageDO> packageQueryWrapper = Wrappers.lambdaQuery(OrderPackageDO.class);
packageQueryWrapper.eq(OrderPackageDO::getOrderSupplierId, supplierDO.getOrderSupplierId());
List<OrderPackageDO> existingPackages = orderPackageMapper.selectList(packageQueryWrapper);
// 将现有包材映射到ID字典中便于查找
Map<Long, OrderPackageDO> existingPackageMap = existingPackages.stream()
.collect(Collectors.toMap(OrderPackageDO::getOrderPackageId, Function.identity()));
// 收集需要更新和新增的包材
List<OrderPackageDO> packagesToInsert = new ArrayList<>();
List<OrderPackageDO> packagesToUpdate = new ArrayList<>();
for (OrderPackage orderPackage : updatedSupplier.getOrderPackageList()) {
orderPackage.setOrderSupplierId(supplierDO.getOrderSupplierId());
OrderPackageDO orderPackageDO = orderPackageConvert.toOrderPackageDO(orderPackage);
if (orderPackage.getOrderPackageId() != null && existingPackageMap.containsKey(orderPackage.getOrderPackageId())) {
// 更新已存在的包材
orderPackageDO.setOrderPackageId(orderPackage.getOrderPackageId());
packagesToUpdate.add(orderPackageDO);
// 从现有映射中移除剩下的就是需要删除的
existingPackageMap.remove(orderPackage.getOrderPackageId());
} else {
// 新增包材
packagesToInsert.add(orderPackageDO);
}
}
// 删除不再需要的包材
existingPackageMap.values().forEach(packageDO -> packageDO.deleteById());
// 执行更新操作
packagesToUpdate.forEach(orderPackageMapper::updateById);
// 执行插入操作
packagesToInsert.forEach(orderPackageMapper::insert);
} else if (updatedSupplier != null) {
// 如果更新的数据中包材列表为空则删除所有包材信息
LambdaQueryWrapper<OrderPackageDO> packageDeleteWrapper = Wrappers.lambdaQuery(OrderPackageDO.class);
packageDeleteWrapper.eq(OrderPackageDO::getOrderSupplierId, supplierDO.getOrderSupplierId());
orderPackageMapper.delete(packageDeleteWrapper);
}
}
}
}
@Override
@Transactional
public void saveStep3(PurchaseOrderStep3Cmd purchaseOrderStep3Cmd) {
Long orderId = purchaseOrderStep3Cmd.getOrderId();
// 否则更新现有订单
LambdaQueryWrapper<PurchaseOrderDO> queryWrapper = Wrappers.lambdaQuery(PurchaseOrderDO.class);
queryWrapper.eq(PurchaseOrderDO::getOrderId, orderId);
queryWrapper.select(PurchaseOrderDO::getOrderId, PurchaseOrderDO::getActive);
queryWrapper.last("limit 1");
PurchaseOrderDO purchaseOrderDO = purchaseOrderMapper.selectOne(queryWrapper);
purchaseOrderDO.setActive(purchaseOrderStep3Cmd.getActive());
purchaseOrderMapper.updateById(purchaseOrderDO);
// 更新费用信息精细化处理
// 获取现有的费用列表
LambdaQueryWrapper<OrderCostDO> costQueryWrapper = Wrappers.lambdaQuery(OrderCostDO.class);
costQueryWrapper.eq(OrderCostDO::getOrderId, orderId);
List<OrderCostDO> existingCosts = orderCostMapper.selectList(costQueryWrapper);
// 获取更新的费用列表
List<OrderCost> updatedCosts = purchaseOrderStep3Cmd.getOrderCostList();
// 将现有费用映射到ID字典中便于查找
Map<Long, OrderCostDO> existingCostMap = existingCosts.stream()
.collect(Collectors.toMap(OrderCostDO::getOrderCostId, Function.identity()));
// 收集需要更新和新增的费用
List<OrderCostDO> costsToInsert = new ArrayList<>();
List<OrderCostDO> costsToUpdate = new ArrayList<>();
for (OrderCost updatedCost : updatedCosts) {
updatedCost.setOrderId(orderId);
OrderCostDO costDO = orderCostConvert.toOrderCostDO(updatedCost);
if (updatedCost.getOrderCostId() != null && existingCostMap.containsKey(updatedCost.getOrderCostId())) {
// 更新已存在的费用
costDO.setOrderCostId(updatedCost.getOrderCostId());
costsToUpdate.add(costDO);
// 从现有映射中移除剩下的就是需要删除的
existingCostMap.remove(updatedCost.getOrderCostId());
} else {
// 新增费用
costsToInsert.add(costDO);
}
}
// 删除不再需要的费用
existingCostMap.values().forEach(cost -> cost.deleteById());
// 执行更新操作
costsToUpdate.forEach(orderCostMapper::updateById);
// 执行插入操作
costsToInsert.forEach(orderCostMapper::insert);
}
}

View File

@ -1,5 +1,7 @@
package com.xunhong.erp.turbo.biz.infrastructure.gateway;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
@ -16,9 +18,7 @@ import com.xunhong.erp.turbo.api.biz.dto.qry.ShipOrderShowQry;
import com.xunhong.erp.turbo.biz.domain.entity.ShipOrder;
import com.xunhong.erp.turbo.biz.domain.gateway.ShipOrderGateway;
import com.xunhong.erp.turbo.biz.infrastructure.convert.ShipOrderConvert;
import com.xunhong.erp.turbo.biz.infrastructure.entity.ShipOrderDO;
import com.xunhong.erp.turbo.biz.infrastructure.entity.ShipOrderItemDO;
import com.xunhong.erp.turbo.biz.infrastructure.entity.ShipOrderPackageDO;
import com.xunhong.erp.turbo.biz.infrastructure.entity.*;
import com.xunhong.erp.turbo.biz.infrastructure.mapper.ShipOrderItemMapper;
import com.xunhong.erp.turbo.biz.infrastructure.mapper.ShipOrderMapper;
import com.xunhong.erp.turbo.biz.infrastructure.mapper.ShipOrderPackageMapper;
@ -51,6 +51,12 @@ public class ShipOrderGatewayImpl implements ShipOrderGateway {
@Override
public IPage<ShipOrder> page(ShipOrderPageQry shipOrderPageQry) {
LambdaQueryWrapper<ShipOrderDO> queryWrapper = Wrappers.lambdaQuery(ShipOrderDO.class);
queryWrapper.like(StrUtil.isNotBlank(shipOrderPageQry.getOrderSn()), ShipOrderDO::getOrderSn, shipOrderPageQry.getOrderSn());
queryWrapper.eq(Objects.nonNull(shipOrderPageQry.getState()), ShipOrderDO::getState, shipOrderPageQry.getState());
queryWrapper.eq(Objects.nonNull(shipOrderPageQry.getCreatedBy()), ShipOrderDO::getCreatedBy, shipOrderPageQry.getCreatedBy());
queryWrapper.like(StrUtil.isNotBlank(shipOrderPageQry.getVehicleNo()), ShipOrderDO::getVehicleNo, shipOrderPageQry.getVehicleNo());
queryWrapper.eq(Objects.nonNull(shipOrderPageQry.getDealerId()), ShipOrderDO::getDealerId, shipOrderPageQry.getDealerId());
queryWrapper.orderByDesc(ShipOrderDO::getCreatedAt);
IPage<ShipOrderDO> page = new Page<>(shipOrderPageQry.getPageIndex(), shipOrderPageQry.getPageSize());

View File

@ -16,20 +16,10 @@
<result property="strawMatCostFlag" column="straw_mat_cost_flag"/>
<result property="includePackingFlag" column="include_packing_flag"/>
<result property="documentTypes" column="document_types"/>
<result property="accountId" column="account_id"/>
<result property="companyName" column="company_name"/>
<result property="taxNumber" column="tax_number"/>
<result property="bankAccount" column="bank_account"/>
<result property="companyAddress" column="company_address"/>
<result property="phone" column="phone"/>
<result property="openingBank" column="opening_bank"/>
<result property="warehouseId" column="warehouse_id"/>
<result property="warehouseName" column="warehouse_name"/>
<result property="warehouseAddress" column="warehouse_address"/>
<result property="contactPerson" column="contact_person"/>
<result property="contactPhone" column="contact_phone"/>
<result property="receiverName" column="receiver_name"/>
<result property="receiverPhone" column="receiver_phone"/>
<result property="taxSubsidy" column="tax_subsidy"/>
<result property="taxProvision" column="tax_provision"/>
<result property="costDifference" column="cost_difference"/>
<result property="profitSharing" column="profit_sharing"/>
<result property="createdAt" column="created_at"/>
<result property="createdAt" column="created_at"/>
<result property="updatedAt" column="updated_at"/>
@ -37,4 +27,3 @@
<result property="version" column="version"/>
</resultMap>
</mapper>

View File

@ -9,6 +9,7 @@
<result property="orderSupplierId" column="order_supplier_id"/>
<result property="boxBrandId" column="box_brand_id"/>
<result property="boxBrandName" column="box_brand_name"/>
<result property="boxBrandImage" column="box_brand_image"/>
<result property="boxCategoryId" column="box_category_id"/>
<result property="boxProductId" column="box_product_id"/>
<result property="boxProductName" column="box_product_name"/>
@ -24,4 +25,3 @@
<result property="version" column="version"/>
</resultMap>
</mapper>

View File

@ -12,6 +12,8 @@
<result property="dealerName" column="dealer_name"/>
<result property="warehouseId" column="warehouse_id"/>
<result property="warehouseName" column="warehouse_name"/>
<result property="companyId" column="company_id"/>
<result property="companyName" column="company_name"/>
<result property="vehicleNo" column="vehicle_no"/>
<result property="shippingAddress" column="shipping_address"/>
<result property="receivingAddress" column="receiving_address"/>
@ -45,4 +47,3 @@
<result property="version" column="version"/>
</resultMap>
</mapper>

View File

@ -13,6 +13,8 @@
<result property="wechatQr" column="wechat_qr"/>
<result property="remark" column="remark"/>
<result property="status" column="status"/>
<result property="createdBy" column="created_by"/>
<result property="createdByName" column="created_by_name"/>
<result property="createdAt" column="created_at"/>
<result property="createdAt" column="created_at"/>
<result property="updatedAt" column="updated_at"/>

View File

@ -39,5 +39,9 @@ public interface PurchaseOrderServiceI {
void rejectFinal(PurchaseOrderRejectFinalCmd purchaseOrderRejectFinalCmd);
Long countPurchaseOrderByState(PurchaseOrderCountQry purchaseOrderCountQry);
}
// 分步提交方法
PurchaseOrderVO saveStep1(PurchaseOrderStep1Cmd purchaseOrderStep1Cmd);
void saveStep2(PurchaseOrderStep2Cmd purchaseOrderStep2Cmd);
void saveStep3(PurchaseOrderStep3Cmd purchaseOrderStep3Cmd);
}

View File

@ -18,6 +18,11 @@ import java.util.List;
@Schema(title = "采购订单创建")
@EqualsAndHashCode(callSuper = true)
public class PurchaseOrderCreateCmd extends Command {
/**
* 订单ID更新时使用
*/
@Schema(title = "采购订单ID", type = "string")
private Long orderId;
/**
* 步骤标识

View File

@ -0,0 +1,41 @@
package com.xunhong.erp.turbo.api.biz.dto.cmd;
import com.xunhong.erp.turbo.api.biz.dto.common.OrderDealer;
import com.xunhong.erp.turbo.api.biz.dto.common.OrderVehicle;
import com.xunhong.erp.turbo.base.dto.Command;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;
/**
* @author shenyifei
*/
@Data
@Schema(title = "采购订单第一步:车辆信息和经销商信息保存")
@EqualsAndHashCode(callSuper = true)
public class PurchaseOrderStep1Cmd extends Command {
/**
* 订单ID更新时使用
*/
@Schema(title = "采购订单ID", type = "string")
private Long orderId;
/**
* 步骤标识
*/
@Schema(title = "步骤标识")
private Integer active;
/**
* 车辆信息
*/
@Schema(title = "车辆信息", requiredMode = Schema.RequiredMode.REQUIRED)
private OrderVehicle orderVehicle;
/**
* 经销商信息
*/
@Schema(title = "经销商信息", requiredMode = Schema.RequiredMode.REQUIRED)
private OrderDealer orderDealer;
}

View File

@ -0,0 +1,36 @@
package com.xunhong.erp.turbo.api.biz.dto.cmd;
import com.xunhong.erp.turbo.api.biz.dto.common.OrderSupplier;
import com.xunhong.erp.turbo.base.dto.Command;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.util.List;
/**
* @author shenyifei
*/
@Data
@Schema(title = "采购订单第二步:供应商信息保存")
@EqualsAndHashCode(callSuper = true)
public class PurchaseOrderStep2Cmd extends Command {
/**
* 订单ID
*/
@Schema(title = "采购订单ID", requiredMode = Schema.RequiredMode.REQUIRED, type = "string")
private Long orderId;
/**
* 步骤标识
*/
@Schema(title = "步骤标识")
private Integer active;
/**
* 供应商信息
*/
@Schema(title = "供应商信息", requiredMode = Schema.RequiredMode.REQUIRED)
private List<OrderSupplier> orderSupplierList;
}

View File

@ -0,0 +1,36 @@
package com.xunhong.erp.turbo.api.biz.dto.cmd;
import com.xunhong.erp.turbo.api.biz.dto.common.OrderCost;
import com.xunhong.erp.turbo.base.dto.Command;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.util.List;
/**
* @author shenyifei
*/
@Data
@Schema(title = "采购订单第三步:人工和辅料等费用信息保存")
@EqualsAndHashCode(callSuper = true)
public class PurchaseOrderStep3Cmd extends Command {
/**
* 订单ID
*/
@Schema(title = "采购订单ID", requiredMode = Schema.RequiredMode.REQUIRED, type = "string")
private Long orderId;
/**
* 步骤标识
*/
@Schema(title = "步骤标识")
private Integer active;
/**
* 费用信息
*/
@Schema(title = "采购订单费用信息", requiredMode = Schema.RequiredMode.REQUIRED)
private List<OrderCost> orderCostList;
}

View File

@ -136,6 +136,18 @@ public class ShipOrderCreateCmd extends Command {
@Schema(title = "瓜农姓名逗号隔开")
private String farmerInfo;
/**
* 公司ID
*/
@Schema(title = "公司ID", type = "string")
private Long companyId;
/**
* 公司名称
*/
@Schema(title = "公司名称")
private String companyName;
/**
* 备注
*/
@ -155,4 +167,3 @@ public class ShipOrderCreateCmd extends Command {
private String createdByName;
}

View File

@ -38,6 +38,18 @@ public class ShipOrderUpdateCmd extends Command {
@Schema(title = "发货地址")
private String shippingAddress;
/**
* 公司ID
*/
@Schema(title = "公司ID", type = "string")
private Long companyId;
/**
* 公司名称
*/
@Schema(title = "公司名称")
private String companyName;
/**
* 备注
*/
@ -68,4 +80,3 @@ public class ShipOrderUpdateCmd extends Command {
@Schema(title = "成本单据")
private String costDocument;
}

View File

@ -83,89 +83,26 @@ public class OrderDealer extends Command {
private String documentTypes;
/**
* 账户ID
* 税费补贴
*/
@Schema(title = "账户ID", type = "string")
private Long accountId;
@Schema(title = "税费补贴")
private BigDecimal taxSubsidy;
/**
* 公司名称
* 计提税金
*/
@Schema(title = "公司名称")
private String companyName;
@Schema(title = "计提税金")
private BigDecimal taxProvision;
/**
* 税号
* 成本差异
*/
@Schema(title = "税号")
private String taxNumber;
@Schema(title = "成本差异")
private BigDecimal costDifference;
/**
* 银行账号
* 利润分成
*/
@Schema(title = "银行账号")
private String bankAccount;
/**
* 单位地址
*/
@Schema(title = "单位地址")
private String companyAddress;
/**
* 电话
*/
@Schema(title = "电话")
private String phone;
/**
* 开户行
*/
@Schema(title = "开户行")
private String openingBank;
/**
* 仓库ID
*/
@Schema(title = "仓库ID", type = "string")
private Long warehouseId;
/**
* 仓库名称
*/
@Schema(title = "仓库名称")
private String warehouseName;
/**
* 仓库地址
*/
@Schema(title = "仓库地址")
private String warehouseAddress;
/**
* 联系人
*/
@Schema(title = "联系人")
private String contactPerson;
/**
* 联系电话
*/
@Schema(title = "联系电话")
private String contactPhone;
/**
* 收货人姓名
*/
@Schema(title = "收货人姓名")
private String receiverName;
/**
* 收货人电话
*/
@Schema(title = "收货人电话")
private String receiverPhone;
@Schema(title = "利润分成")
private BigDecimal profitSharing;
}

View File

@ -40,6 +40,12 @@ public class OrderPackage extends Command {
@Schema(title = "箱子品牌名称", requiredMode = Schema.RequiredMode.REQUIRED)
private String boxBrandName;
/**
* 箱子品牌图片
*/
@Schema(title = "箱子品牌图片")
private String boxBrandImage;
/**
* 箱子分类ID
*/
@ -89,4 +95,3 @@ public class OrderPackage extends Command {
private OrderPackageBoxTypeEnum boxType;
}

View File

@ -15,25 +15,25 @@ public class OrderRebate extends DTO {
/**
* 记录ID
*/
@Schema(title = "记录ID")
@Schema(title = "记录ID", type = "string")
private Long orderRebateId;
/**
* 订单ID
*/
@Schema(title = "订单ID")
@Schema(title = "订单ID", type = "string")
private Long orderId;
/**
* 客户ID
*/
@Schema(title = "客户ID")
@Schema(title = "客户ID", type = "string")
private Long customerId;
/**
* 经销商ID
*/
@Schema(title = "经销商ID")
@Schema(title = "经销商ID", type = "string")
private Long dealerId;
/**

View File

@ -70,6 +70,12 @@ public class ShipOrderPackage extends DTO {
@Schema(title = "总重(斤)")
private BigDecimal totalWeight;
/**
* 箱子品牌图片
*/
@Schema(title = "箱子品牌图片")
private String boxBrandImage;
/**
* 创建时间
*/
@ -77,4 +83,3 @@ public class ShipOrderPackage extends DTO {
private LocalDateTime createdAt;
}

View File

@ -8,12 +8,13 @@ import lombok.RequiredArgsConstructor;
@RequiredArgsConstructor
public enum OrderPackageBoxTypeEnum {
/**
* 箱子类型:1_本次使用2_额外运输3_已使用额外运输4_车上剩余
* 箱子类型:1_本次使用2_额外运输3_已使用额外运输4_车上剩余5_瓜农纸箱
*/
USED(1, "本次使用"),
EXTRA(2, "额外运输"),
EXTRA_USED(3, "已使用额外运输"),
REMAIN(4, "车上剩余");
REMAIN(4, "车上剩余"),
OWN(5, "瓜农纸箱");
@EnumValue
private final int type;

View File

@ -10,7 +10,7 @@ public enum OrderRebateCalcMethodEnum {
/**
* 返点计算方式1_按净重计算2_固定金额
*/
BY_WEIGHT(1, "按净重计算"),
NET_WEIGHT(1, "按净重计算"),
FIXED_AMOUNT(2, "固定金额");
@EnumValue

View File

@ -32,16 +32,7 @@ public class PurchaseOrderPageQry extends PageQuery {
@Schema(title = "供应商名称", type = "string")
private String supplierName;
@Schema(title = "经销商付款账户ID", type = "string")
private Long dealerPaymentAccountId;
@Schema(title = "经销商ID", type = "string")
private Long dealerId;
/**
* 创建人ID
*/
@Schema(title = "创建人ID", type = "string")
private Long createdBy;
}

View File

@ -1,5 +1,6 @@
package com.xunhong.erp.turbo.api.biz.dto.qry;
import com.xunhong.erp.turbo.api.biz.dto.enums.ShipOrderStateEnum;
import com.xunhong.erp.turbo.base.dto.PageQuery;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
@ -15,5 +16,22 @@ public class ShipOrderPageQry extends PageQuery {
@Schema(title = "发货单ID", type = "string")
private Long shipOrderId;
@Schema(title = "车辆编号", type = "string")
private String vehicleNo;
@Schema(title = "采购订单编号", type = "string")
private String orderSn;
/**
* 发货单状态1_待回款2_部分回款3_已回款4_拒收完结5_已完结
*/
@Schema(title = "发货单状态1_待回款2_部分回款3_已回款4_拒收完结5_已完结")
private ShipOrderStateEnum state;
@Schema(title = "供应商名称", type = "string")
private String supplierName;
@Schema(title = "经销商ID", type = "string")
private Long dealerId;
}

View File

@ -65,6 +65,18 @@ public class ShipOrderVO extends DTO {
@Schema(title = "仓库名称")
private String warehouseName;
/**
* 公司ID
*/
@Schema(title = "公司ID", type = "string")
private Long companyId;
/**
* 公司名称
*/
@Schema(title = "公司名称")
private String companyName;
/**
* 车次号
*/
@ -240,4 +252,3 @@ public class ShipOrderVO extends DTO {
}

View File

@ -63,6 +63,18 @@ public class SupplierVO extends DTO {
@Schema(title = "状态1_启用0_禁用", requiredMode = Schema.RequiredMode.REQUIRED)
private Boolean status;
/**
* 创建人ID
*/
@Schema(title = "创建人ID", type = "string", requiredMode = Schema.RequiredMode.REQUIRED)
private Long createdBy;
/**
* 创建人姓名
*/
@Schema(title = "创建人姓名")
private String createdByName;
/**
* 创建时间
*/

View File

@ -25,4 +25,16 @@ public class PageQuery extends com.alibaba.cola.dto.PageQuery {
*/
@Schema(title = "状态1_启用0_禁用")
private Boolean status;
/**
* 创建人ID
*/
@Schema(title = "创建人ID", type = "string", hidden = true)
private Long createdBy;
/**
* 创建人名称
*/
@Schema(title = "创建人名称", type = "string", hidden = true)
private String createdByName;
}