Kaynağa Gözat

1、优化拉黑日志,处理拉黑状态时记录备注谁拉黑的,并且记录到日志表里进行处理

yys 1 ay önce
ebeveyn
işleme
7e90b24ba8

+ 7 - 2
fs-company-app/src/main/java/com/fs/app/controller/FsUserController.java

@@ -145,15 +145,20 @@ public class FsUserController extends AppBaseController {
     @Login
     @PostMapping("/disabled")
     @ApiOperation("批量禁用会员")
+    @Log(title = "批量禁用会员", businessType = BusinessType.UPDATE)
     public ResponseResult<Boolean> disabledUser(@ApiParam(value = "联系人id集合", required = true) @RequestBody List<Long> userCompanyUserIds) {
-        log.info("[fs_user_company_user] APP批量禁用会员(设status=2) | ids={}, 操作人userId={}", JSON.toJSONString(userCompanyUserIds), getUserId());
-        Boolean r = userCompanyUserService.batchUpdateStatus(userCompanyUserIds, 2, "销售userId=" + getUserId());
+        Long companyUserId = Long.parseLong(getUserId());
+        CompanyUser operator = companyUserService.selectCompanyUserById(companyUserId);
+        String operatorName = operator != null && operator.getNickName() != null ? operator.getNickName() : "销售" + companyUserId;
+        log.info("[fs_user_company_user] APP批量禁用会员(设status=2) | ids={}, 操作人={}", JSON.toJSONString(userCompanyUserIds), operatorName);
+        Boolean r = userCompanyUserService.batchUpdateStatus(userCompanyUserIds, 2, "销售" + operatorName);
         return ResponseResult.ok(r);
     }
 
     @Login
     @PostMapping("/enabled")
     @ApiOperation("批量启用会员")
+    @Log(title = "批量启用会员", businessType = BusinessType.UPDATE)
     public ResponseResult<Boolean> enabledUser(@ApiParam(value = "联系人id集合", required = true) @RequestBody List<Long> userCompanyUserIds) {
         log.info("[fs_user_company_user] APP批量启用会员(设status=1) | ids={}, 操作人userId={}", JSON.toJSONString(userCompanyUserIds), getUserId());
         Boolean r = userCompanyUserService.batchUpdateStatus(userCompanyUserIds, 1);

+ 59 - 1
fs-company-app/src/main/java/com/fs/core/aspectj/LogAspect.java

@@ -1,6 +1,8 @@
 package com.fs.core.aspectj;
 
+import cn.hutool.core.util.ObjectUtil;
 import com.alibaba.fastjson.JSON;
+import com.fs.app.utils.JwtUtils;
 import com.fs.common.annotation.Log;
 import com.fs.common.core.domain.model.LoginUser;
 import com.fs.common.enums.BusinessStatus;
@@ -9,9 +11,13 @@ import com.fs.common.utils.SecurityUtils;
 import com.fs.common.utils.ServletUtils;
 import com.fs.common.utils.StringUtils;
 import com.fs.common.utils.ip.IpUtils;
+import com.fs.common.utils.spring.SpringUtils;
+import com.fs.company.domain.CompanyUser;
+import com.fs.company.service.ICompanyUserService;
 import com.fs.core.manager.AsyncManager;
 import com.fs.core.manager.factory.AsyncFactory;
 import com.fs.system.domain.SysOperLog;
+import io.jsonwebtoken.Claims;
 import org.aspectj.lang.JoinPoint;
 import org.aspectj.lang.Signature;
 import org.aspectj.lang.annotation.AfterReturning;
@@ -85,7 +91,15 @@ public class LogAspect
             }
 
             // 获取当前的用户
-            LoginUser loginUser = SecurityUtils.getLoginUser();
+            LoginUser loginUser = null;
+            try
+            {
+                loginUser = SecurityUtils.getLoginUser();
+            }
+            catch (Exception ignored)
+            {
+                // APP端使用JWT认证,无Spring Security上下文,忽略此异常
+            }
 
             // *========数据库日志=========*//
             SysOperLog operLog = new SysOperLog();
@@ -101,6 +115,15 @@ public class LogAspect
             {
                 operLog.setOperName(loginUser.getUsername());
             }
+            else
+            {
+                // APP端JWT认证:从APPToken中获取操作人昵称
+                String operName = getOperNameFromJwt();
+                if (operName != null)
+                {
+                    operLog.setOperName(operName);
+                }
+            }
 
             if (e != null)
             {
@@ -241,4 +264,39 @@ public class LogAspect
         return o instanceof MultipartFile || o instanceof HttpServletRequest || o instanceof HttpServletResponse
                 || o instanceof BindingResult;
     }
+
+    /**
+     * APP端JWT认证:从APPToken请求头中获取操作人昵称
+     */
+    private String getOperNameFromJwt()
+    {
+        try
+        {
+            HttpServletRequest request = ServletUtils.getRequest();
+            String token = request.getHeader("APPToken");
+            if (StringUtils.isEmpty(token))
+            {
+                return null;
+            }
+            JwtUtils jwtUtils = SpringUtils.getBean(JwtUtils.class);
+            Claims claims = jwtUtils.getClaimByToken(token);
+            if (ObjectUtil.isEmpty(claims))
+            {
+                return null;
+            }
+            String userId = claims.getSubject();
+            ICompanyUserService companyUserService = SpringUtils.getBean(ICompanyUserService.class);
+            CompanyUser companyUser = companyUserService.selectCompanyUserById(Long.parseLong(userId));
+            if (companyUser != null && StringUtils.isNotEmpty(companyUser.getNickName()))
+            {
+                return companyUser.getNickName();
+            }
+            return "销售" + userId;
+        }
+        catch (Exception ex)
+        {
+            log.warn("从JWT获取操作人信息失败: {}", ex.getMessage());
+            return null;
+        }
+    }
 }

+ 4 - 0
fs-service/src/main/java/com/fs/course/domain/FsUserCompanyUser.java

@@ -67,6 +67,10 @@ public class FsUserCompanyUser {
      * 备注
      */
     private String remark;
+    /**
+     * 拉黑信息(记录拉黑操作人及原因,对客户不可见)
+     */
+    private String blacklistInfo;
     /**
      * 创建时间
      */

+ 15 - 15
fs-service/src/main/java/com/fs/course/service/impl/FsUserCompanyUserServiceImpl.java

@@ -90,11 +90,11 @@ public class FsUserCompanyUserServiceImpl extends ServiceImpl<FsUserCompanyUserM
                         old.getId(), old.getUserId(), old.getCompanyUserId(), old.getProjectId(),
                         old.getStatus(), fsUserCompanyUser.getStatus(),
                         Thread.currentThread().getStackTrace()[2]);
-                // status=2拉黑时,在remark中追加拉黑信息
-                if (fsUserCompanyUser.getStatus() == 2) {
-                    String blackRemark = "系统拉黑(原status=" + old.getStatus() + ")";
-                    String originRemark = fsUserCompanyUser.getRemark() != null ? fsUserCompanyUser.getRemark() : (old.getRemark() != null ? old.getRemark() : "");
-                    fsUserCompanyUser.setRemark(originRemark + (originRemark.isEmpty() ? "" : "|") + blackRemark);
+                // status=2拉黑时,在blacklistInfo中追加拉黑信息(防重复:已拉黑不再追加)
+                if (fsUserCompanyUser.getStatus() == 2 && old.getStatus() != 2) {
+                    String blackInfo = "系统拉黑(原status=" + old.getStatus() + ")";
+                    String originBlackInfo = old.getBlacklistInfo() != null ? old.getBlacklistInfo() : "";
+                    fsUserCompanyUser.setBlacklistInfo(originBlackInfo + (originBlackInfo.isEmpty() ? "" : "|") + blackInfo);
                 }
             }
         }
@@ -241,16 +241,16 @@ public class FsUserCompanyUserServiceImpl extends ServiceImpl<FsUserCompanyUserM
         }
         log.info("[fs_user_company_user] batchUpdateUserProjectStatus | status={}, ids={}, operatorInfo={}, 调用来源={}",
                 status, ids, operatorInfo, Thread.currentThread().getStackTrace()[2]);
-        // status=2拉黑时,逐条追加拉黑备注
+        // status=2拉黑时,逐条追加拉黑信息到blacklistInfo(防重复:已经是拉黑状态的跳过)
         if (status == 2) {
-            String blackRemark = (operatorInfo != null ? operatorInfo : "系统") + "拉黑";
+            String blackInfo = (operatorInfo != null ? operatorInfo : "系统") + " 拉黑";
             for (UserProjectDTO dto : ids) {
                 FsUserCompanyUser old = selectByUserIdAndProjectId(dto.getUserId(), dto.getProjectId());
-                if (old != null) {
-                    String originRemark = old.getRemark() != null ? old.getRemark() : "";
+                if (old != null && old.getStatus() != 2) {
+                    String originBlackInfo = old.getBlacklistInfo() != null ? old.getBlacklistInfo() : "";
                     FsUserCompanyUser update = new FsUserCompanyUser();
                     update.setId(old.getId());
-                    update.setRemark(originRemark + (originRemark.isEmpty() ? "" : "|") + blackRemark);
+                    update.setBlacklistInfo(originBlackInfo + (originBlackInfo.isEmpty() ? "" : "|") + blackInfo);
                     baseMapper.updateFsUserCompanyUser(update);
                 }
             }
@@ -285,16 +285,16 @@ public class FsUserCompanyUserServiceImpl extends ServiceImpl<FsUserCompanyUserM
         }
         log.info("[fs_user_company_user] batchUpdateStatus | status={}, ids={}, operatorInfo={}, 调用来源={}",
                 status, ids, operatorInfo, Thread.currentThread().getStackTrace()[2]);
-        // status=2拉黑时,逐条追加拉黑备注
+        // status=2拉黑时,逐条追加拉黑信息到blacklistInfo(防重复:已经是拉黑状态的跳过)
         if (status == 2) {
-            String blackRemark = (operatorInfo != null ? operatorInfo : "系统") + "拉黑";
+            String blackInfo = (operatorInfo != null ? operatorInfo : "系统") + " 拉黑";
             for (Long id : ids) {
                 FsUserCompanyUser old = baseMapper.selectFsUserCompanyUserById(id);
-                if (old != null) {
-                    String originRemark = old.getRemark() != null ? old.getRemark() : "";
+                if (old != null && old.getStatus() != 2) {
+                    String originBlackInfo = old.getBlacklistInfo() != null ? old.getBlacklistInfo() : "";
                     FsUserCompanyUser update = new FsUserCompanyUser();
                     update.setId(old.getId());
-                    update.setRemark(originRemark + (originRemark.isEmpty() ? "" : "|") + blackRemark);
+                    update.setBlacklistInfo(originBlackInfo + (originBlackInfo.isEmpty() ? "" : "|") + blackInfo);
                     baseMapper.updateFsUserCompanyUser(update);
                 }
             }

+ 4 - 0
fs-service/src/main/java/com/fs/hisStore/domain/FsUserCompanyUserScrm.java

@@ -68,6 +68,10 @@ public class FsUserCompanyUserScrm {
      * 备注
      */
     private String remark;
+    /**
+     * 拉黑信息(记录拉黑操作人及原因,对客户不可见)
+     */
+    private String blacklistInfo;
     /**
      * 创建时间
      */

+ 15 - 15
fs-service/src/main/java/com/fs/hisStore/service/impl/FsUserCompanyUserScrmServiceImpl.java

@@ -90,11 +90,11 @@ public class FsUserCompanyUserScrmServiceImpl extends ServiceImpl<FsUserCompanyU
                         old.getId(), old.getUserId(), old.getCompanyUserId(), old.getProjectId(),
                         old.getStatus(), fsUserCompanyUser.getStatus(),
                         Thread.currentThread().getStackTrace()[2]);
-                // status=2拉黑时,在remark中追加拉黑信息
-                if (fsUserCompanyUser.getStatus() == 2) {
-                    String blackRemark = "系统拉黑(原status=" + old.getStatus() + ")";
-                    String originRemark = fsUserCompanyUser.getRemark() != null ? fsUserCompanyUser.getRemark() : (old.getRemark() != null ? old.getRemark() : "");
-                    fsUserCompanyUser.setRemark(originRemark + (originRemark.isEmpty() ? "" : "|") + blackRemark);
+                // status=2拉黑时,在blacklistInfo中追加拉黑信息(防重复:已拉黑不再追加)
+                if (fsUserCompanyUser.getStatus() == 2 && old.getStatus() != 2) {
+                    String blackInfo = "系统拉黑(原status=" + old.getStatus() + ")";
+                    String originBlackInfo = old.getBlacklistInfo() != null ? old.getBlacklistInfo() : "";
+                    fsUserCompanyUser.setBlacklistInfo(originBlackInfo + (originBlackInfo.isEmpty() ? "" : "|") + blackInfo);
                 }
             }
         }
@@ -246,16 +246,16 @@ public class FsUserCompanyUserScrmServiceImpl extends ServiceImpl<FsUserCompanyU
         }
         log.info("[fs_user_company_user] Scrm batchUpdateUserProjectStatus | status={}, ids={}, operatorInfo={}, 调用来源={}",
                 status, ids, operatorInfo, Thread.currentThread().getStackTrace()[2]);
-        // status=2拉黑时,逐条追加拉黑备注
+        // status=2拉黑时,逐条追加拉黑信息到blacklistInfo(防重复:已经是拉黑状态的跳过)
         if (status == 2) {
-            String blackRemark = (operatorInfo != null ? operatorInfo : "系统") + "拉黑";
+            String blackInfo = (operatorInfo != null ? operatorInfo : "系统") + " 拉黑";
             for (UserProjectDTO dto : ids) {
                 FsUserCompanyUserScrm old = selectByUserIdAndProjectId(dto.getUserId(), dto.getProjectId());
-                if (old != null) {
-                    String originRemark = old.getRemark() != null ? old.getRemark() : "";
+                if (old != null && old.getStatus() != 2) {
+                    String originBlackInfo = old.getBlacklistInfo() != null ? old.getBlacklistInfo() : "";
                     FsUserCompanyUserScrm update = new FsUserCompanyUserScrm();
                     update.setId(old.getId());
-                    update.setRemark(originRemark + (originRemark.isEmpty() ? "" : "|") + blackRemark);
+                    update.setBlacklistInfo(originBlackInfo + (originBlackInfo.isEmpty() ? "" : "|") + blackInfo);
                     baseMapper.updateFsUserCompanyUser(update);
                 }
             }
@@ -290,16 +290,16 @@ public class FsUserCompanyUserScrmServiceImpl extends ServiceImpl<FsUserCompanyU
         }
         log.info("[fs_user_company_user] Scrm batchUpdateStatus | status={}, ids={}, operatorInfo={}, 调用来源={}",
                 status, ids, operatorInfo, Thread.currentThread().getStackTrace()[2]);
-        // status=2拉黑时,逐条追加拉黑备注
+        // status=2拉黑时,逐条追加拉黑信息到blacklistInfo(防重复:已经是拉黑状态的跳过)
         if (status == 2) {
-            String blackRemark = (operatorInfo != null ? operatorInfo : "系统") + "拉黑";
+            String blackInfo = (operatorInfo != null ? operatorInfo : "系统") + " 拉黑";
             for (Long id : ids) {
                 FsUserCompanyUserScrm old = baseMapper.selectFsUserCompanyUserById(id);
-                if (old != null) {
-                    String originRemark = old.getRemark() != null ? old.getRemark() : "";
+                if (old != null && old.getStatus() != 2) {
+                    String originBlackInfo = old.getBlacklistInfo() != null ? old.getBlacklistInfo() : "";
                     FsUserCompanyUserScrm update = new FsUserCompanyUserScrm();
                     update.setId(old.getId());
-                    update.setRemark(originRemark + (originRemark.isEmpty() ? "" : "|") + blackRemark);
+                    update.setBlacklistInfo(originBlackInfo + (originBlackInfo.isEmpty() ? "" : "|") + blackInfo);
                     baseMapper.updateFsUserCompanyUser(update);
                 }
             }

+ 1 - 1
fs-service/src/main/java/com/fs/im/service/impl/OpenIMServiceImpl.java

@@ -604,7 +604,7 @@ public class OpenIMServiceImpl implements OpenIMService {
                 update.setStatus(2);
                 update.setUserId(userId);
                 update.setCompanyUserId(companyUserId);
-                update.setRemark(remark + "|IM删除好友拉黑");
+                update.setRemark(remark + "|IM删除好友 拉黑");
                 log.info("[fs_user_company_user] IM删除好友触发拉黑 | userId={}, companyUserId={}, remark={}, 调用来源={}",
                         userId, companyUserId, remark, Thread.currentThread().getStackTrace()[2]);
                 fsUserCompanyUserMapper.updateFriendStatus(update);

+ 8 - 1
fs-service/src/main/resources/mapper/course/FsUserCompanyUserMapper.xml

@@ -16,11 +16,12 @@
         <result property="qwCompanyId"    column="qw_company_id"    />
         <result property="status"    column="status"    />
         <result property="remark"    column="remark"    />
+        <result property="blacklistInfo"    column="blacklist_info"    />
         <result property="createTime"    column="create_time"    />
     </resultMap>
 
     <sql id="selectFsUserCompanyUserVo">
-        select id, user_id, company_user_id, company_id, is_repeat_fans, project_id, qw_user_id, qw_external_contact_id, qw_company_id, `status`, remark, create_time from fs_user_company_user
+        select id, user_id, company_user_id, company_id, is_repeat_fans, project_id, qw_user_id, qw_external_contact_id, qw_company_id, `status`, remark, blacklist_info, create_time from fs_user_company_user
     </sql>
 
     <select id="selectFsUserCompanyUserList" parameterType="FsUserCompanyUser" resultMap="FsUserCompanyUserResult">
@@ -59,6 +60,7 @@
             <if test="qwCompanyId != null">qw_company_id,</if>
             <if test="status != null">`status`,</if>
             <if test="remark != null">remark,</if>
+            <if test="blacklistInfo != null">blacklist_info,</if>
             <if test="createTime != null">create_time,</if>
         </trim>
         <trim prefix="values (" suffix=")" suffixOverrides=",">
@@ -73,6 +75,7 @@
             <if test="qwCompanyId != null">#{qwCompanyId},</if>
             <if test="status != null">#{status},</if>
             <if test="remark != null">#{remark},</if>
+            <if test="blacklistInfo != null">#{blacklistInfo},</if>
             <if test="createTime != null">#{createTime},</if>
         </trim>
     </insert>
@@ -90,6 +93,7 @@
             <if test="qwCompanyId != null">qw_company_id = #{qwCompanyId},</if>
             <if test="status != null">`status` = #{status},</if>
             <if test="remark != null">remark = #{remark},</if>
+            <if test="blacklistInfo != null">blacklist_info = #{blacklistInfo},</if>
             <if test="createTime != null">create_time = #{createTime},</if>
         </trim>
         where id = #{id}
@@ -282,6 +286,9 @@
             <if test="remark != null">
                 remark = #{remark},
             </if>
+            <if test="blacklistInfo != null">
+                blacklist_info = #{blacklistInfo},
+            </if>
         </set>
         where user_id = #{userId} and company_user_id = #{companyUserId}
     </update>

+ 5 - 1
fs-service/src/main/resources/mapper/hisStore/FsUserCompanyUserScrmMapper.xml

@@ -16,11 +16,12 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         <result property="qwCompanyId"    column="qw_company_id"    />
         <result property="status"    column="status"    />
         <result property="remark"    column="remark"    />
+        <result property="blacklistInfo"    column="blacklist_info"    />
         <result property="createTime"    column="create_time"    />
     </resultMap>
 
     <sql id="selectFsUserCompanyUserVo">
-        select id, user_id, company_user_id, company_id, is_repeat_fans, project_id, qw_user_id, qw_external_contact_id, qw_company_id, `status`, remark, create_time from fs_user_company_user
+        select id, user_id, company_user_id, company_id, is_repeat_fans, project_id, qw_user_id, qw_external_contact_id, qw_company_id, `status`, remark, blacklist_info, create_time from fs_user_company_user
     </sql>
 
     <select id="selectFsUserCompanyUserList" parameterType="FsUserCompanyUserScrm" resultMap="FsUserCompanyUserResult">
@@ -59,6 +60,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="qwCompanyId != null">qw_company_id,</if>
             <if test="status != null">`status`,</if>
             <if test="remark != null">remark,</if>
+            <if test="blacklistInfo != null">blacklist_info,</if>
             <if test="createTime != null">create_time,</if>
          </trim>
         <trim prefix="values (" suffix=")" suffixOverrides=",">
@@ -73,6 +75,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="qwCompanyId != null">#{qwCompanyId},</if>
             <if test="status != null">#{status},</if>
             <if test="remark != null">#{remark},</if>
+            <if test="blacklistInfo != null">#{blacklistInfo},</if>
             <if test="createTime != null">#{createTime},</if>
          </trim>
     </insert>
@@ -90,6 +93,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="qwCompanyId != null">qw_company_id = #{qwCompanyId},</if>
             <if test="status != null">`status` = #{status},</if>
             <if test="remark != null">remark = #{remark},</if>
+            <if test="blacklistInfo != null">blacklist_info = #{blacklistInfo},</if>
             <if test="createTime != null">create_time = #{createTime},</if>
         </trim>
         where id = #{id}