ソースを参照

Merge branch 'fu-dev' of uskycloud/usky-cloud into master

gez 1 日 前
コミット
02d9877423
18 ファイル変更414 行追加163 行削除
  1. 23 2
      base-modules/service-system/service-system-api/src/main/java/com/usky/system/domain/MceRequestVO.java
  2. 13 0
      base-modules/service-system/service-system-api/src/main/java/com/usky/system/domain/SysUserVO.java
  3. 38 28
      base-modules/service-system/service-system-biz/src/main/java/com/usky/system/controller/web/SysProfileController.java
  4. 12 8
      base-modules/service-system/service-system-biz/src/main/java/com/usky/system/controller/web/SysUserController.java
  5. 21 3
      base-modules/service-system/service-system-biz/src/main/java/com/usky/system/controller/web/SysUserPersonController.java
  6. 15 0
      base-modules/service-system/service-system-biz/src/main/java/com/usky/system/domain/SysUser.java
  7. 6 0
      base-modules/service-system/service-system-biz/src/main/java/com/usky/system/domain/SysUserPerson.java
  8. 2 1
      base-modules/service-system/service-system-biz/src/main/java/com/usky/system/mapper/SysPostMapper.java
  9. 2 1
      base-modules/service-system/service-system-biz/src/main/java/com/usky/system/mapper/SysRoleMapper.java
  10. 1 0
      base-modules/service-system/service-system-biz/src/main/java/com/usky/system/service/SysUserPersonService.java
  11. 20 3
      base-modules/service-system/service-system-biz/src/main/java/com/usky/system/service/impl/MceMbuserServiceImpl.java
  12. 197 111
      base-modules/service-system/service-system-biz/src/main/java/com/usky/system/service/impl/MceReceiveServiceImpl.java
  13. 35 0
      base-modules/service-system/service-system-biz/src/main/java/com/usky/system/service/impl/SysUserPersonServiceImpl.java
  14. 5 2
      base-modules/service-system/service-system-biz/src/main/java/com/usky/system/service/impl/SysUserServiceImpl.java
  15. 16 0
      base-modules/service-system/service-system-biz/src/main/java/com/usky/system/service/vo/SendWeChatMessageRequestVO.java
  16. 2 1
      base-modules/service-system/service-system-biz/src/main/resources/mapper/system/SysPostMapper.xml
  17. 5 3
      base-modules/service-system/service-system-biz/src/main/resources/mapper/system/SysRoleMapper.xml
  18. 1 0
      base-modules/service-system/service-system-biz/src/main/resources/mapper/system/SysUserPersonMapper.xml

+ 23 - 2
base-modules/service-system/service-system-api/src/main/java/com/usky/system/domain/MceRequestVO.java

@@ -9,6 +9,7 @@ import lombok.extern.slf4j.Slf4j;
 
 import javax.validation.constraints.NotBlank;
 import javax.validation.constraints.NotNull;
+import java.time.LocalDateTime;
 import java.util.List;
 
 /**
@@ -20,7 +21,7 @@ import java.util.List;
 @EqualsAndHashCode(callSuper = true)
 @Slf4j
 @Data
-public class MceRequestVO  extends BaseEntity {
+public class MceRequestVO extends BaseEntity {
 
     /** 字典标签  */
     private String infoTypeName;
@@ -89,7 +90,27 @@ public class MceRequestVO  extends BaseEntity {
     /**
      * oa跳转类型 (todo我的待办、me我发起的、copy抄送我的)
      */
-    String oaType;
+    private String oaType;
+
+    /**
+     * 设备id
+     */
+    private String deviceId;
+
+    /**
+     * 报警时间
+     */
+    private String alarmTime;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+    /**
+     * 报警发送方式(站内消息通知是默认的,1:APP,2:微信)
+     */
+    private String alarmSendType;
 
     @Override
     public String toString() {

+ 13 - 0
base-modules/service-system/service-system-api/src/main/java/com/usky/system/domain/SysUserVO.java

@@ -133,6 +133,19 @@ public class SysUserVO extends BaseEntity {
      */
     private String fullName;
 
+    /**
+     * 是否打开登录通知(1 表示是,0 表示否,默认 0)
+     */
+    private Integer isLoginNotify;
+
+    public Integer getIsLoginNotify() {
+        return isLoginNotify;
+    }
+
+    public void setIsLoginNotify(Integer isLoginNotify) {
+        this.isLoginNotify = isLoginNotify;
+    }
+
     public String getAddress() {
         return address;
     }

+ 38 - 28
base-modules/service-system/service-system-biz/src/main/java/com/usky/system/controller/web/SysProfileController.java

@@ -7,10 +7,12 @@ import com.usky.common.core.util.StringUtils;
 import com.usky.common.security.service.TokenService;
 import com.usky.common.security.utils.SecurityUtils;
 import com.usky.system.domain.SysUser;
+import com.usky.system.domain.SysUserPerson;
 import com.usky.system.domain.SysUserVO;
 import com.usky.system.domain.constants.UserConstants;
 import com.usky.system.model.LoginUser;
 import com.usky.system.service.ISysUserService;
+import com.usky.system.service.SysUserPersonService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 
@@ -21,29 +23,37 @@ import java.util.Map;
 
 /**
  * 个人信息 业务处理
- * 
+ *
  * @author yq
  */
 @RestController
 @RequestMapping("/user/profile")
-public class SysProfileController extends BaseController
-{
+public class SysProfileController extends BaseController {
     @Autowired
     private ISysUserService userService;
 
     @Autowired
     private TokenService tokenService;
 
+    @Autowired
+    private SysUserPersonService sysUserPersonService;
+
     /**
      * 个人信息
      */
     @GetMapping
-    public ApiResult profile()
-    {
+    public ApiResult profile() {
         LoginUser loginUser = SecurityUtils.getLoginUser();
         SysUserVO user = loginUser.getSysUser();
-        Map<String,Object> map = new HashMap<>();
-        map.put("user",user);
+
+        SysUserPerson one = sysUserPersonService.lambdaQuery()
+                .eq(SysUserPerson::getUserId, user.getUserId())
+                .select(SysUserPerson::getIsLoginNotify)
+                .one();
+        user.setIsLoginNotify(one.getIsLoginNotify());
+
+        Map<String, Object> map = new HashMap<>();
+        map.put("user", user);
         map.put("roleGroup", userService.selectUserRoleGroup(loginUser.getUsername()));
         map.put("postGroup", userService.selectUserPostGroup(loginUser.getUsername()));
         return ApiResult.success(map);
@@ -53,24 +63,30 @@ public class SysProfileController extends BaseController
      * 修改用户
      */
     @PutMapping
-    public ApiResult updateProfile(@RequestBody SysUser user)
-    {
+    public ApiResult updateProfile(@RequestBody SysUser user) {
         if (StringUtils.isNotEmpty(user.getPhonenumber())
-                && UserConstants.NOT_UNIQUE.equals(userService.checkPhoneUnique(user)))
-        {
+                && UserConstants.NOT_UNIQUE.equals(userService.checkPhoneUnique(user))) {
             throw new BusinessException("修改用户'" + user.getUserName() + "'失败,手机号码已存在");
         }
         if (StringUtils.isNotEmpty(user.getEmail())
-                && UserConstants.NOT_UNIQUE.equals(userService.checkEmailUnique(user)))
-        {
+                && UserConstants.NOT_UNIQUE.equals(userService.checkEmailUnique(user))) {
             throw new BusinessException("修改用户'" + user.getUserName() + "'失败,邮箱账号已存在");
         }
         LoginUser loginUser = SecurityUtils.getLoginUser();
         SysUserVO sysUser = loginUser.getSysUser();
         user.setUserId(sysUser.getUserId());
         user.setPassword(null);
-        if (userService.updateUserProfile(user) > 0)
-        {
+        if (userService.updateUserProfile(user) > 0) {
+
+            // 更新登录通知设置
+            Integer isLoginNotify = user.getIsLoginNotify();
+            if (isLoginNotify != null) {
+                sysUserPersonService.lambdaUpdate()
+                        .eq(SysUserPerson::getUserId, sysUser.getUserId())
+                        .set(SysUserPerson::getIsLoginNotify, isLoginNotify)
+                        .update();
+            }
+
             // 更新缓存用户信息
             sysUser.setNickName(user.getNickName());
             sysUser.setPhonenumber(user.getPhonenumber());
@@ -86,22 +102,18 @@ public class SysProfileController extends BaseController
      * 重置密码
      */
     @PutMapping("/updatePwd")
-    public ApiResult updatePwd(String oldPassword, String newPassword)
-    {
+    public ApiResult updatePwd(String oldPassword, String newPassword) {
         LoginUser loginUser = SecurityUtils.getLoginUser();
         SysUserVO sysUser = loginUser.getSysUser();
         String userName = sysUser.getUserName();
         String password = sysUser.getPassword();
-        if (!SecurityUtils.matchesPassword(oldPassword, password))
-        {
+        if (!SecurityUtils.matchesPassword(oldPassword, password)) {
             throw new BusinessException("修改密码失败,旧密码错误");
         }
-        if (SecurityUtils.matchesPassword(newPassword, password))
-        {
+        if (SecurityUtils.matchesPassword(newPassword, password)) {
             throw new BusinessException("新密码不能与旧密码相同");
         }
-        if (userService.resetUserPwd(userName, SecurityUtils.encryptPassword(newPassword)) > 0)
-        {
+        if (userService.resetUserPwd(userName, SecurityUtils.encryptPassword(newPassword)) > 0) {
             // 更新缓存用户密码
             sysUser.setPassword(SecurityUtils.encryptPassword(newPassword));
             tokenService.setLoginUser(loginUser);
@@ -114,13 +126,11 @@ public class SysProfileController extends BaseController
      * 头像上传
      */
     @PostMapping("/avatar")
-    public ApiResult avatar(@RequestParam String filePath) throws IOException
-    {
+    public ApiResult avatar(@RequestParam String filePath) throws IOException {
         LoginUser loginUser = SecurityUtils.getLoginUser();
         SysUserVO sysUser = loginUser.getSysUser();
-        if (userService.updateUserAvatar(loginUser.getUsername(), filePath))
-        {
-            Map<String,Object> map = new HashMap<>();
+        if (userService.updateUserAvatar(loginUser.getUsername(), filePath)) {
+            Map<String, Object> map = new HashMap<>();
             map.put("imgUrl", filePath);
             // 更新缓存用户头像
             sysUser.setAvatar(filePath);

+ 12 - 8
base-modules/service-system/service-system-biz/src/main/java/com/usky/system/controller/web/SysUserController.java

@@ -7,16 +7,10 @@ import com.usky.common.security.utils.SecurityUtils;
 import com.usky.common.core.bean.ApiResult;
 import com.usky.common.core.exception.BusinessErrorCode;
 import com.usky.system.controller.web.page.TableDataInfo;
-import com.usky.system.domain.SysDept;
-import com.usky.system.domain.SysRole;
-import com.usky.system.domain.SysUser;
-import com.usky.system.domain.SysUserTenant;
+import com.usky.system.domain.*;
 import com.usky.system.domain.constants.UserConstants;
 import com.usky.system.mapper.SysUserTenantMapper;
-import com.usky.system.service.ISysDeptService;
-import com.usky.system.service.ISysPostService;
-import com.usky.system.service.ISysRoleService;
-import com.usky.system.service.ISysUserService;
+import com.usky.system.service.*;
 import com.usky.system.service.vo.SysUserNewVO;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.transaction.annotation.Transactional;
@@ -53,6 +47,9 @@ public class SysUserController extends BaseController
     @Autowired
     private SysUserTenantMapper sysUserTenantMapper;
 
+    @Autowired
+    private SysUserPersonService sysUserPersonService;
+
     /**
      * 获取用户列表
      */
@@ -155,6 +152,13 @@ public class SysUserController extends BaseController
         user.setCreateBy(SecurityUtils.getUsername());
         user.setPassword(SecurityUtils.encryptPassword(user.getPassword()));
         int row = userService.insertUser(user);
+
+        // 新增用户登录通知设置
+        SysUserPerson sysUserPerson = new SysUserPerson();
+        sysUserPerson.setUserId(user.getUserId());
+        sysUserPerson.setIsLoginNotify(0);
+        sysUserPersonService.save(sysUserPerson);
+
         return toAjax(row);
     }
 

+ 21 - 3
base-modules/service-system/service-system-biz/src/main/java/com/usky/system/controller/web/SysUserPersonController.java

@@ -1,9 +1,13 @@
 package com.usky.system.controller.web;
 
-
+import com.usky.common.core.bean.ApiResult;
+import com.usky.system.service.SysUserPersonService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PutMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
 
-import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
 
 /**
  * <p>
@@ -13,9 +17,23 @@ import org.springframework.stereotype.Controller;
  * @author JCB
  * @since 2022-08-22
  */
-@Controller
+@RestController
 @RequestMapping("/sysUserPerson")
 public class SysUserPersonController {
 
+    @Autowired
+    private SysUserPersonService sysUserPersonService;
+
+    /**
+     * 修改登录通知开关状态
+     * @param useId 用户id
+     * @param isLoginNotify 1:开启 0:关闭
+     * @return 0:失败
+     */
+    @PutMapping("/upIsLoginNotify")
+    public ApiResult<Integer> upIsLoginNotice(@RequestParam Long userId,
+                                              @RequestParam Integer isLoginNotify) {
+        return ApiResult.success(sysUserPersonService.upIsLoginNotify(userId, isLoginNotify));
+    }
 }
 

+ 15 - 0
base-modules/service-system/service-system-biz/src/main/java/com/usky/system/domain/SysUser.java

@@ -100,6 +100,20 @@ public class SysUser extends BaseEntity
     /** 姓名 */
     private String fullName;
 
+    /**
+     * 是否打开登录通知(1 表示是,0 表示否,默认 0)
+     */
+    @TableField(exist = false)
+    private Integer isLoginNotify;
+
+    public Integer getIsLoginNotify() {
+        return isLoginNotify;
+    }
+
+    public void setIsLoginNotify(Integer isLoginNotify) {
+        this.isLoginNotify = isLoginNotify;
+    }
+
     /** 岗位 */
     @TableField(exist = false)
     private String post;
@@ -391,6 +405,7 @@ public class SysUser extends BaseEntity
             .append("updateTime", getUpdateTime())
             .append("remark", getRemark())
             .append("dept", getDept())
+            .append("isLoginNotify",  getIsLoginNotify())
             .toString();
     }
 }

+ 6 - 0
base-modules/service-system/service-system-biz/src/main/java/com/usky/system/domain/SysUserPerson.java

@@ -1,6 +1,7 @@
 package com.usky.system.domain;
 
 import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableId;
 import java.io.Serializable;
 import lombok.Data;
@@ -36,5 +37,10 @@ public class SysUserPerson implements Serializable {
      */
     private Integer personId;
 
+    /**
+     * 是否打开登录通知(1 表示是,0 表示否,默认 0)
+     */
+    private Integer isLoginNotify;
+
 
 }

+ 2 - 1
base-modules/service-system/service-system-biz/src/main/java/com/usky/system/mapper/SysPostMapper.java

@@ -53,7 +53,8 @@ public interface SysPostMapper extends CrudMapper<SysPost>
      * @param userName 用户名
      * @return 结果
      */
-    public List<SysPost> selectPostsByUserName(@Param("userName") String userName);
+    public List<SysPost> selectPostsByUserName(@Param("userName") String userName,
+                                               @Param("tenantId") Integer tenantId);
 
     /**
      * 删除岗位信息

+ 2 - 1
base-modules/service-system/service-system-biz/src/main/java/com/usky/system/mapper/SysRoleMapper.java

@@ -62,7 +62,8 @@ public interface SysRoleMapper extends CrudMapper<SysRole>
      * @param userName 用户名
      * @return 角色列表
      */
-    public List<SysRole> selectRolesByUserName(@Param("userName") String userName);
+    public List<SysRole> selectRolesByUserName(@Param("userName") String userName,
+                                               @Param("tenantId") Integer tenantId);
 
     /**
      * 校验角色名称是否唯一

+ 1 - 0
base-modules/service-system/service-system-biz/src/main/java/com/usky/system/service/SysUserPersonService.java

@@ -13,4 +13,5 @@ import com.usky.common.mybatis.core.CrudService;
  */
 public interface SysUserPersonService extends CrudService<SysUserPerson> {
 
+    public Integer upIsLoginNotify(Long userId, Integer isLoginNotify);
 }

+ 20 - 3
base-modules/service-system/service-system-biz/src/main/java/com/usky/system/service/impl/MceMbuserServiceImpl.java

@@ -166,10 +166,10 @@ public class MceMbuserServiceImpl extends AbstractCrudService<MceMbuserMapper, M
                 break;
 
             case "2":
-            case "4":
                 TemplateMsgEntityVO messageVo = new TemplateMsgEntityVO();
                 messageVo.setTTitle(infoTitle);
                 messageVo.setTKeyword1(infoContent);
+                messageVo.setTKeyword2(infoType);
                 messageVo.setTKeyword3(LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
                 messageVo.setTRemark(infoContent);
                 /* 设备预警信息提醒
@@ -177,7 +177,7 @@ public class MceMbuserServiceImpl extends AbstractCrudService<MceMbuserMapper, M
                  * 设备号:{{keyword1.DATA}}
                  * 报警类型:{{keyword2.DATA}}
                  * 时间:{{keyword3.DATA}}
-                 * {{remark.DATA}}
+                 * 备注:{{remark.DATA}}
                  **/
                 messageVo.setTemplateId(constant.WE_CHAT_TEMPLATE_ID);
                 data.put("first", new TemplateData(messageVo.getTTitle(), "#44b549"));
@@ -188,9 +188,26 @@ public class MceMbuserServiceImpl extends AbstractCrudService<MceMbuserMapper, M
 
                 templateId = messageVo.getTemplateId();
                 break;
+            case "4":
+                /* 设备预警信息提醒
+                 * {{first.DATA}}
+                 * 设备号:{{keyword1.DATA}}
+                 * 报警类型:{{keyword2.DATA}}
+                 * 时间:{{keyword3.DATA}}
+                 * 备注:{{remark.DATA}}
+                 **/
+                data.put("first", new TemplateData(requestVO.getInfoTitle(), "#44b549"));
+                data.put("keyword1", new TemplateData(requestVO.getDeviceId(), "#173177"));
+                data.put("keyword2", new TemplateData(requestVO.getInfoContent(), "#173177"));
+                data.put("keyword3", new TemplateData(requestVO.getAlarmTime(), "#173177"));
+                data.put("remark", new TemplateData(requestVO.getRemark(), "#173177"));
+
+                // 设置公众号模板消息ID
+                templateId = constant.WE_CHAT_TEMPLATE_ID;
+                break;
         }
 
-        log.info("oaType:{}",oaType);
+        log.info("oaType:{}", oaType);
         // 回调地址
         if ("3".equals(requestVO.getInfoType())) {
             tUrl = String.format(constant.WE_CHAT_CUSTOMER_CALL_URL3, infoType, infoTypeName, infoId, oaType);

+ 197 - 111
base-modules/service-system/service-system-biz/src/main/java/com/usky/system/service/impl/MceReceiveServiceImpl.java

@@ -63,6 +63,9 @@ public class MceReceiveServiceImpl extends AbstractCrudService<MceReceiveMapper,
     @Autowired
     private MceReceiveMapper mceReceiveMapper;
 
+    @Autowired
+    private SysUserPersonService sysUserPersonService;
+
     @Override
     public CommonPage<Object> mceList(String infoTitle, String infoType, String startTime, String endTime, Integer id, Integer infoId, Integer current, Integer size) {
         List<Object> list = new ArrayList<>();
@@ -265,126 +268,161 @@ public class MceReceiveServiceImpl extends AbstractCrudService<MceReceiveMapper,
     @Async
     @Override
     public void addMceReceive(MceRequestVO mceRequestVO) {
+        log.info("本次发送消息内容: {}", mceRequestVO.toString());
 
-        log.info("本次发送消息内容{}", mceRequestVO.toString());
-
-        // 登录成功 infoType 为 0,只给登录用户发送公众号消息
-        if ("0".equals(mceRequestVO.getInfoType())) {
-            List<MceMbuser> mbuserList = mceMbuserService.list(Wrappers.lambdaQuery(MceMbuser.class).in(MceMbuser::getUserId, mceRequestVO.getUserIds()));
-            String openid = mbuserList.get(0).getOpenid();
-            mceContentService.sendAppNew(mceRequestVO, openid, 0, 1);
-            return;
-        }
-
-        // 如果 infoTypeName 为空,则从字典数据中获取
+        // 补充信息类型名称
         if (mceRequestVO.getInfoTypeName() == null) {
             String infoTypeName = sysDictDataService.selectDictLabel("message_type", mceRequestVO.getInfoType());
             mceRequestVO.setInfoTypeName(infoTypeName);
         }
 
-        Integer tenantId = null;
-        try {
-            tenantId = userMapper.selectOne(new LambdaQueryWrapper<SysUser>().eq(SysUser::getUserName, mceRequestVO.getUserName()).select(SysUser::getTenantId)).getTenantId();
-        } catch (Exception e) {
-            log.error("获取用户租户ID失败,报错信息:{}, 未找到用户-{}-的租户", e.getMessage(), mceRequestVO.getUserName());
+        // 获取发送者租户ID
+        Integer tenantId = getUserTenantId(mceRequestVO.getUserName());
+        if (tenantId == null) {
+            log.error("获取用户租户ID失败,未找到用户: {}", mceRequestVO.getUserName());
             return;
         }
 
-        // 获取当前租户的所有用户
-        List<SysUser> userList = userMapper.tenantIdUserList(tenantId);
-        if (CollectionUtils.isEmpty(userList)) {
+        // 获取租户所有用户信息
+        List<SysUser> allUsers = userMapper.tenantIdUserList(tenantId);
+        if (CollectionUtils.isEmpty(allUsers)) {
+            log.warn("租户下未找到任何用户,租户ID: {}", tenantId);
             return;
         }
 
-        // 获取用户昵称与真实姓名的映射
-        Map<String, String> userNameNickNameMap = userList.stream()
+        // 构建用户信息映射
+        Map<Long, SysUser> userIdToUserMap = allUsers.stream()
+                .collect(Collectors.toMap(SysUser::getUserId, user -> user));
+
+        Map<String, String> userNameToNickNameMap = allUsers.stream()
                 .collect(Collectors.toMap(SysUser::getUserName, SysUser::getNickName));
 
-        LocalDateTime currentTime = LocalDateTime.now();
-        List<Long> userIdList = new ArrayList<>();
-        Integer generatedContentId = null;
-
-        // 遍历用户列表,处理消息内容
-        for (SysUser user : userList) {
-            userIdList.add(user.getUserId());
-            if (mceRequestVO.getUserName().equals(user.getUserName())) {
-                MceContent contentEntity = new MceContent();
-                contentEntity.setInfoTitle(mceRequestVO.getInfoTitle());
-                contentEntity.setInfoContent(mceRequestVO.getInfoContent());
-                contentEntity.setInfoType(mceRequestVO.getInfoType());
-                contentEntity.setCreateBy(user.getUserName());
-                contentEntity.setCreateTime(currentTime);
-                contentEntity.setDeptId(user.getDeptId().intValue());
-                contentEntity.setTenantId(user.getTenantId());
-                boolean save = mceContentService.save(contentEntity);
-                if (!save) {
-                    log.error("消息内容保存失败,用户:{},消息内容:{}", user.getUserName(), contentEntity);
-                    continue;
-                }
-                generatedContentId = contentEntity.getId();
-            }
+        // 保存消息内容
+        Integer contentId = saveMessageContent(mceRequestVO, userIdToUserMap);
+        if (contentId == null) {
+            log.error("消息内容保存失败,用户: {}", mceRequestVO.getUserName());
+            return;
         }
 
-
-        // 筛选符合用户ID条件的用户
+        // 筛选目标用户
         List<Long> targetUserIds = mceRequestVO.getUserIds();
-        userIdList.retainAll(targetUserIds);
+        List<Long> validUserIds = allUsers.stream()
+                .map(SysUser::getUserId)
+                .filter(targetUserIds::contains)
+                .collect(Collectors.toList());
+
+        if (CollectionUtils.isEmpty(validUserIds)) {
+            log.error("用户: {} 发送的{},id: {},抄送用户均不存在!消息发送终止",
+                    mceRequestVO.getUserName(), mceRequestVO.getInfoTypeName(), mceRequestVO.getId());
+            return;
+        }
+
+        // 获取用户消息配置
+        List<MceMbuser> mbUserList = mceMbuserService.list(Wrappers.lambdaQuery(MceMbuser.class)
+                .in(MceMbuser::getUserId, validUserIds));
+
+        if (CollectionUtils.isEmpty(mbUserList)) {
+            log.error("消息配置为空!用户id列表为: {},id: {},消息发送终止", validUserIds, mceRequestVO.getId());
+            return;
+        }
+
+        // 构建用户ID到消息配置的映射
+        Map<Long, MceMbuser> userIdToMbUserMap = mbUserList.stream()
+                .collect(Collectors.toMap(MceMbuser::getUserId, mbUser -> mbUser));
+
+        // 获取消息发送设置
+        List<MceSetting> settings = mceSettingService.list(Wrappers.lambdaQuery(MceSetting.class)
+                .eq(MceSetting::getCreateBy, mceRequestVO.getUserName()));
 
-        if (CollectionUtils.isEmpty(userIdList)) {
-            log.error("用户:" + mceRequestVO.getUserName() +
-                    ",发送的" + mceRequestVO.getInfoTypeName() +
-                    ",id:" + mceRequestVO.getId() +
-                    ",抄送用户均未找到消息配置,消息发送终止");
+        if (CollectionUtils.isEmpty(settings)) {
+            log.warn("未找到消息发送设置,用户: {}", mceRequestVO.getUserName());
             return;
         }
 
-        // 查询符合条件的 MceMbuser 列表
-        List<MceMbuser> mbUserList = mceMbuserService.list(Wrappers.lambdaQuery(MceMbuser.class).in(MceMbuser::getUserId, userIdList));
+        MceSetting setting = settings.get(0);
+        JSONObject appMode = JSONObject.parseObject(setting.getAppMode());
+        JSONObject wcMode = JSONObject.parseObject(setting.getWcMode());
 
-        // 遍历用户列表,处理消息接收记录
-        for (Long userId : userIdList) {
-            if (CollectionUtils.isEmpty(mbUserList)) {
+        // 处理每个目标用户的消息接收和发送
+        for (Long userId : validUserIds) {
+            SysUser user = userIdToUserMap.get(userId);
+            if (user == null) {
                 continue;
             }
 
-            Optional<MceMbuser> mbUserOptional = mbUserList.stream()
-                    .filter(mbUser -> mbUser.getUserId().equals(userId))
-                    .findFirst();
-
-            for (SysUser user : userList) {
-                if (user.getUserId().equals(userId)) {
-                    // 创建消息接收记录
-                    List<MceSetting> setting = mceSettingService.list(Wrappers.lambdaQuery(MceSetting.class).eq(MceSetting::getCreateBy, user.getUserName()));
-                    Integer receiveId = 0;
-                    if (CollectionUtils.isNotEmpty(setting)) {
-                        MceReceive mceReceive = createMceReceive(user, generatedContentId, mceRequestVO, userNameNickNameMap);
-                        this.save(mceReceive);
-                        receiveId = mceReceive.getId();
-                    }
+            // 创建消息接收记录
+            MceReceive mceReceive = createMceReceive(user, contentId, mceRequestVO, userNameToNickNameMap);
+            boolean saveResult = this.save(mceReceive);
+            if (!saveResult) {
+                log.error("创建消息接收记录失败,用户ID: {}", userId);
+                continue;
+            }
 
-                    if (mbUserOptional.isPresent()) {
-                        MceMbuser mbUser = mbUserOptional.get();
-                        // 处理消息发送设置
-                        handleMessageSettings(mbUser, mceRequestVO, receiveId);
-                    }
-                }
+            // 获取用户消息配置
+            MceMbuser mbUser = userIdToMbUserMap.get(userId);
+            if (mbUser == null) {
+                continue;
             }
+
+            // 根据消息类型处理消息发送
+            handleMessageDelivery(mbUser, mceRequestVO, mceReceive.getId(), appMode, wcMode);
+        }
+    }
+
+    /**
+     * 获取用户租户ID
+     */
+    private Integer getUserTenantId(String userName) {
+        try {
+            SysUser user = userMapper.selectOne(new LambdaQueryWrapper<SysUser>()
+                    .eq(SysUser::getUserName, userName)
+                    .select(SysUser::getTenantId));
+            return user != null ? user.getTenantId() : null;
+        } catch (Exception e) {
+            log.error("获取用户租户ID失败,报错信息:{}", e.getMessage(), e);
+            return null;
         }
     }
 
-    // 创建消息接收记录
-    private MceReceive createMceReceive(SysUser user, Integer generatedContentId, MceRequestVO mceRequestVO, Map<String, String> userNameNickNameMap) {
+    /**
+     * 保存消息内容
+     */
+    private Integer saveMessageContent(MceRequestVO mceRequestVO, Map<Long, SysUser> userIdToUserMap) {
+        SysUser sender = userIdToUserMap.values().stream()
+                .filter(user -> mceRequestVO.getUserName().equals(user.getUserName()))
+                .findFirst()
+                .orElse(null);
+
+        if (sender == null) {
+            log.error("未找到发送者信息,用户名: {}", mceRequestVO.getUserName());
+            return null;
+        }
+
+        MceContent contentEntity = new MceContent();
+        contentEntity.setInfoTitle(mceRequestVO.getInfoTitle());
+        contentEntity.setInfoContent(mceRequestVO.getInfoContent());
+        contentEntity.setInfoType(mceRequestVO.getInfoType());
+        contentEntity.setCreateBy(sender.getUserName());
+        contentEntity.setCreateTime(LocalDateTime.now());
+        contentEntity.setDeptId(sender.getDeptId().intValue());
+        contentEntity.setTenantId(sender.getTenantId());
+
+        boolean saveResult = mceContentService.save(contentEntity);
+        return saveResult ? contentEntity.getId() : null;
+    }
+
+    /**
+     * 创建消息接收记录
+     */
+    private MceReceive createMceReceive(SysUser user, Integer contentId, MceRequestVO mceRequestVO,
+                                        Map<String, String> userNameToNickNameMap) {
         MceReceive mceReceive = new MceReceive();
         mceReceive.setReceiverId(user.getUserId().intValue());
-        mceReceive.setContentId(generatedContentId);
+        mceReceive.setContentId(contentId);
         mceReceive.setReadFlag(0);
         mceReceive.setInfoType(mceRequestVO.getInfoType());
         mceReceive.setModuleId(mceRequestVO.getId());
-
-        String userName = mceRequestVO.getUserName();
-        String nickName = userNameNickNameMap.get(userName);
-        mceReceive.setIssuerName(nickName);
-
+        mceReceive.setIssuerName(userNameToNickNameMap.get(mceRequestVO.getUserName()));
         mceReceive.setReceiverName(user.getUserName());
         mceReceive.setCreateBy(mceRequestVO.getUserName());
         mceReceive.setCreateTime(LocalDateTime.now());
@@ -393,41 +431,89 @@ public class MceReceiveServiceImpl extends AbstractCrudService<MceReceiveMapper,
         return mceReceive;
     }
 
-    // 处理消息发送设置
-    private void handleMessageSettings(MceMbuser mbUser, MceRequestVO mceRequestVO, Integer mceReceiveId) {
-        List<MceSetting> settingList = mceSettingService.list(Wrappers.lambdaQuery(MceSetting.class).eq(MceSetting::getCreateBy, mceRequestVO.getUserName()));
+    /**
+     * 处理消息发送
+     */
+    private void handleMessageDelivery(MceMbuser mbUser, MceRequestVO mceRequestVO,
+                                       Integer mceReceiveId, JSONObject appMode, JSONObject wcMode) {
+        String infoType = mceRequestVO.getInfoType();
+
+        // 登录成功通知只给登录用户发送微信公众号消息
+        if ("0".equals(infoType)) {
+            SysUserPerson one = sysUserPersonService.lambdaQuery().select(SysUserPerson::getIsLoginNotify).eq(SysUserPerson::getUserId, mbUser.getUserId()).one();
+            Integer isLoginNotify = one.getIsLoginNotify();
+            if (isLoginNotify == 1) {
+                sendWeChatMessage(mbUser, mceRequestVO, wcMode, infoType, mceReceiveId);
+            }
+            return;
+        }
 
-        if (CollectionUtils.isNotEmpty(settingList)) {
-            MceSetting setting = settingList.get(0);
-            JSONObject appMode = JSONObject.parseObject(setting.getAppMode());
-            JSONObject wcMode = JSONObject.parseObject(setting.getWcMode());
+        // 处理告警消息
+        if ("4".equals(infoType)) {
+            handleAlarmMessage(mbUser, mceRequestVO, mceReceiveId, appMode, wcMode, infoType);
+            return;
+        }
 
-            String infoType = mceRequestVO.getInfoType();
+        // 处理普通消息(默认APP和微信都通知)
+        handleNormalMessage(mbUser, mceRequestVO, mceReceiveId, appMode, wcMode, infoType);
+    }
 
-            // 处理应用消息发送
-            if (appMode.getBoolean(infoType)) {
-                if (mbUser.getCids() != null) {
-                    try {
-                        mceContentService.sendAppNew(mceRequestVO, mbUser.getCids(), 0, 0);
-                    } catch (Exception e) {
-                        log.error("为用户ID: {} 发送应用消息失败,错误信息: {}", mbUser.getUserId(), e.getMessage(), e);
-                    }
-                }
+    /**
+     * 处理告警消息
+     */
+    private void handleAlarmMessage(MceMbuser mbUser, MceRequestVO mceRequestVO, Integer mceReceiveId,
+                                    JSONObject appMode, JSONObject wcMode, String infoType) {
+        String alarmSendType = mceRequestVO.getAlarmSendType();
+        switch (alarmSendType) {
+            case "1":
+                sendAppMessage(mbUser, mceRequestVO, appMode, infoType);
+                break;
+            case "2":
+                sendWeChatMessage(mbUser, mceRequestVO, wcMode, infoType, mceReceiveId);
+                break;
+            default:
+                log.error("未知的告警发送类型: {}", alarmSendType);
+                break;
+        }
+    }
+
+    /**
+     * 发送普通消息
+     */
+    private void handleNormalMessage(MceMbuser mbUser, MceRequestVO mceRequestVO, Integer mceReceiveId,
+                                     JSONObject appMode, JSONObject wcMode, String infoType) {
+        sendAppMessage(mbUser, mceRequestVO, appMode, infoType);
+        sendWeChatMessage(mbUser, mceRequestVO, wcMode, infoType, mceReceiveId);
+    }
+
+    /**
+     * 发送APP消息
+     */
+    private void sendAppMessage(MceMbuser mbUser, MceRequestVO mceRequestVO, JSONObject mode, String infoType) {
+        if (mode.getBoolean(infoType) && mbUser.getCids() != null) {
+            try {
+                mceContentService.sendAppNew(mceRequestVO, mbUser.getCids(), 0, 0);
+            } catch (Exception e) {
+                log.error("为用户ID: {} 发送应用消息失败,错误信息: {}", mbUser.getUserId(), e.getMessage(), e);
             }
+        }
+    }
 
-            // 处理微信消息发送
-            if (wcMode.getBoolean(infoType)) {
-                if (mbUser.getOpenid() != null) {
-                    try {
-                        mceContentService.sendAppNew(mceRequestVO, mbUser.getOpenid(), mceReceiveId, 1);
-                    } catch (Exception e) {
-                        log.error("为用户ID: {} 发送微信消息失败,错误信息: {}", mbUser.getUserId(), e.getMessage(), e);
-                    }
-                }
+    /**
+     * 推送微信消息
+     */
+    private void sendWeChatMessage(MceMbuser mbUser, MceRequestVO mceRequestVO, JSONObject mode,
+                                   String infoType, Integer mceReceiveId) {
+        if (mode.getBoolean(infoType) && mbUser.getOpenid() != null) {
+            try {
+                mceContentService.sendAppNew(mceRequestVO, mbUser.getOpenid(), mceReceiveId, 1);
+            } catch (Exception e) {
+                log.error("为用户ID: {} 发送微信消息失败,错误信息: {}", mbUser.getUserId(), e.getMessage(), e);
             }
         }
     }
 
+
     /*
     @Async
     @Override

+ 35 - 0
base-modules/service-system/service-system-biz/src/main/java/com/usky/system/service/impl/SysUserPersonServiceImpl.java

@@ -1,11 +1,17 @@
 package com.usky.system.service.impl;
 
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.usky.common.core.exception.BusinessException;
+import com.usky.common.security.utils.SecurityUtils;
 import com.usky.system.domain.SysUserPerson;
 import com.usky.system.mapper.SysUserPersonMapper;
 import com.usky.system.service.SysUserPersonService;
 import com.usky.common.mybatis.core.AbstractCrudService;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
+import java.util.Objects;
+
 /**
  * <p>
  * 用户人员关联 服务实现类
@@ -17,4 +23,33 @@ import org.springframework.stereotype.Service;
 @Service
 public class SysUserPersonServiceImpl extends AbstractCrudService<SysUserPersonMapper, SysUserPerson> implements SysUserPersonService {
 
+    @Autowired
+    private SysUserPersonMapper sysUserPersonMapper;
+
+    @Override
+    public Integer upIsLoginNotify(Long userId, Integer isLoginNotify) {
+
+        // 判断 isLoginNotify 是否为 0 或 1
+        if (isLoginNotify != 0 && isLoginNotify != 1) {
+            throw new BusinessException("参数设置错误");
+        }
+        // 判断要修改的用户是否为登录用户
+        if (!Objects.equals(userId, SecurityUtils.getUserId())) {
+            throw new BusinessException("你不能修改非本人的登录通知设置!");
+        }
+
+        // 更新登录通知设置
+        LambdaUpdateWrapper<SysUserPerson> wrapper = new LambdaUpdateWrapper<>();
+        wrapper.eq(SysUserPerson::getUserId, userId)
+                .set(SysUserPerson::getIsLoginNotify, isLoginNotify);
+        int result = sysUserPersonMapper.update(null, wrapper);
+
+        //  更新失败
+        if (result <= 0) {
+            log.error("用户:{},操作登录通知开关操作失败!");
+            throw new BusinessException("登录通知开关操作失败!请重试");
+        }
+
+        return result;
+    }
 }

+ 5 - 2
base-modules/service-system/service-system-biz/src/main/java/com/usky/system/service/impl/SysUserServiceImpl.java

@@ -139,6 +139,7 @@ public class SysUserServiceImpl extends AbstractCrudService<SysUserMapper, SysUs
     public List<SysUser> selectDUserList(SysUser user) {
         user.setTenantId(SecurityUtils.getTenantId());
         user.setUserType("00");
+        user.setStatus("0");
         return userMapper.selectUserList(user);
     }
 
@@ -243,7 +244,8 @@ public class SysUserServiceImpl extends AbstractCrudService<SysUserMapper, SysUs
      */
     @Override
     public String selectUserRoleGroup(String userName) {
-        List<SysRole> list = roleMapper.selectRolesByUserName(userName);
+        Integer tenantId = SecurityUtils.getTenantId();
+        List<SysRole> list = roleMapper.selectRolesByUserName(userName, tenantId);
         StringBuffer idsStr = new StringBuffer();
         for (SysRole role : list) {
             idsStr.append(role.getRoleName()).append(",");
@@ -262,7 +264,8 @@ public class SysUserServiceImpl extends AbstractCrudService<SysUserMapper, SysUs
      */
     @Override
     public String selectUserPostGroup(String userName) {
-        List<SysPost> list = postMapper.selectPostsByUserName(userName);
+        Integer tenantId = SecurityUtils.getTenantId();
+        List<SysPost> list = postMapper.selectPostsByUserName(userName, tenantId);
         StringBuffer idsStr = new StringBuffer();
         for (SysPost post : list) {
             idsStr.append(post.getPostName()).append(",");

+ 16 - 0
base-modules/service-system/service-system-biz/src/main/java/com/usky/system/service/vo/SendWeChatMessageRequestVO.java

@@ -79,4 +79,20 @@ public class SendWeChatMessageRequestVO {
      * oa跳转类型 (todo我的待办、me我发起的、copy抄送我的)
      */
     String oaType;
+
+    /**
+     * 设备id
+     */
+    private String deviceId;
+
+
+    /**
+     * 报警时间
+     */
+    private String alarmTime;
+
+    /**
+     * 备注
+     */
+    private String remark;
 }

+ 2 - 1
base-modules/service-system/service-system-biz/src/main/resources/mapper/system/SysPostMapper.xml

@@ -62,12 +62,13 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 	    where u.user_id = #{userId}
 	</select>
 	
-	<select id="selectPostsByUserName" parameterType="String" resultMap="SysPostResult">
+	<select id="selectPostsByUserName" parameterType="Map" resultMap="SysPostResult">
 		select p.post_id, p.post_name, p.post_code
 		from sys_post p
 			 left join sys_user_post up on up.post_id = p.post_id
 			 left join sys_user u on u.user_id = up.user_id
 		where u.user_name = #{userName}
+		and p.tenant_id = #{tenantId, jdbcType=INTEGER}
 	</select>
 	
 	<select id="checkPostNameUnique" parameterType="String" resultMap="SysPostResult">

+ 5 - 3
base-modules/service-system/service-system-biz/src/main/resources/mapper/system/SysRoleMapper.xml

@@ -24,7 +24,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 	
 	<sql id="selectRoleVo">
 	    select distinct r.role_id, r.role_name, r.role_key, r.role_sort, r.data_scope, r.menu_check_strictly, r.dept_check_strictly,
-            r.status, r.del_flag, r.create_time, r.remark 
+            r.status, r.del_flag, r.create_time, r.remark
         from sys_role r
 	        left join sys_user_role ur on ur.role_id = r.role_id
 	        left join sys_user u on u.user_id = ur.user_id
@@ -82,9 +82,11 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 		where r.role_id = #{roleId}
 	</select>
 	
-	<select id="selectRolesByUserName" parameterType="String" resultMap="SysRoleResult">
+	<select id="selectRolesByUserName" parameterType="Map" resultMap="SysRoleResult">
 		<include refid="selectRoleVo"/>
-		WHERE r.del_flag = '0' and u.user_name = #{userName}
+		WHERE r.del_flag = '0'
+		and u.user_name = #{userName}
+		and r.tenant_id = #{tenantId, jdbcType=INTEGER}
 	</select>
 	
 	<select id="checkRoleNameUnique" parameterType="String" resultMap="SysRoleResult">

+ 1 - 0
base-modules/service-system/service-system-biz/src/main/resources/mapper/system/SysUserPersonMapper.xml

@@ -7,6 +7,7 @@
         <id column="id" property="id" />
         <result column="user_id" property="userId" />
         <result column="person_id" property="personId" />
+        <result column="is_login_notify" property="isLoginNotify" />
     </resultMap>
 
 </mapper>