diff --git a/backend/src/main/java/io/dataease/controller/sys/SysUserController.java b/backend/src/main/java/io/dataease/controller/sys/SysUserController.java index a03fad7d85..e95563f748 100644 --- a/backend/src/main/java/io/dataease/controller/sys/SysUserController.java +++ b/backend/src/main/java/io/dataease/controller/sys/SysUserController.java @@ -24,6 +24,7 @@ import io.dataease.controller.sys.request.SysUserStateRequest; import io.dataease.controller.sys.response.RoleUserItem; import io.dataease.controller.sys.response.SysUserGridResponse; import io.dataease.plugins.common.base.domain.SysUser; +import io.dataease.plugins.common.base.domain.SysUserAssist; import io.dataease.service.sys.SysRoleService; import io.dataease.service.sys.SysUserService; import io.swagger.annotations.Api; @@ -66,7 +67,7 @@ public class SysUserController { @ApiImplicitParam(name = "request", value = "查询条件", required = true) }) public Pager> userGrid(@PathVariable int goPage, @PathVariable int pageSize, - @RequestBody KeyGridRequest request) { + @RequestBody KeyGridRequest request) { Page page = PageHelper.startPage(goPage, pageSize, true); List users = sysUserService.query(request); users.forEach(user -> { @@ -87,9 +88,9 @@ public class SysUserController { @RequiresPermissions("user:add") @PostMapping("/create") @DeLog( - operatetype = SysLogConstants.OPERATE_TYPE.CREATE, - sourcetype = SysLogConstants.SOURCE_TYPE.USER, - value = "userId" + operatetype = SysLogConstants.OPERATE_TYPE.CREATE, + sourcetype = SysLogConstants.SOURCE_TYPE.USER, + value = "userId" ) public void create(@RequestBody SysUserCreateRequest request) { sysUserService.save(request); @@ -99,9 +100,9 @@ public class SysUserController { @RequiresPermissions("user:edit") @PostMapping("/update") @DeLog( - operatetype = SysLogConstants.OPERATE_TYPE.MODIFY, - sourcetype = SysLogConstants.SOURCE_TYPE.USER, - value = "userId" + operatetype = SysLogConstants.OPERATE_TYPE.MODIFY, + sourcetype = SysLogConstants.SOURCE_TYPE.USER, + value = "userId" ) public void update(@RequestBody SysUserCreateRequest request) { sysUserService.update(request); @@ -112,8 +113,8 @@ public class SysUserController { @PostMapping("/delete/{userId}") @ApiImplicitParam(paramType = "path", value = "用户ID", name = "userId", required = true, dataType = "Integer") @DeLog( - operatetype = SysLogConstants.OPERATE_TYPE.DELETE, - sourcetype = SysLogConstants.SOURCE_TYPE.USER + operatetype = SysLogConstants.OPERATE_TYPE.DELETE, + sourcetype = SysLogConstants.SOURCE_TYPE.USER ) public void delete(@PathVariable("userId") Long userId) { sysUserService.delete(userId); @@ -124,9 +125,9 @@ public class SysUserController { @RequiresRoles("1") @PostMapping("/updateStatus") @DeLog( - operatetype = SysLogConstants.OPERATE_TYPE.MODIFY, - sourcetype = SysLogConstants.SOURCE_TYPE.USER, - value = "userId" + operatetype = SysLogConstants.OPERATE_TYPE.MODIFY, + sourcetype = SysLogConstants.SOURCE_TYPE.USER, + value = "userId" ) public void updateStatus(@RequestBody SysUserStateRequest request) { sysUserService.updateStatus(request); @@ -201,7 +202,7 @@ public class SysUserController { @ApiImplicitParam(name = "request", value = "查询条件", required = true) }) public Pager> roleGrid(@PathVariable int goPage, @PathVariable int pageSize, - @RequestBody BaseGridRequest request) { + @RequestBody BaseGridRequest request) { Page page = PageHelper.startPage(goPage, pageSize, true); Pager> listPager = PageUtils.setPageInfo(page, sysRoleService.query(request)); return listPager; @@ -226,4 +227,9 @@ public class SysUserController { authUserService.unlockAccount(username, one.getFrom()); } + @PostMapping("/assistInfo/{userId}") + public SysUserAssist assistInfo(@PathVariable("userId") Long userId) { + return sysUserService.assistInfo(userId); + } + } diff --git a/backend/src/main/java/io/dataease/controller/sys/request/SysUserCreateRequest.java b/backend/src/main/java/io/dataease/controller/sys/request/SysUserCreateRequest.java index 69b63ee655..5ecc781fc7 100644 --- a/backend/src/main/java/io/dataease/controller/sys/request/SysUserCreateRequest.java +++ b/backend/src/main/java/io/dataease/controller/sys/request/SysUserCreateRequest.java @@ -1,6 +1,7 @@ package io.dataease.controller.sys.request; import io.dataease.plugins.common.base.domain.SysUser; +import io.dataease.plugins.common.base.domain.SysUserAssist; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @@ -14,4 +15,7 @@ public class SysUserCreateRequest extends SysUser { @ApiModelProperty(value = "角色ID集合", required = true, position = 7) private List roleIds; + @ApiModelProperty(value = "辅助信息", required = false, position = 8) + private SysUserAssist sysUserAssist; + } diff --git a/backend/src/main/java/io/dataease/ext/ExtSysUserAssistMapper.java b/backend/src/main/java/io/dataease/ext/ExtSysUserAssistMapper.java deleted file mode 100644 index ad6d042a0b..0000000000 --- a/backend/src/main/java/io/dataease/ext/ExtSysUserAssistMapper.java +++ /dev/null @@ -1,17 +0,0 @@ -package io.dataease.ext; - -import io.dataease.plugins.common.base.domain.SysUserAssist; -import org.apache.ibatis.annotations.Insert; -import org.apache.ibatis.annotations.Mapper; -import org.apache.ibatis.annotations.Param; -import org.apache.ibatis.annotations.Select; - -@Mapper -public interface ExtSysUserAssistMapper { - - @Insert("insert into sys_user_assist values(#{po.userId}, #{po.needFirstNoti})") - void save(@Param("po") SysUserAssist po); - - @Select("select * from sys_user_assist where user_id = #{userId}") - SysUserAssist query(@Param("userId") Long userId); -} diff --git a/backend/src/main/java/io/dataease/job/sechedule/strategy/impl/EmailTaskHandler.java b/backend/src/main/java/io/dataease/job/sechedule/strategy/impl/EmailTaskHandler.java index 2833af3d71..ce61fc0395 100644 --- a/backend/src/main/java/io/dataease/job/sechedule/strategy/impl/EmailTaskHandler.java +++ b/backend/src/main/java/io/dataease/job/sechedule/strategy/impl/EmailTaskHandler.java @@ -14,6 +14,7 @@ import io.dataease.commons.utils.LogUtil; import io.dataease.commons.utils.ServletUtils; import io.dataease.job.sechedule.ScheduleManager; import io.dataease.job.sechedule.strategy.TaskHandler; +import io.dataease.plugins.common.base.domain.SysUserAssist; import io.dataease.plugins.common.entity.GlobalTaskEntity; import io.dataease.plugins.common.entity.GlobalTaskInstance; import io.dataease.plugins.config.SpringContextUtil; @@ -28,6 +29,7 @@ import io.dataease.plugins.xpack.lark.service.LarkXpackService; import io.dataease.plugins.xpack.wecom.dto.entity.WecomMsgResult; import io.dataease.plugins.xpack.wecom.service.WecomXpackService; import io.dataease.service.chart.ViewExportExcel; +import io.dataease.service.sys.SysUserService; import io.dataease.service.system.EmailService; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.ObjectUtils; @@ -154,6 +156,7 @@ public class EmailTaskHandler extends TaskHandler implements Job { EmailXpackService emailXpackService = SpringContextUtil.getBean(EmailXpackService.class); AuthUserServiceImpl userService = SpringContextUtil.getBean(AuthUserServiceImpl.class); + SysUserService sysUserService = SpringContextUtil.getBean(SysUserService.class); try { XpackEmailTaskRequest taskForm = emailXpackService.taskForm(taskInstance.getTaskId()); if (ObjectUtils.isEmpty(taskForm) || CronUtils.taskExpire(taskForm.getEndTime())) { @@ -215,17 +218,24 @@ public class EmailTaskHandler extends TaskHandler implements Job { for (int i = 0; i < channels.size(); i++) { String channel = channels.get(i); switch (channel) { - case "email" : + case "email": if (StringUtils.isNotBlank(recipients)) - emailService.sendWithImageAndFiles(recipients, emailTemplateDTO.getTitle(), contentStr, bytes, files); + emailService.sendWithImageAndFiles(recipients, emailTemplateDTO.getTitle(), contentStr, bytes, files); break; - case "wecom" : + case "wecom": if (SpringContextUtil.getBean(AuthUserService.class).supportWecom()) { - - List wecomUsers = reciLists.stream().filter(reci -> { + List wecomUsers = new ArrayList<>(); + for (int j = 0; j < reciLists.size(); j++) { + String reci = reciLists.get(j); SysUserEntity userBySub = userService.getUserBySub(reci, 4); - return ObjectUtils.isNotEmpty(userBySub); - }).collect(Collectors.toList()); + if (ObjectUtils.isEmpty(userBySub)) continue; + Long userId = userBySub.getUserId(); + SysUserAssist sysUserAssist = sysUserService.assistInfo(userId); + if (ObjectUtils.isEmpty(sysUserAssist) || StringUtils.isBlank(sysUserAssist.getLarkId())) + continue; + wecomUsers.add(sysUserAssist.getLarkId()); + } + if (CollectionUtils.isNotEmpty(wecomUsers)) { WecomXpackService wecomXpackService = SpringContextUtil.getBean(WecomXpackService.class); WecomMsgResult wecomMsgResult = wecomXpackService.pushOaMsg(wecomUsers, emailTemplateDTO.getTitle(), contentStr, bytes, files); @@ -236,12 +246,20 @@ public class EmailTaskHandler extends TaskHandler implements Job { } break; - case "dingtalk" : + case "dingtalk": if (SpringContextUtil.getBean(AuthUserService.class).supportDingtalk()) { - List dingTalkUsers = reciLists.stream().filter(reci -> { + List dingTalkUsers = new ArrayList<>(); + for (int j = 0; j < reciLists.size(); j++) { + String reci = reciLists.get(j); SysUserEntity userBySub = userService.getUserBySub(reci, 5); - return ObjectUtils.isNotEmpty(userBySub); - }).collect(Collectors.toList()); + if (ObjectUtils.isEmpty(userBySub)) continue; + Long userId = userBySub.getUserId(); + SysUserAssist sysUserAssist = sysUserService.assistInfo(userId); + if (ObjectUtils.isEmpty(sysUserAssist) || StringUtils.isBlank(sysUserAssist.getLarkId())) + continue; + dingTalkUsers.add(sysUserAssist.getLarkId()); + } + if (CollectionUtils.isNotEmpty(dingTalkUsers)) { DingtalkXpackService dingtalkXpackService = SpringContextUtil.getBean(DingtalkXpackService.class); DingtalkMsgResult dingtalkMsgResult = dingtalkXpackService.pushOaMsg(dingTalkUsers, emailTemplateDTO.getTitle(), contentStr, bytes, files); @@ -252,12 +270,20 @@ public class EmailTaskHandler extends TaskHandler implements Job { } break; - case "lark" : + case "lark": if (SpringContextUtil.getBean(AuthUserService.class).supportLark()) { - List larkUsers = reciLists.stream().filter(reci -> { + List larkUsers = new ArrayList<>(); + for (int j = 0; j < reciLists.size(); j++) { + String reci = reciLists.get(j); SysUserEntity userBySub = userService.getUserBySub(reci, 6); - return ObjectUtils.isNotEmpty(userBySub); - }).collect(Collectors.toList()); + if (ObjectUtils.isEmpty(userBySub)) continue; + Long userId = userBySub.getUserId(); + SysUserAssist sysUserAssist = sysUserService.assistInfo(userId); + if (ObjectUtils.isEmpty(sysUserAssist) || StringUtils.isBlank(sysUserAssist.getLarkId())) + continue; + larkUsers.add(sysUserAssist.getLarkId()); + } + if (CollectionUtils.isNotEmpty(larkUsers)) { LarkXpackService larkXpackService = SpringContextUtil.getBean(LarkXpackService.class); LarkMsgResult larkMsgResult = larkXpackService.pushOaMsg(larkUsers, emailTemplateDTO.getTitle(), contentStr, bytes, files); diff --git a/backend/src/main/java/io/dataease/service/message/service/strategy/SendDingtalk.java b/backend/src/main/java/io/dataease/service/message/service/strategy/SendDingtalk.java index 101bfd973a..3f428d71aa 100644 --- a/backend/src/main/java/io/dataease/service/message/service/strategy/SendDingtalk.java +++ b/backend/src/main/java/io/dataease/service/message/service/strategy/SendDingtalk.java @@ -1,13 +1,17 @@ package io.dataease.service.message.service.strategy; -import io.dataease.auth.entity.SysUserEntity; import io.dataease.auth.service.AuthUserService; +import io.dataease.plugins.common.base.domain.SysUserAssist; import io.dataease.plugins.config.SpringContextUtil; import io.dataease.plugins.xpack.dingtalk.service.DingtalkXpackService; import io.dataease.service.message.service.SendService; +import io.dataease.service.sys.SysUserService; +import org.apache.commons.lang3.ObjectUtils; +import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import javax.annotation.Resource; import java.util.ArrayList; import java.util.List; @@ -17,12 +21,14 @@ public class SendDingtalk implements SendService { @Autowired private AuthUserService authUserService; + @Resource + private SysUserService sysUserService; + @Override public void sendMsg(Long userId, Long typeId, String content, String param) { - SysUserEntity userEntity = authUserService.getUserById(userId); - - if (userEntity.getFrom() == 5 && authUserService.supportDingtalk()) { - String username = userEntity.getUsername(); + SysUserAssist sysUserAssist = sysUserService.assistInfo(userId); + if (ObjectUtils.isNotEmpty(sysUserAssist) && StringUtils.isNotBlank(sysUserAssist.getDingtalkId()) && authUserService.supportDingtalk()) { + String username = sysUserAssist.getDingtalkId(); DingtalkXpackService dingtalkXpackService = SpringContextUtil.getBean(DingtalkXpackService.class); List userIds = new ArrayList<>(); userIds.add(username); diff --git a/backend/src/main/java/io/dataease/service/message/service/strategy/SendLark.java b/backend/src/main/java/io/dataease/service/message/service/strategy/SendLark.java index 7793d4c7db..1c400ec3c9 100644 --- a/backend/src/main/java/io/dataease/service/message/service/strategy/SendLark.java +++ b/backend/src/main/java/io/dataease/service/message/service/strategy/SendLark.java @@ -1,13 +1,17 @@ package io.dataease.service.message.service.strategy; -import io.dataease.auth.entity.SysUserEntity; import io.dataease.auth.service.AuthUserService; +import io.dataease.plugins.common.base.domain.SysUserAssist; import io.dataease.plugins.config.SpringContextUtil; import io.dataease.plugins.xpack.lark.service.LarkXpackService; import io.dataease.service.message.service.SendService; +import io.dataease.service.sys.SysUserService; +import org.apache.commons.lang3.ObjectUtils; +import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import javax.annotation.Resource; import java.util.ArrayList; import java.util.List; @@ -17,12 +21,14 @@ public class SendLark implements SendService { @Autowired private AuthUserService authUserService; + @Resource + private SysUserService sysUserService; + @Override public void sendMsg(Long userId, Long typeId, String content, String param) { - SysUserEntity userEntity = authUserService.getUserById(userId); - - if (userEntity.getFrom() == 6 && authUserService.supportLark()) { - String username = userEntity.getUsername(); + SysUserAssist sysUserAssist = sysUserService.assistInfo(userId); + if (ObjectUtils.isNotEmpty(sysUserAssist) && StringUtils.isNotBlank(sysUserAssist.getLarkId()) && authUserService.supportLark()) { + String username = sysUserAssist.getLarkId(); LarkXpackService larkXpackService = SpringContextUtil.getBean(LarkXpackService.class); List userIds = new ArrayList<>(); userIds.add(username); diff --git a/backend/src/main/java/io/dataease/service/message/service/strategy/SendWecom.java b/backend/src/main/java/io/dataease/service/message/service/strategy/SendWecom.java index de5481b561..4ccdf141e0 100644 --- a/backend/src/main/java/io/dataease/service/message/service/strategy/SendWecom.java +++ b/backend/src/main/java/io/dataease/service/message/service/strategy/SendWecom.java @@ -1,13 +1,17 @@ package io.dataease.service.message.service.strategy; -import io.dataease.auth.entity.SysUserEntity; import io.dataease.auth.service.AuthUserService; +import io.dataease.plugins.common.base.domain.SysUserAssist; import io.dataease.plugins.config.SpringContextUtil; import io.dataease.plugins.xpack.wecom.service.WecomXpackService; import io.dataease.service.message.service.SendService; +import io.dataease.service.sys.SysUserService; +import org.apache.commons.lang3.ObjectUtils; +import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import javax.annotation.Resource; import java.util.ArrayList; import java.util.List; @@ -16,12 +20,16 @@ public class SendWecom implements SendService { @Autowired private AuthUserService authUserService; + + @Resource + private SysUserService sysUserService; + @Override public void sendMsg(Long userId, Long typeId, String content, String param) { - SysUserEntity userEntity = authUserService.getUserById(userId); + SysUserAssist sysUserAssist = sysUserService.assistInfo(userId); + if (ObjectUtils.isNotEmpty(sysUserAssist) && StringUtils.isNotBlank(sysUserAssist.getWecomId()) && authUserService.supportWecom()) { - if (userEntity.getFrom() == 4 && authUserService.supportWecom()) { - String username = userEntity.getUsername(); + String username = sysUserAssist.getWecomId(); WecomXpackService wecomXpackService = SpringContextUtil.getBean(WecomXpackService.class); List userIds = new ArrayList<>(); userIds.add(username); diff --git a/backend/src/main/java/io/dataease/service/sys/SysUserService.java b/backend/src/main/java/io/dataease/service/sys/SysUserService.java index f9189d80f0..ab70cae6a5 100644 --- a/backend/src/main/java/io/dataease/service/sys/SysUserService.java +++ b/backend/src/main/java/io/dataease/service/sys/SysUserService.java @@ -5,7 +5,6 @@ import io.dataease.auth.service.AuthUserService; import io.dataease.auth.service.ExtAuthService; import io.dataease.commons.exception.DEException; import io.dataease.controller.sys.request.*; -import io.dataease.ext.ExtSysUserAssistMapper; import io.dataease.ext.ExtSysUserMapper; import io.dataease.ext.query.GridExample; import io.dataease.commons.constants.AuthConstants; @@ -16,6 +15,7 @@ import io.dataease.controller.sys.response.SysUserGridResponse; import io.dataease.controller.sys.response.SysUserRole; import io.dataease.i18n.Translator; import io.dataease.plugins.common.base.domain.*; +import io.dataease.plugins.common.base.mapper.SysUserAssistMapper; import io.dataease.plugins.common.base.mapper.SysUserMapper; import io.dataease.plugins.common.base.mapper.SysUsersRolesMapper; import io.dataease.plugins.common.entity.XpackLdapUserEntity; @@ -36,6 +36,7 @@ import javax.annotation.Resource; import java.util.ArrayList; import java.util.List; import java.util.Map; +import java.util.Optional; import java.util.stream.Collectors; @Service @@ -57,8 +58,9 @@ public class SysUserService { @Resource private ExtAuthService extAuthService; + @Resource - private ExtSysUserAssistMapper extSysUserAssistMapper; + private SysUserAssistMapper sysUserAssistMapper; @Resource private AuthUserService authUserService; @@ -99,8 +101,15 @@ public class SysUserService { } int insert = sysUserMapper.insert(user); SysUser dbUser = findOne(user); - request.setUserId(dbUser.getUserId()); - saveUserRoles(dbUser.getUserId(), request.getRoleIds());//插入用户角色关联 + Long userId = dbUser.getUserId(); + request.setUserId(userId); + saveUserRoles(userId, request.getRoleIds());//插入用户角色关联 + + SysUserAssist sysUserAssist = request.getSysUserAssist(); + if (ObjectUtils.isNotEmpty(sysUserAssist) && (StringUtils.isNotBlank(sysUserAssist.getWecomId()) || StringUtils.isNotBlank(sysUserAssist.getDingtalkId()) || StringUtils.isNotBlank(sysUserAssist.getLarkId()))) { + saveAssist(userId, sysUserAssist.getWecomId(), sysUserAssist.getDingtalkId(), sysUserAssist.getLarkId()); + } + return insert; } @@ -125,12 +134,12 @@ public class SysUserService { // oidc默认角色是普通员工 List roleIds = new ArrayList(); roleIds.add(2L); - saveUserRoles( dbUser.getUserId(), roleIds); + saveUserRoles(dbUser.getUserId(), roleIds); } } @Transactional - public void saveWecomCUser(Map userMap , String userId, String email) { + public void saveWecomCUser(Map userMap, String userId, String email) { long now = System.currentTimeMillis(); SysUser sysUser = new SysUser(); @@ -148,6 +157,7 @@ public class SysUserService { sysUser.setIsAdmin(false); sysUser.setSub(userId); sysUserMapper.insert(sysUser); + Optional.ofNullable(findOne(sysUser)).ifPresent(u -> saveAssist(u.getUserId(), u.getUsername(), null, null)); } @@ -170,7 +180,7 @@ public class SysUserService { sysUser.setSub(dingUserEntity.getUnionid()); sysUser.setPhone(dingUserEntity.getMobile()); sysUserMapper.insert(sysUser); - + Optional.ofNullable(findOne(sysUser)).ifPresent(u -> saveAssist(u.getUserId(), null, u.getUsername(), null)); } @Transactional @@ -192,7 +202,7 @@ public class SysUserService { sysUser.setSub(larkUserInfo.getSub()); sysUser.setPhone(larkUserInfo.getMobile()); sysUserMapper.insert(sysUser); - + Optional.ofNullable(findOne(sysUser)).ifPresent(u -> saveAssist(u.getUserId(), null, null, u.getUsername())); } @Transactional @@ -215,7 +225,7 @@ public class SysUserService { // oidc默认角色是普通员工 List roleIds = new ArrayList(); roleIds.add(2L); - saveUserRoles( dbUser.getUserId(), roleIds); + saveUserRoles(dbUser.getUserId(), roleIds); } } @@ -247,7 +257,7 @@ public class SysUserService { sysUserMapper.insert(sysUser); SysUser dbUser = findOne(sysUser); if (null != dbUser && null != dbUser.getUserId()) { - saveUserRoles( dbUser.getUserId(), request.getRoleIds()); + saveUserRoles(dbUser.getUserId(), request.getRoleIds()); } }); } @@ -285,7 +295,13 @@ public class SysUserService { saveUserRoles(user.getUserId(), request.getRoleIds());//再插入角色关联 if (ObjectUtils.isEmpty(user.getDeptId())) user.setDeptId(0L); authUserService.clearCache(user.getUserId()); - return sysUserMapper.updateByPrimaryKeySelective(user); + int result = sysUserMapper.updateByPrimaryKeySelective(user); + + SysUserAssist sysUserAssist = request.getSysUserAssist(); + if (ObjectUtils.isNotEmpty(sysUserAssist) && (StringUtils.isNotBlank(sysUserAssist.getWecomId()) || StringUtils.isNotBlank(sysUserAssist.getDingtalkId()) || StringUtils.isNotBlank(sysUserAssist.getLarkId()))) { + saveAssist(user.getUserId(), sysUserAssist.getWecomId(), sysUserAssist.getDingtalkId(), sysUserAssist.getLarkId()); + } + return result; } /** @@ -308,6 +324,7 @@ public class SysUserService { * 更新用户基本信息 * 只允许修改 email, nickname, phone * 防止此接口被恶意利用更改不允许更改的信息,新建SysUser对象并只设置部分值 + * * @param request * @return */ @@ -426,33 +443,34 @@ public class SysUserService { SysUserExample example = new SysUserExample(); example.createCriteria().andUsernameEqualTo(userName); List users = sysUserMapper.selectByExample(example); - if(CollectionUtils.isNotEmpty(users)) { - throw new RuntimeException("用户ID【"+userName+"】已存在,请联系管理员"); + if (CollectionUtils.isNotEmpty(users)) { + throw new RuntimeException("用户ID【" + userName + "】已存在,请联系管理员"); } } + public void validateExistUser(String userName, String nickName, String email) { SysUserExample example = new SysUserExample(); if (StringUtils.isNotBlank(userName)) { example.createCriteria().andUsernameEqualTo(userName); List users = sysUserMapper.selectByExample(example); - if(CollectionUtils.isNotEmpty(users)) { - throw new RuntimeException("用户ID【"+userName+"】已存在,请联系管理员"); + if (CollectionUtils.isNotEmpty(users)) { + throw new RuntimeException("用户ID【" + userName + "】已存在,请联系管理员"); } } if (StringUtils.isNotBlank(nickName)) { example.createCriteria().andNickNameEqualTo(nickName); List users = sysUserMapper.selectByExample(example); - if(CollectionUtils.isNotEmpty(users)) { - throw new RuntimeException("用户姓名【"+nickName+"】已存在,请联系管理员"); + if (CollectionUtils.isNotEmpty(users)) { + throw new RuntimeException("用户姓名【" + nickName + "】已存在,请联系管理员"); } } example.clear(); if (StringUtils.isNotBlank(email)) { example.createCriteria().andEmailEqualTo(email); List users = sysUserMapper.selectByExample(example); - if(CollectionUtils.isNotEmpty(users)) { - throw new RuntimeException("用户邮箱【"+email+"】已存在,请联系管理员"); + if (CollectionUtils.isNotEmpty(users)) { + throw new RuntimeException("用户邮箱【" + email + "】已存在,请联系管理员"); } } } @@ -510,16 +528,43 @@ public class SysUserService { } public boolean needPwdNoti(Long userId) { - SysUserAssist userAssist = extSysUserAssistMapper.query(userId); + SysUserAssist userAssist = sysUserAssistMapper.selectByPrimaryKey(userId); return ObjectUtils.isEmpty(userAssist) || userAssist.getNeedFirstNoti(); } public void saveUserAssist(Boolean noti) { Long userId = AuthUtils.getUser().getUserId(); + SysUserAssist existAssist = sysUserAssistMapper.selectByPrimaryKey(userId); + if (ObjectUtils.isNotEmpty(existAssist)) { + existAssist.setNeedFirstNoti(noti); + sysUserAssistMapper.updateByPrimaryKey(existAssist); + return; + } SysUserAssist sysUserAssist = new SysUserAssist(); sysUserAssist.setUserId(userId); sysUserAssist.setNeedFirstNoti(noti); - extSysUserAssistMapper.save(sysUserAssist); + sysUserAssistMapper.insertSelective(sysUserAssist); + } + + public void saveAssist(Long userId, String wecomId, String dingtlkId, String larkId) { + SysUserAssist existAssist = sysUserAssistMapper.selectByPrimaryKey(userId); + if (ObjectUtils.isNotEmpty(existAssist)) { + existAssist.setWecomId(wecomId); + existAssist.setDingtalkId(dingtlkId); + existAssist.setLarkId(larkId); + sysUserAssistMapper.updateByPrimaryKey(existAssist); + return; + } + SysUserAssist sysUserAssist = new SysUserAssist(); + sysUserAssist.setUserId(userId); + sysUserAssist.setWecomId(wecomId); + sysUserAssist.setDingtalkId(dingtlkId); + sysUserAssist.setLarkId(larkId); + sysUserAssistMapper.insert(sysUserAssist); + } + + public SysUserAssist assistInfo(Long userId) { + return sysUserAssistMapper.selectByPrimaryKey(userId); } } diff --git a/backend/src/main/resources/db/migration/V40__1.15.sql b/backend/src/main/resources/db/migration/V40__1.15.sql index 0dbc5b1707..b4b31501c6 100644 --- a/backend/src/main/resources/db/migration/V40__1.15.sql +++ b/backend/src/main/resources/db/migration/V40__1.15.sql @@ -116,3 +116,8 @@ INSERT INTO `sys_auth_detail` (`id`, `auth_id`, `privilege_name`, `privilege_typ INSERT INTO `sys_auth_detail` (`id`, `auth_id`, `privilege_name`, `privilege_type`, `privilege_value`, `privilege_extend`, `remark`, `create_user`, `create_time`, `update_time`, `copy_from`, `copy_id`) VALUES ('98d77463-38bb-11ed-8383-0242ac130005', 'f4e07708-26f1-4f42-9a4a-8e6dae63353c', 'i18n_auth_grant', 15, 0, 'grant', '基础权限-授权', 'admin', 1663661389000, NULL, NULL, NULL); INSERT INTO `sys_auth_detail` (`id`, `auth_id`, `privilege_name`, `privilege_type`, `privilege_value`, `privilege_extend`, `remark`, `create_user`, `create_time`, `update_time`, `copy_from`, `copy_id`) VALUES ('98d77856-38bb-11ed-8383-0242ac130005', 'f4e07708-26f1-4f42-9a4a-8e6dae63353c', 'i18n_auth_use', 1, 1, 'use', '基础权限-使用', 'admin', 1663661389000, NULL, NULL, NULL); +ALTER TABLE `sys_user_assist` + ADD COLUMN `wecom_id` varchar(255) NULL COMMENT '企业微信账号' AFTER `need_first_noti`, + ADD COLUMN `dingtalk_id` varchar(255) NULL COMMENT '钉钉账号' AFTER `wecom_id`, + ADD COLUMN `lark_id` varchar(255) NULL COMMENT '飞书账号' AFTER `dingtalk_id`; + diff --git a/frontend/src/api/system/user.js b/frontend/src/api/system/user.js index 4e4ee78512..cdfc543a6d 100644 --- a/frontend/src/api/system/user.js +++ b/frontend/src/api/system/user.js @@ -10,7 +10,8 @@ const pathMap = { updatePath: '/api/user/update', editPasswordPath: '/api/user/adminUpdatePwd', editStatusPath: '/api/user/updateStatus', - unlockPath: '/api/user/unlock/' + unlockPath: '/api/user/unlock/', + queryAssistPath: '/api/user/assistInfo/' } export function userLists(page, size, data) { return request({ @@ -142,4 +143,12 @@ export function unLock(username) { }) } -export default { editPassword, delUser, editUser, addUser, userLists, editStatus, personInfo, updatePerson, updatePersonPwd, allRoles, roleGrid, ldapUsers, saveLdapUser, existLdapUsers, unLock } +export function queryAssist(userId) { + return request({ + url: pathMap.queryAssistPath + userId, + method: 'post', + loading: false + }) +} + +export default { editPassword, delUser, editUser, addUser, userLists, editStatus, personInfo, updatePerson, updatePersonPwd, allRoles, roleGrid, ldapUsers, saveLdapUser, existLdapUsers, unLock, queryAssist } diff --git a/frontend/src/components/DeDrag/index.vue b/frontend/src/components/DeDrag/index.vue index d232e01bf5..515f573c62 100644 --- a/frontend/src/components/DeDrag/index.vue +++ b/frontend/src/components/DeDrag/index.vue @@ -815,11 +815,13 @@ export default { e.stopPropagation() // 此处阻止冒泡 但是外层需要获取pageX pageY this.element.auxiliaryMatrix && this.$emit('elementMouseDown', e) - this.$store.commit('setCurComponent', { component: this.element, index: this.index }) // 移动端组件点击自动置顶 this.mobileLayoutStatus && this.$store.commit('topComponent') eventsFor = events.mouse this.elementDown(e) + this.$nextTick(()=>{ + this.$store.commit('setCurComponent', { component: this.element, index: this.index }) + }) }, // 元素按下 elementDown(e) { diff --git a/frontend/src/lang/en.js b/frontend/src/lang/en.js index c5923c6fdf..48ce97f7a1 100644 --- a/frontend/src/lang/en.js +++ b/frontend/src/lang/en.js @@ -132,11 +132,10 @@ export default { }, commons: { - unlock: 'Unlock', unlock_success: 'Unlock success', - uninstall:'Uninstall', + uninstall: 'Uninstall', no_result: 'No Result', manage_member: 'Managing members', @@ -674,7 +673,13 @@ export default { filter: 'Screen', list: 'List item', list_info: 'Please select the information to be displayed in the list', - sure_delete: 'Are you sure to delete this user?' + sure_delete: 'Are you sure to delete this user?', + wecom_id: 'Wecom Account', + dingtalk_id: 'Dingtalk Account', + lark_id: 'Lark Account', + input_wecom_id: 'Please input wecom account', + input_dingtalk_id: 'Please input dingtalk account', + input_lark_id: 'Please input lark account' }, ldap: { url: 'LDAP url', @@ -1309,6 +1314,9 @@ export default { analyse_cfg: 'Analyse', slider: 'Slider', slider_range: 'Range', + slider_bg: 'Background', + slider_fill_bg: 'Selected Background', + slider_text_color: 'Font Color', chart_no_senior: 'This chart type not support senior config,please look forward to.', chart_no_properties: 'This chart type not support properties config.', assist_line: 'Assist Line', diff --git a/frontend/src/lang/tw.js b/frontend/src/lang/tw.js index 43e2b36f90..5df944cb3b 100644 --- a/frontend/src/lang/tw.js +++ b/frontend/src/lang/tw.js @@ -132,11 +132,10 @@ export default { }, commons: { - unlock: '解鎖', unlock_success: '解鎖成功', - uninstall:'卸载', + uninstall: '卸载', no_result: '没有找到相关内容', manage_member: '管理成員', @@ -674,7 +673,13 @@ export default { filter: '篩選', list: '列表項', list_info: '請選擇列表中要展示的信息', - sure_delete: '確定刪除該用戶嗎?' + sure_delete: '確定刪除該用戶嗎?', + wecom_id: '企業微信賬號', + dingtalk_id: '釘釘賬號', + lark_id: '飛書賬號', + input_wecom_id: '請輸入企業微信賬號', + input_dingtalk_id: '請輸入釘釘賬號', + input_lark_id: '請輸入飛書賬號' }, ldap: { url: 'LDAP地址', @@ -1309,6 +1314,9 @@ export default { analyse_cfg: '分析預警', slider: '縮略軸', slider_range: '默認範圍', + slider_bg: '背景', + slider_fill_bg: '選中背景', + slider_text_color: '字體顏色', chart_no_senior: '當前圖表類型暫無高級配置,敬請期待', chart_no_properties: '當前圖表類型暫無样式配置.', assist_line: '輔助線', diff --git a/frontend/src/lang/zh.js b/frontend/src/lang/zh.js index f511e030c8..5a2bf46a75 100644 --- a/frontend/src/lang/zh.js +++ b/frontend/src/lang/zh.js @@ -134,7 +134,7 @@ export default { unlock: '解锁', unlock_success: '解锁成功', - uninstall:'卸载', + uninstall: '卸载', no_result: '没有找到相关内容', manage_member: '管理成员', @@ -672,7 +672,13 @@ export default { filter: '筛选', list: '列表项', list_info: '请选择列表中要展示的信息', - sure_delete: '确定删除该用户吗?' + sure_delete: '确定删除该用户吗?', + wecom_id: '企业微信账号', + dingtalk_id: '钉钉账号', + lark_id: '飞书账号', + input_wecom_id: '请输入企业微信账号', + input_dingtalk_id: '请输入钉钉账号', + input_lark_id: '请输入飞书账号' }, ldap: { url: 'LDAP地址', @@ -1307,6 +1313,9 @@ export default { analyse_cfg: '分析预警', slider: '缩略轴', slider_range: '默认范围', + slider_bg: '背景', + slider_fill_bg: '选中背景', + slider_text_color: '字体颜色', chart_no_senior: '当前图表类型暂无高级配置,敬请期待', chart_no_properties: '当前图表类型暂无样式配置', assist_line: '辅助线', diff --git a/frontend/src/views/chart/chart/chart.js b/frontend/src/views/chart/chart/chart.js index 65eea85321..43548d3e71 100644 --- a/frontend/src/views/chart/chart/chart.js +++ b/frontend/src/views/chart/chart/chart.js @@ -382,7 +382,10 @@ export const DEFAULT_SPLIT = { } export const DEFAULT_FUNCTION_CFG = { sliderShow: false, - sliderRange: [0, 10] + sliderRange: [0, 10], + sliderBg: '#FFFFFF', + sliderFillBg: '#BCD6F1', + sliderTextClolor: '#999999' } export const DEFAULT_THRESHOLD = { gaugeThreshold: '', diff --git a/frontend/src/views/chart/chart/common/common.js b/frontend/src/views/chart/chart/common/common.js index ccb98c70d6..38a601ce2a 100644 --- a/frontend/src/views/chart/chart/common/common.js +++ b/frontend/src/views/chart/chart/common/common.js @@ -192,6 +192,16 @@ export function componentStyle(chart_option, chart) { } } +const hexToRgba = (hex, opacity) => { + let rgbaColor = '' + const reg = /^#[\da-f]{6}$/i + if (reg.test(hex)) { + rgbaColor = `rgba(${parseInt('0x' + hex.slice(1, 3))},${parseInt( + '0x' + hex.slice(3, 5) + )},${parseInt('0x' + hex.slice(5, 7))},${opacity})` + } + return rgbaColor +} export function seniorCfg(chart_option, chart) { if (chart.senior && chart.type && (chart.type.includes('bar') || chart.type.includes('line') || chart.type.includes('mix'))) { const senior = JSON.parse(chart.senior) @@ -209,6 +219,26 @@ export function seniorCfg(chart_option, chart) { end: parseInt(senior.functionCfg.sliderRange[1]) } ] + if (senior.functionCfg.sliderBg) { + chart_option.dataZoom[1].dataBackground = { + lineStyle: { color: reverseColor(senior.functionCfg.sliderBg), opacity: 0.3 }, + areaStyle: { color: reverseColor(senior.functionCfg.sliderBg), opacity: 0.1 } + } + } + if (senior.functionCfg.sliderFillBg) { + chart_option.dataZoom[1].selectedDataBackground = { + lineStyle: { color: senior.functionCfg.sliderFillBg }, + areaStyle: { color: senior.functionCfg.sliderFillBg } + } + const rgba = hexToRgba(senior.functionCfg.sliderFillBg, 0.5) + chart_option.dataZoom[1].fillerColor = rgba + } + if (senior.functionCfg.sliderTextClolor) { + chart_option.dataZoom[1].textStyle = { color: senior.functionCfg.sliderTextClolor } + const rgba = hexToRgba(senior.functionCfg.sliderTextClolor, 0.5) + chart_option.dataZoom[1].handleStyle = { color: rgba } + } + if (chart.type.includes('horizontal')) { chart_option.dataZoom[0].yAxisIndex = [0] chart_option.dataZoom[1].yAxisIndex = [0] diff --git a/frontend/src/views/chart/chart/common/common_antv.js b/frontend/src/views/chart/chart/common/common_antv.js index 9c736d0d8e..d67c066803 100644 --- a/frontend/src/views/chart/chart/common/common_antv.js +++ b/frontend/src/views/chart/chart/common/common_antv.js @@ -636,6 +636,31 @@ export function getSlider(chart) { start: parseInt(senior.functionCfg.sliderRange[0]) / 100, end: parseInt(senior.functionCfg.sliderRange[1]) / 100 } + + if (senior.functionCfg.sliderBg) { + cfg.backgroundStyle = { + fill: senior.functionCfg.sliderBg, + stroke: senior.functionCfg.sliderBg, + lineWidth: 1, + strokeOpacity: 0.5 + } + } + if (senior.functionCfg.sliderFillBg) { + cfg.foregroundStyle = { + 'fill': senior.functionCfg.sliderFillBg, + 'fillOpacity': 0.5 + } + } + if (senior.functionCfg.sliderTextClolor) { + cfg.textStyle = { + 'fill': senior.functionCfg.sliderTextClolor + } + cfg.handlerStyle = { + 'fill': senior.functionCfg.sliderTextClolor, + 'fillOpacity': 0.5, + 'highLightFill': senior.functionCfg.sliderTextClolor + } + } } } } diff --git a/frontend/src/views/chart/chart/table/table-info.js b/frontend/src/views/chart/chart/table/table-info.js index ffa5ac370b..1a5e06c06f 100644 --- a/frontend/src/views/chart/chart/table/table-info.js +++ b/frontend/src/views/chart/chart/table/table-info.js @@ -536,6 +536,13 @@ function mappingColor(value, defaultColor, field, type) { color = t[type] flag = true } + } else if (t.term === 'between') { + const min = parseFloat(t.min) + const max = parseFloat(t.max) + if (min <= value && value <= max) { + color = t[type] + flag = true + } } if (flag) { break diff --git a/frontend/src/views/chart/components/normal/LabelNormal.vue b/frontend/src/views/chart/components/normal/LabelNormal.vue index 707f6ca950..7daac33deb 100644 --- a/frontend/src/views/chart/components/normal/LabelNormal.vue +++ b/frontend/src/views/chart/components/normal/LabelNormal.vue @@ -243,6 +243,13 @@ export default { this.label_content_class.color = t.color flag = true } + } else if (t.term === 'between') { + const min = parseFloat(t.min) + const max = parseFloat(t.max) + if (min <= value && value <= max) { + this.label_content_class.color = t.color + flag = true + } } if (flag) { break diff --git a/frontend/src/views/chart/components/senior/FunctionCfg.vue b/frontend/src/views/chart/components/senior/FunctionCfg.vue index 1ed5249cf0..b3f4920542 100644 --- a/frontend/src/views/chart/components/senior/FunctionCfg.vue +++ b/frontend/src/views/chart/components/senior/FunctionCfg.vue @@ -8,13 +8,22 @@ + + + + + + + + + \ No newline at end of file +