提交
This commit is contained in:
+6
-8
@@ -1,13 +1,14 @@
|
||||
package com.baiyue.lastleg.fleet.pickup;
|
||||
|
||||
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
||||
import com.baiyue.lastleg.transfer.entity.WarehouseTransferOrder;
|
||||
import org.apache.ibatis.annotations.*;
|
||||
import java.util.List;
|
||||
|
||||
/** 取货持久化只访问 Lastleg 自有库,客户与原业务号始终成对使用。 */
|
||||
@Mapper
|
||||
public interface FleetPickupMapper extends BaseMapper<FleetPickupTask> {
|
||||
String SOURCE_COLUMNS = "id,customer_id,transfer_no,inbound_code,lastleg_order_no,operating_warehouse_id,"
|
||||
+ "delivery_address,pickup_contact_name,pickup_contact_phone,package_count,status,delivery_method";
|
||||
String ELIGIBLE = " FROM ll_warehouse_transfer_order w LEFT JOIN ll_fleet_pickup_task p ON p.transfer_order_id=w.id "
|
||||
+ "WHERE w.delivery_method='WAREHOUSE_PICKUP' AND w.transfer_no=w.inbound_code "
|
||||
+ "AND w.status='WAIT_PDA_RECEIVING' AND (p.transfer_order_id IS NULL OR p.trip_no IS NULL) "
|
||||
@@ -21,14 +22,11 @@ public interface FleetPickupMapper extends BaseMapper<FleetPickupTask> {
|
||||
@Select("SELECT COUNT(*)" + ELIGIBLE)
|
||||
long countCandidates(@Param("keyword") String keyword);
|
||||
/** 锁定源订单,串行化补箱、清点与取货任务关联。 */
|
||||
@Select("SELECT * FROM ll_warehouse_transfer_order WHERE customer_id=#{customer} AND transfer_no=#{number} FOR UPDATE")
|
||||
WarehouseTransferOrder lockSource(@Param("customer") String customer,@Param("number") String number);
|
||||
@Select("SELECT " + SOURCE_COLUMNS + " FROM ll_warehouse_transfer_order WHERE customer_id=#{customer} AND transfer_no=#{number} FOR UPDATE")
|
||||
FleetPickupSource lockSource(@Param("customer") String customer,@Param("number") String number);
|
||||
/** 读取明确客户下的源订单,不接收来自客户端的客户范围推断。 */
|
||||
@Select("SELECT * FROM ll_warehouse_transfer_order WHERE customer_id=#{customer} AND transfer_no=#{number}")
|
||||
WarehouseTransferOrder source(@Param("customer") String customer,@Param("number") String number);
|
||||
/** PDA 作业仍按已绑定海外仓锁定原单。 */
|
||||
@Select("SELECT * FROM ll_warehouse_transfer_order WHERE operating_warehouse_id=#{warehouse} AND transfer_no=#{number} FOR UPDATE")
|
||||
WarehouseTransferOrder lockPdaSource(@Param("warehouse") String warehouse,@Param("number") String number);
|
||||
@Select("SELECT " + SOURCE_COLUMNS + " FROM ll_warehouse_transfer_order WHERE customer_id=#{customer} AND transfer_no=#{number}")
|
||||
FleetPickupSource source(@Param("customer") String customer,@Param("number") String number);
|
||||
/** 读取取货任务,原订单锁负责同票并发互斥。 */
|
||||
@Select("SELECT * FROM ll_fleet_pickup_task WHERE transfer_order_id=#{id}")
|
||||
FleetPickupTask task(@Param("id") long id);
|
||||
|
||||
+1
-4
@@ -2,7 +2,6 @@ package com.baiyue.lastleg.fleet.pickup;
|
||||
|
||||
import com.baiyue.lastleg.fleet.trip.FleetTripEntity;
|
||||
import com.baiyue.lastleg.fleet.trip.FleetTripMapper;
|
||||
import com.baiyue.lastleg.transfer.entity.WarehouseTransferOrder;
|
||||
import org.springframework.stereotype.Repository;
|
||||
import java.util.List;
|
||||
|
||||
@@ -18,9 +17,7 @@ public class FleetPickupRepository {
|
||||
/** 查询匹配需求总数。 */
|
||||
public long count(String keyword) { return mapper.countCandidates(keyword); }
|
||||
/** 读取或锁定客户原单。 */
|
||||
public WarehouseTransferOrder source(String customer,String number,boolean lock) { return lock?mapper.lockSource(customer,number):mapper.source(customer,number); }
|
||||
/** 按 PDA 仓库范围锁定原单。 */
|
||||
public WarehouseTransferOrder pdaSource(String warehouse,String number) { return mapper.lockPdaSource(warehouse,number); }
|
||||
public FleetPickupSource source(String customer,String number,boolean lock) { return lock?mapper.lockSource(customer,number):mapper.source(customer,number); }
|
||||
/** 读取原单唯一取货记录。 */
|
||||
public FleetPickupTask task(long id) { return mapper.task(id); }
|
||||
/** 读取车次全部取货成员。 */
|
||||
|
||||
+7
-16
@@ -6,7 +6,6 @@ import com.baiyue.lastleg.fleet.driver.FleetWarehouseDirectory;
|
||||
import com.baiyue.lastleg.fleet.reporting.TripOperationsEvidenceGateway;
|
||||
import com.baiyue.lastleg.fleet.trip.*;
|
||||
import com.baiyue.lastleg.masterdata.vehicle.application.port.out.VehicleRepository;
|
||||
import com.baiyue.lastleg.transfer.entity.WarehouseTransferOrder;
|
||||
import com.fasterxml.jackson.core.type.TypeReference;
|
||||
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||
import org.springframework.http.HttpStatus;
|
||||
@@ -59,7 +58,7 @@ public class FleetPickupService {
|
||||
var sources=request.sources().stream().sorted(Comparator.comparing(FleetPickupModels.Source::customerId)
|
||||
.thenComparing(FleetPickupModels.Source::transferNo)).toList();
|
||||
if(new HashSet<>(sources).size()!=sources.size())throw bad("同一取货单不能重复选择");
|
||||
var orders=new ArrayList<WarehouseTransferOrder>();
|
||||
var orders=new ArrayList<FleetPickupSource>();
|
||||
for(var source:sources) {
|
||||
var order=source(source.customerId(),source.transferNo(),true);eligible(order);
|
||||
// 相同请求并发等待原单锁后,允许返回第一次已经成功的车次。
|
||||
@@ -107,18 +106,10 @@ public class FleetPickupService {
|
||||
if(!"WAREHOUSE_PICKUP".equals(source.getDeliveryMethod()) || !source.getTransferNo().equals(source.getInboundCode()))return null;
|
||||
return project(source,repository.task(source.getId()));
|
||||
}
|
||||
/** PDA 开始作业前校验已送仓,防止把司机取货冒充仓库实收。 */
|
||||
public WarehouseTransferOrder requireMeasuringSource(String warehouse,String number) {
|
||||
var source=repository.pdaSource(warehouse,number);
|
||||
if(source==null)throw missing("仓储转运单不存在");
|
||||
if(!"WAIT_PDA_RECEIVING".equals(source.getStatus()))throw conflict("当前转运单不允许测量");
|
||||
requireArrived(source);
|
||||
return source;
|
||||
}
|
||||
/** 已有原单行锁的清点、照片和完成入口复用相同到仓门禁。 */
|
||||
public void requireArrived(WarehouseTransferOrder source) {
|
||||
if("WAREHOUSE_PICKUP".equals(source.getDeliveryMethod()) && source.getTransferNo().equals(source.getInboundCode())) {
|
||||
var task=repository.task(source.getId());
|
||||
public void requireArrived(Long sourceId,String deliveryMethod,String transferNo,String inboundCode) {
|
||||
if("WAREHOUSE_PICKUP".equals(deliveryMethod) && transferNo.equals(inboundCode)) {
|
||||
var task=repository.task(sourceId);
|
||||
if(task==null || !"ARRIVED".equals(task.getStatus()))throw conflict("该单为仓库上门取货,请先完成车辆取货送仓");
|
||||
}
|
||||
}
|
||||
@@ -198,7 +189,7 @@ public class FleetPickupService {
|
||||
var trip=pickupTrip(task.getTripNo(),false);return files.download(trip.getId(),fileId);
|
||||
}
|
||||
/** 组装运输进度,车次资源修改后自然回显最新分配。 */
|
||||
private FleetPickupModels.Task project(WarehouseTransferOrder source,FleetPickupTask task) {
|
||||
private FleetPickupModels.Task project(FleetPickupSource source,FleetPickupTask task) {
|
||||
var trip=task==null || task.getTripNo()==null?null:repository.trip(task.getTripNo(),false);
|
||||
String status=task==null || task.getTripNo()==null?("PENDING_REVIEW".equals(source.getStatus()) || "DRAFT".equals(source.getStatus())?"PENDING_REVIEW":"WAITING"):task.getStatus();
|
||||
return new FleetPickupModels.Task(source.getCustomerId(),source.getTransferNo(),source.getLastlegOrderNo(),source.getOperatingWarehouseId(),
|
||||
@@ -215,11 +206,11 @@ public class FleetPickupService {
|
||||
if(task==null || !trip.getTripNo().equals(task.getTripNo()))throw missing("当前车次没有该取货订单");return task;
|
||||
}
|
||||
/** 按客户与单号读取原订单。 */
|
||||
private WarehouseTransferOrder source(String customer,String number,boolean lock) {
|
||||
private FleetPickupSource source(String customer,String number,boolean lock) {
|
||||
var source=repository.source(customer,number,lock);if(source==null)throw missing("仓储转运单不存在");return source;
|
||||
}
|
||||
/** 原业务资格每次执行复核,禁止未审、自送、库存转运和已完成测量单进入。 */
|
||||
private static void eligible(WarehouseTransferOrder order) {
|
||||
private static void eligible(FleetPickupSource order) {
|
||||
if(!"WAREHOUSE_PICKUP".equals(order.getDeliveryMethod()) || !order.getTransferNo().equals(order.getInboundCode())
|
||||
|| !"WAIT_PDA_RECEIVING".equals(order.getStatus()))throw conflict("该单不是已审核待收货的仓库上门取货单");
|
||||
if(blank(order.getDeliveryAddress())==null || blank(order.getPickupContactName())==null || blank(order.getPickupContactPhone())==null)
|
||||
|
||||
@@ -0,0 +1,20 @@
|
||||
package com.baiyue.lastleg.fleet.pickup;
|
||||
|
||||
import lombok.Data;
|
||||
|
||||
/** 车队只读取货资格和展示所需来源摘要,不共享转运领域实体或写入原订单。 */
|
||||
@Data
|
||||
public class FleetPickupSource {
|
||||
private Long id;
|
||||
private String customerId;
|
||||
private String transferNo;
|
||||
private String inboundCode;
|
||||
private String lastlegOrderNo;
|
||||
private String operatingWarehouseId;
|
||||
private String deliveryAddress;
|
||||
private String pickupContactName;
|
||||
private String pickupContactPhone;
|
||||
private Integer packageCount;
|
||||
private String status;
|
||||
private String deliveryMethod;
|
||||
}
|
||||
Reference in New Issue
Block a user