Forráskód Böngészése

消息通知功能

zhangchen 3 hónapja
szülő
commit
95c4c72b9f

+ 1 - 1
alien-entity/src/main/resources/mapper/ManagementInfoMapper.xml

@@ -92,7 +92,7 @@
     </select>
     <select id="getOrderAmount" resultType="shop.alien.entity.store.vo.ManagementInfoVo">
         SELECT
-        ROUND(IFNULL(SUM( final_price ),0) / 100,2) AS allOrderAmount
+        ROUND(IFNULL(SUM( final_price ),0),2) AS allOrderAmount
         FROM
         life_user_order
         where

+ 8 - 0
alien-store/src/main/java/shop/alien/store/controller/LifeUserController.java

@@ -30,12 +30,15 @@ import java.util.Map;
 @RequiredArgsConstructor
 public class LifeUserController {
 
+    private final LifeUserService lifeUserService;
+
     private final LifeUserService service;
 
     private final FileUpload fileUpload;
 
     private final LifeUserMapper lifeUserMapper;
 
+
     @ApiOperation("用户登录")
     @ApiOperationSupport(order = 1)
     @ApiImplicitParams({@ApiImplicitParam(name = "phoneNum", value = "手机号", dataType = "String", paramType = "query", required = true)})
@@ -81,10 +84,15 @@ public class LifeUserController {
     @PostMapping("/modifyUser")
     public R<Boolean> modifyUser(@RequestBody LifeUser user) {
         log.info("LifeUserController.modifyUser?user={}", user.toString());
+        boolean isChangeRealInfo = lifeUserService.checkRealInfo(user);
         int num = service.modifyUser(user);
         if (num == 0) {
             return R.fail("修改失败");
         }
+        //如果修改实名信息,则发通知
+        if (isChangeRealInfo) {
+            lifeUserService.sendNotice(user);
+        }
         return R.success("修改成功");
     }
 

+ 23 - 4
alien-store/src/main/java/shop/alien/store/service/LifeUserOrderService.java

@@ -1,5 +1,6 @@
 package shop.alien.store.service;
 
+import com.alibaba.fastjson2.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
@@ -21,8 +22,10 @@ import shop.alien.entity.store.excelVo.LifeUserOrderExcelVo;
 import shop.alien.entity.store.excelVo.util.ExcelGenerator;
 import shop.alien.entity.store.vo.LifeUserOrderVo;
 import shop.alien.entity.store.vo.StoreInfoVo;
+import shop.alien.entity.store.vo.WebSocketVo;
 import shop.alien.mapper.*;
 import shop.alien.store.config.GaoDeMapUtil;
+import shop.alien.store.config.WebSocketProcess;
 import shop.alien.store.util.ali.AliApi;
 import shop.alien.util.ali.AliOSSUtil;
 import shop.alien.util.common.AlipayTradeRefund;
@@ -83,6 +86,8 @@ public class LifeUserOrderService extends ServiceImpl<LifeUserOrderMapper, LifeU
     private final LifeGroupBuyMainMapper lifeGroupBuyMainMapper;
     private final AliApi aliApi;
 
+    private final WebSocketProcess webSocketProcess;
+
     @Value("${spring.web.resources.excel-path}")
     private String excelPath;
     @Value("${spring.web.resources.excel-clearing-receipt}")
@@ -450,7 +455,7 @@ public class LifeUserOrderService extends ServiceImpl<LifeUserOrderMapper, LifeU
         // 更新的中间表id
         List<Integer> updateIds = orderCouponMiddles1.stream().limit(refundOrder.getRefundCouponAmount()).map(x -> x.getId()).collect(Collectors.toList());
         if (result.equals("调用失败")) {
-            refundMessage = "退款失败";
+            refundMessage = "编号为"+order.getOrderNo()+"的订单退款失败,请重新发起申请。";
             // TODO 退款失败目前不做处理
             /*orderCouponMiddleMapper.update(null,new UpdateWrapper<OrderCouponMiddle>().in("id",updateIds)
                     .set("status",OrderStatusEnum.REFUND_FAILED.getStatus())
@@ -462,7 +467,7 @@ public class LifeUserOrderService extends ServiceImpl<LifeUserOrderMapper, LifeU
             returnMap.put("success", refundMessage);
             return returnMap;
         } else {
-            refundMessage = "退款成功";
+            refundMessage = "编号为"+order.getOrderNo()+"的订单已退款成功,退款金额"+refundOrder.getRefundMoney()+"元,已返还至您的支付渠道,请注意查收";
             orderCouponMiddleMapper.update(null,new UpdateWrapper<OrderCouponMiddle>().in("id",updateIds)
                     .set("status",OrderStatusEnum.REFUND.getStatus())
                     .set("refund_time",now)
@@ -500,12 +505,26 @@ public class LifeUserOrderService extends ServiceImpl<LifeUserOrderMapper, LifeU
             LifeNotice lifeMessage = new LifeNotice();
             LifeUser lifeUser = lifeUserMapper.selectById(order.getUserId());
             lifeMessage.setReceiverId("user_" + lifeUser.getUserPhone());
-            String text = "您的编号为" + order.getOrderNo() + "的订单"+refundMessage;
-            lifeMessage.setContext(text);
+            JSONObject jsonObject = new JSONObject();
+            jsonObject.put("message", refundMessage);
+            lifeMessage.setContext(jsonObject.toJSONString());
             lifeMessage.setSenderId("system");
             lifeMessage.setIsRead(0);
             lifeMessage.setNoticeType(2);
             lifeNoticeMapper.insert(lifeMessage);
+
+            WebSocketVo websocketVo = new WebSocketVo();
+            websocketVo.setSenderId("system");
+            websocketVo.setReceiverId("user_" + lifeUser.getUserPhone());
+            websocketVo.setCategory("notice");
+            websocketVo.setNoticeType("1");
+            websocketVo.setIsRead(0);
+            websocketVo.setText(JSONObject.from(lifeMessage).toJSONString());
+            try {
+                webSocketProcess.sendMessage("user_" + lifeUser.getUserPhone(), JSONObject.from(websocketVo).toJSONString());
+            } catch (Exception e) {
+                log.error("LifeUserOrderService requestRefund Stack={}", e);
+            }
         }
         // 券核销完成后,退款的情况下,需要向 store_income_details_record 表插入一条记录
 //        if (null != refundOrder.getStoreId()) {

+ 49 - 1
alien-store/src/main/java/shop/alien/store/service/LifeUserService.java

@@ -1,6 +1,6 @@
 package shop.alien.store.service;
 
-import com.alibaba.fastjson.JSONObject;
+import com.alibaba.fastjson2.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
@@ -20,14 +20,17 @@ import shop.alien.entity.store.LifeNotice;
 import shop.alien.entity.store.LifeUser;
 import shop.alien.entity.store.vo.LifeMessageVo;
 import shop.alien.entity.store.vo.LifeUserVo;
+import shop.alien.entity.store.vo.WebSocketVo;
 import shop.alien.store.config.BaseRedisService;
 import shop.alien.mapper.LifeFansMapper;
 import shop.alien.mapper.LifeMessageMapper;
 import shop.alien.mapper.LifeNoticeMapper;
 import shop.alien.mapper.LifeUserMapper;
+import shop.alien.store.config.WebSocketProcess;
 import shop.alien.store.util.FunctionMagic;
 import shop.alien.util.common.JwtUtil;
 
+import java.text.SimpleDateFormat;
 import java.util.*;
 import java.util.stream.Collectors;
 
@@ -48,6 +51,8 @@ public class LifeUserService extends ServiceImpl<LifeUserMapper, LifeUser> {
 
     private final LifeMessageMapper messageMapper;
 
+    private final WebSocketProcess webSocketProcess;
+
     @Value("${jwt.expiration-time}")
     private String effectiveTime;
 
@@ -234,4 +239,47 @@ public class LifeUserService extends ServiceImpl<LifeUserMapper, LifeUser> {
         List<String> res = FunctionMagic.convertToIds(lifeUserMapper.selectList(wrapper), LifeUser::getId);
         return CollectionUtils.isEmpty(res) ? Arrays.asList("") : res;
     }
+
+    public boolean checkRealInfo(LifeUser user) {
+        LifeUser lifeUser =  lifeUserMapper.selectById(user.getId());
+        if(lifeUser != null) {
+          String realName = user.getRealName();
+          String idCard = user.getIdCard();
+          if ((realName == null && lifeUser.getRealName() == null)|| (idCard == null && lifeUser.getIdCard() == null)) {
+              return false;
+          }
+          return (StringUtils.isNotEmpty(realName) && !realName.equals(lifeUser.getRealName())) || (StringUtils.isNotEmpty(idCard) && !idCard.equals(lifeUser.getIdCard()));
+        }
+        return false;
+    }
+
+    public void sendNotice(LifeUser user){
+        String receiverId = "user_" + user.getUserPhone();
+        LifeNotice lifeNotice = new LifeNotice();
+        lifeNotice.setReceiverId(receiverId);
+        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+        String storeDate = simpleDateFormat.format(new Date());
+        String text = "您在" + storeDate + "实名认证成功。";
+        JSONObject jsonObject = new JSONObject();
+        jsonObject.put("message", text);
+        lifeNotice.setContext(jsonObject.toJSONString());
+        lifeNotice.setTitle("实名认证通知");
+        lifeNotice.setSenderId("system");
+        lifeNotice.setIsRead(0);
+        lifeNotice.setNoticeType(1);
+        lifeNoticeMapper.insert(lifeNotice);
+
+        WebSocketVo websocketVo = new WebSocketVo();
+        websocketVo.setSenderId("system");
+        websocketVo.setReceiverId(receiverId);
+        websocketVo.setCategory("notice");
+        websocketVo.setNoticeType("1");
+        websocketVo.setIsRead(0);
+        websocketVo.setText(JSONObject.from(lifeNotice).toJSONString());
+        try {
+            webSocketProcess.sendMessage(receiverId, JSONObject.from(websocketVo).toJSONString());
+        } catch (Exception e) {
+            log.error("LifeUserService webSocketProcess Stack={}", e);
+        }
+    }
 }

+ 231 - 25
alien-store/src/main/java/shop/alien/store/service/impl/LifeUserViolationServiceImpl.java

@@ -26,10 +26,12 @@ import shop.alien.store.config.WebSocketProcess;
 import shop.alien.store.service.*;
 import shop.alien.store.util.FunctionMagic;
 import shop.alien.util.ali.AliOSSUtil;
+import shop.alien.util.common.EnumUtil;
 import shop.alien.util.common.JwtUtil;
 
 import java.io.File;
 import java.io.IOException;
+import java.text.SimpleDateFormat;
 import java.time.Instant;
 import java.time.ZoneId;
 import java.time.format.DateTimeFormatter;
@@ -75,6 +77,10 @@ public class LifeUserViolationServiceImpl extends ServiceImpl<LifeUserViolationM
 
     private final AliOSSUtil aliOSSUtil;
 
+    private final LifeUserDynamicsMapper lifeUserDynamicsMapper;
+
+    private final StoreCommentMapper storeCommentMapper;
+
     @Value("${spring.web.resources.excel-path}")
     private String excelPath;
 
@@ -86,21 +92,32 @@ public class LifeUserViolationServiceImpl extends ServiceImpl<LifeUserViolationM
         try {
             int result = lifeUserViolationMapper.insert(lifeuserViolation);
             if (result > 0) {
-                if (lifeuserViolation.getReportContextType().equals("4") || lifeuserViolation.getReportContextType().equals("5")) {
-                    String phoneId = Objects.requireNonNull(JwtUtil.getCurrentUserInfo()).getString("userType") + "_" + JwtUtil.getCurrentUserInfo().getString("phone");
-
+                    //String phoneId = Objects.requireNonNull(JwtUtil.getCurrentUserInfo()).getString("userType") + "_" + JwtUtil.getCurrentUserInfo().getString("phone");
+                    // 举报人消息
                     LifeNotice lifeNotice = getLifeNotice(lifeuserViolation);
                     lifeNoticeMapper.insert(lifeNotice);
-
                     WebSocketVo websocketVo = new WebSocketVo();
                     websocketVo.setSenderId("system");
-                    websocketVo.setReceiverId(phoneId);
+                    websocketVo.setReceiverId(lifeNotice.getReceiverId());
                     websocketVo.setCategory("notice");
                     websocketVo.setNoticeType("1");
                     websocketVo.setIsRead(0);
                     websocketVo.setText(com.alibaba.fastjson2.JSONObject.from(lifeNotice).toJSONString());
-                    webSocketProcess.sendMessage(phoneId, com.alibaba.fastjson2.JSONObject.from(websocketVo).toJSONString());
-                }
+                    webSocketProcess.sendMessage(lifeNotice.getReceiverId(), com.alibaba.fastjson2.JSONObject.from(websocketVo).toJSONString());
+
+                    // 被举报人消息
+                    LifeNotice lifeNoticeReported = getLifeReportedNotice(lifeuserViolation);
+                    if (lifeNoticeReported != null) {
+                        lifeNoticeMapper.insert(lifeNoticeReported);
+                        WebSocketVo websocketVoReported = new WebSocketVo();
+                        websocketVoReported.setSenderId("system");
+                        websocketVoReported.setReceiverId(lifeNoticeReported.getReceiverId());
+                        websocketVoReported.setCategory("notice");
+                        websocketVoReported.setNoticeType("1");
+                        websocketVoReported.setIsRead(0);
+                        websocketVoReported.setText(com.alibaba.fastjson2.JSONObject.from(lifeNoticeReported).toJSONString());
+                        webSocketProcess.sendMessage(lifeNoticeReported.getReceiverId(), com.alibaba.fastjson2.JSONObject.from(websocketVoReported).toJSONString());
+                    }
                 return result;
             }
         } catch (Exception e) {
@@ -110,20 +127,116 @@ public class LifeUserViolationServiceImpl extends ServiceImpl<LifeUserViolationM
         return 0;
     }
 
-    private static LifeNotice getLifeNotice(LifeUserViolation lifeuserViolation) {
+    private LifeNotice getLifeNotice(LifeUserViolation lifeuserViolation) {
         JSONObject data = JwtUtil.getCurrentUserInfo();
         String phoneId = null;
-        if (data != null) {
-            phoneId = data.getString("phone");
+//        if (data != null) {
+//            phoneId = data.getString("phone");
+//        }
+        LifeNotice lifeNotice = new LifeNotice();
+        lifeNotice.setSenderId("system");
+        lifeNotice.setBusinessId(lifeuserViolation.getId());
+        lifeNotice.setTitle("举报通知");
+        JSONObject jsonObject = new JSONObject();
+        String message = "平台已受理,感谢您的反馈!";
+        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+        SimpleDateFormat simpleDateFormats = new SimpleDateFormat("yyyy-MM-dd");
+        String storeDate = simpleDateFormat.format(new Date());
+        String reportContextType = lifeuserViolation.getReportContextType();
+        String reportUserId = lifeuserViolation.getReportingUserId();
+        String reportedUserId = lifeuserViolation.getReportedUserId();
+        String storeOrUserName = "";
+        // 查询被举报用户信息
+
+        if ("1".equals(lifeuserViolation.getReportedUserType())) {
+            StoreUser storeUser = storeUserMapper.selectById(reportedUserId);
+            storeOrUserName = storeUser.getNickName();
+        } else {
+            LifeUser lifeUser = lifeUserMapper.selectById(reportedUserId);
+            storeOrUserName = lifeUser.getUserName();
+        }
+
+        if ("1".equals(lifeuserViolation.getReportingUserType())) {
+            StoreUser storeUsers = storeUserMapper.selectById(reportUserId);
+            phoneId = "store_"+storeUsers.getPhone();
+        } else {
+            LifeUser lifeUsers = lifeUserMapper.selectById(reportUserId);
+            phoneId = "user_"+lifeUsers.getUserPhone();
+        }
+
+        lifeNotice.setReceiverId(phoneId);
+
+        String violationText = EnumUtil.getStatusValue(Integer.parseInt(lifeuserViolation.getViolationType()));
+
+        if(StringUtils.isNotEmpty(reportContextType)){
+            switch (reportContextType) {
+                case "1":
+                    message = "您在" + storeDate + "举报用户“" + storeOrUserName + "”,涉嫌"+violationText+",已提交至平台审核,1-3个工作日会将审核结果发送到您应用内的消息-通知中,请注意查收。";
+                    break;
+                case "2":
+                    String dynamicsId = lifeuserViolation.getDynamicsId();
+                    String dynamicsDate = simpleDateFormat.format(new Date());
+                    if(StringUtils.isNotEmpty(dynamicsId)){
+                        LifeUserDynamics lifeUserDynamics = lifeUserDynamicsMapper.selectById(dynamicsId);
+                        dynamicsDate = simpleDateFormats.format(lifeUserDynamics.getCreatedTime());
+                    }
+                    message = "您在" + storeDate + "举报用户“" + storeOrUserName + "”在"+dynamicsDate+"发布的动态,涉嫌"+violationText+",已提交至平台审核,1-3个工作日会将审核结果发送到您应用内的消息-通知中,请注意查收。";
+                    break;
+                case "3":
+                    String commonId = lifeuserViolation.getCommentId();
+                    String commonDate = simpleDateFormat.format(new Date());
+                    if(StringUtils.isNotEmpty(commonId)){
+                        StoreComment storeComment  = storeCommentMapper.selectById(commonId);
+                        commonDate = simpleDateFormats.format(storeComment.getCreatedTime());
+                    }
+                    message = "您在" + storeDate + "举报用户“" + storeOrUserName + "”在"+commonDate+"发布的评论,涉嫌"+violationText+",已提交至平台审核,1-3个工作日会将审核结果发送到您应用内的消息-通知中,请注意查收。";
+                    break;
+            }
         }
+
+        jsonObject.put("message", message);
+        lifeNotice.setContext(jsonObject.toJSONString());
+        lifeNotice.setNoticeType(1);
+        return lifeNotice;
+    }
+
+    private LifeNotice getLifeReportedNotice(LifeUserViolation lifeuserViolation) throws Exception {
+
+        // 查询被举报用户信息
+        String reportUserId = lifeuserViolation.getReportedUserId();
+        String phoneId = "";
         LifeNotice lifeNotice = new LifeNotice();
+
+        if ("1".equals(lifeuserViolation.getReportedUserType())) {
+            StoreUser storeUser = storeUserMapper.selectById(reportUserId);
+            phoneId = storeUser.getPhone();
+            lifeNotice.setReceiverId("store_" + phoneId);
+        } else {
+            LifeUser lifeUser = lifeUserMapper.selectById(reportUserId);
+            phoneId = lifeUser.getUserPhone();
+            lifeNotice.setReceiverId("user_" + phoneId);
+
+        }
+        if (StringUtils.isEmpty(phoneId)){
+            return null;
+        }
+        String violationText = EnumUtil.getStatusValue(Integer.parseInt(lifeuserViolation.getViolationType()));
+
         lifeNotice.setSenderId("system");
-        lifeNotice.setReceiverId("user_" + phoneId);
         lifeNotice.setBusinessId(lifeuserViolation.getId());
         lifeNotice.setTitle("举报通知");
         JSONObject jsonObject = new JSONObject();
-        jsonObject.put("title", "平台已受理");
-        jsonObject.put("message", "平台已受理,感谢您的反馈!");
+        String message = "";
+        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+        String storeDate = simpleDateFormat.format(new Date());
+        String reportContextType = lifeuserViolation.getReportContextType();
+
+        if(StringUtils.isNotEmpty(reportContextType) && reportContextType.equals("1")){
+            message = "您在" + storeDate + "被举报涉嫌"+violationText+",平台将会进行核实。如确实存在违规行为,平台将禁用您的账号**天,到期后账号可恢复使用,应用内的环境需要我们共同维护。";
+        } else {
+            return null;
+        }
+        jsonObject.put("message", message);
         lifeNotice.setContext(jsonObject.toJSONString());
         lifeNotice.setNoticeType(1);
         return lifeNotice;
@@ -223,52 +336,94 @@ public class LifeUserViolationServiceImpl extends ServiceImpl<LifeUserViolationM
         v.setProcessingStatus(processingStatus);
         v.setProcessingTime(new Date());
         v.setReportResult(reportResult);
-        StringBuilder b = new StringBuilder();
+        // 举报时间
+        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+        SimpleDateFormat simpleDateFormats = new SimpleDateFormat("yyyy-MM-dd");
+        String violationTime = simpleDateFormat.format(v.getCreatedTime());
+        // 被举报人信息
+        String reportedUserName = "";
+        if(StringUtils.isNotEmpty(v.getReportedUserId())){
+            if (v.getReportedUserType().equals("1")) {
+                StoreUser storeUser = storeUserMapper.selectById(v.getReportedUserId());
+                reportedUserName = storeUser.getNickName();
+            } else{
+                LifeUser lifeUser = lifeUserMapper.selectById(v.getReportedUserId());
+                reportedUserName = lifeUser.getUserName();
+            }
+        }
+        // 被举报动态信息
+        String dynamicsId = v.getDynamicsId();
+        String dynamicsDate = simpleDateFormats.format(new Date());
+        if(StringUtils.isNotEmpty(dynamicsId)){
+            LifeUserDynamics lifeUserDynamics = lifeUserDynamicsMapper.selectById(dynamicsId);
+            dynamicsDate = simpleDateFormats.format(lifeUserDynamics.getCreatedTime());
+        }
+        // 被举报评论信息
+        String commonId = v.getCommentId();
+        String commonDate = simpleDateFormats.format(new Date());
+        if(StringUtils.isNotEmpty(commonId)){
+            StoreComment storeComment  = storeCommentMapper.selectById(commonId);
+            commonDate = simpleDateFormats.format(storeComment.getCreatedTime());
+        }
+
+        // 举报通知信息
+        String message = "";
+        // 被举报通知信息
+        String reportedMessage = "";
+        String title = "";
         if (processingStatus.equals("1")) {
             // 通过
             if (v.getReportContextType().equals("1")) {
                 // 用户
-                b.append("处理结果: 你的举报通过,已被处理 经核实,您举报的用户确实存在违规行为");
+                message = "您在"+violationTime+"举报用户“"+reportedUserName+"”,涉嫌违法违规,经核实,确实存在违规行为,平台已将用户禁用,感谢您为此做出的贡献。";
+                title = "用户举报成功通知";
             }
             if (v.getReportContextType().equals("2")) {
                 // 动态
-                LifeUserDynamics dynamics = lifeUserDynamicsService.getById(v.getDynamicsId());
-                b.append("处理结果: 你的举报通过,已被处理 经核实,您举报的动态'").append(dynamics.getContext()).append("' 确实存在违规行为,感谢您为社区环境做出的贡献。");
+                message = "您在"+violationTime+"举报用户“"+reportedUserName+"”在"+dynamicsDate+"发布的动态,涉嫌违法违规,经核实,确实存在违规行为,平台已将此动态下架,感谢您为此做出的贡献";
+                reportedMessage = "您在"+dynamicsDate+"发布的动态,经核实,确实存在违规行为,平台已将此动态下架,应用内的环境需要我们共同维护";
                 lifeUserDynamicsService.removeById(v.getDynamicsId());
+                title = "动态举报成功通知";
             }
             if (v.getReportContextType().equals("3")) {
                 // 评论
                 if (v.getReportedUserType().equals("1")) {
                     // 商户
-                    StoreComment storeComment = storeCommentService.getById(v.getCommentId());
-                    b.append("处理结果: 你的举报通过,已被处理 经核实,您举报的评论'").append(storeComment.getCommentContent()).append("'确实存在违规行为感谢您为社区环境做出的贡献。");
+                    message = "您在"+violationTime+"举报用户“"+reportedUserName+"”在"+commonDate+"发布的评论,涉嫌违法违规,经核实,确实存在违规行为,平台已将此评论下架,感谢您为此做出的贡献。";
                     storeCommentService.removeById(v.getCommentId());
                 } else {
                     // 用户
-                    LifeComment lifeComment = lifeCommentMapper.selectById(v.getCommentId());
-                    b.append("处理结果: 你的举报通过,已被处理 经核实,您举报的评论'").append(lifeComment.getGudingPinglun()).append(" ").append(lifeComment.getShoudaPinglun()).append("'确实存在违规行为感谢您为社区环境做出的贡献。");
+                    message = "您在"+violationTime+"举报用户“"+reportedUserName+"”在"+commonDate+"发布的评论,涉嫌违法违规,经核实,确实存在违规行为,平台已将此评论下架,感谢您为此做出的贡献。";
                     lifeCommentMapper.deleteById(v.getCommentId());
                 }
+                reportedMessage = "您在"+commonDate+"发布的评论,经核实,确实存在违规行为,平台已将此评论下架,应用内的环境需要我们共同维护。";
+                title = "评论举报成功通知";
             }
         } else {
             // 驳回
             switch (v.getReportContextType()) {
                 case "1":
-                    b.append("处理结果: 未检测到有违规行为经核实,该用户未存在违规行为,我们将会对该用户重点关注,感谢您为社区做出的贡献。");
+                    message = "您在"+violationTime+"举报用户“"+reportedUserName+"”,涉嫌违法违规,经核实,不存在违规行为,感谢您为此做出的贡献。";
+                    title = "用户举报失败通知";
                     break;
                 case "2":
-                    b.append("处理结果: 未检测到有违规行为经核实,该动态未存在违规行为,我们将会对该动态重点关注,感谢您为社区做出的贡献。");
+                    message = "您在"+violationTime+"举报用户“"+reportedUserName+"”在"+dynamicsDate+"发布的动态,涉嫌违法违规,经核实,不存在违规行为,感谢您为此做出的贡献。";
+                    title = "动态举报失败通知";
                     break;
                 case "3":
-                    b.append("处理结果: 未检测到有违规行为经核实,该评论未存在违规行为,我们将会对该评论重点关注,感谢您为社区做出的贡献。");
+                    message = "您在"+violationTime+"举报用户“"+reportedUserName+"”在"+commonDate+"发布的评论,涉嫌违法违规,经核实,不存在违规行为,感谢您为此做出的贡献。";
+                    title = "评论举报失败通知";
                     break;
             }
         }
         lifeUserViolationMapper.updateById(v);
         LifeNotice LifeMessage = new LifeNotice();
-        LifeMessage.setContext(b.toString());
+        com.alibaba.fastjson2.JSONObject jsonObject = new com.alibaba.fastjson2.JSONObject();
+        jsonObject.put("message", message);
+        LifeMessage.setContext(jsonObject.toJSONString());
         LifeMessage.setSenderId("system");
         LifeMessage.setIsRead(0);
+        LifeMessage.setTitle(title);
         LifeMessage.setNoticeType(1);
         LifeMessage.setBusinessId(id);
         if (v.getReportingUserType().equals("1")) {
@@ -282,6 +437,57 @@ public class LifeUserViolationServiceImpl extends ServiceImpl<LifeUserViolationM
 
         }
         lifeNoticeMapper.insert(LifeMessage);
+
+        WebSocketVo websocketVo = new WebSocketVo();
+        websocketVo.setSenderId("system");
+        websocketVo.setReceiverId(LifeMessage.getReceiverId());
+        websocketVo.setCategory("notice");
+        websocketVo.setNoticeType("1");
+        websocketVo.setIsRead(0);
+        websocketVo.setText(com.alibaba.fastjson2.JSONObject.from(LifeMessage).toJSONString());
+        try {
+            webSocketProcess.sendMessage(LifeMessage.getReceiverId(), com.alibaba.fastjson2.JSONObject.from(websocketVo).toJSONString());
+        } catch (Exception e) {
+            log.error("LifeUserViolationServiceImpl_approve Error Stack={}", e.getMessage());
+        }
+
+
+        // 被举报通知
+        if(StringUtils.isNotEmpty(reportedMessage)) {
+            LifeNotice reportedLifeMessage = new LifeNotice();
+            com.alibaba.fastjson2.JSONObject jsonObjectReported = new com.alibaba.fastjson2.JSONObject();
+            jsonObjectReported.put("message", reportedMessage);
+            reportedLifeMessage.setContext(jsonObjectReported.toJSONString());
+            reportedLifeMessage.setSenderId("system");
+            reportedLifeMessage.setIsRead(0);
+            reportedLifeMessage.setTitle(title);
+            reportedLifeMessage.setNoticeType(1);
+            reportedLifeMessage.setBusinessId(id);
+            if (v.getReportedUserType().equals("1")) {
+                // M
+                StoreUser storeUser = storeUserService.getOne(new QueryWrapper<StoreUser>().eq("id", v.getReportedUserId()));
+                reportedLifeMessage.setReceiverId("store_" + storeUser.getPhone());
+            } else {
+                // U
+                LifeUser lifeUser = lifeUserService.getOne(new QueryWrapper<LifeUser>().eq("id", v.getReportedUserId()));
+                reportedLifeMessage.setReceiverId("user_" + lifeUser.getUserPhone());
+            }
+            lifeNoticeMapper.insert(reportedLifeMessage);
+
+            WebSocketVo websocketVoReported = new WebSocketVo();
+            websocketVoReported.setSenderId("system");
+            websocketVoReported.setReceiverId(reportedLifeMessage.getReceiverId());
+            websocketVoReported.setCategory("notice");
+            websocketVoReported.setNoticeType("1");
+            websocketVoReported.setIsRead(0);
+            websocketVoReported.setText(com.alibaba.fastjson2.JSONObject.from(reportedLifeMessage).toJSONString());
+            try {
+                webSocketProcess.sendMessage(reportedLifeMessage.getReceiverId(), com.alibaba.fastjson2.JSONObject.from(websocketVoReported).toJSONString());
+            } catch (Exception e) {
+                log.error("LifeUserViolationServiceImpl_reported_approve Error Stack={}", e.getMessage());
+            }
+        }
+
     }
 
     @Override

+ 59 - 1
alien-store/src/main/java/shop/alien/store/service/impl/StoreCommentAppealServiceImpl.java

@@ -1,5 +1,6 @@
 package shop.alien.store.service.impl;
 
+import com.alibaba.fastjson2.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
@@ -24,7 +25,9 @@ import shop.alien.entity.store.excelVo.util.ExcelExporter;
 import shop.alien.entity.store.vo.StoreCommentAppealLogVo;
 import shop.alien.entity.store.vo.StoreCommentAppealInfoVo;
 import shop.alien.entity.store.vo.StoreCommentAppealVo;
+import shop.alien.entity.store.vo.WebSocketVo;
 import shop.alien.mapper.*;
+import shop.alien.store.config.WebSocketProcess;
 import shop.alien.store.service.StoreCommentAppealService;
 import shop.alien.store.util.FileUploadUtil;
 import shop.alien.util.common.netease.TextCheckUtil;
@@ -33,6 +36,7 @@ import shop.alien.util.common.safe.TextModerationUtil;
 import shop.alien.util.common.safe.TextReviewServiceEnum;
 
 import java.net.URLEncoder;
+import java.text.SimpleDateFormat;
 import java.util.*;
 import java.util.stream.Collectors;
 
@@ -61,9 +65,17 @@ public class StoreCommentAppealServiceImpl extends ServiceImpl<StoreCommentAppea
 
     private final StoreDictionaryMapper storeDictionaryMapper;
 
+    private final StoreInfoMapper storeInfoMapper;
+
     @Autowired
     private TextModerationUtil textModerationUtil;
 
+    private final LifeNoticeMapper lifeNoticeMapper;
+
+    private final StoreUserMapper storeUserMapper;
+
+    private final WebSocketProcess webSocketProcess;
+
     /**
      * 懒得查, 留着导出Excel
      */
@@ -403,6 +415,11 @@ public class StoreCommentAppealServiceImpl extends ServiceImpl<StoreCommentAppea
      */
     @Override
     public boolean setAppealStatus(Integer id, Integer appealStatus, String logRemark) {
+        StoreCommentAppeal sca = storeCommentAppealMapper.selectById(id);
+        if (sca == null){
+            return false;
+        }
+        Integer storeId = sca.getStoreId();
         StoreCommentAppeal storeCommentAppeal = new StoreCommentAppeal();
         storeCommentAppeal.setId(id);
         storeCommentAppeal.setAppealStatus(appealStatus);
@@ -440,7 +457,48 @@ public class StoreCommentAppealServiceImpl extends ServiceImpl<StoreCommentAppea
         storeCommentAppealLog.setCreatedTime(new Date());
         storeCommentAppealLog.setLogRemark(logRemark);
         storeCommentAppealLogMapper.insert(storeCommentAppealLog);
-        return this.updateById(storeCommentAppeal);
+        boolean result = this.updateById(storeCommentAppeal);
+
+        // 发送通知
+        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+        String commonDate = simpleDateFormat.format(new Date());
+        String text = "";
+        if(appealStatus==2) {
+            text = "您在"+commonDate+"提交了申诉删除差评,经核实,确为不实评价,申诉成功,已将此条评价删除。";
+        } else if(appealStatus==1){
+            text = "您在"+commonDate+"提交了申诉删除差评,经核实,确为顾客真实感受,申诉失败,此条评价不会被删除。";
+        }
+        StoreInfo storeInfo = storeInfoMapper.selectById(storeId);
+        if(StringUtils.isEmpty(text) || storeInfo == null || StringUtils.isEmpty(storeInfo.getStoreTel())) {
+            return result;
+        }
+        StoreUser storeUser = storeUserMapper.selectOne(new LambdaQueryWrapper<StoreUser>().eq(StoreUser::getStoreId, storeInfo.getId()).eq(StoreUser::getDeleteFlag, 0));
+
+        LifeNotice lifeMessage = new LifeNotice();
+        lifeMessage.setReceiverId("store_" + storeUser.getPhone());
+        JSONObject jsonObject = new JSONObject();
+        jsonObject.put("message", text);
+        lifeMessage.setContext(jsonObject.toJSONString());
+        lifeMessage.setTitle("申诉删除差评");
+        lifeMessage.setSenderId("system");
+        lifeMessage.setIsRead(0);
+        lifeMessage.setNoticeType(1);
+        lifeNoticeMapper.insert(lifeMessage);
+
+        WebSocketVo websocketVo = new WebSocketVo();
+        websocketVo.setSenderId("system");
+        websocketVo.setReceiverId("store_" + storeUser.getPhone());
+        websocketVo.setCategory("notice");
+        websocketVo.setNoticeType("1");
+        websocketVo.setIsRead(0);
+        websocketVo.setText(JSONObject.from(lifeMessage).toJSONString());
+        try {
+            webSocketProcess.sendMessage("store_" + storeUser.getPhone(), JSONObject.from(websocketVo).toJSONString());
+        } catch (Exception e) {
+            log.error("StoreCommentAppealServiceImpl webSocketProcess Stack={}", e);
+        }
+
+        return result;
     }
 
     /**

+ 34 - 1
alien-store/src/main/java/shop/alien/store/service/impl/StoreCommentServiceImpl.java

@@ -1,6 +1,7 @@
 package shop.alien.store.service.impl;
 
 import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson2.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
@@ -20,6 +21,7 @@ import org.springframework.web.multipart.MultipartRequest;
 import shop.alien.entity.store.*;
 import shop.alien.entity.store.vo.*;
 import shop.alien.mapper.*;
+import shop.alien.store.config.WebSocketProcess;
 import shop.alien.store.service.StoreCommentService;
 import shop.alien.store.util.FileUploadUtil;
 import shop.alien.util.common.DateUtils;
@@ -32,6 +34,7 @@ import shop.alien.util.common.safe.TextReviewServiceEnum;
 import java.io.IOException;
 import java.math.BigDecimal;
 import java.math.RoundingMode;
+import java.text.SimpleDateFormat;
 import java.util.*;
 import java.util.concurrent.atomic.AtomicReference;
 import java.util.stream.Collectors;
@@ -65,6 +68,10 @@ public class StoreCommentServiceImpl extends ServiceImpl<StoreCommentMapper, Sto
 
     private final StoreInfoMapper storeInfoMapper;
 
+    private final LifeNoticeMapper lifeNoticeMapper;
+
+    private final WebSocketProcess webSocketProcess;
+
     @Autowired
     private TextModerationUtil textModerationUtil;
 
@@ -589,7 +596,33 @@ public class StoreCommentServiceImpl extends ServiceImpl<StoreCommentMapper, Sto
             storeInfo.setEnScore(enScore);
             storeInfo.setServiceScore(serviceScore);
             storeInfoMapper.updateById(storeInfo);
-
+            StoreUser storeUser = storeUserMapper.selectOne(new LambdaQueryWrapper<StoreUser>().eq(StoreUser::getStoreId, storeInfo.getId()).eq(StoreUser::getDeleteFlag, 0));
+
+            // 如果差评,则发送差评提醒
+            if(score >= 0.5 && score <= 2.5){
+                SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+                String commonDate = simpleDateFormat.format(new Date());
+                LifeNotice lifeMessage = new LifeNotice();
+                lifeMessage.setReceiverId("store_" + storeUser.getPhone());
+                String text = "在"+commonDate+",您的店铺有一条差评记录,您可查看评价内容是否属实,如不属实,可向平台进行申诉。";
+                JSONObject jsonObject = new JSONObject();
+                jsonObject.put("message", text);
+                lifeMessage.setContext(jsonObject.toJSONString());
+                lifeMessage.setTitle("差评通知");
+                lifeMessage.setSenderId("system");
+                lifeMessage.setIsRead(0);
+                lifeMessage.setNoticeType(1);
+                lifeNoticeMapper.insert(lifeMessage);
+
+                WebSocketVo websocketVo = new WebSocketVo();
+                websocketVo.setSenderId("system");
+                websocketVo.setReceiverId("store_" + storeUser.getPhone());
+                websocketVo.setCategory("notice");
+                websocketVo.setNoticeType("1");
+                websocketVo.setIsRead(0);
+                websocketVo.setText(JSONObject.from(lifeMessage).toJSONString());
+                webSocketProcess.sendMessage("store_" + storeUser.getPhone(), JSONObject.from(websocketVo).toJSONString());
+            }
             return i;
         } catch (Exception e) {
             log.error("StoreCommentService.userComment ERROR Msg={}", e.getMessage());

+ 72 - 9
alien-store/src/main/java/shop/alien/store/service/impl/StoreIncomeDetailsRecordServiceImpl.java

@@ -15,10 +15,9 @@ import org.springframework.transaction.annotation.Transactional;
 import shop.alien.entity.result.R;
 import shop.alien.entity.store.*;
 import shop.alien.entity.store.vo.StoreIncomeDetailsRecordVo;
-import shop.alien.mapper.LifeUserOrderMapper;
-import shop.alien.mapper.StoreCashOutRecordMapper;
-import shop.alien.mapper.StoreIncomeDetailsRecordMapper;
-import shop.alien.mapper.StoreUserMapper;
+import shop.alien.entity.store.vo.WebSocketVo;
+import shop.alien.mapper.*;
+import shop.alien.store.config.WebSocketProcess;
 import shop.alien.store.service.StoreIncomeDetailsRecordService;
 import shop.alien.store.service.StoreUserService;
 import shop.alien.store.util.ali.AliApi;
@@ -56,6 +55,9 @@ public class StoreIncomeDetailsRecordServiceImpl extends ServiceImpl<StoreIncome
     private final StoreIncomeDetailsRecordMapper storeIncomeDetailsRecordMapper;
     private final LifeUserOrderMapper lifeUserOrderMapper;
 
+    private final LifeNoticeMapper lifeNoticeMapper;
+
+    private final WebSocketProcess webSocketProcess;
 
     /**
      * 提现-提现全部-手续费一单一算
@@ -218,11 +220,18 @@ public class StoreIncomeDetailsRecordServiceImpl extends ServiceImpl<StoreIncome
             if(!(storeCashOutRecord.getPaymentStatus() == 3)){
                 return "付款状态异常";
             }
+            Integer storeUserId = storeCashOutRecord.getStoreUserId();
+            StoreUser storeUser = storeUserMapper.selectById(storeUserId);
+
             if (approveStatus.equals("0")) {
+                //同意提现通知
+                cashOutSendNotice(storeCashOutRecord, storeUser, failReason,"1");
+
                 //同意,开始提现
-                Integer storeUserId = storeCashOutRecord.getStoreUserId();
-                StoreUser storeUser = storeUserMapper.selectById(storeUserId);
                 int money = storeCashOutRecord.getMoney();
+                if(money > storeUser.getMoney()) {
+                    money = storeUser.getMoney();
+                }
                 BigDecimal decimal = new BigDecimal(money);
                 BigDecimal divide = decimal.divide(new BigDecimal(100), 2, RoundingMode.HALF_UP);
                 if (Double.parseDouble(divide.toString()) < 0.10) {
@@ -241,11 +250,16 @@ public class StoreIncomeDetailsRecordServiceImpl extends ServiceImpl<StoreIncome
                     if(storeCashOutRecord.getCommission() == null ) {
                         commission = 0;
                     }
-                    //减少账户余额
                     storeCashOutRecordMapper.updateById(storeCashOutRecord);
-                    storeUserMapper.updateById(new StoreUser(storeUserId, storeUser.getMoney() - storeCashOutRecord.getMoney() - commission));
+                    int deductMoney =  storeCashOutRecord.getMoney() - commission;
+                    if(storeUser.getMoney() < deductMoney) {
+                        storeUserMapper.updateById(new StoreUser(storeUserId, 0));
+                    } else {
+                        storeUserMapper.updateById(new StoreUser(storeUserId, storeUser.getMoney() - storeCashOutRecord.getMoney() - commission));
+                    }
+                    // 提现成功通知
+                    cashOutSendNotice(storeCashOutRecord, storeUser, failReason, "3");
                     return "付款成功";
-
                 } else {
                     // 提现失败
                     storeCashOutRecord.setPaymentStatus(2);
@@ -253,6 +267,8 @@ public class StoreIncomeDetailsRecordServiceImpl extends ServiceImpl<StoreIncome
                     storeCashOutRecord.setFailReason("支付失败");
                     storeCashOutRecord.setPayDate(new Date());//支付时间
                     storeCashOutRecordMapper.updateById(storeCashOutRecord);
+                    // 提现失败通知
+                    cashOutSendNotice(storeCashOutRecord, storeUser, failReason, "4");
                     return "付款失败";
                 }
             } else {
@@ -266,12 +282,59 @@ public class StoreIncomeDetailsRecordServiceImpl extends ServiceImpl<StoreIncome
                         .eq(StoreIncomeDetailsRecord::getCashOutId, storeCashOutRecord.getId())
                         .set(StoreIncomeDetailsRecord::getCashOutId, "");
                  int result = storeIncomeDetailsRecordMapper.updateByCashOutId(storeCashOutRecord.getStoreId(), storeCashOutRecord.getId());
+
+                //驳回提现申请通知
+                cashOutSendNotice(storeCashOutRecord, storeUser, failReason, "2");
                 return "已拒绝";
             }
         }
         return "审批成功";
     }
 
+    private void cashOutSendNotice(StoreCashOutRecord storeCashOutRecord, StoreUser storeUser, String failReason, String noticeType) {
+
+        //同意提现通知
+        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+        String commonDate = simpleDateFormat.format(storeCashOutRecord.getCreatedTime());
+        String moneyStr = String.format("%.2f", storeCashOutRecord.getMoney() / 100.0);
+        LifeNotice lifeMessage = new LifeNotice();
+        lifeMessage.setReceiverId("store_" + storeUser.getPhone());
+        com.alibaba.fastjson2.JSONObject jsonObject = new com.alibaba.fastjson2.JSONObject();
+        String text = "";
+        if (noticeType.equals("1")) {
+            text = "您在"+commonDate+"申请提现"+moneyStr+"元,已审核成功,提现中,请耐心等待。";
+            lifeMessage.setTitle("提现审核");
+        } else if(noticeType.equals("2")) {
+            text = "您在"+commonDate+"申请提现"+moneyStr+"元,审核失败。失败原因:"+failReason;
+            lifeMessage.setTitle("提现审核");
+        } else if(noticeType.equals("3")){
+            text = "您在"+commonDate+"申请提现"+moneyStr+"元,已成功到达您的支付宝账号,请注意查收。";
+            lifeMessage.setTitle("提现到账");
+        } else{
+            text = "您在"+commonDate+"申请提现"+moneyStr+"元,到账失败,请重新申请或联系客服。";
+            lifeMessage.setTitle("提现到账");
+        }
+        jsonObject.put("message", text);
+        lifeMessage.setContext(jsonObject.toJSONString());
+        lifeMessage.setSenderId("system");
+        lifeMessage.setIsRead(0);
+        lifeMessage.setNoticeType(1);
+        lifeNoticeMapper.insert(lifeMessage);
+
+        WebSocketVo websocketVo = new WebSocketVo();
+        websocketVo.setSenderId("system");
+        websocketVo.setReceiverId("store_" + storeUser.getPhone());
+        websocketVo.setCategory("notice");
+        websocketVo.setNoticeType("1");
+        websocketVo.setIsRead(0);
+        websocketVo.setText(com.alibaba.fastjson2.JSONObject.from(lifeMessage).toJSONString());
+        try {
+            webSocketProcess.sendMessage("store_" + storeUser.getPhone(), com.alibaba.fastjson2.JSONObject.from(websocketVo).toJSONString());
+        } catch (Exception e) {
+            log.error("StoreIncomeDetailsRecordsServiceImpl approveCashOut  Stack={}", e);
+        }
+    }
+
 
     /**
      * 今日收益

+ 104 - 20
alien-store/src/main/java/shop/alien/store/service/impl/StoreInfoServiceImpl.java

@@ -12,6 +12,8 @@ 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.Autowired;
+import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.data.geo.Point;
 import org.springframework.http.HttpHeaders;
@@ -33,6 +35,7 @@ import shop.alien.entity.store.vo.*;
 import shop.alien.mapper.*;
 import shop.alien.store.config.BaseRedisService;
 import shop.alien.store.config.GaoDeMapUtil;
+import shop.alien.store.config.WebSocketProcess;
 import shop.alien.store.service.NearMeService;
 import shop.alien.store.service.StoreClockInService;
 import shop.alien.store.service.StoreCommentService;
@@ -53,6 +56,7 @@ import java.time.format.DateTimeFormatterBuilder;
 import java.time.temporal.ChronoField;
 import java.time.temporal.ChronoUnit;
 import java.util.*;
+import java.util.concurrent.Executor;
 import java.util.stream.Collectors;
 
 /**
@@ -122,6 +126,8 @@ public class StoreInfoServiceImpl extends ServiceImpl<StoreInfoMapper, StoreInfo
 
     private final AliOSSUtil aliOSSUtil;
 
+    private final WebSocketProcess webSocketProcess;
+
     @Value("${spring.web.resources.excel-path}")
     private String excelPath;
 
@@ -142,6 +148,9 @@ public class StoreInfoServiceImpl extends ServiceImpl<StoreInfoMapper, StoreInfo
     public StoreMainInfoVo getDetail(Integer id) {
 
         StoreInfo storeInfo = storeInfoMapper.selectById(id);
+        if(storeInfo == null){
+             return null;
+        }
         StoreMainInfoVo storeMainInfoVo = storeInfoMapper.getStoreInfo(id);
         //存入门店地址、
         storeMainInfoVo.setStoreAddress(storeInfo.getStoreAddress());
@@ -589,6 +598,35 @@ public class StoreInfoServiceImpl extends ServiceImpl<StoreInfoMapper, StoreInfo
             storeImg.setImgUrl(licenseAddress);
             storeImgMapper.insert(storeImg);
         }
+
+        // 发送通知
+        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+        String commonDate = simpleDateFormat.format(new Date());
+        String text = "您在"+commonDate+"提交的入驻店铺申请,平台已受理,1-3个工作日将审核结果发送至应用内的消息-通知中,请注意查收。";
+        com.alibaba.fastjson2.JSONObject jsonObject = new com.alibaba.fastjson2.JSONObject();
+        jsonObject.put("message", text);
+        LifeNotice lifeMessage = new LifeNotice();
+        lifeMessage.setReceiverId("store_" + storeUser.getPhone());
+        lifeMessage.setContext(jsonObject.toJSONString());
+        lifeMessage.setTitle("入住店铺申请");
+        lifeMessage.setSenderId("system");
+        lifeMessage.setIsRead(0);
+        lifeMessage.setNoticeType(1);
+        lifeNoticeMapper.insert(lifeMessage);
+
+        WebSocketVo websocketVo = new WebSocketVo();
+        websocketVo.setSenderId("system");
+        websocketVo.setReceiverId("store_" + storeUser.getPhone());
+        websocketVo.setCategory("notice");
+        websocketVo.setNoticeType("1");
+        websocketVo.setIsRead(0);
+        websocketVo.setText(com.alibaba.fastjson2.JSONObject.from(lifeMessage).toJSONString());
+        try {
+            webSocketProcess.sendMessage("store_" + storeUser.getPhone(), com.alibaba.fastjson2.JSONObject.from(websocketVo).toJSONString());
+        } catch (Exception e) {
+            log.error("StoreInfoServiceImpl webSocketProcess Stack={}", e);
+        }
+
         return result;
     }
 
@@ -1068,27 +1106,43 @@ public class StoreInfoServiceImpl extends ServiceImpl<StoreInfoMapper, StoreInfo
         storeInfo.setStoreApplicationStatus(approvalStatus);
         storeInfo.setReason(reason);
         StoreUser storeUser = storeUserMapper.selectOne(new LambdaQueryWrapper<StoreUser>().eq(StoreUser::getStoreId, storeInfo.getId()).eq(StoreUser::getDeleteFlag, 0));
+        storeInfoMapper.updateById(storeInfo);
+
+        //处理中台审核记录
+        LambdaUpdateWrapper<WebAudit> wrapper = new LambdaUpdateWrapper<>();
+        wrapper.eq(WebAudit::getStoreInfoId, storeId);
+        wrapper.set(WebAudit::getStatus, "1");
+        webAuditMapper.update(null, wrapper);
+
         // 发送审核通知
         LifeNotice lifeNotice = new LifeNotice();
         lifeNotice.setSenderId("system");
         lifeNotice.setReceiverId("store_" + storeUser.getPhone());
         lifeNotice.setBusinessId(storeInfo.getId());
         lifeNotice.setTitle("店铺审核通知");
+        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+        String createDate = simpleDateFormat.format(storeInfo.getCreatedTime());
         if (2 == approvalStatus) {
-            lifeNotice.setContext("您的店铺申请被驳回,原因为:" + reason);
+            lifeNotice.setContext("您在"+createDate+"提交入驻店铺申请,审核失败。失败原因:"+reason+"。");
         } else {
-            lifeNotice.setContext("您的店铺申请已通过");
+            lifeNotice.setContext("您在"+createDate+"提交入驻店铺申请已通过审核,欢迎您的加入。");
         }
         lifeNotice.setNoticeType(1); // 系统通知
         lifeNotice.setIsRead(0);
         lifeNoticeMapper.insert(lifeNotice);
-        storeInfoMapper.updateById(storeInfo);
 
-        //处理中台审核记录
-        LambdaUpdateWrapper<WebAudit> wrapper = new LambdaUpdateWrapper<>();
-        wrapper.eq(WebAudit::getStoreInfoId, storeId);
-        wrapper.set(WebAudit::getStatus, "1");
-        webAuditMapper.update(null, wrapper);
+        WebSocketVo websocketVo = new WebSocketVo();
+        websocketVo.setSenderId("system");
+        websocketVo.setReceiverId("store_" + storeUser.getPhone());
+        websocketVo.setCategory("notice");
+        websocketVo.setNoticeType("1");
+        websocketVo.setIsRead(0);
+        websocketVo.setText(com.alibaba.fastjson2.JSONObject.from(lifeNotice).toJSONString());
+        try {
+            webSocketProcess.sendMessage("store_" + storeUser.getPhone(), com.alibaba.fastjson2.JSONObject.from(websocketVo).toJSONString());
+        } catch (Exception e) {
+            log.error("LifeUserService webSocketProcess approveStoreInfo Stack={}", e);
+        }
     }
 
     @Override
@@ -1601,19 +1655,38 @@ public class StoreInfoServiceImpl extends ServiceImpl<StoreInfoMapper, StoreInfo
             int num = storeInfoMapper.updateById(storeIn);
             if (num > 0) {
                 // 发送通知
-                LifeNotice lifeMessage = new LifeNotice();
-                lifeMessage.setReceiverId("store_" + storeInfo.getStorePhone());
-                String text = "您提交的店铺注销申请已成功提交, 系统将按流程进行处理. 注销申请提交后, 将进入7天的冷静期. 期间您可以随时在" + "[门店装修]-[操作]中撤回申请. 冷静期结束后, 系统将正式开始注销操作. 店铺内所有数据将被永久清除, 且无法恢复." + "如有疑问, 可联系客服咨询. 感谢您使用我们的服务.";
-                lifeMessage.setContext(text);
-                lifeMessage.setTitle("注销店铺通知");
-                lifeMessage.setSenderId("system");
-                lifeMessage.setIsRead(0);
-                lifeMessage.setNoticeType(1);
+                LifeNotice lifeMessage = getLifeNotice(storeInfo);
                 lifeNoticeMapper.insert(lifeMessage);
+                WebSocketVo websocketVo = new WebSocketVo();
+                websocketVo.setSenderId("system");
+                websocketVo.setReceiverId("store_" + storeInfo.getStorePhone());
+                websocketVo.setCategory("notice");
+                websocketVo.setNoticeType("1");
+                websocketVo.setIsRead(0);
+                websocketVo.setText(com.alibaba.fastjson2.JSONObject.from(lifeMessage).toJSONString());
+                try {
+                    webSocketProcess.sendMessage("store_" + storeInfo.getStorePhone(), com.alibaba.fastjson2.JSONObject.from(websocketVo).toJSONString());
+                } catch (Exception e) {
+                    log.error("StoreInfoService webSocketProcess Stack={}", e);
+                }
             }
         }
     }
 
+    private static LifeNotice getLifeNotice(StoreInfoVo storeInfo) {
+        LifeNotice lifeMessage = new LifeNotice();
+        lifeMessage.setReceiverId("store_" + storeInfo.getStorePhone());
+        String text = "您提交的店铺注销申请已成功接收,系统将按流程进行处理。注销申请提交后,将进入7天的冷静期,期间您可随在【我的设置】-【店铺信息】-【操作】-【注销店铺】中撤回申请,冷静期结束后,系统将正式开始注销操作,店铺内所数据将被永久清除,且无法恢复。如有疑问,可联系客服咨询,感谢您使用我们的服务。";
+        com.alibaba.fastjson2.JSONObject jsonObject = new com.alibaba.fastjson2.JSONObject();
+        jsonObject.put("message", text);
+        lifeMessage.setContext(jsonObject.toJSONString());
+        lifeMessage.setTitle("注销店铺通知");
+        lifeMessage.setSenderId("system");
+        lifeMessage.setIsRead(0);
+        lifeMessage.setNoticeType(1);
+        return lifeMessage;
+    }
+
     @Override
     public void cancelLogoutStore(StoreInfoVo storeInfo) {
         // 通过id获取当前商家账号信息
@@ -1635,15 +1708,26 @@ public class StoreInfoServiceImpl extends ServiceImpl<StoreInfoMapper, StoreInfo
             // 发送通知
             LifeNotice lifeMessage = new LifeNotice();
             lifeMessage.setReceiverId("store_" + storeInfo.getStorePhone());
-            SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
-            String storeDate = simpleDateFormat.format(new DateTime());
-            String text = "处理结果:已撤回注销申请" + "处理时间:" + storeDate + "当前店铺状态已恢复正常. 您可以继续使用该店铺登录并享受各项服务, 所有店铺数据均已妥善保留." + "若您后续仍有注销需求, 可随时通过门店装修页面重新提交申请. 感谢您的理解与支持!";
+            String text = "当前店铺状态已恢复正常。您可继续使用该店铺登录并享受各项服务,所有店铺数据均已妥善保留。";
             lifeMessage.setContext(text);
-            lifeMessage.setTitle("撤销店铺注销通知");
+            lifeMessage.setTitle("撤销注销店铺通知");
             lifeMessage.setSenderId("system");
             lifeMessage.setIsRead(0);
             lifeMessage.setNoticeType(1);
             lifeNoticeMapper.insert(lifeMessage);
+
+            WebSocketVo websocketVo = new WebSocketVo();
+            websocketVo.setSenderId("system");
+            websocketVo.setReceiverId("store_" + storeInfo.getStorePhone());
+            websocketVo.setCategory("notice");
+            websocketVo.setNoticeType("1");
+            websocketVo.setIsRead(0);
+            websocketVo.setText(com.alibaba.fastjson2.JSONObject.from(lifeMessage).toJSONString());
+            try {
+                webSocketProcess.sendMessage("store_" + storeInfo.getStorePhone(), com.alibaba.fastjson2.JSONObject.from(websocketVo).toJSONString());
+            } catch (Exception e) {
+                log.error("StoreInfoServiceImpl webSocketProcess Stack={}", e);
+            }
         }
     }
 

+ 41 - 10
alien-store/src/main/java/shop/alien/store/service/impl/StoreUserServiceImpl.java

@@ -23,8 +23,10 @@ import shop.alien.entity.store.*;
 import shop.alien.entity.store.excelVo.StoreUserExcelVo;
 import shop.alien.entity.store.excelVo.util.ExcelGenerator;
 import shop.alien.entity.store.vo.StoreUserVo;
+import shop.alien.entity.store.vo.WebSocketVo;
 import shop.alien.mapper.*;
 import shop.alien.store.config.BaseRedisService;
+import shop.alien.store.config.WebSocketProcess;
 import shop.alien.store.service.NearMeService;
 import shop.alien.store.service.StoreUserService;
 import shop.alien.store.util.FunctionMagic;
@@ -74,6 +76,8 @@ public class StoreUserServiceImpl extends ServiceImpl<StoreUserMapper, StoreUser
 
     private final AliOSSUtil aliOSSUtil;
 
+    private final WebSocketProcess webSocketProcess;
+
     @Value("${spring.web.resources.excel-path}")
     private String excelPath;
 
@@ -671,16 +675,31 @@ public class StoreUserServiceImpl extends ServiceImpl<StoreUserMapper, StoreUser
                     if (num > 0) {
                         // 发送通知
                         LifeNotice lifeMessage = new LifeNotice();
-                        lifeMessage.setReceiverId("store_" + new DateTime());
-                        String text = "您提交的账号注销申请已成功提交, 系统将按流程进行处理. 注销申请提交后, 将进入7天的冷静期. 期间您可以随时在" +
-                                "[账号信息]撤回申请. 冷静期结束后, 系统将正式开始注销操作. 账号内所有数据(包括但不限于个人信息、 资产等) 将被永久清除, 且无法恢复." +
-                                "如有疑问, 可联系【客服】咨询. 感谢您使用我们的服务.";
-                        lifeMessage.setContext(text);
+                        lifeMessage.setReceiverId("store_" + storeUser.getPhone());
+                        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+                        String storeDate = simpleDateFormat.format(new Date());
+                        String text = "您在"+storeDate+"注销了账号,平台将为您保留7天,在此期间您可撤销注销账号,7天后将会永久删除。";
+                        com.alibaba.fastjson2.JSONObject jsonObject = new com.alibaba.fastjson2.JSONObject();
+                        jsonObject.put("message", text);
+                        lifeMessage.setContext(jsonObject.toJSONString());
                         lifeMessage.setTitle("注销商家账号通知");
                         lifeMessage.setSenderId("system");
                         lifeMessage.setIsRead(0);
                         lifeMessage.setNoticeType(1);
                         lifeNoticeMapper.insert(lifeMessage);
+
+                        WebSocketVo websocketVo = new WebSocketVo();
+                        websocketVo.setSenderId("system");
+                        websocketVo.setReceiverId("store_" + storeUser.getPhone());
+                        websocketVo.setCategory("notice");
+                        websocketVo.setNoticeType("1");
+                        websocketVo.setIsRead(0);
+                        websocketVo.setText(com.alibaba.fastjson2.JSONObject.from(lifeMessage).toJSONString());
+                        try {
+                            webSocketProcess.sendMessage("store_" + storeUser.getPhone(), com.alibaba.fastjson2.JSONObject.from(websocketVo).toJSONString());
+                        } catch (Exception e) {
+                            log.error("LifeUserViolationServiceImpl_approve Error Stack={}", e.getMessage());
+                        }
                     }
                 }
             } else {
@@ -716,16 +735,28 @@ public class StoreUserServiceImpl extends ServiceImpl<StoreUserMapper, StoreUser
             lifeMessage.setReceiverId("store_" + storeUser.getPhone());
             SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
             String storeDate = simpleDateFormat.format(storeUser.getCreatedTime());
-            String text = "处理结果:已撤回注销申请" +
-                    "处理时间:" + storeDate +
-                    "当前账号状态已恢复正常. 您可以继续使用该账号登录并享受各项服务, 所有个人数据及账户信息" +
-                    "均已妥善保留. 若您后续仍有注销需求, 可随时通过账号信息页面重新提交申请. 感谢您的理解与支持!";
-            lifeMessage.setContext(text);
+            String text = "您在"+storeDate+"撤销了注销账号,所有数据均已保留,您可继续在平台使用。";
+            com.alibaba.fastjson2.JSONObject jsonObject = new com.alibaba.fastjson2.JSONObject();
+            jsonObject.put("message", text);
+            lifeMessage.setContext(jsonObject.toJSONString());
             lifeMessage.setTitle("撤销商家账号注销通知");
             lifeMessage.setSenderId("system");
             lifeMessage.setIsRead(0);
             lifeMessage.setNoticeType(1);
             lifeNoticeMapper.insert(lifeMessage);
+
+            WebSocketVo websocketVo = new WebSocketVo();
+            websocketVo.setSenderId("system");
+            websocketVo.setReceiverId("store_" + storeUser.getPhone());
+            websocketVo.setCategory("notice");
+            websocketVo.setNoticeType("1");
+            websocketVo.setIsRead(0);
+            websocketVo.setText(com.alibaba.fastjson2.JSONObject.from(lifeMessage).toJSONString());
+            try {
+                webSocketProcess.sendMessage("store_" + storeUser.getPhone(), com.alibaba.fastjson2.JSONObject.from(websocketVo).toJSONString());
+            } catch (Exception e) {
+                log.error("StoreUserServiceImpl webSocketProcess Stack={}", e.getMessage());
+            }
         }
     }
 

+ 20 - 0
alien-util/src/main/java/shop/alien/util/common/EnumUtil.java

@@ -0,0 +1,20 @@
+package shop.alien.util.common;
+
+import shop.alien.util.common.constant.ViolationEnum;
+import java.util.HashMap;
+import java.util.Map;
+
+// 枚举工具类,通过code获取value
+public class EnumUtil {
+    private static final Map<Integer, String> STATUS_MAP = new HashMap<>();
+
+    static {
+        for (ViolationEnum status : ViolationEnum.values()) {
+            STATUS_MAP.put(status.getCode(), status.getValue());
+        }
+    }
+
+    public static String getStatusValue(int code) {
+        return STATUS_MAP.getOrDefault(code, "未知状态码");
+    }
+}

+ 52 - 0
alien-util/src/main/java/shop/alien/util/common/constant/ViolationEnum.java

@@ -0,0 +1,52 @@
+package shop.alien.util.common.constant;
+
+// 举报类型枚举
+public enum ViolationEnum {
+    VIOLATION1(1, "用户违规"),
+    VIOLATION2(2, "色情低俗"),
+    VIOLATION3(3, "违法违规"),
+    VIOLATION4(4, "谩骂嘲讽、煽动对立"),
+    VIOLATION5(5, "涉嫌诈骗"),
+    VIOLATION6(6, "人身攻击"),
+    VIOLATION7(7, "种族歧视"),
+    VIOLATION8(8, "政治敏感"),
+    VIOLATION9(9, "虚假、不实内容"),
+    VIOLATION10(10, "违反公德秩序"),
+    VIOLATION11(11, "危害人身安全"),
+    VIOLATION12(12, "网络暴力"),
+    VIOLATION13(13, "其他原因");
+
+    private final int code;
+    private final String value;
+
+    ViolationEnum(int code, String value) {
+        this.code = code;
+        this.value = value;
+    }
+
+    public int getCode() {
+        return code;
+    }
+
+    public String getValue() {
+        return value;
+    }
+
+    // 通过code获取枚举实例
+    public static ViolationEnum getByCode(int code) {
+        for (ViolationEnum status : ViolationEnum.values()) {
+            if (status.getCode() == code) {
+                return status;
+            }
+        }
+        return null;
+    }
+
+    // 通过code获取value
+    public static String getValueByCode(int code) {
+        ViolationEnum status = getByCode(code);
+        return status != null ? status.getValue() : null;
+    }
+}
+
+