feat(order): 添加发货单类型字段并优化相关实体和映射

- 新增 OrderShipTypeEnum 枚举定义发货单类型:采购发货、调货发货、改签发货、退货发货
- 在 OrderShip、OrderShipVO、OrderShipPageQry 等 DTO 中添加 type 字段
- 将 OrderShipItem 的 itemId 字段重命名为 orderShipItemId 并更新相关映射
- 修改 OrderShipDO 实体将 orderVehicleDO 替换为 orderDO 并更新映射关系
- 更新 OrderShipAssembler 和 OrderShipConvert 中的映射配置
- 修复 OrderGatewayImpl 中的发货单编号前缀从 SO 改为 FH
- 修正 OrderShipItemDO 的主键字段名称和相关查询逻辑
- 更新数据库表名 order 为 `order` 以避免关键字冲突
- 修改 OrderShipMapper.xml 和 OrderShipItemMapper.xml 中的字段映射
- 优化 OrderShipGatewayImpl 中的分页查询逻辑,使用订单信息替代车辆信息
This commit is contained in:
shenyifei 2025-12-24 11:34:55 +08:00
parent 13e3cfb19f
commit 3824c80899
21 changed files with 101 additions and 43 deletions

View File

@ -3,13 +3,16 @@ package com.xunhong.erp.turbo.biz.app.assembler;
import com.xunhong.erp.turbo.api.biz.dto.vo.OrderShipVO;
import com.xunhong.erp.turbo.biz.domain.entity.OrderShip;
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.NullValueCheckStrategy;
/**
* @author shenyifei
*/
@Mapper(componentModel = "spring", nullValueCheckStrategy = NullValueCheckStrategy.ALWAYS)
@Mapper(componentModel = "spring", nullValueCheckStrategy = NullValueCheckStrategy.ALWAYS, uses = {OrderAssembler.class})
public interface OrderShipAssembler {
@Mapping(target = "farmerInfo", ignore = true)
@Mapping(target = "orderVO", source = "order")
OrderShipVO toOrderShipVO(OrderShip orderShip);
}

View File

@ -4,8 +4,8 @@ import com.alibaba.cola.domain.Entity;
import com.alibaba.cola.dto.DTO;
import com.xunhong.erp.turbo.api.biz.dto.common.OrderCost;
import com.xunhong.erp.turbo.api.biz.dto.common.OrderShipItem;
import com.xunhong.erp.turbo.api.biz.dto.common.OrderVehicle;
import com.xunhong.erp.turbo.api.biz.dto.enums.OrderShipStateEnum;
import com.xunhong.erp.turbo.api.biz.dto.enums.OrderShipTypeEnum;
import lombok.Data;
import lombok.EqualsAndHashCode;
@ -106,6 +106,11 @@ public class OrderShip extends DTO {
*/
private OrderShipStateEnum state;
/**
* 发货单类型1_采购发货2_调货发货3_改签发货4_退货发货
*/
private OrderShipTypeEnum type;
/**
* 备注
*/
@ -139,5 +144,5 @@ public class OrderShip extends DTO {
/**
* 订单运输表
*/
private OrderVehicle orderVehicle;
private Order order;
}

View File

@ -19,7 +19,7 @@ import java.util.List;
/**
* @author shenyifei
*/
@Mapper(componentModel = "spring", nullValueCheckStrategy = NullValueCheckStrategy.ALWAYS, uses = {OrderVehicleConvert.class, OrderCostConvert.class, OrderPackageConvert.class, OrderDealerConvert.class, OrderRebateConvert.class, OrderCompanyConvert.class, OrderPackageConvert.class, OrderShipItemConvert.class, OrderShipConvert.class})
@Mapper(componentModel = "spring", nullValueCheckStrategy = NullValueCheckStrategy.ALWAYS, uses = {OrderVehicleConvert.class, OrderCostConvert.class, OrderPackageConvert.class, OrderDealerConvert.class, OrderRebateConvert.class, OrderCompanyConvert.class, OrderPackageConvert.class, OrderShipItemConvert.class})
public interface OrderConvert {
@Mapping(target = "orderShipList", source = "orderShipDOList")

View File

@ -14,20 +14,21 @@ import org.mapstruct.NullValueCheckStrategy;
/**
* @author shenyifei
*/
@Mapper(componentModel = "spring", nullValueCheckStrategy = NullValueCheckStrategy.ALWAYS)
@Mapper(componentModel = "spring", nullValueCheckStrategy = NullValueCheckStrategy.ALWAYS, uses = {OrderConvert.class})
public interface OrderShipConvert {
@Mapping(target = "picUrl", source = "file.picUrl")
@Mapping(target = "pdfUrl", source = "file.pdfUrl")
@Mapping(target = "orderVehicle", source = "orderVehicleDO")
@Mapping(target = "order", source = "orderDO")
@Mapping(target = "orderCostList", source = "orderCostDOList")
@Mapping(target = "orderShipItemList", source = "orderShipItemDOList")
com.xunhong.erp.turbo.biz.domain.entity.OrderShip toOrderShip(OrderShipDO orderShipDO);
@Mapping(target = "type", ignore = true)
@Mapping(target = "file", ignore = true)
@Mapping(target = "dealerName", ignore = true)
@Mapping(target = "dealerId", ignore = true)
@Mapping(target = "orderVehicleDO", ignore = true)
@Mapping(target = "orderDO", ignore = true)
@Mapping(target = "orderCostDOList", ignore = true)
@Mapping(target = "warehouseName", ignore = true)
@Mapping(target = "warehouseId", ignore = true)
@ -39,10 +40,11 @@ public interface OrderShipConvert {
@Mapping(target = "createdAt", ignore = true)
OrderShipDO toOrderShipDO(OrderShipCreateCmd orderShipCreateCmd);
@Mapping(target = "type", ignore = true)
@Mapping(target = "file", ignore = true)
@Mapping(target = "dealerName", ignore = true)
@Mapping(target = "dealerId", ignore = true)
@Mapping(target = "orderVehicleDO", ignore = true)
@Mapping(target = "orderDO", ignore = true)
@Mapping(target = "orderId", ignore = true)
@Mapping(target = "orderCostDOList", ignore = true)
@Mapping(target = "warehouseName", ignore = true)
@ -59,10 +61,11 @@ public interface OrderShipConvert {
@Mapping(target = "createdAt", ignore = true)
void toOrderShipDO(@MappingTarget OrderShipDO orderShipDO, OrderShipUpdateCmd orderShipUpdateCmd);
@Mapping(target = "type", ignore = true)
@Mapping(target = "file", expression = "java(this.toOrderShipFileDO(orderShipGenerateDocumentCmd))")
@Mapping(target = "dealerName", ignore = true)
@Mapping(target = "dealerId", ignore = true)
@Mapping(target = "orderVehicleDO", ignore = true)
@Mapping(target = "orderDO", ignore = true)
@Mapping(target = "orderId", ignore = true)
@Mapping(target = "orderCostDOList", ignore = true)
@Mapping(target = "companyName", ignore = true)
@ -90,7 +93,7 @@ public interface OrderShipConvert {
}
@Mapping(target = "file", ignore = true)
@Mapping(target = "orderVehicleDO", ignore = true)
@Mapping(target = "orderDO", ignore = true)
@Mapping(target = "orderCostDOList", ignore = true)
@Mapping(target = "orderShipItemDOList", ignore = true)
@Mapping(target = "version", ignore = true)

View File

@ -19,11 +19,11 @@ public interface OrderShipItemConvert {
@Mapping(target = "createdAt", ignore = true)
OrderShipItemDO toOrderShipItemDO(OrderShipItem orderShipItem);
@Mapping(target = "itemId", ignore = true)
@Mapping(target = "orderShipItemId", ignore = true)
@Mapping(target = "orderShipId", ignore = true)
@Mapping(target = "version", ignore = true)
@Mapping(target = "updatedAt", ignore = true)
@Mapping(target = "isDelete", ignore = true)
@Mapping(target = "createdAt", ignore = true)
void toOrderShipItemDO(@MappingTarget OrderShipItemDO orderShipItemDO, OrderShipItem orderShipItem);
}
}

View File

@ -17,7 +17,7 @@ import java.time.LocalDateTime;
* @author shenyifei
*/
@Data
@TableName(value = "order_audit")
@TableName(value = "audit")
@EqualsAndHashCode(callSuper = true)
public class AuditDO extends BaseDO<AuditDO> {

View File

@ -18,7 +18,7 @@ import java.util.List;
* @author shenyifei
*/
@Data
@TableName(value = "order")
@TableName(value = "`order`")
@EqualsAndHashCode(callSuper = true)
public class OrderDO extends BaseDO<OrderDO> {

View File

@ -6,6 +6,7 @@ import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler;
import com.xunhong.erp.turbo.api.biz.dto.enums.OrderShipStateEnum;
import com.xunhong.erp.turbo.api.biz.dto.enums.OrderShipTypeEnum;
import com.xunhong.erp.turbo.datasource.domain.entity.BaseDO;
import lombok.Data;
import lombok.EqualsAndHashCode;
@ -118,6 +119,12 @@ public class OrderShipDO extends BaseDO<OrderShipDO> {
@TableField(value = "state")
private OrderShipStateEnum state;
/**
* 发货单类型1_采购发货2_调货发货3_改签发货4_退货发货
*/
@TableField(value = "type")
private OrderShipTypeEnum type;
/**
* 发货单文件
*/
@ -154,6 +161,6 @@ public class OrderShipDO extends BaseDO<OrderShipDO> {
private List<OrderCostDO> orderCostDOList;
@TableField(exist = false)
private OrderVehicleDO orderVehicleDO;
private OrderDO orderDO;
}

View File

@ -21,8 +21,8 @@ public class OrderShipItemDO extends BaseDO<OrderShipItemDO> {
/**
* 发货单子项ID
*/
@TableId(value = "item_id", type = IdType.ASSIGN_ID)
private Long itemId;
@TableId(value = "order_ship_item_id", type = IdType.ASSIGN_ID)
private Long orderShipItemId;
/**
* 发货单ID

View File

@ -419,7 +419,7 @@ public class OrderGatewayImpl implements OrderGateway {
// 新增发货单
// 生成发货单编号
if (StrUtil.isBlank(orderShipDO.getOrderSn())) {
orderShipDO.setOrderSn("SO" + generateOrderShipSn());
orderShipDO.setOrderSn("FH" + generateOrderShipSn());
}
shipsToInsert.add(orderShipDO);
}
@ -482,8 +482,8 @@ public class OrderGatewayImpl implements OrderGateway {
// 将现有明细映射到 itemId 字典中便于查找
Map<Long, OrderShipItemDO> existingItemMap = existingItems.stream()
.filter(item -> item.getItemId() != null)
.collect(Collectors.toMap(OrderShipItemDO::getItemId, Function.identity()));
.filter(item -> item.getOrderShipItemId() != null)
.collect(Collectors.toMap(OrderShipItemDO::getOrderShipItemId, Function.identity()));
// 收集需要更新和新增的明细
List<OrderShipItemDO> itemsToInsert = new ArrayList<>();
@ -492,13 +492,13 @@ public class OrderGatewayImpl implements OrderGateway {
for (OrderShipItem updatedItem : orderShipItemList) {
OrderShipItemDO itemDO = orderShipItemConvert.toOrderShipItemDO(updatedItem);
if (existingItemMap.containsKey(updatedItem.getItemId())) {
if (existingItemMap.containsKey(updatedItem.getOrderShipItemId())) {
// 更新已存在的明细
itemDO.setItemId(updatedItem.getItemId());
itemDO.setOrderShipItemId(updatedItem.getOrderShipItemId());
itemDO.setOrderShipId(orderShipDO.getOrderShipId());
itemsToUpdate.add(itemDO);
// 从现有映射中移除剩下的就是需要删除的
existingItemMap.remove(updatedItem.getItemId());
existingItemMap.remove(updatedItem.getOrderShipItemId());
} else {
// 新增明细
itemDO.setOrderShipId(orderShipDO.getOrderShipId());

View File

@ -19,19 +19,17 @@ import com.xunhong.erp.turbo.biz.domain.entity.OrderShip;
import com.xunhong.erp.turbo.biz.domain.gateway.OrderShipGateway;
import com.xunhong.erp.turbo.biz.infrastructure.convert.OrderShipConvert;
import com.xunhong.erp.turbo.biz.infrastructure.entity.OrderCostDO;
import com.xunhong.erp.turbo.biz.infrastructure.entity.OrderDO;
import com.xunhong.erp.turbo.biz.infrastructure.entity.OrderShipDO;
import com.xunhong.erp.turbo.biz.infrastructure.entity.OrderShipItemDO;
import com.xunhong.erp.turbo.biz.infrastructure.entity.OrderVehicleDO;
import com.xunhong.erp.turbo.biz.infrastructure.mapper.OrderCostMapper;
import com.xunhong.erp.turbo.biz.infrastructure.mapper.OrderShipItemMapper;
import com.xunhong.erp.turbo.biz.infrastructure.mapper.OrderShipMapper;
import com.xunhong.erp.turbo.biz.infrastructure.mapper.OrderVehicleMapper;
import com.xunhong.erp.turbo.biz.infrastructure.mapper.*;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Repository;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.Set;
import java.util.function.Function;
import java.util.stream.Collectors;
@ -49,6 +47,7 @@ public class OrderShipGatewayImpl implements OrderShipGateway {
private final OrderCostMapper orderCostMapper;
private final OrderVehicleMapper orderVehicleMapper;
private final OrderMapper orderMapper;
@Override
public OrderShip save(OrderShipCreateCmd orderShipCreateCmd) {
@ -70,14 +69,12 @@ public class OrderShipGatewayImpl implements OrderShipGateway {
IPage<OrderShipDO> page = new Page<>(orderShipPageQry.getPageIndex(), orderShipPageQry.getPageSize());
page = orderShipMapper.selectPage(page, queryWrapper);
List<Long> orderIdList = page.getRecords().stream().map(OrderShipDO::getOrderId).toList();
Set<Long> orderIdList = page.getRecords().stream().map(OrderShipDO::getOrderId).collect(Collectors.toSet());
if (CollUtil.isNotEmpty(orderIdList)) {
LambdaQueryWrapper<OrderVehicleDO> queryWrapper1 = Wrappers.lambdaQuery(OrderVehicleDO.class);
queryWrapper1.in(OrderVehicleDO::getOrderId, orderIdList);
List<OrderVehicleDO> orderVehicleDOList = orderVehicleMapper.selectList(queryWrapper1);
Map<Long, OrderVehicleDO> orderVehicleDOMap = orderVehicleDOList.stream().collect(Collectors.toMap(OrderVehicleDO::getOrderId, Function.identity()));
List<OrderDO> orderDOList = orderMapper.selectByOrderIdList(orderIdList);
Map<Long, OrderDO> orderDOMap = orderDOList.stream().collect(Collectors.toMap(OrderDO::getOrderId, Function.identity()));
page.getRecords().forEach(orderShipDO -> {
orderShipDO.setOrderVehicleDO(orderVehicleDOMap.get(orderShipDO.getOrderId()));
orderShipDO.setOrderDO(orderDOMap.get(orderShipDO.getOrderId()));
});
}

View File

@ -55,7 +55,7 @@
FROM order_cost oc
LEFT JOIN order_vehicle ov ON oc.order_id = ov.order_id AND ov.is_delete
= 0
LEFT JOIN order po ON oc.order_id = po.order_id AND
LEFT JOIN `order` po ON oc.order_id = po.order_id AND
po.is_delete = 0
<where>
oc.is_delete = 0
@ -95,7 +95,7 @@
ov.dealer_name
FROM order_cost oc
LEFT JOIN order_vehicle ov ON oc.order_id = ov.order_id AND ov.is_delete = 0
LEFT JOIN order po ON oc.order_id = po.order_id AND
LEFT JOIN `order` po ON oc.order_id = po.order_id AND
po.is_delete = 0
WHERE oc.order_id = #{orderId}
AND oc.name = #{name}

View File

@ -29,7 +29,7 @@
po.state as po_state
FROM order_rebate ore
LEFT JOIN order_vehicle ov ON ore.order_id = ov.order_id AND ov.is_delete = 0
LEFT JOIN order po ON ore.order_id = po.order_id AND po.is_delete = 0
LEFT JOIN `order` po ON ore.order_id = po.order_id AND po.is_delete = 0
<where>
ore.is_delete = 0
<if test="query.createdBy != null">

View File

@ -5,7 +5,7 @@
namespace="com.xunhong.erp.turbo.biz.infrastructure.mapper.OrderShipItemMapper">
<resultMap id="BaseResultMap"
type="com.xunhong.erp.turbo.biz.infrastructure.entity.OrderShipItemDO">
<result property="itemId" column="item_id"/>
<result property="orderShipItemId" column="order_ship_item_id"/>
<result property="orderId" column="order_id"/>
<result property="orderShipId" column="order_ship_id"/>
<result property="grossWeight" column="gross_weight"/>

View File

@ -22,6 +22,7 @@
<result property="file" column="file"
typeHandler="com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler"/>
<result property="state" column="state"/>
<result property="type" column="type"/>
<result property="remark" column="remark"/>
<result property="createdBy" column="created_by"/>
<result property="createdByName" column="created_by_name"/>

View File

@ -59,7 +59,7 @@
po.state as po_state
FROM order_supplier os
LEFT JOIN order_vehicle ov ON os.order_id = ov.order_id AND ov.is_delete = 0
LEFT JOIN order po ON os.order_id = po.order_id AND po.is_delete = 0
LEFT JOIN `order` po ON os.order_id = po.order_id AND po.is_delete = 0
<where>
os.is_delete = 0
<if test="query.deliveryTime != null and query.deliveryTime.size() == 2">

View File

@ -2,6 +2,7 @@ package com.xunhong.erp.turbo.api.biz.dto.common;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.xunhong.erp.turbo.api.biz.dto.enums.OrderShipStateEnum;
import com.xunhong.erp.turbo.api.biz.dto.enums.OrderShipTypeEnum;
import com.xunhong.erp.turbo.base.dto.Command;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
@ -119,6 +120,12 @@ public class OrderShip extends Command {
@Schema(title = "发货单状态0_草稿1_待发货2_待回款3_待改签4_部分回款5_已回款6_拒收完结7_已完结", requiredMode = Schema.RequiredMode.REQUIRED)
private OrderShipStateEnum state;
/**
* 发货单类型1_采购发货2_调货发货3_改签发货4_退货发货
*/
@Schema(title = "发货单类型1_采购发货2_调货发货3_改签发货4_退货发货")
private OrderShipTypeEnum type;
/**
* 备注
*/

View File

@ -20,7 +20,7 @@ public class OrderShipItem extends DTO {
* 发货单子项ID
*/
@Schema(title = "发货单子项ID", type = "string", requiredMode = Schema.RequiredMode.REQUIRED)
private Long itemId;
private Long orderShipItemId;
/**
* 发货单ID

View File

@ -0,0 +1,22 @@
package com.xunhong.erp.turbo.api.biz.dto.enums;
import com.baomidou.mybatisplus.annotation.EnumValue;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
@Getter
@RequiredArgsConstructor
public enum OrderShipTypeEnum {
/**
* 发货单类型1_采购发货2_调货发货3_改签发货4_退货发货
*/
PURCHASE_SHIP(1, "采购发货"),
TRANSFER_SHIP(2, "调货发货"),
CHANGE_SHIP(3, "改签发货"),
RETURN_SHIP(4, "退货发货");
@EnumValue
private final int type;
private final String message;
}

View File

@ -1,6 +1,7 @@
package com.xunhong.erp.turbo.api.biz.dto.qry;
import com.xunhong.erp.turbo.api.biz.dto.enums.OrderShipStateEnum;
import com.xunhong.erp.turbo.api.biz.dto.enums.OrderShipTypeEnum;
import com.xunhong.erp.turbo.base.dto.PageQuery;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
@ -28,6 +29,12 @@ public class OrderShipPageQry extends PageQuery {
@Schema(title = "发货单状态0_草稿1_待发货2_待回款3_待改签4_部分回款5_已回款6_拒收完结7_已完结")
private OrderShipStateEnum state;
/**
* 发货单类型1_采购发货2_调货发货3_改签发货4_退货发货
*/
@Schema(title = "发货单类型1_采购发货2_调货发货3_改签发货4_退货发货")
private OrderShipTypeEnum type;
@Schema(title = "供应商名称", type = "string")
private String supplierName;

View File

@ -4,8 +4,8 @@ import com.alibaba.cola.dto.DTO;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.xunhong.erp.turbo.api.biz.dto.common.OrderCost;
import com.xunhong.erp.turbo.api.biz.dto.common.OrderShipItem;
import com.xunhong.erp.turbo.api.biz.dto.common.OrderVehicle;
import com.xunhong.erp.turbo.api.biz.dto.enums.OrderShipStateEnum;
import com.xunhong.erp.turbo.api.biz.dto.enums.OrderShipTypeEnum;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;
@ -132,9 +132,15 @@ public class OrderShipVO extends DTO {
/**
* 发货单状态0_草稿1_待发货2_待回款3_待改签4_部分回款5_已回款6_拒收完结7_已完结
*/
@Schema(title = "发货单状态0_草稿1_待发货2_待回款3_待改签4_部分回款5_已回款6_拒收完结7_已完结")
@Schema(title = "发货单状态0_草稿1_待发货2_待回款3_待改签4_部分回款5_已回款6_拒收完结7_已完结", requiredMode = Schema.RequiredMode.REQUIRED)
private OrderShipStateEnum state;
/**
* 发货单类型1_采购发货2_调货发货3_改签发货4_退货发货
*/
@Schema(title = "发货单类型1_采购发货2_调货发货3_改签发货4_退货发货", requiredMode = Schema.RequiredMode.REQUIRED)
private OrderShipTypeEnum type;
/**
* 备注
*/
@ -176,6 +182,6 @@ public class OrderShipVO extends DTO {
* 采购订单车辆运输信息
*/
@Schema(title = "采购订单车辆运输信息")
private OrderVehicle orderVehicle;
private OrderVO orderVO;
}