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

news2024/11/25 4:31:01

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

雇员

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

@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

    /**
     * 创建 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);
    }
    public static final Long NEED_CREATE_ID = -1L;

D from就是传进来的参数,然后判断id,是否是存在不存在就提示报错,如果是新增的话id穿-1,如果是修改的话id就传原本的id,因为如果是修改的话也不会是修改id。
return this.create(from, t);新增,在这里如果是单纯的点击去你就会去点进去
在这里插入图片描述
至少在我第一次看的时候确实是没有看到。
正确的是返回具体的实现类PersonBaseInfoController ,去PersonBaseInfoController 类的方法

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

    }

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

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

看到这里其实感觉还是挺简单,但是这些搞了好久,感觉还是挺新奇。
然后是修改的时候框架又出现了挺有趣的地方

public class PersonBaseInfoService extends HistoryServiceImpl

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

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

这个有啥用呢
在这里插入图片描述
这里只要想要实现具体的方法,就在这里重写即可,我觉得这个写法就很优秀,需要什么业务限制,就重写什么。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1212275.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Django(六、模板层)

文章目录 模板传值模板语法传值特性 模板语法之过滤器常用的过滤器模板层之标签模板中的标签的格式为标签之if判断 标签之for循环模板的继承与导入模板导入导入格式 模板传值 """ 模板层三种语法 {{}}:主要与数据值相关 {%%}:主要与逻辑相关 {##}&#xff1a;模…

解锁数据潜力:为什么你应该考虑使用向量数据库

文章目录 前言什么是向量和向量数据库使用示例Amazon OpenSearch Serverless向量引擎总结 前言 根据DC调查数据显示&#xff0c;全球在A1技术和服务上的支出2023年将达到1540亿美元&#xff0c;到2026年将超过3000亿美元。其中&#xff0c;向量数据库为AI的开发、增强内容生成…

力扣203:移除链表元素

力扣203&#xff1a;移除链表元素 题目描述&#xff1a; 给你一个链表的头节点 head 和一个整数 val &#xff0c;请你删除链表中所有满足 Node.val val 的节点&#xff0c;并返回 新的头节点 。 示例 1&#xff1a; 输入&#xff1a;head [1,2,6,3,4,5,6], val 6 输出&a…

(Matalb回归预测)GWO-BP灰狼算法优化BP神经网络的多维回归预测

目录 一、程序及算法内容介绍&#xff1a; 基本内容&#xff1a; 亮点与优势&#xff1a; 二、实际运行效果&#xff1a; 三、部分代码&#xff1a; 四、完整程序数据使用说明下载&#xff1a; 一、程序及算法内容介绍&#xff1a; 基本内容&#xff1a; 本代码基于Mata…

keepalived安装配置(服务器主备、负载均衡)

系统拓扑 安装keepalived 主备服务器上都需要安装 在线安装 yum install -y keepalived 离线安装 # todo 服务器准备 虚拟机ip&#xff1a;192.168.11.56 主服务器&#xff1a;192.168.11.53 备服务器&#xff1a;192.168.11.54 配置文件修改 keepalived安装之后&…

算法刷题:P1908 逆序对

解题关键&#xff1a;就是利用分治的思想&#xff0c;使用归并排序&#xff0c;因为逆序对实际上就是“左侧的数字比右侧大就算一个逆序对”。而这个“左侧”和“右侧”可以相对来看&#xff0c;即左侧的左侧一定就是左侧&#xff0c;说的有点抽象&#xff0c;哈哈哈哈。 花了…

excel在函数中插入函数

例如&#xff0c;要计算RAND()1的值&#xff0c;其中RAND()表示取0~1之间的随机数。 插入-》函数&#xff1a; 选SUM函数&#xff1a; 点击“继续”&#xff1a; 将光标先放在数字1中的输入框中&#xff0c;然后在左边过滤出RAND函数&#xff0c;并且点击继续&#xff1…

技巧篇:Mac 环境PyCharm 配置 python Anaconda

Mac 中 PyCharm 配置 python Anaconda环境 在 python 开发中我们最常用的IDE就是PyCharm&#xff0c;有关PyCharm的优点这里就不在赘述。在项目开发中我们经常用到许多第三方库&#xff0c;用的最多的命令就是pip install 第三方库名 进行安装。现在你可以使用一个工具来帮你解…

Java实现自定义windows右键菜单

要添加Java应用程序到Windows桌面的右键菜单&#xff0c;可以按照以下步骤操作&#xff1a; 创建一个新的.reg文件&#xff0c;并在文本编辑器中打开它。 添加以下代码到.reg文件中&#xff0c;将名称和路径替换为您的Java应用程序的名称和路径。 Windows Registry Editor V…

解决requests库的urllib3版本冲突问题

每个加班的夜晚&#xff0c;都是我和bug的较量。当我坐在电脑前&#xff0c;灯光昏暗&#xff0c;空气凝固&#xff0c;只有键盘敲击的声音回荡在空旷的办公室中。我渐渐地陷入了与无数个请求的斗争中。这些请求来自各种各样的客户端&#xff0c;充满了各种各样的需求。每个请求…

业务连续性:确保稳健运营的关键战略

在今天的快节奏商业环境中&#xff0c;保障业务连续性是企业成功的重要保障。业务连续性不仅仅是关于应对自然灾害或技术故障&#xff0c;更是一项战略&#xff0c;涉及组织的整体准备、规划和应对能力&#xff0c;以确保在各种情况下业务的稳健运营。 一、业务连续性的定义 业…

Python爬取股票交易数据代码示例及可视化展示。

文章目录 前言一、开发环境二、第三方模块三、爬虫案例步骤四、爬虫程序全部代码1.分析网页2.导入模块3.请求数据4.解析数据5.翻页6.保存数据 五、实现效果六、数据可视化全部代码1.导入数据2.读取数据3.可视化图表4.效果展示关于Python技术储备一、Python所有方向的学习路线二…

分享篇:我用数据分析做副业

主业是数据分析专家&#xff0c;副业是数据咨询顾问&#xff0c;过去十年里面利用数据分析发家致富 人生苦短&#xff0c;我学Python&#xff01; 利用技能可以解决的问题&#xff0c;哪些场景下可以催生出需求&#xff0c;深度剖析数据分析的技能树 由浅入深&#xff0c;一个…

098001190、098002190、098101190、098102190比例线圈放大器

0343100001、0344100101、0523100150、0353450101、035303001、0354050101、0473200050、0052010100、0063030100、0172200410、0363150101、0364100601、1027001020、1044112011、1043112010、1128022100、098001190、098002190、098101190、098102190、098201190、098202190、…

2023年【N1叉车司机】找解析及N1叉车司机复审模拟考试

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2023年N1叉车司机找解析为正在备考N1叉车司机操作证的学员准备的理论考试专题&#xff0c;每个月更新的N1叉车司机复审模拟考试祝您顺利通过N1叉车司机考试。 1、【多选题】《中华人民共和国特种设备安全法》第八十三…

flutter实用笔记

前言 写下这一篇文章是为了记录这段时间使用flutter 制作项目中一些比较常用的组件&#xff0c;以及具体怎么使用&#xff0c;获得怎样的效果。我使用的貌似是flutter4。由于官方更新迭代的差别比较明显&#xff0c;可能之后许多内容对应最新的flutter不适用&#xff0c;在此只…

三菱FX3U系列—小项目

目录 一、项目描述 二、IO口分配 三、运动功能图 四、项目程序 五、总结 一、项目描述 有些工作台&#xff0c;在工作台身上安装4个行程开关SQ1~SQ4&#xff0c;其中&#xff0c;SQ1、SQ2用来自动换向&#xff0c;当工作台运动到换向位置时&#xff0c;挡铁撞击行程开关&a…

NI USRP RIO软件无线电

NI USRP RIO软件无线电 NI USRP RIO是SDR游戏规则的改变者&#xff0c;它为无线通信设计人员提供了经济实惠的SDR和前所不高的性能&#xff0c;可帮助开发下一代5G无线通信系统。“USRP RIO”是一个术语&#xff0c;用于描述包含FPGA的USRP软件定义无线电设备&#xff0c;例如…

注塑机机械都用哪些传动配件?

注塑机的主要作用是利用塑料成型模具制成各种形状的塑料制品&#xff0c;能够加热塑料&#xff0c;对熔融塑料施加高压&#xff0c;使其射出而充满模具型腔&#xff0c;具备高精度、高效率、高可靠性的特点。注塑机使用的传动配件包括许多种类&#xff0c;以下是一些主要的配件…

【luckfox】3、计算重量差

前言 本章结合之前的hx711驱动&#xff0c;实现读取质量&#xff0c;记录时间及剩余质量并存入csv文件&#xff0c;计算质量差并总计。 代码 luckfox-pico\project\app\test_app\hx711\hx711_app_addtime.c #include <stdio.h> #include <stdlib.h> #include &…