From f2b6fdd955f8ac6e5b351e0b5e3a9f583ed6da2e Mon Sep 17 00:00:00 2001
From: doum <doum>
Date: 星期四, 30 四月 2026 15:26:05 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/master'

---
 server/services/src/main/java/com/doumee/service/business/impl/DriverInfoServiceImpl.java |  484 +++++++++++++++++++++++++++++++++++++++++++----------
 1 files changed, 388 insertions(+), 96 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 5bd7f52..e6aab3c 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
@@ -30,8 +30,12 @@
 import com.doumee.dao.business.OrderLogMapper;
 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.system.model.SystemUser;
+import com.doumee.service.system.SystemUserService;
 import com.doumee.dao.vo.DriverOrderDetailVO;
 import com.doumee.core.utils.aliyun.AliSmsService;
 import com.doumee.service.business.DriverInfoService;
@@ -48,6 +52,7 @@
 import org.springframework.util.CollectionUtils;
 
 import java.util.*;
+import java.util.concurrent.TimeUnit;
 import java.util.stream.Collectors;
 
 /**
@@ -112,6 +117,9 @@
 
     @Autowired
     private AreasBizImpl areasBiz;
+
+    @Autowired
+    private SystemUserService systemUserService;
 
     /**
      * 鍙戦�佽鍗曠珯鍐呬俊閫氱煡
@@ -267,13 +275,7 @@
                 .select(" ( select ifnull(sum(r.OPT_TYPE * r.AMOUNT),0) from revenue r where r.MEMBER_TYPE = 1 and r.MEMBER_ID= t.id and r.VAILD_STATUS = 1 ) as memberAmount ")
                 .selectAs(Category::getName,DriverInfo::getCarTypeName)
                 .leftJoin(Category.class, Category::getId,DriverInfo::getCarType);
-        for (PageWrap.SortData sortData : pageWrap.getSorts()) {
-            if (sortData.getDirection().equalsIgnoreCase(PageWrap.DESC)) {
-                queryWrapper.orderByDesc(sortData.getProperty());
-            } else {
-                queryWrapper.orderByAsc(sortData.getProperty());
-            }
-        }
+        queryWrapper.orderByDesc(DriverInfo::getId);
         PageData<DriverInfo> pageData = PageData.from(driverInfoMapper.selectPage(page, queryWrapper));
         for (DriverInfo d : pageData.getRecords()) {
             d.setGender(Constants.getGenderByIdCard(d.getIdcard()));
@@ -298,7 +300,7 @@
         String code = RandomStringUtils.randomNumeric(6);
         // 鍙戦�佺煭淇�
         String templateParam = "{\"code\":\"" + code + "\"}";
-        AliSmsService.sendSms(telephone, "SMS_491325122", templateParam);
+        AliSmsService.sendSms(telephone, Constants.SmsNotify.VERIFY_CODE.getTemplateCode(), templateParam);
         // 淇濆瓨鐭俊璁板綍
         Smsrecord smsrecord = new Smsrecord();
         smsrecord.setDeleted(Constants.ZERO);
@@ -404,6 +406,7 @@
             driverInfo.setMemberId(member.getId());
             driverInfo.setStatus(Constants.ZERO);
             driverInfo.setAuditStatus(99);
+            driverInfo.setJpushAlias(org.springframework.util.DigestUtils.md5DigestAsHex(telephone.getBytes()));
             driverInfoMapper.insert(driverInfo);
         }
 
@@ -477,7 +480,7 @@
         }
         // 鐘舵�佹牎楠岋細auditStatus=null(鏈彁浜�)鎴朼uditStatus=2(瀹℃壒椹冲洖)鍙彁浜よ璇�
         if (driverInfo.getAuditStatus() != null
-                && !Constants.equalsInteger(driverInfo.getAuditStatus(), Constants.TWO)) {
+                && !(Constants.equalsInteger(driverInfo.getAuditStatus(), Constants.TWO)||Constants.equalsInteger(driverInfo.getAuditStatus(), 99))) {
             throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "褰撳墠鐘舵�佷笉鍏佽鎻愪氦璁よ瘉");
         }
         // 鏍规嵁杞﹁締绫诲瀷鍒ゆ柇鏄惁闇�瑕侀┚椹惰瘉
@@ -579,6 +582,7 @@
             if (Objects.nonNull(category)) {
                 driverInfo.setCarTypeName(category.getName());
                 driverInfo.setNeedLicense(Constants.equalsInteger(Integer.valueOf(category.getOtherField()), Constants.ONE) ? Constants.ONE : Constants.ZERO);
+                driverInfo.setDriverType(category.getDetail());
             }
         }
         // 鏌ヨ鐪佸競鍖轰俊鎭�
@@ -631,7 +635,7 @@
         // 瀹℃壒缁撴灉锛歛uditDTO.auditStatus 0=閫氳繃鈫抋uditStatus=1锛�1=鎷掔粷鈫抋uditStatus=2
         Integer newAuditStatus;
         if (Constants.equalsInteger(auditDTO.getAuditStatus(), Constants.ZERO)) {
-            newAuditStatus = Constants.ONE;  // 瀹℃壒閫氳繃
+            newAuditStatus = Constants.THREE;  // 瀹℃壒閫氳繃
             // 瀹℃壒閫氳繃鏃跺徃鏈哄畾绾т负蹇呭~
             if (auditDTO.getDriverLevel() == null || auditDTO.getDriverLevel() < 1 || auditDTO.getDriverLevel() > 5) {
                 throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "瀹℃壒閫氳繃鏃跺繀椤诲~鍐欏徃鏈哄畾绾�");
@@ -713,7 +717,67 @@
                 }
             }
         }
+        // 鏌ヨ瀹℃壒浜哄悕绉�
+        if (driverInfo.getAuditUser() != null) {
+            try {
+                SystemUser auditUser = systemUserService.findById(driverInfo.getAuditUser());
+                if (auditUser != null) {
+                    driverInfo.setAuditUserName(auditUser.getRealname());
+                }
+            } catch (Exception e) {
+                // 瀹℃壒浜哄凡鍒犻櫎绛夊紓甯稿拷鐣�
+            }
+        }
         return driverInfo;
+    }
+
+    @Override
+    public DriverInfo updateDriverInfo(DriverVerifyRequest request) {
+        Integer id = request.getId();
+        if (id == null) {
+            throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "鍙告満涓婚敭涓嶈兘涓虹┖");
+        }
+        DriverInfo driverInfo = driverInfoMapper.selectById(id);
+        if (Objects.isNull(driverInfo) || Constants.equalsInteger(driverInfo.getDeleted(), Constants.ONE)) {
+            throw new BusinessException(ResponseStatus.DATA_EMPTY);
+        }
+        Date now = new Date();
+        driverInfoMapper.update(new UpdateWrapper<DriverInfo>().lambda()
+                .set(DriverInfo::getName, request.getName())
+                .set(DriverInfo::getIdcard, request.getIdcard())
+                .set(DriverInfo::getMaritalStatus, request.getMaritalStatus())
+                .set(DriverInfo::getAreaId, request.getAreaId())
+                .set(DriverInfo::getLivePlace, request.getLivePlace())
+                .set(DriverInfo::getCarCode, request.getCarCode())
+                .set(DriverInfo::getCarType, request.getCarType())
+                .set(DriverInfo::getCarColor, request.getCarColor())
+                .set(DriverInfo::getCardStartDate, request.getCardStartDate())
+                .set(DriverInfo::getCardEndDate, request.getCardEndDate())
+                .set(DriverInfo::getIdcardImg, request.getIdcardImg())
+                .set(DriverInfo::getIdcardImgBack, request.getIdcardImgBack())
+                .set(DriverInfo::getAliAccount, request.getAliAccount())
+                .set(DriverInfo::getAliName, request.getAliName())
+                .set(DriverInfo::getUpdateTime, now)
+                .eq(DriverInfo::getId, id));
+
+        // 鍒犻櫎鏃х殑鐓х墖璁板綍骞朵繚瀛樻柊鐨�
+        multifileMapper.delete(new QueryWrapper<Multifile>().lambda()
+                .eq(Multifile::getObjId, id)
+                .in(Multifile::getObjType,
+                        Constants.FileType.DRIVER_CAR.getKey(),
+                        Constants.FileType.DRIVER_LICENSE.getKey(),
+                        Constants.FileType.DRIVER_OTHER.getKey()));
+        if (!CollectionUtils.isEmpty(request.getCarImgUrls())) {
+            saveMultifileList(id, Constants.FileType.DRIVER_CAR.getKey(), request.getCarImgUrls(), now);
+        }
+        if (!CollectionUtils.isEmpty(request.getLicenseImgUrls())) {
+            saveMultifileList(id, Constants.FileType.DRIVER_LICENSE.getKey(), request.getLicenseImgUrls(), now);
+        }
+        if (!CollectionUtils.isEmpty(request.getOtherImgUrls())) {
+            saveMultifileList(id, Constants.FileType.DRIVER_OTHER.getKey(), request.getOtherImgUrls(), now);
+        }
+
+        return getDetail(id);
     }
 
     @Override
@@ -809,6 +873,7 @@
         vo.setCarCode(driver.getCarCode());
         vo.setScore(driver.getScore() != null ? driver.getScore().toPlainString() : "0");
         vo.setDriverLevel(driver.getDriverLevel());
+        vo.setDriverLevelName(Constants.getDriverLevelName(driver.getDriverLevel()));
         vo.setAuditStatus(driver.getAuditStatus());
         vo.setAuditRemark(driver.getAuditRemark());
         vo.setBalance(driver.getBalance() != null ? driver.getBalance() : 0L);
@@ -819,8 +884,11 @@
                     + systemDictDataBiz.queryByCode(Constants.OSS, Constants.MEMBER_FILES).getCode();
             vo.setFullImgUrl(imgPrefix + driver.getImgurl());
         }
-
-        // 浠婃棩棰勮浣i噾锛歳evenue琛ㄤ腑浠婂ぉ鐨勬敹鍏ヨ褰曢噾棰濅箣鍜�
+        Category category = categoryMapper.selectById(driver.getCarType());
+        if(Objects.nonNull(category)&&StringUtils.isNotBlank(category.getDetail())){
+            vo.setDriverType(category.getDetail());
+        }
+        // 浠婃棩棰勮浣i噾锛氫粖鏃ユ帴鍗曠殑鍙告満浣i噾 + 骞冲彴濂栧姳閲�
         Date now = new Date();
         Calendar cal = Calendar.getInstance();
         cal.setTime(now);
@@ -830,22 +898,22 @@
         cal.set(Calendar.MILLISECOND, 0);
         Date todayStart = cal.getTime();
 
-        QueryWrapper<Revenue> revenueWrapper = new QueryWrapper<>();
-        revenueWrapper.lambda()
-                .eq(Revenue::getMemberId, memberId)
-                .eq(Revenue::getMemberType, Constants.ONE)
-                .eq(Revenue::getOptType, Constants.ONE)
-                .eq(Revenue::getDeleted, Constants.ZERO)
-                .ge(Revenue::getCreateTime, todayStart);
-        revenueWrapper.select("IFNULL(SUM(AMOUNT),0) as amount");
-        Revenue sumResult = revenueMapper.selectOne(revenueWrapper);
-        vo.setTodayCommission(sumResult != null && sumResult.getAmount() != null ? sumResult.getAmount() : 0L);
+        QueryWrapper<Orders> commissionWrapper = new QueryWrapper<>();
+        commissionWrapper.lambda()
+                .eq(Orders::getAcceptDriver, driver.getId())
+                .eq(Orders::getDeleted, Constants.ZERO)
+                .ge(Orders::getAcceptTime, todayStart);
+        commissionWrapper.select("IFNULL(SUM(DRIVER_FEE),0) as driverFee", "IFNULL(SUM(PLATFORM_REWARD_AMOUNT),0) as platformRewardAmount");
+        Orders commissionResult = ordersMapper.selectOne(commissionWrapper);
+        long driverFee = commissionResult != null && commissionResult.getDriverFee() != null ? commissionResult.getDriverFee() : 0L;
+        long rewardAmount = commissionResult != null && commissionResult.getPlatformRewardAmount() != null ? commissionResult.getPlatformRewardAmount() : 0L;
+        vo.setTodayCommission(driverFee + rewardAmount);
 
         // 浠婃棩鎺ュ崟鏁帮細浠婂ぉ瀹屾垚鐨勮鍗曟暟锛坅cceptDriver=鍙告満涓婚敭锛岀姸鎬�=宸插畬鎴愶級
         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锛�
@@ -945,10 +1013,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());
@@ -963,6 +1029,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.detail = '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")
@@ -1060,15 +1129,18 @@
                 .select("s1.address", Orders::getDepositShopAddress)
                 .select("s2.name", Orders::getTakeShopName)
                 .select("s2.address", Orders::getTakeShopAddress)
+                .select("s1.link_phone", Orders::getDepositShopLinkPhone)
                 .select("s2.link_phone as takeShopLinkPhone")
                 .select("c2.other_field as c2OtherField")
-                .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")
+                .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 ")
+                .leftJoin("shop_info s2 on s2.id = t.TAKE_SHOP_ID    ")
+                .leftJoin("category c1 on c1.id = t.GOOD_TYPE   ")
+                .leftJoin("category c2 on c2.id = c1.RELATION_ID 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);
 
@@ -1103,10 +1175,13 @@
         wrapper.selectAll(Orders.class)
                 .select("s1.name", Orders::getDepositShopName)
                 .select("s1.address", Orders::getDepositShopAddress)
+                .select("s1.telephone", Orders::getDepositShopLinkPhone)
                 .select("s2.name", Orders::getTakeShopName)
                 .select("s2.address", Orders::getTakeShopAddress)
-                .select("s2.link_phone as takeShopLinkPhone")
-                .select("c2.other_field as c2OtherField")
+                .select("s2.telephone", Orders::getTakeShopLinkPhone)
+                .select("c1.other_field as c2OtherField")
+                .select("c1.name as goodTypeName")
+                .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")
@@ -1164,11 +1239,29 @@
         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.setDepositShopPhone(order.getDepositShopLinkPhone());
+        if (Constants.equalsInteger(order.getStatus(), Constants.OrderStatus.delivering.getStatus())
+                || Constants.equalsInteger(order.getStatus(), Constants.OrderStatus.arrived.getStatus())) {
+            if (order.getTakeShopId() != null && StringUtils.isNotBlank(order.getTakeShopLinkPhone())) {
+                vo.setTakeContactPhone(order.getTakeShopLinkPhone());
+            } else {
+                vo.setTakeContactPhone(order.getTakePhone());
+            }
+        }
         vo.setDriverFee(base.getDriverFee());
         vo.setUrgentAmount(base.getUrgentAmount());
+        vo.setPlatformRewardAmount(order.getPlatformRewardAmount());
         vo.setIsValuable(base.getIsValuable());
+        vo.setGoodLevelName(base.getGoodLevelName());
+        vo.setGoodTypeName(order.getGoodTypeName());
+        vo.setHasOversized(base.getHasOversized());
+        vo.setDriverVerifyCode(base.getDriverVerifyCode());
 
         // 鐗╁搧鏄庣粏锛堣浆鎹㈢被鍨嬶級
         List<DriverOrderDetailVO.OrderItem> detailItems = new ArrayList<>();
@@ -1177,6 +1270,7 @@
                 DriverOrderDetailVO.OrderItem item = new DriverOrderDetailVO.OrderItem();
                 item.setName(src.getName());
                 item.setQuantity(src.getQuantity());
+                item.setIsOversized(src.getIsOversized());
                 detailItems.add(item);
             }
         }
@@ -1185,6 +1279,11 @@
         // 璇︽儏鐗规湁瀛楁
         vo.setStatus(order.getStatus());
         vo.setStatusDesc(getStatusDesc(order.getStatus()));
+        vo.setCreateTime(order.getCreateTime());
+        vo.setAcceptTime(order.getAcceptTime());
+        vo.setDriverTakeTime(order.getDriverTakeTime());
+        vo.setFinishTime(order.getFinishTime());
+        vo.setRemark(order.getRemark());
 
         // 瀹㈡埛淇℃伅
         String customerInfo = "";
@@ -1197,52 +1296,27 @@
         vo.setCustomerInfo(customerInfo);
 
         // 瀵艰埅缁忕含搴︼紙浣跨敤Orders鑷甫鍧愭爣锛�
-        if (Constants.equalsInteger(order.getStatus(), Constants.TWO)) {
+        if (Constants.equalsInteger(order.getStatus(), Constants.OrderStatus.accepted.getStatus())) {
             if (order.getDepositLgt() != null && order.getDepositLat() != null) {
                 vo.setNavigateLat(order.getDepositLgt().doubleValue());
                 vo.setNavigateLng(order.getDepositLat().doubleValue());
             }
-        } else {
+        } else if(Constants.equalsInteger(order.getStatus(), Constants.OrderStatus.delivering.getStatus())){
             if (order.getTakeLgt() != null && order.getTakeLat() != null) {
                 vo.setNavigateLat(order.getTakeLgt().doubleValue());
                 vo.setNavigateLng(order.getTakeLat().doubleValue());
             }
         }
 
-        // 寮傚湴瀵勫瓨瀹炴椂缁忕含搴︼紙鎸夌姸鎬佽繑鍥烇級
-        if (Constants.ONE.equals(order.getType())) {
-            // 鍙告満鑷韩缁忕含搴�
-            vo.setDriverLng(driverLng);
-            vo.setDriverLat(driverLat);
-
-            // status=3(宸叉帴鍗�)锛氳繑鍥炲瓨浠堕棬搴楃粡绾害
-            if (Constants.equalsInteger(order.getStatus(), Constants.OrderStatus.accepted.getStatus())) {
-                if (order.getDepositShopId() != null) {
-                    ShopInfo depositShop = shopInfoMapper.selectById(order.getDepositShopId());
-                    if (depositShop != null) {
-                        vo.setDepositShopLng(depositShop.getLongitude());
-                        vo.setDepositShopLat(depositShop.getLatitude());
-                    }
-                }
-            }
-            // status=4(閰嶉�佷腑)锛氳繑鍥炲彇浠剁偣缁忕含搴�
-            if (Constants.equalsInteger(order.getStatus(), Constants.OrderStatus.delivering.getStatus())) {
-                if (order.getTakeShopId() != null) {
-                    ShopInfo takeShop = shopInfoMapper.selectById(order.getTakeShopId());
-                    if (takeShop != null) {
-                        vo.setTakeLng(takeShop.getLongitude());
-                        vo.setTakeLat(takeShop.getLatitude());
-                    }
-                } else if (order.getTakeLgt() != null && order.getTakeLat() != null) {
-                    vo.setTakeLng(order.getTakeLgt().doubleValue());
-                    vo.setTakeLat(order.getTakeLat().doubleValue());
-                }
-            }
-        }
-
+        vo.setDepositShopLng(order.getDepositLgt().doubleValue());
+        vo.setDepositShopLat(order.getDepositLat().doubleValue());
+        vo.setTakeLng(order.getTakeLgt().doubleValue());
+        vo.setTakeLat(order.getTakeLat().doubleValue());
+        vo.setDriverLng(driverLng);
+        vo.setDriverLat(driverLat);
         // 涓嬪崟闄勪欢鍥剧墖
         String imgPrefix = systemDictDataBiz.queryByCode(Constants.OSS, Constants.RESOURCE_PATH).getCode()
-                + systemDictDataBiz.queryByCode(Constants.OSS, Constants.MEMBER_FILES).getCode();
+                + systemDictDataBiz.queryByCode(Constants.OSS, Constants.ORDERS_FILES).getCode();
         vo.setOrderImages(getFileUrls(orderId, Constants.FileType.ORDER_FILE.getKey(), imgPrefix));
 
         // 璇勪环淇℃伅
@@ -1283,7 +1357,7 @@
         if (!Constants.ONE.equals(order.getType())) {
             throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "浠呭紓鍦板瘎瀛樿鍗曞彲鍙栨秷");
         }
-        if (!Constants.TWO.equals(order.getStatus())) {
+        if (!Constants.equalsInteger(Constants.OrderStatus.accepted.getStatus(), order.getStatus())) {
             throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "褰撳墠璁㈠崟鐘舵�佷笉鍏佽鍙栨秷");
         }
         if (!driverId.equals(order.getAcceptDriver())) {
@@ -1316,6 +1390,7 @@
                 .set(Orders::getAcceptDriver, null)
                 .set(Orders::getAcceptTime, null)
                 .set(Orders::getAcceptType, null)
+                .set(Orders::getStatus, Constants.OrderStatus.deposited.getStatus())
                 .eq(Orders::getId, orderId));
 
         // 5. 鍐欏叆鍙栨秷鏃ュ織
@@ -1380,11 +1455,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));
@@ -1407,12 +1484,14 @@
 
         // 7. 閫氱煡浼氬憳锛氬徃鏈哄凡鎶㈠崟
         sendOrderNotice(order.getMemberId(), Constants.MemberOrderNotify.WAIT_PICKUP_GRABBED, orderId,
+                "orderNo", order.getCode(),
                 "driverName", driver.getName());
 
         // 閫氱煡瀛樹欢闂ㄥ簵锛氳鍗曞凡鎶㈠崟寰呭彇浠�
         if (order.getDepositShopId() != null) {
             sendShopNotice(order.getDepositShopId(), Constants.ShopOrderNotify.WAIT_PICKUP, orderId,
-                    "orderNo", order.getCode());
+                    "orderNo", order.getCode(),
+                    "name", driver.getName());
         }
 
         // 閫氱煡鍙告満锛氭姠鍗曟垚鍔�
@@ -1474,6 +1553,7 @@
         // 4. 鏇存柊璁㈠崟鐘舵�佷负娲鹃�佷腑(4)
         ordersMapper.update(new UpdateWrapper<Orders>().lambda()
                 .set(Orders::getStatus, Constants.OrderStatus.delivering.getStatus())
+                .set(Orders::getTakeTime, now)
                 .set(Orders::getUpdateTime, now)
                 .eq(Orders::getId, orderId));
 
@@ -1486,6 +1566,7 @@
         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);
@@ -1636,6 +1717,22 @@
         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) {
         double R = 6371;
         double dLat = Math.toRadians(lat2 - lat1);
@@ -1682,43 +1779,89 @@
         vo.setIsUrgent(order.getIsUrgent());
         vo.setDriverFee(order.getDriverFee());
         vo.setUrgentAmount(order.getUrgentAmount());
+        vo.setPlatformRewardAmount(order.getPlatformRewardAmount());
 
         // 瀛樹欢闂ㄥ簵锛堜娇鐢∣rders鑷甫鍧愭爣锛�
         vo.setDepositShopName(order.getDepositShopName());
         vo.setDepositShopAddress(order.getDepositShopAddress());
+        vo.setDepositLng(order.getDepositLgt() != null ? order.getDepositLgt().doubleValue() : null);
+        vo.setDepositLat(order.getDepositLat() != null ? order.getDepositLat().doubleValue() : null);
         if (needDepositDist && driverLat != null && driverLng != null
                 && order.getDepositLgt() != null && order.getDepositLat() != null) {
-            double distKm = haversine(driverLat, driverLng,
-                    order.getDepositLgt().doubleValue(), order.getDepositLat().doubleValue());
+            double distKm = haversine(driverLat, driverLng, order.getDepositLat().doubleValue(),
+                    order.getDepositLgt().doubleValue());
             vo.setDepositDistance(formatDistance(distKm));
         }
 
-        // 鍙栦欢淇℃伅 + 鑱旂郴鐢佃瘽锛堜娇鐢∣rders鑷甫鍧愭爣锛�
+        // 鍙栦欢淇℃伅锛堜娇鐢∣rders鑷甫鍧愭爣锛�
         boolean hasTakeShop = order.getTakeShopId() != null && StringUtils.isNotBlank(order.getTakeShopName());
         if (hasTakeShop) {
             vo.setTakeName(order.getTakeShopName());
-            vo.setContactPhone(order.getTakeShopLinkPhone());
+            vo.setTakeAddress(order.getTakeShopAddress());
+            vo.setTakeShopId(order.getTakeShopId());
         } else {
             vo.setTakeName(order.getTakeLocation());
-            vo.setContactPhone(order.getTakePhone());
+            vo.setTakeAddress(order.getTakeLocationRemark());
         }
+        vo.setTakeLng(order.getTakeLgt() != null ? order.getTakeLgt().doubleValue() : null);
+        vo.setTakeLat(order.getTakeLat() != null ? order.getTakeLat().doubleValue() : null);
         if (driverLat != null && driverLng != null
                 && order.getTakeLgt() != null && order.getTakeLat() != null) {
-            double takeDist = haversine(driverLat, driverLng,
-                    order.getTakeLgt().doubleValue(), order.getTakeLat().doubleValue());
+            double takeDist = haversine(driverLat, driverLng, order.getTakeLat().doubleValue(),
+                    order.getTakeLgt().doubleValue());
             vo.setTakeDistance(formatDistance(takeDist));
         }
 
         // 璐甸噸鐗╁搧
         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());
+        }
+
+        // 璁㈠崟鐘舵��
+        vo.setStatus(order.getStatus());
+        vo.setStatusDesc(getStatusDesc(order.getStatus()));
+        vo.setCreateTime(order.getCreateTime());
+
+        // 鑱旂郴鐢佃瘽锛堟寜璁㈠崟鐘舵�侊級
+        if (Constants.equalsInteger(order.getStatus(), Constants.THREE)) {
+            vo.setContactPhone(order.getDepositShopLinkPhone());
+        } else if (Constants.equalsInteger(order.getStatus(), Constants.FOUR)) {
+            if (hasTakeShop) {
+                vo.setContactPhone(order.getTakeShopLinkPhone());
+            } else {
+                vo.setContactPhone(order.getTakePhone());
+            }
+        } else if (Constants.equalsInteger(order.getStatus(), Constants.FIVE)) {
+            vo.setContactPhone(order.getTakePhone());
+        }
 
         // 鐗╁搧鏄庣粏
         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);
@@ -1739,19 +1882,16 @@
             for (int i = 0; i < paramPairs.length - 1; i += 2) {
                 templateParam.put(paramPairs[i], paramPairs[i + 1]);
             }
-            boolean result = AliSmsService.sendSms(phone, smsNotify.getTemplateCode(),
+            String error = AliSmsService.sendSms(phone, smsNotify.getTemplateCode(),
                     templateParam.toJSONString());
-            if (result) {
-                log.info("鐭俊鍙戦�佹垚鍔�: phone={}, template={}", phone, smsNotify.name());
-            } else {
-                log.warn("鐭俊鍙戦�佸け璐�: phone={}, template={}", phone, smsNotify.name());
-            }
-            // 瀛樺偍鐭俊璁板綍
             Smsrecord record = new Smsrecord();
             record.setPhone(phone);
             record.setContent(content);
-            record.setType(Constants.ONE); // 1=璁㈠崟閫氱煡
-            record.setStatus(result ? Constants.ONE : Constants.ZERO);
+            record.setType(Constants.ONE);
+            record.setStatus(error == null ? Constants.ONE : Constants.ZERO);
+            if (error != null) {
+                record.setRemark(error);
+            }
             record.setCreateTime(new Date());
             record.setDeleted(Constants.ZERO);
             smsrecordMapper.insert(record);
@@ -1763,6 +1903,7 @@
                 record.setContent(content);
                 record.setType(Constants.ONE);
                 record.setStatus(Constants.ZERO);
+                record.setRemark(e.getMessage());
                 record.setCreateTime(new Date());
                 record.setDeleted(Constants.ZERO);
                 smsrecordMapper.insert(record);
@@ -1771,11 +1912,14 @@
     }
 
     @Override
-    public void changePassword(Integer driverId, String newPassword, String token) {
-        if (StringUtils.isBlank(newPassword)) {
-            throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "瀵嗙爜涓嶈兘涓虹┖");
+    public void changePassword(Integer driverId, String oldPassword, String newPassword, String token) {
+        if (StringUtils.isBlank(oldPassword)) {
+            throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "鏃у瘑鐮佷笉鑳戒负绌�");
         }
-        // 鏍¢獙瀵嗙爜蹇呴』鍚屾椂鍖呭惈瀛楁瘝鍜屾暟瀛�
+        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) {
@@ -1789,6 +1933,11 @@
         Member member = memberMapper.selectById(driverInfo.getMemberId());
         if (member == null) {
             throw new BusinessException(ResponseStatus.DATA_EMPTY);
+        }
+        // 鏍¢獙鏃у瘑鐮�
+        String oldEncryptPwd = secure.encryptPassword(oldPassword, member.getSalt());
+        if (!oldEncryptPwd.equals(member.getPassword())) {
+            throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "鏃у瘑鐮侀敊璇�");
         }
         // 鍔犲瘑鏂板瘑鐮佸苟鏇存柊
         String salt = RandomStringUtils.randomAlphanumeric(6);
@@ -1804,7 +1953,7 @@
     }
 
     @Override
-    public Map<String, Integer> getActiveOrderCount(Integer driverId) {
+    public DriverActiveOrderCountVO getActiveOrderCount(Integer driverId) {
         // 宸叉姠鍗�(status=3)鏁伴噺
         Long grabbed = ordersMapper.selectCount(new QueryWrapper<Orders>().lambda()
                 .eq(Orders::getAcceptDriver, driverId)
@@ -1815,10 +1964,153 @@
                 .eq(Orders::getAcceptDriver, driverId)
                 .eq(Orders::getStatus, Constants.OrderStatus.delivering.getStatus())
                 .eq(Orders::getDeleted, Constants.ZERO));
-        Map<String, Integer> result = new HashMap<>();
-        result.put("grabbedCount", grabbed != null ? grabbed.intValue() : 0);
-        result.put("deliveringCount", delivering != null ? delivering.intValue() : 0);
-        return result;
+        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.arrived.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::getDepositShopAddress)
+                .select("s1.link_phone as takeShopLinkPhone")
+                .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;
+    }
+
+    @Override
+    public boolean checkDriverToken(String token) {
+        if (StringUtils.isBlank(token) || !token.startsWith(Constants.ONE + "")) {
+            return false;
+        }
+        String tokenRedis = (String) redisTemplate.opsForValue().get(Constants.REDIS_TOKEN_KEY + token);
+        if (StringUtils.isBlank(tokenRedis)) {
+            return false;
+        }
+        try {
+            int lastIndex = token.lastIndexOf("_") + 1;
+            Integer memberId = Integer.valueOf(token.substring(lastIndex));
+            Member member = memberMapper.selectById(memberId);
+            return member != null
+                    && !Constants.ONE.equals(member.getDeleted())
+                    && !Constants.ONE.equals(member.getStatus())
+                    && Constants.ONE.equals(member.getUserType());
+        } catch (Exception e) {
+            return false;
+        }
+    }
+
+    @Override
+    public void registerJpushAlias(Integer driverId, String jpushAlias) {
+        DriverInfo update = new DriverInfo();
+        update.setId(driverId);
+        update.setJpushAlias(jpushAlias);
+        driverInfoMapper.updateById(update);
     }
 
 }

--
Gitblit v1.9.3