From 996b2f16afaa271ce8aad6abf6858aa5db503eb3 Mon Sep 17 00:00:00 2001
From: rk <94314517@qq.com>
Date: 星期六, 25 四月 2026 14:07:34 +0800
Subject: [PATCH] 代码生成

---
 server/services/src/main/java/com/doumee/service/business/impl/DriverInfoServiceImpl.java |  374 ++++++++++++++++++++++++++++++++++++++++++++++++-----
 1 files changed, 339 insertions(+), 35 deletions(-)

diff --git a/server/services/src/main/java/com/doumee/service/business/impl/DriverInfoServiceImpl.java b/server/services/src/main/java/com/doumee/service/business/impl/DriverInfoServiceImpl.java
index 548fc41..98f0720 100644
--- a/server/services/src/main/java/com/doumee/service/business/impl/DriverInfoServiceImpl.java
+++ b/server/services/src/main/java/com/doumee/service/business/impl/DriverInfoServiceImpl.java
@@ -4,6 +4,7 @@
 import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.doumee.biz.system.impl.AreasBizImpl;
 import com.doumee.core.constants.Constants;
 import com.doumee.core.constants.ResponseStatus;
 import com.doumee.core.exception.BusinessException;
@@ -22,27 +23,19 @@
 import com.doumee.dao.business.ShopInfoMapper;
 import com.doumee.dao.business.OrdersDetailMapper;
 import com.doumee.dao.business.RevenueMapper;
+import com.doumee.dao.business.model.*;
+import com.doumee.service.business.AreasService;
 import com.doumee.biz.system.SystemDictDataBiz;
 import com.doumee.biz.system.OperationConfigBiz;
 import com.doumee.dao.business.OrderLogMapper;
-import com.doumee.dao.business.model.Category;
-import com.doumee.dao.business.model.DriverInfo;
-import com.doumee.dao.business.model.OrderLog;
-import com.doumee.dao.business.model.OrderComment;
-import com.doumee.dao.business.model.ShopInfo;
-import com.doumee.dao.business.model.Member;
-import com.doumee.dao.business.model.Multifile;
-import com.doumee.dao.business.model.Smsrecord;
-import com.doumee.dao.business.model.Orders;
-import com.doumee.dao.business.model.OrdersDetail;
-import com.doumee.dao.business.model.Revenue;
 import com.doumee.dao.dto.*;
 import com.doumee.dao.vo.AccountResponse;
+import com.doumee.dao.vo.DriverActiveOrderCountVO;
+import com.doumee.dao.vo.DriverCancelLimitVO;
 import com.doumee.dao.vo.DriverCenterVO;
 import com.doumee.dao.vo.DriverGrabOrderVO;
 import com.doumee.dao.vo.DriverOrderDetailVO;
 import com.doumee.core.utils.aliyun.AliSmsService;
-import com.doumee.dao.business.model.Notice;
 import com.doumee.service.business.DriverInfoService;
 import com.doumee.service.business.NoticeService;
 import com.alibaba.fastjson.JSONObject;
@@ -57,6 +50,7 @@
 import org.springframework.util.CollectionUtils;
 
 import java.util.*;
+import java.util.concurrent.TimeUnit;
 import java.util.stream.Collectors;
 
 /**
@@ -118,6 +112,9 @@
 
     @Autowired
     private NoticeService noticeService;
+
+    @Autowired
+    private AreasBizImpl areasBiz;
 
     /**
      * 鍙戦�佽鍗曠珯鍐呬俊閫氱煡
@@ -383,7 +380,7 @@
             member.setUpdateTime(now);
             member.setTelephone(telephone);
             member.setNickName(telephone.substring(0, 3) + "****" + telephone.substring(7));
-            member.setName(telephone);
+            member.setName(member.getNickName());
             member.setUserType(Constants.ONE);
             member.setBusinessStatus(Constants.ZERO);
             member.setPassword(secure.encryptPassword(defaultPassword, salt));
@@ -401,13 +398,15 @@
 
             // 鍒涘缓鍙告満鍩虹淇℃伅
             DriverInfo driverInfo = new DriverInfo();
+            driverInfo.setId(member.getId());
             driverInfo.setDeleted(Constants.ZERO);
             driverInfo.setCreateTime(now);
             driverInfo.setUpdateTime(now);
             driverInfo.setTelephone(telephone);
+            driverInfo.setName(member.getNickName());
             driverInfo.setMemberId(member.getId());
             driverInfo.setStatus(Constants.ZERO);
-            driverInfo.setAuditStatus(null);
+            driverInfo.setAuditStatus(99);
             driverInfoMapper.insert(driverInfo);
         }
 
@@ -531,6 +530,7 @@
                 .set(DriverInfo::getAliAccount, request.getAliAccount())
                 .set(DriverInfo::getAliName, request.getAliName())
                 .set(DriverInfo::getUpdateTime, now)
+                .set(DriverInfo::getAuditStatus, Constants.ZERO)
                 .set(DriverInfo::getAuditRemark, null)
                 .set(DriverInfo::getAuditTime, null)
                 .eq(DriverInfo::getId, driverInfo.getId()));
@@ -561,18 +561,39 @@
     @Override
     public DriverInfo getVerifyDetail(Integer memberId) {
         DriverInfo driverInfo = driverInfoMapper.selectOne(new QueryWrapper<DriverInfo>().lambda()
-                .eq(DriverInfo::getMemberId, memberId)
+                .eq(DriverInfo::getId, memberId)
                 .eq(DriverInfo::getDeleted, Constants.ZERO)
                 .last("limit 1"));
         if (Objects.isNull(driverInfo)) {
             throw new BusinessException(ResponseStatus.DATA_EMPTY);
         }
+        // 鎷兼帴鍥剧墖鍓嶇紑
+        String imgPrefix = "";
+        try {
+            imgPrefix = systemDictDataBiz.queryByCode(Constants.OSS, Constants.RESOURCE_PATH).getCode()
+                    + systemDictDataBiz.queryByCode(Constants.OSS, Constants.DRIVER_FILES).getCode();
+        } catch (Exception e) {
+            // 鏈厤缃椂蹇界暐
+        }
+        driverInfo.setImgPrefix(imgPrefix);
         // 鏌ヨ杞﹁締绫诲瀷鍚嶇О鍜屾槸鍚﹂渶瑕侀┚椹惰瘉
         if (driverInfo.getCarType() != null) {
             Category category = categoryMapper.selectById(driverInfo.getCarType());
             if (Objects.nonNull(category)) {
                 driverInfo.setCarTypeName(category.getName());
                 driverInfo.setNeedLicense(Constants.equalsInteger(Integer.valueOf(category.getOtherField()), Constants.ONE) ? Constants.ONE : Constants.ZERO);
+            }
+        }
+        // 鏌ヨ鐪佸競鍖轰俊鎭�
+        if (driverInfo.getAreaId() != null) {
+            Areas district = areasBiz.resolveArea(driverInfo.getAreaId());
+            if (district != null) {
+                driverInfo.setDistrictId(district.getId());
+                driverInfo.setDistrictName(district.getName());
+                driverInfo.setCityId(district.getCityId());
+                driverInfo.setCityName(district.getCityName());
+                driverInfo.setProvinceId(district.getProvinceId());
+                driverInfo.setProvinceName(district.getProvinceName());
             }
         }
         // 鏌ヨ鐓х墖鍒楄〃
@@ -638,6 +659,20 @@
                 .set(Member::getBusinessStatus, driverStatus)
                 .set(Member::getUpdateTime, now)
                 .eq(Member::getId, driverInfo.getMemberId()));
+
+        // 鐭俊閫氱煡
+        if (Constants.equalsInteger(newAuditStatus, Constants.ONE)) {
+            // 瀹℃壒閫氳繃
+            sendSmsNotify(driverInfo.getTelephone(),
+                    Constants.SmsNotify.DRIVER_AUTH_APPROVED,
+                    "driver", driverInfo.getName());
+        } else if (Constants.equalsInteger(newAuditStatus, Constants.TWO)) {
+            // 瀹℃壒椹冲洖
+            sendSmsNotify(driverInfo.getTelephone(),
+                    Constants.SmsNotify.DRIVER_AUTH_REJECTED,
+                    "driver", driverInfo.getName(),
+                    "reason", auditDTO.getAuditRemark() != null ? auditDTO.getAuditRemark() : "");
+        }
     }
 
     @Override
@@ -776,8 +811,11 @@
         vo.setImgUrl(driver.getImgurl());
         vo.setCarCode(driver.getCarCode());
         vo.setScore(driver.getScore() != null ? driver.getScore().toPlainString() : "0");
+        vo.setDriverLevel(driver.getDriverLevel());
+        vo.setAuditStatus(driver.getAuditStatus());
+        vo.setAuditRemark(driver.getAuditRemark());
         vo.setBalance(driver.getBalance() != null ? driver.getBalance() : 0L);
-
+        vo.setAcceptingStatus(driver.getAcceptingStatus());
         // 澶村儚鍏ㄨ矾寰�
         if (StringUtils.isNotBlank(driver.getImgurl())) {
             String imgPrefix = systemDictDataBiz.queryByCode(Constants.OSS, Constants.RESOURCE_PATH).getCode()
@@ -810,7 +848,7 @@
         Long todayOrderCount = ordersMapper.selectCount(new QueryWrapper<Orders>().lambda()
                 .eq(Orders::getAcceptDriver, driver.getId())
                 .eq(Orders::getDeleted, Constants.ZERO)
-                .ge(Orders::getFinishTime, todayStart));
+                .ge(Orders::getAcceptTime, todayStart));
         vo.setTodayOrderCount(todayOrderCount.intValue());
 
         // 寰呭彇璐э紙宸叉帴鍗�=3锛�
@@ -826,6 +864,54 @@
                 .eq(Orders::getDeleted, Constants.ZERO)
                 .eq(Orders::getStatus, Constants.OrderStatus.delivering.getStatus()));
         vo.setWaitDeliverCount(waitDeliverCount.intValue());
+
+        return vo;
+    }
+
+    @Override
+    public com.doumee.dao.vo.DriverStatsVO getDriverStats(Integer memberId) {
+        DriverInfo driver = driverInfoMapper.selectOne(new QueryWrapper<DriverInfo>().lambda()
+                .eq(DriverInfo::getId, memberId)
+                .eq(DriverInfo::getDeleted, Constants.ZERO)
+                .last("limit 1"));
+        if (driver == null) {
+            throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(), "鍙告満淇℃伅涓嶅瓨鍦�");
+        }
+
+        com.doumee.dao.vo.DriverStatsVO vo = new com.doumee.dao.vo.DriverStatsVO();
+
+        // 绱浣i噾锛歵ype=0(瀹屾垚璁㈠崟) + vaildStatus=1(宸插叆璐�)
+        QueryWrapper<Revenue> totalWrapper = new QueryWrapper<>();
+        totalWrapper.lambda()
+                .eq(Revenue::getMemberId, memberId)
+                .eq(Revenue::getMemberType, Constants.ONE)
+                .eq(Revenue::getType, Constants.ZERO)
+                .eq(Revenue::getVaildStatus, Constants.ONE)
+                .eq(Revenue::getDeleted, Constants.ZERO);
+        totalWrapper.select("IFNULL(SUM(AMOUNT),0) as amount");
+        Revenue totalResult = revenueMapper.selectOne(totalWrapper);
+        vo.setTotalCommission(totalResult != null && totalResult.getAmount() != null ? totalResult.getAmount() : 0L);
+
+        // 寰呯粨绠椾剑閲戯細type=0(瀹屾垚璁㈠崟) + vaildStatus=0(鍏ヨ处涓�)
+        QueryWrapper<Revenue> pendingWrapper = new QueryWrapper<>();
+        pendingWrapper.lambda()
+                .eq(Revenue::getMemberId, memberId)
+                .eq(Revenue::getMemberType, Constants.ONE)
+                .eq(Revenue::getType, Constants.ZERO)
+                .eq(Revenue::getVaildStatus, Constants.ZERO)
+                .eq(Revenue::getDeleted, Constants.ZERO);
+        pendingWrapper.select("IFNULL(SUM(AMOUNT),0) as amount");
+        Revenue pendingResult = revenueMapper.selectOne(pendingWrapper);
+        vo.setPendingCommission(pendingResult != null && pendingResult.getAmount() != null ? pendingResult.getAmount() : 0L);
+
+        // 璁㈠崟鎬绘暟
+        Long totalOrderCount = ordersMapper.selectCount(new QueryWrapper<Orders>().lambda()
+                .eq(Orders::getAcceptDriver, driver.getId())
+                .eq(Orders::getDeleted, Constants.ZERO));
+        vo.setTotalOrderCount(totalOrderCount.intValue());
+
+        // 閽卞寘浣欓
+        vo.setBalance(driver.getBalance() != null ? driver.getBalance() : 0L);
 
         return vo;
     }
@@ -862,10 +948,8 @@
             goodTypeIds = cats.stream().map(Category::getId).collect(Collectors.toList());
         }
 
-        // 3. Haversine SQL鍏紡锛氬徃鏈哄埌瀛樹欢闂ㄥ簵璺濈(km)锛屼娇鐢∣rders鑷甫鍧愭爣
-        String depositDist = "(6371 * acos(cos(radians(" + driverLat + ")) * cos(radians(t.DEPOSIT_LGT)) "
-                + "* cos(radians(t.DEPOSIT_LAT) - radians(" + driverLng + ")) "
-                + "+ sin(radians(" + driverLat + ")) * sin(radians(t.DEPOSIT_LGT))))";
+        // 3. ST_Distance_Sphere璁$畻鍙告満鍒板瓨浠堕棬搴楄窛绂�(km)锛屼娇鐢∣rders鑷甫鍧愭爣
+        String depositDist = "(ST_Distance_Sphere(POINT(" + driverLng + ", " + driverLat + "), POINT(t.DEPOSIT_LGT, t.DEPOSIT_LAT)) / 1000)";
 
         // 4. 鏋勯�燤PJ鏌ヨ
         IPage<Orders> page = new Page<>(pageWrap.getPage(), pageWrap.getCapacity());
@@ -880,6 +964,9 @@
                 .select("s2.link_phone as takeShopLinkPhone")
                 // 鐗╁搧绛夌骇璐甸噸鏍囪瘑
                 .select("c2.other_field as c2OtherField")
+                .select("c2.name as goodLevelName")
+                // 鏄惁瀛樺湪鐗瑰ぇ灏哄
+                .select("IF(EXISTS(SELECT 1 FROM orders_detail od JOIN category c3 ON c3.id = od.LUGGAGE_ID AND c3.TYPE = 4 AND c3.OTHER_FIELD = '1' WHERE od.ORDER_ID = t.ID AND od.DELETED = 0), 1, 0) as hasOversized")
                 // JOIN
                 .leftJoin("shop_info s1 on s1.id = t.DEPOSIT_SHOP_ID and s1.DELETED = 0")
                 .leftJoin("shop_info s2 on s2.id = t.TAKE_SHOP_ID and s2.DELETED = 0")
@@ -979,13 +1066,15 @@
                 .select("s2.address", Orders::getTakeShopAddress)
                 .select("s2.link_phone as takeShopLinkPhone")
                 .select("c2.other_field as c2OtherField")
+                .select("c2.name as goodLevelName")
+                .select("IF(EXISTS(SELECT 1 FROM orders_detail od JOIN category c3 ON c3.id = od.LUGGAGE_ID AND c3.TYPE = 4 AND c3.OTHER_FIELD = '1' WHERE od.ORDER_ID = t.ID AND od.DELETED = 0), 1, 0) as hasOversized")
                 .leftJoin("shop_info s1 on s1.id = t.DEPOSIT_SHOP_ID and s1.DELETED = 0")
                 .leftJoin("shop_info s2 on s2.id = t.TAKE_SHOP_ID and s2.DELETED = 0")
                 .leftJoin("category c1 on c1.id = t.GOOD_TYPE and c1.DELETED = 0")
                 .leftJoin("category c2 on c2.id = c1.RELATION_ID and c2.DELETED = 0 and c2.TYPE = 3")
                 .eq(Orders::getAcceptDriver, driver.getId())
                 .eq(Orders::getType, Constants.ONE)
-                .eq(Orders::getStatus, dto.getStatus())
+                .eq(Objects.nonNull(dto.getStatus()),Orders::getStatus, dto.getStatus())
                 .eq(Orders::getDeleted, Constants.ZERO)
                 .orderByAsc(Orders::getAcceptTime);
 
@@ -1024,6 +1113,7 @@
                 .select("s2.address", Orders::getTakeShopAddress)
                 .select("s2.link_phone as takeShopLinkPhone")
                 .select("c2.other_field as c2OtherField")
+                .select("IF(EXISTS(SELECT 1 FROM orders_detail od JOIN category c3 ON c3.id = od.LUGGAGE_ID AND c3.TYPE = 4 AND c3.OTHER_FIELD = '1' WHERE od.ORDER_ID = t.ID AND od.DELETED = 0), 1, 0) as hasOversized")
                 .leftJoin("shop_info s1 on s1.id = t.DEPOSIT_SHOP_ID and s1.DELETED = 0")
                 .leftJoin("shop_info s2 on s2.id = t.TAKE_SHOP_ID and s2.DELETED = 0")
                 .leftJoin("category c1 on c1.id = t.GOOD_TYPE and c1.DELETED = 0")
@@ -1081,11 +1171,17 @@
         vo.setDepositShopAddress(base.getDepositShopAddress());
         vo.setDepositDistance(base.getDepositDistance());
         vo.setTakeName(base.getTakeName());
+        vo.setTakeAddress(base.getTakeAddress());
+        vo.setTakeShopId(base.getTakeShopId());
+
         vo.setTakeDistance(base.getTakeDistance());
         vo.setContactPhone(base.getContactPhone());
         vo.setDriverFee(base.getDriverFee());
         vo.setUrgentAmount(base.getUrgentAmount());
         vo.setIsValuable(base.getIsValuable());
+        vo.setGoodLevelName(base.getGoodLevelName());
+        vo.setHasOversized(base.getHasOversized());
+        vo.setDriverVerifyCode(base.getDriverVerifyCode());
 
         // 鐗╁搧鏄庣粏锛堣浆鎹㈢被鍨嬶級
         List<DriverOrderDetailVO.OrderItem> detailItems = new ArrayList<>();
@@ -1094,6 +1190,7 @@
                 DriverOrderDetailVO.OrderItem item = new DriverOrderDetailVO.OrderItem();
                 item.setName(src.getName());
                 item.setQuantity(src.getQuantity());
+                item.setIsOversized(src.getIsOversized());
                 detailItems.add(item);
             }
         }
@@ -1221,7 +1318,7 @@
         Date todayStart = cal.getTime();
         Long todayCancelCount = orderLogMapper.selectCount(new QueryWrapper<OrderLog>().lambda()
                 .eq(OrderLog::getOptUserId, driver.getMemberId())
-                .eq(OrderLog::getObjType, Constants.ORDER_LOG_CANCEL)
+                .eq(OrderLog::getObjType, Constants.OrderLogType.driverCancel.getStatus())
                 .eq(OrderLog::getOptUserType, Constants.ONE)
                 .ge(OrderLog::getCreateTime, todayStart));
         if (todayCancelCount != null && todayCancelCount >= limit) {
@@ -1238,9 +1335,9 @@
         // 5. 鍐欏叆鍙栨秷鏃ュ織
         OrderLog log = new OrderLog();
         log.setOrderId(orderId);
-        log.setTitle("鍙告満鍙栨秷璁㈠崟");
-        log.setLogInfo(StringUtils.isNotBlank(reason) ? reason : "鍙告満鍙栨秷鎺ュ崟");
-        log.setObjType(Constants.ORDER_LOG_CANCEL);
+        log.setTitle(Constants.OrderLogType.driverCancel.getTitle());
+        log.setLogInfo(Constants.OrderLogType.driverCancel.format(StringUtils.isNotBlank(reason) ? reason : "鍙告満鍙栨秷鎺ュ崟"));
+        log.setObjType(Constants.OrderLogType.driverCancel.getStatus());
         log.setOptUserId(driver.getMemberId());
         log.setOptUserType(Constants.ONE);
         log.setOrderStatus(order.getStatus());
@@ -1297,11 +1394,13 @@
 
         // 5. 鍘熷瓙鏇存柊锛氬甫 status=2 鏉′欢闃叉骞跺彂閲嶅鎶㈠崟
         Date now = new Date();
+        String driverVerifyCode = generateVerifyCode();
         int rows = ordersMapper.update(new UpdateWrapper<Orders>().lambda()
                 .set(Orders::getAcceptDriver, driverId)
                 .set(Orders::getAcceptTime, now)
                 .set(Orders::getAcceptType, 0) // 0=鎵嬪姩鎶㈠崟
                 .set(Orders::getStatus, Constants.OrderStatus.accepted.getStatus())
+                .set(Orders::getDriverVerifyCode, driverVerifyCode)
                 .set(Orders::getUpdateTime, now)
                 .eq(Orders::getId, orderId)
                 .eq(Orders::getStatus, Constants.TWO));
@@ -1312,9 +1411,9 @@
         // 6. 鍐欏叆鎿嶄綔鏃ュ織
         OrderLog log = new OrderLog();
         log.setOrderId(orderId);
-        log.setTitle("鍙告満鎶㈠崟");
-        log.setLogInfo("鍙告満銆�" + driver.getName() + "銆戞姠鍗曟垚鍔�");
-        log.setObjType(Constants.ORDER_LOG_DRIVER_PICKUP);
+        log.setTitle(Constants.OrderLogType.driverGrab.getTitle());
+        log.setLogInfo(Constants.OrderLogType.driverGrab.format(driver.getName()));
+        log.setObjType(Constants.OrderLogType.driverGrab.getStatus());
         log.setOptUserId(driver.getMemberId());
         log.setOptUserType(Constants.ONE);
         log.setOrderStatus(Constants.OrderStatus.accepted.getStatus());
@@ -1397,12 +1496,13 @@
         // 5. 鍐欏叆鎿嶄綔鏃ュ織
         OrderLog log = new OrderLog();
         log.setOrderId(orderId);
-        log.setTitle("鍙告満瀹屾垚鍙栦欢");
-        log.setLogInfo("鍙告満銆�" + driver.getName() + "銆戝畬鎴愬彇浠讹紝寮�濮嬫淳閫�");
-        log.setObjType(Constants.ORDER_LOG_DRIVER_PICKUP);
+        log.setTitle(Constants.OrderLogType.driverPickup.getTitle());
+        log.setLogInfo(Constants.OrderLogType.driverPickup.format(driver.getName()));
+        log.setObjType(Constants.OrderLogType.driverPickup.getStatus());
         log.setOptUserId(driver.getMemberId());
         log.setOptUserType(Constants.ONE);
         log.setOrderStatus(Constants.OrderStatus.delivering.getStatus());
+        log.setRemark(dto.getRemark());
         log.setCreateTime(now);
         log.setDeleted(Constants.ZERO);
         orderLogMapper.insert(log);
@@ -1488,9 +1588,10 @@
         // 5. 鍐欏叆鎿嶄綔鏃ュ織
         OrderLog log = new OrderLog();
         log.setOrderId(orderId);
-        log.setTitle("鍙告満纭閫佽揪");
-        log.setLogInfo(StringUtils.isNotBlank(dto.getRemark()) ? dto.getRemark() : "鍙告満銆�" + driver.getName() + "銆戝凡閫佽揪");
-        log.setObjType(Constants.ORDER_LOG_DRIVER_DELIVER);
+        log.setTitle(Constants.OrderLogType.driverDeliver.getTitle());
+        log.setLogInfo(Constants.OrderLogType.driverDeliver.format(
+                StringUtils.isNotBlank(dto.getRemark()) ? dto.getRemark() : "鍙告満銆�" + driver.getName() + "銆戝凡閫佽揪"));
+        log.setObjType(Constants.OrderLogType.driverDeliver.getStatus());
         log.setOptUserId(driver.getMemberId());
         log.setOptUserType(Constants.ONE);
         log.setOrderStatus(Constants.OrderStatus.arrived.getStatus());
@@ -1550,6 +1651,22 @@
             return Math.round(km * 1000) + "m";
         }
         return String.format("%.1fkm", km);
+    }
+
+    /**
+     * 鐢熸垚6浣嶆暟瀛楁牳閿�鐮侊紙Redis SETNX 淇濊瘉鍞竴锛�
+     */
+    private String generateVerifyCode() {
+        Random random = new Random();
+        String redisKey = Constants.REDIS_VERIFY_CODE_KEY;
+        for (int i = 0; i < 200; i++) {
+            String code = String.format("%06d", random.nextInt(1000000));
+            Boolean success = redisTemplate.opsForValue().setIfAbsent(redisKey + code, "1", 24, TimeUnit.HOURS);
+            if (success != null && success) {
+                return code;
+            }
+        }
+        throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "鏍搁攢鐮佺敓鎴愬け璐ワ紝璇烽噸璇�");
     }
 
     private double haversine(double lat1, double lng1, double lat2, double lng2) {
@@ -1613,9 +1730,12 @@
         boolean hasTakeShop = order.getTakeShopId() != null && StringUtils.isNotBlank(order.getTakeShopName());
         if (hasTakeShop) {
             vo.setTakeName(order.getTakeShopName());
+            vo.setTakeAddress(order.getTakeShopAddress());
+            vo.setTakeShopId(order.getTakeShopId());
             vo.setContactPhone(order.getTakeShopLinkPhone());
         } else {
             vo.setTakeName(order.getTakeLocation());
+            vo.setTakeAddress(order.getTakeLocationRemark());
             vo.setContactPhone(order.getTakePhone());
         }
         if (driverLat != null && driverLng != null
@@ -1627,14 +1747,36 @@
 
         // 璐甸噸鐗╁搧
         vo.setIsValuable("1".equals(order.getC2OtherField()));
+        vo.setGoodLevelName(order.getGoodLevelName());
+        vo.setHasOversized(order.getHasOversized());
+
+        // 寰呭彇璐х姸鎬�(status=3)杩斿洖鍙告満鍙栬揣鐮�
+        if (Constants.equalsInteger(order.getStatus(), Constants.THREE)||Constants.equalsInteger(order.getStatus(), Constants.FOUR)) {
+            vo.setDriverVerifyCode(order.getDriverVerifyCode());
+        }
 
         // 鐗╁搧鏄庣粏
         List<OrdersDetail> details = detailMap.getOrDefault(order.getId(), Collections.emptyList());
+        // 鎵归噺鏌ヨ娑夊強鍒扮殑 luggageId 瀵瑰簲鐨� category锛屽垽鏂槸鍚﹀ぇ浠�
+        Set<Integer> luggageIds = details.stream()
+                .map(OrdersDetail::getLuggageId)
+                .filter(Objects::nonNull)
+                .collect(Collectors.toSet());
+        Set<Integer> oversizedIds = new HashSet<>();
+        if (!luggageIds.isEmpty()) {
+            categoryMapper.selectList(new QueryWrapper<Category>().lambda()
+                    .in(Category::getId, luggageIds)
+                    .eq(Category::getType, Constants.FOUR)
+                    .eq(Category::getOtherField, "1")
+                    .eq(Category::getDeleted, Constants.ZERO))
+                    .forEach(c -> oversizedIds.add(c.getId()));
+        }
         List<DriverGrabOrderVO.OrderItem> items = new ArrayList<>();
         for (OrdersDetail detail : details) {
             DriverGrabOrderVO.OrderItem item = new DriverGrabOrderVO.OrderItem();
             item.setName(detail.getLuggageName());
             item.setQuantity(detail.getNum());
+            item.setIsOversized(oversizedIds.contains(detail.getLuggageId()) ? Constants.ONE : Constants.ZERO);
             items.add(item);
         }
         vo.setItems(items);
@@ -1686,4 +1828,166 @@
         }
     }
 
+    @Override
+    public void changePassword(Integer driverId, String newPassword, String token) {
+        if (StringUtils.isBlank(newPassword)) {
+            throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "瀵嗙爜涓嶈兘涓虹┖");
+        }
+        // 鏍¢獙瀵嗙爜蹇呴』鍚屾椂鍖呭惈瀛楁瘝鍜屾暟瀛�
+        boolean hasLetter = newPassword.chars().anyMatch(Character::isLetter);
+        boolean hasDigit = newPassword.chars().anyMatch(Character::isDigit);
+        if (!hasLetter || !hasDigit) {
+            throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "瀵嗙爜蹇呴』鍚屾椂鍖呭惈瀛楁瘝鍜屾暟瀛�");
+        }
+        // 鏌ヨ鍙告満瀵瑰簲鐨勪細鍛�
+        DriverInfo driverInfo = driverInfoMapper.selectById(driverId);
+        if (driverInfo == null || driverInfo.getMemberId() == null) {
+            throw new BusinessException(ResponseStatus.DATA_EMPTY);
+        }
+        Member member = memberMapper.selectById(driverInfo.getMemberId());
+        if (member == null) {
+            throw new BusinessException(ResponseStatus.DATA_EMPTY);
+        }
+        // 鍔犲瘑鏂板瘑鐮佸苟鏇存柊
+        String salt = RandomStringUtils.randomAlphanumeric(6);
+        String encryptPwd = secure.encryptPassword(newPassword, salt);
+        memberMapper.update(new UpdateWrapper<Member>().lambda()
+                .set(Member::getPassword, encryptPwd)
+                .set(Member::getSalt, salt)
+                .eq(Member::getId, member.getId()));
+        // 娓呴櫎token锛屽己鍒堕噸鏂扮櫥褰�
+        if (StringUtils.isNotBlank(token)) {
+            redisTemplate.delete(token);
+        }
+    }
+
+    @Override
+    public DriverActiveOrderCountVO getActiveOrderCount(Integer driverId) {
+        // 宸叉姠鍗�(status=3)鏁伴噺
+        Long grabbed = ordersMapper.selectCount(new QueryWrapper<Orders>().lambda()
+                .eq(Orders::getAcceptDriver, driverId)
+                .eq(Orders::getStatus, Constants.OrderStatus.accepted.getStatus())
+                .eq(Orders::getDeleted, Constants.ZERO));
+        // 娲鹃�佷腑(status=4)鏁伴噺
+        Long delivering = ordersMapper.selectCount(new QueryWrapper<Orders>().lambda()
+                .eq(Orders::getAcceptDriver, driverId)
+                .eq(Orders::getStatus, Constants.OrderStatus.delivering.getStatus())
+                .eq(Orders::getDeleted, Constants.ZERO));
+        DriverActiveOrderCountVO vo = new DriverActiveOrderCountVO();
+        vo.setGrabbedCount(grabbed != null ? grabbed.intValue() : 0);
+        vo.setDeliveringCount(delivering != null ? delivering.intValue() : 0);
+        return vo;
+    }
+
+    @Override
+    public PageData<DriverGrabOrderVO> driverOrderPage(Integer driverId, PageWrap<DriverOrderPageDTO> pageWrap) {
+        DriverInfo driver = driverInfoMapper.selectById(driverId);
+        if (driver == null) {
+            throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(), "鍙告満淇℃伅涓嶅瓨鍦�");
+        }
+
+        DriverOrderPageDTO model = pageWrap.getModel();
+        Integer status = model != null ? model.getStatus() : null;
+
+        // 鍚堟硶鐘舵�佹牎楠�
+        List<Integer> validStatuses = Arrays.asList(
+                Constants.OrderStatus.accepted.getStatus(),
+                Constants.OrderStatus.delivering.getStatus(),
+                Constants.OrderStatus.finished.getStatus());
+        if (status != null && !validStatuses.contains(status)) {
+            throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "鐘舵�佸彧鑳戒负3(寰呭彇浠�)銆�4(閰嶉�佷腑)銆�7(宸插畬鎴�)");
+        }
+
+        IPage<Orders> p = new Page<>(pageWrap.getPage(), pageWrap.getCapacity());
+        MPJLambdaWrapper<Orders> wrapper = new MPJLambdaWrapper<>();
+        wrapper.selectAll(Orders.class)
+                .select("s1.name", Orders::getDepositShopName)
+                .select("s1.address", Orders::getDepositShopAddress)
+                .select("s2.name", Orders::getTakeShopName)
+                .select("s2.address", Orders::getTakeShopAddress)
+                .select("s2.link_phone as takeShopLinkPhone")
+                .select("c2.other_field as c2OtherField")
+                .select("c2.name as goodLevelName")
+                .select("IF(EXISTS(SELECT 1 FROM orders_detail od JOIN category c3 ON c3.id = od.LUGGAGE_ID AND c3.TYPE = 4 AND c3.OTHER_FIELD = '1' WHERE od.ORDER_ID = t.ID AND od.DELETED = 0), 1, 0) as hasOversized")
+                .leftJoin("shop_info s1 on s1.id = t.DEPOSIT_SHOP_ID and s1.DELETED = 0")
+                .leftJoin("shop_info s2 on s2.id = t.TAKE_SHOP_ID and s2.DELETED = 0")
+                .leftJoin("category c1 on c1.id = t.GOOD_TYPE and c1.DELETED = 0")
+                .leftJoin("category c2 on c2.id = c1.RELATION_ID and c2.DELETED = 0 and c2.TYPE = 3")
+                .eq(Orders::getAcceptDriver, driverId)
+                .in(status == null, Orders::getStatus, validStatuses)
+                .eq(status != null, Orders::getStatus, status)
+                .eq(Orders::getDeleted, Constants.ZERO)
+                .orderByDesc(Orders::getAcceptTime);
+
+        IPage<Orders> orderPage = ordersMapper.selectJoinPage(p, Orders.class, wrapper);
+
+        List<DriverGrabOrderVO> voList = new ArrayList<>();
+        if (orderPage != null && orderPage.getRecords() != null) {
+            // 鎵归噺鏌ョ墿鍝佹槑缁�
+            List<Integer> orderIds = orderPage.getRecords().stream().map(Orders::getId).collect(Collectors.toList());
+            Map<Integer, List<OrdersDetail>> detailMap = new HashMap<>();
+            if (!orderIds.isEmpty()) {
+                List<OrdersDetail> allDetails = ordersDetailMapper.selectList(
+                        new QueryWrapper<OrdersDetail>().lambda()
+                                .in(OrdersDetail::getOrderId, orderIds));
+                for (OrdersDetail d : allDetails) {
+                    detailMap.computeIfAbsent(d.getOrderId(), k -> new ArrayList<>()).add(d);
+                }
+            }
+
+            Double driverLat = driver.getLatitude();
+            Double driverLng = driver.getLongitude();
+            Date now = new Date();
+            for (Orders order : orderPage.getRecords()) {
+                boolean needDepositDist = Constants.equalsInteger(order.getStatus(), Constants.OrderStatus.accepted.getStatus());
+                voList.add(buildDriverOrderVO(order, driverLat, driverLng, needDepositDist, now, detailMap));
+            }
+        }
+
+        IPage<DriverGrabOrderVO> vPage = new Page<>(pageWrap.getPage(), pageWrap.getCapacity());
+        PageData<DriverGrabOrderVO> pageData = PageData.from(vPage);
+        pageData.setRecords(voList);
+        if (orderPage != null) {
+            pageData.setTotal(orderPage.getTotal());
+            pageData.setPage(orderPage.getCurrent());
+            pageData.setCapacity(orderPage.getSize());
+        }
+        return pageData;
+    }
+
+    @Override
+    public DriverCancelLimitVO getTodayCancelLimit(Integer driverId) {
+        DriverInfo driver = driverInfoMapper.selectById(driverId);
+        if (driver == null) {
+            throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(), "鍙告満淇℃伅涓嶅瓨鍦�");
+        }
+
+        // 姣忔棩鍙栨秷涓婇檺
+        String limitStr = operationConfigBiz.getConfig().getDriverDailyCancelLimit();
+        int limit = 3;
+        if (StringUtils.isNotBlank(limitStr)) {
+            try { limit = Integer.parseInt(limitStr); } catch (NumberFormatException ignored) {}
+        }
+
+        // 浠婃棩宸插彇娑堟鏁�
+        Calendar cal = Calendar.getInstance();
+        cal.set(Calendar.HOUR_OF_DAY, 0);
+        cal.set(Calendar.MINUTE, 0);
+        cal.set(Calendar.SECOND, 0);
+        cal.set(Calendar.MILLISECOND, 0);
+        Date todayStart = cal.getTime();
+        Long todayCancelCount = orderLogMapper.selectCount(new QueryWrapper<OrderLog>().lambda()
+                .eq(OrderLog::getOptUserId, driver.getMemberId())
+                .eq(OrderLog::getObjType, Constants.OrderLogType.driverCancel.getStatus())
+                .eq(OrderLog::getOptUserType, Constants.ONE)
+                .ge(OrderLog::getCreateTime, todayStart));
+        int used = todayCancelCount != null ? todayCancelCount.intValue() : 0;
+
+        DriverCancelLimitVO vo = new DriverCancelLimitVO();
+        vo.setLimit(limit);
+        vo.setUsed(used);
+        vo.setRemain(Math.max(limit - used, 0));
+        return vo;
+    }
+
 }

--
Gitblit v1.9.3