ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TAppUserController.java
@@ -13,15 +13,19 @@ import com.ruoyi.system.dto.UpAndDownDTO; import com.ruoyi.system.dto.UserIdDto; import com.ruoyi.system.model.TAppUser; import com.ruoyi.system.model.TAppUserSkill; import com.ruoyi.system.model.TMajor; import com.ruoyi.system.model.TUserMajor; import com.ruoyi.system.query.TAppUserQuery; import com.ruoyi.system.service.TAppUserService; import com.ruoyi.system.service.TAppUserSkillService; import com.ruoyi.system.service.TMajorService; import com.ruoyi.system.service.TUserMajorService; import com.ruoyi.system.vo.TAppUserDetailVO; import com.ruoyi.system.vo.TAppUserPageVo; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.util.CollectionUtils; import org.springframework.util.StringUtils; @@ -47,13 +51,15 @@ private final TAppUserService appUserService; private final TUserMajorService userMajorService; private final TMajorService majorService; private final TAppUserSkillService appUserSkillService; @Autowired public TAppUserController(TokenService tokenService, TAppUserService appUserService, TUserMajorService userMajorService, TMajorService majorService) { public TAppUserController(TokenService tokenService, TAppUserService appUserService, TUserMajorService userMajorService, TMajorService majorService, TAppUserSkillService appUserSkillService) { this.tokenService = tokenService; this.appUserService = appUserService; this.userMajorService = userMajorService; this.majorService = majorService; this.appUserSkillService = appUserSkillService; } /** @@ -86,6 +92,10 @@ if(CollectionUtils.isEmpty(userMajors)){ return R.fail("请选择专业"); } TAppUserSkill appUserSkill = dto.getAppUserSkill(); if(appUserSkill==null){ return R.fail("请输入职业技能"); } String pwd = SecurityUtils.encryptPassword(dto.getPassword()); dto.setPassword(pwd); dto.setState(1); @@ -95,6 +105,9 @@ userMajor.setAppUserId(dto.getId()); } userMajorService.saveBatch(userMajors); // 职业技能 appUserSkill.setAppUserId(dto.getId()); appUserSkillService.save(appUserSkill); return R.ok(); } @@ -122,6 +135,9 @@ userMajor.setAppUserId(dto.getId()); } userMajorService.saveBatch(userMajors); // 职业技能 TAppUserSkill appUserSkill = dto.getAppUserSkill(); appUserSkillService.updateById(appUserSkill); return R.ok(); } @@ -135,6 +151,10 @@ UserIdDto dto = JSON.parseObject(param, UserIdDto.class); // TAppUser appUser = appUserService.getById(dto.getId()); // appUser.setDisabled(true); // 删除人员专业 userMajorService.remove(Wrappers.lambdaQuery(TUserMajor.class).eq(TUserMajor::getAppUserId,dto.getId())); // 删除人员职业技能 appUserSkillService.remove(Wrappers.lambdaQuery(TAppUserSkill.class).eq(TAppUserSkill::getAppUserId,dto.getId())); appUserService.removeById(dto.getId()); return R.ok(); } @@ -220,9 +240,11 @@ // @PreAuthorize("@ss.hasPermi('system:user:auditUser')") @ApiOperation(value = "人员详情", response = AuditUserDto.class) @PostMapping(value = "/api/t-app-user/detailUser") public R<TAppUser> detailUser(@RequestBody String param) { public R<TAppUserDetailVO> detailUser(@RequestBody String param) { UserIdDto dto = JSON.parseObject(param, UserIdDto.class); TAppUser tAppUser = appUserService.getById(dto.getId()); TAppUserDetailVO appUserDetailVO = new TAppUserDetailVO(); BeanUtils.copyProperties(tAppUser,appUserDetailVO); List<TUserMajor> list = userMajorService.list(new LambdaQueryWrapper<TUserMajor>().eq(TUserMajor::getAppUserId, dto.getId())); if(!list.isEmpty()){ List<String> mjIds = list.stream().map(TUserMajor::getMajorId).collect(Collectors.toList()); @@ -234,8 +256,13 @@ } } } tAppUser.setUserMajors(list); return R.ok(tAppUser); appUserDetailVO.setUserMajors(list); // 查询职业技能 TAppUserSkill appUserSkill = appUserSkillService.getOne(new LambdaQueryWrapper<TAppUserSkill>() .eq(TAppUserSkill::getAppUserId, dto.getId()) .last("LIMIT 1")); appUserDetailVO.setAppUserSkill(appUserSkill); return R.ok(appUserDetailVO); } ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TAppUserSkillController.java
New file @@ -0,0 +1,20 @@ package com.ruoyi.web.controller.api; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; /** * <p> * 人员职业技能 前端控制器 * </p> * * @author xiaochen * @since 2025-10-24 */ @RestController @RequestMapping("/t-app-user-skill") public class TAppUserSkillController { } ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TMissionController.java
@@ -47,8 +47,9 @@ private final TAppUserService appUserService; private final TAppUserEquipmentService appUserEquipmentService; private final TUserMajorService userMajorService; private final TAppUserSkillService appUserSkillService; @Autowired public TMissionController(TMissionService missionService, TMissionReassignService missionReassignService, TokenService tokenService, TMissionAssignRuleService missionAssignRuleService, TMissionAssignRuleIndicatorService missionAssignRuleIndicatorService, TAppUserService appUserService, TAppUserEquipmentService appUserEquipmentService, TUserMajorService userMajorService) { public TMissionController(TMissionService missionService, TMissionReassignService missionReassignService, TokenService tokenService, TMissionAssignRuleService missionAssignRuleService, TMissionAssignRuleIndicatorService missionAssignRuleIndicatorService, TAppUserService appUserService, TAppUserEquipmentService appUserEquipmentService, TUserMajorService userMajorService, TAppUserSkillService appUserSkillService) { this.missionService = missionService; this.missionReassignService = missionReassignService; this.tokenService = tokenService; @@ -57,6 +58,7 @@ this.appUserService = appUserService; this.appUserEquipmentService = appUserEquipmentService; this.userMajorService = userMajorService; this.appUserSkillService = appUserSkillService; } /** @@ -155,6 +157,9 @@ // 查询专业信息 List<TUserMajor> userMajorList = userMajorService.list(Wrappers.lambdaQuery(TUserMajor.class) .in(TUserMajor::getAppUserId,appUserIds)); // 查询技能信息 List<TAppUserSkill> appUserSkillList = appUserSkillService.list(Wrappers.lambdaQuery(TAppUserSkill.class) .in(TAppUserSkill::getAppUserId,appUserIds)); for (TAppUser appUser : appUsers) { double scoreTotal = 0; @@ -162,6 +167,8 @@ List<TAppUserEquipment> userEquipments = appUserEquipmentList.stream().filter(appEquipment -> appUser.getId().equals(appEquipment.getAppUserId())).collect(Collectors.toList()); // 匹配专业信息 List<TUserMajor> userMajors = userMajorList.stream().filter(userMajor -> appUser.getId().equals(userMajor.getAppUserId())).collect(Collectors.toList()); // 匹配技能信息 List<TAppUserSkill> userSkills = appUserSkillList.stream().filter(appUserSkill -> appUser.getId().equals(appUserSkill.getAppUserId())).collect(Collectors.toList()); // 计算用户到任务的距离 double distance = GDMapGeocodingUtil.getDistance(Double.parseDouble(mission.getMissionLon()), Double.parseDouble(mission.getMissionLat()), Double.parseDouble(appUser.getLon()), Double.parseDouble(appUser.getLat())); @@ -234,8 +241,16 @@ } } // 技能等级 if(2 == i){ // TODO 技能等级 if(2 == i && !CollectionUtils.isEmpty(userSkills)){ TAppUserSkill appUserSkill = userSkills.get(0); int count = appUserSkill.getAdvancedCount() + appUserSkill.getIntermediateCount() + appUserSkill.getPrimaryCount(); if(count >= value){ // 得基准分值 scoreTotal += score; }else{ // 训练次数 / 基准值 * 基准分值 scoreTotal += (double)count / value * score; } } } } @@ -269,23 +284,30 @@ JSONArray trainingIndicators = JSONObject.parseArray(missionAssignRuleIndicator.getContent()); // 训练指标分数计算 // 实训次数 Integer practicalTrainCount = appUser.getPracticalTrainCount(); Integer reconnaissanceMajor = appUser.getReconnaissanceMajor(); Integer otherCount = appUser.getOtherCount(); for (int i = 0; i < 3; i++) { JSONObject jsonObject = JSONObject.parseObject(JSONObject.toJSONString(trainingIndicators.get(i))); Integer value = jsonObject.getInteger("value"); Integer score = jsonObject.getInteger("score"); // 侦察专业成绩 if(0 == i){ // TODO } // 训练次数 if(1 == i){ if(practicalTrainCount >= value){ if(reconnaissanceMajor >= value){ // 得基准分值 scoreTotal += score; }else{ // 训练次数 / 基准值 * 基准分值 scoreTotal += (double)practicalTrainCount / value * score; scoreTotal += (double)reconnaissanceMajor / value * score; } } // 训练次数 if(1 == i){ if(otherCount >= value){ // 得基准分值 scoreTotal += score; }else{ // 训练次数 / 基准值 * 基准分值 scoreTotal += (double)otherCount / value * score; } } } ruoyi-system/src/main/java/com/ruoyi/system/dto/TAppUserDTO.java
@@ -1,6 +1,7 @@ package com.ruoyi.system.dto; import com.ruoyi.system.model.TAppUser; import com.ruoyi.system.model.TAppUserSkill; import com.ruoyi.system.model.TUserMajor; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; @@ -12,7 +13,10 @@ @ApiModel(value="TAppUserDTO对象", description="人员管理") public class TAppUserDTO extends TAppUser { @ApiModelProperty(value = "专业id集合") @ApiModelProperty(value = "专业集合") private List<TUserMajor> userMajors; @ApiModelProperty(value = "职业技能") private TAppUserSkill appUserSkill; } ruoyi-system/src/main/java/com/ruoyi/system/mapper/TAppUserSkillMapper.java
New file @@ -0,0 +1,16 @@ package com.ruoyi.system.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.ruoyi.system.model.TAppUserSkill; /** * <p> * 人员职业技能 Mapper 接口 * </p> * * @author xiaochen * @since 2025-10-24 */ public interface TAppUserSkillMapper extends BaseMapper<TAppUserSkill> { } ruoyi-system/src/main/java/com/ruoyi/system/model/TAppUser.java
@@ -10,8 +10,6 @@ import lombok.Data; import lombok.EqualsAndHashCode; import java.util.List; /** * <p> * 人员管理 @@ -71,9 +69,9 @@ @TableField("state") private Integer state; @ApiModelProperty(value = "职业技能 1=无 2=初级 3=中级 4=高级") @TableField("level") private Integer level; @ApiModelProperty(value = "侦察专业人数") @TableField("reconnaissance_major") private Integer reconnaissanceMajor; @ApiModelProperty(value = "执行任务状态 1=空闲 2=任务中") @TableField("mission_state") @@ -86,9 +84,6 @@ @TableField(exist = false) private String lat; @TableField(exist = false) @ApiModelProperty(value = "用户专业") private List<TUserMajor> userMajors; @ApiModelProperty(value = "距离 km") @TableField(exist = false) ruoyi-system/src/main/java/com/ruoyi/system/model/TAppUserSkill.java
New file @@ -0,0 +1,50 @@ package com.ruoyi.system.model; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import lombok.EqualsAndHashCode; import java.io.Serializable; /** * <p> * 人员职业技能 * </p> * * @author xiaochen * @since 2025-10-24 */ @Data @EqualsAndHashCode(callSuper = false) @TableName("t_app_user_skill") @ApiModel(value="TAppUserSkill对象", description="人员职业技能") public class TAppUserSkill implements Serializable { private static final long serialVersionUID = 1L; @TableId(value = "id", type = IdType.ASSIGN_ID) private String id; @ApiModelProperty(value = "用户id") @TableField("app_user_id") private String appUserId; @ApiModelProperty(value = "初级人数") @TableField("primary_count") private Integer primaryCount; @ApiModelProperty(value = "中级人数") @TableField("intermediate_count") private Integer intermediateCount; @ApiModelProperty(value = "高级人数") @TableField("advanced_count") private Integer advancedCount; } ruoyi-system/src/main/java/com/ruoyi/system/service/TAppUserSkillService.java
New file @@ -0,0 +1,16 @@ package com.ruoyi.system.service; import com.baomidou.mybatisplus.extension.service.IService; import com.ruoyi.system.model.TAppUserSkill; /** * <p> * 人员职业技能 服务类 * </p> * * @author xiaochen * @since 2025-10-24 */ public interface TAppUserSkillService extends IService<TAppUserSkill> { } ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TAppUserSkillServiceImpl.java
New file @@ -0,0 +1,20 @@ package com.ruoyi.system.service.impl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ruoyi.system.mapper.TAppUserSkillMapper; import com.ruoyi.system.model.TAppUserSkill; import com.ruoyi.system.service.TAppUserSkillService; import org.springframework.stereotype.Service; /** * <p> * 人员职业技能 服务实现类 * </p> * * @author xiaochen * @since 2025-10-24 */ @Service public class TAppUserSkillServiceImpl extends ServiceImpl<TAppUserSkillMapper, TAppUserSkill> implements TAppUserSkillService { } ruoyi-system/src/main/java/com/ruoyi/system/vo/TAppUserDetailVO.java
New file @@ -0,0 +1,22 @@ package com.ruoyi.system.vo; import com.ruoyi.system.model.TAppUser; import com.ruoyi.system.model.TAppUserSkill; import com.ruoyi.system.model.TUserMajor; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.util.List; @Data @ApiModel("人员管理详情TAppUserDetailVO") public class TAppUserDetailVO extends TAppUser { @ApiModelProperty(value = "用户专业") private List<TUserMajor> userMajors; @ApiModelProperty(value = "用户职业技能") private TAppUserSkill appUserSkill; } ruoyi-system/src/main/resources/mapper/system/TAppUserMapper.xml
@@ -15,6 +15,7 @@ <result column="practical_train_count" property="practicalTrainCount" /> <result column="other_count" property="otherCount" /> <result column="mission_state" property="missionState" /> <result column="reconnaissance_major" property="reconnaissanceMajor" /> <result column="create_time" property="createTime" /> <result column="update_time" property="updateTime" /> <result column="create_by" property="createBy" /> @@ -30,7 +31,7 @@ <select id="pageList" resultType="com.ruoyi.system.vo.TAppUserPageVo"> SELECT t1.id, t1.nick_name, t1.phone, t1.account, t1.password, t1.team_name, t1.team_id, t1.status, t1.practical_train_count,t1.mission_state, t1.practical_train_count,t1.mission_state,t1.reconnaissance_major, t1.other_count, t1.create_time, t1.update_time, t1.create_by, t1.update_by, t1.disabled,t2.team_name FROM t_app_user t1 left join t_division_team t2 on t1.team_id = t2.id @@ -51,7 +52,7 @@ <select id="pageAuditList" resultType="com.ruoyi.system.vo.TAppUserPageVo"> SELECT t1.id, t1.nick_name, t1.phone, t1.account, t1.password, t1.team_name, t1.team_id, t1.status, t1.practical_train_count,t1.mission_state, t1.practical_train_count,t1.mission_state,t1.reconnaissance_major, t1.other_count, t1.create_time, t1.update_time, t1.create_by, t1.update_by, t1.disabled,t2.team_name FROM t_app_user t1 left join t_division_team t2 on t1.team_id = t2.id ruoyi-system/src/main/resources/mapper/system/TAppUserSkillMapper.xml
New file @@ -0,0 +1,19 @@ <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.ruoyi.system.mapper.TAppUserSkillMapper"> <!-- 通用查询映射结果 --> <resultMap id="BaseResultMap" type="com.ruoyi.system.model.TAppUserSkill"> <id column="id" property="id" /> <result column="app_user_id" property="appUserId" /> <result column="primary_count" property="primaryCount" /> <result column="intermediate_count" property="intermediateCount" /> <result column="advanced_count" property="advancedCount" /> </resultMap> <!-- 通用查询结果列 --> <sql id="Base_Column_List"> id, app_user_id, primary_count, intermediate_count, advanced_count </sql> </mapper>