From e6ae6c94e06e728eb7052d5a28bb148c00045663 Mon Sep 17 00:00:00 2001 From: guoshengxiong <1923636941@qq.com> Date: Thu, 21 Aug 2025 09:21:15 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BA=BA=E5=91=98=E9=80=80=E5=9C=BA=E8=AE=BE?= =?UTF-8?q?=E7=BD=AE=E5=92=8Cbug=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../worker/controller/TeamInfoController.java | 11 +- ...DailyAttendanceStatisticsV2Controller.java | 182 +++++++++++++++++- .../WorkerExitConfigController.java | 141 ++++++++++++++ .../controller/WorkerInfoController.java | 2 + .../controller/WorkerTypeController.java | 12 +- .../worker/entity/WorkerExitConfig.java | 88 +++++++++ .../modules/worker/entity/WorkerType.java | 42 ++-- .../entity/dto/WorkerExitConfigDto.java | 11 ++ .../worker/entity/vo/CountByEnterpriseVo.java | 24 +++ .../entity/vo/CountNumByWorkerTypeVo.java | 30 +++ .../worker/entity/vo/WorkerExitConfigVo.java | 11 ++ ...rkerDailyAttendanceStatisticsV2Mapper.java | 13 +- .../worker/mapper/WorkerExitConfigMapper.java | 53 +++++ .../worker/mapper/xml/TeamInfoMapper.xml | 33 +++- ...orkerDailyAttendanceStatisticsV2Mapper.xml | 53 +++++ .../mapper/xml/WorkerExitConfigMapper.xml | 18 ++ .../worker/mapper/xml/WorkerInfoMapper.xml | 15 ++ .../mapper/xml/WorkerSafeEducationMapper.xml | 5 + ...kerDailyAttendanceStatisticsV2Service.java | 3 + .../service/IWorkerExitConfigService.java | 67 +++++++ ...ailyAttendanceStatisticsV2ServiceImpl.java | 52 ++++- .../impl/WorkerExitConfigServiceImpl.java | 93 +++++++++ .../单个人员考勤出入明细报表.xlsx | Bin 0 -> 9342 bytes ...勤月报-按班组-每日出入(打卡记录明细).xlsx | Bin 0 -> 12842 bytes .../考勤日报-出勤导出模版(上午下午).xlsx | Bin 11695 -> 11744 bytes 25 files changed, 918 insertions(+), 41 deletions(-) create mode 100644 src/main/java/com/zhgd/xmgl/modules/worker/controller/WorkerExitConfigController.java create mode 100644 src/main/java/com/zhgd/xmgl/modules/worker/entity/WorkerExitConfig.java create mode 100644 src/main/java/com/zhgd/xmgl/modules/worker/entity/dto/WorkerExitConfigDto.java create mode 100644 src/main/java/com/zhgd/xmgl/modules/worker/entity/vo/CountByEnterpriseVo.java create mode 100644 src/main/java/com/zhgd/xmgl/modules/worker/entity/vo/CountNumByWorkerTypeVo.java create mode 100644 src/main/java/com/zhgd/xmgl/modules/worker/entity/vo/WorkerExitConfigVo.java create mode 100644 src/main/java/com/zhgd/xmgl/modules/worker/mapper/WorkerExitConfigMapper.java create mode 100644 src/main/java/com/zhgd/xmgl/modules/worker/mapper/xml/WorkerExitConfigMapper.xml create mode 100644 src/main/java/com/zhgd/xmgl/modules/worker/service/IWorkerExitConfigService.java create mode 100644 src/main/java/com/zhgd/xmgl/modules/worker/service/impl/WorkerExitConfigServiceImpl.java create mode 100644 src/main/resources/excel/workerDailyAttendanceStatisticsV2/单个人员考勤出入明细报表.xlsx create mode 100644 src/main/resources/excel/workerDailyAttendanceStatisticsV2/考勤月报-按班组-每日出入(打卡记录明细).xlsx diff --git a/src/main/java/com/zhgd/xmgl/modules/worker/controller/TeamInfoController.java b/src/main/java/com/zhgd/xmgl/modules/worker/controller/TeamInfoController.java index a6f372298..cce2c4e09 100644 --- a/src/main/java/com/zhgd/xmgl/modules/worker/controller/TeamInfoController.java +++ b/src/main/java/com/zhgd/xmgl/modules/worker/controller/TeamInfoController.java @@ -116,10 +116,13 @@ public class TeamInfoController { @ApiOperation(value = "列表查询劳务人员班组信息", notes = "列表查询劳务人员班组信息", httpMethod = "POST") @ApiImplicitParams({ - @ApiImplicitParam(name = "enterpriseId", value = "企业ID", paramType = "body", required = true, dataType = "String"), - @ApiImplicitParam(name = "projectSn", value = "项目SN", paramType = "body", required = true, dataType = "String"), - @ApiImplicitParam(name = "userEnterpriseId", value = "用户能查看的企业", paramType = "body", required = false, dataType = "String"), - }) + @ApiImplicitParam(name = "enterpriseId", value = "企业ID", paramType = "body", required = true, dataType = "String"), + @ApiImplicitParam(name = "projectSn", value = "项目SN", paramType = "body", required = true, dataType = "String"), + @ApiImplicitParam(name = "userEnterpriseId", value = "用户能查看的企业", paramType = "body", required = false, dataType = "String"), + @ApiImplicitParam(name = "isSpecial", value = "1是特殊工种,0不是", paramType = "body", required = false, dataType = "String"), + @ApiImplicitParam(name = "workerTypeId", value = "工种id", paramType = "body", required = false, dataType = "String"), + @ApiImplicitParam(name = "containEnterpriseId", value = "包含下级的单位id", paramType = "body", required = false, dataType = "String"), + }) @PostMapping(value = "/getTeamInfoList") public Result> getTeamInfoList(@RequestBody Map map) { return Result.success(teamInfoService.getTeamInfoList(map)); diff --git a/src/main/java/com/zhgd/xmgl/modules/worker/controller/WorkerDailyAttendanceStatisticsV2Controller.java b/src/main/java/com/zhgd/xmgl/modules/worker/controller/WorkerDailyAttendanceStatisticsV2Controller.java index 246166ea1..f5c54988d 100644 --- a/src/main/java/com/zhgd/xmgl/modules/worker/controller/WorkerDailyAttendanceStatisticsV2Controller.java +++ b/src/main/java/com/zhgd/xmgl/modules/worker/controller/WorkerDailyAttendanceStatisticsV2Controller.java @@ -181,6 +181,17 @@ public class WorkerDailyAttendanceStatisticsV2Controller { }) @GetMapping(value = "/countDailyAttendanceByDateRange") public Result> countDailyAttendanceByDateRange(@ApiIgnore @RequestParam HashMap param) { + IPage p = doCountDailyAttendanceByDateRange(param); + return Result.success(p); + } + + /** + * 统计考勤列表(一段时间) + * + * @param param + * @return + */ + private IPage doCountDailyAttendanceByDateRange(HashMap param) { Date startTime = null; Date endTime = null; if (StrUtil.isNotBlank(MapUtils.getString(param, "startTime"))) { @@ -246,7 +257,7 @@ public class WorkerDailyAttendanceStatisticsV2Controller { p.setRecords(vos); p.setCurrent(workerInfoList.getCurrent()); p.setSize(workerInfoList.getSize()); - return Result.success(p); + return p; } @ApiOperation(value = "查询异常工时统计列表", notes = "查询异常工时统计列表", httpMethod = "GET") @@ -731,4 +742,173 @@ public class WorkerDailyAttendanceStatisticsV2Controller { return Result.success(workerDailyAttendanceStatisticsV2Service.countWorkerDailyAttendanceByDate(param)); } + @ApiOperation(value = "按分包单位统计人员出勤", notes = "按分包单位统计人员出勤", httpMethod = "POST") + @ApiImplicitParams({ + @ApiImplicitParam(name = "projectSn", value = "项目sn", paramType = "body", required = true, dataType = "String"), + @ApiImplicitParam(name = "startDate", value = "开始日期(yyyy-MM-dd)", paramType = "body", required = true, dataType = "String"), + @ApiImplicitParam(name = "endDate", value = "结束日期(yyyy-MM-dd)", paramType = "body", required = true, dataType = "String"), + @ApiImplicitParam(name = "parentEnterpriseId", value = "父级单位id(统计所有下级的)", paramType = "body", required = false, dataType = "String"), + @ApiImplicitParam(name = "personType", value = "人员类型 1、劳务人员 2、管理人员,3临时人员", paramType = "body", required = false, dataType = "String"), + @ApiImplicitParam(name = "isSecondLevel", value = "1是第二级", paramType = "body", required = false, dataType = "String"), + }) + @PostMapping(value = "/countNumByEnterprise") + public Result> countNumByEnterprise(@RequestBody HashMap param) { + return Result.success(workerDailyAttendanceStatisticsV2Service.countNumByEnterprise(param)); + } + + @ApiOperation(value = "按工种统计工人出勤", notes = "按工种统计工人出勤", httpMethod = "POST") + @ApiImplicitParams({ + @ApiImplicitParam(name = "projectSn", value = "项目sn", paramType = "body", required = true, dataType = "String"), + @ApiImplicitParam(name = "startDate", value = "开始日期(yyyy-MM-dd)", paramType = "body", required = true, dataType = "String"), + @ApiImplicitParam(name = "endDate", value = "结束日期(yyyy-MM-dd)", paramType = "body", required = true, dataType = "String"), + @ApiImplicitParam(name = "isSpecial", value = "1是特殊工种,0不是", paramType = "body", required = false, dataType = "String"), + }) + @PostMapping(value = "/countNumByWorkerType") + public Result> countNumByWorkerType(@RequestBody HashMap param) { + return Result.success(workerDailyAttendanceStatisticsV2Service.countNumByWorkerType(param)); + } + + @ApiOperation(value = "导出考勤月报excel记录", notes = "导出考勤月报excel记录", httpMethod = "POST") + @ApiImplicitParams({ + @ApiImplicitParam(name = "projectSn", value = "项目sn", paramType = "body", required = true, dataType = "String"), + @ApiImplicitParam(name = "startDate", value = "开始日期(yyyy-MM-dd)", paramType = "body", required = true, dataType = "String"), + @ApiImplicitParam(name = "endDate", value = "结束日期(yyyy-MM-dd)", paramType = "body", required = true, dataType = "String"), + @ApiImplicitParam(name = "groupByType", value = "1.按项目;2.按参建单位;3.按班组/部门;4.按人员", paramType = "body", required = true, dataType = "String"), + @ApiImplicitParam(name = "downloadType", value = "1上下午打卡2进出场打卡", paramType = "body", required = false, dataType = "String"), + @ApiImplicitParam(name = "effectiveHour", value = "有效工时", paramType = "body", required = false, dataType = "String"), + }) + @PostMapping(value = "/exportWorkerDailyAttendancesStaticsByMonthXls") + public void exportWorkerDailyAttendancesStaticsByMonthXls(HttpServletResponse response, @RequestBody HashMap param) { +// String templateUrl = null; +// try { +// String projectSn = MapUtils.getString(param, "projectSn"); +// String startDate = MapUtils.getString(param, "startDate"); +// String endDate = MapUtils.getString(param, "endDate"); +// Integer downloadType = MapUtils.getInteger(param, "downloadType"); +// Integer groupByType = MapUtils.getInteger(param, "groupByType"); +// List dateTimes = DateUtil.rangeToList(DateUtil.parseDate(startDate), DateUtil.parseDate(endDate), DateField.DAY_OF_YEAR); +// Map> root = new HashMap<>(); +// if (Objects.equals(groupByType, 3)) { +// //按班组/部门 +// if (Objects.equals(downloadType, 1)) { +// //考勤月报-按班组-每日出入(打卡记录明细).xlsx +// param.put("startTime", startDate); +// param.put("endTime", endDate); +// param.put("pageSize", -1); +// List voList = this.doCountDailyAttendanceByDateRange(param).getRecords(); +// Map> deptNameMap = voList.stream().collect(Collectors.groupingBy(StatisticsListVo::getDeptName)); +// Map sheetMap = new HashMap<>(); +// List> listMap = new ArrayList<>(); +// for (Map.Entry> entry : deptNameMap.entrySet()) { +// int j = 0; +// for (StatisticsListVo vo : entry.getValue()) { +// Map map = new HashMap<>(); +// map.put("firstInTimeYes", StrUtil.isNotBlank(vo.getFirstInTime()) ? "√" : "×"); +// map.put("firstInTime", vo.getFirstInTime()); +// map.put("endOutTimeYes", StrUtil.isNotBlank(vo.getEndOutTime()) ? "√" : "×"); +// map.put("endOutTime", vo.getEndOutTime()); +// map.put("firstTimeAmYes", StrUtil.isNotBlank(vo.getFirstTimeAm()) ? "√" : "×"); +// map.put("firstTimeAm", vo.getFirstTimeAm()); +// map.put("endTimePmYes", StrUtil.isNotBlank(vo.getEndTimePm()) ? "√" : "×"); +// map.put("endTimePm", vo.getEndTimePm()); +// map.put("personType", vo.getPersonType()); +// map.put("enterpriseName", vo.getEnterpriseName()); +// map.put("workerName", vo.getWorkerName()); +// map.put("deptName", vo.getDeptName()); +// map.put("projectSn", vo.getProjectSn()); +// map.put("personSn", vo.getPersonSn()); +// map.put("attendanceDate", vo.getAttendanceDate()); +// map.put("hourVal", vo.getHourVal()); +// map.put("dayVal", vo.getDayVal()); +// map.put("isAttendance", vo.getIsAttendance()); +// map.put("overtimeHourVal", vo.getOvertimeHourVal()); +// map.put("overtimeDayVal", vo.getOvertimeDayVal()); +// map.put("inserviceType", vo.getInserviceType()); +// AtomicInteger i = new AtomicInteger(1); +// map.put("attendanceList", Objects.nonNull(vo.getAttendanceList()) ? vo.getAttendanceList().stream().map(a -> { +// return i.getAndIncrement() + ".(" + (Objects.equals(a.getPassType(), 1) ? "进场" : "出场") + a.getCreateTime() + ")"; +// }).collect(Collectors.joining("\n")) : ""); +// map.put("workerTypeName", vo.getWorkerTypeName()); +// map.put("phoneNumber", vo.getPhoneNumber()); +// map.put("idCard", vo.getIdCard()); +// map.put("sex", Objects.equals(vo.getSex(), 1) ? "男" : "女"); +// map.put("enterDate", vo.getEnterDate()); +// listMap.add(map); +// } +// } +// sheetMap.put("date", DateUtil.formatDate(dateTime)); +// sheetMap.put("listMap", listMap); +// root.put(j++, sheetMap); +// } +// } +// +// param.put("pageNo", 1); +// param.put("pageSize", -1); +// int j = 0; +// String tempSheetName; +// if (Objects.equals(downloadType, 1)) { +// tempSheetName = "考勤日报-出勤导出模版(上午下午).xlsx"; +// } else { +// tempSheetName = "考勤日报-出勤导出模版(进场出场).xlsx"; +// } +// for (DateTime dateTime : dateTimes) { +// param.put("attendanceDate", DateUtil.formatDate(dateTime)); +// List records = doGetWorkerDailyAttendancePageByDateVoIPage(param).getRecords(); +// Map sheetMap = new HashMap<>(); +// List> listMap = new ArrayList<>(); +// for (WorkerDailyAttendancesByDateVo vo : records) { +// Map map = new HashMap<>(); +// map.put("firstInTimeYes", StrUtil.isNotBlank(vo.getFirstInTime()) ? "√" : "×"); +// map.put("firstInTime", vo.getFirstInTime()); +// map.put("endOutTimeYes", StrUtil.isNotBlank(vo.getEndOutTime()) ? "√" : "×"); +// map.put("endOutTime", vo.getEndOutTime()); +// map.put("firstTimeAmYes", StrUtil.isNotBlank(vo.getFirstTimeAm()) ? "√" : "×"); +// map.put("firstTimeAm", vo.getFirstTimeAm()); +// map.put("endTimePmYes", StrUtil.isNotBlank(vo.getEndTimePm()) ? "√" : "×"); +// map.put("endTimePm", vo.getEndTimePm()); +// map.put("personType", vo.getPersonType()); +// map.put("enterpriseName", vo.getEnterpriseName()); +// map.put("workerName", vo.getWorkerName()); +// map.put("deptName", vo.getDeptName()); +// map.put("projectSn", vo.getProjectSn()); +// map.put("personSn", vo.getPersonSn()); +// map.put("attendanceDate", vo.getAttendanceDate()); +// map.put("hourVal", vo.getHourVal()); +// map.put("dayVal", vo.getDayVal()); +// map.put("isAttendance", vo.getIsAttendance()); +// map.put("overtimeHourVal", vo.getOvertimeHourVal()); +// map.put("overtimeDayVal", vo.getOvertimeDayVal()); +// map.put("inserviceType", vo.getInserviceType()); +// AtomicInteger i = new AtomicInteger(1); +// map.put("attendanceList", Objects.nonNull(vo.getAttendanceList()) ? vo.getAttendanceList().stream().map(a -> { +// return i.getAndIncrement() + ".(" + (Objects.equals(a.getPassType(), 1) ? "进场" : "出场") + a.getCreateTime() + ")"; +// }).collect(Collectors.joining("\n")) : ""); +// map.put("workerTypeName", vo.getWorkerTypeName()); +// map.put("phoneNumber", vo.getPhoneNumber()); +// map.put("idCard", vo.getIdCard()); +// map.put("sex", Objects.equals(vo.getSex(), 1) ? "男" : "女"); +// map.put("enterDate", vo.getEnterDate()); +// listMap.add(map); +// } +// sheetMap.put("date", DateUtil.formatDate(dateTime)); +// sheetMap.put("listMap", listMap); +// root.put(j++, sheetMap); +// } +// templateUrl = Fileutils.getExportTemplateFile("excel/" + tempSheetName).getAbsolutePath(); +// String outputTemplateFilePath = PathUtil.getBasePath() + "/temp/" + IdUtil.randomUUID() + ".xlsx"; +// EasyPoiUtil.cloneSheetMultipleTimes(templateUrl, outputTemplateFilePath, "1", dateTimes.size() - 1); +// TemplateExportParams params = new TemplateExportParams(outputTemplateFilePath, true); +// params.setSheetName(dateTimes.stream().map(DateUtil::formatDate).collect(Collectors.toList()).toArray(new String[]{})); +// Workbook workbook = ExcelExportUtil.exportExcel(root, params); +// //设置下拉 +// ExcelUtils.downLoadExcel(tempSheetName, response, workbook); +// } catch (IOException e) { +// log.error("", e); +// throw new OpenAlertException("系统错误"); +// } finally { +// if (templateUrl != null) { +// FileUtil.deleteFile(templateUrl); +// } +// } + } } diff --git a/src/main/java/com/zhgd/xmgl/modules/worker/controller/WorkerExitConfigController.java b/src/main/java/com/zhgd/xmgl/modules/worker/controller/WorkerExitConfigController.java new file mode 100644 index 000000000..66b3d4fd1 --- /dev/null +++ b/src/main/java/com/zhgd/xmgl/modules/worker/controller/WorkerExitConfigController.java @@ -0,0 +1,141 @@ +package com.zhgd.xmgl.modules.worker.controller; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.zhgd.annotation.OperLog; +import com.zhgd.jeecg.common.api.vo.Result; +import com.zhgd.xmgl.modules.worker.entity.WorkerExitConfig; +import com.zhgd.xmgl.modules.worker.entity.dto.WorkerExitConfigDto; +import com.zhgd.xmgl.modules.worker.entity.vo.WorkerExitConfigVo; +import com.zhgd.xmgl.modules.worker.service.IWorkerExitConfigService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiImplicitParam; +import io.swagger.annotations.ApiImplicitParams; +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.collections.MapUtils; +import org.simpleframework.xml.core.Validate; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Lazy; +import org.springframework.web.bind.annotation.*; +import springfox.documentation.annotations.ApiIgnore; + +import java.util.HashMap; +import java.util.List; + + +/** + * @Title: Controller + * @Description: 人员退场配置 + * @author: pds + * @date: 2025-08-20 + * @version: V1.0 + */ +@RestController +@RequestMapping("/xmgl/workerExitConfig") +@Slf4j +@Api(tags = "人员退场配置相关Api") +public class WorkerExitConfigController { + @Lazy + @Autowired + private IWorkerExitConfigService workerExitConfigService; + + /** + * 分页列表查询 + * + * @return + */ + @OperLog(operModul = "人员退场配置管理", operType = "分页查询", operDesc = "分页列表查询人员退场配置信息") + @ApiOperation(value = "分页列表查询人员退场配置信息", notes = "分页列表查询人员退场配置信息", httpMethod = "GET") + @ApiImplicitParams({ + @ApiImplicitParam(name = "pageNo", value = "第几页", paramType = "query", required = true, dataType = "Integer"), + @ApiImplicitParam(name = "pageSize", value = "每页显示条数", paramType = "query", required = true, dataType = "Integer"), + }) + @GetMapping(value = "/page") + public Result> queryPageList(@ApiIgnore @RequestParam HashMap param) { + return Result.success(workerExitConfigService.queryPageList(param)); + } + + /** + * 列表查询 + * + * @return + */ + @OperLog(operModul = "人员退场配置管理", operType = "列表查询", operDesc = "列表查询人员退场配置信息") + @ApiOperation(value = "列表查询人员退场配置信息", notes = "列表查询人员退场配置信息", httpMethod = "GET") + @GetMapping(value = "/list") + public Result> queryList(@ApiIgnore @RequestParam HashMap param) { + return Result.success(workerExitConfigService.queryList(param)); + } + + /** + * 添加 + * + * @param workerExitConfigDto + * @return + */ + @OperLog(operModul = "人员退场配置管理", operType = "添加", operDesc = "添加人员退场配置信息") + @ApiOperation(value = "添加人员退场配置信息", notes = "添加人员退场配置信息", httpMethod = "POST") + @PostMapping(value = "/add") + public Result add(@RequestBody @Validate WorkerExitConfigDto workerExitConfigDto) { + workerExitConfigService.add(workerExitConfigDto); + return Result.ok(); + } + + /** + * 编辑 + * + * @param workerExitConfigDto + * @return + */ + @OperLog(operModul = "人员退场配置管理", operType = "编辑", operDesc = "编辑人员退场配置信息") + @ApiOperation(value = "编辑人员退场配置信息", notes = "编辑人员退场配置信息", httpMethod = "POST") + @PostMapping(value = "/edit") + public Result edit(@RequestBody WorkerExitConfigDto workerExitConfigDto) { + workerExitConfigService.edit(workerExitConfigDto); + return Result.ok(); + } + + /** + * 通过id删除 + * + * @return + */ + @OperLog(operModul = "人员退场配置管理", operType = "删除", operDesc = "删除人员退场配置信息") + @ApiOperation(value = "删除人员退场配置信息", notes = "删除人员退场配置信息", httpMethod = "POST") + @ApiImplicitParam(name = "id", value = "人员退场配置ID", paramType = "body", required = true, dataType = "String", example = "{\"id\":\"1\"}") + @PostMapping(value = "/delete") + public Result delete(@ApiIgnore @RequestBody HashMap map) { + workerExitConfigService.delete(MapUtils.getString(map, "id")); + return Result.ok(); + } + + /** + * 通过id查询 + * + * @param id + * @return + */ + @OperLog(operModul = "人员退场配置管理", operType = "通过id查询", operDesc = "通过id查询人员退场配置信息") + @ApiOperation(value = "通过id查询人员退场配置信息", notes = "通过id查询人员退场配置信息", httpMethod = "GET") + @ApiImplicitParam(name = "id", value = "人员退场配置ID", paramType = "query", required = true, dataType = "Integer") + @GetMapping(value = "/queryById") + public Result queryById(@RequestParam(name = "id", required = true) String id) { + return Result.success(workerExitConfigService.queryById(id)); + } + + @OperLog(operModul = "人员退场配置管理", operType = "", operDesc = "保存人员退场配置信息") + @ApiOperation(value = "保存人员退场配置信息", notes = "保存人员退场配置信息", httpMethod = "POST") + @PostMapping(value = "/save") + public Result saveConfig(@RequestBody @Validate WorkerExitConfigDto workerExitConfigDto) { + WorkerExitConfig db = workerExitConfigService.getOne(new LambdaQueryWrapper() + .eq(WorkerExitConfig::getProjectSn, workerExitConfigDto.getProjectSn())); + if (db == null) { + workerExitConfigService.add(workerExitConfigDto); + } else { + workerExitConfigDto.setId(db.getId()); + workerExitConfigService.updateById(workerExitConfigDto); + } + return Result.ok(); + } +} diff --git a/src/main/java/com/zhgd/xmgl/modules/worker/controller/WorkerInfoController.java b/src/main/java/com/zhgd/xmgl/modules/worker/controller/WorkerInfoController.java index 9ceca139b..bd0506ef5 100644 --- a/src/main/java/com/zhgd/xmgl/modules/worker/controller/WorkerInfoController.java +++ b/src/main/java/com/zhgd/xmgl/modules/worker/controller/WorkerInfoController.java @@ -198,6 +198,7 @@ public class WorkerInfoController { @ApiImplicitParam(name = "workerTypeId", value = "工种id", paramType = "body", required = false, dataType = "String"), @ApiImplicitParam(name = "exitDate_begin", value = "进场日期开始yyyy-MM-dd", paramType = "body", required = false, dataType = "String"), @ApiImplicitParam(name = "exitDate_end", value = "进场日期结束yyyy-MM-dd", paramType = "body", required = false, dataType = "String"), + @ApiImplicitParam(name = "containEnterpriseId", value = "包含下级的单位的人员的单位id", paramType = "body", required = false, dataType = "String"), }) @PostMapping(value = "/selectWorkerInfoList") public Result> selectWorkerInfoList(@RequestBody Map map) { @@ -210,6 +211,7 @@ public class WorkerInfoController { @ApiImplicitParam(name = "projectSn", value = "项目SN", paramType = "body", required = true, dataType = "String"), @ApiImplicitParam(name = "projectSnList", value = "项目SN列表", paramType = "body", required = false, dataType = "String"), @ApiImplicitParam(name = "userEnterpriseId", value = "用户能查看的企业", paramType = "body", required = false, dataType = "String"), + @ApiImplicitParam(name = "containEnterpriseId", value = "包含下级的单位的人员的单位id", paramType = "body", required = false, dataType = "String"), }) @PostMapping("/selectPersonTypeAndEduStatistics") public Result selectPersonTypeAndEduStatistics(@RequestBody Map map) { diff --git a/src/main/java/com/zhgd/xmgl/modules/worker/controller/WorkerTypeController.java b/src/main/java/com/zhgd/xmgl/modules/worker/controller/WorkerTypeController.java index 7d9e2c2d2..9a403da51 100644 --- a/src/main/java/com/zhgd/xmgl/modules/worker/controller/WorkerTypeController.java +++ b/src/main/java/com/zhgd/xmgl/modules/worker/controller/WorkerTypeController.java @@ -19,9 +19,10 @@ import org.springframework.web.bind.annotation.RestController; import java.util.List; import java.util.Map; +import java.util.Objects; - /** +/** * @Title: Controller * @Description: 工种 * @author: pds @@ -43,13 +44,18 @@ public class WorkerTypeController { @ApiOperation(value = "列表查询工种信息", notes = "列表查询工种信息", httpMethod = "POST") @ApiImplicitParams({ @ApiImplicitParam(name = "projectSn", value = "一级公司sn", paramType = "body", required = true, dataType = "String"), + @ApiImplicitParam(name = "isSpecial", value = "1是特殊工种,0不是", paramType = "body", required = false, dataType = "String"), }) @PostMapping(value = "/list") public Result> queryPageList(@RequestBody Map map) { Result> result = new Result>(); QueryWrapper queryWrapper = new QueryWrapper<>(); - queryWrapper.lambda().eq(WorkerType::getProjectSn, MapUtils.getString(map,"projectSn")); - List pageList = workerTypeService.list(queryWrapper); + queryWrapper.lambda().eq(WorkerType::getProjectSn, MapUtils.getString(map, "projectSn")); + Integer isSpecial = MapUtils.getInteger(map, "isSpecial"); + if (Objects.nonNull(isSpecial)) { + queryWrapper.lambda().eq(WorkerType::getIsSpecial, isSpecial); + } + List pageList = workerTypeService.list(queryWrapper); result.setSuccess(true); result.setResult(pageList); return result; diff --git a/src/main/java/com/zhgd/xmgl/modules/worker/entity/WorkerExitConfig.java b/src/main/java/com/zhgd/xmgl/modules/worker/entity/WorkerExitConfig.java new file mode 100644 index 000000000..c8f7b55f6 --- /dev/null +++ b/src/main/java/com/zhgd/xmgl/modules/worker/entity/WorkerExitConfig.java @@ -0,0 +1,88 @@ +package com.zhgd.xmgl.modules.worker.entity; + +import java.io.Serializable; +import java.util.Date; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import com.fasterxml.jackson.annotation.JsonFormat; +import org.springframework.format.annotation.DateTimeFormat; +import org.jeecgframework.poi.excel.annotation.Excel; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; + +/** + * @Description: 人员退场配置 + * @author: pds + * @date: 2025-08-20 + * @version: V1.0 + */ +@Data +@TableName("worker_exit_config") +@ApiModel(value = "WorkerExitConfig实体类", description = "WorkerExitConfig") +public class WorkerExitConfig implements Serializable { + private static final long serialVersionUID = 1L; + + /** + * 主键id + */ + @TableId(type = IdType.ASSIGN_ID) + @ApiModelProperty(value = "主键id") + private java.lang.Long id; + /** + * 是否开启退成配置 + */ + @ApiModelProperty(value = "是否开启退成配置") + private java.lang.Integer enable; + /** + * 企业ids(多个,分割) + */ + @ApiModelProperty(value = "企业ids(多个,分割)") + private java.lang.String enterpriseIds; + /** + * 班组ids(多个,分割) + */ + @ApiModelProperty(value = "班组ids(多个,分割)") + private java.lang.String teamIds; + /** + * 部门ids(多个,分割) + */ + @ApiModelProperty(value = "部门ids(多个,分割)") + private java.lang.String departmentIds; + /** + * 人员ids(多个,分割) + */ + @ApiModelProperty(value = "人员ids(多个,分割)") + private java.lang.String workerIds; + /** + * 人员未打卡超过n天系统自动将人员退场 + */ + @ApiModelProperty(value = "人员未打卡超过n天系统自动将人员退场") + private java.lang.Integer exitIfAbsenceDay; + /** + * 是否将此处退场人员拉入黑名库1是0否 + */ + @ApiModelProperty(value = "是否将此处退场人员拉入黑名库1是0否") + private java.lang.Integer enableBlack; + /** + * 创建时间 + */ + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @ApiModelProperty(value = "创建时间") + private java.util.Date createTime; + /** + * 更新时间 + */ + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @ApiModelProperty(value = "更新时间") + private java.util.Date updateTime; + /** + * 所属项目SN + */ + @ApiModelProperty(value = "所属项目SN") + private java.lang.String projectSn; +} diff --git a/src/main/java/com/zhgd/xmgl/modules/worker/entity/WorkerType.java b/src/main/java/com/zhgd/xmgl/modules/worker/entity/WorkerType.java index ef5c1ed78..8700ed513 100644 --- a/src/main/java/com/zhgd/xmgl/modules/worker/entity/WorkerType.java +++ b/src/main/java/com/zhgd/xmgl/modules/worker/entity/WorkerType.java @@ -1,16 +1,14 @@ package com.zhgd.xmgl.modules.worker.entity; -import java.io.Serializable; - import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; -import com.fasterxml.jackson.databind.annotation.JsonSerialize; -import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; -import lombok.Data; -import org.jeecgframework.poi.excel.annotation.Excel; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import org.jeecgframework.poi.excel.annotation.Excel; + +import java.io.Serializable; /** * @Description: 工种 * @author: pds @@ -22,17 +20,27 @@ import io.swagger.annotations.ApiModelProperty; @ApiModel(value="WorkerType实体类",description="WorkerType") public class WorkerType implements Serializable { private static final long serialVersionUID = 1L; - + /**工种信息表*/ @TableId(type = IdType.ASSIGN_ID) - @ApiModelProperty(value="工种信息表") - private java.lang.Long id ; - /**工种名称*/ - @Excel(name = "工种名称", width = 15) - @ApiModelProperty(value="工种名称") - private java.lang.String typeName ; - /**项目SN*/ - @Excel(name = "项目SN", width = 15) - @ApiModelProperty(value="项目SN") - private java.lang.String projectSn ; + @ApiModelProperty(value = "工种信息表") + private java.lang.Long id; + /** + * 工种名称 + */ + @Excel(name = "工种名称", width = 15) + @ApiModelProperty(value = "工种名称") + private java.lang.String typeName; + /** + * 项目SN + */ + @Excel(name = "项目SN", width = 15) + @ApiModelProperty(value = "项目SN") + private java.lang.String projectSn; + /** + * 1是特殊工种,0不是 + */ + @Excel(name = "1是特殊工种,0不是", width = 15) + @ApiModelProperty(value = "1是特殊工种,0不是") + private java.lang.Integer isSpecial; } diff --git a/src/main/java/com/zhgd/xmgl/modules/worker/entity/dto/WorkerExitConfigDto.java b/src/main/java/com/zhgd/xmgl/modules/worker/entity/dto/WorkerExitConfigDto.java new file mode 100644 index 000000000..876981081 --- /dev/null +++ b/src/main/java/com/zhgd/xmgl/modules/worker/entity/dto/WorkerExitConfigDto.java @@ -0,0 +1,11 @@ +package com.zhgd.xmgl.modules.worker.entity.dto; + +import com.zhgd.xmgl.modules.worker.entity.WorkerExitConfig; +import io.swagger.annotations.ApiModel; +import lombok.Data; + +@Data +@ApiModel(value = "WorkerExitConfigDto实体类", description = "WorkerExitConfigDto实体类") +public class WorkerExitConfigDto extends WorkerExitConfig { + +} diff --git a/src/main/java/com/zhgd/xmgl/modules/worker/entity/vo/CountByEnterpriseVo.java b/src/main/java/com/zhgd/xmgl/modules/worker/entity/vo/CountByEnterpriseVo.java new file mode 100644 index 000000000..2ecf12d9a --- /dev/null +++ b/src/main/java/com/zhgd/xmgl/modules/worker/entity/vo/CountByEnterpriseVo.java @@ -0,0 +1,24 @@ +package com.zhgd.xmgl.modules.worker.entity.vo; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +@Data +public class CountByEnterpriseVo { + /** + * 单位名称 + */ + @ApiModelProperty("单位名称") + private String enterpriseName; + /** + * 所属企业表外键ID + */ + @ApiModelProperty(value = "所属企业表外键ID") + private Long enterpriseId; + /** + * 人员出勤数量 + */ + @ApiModelProperty("人员出勤数量") + private Integer workerCount; + private String ancestors; +} diff --git a/src/main/java/com/zhgd/xmgl/modules/worker/entity/vo/CountNumByWorkerTypeVo.java b/src/main/java/com/zhgd/xmgl/modules/worker/entity/vo/CountNumByWorkerTypeVo.java new file mode 100644 index 000000000..4c3b61572 --- /dev/null +++ b/src/main/java/com/zhgd/xmgl/modules/worker/entity/vo/CountNumByWorkerTypeVo.java @@ -0,0 +1,30 @@ +package com.zhgd.xmgl.modules.worker.entity.vo; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.math.BigDecimal; + +@Data +public class CountNumByWorkerTypeVo { + /** + * 在职人数 + */ + @ApiModelProperty("在职人数") + private Integer inServe; + /** + * 出勤人数 + */ + @ApiModelProperty("出勤人数") + private Integer attendance; + /** + * 出勤率 + */ + @ApiModelProperty("出勤率") + private BigDecimal attendanceRate; + /** + * 工种名称 + */ + @ApiModelProperty("工种名称") + private String typeName; +} diff --git a/src/main/java/com/zhgd/xmgl/modules/worker/entity/vo/WorkerExitConfigVo.java b/src/main/java/com/zhgd/xmgl/modules/worker/entity/vo/WorkerExitConfigVo.java new file mode 100644 index 000000000..aa1c9f77d --- /dev/null +++ b/src/main/java/com/zhgd/xmgl/modules/worker/entity/vo/WorkerExitConfigVo.java @@ -0,0 +1,11 @@ +package com.zhgd.xmgl.modules.worker.entity.vo; + +import com.zhgd.xmgl.modules.worker.entity.WorkerExitConfig; +import io.swagger.annotations.ApiModel; +import lombok.Data; + +@Data +@ApiModel(value = "WorkerExitConfigVo实体类", description = "WorkerExitConfigVo实体类") +public class WorkerExitConfigVo extends WorkerExitConfig { + +} diff --git a/src/main/java/com/zhgd/xmgl/modules/worker/mapper/WorkerDailyAttendanceStatisticsV2Mapper.java b/src/main/java/com/zhgd/xmgl/modules/worker/mapper/WorkerDailyAttendanceStatisticsV2Mapper.java index 70bee5431..5e63ef9a7 100644 --- a/src/main/java/com/zhgd/xmgl/modules/worker/mapper/WorkerDailyAttendanceStatisticsV2Mapper.java +++ b/src/main/java/com/zhgd/xmgl/modules/worker/mapper/WorkerDailyAttendanceStatisticsV2Mapper.java @@ -7,9 +7,7 @@ import com.baomidou.mybatisplus.core.toolkit.Constants; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.zhgd.xmgl.modules.worker.entity.WorkerDailyAttendanceStatisticsV2; import com.zhgd.xmgl.modules.worker.entity.bo.CountWorkerDailyAttendanceStatisticsV2ByDateBo; -import com.zhgd.xmgl.modules.worker.entity.vo.CountWorkerDailyAttendanceByDateVo; -import com.zhgd.xmgl.modules.worker.entity.vo.CountWorkerDailyAttendanceStatisticsV2Vo; -import com.zhgd.xmgl.modules.worker.entity.vo.WorkerDailyAttendanceStatisticsV2Vo; +import com.zhgd.xmgl.modules.worker.entity.vo.*; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -72,4 +70,13 @@ public interface WorkerDailyAttendanceStatisticsV2Mapper extends BaseMapper countWorkerDailyAttendanceByDate(HashMap param); + /** + * 统计每个企业的出勤人员数量 + * + * @param param + * @return + */ + List countNumByEnterprise(HashMap param); + + List countNumByWorkerType(HashMap param); } diff --git a/src/main/java/com/zhgd/xmgl/modules/worker/mapper/WorkerExitConfigMapper.java b/src/main/java/com/zhgd/xmgl/modules/worker/mapper/WorkerExitConfigMapper.java new file mode 100644 index 000000000..c654768e9 --- /dev/null +++ b/src/main/java/com/zhgd/xmgl/modules/worker/mapper/WorkerExitConfigMapper.java @@ -0,0 +1,53 @@ +package com.zhgd.xmgl.modules.worker.mapper; + +import java.util.List; +import java.util.HashMap; + +import com.zhgd.xmgl.modules.worker.entity.WorkerExitConfig; +import com.zhgd.xmgl.modules.worker.entity.vo.WorkerExitConfigVo; +import com.zhgd.xmgl.modules.worker.entity.dto.WorkerExitConfigDto; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.core.toolkit.Constants; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + * @Description: 人员退场配置 + * @author: pds + * @date: 2025-08-20 + * @version: V1.0 + */ +@Mapper +public interface WorkerExitConfigMapper extends BaseMapper { + + /** + * 分页列表查询人员退场配置信息 + * + * @param page + * @param queryWrapper + * @param param + * @return + */ + IPage queryList(Page page, @Param(Constants.WRAPPER) QueryWrapper queryWrapper, @Param("param") HashMap param); + + /** + * 列表查询人员退场配置信息 + * + * @param queryWrapper + * @param param + * @return + */ + List queryList(@Param(Constants.WRAPPER) QueryWrapper queryWrapper, @Param("param") HashMap param); + + + /** + * 通过id查询人员退场配置信息 + * + * @param id + * @return + */ + WorkerExitConfigVo queryById(String id); +} diff --git a/src/main/java/com/zhgd/xmgl/modules/worker/mapper/xml/TeamInfoMapper.xml b/src/main/java/com/zhgd/xmgl/modules/worker/mapper/xml/TeamInfoMapper.xml index 6b075f905..cc0699646 100644 --- a/src/main/java/com/zhgd/xmgl/modules/worker/mapper/xml/TeamInfoMapper.xml +++ b/src/main/java/com/zhgd/xmgl/modules/worker/mapper/xml/TeamInfoMapper.xml @@ -5,15 +5,36 @@ + + + + diff --git a/src/main/java/com/zhgd/xmgl/modules/worker/mapper/xml/WorkerExitConfigMapper.xml b/src/main/java/com/zhgd/xmgl/modules/worker/mapper/xml/WorkerExitConfigMapper.xml new file mode 100644 index 000000000..98d67da48 --- /dev/null +++ b/src/main/java/com/zhgd/xmgl/modules/worker/mapper/xml/WorkerExitConfigMapper.xml @@ -0,0 +1,18 @@ + + + + + + diff --git a/src/main/java/com/zhgd/xmgl/modules/worker/mapper/xml/WorkerInfoMapper.xml b/src/main/java/com/zhgd/xmgl/modules/worker/mapper/xml/WorkerInfoMapper.xml index 4e9fbccc0..b2529f82f 100644 --- a/src/main/java/com/zhgd/xmgl/modules/worker/mapper/xml/WorkerInfoMapper.xml +++ b/src/main/java/com/zhgd/xmgl/modules/worker/mapper/xml/WorkerInfoMapper.xml @@ -511,6 +511,11 @@ AND (w1.enterprise_id = #{supplierEnterpriseId} OR w1.enterprise_id IN ( SELECT t.enterprise_id FROM project_enterprise t WHERE find_in_set(#{projectEnterpriseId}, ancestors) )) + + and (w1.enterprise_id = #{containEnterpriseId} OR w1.enterprise_id IN ( SELECT t.enterprise_id FROM + project_enterprise t WHERE find_in_set((select id from project_enterprise where enterprise_id = + #{containEnterpriseId} and project_sn = #{projectSn}), ancestors))) + @@ -1157,6 +1167,11 @@ and FIND_IN_SET(w1.enterprise_id, #{userEnterpriseId}) + + and (w1.enterprise_id = #{containEnterpriseId} OR w1.enterprise_id IN ( SELECT t.enterprise_id FROM + project_enterprise t WHERE find_in_set((select id from project_enterprise where enterprise_id = + #{containEnterpriseId} and project_sn = #{projectSn}), ancestors))) + ) tp diff --git a/src/main/java/com/zhgd/xmgl/modules/worker/mapper/xml/WorkerSafeEducationMapper.xml b/src/main/java/com/zhgd/xmgl/modules/worker/mapper/xml/WorkerSafeEducationMapper.xml index 1b269879c..a22f01d1e 100644 --- a/src/main/java/com/zhgd/xmgl/modules/worker/mapper/xml/WorkerSafeEducationMapper.xml +++ b/src/main/java/com/zhgd/xmgl/modules/worker/mapper/xml/WorkerSafeEducationMapper.xml @@ -181,6 +181,11 @@ and FIND_IN_SET(w3.enterprise_id, #{userEnterpriseId}) + + and (w3.enterprise_id = #{containEnterpriseId} OR w3.enterprise_id IN ( SELECT t.enterprise_id FROM + project_enterprise t WHERE find_in_set((select id from project_enterprise where enterprise_id = + #{containEnterpriseId} and project_sn = #{projectSn}), ancestors))) + diff --git a/src/main/java/com/zhgd/xmgl/modules/worker/service/IWorkerDailyAttendanceStatisticsV2Service.java b/src/main/java/com/zhgd/xmgl/modules/worker/service/IWorkerDailyAttendanceStatisticsV2Service.java index 68fe502b8..6cb12645a 100644 --- a/src/main/java/com/zhgd/xmgl/modules/worker/service/IWorkerDailyAttendanceStatisticsV2Service.java +++ b/src/main/java/com/zhgd/xmgl/modules/worker/service/IWorkerDailyAttendanceStatisticsV2Service.java @@ -98,4 +98,7 @@ public interface IWorkerDailyAttendanceStatisticsV2Service extends IService countWorkerDailyAttendanceByDate(HashMap param); + List countNumByEnterprise(HashMap param); + + List countNumByWorkerType(HashMap param); } diff --git a/src/main/java/com/zhgd/xmgl/modules/worker/service/IWorkerExitConfigService.java b/src/main/java/com/zhgd/xmgl/modules/worker/service/IWorkerExitConfigService.java new file mode 100644 index 000000000..dec606282 --- /dev/null +++ b/src/main/java/com/zhgd/xmgl/modules/worker/service/IWorkerExitConfigService.java @@ -0,0 +1,67 @@ +package com.zhgd.xmgl.modules.worker.service; + +import com.zhgd.xmgl.modules.worker.entity.WorkerExitConfig; +import com.zhgd.xmgl.modules.worker.entity.vo.WorkerExitConfigVo; +import com.zhgd.xmgl.modules.worker.entity.dto.WorkerExitConfigDto; +import com.baomidou.mybatisplus.extension.service.IService; +import com.baomidou.mybatisplus.core.metadata.IPage; + +import java.util.HashMap; +import java.util.List; + +/** + * @Description: 人员退场配置 + * @author: pds + * @date: 2025-08-20 + * @version: V1.0 + */ +public interface IWorkerExitConfigService extends IService { + /** + * 分页列表查询人员退场配置信息 + * + * @param param 参数map + * @return + */ + IPage queryPageList(HashMap param); + + /** + * 列表查询人员退场配置信息 + * + * @param param 参数map + * @return + */ + List queryList(HashMap param); + + /** + * 添加人员退场配置信息 + * + * @param workerExitConfigDto 人员退场配置 + * @return + */ + void add(WorkerExitConfigDto workerExitConfigDto); + + /** + * 编辑人员退场配置信息 + * + * @param workerExitConfigDto 人员退场配置 + * @return + */ + void edit(WorkerExitConfigDto workerExitConfigDto); + + /** + * 根据id删除人员退场配置信息 + * + * @param id 人员退场配置的id + * @return + */ + void delete(String id); + + /** + * 根据id查询人员退场配置信息 + * + * @param id 人员退场配置的id + * @return + */ + WorkerExitConfigVo queryById(String id); + +} diff --git a/src/main/java/com/zhgd/xmgl/modules/worker/service/impl/WorkerDailyAttendanceStatisticsV2ServiceImpl.java b/src/main/java/com/zhgd/xmgl/modules/worker/service/impl/WorkerDailyAttendanceStatisticsV2ServiceImpl.java index adf9ff640..4d7f22df1 100644 --- a/src/main/java/com/zhgd/xmgl/modules/worker/service/impl/WorkerDailyAttendanceStatisticsV2ServiceImpl.java +++ b/src/main/java/com/zhgd/xmgl/modules/worker/service/impl/WorkerDailyAttendanceStatisticsV2ServiceImpl.java @@ -14,17 +14,14 @@ import com.zhgd.jeecg.common.execption.OpenAlertException; import com.zhgd.jeecg.common.system.query.QueryGenerator; import com.zhgd.xmgl.base.entity.vo.echarts.ChartDataVo; import com.zhgd.xmgl.base.entity.vo.echarts.SeriesItem; -import com.zhgd.xmgl.modules.worker.entity.WorkerAttendance; -import com.zhgd.xmgl.modules.worker.entity.WorkerAttendanceRuleV2; -import com.zhgd.xmgl.modules.worker.entity.WorkerDailyAttendanceStatisticsV2; -import com.zhgd.xmgl.modules.worker.entity.WorkerInfo; +import com.zhgd.xmgl.modules.project.entity.ProjectEnterprise; +import com.zhgd.xmgl.modules.project.service.IProjectEnterpriseService; +import com.zhgd.xmgl.modules.worker.entity.*; import com.zhgd.xmgl.modules.worker.entity.bo.CalAttendanceBo; import com.zhgd.xmgl.modules.worker.entity.bo.CountWorkerDailyAttendanceStatisticsV2ByDateBo; import com.zhgd.xmgl.modules.worker.entity.bo.Hour2dayJsonBo; import com.zhgd.xmgl.modules.worker.entity.dto.WorkerDailyAttendanceStatisticsV2Dto; -import com.zhgd.xmgl.modules.worker.entity.vo.CountWorkerDailyAttendanceByDateVo; -import com.zhgd.xmgl.modules.worker.entity.vo.CountWorkerDailyAttendanceStatisticsV2Vo; -import com.zhgd.xmgl.modules.worker.entity.vo.WorkerDailyAttendanceStatisticsV2Vo; +import com.zhgd.xmgl.modules.worker.entity.vo.*; import com.zhgd.xmgl.modules.worker.mapper.WorkerDailyAttendanceStatisticsV2Mapper; import com.zhgd.xmgl.modules.worker.service.IWorkerAttendanceRuleV2Service; import com.zhgd.xmgl.modules.worker.service.IWorkerAttendanceService; @@ -64,6 +61,12 @@ public class WorkerDailyAttendanceStatisticsV2ServiceImpl extends ServiceImpl countNumByEnterprise(HashMap param) { + String projectSn = MapUtils.getString(param, "projectSn"); + Long parentEnterpriseId = MapUtils.getLong(param, "parentEnterpriseId"); + Integer isSecondLevel = MapUtils.getInteger(param, "isSecondLevel"); + LambdaQueryWrapper peWrap = new LambdaQueryWrapper() + .eq(ProjectEnterprise::getProjectSn, projectSn); + List eids = projectEnterpriseService.list(peWrap).stream().filter(projectEnterprise -> { + if (Objects.nonNull(parentEnterpriseId)) { + return Objects.equals(parentEnterpriseId, projectEnterprise.getEnterpriseId()); + } + if (Objects.equals(isSecondLevel, 1)) { + return StrUtil.split(projectEnterprise.getAncestors(), ",").size() == 2; + } + return true; + }).map(ProjectEnterprise::getEnterpriseId).collect(Collectors.toList()); + eids.add(0L); + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper(); + queryWrapper.in(EnterpriseInfo::getId, eids); + List enterpriseInfos = enterpriseInfoService.list(queryWrapper); + List vos = baseMapper.countNumByEnterprise(param); + return enterpriseInfos.stream().map(ei -> { + int workerCount = vos.stream().filter(v -> Objects.nonNull(v.getAncestors()) && v.getAncestors().contains(ei.getId() + "")).mapToInt(CountByEnterpriseVo::getWorkerCount).sum(); + CountByEnterpriseVo vo = new CountByEnterpriseVo(); + vo.setEnterpriseName(ei.getEnterpriseName()); + vo.setWorkerCount(workerCount); + return vo; + }).collect(Collectors.toList()); + } + + @Override + public List countNumByWorkerType(HashMap param) { + return baseMapper.countNumByWorkerType(param); + } + } diff --git a/src/main/java/com/zhgd/xmgl/modules/worker/service/impl/WorkerExitConfigServiceImpl.java b/src/main/java/com/zhgd/xmgl/modules/worker/service/impl/WorkerExitConfigServiceImpl.java new file mode 100644 index 000000000..b79f47daf --- /dev/null +++ b/src/main/java/com/zhgd/xmgl/modules/worker/service/impl/WorkerExitConfigServiceImpl.java @@ -0,0 +1,93 @@ +package com.zhgd.xmgl.modules.worker.service.impl; + +import com.zhgd.jeecg.common.execption.OpenAlertException; +import com.zhgd.xmgl.modules.worker.entity.WorkerExitConfig; +import com.zhgd.xmgl.modules.worker.entity.vo.WorkerExitConfigVo; +import com.zhgd.xmgl.modules.worker.entity.dto.WorkerExitConfigDto; +import com.zhgd.xmgl.modules.worker.mapper.WorkerExitConfigMapper; +import com.zhgd.xmgl.modules.worker.service.IWorkerExitConfigService; +import org.springframework.stereotype.Service; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.zhgd.jeecg.common.system.query.QueryGenerator; +import com.zhgd.xmgl.util.PageUtil; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; + +import java.util.HashMap; +import java.util.List; + +import com.zhgd.xmgl.util.RefUtil; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.beans.factory.annotation.Autowired; + +/** + * @Description: 人员退场配置 + * @author: pds + * @date: 2025-08-20 + * @version: V1.0 + */ +@Service +public class WorkerExitConfigServiceImpl extends ServiceImpl implements IWorkerExitConfigService { + @Autowired + private WorkerExitConfigMapper workerExitConfigMapper; + + @Override + public IPage queryPageList(HashMap param) { + QueryWrapper queryWrapper = this.getQueryWrapper(param); + Page page = PageUtil.getPage(param); + IPage pageList = baseMapper.queryList(page, queryWrapper, param); + pageList.setRecords(this.dealList(pageList.getRecords())); + return pageList; + } + + @Override + public List queryList(HashMap param) { + QueryWrapper queryWrapper = getQueryWrapper(param); + return dealList(baseMapper.queryList(queryWrapper, param)); + } + + private QueryWrapper getQueryWrapper(HashMap param) { + QueryWrapper queryWrapper = QueryGenerator.initPageQueryWrapper(WorkerExitConfigVo.class, param, true); + queryWrapper.orderByDesc(RefUtil.fieldNameUlc(WorkerExitConfigVo::getId)); + return queryWrapper; + } + + private List dealList(List list) { + return list; + } + + @Override + public void add(WorkerExitConfigDto workerExitConfigDto) { + workerExitConfigDto.setId(null); + baseMapper.insert(workerExitConfigDto); + } + + @Override + public void edit(WorkerExitConfigDto workerExitConfigDto) { + WorkerExitConfig oldWorkerExitConfig = baseMapper.selectById(workerExitConfigDto.getId()); + if (oldWorkerExitConfig == null) { + throw new OpenAlertException("未找到对应实体"); + } + baseMapper.updateById(workerExitConfigDto); + } + + @Override + public void delete(String id) { + WorkerExitConfig workerExitConfig = baseMapper.selectById(id); + if (workerExitConfig == null) { + throw new OpenAlertException("未找到对应实体"); + } + baseMapper.deleteById(id); + } + + @Override + public WorkerExitConfigVo queryById(String id) { + WorkerExitConfigVo entity = baseMapper.queryById(id); + if (entity == null) { + throw new OpenAlertException("未找到对应实体"); + } + return entity; + } + +} diff --git a/src/main/resources/excel/workerDailyAttendanceStatisticsV2/单个人员考勤出入明细报表.xlsx b/src/main/resources/excel/workerDailyAttendanceStatisticsV2/单个人员考勤出入明细报表.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..73d137584531ca7133b77f5bd10bd06c443c98f7 GIT binary patch literal 9342 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 F{{xZ}3dR5c literal 0 HcmV?d00001 diff --git a/src/main/resources/excel/workerDailyAttendanceStatisticsV2/考勤月报-按班组-每日出入(打卡记录明细).xlsx b/src/main/resources/excel/workerDailyAttendanceStatisticsV2/考勤月报-按班组-每日出入(打卡记录明细).xlsx new file mode 100644 index 0000000000000000000000000000000000000000..68f03c877a019569ee3f3c7f78a5248e603482e5 GIT binary patch literal 12842 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/excel/考勤日报-出勤导出模版(上午下午).xlsx b/src/main/resources/excel/考勤日报-出勤导出模版(上午下午).xlsx index 0b336555666222999f4f29f07ae7d49b3ff4086c..a1c392ea364a6935765df4201092323193600e17 100644 GIT binary patch delta 6311 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 V3X~3?01$wB&c}lt#{Fmge*nvZoj(8o delta 6209 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