Bladeren bron

新增pc端司机管理功能

donglang 1 maand geleden
bovenliggende
commit
a8033f26a1

+ 9 - 0
sckw-modules-api/sckw-transport-api/src/main/java/com/sckw/transport/api/dubbo/TransportRemoteService.java

@@ -190,4 +190,13 @@ public interface TransportRemoteService {
      *@return 运单
      */
     List<RWaybillSubOrderVo> queryWaybillOrderByLogContractIds(Set<Long> logContractIds);
+
+    /**
+     * 查询司机的当天完成量、7天完成量、30天完成量
+     * @param entId 企业id
+     *@return 运单
+     */
+    WaybillOrderTaskVO queryWaybillOrderTaskByDriverId(Long entId, Long driverId);
+
+
 }

+ 34 - 0
sckw-modules-api/sckw-transport-api/src/main/java/com/sckw/transport/api/model/vo/WaybillOrderTaskVO.java

@@ -0,0 +1,34 @@
+package com.sckw.transport.api.model.vo;
+
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+
+/**
+ * @author lfdc
+ * @description 对账页面需要数据vo
+ * @date 2023-07-21 17:07:15
+ */
+@Data
+public class WaybillOrderTaskVO implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = -8891480962893968919L;
+
+    /**
+     * 当日完成任务量
+     */
+    private int todayTaskAmount;
+
+    /**
+     * 7日完成任务量
+     */
+    private int weeklyTaskAmount;
+
+    /**
+     * 30日完成任务量
+     */
+    private int monthlyTaskAmount;
+
+}

+ 13 - 0
sckw-modules/sckw-fleet/src/main/java/com/sckw/fleet/controller/KwfDriverController.java

@@ -335,4 +335,17 @@ public class KwfDriverController {
         return BaseResult.success();
     }
 
+    /**
+     * 解绑车辆
+     *
+     * @param param
+     * @return
+     */
+    @Operation(summary = "解绑车辆", description = "解绑车辆")
+    @PostMapping("/unbindTruck")
+    public BaseResult unbindTruck(@RequestParam KwfBindTruckDto param){
+        driverService.unbindTruck(param);
+        return BaseResult.success();
+    }
+
 }

+ 20 - 0
sckw-modules/sckw-fleet/src/main/java/com/sckw/fleet/model/vo/KwfDriverVo.java

@@ -6,6 +6,7 @@ import com.fasterxml.jackson.annotation.JsonFormat;
 import com.sckw.excel.annotation.ExcelContext;
 import lombok.Data;
 import lombok.experimental.Accessors;
+
 import java.io.Serial;
 import java.io.Serializable;
 import java.util.Date;
@@ -174,6 +175,25 @@ public class KwfDriverVo implements Serializable {
     @ExcelIgnore
     private Integer authStatus;
 
+    /**
+     * 当日完成任务量
+     */
+    @ExcelProperty(value = "备注", index = 18)
+    private int todayTaskAmount;
+
+    /**
+     * 7日完成任务量
+     */
+    @ExcelProperty(value = "备注", index = 19)
+    private int weeklyTaskAmount;
+
+    /**
+     * 30日完成任务量
+     */
+    @ExcelProperty(value = "备注", index = 20)
+    private int monthlyTaskAmount;
+
+
     public String getAuthStatusName() {
         return authStatus == 1 ? "正常" : authStatus == 2 ? "临时" : "异常";
     }

+ 7 - 0
sckw-modules/sckw-fleet/src/main/java/com/sckw/fleet/repository/KwfTruckRepository.java

@@ -117,4 +117,11 @@ public class KwfTruckRepository extends ServiceImpl<KwfTruckMapper, KwfTruck> {
                 .eq(Objects.nonNull(entId),KwfTruck::getEntId, entId)
                 .in(CollectionUtils.isNotEmpty(truckNoList),KwfTruck::getTruckNo, truckNoList));
     }
+
+    public List<KwfTruck> queryTruckByEntId(Long entId) {
+        return list(Wrappers.<KwfTruck>lambdaQuery()
+                .eq(BaseModel::getDelFlag, 0)
+                .eq(KwfTruck::getEntId, entId)
+                .orderByDesc(BaseModel::getCreateTime));
+    }
 }

+ 69 - 23
sckw-modules/sckw-fleet/src/main/java/com/sckw/fleet/service/KwfDriverService.java

@@ -42,8 +42,8 @@ import com.sckw.system.api.model.dto.res.SysDictResDto;
 import com.sckw.system.api.model.dto.res.UserCacheResDto;
 import com.sckw.transport.api.dubbo.TransportRemoteService;
 import com.sckw.transport.api.model.param.CapacityTruckParam;
-import com.sckw.transport.api.model.vo.CapacityTruckVO;
 import com.sckw.transport.api.model.vo.RWaybillOrderVo;
+import com.sckw.transport.api.model.vo.WaybillOrderTaskVO;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.dubbo.config.annotation.DubboReference;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -275,7 +275,7 @@ public class KwfDriverService {
         Map<String, SysDictResDto> dicts = this.dict(dictKey);
 
         /**数据组装**/
-        for (KwfDriverVo driver:drivers) {
+        for (KwfDriverVo driver : drivers) {
             UserCacheResDto user = users == null ? null : users.get(Long.parseLong(driver.getCreateBy()));
             EntCacheResDto ent = ents == null ? null : ents.get(Long.parseLong(driver.getEntId()));
             SysDictResDto licenseType = dicts == null
@@ -288,6 +288,9 @@ public class KwfDriverService {
             KwfTruck truckInfo = getTruckInfo(driver.getId(), driver.getEntId());
             driver.setTruckNo(truckInfo.getTruckNo());
 
+            //获取司机完成量(查询司机的当天完成量、7天完成量、30天完成量)
+            getDriverTaskAmounts(driver.getEntId(), driver.getId(), driver);
+
         }
         return drivers;
     }
@@ -331,6 +334,7 @@ public class KwfDriverService {
         //查询司机关联车辆信息
         KwfTruckReport truckReport = truckReportRepository.getOne(Wrappers.<KwfTruckReport>lambdaQuery()
                 .eq(BaseModel::getDelFlag, 0)
+                .eq(BaseModel::getStatus, 0)
                 .eq(KwfTruckReport::getDriverId, driverId)
                 .eq(KwfTruckReport::getEntId, entId));
         if (truckReport == null) {
@@ -347,12 +351,34 @@ public class KwfDriverService {
         return truck;
     }
 
+
     /**
-     * @param params 查询参数
-     * @desc 查询
-     * @author zk
-     * @date 2023/7/6
-     **/
+     * 查询司机的当天完成量、7天完成量、30天完成量
+     *
+     * @param truck
+     * @param ents
+     * @return
+     */
+    private void getDriverTaskAmounts(String entId, String driverId, KwfDriverVo driver) {
+        if (StringUtils.isEmpty(entId) || StringUtils.isEmpty(driverId)) {
+            return;
+        }
+        //查询司机的当天完成量、7天完成量、30天完成量
+        WaybillOrderTaskVO taskVO = transportRemoteService.queryWaybillOrderTaskByDriverId(Long.valueOf(entId), Long.valueOf(driverId));
+        if (taskVO == null) {
+            return;
+        }
+        driver.setTodayTaskAmount(taskVO.getTodayTaskAmount());
+        driver.setWeeklyTaskAmount(taskVO.getWeeklyTaskAmount());
+        driver.setMonthlyTaskAmount(taskVO.getMonthlyTaskAmount());
+    }
+
+        /**
+         * @param params 查询参数
+         * @desc 查询
+         * @author zk
+         * @date 2023/7/6
+         **/
     public List<Map<String, Object>> findList(Map<String, Object> params) {
         return driverDao.findList(params);
     }
@@ -1216,23 +1242,20 @@ public class KwfDriverService {
         CapacityTruckParam param = new CapacityTruckParam();
         param.setTruckNo(request.getTruckNo());
         param.setEntId(request.getEntId());
-        //校验物流订单车辆是否存在
-        List<CapacityTruckVO> capacityTruckVOS = transportRemoteService.queryCapacityTruck(param);
-        if (CollectionUtils.isEmpty(capacityTruckVOS)) {
-            throw new BusinessPlatfromException(ErrorCodeEnum.WAYBILL_ORDER_NOT_TRUCK, "您所在的企业暂无该车辆,请与企业管理人员联系");
+        //查询企业下的车辆信息
+        List<KwfTruck> kwfTrucks = truckRepository.queryTruckByEntId(request.getEntId());
+        if (CollectionUtils.isEmpty(kwfTrucks)) {
+            throw new BusinessPlatfromException(ErrorCodeEnum.TRUCK_NOT_FOUND, "您所在的企业暂无该车辆,请与企业管理人员联系");
+        }
+        //校验输入的车牌和轴数
+        KwfTruck matchedTruck = kwfTrucks.stream()
+                .filter(truck ->
+                        Objects.equals(request.getTruckNo(), truck.getTruckNo()) &&
+                                Objects.equals(String.valueOf(request.getTruckAxleId()), truck.getCarAxis()))
+                .findFirst().orElse(null);
+        if (matchedTruck == null) {
+            throw new BusinessPlatfromException(ErrorCodeEnum.TRUCK_NOT_FOUND, "您所在的企业暂无该车辆,请与企业管理人员联系");
         }
-
-        Long truckId = capacityTruckVOS.stream().map(CapacityTruckVO::getTruckId).distinct().findFirst()
-                .orElseThrow(() ->new BusinessPlatfromException(ErrorCodeEnum.TRUCK_NOT_FOUND, "车牌[" + request.getTruckNo() + "]未关联有效车辆ID"));
-        KwfTruck truck = truckRepository.queryByTruckId(truckId);
-        if (truck == null) {
-            throw new BusinessPlatfromException(ErrorCodeEnum.TRUCK_NOT_FOUND,  "车辆ID[" + truckId + "]不存在");
-        }
-        //校验车辆车轴信息
-        if (StringUtils.isBlank(truck.getCarAxis()) || request.getTruckAxleId() != Long.parseLong(truck.getCarAxis())) {
-            throw new BusinessPlatfromException(ErrorCodeEnum.WAYBILL_ORDER_NOT_TRUCK, "您所在的企业暂无该车辆,请与企业管理人员联系");
-        }
-
         //校验车辆是否已存在
         List<KwfDriverAssociatedTruck> associatedTrackList = driverAssociatedTruckRepository.queryByEntIdAndDriverId(request.getEntId(), request.getDriverId());
         boolean isDuplicate = associatedTrackList.stream()
@@ -1339,4 +1362,27 @@ public class KwfDriverService {
     }
 
 
+    /**
+     * @param params 参数
+     * @desc 解绑车辆
+     * @author zk
+     * @date 2023/7/6
+     **/
+    public HttpResult unbindTruck(KwfBindTruckDto params) {
+        //查询是否存在已有车辆司机关系数据
+        KwfTruckReport truckReport = truckReportRepository.getOne(Wrappers.<KwfTruckReport>lambdaQuery()
+                .eq(KwfTruckReport::getEntId, LoginUserHolder.getEntId())
+                .eq(KwfTruckReport::getDriverId, params.getId())
+                .eq(KwfTruckReport::getDelFlag, Global.NO)
+                .eq(KwfTruckReport::getStatus, Global.NO));
+        if(truckReport == null) {
+            throw new BusinessPlatfromException(ErrorCodeEnum.WAYBILL_ORDER_STATUS_ERROR, "此司机无车辆绑定信息!");
+        }
+        truckReport.setStatus(Global.YES);
+        boolean saveResult = truckReportRepository.updateById(truckReport);
+        return saveResult ? HttpResult.ok("车辆绑定成功!") : HttpResult.error("车辆绑定失败!");
+
+    }
+
+
 }

+ 86 - 1
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/dubbo/TransportServiceImpl.java

@@ -1,5 +1,6 @@
 package com.sckw.transport.dubbo;
 
+import cn.hutool.core.date.DateUtil;
 import com.alibaba.fastjson.JSONObject;
 import com.alibaba.fastjson2.JSON;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
@@ -21,7 +22,6 @@ import com.sckw.core.utils.IdWorker;
 import com.sckw.core.utils.StringUtils;
 import com.sckw.core.web.constant.HttpStatus;
 import com.sckw.core.web.context.LoginUserHolder;
-import com.sckw.core.web.response.BaseResult;
 import com.sckw.core.web.response.HttpResult;
 import com.sckw.fleet.api.RemoteFleetService;
 import com.sckw.fleet.api.model.vo.RTruckVo;
@@ -1321,4 +1321,89 @@ public class TransportServiceImpl implements TransportRemoteService {
         info.setType(logistic.getType());
         return info;
     }
+
+    /**
+     * 查询司机的当天完成量、7天完成量、30天完成量
+     * @param entId 企业id
+     * @param driverId
+     * @return
+     */
+    public WaybillOrderTaskVO queryWaybillOrderTaskByDriverId(Long entId, Long driverId) {
+        log.info("查询司机的完成量:企业id:{},司机id:{}", entId, driverId);
+        WaybillOrderTaskVO taskVO = new WaybillOrderTaskVO();
+        // 1. 查询司机近30天的所有运单
+        List<KwtWaybillOrder> waybillOrders = waybillOrderRepository.queryByEntIdAndDriverId(entId, driverId);
+        if (CollectionUtils.isEmpty(waybillOrders)) {
+            return taskVO;
+        }
+        // 2. 查询关联的物流订单(获取结算方式)
+        List<Long> logOrderIds = waybillOrders.stream().map(KwtWaybillOrder::getLOrderId).distinct().toList();
+        List<KwtLogisticsOrder> logisticsOrders = logisticsOrderRepository.queryByLogisticsOrderIds(logOrderIds);
+        if (CollectionUtils.isEmpty(logisticsOrders)) {
+            return taskVO;
+        }
+        Map<Long, KwtLogisticsOrder> logOrderMap = logisticsOrders.stream().collect(Collectors.toMap(KwtLogisticsOrder::getId, Function.identity(), (x, y) -> x));
+
+        // 3. 定义时间范围
+        Date todayStart = DateUtil.beginOfDay(new Date()); // 当天00:00:00
+        Date todayEnd = DateUtil.endOfDay(new Date());  // 当天23:59:59
+        Date sevenDaysStart =  DateUtil.beginOfDay(DateUtil.offsetDay(new Date(), -7)); // 7天前的00:00:00
+        Date thirtyDaysStart = DateUtil.beginOfDay(DateUtil.offsetDay(new Date(), -30)); // 30天前的00:00:00
+        //4. 初始化计数器
+        int todayCount = 0;
+        int weeklyCount = 0;
+        int monthlyCount = 0;
+
+        // 5. 按物流订单ID分组
+        Map<Long, List<KwtWaybillOrder>> waybillOrderMaps = waybillOrders.stream().collect(Collectors
+                .groupingBy(KwtWaybillOrder::getLOrderId));
+
+        // 6. 统计各时间维度有效运单量
+        for (Map.Entry<Long, List<KwtWaybillOrder>> orderEntry : waybillOrderMaps.entrySet()) {
+            Long key = orderEntry.getKey();
+            List<KwtWaybillOrder> waybillOrderList = orderEntry.getValue();
+            KwtLogisticsOrder orDefault = logOrderMap.getOrDefault(key, new KwtLogisticsOrder());
+            //结算方式
+            String billingMode = orDefault.getBillingMode();
+
+            for (KwtWaybillOrder order : waybillOrderList) {
+                // 检查运单完成时间
+                Date updateTime = order.getUpdateTime();
+                if (updateTime == null) {
+                    continue;
+                }
+
+                boolean statusValid;
+                //按照装货量结算(统计“已卸货” “已完成”运单)
+
+                if (Objects.equals(billingMode, String.valueOf(1))) {
+                    statusValid = CarWaybillV1Enum.COMPLETION_LOADING.getCode().equals(order.getStatus())
+                            ||CarWaybillV1Enum.WAIT_UNLOADING.getCode().equals(order.getStatus());
+                } else {
+                    //按照卸货量结算(统计“已完成”运单)
+                    statusValid = order.getStatus().equals(CarWaybillV1Enum.WAIT_UNLOADING.getCode());
+                }
+
+                if (!statusValid) {
+                    continue;
+                }
+                // 按时间范围统计
+                if (updateTime.after(todayStart) && updateTime.before(todayEnd)) {
+                    todayCount++;
+                }
+                if (updateTime.after(sevenDaysStart) && updateTime.before(todayEnd)) {
+                    weeklyCount++;
+                }
+                if (updateTime.after(thirtyDaysStart) && updateTime.before(todayEnd)) {
+                    monthlyCount++;
+                }
+            }
+        }
+        // 7. 设置返回值
+        taskVO.setTodayTaskAmount(todayCount);
+        taskVO.setWeeklyTaskAmount(weeklyCount);
+        taskVO.setMonthlyTaskAmount(monthlyCount);
+        return taskVO;
+    }
+
 }

+ 15 - 0
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/repository/KwtWaybillOrderRepository.java

@@ -1,5 +1,6 @@
 package com.sckw.transport.repository;
 
+import cn.hutool.core.date.DateUtil;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
@@ -178,4 +179,18 @@ public class KwtWaybillOrderRepository extends ServiceImpl<KwtWaybillOrderMapper
                         .eq(KwtWaybillOrder::getTruckNo, truckNo)
                         .eq(KwtWaybillOrder::getDelFlag, 0));
     }
+
+
+    public List<KwtWaybillOrder> queryByEntIdAndDriverId(Long entId, Long driverId) {
+        Date thirtyDaysAgo = DateUtil.beginOfDay(DateUtil.offsetDay(new Date(), -30));
+        return list(
+                Wrappers.<KwtWaybillOrder>lambdaQuery()
+                        .eq(KwtWaybillOrder::getEntId, entId)
+                        .eq(KwtWaybillOrder::getDriverId, driverId)
+                        .eq(KwtWaybillOrder::getDelFlag, 0)
+                        .ge(KwtWaybillOrder::getUpdateTime, thirtyDaysAgo));
+    }
+
+
+
 }