rk
4 小时以前 c6675b55023dff3c4f441ab0bb9493198949126e
小程序   接口开发
已添加28个文件
已修改24个文件
2693 ■■■■■ 文件已修改
server/dmmall_admin/src/main/java/com/doumee/api/business/MemberBankController.java 90 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmmall_admin/src/main/java/com/doumee/api/business/WithdrawRecordController.java 90 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmmall_service/db/business.member_bank.permissions.sql 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmmall_service/db/business.withdraw_record.permissions.sql 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmmall_service/src/main/java/com/doumee/config/Jwt/JwtPayLoad.java 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmmall_service/src/main/java/com/doumee/config/Jwt/JwtTokenUtil.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmmall_service/src/main/java/com/doumee/config/Jwt/WebMvcConfig.java 67 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmmall_service/src/main/java/com/doumee/config/annotation/LoginShopRequired.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmmall_service/src/main/java/com/doumee/core/utils/Constants.java 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmmall_service/src/main/java/com/doumee/dao/business/GoodsorderMapper.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmmall_service/src/main/java/com/doumee/dao/business/MemberBankMapper.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmmall_service/src/main/java/com/doumee/dao/business/WithdrawRecordMapper.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmmall_service/src/main/java/com/doumee/dao/business/model/Goodsorder.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmmall_service/src/main/java/com/doumee/dao/business/model/Member.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmmall_service/src/main/java/com/doumee/dao/business/model/MemberBank.java 74 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmmall_service/src/main/java/com/doumee/dao/business/model/Shop.java 5 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmmall_service/src/main/java/com/doumee/dao/business/model/WithdrawRecord.java 105 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmmall_service/src/main/java/com/doumee/dao/web/dto/IntegralRecordDTO.java 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmmall_service/src/main/java/com/doumee/dao/web/dto/ShopLoginDTO.java 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmmall_service/src/main/java/com/doumee/dao/web/dto/shop/ShopListDTO.java 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmmall_service/src/main/java/com/doumee/dao/web/request/MemberBankSaveRequest.java 44 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmmall_service/src/main/java/com/doumee/dao/web/request/MyCustomerRequest.java 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmmall_service/src/main/java/com/doumee/dao/web/request/SaleReportRequest.java 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmmall_service/src/main/java/com/doumee/dao/web/request/ShopOrderRequest.java 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmmall_service/src/main/java/com/doumee/dao/web/request/WithdrawApplyRequest.java 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmmall_service/src/main/java/com/doumee/dao/web/request/WxPhoneRequest.java 7 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmmall_service/src/main/java/com/doumee/dao/web/response/AccountResponse.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmmall_service/src/main/java/com/doumee/dao/web/response/IntegralDataResponse.java 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmmall_service/src/main/java/com/doumee/dao/web/response/MyCustomerResponse.java 35 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmmall_service/src/main/java/com/doumee/dao/web/response/SaleReportOrderResponse.java 66 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmmall_service/src/main/java/com/doumee/dao/web/response/SaleReportResponse.java 35 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmmall_service/src/main/java/com/doumee/dao/web/response/ShopInfoResponse.java 71 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmmall_service/src/main/java/com/doumee/dao/web/response/goods/MemberOrderResponse.java 9 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmmall_service/src/main/java/com/doumee/service/business/GoodsorderService.java 17 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmmall_service/src/main/java/com/doumee/service/business/IntegralService.java 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmmall_service/src/main/java/com/doumee/service/business/MemberBankService.java 103 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmmall_service/src/main/java/com/doumee/service/business/MemberService.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmmall_service/src/main/java/com/doumee/service/business/ShopService.java 58 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmmall_service/src/main/java/com/doumee/service/business/WithdrawRecordService.java 106 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmmall_service/src/main/java/com/doumee/service/business/impl/GoodsorderServiceImpl.java 72 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmmall_service/src/main/java/com/doumee/service/business/impl/IntegralServiceImpl.java 86 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmmall_service/src/main/java/com/doumee/service/business/impl/MemberBankServiceImpl.java 207 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmmall_service/src/main/java/com/doumee/service/business/impl/MemberCouponServiceImpl.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmmall_service/src/main/java/com/doumee/service/business/impl/MemberServiceImpl.java 224 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmmall_service/src/main/java/com/doumee/service/business/impl/ShopServiceImpl.java 264 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmmall_service/src/main/java/com/doumee/service/business/impl/WithdrawRecordServiceImpl.java 274 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmmall_web/src/main/java/com/doumee/api/web/AccountApi.java 21 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmmall_web/src/main/java/com/doumee/api/web/ApiController.java 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmmall_web/src/main/java/com/doumee/api/web/MemberBankApi.java 57 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmmall_web/src/main/java/com/doumee/api/web/ShopApi.java 52 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmmall_web/src/main/java/com/doumee/api/web/mall/IntegralApi.java 63 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmmall_web/src/main/java/com/doumee/api/web/mall/OrderApi.java 56 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmmall_admin/src/main/java/com/doumee/api/business/MemberBankController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,90 @@
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.PageWrap;
import com.doumee.core.model.PageData;
import com.doumee.dao.business.model.MemberBank;
import com.doumee.service.business.MemberBankService;
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 æ±Ÿè¹„蹄
 * @date 2026/01/16 11:50
 */
@Api(tags = "用户提现银行信息")
@RestController
@RequestMapping("/business/memberBank")
public class MemberBankController extends BaseController {
    @Autowired
    private MemberBankService memberBankService;
    @PreventRepeat
    @ApiOperation("新建")
    @PostMapping("/create")
    @RequiresPermissions("business:memberbank:create")
    public ApiResponse create(@RequestBody MemberBank memberBank) {
        return ApiResponse.success(memberBankService.create(memberBank));
    }
    @ApiOperation("根据ID删除")
    @GetMapping("/delete/{id}")
    @RequiresPermissions("business:memberbank:delete")
    public ApiResponse deleteById(@PathVariable Integer id) {
        memberBankService.deleteById(id);
        return ApiResponse.success(null);
    }
    @ApiOperation("批量删除")
    @GetMapping("/delete/batch")
    @RequiresPermissions("business:memberbank: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));
        }
        memberBankService.deleteByIdInBatch(idList);
        return ApiResponse.success(null);
    }
    @ApiOperation("根据ID修改")
    @PostMapping("/updateById")
    @RequiresPermissions("business:memberbank:update")
    public ApiResponse updateById(@RequestBody MemberBank memberBank) {
        memberBankService.updateById(memberBank);
        return ApiResponse.success(null);
    }
    @ApiOperation("分页查询")
    @PostMapping("/page")
    @RequiresPermissions("business:memberbank:query")
    public ApiResponse<PageData<MemberBank>> findPage (@RequestBody PageWrap<MemberBank> pageWrap) {
        return ApiResponse.success(memberBankService.findPage(pageWrap));
    }
    @ApiOperation("导出Excel")
    @PostMapping("/exportExcel")
    @RequiresPermissions("business:memberbank:exportExcel")
    public void exportExcel (@RequestBody PageWrap<MemberBank> pageWrap, HttpServletResponse response) {
        ExcelExporter.build(MemberBank.class).export(memberBankService.findPage(pageWrap).getRecords(), "用户提现银行信息", response);
    }
    @ApiOperation("根据ID查询")
    @GetMapping("/{id}")
    @RequiresPermissions("business:memberbank:query")
    public ApiResponse findById(@PathVariable Integer id) {
        return ApiResponse.success(memberBankService.findById(id));
    }
}
server/dmmall_admin/src/main/java/com/doumee/api/business/WithdrawRecordController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,90 @@
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.PageWrap;
import com.doumee.core.model.PageData;
import com.doumee.dao.business.model.WithdrawRecord;
import com.doumee.service.business.WithdrawRecordService;
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 æ±Ÿè¹„蹄
 * @date 2026/01/16 11:50
 */
@Api(tags = "用户提现记录")
@RestController
@RequestMapping("/business/withdrawRecord")
public class WithdrawRecordController extends BaseController {
    @Autowired
    private WithdrawRecordService withdrawRecordService;
    @PreventRepeat
    @ApiOperation("新建")
    @PostMapping("/create")
    @RequiresPermissions("business:withdrawrecord:create")
    public ApiResponse create(@RequestBody WithdrawRecord withdrawRecord) {
        return ApiResponse.success(withdrawRecordService.create(withdrawRecord));
    }
    @ApiOperation("根据ID删除")
    @GetMapping("/delete/{id}")
    @RequiresPermissions("business:withdrawrecord:delete")
    public ApiResponse deleteById(@PathVariable Integer id) {
        withdrawRecordService.deleteById(id);
        return ApiResponse.success(null);
    }
    @ApiOperation("批量删除")
    @GetMapping("/delete/batch")
    @RequiresPermissions("business:withdrawrecord: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));
        }
        withdrawRecordService.deleteByIdInBatch(idList);
        return ApiResponse.success(null);
    }
    @ApiOperation("根据ID修改")
    @PostMapping("/updateById")
    @RequiresPermissions("business:withdrawrecord:update")
    public ApiResponse updateById(@RequestBody WithdrawRecord withdrawRecord) {
        withdrawRecordService.updateById(withdrawRecord);
        return ApiResponse.success(null);
    }
    @ApiOperation("分页查询")
    @PostMapping("/page")
    @RequiresPermissions("business:withdrawrecord:query")
    public ApiResponse<PageData<WithdrawRecord>> findPage (@RequestBody PageWrap<WithdrawRecord> pageWrap) {
        return ApiResponse.success(withdrawRecordService.findPage(pageWrap));
    }
    @ApiOperation("导出Excel")
    @PostMapping("/exportExcel")
    @RequiresPermissions("business:withdrawrecord:exportExcel")
    public void exportExcel (@RequestBody PageWrap<WithdrawRecord> pageWrap, HttpServletResponse response) {
        ExcelExporter.build(WithdrawRecord.class).export(withdrawRecordService.findPage(pageWrap).getRecords(), "用户提现记录", response);
    }
    @ApiOperation("根据ID查询")
    @GetMapping("/{id}")
    @RequiresPermissions("business:withdrawrecord:query")
    public ApiResponse findById(@PathVariable Integer id) {
        return ApiResponse.success(withdrawRecordService.findById(id));
    }
}
server/dmmall_service/db/business.member_bank.permissions.sql
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,6 @@
INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:memberbank:create', '新建用户提现银行信息', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:memberbank:delete', '删除用户提现银行信息', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:memberbank:update', '修改用户提现银行信息', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:memberbank:query', '查询用户提现银行信息', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:memberbank:exportExcel', '导出用户提现银行信息(Excel)', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
server/dmmall_service/db/business.withdraw_record.permissions.sql
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,6 @@
INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:withdrawrecord:create', '新建用户提现记录', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:withdrawrecord:delete', '删除用户提现记录', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:withdrawrecord:update', '修改用户提现记录', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:withdrawrecord:query', '查询用户提现记录', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:withdrawrecord:exportExcel', '导出用户提现记录(Excel)', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
server/dmmall_service/src/main/java/com/doumee/config/Jwt/JwtPayLoad.java
@@ -18,14 +18,14 @@
    /**
     * ç”¨æˆ·id
     */
    private Integer memberId;
    private String memberId;
    private long expire;
    public JwtPayLoad() {
    }
    public JwtPayLoad(Integer memberId) {
    public JwtPayLoad(String memberId) {
        this.memberId = memberId;
    }
@@ -52,7 +52,7 @@
            return new JwtPayLoad();
        } else {
            JwtPayLoad jwtPayLoad = new JwtPayLoad();
            jwtPayLoad.setMemberId((Integer) map.get("memberId"));
            jwtPayLoad.setMemberId(map.get("memberId").toString());
            return jwtPayLoad;
        }
server/dmmall_service/src/main/java/com/doumee/config/Jwt/JwtTokenUtil.java
@@ -43,6 +43,8 @@
    public static final String HEADER_KEY = "token";
    //取值名称
    public static final String UserId_Name = "AppUserId";
    //取值名称
    public static final String ShopId_Name = "AppShopId";
    //加密密钥
    private final static String jwtSecret = "MhAjU9poLf8ko54K25XBDtonaL33vtt1";
    //过期时间(s) 86400L=1天 604800L=7天
@@ -126,14 +128,14 @@
    /**
     * ç”Ÿæˆtoken,根据userId和过期时间
     */
    public static String generateToken(Integer userId, Date exppiredDate, Map<String, Object> claims) {
    public static String generateToken(String userId, Date exppiredDate, Map<String, Object> claims) {
        final Date createdDate = new Date();
        String secret = getJwtSecret();
        if (claims == null) {
            return Jwts.builder()
                    .setSubject(userId.toString())
                    .setSubject(userId)
                    .setIssuedAt(createdDate)
                    .setExpiration(exppiredDate)
                    .signWith(SignatureAlgorithm.HS512, secret)
@@ -141,7 +143,7 @@
        } else {
            return Jwts.builder()
                    .setClaims(claims)
                    .setSubject(userId.toString())
                    .setSubject(userId)
                    .setIssuedAt(createdDate)
                    .setExpiration(exppiredDate)
                    .signWith(SignatureAlgorithm.HS512, secret)
server/dmmall_service/src/main/java/com/doumee/config/Jwt/WebMvcConfig.java
@@ -1,6 +1,7 @@
package com.doumee.config.Jwt;
import com.doumee.config.annotation.LoginRequired;
import com.doumee.config.annotation.LoginShopRequired;
import com.doumee.core.constants.ResponseStatus;
import com.doumee.core.exception.BusinessException;
import com.doumee.core.utils.Constants;
@@ -51,7 +52,7 @@
                    //获取token
                    String token = request.getHeader(JwtTokenUtil.HEADER_KEY);  // ä»Ž http è¯·æ±‚头中取出 token
                    if (StringUtils.isNotBlank(token)) {
                        checkLogin(request,response);
                        checkMemberLogin(request,response);
                    } else {
                        throw new BusinessException(ResponseStatus.NO_LOGIN.getCode(),"未登录");
                    }
@@ -59,11 +60,29 @@
                    //获取token
                    String token = request.getHeader(JwtTokenUtil.HEADER_KEY);  // ä»Ž http è¯·æ±‚头中取出 token
                    if (StringUtils.isNotBlank(token)) {
                        checkLogin(request,response);
                        checkMemberLogin(request,response);
                    } else {
                        throw new BusinessException(ResponseStatus.NO_LOGIN.getCode(),"未登录");
                    }
                }else if (beanType.isAnnotationPresent(LoginShopRequired.class)) {
                    //获取token
                    String token = request.getHeader(JwtTokenUtil.HEADER_KEY);  // ä»Ž http è¯·æ±‚头中取出 token
                    if (StringUtils.isNotBlank(token)) {
                        checkShopLogin(request,response);
                    } else {
                        throw new BusinessException(ResponseStatus.NO_LOGIN.getCode(),"未登录");
                    }
                }else if (handlerMethod.hasMethodAnnotation(LoginShopRequired.class)){
                    //获取token
                    String token = request.getHeader(JwtTokenUtil.HEADER_KEY);  // ä»Ž http è¯·æ±‚头中取出 token
                    if (StringUtils.isNotBlank(token)) {
                        checkShopLogin(request,response);
                    } else {
                        throw new BusinessException(ResponseStatus.NO_LOGIN.getCode(),"未登录");
                    }
                }
                return true;
            }
        };
@@ -72,7 +91,7 @@
    public Boolean checkLogin(HttpServletRequest request, HttpServletResponse response){
    public Boolean checkMemberLogin(HttpServletRequest request, HttpServletResponse response){
        String token = request.getHeader(JwtTokenUtil.HEADER_KEY);
        try {
            //判断Token是否超时
@@ -81,7 +100,11 @@
                throw new BusinessException(ResponseStatus.TOKEN_EXCEED_TIME.getCode(),"长时间未操作,请重新登录");
            }
            //获取账号ID
            Integer memberId = JwtTokenUtil.getJwtPayLoad(token).getMemberId();
            String memberIdInfo = JwtTokenUtil.getJwtPayLoad(token).getMemberId();
            if(StringUtils.isBlank(memberIdInfo)||!memberIdInfo.startsWith(Constants.MEMBER_PREFIX)){
                throw new BusinessException(ResponseStatus.NO_LOGIN.getCode(),"用户信息出错");
            }
            Integer memberId = Integer.valueOf(memberIdInfo.replace(Constants.MEMBER_PREFIX,""));
            Integer isDeleted = dao.queryForObject(" select COALESCE(ISDELETED,0)  from Member where id  = ?", Integer.class, memberId);
            if(isDeleted== Constants.ONE){
                throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"用户已删除,请联系管理员");
@@ -102,6 +125,42 @@
        }
    }
    public Boolean checkShopLogin(HttpServletRequest request, HttpServletResponse response){
        String token = request.getHeader(JwtTokenUtil.HEADER_KEY);
        try {
            //判断Token是否超时
            boolean expiration = JwtTokenUtil.isTokenExpired(token);
            if (expiration) {
                throw new BusinessException(ResponseStatus.TOKEN_EXCEED_TIME.getCode(),"长时间未操作,请重新登录");
            }
            //获取账号ID
            String shopInfo = JwtTokenUtil.getJwtPayLoad(token).getMemberId();
            if(StringUtils.isBlank(shopInfo)||!shopInfo.startsWith(Constants.SHOP_PREFIX)){
                throw new BusinessException(ResponseStatus.NO_LOGIN.getCode(),"用户信息出错");
            }
            Integer shopId = Integer.valueOf(shopInfo.replace(Constants.SHOP_PREFIX,""));
            Integer isDeleted = dao.queryForObject(" select COALESCE(ISDELETED,0)  from shop where id  = ?", Integer.class, shopId);
            if(isDeleted== Constants.ONE){
                throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"用户已删除,请联系管理员");
            }
            Integer isForbidden = dao.queryForObject(" select COALESCE(STATUS,0)  from shop where id  = ?", Integer.class, shopId);
            if(isForbidden== Constants.ONE){
                throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"用户已禁用,请联系管理员");
            }
            Integer count = dao.queryForObject("select count(1) from shop where id  = ?", Integer.class, shopId);
            if (count != null && count > 0) {
                request.setAttribute(JwtTokenUtil.ShopId_Name, shopId);
                return true;
            }else{
                throw new BusinessException(ResponseStatus.NO_LOGIN.getCode(),"用户信息出错");
            }
        } catch (IllegalArgumentException | JwtException e) {
            throw new BusinessException(ResponseStatus.NO_LOGIN.getCode(),"未登录");
        }
    }
    @Bean
    public RestTemplate getRestTemplate(){
        return new RestTemplate();
server/dmmall_service/src/main/java/com/doumee/config/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/dmmall_service/src/main/java/com/doumee/core/utils/Constants.java
@@ -42,6 +42,9 @@
    public static final String ORDER_SET ="ORDER_SET" ;
    public static final String INTEGRAL_SET ="INTEGRAL_SET" ;
    public static final String MEMBER_PREFIX  = "member_";
    public static final String SHOP_PREFIX  = "shop_";
    /**
     * mq tag
     */
@@ -128,11 +131,14 @@
    public static final String COFFEE_ARTICLE_BACKGROUND = "COFFEE_ARTICLE_BACKGROUND";
    public static final String TRANSFER_FILE = "TRANSFER_FILE";
    public interface RedisKeys {
        public static final String GOODSORDER_KEY = "ordercode_";
        public static final String ACTIVITY_SIGN_KEY = "actcode_";
        public static final String AFTERSALE_KEY = "salecode_";
        public static final String WITHDRAW_KEY = "withdraw_";
    }
    /**
     * ä¼ä¸šæ•°æ®æ¥æº 0平台注册 1后台导入
@@ -326,6 +332,7 @@
        SHOP_PICTURE(7, "商家图片多图", "商家图片多图"),
        AFTERSALE_APPLY(8, "申请售后补充说明附件", "申请售后补充说明附件"),
        AFTERSALE_KD(9, "申请售后邮寄说明附件", "申请售后邮寄说明附件"),
        TRANSFER_FILE(10, "打款凭证", "打款凭证"),
        ;
        // æˆå‘˜å˜é‡
        private String name;
@@ -869,7 +876,11 @@
        ORDER_DONATE(15,"订单赠送积分","订单赠送积分",0),
        ORDER_DONE_AMOUNT(16,"订单结算金额","订单结算金额",0),
        SHOP_ORDER_SETTLEMENT(16,"下单结算金额","下单结算金额",0), //经销商下单结算金额
        WITHDRAW_APPLY(17,"余额提现","余额提现",0), //经销商下单结算金额
        SHOP_ORDER_CANCEL_SETTLEMENT(17,"取消订单结算金额返还","取消订单结算金额返还",0), //取消订单结算金额返还
        SHOP_YEAR_SETTLEMENT(18,"年度结算","年度结算",0) //年度结算
        ;
server/dmmall_service/src/main/java/com/doumee/dao/business/GoodsorderMapper.java
@@ -30,7 +30,7 @@
    IPage<MemberOrderResponse> goodsOrderPage(IPage<MemberOrderResponse> page, @Param(Constants.WRAPPER) Wrapper wrapper);
    @Select(" select g.CODE AS code ,  g.id as orderId , g.CREATE_DATE as createDate    , g.TYPE as orderType , g.STATUS as orderStatus , g.IS_COMMENT as isComment , g.PAY_STATUS as  payStatus ," +
    @Select(" select g.CODE AS code , g.remark as remark ,  g.id as orderId , g.MEMBER_ID as memberId , g.CREATE_DATE as createDate    , g.TYPE as orderType , g.STATUS as orderStatus , g.IS_COMMENT as isComment , g.PAY_STATUS as  payStatus ," +
            " g.COUPON_PRICE as couponPrice , g.price , g.LINKNAME  as linkName , g.LINKPHONE as linkPhone , g.LINKADDR as linkAddress , " +
            "g.KD_DATE as kdDate , g.KD_NAME as kdName  , g.KD_CODE as kdCode , g.INTEGRAL_PRICE as integral , SUBDATE(g.CREATE_DATE,interval - 15 minute) as cancelDate , g.PAY_DATE AS payDate , g.DONE_DATE as doneDate " +
            " , g.MEMBER_INFO , g.RECEIVE_TYPE as receiveType, s.name as shopName ,s.id as shopId,g.exchange_code as exchangeCode " +
server/dmmall_service/src/main/java/com/doumee/dao/business/MemberBankMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,12 @@
package com.doumee.dao.business;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.doumee.dao.business.model.MemberBank;
/**
 * @author æ±Ÿè¹„蹄
 * @date 2026/01/16 11:50
 */
public interface MemberBankMapper extends BaseMapper<MemberBank> {
}
server/dmmall_service/src/main/java/com/doumee/dao/business/WithdrawRecordMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,12 @@
package com.doumee.dao.business;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.doumee.dao.business.model.WithdrawRecord;
/**
 * @author æ±Ÿè¹„蹄
 * @date 2026/01/16 11:50
 */
public interface WithdrawRecordMapper extends BaseMapper<WithdrawRecord> {
}
server/dmmall_service/src/main/java/com/doumee/dao/business/model/Goodsorder.java
@@ -224,6 +224,9 @@
    @ApiModelProperty(value = "电话")
    @TableField(exist = false)
    private String phone;
    @ApiModelProperty(value = "头像信息")
    @TableField(exist = false)
    private String imgurl;
    @ApiModelProperty(value = "收货地址")
    @TableField(exist = false)
@@ -263,4 +266,8 @@
    @TableField(exist = false)
    private String everyDay;
    @ApiModelProperty(value = "订单结算金额")
    @TableField(exist = false)
    private BigDecimal shopSettlement;
}
server/dmmall_service/src/main/java/com/doumee/dao/business/model/Member.java
@@ -152,6 +152,9 @@
    @ApiModelProperty(value = "绑定商铺主键 shop:id åˆ†é”€äºº")
    private Integer bindShopId;
    @ApiModelProperty(value = "绑定时间")
    private Date bindShopDate;
    @ApiModelProperty(value = "文件地址全路径")
    @TableField(exist = false)
    private String imgFullUrl;
@@ -169,4 +172,7 @@
    @TableField(exist = false)
    private Date endtime;
}
server/dmmall_service/src/main/java/com/doumee/dao/business/model/MemberBank.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,74 @@
package com.doumee.dao.business.model;
import com.doumee.core.annotation.excel.ExcelColumn;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import com.fasterxml.jackson.annotation.JsonFormat;
import java.util.Date;
/**
 * ç”¨æˆ·æçŽ°é“¶è¡Œä¿¡æ¯
 * @author æ±Ÿè¹„蹄
 * @date 2026/01/16 11:50
 */
@Data
@ApiModel("用户提现银行信息")
@TableName("`member_bank`")
public class MemberBank {
    @TableId(type = IdType.AUTO)
    @ApiModelProperty(value = "主键", example = "1")
    @ExcelColumn(name="主键")
    private Integer id;
    @ApiModelProperty(value = "创建人编码", example = "1")
    @ExcelColumn(name="创建人编码")
    private Integer creator;
    @ApiModelProperty(value = "创建时间")
    @ExcelColumn(name="创建时间")
    @JsonFormat(pattern = "yyyy-MM-dd")
    private Date createDate;
    @ApiModelProperty(value = "更新人编码", example = "1")
    @ExcelColumn(name="更新人编码")
    private Integer editor;
    @ApiModelProperty(value = "更新时间")
    @ExcelColumn(name="更新时间")
    @JsonFormat(pattern = "yyyy-MM-dd")
    private Date editDate;
    @ApiModelProperty(value = "是否删除0否 1是", example = "1")
    @ExcelColumn(name="是否删除0否 1是")
    private Integer isdeleted;
    @ApiModelProperty(value = "备注")
    @ExcelColumn(name="备注")
    private String remark;
    @ApiModelProperty(value = "银行名称")
    @ExcelColumn(name="银行名称")
    private String bankName;
    @ApiModelProperty(value = "银行账户")
    @ExcelColumn(name="银行账户")
    private String bankAccount;
    @ApiModelProperty(value = "开户人姓名")
    @ExcelColumn(name="开户人姓名")
    private String name;
    @ApiModelProperty(value = "用户主键(关联member表)", example = "1")
    @ExcelColumn(name="用户主键(关联member表)")
    private Integer memberId;
    @ApiModelProperty(value = "是否默认 0否 1是", example = "1")
    @ExcelColumn(name="是否默认 0否 1是")
    private Integer isDefault;
}
server/dmmall_service/src/main/java/com/doumee/dao/business/model/Shop.java
@@ -87,6 +87,9 @@
    @ApiModelProperty(value = "法人电话")
    @ExcelColumn(name="法人电话")
    private String legalPersonPhone;
    @ApiModelProperty(value = "微信openId")
    @ExcelColumn(name="微信openId")
    private String openId;
    @ApiModelProperty(value = "身份证反面照")
    @ExcelColumn(name="身份证反面照")
@@ -123,7 +126,7 @@
    @ExcelColumn(name="积分累计")
    private BigDecimal totalIntegral;
    @ApiModelProperty(value = "可提成金额")
    @ApiModelProperty(value = "可提现金额")
    @ExcelColumn(name="可提成金额")
    private BigDecimal amount;
server/dmmall_service/src/main/java/com/doumee/dao/business/model/WithdrawRecord.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,105 @@
package com.doumee.dao.business.model;
import com.baomidou.mybatisplus.annotation.TableField;
import com.doumee.core.annotation.excel.ExcelColumn;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import com.fasterxml.jackson.annotation.JsonFormat;
import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
/**
 * ç”¨æˆ·æçŽ°è®°å½•
 * @author æ±Ÿè¹„蹄
 * @date 2026/01/16 11:50
 */
@Data
@ApiModel("用户提现记录")
@TableName("`withdraw_record`")
public class WithdrawRecord {
    @TableId(type = IdType.AUTO)
    @ApiModelProperty(value = "主键", example = "1")
    @ExcelColumn(name="主键")
    private Integer id;
    @ApiModelProperty(value = "创建人编码", example = "1")
    @ExcelColumn(name="创建人编码")
    private Integer creator;
    @ApiModelProperty(value = "创建时间")
    @ExcelColumn(name="创建时间")
    @JsonFormat(pattern = "yyyy-MM-dd")
    private Date createDate;
    @ApiModelProperty(value = "更新人编码", example = "1")
    @ExcelColumn(name="更新人编码")
    private Integer editor;
    @ApiModelProperty(value = "更新时间")
    @ExcelColumn(name="更新时间")
    @JsonFormat(pattern = "yyyy-MM-dd")
    private Date editDate;
    @ApiModelProperty(value = "是否删除0否 1是", example = "1")
    @ExcelColumn(name="是否删除0否 1是")
    private Integer isdeleted;
    @ApiModelProperty(value = "备注")
    @ExcelColumn(name="备注")
    private String remark;
    @ApiModelProperty(value = "用户主键(关联member表)", example = "1")
    @ExcelColumn(name="用户主键(关联member表)")
    private Integer memberId;
    @ApiModelProperty(value = "流水号", example = "1")
    @ExcelColumn(name="流水号")
    private Long code;
    @ApiModelProperty(value = "提现金额", example = "1")
    @ExcelColumn(name="提现金额")
    private BigDecimal amount;
    @ApiModelProperty(value = "银行主键(关联 member_bank è¡¨ï¼‰", example = "1")
    @ExcelColumn(name="银行主键(关联 member_bank è¡¨ï¼‰")
    private Integer bankId;
    @ApiModelProperty(value = "状态:0=待审批;1=审批通过;2=审批驳回", example = "1")
    @ExcelColumn(name="状态:0=待审批;1=审批通过;2=审批驳回")
    private Integer status;
    @ApiModelProperty(value = "审批人主键", example = "1")
    @ExcelColumn(name="审批人主键")
    private Integer auditUser;
    @ApiModelProperty(value = "审批时间")
    @ExcelColumn(name="审批时间")
    @JsonFormat(pattern = "yyyy-MM-dd")
    private Date auditTime;
    @ApiModelProperty(value = "审批备注")
    @ExcelColumn(name="审批备注")
    private String auditRemark;
    @ApiModelProperty(value = "打款银行")
    @ExcelColumn(name="打款银行")
    private String payBank;
    @ApiModelProperty(value = "提现银行名称", example = "1")
    @TableField(exist = false)
    private String bankName;
    @ApiModelProperty(value = "打款凭证", example = "1")
    @TableField(exist = false)
    private List<Multifile> payFileList;
}
server/dmmall_service/src/main/java/com/doumee/dao/web/dto/IntegralRecordDTO.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,24 @@
package com.doumee.dao.web.dto;
import com.doumee.core.annotation.excel.ExcelColumn;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.math.BigDecimal;
import java.util.Date;
@Data
@ApiModel("积分明细查询请求类")
public class IntegralRecordDTO {
    @ApiModelProperty(value = "收支类型 0收入 1支出")
    private Integer type;
    @ApiModelProperty(value = "数据类型:0=消费者积分;1=经销商积分;2=经销商结算金额;")
    private Integer userType;
    @ApiModelProperty(value = "用户主键或商户主键")
    private Integer memberId;
}
server/dmmall_service/src/main/java/com/doumee/dao/web/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/dmmall_service/src/main/java/com/doumee/dao/web/dto/shop/ShopListDTO.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,23 @@
package com.doumee.dao.web.dto.shop;
import com.doumee.dao.web.dto.MultiFileDTO;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.math.BigDecimal;
import java.util.List;
@Data
@ApiModel("小程序 é€‰æ‹©å•†æˆ·è¯·æ±‚ç±»")
public class ShopListDTO {
    @ApiModelProperty(value = "城市主键", example = "1")
    private Integer cityId;
    @ApiModelProperty(value = "定位维度", example = "1")
    private String lat;
    @ApiModelProperty(value = "定位经度", example = "1")
    private String lgt;
    @ApiModelProperty(value = "店铺名称", example = "1")
    private String shopName;
}
server/dmmall_service/src/main/java/com/doumee/dao/web/request/MemberBankSaveRequest.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,44 @@
package com.doumee.dao.web.request;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
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;
/**
 * ç”¨æˆ·æçŽ°é“¶è¡Œä¿¡æ¯
 * @author æ±Ÿè¹„蹄
 * @date 2026/01/16 11:50
 */
@Data
@ApiModel("用户提现银行信息保存请求类")
public class MemberBankSaveRequest {
    @ApiModelProperty(value = "主键", example = "1")
    private Integer id;
    @ApiModelProperty(value = "银行名称")
    private String bankName;
    @ApiModelProperty(value = "银行账户")
    private String bankAccount;
    @ApiModelProperty(value = "开户人姓名")
    private String name;
    @ApiModelProperty(value = "是否默认 0否 1是", example = "1")
    private Integer isDefault;
    @ApiModelProperty(value = "备注")
    private String remark;
    @ApiModelProperty(value = "用户主键", example = "1")
    private Integer memberId;
}
server/dmmall_service/src/main/java/com/doumee/dao/web/request/MyCustomerRequest.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,22 @@
package com.doumee.dao.web.request;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
 * Created by IntelliJ IDEA.
 *
 * @Author : Rk
 * @create 2023/3/23 9:50
 */
@Data
@ApiModel("我的客户请求类")
public class MyCustomerRequest {
    @ApiModelProperty(value = "用户昵称、手机号")
    private String memberIfo;
}
server/dmmall_service/src/main/java/com/doumee/dao/web/request/SaleReportRequest.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,28 @@
package com.doumee.dao.web.request;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
 * Created by IntelliJ IDEA.
 *
 * @Author : Rk
 * @create 2023/3/23 9:50
 */
@Data
@ApiModel("我的销售报表请求类")
public class SaleReportRequest {
    @ApiModelProperty(value = "日期类型:0=今日;1=本月;2=上月;3=固定月份;4=自定义日期")
    private Integer dateType;
    @ApiModelProperty(value = "开始日期 yyyy-MM-dd dateType = 3 ã€ 4使用")
    private String startDate;
    @ApiModelProperty(value = "结束日期 yyyy-MM-dd dateType =  4使用")
    private String endDate;
    @ApiModelProperty(value = "是否查询详情:0=否;1=是;")
    private Integer queryType;
}
server/dmmall_service/src/main/java/com/doumee/dao/web/request/ShopOrderRequest.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,24 @@
package com.doumee.dao.web.request;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
 * Created by IntelliJ IDEA.
 *
 * @Author : Rk
 * @create 2023/3/23 9:50
 */
@Data
@ApiModel("我的销售报表请求类")
public class ShopOrderRequest {
    @ApiModelProperty(value = "订单状态:状态 0待支付 1待发货 2待收货 3交易完成 4已关闭 5部分发货")
    private Integer status;
    @ApiModelProperty(value = "经销商主键")
    private Integer shopId;
}
server/dmmall_service/src/main/java/com/doumee/dao/web/request/WithdrawApplyRequest.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,28 @@
package com.doumee.dao.web.request;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.math.BigDecimal;
/**
 * ç”¨æˆ·æçŽ°é“¶è¡Œä¿¡æ¯
 * @author æ±Ÿè¹„蹄
 * @date 2026/01/16 11:50
 */
@Data
@ApiModel("用户提现请求类")
public class WithdrawApplyRequest {
    @ApiModelProperty(value = "提现银行主键")
    private Integer bankId;
    @ApiModelProperty(value = "提现金额")
    private BigDecimal amount;
    @ApiModelProperty(value = "用户主键(关联shop表主键)", example = "1")
    private Integer memberId;
}
server/dmmall_service/src/main/java/com/doumee/dao/web/request/WxPhoneRequest.java
@@ -30,6 +30,11 @@
    @ApiModelProperty(value = "sessionKey")
    private String sessionKey;
    private Integer memberId;
    @NotEmpty(message = "openid ä¸èƒ½ä¸ºç©º")
    @ApiModelProperty(value = "openid")
    private String openid;
    @ApiModelProperty(value = "邀请码")
    private Integer recId;
}
server/dmmall_service/src/main/java/com/doumee/dao/web/response/AccountResponse.java
@@ -26,5 +26,7 @@
    @ApiModelProperty(value = "用户信息")
    private Member member;
    @ApiModelProperty(value = "用户openid")
    private String openid;
}
server/dmmall_service/src/main/java/com/doumee/dao/web/response/IntegralDataResponse.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,29 @@
package com.doumee.dao.web.response;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.math.BigDecimal;
/**
 * Created by IntelliJ IDEA.
 *
 * @Author : Rk
 * @create 2023/3/23 10:56
 */
@Data
@ApiModel("积分情况返回类")
public class IntegralDataResponse {
    @ApiModelProperty(value = "剩余可用积分")
    private BigDecimal surplusIntegral;
    @ApiModelProperty(value = "即将过期积分")
    private BigDecimal  expiredIntegral;
    @ApiModelProperty(value = "积分说明")
    private String info;
}
server/dmmall_service/src/main/java/com/doumee/dao/web/response/MyCustomerResponse.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,35 @@
package com.doumee.dao.web.response;
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;
/**
 * Created by IntelliJ IDEA.
 *
 * @Author : Rk
 * @create 2023/3/23 9:50
 */
@Data
@ApiModel("我的客户请求类")
public class MyCustomerResponse {
    @ApiModelProperty(value = "用户头像")
    private String imgFullUrl;
    @ApiModelProperty(value = "用户昵称")
    private String nickName;
    @ApiModelProperty(value = "手机号")
    private String phone;
    @ApiModelProperty(value = "绑定时间")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private Date bindShopDate;
}
server/dmmall_service/src/main/java/com/doumee/dao/web/response/SaleReportOrderResponse.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,66 @@
package com.doumee.dao.web.response;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.doumee.core.annotation.excel.ExcelColumn;
import com.doumee.dao.business.model.GoodsorderDetail;
import com.doumee.dao.business.model.PlanorderDetail;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
/**
 * Created by IntelliJ IDEA.
 *
 * @Author : Rk
 * @create 2023/3/23 9:50
 */
@Data
@ApiModel("销售报表订单明细请求返回信息")
public class SaleReportOrderResponse {
    @ApiModelProperty(value = "主键", example = "1")
    private Integer id;
    @ApiModelProperty(value = "订单实付价格(元/咖豆)", example = "1")
    private BigDecimal price;
    @ApiModelProperty(value = "邮费金额", example = "1")
    private BigDecimal mailPrice;
    @ApiModelProperty(value = "创建时间")
    private Date createDate;
    @ApiModelProperty(value = "订单编号", example = "1")
    private Long code;
    @ApiModelProperty(value = "收货类型:0=快递配送;1=门店自提;", example = "1")
    private Integer receiveType;
    @ApiModelProperty(value = "售后已退款金额", example = "1")
    private BigDecimal aftersaleMoney;
    @ApiModelProperty(value = "状态 0待支付 1待发货 2待收货 3交易完成 4已关闭 5部分发货", example = "1")
    private Integer status;
    @ApiModelProperty(value = "昵称")
    private String nickName;
    @ApiModelProperty(value = "电话")
    private String phone;
    @ApiModelProperty(value = "订单结算金额")
    private BigDecimal shopSettlement;
}
server/dmmall_service/src/main/java/com/doumee/dao/web/response/SaleReportResponse.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,35 @@
package com.doumee.dao.web.response;
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;
import java.util.List;
/**
 * Created by IntelliJ IDEA.
 *
 * @Author : Rk
 * @create 2023/3/23 9:50
 */
@Data
@ApiModel("销售报表请求返回信息")
public class SaleReportResponse {
    @ApiModelProperty(value = "销售额")
    private BigDecimal saleTotal;
    @ApiModelProperty(value = "订单数量")
    private Integer orderNum;
    @ApiModelProperty(value = "结算利润额")
    private BigDecimal profitTotal;
    @ApiModelProperty(value ="订单列表")
    private List<SaleReportOrderResponse> saleReportOrderResponseList;
}
server/dmmall_service/src/main/java/com/doumee/dao/web/response/ShopInfoResponse.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,71 @@
package com.doumee.dao.web.response;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.doumee.core.annotation.excel.ExcelColumn;
import com.doumee.dao.business.model.Areas;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.math.BigDecimal;
import java.util.Date;
/**
 * Created by IntelliJ IDEA.
 *
 * @Author : Rk
 * @create 2023/3/23 10:56
 */
@Data
@ApiModel("商户信息查询返回类")
public class ShopInfoResponse {
    @ApiModelProperty(value = "主键", example = "1")
    private Integer id;
    @ApiModelProperty(value = "门头照")
    private String imgurl;
    @ApiModelProperty(value = "店铺名称")
    private String name;
    @ApiModelProperty(value = "真实姓名")
    private String realname;
    @ApiModelProperty(value = "手机号")
    private String phone;
    @ApiModelProperty(value = "营业开始时间")
    private String startTime;
    @ApiModelProperty(value = "地址")
    private String addr;
    @ApiModelProperty(value = "商家编码")
    private String code;
    @ApiModelProperty(value = "积分余额")
    private BigDecimal integral;
    @ApiModelProperty(value = "营业执照")
    private String businessImg;
    @ApiModelProperty(value = "身份证正面照")
    private String idcardImg;
    @ApiModelProperty(value = "身份证反面照")
    @ExcelColumn(name="身份证反面照")
    private String idcardImgBack;
    @ApiModelProperty(value = "销售模式 0平台铺货 1自主采购")
    private Integer saleType;
    @ApiModelProperty(value = "法人姓名")
    private String legalPersonName;
    @ApiModelProperty(value = "法人电话")
    private String legalPersonPhone;
}
server/dmmall_service/src/main/java/com/doumee/dao/web/response/goods/MemberOrderResponse.java
@@ -1,5 +1,6 @@
package com.doumee.dao.web.response.goods;
import com.doumee.dao.business.model.Member;
import com.doumee.dao.business.model.MemberCoupon;
import com.doumee.dao.business.model.Shop;
import io.swagger.annotations.ApiModel;
@@ -22,6 +23,9 @@
    @ApiModelProperty(value = "订单主键", example = "1")
    private Integer orderId;
    @ApiModelProperty(value = "用户主键", example = "1")
    private Integer memberId;
    @ApiModelProperty(value = "倒计时", example = "1")
    private Long countdown;
@@ -69,7 +73,7 @@
    private String linkAddress;
    @ApiModelProperty(value = "订单备注", example = "1")
    private String memberInfo;
    private String remark;
    @ApiModelProperty(value = "订单号", example = "1")
    private String code;
@@ -103,6 +107,9 @@
    @ApiModelProperty(value = "经销商信息", example = "1")
    private Shop shopInfo;
    @ApiModelProperty(value = "用户信息", example = "1")
    private Member member;
    @ApiModelProperty(value = "优惠券信息", example = "1")
    private MemberCoupon memberCoupon;
server/dmmall_service/src/main/java/com/doumee/service/business/GoodsorderService.java
@@ -5,10 +5,7 @@
import com.doumee.core.model.PageWrap;
import com.doumee.dao.business.model.Goodsorder;
import com.doumee.dao.business.model.Shop;
import com.doumee.dao.web.request.OrderCancelRequest;
import com.doumee.dao.web.request.OrderPayRequest;
import com.doumee.dao.web.request.PayDetailRequest;
import com.doumee.dao.web.request.ShopOrderPayRequest;
import com.doumee.dao.web.request.*;
import com.doumee.dao.web.request.goods.DealOrderRequest;
import com.doumee.dao.web.request.goods.MemberOrderRequest;
import com.doumee.dao.web.request.goods.OrderCommentRequest;
@@ -69,7 +66,7 @@
    void orderSendOutGoods(Goodsorder goodsorder);
    void orderRemark(Goodsorder goodsorder);
    IPage<Shop> getShopPage(PageWrap<Shop> pageWrap);
//    IPage<Shop> getShopPage(PageWrap<Shop> pageWrap);
    void coffeePlanCancelOrder(Goodsorder goodsorder);
    void orderPlanCancelOrder(Goodsorder goodsorder);
@@ -228,4 +225,14 @@
    OrderPayConfirmResponse orderPayConfirm(OrderPayConfirmRequest request,
                                            MemberCouponServiceImpl memberCouponService);
    /**
     * ç»é”€å•†è®¢å•列表
     * @param pageWrap
     * @return
     */
    PageData<Goodsorder> shopOrderPage(PageWrap<ShopOrderRequest> pageWrap);
}
server/dmmall_service/src/main/java/com/doumee/service/business/IntegralService.java
@@ -4,7 +4,9 @@
import com.doumee.core.model.PageWrap;
import com.doumee.dao.business.model.Integral;
import com.doumee.dao.web.dto.IntegralDTO;
import com.doumee.dao.web.dto.IntegralRecordDTO;
import com.doumee.dao.web.request.DealIntegralRequest;
import com.doumee.dao.web.response.IntegralDataResponse;
import java.math.BigDecimal;
import java.util.List;
@@ -114,6 +116,7 @@
     * @return PageData<Integral>
     */
    PageData<IntegralDTO> findIntegralDTOPage(PageWrap<IntegralDTO> pageWrap,Integer memberId);
    /**
     * æ›´æ–°æ¶ˆè´¹è€…积分
     * @param dealIntegralRequest å®žä½“对象
@@ -134,4 +137,20 @@
     * @return
     */
    Integer dealShopAmount(DealIntegralRequest dealIntegralRequest);
    /**
     * èŽ·å–ç”¨æˆ·çš„ç§¯åˆ†è®°å½•
     * @param pageWrap
     * @return
     */
    PageData<Integral> findIntegralRecordPage(PageWrap<IntegralRecordDTO> pageWrap);
    /**
     * èŽ·å–ç”¨æˆ·å‰©ä½™ç§¯åˆ†ä¸Žå¾…æƒ…å†µç§¯åˆ†ä¿¡æ¯
     * @param model
     * @return
     */
    IntegralDataResponse getIntegralData(IntegralRecordDTO model);
}
server/dmmall_service/src/main/java/com/doumee/service/business/MemberBankService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,103 @@
package com.doumee.service.business;
import com.doumee.core.model.PageData;
import com.doumee.core.model.PageWrap;
import com.doumee.dao.business.model.MemberBank;
import com.doumee.dao.web.request.MemberBankSaveRequest;
import java.util.List;
/**
 * ç”¨æˆ·æçŽ°é“¶è¡Œä¿¡æ¯Service定义
 * @author æ±Ÿè¹„蹄
 * @date 2026/01/16 11:50
 */
public interface MemberBankService {
    /**
     * åˆ›å»º
     *
     * @param memberBank å®žä½“对象
     * @return Integer
     */
    Integer create(MemberBank memberBank);
    /**
     * ä¸»é”®åˆ é™¤
     *
     * @param id ä¸»é”®
     */
    void deleteById(Integer id);
    /**
     * åˆ é™¤
     *
     * @param memberBank å®žä½“对象
     */
    void delete(MemberBank memberBank);
    /**
     * æ‰¹é‡ä¸»é”®åˆ é™¤
     *
     * @param ids ä¸»é”®é›†
     */
    void deleteByIdInBatch(List<Integer> ids);
    /**
     * ä¸»é”®æ›´æ–°
     *
     * @param memberBank å®žä½“对象
     */
    void updateById(MemberBank memberBank);
    /**
     * æ‰¹é‡ä¸»é”®æ›´æ–°
     *
     * @param memberBanks å®žä½“集
     */
    void updateByIdInBatch(List<MemberBank> memberBanks);
    /**
     * ä¸»é”®æŸ¥è¯¢
     *
     * @param id ä¸»é”®
     * @return MemberBank
     */
    MemberBank findById(Integer id);
    /**
     * æ¡ä»¶æŸ¥è¯¢å•条记录
     *
     * @param memberBank å®žä½“对象
     * @return MemberBank
     */
    MemberBank findOne(MemberBank memberBank);
    /**
     * æ¡ä»¶æŸ¥è¯¢
     *
     * @param memberBank å®žä½“对象
     * @return List<MemberBank>
     */
    List<MemberBank> findList(MemberBank memberBank);
    /**
     * åˆ†é¡µæŸ¥è¯¢
     *
     * @param pageWrap åˆ†é¡µå¯¹è±¡
     * @return PageData<MemberBank>
     */
    PageData<MemberBank> findPage(PageWrap<MemberBank> pageWrap);
    /**
     * æ¡ä»¶ç»Ÿè®¡
     *
     * @param memberBank å®žä½“对象
     * @return long
     */
    long count(MemberBank memberBank);
    void saveOrUpdate(MemberBankSaveRequest request);
    List<MemberBank> getMyBankList(Integer shopId);
}
server/dmmall_service/src/main/java/com/doumee/service/business/MemberService.java
@@ -136,7 +136,7 @@
     * èŽ·å–ç»‘å®šå¾®ä¿¡ç”¨æˆ·æ‰‹æœºå·
     * @param wxPhoneRequest
     */
    void wxPhone(WxPhoneRequest wxPhoneRequest);
    AccountResponse wxPhone(WxPhoneRequest wxPhoneRequest);
    /**
server/dmmall_service/src/main/java/com/doumee/service/business/ShopService.java
@@ -2,13 +2,18 @@
import com.doumee.core.model.PageData;
import com.doumee.core.model.PageWrap;
import com.doumee.dao.business.model.Member;
import com.doumee.dao.business.model.Shop;
import com.doumee.dao.web.dto.MemberDTO;
import com.doumee.dao.web.dto.ResetSystemUserPwdDTO;
import com.doumee.dao.web.dto.shop.ShopDTO;
import com.doumee.dao.web.dto.shop.ShopDataStatisticsDTO;
import com.doumee.dao.web.dto.shop.ShopFaceDetailDTO;
import com.doumee.dao.web.dto.shop.ShopSimpleDTO;
import com.doumee.dao.web.dto.ShopLoginDTO;
import com.doumee.dao.web.dto.shop.*;
import com.doumee.dao.web.request.MyCustomerRequest;
import com.doumee.dao.web.request.SaleReportRequest;
import com.doumee.dao.web.response.AccountResponse;
import com.doumee.dao.web.response.MyCustomerResponse;
import com.doumee.dao.web.response.SaleReportResponse;
import com.doumee.dao.web.response.ShopInfoResponse;
import java.util.List;
@@ -160,4 +165,49 @@
    ShopDataStatisticsDTO getShopDataStatisticsDTO(Integer shopId);
    void resetPwd(Shop dto);
    /**
     * ç”¨æˆ·ä¸‹å•查询可选择的自提经销商
     * @param dto
     * @return
     */
    List<Shop> getShopList(ShopListDTO dto);
    /**
     * ç»é”€å•†è´¦å·å¯†ç ç™»å½•
     * @param dto
     * @return
     */
    AccountResponse shopPasswordLogin(ShopLoginDTO dto);
    /**
     * ç»é”€å•†é™é»˜ç™»å½•
     * @param dto
     * @return
     */
    AccountResponse shopOpenidLogin(ShopLoginDTO dto);
    /**
     * ç»é”€å•†åº—铺详情
     * @param shopId
     * @return
     */
    ShopInfoResponse getShopInfo(Integer shopId);
    /**
     * æˆ‘的客户信息
     * @param request
     * @param shopId
     * @return
     */
    List<MyCustomerResponse> myCustomer(MyCustomerRequest request, Integer shopId);
    /**
     * é”€å”®æ˜Žç»†
     * @param request
     * @param shopId
     * @return
     */
    SaleReportResponse saleReport(SaleReportRequest request, String shopId);
}
server/dmmall_service/src/main/java/com/doumee/service/business/WithdrawRecordService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,106 @@
package com.doumee.service.business;
import com.doumee.core.model.PageData;
import com.doumee.core.model.PageWrap;
import com.doumee.dao.business.model.WithdrawRecord;
import com.doumee.dao.web.request.WithdrawApplyRequest;
import java.util.List;
/**
 * ç”¨æˆ·æçŽ°è®°å½•Service定义
 * @author æ±Ÿè¹„蹄
 * @date 2026/01/16 11:50
 */
public interface WithdrawRecordService {
    /**
     * åˆ›å»º
     *
     * @param withdrawRecord å®žä½“对象
     * @return Integer
     */
    Integer create(WithdrawRecord withdrawRecord);
    /**
     * ä¸»é”®åˆ é™¤
     *
     * @param id ä¸»é”®
     */
    void deleteById(Integer id);
    /**
     * åˆ é™¤
     *
     * @param withdrawRecord å®žä½“对象
     */
    void delete(WithdrawRecord withdrawRecord);
    /**
     * æ‰¹é‡ä¸»é”®åˆ é™¤
     *
     * @param ids ä¸»é”®é›†
     */
    void deleteByIdInBatch(List<Integer> ids);
    /**
     * ä¸»é”®æ›´æ–°
     *
     * @param withdrawRecord å®žä½“对象
     */
    void updateById(WithdrawRecord withdrawRecord);
    /**
     * æ‰¹é‡ä¸»é”®æ›´æ–°
     *
     * @param withdrawRecords å®žä½“集
     */
    void updateByIdInBatch(List<WithdrawRecord> withdrawRecords);
    /**
     * ä¸»é”®æŸ¥è¯¢
     *
     * @param id ä¸»é”®
     * @return WithdrawRecord
     */
    WithdrawRecord findById(Integer id);
    /**
     * æ¡ä»¶æŸ¥è¯¢å•条记录
     *
     * @param withdrawRecord å®žä½“对象
     * @return WithdrawRecord
     */
    WithdrawRecord findOne(WithdrawRecord withdrawRecord);
    /**
     * æ¡ä»¶æŸ¥è¯¢
     *
     * @param withdrawRecord å®žä½“对象
     * @return List<WithdrawRecord>
     */
    List<WithdrawRecord> findList(WithdrawRecord withdrawRecord);
    /**
     * åˆ†é¡µæŸ¥è¯¢
     *
     * @param pageWrap åˆ†é¡µå¯¹è±¡
     * @return PageData<WithdrawRecord>
     */
    PageData<WithdrawRecord> findPage(PageWrap<WithdrawRecord> pageWrap);
    /**
     * æ¡ä»¶ç»Ÿè®¡
     *
     * @param withdrawRecord å®žä½“对象
     * @return long
     */
    long count(WithdrawRecord withdrawRecord);
    /**
     * æçŽ°ç”³è¯·
     * @param request
     * @param integralService
     */
    void withdrawApply(WithdrawApplyRequest request, IntegralService integralService);
}
server/dmmall_service/src/main/java/com/doumee/service/business/impl/GoodsorderServiceImpl.java
@@ -194,7 +194,7 @@
        goodsorderMapper.updateById(goodsorder);
    }
    @Override
    /*@Override
    public IPage<Shop> getShopPage(PageWrap<Shop> pageWrap) {
        IPage<Shop> page = new Page<>(pageWrap.getPage(), pageWrap.getCapacity());
        Shop model = pageWrap.getModel();
@@ -213,7 +213,7 @@
                        .like(StringUtils.isNotBlank(model.getName()),Shop::getName,model.getName())
                .orderByAsc(" distance ")
        );
    }
    }*/
    /**
@@ -770,6 +770,7 @@
            goodsorder.setDistributionShopId(shop.getId());
            if(Objects.isNull(member.getBindShopId())){
                member.setBindShopId(shop.getId());
                member.setBindShopDate(new Date());
            }
        }
@@ -1056,6 +1057,14 @@
        if(Constants.equalsInteger(memberOrderResponse.getReceiveType(),Constants.ONE)){
            memberOrderResponse.setShopInfo(shopMapper.selectById(memberOrderResponse.getShopId()));
        }
        Member member = memberMapper.selectById(memberOrderResponse.getMemberId());
        if(Objects.nonNull(member)){
            String memberfullUrl = systemDictDataBiz.queryByCode(Constants.OSS,Constants.RESOURCE_PATH).getCode()+
                    systemDictDataBiz.queryByCode(Constants.OSS,Constants.MEMBER_FILE).getCode();
            member.setImgFullUrl(memberfullUrl + member.getImgurl());
            memberOrderResponse.setMember(member);
        }
        return memberOrderResponse;
    }
@@ -1786,10 +1795,12 @@
        RedisUtil.addObject(redisTemplate,Constants.RedisKeys.GOODSORDER_KEY,0);
        //加入redis缓存,刷新今天售后编号0开始
        RedisUtil.addObject(redisTemplate,Constants.RedisKeys.AFTERSALE_KEY,0);
        //加入redis缓存,刷新今天售后编号0开始
        RedisUtil.addObject(redisTemplate,Constants.RedisKeys.WITHDRAW_KEY,0);
    }
    @Override
    public  void refreshOrderCodes(){
        long countOrder = 0,countSign=0,countSale=0;
        long countOrder = 0,countSign=0,countSale=0,countWithdraw=0;
        QueryWrapper<Goodsorder> order = new QueryWrapper<>();
        order.apply(true, "TO_DAYS(NOW())=TO_DAYS(create_date)");
@@ -1818,6 +1829,22 @@
        }
        //加入redis缓存,刷新今天售后编号0开始
        RedisUtil.addObject(redisTemplate,Constants.RedisKeys.AFTERSALE_KEY,countSale);
        QueryWrapper<WithdrawRecord> withdraw = new QueryWrapper<>();
        withdraw.apply(true, "TO_DAYS(NOW())=TO_DAYS(create_date)");
        withdraw.orderByDesc(" CODE ");
        withdraw.last(" limit 1 ");
        Aftersale maxWithdrawOrder =  aftersaleMapper.selectOne(sale);
        if(!Objects.isNull(maxWithdrawOrder)){
            countWithdraw = Integer.valueOf(maxOrder.getCode().toString().substring(8,12));
        }
        //加入redis缓存,刷新今天售后编号0开始
        RedisUtil.addObject(redisTemplate,Constants.RedisKeys.WITHDRAW_KEY,countWithdraw);
    }
@@ -1899,11 +1926,13 @@
                        .eq(Goodsorder::getMemberId,member.getId())
                        .eq(Goodsorder::getStatus,Constants.OrderStatus.WAIT_RECEIVE.getKey()))
        );
        homeInfoResponse.setWaitPayNum(
                goodsorderMapper.selectCount(new QueryWrapper<Goodsorder>().lambda().eq(Goodsorder::getIsdeleted,Constants.ZERO)
                        .eq(Goodsorder::getMemberId,member.getId())
                        .eq(Goodsorder::getStatus,Constants.OrderStatus.WAIT_PAY.getKey()))
        );
        homeInfoResponse.setCartTypeNum(
                shopcartMapper.selectCount(new QueryWrapper<Shopcart>().lambda()
                        .eq(Shopcart::getIsdeleted,Constants.ZERO)
@@ -1925,11 +1954,44 @@
        );
        return homeInfoResponse;
    }
    @Override
    public PageData<Goodsorder> shopOrderPage(PageWrap<ShopOrderRequest> pageWrap) {
        Integer shopId = null;
        Integer status = null;
        IPage<Goodsorder> page = new Page<>(pageWrap.getPage(), pageWrap.getCapacity());
        MPJLambdaWrapper<Goodsorder> queryWrapper = new MPJLambdaWrapper<>();
        Utils.MP.blankToNull(pageWrap.getModel());
        ShopOrderRequest model = pageWrap.getModel();
        queryWrapper.selectAll(Goodsorder.class);
//        queryWrapper.selectAs(Member::getNickname,Goodsorder::getNickName);
//        queryWrapper.selectAs(Member::getPhone,Goodsorder::getPhone);
//        queryWrapper.selectAs(Member::getImgurl,Goodsorder::getImgurl);
        queryWrapper.eq(Goodsorder::getIsdeleted,Constants.ZERO);
        queryWrapper.eq(Objects.nonNull(model.getStatus()),Goodsorder::getStatus,model.getStatus());
        queryWrapper.eq(Objects.nonNull(model.getShopId()),Goodsorder::getDistributionShopId,model.getShopId());
        queryWrapper.orderByDesc(Goodsorder::getCreateDate);
        IPage<Goodsorder> result = goodsorderJoinMapper.selectJoinPage(page, Goodsorder.class, queryWrapper);
        String path = systemDictDataBiz.queryByCode(Constants.OSS, Constants.RESOURCE_PATH).getCode() +
                systemDictDataBiz.queryByCode(Constants.OSS, Constants.GOODS_FILE).getCode();
        for(Goodsorder goodsorder:result.getRecords()){
            List<GoodsorderDetail> goodsorderDetailList=goodsorderDetailJoinMapper.selectList(new QueryWrapper<GoodsorderDetail>().lambda()
                    .eq(GoodsorderDetail::getOrderId,goodsorder.getId()));
            goodsorderDetailList.stream().forEach(s ->{
                if(StringUtils.isBlank(s.getImgurl())){
                    s.setImgurl(path + s.getGoodsImgurl());
                }
            });
            goodsorder.setGoodsorderDetailList(goodsorderDetailList);
        }
        return PageData.from(result);
    }
server/dmmall_service/src/main/java/com/doumee/service/business/impl/IntegralServiceImpl.java
@@ -16,8 +16,11 @@
import com.doumee.dao.business.model.Integral;
import com.doumee.dao.business.model.Member;
import com.doumee.dao.business.model.Shop;
import com.doumee.dao.system.model.SystemDictData;
import com.doumee.dao.web.dto.IntegralDTO;
import com.doumee.dao.web.dto.IntegralRecordDTO;
import com.doumee.dao.web.request.DealIntegralRequest;
import com.doumee.dao.web.response.IntegralDataResponse;
import com.doumee.service.business.AreasService;
import com.doumee.service.business.IntegralService;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
@@ -384,4 +387,87 @@
        integralDTOIPage.setCurrent(result.getCurrent());
        return PageData.from(integralDTOIPage);
    }
    public List<Integral> getMyIntegralList(Integer memberId) {
        QueryWrapper<Integral> queryWrapper = new QueryWrapper<>();
        queryWrapper.lambda().eq(Integral::getMemberId,memberId);
        return integralMapper.selectList(queryWrapper);
    }
    @Override
    public PageData<Integral> findIntegralRecordPage(PageWrap<IntegralRecordDTO> pageWrap) {
        IPage<Integral> page = new Page<>(pageWrap.getPage(), pageWrap.getCapacity());
        Utils.MP.blankToNull(pageWrap.getModel());
        IntegralRecordDTO model = pageWrap.getModel();
        IPage<Integral> result = integralMapper.selectPage(page,new QueryWrapper<Integral>()
                .lambda()
                .eq(Objects.nonNull(model.getUserType()),Integral::getUserType,model.getUserType())
                .eq(Objects.nonNull(model.getType()),Integral::getType,model.getType())
                .eq(Integral::getMemberId,model.getMemberId())
                .orderByDesc(Integral::getCreateDate)
        );
        if(com.github.xiaoymin.knife4j.core.util.CollectionUtils.isNotEmpty(result.getRecords())){
            for (Integral integral:result.getRecords()) {
                integral.setStrType(Constants.IntegralObjType.getName(integral.getObjType()));
            }
        }
        return PageData.from(result);
    }
    @Override
    public IntegralDataResponse getIntegralData(IntegralRecordDTO model){
        IntegralDataResponse integralDataResponse = new IntegralDataResponse();
        integralDataResponse.setSurplusIntegral(BigDecimal.ZERO);
        integralDataResponse.setExpiredIntegral(BigDecimal.ZERO);
        List<Integral> list = integralMapper.selectList(new QueryWrapper<Integral>().lambda()
                .eq(Objects.nonNull(model.getUserType()),Integral::getUserType,model.getUserType())
                .eq(Objects.nonNull(model.getType()),Integral::getType,model.getType())
                .eq(Integral::getMemberId,model.getMemberId())
                .orderByDesc(Integral::getCreateDate));
        if(com.github.xiaoymin.knife4j.core.util.CollectionUtils.isNotEmpty(list)){
            integralDataResponse.setSurplusIntegral(
                    list.stream().map(i->i.getNum().multiply(new BigDecimal(i.getType().toString()))
                    ).reduce(BigDecimal.ZERO, BigDecimal::add)
            );
            //积分失效方式 0长期有效 1按积分产生时间失效
            Integer type  = Integer.valueOf(systemDictDataBiz.queryByCode(Constants.INTEGRAL_SET, Constants.INTERALSET_INTEGRALINVALIDTYPE).getCode());
            //消费者积分 éœ€è¦æŸ¥è¯¢å³å°†è¿‡æœŸç§¯åˆ†
            if(Constants.equalsInteger(type,Constants.ZERO)){
                Integer validYear  = Integer.valueOf(systemDictDataBiz.queryByCode(Constants.INTEGRAL_SET, Constants.INTERALSET_INTEGRALINVALIDCIRCLE).getCode());
                if(validYear.compareTo(Constants.ZERO)>Constants.ZERO){
                     list = integralMapper.selectList(new QueryWrapper<Integral>().lambda()
                            .eq(Objects.nonNull(model.getUserType()),Integral::getUserType,model.getUserType())
                            .eq(Objects.nonNull(model.getType()),Integral::getType,model.getType())
                            .eq(Integral::getMemberId,model.getMemberId())
                             .apply(" CREATE_DATE >= DATE_SUB(DATE_FORMAT(CURDATE(), '%Y-%m-01'),INTERVAL "+(validYear*12)+1+" MONTH) ")
                            .orderByDesc(Integral::getCreateDate));
                    BigDecimal newIntegral = list.stream().map(i->i.getNum().multiply(new BigDecimal(i.getType().toString()))
                    ).reduce(BigDecimal.ZERO, BigDecimal::add);
                    integralDataResponse.setExpiredIntegral(
                            integralDataResponse.getSurplusIntegral().compareTo(newIntegral)>Constants.ZERO?integralDataResponse.getSurplusIntegral().subtract(newIntegral):BigDecimal.ZERO
                    );
                }
            }
        }
        String info  = systemDictDataBiz.queryByCode(Constants.INTEGRAL_SET, Constants.INTERALSET_INTEGRALRULEINFO).getCode();
        integralDataResponse.setInfo(info);
        return integralDataResponse;
    }
}
server/dmmall_service/src/main/java/com/doumee/service/business/impl/MemberBankServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,207 @@
package com.doumee.service.business.impl;
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.Constants;
import com.doumee.core.utils.Utils;
import com.doumee.dao.business.MemberBankMapper;
import com.doumee.dao.business.model.MemberBank;
import com.doumee.dao.web.request.MemberBankSaveRequest;
import com.doumee.service.business.MemberBankService;
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 org.apache.commons.lang3.StringUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import java.util.Date;
import java.util.List;
import java.util.Objects;
/**
 * ç”¨æˆ·æçŽ°é“¶è¡Œä¿¡æ¯Service实现
 * @author æ±Ÿè¹„蹄
 * @date 2026/01/16 11:50
 */
@Service
public class MemberBankServiceImpl implements MemberBankService {
    @Autowired
    private MemberBankMapper memberBankMapper;
    @Override
    public Integer create(MemberBank memberBank) {
        memberBankMapper.insert(memberBank);
        return memberBank.getId();
    }
    @Override
    public void deleteById(Integer id) {
        memberBankMapper.deleteById(id);
    }
    @Override
    public void delete(MemberBank memberBank) {
        UpdateWrapper<MemberBank> deleteWrapper = new UpdateWrapper<>(memberBank);
        memberBankMapper.delete(deleteWrapper);
    }
    @Override
    public void deleteByIdInBatch(List<Integer> ids) {
        if (CollectionUtils.isEmpty(ids)) {
            return;
        }
        memberBankMapper.deleteBatchIds(ids);
    }
    @Override
    public void updateById(MemberBank memberBank) {
        memberBankMapper.updateById(memberBank);
    }
    @Override
    public void updateByIdInBatch(List<MemberBank> memberBanks) {
        if (CollectionUtils.isEmpty(memberBanks)) {
            return;
        }
        for (MemberBank memberBank: memberBanks) {
            this.updateById(memberBank);
        }
    }
    @Override
    public MemberBank findById(Integer id) {
        return memberBankMapper.selectById(id);
    }
    @Override
    public MemberBank findOne(MemberBank memberBank) {
        QueryWrapper<MemberBank> wrapper = new QueryWrapper<>(memberBank);
        return memberBankMapper.selectOne(wrapper);
    }
    @Override
    public List<MemberBank> findList(MemberBank memberBank) {
        QueryWrapper<MemberBank> wrapper = new QueryWrapper<>(memberBank);
        return memberBankMapper.selectList(wrapper);
    }
    @Override
    public PageData<MemberBank> findPage(PageWrap<MemberBank> pageWrap) {
        IPage<MemberBank> page = new Page<>(pageWrap.getPage(), pageWrap.getCapacity());
        QueryWrapper<MemberBank> queryWrapper = new QueryWrapper<>();
        Utils.MP.blankToNull(pageWrap.getModel());
        if (pageWrap.getModel().getId() != null) {
            queryWrapper.lambda().eq(MemberBank::getId, pageWrap.getModel().getId());
        }
        if (pageWrap.getModel().getCreator() != null) {
            queryWrapper.lambda().eq(MemberBank::getCreator, pageWrap.getModel().getCreator());
        }
        if (pageWrap.getModel().getCreateDate() != null) {
            queryWrapper.lambda().ge(MemberBank::getCreateDate, Utils.Date.getStart(pageWrap.getModel().getCreateDate()));
            queryWrapper.lambda().le(MemberBank::getCreateDate, Utils.Date.getEnd(pageWrap.getModel().getCreateDate()));
        }
        if (pageWrap.getModel().getEditor() != null) {
            queryWrapper.lambda().eq(MemberBank::getEditor, pageWrap.getModel().getEditor());
        }
        if (pageWrap.getModel().getEditDate() != null) {
            queryWrapper.lambda().ge(MemberBank::getEditDate, Utils.Date.getStart(pageWrap.getModel().getEditDate()));
            queryWrapper.lambda().le(MemberBank::getEditDate, Utils.Date.getEnd(pageWrap.getModel().getEditDate()));
        }
        if (pageWrap.getModel().getIsdeleted() != null) {
            queryWrapper.lambda().eq(MemberBank::getIsdeleted, pageWrap.getModel().getIsdeleted());
        }
        if (pageWrap.getModel().getRemark() != null) {
            queryWrapper.lambda().eq(MemberBank::getRemark, pageWrap.getModel().getRemark());
        }
        if (pageWrap.getModel().getBankName() != null) {
            queryWrapper.lambda().eq(MemberBank::getBankName, pageWrap.getModel().getBankName());
        }
        if (pageWrap.getModel().getBankAccount() != null) {
            queryWrapper.lambda().eq(MemberBank::getBankAccount, pageWrap.getModel().getBankAccount());
        }
        if (pageWrap.getModel().getName() != null) {
            queryWrapper.lambda().eq(MemberBank::getName, pageWrap.getModel().getName());
        }
        if (pageWrap.getModel().getMemberId() != null) {
            queryWrapper.lambda().eq(MemberBank::getMemberId, pageWrap.getModel().getMemberId());
        }
        if (pageWrap.getModel().getIsDefault() != null) {
            queryWrapper.lambda().eq(MemberBank::getIsDefault, pageWrap.getModel().getIsDefault());
        }
        for(PageWrap.SortData sortData: pageWrap.getSorts()) {
            if (sortData.getDirection().equalsIgnoreCase(PageWrap.DESC)) {
                queryWrapper.orderByDesc(sortData.getProperty());
            } else {
                queryWrapper.orderByAsc(sortData.getProperty());
            }
        }
        return PageData.from(memberBankMapper.selectPage(page, queryWrapper));
    }
    @Override
    public long count(MemberBank memberBank) {
        QueryWrapper<MemberBank> wrapper = new QueryWrapper<>(memberBank);
        return memberBankMapper.selectCount(wrapper);
    }
    @Override
    public void saveOrUpdate(MemberBankSaveRequest request) {
        if(Objects.isNull(request)
                ||Objects.isNull(request.getIsDefault())
                ||Objects.isNull(request.getMemberId())
                || StringUtils.isNotBlank(request.getBankName())
                || StringUtils.isNotBlank(request.getBankAccount())
                || StringUtils.isNotBlank(request.getName())
        ){
            throw new BusinessException(ResponseStatus.BAD_REQUEST);
        }
        if (request.getIsDefault() == 1) {
            List<MemberBank> memberBanks = memberBankMapper.selectList(new QueryWrapper<MemberBank>().lambda()
                    .eq(MemberBank::getMemberId, request.getMemberId())
                    .eq(MemberBank::getIsDefault, Constants.ONE));
            for (MemberBank memberBank: memberBanks) {
                memberBank.setIsDefault(Constants.ZERO);
                this.updateById(memberBank);
            }
        }
        if (request.getId() == null) {
            MemberBank memberBank = new MemberBank();
            BeanUtils.copyProperties(request,memberBank);
            memberBank.setCreateDate(new Date());
            memberBank.setEditDate(new Date());
            memberBankMapper.insert(memberBank);
        } else {
            MemberBank memberBank = memberBankMapper.selectById(request.getId());
            if(Objects.isNull(memberBank)){
                throw new BusinessException(ResponseStatus.DATA_EMPTY);
            }
            BeanUtils.copyProperties(request,memberBank);
            memberBank.setEditDate(new Date());
            this.updateById(memberBank);
        }
    }
    @Override
    public List<MemberBank> getMyBankList(Integer shopId) {
        List<MemberBank> memberBanks = memberBankMapper.selectList(new QueryWrapper<MemberBank>()
                .lambda()
                .eq(MemberBank::getIsdeleted, Constants.ZERO)
                .eq(MemberBank::getMemberId,shopId)
                .orderByDesc(MemberBank::getIsDefault,MemberBank::getId)
        );
        return memberBanks;
    }
}
server/dmmall_service/src/main/java/com/doumee/service/business/impl/MemberCouponServiceImpl.java
@@ -657,11 +657,6 @@
    }
    /**
     * è®¡ç®—当前已选择优惠券每个商品占比金额
     * @param coupon ä¼˜æƒ åˆ¸ä¿¡æ¯
@@ -718,6 +713,9 @@
            response.setUseCoupon(idList.contains(Constants.equalsInteger(vaildType,Constants.ZERO)?response.getId().toString():response.getCategoryId().toString())?true:false);
        }
    }
//    public Set<Integer> isVaildUse(List<String> idList,List<OrderGoodsCalculateResponse> goodsList,Integer vaildType){
//        List<OrderGoodsCalculateResponse> resultList = new ArrayList<>();
//        for (String id:idList) {
server/dmmall_service/src/main/java/com/doumee/service/business/impl/MemberServiceImpl.java
@@ -20,12 +20,10 @@
import com.doumee.core.utils.Utils;
import com.doumee.core.wx.WxMiniConfig;
import com.doumee.dao.business.MemberMapper;
import com.doumee.dao.business.ShopMapper;
import com.doumee.dao.business.SmsrecordMapper;
import com.doumee.dao.business.join.MemberJoinMapper;
import com.doumee.dao.business.model.Areas;
import com.doumee.dao.business.model.Goodsorder;
import com.doumee.dao.business.model.Member;
import com.doumee.dao.business.model.Smsrecord;
import com.doumee.dao.business.model.*;
import com.doumee.dao.system.SystemUserMapper;
import com.doumee.dao.system.dto.MemberRechargeDTO;
import com.doumee.dao.web.dto.MemberOwnDTO;
@@ -44,6 +42,8 @@
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.github.yulichang.wrapper.MPJLambdaWrapper;
import io.swagger.models.auth.In;
import io.swagger.util.Yaml;
import lombok.extern.log4j.Log4j;
import me.chanjar.weixin.common.error.WxErrorException;
import okhttp3.OkHttpClient;
@@ -77,6 +77,9 @@
    @Autowired
    private MemberMapper memberMapper;
    @Autowired
    private ShopMapper shopMapper;
    @Autowired
    private SmsrecordMapper smsrecordMapper;
@@ -241,38 +244,38 @@
            if (com.baomidou.mybatisplus.core.toolkit.StringUtils.isBlank(openId)) {
                throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"获取openid失败!请联系管理员");
            }
            Member member = memberMapper.selectOne(new QueryWrapper<Member>().eq("OPEN_ID", openId));
            if (member == null) {
                member = new Member();
                member.setImgurl("20230410/4010b821-2137-4e6d-86e4-5ab9c06184a4.png");
                member.setNickname("微信用户"+ CodeVerifyUtils.createVerificationCode(4));
                member.setCreateDate(new Date());
                member.setIsdeleted(Constants.ZERO);
                member.setType(Constants.ZERO);
                member.setOrigin(Constants.ZERO);
                member.setRecId(recId);
                member.setOpenId(openId);
                memberMapper.insert(member);
            }
            member.setImgFullUrl(systemDictDataBiz.queryByCode(Constants.OSS,Constants.RESOURCE_PATH).getCode()+
                    systemDictDataBiz.queryByCode(Constants.OSS,Constants.MEMBER_FILE).getCode()+member.getImgurl());
            Member member = memberMapper.selectOne(new QueryWrapper<Member>().lambda().eq(Member::getOpenId, openId)
                            .eq(Member::getIsdeleted,Constants.ZERO)
                    .last(" limit 1"));
            //创建token
            JwtPayLoad payLoad = new JwtPayLoad(member.getId());
            JwtPayLoad payLoad = new JwtPayLoad(Constants.MEMBER_PREFIX+member.getId());
            String token = JwtTokenUtil.generateToken(payLoad);
            AccountResponse accountResponse = new AccountResponse();
            accountResponse.setToken(token);
            accountResponse.setSessionKey(session.getSessionKey());
            accountResponse.setMember(member);
            if(Objects.nonNull(member)){
                if(Objects.isNull(member.getRecId())){
                    member.setRecId(recId);
                }
                memberMapper.updateById(member);
                member.setImgFullUrl(systemDictDataBiz.queryByCode(Constants.OSS,Constants.RESOURCE_PATH).getCode()+
                        systemDictDataBiz.queryByCode(Constants.OSS,Constants.MEMBER_FILE).getCode()+member.getImgurl());
                accountResponse.setToken(token);
                accountResponse.setMember(member);
            }else{
                accountResponse.setOpenid(openId);
            }
            return accountResponse;
        } catch (WxErrorException e) {
            e.printStackTrace();
        }
        throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"微信登录异常!请联系管理员");
    }
    @Override
    public AccountResponse wxLoginTest( Integer memberId){
        //创建token
        JwtPayLoad payLoad = new JwtPayLoad(memberId);
        JwtPayLoad payLoad = new JwtPayLoad(Constants.MEMBER_PREFIX+memberId);
        String token = JwtTokenUtil.generateToken(payLoad);
        AccountResponse accountResponse = new AccountResponse();
        accountResponse.setToken(token);
@@ -280,9 +283,82 @@
    }
    /**
     * æ ¹æ®openid获取是否绑定了商户
     * @param openid
     * @param memberId
     * @return
     */
    public AccountResponse shopOpenidLogin(String openid, Integer memberId){
        Shop shop = shopMapper.selectOne(new QueryWrapper<Shop>().lambda().eq(Shop::getOpenId, openid)
                .eq(Shop::getIsdeleted,Constants.ZERO)
                .last("limit 1")
        );
        AccountResponse accountResponse = new AccountResponse();
        accountResponse.setOpenid(openid);
        if(Objects.nonNull(shop)){
            if(Objects.isNull(memberId)
             && ( Objects.isNull(shop.getMemberId())
                    || !Constants.equalsInteger(shop.getMemberId(),memberId))){
                shopMapper.update(null,new UpdateWrapper<Shop>().lambda()
                        .set(Shop::getMemberId,memberId)
                        .eq(Shop::getId,shop.getId())
                );
            }
            JwtPayLoad payLoad = new JwtPayLoad(Constants.SHOP_PREFIX+shop.getId());
            String token = JwtTokenUtil.generateToken(payLoad);
            accountResponse.setToken(token);
        }
        return accountResponse;
    }
    /**
     * å•†æˆ·è´¦å·å¯†ç ç™»å½•
     * @param userName
     * @param password
     * @param openid
     * @param memberId
     * @return
     */
    public AccountResponse shopPasswordLogin(String userName,String password,String openid,String memberId){
        if(StringUtils.isBlank(userName)
             || StringUtils.isBlank(password)){
            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"用户名或密码不能为空");
        }
        Shop shop = shopMapper.selectOne(new QueryWrapper<Shop>().lambda().eq(Shop::getUsername, userName)
                .eq(Shop::getIsdeleted,Constants.ZERO)
                .last("limit 1")
        );
        if(shop==null){
            throw new BusinessException(ResponseStatus.ACCOUNT_INCORRECT);
        }
        //加密密码
        String pwd = Utils.Secure.encryptPassword(password, shop.getSalt());
        if(!pwd.equals(shop.getPassword())){
            throw new BusinessException(ResponseStatus.ACCOUNT_INCORRECT);
        }
        //创建token
        JwtPayLoad payLoad = new JwtPayLoad(Constants.SHOP_PREFIX+shop.getId());
        String token = JwtTokenUtil.generateToken(payLoad);
        AccountResponse accountResponse = new AccountResponse();
        accountResponse.setToken(token);
        shopMapper.update(null,new UpdateWrapper<Shop>().lambda()
                .set(Shop::getOpenId,openid)
                .set(Shop::getMemberId,memberId)
                .eq(Shop::getId,shop.getId())
        );
        shopMapper.update(null,new UpdateWrapper<Shop>().lambda()
                .set(Shop::getOpenId,null)
                .eq(Shop::getOpenId,openid)
                .ne(Shop::getId,shop.getId())
        );
        return accountResponse;
    }
    @Override
    public void wxPhone(WxPhoneRequest wxPhoneRequest){
    public AccountResponse wxPhone(WxPhoneRequest wxPhoneRequest){
        try {
            WxMaPhoneNumberInfo userPhoneInfo = WxMiniConfig.wxMaService.getUserService().getPhoneNoInfo(
                    wxPhoneRequest.getSessionKey(), wxPhoneRequest.getEncryptedData(), wxPhoneRequest.getIv());
@@ -291,46 +367,79 @@
            if(Objects.isNull(phone)){
                throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"未获取到手机号");
            }
            Member member =  memberMapper.selectById(wxPhoneRequest.getMemberId());
            Member member = memberMapper.selectOne(new QueryWrapper<Member>().lambda().eq(Member::getOpenId, wxPhoneRequest.getOpenid())
                    .eq(Member::getIsdeleted,Constants.ZERO)
                    .last(" limit 1"));
            if (member == null) {
                member = new Member();
                member.setImgurl("20230410/4010b821-2137-4e6d-86e4-5ab9c06184a4.png");
                member.setNickname("微信用户"+ CodeVerifyUtils.createVerificationCode(4));
                member.setCreateDate(new Date());
                member.setIsdeleted(Constants.ZERO);
                member.setType(Constants.ZERO);
                member.setOrigin(Constants.ZERO);
                member.setRecId(wxPhoneRequest.getRecId());
                member.setOpenId(wxPhoneRequest.getOpenid());
            }
            member.setPhone(phone);
            member.setEditDate(new Date());
            member.setEditor(wxPhoneRequest.getMemberId());
            member.setImgFullUrl(systemDictDataBiz.queryByCode(Constants.OSS,Constants.RESOURCE_PATH).getCode()+
                    systemDictDataBiz.queryByCode(Constants.OSS,Constants.MEMBER_FILE).getCode()+member.getImgurl());
            //生成分享码
            String accessToken = systemDictDataBiz.queryByCode(Constants.SYSTEM,Constants.ACCESS_TOKEN).getCode();
            if(StringUtils.isBlank(member.getSharingCode())){
                //生成图片上传OSS
                Map<String,Object> body = new HashMap<>();
                // åœºæ™¯ç ï¼Œä¸Žå‰ç«¯çº¦å®šï¼Œæœ€ç»ˆæ˜¯éœ€è¦å‰ç«¯è§£æž
                body.put("scene", member.getId());
                // æ­£å¼ç‰ˆä¸º "release",体验版为 "trial",开发版为 "develop"。默认是正式版。
                body.put("env_version", "release");
                // é€æ˜Žï¼Œæ ¹æ®ä½ çš„场景自行设置body参数
                body.put("is_hyaline", true);
                OkHttpClient client = new OkHttpClient().newBuilder().build();
                okhttp3.MediaType mediaType = okhttp3.MediaType.parse("application/json");
                okhttp3.RequestBody requestBody = okhttp3.RequestBody.create(mediaType, JSONObject.toJSONString(body));
                Request request = new Request.Builder().url("https://api.weixin.qq.com/wxa/getwxacodeunlimit?access_token="+accessToken)
                        .method("POST", requestBody).build();
                try {
                    Response response = client.newCall(request).execute();
                    if (response.isSuccessful()) {
                        InputStream inputStream = new ByteArrayInputStream(response.body().bytes());
                        FileModel fileModel = uploadFileService.uploadWxCode(inputStream,member.getId().toString());
                        member.setSharingCode(fileModel.getFileUrl());
                        inputStream.close();
                    }
                } catch (Exception e) {
                    e.printStackTrace();
            if(Objects.isNull(member.getId())){
                memberMapper.insert(member);
                member.setSharingCode(this.createShareCode(member.getId()));
                memberMapper.updateById(member);
            }else{
                if(StringUtils.isBlank(member.getSharingCode())){
                    member.setSharingCode(this.createShareCode(member.getId()));
                }
                memberMapper.updateById(member);
            }
            memberMapper.updateById(member);
            JwtPayLoad payLoad = new JwtPayLoad(Constants.MEMBER_PREFIX+member.getId());
            String token = JwtTokenUtil.generateToken(payLoad);
            AccountResponse accountResponse = new AccountResponse();
            accountResponse.setToken(token);
            accountResponse.setMember(member);
            return accountResponse;
        } catch (Exception e) {
            e.printStackTrace();
            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"更新手机号失败");
        }
    }
    public String createShareCode(Integer memberId){
        //生成分享码
        String accessToken = systemDictDataBiz.queryByCode(Constants.SYSTEM,Constants.ACCESS_TOKEN).getCode();
        //生成图片上传OSS
        Map<String,Object> body = new HashMap<>();
        // åœºæ™¯ç ï¼Œä¸Žå‰ç«¯çº¦å®šï¼Œæœ€ç»ˆæ˜¯éœ€è¦å‰ç«¯è§£æž
        body.put("scene", memberId);
        // æ­£å¼ç‰ˆä¸º "release",体验版为 "trial",开发版为 "develop"。默认是正式版。
        body.put("env_version", "release");
        // é€æ˜Žï¼Œæ ¹æ®ä½ çš„场景自行设置body参数
        body.put("is_hyaline", true);
        OkHttpClient client = new OkHttpClient().newBuilder().build();
        okhttp3.MediaType mediaType = okhttp3.MediaType.parse("application/json");
        okhttp3.RequestBody requestBody = okhttp3.RequestBody.create(mediaType, JSONObject.toJSONString(body));
        Request request = new Request.Builder().url("https://api.weixin.qq.com/wxa/getwxacodeunlimit?access_token="+accessToken)
                .method("POST", requestBody).build();
        try {
            Response response = client.newCall(request).execute();
            if (response.isSuccessful()) {
                InputStream inputStream = new ByteArrayInputStream(response.body().bytes());
                FileModel fileModel = uploadFileService.uploadWxCode(inputStream,memberId.toString());
                inputStream.close();
                return fileModel.getFileUrl();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
    @Override
    public Member updateMember(UpdateMemberRequest updateMemberRequest){
@@ -571,4 +680,13 @@
        Integer integer = integralService.dealIntegral(dealIntegralRequest);
        return integer;
    }
}
server/dmmall_service/src/main/java/com/doumee/service/business/impl/ShopServiceImpl.java
@@ -2,6 +2,8 @@
import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.doumee.biz.system.SystemDictDataBiz;
import com.doumee.config.Jwt.JwtPayLoad;
import com.doumee.config.Jwt.JwtTokenUtil;
import com.doumee.config.listener.event.VisitEvent;
import com.doumee.core.model.LoginUserInfo;
import com.doumee.core.constants.ResponseStatus;
@@ -10,10 +12,9 @@
import com.doumee.core.model.PageWrap;
import com.doumee.core.utils.Constants;
import com.doumee.core.utils.Utils;
import com.doumee.dao.business.LabelsMapper;
import com.doumee.dao.business.MemberMapper;
import com.doumee.dao.business.ShopJoinMapper;
import com.doumee.dao.business.ShopMapper;
import com.doumee.dao.business.*;
import com.doumee.dao.business.join.GoodsorderJoinMapper;
import com.doumee.dao.business.join.MemberJoinMapper;
import com.doumee.dao.business.join.ProductLabelJoinMapper;
import com.doumee.dao.business.model.*;
import com.doumee.dao.business.model.Labels;
@@ -22,11 +23,11 @@
import com.doumee.dao.business.model.ShopScan;
import com.doumee.dao.system.SystemUserMapper;
import com.doumee.dao.system.model.SystemUser;
import com.doumee.dao.web.dto.CouponDTO;
import com.doumee.dao.web.dto.MemberDTO;
import com.doumee.dao.web.dto.MultiFileDTO;
import com.doumee.dao.web.dto.ResetSystemUserPwdDTO;
import com.doumee.dao.web.dto.*;
import com.doumee.dao.web.dto.shop.*;
import com.doumee.dao.web.request.MyCustomerRequest;
import com.doumee.dao.web.request.SaleReportRequest;
import com.doumee.dao.web.response.*;
import com.doumee.service.business.*;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
@@ -37,6 +38,7 @@
import org.apache.shiro.SecurityUtils;
import com.github.yulichang.wrapper.MPJLambdaWrapper;
import org.apache.commons.lang3.StringUtils;
import org.apache.xpath.operations.Bool;
import org.checkerframework.checker.units.qual.C;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
@@ -85,10 +87,13 @@
    private SystemDictDataBiz systemDictDataBiz;
    @Autowired
    private MemberMapper memberMapper;
    private MemberJoinMapper memberJoinMapper;
    @Autowired
    private SystemUserMapper systemUserMapper;
    @Autowired
    private GoodsorderJoinMapper goodsorderJoinMapper;
    @Autowired
    private ProductLabelJoinMapper productLabelJoinMapper;
@@ -109,6 +114,9 @@
    @Autowired
    private MultifileService multifileService;
    @Autowired
    private IntegralMapper integralMapper;
    @Override
@@ -585,4 +593,242 @@
        updateUserDto.setPassword(Utils.Secure.encryptPassword( shop.getCode()+"@123456", shop.getSalt()));
        shopMapper.updateById(updateUserDto);
    }
    /**
     * ç”¨æˆ·ä¸‹å•查询可选择的自提经销商
     * @param dto
     * @return
     */
    @Override
    public List<Shop> getShopList(ShopListDTO dto){
        Boolean isArea = false;
        if(Objects.nonNull(dto)&&StringUtils.isNotBlank(dto.getLat())
        && StringUtils.isNotBlank(dto.getLgt())){
            isArea = true;
        }
        List<Shop> shopList = shopJoinMapper.selectList(new MPJLambdaWrapper<Shop>()
                .selectAll(Shop.class)
                .select(" CONVERT( ST_Distance_Sphere ( POINT ( LONGITUDE, LATITUDE ), POINT ( "+dto.getLgt()+", "+dto.getLat()+" )) /1000,DECIMAL(15,2))",Shop::getDistance)
                .leftJoin(Areas.class,Areas::getId,Shop::getAreaId)
                .eq(Objects.nonNull(dto.getCityId()),Areas::getParentId,dto.getCityId())
                .like(Objects.nonNull(dto.getShopName()),Shop::getName,dto.getShopName())
                .orderByDesc(!isArea,Shop::getId)
                .orderByAsc(isArea,Shop::getDistance)
        );
        String path = systemDictDataBiz.queryByCode(Constants.OSS, Constants.RESOURCE_PATH).getCode()
                + systemDictDataBiz.queryByCode(Constants.OSS, Constants.SHOP_FILE).getCode();
        for(Shop model:shopList){
            model.setImgFullUrl(path+model.getImgurl());
        }
        return shopList;
    }
    /**
     * æ ¹æ®openid获取是否绑定了商户
     * @param dto
     * @return
     */
    @Override
    public AccountResponse shopOpenidLogin(ShopLoginDTO dto){
        Shop shop = shopMapper.selectOne(new QueryWrapper<Shop>().lambda().eq(Shop::getOpenId, dto.getOpenid())
                .eq(Shop::getIsdeleted,Constants.ZERO)
                .last("limit 1")
        );
        AccountResponse accountResponse = new AccountResponse();
        accountResponse.setOpenid(dto.getOpenid());
        if(Objects.nonNull(shop)){
            if(Objects.isNull(dto.getMemberId())
                    && ( Objects.isNull(shop.getMemberId())
                    || !Constants.equalsInteger(shop.getMemberId(),dto.getMemberId()))){
                shopMapper.update(null,new UpdateWrapper<Shop>().lambda()
                        .set(Shop::getMemberId,dto.getMemberId())
                        .eq(Shop::getId,shop.getId())
                );
            }
            JwtPayLoad payLoad = new JwtPayLoad(Constants.SHOP_PREFIX+shop.getId());
            String token = JwtTokenUtil.generateToken(payLoad);
            accountResponse.setToken(token);
        }
        return accountResponse;
    }
    /**
     * å•†æˆ·è´¦å·å¯†ç ç™»å½•
     * @param dto
     * @return
     */
    @Override
    public AccountResponse shopPasswordLogin(ShopLoginDTO dto){
        if(StringUtils.isBlank(dto.getUserName())
                || StringUtils.isBlank(dto.getPassword())
                || StringUtils.isBlank(dto.getOpenid())
        ){
            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"用户名或密码不能为空");
        }
        Shop shop = shopMapper.selectOne(new QueryWrapper<Shop>().lambda().eq(Shop::getUsername, dto.getUserName())
                .eq(Shop::getIsdeleted,Constants.ZERO)
                .last("limit 1")
        );
        if(shop==null){
            throw new BusinessException(ResponseStatus.ACCOUNT_INCORRECT);
        }
        //加密密码
        String pwd = Utils.Secure.encryptPassword( dto.getPassword(), shop.getSalt());
        if(!pwd.equals(shop.getPassword())){
            throw new BusinessException(ResponseStatus.ACCOUNT_INCORRECT);
        }
        //创建token
        JwtPayLoad payLoad = new JwtPayLoad(Constants.SHOP_PREFIX+shop.getId());
        String token = JwtTokenUtil.generateToken(payLoad);
        AccountResponse accountResponse = new AccountResponse();
        accountResponse.setToken(token);
        shopMapper.update(null,new UpdateWrapper<Shop>().lambda()
                .set(Shop::getOpenId,dto.getOpenid())
                .set(Shop::getMemberId,dto.getMemberId())
                .eq(Shop::getId,shop.getId())
        );
        shopMapper.update(null,new UpdateWrapper<Shop>().lambda()
                .set(Shop::getOpenId,null)
                .eq(Shop::getOpenId,dto.getOpenid())
                .ne(Shop::getId,shop.getId())
        );
        return accountResponse;
    }
    @Override
    public ShopInfoResponse getShopInfo(Integer shopId){
        ShopInfoResponse response = new ShopInfoResponse();
        Shop shop = shopMapper.selectById(shopId);
        if(Objects.isNull(shop)){
            throw new BusinessException(ResponseStatus.DATA_EMPTY);
        }
        String path = systemDictDataBiz.queryByCode(Constants.OSS, Constants.RESOURCE_PATH).getCode()
                + systemDictDataBiz.queryByCode(Constants.OSS, Constants.SHOP_FILE).getCode();
        BeanUtils.copyProperties(shop,response);
        response.setImgurl(path + shop.getImgurl());
        response.setIdcardImg(path + shop.getIdcardImg());
        response.setIdcardImgBack(path + shop.getIdcardImgBack());
        response.setBusinessImg(path + shop.getBusinessImg());
        return response;
    }
    @Override
    public List<MyCustomerResponse> myCustomer(MyCustomerRequest request, Integer shopId){
        List<Member>  memberList = memberJoinMapper.selectJoinList(Member.class,
                new MPJLambdaWrapper<Member>()
                        .selectAll(Member.class)
                        .eq(Member::getIsdeleted,Constants.ZERO)
                        .eq(Member::getBindShopId,shopId)
                        .and(StringUtils.isNotBlank(request.getMemberIfo()),i->i.like(Member::getPhone,request.getMemberIfo()).or().like(Member::getNickname,request.getMemberIfo()))
        );
        List<MyCustomerResponse> responseList = new ArrayList<>();
        if(com.github.xiaoymin.knife4j.core.util.CollectionUtils.isNotEmpty(memberList)){
            String path = systemDictDataBiz.queryByCode(Constants.OSS, Constants.RESOURCE_PATH).getCode()
                    + systemDictDataBiz.queryByCode(Constants.OSS, Constants.MEMBER_FILE).getCode();
            memberList.forEach(member -> {
                MyCustomerResponse response = new MyCustomerResponse();
                response.setNickName(member.getNickname());
                response.setPhone(member.getPhone().replaceAll("(\\d{3})\\d{4}(\\d{4})","$1****$2"));
                response.setBindShopDate(member.getBindShopDate());
                response.setImgFullUrl(StringUtils.isNotBlank(member.getImgurl())?path + member.getImgurl():"");
                responseList.add(response);
            });
        }
        return responseList;
    }
    @Override
    public SaleReportResponse saleReport(SaleReportRequest request,String shopId){
        SaleReportResponse saleReportResponse = new SaleReportResponse();
        saleReportResponse.setSaleTotal(BigDecimal.ZERO);
        saleReportResponse.setOrderNum(Constants.ZERO);
        saleReportResponse.setProfitTotal(BigDecimal.ZERO);
        List<Goodsorder> goodsorderList = goodsorderJoinMapper.selectJoinList(Goodsorder.class,
                new MPJLambdaWrapper<Goodsorder>()
                        .selectAll(Goodsorder.class)
                        .selectAs(Member::getPhone,Goodsorder::getPhone)
                        .selectAs(Member::getNickname,Goodsorder::getNickName)
                        .select(" select ifnull(sum(g.SHOP_SETTLEMENT),0) from goodsorder_detail g where t.id = g.ORDER_ID   ",Goodsorder::getShopSettlement)
                        .leftJoin(Member.class,Member::getId,Goodsorder::getMemberId)
                        .eq(Goodsorder::getIsdeleted,Constants.ZERO)
                        .eq(Goodsorder::getDistributionShopId,shopId)
                        //今日
                        .apply(Constants.equalsInteger(request.getDateType(),Constants.ZERO), " DATE(t.CREATE_DATE) = DATE(NOW())  ")
                        //当月
                        .apply(Constants.equalsInteger(request.getDateType(),Constants.ONE), " DATE_FORMAT(t.CREATE_DATE, '%Y-%m') = DATE_FORMAT(NOW(), '%Y-%m')")
                        //上月
                        .apply(Constants.equalsInteger(request.getDateType(),Constants.TWO), "  DATE_FORMAT(t.CREATE_DATE, '%Y-%m') = DATE_FORMAT(DATE_SUB(CURDATE(), INTERVAL 1 MONTH), '%Y-%m') ")
                        //固定月份
                        .apply(Constants.equalsInteger(request.getDateType(),Constants.THREE)&&StringUtils.isNotBlank(request.getStartDate()), " DATE_FORMAT(t.CREATE_DATE, '%Y-%m') = DATE_FORMAT(DATE_SUB('"+request.getStartDate()+"', INTERVAL 1 MONTH), '%Y-%m') ")
                        //自定义日期
                        .apply(Constants.equalsInteger(request.getDateType(),Constants.FOUR)&&StringUtils.isNotBlank(request.getStartDate()), "  t.CREATE_DATE >= '"+request.getStartDate()+" 00:00:00'")
                        .apply(Constants.equalsInteger(request.getDateType(),Constants.FOUR)&&StringUtils.isNotBlank(request.getEndDate()), "  t.CREATE_DATE <= '"+request.getEndDate()+" 23:59:59'")
                        .ne(Goodsorder::getStatus,Constants.OrderStatus.CLOSE.getKey())
                        .orderByDesc(Goodsorder::getId)
        );
        if (com.github.xiaoymin.knife4j.core.util.CollectionUtils.isNotEmpty(goodsorderList)) {
            saleReportResponse.setSaleTotal(goodsorderList.stream().map(i->i.getPrice().subtract(i.getMailPrice())).reduce(BigDecimal.ZERO, BigDecimal::add));
            saleReportResponse.setOrderNum(goodsorderList.size());
            if(Constants.equalsInteger(request.getQueryType(),Constants.ONE)){
                List<SaleReportOrderResponse> list = new ArrayList<>();
                goodsorderList.stream().forEach(goodsorder -> {
                    SaleReportOrderResponse response = new SaleReportOrderResponse();
                    response.setId(goodsorder.getId());
                    response.setCode(goodsorder.getCode());
                    response.setPrice(goodsorder.getPrice());
                    response.setMailPrice(goodsorder.getMailPrice());
                    response.setCreateDate(goodsorder.getCreateDate());
                    response.setNickName(goodsorder.getNickName());
                    response.setPhone(goodsorder.getPhone().replaceAll("(\\d{3})\\d{4}(\\d{4})", "$1****$2"));
                    response.setShopSettlement(goodsorder.getShopSettlement());
                    list.add(response);
                });
                saleReportResponse.setSaleReportOrderResponseList(list);
            }
        }
        List<Integral> integralList = integralMapper.selectList(new QueryWrapper<Integral>().lambda()
                .eq(Integral::getIsdeleted,Constants.ZERO)
                .eq(Integral::getMemberId,shopId)
                .eq(Integral::getUserType,Constants.TWO)
                .eq(Integral::getType,Constants.ZERO)
                .eq(Integral::getObjType,Constants.IntegralObjType.ORDER_DONE_AMOUNT.getKey())
                //今日
                .apply(Constants.equalsInteger(request.getDateType(),Constants.ZERO), " DATE(CREATE_DATE) = DATE(NOW())  ")
                //当月
                .apply(Constants.equalsInteger(request.getDateType(),Constants.ONE), " DATE_FORMAT(CREATE_DATE, '%Y-%m') = DATE_FORMAT(NOW(), '%Y-%m')")
                //上月
                .apply(Constants.equalsInteger(request.getDateType(),Constants.TWO), "  DATE_FORMAT(CREATE_DATE, '%Y-%m') = DATE_FORMAT(DATE_SUB(CURDATE(), INTERVAL 1 MONTH), '%Y-%m') ")
                //固定月份
                .apply(Constants.equalsInteger(request.getDateType(),Constants.THREE)&&StringUtils.isNotBlank(request.getStartDate()), " DATE_FORMAT(CREATE_DATE, '%Y-%m') = DATE_FORMAT(DATE_SUB('"+request.getStartDate()+"', INTERVAL 1 MONTH), '%Y-%m') ")
                //自定义日期
                .apply(Constants.equalsInteger(request.getDateType(),Constants.FOUR)&&StringUtils.isNotBlank(request.getStartDate()), "  CREATE_DATE >= '"+request.getStartDate()+" 00:00:00'")
                .apply(Constants.equalsInteger(request.getDateType(),Constants.FOUR)&&StringUtils.isNotBlank(request.getEndDate()), "  CREATE_DATE <= '"+request.getEndDate()+" 23:59:59'")
        );
        if (com.github.xiaoymin.knife4j.core.util.CollectionUtils.isNotEmpty(integralList)) {
            saleReportResponse.setProfitTotal(integralList.stream().map(i->i.getNum()).reduce(BigDecimal.ZERO, BigDecimal::add));
        }
        return  saleReportResponse;
    }
}
server/dmmall_service/src/main/java/com/doumee/service/business/impl/WithdrawRecordServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,274 @@
package com.doumee.service.business.impl;
import com.doumee.biz.system.SystemDictDataBiz;
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.Constants;
import com.doumee.core.utils.DateUtil;
import com.doumee.core.utils.RedisUtil;
import com.doumee.core.utils.Utils;
import com.doumee.dao.business.*;
import com.doumee.dao.business.model.*;
import com.doumee.dao.web.dto.MultiFileDTO;
import com.doumee.dao.web.request.DealIntegralRequest;
import com.doumee.dao.web.request.WithdrawApplyRequest;
import com.doumee.service.business.IntegralService;
import com.doumee.service.business.WithdrawRecordService;
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 org.apache.commons.lang3.StringUtils;
import org.bouncycastle.cert.dane.DANEEntry;
import org.checkerframework.checker.units.qual.A;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Objects;
/**
 * ç”¨æˆ·æçŽ°è®°å½•Service实现
 * @author æ±Ÿè¹„蹄
 * @date 2026/01/16 11:50
 */
@Service
public class WithdrawRecordServiceImpl implements WithdrawRecordService {
    @Autowired
    private WithdrawRecordMapper withdrawRecordMapper;
    @Autowired
    private ShopMapper shopMapper;
    @Autowired
    private IntegralMapper integralMapper;
    @Autowired
    private MemberBankMapper memberBankMapper;
    @Autowired
    private SystemDictDataBiz systemDictDataBiz;
    @Autowired
    private MultifileMapper multifileMapper;
    @Autowired
    private RedisTemplate<String, Object> redisTemplate;
    @Override
    public Integer create(WithdrawRecord withdrawRecord) {
        withdrawRecordMapper.insert(withdrawRecord);
        return withdrawRecord.getId();
    }
    @Override
    public void deleteById(Integer id) {
        withdrawRecordMapper.deleteById(id);
    }
    @Override
    public void delete(WithdrawRecord withdrawRecord) {
        UpdateWrapper<WithdrawRecord> deleteWrapper = new UpdateWrapper<>(withdrawRecord);
        withdrawRecordMapper.delete(deleteWrapper);
    }
    @Override
    public void deleteByIdInBatch(List<Integer> ids) {
        if (CollectionUtils.isEmpty(ids)) {
            return;
        }
        withdrawRecordMapper.deleteBatchIds(ids);
    }
    @Override
    public void updateById(WithdrawRecord withdrawRecord) {
        withdrawRecordMapper.updateById(withdrawRecord);
    }
    @Override
    public void updateByIdInBatch(List<WithdrawRecord> withdrawRecords) {
        if (CollectionUtils.isEmpty(withdrawRecords)) {
            return;
        }
        for (WithdrawRecord withdrawRecord: withdrawRecords) {
            this.updateById(withdrawRecord);
        }
    }
    @Override
    public WithdrawRecord findById(Integer id) {
        WithdrawRecord withdrawRecord = withdrawRecordMapper.selectById(id);
        if (Objects.isNull(withdrawRecord)) {
            throw new BusinessException(ResponseStatus.DATA_EMPTY);
        }
        MemberBank memberBank = memberBankMapper.selectById(withdrawRecord.getBankId());
        if(Objects.nonNull(memberBank)){
            withdrawRecord.setBankName(memberBank.getBankName());
        }
        if(!Constants.equalsInteger(withdrawRecord.getStatus(), Constants.ZERO)){
            String path = systemDictDataBiz.queryByCode(Constants.OSS, Constants.RESOURCE_PATH).getCode() +
                    systemDictDataBiz.queryByCode(Constants.OSS, Constants.TRANSFER_FILE).getCode();
            Multifile queryfile = new Multifile();
            queryfile.setObjId(withdrawRecord.getId());
            queryfile.setObjType(  Constants.MultiFile.TRANSFER_FILE.getKey());
            queryfile.setIsdeleted(Constants.ZERO);
            List<Multifile> filelist = multifileMapper.selectList(new QueryWrapper<>(queryfile));
            if(filelist !=null && filelist.size()>0){
                for (Multifile multifile:filelist) {
                    multifile.setFileFullUrl(path + multifile.getFileurl());
                }
                withdrawRecord.setPayFileList(filelist);
            }
        }
        return withdrawRecord;
    }
    @Override
    public WithdrawRecord findOne(WithdrawRecord withdrawRecord) {
        QueryWrapper<WithdrawRecord> wrapper = new QueryWrapper<>(withdrawRecord);
        return withdrawRecordMapper.selectOne(wrapper);
    }
    @Override
    public List<WithdrawRecord> findList(WithdrawRecord withdrawRecord) {
        QueryWrapper<WithdrawRecord> wrapper = new QueryWrapper<>(withdrawRecord);
        return withdrawRecordMapper.selectList(wrapper);
    }
    @Override
    public PageData<WithdrawRecord> findPage(PageWrap<WithdrawRecord> pageWrap) {
        IPage<WithdrawRecord> page = new Page<>(pageWrap.getPage(), pageWrap.getCapacity());
        QueryWrapper<WithdrawRecord> queryWrapper = new QueryWrapper<>();
        Utils.MP.blankToNull(pageWrap.getModel());
        if (pageWrap.getModel().getId() != null) {
            queryWrapper.lambda().eq(WithdrawRecord::getId, pageWrap.getModel().getId());
        }
        if (pageWrap.getModel().getCreator() != null) {
            queryWrapper.lambda().eq(WithdrawRecord::getCreator, pageWrap.getModel().getCreator());
        }
        if (pageWrap.getModel().getCreateDate() != null) {
            queryWrapper.lambda().ge(WithdrawRecord::getCreateDate, Utils.Date.getStart(pageWrap.getModel().getCreateDate()));
            queryWrapper.lambda().le(WithdrawRecord::getCreateDate, Utils.Date.getEnd(pageWrap.getModel().getCreateDate()));
        }
        if (pageWrap.getModel().getEditor() != null) {
            queryWrapper.lambda().eq(WithdrawRecord::getEditor, pageWrap.getModel().getEditor());
        }
        if (pageWrap.getModel().getEditDate() != null) {
            queryWrapper.lambda().ge(WithdrawRecord::getEditDate, Utils.Date.getStart(pageWrap.getModel().getEditDate()));
            queryWrapper.lambda().le(WithdrawRecord::getEditDate, Utils.Date.getEnd(pageWrap.getModel().getEditDate()));
        }
        if (pageWrap.getModel().getIsdeleted() != null) {
            queryWrapper.lambda().eq(WithdrawRecord::getIsdeleted, pageWrap.getModel().getIsdeleted());
        }
        if (pageWrap.getModel().getRemark() != null) {
            queryWrapper.lambda().eq(WithdrawRecord::getRemark, pageWrap.getModel().getRemark());
        }
        if (pageWrap.getModel().getMemberId() != null) {
            queryWrapper.lambda().eq(WithdrawRecord::getMemberId, pageWrap.getModel().getMemberId());
        }
        if (pageWrap.getModel().getCode() != null) {
            queryWrapper.lambda().eq(WithdrawRecord::getCode, pageWrap.getModel().getCode());
        }
        if (pageWrap.getModel().getBankId() != null) {
            queryWrapper.lambda().eq(WithdrawRecord::getBankId, pageWrap.getModel().getBankId());
        }
        if (pageWrap.getModel().getStatus() != null) {
            queryWrapper.lambda().eq(WithdrawRecord::getStatus, pageWrap.getModel().getStatus());
        }
        if (pageWrap.getModel().getAuditUser() != null) {
            queryWrapper.lambda().eq(WithdrawRecord::getAuditUser, pageWrap.getModel().getAuditUser());
        }
        if (pageWrap.getModel().getAuditTime() != null) {
            queryWrapper.lambda().ge(WithdrawRecord::getAuditTime, Utils.Date.getStart(pageWrap.getModel().getAuditTime()));
            queryWrapper.lambda().le(WithdrawRecord::getAuditTime, Utils.Date.getEnd(pageWrap.getModel().getAuditTime()));
        }
        if (pageWrap.getModel().getAuditRemark() != null) {
            queryWrapper.lambda().eq(WithdrawRecord::getAuditRemark, pageWrap.getModel().getAuditRemark());
        }
        if (pageWrap.getModel().getPayBank() != null) {
            queryWrapper.lambda().eq(WithdrawRecord::getPayBank, pageWrap.getModel().getPayBank());
        }
        for(PageWrap.SortData sortData: pageWrap.getSorts()) {
            if (sortData.getDirection().equalsIgnoreCase(PageWrap.DESC)) {
                queryWrapper.orderByDesc(sortData.getProperty());
            } else {
                queryWrapper.orderByAsc(sortData.getProperty());
            }
        }
        return PageData.from(withdrawRecordMapper.selectPage(page, queryWrapper));
    }
    @Override
    public long count(WithdrawRecord withdrawRecord) {
        QueryWrapper<WithdrawRecord> wrapper = new QueryWrapper<>(withdrawRecord);
        return withdrawRecordMapper.selectCount(wrapper);
    }
    @Override
    public void withdrawApply(WithdrawApplyRequest request, IntegralService integralService){
        if (Objects.isNull( request)
            || request.getMemberId() == null
            || request.getBankId() == null
            || request.getAmount() == null) {
            throw new BusinessException(ResponseStatus.BAD_REQUEST);
        }
        //查询商户剩余余额
        Shop shop = shopMapper.selectById(request.getMemberId());
        if(Objects.isNull(shop)){
            throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),"未查询到商户信息");
        }
        if(shop.getAmount().compareTo(request.getAmount()) < 0){
            throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"商户余额不足");
        }
        WithdrawRecord withdrawRecord = new WithdrawRecord();
        withdrawRecord.setCreateDate(new Date());
        withdrawRecord.setIsdeleted(Constants.ZERO);
        withdrawRecord.setEditDate(new Date());
        withdrawRecord.setBankId(request.getBankId());
        withdrawRecord.setAmount(request.getAmount());
        withdrawRecord.setMemberId(request.getMemberId());
        withdrawRecord.setCode(this.getNextInCode());
        withdrawRecord.setStatus(Constants.ZERO);
        withdrawRecordMapper.insert(withdrawRecord);
        DealIntegralRequest dealIntegralRequest = new DealIntegralRequest();
        dealIntegralRequest.setIntegralObjType(Constants.IntegralObjType.WITHDRAW_APPLY);
        dealIntegralRequest.setIntegralNum(request.getAmount());
        dealIntegralRequest.setObjId(withdrawRecord.getId());
        dealIntegralRequest.setOrderCode(withdrawRecord.getCode().toString());
        dealIntegralRequest.setMemberId(request.getMemberId());
        dealIntegralRequest.setDealType(Constants.ONE);
        integralService.dealShopAmount(dealIntegralRequest);
    }
    public synchronized  Long  getNextInCode(){
        String prefix =  DateUtil.getDate(new Date(),"yyyyMMdd") ;
        Integer countNum  = RedisUtil.getObject(redisTemplate, Constants.RedisKeys.WITHDRAW_KEY,Integer.class);
        countNum = Constants.formatIntegerNum(countNum)+1;
        //更新缓存
        RedisUtil.addObject(redisTemplate,Constants.RedisKeys.WITHDRAW_KEY,countNum);
        String nextIndex =Long.toString( countNum);
        return Long.parseLong(prefix + StringUtils.leftPad(nextIndex,4,"0"));
    }
}
server/dmmall_web/src/main/java/com/doumee/api/web/AccountApi.java
@@ -47,6 +47,16 @@
        return  ApiResponse.success(memberService.wxLogin(code,recId));
    }
    @LoginRequired
    @ApiOperation(value = "绑定手机号", notes = "小程序端")
    @PostMapping("/wxPhone")
    @ApiImplicitParams({
            @ApiImplicitParam(paramType = "header", dataType = "String", name = "token", value = "用户token值", required = true)
    })
    public ApiResponse<AccountResponse> wxPhone(@Valid @RequestBody WxPhoneRequest wxPhoneRequest) {
        return  ApiResponse.success(memberService.wxPhone(wxPhoneRequest));
    }
    @ApiOperation(value = "测试登陆接口", notes = "小程序端")
    @GetMapping("/testLogin")
    @ApiImplicitParams({
@@ -56,17 +66,6 @@
        return  ApiResponse.success(memberService.wxLoginTest(memberId));
    }
    @LoginRequired
    @ApiOperation(value = "绑定手机号", notes = "小程序端")
    @PostMapping("/wxPhone")
    @ApiImplicitParams({
            @ApiImplicitParam(paramType = "header", dataType = "String", name = "token", value = "用户token值", required = true)
    })
    public ApiResponse wxLogin(@Valid @RequestBody WxPhoneRequest wxPhoneRequest) {
        wxPhoneRequest.setMemberId(getMemberId());
        memberService.wxPhone(wxPhoneRequest);
        return  ApiResponse.success("绑定成功");
    }
    @LoginRequired
    @ApiOperation(value = "更新用户信息", notes = "小程序端")
server/dmmall_web/src/main/java/com/doumee/api/web/ApiController.java
@@ -10,6 +10,7 @@
import com.doumee.dao.system.model.SystemDictData;
import com.doumee.dao.web.response.goods.CartGoodsResponse;
import com.doumee.service.business.*;
import com.doumee.service.business.impl.MemberCouponServiceImpl;
import com.doumee.service.system.SystemDictDataService;
import lombok.extern.slf4j.Slf4j;
import org.apache.shiro.SecurityUtils;
@@ -58,6 +59,14 @@
    @Autowired
    public ShopService shopService;
    @Autowired
    public WithdrawRecordService withdrawRecordService;
    @Autowired
    public MemberBankService memberBankService;
    @Autowired
    public MemberCouponServiceImpl memberCouponServiceImpl;
    @Autowired
    public GoodsorderDetailService goodsorderDetailService;
@@ -156,4 +165,10 @@
        return obj != null ? (Integer) obj : null;
    }
    protected Integer getShopId() {
        Object obj = this.getRequest().getAttribute(JwtTokenUtil.ShopId_Name);
        return obj != null ? (Integer) obj : null;
    }
}
server/dmmall_web/src/main/java/com/doumee/api/web/MemberBankApi.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,57 @@
package com.doumee.api.web;
import com.doumee.config.annotation.LoginRequired;
import com.doumee.config.annotation.LoginShopRequired;
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.MemberBank;
import com.doumee.dao.web.dto.shop.*;
import com.doumee.dao.web.request.MemberBankSaveRequest;
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.web.bind.annotation.*;
import java.util.List;
/**
 * Created by IntelliJ IDEA.
 *
 * @Author : Rk
 * @create 2023/3/23 17:33
 */
@Api(tags = "商户提现银行卡")
@Trace(exclude = true)
@RestController
@RequestMapping("/web/bank")
@Slf4j
public class MemberBankApi extends ApiController{
    @LoginShopRequired
    @ApiOperation(value = "提现银行新增修改", notes = "小程序端")
    @PostMapping("/saveBank")
    @ApiImplicitParams({
            @ApiImplicitParam(paramType = "header", dataType = "String", name = "token", value = "用户token值", required = true),
    })
    public ApiResponse saveBank(@RequestBody MemberBankSaveRequest request){
        request.setMemberId(getShopId());
        memberBankService.saveOrUpdate(request);
        return ApiResponse.success("操作成功");
    }
    @LoginShopRequired
    @ApiOperation(value = "获取我的提现银行卡", notes = "小程序端")
    @GetMapping("/getBankList")
    @ApiImplicitParams({
            @ApiImplicitParam(paramType = "header", dataType = "String", name = "token", value = "用户token值", required = true),
    })
    public ApiResponse<List<MemberBank>> getBankList(){
        return ApiResponse.success(memberBankService.getMyBankList(getShopId()));
    }
}
server/dmmall_web/src/main/java/com/doumee/api/web/ShopApi.java
@@ -1,14 +1,24 @@
package com.doumee.api.web;
import com.doumee.config.annotation.LoginRequired;
import com.doumee.config.annotation.LoginShopRequired;
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.Shop;
import com.doumee.dao.business.model.WithdrawRecord;
import com.doumee.dao.web.dto.shop.*;
import com.doumee.dao.web.request.WithdrawApplyRequest;
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.springframework.web.bind.annotation.*;
import java.util.List;
/**
 * Created by IntelliJ IDEA.
@@ -68,4 +78,46 @@
        shopService.update(shopDTO,memberId);
        return ApiResponse.success(null);
    }
    @LoginRequired
    @ApiOperation(value = "用户下单查询可选择的自提经销商", notes = "小程序端")
    @PostMapping("/getShopList")
    @ApiImplicitParams({
            @ApiImplicitParam(paramType = "header", dataType = "String", name = "token", value = "用户token值", required = true),
    })
    public ApiResponse getShopList(@RequestBody ShopListDTO dto){
        return ApiResponse.success(shopService.getShopList(dto));
    }
    @LoginShopRequired
    @ApiOperation(value = "提现申请 - ç»é”€å•†", notes = "小程序端")
    @PostMapping("/withdrawApply")
    @ApiImplicitParams({
            @ApiImplicitParam(paramType = "header", dataType = "String", name = "token", value = "用户token值", required = true),
    })
    public ApiResponse withdrawApply(@RequestBody WithdrawApplyRequest request){
        request.setMemberId(getShopId());
        withdrawRecordService.withdrawApply(request,integralService);
        return ApiResponse.success("操作成功");
    }
    @LoginShopRequired
    @ApiOperation("查询提现申请详情")
    @GetMapping("/withdrawDetail")
    @ApiImplicitParams({
            @ApiImplicitParam(paramType = "header", dataType = "String", name = "token", value = "用户token值", required = true),
    })
    public ApiResponse<WithdrawRecord> withdrawDetail(@RequestParam Integer id) {
        return ApiResponse.success(withdrawRecordService.findById(id));
    }
}
server/dmmall_web/src/main/java/com/doumee/api/web/mall/IntegralApi.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,63 @@
package com.doumee.api.web.mall;
import com.doumee.api.web.ApiController;
import com.doumee.config.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.Integral;
import com.doumee.dao.web.dto.IntegralRecordDTO;
import com.doumee.dao.web.response.IntegralDataResponse;
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.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
 * Created by IntelliJ IDEA.
 *
 * @Author : Rk
 * @create 2026/1/14 16:53
 */
@Api(tags = "积分信息业务")
@Trace(exclude = true)
@RestController
@RequestMapping("/web/integral")
@Slf4j
public class IntegralApi extends ApiController {
    @LoginRequired
    @ApiOperation("获取用户的积分记录")
    @PostMapping("/findIntegralRecordPage")
    @ApiImplicitParams({
            @ApiImplicitParam(paramType = "header", dataType = "String", name = "token", value = "用户token值", required = true),
    })
    public ApiResponse<PageData<Integral>> findIntegralRecordPage (@RequestBody PageWrap<IntegralRecordDTO> pageWrap) {
        return ApiResponse.success(integralService.findIntegralRecordPage(pageWrap));
    }
    @LoginRequired
    @ApiOperation("获取用户剩余积分与待情况积分信息")
    @PostMapping("/getIntegralData")
    @ApiImplicitParams({
            @ApiImplicitParam(paramType = "header", dataType = "String", name = "token", value = "用户token值", required = true),
    })
    public ApiResponse<IntegralDataResponse> getIntegralData (@RequestBody IntegralRecordDTO dto) {
        return ApiResponse.success(integralService.getIntegralData(dto));
    }
}
server/dmmall_web/src/main/java/com/doumee/api/web/mall/OrderApi.java
@@ -3,8 +3,10 @@
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.doumee.api.web.ApiController;
import com.doumee.config.annotation.LoginRequired;
import com.doumee.config.annotation.LoginShopRequired;
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.core.utils.kuaidi100.DeliveryDTO;
import com.doumee.core.utils.kuaidi100.ExpressUtils;
@@ -14,10 +16,7 @@
import com.doumee.dao.business.model.MemberCoupon;
import com.doumee.dao.business.model.Shop;
import com.doumee.dao.web.dto.CouponDTO;
import com.doumee.dao.web.request.OrderPayRequest;
import com.doumee.dao.web.request.PageRequest;
import com.doumee.dao.web.request.PayDetailRequest;
import com.doumee.dao.web.request.ShopOrderPayRequest;
import com.doumee.dao.web.request.*;
import com.doumee.dao.web.request.goods.DealOrderRequest;
import com.doumee.dao.web.request.goods.MemberOrderRequest;
import com.doumee.dao.web.request.goods.OrderCommentRequest;
@@ -135,19 +134,16 @@
        return ApiResponse.success("查询成功", memberCouponService.getApplyCoupon(requestList,getMemberId()));
    }
    @LoginRequired
    @ApiOperation("经销商列表")
    @PostMapping("/shopPage")
    @ApiImplicitParams({
            @ApiImplicitParam(paramType = "header", dataType = "String", name = "token", value = "用户token值", required = true),
    })
    public ApiResponse<IPage<Shop>> shopPage(@RequestBody PageWrap<Shop> pageWrap) {
        IPage<Shop> page = goodsorderService.getShopPage(pageWrap);
        return ApiResponse.success("查询成功",page);
    }
    @Autowired
    public MemberCouponServiceImpl memberCouponServiceImpl;
//    @LoginRequired
//    @ApiOperation("经销商列表")
//    @PostMapping("/shopPage")
//    @ApiImplicitParams({
//            @ApiImplicitParam(paramType = "header", dataType = "String", name = "token", value = "用户token值", required = true),
//    })
//    public ApiResponse<IPage<Shop>> shopPage(@RequestBody PageWrap<Shop> pageWrap) {
//        IPage<Shop> page = goodsorderService.getShopPage(pageWrap);
//        return ApiResponse.success("查询成功",page);
//    }
    @LoginRequired
    @ApiOperation("订单支付")
@@ -299,4 +295,30 @@
        return ApiResponse.success("操作成功",deliveryDTO);
    }
    @LoginShopRequired
    @ApiOperation("经销商订单列表")
    @PostMapping("/shopOrderPage")
    @ApiImplicitParams({
            @ApiImplicitParam(paramType = "header", dataType = "String", name = "token", value = "用户token值", required = true),
    })
    public ApiResponse<PageData<Goodsorder>> shopOrderPage(@RequestBody PageWrap<ShopOrderRequest> pageWrap) {
        pageWrap.getModel().setShopId(getShopId());
        PageData<Goodsorder> page = goodsorderService.shopOrderPage(pageWrap);
        return ApiResponse.success("查询成功",page);
    }
    @LoginShopRequired
    @ApiOperation("订单详情 - ç»é”€å•†")
    @GetMapping("/shopOrderDetail")
    @ApiImplicitParams({
            @ApiImplicitParam(paramType = "header", dataType = "String", name = "token", value = "用户token值", required = true),
            @ApiImplicitParam(paramType = "query", dataType = "Integer", name = "orderId", value = "订单主键", required = true),
    })
    public ApiResponse<MemberOrderResponse> shopOrderDetail(@RequestParam Integer orderId) {
        return ApiResponse.success("查询成功", goodsorderService.getGoodsOrderDetail(orderId));
    }
}