From a623c5673fccb211c1fab873caa8195e59a21729 Mon Sep 17 00:00:00 2001 From: 86156 <823267011@qq.com> Date: Tue, 30 Dec 2025 13:47:53 +0800 Subject: [PATCH] =?UTF-8?q?=E5=8A=9E=E5=85=ACV3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/HrmCertificateController.java | 7 +- .../hrm/controller/HrmContractController.java | 6 - .../HrmEmpOrgPositionController.java | 6 - .../hrm/controller/HrmEmployeeController.java | 20 +- .../controller/HrmFlowActionController.java | 2 - .../hrm/controller/HrmFlowCcController.java | 70 + .../controller/HrmFlowFormDataController.java | 2 - .../controller/HrmFlowInstanceController.java | 15 +- .../hrm/controller/HrmFlowNodeController.java | 6 - .../hrm/controller/HrmFlowTaskController.java | 42 +- .../controller/HrmFlowTemplateController.java | 6 - .../hrm/controller/HrmGradeController.java | 68 - .../HrmHeadcountPlanController.java | 6 - .../controller/HrmLeaveBalanceController.java | 6 - .../hrm/controller/HrmLeaveReqController.java | 6 - .../klp/hrm/controller/HrmOrgController.java | 68 - .../hrm/controller/HrmPositionController.java | 68 - .../hrm/controller/HrmPunchController.java | 6 - ...er.java => HrmReimburseReqController.java} | 31 +- .../hrm/controller/HrmScheduleController.java | 6 - .../hrm/controller/HrmSealReqController.java | 19 +- .../hrm/controller/HrmShiftController.java | 6 - .../com/klp/hrm/domain/HrmEmpOrgPosition.java | 6 +- .../java/com/klp/hrm/domain/HrmEmployee.java | 7 +- .../java/com/klp/hrm/domain/HrmFlowCc.java | 46 + .../java/com/klp/hrm/domain/HrmFlowTask.java | 7 + .../java/com/klp/hrm/domain/HrmGrade.java | 29 - .../com/klp/hrm/domain/HrmHeadcountPlan.java | 6 +- .../main/java/com/klp/hrm/domain/HrmOrg.java | 33 - .../java/com/klp/hrm/domain/HrmPosition.java | 31 - ...mOvertimeReq.java => HrmReimburseReq.java} | 24 +- .../java/com/klp/hrm/domain/HrmTravelReq.java | 8 +- .../hrm/domain/bo/HrmEmpOrgPositionBo.java | 8 +- .../com/klp/hrm/domain/bo/HrmEmployeeBo.java | 8 +- .../com/klp/hrm/domain/bo/HrmFlowCcBo.java | 33 + .../com/klp/hrm/domain/bo/HrmFlowStartBo.java | 9 +- .../hrm/domain/bo/HrmFlowTaskApproveBo.java | 17 + .../com/klp/hrm/domain/bo/HrmFlowTaskBo.java | 6 + .../com/klp/hrm/domain/bo/HrmGradeBo.java | 24 - .../klp/hrm/domain/bo/HrmHeadcountPlanBo.java | 8 +- .../com/klp/hrm/domain/bo/HrmLeaveReqBo.java | 15 + .../java/com/klp/hrm/domain/bo/HrmOrgBo.java | 39 - .../com/klp/hrm/domain/bo/HrmPositionBo.java | 28 - ...rtimeReqBo.java => HrmReimburseReqBo.java} | 26 +- .../com/klp/hrm/domain/bo/HrmSealReqBo.java | 13 +- .../com/klp/hrm/domain/bo/HrmSealStampBo.java | 57 +- .../com/klp/hrm/domain/bo/HrmTravelReqBo.java | 12 + .../hrm/domain/vo/HrmEmpOrgPositionVo.java | 12 +- .../com/klp/hrm/domain/vo/HrmEmployeeVo.java | 13 +- .../com/klp/hrm/domain/vo/HrmFlowCcVo.java | 26 + .../klp/hrm/domain/vo/HrmFlowInstanceVo.java | 9 + .../com/klp/hrm/domain/vo/HrmFlowTaskVo.java | 13 + .../com/klp/hrm/domain/vo/HrmGradeVo.java | 32 - .../klp/hrm/domain/vo/HrmHeadcountPlanVo.java | 6 +- .../java/com/klp/hrm/domain/vo/HrmOrgVo.java | 44 - .../com/klp/hrm/domain/vo/HrmPositionVo.java | 38 - ...rtimeReqVo.java => HrmReimburseReqVo.java} | 28 +- .../com/klp/hrm/domain/vo/HrmTravelReqVo.java | 10 + .../com/klp/hrm/mapper/HrmFlowCcMapper.java | 9 + .../klp/hrm/mapper/HrmFlowInstanceMapper.java | 10 + .../com/klp/hrm/mapper/HrmGradeMapper.java | 8 - .../java/com/klp/hrm/mapper/HrmOrgMapper.java | 8 - .../klp/hrm/mapper/HrmOvertimeReqMapper.java | 8 - .../com/klp/hrm/mapper/HrmPositionMapper.java | 8 - .../klp/hrm/mapper/HrmReimburseReqMapper.java | 9 + .../klp/hrm/service/IHrmFlowCcService.java | 31 + .../hrm/service/IHrmFlowInstanceService.java | 5 + .../klp/hrm/service/IHrmFlowTaskService.java | 10 + .../com/klp/hrm/service/IHrmGradeService.java | 23 - .../com/klp/hrm/service/IHrmOrgService.java | 23 - .../hrm/service/IHrmOvertimeReqService.java | 24 - .../klp/hrm/service/IHrmPositionService.java | 23 - .../hrm/service/IHrmReimburseReqService.java | 25 + .../hrm/service/impl/BizStatusSyncHelper.java | 102 ++ .../hrm/service/impl/FlowAssigneeHelper.java | 132 ++ .../impl/HrmEmpOrgPositionServiceImpl.java | 45 +- .../service/impl/HrmEmployeeServiceImpl.java | 5 +- .../service/impl/HrmFlowCcServiceImpl.java | 163 +++ .../impl/HrmFlowInstanceServiceImpl.java | 68 +- .../service/impl/HrmFlowTaskServiceImpl.java | 202 ++- .../hrm/service/impl/HrmGradeServiceImpl.java | 72 - .../impl/HrmHeadcountPlanServiceImpl.java | 4 +- .../service/impl/HrmLeaveReqServiceImpl.java | 50 +- .../hrm/service/impl/HrmOrgServiceImpl.java | 82 -- .../impl/HrmOvertimeReqServiceImpl.java | 78 -- .../service/impl/HrmPositionServiceImpl.java | 74 - .../impl/HrmReimburseReqServiceImpl.java | 107 ++ .../service/impl/HrmSealReqServiceImpl.java | 84 +- .../service/impl/HrmTravelReqServiceImpl.java | 41 +- .../mapper/HrmEmpOrgPositionMapper.xml | 34 +- .../resources/mapper/HrmEmployeeMapper.xml | 55 +- .../main/resources/mapper/HrmGradeMapper.xml | 16 - .../mapper/HrmHeadcountPlanMapper.xml | 4 +- .../main/resources/mapper/HrmOrgMapper.xml | 20 - .../resources/mapper/HrmOvertimeReqMapper.xml | 22 - .../resources/mapper/HrmPositionMapper.xml | 18 - .../resources/mapper/HrmTravelReqMapper.xml | 5 + klp-ui/src/api/hrm/attendance.js | 127 ++ klp-ui/src/api/hrm/cc.js | 35 + klp-ui/src/api/hrm/certContract.js | 66 + klp-ui/src/api/hrm/empOrgPosition.js | 34 + klp-ui/src/api/hrm/employee.js | 56 + klp-ui/src/api/hrm/flow.js | 212 +++ klp-ui/src/api/hrm/gradePosition.js | 66 + klp-ui/src/api/hrm/index.js | 706 +--------- klp-ui/src/api/hrm/leave.js | 48 + klp-ui/src/api/hrm/org.js | 49 + klp-ui/src/api/hrm/reimburse.js | 49 + klp-ui/src/api/hrm/seal.js | 99 ++ klp-ui/src/api/hrm/travel.js | 48 + klp-ui/src/api/system/dept.js | 8 + klp-ui/src/api/system/oss.js | 8 +- klp-ui/src/components/PdfStamper/index.vue | 231 +++ klp-ui/src/components/userSelect/multi.vue | 249 ++-- klp-ui/src/components/userSelect/single.vue | 271 ++-- klp-ui/src/router/index.js | 1 + klp-ui/src/utils/request.js | 24 + klp-ui/src/views/hrm/attendance/index.vue | 1 - klp-ui/src/views/hrm/employee/index.vue | 502 +++++++ klp-ui/src/views/hrm/flow/cc.vue | 149 ++ klp-ui/src/views/hrm/flow/node.vue | 723 ++++++++-- klp-ui/src/views/hrm/flow/task.vue | 775 ++++++---- klp-ui/src/views/hrm/flow/template.vue | 392 +++++- klp-ui/src/views/hrm/index.vue | 18 +- klp-ui/src/views/hrm/org/index.vue | 1245 ++++------------- .../hrm/requests/_manualApproverMixin.js | 47 + klp-ui/src/views/hrm/requests/apply.vue | 432 ++++++ klp-ui/src/views/hrm/requests/index.vue | 669 +++++---- klp-ui/src/views/hrm/requests/leave.vue | 457 +++++- klp-ui/src/views/hrm/requests/leaveDetail.vue | 686 +++++++++ klp-ui/src/views/hrm/requests/reimburse.vue | 465 ++++++ .../views/hrm/requests/reimburseDetail.vue | 598 ++++++++ klp-ui/src/views/hrm/requests/seal.vue | 473 ++++++- klp-ui/src/views/hrm/requests/sealDetail.vue | 992 +++++++++++++ klp-ui/src/views/hrm/requests/travel.vue | 457 +++++- .../src/views/hrm/requests/travelDetail.vue | 678 +++++++++ klp-ui/vue.config.js | 18 +- 137 files changed, 11031 insertions(+), 4043 deletions(-) create mode 100644 klp-hrm/src/main/java/com/klp/hrm/controller/HrmFlowCcController.java delete mode 100644 klp-hrm/src/main/java/com/klp/hrm/controller/HrmGradeController.java delete mode 100644 klp-hrm/src/main/java/com/klp/hrm/controller/HrmOrgController.java delete mode 100644 klp-hrm/src/main/java/com/klp/hrm/controller/HrmPositionController.java rename klp-hrm/src/main/java/com/klp/hrm/controller/{HrmOvertimeReqController.java => HrmReimburseReqController.java} (57%) create mode 100644 klp-hrm/src/main/java/com/klp/hrm/domain/HrmFlowCc.java delete mode 100644 klp-hrm/src/main/java/com/klp/hrm/domain/HrmGrade.java delete mode 100644 klp-hrm/src/main/java/com/klp/hrm/domain/HrmOrg.java delete mode 100644 klp-hrm/src/main/java/com/klp/hrm/domain/HrmPosition.java rename klp-hrm/src/main/java/com/klp/hrm/domain/{HrmOvertimeReq.java => HrmReimburseReq.java} (64%) create mode 100644 klp-hrm/src/main/java/com/klp/hrm/domain/bo/HrmFlowCcBo.java create mode 100644 klp-hrm/src/main/java/com/klp/hrm/domain/bo/HrmFlowTaskApproveBo.java delete mode 100644 klp-hrm/src/main/java/com/klp/hrm/domain/bo/HrmGradeBo.java delete mode 100644 klp-hrm/src/main/java/com/klp/hrm/domain/bo/HrmOrgBo.java delete mode 100644 klp-hrm/src/main/java/com/klp/hrm/domain/bo/HrmPositionBo.java rename klp-hrm/src/main/java/com/klp/hrm/domain/bo/{HrmOvertimeReqBo.java => HrmReimburseReqBo.java} (55%) create mode 100644 klp-hrm/src/main/java/com/klp/hrm/domain/vo/HrmFlowCcVo.java delete mode 100644 klp-hrm/src/main/java/com/klp/hrm/domain/vo/HrmGradeVo.java delete mode 100644 klp-hrm/src/main/java/com/klp/hrm/domain/vo/HrmOrgVo.java delete mode 100644 klp-hrm/src/main/java/com/klp/hrm/domain/vo/HrmPositionVo.java rename klp-hrm/src/main/java/com/klp/hrm/domain/vo/{HrmOvertimeReqVo.java => HrmReimburseReqVo.java} (60%) create mode 100644 klp-hrm/src/main/java/com/klp/hrm/mapper/HrmFlowCcMapper.java delete mode 100644 klp-hrm/src/main/java/com/klp/hrm/mapper/HrmGradeMapper.java delete mode 100644 klp-hrm/src/main/java/com/klp/hrm/mapper/HrmOrgMapper.java delete mode 100644 klp-hrm/src/main/java/com/klp/hrm/mapper/HrmOvertimeReqMapper.java delete mode 100644 klp-hrm/src/main/java/com/klp/hrm/mapper/HrmPositionMapper.java create mode 100644 klp-hrm/src/main/java/com/klp/hrm/mapper/HrmReimburseReqMapper.java create mode 100644 klp-hrm/src/main/java/com/klp/hrm/service/IHrmFlowCcService.java delete mode 100644 klp-hrm/src/main/java/com/klp/hrm/service/IHrmGradeService.java delete mode 100644 klp-hrm/src/main/java/com/klp/hrm/service/IHrmOrgService.java delete mode 100644 klp-hrm/src/main/java/com/klp/hrm/service/IHrmOvertimeReqService.java delete mode 100644 klp-hrm/src/main/java/com/klp/hrm/service/IHrmPositionService.java create mode 100644 klp-hrm/src/main/java/com/klp/hrm/service/IHrmReimburseReqService.java create mode 100644 klp-hrm/src/main/java/com/klp/hrm/service/impl/BizStatusSyncHelper.java create mode 100644 klp-hrm/src/main/java/com/klp/hrm/service/impl/FlowAssigneeHelper.java create mode 100644 klp-hrm/src/main/java/com/klp/hrm/service/impl/HrmFlowCcServiceImpl.java delete mode 100644 klp-hrm/src/main/java/com/klp/hrm/service/impl/HrmGradeServiceImpl.java delete mode 100644 klp-hrm/src/main/java/com/klp/hrm/service/impl/HrmOrgServiceImpl.java delete mode 100644 klp-hrm/src/main/java/com/klp/hrm/service/impl/HrmOvertimeReqServiceImpl.java delete mode 100644 klp-hrm/src/main/java/com/klp/hrm/service/impl/HrmPositionServiceImpl.java create mode 100644 klp-hrm/src/main/java/com/klp/hrm/service/impl/HrmReimburseReqServiceImpl.java delete mode 100644 klp-hrm/src/main/resources/mapper/HrmGradeMapper.xml delete mode 100644 klp-hrm/src/main/resources/mapper/HrmOrgMapper.xml delete mode 100644 klp-hrm/src/main/resources/mapper/HrmOvertimeReqMapper.xml delete mode 100644 klp-hrm/src/main/resources/mapper/HrmPositionMapper.xml create mode 100644 klp-ui/src/api/hrm/attendance.js create mode 100644 klp-ui/src/api/hrm/cc.js create mode 100644 klp-ui/src/api/hrm/certContract.js create mode 100644 klp-ui/src/api/hrm/empOrgPosition.js create mode 100644 klp-ui/src/api/hrm/employee.js create mode 100644 klp-ui/src/api/hrm/flow.js create mode 100644 klp-ui/src/api/hrm/gradePosition.js create mode 100644 klp-ui/src/api/hrm/leave.js create mode 100644 klp-ui/src/api/hrm/org.js create mode 100644 klp-ui/src/api/hrm/reimburse.js create mode 100644 klp-ui/src/api/hrm/seal.js create mode 100644 klp-ui/src/api/hrm/travel.js create mode 100644 klp-ui/src/components/PdfStamper/index.vue create mode 100644 klp-ui/src/views/hrm/employee/index.vue create mode 100644 klp-ui/src/views/hrm/flow/cc.vue create mode 100644 klp-ui/src/views/hrm/requests/_manualApproverMixin.js create mode 100644 klp-ui/src/views/hrm/requests/apply.vue create mode 100644 klp-ui/src/views/hrm/requests/leaveDetail.vue create mode 100644 klp-ui/src/views/hrm/requests/reimburse.vue create mode 100644 klp-ui/src/views/hrm/requests/reimburseDetail.vue create mode 100644 klp-ui/src/views/hrm/requests/sealDetail.vue create mode 100644 klp-ui/src/views/hrm/requests/travelDetail.vue diff --git a/klp-hrm/src/main/java/com/klp/hrm/controller/HrmCertificateController.java b/klp-hrm/src/main/java/com/klp/hrm/controller/HrmCertificateController.java index ca4ebd73..45fe472e 100644 --- a/klp-hrm/src/main/java/com/klp/hrm/controller/HrmCertificateController.java +++ b/klp-hrm/src/main/java/com/klp/hrm/controller/HrmCertificateController.java @@ -27,40 +27,35 @@ public class HrmCertificateController extends BaseController { private final IHrmCertificateService service; - @SaCheckPermission("hrm:certificate:list") + @GetMapping("/list") public TableDataInfo list(HrmCertificateBo bo, PageQuery pageQuery) { return service.queryPageList(bo, pageQuery); } - @SaCheckPermission("hrm:certificate:query") @GetMapping("/{certId}") public R getInfo(@PathVariable @NotNull Long certId) { return R.ok(service.queryById(certId)); } - @SaCheckPermission("hrm:certificate:add") @Log(title = "证书", businessType = BusinessType.INSERT) @PostMapping public R add(@Validated @RequestBody HrmCertificateBo bo) { return toAjax(service.insertByBo(bo)); } - @SaCheckPermission("hrm:certificate:edit") @Log(title = "证书", businessType = BusinessType.UPDATE) @PutMapping public R edit(@Validated @RequestBody HrmCertificateBo bo) { return toAjax(service.updateByBo(bo)); } - @SaCheckPermission("hrm:certificate:remove") @Log(title = "证书", businessType = BusinessType.DELETE) @DeleteMapping("/{certIds}") public R remove(@PathVariable @NotEmpty Long[] certIds) { return toAjax(service.deleteWithValidByIds(Arrays.asList(certIds), true)); } - @SaCheckPermission("hrm:certificate:list") @GetMapping("/all") public R> all(HrmCertificateBo bo) { return R.ok(service.queryList(bo)); diff --git a/klp-hrm/src/main/java/com/klp/hrm/controller/HrmContractController.java b/klp-hrm/src/main/java/com/klp/hrm/controller/HrmContractController.java index 685aca04..4df69535 100644 --- a/klp-hrm/src/main/java/com/klp/hrm/controller/HrmContractController.java +++ b/klp-hrm/src/main/java/com/klp/hrm/controller/HrmContractController.java @@ -27,40 +27,34 @@ public class HrmContractController extends BaseController { private final IHrmContractService service; - @SaCheckPermission("hrm:contract:list") @GetMapping("/list") public TableDataInfo list(HrmContractBo bo, PageQuery pageQuery) { return service.queryPageList(bo, pageQuery); } - @SaCheckPermission("hrm:contract:query") @GetMapping("/{contractId}") public R getInfo(@PathVariable @NotNull Long contractId) { return R.ok(service.queryById(contractId)); } - @SaCheckPermission("hrm:contract:add") @Log(title = "劳动合同", businessType = BusinessType.INSERT) @PostMapping public R add(@Validated @RequestBody HrmContractBo bo) { return toAjax(service.insertByBo(bo)); } - @SaCheckPermission("hrm:contract:edit") @Log(title = "劳动合同", businessType = BusinessType.UPDATE) @PutMapping public R edit(@Validated @RequestBody HrmContractBo bo) { return toAjax(service.updateByBo(bo)); } - @SaCheckPermission("hrm:contract:remove") @Log(title = "劳动合同", businessType = BusinessType.DELETE) @DeleteMapping("/{contractIds}") public R remove(@PathVariable @NotEmpty Long[] contractIds) { return toAjax(service.deleteWithValidByIds(Arrays.asList(contractIds), true)); } - @SaCheckPermission("hrm:contract:list") @GetMapping("/all") public R> all(HrmContractBo bo) { return R.ok(service.queryList(bo)); diff --git a/klp-hrm/src/main/java/com/klp/hrm/controller/HrmEmpOrgPositionController.java b/klp-hrm/src/main/java/com/klp/hrm/controller/HrmEmpOrgPositionController.java index bc0adc1f..cff7b82e 100644 --- a/klp-hrm/src/main/java/com/klp/hrm/controller/HrmEmpOrgPositionController.java +++ b/klp-hrm/src/main/java/com/klp/hrm/controller/HrmEmpOrgPositionController.java @@ -27,40 +27,34 @@ public class HrmEmpOrgPositionController extends BaseController { private final IHrmEmpOrgPositionService service; - @SaCheckPermission("hrm:emporg:list") @GetMapping("/list") public TableDataInfo list(HrmEmpOrgPositionBo bo, PageQuery pageQuery) { return service.queryPageList(bo, pageQuery); } - @SaCheckPermission("hrm:emporg:query") @GetMapping("/{relId}") public R getInfo(@PathVariable @NotNull Long relId) { return R.ok(service.queryById(relId)); } - @SaCheckPermission("hrm:emporg:add") @Log(title = "员工组织岗位关系", businessType = BusinessType.INSERT) @PostMapping public R add(@Validated @RequestBody HrmEmpOrgPositionBo bo) { return toAjax(service.insertByBo(bo)); } - @SaCheckPermission("hrm:emporg:edit") @Log(title = "员工组织岗位关系", businessType = BusinessType.UPDATE) @PutMapping public R edit(@Validated @RequestBody HrmEmpOrgPositionBo bo) { return toAjax(service.updateByBo(bo)); } - @SaCheckPermission("hrm:emporg:remove") @Log(title = "员工组织岗位关系", businessType = BusinessType.DELETE) @DeleteMapping("/{relIds}") public R remove(@PathVariable @NotEmpty Long[] relIds) { return toAjax(service.deleteWithValidByIds(Arrays.asList(relIds), true)); } - @SaCheckPermission("hrm:emporg:list") @GetMapping("/all") public R> all(HrmEmpOrgPositionBo bo) { return R.ok(service.queryList(bo)); diff --git a/klp-hrm/src/main/java/com/klp/hrm/controller/HrmEmployeeController.java b/klp-hrm/src/main/java/com/klp/hrm/controller/HrmEmployeeController.java index 5c39b5ef..6b0cb16f 100644 --- a/klp-hrm/src/main/java/com/klp/hrm/controller/HrmEmployeeController.java +++ b/klp-hrm/src/main/java/com/klp/hrm/controller/HrmEmployeeController.java @@ -27,42 +27,50 @@ public class HrmEmployeeController extends BaseController { private final IHrmEmployeeService service; - @SaCheckPermission("hrm:employee:list") @GetMapping("/list") public TableDataInfo list(HrmEmployeeBo bo, PageQuery pageQuery) { return service.queryPageList(bo, pageQuery); } - @SaCheckPermission("hrm:employee:query") @GetMapping("/{empId}") public R getInfo(@PathVariable @NotNull Long empId) { return R.ok(service.queryById(empId)); } - @SaCheckPermission("hrm:employee:add") @Log(title = "员工管理", businessType = BusinessType.INSERT) @PostMapping public R add(@Validated @RequestBody HrmEmployeeBo bo) { return toAjax(service.insertByBo(bo)); } - @SaCheckPermission("hrm:employee:edit") @Log(title = "员工管理", businessType = BusinessType.UPDATE) @PutMapping public R edit(@Validated @RequestBody HrmEmployeeBo bo) { return toAjax(service.updateByBo(bo)); } - @SaCheckPermission("hrm:employee:remove") @Log(title = "员工管理", businessType = BusinessType.DELETE) @DeleteMapping("/{empIds}") public R remove(@PathVariable @NotEmpty Long[] empIds) { return toAjax(service.deleteWithValidByIds(Arrays.asList(empIds), true)); } - @SaCheckPermission("hrm:employee:list") @GetMapping("/all") public R> all(HrmEmployeeBo bo) { return R.ok(service.queryList(bo)); } + + /** + * 根据用户ID获取员工信息 + */ + @GetMapping("/byUserId/{userId}") + public R getByUserId(@PathVariable @NotNull Long userId) { + HrmEmployeeBo bo = new HrmEmployeeBo(); + bo.setUserId(userId); + List list = service.queryList(bo); + if (list != null && !list.isEmpty()) { + return R.ok(list.get(0)); + } + return R.fail("未找到该用户对应的员工信息"); + } } diff --git a/klp-hrm/src/main/java/com/klp/hrm/controller/HrmFlowActionController.java b/klp-hrm/src/main/java/com/klp/hrm/controller/HrmFlowActionController.java index a5d95dd0..949acdc4 100644 --- a/klp-hrm/src/main/java/com/klp/hrm/controller/HrmFlowActionController.java +++ b/klp-hrm/src/main/java/com/klp/hrm/controller/HrmFlowActionController.java @@ -25,13 +25,11 @@ public class HrmFlowActionController extends BaseController { private final IHrmFlowActionService service; - @SaCheckPermission("hrm:flow:list") @GetMapping("/list") public TableDataInfo list(HrmFlowActionBo bo, PageQuery pageQuery) { return service.queryPageList(bo, pageQuery); } - @SaCheckPermission("hrm:flow:query") @GetMapping("/{actionId}") public R getInfo(@PathVariable @NotNull Long actionId) { return R.ok(service.queryById(actionId)); diff --git a/klp-hrm/src/main/java/com/klp/hrm/controller/HrmFlowCcController.java b/klp-hrm/src/main/java/com/klp/hrm/controller/HrmFlowCcController.java new file mode 100644 index 00000000..dd89cd13 --- /dev/null +++ b/klp-hrm/src/main/java/com/klp/hrm/controller/HrmFlowCcController.java @@ -0,0 +1,70 @@ +package com.klp.hrm.controller; + +import cn.dev33.satoken.stp.StpUtil; +import com.klp.common.core.controller.BaseController; +import com.klp.common.core.domain.PageQuery; +import com.klp.common.core.domain.R; +import com.klp.common.core.page.TableDataInfo; +import com.klp.hrm.domain.bo.HrmFlowCcBo; +import com.klp.hrm.domain.vo.HrmFlowCcVo; +import com.klp.hrm.service.IHrmFlowCcService; +import lombok.RequiredArgsConstructor; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.validation.constraints.NotNull; + +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/hrm/flow/cc") +public class HrmFlowCcController extends BaseController { + + private final IHrmFlowCcService service; + + /** + * 抄送我的 + */ + @GetMapping("/my") + public TableDataInfo my(@RequestParam(required = false) Long ccUserId, PageQuery pageQuery) { + Long uid = ccUserId; + if (uid == null) { + try { + uid = StpUtil.getLoginIdAsLong(); + } catch (Exception e) { + uid = null; + } + } + HrmFlowCcBo bo = new HrmFlowCcBo(); + bo.setCcUserId(uid); + return service.queryPageList(bo, pageQuery); + } + + @GetMapping("/list") + public TableDataInfo list(HrmFlowCcBo bo, PageQuery pageQuery) { + return service.queryPageList(bo, pageQuery); + } + + /** + * 手动抄送(支持批量) + */ + @PostMapping + public R add(@RequestBody HrmFlowCcBo bo) { + return toAjax(service.insertBatch(bo)); + } + + /** + * 标记抄送已读 + */ + @PostMapping("/{ccId}/read") + public R read(@PathVariable Long ccId) { + Long uid = StpUtil.getLoginIdAsLong(); + return toAjax(service.markRead(ccId, uid)); + } + + @GetMapping("/ping") + public R ping(@RequestParam @NotNull String x) { + return R.ok(x); + } +} + diff --git a/klp-hrm/src/main/java/com/klp/hrm/controller/HrmFlowFormDataController.java b/klp-hrm/src/main/java/com/klp/hrm/controller/HrmFlowFormDataController.java index e8ff1dbf..19fb6066 100644 --- a/klp-hrm/src/main/java/com/klp/hrm/controller/HrmFlowFormDataController.java +++ b/klp-hrm/src/main/java/com/klp/hrm/controller/HrmFlowFormDataController.java @@ -25,13 +25,11 @@ public class HrmFlowFormDataController extends BaseController { private final IHrmFormDataService service; - @SaCheckPermission("hrm:flow:list") @GetMapping("/list") public TableDataInfo list(HrmFormDataBo bo, PageQuery pageQuery) { return service.queryPageList(bo, pageQuery); } - @SaCheckPermission("hrm:flow:query") @GetMapping("/{formId}") public R getInfo(@PathVariable @NotNull Long formId) { return R.ok(service.queryById(formId)); diff --git a/klp-hrm/src/main/java/com/klp/hrm/controller/HrmFlowInstanceController.java b/klp-hrm/src/main/java/com/klp/hrm/controller/HrmFlowInstanceController.java index 830ffbd2..e7e84e64 100644 --- a/klp-hrm/src/main/java/com/klp/hrm/controller/HrmFlowInstanceController.java +++ b/klp-hrm/src/main/java/com/klp/hrm/controller/HrmFlowInstanceController.java @@ -28,47 +28,48 @@ public class HrmFlowInstanceController extends BaseController { private final IHrmFlowInstanceService service; - @SaCheckPermission("hrm:flow:list") @GetMapping("/list") public TableDataInfo list(HrmFlowInstanceBo bo, PageQuery pageQuery) { return service.queryPageList(bo, pageQuery); } - @SaCheckPermission("hrm:flow:query") + /** + * 查询我的申请列表 + */ + @GetMapping("/myList") + public TableDataInfo myList(HrmFlowInstanceBo bo, PageQuery pageQuery) { + return service.queryMyInstancePageList(bo, pageQuery); + } + @GetMapping("/{instId}") public R getInfo(@PathVariable @NotNull Long instId) { return R.ok(service.queryById(instId)); } - @SaCheckPermission("hrm:flow:add") @Log(title = "流程实例", businessType = BusinessType.INSERT) @PostMapping public R add(@Validated @RequestBody HrmFlowInstanceBo bo) { return toAjax(service.insertByBo(bo)); } - @SaCheckPermission("hrm:flow:edit") @Log(title = "流程实例", businessType = BusinessType.UPDATE) @PutMapping public R edit(@Validated @RequestBody HrmFlowInstanceBo bo) { return toAjax(service.updateByBo(bo)); } - @SaCheckPermission("hrm:flow:remove") @Log(title = "流程实例", businessType = BusinessType.DELETE) @DeleteMapping("/{instIds}") public R remove(@PathVariable @NotEmpty Long[] instIds) { return toAjax(service.deleteWithValidByIds(Arrays.asList(instIds), true)); } - @SaCheckPermission("hrm:flow:add") @Log(title = "流程实例启动", businessType = BusinessType.INSERT) @PostMapping("/start") public R start(@Validated @RequestBody HrmFlowStartBo bo) { return R.ok(service.startInstance(bo)); } - @SaCheckPermission("hrm:flow:list") @GetMapping("/all") public R> all(HrmFlowInstanceBo bo) { return R.ok(service.queryList(bo)); diff --git a/klp-hrm/src/main/java/com/klp/hrm/controller/HrmFlowNodeController.java b/klp-hrm/src/main/java/com/klp/hrm/controller/HrmFlowNodeController.java index a0a4d1be..50de6952 100644 --- a/klp-hrm/src/main/java/com/klp/hrm/controller/HrmFlowNodeController.java +++ b/klp-hrm/src/main/java/com/klp/hrm/controller/HrmFlowNodeController.java @@ -27,40 +27,34 @@ public class HrmFlowNodeController extends BaseController { private final IHrmFlowNodeService service; - @SaCheckPermission("hrm:flow:list") @GetMapping("/list") public TableDataInfo list(HrmFlowNodeBo bo, PageQuery pageQuery) { return service.queryPageList(bo, pageQuery); } - @SaCheckPermission("hrm:flow:query") @GetMapping("/{nodeId}") public R getInfo(@PathVariable @NotNull Long nodeId) { return R.ok(service.queryById(nodeId)); } - @SaCheckPermission("hrm:flow:add") @Log(title = "流程节点", businessType = BusinessType.INSERT) @PostMapping public R add(@Validated @RequestBody HrmFlowNodeBo bo) { return toAjax(service.insertByBo(bo)); } - @SaCheckPermission("hrm:flow:edit") @Log(title = "流程节点", businessType = BusinessType.UPDATE) @PutMapping public R edit(@Validated @RequestBody HrmFlowNodeBo bo) { return toAjax(service.updateByBo(bo)); } - @SaCheckPermission("hrm:flow:remove") @Log(title = "流程节点", businessType = BusinessType.DELETE) @DeleteMapping("/{nodeIds}") public R remove(@PathVariable @NotEmpty Long[] nodeIds) { return toAjax(service.deleteWithValidByIds(Arrays.asList(nodeIds), true)); } - @SaCheckPermission("hrm:flow:list") @GetMapping("/all") public R> all(HrmFlowNodeBo bo) { return R.ok(service.queryList(bo)); diff --git a/klp-hrm/src/main/java/com/klp/hrm/controller/HrmFlowTaskController.java b/klp-hrm/src/main/java/com/klp/hrm/controller/HrmFlowTaskController.java index cfe7df20..5e833ff0 100644 --- a/klp-hrm/src/main/java/com/klp/hrm/controller/HrmFlowTaskController.java +++ b/klp-hrm/src/main/java/com/klp/hrm/controller/HrmFlowTaskController.java @@ -1,7 +1,5 @@ package com.klp.hrm.controller; -import cn.dev33.satoken.annotation.SaCheckPermission; -import cn.dev33.satoken.stp.StpUtil; import com.klp.common.annotation.Log; import com.klp.common.core.controller.BaseController; import com.klp.common.core.domain.PageQuery; @@ -9,6 +7,7 @@ import com.klp.common.core.domain.R; import com.klp.common.core.page.TableDataInfo; import com.klp.common.enums.BusinessType; import com.klp.hrm.domain.bo.HrmFlowTaskBo; +import com.klp.hrm.domain.bo.HrmFlowTaskApproveBo; import com.klp.hrm.domain.bo.HrmSealStampBo; import com.klp.hrm.domain.vo.HrmFlowTaskVo; import com.klp.hrm.service.IHrmFlowTaskService; @@ -29,59 +28,66 @@ public class HrmFlowTaskController extends BaseController { private final IHrmFlowTaskService service; - @SaCheckPermission("hrm:flow:list") @GetMapping("/list") public TableDataInfo list(HrmFlowTaskBo bo, PageQuery pageQuery) { return service.queryPageList(bo, pageQuery); } - @SaCheckPermission("hrm:flow:list") @GetMapping("/todo") public R> todo(@RequestParam(required = false) Long assigneeUserId) { + HrmFlowTaskBo bo = new HrmFlowTaskBo(); - bo.setAssigneeUserId(assigneeUserId != null ? assigneeUserId : StpUtil.getLoginIdAsLong()); + bo.setAssigneeUserId(assigneeUserId); bo.setStatus("pending"); return R.ok(service.queryList(bo)); + + } + + /** + * 详情页使用:按 bizType + bizId 查询当前用户的待办任务(pending) + */ + @GetMapping("/todoByBiz") + public R todoByBiz(@RequestParam @NotNull String bizType, + @RequestParam @NotNull Long bizId, + @RequestParam(required = false) Long assigneeUserId) { + + return R.ok(service.queryTodoByBiz(bizType, bizId, assigneeUserId)); + } - @SaCheckPermission("hrm:flow:query") @GetMapping("/{taskId}") public R getInfo(@PathVariable @NotNull Long taskId) { return R.ok(service.queryById(taskId)); } - @SaCheckPermission("hrm:flow:add") @Log(title = "流程任务", businessType = BusinessType.INSERT) @PostMapping public R add(@Validated @RequestBody HrmFlowTaskBo bo) { return toAjax(service.insertByBo(bo)); } - @SaCheckPermission("hrm:flow:edit") @Log(title = "流程任务", businessType = BusinessType.UPDATE) @PutMapping public R edit(@Validated @RequestBody HrmFlowTaskBo bo) { return toAjax(service.updateByBo(bo)); } - @SaCheckPermission("hrm:flow:remove") @Log(title = "流程任务", businessType = BusinessType.DELETE) @DeleteMapping("/{taskIds}") public R remove(@PathVariable @NotEmpty Long[] taskIds) { return toAjax(service.deleteWithValidByIds(Arrays.asList(taskIds), true)); } - @SaCheckPermission("hrm:flow:edit") @Log(title = "流程任务审批通过", businessType = BusinessType.UPDATE) @PostMapping("/{taskId}/approve") public R approve(@PathVariable @NotNull Long taskId, @RequestParam(required = false) Long actionUserId, - @RequestParam(required = false) String remark, - @RequestBody(required = false) HrmSealStampBo stampBo) { + @RequestBody(required = false) HrmFlowTaskApproveBo approveBo) { + String remark = approveBo != null ? approveBo.getRemark() : null; + HrmSealStampBo stampBo = approveBo != null ? approveBo.getStampBo() : null; return toAjax(service.approve(taskId, actionUserId, remark, stampBo)); } - @SaCheckPermission("hrm:flow:edit") @Log(title = "流程任务审批驳回", businessType = BusinessType.UPDATE) @PostMapping("/{taskId}/reject") public R reject(@PathVariable @NotNull Long taskId, @@ -90,7 +96,6 @@ public class HrmFlowTaskController extends BaseController { return toAjax(service.reject(taskId, actionUserId, remark)); } - @SaCheckPermission("hrm:flow:edit") @Log(title = "流程任务撤回", businessType = BusinessType.UPDATE) @PostMapping("/{taskId}/withdraw") public R withdraw(@PathVariable @NotNull Long taskId, @@ -98,4 +103,13 @@ public class HrmFlowTaskController extends BaseController { @RequestParam(required = false) String remark) { return toAjax(service.withdraw(taskId, actionUserId, remark)); } + + @Log(title = "流程任务转发", businessType = BusinessType.UPDATE) + @PostMapping("/{taskId}/transfer") + public R transfer(@PathVariable @NotNull Long taskId, + @RequestParam @NotNull Long newAssigneeUserId, + @RequestParam(required = false) Long actionUserId, + @RequestParam(required = false) String remark) { + return toAjax(service.transfer(taskId, newAssigneeUserId, actionUserId, remark)); + } } diff --git a/klp-hrm/src/main/java/com/klp/hrm/controller/HrmFlowTemplateController.java b/klp-hrm/src/main/java/com/klp/hrm/controller/HrmFlowTemplateController.java index 1a5483c8..46e6b98b 100644 --- a/klp-hrm/src/main/java/com/klp/hrm/controller/HrmFlowTemplateController.java +++ b/klp-hrm/src/main/java/com/klp/hrm/controller/HrmFlowTemplateController.java @@ -27,40 +27,34 @@ public class HrmFlowTemplateController extends BaseController { private final IHrmFlowTemplateService service; - @SaCheckPermission("hrm:flow:list") @GetMapping("/list") public TableDataInfo list(HrmFlowTemplateBo bo, PageQuery pageQuery) { return service.queryPageList(bo, pageQuery); } - @SaCheckPermission("hrm:flow:query") @GetMapping("/{tplId}") public R getInfo(@PathVariable @NotNull Long tplId) { return R.ok(service.queryById(tplId)); } - @SaCheckPermission("hrm:flow:add") @Log(title = "流程模板", businessType = BusinessType.INSERT) @PostMapping public R add(@Validated @RequestBody HrmFlowTemplateBo bo) { return toAjax(service.insertByBo(bo)); } - @SaCheckPermission("hrm:flow:edit") @Log(title = "流程模板", businessType = BusinessType.UPDATE) @PutMapping public R edit(@Validated @RequestBody HrmFlowTemplateBo bo) { return toAjax(service.updateByBo(bo)); } - @SaCheckPermission("hrm:flow:remove") @Log(title = "流程模板", businessType = BusinessType.DELETE) @DeleteMapping("/{tplIds}") public R remove(@PathVariable @NotEmpty Long[] tplIds) { return toAjax(service.deleteWithValidByIds(Arrays.asList(tplIds), true)); } - @SaCheckPermission("hrm:flow:list") @GetMapping("/all") public R> all(HrmFlowTemplateBo bo) { return R.ok(service.queryList(bo)); diff --git a/klp-hrm/src/main/java/com/klp/hrm/controller/HrmGradeController.java b/klp-hrm/src/main/java/com/klp/hrm/controller/HrmGradeController.java deleted file mode 100644 index 01a83f71..00000000 --- a/klp-hrm/src/main/java/com/klp/hrm/controller/HrmGradeController.java +++ /dev/null @@ -1,68 +0,0 @@ -package com.klp.hrm.controller; - -import cn.dev33.satoken.annotation.SaCheckPermission; -import com.klp.common.annotation.Log; -import com.klp.common.core.controller.BaseController; -import com.klp.common.core.domain.PageQuery; -import com.klp.common.core.domain.R; -import com.klp.common.core.page.TableDataInfo; -import com.klp.common.enums.BusinessType; -import com.klp.hrm.domain.bo.HrmGradeBo; -import com.klp.hrm.domain.vo.HrmGradeVo; -import com.klp.hrm.service.IHrmGradeService; -import lombok.RequiredArgsConstructor; -import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.*; - -import javax.validation.constraints.NotEmpty; -import javax.validation.constraints.NotNull; -import java.util.Arrays; -import java.util.List; - -@Validated -@RequiredArgsConstructor -@RestController -@RequestMapping("/hrm/grade") -public class HrmGradeController extends BaseController { - - private final IHrmGradeService service; - - @SaCheckPermission("hrm:grade:list") - @GetMapping("/list") - public TableDataInfo list(HrmGradeBo bo, PageQuery pageQuery) { - return service.queryPageList(bo, pageQuery); - } - - @SaCheckPermission("hrm:grade:query") - @GetMapping("/{gradeId}") - public R getInfo(@PathVariable @NotNull Long gradeId) { - return R.ok(service.queryById(gradeId)); - } - - @SaCheckPermission("hrm:grade:add") - @Log(title = "职级管理", businessType = BusinessType.INSERT) - @PostMapping - public R add(@Validated @RequestBody HrmGradeBo bo) { - return toAjax(service.insertByBo(bo)); - } - - @SaCheckPermission("hrm:grade:edit") - @Log(title = "职级管理", businessType = BusinessType.UPDATE) - @PutMapping - public R edit(@Validated @RequestBody HrmGradeBo bo) { - return toAjax(service.updateByBo(bo)); - } - - @SaCheckPermission("hrm:grade:remove") - @Log(title = "职级管理", businessType = BusinessType.DELETE) - @DeleteMapping("/{gradeIds}") - public R remove(@PathVariable @NotEmpty Long[] gradeIds) { - return toAjax(service.deleteWithValidByIds(Arrays.asList(gradeIds), true)); - } - - @SaCheckPermission("hrm:grade:list") - @GetMapping("/all") - public R> all(HrmGradeBo bo) { - return R.ok(service.queryList(bo)); - } -} diff --git a/klp-hrm/src/main/java/com/klp/hrm/controller/HrmHeadcountPlanController.java b/klp-hrm/src/main/java/com/klp/hrm/controller/HrmHeadcountPlanController.java index b98fbb21..bfd75e9c 100644 --- a/klp-hrm/src/main/java/com/klp/hrm/controller/HrmHeadcountPlanController.java +++ b/klp-hrm/src/main/java/com/klp/hrm/controller/HrmHeadcountPlanController.java @@ -27,40 +27,34 @@ public class HrmHeadcountPlanController extends BaseController { private final IHrmHeadcountPlanService service; - @SaCheckPermission("hrm:headcount:list") @GetMapping("/list") public TableDataInfo list(HrmHeadcountPlanBo bo, PageQuery pageQuery) { return service.queryPageList(bo, pageQuery); } - @SaCheckPermission("hrm:headcount:query") @GetMapping("/{planId}") public R getInfo(@PathVariable @NotNull Long planId) { return R.ok(service.queryById(planId)); } - @SaCheckPermission("hrm:headcount:add") @Log(title = "编制管理", businessType = BusinessType.INSERT) @PostMapping public R add(@Validated @RequestBody HrmHeadcountPlanBo bo) { return toAjax(service.insertByBo(bo)); } - @SaCheckPermission("hrm:headcount:edit") @Log(title = "编制管理", businessType = BusinessType.UPDATE) @PutMapping public R edit(@Validated @RequestBody HrmHeadcountPlanBo bo) { return toAjax(service.updateByBo(bo)); } - @SaCheckPermission("hrm:headcount:remove") @Log(title = "编制管理", businessType = BusinessType.DELETE) @DeleteMapping("/{planIds}") public R remove(@PathVariable @NotEmpty Long[] planIds) { return toAjax(service.deleteWithValidByIds(Arrays.asList(planIds), true)); } - @SaCheckPermission("hrm:headcount:list") @GetMapping("/all") public R> all(HrmHeadcountPlanBo bo) { return R.ok(service.queryList(bo)); diff --git a/klp-hrm/src/main/java/com/klp/hrm/controller/HrmLeaveBalanceController.java b/klp-hrm/src/main/java/com/klp/hrm/controller/HrmLeaveBalanceController.java index f1594ed4..40c85870 100644 --- a/klp-hrm/src/main/java/com/klp/hrm/controller/HrmLeaveBalanceController.java +++ b/klp-hrm/src/main/java/com/klp/hrm/controller/HrmLeaveBalanceController.java @@ -27,40 +27,34 @@ public class HrmLeaveBalanceController extends BaseController { private final IHrmLeaveBalanceService service; - @SaCheckPermission("hrm:leavebal:list") @GetMapping("/list") public TableDataInfo list(HrmLeaveBalanceBo bo, PageQuery pageQuery) { return service.queryPageList(bo, pageQuery); } - @SaCheckPermission("hrm:leavebal:query") @GetMapping("/{balId}") public R getInfo(@PathVariable @NotNull Long balId) { return R.ok(service.queryById(balId)); } - @SaCheckPermission("hrm:leavebal:add") @Log(title = "假期余额", businessType = BusinessType.INSERT) @PostMapping public R add(@Validated @RequestBody HrmLeaveBalanceBo bo) { return toAjax(service.insertByBo(bo)); } - @SaCheckPermission("hrm:leavebal:edit") @Log(title = "假期余额", businessType = BusinessType.UPDATE) @PutMapping public R edit(@Validated @RequestBody HrmLeaveBalanceBo bo) { return toAjax(service.updateByBo(bo)); } - @SaCheckPermission("hrm:leavebal:remove") @Log(title = "假期余额", businessType = BusinessType.DELETE) @DeleteMapping("/{balIds}") public R remove(@PathVariable @NotEmpty Long[] balIds) { return toAjax(service.deleteWithValidByIds(Arrays.asList(balIds), true)); } - @SaCheckPermission("hrm:leavebal:list") @GetMapping("/all") public R> all(HrmLeaveBalanceBo bo) { return R.ok(service.queryList(bo)); diff --git a/klp-hrm/src/main/java/com/klp/hrm/controller/HrmLeaveReqController.java b/klp-hrm/src/main/java/com/klp/hrm/controller/HrmLeaveReqController.java index f8b28204..a8f52b5a 100644 --- a/klp-hrm/src/main/java/com/klp/hrm/controller/HrmLeaveReqController.java +++ b/klp-hrm/src/main/java/com/klp/hrm/controller/HrmLeaveReqController.java @@ -27,40 +27,34 @@ public class HrmLeaveReqController extends BaseController { private final IHrmLeaveReqService service; - @SaCheckPermission("hrm:leave:req:list") @GetMapping("/list") public TableDataInfo list(HrmLeaveReqBo bo, PageQuery pageQuery) { return service.queryPageList(bo, pageQuery); } - @SaCheckPermission("hrm:leave:req:query") @GetMapping("/{bizId}") public R getInfo(@PathVariable @NotNull Long bizId) { return R.ok(service.queryById(bizId)); } - @SaCheckPermission("hrm:leave:req:add") @Log(title = "请假单", businessType = BusinessType.INSERT) @PostMapping public R add(@Validated @RequestBody HrmLeaveReqBo bo) { return toAjax(service.insertByBo(bo)); } - @SaCheckPermission("hrm:leave:req:edit") @Log(title = "请假单", businessType = BusinessType.UPDATE) @PutMapping public R edit(@Validated @RequestBody HrmLeaveReqBo bo) { return toAjax(service.updateByBo(bo)); } - @SaCheckPermission("hrm:leave:req:remove") @Log(title = "请假单", businessType = BusinessType.DELETE) @DeleteMapping("/{bizIds}") public R remove(@PathVariable @NotEmpty Long[] bizIds) { return toAjax(service.deleteWithValidByIds(Arrays.asList(bizIds), true)); } - @SaCheckPermission("hrm:leave:req:list") @GetMapping("/all") public R> all(HrmLeaveReqBo bo) { return R.ok(service.queryList(bo)); diff --git a/klp-hrm/src/main/java/com/klp/hrm/controller/HrmOrgController.java b/klp-hrm/src/main/java/com/klp/hrm/controller/HrmOrgController.java deleted file mode 100644 index b65143b4..00000000 --- a/klp-hrm/src/main/java/com/klp/hrm/controller/HrmOrgController.java +++ /dev/null @@ -1,68 +0,0 @@ -package com.klp.hrm.controller; - -import cn.dev33.satoken.annotation.SaCheckPermission; -import com.klp.common.annotation.Log; -import com.klp.common.core.controller.BaseController; -import com.klp.common.core.domain.PageQuery; -import com.klp.common.core.domain.R; -import com.klp.common.core.page.TableDataInfo; -import com.klp.common.enums.BusinessType; -import com.klp.hrm.domain.bo.HrmOrgBo; -import com.klp.hrm.domain.vo.HrmOrgVo; -import com.klp.hrm.service.IHrmOrgService; -import lombok.RequiredArgsConstructor; -import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.*; - -import javax.validation.constraints.NotEmpty; -import javax.validation.constraints.NotNull; -import java.util.Arrays; -import java.util.List; - -@Validated -@RequiredArgsConstructor -@RestController -@RequestMapping("/hrm/org") -public class HrmOrgController extends BaseController { - - private final IHrmOrgService service; - - @SaCheckPermission("hrm:org:list") - @GetMapping("/list") - public TableDataInfo list(HrmOrgBo bo, PageQuery pageQuery) { - return service.queryPageList(bo, pageQuery); - } - - @SaCheckPermission("hrm:org:query") - @GetMapping("/{orgId}") - public R getInfo(@PathVariable @NotNull Long orgId) { - return R.ok(service.queryById(orgId)); - } - - @SaCheckPermission("hrm:org:add") - @Log(title = "组织管理", businessType = BusinessType.INSERT) - @PostMapping - public R add(@Validated @RequestBody HrmOrgBo bo) { - return toAjax(service.insertByBo(bo)); - } - - @SaCheckPermission("hrm:org:edit") - @Log(title = "组织管理", businessType = BusinessType.UPDATE) - @PutMapping - public R edit(@Validated @RequestBody HrmOrgBo bo) { - return toAjax(service.updateByBo(bo)); - } - - @SaCheckPermission("hrm:org:remove") - @Log(title = "组织管理", businessType = BusinessType.DELETE) - @DeleteMapping("/{orgIds}") - public R remove(@PathVariable @NotEmpty Long[] orgIds) { - return toAjax(service.deleteWithValidByIds(Arrays.asList(orgIds), true)); - } - - @SaCheckPermission("hrm:org:list") - @GetMapping("/all") - public R> all(HrmOrgBo bo) { - return R.ok(service.queryList(bo)); - } -} diff --git a/klp-hrm/src/main/java/com/klp/hrm/controller/HrmPositionController.java b/klp-hrm/src/main/java/com/klp/hrm/controller/HrmPositionController.java deleted file mode 100644 index 70054a3f..00000000 --- a/klp-hrm/src/main/java/com/klp/hrm/controller/HrmPositionController.java +++ /dev/null @@ -1,68 +0,0 @@ -package com.klp.hrm.controller; - -import cn.dev33.satoken.annotation.SaCheckPermission; -import com.klp.common.annotation.Log; -import com.klp.common.core.controller.BaseController; -import com.klp.common.core.domain.PageQuery; -import com.klp.common.core.domain.R; -import com.klp.common.core.page.TableDataInfo; -import com.klp.common.enums.BusinessType; -import com.klp.hrm.domain.bo.HrmPositionBo; -import com.klp.hrm.domain.vo.HrmPositionVo; -import com.klp.hrm.service.IHrmPositionService; -import lombok.RequiredArgsConstructor; -import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.*; - -import javax.validation.constraints.NotEmpty; -import javax.validation.constraints.NotNull; -import java.util.Arrays; -import java.util.List; - -@Validated -@RequiredArgsConstructor -@RestController -@RequestMapping("/hrm/position") -public class HrmPositionController extends BaseController { - - private final IHrmPositionService service; - - @SaCheckPermission("hrm:position:list") - @GetMapping("/list") - public TableDataInfo list(HrmPositionBo bo, PageQuery pageQuery) { - return service.queryPageList(bo, pageQuery); - } - - @SaCheckPermission("hrm:position:query") - @GetMapping("/{positionId}") - public R getInfo(@PathVariable @NotNull Long positionId) { - return R.ok(service.queryById(positionId)); - } - - @SaCheckPermission("hrm:position:add") - @Log(title = "岗位管理", businessType = BusinessType.INSERT) - @PostMapping - public R add(@Validated @RequestBody HrmPositionBo bo) { - return toAjax(service.insertByBo(bo)); - } - - @SaCheckPermission("hrm:position:edit") - @Log(title = "岗位管理", businessType = BusinessType.UPDATE) - @PutMapping - public R edit(@Validated @RequestBody HrmPositionBo bo) { - return toAjax(service.updateByBo(bo)); - } - - @SaCheckPermission("hrm:position:remove") - @Log(title = "岗位管理", businessType = BusinessType.DELETE) - @DeleteMapping("/{positionIds}") - public R remove(@PathVariable @NotEmpty Long[] positionIds) { - return toAjax(service.deleteWithValidByIds(Arrays.asList(positionIds), true)); - } - - @SaCheckPermission("hrm:position:list") - @GetMapping("/all") - public R> all(HrmPositionBo bo) { - return R.ok(service.queryList(bo)); - } -} diff --git a/klp-hrm/src/main/java/com/klp/hrm/controller/HrmPunchController.java b/klp-hrm/src/main/java/com/klp/hrm/controller/HrmPunchController.java index 66310b99..f31748e8 100644 --- a/klp-hrm/src/main/java/com/klp/hrm/controller/HrmPunchController.java +++ b/klp-hrm/src/main/java/com/klp/hrm/controller/HrmPunchController.java @@ -27,40 +27,34 @@ public class HrmPunchController extends BaseController { private final IHrmPunchService service; - @SaCheckPermission("hrm:punch:list") @GetMapping("/list") public TableDataInfo list(HrmPunchBo bo, PageQuery pageQuery) { return service.queryPageList(bo, pageQuery); } - @SaCheckPermission("hrm:punch:query") @GetMapping("/{punchId}") public R getInfo(@PathVariable @NotNull Long punchId) { return R.ok(service.queryById(punchId)); } - @SaCheckPermission("hrm:punch:add") @Log(title = "打卡记录", businessType = BusinessType.INSERT) @PostMapping public R add(@Validated @RequestBody HrmPunchBo bo) { return toAjax(service.insertByBo(bo)); } - @SaCheckPermission("hrm:punch:edit") @Log(title = "打卡记录", businessType = BusinessType.UPDATE) @PutMapping public R edit(@Validated @RequestBody HrmPunchBo bo) { return toAjax(service.updateByBo(bo)); } - @SaCheckPermission("hrm:punch:remove") @Log(title = "打卡记录", businessType = BusinessType.DELETE) @DeleteMapping("/{punchIds}") public R remove(@PathVariable @NotEmpty Long[] punchIds) { return toAjax(service.deleteWithValidByIds(Arrays.asList(punchIds), true)); } - @SaCheckPermission("hrm:punch:list") @GetMapping("/all") public R> all(HrmPunchBo bo) { return R.ok(service.queryList(bo)); diff --git a/klp-hrm/src/main/java/com/klp/hrm/controller/HrmOvertimeReqController.java b/klp-hrm/src/main/java/com/klp/hrm/controller/HrmReimburseReqController.java similarity index 57% rename from klp-hrm/src/main/java/com/klp/hrm/controller/HrmOvertimeReqController.java rename to klp-hrm/src/main/java/com/klp/hrm/controller/HrmReimburseReqController.java index 8a8c052a..abbca9b2 100644 --- a/klp-hrm/src/main/java/com/klp/hrm/controller/HrmOvertimeReqController.java +++ b/klp-hrm/src/main/java/com/klp/hrm/controller/HrmReimburseReqController.java @@ -6,9 +6,9 @@ import com.klp.common.core.domain.PageQuery; import com.klp.common.core.domain.R; import com.klp.common.core.page.TableDataInfo; import com.klp.common.enums.BusinessType; -import com.klp.hrm.domain.bo.HrmOvertimeReqBo; -import com.klp.hrm.domain.vo.HrmOvertimeReqVo; -import com.klp.hrm.service.IHrmOvertimeReqService; +import com.klp.hrm.domain.bo.HrmReimburseReqBo; +import com.klp.hrm.domain.vo.HrmReimburseReqVo; +import com.klp.hrm.service.IHrmReimburseReqService; import lombok.RequiredArgsConstructor; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; @@ -19,46 +19,47 @@ import java.util.Arrays; import java.util.List; /** - * 加班单(按用户要求:不做鉴权) + * 日常报销申请 */ @Validated @RequiredArgsConstructor @RestController -@RequestMapping("/hrm/overtime") -public class HrmOvertimeReqController extends BaseController { +@RequestMapping("/hrm/reimburse") +public class HrmReimburseReqController extends BaseController { - private final IHrmOvertimeReqService service; + private final IHrmReimburseReqService service; @GetMapping("/list") - public TableDataInfo list(HrmOvertimeReqBo bo, PageQuery pageQuery) { + public TableDataInfo list(HrmReimburseReqBo bo, PageQuery pageQuery) { return service.queryPageList(bo, pageQuery); } @GetMapping("/{bizId}") - public R getInfo(@PathVariable @NotNull Long bizId) { + public R getInfo(@PathVariable @NotNull Long bizId) { return R.ok(service.queryById(bizId)); } - @Log(title = "加班单", businessType = BusinessType.INSERT) + @Log(title = "日常报销单", businessType = BusinessType.INSERT) @PostMapping - public R add(@Validated @RequestBody HrmOvertimeReqBo bo) { + public R add(@Validated @RequestBody HrmReimburseReqBo bo) { return toAjax(service.insertByBo(bo)); } - @Log(title = "加班单", businessType = BusinessType.UPDATE) + @Log(title = "日常报销单", businessType = BusinessType.UPDATE) @PutMapping - public R edit(@Validated @RequestBody HrmOvertimeReqBo bo) { + public R edit(@Validated @RequestBody HrmReimburseReqBo bo) { return toAjax(service.updateByBo(bo)); } - @Log(title = "加班单", businessType = BusinessType.DELETE) + @Log(title = "日常报销单", businessType = BusinessType.DELETE) @DeleteMapping("/{bizIds}") public R remove(@PathVariable @NotEmpty Long[] bizIds) { return toAjax(service.deleteWithValidByIds(Arrays.asList(bizIds), true)); } @GetMapping("/all") - public R> all(HrmOvertimeReqBo bo) { + public R> all(HrmReimburseReqBo bo) { return R.ok(service.queryList(bo)); } } + diff --git a/klp-hrm/src/main/java/com/klp/hrm/controller/HrmScheduleController.java b/klp-hrm/src/main/java/com/klp/hrm/controller/HrmScheduleController.java index 6c2300e2..16f111ca 100644 --- a/klp-hrm/src/main/java/com/klp/hrm/controller/HrmScheduleController.java +++ b/klp-hrm/src/main/java/com/klp/hrm/controller/HrmScheduleController.java @@ -27,40 +27,34 @@ public class HrmScheduleController extends BaseController { private final IHrmScheduleService service; - @SaCheckPermission("hrm:schedule:list") @GetMapping("/list") public TableDataInfo list(HrmScheduleBo bo, PageQuery pageQuery) { return service.queryPageList(bo, pageQuery); } - @SaCheckPermission("hrm:schedule:query") @GetMapping("/{schedId}") public R getInfo(@PathVariable @NotNull Long schedId) { return R.ok(service.queryById(schedId)); } - @SaCheckPermission("hrm:schedule:add") @Log(title = "排班", businessType = BusinessType.INSERT) @PostMapping public R add(@Validated @RequestBody HrmScheduleBo bo) { return toAjax(service.insertByBo(bo)); } - @SaCheckPermission("hrm:schedule:edit") @Log(title = "排班", businessType = BusinessType.UPDATE) @PutMapping public R edit(@Validated @RequestBody HrmScheduleBo bo) { return toAjax(service.updateByBo(bo)); } - @SaCheckPermission("hrm:schedule:remove") @Log(title = "排班", businessType = BusinessType.DELETE) @DeleteMapping("/{schedIds}") public R remove(@PathVariable @NotEmpty Long[] schedIds) { return toAjax(service.deleteWithValidByIds(Arrays.asList(schedIds), true)); } - @SaCheckPermission("hrm:schedule:list") @GetMapping("/all") public R> all(HrmScheduleBo bo) { return R.ok(service.queryList(bo)); diff --git a/klp-hrm/src/main/java/com/klp/hrm/controller/HrmSealReqController.java b/klp-hrm/src/main/java/com/klp/hrm/controller/HrmSealReqController.java index 62573db8..14225d3d 100644 --- a/klp-hrm/src/main/java/com/klp/hrm/controller/HrmSealReqController.java +++ b/klp-hrm/src/main/java/com/klp/hrm/controller/HrmSealReqController.java @@ -12,6 +12,7 @@ import com.klp.hrm.domain.bo.HrmSealStampBo; import com.klp.hrm.domain.vo.HrmSealReqVo; import com.klp.hrm.service.IHrmSealReqService; import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; @@ -21,6 +22,7 @@ import javax.validation.constraints.NotNull; /** * 用印申请 */ +@Slf4j @Validated @RequiredArgsConstructor @RestController @@ -29,68 +31,65 @@ public class HrmSealReqController extends BaseController { private final IHrmSealReqService service; - @SaCheckPermission("hrm:seal:list") @GetMapping("/list") public TableDataInfo list(HrmSealReqBo bo, PageQuery pageQuery) { return service.queryPageList(bo, pageQuery); } - @SaCheckPermission("hrm:seal:query") @GetMapping("/{bizId}") public R getInfo(@PathVariable @NotNull Long bizId) { return R.ok(service.queryById(bizId)); } - @SaCheckPermission("hrm:seal:add") @Log(title = "用印申请", businessType = BusinessType.INSERT) @PostMapping public R add(@Validated @RequestBody HrmSealReqBo bo) { return toAjax(service.insertByBo(bo)); } - @SaCheckPermission("hrm:seal:edit") @Log(title = "用印申请", businessType = BusinessType.UPDATE) @PutMapping public R edit(@Validated @RequestBody HrmSealReqBo bo) { return toAjax(service.updateByBo(bo)); } - @SaCheckPermission("hrm:seal:remove") @Log(title = "用印申请", businessType = BusinessType.DELETE) @DeleteMapping("/{bizIds}") public R remove(@PathVariable @NotEmpty Long[] bizIds) { return toAjax(service.deleteWithValidByIds(java.util.Arrays.asList(bizIds), true)); } - @SaCheckPermission("hrm:seal:approve") @Log(title = "用印申请", businessType = BusinessType.UPDATE) @PostMapping("/{bizId}/approve") public R approve(@PathVariable @NotNull Long bizId) { return toAjax(service.updateStatus(bizId, "approved")); } - @SaCheckPermission("hrm:seal:reject") @Log(title = "用印申请", businessType = BusinessType.UPDATE) @PostMapping("/{bizId}/reject") public R reject(@PathVariable @NotNull Long bizId) { return toAjax(service.updateStatus(bizId, "rejected")); } - @SaCheckPermission("hrm:seal:cancel") @Log(title = "用印申请", businessType = BusinessType.UPDATE) @PostMapping("/{bizId}/cancel") public R cancel(@PathVariable @NotNull Long bizId) { return toAjax(service.updateStatus(bizId, "canceled")); } - @SaCheckPermission("hrm:seal:stamp") @Log(title = "用印盖章(Java)", businessType = BusinessType.UPDATE) @PostMapping("/{bizId}/stamp/java") public R stampJava(@PathVariable @NotNull Long bizId, @Validated @RequestBody HrmSealStampBo bo) { + // 添加日志,检查接收到的数据 + log.info("收到盖章请求 - bizId: {}, yPx: {}, xPx: {}, pageNo: {}, yPx类型: {}", + bizId, bo.getYPx(), bo.getXPx(), bo.getPageNo(), + bo.getYPx() != null ? bo.getYPx().getClass().getName() : "null"); + if (bo.getYPx() == null) { + log.error("yPx 为 null!接收到的 bo 对象: {}", bo); + } return R.ok(service.stampWithJava(bizId, bo)); } - @SaCheckPermission("hrm:seal:stamp") @Log(title = "用印盖章(Python)", businessType = BusinessType.UPDATE) @PostMapping("/{bizId}/stamp/python") public R stampPython(@PathVariable @NotNull Long bizId, @Validated @RequestBody HrmSealStampBo bo) { diff --git a/klp-hrm/src/main/java/com/klp/hrm/controller/HrmShiftController.java b/klp-hrm/src/main/java/com/klp/hrm/controller/HrmShiftController.java index 39820db9..945c8e94 100644 --- a/klp-hrm/src/main/java/com/klp/hrm/controller/HrmShiftController.java +++ b/klp-hrm/src/main/java/com/klp/hrm/controller/HrmShiftController.java @@ -27,40 +27,34 @@ public class HrmShiftController extends BaseController { private final IHrmShiftService service; - @SaCheckPermission("hrm:shift:list") @GetMapping("/list") public TableDataInfo list(HrmShiftBo bo, PageQuery pageQuery) { return service.queryPageList(bo, pageQuery); } - @SaCheckPermission("hrm:shift:query") @GetMapping("/{shiftId}") public R getInfo(@PathVariable @NotNull Long shiftId) { return R.ok(service.queryById(shiftId)); } - @SaCheckPermission("hrm:shift:add") @Log(title = "班次", businessType = BusinessType.INSERT) @PostMapping public R add(@Validated @RequestBody HrmShiftBo bo) { return toAjax(service.insertByBo(bo)); } - @SaCheckPermission("hrm:shift:edit") @Log(title = "班次", businessType = BusinessType.UPDATE) @PutMapping public R edit(@Validated @RequestBody HrmShiftBo bo) { return toAjax(service.updateByBo(bo)); } - @SaCheckPermission("hrm:shift:remove") @Log(title = "班次", businessType = BusinessType.DELETE) @DeleteMapping("/{shiftIds}") public R remove(@PathVariable @NotEmpty Long[] shiftIds) { return toAjax(service.deleteWithValidByIds(Arrays.asList(shiftIds), true)); } - @SaCheckPermission("hrm:shift:list") @GetMapping("/all") public R> all(HrmShiftBo bo) { return R.ok(service.queryList(bo)); diff --git a/klp-hrm/src/main/java/com/klp/hrm/domain/HrmEmpOrgPosition.java b/klp-hrm/src/main/java/com/klp/hrm/domain/HrmEmpOrgPosition.java index 0a07441c..4dbc47fe 100644 --- a/klp-hrm/src/main/java/com/klp/hrm/domain/HrmEmpOrgPosition.java +++ b/klp-hrm/src/main/java/com/klp/hrm/domain/HrmEmpOrgPosition.java @@ -22,8 +22,10 @@ public class HrmEmpOrgPosition extends BaseEntity implements Serializable { @TableId private Long relId; private Long empId; - private Long orgId; - private Long positionId; + /** 部门ID(引用 sys_dept.dept_id) */ + private Long deptId; + /** 岗位ID(引用 sys_post.post_id) */ + private Long postId; private Integer isPrimary; private Date startDate; private Date endDate; diff --git a/klp-hrm/src/main/java/com/klp/hrm/domain/HrmEmployee.java b/klp-hrm/src/main/java/com/klp/hrm/domain/HrmEmployee.java index 878bb753..49036b25 100644 --- a/klp-hrm/src/main/java/com/klp/hrm/domain/HrmEmployee.java +++ b/klp-hrm/src/main/java/com/klp/hrm/domain/HrmEmployee.java @@ -32,9 +32,10 @@ public class HrmEmployee extends BaseEntity implements Serializable { private Date hireDate; private String employmentType; private String status; - private Long gradeId; - private Long mainOrgId; - private Long mainPositionId; + /** 主部门ID(引用 sys_dept.dept_id) */ + private Long deptId; + /** 主岗位ID(引用 sys_post.post_id) */ + private Long postId; private BigDecimal seniorityYears; private Date contractEndDate; private String remark; diff --git a/klp-hrm/src/main/java/com/klp/hrm/domain/HrmFlowCc.java b/klp-hrm/src/main/java/com/klp/hrm/domain/HrmFlowCc.java new file mode 100644 index 00000000..cc348ff1 --- /dev/null +++ b/klp-hrm/src/main/java/com/klp/hrm/domain/HrmFlowCc.java @@ -0,0 +1,46 @@ +package com.klp.hrm.domain; + +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableLogic; +import com.baomidou.mybatisplus.annotation.TableName; +import com.klp.common.core.domain.BaseEntity; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * 抄送记录 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("hrm_flow_cc") +public class HrmFlowCc extends BaseEntity { + + @TableId + private Long ccId; + + private Long instId; + + private String bizType; + + private Long bizId; + + private Long nodeId; + + /** 触发抄送的节点名称(可读名) */ + private String nodeName; + + /** 是否已读 0未读 1已读 */ + private Integer readFlag; + + /** 被抄送的用户ID */ + private Long ccUserId; + + /** 触发抄送的操作人(一般为当前审批人) */ + private Long fromUserId; + + private String remark; + + @TableLogic + private Integer delFlag; +} + diff --git a/klp-hrm/src/main/java/com/klp/hrm/domain/HrmFlowTask.java b/klp-hrm/src/main/java/com/klp/hrm/domain/HrmFlowTask.java index f5dadaaa..6faa5a04 100644 --- a/klp-hrm/src/main/java/com/klp/hrm/domain/HrmFlowTask.java +++ b/klp-hrm/src/main/java/com/klp/hrm/domain/HrmFlowTask.java @@ -24,6 +24,13 @@ public class HrmFlowTask extends BaseEntity implements Serializable { private String status; private Date expireTime; private String remark; + + /** 业务类型:leave/travel/seal */ + private String bizType; + + /** 业务ID:对应请假/出差/用印的 bizId */ + private Long bizId; + @TableLogic private Integer delFlag; } diff --git a/klp-hrm/src/main/java/com/klp/hrm/domain/HrmGrade.java b/klp-hrm/src/main/java/com/klp/hrm/domain/HrmGrade.java deleted file mode 100644 index 45702125..00000000 --- a/klp-hrm/src/main/java/com/klp/hrm/domain/HrmGrade.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.klp.hrm.domain; - -import com.baomidou.mybatisplus.annotation.TableId; -import com.baomidou.mybatisplus.annotation.TableLogic; -import com.baomidou.mybatisplus.annotation.TableName; -import com.klp.common.core.domain.BaseEntity; -import lombok.Data; -import lombok.EqualsAndHashCode; - -import java.io.Serializable; - -/** - * 职级 - */ -@Data -@EqualsAndHashCode(callSuper = true) -@TableName("hrm_grade") -public class HrmGrade extends BaseEntity implements Serializable { - private static final long serialVersionUID = 1L; - - @TableId - private Long gradeId; - private String gradeCode; - private String gradeName; - private Integer levelNo; - private String remark; - @TableLogic - private Integer delFlag; -} diff --git a/klp-hrm/src/main/java/com/klp/hrm/domain/HrmHeadcountPlan.java b/klp-hrm/src/main/java/com/klp/hrm/domain/HrmHeadcountPlan.java index a49d3740..d3dae39c 100644 --- a/klp-hrm/src/main/java/com/klp/hrm/domain/HrmHeadcountPlan.java +++ b/klp-hrm/src/main/java/com/klp/hrm/domain/HrmHeadcountPlan.java @@ -20,8 +20,10 @@ public class HrmHeadcountPlan extends BaseEntity implements Serializable { @TableId private Long planId; - private Long orgId; - private Long positionId; + /** 部门ID(引用 sys_dept.dept_id) */ + private Long deptId; + /** 岗位ID(引用 sys_post.post_id) */ + private Long postId; private Integer year; private Integer month; private Integer budgetCount; diff --git a/klp-hrm/src/main/java/com/klp/hrm/domain/HrmOrg.java b/klp-hrm/src/main/java/com/klp/hrm/domain/HrmOrg.java deleted file mode 100644 index d41d9917..00000000 --- a/klp-hrm/src/main/java/com/klp/hrm/domain/HrmOrg.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.klp.hrm.domain; - -import com.baomidou.mybatisplus.annotation.TableId; -import com.baomidou.mybatisplus.annotation.TableLogic; -import com.baomidou.mybatisplus.annotation.TableName; -import com.klp.common.core.domain.BaseEntity; -import lombok.Data; -import lombok.EqualsAndHashCode; - -import java.io.Serializable; - -/** - * 组织/部门/班组 - */ -@Data -@EqualsAndHashCode(callSuper = true) -@TableName("hrm_org") -public class HrmOrg extends BaseEntity implements Serializable { - private static final long serialVersionUID = 1L; - - @TableId - private Long orgId; - private Long parentId; - private String orgCode; - private String orgName; - private String orgType; - private Long leaderUserId; - private Integer orderNum; - private Integer status; - private String remark; - @TableLogic - private Integer delFlag; -} diff --git a/klp-hrm/src/main/java/com/klp/hrm/domain/HrmPosition.java b/klp-hrm/src/main/java/com/klp/hrm/domain/HrmPosition.java deleted file mode 100644 index 6104eb5e..00000000 --- a/klp-hrm/src/main/java/com/klp/hrm/domain/HrmPosition.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.klp.hrm.domain; - -import com.baomidou.mybatisplus.annotation.TableId; -import com.baomidou.mybatisplus.annotation.TableLogic; -import com.baomidou.mybatisplus.annotation.TableName; -import com.klp.common.core.domain.BaseEntity; -import lombok.Data; -import lombok.EqualsAndHashCode; - -import java.io.Serializable; - -/** - * 岗位 - */ -@Data -@EqualsAndHashCode(callSuper = true) -@TableName("hrm_position") -public class HrmPosition extends BaseEntity implements Serializable { - private static final long serialVersionUID = 1L; - - @TableId - private Long positionId; - private String positionCode; - private String positionName; - private Long gradeId; - private Integer orderNum; - private Integer status; - private String remark; - @TableLogic - private Integer delFlag; -} diff --git a/klp-hrm/src/main/java/com/klp/hrm/domain/HrmOvertimeReq.java b/klp-hrm/src/main/java/com/klp/hrm/domain/HrmReimburseReq.java similarity index 64% rename from klp-hrm/src/main/java/com/klp/hrm/domain/HrmOvertimeReq.java rename to klp-hrm/src/main/java/com/klp/hrm/domain/HrmReimburseReq.java index 4f76082f..4135e9e8 100644 --- a/klp-hrm/src/main/java/com/klp/hrm/domain/HrmOvertimeReq.java +++ b/klp-hrm/src/main/java/com/klp/hrm/domain/HrmReimburseReq.java @@ -7,27 +7,33 @@ import com.klp.common.core.domain.BaseEntity; import lombok.Data; import lombok.EqualsAndHashCode; -import java.io.Serializable; -import java.util.Date; +import java.math.BigDecimal; @Data @EqualsAndHashCode(callSuper = true) -@TableName("hrm_overtime_req") -public class HrmOvertimeReq extends BaseEntity implements Serializable { - private static final long serialVersionUID = 1L; +@TableName("hrm_reimburse_req") +public class HrmReimburseReq extends BaseEntity { @TableId private Long bizId; + private Long empId; - private String otType; - private Date startTime; - private Date endTime; - private java.math.BigDecimal hours; + + private String reimburseType; + + private BigDecimal totalAmount; + private String reason; + private String status; + private String accessoryApplyIds; + private String accessoryReceiptIds; + private String remark; + @TableLogic private Integer delFlag; } + diff --git a/klp-hrm/src/main/java/com/klp/hrm/domain/HrmTravelReq.java b/klp-hrm/src/main/java/com/klp/hrm/domain/HrmTravelReq.java index 2d34695e..c3df2dbe 100644 --- a/klp-hrm/src/main/java/com/klp/hrm/domain/HrmTravelReq.java +++ b/klp-hrm/src/main/java/com/klp/hrm/domain/HrmTravelReq.java @@ -7,13 +7,12 @@ import com.klp.common.core.domain.BaseEntity; import lombok.Data; import lombok.EqualsAndHashCode; -import java.io.Serializable; import java.util.Date; @Data @EqualsAndHashCode(callSuper = true) @TableName("hrm_travel_req") -public class HrmTravelReq extends BaseEntity implements Serializable { +public class HrmTravelReq extends BaseEntity { private static final long serialVersionUID = 1L; @TableId @@ -21,11 +20,16 @@ public class HrmTravelReq extends BaseEntity implements Serializable { private Long empId; private Date startTime; private Date endTime; + private String travelType; private String destination; private String reason; private String status; private String accessoryApplyIds; private String accessoryReceiptIds; + private String payeeName; + private Double estimatedCost; + private String bankName; + private String bankAccount; private String remark; @TableLogic private Integer delFlag; diff --git a/klp-hrm/src/main/java/com/klp/hrm/domain/bo/HrmEmpOrgPositionBo.java b/klp-hrm/src/main/java/com/klp/hrm/domain/bo/HrmEmpOrgPositionBo.java index f6959937..f2e73225 100644 --- a/klp-hrm/src/main/java/com/klp/hrm/domain/bo/HrmEmpOrgPositionBo.java +++ b/klp-hrm/src/main/java/com/klp/hrm/domain/bo/HrmEmpOrgPositionBo.java @@ -16,11 +16,13 @@ public class HrmEmpOrgPositionBo extends BaseEntity { @NotNull(message = "员工不能为空") private Long empId; - @NotNull(message = "组织不能为空") - private Long orgId; + @NotNull(message = "部门不能为空") + /** 部门ID(引用 sys_dept.dept_id) */ + private Long deptId; @NotNull(message = "岗位不能为空") - private Long positionId; + /** 岗位ID(引用 sys_post.post_id) */ + private Long postId; private Integer isPrimary; diff --git a/klp-hrm/src/main/java/com/klp/hrm/domain/bo/HrmEmployeeBo.java b/klp-hrm/src/main/java/com/klp/hrm/domain/bo/HrmEmployeeBo.java index 62aed66c..a366d671 100644 --- a/klp-hrm/src/main/java/com/klp/hrm/domain/bo/HrmEmployeeBo.java +++ b/klp-hrm/src/main/java/com/klp/hrm/domain/bo/HrmEmployeeBo.java @@ -39,11 +39,11 @@ public class HrmEmployeeBo extends BaseEntity { private String status; - private Long gradeId; + /** 主部门ID(引用 sys_dept.dept_id) */ + private Long deptId; - private Long mainOrgId; - - private Long mainPositionId; + /** 主岗位ID(引用 sys_post.post_id) */ + private Long postId; private String remark; } diff --git a/klp-hrm/src/main/java/com/klp/hrm/domain/bo/HrmFlowCcBo.java b/klp-hrm/src/main/java/com/klp/hrm/domain/bo/HrmFlowCcBo.java new file mode 100644 index 00000000..e5909667 --- /dev/null +++ b/klp-hrm/src/main/java/com/klp/hrm/domain/bo/HrmFlowCcBo.java @@ -0,0 +1,33 @@ +package com.klp.hrm.domain.bo; + +import com.klp.common.core.domain.BaseEntity; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.util.List; + +@Data +@EqualsAndHashCode(callSuper = true) +public class HrmFlowCcBo extends BaseEntity { + private Long ccId; + private Long instId; + private String bizType; + private Long bizId; + + /** 业务类型名称(列表展示用,可选条件) */ + private String bizTypeName; + + /** 业务标题/摘要(列表展示用,可选条件) */ + private String bizTitle; + private Long nodeId; + private String nodeName; + private Integer readFlag; + private Long ccUserId; + + /** 手动抄送:支持批量被抄送用户 */ + private List ccUserIds; + + private Long fromUserId; + private String remark; +} + diff --git a/klp-hrm/src/main/java/com/klp/hrm/domain/bo/HrmFlowStartBo.java b/klp-hrm/src/main/java/com/klp/hrm/domain/bo/HrmFlowStartBo.java index c0466fbc..cce3d6a9 100644 --- a/klp-hrm/src/main/java/com/klp/hrm/domain/bo/HrmFlowStartBo.java +++ b/klp-hrm/src/main/java/com/klp/hrm/domain/bo/HrmFlowStartBo.java @@ -7,12 +7,19 @@ import javax.validation.constraints.NotNull; @Data public class HrmFlowStartBo { - @NotNull(message = "模板ID不能为空") + // 模板ID:存在则按模板启动;为空则走“自选审批人一次性审批” private Long tplId; + + // 无模板时:自选审批人 userId(一次性审批,审批完成即结束流程) + private Long manualAssigneeUserId; + @NotBlank(message = "业务类型不能为空") private String bizType; + @NotNull(message = "业务ID不能为空") private Long bizId; + private Long startUserId; + private String contentJson; } diff --git a/klp-hrm/src/main/java/com/klp/hrm/domain/bo/HrmFlowTaskApproveBo.java b/klp-hrm/src/main/java/com/klp/hrm/domain/bo/HrmFlowTaskApproveBo.java new file mode 100644 index 00000000..8e2e48e2 --- /dev/null +++ b/klp-hrm/src/main/java/com/klp/hrm/domain/bo/HrmFlowTaskApproveBo.java @@ -0,0 +1,17 @@ +package com.klp.hrm.domain.bo; + +import lombok.Data; + +/** + * 流程任务审批请求体 + */ +@Data +public class HrmFlowTaskApproveBo { + + /** 审批意见 */ + private String remark; + + /** 盖章参数(仅用于用印业务) */ + private HrmSealStampBo stampBo; +} + diff --git a/klp-hrm/src/main/java/com/klp/hrm/domain/bo/HrmFlowTaskBo.java b/klp-hrm/src/main/java/com/klp/hrm/domain/bo/HrmFlowTaskBo.java index 19da50b2..cfee0b54 100644 --- a/klp-hrm/src/main/java/com/klp/hrm/domain/bo/HrmFlowTaskBo.java +++ b/klp-hrm/src/main/java/com/klp/hrm/domain/bo/HrmFlowTaskBo.java @@ -20,4 +20,10 @@ public class HrmFlowTaskBo extends BaseEntity { private String status; private Date expireTime; private String remark; + + /** 业务类型:leave/travel/seal */ + private String bizType; + + /** 业务ID:对应请假/出差/用印的 bizId */ + private Long bizId; } diff --git a/klp-hrm/src/main/java/com/klp/hrm/domain/bo/HrmGradeBo.java b/klp-hrm/src/main/java/com/klp/hrm/domain/bo/HrmGradeBo.java deleted file mode 100644 index 61d698ad..00000000 --- a/klp-hrm/src/main/java/com/klp/hrm/domain/bo/HrmGradeBo.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.klp.hrm.domain.bo; - -import com.klp.common.core.domain.BaseEntity; -import lombok.Data; -import lombok.EqualsAndHashCode; - -import javax.validation.constraints.NotBlank; - -@Data -@EqualsAndHashCode(callSuper = true) -public class HrmGradeBo extends BaseEntity { - - private Long gradeId; - - @NotBlank(message = "职级编码不能为空") - private String gradeCode; - - @NotBlank(message = "职级名称不能为空") - private String gradeName; - - private Integer levelNo; - - private String remark; -} diff --git a/klp-hrm/src/main/java/com/klp/hrm/domain/bo/HrmHeadcountPlanBo.java b/klp-hrm/src/main/java/com/klp/hrm/domain/bo/HrmHeadcountPlanBo.java index fa020a84..5cdb9ac6 100644 --- a/klp-hrm/src/main/java/com/klp/hrm/domain/bo/HrmHeadcountPlanBo.java +++ b/klp-hrm/src/main/java/com/klp/hrm/domain/bo/HrmHeadcountPlanBo.java @@ -12,11 +12,13 @@ public class HrmHeadcountPlanBo extends BaseEntity { private Long planId; - @NotNull(message = "组织不能为空") - private Long orgId; + @NotNull(message = "部门不能为空") + /** 部门ID(引用 sys_dept.dept_id) */ + private Long deptId; @NotNull(message = "岗位不能为空") - private Long positionId; + /** 岗位ID(引用 sys_post.post_id) */ + private Long postId; @NotNull(message = "年份不能为空") private Integer year; diff --git a/klp-hrm/src/main/java/com/klp/hrm/domain/bo/HrmLeaveReqBo.java b/klp-hrm/src/main/java/com/klp/hrm/domain/bo/HrmLeaveReqBo.java index d641518a..f1f4d96f 100644 --- a/klp-hrm/src/main/java/com/klp/hrm/domain/bo/HrmLeaveReqBo.java +++ b/klp-hrm/src/main/java/com/klp/hrm/domain/bo/HrmLeaveReqBo.java @@ -1,5 +1,6 @@ package com.klp.hrm.domain.bo; +import com.fasterxml.jackson.annotation.JsonFormat; import com.klp.common.core.domain.BaseEntity; import lombok.Data; import lombok.EqualsAndHashCode; @@ -21,9 +22,11 @@ public class HrmLeaveReqBo extends BaseEntity { private String leaveType; @NotNull(message = "开始时间不能为空") + @JsonFormat(pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSX", timezone = "GMT+8") private Date startTime; @NotNull(message = "结束时间不能为空") + @JsonFormat(pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSX", timezone = "GMT+8") private Date endTime; @NotNull(message = "时长不能为空") @@ -31,6 +34,18 @@ public class HrmLeaveReqBo extends BaseEntity { private String reason; private String status; + + /** + * 流程模板ID(前端选择模板流程时传入)。 + * + * 不传则后端按 bizType 自动选择启用的最新版本模板; + * 若也未配置模板,则可通过 manualAssigneeUserId 走一次性审批。 + */ + private Long tplId; + + // 无模板时,自选审批人 userId + private Long manualAssigneeUserId; + private String accessoryApplyIds; private String accessoryReceiptIds; private String remark; diff --git a/klp-hrm/src/main/java/com/klp/hrm/domain/bo/HrmOrgBo.java b/klp-hrm/src/main/java/com/klp/hrm/domain/bo/HrmOrgBo.java deleted file mode 100644 index c1a53d5f..00000000 --- a/klp-hrm/src/main/java/com/klp/hrm/domain/bo/HrmOrgBo.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.klp.hrm.domain.bo; - -import com.klp.common.core.domain.BaseEntity; -import lombok.Data; -import lombok.EqualsAndHashCode; - -import javax.validation.constraints.NotBlank; -import javax.validation.constraints.NotNull; - -/** - * 组织 Bo - */ -@Data -@EqualsAndHashCode(callSuper = true) -public class HrmOrgBo extends BaseEntity { - - /** 组织ID */ - private Long orgId; - - /** 父级组织ID */ - private Long parentId; - - @NotBlank(message = "组织编码不能为空") - private String orgCode; - - @NotBlank(message = "组织名称不能为空") - private String orgName; - - @NotBlank(message = "组织类型不能为空") - private String orgType; - - private Long leaderUserId; - - private Integer orderNum; - - private Integer status; - - private String remark; -} diff --git a/klp-hrm/src/main/java/com/klp/hrm/domain/bo/HrmPositionBo.java b/klp-hrm/src/main/java/com/klp/hrm/domain/bo/HrmPositionBo.java deleted file mode 100644 index aa2e1c28..00000000 --- a/klp-hrm/src/main/java/com/klp/hrm/domain/bo/HrmPositionBo.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.klp.hrm.domain.bo; - -import com.klp.common.core.domain.BaseEntity; -import lombok.Data; -import lombok.EqualsAndHashCode; - -import javax.validation.constraints.NotBlank; - -@Data -@EqualsAndHashCode(callSuper = true) -public class HrmPositionBo extends BaseEntity { - - private Long positionId; - - @NotBlank(message = "岗位编码不能为空") - private String positionCode; - - @NotBlank(message = "岗位名称不能为空") - private String positionName; - - private Long gradeId; - - private Integer orderNum; - - private Integer status; - - private String remark; -} diff --git a/klp-hrm/src/main/java/com/klp/hrm/domain/bo/HrmOvertimeReqBo.java b/klp-hrm/src/main/java/com/klp/hrm/domain/bo/HrmReimburseReqBo.java similarity index 55% rename from klp-hrm/src/main/java/com/klp/hrm/domain/bo/HrmOvertimeReqBo.java rename to klp-hrm/src/main/java/com/klp/hrm/domain/bo/HrmReimburseReqBo.java index 00711450..264b2a13 100644 --- a/klp-hrm/src/main/java/com/klp/hrm/domain/bo/HrmOvertimeReqBo.java +++ b/klp-hrm/src/main/java/com/klp/hrm/domain/bo/HrmReimburseReqBo.java @@ -5,31 +5,35 @@ import lombok.Data; import lombok.EqualsAndHashCode; import javax.validation.constraints.NotNull; -import java.util.Date; +import java.math.BigDecimal; @Data @EqualsAndHashCode(callSuper = true) -public class HrmOvertimeReqBo extends BaseEntity { +public class HrmReimburseReqBo extends BaseEntity { private Long bizId; @NotNull(message = "员工ID不能为空") private Long empId; - private String otType; + private String reimburseType; - @NotNull(message = "开始时间不能为空") - private Date startTime; - - @NotNull(message = "结束时间不能为空") - private Date endTime; - - @NotNull(message = "时长不能为空") - private java.math.BigDecimal hours; + @NotNull(message = "报销总金额不能为空") + private BigDecimal totalAmount; private String reason; + private String status; + + // 无模板时,自选审批人 userId + private Long manualAssigneeUserId; + + /** 报销单据附件oss_id列表(CSV) */ private String accessoryApplyIds; + + /** 回执附件oss_id列表(CSV) */ private String accessoryReceiptIds; + private String remark; } + diff --git a/klp-hrm/src/main/java/com/klp/hrm/domain/bo/HrmSealReqBo.java b/klp-hrm/src/main/java/com/klp/hrm/domain/bo/HrmSealReqBo.java index d6aae649..c425a6bd 100644 --- a/klp-hrm/src/main/java/com/klp/hrm/domain/bo/HrmSealReqBo.java +++ b/klp-hrm/src/main/java/com/klp/hrm/domain/bo/HrmSealReqBo.java @@ -40,9 +40,20 @@ public class HrmSealReqBo extends BaseEntity { /** 状态 draft/running/approved/rejected/canceled */ private String status; - /** 关联流程模板ID(提交时可选,存在则自动发起审批) */ + /** 关联流程模板ID(旧字段,兼容历史前端/代码) */ private Long flowTplId; + /** + * 流程模板ID(新字段,前端选择模板流程时传入)。 + * 优先级高于 flowTplId。 + */ + private Long tplId; + + /** + * 手动选择的审批人ID(前端选择手动审批时传入)。 + */ + private Long manualAssigneeUserId; + /** 流程发起人ID(可选,不填可由服务侧取当前登录人) */ private Long startUserId; diff --git a/klp-hrm/src/main/java/com/klp/hrm/domain/bo/HrmSealStampBo.java b/klp-hrm/src/main/java/com/klp/hrm/domain/bo/HrmSealStampBo.java index 4890f7ae..d4ab6a76 100644 --- a/klp-hrm/src/main/java/com/klp/hrm/domain/bo/HrmSealStampBo.java +++ b/klp-hrm/src/main/java/com/klp/hrm/domain/bo/HrmSealStampBo.java @@ -1,6 +1,13 @@ package com.klp.hrm.domain.bo; -import lombok.Data; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonSetter; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; import javax.validation.constraints.Min; import javax.validation.constraints.NotBlank; @@ -9,37 +16,83 @@ import javax.validation.constraints.NotNull; /** * 盖章命令(Java/Python 坐标统一使用 px) */ -@Data +@Getter +@Setter +@Builder +@NoArgsConstructor +@AllArgsConstructor +@JsonInclude(JsonInclude.Include.ALWAYS) public class HrmSealStampBo { /** 待盖章 PDF 的 OSS 完整 URL */ @NotBlank(message = "待盖章文件地址不能为空") + @JsonProperty("targetFileUrl") private String targetFileUrl; /** 章图片 OSS 完整 URL(透明 PNG/JPG) */ @NotBlank(message = "章图片地址不能为空") + @JsonProperty("stampImageUrl") private String stampImageUrl; /** 页码(从1开始) */ @NotNull @Min(1) + @JsonProperty("pageNo") private Integer pageNo; /** 左下角 X 坐标(px) */ @NotNull @Min(0) + @JsonProperty("xPx") + @JsonInclude(JsonInclude.Include.ALWAYS) + @Setter(lombok.AccessLevel.NONE) // 禁用 Lombok 生成 setter,使用手动 setter private Integer xPx; /** 左下角 Y 坐标(px) */ @NotNull @Min(0) + @JsonProperty("yPx") + @JsonInclude(JsonInclude.Include.ALWAYS) + @Setter(lombok.AccessLevel.NONE) // 禁用 Lombok 生成 setter,使用手动 setter private Integer yPx; /** 盖章宽度(px,可选) */ @Min(1) + @JsonProperty("widthPx") private Integer widthPx; /** 盖章高度(px,可选) */ @Min(1) + @JsonProperty("heightPx") private Integer heightPx; + + /** + * 前端渲染的 viewport 宽度(像素):用于把前端点击坐标换算成 PDFBox 坐标(pt)。 + * 注意:这不是 PDF 页面原始宽度,而是 pdf.js 按 scale 渲染到 canvas 的宽度。 + */ + @Min(1) + @JsonProperty("viewportWidth") + private Integer viewportWidth; + + /** 前端渲染的 viewport 高度(像素):用于坐标换算 */ + @Min(1) + @JsonProperty("viewportHeight") + private Integer viewportHeight; + + /** + * 手动添加 setter 方法,确保 Jackson 能够正确映射 yPx 字段 + * Lombok 生成的 setYPx() 可能与 Jackson 的字段名映射不匹配 + */ + @JsonSetter("yPx") + public void setYPx(Integer yPx) { + this.yPx = yPx; + } + + /** + * 手动添加 setter 方法,确保 Jackson 能够正确映射 xPx 字段 + */ + @JsonSetter("xPx") + public void setXPx(Integer xPx) { + this.xPx = xPx; + } } diff --git a/klp-hrm/src/main/java/com/klp/hrm/domain/bo/HrmTravelReqBo.java b/klp-hrm/src/main/java/com/klp/hrm/domain/bo/HrmTravelReqBo.java index f2099949..747453f8 100644 --- a/klp-hrm/src/main/java/com/klp/hrm/domain/bo/HrmTravelReqBo.java +++ b/klp-hrm/src/main/java/com/klp/hrm/domain/bo/HrmTravelReqBo.java @@ -1,5 +1,6 @@ package com.klp.hrm.domain.bo; +import com.fasterxml.jackson.annotation.JsonFormat; import com.klp.common.core.domain.BaseEntity; import lombok.Data; import lombok.EqualsAndHashCode; @@ -17,15 +18,26 @@ public class HrmTravelReqBo extends BaseEntity { private Long empId; @NotNull(message = "开始时间不能为空") + @JsonFormat(pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSX", timezone = "GMT+8") private Date startTime; @NotNull(message = "结束时间不能为空") + @JsonFormat(pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSX", timezone = "GMT+8") private Date endTime; + private String travelType; private String destination; private String reason; private String status; + + // 无模板时,自选审批人 userId + private Long manualAssigneeUserId; + private String accessoryApplyIds; private String accessoryReceiptIds; + private String payeeName; + private Double estimatedCost; + private String bankName; + private String bankAccount; private String remark; } diff --git a/klp-hrm/src/main/java/com/klp/hrm/domain/vo/HrmEmpOrgPositionVo.java b/klp-hrm/src/main/java/com/klp/hrm/domain/vo/HrmEmpOrgPositionVo.java index 079fb19b..87497711 100644 --- a/klp-hrm/src/main/java/com/klp/hrm/domain/vo/HrmEmpOrgPositionVo.java +++ b/klp-hrm/src/main/java/com/klp/hrm/domain/vo/HrmEmpOrgPositionVo.java @@ -16,11 +16,17 @@ public class HrmEmpOrgPositionVo implements Serializable { @Excel(name = "员工ID") private Long empId; - @Excel(name = "组织ID") - private Long orgId; + @Excel(name = "部门ID") + private Long deptId; + + /** 部门名称 */ + private String deptName; @Excel(name = "岗位ID") - private Long positionId; + private Long postId; + + /** 岗位名称 */ + private String postName; @Excel(name = "是否主岗") private Integer isPrimary; diff --git a/klp-hrm/src/main/java/com/klp/hrm/domain/vo/HrmEmployeeVo.java b/klp-hrm/src/main/java/com/klp/hrm/domain/vo/HrmEmployeeVo.java index 18ad6aac..a95fe4fa 100644 --- a/klp-hrm/src/main/java/com/klp/hrm/domain/vo/HrmEmployeeVo.java +++ b/klp-hrm/src/main/java/com/klp/hrm/domain/vo/HrmEmployeeVo.java @@ -43,14 +43,17 @@ public class HrmEmployeeVo implements Serializable { @Excel(name = "在职状态") private String status; - @Excel(name = "职级ID") - private Long gradeId; + @Excel(name = "主部门ID") + private Long deptId; - @Excel(name = "主组织ID") - private Long mainOrgId; + /** 主部门名称 */ + private String deptName; @Excel(name = "主岗位ID") - private Long mainPositionId; + private Long postId; + + /** 主岗位名称 */ + private String postName; @Excel(name = "备注") private String remark; diff --git a/klp-hrm/src/main/java/com/klp/hrm/domain/vo/HrmFlowCcVo.java b/klp-hrm/src/main/java/com/klp/hrm/domain/vo/HrmFlowCcVo.java new file mode 100644 index 00000000..ee4b8413 --- /dev/null +++ b/klp-hrm/src/main/java/com/klp/hrm/domain/vo/HrmFlowCcVo.java @@ -0,0 +1,26 @@ +package com.klp.hrm.domain.vo; + +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +@Data +public class HrmFlowCcVo implements Serializable { + private static final long serialVersionUID = 1L; + + private Long ccId; + private Long instId; + private String bizType; + private Long bizId; + private String bizTypeName; + private String bizTitle; + private Long nodeId; + private String nodeName; + private Integer readFlag; + private Long ccUserId; + private Long fromUserId; + private String remark; + private Date createTime; +} + diff --git a/klp-hrm/src/main/java/com/klp/hrm/domain/vo/HrmFlowInstanceVo.java b/klp-hrm/src/main/java/com/klp/hrm/domain/vo/HrmFlowInstanceVo.java index e043a5a5..2c0f17df 100644 --- a/klp-hrm/src/main/java/com/klp/hrm/domain/vo/HrmFlowInstanceVo.java +++ b/klp-hrm/src/main/java/com/klp/hrm/domain/vo/HrmFlowInstanceVo.java @@ -4,6 +4,7 @@ import com.klp.common.annotation.Excel; import lombok.Data; import java.io.Serializable; +import java.math.BigDecimal; import java.util.Date; @Data @@ -26,6 +27,14 @@ public class HrmFlowInstanceVo implements Serializable { private Long startUserId; @Excel(name = "备注") private String remark; + + /** 列表展示字段(联查业务表) */ + private String bizTitle; + private Date startTime; + private Date endTime; + private BigDecimal hours; + private String procStatus; + private String createBy; private Date createTime; private String updateBy; diff --git a/klp-hrm/src/main/java/com/klp/hrm/domain/vo/HrmFlowTaskVo.java b/klp-hrm/src/main/java/com/klp/hrm/domain/vo/HrmFlowTaskVo.java index a2ccdb0c..5d228843 100644 --- a/klp-hrm/src/main/java/com/klp/hrm/domain/vo/HrmFlowTaskVo.java +++ b/klp-hrm/src/main/java/com/klp/hrm/domain/vo/HrmFlowTaskVo.java @@ -5,6 +5,7 @@ import lombok.Data; import java.io.Serializable; import java.util.Date; +import java.util.Map; @Data public class HrmFlowTaskVo implements Serializable { @@ -24,6 +25,18 @@ public class HrmFlowTaskVo implements Serializable { private Date expireTime; @Excel(name = "备注") private String remark; + + /** 业务类型:leave/travel/seal/reimburse */ + private String bizType; + /** 业务ID */ + private Long bizId; + + /** + * 业务摘要数据(审批中心展示用),由后端联查后回填。 + * key/字段根据不同 bizType 不同。 + */ + private Map bizData; + private String createBy; private Date createTime; private String updateBy; diff --git a/klp-hrm/src/main/java/com/klp/hrm/domain/vo/HrmGradeVo.java b/klp-hrm/src/main/java/com/klp/hrm/domain/vo/HrmGradeVo.java deleted file mode 100644 index 47453cb7..00000000 --- a/klp-hrm/src/main/java/com/klp/hrm/domain/vo/HrmGradeVo.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.klp.hrm.domain.vo; - -import com.klp.common.annotation.Excel; -import lombok.Data; - -import java.io.Serializable; -import java.util.Date; - -@Data -public class HrmGradeVo implements Serializable { - private static final long serialVersionUID = 1L; - - @Excel(name = "职级ID") - private Long gradeId; - - @Excel(name = "职级编码") - private String gradeCode; - - @Excel(name = "职级名称") - private String gradeName; - - @Excel(name = "层级序号") - private Integer levelNo; - - @Excel(name = "备注") - private String remark; - - private String createBy; - private Date createTime; - private String updateBy; - private Date updateTime; -} diff --git a/klp-hrm/src/main/java/com/klp/hrm/domain/vo/HrmHeadcountPlanVo.java b/klp-hrm/src/main/java/com/klp/hrm/domain/vo/HrmHeadcountPlanVo.java index 10d3b9e8..0c292094 100644 --- a/klp-hrm/src/main/java/com/klp/hrm/domain/vo/HrmHeadcountPlanVo.java +++ b/klp-hrm/src/main/java/com/klp/hrm/domain/vo/HrmHeadcountPlanVo.java @@ -13,11 +13,11 @@ public class HrmHeadcountPlanVo implements Serializable { @Excel(name = "编制ID") private Long planId; - @Excel(name = "组织ID") - private Long orgId; + @Excel(name = "部门ID") + private Long deptId; @Excel(name = "岗位ID") - private Long positionId; + private Long postId; @Excel(name = "年份") private Integer year; diff --git a/klp-hrm/src/main/java/com/klp/hrm/domain/vo/HrmOrgVo.java b/klp-hrm/src/main/java/com/klp/hrm/domain/vo/HrmOrgVo.java deleted file mode 100644 index c255f64e..00000000 --- a/klp-hrm/src/main/java/com/klp/hrm/domain/vo/HrmOrgVo.java +++ /dev/null @@ -1,44 +0,0 @@ -package com.klp.hrm.domain.vo; - -import com.klp.common.annotation.Excel; -import lombok.Data; - -import java.io.Serializable; -import java.util.Date; - -/** - * 组织 VO - */ -@Data -public class HrmOrgVo implements Serializable { - private static final long serialVersionUID = 1L; - - @Excel(name = "组织ID") - private Long orgId; - - @Excel(name = "父级ID") - private Long parentId; - - @Excel(name = "组织编码") - private String orgCode; - - @Excel(name = "组织名称") - private String orgName; - - @Excel(name = "组织类型") - private String orgType; - - @Excel(name = "负责人用户ID") - private Long leaderUserId; - - private Integer orderNum; - - private Integer status; - - private String remark; - - private String createBy; - private Date createTime; - private String updateBy; - private Date updateTime; -} diff --git a/klp-hrm/src/main/java/com/klp/hrm/domain/vo/HrmPositionVo.java b/klp-hrm/src/main/java/com/klp/hrm/domain/vo/HrmPositionVo.java deleted file mode 100644 index 7b1c3be9..00000000 --- a/klp-hrm/src/main/java/com/klp/hrm/domain/vo/HrmPositionVo.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.klp.hrm.domain.vo; - -import com.klp.common.annotation.Excel; -import lombok.Data; - -import java.io.Serializable; -import java.util.Date; - -@Data -public class HrmPositionVo implements Serializable { - private static final long serialVersionUID = 1L; - - @Excel(name = "岗位ID") - private Long positionId; - - @Excel(name = "岗位编码") - private String positionCode; - - @Excel(name = "岗位名称") - private String positionName; - - @Excel(name = "职级ID") - private Long gradeId; - - @Excel(name = "排序") - private Integer orderNum; - - @Excel(name = "状态") - private Integer status; - - @Excel(name = "备注") - private String remark; - - private String createBy; - private Date createTime; - private String updateBy; - private Date updateTime; -} diff --git a/klp-hrm/src/main/java/com/klp/hrm/domain/vo/HrmOvertimeReqVo.java b/klp-hrm/src/main/java/com/klp/hrm/domain/vo/HrmReimburseReqVo.java similarity index 60% rename from klp-hrm/src/main/java/com/klp/hrm/domain/vo/HrmOvertimeReqVo.java rename to klp-hrm/src/main/java/com/klp/hrm/domain/vo/HrmReimburseReqVo.java index d67d6017..67269e0b 100644 --- a/klp-hrm/src/main/java/com/klp/hrm/domain/vo/HrmOvertimeReqVo.java +++ b/klp-hrm/src/main/java/com/klp/hrm/domain/vo/HrmReimburseReqVo.java @@ -8,33 +8,39 @@ import java.math.BigDecimal; import java.util.Date; @Data -public class HrmOvertimeReqVo implements Serializable { +public class HrmReimburseReqVo implements Serializable { private static final long serialVersionUID = 1L; @Excel(name = "业务ID") private Long bizId; + @Excel(name = "员工ID") private Long empId; - @Excel(name = "加班类型") - private String otType; - @Excel(name = "开始时间", width = 25, dateFormat = "yyyy-MM-dd HH:mm:ss") - private Date startTime; - @Excel(name = "结束时间", width = 25, dateFormat = "yyyy-MM-dd HH:mm:ss") - private Date endTime; - @Excel(name = "时长(小时)") - private BigDecimal hours; - @Excel(name = "原因") + + @Excel(name = "报销类型") + private String reimburseType; + + @Excel(name = "报销总金额") + private BigDecimal totalAmount; + + @Excel(name = "报销事由") private String reason; + @Excel(name = "状态") private String status; - @Excel(name = "申请附件") + + @Excel(name = "报销单据附件") private String accessoryApplyIds; + @Excel(name = "回执附件") private String accessoryReceiptIds; + @Excel(name = "备注") private String remark; + private String createBy; private Date createTime; private String updateBy; private Date updateTime; } + diff --git a/klp-hrm/src/main/java/com/klp/hrm/domain/vo/HrmTravelReqVo.java b/klp-hrm/src/main/java/com/klp/hrm/domain/vo/HrmTravelReqVo.java index d759b266..d6175056 100644 --- a/klp-hrm/src/main/java/com/klp/hrm/domain/vo/HrmTravelReqVo.java +++ b/klp-hrm/src/main/java/com/klp/hrm/domain/vo/HrmTravelReqVo.java @@ -18,6 +18,8 @@ public class HrmTravelReqVo implements Serializable { private Date startTime; @Excel(name = "结束时间", width = 25, dateFormat = "yyyy-MM-dd HH:mm:ss") private Date endTime; + @Excel(name = "出差类型") + private String travelType; @Excel(name = "目的地") private String destination; @Excel(name = "原因") @@ -28,6 +30,14 @@ public class HrmTravelReqVo implements Serializable { private String accessoryApplyIds; @Excel(name = "回执附件") private String accessoryReceiptIds; + @Excel(name = "收款人") + private String payeeName; + @Excel(name = "预估费用") + private Double estimatedCost; + @Excel(name = "开户行") + private String bankName; + @Excel(name = "银行账号") + private String bankAccount; @Excel(name = "备注") private String remark; private String createBy; diff --git a/klp-hrm/src/main/java/com/klp/hrm/mapper/HrmFlowCcMapper.java b/klp-hrm/src/main/java/com/klp/hrm/mapper/HrmFlowCcMapper.java new file mode 100644 index 00000000..12045bb4 --- /dev/null +++ b/klp-hrm/src/main/java/com/klp/hrm/mapper/HrmFlowCcMapper.java @@ -0,0 +1,9 @@ +package com.klp.hrm.mapper; + +import com.klp.common.core.mapper.BaseMapperPlus; +import com.klp.hrm.domain.HrmFlowCc; +import com.klp.hrm.domain.vo.HrmFlowCcVo; + +public interface HrmFlowCcMapper extends BaseMapperPlus { +} + diff --git a/klp-hrm/src/main/java/com/klp/hrm/mapper/HrmFlowInstanceMapper.java b/klp-hrm/src/main/java/com/klp/hrm/mapper/HrmFlowInstanceMapper.java index 8739f1a9..ae518a6b 100644 --- a/klp-hrm/src/main/java/com/klp/hrm/mapper/HrmFlowInstanceMapper.java +++ b/klp-hrm/src/main/java/com/klp/hrm/mapper/HrmFlowInstanceMapper.java @@ -2,7 +2,17 @@ package com.klp.hrm.mapper; import com.klp.common.core.mapper.BaseMapperPlus; import com.klp.hrm.domain.HrmFlowInstance; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.klp.hrm.domain.vo.HrmFlowInstanceVo; +import org.apache.ibatis.annotations.Param; public interface HrmFlowInstanceMapper extends BaseMapperPlus { + + IPage selectMyInstancePageWithBiz( + Page page, + @Param("startUserId") Long startUserId, + @Param("bizType") String bizType, + @Param("status") String status); } + diff --git a/klp-hrm/src/main/java/com/klp/hrm/mapper/HrmGradeMapper.java b/klp-hrm/src/main/java/com/klp/hrm/mapper/HrmGradeMapper.java deleted file mode 100644 index 9a0d8b88..00000000 --- a/klp-hrm/src/main/java/com/klp/hrm/mapper/HrmGradeMapper.java +++ /dev/null @@ -1,8 +0,0 @@ -package com.klp.hrm.mapper; - -import com.klp.common.core.mapper.BaseMapperPlus; -import com.klp.hrm.domain.HrmGrade; -import com.klp.hrm.domain.vo.HrmGradeVo; - -public interface HrmGradeMapper extends BaseMapperPlus { -} diff --git a/klp-hrm/src/main/java/com/klp/hrm/mapper/HrmOrgMapper.java b/klp-hrm/src/main/java/com/klp/hrm/mapper/HrmOrgMapper.java deleted file mode 100644 index 806d1d17..00000000 --- a/klp-hrm/src/main/java/com/klp/hrm/mapper/HrmOrgMapper.java +++ /dev/null @@ -1,8 +0,0 @@ -package com.klp.hrm.mapper; - -import com.klp.common.core.mapper.BaseMapperPlus; -import com.klp.hrm.domain.HrmOrg; -import com.klp.hrm.domain.vo.HrmOrgVo; - -public interface HrmOrgMapper extends BaseMapperPlus { -} diff --git a/klp-hrm/src/main/java/com/klp/hrm/mapper/HrmOvertimeReqMapper.java b/klp-hrm/src/main/java/com/klp/hrm/mapper/HrmOvertimeReqMapper.java deleted file mode 100644 index ace5bd4b..00000000 --- a/klp-hrm/src/main/java/com/klp/hrm/mapper/HrmOvertimeReqMapper.java +++ /dev/null @@ -1,8 +0,0 @@ -package com.klp.hrm.mapper; - -import com.klp.common.core.mapper.BaseMapperPlus; -import com.klp.hrm.domain.HrmOvertimeReq; -import com.klp.hrm.domain.vo.HrmOvertimeReqVo; - -public interface HrmOvertimeReqMapper extends BaseMapperPlus { -} diff --git a/klp-hrm/src/main/java/com/klp/hrm/mapper/HrmPositionMapper.java b/klp-hrm/src/main/java/com/klp/hrm/mapper/HrmPositionMapper.java deleted file mode 100644 index 7f265d2c..00000000 --- a/klp-hrm/src/main/java/com/klp/hrm/mapper/HrmPositionMapper.java +++ /dev/null @@ -1,8 +0,0 @@ -package com.klp.hrm.mapper; - -import com.klp.common.core.mapper.BaseMapperPlus; -import com.klp.hrm.domain.HrmPosition; -import com.klp.hrm.domain.vo.HrmPositionVo; - -public interface HrmPositionMapper extends BaseMapperPlus { -} diff --git a/klp-hrm/src/main/java/com/klp/hrm/mapper/HrmReimburseReqMapper.java b/klp-hrm/src/main/java/com/klp/hrm/mapper/HrmReimburseReqMapper.java new file mode 100644 index 00000000..0dc4d265 --- /dev/null +++ b/klp-hrm/src/main/java/com/klp/hrm/mapper/HrmReimburseReqMapper.java @@ -0,0 +1,9 @@ +package com.klp.hrm.mapper; + +import com.klp.common.core.mapper.BaseMapperPlus; +import com.klp.hrm.domain.HrmReimburseReq; +import com.klp.hrm.domain.vo.HrmReimburseReqVo; + +public interface HrmReimburseReqMapper extends BaseMapperPlus { +} + diff --git a/klp-hrm/src/main/java/com/klp/hrm/service/IHrmFlowCcService.java b/klp-hrm/src/main/java/com/klp/hrm/service/IHrmFlowCcService.java new file mode 100644 index 00000000..e5468fa3 --- /dev/null +++ b/klp-hrm/src/main/java/com/klp/hrm/service/IHrmFlowCcService.java @@ -0,0 +1,31 @@ +package com.klp.hrm.service; + +import com.klp.common.core.domain.PageQuery; +import com.klp.common.core.page.TableDataInfo; +import com.klp.hrm.domain.bo.HrmFlowCcBo; +import com.klp.hrm.domain.vo.HrmFlowCcVo; + +import java.util.Collection; +import java.util.List; + +public interface IHrmFlowCcService { + + TableDataInfo queryPageList(HrmFlowCcBo bo, PageQuery pageQuery); + + List queryList(HrmFlowCcBo bo); + + Boolean insert(HrmFlowCcBo bo); + + /** + * 批量新增抄送 + */ + Boolean insertBatch(HrmFlowCcBo bo); + + Boolean deleteByIds(Collection ids); + + /** + * 标记已读 + */ + Boolean markRead(Long ccId, Long userId); +} + diff --git a/klp-hrm/src/main/java/com/klp/hrm/service/IHrmFlowInstanceService.java b/klp-hrm/src/main/java/com/klp/hrm/service/IHrmFlowInstanceService.java index b529c3db..e69a726f 100644 --- a/klp-hrm/src/main/java/com/klp/hrm/service/IHrmFlowInstanceService.java +++ b/klp-hrm/src/main/java/com/klp/hrm/service/IHrmFlowInstanceService.java @@ -19,6 +19,11 @@ public interface IHrmFlowInstanceService { TableDataInfo queryPageList(HrmFlowInstanceBo bo, PageQuery pageQuery); + /** + * 查询当前登录用户“我的申请”(我发起的流程实例)分页列表 + */ + TableDataInfo queryMyInstancePageList(HrmFlowInstanceBo bo, PageQuery pageQuery); + List queryList(HrmFlowInstanceBo bo); Boolean insertByBo(HrmFlowInstanceBo bo); diff --git a/klp-hrm/src/main/java/com/klp/hrm/service/IHrmFlowTaskService.java b/klp-hrm/src/main/java/com/klp/hrm/service/IHrmFlowTaskService.java index 534abc2c..1df66979 100644 --- a/klp-hrm/src/main/java/com/klp/hrm/service/IHrmFlowTaskService.java +++ b/klp-hrm/src/main/java/com/klp/hrm/service/IHrmFlowTaskService.java @@ -36,4 +36,14 @@ public interface IHrmFlowTaskService { * 撤回/取消 */ Boolean withdraw(Long taskId, Long actionUserId, String remark); + + /** + * 转发/转办当前待办给其他审批人 + */ + Boolean transfer(Long taskId, Long newAssigneeUserId, Long actionUserId, String remark); + + /** + * 根据业务类型 + 业务ID 查询当前待办任务(pending),用于详情页自动带出 currentTaskId + */ + HrmFlowTaskVo queryTodoByBiz(String bizType, Long bizId, Long assigneeUserId); } diff --git a/klp-hrm/src/main/java/com/klp/hrm/service/IHrmGradeService.java b/klp-hrm/src/main/java/com/klp/hrm/service/IHrmGradeService.java deleted file mode 100644 index bd2282a6..00000000 --- a/klp-hrm/src/main/java/com/klp/hrm/service/IHrmGradeService.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.klp.hrm.service; - -import com.klp.common.core.domain.PageQuery; -import com.klp.common.core.page.TableDataInfo; -import com.klp.hrm.domain.bo.HrmGradeBo; -import com.klp.hrm.domain.vo.HrmGradeVo; - -import java.util.Collection; -import java.util.List; - -public interface IHrmGradeService { - HrmGradeVo queryById(Long gradeId); - - TableDataInfo queryPageList(HrmGradeBo bo, PageQuery pageQuery); - - List queryList(HrmGradeBo bo); - - Boolean insertByBo(HrmGradeBo bo); - - Boolean updateByBo(HrmGradeBo bo); - - Boolean deleteWithValidByIds(Collection ids, Boolean isValid); -} diff --git a/klp-hrm/src/main/java/com/klp/hrm/service/IHrmOrgService.java b/klp-hrm/src/main/java/com/klp/hrm/service/IHrmOrgService.java deleted file mode 100644 index 96eb9af0..00000000 --- a/klp-hrm/src/main/java/com/klp/hrm/service/IHrmOrgService.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.klp.hrm.service; - -import com.klp.common.core.domain.PageQuery; -import com.klp.common.core.page.TableDataInfo; -import com.klp.hrm.domain.bo.HrmOrgBo; -import com.klp.hrm.domain.vo.HrmOrgVo; - -import java.util.Collection; -import java.util.List; - -public interface IHrmOrgService { - HrmOrgVo queryById(Long orgId); - - TableDataInfo queryPageList(HrmOrgBo bo, PageQuery pageQuery); - - List queryList(HrmOrgBo bo); - - Boolean insertByBo(HrmOrgBo bo); - - Boolean updateByBo(HrmOrgBo bo); - - Boolean deleteWithValidByIds(Collection ids, Boolean isValid); -} diff --git a/klp-hrm/src/main/java/com/klp/hrm/service/IHrmOvertimeReqService.java b/klp-hrm/src/main/java/com/klp/hrm/service/IHrmOvertimeReqService.java deleted file mode 100644 index 6f792caf..00000000 --- a/klp-hrm/src/main/java/com/klp/hrm/service/IHrmOvertimeReqService.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.klp.hrm.service; - -import com.klp.common.core.domain.PageQuery; -import com.klp.common.core.page.TableDataInfo; -import com.klp.hrm.domain.bo.HrmOvertimeReqBo; -import com.klp.hrm.domain.vo.HrmOvertimeReqVo; - -import java.util.Collection; -import java.util.List; - -public interface IHrmOvertimeReqService { - - HrmOvertimeReqVo queryById(Long bizId); - - TableDataInfo queryPageList(HrmOvertimeReqBo bo, PageQuery pageQuery); - - List queryList(HrmOvertimeReqBo bo); - - Boolean insertByBo(HrmOvertimeReqBo bo); - - Boolean updateByBo(HrmOvertimeReqBo bo); - - Boolean deleteWithValidByIds(Collection ids, Boolean isValid); -} diff --git a/klp-hrm/src/main/java/com/klp/hrm/service/IHrmPositionService.java b/klp-hrm/src/main/java/com/klp/hrm/service/IHrmPositionService.java deleted file mode 100644 index c9648d0d..00000000 --- a/klp-hrm/src/main/java/com/klp/hrm/service/IHrmPositionService.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.klp.hrm.service; - -import com.klp.common.core.domain.PageQuery; -import com.klp.common.core.page.TableDataInfo; -import com.klp.hrm.domain.bo.HrmPositionBo; -import com.klp.hrm.domain.vo.HrmPositionVo; - -import java.util.Collection; -import java.util.List; - -public interface IHrmPositionService { - HrmPositionVo queryById(Long positionId); - - TableDataInfo queryPageList(HrmPositionBo bo, PageQuery pageQuery); - - List queryList(HrmPositionBo bo); - - Boolean insertByBo(HrmPositionBo bo); - - Boolean updateByBo(HrmPositionBo bo); - - Boolean deleteWithValidByIds(Collection ids, Boolean isValid); -} diff --git a/klp-hrm/src/main/java/com/klp/hrm/service/IHrmReimburseReqService.java b/klp-hrm/src/main/java/com/klp/hrm/service/IHrmReimburseReqService.java new file mode 100644 index 00000000..f3430882 --- /dev/null +++ b/klp-hrm/src/main/java/com/klp/hrm/service/IHrmReimburseReqService.java @@ -0,0 +1,25 @@ +package com.klp.hrm.service; + +import com.klp.common.core.domain.PageQuery; +import com.klp.common.core.page.TableDataInfo; +import com.klp.hrm.domain.bo.HrmReimburseReqBo; +import com.klp.hrm.domain.vo.HrmReimburseReqVo; + +import java.util.Collection; +import java.util.List; + +public interface IHrmReimburseReqService { + + HrmReimburseReqVo queryById(Long bizId); + + TableDataInfo queryPageList(HrmReimburseReqBo bo, PageQuery pageQuery); + + List queryList(HrmReimburseReqBo bo); + + Boolean insertByBo(HrmReimburseReqBo bo); + + Boolean updateByBo(HrmReimburseReqBo bo); + + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); +} + diff --git a/klp-hrm/src/main/java/com/klp/hrm/service/impl/BizStatusSyncHelper.java b/klp-hrm/src/main/java/com/klp/hrm/service/impl/BizStatusSyncHelper.java new file mode 100644 index 00000000..ed30d1d8 --- /dev/null +++ b/klp-hrm/src/main/java/com/klp/hrm/service/impl/BizStatusSyncHelper.java @@ -0,0 +1,102 @@ +package com.klp.hrm.service.impl; + +import com.klp.hrm.domain.HrmLeaveReq; +import com.klp.hrm.domain.HrmReimburseReq; +import com.klp.hrm.domain.HrmTravelReq; +import com.klp.hrm.domain.HrmSealReq; +import com.klp.hrm.mapper.HrmLeaveReqMapper; +import com.klp.hrm.mapper.HrmReimburseReqMapper; +import com.klp.hrm.mapper.HrmTravelReqMapper; +import com.klp.hrm.mapper.HrmSealReqMapper; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Component; + +/** + * 将流程结果同步到业务表状态。 + * 业务表状态规范:pending/approved/rejected + */ +@Component +@RequiredArgsConstructor +public class BizStatusSyncHelper { + + private final HrmLeaveReqMapper leaveReqMapper; + private final HrmTravelReqMapper travelReqMapper; + private final HrmSealReqMapper sealReqMapper; + private final HrmReimburseReqMapper reimburseReqMapper; + + public void setBizApproved(String bizType, Long bizId) { + if (bizType == null || bizId == null) return; + if ("leave".equalsIgnoreCase(bizType)) { + HrmLeaveReq u = new HrmLeaveReq(); + u.setBizId(bizId); + u.setStatus("approved"); + leaveReqMapper.updateById(u); + } else if ("travel".equalsIgnoreCase(bizType)) { + HrmTravelReq u = new HrmTravelReq(); + u.setBizId(bizId); + u.setStatus("approved"); + travelReqMapper.updateById(u); + } else if ("seal".equalsIgnoreCase(bizType)) { + HrmSealReq u = new HrmSealReq(); + u.setBizId(bizId); + u.setStatus("approved"); + sealReqMapper.updateById(u); + } else if ("reimburse".equalsIgnoreCase(bizType)) { + HrmReimburseReq u = new HrmReimburseReq(); + u.setBizId(bizId); + u.setStatus("approved"); + reimburseReqMapper.updateById(u); + } + } + + public void setBizPending(String bizType, Long bizId) { + if (bizType == null || bizId == null) return; + if ("leave".equalsIgnoreCase(bizType)) { + HrmLeaveReq u = new HrmLeaveReq(); + u.setBizId(bizId); + u.setStatus("pending"); + leaveReqMapper.updateById(u); + } else if ("travel".equalsIgnoreCase(bizType)) { + HrmTravelReq u = new HrmTravelReq(); + u.setBizId(bizId); + u.setStatus("pending"); + travelReqMapper.updateById(u); + } else if ("seal".equalsIgnoreCase(bizType)) { + HrmSealReq u = new HrmSealReq(); + u.setBizId(bizId); + u.setStatus("pending"); + sealReqMapper.updateById(u); + } else if ("reimburse".equalsIgnoreCase(bizType)) { + HrmReimburseReq u = new HrmReimburseReq(); + u.setBizId(bizId); + u.setStatus("pending"); + reimburseReqMapper.updateById(u); + } + } + + public void setBizRejected(String bizType, Long bizId) { + if (bizType == null || bizId == null) return; + if ("leave".equalsIgnoreCase(bizType)) { + HrmLeaveReq u = new HrmLeaveReq(); + u.setBizId(bizId); + u.setStatus("rejected"); + leaveReqMapper.updateById(u); + } else if ("travel".equalsIgnoreCase(bizType)) { + HrmTravelReq u = new HrmTravelReq(); + u.setBizId(bizId); + u.setStatus("rejected"); + travelReqMapper.updateById(u); + } else if ("seal".equalsIgnoreCase(bizType)) { + HrmSealReq u = new HrmSealReq(); + u.setBizId(bizId); + u.setStatus("rejected"); + sealReqMapper.updateById(u); + } else if ("reimburse".equalsIgnoreCase(bizType)) { + HrmReimburseReq u = new HrmReimburseReq(); + u.setBizId(bizId); + u.setStatus("rejected"); + reimburseReqMapper.updateById(u); + } + } +} + diff --git a/klp-hrm/src/main/java/com/klp/hrm/service/impl/FlowAssigneeHelper.java b/klp-hrm/src/main/java/com/klp/hrm/service/impl/FlowAssigneeHelper.java new file mode 100644 index 00000000..709889f8 --- /dev/null +++ b/klp-hrm/src/main/java/com/klp/hrm/service/impl/FlowAssigneeHelper.java @@ -0,0 +1,132 @@ +package com.klp.hrm.service.impl; + +import cn.hutool.json.JSONUtil; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.klp.common.core.domain.entity.SysDept; +import com.klp.common.core.domain.entity.SysUser; +import com.klp.common.exception.ServiceException; +import com.klp.hrm.domain.HrmEmployee; +import com.klp.hrm.domain.HrmFlowNode; +import com.klp.hrm.mapper.HrmEmployeeMapper; +import com.klp.system.mapper.SysDeptMapper; +import com.klp.system.mapper.SysUserMapper; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Component; +import org.springframework.util.StringUtils; + +import java.util.Collections; +import java.util.List; +import java.util.Objects; +import java.util.stream.Collectors; + +/** + * 流程审批人解析器:根据节点 approverRule/approverValue 解析出 assigneeUserId。 + */ +@Component +@RequiredArgsConstructor +public class FlowAssigneeHelper { + + private final HrmEmployeeMapper employeeMapper; + private final SysDeptMapper deptMapper; + private final SysUserMapper userMapper; + + public List resolveAssigneeUserIds(HrmFlowNode node, Long startUserId) { + if (node == null) { + return Collections.emptyList(); + } + String rule = node.getApproverRule(); + + // 默认:如果没配规则,就当发起人 + if (rule == null || rule.trim().isEmpty() || "initiator".equalsIgnoreCase(rule)) { + return startUserId == null ? Collections.emptyList() : Collections.singletonList(startUserId); + } + + switch (rule.toLowerCase()) { + case "fixed_user": + return resolveFixedUser(node); + case "dept_leader": + case "leader": // 兼容 "leader" 写法 + return resolveDeptLeader(startUserId); + default: + throw new ServiceException("审批人规则 '" + rule + "' 正在开发中,暂不支持"); + } + } + + private List resolveFixedUser(HrmFlowNode node) { + String v = node.getApproverValue(); + if (v == null || v.trim().isEmpty()) { + throw new ServiceException("节点未配置指定人员"); + } + List arr; + try { + arr = JSONUtil.toList(JSONUtil.parseArray(v), String.class); + } catch (Exception e) { + // 兼容非 JSON + arr = Collections.singletonList(v); + } + + // 允许 value 既可能是 userId,也可能是 empId + return arr.stream() + .filter(Objects::nonNull) + .map(String::trim) + .filter(s -> !s.trim().isEmpty()) + .map(this::toUserId) + .filter(Objects::nonNull) + .distinct() + .collect(Collectors.toList()); + } + + private List resolveDeptLeader(Long startUserId) { + if (startUserId == null) { + throw new ServiceException("无法解析部门负责人:发起人ID为空"); + } + + // 1. 根据发起人ID查询员工信息,获取其部门ID + HrmEmployee starter = employeeMapper.selectOne(Wrappers.lambdaQuery().eq(HrmEmployee::getUserId, startUserId).last("limit 1")); + if (starter == null || starter.getDeptId() == null) { + throw new ServiceException("无法解析部门负责人:发起人未关联员工或部门信息"); + } + + // 2. 根据部门ID查询部门信息,获取负责人姓名 + SysDept dept = deptMapper.selectById(starter.getDeptId()); + if (dept == null) { + throw new ServiceException("无法解析部门负责人:部门信息不存在"); + } + if (!StringUtils.hasText(dept.getLeader())) { + throw new ServiceException("无法解析部门负责人:部门 '" + dept.getDeptName() + "' 未配置负责人"); + } + + // 3. sys_dept.leader 存的是 nick_name:优先按 nickName 匹配,兜底按 userName 匹配 + SysUser leaderUser = userMapper.selectOne(Wrappers.lambdaQuery() + .eq(SysUser::getNickName, dept.getLeader()) + .last("limit 1")); + if (leaderUser == null) { + leaderUser = userMapper.selectOne(Wrappers.lambdaQuery() + .eq(SysUser::getUserName, dept.getLeader()) + .last("limit 1")); + } + if (leaderUser == null) { + throw new ServiceException("无法解析部门负责人:部门负责人(nickName/userName)='" + dept.getLeader() + "' 未匹配到系统用户"); + } + + return Collections.singletonList(leaderUser.getUserId()); + } + + private Long toUserId(String s) { + // 纯数字:可能是 userId 或 empId + Long id; + try { + id = Long.parseLong(s); + } catch (Exception e) { + return null; + } + + // 先当 userId 直接用 + // 但为了兼容你们前端可能传 empId,这里做一次 hrm_employee.user_id 映射 + HrmEmployee emp = employeeMapper.selectOne(Wrappers.lambdaQuery().eq(HrmEmployee::getEmpId, id)); + if (emp != null && emp.getUserId() != null) { + return emp.getUserId(); + } + return id; + } +} diff --git a/klp-hrm/src/main/java/com/klp/hrm/service/impl/HrmEmpOrgPositionServiceImpl.java b/klp-hrm/src/main/java/com/klp/hrm/service/impl/HrmEmpOrgPositionServiceImpl.java index 97ee2603..b66213e5 100644 --- a/klp-hrm/src/main/java/com/klp/hrm/service/impl/HrmEmpOrgPositionServiceImpl.java +++ b/klp-hrm/src/main/java/com/klp/hrm/service/impl/HrmEmpOrgPositionServiceImpl.java @@ -11,6 +11,8 @@ import com.klp.hrm.domain.bo.HrmEmpOrgPositionBo; import com.klp.hrm.domain.vo.HrmEmpOrgPositionVo; import com.klp.hrm.mapper.HrmEmpOrgPositionMapper; import com.klp.hrm.service.IHrmEmpOrgPositionService; +import com.klp.system.service.ISysDeptService; +import com.klp.system.service.ISysPostService; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -23,23 +25,58 @@ import java.util.List; public class HrmEmpOrgPositionServiceImpl implements IHrmEmpOrgPositionService { private final HrmEmpOrgPositionMapper baseMapper; + private final ISysDeptService deptService; + private final ISysPostService postService; @Override public HrmEmpOrgPositionVo queryById(Long relId) { - return baseMapper.selectVoById(relId); + HrmEmpOrgPositionVo vo = baseMapper.selectVoById(relId); + fillNames(vo); + return vo; } @Override public TableDataInfo queryPageList(HrmEmpOrgPositionBo bo, PageQuery pageQuery) { LambdaQueryWrapper lqw = buildQueryWrapper(bo); Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); + if (result.getRecords() != null) { + result.getRecords().forEach(this::fillNames); + } return TableDataInfo.build(result); } @Override public List queryList(HrmEmpOrgPositionBo bo) { LambdaQueryWrapper lqw = buildQueryWrapper(bo); - return baseMapper.selectVoList(lqw); + List list = baseMapper.selectVoList(lqw); + if (list != null) { + list.forEach(this::fillNames); + } + return list; + } + + private void fillNames(HrmEmpOrgPositionVo vo) { + if (vo == null) return; + if (vo.getDeptId() != null) { + try { + com.klp.common.core.domain.entity.SysDept dept = deptService.selectDeptById(vo.getDeptId()); + if (dept != null) { + vo.setDeptName(dept.getDeptName()); + } + } catch (Exception e) { + // 忽略查询失败 + } + } + if (vo.getPostId() != null) { + try { + com.klp.system.domain.SysPost post = postService.selectPostById(vo.getPostId()); + if (post != null) { + vo.setPostName(post.getPostName()); + } + } catch (Exception e) { + // 忽略查询失败 + } + } } @Override @@ -65,8 +102,8 @@ public class HrmEmpOrgPositionServiceImpl implements IHrmEmpOrgPositionService { LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); lqw.eq(bo.getRelId() != null, HrmEmpOrgPosition::getRelId, bo.getRelId()); lqw.eq(bo.getEmpId() != null, HrmEmpOrgPosition::getEmpId, bo.getEmpId()); - lqw.eq(bo.getOrgId() != null, HrmEmpOrgPosition::getOrgId, bo.getOrgId()); - lqw.eq(bo.getPositionId() != null, HrmEmpOrgPosition::getPositionId, bo.getPositionId()); + lqw.eq(bo.getDeptId() != null, HrmEmpOrgPosition::getDeptId, bo.getDeptId()); + lqw.eq(bo.getPostId() != null, HrmEmpOrgPosition::getPostId, bo.getPostId()); lqw.eq(bo.getIsPrimary() != null, HrmEmpOrgPosition::getIsPrimary, bo.getIsPrimary()); return lqw; } diff --git a/klp-hrm/src/main/java/com/klp/hrm/service/impl/HrmEmployeeServiceImpl.java b/klp-hrm/src/main/java/com/klp/hrm/service/impl/HrmEmployeeServiceImpl.java index 03bb78fc..d946bfbb 100644 --- a/klp-hrm/src/main/java/com/klp/hrm/service/impl/HrmEmployeeServiceImpl.java +++ b/klp-hrm/src/main/java/com/klp/hrm/service/impl/HrmEmployeeServiceImpl.java @@ -64,11 +64,12 @@ public class HrmEmployeeServiceImpl implements IHrmEmployeeService { private LambdaQueryWrapper buildQueryWrapper(HrmEmployeeBo bo) { LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); lqw.eq(bo.getEmpId() != null, HrmEmployee::getEmpId, bo.getEmpId()); + lqw.eq(bo.getUserId() != null, HrmEmployee::getUserId, bo.getUserId()); lqw.like(bo.getEmpNo() != null, HrmEmployee::getEmpNo, bo.getEmpNo()); lqw.like(bo.getEmpName() != null, HrmEmployee::getEmpName, bo.getEmpName()); lqw.eq(bo.getStatus() != null, HrmEmployee::getStatus, bo.getStatus()); - lqw.eq(bo.getMainOrgId() != null, HrmEmployee::getMainOrgId, bo.getMainOrgId()); - lqw.eq(bo.getMainPositionId() != null, HrmEmployee::getMainPositionId, bo.getMainPositionId()); + lqw.eq(bo.getDeptId() != null, HrmEmployee::getDeptId, bo.getDeptId()); + lqw.eq(bo.getPostId() != null, HrmEmployee::getPostId, bo.getPostId()); lqw.orderByAsc(HrmEmployee::getEmpNo); return lqw; } diff --git a/klp-hrm/src/main/java/com/klp/hrm/service/impl/HrmFlowCcServiceImpl.java b/klp-hrm/src/main/java/com/klp/hrm/service/impl/HrmFlowCcServiceImpl.java new file mode 100644 index 00000000..8237037d --- /dev/null +++ b/klp-hrm/src/main/java/com/klp/hrm/service/impl/HrmFlowCcServiceImpl.java @@ -0,0 +1,163 @@ +package com.klp.hrm.service.impl; + +import cn.hutool.core.bean.BeanUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.klp.common.core.domain.PageQuery; +import com.klp.common.core.page.TableDataInfo; +import com.klp.hrm.domain.HrmFlowCc; +import com.klp.hrm.domain.bo.HrmFlowCcBo; +import com.klp.hrm.domain.vo.HrmFlowCcVo; +import com.klp.hrm.mapper.HrmFlowCcMapper; +import com.klp.hrm.service.IHrmFlowCcService; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +import java.util.Collection; +import java.util.List; + +@RequiredArgsConstructor +@Service +public class HrmFlowCcServiceImpl implements IHrmFlowCcService { + + private final HrmFlowCcMapper baseMapper; + private final com.klp.hrm.mapper.HrmLeaveReqMapper leaveReqMapper; + private final com.klp.hrm.mapper.HrmTravelReqMapper travelReqMapper; + private final com.klp.hrm.mapper.HrmReimburseReqMapper reimburseReqMapper; + private final com.klp.hrm.mapper.HrmSealReqMapper sealReqMapper; + + @Override + public TableDataInfo queryPageList(HrmFlowCcBo bo, PageQuery pageQuery) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); + fillBizDisplay(result.getRecords()); + return TableDataInfo.build(result); + } + + @Override + public List queryList(HrmFlowCcBo bo) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + List list = baseMapper.selectVoList(lqw); + fillBizDisplay(list); + return list; + } + + @Override + public Boolean insert(HrmFlowCcBo bo) { + HrmFlowCc add = BeanUtil.toBean(bo, HrmFlowCc.class); + return baseMapper.insert(add) > 0; + } + + @Override + public Boolean insertBatch(HrmFlowCcBo bo) { + if (bo == null) { + return false; + } + List ids = bo.getCcUserIds(); + if (ids == null || ids.isEmpty()) { + // 兼容单人 + if (bo.getCcUserId() == null) { + return false; + } + return insert(bo); + } + + boolean ok = true; + for (Long uid : ids) { + if (uid == null) { + continue; + } + HrmFlowCc one = BeanUtil.toBean(bo, HrmFlowCc.class); + one.setCcId(null); + one.setCcUserId(uid); + one.setReadFlag(0); + ok = baseMapper.insert(one) > 0 && ok; + } + return ok; + } + + @Override + public Boolean deleteByIds(Collection ids) { + return baseMapper.deleteBatchIds(ids) > 0; + } + + @Override + public Boolean markRead(Long ccId, Long userId) { + if (ccId == null || userId == null) { + return false; + } + return baseMapper.update( + null, + Wrappers.lambdaUpdate() + .set(HrmFlowCc::getReadFlag, 1) + .eq(HrmFlowCc::getCcId, ccId) + .eq(HrmFlowCc::getCcUserId, userId) + .eq(HrmFlowCc::getDelFlag, 0) + ) > 0; + } + + private LambdaQueryWrapper buildQueryWrapper(HrmFlowCcBo bo) { + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.eq(bo.getCcUserId() != null, HrmFlowCc::getCcUserId, bo.getCcUserId()); + lqw.eq(bo.getInstId() != null, HrmFlowCc::getInstId, bo.getInstId()); + lqw.eq(bo.getBizType() != null, HrmFlowCc::getBizType, bo.getBizType()); + lqw.eq(bo.getReadFlag() != null, HrmFlowCc::getReadFlag, bo.getReadFlag()); + lqw.orderByDesc(HrmFlowCc::getCreateTime); + return lqw; + } + + /** + * 回填业务展示字段:bizTypeName + bizTitle + */ + private void fillBizDisplay(List list) { + if (list == null || list.isEmpty()) { + return; + } + for (HrmFlowCcVo vo : list) { + if (vo == null) { + continue; + } + String bt = vo.getBizType(); + Long bid = vo.getBizId(); + if (bt == null || bid == null) { + continue; + } + + // 默认兜底 + vo.setBizTypeName(bt); + vo.setBizTitle(vo.getRemark()); + + try { + if ("leave".equalsIgnoreCase(bt)) { + vo.setBizTypeName("请假申请"); + com.klp.hrm.domain.HrmLeaveReq req = leaveReqMapper.selectById(bid); + if (req != null) { + vo.setBizTitle(req.getLeaveType() + " | " + req.getReason()); + } + } else if ("travel".equalsIgnoreCase(bt)) { + vo.setBizTypeName("出差申请"); + com.klp.hrm.domain.HrmTravelReq req = travelReqMapper.selectById(bid); + if (req != null) { + vo.setBizTitle(req.getDestination() + " | " + req.getReason()); + } + } else if ("reimburse".equalsIgnoreCase(bt)) { + vo.setBizTypeName("报销申请"); + com.klp.hrm.domain.HrmReimburseReq req = reimburseReqMapper.selectById(bid); + if (req != null) { + vo.setBizTitle(req.getReimburseType() + " | " + req.getTotalAmount()); + } + } else if ("seal".equalsIgnoreCase(bt)) { + vo.setBizTypeName("用印申请"); + com.klp.hrm.domain.HrmSealReq req = sealReqMapper.selectById(bid); + if (req != null) { + vo.setBizTitle(req.getSealType() + " | " + req.getPurpose()); + } + } + } catch (Exception ignore) { + // 不影响列表返回 + } + } + } +} + diff --git a/klp-hrm/src/main/java/com/klp/hrm/service/impl/HrmFlowInstanceServiceImpl.java b/klp-hrm/src/main/java/com/klp/hrm/service/impl/HrmFlowInstanceServiceImpl.java index 91d62653..d9b95f0c 100644 --- a/klp-hrm/src/main/java/com/klp/hrm/service/impl/HrmFlowInstanceServiceImpl.java +++ b/klp-hrm/src/main/java/com/klp/hrm/service/impl/HrmFlowInstanceServiceImpl.java @@ -24,7 +24,6 @@ import org.springframework.transaction.annotation.Transactional; import java.util.Collection; import java.util.List; -import java.util.Objects; @RequiredArgsConstructor @Service @@ -34,6 +33,7 @@ public class HrmFlowInstanceServiceImpl implements IHrmFlowInstanceService { private final HrmFlowNodeMapper nodeMapper; private final HrmFlowTaskMapper taskMapper; private final HrmFormDataMapper formDataMapper; + private final FlowAssigneeHelper assigneeHelper; @Override public HrmFlowInstanceVo queryById(Long instId) { @@ -43,7 +43,44 @@ public class HrmFlowInstanceServiceImpl implements IHrmFlowInstanceService { @Override @Transactional(rollbackFor = Exception.class) public Long startInstance(HrmFlowStartBo bo) { - // 找首节点 + // 无模板:自选审批人(一次性审批) + if (bo.getTplId() == null) { + if (bo.getManualAssigneeUserId() == null) { + throw new RuntimeException("未配置流程模板且未指定审批人,无法启动"); + } + HrmFlowInstance inst = new HrmFlowInstance(); + inst.setTplId(0L); + inst.setBizType(bo.getBizType()); + inst.setBizId(bo.getBizId()); + inst.setStatus("running"); + inst.setCurrentNodeId(0L); + inst.setStartUserId(bo.getStartUserId()); + baseMapper.insert(inst); + + // 保存表单(可选) + if (bo.getContentJson() != null) { + HrmFormData form = new HrmFormData(); + form.setBizType(bo.getBizType()); + form.setBizId(bo.getBizId()); + form.setContentJson(bo.getContentJson()); + formDataMapper.insert(form); + } + + // 创建唯一待办:指派给自选审批人 + HrmFlowTask task = new HrmFlowTask(); + task.setInstId(inst.getInstId()); + task.setNodeId(0L); + task.setAssigneeUserId(bo.getManualAssigneeUserId()); + task.setStatus("pending"); + // 关键:写入业务关联字段,便于审批中心联查业务数据 + task.setBizType(bo.getBizType()); + task.setBizId(bo.getBizId()); + taskMapper.insert(task); + + return inst.getInstId(); + } + + // 有模板:找首节点 HrmFlowNode firstNode = nodeMapper.selectOne(Wrappers.lambdaQuery() .eq(HrmFlowNode::getTplId, bo.getTplId()) .orderByAsc(HrmFlowNode::getOrderNo) @@ -70,14 +107,20 @@ public class HrmFlowInstanceServiceImpl implements IHrmFlowInstanceService { formDataMapper.insert(form); } - // 创建首个待办 + // 创建首个待办:按首节点规则分配审批人,而不是写死发起人 + List assignees = assigneeHelper.resolveAssigneeUserIds(firstNode, bo.getStartUserId()); + if (assignees == null || assignees.isEmpty()) { + throw new RuntimeException("未解析到首节点审批人,无法启动流程"); + } + // 简化:目前每个节点只创建一个待办(取第一个审批人) HrmFlowTask task = new HrmFlowTask(); task.setInstId(inst.getInstId()); task.setNodeId(firstNode.getNodeId()); - //task.setAssigneeUserId(Objects.requireNonNullElse(bo.getStartUserId(), 0L)); - // 修复:使用三元运算符替代 Objects.requireNonNullElse - task.setAssigneeUserId(bo.getStartUserId() != null ? bo.getStartUserId() : 0L); + task.setAssigneeUserId(assignees.get(0)); task.setStatus("pending"); + // 关键:写入业务关联字段,便于审批中心联查业务数据 + task.setBizType(bo.getBizType()); + task.setBizId(bo.getBizId()); taskMapper.insert(task); return inst.getInstId(); @@ -90,6 +133,19 @@ public class HrmFlowInstanceServiceImpl implements IHrmFlowInstanceService { return TableDataInfo.build(result); } + @Override + public TableDataInfo queryMyInstancePageList(HrmFlowInstanceBo bo, PageQuery pageQuery) { + // “我的申请”= 当前登录用户发起的流程实例 + // 这里不信任前端传 startUserId,统一以登录态为准 + Long userId = com.klp.common.helper.LoginHelper.getUserId(); + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + lqw.eq(userId != null, HrmFlowInstance::getStartUserId, userId); + // 默认按发起时间倒序(如果表里没createTime字段,这里可改成instId倒序) + lqw.orderByDesc(HrmFlowInstance::getInstId); + Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); + return TableDataInfo.build(result); + } + @Override public List queryList(HrmFlowInstanceBo bo) { LambdaQueryWrapper lqw = buildQueryWrapper(bo); diff --git a/klp-hrm/src/main/java/com/klp/hrm/service/impl/HrmFlowTaskServiceImpl.java b/klp-hrm/src/main/java/com/klp/hrm/service/impl/HrmFlowTaskServiceImpl.java index 1b2c5f73..cacb2ed5 100644 --- a/klp-hrm/src/main/java/com/klp/hrm/service/impl/HrmFlowTaskServiceImpl.java +++ b/klp-hrm/src/main/java/com/klp/hrm/service/impl/HrmFlowTaskServiceImpl.java @@ -4,30 +4,24 @@ import cn.hutool.core.bean.BeanUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.fasterxml.jackson.databind.ObjectMapper; import com.klp.common.core.domain.PageQuery; import com.klp.common.core.page.TableDataInfo; -import com.klp.hrm.domain.HrmFlowTask; -import com.klp.hrm.domain.HrmFlowAction; -import com.klp.hrm.domain.HrmFlowInstance; -import com.klp.hrm.domain.HrmFlowNode; +import com.klp.hrm.domain.*; import com.klp.hrm.domain.bo.HrmFlowTaskBo; import com.klp.hrm.domain.bo.HrmSealStampBo; import com.klp.hrm.domain.vo.HrmFlowTaskVo; -import com.klp.hrm.mapper.HrmFlowActionMapper; -import com.klp.hrm.mapper.HrmFlowInstanceMapper; -import com.klp.hrm.mapper.HrmFlowNodeMapper; -import com.klp.hrm.mapper.HrmFlowTaskMapper; +import com.klp.hrm.mapper.*; import com.klp.hrm.service.IHrmFlowTaskService; import com.klp.hrm.service.IHrmSealReqService; +import com.klp.hrm.service.IHrmFlowCcService; +import com.klp.hrm.domain.bo.HrmFlowCcBo; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import java.time.LocalDateTime; -import java.util.Collection; -import java.util.Date; -import java.util.List; -import java.util.Objects; +import java.util.*; +import java.util.stream.Collectors; @RequiredArgsConstructor @Service @@ -38,6 +32,16 @@ public class HrmFlowTaskServiceImpl implements IHrmFlowTaskService { private final HrmFlowInstanceMapper instanceMapper; private final HrmFlowNodeMapper nodeMapper; private final IHrmSealReqService sealReqService; + private final IHrmFlowCcService ccService; + private final FlowAssigneeHelper assigneeHelper; + private final BizStatusSyncHelper bizStatusSyncHelper; + + // 注入四个业务Mapper + private final HrmLeaveReqMapper leaveReqMapper; + private final HrmTravelReqMapper travelReqMapper; + private final HrmSealReqMapper sealReqMapper; + private final HrmReimburseReqMapper reimburseReqMapper; + private final ObjectMapper objectMapper; // Spring Boot 默认提供 @Override public HrmFlowTaskVo queryById(Long taskId) { @@ -48,15 +52,66 @@ public class HrmFlowTaskServiceImpl implements IHrmFlowTaskService { public TableDataInfo queryPageList(HrmFlowTaskBo bo, PageQuery pageQuery) { LambdaQueryWrapper lqw = buildQueryWrapper(bo); Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); + // 分页查询同样需要填充业务数据 + if (result.getRecords() != null && !result.getRecords().isEmpty()) { + fillBizData(result.getRecords()); + } return TableDataInfo.build(result); } @Override public List queryList(HrmFlowTaskBo bo) { LambdaQueryWrapper lqw = buildQueryWrapper(bo); - return baseMapper.selectVoList(lqw); + List tasks = baseMapper.selectVoList(lqw); + if (tasks != null && !tasks.isEmpty()) { + fillBizData(tasks); + } + return tasks; } + private void fillBizData(List tasks) { + // 1. 按 bizType 分组,并收集 bizId + Map> bizIdsByType = tasks.stream() + .filter(t -> t.getBizType() != null && t.getBizId() != null) + .collect(Collectors.groupingBy( + HrmFlowTaskVo::getBizType, + Collectors.mapping(HrmFlowTaskVo::getBizId, Collectors.toList()) + )); + + // 2. 批量查询各个业务表 + Map bizDataMap = new HashMap<>(); + + bizIdsByType.forEach((bizType, bizIds) -> { + if (bizIds.isEmpty()) return; + switch (bizType) { + case "leave": + leaveReqMapper.selectBatchIds(bizIds).forEach(d -> bizDataMap.put("leave_" + d.getBizId(), d)); + break; + case "travel": + travelReqMapper.selectBatchIds(bizIds).forEach(d -> bizDataMap.put("travel_" + d.getBizId(), d)); + break; + case "seal": + sealReqMapper.selectBatchIds(bizIds).forEach(d -> bizDataMap.put("seal_" + d.getBizId(), d)); + break; + case "reimburse": + reimburseReqMapper.selectBatchIds(bizIds).forEach(d -> bizDataMap.put("reimburse_" + d.getBizId(), d)); + break; + } + }); + + // 3. 将业务数据回填到 task 的 bizData 字段 + tasks.forEach(task -> { + String key = task.getBizType() + "_" + task.getBizId(); + Object data = bizDataMap.get(key); + if (data != null) { + // 将实体对象转换为 Map,方便前端使用 + Map dataMap = objectMapper.convertValue(data, Map.class); + task.setBizData(dataMap); + } + }); + } + + @Override @Transactional(rollbackFor = Exception.class) public Boolean insertByBo(HrmFlowTaskBo bo) { @@ -87,6 +142,31 @@ public class HrmFlowTaskServiceImpl implements IHrmFlowTaskService { if (inst == null) { return false; } + // 无模板一次性审批(tplId=0 或 nodeId=0):直接结束流程 + if (inst.getTplId() != null && inst.getTplId() == 0L) { + // 记录动作 + saveAction(taskId, inst.getInstId(), "approve", remark, actionUserId); + if (stampBo != null) { + saveAction(taskId, inst.getInstId(), "stamp", "盖章", actionUserId); + } + task.setStatus("approved"); + baseMapper.updateById(task); + inst.setStatus("approved"); + inst.setCurrentNodeId(null); + instanceMapper.updateById(inst); + // 若业务为用印,更新用印状态为已批准,并执行盖章 + if ("seal".equalsIgnoreCase(inst.getBizType())) { + sealReqService.updateStatus(inst.getBizId(), "approved"); + if (stampBo != null) { + // 盖章动作也写入流转历史 + saveAction(taskId, inst.getInstId(), "stamp", "盖章", actionUserId); + sealReqService.stampWithJava(inst.getBizId(), stampBo); + } + } + bizStatusSyncHelper.setBizApproved(inst.getBizType(), inst.getBizId()); + return true; + } + HrmFlowNode currentNode = nodeMapper.selectById(task.getNodeId()); if (currentNode == null) { return false; @@ -103,14 +183,48 @@ public class HrmFlowTaskServiceImpl implements IHrmFlowTaskService { .gt(HrmFlowNode::getOrderNo, currentNode.getOrderNo()) .orderByAsc(HrmFlowNode::getOrderNo) .last("limit 1")); + + // 若后续存在抄送节点,需要:写抄送记录 + 自动继续流转到下一个非抄送节点 + while (next != null && "cc".equalsIgnoreCase(next.getNodeType())) { + // 写抄送记录 + List ccUserIds = assigneeHelper.resolveAssigneeUserIds(next, inst.getStartUserId()); + if (ccUserIds != null && !ccUserIds.isEmpty()) { + HrmFlowCcBo ccBo = new HrmFlowCcBo(); + ccBo.setInstId(inst.getInstId()); + ccBo.setBizType(inst.getBizType()); + ccBo.setBizId(inst.getBizId()); + ccBo.setNodeId(next.getNodeId()); + // hrm_flow_node 没有 nodeName 字段,这里用 remark 作为可读名兜底 + ccBo.setNodeName(next.getRemark()); + ccBo.setFromUserId(actionUserId); + ccBo.setCcUserIds(ccUserIds); + ccBo.setReadFlag(0); + ccBo.setRemark("系统自动抄送"); + ccService.insertBatch(ccBo); + } + + // 继续找下一个节点 + HrmFlowNode tmp = next; + next = nodeMapper.selectOne(Wrappers.lambdaQuery() + .eq(HrmFlowNode::getTplId, inst.getTplId()) + .gt(HrmFlowNode::getOrderNo, tmp.getOrderNo()) + .orderByAsc(HrmFlowNode::getOrderNo) + .last("limit 1")); + } + if (next != null) { inst.setCurrentNodeId(next.getNodeId()); inst.setStatus("running"); instanceMapper.updateById(inst); + // 创建下一节点待办:按下一节点规则分配审批人 + List assignees = assigneeHelper.resolveAssigneeUserIds(next, inst.getStartUserId()); + if (assignees == null || assignees.isEmpty()) { + throw new RuntimeException("未解析到下一节点审批人,无法流转"); + } HrmFlowTask nextTask = new HrmFlowTask(); nextTask.setInstId(inst.getInstId()); nextTask.setNodeId(next.getNodeId()); - nextTask.setAssigneeUserId(actionUserId != null ? actionUserId : 0L); + nextTask.setAssigneeUserId(assignees.get(0)); nextTask.setStatus("pending"); baseMapper.insert(nextTask); } else { @@ -144,10 +258,12 @@ public class HrmFlowTaskServiceImpl implements IHrmFlowTaskService { task.setStatus("rejected"); baseMapper.updateById(task); inst.setStatus("rejected"); + inst.setCurrentNodeId(null); instanceMapper.updateById(inst); if ("seal".equalsIgnoreCase(inst.getBizType())) { sealReqService.updateStatus(inst.getBizId(), "rejected"); } + bizStatusSyncHelper.setBizRejected(inst.getBizType(), inst.getBizId()); return true; } @@ -165,6 +281,23 @@ public class HrmFlowTaskServiceImpl implements IHrmFlowTaskService { saveAction(taskId, inst.getInstId(), "withdraw", remark, actionUserId); task.setStatus("withdraw"); baseMapper.updateById(task); + // 无模板一次性审批:撤回后业务回到 pending,并重新生成一个待办(仍然只允许一次审批) + if (inst.getTplId() != null && inst.getTplId() == 0L) { + inst.setStatus("running"); + instanceMapper.updateById(inst); + + HrmFlowTask reTask = new HrmFlowTask(); + reTask.setInstId(inst.getInstId()); + reTask.setNodeId(0L); + // 撤回后回到“原审批人”(撤回前的办理人) + reTask.setAssigneeUserId(task.getAssigneeUserId()); + reTask.setStatus("pending"); + baseMapper.insert(reTask); + + bizStatusSyncHelper.setBizPending(inst.getBizType(), inst.getBizId()); + return true; + } + // 撤回后重新生成当前节点待办,实例回到running inst.setStatus("running"); instanceMapper.updateById(inst); @@ -191,6 +324,43 @@ public class HrmFlowTaskServiceImpl implements IHrmFlowTaskService { actionMapper.insert(log); } + @Override + @Transactional(rollbackFor = Exception.class) + public Boolean transfer(Long taskId, Long newAssigneeUserId, Long actionUserId, String remark) { + HrmFlowTask task = baseMapper.selectById(taskId); + if (task == null) { + return false; + } + if (!"pending".equalsIgnoreCase(task.getStatus())) { + return false; + } + HrmFlowInstance inst = instanceMapper.selectById(task.getInstId()); + if (inst == null) { + return false; + } + // 记录动作 + saveAction(taskId, inst.getInstId(), "transfer", remark, actionUserId); + + // 更新办理人 + HrmFlowTask u = new HrmFlowTask(); + u.setTaskId(taskId); + u.setAssigneeUserId(newAssigneeUserId); + return baseMapper.updateById(u) > 0; + } + + @Override + public HrmFlowTaskVo queryTodoByBiz(String bizType, Long bizId, Long assigneeUserId) { + // 只取“待办 pending”的一条(理论上同一 biz 同一时刻最多一条待办) + LambdaQueryWrapper lqw = Wrappers.lambdaQuery() + .eq(bizType != null, HrmFlowTask::getBizType, bizType) + .eq(bizId != null, HrmFlowTask::getBizId, bizId) + .eq(assigneeUserId != null, HrmFlowTask::getAssigneeUserId, assigneeUserId) + .eq(HrmFlowTask::getStatus, "pending") + .orderByDesc(HrmFlowTask::getTaskId) + .last("limit 1"); + return baseMapper.selectVoOne(lqw); + } + private LambdaQueryWrapper buildQueryWrapper(HrmFlowTaskBo bo) { LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); lqw.eq(bo.getTaskId() != null, HrmFlowTask::getTaskId, bo.getTaskId()); @@ -198,6 +368,8 @@ public class HrmFlowTaskServiceImpl implements IHrmFlowTaskService { lqw.eq(bo.getNodeId() != null, HrmFlowTask::getNodeId, bo.getNodeId()); lqw.eq(bo.getAssigneeUserId() != null, HrmFlowTask::getAssigneeUserId, bo.getAssigneeUserId()); lqw.eq(bo.getStatus() != null, HrmFlowTask::getStatus, bo.getStatus()); + lqw.eq(bo.getBizType() != null, HrmFlowTask::getBizType, bo.getBizType()); + lqw.eq(bo.getBizId() != null, HrmFlowTask::getBizId, bo.getBizId()); return lqw; } } diff --git a/klp-hrm/src/main/java/com/klp/hrm/service/impl/HrmGradeServiceImpl.java b/klp-hrm/src/main/java/com/klp/hrm/service/impl/HrmGradeServiceImpl.java deleted file mode 100644 index 8ad6a44a..00000000 --- a/klp-hrm/src/main/java/com/klp/hrm/service/impl/HrmGradeServiceImpl.java +++ /dev/null @@ -1,72 +0,0 @@ -package com.klp.hrm.service.impl; - -import cn.hutool.core.bean.BeanUtil; -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import com.baomidou.mybatisplus.core.toolkit.Wrappers; -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import com.klp.common.core.domain.PageQuery; -import com.klp.common.core.page.TableDataInfo; -import com.klp.hrm.domain.HrmGrade; -import com.klp.hrm.domain.bo.HrmGradeBo; -import com.klp.hrm.domain.vo.HrmGradeVo; -import com.klp.hrm.mapper.HrmGradeMapper; -import com.klp.hrm.service.IHrmGradeService; -import lombok.RequiredArgsConstructor; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import java.util.Collection; -import java.util.List; - -@RequiredArgsConstructor -@Service -public class HrmGradeServiceImpl implements IHrmGradeService { - - private final HrmGradeMapper baseMapper; - - @Override - public HrmGradeVo queryById(Long gradeId) { - return baseMapper.selectVoById(gradeId); - } - - @Override - public TableDataInfo queryPageList(HrmGradeBo bo, PageQuery pageQuery) { - LambdaQueryWrapper lqw = buildQueryWrapper(bo); - Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); - return TableDataInfo.build(result); - } - - @Override - public List queryList(HrmGradeBo bo) { - LambdaQueryWrapper lqw = buildQueryWrapper(bo); - return baseMapper.selectVoList(lqw); - } - - @Override - @Transactional(rollbackFor = Exception.class) - public Boolean insertByBo(HrmGradeBo bo) { - HrmGrade add = BeanUtil.toBean(bo, HrmGrade.class); - return baseMapper.insert(add) > 0; - } - - @Override - @Transactional(rollbackFor = Exception.class) - public Boolean updateByBo(HrmGradeBo bo) { - HrmGrade update = BeanUtil.toBean(bo, HrmGrade.class); - return baseMapper.updateById(update) > 0; - } - - @Override - public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { - return baseMapper.deleteBatchIds(ids) > 0; - } - - private LambdaQueryWrapper buildQueryWrapper(HrmGradeBo bo) { - LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); - lqw.eq(bo.getGradeId() != null, HrmGrade::getGradeId, bo.getGradeId()); - lqw.like(bo.getGradeCode() != null, HrmGrade::getGradeCode, bo.getGradeCode()); - lqw.like(bo.getGradeName() != null, HrmGrade::getGradeName, bo.getGradeName()); - lqw.orderByAsc(HrmGrade::getLevelNo); - return lqw; - } -} diff --git a/klp-hrm/src/main/java/com/klp/hrm/service/impl/HrmHeadcountPlanServiceImpl.java b/klp-hrm/src/main/java/com/klp/hrm/service/impl/HrmHeadcountPlanServiceImpl.java index 2619fff4..dbbb6d16 100644 --- a/klp-hrm/src/main/java/com/klp/hrm/service/impl/HrmHeadcountPlanServiceImpl.java +++ b/klp-hrm/src/main/java/com/klp/hrm/service/impl/HrmHeadcountPlanServiceImpl.java @@ -64,8 +64,8 @@ public class HrmHeadcountPlanServiceImpl implements IHrmHeadcountPlanService { private LambdaQueryWrapper buildQueryWrapper(HrmHeadcountPlanBo bo) { LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); lqw.eq(bo.getPlanId() != null, HrmHeadcountPlan::getPlanId, bo.getPlanId()); - lqw.eq(bo.getOrgId() != null, HrmHeadcountPlan::getOrgId, bo.getOrgId()); - lqw.eq(bo.getPositionId() != null, HrmHeadcountPlan::getPositionId, bo.getPositionId()); + lqw.eq(bo.getDeptId() != null, HrmHeadcountPlan::getDeptId, bo.getDeptId()); + lqw.eq(bo.getPostId() != null, HrmHeadcountPlan::getPostId, bo.getPostId()); lqw.eq(bo.getYear() != null, HrmHeadcountPlan::getYear, bo.getYear()); lqw.eq(bo.getMonth() != null, HrmHeadcountPlan::getMonth, bo.getMonth()); lqw.orderByDesc(HrmHeadcountPlan::getYear).orderByDesc(HrmHeadcountPlan::getMonth); diff --git a/klp-hrm/src/main/java/com/klp/hrm/service/impl/HrmLeaveReqServiceImpl.java b/klp-hrm/src/main/java/com/klp/hrm/service/impl/HrmLeaveReqServiceImpl.java index 99608d55..690f1173 100644 --- a/klp-hrm/src/main/java/com/klp/hrm/service/impl/HrmLeaveReqServiceImpl.java +++ b/klp-hrm/src/main/java/com/klp/hrm/service/impl/HrmLeaveReqServiceImpl.java @@ -6,10 +6,15 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.klp.common.core.domain.PageQuery; import com.klp.common.core.page.TableDataInfo; +import com.klp.common.helper.LoginHelper; +import com.klp.hrm.domain.HrmFlowTemplate; import com.klp.hrm.domain.HrmLeaveReq; +import com.klp.hrm.domain.bo.HrmFlowStartBo; import com.klp.hrm.domain.bo.HrmLeaveReqBo; import com.klp.hrm.domain.vo.HrmLeaveReqVo; +import com.klp.hrm.mapper.HrmFlowTemplateMapper; import com.klp.hrm.mapper.HrmLeaveReqMapper; +import com.klp.hrm.service.IHrmFlowInstanceService; import com.klp.hrm.service.IHrmLeaveReqService; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; @@ -23,6 +28,8 @@ import java.util.List; public class HrmLeaveReqServiceImpl implements IHrmLeaveReqService { private final HrmLeaveReqMapper baseMapper; + private final HrmFlowTemplateMapper flowTemplateMapper; + private final IHrmFlowInstanceService flowInstanceService; @Override public HrmLeaveReqVo queryById(Long bizId) { @@ -47,7 +54,48 @@ public class HrmLeaveReqServiceImpl implements IHrmLeaveReqService { public Boolean insertByBo(HrmLeaveReqBo bo) { HrmLeaveReq add = BeanUtil.toBean(bo, HrmLeaveReq.class); add.setStatus(defaultStatus(add.getStatus())); - return baseMapper.insert(add) > 0; + boolean ok = baseMapper.insert(add) > 0; + + // 当提交为 pending 时,自动启动流程实例(hrm_flow_instance/hrm_flow_task) + if (ok && "pending".equalsIgnoreCase(add.getStatus())) { + + Long startUserId = LoginHelper.getUserId(); + + // 1) 优先:前端明确选择了模板(tplId 不为空) + HrmFlowTemplate tpl = null; + if (bo.getTplId() != null) { + tpl = flowTemplateMapper.selectOne(Wrappers.lambdaQuery() + .eq(HrmFlowTemplate::getTplId, bo.getTplId()) + .eq(HrmFlowTemplate::getBizType, "leave") + .eq(HrmFlowTemplate::getEnabled, 1) + .last("limit 1")); + } + + // 2) 手动审批:前端选择了手动审批人时,不允许兜底去找模板,否则会意外走到模板里的规则(例如 dept_leader) + boolean manualMode = bo.getTplId() == null && bo.getManualAssigneeUserId() != null; + + // 3) 兜底:只有在既没有 tplId、也没有手动审批人的情况下,才自动选择最新启用模板 + if (!manualMode && tpl == null) { + tpl = flowTemplateMapper.selectOne(Wrappers.lambdaQuery() + .eq(HrmFlowTemplate::getBizType, "leave") + .eq(HrmFlowTemplate::getEnabled, 1) + .orderByDesc(HrmFlowTemplate::getVersion) + .last("limit 1")); + } + + HrmFlowStartBo start = new HrmFlowStartBo(); + if (tpl != null) { + start.setTplId(tpl.getTplId()); + } + start.setManualAssigneeUserId(bo.getManualAssigneeUserId()); + start.setBizType("leave"); + start.setBizId(add.getBizId()); + start.setStartUserId(startUserId); + + flowInstanceService.startInstance(start); + } + + return ok; } @Override diff --git a/klp-hrm/src/main/java/com/klp/hrm/service/impl/HrmOrgServiceImpl.java b/klp-hrm/src/main/java/com/klp/hrm/service/impl/HrmOrgServiceImpl.java deleted file mode 100644 index a0dcd907..00000000 --- a/klp-hrm/src/main/java/com/klp/hrm/service/impl/HrmOrgServiceImpl.java +++ /dev/null @@ -1,82 +0,0 @@ -package com.klp.hrm.service.impl; - -import cn.hutool.core.bean.BeanUtil; -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import com.baomidou.mybatisplus.core.toolkit.Wrappers; -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import com.klp.common.core.domain.PageQuery; -import com.klp.common.core.page.TableDataInfo; -import com.klp.hrm.domain.HrmOrg; -import com.klp.hrm.domain.bo.HrmOrgBo; -import com.klp.hrm.domain.vo.HrmOrgVo; -import com.klp.hrm.mapper.HrmOrgMapper; -import com.klp.hrm.service.IHrmOrgService; -import lombok.RequiredArgsConstructor; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import java.util.Collection; -import java.util.List; - -@RequiredArgsConstructor -@Service -public class HrmOrgServiceImpl implements IHrmOrgService { - - private final HrmOrgMapper baseMapper; - - @Override - public HrmOrgVo queryById(Long orgId) { - return baseMapper.selectVoById(orgId); - } - - @Override - public TableDataInfo queryPageList(HrmOrgBo bo, PageQuery pageQuery) { - LambdaQueryWrapper lqw = buildQueryWrapper(bo); - Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); - return TableDataInfo.build(result); - } - - @Override - public List queryList(HrmOrgBo bo) { - LambdaQueryWrapper lqw = buildQueryWrapper(bo); - return baseMapper.selectVoList(lqw); - } - - @Override - @Transactional(rollbackFor = Exception.class) - public Boolean insertByBo(HrmOrgBo bo) { - HrmOrg add = BeanUtil.toBean(bo, HrmOrg.class); - validEntityBeforeSave(add); - return baseMapper.insert(add) > 0; - } - - @Override - @Transactional(rollbackFor = Exception.class) - public Boolean updateByBo(HrmOrgBo bo) { - HrmOrg update = BeanUtil.toBean(bo, HrmOrg.class); - validEntityBeforeSave(update); - return baseMapper.updateById(update) > 0; - } - - @Override - public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { - // 可按需添加校验 - return baseMapper.deleteBatchIds(ids) > 0; - } - - private LambdaQueryWrapper buildQueryWrapper(HrmOrgBo bo) { - LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); - lqw.eq(bo.getOrgId() != null, HrmOrg::getOrgId, bo.getOrgId()); - lqw.eq(bo.getParentId() != null, HrmOrg::getParentId, bo.getParentId()); - lqw.like(bo.getOrgCode() != null, HrmOrg::getOrgCode, bo.getOrgCode()); - lqw.like(bo.getOrgName() != null, HrmOrg::getOrgName, bo.getOrgName()); - lqw.eq(bo.getOrgType() != null, HrmOrg::getOrgType, bo.getOrgType()); - lqw.eq(bo.getStatus() != null, HrmOrg::getStatus, bo.getStatus()); - lqw.orderByAsc(HrmOrg::getParentId).orderByAsc(HrmOrg::getOrderNum); - return lqw; - } - - private void validEntityBeforeSave(HrmOrg entity) { - // 可添加唯一性校验: org_code - } -} diff --git a/klp-hrm/src/main/java/com/klp/hrm/service/impl/HrmOvertimeReqServiceImpl.java b/klp-hrm/src/main/java/com/klp/hrm/service/impl/HrmOvertimeReqServiceImpl.java deleted file mode 100644 index 7c17c198..00000000 --- a/klp-hrm/src/main/java/com/klp/hrm/service/impl/HrmOvertimeReqServiceImpl.java +++ /dev/null @@ -1,78 +0,0 @@ -package com.klp.hrm.service.impl; - -import cn.hutool.core.bean.BeanUtil; -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import com.baomidou.mybatisplus.core.toolkit.Wrappers; -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import com.klp.common.core.domain.PageQuery; -import com.klp.common.core.page.TableDataInfo; -import com.klp.hrm.domain.HrmOvertimeReq; -import com.klp.hrm.domain.bo.HrmOvertimeReqBo; -import com.klp.hrm.domain.vo.HrmOvertimeReqVo; -import com.klp.hrm.mapper.HrmOvertimeReqMapper; -import com.klp.hrm.service.IHrmOvertimeReqService; -import lombok.RequiredArgsConstructor; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import java.util.Collection; -import java.util.List; - -@RequiredArgsConstructor -@Service -public class HrmOvertimeReqServiceImpl implements IHrmOvertimeReqService { - - private final HrmOvertimeReqMapper baseMapper; - - @Override - public HrmOvertimeReqVo queryById(Long bizId) { - return baseMapper.selectVoById(bizId); - } - - @Override - public TableDataInfo queryPageList(HrmOvertimeReqBo bo, PageQuery pageQuery) { - LambdaQueryWrapper lqw = buildQueryWrapper(bo); - Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); - return TableDataInfo.build(result); - } - - @Override - public List queryList(HrmOvertimeReqBo bo) { - LambdaQueryWrapper lqw = buildQueryWrapper(bo); - return baseMapper.selectVoList(lqw); - } - - @Override - @Transactional(rollbackFor = Exception.class) - public Boolean insertByBo(HrmOvertimeReqBo bo) { - HrmOvertimeReq add = BeanUtil.toBean(bo, HrmOvertimeReq.class); - add.setStatus(defaultStatus(add.getStatus())); - return baseMapper.insert(add) > 0; - } - - @Override - @Transactional(rollbackFor = Exception.class) - public Boolean updateByBo(HrmOvertimeReqBo bo) { - HrmOvertimeReq update = BeanUtil.toBean(bo, HrmOvertimeReq.class); - return baseMapper.updateById(update) > 0; - } - - @Override - public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { - return baseMapper.deleteBatchIds(ids) > 0; - } - - private LambdaQueryWrapper buildQueryWrapper(HrmOvertimeReqBo bo) { - LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); - lqw.eq(bo.getBizId() != null, HrmOvertimeReq::getBizId, bo.getBizId()); - lqw.eq(bo.getEmpId() != null, HrmOvertimeReq::getEmpId, bo.getEmpId()); - lqw.eq(bo.getOtType() != null, HrmOvertimeReq::getOtType, bo.getOtType()); - lqw.eq(bo.getStatus() != null, HrmOvertimeReq::getStatus, bo.getStatus()); - lqw.eq(bo.getStartTime() != null, HrmOvertimeReq::getStartTime, bo.getStartTime()); - return lqw; - } - - private String defaultStatus(String status) { - return status == null ? "draft" : status; - } -} diff --git a/klp-hrm/src/main/java/com/klp/hrm/service/impl/HrmPositionServiceImpl.java b/klp-hrm/src/main/java/com/klp/hrm/service/impl/HrmPositionServiceImpl.java deleted file mode 100644 index ab3c799a..00000000 --- a/klp-hrm/src/main/java/com/klp/hrm/service/impl/HrmPositionServiceImpl.java +++ /dev/null @@ -1,74 +0,0 @@ -package com.klp.hrm.service.impl; - -import cn.hutool.core.bean.BeanUtil; -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import com.baomidou.mybatisplus.core.toolkit.Wrappers; -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import com.klp.common.core.domain.PageQuery; -import com.klp.common.core.page.TableDataInfo; -import com.klp.hrm.domain.HrmPosition; -import com.klp.hrm.domain.bo.HrmPositionBo; -import com.klp.hrm.domain.vo.HrmPositionVo; -import com.klp.hrm.mapper.HrmPositionMapper; -import com.klp.hrm.service.IHrmPositionService; -import lombok.RequiredArgsConstructor; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import java.util.Collection; -import java.util.List; - -@RequiredArgsConstructor -@Service -public class HrmPositionServiceImpl implements IHrmPositionService { - - private final HrmPositionMapper baseMapper; - - @Override - public HrmPositionVo queryById(Long positionId) { - return baseMapper.selectVoById(positionId); - } - - @Override - public TableDataInfo queryPageList(HrmPositionBo bo, PageQuery pageQuery) { - LambdaQueryWrapper lqw = buildQueryWrapper(bo); - Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); - return TableDataInfo.build(result); - } - - @Override - public List queryList(HrmPositionBo bo) { - LambdaQueryWrapper lqw = buildQueryWrapper(bo); - return baseMapper.selectVoList(lqw); - } - - @Override - @Transactional(rollbackFor = Exception.class) - public Boolean insertByBo(HrmPositionBo bo) { - HrmPosition add = BeanUtil.toBean(bo, HrmPosition.class); - return baseMapper.insert(add) > 0; - } - - @Override - @Transactional(rollbackFor = Exception.class) - public Boolean updateByBo(HrmPositionBo bo) { - HrmPosition update = BeanUtil.toBean(bo, HrmPosition.class); - return baseMapper.updateById(update) > 0; - } - - @Override - public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { - return baseMapper.deleteBatchIds(ids) > 0; - } - - private LambdaQueryWrapper buildQueryWrapper(HrmPositionBo bo) { - LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); - lqw.eq(bo.getPositionId() != null, HrmPosition::getPositionId, bo.getPositionId()); - lqw.like(bo.getPositionCode() != null, HrmPosition::getPositionCode, bo.getPositionCode()); - lqw.like(bo.getPositionName() != null, HrmPosition::getPositionName, bo.getPositionName()); - lqw.eq(bo.getGradeId() != null, HrmPosition::getGradeId, bo.getGradeId()); - lqw.eq(bo.getStatus() != null, HrmPosition::getStatus, bo.getStatus()); - lqw.orderByAsc(HrmPosition::getOrderNum); - return lqw; - } -} diff --git a/klp-hrm/src/main/java/com/klp/hrm/service/impl/HrmReimburseReqServiceImpl.java b/klp-hrm/src/main/java/com/klp/hrm/service/impl/HrmReimburseReqServiceImpl.java new file mode 100644 index 00000000..6b3e4e7b --- /dev/null +++ b/klp-hrm/src/main/java/com/klp/hrm/service/impl/HrmReimburseReqServiceImpl.java @@ -0,0 +1,107 @@ +package com.klp.hrm.service.impl; + +import com.klp.common.helper.LoginHelper; +import cn.hutool.core.bean.BeanUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.klp.common.core.domain.PageQuery; +import com.klp.common.core.page.TableDataInfo; +import com.klp.hrm.domain.HrmFlowTemplate; +import com.klp.hrm.domain.HrmReimburseReq; +import com.klp.hrm.domain.bo.HrmFlowStartBo; +import com.klp.hrm.domain.bo.HrmReimburseReqBo; +import com.klp.hrm.domain.vo.HrmReimburseReqVo; +import com.klp.hrm.mapper.HrmFlowTemplateMapper; +import com.klp.hrm.mapper.HrmReimburseReqMapper; +import com.klp.hrm.service.IHrmFlowInstanceService; +import com.klp.hrm.service.IHrmReimburseReqService; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Collection; +import java.util.List; + +@RequiredArgsConstructor +@Service +public class HrmReimburseReqServiceImpl implements IHrmReimburseReqService { + + private final HrmReimburseReqMapper baseMapper; + private final HrmFlowTemplateMapper flowTemplateMapper; + private final IHrmFlowInstanceService flowInstanceService; + + @Override + public HrmReimburseReqVo queryById(Long bizId) { + return baseMapper.selectVoById(bizId); + } + + @Override + public TableDataInfo queryPageList(HrmReimburseReqBo bo, PageQuery pageQuery) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); + return TableDataInfo.build(result); + } + + @Override + public List queryList(HrmReimburseReqBo bo) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + return baseMapper.selectVoList(lqw); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public Boolean insertByBo(HrmReimburseReqBo bo) { + HrmReimburseReq add = BeanUtil.toBean(bo, HrmReimburseReq.class); + add.setStatus(defaultStatus(add.getStatus())); + boolean ok = baseMapper.insert(add) > 0; + + if (ok && "pending".equalsIgnoreCase(add.getStatus())) { + // 选择启用的最高版本模板(允许无模板:走自选审批人一次性审批) + HrmFlowTemplate tpl = flowTemplateMapper.selectOne(Wrappers.lambdaQuery() + .eq(HrmFlowTemplate::getBizType, "reimburse") + .eq(HrmFlowTemplate::getEnabled, 1) + .orderByDesc(HrmFlowTemplate::getVersion) + .last("limit 1")); + + Long startUserId = LoginHelper.getUserId(); + HrmFlowStartBo start = new HrmFlowStartBo(); + if (tpl != null) { + start.setTplId(tpl.getTplId()); + } + start.setManualAssigneeUserId(bo.getManualAssigneeUserId()); + start.setBizType("reimburse"); + start.setBizId(add.getBizId()); + start.setStartUserId(startUserId); + flowInstanceService.startInstance(start); + } + + return ok; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public Boolean updateByBo(HrmReimburseReqBo bo) { + HrmReimburseReq update = BeanUtil.toBean(bo, HrmReimburseReq.class); + return baseMapper.updateById(update) > 0; + } + + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + return baseMapper.deleteBatchIds(ids) > 0; + } + + private LambdaQueryWrapper buildQueryWrapper(HrmReimburseReqBo bo) { + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.eq(bo.getBizId() != null, HrmReimburseReq::getBizId, bo.getBizId()); + lqw.eq(bo.getEmpId() != null, HrmReimburseReq::getEmpId, bo.getEmpId()); + lqw.eq(bo.getReimburseType() != null, HrmReimburseReq::getReimburseType, bo.getReimburseType()); + lqw.eq(bo.getStatus() != null, HrmReimburseReq::getStatus, bo.getStatus()); + return lqw; + } + + private String defaultStatus(String status) { + return status == null ? "draft" : status; + } +} + diff --git a/klp-hrm/src/main/java/com/klp/hrm/service/impl/HrmSealReqServiceImpl.java b/klp-hrm/src/main/java/com/klp/hrm/service/impl/HrmSealReqServiceImpl.java index c212463c..2123b61a 100644 --- a/klp-hrm/src/main/java/com/klp/hrm/service/impl/HrmSealReqServiceImpl.java +++ b/klp-hrm/src/main/java/com/klp/hrm/service/impl/HrmSealReqServiceImpl.java @@ -8,6 +8,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.klp.common.core.domain.PageQuery; import com.klp.common.core.page.TableDataInfo; import com.klp.common.exception.ServiceException; +import com.klp.common.helper.LoginHelper; import com.klp.hrm.config.StampProperties; import com.klp.hrm.domain.HrmSealReq; import com.klp.hrm.domain.bo.HrmSealReqBo; @@ -72,14 +73,20 @@ public class HrmSealReqServiceImpl implements IHrmSealReqService { add.setStatus(defaultStatus(add.getStatus())); validEntityBeforeSave(add); boolean ok = baseMapper.insert(add) > 0; - // 提交即发起流程(可选) - if (ok && bo.getFlowTplId() != null) { + + // 只要传入了 tplId 或 manualAssigneeUserId,就代表需要启动流程 + Long tplId = bo.getTplId() != null ? bo.getTplId() : bo.getFlowTplId(); + boolean shouldStartFlow = tplId != null || bo.getManualAssigneeUserId() != null; + + if (ok && shouldStartFlow) { HrmFlowStartBo start = new HrmFlowStartBo(); - start.setTplId(bo.getFlowTplId()); + start.setTplId(tplId); + start.setManualAssigneeUserId(bo.getManualAssigneeUserId()); start.setBizType("seal"); start.setBizId(add.getBizId()); - start.setStartUserId(bo.getStartUserId()); + start.setStartUserId(LoginHelper.getUserId()); start.setContentJson(bo.getContentJson()); + flowInstanceService.startInstance(start); // 更新状态为流转中 updateStatus(add.getBizId(), "running"); @@ -171,20 +178,70 @@ public class HrmSealReqServiceImpl implements IHrmSealReqService { PDPage page = document.getPage(pageIndex); PDRectangle mediaBox = page.getMediaBox(); + // 坐标约定说明: + // 1) PdfStamper emitStamp():输出的是“左下角为原点”的 viewport 像素坐标(xPx,yPx)。 + // 2) PDFBox:使用“左下角为原点”的 PDF 用户单位(pt)。 + // 3) 因此:后端只做比例换算(px -> pt),不要再做 y 翻转。 + byte[] imgBytes = IoUtil.readBytes(imgIn); PDImageXObject image = PDImageXObject.createFromByteArray(document, imgBytes, "stamp"); - float width = cmd.getWidthPx() != null ? cmd.getWidthPx() : image.getWidth(); - float height = cmd.getHeightPx() != null ? cmd.getHeightPx() : image.getHeight(); - float x = cmd.getXPx(); - float y = cmd.getYPx(); + // 方案B:严格使用印章原图尺寸(不使用前端传来的 widthPx/heightPx) + float stampW = image.getWidth(); + float stampH = image.getHeight(); - // 保证不越界 + // 坐标换算:前端 xPx/yPx 是基于 pdf.js 渲染后的 viewport 像素;PDFBox 使用的是 PDF 用户单位(pt)。 + // 前端 PdfStamper emitStamp() 输出的 yPx 已经是“左下角为原点”的 viewport 像素坐标。 + float pdfW = mediaBox.getWidth(); + float pdfH = mediaBox.getHeight(); + + float x; + float y; + if (cmd.getViewportWidth() != null && cmd.getViewportHeight() != null + && cmd.getViewportWidth() > 0 && cmd.getViewportHeight() > 0) { + float ratioX = pdfW / cmd.getViewportWidth(); + float ratioY = pdfH / cmd.getViewportHeight(); + x = cmd.getXPx() * ratioX; + + // yPx 的约定: + // - PdfStamper emitStamp() 输出的是“左下角为原点”的 viewport 像素坐标 + // - PDFBox 也以左下角为原点 + // 因此只需要做比例换算,不要再翻转。 + y = cmd.getYPx() * ratioY; + } else { + // 兼容:若老客户端未传 viewport 尺寸,则按“直接当作 PDF 坐标”处理(可能有偏差) + x = cmd.getXPx(); + y = cmd.getYPx(); + } + + // 方案B1:等比例缩放到“外接框不超过 4cm x 4cm”(保持比例) + // PDFBox 的单位是 pt:1 inch = 72pt,1cm = 72/2.54 ≈ 28.346pt + final float maxCm = 4.0f; + final float maxPt = maxCm * 72.0f / 2.54f; + // 缩放因子:让宽高都不超过 maxPt + float scale = Math.min(maxPt / stampW, maxPt / stampH); + // 不放大(避免小图被放大到很糊);如需允许放大,可删除这行限制 + scale = Math.min(scale, 1.0f); + + float width = stampW * scale; + float height = stampH * scale; + + log.info("[stamp] pdfW={},pdfH={}, viewportW={},viewportH={}, ratioX={},ratioY={}, xPx={},yPx={}, x={},y={}, stampW={},stampH={}, drawW={},drawH={}", + pdfW, pdfH, + cmd.getViewportWidth(), cmd.getViewportHeight(), + (cmd.getViewportWidth()!=null&&cmd.getViewportWidth()>0)?(pdfW/cmd.getViewportWidth()):null, + (cmd.getViewportHeight()!=null&&cmd.getViewportHeight()>0)?(pdfH/cmd.getViewportHeight()):null, + cmd.getXPx(), cmd.getYPx(), + x, y, + stampW, stampH, + width, height); + + // 保证不越界:方案B下不裁剪宽高(否则会变形/不是原图大小),而是回退到页面内。 if (x + width > mediaBox.getWidth()) { - width = mediaBox.getWidth() - x; + x = Math.max(0, mediaBox.getWidth() - width); } if (y + height > mediaBox.getHeight()) { - height = mediaBox.getHeight() - y; + y = Math.max(0, mediaBox.getHeight() - height); } try (PDPageContentStream contentStream = new PDPageContentStream(document, page, @@ -197,9 +254,8 @@ public class HrmSealReqServiceImpl implements IHrmSealReqService { OssClient storage = OssFactory.instance(); UploadResult uploadResult = storage.uploadSuffix(bos.toByteArray(), ".pdf", "application/pdf"); return uploadResult.getUrl(); - } catch (ServiceException se) { - throw se; - } catch (Exception e) { + } + catch (Exception e) { log.error("PDF盖章失败", e); throw new ServiceException("PDF盖章失败: " + e.getMessage()); } diff --git a/klp-hrm/src/main/java/com/klp/hrm/service/impl/HrmTravelReqServiceImpl.java b/klp-hrm/src/main/java/com/klp/hrm/service/impl/HrmTravelReqServiceImpl.java index b4a289b3..84ca520c 100644 --- a/klp-hrm/src/main/java/com/klp/hrm/service/impl/HrmTravelReqServiceImpl.java +++ b/klp-hrm/src/main/java/com/klp/hrm/service/impl/HrmTravelReqServiceImpl.java @@ -1,15 +1,20 @@ package com.klp.hrm.service.impl; -import cn.hutool.core.bean.BeanUtil; +import com.klp.common.helper.LoginHelper; +import com.klp.hrm.domain.HrmFlowTemplate; +import com.klp.hrm.domain.HrmTravelReq; +import com.klp.hrm.domain.bo.HrmFlowStartBo; +import com.klp.hrm.domain.bo.HrmTravelReqBo; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.klp.common.core.domain.PageQuery; import com.klp.common.core.page.TableDataInfo; -import com.klp.hrm.domain.HrmTravelReq; -import com.klp.hrm.domain.bo.HrmTravelReqBo; +import cn.hutool.core.bean.BeanUtil; import com.klp.hrm.domain.vo.HrmTravelReqVo; +import com.klp.hrm.mapper.HrmFlowTemplateMapper; import com.klp.hrm.mapper.HrmTravelReqMapper; +import com.klp.hrm.service.IHrmFlowInstanceService; import com.klp.hrm.service.IHrmTravelReqService; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; @@ -23,6 +28,8 @@ import java.util.List; public class HrmTravelReqServiceImpl implements IHrmTravelReqService { private final HrmTravelReqMapper baseMapper; + private final HrmFlowTemplateMapper flowTemplateMapper; + private final IHrmFlowInstanceService flowInstanceService; @Override public HrmTravelReqVo queryById(Long bizId) { @@ -47,7 +54,33 @@ public class HrmTravelReqServiceImpl implements IHrmTravelReqService { public Boolean insertByBo(HrmTravelReqBo bo) { HrmTravelReq add = BeanUtil.toBean(bo, HrmTravelReq.class); add.setStatus(defaultStatus(add.getStatus())); - return baseMapper.insert(add) > 0; + boolean ok = baseMapper.insert(add) > 0; + + // 业务表状态规范:pending/approved/rejected + // 当提交为 pending 时,自动启动流程实例(hrm_flow_instance/hrm_flow_task) + if (ok && "pending".equalsIgnoreCase(add.getStatus())) { + // 选择启用的最高版本模板(允许无模板:走自选审批人一次性审批) + HrmFlowTemplate tpl = flowTemplateMapper.selectOne(Wrappers.lambdaQuery() + .eq(HrmFlowTemplate::getBizType, "travel") + .eq(HrmFlowTemplate::getEnabled, 1) + .orderByDesc(HrmFlowTemplate::getVersion) + .last("limit 1")); + + Long startUserId = LoginHelper.getUserId(); + + HrmFlowStartBo start = new HrmFlowStartBo(); + if (tpl != null) { + start.setTplId(tpl.getTplId()); + } + start.setManualAssigneeUserId(bo.getManualAssigneeUserId()); + start.setBizType("travel"); + start.setBizId(add.getBizId()); + start.setStartUserId(startUserId); + // 暂不保存 contentJson + flowInstanceService.startInstance(start); + } + + return ok; } @Override diff --git a/klp-hrm/src/main/resources/mapper/HrmEmpOrgPositionMapper.xml b/klp-hrm/src/main/resources/mapper/HrmEmpOrgPositionMapper.xml index fa93db7c..a18fb57f 100644 --- a/klp-hrm/src/main/resources/mapper/HrmEmpOrgPositionMapper.xml +++ b/klp-hrm/src/main/resources/mapper/HrmEmpOrgPositionMapper.xml @@ -4,8 +4,8 @@ - - + + @@ -16,4 +16,34 @@ + + + + + + + + + + + + + + + + + + + + SELECT + r.rel_id, r.emp_id, r.dept_id, r.post_id, r.is_primary, + r.start_date, r.end_date, r.remark, + r.create_by, r.create_time, r.update_by, r.update_time, + d.dept_name, + p.post_name + FROM hrm_emp_org_position r + LEFT JOIN sys_dept d ON r.dept_id = d.dept_id AND d.del_flag = '0' + LEFT JOIN sys_post p ON r.post_id = p.post_id + WHERE r.del_flag = 0 + diff --git a/klp-hrm/src/main/resources/mapper/HrmEmployeeMapper.xml b/klp-hrm/src/main/resources/mapper/HrmEmployeeMapper.xml index 79407e6a..01ff0850 100644 --- a/klp-hrm/src/main/resources/mapper/HrmEmployeeMapper.xml +++ b/klp-hrm/src/main/resources/mapper/HrmEmployeeMapper.xml @@ -13,9 +13,8 @@ - - - + + @@ -25,4 +24,54 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + SELECT + e.emp_id, e.user_id, e.emp_no, e.emp_name, e.gender, e.mobile, e.email, e.id_no, + e.hire_date, e.employment_type, e.status, e.dept_id, e.post_id, e.remark, + e.create_by, e.create_time, e.update_by, e.update_time, + d.dept_name, + p.post_name + FROM hrm_employee e + LEFT JOIN sys_dept d ON e.dept_id = d.dept_id AND d.del_flag = '0' + LEFT JOIN sys_post p ON e.post_id = p.post_id + WHERE e.del_flag = 0 + + + + + + + + diff --git a/klp-hrm/src/main/resources/mapper/HrmGradeMapper.xml b/klp-hrm/src/main/resources/mapper/HrmGradeMapper.xml deleted file mode 100644 index 5c38f599..00000000 --- a/klp-hrm/src/main/resources/mapper/HrmGradeMapper.xml +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - - - - - - - - - - - diff --git a/klp-hrm/src/main/resources/mapper/HrmHeadcountPlanMapper.xml b/klp-hrm/src/main/resources/mapper/HrmHeadcountPlanMapper.xml index 026bd16a..b238e41d 100644 --- a/klp-hrm/src/main/resources/mapper/HrmHeadcountPlanMapper.xml +++ b/klp-hrm/src/main/resources/mapper/HrmHeadcountPlanMapper.xml @@ -3,8 +3,8 @@ - - + + diff --git a/klp-hrm/src/main/resources/mapper/HrmOrgMapper.xml b/klp-hrm/src/main/resources/mapper/HrmOrgMapper.xml deleted file mode 100644 index 113ab66c..00000000 --- a/klp-hrm/src/main/resources/mapper/HrmOrgMapper.xml +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - - - - - - - - - - - - - - diff --git a/klp-hrm/src/main/resources/mapper/HrmOvertimeReqMapper.xml b/klp-hrm/src/main/resources/mapper/HrmOvertimeReqMapper.xml deleted file mode 100644 index cf38395d..00000000 --- a/klp-hrm/src/main/resources/mapper/HrmOvertimeReqMapper.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - diff --git a/klp-hrm/src/main/resources/mapper/HrmPositionMapper.xml b/klp-hrm/src/main/resources/mapper/HrmPositionMapper.xml deleted file mode 100644 index a5f0143a..00000000 --- a/klp-hrm/src/main/resources/mapper/HrmPositionMapper.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - - - - - - - - - - diff --git a/klp-hrm/src/main/resources/mapper/HrmTravelReqMapper.xml b/klp-hrm/src/main/resources/mapper/HrmTravelReqMapper.xml index 66f4cbb6..d9ebaab3 100644 --- a/klp-hrm/src/main/resources/mapper/HrmTravelReqMapper.xml +++ b/klp-hrm/src/main/resources/mapper/HrmTravelReqMapper.xml @@ -6,11 +6,16 @@ + + + + + diff --git a/klp-ui/src/api/hrm/attendance.js b/klp-ui/src/api/hrm/attendance.js new file mode 100644 index 00000000..0f1b125e --- /dev/null +++ b/klp-ui/src/api/hrm/attendance.js @@ -0,0 +1,127 @@ +import request from '@/utils/request' + +// 班次 +export function listShift(query) { + return request({ + url: '/hrm/shift/list', + method: 'get', + params: query + }) +} +export function addShift(data) { + return request({ + url: '/hrm/shift', + method: 'post', + data + }) +} +export function updateShift(data) { + return request({ + url: '/hrm/shift', + method: 'put', + data + }) +} +export function delShift(shiftIds) { + return request({ + url: `/hrm/shift/${shiftIds}`, + method: 'delete' + }) +} + +// 排班 +export function listSchedule(query) { + return request({ + url: '/hrm/schedule/list', + method: 'get', + params: query + }) +} +export function addSchedule(data) { + return request({ + url: '/hrm/schedule', + method: 'post', + data + }) +} +export function updateSchedule(data) { + return request({ + url: '/hrm/schedule', + method: 'put', + data + }) +} +export function delSchedule(scheduleIds) { + return request({ + url: `/hrm/schedule/${scheduleIds}`, + method: 'delete' + }) +} + +// 打卡 +export function listPunch(query) { + return request({ + url: '/hrm/punch/list', + method: 'get', + params: query + }) +} +export function addPunch(data) { + return request({ + url: '/hrm/punch', + method: 'post', + data + }) +} +export function updatePunch(data) { + return request({ + url: '/hrm/punch', + method: 'put', + data + }) +} +export function delPunch(punchIds) { + return request({ + url: `/hrm/punch/${punchIds}`, + method: 'delete' + }) +} + +// 考勤结果 +export function listAttendCalc(query) { + return request({ + url: '/hrm/attend/list', + method: 'get', + params: query + }) +} + +// 假期余额 +export function listLeaveBalance(query) { + return request({ + url: '/hrm/leave/balance/list', + method: 'get', + params: query + }) +} +export function addLeaveBalance(data) { + return request({ + url: '/hrm/leave/balance', + method: 'post', + data + }) +} +export function updateLeaveBalance(data) { + return request({ + url: '/hrm/leave/balance', + method: 'put', + data + }) +} +export function delLeaveBalance(balIds) { + return request({ + url: `/hrm/leave/balance/${balIds}`, + method: 'delete' + }) +} + diff --git a/klp-ui/src/api/hrm/cc.js b/klp-ui/src/api/hrm/cc.js new file mode 100644 index 00000000..1bf5c747 --- /dev/null +++ b/klp-ui/src/api/hrm/cc.js @@ -0,0 +1,35 @@ +import request from '@/utils/request' + +// 查询抄送记录列表 +export function listCc(query) { + return request({ + url: '/hrm/flow/cc/my', + method: 'get', + params: query + }) +} + +// 标记抄送为已读 +export function readCc(ccId) { + return request({ + url: `/hrm/flow/cc/${ccId}/read`, + method: 'post' + }) +} + +// 手动抄送 +export function addCc(data) { + return request({ + url: '/hrm/flow/cc', + method: 'post', + data: data + }) +} + +// 查询抄送记录详细 +export function getCc(ccId) { + return request({ + url: `/hrm/flow/cc/${ccId}`, + method: 'get' + }) +} diff --git a/klp-ui/src/api/hrm/certContract.js b/klp-ui/src/api/hrm/certContract.js new file mode 100644 index 00000000..16fe6692 --- /dev/null +++ b/klp-ui/src/api/hrm/certContract.js @@ -0,0 +1,66 @@ +import request from '@/utils/request' + +// 证书 +export function listCertificate(query) { + return request({ + url: '/hrm/certificate/list', + method: 'get', + params: query + }) +} + +export function addCertificate(data) { + return request({ + url: '/hrm/certificate', + method: 'post', + data + }) +} + +export function updateCertificate(data) { + return request({ + url: '/hrm/certificate', + method: 'put', + data + }) +} + +export function delCertificate(certIds) { + return request({ + url: `/hrm/certificate/${certIds}`, + method: 'delete' + }) +} + +// 合同 +export function listContract(query) { + return request({ + url: '/hrm/contract/list', + method: 'get', + params: query + }) +} + +export function addContract(data) { + return request({ + url: '/hrm/contract', + method: 'post', + data + }) +} + +export function updateContract(data) { + return request({ + url: '/hrm/contract', + method: 'put', + data + }) +} + +export function delContract(contractIds) { + return request({ + url: `/hrm/contract/${contractIds}`, + method: 'delete' + }) +} + diff --git a/klp-ui/src/api/hrm/empOrgPosition.js b/klp-ui/src/api/hrm/empOrgPosition.js new file mode 100644 index 00000000..349cd61d --- /dev/null +++ b/klp-ui/src/api/hrm/empOrgPosition.js @@ -0,0 +1,34 @@ +import request from '@/utils/request' + +// 员工组织岗位关系 +export function listEmpOrgPosition(query) { + return request({ + url: '/hrm/empOrg/list', + method: 'get', + params: query + }) +} + +export function addEmpOrgPosition(data) { + return request({ + url: '/hrm/empOrg', + method: 'post', + data + }) +} + +export function updateEmpOrgPosition(data) { + return request({ + url: '/hrm/empOrg', + method: 'put', + data + }) +} + +export function delEmpOrgPosition(relIds) { + return request({ + url: `/hrm/empOrg/${relIds}`, + method: 'delete' + }) +} + diff --git a/klp-ui/src/api/hrm/employee.js b/klp-ui/src/api/hrm/employee.js new file mode 100644 index 00000000..8f4f418d --- /dev/null +++ b/klp-ui/src/api/hrm/employee.js @@ -0,0 +1,56 @@ +import request from '@/utils/request' + +// 员工 +export function listEmployee(query) { + return request({ + url: '/hrm/employee/list', + method: 'get', + params: query + }) +} + +export function allEmployee(query) { + return request({ + url: '/hrm/employee/all', + method: 'get', + params: query + }) +} + +export function addEmployee(data) { + return request({ + url: '/hrm/employee', + method: 'post', + data + }) +} + +export function updateEmployee(data) { + return request({ + url: '/hrm/employee', + method: 'put', + data + }) +} + +export function delEmployee(empIds) { + return request({ + url: `/hrm/employee/${empIds}`, + method: 'delete' + }) +} + +export function getEmployee(empId) { + return request({ + url: `/hrm/employee/${empId}`, + method: 'get' + }) +} + +// 根据用户ID获取员工信息 +export function getEmployeeByUserId(userId) { + return request({ + url: `/hrm/employee/byUserId/${userId}`, + method: 'get' + }) +} diff --git a/klp-ui/src/api/hrm/flow.js b/klp-ui/src/api/hrm/flow.js new file mode 100644 index 00000000..6dbde545 --- /dev/null +++ b/klp-ui/src/api/hrm/flow.js @@ -0,0 +1,212 @@ +import request from '@/utils/request' + +// 流程任务 +export function listFlowTask(query) { + return request({ + url: '/hrm/flow/task/list', + method: 'get', + params: query + }) +} + +export function listTodoFlowTask(assigneeUserId) { + return request({ + url: '/hrm/flow/task/todo', + method: 'get', + params: { assigneeUserId } + }) +} + +// 业务维度:按 bizType + bizId 查询当前待办任务(后端需提供) +export function getTodoTaskByBiz(bizType, bizId, assigneeUserId) { + return request({ + url: '/hrm/flow/task/todoByBiz', + method: 'get', + params: { bizType, bizId, assigneeUserId } + }) +} + +export function approveFlowTask(taskId, data) { + return request({ + url: `/hrm/flow/task/${taskId}/approve`, + method: 'post', + data + }) +} + +export function rejectFlowTask(taskId, data) { + return request({ + url: `/hrm/flow/task/${taskId}/reject`, + method: 'post', + data + }) +} + +export function withdrawFlowTask(taskId, data) { + return request({ + url: `/hrm/flow/task/${taskId}/withdraw`, + method: 'post', + data + }) +} + +export function transferFlowTask(taskId, data) { + return request({ + url: `/hrm/flow/task/${taskId}/transfer`, + method: 'post', + data + }) +} + +export function ccFlowTask(data) { + return request({ + url: '/hrm/flow/cc', + method: 'post', + data + }) +} + +// 流程动作/表单 +export function listFlowAction(query) { + return request({ + url: '/hrm/flow/action/list', + method: 'get', + params: query + }) +} + +export function listFlowFormData(query) { + return request({ + // 后端 Controller: HrmFlowFormDataController + // @RequestMapping("/hrm/flow/form") + @GetMapping("/list") + url: '/hrm/flow/form/list', + method: 'get', + params: query + }) +} + +// 流程实例 +export function listFlowInstance(query) { + return request({ + url: '/hrm/flow/instance/list', + method: 'get', + params: query + }) +} + +// 我的申请(我发起的流程实例) +export function listMyFlowInstance(query) { + return request({ + url: '/hrm/flow/instance/myList', + method: 'get', + params: query + }) +} + +export function getFlowInstance(instId) { + return request({ + url: `/hrm/flow/instance/${instId}`, + method: 'get' + }) +} + +export function queryInstanceByBiz(bizType, bizId) { + return request({ + url: '/hrm/flow/instance/all', + method: 'get', + params: { bizType, bizId } + }) +} + +export function listFlowForm(query) { + return request({ + url: '/hrm/flow/form/list', + method: 'get', + params: query + }) +} + +export function getFlowForm(formId) { + return request({ + url: `/hrm/flow/form/${formId}`, + method: 'get' + }) +} + +// 流程模板 +export function listFlowTemplate(query) { + return request({ + url: '/hrm/flow/template/list', + method: 'get', + params: query + }) +} + +export function getFlowTemplate(tplId) { + return request({ + url: `/hrm/flow/template/${tplId}`, + method: 'get' + }) +} + +export function addFlowTemplate(data) { + return request({ + url: '/hrm/flow/template', + method: 'post', + data + }) +} + +export function updateFlowTemplate(data) { + return request({ + url: '/hrm/flow/template', + method: 'put', + data + }) +} + +export function delFlowTemplate(tplIds) { + return request({ + url: `/hrm/flow/template/${tplIds}`, + method: 'delete' + }) +} + +// 流程节点 +export function listFlowNode(query) { + return request({ + url: '/hrm/flow/node/list', + method: 'get', + params: query + }) +} + +export function getFlowNode(nodeId) { + return request({ + url: `/hrm/flow/node/${nodeId}`, + method: 'get' + }) +} + +export function addFlowNode(data) { + return request({ + url: '/hrm/flow/node', + method: 'post', + data + }) +} + +export function updateFlowNode(data) { + return request({ + url: '/hrm/flow/node', + method: 'put', + data + }) +} + +export function delFlowNode(nodeIds) { + return request({ + url: `/hrm/flow/node/${nodeIds}`, + method: 'delete' + }) +} diff --git a/klp-ui/src/api/hrm/gradePosition.js b/klp-ui/src/api/hrm/gradePosition.js new file mode 100644 index 00000000..7463c502 --- /dev/null +++ b/klp-ui/src/api/hrm/gradePosition.js @@ -0,0 +1,66 @@ +import request from '@/utils/request' + +// 职级 +export function listGrade(query) { + return request({ + url: '/hrm/grade/list', + method: 'get', + params: query + }) +} + +export function addGrade(data) { + return request({ + url: '/hrm/grade', + method: 'post', + data + }) +} + +export function updateGrade(data) { + return request({ + url: '/hrm/grade', + method: 'put', + data + }) +} + +export function delGrade(gradeIds) { + return request({ + url: `/hrm/grade/${gradeIds}`, + method: 'delete' + }) +} + +// 岗位 +export function listPosition(query) { + return request({ + url: '/hrm/position/list', + method: 'get', + params: query + }) +} + +export function addPosition(data) { + return request({ + url: '/hrm/position', + method: 'post', + data + }) +} + +export function updatePosition(data) { + return request({ + url: '/hrm/position', + method: 'put', + data + }) +} + +export function delPosition(positionIds) { + return request({ + url: `/hrm/position/${positionIds}`, + method: 'delete' + }) +} + diff --git a/klp-ui/src/api/hrm/index.js b/klp-ui/src/api/hrm/index.js index 0568c011..f45bf754 100644 --- a/klp-ui/src/api/hrm/index.js +++ b/klp-ui/src/api/hrm/index.js @@ -1,694 +1,12 @@ -import request from '@/utils/request' - -// 组织 -export function listOrg(query) { - return request({ - url: '/hrm/org/list', - method: 'get', - params: query - }) -} -export function allOrg(query) { - return request({ - url: '/hrm/org/all', - method: 'get', - params: query - }) -} -export function addOrg(data) { - return request({ - url: '/hrm/org', - method: 'post', - data - }) -} -export function updateOrg(data) { - return request({ - url: '/hrm/org', - method: 'put', - data - }) -} -export function delOrg(orgIds) { - return request({ - url: `/hrm/org/${orgIds}`, - method: 'delete' - }) -} -export function getOrg(orgId) { - return request({ - url: `/hrm/org/${orgId}`, - method: 'get' - }) -} - -// 员工 -export function listEmployee(query) { - return request({ - url: '/hrm/employee/list', - method: 'get', - params: query - }) -} -export function allEmployee(query) { - return request({ - url: '/hrm/employee/all', - method: 'get', - params: query - }) -} -export function addEmployee(data) { - return request({ - url: '/hrm/employee', - method: 'post', - data - }) -} -export function updateEmployee(data) { - return request({ - url: '/hrm/employee', - method: 'put', - data - }) -} -export function delEmployee(empIds) { - return request({ - url: `/hrm/employee/${empIds}`, - method: 'delete' - }) -} -export function getEmployee(empId) { - return request({ - url: `/hrm/employee/${empId}`, - method: 'get' - }) -} - -// 证书与合同 -export function listCertificate(query) { - return request({ - url: '/hrm/certificate/list', - method: 'get', - params: query - }) -} -export function addCertificate(data) { - return request({ - url: '/hrm/certificate', - method: 'post', - data - }) -} -export function updateCertificate(data) { - return request({ - url: '/hrm/certificate', - method: 'put', - data - }) -} -export function delCertificate(certIds) { - return request({ - url: `/hrm/certificate/${certIds}`, - method: 'delete' - }) -} -export function listContract(query) { - return request({ - url: '/hrm/contract/list', - method: 'get', - params: query - }) -} -export function addContract(data) { - return request({ - url: '/hrm/contract', - method: 'post', - data - }) -} -export function updateContract(data) { - return request({ - url: '/hrm/contract', - method: 'put', - data - }) -} -export function delContract(contractIds) { - return request({ - url: `/hrm/contract/${contractIds}`, - method: 'delete' - }) -} - -// 员工组织岗位关系 -export function listEmpOrgPosition(query) { - return request({ - url: '/hrm/empOrg/list', - method: 'get', - params: query - }) -} -export function addEmpOrgPosition(data) { - return request({ - url: '/hrm/empOrg', - method: 'post', - data - }) -} -export function updateEmpOrgPosition(data) { - return request({ - url: '/hrm/empOrg', - method: 'put', - data - }) -} -export function delEmpOrgPosition(relIds) { - return request({ - url: `/hrm/empOrg/${relIds}`, - method: 'delete' - }) -} - -// 职级/岗位 -export function listGrade(query) { - return request({ - url: '/hrm/grade/list', - method: 'get', - params: query - }) -} -export function addGrade(data) { - return request({ - url: '/hrm/grade', - method: 'post', - data - }) -} -export function updateGrade(data) { - return request({ - url: '/hrm/grade', - method: 'put', - data - }) -} -export function delGrade(gradeIds) { - return request({ - url: `/hrm/grade/${gradeIds}`, - method: 'delete' - }) -} -export function listPosition(query) { - return request({ - url: '/hrm/position/list', - method: 'get', - params: query - }) -} -export function addPosition(data) { - return request({ - url: '/hrm/position', - method: 'post', - data - }) -} -export function updatePosition(data) { - return request({ - url: '/hrm/position', - method: 'put', - data - }) -} -export function delPosition(positionIds) { - return request({ - url: `/hrm/position/${positionIds}`, - method: 'delete' - }) -} - -// 班次/排班/打卡/考勤 -export function listShift(query) { - return request({ - url: '/hrm/shift/list', - method: 'get', - params: query - }) -} -export function addShift(data) { - return request({ - url: '/hrm/shift', - method: 'post', - data - }) -} -export function updateShift(data) { - return request({ - url: '/hrm/shift', - method: 'put', - data - }) -} -export function delShift(shiftIds) { - return request({ - url: `/hrm/shift/${shiftIds}`, - method: 'delete' - }) -} -export function listSchedule(query) { - return request({ - url: '/hrm/schedule/list', - method: 'get', - params: query - }) -} -export function addSchedule(data) { - return request({ - url: '/hrm/schedule', - method: 'post', - data - }) -} -export function updateSchedule(data) { - return request({ - url: '/hrm/schedule', - method: 'put', - data - }) -} -export function delSchedule(scheduleIds) { - return request({ - url: `/hrm/schedule/${scheduleIds}`, - method: 'delete' - }) -} -export function listPunch(query) { - return request({ - url: '/hrm/punch/list', - method: 'get', - params: query - }) -} -export function addPunch(data) { - return request({ - url: '/hrm/punch', - method: 'post', - data - }) -} -export function updatePunch(data) { - return request({ - url: '/hrm/punch', - method: 'put', - data - }) -} -export function delPunch(punchIds) { - return request({ - url: `/hrm/punch/${punchIds}`, - method: 'delete' - }) -} -export function listAttendCalc(query) { - return request({ - url: '/hrm/attend/list', - method: 'get', - params: query - }) -} -export function listLeaveBalance(query) { - return request({ - url: '/hrm/leave/balance/list', - method: 'get', - params: query - }) -} -export function addLeaveBalance(data) { - return request({ - url: '/hrm/leave/balance', - method: 'post', - data - }) -} -export function updateLeaveBalance(data) { - return request({ - url: '/hrm/leave/balance', - method: 'put', - data - }) -} -export function delLeaveBalance(balIds) { - return request({ - url: `/hrm/leave/balance/${balIds}`, - method: 'delete' - }) -} - -// 申请单 -export function listLeaveReq(query) { - return request({ - url: '/hrm/leave/req/list', - method: 'get', - params: query - }) -} -export function addLeaveReq(data) { - return request({ - url: '/hrm/leave/req', - method: 'post', - data - }) -} -export function listOvertimeReq(query) { - return request({ - url: '/hrm/overtime/list', - method: 'get', - params: query - }) -} -export function addOvertimeReq(data) { - return request({ - url: '/hrm/overtime', - method: 'post', - data - }) -} -export function listTravelReq(query) { - return request({ - url: '/hrm/travel/list', - method: 'get', - params: query - }) -} -export function addTravelReq(data) { - return request({ - url: '/hrm/travel', - method: 'post', - data - }) -} -export function listSealReq(query) { - return request({ - url: '/hrm/seal/list', - method: 'get', - params: query - }) -} -export function getSealReq(bizId) { - return request({ - url: `/hrm/seal/${bizId}`, - method: 'get' - }) -} -export function addSealReq(data) { - return request({ - url: '/hrm/seal', - method: 'post', - data - }) -} -export function updateSealReq(data) { - return request({ - url: '/hrm/seal', - method: 'put', - data - }) -} -export function delSealReq(bizIds) { - return request({ - url: `/hrm/seal/${bizIds}`, - method: 'delete' - }) -} -export function approveSealReq(bizId) { - return request({ - url: `/hrm/seal/${bizId}/approve`, - method: 'post' - }) -} -export function rejectSealReq(bizId) { - return request({ - url: `/hrm/seal/${bizId}/reject`, - method: 'post' - }) -} -export function cancelSealReq(bizId) { - return request({ - url: `/hrm/seal/${bizId}/cancel`, - method: 'post' - }) -} -export function stampSealJava(bizId, data) { - return request({ - url: `/hrm/seal/${bizId}/stamp/java`, - method: 'post', - data - }) -} -export function stampSealPython(bizId, data) { - return request({ - url: `/hrm/seal/${bizId}/stamp/python`, - method: 'post', - data - }) -} - -// 流程任务 -export function listFlowTask(query) { - return request({ - url: '/hrm/flow/task/list', - method: 'get', - params: query - }) -} -export function listTodoFlowTask(assigneeUserId) { - return request({ - url: '/hrm/flow/task/todo', - method: 'get', - params: { assigneeUserId } - }) -} -export function approveFlowTask(taskId, data) { - return request({ - url: `/hrm/flow/task/${taskId}/approve`, - method: 'post', - data - }) -} -export function rejectFlowTask(taskId, data) { - return request({ - url: `/hrm/flow/task/${taskId}/reject`, - method: 'post', - data - }) -} -export function withdrawFlowTask(taskId, data) { - return request({ - url: `/hrm/flow/task/${taskId}/withdraw`, - method: 'post', - data - }) -} -export function listFlowAction(query) { - return request({ - url: '/hrm/flow/action/list', - method: 'get', - params: query - }) -} -export function listFlowFormData(query) { - return request({ - url: '/hrm/flow/formData/list', - method: 'get', - params: query - }) -} -export function listFlowForm(query) { - return request({ - url: '/hrm/flow/form/list', - method: 'get', - params: query - }) -} -export function getFlowForm(formId) { - return request({ - url: `/hrm/flow/form/${formId}`, - method: 'get' - }) -} -// 流程模板 -export function listFlowTemplate(query) { - return request({ - url: '/hrm/flow/template/list', - method: 'get', - params: query - }) -} -export function getFlowTemplate(tplId) { - return request({ - url: `/hrm/flow/template/${tplId}`, - method: 'get' - }) -} -export function addFlowTemplate(data) { - return request({ - url: '/hrm/flow/template', - method: 'post', - data - }) -} -export function updateFlowTemplate(data) { - return request({ - url: '/hrm/flow/template', - method: 'put', - data - }) -} -export function delFlowTemplate(tplIds) { - return request({ - url: `/hrm/flow/template/${tplIds}`, - method: 'delete' - }) -} -// 流程节点 -export function listFlowNode(query) { - return request({ - url: '/hrm/flow/node/list', - method: 'get', - params: query - }) -} -export function getFlowNode(nodeId) { - return request({ - url: `/hrm/flow/node/${nodeId}`, - method: 'get' - }) -} -export function addFlowNode(data) { - return request({ - url: '/hrm/flow/node', - method: 'post', - data - }) -} -export function updateFlowNode(data) { - return request({ - url: '/hrm/flow/node', - method: 'put', - data - }) -} -export function delFlowNode(nodeIds) { - return request({ - url: `/hrm/flow/node/${nodeIds}`, - method: 'delete' - }) -} - -// 薪酬 -export function listPayPlan(query) { - return request({ - url: '/hrm/pay/plan/list', - method: 'get', - params: query - }) -} -export function getPayPlan(planId) { - return request({ - url: `/hrm/pay/plan/${planId}`, - method: 'get' - }) -} -export function addPayPlan(data) { - return request({ - url: '/hrm/pay/plan', - method: 'post', - data - }) -} -export function updatePayPlan(data) { - return request({ - url: '/hrm/pay/plan', - method: 'put', - data - }) -} -export function delPayPlan(planIds) { - return request({ - url: `/hrm/pay/plan/${planIds}`, - method: 'delete' - }) -} -export function listPayRun(query) { - return request({ - url: '/hrm/pay/run/list', - method: 'get', - params: query - }) -} -export function getPayRun(runId) { - return request({ - url: `/hrm/pay/run/${runId}`, - method: 'get' - }) -} -export function addPayRun(data) { - return request({ - url: '/hrm/pay/run', - method: 'post', - data - }) -} -export function updatePayRun(data) { - return request({ - url: '/hrm/pay/run', - method: 'put', - data - }) -} -export function delPayRun(runIds) { - return request({ - url: `/hrm/pay/run/${runIds}`, - method: 'delete' - }) -} -export function listPayslip(query) { - return request({ - url: '/hrm/payslip/list', - method: 'get', - params: query - }) -} -export function getPayslip(slipId) { - return request({ - url: `/hrm/payslip/${slipId}`, - method: 'get' - }) -} -export function addPayslip(data) { - return request({ - url: '/hrm/payslip', - method: 'post', - data - }) -} -export function updatePayslip(data) { - return request({ - url: '/hrm/payslip', - method: 'put', - data - }) -} -export function delPayslip(slipIds) { - return request({ - url: `/hrm/payslip/${slipIds}`, - method: 'delete' - }) -} - -// 指标快照 -export function listStatSnapshot(query) { - return request({ - url: '/hrm/pay/stat/list', - method: 'get', - params: query - }) -} +// 导出所有 HRM 模块 API +export * from './employee' +export * from './org' +export * from './certContract' +export * from './empOrgPosition' +export * from './gradePosition' +export * from './attendance' +export * from './leave' +export * from './travel' +export * from './seal' +export * from './reimburse' +export * from './flow' diff --git a/klp-ui/src/api/hrm/leave.js b/klp-ui/src/api/hrm/leave.js new file mode 100644 index 00000000..3249b263 --- /dev/null +++ b/klp-ui/src/api/hrm/leave.js @@ -0,0 +1,48 @@ +import request from '@/utils/request' + +// 请假单 +export function listLeaveReq(query) { + return request({ + url: '/hrm/leave/req/list', + method: 'get', + params: query + }) +} + +export function getLeaveReq(bizId) { + return request({ + url: `/hrm/leave/req/${bizId}`, + method: 'get' + }) +} + +export function addLeaveReq(data) { + return request({ + url: '/hrm/leave/req', + method: 'post', + data + }) +} + +export function editLeaveReq(data) { + return request({ + url: '/hrm/leave/req', + method: 'put', + data + }) +} + +export function delLeaveReq(bizIds) { + return request({ + url: `/hrm/leave/req/${bizIds}`, + method: 'delete' + }) +} + +export function allLeaveReq(query) { + return request({ + url: '/hrm/leave/req/all', + method: 'get', + params: query + }) +} diff --git a/klp-ui/src/api/hrm/org.js b/klp-ui/src/api/hrm/org.js new file mode 100644 index 00000000..d15e74aa --- /dev/null +++ b/klp-ui/src/api/hrm/org.js @@ -0,0 +1,49 @@ +import request from '@/utils/request' + +// 组织 +export function listOrg(query) { + return request({ + url: '/hrm/org/list', + method: 'get', + params: query + }) +} + +export function allOrg(query) { + return request({ + url: '/hrm/org/all', + method: 'get', + params: query + }) +} + +export function addOrg(data) { + return request({ + url: '/hrm/org', + method: 'post', + data + }) +} + +export function updateOrg(data) { + return request({ + url: '/hrm/org', + method: 'put', + data + }) +} + +export function delOrg(orgIds) { + return request({ + url: `/hrm/org/${orgIds}`, + method: 'delete' + }) +} + +export function getOrg(orgId) { + return request({ + url: `/hrm/org/${orgId}`, + method: 'get' + }) +} + diff --git a/klp-ui/src/api/hrm/reimburse.js b/klp-ui/src/api/hrm/reimburse.js new file mode 100644 index 00000000..67f21591 --- /dev/null +++ b/klp-ui/src/api/hrm/reimburse.js @@ -0,0 +1,49 @@ +import request from '@/utils/request' + +// 日常报销单 +export function listReimburseReq(query) { + return request({ + url: '/hrm/reimburse/list', + method: 'get', + params: query + }) +} + +export function getReimburseReq(bizId) { + return request({ + url: `/hrm/reimburse/${bizId}`, + method: 'get' + }) +} + +export function addReimburseReq(data) { + return request({ + url: '/hrm/reimburse', + method: 'post', + data + }) +} + +export function editReimburseReq(data) { + return request({ + url: '/hrm/reimburse', + method: 'put', + data + }) +} + +export function delReimburseReq(bizIds) { + return request({ + url: `/hrm/reimburse/${bizIds}`, + method: 'delete' + }) +} + +export function allReimburseReq(query) { + return request({ + url: '/hrm/reimburse/all', + method: 'get', + params: query + }) +} + diff --git a/klp-ui/src/api/hrm/seal.js b/klp-ui/src/api/hrm/seal.js new file mode 100644 index 00000000..0d427787 --- /dev/null +++ b/klp-ui/src/api/hrm/seal.js @@ -0,0 +1,99 @@ +import request from '@/utils/request' + +// 用印申请 +export function listSealReq(query) { + return request({ + url: '/hrm/seal/list', + method: 'get', + params: query + }) +} + +export function getSealReq(bizId) { + return request({ + url: `/hrm/seal/${bizId}`, + method: 'get' + }) +} + +export function addSealReq(data) { + return request({ + url: '/hrm/seal', + method: 'post', + data + }) +} + +export function editSealReq(data) { + return request({ + url: '/hrm/seal', + method: 'put', + data + }) +} + +export function delSealReq(bizIds) { + return request({ + url: `/hrm/seal/${bizIds}`, + method: 'delete' + }) +} + +export function approveSealReq(bizId) { + return request({ + url: `/hrm/seal/${bizId}/approve`, + method: 'post' + }) +} + +export function rejectSealReq(bizId) { + return request({ + url: `/hrm/seal/${bizId}/reject`, + method: 'post' + }) +} + +export function cancelSealReq(bizId) { + return request({ + url: `/hrm/seal/${bizId}/cancel`, + method: 'post' + }) +} + +export function stampSealJava(bizId, data) { + // 确保数据正确序列化,特别是 0 值 + const payload = { + targetFileUrl: String(data.targetFileUrl || ''), + stampImageUrl: String(data.stampImageUrl || ''), + pageNo: Number(data.pageNo) || 1, + xPx: Number(data.xPx) || 0, + yPx: Number(data.yPx) || 0, + viewportWidth: data.viewportWidth !== undefined && data.viewportWidth !== null ? Number(data.viewportWidth) : undefined, + viewportHeight: data.viewportHeight !== undefined && data.viewportHeight !== null ? Number(data.viewportHeight) : undefined + } + // 可选字段 + if (data.widthPx !== undefined && data.widthPx !== null) { + payload.widthPx = Number(data.widthPx) + } + if (data.heightPx !== undefined && data.heightPx !== null) { + payload.heightPx = Number(data.heightPx) + } + // viewportWidth/Height:如果是 undefined 则不传(兼容后端校验) + if (payload.viewportWidth === undefined) delete payload.viewportWidth + if (payload.viewportHeight === undefined) delete payload.viewportHeight + console.log('stampSealJava API call, payload:', JSON.stringify(payload, null, 2)) + console.log('yPx in API:', typeof payload.yPx, payload.yPx) + return request({ + url: `/hrm/seal/${bizId}/stamp/java`, + method: 'post', + data: payload + }) +} + +export function stampSealPython(bizId, data) { + return request({ + url: `/hrm/seal/${bizId}/stamp/python`, + method: 'post', + data + }) +} diff --git a/klp-ui/src/api/hrm/travel.js b/klp-ui/src/api/hrm/travel.js new file mode 100644 index 00000000..64548377 --- /dev/null +++ b/klp-ui/src/api/hrm/travel.js @@ -0,0 +1,48 @@ +import request from '@/utils/request' + +// 出差单 +export function listTravelReq(query) { + return request({ + url: '/hrm/travel/list', + method: 'get', + params: query + }) +} + +export function getTravelReq(bizId) { + return request({ + url: `/hrm/travel/${bizId}`, + method: 'get' + }) +} + +export function addTravelReq(data) { + return request({ + url: '/hrm/travel', + method: 'post', + data + }) +} + +export function editTravelReq(data) { + return request({ + url: '/hrm/travel', + method: 'put', + data + }) +} + +export function delTravelReq(bizIds) { + return request({ + url: `/hrm/travel/${bizIds}`, + method: 'delete' + }) +} + +export function allTravelReq(query) { + return request({ + url: '/hrm/travel/all', + method: 'get', + params: query + }) +} diff --git a/klp-ui/src/api/system/dept.js b/klp-ui/src/api/system/dept.js index 331c4b2c..1905bb07 100644 --- a/klp-ui/src/api/system/dept.js +++ b/klp-ui/src/api/system/dept.js @@ -50,3 +50,11 @@ export function delDept(deptId) { method: 'delete' }) } + +// 查询部门下拉树结构 +export function treeselect() { + return request({ + url: '/system/dept/treeselect', + method: 'get' + }) +} diff --git a/klp-ui/src/api/system/oss.js b/klp-ui/src/api/system/oss.js index 7d800260..8a7317dd 100644 --- a/klp-ui/src/api/system/oss.js +++ b/klp-ui/src/api/system/oss.js @@ -9,10 +9,12 @@ export function listOss(query) { }) } -// 查询OSS对象基于id串 -export function listByIds(ossId) { +// 查询OSS对象基于id串(支持多个ID,用逗号分隔或数组) +export function listByIds(ossIds) { + // 如果是数组,转换为逗号分隔的字符串 + const ids = Array.isArray(ossIds) ? ossIds.join(',') : ossIds return request({ - url: '/system/oss/listByIds/' + ossId, + url: '/system/oss/listByIds/' + ids, method: 'get' }) } diff --git a/klp-ui/src/components/PdfStamper/index.vue b/klp-ui/src/components/PdfStamper/index.vue new file mode 100644 index 00000000..f470507a --- /dev/null +++ b/klp-ui/src/components/PdfStamper/index.vue @@ -0,0 +1,231 @@ + + + + + + diff --git a/klp-ui/src/components/userSelect/multi.vue b/klp-ui/src/components/userSelect/multi.vue index c0a9ba8a..a97bed1a 100644 --- a/klp-ui/src/components/userSelect/multi.vue +++ b/klp-ui/src/components/userSelect/multi.vue @@ -1,13 +1,14 @@