108019e27e8958dbf474b8b9bea3fb5fbf7198d9..c313a253b1fcdc75b6be5db575fc2b29fb407021
昨天 rk
Merge remote-tracking branch 'origin/master'
c313a2 对比 | 目录
昨天 rk
代码提交
fcd0f6 对比 | 目录
已添加67个文件
已删除3个文件
4723 ■■■■ 文件已修改
server/admin/src/main/java/com/doumee/api/business/AddrController.java 100 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/admin/src/main/java/com/doumee/api/business/AgreementConfigController.java 41 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/admin/src/main/java/com/doumee/api/business/OperationConfigController.java 40 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/admin/src/main/java/com/doumee/api/business/OrderLogController.java 65 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/admin/src/main/java/com/doumee/api/business/OrdersRefundController.java 82 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/db/db_change.sql 158 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/biz/system/AgreementConfigBiz.java 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/biz/system/OperationConfigBiz.java 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/biz/system/impl/AgreementConfigBizImpl.java 74 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/biz/system/impl/OperationConfigBizImpl.java 89 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/config/wx/TransferDetailEntityNew.java 213 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/config/wx/WXPayUtility.java 456 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/config/wx/WxMiniUtilService.java 62 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/core/annotation/LoginShopRequired.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/core/utils/ID.java 89 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/core/utils/RandomString.java 60 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/core/utils/Strings.java 55 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/core/utils/Tencent/MapUtil.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/core/utils/aliyun/ALiYunSmSUtil.java 61 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/dao/business/AddrMapper.java 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/dao/business/OrderLogMapper.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/dao/business/OrdersRefundMapper.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/dao/business/model/Addr.java 106 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/dao/business/model/OrderLog.java 78 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/dao/business/model/OrdersRefund.java 70 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/dao/dto/AgreementConfigDTO.java 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/dao/dto/CalculateLocalPriceDTO.java 41 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/dao/dto/CalculateRemotePriceDTO.java 56 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/dao/dto/CancelOrderDTO.java 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/dao/dto/ConfirmArriveDTO.java 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/dao/dto/CreateOrderDTO.java 84 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/dao/dto/DispatchDTO.java 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/dao/dto/DriverVerifyDTO.java 31 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/dao/dto/MemberListQueryDTO.java 33 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/dao/dto/MyOrderDTO.java 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/dao/dto/OperationConfigDTO.java 40 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/dao/dto/OrderItemDTO.java 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/dao/dto/ShopDetailQueryDTO.java 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/dao/dto/ShopInfoMaintainDTO.java 40 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/dao/dto/ShopLoginDTO.java 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/dao/dto/ShopNearbyDTO.java 39 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/dao/dto/ShopVerifyDTO.java 31 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/dao/dto/UpdMobileRequest.java 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/dao/dto/WithdrawalApproveDTO.java 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/dao/vo/ItemPriceVO.java 47 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/dao/vo/MemberDetailVO.java 85 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/dao/vo/MemberListVO.java 44 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/dao/vo/MyOrderDetailVO.java 154 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/dao/vo/MyOrderVO.java 94 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/dao/vo/OrderDetailVO.java 83 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/dao/vo/OrderDispatchVO.java 52 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/dao/vo/OrderItemVO.java 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/dao/vo/OrderSummaryVO.java 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/dao/vo/OverdueFeeVO.java 31 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/dao/vo/PayResponse.java 31 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/dao/vo/PriceCalculateVO.java 40 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/dao/vo/ShopLoginVO.java 33 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/dao/vo/ShopNearbyVO.java 39 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/dao/vo/ShopWebDetailVO.java 36 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/service/business/AddrService.java 49 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/service/business/OrderLogService.java 37 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/service/business/OrdersRefundService.java 98 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/service/business/impl/AddrServiceImpl.java 171 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/service/business/impl/OrderLogServiceImpl.java 139 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/service/business/impl/OrdersRefundServiceImpl.java 113 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/web/src/main/java/com/doumee/api/web/AddrApi.java 100 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/web/src/main/java/com/doumee/api/web/MemberApi.java 113 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/web/src/main/java/com/doumee/api/web/OrdersApi.java 113 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/web/src/main/java/com/doumee/api/web/PaymentCallback.java 157 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/web/src/main/java/com/doumee/api/web/UserApi.java 162 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/admin/src/main/java/com/doumee/api/business/AddrController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,100 @@
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.Addr;
import com.doumee.service.business.AddrService;
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;
/**
 * åœ°å€ç°¿
 * @author rk
 * @date 2026/04/15
 */
@Api(tags = "地址簿")
@RestController
@RequestMapping("/business/addr")
public class AddrController extends BaseController {
    @Autowired
    private AddrService addrService;
    @PreventRepeat
    @ApiOperation("新建")
    @PostMapping("/create")
    @RequiresPermissions("business:addr:create")
    public ApiResponse create(@RequestBody Addr addr) {
        return ApiResponse.success(addrService.create(addr));
    }
    @ApiOperation("根据ID删除")
    @GetMapping("/delete/{id}")
    @RequiresPermissions("business:addr:delete")
    public ApiResponse deleteById(@PathVariable Integer id) {
        addrService.deleteById(id);
        return ApiResponse.success(null);
    }
    @ApiOperation("批量删除")
    @GetMapping("/delete/batch")
    @RequiresPermissions("business:addr:delete")
    public ApiResponse deleteByIdInBatch(@RequestParam String ids) {
        String[] idArray = ids.split(",");
        List<Integer> idList = new ArrayList<>();
        for (String id : idArray) {
            idList.add(Integer.valueOf(id));
        }
        addrService.deleteByIdInBatch(idList);
        return ApiResponse.success(null);
    }
    @ApiOperation("根据ID修改")
    @PostMapping("/updateById")
    @RequiresPermissions("business:addr:update")
    public ApiResponse updateById(@RequestBody Addr addr) {
        addrService.updateById(addr);
        return ApiResponse.success(null);
    }
    @ApiOperation("修改状态")
    @PostMapping("/updateStatus")
    @RequiresPermissions("business:addr:update")
    public ApiResponse updateStatus(@RequestBody Addr addr) {
        addrService.updateStatus(addr);
        return ApiResponse.success(null);
    }
    @ApiOperation("分页查询")
    @PostMapping("/page")
    @RequiresPermissions("business:addr:query")
    public ApiResponse<PageData<Addr>> findPage(@RequestBody PageWrap<Addr> pageWrap) {
        return ApiResponse.success(addrService.findPage(pageWrap));
    }
    @ApiOperation("导出Excel")
    @PostMapping("/exportExcel")
    @RequiresPermissions("business:addr:exportExcel")
    public void exportExcel(@RequestBody PageWrap<Addr> pageWrap, HttpServletResponse response) {
        List<Addr> addrList = addrService.findPage(pageWrap).getRecords();
        ExcelExporter.build(Addr.class).export(addrList, "地址簿", response);
    }
    @ApiOperation("根据ID查询")
    @GetMapping("/{id}")
    @RequiresPermissions("business:addr:query")
    public ApiResponse findById(@PathVariable Integer id) {
        return ApiResponse.success(addrService.findById(id));
    }
}
server/admin/src/main/java/com/doumee/api/business/AgreementConfigController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,41 @@
package com.doumee.api.business;
import com.doumee.api.BaseController;
import com.doumee.biz.system.AgreementConfigBiz;
import com.doumee.core.annotation.pr.PreventRepeat;
import com.doumee.core.model.ApiResponse;
import com.doumee.dao.dto.AgreementConfigDTO;
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.*;
/**
 * åè®®é…ç½®ç®¡ç†
 * @author rk
 * @date 2026/04/13
 */
@Api(tags = "协议配置")
@RestController
@RequestMapping("/business/agreementConfig")
public class AgreementConfigController extends BaseController {
    @Autowired
    private AgreementConfigBiz agreementConfigBiz;
    @ApiOperation("查询协议配置")
    @GetMapping
    public ApiResponse<AgreementConfigDTO> getConfig() {
        return ApiResponse.success(agreementConfigBiz.getConfig());
    }
    @PreventRepeat
    @ApiOperation("保存协议配置")
    @PostMapping("/save")
    @RequiresPermissions("business:agreementConfig:update")
    public ApiResponse saveConfig(@RequestBody AgreementConfigDTO dto) {
        agreementConfigBiz.saveConfig(dto);
        return ApiResponse.success(null);
    }
}
server/admin/src/main/java/com/doumee/api/business/OperationConfigController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,40 @@
package com.doumee.api.business;
import com.doumee.api.BaseController;
import com.doumee.biz.system.OperationConfigBiz;
import com.doumee.core.annotation.pr.PreventRepeat;
import com.doumee.core.model.ApiResponse;
import com.doumee.dao.dto.OperationConfigDTO;
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.*;
/**
 * è¿è¥é…ç½®ç®¡ç†
 * @author rk
 * @date 2026/04/13
 */
@Api(tags = "运营配置")
@RestController
@RequestMapping("/business/operationConfig")
public class OperationConfigController extends BaseController {
    @Autowired
    private OperationConfigBiz operationConfigBiz;
    @ApiOperation("查询运营配置")
    @GetMapping
    public ApiResponse<OperationConfigDTO> getConfig() {
        return ApiResponse.success(operationConfigBiz.getConfig());
    }
    @PreventRepeat
    @ApiOperation("保存运营配置")
    @PostMapping("/save")
    public ApiResponse saveConfig(@RequestBody OperationConfigDTO dto) {
        operationConfigBiz.saveConfig(dto);
        return ApiResponse.success(null);
    }
}
server/admin/src/main/java/com/doumee/api/business/OrderLogController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,65 @@
package com.doumee.api.business;
import com.doumee.api.BaseController;
import com.doumee.core.model.ApiResponse;
import com.doumee.core.model.PageData;
import com.doumee.core.model.PageWrap;
import com.doumee.dao.business.model.OrderLog;
import com.doumee.service.business.OrderLogService;
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 java.util.ArrayList;
import java.util.List;
/**
 * è®¢å•操作日志
 * @author rk
 * @date 2026/04/13
 */
@Api(tags = "订单操作日志")
@RestController
@RequestMapping("/business/orderLog")
public class OrderLogController extends BaseController {
    @Autowired
    private OrderLogService orderLogService;
    @ApiOperation("根据ID删除")
    @GetMapping("/delete/{id}")
    @RequiresPermissions("business:orderLog:delete")
    public ApiResponse deleteById(@PathVariable Integer id) {
        orderLogService.deleteById(id);
        return ApiResponse.success(null);
    }
    @ApiOperation("批量删除")
    @GetMapping("/delete/batch")
    @RequiresPermissions("business:orderLog:delete")
    public ApiResponse deleteByIdInBatch(@RequestParam String ids) {
        String[] idArray = ids.split(",");
        List<Integer> idList = new ArrayList<>();
        for (String id : idArray) {
            idList.add(Integer.valueOf(id));
        }
        orderLogService.deleteByIdInBatch(idList);
        return ApiResponse.success(null);
    }
    @ApiOperation("分页查询")
    @PostMapping("/page")
    @RequiresPermissions("business:orderLog:query")
    public ApiResponse<PageData<OrderLog>> findPage(@RequestBody PageWrap<OrderLog> pageWrap) {
        return ApiResponse.success(orderLogService.findPage(pageWrap));
    }
    @ApiOperation("根据ID查询")
    @GetMapping("/{id}")
    @RequiresPermissions("business:orderLog:query")
    public ApiResponse findById(@PathVariable Integer id) {
        return ApiResponse.success(orderLogService.findById(id));
    }
}
server/admin/src/main/java/com/doumee/api/business/OrdersRefundController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,82 @@
package com.doumee.api.business;
import com.doumee.api.BaseController;
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.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 java.util.ArrayList;
import java.util.List;
/**
 * è®¢å•退款记录
 * @author rk
 * @date 2026/04/13
 */
@Api(tags = "订单退款记录")
@RestController
@RequestMapping("/business/ordersRefund")
public class OrdersRefundController extends BaseController {
    @Autowired
    private OrdersRefundService ordersRefundService;
    @PreventRepeat
    @ApiOperation("新建")
    @PostMapping("/create")
    @RequiresPermissions("business:ordersRefund:create")
    public ApiResponse create(@RequestBody OrdersRefund ordersRefund) {
        return ApiResponse.success(ordersRefundService.create(ordersRefund));
    }
    @ApiOperation("根据ID删除")
    @GetMapping("/delete/{id}")
    @RequiresPermissions("business:ordersRefund:delete")
    public ApiResponse deleteById(@PathVariable Integer id) {
        ordersRefundService.deleteById(id);
        return ApiResponse.success(null);
    }
    @ApiOperation("批量删除")
    @GetMapping("/delete/batch")
    @RequiresPermissions("business:ordersRefund:delete")
    public ApiResponse deleteByIdInBatch(@RequestParam String ids) {
        String[] idArray = ids.split(",");
        List<Integer> idList = new ArrayList<>();
        for (String id : idArray) {
            idList.add(Integer.valueOf(id));
        }
        ordersRefundService.deleteByIdInBatch(idList);
        return ApiResponse.success(null);
    }
    @ApiOperation("根据ID修改")
    @PostMapping("/updateById")
    @RequiresPermissions("business:ordersRefund:update")
    public ApiResponse updateById(@RequestBody OrdersRefund ordersRefund) {
        ordersRefundService.updateById(ordersRefund);
        return ApiResponse.success(null);
    }
    @ApiOperation("分页查询")
    @PostMapping("/page")
    @RequiresPermissions("business:ordersRefund:query")
    public ApiResponse<PageData<OrdersRefund>> findPage(@RequestBody PageWrap<OrdersRefund> pageWrap) {
        return ApiResponse.success(ordersRefundService.findPage(pageWrap));
    }
    @ApiOperation("根据ID查询")
    @GetMapping("/{id}")
    @RequiresPermissions("business:ordersRefund:query")
    public ApiResponse findById(@PathVariable Integer id) {
        return ApiResponse.success(ordersRefundService.findById(id));
    }
}
server/services/db/db_change.sql
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,158 @@
-- ============================================================
-- æ•°æ®åº“变更脚本(全部变更统一记录在此文件)
-- æŒ‰æ—¥æœŸå€’序排列,每次变更用日期注释块分隔
-- ============================================================
-- ============================================================
-- 2026/04/13 è®¢å•新增取消备注字段 + è®¢å•文件路径字典
-- ============================================================
ALTER TABLE `orders` ADD COLUMN `cancel_remark` VARCHAR(500) DEFAULT NULL COMMENT '取消备注' AFTER `cancel_time`;
INSERT INTO `system_dict_data`(`DICT_ID`, `CODE`, `LABEL`, `REMARK`, `SORT`, `DISABLED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`)
SELECT 100, '/orders/', 'ORDERS_FILES', '订单文件路径', 22, 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0
FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM `system_dict_data` WHERE `DICT_ID` = 100 AND `LABEL` = 'ORDERS_FILES' AND `DELETED` = 0);
-- ============================================================
-- 2026/04/13 åè®®é…ç½®å­—典数据(隐私协议、用户协议新增,关于我们已存在)
-- ============================================================
-- çˆ¶çº§å­—å…¸ID 100 (SYSTEM) å·²å­˜åœ¨ï¼Œæ— éœ€æ–°å»º
INSERT INTO `system_dict_data`(`DICT_ID`, `CODE`, `LABEL`, `REMARK`, `SORT`, `DISABLED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`)
SELECT 100, '', 'PRIVACY_AGREEMENT', '隐私协议', 20, 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0
FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM `system_dict_data` WHERE `DICT_ID` = 100 AND `LABEL` = 'PRIVACY_AGREEMENT' AND `DELETED` = 0);
INSERT INTO `system_dict_data`(`DICT_ID`, `CODE`, `LABEL`, `REMARK`, `SORT`, `DISABLED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`)
SELECT 100, '', 'USER_AGREEMENT', '用户协议', 21, 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0
FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM `system_dict_data` WHERE `DICT_ID` = 100 AND `LABEL` = 'USER_AGREEMENT' AND `DELETED` = 0);
-- åè®®é…ç½®æƒé™
INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `MODULE`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:agreementConfig:update', '修改协议配置', '协议配置', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
-- ============================================================
-- 2026/04/13 è¿è¥é…ç½®å­—典数据
-- ============================================================
-- çˆ¶çº§å­—典:运营配置(如果ID 105已存在则跳过)
INSERT INTO `system_dict`(`ID`, `CODE`, `NAME`, `REMARK`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`)
SELECT 105, 'OPERATION_CONFIG', '运营配置', '运营参数配置项', 1, CURRENT_TIMESTAMP, NULL, NULL, 0
FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM `system_dict` WHERE `ID` = 105);
-- å­—典子项
INSERT INTO `system_dict_data`(`DICT_ID`, `CODE`, `LABEL`, `REMARK`, `SORT`, `DISABLED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`)
VALUES (105, '3', 'DRIVER_DAILY_CANCEL_LIMIT', '司机每日取消次数', 0, 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
INSERT INTO `system_dict_data`(`DICT_ID`, `CODE`, `LABEL`, `REMARK`, `SORT`, `DISABLED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`)
VALUES (105, '0.8', 'UNPICKED_DISCOUNT', '未取件折扣', 1, 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
INSERT INTO `system_dict_data`(`DICT_ID`, `CODE`, `LABEL`, `REMARK`, `SORT`, `DISABLED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`)
VALUES (105, '7', 'SETTLEMENT_DATE', '订单结算日期(天)', 2, 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
INSERT INTO `system_dict_data`(`DICT_ID`, `CODE`, `LABEL`, `REMARK`, `SORT`, `DISABLED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`)
VALUES (105, '1.5', 'URGENT_COEFFICIENT', '加急系数', 3, 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
INSERT INTO `system_dict_data`(`DICT_ID`, `CODE`, `LABEL`, `REMARK`, `SORT`, `DISABLED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`)
VALUES (105, '30', 'AUTO_CANCEL_TIME', '超时未支付自动取消时间(分钟)', 4, 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
INSERT INTO `system_dict_data`(`DICT_ID`, `CODE`, `LABEL`, `REMARK`, `SORT`, `DISABLED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`)
VALUES (105, '0.01', 'INSURANCE_RATE', '保费比率', 5, 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
INSERT INTO `system_dict_data`(`DICT_ID`, `CODE`, `LABEL`, `REMARK`, `SORT`, `DISABLED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`)
VALUES (105, '5', 'ORDER_ACCEPT_LIMIT', '接单数量', 6, 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
INSERT INTO `system_dict_data`(`DICT_ID`, `CODE`, `LABEL`, `REMARK`, `SORT`, `DISABLED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`)
VALUES (105, '7', 'AUTO_CONFIRM_RECEIPT', '自动确认收货(天)', 7, 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
-- è¿è¥é…ç½®æƒé™
INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `MODULE`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:operationConfig:query', '查询运营配置', '运营配置', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `MODULE`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:operationConfig:update', '修改运营配置', '运营配置', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
-- ============================================================
-- 2026/04/13 æ”¯ä»˜å®æçŽ°è´¦æˆ·å­—æ®µ
-- ============================================================
ALTER TABLE `withdrawal_orders` ADD COLUMN `ali_account` VARCHAR(64) DEFAULT NULL COMMENT '支付宝提现账户' AFTER `out_bill_no`;
ALTER TABLE `shop_info` ADD COLUMN `ali_account` VARCHAR(64) DEFAULT NULL COMMENT '支付宝提现账户' AFTER `delivery_area`;
-- ============================================================
-- 2026/04/13 è½®æ’­å›¾ä¸šåŠ¡è°ƒæ•´
-- ============================================================
ALTER TABLE `banner` MODIFY COLUMN `title` VARCHAR(255) DEFAULT NULL COMMENT '标题';
INSERT INTO `SYSTEM_DICT_DATA`(`TYPE`, `CODE`, `NAME`, `VALUE`, `REMARK`, `CREATE_TIME`, `DELETED`)
VALUES ('SYSTEM', 'BANNER_FILES', '轮播图文件路径', '/banner/', '轮播图图片存储子路径', CURRENT_TIMESTAMP, 0);
-- ============================================================
-- 2026/04/10 æçŽ°ç”³è¯·åˆå§‹æƒé™
-- ============================================================
-- æçŽ°ç”³è¯·ç›¸å…³æƒé™æš‚æœªå½•å…¥ï¼ŒåŽç»­è¡¥å……
-- ============================================================
-- 2026/04/08 å„模块初始权限
-- ============================================================
-- è½®æ’­å›¾
INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `MODULE`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:banner:create', '新建轮播图', '轮播图', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `MODULE`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:banner:delete', '删除轮播图', '轮播图', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `MODULE`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:banner:update', '修改轮播图', '轮播图', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `MODULE`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:banner:query', '查询轮播图', '轮播图', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `MODULE`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:banner:exportExcel', '导出轮播图(Excel)', '轮播图', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
-- åˆ†ç±»ä¿¡æ¯è¡¨
INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `MODULE`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:category:create', '新建分类信息表', '分类信息表', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `MODULE`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:category:delete', '删除分类信息表', '分类信息表', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `MODULE`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:category:update', '修改分类信息表', '分类信息表', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `MODULE`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:category:query', '查询分类信息表', '分类信息表', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `MODULE`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:category:exportExcel', '导出分类信息表(Excel)', '分类信息表', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
-- ç»„织信息表
INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `MODULE`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:company:create', '新建组织信息表', '组织信息表', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `MODULE`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:company:delete', '删除组织信息表', '组织信息表', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `MODULE`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:company:update', '修改组织信息表', '组织信息表', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `MODULE`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:company:query', '查询组织信息表', '组织信息表', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `MODULE`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:company:exportExcel', '导出组织信息表(Excel)', '组织信息表', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
-- è´£ä»»äººä¿¡æ¯è¡¨
INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `MODULE`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:managers:create', '新建责任人信息表', '责任人信息表', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `MODULE`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:managers:delete', '删除责任人信息表', '责任人信息表', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `MODULE`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:managers:update', '修改责任人信息表', '责任人信息表', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `MODULE`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:managers:query', '查询责任人信息表', '责任人信息表', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `MODULE`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:managers:exportExcel', '导出责任人信息表(Excel)', '责任人信息表', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
-- äººå‘˜ä¿¡æ¯è¡¨
INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `MODULE`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:member:create', '新建人员信息表', '人员信息表', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `MODULE`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:member:delete', '删除人员信息表', '人员信息表', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `MODULE`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:member:update', '修改人员信息表', '人员信息表', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `MODULE`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:member:query', '查询人员信息表', '人员信息表', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `MODULE`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:member:exportExcel', '导出人员信息表(Excel)', '人员信息表', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
-- é™„件上传信息表
INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `MODULE`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:multifile:create', '新建附件上传信息表', '附件上传信息表', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `MODULE`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:multifile:delete', '删除附件上传信息表', '附件上传信息表', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `MODULE`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:multifile:update', '修改附件上传信息表', '附件上传信息表', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `MODULE`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:multifile:query', '查询附件上传信息表', '附件上传信息表', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `MODULE`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:multifile:exportExcel', '导出附件上传信息表(Excel)', '附件上传信息表', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
-- ç³»ç»Ÿæ¶ˆæ¯ä¿¡æ¯è¡¨
INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `MODULE`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:notices:create', '新建系统消息信息表', '系统消息信息表', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `MODULE`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:notices:delete', '删除系统消息信息表', '系统消息信息表', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `MODULE`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:notices:update', '修改系统消息信息表', '系统消息信息表', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `MODULE`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:notices:query', '查询系统消息信息表', '系统消息信息表', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `MODULE`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:notices:exportExcel', '导出系统消息信息表(Excel)', '系统消息信息表', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
-- å·¥å•信息表
INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `MODULE`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:workorder:create', '新建工单信息表', '工单信息表', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `MODULE`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:workorder:delete', '删除工单信息表', '工单信息表', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `MODULE`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:workorder:update', '修改工单信息表', '工单信息表', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `MODULE`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:workorder:query', '查询工单信息表', '工单信息表', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `MODULE`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:workorder:exportExcel', '导出工单信息表(Excel)', '工单信息表', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
-- å·¥å•操作历史表
INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `MODULE`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:workorderlog:create', '新建工单操作历史表', '工单操作历史表', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `MODULE`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:workorderlog:delete', '删除工单操作历史表', '工单操作历史表', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `MODULE`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:workorderlog:update', '修改工单操作历史表', '工单操作历史表', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `MODULE`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:workorderlog:query', '查询工单操作历史表', '工单操作历史表', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `MODULE`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:workorderlog:exportExcel', '导出工单操作历史表(Excel)', '工单操作历史表', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
server/services/src/main/java/com/doumee/biz/system/AgreementConfigBiz.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,21 @@
package com.doumee.biz.system;
import com.doumee.dao.dto.AgreementConfigDTO;
/**
 * åè®®é…ç½®ä¸šåŠ¡å¤„ç†
 * @author rk
 * @date 2026/04/13
 */
public interface AgreementConfigBiz {
    /**
     * æŸ¥è¯¢åè®®é…ç½®
     */
    AgreementConfigDTO getConfig();
    /**
     * ä¿å­˜åè®®é…ç½®
     */
    void saveConfig(AgreementConfigDTO dto);
}
server/services/src/main/java/com/doumee/biz/system/OperationConfigBiz.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,21 @@
package com.doumee.biz.system;
import com.doumee.dao.dto.OperationConfigDTO;
/**
 * è¿è¥é…ç½®ä¸šåŠ¡å¤„ç†
 * @author rk
 * @date 2026/04/13
 */
public interface OperationConfigBiz {
    /**
     * æŸ¥è¯¢è¿è¥é…ç½®
     */
    OperationConfigDTO getConfig();
    /**
     * æ‰¹é‡ä¿å­˜è¿è¥é…ç½®ï¼ˆæ–°å¢žæˆ–更新)
     */
    void saveConfig(OperationConfigDTO dto);
}
server/services/src/main/java/com/doumee/biz/system/impl/AgreementConfigBizImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,74 @@
package com.doumee.biz.system.impl;
import com.doumee.biz.system.AgreementConfigBiz;
import com.doumee.biz.system.SystemDictDataBiz;
import com.doumee.core.constants.Constants;
import com.doumee.core.constants.ResponseStatus;
import com.doumee.core.exception.BusinessException;
import com.doumee.dao.dto.AgreementConfigDTO;
import com.doumee.dao.system.model.SystemDictData;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
/**
 * åè®®é…ç½®ä¸šåŠ¡å®žçŽ°
 * @author rk
 * @date 2026/04/13
 */
@Service
public class AgreementConfigBizImpl implements AgreementConfigBiz {
    @Autowired
    private SystemDictDataBiz systemDictDataBiz;
    @Override
    public AgreementConfigDTO getConfig() {
        AgreementConfigDTO dto = new AgreementConfigDTO();
        dto.setPrivacyAgreement(getValue(Constants.PRIVACY_AGREEMENT));
        dto.setUserAgreement(getValue(Constants.USER_AGREEMENT));
        dto.setAboutUs(getValue(Constants.ABOUT_US));
        return dto;
    }
    @Override
    @Transactional(rollbackFor = {Exception.class, BusinessException.class})
    public void saveConfig(AgreementConfigDTO dto) {
        validate(dto);
        saveOrUpdate(Constants.PRIVACY_AGREEMENT, "隐私协议", dto.getPrivacyAgreement());
        saveOrUpdate(Constants.USER_AGREEMENT, "用户协议", dto.getUserAgreement());
        saveOrUpdate(Constants.ABOUT_US, "关于我们", dto.getAboutUs());
    }
    private String getValue(String label) {
        SystemDictData data = systemDictDataBiz.queryByCode(Constants.SYSTEM, label);
        return data != null ? data.getCode() : null;
    }
    private void saveOrUpdate(String label, String remark, String value) {
        SystemDictData existing = systemDictDataBiz.queryByCode(Constants.SYSTEM, label);
        if (existing != null && existing.getId() != null) {
            existing.setCode(value);
            systemDictDataBiz.updateById(existing);
        } else {
            SystemDictData newData = new SystemDictData();
            newData.setDictId(100);
            newData.setLabel(label);
            newData.setRemark(remark);
            newData.setCode(value);
            newData.setDisabled(false);
            newData.setDeleted(false);
            systemDictDataBiz.create(newData);
        }
    }
    private void validate(AgreementConfigDTO dto) {
        if (dto == null
                || StringUtils.isBlank(dto.getPrivacyAgreement())
                || StringUtils.isBlank(dto.getUserAgreement())
                || StringUtils.isBlank(dto.getAboutUs())) {
            throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "所有配置项均为必填");
        }
    }
}
server/services/src/main/java/com/doumee/biz/system/impl/OperationConfigBizImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,89 @@
package com.doumee.biz.system.impl;
import com.doumee.biz.system.OperationConfigBiz;
import com.doumee.biz.system.SystemDictDataBiz;
import com.doumee.core.constants.Constants;
import com.doumee.core.constants.ResponseStatus;
import com.doumee.core.exception.BusinessException;
import com.doumee.dao.dto.OperationConfigDTO;
import com.doumee.dao.system.model.SystemDictData;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
/**
 * è¿è¥é…ç½®ä¸šåŠ¡å®žçŽ°
 * @author rk
 * @date 2026/04/13
 */
@Service
public class OperationConfigBizImpl implements OperationConfigBiz {
    @Autowired
    private SystemDictDataBiz systemDictDataBiz;
    @Override
    public OperationConfigDTO getConfig() {
        OperationConfigDTO dto = new OperationConfigDTO();
        dto.setDriverDailyCancelLimit(getValue(Constants.OP_DRIVER_DAILY_CANCEL_LIMIT));
        dto.setUnpickedDiscount(getValue(Constants.OP_UNPICKED_DISCOUNT));
        dto.setSettlementDate(getValue(Constants.OP_SETTLEMENT_DATE));
        dto.setUrgentCoefficient(getValue(Constants.OP_URGENT_COEFFICIENT));
        dto.setAutoCancelTime(getValue(Constants.OP_AUTO_CANCEL_TIME));
        dto.setInsuranceRate(getValue(Constants.OP_INSURANCE_RATE));
        dto.setOrderAcceptLimit(getValue(Constants.OP_ORDER_ACCEPT_LIMIT));
        dto.setAutoConfirmReceipt(getValue(Constants.OP_AUTO_CONFIRM_RECEIPT));
        return dto;
    }
    @Override
    @Transactional(rollbackFor = {Exception.class, BusinessException.class})
    public void saveConfig(OperationConfigDTO dto) {
        validate(dto);
        saveOrUpdate(Constants.OP_DRIVER_DAILY_CANCEL_LIMIT, "司机每日取消次数", dto.getDriverDailyCancelLimit());
        saveOrUpdate(Constants.OP_UNPICKED_DISCOUNT, "未取件折扣", dto.getUnpickedDiscount());
        saveOrUpdate(Constants.OP_SETTLEMENT_DATE, "订单结算日期", dto.getSettlementDate());
        saveOrUpdate(Constants.OP_URGENT_COEFFICIENT, "加急系数", dto.getUrgentCoefficient());
        saveOrUpdate(Constants.OP_AUTO_CANCEL_TIME, "超时未支付自动取消时间", dto.getAutoCancelTime());
        saveOrUpdate(Constants.OP_INSURANCE_RATE, "保费比率", dto.getInsuranceRate());
        saveOrUpdate(Constants.OP_ORDER_ACCEPT_LIMIT, "接单数量", dto.getOrderAcceptLimit());
        saveOrUpdate(Constants.OP_AUTO_CONFIRM_RECEIPT, "自动确认收货", dto.getAutoConfirmReceipt());
    }
    private String getValue(String label) {
        SystemDictData data = systemDictDataBiz.queryByCode(Constants.OPERATION_CONFIG, label);
        return data != null ? data.getCode() : null;
    }
    private void saveOrUpdate(String label, String name, String value) {
        SystemDictData existing = systemDictDataBiz.queryByCode(Constants.OPERATION_CONFIG, label);
        if (existing != null && existing.getId() != null) {
            existing.setCode(value);
            systemDictDataBiz.updateById(existing);
        } else {
            SystemDictData newData = new SystemDictData();
            newData.setDictId(105);
            newData.setLabel(label);
            newData.setRemark(name);
            newData.setCode(value);
            newData.setDisabled(false);
            newData.setDeleted(false);
            systemDictDataBiz.create(newData);
        }
    }
    private void validate(OperationConfigDTO dto) {
        if (dto == null
                || StringUtils.isBlank(dto.getDriverDailyCancelLimit())
                || StringUtils.isBlank(dto.getUnpickedDiscount())
                || StringUtils.isBlank(dto.getSettlementDate())
                || StringUtils.isBlank(dto.getUrgentCoefficient())
                || StringUtils.isBlank(dto.getAutoCancelTime())
                || StringUtils.isBlank(dto.getInsuranceRate())
                || StringUtils.isBlank(dto.getOrderAcceptLimit())
                || StringUtils.isBlank(dto.getAutoConfirmReceipt())) {
            throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "所有配置项均为必填");
        }
    }
}
server/services/src/main/java/com/doumee/config/wx/TransferDetailEntityNew.java
ÎļþÒÑɾ³ý
server/services/src/main/java/com/doumee/config/wx/WXPayUtility.java
ÎļþÒÑɾ³ý
server/services/src/main/java/com/doumee/config/wx/WxMiniUtilService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,62 @@
package com.doumee.core.wx;
import cn.binarywang.wx.miniapp.api.WxMaQrcodeService;
import com.doumee.core.constants.ResponseStatus;
import com.doumee.core.exception.BusinessException;
import com.doumee.core.utils.ID;
import com.github.binarywang.wxpay.bean.request.BaseWxPayRequest;
import com.github.binarywang.wxpay.bean.request.WxPayRefundRequest;
import com.github.binarywang.wxpay.bean.result.WxPayRefundResult;
import com.github.binarywang.wxpay.exception.WxPayException;
import lombok.extern.slf4j.Slf4j;
import me.chanjar.weixin.common.error.WxErrorException;
import org.apache.commons.io.IOUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.multipart.MultipartFile;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.math.BigDecimal;
import java.util.Map;
/**
 * å¾®ä¿¡å°ç¨‹åº-公共方法
 */
@Service
@Slf4j
public class WxMiniUtilService {
    /**
     * è®¢å•微信退款
     * orderNo:商户订单号
     * totalPrice:订单总金额
     * refundPrice;退款金额
     */
    @Transactional(rollbackFor = Exception.class)
    public static String wxRefund(String orderNo, BigDecimal totalPrice, BigDecimal refundPrice) {
        try {
            // å‘送退款请求
            String refNum = ID.nextGUID();
            WxPayRefundRequest request = new WxPayRefundRequest();
            request.setOutTradeNo(orderNo);
            request.setOutRefundNo(refNum);
           // request.setTotalFee(2);
          //  request.setRefundFee(1);
            request.setTotalFee(1);//BaseWxPayRequest.yuanToFen(totalPrice.toString()));
            request.setRefundFee(1);//BaseWxPayRequest.yuanToFen(refundPrice.toString()));
            WxPayRefundResult response = WxMiniConfig.wxPayService.refund(request);
            if ("SUCCESS".equals(response.getReturnCode()) && "SUCCESS".equals(response.getResultCode())) {
                return refNum;
            } else {
                throw  new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),response.getErrCode() + response.getErrCodeDes());
            }
        } catch (WxPayException e) {
            e.printStackTrace();
        }
        throw  new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"退款发生异常请联系管理员");
    }
}
server/services/src/main/java/com/doumee/core/annotation/LoginShopRequired.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,10 @@
package com.doumee.config.annotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target({ElementType.METHOD,ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface LoginShopRequired {}
server/services/src/main/java/com/doumee/core/utils/ID.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,89 @@
package com.doumee.core.utils;
import org.apache.logging.log4j.util.Strings;
import java.util.UUID;
/**
 * A utility to generate id using various strategies.
 *
 * @author Guang YANG
 * @version 1.0
 */
public class ID {
  private static final SnowflakeIdGenerator snowflake = new SnowflakeIdGenerator(0);
  /**
   * Generate a random guid string of 32 byte.
   */
  public static String nextGUID() {
    return UUID.randomUUID().toString().replace("-", Strings.EMPTY).toUpperCase();
  }
  /**
   * Generate a random uuid string of 36 byte.
   */
  public static String nextUUID() {
    return UUID.randomUUID().toString();
  }
  /**
   * Generate a long number of 20 bit which is monotonically increasing by each call.
   */
  public static long nextSnowflakeId() {
    return snowflake.nextId();
  }
  public static class SnowflakeIdGenerator {
    private final long workerIdBits = 10L;
    private final long maxWorkerId = -1L ^ (-1L << workerIdBits);
    private final long sequenceBits = 12L;
    private final long workerIdShift = sequenceBits;
    private final long timestampLeftShift = sequenceBits + workerIdBits;
    private final long sequenceMask = -1L ^ (-1L << sequenceBits);
    private long workerId;
    private long sequence = 0L;
    private long lastTimestamp = -1L;
    public SnowflakeIdGenerator(long workerId) {
      if (workerId > maxWorkerId || workerId < 0) {
        throw new IllegalArgumentException(String.format("worker Id can't be greater than %d or less than 0", maxWorkerId));
      }
      this.workerId = workerId;
    }
    public synchronized long nextId() {
      long timestamp = System.currentTimeMillis();
      if (timestamp < lastTimestamp) {
        throw new RuntimeException(String.format("Clock moved backwards.  Refusing to generate id for %d milliseconds", lastTimestamp - timestamp));
      }
      if (lastTimestamp == timestamp) {
        sequence = (sequence + 1) & sequenceMask;
        if (sequence == 0) {
          timestamp = tilNextMillis(lastTimestamp);
        }
      } else {
        sequence = 0L;
      }
      lastTimestamp = timestamp;
      return (timestamp << timestampLeftShift) | (workerId << workerIdShift) | sequence;
    }
    protected long tilNextMillis(long lastTimestamp) {
      long timestamp = System.currentTimeMillis();
      while (timestamp <= lastTimestamp) {
        timestamp = System.currentTimeMillis();
      }
      return timestamp;
    }
  }
}
server/services/src/main/java/com/doumee/core/utils/RandomString.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,60 @@
package com.doumee.core.utils;
import java.security.SecureRandom;
import java.util.Locale;
import java.util.Objects;
import java.util.Random;
public class RandomString {
  protected static final String upper = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
  protected static final String lower = upper.toLowerCase(Locale.ROOT);
  protected static final String digits = "0123456789";
  protected static final String alphaNumeric = upper + lower + digits;
  private final Random random;
  private final char[] symbols;
  private final char[] buf;
  public RandomString(int length, Random random, String symbols) {
    if (length < 1) {
      throw new IllegalArgumentException();
    }
    if (symbols.length() < 2) {
      throw new IllegalArgumentException();
    }
    this.random = Objects.requireNonNull(random);
    this.symbols = symbols.toCharArray();
    this.buf = new char[length];
  }
  /**
   * Create an alphanumeric string generator.
   */
  public RandomString(int length, Random random) {
    this(length, random, alphaNumeric);
  }
  /**
   * Create an alphanumeric strings from a secure generator.
   */
  public RandomString(int length) {
    this(length, new SecureRandom());
  }
  /**
   * Create session identifiers.
   */
  public RandomString() {
    this(21);
  }
  /**
   * Generate a random string.
   */
  public String nextString() {
    for (int idx = 0; idx < buf.length; ++idx) {
      buf[idx] = symbols[random.nextInt(symbols.length)];
    }
    return new String(buf);
  }
}
server/services/src/main/java/com/doumee/core/utils/Strings.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,55 @@
package com.doumee.core.utils;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.security.SecureRandom;
import java.util.Random;
/**
 * A null-safe utility to handle the String instances.
 *
 * @author Guang YANG
 * @version 1.1
 */
public final class Strings {
    public static final String EMPTY = "";
    public static final String INSTANTIATION_PROHIBITED = "Instantiation prohibited.";
    private static final Logger LOGGER = LoggerFactory.getLogger(Strings.class);
    private Strings() {
        throw new AssertionError(INSTANTIATION_PROHIBITED);
    }
    /**
     * Generate random string with alpha and numeric of given length.
     */
    public static String randomAlphanumeric(int length) {
        return new RandomString(length).nextString();
    }
    public static String randomNumeric(int length) {
        return new RandomString(length, new SecureRandom(), "0123456789").nextString();
    }
    public static String getRandomNumberString(Integer strLength) {
        Random rnd = new Random();
        String str = "9999";
        if(strLength >= str.length()){
            str = StringUtils.leftPad(str,strLength,"9");
        }
        int number = rnd.nextInt(Integer.parseInt(str));
        return String.format("%06d", number);
    }
}
server/services/src/main/java/com/doumee/core/utils/Tencent/MapUtil.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,6 @@
package com.doumee.core.utils.Tencent;/**
* Created by IntelliJ IDEA.
* @Author : Rk
* @create 2026/4/14 15:58
*/public class MapUtil {
}
server/services/src/main/java/com/doumee/core/utils/aliyun/ALiYunSmSUtil.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,61 @@
package com.doumee.core.utils.aliyun;
import com.alibaba.fastjson.JSONObject;
import com.aliyuncs.CommonRequest;
import com.aliyuncs.CommonResponse;
import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.IAcsClient;
import com.aliyuncs.http.MethodType;
import com.aliyuncs.profile.DefaultProfile;
import com.doumee.core.constants.ResponseStatus;
import com.doumee.core.exception.BusinessException;
import com.doumee.core.utils.Constants;
import java.security.SecureRandom;
import java.util.Map;
/**
 * é˜¿é‡Œäº‘ SMS çŸ­ä¿¡å·¥å…·ç±»
 * @author RenKang
 */
public class ALiYunSmSUtil {
    public static CommonResponse sendMessage(String phone, Map<String, Object> codeMap) {
        /**
         * è¿žæŽ¥é˜¿é‡Œäº‘:
         *
         * ä¸‰ä¸ªå‚数:
         * regionId ä¸è¦åŠ¨ï¼Œé»˜è®¤ä½¿ç”¨å®˜æ–¹çš„
         * accessKeyId è‡ªå·±çš„用户accessKeyId
         * accessSecret è‡ªå·±çš„用户accessSecret
         */
        DefaultProfile profile = DefaultProfile.getProfile(
                "cn-hangzhou", "LTAI5tDuA9DXBJvVfJfMb19L", "IUsWIhUXd9pEgTNEkz1b3POI3javKN");
        IAcsClient client = new DefaultAcsClient(profile);
        // æž„建请求:
        CommonRequest request = new CommonRequest();
        request.setSysMethod(MethodType.POST);
        request.setSysDomain("dysmsapi.aliyuncs.com");
        request.setSysVersion("2017-05-25");
        request.setSysAction("SendSms");
        // è‡ªå®šä¹‰å‚数:
        // æ‰‹æœºå·
        request.putQueryParameter("PhoneNumbers", phone);
        // çŸ­ä¿¡ç­¾å
        request.putQueryParameter("SignName", "合肥鼎元旋压科技");
        // çŸ­ä¿¡æ¨¡ç‰ˆCODE
        request.putQueryParameter("TemplateCode", "SMS_332555204");
        // æž„建短信验证码
        request.putQueryParameter("TemplateParam", JSONObject.toJSONString(codeMap));
        try {
            CommonResponse response = client.getCommonResponse(request);
            return response;
        }catch (Exception e) {
            e.printStackTrace();
        }
        throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"发送失败,请联系管理员");
    }
}
server/services/src/main/java/com/doumee/dao/business/AddrMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,13 @@
package com.doumee.dao.business;
import com.doumee.dao.business.model.Addr;
import com.github.yulichang.base.MPJBaseMapper;
/**
 * åœ°å€ç°¿Mapper
 * @author rk
 * @date 2026/04/15
 */
public interface AddrMapper extends MPJBaseMapper<Addr> {
}
server/services/src/main/java/com/doumee/dao/business/OrderLogMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,12 @@
package com.doumee.dao.business;
import com.doumee.dao.business.model.OrderLog;
import com.github.yulichang.base.MPJBaseMapper;
/**
 * è®¢å•操作日志Mapper
 * @author rk
 * @date 2026/04/13
 */
public interface OrderLogMapper extends MPJBaseMapper<OrderLog> {
}
server/services/src/main/java/com/doumee/dao/business/OrdersRefundMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,12 @@
package com.doumee.dao.business;
import com.doumee.dao.business.model.OrdersRefund;
import com.github.yulichang.base.MPJBaseMapper;
/**
 * è®¢å•退款记录Mapper
 * @author rk
 * @date 2026/04/13
 */
public interface OrdersRefundMapper extends MPJBaseMapper<OrdersRefund> {
}
server/services/src/main/java/com/doumee/dao/business/model/Addr.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,106 @@
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;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.math.BigDecimal;
import java.util.Date;
/**
 * åœ°å€ç°¿
 * @author rk
 * @date 2026/04/15
 */
@Data
@ApiModel("地址簿")
@TableName("`addr`")
public class Addr {
    @TableId(type = IdType.AUTO)
    @ApiModelProperty(value = "主键", example = "1")
    private Integer id;
    @ApiModelProperty(value = "是否已删除 0未删除 1已删除", example = "0")
    private Integer deleted;
    @ApiModelProperty(value = "创建人编码", example = "1")
    private Integer createUser;
    @ApiModelProperty(value = "创建时间")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private Date createTime;
    @ApiModelProperty(value = "更新人编码", example = "1")
    private Integer updateUser;
    @ApiModelProperty(value = "更新时间")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private Date updateTime;
    @ApiModelProperty(value = "备注")
    private String remark;
    @ApiModelProperty(value = "用户编码(关联member表)", example = "1")
    private Integer memberId;
    @ApiModelProperty(value = "是否默认 0否 1是", example = "0")
    private Integer isDefault;
    @ApiModelProperty(value = "姓名")
    private String name;
    @ApiModelProperty(value = "手机号")
    private String phone;
    @ApiModelProperty(value = "详细地址")
    private String addr;
    @ApiModelProperty(value = "所属区域编码", example = "1")
    private Integer areaId;
    @ApiModelProperty(value = "经度")
    private BigDecimal longitude;
    @ApiModelProperty(value = "纬度")
    private BigDecimal latitude;
    // ---- çœå¸‚区信息(虚拟字段,MPJ查询填充) ----
    @TableField(exist = false)
    @ApiModelProperty(value = "省编码")
    private Integer provinceId;
    @TableField(exist = false)
    @ApiModelProperty(value = "省名称")
    private String provinceName;
    @TableField(exist = false)
    @ApiModelProperty(value = "省行政代码")
    private String provinceCode;
    @TableField(exist = false)
    @ApiModelProperty(value = "市编码")
    private Integer cityId;
    @TableField(exist = false)
    @ApiModelProperty(value = "市名称")
    private String cityName;
    @TableField(exist = false)
    @ApiModelProperty(value = "市行政代码")
    private String cityCode;
    @TableField(exist = false)
    @ApiModelProperty(value = "区名称")
    private String districtName;
    @TableField(exist = false)
    @ApiModelProperty(value = "区行政代码")
    private String districtCode;
}
server/services/src/main/java/com/doumee/dao/business/model/OrderLog.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,78 @@
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;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.Date;
/**
 * è®¢å•操作日志
 * @author rk
 * @date 2026/04/13
 */
@Data
@ApiModel("订单操作日志")
@TableName("`order_log`")
public class OrderLog {
    @TableId(type = IdType.AUTO)
    @ApiModelProperty(value = "主键", example = "1")
    private Integer id;
    @ApiModelProperty(value = "是否已删除 0未删除 1已删除", example = "0")
    private Integer deleted;
    @ApiModelProperty(value = "创建人编码", example = "1")
    private Integer createUser;
    @ApiModelProperty(value = "创建时间")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private Date createTime;
    @ApiModelProperty(value = "更新人编码", example = "1")
    private Integer updateUser;
    @ApiModelProperty(value = "更新时间")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private Date updateTime;
    @ApiModelProperty(value = "备注")
    private String remark;
    @ApiModelProperty(value = "订单主键(orders)", example = "1")
    private Integer orderId;
    @ApiModelProperty(value = "标题")
    private String title;
    @ApiModelProperty(value = "日志内容")
    private String logInfo;
    @ApiModelProperty(value = "操作类型")
    private Integer objType;
    @ApiModelProperty(value = "操作人")
    private Integer optUserId;
    @ApiModelProperty(value = "操作人名称")
    private String optUserName;
    @ApiModelProperty(value = "操作前数据")
    private String beforeInfo;
    @ApiModelProperty(value = "操作后数据")
    private String afterInfo;
    @ApiModelProperty(value = "订单状态:0=待接单;1=已接单;2=进行中;3=已完成;99=已取消;", example = "0")
    private Integer orderStatus;
    @ApiModelProperty(value = "操作人类型:0=用户;1=司机;2=门店;3=系统管理员", example = "0")
    private Integer optUserType;
}
server/services/src/main/java/com/doumee/dao/business/model/OrdersRefund.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,70 @@
package com.doumee.dao.business.model;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.Date;
/**
 * è®¢å•退款记录
 * @author rk
 * @date 2026/04/13
 */
@Data
@ApiModel("订单退款记录")
@TableName("`orders_refund`")
public class OrdersRefund {
    @TableId(type = IdType.AUTO)
    @ApiModelProperty(value = "主键", example = "1")
    private Integer id;
    @ApiModelProperty(value = "是否已删除 0未删除 1已删除", example = "0")
    private Integer deleted;
    @ApiModelProperty(value = "创建人编码", example = "1")
    private Integer createUser;
    @ApiModelProperty(value = "创建时间")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private Date createTime;
    @ApiModelProperty(value = "更新人编码", example = "1")
    private Integer updateUser;
    @ApiModelProperty(value = "更新时间")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private Date updateTime;
    @ApiModelProperty(value = "备注")
    private String remark;
    @ApiModelProperty(value = "订单主键", example = "1")
    private Integer orderId;
    @ApiModelProperty(value = "退款方式:0=未存件直接取消;1=平台直接取消;2=已存件申请取消", example = "0")
    private Integer type;
    @ApiModelProperty(value = "取消原因")
    private String cancelInfo;
    @ApiModelProperty(value = "订单退款单号(已支付订单使用)")
    private String refundCode;
    @ApiModelProperty(value = "退款时间")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private Date refundTime;
    @ApiModelProperty(value = "门店备注")
    private String refundRemark;
    @ApiModelProperty(value = "平台操作人(type=1使用)", example = "0")
    private Integer userId;
}
server/services/src/main/java/com/doumee/dao/dto/AgreementConfigDTO.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,25 @@
package com.doumee.dao.dto;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
 * åè®®é…ç½®DTO
 * @author rk
 * @date 2026/04/13
 */
@Data
@ApiModel("协议配置")
public class AgreementConfigDTO {
    @ApiModelProperty(value = "隐私协议")
    private String privacyAgreement;
    @ApiModelProperty(value = "用户协议")
    private String userAgreement;
    @ApiModelProperty(value = "关于我们")
    private String aboutUs;
}
server/services/src/main/java/com/doumee/dao/dto/CalculateLocalPriceDTO.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,41 @@
package com.doumee.dao.dto;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.Valid;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
import java.math.BigDecimal;
import java.util.List;
/**
 * å°±åœ°å­˜å–预估费用请求DTO
 *
 * @Author : Rk
 * @create 2026/4/14
 */
@Data
@ApiModel("就地存取预估费用请求")
public class CalculateLocalPriceDTO {
    @ApiModelProperty(value = "城市主键", required = true)
    @NotNull(message = "城市不能为空")
    private Integer cityId;
    @ApiModelProperty(value = "预计存放天数", required = true)
    @NotNull(message = "预计存放天数不能为空")
    private Integer estimatedDepositDays;
    @ApiModelProperty(value = "物品列表", required = true)
    @NotEmpty(message = "物品列表不能为空")
    @Valid
    private List<OrderItemDTO> items;
    @ApiModelProperty(value = "是否保价")
    private Boolean insured;
    @ApiModelProperty(value = "保价金额(元)")
    private BigDecimal declaredAmount;
}
server/services/src/main/java/com/doumee/dao/dto/CalculateRemotePriceDTO.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,56 @@
package com.doumee.dao.dto;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.Valid;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
import java.math.BigDecimal;
import java.util.List;
/**
 * å¼‚地存取预估费用请求DTO
 *
 * @Author : Rk
 * @create 2026/4/14
 */
@Data
@ApiModel("异地存取预估费用请求")
public class CalculateRemotePriceDTO {
    @ApiModelProperty(value = "城市主键", required = true)
    @NotNull(message = "城市不能为空")
    private Integer cityId;
    @ApiModelProperty(value = "寄件纬度", required = true)
    @NotNull(message = "寄件纬度不能为空")
    private BigDecimal fromLat;
    @ApiModelProperty(value = "寄件经度", required = true)
    @NotNull(message = "寄件经度不能为空")
    private BigDecimal fromLgt;
    @ApiModelProperty(value = "取件纬度", required = true)
    @NotNull(message = "取件纬度不能为空")
    private BigDecimal toLat;
    @ApiModelProperty(value = "取件经度", required = true)
    @NotNull(message = "取件经度不能为空")
    private BigDecimal toLgt;
    @ApiModelProperty(value = "物品列表", required = true)
    @NotEmpty(message = "物品列表不能为空")
    @Valid
    private List<OrderItemDTO> items;
    @ApiModelProperty(value = "是否保价")
    private Boolean insured;
    @ApiModelProperty(value = "保价金额(元)")
    private BigDecimal declaredAmount;
    @ApiModelProperty(value = "是否加急")
    private Boolean urgent;
}
server/services/src/main/java/com/doumee/dao/dto/CancelOrderDTO.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,25 @@
package com.doumee.dao.dto;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotNull;
/**
 * ä¼šå‘˜å–消订单请求
 *
 * @author rk
 * @date 2026/04/15
 */
@Data
@ApiModel("会员取消订单请求")
public class CancelOrderDTO {
    @NotNull(message = "订单主键不能为空")
    @ApiModelProperty(value = "订单主键", required = true, example = "1")
    private Integer orderId;
    @ApiModelProperty(value = "取消原因")
    private String cancelReason;
}
server/services/src/main/java/com/doumee/dao/dto/ConfirmArriveDTO.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,25 @@
package com.doumee.dao.dto;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotNull;
/**
 * ç¡®è®¤é¡¾å®¢åˆ°åº—DTO
 * @author rk
 * @date 2026/04/15
 */
@Data
@ApiModel("确认顾客到店")
public class ConfirmArriveDTO {
    @NotNull(message = "订单主键不能为空")
    @ApiModelProperty(value = "订单主键", required = true)
    private Integer orderId;
    @NotNull(message = "门店主键不能为空")
    @ApiModelProperty(value = "当前操作门店主键", required = true)
    private Integer shopId;
}
server/services/src/main/java/com/doumee/dao/dto/CreateOrderDTO.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,84 @@
package com.doumee.dao.dto;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.Valid;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
import java.math.BigDecimal;
import java.util.List;
/**
 * åˆ›å»ºè®¢å•请求DTO
 *
 * @Author : Rk
 * @create 2026/4/14
 */
@Data
@ApiModel("创建订单请求")
public class CreateOrderDTO {
    @ApiModelProperty(value = "寄存类型: 0=就地寄存 1=异地寄存", required = true)
    @NotNull(message = "寄存类型不能为空")
    private Integer type;
    @ApiModelProperty(value = "城市主键", required = true)
    @NotNull(message = "城市不能为空")
    private Integer cityId;
    @ApiModelProperty(value = "寄件店铺主键", required = true)
    @NotNull(message = "寄件店铺不能为空")
    private Integer depositShopId;
    @ApiModelProperty(value = "取件店铺主键(异地,店铺取件时)")
    private Integer takeShopId;
    @ApiModelProperty(value = "取件纬度(异地,自选点时)")
    private BigDecimal takeLat;
    @ApiModelProperty(value = "取件经度(异地,自选点时)")
    private BigDecimal takeLgt;
    @ApiModelProperty(value = "取件详细地址(异地,自选点时)")
    private String takeLocation;
    @ApiModelProperty(value = "取件人姓名", required = true)
    @NotEmpty(message = "取件人姓名不能为空")
    private String takeUser;
    @ApiModelProperty(value = "取件人电话", required = true)
    @NotEmpty(message = "取件人电话不能为空")
    private String takePhone;
    @ApiModelProperty(value = "预计到店存件时间(yyyy-MM-dd HH:mm)", required = true)
    @NotEmpty(message = "预计到店存件时间不能为空")
    private String expectedDepositTime;
    @ApiModelProperty(value = "预计到店取件时间(yyyy-MM-dd HH:mm)", required = true)
    @NotEmpty(message = "预计到店取件时间不能为空")
    private String expectedTakeTime;
    @ApiModelProperty(value = "物品类型(category主键)", required = true)
    @NotNull(message = "物品类型不能为空")
    private Integer goodType;
    @ApiModelProperty(value = "物品尺寸与数量列表", required = true)
    @NotEmpty(message = "物品尺寸与数量不能为空")
    @Valid
    private List<OrderItemDTO> items;
    @ApiModelProperty(value = "物品图片URL列表(最多3å¼ )", required = true)
    @NotEmpty(message = "物品图片不能为空")
    private List<String> goodsImages;
    @ApiModelProperty(value = "服务时效: 0=标速达 1=极速达(异地必填)")
    private Integer isUrgent;
    @ApiModelProperty(value = "保价金额(元,非必填)")
    private BigDecimal declaredAmount;
    @ApiModelProperty(value = "订单备注(非必填)")
    private String remark;
}
server/services/src/main/java/com/doumee/dao/dto/DispatchDTO.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,29 @@
package com.doumee.dao.dto;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.math.BigDecimal;
/**
 * è®¢å•派单DTO
 * @author rk
 * @date 2026/04/13
 */
@Data
@ApiModel("订单派单")
public class DispatchDTO {
    @ApiModelProperty(value = "订单主键", required = true)
    private Integer orderId;
    @ApiModelProperty(value = "加急费用(元)", required = true, example = "10.00")
    private BigDecimal urgentFee;
    @ApiModelProperty(value = "派送司机(会员主键)")
    private Integer driverId;
    @ApiModelProperty(value = "备注")
    private String remark;
}
server/services/src/main/java/com/doumee/dao/dto/DriverVerifyDTO.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,31 @@
package com.doumee.dao.dto;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.Size;
import java.util.List;
/**
 * å¸æœºæ ¸é”€è¯·æ±‚
 *
 * @author rk
 * @date 2026/04/15
 */
@Data
@ApiModel("司机核销请求")
public class DriverVerifyDTO {
    @NotBlank(message = "核销码不能为空")
    @ApiModelProperty(value = "司机核销码", required = true)
    private String verifyCode;
    @Size(max = 3, message = "最多上传3张图片")
    @ApiModelProperty(value = "图片地址列表,最多3å¼ ")
    private List<String> images;
    @ApiModelProperty(value = "备注")
    private String remark;
}
server/services/src/main/java/com/doumee/dao/dto/MemberListQueryDTO.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,33 @@
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.util.Date;
/**
 * ä¼šå‘˜åˆ—表查询条件
 * @author rk
 * @date 2026/04/13
 */
@Data
@ApiModel("会员列表查询条件")
public class MemberListQueryDTO {
    @ApiModelProperty(value = "会员姓名/手机号")
    private String keyword;
    @ApiModelProperty(value = "状态 0=正常;1=停用;2=已注销")
    private Integer status;
    @ApiModelProperty(value = "创建开始时间")
    @JsonFormat(pattern = "yyyy-MM-dd")
    private Date startTime;
    @ApiModelProperty(value = "创建结束时间")
    @JsonFormat(pattern = "yyyy-MM-dd")
    private Date endTime;
}
server/services/src/main/java/com/doumee/dao/dto/MyOrderDTO.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,24 @@
package com.doumee.dao.dto;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
/**
 * å°ç¨‹åºç«¯-我的订单查询请求
 * @author rk
 * @date 2026/04/15
 */
@Data
@ApiModel("会员订单查询请求")
public class MyOrderDTO implements Serializable {
    @ApiModelProperty(value = "订单状态(可选,不传查全部)", example = "0")
    private Integer status;
    @ApiModelProperty(value = "合并状态(可选,不传查全部): 0=待支付 1=待核验 2=待配送 3=待收货 4=已完成 5=退款", example = "0")
    private Integer combinedStatus;
}
server/services/src/main/java/com/doumee/dao/dto/OperationConfigDTO.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,40 @@
package com.doumee.dao.dto;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
 * è¿è¥é…ç½®DTO
 * @author rk
 * @date 2026/04/13
 */
@Data
@ApiModel("运营配置")
public class OperationConfigDTO {
    @ApiModelProperty(value = "司机每日取消次数", required = true)
    private String driverDailyCancelLimit;
    @ApiModelProperty(value = "未取件折扣", required = true)
    private String unpickedDiscount;
    @ApiModelProperty(value = "订单结算日期", required = true)
    private String settlementDate;
    @ApiModelProperty(value = "加急系数", required = true)
    private String urgentCoefficient;
    @ApiModelProperty(value = "超时未支付自动取消时间(分钟)", required = true)
    private String autoCancelTime;
    @ApiModelProperty(value = "保费比率", required = true)
    private String insuranceRate;
    @ApiModelProperty(value = "接单数量", required = true)
    private String orderAcceptLimit;
    @ApiModelProperty(value = "自动确认收货(天)", required = true)
    private String autoConfirmReceipt;
}
server/services/src/main/java/com/doumee/dao/dto/OrderItemDTO.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,26 @@
package com.doumee.dao.dto;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotNull;
/**
 * è®¢å•物品项DTO
 *
 * @Author : Rk
 * @create 2026/4/14
 */
@Data
@ApiModel("订单物品项")
public class OrderItemDTO {
    @ApiModelProperty(value = "物品类型/尺寸ID", required = true)
    @NotNull(message = "物品类型不能为空")
    private Integer categoryId;
    @ApiModelProperty(value = "数量", required = true)
    @NotNull(message = "数量不能为空")
    private Integer quantity;
}
server/services/src/main/java/com/doumee/dao/dto/ShopDetailQueryDTO.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,28 @@
package com.doumee.dao.dto;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotNull;
import java.io.Serializable;
/**
 * é—¨åº—详情查询请求
 * @author rk
 * @date 2026/04/14
 */
@Data
@ApiModel("门店详情查询请求")
public class ShopDetailQueryDTO implements Serializable {
    @ApiModelProperty(value = "门店主键", required = true, example = "1")
    @NotNull(message = "门店主键不能为空")
    private Integer id;
    @ApiModelProperty(value = "经度(非必填,有值时返回距离)", example = "116.404")
    private Double longitude;
    @ApiModelProperty(value = "纬度(非必填,有值时返回距离)", example = "39.915")
    private Double latitude;
}
server/services/src/main/java/com/doumee/dao/dto/ShopInfoMaintainDTO.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,40 @@
package com.doumee.dao.dto;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotNull;
import java.io.Serializable;
import java.math.BigDecimal;
/**
 * é—¨åº—信息维护请求(支付押金后)
 * @author rk
 * @date 2026/04/14
 */
@Data
@ApiModel("门店信息维护请求")
public class ShopInfoMaintainDTO implements Serializable {
    @ApiModelProperty(value = "门店头像")
    private String coverImg;
    @ApiModelProperty(value = "门店介绍")
    private String content;
    @ApiModelProperty(value = "寄存类型")
    private String depositTypes;
    @ApiModelProperty(value = "收费标准")
    private String feeStandard;
    @ApiModelProperty(value = "配送范围(km)")
    private BigDecimal deliveryArea;
    @ApiModelProperty(value = "门店营业时间")
    private String shopHours;
    @ApiModelProperty(value = "门店营业类型:0=非全天;1=全天", example = "0")
    private Integer businessType;
}
server/services/src/main/java/com/doumee/dao/dto/ShopLoginDTO.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,23 @@
package com.doumee.dao.web.dto;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@Data
@ApiModel("经销商登录请求对象")
public class ShopLoginDTO {
//    @ApiModelProperty(value = "关联用户主键")
//    private Integer memberId;
    @ApiModelProperty(value = "openid")
    private String openid;
    @ApiModelProperty(value = "用户名称")
    private String userName;
    @ApiModelProperty(value = "密码")
    private String password;
}
server/services/src/main/java/com/doumee/dao/dto/ShopNearbyDTO.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,39 @@
package com.doumee.dao.dto;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotNull;
import java.io.Serializable;
/**
 * é™„近门店查询请求
 * @author rk
 * @date 2026/04/14
 */
@Data
@ApiModel("附近门店查询请求")
public class ShopNearbyDTO implements Serializable {
    @ApiModelProperty(value = "经度", required = true, example = "116.404")
    @NotNull(message = "经度不能为空")
    private Double longitude;
    @ApiModelProperty(value = "纬度", required = true, example = "39.915")
    @NotNull(message = "纬度不能为空")
    private Double latitude;
    @ApiModelProperty(value = "排序类型:1=距离由近到远;2=按评分排序", example = "1")
    private Integer sortType;
    @ApiModelProperty(value = "距离筛选范围(单位:米)", example = "3000")
    private Integer distance;
    @ApiModelProperty(value = "门店营业类型筛选:0=非全天;1=全天", example = "1")
    private Integer businessType;
    @ApiModelProperty(value = "门店名称(模糊查询)", example = "XX门店")
    private String name;
}
server/services/src/main/java/com/doumee/dao/dto/ShopVerifyDTO.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,31 @@
package com.doumee.dao.dto;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.Size;
import java.util.List;
/**
 * é—¨åº—核销请求
 *
 * @author rk
 * @date 2026/04/15
 */
@Data
@ApiModel("门店核销请求")
public class ShopVerifyDTO {
    @NotBlank(message = "核销码不能为空")
    @ApiModelProperty(value = "会员核销码", required = true)
    private String verifyCode;
    @Size(max = 3, message = "最多上传3张图片")
    @ApiModelProperty(value = "图片地址列表,最多3å¼ ")
    private List<String> images;
    @ApiModelProperty(value = "备注")
    private String remark;
}
server/services/src/main/java/com/doumee/dao/dto/UpdMobileRequest.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,29 @@
package com.doumee.dao.web.request;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
import java.util.List;
/**
 * Created by IntelliJ IDEA.
 *
 * @Author : Rk
 * @create 2023/3/23 9:50
 */
@Data
@ApiModel("手机换绑请求类")
public class UpdMobileRequest {
    @ApiModelProperty(value = "验证码",example = "0")
    private String code;
    @ApiModelProperty(value = "手机号")
    private String phone;
    @ApiModelProperty(value = "用户主键",hidden = true)
    private Integer memberId;
}
server/services/src/main/java/com/doumee/dao/dto/WithdrawalApproveDTO.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,24 @@
package com.doumee.dao.dto;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
 * æçŽ°å®¡æ‰¹DTO
 * @author rk
 * @date 2026/04/13
 */
@Data
@ApiModel("提现审批")
public class WithdrawalApproveDTO {
    @ApiModelProperty(value = "提现申请主键", required = true)
    private Integer id;
    @ApiModelProperty(value = "审批结果:1=通过;2=拒绝", required = true, example = "1")
    private Integer status;
    @ApiModelProperty(value = "审批备注")
    private String approveRemark;
}
server/services/src/main/java/com/doumee/dao/vo/ItemPriceVO.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,47 @@
package com.doumee.dao.vo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.math.BigDecimal;
/**
 * å•项物品计价VO
 *
 * @Author : Rk
 * @create 2026/4/14
 */
@Data
@ApiModel("单项物品计价")
public class ItemPriceVO {
    @ApiModelProperty("物品类型ID")
    private Integer categoryId;
    @ApiModelProperty("物品类型名称")
    private String categoryName;
    @ApiModelProperty("数量")
    private Integer quantity;
    @ApiModelProperty("单价(分)")
    private Long unitPrice;
    @ApiModelProperty("小计(分)")
    private Long subtotal;
    // ========== å¼‚地存取额外字段 ==========
    @ApiModelProperty("起步距离(km)")
    private BigDecimal startDistance;
    @ApiModelProperty("起步价(分)")
    private Long startPrice;
    @ApiModelProperty("超出距离单位(km)")
    private BigDecimal extraDistance;
    @ApiModelProperty("超出距离单价(分)")
    private Long extraPrice;
}
server/services/src/main/java/com/doumee/dao/vo/MemberDetailVO.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,85 @@
package com.doumee.dao.vo;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.math.BigDecimal;
import java.util.Date;
/**
 * ä¼šå‘˜è¯¦æƒ…VO
 * @author rk
 * @date 2026/04/13
 */
@Data
@ApiModel("会员详情信息")
public class MemberDetailVO {
    @ApiModelProperty(value = "主键")
    private Integer id;
    @ApiModelProperty(value = "用户昵称")
    private String nickName;
    @ApiModelProperty(value = "会员姓名")
    private String name;
    @ApiModelProperty(value = "授权手机号")
    private String telephone;
    @ApiModelProperty(value = "头像全路径")
    private String fullCoverImage;
    @ApiModelProperty(value = "当前余额(单位:分)")
    private Long amount;
    @ApiModelProperty(value = "历史总金额(单位:分)")
    private Long totalAmount;
    @ApiModelProperty(value = "状态 0=正常;1=停用;2=已注销")
    private Integer status;
    @ApiModelProperty(value = "当前使用身份:0=用工发布方;1=用工接单方")
    private Integer useIdentity;
    @ApiModelProperty(value = "用户类型:0=会员用户;1=司机;2=店铺人员")
    private Integer userType;
    @ApiModelProperty(value = "业务状态:0=未认证;1=认证通过;2=认证未通过;3=已支付押金")
    private Integer businessStatus;
    @ApiModelProperty(value = "评分")
    private BigDecimal score;
    @ApiModelProperty(value = "总接单量")
    private Long receiveNum;
    @ApiModelProperty(value = "总发单量")
    private Long publishNum;
    @ApiModelProperty(value = "注册时间")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private Date createTime;
    @ApiModelProperty(value = "最后登录时间")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private Date loginTime;
    @ApiModelProperty(value = "总登录次数")
    private Long loginTimes;
    @ApiModelProperty(value = "省份")
    private String province;
    @ApiModelProperty(value = "城市")
    private String city;
    @ApiModelProperty(value = "区县")
    private String area;
    @ApiModelProperty(value = "是否接受自动派单:0=否;1=是")
    private Integer autoReceiveStatus;
}
server/services/src/main/java/com/doumee/dao/vo/MemberListVO.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,44 @@
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.util.Date;
/**
 * ä¼šå‘˜åˆ—表VO(列表展示 + å¯¼å‡ºï¼‰
 * @author rk
 * @date 2026/04/13
 */
@Data
@ApiModel("会员列表信息")
public class MemberListVO {
    @ApiModelProperty(value = "主键")
    private Integer id;
    @ExcelColumn(name = "用户昵称", index = 1, width = 12)
    @ApiModelProperty(value = "用户昵称")
    private String nickName;
    @ExcelColumn(name = "会员姓名", index = 2, width = 10)
    @ApiModelProperty(value = "会员姓名")
    private String name;
    @ExcelColumn(name = "授权手机号", index = 3, width = 14)
    @ApiModelProperty(value = "授权手机号")
    private String telephone;
    @ExcelColumn(name = "注册时间", index = 4, width = 18, dateFormat = "yyyy-MM-dd HH:mm:ss")
    @ApiModelProperty(value = "创建时间")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private Date createTime;
    @ExcelColumn(name = "状态", index = 5, width = 10, valueMapping = "0=正常;1=停用;2=已注销;")
    @ApiModelProperty(value = "状态 0=正常;1=停用;2=已注销")
    private Integer status;
}
server/services/src/main/java/com/doumee/dao/vo/MyOrderDetailVO.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,154 @@
package com.doumee.dao.vo;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.Date;
import java.util.List;
/**
 * ä¼šå‘˜ç«¯-订单详情
 *
 * @author rk
 * @date 2026/04/15
 */
@Data
@ApiModel("会员端订单详情")
public class MyOrderDetailVO {
    @ApiModelProperty(value = "订单主键")
    private Integer id;
    // ---- çŠ¶æ€ ----
    @ApiModelProperty(value = "订单状态")
    private Integer status;
    @ApiModelProperty(value = "订单状态描述")
    private String statusDesc;
    @ApiModelProperty(value = "支付倒计时毫秒(仅待支付状态返回,-1表示已超时)")
    private Long payCountdownMs;
    @ApiModelProperty(value = "会员核销码(待寄存/待取件状态返回)")
    private String memberVerifyCode;
    // ---- åŸºç¡€ä¿¡æ¯ ----
    @ApiModelProperty(value = "订单类型: 0=就地寄存 1=异地寄存")
    private Integer type;
    @ApiModelProperty(value = "订单编号")
    private String code;
    @ApiModelProperty(value = "三方订单号")
    private String outTradeNo;
    @ApiModelProperty(value = "订单备注")
    private String remark;
    @ApiModelProperty(value = "创建时间")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private Date createTime;
    @ApiModelProperty(value = "支付时间")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private Date payTime;
    // ---- æ—¶é—´ä¿¡æ¯ ----
    @ApiModelProperty(value = "预计到店存件时间")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private Date expectedDepositTime;
    @ApiModelProperty(value = "预计取件时间")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private Date expectedTakeTime;
    @ApiModelProperty(value = "行李转移到店时间(异地寄存)")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private Date arriveTime;
    // ---- å­˜ä»¶é—¨åº— ----
    @ApiModelProperty(value = "存件门店名称")
    private String depositShopName;
    @ApiModelProperty(value = "存件门店地址")
    private String depositShopAddress;
    @ApiModelProperty(value = "存件门店联系人")
    private String depositShopLinkName;
    @ApiModelProperty(value = "存件门店联系电话")
    private String depositShopPhone;
    // ---- å–件信息 ----
    @ApiModelProperty(value = "取件门店名称(有取件门店时返回)")
    private String takeShopName;
    @ApiModelProperty(value = "取件门店地址(有取件门店时返回)")
    private String takeShopAddress;
    @ApiModelProperty(value = "取件地点(无取件门店时返回,用户自选)")
    private String takeLocation;
    @ApiModelProperty(value = "取件地点详细地址(无取件门店时返回)")
    private String takeLocationRemark;
    @ApiModelProperty(value = "取件人名称")
    private String takeUser;
    @ApiModelProperty(value = "取件人手机号")
    private String takePhone;
    // ---- è´¹ç”¨ï¼ˆåˆ†ï¼‰ ----
    @ApiModelProperty(value = "基础寄存费用(分)")
    private Long basicAmount;
    @ApiModelProperty(value = "保价金额(分)")
    private Long declaredAmount;
    @ApiModelProperty(value = "保价保费(分)")
    private Long declaredFee;
    @ApiModelProperty(value = "加急费用(分)")
    private Long urgentAmount;
    @ApiModelProperty(value = "实际支付费用(分)")
    private Long actualPayAmount;
    // ---- é€¾æœŸ ----
    @ApiModelProperty(value = "是否逾期")
    private Boolean overdue;
    @ApiModelProperty(value = "逾期天数")
    private Integer overdueDays;
    @ApiModelProperty(value = "逾期费用(分)")
    private Long overdueFee;
    // ---- æ ‡è®° ----
    @ApiModelProperty(value = "是否异常: 0=否 1=是")
    private Integer exceptionStatus;
    @ApiModelProperty(value = "是否超出取件时间")
    private Boolean pastTakeTime;
    // ---- ç‰©å“ä¿¡æ¯ ----
    @ApiModelProperty(value = "物品类型名称")
    private String goodTypeName;
    @ApiModelProperty(value = "下单照片")
    private List<String> orderImages;
    @ApiModelProperty(value = "物品明细列表")
    private List<OrderItemVO> detailList;
}
server/services/src/main/java/com/doumee/dao/vo/MyOrderVO.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,94 @@
package com.doumee.dao.vo;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.Date;
import java.util.List;
/**
 * å°ç¨‹åºç«¯-我的订单列表项
 * @author rk
 * @date 2026/04/15
 */
@Data
@ApiModel("我的订单列表项")
public class MyOrderVO {
    @ApiModelProperty(value = "订单主键")
    private Integer id;
    @ApiModelProperty(value = "订单编号")
    private String code;
    @ApiModelProperty(value = "寄存方式:0=就地存取;1=异地存取")
    private Integer type;
    @ApiModelProperty(value = "订单状态")
    private Integer status;
    @ApiModelProperty(value = "创建时间")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private Date createTime;
    @ApiModelProperty(value = "预计取件时间")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private Date expectedTakeTime;
    // ---- å­˜ä»¶é—¨åº— ----
    @ApiModelProperty(value = "存件门店名称")
    private String depositShopName;
    @ApiModelProperty(value = "存件门店联系人")
    private String depositShopLinkName;
    @ApiModelProperty(value = "存件门店联系电话")
    private String depositShopPhone;
    // ---- å–件信息 ----
    @ApiModelProperty(value = "取件门店名称(有取件门店时返回)")
    private String takeShopName;
    @ApiModelProperty(value = "取件门店地址(有取件门店时返回)")
    private String takeShopAddress;
    @ApiModelProperty(value = "取件地点(无取件门店时返回,用户自选)")
    private String takeLocation;
    @ApiModelProperty(value = "取件地点详细地址(无取件门店时返回)")
    private String takeLocationRemark;
    @ApiModelProperty(value = "取件人名称")
    private String takeUser;
    @ApiModelProperty(value = "取件人手机号")
    private String takePhone;
    // ---- è´¹ç”¨ ----
    @ApiModelProperty(value = "报价保费(分)")
    private Long declaredFee;
    @ApiModelProperty(value = "预估费用(分)")
    private Long estimatedAmount;
    // ---- é€¾æœŸ ----
    @ApiModelProperty(value = "是否逾期")
    private Boolean overdue;
    @ApiModelProperty(value = "逾期天数")
    private Integer overdueDays;
    @ApiModelProperty(value = "逾期费用(分)")
    private Long overdueFee;
    // ---- ç‰©å“æ˜Žç»† ----
    @ApiModelProperty(value = "物品明细列表")
    private List<OrderItemVO> detailList;
}
server/services/src/main/java/com/doumee/dao/vo/OrderDetailVO.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,83 @@
package com.doumee.dao.vo;
import com.doumee.dao.business.model.Orders;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.List;
/**
 * è®¢å•详情VO
 * @author rk
 * @date 2026/04/13
 */
@Data
@ApiModel("订单详情")
public class OrderDetailVO {
    @ApiModelProperty(value = "订单基础信息")
    private Orders order;
    @ApiModelProperty(value = "下单图片列表")
    private List<String> orderFiles;
    @ApiModelProperty(value = "会员姓名")
    private String memberName;
    @ApiModelProperty(value = "会员联系电话")
    private String memberPhone;
    @ApiModelProperty(value = "寄存门店名称")
    private String depositShopName;
    @ApiModelProperty(value = "寄存门店联系电话")
    private String depositShopPhone;
    @ApiModelProperty(value = "取件门店名称")
    private String takeShopName;
    @ApiModelProperty(value = "取件门店地址")
    private String takeShopAddress;
    @ApiModelProperty(value = "取件门店联系电话")
    private String takeShopPhone;
    @ApiModelProperty(value = "订单寄存图片")
    private List<String> depositImages;
    @ApiModelProperty(value = "司机取件图片")
    private List<String> driverTakeImages;
    @ApiModelProperty(value = "司机完成图片")
    private List<String> driverDoneImages;
    @ApiModelProperty(value = "门店入库图片")
    private List<String> storeInImages;
    @ApiModelProperty(value = "门店出库图片")
    private List<String> storeOutImages;
    @ApiModelProperty(value = "物品明细列表")
    private List<OrderDetailItemVO> detailList;
    /**
     * ç‰©å“æ˜Žç»†é¡¹
     */
    @Data
    @ApiModel("物品明细项")
    public static class OrderDetailItemVO {
        @ApiModelProperty(value = "尺寸名称")
        private String luggageName;
        @ApiModelProperty(value = "数量")
        private Integer num;
        @ApiModelProperty(value = "单价(元)")
        private Double unitPriceYuan;
        @ApiModelProperty(value = "小计费用(元)")
        private Double subtotal;
    }
}
server/services/src/main/java/com/doumee/dao/vo/OrderDispatchVO.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,52 @@
package com.doumee.dao.vo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.List;
/**
 * æ‰‹åŠ¨æ´¾å•ä¿¡æ¯VO
 * @author rk
 * @date 2026/04/13
 */
@Data
@ApiModel("手动派单信息")
public class OrderDispatchVO {
    @ApiModelProperty(value = "订单编号")
    private String code;
    @ApiModelProperty(value = "实付金额(元)")
    private Double payAmountYuan;
    @ApiModelProperty(value = "配送方式:0=就地存取;1=异地存取")
    private Integer type;
    @ApiModelProperty(value = "配送方式描述")
    private String typeDesc;
    @ApiModelProperty(value = "订单物品详情")
    private List<DispatchItemVO> detailList;
    /**
     * ç‰©å“æ˜Žç»†é¡¹
     */
    @Data
    @ApiModel("派单物品明细项")
    public static class DispatchItemVO {
        @ApiModelProperty(value = "尺寸名称")
        private String luggageName;
        @ApiModelProperty(value = "数量")
        private Integer num;
        @ApiModelProperty(value = "单价(元)")
        private Double unitPriceYuan;
        @ApiModelProperty(value = "小计费用(元)")
        private Double subtotal;
    }
}
server/services/src/main/java/com/doumee/dao/vo/OrderItemVO.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,27 @@
package com.doumee.dao.vo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
 * è®¢å•物品明细项
 * @author rk
 * @date 2026/04/13
 */
@Data
@ApiModel("订单物品明细项")
public class OrderItemVO {
    @ApiModelProperty(value = "尺寸名称")
    private String luggageName;
    @ApiModelProperty(value = "数量")
    private Integer num;
    @ApiModelProperty(value = "单价(元)")
    private Double unitPriceYuan;
    @ApiModelProperty(value = "小计费用(元)")
    private Double subtotal;
}
server/services/src/main/java/com/doumee/dao/vo/OrderSummaryVO.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,28 @@
package com.doumee.dao.vo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
 * è®¢å•汇总统计
 * @author rk
 * @date 2026/04/14
 */
@Data
@ApiModel("订单汇总统计")
public class OrderSummaryVO {
    @ApiModelProperty(value = "订单总费用(分)")
    private Long totalAmountSum;
    @ApiModelProperty(value = "已结算总费用(分)")
    private Long settledTotalAmountSum;
    @ApiModelProperty(value = "司机费用总计(分)")
    private Long driverFeeSum;
    @ApiModelProperty(value = "司机已结算费用(分)")
    private Long settledDriverFeeSum;
}
server/services/src/main/java/com/doumee/dao/vo/OverdueFeeVO.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,31 @@
package com.doumee.dao.vo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
 * è¶…æ—¶/逾期费用计算结果VO
 *
 * @Author : Rk
 * @create 2026/4/15
 */
@Data
@ApiModel("超时费用计算结果")
public class OverdueFeeVO {
    @ApiModelProperty("是否逾期")
    private Boolean overdue;
    @ApiModelProperty("逾期天数")
    private Integer overdueDays;
    @ApiModelProperty("逾期费用(分)")
    private Long overdueFee;
    @ApiModelProperty("物品基础日费用合计(分) â€” å•价×数量之和")
    private Long dailyBaseFee;
    @ApiModelProperty("折扣比率(仅异地寄存)")
    private String discountRate;
}
server/services/src/main/java/com/doumee/dao/vo/PayResponse.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,31 @@
package com.doumee.dao.web.response.goods;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
/**
 * Created by IntelliJ IDEA.
 *
 * @Author : Rk
 * @create 2023/3/23 9:50
 */
@Data
@ApiModel("支付相应类")
public class PayResponse implements Serializable {
    @ApiModelProperty(value = "支付订单主键")
    private Integer orderId;
    @ApiModelProperty(value = "支付类型:0=现金支付;1=纯积分支付")
    private Integer payType;
    @ApiModelProperty(value = "微信调起业务")
    private Object response;
    @ApiModelProperty(value = "锁定编号",hidden = true)
    private String lockKey;
}
server/services/src/main/java/com/doumee/dao/vo/PriceCalculateVO.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,40 @@
package com.doumee.dao.vo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.math.BigDecimal;
import java.util.List;
/**
 * ä»·æ ¼è®¡ç®—结果VO
 *
 * @Author : Rk
 * @create 2026/4/14
 */
@Data
@ApiModel("价格计算结果")
public class PriceCalculateVO {
    @ApiModelProperty("物品计价详情列表")
    private List<ItemPriceVO> itemList;
    @ApiModelProperty("总价格(分)")
    private Long totalPrice;
    @ApiModelProperty("总保价费用(分)")
    private Long insuranceFee;
    @ApiModelProperty("物品价格合计(分)")
    private Long itemPrice;
    @ApiModelProperty("加急费用(分)")
    private Long urgentFee;
    @ApiModelProperty("距离(km)")
    private BigDecimal distance;
    @ApiModelProperty("天数")
    private Integer days;
}
server/services/src/main/java/com/doumee/dao/vo/ShopLoginVO.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,33 @@
package com.doumee.dao.vo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
/**
 * é—¨åº—登录响应
 *
 * @author rk
 * @date 2026/04/15
 */
@Data
@ApiModel("门店登录响应")
public class ShopLoginVO implements Serializable {
    @ApiModelProperty(value = "门店token")
    private String token;
    @ApiModelProperty(value = "门店主键")
    private Integer shopId;
    @ApiModelProperty(value = "门店名称")
    private String shopName;
    @ApiModelProperty(value = "门店类型: 0=个人 1=企业")
    private Integer companyType;
    @ApiModelProperty(value = "所属城市名称")
    private String cityName;
}
server/services/src/main/java/com/doumee/dao/vo/ShopNearbyVO.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,39 @@
package com.doumee.dao.vo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
import java.math.BigDecimal;
/**
 * é™„近门店列表项
 * @author rk
 * @date 2026/04/14
 */
@Data
@ApiModel("附近门店列表项")
public class ShopNearbyVO implements Serializable {
    @ApiModelProperty(value = "门店主键")
    private Integer id;
    @ApiModelProperty(value = "门店名称")
    private String name;
    @ApiModelProperty(value = "门店营业时间")
    private String shopHours;
    @ApiModelProperty(value = "门店位置(详细地址)")
    private String address;
    @ApiModelProperty(value = "门头照第一张(全路径)")
    private String coverImg;
    @ApiModelProperty(value = "距离(如 500m、1.2km)")
    private String distanceText;
    @ApiModelProperty(value = "门店评分")
    private BigDecimal score;
}
server/services/src/main/java/com/doumee/dao/vo/ShopWebDetailVO.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,36 @@
package com.doumee.dao.vo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
import java.util.List;
/**
 * é—¨åº—详情(小程序端)
 * @author rk
 * @date 2026/04/14
 */
@Data
@ApiModel("门店详情(小程序端)")
public class ShopWebDetailVO implements Serializable {
    @ApiModelProperty(value = "门店主键")
    private Integer id;
    @ApiModelProperty(value = "门店名称")
    private String name;
    @ApiModelProperty(value = "门店详细地址")
    private String address;
    @ApiModelProperty(value = "门店说明")
    private String content;
    @ApiModelProperty(value = "门店照片(门头照+内部照,全路径集合)")
    private List<String> images;
    @ApiModelProperty(value = "距离(如 500m、1.2km),无经纬度入参时为空")
    private String distanceText;
}
server/services/src/main/java/com/doumee/service/business/AddrService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,49 @@
package com.doumee.service.business;
import com.doumee.core.model.PageData;
import com.doumee.core.model.PageWrap;
import com.doumee.dao.business.model.Addr;
import java.util.List;
/**
 * åœ°å€ç°¿Service
 * @author rk
 * @date 2026/04/15
 */
public interface AddrService {
    Integer create(Addr addr);
    void deleteById(Integer id);
    void delete(Addr addr);
    void deleteByIdInBatch(List<Integer> ids);
    void updateById(Addr addr);
    void updateByIdInBatch(List<Addr> addrs);
    void updateStatus(Addr addr);
    Addr findById(Integer id);
    Addr findOne(Addr addr);
    List<Addr> findList(Addr addr);
    PageData<Addr> findPage(PageWrap<Addr> pageWrap);
    long count(Addr addr);
    /**
     * æŸ¥è¯¢ä¼šå‘˜åœ°å€åˆ—表(含省市区信息)
     */
    List<Addr> findListWithArea(Integer memberId);
    /**
     * æ ¹æ®ID查询地址(含省市区信息)
     */
    Addr findByIdWithArea(Integer id);
}
server/services/src/main/java/com/doumee/service/business/OrderLogService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,37 @@
package com.doumee.service.business;
import com.doumee.core.model.PageData;
import com.doumee.core.model.PageWrap;
import com.doumee.dao.business.model.OrderLog;
import java.util.List;
/**
 * è®¢å•操作日志Service定义
 * @author rk
 * @date 2026/04/13
 */
public interface OrderLogService {
    Integer create(OrderLog orderLog);
    void deleteById(Integer id);
    void delete(OrderLog orderLog);
    void deleteByIdInBatch(List<Integer> ids);
    void updateById(OrderLog orderLog);
    void updateByIdInBatch(List<OrderLog> orderLogs);
    OrderLog findById(Integer id);
    OrderLog findOne(OrderLog orderLog);
    List<OrderLog> findList(OrderLog orderLog);
    PageData<OrderLog> findPage(PageWrap<OrderLog> pageWrap);
    long count(OrderLog orderLog);
}
server/services/src/main/java/com/doumee/service/business/OrdersRefundService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,98 @@
package com.doumee.service.business;
import com.doumee.core.model.PageData;
import com.doumee.core.model.PageWrap;
import com.doumee.dao.business.model.OrdersRefund;
import java.util.List;
/**
 * è®¢å•退款记录Service定义
 * @author rk
 * @date 2026/04/13
 */
public interface OrdersRefundService {
    /**
     * åˆ›å»º
     *
     * @param ordersRefund å®žä½“对象
     * @return Integer
     */
    Integer create(OrdersRefund ordersRefund);
    /**
     * ä¸»é”®åˆ é™¤
     *
     * @param id ä¸»é”®
     */
    void deleteById(Integer id);
    /**
     * åˆ é™¤
     *
     * @param ordersRefund å®žä½“对象
     */
    void delete(OrdersRefund ordersRefund);
    /**
     * æ‰¹é‡ä¸»é”®åˆ é™¤
     *
     * @param ids ä¸»é”®é›†
     */
    void deleteByIdInBatch(List<Integer> ids);
    /**
     * ä¸»é”®æ›´æ–°
     *
     * @param ordersRefund å®žä½“对象
     */
    void updateById(OrdersRefund ordersRefund);
    /**
     * æ‰¹é‡ä¸»é”®æ›´æ–°
     *
     * @param ordersRefunds å®žä½“集
     */
    void updateByIdInBatch(List<OrdersRefund> ordersRefunds);
    /**
     * ä¸»é”®æŸ¥è¯¢
     *
     * @param id ä¸»é”®
     * @return OrdersRefund
     */
    OrdersRefund findById(Integer id);
    /**
     * æ¡ä»¶æŸ¥è¯¢å•条记录
     *
     * @param ordersRefund å®žä½“对象
     * @return OrdersRefund
     */
    OrdersRefund findOne(OrdersRefund ordersRefund);
    /**
     * æ¡ä»¶æŸ¥è¯¢
     *
     * @param ordersRefund å®žä½“对象
     * @return List<OrdersRefund>
     */
    List<OrdersRefund> findList(OrdersRefund ordersRefund);
    /**
     * åˆ†é¡µæŸ¥è¯¢
     *
     * @param pageWrap åˆ†é¡µå¯¹è±¡
     * @return PageData<OrdersRefund>
     */
    PageData<OrdersRefund> findPage(PageWrap<OrdersRefund> pageWrap);
    /**
     * æ¡ä»¶ç»Ÿè®¡
     *
     * @param ordersRefund å®žä½“对象
     * @return long
     */
    long count(OrdersRefund ordersRefund);
}
server/services/src/main/java/com/doumee/service/business/impl/AddrServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,171 @@
package com.doumee.service.business.impl;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.doumee.core.constants.Constants;
import com.doumee.core.constants.ResponseStatus;
import com.doumee.core.exception.BusinessException;
import com.doumee.core.model.LoginUserInfo;
import com.doumee.core.model.PageData;
import com.doumee.core.model.PageWrap;
import com.doumee.core.utils.Utils;
import com.doumee.dao.business.AddrMapper;
import com.doumee.dao.business.model.Addr;
import com.doumee.service.business.AddrService;
import org.apache.commons.lang3.StringUtils;
import org.apache.shiro.SecurityUtils;
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.Date;
import java.util.List;
import java.util.Objects;
/**
 * åœ°å€ç°¿Service实现
 * @author rk
 * @date 2026/04/15
 */
@Service
public class AddrServiceImpl implements AddrService {
    @Autowired
    private AddrMapper addrMapper;
    @Override
    @Transactional(rollbackFor = {Exception.class, BusinessException.class})
    public Integer create(Addr addr) {
        LoginUserInfo loginUserInfo = (LoginUserInfo) SecurityUtils.getSubject().getPrincipal();
        addr.setDeleted(Constants.ZERO);
        addr.setCreateTime(new Date());
        addr.setCreateUser(loginUserInfo.getId());
        addr.setUpdateTime(new Date());
        addr.setUpdateUser(loginUserInfo.getId());
        addrMapper.insert(addr);
        return addr.getId();
    }
    @Override
    public void deleteById(Integer id) {
        addrMapper.update(new UpdateWrapper<Addr>().lambda()
                .set(Addr::getDeleted, Constants.ONE)
                .eq(Addr::getId, id));
    }
    @Override
    public void delete(Addr addr) {
        UpdateWrapper<Addr> deleteWrapper = new UpdateWrapper<>(addr);
        addrMapper.delete(deleteWrapper);
    }
    @Override
    public void deleteByIdInBatch(List<Integer> ids) {
        if (CollectionUtils.isEmpty(ids)) {
            return;
        }
        for (Integer id : ids) {
            this.deleteById(id);
        }
    }
    @Override
    @Transactional(rollbackFor = {Exception.class, BusinessException.class})
    public void updateById(Addr addr) {
        if (Objects.isNull(addr) || Objects.isNull(addr.getId())) {
            throw new BusinessException(ResponseStatus.BAD_REQUEST);
        }
        LoginUserInfo loginUserInfo = (LoginUserInfo) SecurityUtils.getSubject().getPrincipal();
        addr.setUpdateTime(new Date());
        addr.setUpdateUser(loginUserInfo.getId());
        addrMapper.updateById(addr);
    }
    @Override
    public void updateStatus(Addr addr) {
        if (Objects.isNull(addr) || Objects.isNull(addr.getId())) {
            throw new BusinessException(ResponseStatus.BAD_REQUEST);
        }
        LoginUserInfo loginUserInfo = (LoginUserInfo) SecurityUtils.getSubject().getPrincipal();
        addr.setUpdateTime(new Date());
        addr.setUpdateUser(loginUserInfo.getId());
        addrMapper.updateById(addr);
    }
    @Override
    public void updateByIdInBatch(List<Addr> addrs) {
        if (CollectionUtils.isEmpty(addrs)) {
            return;
        }
        for (Addr addr : addrs) {
            this.updateById(addr);
        }
    }
    @Override
    public Addr findById(Integer id) {
        Addr addr = addrMapper.selectById(id);
        if (Objects.isNull(addr)) {
            throw new BusinessException(ResponseStatus.DATA_EMPTY);
        }
        return addr;
    }
    @Override
    public Addr findOne(Addr addr) {
        QueryWrapper<Addr> wrapper = new QueryWrapper<>(addr);
        return addrMapper.selectOne(wrapper);
    }
    @Override
    public List<Addr> findList(Addr addr) {
        QueryWrapper<Addr> wrapper = new QueryWrapper<>(addr);
        return addrMapper.selectList(wrapper);
    }
    @Override
    public PageData<Addr> findPage(PageWrap<Addr> pageWrap) {
        IPage<Addr> page = new Page<>(pageWrap.getPage(), pageWrap.getCapacity());
        QueryWrapper<Addr> queryWrapper = new QueryWrapper<>();
        Utils.MP.blankToNull(pageWrap.getModel());
        pageWrap.getModel().setDeleted(Constants.ZERO);
        if (pageWrap.getModel().getDeleted() != null) {
            queryWrapper.lambda().eq(Addr::getDeleted, pageWrap.getModel().getDeleted());
        }
        if (pageWrap.getModel().getMemberId() != null) {
            queryWrapper.lambda().eq(Addr::getMemberId, pageWrap.getModel().getMemberId());
        }
        if (pageWrap.getModel().getIsDefault() != null) {
            queryWrapper.lambda().eq(Addr::getIsDefault, pageWrap.getModel().getIsDefault());
        }
        if (StringUtils.isNotBlank(pageWrap.getModel().getName())) {
            queryWrapper.lambda().like(Addr::getName, pageWrap.getModel().getName());
        }
        if (StringUtils.isNotBlank(pageWrap.getModel().getPhone())) {
            queryWrapper.lambda().like(Addr::getPhone, pageWrap.getModel().getPhone());
        }
        if (StringUtils.isNotBlank(pageWrap.getModel().getAddr())) {
            queryWrapper.lambda().like(Addr::getAddr, pageWrap.getModel().getAddr());
        }
        if (pageWrap.getModel().getAreaId() != null) {
            queryWrapper.lambda().eq(Addr::getAreaId, pageWrap.getModel().getAreaId());
        }
        for (PageWrap.SortData sortData : pageWrap.getSorts()) {
            if (sortData.getDirection().equalsIgnoreCase(PageWrap.DESC)) {
                queryWrapper.orderByDesc(sortData.getProperty());
            } else {
                queryWrapper.orderByAsc(sortData.getProperty());
            }
        }
        return PageData.from(addrMapper.selectPage(page, queryWrapper));
    }
    @Override
    public long count(Addr addr) {
        QueryWrapper<Addr> wrapper = new QueryWrapper<>(addr);
        return addrMapper.selectCount(wrapper);
    }
}
server/services/src/main/java/com/doumee/service/business/impl/OrderLogServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,139 @@
package com.doumee.service.business.impl;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.doumee.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.OrderLogMapper;
import com.doumee.dao.business.model.OrderLog;
import com.doumee.service.business.OrderLogService;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
import java.util.Objects;
/**
 * è®¢å•操作日志Service实现
 * @author rk
 * @date 2026/04/13
 */
@Service
public class OrderLogServiceImpl implements OrderLogService {
    @Autowired
    private OrderLogMapper orderLogMapper;
    @Override
    public Integer create(OrderLog orderLog) {
        orderLogMapper.insert(orderLog);
        return orderLog.getId();
    }
    @Override
    public void deleteById(Integer id) {
        orderLogMapper.update(new UpdateWrapper<OrderLog>().lambda()
                .set(OrderLog::getDeleted, Constants.ONE)
                .eq(OrderLog::getId, id));
    }
    @Override
    public void delete(OrderLog orderLog) {
        UpdateWrapper<OrderLog> deleteWrapper = new UpdateWrapper<>(orderLog);
        orderLogMapper.delete(deleteWrapper);
    }
    @Override
    public void deleteByIdInBatch(List<Integer> ids) {
        if (ids == null || ids.isEmpty()) {
            return;
        }
        for (Integer id : ids) {
            this.deleteById(id);
        }
    }
    @Override
    public void updateById(OrderLog orderLog) {
        orderLogMapper.updateById(orderLog);
    }
    @Override
    public void updateByIdInBatch(List<OrderLog> orderLogs) {
        if (orderLogs == null || orderLogs.isEmpty()) {
            return;
        }
        for (OrderLog orderLog : orderLogs) {
            this.updateById(orderLog);
        }
    }
    @Override
    public OrderLog findById(Integer id) {
        OrderLog orderLog = orderLogMapper.selectById(id);
        if (Objects.isNull(orderLog)) {
            throw new BusinessException(ResponseStatus.DATA_EMPTY);
        }
        return orderLog;
    }
    @Override
    public OrderLog findOne(OrderLog orderLog) {
        QueryWrapper<OrderLog> wrapper = new QueryWrapper<>(orderLog);
        return orderLogMapper.selectOne(wrapper);
    }
    @Override
    public List<OrderLog> findList(OrderLog orderLog) {
        QueryWrapper<OrderLog> wrapper = new QueryWrapper<>(orderLog);
        return orderLogMapper.selectList(wrapper);
    }
    @Override
    public PageData<OrderLog> findPage(PageWrap<OrderLog> pageWrap) {
        IPage<OrderLog> page = new Page<>(pageWrap.getPage(), pageWrap.getCapacity());
        QueryWrapper<OrderLog> queryWrapper = new QueryWrapper<>();
        Utils.MP.blankToNull(pageWrap.getModel());
        pageWrap.getModel().setDeleted(Constants.ZERO);
        queryWrapper.lambda().eq(OrderLog::getDeleted, pageWrap.getModel().getDeleted());
        if (pageWrap.getModel().getOrderId() != null) {
            queryWrapper.lambda().eq(OrderLog::getOrderId, pageWrap.getModel().getOrderId());
        }
        if (StringUtils.isNotBlank(pageWrap.getModel().getTitle())) {
            queryWrapper.lambda().like(OrderLog::getTitle, pageWrap.getModel().getTitle());
        }
        if (pageWrap.getModel().getOrderStatus() != null) {
            queryWrapper.lambda().eq(OrderLog::getOrderStatus, pageWrap.getModel().getOrderStatus());
        }
        if (pageWrap.getModel().getObjType() != null) {
            queryWrapper.lambda().eq(OrderLog::getObjType, pageWrap.getModel().getObjType());
        }
        if (pageWrap.getModel().getOptUserType() != null) {
            queryWrapper.lambda().eq(OrderLog::getOptUserType, pageWrap.getModel().getOptUserType());
        }
        if (pageWrap.getModel().getOptUserId() != null) {
            queryWrapper.lambda().eq(OrderLog::getOptUserId, pageWrap.getModel().getOptUserId());
        }
        for (PageWrap.SortData sortData : pageWrap.getSorts()) {
            if (sortData.getDirection().equalsIgnoreCase(PageWrap.DESC)) {
                queryWrapper.orderByDesc(sortData.getProperty());
            } else {
                queryWrapper.orderByAsc(sortData.getProperty());
            }
        }
        return PageData.from(orderLogMapper.selectPage(page, queryWrapper));
    }
    @Override
    public long count(OrderLog orderLog) {
        QueryWrapper<OrderLog> wrapper = new QueryWrapper<>(orderLog);
        return orderLogMapper.selectCount(wrapper);
    }
}
server/services/src/main/java/com/doumee/service/business/impl/OrdersRefundServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,113 @@
package com.doumee.service.business.impl;
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.core.model.PageData;
import com.doumee.core.model.PageWrap;
import com.doumee.dao.business.OrdersRefundMapper;
import com.doumee.dao.business.model.OrdersRefund;
import com.doumee.service.business.OrdersRefundService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import java.util.List;
/**
 * è®¢å•退款记录Service实现
 * @author rk
 * @date 2026/04/13
 */
@Service
public class OrdersRefundServiceImpl implements OrdersRefundService {
    @Autowired
    private OrdersRefundMapper ordersRefundMapper;
    @Override
    public Integer create(OrdersRefund ordersRefund) {
        ordersRefundMapper.insert(ordersRefund);
        return ordersRefund.getId();
    }
    @Override
    public void deleteById(Integer id) {
        ordersRefundMapper.deleteById(id);
    }
    @Override
    public void delete(OrdersRefund ordersRefund) {
        QueryWrapper<OrdersRefund> deleteWrapper = new QueryWrapper<>(ordersRefund);
        ordersRefundMapper.delete(deleteWrapper);
    }
    @Override
    public void deleteByIdInBatch(List<Integer> ids) {
        if (CollectionUtils.isEmpty(ids)) {
            return;
        }
        ordersRefundMapper.deleteBatchIds(ids);
    }
    @Override
    public void updateById(OrdersRefund ordersRefund) {
        ordersRefundMapper.updateById(ordersRefund);
    }
    @Override
    public void updateByIdInBatch(List<OrdersRefund> ordersRefunds) {
        if (CollectionUtils.isEmpty(ordersRefunds)) {
            return;
        }
        for (OrdersRefund ordersRefund : ordersRefunds) {
            this.updateById(ordersRefund);
        }
    }
    @Override
    public OrdersRefund findById(Integer id) {
        return ordersRefundMapper.selectById(id);
    }
    @Override
    public OrdersRefund findOne(OrdersRefund ordersRefund) {
        QueryWrapper<OrdersRefund> wrapper = new QueryWrapper<>(ordersRefund);
        return ordersRefundMapper.selectOne(wrapper);
    }
    @Override
    public List<OrdersRefund> findList(OrdersRefund ordersRefund) {
        QueryWrapper<OrdersRefund> wrapper = new QueryWrapper<>(ordersRefund);
        return ordersRefundMapper.selectList(wrapper);
    }
    @Override
    public PageData<OrdersRefund> findPage(PageWrap<OrdersRefund> pageWrap) {
        IPage<OrdersRefund> page = new Page<>(pageWrap.getPage(), pageWrap.getCapacity());
        QueryWrapper<OrdersRefund> queryWrapper = new QueryWrapper<>();
        OrdersRefund model = pageWrap.getModel();
        if (model != null) {
            if (model.getOrderId() != null) {
                queryWrapper.lambda().eq(OrdersRefund::getOrderId, model.getOrderId());
            }
            if (model.getType() != null) {
                queryWrapper.lambda().eq(OrdersRefund::getType, model.getType());
            }
        }
        for (PageWrap.SortData sortData : pageWrap.getSorts()) {
            if (sortData.getDirection().equalsIgnoreCase(PageWrap.DESC)) {
                queryWrapper.orderByDesc(sortData.getProperty());
            } else {
                queryWrapper.orderByAsc(sortData.getProperty());
            }
        }
        return PageData.from(ordersRefundMapper.selectPage(page, queryWrapper));
    }
    @Override
    public long count(OrdersRefund ordersRefund) {
        QueryWrapper<OrdersRefund> wrapper = new QueryWrapper<>(ordersRefund);
        return ordersRefundMapper.selectCount(wrapper);
    }
}
server/web/src/main/java/com/doumee/api/web/AddrApi.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,100 @@
package com.doumee.api.web;
import com.doumee.core.annotation.LoginRequired;
import com.doumee.core.model.ApiResponse;
import com.doumee.dao.business.model.Addr;
import com.doumee.service.business.AddrService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.List;
/**
 * åœ°å€ç°¿ï¼ˆå°ç¨‹åºç«¯ï¼‰
 * @author rk
 * @date 2026/04/15
 */
@Api(tags = "地址簿")
@RestController
@RequestMapping("/web/addr")
public class AddrApi extends ApiController {
    @Autowired
    private AddrService addrService;
    @LoginRequired
    @ApiOperation(value = "查询我的地址列表", notes = "小程序端")
    @GetMapping("/list")
    @ApiImplicitParams({
            @ApiImplicitParam(paramType = "header", dataType = "String", name = "token", value = "用户token值", required = true),
    })
    public ApiResponse<List<Addr>> list() {
        Addr query = new Addr();
        query.setMemberId(getMemberId());
        query.setDeleted(0);
        return ApiResponse.success("查询成功", addrService.findList(query));
    }
    @LoginRequired
    @ApiOperation(value = "根据ID查询地址", notes = "小程序端")
    @GetMapping("/{id}")
    @ApiImplicitParams({
            @ApiImplicitParam(paramType = "header", dataType = "String", name = "token", value = "用户token值", required = true),
    })
    public ApiResponse<Addr> findById(@PathVariable Integer id) {
        return ApiResponse.success("查询成功", addrService.findById(id));
    }
    @LoginRequired
    @ApiOperation(value = "新增地址", notes = "小程序端")
    @PostMapping("/create")
    @ApiImplicitParams({
            @ApiImplicitParam(paramType = "header", dataType = "String", name = "token", value = "用户token值", required = true),
    })
    public ApiResponse create(@RequestBody Addr addr) {
        addr.setMemberId(getMemberId());
        addrService.create(addr);
        return ApiResponse.success("操作成功");
    }
    @LoginRequired
    @ApiOperation(value = "修改地址", notes = "小程序端")
    @PostMapping("/updateById")
    @ApiImplicitParams({
            @ApiImplicitParam(paramType = "header", dataType = "String", name = "token", value = "用户token值", required = true),
    })
    public ApiResponse updateById(@RequestBody Addr addr) {
        addr.setMemberId(getMemberId());
        addrService.updateById(addr);
        return ApiResponse.success("操作成功");
    }
    @LoginRequired
    @ApiOperation(value = "删除地址", notes = "小程序端")
    @GetMapping("/delete/{id}")
    @ApiImplicitParams({
            @ApiImplicitParam(paramType = "header", dataType = "String", name = "token", value = "用户token值", required = true),
    })
    public ApiResponse deleteById(@PathVariable Integer id) {
        addrService.deleteById(id);
        return ApiResponse.success("操作成功");
    }
    @LoginRequired
    @ApiOperation(value = "设为默认地址", notes = "小程序端")
    @PostMapping("/setDefault/{id}")
    @ApiImplicitParams({
            @ApiImplicitParam(paramType = "header", dataType = "String", name = "token", value = "用户token值", required = true),
    })
    public ApiResponse setDefault(@PathVariable Integer id) {
        Addr addr = new Addr();
        addr.setId(id);
        addr.setIsDefault(1);
        addrService.updateById(addr);
        return ApiResponse.success("操作成功");
    }
}
server/web/src/main/java/com/doumee/api/web/MemberApi.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,113 @@
package com.doumee.api.web;
import com.doumee.core.annotation.LoginRequired;
import com.doumee.core.annotation.trace.Trace;
import com.doumee.core.model.ApiResponse;
import com.doumee.core.model.PageData;
import com.doumee.core.model.PageWrap;
import com.doumee.dao.business.model.IdentityInfo;
import com.doumee.dao.business.model.Member;
import com.doumee.dao.business.model.MemberRevenue;
import com.doumee.dao.dto.UpdMobileRequest;
import com.doumee.dao.dto.WithdrawalDTO;
import com.doumee.dao.dto.WxPhoneRequest;
import com.doumee.dao.vo.AccountResponse;
import com.doumee.dao.vo.UserCenterVO;
import com.doumee.service.business.IdentityInfoService;
import com.doumee.service.business.MemberService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.checkerframework.checker.units.qual.A;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
/**
 * Created by IntelliJ IDEA.
 *
 * @Author : Rk
 * @create 2025/7/10 9:29
 */
@Api(tags = "2、用户信息")
@Trace(exclude = true)
@RestController
@RequestMapping("/web/user")
@Slf4j
public class UserApi extends  ApiController{
    @Autowired
    private MemberService memberService;
//    @Autowired
//    private IdentityInfoService identityInfoService;
//    @Autowired
//    private MemberRevenueService memberRevenueService;
//
//    @Autowired
//    private WithdrawalOrdersService withdrawalOrdersService;
    @ApiOperation(value = "获取系统配置", notes = "小程序端")
    @GetMapping("/getPlatformAboutUs")
    public ApiResponse<UserCenterVO> getPlatformAboutUs() {
        return  ApiResponse.success("查询成功",memberService.getPlatformAboutUs());
    }
    @LoginRequired
    @ApiOperation(value = "获取个人信息", notes = "小程序端")
    @GetMapping("/getMemberInfo")
    @ApiImplicitParams({
            @ApiImplicitParam(paramType = "header", dataType = "String", name = "token", value = "用户token值", required = true),
    })
    public ApiResponse<Member> getMemberInfo() {
        return  ApiResponse.success("查询成功",memberService.getMemberInfo(getMemberId()));
    }
    @LoginRequired
    @ApiOperation(value = "编辑个人信息", notes = "小程序端")
    @PostMapping("/editMemberInfo")
    @ApiImplicitParams({
            @ApiImplicitParam(paramType = "header", dataType = "String", name = "token", value = "用户token值", required = true),
    })
    public ApiResponse editMemberInfo(@RequestBody Member member) {
        member.setId(getMemberId());
        memberService.editMemberInfo(member);
        return  ApiResponse.success("操作成功");
    }
    @LoginRequired
    @ApiOperation("验证手机号")
    @PostMapping("/verifyUserPhone")
    @ApiImplicitParams({
            @ApiImplicitParam(paramType = "header", dataType = "String", name = "token", value = "用户token值", required = true),
    })
    public ApiResponse verifyUserPhone(@RequestBody UpdMobileRequest request) {
        request.setMemberId(getMemberId());
        memberService.verifyUserPhone(request);
        return ApiResponse.success("操作成功");
    }
    @LoginRequired
    @ApiOperation("更换绑定手机号")
    @PostMapping("/updateUserPhone")
    @ApiImplicitParams({
            @ApiImplicitParam(paramType = "header", dataType = "String", name = "token", value = "用户token值", required = true),
    })
    public ApiResponse updateUserPhone(@RequestBody UpdMobileRequest request) {
        request.setMemberId(getMemberId());
        memberService.updateUserPhone(request);
        return ApiResponse.success("操作成功");
    }
}
server/web/src/main/java/com/doumee/api/web/OrdersApi.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,113 @@
package com.doumee.api.web;
import com.doumee.core.annotation.LoginRequired;
import com.doumee.core.annotation.trace.Trace;
import com.doumee.core.model.ApiResponse;
import com.doumee.dao.business.model.Areas;
import com.doumee.dao.business.model.Banner;
import com.doumee.dao.business.model.Category;
import com.doumee.dao.dto.CalculateLocalPriceDTO;
import com.doumee.dao.dto.CalculateRemotePriceDTO;
import com.doumee.dao.vo.AccountResponse;
import com.doumee.dao.vo.PriceCalculateVO;
import com.doumee.service.business.AreasService;
import com.doumee.service.business.BannerService;
import com.doumee.service.business.CategoryService;
import com.doumee.service.business.OrdersService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import javax.validation.Valid;
import java.math.BigDecimal;
import java.util.List;
/**
 * Created by IntelliJ IDEA.
 *
 * @Author : Rk
 * @create 2025/7/15 15:49
 */
@Api(tags = "配置类接口")
@Trace(exclude = true)
@RestController
@RequestMapping("/web/config")
@Slf4j
public class ConfigApi extends ApiController{
    @Autowired
    private CategoryService categoryService;
    @Autowired
    private AreasService areasService;
    @Autowired
    private BannerService bannerService;
    @Autowired
    private OrdersService ordersService;
    @ApiOperation(value = "获取分类列表", notes = "小程序端")
    @GetMapping("/getCategoryList")
    @ApiImplicitParams({
            @ApiImplicitParam(paramType = "query", dataType = "Integer", name = "type", value = "类型:1=车辆类型;2=物品分类;3=物品等级;4=物品尺寸;", required = true)
    })
    public ApiResponse<List<Category>> getCategoryList(@RequestParam Integer type) {
        return  ApiResponse.success("操作成功",categoryService.getCategoryList(type));
    }
    @ApiOperation(value = "获取开放城市列表", notes = "返回已开放城市,含首字母,按首字母排序")
    @GetMapping("/getOpenCityList")
    public ApiResponse<List<Areas>> getOpenCityList() {
        return ApiResponse.success("操作成功", areasService.getOpenCityList());
    }
    @ApiOperation(value = "获取轮播图列表", notes = "根据位置返回轮播图,含图片全路径")
    @GetMapping("/getBannerList")
    @ApiImplicitParams({
            @ApiImplicitParam(paramType = "query", dataType = "Integer", name = "position", value = "位置:0=会员端首页轮播;1=司机APP引导页;", required = true)
    })
    public ApiResponse<List<Banner>> getBannerList(@RequestParam Integer position) {
        return ApiResponse.success("操作成功", bannerService.findListByPosition(position));
    }
    @ApiOperation(value = "获取城市已开通物品尺寸", notes = "根据城市主键查询已开通的物品尺寸(category type=4)")
    @GetMapping("/getCitySizeList")
    @ApiImplicitParams({
            @ApiImplicitParam(paramType = "query", dataType = "Integer", name = "cityId", value = "城市主键", required = true)
    })
    public ApiResponse<List<Category>> getCitySizeList(@RequestParam Integer cityId) {
        return ApiResponse.success("操作成功", categoryService.getCitySizeList(cityId));
    }
    @LoginRequired
    @ApiOperation(value = "计算保价费用", notes = "根据报价金额计算保价费用")
    @GetMapping("/calculateInsuranceFee")
    @ApiImplicitParams({
            @ApiImplicitParam(paramType = "query", dataType = "BigDecimal", name = "declaredValue", value = "报价金额", required = true),
            @ApiImplicitParam(paramType = "header", dataType = "String", name = "token", value = "用户token值", required = true)
    })
    public ApiResponse<BigDecimal> calculateInsuranceFee(@RequestParam BigDecimal declaredValue) {
        return ApiResponse.success("操作成功", ordersService.calculateInsuranceFee(declaredValue));
    }
    @LoginRequired
    @ApiOperation(value = "计算就地存取预估费用", notes = "根据城市、天数、物品类型和数量计算就地存取预估费用")
    @PostMapping("/calculateLocalPrice")
    public ApiResponse<PriceCalculateVO> calculateLocalPrice(@RequestBody @Valid CalculateLocalPriceDTO dto) {
        return ApiResponse.success("操作成功", ordersService.calculateLocalPrice(dto));
    }
    @LoginRequired
    @ApiOperation(value = "计算异地存取预估费用", notes = "根据距离、物品类型和数量计算异地存取预估费用")
    @PostMapping("/calculateRemotePrice")
    public ApiResponse<PriceCalculateVO> calculateRemotePrice(@RequestBody @Valid CalculateRemotePriceDTO dto) {
        return ApiResponse.success("操作成功", ordersService.calculateRemotePrice(dto));
    }
}
server/web/src/main/java/com/doumee/api/web/PaymentCallback.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,157 @@
package com.doumee.api.web.mall;
import com.doumee.api.web.ApiController;
import com.doumee.core.utils.Constants;
import com.doumee.core.utils.ID;
import com.doumee.core.wx.WxMiniConfig;
import com.doumee.dao.business.model.ActivitySign;
import com.doumee.dao.business.model.Fund;
import com.doumee.dao.business.model.Goodsorder;
import com.github.binarywang.wxpay.bean.notify.WxPayNotifyResponse;
import com.github.binarywang.wxpay.bean.notify.WxPayOrderNotifyResult;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
import java.util.Date;
import java.util.Objects;
/**
 * æ”¯ä»˜å›žè°ƒ
 *
 * @Author : Rk
 * @create 2023/3/24 16:57
 */
@Slf4j
@RestController
@CrossOrigin
public class PaymentCallback extends ApiController {
    @PostMapping("/web/api/wxPayNotify")
    public String wxPay_notify(@RequestBody String xmlResult) {
        String wxId = ID.nextGUID();
        log.info("支付回调信息("+wxId+") = > "  + xmlResult);
        if (StringUtils.isEmpty(xmlResult)){
            return null;
        }
        try {
            WxPayOrderNotifyResult result = WxMiniConfig.wxPayService.parseOrderNotifyResult(xmlResult);
            //自定义订单号
            String outTradeNo = result.getOutTradeNo();
            //微信订单号
            String paymentNo = result.getTransactionId();
            if (Constants.SUCCESS_STR.equals(result.getReturnCode())) {
                // æ”¯ä»˜æˆåŠŸ
                switch (result.getAttach()) {
                    //活动参与支付
                    case "ActivitySign": {
                        ActivitySign activitySign = activitySignService.findById(Integer.valueOf(outTradeNo));
                        if(Objects.isNull(activitySign)){
                            return WxPayNotifyResponse.fail( "支付回调信息("+ wxId + ") = > æœªæŸ¥è¯¢åˆ°æ”¯ä»˜å¯¹è±¡ä¿¡æ¯!");
                        }
                        if(activitySign.getStatus().equals(Constants.ONE)){
                            return WxPayNotifyResponse.success("处理成功!");
                        }
                        activitySign.setPayStatus(Constants.ONE);
                        activitySign.setPayDate(new Date());
                        activitySign.setPayOrderId(paymentNo);
                        activitySign.setStatus(Constants.ONE);
                        activitySignService.updateById(activitySign);
                        break;
                    }
                    case "terraceMall": {
                        Goodsorder DBGoodsOrder = new Goodsorder();
                        DBGoodsOrder.setCode(Long.valueOf(outTradeNo));
                        Goodsorder goodsOrder = goodsorderService.findOne(DBGoodsOrder);
                        if(Objects.isNull(goodsOrder)){
                            return WxPayNotifyResponse.fail( "支付回调信息("+ wxId + ") = > æœªæŸ¥è¯¢åˆ°æ”¯ä»˜å¯¹è±¡ä¿¡æ¯!");
                        }
                        if(goodsOrder.getStatus().equals(Constants.ONE)){
                            return WxPayNotifyResponse.success("处理成功!");
                        }
                        goodsOrder.setPayStatus(Constants.ONE);
                        goodsOrder.setPayDate(new Date());
                        goodsOrder.setPayOrderId(paymentNo);
                        goodsOrder.setStatus(Constants.OrderStatus.PAY_DONE.getKey());
                        goodsOrder.setPayMethod(Constants.ZERO);
                        goodsorderService.updateById(goodsOrder);
                        //生成 å’–啡计划订单明细表
                        if(goodsOrder.getType().equals(Constants.TWO)){
                            planorderDetailService.createPlanOrderDetail(goodsOrder);
                        }
                        Fund fund = new Fund();
                        fund.setOrderCode(goodsOrder.getPayOrderId());
                        fund.setCreator(goodsOrder.getMemberId());
                        fund.setCreateDate(new Date());
                        fund.setIsdeleted(Constants.ZERO);
                        fund.setRemark(goodsOrder.getCode().toString());
                        fund.setMemberId(goodsOrder.getMemberId());
                        fund.setTitle("订单支付");
                        fund.setContent("订单支付");
                        fund.setObjId(goodsOrder.getId());
                        fund.setObjType(Constants.ONE);
                        fund.setType(Constants.ZERO);
                        fund.setNum(goodsOrder.getPrice());
                        fundService.create(fund);
                        break;
                    }
                    case "shopGoods": {
                        Goodsorder DBGoodsOrder = new Goodsorder();
                        DBGoodsOrder.setCode(Long.valueOf(outTradeNo));
                        Goodsorder goodsOrder = goodsorderService.findOne(DBGoodsOrder);
                        if(Objects.isNull(goodsOrder)){
                            return WxPayNotifyResponse.fail( "支付回调信息("+ wxId + ") = > æœªæŸ¥è¯¢åˆ°æ”¯ä»˜å¯¹è±¡ä¿¡æ¯!");
                        }
                        if(goodsOrder.getStatus().equals(Constants.ONE)){
                            return WxPayNotifyResponse.success("处理成功!");
                        }
                        goodsOrder.setPayStatus(Constants.ONE);
                        goodsOrder.setPayDate(new Date());
                        goodsOrder.setPayOrderId(paymentNo);
                        goodsOrder.setStatus(Constants.OrderStatus.PAY_DONE.getKey());
                        //生成核销码
                        if(Constants.equalsInteger(goodsOrder.getReceiveType(),Constants.ONE)){
                            goodsOrder.setExchangeCode(goodsorderService.createExchangeCode());
                        }
                        goodsOrder.setPayMethod(Constants.ZERO);
                        goodsorderService.updateById(goodsOrder);
                        if(Objects.nonNull(goodsOrder.getPickUpShopId())){
                            //发送站内信 - ç»é”€å•†
                            noticeService.orderPayNotice(goodsOrder.getPickUpShopId(),goodsOrder.getId(),goodsOrder.getReceiveType());
                        }
                        Fund fund = new Fund();
                        fund.setOrderCode(goodsOrder.getPayOrderId());
                        fund.setCreator(goodsOrder.getMemberId());
                        fund.setCreateDate(new Date());
                        fund.setIsdeleted(Constants.ZERO);
                        fund.setRemark(goodsOrder.getCode().toString());
                        fund.setMemberId(goodsOrder.getMemberId());
                        fund.setTitle("订单支付");
                        fund.setContent("订单支付");
                        fund.setObjId(goodsOrder.getId());
                        fund.setObjType(Constants.ONE);
                        fund.setType(Constants.ZERO);
                        fund.setNum(goodsOrder.getPrice());
                        fundService.create(fund);
                        break;
                    }
                }
                return WxPayNotifyResponse.success("处理成功!");
            }
            return WxPayNotifyResponse.fail(result.getReturnMsg());
        } catch (Exception e) {
            e.printStackTrace();
            log.error("微信回调结果异常,异常原因{}", e.getLocalizedMessage());
            return WxPayNotifyResponse.fail(e.getMessage());
        }
    }
}
server/web/src/main/java/com/doumee/api/web/UserApi.java
ÎļþÒÑɾ³ý