From 0cf0c64722882706b31f4f69c13162d75308ef0c Mon Sep 17 00:00:00 2001 From: guoshengxiong <1923636941@qq.com> Date: Wed, 13 Aug 2025 11:43:02 +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 --- pom.xml | 17 + .../ocr/controller/OcrBuildLogController.java | 96 +++++ .../ocr/mapper/xml/OcrBuildLogMapper.xml | 8 + .../controller/RiskListSourceController.java | 4 +- ...DailyAttendanceStatisticsV2Controller.java | 37 ++ ...orkerDailyAttendanceStatisticsV2Mapper.xml | 95 +++++ .../XzSecurityDangerFieldController.java | 2 +- .../entity/XzSecurityDangerReviewVerify.java | 10 - .../XzSecurityDangerFieldServiceImpl.java | 24 +- ...SecurityDangerReviewVerifyServiceImpl.java | 26 +- .../java/com/zhgd/xmgl/util/EasyPoiUtil.java | 330 +++++++++++++++ .../java/com/zhgd/xmgl/util/WordUtils.java | 157 ++++++++ .../init/data/xzSecurityDangerField.json | 379 ++++++++++++++++++ .../resources/word/ocr施工日志导出模版.docx | Bin 0 -> 13604 bytes src/main/resources/word/ocr施工日志模版.docx | Bin 0 -> 13203 bytes 15 files changed, 1147 insertions(+), 38 deletions(-) create mode 100644 src/main/java/com/zhgd/xmgl/util/EasyPoiUtil.java create mode 100644 src/main/java/com/zhgd/xmgl/util/WordUtils.java create mode 100644 src/main/resources/init/data/xzSecurityDangerField.json create mode 100644 src/main/resources/word/ocr施工日志导出模版.docx create mode 100644 src/main/resources/word/ocr施工日志模版.docx diff --git a/pom.xml b/pom.xml index fb239b500..27a6615a6 100644 --- a/pom.xml +++ b/pom.xml @@ -416,6 +416,23 @@ easypoi-web 4.4.0 + + + com.documents4j + documents4j-local + 1.1.12 + + + com.documents4j + documents4j-transformer-msoffice-word + 1.1.12 + + + + com.documents4j + documents4j-transformer-msoffice-excel + 1.1.12 + org.apache.poi diff --git a/src/main/java/com/zhgd/xmgl/modules/ocr/controller/OcrBuildLogController.java b/src/main/java/com/zhgd/xmgl/modules/ocr/controller/OcrBuildLogController.java index 147c73871..85b8e5142 100644 --- a/src/main/java/com/zhgd/xmgl/modules/ocr/controller/OcrBuildLogController.java +++ b/src/main/java/com/zhgd/xmgl/modules/ocr/controller/OcrBuildLogController.java @@ -3,28 +3,41 @@ package com.zhgd.xmgl.modules.ocr.controller; import cn.hutool.core.date.DateField; import cn.hutool.core.date.DateTime; import cn.hutool.core.date.DateUtil; +import cn.hutool.core.io.FileUtil; +import cn.hutool.core.util.IdUtil; +import cn.hutool.core.util.StrUtil; +import cn.hutool.core.util.ZipUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; +import com.gexin.fastjson.JSON; +import com.gexin.fastjson.JSONObject; import com.zhgd.annotation.OperLog; import com.zhgd.jeecg.common.api.vo.Result; +import com.zhgd.jeecg.common.execption.OpenAlertException; import com.zhgd.xmgl.modules.ocr.entity.OcrBuildLog; import com.zhgd.xmgl.modules.ocr.entity.dto.OcrBuildLogDto; import com.zhgd.xmgl.modules.ocr.entity.vo.OcrBuildLogForMonthVo; import com.zhgd.xmgl.modules.ocr.entity.vo.OcrBuildLogVo; import com.zhgd.xmgl.modules.ocr.service.IOcrBuildLogService; import com.zhgd.xmgl.security.util.SecurityUtils; +import com.zhgd.xmgl.util.*; 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.apache.commons.io.IOUtils; import org.simpleframework.xml.core.Validate; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Lazy; +import org.springframework.core.io.ClassPathResource; import org.springframework.web.bind.annotation.*; import springfox.documentation.annotations.ApiIgnore; +import javax.servlet.http.HttpServletResponse; +import java.io.*; +import java.net.URLEncoder; import java.util.*; import java.util.stream.Collectors; @@ -159,5 +172,88 @@ public class OcrBuildLogController { return Result.success(vos); } + @ApiOperation(value = "OCR施工日志模板下载", notes = "OCR施工日志模板下载") + @GetMapping("/downloadTemplate") + public void downloadTemplate(HttpServletResponse response) { + try (OutputStream out = response.getOutputStream(); + InputStream fis = new ClassPathResource("word/ocr施工日志模版.docx").getInputStream()) { + + // 设置正确的 Content-Type + response.setContentType("application/vnd.openxmlformats-officedocument.wordprocessingml.document"); + response.setCharacterEncoding("UTF-8"); + + // 设置文件名(URL编码) + String fileName = URLEncoder.encode("施工日志模版.docx", "UTF-8").replace("+", "%20"); + response.setHeader("Content-Disposition", "attachment; filename=" + fileName); + + IOUtils.copy(fis, out); + } catch (Exception e) { + log.error("下载模板失败:", e); + } + } + + @ApiOperation(value = "导出zip文件", notes = "导出zip文件", httpMethod = "POST") + @ApiImplicitParam(name = "idList", value = "idList", paramType = "body", required = true, dataType = "String") + @PostMapping("exportZip") + public void exportZip(HttpServletResponse response, @ApiIgnore @RequestBody HashMap param) throws IOException { + try (OutputStream out = response.getOutputStream();) { + String wordDir = PathUtil.getBasePath() + "/temp/" + DateUtil.today() + "/" + IdUtil.randomUUID() + "/导出OCR施工日志ZIP/word"; + FileUtil.mkdir(wordDir); + List idList = MapUtil.getList(param, "idList", String.class); + List logVos = ocrBuildLogService.queryList(new MapBuilder() + .put("idList", idList) + .build()); + String dir = new File(wordDir).getParent(); + for (OcrBuildLogVo logVo : logVos) { + Map map = new HashMap<>(); + if (StrUtil.isNotBlank(logVo.getWeatherJson())) { + JSONObject jsonObject = JSON.parseObject(logVo.getWeatherJson()); + map.put("win_speed", jsonObject.getString("win_speed")); + map.put("wea", jsonObject.getString("wea")); + map.put("tem_day", jsonObject.getString("tem_day")); + } + map.put("constructionUnitIds", logVo.getConstructionUnitIds()); + map.put("constructionAreaNames", logVo.getConstructionAreaNames()); + map.put("constructionUnitNames", logVo.getConstructionUnitNames()); + map.put("constructionWorkerNames", logVo.getConstructionWorkerNames()); + map.put("supervisionUnitNames", logVo.getSupervisionUnitNames()); + map.put("supervisionPersonnelNames", logVo.getSupervisionPersonnelNames()); + map.put("type", logVo.getType()); + map.put("uploaderName", logVo.getUploaderName()); + map.put("id", logVo.getId()); + map.put("date", DateUtil.formatDate(logVo.getDate())); + map.put("weatherJson", logVo.getWeatherJson()); + map.put("constructionAreaIds", logVo.getConstructionAreaIds()); + map.put("constructionWorkerIds", logVo.getConstructionWorkerIds()); + map.put("supervisionUnitIds", logVo.getSupervisionUnitIds()); + map.put("supervisionPersonnelIds", logVo.getSupervisionPersonnelIds()); + map.put("constructionTask", logVo.getConstructionTask()); + map.put("constructionMachinery", logVo.getConstructionMachinery()); + map.put("attendance", logVo.getAttendance()); + map.put("designChangeMaterial", logVo.getDesignChangeMaterial()); + map.put("safetyBriefingMaterial", logVo.getSafetyBriefingMaterial()); + map.put("technicalBriefingMaterial", logVo.getTechnicalBriefingMaterial()); + map.put("createTime", logVo.getCreateTime()); + map.put("updateTime", logVo.getUpdateTime()); + map.put("projectSn", logVo.getProjectSn()); + map.put("uploaderId", logVo.getUploaderId()); + String url = Fileutils.getExportTemplateFile("word/ocr施工日志导出模版.docx").getAbsolutePath(); + File wordFile = new File(wordDir, logVo.getConstructionAreaNames() + DateUtil.formatDate(logVo.getDate()) + ".docx"); + EasyPoiUtil.exportNewLineWord(map, url, wordFile); + EasyPoiUtil.wordToPdfExport(wordFile, new File(dir, logVo.getConstructionAreaNames() + DateUtil.formatDate(logVo.getDate()) + ".pdf").getAbsolutePath()); + } + FileUtil.del(wordDir); + ZipUtil.zip(dir); + response.setContentType("application/json"); + response.setHeader("Content-disposition", "attachment; filename=" + + URLEncoder.encode(new File(dir + ".zip").getName(), "UTF-8")); + InputStream fis = new FileInputStream(dir + ".zip"); + org.apache.poi.util.IOUtils.copy(fis, out); + out.flush(); + } catch (Exception e) { + log.error("", e); + throw new OpenAlertException(e.getMessage()); + } + } } diff --git a/src/main/java/com/zhgd/xmgl/modules/ocr/mapper/xml/OcrBuildLogMapper.xml b/src/main/java/com/zhgd/xmgl/modules/ocr/mapper/xml/OcrBuildLogMapper.xml index 0cd2567ee..ff57c82d8 100644 --- a/src/main/java/com/zhgd/xmgl/modules/ocr/mapper/xml/OcrBuildLogMapper.xml +++ b/src/main/java/com/zhgd/xmgl/modules/ocr/mapper/xml/OcrBuildLogMapper.xml @@ -7,6 +7,14 @@ ,su.real_name as uploader_name from ocr_build_log t left join system_user su on su.user_id=t.uploader_id + where 1=1 + + and t.id in + + #{item} + + )t ${ew.customSqlSegment} 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 660f17324..da680ca76 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 @@ -270,6 +270,7 @@ 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) { @@ -306,6 +307,7 @@ 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() @@ -382,7 +384,7 @@ public class RiskListSourceController { QrConfig config = new QrConfig(qrSize, qrSize); config.setMargin(1); // 设置边距 BufferedImage qrImage = QrCodeUtil.generate( - regionV2Vo.getId() + "", + httpPrefix + 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 4372616cf..b6f38c65f 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 @@ -446,4 +446,41 @@ public class WorkerDailyAttendanceStatisticsV2Controller { } } + @OperLog(operModul = "员工每日的考勤统计记录v2管理", operType = "", operDesc = "考勤总览") + @ApiOperation(value = "考勤总览", notes = "考勤总览", httpMethod = "POST") + @ApiImplicitParams({ + @ApiImplicitParam(name = "projectSn", value = "项目sn", paramType = "body", required = false, dataType = "String"), + @ApiImplicitParam(name = "enterpriseTypeId", value = "企业类型id", paramType = "body", required = false, dataType = "String"), + @ApiImplicitParam(name = "enterpriseId", value = "所属企业id", paramType = "body", required = false, dataType = "String"), + @ApiImplicitParam(name = "teamId", value = "班组ID", paramType = "body", required = false, dataType = "String"), + @ApiImplicitParam(name = "departmentId", value = "部门ID", paramType = "body", required = false, dataType = "String"), + @ApiImplicitParam(name = "startMonth", value = "开始时间,格式2020-08(startMonth和endMonth或startDate和endDate至少传其中一组)", dataType = "String", paramType = "body", required = true), + @ApiImplicitParam(name = "endMonth", value = "结束时间,格式2020-08", dataType = "String", paramType = "body", required = true), + @ApiImplicitParam(name = "startDate", value = "开始时间,yyyy-MM-dd", paramType = "body", dataType = "String", required = true), + @ApiImplicitParam(name = "endDate", value = "结束时间,yyyy-MM-dd", paramType = "body", dataType = "String", required = true), + }) + @PostMapping(value = "/countWorkerDailyAttendanceStatisticsV2") + public Result countWorkerDailyAttendanceStatisticsV2(@RequestBody Map param) { + return Result.success(workerDailyAttendanceStatisticsV2Service.countWorkerDailyAttendanceStatisticsV2(param)); + } + + @OperLog(operModul = "员工每日的考勤统计记录v2管理", operType = "", operDesc = "每月/日出勤/在职人数统计") + @ApiOperation(value = "每月/日出勤/在职人数统计", notes = "每月/日出勤/在职人数统计", httpMethod = "POST") + @ApiImplicitParams({ + @ApiImplicitParam(name = "projectSn", value = "项目sn", paramType = "body", required = false, dataType = "String"), + @ApiImplicitParam(name = "enterpriseTypeId", value = "企业类型id", paramType = "body", required = false, dataType = "String"), + @ApiImplicitParam(name = "enterpriseId", value = "所属企业id", paramType = "body", required = false, dataType = "String"), + @ApiImplicitParam(name = "teamId", value = "班组ID", paramType = "body", required = false, dataType = "String"), + @ApiImplicitParam(name = "departmentId", value = "部门ID", paramType = "body", required = false, dataType = "String"), + @ApiImplicitParam(name = "startMonth", value = "开始时间,格式2020-08(startMonth和endMonth或startDate和endDate至少传其中一组)", dataType = "String", paramType = "body", required = true), + @ApiImplicitParam(name = "endMonth", value = "结束时间,格式2020-08", dataType = "String", paramType = "body", required = true), + @ApiImplicitParam(name = "startDate", value = "开始时间,yyyy-MM-dd", paramType = "body", dataType = "String", required = true), + @ApiImplicitParam(name = "endDate", value = "结束时间,yyyy-MM-dd", paramType = "body", dataType = "String", required = true), + }) + @PostMapping(value = "/countWorkerDailyAttendanceStatisticsV2ByDate") + public Result countWorkerDailyAttendanceStatisticsV2ByDate(@RequestBody Map param) { + return Result.success(workerDailyAttendanceStatisticsV2Service.countWorkerDailyAttendanceStatisticsV2ByDate(param)); + } + + } 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 1af831cc6..73a2f3d47 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 @@ -39,4 +39,99 @@ )t where t.id = #{id} + + + + diff --git a/src/main/java/com/zhgd/xmgl/modules/xz/security/controller/XzSecurityDangerFieldController.java b/src/main/java/com/zhgd/xmgl/modules/xz/security/controller/XzSecurityDangerFieldController.java index b68f3fcd4..1da77dbd6 100644 --- a/src/main/java/com/zhgd/xmgl/modules/xz/security/controller/XzSecurityDangerFieldController.java +++ b/src/main/java/com/zhgd/xmgl/modules/xz/security/controller/XzSecurityDangerFieldController.java @@ -171,7 +171,7 @@ public class XzSecurityDangerFieldController { String sn = MapUtils.getString(param, "sn"); List configVos = xzSecurityDangerFieldConfigService.queryList(param); List list = xzSecurityDangerFieldService.queryList(param); - if (Objects.equals(companyProjectType, 2) && (CollUtil.isEmpty(list) || Objects.equals(CollUtil.getFirst(configVos).getEnableProject(), 0))) { + if (Objects.equals(companyProjectType, 2) && CollUtil.isEmpty(list)) { //项目不存在,查询企业配置 list = getCompanyConfig(param, sn); for (XzSecurityDangerFieldVo fieldVo : list) { diff --git a/src/main/java/com/zhgd/xmgl/modules/xz/security/entity/XzSecurityDangerReviewVerify.java b/src/main/java/com/zhgd/xmgl/modules/xz/security/entity/XzSecurityDangerReviewVerify.java index 4bcc5cad3..dc3016417 100644 --- a/src/main/java/com/zhgd/xmgl/modules/xz/security/entity/XzSecurityDangerReviewVerify.java +++ b/src/main/java/com/zhgd/xmgl/modules/xz/security/entity/XzSecurityDangerReviewVerify.java @@ -63,16 +63,6 @@ public class XzSecurityDangerReviewVerify implements Serializable { @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") @ApiModelProperty(value = "更新时间") private java.util.Date updateTime; - /** - * 复查配置项目端是否开启,1开启,0不开启 - */ - @ApiModelProperty(value = "复查配置项目端是否开启,1开启,0不开启") - private java.lang.Integer enableProjectForReview; - /** - * 核验配置项目端是否开启,1开启,0不开启 - */ - @ApiModelProperty(value = "核验配置项目端是否开启,1开启,0不开启") - private java.lang.Integer enableProjectForVerify; @ApiModelProperty("1开启复查0不开启复查") private Integer enableReview; @ApiModelProperty("1开启核验0不开启核验") diff --git a/src/main/java/com/zhgd/xmgl/modules/xz/security/service/impl/XzSecurityDangerFieldServiceImpl.java b/src/main/java/com/zhgd/xmgl/modules/xz/security/service/impl/XzSecurityDangerFieldServiceImpl.java index 2a2c2d4e0..4b8d62e54 100644 --- a/src/main/java/com/zhgd/xmgl/modules/xz/security/service/impl/XzSecurityDangerFieldServiceImpl.java +++ b/src/main/java/com/zhgd/xmgl/modules/xz/security/service/impl/XzSecurityDangerFieldServiceImpl.java @@ -1,10 +1,14 @@ package com.zhgd.xmgl.modules.xz.security.service.impl; +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.io.resource.ResourceUtil; +import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; 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.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.google.common.base.Objects; import com.zhgd.jeecg.common.execption.OpenAlertException; import com.zhgd.jeecg.common.system.query.QueryGenerator; import com.zhgd.xmgl.modules.xz.security.entity.XzSecurityDangerField; @@ -14,11 +18,13 @@ import com.zhgd.xmgl.modules.xz.security.mapper.XzSecurityDangerFieldMapper; import com.zhgd.xmgl.modules.xz.security.service.IXzSecurityDangerFieldService; import com.zhgd.xmgl.util.PageUtil; import com.zhgd.xmgl.util.RefUtil; +import org.apache.commons.collections4.MapUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.HashMap; import java.util.List; +import java.util.stream.Collectors; /** * @Description: 安全隐患检查字段设置 @@ -36,14 +42,14 @@ public class XzSecurityDangerFieldServiceImpl extends ServiceImpl queryWrapper = this.getQueryWrapper(param); Page page = PageUtil.getPage(param); IPage pageList = baseMapper.queryList(page, queryWrapper, param); - pageList.setRecords(this.dealList(pageList.getRecords())); + pageList.setRecords(this.dealList(pageList.getRecords(), param)); return pageList; } @Override public List queryList(HashMap param) { QueryWrapper queryWrapper = getQueryWrapper(param); - return dealList(baseMapper.queryList(queryWrapper, param)); + return dealList(baseMapper.queryList(queryWrapper, param), param); } private QueryWrapper getQueryWrapper(HashMap param) { @@ -52,7 +58,19 @@ public class XzSecurityDangerFieldServiceImpl extends ServiceImpl dealList(List list) { + private List dealList(List list, HashMap param) { + Integer recordType = MapUtils.getInteger(param, "recordType"); + Integer companyProjectType = MapUtils.getInteger(param, "companyProjectType"); + String sn = MapUtils.getString(param, "sn"); + if (CollUtil.isEmpty(list)) { + //空就初始化值 + List fieldVos = JSON.parseArray(ResourceUtil.readUtf8Str("init/data/xzSecurityDangerField.json"), XzSecurityDangerFieldVo.class); + list = fieldVos.stream().filter(vo -> Objects.equal(vo.getRecordType(), recordType)).collect(Collectors.toList()); + for (XzSecurityDangerFieldVo vo : list) { + vo.setSn(sn); + vo.setCompanyProjectType(companyProjectType); + } + } return list; } diff --git a/src/main/java/com/zhgd/xmgl/modules/xz/security/service/impl/XzSecurityDangerReviewVerifyServiceImpl.java b/src/main/java/com/zhgd/xmgl/modules/xz/security/service/impl/XzSecurityDangerReviewVerifyServiceImpl.java index 91266a0d8..7521fc38b 100644 --- a/src/main/java/com/zhgd/xmgl/modules/xz/security/service/impl/XzSecurityDangerReviewVerifyServiceImpl.java +++ b/src/main/java/com/zhgd/xmgl/modules/xz/security/service/impl/XzSecurityDangerReviewVerifyServiceImpl.java @@ -130,27 +130,9 @@ public class XzSecurityDangerReviewVerifyServiceImpl extends ServiceImpl list = this.queryList(param); - if (Objects.equals(companyProjectType, 2)) { - if (CollUtil.isEmpty(list)) { - //项目没数据 - list = getCompanyConfig(param, sn); - } else { - XzSecurityDangerReviewVerifyVo vo = CollUtil.getFirst(list); - if (Objects.equals(vo.getEnableProjectForReview(), 0) || Objects.equals(vo.getEnableProjectForVerify(), 0)) { - List companyConfigs = getCompanyConfig(param, sn); - if (CollUtil.isNotEmpty(companyConfigs)) { - XzSecurityDangerReviewVerifyVo verifyVo = companyConfigs.get(0); - if (Objects.equals(vo.getEnableProjectForReview(), 0)) { - vo.setReviewRoleName(verifyVo.getReviewRoleName()); - vo.setEnableReview(verifyVo.getEnableReview()); - } - if (Objects.equals(vo.getEnableProjectForReview(), 0)) { - vo.setVerifyRoleName(verifyVo.getVerifyRoleName()); - vo.setEnableVerify(verifyVo.getEnableVerify()); - } - } - } - } + if (Objects.equals(companyProjectType, 2) && CollUtil.isEmpty(list)) { + //项目没数据 + list = getCompanyConfig(param, sn); } XzSecurityDangerReviewVerifyVo vo = CollUtil.getFirst(list); if (Objects.isNull(vo)) { @@ -158,8 +140,6 @@ public class XzSecurityDangerReviewVerifyServiceImpl extends ServiceImpl params, File file) { + try { + XWPFDocument doc = WordExportUtil.exportWord07(URLDecoder.decode(file.getPath(), "UTF-8"), params); + WordUtils.addBreakInCell(doc.getParagraphs()); + //设置响应体内容类型 + response.setContentType("application/octet-stream"); + //添加响应头 + response.addHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode("下载试卷.docx", "UTF-8")); + //暴露新添加的响应头 + response.setHeader("Access-Control-Expose-Headers", "Content-Disposition"); + //将word文档流输出到输出流中 + doc.write(response.getOutputStream()); + //关闭流 + doc.close(); + } catch (Exception e) { + log.error("exportNewLineWord:", e); + } + } + + /** + * 根据模板导出word + * + * @param map 数据 + * @param tempUrl 模板地址 + * @param outputFile 临时模板文件 + */ + public static void exportWord(Map map, String tempUrl, File outputFile) { + try { + XWPFDocument doc = WordExportUtil.exportWord07(tempUrl, map); + FileOutputStream fos = new FileOutputStream(outputFile); + doc.write(fos); + fos.close(); + } catch (Exception e) { + log.error("exportWord:", e); + } + } + + /** + * 根据模板导出word会换行的 + * + * @param map 参数map + * @param tempUrl 模板url + * @param outputFile 导出位置 + */ + public static void exportNewLineWord(Map map, String tempUrl, File outputFile) { + try { + XWPFDocument doc = WordExportUtil.exportWord07(tempUrl, map); + //文本换行 + WordUtils.addBreakInCell(doc.getParagraphs()); + FileOutputStream fos = new FileOutputStream(outputFile); + doc.write(fos); + fos.close(); + } catch (Exception e) { + log.error("exportNewLineWord:", e); + } + } + + /** + * word转pdf导出 + * + * @param response + * @param wordFile word文档文件 + */ + public static void wordToPdfExport(HttpServletResponse response, File wordFile) { + response.setContentType("application/pdf"); + response.setHeader("Content-Disposition", "attachment; filename=name.pdf"); + // 获取当前系统名称 + String osName = System.getProperty("os.name").toLowerCase(); + // 根据系统选择执行方法 + if (osName.contains("win")) { + try (InputStream docxInputStream = new FileInputStream(wordFile); + OutputStream pdfOutputStream = response.getOutputStream() +// OutputStream pdfOutputStream = new FileOutputStream("C:\\Users\\Administrator\\Desktop\\管道焊接记录.pdf") + ) { + + IConverter converter = LocalConverter.builder().build(); + converter + .convert(docxInputStream) + .as(DocumentType.DOCX) + .to(pdfOutputStream) + .as(DocumentType.PDF) + .execute(); + + // 通常不需要在这里调用 flush(),因为 execute()方法可能已经完成了它,但如果遇到特定问题,可以尝试调用它 + // pdfOutputStream.flush(); + + } catch (Exception e) { + // 设置适当的 HTTP 状态码和错误消息 + response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR); + // 可以在这里记录错误或向客户端发送错误消息(但注意,响应流可能已关闭) + log.error("", e); + } finally { + // 清理临时文件 + if (!wordFile.delete()) { + wordFile.deleteOnExit(); + } + } + } else if (osName.contains("nux") || osName.contains("nix")) { + File pdfFile = new File(wordFile.getParent(), StringUtils.substringBeforeLast(wordFile.getName(), ".") + ".pdf"); + log.info("linux环境开始导出pdf,源文件:{},目标文件:{}", wordFile.getAbsolutePath(), pdfFile.getAbsolutePath()); + linuxWordToPdf(pdfFile, wordFile); + try { + FileUtil.writeToStream(pdfFile, response.getOutputStream()); + } catch (IOException e) { + log.error("word导出pdf出错"); + } + } + } + + /** + * word转pdf导出 + * + * @param wordFile word文档文件 + */ + public static void wordToPdfExport(File wordFile) { + wordToPdfExport(wordFile, StrUtil.subBefore(wordFile.getAbsolutePath(), ".", true) + ".pdf"); + } + + /** + * word转pdf导出 + * + * @param wordFile word文档文件 + * @param outputFilePath + */ + public static void wordToPdfExport(File wordFile, String outputFilePath) { + // 获取当前系统名称 + String osName = System.getProperty("os.name").toLowerCase(); + // 根据系统选择执行方法 + if (osName.contains("win")) { + try (InputStream docxInputStream = new FileInputStream(wordFile); + OutputStream pdfOutputStream = new FileOutputStream(outputFilePath) +// OutputStream pdfOutputStream = new FileOutputStream("C:\\Users\\Administrator\\Desktop\\管道焊接记录.pdf") + ) { + + IConverter converter = LocalConverter.builder().build(); + converter + .convert(docxInputStream) + .as(DocumentType.DOCX) + .to(pdfOutputStream) + .as(DocumentType.PDF) + .execute(); + + // 通常不需要在这里调用 flush(),因为 execute()方法可能已经完成了它,但如果遇到特定问题,可以尝试调用它 + // pdfOutputStream.flush(); + + } catch (Exception e) { + // 可以在这里记录错误或向客户端发送错误消息(但注意,响应流可能已关闭) + log.error("", e); + } finally { + // 清理临时文件 + if (!wordFile.delete()) { + wordFile.deleteOnExit(); + } + } + } else if (osName.contains("nux") || osName.contains("nix")) { + try { + File pdfFile = new File(wordFile.getParent(), StringUtils.substringBeforeLast(wordFile.getName(), ".") + ".pdf"); + log.info("linux环境开始导出pdf,源文件:{},目标文件:{}", wordFile.getAbsolutePath(), pdfFile.getAbsolutePath()); + linuxWordToPdf(pdfFile, wordFile); + } catch (Exception e) { + log.error("word导出pdf出错"); + } finally { + // 清理临时文件 + if (!wordFile.delete()) { + wordFile.deleteOnExit(); + } + } + } + } + + /** + * linux系统word转pdf + *    * 使用LibreOffice转换。系统需安装LibreOffice + *    * 转换命令 libreoffice --invisible --convert-to pdf --outdir output_dir source_path + *    * 转换后的pdf文件名使用的是源文件的名称,所以如果要指定输出文件名称,就需把源文件名称改成想要输出的名称 + * + * @param pdfFile 转换后的pdf文件 + * @param wordFile word源文件 + */ + private static void linuxWordToPdf(File pdfFile, File wordFile) { + // 获取word文件的绝对路径 + String sourcePath = wordFile.getAbsolutePath(); + // 获取pdf文件存放文件夹的绝对路径 + String outDir = pdfFile.getAbsolutePath().substring(0, pdfFile.getAbsolutePath().lastIndexOf(File.separator)); + + // 构建LibreOffice的命令行工具命令 + List cmd = new ArrayList<>(); + cmd.add("libreoffice"); + cmd.add("--invisible"); + cmd.add("--convert-to"); + cmd.add("pdf"); + cmd.add("--outdir"); + cmd.add(outDir); + cmd.add(sourcePath); + log.info(cmd.toString()); + // 执行转换命令 + try { + executeLinuxCmd(cmd); + } catch (Exception e) { + log.error("linuxWordToPdf linux环境word转换为pdf时出现异常:", e); + } + } + + /** + * 执行命令行 + * + * @param cmd 命令行 + * @return + */ +// private static boolean executeLinuxCmd(List cmd) { +// try { +// Process process = Runtime.getRuntime().exec(cmd.toArray(new String[cmd.size()])); +// process.waitFor(); +// InputStream in = process.getInputStream(); +// BufferedReader read = new BufferedReader(new InputStreamReader(in)); +// String result = read.readLine(); +// log.info("executeLinuxCmd 执行Linux命令INFO:" + result); +// } catch (InterruptedException e) { +// log.error("executeLinuxCmd 执行Linux命令异常:", e); +// Thread.currentThread().interrupt(); +// return false; +// } catch (IOException e) { +// log.error("获取系统命令执行环境异常", e); +// } +// return true; +// } + private static boolean executeLinuxCmd(List cmd) { + try { + ProcessBuilder processBuilder = new ProcessBuilder(cmd); + // 合并标准输出和错误输出 + processBuilder.redirectErrorStream(true); + Process process = processBuilder.start(); + + // 读取命令输出 + InputStream in = process.getInputStream(); + BufferedReader read = new BufferedReader(new InputStreamReader(in)); + String line; + while ((line = read.readLine()) != null) { + log.info("executeLinuxCmd 执行Linux命令INFO: " + line); + } + + int exitCode = process.waitFor(); + if (exitCode != 0) { + log.error("executeLinuxCmd 命令执行失败,退出码: " + exitCode); + return false; + } + } catch (InterruptedException e) { + log.error("executeLinuxCmd 执行Linux命令异常:", e); + Thread.currentThread().interrupt(); + return false; + } catch (IOException e) { + log.error("获取系统命令执行环境异常", e); + return false; + } + return true; + } + + /** + * 图片格式化,Word导出图片格式 + * + * @param imgPath 图片路径 + */ + public static ImageEntity imgFormatting(String imgPath, int width, int height) { + //设置图片 + ImageEntity image = new ImageEntity(imgPath, width, height); + //表格外添加简单图片 + image.setType(ImageEntity.URL); + image.setRowspan(ImageEntity.EMBED); + return image; + } + + /** + * excel转pdf + * + * @param excelPath + * @return + */ + public static void excelToPdf(String excelPath) { + File inputWord = new File(excelPath); + try (InputStream docxInputStream = new FileInputStream(inputWord); + OutputStream outputStream = new FileOutputStream(StrUtil.subBefore(excelPath, ".", true) + ".pdf")) { + IConverter converter = LocalConverter.builder().build(); + String fileTyle = excelPath.substring(excelPath.lastIndexOf("."), excelPath.length());//获取文件类型 + if (".xls".equals(fileTyle)) { + converter.convert(docxInputStream).as(DocumentType.XLS).to(outputStream).as(DocumentType.PDF).execute(); + } else if (".xlsx".equals(fileTyle)) { + converter.convert(docxInputStream).as(DocumentType.XLSX).to(outputStream).as(DocumentType.PDF).execute(); + } + docxInputStream.close(); + outputStream.close(); + inputWord.delete(); + System.out.println("pdf转换成功"); + } catch (Exception e) { + log.error("", e); + } + } + +} diff --git a/src/main/java/com/zhgd/xmgl/util/WordUtils.java b/src/main/java/com/zhgd/xmgl/util/WordUtils.java new file mode 100644 index 000000000..b766882b8 --- /dev/null +++ b/src/main/java/com/zhgd/xmgl/util/WordUtils.java @@ -0,0 +1,157 @@ +package com.zhgd.xmgl.util; + +import cn.afterturn.easypoi.word.WordExportUtil; +import cn.afterturn.easypoi.word.parse.ParseWord07; +import org.apache.poi.poifs.filesystem.DirectoryEntry; +import org.apache.poi.poifs.filesystem.POIFSFileSystem; +import org.apache.poi.xwpf.usermodel.XWPFDocument; +import org.apache.poi.xwpf.usermodel.XWPFParagraph; +import org.apache.poi.xwpf.usermodel.XWPFRun; + +import javax.servlet.http.HttpServletResponse; +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.net.URLEncoder; +import java.util.List; +import java.util.Map; + +public class WordUtils { + + /** + * word下载 + * + * @param fileName 下载时的文件名称 + * @param response + * @param doc + */ + private static void downLoadWord(String fileName, HttpServletResponse response, XWPFDocument doc) throws IOException { + try { + response.setCharacterEncoding("UTF-8"); + response.setHeader("content-Type", "application/msword"); + response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName + ".docx", "UTF-8")); + doc.write(response.getOutputStream()); + } catch (Exception e) { + throw new IOException(e.getMessage()); + } + } + + /** + * word下载 + * + * @param fileName 下载时的文件名称 + * @param response + */ + private static void downLoadWord(String fileName, HttpServletResponse response, POIFSFileSystem poifsFileSystem) throws IOException { + try { + response.setCharacterEncoding("UTF-8"); + response.setHeader("content-Type", "application/octet-stream"); + response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName + ".docx", "UTF-8")); + poifsFileSystem.writeFilesystem(response.getOutputStream()); + } catch (Exception e) { + throw new IOException(e.getMessage()); + } + } + + /** + * html转word + * + * @param response + * @param html + * @throws IOException + */ + public static void html2Word(HttpServletResponse response, String html) throws IOException { + // String html = FileUtil.readString("C:\\Users\\Administrator\\Desktop\\t\\文档.html", StandardCharsets.UTF_8 ); + byte by[] = html.getBytes("UTF-8"); + ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(by); + POIFSFileSystem poifsFileSystem = new POIFSFileSystem(); + DirectoryEntry directoryEntry = poifsFileSystem.getRoot(); + directoryEntry.createDocument("WordDocument", byteArrayInputStream); + WordUtils.downLoadWord("导出word", response, poifsFileSystem); + } + + /** + * word模板导出 + * + * @param map + * @param templatePath + * @param fileName + * @param response + * @throws Exception + */ + public static void WordTemplateExport(Map map, String templatePath, String fileName, HttpServletResponse response) throws Exception { + XWPFDocument doc = WordExportUtil.exportWord07(templatePath, map); + downLoadWord(fileName, response, doc); + } + + + /** + * word模板导出多页 + * + * @param list + * @param templatePath + * @param fileName + * @param response + * @throws Exception + */ + public static void WordTemplateExportMorePage(List> list, String templatePath, String fileName, HttpServletResponse response) throws Exception { + XWPFDocument doc = new ParseWord07().parseWord(templatePath, list); + downLoadWord(fileName, response, doc); + } + + /** + * 文本换行 + */ + public static void addBreakInCell(List paragraphs) { + for (XWPFParagraph p : paragraphs) { + for (XWPFRun run : p.getRuns()) {//XWPFRun对象定义具有一组公共属性的文本区域 + if (run.getText(0) != null && run.getText(0).contains("\n")) { + String[] lines = run.getText(0).split("\n"); + if (lines.length > 0) { + run.setText(lines[0], 0); // set first line into XWPFRun + for (int i = 1; i < lines.length; i++) { + // add break and insert new text + run.addBreak();//中断 +// run.addCarriageReturn();//回车符,但是不起作用 + run.setText(lines[i]); + } + } + } + } + } + } + + /** + * 文本换行 + */ + public static void addBreakInCellForExam(List paragraphs) { + for (XWPFParagraph p : paragraphs) { + List runs = p.getRuns(); + if (runs.size() > 0) { + XWPFRun run = runs.get(0); + String text = run.getText(0); // 获取完整文本 + if (text != null && text.contains("\n")) { + String[] lines = text.split("\n"); + if (lines.length > 0) { + // 设置第一行文本 + run.setText(lines[0], 0); + run.addBreak(); // 添加换行符 + // 为剩余行创建新的 XWPFRun + for (int j = 1; j < lines.length; j++) { + XWPFRun newRun = p.insertNewRun(j); // 插入新的 XWPFRun + newRun.setText(lines[j]); // 设置新行的文本 + // 复制原始 XWPFRun 的样式到新的 XWPFRun + newRun.setBold(run.isBold()); + newRun.setItalic(run.isItalic()); + newRun.setFontSize(10); + newRun.setFontFamily("宋体"); + if (j != lines.length - 1) { + newRun.addBreak(); + } + } + } + } + } + } + + } +} diff --git a/src/main/resources/init/data/xzSecurityDangerField.json b/src/main/resources/init/data/xzSecurityDangerField.json new file mode 100644 index 000000000..8179949ae --- /dev/null +++ b/src/main/resources/init/data/xzSecurityDangerField.json @@ -0,0 +1,379 @@ +[ + { + "recordType": 2, + "sn": "2e07f0e2569c43fb835ae2082d1d314f", + "companyProjectType": 1, + "fieldName": "fileUrl", + "originalFieldName": "上传附件", + "displayFieldName": "上传附件", + "defaultDataType": null, + "isRequired": 0, + "isEnabled": 1, + "isPinned": 0, + "sort": 7 + }, + { + "recordType": 2, + "sn": "2e07f0e2569c43fb835ae2082d1d314f", + "companyProjectType": 1, + "fieldName": "imageUrl", + "originalFieldName": "上传图片", + "displayFieldName": "上传图片", + "defaultDataType": null, + "isRequired": 1, + "isEnabled": 1, + "isPinned": 1, + "sort": 6 + }, + { + "recordType": 2, + "sn": "2e07f0e2569c43fb835ae2082d1d314f", + "companyProjectType": 1, + "fieldName": "enterpriseIds", + "originalFieldName": "分包单位", + "displayFieldName": "分包单位", + "defaultDataType": null, + "isRequired": 0, + "isEnabled": 1, + "isPinned": 1, + "sort": 5 + }, + { + "recordType": 2, + "sn": "2e07f0e2569c43fb835ae2082d1d314f", + "companyProjectType": 1, + "fieldName": "inspectTime", + "originalFieldName": "检查时间", + "displayFieldName": "检查时间", + "defaultDataType": null, + "isRequired": 1, + "isEnabled": 1, + "isPinned": 1, + "sort": 4 + }, + { + "recordType": 2, + "sn": "2e07f0e2569c43fb835ae2082d1d314f", + "companyProjectType": 1, + "fieldName": "dangerDesc", + "originalFieldName": "补充说明", + "displayFieldName": "补充说明", + "defaultDataType": null, + "isRequired": 0, + "isEnabled": 1, + "isPinned": 1, + "sort": 3 + }, + { + "recordType": 2, + "sn": "2e07f0e2569c43fb835ae2082d1d314f", + "companyProjectType": 1, + "fieldName": "addedDescription", + "originalFieldName": "事件描述", + "displayFieldName": "事件描述", + "defaultDataType": null, + "isRequired": 0, + "isEnabled": 1, + "isPinned": 1, + "sort": 2 + }, + { + "recordType": 2, + "sn": "2e07f0e2569c43fb835ae2082d1d314f", + "companyProjectType": 1, + "fieldName": "dangerItemId", + "originalFieldName": "排查分类", + "displayFieldName": "排查分类", + "defaultDataType": null, + "isRequired": 0, + "isEnabled": 1, + "isPinned": 1, + "sort": 1 + }, + { + "recordType": 2, + "sn": "2e07f0e2569c43fb835ae2082d1d314f", + "companyProjectType": 1, + "fieldName": "regionIds", + "originalFieldName": "检查部位", + "displayFieldName": "责任区域", + "defaultDataType": null, + "isRequired": 1, + "isEnabled": 1, + "isPinned": 1, + "sort": 0 + }, + { + "recordType": 1, + "sn": "2e07f0e2569c43fb835ae2082d1d314f", + "companyProjectType": 1, + "fieldName": "dutyMajor", + "originalFieldName": "责任专业", + "displayFieldName": "责任专业", + "defaultDataType": null, + "isRequired": 0, + "isEnabled": 0, + "isPinned": 0, + "sort": 20 + }, + { + "recordType": 1, + "sn": "2e07f0e2569c43fb835ae2082d1d314f", + "companyProjectType": 1, + "fieldName": "rectifyAfterImage", + "originalFieldName": "整改后图片", + "displayFieldName": "整改后图片", + "defaultDataType": null, + "isRequired": 0, + "isEnabled": 1, + "isPinned": 1, + "sort": 19 + }, + { + "recordType": 1, + "sn": "2e07f0e2569c43fb835ae2082d1d314f", + "companyProjectType": 1, + "fieldName": "status", + "originalFieldName": "现场整改", + "displayFieldName": "现场整改", + "defaultDataType": null, + "isRequired": 1, + "isEnabled": 1, + "isPinned": 1, + "sort": 18 + }, + { + "recordType": 1, + "sn": "2e07f0e2569c43fb835ae2082d1d314f", + "companyProjectType": 1, + "fieldName": "fileUrl", + "originalFieldName": "上传附件", + "displayFieldName": "上传附件", + "defaultDataType": null, + "isRequired": 0, + "isEnabled": 1, + "isPinned": 0, + "sort": 17 + }, + { + "recordType": 1, + "sn": "2e07f0e2569c43fb835ae2082d1d314f", + "companyProjectType": 1, + "fieldName": "imageUrl", + "originalFieldName": "隐患图片", + "displayFieldName": "隐患图片", + "defaultDataType": null, + "isRequired": 1, + "isEnabled": 1, + "isPinned": 1, + "sort": 16 + }, + { + "recordType": 1, + "sn": "2e07f0e2569c43fb835ae2082d1d314f", + "companyProjectType": 1, + "fieldName": "verifyManIds", + "originalFieldName": "核验人", + "displayFieldName": "核验人", + "defaultDataType": 1, + "isRequired": 1, + "isEnabled": 1, + "isPinned": 1, + "sort": 15 + }, + { + "recordType": 1, + "sn": "2e07f0e2569c43fb835ae2082d1d314f", + "companyProjectType": 1, + "fieldName": "reviewIds", + "originalFieldName": "复查人", + "displayFieldName": "复查人", + "defaultDataType": null, + "isRequired": 1, + "isEnabled": 1, + "isPinned": 1, + "sort": 14 + }, + { + "recordType": 1, + "sn": "2e07f0e2569c43fb835ae2082d1d314f", + "companyProjectType": 1, + "fieldName": "changeId", + "originalFieldName": "整改人", + "displayFieldName": "整改人", + "defaultDataType": null, + "isRequired": 1, + "isEnabled": 1, + "isPinned": 1, + "sort": 13 + }, + { + "recordType": 1, + "sn": "2e07f0e2569c43fb835ae2082d1d314f", + "companyProjectType": 1, + "fieldName": "changeLimitTime", + "originalFieldName": "整改时限", + "displayFieldName": "整改时限", + "defaultDataType": null, + "isRequired": 1, + "isEnabled": 1, + "isPinned": 1, + "sort": 12 + }, + { + "recordType": 1, + "sn": "2e07f0e2569c43fb835ae2082d1d314f", + "companyProjectType": 1, + "fieldName": "enterpriseIds", + "originalFieldName": "分包单位", + "displayFieldName": "分包单位", + "defaultDataType": null, + "isRequired": 1, + "isEnabled": 1, + "isPinned": 1, + "sort": 11 + }, + { + "recordType": 1, + "sn": "2e07f0e2569c43fb835ae2082d1d314f", + "companyProjectType": 1, + "fieldName": "inspectTime", + "originalFieldName": "检查时间", + "displayFieldName": "检查时间", + "defaultDataType": 1, + "isRequired": 1, + "isEnabled": 1, + "isPinned": 1, + "sort": 10 + }, + { + "recordType": 1, + "sn": "2e07f0e2569c43fb835ae2082d1d314f", + "companyProjectType": 1, + "fieldName": "urgentLevel", + "originalFieldName": "紧急程度", + "displayFieldName": "紧急程度", + "defaultDataType": null, + "isRequired": 0, + "isEnabled": 1, + "isPinned": 0, + "sort": 9 + }, + { + "recordType": 1, + "sn": "2e07f0e2569c43fb835ae2082d1d314f", + "companyProjectType": 1, + "fieldName": "priorityNameDic", + "originalFieldName": "问题等级二", + "displayFieldName": "问题等级二", + "defaultDataType": null, + "isRequired": 0, + "isEnabled": 0, + "isPinned": 0, + "sort": 8 + }, + { + "recordType": 1, + "sn": "2e07f0e2569c43fb835ae2082d1d314f", + "companyProjectType": 1, + "fieldName": "level", + "originalFieldName": "问题等级", + "displayFieldName": "问题等级", + "defaultDataType": 1, + "isRequired": 1, + "isEnabled": 1, + "isPinned": 1, + "sort": 7 + }, + { + "recordType": 1, + "sn": "2e07f0e2569c43fb835ae2082d1d314f", + "companyProjectType": 1, + "fieldName": "addedDescription", + "originalFieldName": "事件描述", + "displayFieldName": "事件描述", + "defaultDataType": null, + "isRequired": 0, + "isEnabled": 1, + "isPinned": 0, + "sort": 6 + }, + { + "recordType": 1, + "sn": "2e07f0e2569c43fb835ae2082d1d314f", + "companyProjectType": 1, + "fieldName": "remark", + "originalFieldName": "整改要求", + "displayFieldName": "整改要求", + "defaultDataType": null, + "isRequired": 0, + "isEnabled": 1, + "isPinned": 0, + "sort": 5 + }, + { + "recordType": 1, + "sn": "2e07f0e2569c43fb835ae2082d1d314f", + "companyProjectType": 1, + "fieldName": "dangerDesc", + "originalFieldName": "补充说明", + "displayFieldName": "补充说明", + "defaultDataType": null, + "isRequired": 0, + "isEnabled": 1, + "isPinned": 0, + "sort": 4 + }, + { + "recordType": 1, + "sn": "2e07f0e2569c43fb835ae2082d1d314f", + "companyProjectType": 1, + "fieldName": "dangerItemId", + "originalFieldName": "问题分类", + "displayFieldName": "问题分类", + "defaultDataType": null, + "isRequired": 1, + "isEnabled": 1, + "isPinned": 1, + "sort": 3 + }, + { + "recordType": 1, + "sn": "2e07f0e2569c43fb835ae2082d1d314f", + "companyProjectType": 1, + "fieldName": "dangerItemId", + "originalFieldName": "问题描述", + "displayFieldName": "问题描述", + "defaultDataType": null, + "isRequired": 1, + "isEnabled": 1, + "isPinned": 1, + "sort": 2 + }, + { + "recordType": 1, + "sn": "2e07f0e2569c43fb835ae2082d1d314f", + "companyProjectType": 1, + "fieldName": "detailPlace", + "originalFieldName": "详细部位", + "displayFieldName": "详细部位", + "defaultDataType": null, + "isRequired": 0, + "isEnabled": 0, + "isPinned": 0, + "sort": 1 + }, + { + "recordType": 1, + "sn": "2e07f0e2569c43fb835ae2082d1d314f", + "companyProjectType": 1, + "fieldName": "regionIds", + "originalFieldName": "责任区域", + "displayFieldName": "责任区域", + "defaultDataType": null, + "isRequired": 1, + "isEnabled": 1, + "isPinned": 1, + "sort": 0 + } +] diff --git a/src/main/resources/word/ocr施工日志导出模版.docx b/src/main/resources/word/ocr施工日志导出模版.docx new file mode 100644 index 0000000000000000000000000000000000000000..c3af3b6849368b9bbbadf1b0a4e1801323718b21 GIT binary patch literal 13604 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 KPu%psK>r10D0kuj literal 0 HcmV?d00001 diff --git a/src/main/resources/word/ocr施工日志模版.docx b/src/main/resources/word/ocr施工日志模版.docx new file mode 100644 index 0000000000000000000000000000000000000000..806fd240b3ce3c5132bc4e91da3e696866e13f4a GIT binary patch literal 13203 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 literal 0 HcmV?d00001