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

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

雇员

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

@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.mfbz.cn/a/149314.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

软件测试项目案例哪里找?【银行/教育/商城/金融/等等....】

项目一&#xff1a;ShopNC商城 项目概况&#xff1a; ShopNC商城是一个电子商务B2C电商平台系统&#xff0c;功能强大&#xff0c;安全便捷。适合企业及个人快速构建个性化网上商城。 包含PCIOS客户端Adroid客户端微商城&#xff0c;系统PC后台是基于ThinkPHP MVC构架开发的跨…

一个用于操作Excel文件的.NET开源库

推荐一个高性能、跨平台的操作Excel文件的.NET开源库。 01 项目简介 ClosedXML是一个.NET第三方开源库&#xff0c;支持读取、操作和写入Excel 2007 (.xlsx&#xff0c; .xlsm)文件&#xff0c;是基于OpenXML封装的&#xff0c;让开发人员无需了解OpenXML API底层API&#xf…

阿里云今年服务器是真便宜,看看哪些云服务器值得买!

2023年双十一&#xff0c;阿里云推出了一项令人惊喜的独家优惠活动&#xff01;在这次活动中&#xff0c;阿里云开放了老用户购买权限&#xff0c;以超低的价格购买云服务器ECS经济型e实例。这款服务器配置了2核2G内存、3M固定带宽和40G ESSD entry系统盘。而且&#xff0c;更棒…

Playwright测试自动化工具

作者观点&#xff1a;很长时间以来&#xff0c;Selenium是QA工程师寻求测试自动化解决方案的首选测试框架。它能够测试任何浏览器&#xff08;这在IE浏览器的统治时期尤其重要&#xff09;和任何平台。然而&#xff0c;现在看来&#xff0c;那个时代已经过去了。 今天&#xf…

flutter实用笔记

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

IDEA导入jar包

通过maven导入本地包 mvn install:install-file -DfileD:\WebProject\ERP\zhixing-heyue-erp-server\zxhy-service-api\src\main\java\com\zxhy\service\api\invoice\baiwang\lib\com_baiwang_bop_sdk_outer_3_4_393.jar -DgroupIdcom.baiwang -DartifactIdbaiwang.open -Dver…

比较器应用之一_窗口比较器/极限比较器

窗口比较器&#xff1a;用处能在一个&#xff0c;电压落在规定的范围之内&#xff0c;报警或者不报警 当输入电压u1 > URa时&#xff0c;必然大于UaL&#xff0c;所以集成运放A1的输出uo1Uow&#xff0c;A2的输出u02-Uow。使得二极管D1导通&#xff0c;D2截止&#xff0c;电…

接口自动化测试用例编写规范

一、接口自动化测试用例设计方法 1.1接口参数覆盖 接口测试通过输入使用参数组合&#xff0c;获得服务器返回值&#xff0c;并根据预先设定的规则判断是否符合预期值。在接口测试中&#xff0c;根据接口的功能不同&#xff0c;需要侧重检测的方面也不同。主要从以下几个方面考…

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

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

年薪百万的人怎么做好工作复盘和总结

我们在为谁工作&#xff1f; 在大山宏泰《我们为什么工作》一书中有提到过&#xff1a; 70%左右的人认为工作只是维持生计的存在&#xff1b; 20%左右的人认为工作是个人价值的体现&#xff1b; 不到10%的人才会认为工作是幸福的。 人类的终极幸福有四重&#xff1a;被爱&…

PDF自动打印

​ 最近接到用户提过来的需求&#xff0c;需要一个能够自动打印图纸的功能&#xff0c;经过几天的研究整出来个初版了的&#xff0c;分享出来给大家&#xff0c;希望能有帮助。 需求描述: ​ 生产车间现场每天都有大量的图纸需要打印&#xff0c;一个一个打印太慢了&#xff0…

响应系统的作用与实现

首先讨论什么是响应式数据和副作用函数&#xff0c;然后尝试实现一个相对完善的响应系统。在这个过程中&#xff0c;我们会遇到各种各样的问题&#xff0c;例如如何避免无限递归&#xff1f;为什么需要嵌套的副作用函数&#xff1f;两个副作用函数之间会产生哪些影响&#xff1…

Leetcode——岛屿的最大面积

1. 题目链接&#xff1a;695. 岛屿的最大面积 2. 题目描述&#xff1a; 给你一个大小为 m x n 的二进制矩阵 grid 。 岛屿 是由一些相邻的 1 (代表土地) 构成的组合&#xff0c;这里的「相邻」要求两个 1 必须在 水平或者竖直的四个方向上 相邻。你可以假设 grid 的四个边缘都…

23000 个恶意流量代理的 IPStorm 僵尸网络被拆除

美国司法部今天宣布&#xff0c;联邦调查局取缔了名为 IPStorm 的僵尸网络代理服务的网络和基础设施。 IPStorm 使网络犯罪分子能够通过世界各地的 Windows、Linux、Mac 和 Android 设备匿名运行恶意流量。 与此案相关的俄罗斯裔摩尔多瓦籍公民谢尔盖马基宁 (Sergei Makinin)…

VUE基础的一些总结

首先推荐观看VUE官方文档 目录 创建一个 Vue 应用 要创建一个 Vue 应用&#xff0c;你需要按照以下步骤操作&#xff1a; 步骤 1&#xff1a;安装 Node.js 和 npm 确保你的计算机上已经安装了 Node.js。你可以在 Node.js 官网 上下载并安装它。安装完成后&#xff0c;npm&…

Spring中的BeanFactory和ApplicationContext的区别

我用一个例子去测试BeanFactory和ApplicationContext的区别 首先建立一个bean public class User { //声明无参构造&#xff0c;打印一句话&#xff0c;监测对象创建时机public User(){System.out.println("User对象初始化");} } 然后再建立测试类 ublic class User…

接口测试 —— Jmeter 之测试片段的应用

一、什么是测试片段&#xff1f; 控制器上一种特殊的线程组&#xff0c;它与线程组处于一个层级。与线程组不同的就是&#xff1a;测试片段不会执行。它是一个模块控制器或者被控制器应用时才会被执行。通常与Include Controller或模块控制器一起使用。 1.1 那它有啥作用&…

数据库进阶教学——索引

目录 一、索引概述 1、介绍 2、演示 3、优缺点 二、索引结构 1、B树 2、Hash 三、索引分类 四、索引语法 1、语法 2、示例 五、SQL性能分析 1、SQL执行频率 2、慢查询日志 3、profile详情 4、explain执行计划 六、索引使用 七、索引设计原则 一、索引概述 …

【文件包含】metinfo 5.0.4 文件包含漏洞复现

1.1漏洞描述 漏洞编号————漏洞类型文件包含漏洞等级⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐漏洞环境windows攻击方式 MetInfo 是一套使用PHP 和MySQL 开发的内容管理系统。MetInfo 5.0.4 版本中的 /metinfo_5.0.4/about/index.php?fmodule文件存在任意文件包含漏洞。攻击者可利用漏洞读取网…

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

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