Procházet zdrojové kódy

接站服务增加一键核销

jinch před 1 týdnem
rodič
revize
c03bd0029b

+ 7 - 0
ship-module-trade/ship-module-trade-biz/src/main/java/com/yc/ship/module/trade/controller/admin/orderjzdetail/OrderJzDetailController.java

@@ -283,6 +283,13 @@ public class OrderJzDetailController {
     return success(orderJzDetailService.signOrderJzDetail(createReqVO));
   }
 
+  @PostMapping("/visitor/batch-sign")
+  @Operation(summary = "批量核销(一键核销)")
+  public CommonResult<Integer> batchVisitorSign(@Valid @RequestBody OrderJzDetailBatchSignReqVO reqVO) {
+    int count = orderJzDetailService.batchSignOrderJzDetail(reqVO.getIds(), reqVO.getSignRemark());
+    return success(count);
+  }
+
 
   @DeleteMapping("/visitor/sign/clean")
   @Operation(summary = "游客登记")

+ 19 - 0
ship-module-trade/ship-module-trade-biz/src/main/java/com/yc/ship/module/trade/controller/admin/orderjzdetail/vo/OrderJzDetailBatchSignReqVO.java

@@ -0,0 +1,19 @@
+package com.yc.ship.module.trade.controller.admin.orderjzdetail.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import javax.validation.constraints.NotEmpty;
+import java.util.List;
+
+@Schema(description = "管理后台 - 批量核销请求 VO")
+@Data
+public class OrderJzDetailBatchSignReqVO {
+
+    @Schema(description = "接站人员ID列表", requiredMode = Schema.RequiredMode.REQUIRED)
+    @NotEmpty(message = "请选择需要核销的游客")
+    private List<Long> ids;
+
+    @Schema(description = "核销备注", example = "批量核销")
+    private String signRemark;
+}

+ 10 - 0
ship-module-trade/ship-module-trade-biz/src/main/java/com/yc/ship/module/trade/service/orderjzdetail/OrderJzDetailService.java

@@ -63,6 +63,16 @@ public interface OrderJzDetailService {
 
   Long signOrderJzDetail(OrderJzDetailSaveReqVO createReqVO);
 
+  /**
+   * 批量核销(一键核销)
+   * 对已选中的接站人员进行批量签到核销,已核销的跳过
+   *
+   * @param ids 接站人员ID列表
+   * @param signRemark 签到备注
+   * @return 实际核销成功数量
+   */
+  int batchSignOrderJzDetail(List<Long> ids, String signRemark);
+
   PageResult<OrderJzDetailDO> getOrderJzDetailPage2(OrderJzDetailPageReqVO pageReqVO);
 
   PageResult<?> getOrderJzDetailPage3(OrderJzDetailPageReqVO pageReqVO);

+ 36 - 0
ship-module-trade/ship-module-trade-biz/src/main/java/com/yc/ship/module/trade/service/orderjzdetail/OrderJzDetailServiceImpl.java

@@ -446,6 +446,42 @@ public class OrderJzDetailServiceImpl implements OrderJzDetailService {
         return detail.getId();
     }
 
+    @Override
+    public int batchSignOrderJzDetail(List<Long> ids, String signRemark) {
+        if (ids == null || ids.isEmpty()) {
+            return 0;
+        }
+        // 批量查询
+        List<OrderJzDetailDO> detailList = orderJzDetailMapper.selectBatchIds(ids);
+        if (detailList == null || detailList.isEmpty()) {
+            return 0;
+        }
+
+        // 检查已核销的人员,收集名称用于提示
+        List<String> alreadySignedNames = detailList.stream()
+                .filter(d -> StringUtils.isNotBlank(d.getSignTime()))
+                .map(OrderJzDetailDO::getName)
+                .collect(Collectors.toList());
+        if (!alreadySignedNames.isEmpty()) {
+            throw new RuntimeException("以下游客已核销,请勿重复核销:" + String.join("、", alreadySignedNames));
+        }
+
+        // 获取当前登录人信息
+        LoginUser loginUser = getLoginUser();
+        String signMan = MapUtils.getString(loginUser.getInfo(), LoginUser.INFO_KEY_NICKNAME);
+        String signTime = DateUtils.format(new Date(), DatePattern.NORM_DATETIME_PATTERN);
+
+        int count = 0;
+        for (OrderJzDetailDO detail : detailList) {
+            detail.setSignTime(signTime);
+            detail.setSignMan(signMan);
+            detail.setSignRemark(signRemark);
+            orderJzDetailMapper.updateById(detail);
+            count++;
+        }
+        return count;
+    }
+
     @Override
     public PageResult<OrderJzDetailDO> getOrderJzDetailPage2(OrderJzDetailPageReqVO pageReqVO) {
         IPage<OrderJzDetailDO> page = new Page<>(pageReqVO.getPageNo(), pageReqVO.getPageSize());

+ 23 - 3
ship-module-trade/ship-module-trade-biz/src/main/java/com/yc/ship/module/trade/service/orderjzdetail/OrderJzDispatchServiceImpl.java

@@ -13,6 +13,7 @@ import com.yc.ship.module.trade.dal.dataobject.orderjzdetail.OrderJzDetailDO;
 import com.yc.ship.module.trade.dal.dataobject.orderjzdispatch.OrderJzDispatchDO;
 import com.yc.ship.module.trade.dal.mysql.orderjzdetail.OrderJzDetailMapper;
 import com.yc.ship.module.trade.dal.mysql.orderjzdispatch.OrderJzDispatchMapper;
+import org.apache.commons.lang3.ObjectUtils;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.validation.annotation.Validated;
@@ -93,7 +94,7 @@ public class OrderJzDispatchServiceImpl implements OrderJzDispatchService {
         if (existingList != null && !existingList.isEmpty()) {
             // 已存在分车记录,更新并复用
             OrderJzDispatchDO existing = existingList.get(0);
-           /* OrderJzDispatchDO updateObj = OrderJzDispatchDO.builder()
+            OrderJzDispatchDO updateObj = OrderJzDispatchDO.builder()
                     .id(existing.getId())
                     .busNumber(info.getBusNumber())
                     .driverName(info.getDriverName())
@@ -103,7 +104,7 @@ public class OrderJzDispatchServiceImpl implements OrderJzDispatchService {
                     .passengerCount(existing.getPassengerCount() + batchReqVO.getOrderItems().size())
                     .remark(info.getRemark())
                     .build();
-            orderJzDispatchMapper.updateById(updateObj);*/
+            orderJzDispatchMapper.updateById(updateObj);
             dispatchId = existing.getId();
         } else {
             // 不存在,新建分车记录
@@ -125,6 +126,24 @@ public class OrderJzDispatchServiceImpl implements OrderJzDispatchService {
             dispatchId = orderJzDispatch.getId();
         }
 
+        // 校验并更新接站人员的分车ID
+        StringBuilder alreadyDispatchedNames = new StringBuilder();
+        for (OrderJzDispatchBatchReqVO.OrderItem item : batchReqVO.getOrderItems()) {
+            OrderJzDetailDO detail = orderJzDetailMapper.selectById(item.getId());
+            if (detail != null) {
+                // 校验是否已分车(dispatchId不为空且不为0表示已分车)
+                if (detail.getDispatchId() != null && detail.getDispatchId() != 0L) {
+                    if (alreadyDispatchedNames.length() > 0) {
+                        alreadyDispatchedNames.append("、");
+                    }
+                    alreadyDispatchedNames.append(detail.getName());
+                }
+            }
+        }
+        if (alreadyDispatchedNames.length() > 0) {
+            throw new RuntimeException("以下游客已分车,不能重复分车:" + alreadyDispatchedNames.toString());
+        }
+
         // 更新接站人员的分车ID
         for (OrderJzDispatchBatchReqVO.OrderItem item : batchReqVO.getOrderItems()) {
             OrderJzDetailDO detail = orderJzDetailMapper.selectById(item.getId());
@@ -175,7 +194,8 @@ public class OrderJzDispatchServiceImpl implements OrderJzDispatchService {
         if (dispatchId != null) {
 
             OrderJzDispatchDO orderJzDis = orderJzDispatchMapper.selectById(dispatchId);
-            Integer passengerCount = orderJzDis.getPassengerCount();
+
+            Integer passengerCount = ObjectUtils.isEmpty(orderJzDis) ? 0 : orderJzDis.getPassengerCount();
             if (passengerCount != null && passengerCount > 1) {
                 // 大于一人 更新分车记录表
                 orderJzDispatchMapper.updateById(OrderJzDispatchDO.builder()

+ 4 - 4
ship-module-trade/ship-module-trade-biz/src/main/resources/mapper/orderjzdetail/OrderJzDetailMapper.xml

@@ -13,7 +13,7 @@
         select distinct d.* , r.direction , rm.name as room_model_name,
         SUBSTRING_INDEX(o.order_no, '-', -1) as orderNo, dj.dispatch_no as dispatchNo, dj.group_no as groupNo,
         dj.bus_number as busNumber, dj.driver_name as driverName, dj.driver_phone as driverPhone,
-        dj.receiver_name as receiverName, dj.receiver_phone as receiverPhone, dj.remark as dispatchRemark
+        dj.receiver_name as receiverName, dj.receiver_phone as receiverPhone, d.sign_remark as dispatchRemark
         from trade_order_jz_detail d
         inner join trade_order_jz oz on d.jz_id = oz.id
         inner join trade_order o on o.deleted = 0 and o.id = oz.order_id
@@ -52,7 +52,7 @@
     <select id="selectVisitorExportList"
             resultType="com.yc.ship.module.trade.dal.dataobject.orderjzdetail.OrderJzDetailDO">
         select distinct d.* , r.direction , rm.name as room_model_name,
-        SUBSTRING_INDEX(o.order_no, '-', -1) as orderNo, dj.dispatch_no as dispatchNo, dj.group_no as groupNo, dj.bus_number as busNumber,dj.driver_name as driverName,dj.driver_phone as driverPhone,dj.receiver_name as receiverName,dj.receiver_phone as receiverPhone,dj.remark as dispatchRemark
+        SUBSTRING_INDEX(o.order_no, '-', -1) as orderNo, dj.dispatch_no as dispatchNo, dj.group_no as groupNo, dj.bus_number as busNumber,dj.driver_name as driverName,dj.driver_phone as driverPhone,dj.receiver_name as receiverName,dj.receiver_phone as receiverPhone,d.sign_remark as dispatchRemark
         from trade_order_jz_detail d
         inner join trade_order_jz oz on d.jz_id = oz.id
         inner join trade_order o on o.deleted = 0 and o.id = oz.order_id
@@ -114,7 +114,7 @@
         select distinct d.* , r.direction , rm.name as room_model_name,
         SUBSTRING_INDEX(o.order_no, '-', -1) as orderNo, dj.dispatch_no as dispatchNo, dj.group_no as groupNo,
         dj.bus_number as busNumber, dj.driver_name as driverName, dj.driver_phone as driverPhone,
-        dj.receiver_name as receiverName, dj.receiver_phone as receiverPhone, dj.remark as dispatchRemark
+        dj.receiver_name as receiverName, dj.receiver_phone as receiverPhone, d.sign_remark as dispatchRemark
         from trade_order_jz_detail d
         inner join trade_order_jz oz on d.jz_id = oz.id
         inner join trade_order o on o.deleted = 0 and o.id = oz.order_id
@@ -159,7 +159,7 @@
     <select id="selectGiftExportList"
             resultType="com.yc.ship.module.trade.dal.dataobject.orderjzdetail.OrderJzDetailDO">
         select distinct d.* , r.direction , rm.name as room_model_name,
-        SUBSTRING_INDEX(o.order_no, '-', -1) as orderNo, dj.dispatch_no as dispatchNo, dj.group_no as groupNo, dj.bus_number as busNumber,dj.driver_name as driverName,dj.driver_phone as driverPhone,dj.receiver_name as receiverName,dj.receiver_phone as receiverPhone,dj.remark as dispatchRemark
+        SUBSTRING_INDEX(o.order_no, '-', -1) as orderNo, dj.dispatch_no as dispatchNo, dj.group_no as groupNo, dj.bus_number as busNumber,dj.driver_name as driverName,dj.driver_phone as driverPhone,dj.receiver_name as receiverName,dj.receiver_phone as receiverPhone,d.sign_remark as dispatchRemark
         from trade_order_jz_detail d
         inner join trade_order_jz oz on d.jz_id = oz.id
         inner join trade_order o on o.deleted = 0 and o.id = oz.order_id