zhuo
2025-02-24 8c8be02883e58d28727d3b510e5260474fc955ae
人员沟通记录移植
已修改3个文件
已添加12个文件
1007 ■■■■ 文件已修改
cnas-manage/src/main/java/com/ruoyi/manage/controller/ClientSatisfactionController.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-personnel/src/main/java/com/ruoyi/personnel/controller/PersonCommunicationAbilityController.java 61 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-personnel/src/main/java/com/ruoyi/personnel/controller/PersonPersonnelCapacityController.java 186 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-personnel/src/main/java/com/ruoyi/personnel/dto/PersonCommunicationAbilityDto.java 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-personnel/src/main/java/com/ruoyi/personnel/dto/PersonPersonnelCapacityDto.java 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-personnel/src/main/java/com/ruoyi/personnel/dto/PersonPersonnelCapacityExportDto.java 101 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-personnel/src/main/java/com/ruoyi/personnel/mapper/PersonCommunicationAbilityMapper.java 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-personnel/src/main/java/com/ruoyi/personnel/mapper/PersonPersonnelCapacityMapper.java 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-personnel/src/main/java/com/ruoyi/personnel/pojo/PersonCommunicationAbility.java 61 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-personnel/src/main/java/com/ruoyi/personnel/service/PersonCommunicationAbilityService.java 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-personnel/src/main/java/com/ruoyi/personnel/service/PersonPersonnelCapacityService.java 69 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-personnel/src/main/java/com/ruoyi/personnel/service/impl/PersonCommunicationAbilityServiceImpl.java 113 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-personnel/src/main/java/com/ruoyi/personnel/service/impl/PersonPersonnelCapacityServiceImpl.java 158 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-personnel/src/main/resources/mapper/PersonCommunicationAbilityMapper.xml 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-personnel/src/main/resources/mapper/PersonPersonnelCapacityMapper.xml 118 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-manage/src/main/java/com/ruoyi/manage/controller/ClientSatisfactionController.java
@@ -71,7 +71,7 @@
     */
    @ApiOperation(value = "客户满意度调查新增")
    @GetMapping("/delClientSatisfaction")
    @DeleteMapping("/delClientSatisfaction")
    public Result updateClientSatisfaction(Integer clientSatisfactionId){
        return Result.success(clientSatisfactionService.removeById(clientSatisfactionId));
    }
cnas-personnel/src/main/java/com/ruoyi/personnel/controller/PersonCommunicationAbilityController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,61 @@
package com.ruoyi.personnel.controller;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.common.core.domain.Result;
import com.ruoyi.personnel.dto.PersonCommunicationAbilityDto;
import com.ruoyi.personnel.pojo.PersonCommunicationAbility;
import com.ruoyi.personnel.service.PersonCommunicationAbilityService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletResponse;
/**
 * <p>
 * æ²Ÿé€šè®°å½• å‰ç«¯æŽ§åˆ¶å™¨
 * </p>
 *
 * @author èŠ¯å¯¼è½¯ä»¶ï¼ˆæ±Ÿè‹ï¼‰æœ‰é™å…¬å¸
 * @since 2024-10-09 12:00:57
 */
@Api(tags = "人员 - æ²Ÿé€šè®°å½•")
@RestController
@RequestMapping("/personCommunicationAbility")
public class PersonCommunicationAbilityController {
    @Autowired
    private PersonCommunicationAbilityService personCommunicationAbilityService;
    @ApiOperation(value = "新增/更新 æ²Ÿé€šè®°å½•")
    @PostMapping("addOrUpdatePersonCommunicationAbility")
    public Result<?> addOrUpdatePersonCommunicationAbility(@RequestBody PersonCommunicationAbility personCommunicationAbility) {
        personCommunicationAbilityService.saveOrUpdate(personCommunicationAbility);
        return Result.success();
    }
    @ApiOperation(value = "删除 æ²Ÿé€šè®°å½•")
    @DeleteMapping("deletePersonCommunicationAbility")
    public Result<?> deletePersonCommunicationAbility(@RequestParam("id") Integer id) {
        personCommunicationAbilityService.removeById(id);
        return Result.success();
    }
    @ApiOperation(value = "查询 æ²Ÿé€šè®°å½•")
    @GetMapping("personPersonCommunicationAbilityPage")
    public Result<IPage<PersonCommunicationAbilityDto>> personPersonCommunicationAbilityPage(Page page,
                                                                                             Integer departLimsId,
                                                                                             Integer userId,
                                                                                             String userName) {
        return Result.success(personCommunicationAbilityService.personPersonCommunicationAbilityPage(page, departLimsId, userId, userName));
    }
    @ApiOperation(value = "导出沟通记录")
    @PostMapping("exportPersonCommunicationAbility")
    public void exportPersonCommunicationAbility(Integer id, HttpServletResponse response) throws Exception{
        personCommunicationAbilityService.exportPersonCommunicationAbility(id,response);
    }
}
cnas-personnel/src/main/java/com/ruoyi/personnel/controller/PersonPersonnelCapacityController.java
@@ -1,94 +1,92 @@
//package com.ruoyi.personnel.controller;
//
//import com.baomidou.mybatisplus.core.metadata.IPage;
//import com.baomidou.mybatisplus.core.toolkit.Wrappers;
//import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
//import com.yuanchu.mom.annotation.ValueAuth;
//import com.yuanchu.mom.common.GetLook;
//import com.yuanchu.mom.dto.PersonPersonnelCapacityDto;
//import com.yuanchu.mom.pojo.PersonPersonnelCapacity;
//import com.yuanchu.mom.service.PersonPersonnelCapacityService;
//import com.yuanchu.mom.vo.Result;
//import io.swagger.annotations.Api;
//import io.swagger.annotations.ApiOperation;
//import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.web.bind.annotation.*;
//
//import javax.servlet.http.HttpServletResponse;
//import java.time.LocalDateTime;
//
///**
// * <p>
// * äººå‘˜èƒ½åŠ› å‰ç«¯æŽ§åˆ¶å™¨
// * </p>
// *
// * @author èŠ¯å¯¼è½¯ä»¶ï¼ˆæ±Ÿè‹ï¼‰æœ‰é™å…¬å¸
// * @since 2024-10-10 11:26:18
// */
//@Api(tags = "人员 - äººå‘˜èƒ½åŠ›")
//@RestController
//@RequestMapping("/personPersonnelCapacity")
//public class PersonPersonnelCapacityController {
//
//    @Autowired
//    private PersonPersonnelCapacityService personPersonnelCapacityService;
//
//
//    @ApiOperation(value = "新增/更新 äººå‘˜èƒ½åŠ›")
//    @PostMapping("addOrUpdatePersonPersonnelCapacity")
//    public Result<?> addOrUpdatePersonPersonnelCapacity(@RequestBody PersonPersonnelCapacity personPersonnelCapacity) {
//        personPersonnelCapacityService.saveOrUpdate(personPersonnelCapacity);
//        return Result.success();
//    }
//
//    @ApiOperation(value = "删除 äººå‘˜èƒ½åŠ›")
//    @DeleteMapping("deletePersonPersonnelCapacity")
//    public Result<?> deletePersonPersonnelCapacity(@RequestParam("id") Integer id) {
//        // åˆ é™¤æ•°æ®
//        personPersonnelCapacityService.removeById(id);
//        return Result.success();
//    }
//
//    @ApiOperation(value = "查询 äººå‘˜èƒ½åŠ›")
//    @GetMapping("personPersonnelCapacityPage")
//    public Result<IPage<PersonPersonnelCapacityDto>> personPersonnelCapacityPage(Page page,
//                                                                                 Integer departmentId,
//                                                                                 Integer userId,
//                                                                                 String userName) {
//        return Result.success(personPersonnelCapacityService.personPersonnelCapacityPage(page, departmentId, userId, userName));
//    }
//
//    @ApiOperation(value = "确认 äººå‘˜èƒ½åŠ›")
//    @GetMapping("confirmPersonnelCapability")
//    public Result<?> confirmPersonnelCapability(@RequestParam("id") Integer id) {
//        Integer userId = getLook.selectPowerByMethodAndUserId(null).get("userId");
//        personPersonnelCapacityService.update(Wrappers.<PersonPersonnelCapacity>lambdaUpdate()
//                .eq(PersonPersonnelCapacity::getId, id)
//                .set(PersonPersonnelCapacity::getConfirmOperatingPersonnelId, userId)
//                .set(PersonPersonnelCapacity::getConfirmDate, LocalDateTime.now()));
//        return Result.success();
//    }
//
//    /**
//     * å¯¼å‡ºäººå‘˜èƒ½åŠ›
//     * @return
//     */
//    @ValueAuth
//    @ApiOperation(value = "导出人员能力")
//    @GetMapping("/exportPersonnelCapacity")
//    public void exportPersonnelCapacity(Integer id, HttpServletResponse response){
//        personPersonnelCapacityService.exportPersonnelCapacity(id, response);
//    }
//
//    /**
//     * æäº¤ç¡®è®¤äººå‘˜èƒ½åŠ›
//     * @param personPersonnelCapacity
//     * @return
//     */
//    @ApiOperation(value = "提交")
//    @PostMapping("submitConfirmPersonnelCapability")
//    public Result<?> submitConfirmPersonnelCapability(@RequestBody PersonPersonnelCapacity personPersonnelCapacity) {
//        personPersonnelCapacityService.submitConfirmPersonnelCapability(personPersonnelCapacity);
//        return Result.success();
//    }
//}
package com.ruoyi.personnel.controller;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.common.core.domain.Result;
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.personnel.dto.PersonPersonnelCapacityDto;
import com.ruoyi.personnel.pojo.PersonPersonnelCapacity;
import com.ruoyi.personnel.service.PersonPersonnelCapacityService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletResponse;
import java.time.LocalDateTime;
/**
 * <p>
 * äººå‘˜èƒ½åŠ› å‰ç«¯æŽ§åˆ¶å™¨
 * </p>
 *
 * @author èŠ¯å¯¼è½¯ä»¶ï¼ˆæ±Ÿè‹ï¼‰æœ‰é™å…¬å¸
 * @since 2024-10-10 11:26:18
 */
@Api(tags = "人员 - äººå‘˜èƒ½åŠ›")
@RestController
@RequestMapping("/personPersonnelCapacity")
public class PersonPersonnelCapacityController {
    @Autowired
    private PersonPersonnelCapacityService personPersonnelCapacityService;
    @ApiOperation(value = "新增/更新 äººå‘˜èƒ½åŠ›")
    @PostMapping("addOrUpdatePersonPersonnelCapacity")
    public Result<?> addOrUpdatePersonPersonnelCapacity(@RequestBody PersonPersonnelCapacity personPersonnelCapacity) {
        personPersonnelCapacityService.saveOrUpdate(personPersonnelCapacity);
        return Result.success();
    }
    @ApiOperation(value = "删除 äººå‘˜èƒ½åŠ›")
    @DeleteMapping("deletePersonPersonnelCapacity")
    public Result<?> deletePersonPersonnelCapacity(@RequestParam("id") Integer id) {
        // åˆ é™¤æ•°æ®
        personPersonnelCapacityService.removeById(id);
        return Result.success();
    }
    @ApiOperation(value = "查询 äººå‘˜èƒ½åŠ›")
    @GetMapping("personPersonnelCapacityPage")
    public Result<IPage<PersonPersonnelCapacityDto>> personPersonnelCapacityPage(Page page,
                                                                                 Integer departmentId,
                                                                                 Integer userId,
                                                                                 String userName) {
        return Result.success(personPersonnelCapacityService.personPersonnelCapacityPage(page, departmentId, userId, userName));
    }
    @ApiOperation(value = "确认 äººå‘˜èƒ½åŠ›")
    @GetMapping("confirmPersonnelCapability")
    public Result<?> confirmPersonnelCapability(@RequestParam("id") Integer id) {
        Integer userId = SecurityUtils.getUserId().intValue();
        personPersonnelCapacityService.update(Wrappers.<PersonPersonnelCapacity>lambdaUpdate()
                .eq(PersonPersonnelCapacity::getId, id)
                .set(PersonPersonnelCapacity::getConfirmOperatingPersonnelId, userId)
                .set(PersonPersonnelCapacity::getConfirmDate, LocalDateTime.now()));
        return Result.success();
    }
    /**
     * å¯¼å‡ºäººå‘˜èƒ½åŠ›
     * @return
     */
    @ApiOperation(value = "导出人员能力")
    @GetMapping("/exportPersonnelCapacity")
    public void exportPersonnelCapacity(Integer id, HttpServletResponse response){
        personPersonnelCapacityService.exportPersonnelCapacity(id, response);
    }
    /**
     * æäº¤ç¡®è®¤äººå‘˜èƒ½åŠ›
     * @param personPersonnelCapacity
     * @return
     */
    @ApiOperation(value = "提交")
    @PostMapping("submitConfirmPersonnelCapability")
    public Result<?> submitConfirmPersonnelCapability(@RequestBody PersonPersonnelCapacity personPersonnelCapacity) {
        personPersonnelCapacityService.submitConfirmPersonnelCapability(personPersonnelCapacity);
        return Result.success();
    }
}
cnas-personnel/src/main/java/com/ruoyi/personnel/dto/PersonCommunicationAbilityDto.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,14 @@
package com.ruoyi.personnel.dto;
import com.ruoyi.personnel.pojo.PersonCommunicationAbility;
import lombok.Data;
@Data
public class PersonCommunicationAbilityDto extends PersonCommunicationAbility {
    private String userName;
    private String account;
    private String createUserName;
}
cnas-personnel/src/main/java/com/ruoyi/personnel/dto/PersonPersonnelCapacityDto.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,30 @@
package com.ruoyi.personnel.dto;
import com.ruoyi.personnel.pojo.PersonPersonnelCapacity;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@Data
public class PersonPersonnelCapacityDto extends PersonPersonnelCapacity {
    @ApiModelProperty("操作人姓名")
    private String confirmOperatingPersonnelName;
    @ApiModelProperty("人员姓名")
    private String userName;
    @ApiModelProperty("岗位名称")
    private String postName;
    @ApiModelProperty("岗位职责")
    private String responsibilities;
    @ApiModelProperty("工作经历")
    private String placeWork;
    @ApiModelProperty("专业")
    private String major;
    @ApiModelProperty(value = "职称")
    private String professionalTitle;
}
cnas-personnel/src/main/java/com/ruoyi/personnel/dto/PersonPersonnelCapacityExportDto.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,101 @@
package com.ruoyi.personnel.dto;
import com.ruoyi.personnel.pojo.PersonPersonnelCapacity;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
 * @Author zhuo
 * @Date 2024/11/28
 */
@Data
public class PersonPersonnelCapacityExportDto extends PersonPersonnelCapacity {
    @ApiModelProperty("岗位名称")
    private String postName;
    @ApiModelProperty("人员姓名")
    private String userName;
    @ApiModelProperty("学历")
    private String officialAcademicRedentials;
    @ApiModelProperty("专业")
    private String major;
    @ApiModelProperty("职称")
    private String professionalTitle;
    @ApiModelProperty("工作经历")
    private String placeWork;
    @ApiModelProperty("学历 ç¬¦åˆä¸Žå¦(1:符合)")
    private String academicConformNot1 = "□";
    @ApiModelProperty("学历 ç¬¦åˆä¸Žå¦(2:不符合)")
    private String academicConformNot2 = "□";
    @ApiModelProperty("学历 ç¬¦åˆä¸Žå¦(3:不适用)")
    private String academicConformNot3 = "□";
    @ApiModelProperty("相关年限  ç¬¦åˆä¸Žå¦(1:符合)")
    private String relatedYearsConformNot1 = "□";
    @ApiModelProperty("相关年限  ç¬¦åˆä¸Žå¦(2:不符合)")
    private String relatedYearsConformNot2 = "□";
    @ApiModelProperty("相关年限  ç¬¦åˆä¸Žå¦(3:不适用)")
    private String relatedYearsConformNot3 = "□";
    @ApiModelProperty("相关培训 ç¬¦åˆä¸Žå¦(1:符合)")
    private String relatedTrainingConformNot1 = "□";
    @ApiModelProperty("相关培训 ç¬¦åˆä¸Žå¦(2:不符合)")
    private String relatedTrainingConformNot2 = "□";
    @ApiModelProperty("相关培训 ç¬¦åˆä¸Žå¦(3:不适用)")
    private String relatedTrainingConformNot3 = "□";
    @ApiModelProperty("相关经验 ç¬¦åˆä¸Žå¦(1:符合)")
    private String relevantExperienceConformNot1 = "□";
    @ApiModelProperty("相关经验 ç¬¦åˆä¸Žå¦(2:不符合)")
    private String relevantExperienceConformNot2 = "□";
    @ApiModelProperty("相关经验 ç¬¦åˆä¸Žå¦(3:不适用)")
    private String relevantExperienceConformNot3 = "□";
    @ApiModelProperty("上岗证 ç¬¦åˆä¸Žå¦(1:符合)")
    private String workLicenseConformNot1 = "□";
    @ApiModelProperty("上岗证 ç¬¦åˆä¸Žå¦(2:不符合)")
    private String workLicenseConformNot2 = "□";
    @ApiModelProperty("上岗证 ç¬¦åˆä¸Žå¦(3:不适用)")
    private String workLicenseConformNot3 = "□";
    @ApiModelProperty("岗位职责1(熟悉本岗位的产品检测样品制备和相关产品基础知识)")
    private String jobResponsibilities1 = "□";
    @ApiModelProperty("岗位职责2(熟悉本岗位样品检测流程)")
    private String jobResponsibilities2 = "□";
    @ApiModelProperty("岗位职责3(正确熟练操作本岗位仪表设备)")
    private String jobResponsibilities3 = "□";
    @ApiModelProperty("岗位职责4(熟悉本岗位相关检测标准)")
    private String jobResponsibilities4 = "□";
    @ApiModelProperty("岗位职责5(熟悉本岗位产品性能及结果判断、分析)")
    private String jobResponsibilities5 = "□";
    @ApiModelProperty("岗位职责6(完成相应的厂验、认证)")
    private String jobResponsibilities6 = "□";
    @ApiModelProperty("岗位职责7(编写相关检测手顺)")
    private String jobResponsibilities7 = "□";
    @ApiModelProperty("岗位职责8(了解仪器设备基本结构与简单维护保养)")
    private String jobResponsibilities8 = "□";
    @ApiModelProperty("岗位职责9(具备技能培训的能力)")
    private String jobResponsibilities9 = "□";
    @ApiModelProperty("岗位职责10(具备检测仪器改造能力)")
    private String jobResponsibilities10 = "□";
    @ApiModelProperty("岗位职责 ç¬¦åˆä¸Žå¦(1:符合)")
    private String jobResponsibilitiesConformNot1 = "□";
    @ApiModelProperty("岗位职责 ç¬¦åˆä¸Žå¦(2:不符合)")
    private String jobResponsibilitiesConformNot2 = "□";
    @ApiModelProperty("岗位职责 ç¬¦åˆä¸Žå¦(3:不适用)")
    private String jobResponsibilitiesConformNot3 = "□";
    @ApiModelProperty("综合评价1(可胜任该岗位)")
    private String comprehensiveAssessment1 = "□";
    @ApiModelProperty("综合评价2(可边培训边上岗)")
    private String comprehensiveAssessment2 = "□";
    @ApiModelProperty("综合评价3(不胜任该岗位)")
    private String comprehensiveAssessment3 = "□";
}
cnas-personnel/src/main/java/com/ruoyi/personnel/mapper/PersonCommunicationAbilityMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,21 @@
package com.ruoyi.personnel.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.personnel.dto.PersonCommunicationAbilityDto;
import com.ruoyi.personnel.pojo.PersonCommunicationAbility;
import org.apache.ibatis.annotations.Param;
/**
 * <p>
 * æ²Ÿé€šèƒ½åŠ› Mapper æŽ¥å£
 * </p>
 *
 * @author èŠ¯å¯¼è½¯ä»¶ï¼ˆæ±Ÿè‹ï¼‰æœ‰é™å…¬å¸
 * @since 2024-10-09 12:00:57
 */
public interface PersonCommunicationAbilityMapper extends BaseMapper<PersonCommunicationAbility> {
    IPage<PersonCommunicationAbilityDto> personPersonCommunicationAbilityPage(Page page, @Param("departLimsId") Integer departLimsId, @Param("userId") Integer userId, @Param("userName") String userName);
}
cnas-personnel/src/main/java/com/ruoyi/personnel/mapper/PersonPersonnelCapacityMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,29 @@
package com.ruoyi.personnel.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.personnel.dto.PersonPersonnelCapacityDto;
import com.ruoyi.personnel.dto.PersonPersonnelCapacityExportDto;
import com.ruoyi.personnel.pojo.PersonPersonnelCapacity;
import org.apache.ibatis.annotations.Param;
/**
 * <p>
 * äººå‘˜èƒ½åŠ› Mapper æŽ¥å£
 * </p>
 *
 * @author èŠ¯å¯¼è½¯ä»¶ï¼ˆæ±Ÿè‹ï¼‰æœ‰é™å…¬å¸
 * @since 2024-10-10 11:26:18
 */
public interface PersonPersonnelCapacityMapper extends BaseMapper<PersonPersonnelCapacity> {
    IPage<PersonPersonnelCapacityDto> personPersonnelCapacityPage(Page page, Integer departLimsId, Integer userId, String userName);
    /**
     * æŸ¥è¯¢äººå‘˜èƒ½åŠ›æŽ¥å£
     * @param id
     * @return
     */
    PersonPersonnelCapacityExportDto selectExportPersonnelCapacity(@Param("id") Integer id);
}
cnas-personnel/src/main/java/com/ruoyi/personnel/pojo/PersonCommunicationAbility.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,61 @@
package com.ruoyi.personnel.pojo;
import com.baomidou.mybatisplus.annotation.*;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.Setter;
import java.io.Serializable;
import java.time.LocalDateTime;
/**
 * <p>
 * æ²Ÿé€šè®°å½•
 * </p>
 *
 * @author èŠ¯å¯¼è½¯ä»¶ï¼ˆæ±Ÿè‹ï¼‰æœ‰é™å…¬å¸
 * @since 2024-10-09 12:00:57
 */
@Getter
@Setter
@TableName("cnas_person_communication_ability")
@ApiModel(value = "PersonCommunicationAbility对象", description = "沟通记录")
public class PersonCommunicationAbility implements Serializable {
    private static final long serialVersionUID = 1L;
    @ApiModelProperty("主键id")
    @TableId(value = "id", type = IdType.AUTO)
    private Integer id;
    @ApiModelProperty("沟通人id")
    private String userId;
    @ApiModelProperty("沟通时间")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime communicationTime;
    @ApiModelProperty("沟通地点")
    private String communicationPlace;
    @ApiModelProperty("沟通内容")
    private String communicationContent;
    @ApiModelProperty("创建人id")
    @TableField(fill = FieldFill.INSERT)
    private Integer createUser;
    @ApiModelProperty(value = "更新人id", hidden = true)
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Integer updateUser;
    @ApiModelProperty(value = "创建时间", hidden = true)
    @TableField(fill = FieldFill.INSERT)
    private LocalDateTime createTime;
    @ApiModelProperty(value = "更新时间", hidden = true)
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private LocalDateTime updateTime;
}
cnas-personnel/src/main/java/com/ruoyi/personnel/service/PersonCommunicationAbilityService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,25 @@
package com.ruoyi.personnel.service;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.ruoyi.personnel.dto.PersonCommunicationAbilityDto;
import com.ruoyi.personnel.pojo.PersonCommunicationAbility;
import javax.servlet.http.HttpServletResponse;
/**
 * <p>
 * æ²Ÿé€šèƒ½åŠ› æœåŠ¡ç±»
 * </p>
 *
 * @author èŠ¯å¯¼è½¯ä»¶ï¼ˆæ±Ÿè‹ï¼‰æœ‰é™å…¬å¸
 * @since 2024-10-09 12:00:57
 */
public interface PersonCommunicationAbilityService extends IService<PersonCommunicationAbility> {
    IPage<PersonCommunicationAbilityDto> personPersonCommunicationAbilityPage(Page page,
                                                                              Integer departLimsId, Integer userId, String userName);
    void exportPersonCommunicationAbility(Integer id, HttpServletResponse response)throws Exception;
}
cnas-personnel/src/main/java/com/ruoyi/personnel/service/PersonPersonnelCapacityService.java
@@ -1,34 +1,35 @@
//package com.ruoyi.personnel.service;
//
//import com.baomidou.mybatisplus.core.metadata.IPage;
//import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
//import com.baomidou.mybatisplus.extension.service.IService;
//import com.ruoyi.personnel.pojo.PersonPersonnelCapacity;
//
//import javax.servlet.http.HttpServletResponse;
//
///**
// * <p>
// * äººå‘˜èƒ½åŠ› æœåŠ¡ç±»
// * </p>
// *
// * @author èŠ¯å¯¼è½¯ä»¶ï¼ˆæ±Ÿè‹ï¼‰æœ‰é™å…¬å¸
// * @since 2024-10-10 11:26:18
// */
//public interface PersonPersonnelCapacityService extends IService<PersonPersonnelCapacity> {
//
//    IPage<PersonPersonnelCapacityDto> personPersonnelCapacityPage(Page page, Integer departLimsId, Integer userId, String userName);
//
//    /**
//     * å¯¼å‡ºäººå‘˜èƒ½åŠ›
//     * @param id
//     * @param response
//     */
//    void exportPersonnelCapacity(Integer id, HttpServletResponse response);
//
//    /**
//     * submitConfirmPersonnelCapability
//     * @param personPersonnelCapacity
//     */
//    void submitConfirmPersonnelCapability(PersonPersonnelCapacity personPersonnelCapacity);
//}
package com.ruoyi.personnel.service;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.ruoyi.personnel.dto.PersonPersonnelCapacityDto;
import com.ruoyi.personnel.pojo.PersonPersonnelCapacity;
import javax.servlet.http.HttpServletResponse;
/**
 * <p>
 * äººå‘˜èƒ½åŠ› æœåŠ¡ç±»
 * </p>
 *
 * @author èŠ¯å¯¼è½¯ä»¶ï¼ˆæ±Ÿè‹ï¼‰æœ‰é™å…¬å¸
 * @since 2024-10-10 11:26:18
 */
public interface PersonPersonnelCapacityService extends IService<PersonPersonnelCapacity> {
    IPage<PersonPersonnelCapacityDto> personPersonnelCapacityPage(Page page, Integer departLimsId, Integer userId, String userName);
    /**
     * å¯¼å‡ºäººå‘˜èƒ½åŠ›
     * @param id
     * @param response
     */
    void exportPersonnelCapacity(Integer id, HttpServletResponse response);
    /**
     * submitConfirmPersonnelCapability
     * @param personPersonnelCapacity
     */
    void submitConfirmPersonnelCapability(PersonPersonnelCapacity personPersonnelCapacity);
}
cnas-personnel/src/main/java/com/ruoyi/personnel/service/impl/PersonCommunicationAbilityServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,113 @@
package com.ruoyi.personnel.service.impl;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.deepoove.poi.XWPFTemplate;
import com.deepoove.poi.config.Configure;
import com.deepoove.poi.config.ConfigureBuilder;
import com.ruoyi.common.core.domain.entity.User;
import com.ruoyi.personnel.dto.PersonCommunicationAbilityDto;
import com.ruoyi.personnel.mapper.PersonCommunicationAbilityMapper;
import com.ruoyi.personnel.pojo.PersonCommunicationAbility;
import com.ruoyi.personnel.service.PersonCommunicationAbilityService;
import com.ruoyi.system.mapper.UserMapper;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URLEncoder;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.stream.Collectors;
/**
 * <p>
 * æ²Ÿé€šèƒ½åŠ› æœåŠ¡å®žçŽ°ç±»
 * </p>
 *
 * @author èŠ¯å¯¼è½¯ä»¶ï¼ˆæ±Ÿè‹ï¼‰æœ‰é™å…¬å¸
 * @since 2024-10-09 12:00:57
 */
@Service
public class PersonCommunicationAbilityServiceImpl extends ServiceImpl<PersonCommunicationAbilityMapper, PersonCommunicationAbility> implements PersonCommunicationAbilityService {
    @Resource
    private UserMapper userMapper;
    @Override
    public IPage<PersonCommunicationAbilityDto> personPersonCommunicationAbilityPage(Page page, Integer departLimsId, Integer userId, String userName) {
        IPage<PersonCommunicationAbilityDto> personCommunicationAbilityDtoIPage = baseMapper.personPersonCommunicationAbilityPage(page, departLimsId, userId, userName);
        List<PersonCommunicationAbilityDto> collect = personCommunicationAbilityDtoIPage.getRecords().stream().map(personCommunicationAbilityDto -> {
            if (ObjectUtils.isNotEmpty(personCommunicationAbilityDto.getUserId())) {
                List<String> account = new ArrayList<>();
                List<String> name = new ArrayList<>();
                for (String s : personCommunicationAbilityDto.getUserId().split(",")) {
                    User user = userMapper.selectById(Integer.parseInt(s));
                    account.add(user.getAccount());
                    name.add(user.getName());
                }
                personCommunicationAbilityDto.setAccount(account.stream().collect(Collectors.joining(",")));
                personCommunicationAbilityDto.setUserName(name.stream().collect(Collectors.joining(",")));
            }
            return personCommunicationAbilityDto;  // è¿™é‡Œå¯ä»¥å¯¹è¿”回的数据进行处理,如添加一些新的属性或转换等。
        }).collect(Collectors.toList());
        personCommunicationAbilityDtoIPage.setRecords(collect);
        return personCommunicationAbilityDtoIPage;
    }
    @Override
    public void exportPersonCommunicationAbility(Integer id, HttpServletResponse response) throws Exception {
        PersonCommunicationAbility personCommunicationAbility = baseMapper.selectById(id);
        //沟通人
        String collect = " ";
        if (ObjectUtils.isNotEmpty(personCommunicationAbility.getUserId())) {
            List<String> name = new ArrayList<>();
            for (String s : personCommunicationAbility.getUserId().split(",")) {
                User user = userMapper.selectById(Integer.parseInt(s));
                name.add(user.getName());
            }
            collect = name.stream().collect(Collectors.joining(","));
        }
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyå¹´MM月dd日");
        //时间
        String communicationTime = "";
        if (ObjectUtils.isNotEmpty(personCommunicationAbility.getCommunicationTime())) {
            communicationTime = personCommunicationAbility.getCommunicationTime().format(formatter);
        }
        InputStream inputStream = this.getClass().getResourceAsStream("/static/communication-deal.docx");
        ConfigureBuilder builder = Configure.builder();
        builder.useSpringEL(true);
        String finalCollect = collect;
        String finalCommunicationTime = communicationTime;
        XWPFTemplate template = XWPFTemplate.compile(inputStream, builder.build()).render(
                new HashMap<String, Object>() {{
                    put("userName", finalCollect);
                    put("communicationTime", finalCommunicationTime);
                    put("communicationPlace", personCommunicationAbility.getCommunicationPlace());
                    put("communicationContent", personCommunicationAbility.getCommunicationContent());
                }});
        try {
            response.setContentType("application/msword");
            String fileName = URLEncoder.encode(
                    "沟通记录", "UTF-8");
            response.setHeader("Content-disposition",
                    "attachment;filename=" + fileName + ".docx");
            OutputStream os = response.getOutputStream();
            template.write(os);
            os.flush();
            os.close();
        } catch (Exception e) {
            e.printStackTrace();
            throw new RuntimeException("导出失败");
        }
    }
}
cnas-personnel/src/main/java/com/ruoyi/personnel/service/impl/PersonPersonnelCapacityServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,158 @@
package com.ruoyi.personnel.service.impl;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.deepoove.poi.XWPFTemplate;
import com.deepoove.poi.config.Configure;
import com.deepoove.poi.config.ConfigureBuilder;
import com.deepoove.poi.data.Pictures;
import com.ruoyi.common.core.domain.entity.InformationNotification;
import com.ruoyi.common.core.domain.entity.User;
import com.ruoyi.common.utils.DateImageUtil;
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.common.utils.WxCpUtils;
import com.ruoyi.framework.exception.ErrorException;
import com.ruoyi.personnel.dto.PersonPersonnelCapacityDto;
import com.ruoyi.personnel.dto.PersonPersonnelCapacityExportDto;
import com.ruoyi.personnel.pojo.PersonPersonnelCapacity;
import com.ruoyi.personnel.mapper.PersonPersonnelCapacityMapper;
import com.ruoyi.personnel.service.PersonPersonnelCapacityService;
import com.ruoyi.system.mapper.UserMapper;
import com.ruoyi.system.service.InformationNotificationService;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URLEncoder;
import java.util.HashMap;
/**
 * <p>
 * äººå‘˜èƒ½åŠ› æœåŠ¡å®žçŽ°ç±»
 * </p>
 *
 * @author èŠ¯å¯¼è½¯ä»¶ï¼ˆæ±Ÿè‹ï¼‰æœ‰é™å…¬å¸
 * @since 2024-10-10 11:26:18
 */
@Service
public class PersonPersonnelCapacityServiceImpl extends ServiceImpl<PersonPersonnelCapacityMapper, PersonPersonnelCapacity> implements PersonPersonnelCapacityService {
    @Resource
    private UserMapper userMapper;
    @Resource
    private InformationNotificationService informationNotificationService;
    @Resource
    private ThreadPoolTaskExecutor threadPoolTaskExecutor;
    @Value("${file.path}")
    private String imgUrl;
    @Override
    public IPage<PersonPersonnelCapacityDto> personPersonnelCapacityPage(Page page, Integer departLimsId, Integer userId, String userName) {
        return baseMapper.personPersonnelCapacityPage(page, departLimsId, userId, userName);
    }
    /**
     * å¯¼å‡ºäººå‘˜èƒ½åŠ›
     * @param id
     * @param response
     */
    @Override
    public void exportPersonnelCapacity(Integer id, HttpServletResponse response) {
        PersonPersonnelCapacityExportDto capacityExportDto = baseMapper.selectExportPersonnelCapacity(id);
        // ç¡®è®¤äºº
        String confirmUrl = null;
        if (capacityExportDto.getConfirmOperatingPersonnelId() != null) {
            confirmUrl = userMapper.selectById(capacityExportDto.getConfirmOperatingPersonnelId()).getSignatureUrl();
            if (StringUtils.isBlank(confirmUrl)) {
                throw new ErrorException("缺少确认人签名");
            }
        }
        // èŽ·å–è·¯å¾„
        InputStream inputStream = this.getClass().getResourceAsStream("/static/personnel-capacity.docx");
        ConfigureBuilder builder = Configure.builder();
        builder.useSpringEL(true);
        String finalConfirmUrl = confirmUrl;
        XWPFTemplate template = XWPFTemplate.compile(inputStream, builder.build()).render(
                new HashMap<String, Object>() {{
                    put("capacity", capacityExportDto);
                    put("confirmUrl", StringUtils.isNotBlank(finalConfirmUrl) ? Pictures.ofLocal(imgUrl + "/" + finalConfirmUrl).create() : null);
                    put("confirmDateUrl", capacityExportDto.getConfirmDate() != null ?
                            Pictures.ofStream(DateImageUtil.createDateImage(capacityExportDto.getConfirmDate())).create() : null);
                }});
        try {
            response.setContentType("application/msword");
            String fileName = URLEncoder.encode(
                    "人员能力", "UTF-8");
            response.setHeader("Content-disposition",
                    "attachment;filename=" + fileName + ".docx");
            OutputStream os = response.getOutputStream();
            template.write(os);
            os.flush();
            os.close();
        } catch (Exception e) {
            e.printStackTrace();
            throw new RuntimeException("导出失败");
        }
    }
    /**
     * æäº¤ç¡®è®¤äººå‘˜èƒ½åŠ›
     * @param personPersonnelCapacity
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public void submitConfirmPersonnelCapability(PersonPersonnelCapacity personPersonnelCapacity) {
        if (personPersonnelCapacity.getConfirmOperatingPersonnelId() == null) {
            throw new ErrorException("缺少确认人");
        }
        User formUser = userMapper.selectById(personPersonnelCapacity.getUserId());
        Integer userId = SecurityUtils.getUserId().intValue();
        User user = userMapper.selectById(userId);
        // æ¶ˆæ¯å‘送
        InformationNotification info = new InformationNotification();
        // å‘送人
        info.setCreateUser(user.getName());
        info.setMessageType("6");
        info.setTheme("CNAS人员能力确认通知");
        info.setContent(formUser.getName() + "的人员能力待确认");
        info.setSenderId(userId);
        // æŽ¥æ”¶äºº
        info.setConsigneeId(personPersonnelCapacity.getConfirmOperatingPersonnelId());
        info.setJumpPath("a6-personnel");
        informationNotificationService.addInformationNotification(info);
        this.saveOrUpdate(personPersonnelCapacity);
        // å‘送企业微信通知
        threadPoolTaskExecutor.execute(() -> {
            // æŸ¥è¯¢æŽ¥æ”¶äºº
            User personnel = userMapper.selectById(personPersonnelCapacity.getConfirmOperatingPersonnelId());
            String message = "";
            message += "CNAS人员能力确认通知";
            message += "\n请去资源管理-人员-人员能力填写";
            message += "\n" + formUser.getName() + "的人员能力待确认";
            //发送企业微信消息通知
            try {
                WxCpUtils.inform(personnel.getAccount(), message, null);
            } catch (Exception e) {
                throw new RuntimeException(e);
            }
        });
    }
}
cnas-personnel/src/main/resources/mapper/PersonCommunicationAbilityMapper.xml
¶Ô±ÈÐÂÎļþ
@@ -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.personnel.mapper.PersonCommunicationAbilityMapper">
    <select id="personPersonCommunicationAbilityPage" resultType="com.ruoyi.personnel.dto.PersonCommunicationAbilityDto">
        select cpca.*, us.name create_user_name
        from cnas_person_communication_ability cpca
        left join user us on cpca.create_user = us.id
        <where>
            <if test="userId != null and userId != ''">
                and FIND_IN_SET(#{userId},cpca.user_id)
            </if>
            <if test="departLimsId != null and departLimsId != ''">
                and FIND_IN_SET(#{departLimsId},us.depart_lims_id)
            </if>
        </where>
    </select>
</mapper>
cnas-personnel/src/main/resources/mapper/PersonPersonnelCapacityMapper.xml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,118 @@
<?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.personnel.mapper.PersonPersonnelCapacityMapper">
    <select id="personPersonnelCapacityPage" resultType="com.ruoyi.personnel.dto.PersonPersonnelCapacityDto">
        select cppc.*,
        u2.name confirm_operating_personnel_name,
        u3.name user_name,
        cpbi.post_name,
        ecp.responsibilities,
        cpbi.professional_title,
        TRIM(',' FROM CONCAT(cpbi.major1, ',', cpbi.major2)) AS major
        from cnas_person_personnel_capacity cppc
        left join user u2 on cppc.confirm_operating_personnel_id = u2.id
        left join user u3 on cppc.user_id = u3.id
        -- å–岗位
        left join cnas_person_basic_info cpbi on cpbi.user_id = cppc.user_id
        -- å–人员能力的岗位职责
        left join (SELECT GROUP_CONCAT(e.label) responsibilities, cppc.id
        from cnas_person_personnel_capacity cppc
        left join enums e on FIND_IN_SET(e.value, cppc.job_responsibilities)
        where e.category = '岗位职责'
        GROUP BY cppc.id) ecp on ecp.id = cppc.id
        <where>
            <if test="userId != null and userId != ''">
                and cppc.user_id = #{userId}
            </if>
            <if test="departLimsId != null and departLimsId != ''">
                and FIND_IN_SET(#{departLimsId}, u3.depart_lims_id)
            </if>
            <if test="userName != null and userName != ''">
                and u3.name like concat('%', #{userName}, '%')
            </if>
        </where>
    </select>
    <!-- æŸ¥è¯¢äººå‘˜èƒ½åŠ›æŽ¥å£ -->
    <select id="selectExportPersonnelCapacity"
            resultType="com.ruoyi.personnel.dto.PersonPersonnelCapacityExportDto">
        select cppc.*,
               cpbi.post_name,
               u1.name   userName,
               cpbi.official_academic_redentials,
               cpbi.major1,
               cpbi.professional_title,
               p.place_work,
               TRIM(',' FROM CONCAT(cpbi.major1, ',', cpbi.major2)) AS major,
               case when cppc.academic_conform_not = 1 then '☑'
                    else '□' end academicConformNot1,-- å­¦åކ
               case when cppc.academic_conform_not = 2 then '☑'
                    else '□' end academicConformNot2,
               case when cppc.academic_conform_not = 3 then '☑'
                    else '□' end academicConformNot3,
               case when cppc.related_years_conform_not = 1 then '☑'
                    else '□' end relatedYearsConformNot1,-- ç›¸å…³å¹´é™
               case when cppc.related_years_conform_not = 2 then '☑'
                    else '□' end relatedYearsConformNot2,
               case when cppc.related_years_conform_not = 3 then '☑'
                    else '□' end relatedYearsConformNot3,
               case when cppc.related_training_conform_not = 1 then '☑'
                    else '□' end relatedTrainingConformNot1,-- ç›¸å…³åŸ¹è®­
               case when cppc.related_training_conform_not = 2 then '☑'
                    else '□' end relatedTrainingConformNot2,
               case when cppc.related_training_conform_not = 3 then '☑'
                    else '□' end relatedTrainingConformNot3,
               case when cppc.relevant_experience_conform_not = 1 then '☑'
                    else '□' end relevantExperienceConformNot1,-- ç›¸å…³ç»éªŒ
               case when cppc.relevant_experience_conform_not = 2 then '☑'
                    else '□' end relevantExperienceConformNot2,
               case when cppc.relevant_experience_conform_not = 3 then '☑'
                    else '□' end relevantExperienceConformNot3,
               case when cppc.work_license_conform_not = 1 then '☑'
                    else '□' end workLicenseConformNot1,-- ä¸Šå²—证
               case when cppc.work_license_conform_not = 2 then '☑'
                    else '□' end workLicenseConformNot2,
               case when cppc.work_license_conform_not = 3 then '☑'
                    else '□' end workLicenseConformNot3,
               case when cppc.job_responsibilities_conform_not = 1 then '☑'
                    else '□' end jobResponsibilitiesConformNot1,-- å²—位职责
               case when cppc.job_responsibilities_conform_not = 2 then '☑'
                    else '□' end jobResponsibilitiesConformNot2,
               case when cppc.job_responsibilities_conform_not = 3 then '☑'
                    else '□' end jobResponsibilitiesConformNot3,
               case when cppc.comprehensive_assessment = 'Qualified this position' then '☑'
                    else '□' end comprehensiveAssessment1,-- ç»¼åˆè¯„ä»·
               case when cppc.comprehensive_assessment = 'You can work while training' then '☑'
                    else '□' end comprehensiveAssessment2,
               case when cppc.comprehensive_assessment = 'Iconpetent for the position' then '☑'
                    else '□' end comprehensiveAssessment3,
               case when find_in_set(1, cppc.job_responsibilities) then '☑'
                    else '□' end jobResponsibilities1,
               case when find_in_set(2, cppc.job_responsibilities) then '☑'
                    else '□' end jobResponsibilities2,
               case when find_in_set(3, cppc.job_responsibilities) then '☑'
                    else '□' end jobResponsibilities3,
               case when find_in_set(4, cppc.job_responsibilities) then '☑'
                    else '□' end jobResponsibilities4,
               case when find_in_set(5, cppc.job_responsibilities) then '☑'
                    else '□' end jobResponsibilities5,
               case when find_in_set(6, cppc.job_responsibilities) then '☑'
                    else '□' end jobResponsibilities6,
               case when find_in_set(7, cppc.job_responsibilities) then '☑'
                    else '□' end jobResponsibilities7,
               case when find_in_set(8, cppc.job_responsibilities) then '☑'
                    else '□' end jobResponsibilities8,
               case when find_in_set(9, cppc.job_responsibilities) then '☑'
                    else '□' end jobResponsibilities9,
               case when find_in_set(10, cppc.job_responsibilities) then '☑'
                    else '□' end jobResponsibilities10
        from cnas_person_personnel_capacity cppc
                 left join user u1 on cppc.user_id = u1.id
                 left join cnas_person_basic_info cpbi on cpbi.user_id = cppc.user_id
                 left join (select GROUP_CONCAT(cptr.work_experience) place_work, cptr.user_id
                            from cnas_person_basic_info_work cptr
                            GROUP BY cptr.user_id) p on u1.id = p.user_id
        where cppc.id = #{id}
    </select>
</mapper>