From 5e5cf207c92fd2eee7fcc918fab85bdd800d187a Mon Sep 17 00:00:00 2001 From: dxfeng Date: Wed, 30 Jul 2025 15:41:34 +0800 Subject: [PATCH] =?UTF-8?q?feat(portal):=20=E6=96=B0=E5=A2=9E=E8=80=83?= =?UTF-8?q?=E5=8B=A4=E7=9C=8B=E6=9D=BF=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 添加异常考勤、迟到早退、加班时长、请假类型等考勤统计信息 --- .../entry/EmailAccountGenerateAction.java | 4 + .../action/entry/IDCardRecognitionAction.java | 2 +- .../controller/ManagerPortalController.java | 5 + .../portal/entity/param/BaseParam.java | 5 + .../portal/entity/po/LateAndEarlyRankPo.java | 17 ++ .../mapper/dictionary/DataConvertMapper.java | 8 + .../mapper/portal/ManagerPortalMapper.java | 31 +++ .../portal/service/ManagerPortalService.java | 8 + .../impl/ManagerPortalServiceImpl.java | 145 +++++++++++++- .../seconddev/portal/util/PapiUtil.java | 1 + .../mapper/dictionary/DataConvertMapper.xml | 6 + .../mapper/portal/ManagerPortalMapper.xml | 182 +++++++++++++++++- 12 files changed, 403 insertions(+), 11 deletions(-) create mode 100644 src/main/java/com/weaver/seconddev/portal/entity/po/LateAndEarlyRankPo.java diff --git a/src/main/java/com/weaver/seconddev/portal/action/entry/EmailAccountGenerateAction.java b/src/main/java/com/weaver/seconddev/portal/action/entry/EmailAccountGenerateAction.java index a954b45..3a04225 100644 --- a/src/main/java/com/weaver/seconddev/portal/action/entry/EmailAccountGenerateAction.java +++ b/src/main/java/com/weaver/seconddev/portal/action/entry/EmailAccountGenerateAction.java @@ -84,6 +84,8 @@ public class EmailAccountGenerateAction implements EsbServerlessRpcRemoteInterfa */ 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; @@ -100,6 +102,8 @@ public class EmailAccountGenerateAction implements EsbServerlessRpcRemoteInterfa */ 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/src/main/java/com/weaver/seconddev/portal/action/entry/IDCardRecognitionAction.java b/src/main/java/com/weaver/seconddev/portal/action/entry/IDCardRecognitionAction.java index b02bbf0..eca5ac0 100644 --- a/src/main/java/com/weaver/seconddev/portal/action/entry/IDCardRecognitionAction.java +++ b/src/main/java/com/weaver/seconddev/portal/action/entry/IDCardRecognitionAction.java @@ -226,7 +226,7 @@ public class IDCardRecognitionAction implements EsbServerlessRpcRemoteInterface } String startDate = Convert.toStr(validityArr[0], "").replace(".", "-"); String endDate = Convert.toStr(validityArr[1], "").replace(".", "-"); - returnMap.put("validity_type", "0"); + returnMap.put("validityType", "0"); if ("长期".equals(endDate)) { endDate = "9999-12-31"; returnMap.put("validityType", "1"); diff --git a/src/main/java/com/weaver/seconddev/portal/controller/ManagerPortalController.java b/src/main/java/com/weaver/seconddev/portal/controller/ManagerPortalController.java index 1ef3b04..5ec8ae0 100644 --- a/src/main/java/com/weaver/seconddev/portal/controller/ManagerPortalController.java +++ b/src/main/java/com/weaver/seconddev/portal/controller/ManagerPortalController.java @@ -62,6 +62,11 @@ public class ManagerPortalController { 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); diff --git a/src/main/java/com/weaver/seconddev/portal/entity/param/BaseParam.java b/src/main/java/com/weaver/seconddev/portal/entity/param/BaseParam.java index ca91eab..941daac 100644 --- a/src/main/java/com/weaver/seconddev/portal/entity/param/BaseParam.java +++ b/src/main/java/com/weaver/seconddev/portal/entity/param/BaseParam.java @@ -24,6 +24,11 @@ public class BaseParam { * 岗位自定义表 */ private String table_job_cus = "ft_1155455711525494797"; + + /** + * 请假表单 + */ + private String leaveFormCus = "ft_1151420254779654145"; ///** // * 员工自定义表 // */ diff --git a/src/main/java/com/weaver/seconddev/portal/entity/po/LateAndEarlyRankPo.java b/src/main/java/com/weaver/seconddev/portal/entity/po/LateAndEarlyRankPo.java new file mode 100644 index 0000000..a840ca2 --- /dev/null +++ b/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/src/main/java/com/weaver/seconddev/portal/mapper/dictionary/DataConvertMapper.java b/src/main/java/com/weaver/seconddev/portal/mapper/dictionary/DataConvertMapper.java index e0beb90..faa1c8e 100644 --- a/src/main/java/com/weaver/seconddev/portal/mapper/dictionary/DataConvertMapper.java +++ b/src/main/java/com/weaver/seconddev/portal/mapper/dictionary/DataConvertMapper.java @@ -20,4 +20,12 @@ public interface DataConvertMapper { * @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/src/main/java/com/weaver/seconddev/portal/mapper/portal/ManagerPortalMapper.java b/src/main/java/com/weaver/seconddev/portal/mapper/portal/ManagerPortalMapper.java index 6e32eac..e83ff6e 100644 --- a/src/main/java/com/weaver/seconddev/portal/mapper/portal/ManagerPortalMapper.java +++ b/src/main/java/com/weaver/seconddev/portal/mapper/portal/ManagerPortalMapper.java @@ -1,6 +1,7 @@ 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; @@ -147,4 +148,34 @@ public interface ManagerPortalMapper { */ 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/src/main/java/com/weaver/seconddev/portal/service/ManagerPortalService.java b/src/main/java/com/weaver/seconddev/portal/service/ManagerPortalService.java index 6d0e849..df1578f 100644 --- a/src/main/java/com/weaver/seconddev/portal/service/ManagerPortalService.java +++ b/src/main/java/com/weaver/seconddev/portal/service/ManagerPortalService.java @@ -67,6 +67,14 @@ public interface ManagerPortalService { */ WeaResult> getEducationInfo(Map params); + /** + * 考勤看板 + * + * @param params + * @return + */ + WeaResult> getAttendanceInfo(Map params); + /** * 团队员工 * diff --git a/src/main/java/com/weaver/seconddev/portal/service/impl/ManagerPortalServiceImpl.java b/src/main/java/com/weaver/seconddev/portal/service/impl/ManagerPortalServiceImpl.java index 0deb040..2c5cd51 100644 --- a/src/main/java/com/weaver/seconddev/portal/service/impl/ManagerPortalServiceImpl.java +++ b/src/main/java/com/weaver/seconddev/portal/service/impl/ManagerPortalServiceImpl.java @@ -1,5 +1,6 @@ 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; @@ -7,13 +8,12 @@ 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.PieChartConfig; -import com.weaver.seconddev.portal.entity.po.PortalPO; -import com.weaver.seconddev.portal.entity.po.PortalUrlDetail; -import com.weaver.seconddev.portal.entity.po.TeamEmployeePo; +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; @@ -21,6 +21,8 @@ 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; @@ -62,6 +64,10 @@ public class ManagerPortalServiceImpl implements ManagerPortalService { HrmComInfoCacheHandler hrmComInfoCacheHandler; @Autowired EbuilderBaseMapper ebuilderBaseMapper; + @Autowired + HrmCommonEmployeeDao hrmCommonEmployeeDao; + @Autowired + DataConvertMapper dataConvertMapper; @Override public WeaResult> getMangerInfo(Map params) { @@ -344,6 +350,41 @@ public class ManagerPortalServiceImpl implements ManagerPortalService { 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); + switch (type) { + case "abnormalAttendance": + // 异常考勤 + return WeaResult.success(dealAbnormalAttendanceInfo(basicPersonnelParam)); + case "lateOrLeaveEarly": + // 迟到/早退 + return WeaResult.success(dealLateOrLeaveEarlyInfo(basicPersonnelParam)); + case "overtimeDuration": + // 加班时长 + return WeaResult.success(dealOvertimeDurationInfo(basicPersonnelParam)); + case "leaveType": + // 请假类型 + return WeaResult.success(dealLeaveTypeInfo(basicPersonnelParam)); + default: + return WeaResult.fail("不支持的统计类型",true); + + } + } + @Override public WeaResult> getTeamEmployee(Map params) { String searchKey = params.get("searchKey"); @@ -490,6 +531,101 @@ public class ManagerPortalServiceImpl implements ManagerPortalService { } + /** + * 异常考勤 + * + * @param basicPersonnelParam + * @return + */ + private Map dealAbnormalAttendanceInfo(BasicPersonnelParam basicPersonnelParam) { + Map dataMap = new LinkedHashMap<>(); + dataMap.put("late", Convert.toInt(managerPortalMapper.sumLateTimes(basicPersonnelParam), 0)); + dataMap.put("leaveEarly", Convert.toInt(managerPortalMapper.sumLeaveEarlyTimes(basicPersonnelParam), 0)); + dataMap.put("absenteeism", Convert.toInt(managerPortalMapper.sumAbsenteeismTimes(basicPersonnelParam), 0)); + dataMap.put("reissueCard", Convert.toInt(managerPortalMapper.sumReissueCardTimes(basicPersonnelParam), 0)); + dataMap.put("totalAttendance", Convert.toInt(managerPortalMapper.sumTotalAttendanceTimes(basicPersonnelParam), 0) * 2); + return dataMap; + } + + /** + * 迟到/早退 + * + * @param basicPersonnelParam + * @return + */ + private Map dealLateOrLeaveEarlyInfo(BasicPersonnelParam basicPersonnelParam) { + Map dataMap = new LinkedHashMap<>(); + List lateAndEarlyRankList = managerPortalMapper.getLateAndEarlyRankList(basicPersonnelParam); + Iterator iterator = lateAndEarlyRankList.iterator(); + while (iterator.hasNext()) { + LateAndEarlyRankPo lateAndEarlyRankPo = iterator.next(); + if (lateAndEarlyRankPo.getTimes() == null || lateAndEarlyRankPo.getTimes() == 0) { + iterator.remove(); + continue; + } + SimpleEmployee byId = hrmCommonEmployeeDao.getById(lateAndEarlyRankPo.getEmpId()); + if (byId != null) { + lateAndEarlyRankPo.setEmpName(byId.getName()); + SimpleDepartment department = byId.getDepartment(); + if (department != null) { + lateAndEarlyRankPo.setDepartmentName(department.getName()); + } + } + } + dataMap.put("list", lateAndEarlyRankList); + return dataMap; + } + + /** + * 加班时长 + * + * @param basicPersonnelParam + * @return + */ + private Map dealOvertimeDurationInfo(BasicPersonnelParam basicPersonnelParam) { + Map dataMap = new LinkedHashMap<>(); + // 工作日加班 + dataMap.put("workday", Convert.toInt(managerPortalMapper.sumWorkdayOvertimeDuration(basicPersonnelParam), 0)); + // 公休日加班 + dataMap.put("weekend", Convert.toInt(managerPortalMapper.sumWeekendOvertimeDuration(basicPersonnelParam), 0)); + // 法定假节日加班 + dataMap.put("legalHoliday", Convert.toInt(managerPortalMapper.sumLegalHolidayOvertimeDuration(basicPersonnelParam), 0)); + return dataMap; + } + + /** + * 请假类型 + * + * @param basicPersonnelParam + * @return + */ + private Map dealLeaveTypeInfo(BasicPersonnelParam basicPersonnelParam) { + Map dataMap = new LinkedHashMap<>(); + Set holidayIds = new HashSet<>(); + // 事假次数 + holidayIds.add(dataConvertMapper.getHolidayType(basicPersonnelParam, "事假")); + dataMap.put("personalLeaveCount", Convert.toInt(managerPortalMapper.sumHolidayTimes(basicPersonnelParam, CollectionUtil.isEmpty(holidayIds) ? Collections.singletonList(-1L) : holidayIds), 0)); + // 事假时长 + dataMap.put("personalLeaveDuration", Convert.toInt(managerPortalMapper.sumPersonalLeaveDuration(basicPersonnelParam), 0)); + // 病假次数 + holidayIds = new HashSet<>(); + holidayIds.add(dataConvertMapper.getHolidayType(basicPersonnelParam, "病假")); + holidayIds.add(dataConvertMapper.getHolidayType(basicPersonnelParam, "带薪病假")); + dataMap.put("sickLeaveCount", Convert.toInt(managerPortalMapper.sumHolidayTimes(basicPersonnelParam, CollectionUtil.isEmpty(holidayIds) ? Collections.singletonList(-1L) : holidayIds), 0)); + // 病假时长 + dataMap.put("sickLeaveDuration", Convert.toInt(managerPortalMapper.sumSickLeaveDuration(basicPersonnelParam), 0)); + // 年假次数 + holidayIds = new HashSet<>(); + holidayIds.add(dataConvertMapper.getHolidayType(basicPersonnelParam, "年假")); + dataMap.put("annualLeaveCount", Convert.toInt(managerPortalMapper.sumHolidayTimes(basicPersonnelParam, CollectionUtil.isEmpty(holidayIds) ? Collections.singletonList(-1L) : holidayIds), 0)); + // 年假时长 + dataMap.put("annualLeaveDuration", Convert.toInt(managerPortalMapper.sumAnnualLeaveDuration(basicPersonnelParam), 0)); + + return dataMap; + } + + + /** * 获取用户当前所负责的所有的部门以及下级部门 * @@ -506,6 +642,7 @@ public class ManagerPortalServiceImpl implements ManagerPortalService { allDepartmentList.add(departMentById); allDepartmentList.addAll(beLongDeps); } + // TODO 判断集合如果为空,不展示数据 return allDepartmentList.stream().map(WeaDepartMent::getDepartMentId).collect(Collectors.toSet()); } } diff --git a/src/main/java/com/weaver/seconddev/portal/util/PapiUtil.java b/src/main/java/com/weaver/seconddev/portal/util/PapiUtil.java index cdf339d..7b6e707 100644 --- a/src/main/java/com/weaver/seconddev/portal/util/PapiUtil.java +++ b/src/main/java/com/weaver/seconddev/portal/util/PapiUtil.java @@ -58,6 +58,7 @@ public class PapiUtil { } public static void main(String[] args) { + // TODO 测试用 String papiCode = getPapiCode(ApplicationConfigConstant.APP_URL, ApplicationConfigConstant.CORP_ID, "A1a"); System.out.println("papiCode==" + papiCode); String papiToken = getPapiToken(ApplicationConfigConstant.APP_URL, ApplicationConfigConstant.ORGANIZATION_APP_KEY, ApplicationConfigConstant.ORGANIZATION_APP_SECRET, papiCode); diff --git a/src/main/resources/mapper/dictionary/DataConvertMapper.xml b/src/main/resources/mapper/dictionary/DataConvertMapper.xml index 5108878..26dc11f 100644 --- a/src/main/resources/mapper/dictionary/DataConvertMapper.xml +++ b/src/main/resources/mapper/dictionary/DataConvertMapper.xml @@ -9,4 +9,10 @@ and t1.type = #{type} and t1.name = #{name} + + diff --git a/src/main/resources/mapper/portal/ManagerPortalMapper.xml b/src/main/resources/mapper/portal/ManagerPortalMapper.xml index fd30110..2db5219 100644 --- a/src/main/resources/mapper/portal/ManagerPortalMapper.xml +++ b/src/main/resources/mapper/portal/ManagerPortalMapper.xml @@ -229,9 +229,9 @@ #{departmentId} - - - + + + and (t.username like concat('%',#{searchKey},'%') or t.job_num like concat('%',#{searchKey},'%')) @@ -251,9 +251,9 @@ #{departmentId} - - - + + + and (t.username like concat('%',#{searchKey},'%') or t.job_num like concat('%',#{searchKey},'%')) @@ -273,5 +273,175 @@ group by t.ppdj + + + + + + + + + + + + + + + + + + + + + + + + + +