Commit cef9c004 by zwb

新增用户管理,修改岗位智推为userId去重

parent 4726ec1c
package com.bkty.system.controller;
import cn.dev33.satoken.secure.BCrypt;
import cn.hutool.core.util.ArrayUtil;
import cn.hutool.core.util.ObjectUtil;
import com.bkty.system.api.model.LoginUser;
import com.bkty.system.domain.dto.EditPasswordDto;
import com.bkty.system.domain.dto.SysRoleDto;
import com.bkty.system.domain.dto.SysUserDto;
import com.bkty.system.domain.vo.SysRoleVo;
import com.bkty.system.domain.vo.SysUserInfoVo;
import com.bkty.system.domain.vo.SysUserVo;
import com.bkty.system.domain.vo.UserInfoVo;
import com.bkty.system.service.Isys.ISysRoleService;
import com.bkty.system.service.Isys.ISysUserService;
import io.swagger.v3.oas.annotations.Operation;
import lombok.RequiredArgsConstructor;
import org.dromara.common.core.constant.UserConstants;
import org.dromara.common.core.domain.R;
import org.dromara.common.core.exception.ServiceException;
import org.dromara.common.core.utils.StreamUtils;
import org.dromara.common.core.utils.StringUtils;
import org.dromara.common.log.annotation.Log;
import org.dromara.common.log.enums.BusinessType;
import org.dromara.common.mybatis.core.page.PageQuery;
import org.dromara.common.mybatis.core.page.TableDataInfo;
import org.dromara.common.satoken.utils.LoginHelper;
import org.dromara.common.web.core.BaseController;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import java.util.List;
/**
* 用户信息
*
* @author Lion Li
*/
@Validated
@RequiredArgsConstructor
@RestController
@RequestMapping("/user")
public class SysUserController extends BaseController {
private final ISysUserService userService;
private final ISysRoleService roleService;
/**
* 获取用户列表
*/
// @SaCheckPermission("system:user:list")
@GetMapping("/list")
public TableDataInfo<SysUserVo> list(SysUserDto user, PageQuery pageQuery) {
return userService.selectPageUserList(user, pageQuery);
}
/**
* 新增用户信息
*/
// @SaCheckPermission("system:user:edit")
@Log(title = "新增用户信息", businessType = BusinessType.INSERT)
@PostMapping
public R<Void> insertUser(@Validated @RequestBody SysUserDto user) {
if (user.getRoleIds() == null || user.getRoleIds().length == 0) {
throw new ServiceException("角色不能为空");
}
return toAjax(userService.insertUser(user));
}
/**
* 修改用户
*/
// @SaCheckPermission("system:user:edit")
@Log(title = "用户管理", businessType = BusinessType.UPDATE)
@PutMapping
public R<Void> edit(@Validated @RequestBody SysUserDto user) {
userService.checkUserAllowed(user.getUserId());
userService.checkUserDataScope(user.getUserId());
if (!userService.checkUserNameUnique(user)) {
return R.fail("修改用户'" + user.getUserName() + "'失败,登录账号已存在");
} else if (StringUtils.isNotEmpty(user.getPhonenumber()) && !userService.checkPhoneUnique(user)) {
return R.fail("修改用户'" + user.getUserName() + "'失败,手机号码已存在");
} else if (StringUtils.isNotEmpty(user.getEmail()) && !userService.checkEmailUnique(user)) {
return R.fail("修改用户'" + user.getUserName() + "'失败,邮箱账号已存在");
}
return toAjax(userService.updateUser(user));
}
/**
* 根据用户编号获取详细信息
*
* @param userId 用户ID
*/
// @SaCheckPermission("system:user:query")
@GetMapping(value = {"/", "/{userId}"})
public R<SysUserInfoVo> getInfo(@PathVariable(value = "userId", required = false) Long userId) {
userService.checkUserDataScope(userId);
SysUserInfoVo userInfoVo = new SysUserInfoVo();
SysRoleDto roleBo = new SysRoleDto();
roleBo.setStatus(UserConstants.ROLE_NORMAL);
List<SysRoleVo> roles = roleService.selectRoleList(roleBo);
userInfoVo.setRoles(LoginHelper.isSuperAdmin(userId) ? roles : StreamUtils.filter(roles, r -> !r.isSuperAdmin()));
if (ObjectUtil.isNotNull(userId)) {
SysUserVo sysUser = userService.selectUserById(userId);
userInfoVo.setUser(sysUser);
userInfoVo.setRoleIds(roleService.selectRoleListByUserId(userId));
}
return R.ok(userInfoVo);
}
/**
* 获取用户信息
*
* @return 用户信息
*/
@GetMapping("/getInfo")
public R<UserInfoVo> getInfo() {
UserInfoVo userInfoVo = new UserInfoVo();
LoginUser loginUser = LoginHelper.getLoginUser();
SysUserVo user = userService.selectUserById(loginUser.getUserId());
if (ObjectUtil.isNull(user)) {
return R.fail("没有权限访问用户数据!");
}
user.setRoles(roleService.selectRolesByUserId(user.getUserId()));
userInfoVo.setUser(user);
userInfoVo.setPermissions(loginUser.getMenuPermission());
userInfoVo.setRoles(loginUser.getRolePermission());
return R.ok(userInfoVo);
}
/**
* 删除用户
*
* @param userIds 角色ID串
*/
// @SaCheckPermission("system:user:remove")
@Log(title = "用户管理", businessType = BusinessType.DELETE)
@DeleteMapping("/{userIds}")
public R<Void> remove(@PathVariable Long[] userIds) {
if (ArrayUtil.contains(userIds, LoginHelper.getUserId())) {
return R.fail("当前用户不能删除");
}
return toAjax(userService.deleteUserByIds(userIds));
}
@PostMapping(value = "/queryUserPullDown")
@Operation(description = "查询用户信息下拉框使用")
public R queryUserPullDown() {
return R.ok(this.userService.queryUserPullDown());
}
/**
* 重置密码
*/
// @ApiEncrypt
// @SaCheckPermission("system:user:resetPwd")
@Log(title = "用户管理", businessType = BusinessType.UPDATE)
@PutMapping("/resetPwd")
public R<Void> resetPwd(@RequestBody SysUserDto user) {
userService.checkUserAllowed(user.getUserId());
userService.checkUserDataScope(user.getUserId());
return toAjax(userService.resetUserPwd(user.getUserId()));
}
/**
* 修改用户密码
*/
// @SaCheckPermission("system:user:edit")
@Log(title = "修改用户密码", businessType = BusinessType.UPDATE)
@PostMapping("/editPassword")
public R<Void> editPassword(@Validated @RequestBody EditPasswordDto user) {
SysUserVo sysUserVo = userService.selectUserById(user.getUserId());
if (!BCrypt.checkpw(user.getPassword(), sysUserVo.getPassword())) {
throw new ServiceException("旧密码不正确");
}
return toAjax(userService.editPassword(user));
}
}
package com.bkty.system.domain.vo;
import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
import java.util.List;
/**
* 用户信息
*
* @author Michelle.Chung
*/
@Data
public class SysUserInfoVo implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/**
* 用户信息
*/
private SysUserVo user;
/**
* 角色ID列表
*/
private List<Long> roleIds;
/**
* 角色列表
*/
private List<SysRoleVo> roles;
/**
* 岗位ID列表
*/
private List<Long> postIds;
}
\ No newline at end of file
package com.bkty.system.domain.vo;
import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
import java.util.Set;
/**
* 登录用户信息
*
* @author Michelle.Chung
*/
@Data
public class UserInfoVo implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/**
* 用户基本信息
*/
private SysUserVo user;
/**
* 菜单权限
*/
private Set<String> permissions;
/**
* 角色权限
*/
private Set<String> roles;
}
......@@ -18,11 +18,11 @@ import java.util.List;
public interface PositionRecommendMapper extends BaseMapper<AiPositionRecommendRecord> {
@Select("""
SELECT position_id from ai_position_recommend_record where is_deleted = 0 and analysis_id = #{analysisId}
SELECT position_id from ai_position_recommend_record where is_deleted = 0 and user_id = #{userId}
""")
List<Long> selectPositionIdList(@Param("analysisId") Long analysisId);
List<Long> selectPositionIdList(@Param("userId") Long userId);
List<AiPositionRecommendRecordVo> selectPositionList(@Param("analysisId") Long analysisId,
List<AiPositionRecommendRecordVo> selectPositionList(@Param("userId") Long userId,
@Param("queryType") Integer queryType,
@Param("recommendTime") String recommendTime,
@Param("pId") Long pId,
......
......@@ -14,7 +14,7 @@ public interface PositionRecommendRedisService {
/**
* 初始化redis数据
*/
public boolean initRedisData(Long analysisId);
public boolean initRedisData(Long userId);
/**
* 保存岗位到redis
......
......@@ -46,14 +46,14 @@ public class PositionRecommendRedisServiceImpl implements PositionRecommendRedis
private static final String RECOMMEND_COUNT_KEY = "recommend:count:%d";//推荐次数
@Override
public boolean initRedisData(Long analysisId) {
public boolean initRedisData(Long userId) {
// 1. 查询所有岗位推荐数据
QueryWrapper<AiPositionRecommendRecord> queryWrapper = Wrappers.query();
queryWrapper.select("id", "resume_id", "operation_type",
"treasures_type", "deliver_type", "city_code", "r_details", "position_score", "jd_md");
queryWrapper.eq("analysis_id", analysisId).eq("is_deleted", false);
queryWrapper.eq("user_id", userId).eq("is_deleted", false);
List<AiPositionRecommendRecordVo> positions = positionRecommendMapper.selectPositionList(analysisId, null,null, null , null, null, null, null, null);
List<AiPositionRecommendRecordVo> positions = positionRecommendMapper.selectPositionList(userId, null,null, null , null, null, null, null, null);
if (CollectionUtil.isEmpty(positions)){
//无岗位推荐数据
......@@ -68,16 +68,16 @@ public class PositionRecommendRedisServiceImpl implements PositionRecommendRedis
}
Map<Long, FunctionPositionPortraitV2> collect = portraitV2s.stream().collect(Collectors.toMap(FunctionPositionPortraitV2::getPositionDataId, p -> p));
// 构造 Redis Key
String allKey = String.format(ALL_KEY, analysisId);
String notReadKey = String.format(NOT_READ_KEY, analysisId);
String favoriteKey = String.format(FAVORITE_KEY, analysisId);
String notSuitableKey = String.format(NOT_SUITABLE_KEY, analysisId);
String deliveredKey = String.format(DELIVERED_KEY, analysisId);
String allKey = String.format(ALL_KEY, userId);
String notReadKey = String.format(NOT_READ_KEY, userId);
String favoriteKey = String.format(FAVORITE_KEY, userId);
String notSuitableKey = String.format(NOT_SUITABLE_KEY, userId);
String deliveredKey = String.format(DELIVERED_KEY, userId);
delRedisKey(allKey, notReadKey, favoriteKey, notSuitableKey, deliveredKey);
// 2. 遍历数据,将其存入 Redis
for (AiPositionRecommendRecordVo position : positions) {
savePositionToRedis(collect.get(position.getPositionId()), position, analysisId);
savePositionToRedis(collect.get(position.getPositionId()), position, userId);
}
return true;
}
......@@ -87,14 +87,14 @@ public class PositionRecommendRedisServiceImpl implements PositionRecommendRedis
}
@Override
public void savePositionToRedis(FunctionPositionPortraitV2 portraitV2, AiPositionRecommendRecordVo position, Long analysisId) {
public void savePositionToRedis(FunctionPositionPortraitV2 portraitV2, AiPositionRecommendRecordVo position, Long userId) {
// 构造 Redis Key
//String allKey = String.format(ALL_KEY, userId);
String notReadKey = String.format(NOT_READ_KEY, analysisId);
String favoriteKey = String.format(FAVORITE_KEY, analysisId);
String notSuitableKey = String.format(NOT_SUITABLE_KEY, analysisId);
String deliveredKey = String.format(DELIVERED_KEY, analysisId);
String notReadKey = String.format(NOT_READ_KEY, userId);
String favoriteKey = String.format(FAVORITE_KEY, userId);
String notSuitableKey = String.format(NOT_SUITABLE_KEY, userId);
String deliveredKey = String.format(DELIVERED_KEY, userId);
Long resumeId = position.getResumeId();
Long positionId = position.getId();
......@@ -145,7 +145,7 @@ public class PositionRecommendRedisServiceImpl implements PositionRecommendRedis
// 2.3 将 RecommendItem 对象转换为 JSON 字符串并存储到 Redis 中
try {
String jsonString = JSON.toJSONString(item);
redisTemplate.opsForValue().set(String.format(RECOMMEND_ITEM_KEY, analysisId, positionId), jsonString);
redisTemplate.opsForValue().set(String.format(RECOMMEND_ITEM_KEY, userId, positionId), jsonString);
} catch (Exception e) {
e.printStackTrace();
}
......
......@@ -105,7 +105,7 @@ public class RecommendPositionServiceImpl implements RecommendPositionService {
if (resumeSketchList == null) return;
// 5. 获取历史推荐岗位ID
List<Long> positionIdList = getHistoryPositionIds(analysisId);
List<Long> positionIdList = getHistoryPositionIds(userId);
// 6. 构建推荐参数
List<RcommendParam> rcommendParamList = buildRecommendParams(aiRecommendVo, resumeSketchList);
......@@ -225,7 +225,7 @@ public class RecommendPositionServiceImpl implements RecommendPositionService {
// 更新分析状态和缓存
aiAnalysisMapper.updateAnalysis(analysisId, 2, userId, 0);
PositionRecommendRedisService recommendRedisService = applicationContext.getBean(PositionRecommendRedisService.class);
recommendRedisService.initRedisData(analysisId);
recommendRedisService.initRedisData(userId);
}
/**
......@@ -424,7 +424,7 @@ public class RecommendPositionServiceImpl implements RecommendPositionService {
private void sendCozeByPositionData(Long userId, FunctionPositionPortraitVo resultVo, AiRecommendVo aiRecommendVo, ResumeVo resumeVo, AtomicInteger processedCount, int baseProgress, double progressPerJob, AtomicLong lastPushTime, List<FunctionPositionPortraitVo> matchResults) throws Exception {
if (resultVo.getPay() != null && resultVo.getPay() == 0){
/*if (resultVo.getPay() != null && resultVo.getPay() == 0){
//薪资未知,数据二次确认
Map<String, Object> stringObjectMap = MariaDbAdtUtil.queryRecruitQqxbById(resultVo.getPositionDataId());
try {
......@@ -449,7 +449,7 @@ public class RecommendPositionServiceImpl implements RecommendPositionService {
} catch (Exception e) {
log.error("薪资确认错误", e);
}
}
}*/
JSONObject workflowObj = sendCozeWorkflow(resultVo, aiRecommendVo, resumeVo);
System.out.println("工作流返回信息:" + workflowObj);
......@@ -1180,8 +1180,8 @@ public class RecommendPositionServiceImpl implements RecommendPositionService {
/**
* 获取历史推荐岗位ID
*/
private List<Long> getHistoryPositionIds(Long analysisId) {
List<Long> positionIdList = this.positionRecommendMapper.selectPositionIdList(analysisId);
private List<Long> getHistoryPositionIds(Long userId) {
List<Long> positionIdList = this.positionRecommendMapper.selectPositionIdList(userId);
if (CollectionUtil.isEmpty(positionIdList)) {
positionIdList = null;
}
......
......@@ -11,10 +11,10 @@
ai_position_recommend_record t1, function_resume_base t2
WHERE
t1.is_deleted = 0 and
t1.analysis_id = #{analysisId} and
t1.user_id = #{userId} and
t1.resume_id = t2.id
<if test="queryType == 1 and recommendTime == null">
AND t1.recommend_time = (SELECT MAX(recommend_time) FROM ai_position_recommend_record WHERE analysis_id = #{analysisId} AND is_deleted = 0)
AND t1.recommend_time = (SELECT MAX(recommend_time) FROM ai_position_recommend_record WHERE user_id = #{userId} AND is_deleted = 0)
ORDER BY t1.r_score DESC
</if>
<if test="queryType == 1 and recommendTime != null">
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or sign in to comment