fix:优化机构查询用户速度慢的问题

This commit is contained in:
zyd
2022-09-21 22:59:52 +08:00
parent ca3f48c207
commit 89f6240481
9 changed files with 111 additions and 65 deletions
@@ -51,6 +51,12 @@ public interface TsPositionDao extends BaseMapper<TsPosition> {
*/ */
List<TsRole> getRole(String positionId); List<TsRole> getRole(String positionId);
/**
* 根据用户ID获取岗位信息
* @param userId
* @return
*/
List<TsPosition> getPositionDataByUserId(@Param("userId") String userId);
/** /**
* 查询岗位以及绑定的角色信息 * 查询岗位以及绑定的角色信息
* @param tsPosition:岗位信息 * @param tsPosition:岗位信息
@@ -40,6 +40,12 @@ public interface ITsPositionService extends IService<TsPosition> {
*/ */
List<TsRole> getRole(String positionId); List<TsRole> getRole(String positionId);
/**
* 根据用户ID获取岗位信息
* @param userId
* @return
*/
List<TsPosition> getPositionDataByUserId(String userId);
/** /**
* 添加岗位 * 添加岗位
* @param tsPosition:岗位信息 * @param tsPosition:岗位信息
@@ -108,6 +108,16 @@ public class TsPositionServiceImpl extends ServiceImpl<TsPositionDao, TsPosition
return tsPositionDao.getRole(positionId); return tsPositionDao.getRole(positionId);
} }
/**
* 根据用户ID获取岗位信息
* @param userId
* @return
*/
@Override
public List<TsPosition> getPositionDataByUserId(String userId) {
return tsPositionDao.getPositionDataByUserId(userId);
}
/** /**
* 添加岗位 * 添加岗位
* @param tsPosition:岗位信息 * @param tsPosition:岗位信息
@@ -26,6 +26,10 @@ public interface TsUserDao extends BaseMapper<TsUser> {
@Select("select position_id from ts_user_position where user_id=#{userId}") @Select("select position_id from ts_user_position where user_id=#{userId}")
List<String> selectPositionIds(String userId); List<String> selectPositionIds(String userId);
@Update("UPDATE ts_user SET SYS_POSITION_IDS =#{positionIds} WHERE USID = #{userId}")
void updateUserPositionIds(@Param("userId") String userId,@Param("positionIds")String positionIds);
/** /**
* 添加岗位 * 添加岗位
* @param userId:用户ID * @param userId:用户ID
@@ -138,6 +138,10 @@ public class TsUser extends BaseEntity {
@TableField("SSO_ID") @TableField("SSO_ID")
private String ssoId; private String ssoId;
@ApiModelProperty(value = "系统设置岗位ID集合")
@TableField("SYS_POSITION_IDS")
private String sysPositionIds;
@ApiModelProperty(value = "岗位") @ApiModelProperty(value = "岗位")
@TableField(exist = false) @TableField(exist = false)
private List<TsPosition> positions; private List<TsPosition> positions;
@@ -28,6 +28,7 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Lazy; import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
@@ -135,8 +136,16 @@ public class TsUserServiceImpl extends ServiceImpl<TsUserDao, TsUser> implements
if(tsUser==null){ if(tsUser==null){
return Result.error("该用户不存在"); return Result.error("该用户不存在");
} }
//此处更新user表中的岗位字段
List<String> positionIds = userPositionVO.getPositionIds();
positionIds.removeIf(s -> null==s||""==s);
String optionsIdStr = StringUtils.join(positionIds, ",");
if(StringUtils.isBlank(optionsIdStr)){
optionsIdStr = null;
}
tsUserDao.updateUserPositionIds(userPositionVO.getUserId(),optionsIdStr);
List<String> oldPositionIds=tsUserDao.selectPositionIds(userPositionVO.getUserId()); List<String> oldPositionIds=tsUserDao.selectPositionIds(userPositionVO.getUserId());
Map<String,List<String>> ids= ListUtil.difList(userPositionVO.getPositionIds(),oldPositionIds); Map<String,List<String>> ids= ListUtil.difList(positionIds,oldPositionIds);
List<String> insertIds=ids.get("insert"); List<String> insertIds=ids.get("insert");
List<String> deleteIds=ids.get("delete"); List<String> deleteIds=ids.get("delete");
if(insertIds!=null&&insertIds.size()>0){ if(insertIds!=null&&insertIds.size()>0){
@@ -163,7 +172,13 @@ public class TsUserServiceImpl extends ServiceImpl<TsUserDao, TsUser> implements
public ResponseMessage<Object> setPositionBatch(UserPositionBatchVO userPositionVO2) { public ResponseMessage<Object> setPositionBatch(UserPositionBatchVO userPositionVO2) {
boolean flag=true; boolean flag=true;
//此处更新user表中的岗位字段
List<String> positionIds = userPositionVO2.getPositionIds();
positionIds.removeIf(s -> null==s||""==s);
String optionsIdStr = StringUtils.join(positionIds, ",");
if(StringUtils.isBlank(optionsIdStr)){
optionsIdStr = null;
}
for (String s:userPositionVO2.getUserId()) { for (String s:userPositionVO2.getUserId()) {
UserPositionVO userPositionVO=new UserPositionVO(); UserPositionVO userPositionVO=new UserPositionVO();
userPositionVO.setUserId(s); userPositionVO.setUserId(s);
@@ -171,9 +186,11 @@ public class TsUserServiceImpl extends ServiceImpl<TsUserDao, TsUser> implements
TsUser tsUser=tsUserDao.selectById(userPositionVO.getUserId()); TsUser tsUser=tsUserDao.selectById(userPositionVO.getUserId());
if(tsUser==null){ if(tsUser==null){
flag=false; flag=false;
continue;
} }
tsUserDao.updateUserPositionIds(userPositionVO.getUserId(),optionsIdStr);
List<String> oldPositionIds=tsUserDao.selectPositionIds(userPositionVO.getUserId()); List<String> oldPositionIds=tsUserDao.selectPositionIds(userPositionVO.getUserId());
Map<String,List<String>> ids= ListUtil.difList(userPositionVO.getPositionIds(),oldPositionIds); Map<String,List<String>> ids= ListUtil.difList(positionIds,oldPositionIds);
List<String> insertIds=ids.get("insert"); List<String> insertIds=ids.get("insert");
List<String> deleteIds=ids.get("delete"); List<String> deleteIds=ids.get("delete");
if(insertIds!=null&&insertIds.size()>0){ if(insertIds!=null&&insertIds.size()>0){
@@ -210,6 +227,13 @@ public class TsUserServiceImpl extends ServiceImpl<TsUserDao, TsUser> implements
List<String> middle=new ArrayList<>(); List<String> middle=new ArrayList<>();
middle.addAll(orgIds); middle.addAll(orgIds);
boolean Orgflag=true; boolean Orgflag=true;
//此处更新user表中的岗位字段
List<String> positionIds = userPositionVO2.getPositionIds();
positionIds.removeIf(s -> null==s||""==s);
String optionsIdStr = StringUtils.join(positionIds, ",");
if(StringUtils.isBlank(optionsIdStr)){
optionsIdStr = null;
}
while (Orgflag){ while (Orgflag){
QueryWrapper<TsInstitution> queryWrapper=new QueryWrapper<>(); QueryWrapper<TsInstitution> queryWrapper=new QueryWrapper<>();
queryWrapper.in("parent_id",middle); queryWrapper.in("parent_id",middle);
@@ -234,25 +258,23 @@ public class TsUserServiceImpl extends ServiceImpl<TsUserDao, TsUser> implements
for (TsUser user : allUsers) { for (TsUser user : allUsers) {
String userId = user.getUserId(); String userId = user.getUserId();
UserPositionVO userPositionVO=new UserPositionVO(); TsUser tsUser=tsUserDao.selectById(userId);
userPositionVO.setUserId(userId);
userPositionVO.setPositionIds(userPositionVO2.getPositionIds());
TsUser tsUser=tsUserDao.selectById(userPositionVO.getUserId());
if(tsUser==null){ if(tsUser==null){
continue; continue;
} }
List<String> oldPositionIds=tsUserDao.selectPositionIds(userPositionVO.getUserId()); tsUserDao.updateUserPositionIds(userId,optionsIdStr);
Map<String,List<String>> ids= ListUtil.difList(userPositionVO.getPositionIds(),oldPositionIds); List<String> oldPositionIds=tsUserDao.selectPositionIds(userId);
Map<String,List<String>> ids= ListUtil.difList(positionIds,oldPositionIds);
List<String> insertIds=ids.get("insert"); List<String> insertIds=ids.get("insert");
List<String> deleteIds=ids.get("delete"); List<String> deleteIds=ids.get("delete");
if(insertIds!=null&&insertIds.size()>0){ if(insertIds!=null&&insertIds.size()>0){
for(String positionId:insertIds){ for(String positionId:insertIds){
tsUserDao.addPosition(userPositionVO.getUserId(),positionId); tsUserDao.addPosition(userId,positionId);
} }
} }
if(deleteIds!=null&&deleteIds.size()>0){ if(deleteIds!=null&&deleteIds.size()>0){
for(String positionId:deleteIds){ for(String positionId:deleteIds){
tsUserDao.delPosition(userPositionVO.getUserId(),positionId); tsUserDao.delPosition(userId,positionId);
} }
} }
} }
@@ -459,42 +481,44 @@ public class TsUserServiceImpl extends ServiceImpl<TsUserDao, TsUser> implements
@Override @Override
public IPage<TsUser> getAllUsers(TsUser tsUser) { public IPage<TsUser> getAllUsers(TsUser tsUser) {
List<String> ids=new ArrayList<>(); List<String> ids=new ArrayList<>();
QueryWrapper<TsInstitution> queryWrapper=new QueryWrapper<>(); ids.add(tsUser.getInstitutionId());
queryWrapper.like("parent_id",tsUser.getInstitutionId()); List<String> middle=new ArrayList<>();
List<TsInstitution> tsmiddle=tsInstitutionService.list(queryWrapper); middle.addAll(ids);
if(tsmiddle!=null && !tsmiddle.isEmpty()){ boolean flag=true;
tsmiddle.forEach(tsInstitution -> { while (flag){
ids.add(tsInstitution.getId()); QueryWrapper<TsInstitution> queryWrapper=new QueryWrapper<>();
}); queryWrapper.in("parent_id",middle);
List<TsInstitution> tsmiddle=tsInstitutionService.list(queryWrapper);
if (tsmiddle.size()>0){
tsmiddle.forEach(tsInstitution -> {
middle.add(tsInstitution.getId());
});
middle.removeAll(ids);
ids.addAll(middle);
}else {
tsmiddle.forEach(tsInstitution -> {
middle.add(tsInstitution.getId());
});
middle.removeAll(ids);
ids.addAll(middle);
flag=false;
}
} }
// List<String> middle=new ArrayList<>(); ids.removeIf(s -> null==s);
// middle.addAll(ids); List<TsUser> tsUsers = tsUserDao.userUnderInstitution((tsUser.getCurrent() - 1) * tsUser.getSize(), tsUser.getSize(), tsUser, ids);
// boolean flag=true; if(tsUsers!=null && !tsUsers.isEmpty()){
// while (flag){ for (TsUser user:tsUsers) {
// QueryWrapper<TsInstitution> queryWrapper=new QueryWrapper<>(); List<TsPosition> positionList = tsPositionService.getPositionDataByUserId(user.getUserId());
// queryWrapper.in("parent_id",middle); user.setPositions(positionList);
// List<TsInstitution> tsmiddle=tsInstitutionService.list(queryWrapper); }
// if (tsmiddle.size()>0){ }
// tsmiddle.forEach(tsInstitution -> {
// middle.add(tsInstitution.getId());
// });
// middle.removeAll(ids);
// ids.addAll(middle);
// }else {
// tsmiddle.forEach(tsInstitution -> {
// middle.add(tsInstitution.getId());
// });
// middle.removeAll(ids);
// ids.addAll(middle);
// flag=false;
// }
// }
// ids.removeIf(s -> null==s);
Page<TsUser> tsUserPage = new Page<>(); Page<TsUser> tsUserPage = new Page<>();
tsUserPage.setCurrent(tsUser.getCurrent()); tsUserPage.setCurrent(tsUser.getCurrent());
tsUserPage.setSize(tsUser.getSize()); tsUserPage.setSize(tsUser.getSize());
tsUserPage.setRecords(tsUserDao.userUnderInstitution((tsUser.getCurrent()-1)*tsUser.getSize(),tsUser.getSize(),tsUser,ids)); tsUserPage.setRecords(tsUsers);
tsUserPage.setTotal(tsUserDao.userUnderInstitutionCount(tsUser,ids)); tsUserPage.setTotal(tsUserDao.userUnderInstitutionCount(tsUser,ids));
return tsUserPage; return tsUserPage;
} }
@@ -17,6 +17,7 @@
<result property="uname" column="UNAME"/> <result property="uname" column="UNAME"/>
</collection> </collection>
</resultMap> </resultMap>
<select id="getRole" resultType="com.adc.da.slrs.sarRole.entity.TsRole"> <select id="getRole" resultType="com.adc.da.slrs.sarRole.entity.TsRole">
select * from ts_role r select * from ts_role r
left join ts_position_role ps left join ts_position_role ps
@@ -24,6 +25,12 @@
where ps.position_id=#{positionId} where ps.position_id=#{positionId}
</select> </select>
<select id="getPositionDataByUserId" resultType="com.adc.da.slrs.sarPosition.entity.TsPosition">
SELECT id,name FROM ts_position
LEFT JOIN ts_user_position ON ts_position.id = ts_user_position.position_id
WHERE ts_user_position.user_id =#{userId}
</select>
<select id="selectPositionAndRole" resultMap="PositionAndRole"> <select id="selectPositionAndRole" resultMap="PositionAndRole">
select p.*,r.id rid,r.name r_name ,tu.UNAME as UNAME from ts_position p select p.*,r.id rid,r.name r_name ,tu.UNAME as UNAME from ts_position p
left join ts_position_role pr left join ts_position_role pr
@@ -22,6 +22,7 @@
<result property="unlockFlag" column="unlock_flag"/> <result property="unlockFlag" column="unlock_flag"/>
<result property="userType" column="user_type"/> <result property="userType" column="user_type"/>
<result property="ssoId" column="sso_id"/> <result property="ssoId" column="sso_id"/>
<result property="sysPositionIds" column="sys_position_ids"/>
<collection property="positions" ofType="com.adc.da.slrs.sarPosition.entity.TsPosition"> <collection property="positions" ofType="com.adc.da.slrs.sarPosition.entity.TsPosition">
<result property="id" column="p_id"/> <result property="id" column="p_id"/>
<result property="name" column="p_name"/> <result property="name" column="p_name"/>
@@ -51,12 +52,8 @@
<select id="getUserUnderInstitutionAll" resultMap="UserPosition"> <select id="getUserUnderInstitutionAll" resultMap="UserPosition">
select u.USID,u.ACCOUNT,u.PASSWORD,u.OPER_USER,u.UNAME,u.SEX,u.USER_SOURCE,u.PHONE,u.EMAIL,u.INSTITUTION_NAME,u.INSTITUTION_ID select u.USID,u.ACCOUNT,u.PASSWORD,u.OPER_USER,u.UNAME,u.SEX,u.USER_SOURCE,u.PHONE,u.EMAIL,u.INSTITUTION_NAME,u.INSTITUTION_ID
,u.POSITION_NAME,u.STATE,u.POSITION_ID,u.WORK_NUM,u.EXT_INFO,u.CREATION_TIME,u.MODIFY_TIME,u.VALID_FLAG ,u.POSITION_NAME,u.STATE,u.POSITION_ID,u.WORK_NUM,u.EXT_INFO,u.CREATION_TIME,u.MODIFY_TIME,u.VALID_FLAG
,u.DISABLE_FLAG,u.UNLOCK_FLAG,u.USER_TYPE,u.SSO_ID, ,u.DISABLE_FLAG,u.UNLOCK_FLAG,u.USER_TYPE,u.SSO_ID,u.SYS_POSITION_IDS
p.id p_id,p.name p_name from ts_user u from ts_user u
left join ts_user_position up
on u.usid=up.user_id
left join ts_position p
on up.position_id=p.id
where 1=1 where 1=1
<if test=" null != ids and ids.size()> 0"> <if test=" null != ids and ids.size()> 0">
and INSTITUTION_ID in and INSTITUTION_ID in
@@ -76,12 +73,7 @@
<select id="userUnderInstitution" parameterType="com.adc.da.slrs.sarUser.entity.TsUser" resultMap="UserPosition"> <select id="userUnderInstitution" parameterType="com.adc.da.slrs.sarUser.entity.TsUser" resultMap="UserPosition">
select u.USID,u.ACCOUNT,u.PASSWORD,u.OPER_USER,u.UNAME,u.SEX,u.USER_SOURCE,u.PHONE,u.EMAIL,u.INSTITUTION_NAME,u.INSTITUTION_ID select u.USID,u.ACCOUNT,u.PASSWORD,u.OPER_USER,u.UNAME,u.SEX,u.USER_SOURCE,u.PHONE,u.EMAIL,u.INSTITUTION_NAME,u.INSTITUTION_ID
,u.POSITION_NAME,u.STATE,u.POSITION_ID,u.WORK_NUM,u.EXT_INFO,u.CREATION_TIME,u.MODIFY_TIME,u.VALID_FLAG ,u.POSITION_NAME,u.STATE,u.POSITION_ID,u.WORK_NUM,u.EXT_INFO,u.CREATION_TIME,u.MODIFY_TIME,u.VALID_FLAG
,u.DISABLE_FLAG,u.UNLOCK_FLAG,u.USER_TYPE,u.SSO_ID, ,u.DISABLE_FLAG,u.UNLOCK_FLAG,u.USER_TYPE,u.SSO_ID,u.SYS_POSITION_IDS from ts_user u
p.id p_id,p.name p_name from ts_user u
left join ts_user_position up
on u.usid=up.user_id
left join ts_position p
on up.position_id=p.id
where 1=1 where 1=1
<if test="TsUser.uname != null and TsUser.uname != '' "> <if test="TsUser.uname != null and TsUser.uname != '' ">
and (u.uname like concat('%',#{TsUser.uname},'%') or u.ACCOUNT like concat(#{TsUser.uname},'%')) and (u.uname like concat('%',#{TsUser.uname},'%') or u.ACCOUNT like concat(#{TsUser.uname},'%'))
@@ -90,21 +82,17 @@
and u.email like concat('%',#{TsUser.email},'%') and u.email like concat('%',#{TsUser.email},'%')
</if> </if>
<if test=" null != ids and ids.size()> 0"> <if test=" null != ids and ids.size()> 0">
and INSTITUTION_ID in and u.INSTITUTION_ID in
<foreach item="id" collection="ids" open="(" separator="," close=")" index="index"> <foreach item="id" collection="ids" open="(" separator="," close=")" index="index">
#{id} #{id}
</foreach> </foreach>
</if> </if>
ORDER BY p.id is null,p.create_time ORDER BY u.SYS_POSITION_IDS is null,u.USID
limit #{start},#{end} limit #{start},#{end}
</select> </select>
<select id="userUnderInstitutionCount" resultType="java.lang.Integer"> <select id="userUnderInstitutionCount" resultType="java.lang.Integer">
select count(u.USID) from ts_user u select count(u.USID) from ts_user u
left join ts_user_position up
on u.usid=up.user_id
left join ts_position p
on up.position_id=p.id
where 1=1 where 1=1
<if test="TsUser.uname != null and TsUser.uname != '' "> <if test="TsUser.uname != null and TsUser.uname != '' ">
and u.uname like concat('%',#{TsUser.uname},'%') and u.uname like concat('%',#{TsUser.uname},'%')
@@ -113,7 +101,7 @@
and u.email like concat('%',#{TsUser.email},'%') and u.email like concat('%',#{TsUser.email},'%')
</if> </if>
<if test=" null != ids and ids.size()> 0"> <if test=" null != ids and ids.size()> 0">
and INSTITUTION_ID in and u.INSTITUTION_ID in
<foreach item="id" collection="ids" open="(" separator="," close=")" index="index"> <foreach item="id" collection="ids" open="(" separator="," close=")" index="index">
#{id} #{id}
</foreach> </foreach>
@@ -122,10 +110,6 @@
<select id="getUserAndPositionCount" parameterType="com.adc.da.slrs.sarUser.entity.TsUser" resultType="java.lang.Integer"> <select id="getUserAndPositionCount" parameterType="com.adc.da.slrs.sarUser.entity.TsUser" resultType="java.lang.Integer">
select count(u.USID) from ts_user u select count(u.USID) from ts_user u
left join ts_user_position up
on u.usid=up.user_id
left join ts_position p
on up.position_id=p.id
where 1=1 where 1=1
<if test="TsUser.institutionId != null and TsUser.institutionId != '' "> <if test="TsUser.institutionId != null and TsUser.institutionId != '' ">
and u.institution_id=#{TsUser.institutionId} and u.institution_id=#{TsUser.institutionId}
@@ -0,0 +1 @@
ALTER TABLE `ts_user` ADD COLUMN `SYS_POSITION_IDS` varchar(2000) NULL COMMENT '设置的岗位ID集合' AFTER `SSO_ID`;