rk
2 天以前 761d13616d43b147142d7d33da3a646f6ac15397
代码生成
已添加3个文件
已修改36个文件
1179 ■■■■ 文件已修改
server/admin/src/main/java/com/doumee/api/business/AreasController.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/admin/src/main/java/com/doumee/api/business/DriverInfoController.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/admin/src/main/java/com/doumee/api/business/OrdersRefundController.java 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/admin/src/main/java/com/doumee/api/business/PricingRuleController.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/api/system/SystemUserController.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/biz/system/impl/OperationConfigBizImpl.java 5 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/config/wx/WxPayV3Service.java 29 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/core/constants/Constants.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/core/utils/geocode/MapUtil.java 40 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/dao/business/model/Category.java 4 ●●●● 补丁 | 查看 | 原始文档 | 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 39 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/dao/dto/CreateOrderDTO.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/dao/dto/DirectionInfoDTO.java 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/dao/dto/OperationConfigDTO.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/dao/dto/OrdersRefundPageDTO.java 39 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/dao/vo/DriverGrabOrderVO.java 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/dao/vo/DriverOrderDetailVO.java 34 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/dao/vo/OrderDetailVO.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/dao/vo/OrdersRefundPageVO.java 63 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/dao/vo/PlatformAboutVO.java 48 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/service/business/AreasService.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/service/business/DriverInfoService.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/service/business/OrdersRefundService.java 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/service/business/ShopInfoService.java 3 ●●●● 补丁 | 查看 | 原始文档 | 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 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/service/business/impl/CategoryServiceImpl.java 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/service/business/impl/DriverInfoServiceImpl.java 134 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/service/business/impl/MemberServiceImpl.java 52 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/service/business/impl/OrdersRefundServiceImpl.java 157 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/service/business/impl/OrdersServiceImpl.java 197 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/service/business/impl/PricingRuleServiceImpl.java 39 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/service/business/impl/ShopInfoServiceImpl.java 47 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/service/business/impl/WithdrawalOrdersServiceImpl.java 5 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/resources/application-pro.yml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/web/src/main/java/com/doumee/api/web/ConfigApi.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/web/src/main/java/com/doumee/api/web/DriverInfoApi.java 20 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/web/src/main/java/com/doumee/api/web/ShopInfoApi.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/admin/src/main/java/com/doumee/api/business/AreasController.java
@@ -70,6 +70,14 @@
        return ApiResponse.success(null);
    }
    @ApiOperation("修改状态")
    @PostMapping("/updateStatus")
    @RequiresPermissions("business:areas:update")
    public ApiResponse updateStatus(@RequestBody Areas areas) {
        areasService.updateStatus(areas);
        return ApiResponse.success(null);
    }
    @ApiOperation("分页查询")
    @PostMapping("/page")
//    @RequiresPermissions("business:areas:query")
server/admin/src/main/java/com/doumee/api/business/DriverInfoController.java
@@ -116,4 +116,14 @@
        return ApiResponse.success("操作成功");
    }
    @ApiOperation("已支付押金司机列表")
    @GetMapping("/paidDepositList")
    @RequiresPermissions("business:driverInfo:query")
    public ApiResponse<List<DriverInfo>> paidDepositList() {
        DriverInfo query = new DriverInfo();
        query.setAuditStatus(3);
        query.setDeleted(0);
        return ApiResponse.success(driverInfoService.findList(query));
    }
}
server/admin/src/main/java/com/doumee/api/business/OrdersRefundController.java
@@ -1,17 +1,22 @@
package com.doumee.api.business;
import com.doumee.api.BaseController;
import com.doumee.core.annotation.excel.ExcelExporter;
import com.doumee.core.annotation.pr.PreventRepeat;
import com.doumee.core.model.ApiResponse;
import com.doumee.core.model.PageData;
import com.doumee.core.model.PageWrap;
import com.doumee.dao.business.model.OrdersRefund;
import com.doumee.dao.dto.OrdersRefundPageDTO;
import com.doumee.dao.vo.OrdersRefundPageVO;
import com.doumee.service.business.OrdersRefundService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletResponse;
import java.util.ArrayList;
import java.util.List;
@@ -69,8 +74,8 @@
    @ApiOperation("分页查询")
    @PostMapping("/page")
    @RequiresPermissions("business:ordersRefund:query")
    public ApiResponse<PageData<OrdersRefund>> findPage(@RequestBody PageWrap<OrdersRefund> pageWrap) {
        return ApiResponse.success(ordersRefundService.findPage(pageWrap));
    public ApiResponse<PageData<OrdersRefundPageVO>> findPage(@RequestBody PageWrap<OrdersRefundPageDTO> pageWrap) {
        return ApiResponse.success(ordersRefundService.refundPage(pageWrap));
    }
    @ApiOperation("根据ID查询")
@@ -79,4 +84,23 @@
    public ApiResponse findById(@PathVariable Integer id) {
        return ApiResponse.success(ordersRefundService.findById(id));
    }
    @PreventRepeat
    @ApiOperation("重新退款")
    @PostMapping("/retryRefund/{id}")
    @RequiresPermissions("business:ordersRefund:update")
    public ApiResponse retryRefund(@PathVariable Integer id) {
        ordersRefundService.retryRefund(id);
        return ApiResponse.success("操作成功");
    }
    @ApiOperation("导出Excel")
    @PostMapping("/exportExcel")
    @RequiresPermissions("business:ordersRefund:exportExcel")
    public void exportExcel(@RequestBody PageWrap<OrdersRefundPageDTO> pageWrap, HttpServletResponse response) {
        pageWrap.setPage(1);
        pageWrap.setCapacity(99999);
        PageData<OrdersRefundPageVO> pageData = ordersRefundService.refundPage(pageWrap);
        ExcelExporter.build(OrdersRefundPageVO.class).export(pageData.getRecords(), "退款记录", response);
    }
}
server/admin/src/main/java/com/doumee/api/business/PricingRuleController.java
@@ -42,7 +42,7 @@
    @Autowired
    private PricingRuleService pricingRuleService;
    @PreventRepeat
    /*@PreventRepeat
    @ApiOperation("新建")
    @PostMapping("/create")
    @RequiresPermissions("business:pricingRule:create")
@@ -99,7 +99,7 @@
    @RequiresPermissions("business:pricingRule:query")
    public ApiResponse findById(@PathVariable Integer id) {
        return ApiResponse.success(pricingRuleService.findById(id));
    }
    }*/
    @PreventRepeat
    @ApiOperation("批量保存就地存取规则")
server/services/src/main/java/com/doumee/api/system/SystemUserController.java
@@ -8,6 +8,7 @@
import com.doumee.core.constants.Constants;
import com.doumee.core.model.PageData;
import com.doumee.core.model.PageWrap;
import com.doumee.dao.system.model.SystemUser;
import com.doumee.dao.system.dto.CreateSystemUserDTO;
import com.doumee.dao.system.dto.CreateUserRoleDTO;
import com.doumee.dao.system.dto.QuerySystemUserDTO;
@@ -102,4 +103,13 @@
    public ApiResponse<PageData<SystemUserListVO>> findPage (@RequestBody PageWrap<QuerySystemUserDTO> pageWrap) {
        return ApiResponse.success(systemUserService.findPage(pageWrap));
    }
    @ApiOperation("用户列表(仅主键和姓名)")
    @GetMapping("/list")
    @RequiresPermissions("system:user:query")
    public ApiResponse<List<SystemUser>> list() {
        SystemUser query = new SystemUser();
        query.setDeleted(false);
        return ApiResponse.success(systemUserService.findList(query));
    }
}
server/services/src/main/java/com/doumee/biz/system/impl/OperationConfigBizImpl.java
@@ -36,6 +36,7 @@
        dto.setAutoConfirmReceipt(getValue(Constants.OP_AUTO_CONFIRM_RECEIPT));
        dto.setNoGrabNotifyTime(getValue(Constants.OP_NO_GRAB_NOTIFY_TIME));
        dto.setNoGrabNotifyUsers(getValue(Constants.OP_NO_GRAB_NOTIFY_USERS));
        dto.setDefaultDeliveryRange(getValue(Constants.OP_DEFAULT_DELIVERY_RANGE));
        return dto;
    }
@@ -53,6 +54,7 @@
        saveOrUpdate(Constants.OP_AUTO_CONFIRM_RECEIPT, "自动确认收货", dto.getAutoConfirmReceipt());
        saveOrUpdate(Constants.OP_NO_GRAB_NOTIFY_TIME, "无人抢单通知时间", dto.getNoGrabNotifyTime());
        saveOrUpdate(Constants.OP_NO_GRAB_NOTIFY_USERS, "无人抢单短信通知人员", dto.getNoGrabNotifyUsers());
        saveOrUpdate(Constants.OP_DEFAULT_DELIVERY_RANGE, "默认配送范围", dto.getDefaultDeliveryRange());
    }
    private String getValue(String label) {
@@ -88,7 +90,8 @@
                || StringUtils.isBlank(dto.getOrderAcceptLimit())
                || StringUtils.isBlank(dto.getAutoConfirmReceipt())
                || StringUtils.isBlank(dto.getNoGrabNotifyTime())
                || StringUtils.isBlank(dto.getNoGrabNotifyUsers())) {
                || StringUtils.isBlank(dto.getNoGrabNotifyUsers())
                || StringUtils.isBlank(dto.getDefaultDeliveryRange())) {
            throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "所有配置项均为必填");
        }
    }
server/services/src/main/java/com/doumee/config/wx/WxPayV3Service.java
@@ -2,12 +2,12 @@
import com.doumee.core.constants.ResponseStatus;
import com.doumee.core.exception.BusinessException;
import com.doumee.core.utils.ID;
import com.wechat.pay.java.core.notification.RequestParam;
import com.wechat.pay.java.service.payments.jsapi.model.PrepayRequest;
import com.wechat.pay.java.service.payments.jsapi.model.PrepayWithRequestPaymentResponse;
import com.wechat.pay.java.service.refund.model.AmountReq;
import com.wechat.pay.java.service.refund.model.CreateRequest;
import com.wechat.pay.java.service.refund.model.QueryByOutRefundNoRequest;
import com.wechat.pay.java.service.refund.model.Refund;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
@@ -88,6 +88,7 @@
    /**
     * V3退款
     *
     * @param outRefundNo  å•†æˆ·é€€æ¬¾å•号(由调用方生成)
     * @param outTradeNo   å•†æˆ·è®¢å•号
     * @param totalCents   åŽŸè®¢å•é‡‘é¢ï¼ˆåˆ†ï¼‰
     * @param refundCents  é€€æ¬¾é‡‘额(分)
@@ -95,14 +96,12 @@
     * @param notifyUrl    é€€æ¬¾å›žè°ƒåœ°å€
     * @return Refund é€€æ¬¾ç»“果(包含 outRefundNo、status ç­‰ï¼‰
     */
    public Refund refund(String outTradeNo, Long totalCents, Long refundCents,
    public Refund refund(String outRefundNo, String outTradeNo, Long totalCents, Long refundCents,
                         String reason, String notifyUrl) {
        if (WxMiniConfig.v3RefundService == null) {
            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "微信支付V3未初始化");
        }
        try {
            String outRefundNo = ID.nextGUID();
            CreateRequest request = new CreateRequest();
            request.setOutTradeNo(outTradeNo);
            request.setOutRefundNo(outRefundNo);
@@ -183,4 +182,26 @@
            throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "退款回调验签失败");
        }
    }
    /**
     * æŸ¥è¯¢å•笔退款
     *
     * @param outRefundNo å•†æˆ·é€€æ¬¾å•号
     * @return Refund é€€æ¬¾ç»“æžœ
     */
    public Refund queryRefund(String outRefundNo) {
        if (WxMiniConfig.v3RefundService == null) {
            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "微信支付V3未初始化");
        }
        try {
            QueryByOutRefundNoRequest request = new QueryByOutRefundNoRequest();
            request.setOutRefundNo(outRefundNo);
            Refund result = WxMiniConfig.v3RefundService.queryByOutRefundNo(request);
            log.info("微信支付V3查询单笔退款, outRefundNo={}, status={}", outRefundNo, result.getStatus());
            return result;
        } catch (Exception e) {
            log.error("微信支付V3查询退款失败: {}", e.getMessage(), e);
            throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "查询退款失败:" + e.getMessage());
        }
    }
}
server/services/src/main/java/com/doumee/core/constants/Constants.java
@@ -101,6 +101,7 @@
    public static final String OP_AUTO_CONFIRM_RECEIPT = "AUTO_CONFIRM_RECEIPT";
    public static final String OP_NO_GRAB_NOTIFY_TIME = "NO_GRAB_NOTIFY_TIME";
    public static final String OP_NO_GRAB_NOTIFY_USERS = "NO_GRAB_NOTIFY_USERS";
    public static final String OP_DEFAULT_DELIVERY_RANGE = "DEFAULT_DELIVERY_RANGE";
    public static boolean WORKORDER_SHE_EMAIL_SENDING = false;
    public static  boolean DEALING_COMPANY_SYNC = false ;
    public static  boolean DEALING_MEMBER_SYNC = false ;
@@ -320,6 +321,8 @@
    @Getter
    @AllArgsConstructor
    public enum OrderLogType {
        createOrder(1, "创建订单", "会员创建寄存订单,订单编号【{param}】"),
        payOrder(1, "订单支付", "会员支付成功,支付金额【{param}】元"),
        urgent(2, "平台加急", "平台加急,奖励金【{param}】元"),
        assignDriver(3, "平台指派", "平台指派司机【{param}】接单,奖励金【{param1}】元"),
        memberCancel(4, "会员取消订单", "{param}"),
server/services/src/main/java/com/doumee/core/utils/geocode/MapUtil.java
@@ -165,4 +165,44 @@
            throw new RuntimeException("高德地图路径规划异常", e);
        }
    }
    public static JSONObject directionInfo(String mode, String from, String to) {
        // é«˜å¾·åæ ‡ç³»ä¸º lng,lat
        String[] fromArr = from.split(",");
        String[] toArr = to.split(",");
        String origin = fromArr[1] + "," + fromArr[0];   // lng,lat
        String destination = toArr[1] + "," + toArr[0];  // lng,lat
        try {
            String url;
            if ("bicycling".equals(mode)) {
                url = BICYCLING_URL
                        + "?key=" + amapKey
                        + "&origin=" + URLEncoder.encode(origin, "UTF-8")
                        + "&destination=" + URLEncoder.encode(destination, "UTF-8");
            } else {
                // é»˜è®¤é©¾è½¦
                url = DRIVING_URL
                        + "?key=" + amapKey
                        + "&origin=" + URLEncoder.encode(origin, "UTF-8")
                        + "&destination=" + URLEncoder.encode(destination, "UTF-8");
            }
            log.info("高德地图路径规划请求: mode={}, from={}, to={}", mode, from, to);
            JSONObject json = new Http().build(url)
                    .setConnectTimeout(5000)
                    .setReadTimeout(10000)
                    .get()
                    .toJSONObject();
            log.info("高德地图路径规划响应: {}", json);
            return json;
        } catch (IOException e) {
            log.error("高德地图路径规划异常", e);
            throw new RuntimeException("高德地图路径规划异常", e);
        }
    }
}
server/services/src/main/java/com/doumee/dao/business/model/Category.java
@@ -98,4 +98,8 @@
    @ApiModelProperty(value = "图标全路径")
    @TableField(exist = false)
    private String iconFull;
    @ApiModelProperty(value = "自关联对象名称")
    @TableField(exist = false)
    private String relationName;
}
server/services/src/main/java/com/doumee/dao/business/model/Orders.java
@@ -424,10 +424,18 @@
    private String goodLevelName;
    @TableField(exist = false)
    @ApiModelProperty(value = "物品类型名称(关联查询)")
    private String goodTypeName;
    @TableField(exist = false)
    @ApiModelProperty(value = "是否存在特大尺寸:0=否 1=是(关联查询)")
    private Integer hasOversized;
    @TableField(exist = false)
    @ApiModelProperty(value = "订单状态描述")
    private String statusDesc;
    @TableField(exist = false)
    @ApiModelProperty(value = "司机姓名(关联查询)")
    private String driverName;
server/services/src/main/java/com/doumee/dao/business/model/OrdersRefund.java
@@ -1,6 +1,7 @@
package com.doumee.dao.business.model;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.annotation.JsonFormat;
@@ -75,4 +76,42 @@
    @ApiModelProperty(value = "退款前订单状态", example = "1")
    private Integer beforeStatus;
    @TableField(exist = false)
    @ApiModelProperty(value = "订单编号(关联查询)")
    private String orderCode;
    @TableField(exist = false)
    @ApiModelProperty(value = "物品信息(关联查询)")
    private String goodsInfo;
    @TableField(exist = false)
    @ApiModelProperty(value = "订单类型(关联查询)")
    private Integer orderType;
    @TableField(exist = false)
    @ApiModelProperty(value = "订单级别(关联查询)")
    private Integer goodLevel;
    @TableField(exist = false)
    @ApiModelProperty(value = "物品等级名称(关联查询)")
    private String goodLevelName;
    @TableField(exist = false)
    @ApiModelProperty(value = "订单总价(关联查询)")
    private Long totalAmount;
    @TableField(exist = false)
    @ApiModelProperty(value = "实付金额(关联查询)")
    private Long payAmount;
    @TableField(exist = false)
    @ApiModelProperty(value = "退款申请开始时间(查询用)")
    @JsonFormat(pattern = "yyyy-MM-dd")
    private Date createStartTime;
    @TableField(exist = false)
    @ApiModelProperty(value = "退款申请结束时间(查询用)")
    @JsonFormat(pattern = "yyyy-MM-dd")
    private Date createEndTime;
}
server/services/src/main/java/com/doumee/dao/dto/CreateOrderDTO.java
@@ -77,6 +77,7 @@
    private Integer isUrgent;
    @ApiModelProperty(value = "保价金额(元,非必填)")
    @NotNull(message = "保价金额不能为空")
    private BigDecimal declaredAmount;
    @ApiModelProperty(value = "订单备注(非必填)")
server/services/src/main/java/com/doumee/dao/dto/DirectionInfoDTO.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,30 @@
package com.doumee.dao.dto;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotBlank;
import java.io.Serializable;
/**
 * è·¯å¾„规划查询条件
 * @author rk
 * @date 2026/04/27
 */
@Data
@ApiModel("路径规划查询条件")
public class DirectionInfoDTO implements Serializable {
    @NotBlank(message = "出行方式不能为空")
    @ApiModelProperty(value = "出行方式:driving=驾车;bicycling=骑行", example = "driving")
    private String mode;
    @NotBlank(message = "起点坐标不能为空")
    @ApiModelProperty(value = "起点坐标,格式:lat,lng", example = "30.123,120.456")
    private String from;
    @NotBlank(message = "终点坐标不能为空")
    @ApiModelProperty(value = "终点坐标,格式:lat,lng", example = "30.789,120.123")
    private String to;
}
server/services/src/main/java/com/doumee/dao/dto/OperationConfigDTO.java
@@ -43,4 +43,7 @@
    @ApiModelProperty(value = "无人抢单短信通知人员主键(多个以,分割)", required = true)
    private String noGrabNotifyUsers;
    @ApiModelProperty(value = "默认配送范围(km)", required = true)
    private String defaultDeliveryRange;
}
server/services/src/main/java/com/doumee/dao/dto/OrdersRefundPageDTO.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,39 @@
package com.doumee.dao.dto;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
import java.util.Date;
/**
 * é€€æ¬¾è®°å½•分页查询条件
 * @author rk
 * @date 2026/04/27
 */
@Data
@ApiModel("退款记录分页查询条件")
public class OrdersRefundPageDTO implements Serializable {
    @ApiModelProperty(value = "订单编号")
    private String orderCode;
    @ApiModelProperty(value = "物品信息")
    private String goodsInfo;
    @ApiModelProperty(value = "订单类型:0=就地存取;1=异地存取")
    private Integer orderType;
    @ApiModelProperty(value = "退款状态:0=退款中;1=退款成功;2=退款失败")
    private Integer refundStatus;
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @ApiModelProperty(value = "退款申请开始时间", example = "2026-01-01 00:00:00")
    private Date createStartTime;
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @ApiModelProperty(value = "退款申请结束时间", example = "2026-12-31 00:00:00")
    private Date createEndTime;
}
server/services/src/main/java/com/doumee/dao/vo/DriverGrabOrderVO.java
@@ -5,6 +5,7 @@
import lombok.Data;
import java.io.Serializable;
import java.util.Date;
import java.util.List;
/**
@@ -37,6 +38,12 @@
    @ApiModelProperty(value = "距存件门店距离(如 500m、1.2km)")
    private String depositDistance;
    @ApiModelProperty(value = "存件点经度")
    private Double depositLng;
    @ApiModelProperty(value = "存件点纬度")
    private Double depositLat;
    @ApiModelProperty(value = "取件门店名称")
    private String takeName;
@@ -49,6 +56,12 @@
    @ApiModelProperty(value = "取件距离(如 500m、1.2km)")
    private String takeDistance;
    @ApiModelProperty(value = "取件点经度")
    private Double takeLng;
    @ApiModelProperty(value = "取件点纬度")
    private Double takeLat;
    @ApiModelProperty(value = "联系电话(status=2取件门店电话;status=3/4有取件门店返回门店电话,无则返回取件人电话)")
    private String contactPhone;
@@ -57,6 +70,9 @@
    @ApiModelProperty(value = "加急费用(分)")
    private Long urgentAmount;
    @ApiModelProperty(value = "平台奖励金额(分)")
    private Long platformRewardAmount;
    @ApiModelProperty(value = "物品明细列表")
    private List<OrderItem> items;
@@ -73,6 +89,16 @@
    @ApiModelProperty(value = "司机取货码(待取货状态时返回)")
    private String driverVerifyCode;
    @ApiModelProperty(value = "订单状态")
    private Integer status;
    @ApiModelProperty(value = "订单状态描述")
    private String statusDesc;
    @com.fasterxml.jackson.annotation.JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @ApiModelProperty(value = "订单创建时间")
    private Date createTime;
    @Data
    @ApiModel("抢单大厅物品项")
    public static class OrderItem implements Serializable {
server/services/src/main/java/com/doumee/dao/vo/DriverOrderDetailVO.java
@@ -56,14 +56,20 @@
    @ApiModelProperty(value = "取件距离(如 500m、1.2km)")
    private String takeDistance;
    @ApiModelProperty(value = "联系电话")
    private String contactPhone;
    @ApiModelProperty(value = "存件门店电话")
    private String depositShopPhone;
    @ApiModelProperty(value = "取件联系电话(取件门店电话或取件人手机号)")
    private String takeContactPhone;
    @ApiModelProperty(value = "司机薪酬(分)")
    private Long driverFee;
    @ApiModelProperty(value = "加急费用(分)")
    private Long urgentAmount;
    @ApiModelProperty(value = "平台奖励金额(分)")
    private Long platformRewardAmount;
    @ApiModelProperty(value = "物品明细列表")
    private List<OrderItem> items;
@@ -73,6 +79,9 @@
    @ApiModelProperty(value = "物品等级名称")
    private String goodLevelName;
    @ApiModelProperty(value = "物品类型名称")
    private String goodTypeName;
    @ApiModelProperty(value = "是否存在特大尺寸:0=否 1=是")
    private Integer hasOversized;
@@ -92,6 +101,27 @@
    @ApiModelProperty(value = "下单附件图片全路径列表")
    private List<String> orderImages;
    // ---- æ—¶é—´ä¿¡æ¯ ----
    @ApiModelProperty(value = "创建时间")
    @com.fasterxml.jackson.annotation.JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private Date createTime;
    @ApiModelProperty(value = "司机接单时间")
    @com.fasterxml.jackson.annotation.JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private Date acceptTime;
    @ApiModelProperty(value = "司机取件时间")
    @com.fasterxml.jackson.annotation.JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private Date driverTakeTime;
    @ApiModelProperty(value = "订单完成时间")
    @com.fasterxml.jackson.annotation.JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private Date finishTime;
    @ApiModelProperty(value = "订单备注")
    private String remark;
    // ---- å®žæ—¶ç»çº¬åº¦ï¼ˆå¼‚地寄存按状态返回) ----
    @ApiModelProperty(value = "存件门店经度")
server/services/src/main/java/com/doumee/dao/vo/OrderDetailVO.java
@@ -73,4 +73,7 @@
    @ApiModelProperty(value = "接单司机姓名")
    private String driverName;
    @ApiModelProperty(value = "订单状态描述")
    private String statusDesc;
}
server/services/src/main/java/com/doumee/dao/vo/OrdersRefundPageVO.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,63 @@
package com.doumee.dao.vo;
import com.doumee.core.annotation.excel.ExcelColumn;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
import java.util.Date;
/**
 * é€€æ¬¾è®°å½•分页列表项
 * @author rk
 * @date 2026/04/27
 */
@Data
@ApiModel("退款记录分页列表项")
public class OrdersRefundPageVO implements Serializable {
    @ApiModelProperty(value = "退款记录主键")
    private Integer id;
    @ApiModelProperty(value = "订单主键")
    private Integer orderId;
    @ExcelColumn(name = "订单编号")
    @ApiModelProperty(value = "订单编号")
    private String orderCode;
    @ExcelColumn(name = "物品信息")
    @ApiModelProperty(value = "物品信息")
    private String goodsInfo;
    @ExcelColumn(name = "订单类型", valueMapping = "0=就地存取;1=异地存取;")
    @ApiModelProperty(value = "订单类型:0=就地存取;1=异地存取")
    private Integer orderType;
    @ExcelColumn(name = "订单级别")
    @ApiModelProperty(value = "订单级别名称")
    private String goodLevelName;
    @ExcelColumn(name = "订单总价(元)")
    @ApiModelProperty(value = "订单总价(分)")
    private Long totalAmount;
    @ExcelColumn(name = "实付金额(元)")
    @ApiModelProperty(value = "实付金额(分)")
    private Long payAmount;
    @ExcelColumn(name = "退款金额(元)")
    @ApiModelProperty(value = "退款金额(分)")
    private Long refundAmount;
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @ExcelColumn(name = "创建时间", width = 16, dateFormat = "yyyy-MM-dd HH:mm:ss")
    @ApiModelProperty(value = "创建时间")
    private Date createTime;
    @ExcelColumn(name = "退款状态", valueMapping = "0=退款中;1=退款成功;2=退款失败;")
    @ApiModelProperty(value = "退款状态:0=退款中;1=退款成功;2=退款失败")
    private Integer refundStatus;
}
server/services/src/main/java/com/doumee/dao/vo/PlatformAboutVO.java
@@ -4,8 +4,6 @@
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.Map;
/**
 * å¹³å°ä¿¡æ¯ï¼ˆå…³äºŽæˆ‘们、协议等)
 *
@@ -19,6 +17,48 @@
    @ApiModelProperty(value = "关于我们")
    private String aboutUs;
    @ApiModelProperty(value = "协议须知列表,key=枚举编码,value=富文本内容")
    private Map<String, String> agreements;
    @ApiModelProperty(value = "门店风险承诺书")
    private String storeRiskCommitment;
    @ApiModelProperty(value = "门店合作协议")
    private String storeCooperationAgreement;
    @ApiModelProperty(value = "门店行李寄存须知")
    private String storeLuggageStorageNotice;
    @ApiModelProperty(value = "门店隐私政策")
    private String storePrivacyPolicy;
    @ApiModelProperty(value = "寄存人行李寄存须知")
    private String ownerLuggageStorageNotice;
    @ApiModelProperty(value = "寄存人服务协议")
    private String ownerServiceAgreement;
    @ApiModelProperty(value = "寄存人风险承诺书")
    private String ownerRiskCommitment;
    @ApiModelProperty(value = "跑腿风险承诺书")
    private String errandRiskCommitment;
    @ApiModelProperty(value = "跑腿服务协议")
    private String errandServiceAgreement;
    @ApiModelProperty(value = "跑腿行李寄存须知")
    private String errandLuggageStorageNotice;
    @ApiModelProperty(value = "用户服务协议")
    private String userServiceAgreement;
    @ApiModelProperty(value = "用户隐私政策")
    private String userPrivacyPolicy;
    @ApiModelProperty(value = "司机隐私政策")
    private String driverPrivacyPolicy;
    @ApiModelProperty(value = "价格说明")
    private String priceDescription;
    @ApiModelProperty(value = "禁寄物品")
    private String prohibitedItems;
}
server/services/src/main/java/com/doumee/service/business/AreasService.java
@@ -148,4 +148,11 @@
     */
    Areas getOpenedCityByName(String cityName);
    /**
     * ä¿®æ”¹çŠ¶æ€
     *
     * @param areas å®žä½“对象(id + status)
     */
    void updateStatus(Areas areas);
}
server/services/src/main/java/com/doumee/service/business/DriverInfoService.java
@@ -265,7 +265,7 @@
     * @param newPassword æ–°å¯†ç 
     * @param token       å½“前token(修改成功后清除)
     */
    void changePassword(Integer driverId, String newPassword, String token);
    void changePassword(Integer driverId, String oldPassword, String newPassword, String token);
    /**
     * èŽ·å–å¸æœºè¿›è¡Œä¸­è®¢å•æ•°é‡
@@ -292,4 +292,12 @@
     */
    com.doumee.dao.vo.DriverCancelLimitVO getTodayCancelLimit(Integer driverId);
    /**
     * æ ¡éªŒå¸æœºtoken是否有效
     *
     * @param token å¸æœºtoken
     * @return true=有效 false=无效
     */
    boolean checkDriverToken(String token);
}
server/services/src/main/java/com/doumee/service/business/OrdersRefundService.java
@@ -3,6 +3,8 @@
import com.doumee.core.model.PageData;
import com.doumee.core.model.PageWrap;
import com.doumee.dao.business.model.OrdersRefund;
import com.doumee.dao.dto.OrdersRefundPageDTO;
import com.doumee.dao.vo.OrdersRefundPageVO;
import java.util.List;
@@ -95,4 +97,19 @@
     * @return long
     */
    long count(OrdersRefund ordersRefund);
    /**
     * é€€æ¬¾è®°å½•分页查询(关联订单信息)
     *
     * @param pageWrap åˆ†é¡µå¯¹è±¡
     * @return PageData<OrdersRefundPageVO>
     */
    PageData<OrdersRefundPageVO> refundPage(PageWrap<OrdersRefundPageDTO> pageWrap);
    /**
     * é‡æ–°é€€æ¬¾ï¼ˆé€€æ¬¾å¤±è´¥æ—¶å†æ¬¡å‘起)
     *
     * @param id é€€æ¬¾è®°å½•主键
     */
    void retryRefund(Integer id);
}
server/services/src/main/java/com/doumee/service/business/ShopInfoService.java
@@ -213,9 +213,10 @@
     * é—¨åº—修改密码
     *
     * @param shopId      é—¨åº—主键
     * @param oldPassword æ—§å¯†ç 
     * @param newPassword æ–°å¯†ç 
     * @param token       å½“前token(修改成功后清除)
     */
    void changePassword(Integer shopId, String newPassword, String token);
    void changePassword(Integer shopId, String oldPassword, String newPassword, String token);
}
server/services/src/main/java/com/doumee/service/business/impl/AreasServiceImpl.java
@@ -563,4 +563,15 @@
        return areasMapper.selectOne(qw);
    }
    @Override
    public void updateStatus(Areas areas) {
        if (areas == null || areas.getId() == null) {
            throw new BusinessException(ResponseStatus.BAD_REQUEST);
        }
        Areas update = new Areas();
        update.setId(areas.getId());
        update.setStatus(areas.getStatus());
        areasMapper.updateById(update);
    }
}
server/services/src/main/java/com/doumee/service/business/impl/BannerServiceImpl.java
@@ -154,13 +154,6 @@
        if (pageWrap.getModel().getType() != null) {
            queryWrapper.lambda().eq(Banner::getType, pageWrap.getModel().getType());
        }
        for (PageWrap.SortData sortData : pageWrap.getSorts()) {
            if (sortData.getDirection().equalsIgnoreCase(PageWrap.DESC)) {
                queryWrapper.orderByDesc(sortData.getProperty());
            } else {
                queryWrapper.orderByAsc(sortData.getProperty());
            }
        }
        // é»˜è®¤æŽ’序:排序码倒序、主键顺序
        queryWrapper.lambda().orderByDesc(Banner::getSortnum).orderByAsc(Banner::getId);
        PageData<Banner> result = PageData.from(bannerMapper.selectPage(page, queryWrapper));
@@ -207,9 +200,6 @@
        }
        if (requireId && Objects.isNull(banner.getId())) {
            throw new BusinessException(ResponseStatus.BAD_REQUEST);
        }
        if (StringUtils.isBlank(banner.getTitle())) {
            throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "标题不能为空");
        }
        if (StringUtils.isBlank(banner.getImgurl())) {
            throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "图片不能为空");
server/services/src/main/java/com/doumee/service/business/impl/CategoryServiceImpl.java
@@ -244,9 +244,26 @@
        if(com.github.xiaoymin.knife4j.core.util.CollectionUtils.isNotEmpty(categoryList)){
            String path  = systemDictDataBiz.queryByCode(Constants.OSS,Constants.RESOURCE_PATH).getCode()
                    +systemDictDataBiz.queryByCode(Constants.OSS,Constants.CATEGORY_FILES).getCode();
            // æ”¶é›†éžç©ºçš„ relationId æ‰¹é‡æŸ¥è¯¢
            java.util.Set<Integer> relationIds = new java.util.HashSet<>();
            for (Category category : categoryList) {
                if (category.getRelationId() != null) {
                    relationIds.add(category.getRelationId());
                }
            }
            java.util.Map<Integer, String> relationNameMap = new java.util.HashMap<>();
            if (!relationIds.isEmpty()) {
                categoryMapper.selectList(new QueryWrapper<Category>().lambda()
                        .in(Category::getId, relationIds)
                        .eq(Category::getDeleted, Constants.ZERO))
                        .forEach(c -> relationNameMap.put(c.getId(), c.getName()));
            }
            for (Category category:categoryList) {
                if(StringUtils.isNotBlank(category.getIcon())){
                    category.setIconFull(path + category.getIcon());
                }
                if (category.getRelationId() != null) {
                    category.setRelationName(relationNameMap.get(category.getRelationId()));
                }
            }
        }
@@ -281,7 +298,7 @@
                .orderByAsc(Category::getSortnum));
        // 3. æ‹¼æŽ¥å›¾æ ‡å…¨è·¯å¾„
        if (!CollectionUtils.isEmpty(sizeList)) {
            String path = systemDictDataBiz.queryByCode(Constants.SYSTEM, Constants.RESOURCE_PATH).getCode()
            String path = systemDictDataBiz.queryByCode(Constants.OSS, Constants.RESOURCE_PATH).getCode()
                    + systemDictDataBiz.queryByCode(Constants.OSS, Constants.CATEGORY_FILES).getCode();
            for (Category cate : sizeList) {
                if (StringUtils.isNotBlank(cate.getIcon())) {
server/services/src/main/java/com/doumee/service/business/impl/DriverInfoServiceImpl.java
@@ -480,7 +480,7 @@
        }
        // çŠ¶æ€æ ¡éªŒï¼šauditStatus=null(未提交)或auditStatus=2(审批驳回)可提交认证
        if (driverInfo.getAuditStatus() != null
                && !Constants.equalsInteger(driverInfo.getAuditStatus(), Constants.TWO)) {
                && !(Constants.equalsInteger(driverInfo.getAuditStatus(), Constants.TWO)||Constants.equalsInteger(driverInfo.getAuditStatus(), 99))) {
            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "当前状态不允许提交认证");
        }
        // æ ¹æ®è½¦è¾†ç±»åž‹åˆ¤æ–­æ˜¯å¦éœ€è¦é©¾é©¶è¯
@@ -634,7 +634,7 @@
        // å®¡æ‰¹ç»“果:auditDTO.auditStatus 0=通过→auditStatus=1,1=拒绝→auditStatus=2
        Integer newAuditStatus;
        if (Constants.equalsInteger(auditDTO.getAuditStatus(), Constants.ZERO)) {
            newAuditStatus = Constants.ONE;  // å®¡æ‰¹é€šè¿‡
            newAuditStatus = Constants.THREE;  // å®¡æ‰¹é€šè¿‡
            // å®¡æ‰¹é€šè¿‡æ—¶å¸æœºå®šçº§ä¸ºå¿…å¡«
            if (auditDTO.getDriverLevel() == null || auditDTO.getDriverLevel() < 1 || auditDTO.getDriverLevel() > 5) {
                throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "审批通过时必须填写司机定级");
@@ -1109,10 +1109,12 @@
        wrapper.selectAll(Orders.class)
                .select("s1.name", Orders::getDepositShopName)
                .select("s1.address", Orders::getDepositShopAddress)
                .select("s1.telephone", Orders::getDepositShopLinkPhone)
                .select("s2.name", Orders::getTakeShopName)
                .select("s2.address", Orders::getTakeShopAddress)
                .select("s2.link_phone as takeShopLinkPhone")
                .select("s2.telephone", Orders::getTakeShopLinkPhone)
                .select("c2.other_field as c2OtherField")
                .select("c1.name as goodTypeName")
                .select("IF(EXISTS(SELECT 1 FROM orders_detail od JOIN category c3 ON c3.id = od.LUGGAGE_ID AND c3.TYPE = 4 AND c3.OTHER_FIELD = '1' WHERE od.ORDER_ID = t.ID AND od.DELETED = 0), 1, 0) as hasOversized")
                .leftJoin("shop_info s1 on s1.id = t.DEPOSIT_SHOP_ID and s1.DELETED = 0")
                .leftJoin("shop_info s2 on s2.id = t.TAKE_SHOP_ID and s2.DELETED = 0")
@@ -1175,11 +1177,23 @@
        vo.setTakeShopId(base.getTakeShopId());
        vo.setTakeDistance(base.getTakeDistance());
        vo.setContactPhone(base.getContactPhone());
        // è”系电话:按订单状态返回
        vo.setDepositShopPhone(order.getDepositShopLinkPhone());
        if (Constants.equalsInteger(order.getStatus(), Constants.OrderStatus.delivering.getStatus())
                || Constants.equalsInteger(order.getStatus(), Constants.OrderStatus.arrived.getStatus())) {
            if (order.getTakeShopId() != null && StringUtils.isNotBlank(order.getTakeShopLinkPhone())) {
                vo.setTakeContactPhone(order.getTakeShopLinkPhone());
            } else {
                vo.setTakeContactPhone(order.getTakePhone());
            }
        }
        vo.setDriverFee(base.getDriverFee());
        vo.setUrgentAmount(base.getUrgentAmount());
        vo.setPlatformRewardAmount(order.getPlatformRewardAmount());
        vo.setIsValuable(base.getIsValuable());
        vo.setGoodLevelName(base.getGoodLevelName());
        vo.setGoodTypeName(order.getGoodTypeName());
        vo.setHasOversized(base.getHasOversized());
        vo.setDriverVerifyCode(base.getDriverVerifyCode());
@@ -1199,6 +1213,11 @@
        // è¯¦æƒ…特有字段
        vo.setStatus(order.getStatus());
        vo.setStatusDesc(getStatusDesc(order.getStatus()));
        vo.setCreateTime(order.getCreateTime());
        vo.setAcceptTime(order.getAcceptTime());
        vo.setDriverTakeTime(order.getDriverTakeTime());
        vo.setFinishTime(order.getFinishTime());
        vo.setRemark(order.getRemark());
        // å®¢æˆ·ä¿¡æ¯
        String customerInfo = "";
@@ -1211,52 +1230,27 @@
        vo.setCustomerInfo(customerInfo);
        // å¯¼èˆªç»çº¬åº¦ï¼ˆä½¿ç”¨Orders自带坐标)
        if (Constants.equalsInteger(order.getStatus(), Constants.TWO)) {
        if (Constants.equalsInteger(order.getStatus(), Constants.OrderStatus.accepted.getStatus())) {
            if (order.getDepositLgt() != null && order.getDepositLat() != null) {
                vo.setNavigateLat(order.getDepositLgt().doubleValue());
                vo.setNavigateLng(order.getDepositLat().doubleValue());
            }
        } else {
        } else if(Constants.equalsInteger(order.getStatus(), Constants.OrderStatus.delivering.getStatus())){
            if (order.getTakeLgt() != null && order.getTakeLat() != null) {
                vo.setNavigateLat(order.getTakeLgt().doubleValue());
                vo.setNavigateLng(order.getTakeLat().doubleValue());
            }
        }
        // å¼‚地寄存实时经纬度(按状态返回)
        if (Constants.ONE.equals(order.getType())) {
            // å¸æœºè‡ªèº«ç»çº¬åº¦
            vo.setDriverLng(driverLng);
            vo.setDriverLat(driverLat);
            // status=3(已接单):返回存件门店经纬度
            if (Constants.equalsInteger(order.getStatus(), Constants.OrderStatus.accepted.getStatus())) {
                if (order.getDepositShopId() != null) {
                    ShopInfo depositShop = shopInfoMapper.selectById(order.getDepositShopId());
                    if (depositShop != null) {
                        vo.setDepositShopLng(depositShop.getLongitude());
                        vo.setDepositShopLat(depositShop.getLatitude());
                    }
                }
            }
            // status=4(配送中):返回取件点经纬度
            if (Constants.equalsInteger(order.getStatus(), Constants.OrderStatus.delivering.getStatus())) {
                if (order.getTakeShopId() != null) {
                    ShopInfo takeShop = shopInfoMapper.selectById(order.getTakeShopId());
                    if (takeShop != null) {
                        vo.setTakeLng(takeShop.getLongitude());
                        vo.setTakeLat(takeShop.getLatitude());
                    }
                } else if (order.getTakeLgt() != null && order.getTakeLat() != null) {
                    vo.setTakeLng(order.getTakeLgt().doubleValue());
                    vo.setTakeLat(order.getTakeLat().doubleValue());
                }
            }
        }
        vo.setDepositShopLng(order.getDepositLgt().doubleValue());
        vo.setDepositShopLat(order.getDepositLat().doubleValue());
        vo.setTakeLng(order.getTakeLgt().doubleValue());
        vo.setTakeLat(order.getTakeLat().doubleValue());
        vo.setDriverLng(driverLng);
        vo.setDriverLat(driverLat);
        // ä¸‹å•附件图片
        String imgPrefix = systemDictDataBiz.queryByCode(Constants.OSS, Constants.RESOURCE_PATH).getCode()
                + systemDictDataBiz.queryByCode(Constants.OSS, Constants.MEMBER_FILES).getCode();
                + systemDictDataBiz.queryByCode(Constants.OSS, Constants.ORDERS_FILES).getCode();
        vo.setOrderImages(getFileUrls(orderId, Constants.FileType.ORDER_FILE.getKey(), imgPrefix));
        // è¯„价信息
@@ -1297,7 +1291,7 @@
        if (!Constants.ONE.equals(order.getType())) {
            throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "仅异地寄存订单可取消");
        }
        if (!Constants.TWO.equals(order.getStatus())) {
        if (!Constants.equalsInteger(Constants.OrderStatus.accepted.getStatus(), order.getStatus())) {
            throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "当前订单状态不允许取消");
        }
        if (!driverId.equals(order.getAcceptDriver())) {
@@ -1330,6 +1324,7 @@
                .set(Orders::getAcceptDriver, null)
                .set(Orders::getAcceptTime, null)
                .set(Orders::getAcceptType, null)
                .set(Orders::getStatus, Constants.OrderStatus.deposited.getStatus())
                .eq(Orders::getId, orderId));
        // 5. å†™å…¥å–消日志
@@ -1428,7 +1423,8 @@
        // é€šçŸ¥å­˜ä»¶é—¨åº—:订单已抢单待取件
        if (order.getDepositShopId() != null) {
            sendShopNotice(order.getDepositShopId(), Constants.ShopOrderNotify.WAIT_PICKUP, orderId,
                    "orderNo", order.getCode());
                    "orderNo", order.getCode(),
                    "name", driver.getName());
        }
        // é€šçŸ¥å¸æœºï¼šæŠ¢å•成功
@@ -1490,6 +1486,7 @@
        // 4. æ›´æ–°è®¢å•状态为派送中(4)
        ordersMapper.update(new UpdateWrapper<Orders>().lambda()
                .set(Orders::getStatus, Constants.OrderStatus.delivering.getStatus())
                .set(Orders::getTakeTime, now)
                .set(Orders::getUpdateTime, now)
                .eq(Orders::getId, orderId));
@@ -1715,14 +1712,17 @@
        vo.setIsUrgent(order.getIsUrgent());
        vo.setDriverFee(order.getDriverFee());
        vo.setUrgentAmount(order.getUrgentAmount());
        vo.setPlatformRewardAmount(order.getPlatformRewardAmount());
        // å­˜ä»¶é—¨åº—(使用Orders自带坐标)
        vo.setDepositShopName(order.getDepositShopName());
        vo.setDepositShopAddress(order.getDepositShopAddress());
        vo.setDepositLng(order.getDepositLgt() != null ? order.getDepositLgt().doubleValue() : null);
        vo.setDepositLat(order.getDepositLat() != null ? order.getDepositLat().doubleValue() : null);
        if (needDepositDist && driverLat != null && driverLng != null
                && order.getDepositLgt() != null && order.getDepositLat() != null) {
            double distKm = haversine(driverLat, driverLng,
                    order.getDepositLgt().doubleValue(), order.getDepositLat().doubleValue());
            double distKm = haversine(driverLat, driverLng, order.getDepositLat().doubleValue(),
                    order.getDepositLgt().doubleValue());
            vo.setDepositDistance(formatDistance(distKm));
        }
@@ -1738,10 +1738,12 @@
            vo.setTakeAddress(order.getTakeLocationRemark());
            vo.setContactPhone(order.getTakePhone());
        }
        vo.setTakeLng(order.getTakeLgt() != null ? order.getTakeLgt().doubleValue() : null);
        vo.setTakeLat(order.getTakeLat() != null ? order.getTakeLat().doubleValue() : null);
        if (driverLat != null && driverLng != null
                && order.getTakeLgt() != null && order.getTakeLat() != null) {
            double takeDist = haversine(driverLat, driverLng,
                    order.getTakeLgt().doubleValue(), order.getTakeLat().doubleValue());
            double takeDist = haversine(driverLat, driverLng, order.getTakeLat().doubleValue(),
                    order.getTakeLgt().doubleValue());
            vo.setTakeDistance(formatDistance(takeDist));
        }
@@ -1754,6 +1756,11 @@
        if (Constants.equalsInteger(order.getStatus(), Constants.THREE)||Constants.equalsInteger(order.getStatus(), Constants.FOUR)) {
            vo.setDriverVerifyCode(order.getDriverVerifyCode());
        }
        // è®¢å•状态
        vo.setStatus(order.getStatus());
        vo.setStatusDesc(getStatusDesc(order.getStatus()));
        vo.setCreateTime(order.getCreateTime());
        // ç‰©å“æ˜Žç»†
        List<OrdersDetail> details = detailMap.getOrDefault(order.getId(), Collections.emptyList());
@@ -1829,11 +1836,14 @@
    }
    @Override
    public void changePassword(Integer driverId, String newPassword, String token) {
        if (StringUtils.isBlank(newPassword)) {
            throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "密码不能为空");
    public void changePassword(Integer driverId, String oldPassword, String newPassword, String token) {
        if (StringUtils.isBlank(oldPassword)) {
            throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "旧密码不能为空");
        }
        // æ ¡éªŒå¯†ç å¿…须同时包含字母和数字
        if (StringUtils.isBlank(newPassword)) {
            throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "新密码不能为空");
        }
        // æ ¡éªŒæ–°å¯†ç å¿…须同时包含字母和数字
        boolean hasLetter = newPassword.chars().anyMatch(Character::isLetter);
        boolean hasDigit = newPassword.chars().anyMatch(Character::isDigit);
        if (!hasLetter || !hasDigit) {
@@ -1847,6 +1857,11 @@
        Member member = memberMapper.selectById(driverInfo.getMemberId());
        if (member == null) {
            throw new BusinessException(ResponseStatus.DATA_EMPTY);
        }
        // æ ¡éªŒæ—§å¯†ç 
        String oldEncryptPwd = secure.encryptPassword(oldPassword, member.getSalt());
        if (!oldEncryptPwd.equals(member.getPassword())) {
            throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "旧密码错误");
        }
        // åŠ å¯†æ–°å¯†ç å¹¶æ›´æ–°
        String salt = RandomStringUtils.randomAlphanumeric(6);
@@ -1893,6 +1908,7 @@
        List<Integer> validStatuses = Arrays.asList(
                Constants.OrderStatus.accepted.getStatus(),
                Constants.OrderStatus.delivering.getStatus(),
                Constants.OrderStatus.arrived.getStatus(),
                Constants.OrderStatus.finished.getStatus());
        if (status != null && !validStatuses.contains(status)) {
            throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "状态只能为3(待取件)、4(配送中)、7(已完成)");
@@ -1990,4 +2006,26 @@
        return vo;
    }
    @Override
    public boolean checkDriverToken(String token) {
        if (StringUtils.isBlank(token) || !token.startsWith(Constants.ONE + "")) {
            return false;
        }
        String tokenRedis = (String) redisTemplate.opsForValue().get(Constants.REDIS_TOKEN_KEY + token);
        if (StringUtils.isBlank(tokenRedis)) {
            return false;
        }
        try {
            int lastIndex = token.lastIndexOf("_") + 1;
            Integer memberId = Integer.valueOf(token.substring(lastIndex));
            Member member = memberMapper.selectById(memberId);
            return member != null
                    && !Constants.ONE.equals(member.getDeleted())
                    && !Constants.ONE.equals(member.getStatus())
                    && Constants.ONE.equals(member.getUserType());
        } catch (Exception e) {
            return false;
        }
    }
}
server/services/src/main/java/com/doumee/service/business/impl/MemberServiceImpl.java
@@ -46,6 +46,7 @@
import org.springframework.util.CollectionUtils;
import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.LinkedHashMap;
@@ -442,37 +443,32 @@
    public PlatformAboutVO getPlatformAboutUs(){
        PlatformAboutVO vo = new PlatformAboutVO();
        vo.setAboutUs(StringUtils.trimToNull(systemDictDataBiz.queryByCode(Constants.SYSTEM,Constants.ABOUT_US).getCode()));
        Map<String, String> agreements = new LinkedHashMap<>();
        String[] agreementKeys = {
                Constants.STORE_RISK_COMMITMENT,
                Constants.STORE_COOPERATION_AGREEMENT,
                Constants.STORE_LUGGAGE_STORAGE_NOTICE,
                Constants.STORE_PRIVACY_POLICY,
                Constants.OWNER_LUGGAGE_STORAGE_NOTICE,
                Constants.OWNER_SERVICE_AGREEMENT,
                Constants.OWNER_RISK_COMMITMENT,
                Constants.ERRAND_RISK_COMMITMENT,
                Constants.ERRAND_SERVICE_AGREEMENT,
                Constants.ERRAND_LUGGAGE_STORAGE_NOTICE,
                Constants.USER_SERVICE_AGREEMENT,
                Constants.USER_PRIVACY_POLICY,
                Constants.DRIVER_PRIVACY_POLICY,
                Constants.PRICE_DESCRIPTION,
                Constants.PROHIBITED_ITEMS
        };
        for (String key : agreementKeys) {
            try {
                String value = StringUtils.trimToNull(systemDictDataBiz.queryByCode(Constants.SYSTEM, key).getCode());
                agreements.put(key, value);
            } catch (Exception e) {
                agreements.put(key, null);
            }
        }
        vo.setAgreements(agreements);
        vo.setStoreRiskCommitment(getDictValue(Constants.STORE_RISK_COMMITMENT));
        vo.setStoreCooperationAgreement(getDictValue(Constants.STORE_COOPERATION_AGREEMENT));
        vo.setStoreLuggageStorageNotice(getDictValue(Constants.STORE_LUGGAGE_STORAGE_NOTICE));
        vo.setStorePrivacyPolicy(getDictValue(Constants.STORE_PRIVACY_POLICY));
        vo.setOwnerLuggageStorageNotice(getDictValue(Constants.OWNER_LUGGAGE_STORAGE_NOTICE));
        vo.setOwnerServiceAgreement(getDictValue(Constants.OWNER_SERVICE_AGREEMENT));
        vo.setOwnerRiskCommitment(getDictValue(Constants.OWNER_RISK_COMMITMENT));
        vo.setErrandRiskCommitment(getDictValue(Constants.ERRAND_RISK_COMMITMENT));
        vo.setErrandServiceAgreement(getDictValue(Constants.ERRAND_SERVICE_AGREEMENT));
        vo.setErrandLuggageStorageNotice(getDictValue(Constants.ERRAND_LUGGAGE_STORAGE_NOTICE));
        vo.setUserServiceAgreement(getDictValue(Constants.USER_SERVICE_AGREEMENT));
        vo.setUserPrivacyPolicy(getDictValue(Constants.USER_PRIVACY_POLICY));
        vo.setDriverPrivacyPolicy(getDictValue(Constants.DRIVER_PRIVACY_POLICY));
        vo.setPriceDescription(getDictValue(Constants.PRICE_DESCRIPTION));
        vo.setProhibitedItems(getDictValue(Constants.PROHIBITED_ITEMS));
        return vo;
    }
    private String getDictValue(String key) {
        try {
            return StringUtils.trimToNull(systemDictDataBiz.queryByCode(Constants.SYSTEM, key).getCode());
        } catch (Exception e) {
            return null;
        }
    }
    @Override
    public void logOut(String token,Integer userId,Integer userType){
        if(Constants.equalsInteger(userType,Constants.ZERO)){
server/services/src/main/java/com/doumee/service/business/impl/OrdersRefundServiceImpl.java
@@ -3,15 +3,31 @@
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.doumee.config.wx.WxPayProperties;
import com.doumee.config.wx.WxPayV3Service;
import com.doumee.core.constants.Constants;
import com.doumee.core.constants.ResponseStatus;
import com.doumee.core.exception.BusinessException;
import com.doumee.core.model.PageData;
import com.doumee.core.model.PageWrap;
import com.doumee.core.utils.Utils;
import com.doumee.dao.business.OrdersMapper;
import com.doumee.dao.business.OrdersRefundMapper;
import com.doumee.dao.business.model.Orders;
import com.doumee.dao.business.model.OrdersRefund;
import com.doumee.dao.dto.OrdersRefundPageDTO;
import com.doumee.dao.vo.OrdersRefundPageVO;
import com.doumee.service.business.OrdersRefundService;
import com.github.yulichang.wrapper.MPJLambdaWrapper;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
/**
@@ -19,11 +35,21 @@
 * @author rk
 * @date 2026/04/13
 */
@Slf4j
@Service
public class OrdersRefundServiceImpl implements OrdersRefundService {
    @Autowired
    private OrdersRefundMapper ordersRefundMapper;
    @Autowired
    private OrdersMapper ordersMapper;
    @Autowired
    private WxPayV3Service wxPayV3Service;
    @Autowired
    private WxPayProperties wxPayProperties;
    @Override
    public Integer create(OrdersRefund ordersRefund) {
@@ -110,4 +136,135 @@
        QueryWrapper<OrdersRefund> wrapper = new QueryWrapper<>(ordersRefund);
        return ordersRefundMapper.selectCount(wrapper);
    }
    @Override
    public PageData<OrdersRefundPageVO> refundPage(PageWrap<OrdersRefundPageDTO> pageWrap) {
        OrdersRefundPageDTO model = pageWrap.getModel();
        IPage<OrdersRefund> page = new Page<>(pageWrap.getPage(), pageWrap.getCapacity());
        MPJLambdaWrapper<OrdersRefund> wrapper = new MPJLambdaWrapper<>();
        wrapper.selectAll(OrdersRefund.class)
                .select("o.code as orderCode")
                .select("o.goods_info as goodsInfo")
                .select("o.type as orderType")
                .select("o.good_level as goodLevel")
                .select("o.total_amount as totalAmount")
                .select("o.pay_amount as payAmount")
                .select("c2.name as goodLevelName")
                .leftJoin("orders o on o.id = t.ORDER_ID and o.DELETED = 0")
                .leftJoin("category c1 on c1.id = o.GOOD_TYPE and c1.DELETED = 0")
                .leftJoin("category c2 on c2.id = c1.RELATION_ID and c2.DELETED = 0 and c2.TYPE = 3")
                .eq(OrdersRefund::getDeleted, 0);
        if (model != null) {
            if (StringUtils.isNotBlank(model.getOrderCode())) {
                wrapper.like("o.code", model.getOrderCode());
            }
            if (StringUtils.isNotBlank(model.getGoodsInfo())) {
                wrapper.like("o.goods_info", model.getGoodsInfo());
            }
            if (model.getOrderType() != null) {
                wrapper.eq("o.type", model.getOrderType());
            }
            if (model.getRefundStatus() != null) {
                wrapper.eq(OrdersRefund::getStatus, model.getRefundStatus());
            }
            if (model.getCreateStartTime() != null) {
                wrapper.ge(OrdersRefund::getCreateTime, model.getCreateStartTime());
            }
            if (model.getCreateEndTime() != null) {
                wrapper.le(OrdersRefund::getCreateTime, model.getCreateEndTime());
            }
        }
        wrapper.orderByDesc(OrdersRefund::getCreateTime);
        IPage<OrdersRefund> refundPage = ordersRefundMapper.selectJoinPage(page, OrdersRefund.class, wrapper);
        // è½¬æ¢ä¸º VO
        List<OrdersRefundPageVO> voList = new ArrayList<>();
        if (refundPage != null && refundPage.getRecords() != null) {
            for (OrdersRefund r : refundPage.getRecords()) {
                OrdersRefundPageVO vo = new OrdersRefundPageVO();
                vo.setId(r.getId());
                vo.setOrderId(r.getOrderId());
                vo.setOrderCode(r.getOrderCode());
                vo.setGoodsInfo(r.getGoodsInfo());
                vo.setOrderType(r.getOrderType());
                vo.setGoodLevelName(r.getGoodLevelName());
                vo.setTotalAmount(r.getTotalAmount());
                vo.setPayAmount(r.getPayAmount());
                vo.setRefundAmount(r.getRefundAmount());
                vo.setCreateTime(r.getCreateTime());
                vo.setRefundStatus(r.getStatus());
                voList.add(vo);
            }
        }
        PageData<OrdersRefundPageVO> result = new PageData<>(
                refundPage != null ? refundPage.getCurrent() : pageWrap.getPage(),
                refundPage != null ? refundPage.getSize() : pageWrap.getCapacity());
        result.setRecords(voList);
        if (refundPage != null) {
            result.setTotal(refundPage.getTotal());
        }
        return result;
    }
    @Override
    @Transactional(rollbackFor = Exception.class)
    public void retryRefund(Integer id) {
        // 1. æŸ¥è¯¢é€€æ¬¾è®°å½•
        OrdersRefund refundRecord = ordersRefundMapper.selectById(id);
        if (refundRecord == null || Constants.ONE.equals(refundRecord.getDeleted())) {
            throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(), "退款记录不存在");
        }
        if (!Constants.TWO.equals(refundRecord.getStatus())) {
            throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "仅退款失败的记录可重新退款");
        }
        // 2. æŸ¥è¯¢å…³è”订单
        Orders order = ordersMapper.selectById(refundRecord.getOrderId());
        if (order == null || Constants.ONE.equals(order.getDeleted())) {
            throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(), "关联订单不存在");
        }
        if (StringUtils.isBlank(order.getOutTradeNo())) {
            throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "订单缺少微信支付单号");
        }
        // 3. å‘起微信退款
        String outRefundNo = com.doumee.core.utils.ID.nextGUID();
        com.wechat.pay.java.service.refund.model.Refund refundResult;
        try {
            refundResult = wxPayV3Service.refund(
                    outRefundNo,
                    order.getOutTradeNo(),
                    order.getPayAmount(),
                    refundRecord.getRefundAmount(),
                    "重新退款",
                    wxPayProperties.getV3RefundNotifyUrl());
        } catch (Exception e) {
            log.error("重新退款调用异常, refundRecordId={}", id, e);
            throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "退款失败,请稍后重试");
        }
        // 4. æ›´æ–°é€€æ¬¾è®°å½•
        Date now = new Date();
        com.wechat.pay.java.service.refund.model.Status wxStatus = refundResult.getStatus();
        OrdersRefund update = new OrdersRefund();
        update.setId(id);
        update.setRefundCode(outRefundNo);
        update.setUpdateTime(now);
        if (com.wechat.pay.java.service.refund.model.Status.SUCCESS.equals(wxStatus)) {
            update.setStatus(Constants.ONE);
            update.setRefundTime(now);
        } else if (com.wechat.pay.java.service.refund.model.Status.PROCESSING.equals(wxStatus)) {
            update.setStatus(Constants.ZERO);
        } else {
            update.setStatus(Constants.TWO);
            update.setRefundRemark("重新退款仍然失败");
        }
        ordersRefundMapper.updateById(update);
    }
}
server/services/src/main/java/com/doumee/service/business/impl/OrdersServiceImpl.java
@@ -17,6 +17,7 @@
import com.doumee.core.model.PageData;
import com.doumee.core.model.PageWrap;
import com.doumee.core.utils.DateUtil;
import com.doumee.core.utils.ID;
import com.doumee.core.utils.geocode.MapUtil;
import com.doumee.core.utils.Utils;
import com.doumee.core.utils.aliyun.AliSmsService;
@@ -237,7 +238,14 @@
                queryWrapper.orderByAsc(sortData.getProperty());
            }
        }
        return PageData.from(ordersMapper.selectJoinPage(page, Orders.class, queryWrapper));
        PageData<Orders> pageData = PageData.from(ordersMapper.selectJoinPage(page, Orders.class, queryWrapper));
        for (Orders o : pageData.getRecords()) {
            if (o.getStatus() != null) {
                Constants.OrderStatus os = Constants.OrderStatus.getByKey(o.getStatus());
                o.setStatusDesc(os != null ? os.getValue() : "");
            }
        }
        return pageData;
    }
    @Override
@@ -698,7 +706,7 @@
                // æ— å–件门店,校验存件点与自选取件点是否在同一城市
                if (!MapUtil.isSameCity(depositShop.getLatitude(), depositShop.getLongitude(),
                        dto.getTakeLat().doubleValue(), dto.getTakeLgt().doubleValue())) {
                    throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "异地寄存订单存取点不在同一城市,如需请选择同城门店");
                    throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "存取点不在同一城市!");
                }
                takeLat = dto.getTakeLat();
                takeLgt = dto.getTakeLgt();
@@ -785,6 +793,7 @@
            // å¼‚地:取件点信息
            orders.setTakeShopId(dto.getTakeShopId());
            orders.setTakeLocation(takeLocationValue);
            orders.setTakeLocationRemark(takeLocationValue);
            orders.setTakeLat(takeLat);
            orders.setTakeLgt(takeLgt);
            orders.setIsUrgent(dto.getIsUrgent());
@@ -793,6 +802,7 @@
            // å°±åœ°ï¼šå–件点同寄件店铺
            orders.setTakeShopId(dto.getDepositShopId());
            orders.setTakeLocation(depositShop.getAddress());
            orders.setTakeLocationRemark(depositShop.getAddress());
            orders.setTakeLat(BigDecimal.valueOf(depositShop.getLatitude()));
            orders.setTakeLgt(BigDecimal.valueOf(depositShop.getLongitude()));
            orders.setIsUrgent(Constants.ZERO);
@@ -836,6 +846,19 @@
        ordersMapper.insert(orders);
        Integer orderId = orders.getId();
        // åˆ›å»ºè®¢å•日志
        OrderLog createLog = new OrderLog();
        createLog.setOrderId(orderId);
        createLog.setTitle(Constants.OrderLogType.createOrder.getTitle());
        createLog.setLogInfo(Constants.OrderLogType.createOrder.format(orderCode));
        createLog.setObjType(Constants.OrderLogType.createOrder.getStatus());
        createLog.setOrderStatus(orders.getStatus());
        createLog.setOptUserId(memberId);
        createLog.setOptUserType(0);
        createLog.setCreateTime(now);
        createLog.setDeleted(Constants.ZERO);
        orderLogService.create(createLog);
        // ========== 7. åˆ›å»ºè®¢å•明细 ==========
        for (ItemPriceVO itemVO : priceResult.getItemList()) {
@@ -987,6 +1010,12 @@
        OrderDetailVO vo = new OrderDetailVO();
        vo.setOrder(order);
        // è®¢å•状态描述
        if (order.getStatus() != null) {
            Constants.OrderStatus os = Constants.OrderStatus.getByKey(order.getStatus());
            vo.setStatusDesc(os != null ? os.getValue() : "");
        }
        // å›¾ç‰‡è·¯å¾„前缀
        String imgPrefix = getOrdersPrefix();
@@ -1111,19 +1140,6 @@
        String optUserName = getCurrentUserName();
        // åŠ æ€¥è´¹æ—¥å¿—
        OrderLog feeLog = new OrderLog();
        feeLog.setOrderId(order.getId());
        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);
        feeLog.setCreateTime(new Date());
        feeLog.setDeleted(Constants.ZERO);
        orderLogService.create(feeLog);
        // åŠ æ€¥è´¹ç”¨ å…ƒâ†’分
        long urgentFeeFen = dto.getUrgentFee().multiply(new BigDecimal(100)).longValue();
@@ -1148,9 +1164,30 @@
            updateWrapper.set(Orders::getRemark, dto.getRemark());
        }
        // æŒ‡æ´¾å¸æœºï¼ˆéžå¿…填)
        // æ—¥å¿—:只存一条,有司机用 assignDriver,无司机用 urgent
        if (dto.getDriverId() != null) {
            // æ ¡éªŒå¸æœºä¿¡æ¯
            DriverInfo driverInfo = driverInfoMapper.selectOne(new QueryWrapper<DriverInfo>().lambda()
                    .eq(DriverInfo::getMemberId, dto.getDriverId())
                    .eq(DriverInfo::getDeleted, Constants.ZERO)
                    .last("limit 1"));
            if (driverInfo == null) {
                throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(), "司机信息不存在");
            }
            if (!Integer.valueOf(3).equals(driverInfo.getAuditStatus())) {
                throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "司机未支付押金,无法派单");
            }
            if (!Constants.ZERO.equals(driverInfo.getStatus())) {
                throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "司机已被禁用,无法派单");
            }
            // æ›´æ–°æŽ¥å•司机信息及订单状态
            Date now = new Date();
            updateWrapper.set(Orders::getAssignDriverId, dto.getDriverId());
            updateWrapper.set(Orders::getAcceptDriver, dto.getDriverId());
            updateWrapper.set(Orders::getAcceptTime, now);
            updateWrapper.set(Orders::getAcceptType, 1); // 1=系统派单
            updateWrapper.set(Orders::getStatus, Constants.OrderStatus.accepted.getStatus());
            Member driver = memberMapper.selectById(dto.getDriverId());
            String driverName = driver != null ? driver.getName() : String.valueOf(dto.getDriverId());
@@ -1160,32 +1197,37 @@
            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.setOrderStatus(Constants.OrderStatus.accepted.getStatus());
            driverLog.setOptUserType(3);
            driverLog.setOptUserName(optUserName);
            driverLog.setCreateTime(new Date());
            driverLog.setCreateTime(now);
            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));
            }
            String address1 = order.getDepositLocationRemark();
            String address2 = order.getTakeLocationRemark();
            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));
        } else {
            // æœªæŒ‡æ´¾å¸æœºï¼Œåªè®°å½•加急日志
            OrderLog feeLog = new OrderLog();
            feeLog.setOrderId(order.getId());
            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);
            feeLog.setCreateTime(new Date());
            feeLog.setDeleted(Constants.ZERO);
            orderLogService.create(feeLog);
        }
        ordersMapper.update(updateWrapper);
@@ -1888,9 +1930,10 @@
                    Constants.SmsNotify.MEMBER_CANCELLED, "orderNo", order.getCode());
            // è°ƒç”¨å¾®ä¿¡é€€æ¬¾V3,全额退款
            String outRefundNo = ID.nextGUID();
            com.wechat.pay.java.service.refund.model.Refund refundResult;
            try {
                refundResult = wxPayV3Service.refund(order.getOutTradeNo(), order.getPayAmount(), order.getPayAmount(),
                refundResult = wxPayV3Service.refund(outRefundNo, order.getOutTradeNo(), order.getPayAmount(), order.getPayAmount(),
                        "订单退款", wxPayProperties.getV3RefundNotifyUrl());
            } catch (Exception e) {
                log.error("待寄存订单退款调用异常, orderId={}", orderId, e);
@@ -1908,7 +1951,7 @@
            refund.setDeleted(Constants.ZERO);
            refund.setBeforeStatus(Constants.OrderStatus.waitDeposit.getStatus());
            refund.setRefundAmount(order.getPayAmount());
            refund.setRefundCode(refundResult.getOutRefundNo());
            refund.setRefundCode(outRefundNo);
            if (com.wechat.pay.java.service.refund.model.Status.SUCCESS.equals(refundStatus)) {
                // é€€æ¬¾æˆåŠŸ
@@ -2117,6 +2160,20 @@
            }
        }
        ordersMapper.updateById(order);
        // æ”¯ä»˜æˆåŠŸæ—¥å¿—
        OrderLog payLog = new OrderLog();
        payLog.setOrderId(order.getId());
        payLog.setTitle(Constants.OrderLogType.payOrder.getTitle());
        payLog.setLogInfo(Constants.OrderLogType.payOrder.format(
                String.valueOf(order.getTotalAmount() != null ? order.getTotalAmount() / 100.0 : 0)));
        payLog.setObjType(Constants.OrderLogType.payOrder.getStatus());
        payLog.setOrderStatus(order.getStatus());
        payLog.setOptUserId(order.getMemberId());
        payLog.setOptUserType(0);
        payLog.setCreateTime(now);
        payLog.setDeleted(Constants.ZERO);
        orderLogService.create(payLog);
        // é€šçŸ¥ä¼šå‘˜ï¼šè®¢å•待核验
        sendOrderNotice(order.getMemberId(), Constants.MemberOrderNotify.WAIT_VERIFY, order.getId(),
@@ -2736,7 +2793,64 @@
                        "orderNo", order.getCode(),
                        "settleDays", settleDays != null ? settleDays : "7");
            }
        } else {
        }else if(Constants.equalsInteger(order.getStatus(), Constants.OrderStatus.delivering.getKey())){
            // ä»…异地寄存 + æœ‰å–件门店 + æ´¾é€ä¸­(4) å¯æ ¸é”€
            if (!Constants.equalsInteger(order.getType(), Constants.ONE)) {
                throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "仅异地寄存订单支持司机核销");
            }
            if (order.getTakeShopId() == null) {
                throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "该订单无取件门店,无需司机核销");
            }
            if (!Constants.equalsInteger(order.getStatus(), Constants.OrderStatus.delivering.getStatus())) {
                throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "当前订单状态不允许核销");
            }
            // æ ¡éªŒå–件门店与当前登录门店一致
            if (!shopId.equals(order.getTakeShopId())) {
                throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "该订单不属于当前门店,无法核销");
            }
            // æ´¾é€ä¸­(4) â†’ å·²åˆ°åº—(5)
            order.setStatus(Constants.OrderStatus.arrived.getStatus());
            order.setArriveTime(new Date());
            if (StringUtils.isNotBlank(remark)) {
                order.setRemark(remark);
            }
            ordersMapper.updateById(order);
            // é‡Šæ”¾å¸æœºæ ¸é”€ç 
            releaseVerifyCode(order.getDriverVerifyCode());
            // ä¿å­˜é™„件(obj_type=3 é—¨åº—入库图片,最多3张)
            saveVerifyImages(order.getId(), images, Constants.FileType.ORDER_TAKE.getKey(), order.getAcceptDriver());
            // é€šçŸ¥ä¼šå‘˜ï¼šè®¢å•已送达
            String destination = order.getTakeShopAddress() != null ? order.getTakeShopAddress() : "";
            if (order.getMemberVerifyCode() != null) {
                sendOrderNotice(order.getMemberId(), Constants.MemberOrderNotify.ARRIVED_HAS_SHOP, order.getId(),
                        "orderNo", order.getCode(),
                        "destination", destination,
                        "pickupCode", order.getMemberVerifyCode());
            } else {
                sendOrderNotice(order.getMemberId(), Constants.MemberOrderNotify.ARRIVED_NO_SHOP, order.getId(),
                        "orderNo", order.getCode(),
                        "destination", destination);
            }
            // é€šçŸ¥å–件门店:订单已送达
            if (order.getTakeShopId() != null) {
                sendShopNotice(order.getTakeShopId(), Constants.ShopOrderNotify.ARRIVED, order.getId(),
                        "orderNo", order.getCode(),
                        "destination", destination);
            }
            // çŸ­ä¿¡é€šçŸ¥ä¼šå‘˜ï¼šè¡ŒæŽå·²é€è¾¾
            Member arrivedMember = memberMapper.selectById(order.getMemberId());
            if (arrivedMember != null) {
                sendSmsNotify(arrivedMember.getTelephone(), Constants.SmsNotify.MEMBER_ARRIVED,
                        "orderNo", order.getCode(),
                        "address", destination,
                        "code", order.getMemberVerifyCode() != null ? order.getMemberVerifyCode() : "");
            }
        }else {
            throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "当前订单状态不允许核销");
        }
    }
@@ -2914,12 +3028,13 @@
            ordersRefundMapper.insert(refundRecord);
            // è°ƒç”¨å¾®ä¿¡é€€æ¬¾V3(放在最后,确保前置操作全部成功)
            String outRefundNo2 = ID.nextGUID();
            Refund refundResult = wxPayV3Service.refund(
                    order.getOutTradeNo(), order.getPayAmount(), order.getRefundAmount(),
                    outRefundNo2, order.getOutTradeNo(), order.getPayAmount(), order.getRefundAmount(),
                    "订单退款", wxPayProperties.getV3RefundNotifyUrl());
            // é€€æ¬¾æˆåŠŸåŽå›žå¡«é€€æ¬¾å•å·ï¼Œæ ‡è®°é€€æ¬¾ä¸­
            refundRecord.setRefundCode(refundResult.getOutRefundNo());
            refundRecord.setRefundCode(outRefundNo2);
            refundRecord.setStatus(Constants.ZERO); // é€€æ¬¾ä¸­
            ordersRefundMapper.updateById(refundRecord);
        }
server/services/src/main/java/com/doumee/service/business/impl/PricingRuleServiceImpl.java
@@ -203,16 +203,16 @@
            PricingRule existing = pricingRuleMapper.selectOne(qw);
            if (existing != null) {
                // æ›´æ–°
                existing.setFieldB(item.getUnitPrice());
                // æ›´æ–°ï¼ˆå…ƒè½¬åˆ†ï¼‰
                existing.setFieldB(yuanToFen(item.getUnitPrice()));
                existing.setUpdateTime(now);
                pricingRuleMapper.updateById(existing);
            } else {
                // æ–°å»º
                // æ–°å»ºï¼ˆå…ƒè½¬åˆ†ï¼‰
                PricingRule rule = new PricingRule();
                rule.setType(Constants.ZERO);
                rule.setFieldA(String.valueOf(item.getCategoryId()));
                rule.setFieldB(item.getUnitPrice());
                rule.setFieldB(yuanToFen(item.getUnitPrice()));
                rule.setCityId(request.getCityId());
                rule.setDeleted(Constants.ZERO);
                rule.setCreateTime(now);
@@ -252,7 +252,7 @@
            PricingRule rule = existingMap.get(String.valueOf(category.getId()));
            if (rule != null) {
                vo.setPricingRuleId(rule.getId());
                vo.setUnitPrice(rule.getFieldB());
                vo.setUnitPrice(fenToYuan(rule.getFieldB()));
            }
            return vo;
        }).collect(Collectors.toList());
@@ -281,9 +281,9 @@
            if (existing != null) {
                existing.setFieldB(item.getStartDistance());
                existing.setFieldC(item.getStartPrice());
                existing.setFieldC(yuanToFen(item.getStartPrice()));
                existing.setFieldD(item.getExtraDistance());
                existing.setFieldE(item.getExtraPrice());
                existing.setFieldE(yuanToFen(item.getExtraPrice()));
                existing.setUpdateTime(now);
                pricingRuleMapper.updateById(existing);
            } else {
@@ -291,9 +291,9 @@
                rule.setType(Constants.ONE);
                rule.setFieldA(String.valueOf(item.getCategoryId()));
                rule.setFieldB(item.getStartDistance());
                rule.setFieldC(item.getStartPrice());
                rule.setFieldC(yuanToFen(item.getStartPrice()));
                rule.setFieldD(item.getExtraDistance());
                rule.setFieldE(item.getExtraPrice());
                rule.setFieldE(yuanToFen(item.getExtraPrice()));
                rule.setCityId(request.getCityId());
                rule.setDeleted(Constants.ZERO);
                rule.setCreateTime(now);
@@ -334,9 +334,9 @@
            if (rule != null) {
                vo.setPricingRuleId(rule.getId());
                vo.setStartDistance(rule.getFieldB());
                vo.setStartPrice(rule.getFieldC());
                vo.setStartPrice(fenToYuan(rule.getFieldC()));
                vo.setExtraDistance(rule.getFieldD());
                vo.setExtraPrice(rule.getFieldE());
                vo.setExtraPrice(fenToYuan(rule.getFieldE()));
            }
            return vo;
        }).collect(Collectors.toList());
@@ -566,7 +566,7 @@
            PricingRule rule = existingMap.get(String.valueOf(i));
            if (rule != null) {
                vo.setPricingRuleId(rule.getId());
                vo.setDepositAmount(rule.getFieldB());
                vo.setDepositAmount(fenToYuan(rule.getFieldB()));
            }
            result.add(vo);
        }
@@ -653,4 +653,19 @@
        return result;
    }
    private String yuanToFen(String yuan) {
        if (yuan == null || yuan.isEmpty()) return "0";
        return String.valueOf(new BigDecimal(yuan)
                .multiply(new BigDecimal("100"))
                .setScale(0, RoundingMode.HALF_UP)
                .longValue());
    }
    private String fenToYuan(String fen) {
        if (fen == null || fen.isEmpty()) return "0";
        return new BigDecimal(fen)
                .divide(new BigDecimal("100"), 2, RoundingMode.HALF_UP)
                .toPlainString();
    }
}
server/services/src/main/java/com/doumee/service/business/impl/ShopInfoServiceImpl.java
@@ -27,6 +27,7 @@
import com.doumee.dao.business.model.PricingRule;
import com.doumee.dao.business.model.ShopInfo;
import com.doumee.dao.dto.*;
import com.doumee.dao.system.model.SystemDictData;
import com.doumee.dao.system.SystemUserMapper;
import com.doumee.dao.system.model.SystemUser;
import com.doumee.dao.vo.ShopDetailVO;
@@ -293,8 +294,7 @@
        Integer shopId;
        if (existing != null) {
            // æ ¡éªŒçŠ¶æ€ï¼šåªæœ‰å¾…å®¡æ‰¹(0)和被驳回(2)可修改
            if (!Constants.equalsInteger(existing.getAuditStatus(), Constants.ZERO)
                    && !Constants.equalsInteger(existing.getAuditStatus(), Constants.TWO)) {
            if (!Constants.equalsInteger(existing.getAuditStatus(), Constants.TWO)) {
                throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "当前门店状态不允许修改");
            }
            // æ ¡éªŒopenid匹配:当前登录会员的openid必须与门店的openid一致
@@ -360,6 +360,7 @@
            shopInfo.setSalt(salt);
            shopInfo.setAliAccount(request.getAliAccount());
            shopInfo.setAliName(request.getAliName());
            shopInfo.setAuditStatus(Constants.ZERO);
            shopInfo.setStatus(Constants.ZERO);
            shopInfo.setDeleted(Constants.ZERO);
            shopInfo.setCreateTime(now);
@@ -367,6 +368,8 @@
            shopInfo.setRegionMemberId(member.getId());
            // è¯»å–押金金额
            setDepositAmountFromPricingRule(shopInfo);
            // è®¾ç½®é»˜è®¤é…é€èŒƒå›´
            setDefaultDeliveryRange(shopInfo);
            shopInfoMapper.insert(shopInfo);
            shopId = shopInfo.getId();
        }
@@ -469,7 +472,8 @@
        if (Constants.equalsInteger(newAuditStatus, Constants.ONE)) {
            // å®¡æ ¸é€šè¿‡ â†’ é€šçŸ¥ç¼´çº³æŠ¼é‡‘
            String depositMoney = shopInfo.getDepositAmount() != null
                    ? String.valueOf(shopInfo.getDepositAmount() / 100.0) : "0";
                    ? new java.math.BigDecimal(shopInfo.getDepositAmount())
                        .divide(new java.math.BigDecimal(100), 2, java.math.RoundingMode.HALF_UP).toPlainString() : "0";
            sendSmsNotify(shopInfo.getTelephone(),
                    Constants.SmsNotify.SHOP_AUTH_APPROVED_DEPOSIT,
                    "storeName", shopInfo.getName(),
@@ -794,7 +798,8 @@
        // é—¨åº—名称模糊查询
        if (StringUtils.isNotBlank(dto.getName())) {
            qw.lambda().like(ShopInfo::getName, dto.getName());
            qw.lambda().and(q -> q.like(ShopInfo::getName, dto.getName()).or()
                    .like(ShopInfo::getAddress, dto.getName()));
        }
        // åŸŽå¸‚筛选(areaId是区县,需匹配其parentId等于城市ID)
@@ -1145,7 +1150,6 @@
    public ShopLoginVO shopPasswordLogin(ShopLoginDTO dto){
        if(StringUtils.isBlank(dto.getTelephone())
                || StringUtils.isBlank(dto.getPassword())
                || StringUtils.isBlank(dto.getOpenid())
        ){
            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"用户名或密码不能为空");
        }
@@ -1155,6 +1159,12 @@
        );
        if(shop==null){
            throw new BusinessException(ResponseStatus.ACCOUNT_INCORRECT);
        }
        if(!Constants.equalsInteger(shop.getAuditStatus(),Constants.THREE)){
            if(Constants.equalsInteger(shop.getAuditStatus(),Constants.ONE)){
                throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"请完成审批流程 - æ”¯ä»˜æŠ¼é‡‘");
            }
            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"门店审批流程未完成,请完成审批流程");
        }
        //加密密码
        String pwd = Utils.Secure.encryptPassword( dto.getPassword(), shop.getSalt());
@@ -1179,7 +1189,6 @@
        // åˆ›å»ºtoken(generateTokenForRedis å·²è‡ªåŠ¨æ¸…é™¤è¯¥ç”¨æˆ·æ—§token,保证唯一有效)
        String token = JwtTokenUtil.generateTokenForRedis(shop.getId(), Constants.TWO, JSONObject.toJSONString(shop), redisTemplate);
        // æž„建响应
        ShopLoginVO vo = new ShopLoginVO();
        vo.setToken(token);
@@ -1329,6 +1338,16 @@
    }
    /**
     * ä»Žè¿è¥é…ç½®è¯»å–默认配送范围并赋值到门店记录
     */
    private void setDefaultDeliveryRange(ShopInfo shopInfo) {
        SystemDictData data = systemDictDataBiz.queryByCode(Constants.OPERATION_CONFIG, Constants.OP_DEFAULT_DELIVERY_RANGE);
        if (data != null && StringUtils.isNotBlank(data.getCode())) {
            shopInfo.setDeliveryArea(new java.math.BigDecimal(data.getCode()));
        }
    }
    /**
     * å‘送短信通知(失败不影响主业务)
     */
    private void sendSmsNotify(String phone, Constants.SmsNotify smsNotify, String... paramPairs) {
@@ -1363,11 +1382,14 @@
    }
    @Override
    public void changePassword(Integer shopId, String newPassword, String token) {
        if (StringUtils.isBlank(newPassword)) {
            throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "密码不能为空");
    public void changePassword(Integer shopId, String oldPassword, String newPassword, String token) {
        if (StringUtils.isBlank(oldPassword)) {
            throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "旧密码不能为空");
        }
        // æ ¡éªŒå¯†ç å¿…须同时包含字母和数字
        if (StringUtils.isBlank(newPassword)) {
            throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "新密码不能为空");
        }
        // æ ¡éªŒæ–°å¯†ç å¿…须同时包含字母和数字
        boolean hasLetter = newPassword.chars().anyMatch(Character::isLetter);
        boolean hasDigit = newPassword.chars().anyMatch(Character::isDigit);
        if (!hasLetter || !hasDigit) {
@@ -1378,6 +1400,11 @@
        if (shopInfo == null || Constants.equalsInteger(shopInfo.getDeleted(), Constants.ONE)) {
            throw new BusinessException(ResponseStatus.DATA_EMPTY);
        }
        // æ ¡éªŒæ—§å¯†ç 
        String oldEncryptPwd = Utils.Secure.encryptPassword(oldPassword, shopInfo.getSalt());
        if (!oldEncryptPwd.equals(shopInfo.getPassword())) {
            throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "旧密码错误");
        }
        // é‡æ–°ç”Ÿæˆsalt,加密新密码并更新
        String salt = RandomStringUtils.randomAlphabetic(6);
        shopInfo.setPassword(Utils.Secure.encryptPassword(newPassword, salt));
server/services/src/main/java/com/doumee/service/business/impl/WithdrawalOrdersServiceImpl.java
@@ -217,7 +217,10 @@
        queryWrapper.select("IFNULL(SUM(amount), 0) as amount");
        Utils.MP.blankToNull(pageWrap.getModel());
        queryWrapper.lambda().eq(WithdrawalOrders::getDeleted, Constants.ZERO);
        queryWrapper.lambda().in(WithdrawalOrders::getStatus, Arrays.asList(Constants.ZERO, Constants.ONE));
        queryWrapper.lambda().eq(WithdrawalOrders::getStatus, Constants.ONE);
        if (pageWrap.getModel().getMemberType() != null) {
            queryWrapper.lambda().eq(WithdrawalOrders::getMemberType, pageWrap.getModel().getMemberType());
        }
        if (pageWrap.getModel().getOutBillNo() != null) {
            queryWrapper.lambda().like(WithdrawalOrders::getOutBillNo, pageWrap.getModel().getOutBillNo());
        }
server/services/src/main/resources/application-pro.yml
@@ -77,7 +77,7 @@
tencent_key:
# é«˜å¾·åœ°å›¾apikey
geocode_map_key: 9a6c1f0eff2e5aa91989ca9d4c21e262
geocode_map_key: 9a62636d82d6c7c2372e57d80f99287c
qiwei:
  serviceurl: https://qyapi.weixin.qq.com
server/web/src/main/java/com/doumee/api/web/ConfigApi.java
@@ -13,9 +13,11 @@
import com.doumee.dao.business.model.Banner;
import com.doumee.dao.business.model.Category;
import com.doumee.dao.business.model.Notice;
import com.alibaba.fastjson.JSONObject;
import com.doumee.dao.dto.AreasDto;
import com.doumee.dao.dto.CalculateLocalPriceDTO;
import com.doumee.dao.dto.CalculateRemotePriceDTO;
import com.doumee.dao.dto.DirectionInfoDTO;
import com.doumee.dao.dto.SameCityCheckDTO;
import com.doumee.dao.vo.PriceCalculateVO;
import com.doumee.dao.vo.ActiveOrderTipVO;
@@ -237,6 +239,13 @@
    }
    @LoginDriverRequired
    @ApiOperation(value = "路径规划", notes = "调用高德地图路径规划接口,返回路线信息")
    @PostMapping("/directionInfo")
    public ApiResponse<JSONObject> directionInfo(@RequestBody @Valid DirectionInfoDTO dto) {
        return ApiResponse.success("操作成功", MapUtil.directionInfo(dto.getMode(), dto.getFrom(), dto.getTo()));
    }
    @LoginDriverRequired
    @ApiOperation(value = "司机标记全部已读", notes = "标记当前用户所有未读通知为已读")
    @PostMapping("/driverReadAllNotice")
    @ApiImplicitParams({
server/web/src/main/java/com/doumee/api/web/DriverInfoApi.java
@@ -17,6 +17,7 @@
import com.doumee.dao.dto.DriverRegisterRequest;
import com.doumee.dao.dto.DriverVerifyRequest;
import com.doumee.dao.vo.AccountResponse;
import com.doumee.dao.dto.CancelOrderDTO;
import com.doumee.dao.vo.DriverActiveOrderCountVO;
import com.doumee.dao.vo.DriverCancelLimitVO;
import com.doumee.dao.vo.DriverCenterVO;
@@ -200,9 +201,8 @@
    @ApiImplicitParams({
            @ApiImplicitParam(paramType = "header", dataType = "String", name = "token", value = "用户token值", required = true)
    })
    public ApiResponse cancelOrder(@RequestParam Integer orderId,
                                   @RequestParam(required = false) String reason) {
        driverInfoService.cancelOrder(this.getDriverId(), orderId, reason);
    public ApiResponse cancelOrder(@RequestBody @Valid CancelOrderDTO dto) {
        driverInfoService.cancelOrder(this.getDriverId(), dto.getOrderId(), dto.getCancelReason());
        return ApiResponse.success("取消成功");
    }
@@ -237,9 +237,10 @@
    @ApiImplicitParams({
            @ApiImplicitParam(paramType = "header", dataType = "String", name = "token", value = "用户token值", required = true),
    })
    public ApiResponse changePassword(@RequestParam String newPassword) {
    public ApiResponse changePassword(@RequestParam String oldPassword,
                                       @RequestParam String newPassword) {
        String token = this.getRequest().getHeader(JwtTokenUtil.HEADER_KEY);
        driverInfoService.changePassword(this.getDriverId(), newPassword, token);
        driverInfoService.changePassword(this.getDriverId(), oldPassword, newPassword, token);
        return ApiResponse.success("密码修改成功,请重新登录");
    }
@@ -276,4 +277,13 @@
        return ApiResponse.success("操作成功", driverInfoService.getTodayCancelLimit(this.getDriverId()));
    }
    @ApiOperation("校验司机token是否有效")
    @GetMapping("/checkToken")
    @ApiImplicitParams({
            @ApiImplicitParam(paramType = "query", dataType = "String", name = "token", value = "司机token", required = true)
    })
    public ApiResponse<Boolean> checkToken(@RequestParam String token) {
        return ApiResponse.success(driverInfoService.checkDriverToken(token));
    }
}
server/web/src/main/java/com/doumee/api/web/ShopInfoApi.java
@@ -136,9 +136,10 @@
    @ApiImplicitParams({
            @ApiImplicitParam(paramType = "header", dataType = "String", name = "token", value = "门店token值", required = true),
    })
    public ApiResponse changePassword(@RequestParam String newPassword) {
    public ApiResponse changePassword(@RequestParam String oldPassword,
                                       @RequestParam String newPassword) {
        String token = this.getRequest().getHeader(JwtTokenUtil.HEADER_KEY);
        shopInfoService.changePassword(this.getShopId(), newPassword, token);
        shopInfoService.changePassword(this.getShopId(), oldPassword, newPassword, token);
        return ApiResponse.success("密码修改成功,请重新登录");
    }