完善新增运送清单和订单

This commit is contained in:
xuqiuyun
2025-10-28 17:31:19 +08:00
parent 42e0abcbe3
commit 6c86963418
12 changed files with 1629 additions and 465 deletions

View File

@@ -0,0 +1,48 @@
-- =============================================
-- 数据库迁移脚本:为 delivery 表添加缺失的照片和视频字段
-- 用途:存储到地相关的照片和视频
-- 创建时间2025-10-28
-- 数据库MySQL
-- =============================================
-- 添加到地纸质磅单(双章)照片字段
ALTER TABLE delivery
ADD COLUMN destination_pound_list_img VARCHAR(500) COMMENT '到地纸质磅单(双章)'
AFTER driver_id_card_photo;
-- 添加到地车辆过重磅车头照片字段
ALTER TABLE delivery
ADD COLUMN destination_vehicle_front_photo VARCHAR(500) COMMENT '到地车辆过重磅车头照片'
AFTER destination_pound_list_img;
-- 添加装牛视频字段
ALTER TABLE delivery
ADD COLUMN cattle_loading_video VARCHAR(500) COMMENT '装牛视频'
AFTER cattle_loading_circle_video;
-- 添加卸牛视频字段
ALTER TABLE delivery
ADD COLUMN unload_cattle_video VARCHAR(500) COMMENT '卸牛视频'
AFTER cattle_loading_video;
-- 添加到地过磅视频字段
ALTER TABLE delivery
ADD COLUMN destination_weight_video VARCHAR(500) COMMENT '到地过磅视频'
AFTER unload_cattle_video;
-- 验证字段是否添加成功
SELECT COLUMN_NAME, DATA_TYPE, IS_NULLABLE, COLUMN_DEFAULT, COLUMN_COMMENT
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_SCHEMA = DATABASE()
AND TABLE_NAME = 'delivery'
AND COLUMN_NAME IN (
'destination_pound_list_img',
'destination_vehicle_front_photo',
'cattle_loading_video',
'unload_cattle_video',
'destination_weight_video'
);
-- 显示完整的表结构
DESCRIBE delivery;

View File

@@ -10,6 +10,8 @@ import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
/**
@@ -32,15 +34,15 @@ public class OrderController {
*/
@SaCheckPermission("order:list")
@PostMapping("/list")
public AjaxResult list(@RequestBody Map<String, Object> params) {
public PageResultResponse<Order> list(@RequestBody Map<String, Object> params) {
try {
logger.info("查询订单列表,参数:{}", params);
PageResultResponse<Order> result = orderService.pageQuery(params);
logger.info("查询成功,共{}条记录", result.getData().getTotal());
return AjaxResult.success(result);
return result;
} catch (Exception e) {
logger.error("查询订单列表失败:{}", e.getMessage(), e);
return AjaxResult.error("查询订单列表失败:" + e.getMessage());
return new PageResultResponse<>(0, new ArrayList<>());
}
}

View File

@@ -1,5 +1,6 @@
package com.aiotagro.cattletrade.business.dto;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import javax.validation.constraints.*;
import java.util.Date;
@@ -13,6 +14,8 @@ import java.util.List;
*/
@Data
public class DeliveryCreateDto {
/** 关联订单ID */
private Integer orderId;
/**
* 发货方
@@ -30,8 +33,6 @@ public class DeliveryCreateDto {
* 车牌号
*/
@NotBlank(message = "车牌号不能为空")
@Pattern(regexp = "^[京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领][A-Z][A-Z0-9]{5}[A-Z0-9挂学警港澳]$",
message = "车牌号格式不正确")
private String plateNumber;
/**
@@ -66,12 +67,14 @@ public class DeliveryCreateDto {
* 预计出发时间
*/
@NotNull(message = "预计出发时间不能为空")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date estimatedDepartureTime;
/**
* 预计到达时间
*/
@NotNull(message = "预计到达时间不能为空")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date estimatedArrivalTime;
/**
@@ -79,12 +82,20 @@ public class DeliveryCreateDto {
*/
@NotBlank(message = "起点地址不能为空")
private String startLocation;
/** 起点经度 */
private String startLon;
/** 起点纬度 */
private String startLat;
/**
* 目的地地址
*/
@NotBlank(message = "目的地地址不能为空")
private String endLocation;
/** 目的地经度 */
private String endLon;
/** 目的地纬度 */
private String endLat;
/**
* 牛只数量
@@ -110,5 +121,87 @@ public class DeliveryCreateDto {
*/
@Size(max = 500, message = "备注不能超过500字")
private String remark;
/** 空车过磅重量 */
private String emptyWeight;
/** 装车过磅重量 */
private String entruckWeight;
/** 落地过磅重量 */
private String landingEntruckWeight;
/**
* 检疫票照片
*/
private String quarantineTickeyUrl;
/**
* 传纸质磅单(双章)
*/
private String poundListImg;
/**
* 车辆空磅上磅车头照片
*/
private String emptyVehicleFrontPhoto;
/**
* 车辆过重磅车头照片
*/
private String loadedVehicleFrontPhoto;
/**
* 车辆重磅照片
*/
private String loadedVehicleWeightPhoto;
/**
* 驾驶员手持身份证站车头照片
*/
private String driverIdCardPhoto;
/**
* 到地纸质磅单(双章)
*/
private String destinationPoundListImg;
/**
* 到地车辆过重磅车头照片
*/
private String destinationVehicleFrontPhoto;
/**
* 装车过磅视频
*/
private String entruckWeightVideo;
/**
* 空车过磅视频
*/
private String emptyWeightVideo;
/**
* 装牛视频
*/
private String cattleLoadingVideo;
/**
* 控槽视频
*/
private String controlSlotVideo;
/**
* 装完牛绕车一圈视频
*/
private String cattleLoadingCircleVideo;
/**
* 卸牛视频
*/
private String unloadCattleVideo;
/**
* 到地过磅视频
*/
private String destinationWeightVideo;
}

View File

@@ -318,6 +318,36 @@ public class Delivery implements Serializable {
@TableField("driver_id_card_photo")
private String driverIdCardPhoto;
/**
* 到地纸质磅单(双章)
*/
@TableField("destination_pound_list_img")
private String destinationPoundListImg;
/**
* 到地车辆过重磅车头照片
*/
@TableField("destination_vehicle_front_photo")
private String destinationVehicleFrontPhoto;
/**
* 装牛视频
*/
@TableField("cattle_loading_video")
private String cattleLoadingVideo;
/**
* 卸牛视频
*/
@TableField("unload_cattle_video")
private String unloadCattleVideo;
/**
* 到地过磅视频
*/
@TableField("destination_weight_video")
private String destinationWeightVideo;
/**
* 主机设备编号
*/

View File

@@ -507,6 +507,11 @@ public class DeliveryServiceImpl extends ServiceImpl<DeliveryMapper, Delivery> i
@Transactional
@Override
public AjaxResult createDelivery(DeliveryCreateDto dto) {
// 入参日志
System.out.println("[CREATE-DELIVERY] 收到DTO - shipper: " + dto.getShipper() +
", buyer: " + dto.getBuyer() +
", plateNumber: " + dto.getPlateNumber() +
", driverName: " + dto.getDriverName());
// 校验时间逻辑
if (dto.getEstimatedArrivalTime().before(dto.getEstimatedDepartureTime())) {
return AjaxResult.error("预计到达时间必须晚于出发时间");
@@ -523,8 +528,42 @@ public class DeliveryServiceImpl extends ServiceImpl<DeliveryMapper, Delivery> i
// 创建运送清单
Delivery delivery = new Delivery();
delivery.setDeliveryNumber(deliveryNumber);
delivery.setOrderId(dto.getOrderId());
// 基本信息
delivery.setLicensePlate(dto.getPlateNumber());
delivery.setDriverName(dto.getDriverName());
delivery.setDriverMobile(dto.getDriverPhone());
// 地址与坐标
delivery.setStartLocation(dto.getStartLocation());
delivery.setStartLon(dto.getStartLon());
delivery.setStartLat(dto.getStartLat());
delivery.setEndLocation(dto.getEndLocation());
delivery.setEndLon(dto.getEndLon());
delivery.setEndLat(dto.getEndLat());
// 预计到达
delivery.setEstimatedDeliveryTime(dto.getEstimatedArrivalTime());
// 过磅重量
delivery.setEmptyWeight(dto.getEmptyWeight());
delivery.setEntruckWeight(dto.getEntruckWeight());
delivery.setLandingEntruckWeight(dto.getLandingEntruckWeight());
// 照片
delivery.setQuarantineTickeyUrl(dto.getQuarantineTickeyUrl());
delivery.setPoundListImg(dto.getPoundListImg());
delivery.setEmptyVehicleFrontPhoto(dto.getEmptyVehicleFrontPhoto());
delivery.setLoadedVehicleFrontPhoto(dto.getLoadedVehicleFrontPhoto());
delivery.setLoadedVehicleWeightPhoto(dto.getLoadedVehicleWeightPhoto());
delivery.setDriverIdCardPhoto(dto.getDriverIdCardPhoto());
delivery.setDestinationPoundListImg(dto.getDestinationPoundListImg());
delivery.setDestinationVehicleFrontPhoto(dto.getDestinationVehicleFrontPhoto());
// 视频
delivery.setEntruckWeightVideo(dto.getEntruckWeightVideo());
delivery.setEmptyWeightVideo(dto.getEmptyWeightVideo());
delivery.setEntruckVideo(dto.getCattleLoadingVideo());
delivery.setControlSlotVideo(dto.getControlSlotVideo());
delivery.setCattleLoadingCircleVideo(dto.getCattleLoadingCircleVideo());
delivery.setUnloadCattleVideo(dto.getUnloadCattleVideo());
delivery.setDestinationWeightVideo(dto.getDestinationWeightVideo());
delivery.setStatus(1); // 待装车
delivery.setCreatedBy(userId);
delivery.setCreateByName(userName);
@@ -532,6 +571,10 @@ public class DeliveryServiceImpl extends ServiceImpl<DeliveryMapper, Delivery> i
// 保存运送清单
boolean saved = this.save(delivery);
System.out.println("[CREATE-DELIVERY] 入库实体 - deliveryNumber: " + delivery.getDeliveryNumber() +
", licensePlate: " + delivery.getLicensePlate() +
", driverName: " + delivery.getDriverName() +
", status: " + delivery.getStatus());
if (!saved) {
return AjaxResult.error("创建失败");
}
@@ -1186,7 +1229,7 @@ public class DeliveryServiceImpl extends ServiceImpl<DeliveryMapper, Delivery> i
}
// 填充装车订单的关联订单信息
for适合 (Delivery delivery : resList) {
for (Delivery delivery : resList) {
if (delivery.getOrderId() != null) {
com.aiotagro.cattletrade.business.entity.Order order = orderMapper.selectById(delivery.getOrderId());
if (order != null) {

View File

@@ -54,8 +54,13 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
Integer pageNum = params.get("pageNum") != null ? (Integer) params.get("pageNum") : 1;
Integer pageSize = params.get("pageSize") != null ? (Integer) params.get("pageSize") : 10;
Integer settlementType = params.get("settlementType") != null ? (Integer) params.get("settlementType") : null;
String buyerName = params.get("buyerName") != null ? (String) params.get("buyerName") : null;
String sellerName = params.get("sellerName") != null ? (String) params.get("sellerName") : null;
String startTime = params.get("startTime") != null ? (String) params.get("startTime") : null;
String endTime = params.get("endTime") != null ? (String) params.get("endTime") : null;
logger.info("分页查询订单列表,页码:{},每页数量:{}", pageNum, pageSize);
logger.info("分页查询订单列表,页码:{},每页数量:{},买方:{},卖方:{},结算方式:{}",
pageNum, pageSize, buyerName, sellerName, settlementType);
// 使用PageHelper进行分页
Page<Order> page = PageHelper.startPage(pageNum, pageSize);
@@ -63,6 +68,25 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
// 构建查询条件
LambdaQueryWrapper<Order> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(settlementType != null, Order::getSettlementType, settlementType);
// 时间范围查询
if (startTime != null && !startTime.isEmpty()) {
// 如果没有时间部分添加00:00:00
String startTimeStr = startTime;
if (startTimeStr.matches("\\d{4}-\\d{2}-\\d{2}")) {
startTimeStr = startTimeStr + " 00:00:00";
}
queryWrapper.ge(Order::getCreateTime, startTimeStr);
}
if (endTime != null && !endTime.isEmpty()) {
// 如果没有时间部分添加23:59:59
String endTimeStr = endTime;
if (endTimeStr.matches("\\d{4}-\\d{2}-\\d{2}")) {
endTimeStr = endTimeStr + " 23:59:59";
}
queryWrapper.le(Order::getCreateTime, endTimeStr);
}
queryWrapper.orderByDesc(Order::getCreateTime);
// 执行查询
@@ -71,9 +95,22 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
// 填充关联信息
list.forEach(this::fillOrderInfo);
// 如果提供了买方或卖方名称搜索,进行过滤
List<Order> filteredList = list;
if (buyerName != null && !buyerName.trim().isEmpty()) {
filteredList = filteredList.stream()
.filter(order -> order.getBuyerName() != null && order.getBuyerName().contains(buyerName.trim()))
.collect(java.util.stream.Collectors.toList());
}
if (sellerName != null && !sellerName.trim().isEmpty()) {
filteredList = filteredList.stream()
.filter(order -> order.getSellerName() != null && order.getSellerName().contains(sellerName.trim()))
.collect(java.util.stream.Collectors.toList());
}
// 构建分页结果
logger.info("查询到{}条订单记录", list.size());
return new PageResultResponse<>(page.getTotal(), list);
logger.info("查询到{}条订单记录,过滤后{}条", list.size(), filteredList.size());
return new PageResultResponse<>(filteredList.size(), filteredList);
}
/**
@@ -140,8 +177,16 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
}
// 设置更新人和更新时间
Integer userId = SecurityUtil.getCurrentUserId();
order.setUpdatedBy(userId);
try {
Integer userId = SecurityUtil.getCurrentUserId();
order.setUpdatedBy(userId);
} catch (Exception e) {
logger.warn("获取当前用户失败,使用订单原有创建人:{}", e.getMessage());
// 如果无法获取当前用户,使用原订单的 created_by
if (existingOrder.getCreatedBy() != null) {
order.setUpdatedBy(existingOrder.getCreatedBy());
}
}
order.setUpdateTime(new Date());
// 更新数据库