瀏覽代碼

业务增加物流接口、发货信息接口、订单发票接口

bai 1 周之前
父節點
當前提交
94b4fa028e
共有 13 個文件被更改,包括 762 次插入3 次删除
  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. 228 3
      blade-service/blade-factory/src/main/java/org/springblade/factory/api/controller/SalesOrderController.java
  5. 6 0
      blade-service/blade-factory/src/main/java/org/springblade/factory/mapper/PcBladeOrderShipmentItemMapper.java
  6. 35 0
      blade-service/blade-factory/src/main/java/org/springblade/factory/service/PcBladeOrderInvoiceService.java
  7. 12 0
      blade-service/blade-factory/src/main/java/org/springblade/factory/service/PcBladeOrderShipmentItemService.java
  8. 33 0
      blade-service/blade-factory/src/main/java/org/springblade/factory/service/PcBladeOrderShipmentService.java
  9. 19 0
      blade-service/blade-factory/src/main/java/org/springblade/factory/service/PcBladeShipmentTrackingService.java
  10. 174 0
      blade-service/blade-factory/src/main/java/org/springblade/factory/service/impl/PcBladeOrderInvoiceServiceImpl.java
  11. 38 0
      blade-service/blade-factory/src/main/java/org/springblade/factory/service/impl/PcBladeOrderShipmentItemServiceImpl.java
  12. 173 0
      blade-service/blade-factory/src/main/java/org/springblade/factory/service/impl/PcBladeOrderShipmentServiceImpl.java
  13. 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;

+ 228 - 3
blade-service/blade-factory/src/main/java/org/springblade/factory/api/controller/SalesOrderController.java

@@ -2,6 +2,7 @@ package org.springblade.factory.api.controller;
 
 
 import com.alibaba.cloud.commons.lang.StringUtils;
+import com.alibaba.excel.util.CollectionUtils;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import io.swagger.annotations.ApiOperation;
@@ -11,6 +12,12 @@ import org.springblade.core.mp.support.Query;
 import org.springblade.core.tool.api.R;
 import org.springblade.factory.entity.*;
 import org.springblade.factory.service.*;
+import org.springblade.factory.vo.PcBladeOrderInvoiceVO;
+import org.springblade.factory.vo.PcBladeOrderShipmentVO;
+import org.springblade.factory.vo.PcBladeShipmentTrackingVO;
+import org.springblade.factory.wrapper.PcBladeOrderInvoiceWrapper;
+import org.springblade.factory.wrapper.PcBladeOrderShipmentWrapper;
+import org.springblade.factory.wrapper.PcBladeShipmentTrackingWrapper;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.web.bind.annotation.*;
@@ -241,11 +248,229 @@ public class SalesOrderController {
 
 
 
-	@Autowired
-	private ZcrmViewWhqohSelService whqohService;
-	// 获取品牌 -- 接口
+
+
+	// 获取品牌 -- 接口 ------ 待定接口
+
+
+	// 获取品牌 -- 接口 END ------ 待定接口
+
+
+	// 物流跟踪 -- 接口
+	private final PcBladeShipmentTrackingService  pcBladeShipmentTrackingService;
+
+	@GetMapping("/getPcBladeShipmentTrackingByPid")
+	public R<List<PcBladeShipmentTracking>> getPcBladeShipmentTrackingByPid(Long pid) {
+		// 校验参数
+		if (pid == null) {
+			return R.fail("pid不能为空");
+		}
+		// 调用服务层方法查询数据
+		List<PcBladeShipmentTracking> trackingList = pcBladeShipmentTrackingService.selectPcBladeShipmentTrackingByPid(pid);
+		// 返回成功响应及数据
+		return R.data(trackingList);
+	}
+
+	@GetMapping("/getPcBladeShipmentTrackingByCid")
+	public R<List<PcBladeShipmentTracking>> getPcBladeShipmentTrackingByCid(Long cid) {
+		// 校验参数
+		if (cid == null) {
+			return R.fail("cid不能为空");
+		}
+		// 调用服务层方法查询数据
+		List<PcBladeShipmentTracking> trackingList = pcBladeShipmentTrackingService.selectPcBladeShipmentTrackingByCid(cid);
+		// 返回成功响应及数据
+		return R.data(trackingList);
+	}
+
+	/**
+	 * 新增
+	 */
+	@PostMapping("/addPcBladeShipmentTracking")
+	public R<Boolean> save(@RequestBody PcBladeShipmentTracking pcBladeShipmentTracking) {
+		return R.data(200, pcBladeShipmentTrackingService.insertPcBladeShipmentTracking(pcBladeShipmentTracking),"添加成功");
+	}
+
+	/**
+	 * 修改
+	 */
+	@PutMapping("/updatePcBladeShipmentTracking")
+	public R<Boolean> update(@RequestBody PcBladeShipmentTracking pcBladeShipmentTracking) {
+		return R.data(200,pcBladeShipmentTrackingService.updatePcBladeShipmentTracking(pcBladeShipmentTracking),"修改成功");
+	}
+
+
+	// 发货单 -- 接口
+	private final PcBladeOrderShipmentService shipmentService;
+	private final PcBladeOrderShipmentItemService shipmentItemService;
+
+	/**
+	 * 根据订单ID查询发货单列表
+	 */
+	@GetMapping("/getPcBladeOrderShipmentByOrderId")
+	@ApiOperation(value = "根据订单ID查询发货单", notes = "通过订单ID(orderId)查询对应的发货单列表")
+	public R<List<PcBladeOrderShipmentVO>> getByOrderId(@RequestParam Long orderId) {
+		// 参数校验
+		if (orderId == null) {
+			return R.fail("参数错误:orderId不能为空");
+		}
+		// 调用服务层方法查询
+		List<PcBladeOrderShipmentVO> result = shipmentService.getByOrderId(orderId);
+		return R.data(result);
+	}
+
+	/**
+	 * 根据订单编号查询发货单列表
+	 */
+	@GetMapping("/getPcBladeOrderShipmentByOrderCode")
+	@ApiOperation(value = "根据订单编号查询发货单", notes = "通过订单编号(orderCode)查询对应的发货单列表")
+	public R<List<PcBladeOrderShipmentVO>> getByOrderCode(@RequestParam String orderCode) {
+		// 参数校验
+		if (orderCode == null || orderCode.trim().isEmpty()) {
+			return R.fail("参数错误:orderCode不能为空");
+		}
+		// 调用服务层方法查询
+		List<PcBladeOrderShipmentVO> result = shipmentService.getByOrderCode(orderCode.trim());
+		return R.data(result);
+	}
+
+
+	/**
+	 * 新增订单发货单及明细
+	 */
+	@PostMapping("/addPcBladeOrderShipmentPro")
+	public R<Boolean> addPcBladeOrderShipmentPro(@RequestBody PcBladeOrderShipment pcBladeOrderShipment) {
+		// 校验主表和明细表数据
+		if (pcBladeOrderShipment == null) {
+			return R.fail("发货单数据不能为空");
+		}
+		if (CollectionUtils.isEmpty(pcBladeOrderShipment.getPcBladeOrderShipmentItem())) {
+			return R.fail("请至少添加一条发货明细");
+		}
+		boolean result = shipmentService.insertPcBladeOrderShipmentPro(pcBladeOrderShipment);
+		return R.data(result, result ? "添加成功" : "添加失败");
+	}
+
+	/**
+	 * 修改订单发货单及明细
+	 */
+	@PutMapping("/updatePcBladeOrderShipmentPro")
+	public R<Boolean> updatePcBladeOrderShipmentPro(@RequestBody PcBladeOrderShipment pcBladeOrderShipment) {
+		// 校验ID和数据
+		if (pcBladeOrderShipment.getId() == null) {
+			return R.fail("发货单ID不能为空");
+		}
+		if (CollectionUtils.isEmpty(pcBladeOrderShipment.getPcBladeOrderShipmentItem())) {
+			return R.fail("请至少添加一条发货明细");
+		}
+		boolean result = shipmentService.updatePcBladeOrderShipmentPro(pcBladeOrderShipment);
+		return R.data(result, result ? "修改成功" : "修改失败");
+	}
+
+
+	/**
+	 * 修改订单发货单明细(根据ID)
+	 * 针对单个明细项进行修改操作
+	 */
+	@PutMapping("/updatePcBladeOrderShipmentItemProFind")
+	public R<Boolean> updatePcBladeOrderShipmentItemProFind(
+		@RequestBody PcBladeOrderShipmentItem pcBladeOrderShipmentItem) {
+		// 1. 参数校验:确保明细ID存在
+		if (pcBladeOrderShipmentItem.getId() == null) {
+			return R.fail("明细ID不能为空");
+		}
+
+		// 2. 校验明细是否存在
+		PcBladeOrderShipmentItem existingItem = shipmentItemService.getById(pcBladeOrderShipmentItem.getId());
+		if (existingItem == null) {
+			return R.fail("未找到ID为" + pcBladeOrderShipmentItem.getId() + "的发货明细");
+		}
+
+		// 3. 调用服务层执行修改操作
+		boolean result = shipmentItemService.updateShipmentItemById(pcBladeOrderShipmentItem);
+
+		// 4. 返回结果
+		return result ? R.data(true, "修改成功") : R.fail("修改失败");
+	}
+
+
+	// 发票 -- 接口
+	private final PcBladeOrderInvoiceService pcBladeOrderInvoiceService;
+
+
+	/**
+	 * 根据订单ID获取发票信息(包含明细)
+	 */
+	@GetMapping("/getPcBladeOrderInvoiceByIdFind")
+	public R<PcBladeOrderInvoiceVO> getPcBladeOrderInvoiceByIdFind(@RequestParam Long orderId) {
+		// 参数校验
+		if (orderId == null) {
+			return R.fail("订单ID不能为空");
+		}
+		PcBladeOrderInvoiceVO invoiceVO = pcBladeOrderInvoiceService.getByOrderId(orderId);
+		return invoiceVO != null ? R.data(invoiceVO) : R.fail("未找到对应发票信息");
+	}
+
+	/**
+	 * 根据订单编号获取发票信息(包含明细)
+	 */
+	@GetMapping("/getPcBladeOrderInvoiceByCodeFind")
+	public R<PcBladeOrderInvoiceVO> getPcBladeOrderInvoiceByCodeFind(@RequestParam String orderCode) {
+		// 参数校验
+		if (StringUtils.isBlank(orderCode)) {
+			return R.fail("订单编号不能为空");
+		}
+		PcBladeOrderInvoiceVO invoiceVO = pcBladeOrderInvoiceService.getByOrderCode(orderCode.trim());
+		return invoiceVO != null ? R.data(invoiceVO) : R.fail("未找到对应发票信息");
+	}
+
+	/**
+	 * 添加一条发票信息及明细
+	 */
+	@PostMapping("/addPcBladeOrderInvoice")
+	public R<Boolean> addPcBladeOrderInvoice(@RequestBody PcBladeOrderInvoice pcBladeOrderInvoice) {
+		// 参数校验
+		if (pcBladeOrderInvoice == null || pcBladeOrderInvoice.getOrderId() == null) {
+			return R.fail("发票信息或订单ID不能为空");
+		}
+		if (CollectionUtils.isEmpty(pcBladeOrderInvoice.getShipmentList())) {
+			return R.fail("至少添加一条发票明细");
+		}
+		boolean result = pcBladeOrderInvoiceService.saveInvoiceWithItems(pcBladeOrderInvoice);
+		return result ? R.success("添加成功") : R.fail("添加失败");
+	}
+
+	/**
+	 * 修改发票信息及多个明细
+	 */
+	@PutMapping("/updatePcBladeOrderInvoice")
+	public R<Boolean> updatePcBladeOrderInvoice(@RequestBody PcBladeOrderInvoice pcBladeOrderInvoice) {
+		// 参数校验
+		if (pcBladeOrderInvoice == null || pcBladeOrderInvoice.getId() == null) {
+			return R.fail("发票ID不能为空");
+		}
+		boolean result = pcBladeOrderInvoiceService.updateInvoiceWithItems(pcBladeOrderInvoice);
+		return result ? R.success("修改成功") : R.fail("修改失败");
+	}
+
+	/**
+	 * 修改单条发票明细
+	 */
+	@PutMapping("/updatePcBladeOrderInvoiceItemFind")
+	public R<Boolean> updatePcBladeOrderInvoiceItemFind(@RequestBody PcBladeOrderInvoiceItem pcBladeOrderInvoiceItem) {
+		// 参数校验
+		if (pcBladeOrderInvoiceItem == null || pcBladeOrderInvoiceItem.getId() == null) {
+			return R.fail("明细ID不能为空");
+		}
+		boolean result = pcBladeOrderInvoiceService.updateInvoiceItem(pcBladeOrderInvoiceItem);
+		return result ? R.success("修改成功") : R.fail("修改失败");
+	}
+
+
+
 
 	// 检查库存 -- 接口
+	private final ZcrmViewWhqohSelService whqohService;
 	/**
 	 * 仓库库存列表
 	 */

+ 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);
+	}
+
 }