Quellcode durchsuchen

Merge remote-tracking branch 'origin/dev' into dev

# Conflicts:
#	blade-service/blade-factory/src/main/java/org/springblade/factory/api/controller/SalesOrderController.java
bai vor 5 Tagen
Ursprung
Commit
6117135179
12 geänderte Dateien mit 534 neuen und 0 gelöschten Zeilen
  1. 4 0
      blade-service-api/blade-factory-api/src/main/java/org/springblade/factory/entity/PcBladeOrderInvoice.java
  2. 4 0
      blade-service-api/blade-factory-api/src/main/java/org/springblade/factory/entity/PcBladeOrderShipment.java
  3. 8 0
      blade-service-api/blade-factory-api/src/main/java/org/springblade/factory/entity/PcBladeShipmentTracking.java
  4. 6 0
      blade-service/blade-factory/src/main/java/org/springblade/factory/mapper/PcBladeOrderShipmentItemMapper.java
  5. 35 0
      blade-service/blade-factory/src/main/java/org/springblade/factory/service/PcBladeOrderInvoiceService.java
  6. 12 0
      blade-service/blade-factory/src/main/java/org/springblade/factory/service/PcBladeOrderShipmentItemService.java
  7. 33 0
      blade-service/blade-factory/src/main/java/org/springblade/factory/service/PcBladeOrderShipmentService.java
  8. 19 0
      blade-service/blade-factory/src/main/java/org/springblade/factory/service/PcBladeShipmentTrackingService.java
  9. 174 0
      blade-service/blade-factory/src/main/java/org/springblade/factory/service/impl/PcBladeOrderInvoiceServiceImpl.java
  10. 38 0
      blade-service/blade-factory/src/main/java/org/springblade/factory/service/impl/PcBladeOrderShipmentItemServiceImpl.java
  11. 173 0
      blade-service/blade-factory/src/main/java/org/springblade/factory/service/impl/PcBladeOrderShipmentServiceImpl.java
  12. 28 0
      blade-service/blade-factory/src/main/java/org/springblade/factory/service/impl/PcBladeShipmentTrackingServiceImpl.java

+ 4 - 0
blade-service-api/blade-factory-api/src/main/java/org/springblade/factory/entity/PcBladeOrderInvoice.java

@@ -8,6 +8,7 @@ import java.io.Serializable;
 import java.math.BigDecimal;
 import java.time.LocalDate;
 import java.time.LocalDateTime;
+import java.util.List;
 
 /**
  * 订单发票信息表
@@ -81,4 +82,7 @@ public class PcBladeOrderInvoice extends BaseEntity {
 	@TableField("invoice_date")
 	private LocalDate invoiceDate;
 
+	@TableField(exist = false)
+	private List<PcBladeOrderInvoiceItem> shipmentList;
+
 }

+ 4 - 0
blade-service-api/blade-factory-api/src/main/java/org/springblade/factory/entity/PcBladeOrderShipment.java

@@ -8,6 +8,7 @@ import java.io.Serializable;
 import java.math.BigDecimal;
 import java.time.LocalDate;
 import java.time.LocalDateTime;
+import java.util.List;
 
 /**
  * 订单发货单主表
@@ -77,4 +78,7 @@ public class PcBladeOrderShipment extends BaseEntity {
 	@TableField("shipper_name")
 	private String shipperName;
 
+	@TableField(exist = false)
+	private List<PcBladeOrderShipmentItem> pcBladeOrderShipmentItem;
+
 }

+ 8 - 0
blade-service-api/blade-factory-api/src/main/java/org/springblade/factory/entity/PcBladeShipmentTracking.java

@@ -23,6 +23,14 @@ public class PcBladeShipmentTracking extends BaseEntity {
 	@TableField("shipment_id")
 	private Long shipmentId;
 
+	/** 关联订单ID */
+	@TableField("pid")
+	private Long pid;
+
+	/** 关联发货单ID */
+	@TableField("cid")
+	private Long cid;
+
 	/** 发货单号 */
 	@TableField("shipment_no")
 	private String shipmentNo;

+ 6 - 0
blade-service/blade-factory/src/main/java/org/springblade/factory/mapper/PcBladeOrderShipmentItemMapper.java

@@ -2,8 +2,14 @@ package org.springblade.factory.mapper;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
 import org.springblade.factory.entity.PcBladeOrderShipmentItem;
 
+import java.util.List;
+
 @Mapper
 public interface PcBladeOrderShipmentItemMapper extends BaseMapper<PcBladeOrderShipmentItem> {
+
+
+
 }

+ 35 - 0
blade-service/blade-factory/src/main/java/org/springblade/factory/service/PcBladeOrderInvoiceService.java

@@ -3,6 +3,7 @@ package org.springblade.factory.service;
 import com.baomidou.mybatisplus.extension.service.IService;
 import org.springblade.core.mp.base.BaseService;
 import org.springblade.factory.entity.PcBladeOrderInvoice;
+import org.springblade.factory.entity.PcBladeOrderInvoiceItem;
 import org.springblade.factory.vo.PcBladeOrderInvoiceVO;
 
 import java.util.List;
@@ -20,4 +21,38 @@ public interface PcBladeOrderInvoiceService extends BaseService<PcBladeOrderInvo
 	public boolean updatePcBladeOrderInvoice(PcBladeOrderInvoice pcBladeOrderInvoice);
 
 
+	/**
+	 * 根据订单ID获取发票信息(包含明细)
+	 * @param orderId 订单ID
+	 * @return 发票VO对象
+	 */
+	PcBladeOrderInvoiceVO getByOrderId(Long orderId);
+
+	/**
+	 * 保存发票及明细信息
+	 * @param invoice 包含明细的发票对象
+	 * @return 是否保存成功
+	 */
+	boolean saveInvoiceWithItems(PcBladeOrderInvoice invoice);
+
+	/**
+	 * 更新发票及明细信息
+	 * @param invoice 包含明细的发票对象
+	 * @return 是否更新成功
+	 */
+	boolean updateInvoiceWithItems(PcBladeOrderInvoice invoice);
+
+	/**
+	 * 更新单条发票明细
+	 * @param item 发票明细对象
+	 * @return 是否更新成功
+	 */
+	boolean updateInvoiceItem(PcBladeOrderInvoiceItem item);
+
+	/**
+	 * 根据订单编号获取发票信息(包含明细)
+	 * @param orderCode 订单编号
+	 * @return 发票VO对象(包含明细)
+	 */
+	PcBladeOrderInvoiceVO getByOrderCode(String orderCode);
 }

+ 12 - 0
blade-service/blade-factory/src/main/java/org/springblade/factory/service/PcBladeOrderShipmentItemService.java

@@ -2,8 +2,11 @@ package org.springblade.factory.service;
 
 import com.baomidou.mybatisplus.extension.service.IService;
 import org.springblade.core.mp.base.BaseService;
+import org.springblade.core.secure.utils.AuthUtil;
 import org.springblade.factory.entity.PcBladeOrderShipmentItem;
+import org.springframework.transaction.annotation.Transactional;
 
+import java.util.Date;
 import java.util.List;
 
 public interface PcBladeOrderShipmentItemService extends BaseService<PcBladeOrderShipmentItem> {
@@ -36,4 +39,13 @@ public interface PcBladeOrderShipmentItemService extends BaseService<PcBladeOrde
 	 */
 	public boolean updatePcBladeOrderShipmentItem(PcBladeOrderShipmentItem pcBladeOrderShipmentItem);
 
+
+	/**
+	 * 根据ID修改发货单明细
+	 * @param item 包含更新信息的明细对象(必须包含ID)
+	 * @return 是否修改成功
+	 */
+	boolean updateShipmentItemById(PcBladeOrderShipmentItem item);
+
+
 }

+ 33 - 0
blade-service/blade-factory/src/main/java/org/springblade/factory/service/PcBladeOrderShipmentService.java

@@ -2,6 +2,8 @@ package org.springblade.factory.service;
 
 import org.springblade.core.mp.base.BaseService;
 import org.springblade.factory.entity.PcBladeOrderShipment;
+import org.springblade.factory.entity.PcBladeOrderShipmentItem;
+import org.springblade.factory.vo.PcBladeOrderShipmentVO;
 
 import java.util.List;
 
@@ -34,4 +36,35 @@ public interface PcBladeOrderShipmentService extends BaseService<PcBladeOrderShi
 	 * @return
 	 */
 	public boolean updatePcBladeOrderShipment(PcBladeOrderShipment pcBladeOrderShipment);
+
+
+	/**
+	 * 根据订单ID查询发货单
+	 * @param orderId 订单ID
+	 * @return 发货单VO列表
+	 */
+	List<PcBladeOrderShipmentVO> getByOrderId(Long orderId);
+
+	/**
+	 * 根据订单编号查询发货单
+	 * @param orderCode 订单编号
+	 * @return 发货单VO列表
+	 */
+	List<PcBladeOrderShipmentVO> getByOrderCode(String orderCode);
+
+	/**
+	 * 新增订单发货单及明细
+	 * @param pcBladeOrderShipment 包含明细的发货单对象
+	 * @return 是否成功
+	 */
+	boolean insertPcBladeOrderShipmentPro(PcBladeOrderShipment pcBladeOrderShipment);
+
+	/**
+	 * 修改订单发货单及明细
+	 * @param pcBladeOrderShipment 包含明细的发货单对象
+	 * @return 是否成功
+	 */
+	boolean updatePcBladeOrderShipmentPro(PcBladeOrderShipment pcBladeOrderShipment);
+
+
 }

+ 19 - 0
blade-service/blade-factory/src/main/java/org/springblade/factory/service/PcBladeShipmentTrackingService.java

@@ -34,4 +34,23 @@ public interface PcBladeShipmentTrackingService extends BaseService<PcBladeShipm
 	 * @return
 	 */
 	public boolean updatePcBladeShipmentTracking(PcBladeShipmentTracking pcBladeShipmentTracking);
+
+
+
+	/**
+	 * 根据 pid 获取数据列表
+	 * @param pid
+	 * @return
+	 */
+	public List<PcBladeShipmentTracking> selectPcBladeShipmentTrackingByPid(Long pid);
+
+
+	/**
+	 * 根据 cid 获取数据列表
+	 * @param cid
+	 * @return
+	 */
+	public List<PcBladeShipmentTracking> selectPcBladeShipmentTrackingByCid(Long cid);
+
+
 }

+ 174 - 0
blade-service/blade-factory/src/main/java/org/springblade/factory/service/impl/PcBladeOrderInvoiceServiceImpl.java

@@ -1,16 +1,23 @@
 package org.springblade.factory.service.impl;
 
+import com.alibaba.excel.util.CollectionUtils;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import lombok.AllArgsConstructor;
 import org.springblade.core.mp.base.BaseServiceImpl;
+import org.springblade.core.secure.utils.AuthUtil;
 import org.springblade.factory.entity.PcBladeOrder;
 import org.springblade.factory.entity.PcBladeOrderInvoice;
+import org.springblade.factory.entity.PcBladeOrderInvoiceItem;
+import org.springblade.factory.mapper.PcBladeOrderInvoiceItemMapper;
 import org.springblade.factory.mapper.PcBladeOrderInvoiceMapper;
 import org.springblade.factory.service.PcBladeOrderInvoiceService;
 import org.springblade.factory.vo.PcBladeOrderInvoiceVO;
+import org.springblade.factory.wrapper.PcBladeOrderInvoiceWrapper;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 
+import java.util.Date;
 import java.util.List;
 
 @Service
@@ -43,6 +50,173 @@ public class PcBladeOrderInvoiceServiceImpl
 	}
 
 
+	private final PcBladeOrderInvoiceItemMapper invoiceItemMapper;
 
+	/**
+	 * 根据订单ID获取发票信息(包含明细)
+	 */
+	@Override
+	public PcBladeOrderInvoiceVO getByOrderId(Long orderId) {
+		// 查询主表信息
+		QueryWrapper<PcBladeOrderInvoice> queryWrapper = new QueryWrapper<>();
+		queryWrapper.eq("order_id", orderId)
+			.eq("is_deleted", 0);
+		PcBladeOrderInvoice invoice = baseMapper.selectOne(queryWrapper);
+
+		if (invoice == null) {
+			return null;
+		}
+
+		// 查询关联的明细
+		QueryWrapper<PcBladeOrderInvoiceItem> itemQuery = new QueryWrapper<>();
+		itemQuery.eq("invoice_id", invoice.getId())
+			.eq("is_deleted", 0);
+		List<PcBladeOrderInvoiceItem> items = invoiceItemMapper.selectList(itemQuery);
+
+		// 设置明细并转换为VO
+		invoice.setShipmentList(items);
+		return PcBladeOrderInvoiceWrapper.build().entityVO(invoice);
+	}
+
+	/**
+	 * 保存发票及明细信息
+	 */
+	@Override
+	@Transactional(rollbackFor = Exception.class)
+	public boolean saveInvoiceWithItems(PcBladeOrderInvoice invoice) {
+		// 设置创建信息
+		Long userId = AuthUtil.getUserId();
+		invoice.setCreateUser(userId);
+		invoice.setCreateTime(new Date());
+		invoice.setUpdateUser(userId);
+		invoice.setUpdateTime(new Date());
+
+		// 保存主表
+		boolean mainSaved = save(invoice);
+		if (!mainSaved) {
+			return false;
+		}
+
+		// 处理明细
+		List<PcBladeOrderInvoiceItem> items = invoice.getShipmentList();
+		if (CollectionUtils.isEmpty(items)) {
+			return true;
+		}
+
+		// 为明细设置关联信息并保存
+		for (PcBladeOrderInvoiceItem item : items) {
+			item.setInvoiceId(invoice.getId());
+			item.setInvoiceNo(invoice.getInvoiceNo());
+			item.setOrderId(invoice.getOrderId());
+			item.setCreateUser(userId);
+			item.setCreateTime(new Date());
+			item.setUpdateUser(userId);
+			item.setUpdateTime(new Date());
+			invoiceItemMapper.insert(item);
+		}
+
+		return true;
+	}
+
+	/**
+	 * 更新发票及明细信息
+	 */
+	@Override
+	@Transactional(rollbackFor = Exception.class)
+	public boolean updateInvoiceWithItems(PcBladeOrderInvoice invoice) {
+		// 验证发票是否存在
+		PcBladeOrderInvoice existing = getById(invoice.getId());
+		if (existing == null) {
+			return false;
+		}
+
+		// 设置更新信息
+		Long userId = AuthUtil.getUserId();
+		invoice.setUpdateUser(userId);
+		invoice.setUpdateTime(new Date());
+
+		// 更新主表
+		boolean mainUpdated = updateById(invoice);
+		if (!mainUpdated) {
+			return false;
+		}
+
+		// 先删除原有明细
+		QueryWrapper<PcBladeOrderInvoiceItem> deleteWrapper = new QueryWrapper<>();
+		deleteWrapper.eq("invoice_id", invoice.getId());
+		invoiceItemMapper.delete(deleteWrapper);
+
+		// 处理新的明细
+		List<PcBladeOrderInvoiceItem> items = invoice.getShipmentList();
+		if (CollectionUtils.isEmpty(items)) {
+			return true;
+		}
+
+		// 保存新明细
+		for (PcBladeOrderInvoiceItem item : items) {
+			item.setInvoiceId(invoice.getId());
+			item.setInvoiceNo(invoice.getInvoiceNo());
+			item.setOrderId(invoice.getOrderId());
+			item.setCreateUser(existing.getCreateUser()); // 保留原创建人
+			item.setCreateTime(existing.getCreateTime()); // 保留原创建时间
+			item.setUpdateUser(userId);
+			item.setUpdateTime(new Date());
+			item.setId(null); // 确保是新增
+			invoiceItemMapper.insert(item);
+		}
+
+		return true;
+	}
+
+	/**
+	 * 更新单条发票明细
+	 */
+	@Override
+	@Transactional(rollbackFor = Exception.class)
+	public boolean updateInvoiceItem(PcBladeOrderInvoiceItem item) {
+		// 验证明细是否存在
+		PcBladeOrderInvoiceItem existing = invoiceItemMapper.selectById(item.getId());
+		if (existing == null) {
+			return false;
+		}
+
+		// 保护关联字段不被修改
+		item.setInvoiceId(existing.getInvoiceId());
+		item.setInvoiceNo(existing.getInvoiceNo());
+		item.setOrderId(existing.getOrderId());
+
+		// 设置更新信息
+		item.setUpdateUser(AuthUtil.getUserId());
+		item.setUpdateTime(new Date());
+
+		// 执行更新
+		return invoiceItemMapper.updateById(item) > 0;
+	}
+
+	/**
+	 * 根据订单编号获取发票信息(包含明细)
+	 */
+	@Override
+	public PcBladeOrderInvoiceVO getByOrderCode(String orderCode) {
+		// 查询主表信息
+		QueryWrapper<PcBladeOrderInvoice> queryWrapper = new QueryWrapper<>();
+		queryWrapper.eq("order_code", orderCode)
+			.eq("is_deleted", 0);
+		PcBladeOrderInvoice invoice = baseMapper.selectOne(queryWrapper);
+
+		if (invoice == null) {
+			return null;
+		}
+
+		// 查询关联的明细
+		QueryWrapper<PcBladeOrderInvoiceItem> itemQuery = new QueryWrapper<>();
+		itemQuery.eq("invoice_id", invoice.getId())
+			.eq("is_deleted", 0);
+		List<PcBladeOrderInvoiceItem> items = invoiceItemMapper.selectList(itemQuery);
+
+		// 设置明细并转换为VO
+		invoice.setShipmentList(items);
+		return PcBladeOrderInvoiceWrapper.build().entityVO(invoice);
+	}
 
 }

+ 38 - 0
blade-service/blade-factory/src/main/java/org/springblade/factory/service/impl/PcBladeOrderShipmentItemServiceImpl.java

@@ -4,11 +4,14 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import lombok.AllArgsConstructor;
 import org.springblade.core.mp.base.BaseServiceImpl;
+import org.springblade.core.secure.utils.AuthUtil;
 import org.springblade.factory.entity.PcBladeOrderShipmentItem;
 import org.springblade.factory.mapper.PcBladeOrderShipmentItemMapper;
 import org.springblade.factory.service.PcBladeOrderShipmentItemService;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 
+import java.util.Date;
 import java.util.List;
 
 @Service
@@ -38,4 +41,39 @@ public class PcBladeOrderShipmentItemServiceImpl
 		return this.updateById(pcBladeOrderShipmentItem);
 	}
 
+
+	/**
+	 * 根据ID修改发货单明细
+	 * 1. 验证明细归属(防止越权修改)
+	 * 2. 更新明细信息及审计字段
+	 */
+	@Override
+	@Transactional(rollbackFor = Exception.class)
+	public boolean updateShipmentItemById(PcBladeOrderShipmentItem item) {
+		// 1. 获取当前明细ID
+		Long itemId = item.getId();
+		if (itemId == null) {
+			return false;
+		}
+
+		// 2. 验证明细存在性(双重校验,避免Controller层校验后数据被删除的极端情况)
+		PcBladeOrderShipmentItem existing = this.getById(itemId);
+		if (existing == null) {
+			return false;
+		}
+
+		// 3. 设置审计字段(更新人、更新时间)
+		item.setUpdateUser(AuthUtil.getUserId()); // 从登录信息获取当前用户ID
+		item.setUpdateTime(new Date());
+
+		// 4. 保留不可修改的关联字段(防止恶意篡改)
+		item.setShipmentId(existing.getShipmentId()); // 发货单ID不可改
+		item.setShipmentNo(existing.getShipmentNo()); // 发货单号不可改
+		item.setOrderId(existing.getOrderId());       // 订单ID不可改
+
+		// 5. 执行更新操作
+		return this.updateById(item);
+	}
+
+
 }

+ 173 - 0
blade-service/blade-factory/src/main/java/org/springblade/factory/service/impl/PcBladeOrderShipmentServiceImpl.java

@@ -1,15 +1,28 @@
 package org.springblade.factory.service.impl;
 
+import com.alibaba.cloud.commons.lang.StringUtils;
+import com.alibaba.excel.util.CollectionUtils;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import lombok.AllArgsConstructor;
 import org.springblade.core.mp.base.BaseServiceImpl;
+import org.springblade.core.secure.utils.AuthUtil;
 import org.springblade.factory.entity.PcBladeOrder;
 import org.springblade.factory.entity.PcBladeOrderShipment;
+import org.springblade.factory.entity.PcBladeOrderShipmentItem;
+import org.springblade.factory.mapper.PcBladeOrderShipmentItemMapper;
 import org.springblade.factory.mapper.PcBladeOrderShipmentMapper;
 import org.springblade.factory.service.PcBladeOrderShipmentService;
+import org.springblade.factory.vo.PcBladeOrderShipmentVO;
+import org.springblade.factory.wrapper.PcBladeOrderShipmentWrapper;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 
+import java.time.LocalDateTime;
+import java.util.Collections;
+import java.util.Date;
 import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
 
 @Service
 @AllArgsConstructor
@@ -18,6 +31,8 @@ public class PcBladeOrderShipmentServiceImpl
 	implements PcBladeOrderShipmentService {
 
 
+	private PcBladeOrderShipmentItemMapper shipmentItemMapper;
+
 	@Override
 	public List<PcBladeOrderShipment> selectPcBladeOrderShipmentList(PcBladeOrderShipment  pcBladeOrderShipment)
 	{
@@ -32,6 +47,7 @@ public class PcBladeOrderShipmentServiceImpl
 		return this.getById(id);
 	}
 
+
 	@Override
 	public boolean insertPcBladeOrderShipment(PcBladeOrderShipment pcBladeOrderShipment) {
 		return this.save(pcBladeOrderShipment);
@@ -43,4 +59,161 @@ public class PcBladeOrderShipmentServiceImpl
 	}
 
 
+	@Override
+	public List<PcBladeOrderShipmentVO> getByOrderId(Long orderId) {
+		// 1. 校验参数
+		if (orderId == null) {
+			return Collections.emptyList();
+		}
+
+		// 2. 构建主表查询条件
+		QueryWrapper<PcBladeOrderShipment> queryWrapper = new QueryWrapper<>();
+		queryWrapper.eq("order_id", orderId)
+			.eq("is_deleted", 0)
+			.orderByDesc("shipment_date");
+
+		// 3. 查询主表数据
+		List<PcBladeOrderShipment> shipmentList = baseMapper.selectList(queryWrapper);
+		if (CollectionUtils.isEmpty(shipmentList)) {
+			return Collections.emptyList();
+		}
+
+		// 4. 批量查询所有关联的明细数据(优化:减少SQL查询次数)
+		List<Long> shipmentIds = shipmentList.stream()
+			.map(PcBladeOrderShipment::getId)
+			.collect(Collectors.toList());
+
+		QueryWrapper<PcBladeOrderShipmentItem> itemQuery = new QueryWrapper<>();
+		itemQuery.in("shipment_id", shipmentIds)
+			.eq("is_deleted", 0);
+		List<PcBladeOrderShipmentItem> allItems = shipmentItemMapper.selectList(itemQuery);
+
+		// 5. 按发货单ID分组明细(内存中关联,提升性能)
+		Map<Long, List<PcBladeOrderShipmentItem>> itemMap = allItems.stream()
+			.collect(Collectors.groupingBy(PcBladeOrderShipmentItem::getShipmentId));
+
+		// 6. 为主表数据设置明细
+		shipmentList.forEach(shipment ->
+			shipment.setPcBladeOrderShipmentItem(itemMap.getOrDefault(shipment.getId(), Collections.emptyList()))
+		);
+
+		// 7. 转换为VO并返回
+		return PcBladeOrderShipmentWrapper.build().listVO(shipmentList);
+	}
+
+	@Override
+	public List<PcBladeOrderShipmentVO> getByOrderCode(String orderCode) {
+		// 1. 校验参数
+		if (StringUtils.isBlank(orderCode)) {
+			return Collections.emptyList();
+		}
+
+		// 2. 构建主表查询条件
+		QueryWrapper<PcBladeOrderShipment> queryWrapper = new QueryWrapper<>();
+		queryWrapper.eq("order_code", orderCode)
+			.eq("is_deleted", 0)
+			.orderByDesc("shipment_date");
+
+		// 3. 查询主表数据
+		List<PcBladeOrderShipment> shipmentList = baseMapper.selectList(queryWrapper);
+		if (CollectionUtils.isEmpty(shipmentList)) {
+			return Collections.emptyList();
+		}
+
+		// 4. 批量查询所有关联的明细数据
+		List<Long> shipmentIds = shipmentList.stream()
+			.map(PcBladeOrderShipment::getId)
+			.collect(Collectors.toList());
+
+		QueryWrapper<PcBladeOrderShipmentItem> itemQuery = new QueryWrapper<>();
+		itemQuery.in("shipment_id", shipmentIds)
+			.eq("is_deleted", 0);
+		List<PcBladeOrderShipmentItem> allItems = shipmentItemMapper.selectList(itemQuery);
+
+		// 5. 按发货单ID分组明细
+		Map<Long, List<PcBladeOrderShipmentItem>> itemMap = allItems.stream()
+			.collect(Collectors.groupingBy(PcBladeOrderShipmentItem::getShipmentId));
+
+		// 6. 为主表数据设置明细
+		shipmentList.forEach(shipment ->
+			shipment.setPcBladeOrderShipmentItem(itemMap.getOrDefault(shipment.getId(), Collections.emptyList()))
+		);
+
+		// 7. 转换为VO并返回
+		return PcBladeOrderShipmentWrapper.build().listVO(shipmentList);
+	}
+
+
+
+	/**
+	 * 新增订单发货单及明细(事务)
+	 */
+	@Override
+	@Transactional(rollbackFor = Exception.class)
+	public boolean insertPcBladeOrderShipmentPro(PcBladeOrderShipment pcBladeOrderShipment) {
+		// 1. 保存主表信息
+		boolean mainSaved = save(pcBladeOrderShipment);
+		if (!mainSaved) {
+			return false;
+		}
+
+		// 2. 处理明细数据
+		List<PcBladeOrderShipmentItem> items = pcBladeOrderShipment.getPcBladeOrderShipmentItem();
+		if (!CollectionUtils.isEmpty(items)) {
+			// 为每条明细设置关联字段
+			for (PcBladeOrderShipmentItem item : items) {
+				item.setShipmentId(pcBladeOrderShipment.getId());
+				item.setShipmentNo(pcBladeOrderShipment.getShipmentNo());
+				item.setOrderId(pcBladeOrderShipment.getOrderId());
+				// 设置创建人等基础信息
+				item.setCreateUser(pcBladeOrderShipment.getCreateUser());
+				item.setCreateTime(pcBladeOrderShipment.getCreateTime());
+				// 确保没有ID,避免更新操作
+				item.setId(null);
+				shipmentItemMapper.insert(item);
+			}
+		}
+
+		return true;
+	}
+
+	/**
+	 * 修改订单发货单及明细(事务)
+	 */
+	@Override
+	@Transactional(rollbackFor = Exception.class)
+	public boolean updatePcBladeOrderShipmentPro(PcBladeOrderShipment pcBladeOrderShipment) {
+		// 1. 更新主表信息
+		boolean mainUpdated = updateById(pcBladeOrderShipment);
+		if (!mainUpdated) {
+			return false;
+		}
+
+		// 2. 先删除原有明细 - 使用MyBatis-Plus的remove方法
+		QueryWrapper<PcBladeOrderShipmentItem> queryWrapper = new QueryWrapper<>();
+		queryWrapper.eq("shipment_id", pcBladeOrderShipment.getId());
+		shipmentItemMapper.delete(queryWrapper);
+
+		// 3. 保存新的明细数据
+		List<PcBladeOrderShipmentItem> items = pcBladeOrderShipment.getPcBladeOrderShipmentItem();
+		if (!CollectionUtils.isEmpty(items)) {
+			for (PcBladeOrderShipmentItem item : items) {
+				item.setShipmentId(pcBladeOrderShipment.getId());
+				item.setShipmentNo(pcBladeOrderShipment.getShipmentNo());
+				item.setOrderId(pcBladeOrderShipment.getOrderId());
+				// 设置更新人等信息
+				item.setUpdateUser(pcBladeOrderShipment.getUpdateUser());
+				item.setUpdateTime(pcBladeOrderShipment.getUpdateTime());
+				// 重置ID确保是新增操作
+				item.setId(null);
+				// 使用MyBatis-Plus的批量保存方法
+				shipmentItemMapper.insert(item);
+			}
+		}
+		return true;
+	}
+
+
+
+
 }

+ 28 - 0
blade-service/blade-factory/src/main/java/org/springblade/factory/service/impl/PcBladeShipmentTrackingServiceImpl.java

@@ -34,4 +34,32 @@ public class PcBladeShipmentTrackingServiceImpl
 	public boolean updatePcBladeShipmentTracking(PcBladeShipmentTracking pcBladeShipmentTracking) {
 		return this.updateById(pcBladeShipmentTracking);
 	}
+
+	@Override
+	public List<PcBladeShipmentTracking> selectPcBladeShipmentTrackingByPid(Long pid) {
+		// 使用MyBatis-Plus的条件构造器构建查询条件
+		QueryWrapper<PcBladeShipmentTracking> queryWrapper = new QueryWrapper<>();
+		// 添加查询条件:pid等于传入的参数,并且只查询未删除的记录(假设BaseEntity中有逻辑删除字段)
+		queryWrapper.eq("pid", pid)
+			.eq("is_deleted", 0);
+		// 按事件时间降序排序,确保最新的物流信息在前面
+		queryWrapper.orderByDesc("event_time");
+		// 执行查询
+		return baseMapper.selectList(queryWrapper);
+	}
+
+
+	@Override
+	public List<PcBladeShipmentTracking> selectPcBladeShipmentTrackingByCid(Long cid) {
+		// 使用MyBatis-Plus的条件构造器构建查询条件
+		QueryWrapper<PcBladeShipmentTracking> queryWrapper = new QueryWrapper<>();
+		// 添加查询条件:cid等于传入的参数,并且只查询未删除的记录
+		queryWrapper.eq("cid", cid)
+			.eq("is_deleted", 0);
+		// 按事件时间降序排序
+		queryWrapper.orderByDesc("event_time");
+		// 执行查询
+		return baseMapper.selectList(queryWrapper);
+	}
+
 }