| | |
| | | } |
| | | // 状态校验: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(), "当前状态不允许提交认证"); |
| | | } |
| | | // 根据车辆类型判断是否需要驾驶证 |
| | |
| | | // 审批结果: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(), "审批通过时必须填写司机定级"); |
| | |
| | | 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") |
| | |
| | | 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()); |
| | | |
| | |
| | | // 详情特有字段 |
| | | 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 = ""; |
| | |
| | | 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.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)); |
| | | |
| | | // 评价信息 |
| | |
| | | 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())) { |
| | |
| | | .set(Orders::getAcceptDriver, null) |
| | | .set(Orders::getAcceptTime, null) |
| | | .set(Orders::getAcceptType, null) |
| | | .set(Orders::getStatus, Constants.OrderStatus.deposited.getStatus()) |
| | | .eq(Orders::getId, orderId)); |
| | | |
| | | // 5. 写入取消日志 |
| | |
| | | // 通知存件门店:订单已抢单待取件 |
| | | if (order.getDepositShopId() != null) { |
| | | sendShopNotice(order.getDepositShopId(), Constants.ShopOrderNotify.WAIT_PICKUP, orderId, |
| | | "orderNo", order.getCode()); |
| | | "orderNo", order.getCode(), |
| | | "name", driver.getName()); |
| | | } |
| | | |
| | | // 通知司机:抢单成功 |
| | |
| | | // 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)); |
| | | |
| | |
| | | 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)); |
| | | } |
| | | |
| | |
| | | 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)); |
| | | } |
| | | |
| | |
| | | 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()); |
| | |
| | | } |
| | | |
| | | @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) { |
| | |
| | | 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); |
| | |
| | | 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(已完成)"); |
| | |
| | | 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; |
| | | } |
| | | } |
| | | |
| | | } |