From 933b8012be9d457385cd272eeed4ee6ce74006d6 Mon Sep 17 00:00:00 2001 From: guoshengxiong <1923636941@qq.com> Date: Thu, 14 Aug 2025 14:45:23 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ProjectEnterpriseController.java | 1 + .../impl/ProjectEnterpriseServiceImpl.java | 6 + .../modules/quality/entity/QualityRegion.java | 4 + .../impl/QualityRegionServiceImpl.java | 5 +- .../controller/RiskListSourceController.java | 7 +- ...DailyAttendanceStatisticsV2Controller.java | 167 ++++++++++++------ .../vo/ExceptionHourStatisticsListVo.java | 25 +++ .../WorkerDailyAttendanceStatisticsV2Vo.java | 25 +++ .../vo/WorkerDailyAttendancesByDateVo.java | 9 + ...orkerDailyAttendanceStatisticsV2Mapper.xml | 5 + .../java/com/zhgd/xmgl/util/EasyPoiUtil.java | 51 ++++++ src/main/java/com/zhgd/xmgl/util/MapUtil.java | 19 +- .../application-gsx-other-env-show.properties | 2 + .../考勤日报-出勤导出模版(上午下午).xlsx | Bin 0 -> 11695 bytes .../考勤日报-出勤导出模版(进场出场).xlsx | Bin 0 -> 13049 bytes 15 files changed, 258 insertions(+), 68 deletions(-) create mode 100644 src/main/resources/excel/考勤日报-出勤导出模版(上午下午).xlsx create mode 100644 src/main/resources/excel/考勤日报-出勤导出模版(进场出场).xlsx diff --git a/src/main/java/com/zhgd/xmgl/modules/project/controller/ProjectEnterpriseController.java b/src/main/java/com/zhgd/xmgl/modules/project/controller/ProjectEnterpriseController.java index 87ceb2ac2..7767ca96b 100644 --- a/src/main/java/com/zhgd/xmgl/modules/project/controller/ProjectEnterpriseController.java +++ b/src/main/java/com/zhgd/xmgl/modules/project/controller/ProjectEnterpriseController.java @@ -60,6 +60,7 @@ public class ProjectEnterpriseController { @ApiImplicitParam(name = "pageSize", value = "每页显示条数", paramType = "body", required = true, dataType = "Integer"), @ApiImplicitParam(name = "cbsProjectType", value = "项目类型(字典)", paramType = "body", required = true, dataType = "Integer"), @ApiImplicitParam(name = "isCountMainEnterprise", value = "1是总包", paramType = "body", required = false, dataType = "String"), + @ApiImplicitParam(name = "enterpriseIds", value = "单位idList", paramType = "body", required = false, dataType = "String"), }) @PostMapping(value = "/list") public Result> queryPageList(@RequestBody Map map) { diff --git a/src/main/java/com/zhgd/xmgl/modules/project/service/impl/ProjectEnterpriseServiceImpl.java b/src/main/java/com/zhgd/xmgl/modules/project/service/impl/ProjectEnterpriseServiceImpl.java index e27b3fe77..13aede1e7 100644 --- a/src/main/java/com/zhgd/xmgl/modules/project/service/impl/ProjectEnterpriseServiceImpl.java +++ b/src/main/java/com/zhgd/xmgl/modules/project/service/impl/ProjectEnterpriseServiceImpl.java @@ -21,6 +21,7 @@ import com.zhgd.xmgl.modules.worker.mapper.UserEnterpriseMapper; import com.zhgd.xmgl.modules.xz.entity.XzProjectOrg; import com.zhgd.xmgl.security.entity.UserInfo; import com.zhgd.xmgl.security.util.SecurityUtils; +import com.zhgd.xmgl.util.MapUtil; import com.zhgd.xmgl.util.MessageUtil; import org.apache.commons.collections.MapUtils; import org.apache.commons.lang3.StringUtils; @@ -67,6 +68,11 @@ public class ProjectEnterpriseServiceImpl extends ServiceImpl enterpriseIds = Stream.of(StringUtils.split(userEnterprise.getEnterpriseId(), ",")).collect(Collectors.toList()); + List queryEnterpriseIds = MapUtil.getList(map, "enterpriseIds", String.class); + if (CollUtil.isNotEmpty(queryEnterpriseIds)) { + enterpriseIds = enterpriseIds.stream().filter(queryEnterpriseIds::contains).collect(Collectors.toList()); + } + enterpriseIds.add("0"); map.put("enterpriseIds", enterpriseIds); } List list = projectEnterpriseMapper.selectProjectEnterprisePage(page, map); diff --git a/src/main/java/com/zhgd/xmgl/modules/quality/entity/QualityRegion.java b/src/main/java/com/zhgd/xmgl/modules/quality/entity/QualityRegion.java index 7993ec5f4..5aa9677cc 100644 --- a/src/main/java/com/zhgd/xmgl/modules/quality/entity/QualityRegion.java +++ b/src/main/java/com/zhgd/xmgl/modules/quality/entity/QualityRegion.java @@ -122,11 +122,15 @@ public class QualityRegion implements Serializable { private List children; @TableField(exist = false) + @ApiModelProperty(value = "最外面的设置的责任单位") private List enterpriseInfos; @TableField(exist = false) + @ApiModelProperty(value = "最外面的设置的责任人") private List systemUsers; + @TableField(exist = false) + @ApiModelProperty(value = "最外面的设置的AI设备") private List aiAnalyseHardWareRecords; @TableField(exist = false) diff --git a/src/main/java/com/zhgd/xmgl/modules/quality/service/impl/QualityRegionServiceImpl.java b/src/main/java/com/zhgd/xmgl/modules/quality/service/impl/QualityRegionServiceImpl.java index e1bdd27b9..83dbe163d 100644 --- a/src/main/java/com/zhgd/xmgl/modules/quality/service/impl/QualityRegionServiceImpl.java +++ b/src/main/java/com/zhgd/xmgl/modules/quality/service/impl/QualityRegionServiceImpl.java @@ -454,11 +454,10 @@ public class QualityRegionServiceImpl extends ServiceImpl list = this.treeList(paramMap); - List vos = BeanUtil.copyToList(ListUtils.listToTree(JSONArray.parseArray(JSON.toJSONString(list)), "id", "parentRegion", "children"), QualityRegionVo.class); IPage p = new Page<>(); int i = cn.hutool.core.util.PageUtil.getStart(pageNo - 1, pageSize); - p.setTotal(vos.size()); - p.setRecords(CollUtil.sub(vos, i, i + pageSize)); + p.setTotal(list.size()); + p.setRecords(CollUtil.sub(list, i, i + pageSize)); p.setCurrent(pageNo); p.setSize(pageSize); return p; diff --git a/src/main/java/com/zhgd/xmgl/modules/risk/controller/RiskListSourceController.java b/src/main/java/com/zhgd/xmgl/modules/risk/controller/RiskListSourceController.java index da680ca76..582998e55 100644 --- a/src/main/java/com/zhgd/xmgl/modules/risk/controller/RiskListSourceController.java +++ b/src/main/java/com/zhgd/xmgl/modules/risk/controller/RiskListSourceController.java @@ -43,6 +43,7 @@ import org.apache.poi.util.IOUtils; import org.simpleframework.xml.core.Validate; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Lazy; import org.springframework.transaction.annotation.Transactional; import org.springframework.web.bind.annotation.*; @@ -92,6 +93,8 @@ public class RiskListSourceController { @Lazy @Autowired private IRiskListSourceResponsibilityRegionService riskListSourceResponsibilityRegionService; + @Value("${riskListSourceRegionQrCode:}") + private String riskListSourceRegionQrCode; /** * 分页列表查询 @@ -270,7 +273,6 @@ public class RiskListSourceController { @ApiImplicitParams({ @ApiImplicitParam(name = "projectSn", value = "项目sn", paramType = "body", required = false, dataType = "Integer"), @ApiImplicitParam(name = "regionIds", value = "区域ids(多个,分割)", paramType = "body", required = false, dataType = "Integer"), - @ApiImplicitParam(name = "httpPrefix", value = "http的前缀", paramType = "body", required = false, dataType = "String"), }) @PostMapping(value = "/downloadRegionQrCode") public void downloadRegionQrCode(HttpServletResponse response, @RequestBody HashMap param) { @@ -307,7 +309,6 @@ public class RiskListSourceController { * @param dir */ private void generateRegionQrCode(HashMap param, String dir) { - String httpPrefix = MapUtils.getString(param, "httpPrefix"); String projectSn = MapUtils.getString(param, "projectSn"); List regionIds = StrUtil.split(MapUtils.getString(param, "regionIds"), ","); List regionV2Vos = qualityRegionService.queryList(new MapBuilder() @@ -384,7 +385,7 @@ public class RiskListSourceController { QrConfig config = new QrConfig(qrSize, qrSize); config.setMargin(1); // 设置边距 BufferedImage qrImage = QrCodeUtil.generate( - httpPrefix + regionV2Vo.getId(), + riskListSourceRegionQrCode + regionV2Vo.getId(), config ); 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 38fdd1319..f067f0d7d 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 @@ -8,6 +8,7 @@ import cn.hutool.core.date.DateField; import cn.hutool.core.date.DateTime; import cn.hutool.core.date.DateUtil; import cn.hutool.core.stream.StreamUtil; +import cn.hutool.core.util.IdUtil; import cn.hutool.core.util.NumberUtil; import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; @@ -30,8 +31,10 @@ import com.zhgd.xmgl.modules.worker.service.IWorkerAttendanceService; import com.zhgd.xmgl.modules.worker.service.IWorkerDailyAttendanceStatisticsV2Service; import com.zhgd.xmgl.modules.worker.service.impl.WorkerInfoServiceImpl; import com.zhgd.xmgl.security.util.SecurityUtils; +import com.zhgd.xmgl.util.EasyPoiUtil; import com.zhgd.xmgl.util.ExcelUtils; import com.zhgd.xmgl.util.Fileutils; +import com.zhgd.xmgl.util.PathUtil; import io.swagger.annotations.Api; import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiImplicitParams; @@ -50,6 +53,7 @@ import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.math.BigDecimal; import java.util.*; +import java.util.concurrent.atomic.AtomicInteger; import java.util.function.Function; import java.util.stream.Collectors; @@ -274,6 +278,11 @@ public class WorkerDailyAttendanceStatisticsV2Controller { vo.setEnterpriseName(statisticsV2Vo.getEnterpriseName()); vo.setWorkerName(statisticsV2Vo.getWorkerName()); vo.setDeptName(statisticsV2Vo.getDeptName()); + vo.setWorkerTypeName(statisticsV2Vo.getWorkerTypeName()); + vo.setPhoneNumber(statisticsV2Vo.getPhoneNumber()); + vo.setIdCard(statisticsV2Vo.getIdCard()); + vo.setSex(statisticsV2Vo.getSex()); + vo.setEnterDate(statisticsV2Vo.getEnterDate()); vo.setTotalHour(statisticsV2Vo.getHourVal()); vo.setDate(statisticsV2Vo.getAttendanceDate()); vo.setInTimeList(Optional.ofNullable(inOutMap.get(statisticsV2Vo.getPersonSn())).map(m -> m.get(1)) @@ -483,13 +492,24 @@ public class WorkerDailyAttendanceStatisticsV2Controller { return Result.success(workerDailyAttendanceStatisticsV2Service.countWorkerDailyAttendanceStatisticsV2ByDate(param)); } - @ApiOperation(value = "查询考勤日报列表", notes = "查询考勤日报列表", httpMethod = "POST") + @ApiOperation(value = "分页查询考勤日报列表", notes = "分页查询考勤日报列表", httpMethod = "POST") @ApiImplicitParams({ @ApiImplicitParam(name = "projectSn", value = "项目sn", paramType = "body", required = true, dataType = "String"), @ApiImplicitParam(name = "attendanceDate", value = "考勤日期yyyy-MM-dd", paramType = "body", required = true, dataType = "String"), + @ApiImplicitParam(name = "pageNo", value = "第几页", paramType = "body", required = true, dataType = "Integer"), + @ApiImplicitParam(name = "pageSize", value = "每页显示条数", paramType = "body", required = true, dataType = "Integer"), }) - @PostMapping(value = "/getWorkerDailyAttendancesByDate") - public Result> getWorkerDailyAttendancesByDate(@RequestBody HashMap param) { + @PostMapping(value = "/getWorkerDailyAttendancePageByDate") + public Result> getWorkerDailyAttendancePageByDate(@RequestBody HashMap param) { + IPage p = doGetWorkerDailyAttendancePageByDateVoIPage(param); + return Result.success(p); + } + + /** + * @param param + * @return + */ + private IPage doGetWorkerDailyAttendancePageByDateVoIPage(HashMap param) { String projectSn = MapUtils.getString(param, "projectSn"); String attendanceDate = MapUtils.getString(param, "attendanceDate"); param.put("addTime_end", attendanceDate); @@ -506,7 +526,7 @@ public class WorkerDailyAttendanceStatisticsV2Controller { WorkerDailyAttendanceStatisticsV2Vo voDb = personSnMap.get(workerInfo.getPersonSn()); WorkerDailyAttendancesByDateVo vo = new WorkerDailyAttendancesByDateVo(); if (voDb != null) { - BeanUtil.copyProperties(vo, voDb); + BeanUtil.copyProperties(voDb, vo); } else { vo.setPersonType(workerInfo.getPersonType()); vo.setEnterpriseName(workerInfo.getEnterpriseName()); @@ -521,6 +541,11 @@ public class WorkerDailyAttendanceStatisticsV2Controller { vo.setOvertimeHourVal(new BigDecimal("0")); vo.setOvertimeDayVal(new BigDecimal("0")); vo.setInserviceType(workerInfo.getInserviceType()); + vo.setWorkerTypeName(workerInfo.getTypeName()); + vo.setPhoneNumber(workerInfo.getPhoneNumber()); + vo.setIdCard(workerInfo.getIdCard()); + vo.setSex(workerInfo.getSex()); + vo.setEnterDate(workerInfo.getEnterDate()); } List attendances = personSn2AttendancesMap.get(workerInfo.getPersonSn()); if (Objects.equals(vo.getIsAttendance(), 1) && CollUtil.isNotEmpty(attendances)) { @@ -532,6 +557,7 @@ public class WorkerDailyAttendanceStatisticsV2Controller { vo.setFirstTimeAm(firstTimeAm); String endTimePm = attendances.stream().filter(w -> DateUtil.compare(DateUtil.parseDateTime(w.getCreateTime()), DateUtil.parseDateTime(attendanceDate + " 12:00:00")) >= 0).max(Comparator.comparing(WorkerAttendance::getCreateTime)).map(WorkerAttendance::getCreateTime).orElse(null); vo.setEndTimePm(endTimePm); + vo.setAttendanceList(attendances); } vos.add(vo); } @@ -540,7 +566,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 = "POST") @@ -571,59 +597,88 @@ public class WorkerDailyAttendanceStatisticsV2Controller { @ApiImplicitParams({ @ApiImplicitParam(name = "projectSn", value = "项目sn", paramType = "body", required = true, dataType = "String"), @ApiImplicitParam(name = "downloadType", value = "1上下午打卡2进出场打卡", 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"), }) @PostMapping(value = "/exportWorkerDailyAttendancesStaticsByDateXls") - public void exportXls(HttpServletResponse response, @RequestBody HashMap param) { -// String templateUrl = null; -// try { -// String sn = MapUtils.getString(param, "sn"); -//// String libraryId = MapUtils.getString(param, "libraryId"); -// List detailIdList = JSON.parseArray(JSON.toJSONString(param.get("detailIdList")), String.class); -// // Step.1 组装查询条件 -// param.put("pageNo", 1); -// param.put("pageSize", -1); -// List> listMap = new ArrayList<>(); -// Map firstSheetMap = new HashMap<>(); -// List details = riskListDetailService.list(new LambdaQueryWrapper() -//// .eq(RiskListDetail::getLibraryId, libraryId) -// .in(RiskListDetail::getId, detailIdList) -// ); -// Map factorTypeMap = dictionaryItemService.getDictList("risk_factor_type", null).stream().collect(Collectors.toMap(DictionaryItem::getData, Function.identity(), (o1, o2) -> o1)); -// Map accidentTypeMap = riskListPotentialAccidentTypeService.list(new LambdaQueryWrapper() -// .eq(RiskListPotentialAccidentType::getSn, sn)).stream().collect(Collectors.toMap(RiskListPotentialAccidentType::getId, Function.identity(), (o1, o2) -> o1)); -// for (RiskListDetail detail : details) { -// Map map = new HashMap<>(); -// map.put("riskDescription", detail.getRiskDescription()); -// map.put("accidentType", Optional.ofNullable(accidentTypeMap.get(detail.getAccidentTypeId())).map(RiskListPotentialAccidentType::getType).orElse("")); -// map.put("riskFactorType", Optional.ofNullable(factorTypeMap.get(detail.getRiskFactorType())).map(DictionaryItem::getName).orElse("")); -// List levels = Arrays.asList("重大风险", "较大风险", "一般风险", "低风险"); -// map.put("riskLevel", Optional.ofNullable(detail.getRiskLevel()).map(m -> levels.get(m - 1)).orElse("")); -// map.put("engineeringMeasure", detail.getEngineeringMeasure()); -// map.put("managementMeasure", detail.getManagementMeasure()); -// map.put("personalProtection", detail.getPersonalProtection()); -// map.put("emergencyMeasure", detail.getEmergencyMeasure()); -// map.put("educationalMeasure", detail.getEducationalMeasure()); -// listMap.add(map); -// } -// //将项目清单集合添加到map中 -// firstSheetMap.put("listMap", listMap); -// Map> root = new HashMap<>(4); -// root.put(0, firstSheetMap); -// putOtherSheets(sn, root); -// templateUrl = Fileutils.getExportTemplateFile("excel/风险清单详情导出模板.xlsx").getAbsolutePath(); -//// templateUrl = new File("C:\\Users\\Administrator\\IdeaProjects\\wisdomisite-with-flowjar\\tmp\\风险清单详情导出模板.xlsx").getAbsolutePath(); -// TemplateExportParams params = new TemplateExportParams(templateUrl, root.keySet().toArray(new Integer[]{})); -// Workbook workbook = ExcelExportUtil.exportExcel(root, params); -// //设置下拉 -// ExcelUtils.downLoadExcel("风险清单详情导出模板.xlsx", response, workbook); -// } catch (IOException e) { -// log.error("", e); -// throw new OpenAlertException("系统错误"); -// } finally { -// if (templateUrl != null) { -// FileUtil.deleteFile(templateUrl); -// } -// } + public void exportWorkerDailyAttendancesStaticsByDateXls(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"); + // Step.1 组装查询条件 + param.put("pageNo", 1); + param.put("pageSize", -1); + List dateTimes = DateUtil.rangeToList(DateUtil.parseDate(startDate), DateUtil.parseDate(endDate), DateField.DAY_OF_YEAR); + Map> root = new HashMap<>(); + 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/entity/vo/ExceptionHourStatisticsListVo.java b/src/main/java/com/zhgd/xmgl/modules/worker/entity/vo/ExceptionHourStatisticsListVo.java index 54ac8edc0..233cd3392 100644 --- a/src/main/java/com/zhgd/xmgl/modules/worker/entity/vo/ExceptionHourStatisticsListVo.java +++ b/src/main/java/com/zhgd/xmgl/modules/worker/entity/vo/ExceptionHourStatisticsListVo.java @@ -31,6 +31,31 @@ public class ExceptionHourStatisticsListVo { */ @ApiModelProperty(value = "班组/部门") private String deptName; + /** + * 工种名称 + */ + @ApiModelProperty(value = "工种名称") + private String workerTypeName; + /** + * 手机号 + */ + @ApiModelProperty(value = "手机号") + private java.lang.String phoneNumber; + /** + * 身份证号 + */ + @ApiModelProperty(value = "身份证号") + private java.lang.String idCard; + /** + * 性别 + */ + @ApiModelProperty(value = "性别,1男,2女") + private java.lang.Integer sex; + /** + * 进场日期 + */ + @ApiModelProperty(value = "进场日期") + private java.lang.String enterDate; /** * 合计工时(h) */ diff --git a/src/main/java/com/zhgd/xmgl/modules/worker/entity/vo/WorkerDailyAttendanceStatisticsV2Vo.java b/src/main/java/com/zhgd/xmgl/modules/worker/entity/vo/WorkerDailyAttendanceStatisticsV2Vo.java index cfcb9e26e..2d42ba8a2 100644 --- a/src/main/java/com/zhgd/xmgl/modules/worker/entity/vo/WorkerDailyAttendanceStatisticsV2Vo.java +++ b/src/main/java/com/zhgd/xmgl/modules/worker/entity/vo/WorkerDailyAttendanceStatisticsV2Vo.java @@ -28,5 +28,30 @@ public class WorkerDailyAttendanceStatisticsV2Vo extends WorkerDailyAttendanceSt */ @ApiModelProperty(value = "班组/部门") private String deptName; + /** + * 工种名称 + */ + @ApiModelProperty(value = "工种名称") + private String workerTypeName; + /** + * 手机号 + */ + @ApiModelProperty(value = "手机号") + private java.lang.String phoneNumber; + /** + * 身份证号 + */ + @ApiModelProperty(value = "身份证号") + private java.lang.String idCard; + /** + * 性别 + */ + @ApiModelProperty(value = "性别,1男,2女") + private java.lang.Integer sex; + /** + * 进场日期 + */ + @ApiModelProperty(value = "进场日期") + private java.lang.String enterDate; } diff --git a/src/main/java/com/zhgd/xmgl/modules/worker/entity/vo/WorkerDailyAttendancesByDateVo.java b/src/main/java/com/zhgd/xmgl/modules/worker/entity/vo/WorkerDailyAttendancesByDateVo.java index 330bc6c92..8b1b7d7e3 100644 --- a/src/main/java/com/zhgd/xmgl/modules/worker/entity/vo/WorkerDailyAttendancesByDateVo.java +++ b/src/main/java/com/zhgd/xmgl/modules/worker/entity/vo/WorkerDailyAttendancesByDateVo.java @@ -1,8 +1,11 @@ package com.zhgd.xmgl.modules.worker.entity.vo; +import com.zhgd.xmgl.modules.worker.entity.WorkerAttendance; import io.swagger.annotations.ApiModelProperty; import lombok.Data; +import java.util.List; + @Data public class WorkerDailyAttendancesByDateVo extends WorkerDailyAttendanceStatisticsV2Vo { /** @@ -25,4 +28,10 @@ public class WorkerDailyAttendancesByDateVo extends WorkerDailyAttendanceStatist */ @ApiModelProperty(value = "下午打卡(未次)") private String endTimePm; + /** + * 考勤记录明细 + */ + @ApiModelProperty(value = "考勤记录明细") + private List attendanceList; + } diff --git a/src/main/java/com/zhgd/xmgl/modules/worker/mapper/xml/WorkerDailyAttendanceStatisticsV2Mapper.xml b/src/main/java/com/zhgd/xmgl/modules/worker/mapper/xml/WorkerDailyAttendanceStatisticsV2Mapper.xml index 4451e867d..734c7c991 100644 --- a/src/main/java/com/zhgd/xmgl/modules/worker/mapper/xml/WorkerDailyAttendanceStatisticsV2Mapper.xml +++ b/src/main/java/com/zhgd/xmgl/modules/worker/mapper/xml/WorkerDailyAttendanceStatisticsV2Mapper.xml @@ -10,6 +10,11 @@ ,c.department_name ,en.enterprise_name ,if(a.person_type=1,b.team_name,c.department_name) as dept_name + ,wt.type_name as worker_type_name + ,a.phone_number + ,a.id_card + ,a.sex + ,a.enter_date from worker_daily_attendance_statistics_v2 t JOIN worker_info a on t.person_sn=a.person_sn LEFT JOIN team_info b ON a.team_id = b.id and a.person_type = 1 diff --git a/src/main/java/com/zhgd/xmgl/util/EasyPoiUtil.java b/src/main/java/com/zhgd/xmgl/util/EasyPoiUtil.java index a77592f0a..588a07e52 100644 --- a/src/main/java/com/zhgd/xmgl/util/EasyPoiUtil.java +++ b/src/main/java/com/zhgd/xmgl/util/EasyPoiUtil.java @@ -7,8 +7,10 @@ import cn.hutool.core.util.StrUtil; import com.documents4j.api.DocumentType; import com.documents4j.api.IConverter; import com.documents4j.job.LocalConverter; +import com.zhgd.jeecg.common.execption.OpenAlertException; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; +import org.apache.poi.xssf.usermodel.XSSFWorkbook; import org.apache.poi.xwpf.usermodel.XWPFDocument; import javax.servlet.http.HttpServletResponse; @@ -21,6 +23,55 @@ import java.util.Map; @Slf4j public class EasyPoiUtil { + public static void main(String[] args) { + File file = new File("C:\\Users\\Administrator\\Desktop\\t\\测试1.xlsx"); +// FileInputStream fis; + try { +// fis = new FileInputStream(file); +// XSSFWorkbook wb = new XSSFWorkbook(fis); +// XSSFSheet sheet = wb.getSheet("test1"); +// String name = sheet.getSheetName(); +// String test2 = "test2"; +// XSSFSheet sheet2 = wb.cloneSheet(0, test2); +// wb.setSheetOrder(test2, 1); + String outputFile = "C:\\Users\\Administrator\\Desktop\\t\\测试2.xlsx"; + FileOutputStream fos = new FileOutputStream(outputFile); +// wb.write(fos); +// fis.close(); +// fos.close(); +// wb.close(); + + cloneSheetMultipleTimes(file.getAbsolutePath(), outputFile, "test1", 5); + } catch (IOException e) { + e.printStackTrace(); + } +// System.out.println("结束"); + } + + /** + * 克隆Excel的一个Sheet多份并导出新文件 + * + * @param sourceFilePath 源Excel文件路径 + * @param outputFilePath 输出Excel文件路径 + * @param sheetName + * @param copyCount 要复制的份数 (不包括原始Sheet) + * @throws IOException 如果文件操作失败 + */ + public static void cloneSheetMultipleTimes(String sourceFilePath, String outputFilePath, String sheetName, int copyCount) throws IOException { + try (FileInputStream fis = new FileInputStream(sourceFilePath); + XSSFWorkbook wb = new XSSFWorkbook(fis); + FileOutputStream fos = new FileOutputStream(outputFilePath);) { + int sheetIndex = wb.getSheetIndex(sheetName); + if (sheetIndex == -1) { + throw new OpenAlertException("sheetName错误"); + } + for (int i = 0; i < copyCount; i++) { + wb.cloneSheet(sheetIndex, sheetName + "-" + (i + 1)); + wb.setSheetOrder(sheetName + "-" + (i + 1), sheetIndex + i + 1); + } + wb.write(fos); + } + } /** * 导出word diff --git a/src/main/java/com/zhgd/xmgl/util/MapUtil.java b/src/main/java/com/zhgd/xmgl/util/MapUtil.java index 5e283e59d..a97508e65 100644 --- a/src/main/java/com/zhgd/xmgl/util/MapUtil.java +++ b/src/main/java/com/zhgd/xmgl/util/MapUtil.java @@ -1,8 +1,11 @@ package com.zhgd.xmgl.util; +import com.gexin.fastjson.JSON; +import com.gexin.fastjson.TypeReference; import jodd.util.StringUtil; import org.apache.commons.collections.MapUtils; +import java.util.Collections; import java.util.List; import java.util.Map; @@ -18,19 +21,23 @@ public class MapUtil { * @return 包含指定类型元素的List,如果key不存在或类型不匹配返回空List */ public static List getList(Map map, String key, Class clazz) { - // 1. 检查参数 if (map == null || key == null || clazz == null) { - return null; + return Collections.emptyList(); } - // 2. 获取Map中的值 Object value = map.get(key); if (value == null) { - return null; + return Collections.emptyList(); } - return com.gexin.fastjson.JSON.parseObject(com.gexin.fastjson.JSON.toJSONString(value), new com.gexin.fastjson.TypeReference>() { - }); + // 特殊处理 String 类型 + if (clazz == String.class) { + return (List) JSON.parseArray(JSON.toJSONString(value), String.class); + } + + return JSON.parseObject(JSON.toJSONString(value), + new TypeReference>() { + }); } public static void putIfNotBlank(Map map, String key, Object value) { diff --git a/src/main/resources/application-gsx-other-env-show.properties b/src/main/resources/application-gsx-other-env-show.properties index 65008523b..09817fb81 100644 --- a/src/main/resources/application-gsx-other-env-show.properties +++ b/src/main/resources/application-gsx-other-env-show.properties @@ -105,3 +105,5 @@ udp.port=51236 #上传的图片的url前缀 upload.image.url.prefix=http://192.168.34.221:9111/image/ supplierResubmitApplicationUrl=http://192.168.34.175:88/#/workspace/contractorApply +#管控清单危险源的区域二维码的前缀 +riskListSourceRegionQrCode=http://localhost:8088/app/#/pages/projectEnd/safeSame/riskGradingControlList/riskGradingControlList?id= diff --git a/src/main/resources/excel/考勤日报-出勤导出模版(上午下午).xlsx b/src/main/resources/excel/考勤日报-出勤导出模版(上午下午).xlsx new file mode 100644 index 0000000000000000000000000000000000000000..0b336555666222999f4f29f07ae7d49b3ff4086c GIT binary patch literal 11695 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 literal 0 HcmV?d00001