| | |
| | | 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; |
| | |
| | | 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.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; |
| | |
| | | |
| | | @Autowired |
| | | private NoticeService noticeService; |
| | | |
| | | @Autowired |
| | | private AreasBizImpl areasBiz; |
| | | |
| | | /** |
| | | * 发送订单站内信通知 |
| | |
| | | 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)); |
| | |
| | | |
| | | // 创建司机基础信息 |
| | | 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); |
| | | } |
| | | |
| | |
| | | .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())); |
| | |
| | | @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()); |
| | | } |
| | | } |
| | | // 查询照片列表 |
| | |
| | | .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 |
| | |
| | | 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() |
| | |
| | | .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(); |
| | | |
| | | // 累计佣金:type=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; |
| | | } |
| | |
| | | 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) { |
| | |
| | | // 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()); |
| | |
| | | // 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()); |
| | |
| | | // 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()); |
| | |
| | | // 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()); |
| | |
| | | } |
| | | } |
| | | |
| | | @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 Map<String, Integer> 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)); |
| | | Map<String, Integer> result = new HashMap<>(); |
| | | result.put("grabbedCount", grabbed != null ? grabbed.intValue() : 0); |
| | | result.put("deliveringCount", delivering != null ? delivering.intValue() : 0); |
| | | return result; |
| | | } |
| | | |
| | | } |