From 8b87ecb40109272065d8bbdc3ccefa1deefbd88f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E6=A0=8B?= Date: Thu, 14 Aug 2025 15:27:58 +0800 Subject: [PATCH] =?UTF-8?q?Lee-=E8=8C=B6=E7=99=BE=E9=81=93=E4=BA=8C?= =?UTF-8?q?=E5=BC=80=E9=9C=80=E6=B1=82=E6=95=B4=E5=90=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../action/FormatChangeFilesAction.java | 125 ++++ .../employee/mapper/FormatChangeMapper.java | 19 + .../action/BankCardRecognitionAction.java | 99 +++ .../action/EmailAccountGenerateAction.java | 109 +++ .../entry/action/FormatEntryFilesAction.java | 127 ++++ .../entry/action/IDCardRecognitionAction.java | 295 ++++++++ .../entry/action/PermissionDetailAction.java | 176 +++++ .../action/PermissionTransferAction.java | 201 ++++++ .../controller/EntryManageController.java | 39 ++ .../entry/entity/FileUploadLoad.java | 93 +++ .../entity/PermissionTransferModule.java | 67 ++ .../seconddev/entry/entity/RoleDetail.java | 28 + .../seconddev/entry/enums/FileUploadType.java | 46 ++ .../mapper/EmailAccountGenerateMapper.java | 18 + .../entry/mapper/EntryManageMapper.java | 23 + .../entry/mapper/FormatEntryFilesMapper.java | 18 + .../entry/mapper/ResignationApplyMapper.java | 26 + .../entry/service/EntryManageService.java | 29 + .../service/impl/EntryManageServiceImpl.java | 215 ++++++ .../constant/ApplicationConfigConstant.java | 39 ++ .../controller/EmployeePortalController.java | 43 ++ .../controller/HrbpPortalController.java | 45 ++ .../controller/LeaderCockpitController.java | 62 ++ .../controller/ManagerPortalController.java | 80 +++ .../controller/SscPortalController.java | 34 + .../portal/entity/bo/EmployeeStaffBo.java | 41 ++ .../portal/entity/component/Option.java | 20 + .../portal/entity/param/BaseParam.java | 48 ++ .../entity/param/BasicPersonnelParam.java | 36 + .../entity/param/EmployeePortalParam.java | 15 + .../portal/entity/param/HrbpParam.java | 17 + .../entity/param/SearchConditionParam.java | 27 + .../portal/entity/param/SscParam.java | 18 + .../portal/entity/po/EmployeeBasicInfoPo.java | 94 +++ .../entity/po/ExpirationReminderPo.java | 37 + .../portal/entity/po/LateAndEarlyRankPo.java | 17 + .../portal/entity/po/PieChartConfig.java | 19 + .../portal/entity/po/PortalData.java | 20 + .../seconddev/portal/entity/po/PortalPO.java | 15 + .../portal/entity/po/PortalUrlDetail.java | 16 + .../seconddev/portal/entity/po/Position.java | 18 + .../portal/entity/po/TeamEmployeePo.java | 52 ++ .../portal/entity/po/cfg/EmployeeStaff.java | 95 +++ .../portal/entity/po/cfg/FormDatas.java | 28 + .../portal/entity/po/cfg/FormDatasDetail.java | 34 + .../portal/entity/po/cfg/MonthWrapper.java | 14 + .../portal/entity/po/cfg/OrgItem.java | 14 + .../portal/entity/po/cfg/OrgWrapper.java | 16 + .../portal/entity/po/cfg/OverCtrlWrapper.java | 14 + .../entity/po/cfg/QuickSearchDatas.java | 4 + .../portal/enums/PersonnelStatusEnum.java | 60 ++ .../mapper/dictionary/DataConvertMapper.java | 31 + .../mapper/portal/EbuilderBaseMapper.java | 56 ++ .../mapper/portal/EmployeePortalMapper.java | 13 + .../mapper/portal/EteamsBaseMapper.java | 33 + .../mapper/portal/HrbpPortalMapper.java | 126 ++++ .../mapper/portal/LeaderCockpitMapper.java | 121 ++++ .../mapper/portal/ManagerPortalMapper.java | 181 +++++ .../portal/mapper/portal/PortalMapper.java | 17 + .../portal/mapper/portal/SscPortalMapper.java | 47 ++ .../portal/service/EmployeePortalService.java | 30 + .../portal/service/HrbpPortalService.java | 37 + .../portal/service/LeaderCockpitService.java | 75 ++ .../portal/service/ManagerPortalService.java | 93 +++ .../portal/service/SscPortalService.java | 21 + .../impl/EmployeePortalServiceImpl.java | 207 ++++++ .../service/impl/HrbpPortalServiceImpl.java | 120 ++++ .../impl/LeaderCockpitServiceImpl.java | 373 ++++++++++ .../impl/ManagerPortalServiceImpl.java | 660 ++++++++++++++++++ .../service/impl/SscPortalServiceImpl.java | 65 ++ .../portal/util/ChineseNameToPinyin.java | 349 +++++++++ .../seconddev/portal/util/DateUtil.java | 327 +++++++++ .../seconddev/portal/util/PapiUtil.java | 67 ++ .../seconddev/portal/util/StringUtil.java | 36 + .../staff/action/StaffCheckAction.java | 98 +++ .../mapper/dictionary/DataConvertMapper.xml | 18 + .../employee/action/FormatChangeMapper.xml | 14 + .../action/EmailAccountGenerateMapper.xml | 21 + .../entry/action/FormatEntryFilesMapper.xml | 14 + .../mapper/entry/mapper/EntryManageMapper.xml | 10 + .../entry/mapper/ResignationApplyMapper.xml | 50 ++ .../mapper/portal/EbuilderBaseMapper.xml | 37 + .../mapper/portal/EmployeePortalMapper.xml | 5 + .../mapper/portal/EteamsBaseMapper.xml | 18 + .../mapper/portal/HrbpPortalMapper.xml | 178 +++++ .../mapper/portal/LeaderCockpitMapper.xml | 155 ++++ .../mapper/portal/ManagerPortalMapper.xml | 447 ++++++++++++ .../resources/mapper/portal/PortalMapper.xml | 13 + .../mapper/portal/SscPortalMapper.xml | 66 ++ .../chapanda/controller/DemoController.java | 27 - .../chapanda/entity/dto/RecordDetailDTO.java | 36 + .../chapanda/entity/po/EbFieldInfo.java | 145 ++++ .../mapper/AttendStatusDetailMapper.java | 10 +- .../seconddev/chapanda/mapper/DemoMapper.java | 13 - .../chapanda/mapper/RecordDetailMapper.java | 18 + .../chapanda/service/MybatisDemoService.java | 18 - .../service/impl/MybatisDemoServiceImpl.java | 27 - .../service/impl/PageDemoServiceImpl.java | 118 ---- .../trigger/AttendConfChangeEscheduler.java | 145 ++-- .../trigger/AttendConfChangeToEBJob.java | 172 +++++ .../dao/AttendStatusDetailMapper .xml | 48 +- .../seconddev/dao/EmployeeAttendMapper.xml | 1 - .../seconddev/dao/RecordDetailMapper .xml | 60 ++ settings.gradle | 4 +- 104 files changed, 7643 insertions(+), 273 deletions(-) create mode 100644 secondev-chabaidao-portal/src/main/java/com/weaver/seconddev/employee/action/FormatChangeFilesAction.java create mode 100644 secondev-chabaidao-portal/src/main/java/com/weaver/seconddev/employee/mapper/FormatChangeMapper.java create mode 100644 secondev-chabaidao-portal/src/main/java/com/weaver/seconddev/entry/action/BankCardRecognitionAction.java create mode 100644 secondev-chabaidao-portal/src/main/java/com/weaver/seconddev/entry/action/EmailAccountGenerateAction.java create mode 100644 secondev-chabaidao-portal/src/main/java/com/weaver/seconddev/entry/action/FormatEntryFilesAction.java create mode 100644 secondev-chabaidao-portal/src/main/java/com/weaver/seconddev/entry/action/IDCardRecognitionAction.java create mode 100644 secondev-chabaidao-portal/src/main/java/com/weaver/seconddev/entry/action/PermissionDetailAction.java create mode 100644 secondev-chabaidao-portal/src/main/java/com/weaver/seconddev/entry/action/PermissionTransferAction.java create mode 100644 secondev-chabaidao-portal/src/main/java/com/weaver/seconddev/entry/controller/EntryManageController.java create mode 100644 secondev-chabaidao-portal/src/main/java/com/weaver/seconddev/entry/entity/FileUploadLoad.java create mode 100644 secondev-chabaidao-portal/src/main/java/com/weaver/seconddev/entry/entity/PermissionTransferModule.java create mode 100644 secondev-chabaidao-portal/src/main/java/com/weaver/seconddev/entry/entity/RoleDetail.java create mode 100644 secondev-chabaidao-portal/src/main/java/com/weaver/seconddev/entry/enums/FileUploadType.java create mode 100644 secondev-chabaidao-portal/src/main/java/com/weaver/seconddev/entry/mapper/EmailAccountGenerateMapper.java create mode 100644 secondev-chabaidao-portal/src/main/java/com/weaver/seconddev/entry/mapper/EntryManageMapper.java create mode 100644 secondev-chabaidao-portal/src/main/java/com/weaver/seconddev/entry/mapper/FormatEntryFilesMapper.java create mode 100644 secondev-chabaidao-portal/src/main/java/com/weaver/seconddev/entry/mapper/ResignationApplyMapper.java create mode 100644 secondev-chabaidao-portal/src/main/java/com/weaver/seconddev/entry/service/EntryManageService.java create mode 100644 secondev-chabaidao-portal/src/main/java/com/weaver/seconddev/entry/service/impl/EntryManageServiceImpl.java create mode 100644 secondev-chabaidao-portal/src/main/java/com/weaver/seconddev/portal/constant/ApplicationConfigConstant.java create mode 100644 secondev-chabaidao-portal/src/main/java/com/weaver/seconddev/portal/controller/EmployeePortalController.java create mode 100644 secondev-chabaidao-portal/src/main/java/com/weaver/seconddev/portal/controller/HrbpPortalController.java create mode 100644 secondev-chabaidao-portal/src/main/java/com/weaver/seconddev/portal/controller/LeaderCockpitController.java create mode 100644 secondev-chabaidao-portal/src/main/java/com/weaver/seconddev/portal/controller/ManagerPortalController.java create mode 100644 secondev-chabaidao-portal/src/main/java/com/weaver/seconddev/portal/controller/SscPortalController.java create mode 100644 secondev-chabaidao-portal/src/main/java/com/weaver/seconddev/portal/entity/bo/EmployeeStaffBo.java create mode 100644 secondev-chabaidao-portal/src/main/java/com/weaver/seconddev/portal/entity/component/Option.java create mode 100644 secondev-chabaidao-portal/src/main/java/com/weaver/seconddev/portal/entity/param/BaseParam.java create mode 100644 secondev-chabaidao-portal/src/main/java/com/weaver/seconddev/portal/entity/param/BasicPersonnelParam.java create mode 100644 secondev-chabaidao-portal/src/main/java/com/weaver/seconddev/portal/entity/param/EmployeePortalParam.java create mode 100644 secondev-chabaidao-portal/src/main/java/com/weaver/seconddev/portal/entity/param/HrbpParam.java create mode 100644 secondev-chabaidao-portal/src/main/java/com/weaver/seconddev/portal/entity/param/SearchConditionParam.java create mode 100644 secondev-chabaidao-portal/src/main/java/com/weaver/seconddev/portal/entity/param/SscParam.java create mode 100644 secondev-chabaidao-portal/src/main/java/com/weaver/seconddev/portal/entity/po/EmployeeBasicInfoPo.java create mode 100644 secondev-chabaidao-portal/src/main/java/com/weaver/seconddev/portal/entity/po/ExpirationReminderPo.java create mode 100644 secondev-chabaidao-portal/src/main/java/com/weaver/seconddev/portal/entity/po/LateAndEarlyRankPo.java create mode 100644 secondev-chabaidao-portal/src/main/java/com/weaver/seconddev/portal/entity/po/PieChartConfig.java create mode 100644 secondev-chabaidao-portal/src/main/java/com/weaver/seconddev/portal/entity/po/PortalData.java create mode 100644 secondev-chabaidao-portal/src/main/java/com/weaver/seconddev/portal/entity/po/PortalPO.java create mode 100644 secondev-chabaidao-portal/src/main/java/com/weaver/seconddev/portal/entity/po/PortalUrlDetail.java create mode 100644 secondev-chabaidao-portal/src/main/java/com/weaver/seconddev/portal/entity/po/Position.java create mode 100644 secondev-chabaidao-portal/src/main/java/com/weaver/seconddev/portal/entity/po/TeamEmployeePo.java create mode 100644 secondev-chabaidao-portal/src/main/java/com/weaver/seconddev/portal/entity/po/cfg/EmployeeStaff.java create mode 100644 secondev-chabaidao-portal/src/main/java/com/weaver/seconddev/portal/entity/po/cfg/FormDatas.java create mode 100644 secondev-chabaidao-portal/src/main/java/com/weaver/seconddev/portal/entity/po/cfg/FormDatasDetail.java create mode 100644 secondev-chabaidao-portal/src/main/java/com/weaver/seconddev/portal/entity/po/cfg/MonthWrapper.java create mode 100644 secondev-chabaidao-portal/src/main/java/com/weaver/seconddev/portal/entity/po/cfg/OrgItem.java create mode 100644 secondev-chabaidao-portal/src/main/java/com/weaver/seconddev/portal/entity/po/cfg/OrgWrapper.java create mode 100644 secondev-chabaidao-portal/src/main/java/com/weaver/seconddev/portal/entity/po/cfg/OverCtrlWrapper.java create mode 100644 secondev-chabaidao-portal/src/main/java/com/weaver/seconddev/portal/entity/po/cfg/QuickSearchDatas.java create mode 100644 secondev-chabaidao-portal/src/main/java/com/weaver/seconddev/portal/enums/PersonnelStatusEnum.java create mode 100644 secondev-chabaidao-portal/src/main/java/com/weaver/seconddev/portal/mapper/dictionary/DataConvertMapper.java create mode 100644 secondev-chabaidao-portal/src/main/java/com/weaver/seconddev/portal/mapper/portal/EbuilderBaseMapper.java create mode 100644 secondev-chabaidao-portal/src/main/java/com/weaver/seconddev/portal/mapper/portal/EmployeePortalMapper.java create mode 100644 secondev-chabaidao-portal/src/main/java/com/weaver/seconddev/portal/mapper/portal/EteamsBaseMapper.java create mode 100644 secondev-chabaidao-portal/src/main/java/com/weaver/seconddev/portal/mapper/portal/HrbpPortalMapper.java create mode 100644 secondev-chabaidao-portal/src/main/java/com/weaver/seconddev/portal/mapper/portal/LeaderCockpitMapper.java create mode 100644 secondev-chabaidao-portal/src/main/java/com/weaver/seconddev/portal/mapper/portal/ManagerPortalMapper.java create mode 100644 secondev-chabaidao-portal/src/main/java/com/weaver/seconddev/portal/mapper/portal/PortalMapper.java create mode 100644 secondev-chabaidao-portal/src/main/java/com/weaver/seconddev/portal/mapper/portal/SscPortalMapper.java create mode 100644 secondev-chabaidao-portal/src/main/java/com/weaver/seconddev/portal/service/EmployeePortalService.java create mode 100644 secondev-chabaidao-portal/src/main/java/com/weaver/seconddev/portal/service/HrbpPortalService.java create mode 100644 secondev-chabaidao-portal/src/main/java/com/weaver/seconddev/portal/service/LeaderCockpitService.java create mode 100644 secondev-chabaidao-portal/src/main/java/com/weaver/seconddev/portal/service/ManagerPortalService.java create mode 100644 secondev-chabaidao-portal/src/main/java/com/weaver/seconddev/portal/service/SscPortalService.java create mode 100644 secondev-chabaidao-portal/src/main/java/com/weaver/seconddev/portal/service/impl/EmployeePortalServiceImpl.java create mode 100644 secondev-chabaidao-portal/src/main/java/com/weaver/seconddev/portal/service/impl/HrbpPortalServiceImpl.java create mode 100644 secondev-chabaidao-portal/src/main/java/com/weaver/seconddev/portal/service/impl/LeaderCockpitServiceImpl.java create mode 100644 secondev-chabaidao-portal/src/main/java/com/weaver/seconddev/portal/service/impl/ManagerPortalServiceImpl.java create mode 100644 secondev-chabaidao-portal/src/main/java/com/weaver/seconddev/portal/service/impl/SscPortalServiceImpl.java create mode 100644 secondev-chabaidao-portal/src/main/java/com/weaver/seconddev/portal/util/ChineseNameToPinyin.java create mode 100644 secondev-chabaidao-portal/src/main/java/com/weaver/seconddev/portal/util/DateUtil.java create mode 100644 secondev-chabaidao-portal/src/main/java/com/weaver/seconddev/portal/util/PapiUtil.java create mode 100644 secondev-chabaidao-portal/src/main/java/com/weaver/seconddev/portal/util/StringUtil.java create mode 100644 secondev-chabaidao-portal/src/main/java/com/weaver/seconddev/staff/action/StaffCheckAction.java create mode 100644 secondev-chabaidao-portal/src/main/resources/mapper/dictionary/DataConvertMapper.xml create mode 100644 secondev-chabaidao-portal/src/main/resources/mapper/employee/action/FormatChangeMapper.xml create mode 100644 secondev-chabaidao-portal/src/main/resources/mapper/entry/action/EmailAccountGenerateMapper.xml create mode 100644 secondev-chabaidao-portal/src/main/resources/mapper/entry/action/FormatEntryFilesMapper.xml create mode 100644 secondev-chabaidao-portal/src/main/resources/mapper/entry/mapper/EntryManageMapper.xml create mode 100644 secondev-chabaidao-portal/src/main/resources/mapper/entry/mapper/ResignationApplyMapper.xml create mode 100644 secondev-chabaidao-portal/src/main/resources/mapper/portal/EbuilderBaseMapper.xml create mode 100644 secondev-chabaidao-portal/src/main/resources/mapper/portal/EmployeePortalMapper.xml create mode 100644 secondev-chabaidao-portal/src/main/resources/mapper/portal/EteamsBaseMapper.xml create mode 100644 secondev-chabaidao-portal/src/main/resources/mapper/portal/HrbpPortalMapper.xml create mode 100644 secondev-chabaidao-portal/src/main/resources/mapper/portal/LeaderCockpitMapper.xml create mode 100644 secondev-chabaidao-portal/src/main/resources/mapper/portal/ManagerPortalMapper.xml create mode 100644 secondev-chabaidao-portal/src/main/resources/mapper/portal/PortalMapper.xml create mode 100644 secondev-chabaidao-portal/src/main/resources/mapper/portal/SscPortalMapper.xml delete mode 100644 secondev-chapanda-attend/src/main/java/com/weaver/seconddev/chapanda/controller/DemoController.java create mode 100644 secondev-chapanda-attend/src/main/java/com/weaver/seconddev/chapanda/entity/dto/RecordDetailDTO.java create mode 100644 secondev-chapanda-attend/src/main/java/com/weaver/seconddev/chapanda/entity/po/EbFieldInfo.java delete mode 100644 secondev-chapanda-attend/src/main/java/com/weaver/seconddev/chapanda/mapper/DemoMapper.java create mode 100644 secondev-chapanda-attend/src/main/java/com/weaver/seconddev/chapanda/mapper/RecordDetailMapper.java delete mode 100644 secondev-chapanda-attend/src/main/java/com/weaver/seconddev/chapanda/service/MybatisDemoService.java delete mode 100644 secondev-chapanda-attend/src/main/java/com/weaver/seconddev/chapanda/service/impl/MybatisDemoServiceImpl.java delete mode 100644 secondev-chapanda-attend/src/main/java/com/weaver/seconddev/chapanda/service/impl/PageDemoServiceImpl.java create mode 100644 secondev-chapanda-attend/src/main/java/com/weaver/seconddev/chapanda/trigger/AttendConfChangeToEBJob.java create mode 100644 secondev-chapanda-attend/src/main/resources/mapper/com/weaver/seconddev/dao/RecordDetailMapper .xml diff --git a/secondev-chabaidao-portal/src/main/java/com/weaver/seconddev/employee/action/FormatChangeFilesAction.java b/secondev-chabaidao-portal/src/main/java/com/weaver/seconddev/employee/action/FormatChangeFilesAction.java new file mode 100644 index 0000000..1e27afd --- /dev/null +++ b/secondev-chabaidao-portal/src/main/java/com/weaver/seconddev/employee/action/FormatChangeFilesAction.java @@ -0,0 +1,125 @@ +package com.weaver.seconddev.employee.action; + +import cn.hutool.core.convert.Convert; +import com.alibaba.fastjson.JSON; +import com.weaver.common.base.entity.result.WeaResult; +import com.weaver.esb.api.rpc.EsbServerlessRpcRemoteInterface; +import com.weaver.eteams.file.client.file.FileObj; +import com.weaver.eteams.file.client.remote.FileClientService; +import com.weaver.seconddev.employee.mapper.FormatChangeMapper; +import com.weaver.seconddev.portal.entity.param.BaseParam; +import com.weaver.seconddev.portal.util.DateUtil; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.util.Date; +import java.util.Map; + +/** + * @author:dxfeng + * @createTime: 2025/08/08 + * @version: 1.0 + */ +@Slf4j +@Service("FormatChangeFilesAction") +public class FormatChangeFilesAction implements EsbServerlessRpcRemoteInterface { + + @Autowired + FormatChangeMapper formatEntryFilesMapper; + + @Autowired + FileClientService fileClientService; + + @Override + public WeaResult> execute(Map params) { + log.error("params=>:{}", params); + Long rzjlid = Convert.toLong(params.get("rzjlid")); + log.error("rzjlid=>:{}", rzjlid); + if (null == rzjlid) { + return WeaResult.success(); + } + // 查询入职管理表数据信息 + BaseParam baseParam = new BaseParam(); + Map entryRecord = formatEntryFilesMapper.getChangeRecord(baseParam, rzjlid); + if (entryRecord.isEmpty()) { + log.error("entryRecord is null,{}", params); + return WeaResult.success(); + } + log.error("entryRecord=>:{}", JSON.toJSONString(entryRecord)); + String username = Convert.toStr(entryRecord.get("username")); + String jobNum = Convert.toStr(entryRecord.get("job_num")); + log.error("userName=={}", username); + log.error("jobNum=={}", jobNum); + if (StringUtils.isBlank(jobNum)) { + log.error("jobNum is null,{}", params); + return WeaResult.success(); + } + + String prefix = username + "-" + jobNum; + renameFile(Convert.toStr(entryRecord.get("sfzzpzfm")), prefix, "身份证正面"); + renameFile(Convert.toStr(entryRecord.get("sfzfmghm")), prefix, "身份证反面"); + renameFile(Convert.toStr(entryRecord.get("hzzp")), prefix, "护照"); + renameFile(Convert.toStr(entryRecord.get("zgxlbyzszp")), prefix, "学历证明"); + renameFile(Convert.toStr(entryRecord.get("xxzbs")), prefix, "半身形象照"); + renameFile(Convert.toStr(entryRecord.get("czycbdz")), prefix, "寸照"); + renameFile(Convert.toStr(entryRecord.get("yxkzm")), prefix, "银行卡"); + renameFile(Convert.toStr(entryRecord.get("tjbg")), prefix, "体检报告"); + renameFile(Convert.toStr(entryRecord.get("jkz")), prefix, "健康证"); + renameFile(Convert.toStr(entryRecord.get("sjdwlzzm")), prefix, "离职证明"); + renameFile(Convert.toStr(entryRecord.get("qtfj")), prefix, "其他附件"); + renameFile(Convert.toStr(entryRecord.get("sbzmwj")), prefix, "社保证明"); + renameFile(Convert.toStr(entryRecord.get("xwzszp")), prefix, "学位证书照片"); + + + return WeaResult.success(params); + } + + + /** + * 重命名文件 + * + * @param fileIds 文件ID + * @param prefix 前缀 + * @param fileName 文件名 + */ + private void renameFile(String fileIds, String prefix, String fileName) { + if (StringUtils.isBlank(fileIds)) { + return; + } + + int index = 1; + String[] split = fileIds.split(","); + if (split.length > 0) { + for (String s : split) { + Long fileId = Convert.toLong(s); + if (null == fileId) { + log.error("fileId is null,{}", s); + continue; + } + FileObj fileObj = fileClientService.get(fileId); + if (null == fileObj) { + log.error("fileObj is null,{}", fileId); + continue; + } + Date uploadTime = fileObj.getUploadTime(); + LocalDateTime localDate = DateUtil.toLocalDateTime(uploadTime); + if (null == localDate) { + localDate = DateUtil.toLocalDateTime(new Date()); + } + String formatDate = DateUtil.formatDateTime(localDate, DateTimeFormatter.ofPattern("yyyyMMddHHmm")); + int lastDotIndex = fileObj.getName().lastIndexOf("."); + String suffix = fileObj.getName().substring(lastDotIndex); + String newFileName = prefix + "-" + fileName + "-" + formatDate + suffix; + fileObj.setName(newFileName); + fileClientService.update(fileObj); + } + } + + } + + +} diff --git a/secondev-chabaidao-portal/src/main/java/com/weaver/seconddev/employee/mapper/FormatChangeMapper.java b/secondev-chabaidao-portal/src/main/java/com/weaver/seconddev/employee/mapper/FormatChangeMapper.java new file mode 100644 index 0000000..7e62a9a --- /dev/null +++ b/secondev-chabaidao-portal/src/main/java/com/weaver/seconddev/employee/mapper/FormatChangeMapper.java @@ -0,0 +1,19 @@ +package com.weaver.seconddev.employee.mapper; + +import com.weaver.seconddev.portal.entity.param.BaseParam; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; + +import java.util.Map; + +/** + * @author:dxfeng + * @createTime: 2025/08/08 + * @version: 1.0 + */ +@Mapper +public interface FormatChangeMapper { + + Map getChangeRecord(@Param("param") BaseParam param, @Param("id") Long id); + +} diff --git a/secondev-chabaidao-portal/src/main/java/com/weaver/seconddev/entry/action/BankCardRecognitionAction.java b/secondev-chabaidao-portal/src/main/java/com/weaver/seconddev/entry/action/BankCardRecognitionAction.java new file mode 100644 index 0000000..12976c6 --- /dev/null +++ b/secondev-chabaidao-portal/src/main/java/com/weaver/seconddev/entry/action/BankCardRecognitionAction.java @@ -0,0 +1,99 @@ +package com.weaver.seconddev.entry.action; + +import cn.hutool.core.convert.Convert; +import cn.hutool.core.io.IoUtil; +import cn.hutool.http.HttpRequest; +import cn.hutool.http.HttpResponse; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.weaver.common.base.entity.result.WeaResult; +import com.weaver.esb.api.rpc.EsbServerlessRpcRemoteInterface; +import com.weaver.eteams.file.client.file.FileData; +import com.weaver.eteams.file.client.file.FileObj; +import com.weaver.file.ud.api.FileDownloadService; +import com.weaver.seconddev.portal.constant.ApplicationConfigConstant; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.io.IOException; +import java.io.InputStream; +import java.util.HashMap; +import java.util.Map; + +/** + * @author:dxfeng + * @createTime: 2025/07/29 + * @version: 1.0 + */ +@Slf4j +@Service("bankCardRecognitionAction") +public class BankCardRecognitionAction implements EsbServerlessRpcRemoteInterface { + + @Autowired + FileDownloadService fileDownloadService; + + @Override + public WeaResult> execute(Map params) { + Map returnMap = new HashMap<>(); + Long fileId = Convert.toLong(params.get("fileId"), null); + log.error("fileId==" + fileId); + if (null == fileId) { + return WeaResult.success(returnMap); + } + FileData fileData = fileDownloadService.downloadFile(fileId); + FileObj fileObj = fileData.getFileObj(); + InputStream inputStream = fileData.getInputStream(); + String fileName = fileObj.getName(); + log.error("fileName==" + fileName); + try { + log.error("inputStream==" + inputStream.available()); + } catch (IOException e) { + log.error("inputStream获取异常", e); + throw new RuntimeException(e); + } + + String response = callBankCardOcrApi(inputStream, fileName); + log.error("response==" + response); + // 正面响应数据 + JSONObject jsonObject = JSONObject.parseObject(response); + if (jsonObject.getBoolean("isSuccess")) { + JSONObject data = jsonObject.getJSONObject("data"); + JSONArray resultArray = data.getJSONArray("result"); + if (resultArray.size() > 0) { + JSONObject result = resultArray.getJSONObject(0); + returnMap.put("org", result.get("org")); + returnMap.put("number", result.get("number")); + returnMap.put("valid_thru", result.get("valid_thru")); + returnMap.put("type", result.get("type")); + returnMap.put("valid_from", result.get("valid_from")); + returnMap.put("holder", result.get("holder")); + } + + } + log.error("returnMap==" + JSON.toJSONString(returnMap)); + return WeaResult.success(returnMap); + } + + /** + * 调用千里聆身份证识别接口 + * + * @param inputStream 文件输入流 + * @param fileName 文件名 + * @return + */ + public static String callBankCardOcrApi(InputStream inputStream, String fileName) { + byte[] bytes = IoUtil.readBytes(inputStream); + long currentTime = System.currentTimeMillis(); + HttpResponse response = HttpRequest.post(ApplicationConfigConstant.BANK_CARD_OCR_URL) + .header("Content-Type", "multipart/form-data") + .header("sign", IDCardRecognitionAction.getSign(currentTime)) + .header("appId", ApplicationConfigConstant.OCR_APP_ID) + .header("timestamp", String.valueOf(currentTime)) + .form("image_file", bytes, fileName) + .execute(); + return response.body(); + } + +} diff --git a/secondev-chabaidao-portal/src/main/java/com/weaver/seconddev/entry/action/EmailAccountGenerateAction.java b/secondev-chabaidao-portal/src/main/java/com/weaver/seconddev/entry/action/EmailAccountGenerateAction.java new file mode 100644 index 0000000..0994366 --- /dev/null +++ b/secondev-chabaidao-portal/src/main/java/com/weaver/seconddev/entry/action/EmailAccountGenerateAction.java @@ -0,0 +1,109 @@ +package com.weaver.seconddev.entry.action; + +import cn.hutool.core.convert.Convert; +import com.weaver.common.base.entity.result.WeaResult; +import com.weaver.esb.api.rpc.EsbServerlessRpcRemoteInterface; +import com.weaver.seconddev.entry.mapper.EmailAccountGenerateMapper; +import com.weaver.seconddev.portal.entity.param.BaseParam; +import com.weaver.seconddev.portal.util.ChineseNameToPinyin; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.HashMap; +import java.util.Map; + +/** + * @author:dxfeng + * @createTime: 2025/07/28 + * @version: 1.0 + */ +@Slf4j +@Service("emailAccountGenerateAction") +public class EmailAccountGenerateAction implements EsbServerlessRpcRemoteInterface { + private static final String EMAIL_DOMAIN = "@chabaidao.com"; + + @Autowired + EmailAccountGenerateMapper emailAccountGenerateMapper; + + BaseParam baseParam = new BaseParam(); + + @Override + public WeaResult> execute(Map params) { + // 获取参数 + String xm = Convert.toStr(params.get("xm"), ""); + Long requestId = Convert.toLong(params.get("requestId")); + + if (StringUtils.isBlank(xm)) { + return WeaResult.success(); + } + + // 生成基础邮箱账号 + String pinyinName = ChineseNameToPinyin.convertChineseNameToPinyin(xm); + + // 检查并生成唯一邮箱账号 + String uniqueEmail = generateUniqueEmail(pinyinName, requestId); + + Map dataMap = new HashMap<>(); + // 将生成的邮箱账号放入返回结果中 + dataMap.put("email", uniqueEmail); + return WeaResult.success(dataMap); + } + + /** + * 生成唯一的邮箱账号 + * + * @param pinyinName 拼音姓名 + * @return 唯一邮箱账号 + */ + private String generateUniqueEmail(String pinyinName, Long requestId) { + String baseEmail = pinyinName + EMAIL_DOMAIN; + + // 首先检查基础邮箱是否已存在 + if (!isEmailExists(baseEmail, requestId)) { + return baseEmail; + } + + // 如果基础邮箱已存在,则尝试添加数字后缀 + int suffix = 1; + String emailWithSuffix; + do { + emailWithSuffix = pinyinName + suffix + EMAIL_DOMAIN; + suffix++; + } while (isEmailExists(emailWithSuffix, requestId)); + + return emailWithSuffix; + } + + /** + * 检查入职管理表是否已存在相同邮箱 + * + * @param email 邮箱账号 + * @return 是否存在 + */ + private boolean isEmailExists(String email, Long requestId) { + Integer checkCount = emailAccountGenerateMapper.checkSameEmailAccount(baseParam, email, requestId); + log.error("检查入职表邮箱账号是否已存在: {}", email); + log.error("检查结果: {}", checkCount); + boolean isSame = checkCount != null && checkCount > 0; + if (isSame) { + return true; + } + return isEmailExists(email); + + } + + /** + * 校验花名册是否存在相同邮箱 + * + * @param email + * @return + */ + private boolean isEmailExists(String email) { + Integer checkCount = emailAccountGenerateMapper.checkEmployeeSameEmail(baseParam, email); + log.error("检查花名册邮箱账号是否已存在: {}", email); + log.error("检查结果: {}", checkCount); + return checkCount != null && checkCount > 0; + } +} diff --git a/secondev-chabaidao-portal/src/main/java/com/weaver/seconddev/entry/action/FormatEntryFilesAction.java b/secondev-chabaidao-portal/src/main/java/com/weaver/seconddev/entry/action/FormatEntryFilesAction.java new file mode 100644 index 0000000..faab70e --- /dev/null +++ b/secondev-chabaidao-portal/src/main/java/com/weaver/seconddev/entry/action/FormatEntryFilesAction.java @@ -0,0 +1,127 @@ +package com.weaver.seconddev.entry.action; + +import cn.hutool.core.convert.Convert; +import com.alibaba.fastjson.JSON; +import com.weaver.common.base.entity.result.WeaResult; +import com.weaver.esb.api.rpc.EsbServerlessRpcRemoteInterface; +import com.weaver.eteams.file.client.file.FileObj; +import com.weaver.eteams.file.client.remote.FileClientService; +import com.weaver.seconddev.entry.mapper.FormatEntryFilesMapper; +import com.weaver.seconddev.portal.entity.param.BaseParam; +import com.weaver.seconddev.portal.util.DateUtil; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.util.Date; +import java.util.Map; + +/** + * FormatEntryFilesActionGroup + * + * @author:dxfeng + * @createTime: 2025/07/30 + * @version: 1.0 + */ +@Slf4j +@Service("FormatEntryFilesAction") +public class FormatEntryFilesAction implements EsbServerlessRpcRemoteInterface { + + @Autowired + FormatEntryFilesMapper formatEntryFilesMapper; + + @Autowired + FileClientService fileClientService; + + @Override + public WeaResult> execute(Map params) { + log.error("params=>:{}", params); + Long rzjlid = Convert.toLong(params.get("rzjlid")); + log.error("rzjlid=>:{}", rzjlid); + if (null == rzjlid) { + return WeaResult.success(); + } + // 查询入职管理表数据信息 + BaseParam baseParam = new BaseParam(); + Map entryRecord = formatEntryFilesMapper.getEntryRecord(baseParam, rzjlid); + if (entryRecord.isEmpty()) { + log.error("entryRecord is null,{}", params); + return WeaResult.success(); + } + log.error("entryRecord=>:{}", JSON.toJSONString(entryRecord)); + String username = Convert.toStr(entryRecord.get("username")); + String jobNum = Convert.toStr(entryRecord.get("job_num")); + log.error("userName=={}", username); + log.error("jobNum=={}", jobNum); + if (StringUtils.isBlank(jobNum)) { + log.error("jobNum is null,{}", params); + return WeaResult.success(); + } + + String prefix = username + "-" + jobNum; + renameFile(Convert.toStr(entryRecord.get("sfzzpzfm")), prefix, "身份证正面"); + renameFile(Convert.toStr(entryRecord.get("sfzfmghm")), prefix, "身份证反面"); + renameFile(Convert.toStr(entryRecord.get("hzzp")), prefix, "护照"); + renameFile(Convert.toStr(entryRecord.get("zgxlbyzszp")), prefix, "学历证明"); + renameFile(Convert.toStr(entryRecord.get("xxzbs")), prefix, "半身形象照"); + renameFile(Convert.toStr(entryRecord.get("czycbdz")), prefix, "寸照"); + renameFile(Convert.toStr(entryRecord.get("yxkzm")), prefix, "银行卡"); + renameFile(Convert.toStr(entryRecord.get("tjbg")), prefix, "体检报告"); + renameFile(Convert.toStr(entryRecord.get("jkz")), prefix, "健康证"); + renameFile(Convert.toStr(entryRecord.get("sjdwlzzm")), prefix, "离职证明"); + renameFile(Convert.toStr(entryRecord.get("qtfj")), prefix, "其他附件"); + renameFile(Convert.toStr(entryRecord.get("sbzmwj")), prefix, "社保证明"); + renameFile(Convert.toStr(entryRecord.get("xwzszp")), prefix, "学位证书照片"); + + + return WeaResult.success(params); + } + + + /** + * 重命名文件 + * + * @param fileIds 文件ID + * @param prefix 前缀 + * @param fileName 文件名 + */ + private void renameFile(String fileIds, String prefix, String fileName) { + if (StringUtils.isBlank(fileIds)) { + return; + } + + int index = 1; + String[] split = fileIds.split(","); + if (split.length > 0) { + for (String s : split) { + Long fileId = Convert.toLong(s); + if (null == fileId) { + log.error("fileId is null,{}", s); + continue; + } + FileObj fileObj = fileClientService.get(fileId); + if (null == fileObj) { + log.error("fileObj is null,{}", fileId); + continue; + } + Date uploadTime = fileObj.getUploadTime(); + LocalDateTime localDate = DateUtil.toLocalDateTime(uploadTime); + if (null == localDate) { + localDate = DateUtil.toLocalDateTime(new Date()); + } + String formatDate = DateUtil.formatDateTime(localDate, DateTimeFormatter.ofPattern("yyyyMMddHHmm")); + int lastDotIndex = fileObj.getName().lastIndexOf("."); + String suffix = fileObj.getName().substring(lastDotIndex); + String newFileName = prefix + "-" + fileName + "-" + formatDate + suffix; + fileObj.setName(newFileName); + fileClientService.update(fileObj); + } + } + + } + + +} diff --git a/secondev-chabaidao-portal/src/main/java/com/weaver/seconddev/entry/action/IDCardRecognitionAction.java b/secondev-chabaidao-portal/src/main/java/com/weaver/seconddev/entry/action/IDCardRecognitionAction.java new file mode 100644 index 0000000..11effb7 --- /dev/null +++ b/secondev-chabaidao-portal/src/main/java/com/weaver/seconddev/entry/action/IDCardRecognitionAction.java @@ -0,0 +1,295 @@ +package com.weaver.seconddev.entry.action; + +import cn.hutool.core.convert.Convert; +import cn.hutool.core.io.IoUtil; +import cn.hutool.http.HttpRequest; +import cn.hutool.http.HttpResponse; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.weaver.common.base.entity.result.WeaResult; +import com.weaver.esb.api.rpc.EsbServerlessRpcRemoteInterface; +import com.weaver.eteams.file.client.file.FileData; +import com.weaver.eteams.file.client.file.FileObj; +import com.weaver.file.ud.api.FileDownloadService; +import com.weaver.seconddev.portal.constant.ApplicationConfigConstant; +import com.weaver.seconddev.portal.entity.param.BaseParam; +import com.weaver.seconddev.portal.mapper.dictionary.DataConvertMapper; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.math.BigInteger; +import java.nio.file.Files; +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; +import java.time.LocalDate; +import java.time.Period; +import java.time.format.DateTimeFormatter; +import java.util.HashMap; +import java.util.Map; + +/** + * @author:dxfeng + * @createTime: 2025/07/29 + * @version: 1.0 + */ +@Slf4j +@Service("idCardRecognitionAction") +public class IDCardRecognitionAction implements EsbServerlessRpcRemoteInterface { + + @Autowired + FileDownloadService fileDownloadService; + @Autowired + DataConvertMapper dataConvertMapper; + + BaseParam baseParam = new BaseParam(); + + @Override + public WeaResult> execute(Map params) { + Map returnMap = new HashMap<>(); + Long fileId = Convert.toLong(params.get("fileId"), null); + log.error("fileId==" + fileId); + String nationalityConvert = Convert.toStr(params.get("nationalityConvert"), ""); + log.error("nationalityConvert==" + nationalityConvert); + if (null == fileId) { + return WeaResult.success(returnMap); + } + FileData fileData = fileDownloadService.downloadFile(fileId); + FileObj fileObj = fileData.getFileObj(); + InputStream inputStream = fileData.getInputStream(); + String fileName = fileObj.getName(); + log.error("fileName==" + fileName); + try { + log.error("inputStream==" + inputStream.available()); + } catch (IOException e) { + log.error("inputStream获取异常", e); + throw new RuntimeException(e); + } + + String response = callIdCardOcrApi(inputStream, fileName); + // 正面响应数据 + //String response = "{\"isSuccess\": true, \"data\": {\"page_num\": \"1\", \"result\": [{\"姓名\": \"王某某\", \"性别\": \"男\", \"民族\": \"汉\", \"出生\": \"1989年3月21日\", \"住址\": \"上海市浦东新区塘桥街道蓝村路xxx号\", \"公民身份号码\": \"370112198903217890\", \"标签\": \"头像面\"}]}, \"status_code\": 5200}"; + log.error("response==" + response); + + JSONObject jsonObject = JSONObject.parseObject(response); + if (jsonObject.getBoolean("isSuccess")) { + JSONObject data = jsonObject.getJSONObject("data"); + JSONArray resultArray = data.getJSONArray("result"); + if (resultArray.size() > 0) { + JSONObject result = resultArray.getJSONObject(0); + returnMap.put("name", result.getString("姓名")); + returnMap.put("sex", result.getString("性别")); + String nation = result.getString("民族"); + if (StringUtils.isNotBlank(nation) && StringUtils.isNotBlank(nationalityConvert)) { + Long nationId = dataConvertMapper.getIdByName(baseParam, "nation", nation + "族"); + log.error("nationId==" + nationId); + nation = Convert.toStr(nationId, ""); + log.error("nation==" + nation); + + } + returnMap.put("nation", nation); + + returnMap.put("birthday", Convert.toStr(result.getString("出生"), "").replace("年", "-").replace("月", "-").replace("日", "-")); + returnMap.put("address", result.getString("住址")); + String idNumber = result.getString("公民身份号码"); + returnMap.put("idCard", idNumber); + // 根据身份证号,计算年龄、 性别 + if (StringUtils.isNotBlank(idNumber)) { + returnMap.put("age", getAge(idNumber)); + returnMap.put("gender", getGender(idNumber)); + } + + returnMap.put("issueAuthority", result.getString("签发机关")); + String validity = result.getString("有效期限"); + checkValidity(validity, returnMap); + returnMap.put("validity", validity); + } + }else{ + log.error("response==" + response); + return WeaResult.fail(500, jsonObject.getString("errorMsg"), true); + } + log.error("returnMap==" + JSON.toJSONString(returnMap)); + return WeaResult.success(returnMap); + } + + /** + * 调用千里聆身份证识别接口 + * + * @param inputStream 文件输入流 + * @param fileName 文件名 + * @return + */ + public static String callIdCardOcrApi(InputStream inputStream, String fileName) { + byte[] bytes = IoUtil.readBytes(inputStream); + long currentTime = System.currentTimeMillis(); + HttpResponse response = HttpRequest.post(ApplicationConfigConstant.ID_CARD_OCR_URL) + .header("Content-Type", "multipart/form-data") + .header("sign", getSign(currentTime)) + .header("appId", ApplicationConfigConstant.OCR_APP_ID) + .header("timestamp", String.valueOf(currentTime)) + .form("img", bytes, fileName) + .execute(); + return response.body(); + } + + /** + * 千里聆签名 + * + * @param timestamp 当前时间戳(毫秒数) + * @return + */ + public static String getSign(long timestamp) { + try { + MessageDigest md5 = MessageDigest.getInstance("MD5"); + md5.update(ApplicationConfigConstant.OCR_APP_ID.getBytes()); + md5.update((timestamp + "").getBytes()); + md5.update(ApplicationConfigConstant.OCR_APP_SECRET.getBytes()); + byte[] bytes = md5.digest(); + return (new BigInteger(1, bytes)).toString(16); + } catch (NoSuchAlgorithmException var8) { + throw new RuntimeException("不支持的加密算法", var8); + } + } + + /** + * 根据身份证号获取性别 + * + * @param idCard 身份证号 + * @return 性别:"男"或"女" + * @throws IllegalArgumentException 身份证号不合法时抛出 + */ + public static String getGender(String idCard) { + // 校验身份证号长度 + if (idCard == null || (idCard.length() != 18 && idCard.length() != 15)) { + throw new IllegalArgumentException("身份证号长度不合法"); + } + + // 18位身份证取第17位,15位身份证取第15位 + char genderChar; + if (idCard.length() == 18) { + genderChar = idCard.charAt(16); + } else { + genderChar = idCard.charAt(14); + } + + // 奇数为男,偶数为女 + return (Integer.parseInt(String.valueOf(genderChar)) % 2 == 1) ? "male" : "female"; + } + + /** + * 根据身份证号计算年龄 + * + * @param idCard 身份证号 + * @return 年龄 + * @throws IllegalArgumentException 身份证号不合法时抛出 + */ + public static int getAge(String idCard) { + // 校验身份证号长度 + if (idCard == null || (idCard.length() != 18 && idCard.length() != 15)) { + throw new IllegalArgumentException("身份证号长度不合法"); + } + + // 解析出生日期 + LocalDate birthDate; + if (idCard.length() == 18) { + // 18位身份证:第7-14位为出生日期(yyyyMMdd) + String birthStr = idCard.substring(6, 14); + birthDate = LocalDate.parse(birthStr, DateTimeFormatter.ofPattern("yyyyMMdd")); + } else { + // 15位身份证:第7-12位为出生日期(yyMMdd),默认19xx年 + String birthStr = "19" + idCard.substring(6, 12); + birthDate = LocalDate.parse(birthStr, DateTimeFormatter.ofPattern("yyyyMMdd")); + } + + // 计算与当前日期的差距 + LocalDate now = LocalDate.now(); + Period period = Period.between(birthDate, now); + + return period.getYears(); + } + + /** + * 检查有效期 + * + * @param validity + * @param returnMap + */ + private static void checkValidity(String validity, Map returnMap) { + if(StringUtils.isBlank(validity)){ + return; + } + String[] validityArr = validity.split("-"); + if (validityArr.length < 2) { + return; + } + String startDate = Convert.toStr(validityArr[0], "").replace(".", "-"); + String endDate = Convert.toStr(validityArr[1], "").replace(".", "-"); + returnMap.put("validityType", "0"); + if ("长期".equals(endDate)) { + endDate = "9999-12-31"; + returnMap.put("validityType", "1"); + } + returnMap.put("validityStart", startDate); + returnMap.put("validityEnd", endDate); + } + + + + public static void main(String[] args) throws IOException { + // TODO + Map returnMap = new HashMap<>(); + File file = new File("C:\\Users\\dxfeng\\Desktop\\茶百道\\长期身份证.jpg"); + InputStream inputStream = Files.newInputStream(file.toPath()); + + //String response = callIdCardOcrApi(inputStream, file.getName()); + // 正面响应数据 + //String response = "{\"isSuccess\": true, \"data\": {\"page_num\": \"1\", \"result\": [{\"姓名\": \"王某某\", \"性别\": \"男\", \"民族\": \"汉\", \"出生\": \"1989年3月21日\", \"住址\": \"上海市浦东新区塘桥街道蓝村路xxx号\", \"公民身份号码\": \"370112198903217890\", \"标签\": \"头像面\"}]}, \"status_code\": 5200}"; + //String response = "{\"isSuccess\": true, \"data\": {\"page_num\": \"1\", \"result\": [{\"签发机关\": \"东港市公安局\", \"有效期限\": \"2014.07.09-长期\", \"标签\": \"国徽面\"}]}, \"status_code\": 5200}"; + String response = "{\"isSuccess\": true, \"data\": {\"page_num\": \"1\", \"result\": [{\"签发机关\": \"东港市公安局\", \"有效期限\": \"2013.03.05-2023.03.05\", \"标签\": \"国徽面\"}]}, \"status_code\": 5200}"; + System.out.println("response==" + response); + + JSONObject jsonObject = JSONObject.parseObject(response); + if (jsonObject.getBoolean("isSuccess")) { + JSONObject data = jsonObject.getJSONObject("data"); + JSONArray resultArray = data.getJSONArray("result"); + if (resultArray.size() > 0) { + JSONObject result = resultArray.getJSONObject(0); + returnMap.put("name", result.getString("姓名")); + returnMap.put("sex", result.getString("性别")); + String nation = result.getString("民族"); + //if (StringUtils.isNotBlank(nation) && StringUtils.isNotBlank(nationalityConvert)) { + // Long nationId = dataConvertMapper.getIdByName(baseParam, "nation", nation + "族"); + // log.error("nationId==" + nationId); + // nation = Convert.toStr(nationId, ""); + // log.error("nation==" + nation); + // + //} + returnMap.put("nation", nation); + + returnMap.put("birthday", Convert.toStr(result.getString("出生"), "").replace("年", "-").replace("月", "-").replace("日", "-")); + returnMap.put("address", result.getString("住址")); + String idNumber = result.getString("公民身份号码"); + returnMap.put("idCard", idNumber); + // 根据身份证号,计算年龄、 性别 + if (StringUtils.isNotBlank(idNumber)) { + returnMap.put("age", getAge(idNumber)); + returnMap.put("gender", getGender(idNumber)); + } + + returnMap.put("issueAuthority", result.getString("签发机关")); + String validity = result.getString("有效期限"); + checkValidity(validity, returnMap); + returnMap.put("validity", validity); + } + } + System.out.println("returnMap==" + JSON.toJSONString(returnMap)); + + + } + +} diff --git a/secondev-chabaidao-portal/src/main/java/com/weaver/seconddev/entry/action/PermissionDetailAction.java b/secondev-chabaidao-portal/src/main/java/com/weaver/seconddev/entry/action/PermissionDetailAction.java new file mode 100644 index 0000000..361a8ff --- /dev/null +++ b/secondev-chabaidao-portal/src/main/java/com/weaver/seconddev/entry/action/PermissionDetailAction.java @@ -0,0 +1,176 @@ +package com.weaver.seconddev.entry.action; + +import cn.hutool.core.convert.Convert; +import cn.hutool.http.HttpRequest; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.weaver.common.base.entity.result.WeaResult; +import com.weaver.esb.api.rpc.EsbServerlessRpcRemoteInterface; +import com.weaver.seconddev.entry.entity.PermissionTransferModule; +import com.weaver.seconddev.entry.entity.RoleDetail; +import com.weaver.seconddev.portal.constant.ApplicationConfigConstant; +import com.weaver.seconddev.portal.util.PapiUtil; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * @author:dxfeng + * @createTime: 2025/08/04 + * @version: 1.0 + */ +@Slf4j +@Service("PermissionDetailAction") +public class PermissionDetailAction implements EsbServerlessRpcRemoteInterface { + @Override + public WeaResult> execute(Map params) { + Map returnMap = new HashMap<>(); + // 离职员工ID + String employeeId = Convert.toStr(params.get("employeeId"), null); + + // 权限转移操作人员ID + String optUserId = Convert.toStr(params.get("optUserId"), null); + + String papiCode = PapiUtil.getPapiCode(ApplicationConfigConstant.APP_URL, ApplicationConfigConstant.CORP_ID, "B2b"); + String papiToken = PapiUtil.getPapiToken(ApplicationConfigConstant.APP_URL, ApplicationConfigConstant.ORGANIZATION_APP_KEY, ApplicationConfigConstant.ORGANIZATION_APP_SECRET, papiCode); + + // 查询某个人员组织的可以转移的权限数据 + JSONObject jsonObject = new JSONObject(); + // {"type":"resource","opt":"1","targetId":"959466419596591105"} + jsonObject.put("type", "resource"); + jsonObject.put("opt", "1"); + jsonObject.put("targetId", employeeId); + jsonObject.put("access_token", papiToken); + + log.info("jsonObject===" + jsonObject); + String response = HttpRequest.post(ApplicationConfigConstant.APP_URL + "/papi/openapi/api/architecture/permission/transfer/query/v1/module") + .header("Content-Type", "application/json") + .header("optUserId", optUserId) + .body(jsonObject.toJSONString()) + .execute() + .body(); + log.info("response===" + response); + + JSONObject responseJson = JSONObject.parseObject(response); + if (responseJson.getIntValue("code") != 200) { + // 请求失败直接响应失败数据 + return WeaResult.fail(response, true); + } + JSONObject data = responseJson.getJSONObject("data"); + List permissionTransferModuleList = new ArrayList<>(); + PermissionTransferModule roleModule = null; + if (data != null) { + JSONArray permissionTransferModules = data.getJSONArray("permissionTransferModules"); + for (Object permissionTransferModule : permissionTransferModules) { + JSONObject permissionTransferModuleJson = (JSONObject) permissionTransferModule; + PermissionTransferModule module = PermissionTransferModule.builder() + .deleteType(permissionTransferModuleJson.getInteger("deleteType")) + .opt(permissionTransferModuleJson.getInteger("opt")) + .module(permissionTransferModuleJson.getString("module")) + .moduleName(permissionTransferModuleJson.getString("moduleName")) + .subModule(permissionTransferModuleJson.getString("subModule")) + .subModuleName(permissionTransferModuleJson.getString("subModuleName")) + .type(permissionTransferModuleJson.getString("type")) + .content(permissionTransferModuleJson.getString("content")) + .count(permissionTransferModuleJson.getInteger("count")) + .build(); + if ("hrm_role".equals(module.getSubModule())) { + roleModule = module; + } else { + permissionTransferModuleList.add(module); + } + } + } + + // 查询角色明细数据 + List roleDetailList = new ArrayList<>(); + getRoleDetail(employeeId, optUserId, 1, roleDetailList); + + returnMap.put("permissionTransferModuleList", permissionTransferModuleList); + returnMap.put("roleDetailList", roleDetailList); + log.info("returnMap==" + JSON.toJSONString(returnMap)); + return WeaResult.success(returnMap); + } + + + /** + * 获取角色明细数据 + * + * @param employeeId 员工ID + * @param optUserId 操作用户ID + * @param pageNum 当前页码 + * @param roleDetailList 角色明细列表 + * @param roleDetailList + */ + private void getRoleDetail(String employeeId, String optUserId, int pageNum, List roleDetailList) { + String papiCode = PapiUtil.getPapiCode(ApplicationConfigConstant.APP_URL, ApplicationConfigConstant.CORP_ID, "B3b"); + String papiToken = PapiUtil.getPapiToken(ApplicationConfigConstant.APP_URL, ApplicationConfigConstant.ORGANIZATION_APP_KEY, ApplicationConfigConstant.ORGANIZATION_APP_SECRET, papiCode); + + JSONObject jsonObject = new JSONObject(); + jsonObject.put("access_token", papiToken); + jsonObject.put("pageNum", pageNum); + jsonObject.put("pageSize", 10); + jsonObject.put("targetId", employeeId); + jsonObject.put("param", new JSONObject()); + jsonObject.put("opt", "1"); + jsonObject.put("module", "hrm"); + jsonObject.put("subModule", "hrm_role"); + jsonObject.put("type", "resource"); + log.info("getRoleDetail>>jsonObject===" + jsonObject); + String response = HttpRequest.post(ApplicationConfigConstant.APP_URL + "/papi/openapi/api/architecture/permission/transfer/query/v1/module/content") + .header("Content-Type", "application/json") + .header("optUserId", optUserId) + .body(jsonObject.toJSONString()) + .execute() + .body(); + log.info("getRoleDetail>>response===" + response); + + JSONObject responseJson = JSONObject.parseObject(response); + if (responseJson.getIntValue("code") != 200) { + // 请求失败直接响应失败数据 + log.error("response==" + response); + roleDetailList = new ArrayList<>(); + return; + } + JSONObject data = responseJson.getJSONObject("data"); + if (data != null) { + JSONObject page = data.getJSONObject("page"); + JSONArray records = page.getJSONArray("records"); + if (records.size() > 0) { + for (Object record : records) { + JSONObject recordJson = (JSONObject) record; + JSONArray columnValueList = recordJson.getJSONArray("columnValueList"); + if (columnValueList.size() > 0) { + JSONObject columnValue = columnValueList.getJSONObject(0); + RoleDetail roleDetail = RoleDetail.builder() + .sourceId(columnValue.getString("sourceId")) + .roleName(columnValue.getString("dataIndex_0")) + .functionCount(columnValue.getInteger("dataIndex_1")) + .memberCount(columnValue.getInteger("dataIndex_2")) + .build(); + roleDetailList.add(roleDetail); + } + } + } + + int pages = page.getIntValue("pages"); + if (pages > pageNum) { + getRoleDetail(employeeId, optUserId, pageNum + 1, roleDetailList); + } + } + } + + public static void main(String[] args) { + Map params = new HashMap<>(); + params.put("employeeId", "1147262704872284161"); + params.put("optUserId", "1147262704872284161"); + PermissionTransferAction permissionTransferAction = new PermissionTransferAction(); + WeaResult> execute = permissionTransferAction.execute(params); + System.out.println(JSON.toJSONString(execute)); + } +} \ No newline at end of file diff --git a/secondev-chabaidao-portal/src/main/java/com/weaver/seconddev/entry/action/PermissionTransferAction.java b/secondev-chabaidao-portal/src/main/java/com/weaver/seconddev/entry/action/PermissionTransferAction.java new file mode 100644 index 0000000..c588b85 --- /dev/null +++ b/secondev-chabaidao-portal/src/main/java/com/weaver/seconddev/entry/action/PermissionTransferAction.java @@ -0,0 +1,201 @@ +package com.weaver.seconddev.entry.action; + +import cn.hutool.core.convert.Convert; +import cn.hutool.http.HttpRequest; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.weaver.common.base.entity.result.WeaResult; +import com.weaver.esb.api.rpc.EsbServerlessRpcRemoteInterface; +import com.weaver.seconddev.entry.entity.PermissionTransferModule; +import com.weaver.seconddev.entry.mapper.ResignationApplyMapper; +import com.weaver.seconddev.portal.constant.ApplicationConfigConstant; +import com.weaver.seconddev.portal.entity.param.BaseParam; +import com.weaver.seconddev.portal.util.DateUtil; +import com.weaver.seconddev.portal.util.PapiUtil; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * @author:dxfeng + * @createTime: 2025/08/04 + * @version: 1.0 + */ +@Slf4j +@Service("PermissionTransferAction") +public class PermissionTransferAction implements EsbServerlessRpcRemoteInterface { + + @Autowired + ResignationApplyMapper resignationApplyMapper; + + @Override + public WeaResult> execute(Map params) { + log.error("开始执行权限转移操作:{}", DateUtil.getCurrentDateTimeStr()); + // 权限转移操作人员ID + String optUserId = Convert.toStr(params.get("optUserId"), null); + + Map returnMap = new HashMap<>(); + BaseParam baseParam = new BaseParam(); + // 查询已经提交的离职申请流程,且权限转移生效时间在今天之前的数据 + List permissionTransferModuleList = resignationApplyMapper.getPermissionTransferModuleList(baseParam, DateUtil.getCurrentDateStr()); + // 遍历数据 执行权限转移操作,并反写权限转移结果 + for (PermissionTransferModule permissionTransferModule : permissionTransferModuleList) { + log.error("permissionTransferModule==={}", JSON.toJSONString(permissionTransferModule)); + // 转移该模块全部数据权限 + transferPermission(permissionTransferModule, optUserId, "0"); + // 更新 数据 存储权限转移结果 + resignationApplyMapper.updatePermissionTransferModule(baseParam, permissionTransferModule); + } + + + // 查询角色权限转移数据 + List roleTransferModuleList = resignationApplyMapper.getRoleTransferModuleList(baseParam, DateUtil.getCurrentDateStr()); + for (PermissionTransferModule roleTransferModule : roleTransferModuleList) { + log.error("roleTransferModule==={}", JSON.toJSONString(roleTransferModule)); + transferPermission(roleTransferModule, optUserId, roleTransferModule.getSourceId()); + resignationApplyMapper.updateRoleTransferModule(baseParam, roleTransferModule); + } + + log.error("结束执行权限转移操作:{}", DateUtil.getCurrentDateTimeStr()); + return WeaResult.success(returnMap); + } + + /** + * 权限转移 + * + * @param permissionTransferModule + * @param optUserId + * @param sourceId + */ + private static void transferPermission(PermissionTransferModule permissionTransferModule, String optUserId, String sourceId) { + String papiCode = PapiUtil.getPapiCode(ApplicationConfigConstant.APP_URL, ApplicationConfigConstant.CORP_ID, "C3c"); + String papiToken = PapiUtil.getPapiToken(ApplicationConfigConstant.APP_URL, ApplicationConfigConstant.ORGANIZATION_APP_KEY, ApplicationConfigConstant.ORGANIZATION_APP_SECRET, papiCode); + + // 查询某个人员组织的可以转移的权限数据 + JSONObject jsonObject = new JSONObject(); + jsonObject.put("access_token", papiToken); + jsonObject.put("module", permissionTransferModule.getModule()); + jsonObject.put("subModule", permissionTransferModule.getSubModule()); + jsonObject.put("transferId", sourceId); + jsonObject.put("type", "resource"); + jsonObject.put("opt", "1"); + jsonObject.put("targetIdFrom", permissionTransferModule.getEmployeeId()); + jsonObject.put("targetIdTo", permissionTransferModule.getHandoverId()); + + JSONArray array = new JSONArray(); + array.add(jsonObject); + + log.error("array===" + array); + String response = HttpRequest.post(ApplicationConfigConstant.APP_URL + "/papi/openapi/api/architecture/permission/transfer/module/v1/opt/extend?access_token=" + papiToken) + .header("Content-Type", "application/json") + .header("optUserId", optUserId) + .body(array.toJSONString()) + .execute() + .body(); + log.error("response===" + response); + + JSONObject responseJson = JSONObject.parseObject(response); + if (responseJson.getIntValue("code") != 200) { + log.error("权限转移失败,接口响应结果=={}", response); + permissionTransferModule.setSuccessCount(-1); + permissionTransferModule.setFailReason("权限转移失败,接口响应结果:" + response); + return; + } + + JSONObject data = responseJson.getJSONObject("data"); + if (data != null) { + String transferId = data.getString("transferId"); + log.error("transferId===" + transferId); + // 查询权限转移执行结果 + queryPermissionTransferResult(permissionTransferModule, optUserId, transferId); + } + + + } + + + /** + * 查询权限转移执行结果 + */ + private static void queryPermissionTransferResult(PermissionTransferModule permissionTransferModule, String optUserId, String transferId) { + queryPermissionTransferResult(permissionTransferModule, optUserId, transferId, 0); + } + + private static void queryPermissionTransferResult(PermissionTransferModule permissionTransferModule, String optUserId, String transferId, int retryCount) { + // 限制重试次数,防止无限递归 + if (retryCount >= 5) { + log.error("权限转移查询超过最大重试次数"); + permissionTransferModule.setSuccessCount(-1); + permissionTransferModule.setFailReason("权限转移查询超过最大重试次数"); + return; + } + + String papiCode = PapiUtil.getPapiCode(ApplicationConfigConstant.APP_URL, ApplicationConfigConstant.CORP_ID, "D4d"); + String papiToken = PapiUtil.getPapiToken(ApplicationConfigConstant.APP_URL, ApplicationConfigConstant.ORGANIZATION_APP_KEY, ApplicationConfigConstant.ORGANIZATION_APP_SECRET, papiCode); + + JSONObject jsonObject = new JSONObject(); + jsonObject.put("access_token", papiToken); + + log.error("jsonObject===" + jsonObject); + + try { + String response = HttpRequest.post(ApplicationConfigConstant.APP_URL + "/papi/openapi/api/architecture/permission/transfer/module/v1/opt/extend/refresh?transferId=" + transferId) + .header("Content-Type", "application/json") + .header("optUserId", optUserId) + .body(jsonObject.toJSONString()) + .timeout(10000) + .execute() + .body(); + log.error("response===" + response); + + JSONObject responseJson = JSONObject.parseObject(response); + if (responseJson.getIntValue("code") != 200) { + log.error("权限转移失败,接口响应结果=={}", response); + permissionTransferModule.setSuccessCount(-1); + permissionTransferModule.setFailReason("权限转移失败," + response); + return; + } + JSONObject data = responseJson.getJSONObject("data"); + JSONArray dataSource = data.getJSONArray("dataSource"); + if (dataSource != null && dataSource.size() > 0) { + JSONObject dataSourceObj = dataSource.getJSONObject(0); + Integer success = dataSourceObj.getInteger("success"); + Integer fail = dataSourceObj.getInteger("fail"); + String cause = dataSourceObj.getString("cause"); + permissionTransferModule.setSuccessCount(success); + permissionTransferModule.setFailCount(fail); + permissionTransferModule.setFailReason(cause); + } else if ("false".equals(data.getString("finished"))) { + // 没有返回dataSource数组,重复调用,增加重试计数 + Thread.sleep(1000); + queryPermissionTransferResult(permissionTransferModule, optUserId, transferId, retryCount + 1); + } else { + log.error("权限转移查询异常,接口响应:" + response); + permissionTransferModule.setSuccessCount(-1); + permissionTransferModule.setFailReason("权限转移查询异常,接口响应:" + response); + } + } catch (Exception e) { + log.error("权限转移查询异常", e); + permissionTransferModule.setSuccessCount(-1); + permissionTransferModule.setFailReason("权限转移查询异常: " + e.getMessage()); + } + } + + //public static void main(String[] args) { + // // + // PermissionTransferModule permissionTransferModule = new PermissionTransferModule(); + // permissionTransferModule.setModule("doc"); + // permissionTransferModule.setSubModule("doc_doc_author_permission"); + // permissionTransferModule.setEmployeeId("1160242985059614723"); + // permissionTransferModule.setHandoverId("1155098662311870470"); + // //transferPermission(permissionTransferModule, "1147262704872284161", "0"); + // + // queryPermissionTransferResult(permissionTransferModule, "1147262704872284161", "1164707182682865680"); + //} + +} diff --git a/secondev-chabaidao-portal/src/main/java/com/weaver/seconddev/entry/controller/EntryManageController.java b/secondev-chabaidao-portal/src/main/java/com/weaver/seconddev/entry/controller/EntryManageController.java new file mode 100644 index 0000000..cd9bca7 --- /dev/null +++ b/secondev-chabaidao-portal/src/main/java/com/weaver/seconddev/entry/controller/EntryManageController.java @@ -0,0 +1,39 @@ +package com.weaver.seconddev.entry.controller; + +import com.weaver.common.authority.annotation.WeaPermission; +import com.weaver.common.base.entity.result.WeaResult; +import com.weaver.seconddev.entry.service.EntryManageService; +import com.weaver.teams.hrapp.service.HrComEstService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.Map; + +/** + * @author:dxfeng + * @createTime: 2025/07/31 + * @version: 1.0 + */ +@Slf4j +@RestController +@RequestMapping("/api/secondev/entry/manage") +@WeaPermission(publicPermission = true) +public class EntryManageController { + + @Autowired + EntryManageService entryManageService; + @Autowired + HrComEstService hrComEstService; + + @GetMapping("/checkJobNum") + public WeaResult> checkJobNum(@RequestParam("jobNum") String jobNum) { + return entryManageService.checkJobNum(jobNum); + } + + @PostMapping("/uploadFiles") + private WeaResult> uploadFiles(@RequestBody Map params) { + return entryManageService.uploadFiles(params); + } + +} diff --git a/secondev-chabaidao-portal/src/main/java/com/weaver/seconddev/entry/entity/FileUploadLoad.java b/secondev-chabaidao-portal/src/main/java/com/weaver/seconddev/entry/entity/FileUploadLoad.java new file mode 100644 index 0000000..6b4792d --- /dev/null +++ b/secondev-chabaidao-portal/src/main/java/com/weaver/seconddev/entry/entity/FileUploadLoad.java @@ -0,0 +1,93 @@ +package com.weaver.seconddev.entry.entity; + +import lombok.Data; + +/** + * @author:dxfeng + * @createTime: 2025/07/31 + * @version: 1.0 + */ +@Data +public class FileUploadLoad { + + public FileUploadLoad(String fileName, String formatDate, Long fileId) { + this.fileId = fileId; + this.formatDate = formatDate; + + // 获取文件后缀 + String suffix = ""; + String fileNameWithoutSuffix = fileName; + if (fileName.contains(".")) { + int lastDotIndex = fileName.lastIndexOf("."); + suffix = fileName.substring(lastDotIndex); + fileNameWithoutSuffix = fileName.substring(0, lastDotIndex); + } + + // 按"-"分割文件名 + String[] split = fileNameWithoutSuffix.split("-"); + + // 判断是否包含时间字符串(最后一个部分是否为时间格式) + boolean hasDateFormat = false; + if (split.length > 0) { + String lastPart = split[split.length - 1]; + // 简单判断是否为时间格式(12位数字) + if (lastPart.matches("\\d{12}")) { + hasDateFormat = true; + } + } + + if (hasDateFormat && split.length >= 3) { + // 包含时间格式,直接使用 + this.jobNum = split[0]; + this.userName = split[1]; + // 重新组合文件类型部分(处理可能包含"-"的文件类型名称) + StringBuilder fileTypeBuilder = new StringBuilder(); + for (int i = 2; i < split.length - 1; i++) { + if (fileTypeBuilder.length() > 0) { + fileTypeBuilder.append("-"); + } + fileTypeBuilder.append(split[i]); + } + this.fileTypeName = fileTypeBuilder.toString(); + // 文件名保持原样 + this.fileName = fileName; + } else if (!hasDateFormat && split.length >= 3) { + // 不包含时间格式,需要添加formatDate + this.jobNum = split[0]; + this.userName = split[1]; + // 重新组合文件类型部分(处理可能包含"-"的文件类型名称) + StringBuilder fileTypeBuilder = new StringBuilder(); + for (int i = 2; i < split.length; i++) { + if (fileTypeBuilder.length() > 0) { + fileTypeBuilder.append("-"); + } + fileTypeBuilder.append(split[i]); + } + this.fileTypeName = fileTypeBuilder.toString(); + // 添加时间格式到文件名 + this.fileName = fileNameWithoutSuffix + "-" + formatDate + suffix; + } else if (!hasDateFormat && split.length == 2) { + // 特殊情况:只有工号和姓名,没有文件类型 + this.jobNum = split[0]; + this.userName = split[1]; + this.fileTypeName = ""; + // 添加时间格式到文件名 + this.fileName = fileNameWithoutSuffix + "-" + formatDate + suffix; + } else { + // 其他情况,设置默认值 + this.jobNum = split.length > 0 ? split[0] : ""; + this.userName = split.length > 1 ? split[1] : ""; + this.fileTypeName = ""; + // 添加时间格式到文件名 + this.fileName = fileNameWithoutSuffix + (split.length > 0 ? "-" + formatDate : "") + suffix; + } + } + + private String fileName; + private String formatDate; + private String userName; + private String jobNum; + private String fileTypeName; + private Long fileId; + private String uploadTime; +} diff --git a/secondev-chabaidao-portal/src/main/java/com/weaver/seconddev/entry/entity/PermissionTransferModule.java b/secondev-chabaidao-portal/src/main/java/com/weaver/seconddev/entry/entity/PermissionTransferModule.java new file mode 100644 index 0000000..a146a8d --- /dev/null +++ b/secondev-chabaidao-portal/src/main/java/com/weaver/seconddev/entry/entity/PermissionTransferModule.java @@ -0,0 +1,67 @@ +package com.weaver.seconddev.entry.entity; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * @author:dxfeng + * @createTime: 2025/08/04 + * @version: 1.0 + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +@Builder +public class PermissionTransferModule { + private Integer deleteType; + private Integer opt; + private String module; + private String moduleName; + private String subModule; + private String subModuleName; + private String type; + private String content; + private Integer count; + + /** + * 交接人 + */ + private String handoverId; + /** + * 生效类型 + */ + private Integer effectType; + /** + * 生效日期 + */ + private String effectDate; + /** + * 离职员工 + */ + private String employeeId; + /** + * 最后工作日 + */ + private String lastWorkDate; + /** + * 明细表ID + */ + private Long detailId; + /** + * 主表ID + */ + private Long formDataId; + + /** + * 角色数据ID + */ + private String sourceId; + + private Integer successCount; + private Integer failCount; + private String failReason; + + +} diff --git a/secondev-chabaidao-portal/src/main/java/com/weaver/seconddev/entry/entity/RoleDetail.java b/secondev-chabaidao-portal/src/main/java/com/weaver/seconddev/entry/entity/RoleDetail.java new file mode 100644 index 0000000..578b2e9 --- /dev/null +++ b/secondev-chabaidao-portal/src/main/java/com/weaver/seconddev/entry/entity/RoleDetail.java @@ -0,0 +1,28 @@ +package com.weaver.seconddev.entry.entity; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * @author:dxfeng + * @createTime: 2025/08/04 + * @version: 1.0 + */ +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class RoleDetail { + private String sourceId; + private String roleName; + /** + * 功能权限数量 + */ + private Integer functionCount; + /** + * 成员数量 + */ + private Integer memberCount; +} diff --git a/secondev-chabaidao-portal/src/main/java/com/weaver/seconddev/entry/enums/FileUploadType.java b/secondev-chabaidao-portal/src/main/java/com/weaver/seconddev/entry/enums/FileUploadType.java new file mode 100644 index 0000000..f177440 --- /dev/null +++ b/secondev-chabaidao-portal/src/main/java/com/weaver/seconddev/entry/enums/FileUploadType.java @@ -0,0 +1,46 @@ +package com.weaver.seconddev.entry.enums; + +/** + * @author:dxfeng + * @createTime: 2025/07/31 + * @version: 1.0 + */ +public enum FileUploadType { + // ['身份证正面', '身份证反面', '护照', '学历证明', '半身形象照', '寸照', '银行卡', '体检报告', '健康证', '离职证明', '其他附件'] + IDENTITY_CARD_FRONT("身份证正面","sfzzpzfm"), + IDENTITY_CARD_BACK("身份证反面","sfzfmghm"), + PASSPORT("护照","hzzp"), + EDUCATION_PROOF("学历证明","zgxlbyzszp"), + FACE_IMAGE("半身形象照","xxzbs"), + PORTRAIT("寸照","czycbdz"), + BANK_CARD("银行卡","yxkzm"), + PHYSICAL_EXAMINATION_REPORT("体检报告","tjbg"), + HEALTH_CERTIFICATE("健康证","jkz"), + RESIGNATION_PROOF("离职证明","sjdwlzzm"), + OTHER_ATTACHMENT("其他附件","qtfj"); + + private final String name; + private final String dbName; + + FileUploadType(String name, String dbName) { + this.name = name; + this.dbName = dbName; + } + + public String getName() { + return name; + } + + public String getDbName() { + return dbName; + } + + public static FileUploadType getByName(String name) { + for (FileUploadType value : FileUploadType.values()) { + if (value.getName().equals(name)) { + return value; + } + } + return null; + } +} diff --git a/secondev-chabaidao-portal/src/main/java/com/weaver/seconddev/entry/mapper/EmailAccountGenerateMapper.java b/secondev-chabaidao-portal/src/main/java/com/weaver/seconddev/entry/mapper/EmailAccountGenerateMapper.java new file mode 100644 index 0000000..2f1cc41 --- /dev/null +++ b/secondev-chabaidao-portal/src/main/java/com/weaver/seconddev/entry/mapper/EmailAccountGenerateMapper.java @@ -0,0 +1,18 @@ +package com.weaver.seconddev.entry.mapper; + +import com.weaver.seconddev.portal.entity.param.BaseParam; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; + +/** + * @author:dxfeng + * @createTime: 2025/07/28 + * @version: 1.0 + */ +@Mapper +public interface EmailAccountGenerateMapper { + + Integer checkSameEmailAccount(@Param("param") BaseParam param, @Param("email") String email, @Param("requestId") Long requestId); + + Integer checkEmployeeSameEmail(@Param("param") BaseParam param, @Param("email") String email); +} diff --git a/secondev-chabaidao-portal/src/main/java/com/weaver/seconddev/entry/mapper/EntryManageMapper.java b/secondev-chabaidao-portal/src/main/java/com/weaver/seconddev/entry/mapper/EntryManageMapper.java new file mode 100644 index 0000000..0fd4540 --- /dev/null +++ b/secondev-chabaidao-portal/src/main/java/com/weaver/seconddev/entry/mapper/EntryManageMapper.java @@ -0,0 +1,23 @@ +package com.weaver.seconddev.entry.mapper; + +import com.weaver.seconddev.portal.entity.param.BaseParam; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; + +/** + * @author:dxfeng + * @createTime: 2025/07/31 + * @version: 1.0 + */ +@Mapper +public interface EntryManageMapper { + + /** + * 根据工号查询员工ID + * + * @param param + * @param jobNum + * @return + */ + Long getEntryRecordIdByJobNum(@Param("param") BaseParam param, @Param("jobNum") String jobNum); +} diff --git a/secondev-chabaidao-portal/src/main/java/com/weaver/seconddev/entry/mapper/FormatEntryFilesMapper.java b/secondev-chabaidao-portal/src/main/java/com/weaver/seconddev/entry/mapper/FormatEntryFilesMapper.java new file mode 100644 index 0000000..a23f419 --- /dev/null +++ b/secondev-chabaidao-portal/src/main/java/com/weaver/seconddev/entry/mapper/FormatEntryFilesMapper.java @@ -0,0 +1,18 @@ +package com.weaver.seconddev.entry.mapper; + +import com.weaver.seconddev.portal.entity.param.BaseParam; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; + +import java.util.Map; + +/** + * @author:dxfeng + * @createTime: 2025/07/30 + * @version: 1.0 + */ +@Mapper +public interface FormatEntryFilesMapper { + + Map getEntryRecord(@Param("param") BaseParam param, @Param("id") Long id); +} diff --git a/secondev-chabaidao-portal/src/main/java/com/weaver/seconddev/entry/mapper/ResignationApplyMapper.java b/secondev-chabaidao-portal/src/main/java/com/weaver/seconddev/entry/mapper/ResignationApplyMapper.java new file mode 100644 index 0000000..940768f --- /dev/null +++ b/secondev-chabaidao-portal/src/main/java/com/weaver/seconddev/entry/mapper/ResignationApplyMapper.java @@ -0,0 +1,26 @@ +package com.weaver.seconddev.entry.mapper; + +import com.weaver.seconddev.entry.entity.PermissionTransferModule; +import com.weaver.seconddev.portal.entity.param.BaseParam; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * @author:dxfeng + * @createTime: 2025/08/05 + * @version: 1.0 + */ +@Mapper +public interface ResignationApplyMapper { + + List getPermissionTransferModuleList(@Param("param") BaseParam param, @Param("currentDate") String currentDate); + + List getRoleTransferModuleList(@Param("param") BaseParam param, @Param("currentDate") String currentDate); + + + int updatePermissionTransferModule(@Param("param") BaseParam param, @Param("module") PermissionTransferModule module); + + int updateRoleTransferModule(@Param("param") BaseParam param, @Param("module") PermissionTransferModule module); +} diff --git a/secondev-chabaidao-portal/src/main/java/com/weaver/seconddev/entry/service/EntryManageService.java b/secondev-chabaidao-portal/src/main/java/com/weaver/seconddev/entry/service/EntryManageService.java new file mode 100644 index 0000000..60c1725 --- /dev/null +++ b/secondev-chabaidao-portal/src/main/java/com/weaver/seconddev/entry/service/EntryManageService.java @@ -0,0 +1,29 @@ +package com.weaver.seconddev.entry.service; + +import com.weaver.common.base.entity.result.WeaResult; + +import java.util.Map; + +/** + * @author:dxfeng + * @createTime: 2025/07/31 + * @version: 1.0 + */ +public interface EntryManageService { + + /** + * 校验工号 + * + * @param jobNum 工号 + * @return + */ + WeaResult> checkJobNum(String jobNum); + + /** + * 上传文件 + * + * @param params + * @return + */ + WeaResult> uploadFiles(Map params); +} diff --git a/secondev-chabaidao-portal/src/main/java/com/weaver/seconddev/entry/service/impl/EntryManageServiceImpl.java b/secondev-chabaidao-portal/src/main/java/com/weaver/seconddev/entry/service/impl/EntryManageServiceImpl.java new file mode 100644 index 0000000..dff53ff --- /dev/null +++ b/secondev-chabaidao-portal/src/main/java/com/weaver/seconddev/entry/service/impl/EntryManageServiceImpl.java @@ -0,0 +1,215 @@ +package com.weaver.seconddev.entry.service.impl; + +import cn.hutool.core.convert.Convert; +import cn.hutool.http.HttpRequest; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.weaver.common.base.entity.result.WeaResult; +import com.weaver.common.form.metadata.field.FormField; +import com.weaver.eteams.file.client.file.FileData; +import com.weaver.eteams.file.client.file.FileObj; +import com.weaver.eteams.file.client.param.RemoteUploadParam; +import com.weaver.eteams.file.client.remote.FileClientService; +import com.weaver.file.ud.api.FileDownloadService; +import com.weaver.file.ud.api.FileUploadService; +import com.weaver.seconddev.entry.entity.FileUploadLoad; +import com.weaver.seconddev.entry.enums.FileUploadType; +import com.weaver.seconddev.entry.mapper.EntryManageMapper; +import com.weaver.seconddev.entry.service.EntryManageService; +import com.weaver.seconddev.portal.constant.ApplicationConfigConstant; +import com.weaver.seconddev.portal.entity.param.BaseParam; +import com.weaver.seconddev.portal.mapper.portal.EbuilderBaseMapper; +import com.weaver.seconddev.portal.util.DateUtil; +import com.weaver.seconddev.portal.util.PapiUtil; +import com.weaver.teams.security.context.UserContext; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.io.InputStream; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.util.*; +import java.util.stream.Collectors; + +/** + * @author:dxfeng + * @createTime: 2025/07/31 + * @version: 1.0 + */ +@Slf4j +@Service +public class EntryManageServiceImpl implements EntryManageService { + + @Autowired + EntryManageMapper entryManageMapper; + + @Autowired + FileClientService fileClientService; + + @Autowired + FileUploadService fileUploadService; + + @Autowired + private FileDownloadService fileDownloadService; + + @Autowired + EbuilderBaseMapper ebuilderBaseMapper; + + BaseParam baseParam = new BaseParam(); + + @Override + public WeaResult> checkJobNum(String jobNum) { + Map dataMap = new HashMap<>(); + dataMap.put("isExist", false); + if (StringUtils.isBlank(jobNum)) { + return WeaResult.fail("工号获取异常", true); + } + + Long empIdByJobNum = entryManageMapper.getEntryRecordIdByJobNum(baseParam, jobNum); + dataMap.put("isExist", null != empIdByJobNum); + dataMap.put("empId", empIdByJobNum); + return WeaResult.success(dataMap); + } + + @Override + public WeaResult> uploadFiles(Map params) { + String fileIds = params.get("fileIds"); + if (StringUtils.isBlank(fileIds)) { + return WeaResult.fail("请选择文件后上传", true); + } + String[] fieldArray = fileIds.split(","); + List fileUploadLoadList = new ArrayList<>(); + for (String fieldStr : fieldArray) { + Long field = Convert.toLong(fieldStr); + FileObj fileObj = fileClientService.get(field); + if (null == fileObj) { + log.error("文件不存在,field={}", field); + continue; + } + Date uploadTime = fileObj.getUploadTime(); + LocalDateTime localDate = DateUtil.toLocalDateTime(uploadTime); + if (null == localDate) { + localDate = DateUtil.toLocalDateTime(new Date()); + } + String formatDate = DateUtil.formatDateTime(localDate, DateTimeFormatter.ofPattern("yyyyMMddHHmm")); + + FileUploadLoad fileUploadLoad = new FileUploadLoad(fileObj.getName(), formatDate, field); + fileObj.setName(fileUploadLoad.getFileName()); + fileClientService.update(fileObj); + fileUploadLoadList.add(fileUploadLoad); + } + + Map> fileUploadMap = fileUploadLoadList.stream().collect(Collectors.groupingBy(FileUploadLoad::getJobNum)); + + + JSONArray datas = new JSONArray(); + Long formId = ebuilderBaseMapper.getFormIdByTableName(baseParam, "uf_jcl_rzgl"); + + for (Map.Entry> entry : fileUploadMap.entrySet()) { + String jobNum = entry.getKey(); + // 入职记录ID + Long entryRecordId = entryManageMapper.getEntryRecordIdByJobNum(baseParam, jobNum); + if (null == entryRecordId) { + continue; + } + List personFileUploadLoadList = entry.getValue(); + + // 根据文件类型分组,并将同一类别的附件ID用逗号分隔 + Map> fileTypeMap = personFileUploadLoadList.stream().collect(Collectors.groupingBy(FileUploadLoad::getFileTypeName)); + // 组合更新的JOSN对象 + JSONObject mainDataObj = new JSONObject(); + mainDataObj.put("id", entryRecordId); + fileTypeMap.forEach((fileTypeName, list) -> { + FileUploadType byName = FileUploadType.getByName(fileTypeName); + if (null != byName) { + String fieldIds = reUploadFiled(entryRecordId, list, formId, byName.getDbName()); + mainDataObj.put(byName.getDbName(), fieldIds); + } + }); + JSONObject dataObj = new JSONObject(); + dataObj.put("mainTable", mainDataObj); + log.error("dataObj===" + dataObj); + datas.add(dataObj); + } + + Long objId = ebuilderBaseMapper.getObjIdByTableName(baseParam, "uf_jcl_rzgl"); + Long userId = UserContext.getCurrentUser().getEmployeeId(); + + String updateMsg = updateEbTable(datas, String.valueOf(objId), String.valueOf(userId)); + Map actionMap = new HashMap<>(); + actionMap.put("updateMsg", updateMsg); + return WeaResult.success(actionMap); + } + + /** + * 更新EB表单数据 + * + * @param datas + * @param objId + * @param userId + * @return + */ + private String updateEbTable(JSONArray datas, String objId, String userId) { + JSONObject dataJson = new JSONObject(); + JSONObject operationinfo = new JSONObject(); + operationinfo.put("fieldNoFindIgnore", "true"); + operationinfo.put("doAction", "false"); + JSONObject header = new JSONObject(); + header.put("objId", objId); + + dataJson.put("datas", datas); + dataJson.put("header", header); + dataJson.put("operationinfo", operationinfo); + + JSONObject jsonObject = new JSONObject(); + jsonObject.put("datajson", dataJson); + jsonObject.put("userid", userId); + // 请求授权 + String papiCode = PapiUtil.getPapiCode(ApplicationConfigConstant.APP_URL, ApplicationConfigConstant.CORP_ID, "A1a"); + String papiToken = PapiUtil.getPapiToken(ApplicationConfigConstant.APP_URL, ApplicationConfigConstant.ORGANIZATION_APP_KEY, ApplicationConfigConstant.ORGANIZATION_APP_SECRET, papiCode); + jsonObject.put("access_token", papiToken); + + log.error("jsonObject===" + jsonObject); + + return HttpRequest.post(ApplicationConfigConstant.APP_URL + "/papi/openapi/api/ebuilder/form/dataset/v2/updateFormData") + .header("Content-Type", "application/json") + .body(jsonObject.toJSONString()) + .execute() + .body(); + } + + /** + * 将文件上传到EB + * + * @param entryRecordId + * @param fileUploadLoadList + * @param formId + * @param fieldName + * @return + */ + private String reUploadFiled(Long entryRecordId, List fileUploadLoadList, Long formId, String fieldName) { + List newFieldIds = new ArrayList<>(); + FormField formField = ebuilderBaseMapper.getFormFieldByFieldName(baseParam, formId, fieldName); + if (null != formField) { + Long folderIdByFieldId = ebuilderBaseMapper.getFolderIdByFieldId(baseParam, formField.getId()); + for (FileUploadLoad fileUploadLoad : fileUploadLoadList) { + FileData fileData = fileDownloadService.downloadFile(fileUploadLoad.getFileId()); + FileObj fileObj = fileData.getFileObj(); + RemoteUploadParam uploadParam = new RemoteUploadParam(fileObj.getName(), String.valueOf(System.currentTimeMillis()), "ebuilderform"); + uploadParam.setRefId(entryRecordId); + uploadParam.setFolderId(folderIdByFieldId); + + InputStream inputStream = fileData.getInputStream(); + FileObj fileObj1 = fileUploadService.uploadLocalFile(inputStream, UserContext.getCurrentUser().getEmployeeId(), fileObj.getType(), uploadParam); + if (null != fileObj1) { + newFieldIds.add(fileObj1.getId().toString()); + } + } + } + return StringUtils.join(newFieldIds, ","); + } + + +} diff --git a/secondev-chabaidao-portal/src/main/java/com/weaver/seconddev/portal/constant/ApplicationConfigConstant.java b/secondev-chabaidao-portal/src/main/java/com/weaver/seconddev/portal/constant/ApplicationConfigConstant.java new file mode 100644 index 0000000..d8dbb39 --- /dev/null +++ b/secondev-chabaidao-portal/src/main/java/com/weaver/seconddev/portal/constant/ApplicationConfigConstant.java @@ -0,0 +1,39 @@ +package com.weaver.seconddev.portal.constant; + +/** + * @author:dxfeng + * @createTime: 2025/07/28 + * @version: 1.0 + */ + +public class ApplicationConfigConstant { + /** + * 应用端URL + */ + public static final String APP_URL = "http://10.60.4.124:30609"; + /** + * Corp id + */ + public static final String CORP_ID = "ec7de918480e79abe774982cf075c045"; + /** + * 组织中心APP Key + */ + public static final String ORGANIZATION_APP_KEY = "c003f58a174a12abebb9fdfa5ba800c2"; + /** + * 组织中心APP Secret + */ + public static final String ORGANIZATION_APP_SECRET = "332ed6328a15f6189efa4d2ac5935bc1"; + + + /** + * 千里聆服务APP ID + */ + public static final String OCR_APP_ID = "6ou6wvl8"; + /** + * 千里聆服务APP SECRET + */ + public static final String OCR_APP_SECRET = "53fc247ffe4f3e8d6c96a5d0a9a222a7"; + + public static final String ID_CARD_OCR_URL = "https://open.easst.cn/openapi/rest/common/idcardocr"; + public static final String BANK_CARD_OCR_URL = "https://open.easst.cn/openapi/rest/common/bank_card_ocr"; +} diff --git a/secondev-chabaidao-portal/src/main/java/com/weaver/seconddev/portal/controller/EmployeePortalController.java b/secondev-chabaidao-portal/src/main/java/com/weaver/seconddev/portal/controller/EmployeePortalController.java new file mode 100644 index 0000000..4b459f3 --- /dev/null +++ b/secondev-chabaidao-portal/src/main/java/com/weaver/seconddev/portal/controller/EmployeePortalController.java @@ -0,0 +1,43 @@ +package com.weaver.seconddev.portal.controller; + +import com.weaver.common.authority.annotation.WeaPermission; +import com.weaver.common.base.entity.result.WeaResult; +import com.weaver.seconddev.portal.entity.po.EmployeeBasicInfoPo; +import com.weaver.seconddev.portal.service.EmployeePortalService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.Map; + +/** + * @author:dxfeng + * @createTime: 2025/07/11 + * @version: 1.0 + */ +@Slf4j +@RestController +@RequestMapping("/api/secondev/portal/employee") +@WeaPermission(publicPermission = true) +public class EmployeePortalController { + + @Autowired + EmployeePortalService employeePortalService; + + @PostMapping("/getDurationOfEmployment") + private WeaResult> getDurationOfEmployment(@RequestBody Map params) { + return employeePortalService.getDurationOfEmployment(params); + } + + + @PostMapping("/getEmployeeInfo") + private WeaResult getEmployeeInfo(@RequestHeader Map header, @RequestBody Map params) { + String origin = header.get("origin"); + // 考勤标准接口 + String otherApiUrl = origin + "/api/attend/web/attendInfoV2/getAttendInfoStatis"; + params.put("otherApiUrl", otherApiUrl); + params.put("header",header); + return employeePortalService.getEmployeeInfo(params); + } + +} diff --git a/secondev-chabaidao-portal/src/main/java/com/weaver/seconddev/portal/controller/HrbpPortalController.java b/secondev-chabaidao-portal/src/main/java/com/weaver/seconddev/portal/controller/HrbpPortalController.java new file mode 100644 index 0000000..5f5418b --- /dev/null +++ b/secondev-chabaidao-portal/src/main/java/com/weaver/seconddev/portal/controller/HrbpPortalController.java @@ -0,0 +1,45 @@ +package com.weaver.seconddev.portal.controller; + +import com.weaver.common.authority.annotation.WeaPermission; +import com.weaver.common.base.entity.result.WeaResult; +import com.weaver.seconddev.portal.service.HrbpPortalService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.Map; + +/** + * @author:dxfeng + * @createTime: 2025/07/10 + * @version: 1.0 + */ + +@Slf4j +@RestController +@RequestMapping("/api/secondev/portal/hrbp") +@WeaPermission(publicPermission = true) +public class HrbpPortalController { + + @Autowired + HrbpPortalService hrPortalService; + + + @PostMapping("/getToDo") + private WeaResult> getToDo(@RequestBody Map params) { + return hrPortalService.getToDo(params); + } + + @PostMapping("/getEmployeeData") + private WeaResult> getEmployeeData(@RequestBody Map params) { + return hrPortalService.getEmployeeData(params); + } + + @PostMapping("/getTodayOverview") + private WeaResult> getTodayOverview(@RequestBody Map params) { + return hrPortalService.getTodayOverview(params); + } +} diff --git a/secondev-chabaidao-portal/src/main/java/com/weaver/seconddev/portal/controller/LeaderCockpitController.java b/secondev-chabaidao-portal/src/main/java/com/weaver/seconddev/portal/controller/LeaderCockpitController.java new file mode 100644 index 0000000..76c0333 --- /dev/null +++ b/secondev-chabaidao-portal/src/main/java/com/weaver/seconddev/portal/controller/LeaderCockpitController.java @@ -0,0 +1,62 @@ +package com.weaver.seconddev.portal.controller; + +import com.weaver.common.authority.annotation.WeaPermission; +import com.weaver.common.base.entity.result.WeaResult; +import com.weaver.seconddev.portal.entity.po.PortalPO; +import com.weaver.seconddev.portal.service.LeaderCockpitService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.List; +import java.util.Map; + +/** + * @author:dxfeng + * @createTime: 2025/07/07 + * @version: 1.0 + */ +@Slf4j +@RestController +@RequestMapping("/api/secondev/portal/leader") +@WeaPermission(publicPermission = true) +public class LeaderCockpitController { + + @Autowired + LeaderCockpitService leaderCockpitService; + + @PostMapping("/getOnJobNumber") + private WeaResult> getOnJobNumber(@RequestBody Map params) { + return leaderCockpitService.getOnJobNumber(params); + } + + @PostMapping("/getLaborCost") + private WeaResult> getLaborCost(@RequestBody Map params) { + return leaderCockpitService.getLaborCost(params); + } + + @PostMapping("/getTurnoverRate") + private WeaResult> getTurnoverRate(@RequestBody Map params) { + return leaderCockpitService.getTurnoverRate(params); + } + + @PostMapping("/getAttendanceRate") + private WeaResult> getAttendanceRate(@RequestBody Map params) { + return leaderCockpitService.getAttendanceRate(params); + } + + @PostMapping("/getFullStaffingRate") + private WeaResult> getFullStaffingRate(@RequestHeader Map header, @RequestBody Map params) { + return leaderCockpitService.getFullStaffingRate(header, params); + } + + @PostMapping("/getEmploymentStatus") + private WeaResult> getEmploymentStatus(@RequestBody Map params) { + return leaderCockpitService.getEmploymentStatus(params); + } + + @PostMapping("/getResignationSituation") + private WeaResult> getResignationSituation(@RequestBody Map params) { + return leaderCockpitService.getResignationSituation(params); + } +} diff --git a/secondev-chabaidao-portal/src/main/java/com/weaver/seconddev/portal/controller/ManagerPortalController.java b/secondev-chabaidao-portal/src/main/java/com/weaver/seconddev/portal/controller/ManagerPortalController.java new file mode 100644 index 0000000..5ec8ae0 --- /dev/null +++ b/secondev-chabaidao-portal/src/main/java/com/weaver/seconddev/portal/controller/ManagerPortalController.java @@ -0,0 +1,80 @@ +package com.weaver.seconddev.portal.controller; + +import com.weaver.common.authority.annotation.WeaPermission; +import com.weaver.common.base.entity.result.WeaResult; +import com.weaver.seconddev.portal.entity.component.Option; +import com.weaver.seconddev.portal.service.ManagerPortalService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; +import java.util.Map; + +/** + * @author:dxfeng + * @createTime: 2025/07/09 + * @version: 1.0 + */ +@Slf4j +@RestController +@RequestMapping("/api/secondev/portal/manager") +@WeaPermission(publicPermission = true) +public class ManagerPortalController { + + @Autowired + ManagerPortalService managerPortalService; + + @PostMapping("/getMangerInfo") + private WeaResult> getMangerInfo(@RequestBody Map params) { + return managerPortalService.getMangerInfo(params); + } + + @PostMapping("/getTodayOverview") + private WeaResult> getTodayOverview(@RequestBody Map params) { + return managerPortalService.getTodayOverview(params); + } + + @PostMapping("/getBasicPersonnel") + private WeaResult> getBasicPersonnel(@RequestBody Map params) { + return managerPortalService.getBasicPersonnel(params); + } + + @PostMapping("/getBasicPersonnelSql") + private WeaResult getBasicPersonnelSql(@RequestBody Map params) { + return managerPortalService.getBasicPersonnelSql(params); + } + + @PostMapping("/getTeamMemorialDay") + private WeaResult> getTeamMemorialDay(@RequestBody Map params) { + return managerPortalService.getTeamMemorialDay(params); + } + @PostMapping("/getTeamMemorialDaySql") + private WeaResult getTeamMemorialDaySql(@RequestBody Map params) { + return managerPortalService.getTeamMemorialDaySql(params); + } + + @PostMapping("/getEducationInfo") + private WeaResult> getEducationInfo(@RequestBody Map params) { + return managerPortalService.getEducationInfo(params); + } + + @PostMapping("/getAttendanceInfo") + private WeaResult> getAttendanceInfo(@RequestBody Map params) { + return managerPortalService.getAttendanceInfo(params); + } + + @PostMapping("/getTeamEmployee") + private WeaResult> getTeamEmployee(@RequestBody Map params) { + return managerPortalService.getTeamEmployee(params); + } + + @PostMapping("/getEbFieldOptions") + private WeaResult> getEbFieldOptions(@RequestBody Map params) { + return managerPortalService.getEbFieldOptions(params); + } + +} diff --git a/secondev-chabaidao-portal/src/main/java/com/weaver/seconddev/portal/controller/SscPortalController.java b/secondev-chabaidao-portal/src/main/java/com/weaver/seconddev/portal/controller/SscPortalController.java new file mode 100644 index 0000000..94d8380 --- /dev/null +++ b/secondev-chabaidao-portal/src/main/java/com/weaver/seconddev/portal/controller/SscPortalController.java @@ -0,0 +1,34 @@ +package com.weaver.seconddev.portal.controller; + +import com.weaver.common.authority.annotation.WeaPermission; +import com.weaver.common.base.entity.result.WeaResult; +import com.weaver.seconddev.portal.entity.po.ExpirationReminderPo; +import com.weaver.seconddev.portal.service.SscPortalService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.Map; + +/** + * @author:dxfeng + * @createTime: 2025/07/15 + * @version: 1.0 + */ +@Slf4j +@RestController +@RequestMapping("/api/secondev/portal/ssc") +@WeaPermission(publicPermission = true) +public class SscPortalController { + + @Autowired + SscPortalService sscPortalService; + + @PostMapping("/getExpirationReminder") + private WeaResult getExpirationReminder(@RequestBody Map params) { + return sscPortalService.getExpirationReminder(params); + } +} diff --git a/secondev-chabaidao-portal/src/main/java/com/weaver/seconddev/portal/entity/bo/EmployeeStaffBo.java b/secondev-chabaidao-portal/src/main/java/com/weaver/seconddev/portal/entity/bo/EmployeeStaffBo.java new file mode 100644 index 0000000..e276886 --- /dev/null +++ b/secondev-chabaidao-portal/src/main/java/com/weaver/seconddev/portal/entity/bo/EmployeeStaffBo.java @@ -0,0 +1,41 @@ +package com.weaver.seconddev.portal.entity.bo; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.weaver.seconddev.portal.entity.po.cfg.EmployeeStaff; + +import java.util.List; + +/** + * @author:dxfeng + * @createTime: 2025/07/23 + * @version: 1.0 + */ +public class EmployeeStaffBo { + public static List mapEmployeeStaffData(String responseJson) { + // 解析接口返回的 JSON 数据 + JSONObject responseObj = JSON.parseObject(responseJson); + + // 判断接口是否响应成功 + if (responseObj.containsKey("code") && responseObj.getIntValue("code") == 200 && responseObj.containsKey("status") && responseObj.getBooleanValue("status")) { + // 判断是否存在 data 和 displayData 字段 + if (responseObj.containsKey("data")) { + JSONObject dataObj = responseObj.getJSONObject("data"); + if (dataObj.containsKey("displayData")) { + // 解析 displayData 对象集合 + return dataObj.getJSONArray("displayData").toJavaList(EmployeeStaff.class); + } else { + // displayData 字段不存在 + throw new IllegalArgumentException("displayData 字段不存在"); + } + } else { + // data 字段不存在 + throw new IllegalArgumentException("data 字段不存在"); + } + } else { + // 接口响应失败 + String errorMsg = responseObj.getString("msg"); + throw new RuntimeException("接口调用失败: " + errorMsg); + } + } +} diff --git a/secondev-chabaidao-portal/src/main/java/com/weaver/seconddev/portal/entity/component/Option.java b/secondev-chabaidao-portal/src/main/java/com/weaver/seconddev/portal/entity/component/Option.java new file mode 100644 index 0000000..d7c6ea7 --- /dev/null +++ b/secondev-chabaidao-portal/src/main/java/com/weaver/seconddev/portal/entity/component/Option.java @@ -0,0 +1,20 @@ +package com.weaver.seconddev.portal.entity.component; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * @author:dxfeng + * @createTime: 2025/07/16 + * @version: 1.0 + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +@Builder +public class Option { + private String id; + private String content; +} diff --git a/secondev-chabaidao-portal/src/main/java/com/weaver/seconddev/portal/entity/param/BaseParam.java b/secondev-chabaidao-portal/src/main/java/com/weaver/seconddev/portal/entity/param/BaseParam.java new file mode 100644 index 0000000..941daac --- /dev/null +++ b/secondev-chabaidao-portal/src/main/java/com/weaver/seconddev/portal/entity/param/BaseParam.java @@ -0,0 +1,48 @@ +package com.weaver.seconddev.portal.entity.param; + +import lombok.Data; +import org.apache.commons.lang.StringUtils; + +/** + * @author:dxfeng + * @createTime: 2025/07/11 + * @version: 1.0 + */ +@Data +public class BaseParam { + private String e10_common = "e10_common"; + private String e10_core_business = "e10_core_business"; + private String e10_other_business = "e10_other_business"; + private String ec_secondev = "ec_secondev"; + private String eteams = "eteams"; + + /** + * 部门自定义表 + */ + private String table_dept_cus = "ft_1154218872715993098"; + /** + * 岗位自定义表 + */ + private String table_job_cus = "ft_1155455711525494797"; + + /** + * 请假表单 + */ + private String leaveFormCus = "ft_1151420254779654145"; + ///** + // * 员工自定义表 + // */ + //private String table_emp_cus = "ft_1152026012537184302"; + /** + * 租户标识 + */ + private String tenantKey; + + public String getTenantKey() { + if (StringUtils.isBlank(tenantKey)) { + // 租户默认值 + return "t024j0gfn0"; + } + return tenantKey; + } +} diff --git a/secondev-chabaidao-portal/src/main/java/com/weaver/seconddev/portal/entity/param/BasicPersonnelParam.java b/secondev-chabaidao-portal/src/main/java/com/weaver/seconddev/portal/entity/param/BasicPersonnelParam.java new file mode 100644 index 0000000..42886b2 --- /dev/null +++ b/secondev-chabaidao-portal/src/main/java/com/weaver/seconddev/portal/entity/param/BasicPersonnelParam.java @@ -0,0 +1,36 @@ +package com.weaver.seconddev.portal.entity.param; + +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.util.Set; + +/** + * @author:dxfeng + * @createTime: 2025/07/08 + * @version: 1.0 + */ +@Data +@EqualsAndHashCode(callSuper = false) +public class BasicPersonnelParam extends BaseParam { + private Set departmentIdList; + private String searchType; + private String startDate; + private String endDate; + private String pieType; + private Integer startIndex; + private Integer endIndex; + private String belongYear; + + /*分页查询*/ + + private String searchKey; + private String departmentId; + private Integer current; + private Integer offset; + private Integer pageSize; + + public Integer getOffset() { + return (current - 1) * pageSize; + } +} diff --git a/secondev-chabaidao-portal/src/main/java/com/weaver/seconddev/portal/entity/param/EmployeePortalParam.java b/secondev-chabaidao-portal/src/main/java/com/weaver/seconddev/portal/entity/param/EmployeePortalParam.java new file mode 100644 index 0000000..286571a --- /dev/null +++ b/secondev-chabaidao-portal/src/main/java/com/weaver/seconddev/portal/entity/param/EmployeePortalParam.java @@ -0,0 +1,15 @@ +package com.weaver.seconddev.portal.entity.param; + +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * @author:dxfeng + * @createTime: 2025/07/14 + * @version: 1.0 + */ +@Data +@EqualsAndHashCode(callSuper = false) +public class EmployeePortalParam extends BaseParam { + private Long employeeId; +} diff --git a/secondev-chabaidao-portal/src/main/java/com/weaver/seconddev/portal/entity/param/HrbpParam.java b/secondev-chabaidao-portal/src/main/java/com/weaver/seconddev/portal/entity/param/HrbpParam.java new file mode 100644 index 0000000..6a9d9e5 --- /dev/null +++ b/secondev-chabaidao-portal/src/main/java/com/weaver/seconddev/portal/entity/param/HrbpParam.java @@ -0,0 +1,17 @@ +package com.weaver.seconddev.portal.entity.param; + +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.util.Set; + +/** + * @author:dxfeng + * @createTime: 2025/07/10 + * @version: 1.0 + */ +@Data +@EqualsAndHashCode(callSuper = false) +public class HrbpParam extends BaseParam{ + private Set departmentIdList; +} diff --git a/secondev-chabaidao-portal/src/main/java/com/weaver/seconddev/portal/entity/param/SearchConditionParam.java b/secondev-chabaidao-portal/src/main/java/com/weaver/seconddev/portal/entity/param/SearchConditionParam.java new file mode 100644 index 0000000..680e994 --- /dev/null +++ b/secondev-chabaidao-portal/src/main/java/com/weaver/seconddev/portal/entity/param/SearchConditionParam.java @@ -0,0 +1,27 @@ +package com.weaver.seconddev.portal.entity.param; + +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.util.Set; + +/** + * @author:dxfeng + * @createTime: 2025/07/07 + * @version: 1.0 + */ +@Data +@EqualsAndHashCode(callSuper = false) +public class SearchConditionParam extends BaseParam{ + private String departmentId; + private Set departmentIdList; + private String searchDate; + private String startDate; + private String endDate; + + private Set selectDepartmentId; + /** + * 是否关键人员 + */ + private String isKeyPerson; +} diff --git a/secondev-chabaidao-portal/src/main/java/com/weaver/seconddev/portal/entity/param/SscParam.java b/secondev-chabaidao-portal/src/main/java/com/weaver/seconddev/portal/entity/param/SscParam.java new file mode 100644 index 0000000..26df448 --- /dev/null +++ b/secondev-chabaidao-portal/src/main/java/com/weaver/seconddev/portal/entity/param/SscParam.java @@ -0,0 +1,18 @@ +package com.weaver.seconddev.portal.entity.param; + +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.util.Set; + +/** + * @author:dxfeng + * @createTime: 2025/07/15 + * @version: 1.0 + */ +@Data +@EqualsAndHashCode(callSuper = false) +public class SscParam extends BaseParam { + private Set departmentIdList; + private String currentDate; +} diff --git a/secondev-chabaidao-portal/src/main/java/com/weaver/seconddev/portal/entity/po/EmployeeBasicInfoPo.java b/secondev-chabaidao-portal/src/main/java/com/weaver/seconddev/portal/entity/po/EmployeeBasicInfoPo.java new file mode 100644 index 0000000..d97e578 --- /dev/null +++ b/secondev-chabaidao-portal/src/main/java/com/weaver/seconddev/portal/entity/po/EmployeeBasicInfoPo.java @@ -0,0 +1,94 @@ +package com.weaver.seconddev.portal.entity.po; + +import com.weaver.teams.domain.user.Avatar; +import lombok.Data; + +/** + * @author:dxfeng + * @createTime: 2025/07/14 + * @version: 1.0 + */ +@Data +public class EmployeeBasicInfoPo { + private Long employeeId; + + /** + * 姓名 + */ + private String userName; + /** + * 头像 + */ + private Avatar avatar; + /** + * 工号 + */ + private String workCode; + /** + * 公司名称 + */ + private String companyName; + private String departmentName; + /** + * 入职日期 + */ + private String hireDate; + /** + * 人员状态 + */ + private String employeeStatus; + /** + * 直接上级 + */ + private String directSuperior; + /** + * 年假余额 + */ + private String annualLeaveBalance; + private String annualLeaveBalanceUrl; + /** + * 调休余额 + */ + private String leaveBalance; + private String leaveBalanceUrl; + /** + * 带薪病假余额 + */ + private String paidSickLeaveBalance; + private String paidSickLeaveBalanceUrl; + /** + * 应出勤天数 + */ + private String expectedAttendance; + private String expectedAttendanceUrl; + /** + * 实际出勤 + */ + private String actualAttendance; + private String actualAttendanceUrl; + /** + * 请假 + */ + private String leave; + private String leaveUrl; + /** + * 出差 + */ + private String travel; + private String travelUrl; + /** + * 加班 + */ + private String overtime; + private String overtimeUrl; + /** + * 公出 + */ + private String publicLeave; + private String publicLeaveUrl; + /** + * 异常出勤 + */ + private String exceptionalAttendance; + private String exceptionalAttendanceUrl; +} diff --git a/secondev-chabaidao-portal/src/main/java/com/weaver/seconddev/portal/entity/po/ExpirationReminderPo.java b/secondev-chabaidao-portal/src/main/java/com/weaver/seconddev/portal/entity/po/ExpirationReminderPo.java new file mode 100644 index 0000000..a4be73e --- /dev/null +++ b/secondev-chabaidao-portal/src/main/java/com/weaver/seconddev/portal/entity/po/ExpirationReminderPo.java @@ -0,0 +1,37 @@ +package com.weaver.seconddev.portal.entity.po; + +import lombok.Data; + +/** + * @author:dxfeng + * @createTime: 2025/07/15 + * @version: 1.0 + */ +@Data +public class ExpirationReminderPo { + /** + * 合同到期 + */ + private int contractExpiration; + private String contractExpirationUrl; + /** + * 身份证到期 + */ + private int idCardExpiration; + private String idCardExpirationUrl; + /** + * 健康证到期 + */ + private int healthCertificateExpiration; + private String healthCertificateExpirationUrl; + /** + * 入职周年提醒 + */ + private int employmentAnniversary; + private String employmentAnniversaryUrl; + /** + * 管理层生日提醒 + */ + private int birthdayNum; + private String birthdayNumUrl; +} diff --git a/secondev-chabaidao-portal/src/main/java/com/weaver/seconddev/portal/entity/po/LateAndEarlyRankPo.java b/secondev-chabaidao-portal/src/main/java/com/weaver/seconddev/portal/entity/po/LateAndEarlyRankPo.java new file mode 100644 index 0000000..a840ca2 --- /dev/null +++ b/secondev-chabaidao-portal/src/main/java/com/weaver/seconddev/portal/entity/po/LateAndEarlyRankPo.java @@ -0,0 +1,17 @@ +package com.weaver.seconddev.portal.entity.po; + +import lombok.Data; + +/** + * @author:dxfeng + * @createTime: 2025/07/29 + * @version: 1.0 + */ +@Data +public class LateAndEarlyRankPo { + private Long empId; + private String empName; + private String departmentName; + private Integer times; + private Integer minutes; +} diff --git a/secondev-chabaidao-portal/src/main/java/com/weaver/seconddev/portal/entity/po/PieChartConfig.java b/secondev-chabaidao-portal/src/main/java/com/weaver/seconddev/portal/entity/po/PieChartConfig.java new file mode 100644 index 0000000..115a0a8 --- /dev/null +++ b/secondev-chabaidao-portal/src/main/java/com/weaver/seconddev/portal/entity/po/PieChartConfig.java @@ -0,0 +1,19 @@ +package com.weaver.seconddev.portal.entity.po; + +import lombok.Data; + +/** + * @author:dxfeng + * @createTime: 2025/07/10 + * @version: 1.0 + */ +@Data +public class PieChartConfig { + private String type; + private String name; + private String educationIds; + private Integer startIndex; + private Integer endIndex; + private String gradeIds; + private Integer orderNum; +} diff --git a/secondev-chabaidao-portal/src/main/java/com/weaver/seconddev/portal/entity/po/PortalData.java b/secondev-chabaidao-portal/src/main/java/com/weaver/seconddev/portal/entity/po/PortalData.java new file mode 100644 index 0000000..2cdfef7 --- /dev/null +++ b/secondev-chabaidao-portal/src/main/java/com/weaver/seconddev/portal/entity/po/PortalData.java @@ -0,0 +1,20 @@ +package com.weaver.seconddev.portal.entity.po; + +import lombok.Data; + +/** + * @author:dxfeng + * @createTime: 2025/07/07 + * @version: 1.0 + */ +@Data +public class PortalData { + private String index; + private String date; + private String depart; + private String posi; + private String leader; + private String count; + private Integer all; + private Integer key; +} diff --git a/secondev-chabaidao-portal/src/main/java/com/weaver/seconddev/portal/entity/po/PortalPO.java b/secondev-chabaidao-portal/src/main/java/com/weaver/seconddev/portal/entity/po/PortalPO.java new file mode 100644 index 0000000..c1d76e1 --- /dev/null +++ b/secondev-chabaidao-portal/src/main/java/com/weaver/seconddev/portal/entity/po/PortalPO.java @@ -0,0 +1,15 @@ +package com.weaver.seconddev.portal.entity.po; + +import lombok.Data; + +/** + * @author:dxfeng + * @createTime: 2025/07/07 + * @version: 1.0 + */ +@Data +public class PortalPO { + private String value; + private String name; + private String id; +} diff --git a/secondev-chabaidao-portal/src/main/java/com/weaver/seconddev/portal/entity/po/PortalUrlDetail.java b/secondev-chabaidao-portal/src/main/java/com/weaver/seconddev/portal/entity/po/PortalUrlDetail.java new file mode 100644 index 0000000..d816b32 --- /dev/null +++ b/secondev-chabaidao-portal/src/main/java/com/weaver/seconddev/portal/entity/po/PortalUrlDetail.java @@ -0,0 +1,16 @@ +package com.weaver.seconddev.portal.entity.po; + +import lombok.Data; + +/** + * @author:dxfeng + * @createTime: 2025/07/11 + * @version: 1.0 + */ +@Data +public class PortalUrlDetail { + private String id; + private String detailKey; + private String urlAddress; + private String detailName; +} diff --git a/secondev-chabaidao-portal/src/main/java/com/weaver/seconddev/portal/entity/po/Position.java b/secondev-chabaidao-portal/src/main/java/com/weaver/seconddev/portal/entity/po/Position.java new file mode 100644 index 0000000..9358327 --- /dev/null +++ b/secondev-chabaidao-portal/src/main/java/com/weaver/seconddev/portal/entity/po/Position.java @@ -0,0 +1,18 @@ +package com.weaver.seconddev.portal.entity.po; + +import lombok.Data; + +/** + * @author:dxfeng + * @createTime: 2025/07/08 + * @version: 1.0 + */ +@Data +public class Position { + private Long positionId; + private String positionName; + private Long departmentId; + private String departmentName; + private Long gradeId; + private String gradeName; +} diff --git a/secondev-chabaidao-portal/src/main/java/com/weaver/seconddev/portal/entity/po/TeamEmployeePo.java b/secondev-chabaidao-portal/src/main/java/com/weaver/seconddev/portal/entity/po/TeamEmployeePo.java new file mode 100644 index 0000000..3c671a5 --- /dev/null +++ b/secondev-chabaidao-portal/src/main/java/com/weaver/seconddev/portal/entity/po/TeamEmployeePo.java @@ -0,0 +1,52 @@ +package com.weaver.seconddev.portal.entity.po; + +import lombok.Data; +import org.apache.commons.lang.StringUtils; + +/** + * @author:dxfeng + * @createTime: 2025/07/15 + * @version: 1.0 + */ +@Data +public class TeamEmployeePo { + /** + * 姓名 + */ + private String userName; + /** + * 部门 + */ + private String departmentName; + /** + * 岗位 + */ + private String jobPositionName; + /** + * 职级 + */ + private String jobLevelName; + /** + * 入职日期 + */ + private String hireDate; + /** + * 学校 + */ + private String schoolName; + /** + * 学历 + */ + private String educationName; + /** + * 年龄 + */ + private String age; + + public String getAge() { + if (StringUtils.isNotBlank(age)) { + return age + "岁"; + } + return age; + } +} diff --git a/secondev-chabaidao-portal/src/main/java/com/weaver/seconddev/portal/entity/po/cfg/EmployeeStaff.java b/secondev-chabaidao-portal/src/main/java/com/weaver/seconddev/portal/entity/po/cfg/EmployeeStaff.java new file mode 100644 index 0000000..aeafba8 --- /dev/null +++ b/secondev-chabaidao-portal/src/main/java/com/weaver/seconddev/portal/entity/po/cfg/EmployeeStaff.java @@ -0,0 +1,95 @@ +package com.weaver.seconddev.portal.entity.po.cfg; + +import lombok.Data; + +/** + * @author:dxfeng + * @createTime: 2025/07/23 + * @version: 1.0 + */ +@Data +public class EmployeeStaff { + /** + * 主键id + */ + private String id; + /** + * 组织ID + */ + private String orgId; + /** + * 组织 + */ + private String orgName; + /** + * 组织全名 + */ + private String orgFullName; + private String isParent; + /** + * 编制方案ID + */ + private String planId; + /** + * 编制方案名称 + */ + private String planName; + /** + * 年份 + */ + private Integer year; + /** + * 超编管控 + */ + private String overCtrl; + /** + * 编制数(含下级) + */ + private Integer estCountWithSub; + /** + * 编制数(本级) + */ + private Integer estCount; + /** + * 在编数(本级) + */ + private Integer numberingCount; + /** + * 在编数(含下级) + */ + private Integer numberingCountWithSub; + /** + * 预增数(本级) + */ + private Integer preAddEmpCount; + /** + * 预增数(含下级) + */ + private Integer preAddEmpCountWithSub; + /** + * 预减数(本级) + */ + private Integer preSubEmpCount; + /** + * 预减数(含下级) + */ + private Integer preSubEmpCountWithSub; + /** + * 缺编数(本级) + */ + private Integer estLackCount; + /** + * 缺编数(含下级) + */ + private Integer estLackCountWithSub; + /** + * 超编数(本级) + */ + private Integer estOverCount; + /** + * 超编数(含下级) + */ + private Integer estOverCountWithSub; + private Integer hasLink; + private Integer hasDc; +} diff --git a/secondev-chabaidao-portal/src/main/java/com/weaver/seconddev/portal/entity/po/cfg/FormDatas.java b/secondev-chabaidao-portal/src/main/java/com/weaver/seconddev/portal/entity/po/cfg/FormDatas.java new file mode 100644 index 0000000..186953d --- /dev/null +++ b/secondev-chabaidao-portal/src/main/java/com/weaver/seconddev/portal/entity/po/cfg/FormDatas.java @@ -0,0 +1,28 @@ +package com.weaver.seconddev.portal.entity.po.cfg; + +/** + * @author: dxfeng + * @createTime: 2025/07/23 + * @version: 1.0 + */ +public class FormDatas { + private FormDatasDetail formDatas; + private QuickSearchDatas quickSearchDatas; + + // Getters and Setters + public FormDatasDetail getFormDatas() { + return formDatas; + } + + public void setFormDatas(FormDatasDetail formDatas) { + this.formDatas = formDatas; + } + + public QuickSearchDatas getQuickSearchDatas() { + return quickSearchDatas; + } + + public void setQuickSearchDatas(QuickSearchDatas quickSearchDatas) { + this.quickSearchDatas = quickSearchDatas; + } +} diff --git a/secondev-chabaidao-portal/src/main/java/com/weaver/seconddev/portal/entity/po/cfg/FormDatasDetail.java b/secondev-chabaidao-portal/src/main/java/com/weaver/seconddev/portal/entity/po/cfg/FormDatasDetail.java new file mode 100644 index 0000000..308cb0f --- /dev/null +++ b/secondev-chabaidao-portal/src/main/java/com/weaver/seconddev/portal/entity/po/cfg/FormDatasDetail.java @@ -0,0 +1,34 @@ +package com.weaver.seconddev.portal.entity.po.cfg; + +import java.util.List; + +public class FormDatasDetail { + private List org; + private List overCtrl; + private List month; + + // Getters and Setters + public List getOrg() { + return org; + } + + public void setOrg(List org) { + this.org = org; + } + + public List getOverCtrl() { + return overCtrl; + } + + public void setOverCtrl(List overCtrl) { + this.overCtrl = overCtrl; + } + + public List getMonth() { + return month; + } + + public void setMonth(List month) { + this.month = month; + } +} diff --git a/secondev-chabaidao-portal/src/main/java/com/weaver/seconddev/portal/entity/po/cfg/MonthWrapper.java b/secondev-chabaidao-portal/src/main/java/com/weaver/seconddev/portal/entity/po/cfg/MonthWrapper.java new file mode 100644 index 0000000..7628f69 --- /dev/null +++ b/secondev-chabaidao-portal/src/main/java/com/weaver/seconddev/portal/entity/po/cfg/MonthWrapper.java @@ -0,0 +1,14 @@ +package com.weaver.seconddev.portal.entity.po.cfg; + +public class MonthWrapper { + private String month; + + // Getters and Setters + public String getMonth() { + return month; + } + + public void setMonth(String month) { + this.month = month; + } +} diff --git a/secondev-chabaidao-portal/src/main/java/com/weaver/seconddev/portal/entity/po/cfg/OrgItem.java b/secondev-chabaidao-portal/src/main/java/com/weaver/seconddev/portal/entity/po/cfg/OrgItem.java new file mode 100644 index 0000000..9b6c08d --- /dev/null +++ b/secondev-chabaidao-portal/src/main/java/com/weaver/seconddev/portal/entity/po/cfg/OrgItem.java @@ -0,0 +1,14 @@ +package com.weaver.seconddev.portal.entity.po.cfg; + +public class OrgItem { + private String id; + + // Getters and Setters + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } +} diff --git a/secondev-chabaidao-portal/src/main/java/com/weaver/seconddev/portal/entity/po/cfg/OrgWrapper.java b/secondev-chabaidao-portal/src/main/java/com/weaver/seconddev/portal/entity/po/cfg/OrgWrapper.java new file mode 100644 index 0000000..b3af890 --- /dev/null +++ b/secondev-chabaidao-portal/src/main/java/com/weaver/seconddev/portal/entity/po/cfg/OrgWrapper.java @@ -0,0 +1,16 @@ +package com.weaver.seconddev.portal.entity.po.cfg; + +import java.util.List; + +public class OrgWrapper { + private List org; + + // Getters and Setters + public List getOrg() { + return org; + } + + public void setOrg(List org) { + this.org = org; + } +} diff --git a/secondev-chabaidao-portal/src/main/java/com/weaver/seconddev/portal/entity/po/cfg/OverCtrlWrapper.java b/secondev-chabaidao-portal/src/main/java/com/weaver/seconddev/portal/entity/po/cfg/OverCtrlWrapper.java new file mode 100644 index 0000000..b8e602f --- /dev/null +++ b/secondev-chabaidao-portal/src/main/java/com/weaver/seconddev/portal/entity/po/cfg/OverCtrlWrapper.java @@ -0,0 +1,14 @@ +package com.weaver.seconddev.portal.entity.po.cfg; + +public class OverCtrlWrapper { + private String overCtrl; + + // Getters and Setters + public String getOverCtrl() { + return overCtrl; + } + + public void setOverCtrl(String overCtrl) { + this.overCtrl = overCtrl; + } +} diff --git a/secondev-chabaidao-portal/src/main/java/com/weaver/seconddev/portal/entity/po/cfg/QuickSearchDatas.java b/secondev-chabaidao-portal/src/main/java/com/weaver/seconddev/portal/entity/po/cfg/QuickSearchDatas.java new file mode 100644 index 0000000..87f6ba8 --- /dev/null +++ b/secondev-chabaidao-portal/src/main/java/com/weaver/seconddev/portal/entity/po/cfg/QuickSearchDatas.java @@ -0,0 +1,4 @@ +package com.weaver.seconddev.portal.entity.po.cfg; + +public class QuickSearchDatas { +} diff --git a/secondev-chabaidao-portal/src/main/java/com/weaver/seconddev/portal/enums/PersonnelStatusEnum.java b/secondev-chabaidao-portal/src/main/java/com/weaver/seconddev/portal/enums/PersonnelStatusEnum.java new file mode 100644 index 0000000..21cbee2 --- /dev/null +++ b/secondev-chabaidao-portal/src/main/java/com/weaver/seconddev/portal/enums/PersonnelStatusEnum.java @@ -0,0 +1,60 @@ +package com.weaver.seconddev.portal.enums; + +/** + * @author:dxfeng + * @createTime: 2025/07/14 + * @version: 1.0 + */ +public enum PersonnelStatusEnum { + /** + * 1 试用、2 试用延期、3 正式、4 临时、5 实习、6 离职、7 退休、9 解聘、10 无效 + */ + TRY_OUT("1", "试用"), + TRY_OUT_DELAY("2", "试用延期"), + FORMAL("3", "正式"), + TEMPORARY("4", "临时"), + INTERNSHIP("5", "实习"), + LEAVE("6", "离职"), + RETIRED("7", "退休"), + INVALID("9", "解聘"), + QUIT("10", "无效"); + + PersonnelStatusEnum(String value, String showName) { + this.value = value; + this.showName = showName; + } + + private String value; + private String showName; + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + public String getShowName() { + return showName; + } + + public void setShowName(String showName) { + this.showName = showName; + } + + /** + * 根据value获取showName + * + * @param value + * @return + */ + public static String getShowNameByValue(String value) { + for (PersonnelStatusEnum item : PersonnelStatusEnum.values()) { + if (item.getValue().equalsIgnoreCase(value)) { + return item.getShowName(); + } + } + return ""; + } +} diff --git a/secondev-chabaidao-portal/src/main/java/com/weaver/seconddev/portal/mapper/dictionary/DataConvertMapper.java b/secondev-chabaidao-portal/src/main/java/com/weaver/seconddev/portal/mapper/dictionary/DataConvertMapper.java new file mode 100644 index 0000000..faa1c8e --- /dev/null +++ b/secondev-chabaidao-portal/src/main/java/com/weaver/seconddev/portal/mapper/dictionary/DataConvertMapper.java @@ -0,0 +1,31 @@ +package com.weaver.seconddev.portal.mapper.dictionary; + +import com.weaver.seconddev.portal.entity.param.BaseParam; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; + +/** + * @author:dxfeng + * @createTime: 2025/07/29 + * @version: 1.0 + */ +@Mapper +public interface DataConvertMapper { + /** + * 根据名称、类型获取ID + * + * @param param + * @param type + * @param name + * @return + */ + Long getIdByName(@Param("param") BaseParam param, @Param("type") String type, @Param("name") String name); + + /** + * 获取假期类型 + * @param param + * @param name + * @return + */ + Long getHolidayType(@Param("param") BaseParam param, @Param("name") String name); +} diff --git a/secondev-chabaidao-portal/src/main/java/com/weaver/seconddev/portal/mapper/portal/EbuilderBaseMapper.java b/secondev-chabaidao-portal/src/main/java/com/weaver/seconddev/portal/mapper/portal/EbuilderBaseMapper.java new file mode 100644 index 0000000..2f34dc8 --- /dev/null +++ b/secondev-chabaidao-portal/src/main/java/com/weaver/seconddev/portal/mapper/portal/EbuilderBaseMapper.java @@ -0,0 +1,56 @@ +package com.weaver.seconddev.portal.mapper.portal; + +import com.weaver.common.form.datasource.FormdataTemplateDetails; +import com.weaver.common.form.metadata.field.FormField; +import com.weaver.seconddev.portal.entity.param.BaseParam; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * @author:dxfeng + * @createTime: 2025/07/16 + * @version: 1.0 + */ +@Mapper +public interface EbuilderBaseMapper { + /** + * 根据表名获取表ID + * + * @param param + * @param tableName + * @return + */ + long getFormIdByTableName(@Param("param") BaseParam param, @Param("tableName") String tableName); + + /** + * 根据表ID和字段名获取字段信息 + * + * @param param + * @param formId + * @param fieldName + * @return + */ + FormField getFormFieldByFieldName(@Param("param") BaseParam param, @Param("formId") long formId, @Param("fieldName") String fieldName); + + /** + * 根据模板ID获取模板详情 + * + * @param param + * @param templateId + * @return + */ + List getFormdataTemplateDetails(@Param("param") BaseParam param, @Param("templateId") long templateId); + + /** + * 根据表名获取对象ID + * + * @param param + * @param tableName + * @return + */ + Long getObjIdByTableName(@Param("param") BaseParam param, @Param("tableName") String tableName); + + Long getFolderIdByFieldId(@Param("param") BaseParam param, @Param("fieldId") Long fieldId); +} diff --git a/secondev-chabaidao-portal/src/main/java/com/weaver/seconddev/portal/mapper/portal/EmployeePortalMapper.java b/secondev-chabaidao-portal/src/main/java/com/weaver/seconddev/portal/mapper/portal/EmployeePortalMapper.java new file mode 100644 index 0000000..62ad718 --- /dev/null +++ b/secondev-chabaidao-portal/src/main/java/com/weaver/seconddev/portal/mapper/portal/EmployeePortalMapper.java @@ -0,0 +1,13 @@ +package com.weaver.seconddev.portal.mapper.portal; + +import org.apache.ibatis.annotations.Mapper; + +/** + * @author:dxfeng + * @createTime: 2025/07/11 + * @version: 1.0 + */ +@Mapper +public interface EmployeePortalMapper { + +} diff --git a/secondev-chabaidao-portal/src/main/java/com/weaver/seconddev/portal/mapper/portal/EteamsBaseMapper.java b/secondev-chabaidao-portal/src/main/java/com/weaver/seconddev/portal/mapper/portal/EteamsBaseMapper.java new file mode 100644 index 0000000..8f4d95b --- /dev/null +++ b/secondev-chabaidao-portal/src/main/java/com/weaver/seconddev/portal/mapper/portal/EteamsBaseMapper.java @@ -0,0 +1,33 @@ +package com.weaver.seconddev.portal.mapper.portal; + +import com.weaver.common.form.metadata.field.FormField; +import com.weaver.seconddev.portal.entity.param.BaseParam; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; + +/** + * @author:dxfeng + * @createTime: 2025/07/18 + * @version: 1.0 + */ +@Mapper +public interface EteamsBaseMapper { + /** + * 根据表名获取表ID + * + * @param param + * @param tableName + * @return + */ + long getFormIdByTableName(@Param("param") BaseParam param, @Param("tableName") String tableName); + + /** + * 根据表ID和字段名获取字段信息 + * + * @param param + * @param formId + * @param fieldName + * @return + */ + FormField getFormFieldByFieldName(@Param("param") BaseParam param, @Param("formId") long formId, @Param("fieldName") String fieldName); +} diff --git a/secondev-chabaidao-portal/src/main/java/com/weaver/seconddev/portal/mapper/portal/HrbpPortalMapper.java b/secondev-chabaidao-portal/src/main/java/com/weaver/seconddev/portal/mapper/portal/HrbpPortalMapper.java new file mode 100644 index 0000000..1e3f2ef --- /dev/null +++ b/secondev-chabaidao-portal/src/main/java/com/weaver/seconddev/portal/mapper/portal/HrbpPortalMapper.java @@ -0,0 +1,126 @@ +package com.weaver.seconddev.portal.mapper.portal; + +import com.weaver.seconddev.portal.entity.param.HrbpParam; +import org.apache.ibatis.annotations.Mapper; + +/** + * @author:dxfeng + * @createTime: 2025/07/10 + * @version: 1.0 + */ +@Mapper +public interface HrbpPortalMapper { + + /** + * 待入职 + * + * @param param + * @return + */ + int getToEntryCount(HrbpParam param); + + /** + * 待转正 + * + * @param param + * @return + */ + int getToRegularCount(HrbpParam param); + + /** + * 待离职 + * + * @param param + * @return + */ + int getToLeaveCount(HrbpParam param); + + /** + * 待签订 + * + * @param param + * @return + */ + int getToSignCount(HrbpParam param); + + /** + * 代理期转正 + * + * @param param + * @return + */ + int getToProxyCount(HrbpParam param); + + /** + * 员工人数 + * + * @param param + * @return + */ + int getAllEmployeeCount(HrbpParam param); + + /** + * 正式员工 + * + * @param param + * @return + */ + int getFormalEmployeeCount(HrbpParam param); + + /** + * 实习生 + * + * @param param + * @return + */ + int getInternEmployeeCount(HrbpParam param); + + /** + * 外包 + * + * @param param + * @return + */ + int getOutsourcingCount(HrbpParam param); + + /** + * 劳务 + * + * @param param + * @return + */ + int getLaborCount(HrbpParam param); + + /** + * 试用 + * + * @param param + * @return + */ + int getProbationCount(HrbpParam param); + + /** + * 正式 + * + * @param param + * @return + */ + int getFormalCount(HrbpParam param); + + /** + * 实习 + * + * @param param + * @return + */ + int getInternCount(HrbpParam param); + + /** + * 离职 + * + * @param param + * @return + */ + int getLeaveCount(HrbpParam param); + +} diff --git a/secondev-chabaidao-portal/src/main/java/com/weaver/seconddev/portal/mapper/portal/LeaderCockpitMapper.java b/secondev-chabaidao-portal/src/main/java/com/weaver/seconddev/portal/mapper/portal/LeaderCockpitMapper.java new file mode 100644 index 0000000..99d7834 --- /dev/null +++ b/secondev-chabaidao-portal/src/main/java/com/weaver/seconddev/portal/mapper/portal/LeaderCockpitMapper.java @@ -0,0 +1,121 @@ +package com.weaver.seconddev.portal.mapper.portal; + +import com.weaver.seconddev.portal.entity.param.SearchConditionParam; +import com.weaver.seconddev.portal.entity.po.PortalPO; +import com.weaver.seconddev.portal.entity.po.Position; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; + +import java.util.Collection; +import java.util.List; +import java.util.Map; +import java.util.Set; + +/** + * @author:dxfeng + * @createTime: 2025/07/07 + * @version: 1.0 + */ +@Mapper +public interface LeaderCockpitMapper { + + /** + * 按类型统计在职人数 + * + * @param conditionParam + * @return + */ + List getOnJobNumber(SearchConditionParam conditionParam); + + /** + * 查询在职人数 + * + * @param conditionParam + * @return + */ + int getOnJobCount(SearchConditionParam conditionParam); + + /** + * 查询入职人数 + * + * @param param + * @param departmentIdList + * @param startDate + * @param endDate + * @return + */ + int getEmploymentCount(@Param("param") SearchConditionParam param, @Param("departmentIdList") Collection departmentIdList, @Param("startDate") String startDate, @Param("endDate") String endDate); + + /** + * 查询入职人数列表 + * + * @param param + * @param departmentIdList + * @param startDate + * @param endDate + * @return + */ + List getEmploymentListByPosition(@Param("param") SearchConditionParam param, @Param("departmentIdList") Collection departmentIdList, @Param("startDate") String startDate, @Param("endDate") String endDate); + + /** + * 查询关键入职人数 + * + * @param param + * @param departmentIdList + * @param startDate + * @param endDate + * @return + */ + int getKeyEmploymentCount(@Param("param") SearchConditionParam param, @Param("departmentIdList") Collection departmentIdList, @Param("startDate") String startDate, @Param("endDate") String endDate); + + + /** + * 查询离职人数 + * + * @param param + * @param departmentIdList + * @param startDate + * @param endDate + * @return + */ + int getResignCount(@Param("param") SearchConditionParam param, @Param("departmentIdList") Collection departmentIdList, @Param("startDate") String startDate, @Param("endDate") String endDate); + + /** + * 查询关键离职人数 + * + * @param param + * @param departmentIdList + * @param startDate + * @param endDate + * @return + */ + int getKeyResignCount(@Param("param") SearchConditionParam param, @Param("departmentIdList") Collection departmentIdList, @Param("startDate") String startDate, @Param("endDate") String endDate); + + /** + * 查询离职人数列表 + * + * @param param + * @param departmentIdList + * @param startDate + * @param endDate + * @return + */ + List getResignListByPosition(@Param("param") SearchConditionParam param, @Param("departmentIdList") Collection departmentIdList, @Param("startDate") String startDate, @Param("endDate") String endDate); + + + Position getPositionById(@Param("param") SearchConditionParam param, @Param("positionId") String positionId); + + /** + * 获取顶级部门id列表 + * + * @param param + * @return + */ + Set getTopDepartmentIds(@Param("param") SearchConditionParam param); + + /** + * 人力成本 + */ + Map getLaborCost(SearchConditionParam param); + +} diff --git a/secondev-chabaidao-portal/src/main/java/com/weaver/seconddev/portal/mapper/portal/ManagerPortalMapper.java b/secondev-chabaidao-portal/src/main/java/com/weaver/seconddev/portal/mapper/portal/ManagerPortalMapper.java new file mode 100644 index 0000000..e83ff6e --- /dev/null +++ b/secondev-chabaidao-portal/src/main/java/com/weaver/seconddev/portal/mapper/portal/ManagerPortalMapper.java @@ -0,0 +1,181 @@ +package com.weaver.seconddev.portal.mapper.portal; + +import com.weaver.seconddev.portal.entity.param.BasicPersonnelParam; +import com.weaver.seconddev.portal.entity.po.LateAndEarlyRankPo; +import com.weaver.seconddev.portal.entity.po.PieChartConfig; +import com.weaver.seconddev.portal.entity.po.PortalPO; +import com.weaver.seconddev.portal.entity.po.TeamEmployeePo; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; + +import java.util.Collection; +import java.util.List; + +/** + * @author:dxfeng + * @createTime: 2025/07/08 + * @version: 1.0 + */ +@Mapper +public interface ManagerPortalMapper { + /** + * 在职人数 + * + * @param param + * @return + */ + int getOnJobNum(BasicPersonnelParam param); + + /** + * 离职人数 + * + * @param param + * @return + */ + int getResignNumber(BasicPersonnelParam param); + + /** + * 离职流程中人数 + * + * @param param + * @return + */ + int getResigningNumber(BasicPersonnelParam param); + + /** + * 入职流程中人数 + * + * @param param + * @return + */ + int getEntryingNumber(BasicPersonnelParam param); + + /** + * 入职人数 + * + * @param param + * @return + */ + int getEntryNumber(BasicPersonnelParam param); + + /** + * 获取所负责的顶级部门 + * + * @param param + * @param emdId + * @return + */ + List getManageDeptIds(@Param("param") BasicPersonnelParam param, @Param("empId") Long emdId); + + /** + * 获取生日人数 + * + * @param param + * @return + */ + int getBirthdayNum(BasicPersonnelParam param); + + + /** + * 获取预计转正员工人数 + * + * @param param + * @return + */ + int getRegularEmployeeNum(BasicPersonnelParam param); + + /** + * 获取入职周年人数 + * + * @param param + * @return + */ + int getEmploymentAnniversary(BasicPersonnelParam param); + + /** + * 获取学历信息 + * + * @param param + * @return + */ + List getEducationInfo(BasicPersonnelParam param); + + List getPerformanceInfo(BasicPersonnelParam param); + + /** + * 获取年龄统计数据 + * + * @param param + * @param departmentIdList + * @param startIndex + * @param endIndex + * @return + */ + Integer getAgeCount(@Param("param") BasicPersonnelParam param, @Param("departmentIdList") Collection departmentIdList, @Param("startIndex") Integer startIndex, @Param("endIndex") Integer endIndex); + + /** + * 获取司龄统计数据 + * + * @param param + * @param departmentIdList + * @param startIndex + * @param endIndex + * @return + */ + Integer getComapnyCount(@Param("param") BasicPersonnelParam param, @Param("departmentIdList") Collection departmentIdList, @Param("startIndex") Integer startIndex, @Param("endIndex") Integer endIndex); + + /** + * 饼状图配置信息 + * + * @param param + * @return + */ + List getPieTypeConfig(BasicPersonnelParam param); + + /** + * 获取团队成员信息 + * + * @param param + * @return + */ + List getTeamEmployee(BasicPersonnelParam param); + + /** + * 获取团队成员总数 + * + * @param param + * @return + */ + int getTeamEmployeeTotal(BasicPersonnelParam param); + + + Integer sumLateTimes(BasicPersonnelParam param); + + Integer sumLeaveEarlyTimes(BasicPersonnelParam param); + + Integer sumAbsenteeismTimes(BasicPersonnelParam param); + + Integer sumReissueCardTimes(BasicPersonnelParam param); + + Integer sumTotalAttendanceTimes(BasicPersonnelParam param); + + List getLateAndEarlyRankList(BasicPersonnelParam param); + + Integer sumWorkdayOvertimeDuration(BasicPersonnelParam param); + + Integer sumWeekendOvertimeDuration(BasicPersonnelParam param); + + Integer sumLegalHolidayOvertimeDuration(BasicPersonnelParam param); + + Integer sumHolidayTimes(@Param("param") BasicPersonnelParam param, @Param("holidayIds") Collection holidayIds); + + Integer sumPersonalLeaveDuration(BasicPersonnelParam param); + + //Integer sumSickLeaveCount(@Param("param") BasicPersonnelParam param,@Param("holidayIds") Collection holidayIds); + + Integer sumSickLeaveDuration(BasicPersonnelParam param); + + //Integer sumAnnualLeaveCount(@Param("param") BasicPersonnelParam param,@Param("holidayIds") Collection holidayIds); + + Integer sumAnnualLeaveDuration(BasicPersonnelParam param); +} diff --git a/secondev-chabaidao-portal/src/main/java/com/weaver/seconddev/portal/mapper/portal/PortalMapper.java b/secondev-chabaidao-portal/src/main/java/com/weaver/seconddev/portal/mapper/portal/PortalMapper.java new file mode 100644 index 0000000..e0fde60 --- /dev/null +++ b/secondev-chabaidao-portal/src/main/java/com/weaver/seconddev/portal/mapper/portal/PortalMapper.java @@ -0,0 +1,17 @@ +package com.weaver.seconddev.portal.mapper.portal; + +import com.weaver.seconddev.portal.entity.po.PortalUrlDetail; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * @author:dxfeng + * @createTime: 2025/07/11 + * @version: 1.0 + */ +@Mapper +public interface PortalMapper { + List getPortalUrlDetail(@Param("tenantKey") String tenantKey,@Param("portalKey") String portalKey,@Param("componentKey") String componentKey); +} diff --git a/secondev-chabaidao-portal/src/main/java/com/weaver/seconddev/portal/mapper/portal/SscPortalMapper.java b/secondev-chabaidao-portal/src/main/java/com/weaver/seconddev/portal/mapper/portal/SscPortalMapper.java new file mode 100644 index 0000000..3cb1be0 --- /dev/null +++ b/secondev-chabaidao-portal/src/main/java/com/weaver/seconddev/portal/mapper/portal/SscPortalMapper.java @@ -0,0 +1,47 @@ +package com.weaver.seconddev.portal.mapper.portal; + +import com.weaver.seconddev.portal.entity.param.SscParam; +import org.apache.ibatis.annotations.Mapper; + +/** + * @author:dxfeng + * @createTime: 2025/07/15 + * @version: 1.0 + */ +@Mapper +public interface SscPortalMapper { + + /** + * 合同到期 + * + * @param param + * @return + */ + int getExpirationReminderCount(SscParam param); + + /** + * 身份证到期 + * + * @param param + * @return + */ + int getIdCardExpirationCount(SscParam param); + + /** + * 健康证到期 + * + * @param param + * @return + */ + int getHealthCertificateExpirationCount(SscParam param); + + /** + * 入职周年提醒 + * @param param + * @return + */ + int getEmploymentAnniversaryCount(SscParam param); + + + +} diff --git a/secondev-chabaidao-portal/src/main/java/com/weaver/seconddev/portal/service/EmployeePortalService.java b/secondev-chabaidao-portal/src/main/java/com/weaver/seconddev/portal/service/EmployeePortalService.java new file mode 100644 index 0000000..b158fb5 --- /dev/null +++ b/secondev-chabaidao-portal/src/main/java/com/weaver/seconddev/portal/service/EmployeePortalService.java @@ -0,0 +1,30 @@ +package com.weaver.seconddev.portal.service; + +import com.weaver.common.base.entity.result.WeaResult; +import com.weaver.seconddev.portal.entity.po.EmployeeBasicInfoPo; + +import java.util.Map; + +/** + * @author:dxfeng + * @createTime: 2025/07/11 + * @version: 1.0 + */ +public interface EmployeePortalService { + /** + * 获取员工工作时长 + * + * @param params + * @return + */ + WeaResult> getDurationOfEmployment(Map params); + + /** + * 获取员工信息 + * + * @param params + * @return + */ + WeaResult getEmployeeInfo(Map params); + +} diff --git a/secondev-chabaidao-portal/src/main/java/com/weaver/seconddev/portal/service/HrbpPortalService.java b/secondev-chabaidao-portal/src/main/java/com/weaver/seconddev/portal/service/HrbpPortalService.java new file mode 100644 index 0000000..8d0685b --- /dev/null +++ b/secondev-chabaidao-portal/src/main/java/com/weaver/seconddev/portal/service/HrbpPortalService.java @@ -0,0 +1,37 @@ +package com.weaver.seconddev.portal.service; + +import com.weaver.common.base.entity.result.WeaResult; + +import java.util.Map; + +/** + * @author:dxfeng + * @createTime: 2025/07/10 + * @version: 1.0 + */ +public interface HrbpPortalService { + + /** + * 获取待办事项 + * + * @param params + * @return + */ + WeaResult> getToDo(Map params); + + /** + * 获取员工数据 + * + * @param params + * @return + */ + WeaResult> getEmployeeData(Map params); + + /** + * 今日概况 + * + * @param params + * @return + */ + WeaResult> getTodayOverview(Map params); +} diff --git a/secondev-chabaidao-portal/src/main/java/com/weaver/seconddev/portal/service/LeaderCockpitService.java b/secondev-chabaidao-portal/src/main/java/com/weaver/seconddev/portal/service/LeaderCockpitService.java new file mode 100644 index 0000000..50e5979 --- /dev/null +++ b/secondev-chabaidao-portal/src/main/java/com/weaver/seconddev/portal/service/LeaderCockpitService.java @@ -0,0 +1,75 @@ +package com.weaver.seconddev.portal.service; + +import com.weaver.common.base.entity.result.WeaResult; +import com.weaver.seconddev.portal.entity.po.PortalPO; + +import java.util.List; +import java.util.Map; + +/** + * 领导驾驶舱门户 + * + * @author:dxfeng + * @createTime: 2025/07/07 + * @version: 1.0 + */ +public interface LeaderCockpitService { + + /** + * 获取在职人数 + * + * @param params + * @return + */ + WeaResult> getOnJobNumber(Map params); + + /** + * 获取人工成本 + * + * @param params + * @return + */ + WeaResult> getLaborCost(Map params); + + /** + * 获取离职率 + * + * @param params + * @return + */ + WeaResult> getTurnoverRate(Map params); + + /** + * 获取出勤率 + * + * @param params + * @return + */ + WeaResult> getAttendanceRate(Map params); + + /** + * 获取满编率 + * + * @param params + * @param header + * @return + */ + WeaResult> getFullStaffingRate(Map header, Map params); + + /** + * 获取入职情况 + * + * @param params + * @return + */ + WeaResult> getEmploymentStatus(Map params); + + /** + * 获取离职情况 + * + * @param params + * @return + */ + WeaResult> getResignationSituation(Map params); + +} diff --git a/secondev-chabaidao-portal/src/main/java/com/weaver/seconddev/portal/service/ManagerPortalService.java b/secondev-chabaidao-portal/src/main/java/com/weaver/seconddev/portal/service/ManagerPortalService.java new file mode 100644 index 0000000..df1578f --- /dev/null +++ b/secondev-chabaidao-portal/src/main/java/com/weaver/seconddev/portal/service/ManagerPortalService.java @@ -0,0 +1,93 @@ +package com.weaver.seconddev.portal.service; + +import com.weaver.common.base.entity.result.WeaResult; +import com.weaver.seconddev.portal.entity.component.Option; + +import java.util.List; +import java.util.Map; + +/** + * 经理门户 + * + * @author:dxfeng + * @createTime: 2025/07/08 + * @version: 1.0 + */ +public interface ManagerPortalService { + + /** + * 经理信息 + * + * @param params + * @return + */ + WeaResult> getMangerInfo(Map params); + + /** + * 今日概况 + * + * @param params + * @return + */ + WeaResult> getTodayOverview(Map params); + + /** + * 基础人事 + * + * @param params + * @return + */ + WeaResult> getBasicPersonnel(Map params); + + /** + * 基础人事SQL + * + * @param params + * @return + */ + WeaResult getBasicPersonnelSql(Map params); + + + /** + * 团队纪念日 + * + * @param params + * @return + */ + WeaResult> getTeamMemorialDay(Map params); + + WeaResult getTeamMemorialDaySql(Map params); + + + /** + * 数据看板 + * + * @param params + * @return + */ + WeaResult> getEducationInfo(Map params); + + /** + * 考勤看板 + * + * @param params + * @return + */ + WeaResult> getAttendanceInfo(Map params); + + /** + * 团队员工 + * + * @param params + * @return + */ + WeaResult> getTeamEmployee(Map params); + + /** + * 获取EB表单字段下拉选项 + * + * @param params + * @return + */ + WeaResult> getEbFieldOptions(Map params); +} diff --git a/secondev-chabaidao-portal/src/main/java/com/weaver/seconddev/portal/service/SscPortalService.java b/secondev-chabaidao-portal/src/main/java/com/weaver/seconddev/portal/service/SscPortalService.java new file mode 100644 index 0000000..843db3e --- /dev/null +++ b/secondev-chabaidao-portal/src/main/java/com/weaver/seconddev/portal/service/SscPortalService.java @@ -0,0 +1,21 @@ +package com.weaver.seconddev.portal.service; + +import com.weaver.common.base.entity.result.WeaResult; +import com.weaver.seconddev.portal.entity.po.ExpirationReminderPo; + +import java.util.Map; + +/** + * @author:dxfeng + * @createTime: 2025/07/15 + * @version: 1.0 + */ +public interface SscPortalService { + /** + * 到期提醒 + * + * @param params + * @return + */ + WeaResult getExpirationReminder(Map params); +} diff --git a/secondev-chabaidao-portal/src/main/java/com/weaver/seconddev/portal/service/impl/EmployeePortalServiceImpl.java b/secondev-chabaidao-portal/src/main/java/com/weaver/seconddev/portal/service/impl/EmployeePortalServiceImpl.java new file mode 100644 index 0000000..a76f220 --- /dev/null +++ b/secondev-chabaidao-portal/src/main/java/com/weaver/seconddev/portal/service/impl/EmployeePortalServiceImpl.java @@ -0,0 +1,207 @@ +package com.weaver.seconddev.portal.service.impl; + +import cn.hutool.http.HttpRequest; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.weaver.common.base.entity.result.WeaResult; +import com.weaver.common.hr.util.Util; +import com.weaver.common.hrm.dao.HrmCommonEmployeeDao; +import com.weaver.seconddev.portal.entity.po.EmployeeBasicInfoPo; +import com.weaver.seconddev.portal.entity.po.PortalUrlDetail; +import com.weaver.seconddev.portal.enums.PersonnelStatusEnum; +import com.weaver.seconddev.portal.mapper.portal.PortalMapper; +import com.weaver.seconddev.portal.service.EmployeePortalService; +import com.weaver.seconddev.portal.util.DateUtil; +import com.weaver.teams.domain.department.SimpleDepartment; +import com.weaver.teams.domain.user.Avatar; +import com.weaver.teams.domain.user.SimpleEmployee; +import com.weaver.teams.security.context.UserContext; +import com.weaver.teams.security.user.User; +import com.weaver.workflow.common.cfg.org.service.DepartMentService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.time.LocalDate; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * @author:dxfeng + * @createTime: 2025/07/11 + * @version: 1.0 + */ +@Slf4j +@Service +public class EmployeePortalServiceImpl implements EmployeePortalService { + + private static final String PORTAL_KEY = "employeePortal"; + + @Autowired + HrmCommonEmployeeDao hrmCommonEmployeeDao; + + @Autowired + DepartMentService departMentService; + + @Autowired + PortalMapper portalMapper; + + @Override + public WeaResult> getDurationOfEmployment(Map params) { + User currentUser = UserContext.getCurrentUser(); + SimpleEmployee byId = hrmCommonEmployeeDao.getById(currentUser.getEmployeeId()); + + LocalDate localDate = DateUtil.toLocalDate(byId.getHiredate()); + // 计算入职日期到现在的天数 + long days = DateUtil.daysBetween(DateUtil.formatDate(localDate), DateUtil.getCurrentDateStr()); + + Map returnMap = new HashMap<>(1); + returnMap.put("days", days); + return WeaResult.success(returnMap); + } + + @Override + public WeaResult getEmployeeInfo(Map params) { + User currentUser = UserContext.getCurrentUser(); + EmployeeBasicInfoPo employeeBasicInfoPo = new EmployeeBasicInfoPo(); + employeeBasicInfoPo.setEmployeeId(currentUser.getEmployeeId()); + + SimpleEmployee byId = hrmCommonEmployeeDao.getById(currentUser.getEmployeeId()); + SimpleDepartment department = byId.getDepartment(); + Avatar avatar = byId.getAvatar(); + employeeBasicInfoPo.setAvatar(avatar); + employeeBasicInfoPo.setUserName(byId.getUsername()); + employeeBasicInfoPo.setWorkCode(byId.getJobNum()); + //WeaDepartMent departmentById = departMentService.getDepartMentById(byId.getDepartmentId()); + //employeeBasicInfoPo.setCompanyName(null != departmentById ? departmentById.getDepartMentName() : ""); + employeeBasicInfoPo.setDepartmentName(null==department?"":department.getName()); + + employeeBasicInfoPo.setHireDate(cn.hutool.core.date.DateUtil.formatDate(byId.getHiredate())); + employeeBasicInfoPo.setEmployeeStatus(PersonnelStatusEnum.getShowNameByValue(byId.getPersonnelStatus())); + + SimpleEmployee superior = byId.getSuperior(); + + employeeBasicInfoPo.setDirectSuperior(null != superior ? superior.getUsername() : ""); + + + // 考勤信息 + buildAttendance(params, employeeBasicInfoPo); + + // 穿透地址处理 + List portalUrlDetails = portalMapper.getPortalUrlDetail(currentUser.getTenantKey(), PORTAL_KEY, "getEmployeeInfo"); + Map urlMap = portalUrlDetails.stream().collect(Collectors.toMap(PortalUrlDetail::getDetailKey, PortalUrlDetail::getUrlAddress)); + employeeBasicInfoPo.setAnnualLeaveBalanceUrl(urlMap.get("annualLeaveBalance")); + employeeBasicInfoPo.setLeaveBalanceUrl(urlMap.get("leaveBalance")); + employeeBasicInfoPo.setPaidSickLeaveBalanceUrl(urlMap.get("paidSickLeaveBalance")); + employeeBasicInfoPo.setExpectedAttendanceUrl(urlMap.get("expectedAttendance")); + employeeBasicInfoPo.setActualAttendanceUrl(urlMap.get("actualAttendance")); + employeeBasicInfoPo.setLeaveUrl(urlMap.get("leave")); + employeeBasicInfoPo.setTravelUrl(urlMap.get("travel")); + employeeBasicInfoPo.setOvertimeUrl(urlMap.get("overtime")); + employeeBasicInfoPo.setPublicLeaveUrl(urlMap.get("publicLeave")); + employeeBasicInfoPo.setExceptionalAttendanceUrl(urlMap.get("exceptionalAttendance")); + + + return WeaResult.success(employeeBasicInfoPo); + } + + /** + * 构建考勤信息 + * + * @param params + * @param employeeBasicInfoPo + */ + private void buildAttendance(Map params, EmployeeBasicInfoPo employeeBasicInfoPo) { + String url = Util.null2String(params.get("otherApiUrl")); + Map header = (Map) params.get("header"); + + String beginDate = DateUtil.getFirstDayOfMonth(); + String endDate = DateUtil.getLastDayOfMonth(); + Long userId = employeeBasicInfoPo.getEmployeeId(); + + JSONObject jsonObject = new JSONObject(); + jsonObject.put("beginDate", beginDate); + jsonObject.put("endDate", endDate); + jsonObject.put("userId", String.valueOf(userId)); + + String resultStr = HttpRequest.post(url).headerMap(header, true) + .body(jsonObject.toJSONString()).execute().body(); + + if (resultStr != null) { + JSONObject response = JSON.parseObject(resultStr); + if (response.getBoolean("status") && 200 == response.getIntValue("code")) { + JSONObject data = response.getJSONObject("data"); + + // 考勤信息 + JSONObject attendStatis = data.getJSONObject("attendStatis"); + if (attendStatis != null) { + JSONObject periodLength = attendStatis.getJSONObject("periodLength"); + employeeBasicInfoPo.setExpectedAttendance(null == periodLength ? "0" : periodLength.getString("value")); + JSONObject actual = attendStatis.getJSONObject("actual"); + employeeBasicInfoPo.setActualAttendance(null == actual ? "0" : actual.getString("value")); + JSONObject lostLength = attendStatis.getJSONObject("lostLength"); + employeeBasicInfoPo.setExceptionalAttendance(null == lostLength ? "0" : lostLength.getString("value")); + } + + JSONArray attendSummaryData = data.getJSONObject("attendSummary").getJSONArray("data"); + if (attendSummaryData != null) { + for (int i = 0; i < attendSummaryData.size(); i++) { + JSONObject item = attendSummaryData.getJSONObject(i); + String key = item.getString("key"); + String value = item.getString("value"); + + switch (key) { + case "LEAVE": + employeeBasicInfoPo.setLeave(value); + break; + case "BUSINESS": + employeeBasicInfoPo.setTravel(value); + break; + case "OUT_SIDE": + employeeBasicInfoPo.setPublicLeave(value); + break; + case "OVERTIME": + employeeBasicInfoPo.setOvertime(value); + break; + default: + break; + } + } + } + + // 假期余额信息 + JSONArray vacationBalanceList = data.getJSONArray("vacationBalanceList"); + if (vacationBalanceList != null) { + for (int i = 0; i < vacationBalanceList.size(); i++) { + JSONObject vacationItem = vacationBalanceList.getJSONObject(i); + String title = vacationItem.getString("title"); + JSONArray dataArray = vacationItem.getJSONArray("data"); + + if (dataArray != null && dataArray.size() > 0) { + JSONObject totalItem = dataArray.getJSONObject(dataArray.size() - 1); + String totalValue = totalItem.getString("value"); + + switch (title) { + case "年假": + employeeBasicInfoPo.setAnnualLeaveBalance(totalValue); + break; + case "调休假": + employeeBasicInfoPo.setLeaveBalance(totalValue); + break; + case "带薪病假": + employeeBasicInfoPo.setPaidSickLeaveBalance(totalValue); + break; + default: + break; + } + } + } + } + } + } + } + +} diff --git a/secondev-chabaidao-portal/src/main/java/com/weaver/seconddev/portal/service/impl/HrbpPortalServiceImpl.java b/secondev-chabaidao-portal/src/main/java/com/weaver/seconddev/portal/service/impl/HrbpPortalServiceImpl.java new file mode 100644 index 0000000..0c71b0e --- /dev/null +++ b/secondev-chabaidao-portal/src/main/java/com/weaver/seconddev/portal/service/impl/HrbpPortalServiceImpl.java @@ -0,0 +1,120 @@ +package com.weaver.seconddev.portal.service.impl; + +import com.weaver.common.base.entity.result.WeaResult; +import com.weaver.seconddev.portal.entity.param.HrbpParam; +import com.weaver.seconddev.portal.entity.po.PortalUrlDetail; +import com.weaver.seconddev.portal.mapper.portal.HrbpPortalMapper; +import com.weaver.seconddev.portal.mapper.portal.PortalMapper; +import com.weaver.seconddev.portal.service.HrbpPortalService; +import com.weaver.teams.security.context.UserContext; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * @author:dxfeng + * @createTime: 2025/07/10 + * @version: 1.0 + */ +@Slf4j +@Service +public class HrbpPortalServiceImpl implements HrbpPortalService { + + private static final String PORTAL_KEY = "hrbpPortal"; + + @Autowired + HrbpPortalMapper hrbpPortalMapper; + + @Autowired + PortalMapper portalMapper; + + @Override + public WeaResult> getToDo(Map params) { + + Map map = new HashMap<>(); + HrbpParam hrbpParam = new HrbpParam(); + hrbpParam.setTenantKey(UserContext.getCurrentUser().getTenantKey()); + // 权限条件 + + + int toEntryCount = hrbpPortalMapper.getToEntryCount(hrbpParam); + int toRegularCount = hrbpPortalMapper.getToRegularCount(hrbpParam); + int toLeaveCount = hrbpPortalMapper.getToLeaveCount(hrbpParam); + int toSignCount = hrbpPortalMapper.getToSignCount(hrbpParam); + int toProxyCount = hrbpPortalMapper.getToProxyCount(hrbpParam); + + List portalUrlDetails = portalMapper.getPortalUrlDetail(hrbpParam.getTenantKey(), PORTAL_KEY, "getToDo"); + Map urlMap = portalUrlDetails.stream().collect(Collectors.toMap(PortalUrlDetail::getDetailKey, PortalUrlDetail::getUrlAddress)); + + // 待入职 + map.put("entry", toEntryCount); + map.put("entryUrl", urlMap.get("entry")); + // 待转正 + map.put("regular", toRegularCount); + map.put("regularUrl", urlMap.get("regular")); + // 待离职 + map.put("leave", toLeaveCount); + map.put("leaveUrl", urlMap.get("leave")); + // 待签订 + map.put("sign", toSignCount); + map.put("signUrl", urlMap.get("sign")); + // 代理期转正 + map.put("proxy", toProxyCount); + map.put("proxyUrl", urlMap.get("proxy")); + return WeaResult.success(map); + } + + @Override + public WeaResult> getEmployeeData(Map params) { + + Map map = new HashMap<>(); + HrbpParam hrbpParam = new HrbpParam(); + hrbpParam.setTenantKey(UserContext.getCurrentUser().getTenantKey()); + + List portalUrlDetails = portalMapper.getPortalUrlDetail(hrbpParam.getTenantKey(), PORTAL_KEY, "getEmployeeData"); + Map urlMap = portalUrlDetails.stream().collect(Collectors.toMap(PortalUrlDetail::getDetailKey, PortalUrlDetail::getUrlAddress)); + + + // 员工人数 + int allEmployeeCount = hrbpPortalMapper.getAllEmployeeCount(hrbpParam); + map.put("allEmployee", allEmployeeCount); + map.put("allEmployeeUrl", urlMap.get("allEmployee")); + // 正式员工 + int formalEmployeeCount = hrbpPortalMapper.getFormalEmployeeCount(hrbpParam); + map.put("formalEmployee", formalEmployeeCount); + map.put("formalEmployeeUrl", urlMap.get("formalEmployee")); + // 实习生 + map.put("internEmployee", hrbpPortalMapper.getInternEmployeeCount(hrbpParam)); + map.put("internEmployeeUrl", urlMap.get("internEmployee")); + // 外包 + map.put("outsourcing", hrbpPortalMapper.getOutsourcingCount(hrbpParam)); + map.put("outsourcingUrl", urlMap.get("outsourcing")); + // 劳务 + map.put("labor", hrbpPortalMapper.getLaborCount(hrbpParam)); + map.put("laborUrl", urlMap.get("labor")); + // 试用 + map.put("probation", hrbpPortalMapper.getProbationCount(hrbpParam)); + map.put("probationUrl", urlMap.get("probation")); + // 正式 + map.put("formal", hrbpPortalMapper.getFormalCount(hrbpParam)); + map.put("formalUrl", urlMap.get("formal")); + // 实习 + map.put("intern", hrbpPortalMapper.getInternCount(hrbpParam)); + map.put("internUrl", urlMap.get("intern")); + // 离职 + map.put("leave", hrbpPortalMapper.getLeaveCount(hrbpParam)); + map.put("leaveUrl", urlMap.get("leave")); + return WeaResult.success(map); + } + + @Override + public WeaResult> getTodayOverview(Map params) { + // TODO + return null; + } +} diff --git a/secondev-chabaidao-portal/src/main/java/com/weaver/seconddev/portal/service/impl/LeaderCockpitServiceImpl.java b/secondev-chabaidao-portal/src/main/java/com/weaver/seconddev/portal/service/impl/LeaderCockpitServiceImpl.java new file mode 100644 index 0000000..25489e0 --- /dev/null +++ b/secondev-chabaidao-portal/src/main/java/com/weaver/seconddev/portal/service/impl/LeaderCockpitServiceImpl.java @@ -0,0 +1,373 @@ +package com.weaver.seconddev.portal.service.impl; + +import cn.hutool.core.convert.Convert; +import cn.hutool.http.HttpRequest; +import com.alibaba.fastjson.JSON; +import com.weaver.common.base.entity.result.WeaResult; +import com.weaver.common.hrm.dao.HrmCommonEmployeeDao; +import com.weaver.seconddev.portal.entity.bo.EmployeeStaffBo; +import com.weaver.seconddev.portal.entity.param.SearchConditionParam; +import com.weaver.seconddev.portal.entity.po.PortalData; +import com.weaver.seconddev.portal.entity.po.PortalPO; +import com.weaver.seconddev.portal.entity.po.cfg.*; +import com.weaver.seconddev.portal.mapper.portal.LeaderCockpitMapper; +import com.weaver.seconddev.portal.service.LeaderCockpitService; +import com.weaver.seconddev.portal.util.DateUtil; +import com.weaver.teams.security.StringUtils; +import com.weaver.teams.security.context.UserContext; +import com.weaver.workflow.common.cfg.org.service.DepartMentService; +import com.weaver.workflow.common.entity.org.WeaDepartMent; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.collections4.CollectionUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.time.LocalDate; +import java.util.*; + +/** + * 领导驾驶舱门户 + * + * @author:dxfeng + * @createTime: 2025/07/07 + * @version: 1.0 + */ +@Slf4j +@Service +public class LeaderCockpitServiceImpl implements LeaderCockpitService { + @Autowired + LeaderCockpitMapper leaderCockpitMapper; + + @Autowired + HrmCommonEmployeeDao hrmCommonEmployeeDao; + + @Autowired + DepartMentService departMentService; + + @Override + public WeaResult> getOnJobNumber(Map params) { + SearchConditionParam searchConditionParam = new SearchConditionParam(); + initSearchConditionParam(searchConditionParam, params, null); + log.error("searchConditionParam===" + JSON.toJSONString(searchConditionParam)); + List onJobNumber = leaderCockpitMapper.getOnJobNumber(searchConditionParam); + Map returnMap = new HashMap<>(); + returnMap.put("data", onJobNumber); + returnMap.put("total", onJobNumber.stream().mapToInt(item -> Convert.toInt(item.getValue(), 0)).sum()); + return WeaResult.success(returnMap); + } + + @Override + public WeaResult > getLaborCost(Map params) { + SearchConditionParam searchConditionParam = new SearchConditionParam(); + initSearchConditionParam(searchConditionParam, params, null); + log.error("searchConditionParam===" + JSON.toJSONString(searchConditionParam)); + + Map laborCost = leaderCockpitMapper.getLaborCost(searchConditionParam); + return WeaResult.success(laborCost); + } + + @Override + public WeaResult> getTurnoverRate(Map params) { + SearchConditionParam searchConditionParam = new SearchConditionParam(); + initSearchConditionParam(searchConditionParam, params, null); + log.error("searchConditionParam===" + JSON.toJSONString(searchConditionParam)); + // 查询范围内在职人员 + int onJobCount = leaderCockpitMapper.getOnJobCount(searchConditionParam); + // 查询范围内离职人员 + int resignCount = leaderCockpitMapper.getResignCount(searchConditionParam, searchConditionParam.getDepartmentIdList(), searchConditionParam.getStartDate(), searchConditionParam.getEndDate()); + // 查询关键离职率 + int keyResignCount = leaderCockpitMapper.getKeyResignCount(searchConditionParam, searchConditionParam.getDepartmentIdList(), searchConditionParam.getStartDate(), searchConditionParam.getEndDate()); + // 计算离职率 + double turnoverRate = calculateRate(keyResignCount, onJobCount); + //TODO 计算关键离职率 + double keyTurnoverRate = calculateRate(keyResignCount, resignCount); + + Map returnMap = new HashMap<>(2); + returnMap.put("turnoverRate", formatPercentage(turnoverRate)); + returnMap.put("keyTurnoverRate", formatPercentage(keyTurnoverRate)); + return WeaResult.success(returnMap); + } + + @Override + public WeaResult> getAttendanceRate(Map params) { + return null; + } + + @Override + public WeaResult> getFullStaffingRate(Map header, Map params) { + String origin = header.get("origin"); + // 人员编制 + String employeeStaffUrl = origin + "/api/bs/hr/est/cfg/table"; + // 人员编制具体信息 + String getEmployeeDetailUrl = origin + "/api/bs/hr/est/cfg/emp/table"; + + String beginDate = DateUtil.getFirstDayOfMonth(); + String endDate = DateUtil.getLastDayOfMonth(); + SearchConditionParam searchConditionParam = new SearchConditionParam(); + initSearchConditionParam(searchConditionParam, params, null); + log.error("searchConditionParam===" + JSON.toJSONString(searchConditionParam)); + //postEmployeeStaff(employeeStaffUrl, header, searchConditionParam.getDepartmentIdList(), month); + + + return null; + } + + private void postEmployeeStaff(String employeeStaffUrl,Map header, Set departmentIdList, String month) { + + FormDatas formDatas = new FormDatas(); + FormDatasDetail formDatasDetail = new FormDatasDetail(); + formDatas.setFormDatas(formDatasDetail); + List orgItemList = new ArrayList<>(); + for (Long aLong : departmentIdList) { + OrgItem orgItem = new OrgItem(); + orgItem.setId(aLong + ""); + orgItemList.add(orgItem); + } + OrgWrapper orgWrapper = new OrgWrapper(); + orgWrapper.setOrg(orgItemList); + formDatasDetail.setOrg(Collections.singletonList(orgWrapper)); + MonthWrapper monthWrapper = new MonthWrapper(); + monthWrapper.setMonth(month); + formDatasDetail.setMonth(Collections.singletonList(monthWrapper)); + OverCtrlWrapper overCtrlWrapper = new OverCtrlWrapper(); + overCtrlWrapper.setOverCtrl("all"); + formDatasDetail.setOverCtrl(Collections.singletonList(overCtrlWrapper)); + + + String resultStr = HttpRequest.post(employeeStaffUrl).headerMap(header, true) + .body(JSON.toJSONString(formDatas)).execute().body(); + List employeeStaffs = EmployeeStaffBo.mapEmployeeStaffData(resultStr); + + + } + + + @Override + public WeaResult> getEmploymentStatus(Map params) { + SearchConditionParam searchConditionParam = new SearchConditionParam(); + initSearchConditionParam(searchConditionParam, params, 0); + + log.error("searchConditionParam===" + JSON.toJSONString(searchConditionParam)); + String searchDate = params.get("searchDate"); + if (StringUtils.isBlank(searchDate)) { + searchDate = DateUtil.getCurrentDateStr(); + } + LocalDate localDate = DateUtil.parseDate(searchDate); + + String month = DateUtil.formatToYearMonth_ZH(localDate); + Map allDataMap = new LinkedHashMap<>(3); + Map keyDataMap = new LinkedHashMap<>(3); + allDataMap.put(month, leaderCockpitMapper.getEmploymentCount(searchConditionParam, searchConditionParam.getDepartmentIdList(), searchConditionParam.getStartDate(), searchConditionParam.getEndDate())); + keyDataMap.put(month, leaderCockpitMapper.getKeyEmploymentCount(searchConditionParam, searchConditionParam.getDepartmentIdList(), searchConditionParam.getStartDate(), searchConditionParam.getEndDate())); + + String firstDayOfMonthStr = DateUtil.getFirstDayOfPreviousMonthStr(searchConditionParam.getStartDate()); + String lastDayOfMonthStr = DateUtil.getLastDayOfPreviousMonthStr(searchConditionParam.getEndDate()); + // 前面5个月 + for (int i = 1; i < 7; i++) { + allDataMap.put(DateUtil.formatToYearMonth_ZH(firstDayOfMonthStr), leaderCockpitMapper.getEmploymentCount(searchConditionParam, searchConditionParam.getDepartmentIdList(), firstDayOfMonthStr, lastDayOfMonthStr)); + keyDataMap.put(DateUtil.formatToYearMonth_ZH(firstDayOfMonthStr), leaderCockpitMapper.getKeyEmploymentCount(searchConditionParam, searchConditionParam.getDepartmentIdList(), firstDayOfMonthStr, lastDayOfMonthStr)); + firstDayOfMonthStr = DateUtil.getFirstDayOfPreviousMonthStr(searchConditionParam.getStartDate(), i); + lastDayOfMonthStr = DateUtil.getLastDayOfPreviousMonthStr(searchConditionParam.getEndDate(), i); + } + + // 查询台账 + String currentMonth = DateUtil.formatToYearMonth(searchConditionParam.getStartDate()); + + Set selectDepartmentId = searchConditionParam.getSelectDepartmentId(); + log.error("selectDepartmentId===" + JSON.toJSONString(selectDepartmentId)); + if (CollectionUtils.isEmpty(selectDepartmentId)) { + // 未选择部门,查询所有一级部门数据 + selectDepartmentId = leaderCockpitMapper.getTopDepartmentIds(searchConditionParam); + log.error("topDepartmentId===" + JSON.toJSONString(selectDepartmentId)); + } + + // 查询每个部门 时间范围内的入职人数 + List portalList = new ArrayList<>(); + for (Long topDepartmentId : selectDepartmentId) { + List beLongDeps = departMentService.getBeLongDeps(topDepartmentId, searchConditionParam.getTenantKey(), false); + beLongDeps.add(topDepartmentId); + WeaDepartMent departMentById = departMentService.getDepartMentById(topDepartmentId); + PortalData portalData = new PortalData(); + portalData.setDate(currentMonth); + portalData.setDepart(departMentById.getDepartMentName()); + // 关键 + int keyEmploymentCount = leaderCockpitMapper.getKeyEmploymentCount(searchConditionParam, beLongDeps, searchConditionParam.getStartDate(), searchConditionParam.getEndDate()); + // 非关键 + int employmentCount = leaderCockpitMapper.getEmploymentCount(searchConditionParam, beLongDeps, searchConditionParam.getStartDate(), searchConditionParam.getEndDate()); + portalData.setKey(keyEmploymentCount); + portalData.setAll(employmentCount); + portalList.add(portalData); + } + + // portalList按照all排序 + portalList.sort((o1, o2) -> o2.getAll().compareTo(o1.getAll())); + + Map returnMap = new HashMap<>(3); + returnMap.put("dataSource", portalList); + returnMap.put("all", allDataMap); + returnMap.put("key", keyDataMap); + return WeaResult.success(returnMap); + } + + @Override + public WeaResult> getResignationSituation(Map params) { + SearchConditionParam searchConditionParam = new SearchConditionParam(); + initSearchConditionParam(searchConditionParam, params, 0); + log.error("searchConditionParam===" + JSON.toJSONString(searchConditionParam)); + + String searchDate = params.get("searchDate"); + if (StringUtils.isBlank(searchDate)) { + searchDate = DateUtil.getCurrentDateStr(); + } + LocalDate localDate = DateUtil.parseDate(searchDate); + + String month = DateUtil.formatToYearMonth_ZH(localDate); + Map allDataMap = new LinkedHashMap<>(3); + Map keyDataMap = new LinkedHashMap<>(3); + allDataMap.put(month, leaderCockpitMapper.getResignCount(searchConditionParam, searchConditionParam.getDepartmentIdList(), searchConditionParam.getStartDate(), searchConditionParam.getEndDate())); + keyDataMap.put(month, leaderCockpitMapper.getKeyResignCount(searchConditionParam, searchConditionParam.getDepartmentIdList(), searchConditionParam.getStartDate(), searchConditionParam.getEndDate())); + + String firstDayOfMonthStr = DateUtil.getFirstDayOfPreviousMonthStr(searchConditionParam.getStartDate()); + String lastDayOfMonthStr = DateUtil.getLastDayOfPreviousMonthStr(searchConditionParam.getEndDate()); + // 前五个月 + for (int i = 1; i < 7; i++) { + allDataMap.put(DateUtil.formatToYearMonth_ZH(firstDayOfMonthStr), leaderCockpitMapper.getResignCount(searchConditionParam, searchConditionParam.getDepartmentIdList(), firstDayOfMonthStr, lastDayOfMonthStr)); + keyDataMap.put(DateUtil.formatToYearMonth_ZH(firstDayOfMonthStr), leaderCockpitMapper.getKeyResignCount(searchConditionParam, searchConditionParam.getDepartmentIdList(), firstDayOfMonthStr, lastDayOfMonthStr)); + + firstDayOfMonthStr = DateUtil.getFirstDayOfPreviousMonthStr(searchConditionParam.getStartDate(), i); + lastDayOfMonthStr = DateUtil.getLastDayOfPreviousMonthStr(searchConditionParam.getEndDate(), i); + } + + + String currentMonth = DateUtil.formatToYearMonth(searchConditionParam.getStartDate()); + Set selectDepartmentId = searchConditionParam.getSelectDepartmentId(); + log.error("selectDepartmentId===" + JSON.toJSONString(selectDepartmentId)); + if (CollectionUtils.isEmpty(selectDepartmentId)) { + // 未选择部门,查询所有一级部门数据 + selectDepartmentId = leaderCockpitMapper.getTopDepartmentIds(searchConditionParam); + log.error("topDepartmentId===" + JSON.toJSONString(selectDepartmentId)); + } + // 查询每个部门 时间范围内的离职人数 + List portalList = new ArrayList<>(); + for (Long topDepartmentId : selectDepartmentId) { + List beLongDeps = departMentService.getBeLongDeps(topDepartmentId, searchConditionParam.getTenantKey(), false); + beLongDeps.add(topDepartmentId); + WeaDepartMent departMentById = departMentService.getDepartMentById(topDepartmentId); + PortalData portalData = new PortalData(); + portalData.setDate(currentMonth); + portalData.setDepart(departMentById.getDepartMentName()); + // 关键 + int keyEmploymentCount = leaderCockpitMapper.getKeyResignCount(searchConditionParam, beLongDeps, searchConditionParam.getStartDate(), searchConditionParam.getEndDate()); + // 非关键 + int employmentCount = leaderCockpitMapper.getResignCount(searchConditionParam, beLongDeps, searchConditionParam.getStartDate(), searchConditionParam.getEndDate()); + portalData.setKey(keyEmploymentCount); + portalData.setAll(employmentCount); + portalList.add(portalData); + } + + // portalList按照all排序 + portalList.sort((o1, o2) -> o2.getAll().compareTo(o1.getAll())); + + + Map returnMap = new HashMap<>(3); + returnMap.put("dataSource", portalList); + returnMap.put("all", allDataMap); + returnMap.put("key", keyDataMap); + return WeaResult.success(returnMap); + } + + + /** + * 构建查询对象 + * + * @param searchConditionParam + * @param params + * @param beforeMonth + */ + private void initSearchConditionParam(SearchConditionParam searchConditionParam, Map params, Integer beforeMonth) { + String searchDate = params.get("searchDate"); + String departmentId = params.get("departmentId"); + + // 租户 + searchConditionParam.setTenantKey(UserContext.getCurrentUser().getTenantKey()); + // 部门 + //searchConditionParam.setDepartmentId(departmentId); + + // 获取部门下的所有子部门 + if (StringUtils.isNotBlank(departmentId)) { + Set deptIdSet = new HashSet<>(); + Set selectDepartmentId = new HashSet<>(); + String[] split = departmentId.split(","); + for (String s : split) { + if (StringUtils.isBlank(s)) { + continue; + } + long parseLong = Long.parseLong(s); + log.error("parseLong===" + parseLong); + selectDepartmentId.add(parseLong); + List beLongDeps = departMentService.getBeLongDeps(parseLong, searchConditionParam.getTenantKey(), false); + beLongDeps.add(parseLong); + log.error("beLongDeps===" + JSON.toJSONString(beLongDeps)); + deptIdSet.addAll(beLongDeps); + } + searchConditionParam.setDepartmentIdList(deptIdSet); + searchConditionParam.setSelectDepartmentId(selectDepartmentId); + } + + // 处理截止日期 + String endDateStr; + if (StringUtils.isBlank(searchDate)) { + endDateStr = DateUtil.getCurrentDateStr(); + } else { + try { + // 验证日期格式是否合法 + endDateStr = searchDate; + } catch (Exception e) { + log.error("日期格式错误,使用当前日期: {}", searchDate, e); + endDateStr = DateUtil.getCurrentDateStr(); + } + } + searchConditionParam.setEndDate(endDateStr); + + // 处理开始日期 + if (beforeMonth == null) { + // 查询当前年度数据 + searchConditionParam.setStartDate(DateUtil.getFirstDayOfYearStr(searchConditionParam.getEndDate())); + } else { + // 查询前N个月数据 + try { + LocalDate endDate = LocalDate.parse(endDateStr); + LocalDate startDate = endDate.minusMonths(beforeMonth); + searchConditionParam.setStartDate(DateUtil.getFirstDayOfMonthStr(DateUtil.formatDate(startDate))); + } catch (Exception e) { + log.error("计算开始日期失败,使用所选日期年度第一天", e); + searchConditionParam.setStartDate(searchConditionParam.getEndDate()); + } + } + } + + /** + * 计算百分比 + * + * @param numerator + * @param denominator + * @return + */ + private double calculateRate(int numerator, int denominator) { + if (denominator == 0) { + log.warn("计算比率时分母为0,返回0"); + return 0.0; + } + return (double) numerator / denominator; + } + + /** + * 格式化百分比 + * + * @param rate + * @return + */ + private String formatPercentage(double rate) { + return String.format("%.2f%%", rate * 100); + } +} diff --git a/secondev-chabaidao-portal/src/main/java/com/weaver/seconddev/portal/service/impl/ManagerPortalServiceImpl.java b/secondev-chabaidao-portal/src/main/java/com/weaver/seconddev/portal/service/impl/ManagerPortalServiceImpl.java new file mode 100644 index 0000000..845eb00 --- /dev/null +++ b/secondev-chabaidao-portal/src/main/java/com/weaver/seconddev/portal/service/impl/ManagerPortalServiceImpl.java @@ -0,0 +1,660 @@ +package com.weaver.seconddev.portal.service.impl; + +import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.convert.Convert; +import com.alibaba.fastjson.JSON; +import com.weaver.common.base.entity.result.WeaResult; +import com.weaver.common.form.datasource.FormdataTemplateDetails; +import com.weaver.common.form.metadata.field.FormField; +import com.weaver.common.hrm.cache.HrmDepartmentComInfo; +import com.weaver.common.hrm.dao.HrmCommonDepartmentDao; +import com.weaver.common.hrm.dao.HrmCommonEmployeeDao; +import com.weaver.common.hrm.manage.HrmComInfoCacheHandler; +import com.weaver.seconddev.portal.entity.component.Option; +import com.weaver.seconddev.portal.entity.param.BasicPersonnelParam; +import com.weaver.seconddev.portal.entity.po.*; +import com.weaver.seconddev.portal.mapper.dictionary.DataConvertMapper; +import com.weaver.seconddev.portal.mapper.portal.EbuilderBaseMapper; +import com.weaver.seconddev.portal.mapper.portal.LeaderCockpitMapper; +import com.weaver.seconddev.portal.mapper.portal.ManagerPortalMapper; +import com.weaver.seconddev.portal.mapper.portal.PortalMapper; +import com.weaver.seconddev.portal.service.ManagerPortalService; +import com.weaver.seconddev.portal.util.DateUtil; +import com.weaver.seconddev.portal.util.StringUtil; +import com.weaver.teams.domain.department.SimpleDepartment; +import com.weaver.teams.domain.user.SimpleEmployee; +import com.weaver.teams.security.context.UserContext; +import com.weaver.teams.security.user.User; +import com.weaver.workflow.common.cfg.org.service.DepartMentService; +import com.weaver.workflow.common.entity.org.WeaDepartMent; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.lang.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.*; +import java.util.stream.Collectors; + +/** + * 经理门户 + * + * @author:dxfeng + * @createTime: 2025/07/08 + * @version: 1.0 + */ +@Slf4j +@Service +public class ManagerPortalServiceImpl implements ManagerPortalService { + private static final String PORTAL_KEY = "managerPortal"; + + @Autowired + LeaderCockpitMapper leaderCockpitMapper; + + @Autowired + PortalMapper portalMapper; + + @Autowired + ManagerPortalMapper managerPortalMapper; + @Autowired + DepartMentService departMentService; + @Autowired + HrmCommonDepartmentDao hrmCommonDepartmentDao; + @Autowired + HrmComInfoCacheHandler hrmComInfoCacheHandler; + @Autowired + EbuilderBaseMapper ebuilderBaseMapper; + @Autowired + HrmCommonEmployeeDao hrmCommonEmployeeDao; + @Autowired + DataConvertMapper dataConvertMapper; + + @Override + public WeaResult> getMangerInfo(Map params) { + User currentUser = UserContext.getCurrentUser(); + BasicPersonnelParam basicPersonnelParam = new BasicPersonnelParam(); + basicPersonnelParam.setTenantKey(currentUser.getTenantKey()); + Set allDepartmentIds = getAllDepartmentIdList(basicPersonnelParam, currentUser.getEmployeeId()); + List departmentList = hrmComInfoCacheHandler.getCacheList(HrmDepartmentComInfo.class, allDepartmentIds); + // 获取顶级部门 + List topDepartmentList = departmentList.stream() + .filter(dept -> !allDepartmentIds.contains(dept.getParent())) + .collect(Collectors.toList()); + + List departmentNames = topDepartmentList.stream().map(HrmDepartmentComInfo::getName).collect(Collectors.toList()); + + Map returnMap = new HashMap<>(); + returnMap.put("deptNames", StringUtils.join(departmentNames, "、")); + returnMap.put("userName", currentUser.getUsername()); + return WeaResult.success(returnMap); + } + + @Override + public WeaResult> getTodayOverview(Map params) { + + return null; + } + + @Override + public WeaResult> getBasicPersonnel(Map params) { + Map returnMap = new HashMap<>(); + String searchType = params.get("searchType"); + String searchDate = params.get("searchDate"); + + User currentUser = UserContext.getCurrentUser(); + BasicPersonnelParam basicPersonnelParam = new BasicPersonnelParam(); + basicPersonnelParam.setTenantKey(currentUser.getTenantKey()); + Set allDepartmentIdList = getAllDepartmentIdList(basicPersonnelParam, currentUser.getEmployeeId()); + + // 设置部门范围ID集合 + basicPersonnelParam.setDepartmentIdList(allDepartmentIdList); + + if ("year".equals(searchType)) { + // 开始时间年度第一天 + basicPersonnelParam.setStartDate(StringUtils.isBlank(searchDate) ? DateUtil.getFirstDayOfYearStr() : searchDate + "-01-01"); + // 结束时间年度最后一天 + basicPersonnelParam.setEndDate(StringUtils.isBlank(searchDate) ? DateUtil.getCurrentDateStr() : searchDate + "-12-31"); + + } else if ("month".equals(searchType)) { + // 开始时间月度第一天 + basicPersonnelParam.setStartDate(StringUtils.isBlank(searchDate) ? DateUtil.getFirstDayOfMonth() : searchDate + "-01"); + // 结束时间月度最后一天 + basicPersonnelParam.setEndDate(StringUtils.isBlank(searchDate) ? DateUtil.getCurrentDateStr() : DateUtil.getLastDayOfPreviousMonthStr(searchDate + "-01", 0)); + } + + int onJobNum = managerPortalMapper.getOnJobNum(basicPersonnelParam); + int resignNumber = managerPortalMapper.getResignNumber(basicPersonnelParam); + int resigningNumber = managerPortalMapper.getResigningNumber(basicPersonnelParam); + int entryNumber = managerPortalMapper.getEntryNumber(basicPersonnelParam); + int entryingNumber = managerPortalMapper.getEntryingNumber(basicPersonnelParam); + + // 获取穿透地址 + List portalUrlDetails = portalMapper.getPortalUrlDetail(currentUser.getTenantKey(), PORTAL_KEY, "getBasicPersonnel"); + Map urlMap = portalUrlDetails.stream().collect(Collectors.toMap(PortalUrlDetail::getDetailKey, PortalUrlDetail::getUrlAddress)); + + // 在职人数 + returnMap.put("onJobNumber", onJobNum); + returnMap.put("onJobNumberUrl", urlMap.get("onJobNumber") + "?dataKey=onJobNumber&startDate=" + basicPersonnelParam.getStartDate() + "&endDate=" + basicPersonnelParam.getEndDate()); + // 年度离职人数 + returnMap.put("resignNumber", resignNumber); + returnMap.put("resignNumberUrl", urlMap.get("resignNumber") + "?dataKey=resignNumber&startDate=" + basicPersonnelParam.getStartDate() + "&endDate=" + basicPersonnelParam.getEndDate()); + + // 年度入职人数 + returnMap.put("entryNumber", entryNumber); + returnMap.put("entryNumberUrl", urlMap.get("entryNumber") + "?dataKey=entryNumber&startDate=" + basicPersonnelParam.getStartDate() + "&endDate=" + basicPersonnelParam.getEndDate()); + // 离职流程中人数 + returnMap.put("resigningNumber", resigningNumber); + returnMap.put("resigningNumberUrl", urlMap.get("resigningNumber") + "?dataKey=resigningNumber&startDate=" + basicPersonnelParam.getStartDate() + "&endDate=" + basicPersonnelParam.getEndDate()); + // 入职流程中人数 + returnMap.put("entryingNumber", entryingNumber); + returnMap.put("entryingNumberUrl", urlMap.get("entryingNumber") + "?dataKey=entryingNumber&startDate=" + basicPersonnelParam.getStartDate() + "&endDate=" + basicPersonnelParam.getEndDate()); + + + return WeaResult.success(returnMap); + } + + @Override + public WeaResult getBasicPersonnelSql(Map params) { + String dataKey = params.get("dataKey"); + String startDate = params.get("startDate"); + String endDate = params.get("endDate"); + log.error("params==={}", JSON.toJSONString(params)); + User currentUser = UserContext.getCurrentUser(); + BasicPersonnelParam basicPersonnelParam = new BasicPersonnelParam(); + basicPersonnelParam.setTenantKey(currentUser.getTenantKey()); + Set allDepartmentIdList = getAllDepartmentIdList(basicPersonnelParam, currentUser.getEmployeeId()); + StringJoiner andCondition = new StringJoiner(" and "); + switch (dataKey) { + case "onJobNumber": + // 在职人数 + if (CollectionUtils.isNotEmpty(allDepartmentIdList)) { + andCondition.add(" t1.department in (" + StringUtils.join(allDepartmentIdList, ",") + ") "); + } + andCondition.add(" t1.hiredate <= #{endDate} AND (t1.zhgzr >= #{startDate} OR t1.zhgzr IS NULL OR t1.zhgzr = '') "); + break; + case "resignNumber": + // 年度离职人数 + andCondition.add(" t1.lzzt = 1 "); + if (CollectionUtils.isNotEmpty(allDepartmentIdList)) { + andCondition.add(" t1.lzqbm in (" + StringUtils.join(allDepartmentIdList, ",") + ") "); + } + andCondition.add(" t1.zhgzr >= #{startDate} and t1.zhgzr <= #{endDate} "); + break; + case "entryNumber": + // 年度入职人数 + andCondition.add(" t1.rzzt = 1 "); + if (CollectionUtils.isNotEmpty(allDepartmentIdList)) { + andCondition.add(" t1.department in (" + StringUtils.join(allDepartmentIdList, ",") + ") "); + } + andCondition.add(" t1.hiredate >= #{startDate} and t1.hiredate <= #{endDate} "); + break; + case "resigningNumber": + // 离职流程中人数 + andCondition.add(" t1.flow_status in (0,1,2) "); + if (CollectionUtils.isNotEmpty(allDepartmentIdList)) { + andCondition.add(" t1.lzqbm in (" + StringUtils.join(allDepartmentIdList, ",") + ") "); + } + andCondition.add(" t1.sqrq >= #{startDate} and t1.sqrq <= #{endDate} "); + break; + case "entryingNumber": + // 入职流程中人数 + andCondition.add(" t1.flow_status in (0,1,2) "); + if (CollectionUtils.isNotEmpty(allDepartmentIdList)) { + andCondition.add(" t1.ssbm in (" + StringUtils.join(allDepartmentIdList, ",") + ") "); + } + andCondition.add(" t1.sqsj >= #{startDate} and t1.sqsj <= #{endDate} "); + break; + default: + break; + } + + String replaceSql = andCondition.toString().replace("#{startDate}", "'" + startDate + "'").replace("#{endDate}", "'" + endDate + "'"); + log.error("replaceSql==={}", replaceSql); + return WeaResult.success(replaceSql); + } + + /** + * 生日提醒:提前一周 + * 转正提醒:提前30天 + * 入职周年:提前一周 + * + * @param params + * @return + */ + @Override + public WeaResult> getTeamMemorialDay(Map params) { + User currentUser = UserContext.getCurrentUser(); + BasicPersonnelParam basicPersonnelParam = new BasicPersonnelParam(); + basicPersonnelParam.setTenantKey(currentUser.getTenantKey()); + Set allDepartmentIdList = getAllDepartmentIdList(basicPersonnelParam, currentUser.getEmployeeId()); + + // 设置部门范围ID集合 + basicPersonnelParam.setDepartmentIdList(allDepartmentIdList); + int birthdayNum = managerPortalMapper.getBirthdayNum(basicPersonnelParam); + + int regularEmployeeNum = managerPortalMapper.getRegularEmployeeNum(basicPersonnelParam); + + int employmentAnniversary = managerPortalMapper.getEmploymentAnniversary(basicPersonnelParam); + + // 获取穿透地址 + List portalUrlDetails = portalMapper.getPortalUrlDetail(currentUser.getTenantKey(), PORTAL_KEY, "getTeamMemorialDay"); + Map urlMap = portalUrlDetails.stream().collect(Collectors.toMap(PortalUrlDetail::getDetailKey, PortalUrlDetail::getUrlAddress)); + + Map returnMap = new HashMap<>(); + // 生日提醒 + returnMap.put("birthdayNum", birthdayNum); + returnMap.put("birthdayNumUrl", urlMap.get("birthdayNum") + "?dataKey=birthdayNum"); + // 转正日期 + returnMap.put("regularEmployeeNum", regularEmployeeNum); + returnMap.put("regularEmployeeNumUrl", urlMap.get("regularEmployeeNum") + "?dataKey=regularEmployeeNum"); + // 入职周年提醒 + returnMap.put("employmentAnniversary", employmentAnniversary); + returnMap.put("employmentAnniversaryUrl", urlMap.get("employmentAnniversary") + "?dataKey=employmentAnniversary"); + + return WeaResult.success(returnMap); + } + + @Override + public WeaResult getTeamMemorialDaySql(Map params) { + String dataKey = params.get("dataKey"); + log.error("params==={}", JSON.toJSONString(params)); + User currentUser = UserContext.getCurrentUser(); + BasicPersonnelParam basicPersonnelParam = new BasicPersonnelParam(); + basicPersonnelParam.setTenantKey(currentUser.getTenantKey()); + Set allDepartmentIdList = getAllDepartmentIdList(basicPersonnelParam, currentUser.getEmployeeId()); + StringJoiner andCondition = new StringJoiner(" and "); + switch (dataKey) { + case "birthdayNum": + // 生日提醒 + if (CollectionUtils.isNotEmpty(allDepartmentIdList)) { + andCondition.add(" t1.department in (" + StringUtils.join(allDepartmentIdList, ",") + ") "); + } + andCondition.add(" ( ( DATE_FORMAT(t1.birthday, '%m-%d') BETWEEN DATE_FORMAT(CURDATE(), '%m-%d') AND DATE_FORMAT(DATE_ADD(CURDATE(), INTERVAL 7 DAY), '%m-%d') ) OR ( DATE_FORMAT(CURDATE(), '%m-%d') > DATE_FORMAT(DATE_ADD(CURDATE(), INTERVAL 7 DAY), '%m-%d') AND ( DATE_FORMAT(birthday, '%m-%d') >= DATE_FORMAT(CURDATE(), '%m-%d') OR DATE_FORMAT(t1.birthday, '%m-%d') <= DATE_FORMAT(DATE_ADD(CURDATE(), INTERVAL 7 DAY), '%m-%d') ) ) ) "); + + break; + case "regularEmployeeNum": + // 转正日期 + if (CollectionUtils.isNotEmpty(allDepartmentIdList)) { + andCondition.add(" t1.department in (" + StringUtils.join(allDepartmentIdList, ",") + ") "); + } + andCondition.add(" t1.yjsyjsrq IS NOT NULL AND ( STR_TO_DATE(CONCAT(YEAR(CURDATE()), '-', DATE_FORMAT(t1.yjsyjsrq, '%m-%d')), '%Y-%m-%d') BETWEEN CURDATE() AND DATE_ADD(CURDATE(), INTERVAL 60 DAY) OR STR_TO_DATE(CONCAT(YEAR(CURDATE()) + 1, '-', DATE_FORMAT(t1.yjsyjsrq, '%m-%d')), '%Y-%m-%d') BETWEEN CURDATE() AND DATE_ADD(CURDATE(), INTERVAL 60 DAY) ) "); + + break; + case "employmentAnniversary": + // 入职周年提醒 + if (CollectionUtils.isNotEmpty(allDepartmentIdList)) { + andCondition.add(" t1.department in (" + StringUtils.join(allDepartmentIdList, ",") + ") "); + } + andCondition.add(" ( ( DATE_FORMAT(t1.hiredate, '%m-%d') between DATE_FORMAT(CURDATE(), '%m-%d') and DATE_FORMAT(DATE_ADD(CURDATE(), interval 7 day), '%m-%d') ) or ( DATE_FORMAT(CURDATE(), '%m-%d') > DATE_FORMAT(DATE_ADD(CURDATE(), interval 7 day), '%m-%d') and ( DATE_FORMAT(t1.hiredate, '%m-%d') >= DATE_FORMAT(CURDATE(), '%m-%d') or DATE_FORMAT(t1.hiredate, '%m-%d') <= DATE_FORMAT(DATE_ADD(CURDATE(), interval 7 day), '%m-%d') ) ) ) "); + break; + default: + break; + } + String replaceSql = StringUtil.buildSqlCondition(andCondition.toString()); + log.error("replaceSql==={}", replaceSql); + return WeaResult.success(replaceSql); + + } + + @Override + public WeaResult> getEducationInfo(Map params) { + + String type = params.get("type"); + String searchKey = params.get("searchKey"); + if (StringUtils.isBlank(type)) { + // 默认学历信息 + type = "education"; + } + User currentUser = UserContext.getCurrentUser(); + BasicPersonnelParam basicPersonnelParam = new BasicPersonnelParam(); + basicPersonnelParam.setTenantKey(currentUser.getTenantKey()); + Set allDepartmentIdList = getAllDepartmentIdList(basicPersonnelParam, currentUser.getEmployeeId()); + // 设置部门范围ID集合 + basicPersonnelParam.setDepartmentIdList(allDepartmentIdList); + basicPersonnelParam.setPieType(type); + basicPersonnelParam.setSearchKey(searchKey); + List portalUrlDetails = portalMapper.getPortalUrlDetail(currentUser.getTenantKey(), PORTAL_KEY, "getEducationInfo"); + Map urlMap = portalUrlDetails.stream().collect(Collectors.toMap(PortalUrlDetail::getDetailKey, PortalUrlDetail::getUrlAddress)); + List returnList = new ArrayList<>(); + Map returnMap = new HashMap<>(); + switch (type) { + case "education": + // 学历 + dealEducationInfo(basicPersonnelParam, returnList); + returnMap.put("url", urlMap.get("education")); + + break; + case "age": + // 年龄 + dealAgeInfo(basicPersonnelParam, returnList); + returnMap.put("url", urlMap.get("age")); + break; + case "grade": + // 职级 + returnMap.put("url", urlMap.get("grade")); + break; + case "company": + // 司龄 + dealCompanyInfo(basicPersonnelParam, returnList); + returnMap.put("url", urlMap.get("company")); + break; + case "performance": + // 绩效 + dealPerformanceInfo(basicPersonnelParam, returnList); + returnMap.put("url", urlMap.get("performance")); + break; + default: + break; + } + returnMap.put("list", returnList); + return WeaResult.success(returnMap); + } + + @Override + public WeaResult> getAttendanceInfo(Map params) { + String type = params.get("type"); + if (StringUtils.isBlank(type)) { + // 默认学历信息 + type = "abnormalAttendance"; + } + User currentUser = UserContext.getCurrentUser(); + BasicPersonnelParam basicPersonnelParam = new BasicPersonnelParam(); + basicPersonnelParam.setTenantKey(currentUser.getTenantKey()); + basicPersonnelParam.setStartDate(DateUtil.getFirstDayOfMonth()); + basicPersonnelParam.setEndDate(DateUtil.getLastDayOfMonth()); + + Set allDepartmentIdList = getAllDepartmentIdList(basicPersonnelParam, currentUser.getEmployeeId()); + // 设置部门范围ID集合 + basicPersonnelParam.setDepartmentIdList(allDepartmentIdList); + + List portalUrlDetails = portalMapper.getPortalUrlDetail(currentUser.getTenantKey(), PORTAL_KEY, "getAttendanceInfo"); + Map urlMap = portalUrlDetails.stream().collect(Collectors.toMap(PortalUrlDetail::getDetailKey, PortalUrlDetail::getUrlAddress)); + + switch (type) { + case "abnormalAttendance": + // 异常考勤 + Map map = dealAbnormalAttendanceInfo(basicPersonnelParam); + map.put("url", urlMap.get("abnormalAttendance")); + return WeaResult.success(map); + case "lateOrLeaveEarly": + // 迟到/早退 + Map map1 = dealLateOrLeaveEarlyInfo(basicPersonnelParam); + map1.put("url", urlMap.get("lateOrLeaveEarly")); + return WeaResult.success(map1); + case "overtimeDuration": + // 加班时长 + Map map2 = dealOvertimeDurationInfo(basicPersonnelParam); + map2.put("url", urlMap.get("overtimeDuration")); + return WeaResult.success(map2); + case "leaveType": + // 请假类型 + Map map3 = dealLeaveTypeInfo(basicPersonnelParam); + map3.put("url", urlMap.get("leaveType")); + return WeaResult.success(map3); + default: + return WeaResult.fail("不支持的统计类型",true); + + } + } + + @Override + public WeaResult> getTeamEmployee(Map params) { + String searchKey = params.get("searchKey"); + String departmentId = params.get("departmentId"); + int pageSize = Convert.toInt(params.get("pageSize"), 10); + int current = Convert.toInt(params.get("current"), 1); + + User currentUser = UserContext.getCurrentUser(); + BasicPersonnelParam basicPersonnelParam = new BasicPersonnelParam(); + basicPersonnelParam.setTenantKey(currentUser.getTenantKey()); + basicPersonnelParam.setCurrent(current); + basicPersonnelParam.setPageSize(pageSize); + basicPersonnelParam.setSearchKey(searchKey); + //log.error("departmentId==={}", departmentId); + basicPersonnelParam.setDepartmentId(departmentId); + Set allDepartmentIdList = getAllDepartmentIdList(basicPersonnelParam, currentUser.getEmployeeId()); + //log.error("allDepartmentIdList111==={}", JSON.toJSONString(allDepartmentIdList)); + basicPersonnelParam.setDepartmentIdList(allDepartmentIdList); + if (StringUtils.isNotBlank(departmentId)) { + List beLongDeps = departMentService.getBeLongDeps(Long.parseLong(departmentId)); + Set collect = beLongDeps.stream().map(WeaDepartMent::getDepartMentId).collect(Collectors.toSet()); + collect.add(Long.parseLong(departmentId)); + // 两个set取交集 + allDepartmentIdList.retainAll(collect); + //log.error("collect==={}", JSON.toJSONString(collect)); + + if (CollectionUtils.isEmpty(allDepartmentIdList)) { + allDepartmentIdList.add(-1L); + } + } + //log.error("allDepartmentIdList222==={}", JSON.toJSONString(allDepartmentIdList)); + + + List teamEmployee = managerPortalMapper.getTeamEmployee(basicPersonnelParam); + int total = managerPortalMapper.getTeamEmployeeTotal(basicPersonnelParam); + + + Map returnMap = new HashMap<>(); + returnMap.put("list", teamEmployee); + returnMap.put("total", total); + returnMap.put("current", current); + returnMap.put("pageSize", pageSize); + + return WeaResult.success(returnMap); + } + + @Override + public WeaResult> getEbFieldOptions(Map params) { + String tableName = params.get("tableName"); + String fieldName = params.get("fieldName"); + BasicPersonnelParam basicPersonnelParam = new BasicPersonnelParam(); + User currentUser = UserContext.getCurrentUser(); + basicPersonnelParam.setTenantKey(currentUser.getTenantKey()); + // 查询考核周期选项 + long formId = ebuilderBaseMapper.getFormIdByTableName(basicPersonnelParam, StringUtils.isBlank(tableName) ? "uf_jxsjtz" : tableName); + FormField formField = ebuilderBaseMapper.getFormFieldByFieldName(basicPersonnelParam, formId, StringUtils.isBlank(fieldName) ? "khzq" : fieldName); + List templateDetails = ebuilderBaseMapper.getFormdataTemplateDetails(basicPersonnelParam, formField.getDataTemplateId()); + + List