后期需求已修改
This commit is contained in:
@@ -155,5 +155,49 @@ public class OrderController {
|
||||
return AjaxResult.error("批量导入订单失败:" + e.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 批量更新订单的delivery_id字段
|
||||
*/
|
||||
@SaCheckPermission("order:edit")
|
||||
@PostMapping("/updateDeliveryId")
|
||||
public AjaxResult updateDeliveryId(@RequestBody Map<String, Object> params) {
|
||||
try {
|
||||
logger.info("批量更新订单delivery_id,参数:{}", params);
|
||||
|
||||
Integer deliveryId = null;
|
||||
if (params.get("deliveryId") != null) {
|
||||
Object deliveryIdObj = params.get("deliveryId");
|
||||
if (deliveryIdObj instanceof Integer) {
|
||||
deliveryId = (Integer) deliveryIdObj;
|
||||
} else if (deliveryIdObj instanceof String) {
|
||||
try {
|
||||
deliveryId = Integer.parseInt((String) deliveryIdObj);
|
||||
} catch (NumberFormatException e) {
|
||||
logger.error("deliveryId格式不正确:{}", deliveryIdObj);
|
||||
return AjaxResult.error("deliveryId格式不正确");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
List<Integer> orderIds = (List<Integer>) params.get("orderIds");
|
||||
|
||||
if (deliveryId == null) {
|
||||
logger.error("更新失败:运送清单ID不能为空");
|
||||
return AjaxResult.error("运送清单ID不能为空");
|
||||
}
|
||||
|
||||
if (orderIds == null || orderIds.isEmpty()) {
|
||||
logger.warn("订单ID列表为空,跳过更新");
|
||||
return AjaxResult.success("订单ID列表为空,无需更新");
|
||||
}
|
||||
|
||||
return orderService.updateOrderDeliveryId(deliveryId, orderIds);
|
||||
} catch (Exception e) {
|
||||
logger.error("批量更新订单delivery_id失败:{}", e.getMessage(), e);
|
||||
return AjaxResult.error("批量更新订单delivery_id失败:" + e.getMessage());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -14,8 +14,8 @@ import java.util.List;
|
||||
*/
|
||||
@Data
|
||||
public class DeliveryCreateDto {
|
||||
/** 关联订单ID */
|
||||
private Integer orderId;
|
||||
/** 关联订单ID(多个订单ID用逗号分隔的字符串,如:"1,2,3") */
|
||||
private String orderId;
|
||||
|
||||
/**
|
||||
* 发货方ID
|
||||
@@ -107,6 +107,11 @@ public class DeliveryCreateDto {
|
||||
@Min(value = 1, message = "牛只数量至少为1")
|
||||
private Integer cattleCount;
|
||||
|
||||
/**
|
||||
* 司机运费(元)
|
||||
*/
|
||||
private java.math.BigDecimal freight;
|
||||
|
||||
/**
|
||||
* 检疫证号
|
||||
*/
|
||||
|
||||
@@ -69,6 +69,9 @@ public class DeliveryEditDto {
|
||||
/** 落地过磅重量 */
|
||||
private String landingEntruckWeight;
|
||||
|
||||
/** 司机运费(元) */
|
||||
private java.math.BigDecimal freight;
|
||||
|
||||
/** 检疫票照片 */
|
||||
private String quarantineTickeyUrl;
|
||||
/** 传纸质磅单(双章) */
|
||||
|
||||
@@ -34,10 +34,10 @@ public class Delivery implements Serializable {
|
||||
private Integer id;
|
||||
|
||||
/**
|
||||
* 订单ID(关联order表)
|
||||
* 订单ID(关联order表,多个订单ID用逗号分隔,如:1,2,3)
|
||||
*/
|
||||
@TableField("order_id")
|
||||
private Integer orderId;
|
||||
private String orderId;
|
||||
|
||||
/**
|
||||
* 运单号
|
||||
@@ -279,6 +279,12 @@ public class Delivery implements Serializable {
|
||||
@TableField("landingEntruck_weight")
|
||||
private String landingEntruckWeight;
|
||||
|
||||
/**
|
||||
* 司机运费(元)
|
||||
*/
|
||||
@TableField("freight")
|
||||
private java.math.BigDecimal freight;
|
||||
|
||||
/**
|
||||
* 检疫票
|
||||
*/
|
||||
|
||||
@@ -53,6 +53,12 @@ public class Order implements Serializable {
|
||||
@TableField("firm_price")
|
||||
private java.math.BigDecimal firmPrice;
|
||||
|
||||
/**
|
||||
* 运送清单ID(关联delivery表)
|
||||
*/
|
||||
@TableField("delivery_id")
|
||||
private Integer deliveryId;
|
||||
|
||||
/**
|
||||
* 逻辑删除标记(0-正常,1-已删除)
|
||||
*/
|
||||
@@ -109,5 +115,35 @@ public class Order implements Serializable {
|
||||
*/
|
||||
@TableField(exist = false)
|
||||
private String settlementTypeDesc;
|
||||
|
||||
/**
|
||||
* 运单号(关联delivery表,不存储在数据库中,用于显示)
|
||||
*/
|
||||
@TableField(exist = false)
|
||||
private String deliveryNumber;
|
||||
|
||||
/**
|
||||
* 起始地(关联delivery表,不存储在数据库中,用于显示)
|
||||
*/
|
||||
@TableField(exist = false)
|
||||
private String startLocation;
|
||||
|
||||
/**
|
||||
* 目的地(关联delivery表,不存储在数据库中,用于显示)
|
||||
*/
|
||||
@TableField(exist = false)
|
||||
private String endLocation;
|
||||
|
||||
/**
|
||||
* 单价(关联delivery表,不存储在数据库中,用于显示)
|
||||
*/
|
||||
@TableField(exist = false)
|
||||
private java.math.BigDecimal firmPriceFromDelivery;
|
||||
|
||||
/**
|
||||
* 运送清单状态(关联delivery表,不存储在数据库中,用于显示)
|
||||
*/
|
||||
@TableField(exist = false)
|
||||
private Integer deliveryStatus;
|
||||
}
|
||||
|
||||
|
||||
@@ -63,5 +63,14 @@ public interface IOrderService extends IService<Order> {
|
||||
* @return AjaxResult
|
||||
*/
|
||||
AjaxResult batchImportOrders(List<Map<String, Object>> orders);
|
||||
|
||||
/**
|
||||
* 批量更新订单的delivery_id字段
|
||||
*
|
||||
* @param deliveryId 运送清单ID
|
||||
* @param orderIds 订单ID列表
|
||||
* @return AjaxResult
|
||||
*/
|
||||
AjaxResult updateOrderDeliveryId(Integer deliveryId, List<Integer> orderIds);
|
||||
}
|
||||
|
||||
|
||||
@@ -797,6 +797,8 @@ public class DeliveryServiceImpl extends ServiceImpl<DeliveryMapper, Delivery> i
|
||||
delivery.setEmptyWeight(StringUtils.isNotEmpty(dto.getEmptyWeight()) ? dto.getEmptyWeight() : null);
|
||||
delivery.setEntruckWeight(StringUtils.isNotEmpty(dto.getEntruckWeight()) ? dto.getEntruckWeight() : null);
|
||||
delivery.setLandingEntruckWeight(StringUtils.isNotEmpty(dto.getLandingEntruckWeight()) ? dto.getLandingEntruckWeight() : null);
|
||||
// 司机运费
|
||||
delivery.setFreight(dto.getFreight());
|
||||
// 照片
|
||||
delivery.setQuarantineTickeyUrl(dto.getQuarantineTickeyUrl());
|
||||
delivery.setPoundListImg(dto.getPoundListImg());
|
||||
@@ -1055,6 +1057,10 @@ public class DeliveryServiceImpl extends ServiceImpl<DeliveryMapper, Delivery> i
|
||||
if (dto.getLandingEntruckWeight() != null) {
|
||||
delivery.setLandingEntruckWeight(StringUtils.isNotEmpty(dto.getLandingEntruckWeight()) ? dto.getLandingEntruckWeight() : null);
|
||||
}
|
||||
// 更新司机运费
|
||||
if (dto.getFreight() != null) {
|
||||
delivery.setFreight(dto.getFreight());
|
||||
}
|
||||
|
||||
// 更新照片字段:将空字符串转换为null,避免前端显示问题
|
||||
// 注意:前端总是传递字段(即使是空字符串),只有在传递了有效URL时才更新
|
||||
|
||||
@@ -46,6 +46,9 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
|
||||
@Autowired
|
||||
private SysUserMapper sysUserMapper;
|
||||
|
||||
@Autowired
|
||||
private com.aiotagro.cattletrade.business.mapper.DeliveryMapper deliveryMapper;
|
||||
|
||||
/**
|
||||
* 分页查询订单列表
|
||||
*/
|
||||
@@ -58,9 +61,13 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
|
||||
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;
|
||||
String deliveryNumber = params.get("deliveryNumber") != null ? (String) params.get("deliveryNumber") : null;
|
||||
String startLocation = params.get("startLocation") != null ? (String) params.get("startLocation") : null;
|
||||
String endLocation = params.get("endLocation") != null ? (String) params.get("endLocation") : null;
|
||||
String firmPrice = params.get("firmPrice") != null ? (String) params.get("firmPrice") : null;
|
||||
|
||||
logger.info("分页查询订单列表,页码:{},每页数量:{},买方:{},卖方:{},结算方式:{}",
|
||||
pageNum, pageSize, buyerName, sellerName, settlementType);
|
||||
logger.info("分页查询订单列表,页码:{},每页数量:{},买方:{},卖方:{},结算方式:{},运单号:{},起始地:{},目的地:{},单价:{}",
|
||||
pageNum, pageSize, buyerName, sellerName, settlementType, deliveryNumber, startLocation, endLocation, firmPrice);
|
||||
|
||||
// 构建查询条件
|
||||
LambdaQueryWrapper<Order> queryWrapper = new LambdaQueryWrapper<>();
|
||||
@@ -86,9 +93,13 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
|
||||
|
||||
queryWrapper.orderByDesc(Order::getCreateTime);
|
||||
|
||||
// 判断是否需要先过滤再分页(如果提供了买方或卖方名称搜索)
|
||||
// 判断是否需要先过滤再分页(如果提供了买方、卖方、运单号、起始地、目的地、单价搜索)
|
||||
boolean needFilter = (buyerName != null && !buyerName.trim().isEmpty()) ||
|
||||
(sellerName != null && !sellerName.trim().isEmpty());
|
||||
(sellerName != null && !sellerName.trim().isEmpty()) ||
|
||||
(deliveryNumber != null && !deliveryNumber.trim().isEmpty()) ||
|
||||
(startLocation != null && !startLocation.trim().isEmpty()) ||
|
||||
(endLocation != null && !endLocation.trim().isEmpty()) ||
|
||||
(firmPrice != null && !firmPrice.trim().isEmpty());
|
||||
|
||||
List<Order> filteredList;
|
||||
long total;
|
||||
@@ -112,6 +123,32 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
|
||||
.filter(order -> order.getSellerName() != null && order.getSellerName().contains(sellerName.trim()))
|
||||
.collect(java.util.stream.Collectors.toList());
|
||||
}
|
||||
if (deliveryNumber != null && !deliveryNumber.trim().isEmpty()) {
|
||||
filteredList = filteredList.stream()
|
||||
.filter(order -> order.getDeliveryNumber() != null && order.getDeliveryNumber().contains(deliveryNumber.trim()))
|
||||
.collect(java.util.stream.Collectors.toList());
|
||||
}
|
||||
if (startLocation != null && !startLocation.trim().isEmpty()) {
|
||||
filteredList = filteredList.stream()
|
||||
.filter(order -> order.getStartLocation() != null && order.getStartLocation().contains(startLocation.trim()))
|
||||
.collect(java.util.stream.Collectors.toList());
|
||||
}
|
||||
if (endLocation != null && !endLocation.trim().isEmpty()) {
|
||||
filteredList = filteredList.stream()
|
||||
.filter(order -> order.getEndLocation() != null && order.getEndLocation().contains(endLocation.trim()))
|
||||
.collect(java.util.stream.Collectors.toList());
|
||||
}
|
||||
if (firmPrice != null && !firmPrice.trim().isEmpty()) {
|
||||
filteredList = filteredList.stream()
|
||||
.filter(order -> {
|
||||
java.math.BigDecimal price = order.getFirmPriceFromDelivery() != null ? order.getFirmPriceFromDelivery() : order.getFirmPrice();
|
||||
if (price == null) {
|
||||
return false;
|
||||
}
|
||||
return price.toString().contains(firmPrice.trim());
|
||||
})
|
||||
.collect(java.util.stream.Collectors.toList());
|
||||
}
|
||||
|
||||
// 获取总数
|
||||
total = filteredList.size();
|
||||
@@ -143,6 +180,45 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
|
||||
logger.info("查询到{}条订单记录,分页后{}条", total, filteredList.size());
|
||||
}
|
||||
|
||||
// 优化排序:按运送清单分组排序
|
||||
// 排序规则:1. 有deliveryId的订单按deliveryId分组,相同deliveryId的订单放在一起
|
||||
// 2. 按deliveryId排序(null值放在最后)
|
||||
// 3. 同一deliveryId内的订单按创建时间排序
|
||||
filteredList.sort((o1, o2) -> {
|
||||
Integer deliveryId1 = o1.getDeliveryId();
|
||||
Integer deliveryId2 = o2.getDeliveryId();
|
||||
|
||||
// 如果两个订单都没有deliveryId,按创建时间倒序
|
||||
if (deliveryId1 == null && deliveryId2 == null) {
|
||||
if (o1.getCreateTime() != null && o2.getCreateTime() != null) {
|
||||
return o2.getCreateTime().compareTo(o1.getCreateTime());
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
// 如果只有一个订单有deliveryId,有deliveryId的排在前面
|
||||
if (deliveryId1 == null) {
|
||||
return 1; // o1排在后面
|
||||
}
|
||||
if (deliveryId2 == null) {
|
||||
return -1; // o2排在后面
|
||||
}
|
||||
|
||||
// 两个订单都有deliveryId,先按deliveryId排序
|
||||
int deliveryIdCompare = deliveryId1.compareTo(deliveryId2);
|
||||
if (deliveryIdCompare != 0) {
|
||||
return deliveryIdCompare;
|
||||
}
|
||||
|
||||
// deliveryId相同,按创建时间倒序
|
||||
if (o1.getCreateTime() != null && o2.getCreateTime() != null) {
|
||||
return o2.getCreateTime().compareTo(o1.getCreateTime());
|
||||
}
|
||||
return 0;
|
||||
});
|
||||
|
||||
logger.info("订单列表排序完成,共{}条记录", filteredList.size());
|
||||
|
||||
// 构建分页结果
|
||||
return new PageResultResponse<>(total, filteredList);
|
||||
}
|
||||
@@ -336,6 +412,7 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
|
||||
java.util.Set<Integer> buyerIds = new java.util.HashSet<>();
|
||||
java.util.Set<Integer> sellerIds = new java.util.HashSet<>();
|
||||
java.util.Set<Integer> creatorIds = new java.util.HashSet<>();
|
||||
java.util.Set<Integer> deliveryIds = new java.util.HashSet<>();
|
||||
|
||||
for (Order order : orders) {
|
||||
// 收集买方ID
|
||||
@@ -368,6 +445,10 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
|
||||
if (order.getCreatedBy() != null) {
|
||||
creatorIds.add(order.getCreatedBy());
|
||||
}
|
||||
// 收集运送清单ID
|
||||
if (order.getDeliveryId() != null) {
|
||||
deliveryIds.add(order.getDeliveryId());
|
||||
}
|
||||
}
|
||||
|
||||
// 批量查询买方信息
|
||||
@@ -427,6 +508,21 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
|
||||
}
|
||||
}
|
||||
|
||||
// 批量查询运送清单信息
|
||||
java.util.Map<Integer, com.aiotagro.cattletrade.business.entity.Delivery> deliveryMap = new java.util.HashMap<>();
|
||||
if (!deliveryIds.isEmpty()) {
|
||||
try {
|
||||
List<com.aiotagro.cattletrade.business.entity.Delivery> deliveryList = deliveryMapper.selectBatchIds(new ArrayList<>(deliveryIds));
|
||||
for (com.aiotagro.cattletrade.business.entity.Delivery delivery : deliveryList) {
|
||||
if (delivery != null && delivery.getId() != null) {
|
||||
deliveryMap.put(delivery.getId(), delivery);
|
||||
}
|
||||
}
|
||||
} catch (Exception e) {
|
||||
logger.warn("批量查询运送清单信息失败:{}", e.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
// 批量填充订单信息
|
||||
for (Order order : orders) {
|
||||
// 填充买方名称
|
||||
@@ -473,6 +569,24 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
|
||||
}
|
||||
}
|
||||
|
||||
// 填充运送清单信息
|
||||
if (order.getDeliveryId() != null) {
|
||||
com.aiotagro.cattletrade.business.entity.Delivery delivery = deliveryMap.get(order.getDeliveryId());
|
||||
if (delivery != null) {
|
||||
order.setDeliveryNumber(delivery.getDeliveryNumber());
|
||||
order.setStartLocation(delivery.getStartLocation());
|
||||
order.setEndLocation(delivery.getEndLocation());
|
||||
order.setDeliveryStatus(delivery.getStatus());
|
||||
// 如果订单本身没有firmPrice,使用运送清单的firmPrice
|
||||
if (order.getFirmPrice() == null && delivery.getFirmPrice() != null) {
|
||||
order.setFirmPriceFromDelivery(java.math.BigDecimal.valueOf(delivery.getFirmPrice()));
|
||||
} else if (delivery.getFirmPrice() != null) {
|
||||
// 如果订单有firmPrice,也填充运送清单的firmPrice用于显示
|
||||
order.setFirmPriceFromDelivery(java.math.BigDecimal.valueOf(delivery.getFirmPrice()));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 填充结算方式描述
|
||||
if (order.getSettlementType() != null) {
|
||||
switch (order.getSettlementType()) {
|
||||
@@ -672,5 +786,87 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
|
||||
return AjaxResult.success("批量导入完成:成功" + successCount + "条,失败" + failCount + "条", result);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 批量更新订单的delivery_id字段
|
||||
*
|
||||
* @param deliveryId 运送清单ID
|
||||
* @param orderIds 订单ID列表
|
||||
* @return AjaxResult
|
||||
*/
|
||||
@Override
|
||||
@Transactional
|
||||
public AjaxResult updateOrderDeliveryId(Integer deliveryId, List<Integer> orderIds) {
|
||||
try {
|
||||
logger.info("批量更新订单delivery_id,运送清单ID:{},订单ID列表:{}", deliveryId, orderIds);
|
||||
|
||||
if (orderIds == null || orderIds.isEmpty()) {
|
||||
logger.warn("订单ID列表为空,跳过更新");
|
||||
return AjaxResult.success("订单ID列表为空,无需更新");
|
||||
}
|
||||
|
||||
if (deliveryId == null) {
|
||||
logger.error("运送清单ID不能为空");
|
||||
return AjaxResult.error("运送清单ID不能为空");
|
||||
}
|
||||
|
||||
// 批量更新订单的delivery_id
|
||||
int successCount = 0;
|
||||
int failCount = 0;
|
||||
List<String> failMessages = new ArrayList<>();
|
||||
|
||||
for (Integer orderId : orderIds) {
|
||||
try {
|
||||
Order order = orderMapper.selectById(orderId);
|
||||
if (order == null) {
|
||||
failCount++;
|
||||
failMessages.add("订单ID " + orderId + " 不存在");
|
||||
logger.warn("订单不存在,ID:{}", orderId);
|
||||
continue;
|
||||
}
|
||||
|
||||
order.setDeliveryId(deliveryId);
|
||||
order.setUpdateTime(new Date());
|
||||
try {
|
||||
order.setUpdatedBy(SecurityUtil.getCurrentUserId());
|
||||
} catch (Exception e) {
|
||||
logger.warn("获取当前用户失败,使用订单原有创建人:{}", e.getMessage());
|
||||
if (order.getCreatedBy() != null) {
|
||||
order.setUpdatedBy(order.getCreatedBy());
|
||||
}
|
||||
}
|
||||
|
||||
int result = orderMapper.updateById(order);
|
||||
if (result > 0) {
|
||||
successCount++;
|
||||
logger.info("更新订单delivery_id成功,订单ID:{},运送清单ID:{}", orderId, deliveryId);
|
||||
} else {
|
||||
failCount++;
|
||||
failMessages.add("订单ID " + orderId + " 更新失败");
|
||||
logger.warn("更新订单delivery_id失败,订单ID:{}", orderId);
|
||||
}
|
||||
} catch (Exception e) {
|
||||
failCount++;
|
||||
failMessages.add("订单ID " + orderId + " 更新异常:" + e.getMessage());
|
||||
logger.error("更新订单delivery_id异常,订单ID:{},错误:{}", orderId, e.getMessage(), e);
|
||||
}
|
||||
}
|
||||
|
||||
logger.info("批量更新订单delivery_id完成,成功:{}条,失败:{}条", successCount, failCount);
|
||||
|
||||
if (failCount == 0) {
|
||||
return AjaxResult.success("批量更新成功,共更新" + successCount + "条订单");
|
||||
} else {
|
||||
Map<String, Object> result = new java.util.HashMap<>();
|
||||
result.put("successCount", successCount);
|
||||
result.put("failCount", failCount);
|
||||
result.put("failMessages", failMessages);
|
||||
return AjaxResult.success("批量更新完成:成功" + successCount + "条,失败" + failCount + "条", result);
|
||||
}
|
||||
} catch (Exception e) {
|
||||
logger.error("批量更新订单delivery_id异常:{}", e.getMessage(), e);
|
||||
return AjaxResult.error("批量更新订单delivery_id失败:" + e.getMessage());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,14 @@
|
||||
USE cattletrade;
|
||||
|
||||
-- 修改 delivery 表的 order_id 字段类型为 VARCHAR,用于存储多个订单ID(逗号分隔)
|
||||
-- 将原来的 INTEGER 类型改为 VARCHAR(500),支持存储多个订单ID,如 "1,2,3"
|
||||
|
||||
-- 注意:如果表中已有数据,需要先将现有的 order_id 值转换为字符串格式
|
||||
-- 例如:如果 order_id = 123,转换后仍为 "123"
|
||||
|
||||
ALTER TABLE `delivery`
|
||||
MODIFY COLUMN `order_id` VARCHAR(500) NULL DEFAULT NULL COMMENT '订单ID(多个订单ID用逗号分隔,如:1,2,3)';
|
||||
|
||||
-- 如果表中已有数据,将现有的整数 order_id 转换为字符串格式
|
||||
-- UPDATE delivery SET order_id = CAST(order_id AS CHAR) WHERE order_id IS NOT NULL;
|
||||
|
||||
Reference in New Issue
Block a user