server/services/src/main/java/com/doumee/core/constants/Constants.java
@@ -97,14 +97,6 @@ public final static String GOODS_ORDER_CREATE_LOCK = "goods:order:create:lock:"; // 订单日志操作类型 public static final int ORDER_LOG_DISPATCH = 1; // 派单 public static final int ORDER_LOG_URGENT_FEE = 2; // 加急费 public static final int ORDER_LOG_ASSIGN_DRIVER = 3; // 指派司机 public static final int ORDER_LOG_CANCEL = 4; // 取消订单 public static final int ORDER_LOG_CONFIRM_ARRIVE = 5; // 确认顾客到店 public static final int ORDER_LOG_DRIVER_PICKUP = 6; // 司机完成取件 public static final int ORDER_LOG_DRIVER_DELIVER = 7; // 司机确认送达 public static final String SUCCESS = "SUCCESS"; public static final String FAIL = "FAIL"; @@ -311,12 +303,36 @@ @Getter @AllArgsConstructor public enum OrderLogType { urgent(0, "平台加急", "平台加急,奖励金 {param} 元。"), dispatch(1, "平台指派", "平台指派司机 {param} 接单。") urgent(2, "平台加急", "平台加急,奖励金【{param}】元"), assignDriver(3, "平台指派", "平台指派司机【{param}】接单,奖励金【{param1}】元"), memberCancel(4, "会员取消订单", "{param}"), driverCancel(4, "司机取消订单", "{param}"), systemCancel(4, "系统自动取消", "{param}"), systemComplete(4, "系统自动完成", "{param}"), memberCancelToConvert(4, "会员取消异地寄存", "{param}"), shopDeposit(8, "门店确认寄存", "门店【{param}】确认寄存"), shopTake(9, "门店确认取件", "门店【{param}】确认取件,订单完成"), shopOutStock(10, "门店确认出库", "{param}"), shopConfirmArriveOverdue(5, "确认顾客到店(逾期)", "{param}"), shopConfirmArrive(5, "确认顾客到店", "{param}"), driverGrab(6, "司机抢单", "司机【{param}】抢单成功"), driverPickup(6, "司机完成取件", "司机【{param}】完成取件,开始派送"), driverDeliver(7, "司机确认送达", "{param}"), ; private int status; private String title; private String statusInfo; private final int status; private final String title; private final String statusInfo; public String format(String... params) { String result = statusInfo; if (params != null && params.length > 0) { result = result.replace("{param}", params[0] != null ? params[0] : ""); } for (int i = 1; i < params.length; i++) { result = result.replace("{param" + i + "}", params[i] != null ? params[i] : ""); } return result; } } /** @@ -575,6 +591,12 @@ MEMBER_ARRIVED("SMS_505875004", "会员端-已送达", "您的行李订单:{orderNo}已送到{address},请及时取件,取件码:{code}。"), MEMBER_DELIVERING("SMS_505935002", "会员端-配送中", "您的行李订单:{orderNo}已由司机{name}取件,正运往目的地。"), VERIFY_CODE("SMS_333770877", "验证码短信", "您的验证码为:{code},请勿泄露于他人!"), DRIVER_AUTH_REJECTED("SMS_505790115", "司机端-司机认证被拒绝", "尊敬的{driver},很遗憾,您的司机认证未通过审核。原因:{reason}。您可修改资料后重新提交。"), DRIVER_AUTH_APPROVED("SMS_505885083", "司机端-司机认证通过", "尊敬的{driver},恭喜您已通过平台司机认证审核。您可登录司机端APP开始接单,配送过程中请注意安全,祝您接单顺利!"), DRIVER_URGENT_DISPATCH("SMS_505885082", "司机端-加急派单", "您好,您有一个新的行李订单(编号:{orderNo})。起点:{address1},终点:{address2},配送费{money1}元(含加急费{money2}元)。请尽快确认订单任务。"), SHOP_AUTH_REJECTED("SMS_505925106", "门店端-资料审核被拒绝", "很遗憾,您的门店\"{storeName}\"未通过审核,原因:{reason},您可修改资料后重新提交。"), SHOP_AUTH_APPROVED_DEPOSIT("SMS_505705111", "门店端-审核通过需缴纳押金", "恭喜您!您的门店\"{storeName}\"已通过初步审核。请支付押金{money}元以完成入驻,支付后即可登录门店后台正式接单。"), SHOP_AUTH_SUCCESS("SMS_505810110", "门店端-成功入驻通知", "恭喜您!您的门店\"{storeName}\"已通过平台审核,正式入驻成功。您可登录商家后台开始接单,账号:{phone},初始密码:{password}(建议首次登录后修改)。"), ; private final String templateCode; server/services/src/main/java/com/doumee/dao/business/model/OrderLog.java
@@ -10,6 +10,7 @@ import lombok.Data; import java.util.Date; import java.util.List; /** * 订单操作日志 @@ -76,4 +77,8 @@ @ApiModelProperty(value = "操作人类型:0=用户;1=司机;2=门店;3=系统管理员", example = "0") private Integer optUserType; @TableField(exist = false) @ApiModelProperty(value = "操作类型(多选查询)") private List<Integer> objTypeList; } server/services/src/main/java/com/doumee/dao/business/model/Orders.java
@@ -419,4 +419,12 @@ @ApiModelProperty(value = "物品等级贵重标识(关联查询:0=否;1=是)") private String c2OtherField; @TableField(exist = false) @ApiModelProperty(value = "司机姓名(关联查询)") private String driverName; @TableField(exist = false) @ApiModelProperty(value = "司机电话(关联查询)") private String driverPhone; } server/services/src/main/java/com/doumee/dao/business/model/OrdersRefund.java
@@ -60,7 +60,7 @@ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") private Date refundTime; @ApiModelProperty(value = "门店备注") @ApiModelProperty(value = "退款备注") private String refundRemark; @ApiModelProperty(value = "平台操作人(type=1使用)", example = "0") server/services/src/main/java/com/doumee/dao/vo/MyOrderDetailVO.java
@@ -1,5 +1,6 @@ package com.doumee.dao.vo; import com.doumee.dao.business.model.OrdersRefund; import com.fasterxml.jackson.annotation.JsonFormat; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; @@ -122,6 +123,9 @@ @ApiModelProperty(value = "保价保费(分)") private Long declaredFee; @ApiModelProperty(value = "是否加急:0=否;1=是") private Integer isUrgent; @ApiModelProperty(value = "加急费用(分)") private Long urgentAmount; @@ -129,6 +133,9 @@ private Long actualPayAmount; // ---- 逾期 ---- @ApiModelProperty(value = "逾期状态: 0=无逾期 1=存在逾期 2=待支付逾期 3=逾期已支付") private Integer overdueStatus; @ApiModelProperty(value = "是否逾期") private Boolean overdue; @@ -141,19 +148,12 @@ // ---- 退款(status=96/99 时返回) ---- @ApiModelProperty(value = "退款金额(分)") private Long refundAmount; @ApiModelProperty(value = "退款申请时间") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") private Date refundApplyTime; @ApiModelProperty(value = "退款时间") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") private Date refundTime; @ApiModelProperty(value = "退款备注") private String refundRemark; @ApiModelProperty(value = "退款记录") private OrdersRefund refundInfo; // ---- 标记 ---- server/services/src/main/java/com/doumee/dao/vo/MyOrderVO.java
@@ -69,6 +69,9 @@ @ApiModelProperty(value = "取件门店地址(有取件门店时返回)") private String takeShopAddress; @ApiModelProperty(value = "取件门店联系电话(有取件门店时返回)") private String takeShopPhone; @ApiModelProperty(value = "取件地点(无取件门店时返回,用户自选)") private String takeLocation; @@ -110,6 +113,14 @@ @ApiModelProperty(value = "当前门店角色:1=存件门店;2=取件门店(仅门店端返回)") private Integer shopRole; // ---- 司机信息 ---- @ApiModelProperty(value = "司机姓名(异地寄存有司机时返回)") private String driverName; @ApiModelProperty(value = "司机电话(异地寄存有司机时返回)") private String driverPhone; // ---- 评价 ---- @ApiModelProperty(value = "评价状态:0=未评价;1=已评价") server/services/src/main/java/com/doumee/service/business/impl/AreasServiceImpl.java
@@ -14,7 +14,9 @@ import com.doumee.core.utils.PinYinUtil; import com.doumee.core.utils.Utils; import com.doumee.dao.business.AreasMapper; import com.doumee.dao.business.PricingRuleMapper; import com.doumee.dao.business.model.Areas; import com.doumee.dao.business.model.PricingRule; import com.doumee.service.business.AreasService; import com.github.yulichang.wrapper.MPJLambdaWrapper; import org.apache.commons.lang3.StringUtils; @@ -45,6 +47,9 @@ private AreasMapper areasMapper; @Autowired private PricingRuleMapper pricingRuleMapper; @Autowired RestTemplate restTemplate ; @@ -63,6 +68,7 @@ } }*/ areas.setIsdeleted(Constants.ZERO); areas.setCreateDate(new Date()); areasMapper.insert(areas); areas.setCode(areas.getId().toString()); areasMapper.updateById(areas); @@ -74,6 +80,11 @@ @Override public void deleteById(Integer id) { areasMapper.deleteById(id); // 同步删除该城市关联的计价规则配置 PricingRule deleteRule = new PricingRule(); deleteRule.setCityId(id); QueryWrapper<PricingRule> deleteWrapper = new QueryWrapper<>(deleteRule); pricingRuleMapper.delete(deleteWrapper); //刷新缓存数据 cacheData(); } server/services/src/main/java/com/doumee/service/business/impl/BannerServiceImpl.java
@@ -161,6 +161,8 @@ queryWrapper.orderByAsc(sortData.getProperty()); } } // 默认排序:排序码倒序、主键顺序 queryWrapper.lambda().orderByDesc(Banner::getSortnum).orderByAsc(Banner::getId); PageData<Banner> result = PageData.from(bannerMapper.selectPage(page, queryWrapper)); if (result != null && result.getRecords() != null) { String path = getBannerPath(); server/services/src/main/java/com/doumee/service/business/impl/CategoryServiceImpl.java
@@ -57,8 +57,11 @@ if(Objects.isNull(category) || Objects.isNull(category.getType()) || Objects.isNull(category.getName()) || StringUtils.isBlank(category.getDetail()) ){ throw new BusinessException(ResponseStatus.BAD_REQUEST); } // type=2(寄存说明)detail不必填,其他类型必填 if (!Constants.equalsInteger(category.getType(), Constants.TWO) && StringUtils.isBlank(category.getDetail())) { throw new BusinessException(ResponseStatus.BAD_REQUEST); } validateByType(category); @@ -100,10 +103,13 @@ || Objects.isNull(category.getId()) || Objects.isNull(category.getType()) || Objects.isNull(category.getName()) || StringUtils.isBlank(category.getDetail()) ){ throw new BusinessException(ResponseStatus.BAD_REQUEST); } // type=2(寄存说明)detail不必填,其他类型必填 if (!Constants.equalsInteger(category.getType(), Constants.TWO) && StringUtils.isBlank(category.getDetail())) { throw new BusinessException(ResponseStatus.BAD_REQUEST); } validateByType(category); LoginUserInfo loginUserInfo = (LoginUserInfo) SecurityUtils.getSubject().getPrincipal(); category.setUpdateTime(new Date()); server/services/src/main/java/com/doumee/service/business/impl/DriverInfoServiceImpl.java
@@ -638,6 +638,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 @@ -1221,7 +1235,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 +1252,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()); @@ -1312,9 +1326,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,9 +1411,9 @@ // 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()); @@ -1488,9 +1502,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()); server/services/src/main/java/com/doumee/service/business/impl/OrderLogServiceImpl.java
@@ -121,6 +121,9 @@ if (pageWrap.getModel().getOptUserId() != null) { queryWrapper.lambda().eq(OrderLog::getOptUserId, pageWrap.getModel().getOptUserId()); } if (pageWrap.getModel().getObjTypeList() != null && !pageWrap.getModel().getObjTypeList().isEmpty()) { queryWrapper.lambda().in(OrderLog::getObjType, pageWrap.getModel().getObjTypeList()); } for (PageWrap.SortData sortData : pageWrap.getSorts()) { if (sortData.getDirection().equalsIgnoreCase(PageWrap.DESC)) { queryWrapper.orderByDesc(sortData.getProperty()); @@ -128,6 +131,8 @@ queryWrapper.orderByAsc(sortData.getProperty()); } } // 默认按时间倒序 queryWrapper.lambda().orderByDesc(OrderLog::getCreateTime); return PageData.from(orderLogMapper.selectPage(page, queryWrapper)); } server/services/src/main/java/com/doumee/service/business/impl/OrdersServiceImpl.java
@@ -229,6 +229,7 @@ queryWrapper.eq(pageWrap.getModel().getTakeShopId() != null, Orders::getTakeShopId, pageWrap.getModel().getTakeShopId()); queryWrapper.and(pageWrap.getModel().getDriverKeyword() != null, i->i.like(DriverInfo::getName, pageWrap.getModel().getDriverKeyword()) .or().like(DriverInfo::getTelephone, pageWrap.getModel().getDriverKeyword())); queryWrapper.eq(pageWrap.getModel().getSettlementStatus() != null, Orders::getSettlementStatus, pageWrap.getModel().getSettlementStatus()); for (PageWrap.SortData sortData : pageWrap.getSorts()) { if (sortData.getDirection().equalsIgnoreCase(PageWrap.DESC)) { queryWrapper.orderByDesc(sortData.getProperty()); @@ -262,6 +263,7 @@ queryWrapper.eq(pageWrap.getModel().getTakeShopId() != null, Orders::getTakeShopId, pageWrap.getModel().getTakeShopId()); queryWrapper.and(pageWrap.getModel().getDriverKeyword() != null, i->i.like(DriverInfo::getName, pageWrap.getModel().getDriverKeyword()) .or().like(DriverInfo::getTelephone, pageWrap.getModel().getDriverKeyword())); queryWrapper.eq(pageWrap.getModel().getSettlementStatus() != null, Orders::getSettlementStatus, pageWrap.getModel().getSettlementStatus()); queryWrapper.select( "IFNULL(SUM(t.total_amount), 0) as total_amount_sum", @@ -1109,13 +1111,12 @@ String optUserName = getCurrentUserName(); // 加急费日志(每次单独记录本次加急费) Constants.OrderLogType urgentLogType = Constants.OrderLogType.urgent; // 加急费日志 OrderLog feeLog = new OrderLog(); feeLog.setOrderId(order.getId()); feeLog.setTitle(urgentLogType.getTitle()); feeLog.setLogInfo(urgentLogType.getStatusInfo().replace("{param}", dto.getUrgentFee().toPlainString())); feeLog.setObjType(urgentLogType.getStatus()); feeLog.setTitle(Constants.OrderLogType.urgent.getTitle()); feeLog.setLogInfo(Constants.OrderLogType.urgent.format(dto.getUrgentFee().toPlainString())); feeLog.setObjType(Constants.OrderLogType.urgent.getStatus()); feeLog.setOrderStatus(order.getStatus()); feeLog.setOptUserType(3); feeLog.setOptUserName(optUserName); @@ -1154,18 +1155,37 @@ Member driver = memberMapper.selectById(dto.getDriverId()); String driverName = driver != null ? driver.getName() : String.valueOf(dto.getDriverId()); Constants.OrderLogType dispatchLogType = Constants.OrderLogType.dispatch; OrderLog driverLog = new OrderLog(); driverLog.setOrderId(order.getId()); driverLog.setTitle(dispatchLogType.getTitle()); driverLog.setLogInfo(dispatchLogType.getStatusInfo().replace("{param}", driverName)); driverLog.setObjType(dispatchLogType.getStatus()); driverLog.setTitle(Constants.OrderLogType.assignDriver.getTitle()); driverLog.setLogInfo(Constants.OrderLogType.assignDriver.format(driverName, dto.getUrgentFee().toPlainString())); driverLog.setObjType(Constants.OrderLogType.assignDriver.getStatus()); driverLog.setOrderStatus(order.getStatus()); driverLog.setOptUserType(3); driverLog.setOptUserName(optUserName); driverLog.setCreateTime(new Date()); driverLog.setDeleted(Constants.ZERO); orderLogService.create(driverLog); // 短信通知指派司机(加急派单) DriverInfo driverInfo = driverInfoMapper.selectOne(new QueryWrapper<DriverInfo>().lambda() .eq(DriverInfo::getMemberId, dto.getDriverId()) .eq(DriverInfo::getDeleted, Constants.ZERO) .last("limit 1")); if (driverInfo != null) { String address1 = order.getDepositShopAddress() != null ? order.getDepositShopAddress() : order.getDepositShopName(); String address2 = order.getTakeShopAddress() != null ? order.getTakeShopAddress() : (order.getTakeLocation() != null ? order.getTakeLocation() : ""); // 配送费 = 司机配送费 + 加急费 long totalDriverFee = (order.getDriverFee() != null ? order.getDriverFee() : 0L) + urgentFeeFen; sendSmsNotify(driverInfo.getTelephone(), Constants.SmsNotify.DRIVER_URGENT_DISPATCH, "orderNo", order.getCode(), "address1", address1, "address2", address2, "money1", String.valueOf(totalDriverFee / 100.0), "money2", String.valueOf(urgentFeeFen / 100.0)); } } ordersMapper.update(updateWrapper); @@ -1371,8 +1391,12 @@ .select("s1.link_phone", Orders::getDepositShopLinkPhone) .select("s2.name", Orders::getTakeShopName) .select("s2.address", Orders::getTakeShopAddress) .select("s2.link_phone", Orders::getTakeShopLinkPhone) .select("d.name", Orders::getDriverName) .select("d.telephone", Orders::getDriverPhone) .leftJoin("shop_info s1 on s1.id = t.DEPOSIT_SHOP_ID") .leftJoin("shop_info s2 on s2.id = t.TAKE_SHOP_ID") .leftJoin("driver_info d on d.id = t.ACCEPT_DRIVER") .eq(Orders::getDeleted, Constants.ZERO) .eq(Orders::getMemberId, memberId) .eq(status != null, Orders::getStatus, status) @@ -1407,10 +1431,15 @@ vo.setTakeShopId(o.getTakeShopId()); vo.setTakeShopName(o.getTakeShopName()); vo.setTakeShopAddress(o.getTakeShopAddress()); vo.setTakeShopPhone(o.getTakeShopLinkPhone()); } else { vo.setTakeLocation(o.getTakeLocation()); vo.setTakeLocationRemark(o.getTakeLocationRemark()); } // 司机信息 vo.setDriverName(o.getDriverName()); vo.setDriverPhone(o.getDriverPhone()); // 取件联系人 vo.setTakeUser(o.getTakeUser()); @@ -1478,8 +1507,12 @@ .select("s1.link_phone", Orders::getDepositShopLinkPhone) .select("s2.name", Orders::getTakeShopName) .select("s2.address", Orders::getTakeShopAddress) .select("s2.link_phone", Orders::getTakeShopLinkPhone) .select("d.name", Orders::getDriverName) .select("d.telephone", Orders::getDriverPhone) .leftJoin("shop_info s1 on s1.id = t.DEPOSIT_SHOP_ID") .leftJoin("shop_info s2 on s2.id = t.TAKE_SHOP_ID") .leftJoin("driver_info d on d.id = t.ACCEPT_DRIVER") .eq(Orders::getPayStatus, Constants.ONE) .and(w -> w.eq(Orders::getDepositShopId, shopId).or().eq(Orders::getTakeShopId, shopId)) .eq(status != null, Orders::getStatus, status) @@ -1515,10 +1548,15 @@ if (o.getTakeShopId() != null) { vo.setTakeShopName(o.getTakeShopName()); vo.setTakeShopAddress(o.getTakeShopAddress()); vo.setTakeShopPhone(o.getTakeShopLinkPhone()); } else { vo.setTakeLocation(o.getTakeLocation()); vo.setTakeLocationRemark(o.getTakeLocationRemark()); } // 司机信息 vo.setDriverName(o.getDriverName()); vo.setDriverPhone(o.getDriverPhone()); vo.setTakeUser(o.getTakeUser()); vo.setTakePhone(o.getTakePhone()); @@ -1614,6 +1652,7 @@ vo.setDeclaredAmount(order.getDeclaredAmount()); vo.setDeclaredFee(order.getDeclaredFee()); vo.setUrgentAmount(order.getUrgentAmount()); vo.setIsUrgent(order.getIsUrgent()); vo.setActualPayAmount(Constants.equalsInteger(order.getPayStatus(), Constants.ONE)?order.getPayAmount():order.getEstimatedAmount()); // 标记 @@ -1685,66 +1724,53 @@ .eq(OrdersDetail::getDeleted, Constants.ZERO)); vo.setDetailList(buildDetailList(details)); Integer orderStatus = order.getStatus(); if(Constants.equalsInteger(orderStatus, Constants.FIVE)){ // 逾期信息 OverdueFeeVO overdueInfo = calculateOverdueFeeInternal(order, details); if (Constants.ONE.equals(order.getType()) && order.getTakeShopId() != null) { // 异地寄存 + 有取件门店: // 根据行李转移到店时间(arriveTime)当天晚上12点判断是否逾期 if (order.getArriveTime() != null) { Calendar arriveCal = Calendar.getInstance(); arriveCal.setTime(order.getArriveTime()); arriveCal.set(Calendar.HOUR_OF_DAY, 23); arriveCal.set(Calendar.MINUTE, 59); arriveCal.set(Calendar.SECOND, 59); Date arriveEndOfDay = arriveCal.getTime(); boolean isOverdue = new Date().after(arriveEndOfDay); vo.setOverdue(isOverdue); if (isOverdue) { vo.setOverdueDays(overdueInfo.getOverdueDays() > 0 ? overdueInfo.getOverdueDays() : 1); vo.setOverdueFee(overdueInfo.getOverdueFee()); } else { vo.setOverdueDays(0); vo.setOverdueFee(0L); } } else { vo.setOverdue(false); vo.setOverdueDays(0); vo.setOverdueFee(0L); } } else if (Constants.ZERO.equals(order.getType())) { // 就地寄存:保持原逻辑 vo.setOverdue(overdueInfo.getOverdue()); vo.setOverdueDays(overdueInfo.getOverdueDays()); vo.setOverdueFee(overdueInfo.getOverdueFee()); } } else { // 逾期状态:0=无逾期 1=存在逾期 2=待支付逾期 3=逾期已支付 if (Constants.equalsInteger(order.getOverdueStatus(), Constants.TWO)) { // 订单标记已支付逾期 vo.setOverdueStatus(Constants.THREE); vo.setOverdue(true); vo.setOverdueDays(order.getOverdueDays()); vo.setOverdueFee(order.getOverdueAmount()); } else if (Constants.equalsInteger(order.getOverdueStatus(), Constants.ONE)) { // 订单标记待支付逾期 vo.setOverdueStatus(Constants.TWO); vo.setOverdue(true); vo.setOverdueDays(order.getOverdueDays()); vo.setOverdueFee(order.getOverdueAmount()); } else if (order.getConfirmArriveTime() != null) { // 已确认到店,无逾期 vo.setOverdueStatus(Constants.ZERO); vo.setOverdue(false); vo.setOverdueDays(0); vo.setOverdueFee(0L); } else { // 未确认到店,计算实际逾期 OverdueFeeVO overdueInfo = calculateOverdueFeeInternal(order, details); if (overdueInfo.getOverdue() != null && overdueInfo.getOverdue() && overdueInfo.getOverdueFee() != null && overdueInfo.getOverdueFee() > 0) { vo.setOverdueStatus(Constants.ONE); vo.setOverdue(true); vo.setOverdueDays(overdueInfo.getOverdueDays()); vo.setOverdueFee(overdueInfo.getOverdueFee()); } else { vo.setOverdueStatus(Constants.ZERO); vo.setOverdue(false); vo.setOverdueDays(0); vo.setOverdueFee(0L); } } // 退款信息(status=96关闭/99取消时返回) if (orderStatus != null && (Constants.equalsInteger(orderStatus, Constants.OrderStatus.cancelled.getStatus()))) { // 退款信息(status=99取消时返回) if (order.getStatus() != null && Constants.equalsInteger(order.getStatus(), Constants.OrderStatus.cancelled.getStatus())) { vo.setRefundApplyTime(order.getCancelTime()); // 查询退款记录获取退款金额和备注 OrdersRefund ordersRefund = ordersRefundMapper.selectOne( new QueryWrapper<OrdersRefund>().lambda() .eq(OrdersRefund::getOrderId, order.getId()) .eq(OrdersRefund::getDeleted, Constants.ZERO) .orderByDesc(OrdersRefund::getCreateTime) .last("limit 1")); if (ordersRefund != null) { vo.setRefundAmount(ordersRefund.getRefundAmount() != null ? ordersRefund.getRefundAmount() : order.getRefundAmount()); vo.setRefundRemark(ordersRefund.getRemark()); vo.setRefundTime(ordersRefund.getRefundTime()); } else { vo.setRefundAmount(order.getRefundAmount()); } vo.setRefundInfo(ordersRefund); } // 核销码 @@ -1855,7 +1881,7 @@ order.setStatus(Constants.OrderStatus.cancelled.getStatus()); order.setCancelTime(now); ordersMapper.updateById(order); saveCancelLog(order, "会员取消订单(待支付)", reason, memberId); saveCancelLog(order, Constants.OrderLogType.memberCancel, "会员取消订单(待支付)", memberId); // 短信通知会员:订单已取消 Member cancelMember1 = memberMapper.selectById(memberId); sendSmsNotify(cancelMember1 != null ? cancelMember1.getTelephone() : null, @@ -1871,7 +1897,7 @@ order.setRefundAmount(order.getPayAmount()); ordersMapper.updateById(order); saveCancelLog(order, "会员取消订单(待寄存,全额退款)", reason, memberId); saveCancelLog(order, Constants.OrderLogType.memberCancel, "会员取消订单(待寄存,全额退款)", memberId); // 通知会员:已取消 sendOrderNotice(memberId, Constants.MemberOrderNotify.CANCELLED, orderId, "orderNo", order.getCode()); @@ -1926,23 +1952,37 @@ // 已寄存/已接单:直接将订单类型改为就地寄存 if (Constants.equalsInteger(status, Constants.OrderStatus.deposited.getStatus()) || Constants.equalsInteger(status, Constants.OrderStatus.accepted.getStatus())) { order.setType(Constants.ZERO); // 就地寄存 ordersMapper.updateById(order); saveCancelLog(order, "会员取消异地寄存订单,转为就地寄存", reason, memberId); // 通知存件门店 if (order.getDepositShopId() != null) { sendShopNotice(order.getDepositShopId(), Constants.ShopOrderNotify.REFUNDING, orderId, "orderNo", order.getCode()); ShopInfo depositShop = shopInfoMapper.selectById(order.getDepositShopId()); sendSmsNotify(depositShop != null ? depositShop.getLinkPhone() : null, Constants.SmsNotify.SHOP_REFUNDING, "orderNo", order.getCode()); // 先保存原司机信息,用于后续通知 Integer originalDriverId = order.getAcceptDriver(); DriverInfo originalDriver = originalDriverId != null ? driverInfoMapper.selectById(originalDriverId) : null; ShopInfo depositShop = shopInfoMapper.selectById(order.getDepositShopId()); // 取件点信息更新为存件门店,使用 UpdateWrapper 确保 null 字段也能生效 UpdateWrapper<Orders> updateWrapper = new UpdateWrapper<>(); updateWrapper.lambda() .eq(Orders::getId, order.getId()) .set(Orders::getType, Constants.ZERO) .set(Orders::getTakeShopId, order.getDepositShopId()) .set(Orders::getTakeShopName, order.getDepositShopName()) .set(Orders::getTakeShopAddress, order.getDepositShopAddress()) .set(Orders::getTakeShopLinkPhone, order.getDepositShopLinkPhone()) .set(Orders::getTakeLocation, order.getDepositLocation()) .set(Orders::getTakeLocationRemark, order.getDepositLocationRemark()) .set(Orders::getTakeLat, order.getDepositLat()) .set(Orders::getTakeLgt, order.getDepositLgt()); if (Constants.equalsInteger(status, Constants.OrderStatus.accepted.getStatus())) { updateWrapper.lambda() .set(Orders::getAcceptDriver, null) .set(Orders::getAcceptType, null) .set(Orders::getAcceptTime, null); } ordersMapper.update(null, updateWrapper); saveCancelLog(order, Constants.OrderLogType.memberCancelToConvert, "会员取消异地寄存订单,转为就地寄存", memberId); // 通知司机:订单已取消(已接单情况下司机需停止服务) if (order.getAcceptDriver() != null && Constants.equalsInteger(status, Constants.OrderStatus.accepted.getStatus())) { sendDriverNotice(order.getAcceptDriver(), Constants.DriverOrderNotify.REFUNDING, orderId, if (originalDriverId != null && Constants.equalsInteger(status, Constants.OrderStatus.accepted.getStatus())) { sendDriverNotice(originalDriverId, Constants.DriverOrderNotify.REFUNDING, orderId, "orderNo", order.getCode()); DriverInfo driver = driverInfoMapper.selectById(order.getAcceptDriver()); sendSmsNotify(driver != null ? driver.getTelephone() : null, sendSmsNotify(originalDriver != null ? originalDriver.getTelephone() : null, Constants.SmsNotify.DRIVER_REFUNDING, "orderNo", order.getCode()); } return; @@ -1954,12 +1994,12 @@ /** * 保存取消订单操作日志 */ private void saveCancelLog(Orders order, String title, String reason, Integer memberId) { private void saveCancelLog(Orders order, Constants.OrderLogType logType, String reason, Integer memberId) { OrderLog log = new OrderLog(); log.setOrderId(order.getId()); log.setTitle(title); log.setLogInfo(reason); log.setObjType(Constants.ORDER_LOG_CANCEL); log.setTitle(logType.getTitle()); log.setLogInfo(logType.format(reason)); log.setObjType(logType.getStatus()); log.setOrderStatus(order.getStatus()); log.setOptUserId(memberId); log.setOptUserType(0); // 0=用户 @@ -1971,12 +2011,13 @@ /** * 保存门店核销日志 */ private void saveShopVerifyLog(Orders order, String title, String logInfo, String remark, Integer shopId) { private void saveShopVerifyLog(Orders order, Constants.OrderLogType logType, String logInfo, String remark, Integer shopId) { OrderLog log = new OrderLog(); log.setOrderId(order.getId()); log.setTitle(title); log.setLogInfo(logInfo); log.setTitle(logType.getTitle()); log.setLogInfo(logInfo != null ? logInfo : logType.getStatusInfo()); log.setRemark(remark); log.setObjType(logType.getStatus()); log.setOrderStatus(order.getStatus()); log.setOptUserId(shopId); log.setOptUserType(2); // 2=门店 @@ -2307,6 +2348,15 @@ shopInfo.setUpdateTime(now); shopInfoMapper.updateById(shopInfo); // 短信通知门店:成功入驻 String rawPassword = shopInfo.getTelephone() != null && shopInfo.getTelephone().length() >= 6 ? shopInfo.getTelephone().substring(shopInfo.getTelephone().length() - 6) + "@123456" : ""; sendSmsNotify(shopInfo.getTelephone(), Constants.SmsNotify.SHOP_AUTH_SUCCESS, "storeName", shopInfo.getName(), "phone", shopInfo.getTelephone() != null ? shopInfo.getTelephone() : "", "password", rawPassword); // 6. 押金支付完成后,若城市未开通则自动开通 if (shopInfo.getAreaId() != null) { Areas shopArea = areasBiz.resolveArea(shopInfo.getAreaId()); @@ -2625,7 +2675,7 @@ // 保存寄存图片(obj_type=2 订单寄存图片,最多3张) saveVerifyImages(order.getId(), images, Constants.FileType.ORDER_DEPOSIT.getKey(), shopId); // 记录订单日志 saveShopVerifyLog(order, "门店确认寄存", "门店【" + shopName + "】确认寄存", remark, shopId); saveShopVerifyLog(order, Constants.OrderLogType.shopDeposit, Constants.OrderLogType.shopDeposit.format(shopName), remark, shopId); // 通知会员:门店核销成功 if (Constants.equalsInteger(order.getType(), Constants.ONE)) { // 异地寄存 → 待抢单 @@ -2634,7 +2684,7 @@ } else { // 就地寄存 → 待取件提醒 sendOrderNotice(order.getMemberId(), Constants.MemberOrderNotify.WAIT_PICKUP_REMIND, order.getId(), "orderNo", order.getCode()); "orderNo", order.getCode(), "shopName", shopName); } } else if (Constants.equalsInteger(status, Constants.OrderStatus.arrived.getStatus())) { // 异地寄存 + 无取件门店 → 无法核销(客户自取,无门店操作) @@ -2657,7 +2707,7 @@ calculateAndSaveOrderFees(order.getId()); generateRevenueRecords(order.getId()); // 记录订单日志 saveShopVerifyLog(order, "门店确认取件", "门店【" + shopName + "】确认取件,订单完成", remark, shopId); saveShopVerifyLog(order, Constants.OrderLogType.shopTake, Constants.OrderLogType.shopTake.format(shopName), remark, shopId); // 通知会员:订单已完成 sendOrderNotice(order.getMemberId(), Constants.MemberOrderNotify.FINISHED, order.getId(), "orderNo", order.getCode()); @@ -2770,7 +2820,7 @@ if (order.getRefundAmount() != null && order.getRefundAmount() > 0) { logInfo += ",退款" + Constants.getFormatMoney(order.getRefundAmount()) + "元"; } saveShopVerifyLog(order, "门店确认出库", logInfo, remark, shopId); saveShopVerifyLog(order, Constants.OrderLogType.shopOutStock, logInfo, remark, shopId); // 通知会员:订单已完成 sendOrderNotice(order.getMemberId(), Constants.MemberOrderNotify.FINISHED, order.getId(), "orderNo", order.getCode()); @@ -3102,9 +3152,9 @@ ordersMapper.updateById(order); // 记录订单日志 saveShopVerifyLog(order, "确认顾客到店(逾期)", "门店【" + shopName + "】确认顾客到店,逾期" + overdueInfo.getOverdueDays() + "天,逾期费用" + Constants.getFormatMoney(overdueInfo.getOverdueFee()) + "元", String overdueLogInfo = "门店【" + shopName + "】确认顾客到店,逾期" + overdueInfo.getOverdueDays() + "天,逾期费用" + Constants.getFormatMoney(overdueInfo.getOverdueFee()) + "元"; saveShopVerifyLog(order, Constants.OrderLogType.shopConfirmArriveOverdue, overdueLogInfo, null, shopId); } else { // 未逾期:标记逾期状态为0,订单保持当前状态 @@ -3148,7 +3198,7 @@ if (order.getRefundAmount() != null && order.getRefundAmount() > 0) { logInfo += ",需退款" + Constants.getFormatMoney(order.getRefundAmount()) + "元"; } saveShopVerifyLog(order, "确认顾客到店", logInfo, null, shopId); saveShopVerifyLog(order, Constants.OrderLogType.shopConfirmArrive, logInfo, null, shopId); } } @@ -3241,8 +3291,8 @@ // 物品基础日费用 = Σ(单价 × 数量) long dailyBaseFee = 0L; for (OrdersDetail d : details) { dailyBaseFee += (d.getUnitPrice() != null ? d.getUnitPrice() : 0L) * (d.getNum() != null ? d.getNum() : 0); dailyBaseFee += (d.getLocallyPrice() != null ? d.getLocallyPrice() : 0L) * (d.getNum() != null ? d.getNum() : 1); } Date now = new Date(); @@ -3326,19 +3376,20 @@ /** * 就地寄存逾期天数计算 * 过了预计取件时间当天的12点后才算一天 * 过了预计取件时间当天的24:00(次日00:00)后才算第一天 */ private int calcLocalOverdueDays(Date now, Date expectedTakeTime) { if (expectedTakeTime == null || !now.after(expectedTakeTime)) { return 0; } // 基准时间 = 预计取件日期的12:00 // 基准时间 = 预计取件日期的次日 00:00(即当天24:00) Calendar baseCal = Calendar.getInstance(); baseCal.setTime(expectedTakeTime); baseCal.set(Calendar.HOUR_OF_DAY, 12); baseCal.set(Calendar.HOUR_OF_DAY, 0); baseCal.set(Calendar.MINUTE, 0); baseCal.set(Calendar.SECOND, 0); baseCal.set(Calendar.MILLISECOND, 0); baseCal.add(Calendar.DAY_OF_MONTH, 1); // 次日00:00 = 当天24:00 Date baseTime = baseCal.getTime(); if (!now.after(baseTime)) { @@ -3527,9 +3578,9 @@ // 写入操作日志 OrderLog orderLog = new OrderLog(); orderLog.setOrderId(order.getId()); orderLog.setTitle("系统自动取消(超时未支付)"); orderLog.setLogInfo("订单超时" + autoCancelMinutes + "分钟未支付,系统自动取消"); orderLog.setObjType(Constants.ORDER_LOG_CANCEL); orderLog.setTitle(Constants.OrderLogType.systemCancel.getTitle()); orderLog.setLogInfo(Constants.OrderLogType.systemCancel.format("订单超时" + autoCancelMinutes + "分钟未支付,系统自动取消")); orderLog.setObjType(Constants.OrderLogType.systemCancel.getStatus()); orderLog.setOrderStatus(Constants.OrderStatus.cancelled.getStatus()); orderLog.setOptUserType(3); // 3=系统 orderLog.setCreateTime(now); @@ -3693,9 +3744,9 @@ // 记录操作日志 OrderLog orderLog = new OrderLog(); orderLog.setOrderId(order.getId()); orderLog.setTitle("系统自动完成"); orderLog.setLogInfo("订单已送达超过" + autoConfirmDays + "天未确认,系统自动完成"); orderLog.setObjType(Constants.ORDER_LOG_CANCEL); orderLog.setTitle(Constants.OrderLogType.systemComplete.getTitle()); orderLog.setLogInfo(Constants.OrderLogType.systemComplete.format("订单已送达超过" + autoConfirmDays + "天未确认,系统自动完成")); orderLog.setObjType(Constants.OrderLogType.systemComplete.getStatus()); orderLog.setOrderStatus(Constants.OrderStatus.finished.getStatus()); orderLog.setOptUserType(3); // 3=系统 orderLog.setCreateTime(now); server/services/src/main/java/com/doumee/service/business/impl/ShopInfoServiceImpl.java
@@ -14,6 +14,7 @@ import com.doumee.core.utils.Utils; import com.doumee.biz.system.AreasBiz; import com.doumee.biz.system.SystemDictDataBiz; import com.doumee.core.utils.aliyun.AliSmsService; import com.doumee.dao.business.MemberMapper; import com.doumee.dao.business.MultifileMapper; import com.doumee.dao.business.OrdersMapper; @@ -36,6 +37,9 @@ import com.doumee.dao.vo.ShopWebDetailVO; import com.doumee.service.business.AreasService; import com.doumee.service.business.ShopInfoService; import com.doumee.dao.business.SmsrecordMapper; import com.doumee.dao.business.model.Smsrecord; import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections.CollectionUtils; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.RandomStringUtils; @@ -52,6 +56,7 @@ * @author rk * @date 2026/04/08 */ @Slf4j @Service public class ShopInfoServiceImpl implements ShopInfoService { @@ -84,6 +89,9 @@ @Autowired private AreasService areasService; @Autowired private SmsrecordMapper smsrecordMapper; @Override public Integer create(ShopInfo shopInfo) { shopInfoMapper.insert(shopInfo); @@ -197,6 +205,9 @@ } if (pageWrap.getModel().getAreaId() != null) { queryWrapper.lambda().eq(ShopInfo::getAreaId, pageWrap.getModel().getAreaId()); } if (pageWrap.getModel().getAddress() != null) { queryWrapper.lambda().like(ShopInfo::getAddress, pageWrap.getModel().getAddress()); } if (pageWrap.getModel().getAuditStatus() != null) { queryWrapper.lambda().eq(ShopInfo::getAuditStatus, pageWrap.getModel().getAuditStatus()); @@ -320,6 +331,8 @@ existing.setAuditTime(null); existing.setAuditUserId(null); existing.setAuditStatus(Constants.ZERO); // 读取押金金额 setDepositAmountFromPricingRule(existing); shopInfoMapper.updateById(existing); shopId = existing.getId(); } else { @@ -352,6 +365,8 @@ shopInfo.setCreateTime(now); shopInfo.setUpdateTime(now); shopInfo.setRegionMemberId(member.getId()); // 读取押金金额 setDepositAmountFromPricingRule(shopInfo); shopInfoMapper.insert(shopInfo); shopId = shopInfo.getId(); } @@ -445,17 +460,27 @@ } } // 3. 从PricingRule读取押金金额 PricingRule pricingRule = pricingRuleMapper.selectOne(new QueryWrapper<PricingRule>().lambda() .eq(PricingRule::getDeleted, Constants.ZERO) .eq(PricingRule::getType, Constants.THREE) .eq(PricingRule::getFieldA, String.valueOf(shopInfo.getCompanyType())) .last("limit 1")); if (pricingRule != null && StringUtils.isNotBlank(pricingRule.getFieldB())) { shopInfo.setDepositAmount(Long.parseLong(pricingRule.getFieldB())); } // 3. 从PricingRule读取押金金额(审批时更新) setDepositAmountFromPricingRule(shopInfo); } shopInfoMapper.updateById(shopInfo); // 短信通知 if (Constants.equalsInteger(newAuditStatus, Constants.ONE)) { // 审核通过 → 通知缴纳押金 String depositMoney = shopInfo.getDepositAmount() != null ? String.valueOf(shopInfo.getDepositAmount() / 100.0) : "0"; sendSmsNotify(shopInfo.getTelephone(), Constants.SmsNotify.SHOP_AUTH_APPROVED_DEPOSIT, "storeName", shopInfo.getName(), "money", depositMoney); } else if (Constants.equalsInteger(newAuditStatus, Constants.TWO)) { // 审核驳回 sendSmsNotify(shopInfo.getTelephone(), Constants.SmsNotify.SHOP_AUTH_REJECTED, "storeName", shopInfo.getName(), "reason", auditDTO.getAuditRemark() != null ? auditDTO.getAuditRemark() : ""); } } @Override @@ -1275,4 +1300,55 @@ return errors; } /** * 从PricingRule读取押金金额并赋值到门店记录 */ private void setDepositAmountFromPricingRule(ShopInfo shopInfo) { if (shopInfo.getCompanyType() == null) { return; } PricingRule pricingRule = pricingRuleMapper.selectOne(new QueryWrapper<PricingRule>().lambda() .eq(PricingRule::getDeleted, Constants.ZERO) .eq(PricingRule::getType, Constants.THREE) .eq(PricingRule::getFieldA, String.valueOf(shopInfo.getCompanyType())) .last("limit 1")); if (pricingRule != null && StringUtils.isNotBlank(pricingRule.getFieldB())) { shopInfo.setDepositAmount(Long.parseLong(pricingRule.getFieldB())); } } /** * 发送短信通知(失败不影响主业务) */ private void sendSmsNotify(String phone, Constants.SmsNotify smsNotify, String... paramPairs) { if (StringUtils.isBlank(phone)) { return; } String content = smsNotify.format(paramPairs); try { JSONObject templateParam = new JSONObject(); for (int i = 0; i < paramPairs.length - 1; i += 2) { templateParam.put(paramPairs[i], paramPairs[i + 1]); } boolean result = 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 smsRecord = new Smsrecord(); smsRecord.setPhone(phone); smsRecord.setContent(content); smsRecord.setType(Constants.ONE); smsRecord.setStatus(result ? Constants.ONE : Constants.ZERO); smsRecord.setCreateTime(new Date()); smsRecord.setDeleted(Constants.ZERO); smsrecordMapper.insert(smsRecord); } catch (Exception e) { log.error("短信发送异常: phone={}, template={}, error={}", phone, smsNotify.name(), e.getMessage()); } } } server/services/src/main/java/com/doumee/service/business/impl/WithdrawalOrdersServiceImpl.java
@@ -182,6 +182,15 @@ if (pageWrap.getModel().getCreateEndTime() != null) { queryWrapper.le(WithdrawalOrders::getCreateTime, Utils.Date.getEnd(pageWrap.getModel().getCreateEndTime())); } // 门店端:按门店名称或联系人模糊搜索 if (StringUtils.isNotBlank(pageWrap.getModel().getShopName())) { queryWrapper.and(i -> i.like(ShopInfo::getName, pageWrap.getModel().getShopName()) .or().like(ShopInfo::getLinkName, pageWrap.getModel().getShopName())); } // 司机端:按司机姓名模糊搜索 if (StringUtils.isNotBlank(pageWrap.getModel().getMemberName())) { queryWrapper.like(DriverInfo::getName, pageWrap.getModel().getMemberName()); } for (PageWrap.SortData sortData : pageWrap.getSorts()) { if (sortData.getDirection().equalsIgnoreCase(PageWrap.DESC)) { queryWrapper.orderByDesc(sortData.getProperty());