Răsfoiți Sursa

clode getwey 添加登录接口

wxd 1 lună în urmă
părinte
comite
43b468a5ec
24 a modificat fișierele cu 2903 adăugiri și 3 ștergeri
  1. 393 0
      alien-gateway/src/main/java/shop/alien/gateway/controller/StoreUserController.java
  2. 151 0
      alien-gateway/src/main/java/shop/alien/gateway/entity/dto/StoreInfoDto.java
  3. 574 0
      alien-gateway/src/main/java/shop/alien/gateway/entity/vo/LifeCouponVo.java
  4. 53 0
      alien-gateway/src/main/java/shop/alien/gateway/entity/vo/LifeFansVo.java
  5. 46 0
      alien-gateway/src/main/java/shop/alien/gateway/entity/vo/LifeUserDynamicsVo.java
  6. 82 0
      alien-gateway/src/main/java/shop/alien/gateway/entity/vo/LifeUserOrderVo.java
  7. 41 0
      alien-gateway/src/main/java/shop/alien/gateway/entity/vo/ScreeningOfEightMajorCategoriesVO.java
  8. 64 0
      alien-gateway/src/main/java/shop/alien/gateway/entity/vo/StoreDictionaryVo.java
  9. 31 0
      alien-gateway/src/main/java/shop/alien/gateway/entity/vo/StoreImgTypeVo.java
  10. 164 0
      alien-gateway/src/main/java/shop/alien/gateway/entity/vo/StoreInfoVo.java
  11. 60 0
      alien-gateway/src/main/java/shop/alien/gateway/entity/vo/StoreMainInfoVo.java
  12. 29 0
      alien-gateway/src/main/java/shop/alien/gateway/entity/vo/StoreMenuVo.java
  13. 36 0
      alien-gateway/src/main/java/shop/alien/gateway/entity/vo/StoreUserExcelVo.java
  14. 33 0
      alien-gateway/src/main/java/shop/alien/gateway/entity/vo/StoreUserVo.java
  15. 44 0
      alien-gateway/src/main/java/shop/alien/gateway/mapper/LifeUserDynamicsMapper.java
  16. 3 3
      alien-gateway/src/main/java/shop/alien/gateway/mapper/LifeUserMapper.java
  17. 29 0
      alien-gateway/src/main/java/shop/alien/gateway/mapper/StoreImgMapper.java
  18. 94 0
      alien-gateway/src/main/java/shop/alien/gateway/mapper/StoreInfoMapper.java
  19. 37 0
      alien-gateway/src/main/java/shop/alien/gateway/mapper/StoreUserMapper.java
  20. 205 0
      alien-gateway/src/main/java/shop/alien/gateway/service/StoreInfoService.java
  21. 160 0
      alien-gateway/src/main/java/shop/alien/gateway/service/StoreUserService.java
  22. 449 0
      alien-gateway/src/main/java/shop/alien/gateway/service/impl/StoreUserServiceImpl.java
  23. 114 0
      alien-gateway/src/main/java/shop/alien/gateway/util/DateUtils.java
  24. 11 0
      alien-gateway/src/main/resources/mapper/StoreUserMapper.xml

+ 393 - 0
alien-gateway/src/main/java/shop/alien/gateway/controller/StoreUserController.java

@@ -0,0 +1,393 @@
+package shop.alien.gateway.controller;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import io.swagger.annotations.*;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.web.bind.annotation.*;
+import shop.alien.entity.result.R;
+import shop.alien.entity.store.StoreImg;
+import shop.alien.entity.store.StoreUser;
+import shop.alien.gateway.entity.vo.StoreInfoVo;
+import shop.alien.gateway.entity.vo.StoreUserVo;
+import shop.alien.gateway.mapper.StoreImgMapper;
+import shop.alien.gateway.mapper.StoreUserMapper;
+import shop.alien.gateway.service.StoreInfoService;
+import shop.alien.gateway.service.StoreUserService;
+
+import java.io.IOException;
+import java.util.Objects;
+import java.util.Optional;
+
+/**
+ * 门店用户 前端控制器
+ *
+ * @author ssk
+ * @since 2024-12-11
+ */
+@Slf4j
+@Api(tags = {"二期-门店用户"})
+@ApiSort(8)
+@CrossOrigin
+@RestController
+@RequestMapping("/store/user")
+@RequiredArgsConstructor
+public class StoreUserController {
+
+    private final StoreUserService storeUserService;
+    private final StoreUserMapper storeUserMapper;
+    private final StoreInfoService storeInfoService;
+    private final StoreImgMapper storeImgMapper;
+
+    @ApiOperation("门店用户登录")
+    @ApiOperationSupport(order = 1)
+    @ApiImplicitParams({@ApiImplicitParam(name = "phone", value = "手机号", dataType = "String", paramType = "query", required = true),
+            @ApiImplicitParam(name = "password", value = "密码", dataType = "String", paramType = "query", required = true),
+            @ApiImplicitParam(name = "isPassword", value = "是否密码登录", dataType = "Boolean", paramType = "query", required = true)})
+    @GetMapping("/login")
+    public R<StoreUserVo> login(String phone, String password,
+                                @RequestParam(defaultValue = "true", required = false) Boolean isPassword) {
+        log.info("StoreUserController.login?phone={}&password={}&isPassword={}", phone, password, isPassword);
+        StoreUser storeUser = storeUserMapper.selectOne(new LambdaQueryWrapper<StoreUser>()
+                .eq(StoreUser::getPhone, phone));
+        if (null == storeUser) {
+            return R.fail("当前账号不存在,请先去注册账号!");
+        }
+        if (storeUser.getStatus() == 1) {
+            return R.fail("账号被禁用");
+        }
+        return Optional.ofNullable(storeUser).
+                map(user -> isPassword ? checkPassword(user, password) : storeUserService.createToKen(user)).
+                orElseGet(() -> R.fail("手机号不存在"));
+    }
+
+    /**
+     * 校验商户端账号是否禁用
+     *
+     * @param accountId
+     * @return
+     */
+    @ApiOperation("校验账号是否被禁用")
+    @ApiOperationSupport(order = 1)
+    @ApiImplicitParams({@ApiImplicitParam(name = "accountId", value = "账号id", dataType = "Integer", paramType = "query", required = true)})
+    @GetMapping("/checkAccount")
+    private R<StoreUserVo> checkAccount(Integer accountId) {
+        return storeUserService.getById(accountId).getStatus() != 1 ? R.success("账号正常")
+                : R.fail("账号禁用");
+    }
+
+    /**
+     * checkPwd
+     *
+     * @param user
+     * @param password
+     * @return
+     */
+    private R<StoreUserVo> checkPassword(StoreUser user, String password) {
+        return Objects.equals(password, user.getPassword())
+                ? storeUserService.createToKen(user)
+                : R.fail("密码错误");
+    }
+
+    @ApiOperation("修改密码")
+    @ApiOperationSupport(order = 2)
+    @ApiImplicitParams({@ApiImplicitParam(name = "phone", value = "手机号", dataType = "String", paramType = "query", required = true),
+            @ApiImplicitParam(name = "oldPassword", value = "旧密码", dataType = "String", paramType = "query"),
+            @ApiImplicitParam(name = "newPassword", value = "新密码", dataType = "String", paramType = "query", required = true),
+            @ApiImplicitParam(name = "type", value = "类型:0:忘记密码,其他:修改密码", dataType = "Integer", paramType = "query", required = true)})
+    @GetMapping("/updatePassword")
+    public R<Boolean> updatePassword(String phone, String oldPassword, String newPassword, Integer type) {
+        log.info("StoreUserController.updatePassword?phone={}&oldPassword={}&newPassword={}&type={}", phone, oldPassword, newPassword, type);
+        StoreUser storeUser = storeUserService.getUserByPhone(phone);
+        if (null != storeUser) {
+            if (0 == type || oldPassword.equals(storeUser.getPassword())) {
+                if (newPassword.equals(storeUser.getPassword())) {
+                    return R.fail("新密码与原密码相同");
+                }
+                if (storeUserService.updatePassword(storeUser.getId(), newPassword)) {
+                    return R.success("修改成功");
+                }
+                return R.fail("修改失败");
+            }
+            return R.fail("旧密码错误");
+        }
+        return R.fail("手机号不存在");
+    }
+
+    @ApiOperation("修改用户信息")
+    @ApiOperationSupport(order = 3)
+    @ApiImplicitParams({@ApiImplicitParam(name = "id", value = "主键", dataType = "String", paramType = "query", required = true),
+            @ApiImplicitParam(name = "name", value = "姓名", dataType = "String", paramType = "query", required = true),
+            @ApiImplicitParam(name = "idCard", value = "身份证", dataType = "String", paramType = "query", required = true)})
+    @GetMapping("/setUserInfo")
+    public R<Boolean> setUserInfo(Integer id, String name, String idCard) {
+        log.info("StoreUserController.setUserInfo?id={}&name={}&idCard={}", id, name, idCard);
+        if (storeUserService.setUserInfo(id, name, idCard)) {
+            return R.success("修改成功");
+        }
+        return R.fail("修改失败");
+    }
+
+    @ApiOperation("根据手机号获取用户")
+    @ApiOperationSupport(order = 4)
+    @ApiImplicitParams({@ApiImplicitParam(name = "phone", value = "手机号", dataType = "String", paramType = "query", required = true)})
+    @GetMapping("/getUserByPhone")
+    public R<StoreUser> getUserByPhone(String phone) {
+        log.info("StoreUserController.getUserInfo?phone={}", phone);
+        StoreUser storeUser = storeUserService.getUserByPhone(phone);
+        if (null != storeUser) {
+            return R.data(storeUser);
+        }
+        return R.fail("手机号不存在");
+    }
+
+    @ApiOperation("修改支付密码")
+    @ApiOperationSupport(order = 5)
+    @ApiImplicitParams({@ApiImplicitParam(name = "id", value = "主键", dataType = "String", paramType = "query", required = true), @ApiImplicitParam(name = "payPassword", value = "支付密码", dataType = "String", paramType = "query", required = true)})
+    @GetMapping("/setPayPassword")
+    public R<Boolean> setPayPassword(Integer id, String payPassword) {
+        if (storeUserService.setPayPassword(id, payPassword)) {
+            return R.success("修改成功");
+        }
+        return R.fail("修改失败");
+    }
+
+    @ApiOperation("修改用户状态")
+    @ApiOperationSupport(order = 6)
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "phone", value = "手机号", dataType = "String", paramType = "query", required = true),
+            @ApiImplicitParam(name = "type", value = "修改类型 (pass:密码状态改为1, face:人脸状态改为2)", dataType = "String", paramType = "query", required = true)
+    })
+    @GetMapping("/updateUserStatus")
+    public R<StoreUser> updateUserStatus(String phone, String type) {
+        log.info("StoreUserController.updateUserStatus?phone={}&type={}", phone, type);
+        if (storeUserService.updateUserStatus(phone, type)) {
+            return R.success("修改成功");
+        }
+        return R.fail("修改失败");
+    }
+
+    @ApiOperation("修改商户信息")
+    @ApiOperationSupport(order = 7)
+    @PostMapping("/setStoreUserInfo")
+    public R<Boolean> setStoreUserInfo(@RequestBody StoreInfoVo storeInfo) {
+        log.info("StoreUserController.setStoreUserInfo?storeInfo={}", storeInfo);
+
+        // 查询店铺图片信息
+        LambdaQueryWrapper<StoreImg> queryWrapper = new LambdaQueryWrapper<StoreImg>()
+                .eq(StoreImg::getImgType, 10)
+                .eq(StoreImg::getStoreId, storeInfo.getId());
+        StoreImg storeImg = storeImgMapper.selectOne(queryWrapper);
+
+        // 如果查询到店铺图片信息,则更新图片 URL
+        if (storeImg != null) {
+            storeImg.setImgUrl(storeInfo.getImgUrl());
+            int imgUpdateResult = storeImgMapper.updateById(storeImg);
+            if (imgUpdateResult == 0) {
+                log.error("更新店铺图片信息失败,storeInfo: {}", storeInfo);
+                return R.fail("修改失败,更新店铺图片信息失败");
+            }
+        } else {
+            StoreImg storeImg1 = new StoreImg();
+            storeImg1.setStoreId(storeInfo.getId());
+            storeImg1.setImgType(10);
+            storeImg1.setImgUrl(storeInfo.getImgUrl());
+            storeImg1.setImgSort(0);
+            int insert = storeImgMapper.insert(storeImg1);
+            if (insert == 0) {
+                log.error("添加店铺图片信息失败,storeInfo: {}", storeInfo);
+                return R.fail("添加失败,添加店铺图片信息失败");
+            }
+        }
+
+        // 更新店铺信息
+        boolean infoUpdateResult = storeInfoService.updateById(storeInfo);
+        if (!infoUpdateResult) {
+            log.error("更新店铺信息失败,storeInfo: {}", storeInfo);
+            return R.fail("修改失败,更新店铺信息失败");
+        }
+
+        // 所有更新操作成功,返回成功信息
+        return R.success("修改成功");
+
+    }
+
+    /**
+     * web端查询用户列表
+     */
+    @ApiOperation("web端查询用户列表")
+    @ApiOperationSupport(order = 7)
+    @GetMapping("/getStoreUserList")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "pageNum", value = "页数", dataType = "int", paramType = "query", required = true),
+            @ApiImplicitParam(name = "pageSize", value = "页容", dataType = "int", paramType = "query", required = true),
+            @ApiImplicitParam(name = "storeName", value = "门店名称", dataType = "String", paramType = "query"),
+            @ApiImplicitParam(name = "storeContact", value = "门店联系人", dataType = "String", paramType = "query"),
+            @ApiImplicitParam(name = "storePhone", value = "门店电话", dataType = "String", paramType = "query"),
+            @ApiImplicitParam(name = "storeType", value = "门店类型", dataType = "String", paramType = "query")
+    })
+    public R<IPage<StoreUserVo>> getStoreUserList(@RequestParam(defaultValue = "1") int pageNum,
+                                                  @RequestParam(defaultValue = "10") int pageSize,
+                                                  @RequestParam(required = false) String id,
+                                                  @RequestParam(required = false) String phone,
+                                                  @RequestParam(required = false) Integer status) {
+        log.info("StoreInfoController.getStoreUserList?pageNum={},pageSize={},id={},phone={},status={}", pageNum, pageSize, id, phone, status);
+        R<IPage<StoreUserVo>> storeUserVoR = storeUserService.getStoreUserList(pageNum, pageSize, id, phone, status);
+        return storeUserVoR;
+    }
+
+    /**
+     * web端新增商家端用户
+     */
+    @ApiOperation("web端新增商家端用户")
+    @ApiOperationSupport(order = 7)
+    @PostMapping("/addStoreUser")
+    public R<StoreUserVo> addStoreUser(@RequestBody StoreUserVo storeUserVo) {
+        log.info("StoreUserController.addStoreUser?storeUserVo={}", storeUserVo);
+        R<StoreUserVo> storeUserVoR = storeUserService.addStoreUser(storeUserVo);
+        return storeUserVoR;
+    }
+
+    /**
+     * web端编辑商家端用户
+     */
+    @ApiOperation("web端编辑商家端用户")
+    @ApiOperationSupport(order = 7)
+    @PostMapping("/editStoreUser")
+    public R<StoreUserVo> editStoreUser(@RequestBody StoreUser storeUser) {
+        log.info("StoreUserController.editStoreUser?storeUser={}", storeUser);
+        R<StoreUserVo> storeUserVoR = storeUserService.editStoreUser(storeUser);
+        return storeUserVoR;
+    }
+
+    /**
+     * web端重置商家端用户密码
+     */
+    @ApiOperation("web端编辑商家端用户")
+    @ApiOperationSupport(order = 7)
+    @PutMapping("/resetStoreUserPassword")
+    public R<StoreUserVo> resetStoreUserPassword(@RequestBody StoreUser storeUser) {
+        log.info("StoreUserController.resetStoreUserPassword?storeUser={}", storeUser);
+        storeUserService.resetStoreUserPassword(storeUser);
+        return R.success("初始化成功");
+    }
+
+    /**
+     * web端删除商家端用户
+     */
+    @ApiOperation("web端删除商家端用户")
+    @ApiOperationSupport(order = 7)
+    @DeleteMapping("/deleteStoreUser")
+    public R<StoreUserVo> deleteStoreUser(@RequestParam(value = "id") String id) {
+        log.info("StoreUserController.deleteStoreUser?id={}", id);
+        storeUserService.deleteStoreUser(id);
+        return R.success("删除成功");
+    }
+
+    /**
+     * web端切换商家端用户
+     */
+    @ApiOperation("web端切换商家端用户")
+    @ApiOperationSupport(order = 7)
+    @PutMapping("/switchingStates")
+    public R<StoreUserVo> switchingStates(@RequestBody StoreUser storeUser) {
+        log.info("StoreUserController.switchingStates?storeUser={}", storeUser);
+        storeUserService.switchingStates(storeUser);
+        return R.success("切换成功");
+    }
+
+    @ApiOperation(value = "web端导出商家端账号相关信息")
+    @ApiOperationSupport(order = 6)
+    @GetMapping("/exportExcel")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "id", value = "用户id", dataType = "String", paramType = "query"),
+            @ApiImplicitParam(name = "phone", value = "联系电话", dataType = "String", paramType = "query"),
+            @ApiImplicitParam(name = "status", value = "状态", dataType = "String", paramType = "query"),
+    })
+    @ResponseBody
+    public R exportExcel(@RequestParam(value = "id", required = false) String id
+            , @RequestParam(value = "phone", required = false) String phone
+            , @RequestParam(value = "status", required = false) String status) throws IOException {
+        log.info("StoreInfoController.exportExcel");
+        String excelPath = storeUserService.exportExcel(id, phone, status);
+        return R.data(excelPath);
+    }
+
+
+    /**
+     * register
+     *
+     * @param phone
+     * @param password
+     * @return
+     */
+    @ApiOperation("门店用户注册")
+    @ApiOperationSupport(order = 7)
+    @ApiImplicitParams({@ApiImplicitParam(name = "phone", value = "手机号", dataType = "String", paramType = "query", required = true),
+            @ApiImplicitParam(name = "password", value = "密码", dataType = "String", paramType = "query", required = true)})
+    @GetMapping("/register")
+    public R<Boolean> register(String phone, String password) {
+        log.info("StoreUserController.register?phone={}&password={}", phone, password);
+        return storeUserService.register(phone, password);
+    }
+
+
+    /**
+     * register
+     *
+     * @param phone
+     * @return
+     */
+    @ApiOperation("门店用户注册校验")
+    @ApiOperationSupport(order = 8)
+    @ApiImplicitParams({@ApiImplicitParam(name = "phone", value = "手机号", dataType = "String", paramType = "query", required = true)})
+    @GetMapping("/checkRegister")
+    public R<Boolean> checkRegister(String phone) {
+        log.info("StoreUserController.register?phone={}", phone);
+        Boolean res = storeUserService.checkRegister(phone);
+        return R.data(res);
+    }
+
+
+    /**
+     * register
+     *
+     * @param phone
+     * @return
+     */
+    @ApiOperation("门店用户登录校验")
+    @ApiOperationSupport(order = 9)
+    @ApiImplicitParams({@ApiImplicitParam(name = "phone", value = "手机号", dataType = "String", paramType = "query", required = true)})
+    @GetMapping("/checkLogin")
+    public R<Boolean> checkLogin(String phone) {
+        log.info("StoreUserController.checkLogin?phone={}", phone);
+        return storeUserService.checkLogin(phone);
+    }
+
+    /**
+     * 商家端注销用户
+     */
+    @ApiOperation("商家端注销用户")
+    @PostMapping("/storeCancelAccount")
+    public R<StoreUserVo> storeCancelAccount(@RequestBody StoreUserVo storeUserVo) {
+        log.info("StoreUserController.storeCancelAccount?storeUserVo={}", storeUserVo);
+        try {
+            storeUserService.storeCancelAccount(storeUserVo);
+        } catch (Exception e) {
+            return R.fail(e.getMessage());
+        }
+        return R.success("注销成功");
+    }
+
+    /**
+     * 商家端撤销注销用户
+     */
+    @ApiOperation("商家端撤销注销用户")
+    @PostMapping("/storeCancelAccountUn")
+    public R<StoreUserVo> storeCancelAccountUn(@RequestBody StoreUserVo storeUserVo) {
+        log.info("StoreUserController.storeCancelAccountUn?storeUserVo={}", storeUserVo);
+        storeUserService.storeCancelAccountUn(storeUserVo);
+        return R.success("撤回注销成功");
+    }
+}

+ 151 - 0
alien-gateway/src/main/java/shop/alien/gateway/entity/dto/StoreInfoDto.java

@@ -0,0 +1,151 @@
+package shop.alien.gateway.entity.dto;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.fasterxml.jackson.annotation.JsonInclude;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 二期-门店信息
+ *
+ * @author ssk
+ * @since 2024-12-05
+ */
+@Data
+@JsonInclude
+@ApiModel(value = "StoreInfoDto对象", description = "门店信息")
+public class StoreInfoDto {
+
+    @ApiModelProperty(value = "主键")
+    private Integer id;
+
+    @ApiModelProperty(value = "门店名称")
+    private String storeName;
+
+    @ApiModelProperty(value = "联系人姓名")
+    private String storeContact;
+
+    @ApiModelProperty(value = "联系人电话")
+    private String storePhone;
+
+    @ApiModelProperty(value = "联系人密码")
+    private String password;
+
+    @ApiModelProperty(value = "营业状态(0:正常营业, 1:暂停营业, 2:筹建中, 99:永久关门)")
+    private Integer businessStatus;
+
+    @ApiModelProperty(value = "门店电话")
+    private String storeTel;
+
+    @ApiModelProperty(value = "容纳人数")
+    private Integer storeCapacity;
+
+    @ApiModelProperty(value = "门店面积(1:小于20平米, 2:20~50平米, 3:50~100平米, 4:100~300平米, 5:500~1000平米, 6:大于1000平米)")
+    private Integer storeArea;
+
+    @ApiModelProperty(value = "门店地址")
+    private String storeAddress;
+
+    @ApiModelProperty(value = "删除标记, 0:未删除, 1:已删除")
+    private Integer deleteFlag;
+
+    @ApiModelProperty(value = "创建时间")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date createdTime;
+
+    @ApiModelProperty(value = "创建人ID")
+    @TableField("created_user_id")
+    private Integer createdUserId;
+
+    @ApiModelProperty(value = "修改时间")
+    @JsonFormat(pattern = "yyyy-MM-dd h:m:s a", timezone = "GMT+8")
+    private Date updatedTime;
+
+    @ApiModelProperty(value = "修改人ID")
+    private Integer updatedUserId;
+
+    @ApiModelProperty(value = "门店简介")
+    private String storeBlurb;
+
+    @ApiModelProperty(value = "门店类型(1:中餐, 2:烧烤, 3:饮品, 4:甜点, 5:火锅, 6:宵夜, 7:西餐, 8:轻食, 9:水果)")
+    private List<String> storeTypeList;
+
+    @ApiModelProperty(value = "是否连锁, 0:否, 1:是")
+    private Integer isChain;
+
+    @ApiModelProperty(value = "门店状态")
+    private Integer storeStatus;
+
+    @ApiModelProperty(value = "到期时间")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date expirationTime;
+
+    @ApiModelProperty(value = "门店坐标")
+    private String storePosition;
+
+    @ApiModelProperty(value = "门店坐标经度")
+    private String storePositionLongitude;
+
+    @ApiModelProperty(value = "门店坐标纬度")
+    private String storePositionLatitude;
+
+    @ApiModelProperty(value = "门店密码")
+    private String storePass;
+
+    @ApiModelProperty(value = "身份证")
+    private String idCard;
+
+    @ApiModelProperty(value = "经营板块名字")
+    private String businessSectionName;
+
+    @ApiModelProperty(value = "经营类型英文值")
+    private String businessTypeValue;
+
+    @ApiModelProperty(value = "经营种类集合")
+    private List<String> businessTypesList;
+
+    @ApiModelProperty(value = "经营板块id(词典表 键为 business_section)")
+    private Integer businessSection;
+
+    @ApiModelProperty(value = "经营种类ids")
+    private List<String> businessTypes;
+
+    @ApiModelProperty(value = "经营种类名称s")
+    private String businessTypesName;
+
+    @ApiModelProperty(value = "用户账号")
+    private String userAccount;
+
+    @ApiModelProperty(value = "营业执照图片地址")
+    private List<String> businessLicenseAddress;
+
+    @ApiModelProperty(value = "合同图片地址")
+    private List<String> contractImageList;
+
+    @ApiModelProperty(value = "查询经纬度时查询地点存储")
+    private String queryAddress;
+
+    @ApiModelProperty(value = "行政区域省名称")
+    private String administrativeRegionProvinceName;
+
+    @ApiModelProperty(value = "行政区域省adcode")
+    private String administrativeRegionProvinceAdcode;
+
+    @ApiModelProperty(value = "行政区域市名称")
+    private String administrativeRegionCityName;
+
+    @ApiModelProperty(value = "行政区域市adcode")
+    private String administrativeRegionCityAdcode;
+
+    @ApiModelProperty(value = "行政区域区名称")
+    private String administrativeRegionDistrictName;
+
+    @ApiModelProperty(value = "行政区域区adcode")
+    private String administrativeRegionDistrictAdcode;
+
+}

+ 574 - 0
alien-gateway/src/main/java/shop/alien/gateway/entity/vo/LifeCouponVo.java

@@ -0,0 +1,574 @@
+package shop.alien.gateway.entity.vo;
+
+import com.baomidou.mybatisplus.annotation.*;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.fasterxml.jackson.annotation.JsonInclude;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+import shop.alien.entity.store.LifeCoupon;
+import shop.alien.entity.store.StoreGroupInfo;
+
+import java.util.Date;
+import java.util.List;
+
+@Data
+@EqualsAndHashCode(callSuper = false)
+@JsonInclude
+@NoArgsConstructor
+@ApiModel(value = "LifeCouponVo对象", description = "套餐")
+public class LifeCouponVo extends LifeCoupon {
+
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private String id;
+
+    @ApiModelProperty(value = "券id")
+    @TableField("coupon_code")
+    private String couponCode;
+
+    @ApiModelProperty(value = "券名称")
+    private String name;
+
+    @ApiModelProperty(value = "商家id")
+    private String storeId;
+
+    @ApiModelProperty(value = "价格")
+    private String price;
+
+    @ApiModelProperty(value = "折扣价")
+    private String offprice;
+
+    @ApiModelProperty(value = "有效期")
+    private Integer expirationDate;
+
+    @ApiModelProperty(value = "开始日期")
+    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
+    private Date startDate;
+
+    @ApiModelProperty(value = "结束日期")
+    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
+    private Date endDate;
+
+    @ApiModelProperty(value = "不可用时间")
+    private String unusedDate;
+
+    @ApiModelProperty(value = "优惠券数量")
+    private Integer singleQty;
+
+    @ApiModelProperty(value = "限制购买数")
+    private Integer buyLimit;
+
+    @ApiModelProperty(value = "票数量")
+    private Integer stockQty;
+
+    @ApiModelProperty(value = "使用规则")
+    private String useRule;
+
+    @ApiModelProperty(value = "可用人数(最低)")
+    private String minUsePeoples;
+
+    @ApiModelProperty(value = "可用人数(最多)")
+    private String maxUsePeoples;
+
+    @ApiModelProperty(value = "饮食偏好(字典--DietaryPreferences)")
+    private String dietaryPreferences;
+
+    @ApiModelProperty(value = "烹饪方式(字典--CookingMethods)")
+    private String cookingMethods;
+
+    @ApiModelProperty(value = "受用场景")
+    private String applicableRule;
+
+    @ApiModelProperty(value = "状态:-1.待审核  -2.已驳回  0.待使用(已通过), 1.进行中, 2.已暂停, 3.已结束")
+    private Integer status;
+
+    @ApiModelProperty(value = "券图片地址")
+    private String imagePath;
+
+    @ApiModelProperty(value = "商家服务")
+    private String storeService;
+
+    @ApiModelProperty(value = "发票信息")
+    private String fapiaoInfo;
+
+    @ApiModelProperty(value = "类型   1-代金券  2-团购(套餐)")
+    private Integer type;
+
+    @ApiModelProperty(value = "审批评论")
+    private String approvalComments;
+
+    @ApiModelProperty(value = "是否开启保价(1-开启 0-未开启)")
+    private Integer openPriceProtection;
+
+    @ApiModelProperty(value = "价格低于某值")
+    private Integer priceBelow;
+
+    @ApiModelProperty(value = "补偿优惠券面额")
+    private String couponComp;
+
+    @ApiModelProperty(value = "补偿优惠券有效期")
+    private Integer couponCompDate;
+
+    @ApiModelProperty(value = "打分")
+    private Integer rateScore;
+
+    @ApiModelProperty(value = "优惠tag")
+    private String discountTag;
+
+    @TableField(exist = false)
+    private List<String> tempDiscountTag;
+
+    @ApiModelProperty(value = "优惠tag名称")
+    private String discountTagName;
+
+    @ApiModelProperty(value = "删除标记, 0:未删除, 1:已删除")
+    @TableField("delete_flag")
+    @TableLogic
+    private Integer deleteFlag;
+
+    private Integer statusDeleteFlag;
+
+    @ApiModelProperty(value = "创建时间")
+    @TableField(value = "created_time", fill = FieldFill.INSERT)
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date createdTime;
+
+    @ApiModelProperty(value = "创建人ID")
+    @TableField("created_user_id")
+    private Integer createdUserId;
+
+    @ApiModelProperty(value = "修改时间")
+    @TableField(value = "updated_time", fill = FieldFill.UPDATE)
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date updatedTime;
+
+    @ApiModelProperty(value = "修改人ID")
+    @TableField("updated_user_id")
+    private Integer updatedUserId;
+
+    @ApiModelProperty(value = "商家类型")
+    @TableField("store_type")
+    private String storeType;
+
+    @ApiModelProperty(value = "开始售卖时间类型")
+    @TableField("sale_time_str_type")
+    private String saleTimeStrType;
+
+    @ApiModelProperty(value = "结束售卖时间类型")
+    @TableField("sale_time_end_type")
+    private String saleTimeEndType;
+
+    @ApiModelProperty(value = "每人限购CODE")
+    @TableField("purchase_limit_code")
+    private String purchaseLimitCode;
+
+    @ApiModelProperty(value = "原价")
+    @TableField("original_price")
+    private String originalPrice;
+
+    @ApiModelProperty(value = "优惠价")
+    @TableField("discounted_price")
+    private String discountedPrice;
+
+    @ApiModelProperty(value = "经营种类")
+    @TableField("business_types")
+    private String businessTypes;
+
+    @ApiModelProperty(value = "住房类型")
+    @TableField("housing_type")
+    private String housingType;
+
+    @ApiModelProperty(value = "房间类型")
+    @TableField("room_type")
+    private String roomType;
+
+    @ApiModelProperty(value = "房间类型code")
+    @TableField("room_type_code")
+    private String roomTypeCode;
+
+    @ApiModelProperty(value = "厨房(详情里面)")
+    @TableField("kitchen_xq")
+    private String kitchenXq;
+
+    @ApiModelProperty(value = "卫生间(详情里面)")
+    @TableField("bathroom_xq")
+    private String bathroomXq;
+
+    @ApiModelProperty(value = "客厅")
+    @TableField("living_room")
+    private String livingRoom;
+
+    @ApiModelProperty(value = "房源位置")
+    @TableField("location_of_the_property")
+    private String locationOfTheProperty;
+
+    @ApiModelProperty(value = "总面积")
+    @TableField("total_area")
+    private String totalArea;
+
+    @ApiModelProperty(value = "娱乐设施code")
+    @TableField("entertainment_facilities_code")
+    private String entertainmentFacilitiesCode;
+
+    @ApiModelProperty(value = "娱乐设施")
+    @TableField("entertainment_facilities")
+    private String entertainmentFacilities;
+
+    @ApiModelProperty(value = "便利设施code")
+    @TableField("convenience_facilities_code")
+    private String convenienceFacilitiesCode;
+
+    @ApiModelProperty(value = "便利设施")
+    @TableField("convenience_facilities")
+    private String convenienceFacilities;
+
+    @ApiModelProperty(value = "浴室配套code")
+    @TableField("bathroom_facilities_code")
+    private String bathroomFacilitiesCode;
+
+    @ApiModelProperty(value = "浴室配套")
+    @TableField("bathroom_facilities")
+    private String bathroomFacilities;
+
+    @ApiModelProperty(value = "洗漱用品code")
+    @TableField("bath_products_code")
+    private String bathProductsCode;
+
+    @ApiModelProperty(value = "洗浴用品")
+    @TableField("bath_products")
+    private String bathProducts;
+
+    @ApiModelProperty(value = "服务code")
+    @TableField("service_code")
+    private String serviceCode;
+
+    @ApiModelProperty(value = "服务")
+    @TableField("service")
+    private String service;
+
+    @ApiModelProperty(value = "安全code")
+    @TableField("safety_code")
+    private String safetyCode;
+
+    @ApiModelProperty(value = "安全")
+    @TableField("safety")
+    private String safety;
+
+    @ApiModelProperty(value = "预订须知")
+    @TableField("reservation_instructions")
+    private String reservationInstructions;
+
+    @ApiModelProperty(value = "开始时间")
+    @TableField("in_time")
+    private String inTime;
+
+    @ApiModelProperty(value = "结束时间")
+    @TableField("out_time")
+    private String outTime;
+
+    @ApiModelProperty(value = "是否需要押金")
+    @TableField("deposit_flag")
+    private String depositFlag;
+
+    @ApiModelProperty(value = "押金金额")
+    @TableField("deposit_amount")
+    private String depositAmount;
+
+    @ApiModelProperty(value = "是否可以携带儿童")
+    @TableField("children_flag")
+    private String childrenFlag;
+
+    @ApiModelProperty(value = "携带儿童说明")
+    @TableField("children_description")
+    private String childrenDescription;
+
+    @ApiModelProperty(value = "是否可以携带宠物")
+    @TableField("pet_flag")
+    private String petFlag;
+
+    @ApiModelProperty(value = "是否允许加床")
+    @TableField("extra_bed_flag")
+    private String extraBedFlag;
+
+    @ApiModelProperty(value = "床单价")
+    @TableField("bed_price")
+    private String bedPrice;
+
+    @ApiModelProperty(value = "发票信息")
+    @TableField("invoice_info")
+    private String invoiceInfo;
+
+    @ApiModelProperty(value = "发票说明")
+    @TableField("invoice_instructions")
+    private String invoiceInstructions;
+
+    @ApiModelProperty(value = "取消政策类型")
+    @TableField("cancellation_policy_type")
+    private String cancellationPolicyType;
+
+    @ApiModelProperty(value = "取消政策")
+    @TableField("cancellation_policy")
+    private String cancellationPolicy;
+
+    @ApiModelProperty(value = "取消说明")
+    @TableField("Cancellation_instructions")
+    private String cancellationInstructions;
+
+    @ApiModelProperty(value = "是否保价")
+    @TableField("insured_price")
+    private String insuredPrice;
+
+    @ApiModelProperty(value = "有效期类型")
+    @TableField("validity_period_type")
+    private String validityPeriodType;
+
+    @ApiModelProperty(value = "包厢类型code")
+    @TableField("box_type_code")
+    private String boxTypeCode;
+
+    @ApiModelProperty(value = "包箱类型")
+    @TableField("box_type")
+    private String boxType;
+
+    @ApiModelProperty(value = "饮食小吃code")
+    @TableField("snacks_code")
+    private String snacksCode;
+
+    @ApiModelProperty(value = "饮品小食")
+    @TableField("snacks")
+    private String snacks;
+
+    @ApiModelProperty(value = "可用时长")
+    @TableField("available_duration")
+    private String availableDuration;
+
+    @ApiModelProperty(value = "核销方式类型")
+    @TableField("write_off_type")
+    private String writeOffType;
+
+    @ApiModelProperty(value = "核销方式")
+    @TableField("write_off")
+    private String writeOff;
+
+    @ApiModelProperty(value = "退款规则类型")
+    @TableField("refund_rules_type")
+    private String refundRulesType;
+
+    @ApiModelProperty(value = "退款规则")
+    @TableField("refund_rules")
+    private String refundRules;
+
+    @ApiModelProperty(value = "退款说明")
+    @TableField("refund_instructions")
+    private String refundInstructions;
+
+    @ApiModelProperty(value = "修改规则code")
+    @TableField("edit_rules_code")
+    private String editRulesCode;
+
+    @ApiModelProperty(value = "修改规则")
+    @TableField("edit_rules")
+    private String editRules;
+
+    @ApiModelProperty(value = "修改说明")
+    @TableField("edit_instructions")
+    private String editInstructions;
+
+    @ApiModelProperty(value = "汤池code")
+    @TableField("tangchi_code")
+    private String tangchiCode;
+
+    @ApiModelProperty(value = "汤池")
+    @TableField("tangchi")
+    private String tangchi;
+
+    @ApiModelProperty(value = "汗蒸code")
+    @TableField("sweat_sauna_code")
+    private String sweatSaunaCode;
+
+    @ApiModelProperty(value = "汗蒸")
+    @TableField("sweat_sauna")
+    private String sweatSauna;
+
+    @ApiModelProperty(value = "图文详情")
+    @TableField("pictures_and_text")
+    private String picturesAndText;
+
+    @ApiModelProperty(value = "补充说明")
+    @TableField("supplement")
+    private String supplement;
+
+    @ApiModelProperty(value = "不可用时期类型")
+    @TableField("unavailable_date_type")
+    private String unavailableDateType;
+
+    @ApiModelProperty(value = "预约规则")
+    @TableField("reservation_rules")
+    private String reservationRules;
+
+    @ApiModelProperty(value = "适用人数")
+    @TableField("applicable_num")
+    private String applicableNum;
+
+    @ApiModelProperty(value = "其他规则")
+    @TableField("other_rules")
+    private String otherRules;
+
+    @ApiModelProperty(value = "售卖类型")
+    @TableField("sales_type")
+    private String salesType;
+
+    @ApiModelProperty(value = "按摩手法code")
+    @TableField("massage_technique_code")
+    private String massageTechniqueCode;
+
+    @ApiModelProperty(value = "按摩手法")
+    @TableField("massage_technique")
+    private String massageTechnique;
+
+    @ApiModelProperty(value = "按摩部位code")
+    @TableField("massage_area_code")
+    private String massageAreaCode;
+
+    @ApiModelProperty(value = "按摩部位")
+    @TableField("massage_area")
+    private String massageArea;
+
+    @ApiModelProperty(value = "按摩工具code")
+    @TableField("massage_tools_code")
+    private String massageToolsCode;
+
+    @ApiModelProperty(value = "按摩工具")
+    @TableField("massage_tools")
+    private String massageTools;
+
+    @ApiModelProperty(value = "热敷工具code")
+    @TableField("compress_tools_code")
+    private String compressToolsCode;
+
+    @ApiModelProperty(value = "热敷工具")
+    @TableField("compress_tools")
+    private String compressTools;
+
+    @ApiModelProperty(value = "上课形式code")
+    @TableField("class_format_code")
+    private String classFormatCode;
+
+    @ApiModelProperty(value = "上课形式")
+    @TableField("class_format")
+    private String classFormat;
+
+    @ApiModelProperty(value = "课程时长code")
+    @TableField("class_duration_code")
+    private String classDurationCode;
+
+    @ApiModelProperty(value = "课程时长")
+    @TableField("class_duration")
+    private String classDuration;
+
+    @ApiModelProperty(value = "课时数code")
+    @TableField("class_num_code")
+    private String classNumCode;
+
+    @ApiModelProperty(value = "课时数")
+    @TableField("class_num")
+    private String classNum;
+
+    @ApiModelProperty(value = "适用部位code")
+    @TableField("applicable_parts_code")
+    private String applicablePartsCode;
+
+    @ApiModelProperty(value = "适用部位")
+    @TableField("applicable_parts")
+    private String applicableParts;
+
+    @ApiModelProperty(value = "卫生code")
+    @TableField("hygiene_code")
+    private String hygieneCode;
+
+    @ApiModelProperty(value = "卫生")
+    @TableField("hygiene")
+    private String hygiene;
+
+    @ApiModelProperty(value = "基础code")
+    @TableField("foundation_code")
+    private String foundationCode;
+
+    @ApiModelProperty(value = "基础")
+    @TableField("foundation")
+    private String foundation;
+
+    @ApiModelProperty(value = "卫浴code")
+    @TableField("bathroom_code")
+    private String bathroomCode;
+
+    @ApiModelProperty(value = "卫浴")
+    @TableField("bathroom")
+    private String bathroom;
+
+    @ApiModelProperty(value = "厨房code")
+    @TableField("kitchen_code")
+    private String kitchenCode;
+
+    @ApiModelProperty(value = "厨房")
+    @TableField("kitchen")
+    private String kitchen;
+
+    @ApiModelProperty(value = "优惠券有效期类型")
+    @TableField("validity_period_yh_type")
+    private String validityPeriodYhType;
+
+    @ApiModelProperty(value = "课程有效期code")
+    @TableField("course_validity_period_code")
+    private String courseValidityPeriodCode;
+
+    @ApiModelProperty(value = "课程有效期")
+    @TableField("course_validity_period")
+    private String courseValidityPeriod;
+
+    @ApiModelProperty(value = "图片")
+    @TableField("uploaded_picList")
+    private String uploadedPiclist;
+
+    @ApiModelProperty(value = "有效期时间段")
+    @TableField("validity_period")
+    private String validityPeriod;
+
+    @ApiModelProperty(value = "商家名称")
+    private String storeName;
+
+    @ApiModelProperty(value = "商家手机号")
+    private String phone;
+
+    @ApiModelProperty(value = "状态")
+    private String statusName;
+
+    @ApiModelProperty(value = "商家地址")
+    private String storeAddress;
+
+    @ApiModelProperty(value = "电话")
+    private String phoneId;
+
+    @ApiModelProperty(value = "是否关注我")
+    private String isFollowMe;
+
+    @ApiModelProperty(value = "接收人id('store_' 或 'user_' + 手机号)")
+    private String receiverId;
+
+    private String expiredState;
+
+    private String couponName;
+
+    private String couponState;
+
+    private String couponTime;
+
+    private String daysToExpire;
+
+    private String imgs;
+    @ApiModelProperty(value = "团购子表")
+    private List<StoreGroupInfo> storeGroupInfos;
+}

+ 53 - 0
alien-gateway/src/main/java/shop/alien/gateway/entity/vo/LifeFansVo.java

@@ -0,0 +1,53 @@
+package shop.alien.gateway.entity.vo;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@Data
+@JsonInclude
+@NoArgsConstructor
+@ApiModel(value = "LifeFansVo对象", description = "关注相关")
+public class LifeFansVo {
+
+    @ApiModelProperty(value = "用户id")
+    public String id;
+
+    @ApiModelProperty(value = "名称")
+    public String name;
+
+    @ApiModelProperty(value = "简介")
+    public String blurb;
+
+    @ApiModelProperty(value = "头像")
+    public String image;
+
+    @ApiModelProperty(value = "唯一标识")
+    public String phoneId;
+
+    @ApiModelProperty(value = "对方是否关注我 0-未关注 1-已关注")
+    public String isFollowMe;
+
+    @ApiModelProperty(value = "我是否关注对方 0-未关注 1-已关注")
+    public String isFollowThis;
+
+    @ApiModelProperty(value = "粉丝数量")
+    public String fansNum;
+
+    @ApiModelProperty(value = "关注数量")
+    public String followNum;
+
+    @ApiModelProperty(value = "好友数量")
+    public String friendNum;
+
+    @ApiModelProperty(value = "动态数量")
+    public String dynamicsNum;
+
+    @ApiModelProperty(value = "是否拉黑")
+    public String isBlocked;
+
+    @ApiModelProperty(value = "拉黑id")
+    public String blackListid;
+}

+ 46 - 0
alien-gateway/src/main/java/shop/alien/gateway/entity/vo/LifeUserDynamicsVo.java

@@ -0,0 +1,46 @@
+package shop.alien.gateway.entity.vo;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import shop.alien.entity.store.LifeUserDynamics;
+
+@Data
+@JsonInclude
+@NoArgsConstructor
+@ApiModel(value = "LifeUserDynamicsVo对象", description = "动态列表")
+public class LifeUserDynamicsVo extends LifeUserDynamics {
+
+    @ApiModelProperty(value = "商家或用户id")
+    private String storeUserId;
+
+    @ApiModelProperty(value = "名称")
+    private String userName;
+
+    @ApiModelProperty(value = "头像")
+    private String userImage;
+
+    @ApiModelProperty(value = "对方是否关注我 0-未关注 1-已关注")
+    private String isFollowMe;
+
+    @ApiModelProperty(value = "我是否关注对方 0-未关注 1-已关注")
+    private String isFollowThis;
+
+    @ApiModelProperty(value = "0-未点赞 1-已点赞")
+    private String isLike;
+
+    @ApiModelProperty(value = "评论数量")
+    private long commentCount;
+
+    @ApiModelProperty(value = "商家或用户id")
+    private String storeOrUserId;
+
+    @ApiModelProperty(value = "图片")
+    private String imagePath;
+
+    @ApiModelProperty(value = "内容")
+    private String context;
+
+}

+ 82 - 0
alien-gateway/src/main/java/shop/alien/gateway/entity/vo/LifeUserOrderVo.java

@@ -0,0 +1,82 @@
+package shop.alien.gateway.entity.vo;
+
+import com.baomidou.mybatisplus.annotation.*;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.fasterxml.jackson.annotation.JsonInclude;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * 用户订单
+ */
+@Data
+@JsonInclude
+public class LifeUserOrderVo {
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private String id;
+
+    private String userId;
+
+    private String storeId;
+
+    private String quanId;
+
+    private String quanCode;
+
+    private String orderNo;
+
+    private Integer status;
+
+    private Integer purchaseQuantity;
+
+    private Integer couponId;
+
+    private String userPhone;
+
+    private String type;
+
+    private BigDecimal totalFinalPrice;
+
+    private String couponName;
+
+    private String price;
+
+    private String finalPrice;
+
+    private Date buyTime;
+
+    private Date payTime;
+
+    private String payMethod;
+
+    private Date usedTime;
+
+    private Date refundTime;
+
+    @ApiModelProperty(value = "删除标记, 0:未删除, 1:已删除")
+    @TableField("delete_flag")
+    @TableLogic
+    private Integer deleteFlag;
+
+    @ApiModelProperty(value = "创建时间")
+    @TableField(value = "created_time", fill = FieldFill.INSERT)
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date createdTime;
+
+    @ApiModelProperty(value = "创建人ID")
+    @TableField("created_user_id")
+    private Integer createdUserId;
+
+    @ApiModelProperty(value = "修改时间")
+    @TableField(value = "updated_time", fill = FieldFill.UPDATE)
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date updatedTime;
+
+    @ApiModelProperty(value = "修改人ID")
+    @TableField("updated_user_id")
+    private Integer updatedUserId;
+}

+ 41 - 0
alien-gateway/src/main/java/shop/alien/gateway/entity/vo/ScreeningOfEightMajorCategoriesVO.java

@@ -0,0 +1,41 @@
+package shop.alien.gateway.entity.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@Data
+public class ScreeningOfEightMajorCategoriesVO {
+
+    @ApiModelProperty(value = "筛选ID,多个ID用逗号分隔")
+    private String screeningId;
+
+    @ApiModelProperty(value = "经度")
+    private Double lon;
+
+    @ApiModelProperty(value = "纬度")
+    private Double lat;
+
+    @ApiModelProperty(value = "距离范围")
+    private Double distance;
+
+    @ApiModelProperty(value = "是否启用距离筛选")
+    private Boolean flag;
+
+    @ApiModelProperty(value = "营业时间自定义开始")
+    private String startTime;
+
+    @ApiModelProperty(value = "营业时间自定义结束")
+    private String endTime;
+
+    @ApiModelProperty(value = "价格开始")
+    private Double priceStr;
+
+    @ApiModelProperty(value = "价格结束")
+    private Double priceEnd;
+
+    @ApiModelProperty(value = "页码")
+    private Integer pageNum;
+
+    @ApiModelProperty(value = "页容")
+    private Integer pageSize;
+}

+ 64 - 0
alien-gateway/src/main/java/shop/alien/gateway/entity/vo/StoreDictionaryVo.java

@@ -0,0 +1,64 @@
+package shop.alien.gateway.entity.vo;
+
+import com.baomidou.mybatisplus.extension.activerecord.Model;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * <p>
+ * 门店字典表 新
+ * </p>
+ *
+ * @author ssk
+ * @since 2024-12-26
+ */
+@Data
+@ApiModel(value = "StoreDictionary对象", description = "门店字典表 新")
+public class StoreDictionaryVo extends Model<StoreDictionaryVo> {
+
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty(value = "主键")
+    private Integer id;
+
+    @ApiModelProperty(value = "类型名称")
+    private String typeName;
+
+    @ApiModelProperty(value = "类型描述")
+    private String typeDetail;
+
+    @ApiModelProperty(value = "字典值id")
+    private String dictId;
+
+    @ApiModelProperty(value = "字典描述")
+    private String dictDetail;
+
+    @ApiModelProperty(value = "删除标记, 0:未删除, 1:已删除")
+    private Integer deleteFlag;
+
+    @ApiModelProperty(value = "创建时间")
+    private Date createdTime;
+
+    @ApiModelProperty(value = "创建人ID")
+    private Integer createdUserId;
+
+    @ApiModelProperty(value = "修改时间")
+    private Date updatedTime;
+
+    @ApiModelProperty(value = "修改人ID")
+    private Integer updatedUserId;
+
+    @ApiModelProperty(value = "子词典数据集")
+    private List<StoreDictionaryVo> subDataList;
+
+    @Override
+    protected Serializable pkVal() {
+        return this.id;
+    }
+
+}

+ 31 - 0
alien-gateway/src/main/java/shop/alien/gateway/entity/vo/StoreImgTypeVo.java

@@ -0,0 +1,31 @@
+package shop.alien.gateway.entity.vo;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * 图片类型
+ *
+ * @author ssk
+ * @version 1.0
+ * @date 2025/1/15 9:30
+ */
+@Data
+@JsonInclude
+public class StoreImgTypeVo {
+
+    @ApiModelProperty(value = "0:其他, 1:入口图, 2:相册, 3:菜品, 4:环境, 5:价目表, 6:推荐菜, 7:菜单, 8:用户评论, 9:商家申诉,10:商家头像,11:店铺轮播图,12:联名卡图片,13:动态折扣, 14:套餐图片")
+    private Integer imgType;
+
+    @ApiModelProperty(value = "图片类型字符串")
+    private String imgTypeStr;
+
+    @ApiModelProperty(value = "数量")
+    private Integer count;
+
+    @ApiModelProperty(value = "图片地址")
+    private String imgUrl;
+
+
+}

+ 164 - 0
alien-gateway/src/main/java/shop/alien/gateway/entity/vo/StoreInfoVo.java

@@ -0,0 +1,164 @@
+package shop.alien.gateway.entity.vo;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+import shop.alien.entity.store.LifeCoupon;
+import shop.alien.entity.store.StoreInfo;
+import shop.alien.entity.store.StoreStaffConfig;
+
+import java.util.List;
+
+@EqualsAndHashCode(callSuper = true)
+@Data
+@JsonInclude
+@NoArgsConstructor
+@ApiModel(value = "StoreInfoVo对象", description = "商家信息")
+public class StoreInfoVo extends StoreInfo {
+
+    @ApiModelProperty(value = "主键")
+    private Integer id;
+
+    @ApiModelProperty(value = "商户ID")
+    private Integer storeId;
+
+    @ApiModelProperty(value = "商家名称")
+    private String storeName;
+
+    @ApiModelProperty(value = "商家头像")
+    private String imgUrl;
+
+    @ApiModelProperty(value = "商家入口图")
+    private String entranceImage;
+
+    @ApiModelProperty(value = "联系人")
+    private String storeContact;
+
+    @ApiModelProperty(value = "联系人电话")
+    private String storePhone;
+
+    @ApiModelProperty(value = "联系人身份证号")
+    private String idCard;
+
+    @ApiModelProperty(value = "密码")
+    private String password;
+
+    @ApiModelProperty(value = "门店状态字符串")
+    private String storeStatusStr;
+
+    @ApiModelProperty(value = "营业状态字符串")
+    private String businessStatusStr;
+
+    @ApiModelProperty(value = "门店状态字符串")
+    private String storeTypeStr;
+
+    @ApiModelProperty(value = "商家评分")
+    private double score;
+
+    @ApiModelProperty(value = "是否连锁, 0:否, 1:是")
+    private Integer isChain;
+
+    @ApiModelProperty(value = "门店类型(1:中餐, 2:烧烤, 3:饮品, 4:甜点, 5:火锅, 6:宵夜, 7:西餐, 8:轻食, 9:水果)")
+    private List<String> storeTypeList;
+
+    @ApiModelProperty(value = "门店坐标经度")
+    private String storePositionLongitude;
+
+    @ApiModelProperty(value = "门店坐标纬度")
+    private String storePositionLatitude;
+
+    @ApiModelProperty(value = "token")
+    private String token;
+
+    private double distance;
+
+    private String dishName;
+
+    @ApiModelProperty(value = "门店简介")
+    private String storeBlurb;
+
+    @ApiModelProperty(value = "门店过期状态(0:已到期,1:未到期)")
+    private String expiredState;
+
+    @ApiModelProperty(value = "经营板块id(词典表 键为 business_section)")
+    private Integer businessSection;
+
+    @ApiModelProperty(value = "用户账号")
+    private String userAccount;
+
+    @ApiModelProperty(value = "经营种类集合")
+    private List<String> businessTypesList;
+
+    @ApiModelProperty(value = "营业执照图片地址")
+    private List<String> businessLicenseAddress;
+
+    @ApiModelProperty(value = "营业执照图片地址")
+    private List<String> contractImageList;
+
+    @ApiModelProperty(value = "过期天数")
+    private Long daysToExpire;
+
+    @ApiModelProperty(value = "前端查询集合Label")
+    private String Label;
+
+    @ApiModelProperty(value = "前端查询集合Value")
+    private Integer value;
+
+    @ApiModelProperty(value = "营业状态, 见字典表 businessStatus")
+    private Integer businessStatus;
+
+    @ApiModelProperty(value = "平均得分")
+    private String avgScore;
+
+    @ApiModelProperty(value = "人均消费")
+    private String avgPrice;
+
+    @ApiModelProperty(value = "总评论数")
+    private String totalNum;
+
+    @ApiModelProperty(value = "优惠券列表")
+    private List quanList;
+
+    @ApiModelProperty(value = "营业时间")
+    private List<String> openTime;
+
+    @ApiModelProperty(value = "最近地铁站名")
+    private String subwayName;
+
+    @ApiModelProperty(value = "最近地铁站距离")
+    private double distance2;
+
+    @ApiModelProperty(value = "是否收藏")
+    private Integer collection;
+
+    @ApiModelProperty(value = "优惠券列表")
+    private List<LifeCoupon> couponList;
+
+    @ApiModelProperty(value = "优惠券列表")
+    private List<LifeCouponVo> tuangouList;
+
+    @ApiModelProperty(value = "员工列表")
+    private List<StoreStaffConfig> employeeList;
+
+    @ApiModelProperty(value = "该用户是否在该店铺打过卡")
+    private Integer clockInStore;
+
+    @ApiModelProperty(value = "该用户是否在该店铺打过卡")
+    private Integer clockInStoreToday;
+
+    @ApiModelProperty(value = "该用户在该店铺打卡次数")
+    private Integer clockInStoreNum;
+
+    @ApiModelProperty(value = "该用户打卡的所有哦店铺次数")
+    private Integer clockInNum;
+
+    @ApiModelProperty(value = "该用户在该店铺的动态")
+    private List<LifeUserDynamicsVo> dynamicsList;
+
+    @ApiModelProperty(value = "该用户在该店铺的动态总数")
+    private Integer totalDynamicsNum;
+
+}

+ 60 - 0
alien-gateway/src/main/java/shop/alien/gateway/entity/vo/StoreMainInfoVo.java

@@ -0,0 +1,60 @@
+package shop.alien.gateway.entity.vo;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import shop.alien.entity.store.StoreBusinessInfo;
+import shop.alien.entity.store.StoreInfo;
+import shop.alien.entity.store.StoreLabel;
+
+import java.util.List;
+
+/**
+ * 门店主页信息
+ *
+ * @author ssk
+ * @version 1.0
+ * @date 2024/12/23 17:17
+ */
+@Data
+@JsonInclude
+public class StoreMainInfoVo extends StoreInfo {
+
+    @ApiModelProperty(value = "营业状态")
+    private String businessStatusStr;
+
+    @ApiModelProperty(value = "门店面积")
+    private String storeAreaStr;
+
+    //图片类型, 0:其他, 1:入口图, 2:相册, 3:菜品, 4:环境, 5:价目表, 6:推荐菜, 7:菜单
+
+    @ApiModelProperty(value = "入口图")
+    List<String> inletsUrl;
+
+    @ApiModelProperty(value = "相册")
+    List<String> albumUrl;
+
+    @ApiModelProperty(value = "推荐菜")
+    List<StoreMenuVo> recommendUrl;
+
+    @ApiModelProperty(value = "菜单")
+    List<StoreMenuVo> menuUrl;
+
+    @ApiModelProperty(value = "门店标签")
+    StoreLabel storeLabel;
+
+    @ApiModelProperty(value = "营业时间")
+    List<StoreBusinessInfo> storeBusinessInfo;
+
+    @ApiModelProperty(value = "门店头像")
+    String headImgUrl;
+
+    @ApiModelProperty(value = "门店地址")
+    String storeAddress;
+
+    @ApiModelProperty(value = "注销状态")
+    private Integer logoutFlag;
+
+    @ApiModelProperty(value = "注销状态用户")
+    private Integer logoutFlagUser;
+}

+ 29 - 0
alien-gateway/src/main/java/shop/alien/gateway/entity/vo/StoreMenuVo.java

@@ -0,0 +1,29 @@
+package shop.alien.gateway.entity.vo;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import shop.alien.entity.store.StoreMenu;
+
+/**
+ * @author ssk
+ * @version 1.0
+ * @date 2025/1/8 10:20
+ */
+@Data
+@JsonInclude
+public class StoreMenuVo extends StoreMenu {
+
+    @ApiModelProperty(value = "图片排序")
+    private Integer imgSort;
+
+    @ApiModelProperty(value = "图片链接")
+    private String imgUrl;
+
+    @ApiModelProperty(value = "图片描述")
+    private String imgDescription;
+
+    @ApiModelProperty(value = "是否点赞")
+    private Integer isLike;
+
+}

+ 36 - 0
alien-gateway/src/main/java/shop/alien/gateway/entity/vo/StoreUserExcelVo.java

@@ -0,0 +1,36 @@
+package shop.alien.gateway.entity.vo;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * @author YinDP
+ * @since 2025-4-2
+ */
+@Data
+@JsonInclude
+@ApiModel(value = "StoreUser表Excel导出对象", description = "商家端账号信息")
+public class StoreUserExcelVo {
+
+    @ExcelHeader("序号")
+    @ApiModelProperty(value = "序号")
+    private Integer serialNumber;
+
+    @ApiModelProperty(value = "主键")
+    @ExcelHeader(value = "账号ID")
+    private Integer id;
+
+    @ApiModelProperty(value = "手机号码")
+    @ExcelHeader(value = "手机号码")
+    private String phone;
+
+    @ApiModelProperty(value = "创建时间")
+    @ExcelHeader(value = "创建时间")
+    private String createdTime;
+
+    @ApiModelProperty(value = "状态")
+    @ExcelHeader(value = "状态")
+    private String status;
+}

+ 33 - 0
alien-gateway/src/main/java/shop/alien/gateway/entity/vo/StoreUserVo.java

@@ -0,0 +1,33 @@
+package shop.alien.gateway.entity.vo;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import shop.alien.entity.store.StoreUser;
+
+/**
+ * 二期-门店用户扩展
+ *
+ * @author ssk
+ * @since 2024-12-05
+ */
+@EqualsAndHashCode(callSuper = true)
+@Data
+@JsonInclude
+@ApiModel(value = "StoreUserVo对象", description = "门店用户扩展")
+public class StoreUserVo extends StoreUser {
+
+    @ApiModelProperty(value = "登录Token")
+    private String token;
+
+    @ApiModelProperty(value = "经营模块ID")
+    private Integer businessSection;
+
+    @ApiModelProperty(value = "经营种类")
+    private String businessTypesName;
+
+    @ApiModelProperty(value = "账号是否启用")
+    private boolean switchStatus;
+}

+ 44 - 0
alien-gateway/src/main/java/shop/alien/gateway/mapper/LifeUserDynamicsMapper.java

@@ -0,0 +1,44 @@
+package shop.alien.gateway.mapper;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.toolkit.Constants;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+import org.apache.ibatis.annotations.Select;
+import shop.alien.entity.store.LifeUserDynamics;
+import shop.alien.gateway.entity.vo.LifeUserDynamicsVo;
+
+import java.util.List;
+
+@Mapper
+public interface LifeUserDynamicsMapper extends BaseMapper<LifeUserDynamics> {
+
+    @Select("with dynamice as( " +
+            "    select id, title, phone_id phoneId, context, image_path, address, liulan_count, dianzan_count, type, created_time, substring_index(phone_id, '_', 1) flag, substring_index(phone_id, '_', -1) phone, draft " +
+            "    from life_user_dynamics " +
+            "    where delete_flag = 0 order by created_time desc" +
+            ") " +
+            "select dynamice.*, info.store_name userName, img.img_url userImage, info.id storeUserId, user.id storeOrUserId " +
+            "from dynamice " +
+            "join store_user user on dynamice.phone = user.phone " +
+            "join store_info info on info.id = user.store_id " +
+            "left join store_img img on img.store_id = user.store_id and img.img_type = '10' and img.delete_flag = 0  " +
+            "where dynamice.flag = 'store' and user.delete_flag = 0 and info.delete_flag = 0 " +
+            "union " +
+            "select dynamice.*, user.user_name userName, user.user_image userImage, user.id storeUserId, user.id storeOrUserId " +
+            "from dynamice " +
+            "join life_user user on dynamice.phone = user.user_phone " +
+            "where dynamice.flag = 'user' and user.delete_flag = 0")
+    List<LifeUserDynamicsVo> getLifeUserDynamicsList();
+
+    @Select("select lud.id ,lud.image_path,lud.context,lu.user_image,lu.user_name,IF(llr.huifu_id IS NOT NULL, 1, 0) AS isLike\n" +
+            "from life_user_dynamics lud\n" +
+            "left join life_user lu \n" +
+            "on lud.phone_id = CONCAT('store_', lu.user_phone )\n" +
+            "left join life_like_record llr\n" +
+            "on llr.huifu_id = lud.id\n" +
+            "and lu.user_phone = (select CONCAT('user_',lu1.user_phone) from life_user lu1 where lu1.id = #{userId})"+
+            "${ew.customSqlSegment}")
+    List<LifeUserDynamicsVo> getStoreDynamicslist(@Param("userId") String userId,@Param(Constants.WRAPPER) QueryWrapper<LifeUserDynamics> dynamicsWrapper);
+}

+ 3 - 3
alien-gateway/src/main/java/shop/alien/gateway/mapper/LifeUserMapper.java

@@ -8,9 +8,9 @@ import org.apache.ibatis.annotations.Mapper;
 import org.apache.ibatis.annotations.Param;
 import org.apache.ibatis.annotations.Select;
 import shop.alien.entity.store.LifeUser;
-import shop.alien.store.entity.vo.LifeFansVo;
-import shop.alien.store.entity.vo.LifeUserOrderVo;
-import shop.alien.store.entity.vo.LifeUserVo;
+import shop.alien.gateway.entity.vo.LifeFansVo;
+import shop.alien.gateway.entity.vo.LifeUserOrderVo;
+import shop.alien.gateway.entity.vo.LifeUserVo;
 
 import java.util.List;
 

+ 29 - 0
alien-gateway/src/main/java/shop/alien/gateway/mapper/StoreImgMapper.java

@@ -0,0 +1,29 @@
+package shop.alien.gateway.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+import org.apache.ibatis.annotations.Select;
+import shop.alien.entity.store.StoreImg;
+import shop.alien.gateway.entity.vo.StoreImgTypeVo;
+
+import java.util.List;
+
+/**
+ * 门店图片 Mapper 接口
+ *
+ * @author ssk
+ * @since 2024-12-05
+ */
+@Mapper
+public interface StoreImgMapper extends BaseMapper<StoreImg> {
+
+    @Select("select IFNULL(img_type, 0) img_type, count(1) count, img_url imgUrl from store_img where store_id = #{storeId} and img_type = 0 and delete_flag= 0 " +
+            "union all " +
+            "select IFNULL(img_type, 3) img_type, count(1) count, img_url imgUrl from store_img where store_id = #{storeId} and img_type = 3 and delete_flag= 0 " +
+            "union all " +
+            "select IFNULL(img_type, 4) img_type, count(1) count, img_url imgUrl from store_img where store_id = #{storeId} and img_type = 4 and delete_flag= 0 " +
+            "union all " +
+            "select IFNULL(img_type, 5) img_type, count(1) count, img_url imgUrl from store_img where store_id = #{storeId} and img_type = 5 and delete_flag= 0")
+    List<StoreImgTypeVo> getStoreImgTypeCount(@Param("storeId") Integer storeId);
+}

+ 94 - 0
alien-gateway/src/main/java/shop/alien/gateway/mapper/StoreInfoMapper.java

@@ -0,0 +1,94 @@
+package shop.alien.gateway.mapper;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.Constants;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+import org.apache.ibatis.annotations.Select;
+import shop.alien.entity.store.StoreInfo;
+import shop.alien.gateway.entity.vo.StoreInfoVo;
+import shop.alien.gateway.entity.vo.StoreMainInfoVo;
+
+import java.util.List;
+
+/**
+ * 门店信息 Mapper 接口
+ *
+ * @author ssk
+ * @since 2024-12-05
+ */
+@Mapper
+public interface StoreInfoMapper extends BaseMapper<StoreInfo> {
+
+    @Select("SELECT a.*, b.dict_detail businessStatusStr, c.dict_detail storeAreaStr FROM store_info a " +
+            "left join store_dictionary b on a.business_status = b.dict_id and b.type_name='businessStatus' " +
+            "left join store_dictionary c on a.store_area = c.dict_id and c.type_name='storeArea' where a.id = #{id}")
+    StoreMainInfoVo getStoreInfo(Integer id);
+
+    @Select("select a.*, b.name store_contact, b.phone store_phone, b.password, img.img_url entranceImage, dict.dict_detail storeTypeStr, " +
+            "( " +
+            " select ifnull(round(avg(score), 1), 0) " +
+            " from store_evaluation eval " +
+            " where eval.store_id = a.id and eval.delete_flag = 0 " +
+            ") score " +
+            "from store_info a " +
+            "left join store_user b on a.id = b.store_id and b.delete_flag = 0 " +
+            "left join store_img img on img.store_id = a.id and img.img_type = 1 and img.delete_flag = 0 " +
+            "left join store_dictionary dict on dict.type_name = 'storeType' and dict.dict_id = a.store_type and dict.delete_flag = 0 " +
+            " ${ew.customSqlSegment}")
+    StoreInfoVo getStoreInfoVoOne(@Param(Constants.WRAPPER) QueryWrapper<StoreInfoVo> queryWrapper);
+
+    @Select("with menu as (select store_id,GROUP_CONCAT(dish_name) dish_name from store_menu GROUP BY store_id) " +
+            "select a.*, b.name store_contact, b.phone store_phone, b.password, c.dish_name, a.store_type, img.img_url entranceImage, d.img_url, dict.dict_detail storeTypeStr, dict2.dict_detail businessStatusStr " +
+            "from store_info a " +
+            "left join store_user b on a.id = b.store_id  AND b.delete_flag = 0 " +
+            "left join menu c on a.id = c.store_id " +
+            "left join store_img img on img.store_id = a.id and img.img_type = 1 and img.delete_flag = 0 " +
+            "left join store_dictionary dict on dict.type_name = 'storeType' and dict.dict_id = a.store_type and dict.delete_flag = 0 " +
+            "left join store_dictionary dict2 on dict2.type_name = 'businessStatus' and a.business_status = dict2.dict_id and dict2.delete_flag = 0 " +
+            "left join store_img d on d.store_id = a.id and d.img_type = 10 and d.delete_flag = 0" +
+            " ${ew.customSqlSegment}")
+    List<StoreInfoVo> getStoreInfoVoList(@Param(Constants.WRAPPER) QueryWrapper<StoreInfoVo> queryWrapper);
+
+    /**
+     * web端-门店列表
+     *
+     * @param page         分页
+     * @param queryWrapper 查询条件
+     * @return IPage<StoreInfoVo>
+     */
+    @Select("select a.*, img.img_url entranceImage,b.name store_contact, b.phone store_phone, b.id_card idCard, b.password, c.dict_detail store_status_str, d.dict_detail business_status_str, e.dict_detail store_type_str,  " +
+            "( " +
+            " select ifnull(round(avg(score), 1), 0) " +
+            " from store_evaluation eval " +
+            " where eval.store_id = a.id and eval.delete_flag = 0 " +
+            ") score " +
+            "from store_info a " +
+            "left join store_user b on a.id = b.store_id " +
+            "left join store_img img on img.store_id = a.id and img.img_type = 1 and img.delete_flag = 0 " +
+            "left join store_dictionary c on a.store_status = c.dict_id and c.type_name = 'storeState' and c.delete_flag = 0 " +
+            "left join store_dictionary d on a.business_status = d.dict_id and d.type_name = 'businessStatus' and d.delete_flag = 0 " +
+            "left join store_dictionary e on e.type_name = 'storeType' and e.dict_id = a.store_type and e.delete_flag = 0 " +
+            "${ew.customSqlSegment}")
+    IPage<StoreInfoVo> getStoreInfoVoPage(IPage<StoreInfoVo> page, @Param(Constants.WRAPPER) QueryWrapper<StoreInfoVo> queryWrapper);
+
+    @Select("select info.store_name, user.phone, img.img_url " +
+            "from store_info info " +
+            "join store_user user on user.store_id = info.id " +
+            "left join store_img img on img.store_id = info.id and img.img_type = '10' and img.delete_flag = 0 " +
+            "where info.id = #{id} and info.delete_flag = 0 and user.delete_flag = 0 ")
+    StoreInfoVo getStoreUserInfo(Integer id);
+
+    @Select("select a.*, b.name store_contact, b.phone store_phone, b.id_card idCard, b.password, c.dict_detail store_status_str, d.dict_detail business_status_str " +
+            "from store_info a " +
+            "left join store_user b on a.id = b.store_id " +
+            "left join store_dictionary c on a.store_status = c.dict_id and c.type_name = 'storeState' " +
+            "left join store_dictionary d on a.business_status = d.dict_id and d.type_name = 'businessStatus' ${ew.customSqlSegment}")
+    List<StoreInfoVo> getStoreInfoVo(@Param(Constants.WRAPPER) QueryWrapper<StoreInfoVo> queryWrapper);
+
+    @Select("select * from store_info ${ew.customSqlSegment}")
+    List<StoreInfo> getList(@Param(Constants.WRAPPER) LambdaQueryWrapper<StoreInfo> queryWrapper);
+}

+ 37 - 0
alien-gateway/src/main/java/shop/alien/gateway/mapper/StoreUserMapper.java

@@ -0,0 +1,37 @@
+package shop.alien.gateway.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Param;
+import org.apache.ibatis.annotations.Select;
+import shop.alien.entity.store.StoreUser;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ * 门店用户 Mapper 接口
+ * </p>
+ *
+ * @author ssk
+ * @since 2024-12-11
+ */
+public interface StoreUserMapper extends BaseMapper<StoreUser> {
+
+    @Select("SELECT\n" +
+            "\t`user`.phone,\n" +
+            "\t`user`.id,\n" +
+            "\tinfo.store_name as storeName,\n" +
+            "\timg.img_url as imgUrl \n" +
+            "FROM\n" +
+            "\tstore_user AS `user`\n" +
+            "\tLEFT JOIN store_info AS info ON `user`.store_id = info.id\n" +
+            "\tLEFT JOIN store_img AS img ON img.store_id = info.id \n" +
+            "WHERE\n" +
+            "\t`user`.phone IN (${userPhones}) \n" +
+            "\tAND `user`.delete_flag = 0 \n" +
+            "\tAND img.img_type = 10")
+    List<Map<String,Object>> selectStore(@Param("userPhones") String userPhones);
+
+    StoreUser getRemoveUser(@Param("id") String id);
+}

+ 205 - 0
alien-gateway/src/main/java/shop/alien/gateway/service/StoreInfoService.java

@@ -0,0 +1,205 @@
+package shop.alien.gateway.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.service.IService;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.multipart.MultipartRequest;
+import shop.alien.entity.store.StoreInfo;
+import shop.alien.entity.store.StoreInfoDraft;
+import shop.alien.gateway.entity.dto.StoreInfoDto;
+import shop.alien.gateway.entity.vo.*;
+
+import java.io.IOException;
+import java.util.List;
+
+/**
+ * 二期-门店信息 服务类
+ *
+ * @author ssk
+ * @since 2024-12-05
+ */
+public interface StoreInfoService extends IService<StoreInfo> {
+
+    /**
+     * 门店详情
+     *
+     * @param id 门店id
+     * @return StoreMainInfoVo
+     */
+    StoreMainInfoVo getDetail(Integer id);
+
+    /**
+     * 门店信息-修改后展示
+     *
+     * @param id 门店id
+     * @return StoreMainInfoVo
+     */
+    StoreMainInfoVo getStoreInfo(Integer id);
+
+    /**
+     * 门店关联门店用户
+     *
+     * @param storeName 门店名称
+     * @param id        门店id
+     * @return List<StoreInfoVo>
+     */
+    List<StoreInfoVo> getStoreInfoVo(String storeName, Integer id);
+
+    /**
+     * web-分页查询店铺信息
+     *
+     * @param page         页码
+     * @param size         页容
+     * @param storeName    门店名称
+     * @param storeContact 联系人
+     * @param storePhone   门店电话
+     * @param storeType    门店类型
+     * @return IPage<StoreInfoVo>
+     */
+    IPage<StoreInfoVo> getStorePage(int page, int size, String storeName, String storeContact,String id, String storePhone, String storeType,String expiredState,String storeApplicationStatus,String storeStatus,String businessSection, String jingdu, String weidu);
+
+    /**
+     * web-重置门店密码
+     *
+     * @param storeId 门店id
+     * @return boolean
+     */
+    boolean resetPassword(String storeId);
+
+    /**
+     * web-修改门店状态
+     *
+     * @param storeId        门店id
+     * @param businessStatus 营业状态
+     * @return boolean
+     */
+    boolean setStoreState(String storeId, Integer businessStatus);
+
+    /**
+     * web-新增店铺
+     *
+     * @param multipartRequest 文件请求
+     * @param store            店铺信息
+     * @return boolean
+     */
+    boolean saveStore(MultipartRequest multipartRequest, StoreInfo store);
+
+    /**
+     * 导出Excel
+     *
+     * @return ResponseEntity
+     */
+    ResponseEntity<byte[]> exportToExcel();
+
+    /**
+     * web端新增门店及门店用户
+     *
+     * @return ResponseEntity
+     */
+    StoreInfoVo saveStoreInfo(StoreInfoDto storeInfoDto) throws Exception;
+
+    /**
+     * 新增店铺草稿
+     * @param storeInfoDraft
+     * @return
+     */
+    int saveStoreInfoDraft(StoreInfoDraft storeInfoDraft);
+
+    /**
+     * 查询草稿信息
+     * @param storeUserId
+     * @return
+     */
+    StoreInfoDraft selectDraftByUserId(int storeUserId);
+
+    /**
+     * web端修改门店及门店用户
+     *
+     * @return ResponseEntity
+     */
+    StoreInfoVo editStoreInfo(StoreInfoDto storeInfoDto);
+
+    /**
+     * web端删除门店及门店用户
+     *
+     * @return ResponseEntity
+     */
+    void deleteStoreInfo(StoreInfoDto storeInfoDto);
+
+    /**
+     * web端删除门店及门店用户
+     *
+     * @return ResponseEntity
+     */
+    void restPassword(StoreInfoDto storeInfoDto);
+
+    /**
+     * web端查询经营板块信息
+     * */
+    List<StoreDictionaryVo> getBusinessSection();
+
+    /**
+     * web端查询经营板块的经营种类信息
+     * */
+    List<StoreDictionaryVo> getBusinessSectionTypes(String parentId);
+
+    /**
+     * web端查询未绑定的账号信息
+     * */
+    List<StoreUserVo> getUnboundAccountList(String id);
+
+    /**
+     * web端新增经营板块及经营类型
+     * */
+    void addBusinessSectionAndTypes(StoreInfoDto storeInfoDto);
+
+    /**
+     * web端查询门店明细
+     * */
+    StoreInfoVo getStoreDetail(String storeId, String userId, String jingdu, String weidu);
+
+    /**
+     * web端审批结果
+     * */
+    void approveStoreInfo(String storeId,Integer approvalStatus);
+
+    /**
+     * web端导出商铺信息结果
+     * */
+    String exportExcel(String id,String storePhone,String businessSection,String storeApplicationStatus) throws IOException;
+
+    /**
+     * web端导出商铺到期时间信息
+     * */
+    String exportExcelExpirationTime(String id,String expiredState) throws IOException;
+
+    /**
+     * 八大类用户端筛选
+     */
+    IPage<StoreInfo> getScreening(ScreeningOfEightMajorCategoriesVO screeningOfEightMajorCategoriesVO);
+
+    List<StoreInfo> getBusinessTypesName(String businessTypesNames);
+
+    /**
+     * 注销店铺
+     * @param storeId 店铺ID
+     * @param reason 注销原因
+     * @return boolean
+     */
+    boolean logoutStore(Integer storeId, String reason);
+
+    /**
+     * 取消注销店铺
+     * @param storeId 店铺ID
+     * @return boolean
+     */
+    boolean cancelLogoutStore(Integer storeId);
+
+    /**
+     * web-查询店铺信息根据门店电话
+     *
+     * @param storeTel           门店电话
+     * @return List<StoreInfo>
+     */
+    List<StoreInfo> getStoreInfoByStoreTel(String storeTel);
+}

+ 160 - 0
alien-gateway/src/main/java/shop/alien/gateway/service/StoreUserService.java

@@ -0,0 +1,160 @@
+package shop.alien.gateway.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.service.IService;
+import shop.alien.entity.result.R;
+import shop.alien.entity.store.StoreUser;
+import shop.alien.gateway.entity.vo.StoreUserVo;
+
+import java.io.IOException;
+import java.util.List;
+
+/**
+ * 二期-门店用户 服务类
+ *
+ * @author ssk
+ * @since 2024-12-11
+ */
+public interface StoreUserService extends IService<StoreUser> {
+
+    /**
+     * 手机号获取
+     *
+     * @param phone 手机号
+     * @return StoreUser
+     */
+    StoreUser getUserByPhone(String phone);
+
+
+    /**
+     * 创建token
+     * @return
+     */
+    R<StoreUserVo> createToKen(StoreUser storeUser);
+
+    /**
+     * 修改用户状态
+     *
+     * @param phone 手机号
+     * @param type  修改类型 (pass:密码状态改为1, face:人脸状态改为2)
+     * @return StoreUser
+     */
+    boolean updateUserStatus(String phone, String type);
+
+    /**
+     * 修改密码
+     *
+     * @param id       主键
+     * @param password 密码
+     * @return boolean
+     */
+    boolean updatePassword(Integer id, String password);
+
+    /**
+     * 设置用户信息
+     *
+     * @param id     主键
+     * @param name   姓名
+     * @param idCard 身份证号
+     * @return boolean
+     */
+    boolean setUserInfo(Integer id, String name, String idCard);
+
+    /**
+     * 修改支付密码
+     *
+     * @param id          主键
+     * @param payPassword 支付密码
+     * @return boolean
+     */
+    boolean setPayPassword(Integer id, String payPassword);
+
+    /**
+     * 新增商家端用户
+     *
+     * @return boolean
+     */
+    R<StoreUserVo> addStoreUser(StoreUserVo storeUserVo);
+
+    /**
+     * web端查询用户列表
+     *
+     * @return boolean
+     */
+    R<IPage<StoreUserVo>> getStoreUserList(int pageNum, int pageSize, String id, String phone, Integer status);
+
+    /**
+     * web端编辑用户列表
+     *
+     * @return boolean
+     */
+    R<StoreUserVo> editStoreUser(StoreUser storeUser);
+
+    /**
+     * web端编辑用户列表
+     *
+     * @return boolean
+     */
+    void resetStoreUserPassword(StoreUser storeUser);
+
+    /**
+     * web端编辑用户列表
+     *
+     * @return boolean
+     */
+    void deleteStoreUser(String id);
+
+    /**
+     * web端切换商家端用户状态
+     *
+     * @return boolean
+     */
+    void switchingStates(StoreUser storeUser);
+
+
+    /**
+     * web端导出商家端账号相关信息
+     * */
+    String exportExcel(String id,String phone,String status) throws IOException;
+
+
+    /**
+     * 商户端校验
+     * @param phone
+     * @return
+     */
+    public boolean checkRegister(String phone);
+
+    /**
+     * 商户端登录校验
+     * @param phone
+     * @return
+     */
+    public R<Boolean> checkLogin(String phone);
+
+    /***
+     * 商户端注册
+     * @param phone
+     * @param password
+     * @return
+     */
+    R<Boolean> register(String phone, String password);
+
+    /**
+     *商家端注销用户
+     */
+    void storeCancelAccount(StoreUserVo storeUserVo);
+
+    /**
+     *商家端撤回注销用户
+     */
+    void storeCancelAccountUn(StoreUserVo storeUserVo);
+
+    /**
+     * 获取主键集合
+     * @param name
+     * @param phone
+     * @return
+     */
+    List<String> getIds(String name, String phone);
+}

+ 449 - 0
alien-gateway/src/main/java/shop/alien/gateway/service/impl/StoreUserServiceImpl.java

@@ -0,0 +1,449 @@
+package shop.alien.gateway.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.StringUtils;
+import com.baomidou.mybatisplus.core.toolkit.support.SFunction;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import lombok.RequiredArgsConstructor;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.util.CollectionUtils;
+import shop.alien.entity.result.R;
+import shop.alien.entity.store.*;
+import shop.alien.gateway.config.BaseRedisService;
+import shop.alien.gateway.config.JWTUtils;
+import shop.alien.gateway.entity.vo.StoreUserExcelVo;
+import shop.alien.gateway.entity.vo.StoreUserVo;
+import shop.alien.gateway.mapper.*;
+import shop.alien.gateway.service.StoreUserService;
+import shop.alien.gateway.util.DateUtils;
+import shop.alien.gateway.util.FunctionMagic;
+
+import java.io.IOException;
+import java.time.Instant;
+import java.time.ZoneId;
+import java.time.format.DateTimeFormatter;
+import java.util.*;
+
+/**
+ * 二期-门店用户 服务实现类
+ *
+ * @author ssk
+ * @since 2024-12-11
+ */
+@Transactional
+@Service
+@RequiredArgsConstructor
+public class StoreUserServiceImpl extends ServiceImpl<StoreUserMapper, StoreUser> implements StoreUserService {
+
+    @Value("${spring.web.resources.excel-path}")
+    private String excelPath;
+
+    @Value("${spring.web.resources.excel-generate-path}")
+    private String excelGeneratePath;
+
+    @Value("${spring.web.resources.url}")
+    private String fileUrl;
+
+    /**
+     * 设定初始化默认密码
+     */
+    private static final String DEFAULT_PASSWORD = "123456";
+
+    private final StoreUserMapper storeUserMapper;
+
+    private final StoreInfoMapper storeInfoMapper;
+
+    private final BaseRedisService baseRedisService;
+
+    private final LifeUserDynamicsMapper lifeUserDynamicsMapper;
+
+    private final LifeFansMapper lifeFansMapper;
+
+    private final LifeNoticeMapper lifeNoticeMapper;
+
+    private final LifeMessageMapper lifeMessageMapper;
+
+    /**
+     * 手机号获取
+     *
+     * @param phone 手机号
+     * @return StoreUser
+     */
+    @Override
+    public StoreUser getUserByPhone(String phone) {
+        LambdaQueryWrapper<StoreUser> lambdaQueryWrapper = new LambdaQueryWrapper<>();
+        lambdaQueryWrapper.eq(StoreUser::getPhone, phone);
+        StoreUser user = this.getOne(lambdaQueryWrapper);
+        if (null == user) return new StoreUser();
+        LambdaQueryWrapper<StoreInfo> wrapper = new LambdaQueryWrapper<>();
+        wrapper.eq(StoreInfo::getId, user.getStoreId());
+        StoreInfo info = storeInfoMapper.selectOne(wrapper);
+        if (null != info) user.setName(info.getStoreName());
+        return user;
+    }
+
+    /**
+     * token
+     *
+     * @param storeUser
+     * @return
+     */
+    @Override
+    public R<StoreUserVo> createToKen(StoreUser storeUser) {
+        StoreUserVo storeUserVo = new StoreUserVo();
+        BeanUtils.copyProperties(storeUser, storeUserVo);
+        Map<String, String> tokenMap = new HashMap<>();
+        tokenMap.put("phone", storeUser.getPhone());
+        tokenMap.put("userName", storeUser.getName());
+        tokenMap.put("userId", storeUser.getId().toString());
+        tokenMap.put("userType", "store");
+        storeUserVo.setToken(JWTUtils.createToken(tokenMap));
+        baseRedisService.setString("store_" + storeUser.getPhone(), storeUserVo.getToken());
+        StoreInfo storeInfo = storeInfoMapper.selectById(storeUser.getStoreId());
+        if (storeInfo != null) {
+            storeUserVo.setBusinessSection(storeInfo.getBusinessSection());
+            storeUserVo.setBusinessTypesName(storeInfo.getBusinessTypesName());
+        }
+        return R.data(storeUserVo);
+    }
+
+    /**
+     * 修改用户状态
+     *
+     * @param phone 手机号
+     * @param type  修改类型 (pass:密码状态改为1, face:人脸状态改为2)
+     * @return StoreUser
+     */
+    @Override
+    public boolean updateUserStatus(String phone, String type) {
+        LambdaQueryWrapper<StoreUser> lambdaQueryWrapper = new LambdaQueryWrapper<>();
+        lambdaQueryWrapper.eq(StoreUser::getPhone, phone);
+        StoreUser one = this.getOne(lambdaQueryWrapper);
+        if ("face".equals(type)) {
+            one.setPassType(2);
+        }
+        if ("pass".equals(type)) {
+            one.setPassType(2);
+        }
+        return this.updateById(one);
+    }
+
+    /**
+     * 修改密码
+     *
+     * @param id       主键
+     * @param password 密码
+     * @return boolean
+     */
+    @Override
+    public boolean updatePassword(Integer id, String password) {
+        StoreUser storeUser = new StoreUser();
+        storeUser.setId(id);
+        storeUser.setPassword(password);
+        return this.updateById(storeUser);
+    }
+
+    /**
+     * 设置用户信息
+     *
+     * @param id     主键
+     * @param name   姓名
+     * @param idCard 身份证号
+     * @return boolean
+     */
+    @Override
+    public boolean setUserInfo(Integer id, String name, String idCard) {
+        StoreUser storeUser = new StoreUser();
+        storeUser.setId(id);
+        storeUser.setName(name);
+        storeUser.setIdCard(idCard);
+        return this.updateById(storeUser);
+    }
+
+    /**
+     * 修改支付密码
+     *
+     * @param id          主键
+     * @param payPassword 支付密码
+     * @return boolean
+     */
+    @Override
+    public boolean setPayPassword(Integer id, String payPassword) {
+        StoreUser storeUser = new StoreUser();
+        storeUser.setId(id);
+        storeUser.setPayPassword(payPassword);
+        return this.updateById(storeUser);
+    }
+
+    @Override
+    public R<StoreUserVo> addStoreUser(StoreUserVo storeUserVo) {
+        //判断当前手机号是否存在
+        StoreUser phoneHave = storeUserMapper.selectOne(new LambdaQueryWrapper<StoreUser>().eq(StoreUser::getPhone, storeUserVo.getPhone()));
+        if (phoneHave != null) {
+            throw new RuntimeException("手机号已存在!!");
+        }
+        StoreUserVo vo = new StoreUserVo();
+        StoreUser storeUser = new StoreUser();
+        BeanUtils.copyProperties(storeUserVo, storeUser);
+        //存入密码类型为已修改  2025-4-22 业务修改
+        storeUser.setPassType(2);
+        int insert = storeUserMapper.insert(storeUser);
+        BeanUtils.copyProperties(storeUser, vo);
+        return R.data(vo);
+    }
+
+    @Override
+    public R<IPage<StoreUserVo>> getStoreUserList(int pageNum, int pageSize, String id, String phone, Integer status) {
+        IPage<StoreUser> page = new Page<>(pageNum, pageSize);
+        LambdaQueryWrapper<StoreUser> storeUserLambdaQueryWrapper = new LambdaQueryWrapper<>();
+        storeUserLambdaQueryWrapper.like(!StringUtils.isEmpty(id), StoreUser::getId, id);
+        storeUserLambdaQueryWrapper.like(!StringUtils.isEmpty(phone), StoreUser::getPhone, phone);
+        storeUserLambdaQueryWrapper.eq(status != null, StoreUser::getStatus, status);
+        storeUserLambdaQueryWrapper.orderByDesc(StoreUser::getCreatedTime);
+        IPage<StoreUser> storeUsers = storeUserMapper.selectPage(page, storeUserLambdaQueryWrapper);
+        IPage<StoreUserVo> storeUserVoIPage = new Page<>();
+        BeanUtils.copyProperties(storeUsers, storeUserVoIPage);
+        for (StoreUser storeUser : storeUserVoIPage.getRecords()) {
+            //不返回密码
+            storeUser.setPassword(null);
+            storeUser.setPayPassword(null);
+        }
+        return R.data(storeUserVoIPage);
+    }
+
+    @Override
+    public R<StoreUserVo> editStoreUser(StoreUser storeUser) {
+        storeUserMapper.updateById(storeUser);
+        StoreUserVo storeUserVo = new StoreUserVo();
+        BeanUtils.copyProperties(storeUser, storeUserVo);
+        return R.data(storeUserVo);
+    }
+
+    @Override
+    public void resetStoreUserPassword(StoreUser storeUser) {
+        StoreUser storeUserById = storeUserMapper.selectById(storeUser.getId());
+        //初始化密码赋值
+        storeUserById.setPassword(DEFAULT_PASSWORD);
+        storeUserById.setPayPassword(DEFAULT_PASSWORD);
+        storeUserMapper.updateById(storeUserById);
+    }
+
+    @Override
+    public void deleteStoreUser(String id) {
+        StoreUser storeUser = storeUserMapper.selectById(id);
+        String phone = storeUser.getPhone();
+        Integer storeId = storeUser.getStoreId();
+        storeUserMapper.deleteById(id);
+        //删除用户redis中的token
+        baseRedisService.delete("store_" + storeUser.getPhone());
+        //删除该账号的店铺
+        storeInfoMapper.delete(new LambdaQueryWrapper<StoreInfo>().eq(StoreInfo::getId, storeId));
+        //删除该账号的动态
+        lifeUserDynamicsMapper.delete(new LambdaQueryWrapper<LifeUserDynamics>().eq(LifeUserDynamics::getPhoneId, "store_" + phone));
+        //删除该账号关注的信息
+        lifeFansMapper.delete(new LambdaQueryWrapper<LifeFans>().eq(LifeFans::getFansId, "store_" + phone));
+        //删除关注该账号的信息
+        lifeFansMapper.delete(new LambdaQueryWrapper<LifeFans>().eq(LifeFans::getFollowedId, "store_" + phone));
+        //删除该账号的通知信息
+        lifeNoticeMapper.delete(new LambdaQueryWrapper<LifeNotice>().eq(LifeNotice::getReceiverId, "store_" + phone));
+        //删除该账号的发送消息信息
+        lifeMessageMapper.delete(new LambdaQueryWrapper<LifeMessage>().eq(LifeMessage::getSenderId, "store_" + phone));
+        //删除该账号的接受消息信息
+        lifeMessageMapper.delete(new LambdaQueryWrapper<LifeMessage>().eq(LifeMessage::getReceiverId, "store_" + phone));
+    }
+
+    @Override
+    public void switchingStates(StoreUser storeUserParam) {
+        StoreUser storeUser = storeUserMapper.selectById(storeUserParam.getId());
+        //如果当前为启用,则删除token
+        if (storeUser.getStatus() == 0) {
+            //删除用户redis中的token
+            baseRedisService.delete("store_" + storeUser.getPhone());
+        }
+        //根据当前状态切另一个状态
+        storeUser.setStatus(storeUser.getStatus() == 0 ? 1 : 0);
+        storeUserMapper.updateById(storeUser);
+    }
+
+    @Override
+    public String exportExcel(String id, String phone, String status) throws IOException {
+        // 定义格式化模式
+        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
+        // 先将 Date 转换为 Instant
+        List<StoreUser> storeUsers = storeUserMapper.selectList(
+                new LambdaQueryWrapper<StoreUser>()
+                        .like(StringUtils.isNotEmpty(id), StoreUser::getId, id)
+                        .like(StringUtils.isNotEmpty(phone), StoreUser::getPhone, phone)
+                        .eq(StringUtils.isNotEmpty(status), StoreUser::getStatus, status)
+        );
+        String fileName = UUID.randomUUID().toString().replace("-", "");
+        List<StoreUserExcelVo> storeUserExcelVoList = new ArrayList<>();
+        int serialNumber = 0;
+        for (StoreUser storeUser : storeUsers) {
+            StoreUserExcelVo storeUserExcelVo = new StoreUserExcelVo();
+            storeUserExcelVo.setSerialNumber(++serialNumber);
+            BeanUtils.copyProperties(storeUser, storeUserExcelVo);
+            Instant instant = storeUser.getCreatedTime().toInstant();
+            // 格式化时间
+            String formattedTime = instant.atZone(ZoneId.systemDefault()).toLocalDateTime().format(formatter);
+            storeUserExcelVo.setCreatedTime(formattedTime);
+            //格式化状态
+            storeUserExcelVo.setStatus(storeUser.getStatus() == 0 ? "启用" : "禁用");
+            storeUserExcelVoList.add(storeUserExcelVo);
+        }
+//        ExcelGenerator.generateExcel(excelPath + excelGeneratePath + fileName + ".xlsx", storeUserExcelVoList, StoreUserExcelVo.class);
+        return fileUrl + "excel" + excelGeneratePath + fileName + ".xlsx";
+
+    }
+
+
+    /**
+     * 注册校验
+     *
+     * @param phone
+     * @return
+     */
+    public boolean checkRegister(String phone) {
+        LambdaQueryWrapper<StoreUser> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(StoreUser::getPhone, phone);
+        queryWrapper.in(StoreUser::getStatus, 0, 1);
+        List<StoreUser> storeUsers = storeUserMapper.selectList(queryWrapper);
+        return CollectionUtils.isEmpty(storeUsers) ? Boolean.TRUE : Boolean.FALSE;
+
+
+    }
+
+    /**
+     * 注册
+     *
+     * @param phone
+     * @param password
+     * @return
+     */
+    @Override
+    public R<Boolean> register(String phone, String password) {
+
+        LambdaQueryWrapper<StoreUser> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(StoreUser::getPhone, phone)
+                .orderByDesc(StoreUser::getCreatedTime).last("LIMIT 1");
+        StoreUser storeUser = storeUserMapper.selectOne(queryWrapper);
+
+        List<Integer> noRegister = Arrays.asList(0, 1);
+
+        if (Objects.isNull((storeUser))) {
+            // 没有数据
+            saveNewUser(phone, password);
+            return R.success("操作成功");
+
+        } else if (noRegister.contains(storeUser.getStatus())) {
+            return R.fail("手机号已经注册过");
+        }
+
+        int daysSinceDeletion = DateUtils.subtraction(storeUser.getCreatedTime(), new Date());
+        if (daysSinceDeletion < 30) return R.fail(String.format("请于%d天后重新申请注册", 30 - daysSinceDeletion));
+        saveNewUser(phone, password);
+        return R.success("操作成功");
+
+    }
+
+
+    /**
+     * @param phone
+     * @return
+     */
+    @Override
+    public R<Boolean> checkLogin(String phone) {
+        LambdaQueryWrapper<StoreUser> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(StoreUser::getPhone, phone)
+                .orderByDesc(StoreUser::getCreatedTime).last("LIMIT 1");
+        StoreUser storeUser = storeUserMapper.selectOne(queryWrapper);
+        // 用户状态 0:启用,1:禁用,2:已注销
+        if (Objects.isNull(storeUser)) {
+            return R.success("用户不存在,快去注册吧!");
+        } else if (storeUser.getStatus() == 1) {
+            return R.success("账号已被禁用");
+        } else if (storeUser.getStatus() == 2) {
+            return R.success("账号已注销");
+        }
+        return R.success("success");
+    }
+
+
+    /**
+     * save User
+     *
+     * @param phone
+     * @param password
+     */
+    private void saveNewUser(String phone, String password) {
+        StoreUser registerStoreUser = new StoreUser();
+        registerStoreUser.setPhone(phone);
+        registerStoreUser.setPassword(password);
+        registerStoreUser.setPassType(2);
+        registerStoreUser.setMoney(0);
+        registerStoreUser.setDeleteFlag(0);
+        registerStoreUser.setStatus(0);
+        registerStoreUser.setIdCard("test");
+        registerStoreUser.setPassType(2);
+        registerStoreUser.setCreatedTime(new Date());
+        registerStoreUser.setLogoutFlag(0);
+        storeUserMapper.insert(registerStoreUser);
+    }
+
+    @Override
+    public void storeCancelAccount(StoreUserVo storeUserVo) {
+        // 通过id获取当前商家账号信息
+        LambdaQueryWrapper<StoreUser> storeUserLambdaQueryWrapper = new LambdaQueryWrapper<>();
+        storeUserLambdaQueryWrapper.eq(StoreUser::getId, storeUserVo.getId());
+        StoreUser storeUser = storeUserMapper.selectOne(storeUserLambdaQueryWrapper);
+        if (storeUser != null) {
+            if (null != storeUser.getStoreId()) {
+                StoreInfo storeInfo = storeInfoMapper.selectById(storeUser.getStoreId());
+                if (1 != storeInfo.getLogoutFlag()) {
+                    throw new RuntimeException("请先注销店铺再进行注销用户操作!");
+                }
+            }
+            // 修改注销标记为1
+            storeUser.setLogoutFlag(1);
+            // 添加注销原因
+            storeUser.setLogoutReason(storeUserVo.getLogoutReason());
+            // 添加注销申请时间
+            storeUser.setLogoutTime(new Date());
+            storeUserMapper.updateById(storeUser);
+        }
+    }
+
+    @Override
+    public void storeCancelAccountUn(StoreUserVo storeUserVo) {
+        // 通过id获取当前商家账号信息
+        LambdaQueryWrapper<StoreUser> storeUserLambdaQueryWrapper = new LambdaQueryWrapper<>();
+        storeUserLambdaQueryWrapper.eq(StoreUser::getId, storeUserVo.getId());
+        StoreUser storeUser = storeUserMapper.selectOne(storeUserLambdaQueryWrapper);
+        // 修改注销标记为0
+        storeUser.setLogoutFlag(0);
+        // 清空注销原因
+        storeUser.setLogoutReason(null);
+        // 清空注销申请时间
+        storeUser.setLogoutTime(null);
+        storeUserMapper.updateById(storeUser);
+    }
+
+    @Override
+    public List<String> getIds(String name, String phone) {
+        if (Objects.isNull(name) && Objects.isNull(phone)) return Arrays.asList("");
+        LambdaQueryWrapper<StoreUser> wrapper = new LambdaQueryWrapper<>();
+
+        List<Triple<Boolean, SFunction<StoreUser, ?>, Object>> conditions = new ArrayList<>();
+        conditions.add(Triple.of(StringUtils.isNotEmpty(name), StoreUser::getName, name));
+        conditions.add(Triple.of(StringUtils.isNotEmpty(phone), StoreUser::getPhone, phone));
+        FunctionMagic.buildLikeConditions(wrapper, conditions);
+        List<String> res = FunctionMagic.convertToIds(storeUserMapper.selectList(wrapper), StoreUser::getId);
+        return CollectionUtils.isEmpty(res) ? Arrays.asList("") : res;
+    }
+
+}

+ 114 - 0
alien-gateway/src/main/java/shop/alien/gateway/util/DateUtils.java

@@ -0,0 +1,114 @@
+package shop.alien.gateway.util;
+
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.time.LocalDate;
+import java.time.ZoneId;
+import java.time.temporal.ChronoUnit;
+import java.util.Calendar;
+import java.util.Date;
+
+/**
+ * 日期计算工具类
+ *
+ * @author ssk
+ * @version 1.0
+ * @date 2023/5/24 16:03
+ */
+public class DateUtils {
+
+    public static void main(String[] args) throws ParseException {
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+//        Date date = calcHours(new Date(), 1);
+//        System.out.println(sdf.format(date));
+//
+//        boolean b = dateCompare(new Date(), date);
+//        System.out.println(b);
+
+
+        Date date1 = sdf.parse("2024-05-10 19:10:00");
+        Date date2 = sdf.parse("2024-05-10 19:11:00");
+        System.out.println(calcMinute(date1, 1));
+        System.out.println(dateCompare(date1, calcMinute(date1, 1)));
+
+    }
+
+    /**
+     * 天数加减
+     *
+     * @param date 日期
+     * @param days 加减天数
+     * @return 处理后的日期
+     */
+    public static Date calcDays(Date date, Integer days) {
+        Calendar c = Calendar.getInstance();
+        c.setTime(date);
+        c.add(Calendar.DAY_OF_MONTH, days);
+        return c.getTime();
+    }
+
+    /**
+     * 小时加减
+     *
+     * @param date  日期
+     * @param hours 加减时间
+     * @return 处理后的日期
+     */
+    public static Date calcHours(Date date, Integer hours) {
+        Calendar c = Calendar.getInstance();
+        c.setTime(date);
+        c.add(Calendar.HOUR_OF_DAY, hours);
+        return c.getTime();
+    }
+
+    /**
+     * 分钟加减
+     *
+     * @param date   日期
+     * @param minute 加减时间
+     * @return 处理后的日期
+     */
+    public static Date calcMinute(Date date, Integer minute) {
+        Calendar c = Calendar.getInstance();
+        c.setTime(date);
+        c.add(Calendar.MINUTE, minute);
+        return c.getTime();
+    }
+
+    /**
+     * 日期比较
+     *
+     * @param dateOne 日期1
+     * @param dateTwo 日期2
+     * @return 是否大于
+     */
+    public static boolean dateCompare(Date dateOne, Date dateTwo) {
+        return dateOne.compareTo(dateTwo) > 0;
+    }
+
+    /**
+     * 格式化日期
+     *
+     * @param date   日期
+     * @param format 格式
+     * @return 格式化后的日期
+     */
+    public static String formatDate(Date date, String format) {
+        if (format.isEmpty())
+            format = "yyyy-MM-dd HH:mm:ss";
+        SimpleDateFormat sdf = new SimpleDateFormat(format);
+        return sdf.format(date);
+    }
+
+    /**
+     * 时间相减
+     * @param start
+     * @return
+     */
+    public static int subtraction(Date start , Date end) {
+        LocalDate startDate = start.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
+        LocalDate endDate = end.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
+        return (int) ChronoUnit.DAYS.between(startDate, endDate);
+    }
+
+}

+ 11 - 0
alien-gateway/src/main/resources/mapper/StoreUserMapper.xml

@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="shop.alien.gateway.mapper.StoreUserMapper">
+
+    <!-- 查询已删除的用户 -->
+    <select id="getRemoveUser" resultType="shop.alien.gateway.entity.vo.StoreUserVo">
+        select concat(name,"(账号已注销)") as name,phone FROM store_user where id = #{id}
+    </select>
+</mapper>