ソースを参照

商户账号注销

qxy 2 週間 前
コミット
00b9ca71a5

+ 4 - 0
alien-entity/src/main/java/shop/alien/entity/store/StoreUser.java

@@ -115,6 +115,10 @@ public class StoreUser extends Model<StoreUser> {
     @TableField("account_blurb")
     private String accountBlurb;
 
+    @ApiModelProperty(value = "注销code")
+    @TableField("logout_code")
+    private String logoutCode;
+
     @ApiModelProperty(value = "头像")
     @TableField("head_img")
     private String headImg;

+ 6 - 0
alien-entity/src/main/java/shop/alien/entity/store/vo/StoreUserVo.java

@@ -30,4 +30,10 @@ public class StoreUserVo extends StoreUser {
 
     @ApiModelProperty(value = "账号是否启用")
     private boolean switchStatus;
+
+    @ApiModelProperty(value = "验证码")
+    private String verificationCode;
+
+    @ApiModelProperty(value = "倒计时")
+    private long countdown;
 }

+ 22 - 0
alien-store/src/main/java/shop/alien/store/controller/StoreUserController.java

@@ -17,6 +17,7 @@ import shop.alien.store.service.StoreInfoService;
 import shop.alien.store.service.StoreUserService;
 
 import java.io.IOException;
+import java.util.Map;
 import java.util.Objects;
 import java.util.Optional;
 
@@ -358,6 +359,16 @@ public class StoreUserController {
     }
 
     /**
+     * 商家端注销用户效验
+     */
+    @ApiOperation("商家端注销用户效验")
+    @PostMapping("/storeCancelAccountVerification")
+    public R<Map<String, String>> storeCancelAccountVerification(@RequestBody StoreUserVo storeUserVo) {
+        log.info("StoreUserController.storeCancelAccountVerification?storeUserVo={}", storeUserVo);
+             return R.data(storeUserService.storeCancelAccountVerification(storeUserVo));
+    }
+
+    /**
      * 商家端注销用户
      */
     @ApiOperation("商家端注销用户")
@@ -382,4 +393,15 @@ public class StoreUserController {
         storeUserService.storeCancelAccountUn(storeUserVo);
         return R.success("撤回注销成功");
     }
+
+    /**
+     * 商家端撤销注销用户
+     */
+    @ApiOperation("手动删除商家账号及店铺")
+    @DeleteMapping("/deleteStoreAccountInfo")
+    public R<StoreUserVo> deleteStoreAccountInfo(@RequestBody StoreUserVo storeUserVo) {
+        log.info("StoreUserController.deleteStoreAccountInfo?storeUserVo={}", storeUserVo);
+        storeUserService.deleteStoreAccountInfo(storeUserVo);
+        return R.success("删除成功");
+    }
 }

+ 12 - 1
alien-store/src/main/java/shop/alien/store/service/StoreUserService.java

@@ -8,6 +8,7 @@ import shop.alien.entity.store.vo.StoreUserVo;
 
 import java.io.IOException;
 import java.util.List;
+import java.util.Map;
 
 /**
  * 二期-门店用户 服务类
@@ -23,7 +24,7 @@ public interface StoreUserService extends IService<StoreUser> {
      * @param phone 手机号
      * @return StoreUser
      */
-    StoreUser getUserByPhone(String phone);
+    StoreUserVo getUserByPhone(String phone);
 
 
     /**
@@ -152,6 +153,11 @@ public interface StoreUserService extends IService<StoreUser> {
     R<Boolean> register(String phone, String password);
 
     /**
+     *
+     */
+    Map<String,String> storeCancelAccountVerification(StoreUserVo storeUserVo);
+
+    /**
      * 商家端注销用户
      */
     void storeCancelAccount(StoreUserVo storeUserVo);
@@ -162,6 +168,11 @@ public interface StoreUserService extends IService<StoreUser> {
     void storeCancelAccountUn(StoreUserVo storeUserVo);
 
     /**
+     * 手动删除商家账号及店铺
+     */
+    void deleteStoreAccountInfo(StoreUserVo storeUserVo);
+
+    /**
      * 获取主键集合
      *
      * @param name

+ 108 - 28
alien-store/src/main/java/shop/alien/store/service/impl/StoreUserServiceImpl.java

@@ -30,8 +30,9 @@ import shop.alien.util.common.DateUtils;
 import shop.alien.util.common.JwtUtil;
 
 import java.io.IOException;
-import java.time.Instant;
-import java.time.ZoneId;
+import java.text.SimpleDateFormat;
+import java.time.*;
+
 import java.time.format.DateTimeFormatter;
 import java.util.*;
 
@@ -85,18 +86,30 @@ public class StoreUserServiceImpl extends ServiceImpl<StoreUserMapper, StoreUser
      * @return StoreUser
      */
     @Override
-    public StoreUser getUserByPhone(String phone) {
+    public StoreUserVo getUserByPhone(String phone) {
         LambdaQueryWrapper<StoreUser> lambdaQueryWrapper = new LambdaQueryWrapper<>();
         lambdaQueryWrapper.eq(StoreUser::getPhone, phone);
         StoreUser user = this.getOne(lambdaQueryWrapper);
-        if (null == user) return new StoreUser();
+        StoreUserVo storeUserVo = new StoreUserVo();
+        if(user.getStatus() == -1){
+            LocalDateTime localDateTime = user.getLogoutTime().toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime();
+            LocalDateTime future = localDateTime.plusDays(7);
+            LocalDateTime now = LocalDateTime.now();
+            Duration duration = Duration.between(now, future);
+            long correct = duration.toMillis();
+            storeUserVo.setCountdown(correct);
+        }
+
+        if (null == user) return new StoreUserVo();
         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;
+        BeanUtils.copyProperties(user, storeUserVo);
+        return storeUserVo;
     }
 
+
     /**
      * token
      *
@@ -188,7 +201,7 @@ public class StoreUserServiceImpl extends ServiceImpl<StoreUserMapper, StoreUser
             forgetPassword(phone, newPassword, verificationCode);
         }
         //修改密码
-        else if(type == 1){
+        else if (type == 1) {
             //效验新密码规则
             passwordVerification(phone, oldPassword, newPassword, confirmNewPassword);
             LambdaUpdateWrapper<StoreUser> updateWrapper = new LambdaUpdateWrapper<>();
@@ -207,8 +220,8 @@ public class StoreUserServiceImpl extends ServiceImpl<StoreUserMapper, StoreUser
             return flag;
         }
         //更换绑定手机号
-        else if(type == 2){
-            ChangeBoundPhone(phone,newPhone,verificationCode);
+        else if (type == 2) {
+            ChangeBoundPhone(phone, newPhone, verificationCode);
         }
         return flag;
     }
@@ -258,15 +271,15 @@ public class StoreUserServiceImpl extends ServiceImpl<StoreUserMapper, StoreUser
         }
     }
 
-    private boolean ChangeBoundPhone(String phone, String newPhone,  String verificationCode){
+    private boolean ChangeBoundPhone(String phone, String newPhone, String verificationCode) {
         boolean flag = false;
         String key = "verification_" + phone;
         String redisVerificationCode = baseRedisService.getString(key);
-        if(!StringUtils.isEmpty(redisVerificationCode) && redisVerificationCode.equals(verificationCode)){
+        if (!StringUtils.isEmpty(redisVerificationCode) && redisVerificationCode.equals(verificationCode)) {
             LambdaUpdateWrapper<StoreUser> storeUserWrapper = new LambdaUpdateWrapper<>();
             storeUserWrapper.eq(StoreUser::getPhone, phone);
             StoreUser storeUser = this.getOne(storeUserWrapper);
-            if(storeUser!=null ){
+            if (storeUser != null) {
                 storeUser.setPhone(newPhone);
                 flag = this.updateById(storeUser);
             }
@@ -280,8 +293,7 @@ public class StoreUserServiceImpl extends ServiceImpl<StoreUserMapper, StoreUser
                 throw new RuntimeException("手机号更换绑定失败");
             }
             return flag;
-        }
-        else {
+        } else {
             throw new RuntimeException("验证码错误");
         }
     }
@@ -514,6 +526,34 @@ public class StoreUserServiceImpl extends ServiceImpl<StoreUserMapper, StoreUser
 
     }
 
+    @Override
+    public Map<String, String> storeCancelAccountVerification(StoreUserVo storeUserVo) {
+        // 通过id获取当前商家账号信息
+        LambdaQueryWrapper<StoreUser> storeUserLambdaQueryWrapper = new LambdaQueryWrapper<>();
+        storeUserLambdaQueryWrapper.eq(StoreUser::getId, storeUserVo.getId());
+        StoreUser storeUser = storeUserMapper.selectOne(storeUserLambdaQueryWrapper);
+        Map<String, String> storeMap = new HashMap<>();
+        if (storeUser != null) {
+            if (null != storeUser.getStoreId()) {
+                StoreInfo storeInfo = storeInfoMapper.selectById(storeUser.getStoreId());
+                if (1 != storeInfo.getLogoutFlag()) {
+                    //vaule为0代表有商铺未注销
+                    storeMap.put("accountStore", "0");
+                } else {
+                    //vaule为1代表可注销
+                    storeMap.put("accountStore", "1");
+                }
+            } else if (storeUser.getMoney() != null && storeUser.getMoney() > 0) {
+                //vaule为0代表有未体现的现金
+                storeMap.put("accountMoney", "0");
+            } else {
+                //vaule为1代表没有未体现的现金
+                storeMap.put("accountMoney", "1");
+            }
+        }
+        return storeMap;
+    }
+
 
     /**
      * @param phone
@@ -566,21 +606,28 @@ public class StoreUserServiceImpl extends ServiceImpl<StoreUserMapper, StoreUser
         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("请先注销店铺再进行注销用户操作!");
-                }
+                // 添加注销原因
+                storeUser.setLogoutReason(storeUserVo.getLogoutReason());
+                // 添加注销code
+                storeUser.setLogoutCode(storeUserVo.getLogoutCode());
+                // 注销中状态
+                storeUser.setStatus(-1);
+                // 添加注销申请时间
+                storeUser.setLogoutTime(new Date());
+                int num = storeUserMapper.updateById(storeUser);
+                if (num > 0) {
+                    // 发送通知
+                    LifeNotice lifeMessage = new LifeNotice();
+                    lifeMessage.setReceiverId("user_" + storeUser.getPhone());
+                    String text = "您提交的账号注销申请已成功提交, 系统将按流程进行处理. 注销申请提交后, 将进入7天的冷静期. 期间您可以随时在" +
+                            "[账号信息]撤回申请. 冷静期结束后, 系统将正式开始注销操作. 账号内所有数据(包括但不限于个人信息、 资产等) 将被永久清除, 且无法恢复." +
+                            "如有疑问, 可联系【客服】咨询. 感谢您使用我们的服务.";
+                    lifeMessage.setContext(text);
+                    lifeMessage.setSenderId("system");
+                    lifeMessage.setIsRead(0);
+                    lifeMessage.setNoticeType(1);
+                    lifeNoticeMapper.insert(lifeMessage);
             }
-            // 修改注销标记为1
-            storeUser.setLogoutFlag(1);
-            // 添加注销原因
-            storeUser.setLogoutReason(storeUserVo.getLogoutReason());
-            // 添加注销申请时间
-            storeUser.setLogoutTime(new Date());
-            // 注销中状态
-            storeUser.setStatus(-1);
-            storeUserMapper.updateById(storeUser);
         }
     }
 
@@ -592,11 +639,44 @@ public class StoreUserServiceImpl extends ServiceImpl<StoreUserMapper, StoreUser
         StoreUser storeUser = storeUserMapper.selectOne(storeUserLambdaQueryWrapper);
         // 修改注销标记为0
         storeUser.setLogoutFlag(0);
+        // 注销状态变为可用
+        storeUser.setStatus(0);
         // 清空注销原因
         storeUser.setLogoutReason(null);
         // 清空注销申请时间
         storeUser.setLogoutTime(null);
-        storeUserMapper.updateById(storeUser);
+        int num = storeUserMapper.updateById(storeUser);
+            if (num > 0) {
+                // 发送通知
+                LifeNotice lifeMessage = new LifeNotice();
+                lifeMessage.setReceiverId("user_" + storeUser.getPhone());
+                String text = "处理结果:已撤回注销申请" +
+                        "处理时间:"+ storeUser.getCreatedTime() +
+                        "当前账号状态以为恢复正常. 您可以继续使用该账号登录并享受各项服务, 所有个人数据及账户信息" +
+                        "均已妥善保留. 若您后续仍有注销需求, 可随时通过账号信息页面重新提交申请. 感谢您的理解与支持!";
+                lifeMessage.setContext(text);
+                lifeMessage.setSenderId("system");
+                lifeMessage.setIsRead(0);
+                lifeMessage.setNoticeType(1);
+                lifeNoticeMapper.insert(lifeMessage);
+            }
+    }
+
+    @Override
+    public void deleteStoreAccountInfo(StoreUserVo storeUserVo) {
+        LambdaQueryWrapper<StoreUser> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(StoreUser::getId, storeUserVo.getId());
+        StoreUser storeUser = storeUserMapper.selectOne(queryWrapper);
+        // 删除已过注销时间的商家
+        storeUserMapper.deleteById(storeUserVo.getId());
+        //删除用户redis中的token
+        baseRedisService.delete("store_" + storeUserVo.getPhone());
+        LambdaQueryWrapper<LifeFans> lifeFansLambdaQueryWrapper = new LambdaQueryWrapper<LifeFans>().eq(LifeFans::getFollowedId, "store_" + storeUser.getPhone())
+                .or().eq(LifeFans::getFansId, "store_" + storeUser.getPhone());
+        lifeFansMapper.delete(lifeFansLambdaQueryWrapper);
+        if(storeUser.getStoreId()!=null){
+            storeInfoMapper.deleteById(storeUser.getStoreId());
+        }
     }
 
     @Override