rk
3 天以前 ce477aa3f4d34a65898c7e69162dde623182338b
代码生成
已修改14个文件
513 ■■■■ 文件已修改
server/services/src/main/java/com/doumee/core/constants/Constants.java 48 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/dao/business/model/OrderLog.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/dao/business/model/Orders.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/dao/business/model/OrdersRefund.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/dao/vo/MyOrderDetailVO.java 18 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/dao/vo/MyOrderVO.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/service/business/impl/AreasServiceImpl.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/service/business/impl/BannerServiceImpl.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/service/business/impl/CategoryServiceImpl.java 10 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/service/business/impl/DriverInfoServiceImpl.java 41 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/service/business/impl/OrderLogServiceImpl.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/service/business/impl/OrdersServiceImpl.java 249 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/service/business/impl/ShopInfoServiceImpl.java 94 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/service/business/impl/WithdrawalOrdersServiceImpl.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
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());