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

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

雇员

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

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;
    }

这个有啥用呢

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

相关推荐
小屁不止是运维4 分钟前
麒麟操作系统服务架构保姆级教程(五)NGINX中间件详解
linux·运维·服务器·nginx·中间件·架构
程序猿进阶1 小时前
深入解析 Spring WebFlux:原理与应用
java·开发语言·后端·spring·面试·架构·springboot
Hacker_Fuchen1 小时前
天融信网络架构安全实践
网络·安全·架构
ProtonBase1 小时前
如何从 0 到 1 ,打造全新一代分布式数据架构
java·网络·数据库·数据仓库·分布式·云原生·架构
工业甲酰苯胺10 小时前
分布式系统架构:服务容错
数据库·架构
Java程序之猿12 小时前
微服务分布式(一、项目初始化)
分布式·微服务·架构
小蜗牛慢慢爬行14 小时前
Hibernate、JPA、Spring DATA JPA、Hibernate 代理和架构
java·架构·hibernate
思忖小下16 小时前
梳理你的思路(从OOP到架构设计)_简介设计模式
设计模式·架构·eit
一个儒雅随和的男子1 天前
微服务详细教程之nacos和sentinel实战
微服务·架构·sentinel