/* * Copyright (c) 2018-2028, Chill Zhuang All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * Neither the name of the dreamlu.net developer nor the names of its * contributors may be used to endorse or promote products derived from * this software without specific prior written permission. * Author: Chill 庄骞 (smallchill@163.com) */ package org.springblade.modules.system.service.impl; import com.baomidou.mybatisplus.core.conditions.Wrapper; 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.Wrappers; import com.google.zxing.WriterException; import lombok.AllArgsConstructor; import org.apache.commons.lang3.StringUtils; import org.apache.logging.log4j.util.Strings; import org.springblade.common.cache.DictCache; import org.springblade.common.cache.SysCache; import org.springblade.common.config.QrcodeConfig; import org.springblade.common.constant.AgeUtil; import org.springblade.common.constant.CommonConstant; import org.springblade.common.constant.TenantConstant; import org.springblade.common.enums.DictEnum; import org.springblade.common.utils.IdCardNoUtil; import org.springblade.common.utils.ImageUtils; import org.springblade.common.utils.QRCodeUtil; import org.springblade.core.log.exception.ServiceException; import org.springblade.core.mp.base.BaseServiceImpl; import org.springblade.core.mp.support.Condition; import org.springblade.core.mp.support.Query; import org.springblade.core.secure.utils.AuthUtil; import org.springblade.core.tenant.BladeTenantProperties; import org.springblade.core.tool.constant.BladeConstant; import org.springblade.core.tool.jackson.JsonUtil; import org.springblade.core.tool.support.Kv; import org.springblade.core.tool.utils.*; import org.springblade.modules.FTP.FtpUtil; import org.springblade.modules.auth.enums.UserEnum; import org.springblade.modules.dispatcher.entity.Dispatcher; import org.springblade.modules.dispatcher.vo.DispatcherVO; import org.springblade.modules.exam.util.SecurityPaperUtil; import org.springblade.modules.experience.entity.Experience; import org.springblade.modules.experience.service.IExperienceService; import org.springblade.modules.information.entity.Information; import org.springblade.modules.information.service.IInformationService; import org.springblade.modules.jurisdiction.entity.Jurisdiction; import org.springblade.modules.jurisdiction.service.JurisdictionService; import org.springblade.modules.securitypaper.entity.SecurityPaper; import org.springblade.modules.securitypaper.service.SecurityPaperService; import org.springblade.modules.system.entity.*; import org.springblade.modules.system.excel.*; import org.springblade.modules.system.mapper.UserMapper; import org.springblade.modules.system.node.TreeNode; import org.springblade.modules.system.service.*; import org.springblade.modules.system.vo.UserInfoDetail; import org.springblade.modules.system.vo.UserVO; import org.springblade.modules.system.wrapper.UserWrapper; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.UnsupportedEncodingException; import java.net.URLEncoder; import java.text.DecimalFormat; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.*; import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicInteger; import java.util.stream.Collectors; /** * 服务实现类 * * @author Chill */ @Service @AllArgsConstructor public class UserServiceImpl extends BaseServiceImpl implements IUserService { private static final String GUEST_NAME = "guest"; private final IUserDeptService userDeptService; private final IUserOauthService userOauthService; private final IRoleService roleService; private final BladeTenantProperties tenantProperties; private final IInformationService iInformationService; private final IDeptService deptService; private final JurisdictionService jurisdictionService; private final IExperienceService experienceService; private final MyAsyncService myAsyncService; private final SecurityPaperService securityPaperService; private final IUserDetailService userDetailService; private final IUserWxService userWxService; @Override @Transactional(rollbackFor = Exception.class) public boolean submit(User user) { if (StringUtil.isBlank(user.getTenantId())) { user.setTenantId(BladeConstant.ADMIN_TENANT_ID); } String tenantId = user.getTenantId(); Tenant tenant = SysCache.getTenant(tenantId); if (Func.isNotEmpty(tenant)) { Integer accountNumber = tenant.getAccountNumber(); if (tenantProperties.getLicense()) { String licenseKey = tenant.getLicenseKey(); String decrypt = DesUtil.decryptFormHex(licenseKey, TenantConstant.DES_KEY); accountNumber = JsonUtil.parse(decrypt, Tenant.class).getAccountNumber(); } Integer tenantCount = baseMapper.selectCount(Wrappers.query().lambda().eq(User::getTenantId, tenantId)); if (accountNumber != null && accountNumber > 0 && accountNumber <= tenantCount) { throw new ServiceException("当前租户已到最大账号额度!"); } } if (Func.isNotEmpty(user.getPassword())) { user.setPassword(DigestUtil.encrypt(user.getPassword())); } // Integer userCount = baseMapper.selectCount(Wrappers.query().lambda().eq(User::getTenantId, tenantId).eq(User::getAccount, user.getAccount())); Integer userCount = baseMapper.selectCountAccount(user.getAccount()); if (userCount > 0 && Func.isEmpty(user.getId())) { throw new ServiceException(StringUtil.format("当前用户 [{}] 已存在!", user.getAccount())); } boolean b = save(user) && submitUserDept(user); user.setIsDeleted(0); return b; } @Override @Transactional(rollbackFor = Exception.class) public boolean updateUser(User user) { return updateUserInfo(user) && submitUserDept(user); } @Override public boolean updateUserInfo(User user) { user.setPassword(null); return updateById(user); } private boolean submitUserDept(User user) { List deptIdList = Func.toLongList(user.getDeptId()); List userDeptList = new ArrayList<>(); deptIdList.forEach(deptId -> { UserDept userDept = new UserDept(); userDept.setUserId(user.getId()); userDept.setDeptId(deptId); userDeptList.add(userDept); }); userDeptService.remove(Wrappers.update().lambda().eq(UserDept::getUserId, user.getId())); return userDeptService.saveBatch(userDeptList); } @Override public IPage selectUserPages(IPage page, UserVO user) { if (null!=user.getAgeType() && user.getAgeType()!=4){ List userVOS = baseMapper.selectUserPagesByAge(page, user); //机构名称拼接 userVOS.forEach(userVO -> { if (null!=userVO.getDeptId()) { List list = baseMapper.getDeptName(userVO.getDeptId()); if (list.size() > 1) { if (null != list.get(1) && list.get(1) != "") { String s = list.get(1).toString(); if (s.equals("本市保安公司") || s.equals("保安培训学校") || s.equals("自招保安单位") || s.equals("武装押运公司") || s.equals("分公司") || s.equals("其他")){ userVO.setDeptName(list.get(0)); } else { userVO.setDeptName(list.get(1) + "," + list.get(0)); } } else { userVO.setDeptName(list.get(0)); } } if (list.size() == 1) { userVO.setDeptName(list.get(0)); } } }); return page.setRecords(userVOS); }else { List userVOS = baseMapper.selectUserPages(page, user); //机构名称拼接 userVOS.forEach(userVO -> { if (null!=userVO.getDeptId()) { String deptIds = ""; if (userVO.getAncestors() != null){ deptIds = userVO.getAncestors()+","+userVO.getDeptId(); }else{ deptIds = userVO.getDeptId(); } List deptNameList = SysCache.getDeptNames(deptIds); userVO.setFullDeptName(getFullDeptName(deptNameList)); List list = baseMapper.getDeptName(userVO.getDeptId()); if (list.size() > 1) { if (null != list.get(1) && list.get(1) != "") { String s = list.get(1).toString(); if (s.equals("本市保安公司") || s.equals("保安培训学校") || s.equals("自招保安单位") || s.equals("武装押运公司") || s.equals("分公司") || s.equals("其他")){ userVO.setDeptName(list.get(0)); } else { userVO.setDeptName(list.get(1) + "," + list.get(0)); } } else { userVO.setDeptName(list.get(0)); } } if (list.size() == 1) { userVO.setDeptName(list.get(0)); } } }); return page.setRecords(userVOS); } } private String getFullDeptName(List deptNameList) { String fullDeptName = ""; if (deptNameList != null){ if (deptNameList.size()>1){ //多级 if (StringUtil.isNotBlank(deptNameList.get(0))){ //本市保安公司 xxx xxx xxx String first = deptNameList.get(0); if (first.equals("本市保安公司") || first.equals("保安培训学校") || first.equals("自招保安单位") || first.equals("武装押运公司") || first.equals("分公司") || first.equals("其他")){ deptNameList.remove(0); fullDeptName = StringUtil.join(deptNameList,","); } } } } return fullDeptName; } @Override public IPage selectUserPage(IPage page, User user, Long deptId, String tenantId) { List deptIdList = SysCache.getDeptChildIds(deptId); List users = baseMapper.selectUserPage(page, user, deptIdList, tenantId); if(users.size()>0){ //遍历获取部门名称,角色名称 users.forEach(userVO -> { //查询当前部门名称及父级部门名称 if (null!=userVO.getDeptId()) { List list = baseMapper.getDeptName(userVO.getDeptId()); if (list.size() > 1) { if (null != list.get(1) && list.get(1) != "") { userVO.setDeptName(list.get(1) + "," + list.get(0)); } else { userVO.setDeptName(list.get(0)); } } if (list.size() == 1) { userVO.setDeptName(list.get(0)); } } //查询角色名称 if (null!=userVO.getRoleId()) { List asList = Arrays.asList(userVO.getRoleId().split(",")); StringBuilder builder = new StringBuilder(); asList.forEach(roleIs -> { Role role = roleService.getById(roleIs); if (null != role) { builder.append(role.getRoleName() + ","); } }); String substringRoleName = null; if (builder.toString().length() > 0) { substringRoleName = builder.toString().substring(0, builder.toString().length() - 1); } userVO.setRoleName(substringRoleName); } }); } return page.setRecords(users); } @Override public IPage selectUserSearch(UserVO user, Query query) { LambdaQueryWrapper queryWrapper = Wrappers.query().lambda(); if (StringUtil.isNotBlank(user.getName())) { queryWrapper.like(User::getName, user.getName()); } if (StringUtil.isNotBlank(user.getDeptName())) { String deptIds = SysCache.getDeptIdsByFuzzy(AuthUtil.getTenantId(), user.getDeptName()); if (StringUtil.isNotBlank(deptIds)) { queryWrapper.and(wrapper -> { List ids = Func.toStrList(deptIds); ids.forEach(id -> wrapper.like(User::getDeptId, id).or()); }); } } if (StringUtil.isNotBlank(user.getPostName())) { String postIds = SysCache.getPostIdsByFuzzy(AuthUtil.getTenantId(), user.getPostName()); if (StringUtil.isNotBlank(postIds)) { queryWrapper.and(wrapper -> { List ids = Func.toStrList(postIds); ids.forEach(id -> wrapper.like(User::getPostId, id).or()); }); } } IPage pages = this.page(Condition.getPage(query), queryWrapper); return UserWrapper.build().pageVO(pages); } @Override public User userByAccount(String tenantId, String account) { return baseMapper.selectOne(Wrappers.query().lambda().eq(User::getTenantId, tenantId).eq(User::getAccount, account).eq(User::getIsDeleted, BladeConstant.DB_NOT_DELETED)); } @Override public UserInfo userInfo(Long userId) { User user = baseMapper.selectById(userId); return buildUserInfo(user); } @Override public UserInfo userInfo(String tenantId, String account, String password) { User user = baseMapper.getUser(tenantId, account, password); return buildUserInfo(user); } /** * 获取用户信息(wx) * @param tenantId * @param phone * @param userEnum * @return */ @Override public UserInfo userInfoByWx(String tenantId, String phone, UserEnum userEnum) { User user = baseMapper.getUserByPhone(tenantId, phone); return buildUserInfo(user, userEnum); } @Override public UserInfo userInfo(String tenantId, String account, String password, UserEnum userEnum) { User user = baseMapper.getUser(tenantId, account, password); return buildUserInfo(user, userEnum); } @Override public UserInfo wxUserInfo(String tenantId, String account, String password, UserEnum userEnum) { //先去blade_user_wx表里查 UserWx userWx = userWxService.getUserWx(tenantId, account, password); if (userWx != null){ //根据身份证号去user表里查 User userParam = new User(); userParam.setCardid(userWx.getCardid()); userParam.setIsDeleted(0); List list = list(Condition.getQueryWrapper(userParam)); //user表里有数据,就直接返回user表的数据 if (list.size()>0){ User user = list.get(0); return buildUserInfo(user, userEnum); }else{ // User user = BuildUser(userWx); return buildUserInfo(user, userEnum); } }else{ return null; } } private User BuildUser(UserWx userWx) { User user = new User(); user.setId(userWx.getId()); user.setCode(userWx.getCode()); user.setUserType(userWx.getUserType()); user.setAccount(userWx.getAccount()); user.setPassword(userWx.getPassword()); user.setName(userWx.getName()); user.setRealName(userWx.getRealName()); user.setAvatar(userWx.getAvatar()); user.setEmail(userWx.getEmail()); user.setPhone(userWx.getPhone()); user.setBirthday(userWx.getBirthday()); user.setSex(userWx.getSex()); user.setRoleId(userWx.getRoleId()); user.setDeptId(userWx.getDeptId()); user.setPostId(userWx.getPostId()); user.setCardid(userWx.getCardid()); user.setNativeplace(userWx.getNativeplace()); user.setNation(userWx.getNation()); user.setEducation(userWx.getEducation()); user.setPoliticaloutlook(userWx.getPoliticaloutlook()); user.setHeight(userWx.getHeight()); user.setCell(userWx.getCell()); user.setEmail(userWx.getEmail()); user.setHold(userWx.getHold()); user.setStatus(userWx.getStatus()); user.setJurisdiction(userWx.getJurisdiction()); user.setSecuritynumber(userWx.getSecuritynumber()); user.setExaminationType(userWx.getExaminationType()); user.setFingerprint(userWx.getFingerprint()); user.setPhoto(userWx.getPhoto()); user.setDispatch(userWx.getDispatch()); user.setMyPicture(userWx.getMyPicture()); user.setIsApply(userWx.getIsApply()); user.setBirthtime(userWx.getBirthtime()); user.setIsTrain(userWx.getIsTrain()); user.setHealstats(userWx.getHealstats()); user.setSoil(userWx.getSoil()); user.setPaperTime(userWx.getPaperTime()); user.setReasonForLeav(userWx.getReasonForLeav()); user.setImgForLeav(userWx.getImgForLeav()); user.setHoldv(userWx.getHoldv()); user.setHoldvtime(userWx.getHoldvtime()); user.setInsurance(userWx.getInsurance()); user.setAuditTime(userWx.getAuditTime()); user.setGuncode(userWx.getGuncode()); user.setEquipmentCode(userWx.getEquipmentCode()); user.setIsFreeze(userWx.getIsFreeze()); user.setAuditStatus(userWx.getAuditStatus()); return user; } private UserInfo buildUserInfo(User user) { return buildUserInfo(user, UserEnum.WEB); } private UserInfo buildUserInfo(User user, UserEnum userEnum) { if (ObjectUtil.isEmpty(user)) { return null; } UserInfo userInfo = new UserInfo(); userInfo.setUser(user); if (Func.isNotEmpty(user)) { List roleAlias = roleService.getRoleAliases(user.getRoleId()); userInfo.setRoles(roleAlias); } // 根据每个用户平台,建立对应的detail表,通过查询将结果集写入到detail字段 Kv detail = Kv.create().set("type", userEnum.getName()); if (userEnum == UserEnum.WEB) { UserWeb userWeb = new UserWeb(); UserWeb query = userWeb.selectOne(Wrappers.lambdaQuery().eq(UserWeb::getUserId, user.getId())); if (ObjectUtil.isNotEmpty(query)) { detail.set("ext", query.getUserExt()); } } else if (userEnum == UserEnum.APP) { UserApp userApp = new UserApp(); UserApp query = userApp.selectOne(Wrappers.lambdaQuery().eq(UserApp::getUserId, user.getId())); if (ObjectUtil.isNotEmpty(query)) { detail.set("ext", query.getUserExt()); } } else { UserOther userOther = new UserOther(); UserOther query = userOther.selectOne(Wrappers.lambdaQuery().eq(UserOther::getUserId, user.getId())); if (ObjectUtil.isNotEmpty(query)) { detail.set("ext", query.getUserExt()); } } userInfo.setDetail(detail); return userInfo; } @Override @Transactional(rollbackFor = Exception.class) public UserInfo userInfo(UserOauth userOauth) { UserOauth uo = userOauthService.getOne(Wrappers.query().lambda().eq(UserOauth::getUuid, userOauth.getUuid()).eq(UserOauth::getSource, userOauth.getSource())); UserInfo userInfo; if (Func.isNotEmpty(uo) && Func.isNotEmpty(uo.getUserId())) { userInfo = this.userInfo(uo.getUserId()); userInfo.setOauthId(Func.toStr(uo.getId())); } else { userInfo = new UserInfo(); if (Func.isEmpty(uo)) { userOauthService.save(userOauth); userInfo.setOauthId(Func.toStr(userOauth.getId())); } else { userInfo.setOauthId(Func.toStr(uo.getId())); } User user = new User(); user.setAccount(userOauth.getUsername()); user.setTenantId(userOauth.getTenantId()); userInfo.setUser(user); userInfo.setRoles(Collections.singletonList(GUEST_NAME)); } return userInfo; } @Override public boolean grant(String userIds, String roleIds) { User user = new User(); user.setRoleId(roleIds); return this.update(user, Wrappers.update().lambda().in(User::getId, Func.toLongList(userIds))); } @Override public boolean resetPassword(String userIds) { User user = new User(); user.setPassword(DigestUtil.encrypt(CommonConstant.DEFAULT_PASSWORD)); user.setUpdateTime(DateUtil.now()); return this.update(user, Wrappers.update().lambda().in(User::getId, Func.toLongList(userIds))); } @Override public boolean updatePassword(Long userId, String oldPassword, String newPassword, String newPassword1) { User user = getById(userId); if (!newPassword.equals(newPassword1)) { throw new ServiceException("请输入正确的确认密码!"); } if (!user.getPassword().equals(DigestUtil.hex(oldPassword))) { throw new ServiceException("原密码不正确!"); } return this.update(Wrappers.update().lambda().set(User::getPassword, DigestUtil.hex(newPassword)).eq(User::getId, userId)); } @Override public boolean removeUser(String userIds) { if (Func.contains(Func.toLongArray(userIds), AuthUtil.getUserId())) { throw new ServiceException("不能删除本账号!"); } return deleteLogic(Func.toLongList(userIds)); } /** * 用户民警的导入 * @param data * @param isCovered * @param deptId */ @Override // @Transactional(rollbackFor = Exception.class) 去除事务回滚 public void importUser(List data, Boolean isCovered,String deptId) { //将不能导入的账号存起来 List errorList = new ArrayList<>(); //导入状态,默认为true ,如果有一个出现问题则为 false AtomicBoolean status = new AtomicBoolean(true); data.forEach(userExcel -> { User user = Objects.requireNonNull(BeanUtil.copy(userExcel, User.class)); //设置部门id String deptIds = userDeptService.selectIn(user.getDeptId()); // if (null!=deptIds && !deptIds.equals("")) { // if (null != deptId && !deptId.equals("")) { // if (!deptId.equals(deptIds)) { // throw new ServiceException("导入失败!不能导入不是当前辖区(机构)的数据!"); // } // } // user.setDeptId(deptIds); // }else { // //如果deptIds 为空,则说明还没有改公司 // throw new ServiceException("导入失败!机构名:["+user.getDeptId()+"]不存在!"); // } user.setDeptId(deptIds); //判断当前用户是否已在本单位,如果是的更新数据 User user1 = new User(); user1.setAccount(user.getDeptId()); // user1.setAccount(user.getCode()); user1.setIsDeleted(0); user1.setStatus(1); User user2 = this.getOne(Condition.getQueryWrapper(user1)); if (null==user2){ //用户不存在,去新增 // 设置租户ID user.setTenantId("000000"); //默认在职 user.setStatus(1); user.setIsDeleted(0); user.setCreateTime(new Date()); user.setUpdateTime(new Date()); //设置账号 user.setAccount(userExcel.getDeptId()); //user.setAccount(user.getCode()); //分配角色 Role role = new Role(); role.setRoleAlias("公安管理员"); Role oneRole = roleService.getOne(Condition.getQueryWrapper(role)); user.setRoleId(oneRole.getId().toString()); //性别 if (null != userExcel.getSex()) { if (userExcel.getSex().equals("男")) { user.setSex(1); } if (userExcel.getSex().equals("女")) { user.setSex(2); } } //获取辖区的数据 Jurisdiction jurisdiction = new Jurisdiction(); jurisdiction.setDeptName(userExcel.getDeptId()); Jurisdiction one = jurisdictionService.getOne(Condition.getQueryWrapper(jurisdiction)); user.setJurisdiction(one.getId().toString()); //获取默认密码配置 user.setPassword("123456"); // user.setPassword(user.getCode()); //加密 if (Func.isNotEmpty(user.getPassword())) { user.setPassword(DigestUtil.encrypt(user.getPassword())); } Integer userCount = baseMapper.selectCountAccount(user.getAccount()); if (userCount > 0 && Func.isEmpty(user.getId())) { throw new ServiceException(StringUtil.format("当前用户 [{}] 已存在!", user.getAccount())); } //新增 this.save(user); //内网同步 String s = "insert into blade_user(" + "id,tenant_id,code,account,password,real_name,phone,sex,role_id,dept_id," + "create_time,update_time,cardid,status,is_deleted,jurisdiction) " + "values(" + "'" + user.getId() + "'" + "," + "'" + user.getTenantId() + "'" + "," + "'" + user.getCode() + "'" + "," + "'" + user.getAccount() + "'" + "," + "'" + user.getPassword() + "'" + "," + "'" + user.getRealName() + "'" + "," + "'" + user.getPhone() + "'" + "," + "'" + user.getSex() + "'" + "," + "'" + user.getRoleId() + "'" + "," + "'" + user.getDeptId() + "'" + "," + "'" + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(user.getCreateTime()) + "'" + "," + "'" + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(user.getUpdateTime()) + "'" + "," + "'" + user.getCardid() + "'" + "," + "'" + user.getStatus() + "'" + "," + "'" + user.getIsDeleted() + "'" + "," + "'" + user.getJurisdiction() + "'" + ")"; //FtpUtil.sqlFileUpload(s); myAsyncService.dataSync(s); }else { //匹配组织机构是否一致,如果不一致 if(!user2.getDeptId().equals(user.getDeptId())){ Dept dept = deptService.getById(user2.getDeptId()); status.set(false); //加入集合 errorList.add(user.getCardid()); //forEach 只能使用 return 跳出本次循环 return; }else { //如果是一致,则更新用户数据 //更新用户数据 user2.setUpdateTime(new Date()); if (null!=user.getPhone() && !user.getPhone().equals("")){ user2.setPhone(user.getPhone()); } if (null!=user.getRealName() && !user.getRealName().equals("")){ user2.setRealName(user.getRealName()); } if (null!=user.getCardid() && !user.getCardid().equals("")){ user2.setCardid(user.getCardid()); } if (null!=user.getCode() && !user.getCode().equals("")){ user2.setCode(user.getCode()); user2.setAccount(user.getCode()); } user2.setAccount(userExcel.getDeptId()); this.updateById(user2); String s1 = "update blade_user set account = " + "'" + user2.getAccount() + "'" + ",code = " + "'" + user2.getCode() + "'" + ",real_name = " + "'" + user2.getRealName() + "'" + ",phone = " + "'" + user2.getPhone() + "'" + ",update_time = " + "'" + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(user2.getUpdateTime()) + "'" + ",cardid = " + "'" + user2.getCardid() + "'" + " " + "where id = " + "'" + user2.getId() + "'"; //FtpUtil.sqlFileUpload(s1); myAsyncService.dataSync(s1); } } }); //如果所有数据导入有一个异常 if (!status.get()){ String errorAccount = StringUtils.join(errorList, "\\\n"); throw new ServiceException("用户:["+errorAccount+"]导入失败!已在其他单位存在!"); } } @Override public List exportUser(Map param) { List userList = baseMapper.exportUser(param); userList.forEach(user -> { // user.setUserTypeName(DictCache.getValue(DictEnum.USER_TYPE, user.getUserType())); // user.setRoleName(StringUtil.join(SysCache.getRoleNames(user.getRoleId()))); // user.setDeptName(StringUtil.join(SysCache.getDeptNames(user.getDeptId()))); // user.setPostName(StringUtil.join(SysCache.getPostNames(user.getPostId()))); if (user.getSex() != null && StringUtil.isNotBlank(user.getSex())){ if (user.getSex().equals("1")){ user.setSex("男"); }else if (user.getSex().equals("2")){ user.setSex("女"); } } }); return userList; } @Override @Transactional(rollbackFor = Exception.class) public boolean registerGuest(User user, Long oauthId) { Tenant tenant = SysCache.getTenant(user.getTenantId()); if (tenant == null || tenant.getId() == null) { throw new ServiceException("租户信息错误!"); } UserOauth userOauth = userOauthService.getById(oauthId); if (userOauth == null || userOauth.getId() == null) { throw new ServiceException("第三方登陆信息错误!"); } user.setRealName(user.getName()); user.setAvatar(userOauth.getAvatar()); user.setRoleId(StringPool.MINUS_ONE); user.setDeptId(StringPool.MINUS_ONE); user.setPostId(StringPool.MINUS_ONE); boolean userTemp = this.submit(user); userOauth.setUserId(user.getId()); userOauth.setTenantId(user.getTenantId()); boolean oauthTemp = userOauthService.updateById(userOauth); return (userTemp && oauthTemp); } @Override public boolean updatePlatform(Long userId, Integer userType, String userExt) { if (userType.equals(UserEnum.WEB.getCategory())) { UserWeb userWeb = new UserWeb(); UserWeb query = userWeb.selectOne(Wrappers.lambdaQuery().eq(UserWeb::getUserId, userId)); if (ObjectUtil.isNotEmpty(query)) { userWeb.setId(query.getId()); } userWeb.setUserId(userId); userWeb.setUserExt(userExt); return userWeb.insertOrUpdate(); } else if (userType.equals(UserEnum.APP.getCategory())) { UserApp userApp = new UserApp(); UserApp query = userApp.selectOne(Wrappers.lambdaQuery().eq(UserApp::getUserId, userId)); if (ObjectUtil.isNotEmpty(query)) { userApp.setId(query.getId()); } userApp.setUserId(userId); userApp.setUserExt(userExt); return userApp.insertOrUpdate(); } else { UserOther userOther = new UserOther(); UserOther query = userOther.selectOne(Wrappers.lambdaQuery().eq(UserOther::getUserId, userId)); if (ObjectUtil.isNotEmpty(query)) { userOther.setId(query.getId()); } userOther.setUserId(userId); userOther.setUserExt(userExt); return userOther.insertOrUpdate(); } } @Override public UserVO platformDetail(User user) { User detail = baseMapper.selectOne(Condition.getQueryWrapper(user)); UserVO userVO = UserWrapper.build().entityVO(detail); if (userVO.getUserType().equals(UserEnum.WEB.getCategory())) { UserWeb userWeb = new UserWeb(); UserWeb query = userWeb.selectOne(Wrappers.lambdaQuery().eq(UserWeb::getUserId, user.getId())); if (ObjectUtil.isNotEmpty(query)) { userVO.setUserExt(query.getUserExt()); } } else if (userVO.getUserType().equals(UserEnum.APP.getCategory())) { UserApp userApp = new UserApp(); UserApp query = userApp.selectOne(Wrappers.lambdaQuery().eq(UserApp::getUserId, user.getId())); if (ObjectUtil.isNotEmpty(query)) { userVO.setUserExt(query.getUserExt()); } } else { UserOther userOther = new UserOther(); UserOther query = userOther.selectOne(Wrappers.lambdaQuery().eq(UserOther::getUserId, user.getId())); if (ObjectUtil.isNotEmpty(query)) { userVO.setUserExt(query.getUserExt()); } } return userVO; } /** * 通过 身份证号查询用户信息 * * @param idCardNo 身份证号 * @return */ @Override public User getUserInfoByIdCardNo(String idCardNo) { return baseMapper.getUserInfoByIdCardNo(idCardNo); } @Override public IPage selectUserPageSecurity(IPage page, User user) { return page.setRecords(baseMapper.selectUserPageSecurity(page, user)); } /** * 自定义用户列表(只有保安员),根据保安员查 */ @Override public List selectUserPageSecurityUnit(IPage page, User user) { return baseMapper.selectUserPageSecurity(null, user); } /** * 保安员列表,帅选无保安证 * * @param page * @param user * @return */ @Override public IPage selectUserPageSecurityApply(IPage page, UserVO user) { return baseMapper.selectUserPageSecurityApply(page, user); } /** * 保安员列表树 安员列表树,帅选无保安证,下拉tree * * @param user 用户信息 * @return */ @Override public List getSecurityApplyTree(UserVO user) { // 总的 List allList = new ArrayList<>(); // 考试未通过 List notList = new ArrayList<>(); // 新申报报名的 List newList = new ArrayList<>(); // 查询 List treeNodeList = baseMapper.getSecurityApplyTree(user); // 遍历 if (treeNodeList.size()>0){ for (TreeNode treeNode : treeNodeList) { if (treeNode.getType()==1){ notList.add(treeNode); } if (treeNode.getType()==2){ newList.add(treeNode); } } } if (newList.size()>0){ // 新申报报名的 TreeNode treeNode = new TreeNode(); treeNode.setName("新申报名单"); treeNode.setChildren(newList); allList.add(treeNode); } if (notList.size()>0){ // 考试未通过 TreeNode treeNode = new TreeNode(); treeNode.setName("未通过考试名单"); treeNode.setChildren(notList); allList.add(treeNode); } // 返回 return allList; } /** * 派遣保安员列表树 安员列表树,帅选无保安证,下拉tree * * @param user 用户信息 * @return */ @Override public List getSecurityDispatcherTree(UserVO user) { Map map = baseMapper.getSecurityDispatcherTree(user); List tree = new ArrayList<>(); if (map.size() > 1) { map.forEach((id, treeNode) -> { if (map.containsKey(treeNode.getParentId())) { map.get(treeNode.getParentId()).getChildren().add(treeNode); } else { tree.add(treeNode); } }); //将原有的保安员加入到集合 if (null!=user.getId()){ TreeNode treeNode = new TreeNode(); treeNode.setId(user.getId()); treeNode.setHasChildren(false); treeNode.setName(user.getRealName()); treeNode.setParentId(Long.parseLong(user.getDeptId())); tree.get(0).getChildren().add(treeNode); } //获取子节点 List children = tree.get(0).getChildren(); //排序 List nodes = children.stream().sorted(Comparator.comparing(TreeNode::getId)).collect(Collectors.toList()); //设置排序后的集合 tree.get(0).setChildren(nodes); } //返回 return tree; } @Override public List> selectInr(String deptid) { return baseMapper.selectInr(deptid); } /** * 查询当前年份已有的保安证编号 * * @param pre 前缀 * @return */ @Override public int getSecurityPaperCount(String pre) { return baseMapper.getSecurityPaperCount(pre); } /** * 查询当前公司未持证保安没有报名的人员 * * @param deptId * @return */ @Override public List getNotApplyIdList(String deptId) { return baseMapper.getNotApplyIdList(deptId); } /** * 计算保安人员年龄 * * @param userId * @return */ @Override public UserVO getUserAgeById(Long userId) { return baseMapper.getUserAgeById(userId); } @Override public List> selectUser() { return baseMapper.selectUser(); } /** * 导入保安员 * * @param data * @param isCovered */ @Override @Transactional(rollbackFor = Exception.class) public void importSecurity(List data, Boolean isCovered, String deptId) { //将不能导入的保安员账号存起来 List errorList = new ArrayList<>(); //年龄不符的保安员信息存入集合 List ageErrorList = new ArrayList<>(); //保安员证编号不符的保安员信息存入集合 List securityInvalidList = new ArrayList<>(); //将需要更新的保安员信息存入集合 List updateList = new ArrayList<>(); //需要新增的保安员集合 List userList = new ArrayList<>(); //需要新增的从业记录集合 List experienceList = new ArrayList<>(); //导入状态,默认为true ,如果有一个出现问题则为 false AtomicBoolean status = new AtomicBoolean(true); AtomicBoolean agetStatus = new AtomicBoolean(true); AtomicBoolean securityInvalidStatus = new AtomicBoolean(true); //遍历 for (SecurityExcel userExcel : data) { User user = Objects.requireNonNull(BeanUtil.copy(userExcel, User.class)); //设置部门id String deptIds = userDeptService.selectIn(user.getDeptId()); if (null!=deptIds && !deptIds.equals("")) { if (null != deptId && !deptId.equals("")) { if (!deptId.equals(deptIds)) { throw new ServiceException("导入失败!不能导入不是本公司的保安员数据!"); } } user.setDeptId(deptIds); }else { //如果deptIds 为空,则说明还没有改公司 throw new ServiceException("导入失败!公司名:["+user.getDeptId()+"]不存在!"); } //身份证校验 if (null==user.getCardid() || user.getCardid().equals("")){ throw new ServiceException("导入失败!身份证号码不能为空!"); } //身份证住址校验 if (null==userExcel.getPermanentResidenceAddress() || userExcel.getPermanentResidenceAddress().equals("")){ throw new ServiceException("导入失败!户籍地址不能为空!"); } if (null!=user.getCardid() && !user.getCardid().equals("")){ //去除所有空格 String cardid = user.getCardid().replaceAll(" ", ""); //校验 boolean b = IdCardNoUtil.checkIdCardNo(cardid); if(b){ user.setCardid(cardid); }else { agetStatus.set(false); ageErrorList.add(user.getCardid()); // throw new ServiceException("导入失败!身份证号码[ "+user.getCardid()+" ]不正确,请核对!"); //forEach 只能使用 return 跳出本次循环 // return; continue; } } //性别 user.setSex(Integer.parseInt(userExcel.getSex())); // 学历 user.setEducation(userExcel.getEducation()); //判断当前用户是否已在本单位,如果是的更新数据 User user1 = new User(); user1.setAccount(user.getCardid()); user1.setIsDeleted(0); user1.setStatus(1); User user2 = this.getOne(Condition.getQueryWrapper(user1)); if (null==user2){ //用户不存在,去新增 // 设置租户ID user.setTenantId("000000"); //默认在职 user.setStatus(1); user.setIsDeleted(0); securityNumberCheck(securityInvalidList, securityInvalidStatus, user, userExcel.getSecuritynumber(), userExcel.getCardid()); //分配保安角色 Role role = new Role(); role.setRoleAlias("保安"); Role oneRole = roleService.getOne(Condition.getQueryWrapper(role)); user.setRoleId(oneRole.getId().toString()); //设置账号 user.setAccount(user.getCardid()); //获取默认密码配置 user.setPassword(user.getCardid().substring(user.getCardid().length() - 6)); //加密 if (Func.isNotEmpty(user.getPassword())) { user.setPassword(DigestUtil.encrypt(user.getPassword())); } Integer userCount = baseMapper.selectCountAccount(user.getAccount()); if (userCount > 0 && Func.isEmpty(user.getId())) { throw new ServiceException(StringUtil.format("当前用户 [{}] 已存在!", user.getAccount())); } user.setCreateTime(new Date()); user.setDispatch("1"); user.setExaminationType("0"); //新增 boolean save = this.save(user); //并更新详情数据 if(save){ UserDetailEntity detailEntity = new UserDetailEntity(); detailEntity.setUserId(user.getId()); detailEntity.setDwellAddress(userExcel.getDwellAddress()); detailEntity.setEducationExperience(userExcel.getEducationExperience()); detailEntity.setMemberOfFamily(userExcel.getMemberOfFamily()); detailEntity.setWorkExperience(userExcel.getWorkExperience()); detailEntity.setPermanentResidenceAddress(userExcel.getPermanentResidenceAddress()); if (!Strings.isBlank(userExcel.getMarriageStatus())) { detailEntity.setMarriageStatus(Integer.parseInt(userExcel.getMarriageStatus())); } if (!Strings.isBlank(userExcel.getSignLevel())) { detailEntity.setSignLevel(Integer.parseInt(userExcel.getSignLevel())); } detailEntity.setUnitName(userExcel.getUnitName()); detailEntity.setPermanentResidenceAddress(userExcel.getPermanentResidenceAddress()); detailEntity.setDwellAddress(userExcel.getDwellAddress()); detailEntity.setAcceptancePoliceUnit(userExcel.getAcceptancePoliceUnit()); detailEntity.setAcceptancePerson(userExcel.getAcceptancePerson()); if (!Strings.isBlank(userExcel.getAcceptanceTime())){ try { detailEntity.setAcceptanceTime(new SimpleDateFormat("yyyy/MM/dd").parse(userExcel.getAcceptanceTime())); } catch (ParseException e) { e.printStackTrace(); } } userDetailService.save(detailEntity); } //加入集合 // userList.add(user); //从业记录新增 Experience experience = new Experience(); experience.setCardid(user.getCardid()); experience.setCompanyname(userExcel.getDeptId()); experience.setName(user.getRealName()); experience.setPost("保安员"); experience.setEntrytime(new Date()); // 新增 experienceService.save(experience); //加入集合 // experienceList.add(experience); }else { //匹配组织机构是否一致,如果不一致 if(!user2.getDeptId().equals(user.getDeptId())){ status.set(false); //加入集合 errorList.add(user.getCardid()); //forEach 只能使用 return 跳出本次循环 // return; continue; }else { // 学历 if (null!=userExcel.getEducation()){ user2.setEducation(user.getEducation()); }else { user2.setEducation(""); } // 政治面貌 if (null!=userExcel.getPoliticaloutlook()){ user2.setPoliticaloutlook(userExcel.getPoliticaloutlook()); }else { user2.setPoliticaloutlook(""); } user2.setUpdateTime(new Date()); //更新用户数据 boolean update = this.updateById(user2); //并更新详情数据 if(update){ // 通过用户id 查询,如果存在则更新,不存在则更新 QueryWrapper wrapper = new QueryWrapper<>(); wrapper.eq("is_deleted",0).eq("user_id",user2.getId()); UserDetailEntity one = userDetailService.getOne(wrapper); if (null!=one){ one.setDwellAddress(userExcel.getDwellAddress()); one.setEducationExperience(userExcel.getEducationExperience()); one.setMemberOfFamily(userExcel.getMemberOfFamily()); one.setWorkExperience(userExcel.getWorkExperience()); one.setPermanentResidenceAddress(userExcel.getPermanentResidenceAddress()); if (!Strings.isBlank(userExcel.getMarriageStatus())) { one.setMarriageStatus(Integer.parseInt(userExcel.getMarriageStatus())); } if (!Strings.isBlank(userExcel.getSignLevel())) { one.setSignLevel(Integer.parseInt(userExcel.getSignLevel())); } one.setUnitName(userExcel.getUnitName()); one.setPermanentResidenceAddress(userExcel.getPermanentResidenceAddress()); one.setDwellAddress(userExcel.getDwellAddress()); one.setAcceptancePoliceUnit(userExcel.getAcceptancePoliceUnit()); one.setAcceptancePerson(userExcel.getAcceptancePerson()); if (!Strings.isBlank(userExcel.getAcceptanceTime())){ try { one.setAcceptanceTime(new SimpleDateFormat("yyyy/MM/dd").parse(userExcel.getAcceptanceTime())); } catch (ParseException e) { e.printStackTrace(); } } userDetailService.updateById(one); }else { UserDetailEntity detailEntity = new UserDetailEntity(); detailEntity.setUserId(user2.getId()); detailEntity.setDwellAddress(userExcel.getDwellAddress()); detailEntity.setEducationExperience(userExcel.getEducationExperience()); detailEntity.setMemberOfFamily(userExcel.getMemberOfFamily()); detailEntity.setWorkExperience(userExcel.getWorkExperience()); detailEntity.setPermanentResidenceAddress(userExcel.getPermanentResidenceAddress()); if (!Strings.isBlank(userExcel.getMarriageStatus())) { detailEntity.setMarriageStatus(Integer.parseInt(userExcel.getMarriageStatus())); } if (!Strings.isBlank(userExcel.getSignLevel())) { detailEntity.setSignLevel(Integer.parseInt(userExcel.getSignLevel())); } detailEntity.setUnitName(userExcel.getUnitName()); detailEntity.setPermanentResidenceAddress(userExcel.getPermanentResidenceAddress()); detailEntity.setDwellAddress(userExcel.getDwellAddress()); detailEntity.setAcceptancePoliceUnit(userExcel.getAcceptancePoliceUnit()); detailEntity.setAcceptancePerson(userExcel.getAcceptancePerson()); if (!Strings.isBlank(userExcel.getAcceptanceTime())){ try { detailEntity.setAcceptanceTime(new SimpleDateFormat("yyyy/MM/dd").parse(userExcel.getAcceptanceTime())); } catch (ParseException e) { e.printStackTrace(); } } userDetailService.save(detailEntity); } } } } } //批量插入 //用户批量插入 // if (userList.size()>0) { // baseMapper.batchUserList(userList); // //装换成map // Map userMap = userList.stream().collect(Collectors.toMap(user -> user.getCardid(), user -> user)); // //匹配 // experienceList = experienceList.stream().map(experience -> { // if (experience.getCardid().equals(userMap.get(experience.getCardid()).getCardid())) { // experience.setSecurityid(userMap.get(experience.getCardid()).getId().toString()); // } // return experience; // }).collect(Collectors.toList()); // //批量插入从业记录 // baseMapper.batchExperienceList(experienceList); // } //如果所有数据导入有一个异常 StringBuilder errorBuilder = new StringBuilder(); if (!status.get()){ String errorAccount = StringUtils.join(errorList, "\\\n"); errorBuilder.append("用户:[" + errorAccount + "]导入失败!已在其他单位存在!"); } if (!agetStatus.get()){ String errorAccount = StringUtils.join(ageErrorList, "\\\n"); errorBuilder.append("用户:[" + errorAccount + "]导入失败!已在其他单位存在!"); } if (!securityInvalidStatus.get()){ String errorAccount = StringUtils.join(securityInvalidList, "\\\n"); errorBuilder.append("用户:[" + errorAccount + "]保安证编号不匹配,请核实!也可通过提供保安证件信息提交核实申请!"); } //抛出异常 if (errorBuilder.length()>0){ throw new ServiceException(errorBuilder.toString()); } } /** * 判断是否持证 * @param securityInvalidList * @param securityInvalidStatus * @param user * @param securitynumber * @param cardid2 */ public void securityNumberCheck(List securityInvalidList, AtomicBoolean securityInvalidStatus, User user, String securitynumber, String cardid2) { //判断是否持证 if (null != securitynumber && securitynumber != "") { user.setHold("1"); //校验保安员证编号是否合规 SecurityPaper securityPaper = new SecurityPaper(); securityPaper.setIdCardNo(cardid2); List securityPaperList = securityPaperService.list(Condition.getQueryWrapper(securityPaper)); if (securityPaperList.size() > 0) { boolean state = false; //遍历 for (SecurityPaper paper : securityPaperList) { if (paper.getNumber().equals(user.getSecuritynumber())) { state = true; } } if (!state) { user.setHold("2"); user.setSecuritynumber(null); securityInvalidList.add(cardid2); securityInvalidStatus.set(false); } } else { user.setHold("2"); user.setSecuritynumber(null); securityInvalidList.add(cardid2); securityInvalidStatus.set(false); } } else { user.setHold("2"); } } @Override public void importSecurityYy(List data, Boolean isCovered, String deptId) { //将不能导入的保安员账号存起来 List errorList = new ArrayList<>(); //将需要新增的保安员信息存入集合 List ageErrorList = new ArrayList<>(); //保安员证编号不符的保安员信息存入集合 List securityInvalidList = new ArrayList<>(); //将需要更新的保安员信息存入集合 List updateList = new ArrayList<>(); //导入状态,默认为true ,如果有一个出现问题则为 false AtomicBoolean status = new AtomicBoolean(true); AtomicBoolean agetStatus = new AtomicBoolean(true); AtomicBoolean securityInvalidStatus = new AtomicBoolean(true); data.forEach(userExcel -> { User user = Objects.requireNonNull(BeanUtil.copy(userExcel, User.class)); //设置部门id String deptIds = userDeptService.selectIn(user.getDeptId()); if (null!=deptIds && !deptIds.equals("")) { if (null != deptId && !deptId.equals("")) { if (!deptId.equals(deptIds)) { throw new ServiceException("导入失败!不能导入不是本公司的保安员数据!"); } } user.setDeptId(deptIds); }else { //如果deptIds 为空,则说明还没有改公司 throw new ServiceException("导入失败!公司名:["+user.getDeptId()+"]不存在!"); } //身份证号码校验 if (null==user.getCardid() || user.getCardid().equals("")){ throw new ServiceException("导入失败!身份证号码不能为空!"); } if (null!=user.getCardid() && !user.getCardid().equals("")){ //去除所有空格 String cardid = user.getCardid().replaceAll(" ", ""); //校验 boolean b = IdCardNoUtil.checkIdCardNo(cardid); if(b){ user.setCardid(cardid); }else { agetStatus.set(false); ageErrorList.add(user.getCardid()); // throw new ServiceException("导入失败!身份证号码[ "+user.getCardid()+" ]不正确,请核对!"); //forEach 只能使用 return 跳出本次循环 return; } } //判断当前用户是否已在本单位,如果是的更新数据 User user1 = new User(); user1.setAccount(user.getCardid()); user1.setIsDeleted(0); user1.setStatus(1); user1.setGuncode(user.getGuncode()); User user2 = this.getOne(Condition.getQueryWrapper(user1)); if (null==user2){ //用户不存在,去新增 // 设置租户ID user.setTenantId("000000"); //默认在职 user.setStatus(1); user.setIsDeleted(0); //判断是否持证 securityNumberCheck(securityInvalidList, securityInvalidStatus, user, userExcel.getSecuritynumber(), userExcel.getCardid()); //分配保安角色 Role role = new Role(); role.setRoleAlias("保安"); Role oneRole = roleService.getOne(Condition.getQueryWrapper(role)); user.setRoleId(oneRole.getId().toString()); //性别 if (null != userExcel.getSex()) { if (userExcel.getSex().equals("男")) { user.setSex(1); } if (userExcel.getSex().equals("女")) { user.setSex(2); } } //设置账号 user.setAccount(user.getCardid()); //获取默认密码配置 user.setPassword(user.getCardid().substring(user.getCardid().length() - 6)); //加密 if (Func.isNotEmpty(user.getPassword())) { user.setPassword(DigestUtil.encrypt(user.getPassword())); } Integer userCount = baseMapper.selectCountAccount(user.getAccount()); if (userCount > 0 && Func.isEmpty(user.getId())) { throw new ServiceException(StringUtil.format("当前用户 [{}] 已存在!", user.getAccount())); } user.setCreateTime(new Date()); //新增 this.save(user); //从业记录新增 Experience experience = new Experience(); experience.setCardid(user.getCardid()); experience.setSecurityid(user.getId().toString()); experience.setCompanyname(userExcel.getDeptId()); experience.setName(user.getRealName()); experience.setPost("保安员"); experience.setEntrytime(new Date()); experienceService.save(experience); } else { //匹配组织机构是否一致,如果不一致 if(!user2.getDeptId().equals(user.getDeptId())){ Dept dept = deptService.getById(user2.getDeptId()); Dept dept1 = deptService.getById(user.getDeptId()); //如果是南昌总公司分公司导入的 if (dept.getId().equals(1432626178757275649L) && dept1.getParentId().equals(1432626178757275649L)){ user2.setDeptId(dept1.getId().toString()); //判断是否持证 if (null != userExcel.getSecuritynumber() && userExcel.getSecuritynumber() != "") { user2.setHold("1"); user2.setSecuritynumber(user.getSecuritynumber()); //校验保安员证编号是否合规 SecurityPaper securityPaper = new SecurityPaper(); securityPaper.setIdCardNo(userExcel.getCardid()); List securityPaperList = securityPaperService.list(Condition.getQueryWrapper(securityPaper)); if (securityPaperList.size()>0){ boolean state = false; //遍历 for (SecurityPaper paper : securityPaperList) { if (paper.getNumber().equals(user.getSecuritynumber())){ state = true; } } if (!state){ user2.setHold("2"); user2.setSecuritynumber(null); securityInvalidList.add(userExcel.getCardid()); securityInvalidStatus.set(false); } }else { user2.setHold("2"); user2.setSecuritynumber(null); securityInvalidList.add(userExcel.getCardid()); securityInvalidStatus.set(false); } }else { user2.setHold("2"); } user2.setUpdateTime(new Date()); //更新用户数据 this.updateById(user2); }else { status.set(false); //加入集合 errorList.add(user.getCardid()); //forEach 只能使用 return 跳出本次循环 return; } }else { //如果是一致,则更新用户数据 //判断是否持证 // if (null != userExcel.getHold() && userExcel.getHold() != "") { // if (userExcel.getHold().equals("是") && userExcel.getSecuritynumber()!=null && !userExcel.getSecuritynumber().equals("")) { // user2.setHold("1"); // //更新保安证编号 // user2.setSecuritynumber(user.getSecuritynumber()); // } // if (userExcel.getHold().equals("否")) { // user2.setHold("2"); // } // } if (null != userExcel.getSecuritynumber() && userExcel.getSecuritynumber() != "") { user2.setHold("1"); user2.setSecuritynumber(user.getSecuritynumber()); //校验保安员证编号是否合规 SecurityPaper securityPaper = new SecurityPaper(); securityPaper.setIdCardNo(userExcel.getCardid()); List securityPaperList = securityPaperService.list(Condition.getQueryWrapper(securityPaper)); if (securityPaperList.size()>0){ boolean state = false; //遍历 for (SecurityPaper paper : securityPaperList) { if (paper.getNumber().equals(user.getSecuritynumber())){ state = true; } } if (!state){ user2.setHold("2"); user2.setSecuritynumber(null); securityInvalidList.add(userExcel.getCardid()); securityInvalidStatus.set(false); } }else { user2.setHold("2"); user2.setSecuritynumber(null); securityInvalidList.add(userExcel.getCardid()); securityInvalidStatus.set(false); } }else { user2.setHold("2"); } user2.setUpdateTime(new Date()); //更新用户数据 this.updateById(user2); } } }); //如果所有数据导入有一个异常 StringBuilder errorBuilder = new StringBuilder(); if (!status.get()){ String errorAccount = StringUtils.join(errorList, "\\\n"); errorBuilder.append("用户:[" + errorAccount + "]导入失败!已在其他单位存在!"); } if (!agetStatus.get()){ String errorAccount = StringUtils.join(ageErrorList, "\\\n"); errorBuilder.append("用户:[" + errorAccount + "]导入失败!已在其他单位存在!"); } if (!securityInvalidStatus.get()){ String errorAccount = StringUtils.join(securityInvalidList, "\\\n"); errorBuilder.append("用户:[" + errorAccount + "]保安证编号不匹配,请核实!也可通过提供保安证件信息提交核实申请!"); } //抛出异常 if (errorBuilder.length()>0){ throw new ServiceException(errorBuilder.toString()); } } /** * 根据保安员编码查询保安信息 * * @param securityNumber 保安证编码 * @return */ @Override public UserVO getUserInfoBySecurityNumber(String securityNumber,String cardid) { UserVO userVO = baseMapper.getUserInfoBySecurityNumber(securityNumber,cardid); //查询派遣信息 if (null!=userVO) { DispatcherVO dispatcherVO = baseMapper.getUserDispatcherInfo(userVO.getId()); if (null != dispatcherVO) { userVO.setDispatchUnitName(dispatcherVO.getDispatcherCompany()); userVO.setDispatchStartTime(new SimpleDateFormat("yyyy-MM-dd").format(dispatcherVO.getDispatchertime())); userVO.setDispatchEndTime(new SimpleDateFormat("yyyy-MM-dd").format(dispatcherVO.getEndTime())); } } return userVO; } /** * 保安员信息 * * @param user * @return */ @Override public UserVO getUserDetails(User user) { return baseMapper.getUserDetails(user); } /** * @param type 1:派遣 2:保安向 * @param deptid * @param jurisdiction * @return */ @Override public List> seleL(String type, String deptid, String jurisdiction, Long userId) { List> list = new ArrayList<>(); //派遣 if (Integer.parseInt(type) == 1) { list = baseMapper.getDispaterInfo(deptid, jurisdiction); } //工作汇报 //保安向保安 if (Integer.parseInt(type) == 2) { list = baseMapper.getWorkReportInfo(type, deptid, jurisdiction); } //保安向民警 if (Integer.parseInt(type) == 3) { //查询用户信息 User user = this.getById(userId); //判断用户是否被派遣 if (null != user.getDispatch()) { if (user.getDispatch().equals("0")) { //在派遣中,向派遣所在地辖区民警汇报 //查询派遣信息 DispatcherVO dispatcherVO = baseMapper.getDispatcherInfoByUserId(userId); list = baseMapper.getWorkReportInfos(null, null, dispatcherVO.getJurisdiction()); } if (user.getDispatch().equals("1")) { //未派遣或已派遣结束,向单位所在辖区民警汇报 Information information = new Information(); information.setDepartmentid(user.getDeptId()); Information one = iInformationService.getOne(Condition.getQueryWrapper(information)); list = baseMapper.getWorkReportInfos(type, null, one.getJurisdiction()); } } else { //未派遣或已派遣结束,向单位所在辖区民警汇报 Information information = new Information(); information.setDepartmentid(user.getDeptId()); Information one = iInformationService.getOne(Condition.getQueryWrapper(information)); list = baseMapper.getWorkReportInfos(type, null, one.getJurisdiction()); } } //民警对民警 if (Integer.parseInt(type) == 4) { list = baseMapper.getWorkReportInfo(type, deptid, jurisdiction); } //现场检查获取保安员 if (Integer.parseInt(type) == 5) { list = baseMapper.getSecurityInfo(jurisdiction); } return list; } /** * 查询账号相同的用户数量 * * @param account * @return */ @Override public Integer selectCount(String account) { return baseMapper.selectCountAccount(account); } /** * 查询用户表中未删除,未离职的用户信息 * @param username * @return */ @Override public User getUserInfo(String username) { return baseMapper.getUserInfo(username); } /** * 生成二维码 * @param data * @param isCovered * @param deptId */ @Override public void importQrCode(List data, Boolean isCovered, String deptId) { String url = QrcodeConfig.baseUrl + "securityInfo.html"; //二维码生成 data.forEach(qrCodeExcel -> { if (null!=qrCodeExcel.getSecuritynumber()) { String encoded = null; try { //中文字符串编码 encoded = URLEncoder.encode(qrCodeExcel.getSecuritynumber(),"UTF-8"); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } //url 拼接 String content = url + "?securityNumber=" + encoded; byte[] qrCodeImage = new byte[0]; try { //生成二维码字节流 qrCodeImage = QRCodeUtil.getQRCodeImage(content, 350, 350); } catch (WriterException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } String path = "D:\\QrCode\\"; FileOutputStream fileOutputStream = null; try { fileOutputStream = new FileOutputStream(path+qrCodeExcel.getSecuritynumber()+".png"); } catch (FileNotFoundException e) { e.printStackTrace(); } try { //图片下载到本地 fileOutputStream.write(qrCodeImage,0,qrCodeImage.length); fileOutputStream.flush(); fileOutputStream.close(); } catch (IOException e) { e.printStackTrace(); } } }); //头像生成 data.forEach(qrCodeExcel -> { if (null!=qrCodeExcel.getSecuritynumber()) { //查询用户头像url User user = new User(); user.setRealName(qrCodeExcel.getRealName()); user.setStatus(1); user.setIsDeleted(0); user.setSecuritynumber(qrCodeExcel.getSecuritynumber()); User user1 = this.getOne(Condition.getQueryWrapper(user)); //url 拼接 byte[] qrCodeImage = new byte[0]; //获取图片 qrCodeImage = ImageUtils.getFileStream(user1.getAvatar()); //路径 String path = "D:\\QrCode\\"; FileOutputStream fileOutputStream = null; try { fileOutputStream = new FileOutputStream(path+user1.getRealName()+user1.getCardid()+".png"); } catch (FileNotFoundException e) { e.printStackTrace(); } try { //图片下载到本地 fileOutputStream.write(qrCodeImage,0,qrCodeImage.length); fileOutputStream.flush(); fileOutputStream.close(); } catch (IOException e) { e.printStackTrace(); } } }); } /** * 根据用户账户查询用户是否存在 * @param account * @return */ @Override public Integer selectCountAccount(String account) { return baseMapper.selectCountAccount(account); } /** * 保安员信息导出 * @param user * @return */ @Override public List exportSecurityInfo(UserVO user) { return baseMapper.exportSecurityInfo(user); } /** * 导入保安员(admin 专用) * * @param data */ @Override public void importSecurityTest(List data) { //将不能导入的保安员账号存起来 List errorList = new ArrayList<>(); //年龄不符的保安员信息存入集合 List ageErrorList = new ArrayList<>(); //保安员证编号不符的保安员信息存入集合 List securityInvalidList = new ArrayList<>(); //将需要更新的保安员信息存入集合 List updateList = new ArrayList<>(); //需要新增的保安员集合 List userList = new ArrayList<>(); //需要新增的从业记录集合 List experienceList = new ArrayList<>(); //导入状态,默认为true ,如果有一个出现问题则为 false AtomicBoolean status = new AtomicBoolean(true); AtomicBoolean agetStatus = new AtomicBoolean(true); AtomicBoolean securityInvalidStatus = new AtomicBoolean(true); //遍历 for (SecurityExcel userExcel : data) { User user = Objects.requireNonNull(BeanUtil.copy(userExcel, User.class)); //设置部门id String deptIds = userDeptService.selectIn(user.getDeptId()); user.setDeptId(deptIds); //身份证校验 if (null==user.getCardid() || user.getCardid().equals("")){ throw new ServiceException("导入失败!身份证号码不能为空!"); } if (null!=user.getCardid() && !user.getCardid().equals("")){ //去除所有空格 String cardid = user.getCardid().replaceAll(" ", ""); //校验 boolean b = IdCardNoUtil.checkIdCardNo(cardid); if(b){ user.setCardid(cardid); }else { agetStatus.set(false); ageErrorList.add(user.getCardid()); //forEach 只能使用 return 跳出本次循环 // return; continue; } } //判断当前用户是否已在本单位,如果是的更新数据 User user1 = new User(); user1.setAccount(user.getCardid()); user1.setIsDeleted(0); user1.setStatus(1); User user2 = this.getOne(Condition.getQueryWrapper(user1)); if (null==user2){ //用户不存在,去新增 // 设置租户ID user.setTenantId("000000"); //默认在职 user.setStatus(1); user.setIsDeleted(0); user.setHold("2"); //分配保安角色 Role role = new Role(); role.setRoleAlias("保安"); Role oneRole = roleService.getOne(Condition.getQueryWrapper(role)); user.setRoleId(oneRole.getId().toString()); //性别 if (null != userExcel.getSex()) { if (userExcel.getSex().contains("男")) { user.setSex(1); } if (userExcel.getSex().contains("女")) { user.setSex(2); } } //设置账号 user.setAccount(user.getCardid()); //获取默认密码配置 user.setPassword(user.getCardid().substring(user.getCardid().length() - 6)); //加密 if (Func.isNotEmpty(user.getPassword())) { user.setPassword(DigestUtil.encrypt(user.getPassword())); } Integer userCount = baseMapper.selectCountAccount(user.getAccount()); if (userCount > 0 && Func.isEmpty(user.getId())) { throw new ServiceException(StringUtil.format("当前用户 [{}] 已存在!", user.getAccount())); } user.setCreateTime(new Date()); user.setDispatch("1"); user.setExaminationType("0"); //加入集合 userList.add(user); //从业记录新增 Experience experience = new Experience(); experience.setCardid(user.getCardid()); experience.setCompanyname(userExcel.getDeptId()); experience.setName(user.getRealName()); experience.setPost("保安员"); experience.setEntrytime(new Date()); //加入集合 experienceList.add(experience); }else { //匹配组织机构是否一致,如果不一致 if(!user2.getDeptId().equals(user.getDeptId())){ status.set(false); //加入集合 errorList.add(user.getCardid()); //forEach 只能使用 return 跳出本次循环 continue; }else { //如果是一致,则更新用户数据 user2.setUpdateTime(new Date()); //更新用户数据 this.updateById(user2); } } } //批量插入 //用户批量插入 if (userList.size()>0) { baseMapper.batchUserList(userList); //装换成map Map userMap = userList.stream().collect(Collectors.toMap(user -> user.getCardid(), user -> user)); //匹配 experienceList = experienceList.stream().map(experience -> { if (experience.getCardid().equals(userMap.get(experience.getCardid()).getCardid())) { experience.setSecurityid(userMap.get(experience.getCardid()).getId().toString()); } return experience; }).collect(Collectors.toList()); //批量插入从业记录 baseMapper.batchExperienceList(experienceList); } //如果所有数据导入有一个异常 StringBuilder errorBuilder = new StringBuilder(); if (!status.get()){ String errorAccount = StringUtils.join(errorList, "\\\n"); errorBuilder.append("用户:[" + errorAccount + "]导入失败!已在其他单位存在!"); } if (!agetStatus.get()){ String errorAccount = StringUtils.join(ageErrorList, "\\\n"); errorBuilder.append("用户:[" + errorAccount + "]导入失败!已在其他单位存在!"); } if (!securityInvalidStatus.get()){ String errorAccount = StringUtils.join(securityInvalidList, "\\\n"); errorBuilder.append("用户:[" + errorAccount + "]保安证编号不匹配,请核实!也可通过提供保安证件信息提交核实申请!"); } //抛出异常 if (errorBuilder.length()>0){ throw new ServiceException(errorBuilder.toString()); } } @Override public List> selectEquipent() { return baseMapper.selectEquipent(); } /** * 年龄分布查询 * @param user * @return */ @Override public Object getAgeStatistics(UserVO user) { //获取年龄分布数据 List list = baseMapper.getAgeStatistics(user); //返回 return list; } /** * 查询登录密码还是 123456 的单位信息 * @return */ @Override public Object getNotUpdatePwdInfo() { //查询角色为保安公司管理员的用户信息 User user = new User(); user.setRoleId("1414575196264300546"); user.setStatus(1); user.setIsDeleted(0); List list = this.list(Condition.getQueryWrapper(user)); List list1 = new ArrayList<>(); //遍历 if (list.size()>0){ byte[] bytes = DigestUtil.decodeHex(list.get(0).getPassword()); try { System.out.println("解密的密码 = " + new String(bytes)); } catch (Exception e) { e.printStackTrace(); } } return list; } /** * 根据用户 id 查询用户信息 * @param id * @return */ @Override public User getUserById(String id) { return baseMapper.getUserById(Long.parseLong(id)); } /** * 6个月未登录人员,进行冻结 */ @Override public void sixMonthNotLoginHandle() { // 查询6个月未登录人员 List userIds = baseMapper.getMoreDayNotLoginUser(183); // 统一冻结操作 baseMapper.updateFreeze(userIds); } /** * 12个月未登录人员,进行注销 */ @Override public void oneYearNotLoginHandle() { // 查询12个月未登录人员 List userIds = baseMapper.getMoreDayNotLoginUser(366); // 统一注销操作 baseMapper.updateLogout(userIds); } /** * 判断用户是否存在(根据手机号) * @param phone * @return */ @Override public UserInfo getUserByPhone(String phone) { User user = baseMapper.getUserByPhone("000000", phone); return buildUserInfo(user, UserEnum.WEB); } /** * 判断是否报名 * @param id * @return */ @Override public boolean getUserIsApply(Long id) { User user = baseMapper.getUserIsApply(id); if (null!=user){ return true; } return false; } /** * 自定义查询详情信息 * @param id * @return */ @Override public UserVO getUserDetailById(Long id) { return baseMapper.getUserDetailById(id); } /** * 数据处理 * @return */ @Override public Object dataHandler() { // 查询未关联的保安员 List list = baseMapper.getNotGlList(); // 批量插入 for (User user : list) { UserDetailEntity detailEntity = new UserDetailEntity(); detailEntity.setUserId(user.getId()); userDetailService.save(detailEntity); } return null; } /** * 微信注册用户,需要密码和手机号 * @param user * @return */ @Override public Boolean wxRegister(User user) { User params = new User(); params.setCardid(user.getCardid()); //查看数据库是否有相同身份证号 List list = list(Condition.getQueryWrapper(params)); if (list.size()>0){ throw new ServiceException("该身份证号已注册"); } //注册新用户 user.setAccount(user.getPhone()); //微信注册角色 user.setRoleId("1734015564173127681"); //微信注册机构 user.setDeptId("1734016112398020609"); user.setTenantId("000000"); if (StringUtil.isNotBlank(user.getRealName())){ user.setName(user.getRealName()); }else{ user.setName("微信用户"+user.getPhone()); user.setRealName("微信用户"+user.getPhone()); } boolean save = save(user); return save; } @Override public UserInfoDetail getUserInfoDetail(String id) { return baseMapper.getUserInfoDetail(id); } @Override public boolean batchAudit(String ids, String auditStatus) { return baseMapper.batchAudit(ids,auditStatus); } @Override public void importSecurityPaperTime(List data, Boolean isCovered, String deptId) { //将不能导入的保安员账号存起来 List errorList = new ArrayList<>(); //导入状态,默认为true ,如果有一个出现问题则为 false AtomicBoolean status = new AtomicBoolean(true); AtomicBoolean securityInvalidStatus = new AtomicBoolean(true); //遍历 for (UserCertificateExcel userExcel : data) { //身份证校验 if (null == userExcel.getCardid() || userExcel.getCardid().equals("")) { throw new ServiceException("导入失败!身份证号码不能为空!"); } if (null != userExcel.getCardid() && !userExcel.getCardid().equals("")) { //去除所有空格 String cardid = userExcel.getCardid().replaceAll(" ", ""); //校验 boolean b = IdCardNoUtil.checkIdCardNo(cardid); if (b) { userExcel.setCardid(cardid); } else { //forEach 只能使用 return 跳出本次循环 // return; continue; } } //根据身份证、保安证编号获取用户 User userInfoByIdCardNo = baseMapper.getUserInfoByIdCardNoAndSecurityNumber(userExcel.getCardid(),userExcel.getSecuritynumber()); if (userInfoByIdCardNo == null){ throw new ServiceException("导入失败!身份证号和保安证编号与系统不匹配!"); } User user = new User(); user.setId(userInfoByIdCardNo.getId()); if (!Strings.isBlank(userExcel.getPaperTime())) { try { user.setPaperTime(new SimpleDateFormat("yyyy-MM-dd").parse(userExcel.getPaperTime())); } catch (ParseException e) { e.printStackTrace(); } } updateById(user); //如果所有数据导入有一个异常 StringBuilder errorBuilder = new StringBuilder(); if (!status.get()) { String errorAccount = StringUtils.join(errorList, "\\\n"); errorBuilder.append("用户:[" + errorAccount + "]导入失败!已在其他单位存在!"); } //抛出异常 if (errorBuilder.length() > 0) { throw new ServiceException(errorBuilder.toString()); } } } }