This commit is contained in:
ran.shang
2025-06-11 09:42:13 +08:00
commit 7e38b8d971
1935 changed files with 132836 additions and 0 deletions

View File

@@ -0,0 +1,37 @@
package com.newyetai.recruit.position.constant;
/**
* 职位类型常量
*
* @author Carlye
* @date 2022/01/24
*/
public interface PositionConstants {
String POSITION_TYPE_CACHE = "ptc";
/**
* 工作性质 0:不限 1:兼职 2:全职
*/
Integer JOB_CATEGORY_ALL = 0;
Integer JOB_CATEGORY_PART = 1;
/**
* 工作性质完全
*/
Integer JOB_CATEGORY_FULL = 2;
/**
* 结算类型 1日结 2周结 3月结 4完工结
*/
Integer SETTLEMENT_TYPE_DAY = 1;
Integer SETTLEMENT_TYPE_WEEK = 2;
Integer SETTLEMENT_TYPE_MONTH = 3;
Integer SETTLEMENT_TYPE_END = 4;
/**
* 岗位文件类型 1:图片 2:视频
*/
String POSITION_FILE_TYPE_IMG = "1";
String POSITION_FILE_TYPE_VIDEO = "2";
}

View File

@@ -0,0 +1,70 @@
package com.newyetai.recruit.position.controller;
import com.newyetai.common.AlitaResult;
import com.newyetai.recruit.position.dto.PositionFileDTO;
import com.newyetai.recruit.position.dto.PositionFilePageQueryDTO;
import com.newyetai.recruit.position.entity.PositionFile;
import com.newyetai.recruit.position.service.PositionFileService;
import com.newyetai.tkmybatis.pojo.Page;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.RequiredArgsConstructor;
@Api(tags = "岗位附件")
@RestController
@RequestMapping("/position/file")
@RequiredArgsConstructor(onConstructor = @__(@Autowired))
public class HrPositionFileController {
private final PositionFileService positionFileService;
@GetMapping("/page")
@ApiOperation("分页查询岗位文件")
public AlitaResult<Page<PositionFileDTO>> filePage(PositionFilePageQueryDTO queryDTO) {
positionFileService.filePage(queryDTO);
return AlitaResult.success(queryDTO.getPageResult());
}
@PostMapping("/create")
@ApiOperation("创建岗位文件信息")
public AlitaResult<PositionFile> create(@RequestBody PositionFileDTO queryDTO) {
return AlitaResult.success(positionFileService.create(queryDTO));
}
@PostMapping("/update")
@ApiOperation("修改岗位文件信息")
public AlitaResult<Void> update(@RequestBody PositionFileDTO queryDTO) {
positionFileService.update(queryDTO);
return AlitaResult.success();
}
@DeleteMapping("/delete/{id}")
@ApiOperation("根据文件Id删除企业文件信息")
public AlitaResult<Void> delete(@PathVariable("id") Long id) {
positionFileService.delete(id);
return AlitaResult.success();
}
@PutMapping("/setDefault/{id}")
@ApiOperation("设置为默认")
public AlitaResult<Void> setDefault(@PathVariable("id") Long id) {
positionFileService.setDefault(id);
return AlitaResult.success();
}
}

View File

@@ -0,0 +1,66 @@
package com.newyetai.recruit.position.controller;
import com.newyetai.common.AlitaResult;
import com.newyetai.recruit.position.dto.PositionAddressDTO;
import com.newyetai.recruit.position.dto.PositionAddressOperatorDTO;
import com.newyetai.recruit.position.dto.PositionAddressQueryDTO;
import com.newyetai.recruit.position.service.PositionAddressService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.RequiredArgsConstructor;
/**
* <p>
* 招聘系统-岗位地址信息表 前端控制器
* </p>
*
* @author chenyun
* @since 2021-01-08
*/
@Api(tags = "岗位地址信息")
@RestController
@RequestMapping("/hr/position/address")
@RequiredArgsConstructor(onConstructor = @__(@Autowired))
public class PositionAddressController {
private final PositionAddressService positionAddressService;
@PostMapping("/create")
@ApiOperation("新增岗位地址")
public AlitaResult<Long> create(@RequestBody PositionAddressOperatorDTO queryDTO) {
return AlitaResult.success(positionAddressService.createOrUpdate(queryDTO));
}
@PostMapping("/update")
@ApiOperation("修改岗位地址")
public AlitaResult<Long> update(@RequestBody PositionAddressOperatorDTO queryDTO) {
return AlitaResult.success(positionAddressService.createOrUpdate(queryDTO));
}
@GetMapping("/list")
@ApiOperation("岗位地址列表")
public AlitaResult<List<PositionAddressDTO>> positionList(PositionAddressQueryDTO queryDTO) {
return AlitaResult.success(positionAddressService.list(queryDTO));
}
@ApiOperation("删除岗位地址")
@DeleteMapping("/delete/{id}")
public AlitaResult<Void> delete(@PathVariable("id") Long id) {
positionAddressService.delete(id);
return AlitaResult.success();
}
}

View File

@@ -0,0 +1,110 @@
package com.newyetai.recruit.position.controller;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import com.newyetai.common.AlitaResult;
import com.newyetai.tkmybatis.pojo.Page;
import com.newyetai.recruit.position.dto.*;
import com.newyetai.recruit.position.service.PositionAuditService;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import org.springframework.beans.factory.annotation.Autowired;
import java.util.List;
import java.util.Set;
/**
* 岗位审核表
*
* @author guixinman
* @since 1.0.0 2024-07-05
*/
@Api(tags = "岗位审核表")
@RestController
@RequestMapping("/position/audit")
public class PositionAuditController {
@Autowired
private PositionAuditService positionAuditService;
@PostMapping("/position_create")
@ApiOperation("岗位审核表-创建")
public AlitaResult<PositionNewDTO> positionCreate(@RequestBody @Validated PositionNewOperatorDTO operatorDTO) {
return AlitaResult.success(positionAuditService.positionCreate(operatorDTO));
}
@PutMapping("/position_modify")
@ApiOperation("岗位审核表-修改")
public AlitaResult<Void> positionModify(@RequestBody @Validated PositionNewOperatorDTO operatorDTO) {
positionAuditService.positionModify(operatorDTO);
return AlitaResult.success();
}
@GetMapping("/position_find/{id}")
@ApiOperation("岗位审核表-查询单个")
public AlitaResult<PositionNewDTO> positionFindById(@PathVariable("id") Long id) {
return AlitaResult.success(positionAuditService.positionFindById(id));
}
/**
* @description: PC端 岗位列表分页查询
* @return:
* @author: guixinman
* @param:
*/
@GetMapping("/position_page")
@ApiOperation("岗位-分页查询")
public AlitaResult<Page<PositionNewDTO>> positionPage(PositionNewPageQueryDTO queryDTO) {
positionAuditService.positionPage(queryDTO);
return AlitaResult.success(queryDTO.getPageResult());
}
@GetMapping("/position_export")
@ApiOperation("岗位信息表-导出")
public void positionExport(PositionNewPageQueryDTO queryDTO) {
positionAuditService.export(queryDTO);
}
@PutMapping("/position_modify_status")
@ApiOperation("岗位信息表开启或者关闭招聘")
public AlitaResult<Void> positionModifyStatus(@RequestParam("ids") Set<Long> ids, @RequestParam("status") String status) {
positionAuditService.positionModifyStatus(ids, status);
return AlitaResult.success();
}
/**
* 复制
*/
@GetMapping("/position_copy/{id}")
public AlitaResult<Long> positionCopy(@PathVariable("id") Long id){
return AlitaResult.success(positionAuditService.positionCopy(id));
}
@GetMapping("list")
@ApiOperation("岗位审核表-列表查询")
public AlitaResult<List<PositionAuditDTO>> list(PositionAuditQueryDTO queryDTO) {
return AlitaResult.success(positionAuditService.list(queryDTO));
}
@GetMapping("/page")
@ApiOperation("岗位审核表-分页查询")
public AlitaResult<Page<PositionAuditDTO>> page(PositionAuditPageQueryDTO queryDTO) {
positionAuditService.page(queryDTO);
return AlitaResult.success(queryDTO.getPageResult());
}
@GetMapping("/{id}")
@ApiOperation("岗位审核信息表-查询单个")
public AlitaResult<PositionAuditDTO> findById(@PathVariable("id") Long id) {
return AlitaResult.success(positionAuditService.findById(id));
}
@PostMapping("")
@ApiOperation("审核")
public AlitaResult<Void> audit(@RequestBody @Validated PositionAuditReqDTO reqDTO) {
positionAuditService.audit(reqDTO);
return AlitaResult.success();
}
}

View File

@@ -0,0 +1,94 @@
package com.newyetai.recruit.position.controller;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import com.newyetai.common.AlitaResult;
import com.newyetai.tkmybatis.pojo.Page;
import com.newyetai.recruit.position.dto.*;
import com.newyetai.recruit.position.service.PositionService;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import org.springframework.beans.factory.annotation.Autowired;
import java.util.List;
/**
* 岗位信息表;岗位信息表
*
* @author guixinman
* @since 1.0.0 2024-04-11
*/
@Api(tags = "岗位信息表;岗位信息表")
@RestController
@RequestMapping("/position")
public class PositionController {
@Autowired
private PositionService positionService;
@PostMapping("/create")
@ApiOperation("岗位信息表;岗位信息表-创建")
public AlitaResult<PositionDTO> create(@RequestBody @Validated PositionOperatorDTO operatorDTO) {
return AlitaResult.success(positionService.create(operatorDTO));
}
@PutMapping("/modify")
@ApiOperation("岗位信息表;岗位信息表-修改")
public AlitaResult<PositionDTO> modify(@RequestBody @Validated PositionOperatorDTO operatorDTO) {
return AlitaResult.success(positionService.modify(operatorDTO));
}
@DeleteMapping("/{id}")
@ApiOperation("岗位信息表;岗位信息表-删除")
public AlitaResult<PositionDTO> delete(@PathVariable("id") Long id) {
return AlitaResult.success(positionService.delete(id));
}
@GetMapping("/{id}")
@ApiOperation("岗位信息表;岗位信息表-查询单个")
public AlitaResult<PositionDTO> findById(@PathVariable("id") Long id) {
return AlitaResult.success(positionService.findById(id));
}
@GetMapping("/list")
@ApiOperation("岗位信息表;岗位信息表-列表查询")
public AlitaResult<List<PositionDTO>> list(PositionPageQueryDTO queryDTO) {
return AlitaResult.success(positionService.list(queryDTO));
}
@GetMapping("/page")
@ApiOperation("岗位信息表;岗位信息表-分页查询")
public AlitaResult<Page<PositionDTO>> page(PositionPageQueryDTO queryDTO) {
positionService.page(queryDTO);
return AlitaResult.success(queryDTO.getPageResult());
}
@GetMapping("/export")
@ApiOperation("岗位信息表;岗位信息表-导出")
public void export(PositionPageQueryDTO queryDTO) {
positionService.export(queryDTO);
}
@PutMapping("/modify_status")
@ApiOperation("岗位信息表开启或者关闭招聘")
public AlitaResult<Void> modifyStatus(@RequestBody PositionOperatorDTO dto){
positionService.modifyStatus(dto);
return AlitaResult.success();
}
@GetMapping("/template")
@ApiOperation("岗位 - 模板下载")
public void template() {
positionService.template();
}
/**
* 复制
*/
@GetMapping("/copy/{id}")
public AlitaResult<Long> copy(@PathVariable("id") Long id){
return AlitaResult.success(positionService.copy(id));
}
}

View File

@@ -0,0 +1,194 @@
package com.newyetai.recruit.position.controller;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import com.newyetai.common.AlitaResult;
import com.newyetai.common.exception.BusinessException;
import com.newyetai.tkmybatis.pojo.Page;
import com.newyetai.recruit.position.dto.*;
import com.newyetai.recruit.position.service.PositionRegistrationService;
import org.apache.commons.collections4.CollectionUtils;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import org.springframework.beans.factory.annotation.Autowired;
import java.util.List;
/**
* 岗位报名信息表
*
* @author guixinman
* @since 1.0.0 2024-04-15
*/
@Api(tags = "岗位报名信息表")
@RestController
@RequestMapping("/position_registration")
@Slf4j
public class PositionRegistrationController {
@Autowired
private PositionRegistrationService positionRegistrationService;
@PostMapping("/create")
@ApiOperation("岗位报名信息表-创建")
public AlitaResult<String> create(@RequestBody @Validated PositionRegistrationOperatorDTO operatorDTO) {
if (CollectionUtils.isEmpty(operatorDTO.getUserIds())) {
throw new BusinessException("缺失参数");
}
int successrows = operatorDTO.getUserIds().size();
for (Long userId : operatorDTO.getUserIds()) {
try {
operatorDTO.setUserId(userId);
positionRegistrationService.create(operatorDTO);
} catch (Exception e) {
successrows = successrows - 1;
log.error(String.format("用户id:%s 操作加入招聘失败,失败原因:%s",userId,e.getMessage()));
}
}
return AlitaResult.success(String.format("成功数: %s条,失败数: %s条", successrows, operatorDTO.getUserIds().size() - successrows));
}
@PutMapping("/modify")
@ApiOperation("岗位报名信息表-修改")
public AlitaResult<PositionRegistrationDTO> modify(@RequestBody PositionRegistrationOperatorDTO operatorDTO) {
return AlitaResult.success(positionRegistrationService.modify(operatorDTO));
}
@DeleteMapping("/{id}")
@ApiOperation("岗位报名信息表-删除")
public AlitaResult<PositionRegistrationDTO> delete(@PathVariable("id") Long id) {
return AlitaResult.success(positionRegistrationService.delete(id));
}
@GetMapping("/{id}")
@ApiOperation("岗位报名信息表-查询单个")
public AlitaResult<PositionRegistrationDTO> findById(@PathVariable("id") Long id, @RequestParam("childrenOrgAll") Boolean childrenOrgAll) {
return AlitaResult.success(positionRegistrationService.findByIdAndChildrenOrgAll(id,childrenOrgAll));
}
@GetMapping("/list")
@ApiOperation("岗位报名信息表-列表查询")
public AlitaResult<List<PositionRegistrationDTO>> list(PositionRegistrationPageQueryDTO queryDTO) {
return AlitaResult.success(positionRegistrationService.list(queryDTO));
}
@GetMapping("/page")
@ApiOperation("岗位报名信息表-分页查询")
public AlitaResult<Page<PositionRegistrationDTO>> page(PositionRegistrationPageQueryDTO queryDTO) {
positionRegistrationService.page(queryDTO);
return AlitaResult.success(queryDTO.getPageResult());
}
/**
* @description: 用户端报名岗位
* @return:
* @author: guixinman
* @param:
*/
@PostMapping("/user_create")
public AlitaResult<Void> userCreate(@RequestBody @Validated UserPositionRegistrationDTO dto) {
positionRegistrationService.userCreate(dto);
return AlitaResult.success();
}
@PostMapping("/invite")
@ApiOperation("岗位报名信息表-邀约面试")
public AlitaResult<String> invite(@RequestBody PositionRegistrationOperatorDTO operatorDTO) {
if (CollectionUtils.isEmpty(operatorDTO.getIds())) {
throw new BusinessException("缺失参数");
}
int successrows = operatorDTO.getIds().size();
for (Long id : operatorDTO.getIds()) {
try {
operatorDTO.setId(id);
positionRegistrationService.invite(operatorDTO);
} catch (Exception e) {
successrows = successrows - 1;
log.error(String.format("邀约面试id:%s 操作邀约面试,失败原因:%s",id,e.getMessage()));
}
}
return AlitaResult.success(String.format("成功数: %s条,失败数: %s条", successrows, operatorDTO.getIds().size() - successrows));
}
@PostMapping("/termination")
@ApiOperation("岗位报名信息表-结束招聘")
public AlitaResult<String> termination(@RequestBody PositionRegistrationOperatorDTO operatorDTO) {
if (CollectionUtils.isEmpty(operatorDTO.getIds())) {
throw new BusinessException("缺失参数");
}
int successrows = operatorDTO.getIds().size();
for (Long id : operatorDTO.getIds()) {
try {
operatorDTO.setId(id);
positionRegistrationService.termination(operatorDTO);
} catch (Exception e) {
successrows = successrows - 1;
log.error(String.format("结束招聘id:%s 操作结束招聘,失败原因:%s",id,e.getMessage()));
}
}
return AlitaResult.success(String.format("成功数: %s条,失败数: %s条", successrows, operatorDTO.getIds().size() - successrows));
}
@PostMapping("/fulfillInterview")
@ApiOperation("岗位报名信息表-完成面试")
public AlitaResult<String> fulfillInterview(@RequestBody PositionRegistrationOperatorDTO operatorDTO) {
if (CollectionUtils.isEmpty(operatorDTO.getIds())) {
throw new BusinessException("缺失参数");
}
int successrows = operatorDTO.getIds().size();
for (Long id : operatorDTO.getIds()) {
try {
operatorDTO.setId(id);
positionRegistrationService.fulfillInterview(operatorDTO);
} catch (Exception e) {
successrows = successrows - 1;
log.error(String.format("完成面试id:%s 操作完成面试,失败原因:%s",id,e.getMessage()));
}
}
return AlitaResult.success(String.format("成功数: %s条,失败数: %s条", successrows, operatorDTO.getIds().size() - successrows));
}
@PostMapping("/onTheJob")
@ApiOperation("岗位报名信息表-入职")
public AlitaResult<Void> onTheJob(@RequestBody @Validated OnTheJobDTO dto) {
positionRegistrationService.onTheJob(dto);
return AlitaResult.success();
}
@PostMapping("/resigned")
@ApiOperation("岗位报名信息表-离职")
public AlitaResult<Void> resigned(@RequestBody @Validated ResignedDTO dto) {
positionRegistrationService.resigned(dto);
return AlitaResult.success();
}
@GetMapping("/export")
@ApiOperation("岗位报名信息表-导出")
public void export(PositionRegistrationPageQueryDTO queryDTO) {
positionRegistrationService.export(queryDTO);
}
@GetMapping("/userPage")
@ApiOperation("岗位报名信息表-用户端分页查询")
public AlitaResult<Page<UserPositionRegistrationResDTO>> userPage(UserPositionRegistrationPageQueryDTO queryDTO) {
positionRegistrationService.userPage(queryDTO);
return AlitaResult.success(queryDTO.getPageResult());
}
@GetMapping("/user_cancel")
@ApiOperation("岗位报名信息表-用户端取消报名")
public AlitaResult<Void> cancel(@RequestParam("positionId") Long positionId) {
positionRegistrationService.cancel(positionId);
return AlitaResult.success();
}
@ApiOperation("查看")
@PutMapping("/show")
public AlitaResult<Void> show(@RequestParam("id") Long id){
positionRegistrationService.show(id);
return AlitaResult.success();
}
}

View File

@@ -0,0 +1,42 @@
package com.newyetai.recruit.position.controller;
import com.newyetai.common.AlitaResult;
import com.newyetai.recruit.position.dto.PositionTypeDTO;
import com.newyetai.recruit.position.dto.PositionTypeQueryDTO;
import com.newyetai.recruit.position.service.PositionTypeService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.RequiredArgsConstructor;
/**
* <p>
* 招聘系统-岗位信息表 前端控制器
* </p>
*
* @author chenyun
* @since 2021-01-08
*/
@Api(tags = "岗位类型信息")
@RestController
@RequestMapping("/anon/hr/position/type")
@RequiredArgsConstructor(onConstructor = @__(@Autowired))
public class PositionTypeController {
private final PositionTypeService positionTypeService;
@GetMapping("/tree")
@ApiOperation("岗位类型树形列表")
public AlitaResult<List<PositionTypeDTO>> positionList(PositionTypeQueryDTO queryDTO) {
return AlitaResult.success(positionTypeService.query(queryDTO));
}
}

View File

@@ -0,0 +1,60 @@
package com.newyetai.recruit.position.controller;
import com.newyetai.common.AlitaResult;
import com.newyetai.recruit.position.dto.PositionDTO;
import com.newyetai.recruit.position.dto.PositionPageQueryDTO;
import com.newyetai.recruit.position.service.PositionService;
import com.newyetai.security.util.MockUtils;
import com.newyetai.tkmybatis.pojo.Page;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
import java.util.Set;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
/**
* @description: 用户端岗位信息查询
* @author: guixinman
* @create: 2024-04-18 15:48
**/
@Api(tags = "岗位信息表;岗位信息表")
@RestController
public class UserPositionController {
@Autowired
private PositionService positionService;
@GetMapping("/anon/user/position/page")
@ApiOperation("岗位信息表;岗位信息表-分页查询")
public AlitaResult<Page<PositionDTO>> page(PositionPageQueryDTO queryDTO) {
positionService.userPage(queryDTO);
return AlitaResult.success(queryDTO.getPageResult());
}
@GetMapping("/anon/tencent_map/user/position/page")
@ApiOperation("岗位信息腾讯地图-分页查询")
public AlitaResult<List<PositionDTO>> tencentMapUserPage(PositionPageQueryDTO queryDTO) {
return AlitaResult.success(positionService.tencentMapUserPage(queryDTO));
}
@GetMapping("/anon/user/position/{id}")
@ApiOperation("岗位信息表;岗位信息表-查询单个")
public AlitaResult<PositionDTO> userFindById(@PathVariable("id") Long id) {
return AlitaResult.success(positionService.userFindById(id));
}
@GetMapping("/user/position/personPostMatching")
@ApiOperation("人岗匹配")
public AlitaResult<List<PositionDTO>> personPostMatching(@RequestParam("id") Long id) {
return AlitaResult.success(positionService.personPostMatching(id));
}
}

View File

@@ -0,0 +1,26 @@
package com.newyetai.recruit.position.convert;
import com.newyetai.recruit.position.entity.ImportDetailPosition;
import com.newyetai.recruit.position.dto.ImportDetailPositionDTO;
import com.newyetai.recruit.position.dto.ImportDetailPositionOperatorDTO;
import org.mapstruct.Mapper;
import org.mapstruct.factory.Mappers;
/**
* 岗位导入
*
* @author guixinman
* @since 1.0.0 2024-04-12
*/
@Mapper
public interface ImportDetailPositionConvert {
ImportDetailPositionConvert INSTANCE = Mappers.getMapper(ImportDetailPositionConvert.class);
ImportDetailPosition convert(ImportDetailPositionDTO dto);
ImportDetailPositionDTO convert(ImportDetailPosition entity);
ImportDetailPosition convert(ImportDetailPositionOperatorDTO dto);
}

View File

@@ -0,0 +1,35 @@
package com.newyetai.recruit.position.convert;
import com.newyetai.recruit.position.dto.PositionDTO;
import com.newyetai.recruit.position.dto.PositionNewDTO;
import com.newyetai.recruit.position.dto.PositionOperatorDTO;
import com.newyetai.recruit.position.entity.PositionAudit;
import com.newyetai.recruit.position.dto.PositionAuditDTO;
import com.newyetai.recruit.position.dto.PositionAuditOperatorDTO;
import org.mapstruct.Mapper;
import org.mapstruct.factory.Mappers;
import java.util.List;
/**
* 岗位审核表
*
* @author guixinman
* @since 1.0.0 2024-07-05
*/
@Mapper
public interface PositionAuditConvert {
PositionAuditConvert INSTANCE = Mappers.getMapper(PositionAuditConvert.class);
PositionAudit convert(PositionAuditDTO dto);
PositionAuditDTO convert(PositionAudit entity);
PositionAudit convert(PositionAuditOperatorDTO dto);
PositionNewDTO convert(PositionOperatorDTO dto);
PositionNewDTO convert(PositionDTO dto);
}

View File

@@ -0,0 +1,26 @@
package com.newyetai.recruit.position.convert;
import com.newyetai.recruit.position.entity.Position;
import com.newyetai.recruit.position.dto.PositionDTO;
import com.newyetai.recruit.position.dto.PositionOperatorDTO;
import org.mapstruct.Mapper;
import org.mapstruct.factory.Mappers;
/**
* 岗位信息表;岗位信息表
*
* @author guixinman
* @since 1.0.0 2024-04-11
*/
@Mapper
public interface PositionConvert {
PositionConvert INSTANCE = Mappers.getMapper(PositionConvert.class);
Position convert(PositionDTO dto);
PositionDTO convert(Position entity);
Position convert(PositionOperatorDTO dto);
}

View File

@@ -0,0 +1,27 @@
package com.newyetai.recruit.position.convert;
import com.newyetai.recruit.position.entity.PositionRegistration;
import com.newyetai.recruit.position.dto.PositionRegistrationDTO;
import com.newyetai.recruit.position.dto.PositionRegistrationOperatorDTO;
import org.mapstruct.Mapper;
import org.mapstruct.factory.Mappers;
/**
* 岗位报名信息表
*
* @author guixinman
* @since 1.0.0 2024-04-15
*/
@Mapper
public interface PositionRegistrationConvert {
PositionRegistrationConvert INSTANCE = Mappers.getMapper(PositionRegistrationConvert.class);
PositionRegistration convert(PositionRegistrationDTO dto);
PositionRegistrationDTO convert(PositionRegistration entity);
PositionRegistration convert(PositionRegistrationOperatorDTO dto);
}

View File

@@ -0,0 +1,26 @@
package com.newyetai.recruit.position.dao;
import com.newyetai.tkmybatis.mybatis.MyMapper;
import com.newyetai.recruit.position.entity.ImportDetailPosition;
import com.newyetai.recruit.position.dto.ImportDetailPositionDTO;
import com.newyetai.recruit.position.dto.ImportDetailPositionQueryDTO;
import com.newyetai.recruit.position.dto.ImportDetailPositionPageQueryDTO;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import java.util.List;
/**
* 岗位导入
*
* @author guixinman
* @since 1.0.0 2024-04-12
*/
@Mapper
public interface ImportDetailPositionMapper extends MyMapper<ImportDetailPosition> {
List<ImportDetailPositionDTO> page(@Param("param") ImportDetailPositionPageQueryDTO queryDTO);
List<ImportDetailPositionDTO> list(@Param("param") ImportDetailPositionQueryDTO queryDTO);
}

View File

@@ -0,0 +1,16 @@
package com.newyetai.recruit.position.dao;
import com.newyetai.recruit.position.entity.PositionAddress;
import com.newyetai.tkmybatis.mybatis.MyMapper;
/**
* 位置地址映射器
*
* @author Carlye
* @date 2022/03/29
*/
public interface PositionAddressMapper extends MyMapper<PositionAddress> {
}

View File

@@ -0,0 +1,49 @@
package com.newyetai.recruit.position.dao;
import com.newyetai.recruit.position.dto.PositionAuditReqDTO;
import com.newyetai.recruit.position.dto.PositionNewDTO;
import com.newyetai.recruit.position.dto.PositionNewPageQueryDTO;
import com.newyetai.tkmybatis.mybatis.MyMapper;
import com.newyetai.recruit.position.entity.PositionAudit;
import com.newyetai.recruit.position.dto.PositionAuditDTO;
import com.newyetai.recruit.position.dto.PositionAuditQueryDTO;
import com.newyetai.recruit.position.dto.PositionAuditPageQueryDTO;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import java.util.List;
/**
* 岗位审核表
*
* @author guixinman
* @since 1.0.0 2024-07-05
*/
@Mapper
public interface PositionAuditMapper extends MyMapper<PositionAudit> {
List<PositionAuditDTO> page(@Param("param") PositionAuditPageQueryDTO queryDTO);
List<PositionAuditDTO> list(@Param("param") PositionAuditQueryDTO queryDTO);
/**
* @description: 岗位分页查询
* @return:
* @author: guixinman
* @param:
*/
List<PositionNewDTO> positionPage(@Param("param") PositionNewPageQueryDTO queryDTO);
int modifyById(@Param("param") PositionAudit positionAudit);
int audit(@Param("param") PositionAuditReqDTO reqDTO);
/**
* @description: 根据岗位id获取审核表id
* @return:
* @author: guixinman
* @param:
*/
Long getIdByPositionId(@Param("positionId") Long positionId);
}

View File

@@ -0,0 +1,28 @@
package com.newyetai.recruit.position.dao;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.newyetai.recruit.position.dto.PositionFileDTO;
import com.newyetai.recruit.position.dto.PositionFilePageQueryDTO;
import com.newyetai.recruit.position.entity.PositionFile;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import java.util.List;
/**
* <p>
* 用户岗位访问记录表 Mapper 接口
* </p>
*
* @author Carlye
* @since 2021-01-21
*/
@Mapper
public interface PositionFileMapper extends BaseMapper<PositionFile> {
List<PositionFileDTO> filePage(PositionFilePageQueryDTO queryDTO);
void setDefault(@Param("positionId") Long positionId, @Param("id") Long id);
}

View File

@@ -0,0 +1,41 @@
package com.newyetai.recruit.position.dao;
import com.newyetai.recruit.position.dto.PersonPostMatchingQueryDTO;
import com.newyetai.recruit.statistics.dto.StatisticsBaseDTO;
import com.newyetai.tkmybatis.mybatis.MyMapper;
import com.newyetai.recruit.position.entity.Position;
import com.newyetai.recruit.position.dto.PositionDTO;
import com.newyetai.recruit.position.dto.PositionPageQueryDTO;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import java.util.List;
import java.util.Map;
/**
* 岗位信息表;岗位信息表
*
* @author guixinman
* @since 1.0.0 2024-04-11
*/
@Mapper
public interface PositionMapper extends MyMapper<Position> {
List<PositionDTO> page(@Param("param") PositionPageQueryDTO queryDTO);
List<PositionDTO> userPage(@Param("param") PositionPageQueryDTO queryDTO);
/**
* 岗位类型分组求数量
*/
List<StatisticsBaseDTO> positionTypeGroupMap(@Param("recruitPositionType") String recruitPositionType);
List<PositionDTO> personPostMatching(@Param("param") PersonPostMatchingQueryDTO queryDTO);
/**
* 岗位过期
*/
void positionExpiry();
}

View File

@@ -0,0 +1,30 @@
package com.newyetai.recruit.position.dao;
import com.newyetai.recruit.position.dto.UserPositionRegistrationPageQueryDTO;
import com.newyetai.recruit.position.dto.UserPositionRegistrationResDTO;
import com.newyetai.tkmybatis.mybatis.MyMapper;
import com.newyetai.recruit.position.entity.PositionRegistration;
import com.newyetai.recruit.position.dto.PositionRegistrationDTO;
import com.newyetai.recruit.position.dto.PositionRegistrationPageQueryDTO;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import java.util.List;
/**
* 岗位报名信息表
*
* @author guixinman
* @since 1.0.0 2024-04-15
*/
@Mapper
public interface PositionRegistrationMapper extends MyMapper<PositionRegistration> {
List<PositionRegistrationDTO> page(@Param("param") PositionRegistrationPageQueryDTO queryDTO);
long updateStatus(@Param("param") PositionRegistration positionRegistration, @Param("oldStatus") String oldStatus);
List<UserPositionRegistrationResDTO> userPage(@Param("param") UserPositionRegistrationPageQueryDTO queryDTO);
}

View File

@@ -0,0 +1,25 @@
package com.newyetai.recruit.position.dao;
import com.newyetai.recruit.position.dto.PositionTypeDTO;
import com.newyetai.recruit.position.dto.PositionTypeQueryDTO;
import com.newyetai.recruit.position.entity.PositionType;
import com.newyetai.tkmybatis.mybatis.MyMapper;
import org.apache.ibatis.annotations.Mapper;
import java.util.List;
/**
* <p>
* 用户岗位访问记录表 Mapper 接口
* </p>
*
* @author Carlye
* @since 2021-01-21
*/
@Mapper
public interface PositionTypeMapper extends MyMapper<PositionType> {
List<PositionTypeDTO> queryByDto(PositionTypeQueryDTO queryDTO);
}

View File

@@ -0,0 +1,142 @@
package com.newyetai.recruit.position.dto;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.newyetai.component.commonimport.dto.ImportDetailSuperDTO;
import org.springframework.format.annotation.DateTimeFormat;
import java.math.BigDecimal;
import java.util.Date;
import cn.hutool.core.util.StrUtil;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.*;
import lombok.experimental.SuperBuilder;
/**
* 岗位导入
*
* @author guixinman
* @since 1.0.0 2024-04-12
*/
@ApiModel("岗位导入")
@Data
@SuperBuilder
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode(callSuper = true)
public class ImportDetailPositionDTO extends ImportDetailSuperDTO {
private static final long serialVersionUID = 1L;
@ApiModelProperty("导入任务ID")
private Long mainId;
@ApiModelProperty("机构ID")
private Long orgId;
@ApiModelProperty("模板全量数据")
private String dataJson;
@ApiModelProperty("用工企业ID ;hr_company")
private Long companyId;
private String companyName;
@ApiModelProperty("岗位名称")
private String positionName;
@ApiModelProperty("招聘标题")
private String recruitTitle;
@ApiModelProperty("岗位招聘人数")
private Integer positionNumber;
@ApiModelProperty("工作地址")
private String positionAddress;
/**
* 岗位性质 数据字典
*/
private String recruitPositionType;
@ApiModelProperty("岗位类型")
private String positionTypeName;
@ApiModelProperty("岗位标签")
private String positionTag;
@ApiModelProperty("发薪日")
private String payDate;
@ApiModelProperty("性别要求")
private String sexRequire;
@ApiModelProperty("学历要求")
private String educationRequire;
@ApiModelProperty("经验要求")
private String experienceRequire;
@ApiModelProperty("证件要求")
private String certificatesRequire;
@ApiModelProperty("其他要求")
private String otherRequire;
@ApiModelProperty("工作内容")
private String jobContent;
@ApiModelProperty("明细状态")
private Integer detailStatus;
@ApiModelProperty("失败原因")
private String failReason;
@ApiModelProperty("外部生成明细id")
private Long extraDetailId;
@ApiModelProperty("备注")
private String remark;
/**
* 年龄上限
*/
private Integer ageUp;
/**
* 年龄下限
*/
private Integer ageLow;
/**
* 薪资上限
*/
private BigDecimal salaryUp;
/**
* 薪资下限
*/
private BigDecimal salaryLow;
/**
* 薪资类型
*/
private String salaryType;
/**
* 结束日期
*/
private String endTime;
public void appendFailMsg(String msg) {
if (StrUtil.isEmpty(msg)) {
return;
}
if (StrUtil.isEmpty(getFailReason())) {
setFailReason(msg);
} else {
setFailReason(String.join(",", getFailReason(), msg));
}
}
}

View File

@@ -0,0 +1,14 @@
package com.newyetai.recruit.position.dto;
import com.newyetai.component.commonimport.dto.ImportExecuteSuperDTO;
import lombok.Data;
/**
* @description: 确定导入DTO
* @author: guixinman
* @create: 2024-04-12 10:25
**/
@Data
public class ImportDetailPositionExecuteDTO extends ImportExecuteSuperDTO {
}

View File

@@ -0,0 +1,94 @@
package com.newyetai.recruit.position.dto;
import com.alibaba.excel.annotation.ExcelProperty;
import java.io.Serializable;
import java.math.BigDecimal;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @description:
* @author: guixinman
* @create: 2024-06-12 13:57
**/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class ImportDetailPositionExportDTO implements Serializable {
@ExcelProperty("用工企业")
private String companyName;
@ExcelProperty("岗位名称")
private String positionName;
@ExcelProperty("招聘标题")
private String recruitTitle;
@ExcelProperty("招聘人数")
private Integer positionNumber;
@ExcelProperty("工作地址")
private String positionAddress;
/**
* 岗位性质 数据字典
*/
@ExcelProperty("岗位性质")
private String recruitPositionType;
@ExcelProperty("岗位类型")
private String positionTypeName;
@ExcelProperty("岗位标签")
private String positionTag;
@ExcelProperty("薪资下限")
private BigDecimal salaryLow;
@ExcelProperty("薪资上限")
private BigDecimal salaryUp;
@ExcelProperty("薪资类型")
private String salaryType;
@ExcelProperty("发薪日")
private String payDate;
@ExcelProperty("性别")
private String sexRequire;
@ExcelProperty("年龄(下限)")
private Integer ageLow;
@ExcelProperty("年龄(上限)")
private Integer ageUp;
@ExcelProperty("学历")
private String educationRequire;
@ExcelProperty("经验")
private String experienceRequire;
@ExcelProperty("证件")
private String certificatesRequire;
@ExcelProperty("其他")
private String otherRequire;
@ExcelProperty("工作")
private String jobContent;
@ExcelProperty("有效期截止时间")
private String endTime;
@ExcelProperty("失败原因")
private String failReason;
@ExcelProperty("备注")
private String remark;
}

View File

@@ -0,0 +1,86 @@
package com.newyetai.recruit.position.dto;
import com.alibaba.excel.annotation.ExcelProperty;
import com.newyetai.component.commonimport.service.IImportDetailForm;
import java.math.BigDecimal;
import java.util.Date;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
* @description: 岗位导入dto
* @author: guixinman
* @create: 2024-04-12 10:26
**/
@Data
public class ImportDetailPositionListenerDTO implements IImportDetailForm {
@ApiModelProperty("用工企业")
private String companyName;
@ApiModelProperty("岗位名称")
private String positionName;
@ApiModelProperty("招聘标题")
private String recruitTitle;
@ApiModelProperty("招聘人数")
private Integer positionNumber;
@ApiModelProperty("工作地址")
private String positionAddress;
/**
* 岗位性质 数据字典
*/
private String recruitPositionType;
@ApiModelProperty("岗位类型")
private String positionTypeName;
@ApiModelProperty("岗位标签")
private String positionTag;
@ApiModelProperty("薪资下限")
private BigDecimal salaryLow;
@ApiModelProperty("薪资上限")
private BigDecimal salaryUp;
@ApiModelProperty("薪资类型")
private String salaryType;
@ApiModelProperty("发薪日")
private String payDate;
@ApiModelProperty("性别要求")
private String sexRequire;
@ApiModelProperty("年龄(下限)")
private Integer ageLow;
@ApiModelProperty("年龄(上限)")
private Integer ageUp;
@ApiModelProperty("学历要求")
private String educationRequire;
@ApiModelProperty("经验要求")
private String experienceRequire;
@ApiModelProperty("证件要求")
private String certificatesRequire;
@ApiModelProperty("其他要求")
private String otherRequire;
@ApiModelProperty("工作内容")
private String jobContent;
/**
* 结束日期
*/
private String endTime;
}

View File

@@ -0,0 +1,121 @@
package com.newyetai.recruit.position.dto;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;
/**
* 岗位导入
*
* @author guixinman
* @since 1.0.0 2024-04-12
*/
@ApiModel("岗位导入")
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class ImportDetailPositionOperatorDTO implements Serializable {
private static final long serialVersionUID = 1L;
private Long id;
@ApiModelProperty("导入任务ID")
private Long mainId;
@ApiModelProperty("机构ID")
private Long orgId;
@ApiModelProperty("模板全量数据")
private String dataJson;
@ApiModelProperty("公司ID ;hr_company")
private Long companyId;
@ApiModelProperty("岗位名称")
private String positionName;
@ApiModelProperty("招聘标题")
private String recruitTitle;
@ApiModelProperty("岗位招聘人数")
private Integer positionNumber;
@ApiModelProperty("工作地址")
private String positionAddress;
/**
* 岗位性质 数据字典
*/
private String recruitPositionType;
@ApiModelProperty("发薪日")
private String payDate;
@ApiModelProperty("性别要求")
private Integer sexRequire;
@ApiModelProperty("学历要求")
private Integer educationRequire;
@ApiModelProperty("经验要求")
private String experienceRequire;
@ApiModelProperty("证件要求")
private String certificatesRequire;
@ApiModelProperty("其他要求")
private String otherRequire;
@ApiModelProperty("工作内容")
private String jobContent;
@ApiModelProperty("明细状态")
private Integer detailStatus;
@ApiModelProperty("失败原因")
private String failReason;
@ApiModelProperty("外部生成明细id")
private Long extraDetailId;
@ApiModelProperty("备注")
private String remark;
/**
* 年龄上限
*/
private Integer ageUp;
/**
* 年龄下限
*/
private Integer ageLow;
/**
* 薪资上限
*/
private BigDecimal salaryUp;
/**
* 薪资下限
*/
private BigDecimal salaryLow;
/**
* 薪资类型
*/
private String salaryType;
private Date endTime;
}

View File

@@ -0,0 +1,119 @@
package com.newyetai.recruit.position.dto;
import com.newyetai.common.dto.PageQueryDTO;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.*;
import com.fasterxml.jackson.annotation.JsonFormat;
import org.springframework.format.annotation.DateTimeFormat;
import java.util.Date;
/**
* 岗位导入
*
* @author guixinman
* @since 1.0.0 2024-04-12
*/
@ApiModel("岗位导入")
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode(callSuper = true)
public class ImportDetailPositionPageQueryDTO extends PageQueryDTO<ImportDetailPositionDTO> {
private static final long serialVersionUID = 1L;
private Long id;
@ApiModelProperty("导入任务ID")
private Long mainId;
@ApiModelProperty("机构ID")
private Long orgId;
@ApiModelProperty("模板全量数据")
private String dataJson;
@ApiModelProperty("公司ID ;hr_company")
private Long companyId;
@ApiModelProperty("岗位名称 (模糊匹配)")
private String positionNameLike;
@ApiModelProperty("招聘标题")
private String recruitTitle;
@ApiModelProperty("岗位招聘人数")
private Integer positionNumber;
@ApiModelProperty("工作地址")
private String positionAddress;
/**
* 岗位性质 数据字典
*/
private String recruitPositionType;
@ApiModelProperty("发薪日")
private String payDate;
@ApiModelProperty("性别要求")
private Integer sexRequire;
@ApiModelProperty("学历要求")
private Integer educationRequire;
@ApiModelProperty("经验要求")
private String experienceRequire;
@ApiModelProperty("证件要求")
private String certificatesRequire;
@ApiModelProperty("其他要求")
private String otherRequire;
@ApiModelProperty("工作内容")
private String jobContent;
@ApiModelProperty("明细状态")
private Integer detailStatus;
@ApiModelProperty("失败原因")
private String failReason;
@ApiModelProperty("外部生成明细id")
private Long extraDetailId;
@ApiModelProperty("备注")
private String remark;
@ApiModelProperty("创建时间起,格式 (yyyy-MM-dd HH:mm:ss)")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date createTimeStart;
@ApiModelProperty("创建时间止,格式 (yyyy-MM-dd HH:mm:ss)")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date createTimeEnd;
@ApiModelProperty("更新时间起,格式 (yyyy-MM-dd HH:mm:ss)")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date updateTimeStart;
@ApiModelProperty("更新时间止,格式 (yyyy-MM-dd HH:mm:ss)")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date updateTimeEnd;
}

View File

@@ -0,0 +1,119 @@
package com.newyetai.recruit.position.dto;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
import com.fasterxml.jackson.annotation.JsonFormat;
import org.springframework.format.annotation.DateTimeFormat;
import java.util.Date;
/**
* 岗位导入
*
* @author guixinman
* @since 1.0.0 2024-04-12
*/
@ApiModel("岗位导入")
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class ImportDetailPositionQueryDTO implements Serializable {
private static final long serialVersionUID = 1L;
private Long id;
@ApiModelProperty("导入任务ID")
private Long mainId;
@ApiModelProperty("机构ID")
private Long orgId;
@ApiModelProperty("模板全量数据")
private String dataJson;
@ApiModelProperty("公司ID ;hr_company")
private Long companyId;
@ApiModelProperty("岗位名称 (模糊匹配)")
private String positionNameLike;
@ApiModelProperty("招聘标题")
private String recruitTitle;
@ApiModelProperty("岗位招聘人数")
private Integer positionNumber;
@ApiModelProperty("工作地址")
private String positionAddress;
/**
* 岗位性质 数据字典
*/
private String recruitPositionType;
@ApiModelProperty("发薪日")
private String payDate;
@ApiModelProperty("性别要求")
private Integer sexRequire;
@ApiModelProperty("学历要求")
private Integer educationRequire;
@ApiModelProperty("经验要求")
private String experienceRequire;
@ApiModelProperty("证件要求")
private String certificatesRequire;
@ApiModelProperty("其他要求")
private String otherRequire;
@ApiModelProperty("工作内容")
private String jobContent;
@ApiModelProperty("明细状态")
private Integer detailStatus;
@ApiModelProperty("失败原因")
private String failReason;
@ApiModelProperty("外部生成明细id")
private Long extraDetailId;
@ApiModelProperty("备注")
private String remark;
@ApiModelProperty("创建时间起,格式 (yyyy-MM-dd HH:mm:ss)")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date createTimeStart;
@ApiModelProperty("创建时间止,格式 (yyyy-MM-dd HH:mm:ss)")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date createTimeEnd;
@ApiModelProperty("更新时间起,格式 (yyyy-MM-dd HH:mm:ss)")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date updateTimeStart;
@ApiModelProperty("更新时间止,格式 (yyyy-MM-dd HH:mm:ss)")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date updateTimeEnd;
}

View File

@@ -0,0 +1,46 @@
package com.newyetai.recruit.position.dto;
import com.fasterxml.jackson.annotation.JsonFormat;
import org.springframework.format.annotation.DateTimeFormat;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
import javax.validation.Valid;
import javax.validation.constraints.NotNull;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
* @description: 入职DTO
* @author: guixinman
* @create: 2024-04-16 14:47
**/
@Data
public class OnTheJobDTO implements Serializable {
@NotNull(message = "入职时间不能为空")
@ApiModelProperty("入职时间")
@DateTimeFormat(pattern = "yyyy-MM-dd")
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd", timezone = "GMT+8")
private Date inductionTime;
@NotNull(message = "明细数据不能为空")
private List<@Valid OnTheJobDetailDTO> detailDTOS;
@Data
public static class OnTheJobDetailDTO {
@NotNull(message = "请选择数据")
private Long id;
@NotNull(message = "入职薪水不能为空")
@ApiModelProperty("入职薪水")
private BigDecimal salary;
}
}

View File

@@ -0,0 +1,57 @@
package com.newyetai.recruit.position.dto;
import com.newyetai.common.dto.PageQueryDTO;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.List;
import io.swagger.annotations.ApiModel;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @description:
* @author: guixinman
* @create: 2024-09-11 16:51
**/
@ApiModel("人岗匹配")
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class PersonPostMatchingQueryDTO extends PageQueryDTO<PositionDTO> {
/**
* 性别
*/
private String sexRequire;
/**
* 年龄
*/
private Integer age;
/**
* 学历
*/
private String educationRequire;
/**
* 薪水
*/
private BigDecimal salary;
/**
* 岗位类型
*/
private String positionType;
private String positionNameLike;
/**
* 工作地
*/
private String detailAddressLike;
}

View File

@@ -0,0 +1,51 @@
package com.newyetai.recruit.position.dto;
import com.newyetai.common.dto.BaseDTO;
import java.math.BigDecimal;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
import lombok.experimental.SuperBuilder;
/**
* <p>
* 招聘系统-岗位地址信息表
* </p>
*
* @author chenyun
* @since 2021-01-08
*/
@EqualsAndHashCode(callSuper = true)
@ApiModel("招聘系统岗位地址信息DTO")
@Data
@SuperBuilder
@NoArgsConstructor
@AllArgsConstructor
public class PositionAddressDTO extends BaseDTO {
private static final long serialVersionUID = -350362178226190054L;
@ApiModelProperty("岗位ID")
private Long companyId;
@ApiModelProperty("区域编码")
private String districtCode;
@ApiModelProperty("区域名称")
private String districtName;
@ApiModelProperty("详细地址")
private String detailAddress;
@ApiModelProperty("经度")
private BigDecimal longitude;
@ApiModelProperty("纬度")
private BigDecimal latitude;
}

View File

@@ -0,0 +1,60 @@
package com.newyetai.recruit.position.dto;
import com.newyetai.common.dto.BaseDTO;
import java.math.BigDecimal;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
import lombok.experimental.SuperBuilder;
/**
* <p>
* 招聘系统-岗位地址信息表
* </p>
*
* @author chenyun
* @since 2021-01-08
*/
@EqualsAndHashCode(callSuper = true)
@ApiModel("招聘系统岗位地址信息 - 创建DTO")
@Data
@SuperBuilder
@NoArgsConstructor
@AllArgsConstructor
public class PositionAddressOperatorDTO extends BaseDTO {
private static final long serialVersionUID = -350362178226190054L;
@ApiModelProperty("企业ID")
@NotNull(message = "企业ID不能为空")
private Long companyId;
@ApiModelProperty("区域编码")
// @NotEmpty(message = "区域编码不能为空")
private String districtCode;
@ApiModelProperty("区域名称")
// @NotEmpty(message = "区域名称不能为空")
private String districtName;
@ApiModelProperty("详细地址")
@NotEmpty(message = "详细地址不能为空")
private String detailAddress;
@ApiModelProperty("经度")
// @NotEmpty(message = "经度不能为空")
private BigDecimal longitude;
@ApiModelProperty("纬度")
// @NotEmpty(message = "纬度不能为空")
private BigDecimal latitude;
}

View File

@@ -0,0 +1,36 @@
package com.newyetai.recruit.position.dto;
import java.io.Serializable;
import java.util.Set;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* <p>
* 招聘系统-岗位地址信息表
* </p>
*
* @author chenyun
* @since 2021-01-08
*/
@ApiModel("招聘系统岗位地址信息 - 查询DTO")
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class PositionAddressQueryDTO implements Serializable {
private static final long serialVersionUID = -6376035694183055706L;
@ApiModelProperty("岗位ID")
private Long companyId;
@ApiModelProperty("ID集合")
private Set<Long> ids;
}

View File

@@ -0,0 +1,181 @@
package com.newyetai.recruit.position.dto;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.newyetai.common.dto.BaseDTO;
import com.newyetai.component.dict.util.DictUtils;
import org.springframework.format.annotation.DateTimeFormat;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.*;
import lombok.experimental.SuperBuilder;
import java.math.BigDecimal;
import java.util.Date;
import java.util.Objects;
/**
* 岗位审核表
*
* @author guixinman
* @since 1.0.0 2024-07-05
*/
@ApiModel("岗位审核表")
@Data
@SuperBuilder
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode(callSuper = true)
public class PositionAuditDTO extends BaseDTO {
private static final long serialVersionUID = 1L;
private Long positionId;
private Long orgId;
private String orgName;
@ApiModelProperty("hr_company主键")
private Long companyId;
private String companyName;
@ApiModelProperty("岗位名称")
private String positionName;
@ApiModelProperty("招聘标题")
private String recruitTitle;
@ApiModelProperty("岗位类型")
private String positionType;
private String positionTypeName;
@ApiModelProperty("工作性质 1:短工 2:全职")
private String jobCategory;
@ApiModelProperty("岗位招聘人数")
private Integer positionNumber;
@ApiModelProperty("工作地址")
private String positionAddress;
@ApiModelProperty("招聘专员")
private Long recruitUserId;
@ApiModelProperty("发薪日")
private String payDate;
@ApiModelProperty("性别要求")
private String sexRequire;
@ApiModelProperty("学历要求")
private String educationRequire;
@ApiModelProperty("经验要求")
private String experienceRequire;
@ApiModelProperty("证件要求")
private String certificatesRequire;
@ApiModelProperty("其他要求")
private String otherRequire;
@ApiModelProperty("工作内容")
private String jobContent;
@ApiModelProperty("岗位标签")
private String positionTag;
private Long addressId;
@ApiModelProperty("招聘岗位类型数据字典")
private String recruitPositionType;
@ApiModelProperty("审核状态 1:待审核 2.审核成功 3.审核失败")
private String auditStatus;
@ApiModelProperty("审核失败原因")
private String auditFailMsg;
@ApiModelProperty("版本号")
private Integer version;
@ApiModelProperty("工作地址")
private String detailAddress;
private String fileJson;
/**
* 年龄上限
*/
private Integer ageUp;
/**
* 年龄下限
*/
private Integer ageLow;
/**
* 薪资上限
*/
private BigDecimal salaryUp;
/**
* 薪资下限
*/
private BigDecimal salaryLow;
/**
* 薪资类型
*/
private String salaryType;
private String salaryStr;
private String ageStr;
/**
* 结束日期
*/
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date endTime;
public String getSalaryStr() {
String salary = "";
if (Objects.nonNull(this.getSalaryUp()) && Objects.nonNull(this.getSalaryLow())) {
salary = String.format("%s~%s元/%s", this.getSalaryLow(), this.getSalaryUp(), DictUtils.getCodeNameMap("salary_type").get(String.valueOf(this.getSalaryType())));
if (this.getSalaryLow().compareTo(this.getSalaryUp()) == 0) {
salary = String.format("%s元/%s", this.getSalaryUp(), DictUtils.getCodeNameMap("salary_type").get(String.valueOf(this.getSalaryType())));
}
} else if (Objects.nonNull(this.getSalaryLow()) && Objects.isNull(this.getSalaryUp())) {
salary = String.format("%s元/%s", this.getSalaryLow(), DictUtils.getCodeNameMap("salary_type").get(String.valueOf(this.getSalaryType())));
} else if (Objects.isNull(this.getSalaryLow()) && Objects.nonNull(this.getSalaryUp())) {
salary = String.format("%s元/%s", this.getSalaryUp(), DictUtils.getCodeNameMap("salary_type").get(String.valueOf(this.getSalaryType())));
} else if (Objects.isNull(this.getSalaryLow()) && Objects.isNull(this.getSalaryUp())) {
salary = "薪资面议";
}
return salary;
}
public String getAgeStr() {
String age = "";
if (Objects.nonNull(this.getAgeLow()) && Objects.nonNull(this.getAgeUp())) {
age = String.format("%s至%s岁", this.getAgeLow(), this.getAgeUp());
if (this.getAgeLow().intValue() == this.getAgeUp().intValue()) {
age = String.format("%s岁", this.getAgeUp());
}
} else if (Objects.nonNull(this.getAgeLow()) && Objects.isNull(this.getAgeUp())) {
age = String.format("%s岁以上", this.getAgeLow());
} else if (Objects.isNull(this.getAgeLow()) && Objects.nonNull(this.getAgeUp())) {
age = String.format("18至%s岁", this.getAgeUp());
} else if (Objects.isNull(this.getAgeLow()) && Objects.isNull(this.getAgeUp())) {
age = "18岁以上";
}
return age;
}
}

View File

@@ -0,0 +1,130 @@
package com.newyetai.recruit.position.dto;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import com.fasterxml.jackson.annotation.JsonFormat;
import org.springframework.format.annotation.DateTimeFormat;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
import java.math.BigDecimal;
import java.util.Date;
/**
* 岗位审核表
*
* @author guixinman
* @since 1.0.0 2024-07-05
*/
@ApiModel("岗位审核表")
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class PositionAuditOperatorDTO implements Serializable {
private static final long serialVersionUID = 1L;
private Long id;
private Long positionId;
private Long orgId;
@ApiModelProperty("hr_company主键")
private Long companyId;
@ApiModelProperty("岗位名称")
private String positionName;
@ApiModelProperty("招聘标题")
private String recruitTitle;
@ApiModelProperty("岗位类型")
private String positionType;
@ApiModelProperty("工作性质 1:短工 2:全职")
private String jobCategory;
@ApiModelProperty("岗位招聘人数")
private Integer positionNumber;
@ApiModelProperty("工作地址")
private String positionAddress;
@ApiModelProperty("招聘专员")
private Long recruitUserId;
@ApiModelProperty("发薪日")
private String payDate;
@ApiModelProperty("性别要求")
private String sexRequire;
@ApiModelProperty("学历要求")
private String educationRequire;
@ApiModelProperty("经验要求")
private String experienceRequire;
@ApiModelProperty("证件要求")
private String certificatesRequire;
@ApiModelProperty("其他要求")
private String otherRequire;
@ApiModelProperty("工作内容")
private String jobContent;
@ApiModelProperty("岗位标签")
private String positionTag;
private Long addressId;
@ApiModelProperty("招聘岗位类型数据字典")
private String recruitPositionType;
@ApiModelProperty("审核状态 1:待审核 2.审核成功 3.审核失败")
private String auditStatus;
@ApiModelProperty("审核失败原因")
private String auditFailMsg;
@ApiModelProperty("版本号")
private Integer version;
/**
* 年龄上限
*/
private Integer ageUp;
/**
* 年龄下限
*/
private Integer ageLow;
/**
* 薪资上限
*/
private BigDecimal salaryUp;
/**
* 薪资下限
*/
private BigDecimal salaryLow;
/**
* 薪资类型
*/
private String salaryType;
}

View File

@@ -0,0 +1,128 @@
package com.newyetai.recruit.position.dto;
import com.newyetai.common.dto.PageQueryDTO;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.*;
import java.io.Serializable;
import com.fasterxml.jackson.annotation.JsonFormat;
import org.springframework.format.annotation.DateTimeFormat;
import java.util.Date;
import java.util.Set;
/**
* 岗位审核表
*
* @author guixinman
* @since 1.0.0 2024-07-05
*/
@ApiModel("岗位审核表")
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode(callSuper = true)
public class PositionAuditPageQueryDTO extends PageQueryDTO<PositionAuditDTO> {
private static final long serialVersionUID = 1L;
private Long id;
private Long positionId;
private Long orgId;
private Set<Long> orgIds;
private String orgNameLike;
@ApiModelProperty("hr_company主键")
private Long companyId;
@ApiModelProperty("岗位名称 (模糊匹配)")
private String positionNameLike;
@ApiModelProperty("招聘标题")
private String recruitTitle;
@ApiModelProperty("岗位类型")
private String positionType;
@ApiModelProperty("工作性质 1:短工 2:全职")
private String jobCategory;
@ApiModelProperty("岗位招聘人数")
private Integer positionNumber;
@ApiModelProperty("工作地址")
private String positionAddress;
@ApiModelProperty("招聘专员")
private Long recruitUserId;
@ApiModelProperty("发薪日")
private String payDate;
@ApiModelProperty("性别要求")
private String sexRequire;
@ApiModelProperty("学历要求")
private String educationRequire;
@ApiModelProperty("经验要求")
private String experienceRequire;
@ApiModelProperty("证件要求")
private String certificatesRequire;
@ApiModelProperty("其他要求")
private String otherRequire;
@ApiModelProperty("工作内容")
private String jobContent;
@ApiModelProperty("岗位标签")
private String positionTag;
private Long addressId;
@ApiModelProperty("招聘岗位类型数据字典")
private String recruitPositionType;
@ApiModelProperty("审核状态 1:待审核 2.审核成功 3.审核失败")
private String auditStatus;
@ApiModelProperty("审核失败原因")
private String auditFailMsg;
@ApiModelProperty("版本号")
private Integer version;
@ApiModelProperty("创建时间起,格式 (yyyy-MM-dd HH:mm:ss)")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date createTimeStart;
@ApiModelProperty("创建时间止,格式 (yyyy-MM-dd HH:mm:ss)")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date createTimeEnd;
@ApiModelProperty("更新时间起,格式 (yyyy-MM-dd HH:mm:ss)")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date updateTimeStart;
@ApiModelProperty("更新时间止,格式 (yyyy-MM-dd HH:mm:ss)")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date updateTimeEnd;
}

View File

@@ -0,0 +1,123 @@
package com.newyetai.recruit.position.dto;
import com.newyetai.common.dto.BaseDTO;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
import com.fasterxml.jackson.annotation.JsonFormat;
import org.springframework.format.annotation.DateTimeFormat;
import java.util.Date;
/**
* 岗位审核表
*
* @author guixinman
* @since 1.0.0 2024-07-05
*/
@ApiModel("岗位审核表")
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class PositionAuditQueryDTO implements Serializable {
private static final long serialVersionUID = 1L;
private Long id;
private Long positionId;
private Long orgId;
@ApiModelProperty("hr_company主键")
private Long companyId;
@ApiModelProperty("岗位名称 (模糊匹配)")
private String positionNameLike;
@ApiModelProperty("招聘标题")
private String recruitTitle;
@ApiModelProperty("岗位类型")
private String positionType;
@ApiModelProperty("工作性质 1:短工 2:全职")
private String jobCategory;
@ApiModelProperty("岗位招聘人数")
private Integer positionNumber;
@ApiModelProperty("工作地址")
private String positionAddress;
@ApiModelProperty("招聘专员")
private Long recruitUserId;
@ApiModelProperty("发薪日")
private String payDate;
@ApiModelProperty("性别要求")
private String sexRequire;
@ApiModelProperty("学历要求")
private String educationRequire;
@ApiModelProperty("经验要求")
private String experienceRequire;
@ApiModelProperty("证件要求")
private String certificatesRequire;
@ApiModelProperty("其他要求")
private String otherRequire;
@ApiModelProperty("工作内容")
private String jobContent;
@ApiModelProperty("岗位标签")
private String positionTag;
private Long addressId;
@ApiModelProperty("招聘岗位类型数据字典")
private String recruitPositionType;
@ApiModelProperty("审核状态 1:待审核 2.审核成功 3.审核失败")
private String auditStatus;
@ApiModelProperty("审核失败原因")
private String auditFailMsg;
@ApiModelProperty("版本号")
private Integer version;
@ApiModelProperty("创建时间起,格式 (yyyy-MM-dd HH:mm:ss)")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date createTimeStart;
@ApiModelProperty("创建时间止,格式 (yyyy-MM-dd HH:mm:ss)")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date createTimeEnd;
@ApiModelProperty("更新时间起,格式 (yyyy-MM-dd HH:mm:ss)")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date updateTimeStart;
@ApiModelProperty("更新时间止,格式 (yyyy-MM-dd HH:mm:ss)")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date updateTimeEnd;
}

View File

@@ -0,0 +1,34 @@
package com.newyetai.recruit.position.dto;
import java.io.Serializable;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
* @description:
* @author: guixinman
* @create: 2024-07-05 15:39
**/
@Data
public class PositionAuditReqDTO implements Serializable {
@NotNull(message = "id不能为空")
private Long id;
@NotBlank(message = "请选择审核状态")
@ApiModelProperty("审核状态 1:待审核 2.审核成功 3.审核失败")
private String auditStatus;
@ApiModelProperty("审核失败原因")
private String auditFailMsg;
@NotNull(message = "版本号不能为空")
private Integer version;
private Long updateBy;
}

View File

@@ -0,0 +1,248 @@
package com.newyetai.recruit.position.dto;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.newyetai.common.dto.BaseDTO;
import com.newyetai.component.dict.util.DictUtils;
import org.springframework.format.annotation.DateTimeFormat;
import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
import java.util.Objects;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.*;
import lombok.experimental.SuperBuilder;
/**
* 岗位信息表;岗位信息表
*
* @author guixinman
* @since 1.0.0 2024-04-11
*/
@ApiModel("岗位信息表;岗位信息表")
@Data
@SuperBuilder
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode(callSuper = true)
public class PositionDTO extends BaseDTO {
private static final long serialVersionUID = 1L;
@ApiModelProperty("机构ID")
private Long orgId;
@ApiModelProperty("公司ID ;hr_company")
private Long companyId;
private String companyName;
@ApiModelProperty("岗位状态:1:开启 2:关闭")
private String status;
@ApiModelProperty("岗位名称")
private String positionName;
@ApiModelProperty("招聘标题")
private String recruitTitle;
@ApiModelProperty("岗位类型")
private String positionType;
private String positionTypeName;
@ApiModelProperty("岗位标签")
private String positionTag;
@ApiModelProperty("工作性质;工作性质 1:短工 2:全职")
private String jobCategory;
@ApiModelProperty("岗位招聘人数")
private Integer positionNumber;
@ApiModelProperty("工作地址")
private String positionAddress;
@ApiModelProperty("招聘专员")
private Long recruitUserId;
@ApiModelProperty("发薪日")
private String payDate;
@ApiModelProperty("性别要求")
private String sexRequire;
@ApiModelProperty("学历要求")
private String educationRequire;
@ApiModelProperty("经验要求")
private String experienceRequire;
@ApiModelProperty("证件要求")
private String certificatesRequire;
@ApiModelProperty("其他要求")
private String otherRequire;
@ApiModelProperty("工作内容")
private String jobContent;
private String companyLogo;
@ApiModelProperty("招聘负责人名称")
private String recruitUserRealName;
private String recruitUserAvatar;
private String recruitUserPhone;
private String positionFileCode;
private String companyRegisterAddress;
private List<PositionFileDTO> positionFileDTOS;
@ApiModelProperty("状态:1已报名、2待面试、3面试不通过、4待入职、5已入职、 6已离职、 7结束招聘")
private String positionRegistrationStatus;
/**
* 是否收藏
*/
private Boolean isCollection;
@ApiModelProperty("工作地址id")
private Long addressId;
/**
* 区域编码(31)
*/
private String districtCode;
/**
* 区域名称 (上海市)
*/
private String districtName;
/**
* 详细地址 (浦东新区黄金大厦B座)
*/
private String detailAddress;
/**
* 经度
*/
private BigDecimal longitude;
/**
* 纬度
*/
private BigDecimal latitude;
/**
* 招聘岗位类型
*/
private String recruitPositionType;
private String recruitPositionTypeName;
/**
* 年龄上限
*/
private Integer ageUp;
/**
* 年龄下限
*/
private Integer ageLow;
/**
* 薪资上限
*/
private BigDecimal salaryUp;
/**
* 薪资下限
*/
private BigDecimal salaryLow;
/**
* 薪资类型
*/
private String salaryType;
private String salaryStr;
private String ageStr;
private Boolean show;
@ApiModelProperty("报名时间")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date positionRegistrationCreateTime;
@ApiModelProperty("面试时间")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date interviewTime;
@ApiModelProperty("面试地点")
private String interviewLocation;
@ApiModelProperty("备注")
private String remark;
@ApiModelProperty("入职时间")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date inductionTime;
@ApiModelProperty("入职薪资")
private BigDecimal positionRegistrationSalary;
/**
* 结束日期
*/
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date endTime;
/**
* 米
*/
private Long distance;
public String getSalaryStr() {
String salary = "";
if (Objects.nonNull(this.getSalaryUp()) && Objects.nonNull(this.getSalaryLow())) {
salary = String.format("%s~%s元/%s", this.getSalaryLow(), this.getSalaryUp(), DictUtils.getCodeNameMap("salary_type").get(String.valueOf(this.getSalaryType())));
if (this.getSalaryLow().compareTo(this.getSalaryUp()) == 0) {
salary = String.format("%s元/%s", this.getSalaryUp(), DictUtils.getCodeNameMap("salary_type").get(String.valueOf(this.getSalaryType())));
}
} else if (Objects.nonNull(this.getSalaryLow()) && Objects.isNull(this.getSalaryUp())) {
salary = String.format("%s元/%s", this.getSalaryLow(), DictUtils.getCodeNameMap("salary_type").get(String.valueOf(this.getSalaryType())));
} else if (Objects.isNull(this.getSalaryLow()) && Objects.nonNull(this.getSalaryUp())) {
salary = String.format("%s元/%s", this.getSalaryUp(), DictUtils.getCodeNameMap("salary_type").get(String.valueOf(this.getSalaryType())));
} else if (Objects.isNull(this.getSalaryLow()) && Objects.isNull(this.getSalaryUp())) {
salary = "薪资面议";
}
return salary;
}
public String getAgeStr() {
String age = "";
if (Objects.nonNull(this.getAgeLow()) && Objects.nonNull(this.getAgeUp())) {
age = String.format("%s至%s岁", this.getAgeLow(), this.getAgeUp());
if (this.getAgeLow().intValue() == this.getAgeUp().intValue()) {
age = String.format("%s岁", this.getAgeUp());
}
} else if (Objects.nonNull(this.getAgeLow()) && Objects.isNull(this.getAgeUp())) {
age = String.format("%s岁以上", this.getAgeLow());
} else if (Objects.isNull(this.getAgeLow()) && Objects.nonNull(this.getAgeUp())) {
age = String.format("18至%s岁", this.getAgeUp());
} else if (Objects.isNull(this.getAgeLow()) && Objects.isNull(this.getAgeUp())) {
age = "18岁以上";
}
return age;
}
}

View File

@@ -0,0 +1,59 @@
package com.newyetai.recruit.position.dto;
import com.alibaba.excel.annotation.ExcelProperty;
import java.io.Serializable;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @description:
* @author: guixinman
* @create: 2024-04-11 17:04
**/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class PositionExportDTO implements Serializable {
@ExcelProperty("招聘岗位类型")
@ApiModelProperty("招聘岗位类型")
private String recruitPositionTypeName;
@ExcelProperty("岗位名称")
@ApiModelProperty("岗位名称")
private String positionName;
@ExcelProperty("用工企业")
@ApiModelProperty("用工企业")
private String companyName;
@ExcelProperty("岗位状态")
@ApiModelProperty("岗位状态:1:开启 2:关闭")
private String status;
@ExcelProperty("招聘人数")
@ApiModelProperty("招聘人数")
private Integer positionNumber;
@ExcelProperty("综合薪资")
@ApiModelProperty("综合薪资")
private String salary;
@ExcelProperty("工作地址")
@ApiModelProperty("工作地址")
private String positionAddress;
@ApiModelProperty("创建时间")
@ExcelProperty("创建时间")
private String createTime;
@ApiModelProperty("有效期截止时间")
@ExcelProperty("有效期截止时间")
private String endTime;
}

View File

@@ -0,0 +1,58 @@
package com.newyetai.recruit.position.dto;
import java.io.Serializable;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* <p>
* 招聘系统-岗位文件
* </p>
*
* @author chenyun
* @since 2021-01-08
*/
@ApiModel("招聘系统岗位文件DTO")
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class PositionFileDTO implements Serializable {
private static final long serialVersionUID = 8851173648134487125L;
@ApiModelProperty("主键")
private Long id;
@ApiModelProperty("文件名称")
private String fileName;
@ApiModelProperty("文件编码")
private String fileCode;
@ApiModelProperty("文件后缀")
private String fileSuffix;
@ApiModelProperty("文件描述")
private String description;
@ApiModelProperty("文件类型")
private String fileType;
@ApiModelProperty("默认显示")
private Boolean defaultShow;
@ApiModelProperty("排序")
private Integer sort;
@ApiModelProperty("岗位ID")
private Long positionId;
}

View File

@@ -0,0 +1,36 @@
package com.newyetai.recruit.position.dto;
import com.newyetai.common.dto.PageQueryDTO;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
/**
* <p>
* 招聘系统-岗位相关分页请求DTO
* </p>
*
* @author chenyun
* @since 2021-01-08
*/
@EqualsAndHashCode(callSuper = true)
@ApiModel("招聘系统岗位相关分页查询DTO")
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class PositionFilePageQueryDTO extends PageQueryDTO<PositionFileDTO> {
private static final long serialVersionUID = -6211701785572927530L;
@ApiModelProperty("岗位ID")
private Long positionId;
@ApiModelProperty("文件类型")
private String fileType;
}

View File

@@ -0,0 +1,237 @@
package com.newyetai.recruit.position.dto;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.newyetai.common.dto.BaseDTO;
import com.newyetai.component.dict.util.DictUtils;
import org.springframework.format.annotation.DateTimeFormat;
import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
import java.util.Objects;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
import lombok.experimental.SuperBuilder;
/**
* 岗位信息表;岗位信息表
*
* @author guixinman
* @since 1.0.0 2024-04-11
*/
@ApiModel("岗位信息表;岗位信息表")
@Data
@SuperBuilder
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode(callSuper = true)
public class PositionNewDTO extends BaseDTO {
private static final long serialVersionUID = 1L;
@ApiModelProperty("机构ID")
private Long orgId;
@ApiModelProperty("公司ID ;hr_company")
private Long companyId;
private String companyName;
@ApiModelProperty("岗位状态:1:开启 2:关闭")
private String status;
@ApiModelProperty("岗位名称")
private String positionName;
@ApiModelProperty("招聘标题")
private String recruitTitle;
@ApiModelProperty("岗位类型")
private String positionType;
private String positionTypeName;
@ApiModelProperty("岗位标签")
private String positionTag;
@ApiModelProperty("工作性质;工作性质 1:短工 2:全职")
private String jobCategory;
@ApiModelProperty("岗位招聘人数")
private Integer positionNumber;
@ApiModelProperty("工作地址")
private String positionAddress;
@ApiModelProperty("招聘专员")
private Long recruitUserId;
@ApiModelProperty("发薪日")
private String payDate;
@ApiModelProperty("性别要求")
private String sexRequire;
@ApiModelProperty("学历要求")
private String educationRequire;
@ApiModelProperty("经验要求")
private String experienceRequire;
@ApiModelProperty("证件要求")
private String certificatesRequire;
@ApiModelProperty("其他要求")
private String otherRequire;
@ApiModelProperty("工作内容")
private String jobContent;
private String companyLogo;
@ApiModelProperty("招聘负责人名称")
private String recruitUserRealName;
private String recruitUserAvatar;
private String recruitUserPhone;
private String positionFileCode;
private String companyRegisterAddress;
private List<PositionFileDTO> positionFileDTOS;
@ApiModelProperty("状态:1已报名、2待面试、3面试不通过、4待入职、5已入职、 6已离职、 7结束招聘")
private String positionRegistrationStatus;
/**
* 是否收藏
*/
private Boolean isCollection;
@ApiModelProperty("工作地址id")
private Long addressId;
/**
* 区域编码(31)
*/
private String districtCode;
/**
* 区域名称 (上海市)
*/
private String districtName;
/**
* 详细地址 (浦东新区黄金大厦B座)
*/
private String detailAddress;
/**
* 经度
*/
private BigDecimal longitude;
/**
* 纬度
*/
private BigDecimal latitude;
/**
* 招聘岗位类型
*/
private String recruitPositionType;
private String recruitPositionTypeName;
private Long positionAuditId;
/**
* 审核状态 1:待审核 2.审核成功 3.审核失败
*/
private String auditStatus;
@ApiModelProperty("审核失败原因")
private String auditFailMsg;
private Integer version;
/**
* 岗位相册json
*/
private String fileJson;
/**
* 年龄上限
*/
private Integer ageUp;
/**
* 年龄下限
*/
private Integer ageLow;
/**
* 薪资上限
*/
private BigDecimal salaryUp;
/**
* 薪资下限
*/
private BigDecimal salaryLow;
/**
* 薪资类型
*/
private String salaryType;
private String salaryStr;
private String ageStr;
/**
* 结束日期
*/
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date endTime;
public String getSalaryStr() {
String salary = "";
if (Objects.nonNull(this.getSalaryUp()) && Objects.nonNull(this.getSalaryLow())) {
salary = String.format("%s~%s元/%s", this.getSalaryLow(), this.getSalaryUp(), DictUtils.getCodeNameMap("salary_type").get(String.valueOf(this.getSalaryType())));
if (this.getSalaryLow().compareTo(this.getSalaryUp()) == 0) {
salary = String.format("%s元/%s", this.getSalaryUp(), DictUtils.getCodeNameMap("salary_type").get(String.valueOf(this.getSalaryType())));
}
} else if (Objects.nonNull(this.getSalaryLow()) && Objects.isNull(this.getSalaryUp())) {
salary = String.format("%s元/%s", this.getSalaryLow(), DictUtils.getCodeNameMap("salary_type").get(String.valueOf(this.getSalaryType())));
} else if (Objects.isNull(this.getSalaryLow()) && Objects.nonNull(this.getSalaryUp())) {
salary = String.format("%s元/%s", this.getSalaryUp(), DictUtils.getCodeNameMap("salary_type").get(String.valueOf(this.getSalaryType())));
} else if (Objects.isNull(this.getSalaryLow()) && Objects.isNull(this.getSalaryUp())) {
salary = "薪资面议";
}
return salary;
}
public String getAgeStr() {
String age = "";
if (Objects.nonNull(this.getAgeLow()) && Objects.nonNull(this.getAgeUp())) {
age = String.format("%s至%s岁", this.getAgeLow(), this.getAgeUp());
if (this.getAgeLow().intValue() == this.getAgeUp().intValue()) {
age = String.format("%s岁", this.getAgeUp());
}
} else if (Objects.nonNull(this.getAgeLow()) && Objects.isNull(this.getAgeUp())) {
age = String.format("%s岁以上", this.getAgeLow());
} else if (Objects.isNull(this.getAgeLow()) && Objects.nonNull(this.getAgeUp())) {
age = String.format("18至%s岁", this.getAgeUp());
} else if (Objects.isNull(this.getAgeLow()) && Objects.isNull(this.getAgeUp())) {
age = "18岁以上";
}
return age;
}
}

View File

@@ -0,0 +1,171 @@
package com.newyetai.recruit.position.dto;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.newyetai.common.annotation.trimAndUpper.TrimAndUpper;
import org.hibernate.validator.constraints.Length;
import org.springframework.format.annotation.DateTimeFormat;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;
import java.util.Objects;
import java.util.Set;
import javax.validation.constraints.Max;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import cn.hutool.core.date.DateUtil;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @description:
* @author: guixinman
* @create: 2024-07-08 10:18
**/
@ApiModel("岗位审核表")
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class PositionNewOperatorDTO implements Serializable {
private static final long serialVersionUID = 1L;
private Long id;
//开启招聘 关闭招聘用
private Set<Long> ids;
@ApiModelProperty("机构ID")
private Long orgId;
@NotNull(message = "请选择用工企业")
@ApiModelProperty("公司ID ;hr_company")
private Long companyId;
@ApiModelProperty("岗位状态:1:开启 2:关闭")
private String status;
@Length(max = 50,message = "岗位名称超长")
@TrimAndUpper(value = TrimAndUpper.ExecuteType.TRIM)
@NotBlank(message = "岗位名称不能为空")
@ApiModelProperty("岗位名称")
private String positionName;
@Length(max = 255,message = "招聘标题超长")
@TrimAndUpper(value = TrimAndUpper.ExecuteType.TRIM)
@ApiModelProperty("招聘标题")
private String recruitTitle;
@ApiModelProperty("岗位类型")
private String positionType;
/**
* 岗位标签
*/
@Length(max = 512,message = "岗位标签超长")
private String positionTag;
@ApiModelProperty("工作性质;工作性质 1:短工 2:全职")
private String jobCategory;
@Max(value = 30000,message = "岗位招聘人数超长")
@ApiModelProperty("岗位招聘人数")
private Integer positionNumber;
@Length(max = 255,message = "工作地址超长")
@ApiModelProperty("工作地址")
private String positionAddress;
@ApiModelProperty("招聘专员")
private Long recruitUserId;
@Length(max = 32,message = "发薪日超长")
@ApiModelProperty("发薪日")
private String payDate;
@Length(max = 2,message = "性别要求超长")
@ApiModelProperty("性别要求")
private String sexRequire;
@Length(max = 32,message = "学历要求超长")
@ApiModelProperty("学历要求")
private String educationRequire;
@Length(max = 32,message = "经验要求超长")
@ApiModelProperty("经验要求")
private String experienceRequire;
@Length(max = 32,message = "证件要求超长")
@ApiModelProperty("证件要求")
private String certificatesRequire;
@Length(max = 32,message = "其他要求超长")
@ApiModelProperty("其他要求")
private String otherRequire;
@ApiModelProperty("工作内容")
private String jobContent;
private Long addressId;
/**
* 招聘岗位类型
*/
@Length(max = 2,message = "招聘岗位类型超长")
@NotBlank(message = "请选择招聘岗位类型")
private String recruitPositionType;
private Long positionAuditId;
/**
* 版本号
*/
private Integer version;
/**
* 岗位相册json
*/
private String fileJson;
/**
* 年龄上限
*/
private Integer ageUp;
/**
* 年龄下限
*/
private Integer ageLow;
/**
* 薪资上限
*/
private BigDecimal salaryUp;
/**
* 薪资下限
*/
private BigDecimal salaryLow;
/**
* 薪资类型
*/
private String salaryType;
/**
* 结束日期
*/
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
@NotNull(message = "有效期截止日期不能为空")
private Date endTime;
}

View File

@@ -0,0 +1,121 @@
package com.newyetai.recruit.position.dto;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.newyetai.common.dto.PageQueryDTO;
import org.springframework.format.annotation.DateTimeFormat;
import java.util.Date;
import java.util.List;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
/**
* 岗位信息表;岗位信息表
*
* @author guixinman
* @since 1.0.0 2024-04-11
*/
@ApiModel("岗位信息表;岗位信息表")
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode(callSuper = true)
public class PositionNewPageQueryDTO extends PageQueryDTO<PositionNewDTO> {
private static final long serialVersionUID = 1L;
private Long id;
private List<Long> ids;
@ApiModelProperty("机构ID")
private Long orgId;
@ApiModelProperty("公司ID ;hr_company")
private Long companyId;
@ApiModelProperty("岗位状态:1:开启 2:关闭")
private String status;
@ApiModelProperty("岗位名称 (模糊匹配)")
private String positionNameLike;
@ApiModelProperty("招聘标题")
private String recruitTitle;
private String recruitTitleLike;
private String positionTagLike;
@ApiModelProperty("岗位类型")
private String positionType;
@ApiModelProperty("工作性质;工作性质 1:短工 2:全职")
private String jobCategory;
@ApiModelProperty("岗位招聘人数")
private Integer positionNumber;
@ApiModelProperty("工作地址")
private String positionAddress;
@ApiModelProperty("招聘专员")
private Long recruitUserId;
@ApiModelProperty("发薪日")
private String payDate;
@ApiModelProperty("性别要求")
private String sexRequire;
@ApiModelProperty("学历要求")
private String educationRequire;
@ApiModelProperty("经验要求")
private String experienceRequire;
@ApiModelProperty("证件要求")
private String certificatesRequire;
@ApiModelProperty("其他要求")
private String otherRequire;
@ApiModelProperty("工作内容")
private String jobContent;
@ApiModelProperty("创建时间起,格式 (yyyy-MM-dd HH:mm:ss)")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date createTimeStart;
@ApiModelProperty("创建时间止,格式 (yyyy-MM-dd HH:mm:ss)")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date createTimeEnd;
@ApiModelProperty("更新时间起,格式 (yyyy-MM-dd HH:mm:ss)")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date updateTimeStart;
@ApiModelProperty("更新时间止,格式 (yyyy-MM-dd HH:mm:ss)")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date updateTimeEnd;
/**
* 招聘岗位类型
*/
private String recruitPositionType;
private String recruitPositionTypeName;
}

View File

@@ -0,0 +1,161 @@
package com.newyetai.recruit.position.dto;
import cn.hutool.core.date.DateUtil;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.newyetai.common.annotation.trimAndUpper.TrimAndUpper;
import org.hibernate.validator.constraints.Length;
import org.springframework.format.annotation.DateTimeFormat;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
import javax.validation.constraints.Max;
import javax.validation.constraints.Min;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import java.math.BigDecimal;
import java.util.Date;
import java.util.Objects;
import java.util.Set;
/**
* 岗位信息表;岗位信息表
*
* @author guixinman
* @since 1.0.0 2024-04-11
*/
@ApiModel("岗位信息表;岗位信息表")
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class PositionOperatorDTO implements Serializable {
private static final long serialVersionUID = 1L;
private Long id;
//开启招聘 关闭招聘用
private Set<Long> ids;
@ApiModelProperty("机构ID")
private Long orgId;
@NotNull(message = "请选择用工企业")
@ApiModelProperty("公司ID ;hr_company")
private Long companyId;
@ApiModelProperty("岗位状态:1:开启 2:关闭")
private String status;
@Length(max = 50,message = "岗位名称超长")
@TrimAndUpper(value = TrimAndUpper.ExecuteType.TRIM)
@NotBlank(message = "岗位名称不能为空")
@ApiModelProperty("岗位名称")
private String positionName;
@Length(max = 255,message = "招聘标题超长")
@TrimAndUpper(value = TrimAndUpper.ExecuteType.TRIM)
@ApiModelProperty("招聘标题")
private String recruitTitle;
@ApiModelProperty("岗位类型")
private String positionType;
/**
* 岗位标签
*/
@Length(max = 512,message = "岗位标签超长")
private String positionTag;
@ApiModelProperty("工作性质;工作性质 1:短工 2:全职")
private String jobCategory;
@Max(value = 30000,message = "岗位招聘人数超长")
@ApiModelProperty("岗位招聘人数")
private Integer positionNumber;
@Length(max = 255,message = "工作地址超长")
@ApiModelProperty("工作地址")
private String positionAddress;
@ApiModelProperty("招聘专员")
private Long recruitUserId;
@Length(max = 32,message = "发薪日超长")
@ApiModelProperty("发薪日")
private String payDate;
@Length(max = 2,message = "性别要求超长")
@ApiModelProperty("性别要求")
private String sexRequire;
@Length(max = 32,message = "学历要求超长")
@ApiModelProperty("学历要求")
private String educationRequire;
@Length(max = 32,message = "经验要求超长")
@ApiModelProperty("经验要求")
private String experienceRequire;
@Length(max = 32,message = "证件要求超长")
@ApiModelProperty("证件要求")
private String certificatesRequire;
@Length(max = 32,message = "其他要求超长")
@ApiModelProperty("其他要求")
private String otherRequire;
@ApiModelProperty("工作内容")
private String jobContent;
private Long addressId;
/**
* 招聘岗位类型
*/
@Length(max = 2,message = "招聘岗位类型超长")
@NotBlank(message = "请选择招聘岗位类型")
private String recruitPositionType;
/**
* 年龄上限
*/
private Integer ageUp;
/**
* 年龄下限
*/
@Min(value = 18,message = "年龄下限不低于18周岁")
private Integer ageLow;
/**
* 薪资上限
*/
private BigDecimal salaryUp;
/**
* 薪资下限
*/
private BigDecimal salaryLow;
/**
* 薪资类型
*/
private String salaryType;
/**
* 结束日期
*/
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date endTime;
}

View File

@@ -0,0 +1,151 @@
package com.newyetai.recruit.position.dto;
import com.newyetai.common.dto.PageQueryDTO;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.*;
import com.fasterxml.jackson.annotation.JsonFormat;
import org.springframework.format.annotation.DateTimeFormat;
import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
/**
* 岗位信息表;岗位信息表
*
* @author guixinman
* @since 1.0.0 2024-04-11
*/
@ApiModel("岗位信息表;岗位信息表")
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode(callSuper = true)
public class PositionPageQueryDTO extends PageQueryDTO<PositionDTO> {
private static final long serialVersionUID = 1L;
private Long id;
private List<Long> ids;
@ApiModelProperty("机构ID")
private Long orgId;
@ApiModelProperty("公司ID ;hr_company")
private Long companyId;
@ApiModelProperty("岗位状态:1:开启 2:关闭")
private String status;
@ApiModelProperty("岗位名称 (模糊匹配)")
private String positionNameLike;
@ApiModelProperty("招聘标题")
private String recruitTitle;
private String recruitTitleLike;
private String positionTagLike;
@ApiModelProperty("岗位类型")
private String positionType;
@ApiModelProperty("工作性质;工作性质 1:短工 2:全职")
private String jobCategory;
@ApiModelProperty("岗位招聘人数")
private Integer positionNumber;
@ApiModelProperty("工作地址")
private String positionAddress;
@ApiModelProperty("招聘专员")
private Long recruitUserId;
@ApiModelProperty("发薪日")
private String payDate;
@ApiModelProperty("性别要求")
private String sexRequire;
@ApiModelProperty("学历要求")
private String educationRequire;
@ApiModelProperty("经验要求")
private String experienceRequire;
@ApiModelProperty("证件要求")
private String certificatesRequire;
@ApiModelProperty("其他要求")
private String otherRequire;
@ApiModelProperty("工作内容")
private String jobContent;
@ApiModelProperty("创建时间起,格式 (yyyy-MM-dd HH:mm:ss)")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date createTimeStart;
@ApiModelProperty("创建时间止,格式 (yyyy-MM-dd HH:mm:ss)")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date createTimeEnd;
@ApiModelProperty("更新时间起,格式 (yyyy-MM-dd HH:mm:ss)")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date updateTimeStart;
@ApiModelProperty("更新时间止,格式 (yyyy-MM-dd HH:mm:ss)")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date updateTimeEnd;
/**
* 招聘岗位类型
*/
private String recruitPositionType;
private String recruitPositionTypeName;
/**
* 查询sql是否判断 有效期
*/
@Builder.Default
private Boolean useEndTime = Boolean.TRUE;
/**
* 经度
*/
private BigDecimal longitude;
/**
* 纬度
*/
private BigDecimal latitude;
/**
* 千米
*/
private int radius;
private BigDecimal minX;
private BigDecimal maxX;
private BigDecimal minY;
private BigDecimal maxY;
private BigDecimal salaryUp;
private BigDecimal salaryLow;
}

View File

@@ -0,0 +1,106 @@
package com.newyetai.recruit.position.dto;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
import com.fasterxml.jackson.annotation.JsonFormat;
import org.springframework.format.annotation.DateTimeFormat;
import java.util.Date;
/**
* 岗位信息表;岗位信息表
*
* @author guixinman
* @since 1.0.0 2024-04-11
*/
@ApiModel("岗位信息表;岗位信息表")
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class PositionQueryDTO implements Serializable {
private static final long serialVersionUID = 1L;
private Long id;
@ApiModelProperty("机构ID")
private Long orgId;
@ApiModelProperty("公司ID ;hr_company")
private Long companyId;
@ApiModelProperty("岗位状态:1:开启 2:关闭")
private String status;
@ApiModelProperty("岗位名称 (模糊匹配)")
private String positionNameLike;
@ApiModelProperty("招聘标题")
private String recruitTitle;
@ApiModelProperty("岗位类型")
private String positionType;
@ApiModelProperty("工作性质;工作性质 1:短工 2:全职")
private String jobCategory;
@ApiModelProperty("岗位招聘人数")
private Integer positionNumber;
@ApiModelProperty("工作地址")
private String positionAddress;
@ApiModelProperty("招聘专员")
private Long recruitUserId;
@ApiModelProperty("发薪日")
private String payDate;
@ApiModelProperty("性别要求")
private String sexRequire;
@ApiModelProperty("学历要求")
private String educationRequire;
@ApiModelProperty("经验要求")
private String experienceRequire;
@ApiModelProperty("证件要求")
private String certificatesRequire;
@ApiModelProperty("其他要求")
private String otherRequire;
@ApiModelProperty("工作内容")
private String jobContent;
@ApiModelProperty("创建时间起,格式 (yyyy-MM-dd HH:mm:ss)")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date createTimeStart;
@ApiModelProperty("创建时间止,格式 (yyyy-MM-dd HH:mm:ss)")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date createTimeEnd;
@ApiModelProperty("更新时间起,格式 (yyyy-MM-dd HH:mm:ss)")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date updateTimeStart;
@ApiModelProperty("更新时间止,格式 (yyyy-MM-dd HH:mm:ss)")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date updateTimeEnd;
}

View File

@@ -0,0 +1,123 @@
package com.newyetai.recruit.position.dto;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.newyetai.common.dto.BaseDTO;
import com.newyetai.common.util.IdcardUtils;
import com.newyetai.recruit.user.dto.JobExpectDTO;
import com.newyetai.recruit.user.dto.UserCertificateDTO;
import org.springframework.format.annotation.DateTimeFormat;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.*;
import lombok.experimental.SuperBuilder;
import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
/**
* 岗位报名信息表
*
* @author guixinman
* @since 1.0.0 2024-04-15
*/
@ApiModel("岗位报名信息表")
@Data
@SuperBuilder
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode(callSuper = true)
public class PositionRegistrationDTO extends BaseDTO {
private static final long serialVersionUID = 1L;
@ApiModelProperty("岗位ID")
private Long positionId;
@ApiModelProperty("用户ID ")
private Long userId;
@ApiModelProperty("状态:1已报名、2待面试、3面试不通过、4待入职、5已入职、 6已离职、 7结束招聘")
private String status;
@ApiModelProperty("面试时间")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date interviewTime;
@ApiModelProperty("面试地点")
private String interviewLocation;
@ApiModelProperty("入职时间")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date inductionTime;
@ApiModelProperty("离职时间")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date quitTime;
@ApiModelProperty("终止时间")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date terminationTime;
@ApiModelProperty("入职薪水")
private BigDecimal salary;
@ApiModelProperty("备注")
private String remark;
private String positionName;
private Long companyId;
private String companyName;
private String realName;
private String cardNo;
private String phone;
/**
* 招聘专员
*/
private String recruitUserName;
@ApiModelProperty("性别")
private String gender;
@ApiModelProperty("年龄")
private Integer age;
@ApiModelProperty("所在城市")
private String cityCode;
private String cityCodeName;
@ApiModelProperty("简历")
private String resumeFileCode;
@ApiModelProperty("求职期望")
private List<JobExpectDTO> jobExpectDTOList;
@ApiModelProperty("证书")
private List<UserCertificateDTO> userCertificateDTOList;
private Boolean show;
@ApiModelProperty("所属街道名称")
private String streetName;
@ApiModelProperty("发布机构名称")
private String publishOrgName;
public void setCardNo(String cardNo) {
this.setAge(IdcardUtils.getAgeByIDNumber(cardNo));
this.setGender(IdcardUtils.judgeGender(cardNo));
this.cardNo = cardNo;
}
}

View File

@@ -0,0 +1,88 @@
package com.newyetai.recruit.position.dto;
import com.alibaba.excel.annotation.ExcelProperty;
import java.io.Serializable;
import java.math.BigDecimal;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @description: 招聘管理导出dto(全部)
* @author: guixinman
* @create: 2024-04-16 17:17
**/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class PositionRegistrationExportDTO implements Serializable {
@ExcelProperty("岗位名称")
@ApiModelProperty("岗位名称")
private String positionName;
@ApiModelProperty("姓名")
@ExcelProperty("姓名")
private String realName;
@ApiModelProperty("性别")
@ExcelProperty("性别")
private String gender;
@ApiModelProperty("年龄")
@ExcelProperty("年龄")
private Integer age;
@ApiModelProperty("手机号")
@ExcelProperty("手机号")
private String phone;
@ApiModelProperty("身份证号")
@ExcelProperty("身份证号")
private String cardNo;
@ExcelProperty("用工企业")
@ApiModelProperty("用工企业")
private String companyName;
@ExcelProperty("招聘状态")
@ApiModelProperty("招聘状态")
private String status;
@ExcelProperty("所属街道")
@ApiModelProperty("所属街道名称")
private String streetName;
@ExcelProperty("发布机构")
@ApiModelProperty("发布机构名称")
private String publishOrgName;
@ExcelProperty("面试时间")
@ApiModelProperty("面试时间")
private String interviewTime;
@ExcelProperty("面试地点")
@ApiModelProperty("面试地点")
private String interviewLocation;
@ExcelProperty("入职薪资")
@ApiModelProperty("入职薪资")
private BigDecimal salary;
@ApiModelProperty("报名时间")
@ExcelProperty("报名时间")
private String createTime;
@ApiModelProperty("入职时间")
@ExcelProperty("入职时间")
private String inductionTime;
@ApiModelProperty("离职时间")
@ExcelProperty("离职时间")
private String quitTime;
}

View File

@@ -0,0 +1,82 @@
package com.newyetai.recruit.position.dto;
import com.fasterxml.jackson.annotation.JsonFormat;
import org.hibernate.validator.constraints.Length;
import org.springframework.format.annotation.DateTimeFormat;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.*;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
import java.util.Set;
import javax.validation.constraints.NotNull;
/**
* 岗位报名信息表
*
* @author guixinman
* @since 1.0.0 2024-04-15
*/
@ApiModel("岗位报名信息表")
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class PositionRegistrationOperatorDTO implements Serializable {
private static final long serialVersionUID = 1L;
private Long id;
private Set<Long> ids;
private Set<Long> userIds;
@NotNull(message = "请选择岗位")
@ApiModelProperty("岗位ID")
private Long positionId;
@ApiModelProperty("用户ID ")
private Long userId;
@NotNull(message = "请选择招聘状态")
@ApiModelProperty("状态:1已报名、2待面试、3面试不通过、4待入职、5已入职、 6已离职、 7结束招聘")
private String status;
@ApiModelProperty("面试时间")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date interviewTime;
@Length(max = 100,message = "面试地点长度超过最大限制")
@ApiModelProperty("面试地点")
private String interviewLocation;
@ApiModelProperty("入职时间")
@DateTimeFormat(pattern = "yyyy-MM-dd")
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd", timezone = "GMT+8")
private Date inductionTime;
@ApiModelProperty("离职时间")
@DateTimeFormat(pattern = "yyyy-MM-dd")
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd", timezone = "GMT+8")
private Date quitTime;
@ApiModelProperty("终止时间")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date terminationTime;
@ApiModelProperty("入职薪水")
private BigDecimal salary;
@ApiModelProperty("备注")
private String remark;
private Boolean show;
}

View File

@@ -0,0 +1,136 @@
package com.newyetai.recruit.position.dto;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.newyetai.common.dto.PageQueryDTO;
import org.springframework.format.annotation.DateTimeFormat;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.*;
import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
import java.util.Set;
/**
* 岗位报名信息表
*
* @author guixinman
* @since 1.0.0 2024-04-15
*/
@ApiModel("岗位报名信息表")
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode(callSuper = true)
public class PositionRegistrationPageQueryDTO extends PageQueryDTO<PositionRegistrationDTO> {
private static final long serialVersionUID = 1L;
private Long id;
private Long orgId;
@ApiModelProperty("发布机构id")
private Long publishOrgId;
@ApiModelProperty("所属街道机构id")
private Long queryStreetOrgId;
@ApiModelProperty("所属街道机构子级orgids")
private Set<Long> queryStreetChildrenAllOrgIds;
private Set<Long> orgIds;
@ApiModelProperty("岗位ID")
private Long positionId;
@ApiModelProperty("用户ID ")
private Long userId;
@ApiModelProperty("状态:1已报名、2待面试、3面试不通过、4待入职、5已入职、 6已离职、 7结束招聘")
private String status;
private List<String> statusList;
@ApiModelProperty("面试时间")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date interviewTime;
@ApiModelProperty("入职时间")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date inductionTime;
@ApiModelProperty("离职时间")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date quitTime;
@ApiModelProperty("终止时间")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date terminationTime;
@ApiModelProperty("入职薪水")
private BigDecimal salary;
@ApiModelProperty("备注")
private String remark;
@ApiModelProperty("创建时间起,格式 (yyyy-MM-dd HH:mm:ss)")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date createTimeStart;
@ApiModelProperty("创建时间止,格式 (yyyy-MM-dd HH:mm:ss)")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date createTimeEnd;
@ApiModelProperty("更新时间起,格式 (yyyy-MM-dd HH:mm:ss)")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date updateTimeStart;
@ApiModelProperty("更新时间止,格式 (yyyy-MM-dd HH:mm:ss)")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date updateTimeEnd;
/**
* 用工企业id
**/
private Long companyId;
/**
* 姓名
**/
private String realNameLike;
private Set<String> realNames;
/**
* 手机号
**/
private String phoneLike;
private Set<String> phones;
/**
* 身份证
**/
private String cardNoLike;
private Set<String> cardNos;
private Boolean show;
/**
* 是否查看自己+子级orgId
*/
private Boolean childrenOrgAll;
}

View File

@@ -0,0 +1,106 @@
package com.newyetai.recruit.position.dto;
import com.newyetai.common.dto.BaseDTO;
import com.newyetai.common.util.TreeNode;
import org.apache.commons.compress.utils.Lists;
import org.apache.commons.lang3.StringUtils;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;
import cn.hutool.core.collection.CollUtil;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
import lombok.experimental.SuperBuilder;
/**
* <p>
* 用户岗位类型
* </p>
*
* @author Carlye
* @since 2021-01-21
*/
@Data
@SuperBuilder
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode(callSuper = true)
public class PositionTypeDTO extends BaseDTO implements TreeNode<Long, PositionTypeDTO> {
private static final long serialVersionUID = 2154317236704975221L;
/**
* 文件名称
*/
private String name;
/**
* 文件编码
*/
private String code;
/**
* 岗位ID
*/
private Long parentId;
/**
* 招聘岗位类型
*/
private String recruitPositionType;
private List<PositionTypeDTO> childrenSet;
public List<PositionTypeDTO> getChildrenSet() {
if (Objects.isNull(childrenSet)) {
childrenSet = Lists.newArrayList();
}
return childrenSet;
}
@Override
public void addChildren(PositionTypeDTO node) {
getChildrenSet().add(node);
}
/**
* 复制,不复制子元素
*
* @return {@link PositionTypeDTO}
*/
public PositionTypeDTO copy() {
PositionTypeDTO positionTypeDTO = new PositionTypeDTO();
positionTypeDTO.setCode(code);
positionTypeDTO.setName(name);
positionTypeDTO.setParentId(parentId);
return positionTypeDTO;
}
public static PositionTypeDTO search(PositionTypeDTO parent, PositionTypeQueryDTO queryDTO) {
String name = parent.getName();
String code = parent.getCode();
List<PositionTypeDTO> childrenSet = parent.getChildrenSet();
if ((StringUtils.isNotEmpty(queryDTO.getNameLike()) && StringUtils.contains(name, queryDTO.getNameLike())) || (CollUtil.isNotEmpty(queryDTO.getTypeCodes()) && queryDTO.getTypeCodes().contains(code))) {
if (CollUtil.isNotEmpty(childrenSet)) {
parent.setChildrenSet(null);
}
return parent;
} else {
if (CollUtil.isNotEmpty(childrenSet)) {
List<PositionTypeDTO> collect = childrenSet.stream().map(child -> search(child, queryDTO))
.filter(Objects::nonNull).collect(
Collectors.toList());
if (CollUtil.isEmpty(collect)) {
return null;
}
parent.setChildrenSet(collect);
return parent;
}
}
return null;
}
}

View File

@@ -0,0 +1,40 @@
package com.newyetai.recruit.position.dto;
import java.io.Serializable;
import java.util.Set;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* <p>
* 用户岗位类型 - 查询DTO
* </p>
*
* @author Carlye
* @since 2021-01-21
*/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class PositionTypeQueryDTO implements Serializable {
private static final long serialVersionUID = -618123250962943084L;
/**
* 文件名称
*/
private String nameLike;
/**
* 类型编码
*/
private Set<String> typeCodes;
/**
* 招聘岗位类型
*/
private String recruitPositionType;
}

View File

@@ -0,0 +1,32 @@
package com.newyetai.recruit.position.dto;
import com.fasterxml.jackson.annotation.JsonFormat;
import org.springframework.format.annotation.DateTimeFormat;
import java.io.Serializable;
import java.util.Date;
import java.util.Set;
import javax.validation.constraints.NotNull;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
* @description: 离职dto
* @author: guixinman
* @create: 2024-04-16 15:17
**/
@Data
public class ResignedDTO implements Serializable {
@NotNull(message = "请选择离职时间")
@ApiModelProperty("离职时间")
@DateTimeFormat(pattern = "yyyy-MM-dd")
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd", timezone = "GMT+8")
private Date quitTime;
@NotNull(message = "请选择数据")
private Set<Long> ids;
}

View File

@@ -0,0 +1,19 @@
package com.newyetai.recruit.position.dto;
import java.io.Serializable;
import javax.validation.constraints.NotNull;
import lombok.Data;
/**
* @description: 用户端报名岗位
* @author: guixinman
* @create: 2024-04-15 16:29
**/
@Data
public class UserPositionRegistrationDTO implements Serializable {
@NotNull(message = "请选择岗位")
private Long positionId;
}

View File

@@ -0,0 +1,33 @@
package com.newyetai.recruit.position.dto;
import com.newyetai.common.dto.PageQueryDTO;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
/**
* @description: 用户端查询我的报名
* @author: guixinman
* @create: 2024-04-19 09:31
**/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode(callSuper = true)
public class UserPositionRegistrationPageQueryDTO extends PageQueryDTO<UserPositionRegistrationResDTO> {
private Long id;
private Long userId;
@ApiModelProperty("状态:1已报名、2待面试、3面试不通过、4待入职、5已入职、 6已离职、 7结束招聘")
private String status;
private Long positionId;
}

View File

@@ -0,0 +1,122 @@
package com.newyetai.recruit.position.dto;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.newyetai.component.dict.util.DictUtils;
import org.springframework.format.annotation.DateTimeFormat;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;
import java.util.Objects;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
* @description: 用户端我的报名
* @author: guixinman
* @create: 2024-04-19 09:26
**/
@Data
public class UserPositionRegistrationResDTO implements Serializable {
private Long id;
private Long positionId;
@ApiModelProperty("岗位名称")
private String positionName;
@ApiModelProperty("招聘标题")
private String recruitTitle;
@ApiModelProperty("岗位标签")
private String positionTag;
@ApiModelProperty("工作地址")
private String positionAddress;
@ApiModelProperty("招聘专员")
private String recruitUserName;
private String companyName;
private String companyLogo;
private String positionFileCode;
private String status;
@ApiModelProperty("报名时间")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date createTime;
@ApiModelProperty("面试时间")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date interviewTime;
@ApiModelProperty("面试地点")
private String interviewLocation;
@ApiModelProperty("备注")
private String remark;
@ApiModelProperty("入职时间")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date inductionTime;
@ApiModelProperty("入职薪资")
private BigDecimal salary;
/**
* 招聘岗位类型
*/
private String recruitPositionType;
private String recruitPositionTypeName;
/**
* 薪资上限
*/
private BigDecimal salaryUp;
/**
* 薪资下限
*/
private BigDecimal salaryLow;
/**
* 薪资类型
*/
private String salaryType;
private String salaryStr;
private Boolean show;
/**
* 详细地址
*/
private String detailAddress;
public String getSalaryStr() {
String salary = "";
if (Objects.nonNull(this.getSalaryUp()) && Objects.nonNull(this.getSalaryLow())) {
salary = String.format("%s~%s元/%s", this.getSalaryLow(), this.getSalaryUp(), DictUtils.getCodeNameMap("salary_type").get(String.valueOf(this.getSalaryType())));
if (this.getSalaryLow().compareTo(this.getSalaryUp()) == 0) {
salary = String.format("%s元/%s", this.getSalaryUp(), DictUtils.getCodeNameMap("salary_type").get(String.valueOf(this.getSalaryType())));
}
} else if (Objects.nonNull(this.getSalaryLow()) && Objects.isNull(this.getSalaryUp())) {
salary = String.format("%s元/%s", this.getSalaryLow(), DictUtils.getCodeNameMap("salary_type").get(String.valueOf(this.getSalaryType())));
} else if (Objects.isNull(this.getSalaryLow()) && Objects.nonNull(this.getSalaryUp())) {
salary = String.format("%s元/%s", this.getSalaryUp(), DictUtils.getCodeNameMap("salary_type").get(String.valueOf(this.getSalaryType())));
} else if (Objects.isNull(this.getSalaryLow()) && Objects.isNull(this.getSalaryUp())) {
salary = "薪资面议";
}
return salary;
}
}

View File

@@ -0,0 +1,145 @@
package com.newyetai.recruit.position.entity;
import io.swagger.annotations.ApiModelProperty;
import lombok.*;
import com.baomidou.mybatisplus.annotation.*;
import com.newyetai.common.entity.BaseEntity;
import java.math.BigDecimal;
import java.util.Date;
/**
* 岗位导入
*
* @author guixinman
* @since 1.0.0 2024-04-12
*/
@TableName(value = "hr_import_detail_position")
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode(callSuper = true)
public class ImportDetailPosition extends BaseEntity {
private static final long serialVersionUID = 1L;
/**
* 导入任务ID
*/
private Long mainId;
/**
* 机构ID
*/
private Long orgId;
/**
* 模板全量数据
*/
private String dataJson;
/**
* 公司ID ;hr_company
*/
private Long companyId;
/**
* 岗位名称
*/
private String positionName;
/**
* 招聘标题
*/
private String recruitTitle;
/**
* 岗位招聘人数
*/
private Integer positionNumber;
/**
* 工作地址
*/
private String positionAddress;
/**
* 岗位性质 数据字典
*/
private String recruitPositionType;
/**
* 发薪日
*/
private String payDate;
/**
* 性别要求
*/
private String sexRequire;
/**
* 学历要求
*/
private String educationRequire;
/**
* 经验要求
*/
private String experienceRequire;
/**
* 证件要求
*/
private String certificatesRequire;
/**
* 其他要求
*/
private String otherRequire;
/**
* 工作内容
*/
private String jobContent;
/**
* 明细状态
*/
private Integer detailStatus;
/**
* 失败原因
*/
private String failReason;
/**
* 外部生成明细id
*/
private Long extraDetailId;
/**
* 备注
*/
private String remark;
@ApiModelProperty("岗位类型")
private String positionTypeName;
@ApiModelProperty("岗位标签")
private String positionTag;
/**
* 年龄上限
*/
private Integer ageUp;
/**
* 年龄下限
*/
private Integer ageLow;
/**
* 薪资上限
*/
private BigDecimal salaryUp;
/**
* 薪资下限
*/
private BigDecimal salaryLow;
/**
* 薪资类型
*/
private String salaryType;
/**
* 结束日期
*/
private Date endTime;
}

View File

@@ -0,0 +1,142 @@
package com.newyetai.recruit.position.entity;
import lombok.*;
import lombok.experimental.SuperBuilder;
import com.baomidou.mybatisplus.annotation.*;
import com.newyetai.common.entity.BaseEntity;
import java.math.BigDecimal;
import java.util.Date;
/**
* 岗位信息表;岗位信息表
*
* @author guixinman
* @since 1.0.0 2024-04-11
*/
@TableName(value = "hr_position")
@Data
@SuperBuilder
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode(callSuper = true)
public class Position extends BaseEntity {
private static final long serialVersionUID = 1L;
/**
* 机构ID
*/
private Long orgId;
/**
* 公司ID ;hr_company
*/
private Long companyId;
/**
* 岗位状态:1:开启 2:关闭
*/
private String status;
/**
* 岗位名称
*/
private String positionName;
/**
* 招聘标题
*/
private String recruitTitle;
/**
* 岗位类型
*/
private String positionType;
/**
* 岗位标签
*/
private String positionTag;
/**
* 工作性质;工作性质 1:短工 2:全职
*/
private String jobCategory;
/**
* 岗位招聘人数
*/
private Integer positionNumber;
/**
* 工作地址
*/
private String positionAddress;
/**
* 招聘专员
*/
private Long recruitUserId;
/**
* 发薪日
*/
private String payDate;
/**
* 性别要求
*/
private String sexRequire;
/**
* 学历要求
*/
private String educationRequire;
/**
* 经验要求
*/
private String experienceRequire;
/**
* 证件要求
*/
private String certificatesRequire;
/**
* 其他要求
*/
private String otherRequire;
/**
* 工作内容
*/
private String jobContent;
private Long addressId;
/**
* 招聘岗位类型
*/
private String recruitPositionType;
/**
* 年龄上限
*/
private Integer ageUp;
/**
* 年龄下限
*/
private Integer ageLow;
/**
* 薪资上限
*/
private BigDecimal salaryUp;
/**
* 薪资下限
*/
private BigDecimal salaryLow;
/**
* 薪资类型
*/
private String salaryType;
/**
* 结束日期
*/
private Date endTime;
}

View File

@@ -0,0 +1,59 @@
package com.newyetai.recruit.position.entity;
import com.baomidou.mybatisplus.annotation.TableName;
import com.newyetai.common.entity.BaseEntity;
import java.math.BigDecimal;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
/**
* 岗位地址
*
* @author Carlye
* @date 2022/03/29
*/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode(callSuper = true)
@Accessors(chain = true)
@TableName(value = "hr_position_address")
public class PositionAddress extends BaseEntity {
private static final long serialVersionUID = -4055388034868470586L;
/**
* 公司ID
*/
private Long companyId;
/**
* 区域编码(31)
*/
private String districtCode;
/**
* 区域名称 (上海市)
*/
private String districtName;
/**
* 详细地址 (浦东新区黄金大厦B座)
*/
private String detailAddress;
/**
* 经度
*/
private BigDecimal longitude;
/**
* 纬度
*/
private BigDecimal latitude;
}

View File

@@ -0,0 +1,158 @@
package com.newyetai.recruit.position.entity;
import lombok.*;
import com.baomidou.mybatisplus.annotation.*;
import java.math.BigDecimal;
import java.util.Date;
import com.newyetai.common.entity.BaseEntity;
/**
* 岗位审核表
*
* @author guixinman
* @since 1.0.0 2024-07-05
*/
@TableName(value = "hr_position_audit")
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode(callSuper = true)
public class PositionAudit extends BaseEntity {
private static final long serialVersionUID = 1L;
/**
*
*/
private Long positionId;
/**
*
*/
private Long orgId;
/**
* hr_company主键
*/
private Long companyId;
/**
* 岗位名称
*/
private String positionName;
/**
* 招聘标题
*/
private String recruitTitle;
/**
* 岗位类型
*/
private String positionType;
/**
* 工作性质 1:短工 2:全职
*/
private String jobCategory;
/**
* 岗位招聘人数
*/
private Integer positionNumber;
/**
* 工作地址
*/
private String positionAddress;
/**
* 招聘专员
*/
private Long recruitUserId;
/**
* 发薪日
*/
private String payDate;
/**
* 性别要求
*/
private String sexRequire;
/**
* 学历要求
*/
private String educationRequire;
/**
* 经验要求
*/
private String experienceRequire;
/**
* 证件要求
*/
private String certificatesRequire;
/**
* 其他要求
*/
private String otherRequire;
/**
* 工作内容
*/
private String jobContent;
/**
* 岗位标签
*/
private String positionTag;
/**
*
*/
private Long addressId;
/**
* 招聘岗位类型数据字典
*/
private String recruitPositionType;
/**
* 审核状态 1:待审核 2.审核成功 3.审核失败
*/
private String auditStatus;
/**
* 审核失败原因
*/
private String auditFailMsg;
/**
* 版本号
*/
private Integer version;
/**
* 岗位相册json
*/
private String fileJson;
/**
* 年龄上限
*/
private Integer ageUp;
/**
* 年龄下限
*/
private Integer ageLow;
/**
* 薪资上限
*/
private BigDecimal salaryUp;
/**
* 薪资下限
*/
private BigDecimal salaryLow;
/**
* 薪资类型
*/
private String salaryType;
/**
* 结束日期
*/
private Date endTime;
}

View File

@@ -0,0 +1,70 @@
package com.newyetai.recruit.position.entity;
import com.baomidou.mybatisplus.annotation.TableName;
import com.newyetai.common.entity.BaseEntity;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
import lombok.experimental.SuperBuilder;
/**
* <p>
* 用户岗位 文件
* </p>
*
* @author Carlye
* @since 2021-01-21
*/
@Data
@SuperBuilder
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode(callSuper = true)
@Accessors(chain = true)
@TableName("hr_position_file")
public class PositionFile extends BaseEntity {
private static final long serialVersionUID = -1475024067817143931L;
/**
* 岗位ID
*/
private Long positionId;
/**
* 文件名称
*/
private String fileName;
/**
* 文件编码
*/
private String fileCode;
/**
* 文件后缀
*/
private String fileSuffix;
/**
* 默认显示
*/
private Boolean defaultShow;
/**
* 文件类型
*/
private String fileType;
/**
* 排序
*/
private Integer sort;
/**
* 描述
*/
private String description;
}

View File

@@ -0,0 +1,78 @@
package com.newyetai.recruit.position.entity;
import com.baomidou.mybatisplus.annotation.TableName;
import com.newyetai.common.entity.BaseEntity;
import com.newyetai.component.action.annotation.ActionField;
import com.newyetai.component.action.annotation.ActionModel;
import java.math.BigDecimal;
import java.util.Date;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
import lombok.experimental.SuperBuilder;
/**
* 岗位报名信息表
*
* @author guixinman
* @since 1.0.0 2024-04-15
*/
@TableName(value = "hr_position_registration")
@Data
@SuperBuilder
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode(callSuper = true)
@ActionModel(type = "hr_position_registration")
public class PositionRegistration extends BaseEntity {
private static final long serialVersionUID = 1L;
/**
* 岗位ID
*/
private Long positionId;
/**
* 用户ID
*/
private Long userId;
/**
* 状态:1已报名、2待面试、3面试不通过、4待入职、5已入职、 6已离职、 7结束招聘
*/
@ActionField(alias = "报名状态", dictCode = "position_registration_status")
private String status;
/**
* 面试时间
*/
private Date interviewTime;
@ApiModelProperty("面试地点")
private String interviewLocation;
/**
* 入职时间
*/
private Date inductionTime;
/**
* 离职时间
*/
private Date quitTime;
/**
* 终止时间
*/
private Date terminationTime;
/**
* 入职薪水
*/
private BigDecimal salary;
/**
* 备注
*/
private String remark;
private Boolean show;
}

View File

@@ -0,0 +1,60 @@
package com.newyetai.recruit.position.entity;
import com.baomidou.mybatisplus.annotation.TableName;
import com.newyetai.common.entity.BaseEntity;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
/**
* <p>
* 用户岗位类型
* </p>
*
* @author Carlye
* @since 2021-01-21
*/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode(callSuper = true)
@Accessors(chain = true)
@TableName(value = "hr_position_type")
public class PositionType extends BaseEntity {
private static final long serialVersionUID = 2154317236704975221L;
/**
* 岗位ID
*/
private Long parentId;
/**
* 文件名称
*/
private String name;
/**
* 文件编码
*/
private String code;
/**
* 全名
*/
private String fullName;
/**
* 完成code
*/
private String fullCode;
/**
* 招聘岗位类型
*/
private String recruitPositionType;
}

View File

@@ -0,0 +1,28 @@
package com.newyetai.recruit.position.enums;
public enum PositionAuditStatusEnum {
INIT("1", "待审核"),
SUCCESS("2", "审核成功"),
FAIL("3", "审核失败");
private String status;
/**
* 类型描述
*/
private String desc;
PositionAuditStatusEnum(String status, String desc) {
this.status = status;
this.desc = desc;
}
public String getStatus() {
return status;
}
public String getDesc() {
return desc;
}
}

View File

@@ -0,0 +1,43 @@
package com.newyetai.recruit.position.enums;
import java.util.Arrays;
import java.util.Objects;
public enum PositionRegistrationStatusEnum {
ALREADY_REGISTERED("1", "已报名"),
WAIT_FOR_AN_INTERVIEW("2", "待面试"),
FAIL_THE_INTERVIEW("3", "面试不通过"),
TO_BE_HIRED("4", "待入职"),
ON_THE_JOB("5", "已入职"),
RESIGNED("6", "已离职"),
TERMINATION("7", "结束招聘"),
CANCEL("8", "取消报名")
;
private String status;
/**
* 类型描述
*/
private String desc;
PositionRegistrationStatusEnum(String status, String desc) {
this.status = status;
this.desc = desc;
}
public String getStatus() {
return status;
}
public String getDesc() {
return desc;
}
public static PositionRegistrationStatusEnum find(String status){
if (Objects.isNull(status)){
return null;
}
return Arrays.stream(PositionRegistrationStatusEnum.values()).filter(e->e.getStatus().equals(status)).findFirst().orElse(null);
}
}

View File

@@ -0,0 +1,27 @@
package com.newyetai.recruit.position.enums;
public enum PositionStatusEnum {
OPEN("1", "开启"),
CLOSE("2", "关闭")
;
private String status;
/**
* 类型描述
*/
private String desc;
PositionStatusEnum(String status, String desc) {
this.status = status;
this.desc = desc;
}
public String getStatus() {
return status;
}
public String getDesc() {
return desc;
}
}

View File

@@ -0,0 +1,42 @@
package com.newyetai.recruit.position.job;
import com.newyetai.recruit.position.dto.PositionDTO;
import com.newyetai.recruit.position.dto.PositionPageQueryDTO;
import com.newyetai.recruit.position.enums.PositionStatusEnum;
import com.newyetai.recruit.position.service.PositionService;
import com.newyetai.security.util.MockUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import lombok.extern.slf4j.Slf4j;
/**
* @description: 岗位失效Job
* @author: guixinman
* @create: 2024-11-12 16:23
**/
@Slf4j
@Component
public class PositionExpiryJob {
@Autowired
private PositionService positionService;
@Scheduled(cron = "01 10 00 * * ?")
public void statistics() {
log.info("岗位有效期检测 ======开始");
MockUtils.mockPlatUser();
try {
positionService.positionExpiry();
} catch (Exception e) {
log.error(e.getMessage());
}
log.info("岗位有效期检测 ======结束");
}
}

View File

@@ -0,0 +1,97 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.newyetai.recruit.position.dao.ImportDetailPositionMapper">
<select id="list" resultType="com.newyetai.recruit.position.dto.ImportDetailPositionDTO">
SELECT t.*,hc.company_name
<include refid="queryFromSql"></include>
</select>
<select id="page" resultType="com.newyetai.recruit.position.dto.ImportDetailPositionDTO">
SELECT t.*,hc.company_name
<include refid="queryFromSql"></include>
</select>
<sql id="queryFromSql">
FROM
hr_import_detail_position t
LEFT JOIN hr_company hc ON t.company_id = hc.id AND hc.deleted = 0
WHERE t.deleted = 0
<if test='param.id != null'>
AND t.id = #{param.id}
</if>
<if test='param.mainId != null'>
AND t.main_id = #{param.mainId}
</if>
<if test='param.orgId != null'>
AND t.org_id = #{param.orgId}
</if>
<if test='param.dataJson != null and param.dataJson.trim() != ""'>
AND t.data_json = #{param.dataJson}
</if>
<if test='param.companyId != null'>
AND t.company_id = #{param.companyId}
</if>
<if test='param.positionNameLike != null and param.positionNameLike.trim() != ""'>
<bind name="positionNameLike" value="'%' + param.positionNameLike + '%'"/>
AND t.position_name like #{positionNameLike}
</if>
<if test='param.recruitTitle != null and param.recruitTitle.trim() != ""'>
AND t.recruit_title = #{param.recruitTitle}
</if>
<if test='param.positionNumber != null'>
AND t.position_number = #{param.positionNumber}
</if>
<if test='param.positionAddress != null and param.positionAddress.trim() != ""'>
AND t.position_address = #{param.positionAddress}
</if>
<if test='param.payDate != null and param.payDate.trim() != ""'>
AND t.pay_date = #{param.payDate}
</if>
<if test='param.sexRequire != null'>
AND t.sex_require = #{param.sexRequire}
</if>
<if test='param.educationRequire != null'>
AND t.education_require = #{param.educationRequire}
</if>
<if test='param.experienceRequire != null and param.experienceRequire.trim() != ""'>
AND t.experience_require = #{param.experienceRequire}
</if>
<if test='param.certificatesRequire != null and param.certificatesRequire.trim() != ""'>
AND t.certificates_require = #{param.certificatesRequire}
</if>
<if test='param.otherRequire != null and param.otherRequire.trim() != ""'>
AND t.other_require = #{param.otherRequire}
</if>
<if test='param.jobContent != null and param.jobContent.trim() != ""'>
AND t.job_content = #{param.jobContent}
</if>
<if test='param.detailStatus != null'>
AND t.detail_status = #{param.detailStatus}
</if>
<if test='param.failReason != null and param.failReason.trim() != ""'>
AND t.fail_reason = #{param.failReason}
</if>
<if test='param.extraDetailId != null'>
AND t.extra_detail_id = #{param.extraDetailId}
</if>
<if test='param.remark != null and param.remark.trim() != ""'>
AND t.remark = #{param.remark}
</if>
<if test='param.createTimeStart != null'>
AND t.create_time &gt;= #{param.createTimeStart}
</if>
<if test='param.createTimeEnd != null'>
AND t.create_time &lt;= #{param.createTimeEnd}
</if>
<if test='param.updateTimeStart != null'>
AND t.update_time &gt;= #{param.updateTimeStart}
</if>
<if test='param.updateTimeEnd != null'>
AND t.update_time &lt;= #{param.updateTimeEnd}
</if>
ORDER BY t.id DESC
</sql>
</mapper>

View File

@@ -0,0 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.newyetai.recruit.position.dao.PositionAddressMapper">
</mapper>

View File

@@ -0,0 +1,292 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.newyetai.recruit.position.dao.PositionAuditMapper">
<update id="modifyById">
update hr_position_audit
set company_id = #{param.companyId},
position_name = #{param.positionName},
recruit_title = #{param.recruitTitle},
position_type = #{param.positionType},
job_category = #{param.jobCategory},
position_number = #{param.positionNumber},
position_address = #{param.positionAddress},
recruit_user_id = #{param.recruitUserId},
pay_date = #{param.payDate},
sex_require = #{param.sexRequire},
education_require = #{param.educationRequire},
experience_require = #{param.experienceRequire},
certificates_require = #{param.certificatesRequire},
other_require = #{param.otherRequire},
job_content = #{param.jobContent},
position_tag = #{param.positionTag},
address_id = #{param.addressId},
recruit_position_type = #{param.recruitPositionType},
file_json = #{param.fileJson},
age_up = #{param.ageUp},
age_low = #{param.ageLow},
salary_up = #{param.salaryUp},
salary_low = #{param.salaryLow},
salary_type = #{param.salaryType},
<if test="param.auditStatus != null">
audit_status = #{param.auditStatus},
</if>
version = version + 1,
update_by = #{param.updateBy},
update_time = now()
where id = #{param.id} and position_id = #{param.positionId} and deleted = 0 and version =
#{param.version} and audit_status = 1
</update>
<select id="list" resultType="com.newyetai.recruit.position.dto.PositionAuditDTO">
SELECT t.*
<include refid="queryFromSql"></include>
</select>
<select id="page" resultType="com.newyetai.recruit.position.dto.PositionAuditDTO">
SELECT a.*,
c.company_name,
pa.detail_address,
pa.district_code,
pt.name positionTypeName,
xo.org_name
FROM hr_position_audit a
INNER JOIN (SELECT max(id) id
FROM hr_position_audit
WHERE deleted = 0
GROUP BY position_id) b ON a.id = b.id
LEFT JOIN hr_company c ON a.company_id = c.id AND c.deleted = 0
LEFT JOIN hr_position_address pa ON a.address_id = pa.id AND pa.deleted = 0
LEFT JOIN hr_position_type pt ON a.position_type = pt.code AND pt.deleted = 0
LEFT JOIN xs_org xo ON a.org_id = xo.id AND xo.deleted = 0
WHERE a.deleted = 0
<if test='param.id != null'>
AND a.id = #{param.id}
</if>
<if test='param.orgId != null'>
AND a.org_id = #{param.orgId}
</if>
<if test="param.orgIds != null and param.orgIds.size() != 0">
AND a.org_id IN
<foreach collection="param.orgIds" item="item" open="(" separator="," close=")">
#{item}
</foreach>
</if>
<if test='param.orgNameLike != null and param.orgNameLike.trim() != ""'>
<bind name="orgNameLike" value="'%' + param.orgNameLike + '%'"/>
AND xo.org_name like #{orgNameLike}
</if>
<if test='param.companyId != null'>
AND a.company_id = #{param.companyId}
</if>
<if test='param.positionNameLike != null and param.positionNameLike.trim() != ""'>
<bind name="positionNameLike" value="'%' + param.positionNameLike + '%'"/>
AND a.position_name like #{positionNameLike}
</if>
<if test='param.createTimeStart != null'>
AND a.create_time &gt;= #{param.createTimeStart}
</if>
<if test='param.createTimeEnd != null'>
AND a.create_time &lt;= #{param.createTimeEnd}
</if>
<if test='param.recruitPositionType != null and param.recruitPositionType.trim() != ""'>
AND a.recruit_position_type = #{param.recruitPositionType}
</if>
<if test='param.auditStatus != null and param.auditStatus.trim() != ""'>
AND a.audit_status = #{param.auditStatus}
</if>
ORDER BY a.id DESC
</select>
<select id="positionPage" resultType="com.newyetai.recruit.position.dto.PositionNewDTO">
SELECT
a.id,
b.id positionAuditId,
b.company_id,
a.status,
b.position_name,
b.recruit_title,
b.position_type,
b.job_category,
b.position_number,
b.position_address,
b.recruit_user_id,
b.pay_date,
b.sex_require,
b.education_require,
b.experience_require,
b.certificates_require,
b.other_require,
b.job_content,
b.position_tag,
b.address_id,
b.recruit_position_type,
b.version,
b.audit_status,
b.audit_fail_msg,
b.file_json,
b.age_up,
b.age_low,
b.salary_up,
b.salary_low,
b.salary_type,
b.create_time,
b.org_id,
c.company_name,
pa.detail_address,
pa.district_code,
pt.name positionTypeName,
b.end_time
FROM
hr_position a
INNER JOIN hr_position_audit b ON a.id = b.position_id AND b.deleted = 0 AND b.id = ( SELECT max( id ) FROM hr_position_audit WHERE deleted = 0 AND a.id = position_id )
LEFT JOIN hr_company c ON b.company_id = c.id AND c.deleted = 0
LEFT JOIN hr_position_address pa ON b.address_id = pa.id AND pa.deleted = 0
LEFT JOIN hr_position_type pt ON b.position_type = pt.code AND pt.deleted = 0
WHERE
a.deleted = 0
<if test='param.id != null'>
AND a.id = #{param.id}
</if>
<if test="param.ids != null and param.ids.size()>0">
AND a.id in
<foreach collection="param.ids" open="(" separator="," close=")" item="id">
#{id}
</foreach>
</if>
<if test='param.companyId != null'>
AND b.company_id = #{param.companyId}
</if>
<if test='param.orgId != null'>
AND b.org_id = #{param.orgId}
</if>
<if test='param.positionNameLike != null and param.positionNameLike.trim() != ""'>
<bind name="positionNameLike" value="'%' + param.positionNameLike + '%'"/>
AND b.position_name like #{positionNameLike}
</if>
<if test='param.status != null and param.status.trim() != ""'>
AND a.status = #{param.status}
</if>
<if test='param.createTimeStart != null'>
AND b.create_time &gt;= #{param.createTimeStart}
</if>
<if test='param.createTimeEnd != null'>
AND b.create_time &lt;= #{param.createTimeEnd}
</if>
ORDER BY b.create_time DESC, b.position_id DESC
</select>
<update id="audit">
update hr_position_audit
set version = version + 1,
update_by = #{param.updateBy},
update_time = now(),
audit_status = #{param.auditStatus},
audit_fail_msg = #{param.auditFailMsg}
where deleted = 0
and id = #{param.id}
and version = #{param.version}
</update>
<select id="getIdByPositionId" resultType="java.lang.Long">
SELECT max(id) id FROM hr_position_audit WHERE deleted = 0 and position_id = #{positionId} GROUP BY position_id
</select>
<sql id="queryFromSql">
FROM
hr_position_audit t
WHERE t.deleted = 0
<if test='param.id != null'>
AND t.id = #{param.id}
</if>
<if test='param.positionId != null'>
AND t.position_id = #{param.positionId}
</if>
<if test='param.orgId != null'>
AND t.org_id = #{param.orgId}
</if>
<if test='param.companyId != null'>
AND t.company_id = #{param.companyId}
</if>
<if test='param.status != null and param.status.trim() != ""'>
AND t.status = #{param.status}
</if>
<if test='param.positionNameLike != null and param.positionNameLike.trim() != ""'>
<bind name="positionNameLike" value="'%' + param.positionNameLike + '%'"/>
AND t.position_name like #{positionNameLike}
</if>
<if test='param.recruitTitle != null and param.recruitTitle.trim() != ""'>
AND t.recruit_title = #{param.recruitTitle}
</if>
<if test='param.positionType != null and param.positionType.trim() != ""'>
AND t.position_type = #{param.positionType}
</if>
<if test='param.jobCategory != null and param.jobCategory.trim() != ""'>
AND t.job_category = #{param.jobCategory}
</if>
<if test='param.positionNumber != null'>
AND t.position_number = #{param.positionNumber}
</if>
<if test='param.positionAddress != null and param.positionAddress.trim() != ""'>
AND t.position_address = #{param.positionAddress}
</if>
<if test='param.recruitUserId != null'>
AND t.recruit_user_id = #{param.recruitUserId}
</if>
<if test='param.payDate != null and param.payDate.trim() != ""'>
AND t.pay_date = #{param.payDate}
</if>
<if test='param.sexRequire != null and param.sexRequire.trim() != ""'>
AND t.sex_require = #{param.sexRequire}
</if>
<if test='param.educationRequire != null and param.educationRequire.trim() != ""'>
AND t.education_require = #{param.educationRequire}
</if>
<if test='param.experienceRequire != null and param.experienceRequire.trim() != ""'>
AND t.experience_require = #{param.experienceRequire}
</if>
<if test='param.certificatesRequire != null and param.certificatesRequire.trim() != ""'>
AND t.certificates_require = #{param.certificatesRequire}
</if>
<if test='param.otherRequire != null and param.otherRequire.trim() != ""'>
AND t.other_require = #{param.otherRequire}
</if>
<if test='param.jobContent != null and param.jobContent.trim() != ""'>
AND t.job_content = #{param.jobContent}
</if>
<if test='param.positionTag != null and param.positionTag.trim() != ""'>
AND t.position_tag = #{param.positionTag}
</if>
<if test='param.addressId != null'>
AND t.address_id = #{param.addressId}
</if>
<if test='param.recruitPositionType != null and param.recruitPositionType.trim() != ""'>
AND t.recruit_position_type = #{param.recruitPositionType}
</if>
<if test='param.auditStatus != null and param.auditStatus.trim() != ""'>
AND t.audit_status = #{param.auditStatus}
</if>
<if test='param.auditFailMsg != null and param.auditFailMsg.trim() != ""'>
AND t.audit_fail_msg = #{param.auditFailMsg}
</if>
<if test='param.version != null'>
AND t.version = #{param.version}
</if>
<if test='param.createTimeStart != null'>
AND t.create_time &gt;= #{param.createTimeStart}
</if>
<if test='param.createTimeEnd != null'>
AND t.create_time &lt;= #{param.createTimeEnd}
</if>
<if test='param.updateTimeStart != null'>
AND t.update_time &gt;= #{param.updateTimeStart}
</if>
<if test='param.updateTimeEnd != null'>
AND t.update_time &lt;= #{param.updateTimeEnd}
</if>
ORDER BY t.id DESC
</sql>
</mapper>

View File

@@ -0,0 +1,34 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.newyetai.recruit.position.dao.PositionFileMapper">
<update id="setDefault">
UPDATE hr_position_file
SET default_show =
CASE
WHEN default_show = 1 THEN
0
ELSE 1
END,
update_time = NOW()
WHERE deleted = 0
AND file_type = '1'
AND position_id = #{positionId}
AND (
id = #{id}
OR default_show = 1)
</update>
<select id="filePage" resultType="com.newyetai.recruit.position.dto.PositionFileDTO">
SELECT
pf.*
FROM
hr_position_file pf
WHERE
pf.deleted = 0 AND pf.position_id = #{positionId}
<if test='fileType != null and fileType != 0'>
and file_type = #{fileType}
</if>
ORDER BY pf.sort DESC
</select>
</mapper>

View File

@@ -0,0 +1,303 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.newyetai.recruit.position.dao.PositionMapper">
<update id="positionExpiry">
update hr_position set status = 2, "update_by" = 1, "update_time" = now() where "deleted" = 0 and status = 1 and "end_time" &lt;= now()
</update>
<select id="page" resultType="com.newyetai.recruit.position.dto.PositionDTO">
SELECT
t.*,
c.company_name,
pa.detail_address,
pa.district_code,
pt.name positionTypeName
FROM
hr_position t
LEFT JOIN hr_company c ON t.company_id = c.id AND c.deleted = 0
LEFT JOIN hr_position_address pa ON t.address_id = pa.id AND pa.deleted = 0
LEFT JOIN hr_position_type pt ON t.position_type = pt.code AND pt.deleted = 0
WHERE t.deleted = 0
<if test='param.id != null'>
AND t.id = #{param.id}
</if>
<if test="param.ids != null and param.ids.size()>0">
AND t.id in
<foreach collection="param.ids" open="(" separator="," close=")" item="id">
#{id}
</foreach>
</if>
<if test='param.companyId != null'>
AND t.company_id = #{param.companyId}
</if>
<if test='param.orgId != null'>
AND t.org_id = #{param.orgId}
</if>
<if test='param.positionNameLike != null and param.positionNameLike.trim() != ""'>
<bind name="positionNameLike" value="'%' + param.positionNameLike + '%'"/>
AND t.position_name like #{positionNameLike}
</if>
<if test='param.status != null and param.status.trim() != ""'>
AND t.status = #{param.status}
</if>
<if test='param.createTimeStart != null'>
AND t.create_time &gt;= #{param.createTimeStart}
</if>
<if test='param.createTimeEnd != null'>
AND t.create_time &lt;= #{param.createTimeEnd}
</if>
ORDER BY t.create_time DESC, t.id DESC
</select>
<select id="userPage" resultType="com.newyetai.recruit.position.dto.PositionDTO">
SELECT
t.*,
c.company_name,
c.company_logo,
u.real_name recruitUserRealName,
u.avatar recruitUserAvatar,
u.phone recruitUserPhone,
pf.file_code positionFileCode,
c.company_register_address,
pa.district_code,
pa.district_name,
pa.detail_address,
pa.longitude,
pa.latitude
FROM
hr_position t
LEFT JOIN hr_company c ON t.company_id = c.id AND c.deleted = 0
LEFT JOIN uc_user u ON t.recruit_user_id = u.id AND u.deleted = 0
LEFT JOIN hr_position_file pf ON t.id = pf.position_id AND pf.default_show = 1 AND pf.deleted = 0
LEFT JOIN hr_position_address pa ON t.address_id = pa.id AND pa.deleted = 0
WHERE t.deleted = 0 and t.status = 1
<if test='param.useEndTime != null and param.useEndTime == 1'>
AND t.end_time >= now()
</if>
<if test='param.recruitTitleLike != null and param.recruitTitleLike.trim() != ""'>
<bind name="recruitTitleLike" value="'%' + param.recruitTitleLike + '%'"/>
AND t.recruit_title like #{recruitTitleLike}
</if>
<if test='param.id != null'>
AND t.id = #{param.id}
</if>
<if test="param.ids != null and param.ids.size()>0">
AND t.id in
<foreach collection="param.ids" open="(" separator="," close=")" item="id">
#{id}
</foreach>
</if>
<if test='param.companyId != null'>
AND t.company_id = #{param.companyId}
</if>
<if test='param.orgId != null'>
AND t.org_id = #{param.orgId}
</if>
<if test='param.positionNameLike != null and param.positionNameLike.trim() != ""'>
<bind name="positionNameLike" value="'%' + param.positionNameLike + '%'"/>
AND t.position_name like #{positionNameLike}
</if>
<if test='param.positionTagLike != null and param.positionTagLike.trim() != ""'>
<bind name="positionTagLike" value="'%' + param.positionTagLike + '%'"/>
AND t.position_tag like #{positionTagLike}
</if>
<if test='param.createTimeStart != null'>
AND t.create_time &gt;= #{param.createTimeStart}
</if>
<if test='param.createTimeEnd != null'>
AND t.create_time &lt;= #{param.createTimeEnd}
</if>
<if test='param.recruitPositionType != null and param.recruitPositionType.trim() != ""'>
AND t.recruit_position_type = #{param.recruitPositionType}
</if>
<if test='param.positionType != null and param.positionType.trim() != ""'>
AND t.position_type = #{param.positionType}
</if>
<if test='param.minX != null and param.maxX != null and param.minY != null and param.maxY != null'>
AND (pa.longitude BETWEEN #{param.minX} AND #{param.maxX}) AND (pa.latitude BETWEEN #{param.minY} and #{param.maxY})
</if>
<if test="param.educationRequire != null">
AND t.education_require = #{param.educationRequire}
</if>
<if test='param.salaryUp != null'>
AND t.salary_up &lt;= #{param.salaryUp}
</if>
<if test='param.salaryLow != null'>
AND t.salary_low &gt;= #{param.salaryLow}
</if>
ORDER BY t.create_time DESC, t.id DESC
</select>
<select id="positionTypeGroupMap" resultType="com.newyetai.recruit.statistics.dto.StatisticsBaseDTO">
SELECT substring(position_type,0,2) name, count(*) valueCount
from hr_position
where deleted = 0 and position_type is not null and position_type != ''
<if test="recruitPositionType != null and recruitPositionType != '' ">
and recruit_position_type = #{recruitPositionType}
</if>
group by substring(position_type,0,2)
</select>
<select id="personPostMatching"
resultType="com.newyetai.recruit.position.dto.PositionDTO">
SELECT
p.*,
c.company_name,
c.company_logo,
u.real_name recruitUserRealName,
u.avatar recruitUserAvatar,
u.phone recruitUserPhone,
pf.file_code positionFileCode,
c.company_register_address,
pa.district_code,
pa.district_name,
pa.detail_address,
pa.longitude,
pa.latitude
FROM
hr_position p
LEFT JOIN hr_company c ON p.company_id = c.id AND c.deleted = 0
LEFT JOIN uc_user u ON p.recruit_user_id = u.id AND u.deleted = 0
LEFT JOIN hr_position_file pf ON p.id = pf.position_id AND pf.default_show = 1 AND pf.deleted = 0
LEFT JOIN hr_position_address pa ON p.address_id = pa.id AND pa.deleted = 0
WHERE
p.deleted = 0 and p.status = 1 and p.end_time >= now()
<if test="param.positionType != null and param.positionType != '' ">
AND p.position_type LIKE CONCAT('%',#{param.positionType},'%')
</if>
<if test="param.positionNameLike != null and param.positionNameLike != '' ">
AND p.position_name LIKE CONCAT('%',#{param.positionNameLike},'%')
</if>
<if test="param.detailAddressLike != null and param.detailAddressLike != '' ">
AND pa.detail_address LIKE CONCAT('%',#{param.detailAddressLike},'%')
</if>
<if test="param.sexRequire != null and param.sexRequire != '' ">
AND ( p.sex_require = #{param.sexRequire} OR p.sex_require = '3' )
</if>
<if test="param.age != null">
AND
IF
(
p.age_low IS NOT NULL AND p.age_up IS NOT NULL,
p.age_up <![CDATA[ >= ]]> #{param.age} AND p.age_low <![CDATA[ <= ]]> #{param.age},
IF
(
p.age_low IS NOT NULL AND p.age_up IS NULL,
p.age_low <![CDATA[ <= ]]> #{param.age},
IF ( p.age_low IS NULL AND p.age_up IS NOT NULL,
p.age_up >= #{param.age},
IF
(
p.age_low IS NULL AND p.age_up IS NULL, 1 = 1, 1 = 0
)
)
)
)
</if>
<if test="param.educationRequire != null and param.educationRequire != '' ">
AND ( p.education_require = #{param.educationRequire} OR p.education_require IS NULL )
</if>
<if test="param.salary != null">
AND
IF
(
p.salary_up IS NOT NULL AND p.salary_low IS NOT NULL,
( (p.salary_up <![CDATA[ >= ]]> #{param.salary} AND p.salary_low <![CDATA[ <= ]]> #{param.salary}) OR p.salary_low <![CDATA[ >= ]]> #{param.salary} ),
IF
(
p.salary_low IS NOT NULL AND p.salary_up IS NULL,
1 = 1,
IF
(
p.salary_low IS NULL AND p.salary_up IS NOT NULL,
p.salary_up >= #{param.salary},
IF
(
p.salary_low IS NULL AND p.salary_up IS NULL, 1 = 1, 1 = 0
)
)
)
)
</if>
ORDER BY p.create_time DESC, p.id DESC
</select>
<sql id="queryFromSql">
FROM
hr_position t
WHERE t.deleted = 0
<if test='param.id != null'>
AND t.id = #{param.id}
</if>
<if test='param.orgId != null'>
AND t.org_id = #{param.orgId}
</if>
<if test='param.companyId != null'>
AND t.company_id = #{param.companyId}
</if>
<if test='param.status != null'>
AND t.status = #{param.status}
</if>
<if test='param.positionNameLike != null and param.positionNameLike.trim() != ""'>
<bind name="positionNameLike" value="'%' + param.positionNameLike + '%'"/>
AND t.position_name like #{positionNameLike}
</if>
<if test='param.recruitTitle != null and param.recruitTitle.trim() != ""'>
AND t.recruit_title = #{param.recruitTitle}
</if>
<if test='param.positionType != null'>
AND t.position_type = #{param.positionType}
</if>
<if test='param.jobCategory != null'>
AND t.job_category = #{param.jobCategory}
</if>
<if test='param.positionNumber != null'>
AND t.position_number = #{param.positionNumber}
</if>
<if test='param.positionAddress != null and param.positionAddress.trim() != ""'>
AND t.position_address = #{param.positionAddress}
</if>
<if test='param.recruitUserId != null'>
AND t.recruit_user_id = #{param.recruitUserId}
</if>
<if test='param.payDate != null and param.payDate.trim() != ""'>
AND t.pay_date = #{param.payDate}
</if>
<if test='param.educationRequire != null'>
AND t.education_require = #{param.educationRequire}
</if>
<if test='param.experienceRequire != null and param.experienceRequire.trim() != ""'>
AND t.experience_require = #{param.experienceRequire}
</if>
<if test='param.certificatesRequire != null and param.certificatesRequire.trim() != ""'>
AND t.certificates_require = #{param.certificatesRequire}
</if>
<if test='param.otherRequire != null and param.otherRequire.trim() != ""'>
AND t.other_require = #{param.otherRequire}
</if>
<if test='param.jobContent != null and param.jobContent.trim() != ""'>
AND t.job_content = #{param.jobContent}
</if>
<if test='param.createTimeStart != null'>
AND t.create_time &gt;= #{param.createTimeStart}
</if>
<if test='param.createTimeEnd != null'>
AND t.create_time &lt;= #{param.createTimeEnd}
</if>
<if test='param.updateTimeStart != null'>
AND t.update_time &gt;= #{param.updateTimeStart}
</if>
<if test='param.updateTimeEnd != null'>
AND t.update_time &lt;= #{param.updateTimeEnd}
</if>
ORDER BY t.id DESC
</sql>
</mapper>

View File

@@ -0,0 +1,239 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.newyetai.recruit.position.dao.PositionRegistrationMapper">
<update id="updateStatus">
update hr_position_registration
set status = #{param.status},update_time = now(),update_by = #{param.updateBy}
<if test="param.interviewTime != null">
,interview_time = #{param.interviewTime}
</if>
<if test="param.interviewLocation != null and param.interviewLocation != '' ">
,interview_location = #{param.interviewLocation}
</if>
<if test="param.inductionTime != null">
,induction_time = #{param.inductionTime}
</if>
<if test="param.quitTime != null">
,quit_time = #{param.quitTime}
</if>
<if test="param.terminationTime != null">
,termination_time = #{param.terminationTime}
</if>
<if test="param.salary != null">
,salary = #{param.salary}
</if>
<if test="param.remark != null and param.remark != '' ">
,remark = #{param.remark}
</if>
where
id = #{param.id}
<if test="oldStatus != null and oldStatus != '' ">
and status = #{oldStatus}
</if>
</update>
<select id="page" resultType="com.newyetai.recruit.position.dto.PositionRegistrationDTO">
SELECT t.*,
p.position_name,
p.company_id,
c.company_name,
u.real_name,
u.card_no,
u.phone,
uu.real_name as recruitUserName,
xo.org_name as publishOrgName,
xo1.org_name as streetName
FROM
hr_position_registration t
LEFT JOIN hr_position p ON t.position_id = p.id AND p.deleted = 0
LEFT JOIN uc_user u ON t.user_id = u.id AND u.deleted = 0
LEFT JOIN uc_user uu ON p.recruit_user_id = uu.id AND uu.deleted = 0
LEFT JOIN hr_company c ON p.company_id = c.id AND c.deleted = 0
LEFT JOIN xs_org xo ON c.org_id = xo.id AND xo.deleted = 0
LEFT JOIN xs_org xo1 ON xo1.id = xo.parent_id AND xo1.deleted = 0
WHERE t.deleted = 0 and t.status <![CDATA[ <> ]]> 8
<if test='param.id != null'>
AND t.id = #{param.id}
</if>
<if test='param.orgId != null'>
AND p.org_id = #{param.orgId}
</if>
<if test="param.orgIds != null and param.orgIds.size() != 0">
AND p.org_id in
<foreach collection="param.orgIds" item="item" open="(" separator="," close=")">
#{item}
</foreach>
</if>
<if test="param.queryStreetChildrenAllOrgIds != null and param.queryStreetChildrenAllOrgIds.size() != 0">
AND xo1.id in
<foreach collection="param.queryStreetChildrenAllOrgIds" item="item" open="(" separator="," close=")">
#{item}
</foreach>
</if>
<if test='param.publishOrgId != null'>
AND xo.id = #{param.publishOrgId}
</if>
<if test='param.companyId != null'>
AND p.company_id = #{param.companyId}
</if>
<if test='param.positionId != null'>
AND t.position_id = #{param.positionId}
</if>
<if test='param.realNameLike != null and param.realNameLike.trim() != ""'>
<bind name="realNameLike" value="'%' + param.realNameLike + '%'"/>
AND u.real_name like #{realNameLike}
</if>
<if test="param.realNames != null and param.realNames.size() != 0">
AND u.real_name in
<foreach collection="param.realNames" item="item" open="(" separator="," close=")">
#{item}
</foreach>
</if>
<if test='param.phoneLike != null and param.phoneLike.trim() != ""'>
<bind name="phoneLike" value="'%' + param.phoneLike + '%'"/>
AND u.phone like #{phoneLike}
</if>
<if test="param.phones != null and param.phones.size() != 0">
AND u.phone in
<foreach collection="param.phones" item="item" open="(" separator="," close=")">
#{item}
</foreach>
</if>
<if test='param.cardNoLike != null and param.cardNoLike.trim() != ""'>
<bind name="cardNoLike" value="'%' + param.cardNoLike + '%'"/>
AND u.card_no like #{cardNoLike}
</if>
<if test="param.cardNos != null and param.cardNos.size() != 0">
AND u.card_no in
<foreach collection="param.cardNos" item="item" open="(" separator="," close=")">
#{item}
</foreach>
</if>
<if test='param.status != null and param.status.trim() != ""'>
AND t.status = #{param.status}
</if>
<if test="param.statusList != null and param.statusList.size() != 0">
AND t.status in
<foreach collection="param.statusList" item="item" open="(" separator="," close=")">
#{item}
</foreach>
</if>
<choose>
<when test="param.statusList != null and param.statusList.size() != 0">
<choose>
<when test='param.statusList.contains("1")'>
ORDER BY t.create_time DESC,t.id DESC
</when>
<when test='param.statusList.contains("2") or param.statusList.contains("3") or param.statusList.contains("4")'>
ORDER BY t.update_time DESC,t.id DESC
</when>
<when test='param.statusList.contains("5")'>
ORDER BY t.induction_time DESC,t.id DESC
</when>
</choose>
</when>
<otherwise>
ORDER BY t.update_time DESC,t.id DESC
</otherwise>
</choose>
</select>
<select id="userPage"
resultType="com.newyetai.recruit.position.dto.UserPositionRegistrationResDTO">
SELECT t.id,
p.id positionId,
p.position_name,
p.recruit_title,
p.position_tag,
p.salary_up,
p.salary_low,
p.salary_type,
p.position_address,
p.recruit_position_type,
c.company_name,
c.company_logo,
uu.real_name as recruitUserName,
pf.file_code positionFileCode,
t.status,
t.create_time,
t.interview_time,
t.interview_location,
t.remark,
t.induction_time,
t.salary,
t.show,
pa.detail_address
FROM
hr_position_registration t
LEFT JOIN hr_position p ON t.position_id = p.id AND p.deleted = 0
LEFT JOIN uc_user uu ON p.recruit_user_id = uu.id AND uu.deleted = 0
LEFT JOIN hr_company c ON p.company_id = c.id AND c.deleted = 0
LEFT JOIN hr_position_file pf ON t.position_id = pf.position_id AND pf.default_show = 1 AND pf.deleted = 0
LEFT JOIN hr_position_address pa ON p.address_id = pa.id AND pa.deleted = 0
WHERE t.deleted = 0
<if test='param.id != null'>
AND t.id = #{param.id}
</if>
AND t.user_id = #{param.userId}
<if test='param.status != null and param.status.trim() != ""'>
AND t.status = #{param.status}
</if>
<if test='param.positionId != null'>
AND t.position_id = #{param.positionId}
</if>
ORDER BY t.id DESC
</select>
<sql id="queryFromSql">
FROM
hr_position_registration t
WHERE t.deleted = 0
<if test='param.id != null'>
AND t.id = #{param.id}
</if>
<if test='param.positionId != null'>
AND t.position_id = #{param.positionId}
</if>
<if test='param.userId != null'>
AND t.user_id = #{param.userId}
</if>
<if test='param.status != null and param.status.trim() != ""'>
AND t.status = #{param.status}
</if>
<if test='param.interviewTime != null'>
AND t.interview_time = #{param.interviewTime}
</if>
<if test='param.inductionTime != null'>
AND t.induction_time = #{param.inductionTime}
</if>
<if test='param.quitTime != null'>
AND t.quit_time = #{param.quitTime}
</if>
<if test='param.terminationTime != null'>
AND t.termination_time = #{param.terminationTime}
</if>
<if test='param.salary != null'>
AND t.salary = #{param.salary}
</if>
<if test='param.remark != null and param.remark.trim() != ""'>
AND t.remark = #{param.remark}
</if>
<if test='param.createTimeStart != null'>
AND t.create_time &gt;= #{param.createTimeStart}
</if>
<if test='param.createTimeEnd != null'>
AND t.create_time &lt;= #{param.createTimeEnd}
</if>
<if test='param.updateTimeStart != null'>
AND t.update_time &gt;= #{param.updateTimeStart}
</if>
<if test='param.updateTimeEnd != null'>
AND t.update_time &lt;= #{param.updateTimeEnd}
</if>
ORDER BY t.id DESC
</sql>
</mapper>

View File

@@ -0,0 +1,18 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.newyetai.recruit.position.dao.PositionTypeMapper">
<select id="queryByDto"
resultType="com.newyetai.recruit.position.dto.PositionTypeDTO">
SELECT pt.id,
pt.name,
pt.code,
ifnull(pt.parent_id, 0) parent_id
FROM hr_position_type pt
WHERE pt.deleted = 0
<if test="recruitPositionType != null and recruitPositionType != '' ">
and pt.recruit_position_type = #{recruitPositionType}
</if>
</select>
</mapper>

View File

@@ -0,0 +1,70 @@
package com.newyetai.recruit.position.service;
import org.springframework.validation.annotation.Validated;
import javax.validation.Valid;
import javax.validation.groups.Default;
import java.util.List;
import com.newyetai.recruit.position.dto.*;
/**
* 岗位导入
*
* @author guixinman
* @since 1.0.0 2024-04-12
*/
@Validated(Default.class)
public interface ImportDetailPositionService {
/**
* 岗位导入 - 创建
*
* @param operatorDto 操作dto
* @return {@link ImportDetailPositionDTO}
*/
ImportDetailPositionDTO create(@Valid ImportDetailPositionOperatorDTO operatorDto);
/**
* 岗位导入 - 修改
*
* @param operatorDto 操作dto
* @return {@link ImportDetailPositionDTO}
*/
ImportDetailPositionDTO modify(@Valid ImportDetailPositionOperatorDTO operatorDto);
/**
* 岗位导入 - 删除
*
* @param id id
* @return {@link ImportDetailPositionDTO}
*/
ImportDetailPositionDTO delete(Long id);
/**
* 岗位导入 - 根据ID查询单个
*
* @param id id
* @return {@link ImportDetailPositionDTO}
*/
ImportDetailPositionDTO findById(Long id);
/**
* 岗位导入 - 列表查询
*
* @param queryDTO 列表查询dto
* @return {@link List}<{@link ImportDetailPositionDTO}>
*/
List<ImportDetailPositionDTO> list(ImportDetailPositionQueryDTO queryDTO);
/**
* 岗位导入 - 分页查询
*
* @param queryDTO 分页查询dto
* @return {@link ImportDetailPositionDTO}
*/
List<ImportDetailPositionDTO> page(ImportDetailPositionPageQueryDTO queryDTO);
void batchCreate(List<ImportDetailPositionDTO> importDetailPositionDTOS);
}

View File

@@ -0,0 +1,50 @@
package com.newyetai.recruit.position.service;
import com.newyetai.recruit.position.dto.PositionAddressDTO;
import com.newyetai.recruit.position.dto.PositionAddressOperatorDTO;
import com.newyetai.recruit.position.dto.PositionAddressQueryDTO;
import org.springframework.validation.annotation.Validated;
import java.util.List;
import javax.validation.Valid;
import javax.validation.groups.Default;
/**
* <p>
* 招聘系统-岗位报名信息表 服务类
* </p>
*
* @author chenyun
* @since 2021-01-08
*/
@Validated(Default.class)
public interface PositionAddressService {
/**
* 创建或更新
*
* @param operatorDTO 运营商dto
* @return {@link Long}
*/
Long createOrUpdate(@Valid PositionAddressOperatorDTO operatorDTO);
/**
* 列表
*
* @param queryDTO 查询dto
* @return {@link List}<{@link PositionAddressDTO}>
*/
List<PositionAddressDTO> list(PositionAddressQueryDTO queryDTO);
/**
* 删除
*
* @param id id
*/
void delete(Long id);
}

View File

@@ -0,0 +1,99 @@
package com.newyetai.recruit.position.service;
import org.springframework.validation.annotation.Validated;
import javax.validation.Valid;
import javax.validation.groups.Default;
import java.util.List;
import java.util.Set;
import com.newyetai.recruit.position.dto.*;
/**
* 岗位审核表
*
* @author guixinman
* @since 1.0.0 2024-07-05
*/
@Validated(Default.class)
public interface PositionAuditService {
/**
* 岗位审核表 - 创建
*
* @param operatorDto 操作dto
* @return {@link PositionAuditDTO}
*/
PositionNewDTO positionCreate(@Valid PositionNewOperatorDTO operatorDto);
/**
* 岗位审核表 - 修改
*
* @param operatorDto 操作dto
* @return {@link PositionAuditDTO}
*/
void positionModify(@Valid PositionNewOperatorDTO operatorDto);
/**
* 岗位审核表 - 根据ID查询单个
*
* @param id id
* @return {@link PositionAuditDTO}
*/
PositionNewDTO positionFindById(Long id);
/**
* 岗位审核表 - 列表查询
*
* @param queryDTO 列表查询dto
* @return {@link List}<{@link PositionAuditDTO}>
*/
List<PositionAuditDTO> list(PositionAuditQueryDTO queryDTO);
/**
* 岗位审核表 - 分页查询
*
* @param queryDTO 分页查询dto
* @return {@link PositionAuditDTO}
*/
List<PositionAuditDTO> page(PositionAuditPageQueryDTO queryDTO);
/**
* 岗位审核表 - 分页查询
*
* @param queryDTO 分页查询dto
* @return {@link PositionAuditDTO}
*/
List<PositionNewDTO> positionPage(PositionNewPageQueryDTO queryDTO);
void export(PositionNewPageQueryDTO queryDTO);
/**
* @description: 审核
* @return:
* @author: guixinman
* @param:
*/
void audit(PositionAuditReqDTO reqDTO);
PositionAuditDTO findById(Long id);
/**
* @description: 开启招聘关闭招聘
* @return:
* @author: guixinman
* @param:
*/
void positionModifyStatus(Set<Long> ids, String status);
/**
* @description: 复制岗位
* @return:
* @author: guixinman
* @param:
*/
Long positionCopy(Long id);
}

View File

@@ -0,0 +1,46 @@
package com.newyetai.recruit.position.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.newyetai.recruit.position.dto.PositionFileDTO;
import com.newyetai.recruit.position.dto.PositionFilePageQueryDTO;
import com.newyetai.recruit.position.entity.PositionFile;
import org.springframework.validation.annotation.Validated;
import java.util.List;
import javax.validation.groups.Default;
/**
* <p>
* 招聘系统-岗位报名信息表 服务类
* </p>
*
* @author chenyun
* @since 2021-01-08
*/
@Validated(Default.class)
public interface PositionFileService extends IService<PositionFile> {
/**
* 岗位文件列表
*
* @param queryDTO 查询dto
* @return {@link List}<{@link PositionFileDTO}>
*/
List<PositionFileDTO> filePage(PositionFilePageQueryDTO queryDTO);
PositionFile create(PositionFileDTO queryDTO);
void update(PositionFileDTO dto);
void delete(Long id);
void deleteByPositionId(Long positionId);
/**
* 设置默认展示 (封面)
*
* @param id id
*/
void setDefault(Long id);
}

View File

@@ -0,0 +1,138 @@
package com.newyetai.recruit.position.service;
import org.springframework.validation.annotation.Validated;
import javax.validation.Valid;
import javax.validation.groups.Default;
import java.util.List;
import com.newyetai.recruit.position.dto.*;
/**
* 岗位报名信息表
*
* @author guixinman
* @since 1.0.0 2024-04-15
*/
@Validated(Default.class)
public interface PositionRegistrationService {
/**
* 岗位报名信息表 - 创建
*
* @param operatorDto 操作dto
* @return {@link PositionRegistrationDTO}
*/
PositionRegistrationDTO create(@Valid PositionRegistrationOperatorDTO operatorDto);
/**
* 岗位报名信息表 - 修改
*
* @param operatorDto 操作dto
* @return {@link PositionRegistrationDTO}
*/
PositionRegistrationDTO modify(@Valid PositionRegistrationOperatorDTO operatorDto);
/**
* 岗位报名信息表 - 删除
*
* @param id id
* @return {@link PositionRegistrationDTO}
*/
PositionRegistrationDTO delete(Long id);
/**
* 岗位报名信息表 - 根据ID查询单个
*
* @param id id
* @return {@link PositionRegistrationDTO}
*/
PositionRegistrationDTO findById(Long id);
PositionRegistrationDTO findByIdAndChildrenOrgAll(Long id, Boolean childrenOrgAll);
/**
* 岗位报名信息表 - 列表查询
*
* @param queryDTO 列表查询dto
* @return {@link List}<{@link PositionRegistrationDTO}>
*/
List<PositionRegistrationDTO> list(PositionRegistrationPageQueryDTO queryDTO);
/**
* 岗位报名信息表 - 分页查询
*
* @param queryDTO 分页查询dto
* @return {@link PositionRegistrationDTO}
*/
List<PositionRegistrationDTO> page(PositionRegistrationPageQueryDTO queryDTO);
/**
* @description: 用户端报名岗位
* @return:
* @author: guixinman
* @param:
*/
void userCreate(UserPositionRegistrationDTO dto);
/**
* @description: 邀约面试
* @return:
* @author: guixinman
* @param:
*/
void invite(PositionRegistrationOperatorDTO operatorDTO);
/**
* @description: 结束招聘
* @return:
* @author: guixinman
* @param:
*/
void termination(PositionRegistrationOperatorDTO operatorDTO);
/**
* @description: 完成面试
* @return:
* @author: guixinman
* @param:
*/
void fulfillInterview(PositionRegistrationOperatorDTO operatorDTO);
/**
* @description: 入职
* @return:
* @author: guixinman
* @param:
*/
void onTheJob(OnTheJobDTO dto);
/**
* @description: 离职
* @return:
* @author: guixinman
* @param:
*/
void resigned(ResignedDTO dto);
void export(PositionRegistrationPageQueryDTO queryDTO);
/**
* @description: 用户端查看我的报名
* @return:
* @author: guixinman
* @param:
*/
List<UserPositionRegistrationResDTO> userPage(UserPositionRegistrationPageQueryDTO queryDTO);
void cancel(Long positionId);
/**
* @description: 查看
* @return:
* @author: guixinman
* @param:
*/
void show(Long id);
}

View File

@@ -0,0 +1,104 @@
package com.newyetai.recruit.position.service;
import org.springframework.validation.annotation.Validated;
import javax.validation.Valid;
import javax.validation.groups.Default;
import java.util.List;
import java.util.Set;
import com.newyetai.recruit.position.dto.*;
/**
* 岗位信息表;岗位信息表
*
* @author guixinman
* @since 1.0.0 2024-04-11
*/
@Validated(Default.class)
public interface PositionService {
/**
* 岗位信息表;岗位信息表 - 创建
*
* @param operatorDto 操作dto
* @return {@link PositionDTO}
*/
PositionDTO create(@Valid PositionOperatorDTO operatorDto);
/**
* 岗位信息表;岗位信息表 - 修改
*
* @param operatorDto 操作dto
* @return {@link PositionDTO}
*/
PositionDTO modify(@Valid PositionOperatorDTO operatorDto);
/**
* 岗位信息表;岗位信息表 - 删除
*
* @param id id
* @return {@link PositionDTO}
*/
PositionDTO delete(Long id);
/**
* 岗位信息表;岗位信息表 - 根据ID查询单个
*
* @param id id
* @return {@link PositionDTO}
*/
PositionDTO findById(Long id);
PositionDTO userFindById(Long id);
/**
* 岗位信息表;岗位信息表 - 列表查询
*
* @param queryDTO 列表查询dto
* @return {@link List}<{@link PositionDTO}>
*/
List<PositionDTO> list(PositionPageQueryDTO queryDTO);
/**
* 岗位信息表;岗位信息表 - 分页查询
*
* @param queryDTO 分页查询dto
* @return {@link PositionDTO}
*/
List<PositionDTO> page(PositionPageQueryDTO queryDTO);
List<PositionDTO> userPage(PositionPageQueryDTO queryDTO);
/**
* @description: 岗位信息腾讯地图-分页查询"
* @return:
* @author: guixinman
* @param:
*/
List<PositionDTO> tencentMapUserPage(PositionPageQueryDTO queryDTO);
void export(PositionPageQueryDTO queryDTO);
/**
* @description: 开启或者关闭招聘
* @return:
* @author: guixinman
* @param:
*/
void modifyStatus(PositionOperatorDTO dto);
void template();
Long copy(Long id);
/**
* @description: 人岗匹配
* @return:
* @author: guixinman
* @param:
*/
List<PositionDTO> personPostMatching(Long id);
void positionExpiry();
}

View File

@@ -0,0 +1,40 @@
package com.newyetai.recruit.position.service;
import com.newyetai.recruit.position.dto.PositionTypeDTO;
import com.newyetai.recruit.position.dto.PositionTypeQueryDTO;
import org.springframework.validation.annotation.Validated;
import java.util.List;
import javax.validation.groups.Default;
/**
* <p>
* 招聘系统-岗位报名信息表 服务类
* </p>
*
* @author chenyun
* @since 2021-01-08
*/
@Validated(Default.class)
public interface PositionTypeService {
/**
* 批量创建
*
* @param positionTypeDTOS 位置式dto
* @return {@link List}<{@link PositionTypeDTO}>
*/
List<PositionTypeDTO> batchCreate(List<PositionTypeDTO> positionTypeDTOS);
/**
* 查询
*
* @param queryDTO 查询dto
* @return {@link List}<{@link PositionTypeDTO}>
*/
List<PositionTypeDTO> query(PositionTypeQueryDTO queryDTO);
}

View File

@@ -0,0 +1,567 @@
package com.newyetai.recruit.position.service.impl;
import com.google.common.collect.Lists;
import com.google.common.collect.Sets;
import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.read.builder.ExcelReaderBuilder;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.newyetai.common.AlitaResult;
import com.newyetai.common.constant.CommonConstants;
import com.newyetai.common.dto.ExportHeadDetailInfoDTO;
import com.newyetai.common.dto.ExportHeadInfoDTO;
import com.newyetai.common.easyexcel.ExcelUtil;
import com.newyetai.common.exception.BusinessException;
import com.newyetai.common.exception.util.Assert;
import com.newyetai.common.util.JsonUtils;
import com.newyetai.common.util.UserContextHolder;
import com.newyetai.component.commonimport.constant.ImportDetailStatusEnum;
import com.newyetai.component.commonimport.constant.ImportStatusEnum;
import com.newyetai.component.commonimport.constant.ImportTypeEnum;
import com.newyetai.component.commonimport.dto.ImportDetailPageDTO;
import com.newyetai.component.commonimport.dto.ImportMainDTO;
import com.newyetai.component.commonimport.dto.ImportMainQueryDTO;
import com.newyetai.component.commonimport.dto.ImportMainUpdateDTO;
import com.newyetai.component.commonimport.service.ImportMainService;
import com.newyetai.component.commonimport.service.impl.AbstractCommonImportProvider;
import com.newyetai.component.dict.util.DictUtils;
import com.newyetai.component.file.entity.FileRecord;
import com.newyetai.component.file.service.FileRecordService;
import com.newyetai.recruit.company.dto.HrCompanyDTO;
import com.newyetai.recruit.company.dto.HrCompanyPageQueryDTO;
import com.newyetai.recruit.company.enums.HrCompanyEnum;
import com.newyetai.recruit.company.service.IHrCompanyService;
import com.newyetai.recruit.position.dao.PositionAddressMapper;
import com.newyetai.recruit.position.dao.PositionMapper;
import com.newyetai.recruit.position.dao.PositionTypeMapper;
import com.newyetai.recruit.position.dto.ImportDetailPositionDTO;
import com.newyetai.recruit.position.dto.ImportDetailPositionExecuteDTO;
import com.newyetai.recruit.position.dto.ImportDetailPositionExportDTO;
import com.newyetai.recruit.position.dto.ImportDetailPositionListenerDTO;
import com.newyetai.recruit.position.dto.ImportDetailPositionOperatorDTO;
import com.newyetai.recruit.position.dto.ImportDetailPositionPageQueryDTO;
import com.newyetai.recruit.position.dto.PositionNewDTO;
import com.newyetai.recruit.position.dto.PositionNewOperatorDTO;
import com.newyetai.recruit.position.dto.PositionOperatorDTO;
import com.newyetai.recruit.position.entity.Position;
import com.newyetai.recruit.position.entity.PositionAddress;
import com.newyetai.recruit.position.entity.PositionType;
import com.newyetai.recruit.position.service.ImportDetailPositionService;
import com.newyetai.recruit.position.service.PositionAuditService;
import com.newyetai.sdk.tencent.map.TencentMapContext;
import com.newyetai.sdk.tencent.map.dto.TencentMapGeocoderReqDTO;
import com.newyetai.sdk.tencent.map.dto.TencentMapGeocoderResDTO;
import com.newyetai.sdk.tencent.map.dto.TencentMapLocationV1IpResDTO;
import com.newyetai.tkmybatis.pojo.Page;
import com.newyetai.usercenter.org.dao.OrgMapper;
import com.newyetai.usercenter.org.entity.Org;
import com.newyetai.usercenter.org.enums.RecruitPositionTypeEnum;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.io.InputStream;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;
import javax.annotation.Resource;
import cn.hutool.core.date.DateUtil;
import lombok.extern.slf4j.Slf4j;
/**
* @description: admin导入岗位
* @author: guixinman
* @create: 2024-04-11 17:45
**/
@Service
@Slf4j
public class ImportDetailPositionAdminProvider extends AbstractCommonImportProvider<ImportDetailPositionExecuteDTO, ImportDetailPositionDTO, ImportDetailPositionListenerDTO> {
@Autowired
private ImportDetailPositionService importDetailPositionService;
@Autowired
private ImportMainService importMainService;
@Autowired
private FileRecordService fileRecordService;
@Autowired
private IHrCompanyService hrCompanyService;
@Autowired
private PositionAuditService positionAuditService;
@Resource
private PositionMapper positionMapper;
@Resource
private PositionTypeMapper positionTypeMapper;
@Resource
private PositionAddressMapper positionAddressMapper;
@Resource
private OrgMapper orgMapper;
@Autowired
private TencentMapContext tencentMapContext;
public ImportDetailPositionAdminProvider(ImportMainService imprImportMainService) {
super(imprImportMainService);
}
@Override
public String getType() {
return ImportTypeEnum.ADMIN_POSITION.getType();
}
@Override
public Page<ImportDetailPositionDTO> pageDetail(ImportDetailPageDTO importDetailPageDTO) {
ImportDetailPositionPageQueryDTO queryDTO = new ImportDetailPositionPageQueryDTO();
BeanUtils.copyProperties(importDetailPageDTO, queryDTO);
importDetailPositionService.page(queryDTO);
return queryDTO.getPageResult();
}
@Override
public void importDetailExport(ImportDetailPageDTO importDetailPageDTO) {
ImportDetailPositionPageQueryDTO queryDTO = new ImportDetailPositionPageQueryDTO();
BeanUtils.copyProperties(importDetailPageDTO, queryDTO);
queryDTO.disablePage();
List<ImportDetailPositionDTO> list = importDetailPositionService.page(queryDTO);
List<ImportDetailPositionExportDTO> exportDTOList = list.stream().map(dto -> {
ImportDetailPositionExportDTO importDetailPositionExportDTO = JsonUtils.toObject(dto.getDataJson(), ImportDetailPositionExportDTO.class);
importDetailPositionExportDTO.setRemark(dto.getRemark());
importDetailPositionExportDTO.setFailReason(dto.getFailReason());
return importDetailPositionExportDTO;
}).collect(Collectors.toList());
if (org.springframework.util.CollectionUtils.isEmpty(exportDTOList)) {
return;
}
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMddHHmmss");
String commonImportDetailStatus = DictUtils.getCodeNameMap("common_import_detail_status").get(String.valueOf(importDetailPageDTO.getDetailStatus()));
String fileName = "岗位导入" + (StringUtils.isNotBlank(commonImportDetailStatus) ? commonImportDetailStatus : "") + "明细导出" + "(" + formatter.format(LocalDateTime.now()) + ")";
ExportHeadInfoDTO infoDTO = ExportHeadInfoDTO.builder()
.fileName(fileName)
.build();
List<ExportHeadDetailInfoDTO> heads = infoDTO.getHeads();
heads.add(ExportHeadDetailInfoDTO.builder().head("用工企业").build());
heads.add(ExportHeadDetailInfoDTO.builder().head("岗位名称").build());
heads.add(ExportHeadDetailInfoDTO.builder().head("招聘标题").build());
heads.add(ExportHeadDetailInfoDTO.builder().head("招聘人数").build());
heads.add(ExportHeadDetailInfoDTO.builder().head("工作地址").build());
heads.add(ExportHeadDetailInfoDTO.builder().head("岗位性质").build());
heads.add(ExportHeadDetailInfoDTO.builder().head("岗位类型").build());
heads.add(ExportHeadDetailInfoDTO.builder().head("岗位标签").build());
heads.add(ExportHeadDetailInfoDTO.builder().head("薪资下限").build());
heads.add(ExportHeadDetailInfoDTO.builder().head("薪资上限").build());
heads.add(ExportHeadDetailInfoDTO.builder().head("薪资类型").build());
heads.add(ExportHeadDetailInfoDTO.builder().head("发薪日").build());
heads.add(ExportHeadDetailInfoDTO.builder().head("性别").build());
heads.add(ExportHeadDetailInfoDTO.builder().head("年龄(下限)").build());
heads.add(ExportHeadDetailInfoDTO.builder().head("年龄(上限)").build());
heads.add(ExportHeadDetailInfoDTO.builder().head("学历").build());
heads.add(ExportHeadDetailInfoDTO.builder().head("经验").build());
heads.add(ExportHeadDetailInfoDTO.builder().head("证件").build());
heads.add(ExportHeadDetailInfoDTO.builder().head("其他").build());
heads.add(ExportHeadDetailInfoDTO.builder().head("工作内容").build());
heads.add(ExportHeadDetailInfoDTO.builder().head("有效期截止时间").build());
heads.add(ExportHeadDetailInfoDTO.builder().head("失败原因").build());
heads.add(ExportHeadDetailInfoDTO.builder().head("备注").build());
List<List> datas = Lists.newArrayList();
for (ImportDetailPositionExportDTO dto : exportDTOList) {
List objects = Lists.newArrayList();
datas.add(objects);
objects.add(dto.getCompanyName());
objects.add(dto.getPositionName());
objects.add(dto.getRecruitTitle());
objects.add(dto.getPositionNumber());
objects.add(dto.getPositionAddress());
objects.add(dto.getRecruitPositionType());
objects.add(dto.getPositionTypeName());
objects.add(dto.getPositionTag());
objects.add(dto.getSalaryLow());
objects.add(dto.getSalaryUp());
objects.add(dto.getSalaryType());
objects.add(dto.getPayDate());
objects.add(dto.getSexRequire());
objects.add(dto.getAgeLow());
objects.add(dto.getAgeUp());
objects.add(dto.getEducationRequire());
objects.add(dto.getExperienceRequire());
objects.add(dto.getCertificatesRequire());
objects.add(dto.getOtherRequire());
objects.add(dto.getJobContent());
objects.add(dto.getEndTime());
objects.add(dto.getFailReason());
objects.add(dto.getRemark());
}
infoDTO.setDatas(datas);
ExcelUtil.dynamicExportTemplate(infoDTO);
}
@Override
public List<ImportDetailPositionListenerDTO> analy(Long mainId) {
// 解析文件+明细
ImportMainDTO importMainDTO = importMainService.find(ImportMainQueryDTO.builder().id(mainId).build());
Assert.notNull(importMainDTO, "未查询到导入的数据");
FileRecord fileRecord;
try {
fileRecord = fileRecordService.find(FileRecord.builder().fileCode(importMainDTO.getFileCode()).build());
} catch (Exception e) {
log.info("导入文件异常,", e);
fileRecord = null;
}
Assert.notNull(fileRecord, "上传文件不存在");
try (InputStream is = fileRecordService.getFile(importMainDTO.getFileCode())) {
ImportPositionExcelListener listener = new ImportPositionExcelListener();
ExcelReaderBuilder reader = EasyExcel.read(is, ImportDetailPositionListenerDTO.class, listener);
reader.sheet().doRead();
List<ImportDetailPositionListenerDTO> dtos = listener.getDtos();
Assert.isTrue(!dtos.isEmpty(), "导入文件无有效数据");
return dtos;
} catch (Exception e) {
throw new BusinessException(e.getMessage());
}
}
@Transactional(rollbackFor = Exception.class)
@Override
public void checkAndSave(Long mainId, List<ImportDetailPositionListenerDTO> detailCreateDtos) {
//更改状态为校验中
ImportMainUpdateDTO updateDto = ImportMainUpdateDTO.builder().id(mainId)
.oldStatusSet(Sets.newHashSet(ImportStatusEnum.INIT.getStatus()))
.newStatus(ImportStatusEnum.CHECKING.getStatus())
.build();
importMainService.modify(updateDto);
List<ImportDetailPositionDTO> importDetailPositionDTOS = new ArrayList<>();
//存储用工企业+岗位名称。用于校验 导入的数据中有没有重复的
List<String> companyIdPositionNames = new ArrayList<>();
for (ImportDetailPositionListenerDTO importDetailPositionListenerDTO : detailCreateDtos) {
ImportDetailPositionDTO importDetailPositionDTO = new ImportDetailPositionDTO();
this.checkAndFill(importDetailPositionDTO, importDetailPositionListenerDTO);
if (StringUtils.isBlank(importDetailPositionDTO.getFailReason())) {
if (companyIdPositionNames.contains(StringUtils.join(importDetailPositionListenerDTO.getCompanyName(), importDetailPositionListenerDTO.getPositionName()))) {
importDetailPositionDTO.appendFailMsg("用工企业+岗位名称出现多次");
}
//存储用工企业+岗位名称
companyIdPositionNames.add(StringUtils.join(importDetailPositionListenerDTO.getCompanyName(), importDetailPositionListenerDTO.getPositionName()));
}
if (StringUtils.isNotBlank(importDetailPositionDTO.getFailReason())) {
importDetailPositionDTO.setDetailStatus(ImportDetailStatusEnum.CHECK_FAIL.getStatus());
} else {
importDetailPositionDTO.setDetailStatus(ImportDetailStatusEnum.CHECK_SUCCESS.getStatus());
}
importDetailPositionDTO.setMainId(mainId);
importDetailPositionDTOS.add(importDetailPositionDTO);
}
importDetailPositionService.batchCreate(importDetailPositionDTOS);
super.finishCheck(mainId, importDetailPositionDTOS);
}
private void checkAndFill(ImportDetailPositionDTO importDetailPositionDTO, ImportDetailPositionListenerDTO importDetailPositionListenerDTO) {
BeanUtils.copyProperties(importDetailPositionListenerDTO, importDetailPositionDTO);
importDetailPositionDTO.setDataJson(JsonUtils.toJsonString(importDetailPositionListenerDTO));
if (StringUtils.isBlank(importDetailPositionDTO.getPositionName())) {
importDetailPositionDTO.appendFailMsg("岗位名称不能为空");
} else if (importDetailPositionDTO.getPositionName().length() > 50) {
importDetailPositionDTO.appendFailMsg("岗位名称超过最大限制长度");
importDetailPositionDTO.setPositionName(null);
}
if (StringUtils.isBlank(importDetailPositionListenerDTO.getCompanyName())) {
importDetailPositionDTO.appendFailMsg("用工企业不能为空");
} else {
HrCompanyDTO hrCompanyDTO = hrCompanyService.find(HrCompanyPageQueryDTO.builder().companyTypes(Arrays.asList(HrCompanyEnum.SELF.getType())).companyName(importDetailPositionListenerDTO.getCompanyName()).build());
if (Objects.isNull(hrCompanyDTO)) {
importDetailPositionDTO.appendFailMsg("未查询到对应的用工企业");
} else {
importDetailPositionDTO.setCompanyId(hrCompanyDTO.getId());
importDetailPositionDTO.setOrgId(hrCompanyDTO.getOrgId());
if (StringUtils.isNotBlank(importDetailPositionDTO.getPositionName())) {
//当前机构下,相同的用工企业,不能存在相同的岗位名称
List<Position> positions = positionMapper.selectList(new LambdaQueryWrapper<Position>()
.eq(Position::getCompanyId, importDetailPositionDTO.getCompanyId())
.eq(Position::getOrgId, hrCompanyDTO.getOrgId())
.eq(Position::getPositionName, importDetailPositionDTO.getPositionName())
);
if (CollectionUtils.isNotEmpty(positions)) {
importDetailPositionDTO.appendFailMsg("该用工企业已存在相同的岗位名称");
}
}
}
}
if (StringUtils.isBlank(importDetailPositionDTO.getRecruitTitle())) {
importDetailPositionDTO.appendFailMsg("招聘标题不能为空");
} else if (importDetailPositionDTO.getRecruitTitle().length() > 255) {
importDetailPositionDTO.appendFailMsg("招聘标题超过最大限制长度");
importDetailPositionDTO.setRecruitTitle(null);
}
if (!Objects.isNull(importDetailPositionDTO.getPositionNumber()) && importDetailPositionDTO.getPositionNumber() > 30000) {
importDetailPositionDTO.appendFailMsg("招聘人数超过最大限制");
importDetailPositionDTO.setPositionNumber(null);
}
if (StringUtils.isBlank(importDetailPositionDTO.getPositionAddress())) {
importDetailPositionDTO.appendFailMsg("工作地址不能为空");
} else if (importDetailPositionDTO.getPositionAddress().length() > 255) {
importDetailPositionDTO.appendFailMsg("工作地址超过最大限制长度");
importDetailPositionDTO.setPositionAddress(null);
}
if (StringUtils.isBlank(importDetailPositionDTO.getRecruitPositionType())) {
importDetailPositionDTO.appendFailMsg("岗位性质不能为空");
} else {
String recruitPositionTypeCode = DictUtils.getNameCodeMap("recruit_position_type").get(importDetailPositionDTO.getRecruitPositionType());
if (StringUtils.isBlank(recruitPositionTypeCode)) {
importDetailPositionDTO.appendFailMsg("岗位性质有误,请重新操作");
importDetailPositionDTO.setRecruitPositionType(null);
} else {
importDetailPositionDTO.setRecruitPositionType(recruitPositionTypeCode);
if (Objects.nonNull(importDetailPositionDTO.getOrgId())) {
Org org = orgMapper.selectOne(new LambdaQueryWrapper<Org>().eq(Org::getDeleted, false).eq(Org::getId, importDetailPositionDTO.getOrgId()));
//判断招聘岗位类型权限
if (!org.getRecruitPositionType().equals(RecruitPositionTypeEnum.ODD_JOB_OR_GENERAL_WORKER.getType())) {
if (!StringUtils.equals(org.getRecruitPositionType(), importDetailPositionDTO.getRecruitPositionType())) {
if (StringUtils.equals(org.getRecruitPositionType(), RecruitPositionTypeEnum.ODD_JOB.getType())) {
importDetailPositionDTO.appendFailMsg("当前企业仅支持维护零工性质岗位。");
importDetailPositionDTO.setRecruitPositionType(null);
}
if (StringUtils.equals(org.getRecruitPositionType(), RecruitPositionTypeEnum.GENERAL_WORKER.getType())) {
importDetailPositionDTO.appendFailMsg("当前企业仅支持维护普工性质岗位。");
importDetailPositionDTO.setRecruitPositionType(null);
}
}
}
}
}
}
if (StringUtils.isNotBlank(importDetailPositionDTO.getPositionTypeName())) {
if (importDetailPositionDTO.getPositionTypeName().length() > 32) {
importDetailPositionDTO.appendFailMsg("岗位类型超过最大限制长度");
importDetailPositionDTO.setPositionTypeName(null);
}
}
if (StringUtils.isNotBlank(importDetailPositionDTO.getPositionTag()) && importDetailPositionDTO.getPositionTag().length() > 512) {
importDetailPositionDTO.appendFailMsg("岗位标签超过最大限制长度");
importDetailPositionDTO.setPositionTag(null);
}
if (StringUtils.isNotBlank(importDetailPositionDTO.getPayDate()) && importDetailPositionDTO.getPayDate().length() > 32) {
importDetailPositionDTO.appendFailMsg("发薪日超过最大限制长度");
importDetailPositionDTO.setPayDate(null);
}
if (StringUtils.isBlank(importDetailPositionDTO.getSexRequire())) {
importDetailPositionDTO.appendFailMsg("性别不能为空");
} else {
if (importDetailPositionDTO.getSexRequire().length() > 2) {
importDetailPositionDTO.appendFailMsg("性别超过最大限制长度");
importDetailPositionDTO.setSexRequire(null);
}else {
String gender = DictUtils.getNameCodeMap("gender_require").get(importDetailPositionDTO.getSexRequire());
if (StringUtils.isBlank(gender)) {
importDetailPositionDTO.appendFailMsg("性别有误,请重新操作");
importDetailPositionDTO.setSexRequire(null);
} else {
importDetailPositionDTO.setSexRequire(gender);
}
}
}
if (StringUtils.isBlank(importDetailPositionDTO.getEducationRequire())) {
importDetailPositionDTO.appendFailMsg("学历不能为空");
} else {
if (importDetailPositionDTO.getEducationRequire().length() > 64) {
importDetailPositionDTO.appendFailMsg("学历超过最大限制长度");
importDetailPositionDTO.setEducationRequire(null);
} else {
String educationCode = DictUtils.getNameCodeMap("education").get(importDetailPositionDTO.getEducationRequire());
if (StringUtils.isBlank(educationCode)) {
importDetailPositionDTO.appendFailMsg("学历有误,请重新操作");
importDetailPositionDTO.setEducationRequire(null);
} else {
importDetailPositionDTO.setEducationRequire(educationCode);
}
}
}
if (StringUtils.isBlank(importDetailPositionDTO.getExperienceRequire())) {
importDetailPositionDTO.appendFailMsg("经验不能为空");
} else {
if (importDetailPositionDTO.getExperienceRequire().length() > 32) {
importDetailPositionDTO.appendFailMsg("经验超过最大限制长度");
importDetailPositionDTO.setExperienceRequire(null);
}else {
String experienceCode = DictUtils.getNameCodeMap("RECRUIT_WORK_YEAR").get(importDetailPositionDTO.getExperienceRequire());
if (StringUtils.isBlank(experienceCode)) {
importDetailPositionDTO.appendFailMsg("经验有误,请重新操作");
importDetailPositionDTO.setExperienceRequire(null);
} else {
importDetailPositionDTO.setExperienceRequire(experienceCode);
}
}
}
if (StringUtils.isNotBlank(importDetailPositionDTO.getCertificatesRequire()) && importDetailPositionDTO.getCertificatesRequire().length() > 32) {
importDetailPositionDTO.appendFailMsg("证件超过最大限制长度");
importDetailPositionDTO.setCertificatesRequire(null);
}
if (StringUtils.isNotBlank(importDetailPositionDTO.getOtherRequire()) && importDetailPositionDTO.getOtherRequire().length() > 32) {
importDetailPositionDTO.appendFailMsg("其它超过最大限制长度");
importDetailPositionDTO.setOtherRequire(null);
}
if (StringUtils.isBlank(importDetailPositionDTO.getJobContent())) {
importDetailPositionDTO.appendFailMsg("工作内容不能为空");
}
if (StringUtils.isNotBlank(importDetailPositionDTO.getSalaryType())) {
String salaryTypeCode = DictUtils.getNameCodeMap("salary_type").get(importDetailPositionDTO.getSalaryType());
if (StringUtils.isBlank(salaryTypeCode)) {
importDetailPositionDTO.appendFailMsg("薪资类型有误,请重新操作");
importDetailPositionDTO.setSalaryType(null);
} else {
importDetailPositionDTO.setSalaryType(salaryTypeCode);
}
}
if (StringUtils.isBlank(importDetailPositionDTO.getEndTime())) {
importDetailPositionDTO.appendFailMsg("有效期截止时间不能为空");
}else {
try {
if (DateUtil.endOfDay(DateUtil.parse(importDetailPositionDTO.getEndTime())).getTime() <= DateUtil.endOfDay(new Date()).getTime()) {
importDetailPositionDTO.appendFailMsg("岗位有效期不能小于等于当前日期");
}
importDetailPositionDTO.setEndTime(DateUtil.format(DateUtil.endOfDay(DateUtil.parse(importDetailPositionDTO.getEndTime())),"yyyy-MM-dd HH:mm:ss"));
}catch (Exception e) {
importDetailPositionDTO.appendFailMsg("有效期截止时间格式不正确");
importDetailPositionDTO.setEndTime(null);
}
}
}
@Transactional(rollbackFor = Exception.class)
@Override
public Long execute(ImportDetailPositionExecuteDTO executeDto) {
Long mainId = executeDto.getMainId();
Assert.notNull(mainId, "参数异常");
ImportMainDTO importMainDTO = importMainService.find(ImportMainQueryDTO.builder().id(mainId).build());
Assert.notNull(importMainDTO, "未查询到导入数据");
ImportDetailPositionPageQueryDTO queryDTO = new ImportDetailPositionPageQueryDTO();
queryDTO.disablePage();
queryDTO.setMainId(mainId);
queryDTO.setDetailStatus(ImportDetailStatusEnum.CHECK_SUCCESS.getStatus());
List<ImportDetailPositionDTO> importDetailPositionDTOS = importDetailPositionService.page(queryDTO);
if (CollectionUtils.isEmpty(importDetailPositionDTOS)) {
throw new BusinessException("未查询到成功的明细数据");
}
for (ImportDetailPositionDTO importDetailPositionDTO : importDetailPositionDTOS) {
PositionOperatorDTO position = new PositionOperatorDTO();
BeanUtils.copyProperties(importDetailPositionDTO, position);
position.setEndTime(DateUtil.parse(importDetailPositionDTO.getEndTime()));
//工作地址匹配当前用工企业下的工作地址,有就用,没有就创建一个, 地图控件要是返回多条记录,取第一个。
//先直接创建。后续接了地图在改
List<PositionAddress> positionAddressList = positionAddressMapper.selectList(new LambdaQueryWrapper<PositionAddress>()
.eq(PositionAddress::getDeleted, false)
.eq(PositionAddress::getCompanyId, importDetailPositionDTO.getCompanyId())
.eq(PositionAddress::getDetailAddress, importDetailPositionDTO.getPositionAddress())
);
if (CollectionUtils.isEmpty(positionAddressList)) {
PositionAddress positionAddress = new PositionAddress();
positionAddress.setCompanyId(importDetailPositionDTO.getCompanyId());
positionAddress.setDetailAddress(importDetailPositionDTO.getPositionAddress());
AlitaResult<TencentMapGeocoderResDTO> alitaResult = tencentMapContext.webServiceGeocoder(TencentMapGeocoderReqDTO.builder()
.address(importDetailPositionDTO.getPositionAddress())
.build());
if (Boolean.TRUE.equals(alitaResult.getSuccess())) {
TencentMapGeocoderResDTO resultData = alitaResult.getData();
TencentMapGeocoderResDTO.TencentMapGeocoderLocationResDTO location = resultData.getLocation();
if (Objects.nonNull(location)) {
positionAddress.setLatitude(location.getLat());
positionAddress.setLongitude(location.getLng());
}
}
positionAddressMapper.saveEntity(positionAddress);
position.setAddressId(positionAddress.getId());
} else {
position.setAddressId(positionAddressList.get(0).getId());
}
//岗位类型 名称匹配,存code, 匹配不到就不存此字段
List<PositionType> positionTypeList = positionTypeMapper.selectList(new LambdaQueryWrapper<PositionType>().eq(PositionType::getDeleted, false).eq(PositionType::getName, importDetailPositionDTO.getPositionTypeName()));
if (CollectionUtils.isNotEmpty(positionTypeList)) {
position.setPositionType(positionTypeList.get(0).getCode());
}
//工作性质:短工、全职、实习
//岗位性质:零工、普通岗
//招聘岗位类型:零工、普通岗、零工+普通岗
if (StringUtils.isNotBlank(position.getRecruitPositionType())) {
String jobCategory = null;
switch (position.getRecruitPositionType()) {
case "1":
jobCategory = "2";
break;
case "2":
jobCategory = "1";
break;
default:
break;
}
position.setJobCategory(jobCategory);
}
PositionNewOperatorDTO positionNewOperatorDTO = new PositionNewOperatorDTO();
BeanUtils.copyProperties(position, positionNewOperatorDTO);
PositionNewDTO positionNewDTO = positionAuditService.positionCreate(positionNewOperatorDTO);
ImportDetailPositionOperatorDTO updateImportDetailPositionDTO = new ImportDetailPositionOperatorDTO();
BeanUtils.copyProperties(importDetailPositionDTO, updateImportDetailPositionDTO);
updateImportDetailPositionDTO.setExtraDetailId(positionNewDTO.getId());
updateImportDetailPositionDTO.setEndTime(DateUtil.parse(importDetailPositionDTO.getEndTime()));
importDetailPositionService.modify(updateImportDetailPositionDTO);
}
return null;
}
}

View File

@@ -0,0 +1,550 @@
package com.newyetai.recruit.position.service.impl;
import com.google.common.collect.Lists;
import com.google.common.collect.Sets;
import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.read.builder.ExcelReaderBuilder;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.newyetai.common.constant.CommonConstants;
import com.newyetai.common.dto.ExportHeadDetailInfoDTO;
import com.newyetai.common.dto.ExportHeadInfoDTO;
import com.newyetai.common.easyexcel.ExcelUtil;
import com.newyetai.common.exception.BusinessException;
import com.newyetai.common.exception.util.Assert;
import com.newyetai.common.util.JsonUtils;
import com.newyetai.common.util.UserContextHolder;
import com.newyetai.component.dict.util.DictUtils;
import com.newyetai.recruit.company.dto.HrCompanyDTO;
import com.newyetai.recruit.company.dto.HrCompanyPageQueryDTO;
import com.newyetai.recruit.company.enums.HrCompanyEnum;
import com.newyetai.recruit.company.service.IHrCompanyService;
import com.newyetai.component.commonimport.constant.ImportDetailStatusEnum;
import com.newyetai.component.commonimport.constant.ImportStatusEnum;
import com.newyetai.component.commonimport.constant.ImportTypeEnum;
import com.newyetai.component.commonimport.dto.ImportDetailPageDTO;
import com.newyetai.component.commonimport.dto.ImportMainDTO;
import com.newyetai.component.commonimport.dto.ImportMainQueryDTO;
import com.newyetai.component.commonimport.dto.ImportMainUpdateDTO;
import com.newyetai.component.commonimport.service.ImportMainService;
import com.newyetai.component.commonimport.service.impl.AbstractCommonImportProvider;
import com.newyetai.component.file.entity.FileRecord;
import com.newyetai.component.file.service.FileRecordService;
import com.newyetai.recruit.position.dao.PositionAddressMapper;
import com.newyetai.recruit.position.dao.PositionMapper;
import com.newyetai.recruit.position.dao.PositionTypeMapper;
import com.newyetai.recruit.position.dto.ImportDetailPositionDTO;
import com.newyetai.recruit.position.dto.ImportDetailPositionExecuteDTO;
import com.newyetai.recruit.position.dto.ImportDetailPositionExportDTO;
import com.newyetai.recruit.position.dto.ImportDetailPositionListenerDTO;
import com.newyetai.recruit.position.dto.ImportDetailPositionOperatorDTO;
import com.newyetai.recruit.position.dto.ImportDetailPositionPageQueryDTO;
import com.newyetai.recruit.position.dto.PositionDTO;
import com.newyetai.recruit.position.dto.PositionExportDTO;
import com.newyetai.recruit.position.dto.PositionNewDTO;
import com.newyetai.recruit.position.dto.PositionNewOperatorDTO;
import com.newyetai.recruit.position.dto.PositionOperatorDTO;
import com.newyetai.recruit.position.entity.Position;
import com.newyetai.recruit.position.entity.PositionAddress;
import com.newyetai.recruit.position.entity.PositionType;
import com.newyetai.recruit.position.service.ImportDetailPositionService;
import com.newyetai.recruit.position.service.PositionAuditService;
import com.newyetai.recruit.position.service.PositionService;
import com.newyetai.recruit.talent.dto.ImportDetailTalentPageQueryDTO;
import com.newyetai.tkmybatis.pojo.Page;
import com.newyetai.usercenter.org.dao.OrgMapper;
import com.newyetai.usercenter.org.entity.Org;
import com.newyetai.usercenter.org.enums.RecruitPositionTypeEnum;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.io.InputStream;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;
import javax.annotation.Resource;
import cn.hutool.core.date.DateUtil;
import lombok.extern.slf4j.Slf4j;
/**
* @description:
* @author: guixinman
* @create: 2024-04-11 17:45
**/
@Service
@Slf4j
public class ImportDetailPositionProvider extends AbstractCommonImportProvider<ImportDetailPositionExecuteDTO, ImportDetailPositionDTO, ImportDetailPositionListenerDTO> {
@Autowired
private ImportDetailPositionService importDetailPositionService;
@Autowired
private ImportMainService importMainService;
@Autowired
private FileRecordService fileRecordService;
@Autowired
private IHrCompanyService hrCompanyService;
@Autowired
private PositionAuditService positionAuditService;
@Resource
private PositionMapper positionMapper;
@Resource
private PositionTypeMapper positionTypeMapper;
@Resource
private PositionAddressMapper positionAddressMapper;
@Resource
private OrgMapper orgMapper;
public ImportDetailPositionProvider(ImportMainService imprImportMainService) {
super(imprImportMainService);
}
@Override
public String getType() {
return ImportTypeEnum.POSITION.getType();
}
@Override
public Page<ImportDetailPositionDTO> pageDetail(ImportDetailPageDTO importDetailPageDTO) {
ImportDetailPositionPageQueryDTO queryDTO = new ImportDetailPositionPageQueryDTO();
BeanUtils.copyProperties(importDetailPageDTO, queryDTO);
importDetailPositionService.page(queryDTO);
return queryDTO.getPageResult();
}
@Override
public void importDetailExport(ImportDetailPageDTO importDetailPageDTO) {
ImportDetailPositionPageQueryDTO queryDTO = new ImportDetailPositionPageQueryDTO();
BeanUtils.copyProperties(importDetailPageDTO, queryDTO);
queryDTO.disablePage();
List<ImportDetailPositionDTO> list = importDetailPositionService.page(queryDTO);
List<ImportDetailPositionExportDTO> exportDTOList = list.stream().map(dto -> {
ImportDetailPositionExportDTO importDetailPositionExportDTO = JsonUtils.toObject(dto.getDataJson(), ImportDetailPositionExportDTO.class);
importDetailPositionExportDTO.setRemark(dto.getRemark());
importDetailPositionExportDTO.setFailReason(dto.getFailReason());
return importDetailPositionExportDTO;
}).collect(Collectors.toList());
if (org.springframework.util.CollectionUtils.isEmpty(exportDTOList)) {
return;
}
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMddHHmmss");
String commonImportDetailStatus = DictUtils.getCodeNameMap("common_import_detail_status").get(String.valueOf(importDetailPageDTO.getDetailStatus()));
String fileName = "岗位导入" + (StringUtils.isNotBlank(commonImportDetailStatus) ? commonImportDetailStatus : "") + "明细导出" + "(" + formatter.format(LocalDateTime.now()) + ")";
ExportHeadInfoDTO infoDTO = ExportHeadInfoDTO.builder()
.fileName(fileName)
.build();
List<ExportHeadDetailInfoDTO> heads = infoDTO.getHeads();
heads.add(ExportHeadDetailInfoDTO.builder().head("用工企业").build());
heads.add(ExportHeadDetailInfoDTO.builder().head("岗位名称").build());
heads.add(ExportHeadDetailInfoDTO.builder().head("招聘标题").build());
heads.add(ExportHeadDetailInfoDTO.builder().head("招聘人数").build());
heads.add(ExportHeadDetailInfoDTO.builder().head("工作地址").build());
heads.add(ExportHeadDetailInfoDTO.builder().head("岗位性质").build());
heads.add(ExportHeadDetailInfoDTO.builder().head("岗位类型").build());
heads.add(ExportHeadDetailInfoDTO.builder().head("岗位标签").build());
heads.add(ExportHeadDetailInfoDTO.builder().head("薪资下限").build());
heads.add(ExportHeadDetailInfoDTO.builder().head("薪资上限").build());
heads.add(ExportHeadDetailInfoDTO.builder().head("薪资类型").build());
heads.add(ExportHeadDetailInfoDTO.builder().head("发薪日").build());
heads.add(ExportHeadDetailInfoDTO.builder().head("性别").build());
heads.add(ExportHeadDetailInfoDTO.builder().head("年龄(下限)").build());
heads.add(ExportHeadDetailInfoDTO.builder().head("年龄(上限)").build());
heads.add(ExportHeadDetailInfoDTO.builder().head("学历").build());
heads.add(ExportHeadDetailInfoDTO.builder().head("经验").build());
heads.add(ExportHeadDetailInfoDTO.builder().head("证件").build());
heads.add(ExportHeadDetailInfoDTO.builder().head("其他").build());
heads.add(ExportHeadDetailInfoDTO.builder().head("工作内容").build());
heads.add(ExportHeadDetailInfoDTO.builder().head("失败原因").build());
heads.add(ExportHeadDetailInfoDTO.builder().head("备注").build());
List<List> datas = Lists.newArrayList();
for (ImportDetailPositionExportDTO dto : exportDTOList) {
List objects = Lists.newArrayList();
datas.add(objects);
objects.add(dto.getCompanyName());
objects.add(dto.getPositionName());
objects.add(dto.getRecruitTitle());
objects.add(dto.getPositionNumber());
objects.add(dto.getPositionAddress());
objects.add(dto.getRecruitPositionType());
objects.add(dto.getPositionTypeName());
objects.add(dto.getPositionTag());
objects.add(dto.getSalaryLow());
objects.add(dto.getSalaryUp());
objects.add(dto.getSalaryType());
objects.add(dto.getPayDate());
objects.add(dto.getSexRequire());
objects.add(dto.getAgeLow());
objects.add(dto.getAgeUp());
objects.add(dto.getEducationRequire());
objects.add(dto.getExperienceRequire());
objects.add(dto.getCertificatesRequire());
objects.add(dto.getOtherRequire());
objects.add(dto.getJobContent());
objects.add(dto.getFailReason());
objects.add(dto.getRemark());
}
infoDTO.setDatas(datas);
ExcelUtil.dynamicExportTemplate(infoDTO);
}
@Override
public List<ImportDetailPositionListenerDTO> analy(Long mainId) {
// 解析文件+明细
ImportMainDTO importMainDTO = importMainService.find(ImportMainQueryDTO.builder().id(mainId).build());
Assert.notNull(importMainDTO, "未查询到导入的数据");
FileRecord fileRecord;
try {
fileRecord = fileRecordService.find(FileRecord.builder().fileCode(importMainDTO.getFileCode()).build());
} catch (Exception e) {
log.info("导入文件异常,", e);
fileRecord = null;
}
Assert.notNull(fileRecord, "上传文件不存在");
try (InputStream is = fileRecordService.getFile(importMainDTO.getFileCode())) {
ImportPositionExcelListener listener = new ImportPositionExcelListener();
ExcelReaderBuilder reader = EasyExcel.read(is, ImportDetailPositionListenerDTO.class, listener);
reader.sheet().doRead();
List<ImportDetailPositionListenerDTO> dtos = listener.getDtos();
Assert.isTrue(!dtos.isEmpty(), "导入文件无有效数据");
return dtos;
} catch (Exception e) {
throw new BusinessException(e.getMessage());
}
}
@Transactional(rollbackFor = Exception.class)
@Override
public void checkAndSave(Long mainId, List<ImportDetailPositionListenerDTO> detailCreateDtos) {
//更改状态为校验中
ImportMainUpdateDTO updateDto = ImportMainUpdateDTO.builder().id(mainId)
.oldStatusSet(Sets.newHashSet(ImportStatusEnum.INIT.getStatus()))
.newStatus(ImportStatusEnum.CHECKING.getStatus())
.build();
importMainService.modify(updateDto);
List<ImportDetailPositionDTO> importDetailPositionDTOS = new ArrayList<>();
//存储用工企业+岗位名称。用于校验 导入的数据中有没有重复的
List<String> companyIdPositionNames = new ArrayList<>();
for (ImportDetailPositionListenerDTO importDetailPositionListenerDTO : detailCreateDtos) {
ImportDetailPositionDTO importDetailPositionDTO = new ImportDetailPositionDTO();
this.checkAndFill(importDetailPositionDTO, importDetailPositionListenerDTO);
if (StringUtils.isBlank(importDetailPositionDTO.getFailReason())) {
if (companyIdPositionNames.contains(StringUtils.join(importDetailPositionListenerDTO.getCompanyName(), importDetailPositionListenerDTO.getPositionName()))) {
importDetailPositionDTO.appendFailMsg("用工企业+岗位名称出现多次");
}
//存储用工企业+岗位名称
companyIdPositionNames.add(StringUtils.join(importDetailPositionListenerDTO.getCompanyName(), importDetailPositionListenerDTO.getPositionName()));
}
if (StringUtils.isNotBlank(importDetailPositionDTO.getFailReason())) {
importDetailPositionDTO.setDetailStatus(ImportDetailStatusEnum.CHECK_FAIL.getStatus());
} else {
importDetailPositionDTO.setDetailStatus(ImportDetailStatusEnum.CHECK_SUCCESS.getStatus());
}
importDetailPositionDTO.setMainId(mainId);
importDetailPositionDTO.setOrgId(UserContextHolder.getExistLoginOrgId());
importDetailPositionDTOS.add(importDetailPositionDTO);
}
importDetailPositionService.batchCreate(importDetailPositionDTOS);
super.finishCheck(mainId, importDetailPositionDTOS);
}
private void checkAndFill(ImportDetailPositionDTO importDetailPositionDTO, ImportDetailPositionListenerDTO importDetailPositionListenerDTO) {
BeanUtils.copyProperties(importDetailPositionListenerDTO, importDetailPositionDTO);
importDetailPositionDTO.setDataJson(JsonUtils.toJsonString(importDetailPositionListenerDTO));
if (StringUtils.isBlank(importDetailPositionDTO.getPositionName())) {
importDetailPositionDTO.appendFailMsg("岗位名称不能为空");
} else if (importDetailPositionDTO.getPositionName().length() > 50) {
importDetailPositionDTO.appendFailMsg("岗位名称超过最大限制长度");
importDetailPositionDTO.setPositionName(null);
}
if (StringUtils.isBlank(importDetailPositionListenerDTO.getCompanyName())) {
importDetailPositionDTO.appendFailMsg("用工企业不能为空");
} else {
HrCompanyDTO hrCompanyDTO = hrCompanyService.find(HrCompanyPageQueryDTO.builder().orgId(UserContextHolder.getExistLoginOrgId()).companyTypes(Arrays.asList(HrCompanyEnum.KH.getType(), HrCompanyEnum.SELF.getType())).companyName(importDetailPositionListenerDTO.getCompanyName()).build());
if (Objects.isNull(hrCompanyDTO)) {
importDetailPositionDTO.appendFailMsg("未查询到对应的用工企业");
} else {
importDetailPositionDTO.setCompanyId(hrCompanyDTO.getId());
if (StringUtils.isNotBlank(importDetailPositionDTO.getPositionName())) {
//当前机构下,相同的用工企业,不能存在相同的岗位名称
List<Position> positions = positionMapper.selectList(new LambdaQueryWrapper<Position>()
.eq(Position::getCompanyId, importDetailPositionDTO.getCompanyId())
.eq(Position::getOrgId, UserContextHolder.getExistLoginOrgId())
.eq(Position::getPositionName, importDetailPositionDTO.getPositionName())
);
if (CollectionUtils.isNotEmpty(positions)) {
importDetailPositionDTO.appendFailMsg("该用工企业已存在相同的岗位名称");
}
}
}
}
if (StringUtils.isBlank(importDetailPositionDTO.getRecruitTitle())) {
importDetailPositionDTO.appendFailMsg("招聘标题不能为空");
} else if (importDetailPositionDTO.getRecruitTitle().length() > 255) {
importDetailPositionDTO.appendFailMsg("招聘标题超过最大限制长度");
importDetailPositionDTO.setRecruitTitle(null);
}
if (!Objects.isNull(importDetailPositionDTO.getPositionNumber()) && importDetailPositionDTO.getPositionNumber() > 30000) {
importDetailPositionDTO.appendFailMsg("招聘人数超过最大限制");
importDetailPositionDTO.setPositionNumber(null);
}
if (StringUtils.isBlank(importDetailPositionDTO.getPositionAddress())) {
importDetailPositionDTO.appendFailMsg("工作地址不能为空");
} else if (importDetailPositionDTO.getPositionAddress().length() > 255) {
importDetailPositionDTO.appendFailMsg("工作地址超过最大限制长度");
importDetailPositionDTO.setPositionAddress(null);
}
if (StringUtils.isBlank(importDetailPositionDTO.getRecruitPositionType())) {
importDetailPositionDTO.appendFailMsg("岗位性质不能为空");
} else {
String recruitPositionTypeCode = DictUtils.getNameCodeMap("recruit_position_type").get(importDetailPositionDTO.getRecruitPositionType());
if (StringUtils.isBlank(recruitPositionTypeCode)) {
importDetailPositionDTO.appendFailMsg("岗位性质有误,请重新操作");
importDetailPositionDTO.setRecruitPositionType(null);
} else {
importDetailPositionDTO.setRecruitPositionType(recruitPositionTypeCode);
Org org = orgMapper.selectOne(new LambdaQueryWrapper<Org>().eq(Org::getDeleted, false).eq(Org::getId, UserContextHolder.getExistLoginOrgId()));
//判断招聘岗位类型权限
if (!org.getRecruitPositionType().equals(RecruitPositionTypeEnum.ODD_JOB_OR_GENERAL_WORKER.getType())) {
if (!StringUtils.equals(org.getRecruitPositionType(), importDetailPositionDTO.getRecruitPositionType())) {
if (StringUtils.equals(org.getRecruitPositionType(), RecruitPositionTypeEnum.ODD_JOB.getType())) {
importDetailPositionDTO.appendFailMsg("当前企业仅支持维护零工性质岗位。");
importDetailPositionDTO.setRecruitPositionType(null);
}
if (StringUtils.equals(org.getRecruitPositionType(), RecruitPositionTypeEnum.GENERAL_WORKER.getType())) {
importDetailPositionDTO.appendFailMsg("当前企业仅支持维护普工性质岗位。");
importDetailPositionDTO.setRecruitPositionType(null);
}
}
}
}
}
if (StringUtils.isNotBlank(importDetailPositionDTO.getPositionTypeName())) {
if (importDetailPositionDTO.getPositionTypeName().length() > 32) {
importDetailPositionDTO.appendFailMsg("岗位类型超过最大限制长度");
importDetailPositionDTO.setPositionTypeName(null);
}
}
if (StringUtils.isNotBlank(importDetailPositionDTO.getPositionTag()) && importDetailPositionDTO.getPositionTag().length() > 512) {
importDetailPositionDTO.appendFailMsg("岗位标签超过最大限制长度");
importDetailPositionDTO.setPositionTag(null);
}
if (StringUtils.isNotBlank(importDetailPositionDTO.getPayDate()) && importDetailPositionDTO.getPayDate().length() > 32) {
importDetailPositionDTO.appendFailMsg("发薪日超过最大限制长度");
importDetailPositionDTO.setPayDate(null);
}
if (StringUtils.isBlank(importDetailPositionDTO.getSexRequire())) {
importDetailPositionDTO.appendFailMsg("性别不能为空");
} else {
if (importDetailPositionDTO.getSexRequire().length() > 2) {
importDetailPositionDTO.appendFailMsg("性别超过最大限制长度");
importDetailPositionDTO.setSexRequire(null);
}else {
String gender = DictUtils.getNameCodeMap("gender_require").get(importDetailPositionDTO.getSexRequire());
if (StringUtils.isBlank(gender)) {
importDetailPositionDTO.appendFailMsg("性别有误,请重新操作");
importDetailPositionDTO.setSexRequire(null);
} else {
importDetailPositionDTO.setSexRequire(gender);
}
}
}
if (StringUtils.isBlank(importDetailPositionDTO.getEducationRequire())) {
importDetailPositionDTO.appendFailMsg("学历不能为空");
} else {
if (importDetailPositionDTO.getEducationRequire().length() > 64) {
importDetailPositionDTO.appendFailMsg("学历超过最大限制长度");
importDetailPositionDTO.setEducationRequire(null);
} else {
String educationCode = DictUtils.getNameCodeMap("education").get(importDetailPositionDTO.getEducationRequire());
if (StringUtils.isBlank(educationCode)) {
importDetailPositionDTO.appendFailMsg("学历有误,请重新操作");
importDetailPositionDTO.setEducationRequire(null);
} else {
importDetailPositionDTO.setEducationRequire(educationCode);
}
}
}
if (StringUtils.isBlank(importDetailPositionDTO.getExperienceRequire())) {
importDetailPositionDTO.appendFailMsg("经验不能为空");
} else {
if (importDetailPositionDTO.getExperienceRequire().length() > 32) {
importDetailPositionDTO.appendFailMsg("经验超过最大限制长度");
importDetailPositionDTO.setExperienceRequire(null);
}else {
String experienceCode = DictUtils.getNameCodeMap("RECRUIT_WORK_YEAR").get(importDetailPositionDTO.getExperienceRequire());
if (StringUtils.isBlank(experienceCode)) {
importDetailPositionDTO.appendFailMsg("经验有误,请重新操作");
importDetailPositionDTO.setExperienceRequire(null);
} else {
importDetailPositionDTO.setExperienceRequire(experienceCode);
}
}
}
if (StringUtils.isNotBlank(importDetailPositionDTO.getCertificatesRequire()) && importDetailPositionDTO.getCertificatesRequire().length() > 32) {
importDetailPositionDTO.appendFailMsg("证件超过最大限制长度");
importDetailPositionDTO.setCertificatesRequire(null);
}
if (StringUtils.isNotBlank(importDetailPositionDTO.getOtherRequire()) && importDetailPositionDTO.getOtherRequire().length() > 32) {
importDetailPositionDTO.appendFailMsg("其它超过最大限制长度");
importDetailPositionDTO.setOtherRequire(null);
}
if (StringUtils.isBlank(importDetailPositionDTO.getJobContent())) {
importDetailPositionDTO.appendFailMsg("工作内容不能为空");
}
if (StringUtils.isNotBlank(importDetailPositionDTO.getSalaryType())) {
String salaryTypeCode = DictUtils.getNameCodeMap("salary_type").get(importDetailPositionDTO.getSalaryType());
if (StringUtils.isBlank(salaryTypeCode)) {
importDetailPositionDTO.appendFailMsg("薪资类型有误,请重新操作");
importDetailPositionDTO.setSalaryType(null);
} else {
importDetailPositionDTO.setSalaryType(salaryTypeCode);
}
}
if (StringUtils.isBlank(importDetailPositionDTO.getEndTime())) {
importDetailPositionDTO.appendFailMsg("有效期截止时间不能为空");
}else {
try {
if (DateUtil.endOfDay(DateUtil.parse(importDetailPositionDTO.getEndTime())).getTime() <= DateUtil.endOfDay(new Date()).getTime()) {
importDetailPositionDTO.appendFailMsg("岗位有效期不能小于等于当前日期");
}
importDetailPositionDTO.setEndTime(DateUtil.format(DateUtil.endOfDay(DateUtil.parse(importDetailPositionDTO.getEndTime())),"yyyy-MM-dd HH:mm:ss"));
}catch (Exception e) {
importDetailPositionDTO.appendFailMsg("有效期截止时间格式不正确");
importDetailPositionDTO.setEndTime(null);
}
}
}
@Transactional(rollbackFor = Exception.class)
@Override
public Long execute(ImportDetailPositionExecuteDTO executeDto) {
Long mainId = executeDto.getMainId();
Assert.notNull(mainId, "参数异常");
ImportMainDTO importMainDTO = importMainService.find(ImportMainQueryDTO.builder().id(mainId).build());
Assert.notNull(importMainDTO, "未查询到导入数据");
ImportDetailPositionPageQueryDTO queryDTO = new ImportDetailPositionPageQueryDTO();
queryDTO.disablePage();
queryDTO.setMainId(mainId);
queryDTO.setDetailStatus(ImportDetailStatusEnum.CHECK_SUCCESS.getStatus());
List<ImportDetailPositionDTO> importDetailPositionDTOS = importDetailPositionService.page(queryDTO);
if (CollectionUtils.isEmpty(importDetailPositionDTOS)) {
throw new BusinessException("未查询到成功的明细数据");
}
for (ImportDetailPositionDTO importDetailPositionDTO : importDetailPositionDTOS) {
PositionOperatorDTO position = new PositionOperatorDTO();
BeanUtils.copyProperties(importDetailPositionDTO, position);
position.setEndTime(DateUtil.parse(importDetailPositionDTO.getEndTime()));
//工作地址匹配当前用工企业下的工作地址,有就用,没有就创建一个, 地图控件要是返回多条记录,取第一个。
//先直接创建。后续接了地图在改
List<PositionAddress> positionAddressList = positionAddressMapper.selectList(new LambdaQueryWrapper<PositionAddress>()
.eq(PositionAddress::getDeleted, false)
.eq(PositionAddress::getCompanyId, importDetailPositionDTO.getCompanyId())
.eq(PositionAddress::getDetailAddress, importDetailPositionDTO.getPositionAddress())
);
if (CollectionUtils.isEmpty(positionAddressList)) {
PositionAddress positionAddress = new PositionAddress();
positionAddress.setCompanyId(importDetailPositionDTO.getCompanyId());
positionAddress.setDetailAddress(importDetailPositionDTO.getPositionAddress());
positionAddressMapper.saveEntity(positionAddress);
position.setAddressId(positionAddress.getId());
} else {
position.setAddressId(positionAddressList.get(0).getId());
}
//岗位类型 名称匹配,存code, 匹配不到就不存此字段
List<PositionType> positionTypeList = positionTypeMapper.selectList(new LambdaQueryWrapper<PositionType>().eq(PositionType::getDeleted, false).eq(PositionType::getName, importDetailPositionDTO.getPositionTypeName()));
if (CollectionUtils.isNotEmpty(positionTypeList)) {
position.setPositionType(positionTypeList.get(0).getCode());
}
//工作性质:短工、全职、实习
//岗位性质:零工、普通岗
//招聘岗位类型:零工、普通岗、零工+普通岗
if (StringUtils.isNotBlank(position.getRecruitPositionType())) {
String jobCategory = null;
switch (position.getRecruitPositionType()) {
case "1":
jobCategory = "2";
break;
case "2":
jobCategory = "1";
break;
default:
break;
}
position.setJobCategory(jobCategory);
}
PositionNewOperatorDTO positionNewOperatorDTO = new PositionNewOperatorDTO();
BeanUtils.copyProperties(position, positionNewOperatorDTO);
PositionNewDTO positionNewDTO = positionAuditService.positionCreate(positionNewOperatorDTO);
ImportDetailPositionOperatorDTO updateImportDetailPositionDTO = new ImportDetailPositionOperatorDTO();
BeanUtils.copyProperties(importDetailPositionDTO, updateImportDetailPositionDTO);
updateImportDetailPositionDTO.setEndTime(DateUtil.parse(importDetailPositionDTO.getEndTime()));
updateImportDetailPositionDTO.setExtraDetailId(positionNewDTO.getId());
importDetailPositionService.modify(updateImportDetailPositionDTO);
}
return null;
}
}

View File

@@ -0,0 +1,106 @@
package com.newyetai.recruit.position.service.impl;
import cn.hutool.core.date.DateUtil;
import lombok.extern.slf4j.Slf4j;
import com.newyetai.component.commonimport.constant.ImportDetailStatusEnum;
import com.newyetai.recruit.position.convert.ImportDetailPositionConvert;
import com.newyetai.recruit.position.entity.ImportDetailPosition;
import com.newyetai.recruit.position.dto.*;
import com.newyetai.recruit.position.dao.ImportDetailPositionMapper;
import com.newyetai.recruit.position.service.ImportDetailPositionService;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import com.newyetai.common.util.UserContextHolder;
import javax.annotation.Resource;
import java.util.*;
import java.util.stream.Collectors;
/**
* 岗位导入
*
* @author guixinman
* @since 1.0.0 2024-04-12
*/
@Slf4j
@Service
public class ImportDetailPositionServiceImpl implements ImportDetailPositionService {
@Resource
private ImportDetailPositionMapper importDetailPositionMapper;
@Override
public ImportDetailPositionDTO create(ImportDetailPositionOperatorDTO operatorDto) {
ImportDetailPosition importDetailPosition = ImportDetailPositionConvert.INSTANCE.convert(operatorDto);
importDetailPositionMapper.saveEntity(importDetailPosition);
return ImportDetailPositionConvert.INSTANCE.convert(importDetailPosition);
}
@Override
public ImportDetailPositionDTO modify(ImportDetailPositionOperatorDTO operatorDto) {
ImportDetailPositionDTO importDetailPositionDto = this.findById(operatorDto.getId());
if (Objects.isNull(importDetailPositionDto)) {
return null;
}
ImportDetailPosition importDetailPosition = ImportDetailPositionConvert.INSTANCE.convert(operatorDto);
importDetailPositionMapper.updateEntity(importDetailPosition);
return this.findById(operatorDto.getId());
}
@Override
public ImportDetailPositionDTO delete(Long id) {
ImportDetailPositionDTO importDetailPositionDto = this.findById(id);
if (Objects.isNull(importDetailPositionDto)) {
return null;
}
ImportDetailPosition importDetailPosition = ImportDetailPosition.builder().build();
importDetailPosition.setId(id);
importDetailPositionMapper.deleteEntity(importDetailPosition, UserContextHolder.getLoginUserId());
return importDetailPositionDto;
}
@Override
public ImportDetailPositionDTO findById(Long id) {
ImportDetailPosition importDetailPosition = importDetailPositionMapper.getById(id);
if (Objects.isNull(importDetailPosition)) {
return null;
}
return ImportDetailPositionConvert.INSTANCE.convert(importDetailPosition);
}
@Override
public List<ImportDetailPositionDTO> list(ImportDetailPositionQueryDTO queryDTO) {
return importDetailPositionMapper.list(queryDTO);
}
@Override
public List<ImportDetailPositionDTO> page(ImportDetailPositionPageQueryDTO queryDTO) {
return importDetailPositionMapper.page(queryDTO);
}
@Transactional(rollbackFor = Exception.class)
@Override
public void batchCreate(List<ImportDetailPositionDTO> importDetailPositionDTOS) {
if (CollectionUtils.isEmpty(importDetailPositionDTOS)) {
return;
}
List<ImportDetailPosition> importDetailPositions= importDetailPositionDTOS.stream().map(dto -> {
ImportDetailPosition importDetailPosition = new ImportDetailPosition();
BeanUtils.copyProperties(dto, importDetailPosition);
if (ImportDetailStatusEnum.CHECK_SUCCESS.getStatus().intValue() == dto.getDetailStatus().intValue()) {
importDetailPosition.setEndTime(DateUtil.parse(dto.getEndTime()));
}
return importDetailPosition;
}).collect(Collectors.toList());
importDetailPositionMapper.saveEntites(importDetailPositions);
}
}

View File

@@ -0,0 +1,75 @@
package com.newyetai.recruit.position.service.impl;
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import com.newyetai.common.exception.BusinessException;
import com.newyetai.common.exception.util.Assert;
import com.newyetai.recruit.position.dto.ImportDetailPositionListenerDTO;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* @description: 岗位导入
* @author: guixinman
* @create: 2024-04-09 16:49
**/
public class ImportPositionExcelListener extends AnalysisEventListener<ImportDetailPositionListenerDTO> {
private List<ImportDetailPositionListenerDTO> dtos;
private Map<Integer, String> headMap = new HashMap<>();
public ImportPositionExcelListener() {
this.dtos = new ArrayList<>();
}
@Override
public void invoke(ImportDetailPositionListenerDTO data, AnalysisContext context) {
dtos.add(data);
}
@Override
public void doAfterAllAnalysed(AnalysisContext context) {
}
@Override
public void invokeHeadMap(Map headMap, AnalysisContext context) {
this.headMap = headMap;
if (headMap.isEmpty()) {
throw new BusinessException("导入模板表头有误");
}
//姓名、身份证号、发放金额、备注
if (headMap.size() != 21) {
throw new BusinessException("导入模板表头有误");
}
Assert.isTrue(headMap.get(0).toString().contains("用工企业"), "导入模板表头有误");
Assert.isTrue(headMap.get(1).toString().contains("岗位名称"), "导入模板表头有误");
Assert.isTrue(headMap.get(2).toString().contains("招聘标题"), "导入模板表头有误");
Assert.isTrue(headMap.get(3).toString().contains("招聘人数"), "导入模板表头有误");
Assert.isTrue(headMap.get(4).toString().contains("工作地址"), "导入模板表头有误");
Assert.isTrue(headMap.get(5).toString().contains("岗位性质"), "导入模板表头有误");
Assert.isTrue(headMap.get(6).toString().contains("岗位类型"), "导入模板表头有误");
Assert.isTrue(headMap.get(7).toString().contains("岗位标签"), "导入模板表头有误");
Assert.isTrue(headMap.get(8).toString().contains("薪资下限"), "导入模板表头有误");
Assert.isTrue(headMap.get(9).toString().contains("薪资上限"), "导入模板表头有误");
Assert.isTrue(headMap.get(10).toString().contains("薪资类型"), "导入模板表头有误");
Assert.isTrue(headMap.get(11).toString().contains("发薪日"), "导入模板表头有误");
Assert.isTrue(headMap.get(12).toString().contains("性别"), "导入模板表头有误");
Assert.isTrue(headMap.get(13).toString().contains("年龄(下限)"), "导入模板表头有误");
Assert.isTrue(headMap.get(14).toString().contains("年龄(上限)"), "导入模板表头有误");
Assert.isTrue(headMap.get(15).toString().contains("学历"), "导入模板表头有误");
Assert.isTrue(headMap.get(16).toString().contains("经验"), "导入模板表头有误");
Assert.isTrue(headMap.get(17).toString().contains("证件"), "导入模板表头有误");
Assert.isTrue(headMap.get(18).toString().contains("其他"), "导入模板表头有误");
Assert.isTrue(headMap.get(19).toString().contains("工作内容"), "导入模板表头有误");
Assert.isTrue(headMap.get(20).toString().contains("有效期截止时间"), "导入模板表头有误");
}
public List<ImportDetailPositionListenerDTO> getDtos() {
return dtos;
}
}

View File

@@ -0,0 +1,97 @@
package com.newyetai.recruit.position.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.newyetai.common.exception.BusinessException;
import com.newyetai.common.exception.util.Assert;
import com.newyetai.common.util.SensitiveWordUtils;
import com.newyetai.common.util.UserContextHolder;
import com.newyetai.recruit.position.dao.PositionAddressMapper;
import com.newyetai.recruit.position.dto.PositionAddressDTO;
import com.newyetai.recruit.position.dto.PositionAddressOperatorDTO;
import com.newyetai.recruit.position.dto.PositionAddressQueryDTO;
import com.newyetai.recruit.position.entity.PositionAddress;
import com.newyetai.recruit.position.service.PositionAddressService;
import org.apache.commons.compress.utils.Lists;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;
import java.util.Date;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;
import javax.annotation.Resource;
import cn.hutool.core.collection.CollUtil;
import lombok.extern.slf4j.Slf4j;
@Slf4j
@Service
public class PositionAddressServiceImpl implements PositionAddressService {
@Resource
private PositionAddressMapper positionAddressMapper;
@Override
public Long createOrUpdate(PositionAddressOperatorDTO operatorDTO) {
if (!SensitiveWordUtils.check(operatorDTO.getDetailAddress())) {
throw new BusinessException("非法详细地址");
}
Long id = operatorDTO.getId();
if (Objects.isNull(id)) {
PositionAddress positionAddress = new PositionAddress();
BeanUtils.copyProperties(operatorDTO, positionAddress);
positionAddressMapper.saveEntity(positionAddress);
return positionAddress.getId();
} else {
PositionAddress positionAddress = positionAddressMapper.getById(operatorDTO.getId());
Assert.notNull(positionAddress, "地址信息不存在");
PositionAddress positionAddressUpdate = new PositionAddress();
BeanUtils.copyProperties(operatorDTO, positionAddressUpdate);
positionAddressUpdate.setId(positionAddress.getId());
positionAddressUpdate.setUpdateBy(UserContextHolder.getExistLoginUserId());
positionAddressUpdate.setUpdateTime(new Date());
positionAddressMapper.updateEntitySelective(positionAddressUpdate);
return positionAddress.getId();
}
}
@Override
public List<PositionAddressDTO> list(PositionAddressQueryDTO queryDTO) {
LambdaQueryWrapper<PositionAddress> lambdaQueryWrapper = new LambdaQueryWrapper<>();
lambdaQueryWrapper.eq(PositionAddress::getDeleted, false);
if (Objects.nonNull(queryDTO.getCompanyId())) {
lambdaQueryWrapper.eq(PositionAddress::getCompanyId, queryDTO.getCompanyId());
}
if (CollUtil.isNotEmpty(queryDTO.getIds())) {
lambdaQueryWrapper.in(PositionAddress::getId, queryDTO.getIds());
}
List<PositionAddress> positionAddresses = positionAddressMapper.selectList(lambdaQueryWrapper);
if (CollUtil.isNotEmpty(positionAddresses)) {
return positionAddresses.stream().map(positionAddress -> {
PositionAddressDTO positionAddressDTO = new PositionAddressDTO();
BeanUtils.copyProperties(positionAddress, positionAddressDTO);
return positionAddressDTO;
}).collect(
Collectors.toList());
}
return Lists.newArrayList();
}
@Override
public void delete(Long id) {
PositionAddress positionAddress = positionAddressMapper.getById(id);
if (Objects.nonNull(positionAddress)) {
PositionAddress deletePositionAddress = new PositionAddress();
deletePositionAddress.setId(id);
positionAddressMapper.deleteEntity(deletePositionAddress);
}
}
}

View File

@@ -0,0 +1,485 @@
package com.newyetai.recruit.position.service.impl;
import com.google.common.collect.Lists;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.RandomUtil;
import cn.hutool.json.JSONUtil;
import lombok.extern.slf4j.Slf4j;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.newyetai.common.constant.CommonConstants;
import com.newyetai.common.dto.ExportHeadDetailInfoDTO;
import com.newyetai.common.dto.ExportHeadInfoDTO;
import com.newyetai.common.easyexcel.ExcelUtil;
import com.newyetai.common.exception.BusinessException;
import com.newyetai.common.exception.util.Assert;
import com.newyetai.common.util.JsonUtils;
import com.newyetai.common.util.SensitiveWordUtils;
import com.newyetai.component.dict.util.DictUtils;
import com.newyetai.config.entity.Config;
import com.newyetai.config.service.ConfigService;
import com.newyetai.frame.redis.aop.annotation.AutoUnLock;
import com.newyetai.frame.redis.dto.LockDTO;
import com.newyetai.frame.redis.redisson.RedissonUtils;
import com.newyetai.recruit.company.dto.HrCompanyPageQueryDTO;
import com.newyetai.recruit.company.enums.HrCompanyEnum;
import com.newyetai.recruit.company.service.IHrCompanyService;
import com.newyetai.recruit.position.convert.PositionAuditConvert;
import com.newyetai.recruit.position.dao.PositionMapper;
import com.newyetai.recruit.position.entity.Position;
import com.newyetai.recruit.position.entity.PositionAudit;
import com.newyetai.recruit.position.dto.*;
import com.newyetai.recruit.position.dao.PositionAuditMapper;
import com.newyetai.recruit.position.enums.PositionAuditStatusEnum;
import com.newyetai.recruit.position.enums.PositionStatusEnum;
import com.newyetai.recruit.position.service.PositionAuditService;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.aop.framework.AopContext;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import com.newyetai.common.util.UserContextHolder;
import com.newyetai.recruit.position.service.PositionFileService;
import com.newyetai.recruit.position.service.PositionService;
import com.newyetai.usercenter.org.service.OrgService;
import javax.annotation.Resource;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.*;
import java.util.stream.Collectors;
/**
* 岗位审核表
*
* @author guixinman
* @since 1.0.0 2024-07-05
*/
@Slf4j
@Service
public class PositionAuditServiceImpl implements PositionAuditService {
@Resource
private PositionAuditMapper positionAuditMapper;
@Autowired
private PositionService positionService;
@Autowired
private ConfigService configService;
@Resource
private PositionMapper positionMapper;
@Autowired
private PositionFileService positionFileService;
@Autowired
private IHrCompanyService hrCompanyService;
@Autowired
private OrgService orgService;
@Transactional(rollbackFor = Exception.class)
@Override
public PositionNewDTO positionCreate(PositionNewOperatorDTO operatorDto) {
//校验 敏感词 and 其他
this.check(operatorDto);
PositionOperatorDTO positionOperatorDTO = new PositionOperatorDTO();
BeanUtils.copyProperties(operatorDto, positionOperatorDTO);
positionOperatorDTO.setStatus(PositionStatusEnum.CLOSE.getStatus());
PositionDTO positionDTO = positionService.create(positionOperatorDTO);
PositionAudit positionAudit = new PositionAudit();
BeanUtils.copyProperties(positionDTO, positionAudit);
positionAudit.setId(null);
positionAudit.setPositionId(positionDTO.getId());
positionAudit.setVersion(1);
Config config = configService.getConfig("position_audit_enable", CommonConstants.PLATFORM_ORG_ID, true);
if (Objects.nonNull(config)) {
positionAudit.setAuditStatus(PositionAuditStatusEnum.INIT.getStatus());
} else {
BeanUtils.copyProperties(positionDTO, positionOperatorDTO);
positionAudit.setAuditStatus(PositionAuditStatusEnum.SUCCESS.getStatus());
//需要修改岗位表 审核通过会更新岗位表。
positionOperatorDTO.setStatus(PositionStatusEnum.OPEN.getStatus());
positionDTO.setStatus(PositionStatusEnum.OPEN.getStatus());
positionOperatorDTO.setId(positionDTO.getId());
positionService.modify(positionOperatorDTO);
}
positionAuditMapper.saveEntity(positionAudit);
return PositionAuditConvert.INSTANCE.convert(positionDTO);
}
private void check(PositionNewOperatorDTO operatorDto) {
if (Objects.nonNull(operatorDto.getEndTime())) {
Assert.isTrue(! (DateUtil.endOfDay(operatorDto.getEndTime()).getTime() <= DateUtil.endOfDay(new Date()).getTime()),"岗位有效期不能小于等于当前日期");
}
StringBuilder sb = new StringBuilder();
if (!SensitiveWordUtils.check(operatorDto.getPositionName())) {
sb.append("非法岗位名称");
}
if (!SensitiveWordUtils.check(operatorDto.getRecruitTitle())) {
sb.append("非法招聘标题");
}
if (!SensitiveWordUtils.check(operatorDto.getPositionTag())) {
sb.append("非法岗位标签");
}
if (!SensitiveWordUtils.check(operatorDto.getPayDate())) {
sb.append("非法发薪日");
}
if (!SensitiveWordUtils.check(operatorDto.getOtherRequire())) {
sb.append("非法其他");
}
if (!SensitiveWordUtils.check(operatorDto.getJobContent())) {
sb.append("非法工作内容");
}
if (StringUtils.isNotBlank(sb.toString())) {
throw new BusinessException(sb.toString());
}
}
/**
* @description: 具体看禅道需求
* @return:
* @author: guixinman
* @param:
*/
@AutoUnLock
@Transactional(rollbackFor = Exception.class)
@Override
public void positionModify(PositionNewOperatorDTO operatorDto) {
Assert.notNull(operatorDto.getId(), "岗位id不能为空");
Assert.notNull(operatorDto.getPositionAuditId(), "审核id不能为空");
Assert.notNull(operatorDto.getVersion(), "版本号不能为空");
//校验敏感词
this.check(operatorDto);
//对审核表id加锁
Assert.isTrue(
RedissonUtils.tryLockAutomatically(
LockDTO.builder()
.tryLockWaitTime(0L)
.lockTimeout(60 * 5L)
.arg(operatorDto.getPositionAuditId() + "")
.methodName("position:audit:modify")
.build()
),
"岗位编辑正在处理, 请稍后再试");
PositionDTO positionDto = positionService.findById(operatorDto.getId());
if (Objects.isNull(positionDto)) {
throw new BusinessException("未查询到对应岗位数据");
}
//因为admin能修改。所以orgId取岗位表的orgId
operatorDto.setOrgId(positionDto.getOrgId());
Assert.notNull(hrCompanyService.find(HrCompanyPageQueryDTO.builder().id(operatorDto.getCompanyId()).companyTypes(Arrays.asList(HrCompanyEnum.KH.getType(), HrCompanyEnum.SELF.getType())).orgId(positionDto.getOrgId()).build()), "未查询到用工企业");
List<Position> positions = positionMapper.selectList(new LambdaQueryWrapper<Position>()
.eq(Position::getCompanyId, operatorDto.getCompanyId())
.eq(Position::getOrgId, positionDto.getOrgId())
.eq(Position::getPositionName, operatorDto.getPositionName())
.notIn(Position::getId, operatorDto.getId())
);
if (CollectionUtils.isNotEmpty(positions)) {
throw new BusinessException("该用工企业已存在相同的岗位名称,添加失败");
}
LambdaQueryWrapper<PositionAudit> queryWrapper = new LambdaQueryWrapper<PositionAudit>().eq(PositionAudit::getDeleted, 0)
.eq(PositionAudit::getId, operatorDto.getPositionAuditId());
if (!CommonConstants.PLATFORM_ORG_ID.equals(UserContextHolder.getExistLoginOrgId())) {
queryWrapper.eq(PositionAudit::getOrgId, UserContextHolder.getExistLoginOrgId());
}
PositionAudit positionAuditOld = positionAuditMapper.selectOne(queryWrapper);
Assert.notNull(positionAuditOld, "网络异常,请刷新页面重试");
Long positionAuditId = positionAuditMapper.getIdByPositionId(operatorDto.getId());
Assert.notNull(positionAuditId, "网络异常,请刷新页面重试");
Assert.isTrue(positionAuditId == operatorDto.getPositionAuditId().longValue(), "该页面信息已被变更,请刷新页面重试!");
/*
* 修改岗位先进审核表。审核通过后反向更新岗位表。
* 1.如果审核状态是 成功or失败。就新增一条 审核表的记录(看配置对应的状态)
2.如果审核状态是 待审核 ,就修改审核表的记录,如果配置是不审核就修改审核状态是 成功
*/
PositionAudit positionAudit = new PositionAudit();
BeanUtils.copyProperties(operatorDto, positionAudit);
positionAudit.setId(operatorDto.getPositionAuditId());
positionAudit.setPositionId(operatorDto.getId());
Config config = configService.getConfig("position_audit_enable", CommonConstants.PLATFORM_ORG_ID, true);
if (Objects.isNull(config)) {
positionAudit.setAuditStatus(PositionAuditStatusEnum.SUCCESS.getStatus());
//需要修改岗位表 审核通过会更新岗位表。主要是要 更新时间,H5用的
PositionOperatorDTO positionOperatorDTO = new PositionOperatorDTO();
BeanUtils.copyProperties(operatorDto, positionOperatorDTO);
positionOperatorDTO.setStatus(PositionStatusEnum.OPEN.getStatus());
positionService.modify(positionOperatorDTO);
//先删除岗位相册
positionFileService.deleteByPositionId(operatorDto.getId());
if (StringUtils.isNotBlank(operatorDto.getFileJson())) {
List<PositionFileDTO> positionFileDTOS = JsonUtils.toList(operatorDto.getFileJson(), PositionFileDTO.class);
for (PositionFileDTO positionFileDTO : positionFileDTOS) {
positionFileDTO.setId(null);
positionFileDTO.setPositionId(operatorDto.getId());
positionFileService.create(positionFileDTO);
}
}
} else {
positionAudit.setAuditStatus(PositionAuditStatusEnum.INIT.getStatus());
}
if (PositionAuditStatusEnum.INIT.getStatus().equals(positionAuditOld.getAuditStatus())) {
positionAudit.setUpdateBy(UserContextHolder.getExistLoginUserId());
int row = positionAuditMapper.modifyById(positionAudit);
if (row == 0) {
PositionAudit positionAudit1 = positionAuditMapper.selectOne(queryWrapper);
if (!PositionAuditStatusEnum.INIT.getStatus().equals(positionAudit1.getAuditStatus())) {
positionAudit.setVersion(1);
positionAuditMapper.saveEntity(positionAudit);
} else {
if (operatorDto.getVersion().intValue() != positionAudit1.getVersion().intValue()) {
throw new BusinessException("该页面信息已被变更,请刷新页面重试!");
}
}
}
} else {
positionAudit.setVersion(1);
positionAuditMapper.saveEntity(positionAudit);
}
}
@Override
public PositionNewDTO positionFindById(Long id) {
Assert.notNull(id, "参数缺失");
PositionNewPageQueryDTO queryDTO = new PositionNewPageQueryDTO();
queryDTO.disablePage();
queryDTO.setId(id);
List<PositionNewDTO> list = this.positionPage(queryDTO);
return CollectionUtils.isNotEmpty(list) ? list.get(0) : null;
}
@Override
public List<PositionAuditDTO> list(PositionAuditQueryDTO queryDTO) {
return positionAuditMapper.list(queryDTO);
}
@Override
public List<PositionAuditDTO> page(PositionAuditPageQueryDTO queryDTO) {
if (!CommonConstants.PLATFORM_ORG_ID.equals(UserContextHolder.getExistLoginOrgId())) {
if (Objects.isNull(queryDTO.getOrgId())) {
queryDTO.setOrgIds(orgService.childrenOrgIdList(UserContextHolder.getLoginOrgId()));
}
}
return positionAuditMapper.page(queryDTO);
}
@Override
public List<PositionNewDTO> positionPage(PositionNewPageQueryDTO queryDTO) {
if (!CommonConstants.PLATFORM_ORG_ID.equals(UserContextHolder.getExistLoginOrgId())) {
queryDTO.setOrgId(UserContextHolder.getExistLoginOrgId());
}
List<PositionNewDTO> list = positionAuditMapper.positionPage(queryDTO);
for (PositionNewDTO positionNewDTO : list) {
positionNewDTO.setRecruitPositionTypeName(DictUtils.getCodeNameMap("recruit_position_type").get(positionNewDTO.getRecruitPositionType()));
}
return list;
}
@Override
public void export(PositionNewPageQueryDTO queryDTO) {
boolean flag = true;
Integer pageNo = 1;
Integer pageSize = 100;
List<PositionNewDTO> listAll = new ArrayList<>();
while (flag) {
queryDTO.setPageNo(pageNo);
queryDTO.setPageSize(pageSize);
List<PositionNewDTO> list = this.positionPage(queryDTO);
if (org.springframework.util.CollectionUtils.isEmpty(list)) {
flag = false;
continue;
}
if (list.size() < pageSize) {
flag = false;
}
pageNo = pageNo + 1;
listAll.addAll(list);
}
List<PositionExportDTO> collect = listAll.stream().map(dto -> {
PositionExportDTO exportDTO = new PositionExportDTO();
BeanUtils.copyProperties(dto, exportDTO);
exportDTO.setCreateTime(DateUtil.format(dto.getCreateTime(), "yyyy-MM-dd HH:mm:ss"));
exportDTO.setEndTime(DateUtil.format(dto.getEndTime(), "yyyy-MM-dd"));
exportDTO.setStatus(DictUtils.getCodeNameMap("position_status").get(String.valueOf(dto.getStatus())));
exportDTO.setSalary(dto.getSalaryStr());
return exportDTO;
}).collect(Collectors.toList());
if (org.springframework.util.CollectionUtils.isEmpty(collect)) {
return;
}
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMddHHmmss");
String fileName = "岗位明细导出" + "(" + formatter.format(LocalDateTime.now()) + ")";
ExportHeadInfoDTO infoDTO = ExportHeadInfoDTO.builder()
.fileName(fileName)
.build();
List<ExportHeadDetailInfoDTO> heads = infoDTO.getHeads();
heads.add(ExportHeadDetailInfoDTO.builder().head("招聘岗位类型").build());
heads.add(ExportHeadDetailInfoDTO.builder().head("岗位名称").build());
heads.add(ExportHeadDetailInfoDTO.builder().head("用工企业").build());
heads.add(ExportHeadDetailInfoDTO.builder().head("岗位状态").build());
heads.add(ExportHeadDetailInfoDTO.builder().head("招聘人数").build());
heads.add(ExportHeadDetailInfoDTO.builder().head("综合薪资").build());
heads.add(ExportHeadDetailInfoDTO.builder().head("工作地址").build());
heads.add(ExportHeadDetailInfoDTO.builder().head("创建时间").build());
heads.add(ExportHeadDetailInfoDTO.builder().head("有效期截止时间").build());
List<List> datas = Lists.newArrayList();
for (PositionExportDTO dto : collect) {
List objects = Lists.newArrayList();
datas.add(objects);
objects.add(dto.getRecruitPositionTypeName());
objects.add(dto.getPositionName());
objects.add(dto.getCompanyName());
objects.add(dto.getStatus());
objects.add(dto.getPositionNumber());
objects.add(dto.getSalary());
objects.add(dto.getPositionAddress());
objects.add(dto.getCreateTime());
objects.add(dto.getEndTime());
}
infoDTO.setDatas(datas);
ExcelUtil.dynamicExportTemplate(infoDTO);
}
@Transactional(rollbackFor = Exception.class)
@Override
public void audit(PositionAuditReqDTO reqDTO) {
LambdaQueryWrapper<PositionAudit> queryWrapper = new LambdaQueryWrapper<PositionAudit>()
.eq(PositionAudit::getDeleted, false)
.eq(PositionAudit::getId, reqDTO.getId())
.eq(PositionAudit::getVersion, reqDTO.getVersion());
PositionAudit positionAudit = positionAuditMapper.selectOne(queryWrapper);
if (Objects.isNull(positionAudit)) {
throw new BusinessException("岗位信息已更新,请刷新页面重新审核。");
}
reqDTO.setUpdateBy(UserContextHolder.getExistLoginUserId());
int row = positionAuditMapper.audit(reqDTO);
if (row == 0) {
throw new BusinessException("岗位信息已更新,请刷新页面重新审核。");
}
if (PositionAuditStatusEnum.SUCCESS.getStatus().equals(reqDTO.getAuditStatus())) {
//需要修改岗位表 审核通过会更新岗位表。H5用的
PositionOperatorDTO positionOperatorDTO = new PositionOperatorDTO();
BeanUtils.copyProperties(positionAudit, positionOperatorDTO);
positionOperatorDTO.setStatus(PositionStatusEnum.OPEN.getStatus());
positionOperatorDTO.setId(positionAudit.getPositionId());
positionService.modify(positionOperatorDTO);
//先删除岗位相册
positionFileService.deleteByPositionId(positionAudit.getPositionId());
if (StringUtils.isNotBlank(positionAudit.getFileJson())) {
List<PositionFileDTO> positionFileDTOS = JSONUtil.toList(positionAudit.getFileJson(), PositionFileDTO.class);
for (PositionFileDTO positionFileDTO : positionFileDTOS) {
positionFileDTO.setId(null);
positionFileDTO.setPositionId(positionAudit.getPositionId());
positionFileService.create(positionFileDTO);
}
}
}
}
@Override
public PositionAuditDTO findById(Long id) {
Assert.notNull(id, "参数缺失");
PositionAuditPageQueryDTO queryDTO = new PositionAuditPageQueryDTO();
queryDTO.disablePage();
queryDTO.setId(id);
List<PositionAuditDTO> list = this.page(queryDTO);
return CollectionUtils.isNotEmpty(list) ? list.get(0) : null;
}
@Override
public void positionModifyStatus(Set<Long> ids, String status) {
LambdaQueryWrapper<Position> queryWrapper = new LambdaQueryWrapper<Position>()
.in(Position::getId, ids)
.eq(Position::getDeleted, false);
if (!CommonConstants.PLATFORM_ORG_ID.equals(UserContextHolder.getExistLoginOrgId())) {
queryWrapper.eq(Position::getOrgId, UserContextHolder.getExistLoginOrgId());
}
Integer count = positionMapper.selectCount(queryWrapper);
Assert.isTrue(count == ids.size(), "网络异常,请刷新后再试");
List<Position> positions = new ArrayList<>();
for (Long id : ids) {
if (PositionStatusEnum.OPEN.getStatus().equals(status)) {
Integer positionAuditCount = positionAuditMapper.selectCount(new LambdaQueryWrapper<PositionAudit>()
.eq(PositionAudit::getDeleted, false)
.eq(PositionAudit::getAuditStatus, PositionAuditStatusEnum.SUCCESS.getStatus())
.eq(PositionAudit::getPositionId, id)
);
if (positionAuditCount != null && positionAuditCount >= 1) {
Position positionOld = positionMapper.selectById(id);
if (Objects.nonNull(positionOld) && Objects.nonNull(positionOld.getEndTime())) {
Assert.isTrue(! (DateUtil.endOfDay(positionOld.getEndTime()).getTime() <= DateUtil.endOfDay(new Date()).getTime()),"岗位有效期不能小于等于当前日期");
}
Position position = new Position();
position.setId(id);
position.setStatus(status);
positions.add(position);
}
} else {
Position position = new Position();
position.setId(id);
position.setStatus(status);
positions.add(position);
}
}
positionMapper.updateEntitysSelective(positions, UserContextHolder.getExistLoginUserId());
}
@Override
public Long positionCopy(Long id) {
PositionNewDTO oldPositionDTO = this.positionFindById(id);
if (Objects.isNull(oldPositionDTO)) {
throw new BusinessException("未查询到岗位信息");
}
PositionNewOperatorDTO positionNewOperatorDTO = new PositionNewOperatorDTO();
BeanUtils.copyProperties(oldPositionDTO, positionNewOperatorDTO);
positionNewOperatorDTO.setPositionName(String.format("%s复制%s", RandomUtil.randomString(3), StringUtils.substring(oldPositionDTO.getPositionName(), 0, 45)));
PositionNewDTO positionNewDTO = ((PositionAuditServiceImpl) AopContext.currentProxy()).positionCreate(positionNewOperatorDTO);
List<PositionFileDTO> oldPositionFileDTOS = positionFileService.filePage(PositionFilePageQueryDTO.builder().positionId(id).build());
for (PositionFileDTO oldPositionFileDTO : oldPositionFileDTOS) {
PositionFileDTO positionFileDTO = new PositionFileDTO();
BeanUtils.copyProperties(oldPositionFileDTO, positionFileDTO);
positionFileDTO.setPositionId(positionNewDTO.getId());
positionFileService.create(positionFileDTO);
}
return positionNewDTO.getId();
}
}

View File

@@ -0,0 +1,89 @@
package com.newyetai.recruit.position.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.newyetai.common.exception.util.Assert;
import com.newyetai.common.util.JsonUtils;
import com.newyetai.common.util.UserContextHolder;
import com.newyetai.recruit.position.constant.PositionConstants;
import com.newyetai.recruit.position.dao.PositionFileMapper;
import com.newyetai.recruit.position.dto.PositionFileDTO;
import com.newyetai.recruit.position.dto.PositionFilePageQueryDTO;
import com.newyetai.recruit.position.entity.PositionFile;
import com.newyetai.recruit.position.service.PositionFileService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.Date;
import java.util.List;
import cn.hutool.core.util.StrUtil;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
@Slf4j
@Service
@RequiredArgsConstructor(onConstructor = @__(@Autowired))
public class PositionFileServiceImpl extends ServiceImpl<PositionFileMapper, PositionFile> implements PositionFileService {
@Override
public List<PositionFileDTO> filePage(PositionFilePageQueryDTO queryDTO) {
return getBaseMapper().filePage(queryDTO);
}
@Override
public PositionFile create(PositionFileDTO queryDTO) {
List<PositionFileDTO> fileList = filePage(PositionFilePageQueryDTO.builder()
.positionId(queryDTO.getPositionId())
.fileType(queryDTO.getFileType()).build());
int maxFileOrder = 0;
if (fileList.size() > 0) {
maxFileOrder = fileList.stream().mapToInt(PositionFileDTO::getSort).max().getAsInt();
}
PositionFile file = JsonUtils.toObject(JsonUtils.toJsonString(queryDTO), PositionFile.class);
file.setSort(maxFileOrder);
Assert.isTrue(save(file), queryDTO.getFileName() + "保存失败!");
return file;
}
@Override
public void update(PositionFileDTO dto) {
PositionFile file = JsonUtils.toObject(JsonUtils.toJsonString(dto), PositionFile.class);
Assert.isTrue(updateById(file), dto.getFileName() + "更新失败!");
}
@Override
public void delete(Long id) {
PositionFile file = getBaseMapper().selectById(id);
file.setDeleted(true);
Assert.notNull(file, "未找到要删除的文件信息");
Assert.isTrue(updateById(file), "删除失败!");
}
@Override
public void deleteByPositionId(Long positionId) {
PositionFile positionFile = new PositionFile();
positionFile.setDeleted(true);
positionFile.setUpdateBy(UserContextHolder.getExistLoginUserId());
positionFile.setUpdateTime(new Date());
getBaseMapper().update(positionFile,new LambdaQueryWrapper<PositionFile>().eq(PositionFile::getDeleted,false).eq(PositionFile::getPositionId,positionId));
}
@Override
public void setDefault(Long id) {
PositionFile file = getOne(Wrappers.<PositionFile>lambdaQuery()
.eq(PositionFile::getDeleted, false)
.eq(PositionFile::getId, id)
);
Assert.notNull(file, "文件不存在");
String fileType = file.getFileType();
Assert.isTrue(StrUtil.equals(fileType, PositionConstants.POSITION_FILE_TYPE_IMG), "只支持设置图片");
getBaseMapper().setDefault(file.getPositionId(), file.getId());
}
}

View File

@@ -0,0 +1,648 @@
package com.newyetai.recruit.position.service.impl;
import com.google.common.collect.Lists;
import com.google.common.collect.Sets;
import cn.hutool.core.date.DateUtil;
import lombok.extern.slf4j.Slf4j;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.newyetai.common.constant.CommonConstants;
import com.newyetai.common.dto.ExportHeadDetailInfoDTO;
import com.newyetai.common.dto.ExportHeadInfoDTO;
import com.newyetai.common.easyexcel.ExcelUtil;
import com.newyetai.common.exception.BusinessException;
import com.newyetai.common.exception.util.Assert;
import com.newyetai.component.action.util.ActionUtils;
import com.newyetai.component.dict.util.DictUtils;
import com.newyetai.frame.redis.aop.annotation.AutoUnLock;
import com.newyetai.frame.redis.dto.LockDTO;
import com.newyetai.frame.redis.redisson.RedissonUtils;
import com.newyetai.recruit.company.dao.HrCompanyMapper;
import com.newyetai.recruit.company.entity.HrCompany;
import com.newyetai.recruit.company.enums.HrCompanyEnum;
import com.newyetai.recruit.position.convert.PositionRegistrationConvert;
import com.newyetai.recruit.position.entity.PositionRegistration;
import com.newyetai.recruit.position.dto.*;
import com.newyetai.recruit.position.dao.PositionRegistrationMapper;
import com.newyetai.recruit.position.enums.PositionRegistrationStatusEnum;
import com.newyetai.recruit.position.enums.PositionStatusEnum;
import com.newyetai.recruit.position.service.PositionRegistrationService;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.BooleanUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import com.newyetai.common.util.UserContextHolder;
import com.newyetai.recruit.position.service.PositionService;
import com.newyetai.recruit.talent.entity.Talent;
import com.newyetai.recruit.talent.service.TalentService;
import com.newyetai.recruit.user.dto.JobExpectQueryDTO;
import com.newyetai.recruit.user.dto.ResumeDTO;
import com.newyetai.recruit.user.dto.ResumeQueryDTO;
import com.newyetai.recruit.user.dto.UserCertificateQueryDTO;
import com.newyetai.recruit.user.service.JobExpectService;
import com.newyetai.recruit.user.service.ResumeService;
import com.newyetai.recruit.user.service.UserCertificateService;
import com.newyetai.usercenter.enums.OrgTypeEnum;
import com.newyetai.usercenter.org.dto.OrgDTO;
import com.newyetai.usercenter.org.dto.OrgQueryDTO;
import com.newyetai.usercenter.org.service.OrgService;
import com.newyetai.usercenter.user.dto.UserDTO;
import com.newyetai.usercenter.user.service.UserService;
import javax.annotation.Resource;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.*;
import java.util.stream.Collectors;
/**
* 岗位报名信息表
*
* @author guixinman
* @since 1.0.0 2024-04-15
*/
@Slf4j
@Service
public class PositionRegistrationServiceImpl implements PositionRegistrationService {
@Resource
private PositionRegistrationMapper positionRegistrationMapper;
@Autowired
private PositionService positionService;
@Autowired
private UserService userService;
@Autowired
private TalentService talentService;
@Autowired
private UserCertificateService userCertificateService;
@Autowired
private JobExpectService jobExpectService;
@Autowired
private ResumeService resumeService;
@Resource
private HrCompanyMapper hrCompanyMapper;
@Autowired
private OrgService orgService;
@AutoUnLock
@Transactional(rollbackFor = Exception.class)
@Override
public PositionRegistrationDTO create(PositionRegistrationOperatorDTO operatorDto) {
Assert.isTrue(
RedissonUtils.tryLockAutomatically(
LockDTO.builder()
.tryLockWaitTime(0L)
.lockTimeout(60 * 5L)
.methodName("positionRegistration:create")
.arg(String.valueOf(operatorDto.getUserId()))
.arg(String.valueOf(operatorDto.getPositionId()))
.build()
),
"请稍后再试");
UserDTO userDTO = userService.get(operatorDto.getUserId());
Assert.notNull(userDTO, "用户不存在");
Assert.notNull(PositionRegistrationStatusEnum.find(operatorDto.getStatus()), "请选择正确的招聘状态");
PositionDTO positionDTO = positionService.findById(operatorDto.getPositionId());
if (Objects.isNull(positionDTO)) {
throw new BusinessException("未查询到岗位信息");
}
if (Objects.nonNull(positionDTO.getEndTime())) {
Assert.isTrue(DateUtil.endOfDay(positionDTO.getEndTime()).getTime() >= new Date().getTime(), "岗位已失效,禁止报名");
}
Assert.isTrue(PositionStatusEnum.OPEN.getStatus().equals(positionDTO.getStatus()), "岗位未开启");
Integer count = positionRegistrationMapper.selectCount(new LambdaQueryWrapper<PositionRegistration>()
.eq(PositionRegistration::getDeleted, false)
.eq(PositionRegistration::getUserId, operatorDto.getUserId())
.eq(PositionRegistration::getPositionId, operatorDto.getPositionId())
.notIn(PositionRegistration::getStatus, Arrays.asList(PositionRegistrationStatusEnum.CANCEL.getStatus(), PositionRegistrationStatusEnum.RESIGNED.getStatus(), PositionRegistrationStatusEnum.TERMINATION.getStatus()))
);
if (count > 0) {
throw new BusinessException("请勿报名相同岗位");
}
PositionRegistration positionRegistration = PositionRegistrationConvert.INSTANCE.convert(operatorDto);
positionRegistrationMapper.saveEntity(positionRegistration);
return PositionRegistrationConvert.INSTANCE.convert(positionRegistration);
}
@Override
public PositionRegistrationDTO modify(PositionRegistrationOperatorDTO operatorDto) {
PositionRegistrationDTO positionRegistrationDto = this.findById(operatorDto.getId());
if (Objects.isNull(positionRegistrationDto)) {
return null;
}
PositionRegistration positionRegistration = PositionRegistrationConvert.INSTANCE.convert(operatorDto);
positionRegistrationMapper.updateEntity(positionRegistration);
return this.findById(operatorDto.getId());
}
@Override
public PositionRegistrationDTO delete(Long id) {
PositionRegistrationDTO positionRegistrationDto = this.findById(id);
if (Objects.isNull(positionRegistrationDto)) {
return null;
}
PositionRegistration positionRegistration = PositionRegistration.builder().build();
positionRegistration.setId(id);
positionRegistrationMapper.deleteEntity(positionRegistration, UserContextHolder.getLoginUserId());
return positionRegistrationDto;
}
@Override
public PositionRegistrationDTO findById(Long id) {
Assert.notNull(id, "参数缺失");
PositionRegistrationPageQueryDTO queryDTO = new PositionRegistrationPageQueryDTO();
queryDTO.setId(id);
List<PositionRegistrationDTO> list = this.page(queryDTO);
if (CollectionUtils.isEmpty(list)) {
return null;
}
PositionRegistrationDTO positionRegistrationDTO = list.get(0);
positionRegistrationDTO.setUserCertificateDTOList(userCertificateService.list(UserCertificateQueryDTO.builder().userId(positionRegistrationDTO.getUserId()).build()));
positionRegistrationDTO.setJobExpectDTOList(jobExpectService.list(JobExpectQueryDTO.builder().userId(positionRegistrationDTO.getUserId()).build()));
List<ResumeDTO> resumeDTOList = resumeService.list(ResumeQueryDTO.builder().userId(positionRegistrationDTO.getUserId()).build());
if (CollectionUtils.isNotEmpty(resumeDTOList)) {
positionRegistrationDTO.setCityCode(resumeDTOList.get(0).getCityCode());
positionRegistrationDTO.setCityCodeName(resumeDTOList.get(0).getCityCodeName());
positionRegistrationDTO.setResumeFileCode(resumeDTOList.get(0).getFileCode());
}
return positionRegistrationDTO;
}
@Override
public PositionRegistrationDTO findByIdAndChildrenOrgAll(Long id, Boolean childrenOrgAll) {
Assert.notNull(id, "参数缺失");
PositionRegistrationPageQueryDTO queryDTO = new PositionRegistrationPageQueryDTO();
queryDTO.setId(id);
queryDTO.setChildrenOrgAll(childrenOrgAll);
List<PositionRegistrationDTO> list = this.page(queryDTO);
if (CollectionUtils.isEmpty(list)) {
return null;
}
PositionRegistrationDTO positionRegistrationDTO = list.get(0);
positionRegistrationDTO.setUserCertificateDTOList(userCertificateService.list(UserCertificateQueryDTO.builder().userId(positionRegistrationDTO.getUserId()).build()));
positionRegistrationDTO.setJobExpectDTOList(jobExpectService.list(JobExpectQueryDTO.builder().userId(positionRegistrationDTO.getUserId()).build()));
List<ResumeDTO> resumeDTOList = resumeService.list(ResumeQueryDTO.builder().userId(positionRegistrationDTO.getUserId()).build());
if (CollectionUtils.isNotEmpty(resumeDTOList)) {
positionRegistrationDTO.setCityCode(resumeDTOList.get(0).getCityCode());
positionRegistrationDTO.setCityCodeName(resumeDTOList.get(0).getCityCodeName());
positionRegistrationDTO.setResumeFileCode(resumeDTOList.get(0).getFileCode());
}
return positionRegistrationDTO;
}
@Override
public List<PositionRegistrationDTO> list(PositionRegistrationPageQueryDTO queryDTO) {
queryDTO.disablePage();
return this.page(queryDTO);
}
@Override
public List<PositionRegistrationDTO> page(PositionRegistrationPageQueryDTO queryDTO) {
queryDTO.setOrgId(null);
if (!CommonConstants.PLATFORM_ORG_ID.equals(UserContextHolder.getExistLoginOrgId())) {
//如果是 数据管理页面进来 这个参数就是true
if (Boolean.TRUE.equals(queryDTO.getChildrenOrgAll())) {
//查自己和下级机构
queryDTO.setOrgIds(orgService.childrenOrgIdList(UserContextHolder.getExistLoginOrgId()));
} else {
queryDTO.setOrgId(UserContextHolder.getExistLoginOrgId());
}
}
//如果是 数据管理页面进来 这个参数就是true
if (Boolean.TRUE.equals(queryDTO.getChildrenOrgAll())) {
//如果前端给了指定 就按指定的(政府机构)
if (Objects.nonNull(queryDTO.getQueryStreetOrgId())) {
//选定一个政府机构,找出这个政府机构下所有的用工\服务机构,在列出这些用工\服务机构的报名记录
Set<Long> orgIdList = orgService.childrenOrgIdList(queryDTO.getQueryStreetOrgId());
if (CollectionUtils.isEmpty(orgIdList)) {
return new ArrayList<>();
}
Set<Long> finalOrgIds = orgService.list(OrgQueryDTO.builder().orgIds(orgIdList).types(Sets.newHashSet(OrgTypeEnum.ORG_TYPE_SIMPLE.getType(), OrgTypeEnum.ORG_TYPE_HR.getType())).build())
.stream().map(orgDTOs -> orgDTOs.getId()).collect(Collectors.toSet());
if (CollectionUtils.isEmpty(finalOrgIds)) {
return new ArrayList<>();
}
//所属街道所有子级的机构id
queryDTO.setQueryStreetChildrenAllOrgIds(finalOrgIds);
}
}
List<PositionRegistrationDTO> page = positionRegistrationMapper.page(queryDTO);
return page;
}
@Transactional(rollbackFor = Exception.class)
@AutoUnLock
@Override
public void userCreate(UserPositionRegistrationDTO dto) {
Assert.isTrue(
RedissonUtils.tryLockAutomatically(
LockDTO.builder()
.tryLockWaitTime(0L)
.lockTimeout(60 * 5L)
.methodName("positionRegistration:create")
.arg(String.valueOf(UserContextHolder.getExistLoginUserId()))
.arg(String.valueOf(dto.getPositionId()))
.build()
),
"请稍后再试");
PositionDTO positionDTO = positionService.findById(dto.getPositionId());
if (Objects.isNull(positionDTO)) {
throw new BusinessException("未查询到岗位信息");
}
Assert.isTrue(PositionStatusEnum.OPEN.getStatus().equals(positionDTO.getStatus()), "岗位未开启");
if (Objects.nonNull(positionDTO.getEndTime())) {
Assert.isTrue(DateUtil.endOfDay(positionDTO.getEndTime()).getTime() >= new Date().getTime(), "岗位已失效,禁止报名");
}
Integer count = positionRegistrationMapper.selectCount(new LambdaQueryWrapper<PositionRegistration>()
.eq(PositionRegistration::getDeleted, false)
.eq(PositionRegistration::getUserId, UserContextHolder.getExistLoginUserId())
.eq(PositionRegistration::getPositionId, dto.getPositionId())
.notIn(PositionRegistration::getStatus, Arrays.asList(PositionRegistrationStatusEnum.CANCEL.getStatus(), PositionRegistrationStatusEnum.RESIGNED.getStatus(), PositionRegistrationStatusEnum.TERMINATION.getStatus()))
);
if (count > 0) {
throw new BusinessException("请勿报名相同岗位");
}
PositionRegistration positionRegistration = new PositionRegistration();
positionRegistration.setUserId(UserContextHolder.getExistLoginUserId());
positionRegistration.setPositionId(dto.getPositionId());
positionRegistration.setStatus(PositionRegistrationStatusEnum.ALREADY_REGISTERED.getStatus());
positionRegistrationMapper.saveEntity(positionRegistration);
HrCompany hrCompany = hrCompanyMapper.selectOne(new LambdaQueryWrapper<HrCompany>().eq(HrCompany::getDeleted, false).eq(HrCompany::getOrgId, positionDTO.getOrgId()).eq(HrCompany::getCompanyType, HrCompanyEnum.SELF.getType()));
Assert.notNull(hrCompany, "数据异常,报名失败");
Talent talent = new Talent();
talent.setOrgId(positionDTO.getOrgId());
talent.setUserId(UserContextHolder.getExistLoginUserId());
talent.setCompanyId(hrCompany.getId());
talentService.importCreate(talent);
}
@Override
public void invite(PositionRegistrationOperatorDTO operatorDTO) {
Assert.notNull(operatorDTO.getId(), "id不能为空");
if (StringUtils.isNotBlank(operatorDTO.getInterviewLocation())) {
Assert.isTrue(!(operatorDTO.getInterviewLocation().length() > 100), "面试地点长度超限");
}
PositionRegistrationDTO positionRegistrationDTO = this.findById(operatorDTO.getId());
Assert.notNull(positionRegistrationDTO, "未查询到数据");
Assert.isTrue(PositionRegistrationStatusEnum.ALREADY_REGISTERED.getStatus().equals(positionRegistrationDTO.getStatus()), "已报名状态才能邀约面试");
PositionDTO positionDTO = positionService.findById(positionRegistrationDTO.getPositionId());
if (Objects.isNull(positionDTO)) {
throw new BusinessException("未查询到岗位信息");
}
PositionRegistration positionRegistration = new PositionRegistration();
positionRegistration.setId(operatorDTO.getId());
positionRegistration.setStatus(PositionRegistrationStatusEnum.WAIT_FOR_AN_INTERVIEW.getStatus());
positionRegistration.setInterviewTime(operatorDTO.getInterviewTime());
positionRegistration.setInterviewLocation(operatorDTO.getInterviewLocation());
positionRegistration.setUpdateBy(UserContextHolder.getLoginUserId());
long row = positionRegistrationMapper.updateStatus(positionRegistration, PositionRegistrationStatusEnum.ALREADY_REGISTERED.getStatus());
Assert.isTrue(row == 1, "邀约面试失败,状态已被变更,请刷新页面重试");
ActionUtils.diff(operatorDTO.getId(), PositionRegistration.builder().status(PositionRegistrationStatusEnum.ALREADY_REGISTERED.getStatus()).build()
, PositionRegistration.builder().status(PositionRegistrationStatusEnum.WAIT_FOR_AN_INTERVIEW.getStatus()).build());
}
@Override
public void termination(PositionRegistrationOperatorDTO operatorDTO) {
Assert.notNull(operatorDTO.getId(), "id不能为空");
PositionRegistrationDTO positionRegistrationDTO = this.findById(operatorDTO.getId());
Assert.notNull(positionRegistrationDTO, "未查询到数据");
PositionDTO positionDTO = positionService.findById(positionRegistrationDTO.getPositionId());
if (Objects.isNull(positionDTO)) {
throw new BusinessException("未查询到岗位信息");
}
PositionRegistration positionRegistration = new PositionRegistration();
positionRegistration.setId(operatorDTO.getId());
positionRegistration.setStatus(PositionRegistrationStatusEnum.TERMINATION.getStatus());
positionRegistration.setTerminationTime(new Date());
positionRegistration.setUpdateBy(UserContextHolder.getLoginUserId());
positionRegistrationMapper.updateStatus(positionRegistration, null);
}
@Override
public void fulfillInterview(PositionRegistrationOperatorDTO operatorDTO) {
Assert.notNull(operatorDTO.getId(), "id不能为空");
Assert.notNull(operatorDTO.getStatus(), "状态不能为空");
if (!(PositionRegistrationStatusEnum.FAIL_THE_INTERVIEW.getStatus().equals(operatorDTO.getStatus()) || PositionRegistrationStatusEnum.TO_BE_HIRED.getStatus().equals(operatorDTO.getStatus()))) {
throw new BusinessException("请选择正确的面试结果");
}
PositionRegistrationDTO positionRegistrationDTO = this.findById(operatorDTO.getId());
Assert.notNull(positionRegistrationDTO, "未查询到数据");
PositionDTO positionDTO = positionService.findById(positionRegistrationDTO.getPositionId());
if (Objects.isNull(positionDTO)) {
throw new BusinessException("未查询到岗位信息");
}
PositionRegistration positionRegistration = new PositionRegistration();
positionRegistration.setId(operatorDTO.getId());
positionRegistration.setStatus(operatorDTO.getStatus());
positionRegistration.setInductionTime(operatorDTO.getInductionTime());
positionRegistration.setUpdateBy(UserContextHolder.getLoginUserId());
positionRegistration.setRemark(operatorDTO.getRemark());
long row = positionRegistrationMapper.updateStatus(positionRegistration, PositionRegistrationStatusEnum.WAIT_FOR_AN_INTERVIEW.getStatus());
Assert.isTrue(row == 1, "完成面试失败,状态已被变更,请刷新页面重试");
ActionUtils.diff(operatorDTO.getId(), PositionRegistration.builder().status(PositionRegistrationStatusEnum.WAIT_FOR_AN_INTERVIEW.getStatus()).build()
, PositionRegistration.builder().status(operatorDTO.getStatus()).build());
}
@Transactional(rollbackFor = Exception.class)
@Override
public void onTheJob(OnTheJobDTO dto) {
for (OnTheJobDTO.OnTheJobDetailDTO detailDTO : dto.getDetailDTOS()) {
PositionRegistrationDTO positionRegistrationDTO = this.findById(detailDTO.getId());
Assert.notNull(positionRegistrationDTO, "未查询到数据");
PositionDTO positionDTO = positionService.findById(positionRegistrationDTO.getPositionId());
if (Objects.isNull(positionDTO)) {
throw new BusinessException("未查询到岗位信息");
}
PositionRegistration positionRegistration = new PositionRegistration();
positionRegistration.setId(detailDTO.getId());
positionRegistration.setInductionTime(dto.getInductionTime());
positionRegistration.setSalary(detailDTO.getSalary());
positionRegistration.setStatus(PositionRegistrationStatusEnum.ON_THE_JOB.getStatus());
positionRegistration.setUpdateBy(UserContextHolder.getLoginUserId());
long row = positionRegistrationMapper.updateStatus(positionRegistration, PositionRegistrationStatusEnum.TO_BE_HIRED.getStatus());
Assert.isTrue(row == 1, "入职失败,状态已被变更,请刷新页面重试");
ActionUtils.diff(detailDTO.getId(), PositionRegistration.builder().status(PositionRegistrationStatusEnum.TO_BE_HIRED.getStatus()).build()
, PositionRegistration.builder().status(PositionRegistrationStatusEnum.ON_THE_JOB.getStatus()).build());
}
}
@Transactional(rollbackFor = Exception.class)
@Override
public void resigned(ResignedDTO dto) {
for (Long id : dto.getIds()) {
PositionRegistrationDTO positionRegistrationDTO = this.findById(id);
Assert.notNull(positionRegistrationDTO, "未查询到数据");
PositionDTO positionDTO = positionService.findById(positionRegistrationDTO.getPositionId());
if (Objects.isNull(positionDTO)) {
throw new BusinessException("未查询到岗位信息");
}
PositionRegistration positionRegistration = new PositionRegistration();
positionRegistration.setId(id);
positionRegistration.setQuitTime(dto.getQuitTime());
positionRegistration.setStatus(PositionRegistrationStatusEnum.RESIGNED.getStatus());
positionRegistration.setUpdateBy(UserContextHolder.getLoginUserId());
long row = positionRegistrationMapper.updateStatus(positionRegistration, PositionRegistrationStatusEnum.ON_THE_JOB.getStatus());
Assert.isTrue(row == 1, "离职失败,状态已被变更,请刷新页面重试");
ActionUtils.diff(id, PositionRegistration.builder().status(PositionRegistrationStatusEnum.ON_THE_JOB.getStatus()).build()
, PositionRegistration.builder().status(PositionRegistrationStatusEnum.RESIGNED.getStatus()).build());
}
}
@Override
public void export(PositionRegistrationPageQueryDTO queryDTO) {
boolean flag = true;
Integer pageNo = 1;
Integer pageSize = 100;
List<PositionRegistrationDTO> listAll = new ArrayList<>();
while (flag) {
queryDTO.setPageNo(pageNo);
queryDTO.setPageSize(pageSize);
List<PositionRegistrationDTO> list = this.page(queryDTO);
if (org.springframework.util.CollectionUtils.isEmpty(list)) {
flag = false;
continue;
}
if (list.size() < pageSize) {
flag = false;
}
pageNo = pageNo + 1;
listAll.addAll(list);
}
List<PositionRegistrationExportDTO> collect = listAll.stream().map(dto -> {
PositionRegistrationExportDTO exportDTO = new PositionRegistrationExportDTO();
BeanUtils.copyProperties(dto, exportDTO);
exportDTO.setInterviewTime(DateUtil.format(dto.getInterviewTime(), "yyyy-MM-dd"));
exportDTO.setCreateTime(DateUtil.format(dto.getCreateTime(), "yyyy-MM-dd HH:mm:ss"));
exportDTO.setInductionTime(DateUtil.format(dto.getInductionTime(), "yyyy-MM-dd"));
exportDTO.setQuitTime(DateUtil.format(dto.getQuitTime(), "yyyy-MM-dd"));
exportDTO.setStatus(DictUtils.getCodeNameMap("position_registration_status").get(String.valueOf(dto.getStatus())));
return exportDTO;
}).collect(Collectors.toList());
if (org.springframework.util.CollectionUtils.isEmpty(collect)) {
return;
}
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMddHHmmss");
String fileName = "招聘明细导出" + "(" + formatter.format(LocalDateTime.now()) + ")";
ExportHeadInfoDTO infoDTO = ExportHeadInfoDTO.builder()
.fileName(fileName)
.build();
List<ExportHeadDetailInfoDTO> heads = infoDTO.getHeads();
heads.add(ExportHeadDetailInfoDTO.builder().head("岗位名称").build());
heads.add(ExportHeadDetailInfoDTO.builder().head("姓名").build());
heads.add(ExportHeadDetailInfoDTO.builder().head("性别").build());
heads.add(ExportHeadDetailInfoDTO.builder().head("年龄").build());
heads.add(ExportHeadDetailInfoDTO.builder().head("手机号").build());
heads.add(ExportHeadDetailInfoDTO.builder().head("身份证号").build());
heads.add(ExportHeadDetailInfoDTO.builder().head("用工企业").build());
heads.add(ExportHeadDetailInfoDTO.builder().head("招聘状态").build());
if (Boolean.TRUE.equals(queryDTO.getChildrenOrgAll())) {
heads.add(ExportHeadDetailInfoDTO.builder().head("发布机构").build());
heads.add(ExportHeadDetailInfoDTO.builder().head("所属街镇").build());
}
List<List> datas = Lists.newArrayList();
//全部
if (CollectionUtils.isEmpty(queryDTO.getStatusList())) {
heads.add(ExportHeadDetailInfoDTO.builder().head("面试时间").build());
heads.add(ExportHeadDetailInfoDTO.builder().head("面试地点").build());
heads.add(ExportHeadDetailInfoDTO.builder().head("入职薪资").build());
heads.add(ExportHeadDetailInfoDTO.builder().head("报名时间").build());
heads.add(ExportHeadDetailInfoDTO.builder().head("入职日期").build());
heads.add(ExportHeadDetailInfoDTO.builder().head("最后工作日").build());
for (PositionRegistrationExportDTO dto : collect) {
List objects = Lists.newArrayList();
datas.add(objects);
objects.add(dto.getPositionName());
objects.add(dto.getRealName());
objects.add(dto.getGender());
objects.add(dto.getAge());
objects.add(dto.getPhone());
objects.add(dto.getCardNo());
objects.add(dto.getCompanyName());
objects.add(dto.getStatus());
if (Boolean.TRUE.equals(queryDTO.getChildrenOrgAll())) {
objects.add(dto.getPublishOrgName());
objects.add(dto.getStreetName());
}
objects.add(dto.getInterviewTime());
objects.add(dto.getInterviewLocation());
objects.add(dto.getSalary());
objects.add(dto.getCreateTime());
objects.add(dto.getInductionTime());
objects.add(dto.getQuitTime());
}
} else if (queryDTO.getStatusList().contains(PositionRegistrationStatusEnum.ALREADY_REGISTERED.getStatus())) {
heads.add(ExportHeadDetailInfoDTO.builder().head("报名时间").build());
for (PositionRegistrationExportDTO dto : collect) {
List objects = Lists.newArrayList();
datas.add(objects);
objects.add(dto.getPositionName());
objects.add(dto.getRealName());
objects.add(dto.getGender());
objects.add(dto.getAge());
objects.add(dto.getPhone());
objects.add(dto.getCardNo());
objects.add(dto.getCompanyName());
objects.add(dto.getStatus());
if (Boolean.TRUE.equals(queryDTO.getChildrenOrgAll())) {
objects.add(dto.getPublishOrgName());
objects.add(dto.getStreetName());
}
objects.add(dto.getCreateTime());
}
} else if (queryDTO.getStatusList().containsAll(Arrays.asList(
PositionRegistrationStatusEnum.WAIT_FOR_AN_INTERVIEW.getStatus(),
PositionRegistrationStatusEnum.FAIL_THE_INTERVIEW.getStatus(),
PositionRegistrationStatusEnum.TO_BE_HIRED.getStatus()
))) {
heads.add(ExportHeadDetailInfoDTO.builder().head("报名时间").build());
heads.add(ExportHeadDetailInfoDTO.builder().head("面试时间").build());
heads.add(ExportHeadDetailInfoDTO.builder().head("面试地点").build());
for (PositionRegistrationExportDTO dto : collect) {
List objects = Lists.newArrayList();
datas.add(objects);
objects.add(dto.getPositionName());
objects.add(dto.getRealName());
objects.add(dto.getGender());
objects.add(dto.getAge());
objects.add(dto.getPhone());
objects.add(dto.getCardNo());
objects.add(dto.getCompanyName());
objects.add(dto.getStatus());
if (Boolean.TRUE.equals(queryDTO.getChildrenOrgAll())) {
objects.add(dto.getPublishOrgName());
objects.add(dto.getStreetName());
}
objects.add(dto.getCreateTime());
objects.add(dto.getInterviewTime());
objects.add(dto.getInterviewLocation());
}
} else if (queryDTO.getStatusList().contains(PositionRegistrationStatusEnum.ON_THE_JOB.getStatus())) {
heads.add(ExportHeadDetailInfoDTO.builder().head("入职薪资").build());
heads.add(ExportHeadDetailInfoDTO.builder().head("报名时间").build());
heads.add(ExportHeadDetailInfoDTO.builder().head("面试时间").build());
heads.add(ExportHeadDetailInfoDTO.builder().head("入职日期").build());
for (PositionRegistrationExportDTO dto : collect) {
List objects = Lists.newArrayList();
datas.add(objects);
objects.add(dto.getPositionName());
objects.add(dto.getRealName());
objects.add(dto.getGender());
objects.add(dto.getAge());
objects.add(dto.getPhone());
objects.add(dto.getCardNo());
objects.add(dto.getCompanyName());
objects.add(dto.getStatus());
if (Boolean.TRUE.equals(queryDTO.getChildrenOrgAll())) {
objects.add(dto.getPublishOrgName());
objects.add(dto.getStreetName());
}
objects.add(dto.getSalary());
objects.add(dto.getCreateTime());
objects.add(dto.getInterviewTime());
objects.add(dto.getInductionTime());
}
}
infoDTO.setDatas(datas);
ExcelUtil.dynamicExportTemplate(infoDTO);
}
@Override
public List<UserPositionRegistrationResDTO> userPage(UserPositionRegistrationPageQueryDTO queryDTO) {
queryDTO.setUserId(UserContextHolder.getExistLoginUserId());
List<UserPositionRegistrationResDTO> list = positionRegistrationMapper.userPage(queryDTO);
for (UserPositionRegistrationResDTO userPositionRegistrationResDTO : list) {
userPositionRegistrationResDTO.setRecruitPositionTypeName(DictUtils.getCodeNameMap("recruit_position_type").get(userPositionRegistrationResDTO.getRecruitPositionType()));
}
return list;
}
@Override
public void cancel(Long positionId) {
List<UserPositionRegistrationResDTO> userPositionRegistrationResDTOS = positionRegistrationMapper.userPage(UserPositionRegistrationPageQueryDTO.builder().positionId(positionId).userId(UserContextHolder.getExistLoginUserId()).build());
if (CollectionUtils.isEmpty(userPositionRegistrationResDTOS)) {
throw new BusinessException("暂无可取消的报名记录");
}
UserPositionRegistrationResDTO userPositionRegistrationResDTO = userPositionRegistrationResDTOS.get(0);
if (StringUtils.equals(PositionRegistrationStatusEnum.WAIT_FOR_AN_INTERVIEW.getStatus(), userPositionRegistrationResDTO.getStatus())) {
throw new BusinessException("您在该岗位处于【待面试】状态,无法取消报名。");
} else if (StringUtils.equals(PositionRegistrationStatusEnum.TO_BE_HIRED.getStatus(), userPositionRegistrationResDTO.getStatus())) {
throw new BusinessException("您在该岗位处于【待入职】状态,无法取消报名。");
} else if (StringUtils.equals(PositionRegistrationStatusEnum.ON_THE_JOB.getStatus(), userPositionRegistrationResDTO.getStatus())) {
throw new BusinessException("您在该岗位处于【已入职】状态,无法取消报名。");
}
positionRegistrationMapper.updateStatus(PositionRegistration.builder().id(userPositionRegistrationResDTO.getId()).status(PositionRegistrationStatusEnum.CANCEL.getStatus()).build(), PositionRegistrationStatusEnum.ALREADY_REGISTERED.getStatus());
}
@Override
public void show(Long id) {
PositionRegistrationDTO positionRegistrationDTO = this.findById(id);
if (Objects.isNull(positionRegistrationDTO)) {
return;
}
if (Boolean.TRUE.equals(positionRegistrationDTO.getShow())) {
return;
}
PositionRegistration positionRegistration = new PositionRegistration();
positionRegistration.setId(id);
positionRegistration.setShow(true);
positionRegistrationMapper.updateEntitySelective(positionRegistration);
}
}

View File

@@ -0,0 +1,577 @@
package com.newyetai.recruit.position.service.impl;
import com.google.common.collect.Lists;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.RandomUtil;
import lombok.extern.slf4j.Slf4j;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.newyetai.common.AlitaResult;
import com.newyetai.common.constant.CommonConstants;
import com.newyetai.common.dto.ExportHeadDetailInfoDTO;
import com.newyetai.common.dto.ExportHeadInfoDTO;
import com.newyetai.common.easyexcel.ExcelUtil;
import com.newyetai.common.exception.BusinessException;
import com.newyetai.common.exception.util.Assert;
import com.newyetai.common.util.JsonUtils;
import com.newyetai.recruit.company.dto.HrCompanyDTO;
import com.newyetai.recruit.company.dto.HrCompanyPageQueryDTO;
import com.newyetai.recruit.company.enums.HrCompanyEnum;
import com.newyetai.recruit.company.service.IHrCompanyService;
import com.newyetai.component.dict.util.DictUtils;
import com.newyetai.recruit.position.convert.PositionConvert;
import com.newyetai.recruit.position.dao.PositionRegistrationMapper;
import com.newyetai.recruit.position.entity.Position;
import com.newyetai.recruit.position.dto.*;
import com.newyetai.recruit.position.dao.PositionMapper;
import com.newyetai.recruit.position.enums.PositionStatusEnum;
import com.newyetai.recruit.position.service.PositionFileService;
import com.newyetai.recruit.position.service.PositionService;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.aop.framework.AopContext;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import com.newyetai.common.util.UserContextHolder;
import com.newyetai.recruit.user.dao.UserCollectionMapper;
import com.newyetai.recruit.user.dto.JobExpectDTO;
import com.newyetai.recruit.user.dto.JobExpectQueryDTO;
import com.newyetai.recruit.user.dto.ResumeDTO;
import com.newyetai.recruit.user.entity.UserCollection;
import com.newyetai.recruit.user.service.JobExpectService;
import com.newyetai.recruit.user.service.ResumeService;
import com.newyetai.sdk.tencent.map.TencentMapContext;
import com.newyetai.sdk.tencent.map.dto.TencentMapBaseResDTO;
import com.newyetai.sdk.tencent.map.dto.TencentWsDistanceV1MatrixElementsResDTO;
import com.newyetai.sdk.tencent.map.dto.TencentMapWsDistanceV1MatrixReqDTO;
import com.newyetai.sdk.tencent.map.dto.TencentWsDistanceV1MatrixResDTO;
import com.newyetai.sdk.tencent.map.dto.TencentWsDistanceV1MatrixElementsRowResDTO;
import com.newyetai.usercenter.org.dao.OrgMapper;
import com.newyetai.usercenter.org.entity.Org;
import com.newyetai.usercenter.org.enums.RecruitPositionTypeEnum;
import com.newyetai.usercenter.user.dto.UserDTO;
import com.newyetai.usercenter.user.service.UserService;
import com.spatial4j.core.context.SpatialContext;
import com.spatial4j.core.distance.DistanceUtils;
import com.spatial4j.core.shape.Rectangle;
import javax.annotation.Resource;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.*;
import java.util.stream.Collectors;
/**
* 岗位信息表;岗位信息表
*
* @author guixinman
* @since 1.0.0 2024-04-11
*/
@Slf4j
@Service
public class PositionServiceImpl implements PositionService {
@Resource
private PositionMapper positionMapper;
@Autowired
private IHrCompanyService hrCompanyService;
@Autowired
private PositionFileService positionFileService;
@Resource
private PositionRegistrationMapper positionRegistrationMapper;
@Resource
private UserCollectionMapper userCollectionMapper;
@Resource
private OrgMapper orgMapper;
@Autowired
private JobExpectService jobExpectService;
@Autowired
private UserService userService;
@Autowired
private ResumeService resumeService;
@Autowired
private TencentMapContext tencentMapContext;
@Transactional(rollbackFor = Exception.class)
@Override
public PositionDTO create(PositionOperatorDTO operatorDto) {
Long orgId = UserContextHolder.getExistLoginOrgId();
if (Objects.nonNull(operatorDto.getOrgId())) {
orgId = operatorDto.getOrgId();
}
if (Objects.nonNull(operatorDto.getEndTime())) {
Assert.isTrue(! (DateUtil.endOfDay(operatorDto.getEndTime()).getTime() <= DateUtil.endOfDay(new Date()).getTime()),"岗位有效期不能小于等于当前日期");
}
Org org = orgMapper.selectOne(new LambdaQueryWrapper<Org>().eq(Org::getDeleted, false).eq(Org::getId, orgId));
if (Objects.isNull(org)) {
throw new BusinessException("未查询到数据");
}
//判断招聘岗位类型权限
if (!org.getRecruitPositionType().equals(RecruitPositionTypeEnum.ODD_JOB_OR_GENERAL_WORKER.getType())) {
if (!StringUtils.equals(org.getRecruitPositionType(), operatorDto.getRecruitPositionType())) {
if (StringUtils.equals(org.getRecruitPositionType(), RecruitPositionTypeEnum.ODD_JOB.getType())) {
throw new BusinessException("当前企业仅支持维护零工性质岗位。");
}
if (StringUtils.equals(org.getRecruitPositionType(), RecruitPositionTypeEnum.GENERAL_WORKER.getType())) {
throw new BusinessException("当前企业仅支持维护普工性质岗位。");
}
}
}
//当前机构下,相同的用工企业,不能存在相同的岗位名称
Assert.notNull(hrCompanyService.find(HrCompanyPageQueryDTO.builder().id(operatorDto.getCompanyId()).orgId(orgId).companyTypes(Arrays.asList(HrCompanyEnum.KH.getType(), HrCompanyEnum.SELF.getType())).build()), "未查询到用工企业");
List<Position> positions = positionMapper.selectList(new LambdaQueryWrapper<Position>()
.eq(Position::getCompanyId, operatorDto.getCompanyId())
.eq(Position::getOrgId, orgId)
.eq(Position::getPositionName, operatorDto.getPositionName())
);
if (CollectionUtils.isNotEmpty(positions)) {
throw new BusinessException("该用工企业已存在相同的岗位名称,添加失败");
}
Position position = PositionConvert.INSTANCE.convert(operatorDto);
position.setOrgId(orgId);
if (Objects.isNull(operatorDto.getStatus())) {
position.setStatus(PositionStatusEnum.OPEN.getStatus());
}
positionMapper.saveEntity(position);
return PositionConvert.INSTANCE.convert(position);
}
@Override
public PositionDTO modify(PositionOperatorDTO operatorDto) {
Assert.notNull(operatorDto.getId(), "岗位id缺失");
Position positionDto = positionMapper.selectById(operatorDto.getId());
if (Objects.isNull(positionDto)) {
throw new BusinessException("未查询到对应数据");
}
if (Objects.nonNull(operatorDto.getEndTime())) {
Assert.isTrue(! (DateUtil.endOfDay(operatorDto.getEndTime()).getTime() <= DateUtil.endOfDay(new Date()).getTime()),"岗位有效期不能小于等于当前日期");
}
Assert.notNull(hrCompanyService.find(HrCompanyPageQueryDTO.builder().id(operatorDto.getCompanyId()).companyTypes(Arrays.asList(HrCompanyEnum.KH.getType(), HrCompanyEnum.SELF.getType())).orgId(positionDto.getOrgId()).build()), "未查询到用工企业");
List<Position> positions = positionMapper.selectList(new LambdaQueryWrapper<Position>()
.eq(Position::getCompanyId, operatorDto.getCompanyId())
.eq(Position::getOrgId, positionDto.getOrgId())
.eq(Position::getPositionName, operatorDto.getPositionName())
.notIn(Position::getId, operatorDto.getId())
);
if (CollectionUtils.isNotEmpty(positions)) {
throw new BusinessException("该用工企业已存在相同的岗位名称,添加失败");
}
Position position = PositionConvert.INSTANCE.convert(operatorDto);
//不能修改
position.setRecruitPositionType(positionDto.getRecruitPositionType());
positionMapper.updateEntity(position);
return this.findById(operatorDto.getId());
}
@Override
public PositionDTO delete(Long id) {
PositionDTO positionDto = this.findById(id);
if (Objects.isNull(positionDto)) {
return null;
}
Position position = Position.builder().build();
position.setId(id);
positionMapper.deleteEntity(position, UserContextHolder.getLoginUserId());
return positionDto;
}
@Override
public PositionDTO findById(Long id) {
Assert.notNull(id, "参数缺失");
PositionPageQueryDTO queryDTO = new PositionPageQueryDTO();
queryDTO.disablePage();
queryDTO.setId(id);
List<PositionDTO> list = this.page(queryDTO);
return CollectionUtils.isNotEmpty(list) ? list.get(0) : null;
}
@Override
public PositionDTO userFindById(Long id) {
Assert.notNull(id, "id不能为空");
PositionPageQueryDTO queryDTO = new PositionPageQueryDTO();
queryDTO.disablePage();
queryDTO.setId(id);
queryDTO.setUseEndTime(false);
List<PositionDTO> list = this.userPage(queryDTO);
if (CollectionUtils.isNotEmpty(list)) {
PositionDTO positionDTO = list.get(0);
List<PositionFileDTO> positionFileDTOS = positionFileService.filePage(PositionFilePageQueryDTO.builder().positionId(positionDTO.getId()).build());
positionDTO.setPositionFileDTOS(positionFileDTOS);
if (Objects.nonNull(UserContextHolder.getLoginUserId())) {
List<UserPositionRegistrationResDTO> userPositionRegistrationResDTOS = positionRegistrationMapper.userPage(UserPositionRegistrationPageQueryDTO.builder().userId(UserContextHolder.getExistLoginUserId()).positionId(positionDTO.getId()).build());
if (CollectionUtils.isNotEmpty(userPositionRegistrationResDTOS)) {
positionDTO.setPositionRegistrationStatus(userPositionRegistrationResDTOS.get(0).getStatus());
positionDTO.setShow(userPositionRegistrationResDTOS.get(0).getShow());
positionDTO.setPositionRegistrationCreateTime(userPositionRegistrationResDTOS.get(0).getCreateTime());
positionDTO.setInterviewTime(userPositionRegistrationResDTOS.get(0).getInterviewTime());
positionDTO.setInterviewLocation(userPositionRegistrationResDTOS.get(0).getInterviewLocation());
positionDTO.setRemark(userPositionRegistrationResDTOS.get(0).getRemark());
positionDTO.setInductionTime(userPositionRegistrationResDTOS.get(0).getInductionTime());
positionDTO.setPositionRegistrationSalary(userPositionRegistrationResDTOS.get(0).getSalary());
}
LambdaQueryWrapper<UserCollection> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(UserCollection::getUserId, UserContextHolder.getExistLoginUserId());
queryWrapper.eq(UserCollection::getDeleted, false);
queryWrapper.eq(UserCollection::getPostId, positionDTO.getId());
Integer count = userCollectionMapper.selectCount(queryWrapper);
positionDTO.setIsCollection(true);
if (count == 0) {
positionDTO.setIsCollection(false);
}
}
return positionDTO;
}
return null;
}
@Override
public List<PositionDTO> list(PositionPageQueryDTO queryDTO) {
queryDTO.disablePage();
return this.page(queryDTO);
}
@Override
public List<PositionDTO> page(PositionPageQueryDTO queryDTO) {
if (!CommonConstants.PLATFORM_ORG_ID.equals(UserContextHolder.getExistLoginOrgId())) {
queryDTO.setOrgId(UserContextHolder.getExistLoginOrgId());
}
List<PositionDTO> list = positionMapper.page(queryDTO);
for (PositionDTO positionDTO : list) {
positionDTO.setRecruitPositionTypeName(DictUtils.getCodeNameMap("recruit_position_type").get(positionDTO.getRecruitPositionType()));
}
return list;
}
@Override
public List<PositionDTO> userPage(PositionPageQueryDTO queryDTO) {
List<PositionDTO> list = positionMapper.userPage(queryDTO);
for (PositionDTO positionDTO : list) {
positionDTO.setRecruitPositionTypeName(DictUtils.getCodeNameMap("recruit_position_type").get(positionDTO.getRecruitPositionType()));
}
return list;
}
@Override
public List<PositionDTO> tencentMapUserPage(PositionPageQueryDTO queryDTO) {
if (Objects.nonNull(queryDTO.getLongitude()) && Objects.nonNull(queryDTO.getLatitude())) {
// 移动设备经纬度
double lon = Double.parseDouble(String.valueOf(queryDTO.getLongitude()));
double lat = Double.parseDouble(String.valueOf(queryDTO.getLatitude()));
// 千米
int radius = queryDTO.getRadius();
try {
SpatialContext geo = SpatialContext.GEO;
Rectangle rectangle = geo.getDistCalc().calcBoxByDistFromPt(
geo.makePoint(lon, lat), radius * DistanceUtils.KM_TO_DEG, geo, null);
queryDTO.setMinX(new BigDecimal(String.valueOf(rectangle.getMinX())));
queryDTO.setMaxX(new BigDecimal(String.valueOf(rectangle.getMaxX())));
queryDTO.setMinY(new BigDecimal(String.valueOf(rectangle.getMinY())));
queryDTO.setMaxY(new BigDecimal(String.valueOf(rectangle.getMaxY())));
}catch (Exception e) {
return new ArrayList<>();
}
}
StringBuilder to = new StringBuilder();
List<PositionDTO> list = positionMapper.userPage(queryDTO);
//填充距离的对象集合
List<PositionDTO> temp = new ArrayList<>();
//岗位列表
List<PositionDTO> positionDTOResultList = new ArrayList<>();
for (int i = 0; i < list.size(); i++) {
PositionDTO positionDTO = list.get(i);
positionDTO.setRecruitPositionTypeName(DictUtils.getCodeNameMap("recruit_position_type").get(positionDTO.getRecruitPositionType()));
if (Objects.nonNull(positionDTO.getLongitude()) && Objects.nonNull(positionDTO.getLatitude())) {
to.append(positionDTO.getLatitude().toPlainString() + "," + positionDTO.getLongitude().toPlainString());
to.append(";");
temp.add(positionDTO);
}
}
if (Objects.nonNull(queryDTO.getLongitude()) && Objects.nonNull(queryDTO.getLatitude()) && temp.size() > 0) {
if (to.length() >= 2 && to.charAt(to.length() - 1) == ';') {
to.deleteCharAt(to.length() - 1);
}
AlitaResult<TencentWsDistanceV1MatrixResDTO> walkingRes = tencentMapContext.wsDistanceV1MatrixReqDTO(TencentMapWsDistanceV1MatrixReqDTO.builder()
.from(queryDTO.getLatitude().toPlainString() + "," + queryDTO.getLongitude().toPlainString())
.to(to.toString())
.mode("walking")
.build());
if (Boolean.TRUE.equals(walkingRes.getSuccess())) {
if (Objects.nonNull(walkingRes.getData())) {
TencentWsDistanceV1MatrixResDTO result = walkingRes.getData();
List<TencentWsDistanceV1MatrixElementsRowResDTO> rows = result.getRows();
List<TencentWsDistanceV1MatrixElementsResDTO> elements = rows.get(0).getElements();
for (int i = 0; i < temp.size(); i++) {
PositionDTO positionDTOTemp = temp.get(i);
PositionDTO positionDTOFinal = list.stream().filter(positionDTO -> positionDTO.getId().longValue() == positionDTOTemp.getId().longValue()).findFirst().orElse(null);
positionDTOFinal.setDistance(elements.get(i).getDistance());
if (positionDTOFinal.getDistance().longValue() <= Long.valueOf(queryDTO.getRadius()*1000).longValue()) {
positionDTOResultList.add(positionDTOFinal);
}
}
}
}
}
return positionDTOResultList.stream().sorted(Comparator.comparingLong(PositionDTO::getDistance)).collect(Collectors.toList());
}
@Override
public void export(PositionPageQueryDTO queryDTO) {
boolean flag = true;
Integer pageNo = 1;
Integer pageSize = 100;
List<PositionDTO> listAll = new ArrayList<>();
while (flag) {
queryDTO.setPageNo(pageNo);
queryDTO.setPageSize(pageSize);
List<PositionDTO> list = this.page(queryDTO);
if (org.springframework.util.CollectionUtils.isEmpty(list)) {
flag = false;
continue;
}
if (list.size() < pageSize) {
flag = false;
}
pageNo = pageNo + 1;
listAll.addAll(list);
}
List<PositionExportDTO> collect = listAll.stream().map(dto -> {
PositionExportDTO exportDTO = new PositionExportDTO();
BeanUtils.copyProperties(dto, exportDTO);
exportDTO.setCreateTime(DateUtil.format(dto.getCreateTime(), "yyyy-MM-dd HH:mm:ss"));
exportDTO.setStatus(DictUtils.getCodeNameMap("position_status").get(String.valueOf(dto.getStatus())));
exportDTO.setSalary(dto.getSalaryStr());
return exportDTO;
}).collect(Collectors.toList());
if (org.springframework.util.CollectionUtils.isEmpty(collect)) {
return;
}
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMddHHmmss");
String fileName = "岗位明细导出" + "(" + formatter.format(LocalDateTime.now()) + ")";
ExportHeadInfoDTO infoDTO = ExportHeadInfoDTO.builder()
.fileName(fileName)
.build();
List<ExportHeadDetailInfoDTO> heads = infoDTO.getHeads();
heads.add(ExportHeadDetailInfoDTO.builder().head("招聘岗位类型").build());
heads.add(ExportHeadDetailInfoDTO.builder().head("岗位名称").build());
heads.add(ExportHeadDetailInfoDTO.builder().head("用工企业").build());
heads.add(ExportHeadDetailInfoDTO.builder().head("岗位状态").build());
heads.add(ExportHeadDetailInfoDTO.builder().head("招聘人数").build());
heads.add(ExportHeadDetailInfoDTO.builder().head("综合薪资").build());
heads.add(ExportHeadDetailInfoDTO.builder().head("工作地址").build());
heads.add(ExportHeadDetailInfoDTO.builder().head("创建时间").build());
List<List> datas = Lists.newArrayList();
for (PositionExportDTO dto : collect) {
List objects = Lists.newArrayList();
datas.add(objects);
objects.add(dto.getRecruitPositionTypeName());
objects.add(dto.getPositionName());
objects.add(dto.getCompanyName());
objects.add(dto.getStatus());
objects.add(dto.getPositionNumber());
objects.add(dto.getSalary());
objects.add(dto.getPositionAddress());
objects.add(dto.getCreateTime());
}
infoDTO.setDatas(datas);
ExcelUtil.dynamicExportTemplate(infoDTO);
}
@Transactional(rollbackFor = Exception.class)
@Override
public void modifyStatus(PositionOperatorDTO dto) {
if (CollectionUtils.isEmpty(dto.getIds())) {
throw new BusinessException("请选择数据");
}
Assert.notNull(dto.getStatus(), "请选择状态");
LambdaQueryWrapper<Position> queryWrapper = new LambdaQueryWrapper<Position>()
.in(Position::getId, dto.getIds())
.eq(Position::getDeleted, false);
if (!CommonConstants.PLATFORM_ORG_ID.equals(UserContextHolder.getExistLoginOrgId())) {
queryWrapper.eq(Position::getOrgId, UserContextHolder.getExistLoginOrgId());
}
Integer count = positionMapper.selectCount(queryWrapper);
Assert.isTrue(count == dto.getIds().size(), "网络异常,请刷新后再试");
List<Position> positions = new ArrayList<>();
for (Long id : dto.getIds()) {
Position position = new Position();
position.setId(id);
position.setStatus(dto.getStatus());
positions.add(position);
}
positionMapper.updateEntitysSelective(positions, UserContextHolder.getExistLoginUserId());
}
@Override
public void template() {
ExportHeadInfoDTO infoDTO = ExportHeadInfoDTO.builder()
.fileName("岗位导入模板")
.build();
List<ExportHeadDetailInfoDTO> heads = infoDTO.getHeads();
List<String> companyNameList = Optional.ofNullable(hrCompanyService.list(HrCompanyPageQueryDTO.builder().companyTypes(Arrays.asList(HrCompanyEnum.KH.getType(), HrCompanyEnum.SELF.getType())).build()))
.map(list -> list.stream().map(HrCompanyDTO::getCompanyName).collect(Collectors.toList()))
.orElse(new ArrayList<>());
heads.add(ExportHeadDetailInfoDTO.builder().head("用工企业(必填)").explicitList(companyNameList).build());
heads.add(ExportHeadDetailInfoDTO.builder().head("岗位名称(必填)").build());
heads.add(ExportHeadDetailInfoDTO.builder().head("招聘标题(必填)").build());
heads.add(ExportHeadDetailInfoDTO.builder().head("招聘人数").build());
heads.add(ExportHeadDetailInfoDTO.builder().head("工作地址(必填)").build());
heads.add(ExportHeadDetailInfoDTO.builder().head("工作性质(必填)").build());
heads.add(ExportHeadDetailInfoDTO.builder().head("岗位类型").build());
heads.add(ExportHeadDetailInfoDTO.builder().head("岗位标签").build());
heads.add(ExportHeadDetailInfoDTO.builder().head("综合薪资(必填)").build());
heads.add(ExportHeadDetailInfoDTO.builder().head("发薪日").build());
heads.add(ExportHeadDetailInfoDTO.builder().head("性别(必填)").build());
heads.add(ExportHeadDetailInfoDTO.builder().head("年龄(必填)").build());
heads.add(ExportHeadDetailInfoDTO.builder().head("学历(必填)").build());
heads.add(ExportHeadDetailInfoDTO.builder().head("经验(必填)").build());
heads.add(ExportHeadDetailInfoDTO.builder().head("证件").build());
heads.add(ExportHeadDetailInfoDTO.builder().head("其它").build());
heads.add(ExportHeadDetailInfoDTO.builder().head("工作内容(必填)").build());
ExcelUtil.dynamicExportTemplate(infoDTO);
}
@Transactional(rollbackFor = Exception.class)
@Override
public Long copy(Long id) {
PositionDTO oldPositionDTO = this.findById(id);
if (Objects.isNull(oldPositionDTO)) {
throw new BusinessException("未查询到岗位信息");
}
PositionOperatorDTO positionOperatorDTO = new PositionOperatorDTO();
BeanUtils.copyProperties(oldPositionDTO, positionOperatorDTO);
positionOperatorDTO.setPositionName(String.format("%s复制%s", RandomUtil.randomString(3), StringUtils.substring(oldPositionDTO.getPositionName(), 0, 45)));
PositionDTO newPosition = ((PositionServiceImpl) AopContext.currentProxy()).create(positionOperatorDTO);
List<PositionFileDTO> oldPositionFileDTOS = positionFileService.filePage(PositionFilePageQueryDTO.builder().positionId(id).build());
for (PositionFileDTO oldPositionFileDTO : oldPositionFileDTOS) {
PositionFileDTO positionFileDTO = new PositionFileDTO();
BeanUtils.copyProperties(oldPositionFileDTO, positionFileDTO);
positionFileDTO.setPositionId(newPosition.getId());
positionFileService.create(positionFileDTO);
}
return newPosition.getId();
}
@Override
public List<PositionDTO> personPostMatching(Long id) {
JobExpectDTO jobExpectDTO = jobExpectService.find(JobExpectQueryDTO.builder().id(id).userId(UserContextHolder.getLoginUserId()).build());
if (Objects.isNull(jobExpectDTO)) {
return new ArrayList<>();
}
UserDTO userDTO = userService.get(UserContextHolder.getExistLoginUserId());
ResumeDTO resumeDTO = Optional.ofNullable(resumeService.userFind()).orElse(new ResumeDTO());
PersonPostMatchingQueryDTO queryDTO = new PersonPostMatchingQueryDTO();
queryDTO.setPageNo(1);
queryDTO.setPageSize(100);
queryDTO.setPositionNameLike(jobExpectDTO.getPositionName());
queryDTO.setPositionType(jobExpectDTO.getTypeCode());
queryDTO.setDetailAddressLike(jobExpectDTO.getExpectCityName());
queryDTO.setSalary(jobExpectDTO.getExpectSalary());
queryDTO.setSexRequire(Objects.isNull(userDTO.getGender()) ? null : String.valueOf(userDTO.getGender()));
queryDTO.setAge(Objects.isNull(userDTO.getBirthday()) ? null : DateUtil.ageOfNow(userDTO.getBirthday()));
queryDTO.setEducationRequire(resumeDTO.getEducation());
List<PositionDTO> positionDTOS = positionMapper.personPostMatching(queryDTO);
if (CollectionUtils.isEmpty(positionDTOS)) {
//岗位类型> 工作地 > 学历 / 年龄 / 薪酬 / 性别 / 经验 从右往左递减吧
//岗位名称> 岗位类型> 工作地 > 学历 / 年龄 / 薪酬 / 性别 / 经验
for (int i = 2; i <= 7; i++) {
if (i == 2) {
queryDTO.setSexRequire(null);
positionDTOS = positionMapper.personPostMatching(queryDTO);
if (CollectionUtils.isNotEmpty(positionDTOS)) {
break;
}
} else if (i == 3) {
queryDTO.setSalary(null);
positionDTOS = positionMapper.personPostMatching(queryDTO);
if (CollectionUtils.isNotEmpty(positionDTOS)) {
break;
}
} else if (i == 4) {
queryDTO.setAge(null);
positionDTOS = positionMapper.personPostMatching(queryDTO);
if (CollectionUtils.isNotEmpty(positionDTOS)) {
break;
}
} else if (i == 5) {
queryDTO.setEducationRequire(null);
positionDTOS = positionMapper.personPostMatching(queryDTO);
if (CollectionUtils.isNotEmpty(positionDTOS)) {
break;
}
} else if (i == 6) {
queryDTO.setDetailAddressLike(null);
positionDTOS = positionMapper.personPostMatching(queryDTO);
if (CollectionUtils.isNotEmpty(positionDTOS)) {
break;
}
} else if (i == 7) {
queryDTO.setPositionType(null);
positionDTOS = positionMapper.personPostMatching(queryDTO);
if (CollectionUtils.isNotEmpty(positionDTOS)) {
break;
}
}
}
}
for (PositionDTO positionDTO : positionDTOS) {
positionDTO.setRecruitPositionTypeName(DictUtils.getCodeNameMap("recruit_position_type").get(positionDTO.getRecruitPositionType()));
}
return positionDTOS;
}
@Override
public void positionExpiry() {
positionMapper.positionExpiry();
}
}

View File

@@ -0,0 +1,90 @@
package com.newyetai.recruit.position.service.impl;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import com.newyetai.common.util.TreeHelper;
import com.newyetai.recruit.position.dao.PositionTypeMapper;
import com.newyetai.recruit.position.dto.PositionTypeDTO;
import com.newyetai.recruit.position.dto.PositionTypeQueryDTO;
import com.newyetai.recruit.position.service.PositionTypeService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
import java.util.List;
import java.util.Map;
import javax.annotation.Resource;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.StrUtil;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
@Slf4j
@Service
@RequiredArgsConstructor(onConstructor = @__(@Autowired))
public class PositionTypeServiceImpl implements PositionTypeService {
@Autowired
private RedisTemplate redisTemplate;
@Resource
private PositionTypeMapper positionTypeMapper;
private Long maxFirst = 1L;
private Map<Long, Long> maxSecond = Maps.newConcurrentMap();
private Map<Long, Long> maxThree = Maps.newConcurrentMap();
@Override
public List<PositionTypeDTO> batchCreate(List<PositionTypeDTO> positionTypeDTOS) {
// List<PositionTypeDTO> allCreateTypes = needCreate(positionTypeDTOS);
// //select db
// List<PositionTypeDTO> currentTypes = Lists.newArrayList();
return null;
}
@Override
public List<PositionTypeDTO> query(PositionTypeQueryDTO queryDTO) {
List<PositionTypeDTO> types = positionTypeMapper.queryByDto(queryDTO);
List<PositionTypeDTO> positionTypeDTOS = TreeHelper.buildTree(0L, types);
String nameLike = queryDTO.getNameLike();
if (StrUtil.isNotEmpty(nameLike)) {
List<PositionTypeDTO> typesTemp = Lists.newLinkedList();
for (PositionTypeDTO type : positionTypeDTOS) {
if (handler(queryDTO, type)) {
typesTemp.add(type);
}
}
positionTypeDTOS = typesTemp;
}
return positionTypeDTOS;
}
public Boolean handler(PositionTypeQueryDTO queryDTO, PositionTypeDTO type) {
Boolean contain = Boolean.FALSE;
String nameLike = queryDTO.getNameLike();
if (StrUtil.containsIgnoreCase(type.getName(), nameLike)) {
contain = Boolean.TRUE;
}
List<PositionTypeDTO> childrenSet = type.getChildrenSet();
if (CollUtil.isNotEmpty(childrenSet)) {
List<PositionTypeDTO> typesTemp = Lists.newLinkedList();
for (PositionTypeDTO positionTypeDTO : childrenSet) {
Boolean handler = handler(queryDTO, positionTypeDTO);
contain |= handler;
if (handler) {
typesTemp.add(positionTypeDTO);
}
}
type.setChildrenSet(typesTemp);
}
return contain;
}
}