diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/file/PrintFileRegisterMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/file/PrintFileRegisterMapper.java index 733bea5..fcb5685 100644 --- a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/file/PrintFileRegisterMapper.java +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/file/PrintFileRegisterMapper.java @@ -23,7 +23,6 @@ @Select(" SELECT minio_file_name " + " FROM system_sign " + " WHERE sign_user_id =#{signUserId} " + - " AND is_del=0" + " limit 1") String getSignFileNameById(@Param("signUserId") Long signUserId); } diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/file/PrintFileRegisterMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/file/PrintFileRegisterMapper.java index 733bea5..fcb5685 100644 --- a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/file/PrintFileRegisterMapper.java +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/file/PrintFileRegisterMapper.java @@ -23,7 +23,6 @@ @Select(" SELECT minio_file_name " + " FROM system_sign " + " WHERE sign_user_id =#{signUserId} " + - " AND is_del=0" + " limit 1") String getSignFileNameById(@Param("signUserId") Long signUserId); } diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/PrintFileRegister.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/PrintFileRegister.java index af8a970..dc098f7 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/PrintFileRegister.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/PrintFileRegister.java @@ -2,6 +2,7 @@ import cn.hutool.core.lang.Assert; import com.alibaba.fastjson.JSON; +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.casic.missiles.dto.certificate.FilePrintRegister; import com.casic.missiles.service.listeners.register.data.GenericFilePrintProcessor; import com.casic.missiles.utils.MinioUtil; @@ -81,6 +82,7 @@ if (isPdf) { //默认转为docx,只需要进行docx的替换即可 String pdfNewUrl = printDocUrl.replaceAll("docx", "pdf"); + pdfNewUrl = "天气纪要.pdf"; // 4、将新word转化为pdf文件 FilePrintRegisterUtils.wordToPdf(printDocUrl, pdfNewUrl); printDocUrl = pdfNewUrl; @@ -116,7 +118,7 @@ //封装返回值 byte[] data = out.toByteArray(); response.reset(); - response.setHeader("Content-Disposition", "attachment; filename=\"" + printDocUrl + "\""); + response.setHeader("Content-Disposition", "attachment; filename=" + new String(printDocUrl.getBytes("GBK"), "ISO-8859-1") ); response.addHeader("Content-Length", "" + data.length); response.setHeader("Access-Control-Allow-Origin", "*"); response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE"); diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/file/PrintFileRegisterMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/file/PrintFileRegisterMapper.java index 733bea5..fcb5685 100644 --- a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/file/PrintFileRegisterMapper.java +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/file/PrintFileRegisterMapper.java @@ -23,7 +23,6 @@ @Select(" SELECT minio_file_name " + " FROM system_sign " + " WHERE sign_user_id =#{signUserId} " + - " AND is_del=0" + " limit 1") String getSignFileNameById(@Param("signUserId") Long signUserId); } diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/PrintFileRegister.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/PrintFileRegister.java index af8a970..dc098f7 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/PrintFileRegister.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/PrintFileRegister.java @@ -2,6 +2,7 @@ import cn.hutool.core.lang.Assert; import com.alibaba.fastjson.JSON; +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.casic.missiles.dto.certificate.FilePrintRegister; import com.casic.missiles.service.listeners.register.data.GenericFilePrintProcessor; import com.casic.missiles.utils.MinioUtil; @@ -81,6 +82,7 @@ if (isPdf) { //默认转为docx,只需要进行docx的替换即可 String pdfNewUrl = printDocUrl.replaceAll("docx", "pdf"); + pdfNewUrl = "天气纪要.pdf"; // 4、将新word转化为pdf文件 FilePrintRegisterUtils.wordToPdf(printDocUrl, pdfNewUrl); printDocUrl = pdfNewUrl; @@ -116,7 +118,7 @@ //封装返回值 byte[] data = out.toByteArray(); response.reset(); - response.setHeader("Content-Disposition", "attachment; filename=\"" + printDocUrl + "\""); + response.setHeader("Content-Disposition", "attachment; filename=" + new String(printDocUrl.getBytes("GBK"), "ISO-8859-1") ); response.addHeader("Content-Length", "" + data.length); response.setHeader("Access-Control-Allow-Origin", "*"); response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE"); diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/ElectronicSignSeal.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/ElectronicSignSeal.java index d1c0ae2..811c250 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/ElectronicSignSeal.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/ElectronicSignSeal.java @@ -1,18 +1,25 @@ package com.casic.missiles.service.listeners.register.data; +import cn.hutool.core.lang.Assert; +import cn.hutool.core.stream.CollectorUtil; +import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.casic.missiles.dto.certificate.ElectronicImage; import com.casic.missiles.dto.certificate.FilePrintRegister; import com.casic.missiles.dto.flowable.ApprovalLogResponse; +import com.casic.missiles.enums.BusinessExceptionEnum; import com.casic.missiles.enums.system.FilePrintEnum; +import com.casic.missiles.exception.BusinessException; import com.casic.missiles.mapper.file.PrintFileRegisterMapper; +import com.casic.missiles.service.flowable.ApprovalOperateService; import com.casic.missiles.utils.SpringContextUtil; import org.apache.commons.collections.CollectionUtils; import org.apache.commons.lang3.StringUtils; +import org.apache.commons.lang3.time.DateFormatUtils; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; +import java.lang.reflect.Field; +import java.sql.Timestamp; +import java.util.*; import java.util.stream.Collectors; /** @@ -20,21 +27,6 @@ */ public class ElectronicSignSeal extends ElectronicSignTemplate implements FilePrintEnum { - /** - * 构建带有关键字的图片方法 - */ - public static void bindPictureKey(FilePrintRegister filePrintRegister, List imageMapList, Map metaDataMap, Map> approvalLogMap) { - //处理具备审批标志的 - List approvalImageMapList = imageMapList.stream() - .filter(imageMap -> "1".equals(imageMap.get(APPROVAL_FLAG))) - .collect(Collectors.toList()); - filePrintRegister.getElectronicImageList().addAll(ElectronicSignSeal.signNamesCreator(approvalLogMap, filePrintRegister, approvalImageMapList)); - //处理文中的章 - List extendImageMapList = imageMapList.stream() - .filter(imageMap -> "0".equals(imageMap.get(APPROVAL_FLAG))) - .collect(Collectors.toList()); - filePrintRegister.getElectronicImageList().addAll(ElectronicSignSeal.electronicKeySignSeals(extendImageMapList, metaDataMap, filePrintRegister)); - } /** * 有关键字的非工作流人员章 @@ -45,7 +37,7 @@ private static List electronicKeySignSeals(List extendImageMapList, Map metaDataMap, FilePrintRegister filePrintRegister) { List electronicImageSeals = new ArrayList<>(); for (Map extendImageMap : extendImageMapList) { - ElectronicImage electronicImage = defaultElectronicSignSeal((String) extendImageMap.get(DOC_NAME)); + ElectronicImage electronicImage = defaultElectronicImage((String) extendImageMap.get(DOC_NAME)); if (metaDataMap.containsKey((String) extendImageMap.get(FILED_NAME)) && ObjectUtils.isNotEmpty(metaDataMap.get(extendImageMap.get(FILED_NAME)))) { electronicImage.setElectronicSealImageUrl(filePrintRegister.getTemDir() + (String) metaDataMap.get(extendImageMap.get(FILED_NAME))); //放入待下载的文件集合 @@ -91,13 +83,93 @@ return electronicImage; } + public static void approvalImage(Map metaDataMap, JSONObject imageMap, List imageMapList, FilePrintRegister filePrintRegister) { + + if (StringUtils.isNotEmpty(imageMap.get(APPROVAL_FIELD).toString())) { + //健壮性校验,没有绑定的list结合去掉 + Assert.isFalse(metaDataMap.containsKey(imageMap.get(APPROVAL_FIELD).toString()), + () -> { + throw new BusinessException(BusinessExceptionEnum.APPROVAL_FIELD_ERROR); + }); + ApprovalOperateService approvalOperateService = SpringContextUtil.getBean(ApprovalOperateService.class); + + if (!metaDataMap.containsKey(imageMap.get(APPROVAL_FIELD).toString())) { + Iterator> it = metaDataMap.entrySet().iterator(); + while (it.hasNext()) { + Map.Entry entry = it.next(); + if (entry.getValue() instanceof List) { + List innerMetaDataList = (List) entry.getValue(); + if (ObjectUtils.isNotEmpty(innerMetaDataList)) { + for (Object innerMetaDataObject : innerMetaDataList) { + List> approvalLogList = null; + Field[] fields = innerMetaDataObject.getClass().getDeclaredFields(); + for (Field field : fields) { + if (!field.isAccessible()) { + field.setAccessible(true); + } + try { + if (imageMap.get(APPROVAL_FIELD).equals(field.getName()) && field.get(innerMetaDataObject) != null) { + approvalLogList = approvalOperateService.approvalLog(field.get(innerMetaDataObject).toString()); + bindSignPictureKey(filePrintRegister, imageMapList, approvalLogList); + } + } catch (Exception ie) { + throw new BusinessException(500, "字段映射异常"); + } + } + } + } + } + } + } else { + //获取 + List> approvalLogList = approvalOperateService.approvalLog((String) metaDataMap.get(imageMap.get(APPROVAL_FIELD).toString())); + bindSignPictureKey(filePrintRegister, imageMapList, approvalLogList); + } + } + } + + /** + * 构建带有关键字的工作流签名图片方法 + */ + public static void bindSignPictureKey(FilePrintRegister filePrintRegister, List imageMapList, List> approvalLogList) { + if (CollectionUtils.isEmpty(approvalLogList)) { + return; + } + Map> approvalLogMap = null; + approvalLogMap = approvalLogList.stream() + .collect(Collectors.toMap(e -> e.get(0).getTaskName(), e -> e,(e1,e2)->e1)); + //处理文中的章 + if (ObjectUtils.isNotEmpty(approvalLogMap)) { + //处理具备审批标志的 + List approvalImageMapList = imageMapList.stream() + .filter(imagesMap -> "1".equals(imagesMap.get(APPROVAL_FLAG))) + .collect(Collectors.toList()); + filePrintRegister.getElectronicImageList().addAll(ElectronicSignSeal.signNamesCreator(approvalLogMap, filePrintRegister, approvalImageMapList)); + } + } + + /** + * 构建带有关键字的图片方法 + */ + public static void bindPictureKey(FilePrintRegister filePrintRegister, List imageMapList, Map metaDataMap) { + //处理文中的章 + List extendImageMapList = imageMapList.stream() + .filter(imageMap -> "0".equals(imageMap.get(APPROVAL_FLAG))) + .collect(Collectors.toList()); + filePrintRegister.getElectronicImageList().addAll(ElectronicSignSeal.electronicKeySignSeals(extendImageMapList, metaDataMap, filePrintRegister)); + } + /** * 电子签名创建器 */ - private static List signNamesCreator(Map> approvalLogMap, FilePrintRegister filePrintRegister, List approvalImageMapList) { + public static List signNamesCreator(Map> approvalLogMap, FilePrintRegister filePrintRegister, List approvalImageMapList) { + if (CollectionUtils.isEmpty(approvalImageMapList)) { + return null; + } List electronicImageList = new ArrayList<>(); PrintFileRegisterMapper fileRegisterMapper = SpringContextUtil.getBean(PrintFileRegisterMapper.class); + int timeSeqCount = 1; for (int i = 0; i < approvalImageMapList.size(); i++) { //是不是当前的人员,不是就skip if (!approvalLogMap.containsKey(approvalImageMapList.get(i).get(FILED_NAME))) { @@ -106,20 +178,25 @@ final String customizedSignName = (String) approvalImageMapList.get(i).get(DOC_NAME); List approvalLogList = approvalLogMap.get(approvalImageMapList.get(i).get(FILED_NAME)); if (CollectionUtils.isNotEmpty(approvalLogList)) { - approvalLogList.forEach( - approvalLog -> { - ElectronicImage electronicImage = defaultElectronicSignName(customizedSignName); - String signFileName = fileRegisterMapper.getSignFileNameById(approvalLog.getAssigneeId()); - if (StringUtils.isEmpty(signFileName)) { - return; - } - //设置集合 - electronicImage.setElectronicSealImageUrl(filePrintRegister.getTemDir() + signFileName); - //放入待下载的文件集合 - filePrintRegister.getBeDownloadedFileNames().add(signFileName); - electronicImageList.add(electronicImage); - } - ); + + for (ApprovalLogResponse approvalLog : approvalLogList) { + ElectronicImage electronicImage = defaultElectronicSignName(customizedSignName); + String signFileName = fileRegisterMapper.getSignFileNameById(approvalLog.getAssigneeId()); + if (StringUtils.isEmpty(signFileName)) { + continue; + } + //设置时间 + Calendar calendar = Calendar.getInstance(); + calendar.setTime(approvalLog.getFinishTime()); + filePrintRegister.getParams().put("year" + timeSeqCount, calendar.get(Calendar.YEAR)); + filePrintRegister.getParams().put("month" + timeSeqCount, calendar.get(Calendar.MONTH)); + filePrintRegister.getParams().put("day" + timeSeqCount++, calendar.get(Calendar.DAY_OF_YEAR)); + //设置集合 + electronicImage.setElectronicSealImageUrl(filePrintRegister.getTemDir() + signFileName); + //放入待下载的文件集合 + filePrintRegister.getBeDownloadedFileNames().add(signFileName); + electronicImageList.add(electronicImage); + } } } return electronicImageList; diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/file/PrintFileRegisterMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/file/PrintFileRegisterMapper.java index 733bea5..fcb5685 100644 --- a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/file/PrintFileRegisterMapper.java +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/file/PrintFileRegisterMapper.java @@ -23,7 +23,6 @@ @Select(" SELECT minio_file_name " + " FROM system_sign " + " WHERE sign_user_id =#{signUserId} " + - " AND is_del=0" + " limit 1") String getSignFileNameById(@Param("signUserId") Long signUserId); } diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/PrintFileRegister.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/PrintFileRegister.java index af8a970..dc098f7 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/PrintFileRegister.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/PrintFileRegister.java @@ -2,6 +2,7 @@ import cn.hutool.core.lang.Assert; import com.alibaba.fastjson.JSON; +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.casic.missiles.dto.certificate.FilePrintRegister; import com.casic.missiles.service.listeners.register.data.GenericFilePrintProcessor; import com.casic.missiles.utils.MinioUtil; @@ -81,6 +82,7 @@ if (isPdf) { //默认转为docx,只需要进行docx的替换即可 String pdfNewUrl = printDocUrl.replaceAll("docx", "pdf"); + pdfNewUrl = "天气纪要.pdf"; // 4、将新word转化为pdf文件 FilePrintRegisterUtils.wordToPdf(printDocUrl, pdfNewUrl); printDocUrl = pdfNewUrl; @@ -116,7 +118,7 @@ //封装返回值 byte[] data = out.toByteArray(); response.reset(); - response.setHeader("Content-Disposition", "attachment; filename=\"" + printDocUrl + "\""); + response.setHeader("Content-Disposition", "attachment; filename=" + new String(printDocUrl.getBytes("GBK"), "ISO-8859-1") ); response.addHeader("Content-Length", "" + data.length); response.setHeader("Access-Control-Allow-Origin", "*"); response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE"); diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/ElectronicSignSeal.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/ElectronicSignSeal.java index d1c0ae2..811c250 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/ElectronicSignSeal.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/ElectronicSignSeal.java @@ -1,18 +1,25 @@ package com.casic.missiles.service.listeners.register.data; +import cn.hutool.core.lang.Assert; +import cn.hutool.core.stream.CollectorUtil; +import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.casic.missiles.dto.certificate.ElectronicImage; import com.casic.missiles.dto.certificate.FilePrintRegister; import com.casic.missiles.dto.flowable.ApprovalLogResponse; +import com.casic.missiles.enums.BusinessExceptionEnum; import com.casic.missiles.enums.system.FilePrintEnum; +import com.casic.missiles.exception.BusinessException; import com.casic.missiles.mapper.file.PrintFileRegisterMapper; +import com.casic.missiles.service.flowable.ApprovalOperateService; import com.casic.missiles.utils.SpringContextUtil; import org.apache.commons.collections.CollectionUtils; import org.apache.commons.lang3.StringUtils; +import org.apache.commons.lang3.time.DateFormatUtils; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; +import java.lang.reflect.Field; +import java.sql.Timestamp; +import java.util.*; import java.util.stream.Collectors; /** @@ -20,21 +27,6 @@ */ public class ElectronicSignSeal extends ElectronicSignTemplate implements FilePrintEnum { - /** - * 构建带有关键字的图片方法 - */ - public static void bindPictureKey(FilePrintRegister filePrintRegister, List imageMapList, Map metaDataMap, Map> approvalLogMap) { - //处理具备审批标志的 - List approvalImageMapList = imageMapList.stream() - .filter(imageMap -> "1".equals(imageMap.get(APPROVAL_FLAG))) - .collect(Collectors.toList()); - filePrintRegister.getElectronicImageList().addAll(ElectronicSignSeal.signNamesCreator(approvalLogMap, filePrintRegister, approvalImageMapList)); - //处理文中的章 - List extendImageMapList = imageMapList.stream() - .filter(imageMap -> "0".equals(imageMap.get(APPROVAL_FLAG))) - .collect(Collectors.toList()); - filePrintRegister.getElectronicImageList().addAll(ElectronicSignSeal.electronicKeySignSeals(extendImageMapList, metaDataMap, filePrintRegister)); - } /** * 有关键字的非工作流人员章 @@ -45,7 +37,7 @@ private static List electronicKeySignSeals(List extendImageMapList, Map metaDataMap, FilePrintRegister filePrintRegister) { List electronicImageSeals = new ArrayList<>(); for (Map extendImageMap : extendImageMapList) { - ElectronicImage electronicImage = defaultElectronicSignSeal((String) extendImageMap.get(DOC_NAME)); + ElectronicImage electronicImage = defaultElectronicImage((String) extendImageMap.get(DOC_NAME)); if (metaDataMap.containsKey((String) extendImageMap.get(FILED_NAME)) && ObjectUtils.isNotEmpty(metaDataMap.get(extendImageMap.get(FILED_NAME)))) { electronicImage.setElectronicSealImageUrl(filePrintRegister.getTemDir() + (String) metaDataMap.get(extendImageMap.get(FILED_NAME))); //放入待下载的文件集合 @@ -91,13 +83,93 @@ return electronicImage; } + public static void approvalImage(Map metaDataMap, JSONObject imageMap, List imageMapList, FilePrintRegister filePrintRegister) { + + if (StringUtils.isNotEmpty(imageMap.get(APPROVAL_FIELD).toString())) { + //健壮性校验,没有绑定的list结合去掉 + Assert.isFalse(metaDataMap.containsKey(imageMap.get(APPROVAL_FIELD).toString()), + () -> { + throw new BusinessException(BusinessExceptionEnum.APPROVAL_FIELD_ERROR); + }); + ApprovalOperateService approvalOperateService = SpringContextUtil.getBean(ApprovalOperateService.class); + + if (!metaDataMap.containsKey(imageMap.get(APPROVAL_FIELD).toString())) { + Iterator> it = metaDataMap.entrySet().iterator(); + while (it.hasNext()) { + Map.Entry entry = it.next(); + if (entry.getValue() instanceof List) { + List innerMetaDataList = (List) entry.getValue(); + if (ObjectUtils.isNotEmpty(innerMetaDataList)) { + for (Object innerMetaDataObject : innerMetaDataList) { + List> approvalLogList = null; + Field[] fields = innerMetaDataObject.getClass().getDeclaredFields(); + for (Field field : fields) { + if (!field.isAccessible()) { + field.setAccessible(true); + } + try { + if (imageMap.get(APPROVAL_FIELD).equals(field.getName()) && field.get(innerMetaDataObject) != null) { + approvalLogList = approvalOperateService.approvalLog(field.get(innerMetaDataObject).toString()); + bindSignPictureKey(filePrintRegister, imageMapList, approvalLogList); + } + } catch (Exception ie) { + throw new BusinessException(500, "字段映射异常"); + } + } + } + } + } + } + } else { + //获取 + List> approvalLogList = approvalOperateService.approvalLog((String) metaDataMap.get(imageMap.get(APPROVAL_FIELD).toString())); + bindSignPictureKey(filePrintRegister, imageMapList, approvalLogList); + } + } + } + + /** + * 构建带有关键字的工作流签名图片方法 + */ + public static void bindSignPictureKey(FilePrintRegister filePrintRegister, List imageMapList, List> approvalLogList) { + if (CollectionUtils.isEmpty(approvalLogList)) { + return; + } + Map> approvalLogMap = null; + approvalLogMap = approvalLogList.stream() + .collect(Collectors.toMap(e -> e.get(0).getTaskName(), e -> e,(e1,e2)->e1)); + //处理文中的章 + if (ObjectUtils.isNotEmpty(approvalLogMap)) { + //处理具备审批标志的 + List approvalImageMapList = imageMapList.stream() + .filter(imagesMap -> "1".equals(imagesMap.get(APPROVAL_FLAG))) + .collect(Collectors.toList()); + filePrintRegister.getElectronicImageList().addAll(ElectronicSignSeal.signNamesCreator(approvalLogMap, filePrintRegister, approvalImageMapList)); + } + } + + /** + * 构建带有关键字的图片方法 + */ + public static void bindPictureKey(FilePrintRegister filePrintRegister, List imageMapList, Map metaDataMap) { + //处理文中的章 + List extendImageMapList = imageMapList.stream() + .filter(imageMap -> "0".equals(imageMap.get(APPROVAL_FLAG))) + .collect(Collectors.toList()); + filePrintRegister.getElectronicImageList().addAll(ElectronicSignSeal.electronicKeySignSeals(extendImageMapList, metaDataMap, filePrintRegister)); + } + /** * 电子签名创建器 */ - private static List signNamesCreator(Map> approvalLogMap, FilePrintRegister filePrintRegister, List approvalImageMapList) { + public static List signNamesCreator(Map> approvalLogMap, FilePrintRegister filePrintRegister, List approvalImageMapList) { + if (CollectionUtils.isEmpty(approvalImageMapList)) { + return null; + } List electronicImageList = new ArrayList<>(); PrintFileRegisterMapper fileRegisterMapper = SpringContextUtil.getBean(PrintFileRegisterMapper.class); + int timeSeqCount = 1; for (int i = 0; i < approvalImageMapList.size(); i++) { //是不是当前的人员,不是就skip if (!approvalLogMap.containsKey(approvalImageMapList.get(i).get(FILED_NAME))) { @@ -106,20 +178,25 @@ final String customizedSignName = (String) approvalImageMapList.get(i).get(DOC_NAME); List approvalLogList = approvalLogMap.get(approvalImageMapList.get(i).get(FILED_NAME)); if (CollectionUtils.isNotEmpty(approvalLogList)) { - approvalLogList.forEach( - approvalLog -> { - ElectronicImage electronicImage = defaultElectronicSignName(customizedSignName); - String signFileName = fileRegisterMapper.getSignFileNameById(approvalLog.getAssigneeId()); - if (StringUtils.isEmpty(signFileName)) { - return; - } - //设置集合 - electronicImage.setElectronicSealImageUrl(filePrintRegister.getTemDir() + signFileName); - //放入待下载的文件集合 - filePrintRegister.getBeDownloadedFileNames().add(signFileName); - electronicImageList.add(electronicImage); - } - ); + + for (ApprovalLogResponse approvalLog : approvalLogList) { + ElectronicImage electronicImage = defaultElectronicSignName(customizedSignName); + String signFileName = fileRegisterMapper.getSignFileNameById(approvalLog.getAssigneeId()); + if (StringUtils.isEmpty(signFileName)) { + continue; + } + //设置时间 + Calendar calendar = Calendar.getInstance(); + calendar.setTime(approvalLog.getFinishTime()); + filePrintRegister.getParams().put("year" + timeSeqCount, calendar.get(Calendar.YEAR)); + filePrintRegister.getParams().put("month" + timeSeqCount, calendar.get(Calendar.MONTH)); + filePrintRegister.getParams().put("day" + timeSeqCount++, calendar.get(Calendar.DAY_OF_YEAR)); + //设置集合 + electronicImage.setElectronicSealImageUrl(filePrintRegister.getTemDir() + signFileName); + //放入待下载的文件集合 + filePrintRegister.getBeDownloadedFileNames().add(signFileName); + electronicImageList.add(electronicImage); + } } } return electronicImageList; diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/ElectronicSignTemplate.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/ElectronicSignTemplate.java index e946f6c..84d294d 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/ElectronicSignTemplate.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/ElectronicSignTemplate.java @@ -47,6 +47,22 @@ } /** + * 默认电子签章的图片设置,允许重写 + */ + public static ElectronicImage defaultElectronicImage(String keyWord) { + ElectronicImage electronicImage = ElectronicImage.builder() + .keyWordIndex(-1) + .keyWord(keyWord) + .vertical(-10f) + .horizontal(10f) + .stampHeight(100f) + .stampWidth(100f) + .diaphaneity(150f) + .build(); + return electronicImage; + } + + /** * 默认电子签名的图片设置,支持重写 */ protected static ElectronicImage defaultElectronicSignName(String keyWord) { diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/file/PrintFileRegisterMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/file/PrintFileRegisterMapper.java index 733bea5..fcb5685 100644 --- a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/file/PrintFileRegisterMapper.java +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/file/PrintFileRegisterMapper.java @@ -23,7 +23,6 @@ @Select(" SELECT minio_file_name " + " FROM system_sign " + " WHERE sign_user_id =#{signUserId} " + - " AND is_del=0" + " limit 1") String getSignFileNameById(@Param("signUserId") Long signUserId); } diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/PrintFileRegister.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/PrintFileRegister.java index af8a970..dc098f7 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/PrintFileRegister.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/PrintFileRegister.java @@ -2,6 +2,7 @@ import cn.hutool.core.lang.Assert; import com.alibaba.fastjson.JSON; +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.casic.missiles.dto.certificate.FilePrintRegister; import com.casic.missiles.service.listeners.register.data.GenericFilePrintProcessor; import com.casic.missiles.utils.MinioUtil; @@ -81,6 +82,7 @@ if (isPdf) { //默认转为docx,只需要进行docx的替换即可 String pdfNewUrl = printDocUrl.replaceAll("docx", "pdf"); + pdfNewUrl = "天气纪要.pdf"; // 4、将新word转化为pdf文件 FilePrintRegisterUtils.wordToPdf(printDocUrl, pdfNewUrl); printDocUrl = pdfNewUrl; @@ -116,7 +118,7 @@ //封装返回值 byte[] data = out.toByteArray(); response.reset(); - response.setHeader("Content-Disposition", "attachment; filename=\"" + printDocUrl + "\""); + response.setHeader("Content-Disposition", "attachment; filename=" + new String(printDocUrl.getBytes("GBK"), "ISO-8859-1") ); response.addHeader("Content-Length", "" + data.length); response.setHeader("Access-Control-Allow-Origin", "*"); response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE"); diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/ElectronicSignSeal.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/ElectronicSignSeal.java index d1c0ae2..811c250 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/ElectronicSignSeal.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/ElectronicSignSeal.java @@ -1,18 +1,25 @@ package com.casic.missiles.service.listeners.register.data; +import cn.hutool.core.lang.Assert; +import cn.hutool.core.stream.CollectorUtil; +import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.casic.missiles.dto.certificate.ElectronicImage; import com.casic.missiles.dto.certificate.FilePrintRegister; import com.casic.missiles.dto.flowable.ApprovalLogResponse; +import com.casic.missiles.enums.BusinessExceptionEnum; import com.casic.missiles.enums.system.FilePrintEnum; +import com.casic.missiles.exception.BusinessException; import com.casic.missiles.mapper.file.PrintFileRegisterMapper; +import com.casic.missiles.service.flowable.ApprovalOperateService; import com.casic.missiles.utils.SpringContextUtil; import org.apache.commons.collections.CollectionUtils; import org.apache.commons.lang3.StringUtils; +import org.apache.commons.lang3.time.DateFormatUtils; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; +import java.lang.reflect.Field; +import java.sql.Timestamp; +import java.util.*; import java.util.stream.Collectors; /** @@ -20,21 +27,6 @@ */ public class ElectronicSignSeal extends ElectronicSignTemplate implements FilePrintEnum { - /** - * 构建带有关键字的图片方法 - */ - public static void bindPictureKey(FilePrintRegister filePrintRegister, List imageMapList, Map metaDataMap, Map> approvalLogMap) { - //处理具备审批标志的 - List approvalImageMapList = imageMapList.stream() - .filter(imageMap -> "1".equals(imageMap.get(APPROVAL_FLAG))) - .collect(Collectors.toList()); - filePrintRegister.getElectronicImageList().addAll(ElectronicSignSeal.signNamesCreator(approvalLogMap, filePrintRegister, approvalImageMapList)); - //处理文中的章 - List extendImageMapList = imageMapList.stream() - .filter(imageMap -> "0".equals(imageMap.get(APPROVAL_FLAG))) - .collect(Collectors.toList()); - filePrintRegister.getElectronicImageList().addAll(ElectronicSignSeal.electronicKeySignSeals(extendImageMapList, metaDataMap, filePrintRegister)); - } /** * 有关键字的非工作流人员章 @@ -45,7 +37,7 @@ private static List electronicKeySignSeals(List extendImageMapList, Map metaDataMap, FilePrintRegister filePrintRegister) { List electronicImageSeals = new ArrayList<>(); for (Map extendImageMap : extendImageMapList) { - ElectronicImage electronicImage = defaultElectronicSignSeal((String) extendImageMap.get(DOC_NAME)); + ElectronicImage electronicImage = defaultElectronicImage((String) extendImageMap.get(DOC_NAME)); if (metaDataMap.containsKey((String) extendImageMap.get(FILED_NAME)) && ObjectUtils.isNotEmpty(metaDataMap.get(extendImageMap.get(FILED_NAME)))) { electronicImage.setElectronicSealImageUrl(filePrintRegister.getTemDir() + (String) metaDataMap.get(extendImageMap.get(FILED_NAME))); //放入待下载的文件集合 @@ -91,13 +83,93 @@ return electronicImage; } + public static void approvalImage(Map metaDataMap, JSONObject imageMap, List imageMapList, FilePrintRegister filePrintRegister) { + + if (StringUtils.isNotEmpty(imageMap.get(APPROVAL_FIELD).toString())) { + //健壮性校验,没有绑定的list结合去掉 + Assert.isFalse(metaDataMap.containsKey(imageMap.get(APPROVAL_FIELD).toString()), + () -> { + throw new BusinessException(BusinessExceptionEnum.APPROVAL_FIELD_ERROR); + }); + ApprovalOperateService approvalOperateService = SpringContextUtil.getBean(ApprovalOperateService.class); + + if (!metaDataMap.containsKey(imageMap.get(APPROVAL_FIELD).toString())) { + Iterator> it = metaDataMap.entrySet().iterator(); + while (it.hasNext()) { + Map.Entry entry = it.next(); + if (entry.getValue() instanceof List) { + List innerMetaDataList = (List) entry.getValue(); + if (ObjectUtils.isNotEmpty(innerMetaDataList)) { + for (Object innerMetaDataObject : innerMetaDataList) { + List> approvalLogList = null; + Field[] fields = innerMetaDataObject.getClass().getDeclaredFields(); + for (Field field : fields) { + if (!field.isAccessible()) { + field.setAccessible(true); + } + try { + if (imageMap.get(APPROVAL_FIELD).equals(field.getName()) && field.get(innerMetaDataObject) != null) { + approvalLogList = approvalOperateService.approvalLog(field.get(innerMetaDataObject).toString()); + bindSignPictureKey(filePrintRegister, imageMapList, approvalLogList); + } + } catch (Exception ie) { + throw new BusinessException(500, "字段映射异常"); + } + } + } + } + } + } + } else { + //获取 + List> approvalLogList = approvalOperateService.approvalLog((String) metaDataMap.get(imageMap.get(APPROVAL_FIELD).toString())); + bindSignPictureKey(filePrintRegister, imageMapList, approvalLogList); + } + } + } + + /** + * 构建带有关键字的工作流签名图片方法 + */ + public static void bindSignPictureKey(FilePrintRegister filePrintRegister, List imageMapList, List> approvalLogList) { + if (CollectionUtils.isEmpty(approvalLogList)) { + return; + } + Map> approvalLogMap = null; + approvalLogMap = approvalLogList.stream() + .collect(Collectors.toMap(e -> e.get(0).getTaskName(), e -> e,(e1,e2)->e1)); + //处理文中的章 + if (ObjectUtils.isNotEmpty(approvalLogMap)) { + //处理具备审批标志的 + List approvalImageMapList = imageMapList.stream() + .filter(imagesMap -> "1".equals(imagesMap.get(APPROVAL_FLAG))) + .collect(Collectors.toList()); + filePrintRegister.getElectronicImageList().addAll(ElectronicSignSeal.signNamesCreator(approvalLogMap, filePrintRegister, approvalImageMapList)); + } + } + + /** + * 构建带有关键字的图片方法 + */ + public static void bindPictureKey(FilePrintRegister filePrintRegister, List imageMapList, Map metaDataMap) { + //处理文中的章 + List extendImageMapList = imageMapList.stream() + .filter(imageMap -> "0".equals(imageMap.get(APPROVAL_FLAG))) + .collect(Collectors.toList()); + filePrintRegister.getElectronicImageList().addAll(ElectronicSignSeal.electronicKeySignSeals(extendImageMapList, metaDataMap, filePrintRegister)); + } + /** * 电子签名创建器 */ - private static List signNamesCreator(Map> approvalLogMap, FilePrintRegister filePrintRegister, List approvalImageMapList) { + public static List signNamesCreator(Map> approvalLogMap, FilePrintRegister filePrintRegister, List approvalImageMapList) { + if (CollectionUtils.isEmpty(approvalImageMapList)) { + return null; + } List electronicImageList = new ArrayList<>(); PrintFileRegisterMapper fileRegisterMapper = SpringContextUtil.getBean(PrintFileRegisterMapper.class); + int timeSeqCount = 1; for (int i = 0; i < approvalImageMapList.size(); i++) { //是不是当前的人员,不是就skip if (!approvalLogMap.containsKey(approvalImageMapList.get(i).get(FILED_NAME))) { @@ -106,20 +178,25 @@ final String customizedSignName = (String) approvalImageMapList.get(i).get(DOC_NAME); List approvalLogList = approvalLogMap.get(approvalImageMapList.get(i).get(FILED_NAME)); if (CollectionUtils.isNotEmpty(approvalLogList)) { - approvalLogList.forEach( - approvalLog -> { - ElectronicImage electronicImage = defaultElectronicSignName(customizedSignName); - String signFileName = fileRegisterMapper.getSignFileNameById(approvalLog.getAssigneeId()); - if (StringUtils.isEmpty(signFileName)) { - return; - } - //设置集合 - electronicImage.setElectronicSealImageUrl(filePrintRegister.getTemDir() + signFileName); - //放入待下载的文件集合 - filePrintRegister.getBeDownloadedFileNames().add(signFileName); - electronicImageList.add(electronicImage); - } - ); + + for (ApprovalLogResponse approvalLog : approvalLogList) { + ElectronicImage electronicImage = defaultElectronicSignName(customizedSignName); + String signFileName = fileRegisterMapper.getSignFileNameById(approvalLog.getAssigneeId()); + if (StringUtils.isEmpty(signFileName)) { + continue; + } + //设置时间 + Calendar calendar = Calendar.getInstance(); + calendar.setTime(approvalLog.getFinishTime()); + filePrintRegister.getParams().put("year" + timeSeqCount, calendar.get(Calendar.YEAR)); + filePrintRegister.getParams().put("month" + timeSeqCount, calendar.get(Calendar.MONTH)); + filePrintRegister.getParams().put("day" + timeSeqCount++, calendar.get(Calendar.DAY_OF_YEAR)); + //设置集合 + electronicImage.setElectronicSealImageUrl(filePrintRegister.getTemDir() + signFileName); + //放入待下载的文件集合 + filePrintRegister.getBeDownloadedFileNames().add(signFileName); + electronicImageList.add(electronicImage); + } } } return electronicImageList; diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/ElectronicSignTemplate.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/ElectronicSignTemplate.java index e946f6c..84d294d 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/ElectronicSignTemplate.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/ElectronicSignTemplate.java @@ -47,6 +47,22 @@ } /** + * 默认电子签章的图片设置,允许重写 + */ + public static ElectronicImage defaultElectronicImage(String keyWord) { + ElectronicImage electronicImage = ElectronicImage.builder() + .keyWordIndex(-1) + .keyWord(keyWord) + .vertical(-10f) + .horizontal(10f) + .stampHeight(100f) + .stampWidth(100f) + .diaphaneity(150f) + .build(); + return electronicImage; + } + + /** * 默认电子签名的图片设置,支持重写 */ protected static ElectronicImage defaultElectronicSignName(String keyWord) { diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/FilePrintSupport.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/FilePrintSupport.java index 81c0f1d..aabfa4c 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/FilePrintSupport.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/FilePrintSupport.java @@ -26,6 +26,7 @@ import javax.annotation.Resource; import java.io.File; import java.sql.Timestamp; +import java.text.SimpleDateFormat; import java.util.*; import java.util.stream.Collectors; @@ -50,11 +51,9 @@ Long id, ModuleTemplatePrintConfig moduleTemplatePrintConfig) { FilePrintRegister filePrintRegister = new FilePrintRegister(); templateFileDir = templateFileDir + id + File.separator; - /** - * 查询模板名称,获取 - * - */ + PrintFileRegisterMapper fileRegisterMapper = SpringContextUtil.getBean(PrintFileRegisterMapper.class); + //查询模板id,获取模板的minFileName String templateName = fileRegisterMapper.getTemplateFileById(moduleTemplatePrintConfig.getTemplateFileId()); filePrintRegister.setFileName(templateName); filePrintRegister.setTemDir(templateFileDir); @@ -66,9 +65,20 @@ filePrintRegister.setBeDownloadedFileNames(fileNames); //这里需要添加电子签章 ElectronicSignSeal.electronicNoKeySignSeals(moduleTemplatePrintConfig.getSigns(), filePrintRegister); + //添加默认的参数 + filePrintRegister.setParams(populateDefaultParam()); return filePrintRegister; } + /** + * 新增填充默认参数 + */ + private Map populateDefaultParam() { + Map param = new HashMap<>(); + param.put("currentDate", new SimpleDateFormat("yyyy-MM-dd").format(new Date())); + param.put("currentTime", new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); + return param; + } /** * 获取关联表配置 @@ -99,7 +109,7 @@ protected ModuleTemplatePrintConfig getModuleTemplatePrintConfig(String moduleName, String moduleType) { QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.eq("module_name", moduleName); - queryWrapper.eq(StringUtils.isNotEmpty(moduleType),"module_type", moduleType); + queryWrapper.eq(StringUtils.isNotEmpty(moduleType), "module_type", moduleType); List moduleFieldConfigList = moduleTemplatePrintMapper.selectList(queryWrapper); Optional optionalModuleConfig = moduleFieldConfigList.stream().findFirst(); return optionalModuleConfig.isPresent() ? optionalModuleConfig.get() : null; @@ -166,9 +176,9 @@ } } //处理map中的自带的图片参数 - if(Objects.nonNull(filePrintRegister.getParams())){ + if (Objects.nonNull(filePrintRegister.getParams())) { filePrintRegister.getParams().putAll(customParam); - }else { + } else { filePrintRegister.setParams(customParam); } @@ -389,29 +399,18 @@ private void buildDocImageElement(Map metaDataMap, FilePrintRegister filePrintRegister, String imageJson) { if (StringUtils.isNotEmpty(imageJson)) { //获取审批流程的bean - ApprovalOperateService approvalOperateService = SpringContextUtil.getBean(ApprovalOperateService.class); JSONObject imageMap = JSON.parseObject(imageJson); - Map> approvalLogMap = null; + //处理图片信息 + List imageMapList = (List) imageMap.get(BIND_KEY_LIST); //判断是否有工作流字段(approvalField,工作流map取出 - if (StringUtils.isEmpty(imageMap.get(APPROVAL_FIELD).toString()) && ObjectUtils.isNotEmpty(metaDataMap.get(imageMap.get(APPROVAL_FIELD).toString()))) { - //健壮性校验,没有绑定的list结合去掉 - Assert.isFalse(metaDataMap.containsKey(imageMap.get(APPROVAL_FIELD).toString()), - () -> { - throw new BusinessException(BusinessExceptionEnum.APPROVAL_FIELD_ERROR); - }); - List> approvalLogList = approvalOperateService.approvalLog((String) metaDataMap.get(imageMap.get(APPROVAL_FIELD).toString())); - approvalLogMap = approvalLogList.stream() - .collect(Collectors.toMap(e -> e.get(0).getTaskName(), e -> e)); - } + ElectronicSignSeal.approvalImage(metaDataMap,imageMap,imageMapList,filePrintRegister); //健壮性校验,没有绑定的list结合去掉 Assert.isFalse(ObjectUtils.isEmpty(imageMap.get(BIND_KEY_LIST)), () -> { throw new BusinessException(BusinessExceptionEnum.BIND_KEY_LIST_NULL); }); - //处理图片信息 - List imageMapList = (List) imageMap.get(BIND_KEY_LIST); - //执行构建关键字图片集合 - ElectronicSignSeal.bindPictureKey(filePrintRegister, imageMapList, metaDataMap, approvalLogMap); + //执行构建关键字图片集合,默认为不会在列表中构建图片 + ElectronicSignSeal.bindPictureKey(filePrintRegister, imageMapList, metaDataMap); } } diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/file/PrintFileRegisterMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/file/PrintFileRegisterMapper.java index 733bea5..fcb5685 100644 --- a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/file/PrintFileRegisterMapper.java +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/file/PrintFileRegisterMapper.java @@ -23,7 +23,6 @@ @Select(" SELECT minio_file_name " + " FROM system_sign " + " WHERE sign_user_id =#{signUserId} " + - " AND is_del=0" + " limit 1") String getSignFileNameById(@Param("signUserId") Long signUserId); } diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/PrintFileRegister.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/PrintFileRegister.java index af8a970..dc098f7 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/PrintFileRegister.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/PrintFileRegister.java @@ -2,6 +2,7 @@ import cn.hutool.core.lang.Assert; import com.alibaba.fastjson.JSON; +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.casic.missiles.dto.certificate.FilePrintRegister; import com.casic.missiles.service.listeners.register.data.GenericFilePrintProcessor; import com.casic.missiles.utils.MinioUtil; @@ -81,6 +82,7 @@ if (isPdf) { //默认转为docx,只需要进行docx的替换即可 String pdfNewUrl = printDocUrl.replaceAll("docx", "pdf"); + pdfNewUrl = "天气纪要.pdf"; // 4、将新word转化为pdf文件 FilePrintRegisterUtils.wordToPdf(printDocUrl, pdfNewUrl); printDocUrl = pdfNewUrl; @@ -116,7 +118,7 @@ //封装返回值 byte[] data = out.toByteArray(); response.reset(); - response.setHeader("Content-Disposition", "attachment; filename=\"" + printDocUrl + "\""); + response.setHeader("Content-Disposition", "attachment; filename=" + new String(printDocUrl.getBytes("GBK"), "ISO-8859-1") ); response.addHeader("Content-Length", "" + data.length); response.setHeader("Access-Control-Allow-Origin", "*"); response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE"); diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/ElectronicSignSeal.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/ElectronicSignSeal.java index d1c0ae2..811c250 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/ElectronicSignSeal.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/ElectronicSignSeal.java @@ -1,18 +1,25 @@ package com.casic.missiles.service.listeners.register.data; +import cn.hutool.core.lang.Assert; +import cn.hutool.core.stream.CollectorUtil; +import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.casic.missiles.dto.certificate.ElectronicImage; import com.casic.missiles.dto.certificate.FilePrintRegister; import com.casic.missiles.dto.flowable.ApprovalLogResponse; +import com.casic.missiles.enums.BusinessExceptionEnum; import com.casic.missiles.enums.system.FilePrintEnum; +import com.casic.missiles.exception.BusinessException; import com.casic.missiles.mapper.file.PrintFileRegisterMapper; +import com.casic.missiles.service.flowable.ApprovalOperateService; import com.casic.missiles.utils.SpringContextUtil; import org.apache.commons.collections.CollectionUtils; import org.apache.commons.lang3.StringUtils; +import org.apache.commons.lang3.time.DateFormatUtils; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; +import java.lang.reflect.Field; +import java.sql.Timestamp; +import java.util.*; import java.util.stream.Collectors; /** @@ -20,21 +27,6 @@ */ public class ElectronicSignSeal extends ElectronicSignTemplate implements FilePrintEnum { - /** - * 构建带有关键字的图片方法 - */ - public static void bindPictureKey(FilePrintRegister filePrintRegister, List imageMapList, Map metaDataMap, Map> approvalLogMap) { - //处理具备审批标志的 - List approvalImageMapList = imageMapList.stream() - .filter(imageMap -> "1".equals(imageMap.get(APPROVAL_FLAG))) - .collect(Collectors.toList()); - filePrintRegister.getElectronicImageList().addAll(ElectronicSignSeal.signNamesCreator(approvalLogMap, filePrintRegister, approvalImageMapList)); - //处理文中的章 - List extendImageMapList = imageMapList.stream() - .filter(imageMap -> "0".equals(imageMap.get(APPROVAL_FLAG))) - .collect(Collectors.toList()); - filePrintRegister.getElectronicImageList().addAll(ElectronicSignSeal.electronicKeySignSeals(extendImageMapList, metaDataMap, filePrintRegister)); - } /** * 有关键字的非工作流人员章 @@ -45,7 +37,7 @@ private static List electronicKeySignSeals(List extendImageMapList, Map metaDataMap, FilePrintRegister filePrintRegister) { List electronicImageSeals = new ArrayList<>(); for (Map extendImageMap : extendImageMapList) { - ElectronicImage electronicImage = defaultElectronicSignSeal((String) extendImageMap.get(DOC_NAME)); + ElectronicImage electronicImage = defaultElectronicImage((String) extendImageMap.get(DOC_NAME)); if (metaDataMap.containsKey((String) extendImageMap.get(FILED_NAME)) && ObjectUtils.isNotEmpty(metaDataMap.get(extendImageMap.get(FILED_NAME)))) { electronicImage.setElectronicSealImageUrl(filePrintRegister.getTemDir() + (String) metaDataMap.get(extendImageMap.get(FILED_NAME))); //放入待下载的文件集合 @@ -91,13 +83,93 @@ return electronicImage; } + public static void approvalImage(Map metaDataMap, JSONObject imageMap, List imageMapList, FilePrintRegister filePrintRegister) { + + if (StringUtils.isNotEmpty(imageMap.get(APPROVAL_FIELD).toString())) { + //健壮性校验,没有绑定的list结合去掉 + Assert.isFalse(metaDataMap.containsKey(imageMap.get(APPROVAL_FIELD).toString()), + () -> { + throw new BusinessException(BusinessExceptionEnum.APPROVAL_FIELD_ERROR); + }); + ApprovalOperateService approvalOperateService = SpringContextUtil.getBean(ApprovalOperateService.class); + + if (!metaDataMap.containsKey(imageMap.get(APPROVAL_FIELD).toString())) { + Iterator> it = metaDataMap.entrySet().iterator(); + while (it.hasNext()) { + Map.Entry entry = it.next(); + if (entry.getValue() instanceof List) { + List innerMetaDataList = (List) entry.getValue(); + if (ObjectUtils.isNotEmpty(innerMetaDataList)) { + for (Object innerMetaDataObject : innerMetaDataList) { + List> approvalLogList = null; + Field[] fields = innerMetaDataObject.getClass().getDeclaredFields(); + for (Field field : fields) { + if (!field.isAccessible()) { + field.setAccessible(true); + } + try { + if (imageMap.get(APPROVAL_FIELD).equals(field.getName()) && field.get(innerMetaDataObject) != null) { + approvalLogList = approvalOperateService.approvalLog(field.get(innerMetaDataObject).toString()); + bindSignPictureKey(filePrintRegister, imageMapList, approvalLogList); + } + } catch (Exception ie) { + throw new BusinessException(500, "字段映射异常"); + } + } + } + } + } + } + } else { + //获取 + List> approvalLogList = approvalOperateService.approvalLog((String) metaDataMap.get(imageMap.get(APPROVAL_FIELD).toString())); + bindSignPictureKey(filePrintRegister, imageMapList, approvalLogList); + } + } + } + + /** + * 构建带有关键字的工作流签名图片方法 + */ + public static void bindSignPictureKey(FilePrintRegister filePrintRegister, List imageMapList, List> approvalLogList) { + if (CollectionUtils.isEmpty(approvalLogList)) { + return; + } + Map> approvalLogMap = null; + approvalLogMap = approvalLogList.stream() + .collect(Collectors.toMap(e -> e.get(0).getTaskName(), e -> e,(e1,e2)->e1)); + //处理文中的章 + if (ObjectUtils.isNotEmpty(approvalLogMap)) { + //处理具备审批标志的 + List approvalImageMapList = imageMapList.stream() + .filter(imagesMap -> "1".equals(imagesMap.get(APPROVAL_FLAG))) + .collect(Collectors.toList()); + filePrintRegister.getElectronicImageList().addAll(ElectronicSignSeal.signNamesCreator(approvalLogMap, filePrintRegister, approvalImageMapList)); + } + } + + /** + * 构建带有关键字的图片方法 + */ + public static void bindPictureKey(FilePrintRegister filePrintRegister, List imageMapList, Map metaDataMap) { + //处理文中的章 + List extendImageMapList = imageMapList.stream() + .filter(imageMap -> "0".equals(imageMap.get(APPROVAL_FLAG))) + .collect(Collectors.toList()); + filePrintRegister.getElectronicImageList().addAll(ElectronicSignSeal.electronicKeySignSeals(extendImageMapList, metaDataMap, filePrintRegister)); + } + /** * 电子签名创建器 */ - private static List signNamesCreator(Map> approvalLogMap, FilePrintRegister filePrintRegister, List approvalImageMapList) { + public static List signNamesCreator(Map> approvalLogMap, FilePrintRegister filePrintRegister, List approvalImageMapList) { + if (CollectionUtils.isEmpty(approvalImageMapList)) { + return null; + } List electronicImageList = new ArrayList<>(); PrintFileRegisterMapper fileRegisterMapper = SpringContextUtil.getBean(PrintFileRegisterMapper.class); + int timeSeqCount = 1; for (int i = 0; i < approvalImageMapList.size(); i++) { //是不是当前的人员,不是就skip if (!approvalLogMap.containsKey(approvalImageMapList.get(i).get(FILED_NAME))) { @@ -106,20 +178,25 @@ final String customizedSignName = (String) approvalImageMapList.get(i).get(DOC_NAME); List approvalLogList = approvalLogMap.get(approvalImageMapList.get(i).get(FILED_NAME)); if (CollectionUtils.isNotEmpty(approvalLogList)) { - approvalLogList.forEach( - approvalLog -> { - ElectronicImage electronicImage = defaultElectronicSignName(customizedSignName); - String signFileName = fileRegisterMapper.getSignFileNameById(approvalLog.getAssigneeId()); - if (StringUtils.isEmpty(signFileName)) { - return; - } - //设置集合 - electronicImage.setElectronicSealImageUrl(filePrintRegister.getTemDir() + signFileName); - //放入待下载的文件集合 - filePrintRegister.getBeDownloadedFileNames().add(signFileName); - electronicImageList.add(electronicImage); - } - ); + + for (ApprovalLogResponse approvalLog : approvalLogList) { + ElectronicImage electronicImage = defaultElectronicSignName(customizedSignName); + String signFileName = fileRegisterMapper.getSignFileNameById(approvalLog.getAssigneeId()); + if (StringUtils.isEmpty(signFileName)) { + continue; + } + //设置时间 + Calendar calendar = Calendar.getInstance(); + calendar.setTime(approvalLog.getFinishTime()); + filePrintRegister.getParams().put("year" + timeSeqCount, calendar.get(Calendar.YEAR)); + filePrintRegister.getParams().put("month" + timeSeqCount, calendar.get(Calendar.MONTH)); + filePrintRegister.getParams().put("day" + timeSeqCount++, calendar.get(Calendar.DAY_OF_YEAR)); + //设置集合 + electronicImage.setElectronicSealImageUrl(filePrintRegister.getTemDir() + signFileName); + //放入待下载的文件集合 + filePrintRegister.getBeDownloadedFileNames().add(signFileName); + electronicImageList.add(electronicImage); + } } } return electronicImageList; diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/ElectronicSignTemplate.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/ElectronicSignTemplate.java index e946f6c..84d294d 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/ElectronicSignTemplate.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/ElectronicSignTemplate.java @@ -47,6 +47,22 @@ } /** + * 默认电子签章的图片设置,允许重写 + */ + public static ElectronicImage defaultElectronicImage(String keyWord) { + ElectronicImage electronicImage = ElectronicImage.builder() + .keyWordIndex(-1) + .keyWord(keyWord) + .vertical(-10f) + .horizontal(10f) + .stampHeight(100f) + .stampWidth(100f) + .diaphaneity(150f) + .build(); + return electronicImage; + } + + /** * 默认电子签名的图片设置,支持重写 */ protected static ElectronicImage defaultElectronicSignName(String keyWord) { diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/FilePrintSupport.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/FilePrintSupport.java index 81c0f1d..aabfa4c 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/FilePrintSupport.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/FilePrintSupport.java @@ -26,6 +26,7 @@ import javax.annotation.Resource; import java.io.File; import java.sql.Timestamp; +import java.text.SimpleDateFormat; import java.util.*; import java.util.stream.Collectors; @@ -50,11 +51,9 @@ Long id, ModuleTemplatePrintConfig moduleTemplatePrintConfig) { FilePrintRegister filePrintRegister = new FilePrintRegister(); templateFileDir = templateFileDir + id + File.separator; - /** - * 查询模板名称,获取 - * - */ + PrintFileRegisterMapper fileRegisterMapper = SpringContextUtil.getBean(PrintFileRegisterMapper.class); + //查询模板id,获取模板的minFileName String templateName = fileRegisterMapper.getTemplateFileById(moduleTemplatePrintConfig.getTemplateFileId()); filePrintRegister.setFileName(templateName); filePrintRegister.setTemDir(templateFileDir); @@ -66,9 +65,20 @@ filePrintRegister.setBeDownloadedFileNames(fileNames); //这里需要添加电子签章 ElectronicSignSeal.electronicNoKeySignSeals(moduleTemplatePrintConfig.getSigns(), filePrintRegister); + //添加默认的参数 + filePrintRegister.setParams(populateDefaultParam()); return filePrintRegister; } + /** + * 新增填充默认参数 + */ + private Map populateDefaultParam() { + Map param = new HashMap<>(); + param.put("currentDate", new SimpleDateFormat("yyyy-MM-dd").format(new Date())); + param.put("currentTime", new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); + return param; + } /** * 获取关联表配置 @@ -99,7 +109,7 @@ protected ModuleTemplatePrintConfig getModuleTemplatePrintConfig(String moduleName, String moduleType) { QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.eq("module_name", moduleName); - queryWrapper.eq(StringUtils.isNotEmpty(moduleType),"module_type", moduleType); + queryWrapper.eq(StringUtils.isNotEmpty(moduleType), "module_type", moduleType); List moduleFieldConfigList = moduleTemplatePrintMapper.selectList(queryWrapper); Optional optionalModuleConfig = moduleFieldConfigList.stream().findFirst(); return optionalModuleConfig.isPresent() ? optionalModuleConfig.get() : null; @@ -166,9 +176,9 @@ } } //处理map中的自带的图片参数 - if(Objects.nonNull(filePrintRegister.getParams())){ + if (Objects.nonNull(filePrintRegister.getParams())) { filePrintRegister.getParams().putAll(customParam); - }else { + } else { filePrintRegister.setParams(customParam); } @@ -389,29 +399,18 @@ private void buildDocImageElement(Map metaDataMap, FilePrintRegister filePrintRegister, String imageJson) { if (StringUtils.isNotEmpty(imageJson)) { //获取审批流程的bean - ApprovalOperateService approvalOperateService = SpringContextUtil.getBean(ApprovalOperateService.class); JSONObject imageMap = JSON.parseObject(imageJson); - Map> approvalLogMap = null; + //处理图片信息 + List imageMapList = (List) imageMap.get(BIND_KEY_LIST); //判断是否有工作流字段(approvalField,工作流map取出 - if (StringUtils.isEmpty(imageMap.get(APPROVAL_FIELD).toString()) && ObjectUtils.isNotEmpty(metaDataMap.get(imageMap.get(APPROVAL_FIELD).toString()))) { - //健壮性校验,没有绑定的list结合去掉 - Assert.isFalse(metaDataMap.containsKey(imageMap.get(APPROVAL_FIELD).toString()), - () -> { - throw new BusinessException(BusinessExceptionEnum.APPROVAL_FIELD_ERROR); - }); - List> approvalLogList = approvalOperateService.approvalLog((String) metaDataMap.get(imageMap.get(APPROVAL_FIELD).toString())); - approvalLogMap = approvalLogList.stream() - .collect(Collectors.toMap(e -> e.get(0).getTaskName(), e -> e)); - } + ElectronicSignSeal.approvalImage(metaDataMap,imageMap,imageMapList,filePrintRegister); //健壮性校验,没有绑定的list结合去掉 Assert.isFalse(ObjectUtils.isEmpty(imageMap.get(BIND_KEY_LIST)), () -> { throw new BusinessException(BusinessExceptionEnum.BIND_KEY_LIST_NULL); }); - //处理图片信息 - List imageMapList = (List) imageMap.get(BIND_KEY_LIST); - //执行构建关键字图片集合 - ElectronicSignSeal.bindPictureKey(filePrintRegister, imageMapList, metaDataMap, approvalLogMap); + //执行构建关键字图片集合,默认为不会在列表中构建图片 + ElectronicSignSeal.bindPictureKey(filePrintRegister, imageMapList, metaDataMap); } } diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/GenericFilePrintProcessor.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/GenericFilePrintProcessor.java index 581b704..f09f07d 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/GenericFilePrintProcessor.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/GenericFilePrintProcessor.java @@ -36,9 +36,13 @@ Assert.isFalse(ObjectUtils.isEmpty(moduleTemplatePrintConfig.getTemplateFileId()), () -> { throw new BusinessException(BusinessExceptionEnum.TEMPLATE_FILE_NULL); }); + //根据打印模板配置,初始化文件打印注册信息 FilePrintRegister filePrintRegister = initialization(templateFileDir, moduleIdValue, moduleTemplatePrintConfig); - if (ObjectUtils.isNotEmpty(customParam)) { + if (customParam != null) { + Assert.isFalse(ObjectUtils.isEmpty(customParam), () -> { + throw new RuntimeException("没有文件数据,请确保有数据后重试!"); + }); //定制化的参数处理 moduleCustomizedProcessing(filePrintRegister, customParam, moduleTemplatePrintConfig); return filePrintRegister; @@ -62,6 +66,7 @@ } } } + return filePrintRegister; }