Administrator
2026-06-12 07b964209ad7ff91def2ed1962c5a02441710d86
refactor(mall): 重构DTO和控制器结构并添加验证注解

- 在AddCollectionDto中添加@NotBlank验证注解
- 移除AddOrderDto中的冗余字段和属性
- 重构AddressInfoDto的地址信息结构并更新验证规则
- 更新AddressInfoVo以匹配新的地址信息模型
- 从AdminMallMemberController中移除注册类型和邀请ID相关代码
- 删除ApiApplyController和ApiMallActController控制器
- 移除ApiMallActServiceImpl服务实现类
- 新增dependentStation包下的ApiLoginController
- 重新组织登录注册相关的API端点
7 files deleted
5 files added
4 files renamed
21 files modified
3219 ■■■■ changed files
src/main/java/cc/mrbird/febs/mall/controller/AdminMallMemberController.java 2 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/controller/ApiApplyController.java 51 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/controller/ApiLoginController.java 139 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/controller/ApiMallActController.java 51 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/controller/ApiMallAddressInfoController.java 93 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/controller/ApiMallMemberController.java 328 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/controller/ApiMallOrderController.java 17 ●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/controller/dependentStation/ApiLoginController.java 60 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/controller/dependentStation/ApiMallAddressInfoController.java 54 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/controller/dependentStation/ApiMallGoodsCategoryController.java 4 ●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/controller/dependentStation/ApiMallGoodsController.java 7 ●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/controller/dependentStation/ApiMallMemberController.java 78 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/controller/dependentStation/ApiMallShoppingCartController.java 15 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/controller/dependentStation/ApiMemberCollectionController.java 20 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/controller/dependentStation/enums/SalesServiceEnums.java 21 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/dto/AddCollectionDto.java 3 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/dto/AddOrderDto.java 15 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/dto/AddressInfoDto.java 58 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/dto/ForgetPwdDto.java 19 ●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/dto/LoginDto.java 6 ●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/dto/ModifyMemberInfoDto.java 11 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/dto/RegisterDto.java 22 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/entity/MallAddressInfo.java 4 ●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/service/IApiMallActService.java 22 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/service/IApiMallAddressInfoService.java 11 ●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/service/IApiMallMemberService.java 60 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/service/IMallMemberCollectionService.java 3 ●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/service/impl/ApiMallActServiceImpl.java 607 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/service/impl/ApiMallAddressInfoServiceImpl.java 130 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/service/impl/ApiMallGoodsServiceImpl.java 6 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/service/impl/ApiMallMemberServiceImpl.java 985 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/service/impl/ApiMallOrderInfoServiceImpl.java 134 ●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/service/impl/ApiMallShoppingCartServiceImpl.java 31 ●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/service/impl/MallMemberCollectionServiceImpl.java 10 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/vo/AddressInfoVo.java 36 ●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/vo/MallMemberVo.java 86 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/vo/MallSalesServiceVo.java 20 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/controller/AdminMallMemberController.java
@@ -397,9 +397,7 @@
    public FebsResponse memberAdd(MallMember member) {
        RegisterDto registerDto = new RegisterDto();
        registerDto.setAccount(member.getAccount());
        registerDto.setRegistType("admin");
        registerDto.setPassword("a123456");
        registerDto.setInviteId(member.getInviteId());
        apiMallMemberService.register(registerDto);
        return new FebsResponse().success();
    }
src/main/java/cc/mrbird/febs/mall/controller/ApiApplyController.java
File was deleted
src/main/java/cc/mrbird/febs/mall/controller/ApiLoginController.java
File was deleted
src/main/java/cc/mrbird/febs/mall/controller/ApiMallActController.java
File was deleted
src/main/java/cc/mrbird/febs/mall/controller/ApiMallAddressInfoController.java
File was deleted
src/main/java/cc/mrbird/febs/mall/controller/ApiMallMemberController.java
File was deleted
src/main/java/cc/mrbird/febs/mall/controller/ApiMallOrderController.java
@@ -1,6 +1,8 @@
package cc.mrbird.febs.mall.controller;
import cc.mrbird.febs.common.annotation.Limit;
import cc.mrbird.febs.common.entity.FebsResponse;
import cc.mrbird.febs.common.entity.LimitType;
import cc.mrbird.febs.mall.dto.*;
import cc.mrbird.febs.mall.service.IApiMallOrderInfoService;
import cc.mrbird.febs.mall.vo.OrderDetailVo;
@@ -27,7 +29,7 @@
@RestController
@RequiredArgsConstructor
@RequestMapping(value = "/api/order")
@Api(value = "ApiMallOrderController", tags = "订单接口类")
@Api(value = "ApiMallOrderController", tags = "DS-订单接口类")
public class ApiMallOrderController {
    private final IApiMallOrderInfoService mallOrderInfoService;
@@ -35,26 +37,23 @@
    @ApiOperation(value = "创建订单--验证是否允许创建", notes = "创建订单--验证是否允许创建")
    @PostMapping(value = "/createOrderVerify")
    @Limit(key = "createOrderVerify", period = 5, count = 1, name = "注册", prefix = "limit",limitType = LimitType.IP)
    public FebsResponse createOrderVerify(@RequestBody ApiCreateOrderVerifyDto apiCreateOrderVerifyDto) {
        return mallOrderInfoService.createOrderVerify(apiCreateOrderVerifyDto);
    }
    @ApiOperation(value = "选择优惠卷", notes = "选择优惠卷")
    @PostMapping(value = "/chooseCoupon")
    public FebsResponse chooseCoupon(@RequestBody ApiChooseCouponDto chooseCouponDto) {
        return mallOrderInfoService.chooseCoupon(chooseCouponDto);
    }
    @ApiOperation(value = "创建订单", notes = "创建订单")
    @PostMapping(value = "/createOrder")
    public FebsResponse createOrder(@RequestBody AddOrderDto addOrderDto) {
    @Limit(key = "createOrder", period = 5, count = 1, name = "注册", prefix = "limit",limitType = LimitType.IP)
    public FebsResponse createOrder(@RequestBody @Validated AddOrderDto addOrderDto) {
        Long orderId = mallOrderInfoService.createOrder(addOrderDto);
        return new FebsResponse().success().data(orderId).message("创建订单成功");
        return new FebsResponse().success().data(orderId).message("Order successfully created");
    }
    @ApiOperation(value = "取消订单", notes = "取消订单")
    @PostMapping(value = "/cancelOrder/{id}")
    @Limit(key = "cancelOrder", period = 5, count = 1, name = "注册", prefix = "limit",limitType = LimitType.IP)
    public FebsResponse cancelOrder(@PathVariable("id") Long id) {
        mallOrderInfoService.cancelOrder(id);
        return new FebsResponse().success();
src/main/java/cc/mrbird/febs/mall/controller/dependentStation/ApiLoginController.java
New file
@@ -0,0 +1,60 @@
package cc.mrbird.febs.mall.controller.dependentStation;
import cc.mrbird.febs.common.annotation.Limit;
import cc.mrbird.febs.common.entity.FebsResponse;
import cc.mrbird.febs.common.entity.LimitType;
import cc.mrbird.febs.common.utils.RedisUtils;
import cc.mrbird.febs.mall.dto.*;
import cc.mrbird.febs.mall.service.IApiMallMemberService;
import cc.mrbird.febs.pay.model.WxGenerateQrCodeDto;
import cc.mrbird.febs.pay.service.IXcxPayService;
import cc.mrbird.febs.pay.util.WechatConfigure;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import javax.validation.Valid;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Dictionary;
import java.util.HashMap;
import java.util.Map;
/**
 * @author wzy
 * @date 2021-09-16
 **/
@Slf4j
@CrossOrigin("*")
@RequiredArgsConstructor
@RestController
@RequestMapping(value = "/api/login")
@Api(value = "ApiLoginController", tags = "DS-登录注册类")
public class ApiLoginController {
    private final IApiMallMemberService memberService;
    @ApiOperation(value = "app注册接口", notes = "app注册接口")
    @PostMapping(value = "/register")
    @Limit(key = "register", period = 5, count = 1, name = "注册", prefix = "limit",limitType = LimitType.IP)
    public FebsResponse register(@RequestBody @Validated RegisterDto registerDto) {
        return memberService.register(registerDto);
    }
    @ApiOperation(value = "账号密码登录接口", notes = "账号密码登录接口")
    @PostMapping(value = "/toLogin")
    @Limit(key = "toLogin", period = 5, count = 1, name = "注册", prefix = "limit",limitType = LimitType.IP)
    public FebsResponse login(@RequestBody @Validated LoginDto loginDto) {
        return memberService.toLogin(loginDto);
    }
}
src/main/java/cc/mrbird/febs/mall/controller/dependentStation/ApiMallAddressInfoController.java
New file
@@ -0,0 +1,54 @@
package cc.mrbird.febs.mall.controller.dependentStation;
import cc.mrbird.febs.common.annotation.Limit;
import cc.mrbird.febs.common.entity.FebsResponse;
import cc.mrbird.febs.common.entity.LimitType;
import cc.mrbird.febs.mall.conversion.MallAddressInfoConversion;
import cc.mrbird.febs.mall.dto.AddressInfoDto;
import cc.mrbird.febs.mall.dto.ApiIdentifyAddressDto;
import cc.mrbird.febs.mall.entity.MallAddressInfo;
import cc.mrbird.febs.mall.service.IApiMallAddressInfoService;
import cc.mrbird.febs.mall.vo.AddressInfoVo;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiResponse;
import io.swagger.annotations.ApiResponses;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import javax.validation.Valid;
/**
 * @author wzy
 * @date 2021-09-18
 **/
@Slf4j
@Validated
@RestController
@RequiredArgsConstructor
@RequestMapping(value = "/api/address")
@Api(value = "ApiMallAddressInfoController", tags = "DS-用户地址管理接口类")
public class ApiMallAddressInfoController {
    private final IApiMallAddressInfoService mallAddressInfoService;
    @ApiOperation(value = "获取地址信息", notes = "获取地址信息")
    @ApiResponses({
            @ApiResponse(code = 200, message = "success", response = AddressInfoVo.class)
    })
    @GetMapping(value = "/findAddressInfo")
    public FebsResponse findAddressInfo() {
        return mallAddressInfoService.findAddressInfo();
    }
    @ApiOperation(value = "修改地址", notes = "修改地址")
    @PostMapping(value = "/modifyAddress")
    @Limit(key = "modifyAddress", period = 5, count = 1, name = "注册", prefix = "limit",limitType = LimitType.IP)
    public FebsResponse modifyAddress(@RequestBody @Validated AddressInfoDto addressInfoDto) {
        return mallAddressInfoService.modifyAddress(addressInfoDto);
    }
}
src/main/java/cc/mrbird/febs/mall/controller/dependentStation/ApiMallGoodsCategoryController.java
File was renamed from src/main/java/cc/mrbird/febs/mall/controller/ApiMallGoodsCategoryController.java
@@ -1,4 +1,4 @@
package cc.mrbird.febs.mall.controller;
package cc.mrbird.febs.mall.controller.dependentStation;
import cc.mrbird.febs.common.entity.FebsResponse;
import cc.mrbird.febs.mall.service.IApiMallGoodsCategoryService;
@@ -24,7 +24,7 @@
@RestController
@RequiredArgsConstructor
@RequestMapping(value = "/api/category")
@Api(value = "ApiMallGoodsCategoryController", tags = "商品分类参数接收类")
@Api(value = "ApiMallGoodsCategoryController", tags = "DS-商品分类参数接收类")
public class ApiMallGoodsCategoryController {
    private final IApiMallGoodsCategoryService mallGoodsCategoryService;
src/main/java/cc/mrbird/febs/mall/controller/dependentStation/ApiMallGoodsController.java
File was renamed from src/main/java/cc/mrbird/febs/mall/controller/ApiMallGoodsController.java
@@ -1,6 +1,8 @@
package cc.mrbird.febs.mall.controller;
package cc.mrbird.febs.mall.controller.dependentStation;
import cc.mrbird.febs.common.annotation.Limit;
import cc.mrbird.febs.common.entity.FebsResponse;
import cc.mrbird.febs.common.entity.LimitType;
import cc.mrbird.febs.mall.dto.ApiMallGoodsCommentDto;
import cc.mrbird.febs.mall.dto.MallGoodsQueryDto;
import cc.mrbird.febs.mall.service.IApiMallGoodsService;
@@ -23,7 +25,7 @@
@RestController
@RequiredArgsConstructor
@RequestMapping(value = "/api/goods")
@Api(value = "ApiMallGoodsController", tags = "商城商品接口类")
@Api(value = "ApiMallGoodsController", tags = "DS-商城商品接口类")
public class ApiMallGoodsController {
    private final IApiMallGoodsService mallGoodsService;
@@ -32,6 +34,7 @@
            @ApiResponse(code = 200, message = "success", response = MallGoodsListVo.class)
    })
    @PostMapping(value = "/findMallGoodsList")
    @Limit(key = "findMallGoodsList", period = 5, count = 1, name = "注册", prefix = "limit",limitType = LimitType.IP)
    public FebsResponse findMallGoodsList(@RequestBody MallGoodsQueryDto queryDto) {
        return new FebsResponse().success().data(mallGoodsService.findMallGoodsListInPage(queryDto));
    }
src/main/java/cc/mrbird/febs/mall/controller/dependentStation/ApiMallMemberController.java
New file
@@ -0,0 +1,78 @@
package cc.mrbird.febs.mall.controller.dependentStation;
import cc.mrbird.febs.common.annotation.Limit;
import cc.mrbird.febs.common.entity.FebsResponse;
import cc.mrbird.febs.common.entity.LimitType;
import cc.mrbird.febs.mall.dto.*;
import cc.mrbird.febs.mall.entity.MallMember;
import cc.mrbird.febs.mall.entity.MallMemberCoupon;
import cc.mrbird.febs.mall.entity.MallMemberPayment;
import cc.mrbird.febs.mall.service.*;
import cc.mrbird.febs.mall.vo.*;
import cc.mrbird.febs.vip.service.IMallVipBenefitsService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiResponse;
import io.swagger.annotations.ApiResponses;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import javax.validation.Valid;
import java.util.Map;
/**
 * @author wzy
 * @date 2021-09-16
 **/
@Slf4j
@RestController
@RequestMapping(value = "/api/member")
@RequiredArgsConstructor
@Api(value = "ApiMallMemberController", tags = "DS-商城用户接口类")
public class ApiMallMemberController {
    private final IApiMallMemberService memberService;
    @ApiOperation(value = "获取用户信息", notes = "获取用户信息")
    @ApiResponses({
            @ApiResponse(code = 200, message = "success", response = MallMemberVo.class)
    })
    @GetMapping(value = "/findMemberInfo")
    public FebsResponse findMemberInfo() {
        return memberService.findMemberInfo();
    }
    @ApiOperation(value = "注销", notes = "注销")
    @PostMapping(value = "/logout")
    @Limit(key = "logout", period = 5, count = 1, name = "注册", prefix = "limit",limitType = LimitType.IP)
    public FebsResponse logout() {
        return memberService.logout();
    }
    @ApiOperation(value = "编辑个人信息", notes = "编辑个人信息")
    @PostMapping(value = "/modifyInfo")
    @Limit(key = "modifyInfo", period = 5, count = 1, name = "注册", prefix = "limit",limitType = LimitType.IP)
    public FebsResponse modifyInfo(@RequestBody @Validated ModifyMemberInfoDto modifyMemberInfoDto) {
        return memberService.modifyMemberInfo(modifyMemberInfoDto);
    }
    @ApiOperation(value = "更改密码", notes = "更改密码")
    @PostMapping(value = "/forgetPwd")
    @Limit(key = "forgetPwd", period = 5, count = 1, name = "注册", prefix = "limit",limitType = LimitType.IP)
    public FebsResponse forgetPwd(@RequestBody @Validated ForgetPwdDto forgetPwdDto) {
        return memberService.forgetPwd(forgetPwdDto);
    }
    @ApiOperation(value = "我的售后服务", notes = "我的售后服务")
    @ApiResponses({
            @ApiResponse(code = 200, message = "success", response = MallSalesServiceVo.class)
    })
    @GetMapping(value = "/salesService")
    public FebsResponse salesService() {
        return memberService.salesService();
    }
}
src/main/java/cc/mrbird/febs/mall/controller/dependentStation/ApiMallShoppingCartController.java
File was renamed from src/main/java/cc/mrbird/febs/mall/controller/ApiMallShoppingCartController.java
@@ -1,6 +1,8 @@
package cc.mrbird.febs.mall.controller;
package cc.mrbird.febs.mall.controller.dependentStation;
import cc.mrbird.febs.common.annotation.Limit;
import cc.mrbird.febs.common.entity.FebsResponse;
import cc.mrbird.febs.common.entity.LimitType;
import cc.mrbird.febs.mall.dto.AddCartDto;
import cc.mrbird.febs.mall.dto.DelCartGoodsDto;
import cc.mrbird.febs.mall.dto.GoodsCntDto;
@@ -28,7 +30,7 @@
@RestController
@RequiredArgsConstructor
@RequestMapping(value = "/api/cart")
@Api(value = "ApiMallShoppingCartController", tags = "商城购物车接口请求类")
@Api(value = "ApiMallShoppingCartController", tags = "DS-购物车")
public class ApiMallShoppingCartController {
    private final IApiMallShoppingCartService mallShoppingCartService;
@@ -44,14 +46,16 @@
    @ApiOperation(value = "添加商品到购物车", notes = "添加商品到购物车")
    @PostMapping(value = "/addGoodsToCart")
    public FebsResponse addGoodsToCart(@RequestBody List<AddCartDto> addCartDto) {
    @Limit(key = "addGoodsToCart", period = 1, count = 1, name = "注册", prefix = "limit",limitType = LimitType.IP)
    public FebsResponse addGoodsToCart(@RequestBody @Validated List<AddCartDto> addCartDto) {
        mallShoppingCartService.addGoodsToCart(addCartDto);
        return new FebsResponse().success().data("添加成功");
    }
    @ApiOperation(value = "从购物车中删除商品", notes = "从购物车中删除商品")
    @PostMapping(value = "/delGoods")
    public FebsResponse delGoods(@RequestBody DelCartGoodsDto delCartGoodsDto) {
    @Limit(key = "delGoods", period = 1, count = 1, name = "注册", prefix = "limit",limitType = LimitType.IP)
    public FebsResponse delGoods(@RequestBody @Validated DelCartGoodsDto delCartGoodsDto) {
        List<String> ids = StrUtil.split(delCartGoodsDto.getIds(), ',');
        mallShoppingCartService.removeByIds(ids);
        return new FebsResponse().success().data("删除成功");
@@ -59,7 +63,8 @@
    @ApiOperation(value = "修改购物车商品数量", notes = "修改购物车商品数量")
    @PostMapping(value = "/goodsCnt")
    public FebsResponse goodsCnt(@RequestBody GoodsCntDto goodsCntDto) {
    @Limit(key = "goodsCnt", period = 1, count = 1, name = "注册", prefix = "limit",limitType = LimitType.IP)
    public FebsResponse goodsCnt(@RequestBody @Validated GoodsCntDto goodsCntDto) {
        MallShoppingCart shoppingCart = new MallShoppingCart();
        shoppingCart.setId(goodsCntDto.getId());
        shoppingCart.setCnt(goodsCntDto.getCnt());
src/main/java/cc/mrbird/febs/mall/controller/dependentStation/ApiMemberCollectionController.java
File was renamed from src/main/java/cc/mrbird/febs/mall/controller/ApiMemberCollectionController.java
@@ -1,6 +1,8 @@
package cc.mrbird.febs.mall.controller;
package cc.mrbird.febs.mall.controller.dependentStation;
import cc.mrbird.febs.common.annotation.Limit;
import cc.mrbird.febs.common.entity.FebsResponse;
import cc.mrbird.febs.common.entity.LimitType;
import cc.mrbird.febs.mall.dto.AddCollectionDto;
import cc.mrbird.febs.mall.dto.MemberCollectionListDto;
import cc.mrbird.febs.mall.service.IMallMemberCollectionService;
@@ -18,17 +20,18 @@
@RestController
@RequiredArgsConstructor
@RequestMapping(value = "/api/collection")
@Api(value = "ApiMemberCollectionController", tags = "收藏接口类")
@Api(value = "ApiMemberCollectionController", tags = "DS-收藏")
public class ApiMemberCollectionController {
    @Autowired
    private IMallMemberCollectionService mallMemberCollectionService;
    @ApiOperation(value = "添加收藏")
    @PostMapping(value = "/add")
    public FebsResponse add(@RequestBody AddCollectionDto addCollectionDto) {
        mallMemberCollectionService.add(addCollectionDto);
        return new FebsResponse().success().message("收藏成功");
    @PostMapping(value = "/addCollection")
    @Limit(key = "addCollection", period = 1, count = 1, name = "注册", prefix = "limit",limitType = LimitType.IP)
    public FebsResponse add(@RequestBody @Validated AddCollectionDto addCollectionDto) {
        return mallMemberCollectionService.add(addCollectionDto);
    }
    @ApiOperation(value = "获取收藏列表")
@@ -38,9 +41,10 @@
    }
    @ApiOperation(value = "取消收藏")
    @PostMapping(value = "/del/{ids}")
    @PostMapping(value = "/delCollection/{ids}")
    @Limit(key = "delCollection", period = 1, count = 1, name = "注册", prefix = "limit",limitType = LimitType.IP)
    public FebsResponse del(@PathVariable("ids") String ids) {
        mallMemberCollectionService.del(ids);
        return new FebsResponse().success().message("取消成功");
        return new FebsResponse().success().message("Cancelled successfully");
    }
}
src/main/java/cc/mrbird/febs/mall/controller/dependentStation/enums/SalesServiceEnums.java
New file
@@ -0,0 +1,21 @@
package cc.mrbird.febs.mall.controller.dependentStation.enums;
import lombok.Getter;
@Getter
public enum SalesServiceEnums {
    // 发货人
    WHATSAPP("SALES_SERVICE", "WHATSAPP"),
    PHONE("SALES_SERVICE", "PHONE"),
    EMAIL("SALES_SERVICE", "EMAIL");
    private String type;
    private String code;
    SalesServiceEnums(String type, String code) {
        this.type = type;
        this.code = code;
    }
}
src/main/java/cc/mrbird/febs/mall/dto/AddCollectionDto.java
@@ -5,10 +5,13 @@
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotBlank;
@Data
@ApiModel(value = "AddCollectionDto", description = "添加收藏接受参数类")
public class AddCollectionDto {
    @NotBlank(message = "The product cannot be empty")
    @ApiModelProperty(value = "商品ID")
    private Long goodsId;
}
src/main/java/cc/mrbird/febs/mall/dto/AddOrderDto.java
@@ -20,17 +20,8 @@
    @ApiModelProperty(value = "地址ID", example = "1")
    private Long addressId;
    @ApiModelProperty(value = "提货团长特征码", example = "1")
    private String takeUniqueCode;
//    @ApiModelProperty(value = "配送方式 1:自提 2:快递(默认自提)", example = "1")
//    private Integer deliveryType;
    @ApiModelProperty(value = "订单提交类型", example = "1从购物车提交, 2从商品直接提交")
    private Integer type;
    @ApiModelProperty(value = "是否送货上门  1:是 2:否", example = "1")
    private Integer isHome;
    @ApiModelProperty(value = "备注")
    private String remark;
@@ -40,12 +31,6 @@
    @ApiModelProperty(value = "1-普通订单/2-积分订单")
    private Integer orderType;
    @ApiModelProperty(value = "会员优惠卷ID")
    private Long memberCouponId;
    @ApiModelProperty(value = "业绩所属邀请码")
    private String memberInviteId;
    @ApiModelProperty(value = "商品明细")
    private List<AddOrderItemDto> items;
src/main/java/cc/mrbird/febs/mall/dto/AddressInfoDto.java
@@ -14,39 +14,49 @@
@ApiModel(value = "AddressInfoDto", description = "地址接收参数类")
public class AddressInfoDto {
    @ApiModelProperty(value = "id", example = "编辑的时候传")
    @NotBlank(message = "{required}")
    @ApiModelProperty(value = "id")
    private Long id;
    @NotBlank(message = "参数不能为空")
    @ApiModelProperty(value = "姓名", example = "王")
    @NotBlank(message = "Last name required")
    @ApiModelProperty(value = "Last name")
    private String name;
    @NotBlank(message = "参数不能为空")
    @ApiModelProperty(value = "手机号", example = "15773001234")
    private String phone;
    //省
    @NotBlank(message = "参数不能为空")
    @ApiModelProperty(value = "省", example = "北京市朝阳区")
    private String province;
    //市
    @NotBlank(message = "参数不能为空")
    @ApiModelProperty(value = "市", example = "北京市朝阳区")
    private String city;
    @NotBlank(message = "First name required")
    @ApiModelProperty(value = "First name")
    private String firstName;
    @NotBlank(message = "参数不能为空")
    @ApiModelProperty(value = "地区", example = "北京市朝阳区")
    private String area;
    @NotBlank(message = "参数不能为空")
    @ApiModelProperty(value = "地址", example = "朝阳街道110栋119号")
    @NotBlank(message = "Address1 required")
    @ApiModelProperty(value = "Address1")
    private String address;
    @ApiModelProperty(value = "经度", example = "112.12345678")
    @ApiModelProperty(value = "Address2")
    private String area;
    @ApiModelProperty(value = "Postcode")
    private String postcode;
    @ApiModelProperty(value = "Phone Number")
    private String phone;
    @ApiModelProperty(value = "City")
    private String city;
    @NotBlank(message = "State / Province required")
    @ApiModelProperty(value = "State / Province")
    private String province;
    @NotBlank(message = "Country/Region required")
    @ApiModelProperty(value = "Country/Region")
    private String country;
    /**
     * 经度
     */
    @ApiModelProperty(value = "经度")
    private String longitude;
    @ApiModelProperty(value = "纬度", example = "87.12345678")
    /**
     * 纬度
     */
    @ApiModelProperty(value = "纬度")
    private String latitude;
    @ApiModelProperty(value = "是否默认", example = "1是2否")
    private Integer isDefault;
}
src/main/java/cc/mrbird/febs/mall/dto/ForgetPwdDto.java
@@ -15,15 +15,16 @@
@ApiModel(value = "ForgetPwdDto", description = "忘记/修改密码参数接收类")
public class ForgetPwdDto {
    @NotBlank(message = "账号不能为空")
    @ApiModelProperty(value = "账号", example = "15773001234")
    private String account;
    @NotBlank(message = "密码不能为空")
    @NotBlank(message = "The password cannot be empty")
    @ApiModelProperty(value = "新密码", example = "123456")
    private String password;
    private String Password;
    @NotBlank(message = "验证码不能为空")
    @ApiModelProperty(value = "验证码", example = "123456")
    private String code;
    @NotBlank(message = "The new password cannot be empty")
    @ApiModelProperty(value = "新密码", example = "123456")
    private String newPassword;
    @NotBlank(message = "Confirm that the new password cannot be empty")
    @ApiModelProperty(value = "新密码", example = "123456")
    private String newPasswordAgain;
}
src/main/java/cc/mrbird/febs/mall/dto/LoginDto.java
@@ -14,11 +14,11 @@
@ApiModel(value = "LoginDto", description = "登录接口参数接收类")
public class LoginDto {
    @NotBlank(message = "账号不能为空")
    @ApiModelProperty(value = "账号", example = "15773001234")
    @NotBlank(message = "The account cannot be empty")
    @ApiModelProperty(value = "手机号", example = "15773001234")
    private String account;
    @NotBlank(message = "密码不能为空")
    @NotBlank(message = "The password cannot be empty")
    @ApiModelProperty(value = "密码", example = "123456")
    private String password;
}
src/main/java/cc/mrbird/febs/mall/dto/ModifyMemberInfoDto.java
@@ -18,15 +18,4 @@
    @ApiModelProperty(value = "头像", example = "123")
    private String photo;
    @ApiModelProperty(value = "性别 男 女", example = "123")
    private String sex;
    @ApiModelProperty(value = "生日", example = "123")
    private String birthday;
    @ApiModelProperty(value = "真实姓名")
    private String realName;
    @ApiModelProperty(value = "邮箱")
    private String mailAddress;
}
src/main/java/cc/mrbird/febs/mall/dto/RegisterDto.java
@@ -14,30 +14,12 @@
@ApiModel(value = "RegisterDto", description = "用户注册参数接收类")
public class RegisterDto {
    @NotBlank(message = "账号不能为空")
    @NotBlank(message = "The account cannot be empty")
    @ApiModelProperty(value = "手机号", example = "15773001234")
    private String account;
    @ApiModelProperty(value = "类型 1-手机号 2-邮箱", example = "1")
    private String type = "1";
    @NotBlank(message = "验证码不能为空")
    @ApiModelProperty(value = "验证码", example = "123456")
    private String code;
    @NotBlank(message = "密码不能为空")
    @NotBlank(message = "The password cannot be empty")
    @ApiModelProperty(value = "密码", example = "123456")
    private String password;
    @NotBlank(message = "密码不能为空")
    @ApiModelProperty(value = "重复密码", example = "123456")
    private String passwordAgain;
    //    @NotBlank(message = "邀请码不能为空")
    @ApiModelProperty(value = "邀请码")
    private String inviteId;
    @ApiModelProperty(hidden = true)
    private String registType;
}
src/main/java/cc/mrbird/febs/mall/entity/MallAddressInfo.java
@@ -14,7 +14,10 @@
    private String name;
    private String fristName;
    private String phone;
    private String postcode;
    private Long memberId;
@@ -48,5 +51,6 @@
    private String province;
    //市
    private String city;
    private String country;
}
src/main/java/cc/mrbird/febs/mall/service/IApiMallActService.java
File was deleted
src/main/java/cc/mrbird/febs/mall/service/IApiMallAddressInfoService.java
@@ -11,15 +11,8 @@
public interface IApiMallAddressInfoService extends IService<MallAddressInfo> {
    List<AddressInfoVo> findAddressInfoList();
    FebsResponse findAddressInfo();
    FebsResponse addAddress(AddressInfoDto addressInfoDto);
    FebsResponse modifyAddress(AddressInfoDto addressInfoDto);
    void modifyAddress(AddressInfoDto addressInfoDto);
    void setDefaultAddress(Long id);
    FebsResponse identifyAddress(ApiIdentifyAddressDto identifyAddressDto);
    FebsResponse getProvince(Long id);
}
src/main/java/cc/mrbird/febs/mall/service/IApiMallMemberService.java
@@ -27,84 +27,26 @@
    FebsResponse findMemberInfo();
    FebsResponse findMemberMarkCnt();
    FebsResponse setTradePwd(ForgetPwdDto forgetPwdDto);
    FebsResponse modifyMemberInfo(ModifyMemberInfoDto modifyMemberInfoDto);
    FebsResponse teamList(TeamListDto teamListDto);
    MyTeamVo teamListForMine(TeamListDto teamListDto);
    FebsResponse moneyFlows(MoneyFlowDto moneyFlowDto);
    void addMoneyFlow(Long memberId, BigDecimal amount, Integer type, String orderNo, String description, String remark, Long rtMemberId, Integer status, Integer flowType);
    void transfer(TransferDto transferDto);
    void setPayment(MallMemberPayment mallMemberPayment);
    MallMemberPayment findMemberPayment();
    void bindPhone(AccountAndCodeDto accountAndCodeDto);
    BigDecimal canMoney();
    List<MallMember> findRankList(RankListDto rankListDto);
    MallMember findMemberInfoByAccount(String phone);
    MyCommissionVo myCommission();
    void shopApply(ShopApplyDto shopApplyDto);
    MallShopApply findNewestApply();
    void addRegisterAppeal(RegisterAppealDto registerAppeal);
    CashOutSettingVo cashOutSetting();
    List<ShopListVo> findShopListVo(ShopListDto shopListDto);
    FebsResponse xcxLogin(ApiXcxLoginDto apiXcxLoginDto) throws IOException;
    FebsResponse xcxSaveInfo(ApiXcxSaveInfoDto apiXcxSaveInfoDto);
    FebsResponse xcxPhoneLogin(ApiXcxPhoneLoginDto apiXcxPhoneLoginDto);
    FebsResponse xcxOpen(ApiXcxOpenDto apiXcxOpenDto);
    FebsResponse rechargeWallet(ApiRechargeWalletDto apiRechargeWalletDto);
    void updateMemberAgent(Long memberId,String levelCode);
    FebsResponse agentDetail();
    FebsResponse activityInfo();
    FebsResponse agentApplyInfo();
    FebsResponse getCoupon(GetCouponDto getCouponDto);
    FebsResponse scanCoupon(GetCouponDto getCouponDto);
    FebsResponse memberCoupon(MallMemberCouponDto mallMemberCouponDto);
    FebsResponse memberPayCoupon(MallMemberCouponDto mallMemberCouponDto);
    FebsResponse couponDetails(Long id);
    FebsResponse setInvite(ApiSetInviteDto apiSetInviteDto);
    Map<String, Object> loginEvent();
    FebsResponse storeList(MallStoreDto mallStoreDto);
    FebsResponse storeItemList(MallStoreItemDto mallStoreItemDto);
    FebsResponse bindStoreMember(BindStoreMemberDto bindStoreMemberDto);
    FebsResponse bindList();
    FebsResponse bindResult(BindResultDto bindResultDto);
    FebsResponse salesService();
}
src/main/java/cc/mrbird/febs/mall/service/IMallMemberCollectionService.java
@@ -1,5 +1,6 @@
package cc.mrbird.febs.mall.service;
import cc.mrbird.febs.common.entity.FebsResponse;
import cc.mrbird.febs.mall.dto.AddCollectionDto;
import cc.mrbird.febs.mall.dto.MemberCollectionListDto;
import cc.mrbird.febs.mall.entity.MallMemberCollection;
@@ -11,7 +12,7 @@
public interface IMallMemberCollectionService extends IService<MallMemberCollection> {
    void add(AddCollectionDto addCollectionDto);
    FebsResponse add(AddCollectionDto addCollectionDto);
    List<CollectionListVo> findMemberCollectionList(MemberCollectionListDto memberCollectionListDto);
src/main/java/cc/mrbird/febs/mall/service/impl/ApiMallActServiceImpl.java
File was deleted
src/main/java/cc/mrbird/febs/mall/service/impl/ApiMallAddressInfoServiceImpl.java
@@ -19,6 +19,7 @@
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
@@ -45,98 +46,57 @@
    private MallAddressWorldMapper mallAddressWorldMapper;
    @Override
    public List<AddressInfoVo> findAddressInfoList() {
        Long memberId = LoginUserUtil.getLoginUser().getId();
        List<MallAddressInfo> addressInfos = this.baseMapper.selectAddressInfoListByMemberId(memberId);
    public FebsResponse findAddressInfo() {
        return MallAddressInfoConversion.INSTANCE.entityListToVos(addressInfos);
        Long id = LoginUserUtil.getLoginUser().getId();
        AddressInfoVo addressInfoVo = new AddressInfoVo();
        List<MallAddressInfo> mallAddressInfos = this.baseMapper.selectList(
                Wrappers.lambdaQuery(MallAddressInfo.class)
                        .eq(MallAddressInfo::getMemberId, id)
        );
        if (CollUtil.isNotEmpty(mallAddressInfos)){
            MallAddressInfo mallAddressInfo = mallAddressInfos.get(0);
            addressInfoVo.setId(mallAddressInfo.getId());
            addressInfoVo.setName(mallAddressInfo.getName());
            addressInfoVo.setFirstName(mallAddressInfo.getFristName());
            addressInfoVo.setAddress(mallAddressInfo.getAddress());
            addressInfoVo.setArea(mallAddressInfo.getArea());
            addressInfoVo.setPostcode(mallAddressInfo.getPostcode());
            addressInfoVo.setPhone(mallAddressInfo.getPhone());
            addressInfoVo.setCity(mallAddressInfo.getCity());
            addressInfoVo.setProvince(mallAddressInfo.getProvince());
            addressInfoVo.setCountry(mallAddressInfo.getCountry());
    }
        return new FebsResponse().success().data(addressInfoVo);
    }
    @Override
    public FebsResponse addAddress(AddressInfoDto addressInfoDto) {
        MallAddressInfo addressInfo = MallAddressInfoConversion.INSTANCE.dtoToEntity(addressInfoDto);
        MallMember member = LoginUserUtil.getLoginUser();
        Long memberId = member.getId();
        List<MallAddressInfo> existAddress = this.baseMapper.selectAddressInfoListByMemberId(memberId);
        if (CollUtil.isEmpty(existAddress)) {
            addressInfo.setIsDefault(MallAddressInfo.IS_DEFAULT_Y);
        } else {
            if (MallAddressInfo.IS_DEFAULT_Y.equals(addressInfoDto.getIsDefault())) {
                this.baseMapper.updateIsDefault(MallAddressInfo.IS_DEFAULT_N, memberId, null);
            }
        }
        addressInfo.setMemberId(memberId);
        addressInfo.setCreatedBy(member.getPhone());
        addressInfo.setUpdatedBy(member.getPhone());
        this.baseMapper.insert(addressInfo);
        return new FebsResponse().success().data(addressInfo.getId());
    }
    @Override
    public void modifyAddress(AddressInfoDto addressInfoDto) {
        MallAddressInfo existAddress = this.baseMapper.selectById(addressInfoDto.getId());
        if (existAddress == null) {
            throw new FebsException("地址不存在");
        }
    public FebsResponse modifyAddress(AddressInfoDto addressInfoDto) {
        Long memberId = LoginUserUtil.getLoginUser().getId();
        MallAddressInfo addressInfo = MallAddressInfoConversion.INSTANCE.dtoToEntity(addressInfoDto);
        if (MallAddressInfo.IS_DEFAULT_Y.equals(addressInfoDto.getIsDefault())) {
            this.baseMapper.updateIsDefault(MallAddressInfo.IS_DEFAULT_N, memberId, null);
        this.baseMapper.update(
                null,
                Wrappers.lambdaUpdate(MallAddressInfo.class)
                        .set(MallAddressInfo::getName, addressInfoDto.getName())
                        .set(MallAddressInfo::getFristName, addressInfoDto.getFirstName())
                        .set(MallAddressInfo::getAddress, addressInfoDto.getAddress())
                        .set(MallAddressInfo::getArea, addressInfoDto.getArea())
                        .set(MallAddressInfo::getPostcode, addressInfoDto.getPostcode())
                        .set(MallAddressInfo::getPhone, addressInfoDto.getPhone())
                        .set(MallAddressInfo::getCity, addressInfoDto.getCity())
                        .set(MallAddressInfo::getProvince, addressInfoDto.getProvince())
                        .set(MallAddressInfo::getCountry, addressInfoDto.getCountry())
                        .eq(MallAddressInfo::getMemberId, memberId)
        );
        return new FebsResponse().success();
        }
        addressInfo.setUpdatedTime(new Date());
        this.baseMapper.updateById(addressInfo);
    }
    @Override
    public void setDefaultAddress(Long id) {
        MallAddressInfo addressInfo = this.baseMapper.selectById(id);
        if (addressInfo == null) {
            throw new FebsException("地址不存在");
        }
        MallMember member = LoginUserUtil.getLoginUser();
        this.baseMapper.updateIsDefault(MallAddressInfo.IS_DEFAULT_N, member.getId(), null);
        this.baseMapper.updateIsDefault(MallAddressInfo.IS_DEFAULT_Y, member.getId(), id);
    }
    static final OkHttpClient HTTP_CLIENT = new OkHttpClient().newBuilder().build();
    @Override
    public FebsResponse identifyAddress(ApiIdentifyAddressDto identifyAddressDto) {
        MediaType mediaType = MediaType.parse("application/json");
        RequestBody body = RequestBody.create(mediaType, JSONUtil.toJsonStr(identifyAddressDto));
        Request request = new Request.Builder()
                .url("https://aip.baidubce.com/rpc/2.0/nlp/v1/address?access_token=" + redisUtils.get(WechatConfigure.BAIDU_ACCESS_TOKEN_REDIS_KEY).toString())
                .method("POST", body)
                .addHeader("Content-Type", "application/json")
                .addHeader("Accept", "application/json")
                .build();
        String data = "";
        try {
            Response response = HTTP_CLIENT.newCall(request).execute();
            data = response.body().string();
            if (data.contains("error_code")) {
                JSONObject jsonObject = JSONUtil.parseObj(data);
                return new FebsResponse().fail().message("地址识别错误编码:"+jsonObject.get("error_code").toString());
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        return new FebsResponse().success().data(data);
    }
    @Override
    public FebsResponse getProvince(Long id) {
        LambdaQueryWrapper<MallAddressWorld> addressWorldLambdaQueryWrapper = new LambdaQueryWrapper<>();
        addressWorldLambdaQueryWrapper.eq(MallAddressWorld::getPid, id)
                .orderByDesc(MallAddressWorld::getId);
        List<MallAddressWorld> mallAddressWorlds = mallAddressWorldMapper.selectList(addressWorldLambdaQueryWrapper);
        return new FebsResponse().success().data(mallAddressWorlds);
    }
}
src/main/java/cc/mrbird/febs/mall/service/impl/ApiMallGoodsServiceImpl.java
@@ -55,12 +55,6 @@
     */
    @Override
    public IPage<MallGoodsListVo> findMallGoodsListInPage(MallGoodsQueryDto queryDto) {
        // 获取当前登录的用户信息
        MallMember loginUser = LoginUserUtil.getLoginUser();
        // 如果用户已登录,设置查询条件中的会员ID
        if (loginUser != null) {
            queryDto.setMemberId(loginUser.getId());
        }
        // 初始化分页对象
        Page<MallGoodsListVo> page = new Page<>(queryDto.getPageNow(), queryDto.getPageSize());
        // 调用Mapper方法,根据查询条件分页获取商品列表
src/main/java/cc/mrbird/febs/mall/service/impl/ApiMallMemberServiceImpl.java
@@ -8,6 +8,7 @@
import cc.mrbird.febs.common.exception.FebsException;
import cc.mrbird.febs.common.properties.XcxProperties;
import cc.mrbird.febs.common.utils.*;
import cc.mrbird.febs.mall.controller.dependentStation.enums.SalesServiceEnums;
import cc.mrbird.febs.mall.conversion.MallMemberConversion;
import cc.mrbird.febs.mall.conversion.MallShopApplyConversion;
import cc.mrbird.febs.mall.conversion.MallStoreConversion;
@@ -38,6 +39,7 @@
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import lombok.RequiredArgsConstructor;
@@ -98,97 +100,25 @@
        String account = registerDto.getAccount();
        MallMember mallMember = this.baseMapper.selectInfoByAccount(account);
        if (mallMember != null) {
            throw new FebsException("手机号已注册");
            throw new FebsException("Registered");
        }
        /**
         * 验证两次密码是否一致
         */
        String password = registerDto.getPassword();
        String passwordAgain = registerDto.getPasswordAgain();
        if(!password.equals(passwordAgain)){
            throw new FebsException("密码不一致");
        }
        //邀请码为admin的时候(后台添加用户),不需要验证验证码
        if (!"admin".equals(registerDto.getRegistType())) {
            String code = registerDto.getCode();
            boolean flags = commonService.verifyCode(account, code);
            if (!flags) {
                throw new FebsException("验证码错误");
            }
        }
        mallMember = new MallMember();
        mallMember.setPassword(SecureUtil.md5(registerDto.getPassword()));
        // 判断账号类型
        if (AppContants.ACCOUNT_TYPE_MOBILE.equals(registerDto.getType())) {
            mallMember.setPhone(registerDto.getAccount());
        } else {
            mallMember.setEmail(registerDto.getAccount());
        }
        //对于邀请码的验证和上级联系人的验证
        Integer count = this.baseMapper.selectCount(null);
        if (count != null && count != 0) {
            if(!StrUtil.isEmpty(registerDto.getInviteId())){
                String inviteId = registerDto.getInviteId();
                MallMember inviteMember = this.baseMapper.selectInfoByInviteId(inviteId);
                if (inviteMember == null) {
                    throw new FebsException("邀请码不存在");
                }
                mallMember.setReferrerId(registerDto.getInviteId());
            }
        }
        mallMember.setName(account);
        mallMember.setEmail(registerDto.getAccount());
        mallMember.setPassword(SecureUtil.md5(password));
        mallMember.setAccountStatus(MallMember.ACCOUNT_STATUS_ENABLE);
        mallMember.setAccountType(MallMember.ACCOUNT_TYPE_NORMAL);
        mallMember.setSex("男");
        mallMember.setBindPhone(account);
        this.baseMapper.insert(mallMember);
        String inviteId = ShareCodeUtil.toSerialCode(mallMember.getId());
        mallMember.setInviteId(inviteId);
        //推荐人和推荐人链
        boolean flag = false;
        String parentId = mallMember.getReferrerId();
        if (StrUtil.isBlank(parentId)) {
            flag = true;
        }
        String ids = "";
        while (!flag) {
            if (StrUtil.isBlank(ids)) {
                ids += parentId;
            } else {
                ids += ("," + parentId);
            }
            MallMember parentMember = this.baseMapper.selectInfoByInviteId(parentId);
            if (parentMember == null) {
                break;
            }
            parentId = parentMember.getReferrerId();
            if (StrUtil.isBlank(parentMember.getReferrerId())) {
                flag = true;
            }
        }
        if (StrUtil.isNotBlank(ids)) {
            mallMember.setReferrerIds(ids);
        }
        //会员VIP等级
        List<MallVipConfig> configs = mallVipConfigMapper.selectVipConfigList();
        if (StrUtil.isBlank(mallMember.getLevel()) && CollUtil.isNotEmpty(configs)) {
            MallVipConfig mallVipConfig = configs.get(0);
            mallMember.setLevel(mallVipConfig.getCode());
        }
        this.baseMapper.updateById(mallMember);
        MallMemberWallet wallet = new MallMemberWallet();
        wallet.setBalance(BigDecimal.ZERO);
        wallet.setMemberId(mallMember.getId());
        mallMemberWalletMapper.insert(wallet);
        return new FebsResponse().success().message("注册成功");
        return new FebsResponse().success().message("registered successfully");
    }
    @Override
@@ -197,11 +127,11 @@
        MallMember mallMember = this.baseMapper.selectInfoByAccountAndPwd(loginDto.getAccount(), md5Pwd);
        if (mallMember == null) {
            throw new FebsException("用户不存在或账号密码错误");
            throw new FebsException("The user does not exist or the account password is incorrect");
        }
        if (MallMember.ACCOUNT_STATUS_DISABLED.equals(mallMember.getAccountStatus())) {
            throw new FebsException("该账号存在异常, 暂限制登录");
            throw new FebsException("The account is abnormal and is temporarily restricted from logging in");
        }
        String redisKey = AppContants.APP_LOGIN_PREFIX + mallMember.getId();
@@ -231,21 +161,27 @@
    @Override
    public FebsResponse forgetPwd(ForgetPwdDto forgetPwdDto) {
        MallMember mallMember = this.baseMapper.selectInfoByAccount(forgetPwdDto.getAccount());
        Long id = LoginUserUtil.getLoginUser().getId();
        MallMember mallMember = this.baseMapper.selectById(id);
        if (mallMember == null) {
            throw new FebsException("账号不存在");
            throw new FebsException("Setup failed");
        }
        boolean b = commonService.verifyCode(forgetPwdDto.getAccount(), forgetPwdDto.getCode());
        if (!b) {
            throw new FebsException("验证码错误");
        if (!forgetPwdDto.getNewPassword().equals(forgetPwdDto.getNewPasswordAgain())){
            throw new FebsException("Setup failed");
        }
        String pwd = SecureUtil.md5(forgetPwdDto.getPassword());
        String pwd = SecureUtil.md5(forgetPwdDto.getNewPassword());
        mallMember.setPassword(pwd);
        this.baseMapper.updateById(mallMember);
        return new FebsResponse().success().message("重置成功");
        this.baseMapper.update(
                null,
                Wrappers.lambdaUpdate(MallMember.class)
                .set(MallMember::getPassword, pwd)
                .eq(MallMember::getId, id)
        );
        return new FebsResponse().success().message("Setup successful");
    }
    @Override
@@ -262,94 +198,21 @@
        }
        redisUtils.del(AppContants.APP_LOGIN_PREFIX + id);
        redisUtils.del(AppContants.XCX_LOGIN_PHONE_PREFIX + id);
        return new FebsResponse().success().message("退出登录");
        return new FebsResponse().success().message("Log out");
    }
    @Override
    public FebsResponse findMemberInfo() {
        Long id = LoginUserUtil.getLoginUser().getId();
        MallMember mallMember = this.baseMapper.selectById(id);
        MallMemberVo mallMemberVo = MallMemberConversion.INSTANCE.entityToVo(mallMember);
        if(StrUtil.isNotEmpty(mallMember.getReferrerId())){
            MallMember referMember = this.baseMapper.selectInfoByInviteId(mallMember.getReferrerId());
            if (referMember != null) {
                mallMemberVo.setReferrerName(referMember.getName());
            }
        }
        if (StrUtil.isNotBlank(mallMember.getTradePassword())) {
            mallMemberVo.setHasTradePwd(1);
        }
        MallMemberPayment payment = mallMemberPaymentMapper.selectByMemberId(id);
        if (payment != null) {
            mallMemberVo.setHasPayment(1);
        }
        MemberCollectionListDto memberCollectionListDto = new MemberCollectionListDto();
        memberCollectionListDto.setPageNow(1);
        memberCollectionListDto.setPageSize(10);
        List<CollectionListVo> collectionList = mallMemberCollectionService.findMemberCollectionList(memberCollectionListDto);
        mallMemberVo.setCollectionCnt(CollUtil.isNotEmpty(collectionList) ? collectionList.size() : 0);
        MemberFootprintListDto memberFootprintListDto = new MemberFootprintListDto();
        memberFootprintListDto.setPageNow(1);
        memberFootprintListDto.setPageSize(10);
        List<FootprintListVo> footprintList = mallMemberFootprintService.findMemberFootprintList(memberFootprintListDto);
        mallMemberVo.setFootprintCnt(CollUtil.isNotEmpty(footprintList) ? footprintList.size() : 0);
        List<MallMember> mallMembers = this.baseMapper.selectByRefererId(mallMember.getInviteId());
        mallMemberVo.setChildCnt(CollUtil.isNotEmpty(mallMembers) ? mallMembers.size() : 0);
        MallMemberWallet wallet = mallMemberWalletMapper.selectWalletByMemberId(mallMemberVo.getId());
        MallVipConfig mallVipConfig = mallVipConfigMapper.selectVipConfigByCode(mallMember.getLevel());
        mallMemberVo.setVipInfo(mallVipConfig);
        mallMemberVo.setBalance(wallet.getBalance());
//        mallMemberVo.setScore(wallet.getScore());
        mallMemberVo.setPrizeScore(wallet.getPrizeScore());
//        mallMemberVo.setTotalCost(mallOrderInfoMapper.selectTotalAmount(id));
        MallMemberVo mallMemberVo = new MallMemberVo();
        mallMemberVo.setName(mallMember.getName());
        mallMemberVo.setEmail(mallMember.getEmail());
        mallMemberVo.setAvatar(mallMember.getAvatar());
        return new FebsResponse().success().data(mallMemberVo);
    }
    @Override
    public FebsResponse findMemberMarkCnt() {
        Long id = LoginUserUtil.getLoginUser().getId();
        List<Map<String, Integer>> maps = mallOrderInfoMapper.selectMemberOrderStatusCnt(id);
        Map<Integer, Integer> orderCnt = new HashMap<>();
        if (CollUtil.isNotEmpty(maps)) {
            for (Map<String, Integer> map : maps) {
                orderCnt.put(map.get("status"), map.get("cnt"));
            }
        }
        List<MallShoppingCart> carts = mallShoppingCartMapper.selectCartGoodsList(id, 1);
        Map<String, Object> result = new HashMap<>();
        result.put("order", orderCnt);
        result.put("carts", carts.size());
        return new FebsResponse().success().data(result);
    }
    @Override
    public FebsResponse setTradePwd(ForgetPwdDto forgetPwdDto) {
        MallMember memberId = LoginUserUtil.getLoginUser();
        MallMember mallMember = this.baseMapper.selectById(memberId);
        if (mallMember == null) {
            throw new FebsException("账号不存在");
        }
        boolean b = commonService.verifyCode(forgetPwdDto.getAccount(), forgetPwdDto.getCode());
        if (!b) {
            throw new FebsException("验证码错误");
        }
        mallMember.setTradePassword(SecureUtil.md5(forgetPwdDto.getPassword()));
        this.baseMapper.updateById(mallMember);
        return new FebsResponse().success().message("设置成功");
    }
    @Override
    public FebsResponse modifyMemberInfo(ModifyMemberInfoDto modifyMemberInfoDto) {
@@ -363,55 +226,11 @@
            mallMember.setAvatar(modifyMemberInfoDto.getPhoto());
        }
        mallMember.setSex(modifyMemberInfoDto.getSex());
        mallMember.setBirthday(DateUtil.parseDate(modifyMemberInfoDto.getBirthday()));
        mallMember.setRealName(modifyMemberInfoDto.getRealName());
        mallMember.setEmail(modifyMemberInfoDto.getMailAddress());
        this.baseMapper.updateById(mallMember);
        return new FebsResponse().success().message("修改成功");
        return new FebsResponse().success().message("success");
    }
    @Override
    public FebsResponse teamList(TeamListDto teamListDto) {
        Long memberId = null;
        if (teamListDto.getId() == null) {
            memberId = LoginUserUtil.getLoginUser().getId();
        } else {
            memberId = teamListDto.getId();
        }
        MallMember mallMember = this.baseMapper.selectById(memberId);
        List<TeamListVo> list = this.baseMapper.selectTeamListByInviteId(mallMember.getInviteId());
        MyTeamVo myTeamVo = new MyTeamVo();
        myTeamVo.setTeam(list);
        myTeamVo.setMyAchieve(this.mallOrderInfoMapper.selectAmountOrTeamAmount(mallMember.getInviteId(), 1));
        myTeamVo.setMyTeamAchieve(this.mallOrderInfoMapper.selectAmountOrTeamAmount(mallMember.getInviteId(), 2));
        myTeamVo.setMyTeamCnt(this.baseMapper.selectAllChildAgentListByInviteId(mallMember.getInviteId()).size());
        return new FebsResponse().success().data(myTeamVo);
    }
    @Override
    public MyTeamVo teamListForMine(TeamListDto teamListDto) {
        return null;
    }
    @Override
    public FebsResponse moneyFlows(MoneyFlowDto moneyFlowDto) {
        IPage<MoneyFlowVo> page = new Page<>(moneyFlowDto.getPageNum(), moneyFlowDto.getPageSize());
        Long id = LoginUserUtil.getLoginUser().getId();
        moneyFlowDto.setMemberId(id);
        IPage<MoneyFlowVo> pages = mallMoneyFlowMapper.selectApiMoneyFlowInPage(page, moneyFlowDto);
        if (moneyFlowDto.getFlowType() == 3) {
            pages.getRecords().forEach(item -> {
                item.setDescription(ScoreFlowTypeEnum.getDescByValue(item.getType()));
            });
        }
        return new FebsResponse().success().data(pages);
    }
    @Override
    public void addMoneyFlow(Long memberId, BigDecimal amount, Integer type, String orderNo, String description, String remark, Long rtMemberId, Integer status, Integer flowType) {
@@ -428,56 +247,7 @@
        mallMoneyFlowMapper.insert(flow);
    }
    @Override
    @Transactional(rollbackFor = Exception.class)
    public void transfer(TransferDto transferDto) {
        MallMember mallMember = this.baseMapper.selectInfoByAccount(transferDto.getAccount());
        if (mallMember == null) {
            throw new FebsException("用户不存在");
        }
        Long memberId = LoginUserUtil.getLoginUser().getId();
        MallMember loginMember = this.baseMapper.selectById(memberId);
        if (loginMember.getPhone().equals(transferDto.getAccount()) || loginMember.getInviteId().equals(transferDto.getAccount())) {
            throw new FebsException("不能给自己转账");
        }
        if (StrUtil.isBlank(loginMember.getTradePassword())) {
            throw new FebsException("未设置支付密码");
        }
        if (!loginMember.getTradePassword().equals(SecureUtil.md5(transferDto.getTradePwd()))) {
            throw new FebsException("支付密码错误");
        }
        walletService.reduceBalance(transferDto.getAmount(), memberId);
        String orderNo = MallUtils.getOrderNum("T");
        this.addMoneyFlow(memberId, transferDto.getAmount().negate(), MoneyFlowTypeEnum.TRANSFER.getValue(), orderNo, null, null, mallMember.getId(), null, FlowTypeEnum.BALANCE.getValue());
        walletService.addBalance(transferDto.getAmount(), mallMember.getId());
        this.addMoneyFlow(mallMember.getId(), transferDto.getAmount(), MoneyFlowTypeEnum.TRANSFER.getValue(), orderNo, null, null, memberId, null, FlowTypeEnum.BALANCE.getValue());
    }
    @Override
    public void setPayment(MallMemberPayment mallMemberPayment) {
        MallMember member = LoginUserUtil.getLoginUser();
        MallMemberPayment exist = mallMemberPaymentMapper.selectByMemberId(member.getId());
        if (exist == null) {
            mallMemberPayment.setMemberId(member.getId());
            mallMemberPaymentMapper.insert(mallMemberPayment);
        } else {
            mallMemberPayment.setId(exist.getId());
            mallMemberPaymentMapper.updateById(mallMemberPayment);
        }
    }
    @Override
    public MallMemberPayment findMemberPayment() {
        MallMember member = LoginUserUtil.getLoginUser();
        return mallMemberPaymentMapper.selectByMemberId(member.getId());
    }
    @Override
    public void bindPhone(AccountAndCodeDto accountAndCodeDto) {
@@ -493,56 +263,7 @@
        this.baseMapper.updateById(member);
    }
    @Override
    public BigDecimal canMoney() {
        Long memberId = LoginUserUtil.getLoginUser().getId();
        MallMemberWallet wallet = mallMemberWalletMapper.selectWalletByMemberId(memberId);
        return wallet.getBalance().setScale(2,BigDecimal.ROUND_DOWN);
    }
    @Override
    public List<MallMember> findRankList(RankListDto rankListDto) {
        IPage<MallMember> page = new Page<>(rankListDto.getPageNum(), rankListDto.getPageSize());
        MallMember member = new MallMember();
        member.setQuery("2");
        member.setCreatedTime(new Date());
        IPage<MallMember> list = this.baseMapper.selectRankListInPage(page, member);
        return list.getRecords();
    }
    @Override
    public MallMember findMemberInfoByAccount(String phone) {
        return this.baseMapper.selectInfoByAccount(phone);
    }
    @Override
    public MyCommissionVo myCommission() {
        Long id = LoginUserUtil.getLoginUser().getId();
        MallMember mallMember = this.baseMapper.selectById(id);
        MyCommissionVo commissionVo = MallMemberConversion.INSTANCE.entityToCommissionVo(mallMember);
        MallMember referMember = this.baseMapper.selectInfoByInviteId(mallMember.getReferrerId());
        if (referMember != null) {
            commissionVo.setReferrerName(referMember.getName());
            commissionVo.setAvatar(referMember.getAvatar());
        }
        DataDictionaryCustom dic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(AppContants.AGENT_LEVEL, mallMember.getLevel());
        if (dic != null) {
            commissionVo.setLevelName(dic.getDescription());
        }
        MallMemberWallet wallet = mallMemberWalletMapper.selectWalletByMemberId(id);
        commissionVo.setCommission(wallet.getCommission());
        commissionVo.setToday(mallMoneyFlowMapper.selectCommissionIncome(1, new Date(), id));
        commissionVo.setMonth(mallMoneyFlowMapper.selectCommissionIncome(2, new Date(), id));
        commissionVo.setTotal(mallMoneyFlowMapper.selectCommissionIncome(null, null, id));
        commissionVo.setWaitCommission(BigDecimal.ZERO);
        return commissionVo;
    }
    @Override
    public void shopApply(ShopApplyDto shopApplyDto) {
@@ -570,30 +291,7 @@
        return mallShopApplyMapper.selectNewestApplyByMemberId(member.getId());
    }
    @Override
    public void addRegisterAppeal(RegisterAppealDto registerAppeal) {
        MallRegisterAppeal isExist = mallRegisterAppealMapper.selectByPhoneAndName(registerAppeal.getName(), registerAppeal.getPhone());
        if (isExist != null) {
            throw new FebsException("申诉已存在");
        }
        isExist = new MallRegisterAppeal();
        isExist.setName(registerAppeal.getName());
        isExist.setPhone(registerAppeal.getPhone());
        isExist.setStatus(2);
        mallRegisterAppealMapper.insert(isExist);
    }
    @Override
    public CashOutSettingVo cashOutSetting() {
        CashOutSettingVo cashOutSettingVo = new CashOutSettingVo();
        DataDictionaryCustom dic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(DataDictionaryEnum.CASHOUT_SETTING.getType(), DataDictionaryEnum.CASHOUT_SETTING.getCode());
        if (dic != null) {
            cashOutSettingVo = JSONObject.parseObject(dic.getValue(), CashOutSettingVo.class);
        }
        return cashOutSettingVo;
    }
    @Override
    public List<ShopListVo> findShopListVo(ShopListDto shopListDto) {
@@ -613,274 +311,7 @@
    private final XcxProperties xcxProperties = SpringContextHolder.getBean(XcxProperties.class);
    @Override
    public FebsResponse xcxLogin(ApiXcxLoginDto apiXcxLoginDto) throws IOException {
        log.info("登录请求参数:{}", JSONObject.toJSONString(apiXcxLoginDto));
        FebsResponse febsResponse = new FebsResponse();
        String code = apiXcxLoginDto.getCode();
        log.info("code:" + code);
        if (StrUtil.isNotBlank(code)) {
            String requrl = getXcxLoginUrl(code);
            String reslutData = HttpCurlUtil.sendGetHttp(requrl, null);
            net.sf.json.JSONObject json = net.sf.json.JSONObject.fromObject(reslutData);
            log.info("微信登录获取到登录信息={}", json);
            if (json.containsKey("errcode")) {
                log.info("微信登录获取到异常信息errcode");
                return febsResponse.fail().message("自动登录失败");
            }
            String openId = json.getString("openid");
            String sessionKey = json.getString("session_key");
            log.info("openId={},sessionKey={}", openId, sessionKey);
            // 查询用户是否存在
            MallMember mallMember = null;
            synchronized (this) {
                mallMember = this.baseMapper.selectMemberByOpenId(openId);
                if (ObjectUtil.isEmpty(mallMember)) {
                    // 新增用户
                    mallMember = new MallMember();
                    mallMember.setAccountStatus(MallMember.ACCOUNT_STATUS_ENABLE);
                    mallMember.setAccountType(MallMember.ACCOUNT_TYPE_NORMAL);
                    mallMember.setOpenId(openId);
                    mallMember.setSessionKey(sessionKey);
                    if (StrUtil.isNotBlank(apiXcxLoginDto.getInviteId())) {
                        MallMember member = this.baseMapper.selectInfoByInviteId(apiXcxLoginDto.getInviteId());
                        if (member != null) {
                            mallMember.setReferrerId(member.getInviteId());
                            //推荐人和推荐人链
                            boolean flag = false;
                            String parentId = mallMember.getReferrerId();
                            if (StrUtil.isBlank(parentId)) {
                                flag = true;
                            }
                            String ids = "";
                            while (!flag) {
                                if (StrUtil.isBlank(ids)) {
                                    ids += parentId;
                                } else {
                                    ids += ("," + parentId);
                                }
                                MallMember parentMember = this.baseMapper.selectInfoByInviteId(parentId);
                                if (parentMember == null) {
                                    break;
                                }
                                parentId = parentMember.getReferrerId();
                                if (StrUtil.isBlank(parentMember.getReferrerId())) {
                                    flag = true;
                                }
                            }
                            if (StrUtil.isNotBlank(ids)) {
                                mallMember.setReferrerIds(ids);
                            }
                        }
                    }
                    this.baseMapper.insert(mallMember);
                    mallMember = this.baseMapper.selectMemberByOpenId(openId);
                    String inviteId = ShareCodeUtil.toSerialCode(mallMember.getId());
                    mallMember.setInviteId(inviteId);
                    this.baseMapper.updateById(mallMember);
                    MallMemberWallet wallet = new MallMemberWallet();
                    wallet.setBalance(BigDecimal.ZERO);
                    wallet.setMemberId(mallMember.getId());
                    mallMemberWalletMapper.insert(wallet);
                } else {
                    mallMember.setSessionKey(sessionKey);
                    this.baseMapper.updateById(mallMember);
                }
            }
            // 存放redis
            String redisKey = AppContants.XCX_LOGIN_PREFIX + mallMember.getId();
            String existToken = redisUtils.getString(redisKey);
            if (StrUtil.isNotBlank(existToken)) {
                Object o = redisUtils.get(existToken);
                if (ObjectUtil.isNotEmpty(o)) {
                    redisUtils.del(existToken);
                }
            }
            String token = IdUtil.simpleUUID();
            redisUtils.set(token, JSONObject.toJSONString(mallMember), -1);
            redisUtils.set(redisKey, token, -1);
            Map<String, Object> authInfo = new HashMap<>();
            authInfo.put("token", token);
            authInfo.put("appid", xcxProperties.getXcxAppid());
            authInfo.put("member", mallMember);
            authInfo.put("rasToken", generateAsaToken(token));
            febsResponse.success().data(authInfo);
        } else {
            return febsResponse.fail().message("自动登录失败");
        }
        return febsResponse;
    }
    @Override
    public FebsResponse xcxSaveInfo(ApiXcxSaveInfoDto apiXcxSaveInfoDto) {
        log.info("name={},phone={},avatar={},sex={}",
                apiXcxSaveInfoDto.getNickName(),apiXcxSaveInfoDto.getPhone(),apiXcxSaveInfoDto.getAvatarUrl(),apiXcxSaveInfoDto.getGender());
        Long memberId = LoginUserUtil.getLoginUser().getId();
        MallMember mallMember = this.baseMapper.selectById(memberId);
        String nickName = apiXcxSaveInfoDto.getNickName();
        if(StrUtil.isNotEmpty(nickName)){
            mallMember.setName(nickName);
        }
        String phone = apiXcxSaveInfoDto.getPhone();
        if(StrUtil.isNotEmpty(phone)){
            mallMember.setPhone(phone);
        }
        String avatarUrl = apiXcxSaveInfoDto.getAvatarUrl();
        if(StrUtil.isNotEmpty(avatarUrl)){
            mallMember.setAvatar(avatarUrl);
        }
        if (StrUtil.isNotBlank(apiXcxSaveInfoDto.getRealName())) {
            mallMember.setRealName(apiXcxSaveInfoDto.getRealName());
        }
        if (apiXcxSaveInfoDto.getBirthday() != null) {
            mallMember.setBirthday(apiXcxSaveInfoDto.getBirthday());
        }
        List<MallVipConfig> configs = mallVipConfigMapper.selectVipConfigList();
        if (StrUtil.isBlank(mallMember.getLevel()) && CollUtil.isNotEmpty(configs)) {
            MallVipConfig mallVipConfig = configs.get(0);
            mallMember.setLevel(mallVipConfig.getCode());
        }
        mallMember.setSex(1 == apiXcxSaveInfoDto.getGender() ? "女" : "男");
        this.baseMapper.updateById(mallMember);
        return new FebsResponse().success();
    }
    @Override
    public FebsResponse xcxPhoneLogin(ApiXcxPhoneLoginDto apiXcxPhoneLoginDto) {
        String phone = apiXcxPhoneLoginDto.getPhone();
        boolean flag = commonService.verifyCode(phone, apiXcxPhoneLoginDto.getCode());
        if (flag) {
            // 查询用户是否存在
            MallMember mallMember = null;
            synchronized (this) {
                mallMember = this.baseMapper.selectInfoByAccount(apiXcxPhoneLoginDto.getPhone());
                if (ObjectUtil.isEmpty(mallMember)) {
                    // 新增用户
                    mallMember = new MallMember();
                    mallMember.setPhone(phone);
                    mallMember.setAccountStatus(MallMember.ACCOUNT_STATUS_ENABLE);
                    mallMember.setAccountType(MallMember.ACCOUNT_TYPE_NORMAL);
                    this.baseMapper.insert(mallMember);
                    String inviteId = ShareCodeUtil.toSerialCode(mallMember.getId());
                    mallMember.setInviteId(inviteId);
                    this.baseMapper.updateById(mallMember);
                    MallMemberWallet wallet = new MallMemberWallet();
                    wallet.setBalance(BigDecimal.ZERO);
                    wallet.setMemberId(mallMember.getId());
                    mallMemberWalletMapper.insert(wallet);
                }
            }
            // 存放redis
            String redisKey = AppContants.XCX_LOGIN_PHONE_PREFIX + mallMember.getId();
            String existToken = redisUtils.getString(redisKey);
            if (StrUtil.isNotBlank(existToken)) {
                Object o = redisUtils.get(existToken);
                if (ObjectUtil.isNotEmpty(o)) {
                    redisUtils.del(existToken);
                }
            }
            String token = IdUtil.simpleUUID();
            redisUtils.set(token, JSONObject.toJSONString(mallMember), 360000);
            redisUtils.set(redisKey, token, 360000);
            Map<String, Object> authInfo = new HashMap<>();
            authInfo.put("token", token);
            authInfo.put("member", mallMember);
            authInfo.put("rasToken", generateAsaToken(token));
            return new FebsResponse().success().data(authInfo);
        }
        return new FebsResponse().fail().message("验证码错误");
    }
    @Override
    public FebsResponse xcxOpen(ApiXcxOpenDto apiXcxOpenDto) {
        DataDictionaryCustom rangeSwitch = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(DataDictionaryEnum.RANGE_SWITCH.getType(), DataDictionaryEnum.RANGE_SWITCH.getCode());
        if(StrUtil.isNotBlank(rangeSwitch.getValue()) && "1".equals(rangeSwitch.getValue())){
            if(ObjectUtil.isNull(apiXcxOpenDto.getLongitude()) || ObjectUtil.isNull(apiXcxOpenDto.getLatitude())){
                return new FebsResponse().fail().message("请授权位置信息");
            }
            Double longitude = apiXcxOpenDto.getLongitude();
            Double latitude = apiXcxOpenDto.getLatitude();
            DataDictionaryCustom rangeSize = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(DataDictionaryEnum.RANGE_SIZE.getType(), DataDictionaryEnum.RANGE_SIZE.getCode());
            if(ObjectUtil.isEmpty(rangeSize)){
                return new FebsResponse().success().data(2);
            }
            if(StrUtil.isBlank(rangeSize.getValue())){
                return new FebsResponse().success().data(2);
            }
            //方位大小,换成单位:米
            Integer value = Integer.parseInt(rangeSize.getValue()) * 1000;
            //根据经纬度获取周围团长的距离
            MallTeamLeader mallTeamLeader = mallTeamLeaderMapper.selectLeaderByLonAndLat(longitude, latitude);
            if(ObjectUtil.isEmpty(mallTeamLeader)){
                return new FebsResponse().success().data(2);
            }
            Double distance = mallTeamLeader.getDistance();
            if(value <= distance){
                return new FebsResponse().success().data(2);
            }
        }
        return new FebsResponse().success().data(1);
    }
    private final IXcxPayService iXcxPayService;
    @Override
    @Transactional(rollbackFor = Exception.class)
    public FebsResponse rechargeWallet(ApiRechargeWalletDto apiRechargeWalletDto) {
        Long memberId = LoginUserUtil.getLoginUser().getId();
        BigDecimal amount = apiRechargeWalletDto.getAmount();
        if(BigDecimal.ZERO.compareTo(amount)>0){
            return new FebsResponse().fail().message("请输入正确的充值金额");
        }
        Integer type = apiRechargeWalletDto.getType();
        if(2 == type){
            //成为合伙人的充值金额
            MallAgentRecord mallAgentRecord = mallAgentRecordMapper.selectById(apiRechargeWalletDto.getAgentApplyId());
            BigDecimal agentPrice = mallAgentRecord.getAmount();
//            DataDictionaryCustom agentPriceDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(DataDictionaryEnum.PRICE_AMOUNT.getType(),
//                    DataDictionaryEnum.PRICE_AMOUNT.getCode());
//            String agentPrice = agentPriceDic.getValue();
//            BigDecimal price = new BigDecimal(agentPrice);
            if(agentPrice.compareTo(amount) != 0){
                return new FebsResponse().fail().message("成为合伙人的金额为"+agentPrice);
            }
        }
        String rechargeNo = "CZ_"+MallUtils.getOrderNum();
        apiRechargeWalletDto.setRechargeNo(rechargeNo);
        apiRechargeWalletDto.setMemberId(memberId);
        BrandWCPayRequestData brandWCPayRequestData = null;
        try {
            brandWCPayRequestData = iXcxPayService.startRechargeWallet(apiRechargeWalletDto);
        } catch (Exception e) {
            throw new FebsException("支付失败");
        }
        mallMoneyFlowService.addMoneyFlow(
                memberId,
                amount,
                MoneyFlowTypeEnum.RECHARGE.getValue(),
                rechargeNo,
                FlowTypeEnum.BALANCE.getValue(),
                "余额充值",1);
        String wxResultStr = JSONUtil.toJsonStr(brandWCPayRequestData);
        String payResultStr = brandWCPayRequestData.getPrepay_id();
        Map<String, Object> map = new HashMap<>();
        map.put("orderInfo", payResultStr);
        map.put("wxResultStr", wxResultStr);
        return new FebsResponse().success().data(map).message("充值即将到账");
    }
    @Override
    public void updateMemberAgent(Long memberId,String levelCode) {
@@ -892,132 +323,7 @@
        this.baseMapper.updateById(mallMember);
    }
    @Override
    public FebsResponse agentDetail() {
        DataDictionaryCustom dataDictionaryCustom = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(
                DataDictionaryEnum.AGENT_DETAILS.getType(), DataDictionaryEnum.AGENT_DETAILS.getCode());
        Map<String, Object> map = new HashMap<>();
        if(ObjectUtil.isNotEmpty(dataDictionaryCustom)){
            map.put("agentDetail", dataDictionaryCustom.getValue());
        }
        return new FebsResponse().success().data(map);
    }
    @Override
    public FebsResponse activityInfo() {
        DataDictionaryCustom activityBulletinDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(
                DataDictionaryEnum.ACTIVITY_BULLETIN.getType(), DataDictionaryEnum.ACTIVITY_BULLETIN.getCode());
        DataDictionaryCustom giveAmountDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(
                DataDictionaryEnum.GIVE_AMOUNT.getType(), DataDictionaryEnum.GIVE_AMOUNT.getCode());
        DataDictionaryCustom giveStateDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(
                DataDictionaryEnum.GIVE_STATE.getType(), DataDictionaryEnum.GIVE_STATE.getCode());
        Map<String, Object> map = new HashMap<>();
        if(ObjectUtil.isNotEmpty(activityBulletinDic)){
            map.put("activityBulletin",
                    ObjectUtil.isEmpty(activityBulletinDic.getValue()) ? "暂无活动" : activityBulletinDic.getValue());
        }
        if(ObjectUtil.isNotEmpty(giveAmountDic)){
            map.put("giveAmount",
                    ObjectUtil.isEmpty(giveAmountDic.getValue()) ? 0 : giveAmountDic.getValue());
        }
        map.put("giveState",giveStateDic.getValue());
        return new FebsResponse().success().data(map);
    }
    @Override
    public FebsResponse agentApplyInfo() {
        Long memberId = LoginUserUtil.getLoginUser().getId();
        ApiMallAgentRecordVo apiMallAgentRecordVo = mallAgentRecordMapper.selectApiMallAgentRecordVoByMemberIdAndState(memberId,MallAgentRecord.APPLY_ING);
        return new FebsResponse().success().data(apiMallAgentRecordVo);
    }
    @Override
    public FebsResponse getCoupon(GetCouponDto getCouponDto) {
        Long memberId = LoginUserUtil.getLoginUser().getId();
        String couponUUID = IdUtil.simpleUUID();
//        String couponUUID = getCouponDto.getCouponUUID();
//        QueryWrapper<MallMemberCoupon> objectQueryWrapper = new QueryWrapper<>();
//        objectQueryWrapper.eq("coupon_uuid",couponUUID);
//        List<MallMemberCoupon> mallMemberCouponDone = mallMemberCouponMapper.selectList(objectQueryWrapper);
//        if(CollUtil.isNotEmpty(mallMemberCouponDone)){
//            return new FebsResponse().success();
//        }
        //通过邀请人信息,获取能领取的优惠卷信息
        MallMember mallMember = this.baseMapper.selectInfoByInviteId(getCouponDto.getInviteId());
        if(ObjectUtil.isNotEmpty(mallMember)){
            SalemanCoupon salemanCoupon = salemanCouponMapper.selectByMemberId(mallMember.getId());
            if(ObjectUtil.isNotEmpty(salemanCoupon)){
                Long couponId = salemanCoupon.getCouponId();
                Long goodsId = getCouponDto.getGoodsId();
                MallGoods mallGoods = mallGoodsMapper.selectById(goodsId);
                //验证商品存不存在,且上没上架
                if(ObjectUtil.isNotEmpty(mallGoods)
                    && MallGoods.ISSALE_STATUS_ENABLE == mallGoods.getIsSale()){
//                List<MallMemberCoupon> mallMemberCoupons = mallMemberCouponMapper.selectListByMemberIdAndGoodsIdAndCouponId(memberId, goodsId, couponId,mallMember.getInviteId());
//                List<MallMemberCoupon> mallMemberCoupons = mallMemberCouponMapper.selectListByMemberIdAndGoodsIdAndCouponIdWithOutInviteId(memberId, goodsId, couponId);
                    List<MallMemberCoupon> mallMemberCoupons = mallMemberCouponMapper.selectListByMemberIdAndGoodsIdAndCouponIdWithOutInviteId(memberId, goodsId);
                    if(CollUtil.isEmpty(mallMemberCoupons)){
                        //商品优惠卷如果绑定了,那么当前登陆者获取一张卷
                        List<CouponGoods> couponGoodsList = couponGoodsMapper.selectByGoodIdAndCouponId(goodsId,couponId);
                        MallGoodsCoupon mallGoodsCoupon = mallGoodsCouponMapper.selectById(couponId);
                        if(CollUtil.isNotEmpty(couponGoodsList)){
                            MallMemberCoupon mallMemberCoupon = new MallMemberCoupon();
                            mallMemberCoupon.setCouponId(couponId);
                            mallMemberCoupon.setCouponName(mallGoodsCoupon.getName());
                            mallMemberCoupon.setMemberId(memberId);
                            mallMemberCoupon.setGoodsId(goodsId);
                            mallMemberCoupon.setCouponUuid(couponUUID);
                            mallMemberCoupon.setInviteId(mallMember.getInviteId());
                            mallMemberCoupon.setState(1);
                            mallMemberCoupon.setExpireTime(DateUtil.offsetDay(DateUtil.date(),mallGoodsCoupon.getExpireDay()));
                            mallMemberCouponMapper.insert(mallMemberCoupon);
                        }
                    }
                }
            }
        }
        return new FebsResponse().success();
    }
    @Override
    public FebsResponse scanCoupon(GetCouponDto getCouponDto) {
        Long memberId = LoginUserUtil.getLoginUser().getId();
        String couponUUID = IdUtil.simpleUUID();
        //通过邀请人信息,获取能领取的优惠卷信息
        MallMember mallMember = this.baseMapper.selectInfoByInviteId(getCouponDto.getInviteId());
        if(ObjectUtil.isNotEmpty(mallMember)){
            SalemanCoupon salemanCoupon = salemanCouponMapper.selectByMemberId(mallMember.getId());
            if(ObjectUtil.isNotEmpty(salemanCoupon)){
                Long couponId = salemanCoupon.getCouponId();
                List<MallMemberCoupon> mallMemberCoupons = mallMemberCouponMapper.selectListByMemberIdCouponIdWithOutInviteId(memberId, couponId);
                if(CollUtil.isEmpty(mallMemberCoupons)){
                    //商品优惠卷如果绑定了,那么当前登陆者获取一张卷
                    MallGoodsCoupon mallGoodsCoupon = mallGoodsCouponMapper.selectById(couponId);
                    MallMemberCoupon mallMemberCoupon = new MallMemberCoupon();
                    mallMemberCoupon.setCouponId(couponId);
                    mallMemberCoupon.setCouponName(mallGoodsCoupon.getName());
                    mallMemberCoupon.setMemberId(memberId);
                    mallMemberCoupon.setCouponUuid(couponUUID);
                    mallMemberCoupon.setInviteId(mallMember.getInviteId());
                    mallMemberCoupon.setState(1);
                    mallMemberCoupon.setExpireTime(DateUtil.offsetDay(DateUtil.date(),mallGoodsCoupon.getExpireDay()));
                    mallMemberCouponMapper.insert(mallMemberCoupon);
                }
            }
        }
        return new FebsResponse().success();
    }
    @Override
    public FebsResponse memberCoupon(MallMemberCouponDto mallMemberCouponDto) {
        Long memberId = LoginUserUtil.getLoginUser().getId();
        IPage<MallMemberCouponVo> page = new Page<>(mallMemberCouponDto.getPageNum(), mallMemberCouponDto.getPageSize());
        mallMemberCouponDto.setMemberId(memberId);
        mallMemberCouponDto.setExpireTime(DateUtil.date());
        IPage<MallMemberCouponVo> pages = mallMemberCouponMapper.selectListInPage(page, mallMemberCouponDto);
        return new FebsResponse().success().data(pages);
    }
    @Override
    public FebsResponse memberPayCoupon(MallMemberCouponDto mallMemberCouponDto) {
@@ -1035,18 +341,6 @@
        return new FebsResponse().success().data(mallMemberCouponVos);
    }
    @Override
    public FebsResponse couponDetails(Long id) {
        Long memberId = LoginUserUtil.getLoginUser().getId();
        MallMemberCoupon mallMemberCoupon = mallMemberCouponMapper.selectById(id);
        MallMemberCouponVo mallMemberCouponVo = new MallMemberCouponVo();
        mallMemberCouponVo.setCouponName(mallMemberCoupon.getCouponName());
        MallGoodsCoupon mallGoodsCoupon = mallGoodsCouponMapper.selectById(mallMemberCoupon.getCouponId());
        mallMemberCouponVo.setCostAmount(mallGoodsCoupon.getCostAmount());
        mallMemberCouponVo.setRealAmount(mallGoodsCoupon.getRealAmount());
        mallMemberCouponVo.setType(mallGoodsCoupon.getType());
        return new FebsResponse().success().data(mallMemberCouponVo);
    }
    @Override
    public FebsResponse setInvite(ApiSetInviteDto apiSetInviteDto) {
@@ -1102,216 +396,33 @@
        return String.format(wechatLoginUrl, xcxProperties.getXcxAppid(), xcxProperties.getXcxSecret(), code);
    }
    @Override
    public Map<String, Object>  loginEvent() {
        MallMember loginUser = LoginUserUtil.getLoginUser();
        MallMember member = this.baseMapper.selectById(loginUser.getId());
        this.baseMapper.updateLastLogin(member.getId(),new Date());
        DataDictionaryCustom dic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(DataDictionaryEnum.UNALIVE_COUPON.getType(), DataDictionaryEnum.UNALIVE_COUPON.getCode());
        if (dic == null || StrUtil.isBlank(dic.getValue())) {
            return new HashMap<>();
        }
        Date today = new Date();
        Date lastLoginTime = member.getLastLoginTime();
        if (lastLoginTime == null) {
            lastLoginTime = new Date();
        }
        long days = DateUtil.between(DateUtil.endOfDay(lastLoginTime), DateUtil.endOfDay(today), DateUnit.DAY);
        List<VipSettingUnAliveSettingBo> list = JSONObject.parseArray(dic.getValue(), VipSettingUnAliveSettingBo.class);
        List<Long> couponIds = list.stream().filter(item -> {
            return item.getDay() <= days && item.getCouponId() != null;
        }).map(VipSettingUnAliveSettingBo::getCouponId).collect(Collectors.toList());
        if (CollUtil.isEmpty(couponIds)) {
            return new HashMap<>();
        }
        LambdaQueryWrapper<MallGoodsCoupon> query = new LambdaQueryWrapper<>();
        query.in(MallGoodsCoupon::getId, couponIds)
                .eq(MallGoodsCoupon::getState, 2);
        List<MallGoodsCoupon> coupons = mallGoodsCouponMapper.selectList(query);
        LambdaQueryWrapper<MallMemberCoupon> memberCouponQuery = new LambdaQueryWrapper<>();
        memberCouponQuery.in(MallMemberCoupon::getCouponId, couponIds)
                        .eq(MallMemberCoupon::getMemberId, member.getId())
                        .eq(MallMemberCoupon::getFromType, 3)
                        .ge(MallMemberCoupon::getCreatedTime, DateUtil.beginOfDay(new Date()))
                        .le(MallMemberCoupon::getCreatedTime, DateUtil.endOfDay(new Date()));
        List<MallMemberCoupon> mallMemberCoupons = mallMemberCouponMapper.selectList(memberCouponQuery);
        if (CollUtil.isNotEmpty(mallMemberCoupons)) {
            Map<Long, MallMemberCoupon> map = mallMemberCoupons.stream().collect(Collectors.toMap(MallMemberCoupon::getCouponId, MallMemberCoupon -> MallMemberCoupon));
            coupons = coupons.stream().filter(item -> {
                return map.get(item.getId()) == null;
            }).collect(Collectors.toList());
        }
        if (CollUtil.isEmpty(coupons)) {
            return new HashMap<>();
        }
        coupons.forEach(item -> {
            MallMemberCoupon memberCoupon = new MallMemberCoupon();
            memberCoupon.setCouponId(item.getId());
            memberCoupon.setCouponName(item.getName());
            memberCoupon.setInviteId(member.getInviteId());
            memberCoupon.setCouponUuid(IdUtil.simpleUUID());
            memberCoupon.setState(1);
            memberCoupon.setFromType(3);
            memberCoupon.setExpireTime(DateUtil.offsetDay(DateUtil.date(), item.getExpireDay()));
            memberCoupon.setMemberId(member.getId());
            mallMemberCouponMapper.insert(memberCoupon);
        });
        Map<String, Object> result = new HashMap<>();
        result.put("coupon", coupons);
        return result;
    }
    @Override
    public FebsResponse storeList(MallStoreDto mallStoreDto) {
        QueryWrapper<MallStore> mallStoreQueryWrapper = new QueryWrapper<>();
        if(StrUtil.isNotEmpty(mallStoreDto.getName())){
            mallStoreQueryWrapper.like("name",mallStoreDto.getName());
    public FebsResponse salesService() {
        LoginUserUtil.getLoginUser().getId();
        MallSalesServiceVo mallSalesServiceVo = new MallSalesServiceVo();
        List<DataDictionaryCustom> dataDictionaryCustoms = dataDictionaryCustomMapper.selectDicByType(
                SalesServiceEnums.WHATSAPP.getType()
        );
        if (dataDictionaryCustoms.size() > 0){
            for (DataDictionaryCustom dataDictionaryCustom : dataDictionaryCustoms){
                if (SalesServiceEnums.WHATSAPP.getCode().equals(dataDictionaryCustom.getCode())){
                    mallSalesServiceVo.setWhatsApp(dataDictionaryCustom.getValue());
        }
        List<MallStore> mallStores = mallStoreMapper.selectList(mallStoreQueryWrapper);
        List<MallStoreVo> mallStoreVos = MallStoreConversion.INSTANCE.entitysToVos(mallStores);
        return new FebsResponse().success().data(mallStoreVos);
                if (SalesServiceEnums.PHONE.getCode().equals(dataDictionaryCustom.getCode())){
                    mallSalesServiceVo.setPhone(dataDictionaryCustom.getValue());
                }
                if (SalesServiceEnums.EMAIL.getCode().equals(dataDictionaryCustom.getCode())){
                    mallSalesServiceVo.setEmail(dataDictionaryCustom.getValue());
                }
    }
    @Override
    public FebsResponse storeItemList(MallStoreItemDto mallStoreItemDto) {
        QueryWrapper<MallStoreItem> mallStoreQueryWrapper = new QueryWrapper<>();
        mallStoreQueryWrapper.like("store_id",mallStoreItemDto.getStoreId());
        List<MallStoreItem> mallStores = mallStoreItemMapper.selectList(mallStoreQueryWrapper);
        return new FebsResponse().success().data(mallStores);
    }
    @Override
    public FebsResponse bindStoreMember(BindStoreMemberDto bindStoreMemberDto) {
        Long memberId = LoginUserUtil.getLoginUser().getId();
        Long storeItemId = bindStoreMemberDto.getStoreItemId();
        QueryWrapper<MallStoreMember> objectQueryWrapper = new QueryWrapper<>();
        objectQueryWrapper.eq("member_id",memberId);
        List<MallStoreMember> mallStoreMembers = mallStoreMemberMapper.selectList(objectQueryWrapper);
        if(CollUtil.isNotEmpty(mallStoreMembers)){
            mallStoreMemberMapper.delete(objectQueryWrapper);
        }
        MallMember mallMember = this.baseMapper.selectById(memberId);
        Integer sex = "女".equals(mallMember.getSex()) ? 3 : 2;
        MallStoreItem mallStoreItem = mallStoreItemMapper.selectById(storeItemId);
        HashMap<String, String> objectObjectHashMap = new HashMap<>();
        String shopAccount = mallStoreItem.getAccount();
        String shopPwd = mallStoreItem.getPassword();
        String name = bindStoreMemberDto.getName();
        String address = bindStoreMemberDto.getAddress();
        Integer age = bindStoreMemberDto.getAge();
        String phoneNumber = bindStoreMemberDto.getPhone();
        objectObjectHashMap.put("shopAccount",shopAccount);
        objectObjectHashMap.put("shopPwd",shopPwd);
        objectObjectHashMap.put("name",name);
        objectObjectHashMap.put("address",address);
        objectObjectHashMap.put("age",age.toString());
        objectObjectHashMap.put("phoneNumber",phoneNumber);
        objectObjectHashMap.put("sex",sex.toString());
        //sign= MD5(address+age+name+phoneNumber+shopAccount+shopPwd)
        StringBuffer stringBuffer = new StringBuffer();
        stringBuffer.append(address);
        stringBuffer.append(age);
        stringBuffer.append(name);
        stringBuffer.append(phoneNumber);
        stringBuffer.append(sex);
        stringBuffer.append(shopAccount);
        stringBuffer.append(shopPwd);
        String sign = MD5.MD5Encode(stringBuffer.toString());
        objectObjectHashMap.put("sign",sign);
        String url = "https://data.muchun.co/api/bindCustomer";
        String result = HttpCurlUtil.sendPost(url, objectObjectHashMap);
        Integer retCode = JSONUtil.parseObj(result).getInt("retCode");
        String message = JSONUtil.parseObj(result).getStr("message");
        if(0 != retCode || !"绑定成功".equals(message)){
            return new FebsResponse().fail().message(message);
        }
        Long bindId = JSONUtil.parseObj(result).getJSONObject("data").getLong("userId");
        MallStoreMember mallStoreMember = new MallStoreMember();
        mallStoreMember.setMemberId(memberId);
        mallStoreMember.setBindId(bindId);
        mallStoreMember.setStoreId(mallStoreItem.getStoreId());
        mallStoreMember.setStoreItemId(mallStoreItem.getId());
        mallStoreMember.setAccount(shopAccount);
        mallStoreMember.setPassword(shopPwd);
        mallStoreMember.setName(name);
        mallStoreMember.setAddress(address);
        mallStoreMember.setAge(age);
        mallStoreMember.setPhone(phoneNumber);
        mallStoreMemberMapper.insert(mallStoreMember);
        return new FebsResponse().success().message("绑定成功");
    }
    @Override
    public FebsResponse bindList() {
        Long memberId = LoginUserUtil.getLoginUser().getId();
        QueryWrapper<MallStoreMember> objectQueryWrapper = new QueryWrapper<>();
        objectQueryWrapper.eq("member_id",memberId);
        List<MallStoreMember> mallStoreMembers = mallStoreMemberMapper.selectList(objectQueryWrapper);
        ArrayList<MallStoreMemberVo> mallStoreMemberVos = new ArrayList<>();
        for(MallStoreMember mallStoreMember : mallStoreMembers){
            MallStoreMemberVo mallStoreMemberVo = new MallStoreMemberVo();
            Long storeId = mallStoreMember.getStoreId();
            Long storeItemId = mallStoreMember.getStoreItemId();
            MallStore mallStore = mallStoreMapper.selectById(storeId);
            MallStoreItem mallStoreItem = mallStoreItemMapper.selectById(storeItemId);
            mallStoreMemberVo.setId(mallStoreMember.getId());
            mallStoreMemberVo.setBindInfo(mallStore.getName()+"-"+mallStoreItem.getCode());
            mallStoreMemberVos.add(mallStoreMemberVo);
        }
        return new FebsResponse().success().data(mallStoreMemberVos);
    }
    @Override
    public FebsResponse bindResult(BindResultDto bindResultDto) {
        Long memberId = LoginUserUtil.getLoginUser().getId();
        MallStoreMember mallStoreMember = mallStoreMemberMapper.selectById(bindResultDto.getBindId());
        Long userld = mallStoreMember.getBindId();
        String shopAccount = mallStoreMember.getAccount();
        String shopPwd = mallStoreMember.getPassword();
        HashMap<String, String> objectObjectHashMap = new HashMap<>();
        objectObjectHashMap.put("shopAccount",shopAccount);
        objectObjectHashMap.put("shopPwd",shopPwd);
        objectObjectHashMap.put("userId",userld.toString());
        //sign= MD5(shopAccount+shopPwd+userId)
        StringBuffer stringBuffer = new StringBuffer();
        stringBuffer.append(shopAccount);
        stringBuffer.append(shopPwd);
        stringBuffer.append(userld);
        String sign = MD5.MD5Encode(stringBuffer.toString());
        objectObjectHashMap.put("sign",sign);
        String url = "https://data.muchun.co/api/getCustomerCheckRecords";
        String result = HttpCurlUtil.sendPost(url, objectObjectHashMap);
        Integer retCode = JSONUtil.parseObj(result).getInt("retCode");
        String message = JSONUtil.parseObj(result).getStr("message");
        if(0 != retCode){
            return new FebsResponse().fail().message(message);
        }
        JSONArray data = JSONUtil.parseObj(result).getJSONArray("data");
        return new FebsResponse().success().data(data);
        return new FebsResponse().success().data(mallSalesServiceVo);
    }
    public static void main(String[] args) {
src/main/java/cc/mrbird/febs/mall/service/impl/ApiMallOrderInfoServiceImpl.java
@@ -93,18 +93,16 @@
    @Transactional(rollbackFor = Exception.class)
    public Long createOrder(AddOrderDto addOrderDto) {
        Long memberId = LoginUserUtil.getLoginUser().getId();
        MallMember member = ValidateEntityUtils
                .ensureColumnReturnEntity(memberId, MallMember::getId, mallMemberMapper::selectOne, "用户不存在");
        //订单范围内才允许下单
        MallAddressInfo address = ValidateEntityUtils
                .ensureColumnReturnEntity(addOrderDto.getAddressId(), MallAddressInfo::getId, mallAddressInfoMapper::selectOne, "收货地址信息不存在");
                .ensureColumnReturnEntity(addOrderDto.getAddressId(), MallAddressInfo::getId, mallAddressInfoMapper::selectOne, "Please fill in the address first");
        String orderNo = MallUtils.getOrderNum();
        MallOrderInfo orderInfo = new MallOrderInfo();
        orderInfo.setOrderNo(orderNo);
        orderInfo.setOrderTime(new Date());
        orderInfo.setMemberId(member.getId());
        orderInfo.setMemberId(memberId);
        orderInfo.setStatus(OrderStatusEnum.WAIT_PAY.getValue());
        orderInfo.setRemark(addOrderDto.getRemark());
        orderInfo.setOrderType(addOrderDto.getOrderType());
@@ -115,97 +113,30 @@
        this.baseMapper.insert(orderInfo);
        BigDecimal total = BigDecimal.ZERO;
        /**
         * 根据传入的优惠卷ID和商品明细集合计算出每个商品获取的实际支付金额
         */
        Map<Long, BigDecimal> couponAmountMap = new HashMap<>();
        MallMemberCoupon mallMemberCoupon = new MallMemberCoupon();
        if(ObjectUtil.isNotEmpty(addOrderDto.getMemberCouponId())){
            Long memberCouponId = addOrderDto.getMemberCouponId();
            mallMemberCoupon = mallMemberCouponMapper.selectById(memberCouponId);
            if(ObjectUtil.isEmpty(mallMemberCoupon)){
                throw new FebsException(mallMemberCoupon.getCouponName()+"无法使用");
            }
            Integer state = mallMemberCoupon.getState();
            if(1 != state){
                throw new FebsException(mallMemberCoupon.getCouponName()+"无法使用");
            }
            List<AddOrderItemDto> items = addOrderDto.getItems();
            couponAmountMap = getCouponAmountMap(memberCouponId, items);
        }
        for (AddOrderItemDto item : addOrderDto.getItems()) {
                MallOrderItem orderItem = new MallOrderItem();
                // 积分商品提交订单
                if (addOrderDto.getOrderType() == 2) {
                    MallGoods mallGoods = mallGoodsMapper.selectById(item.getSkuId());
                    if (mallGoods.getStock() < item.getCnt()) {
                        throw new FebsException(mallGoods.getGoodsName() + "库存不足");
                    }
                    if (MallGoods.ISSALE_STATUS_DISABLED.equals(mallGoods.getIsSale())) {
                        throw new FebsException(mallGoods.getGoodsName() + "已下架");
                    }
                    BigDecimal amount = mallGoods.getScore().multiply(BigDecimal.valueOf(item.getCnt()));
                    orderItem.setAmount(amount);
                    orderItem.setCnt(item.getCnt());
                    orderItem.setOrderId(orderInfo.getId());
                    orderItem.setPrice(mallGoods.getScore());
                    orderItem.setGoodsId(mallGoods.getId());
                    orderItem.setGoodsName(mallGoods.getGoodsName());
                    orderItem.setStyleName(mallGoods.getGoodsName());
                    orderItem.setSkuName(mallGoods.getGoodsName());
                    orderItem.setSkuImage(mallGoods.getThumb());
                    orderItem.setState(1);
                    if (addOrderDto.getType() == 1) {
                        LambdaQueryWrapper<MallShoppingCart> delQuery = new LambdaQueryWrapper<>();
                        delQuery.eq(MallShoppingCart::getGoodsId, item.getSkuId())
                                .eq(MallShoppingCart::getMemberId, member.getId());
                        mallShoppingCartMapper.delete(delQuery);
                    }
                    total = total.add(amount);
                } else {
                    MallGoodsSku sku = mallGoodsSkuMapper.selectSkuInfoById(item.getSkuId());
                    if (sku == null) {
                        throw new FebsException("购买商品或sku不存在");
                throw new FebsException("The product does not exist.");
                    }
                    if (sku.getStock() < item.getCnt()) {
                        throw new FebsException(sku.getSkuName() + "库存不足");
                throw new FebsException("Insufficient stock");
                    }
                    MallGoods mallGoods = mallGoodsMapper.selectById(sku.getGoodsId());
                    // 零撸专区购买
                    if (new BigDecimal(mallGoods.getPresentPrice()).compareTo(BigDecimal.ZERO) == 0) {
                        List<MallOrderItem> items = mallOrderItemMapper.selectItemByGoodsIdUnCancel(mallGoods.getId(), member.getId());
                        if (CollUtil.isNotEmpty(items)) {
                            throw new FebsException("无法重复领取同一个商品");
                        }
                    }
                    if (MallGoods.ISSALE_STATUS_DISABLED.equals(mallGoods.getIsSale())) {
                        throw new FebsException(mallGoods.getGoodsName() + "已下架");
                throw new FebsException("Discontinued");
                    }
                    //商品库存销量计算
                    Integer goodsResult = mallGoodsMapper.upDateStockAndVolumeByGoodsId(mallGoods.getId(), item.getCnt());
                    if(1 != goodsResult){
                        throw new FebsException(mallGoods.getGoodsName() + "库存不足");
                throw new FebsException("Discontinued");
                    }
                    BigDecimal amount = sku.getPresentPrice().multiply(BigDecimal.valueOf(item.getCnt()));
                    //是否使用优惠卷
                    if(ObjectUtil.isNotEmpty(addOrderDto.getMemberCouponId())){
                        Long memberCouponId = addOrderDto.getMemberCouponId();
                        if(ObjectUtil.isNotEmpty(couponAmountMap.get(item.getSkuId()))){
                            BigDecimal skuCouponAmount = couponAmountMap.get(item.getSkuId());//使用折扣卷后的应该支付的钱
                            if(skuCouponAmount.compareTo(BigDecimal.ZERO) > 0){
                                amount = skuCouponAmount;
                            }
                            orderItem.setMemberCouponId(memberCouponId);
                        }
                    }
                    orderItem.setAmount(amount);
                    orderItem.setCnt(item.getCnt());
                    orderItem.setOrderId(orderInfo.getId());
@@ -214,13 +145,6 @@
                    orderItem.setGoodsName(sku.getGoodsName());
                    orderItem.setSkuId(sku.getId());
                    orderItem.setState(1);
                    if(ObjectUtil.isNotEmpty(member.getReferrerId())){
                        orderItem.setMemberInviteId(member.getReferrerId());
                    }
                    if(ObjectUtil.isNotEmpty(addOrderDto.getMemberInviteId())){
                        orderItem.setMemberInviteId(addOrderDto.getMemberInviteId());
                    }
                    orderItem.setStyleName(sku.getStyleName());
                    orderItem.setSkuName(sku.getSkuName());
                    orderItem.setSkuImage(sku.getSkuImage());
@@ -230,16 +154,13 @@
                    total = total.add(amount);
                    //规格的库存销量
                    Integer skuResult = mallGoodsSkuMapper.upDateStockAndVolumeBySkuId(sku.getId(),item.getCnt());
                    ValidateEntityUtils.ensureEqual(1,skuResult,sku.getSkuName() + "库存不足");
            ValidateEntityUtils.ensureEqual(1,skuResult,sku.getSkuName() + "Discontinued");
                    if (addOrderDto.getType() == 1) {
                        mallShoppingCartMapper.delBySkuId(sku.getId(), member.getId());
                    }
                mallShoppingCartMapper.delBySkuId(sku.getId(), memberId);
                }
                mallOrderItemMapper.insert(orderItem);
        }
        mallMemberCoupon.setState(2);
        mallMemberCouponMapper.updateById(mallMemberCoupon);
        //运费
        BigDecimal delivaryAmount = addOrderDto.getDeliveryAmount() == null ? BigDecimal.ZERO : addOrderDto.getDeliveryAmount();
        orderInfo.setCarriage(delivaryAmount);
@@ -247,14 +168,10 @@
        total = total.add(delivaryAmount);
        orderInfo.setAmount(total);
        orderInfo.setAddressId(address.getId());
        orderInfo.setName(address.getName());
        orderInfo.setName(address.getFristName() + address.getName());
        orderInfo.setPhone(address.getPhone());
        orderInfo.setIsHome(addOrderDto.getIsHome());
        if (StrUtil.isBlank(address.getLatitude())||StrUtil.isBlank(address.getLongitude())) {
            throw new FebsException("请添加地址");
        }
        orderInfo.setAddress(address.getProvince()+address.getCity()+address.getArea() + address.getAddress());
        orderInfo.setAddress(address.getArea()+ address.getAddress()+address.getCity()+address.getProvince() + address.getCountry() );
        orderInfo.setLatitude(address.getLatitude());
        orderInfo.setLongitude(address.getLongitude());
        this.baseMapper.updateById(orderInfo);
@@ -394,11 +311,11 @@
        MallMember member = LoginUserUtil.getLoginUser();
        MallOrderInfo orderInfo = this.baseMapper.selectOrderByMemberIdAndId(member.getId(), id);
        if (orderInfo == null || AppContants.DEL_FLAG_Y == orderInfo.getDelFlag()) {
            throw new FebsException("订单不存在");
            throw new FebsException("Order does not exist");
        }
        if (OrderStatusEnum.WAIT_PAY.getValue() != orderInfo.getStatus()) {
            throw new FebsException("订单不是待付款, 无法取消");
            throw new FebsException("The order is not pending payment, so it cannot be canceled");
        }
        orderInfo.setStatus(OrderStatusEnum.CANCEL.getValue());
@@ -406,8 +323,6 @@
        this.baseMapper.updateById(orderInfo);
        if (orderInfo.getOrderType() == 2) {
//            mallMoneyFlowService.addMoneyFlow(member.getId(), orderInfo.getAmount(), MoneyFlowTypeEnum.REFUND.getValue(), orderInfo.getOrderNo(),  FlowTypeEnum.PRIZE_SCORE.getValue());
//            memberWalletService.add(orderInfo.getAmount(), member.getId(), "prizeScore");
            return;
        }
@@ -416,22 +331,22 @@
            for(MallOrderItem mallOrderItem : mallOrderItemList){
                MallGoodsSku sku = mallGoodsSkuMapper.selectSkuInfoById(mallOrderItem.getSkuId());
                if (sku == null) {
                    throw new FebsException("购买商品或sku不存在");
                    throw new FebsException("The product does not exist.");
                }
                if (sku.getStock() < mallOrderItem.getCnt()) {
                    throw new FebsException(sku.getSkuName() + "库存不足");
                    throw new FebsException("Insufficient stock");
                }
                MallGoods mallGoods = mallGoodsMapper.selectById(sku.getGoodsId());
                Integer goodsResult = mallGoodsMapper.updateStockAndVolumeByGoodsId(mallGoods.getId(), mallOrderItem.getCnt());
                if(1 != goodsResult){
                    throw new FebsException(mallGoods.getGoodsName() + "库存不足");
                    throw new FebsException("Insufficient stock");
                }
                Integer skuResult = mallGoodsSkuMapper.updateStockAndVolumeBySkuId(sku.getId(),mallOrderItem.getCnt());
                if(1 != skuResult){
                    throw new FebsException(sku.getSkuName() + "库存不足");
                    throw new FebsException("Insufficient stock");
                }
                Long memberCouponId = mallOrderItem.getMemberCouponId();
                MallMemberCoupon mallMemberCoupon = mallMemberCouponMapper.selectById(memberCouponId);
@@ -991,32 +906,23 @@
    @Override
    public FebsResponse createOrderVerify(ApiCreateOrderVerifyDto apiCreateOrderVerifyDto) {
        Long memberId = LoginUserUtil.getLoginUser().getId();
        MallMember member = memberMapper.selectById(memberId);
        List<AddOrderItemDto> items = apiCreateOrderVerifyDto.getItems();
        if(CollUtil.isEmpty(items)){
            return new FebsResponse().fail().message("请先挑选商品");
            return new FebsResponse().fail().message("Please select the product first");
        }
        for (AddOrderItemDto item : apiCreateOrderVerifyDto.getItems()) {
            MallGoodsSku sku = mallGoodsSkuMapper.selectSkuInfoById(item.getSkuId());
            if (sku == null) {
                return new FebsResponse().fail().message("购买商品或sku不存在");
                return new FebsResponse().fail().message("The product does not exist.");
            }
            if (sku.getStock() < item.getCnt()) {
                return new FebsResponse().fail().message(sku.getSkuName() + "库存不足");
                return new FebsResponse().fail().message("Insufficient stock");
            }
            MallGoods mallGoods = mallGoodsMapper.selectById(sku.getGoodsId());
            if (MallGoods.ISSALE_STATUS_DISABLED.equals(mallGoods.getIsSale())) {
                return new FebsResponse().fail().message(mallGoods.getGoodsName() + "已下架");
                return new FebsResponse().fail().message("Discontinued");
            }
            if(GoodsTypeEnum.HUO_DONG.getValue() == mallGoods.getIsNormal()){
                //活动商品判断是否在活动进行中
                MallActivity mallActivity = mallActivityMapper.selectById(mallGoods.getActivityId());
                if(mallActivity == null || mallActivity.getState() != 2){
                    return new FebsResponse().fail().message("活动不在进行中");
                }
            }
        }
        return new FebsResponse().success();
src/main/java/cc/mrbird/febs/mall/service/impl/ApiMallShoppingCartServiceImpl.java
@@ -50,41 +50,18 @@
    public void addGoodsToCart(List<AddCartDto> addCartDtoList) {
        Long memberId = LoginUserUtil.getLoginUser().getId();
        for (AddCartDto addCartDto : addCartDtoList) {
            Long goodsId = null;
            Long skuId = null;
            Long styleId = null;
            MallShoppingCart cartGoods = null;
            if (addCartDto.getType() == null) {
                addCartDto.setType(1);
            }
            if (addCartDto.getType() == 1) {
                MallGoodsSku sku = mallGoodsSkuMapper.selectById(addCartDto.getSkuId());
                if (sku == null) {
                    throw new FebsException("sku不存在");
                }
                goodsId = sku.getGoodsId();
                skuId = sku.getId();
                styleId = sku.getStyleId();
            Long goodsId = sku.getGoodsId();
            Long skuId = sku.getId();
            Long styleId = sku.getStyleId();
                cartGoods = this.baseMapper.selectCartGoodsBySkuId(addCartDto.getSkuId(), memberId);
            } else {
                MallGoods mallGoods = mallGoodsMapper.selectById(addCartDto.getSkuId());
                if (mallGoods == null) {
                    throw new FebsException("积分商品不存在");
                }
                goodsId = mallGoods.getId();
                LambdaQueryWrapper<MallShoppingCart> cartQuery = new LambdaQueryWrapper<>();
                cartQuery.eq(MallShoppingCart::getGoodsId, goodsId)
                        .eq(MallShoppingCart::getMemberId, memberId)
                        .last("limit 1");
                cartGoods = this.baseMapper.selectOne(cartQuery);
            }
            MallShoppingCart cartGoods = this.baseMapper.selectCartGoodsBySkuId(addCartDto.getSkuId(), memberId);
            if (cartGoods == null) {
                cartGoods = new MallShoppingCart();
src/main/java/cc/mrbird/febs/mall/service/impl/MallMemberCollectionServiceImpl.java
@@ -1,5 +1,6 @@
package cc.mrbird.febs.mall.service.impl;
import cc.mrbird.febs.common.entity.FebsResponse;
import cc.mrbird.febs.common.exception.FebsException;
import cc.mrbird.febs.common.utils.LoginUserUtil;
import cc.mrbird.febs.mall.dto.AddCollectionDto;
@@ -35,12 +36,12 @@
    private final IApiMallGoodsService apiMallGoodsService;
    @Override
    public void add(AddCollectionDto addCollectionDto) {
    public FebsResponse add(AddCollectionDto addCollectionDto) {
        MallMember member = LoginUserUtil.getLoginUser();
        MallGoods mallgoods = apiMallGoodsService.getById(addCollectionDto.getGoodsId());
        if (mallgoods == null) {
            throw new FebsException("商品不存在");
            throw new FebsException("The product does not exist.");
        }
        LambdaQueryWrapper<MallMemberCollection> queryWrapper = new LambdaQueryWrapper<>();
@@ -48,14 +49,15 @@
        queryWrapper.eq(MallMemberCollection::getGoodsId, addCollectionDto.getGoodsId());
        List<MallMemberCollection> mallMemberCollections = this.baseMapper.selectList(queryWrapper);
        if (CollUtil.isNotEmpty(mallMemberCollections)) {
            throw new FebsException("商品已收藏");
            throw new FebsException("Product has been favorited");
        }
        MallMemberCollection collection = new MallMemberCollection();
        collection.setMemberId(member.getId());
        collection.setGoodsId(addCollectionDto.getGoodsId());
        this.baseMapper.insert(collection);
        return new FebsResponse().success().message("Added to favorites");
    }
    @Override
src/main/java/cc/mrbird/febs/mall/vo/AddressInfoVo.java
@@ -13,22 +13,32 @@
public class AddressInfoVo {
    @ApiModelProperty(value = "id")
    private String id;
    private Long id;
    @ApiModelProperty(value = "姓名")
    @ApiModelProperty(value = "Last name")
    private String name;
    @ApiModelProperty(value = "手机号")
    private String phone;
    @ApiModelProperty(value = "First name")
    private String firstName;
    @ApiModelProperty(value = "地区")
    private String area;
    @ApiModelProperty(value = "地址")
    @ApiModelProperty(value = "Address1")
    private String address;
    @ApiModelProperty(value = "是否默认地址 1-是 2-否")
    private Integer isDefault;
    @ApiModelProperty(value = "Address2")
    private String area;
    @ApiModelProperty(value = "Postcode")
    private String postcode;
    @ApiModelProperty(value = "Phone Number")
    private String phone;
    @ApiModelProperty(value = "City")
    private String city;
    @ApiModelProperty(value = "State / Province")
    private String province;
    @ApiModelProperty(value = "Country/Region")
    private String country;
    /**
     * 经度
@@ -41,12 +51,4 @@
     */
    @ApiModelProperty(value = "纬度")
    private String latitude;
    //省
    @ApiModelProperty(value = "省")
    private String province;
    //市
    @ApiModelProperty(value = "市")
    private String city;
}
src/main/java/cc/mrbird/febs/mall/vo/MallMemberVo.java
@@ -14,99 +14,13 @@
@ApiModel(value = "MallMemberVo", description = "商城用户信息返回类")
public class MallMemberVo {
    @ApiModelProperty(value = "id")
    private Long id;
    @ApiModelProperty(value = "昵称")
    private String name;
    @ApiModelProperty(value = "手机号")
    private String phone;
    @ApiModelProperty(value = "邮箱")
    private String email;
    @ApiModelProperty(value = "真实姓名")
    private String realName;
    @ApiModelProperty(value = "性别")
    private String sex;
    @ApiModelProperty(value = "邀请码(如果是团长,邀请码就是团长特征码)")
    private String inviteId;
    @ApiModelProperty(value = "头像")
    private String avatar;
    @ApiModelProperty(value = "余额")
    private BigDecimal balance;
    @ApiModelProperty(value = "代理等级")
    private String levelName;
    @ApiModelProperty(value = "推荐人昵称")
    private String referrerName;
    private String level;
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    private Date createdTime;
    /**
     * 账户状态;1-正常 2-禁用
     */
    private Integer accountStatus;
    public static final int ACCOUNTSTATUS_Y = 1;
    public static final int ACCOUNTSTATUS_N = 2;
    @ApiModelProperty(value = "是否设置收款方式", example = "1是2否")
    private Integer hasPayment = 2;
    @ApiModelProperty(value = "是否设置交易密码", example = "1是2否")
    private Integer hasTradePwd = 2;
    @ApiModelProperty(value = "绑定手机号")
    private String bindPhone;
    @ApiModelProperty(value = "累计消费")
    private BigDecimal totalCost;
    @ApiModelProperty(value = "赠送积分")
    private BigDecimal score;
    @ApiModelProperty(value = "抽奖积分")
    private BigDecimal prizeScore;
    @ApiModelProperty(value = "是否是团长 1: 是 2:否")
    private Integer isTeamLeader;
    @ApiModelProperty(value = "是否是代理 1: 申请中 2:是 3:否")
    private Integer isAgent;
    @ApiModelProperty(value = "代理名称")
    private String agentLevelName;
    @ApiModelProperty(value = "代理等级数字  1:一级 2:二级 3:三级")
    private Integer agentLevel;
    @ApiModelProperty(value = "收藏数量")
    private Integer collectionCnt;
    @ApiModelProperty(value = "足迹数量")
    private Integer footprintCnt;
    @ApiModelProperty(value = "足迹数量")
    private Integer childCnt;
    @ApiModelProperty(value = "是否是推销员")
    private Integer isSale;
    @ApiModelProperty(value = "会员信息")
    private MallVipConfig vipInfo;
    @ApiModelProperty(value = "生日")
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
    private Date birthday;
}
src/main/java/cc/mrbird/febs/mall/vo/MallSalesServiceVo.java
New file
@@ -0,0 +1,20 @@
package cc.mrbird.febs.mall.vo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@Data
@ApiModel(value = "MallSalesServiceVo", description = "地址信息返回参数类")
public class MallSalesServiceVo {
    @ApiModelProperty(value = "whatsApp")
    private String whatsApp;
    @ApiModelProperty(value = "phone")
    private String phone;
    @ApiModelProperty(value = "email")
    private String email;
}