doum
2 天以前 4ab710d8d70017f090dd9601099ded1a50a58a10
server/services/src/main/java/com/doumee/service/business/impl/DriverInfoServiceImpl.java
@@ -480,7 +480,7 @@
        }
        // 状态校验:auditStatus=null(未提交)或auditStatus=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(), "当前状态不允许提交认证");
        }
        // 根据车辆类型判断是否需要驾驶证
@@ -634,7 +634,7 @@
        // 审批结果:auditDTO.auditStatus 0=通过→auditStatus=1,1=拒绝→auditStatus=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(), "审批通过时必须填写司机定级");
@@ -1109,10 +1109,12 @@
        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("s2.telephone", Orders::getTakeShopLinkPhone)
                .select("c2.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")
@@ -1175,11 +1177,23 @@
        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());
@@ -1199,6 +1213,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 = "";
@@ -1211,52 +1230,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));
        // 评价信息
@@ -1297,7 +1291,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())) {
@@ -1330,6 +1324,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. 写入取消日志
@@ -1428,7 +1423,8 @@
        // 通知存件门店:订单已抢单待取件
        if (order.getDepositShopId() != null) {
            sendShopNotice(order.getDepositShopId(), Constants.ShopOrderNotify.WAIT_PICKUP, orderId,
                    "orderNo", order.getCode());
                    "orderNo", order.getCode(),
                    "name", driver.getName());
        }
        // 通知司机:抢单成功
@@ -1490,6 +1486,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));
@@ -1715,14 +1712,17 @@
        vo.setIsUrgent(order.getIsUrgent());
        vo.setDriverFee(order.getDriverFee());
        vo.setUrgentAmount(order.getUrgentAmount());
        vo.setPlatformRewardAmount(order.getPlatformRewardAmount());
        // 存件门店(使用Orders自带坐标)
        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));
        }
@@ -1738,10 +1738,12 @@
            vo.setTakeAddress(order.getTakeLocationRemark());
            vo.setContactPhone(order.getTakePhone());
        }
        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));
        }
@@ -1754,6 +1756,11 @@
        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());
        // 物品明细
        List<OrdersDetail> details = detailMap.getOrDefault(order.getId(), Collections.emptyList());
@@ -1829,11 +1836,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) {
@@ -1847,6 +1857,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);
@@ -1893,6 +1908,7 @@
        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(已完成)");
@@ -1990,4 +2006,26 @@
        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;
        }
    }
}