From 23855599412c4d61b38d78f0f3abd3430a48b5b1 Mon Sep 17 00:00:00 2001
From: zhangherong <571457620@qq.com>
Date: 星期三, 25 六月 2025 11:51:38 +0800
Subject: [PATCH] Merge branch 'mdc_hyjs_master'

---
 lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysUserServiceImpl.java |  809 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 809 insertions(+), 0 deletions(-)

diff --git a/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysUserServiceImpl.java b/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysUserServiceImpl.java
new file mode 100644
index 0000000..8d9799b
--- /dev/null
+++ b/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysUserServiceImpl.java
@@ -0,0 +1,809 @@
+package org.jeecg.modules.system.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+import org.jeecg.common.api.vo.Result;
+import org.jeecg.common.constant.CacheConstant;
+import org.jeecg.common.constant.CommonConstant;
+import org.jeecg.common.constant.enums.RoleIndexConfigEnum;
+import org.jeecg.common.desensitization.annotation.SensitiveEncode;
+import org.jeecg.common.system.vo.DictModel;
+import org.jeecg.common.system.vo.LoginUser;
+import org.jeecg.common.system.vo.SysUserCacheInfo;
+import org.jeecg.common.util.DateUtils;
+import org.jeecg.common.util.PasswordUtil;
+import org.jeecg.common.util.UUIDGenerator;
+import org.jeecg.common.util.oConvertUtils;
+import org.jeecg.modules.base.service.BaseCommonService;
+import org.jeecg.modules.system.entity.*;
+import org.jeecg.modules.system.mapper.*;
+import org.jeecg.modules.system.model.SysUserSysDepartModel;
+import org.jeecg.modules.system.service.ISysDictService;
+import org.jeecg.modules.system.service.ISysUserService;
+import org.jeecg.modules.system.vo.MdcUserProVo;
+import org.jeecg.modules.system.vo.SysUserDepVo;
+import org.jeecg.modules.system.vo.UserSelector;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.cache.annotation.CacheEvict;
+import org.springframework.cache.annotation.Cacheable;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import javax.annotation.Resource;
+import java.util.*;
+import java.util.stream.Collectors;
+
+/**
+ * <p>
+ * 鐢ㄦ埛琛� 鏈嶅姟瀹炵幇绫�
+ * </p>
+ *
+ * @Author: scott
+ * @Date: 2018-12-20
+ */
+@Service
+@Slf4j
+public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> implements ISysUserService {
+
+	@Autowired
+	private SysUserMapper userMapper;
+	@Autowired
+	private SysPermissionMapper sysPermissionMapper;
+	@Autowired
+	private SysUserRoleMapper sysUserRoleMapper;
+	@Autowired
+	private SysUserDepartMapper sysUserDepartMapper;
+	@Autowired
+	private SysDepartMapper sysDepartMapper;
+	@Autowired
+	private SysRoleMapper sysRoleMapper;
+	@Autowired
+	private SysDepartRoleUserMapper departRoleUserMapper;
+	@Autowired
+	private SysDepartRoleMapper sysDepartRoleMapper;
+	@Resource
+	private BaseCommonService baseCommonService;
+	@Autowired
+	private SysThirdAccountMapper sysThirdAccountMapper;
+	@Autowired
+	ThirdAppWechatEnterpriseServiceImpl wechatEnterpriseService;
+	@Autowired
+	ThirdAppDingtalkServiceImpl dingtalkService;
+	@Autowired
+	SysRoleIndexMapper sysRoleIndexMapper;
+	@Resource
+	MdcUserProductionMapper mdcUserProductionMapper;
+	@Resource
+	private ISysDictService sysDictService;
+	@Resource
+	private MdcProductionEquipmentMapper mdcProductionEquipmentMapper;
+	@Resource
+	private DncDevicePermissionMapper dncDevicePermissionMapper;
+
+    @Override
+    @CacheEvict(value = {CacheConstant.SYS_USERS_CACHE}, allEntries = true)
+    public Result<?> resetPassword(String username, String oldpassword, String newpassword, String confirmpassword) {
+        SysUser user = userMapper.getUserByName(username);
+        String passwordEncode = PasswordUtil.encrypt(username, oldpassword, user.getSalt());
+        if (!user.getPassword().equals(passwordEncode)) {
+            return Result.error("鏃у瘑鐮佽緭鍏ラ敊璇�!");
+        }
+        if (oConvertUtils.isEmpty(newpassword)) {
+            return Result.error("鏂板瘑鐮佷笉鍏佽涓虹┖!");
+        }
+        if (!newpassword.equals(confirmpassword)) {
+            return Result.error("涓ゆ杈撳叆瀵嗙爜涓嶄竴鑷�!");
+        }
+		//璁剧疆瀵嗙爜鏇存柊鏃堕棿
+		//sysUser.setPasswordTime(new Date());
+		//璁剧疆瀵嗙爜棣栨鐧诲綍澶辨晥
+		//sysUser.setPasswordFlag(CommonConstant.DEL_FLAG_0);
+        String password = PasswordUtil.encrypt(username, newpassword, user.getSalt());
+        this.userMapper.update(new SysUser().setPassword(password).setPasswordTime(new Date()).setPasswordFlag(CommonConstant.DEL_FLAG_0), new LambdaQueryWrapper<SysUser>().eq(SysUser::getId, user.getId()));
+        return Result.ok("瀵嗙爜閲嶇疆鎴愬姛!");
+    }
+
+    @Override
+    @CacheEvict(value = {CacheConstant.SYS_USERS_CACHE}, allEntries = true)
+    public Result<?> changePassword(SysUser sysUser) {
+        String salt = oConvertUtils.randomGen(8);
+        sysUser.setSalt(salt);
+		//璁剧疆瀵嗙爜鏇存柊鏃堕棿
+		sysUser.setPasswordTime(new Date());
+		//绠$悊鍛樹慨鏀瑰瘑鐮侊紝璁剧疆鐢ㄦ埛棣栨鐧诲綍
+		//sysUser.setPasswordFlag();
+        String password = sysUser.getPassword();
+        String passwordEncode = PasswordUtil.encrypt(sysUser.getUsername(), password, salt);
+        sysUser.setPassword(passwordEncode);
+        this.userMapper.updateById(sysUser);
+        return Result.ok("瀵嗙爜淇敼鎴愬姛!");
+    }
+
+    @Override
+    @CacheEvict(value={CacheConstant.SYS_USERS_CACHE}, allEntries=true)
+	@Transactional(rollbackFor = Exception.class)
+	public boolean deleteUser(String userId) {
+		//1.鍒犻櫎鐢ㄦ埛
+		this.removeById(userId);
+		return false;
+	}
+
+	@Override
+    @CacheEvict(value={CacheConstant.SYS_USERS_CACHE}, allEntries=true)
+	@Transactional(rollbackFor = Exception.class)
+	public boolean deleteBatchUsers(String userIds) {
+		//1.鍒犻櫎鐢ㄦ埛
+		this.removeByIds(Arrays.asList(userIds.split(",")));
+		return false;
+	}
+
+	@Override
+	public SysUser getUserByName(String username) {
+		return userMapper.getUserByName(username);
+	}
+
+
+	@Override
+	@Transactional(rollbackFor = Exception.class)
+	public void addUserWithRole(SysUser user, String roles) {
+		this.save(user);
+		if(oConvertUtils.isNotEmpty(roles)) {
+			String[] arr = roles.split(",");
+			for (String roleId : arr) {
+				SysUserRole userRole = new SysUserRole(user.getId(), roleId);
+				sysUserRoleMapper.insert(userRole);
+			}
+		}
+	}
+
+	@Override
+	@CacheEvict(value= {CacheConstant.SYS_USERS_CACHE}, allEntries=true)
+	@Transactional(rollbackFor = Exception.class)
+	public void editUserWithRole(SysUser user, String roles) {
+		this.updateById(user);
+		//鍏堝垹鍚庡姞
+		sysUserRoleMapper.delete(new QueryWrapper<SysUserRole>().lambda().eq(SysUserRole::getUserId, user.getId()));
+		if(oConvertUtils.isNotEmpty(roles)) {
+			String[] arr = roles.split(",");
+			for (String roleId : arr) {
+				SysUserRole userRole = new SysUserRole(user.getId(), roleId);
+				sysUserRoleMapper.insert(userRole);
+			}
+		}
+	}
+
+
+	@Override
+	public List<String> getRole(String username) {
+		return sysUserRoleMapper.getRoleByUserName(username);
+	}
+
+	/**
+	 * 鑾峰彇鍔ㄦ�侀椤佃矾鐢遍厤缃�
+	 * @param username
+	 * @param version
+	 * @return
+	 */
+	@Override
+	public SysRoleIndex getDynamicIndexByUserRole(String username,String version) {
+		List<String> roles = sysUserRoleMapper.getRoleByUserName(username);
+		String componentUrl = RoleIndexConfigEnum.getIndexByRoles(roles);
+		SysRoleIndex roleIndex = new SysRoleIndex(componentUrl);
+		//鍙湁 X-Version=v3 鐨勬椂鍊欙紝鎵嶈鍙杝ys_role_index琛ㄨ幏鍙栬鑹查椤甸厤缃�
+		if (oConvertUtils.isNotEmpty(version) && roles!=null && roles.size()>0) {
+			LambdaQueryWrapper<SysRoleIndex> routeIndexQuery = new LambdaQueryWrapper();
+			//鐢ㄦ埛鎵�鏈夎鑹�
+			routeIndexQuery.in(SysRoleIndex::getRoleCode, roles);
+			//瑙掕壊棣栭〉鐘舵��0锛氭湭寮�鍚�  1锛氬紑鍚�
+			routeIndexQuery.eq(SysRoleIndex::getStatus, CommonConstant.STATUS_1);
+			//浼樺厛绾ф搴忔帓搴�
+			routeIndexQuery.orderByAsc(SysRoleIndex::getPriority);
+			List<SysRoleIndex> list = sysRoleIndexMapper.selectList(routeIndexQuery);
+			if (null != list && list.size() > 0) {
+				roleIndex = list.get(0);
+			}
+		}
+
+		//濡傛灉componentUrl涓虹┖锛屽垯杩斿洖绌�
+		if(oConvertUtils.isEmpty(roleIndex.getComponent())){
+			return null;
+		}
+		return roleIndex;
+	}
+
+	/**
+	 * 閫氳繃鐢ㄦ埛鍚嶈幏鍙栫敤鎴疯鑹查泦鍚�
+	 * @param username 鐢ㄦ埛鍚�
+     * @return 瑙掕壊闆嗗悎
+	 */
+	@Override
+	public Set<String> getUserRolesSet(String username) {
+		// 鏌ヨ鐢ㄦ埛鎷ユ湁鐨勮鑹查泦鍚�
+		List<String> roles = sysUserRoleMapper.getRoleByUserName(username);
+		log.info("-------閫氳繃鏁版嵁搴撹鍙栫敤鎴锋嫢鏈夌殑瑙掕壊Rules------username锛� " + username + ",Roles size: " + (roles == null ? 0 : roles.size()));
+		return new HashSet<>(roles);
+	}
+
+	/**
+	 * 閫氳繃鐢ㄦ埛鍚嶈幏鍙栫敤鎴锋潈闄愰泦鍚�
+	 *
+	 * @param username 鐢ㄦ埛鍚�
+	 * @return 鏉冮檺闆嗗悎
+	 */
+	@Override
+	public Set<String> getUserPermissionsSet(String username) {
+		Set<String> permissionSet = new HashSet<>();
+		List<SysPermission> permissionList = sysPermissionMapper.queryByUser(username);
+		for (SysPermission po : permissionList) {
+//			// TODO URL瑙勫垯鏈夐棶棰橈紵
+//			if (oConvertUtils.isNotEmpty(po.getUrl())) {
+//				permissionSet.add(po.getUrl());
+//			}
+			if (oConvertUtils.isNotEmpty(po.getPerms())) {
+				permissionSet.add(po.getPerms());
+			}
+		}
+		log.info("-------閫氳繃鏁版嵁搴撹鍙栫敤鎴锋嫢鏈夌殑鏉冮檺Perms------username锛� "+ username+",Perms size: "+ (permissionSet==null?0:permissionSet.size()) );
+		return permissionSet;
+	}
+
+	/**
+	 * 鍗囩骇SpringBoot2.6.6,涓嶅厑璁稿惊鐜緷璧�
+	 * @author:qinfeng
+	 * @update: 2022-04-07
+	 * @param username
+	 * @return
+	 */
+	@Override
+	public SysUserCacheInfo getCacheUser(String username) {
+		SysUserCacheInfo info = new SysUserCacheInfo();
+		info.setOneDepart(true);
+		if(oConvertUtils.isEmpty(username)) {
+			return null;
+		}
+
+		//鏌ヨ鐢ㄦ埛淇℃伅
+		SysUser sysUser = userMapper.getUserByName(username);
+		if(sysUser!=null) {
+			info.setSysUserCode(sysUser.getUsername());
+			info.setSysUserName(sysUser.getRealname());
+			info.setSysOrgCode(sysUser.getOrgCode());
+		}
+
+		//澶氶儴闂ㄦ敮鎸乮n鏌ヨ
+		List<SysDepart> list = sysDepartMapper.queryUserDeparts(sysUser.getId());
+		List<String> sysMultiOrgCode = new ArrayList<String>();
+		if(list==null || list.size()==0) {
+			//褰撳墠鐢ㄦ埛鏃犻儴闂�
+			//sysMultiOrgCode.add("0");
+		}else if(list.size()==1) {
+			sysMultiOrgCode.add(list.get(0).getOrgCode());
+		}else {
+			info.setOneDepart(false);
+			for (SysDepart dpt : list) {
+				sysMultiOrgCode.add(dpt.getOrgCode());
+			}
+		}
+		info.setSysMultiOrgCode(sysMultiOrgCode);
+
+		return info;
+	}
+
+    /**
+     * 鏍规嵁閮ㄩ棬Id鏌ヨ
+     * @param page
+     * @param departId 閮ㄩ棬id
+     * @param username 鐢ㄦ埛璐︽埛鍚嶇О
+     * @return
+     */
+	@Override
+	public IPage<SysUser> getUserByDepId(Page<SysUser> page, String departId,String username) {
+		return userMapper.getUserByDepId(page, departId,username);
+	}
+
+	@Override
+	public IPage<SysUser> getUserByDepIds(Page<SysUser> page, List<String> departIds, String username) {
+		return userMapper.getUserByDepIds(page, departIds,username);
+	}
+
+	@Override
+	public Map<String, String> getDepNamesByUserIds(List<String> userIds) {
+		List<SysUserDepVo> list = this.baseMapper.getDepNamesByUserIds(userIds);
+
+		Map<String, String> res = new HashMap(5);
+		list.forEach(item -> {
+					if (res.get(item.getUserId()) == null) {
+						res.put(item.getUserId(), item.getDepartName());
+					} else {
+						res.put(item.getUserId(), res.get(item.getUserId()) + "," + item.getDepartName());
+					}
+				}
+		);
+		return res;
+	}
+
+	//update-begin-author:taoyan date:2022-9-13 for: VUEN-2245銆愭紡娲炪�戝彂鐜版柊婕忔礊寰呭鐞�20220906 ----sql娉ㄥ叆  鏂规硶娌℃湁浣跨敤锛屾敞鎺�
+/*	@Override
+	public IPage<SysUser> getUserByDepartIdAndQueryWrapper(Page<SysUser> page, String departId, QueryWrapper<SysUser> queryWrapper) {
+		LambdaQueryWrapper<SysUser> lambdaQueryWrapper = queryWrapper.lambda();
+
+		lambdaQueryWrapper.eq(SysUser::getDelFlag, CommonConstant.DEL_FLAG_0);
+        lambdaQueryWrapper.inSql(SysUser::getId, "SELECT user_id FROM sys_user_depart WHERE dep_id = '" + departId + "'");
+
+        return userMapper.selectPage(page, lambdaQueryWrapper);
+	}*/
+	//update-end-author:taoyan date:2022-9-13 for: VUEN-2245銆愭紡娲炪�戝彂鐜版柊婕忔礊寰呭鐞�20220906 ----sql娉ㄥ叆 鏂规硶娌℃湁浣跨敤锛屾敞鎺�
+
+	@Override
+	public IPage<SysUserSysDepartModel> queryUserByOrgCode(String orgCode, SysUser userParams, IPage page) {
+		List<SysUserSysDepartModel> list = baseMapper.getUserByOrgCode(page, orgCode, userParams);
+		Integer total = baseMapper.getUserByOrgCodeTotal(orgCode, userParams);
+
+		IPage<SysUserSysDepartModel> result = new Page<>(page.getCurrent(), page.getSize(), total);
+		result.setRecords(list);
+
+		return result;
+	}
+
+    /**
+     * 鏍规嵁瑙掕壊Id鏌ヨ
+     * @param page
+     * @param roleId 瑙掕壊id
+     * @param username 鐢ㄦ埛璐︽埛鍚嶇О
+     * @return
+     */
+	@Override
+	public IPage<SysUser> getUserByRoleId(Page<SysUser> page, String roleId, String username) {
+		return userMapper.getUserByRoleId(page,roleId,username);
+	}
+
+
+	@Override
+	@CacheEvict(value= {CacheConstant.SYS_USERS_CACHE}, key="#username")
+	public void updateUserDepart(String username,String orgCode) {
+		baseMapper.updateUserDepart(username, orgCode);
+	}
+
+
+	@Override
+	public SysUser getUserByPhone(String phone) {
+		return userMapper.getUserByPhone(phone);
+	}
+
+
+	@Override
+	public SysUser getUserByEmail(String email) {
+		return userMapper.getUserByEmail(email);
+	}
+
+	@Override
+	@Transactional(rollbackFor = Exception.class)
+	public void addUserWithDepart(SysUser user, String selectedParts) {
+//		this.save(user);  //淇濆瓨瑙掕壊鐨勬椂鍊欏凡缁忔坊鍔犺繃涓�娆′簡
+		if(oConvertUtils.isNotEmpty(selectedParts)) {
+			String[] arr = selectedParts.split(",");
+			for (String deaprtId : arr) {
+				SysUserDepart userDeaprt = new SysUserDepart(user.getId(), deaprtId);
+				sysUserDepartMapper.insert(userDeaprt);
+			}
+		}
+	}
+
+
+	@Override
+	@Transactional(rollbackFor = Exception.class)
+	@CacheEvict(value={CacheConstant.SYS_USERS_CACHE}, allEntries=true)
+	public void editUserWithDepart(SysUser user, String departs) {
+        //鏇存柊瑙掕壊鐨勬椂鍊欏凡缁忔洿鏂颁簡涓�娆′簡锛屽彲浠ュ啀璺熸柊涓�娆�
+		this.updateById(user);
+		String[] arr = {};
+		if(oConvertUtils.isNotEmpty(departs)){
+			arr = departs.split(",");
+		}
+		//鏌ヨ宸插叧鑱旈儴闂�
+		List<SysUserDepart> userDepartList = sysUserDepartMapper.selectList(new QueryWrapper<SysUserDepart>().lambda().eq(SysUserDepart::getUserId, user.getId()));
+		if(userDepartList != null && userDepartList.size()>0){
+			for(SysUserDepart depart : userDepartList ){
+				//淇敼宸插叧鑱旈儴闂ㄥ垹闄ら儴闂ㄧ敤鎴疯鑹插叧绯�
+				if(!Arrays.asList(arr).contains(depart.getDepId())){
+					List<SysDepartRole> sysDepartRoleList = sysDepartRoleMapper.selectList(
+							new QueryWrapper<SysDepartRole>().lambda().eq(SysDepartRole::getDepartId,depart.getDepId()));
+					List<String> roleIds = sysDepartRoleList.stream().map(SysDepartRole::getId).collect(Collectors.toList());
+					if(roleIds != null && roleIds.size()>0){
+						departRoleUserMapper.delete(new QueryWrapper<SysDepartRoleUser>().lambda().eq(SysDepartRoleUser::getUserId, user.getId())
+								.in(SysDepartRoleUser::getDroleId,roleIds));
+					}
+				}
+			}
+		}
+		//鍏堝垹鍚庡姞
+		sysUserDepartMapper.delete(new QueryWrapper<SysUserDepart>().lambda().eq(SysUserDepart::getUserId, user.getId()));
+		if(oConvertUtils.isNotEmpty(departs)) {
+			for (String departId : arr) {
+				SysUserDepart userDepart = new SysUserDepart(user.getId(), departId);
+				sysUserDepartMapper.insert(userDepart);
+			}
+		}
+	}
+
+
+	/**
+	   * 鏍¢獙鐢ㄦ埛鏄惁鏈夋晥
+	 * @param sysUser
+	 * @return
+	 */
+	@Override
+	public Result<?> checkUserIsEffective(SysUser sysUser, String loginType) {
+		Result<?> result = new Result<Object>();
+		//鎯呭喌1锛氭牴鎹敤鎴蜂俊鎭煡璇紝璇ョ敤鎴蜂笉瀛樺湪
+		if (sysUser == null) {
+			result.error500("璇ョ敤鎴蜂笉瀛樺湪锛岃娉ㄥ唽");
+			baseCommonService.addLog("鐢ㄦ埛鐧诲綍澶辫触锛岀敤鎴蜂笉瀛樺湪锛�", CommonConstant.LOG_TYPE_1, null);
+			return result;
+		}
+		//鎯呭喌2锛氭牴鎹敤鎴蜂俊鎭煡璇紝璇ョ敤鎴峰凡娉ㄩ攢
+		//update-begin---author:鐜嬪竻   Date:20200601  for锛歩f鏉′欢姘歌繙涓篺alsebug------------
+		if (CommonConstant.DEL_FLAG_1.equals(sysUser.getDelFlag())) {
+		//update-end---author:鐜嬪竻   Date:20200601  for锛歩f鏉′欢姘歌繙涓篺alsebug------------
+			baseCommonService.addLog("鐢ㄦ埛鐧诲綍澶辫触锛岀敤鎴峰悕:" + sysUser.getUsername() + "宸叉敞閿�锛�", CommonConstant.LOG_TYPE_1, null);
+			result.error500("璇ョ敤鎴峰凡娉ㄩ攢");
+			return result;
+		}
+		//鎯呭喌3锛氭牴鎹敤鎴蜂俊鎭煡璇紝璇ョ敤鎴峰凡鍐荤粨
+		if (CommonConstant.USER_FREEZE.equals(sysUser.getStatus())) {
+			baseCommonService.addLog("鐢ㄦ埛鐧诲綍澶辫触锛岀敤鎴峰悕:" + sysUser.getUsername() + "宸插喕缁擄紒", CommonConstant.LOG_TYPE_1, null);
+			result.error500("璇ョ敤鎴峰凡鍐荤粨");
+			return result;
+		}
+		//鎯呭喌4锛氭牴鎹敤鎴蜂俊鎭煡璇紝璇ョ敤鎴峰瘑鐮佺郴棣栨浣跨敤锛岄渶淇敼瀵嗙爜
+		List<DictModel> dictList = sysDictService.queryEnableDictItemsByCode(CommonConstant.DICT_USER_FIRST_LOGIN);
+		if (!"terminal".equals(loginType) && dictList != null && !dictList.isEmpty()) {
+			if (CommonConstant.DEL_FLAG_1.equals(Integer.valueOf(dictList.get(0).getValue())) && CommonConstant.DEL_FLAG_1.equals(sysUser.getPasswordFlag())) {
+				baseCommonService.addLog("鐢ㄦ埛鐧诲綍澶辫触锛岀敤鎴峰悕:" + sysUser.getUsername() + "绯婚娆$櫥褰曠郴缁燂紝璇烽噸缃瘑鐮侊紒", CommonConstant.LOG_TYPE_1, null);
+				result.setCode(5001);
+				result.setMessage("鐢ㄦ埛瀵嗙爜绯婚粯璁ゅ瘑鐮侊紝闇�閲嶇疆瀵嗙爜鍚庨噸鏂扮櫥褰曞瘑鐮侊紒");
+				result.setSuccess(false);
+				return result;
+			}
+		}
+		//鎯呭喌5锛氭牴鎹敤鎴蜂俊鎭煡璇紝璇ョ敤鎴峰瘑鐮佹槸鍚﹀凡杩囨洿鏀瑰懆鏈�
+		Date passwordTime = sysUser.getPasswordTime();
+		//Integer passwordExpirationPeriod = CommonConstant.PASSWORD_EXPIRATION_PERIOD;
+		List<DictModel> dictModelList = sysDictService.queryEnableDictItemsByCode(CommonConstant.DICT_PASSWORD_EXPIRATION);
+		if (dictModelList != null && !dictModelList.isEmpty()) {
+			Integer passwordExpirationPeriod = Integer.valueOf(dictModelList.get(0).getValue());
+			Date dayAfter = DateUtils.getDayAfter(passwordTime, passwordExpirationPeriod);
+			if (new Date().after(dayAfter)) {
+				baseCommonService.addLog("鐢ㄦ埛鐧诲綍澶辫触锛岀敤鎴峰悕:" + sysUser.getUsername() + "瀵嗙爜宸茶繃鏈夋晥鏈燂紝璇烽噸缃瘑鐮侊紒", CommonConstant.LOG_TYPE_1, null);
+				result.setCode(5002);
+				result.setMessage("鐢ㄦ埛瀵嗙爜宸茶繃鏈夋晥鏈燂紝璇烽噸缃瘑鐮侊紒");
+				result.setSuccess(false);
+				return result;
+			}
+		}
+		return result;
+	}
+
+	@Override
+	public List<SysUser> queryLogicDeleted() {
+		return this.queryLogicDeleted(null);
+	}
+
+	@Override
+	public List<SysUser> queryLogicDeleted(LambdaQueryWrapper<SysUser> wrapper) {
+		if (wrapper == null) {
+			wrapper = new LambdaQueryWrapper<>();
+		}
+		wrapper.eq(SysUser::getDelFlag, CommonConstant.DEL_FLAG_1);
+		return userMapper.selectLogicDeleted(wrapper);
+	}
+
+	@Override
+	@CacheEvict(value={CacheConstant.SYS_USERS_CACHE}, allEntries=true)
+	public boolean revertLogicDeleted(List<String> userIds, SysUser updateEntity) {
+		return userMapper.revertLogicDeleted(userIds, updateEntity) > 0;
+	}
+
+	@Override
+	@Transactional(rollbackFor = Exception.class)
+	public boolean removeLogicDeleted(List<String> userIds) {
+		// 1. 鍒犻櫎鐢ㄦ埛
+		int line = userMapper.deleteLogicDeleted(userIds);
+		// 2. 鍒犻櫎鐢ㄦ埛閮ㄩ棬鍏崇郴
+		line += sysUserDepartMapper.delete(new LambdaQueryWrapper<SysUserDepart>().in(SysUserDepart::getUserId, userIds));
+		// 3. 鍒犻櫎鐢ㄦ埛浜х嚎鍏崇郴
+		line += mdcUserProductionMapper.delete(new LambdaQueryWrapper<MdcUserProduction>().in(MdcUserProduction::getUserId, userIds));
+		//3. 鍒犻櫎鐢ㄦ埛瑙掕壊鍏崇郴
+		line += sysUserRoleMapper.delete(new LambdaQueryWrapper<SysUserRole>().in(SysUserRole::getUserId, userIds));
+		//4.鍚屾鍒犻櫎绗笁鏂笰pp鐨勭敤鎴�
+		try {
+			dingtalkService.removeThirdAppUser(userIds);
+			wechatEnterpriseService.removeThirdAppUser(userIds);
+		} catch (Exception e) {
+			log.error("鍚屾鍒犻櫎绗笁鏂笰pp鐨勭敤鎴峰け璐ワ細", e);
+		}
+		//5. 鍒犻櫎绗笁鏂圭敤鎴疯〃锛堝洜涓虹4姝ラ渶瑕佺敤鍒扮涓夋柟鐢ㄦ埛琛紝鎵�浠ュ湪浠栦箣鍚庡垹锛�
+		line += sysThirdAccountMapper.delete(new LambdaQueryWrapper<SysThirdAccount>().in(SysThirdAccount::getSysUserId, userIds));
+
+		return line != 0;
+	}
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public boolean updateNullPhoneEmail() {
+        userMapper.updateNullByEmptyString("email");
+        userMapper.updateNullByEmptyString("phone");
+        return true;
+    }
+
+	@Override
+	public void saveThirdUser(SysUser sysUser) {
+		//淇濆瓨鐢ㄦ埛
+		String userid = UUIDGenerator.generate();
+		sysUser.setId(userid);
+		baseMapper.insert(sysUser);
+		//鑾峰彇绗笁鏂硅鑹�
+		SysRole sysRole = sysRoleMapper.selectOne(new LambdaQueryWrapper<SysRole>().eq(SysRole::getRoleCode, "third_role"));
+		//淇濆瓨鐢ㄦ埛瑙掕壊
+		SysUserRole userRole = new SysUserRole();
+		userRole.setRoleId(sysRole.getId());
+		userRole.setUserId(userid);
+		sysUserRoleMapper.insert(userRole);
+	}
+
+	@Override
+	public List<SysUser> queryByDepIds(List<String> departIds, String username) {
+		return userMapper.queryByDepIds(departIds,username);
+	}
+
+	@Override
+	@Transactional(rollbackFor = Exception.class)
+	public void saveUser(SysUser user, String selectedRoles, String selectedDeparts, String selectedProductions) {
+		//step.1 淇濆瓨鐢ㄦ埛
+		this.save(user);
+		//step.2 淇濆瓨瑙掕壊
+		if(oConvertUtils.isNotEmpty(selectedRoles)) {
+			String[] arr = selectedRoles.split(",");
+			for (String roleId : arr) {
+				SysUserRole userRole = new SysUserRole(user.getId(), roleId);
+				sysUserRoleMapper.insert(userRole);
+			}
+		}
+		//step.3 淇濆瓨鎵�灞為儴闂�
+		if(oConvertUtils.isNotEmpty(selectedDeparts)) {
+			String[] arr = selectedDeparts.split(",");
+			for (String deaprtId : arr) {
+				SysUserDepart userDeaprt = new SysUserDepart(user.getId(), deaprtId);
+				sysUserDepartMapper.insert(userDeaprt);
+			}
+		}
+		String[] arr = {};
+		//step.4 淇濆瓨鎵�灞炰骇绾�
+		if (oConvertUtils.isNotEmpty(selectedProductions)) {
+			arr = selectedProductions.split(",");
+			for (String productionId : arr) {
+				MdcUserProduction mdcUserProduction = new MdcUserProduction(user.getId(), productionId);
+				mdcUserProductionMapper.insert(mdcUserProduction);
+			}
+		}
+		//step.5 淇濆瓨璁惧鏉冮檺
+		List<String> EquipmentIds= mdcProductionEquipmentMapper.selectList(new QueryWrapper<MdcProductionEquipment>().in("production_id",arr))
+				.stream().map(MdcProductionEquipment::getEquipmentId).collect(Collectors.toList());
+		if (oConvertUtils.isNotEmpty(EquipmentIds)) {
+			for (String equipmentId : EquipmentIds) {
+				DncDevicePermission dncDevicePermission=new DncDevicePermission();
+				dncDevicePermission.setDeviceId(equipmentId);
+				dncDevicePermission.setUserId(user.getId());
+				dncDevicePermissionMapper.insert(dncDevicePermission);
+			}
+		}
+	}
+
+	@Override
+	@Transactional(rollbackFor = Exception.class)
+	@CacheEvict(value={CacheConstant.SYS_USERS_CACHE}, allEntries=true)
+	public void editUser(SysUser user, String roles, String departs, String productions) {
+		//step.1 淇敼鐢ㄦ埛鍩虹淇℃伅
+		this.updateById(user);
+		//step.2 淇敼瑙掕壊
+		//澶勭悊鐢ㄦ埛瑙掕壊 鍏堝垹鍚庡姞
+		sysUserRoleMapper.delete(new QueryWrapper<SysUserRole>().lambda().eq(SysUserRole::getUserId, user.getId()));
+		if(oConvertUtils.isNotEmpty(roles)) {
+			String[] arr = roles.split(",");
+			for (String roleId : arr) {
+				SysUserRole userRole = new SysUserRole(user.getId(), roleId);
+				sysUserRoleMapper.insert(userRole);
+			}
+		}
+
+		//step.3 淇敼閮ㄩ棬
+		String[] arr = {};
+		if(oConvertUtils.isNotEmpty(departs)){
+			arr = departs.split(",");
+		}
+		//鏌ヨ宸插叧鑱旈儴闂�
+		List<SysUserDepart> userDepartList = sysUserDepartMapper.selectList(new QueryWrapper<SysUserDepart>().lambda().eq(SysUserDepart::getUserId, user.getId()));
+		if(userDepartList != null && userDepartList.size()>0){
+			for(SysUserDepart depart : userDepartList ){
+				//淇敼宸插叧鑱旈儴闂ㄥ垹闄ら儴闂ㄧ敤鎴疯鑹插叧绯�
+				if(!Arrays.asList(arr).contains(depart.getDepId())){
+					List<SysDepartRole> sysDepartRoleList = sysDepartRoleMapper.selectList(
+							new QueryWrapper<SysDepartRole>().lambda().eq(SysDepartRole::getDepartId,depart.getDepId()));
+					List<String> roleIds = sysDepartRoleList.stream().map(SysDepartRole::getId).collect(Collectors.toList());
+					if(roleIds != null && roleIds.size()>0){
+						departRoleUserMapper.delete(new QueryWrapper<SysDepartRoleUser>().lambda().eq(SysDepartRoleUser::getUserId, user.getId())
+								.in(SysDepartRoleUser::getDroleId,roleIds));
+					}
+				}
+			}
+		}
+		//鍏堝垹鍚庡姞
+		sysUserDepartMapper.delete(new QueryWrapper<SysUserDepart>().lambda().eq(SysUserDepart::getUserId, user.getId()));
+		if(oConvertUtils.isNotEmpty(departs)) {
+			for (String departId : arr) {
+				SysUserDepart userDepart = new SysUserDepart(user.getId(), departId);
+				sysUserDepartMapper.insert(userDepart);
+			}
+		}
+		//step.4 淇敼浜х嚎
+		String[] array = {};
+		if(oConvertUtils.isNotEmpty(productions)){
+			array = productions.split(",");
+		}
+		//鍏堝垹鍚庡姞
+		mdcUserProductionMapper.delete(new QueryWrapper<MdcUserProduction>().lambda().eq(MdcUserProduction::getUserId, user.getId()));
+		if (oConvertUtils.isNotEmpty(productions)) {
+			for (String productionId : array) {
+				MdcUserProduction mdcUserProduction = new MdcUserProduction(user.getId(), productionId);
+				mdcUserProductionMapper.insert(mdcUserProduction);
+			}
+		}
+		//step.5 淇敼璁惧鏉冮檺
+		//鍏堝垹鍚庡姞
+		dncDevicePermissionMapper.delete(new QueryWrapper<DncDevicePermission>().lambda().eq(DncDevicePermission::getUserId, user.getId()));
+		List<String> EquipmentIds= mdcProductionEquipmentMapper.selectList(new QueryWrapper<MdcProductionEquipment>().in("production_id",array))
+				.stream().map(MdcProductionEquipment::getEquipmentId).collect(Collectors.toList());
+		if (oConvertUtils.isNotEmpty(EquipmentIds)) {
+			for (String equipmentId : EquipmentIds) {
+				DncDevicePermission dncDevicePermission=new DncDevicePermission();
+				dncDevicePermission.setDeviceId(equipmentId);
+				dncDevicePermission.setUserId(user.getId());
+				dncDevicePermissionMapper.insert(dncDevicePermission);
+			}
+		}
+		//step.6 淇敼鎵嬫満鍙峰拰閭
+		// 鏇存柊鎵嬫満鍙枫�侀偖绠辩┖瀛楃涓蹭负 null
+		userMapper.updateNullByEmptyString("email");
+		userMapper.updateNullByEmptyString("phone");
+
+	}
+
+	@Override
+	public List<String> userIdToUsername(Collection<String> userIdList) {
+		LambdaQueryWrapper<SysUser> queryWrapper = new LambdaQueryWrapper<>();
+		queryWrapper.in(SysUser::getId, userIdList);
+		List<SysUser> userList = super.list(queryWrapper);
+		return userList.stream().map(SysUser::getUsername).collect(Collectors.toList());
+	}
+
+	@Override
+	@Cacheable(cacheNames=CacheConstant.SYS_USERS_CACHE, key="#username")
+	@SensitiveEncode
+	public LoginUser getEncodeUserInfo(String username){
+		if(oConvertUtils.isEmpty(username)) {
+			return null;
+		}
+		LoginUser loginUser = new LoginUser();
+		SysUser sysUser = userMapper.getUserByName(username);
+		if(sysUser==null) {
+			return null;
+		}
+		BeanUtils.copyProperties(sysUser, loginUser);
+		return loginUser;
+	}
+
+	@Override
+	public Map<String, String> getProNamesByUserIds(List<String> userIds) {
+		List<MdcUserProVo> list = this.baseMapper.getProNamesByUserIds(userIds);
+
+		Map<String, String> res = new HashMap<>(5);
+		list.forEach(item -> {
+			if (res.get(item.getUserId()) == null) {
+				res.put(item.getUserId(), item.getProductionName());
+			} else {
+				res.put(item.getUserId(), res.get(item.getUserId()) + "," + item.getProductionName());
+			}
+		});
+		return res;
+	}
+
+	// 鏍规嵁瑙掕壊Id鏌ヨ璇ヨ鑹蹭笅鐨勬墍鏈夌敤鎴蜂俊鎭�
+	@Override
+	public List<SysUser> getAllUsersByRoleId(String roleId) {
+		return userMapper.getAllUsersByRoleId(roleId);
+	}
+
+	/**
+	 * 鏍规嵁瑙掕壊缂栫爜鏌ヨ鐢ㄦ埛id闆嗗悎
+	 */
+	@Override
+	public List<String> getUserByRoleCode(String roleCode) {
+		return this.baseMapper.getUserByRoleCode(roleCode);
+	}
+
+	/**
+	 * 鏍规嵁瑙掕壊缂栫爜鍜岃澶囩紪鍙锋煡璇㈢敤鎴�
+	 */
+	@Override
+	public List<SysUser> getEquipmentAdmin(String roleCode, String equipmentId) {
+		return this.baseMapper.getEquipmentAdmin(roleCode, equipmentId);
+	}
+
+	@Override
+	public List<UserSelector> selectOperatorList(String equipmentCode, String productionId, String positionCode) {
+		LambdaQueryWrapper<SysUser> queryWrapper = new LambdaQueryWrapper<>();
+		queryWrapper.eq(SysUser::getPost, positionCode);
+		if(StringUtils.isNotBlank(equipmentCode)) {
+			queryWrapper.and(q -> q.isNull(SysUser::getEquipmentIds).or().eq(SysUser::getEquipmentIds, "").or().like(SysUser::getEquipmentIds, equipmentCode));
+		}
+		if(StringUtils.isNotBlank(productionId)) {
+			queryWrapper.exists("select 1 from mdc_user_production t where t.user_id=sys_user.id and t.pro_id={0}", productionId);
+		}
+		queryWrapper.eq(SysUser::getDelFlag, CommonConstant.DEL_FLAG_0);
+		queryWrapper.eq(SysUser::getStatus, CommonConstant.DEL_FLAG_1);
+		queryWrapper.orderByDesc(SysUser::getId);
+		List<SysUser> sysUsers = userMapper.selectList(queryWrapper);
+		List<UserSelector> collect = sysUsers.stream().map(user -> new UserSelector(user.getId(), user.getUsername(), user.getRealname())).collect(Collectors.toList());
+		return collect;
+	}
+
+	@Override
+	public List<UserSelector> selectOperatorList(String positionCode) {
+		LambdaQueryWrapper<SysUser> queryWrapper = new LambdaQueryWrapper<>();
+		queryWrapper.eq(SysUser::getPost, positionCode);
+		queryWrapper.eq(SysUser::getDelFlag, CommonConstant.DEL_FLAG_0);
+		queryWrapper.eq(SysUser::getStatus, CommonConstant.DEL_FLAG_1);
+		queryWrapper.orderByDesc(SysUser::getId);
+		List<SysUser> sysUsers = userMapper.selectList(queryWrapper);
+		List<UserSelector> collect = sysUsers.stream().map(user -> new UserSelector(user.getId(), user.getUsername(), user.getRealname())).collect(Collectors.toList());
+		return collect;
+	}
+
+	/**
+	 * 鏍规嵁鐢ㄦ埛鍚嶆壒閲忚幏鍙栫湡瀹炲鍚嶆槧灏�
+	 * @param userNames 鐢ㄦ埛鍚嶅垪琛�
+	 * @return 鐢ㄦ埛鍚�->鐪熷疄濮撳悕鐨勬槧灏勶紙涓嶅瓨鍦ㄦ椂鍊间负null锛�
+	 */
+	@Override
+	public Map<String, String> getUserRealNamesByUserNames(List<String> userNames) {
+		if (CollectionUtils.isEmpty(userNames)) {
+			return Collections.emptyMap();
+		}
+
+		// 鍘婚噸骞惰繃婊ょ┖鍊�
+		Set<String> uniqueNames = userNames.stream()
+				.filter(StringUtils::isNotBlank)
+				.collect(Collectors.toSet());
+		if (uniqueNames.isEmpty()) {
+			return Collections.emptyMap();
+		}
+
+		// 鎵归噺鏌ヨ锛堣嚜鍔ㄥ鐞咺N璇彞鍒嗙墖锛�
+		List<SysUser> users = userMapper.selectUsersByNames(new ArrayList<>(uniqueNames));
+
+		// 鏋勫缓鏄犲皠鍏崇郴
+		return users.stream()
+				.collect(Collectors.toMap(
+						SysUser::getUsername,
+						SysUser::getRealname,
+						(existing, replacement) -> existing // 閲嶅閿鐞�
+				));
+	}
+}

--
Gitblit v1.9.3