人力项目框架解析新增修改方法

在迁移项目但是遇到了一些问题,迁移项目的时候发现项目的整体框架很有趣,但是苦于项目框架太大了,竟然只能完整迁移,做不到部分迁移,于是我也只能从一半的角度来进行解释整个项目。

雇员

我们雇员这个为对象讲解一下整个项目

java 复制代码
@Api(value = "人员基本信息模块", tags = "人员基本信息模块")
@CrossOrigin(origins = "*", maxAge = 3600)
@RestController
@RequestMapping("/api/person/person_base_info")
@Slf4j
public class PersonBaseInfoController extends BaseHistoryController<PersonBaseInfo, PersonInfoDTO> {

    @Autowired
    private PersonBaseInfoService personBaseInfoService;

    @Autowired
    private PersonWordExport personWordExport;

    @Autowired
    private PersonAllocationInfoService personAllocationInfoService;

    @Autowired
    private PersonLifecycleInfoService personLifecycleInfoService;

    @Autowired
    private AddressInfoService addressInfoService;

    @Autowired
    private RedisTemplate redisTemplate;

    @ApiOperation(value = "人员信息验证", notes = "人员信息验证", response = PersonBaseInfoResponseVerifyDTO.class, httpMethod = "POST")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "X-Person-Id", value = "登录人ID", paramType = "header", dataType = "long", required = true),
            @ApiImplicitParam(name = "X-Business-Group-Id", value = "用户所属业务组编号", paramType = "header", dataType = "long", required = true, defaultValue = "1001"),
            @ApiImplicitParam(name = "from", value = "人员信息验证请求", dataType = "PersonBaseInfoRequestVerifyDTO", required = true)
    })
    @ApiResponses({
            @ApiResponse(code = 200, message = "已更正")
    })
    @PostMapping("/verify")
    public ResponseEntity<Object> verify(
            @RequestHeader("X-Person-Id") Long xPersonId,
            @RequestHeader("X-Business-Group-Id") Long xBusinessGroupId,
            @RequestBody PersonBaseInfoRequestVerifyDTO from) {
        try {
            PersonBaseInfoResponseVerifyDTO responseVerifyDTO = personBaseInfoService.verify(xBusinessGroupId, from);
            return new ResponseEntity<>(responseVerifyDTO, HttpStatus.OK);
        } catch (ServiceException e) {
            return new ResponseEntity<>(e.getMessageResponse(), HttpStatus.NOT_FOUND);
        }
    }

    @ApiOperation(value = "根据ID查询单个人员基本信息", notes = "根据ID查询单个人员基本信息", response = PersonInfoDTO.class, httpMethod = "GET")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "id", value = "人员基本信息ID", dataType = "long", required = true),
            @ApiImplicitParam(name = "assignmentId", value = "人员分配信息ID,默认:取主分配第一条", dataType = "long"),
            @ApiImplicitParam(name = "date", value = "查询日期,默认:取当前日期", dataType = "date", format = "date"),
    })
    @ApiResponse(code = 200, message = "返回数据成功")
    @GetMapping("/{id}")
    public ResponseEntity<Object> select(@PathVariable(value = "id") Long id,
                                         @RequestParam(value = "assignmentId", required = false) Long assignmentId,
                                         @RequestParam(value = "date", required = false)
                                         @DateTimeFormat(pattern = "yyyy-MM-dd") Date date) {
        PersonInfoDTO result = personBaseInfoService.selectPersonDtoById(id, assignmentId,
                Objects.nonNull(date) ? date.toInstant().atZone(ZoneId.systemDefault()).toLocalDate() : null);
        if (Objects.nonNull(result)) {
            return new ResponseEntity<>(result, HttpStatus.OK);
        } else {
            return new ResponseEntity<>(new PersonInfoDTO(), HttpStatus.OK);
        }
    }

    @ApiOperation(value = "通过职务id查询范围内的岗位级别", notes = "通过职务id查询范围内的岗位级别", response = GlobalLookupCodeInfoDTO.class, httpMethod = "GET")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "jobId", value = "职务id", dataType = "long"),
            @ApiImplicitParam(name = "X-Business-Group-Id", value = "用户所属业务组编号", paramType = "header", dataType = "long", required = true, defaultValue = "1001")
    })
    @ApiResponse(code = 200, message = "返回数据成功")
    @GetMapping(value = {"/personGrade/{jobId}", "/personGrade"})
    public ResponseEntity<Object> selectByJobId(@PathVariable(value = "jobId", required = false) Long jobId,
                                                @RequestHeader("X-Business-Group-Id") Long xBusinessGroupId) {
        return new ResponseEntity<>(personBaseInfoService.selectByJobId(jobId, xBusinessGroupId), HttpStatus.OK);
    }

    @ApiOperation(value = "根据证件查询单个人员基本信息", notes = "根据证件查询单个人员基本信息", response = PersonInfoDTO.class, httpMethod = "GET")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "X-Business-Group-Id", value = "用户所属业务组编号", paramType = "header", dataType = "long", required = true, defaultValue = "1001"),
            @ApiImplicitParam(name = "idCardType", value = "证件类型ID", dataType = "long", required = true),
            @ApiImplicitParam(name = "idCardNumber", value = "证件编号", dataType = "string", required = true),
            @ApiImplicitParam(name = "date", value = "查询日期,默认:取当前日期", dataType = "date", format = "date"),
    })
    @ApiResponse(code = 200, message = "返回数据成功")
    @GetMapping("/card/{idCardType}/{idCardNumber}")
    public ResponseEntity<Object> card(@RequestHeader("X-Business-Group-Id") Long xBusinessGroupId,
                                       @PathVariable(value = "idCardType") Long idCardType,
                                       @PathVariable(value = "idCardNumber") String idCardNumber,
                                       @RequestParam(value = "date", required = false)
                                       @DateTimeFormat(pattern = "yyyy-MM-dd") Date date) {
        PersonInfoDTO result = personBaseInfoService.selectPersonDtoByCard(xBusinessGroupId, idCardType, idCardNumber,
                Objects.nonNull(date) ? date.toInstant().atZone(ZoneId.systemDefault()).toLocalDate() : null);
        if (Objects.nonNull(result)) {
            return new ResponseEntity<>(result, HttpStatus.OK);
        } else {
            return new ResponseEntity<>(new PersonInfoDTO(), HttpStatus.OK);
        }
    }

    @Override
    protected ResponseEntity<Object> modify(PersonInfoDTO from, PersonBaseInfo personBaseInfo, LocalDate localDate) {
        return ResponseEntityUtils.buildModifyResponseEntity(personBaseInfoService.modify(from, personBaseInfo, localDate));
    }

    @Override
    protected ResponseEntity<Object> renew(PersonInfoDTO from, PersonBaseInfo personBaseInfo, LocalDate localDate) {
        return ResponseEntityUtils.buildRenewResponseEntity(personBaseInfoService.renew(from, personBaseInfo, localDate));
    }

    @Override
    protected ResponseEntity<Object> create(PersonInfoDTO from, PersonBaseInfo personBaseInfo) {
        return ResponseEntityUtils.buildCreateResponseEntity(personBaseInfoService.create(from, personBaseInfo));

    }

    @ApiOperation(value = "更正人员基本和任职信息", notes = "更正人员基本和任职信息", response = PersonInfoDTO.class, httpMethod = "POST")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "X-Person-Id", value = "登录人ID", paramType = "header", dataType = "long", required = true),
            @ApiImplicitParam(name = "X-Person-Name", value = "登录人姓名", paramType = "header", dataType = "string", required = true),
            @ApiImplicitParam(name = "X-Business-Group-Id", value = "用户所属业务组编号", paramType = "header", dataType = "long", required = true, defaultValue = "1001"),
            @ApiImplicitParam(name = "date", value = "查询日期", dataType = "date-time", format = "date"),
            @ApiImplicitParam(name = "from", value = "人员基本和任职信息信息", dataType = "PersonInfoDTO", required = true)
    })
    @ApiResponses({
            @ApiResponse(code = 200, message = "已更正")
    })
    @PostMapping
    public ResponseEntity<Object> modify(
            @RequestHeader("X-Person-Id") Long xPersonId,
            @RequestHeader("X-Person-Name") String xPersonName,
            @RequestHeader("X-Business-Group-Id") Long xBusinessGroupId,
            @RequestParam(value = "date", required = false)
            @DateTimeFormat(pattern = "yyyy-MM-dd") Date date,
            @RequestBody PersonInfoDTO from) {
        PersonBaseInfo personBaseInfo = newT();
        this.copyProperties(from, xPersonId, xPersonName, personBaseInfo);
        personBaseInfo.setBusinessGroupId(xBusinessGroupId);
        return this.createOrModify(from, xPersonId, xPersonName, date, personBaseInfo);
    }

    @Override
    protected void copyProperties(PersonInfoDTO from, Long xPersonId, String xPersonName, PersonBaseInfo t) {
        BeanCopyUtils.copyProperties(from.getPersonBaseInfo(), t, PropertiesCopyable.ignoreCopyable("id"));
        t.setUpdateBy(xPersonId);
        t.setUpdateByName(xPersonName);
    }

    @ApiOperation(value = "更新人员基本和任职信息", notes = "更新人员基本和任职信息", response = PersonInfoDTO.class, httpMethod = "POST")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "X-Person-Id", value = "登录人ID", paramType = "header", dataType = "long", required = true),
            @ApiImplicitParam(name = "X-Person-Name", value = "登录人姓名", paramType = "header", dataType = "string", required = true),
            @ApiImplicitParam(name = "X-Business-Group-Id", value = "用户所属业务组编号", paramType = "header", dataType = "long", required = true, defaultValue = "1001"),
            @ApiImplicitParam(name = "date", value = "查询日期", dataType = "date-time", format = "date"),
            @ApiImplicitParam(name = "from", value = "人员基本和任职信息", dataType = "PersonInfoDTO", required = true)
    })
    @ApiResponses({
            @ApiResponse(code = 200, message = "已更新")
    })
    @PostMapping("/renew")
    public ResponseEntity<Object> renew(
            @RequestHeader("X-Person-Id") Long xPersonId,
            @RequestHeader("X-Person-Name") String xPersonName,
            @RequestHeader("X-Business-Group-Id") Long xBusinessGroupId,
            @RequestParam(value = "date", required = false)
            @DateTimeFormat(pattern = "yyyy-MM-dd") Date date,
            @RequestBody PersonInfoDTO from) {
        PersonBaseInfo personBaseInfo = newT();
        this.copyProperties(from, xPersonId, xPersonName, personBaseInfo);
        personBaseInfo.setBusinessGroupId(xBusinessGroupId);
        return this.createOrRenew(from, xPersonId, xPersonName, date, personBaseInfo);
    }

    @ApiOperation(value = "更新人员离职信息", notes = "更新人员离职信息", response = PersonInfoDTO.class, httpMethod = "POST")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "X-Person-Id", value = "登录人ID", paramType = "header", dataType = "long", required = true),
            @ApiImplicitParam(name = "X-Person-Name", value = "登录人姓名", paramType = "header", dataType = "string", required = true),
            @ApiImplicitParam(name = "X-Business-Group-Id", value = "用户所属业务组编号", paramType = "header", dataType = "long", required = true, defaultValue = "1001"),
            @ApiImplicitParam(name = "date", value = "查询日期", dataType = "date-time", format = "date"),
            @ApiImplicitParam(name = "from", value = "人员服务期间信息", dataType = "PersonInfoDTO", required = true)
    })
    @ApiResponses({
            @ApiResponse(code = 200, message = "已更新")
    })
    @PostMapping("/leaving")
    public ResponseEntity<Object> leaving(
            @RequestHeader("X-Person-Id") Long xPersonId,
            @RequestHeader("X-Person-Name") String xPersonName,
            @RequestHeader("X-Business-Group-Id") Long xBusinessGroupId,
            @RequestParam(value = "date", required = false)
            @DateTimeFormat(pattern = "yyyy-MM-dd") Date date,
            @RequestBody PersonInfoDTO from) {
        try {
            return ResponseEntityUtils.buildRenewResponseEntity(
                    personBaseInfoService.leaving(from, xBusinessGroupId, xPersonId, xPersonName,
                            Objects.nonNull(date) ? date.toInstant().atZone(ZoneId.systemDefault()).toLocalDate() : null));
        } catch (ServiceException e) {
            return new ResponseEntity<>(e.getMessageResponse(), HttpStatus.NOT_FOUND);
        }
    }

    /**
     * 拼装
     *
     * @param xBusinessGroupId
     * @param personName
     * @param employeeNumber
     * @param orgId
     * @param idCardNumber
     * @param onDutyCategory
     * @param date
     * @param searchText
     * @param dataPermission
     * @return
     */
    public static void fillPersonBaseInfoSearchDTO(PersonBaseInfoSearchDTO searchDTO, Long xBusinessGroupId, String personName,
                                                   String employeeNumber, Long orgId, String idCardNumber, Long onDutyCategory, Date date, String searchText, String dataPermission) {
        searchDTO.setBusinessGroupId(xBusinessGroupId);
        searchDTO.setPersonName(personName);
        searchDTO.setEmployeeNumber(employeeNumber);
        searchDTO.setOrgId(orgId);
        searchDTO.setIdCardNumber(idCardNumber);
        searchDTO.setOnDutyCategory(onDutyCategory);
        searchDTO.setDate(Objects.nonNull(date) ? date.toInstant().atZone(ZoneId.systemDefault()).toLocalDate() : null);
        searchDTO.setSearchText(searchText);
        searchDTO.setDataPermission(dataPermission);
    }

    @ApiOperation(value = "分页查询人员基本信息", notes = "分页查询人员基本信息", response = Page.class, httpMethod = "GET")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "X-Person-Id", value = "登录人ID", paramType = "header", dataType = "string", required = true),
            @ApiImplicitParam(name = "X-Business-Group-Id", value = "用户所属业务组编号", paramType = "header", dataType = "string", required = true, defaultValue = "1001"),
            @ApiImplicitParam(name = "X-Data-Permission", value = "数据安全性", paramType = "header", dataType = "String", required = true),
            @ApiImplicitParam(name = "personName", value = "姓名", dataType = "string"),
            @ApiImplicitParam(name = "employeeNumber", value = "员工编号", dataType = "string"),
            @ApiImplicitParam(name = "orgId", value = "部门", dataType = "long"),
            @ApiImplicitParam(name = "idCardNumber", value = "身份证号", dataType = "string"),
            @ApiImplicitParam(name = "onDutyCategory", value = "在岗类别", dataType = "long"),
            @ApiImplicitParam(name = "date", value = "查询日期", dataType = "date", format = "date"),
            @ApiImplicitParam(name = "primary", value = "分配类型 1 只查主分配(默认) 0 只查不是主分配 -1 全查", dataType = "int"),
            @ApiImplicitParam(name = "ignorePersonId", value = "忽略不查询的人员Id", dataType = "long"),
            @ApiImplicitParam(name = "topOrgId", value = "二级单位ID", dataType = "long"),
            @ApiImplicitParam(name = "onDutyCategoryList", value = "只查哪些 在岗类别 \",\"号拼接Id", dataType = "string"),
            @ApiImplicitParam(name = "ignoreOnDutyCategoryList", value = "忽略哪些 在岗类别 \",\"号拼接Id", dataType = "string"),
            @ApiImplicitParam(name = "searchText", value = "人员基本编码 or 人员基本名称", dataType = "string"),
            @ApiImplicitParam(name = "whetherDataPermission", value = "是否适用数据安全性: 1 适用(默认) 0 不适用", dataType = "int"),
            @ApiImplicitParam(name = "pageNumber", value = "当前页", dataType = "int", defaultValue = "1"),
            @ApiImplicitParam(name = "pageSize", value = "页数", dataType = "int", defaultValue = "10")
    })
    @ApiResponse(code = 200, message = "返回数据成功", response = Page.class)
    @GetMapping("/search")
    public ResponseEntity<Object> search(@RequestHeader("X-Business-Group-Id") Long xBusinessGroupId,
                                         @RequestHeader("X-Data-Permission") String dataPermission,
                                         @RequestParam(value = "personName", required = false) String personName,
                                         @RequestParam(value = "employeeNumber", required = false) String employeeNumber,
                                         @RequestParam(value = "orgId", required = false) Long orgId,
                                         @RequestParam(value = "idCardNumber", required = false) String idCardNumber,
                                         @RequestParam(value = "onDutyCategory", required = false) Long onDutyCategory,
                                         @RequestParam(value = "date", required = false)
                                         @DateTimeFormat(pattern = "yyyy-MM-dd") Date date,
                                         @RequestParam(value = "primary", defaultValue = "1", required = false) Integer primary,
                                         @RequestParam(value = "ignorePersonId", required = false) Long ignorePersonId,
                                         @RequestParam(value = "topOrgId", required = false) Long topOrgId,
                                         @RequestParam(value = "onDutyCategoryList", required = false) String onDutyCategoryList,
                                         @RequestParam(value = "ignoreOnDutyCategoryList", required = false) String ignoreOnDutyCategoryList,
                                         @RequestParam(value = "searchText", required = false) String searchText,
                                         @RequestParam(value = "whetherDataPermission", required = false) Integer whetherDataPermission,
                                         @RequestParam(value = "pageNumber", defaultValue = "1", required = false) Integer pageNumber,
                                         @RequestParam(value = "pageSize", defaultValue = "10", required = false) Integer pageSize) {

        PersonBaseInfoSearchDTO searchDTO = new PersonBaseInfoSearchDTO(pageNumber, pageSize);
        fillPersonBaseInfoSearchDTO(searchDTO, xBusinessGroupId, personName,
                employeeNumber, orgId, idCardNumber, onDutyCategory, date, searchText, dataPermission);
        // 如果是其他值只查主分配
        if (Objects.isNull(primary)
                || (primary != 1 && primary != 0 && primary != -1)) {
            primary = 1;
        }

        searchDTO.setPrimary(primary);
        searchDTO.setIgnorePersonId(ignorePersonId);
        searchDTO.setTopOrgId(topOrgId);
        searchDTO.setWhetherDataPermission(whetherDataPermission);
        try {
            if (StringUtils.isNotEmpty(onDutyCategoryList)) {
                searchDTO.setOnDutyCategoryList(
                        Arrays.stream(onDutyCategoryList.split(","))
                                .filter(StringUtils::isNotEmpty)
                                .map(Long::valueOf)
                                .collect(Collectors.toList())
                );
            }
            if (StringUtils.isNotEmpty(ignoreOnDutyCategoryList)) {
                searchDTO.setIgnoreOnDutyCategoryList(
                        Arrays.stream(ignoreOnDutyCategoryList.split(","))
                                .filter(StringUtils::isNotEmpty)
                                .map(Long::valueOf)
                                .collect(Collectors.toList())
                );
            }
        } catch (NumberFormatException e) {
            return new ResponseEntity<>(new MessageResponse("在岗类别\",\"号拼接 Id 只能为数字"), HttpStatus.NOT_FOUND);
        }
        // 不传默认需要分页
        searchDTO.setWhetherPage(ObjectUtil.isEmpty(searchDTO.getWhetherPage()) ? 0 : searchDTO.getWhetherPage());
        Page<PersonBaseInfoVO> page = personBaseInfoService.search(searchDTO);

        if (Objects.nonNull(page)) {
            if (ObjectUtil.equal(searchDTO.getWhetherPage(), 1)) {
                return new ResponseEntity<>(page.getRecords(), HttpStatus.OK);
            }
            return new ResponseEntity<>(page, HttpStatus.OK);
        }
        return new ResponseEntity<>(HttpStatus.NOT_FOUND);
    }

    @ApiOperation(value = "分页查询人员基本信息", notes = "分页查询人员基本信息", response = Page.class, httpMethod = "POST")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "X-Business-Group-Id", value = "用户所属业务组编号", paramType = "header", dataType = "string", required = true, defaultValue = "1001"),
            @ApiImplicitParam(name = "X-Data-Permission", value = "数据安全性", paramType = "header", dataType = "String"),
            @ApiImplicitParam(name = "searchDTO", value = "人员服务期间信息", dataType = "PersonBaseInfoSearchDTO", required = true)
    })
    @ApiResponse(code = 200, message = "返回数据成功", response = Page.class)
    @PostMapping("/search")
    public ResponseEntity<Page<PersonBaseInfoVO>> postSearch(@RequestHeader("X-Business-Group-Id") Long xBusinessGroupId,
                                                             @RequestHeader(value = "X-Data-Permission", required = false) String dataPermission,
                                                             @RequestBody PersonBaseInfoSearchDTO searchDTO) {
        searchDTO.setBusinessGroupId(xBusinessGroupId);
        searchDTO.setDataPermission(dataPermission);
        // 不传默认需要分页
        searchDTO.setWhetherPage(ObjectUtil.isEmpty(searchDTO.getWhetherPage()) ? 0 : searchDTO.getWhetherPage());
        if (ObjectUtil.equal(searchDTO.getWhetherPage(), 0)) {
            int offSet = PageHelper.offsetCurrent(searchDTO.getPageNumber(), searchDTO.getPageSize());
            searchDTO.setOffset(offSet);
        }
        Integer primary = searchDTO.getPrimary();
        // 如果是其他值只查主分配
        if (Objects.isNull(primary)
                || (primary != 1 && primary != 0 && primary != -1)) {
            searchDTO.setPrimary(1);
        }
        Page<PersonBaseInfoVO> page = personBaseInfoService.search(searchDTO);
        if (Objects.nonNull(page)) {
            return new ResponseEntity<>(page, HttpStatus.OK);
        }
        return new ResponseEntity<>(HttpStatus.NOT_FOUND);
    }

    /**
     * 并发数据测试支持千人以上秒级并发峰值访问
     *
     * @param xBusinessGroupId
     * @param dataPermission
     * @param searchDTO
     * @return
     */
    @ApiOperation(value = "分页查询人员基本信息", notes = "分页查询人员基本信息", response = Page.class, httpMethod = "POST")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "X-Business-Group-Id", value = "用户所属业务组编号", paramType = "header", dataType = "string", required = true, defaultValue = "1001"),
            @ApiImplicitParam(name = "X-Data-Permission", value = "数据安全性", paramType = "header", dataType = "String"),
            @ApiImplicitParam(name = "searchDTO", value = "人员服务期间信息", dataType = "PersonBaseInfoSearchDTO", required = true)
    })
    @ApiResponse(code = 200, message = "返回数据成功", response = Page.class)
    @PostMapping("/searchfortoomuch")
    public ResponseEntity<List<PersonBaseInfoVO>> postSearchForTooMych(@RequestHeader("X-Business-Group-Id") Long xBusinessGroupId,
                                                                       @RequestHeader(value = "X-Data-Permission", required = false) String dataPermission,
                                                                       @RequestBody PersonBaseInfoSearchDTO searchDTO) throws Exception {

        if (searchDTO.getEmployeeNumber() == null || searchDTO.getEmployeeNumber() == "") {
            return new ResponseEntity<>(HttpStatus.NOT_FOUND);
        }

        ValueOperations valueOperations = redisTemplate.opsForValue();

        if (valueOperations.get(searchDTO.getEmployeeNumber()) != null) {
            return new ResponseEntity<>((List<PersonBaseInfoVO>) valueOperations.get(searchDTO.getEmployeeNumber()), HttpStatus.OK);
        }

        List<PersonBaseInfoVO> personBaseInfoVOS = personBaseInfoService.searchFor(searchDTO);

        if (Objects.nonNull(personBaseInfoVOS)) {

            valueOperations.set(searchDTO.getEmployeeNumber(), personBaseInfoVOS, 5, TimeUnit.HOURS);

            return new ResponseEntity<>(personBaseInfoVOS, HttpStatus.OK);
        }

        return new ResponseEntity<>(HttpStatus.NOT_FOUND);
    }

    @ApiOperation(value = "分页查询人员基本信息", notes = "分页查询人员基本信息", response = Page.class, httpMethod = "POST")
    @ApiResponse(code = 200, message = "返回数据成功", response = Page.class)
    @PostMapping("/searchforhello")
    public ResponseEntity<Object> searchforhello() {
        int min = 300;
        int max = 600;
        int time = min + (int) (Math.random() * ((max - min) + 1));
        try {
            Thread.sleep(time);
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
        String result = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";
        for (int i = 0; i < time; i++) {
            result += "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";
        }
        return new ResponseEntity<>(result, HttpStatus.OK);
    }

    @ApiOperation(value = "查询人员基本历史信息", notes = "查询人员基本历史信息", response = HistoryDTO.class, responseContainer = "List", httpMethod = "GET")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "id", value = "人员基本ID", dataType = "long", required = true)
    })
    @ApiResponse(code = 200, message = "返回数据成功", response = Page.class)
    @GetMapping("/history/{id}")
    public ResponseEntity<Object> history(@PathVariable(value = "id") Long id) {
        return new ResponseEntity<>(personBaseInfoService.selectHistoryList(id), HttpStatus.OK);
    }

    @ApiOperation(value = "查询员工生命周期变更记录", notes = "查询员工生命周期变更记录", response = PersonLifecycleDTO.class, responseContainer = "List", httpMethod = "GET")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "id", value = "人员基本ID", dataType = "long", required = true)
    })
    @ApiResponse(code = 200, message = "返回数据成功", response = Page.class)
    @GetMapping("/lifecycle/{id}")
    public ResponseEntity<Object> lifecycle(@PathVariable(value = "id") Long id) {
        Map<LocalDate, PersonLifecycleDTO> lifecycleBaseInfoMap = personBaseInfoService.selectLifecycleList(id);

        for (Map.Entry<LocalDate, PersonLifecycleDTO> entry : personAllocationInfoService.selectLifecycleList(id).entrySet()) {
            LocalDate key = entry.getKey();
            PersonLifecycleDTO value = entry.getValue();

            PersonLifecycleDTO lifecycleBaseInfo = lifecycleBaseInfoMap.get(key);
            // 如果存在 有2种情况
            // 1、信息维护 直接覆盖
            // 2、入/离职 取出来排序
            if (Objects.isNull(lifecycleBaseInfo) || "信息维护".equals(lifecycleBaseInfo.getOperateTypeName())) {
                lifecycleBaseInfoMap.put(key, value);
            } else {
                List<PersonLifecycleDTO> temp = new ArrayList<>();
                // 添加
                temp.add(lifecycleBaseInfo);
                temp.addAll(lifecycleBaseInfo.getPersonLifecycleList());
                temp.add(value);
                temp.addAll(value.getPersonLifecycleList());
                // 清空
                lifecycleBaseInfo.setPersonLifecycleList(new ArrayList<>());
                value.setPersonLifecycleList(new ArrayList<>());

                // 排序
                temp.sort(Comparator.comparing(PersonLifecycleDTO::getDate));

                // 将剩余的放入第一个
                PersonLifecycleDTO firstLifecycle = temp.get(0);
                temp.remove(0);
                firstLifecycle.setPersonLifecycleList(temp);

                // 存入
                lifecycleBaseInfoMap.put(firstLifecycle.getDate(), firstLifecycle);
            }
        }
        return new ResponseEntity<>(lifecycleBaseInfoMap.values(), HttpStatus.OK);
    }

    @ApiOperation(value = "查询人员分配信息", notes = "查询人员分配信息", response = PersonAssignmentInfoDTO.class, httpMethod = "GET")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "X-Business-Group-Id", value = "用户所属业务组编号", paramType = "header", dataType = "string", required = true, defaultValue = "1001"),
            @ApiImplicitParam(name = "id", value = "人员", dataType = "long"),
            @ApiImplicitParam(name = "orgId", value = "部门", dataType = "long"),
            @ApiImplicitParam(name = "jobId", value = "职务", dataType = "long"),
            @ApiImplicitParam(name = "positionId", value = "职位", dataType = "long"),
            @ApiImplicitParam(name = "date", value = "查询日期", dataType = "date", format = "date")
    })
    @GetMapping("/person/{id}/assignment")
    public ResponseEntity<PersonAssignmentInfoDTO> selectAssignmentInfoDtoBy(
            @RequestHeader("X-Business-Group-Id") Long xBusinessGroupId,
            @PathVariable("id") Long id,
            @RequestParam(value = "orgId") Long orgId,
            @RequestParam(value = "jobId") Long jobId,
            @RequestParam(value = "positionId") Long positionId,
            @RequestParam(value = "date", required = false)
            @DateTimeFormat(pattern = "yyyy-MM-dd") Date date) {
        PersonAssignmentInfoDTO dto = personBaseInfoService.selectAssignmentInfoDtoBy(
                xBusinessGroupId, id, orgId, jobId, positionId,
                Objects.nonNull(date) ? date.toInstant().atZone(ZoneId.systemDefault()).toLocalDate() : null);
        if (Objects.nonNull(dto)) {
            return new ResponseEntity<>(dto, HttpStatus.OK);
        }
        return new ResponseEntity<>(HttpStatus.NOT_FOUND);
    }

    @ApiOperation(value = "查询员工异动详细信息", notes = "查询员工异动详细信息", response = PersonAllocationDTO.class, responseContainer = "List", httpMethod = "GET")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "id", value = "人员基本ID", dataType = "long", required = true),
            @ApiImplicitParam(name = "startDate", value = "开始日期", dataType = "date", format = "date", required = true),
            @ApiImplicitParam(name = "endDate", value = "结束日期", dataType = "date", format = "date", required = true)
    })
    @GetMapping("/allocation/{id}")
    public ResponseEntity<List<PersonAllocationDTO>> allocation(
            @PathVariable(value = "id") Long id,
            @RequestParam(value = "startDate")
            @DateTimeFormat(pattern = "yyyy-MM-dd") Date startDate,
            @RequestParam(value = "endDate")
            @DateTimeFormat(pattern = "yyyy-MM-dd") Date endDate) {
        List<PersonAllocationDTO> allocationDtoList = personLifecycleInfoService.searchAllocationInfoBy(id, null,
                Objects.nonNull(startDate) ? startDate.toInstant().atZone(ZoneId.systemDefault()).toLocalDate() : null,
                Objects.nonNull(endDate) ? endDate.toInstant().atZone(ZoneId.systemDefault()).toLocalDate() : null);
        if (Objects.nonNull(allocationDtoList)) {
            return new ResponseEntity<>(allocationDtoList, HttpStatus.OK);
        }
        return new ResponseEntity<>(new ArrayList<>(), HttpStatus.NOT_FOUND);
    }

    @ApiOperation(value = "查询员工异动详细信息", notes = "查询员工异动详细信息", response = PersonAllocationDTO.class, responseContainer = "List", httpMethod = "GET")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "from", value = "人员薪酬薪资期间信息", dataType = "PersonAllDTO", required = true)
    })
    @PostMapping("/allocation/list")
    public ResponseEntity<List<PersonAllocationDTO>> allocation(@RequestBody PersonAllFromDTO from) {
        log.info("查询参数:" + from.toString());
        List<PersonAllocationDTO> allocationDtoList = new ArrayList<>();
        HashSet<PersonAllDTO> personAllList = from.getPersonAllList();
        log.info("PersonAllList" + personAllList.toString());
        for (PersonAllDTO dto : personAllList) {
            LocalDate periodStartDate = dto.getPeriodStartDate();
            LocalDate periodEndDate = dto.getPeriodEndDate();
            List<PersonAllocationDTO> list = personLifecycleInfoService.searchAllocationInfoBy(dto.getPersonId(), dto.getPeriodId(),
                    Objects.nonNull(periodStartDate) ? periodStartDate : null,
                    Objects.nonNull(periodEndDate) ? periodEndDate : null);
            allocationDtoList.addAll(list);
        }
        return new ResponseEntity<>(allocationDtoList, HttpStatus.OK);
    }

    @ApiOperation(value = "根据员工编号查询单个人员基本信息", notes = "根据员工编号查询单个人员基本信息", response = PersonInfoDTO.class, httpMethod = "GET")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "X-Business-Group-Id", value = "用户所属业务组编号", paramType = "header", dataType = "long", required = true, defaultValue = "1001"),
            @ApiImplicitParam(name = "employeeNumber", value = "员工编号", dataType = "string", required = true),
            @ApiImplicitParam(name = "date", value = "查询日期,默认:取当前日期", dataType = "date", format = "date"),
    })
    @ApiResponse(code = 200, message = "返回数据成功")
    @GetMapping("/employeeNumber")
    public ResponseEntity<Object> employeeNumber(
            @RequestHeader("X-Business-Group-Id") Long xBusinessGroupId,
            @RequestParam(value = "employeeNumber") String employeeNumber,
            @RequestParam(value = "date", required = false)
            @DateTimeFormat(pattern = "yyyy-MM-dd") Date date) {
        PersonInfoDTO result = personBaseInfoService.selectPersonDtoByEmployeeNumber(xBusinessGroupId, employeeNumber,
                Objects.nonNull(date) ? date.toInstant().atZone(ZoneId.systemDefault()).toLocalDate() : null);
        if (Objects.nonNull(result)) {
            return new ResponseEntity<>(result, HttpStatus.OK);
        } else {
            return new ResponseEntity<>(new PersonInfoDTO(), HttpStatus.OK);
        }
    }

    @ApiOperation(value = "根据cutId查询人员ID信息", notes = "根据cutId查询人员ID信息", response = Long.class, httpMethod = "GET")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "cutId", value = "人员", dataType = "long", required = true)
    })
    @GetMapping("/selectByCutId/{cutId}")
    public ResponseEntity<Long> selectByCutId(@PathVariable(value = "cutId") Long cutId) {
        Long personId = personBaseInfoService.selectByCutId(cutId);
        if (Objects.nonNull(personId)) {
            return new ResponseEntity<>(personId, HttpStatus.OK);
        }
        return new ResponseEntity<>(HttpStatus.NOT_FOUND);
    }

    @ApiOperation(value = "根据参加工作日期及社会工龄调整值(月)计算工龄", notes = "根据参加工作日期及社会工龄调整值(月)计算工龄", response = Integer.class, httpMethod = "GET")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "dateOfWork", value = "参加工作日期", dataType = "date", format = "date"),
            @ApiImplicitParam(name = "dateOfWorkAdj", value = "社会工龄调整值(月)", dataType = "int"),
    })
    @ApiResponse(code = 200, message = "返回数据成功", response = Page.class)
    @GetMapping("/workYear")
    public ResponseEntity<Object> getWorkYear(
            @RequestParam(value = "dateOfWork")
            @DateTimeFormat(pattern = "yyyy-MM-dd") Date dateOfWork,
            @RequestParam(value = "dateOfWorkAdj", defaultValue = "0", required = false) Integer dateOfWorkAdj) {

        LocalDate date = Objects.nonNull(dateOfWork) ? dateOfWork.toInstant().atZone(ZoneId.systemDefault()).toLocalDate() : null;
        Integer workYear = personBaseInfoService.getWorkYear(date, dateOfWorkAdj);
        return new ResponseEntity<>(workYear, HttpStatus.OK);
    }

    @ApiOperation(value = "根据X-Person-Id查询personId", notes = "Id查询personId", response = Integer.class, httpMethod = "GET")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "X-Person-Id", value = "登录人ID", paramType = "header", dataType = "long", required = true)
    })
    @ApiResponse(code = 200, message = "返回数据成功", response = Page.class)
    @GetMapping("/getPersonId")
    public ResponseEntity<Long> getPersonId(@RequestHeader("X-Person-Id") Long xPersonId) {

        return new ResponseEntity<>(personBaseInfoService.getPersonId(xPersonId), HttpStatus.OK);
    }

    @ApiOperation(value = " 根据personId获取人员基本信息", notes = " 根据personId获取人员基本信息", response = PersonBaseInfoDTO.class, httpMethod = "GET")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "ids", value = "人员基本信息ID", dataType = "string", required = true),
    })
    @ApiResponse(code = 200, message = "返回数据成功")
    @GetMapping("/selectByIds")
    public ResponseEntity<Object> selectByIds(@RequestParam(value = "ids") String ids) {
        List<PersonBaseInfoDTO> result = personBaseInfoService.selectByIds(ids);
        if (Objects.nonNull(result)) {
            return new ResponseEntity<>(result, HttpStatus.OK);
        } else {
            return new ResponseEntity<>(new PersonInfoDTO(), HttpStatus.OK);
        }
    }

    @ApiOperation(value = " 根据employeeNumber获取人员基本信息", notes = " 根据personId获取人员基本信息", response = PersonBaseInfoDTO.class, httpMethod = "GET")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "employeeNumbers", value = "员工编号信息ID", dataType = "string", required = true),
    })
    @ApiResponse(code = 200, message = "返回数据成功")
    @GetMapping("/selectByEmployeeNumbers")
    public ResponseEntity<Object> selectByEmployeeNumbers(@RequestParam(value = "employeeNumbers") String employeeNumbers) {
        List<PersonBaseInfoDTO> result = personBaseInfoService.selectByEmployeeNumbers(employeeNumbers);
        if (Objects.nonNull(result)) {
            return new ResponseEntity<>(result, HttpStatus.OK);
        } else {
            return new ResponseEntity<>(new PersonInfoDTO(), HttpStatus.OK);
        }
    }

    @ApiOperation(value = "查询人员基本附加信息", notes = "查询人员基本附加信息", response = HistoryDTO.class, responseContainer = "List", httpMethod = "GET")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "X-Business-Group-Id", value = "用户所属业务组编号", paramType = "header", dataType = "string", required = true, defaultValue = "1001"),
            @ApiImplicitParam(name = "flexStructureCode", value = "结构COde", dataType = "string", required = true),
            @ApiImplicitParam(name = "id", value = "人员ID,新增-1", dataType = "long")
    })
    @ApiResponse(code = 200, message = "返回数据成功", response = Page.class)
    @GetMapping("/attributesInfo/{id}")
    public ResponseEntity<Object> getAttributesInfo(@PathVariable(value = "id") Long id,
                                                    @RequestHeader("X-Business-Group-Id") Long xBusinessGroupId,
                                                    @RequestParam(value = "flexStructureCode", required = false) String flexStructureCode) {
        return new ResponseEntity<>(personBaseInfoService.getAttributesInfo(xBusinessGroupId, flexStructureCode, id), HttpStatus.OK);
    }

    @ApiOperation(value = "导出word", notes = "导出word", response = PersonAnalysesInfoDTO.class, httpMethod = "GET", responseContainer = "LIST")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "X-Business-Group-Id", value = "用户所属业务组编号", paramType = "header", dataType = "long", required = true, defaultValue = "1001"),
            @ApiImplicitParam(name = "personId", value = "员工信息主键", dataType = "long")
    })
    @ApiResponse(code = 200, message = "返回数据成功")
    @GetMapping("/word/export/{personId}")
    public ResponseEntity<Object> getAnalysesInfo(
            @RequestHeader("X-Business-Group-Id") Long xBusinessGroupId,
            @PathVariable(value = "personId") Long personId) {
        return new ResponseEntity<>(personWordExport.export(xBusinessGroupId, personId), HttpStatus.OK);
    }

    @ApiOperation(value = " 查询省市信息集合", notes = " 查询省市信息集合", response = AddressInfoDTO.class, responseContainer = "List", httpMethod = "GET")
    @ApiResponse(code = 200, message = "返回数据成功")
    @GetMapping("/addressInfo/search")
    public ResponseEntity<Object> searchAddressInfo() {
        List<AddressInfoDTO> result = addressInfoService.searchAddressInfo();
        if (Objects.nonNull(result)) {
            return new ResponseEntity<>(result, HttpStatus.OK);
        } else {
            return new ResponseEntity<>(new AddressInfoDTO(), HttpStatus.OK);
        }
    }

    @ApiOperation(value = " 根据市id查询地址信息", notes = " 查询省市信息集合", response = AddressInfo.class, httpMethod = "GET")
    @ApiResponse(code = 200, message = "返回数据成功")
    @GetMapping("/addressInfo/{id}")
    public ResponseEntity<Object> searchAddressById(@PathVariable String id) {
        AddressInfo result = addressInfoService.searchProvinceName(id);
        return new ResponseEntity<>(result, HttpStatus.OK);

    }

    @ApiOperation(value = " 获取一个每个字的首字母大写的拼音", notes = " 获取一个每个字的首字母大写的拼音", response = String.class, responseContainer = "String", httpMethod = "GET")
    @ApiResponse(code = 200, message = "返回数据成功")
    @GetMapping("/pinyinName")
    public ResponseEntity<String> pinyinName(@RequestParam(value = "chineseName") String chineseName) {
        return new ResponseEntity<>(PinyinUtils.pinyinName(chineseName), HttpStatus.OK);
    }

}

好久没有接触过这种写法的项目了,其实刚接触的时候还是不是很适应的,但是这个controller写的还是挺漂亮的

这是所有的方法,

查询

很标准的一个查询,构建一个查询实体,然后去进行放置参数,进行查询,返回带分页的查询,可以通过参数配置是否需要分页。

新增、修改

一般来说会将新增和修改放在同一个接口中

这个时候开始体现框架了。
this.createOrRenew(from, xPersonId, xPersonName, date, personBaseInfo);方法

PersonBaseInfoController 继承了BaseHistoryController,BaseHistoryController继承BaseController

java 复制代码
    /**
     * 创建 or 更新(插入新的)逻辑
     *
     * @param from
     * @param xPersonId
     * @param xPersonName
     * @param date
     * @param t
     * @return
     */
    protected ResponseEntity<Object> createOrRenew(D from, Long xPersonId, String xPersonName, Date date, T t) {
        try {
            if (Objects.isNull(from.getId())) {
                return new ResponseEntity<>(new MessageResponse("Id 不能为空!"), HttpStatus.NOT_FOUND);
            } else if (Objects.equals(from.getId(), NEED_CREATE_ID)) {
                t.setCreateBy(xPersonId);
                t.setCreateByName(xPersonName);
                return this.create(from, t);
            } else if (from.getId() > 0) {
                t.setId(from.getId());
                if (Objects.isNull(date)) {
                    return this.renew(from, t);
                } else {
                    LocalDate localDate = date.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
                    return this.renew(from, t, localDate);
                }
            }
        } catch (ServiceException e) {
            return new ResponseEntity<>(e.getMessageResponse(), HttpStatus.NOT_FOUND);
        }
        return new ResponseEntity<>(new MessageResponse("保存失败!"), HttpStatus.NOT_FOUND);
    }
java 复制代码
    public static final Long NEED_CREATE_ID = -1L;

D from就是传进来的参数,然后判断id,是否是存在不存在就提示报错,如果是新增的话id穿-1,如果是修改的话id就传原本的id,因为如果是修改的话也不会是修改id。
return this.create(from, t);新增,在这里如果是单纯的点击去你就会去点进去

至少在我第一次看的时候确实是没有看到。

正确的是返回具体的实现类PersonBaseInfoController ,去PersonBaseInfoController 类的方法

java 复制代码
    @Override
    protected ResponseEntity<Object> create(PersonInfoDTO from, PersonBaseInfo personBaseInfo) {
        return ResponseEntityUtils.buildCreateResponseEntity(personBaseInfoService.create(from, personBaseInfo));

    }

然后就去了personBaseInfoService.create方法了,具体去实现了新建的方法
return this.renew(from, t);修改,

java 复制代码
    @Override
    protected ResponseEntity<Object> renew(PersonInfoDTO from, PersonBaseInfo personBaseInfo, LocalDate localDate) {
        return ResponseEntityUtils.buildRenewResponseEntity(personBaseInfoService.renew(from, personBaseInfo, localDate));
    }

看到这里其实感觉还是挺简单,但是这些搞了好久,感觉还是挺新奇。

然后是修改的时候框架又出现了挺有趣的地方

java 复制代码
public class PersonBaseInfoService extends HistoryServiceImpl

在PersonBaseInfoService 调用修改的方法renew()的时候,

java 复制代码
    @Transactional(rollbackFor = {RuntimeException.class, Exception.class})
    public int renew(T t, LocalDate date) {
        dataFill(t);
        dataCheck(t);
        // 局部date变量
        LocalDate renewDate = this.getOperatingDate(date);

        T dbRecord = getDbRecord(t, renewDate);
        Wrapper<T> wrapper = getDbRecordWrapper(dbRecord);
        T update = newT(t.getClass());
        update.setUpdateTime(LocalDateTime.now());
        int result = 0;
        // 更新
        if (renewDate.isAfter(dbRecord.getStartDate())) {
            update.setEndDate(renewDate.minusDays(1));
            this.renewUpdateEndDatePostProcessBefore(t, dbRecord, update, renewDate);
            baseMapper.update(update, wrapper);
            T insert = newT(t.getClass());
            BeanCopyUtils.copyProperties(dbRecord, insert);
            BeanCopyUtils.copyProperties(t, insert, PropertiesCopyable.updateIgnoreCopyable());
            insert.setStartDate(renewDate);
            insert.setUpdateTime(LocalDateTime.now());
            // 这里传入的是更新要insert的对象
            this.updatePostProcessBefore(t, dbRecord, insert, renewDate);


            String tableName = this.reflectTableName(t);
            if(Objects.nonNull(tableName)) {
                // SET IDENTITY_INSERT = ON
                dmMapper.setIdentityInsertON(tableName);
                System.out.println(t.toString());
                result = baseMapper.insert(insert);
                // SET IDENTITY_INSERT = OFF
                dmMapper.setIdentityInsertOFF(tableName);
            } else {
                result = baseMapper.insert(insert);
            }
        }
        // 更正
        if (renewDate.isEqual(dbRecord.getStartDate())) {
            BeanCopyUtils.copyProperties(t, update, PropertiesCopyable.updateIgnoreCopyable());
            this.updatePostProcessBefore(t, dbRecord, update, renewDate);
            result = baseMapper.update(update, wrapper);
        }
        this.updatePostProcessAfter(t, dbRecord, update, renewDate, result);
        return result;
    }

这个有啥用呢

这里只要想要实现具体的方法,就在这里重写即可,我觉得这个写法就很优秀,需要什么业务限制,就重写什么。

相关推荐
执卿18 分钟前
使用Hilt重构项目
架构
SimonKing20 分钟前
吊打面试官系列:Spring为什么不推荐使用字段依赖注入?
java·后端·架构
season_zhu1 小时前
Swift:优雅又强大的语法糖——Then库
ios·架构·swift
hstar95272 小时前
二、即时通讯系统设计经验
java·架构
江梦寻3 小时前
MacOS下Homebrew国内镜像加速指南(2025最新国内镜像加速)
开发语言·后端·python·macos·架构·策略模式
打码人的日常分享11 小时前
物联网智慧医院建设方案(PPT)
大数据·物联网·架构·流程图·智慧城市·制造
白水baishui11 小时前
搭建强化推荐的决策服务架构
架构·推荐系统·强化学习·决策服务·服务架构
何双新12 小时前
第23讲、Odoo18 邮件系统整体架构
ai·架构
雪碧聊技术12 小时前
将单体架构项目拆分成微服务时的两种工程结构
微服务·架构·module·project·工程结构
从零开始学习人工智能12 小时前
Doris 数据库深度解析:架构、原理与实战应用
数据库·架构