Bläddra i källkod

1.用户设定上传的电签图片尺寸并预览2.后管wbs配置电签 区分系统识别和电签配置3.修复用户账号没有分配计量系统却可以登录计量系统

DengLinLang 5 månader sedan
förälder
incheckning
e95045d4d6
17 ändrade filer med 617 tillägg och 44 borttagningar
  1. 4 4
      blade-auth/src/main/java/org/springblade/auth/service/BladeUserDetailsServiceImpl.java
  2. 2 3
      blade-ops/blade-resource/src/main/java/org/springblade/resource/builder/oss/OssBuilder.java
  3. 8 4
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/entity/SignPfxFile.java
  4. 37 0
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/entity/SignPfxFilePre.java
  5. 10 0
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/SignPfxFilePreVo.java
  6. 6 3
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/SignPfxFileVO.java
  7. 2 0
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/TextdictInfoVO.java
  8. 94 1
      blade-service/blade-business/src/main/java/org/springblade/business/service/impl/TrialSelfInspectionRecordServiceImpl.java
  9. 79 13
      blade-service/blade-manager/src/main/java/org/springblade/manager/controller/SignPfxFileController.java
  10. 2 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/SignPfxFileMapper.xml
  11. 25 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/SignPfxFilePreMapper.java
  12. 75 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/SignPfxFilePreMapper.xml
  13. 13 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/ISignPfxFilePreService.java
  14. 163 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/SignPfxFilePreServiceImpl.java
  15. 9 15
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/TextdictInfoServiceImpl.java
  16. 46 1
      blade-service/blade-manager/src/main/java/org/springblade/manager/utils/FileUtils.java
  17. 42 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/utils/PdfAddimgUtil.java

+ 4 - 4
blade-auth/src/main/java/org/springblade/auth/service/BladeUserDetailsServiceImpl.java

@@ -287,10 +287,10 @@ public class BladeUserDetailsServiceImpl implements UserDetailsService {
                 || (("2").equals(result) && user.getUserType().contains("2")) //app
                 || (("3").equals(result) && user.getUserType().contains("3")) //档案
                 || (("4").equals(result) && user.getUserType().contains("4")) //后管
-                || (("5").equals(result)) // 成本管控系统
-                || (("6").equals(result)) // 征拆系统
-                || (("7").equals(result)) // 计量系统
-                || (("8").equals(result)) // 安全
+                || (("5").equals(result) && user.getUserType().contains("5")) // 成本管控系统
+                || (("6").equals(result) && user.getUserType().contains("6")) // 征拆系统
+                || (("7").equals(result) && user.getUserType().contains("7")) // 计量系统
+                || (("8").equals(result) && user.getUserType().contains("8")) // 安全
         ) {
             //放行
             return;

+ 2 - 3
blade-ops/blade-resource/src/main/java/org/springblade/resource/builder/oss/OssBuilder.java

@@ -84,8 +84,8 @@ public class OssBuilder {
     public OssTemplateRe template(String code) {
         String tenantId = AuthUtil.getTenantId();
         Oss oss = getOss(tenantId, code);
-        oss.setEndpoint("http://183.247.216.148:9000/");
-      // oss.setEndpoint("https://oss-cn-shenzhen.aliyuncs.com/");
+        //oss.setEndpoint("http://183.247.216.148:9000/");
+       oss.setEndpoint("https://oss-cn-shenzhen.aliyuncs.com/");
         Oss ossCached = ossPool.get(tenantId);
         OssTemplateRe template = templatePool.get(tenantId);
         // 若为空或者不一致,则重新加载
@@ -100,7 +100,6 @@ public class OssBuilder {
                     } else {
                         ossRule = new BladeOssRule(Boolean.FALSE);
                     }
-
                     //获取对象
                    if (oss.getCategory() == OssEnum.MINIO.getCategory()) {
                         template = MinioOssBuilder.template(oss, ossRule);

+ 8 - 4
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/entity/SignPfxFile.java

@@ -17,13 +17,10 @@
 package org.springblade.manager.entity;
 
 import com.baomidou.mybatisplus.annotation.TableName;
-
-import java.io.Serializable;
-
 import io.swagger.annotations.ApiModelProperty;
-import org.springblade.core.mp.base.BaseEntity;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
+import org.springblade.core.mp.base.BaseEntity;
 
 /**
  * 个人/企业证书信息表实体类
@@ -103,4 +100,11 @@ public class SignPfxFile extends BaseEntity {
     @ApiModelProperty("企业章类型")
     private String pfxType;
 
+    @ApiModelProperty("图片尺寸宽度")
+    private Double wide;
+
+    @ApiModelProperty("图片尺寸高度")
+    private Double high;
+
+
 }

+ 37 - 0
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/entity/SignPfxFilePre.java

@@ -0,0 +1,37 @@
+package org.springblade.manager.entity;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * 
+ * @TableName m_sign_pfx_file_pre
+ */
+
+@Data
+public class SignPfxFilePre implements Serializable {
+    /**
+     * id
+     */
+    private Long id;
+
+    /**
+     * 签名图片地址
+     */
+    private String signaturePngUrl;
+
+    /**
+     * 宽度
+     */
+    private Double wide;
+
+    /**
+     * 高度
+     */
+    private Double high;
+
+    private static final long serialVersionUID = 1L;
+
+
+}

+ 10 - 0
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/SignPfxFilePreVo.java

@@ -0,0 +1,10 @@
+package org.springblade.manager.vo;
+
+import lombok.Data;
+import org.springblade.manager.entity.SignPfxFilePre;
+import org.springframework.web.multipart.MultipartFile;
+
+@Data
+public class SignPfxFilePreVo extends SignPfxFilePre {
+    private MultipartFile file;
+}

+ 6 - 3
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/SignPfxFileVO.java

@@ -17,12 +17,11 @@
 package org.springblade.manager.vo;
 
 import io.swagger.annotations.ApiModelProperty;
-import org.springblade.manager.entity.SignPfxDeputy;
-import org.springblade.manager.entity.SignPfxFile;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
+import org.springblade.manager.entity.SignPfxDeputy;
+import org.springblade.manager.entity.SignPfxFile;
 
-import java.util.ArrayList;
 import java.util.List;
 
 /**
@@ -56,5 +55,9 @@ public class SignPfxFileVO extends SignPfxFile {
     private List<SignPfxDeputy> signPfxDeputieList;
 
     private String key;
+    //图片尺寸宽度
+    private Double  wide;
+    //图片尺寸高度
+    private Double  high;
 
 }

+ 2 - 0
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/TextdictInfoVO.java

@@ -32,4 +32,6 @@ public class TextdictInfoVO extends TextdictInfo {
     private static final long serialVersionUID = 1L;
 
     private String parentRoleId;
+    //1.电签配置 2.系统识别
+    private Integer showType;
 }

+ 94 - 1
blade-service/blade-business/src/main/java/org/springblade/business/service/impl/TrialSelfInspectionRecordServiceImpl.java

@@ -55,6 +55,7 @@ import org.springblade.system.entity.Dict;
 import org.springblade.system.feign.IDictClient;
 import org.springblade.system.user.entity.User;
 import org.springblade.system.user.feign.IUserClient;
+import org.springframework.dao.DataAccessException;
 import org.springframework.jdbc.core.BeanPropertyRowMapper;
 import org.springframework.jdbc.core.JdbcTemplate;
 import org.springframework.scheduling.annotation.Async;
@@ -176,7 +177,7 @@ public class TrialSelfInspectionRecordServiceImpl extends BaseServiceImpl<TrialS
                     record.setEntrustNo(entrustInfo.getEntrustNo());
                 }
                 //合并的pdfUrl
-                String pdf = this.getMergePdfToTrial(record.getContractId(), record.getId());
+                String pdf = this.getMergePdfToTrialNew(record.getContractId(), record.getId());
                 record.setPdfUrl(pdf);
             }
 
@@ -248,6 +249,98 @@ public class TrialSelfInspectionRecordServiceImpl extends BaseServiceImpl<TrialS
         return "";
     }
 
+    /**
+     *新增返回该试验材料报告关联的委托单pdf也拼接在后面
+     * @param contractId
+     * @param nodeId
+     * @return
+     * @throws FileNotFoundException
+     */
+    private String getMergePdfToTrialNew(Long contractId, Long nodeId) throws FileNotFoundException {
+        String sql = "select pdf_url,e_visa_pdf_url from u_information_query where wbs_id='" + nodeId + "' and contract_id ='" + contractId + "'";
+        List<Map<String, Object>> maps = jdbcTemplate.queryForList(sql);
+        if (maps.size() >= 1) {
+            Map<String, Object> stringObjectMap = maps.get(0);
+            Object pdfUrl = stringObjectMap.get("pdf_url");
+
+            if (stringObjectMap.get("e_visa_pdf_url") != null) {
+                //优先使用电签的pdf
+                pdfUrl = stringObjectMap.get("e_visa_pdf_url");
+            }
+            String entrustPdfUrl = "";
+            //关联的委托单pdf
+            String sqlEntrust = "select entrust_id from u_trial_self_inspection_record where is_deleted = 0 and id = "+nodeId ;
+            TrialSelfInspectionRecord record = jdbcTemplate.queryForObject(sqlEntrust, new BeanPropertyRowMapper<>(TrialSelfInspectionRecord.class));
+            if(ObjectUtil.isNotEmpty(record) && ObjectUtil.isNotEmpty(record.getEntrustId()) && record.getEntrustId() != 0){
+                String sqlEntrustPdf = "select entrust_pdf from u_entrust_info where is_deleted = 0 and id = "+record.getEntrustId();
+                try {
+                    entrustPdfUrl = jdbcTemplate.queryForObject(sqlEntrustPdf, String.class);
+                } catch (DataAccessException e) {
+                    entrustPdfUrl = "";
+                }
+            }
+            
+            //关联原材料检测报告的pdf(合并后的dpf都一样,取其一)
+            String sqlRecord = "select old_pdf_url from u_trial_raw_material_self_record where self_record_id =" + nodeId;
+            TrialRawMaterialSelfRecord recordObj = jdbcTemplate.query(sqlRecord, new BeanPropertyRowMapper<>(TrialRawMaterialSelfRecord.class)).stream().findAny().orElse(null);
+            if (pdfUrl != null && recordObj != null && recordObj.getOldPdfUrl() != null) {
+                String pdfUrlTrialRawMaterial = recordObj.getOldPdfUrl();
+                List<String> pdfList = new ArrayList<>();
+                //试验原始pdf
+                pdfList.add(pdfUrl.toString());
+                //材料检测报告pdf
+                pdfList.add(pdfUrlTrialRawMaterial);
+                //委托单pdf
+                if(ObjectUtil.isNotEmpty(entrustPdfUrl)){
+                    pdfList.add(entrustPdfUrl);
+                }
+                String file_path = FileUtils.getSysLocalFileUrl();
+                Long id = SnowFlakeUtil.getId();
+                String trialPdf = file_path + "/pdf/" + id + ".pdf";
+                File trialPdf2 = ResourceUtil.getFile(trialPdf);
+                if (trialPdf2.exists()) {
+                    trialPdf2.delete();
+                }
+                if (pdfList.size() > 0) {
+                    //合并当前所有选择的试验pdf
+                    FileUtils.mergePdfPublicMethods(pdfList, trialPdf);
+                    BladeFile bladeFile = this.newIOSSClient.uploadFile(id + ".pdf", trialPdf);
+                    if (bladeFile != null && ObjectUtils.isNotEmpty(bladeFile.getLink())) {
+                        pdfUrl = bladeFile.getLink();
+                        return pdfUrl.toString();
+                    }
+                }
+            }
+            assert pdfUrl != null;
+            //拼接委托单pdf
+            if(ObjectUtil.isNotEmpty(entrustPdfUrl)){
+                List<String> pdfList = new ArrayList<>();
+                //试验原始pdf
+                pdfList.add(pdfUrl.toString());
+                //委托单pdf
+                pdfList.add(entrustPdfUrl);
+                String file_path = FileUtils.getSysLocalFileUrl();
+                Long id = SnowFlakeUtil.getId();
+                String trialPdf = file_path + "/pdf/" + id + ".pdf";
+                File trialPdf2 = ResourceUtil.getFile(trialPdf);
+                if (trialPdf2.exists()) {
+                    trialPdf2.delete();
+                }
+                if (pdfList.size() > 0) {
+                    //合并当前所有选择的试验pdf
+                    FileUtils.mergePdfPublicMethods(pdfList, trialPdf);
+                    BladeFile bladeFile = this.newIOSSClient.uploadFile(id + ".pdf", trialPdf);
+                    if (bladeFile != null && ObjectUtils.isNotEmpty(bladeFile.getLink())) {
+                        pdfUrl = bladeFile.getLink();
+                        return pdfUrl.toString();
+                    }
+            }}
+
+            return pdfUrl.toString();
+        }
+        return "";
+    }
+
     @Override
     public List<TrialRecordAncillaryDocumentsVO> selfAncillaryDocumentsList(String id, String type) {
         //关联取样附件

+ 79 - 13
blade-service/blade-manager/src/main/java/org/springblade/manager/controller/SignPfxFileController.java

@@ -18,17 +18,18 @@ package org.springblade.manager.controller;
 
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
 import com.mixsmart.utils.StringUtils;
 import io.swagger.annotations.*;
-import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
 import lombok.AllArgsConstructor;
-
-import javax.validation.Valid;
-
+import okhttp3.OkHttpClient;
 import org.springblade.common.utils.SnowFlakeUtil;
+import org.springblade.core.boot.ctrl.BladeController;
 import org.springblade.core.mp.support.Condition;
 import org.springblade.core.mp.support.Query;
+import org.springblade.core.oss.model.BladeFile;
 import org.springblade.core.secure.utils.AuthUtil;
 import org.springblade.core.tool.api.R;
 import org.springblade.core.tool.utils.Func;
@@ -36,7 +37,10 @@ import org.springblade.manager.dto.SaveUserInfoByProjectDTO;
 import org.springblade.manager.entity.*;
 import org.springblade.manager.feign.ProjectAssignmentUserClient;
 import org.springblade.manager.service.*;
+import org.springblade.manager.utils.FileUtils;
 import org.springblade.manager.vo.*;
+import org.springblade.resource.feign.IOSSClient;
+import org.springblade.resource.feign.NewIOSSClient;
 import org.springblade.system.entity.DictBiz;
 import org.springblade.system.entity.Role;
 import org.springblade.system.feign.IDictBizClient;
@@ -45,14 +49,12 @@ import org.springblade.system.user.entity.User;
 import org.springblade.system.user.feign.IUserClient;
 import org.springblade.system.vo.RoleVO;
 import org.springframework.web.bind.annotation.*;
-import org.springframework.web.bind.annotation.RequestParam;
-import com.baomidou.mybatisplus.core.metadata.IPage;
-import org.springblade.core.boot.ctrl.BladeController;
+import org.springframework.web.multipart.MultipartFile;
 
-import java.util.ArrayList;
-import java.util.Date;
-import java.util.Iterator;
-import java.util.List;
+import javax.validation.Valid;
+import java.io.File;
+import java.io.IOException;
+import java.util.*;
 import java.util.stream.Collectors;
 
 /**
@@ -85,6 +87,11 @@ public class SignPfxFileController extends BladeController {
 
     private final ProjectAssignmentUserClient projectAssignmentUserClient;
 
+    private final ISignPfxFilePreService pfxFilePreService;
+    private final NewIOSSClient newIOSSClient;
+    private final IOSSClient iossClient;
+    private final OkHttpClient.Builder okHttpClientBuilder;
+
     /**
      * 根据合同段ID获取项目下的所有合同段
      *
@@ -439,11 +446,70 @@ public class SignPfxFileController extends BladeController {
         return R.status(this.signPfxFileService.save(vo));
     }
 
+    /**
+     * 测试删除接口 无用
+     * @param type
+     * @return
+     */
+/*    @GetMapping("/deltest")
+    public R<Boolean> deltest(@RequestParam Integer type) {
+        if(type==1){
+            newIOSSClient.removeFile("https://blade-oss-chongqing.oss-cn-shenzhen.aliyuncs.com//upload/20241009/51c1e44a42ffefd6451ece7e4716077a.png");
+        }else if(type==2){
+            newIOSSClient.removeFile("357e9df39fafd5b342d36222b5624242.png");
+        }else {
+            newIOSSClient.removeFile("/upload/20241009/51c1e44a42ffefd6451ece7e4716077a.png");
+        }
+        return R.data(true);
+    }*/
+
+    /**
+     * 根据用户设定尺寸压缩图片后上传至oss
+     */
+    @PostMapping("/compressAndUpload")
+    public R<BladeFile> compressAndUpload(@RequestParam MultipartFile file, @RequestParam double wide,@RequestParam double high) throws Exception {
+        String file_path = FileUtils.getSysLocalFileUrl();
+        String localImgPath = file_path + "print//" + UUID.randomUUID() + ".png";
+        // 检查文件是否存在
+        File newFile = new File(localImgPath);
+        if (!newFile.exists()) {
+            // 如果文件不存在,则创建目录
+            File parentDir = newFile.getParentFile();
+            if (parentDir != null && !parentDir.exists()) {
+                parentDir.mkdirs();
+            }
+        }
+        // 保存文件
+        file.transferTo(newFile);
+        //图片压缩后的地址
+        UUID uuid = UUID.randomUUID();
+        String compressImgPath = file_path + "/print//" + uuid + ".png";
+        FileUtils.compressImage(localImgPath, compressImgPath, wide, high);
+        return R.data(newIOSSClient.uploadFile(uuid+".png", compressImgPath));
+    }
+    @PostMapping("/picPresave")
+    @ApiOperationSupport(order = 3)
+    @ApiOperation(value = "预览图片新增准备", notes = "传入signPfxFile")
+    public R picPresave( @RequestParam MultipartFile file, @RequestParam double wide,@RequestParam double high) throws IOException {
+        SignPfxFilePreVo signPfxFilePreVo = new SignPfxFilePreVo();
+        signPfxFilePreVo.setFile(file);
+        signPfxFilePreVo.setWide(wide);
+        signPfxFilePreVo.setHigh(high);
+        return pfxFilePreService.picPresave(signPfxFilePreVo);
+    }
+    @PostMapping ("/prePicture")
+    @ApiOperationSupport(order = 4)
+    @ApiOperation(value = "预览电签后的图片", notes = "传入signPfxFile")
+    public R prePicture( @RequestBody SignPfxFilePre signPfxFilePre) throws Exception {
+        return pfxFilePreService.prePicture(signPfxFilePre);
+    }
+
+
     /**
      * 修改 个人/企业证书信息表
      */
     @PostMapping("/update")
-    @ApiOperationSupport(order = 3)
+    @ApiOperationSupport(order = 5)
     @ApiOperation(value = "修改", notes = "传入signPfxFile")
     public R<Boolean> update(@Valid @RequestBody SignPfxFileVO vo) {
         if (new Integer("2").equals(vo.getCertificateType())||new Integer("3").equals(vo.getCertificateType())) {
@@ -497,7 +563,7 @@ public class SignPfxFileController extends BladeController {
      * 删除 个人/企业证书信息表
      */
     @PostMapping("/remove")
-    @ApiOperationSupport(order = 4)
+    @ApiOperationSupport(order = 6)
     @ApiOperation(value = "逻辑删除", notes = "传入ids")
     public R<Boolean> remove(@ApiParam(value = "主键集合", required = true) @RequestParam String ids) {
         return R.status(this.signPfxFileService.deleteLogic(Func.toLongList(ids)));

+ 2 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/SignPfxFileMapper.xml

@@ -26,6 +26,8 @@
         <result column="is_register" property="isRegister"/>
         <result column="project_contract_role" property="projectContractRole"/>
         <result column="pfx_type" property="pfxType"/>
+        <result column="wide" property="wide"/>
+        <result column="high" property="high"/>
     </resultMap>
 
     <select id="queryPersonalOrEnterpriseCount" resultType="java.lang.Integer">

+ 25 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/SignPfxFilePreMapper.java

@@ -0,0 +1,25 @@
+package org.springblade.manager.mapper;
+
+import org.springblade.manager.entity.SignPfxFilePre;
+
+/**
+* @author 17617
+* @description 针对表【m_sign_pfx_file_pre】的数据库操作Mapper
+* @createDate 2024-09-30 16:04:50
+* @Entity org.springblade.manager.entity.SignPfxFilePre
+*/
+public interface SignPfxFilePreMapper {
+
+    int deleteByPrimaryKey(Long id);
+
+    int insert(SignPfxFilePre record);
+
+    int insertSelective(SignPfxFilePre record);
+
+    SignPfxFilePre selectByPrimaryKey(Long id);
+
+    int updateByPrimaryKeySelective(SignPfxFilePre record);
+
+    int updateByPrimaryKey(SignPfxFilePre record);
+
+}

+ 75 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/SignPfxFilePreMapper.xml

@@ -0,0 +1,75 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper
+        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="org.springblade.manager.mapper.SignPfxFilePreMapper">
+
+    <resultMap id="BaseResultMap" type="org.springblade.manager.entity.SignPfxFilePre">
+            <id property="id" column="id" jdbcType="BIGINT"/>
+            <result property="signaturePngUrl" column="signature_png_url" jdbcType="VARCHAR"/>
+            <result property="wide" column="wide" jdbcType="DOUBLE"/>
+            <result property="high" column="high" jdbcType="DOUBLE"/>
+    </resultMap>
+
+    <sql id="Base_Column_List">
+        id,signature_png_url,wide,
+        high
+    </sql>
+
+    <select id="selectByPrimaryKey" parameterType="java.lang.Long" resultMap="BaseResultMap">
+        select
+        <include refid="Base_Column_List" />
+        from m_sign_pfx_file_pre
+        where  id = #{id,jdbcType=BIGINT} 
+    </select>
+
+    <delete id="deleteByPrimaryKey" parameterType="java.lang.Long">
+        delete from m_sign_pfx_file_pre
+        where  id = #{id,jdbcType=BIGINT} 
+    </delete>
+    <insert id="insert" keyColumn="id" keyProperty="id" parameterType="org.springblade.manager.entity.SignPfxFilePre" useGeneratedKeys="true">
+        insert into m_sign_pfx_file_pre
+        ( id,signature_png_url,wide
+        ,high)
+        values (#{id,jdbcType=BIGINT},#{signaturePngUrl,jdbcType=VARCHAR},#{wide,jdbcType=DOUBLE}
+        ,#{high,jdbcType=DOUBLE})
+    </insert>
+    <insert id="insertSelective" keyColumn="id" keyProperty="id" parameterType="org.springblade.manager.entity.SignPfxFilePre" useGeneratedKeys="true">
+        insert into m_sign_pfx_file_pre
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+                <if test="id != null">id,</if>
+                <if test="signaturePngUrl != null">signature_png_url,</if>
+                <if test="wide != null">wide,</if>
+                <if test="high != null">high,</if>
+        </trim>
+        <trim prefix="values (" suffix=")" suffixOverrides=",">
+                <if test="id != null">#{id,jdbcType=BIGINT},</if>
+                <if test="signaturePngUrl != null">#{signaturePngUrl,jdbcType=VARCHAR},</if>
+                <if test="wide != null">#{wide,jdbcType=DOUBLE},</if>
+                <if test="high != null">#{high,jdbcType=DOUBLE},</if>
+        </trim>
+    </insert>
+    <update id="updateByPrimaryKeySelective" parameterType="org.springblade.manager.entity.SignPfxFilePre">
+        update m_sign_pfx_file_pre
+        <set>
+                <if test="signaturePngUrl != null">
+                    signature_png_url = #{signaturePngUrl,jdbcType=VARCHAR},
+                </if>
+                <if test="wide != null">
+                    wide = #{wide,jdbcType=DOUBLE},
+                </if>
+                <if test="high != null">
+                    high = #{high,jdbcType=DOUBLE},
+                </if>
+        </set>
+        where   id = #{id,jdbcType=BIGINT} 
+    </update>
+    <update id="updateByPrimaryKey" parameterType="org.springblade.manager.entity.SignPfxFilePre">
+        update m_sign_pfx_file_pre
+        set 
+            signature_png_url =  #{signaturePngUrl,jdbcType=VARCHAR},
+            wide =  #{wide,jdbcType=DOUBLE},
+            high =  #{high,jdbcType=DOUBLE}
+        where   id = #{id,jdbcType=BIGINT} 
+    </update>
+</mapper>

+ 13 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/service/ISignPfxFilePreService.java

@@ -0,0 +1,13 @@
+package org.springblade.manager.service;
+
+import org.springblade.core.tool.api.R;
+import org.springblade.manager.entity.SignPfxFilePre;
+import org.springblade.manager.vo.SignPfxFilePreVo;
+
+import java.io.IOException;
+
+public interface ISignPfxFilePreService {
+    R picPresave(SignPfxFilePreVo signPfxFilePreVo) throws IOException;
+
+    R prePicture(SignPfxFilePre signPfxFilePre) throws Exception;
+}

+ 163 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/SignPfxFilePreServiceImpl.java

@@ -0,0 +1,163 @@
+package org.springblade.manager.service.impl;
+
+import org.apache.commons.lang.StringUtils;
+import org.apache.commons.lang3.ObjectUtils;
+import org.apache.poi.ss.usermodel.*;
+import org.apache.poi.xssf.usermodel.XSSFWorkbook;
+import org.jsoup.Jsoup;
+import org.jsoup.nodes.Document;
+import org.jsoup.nodes.Element;
+import org.jsoup.select.Elements;
+import org.springblade.common.utils.CommonUtil;
+import org.springblade.core.ribbon.utils.BeanUtil;
+import org.springblade.core.tool.api.R;
+import org.springblade.core.tool.utils.Func;
+import org.springblade.core.tool.utils.IoUtil;
+import org.springblade.core.tool.utils.ResourceUtil;
+import org.springblade.manager.entity.SignPfxFilePre;
+import org.springblade.manager.entity.TextdictInfo;
+import org.springblade.manager.mapper.SignPfxFilePreMapper;
+import org.springblade.manager.service.ISignPfxFilePreService;
+import org.springblade.manager.utils.FileUtils;
+import org.springblade.manager.utils.PdfAddimgUtil;
+import org.springblade.manager.vo.SignPfxFilePreVo;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.*;
+
+@Service
+public class SignPfxFilePreServiceImpl implements ISignPfxFilePreService {
+    @Autowired
+    private SignPfxFilePreMapper signPfxFilePreMapper;
+
+    private final String excelTabFileUrl = "https://blade-oss-chongqing.oss-cn-shenzhen.aliyuncs.com//upload/20240731/cf9534fd3ac688df5f9d7a802ba754c0.xlsx";
+    private final String wbsHtmlUrl = "/www/wwwroot/Users/hongchuangyanfa/Desktop/privateUrl/1771066158930198528.html";
+    @Autowired
+    private BeanUtil beanUtil;
+
+
+    @Override
+    public R picPresave(SignPfxFilePreVo vo) throws IOException {
+        MultipartFile file1 = vo.getFile();
+        //图片保存到本地
+        String file_path = FileUtils.getSysLocalFileUrl();
+        String localImgPath = file_path + "print//" + UUID.randomUUID() + ".png";
+            // 检查文件是否存在
+            File file = new File(localImgPath);
+            if (!file.exists()) {
+                // 如果文件不存在,则创建目录
+                File parentDir = file.getParentFile();
+                if (parentDir != null && !parentDir.exists()) {
+                    parentDir.mkdirs();
+                }
+            }
+        // 保存文件
+        file1.transferTo(file);
+        SignPfxFilePre signPfxFilePre = new SignPfxFilePre();
+        org.springblade.core.tool.utils.BeanUtil.copyProperties(vo, signPfxFilePre);
+        signPfxFilePre.setSignaturePngUrl(localImgPath);
+        signPfxFilePreMapper.insert(signPfxFilePre);
+        SignPfxFilePre signPfxFilePre1 = signPfxFilePreMapper.selectByPrimaryKey(signPfxFilePre.getId());
+        return R.data(signPfxFilePre1);
+    }
+
+    @Override
+    public R prePicture(SignPfxFilePre signPfxFilePre) throws Exception {
+        SignPfxFilePre spr = signPfxFilePreMapper.selectByPrimaryKey(signPfxFilePre.getId());
+        //宽度
+        Double wide = spr.getWide();
+        //高度
+        Double hight = spr.getHigh();
+        //图片地址
+        String localImgPath = spr.getSignaturePngUrl();
+        String file_path = FileUtils.getSysLocalFileUrl();
+
+        //图片压缩后的地址
+        UUID uuid = UUID.randomUUID();
+        String compressImgPath = file_path + "/print//" + uuid + ".png";
+
+        String pdfPath = file_path + "/pdf//" + "1751795857679712265" + ".pdf";
+        String excelPath = file_path + "/pdf//" + uuid + ".xlsx";
+
+        File tabPdf = ResourceUtil.getFile(pdfPath);
+        if (tabPdf.exists()) {
+            tabPdf.delete();
+        }
+        //获取excel流 和 html流
+        InputStream exceInp = CommonUtil.getOSSInputStream(excelTabFileUrl);
+
+        Workbook workbook = null;
+        int index = excelTabFileUrl.lastIndexOf(".");
+        String suffix = excelTabFileUrl.substring(index);
+
+        if (".xls".equals(suffix)) {
+            workbook = new XSSFWorkbook(exceInp);
+        } else if (".xlsx".equals(suffix)) {
+            workbook = new XSSFWorkbook(exceInp);
+        }
+        //获取工作表
+        Sheet sheet = workbook.getSheetAt(0);
+        sheet.setForceFormulaRecalculation(true);
+        List<String> sign = new ArrayList<>();
+        if (StringUtils.isNotEmpty(wbsHtmlUrl)) {
+            InputStream inputStreamByUrl = FileUtils.getInputStreamByUrl(wbsHtmlUrl);
+            String htmlString = IoUtil.readToString(inputStreamByUrl);
+            Document doc = Jsoup.parse(htmlString);
+            Element table = doc.select("table").first();
+            Elements dqids = table.getElementsByAttribute("dqid");
+            for (Element element : dqids) {
+                String dqid = element.attr("dqid");
+                Elements x11 = element.getElementsByAttribute("x1");
+                if (x11 != null && x11.size() >= 1) {
+                    Element element1 = x11.get(x11.size() - 1);
+                    int x1 = Func.toInt(element1.attr("x1"));
+                    int y1 = Func.toInt(element1.attr("y1"));
+                    Row row = sheet.getRow(y1 - 1);
+                    if (row != null) {
+                        Cell cell = row.getCell(x1 - 1);
+                        if (cell != null || ObjectUtils.isNotEmpty(cell)) {
+                            short fontIndex = cell.getCellStyle().getFontIndex();
+                            Font oldfontAt = workbook.getFontAt(fontIndex);
+                            Font redFont = workbook.createFont();
+                            redFont.setColor(IndexedColors.WHITE.getIndex()); //设置字体颜色
+                            redFont.setFontHeightInPoints(Short.valueOf("1"));//设置字体大小
+                            redFont.setFontName(oldfontAt.getFontName());//设置字体
+                            String CellValue = cell.getStringCellValue().trim();
+
+                            CellStyle newStyle = workbook.createCellStyle(); //创建单元格样式
+                            newStyle.cloneStyleFrom(cell.getCellStyle());
+                            newStyle.setFont(redFont);
+                            newStyle.setShrinkToFit(true);
+                            cell.setCellStyle(newStyle);
+                            if(dqid.contains("||")){
+                                String[] split = dqid.split("\\|\\|");
+                                for (String singleDqid : split) {
+                                    cell.setCellValue(singleDqid);
+                                    sign.add(singleDqid);
+                                }
+                            }else {
+                                cell.setCellValue(dqid);
+                                sign.add(dqid);
+                            }
+                        }
+                    }
+                }
+            }
+        }
+        Map<Long, TextdictInfo> textMap = new HashMap<>();
+        //输出流
+        FileOutputStream outputStream = new FileOutputStream(excelPath);
+        workbook.write(outputStream);
+        FileUtils.excelToPdf(excelPath, pdfPath);
+        FileUtils.compressImage(localImgPath,compressImgPath, spr.getWide(),spr.getHigh());
+        PdfAddimgUtil.pdfAddImgInfoNew(pdfPath, String.join(",", sign),textMap,compressImgPath);
+        //压缩后的图片上传oss
+        return R.data(FileUtils.getNetUrl(pdfPath));
+    }
+}

+ 9 - 15
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/TextdictInfoServiceImpl.java

@@ -16,27 +16,24 @@
  */
 package org.springblade.manager.service.impl;
 
-import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import org.jsoup.Jsoup;
 import org.jsoup.nodes.Document;
 import org.jsoup.nodes.Element;
 import org.jsoup.select.Elements;
-import org.springblade.core.tool.api.R;
-import org.springblade.core.tool.support.Try;
 import org.springblade.core.tool.utils.Func;
 import org.springblade.core.tool.utils.IoUtil;
 import org.springblade.manager.entity.TextdictInfo;
 import org.springblade.manager.entity.WbsTreePrivate;
+import org.springblade.manager.mapper.TextdictInfoMapper;
 import org.springblade.manager.mapper.WbsTreePrivateMapper;
+import org.springblade.manager.service.ITextdictInfoService;
 import org.springblade.manager.utils.FileUtils;
-import org.springblade.manager.vo.TextdictDataInfoVO;
 import org.springblade.manager.vo.TextdictInfoVO;
-import org.springblade.manager.mapper.TextdictInfoMapper;
-import org.springblade.manager.service.ITextdictInfoService;
-import org.springblade.core.mp.base.BaseServiceImpl;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.jdbc.core.JdbcTemplate;
 import org.springframework.stereotype.Service;
-import com.baomidou.mybatisplus.core.metadata.IPage;
 import org.springframework.transaction.annotation.Transactional;
 
 import javax.annotation.Resource;
@@ -45,7 +42,6 @@ import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Iterator;
 import java.util.List;
-import java.util.stream.Collectors;
 
 /**
  * 参数信息表 服务实现类
@@ -68,18 +64,16 @@ public class TextdictInfoServiceImpl extends ServiceImpl<TextdictInfoMapper, Tex
                 String htmlString = IoUtil.readToString(fileInputStream);
                 Document doc = Jsoup.parse(htmlString);
                 Elements table = doc.getElementsByAttribute("dqid");
-                if(table.size()>=1){
+
                     List<String> dqid = new ArrayList<>();
                     for(Element ek:table){
                         dqid.addAll(Func.toStrList("\\|\\|",ek.attr("dqid")));
                     }
-                    textdict = baseMapper.selectTextdictBYIds(dqid,privateInfo.getProjectId());
-                    if(textdict==null || textdict.size()<=0){
+                    if(textdictInfo.getShowType() == 1){
+                        textdict = baseMapper.selectTextdictBYIds(dqid,privateInfo.getProjectId());
+                    }else{
                         textdict = baseMapper.selectTextdictInfoByExcelId(page, textdictInfo);
                     }
-                }else{
-                    textdict = baseMapper.selectTextdictInfoByExcelId(page, textdictInfo);
-                }
             } catch (Exception e) {
                 throw new RuntimeException(e);
             }

+ 46 - 1
blade-service/blade-manager/src/main/java/org/springblade/manager/utils/FileUtils.java

@@ -304,6 +304,52 @@ public class FileUtils {
         }
     }
 
+    /**
+     * 根据宽度和高度改变图片尺寸
+     * @param sourceImagePath
+     * @param targetImagePath
+     * @param maxWidth
+     * @param maxHeight
+     * @throws IOException
+     */
+    public static void compressImage(String sourceImagePath, String targetImagePath, double maxWidth, double maxHeight) throws Exception {
+       InputStream inputStreamByUrl = FileUtils.getInputStreamByUrl(sourceImagePath);
+        // 读取源图片
+        BufferedImage originalImage = ImageIO.read(inputStreamByUrl);
+        // 给定的目标宽度和高度
+        int targetWidth = (int)Math.round(maxWidth); // 目标宽度
+        int targetHeight = (int)Math.round(maxHeight); // 目标高度
+        // 创建新的图片对象
+        BufferedImage resizedImage = new BufferedImage(targetWidth, targetHeight, originalImage.getType());
+        // 使用 Graphics2D 进行绘制
+        Graphics2D g2d = resizedImage.createGraphics();
+        g2d.drawImage(originalImage, 0, 0, targetWidth, targetHeight, null);
+        g2d.dispose();
+        // 保存缩放后的图片
+        ImageIO.write(resizedImage, getFormat(sourceImagePath), new File(targetImagePath));
+    }
+
+    /**
+     * 获取图片格式
+     *
+     * @param imagePath 图片路径
+     * @return 图片格式(例如 "jpg"、"png")
+     */
+    private static String getFormat(String imagePath) {
+        String extension = imagePath.substring(imagePath.lastIndexOf('.') + 1).toLowerCase();
+        switch (extension) {
+            case "jpg":
+            case "jpeg":
+                return "jpg";
+            case "png":
+                return "png";
+            case "gif":
+                return "gif";
+            default:
+                throw new IllegalArgumentException("Unsupported image format: " + extension);
+        }
+    }
+
 
     /**
      * excel设置 打印缩放比例
@@ -385,7 +431,6 @@ public class FileUtils {
 
     // 获取本地 或 远程工作流ParamCache
     public static InputStream getInputStreamByUrl(String fileUrl) throws Exception {
-
         File file1 = new File(fileUrl);
         InputStream fileInputStream = null;
         if (file1.exists()) {

+ 42 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/utils/PdfAddimgUtil.java

@@ -42,6 +42,48 @@ public class PdfAddimgUtil {
         }
 
 
+        List<PDFIndexInfo> positions = findKeywordPostions(pdfData, keyword);
+
+        System.out.println("total:" + positions.size());
+        if (positions != null && positions.size() > 0) {
+
+            for (int i = 0; i < positions.size(); i++) {
+
+                PDFIndexInfo pdfIndexInfo = positions.get(i);
+                float[] position = pdfIndexInfo.getDataInfo();
+                TextdictInfo textdictInfo = textMap.get(Func.toLong(pdfIndexInfo.getPkeyid()));
+                float pyzbx = 0;
+                float pyzby = 0;
+                String type ="2";
+                if(textdictInfo!=null){
+                    pyzbx = Func.toFloat(textdictInfo.getPyzbx());
+                    pyzby = Func.toFloat(textdictInfo.getPyzby());
+                    type = textdictInfo.getType()+"";
+                }
+                gaizhang(pdfFile, new File(pdfUrl), (int) position[0], position[1], position[2], signImg,pyzbx,pyzby,type);
+            }
+        }
+    }
+    public static void pdfAddImgInfoNew(String pdfUrl, String keyword, Map<Long, TextdictInfo> textMap ,String signImg) throws Exception {
+        File pdfFile = new File(pdfUrl);
+        byte[] pdfData = new byte[(int) pdfFile.length()];
+        FileInputStream inputStream = null;
+        try {
+            inputStream = new FileInputStream(pdfFile);
+            inputStream.read(pdfData);
+        } catch (IOException e) {
+            throw e;
+        } finally {
+            if (inputStream != null) {
+                try {
+                    inputStream.close();
+                } catch (IOException e) {
+                    inputStream.close();
+                }
+            }
+        }
+
+
         List<PDFIndexInfo> positions = findKeywordPostions(pdfData, keyword);
 
         System.out.println("total:" + positions.size());