소스 검색

2024 4 26 号

zhuwei 1 년 전
부모
커밋
4819cc6b56
23개의 변경된 파일510개의 추가작업 그리고 13개의 파일을 삭제
  1. 5 0
      blade-service-api/blade-business-api/src/main/java/org/springblade/business/entity/DefaultConfig.java
  2. 7 0
      blade-service-api/blade-business-api/src/main/java/org/springblade/business/entity/TrialSampleInfo.java
  3. 3 0
      blade-service/blade-business/src/main/java/org/springblade/business/controller/DefaultConfigController.java
  4. 1 0
      blade-service/blade-business/src/main/java/org/springblade/business/mapper/DefaultConfigMapper.xml
  5. 1 0
      blade-service/blade-business/src/main/java/org/springblade/business/mapper/TrialSampleInfoMapper.xml
  6. 1 1
      blade-service/blade-control/src/main/java/org/springblade/control/service/IPlanInformService.java
  7. 1 2
      blade-service/blade-e-visa/src/main/java/org/springblade/evisa/controller/EVisaController.java
  8. 0 1
      blade-service/blade-e-visa/src/main/java/org/springblade/evisa/utils/FileUtils.java
  9. 10 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/controller/ContractInfoController.java
  10. 1 2
      blade-service/blade-manager/src/main/java/org/springblade/manager/controller/ExcelTabController.java
  11. 2 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/ContractInfoMapper.java
  12. 3 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/ContractInfoMapper.xml
  13. 1 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/IContractInfoService.java
  14. 5 1
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/IExcelTabService.java
  15. 6 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ContractInfoServiceImpl.java
  16. 89 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ExcelTabServiceImpl.java
  17. 5 1
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/SignPfxFileServiceImpl.java
  18. 2 2
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/TextdictInfoServiceImpl.java
  19. 2 1
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/WbsTreeContractServiceImpl.java
  20. 2 2
      blade-service/blade-manager/src/main/java/org/springblade/manager/utils/FileUtils.java
  21. 360 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/utils/PdfAddimgUtil.java
  22. 2 0
      blade-service/blade-meter/src/main/java/org/springblade/meter/controller/TaskController.java
  23. 1 0
      blade-service/blade-user/src/main/java/org/springblade/system/user/controller/WbsTreeController.java

+ 5 - 0
blade-service-api/blade-business-api/src/main/java/org/springblade/business/entity/DefaultConfig.java

@@ -88,4 +88,9 @@ public class DefaultConfig extends BaseEntity {
 	 */
 	private int isDatavTour;
 
+	/**
+	 * 左边树导航框宽度
+	 */
+	private int treeWidth;
+
 }

+ 7 - 0
blade-service-api/blade-business-api/src/main/java/org/springblade/business/entity/TrialSampleInfo.java

@@ -137,4 +137,11 @@ public class TrialSampleInfo extends BaseEntity {
     @ApiModelProperty(value = "pdfURL")
     private String pdfUrl;
 
+    /**
+     * FRID编号
+     */
+    @ApiModelProperty(value = "FRID编号")
+    private String rfId;
+
+
 }

+ 3 - 0
blade-service/blade-business/src/main/java/org/springblade/business/controller/DefaultConfigController.java

@@ -169,6 +169,9 @@ public class DefaultConfigController extends BladeController {
 			if (StringUtils.isNotEmpty(newConfig.getIsDatavTour()+"")) {
 				oldConfig.setIsDatavTour(newConfig.getIsDatavTour());
 			}
+			if (StringUtils.isNotEmpty(newConfig.getTreeWidth()+"")) {
+				oldConfig.setTreeWidth(newConfig.getTreeWidth());
+			}
             oldConfig.setOpinionView(newConfig.getOpinionView());
             return R.data(this.defaultConfigService.updateById(oldConfig));
         }

+ 1 - 0
blade-service/blade-business/src/main/java/org/springblade/business/mapper/DefaultConfigMapper.xml

@@ -23,6 +23,7 @@
         <result column="client_id" property="clientId"/>
         <result column="index_model" property="indexModel"/>
         <result column="app_check" property="appCheck"/>
+        <result column="tree_width" property="treeWidth"/>
     </resultMap>
 
 

+ 1 - 0
blade-service/blade-business/src/main/java/org/springblade/business/mapper/TrialSampleInfoMapper.xml

@@ -30,6 +30,7 @@
         <result column="update_time" property="updateTime"/>
         <result column="status" property="status"/>
         <result column="is_deleted" property="isDeleted"/>
+        <result column="rf_id" property="rfId"/>
     </resultMap>
 
     <select id="selectTrialSelfSample" resultType="java.lang.Long">

+ 1 - 1
blade-service/blade-control/src/main/java/org/springblade/control/service/IPlanInformService.java

@@ -19,6 +19,6 @@ public interface IPlanInformService extends BaseService<PlanInform> {
     void taskFinishedInform(String taskName,Long taskUser,String appUser,Integer status);
     void taskFinishedInform2(String taskName,String taskUser,String appUser,Integer status);
 
-    //任务转移审批通过,通知
+    //任务转移,通知
     void taskChangedInform(Long taskUser,Long changedUser,String appUserName,String planDesc);
 }

+ 1 - 2
blade-service/blade-e-visa/src/main/java/org/springblade/evisa/controller/EVisaController.java

@@ -56,7 +56,7 @@ public class EVisaController {
 
     // 电签主类
 
-    @Scheduled(cron = "0/20 * * * * ?")
+  //  @Scheduled(cron = "0/20 * * * * ?")
     public void SignInfo() {
         //执行代码
         log.info("扫描开始");
@@ -175,7 +175,6 @@ public class EVisaController {
         }else{ //废除
             // 修改 主 任务 u_task 表 状态改为3
             String up_task_par = "update u_task_parallel set status=3 where parallel_process_instance_id='"+taskApprovalVO.getParallelProcessInstanceId()+"'";
-            String up_task_queryInfo = "update u_task_parallel set status=3 where parallel_process_instance_id='"+taskApprovalVO.getParallelProcessInstanceId()+"'";
             String up_task = "update u_task set status=3 where id='"+taskApprovalVO.getTaskId()+"'";
             this.jdbcTemplate.execute("delete from u_task_batch where id="+taskApprovalVO.getId());
             jdbcTemplate.execute(up_task_par);

+ 0 - 1
blade-service/blade-e-visa/src/main/java/org/springblade/evisa/utils/FileUtils.java

@@ -35,7 +35,6 @@ public class FileUtils {
         String sys_file_net_url = ParamCache.getValue(CommonConstant.SYS_FILE_NET_URL);
 
        String path = sys_file_net_url + fileUrl.replaceAll("//", "/").replaceAll(file_path, "");
-
         return path;
     }
 

+ 10 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/controller/ContractInfoController.java

@@ -820,4 +820,14 @@ public class ContractInfoController extends BladeController {
     }
 
 
+    /**
+     * 材料取样 获取合同段信息
+     */
+    @GetMapping("/get-contractInfo")
+    @ApiOperationSupport(order = 24)
+    @ApiOperation(value = "材料取样-获取合同段信息", notes = "传入合同段id")
+    public R<List<ContractInfo>> getContractInfoByContractId(@RequestParam String contractId) {
+        List<ContractInfo> list = contractInfoService.getContractInfoByContractId(contractId);
+        return R.data(list);
+    }
 }

+ 1 - 2
blade-service/blade-manager/src/main/java/org/springblade/manager/controller/ExcelTabController.java

@@ -4052,7 +4052,6 @@ public class ExcelTabController extends BladeController {
             @ApiImplicitParam(name = "pkeyId", value = "pkeyId", required = true)
     })
     public R getPriWbsPdfByPId(Long pkeyId) throws Exception {
-
-        return R.data("http://blade-oss-chongqing.oss-cn-shenzhen.aliyuncs.com//upload/20230616/d1e4bed554cdb12e34928d15d53e33aa.pdf");
+        return excelTabService.getPriWbsPdfByPId(pkeyId);
     }
 }

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

@@ -71,4 +71,6 @@ public interface ContractInfoMapper extends BaseMapper<ContractInfo> {
     List<ContractInfo> getContractListByProjectId(Long projectId);
 
     List<WbsTreeContractVO2> getAllContractByType(@Param("projectId") String projectId,@Param("contractType") Integer contractType);
+
+    List<ContractInfo> getContractInfoByContractId(@Param("contractId") String contractId);
 }

+ 3 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/ContractInfoMapper.xml

@@ -541,4 +541,7 @@
         </if>
     </select>
 
+    <select id="getContractInfoByContractId" resultType="org.springblade.manager.entity.ContractInfo">
+        SELECT a.* from m_contract_info a,m_contract_relation_jlyz b  where a.id=b.contract_id_sg and  is_deleted = 0 and status = 1 and contract_id_jlyz=#{contractId}
+    </select>
 </mapper>

+ 1 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/service/IContractInfoService.java

@@ -83,4 +83,5 @@ public interface IContractInfoService extends BaseService<ContractInfo> {
 
     void updateIsArchivesAutoById(Long id, Integer isArchivesAuto);
 
+    List<ContractInfo> getContractInfoByContractId(String contractId);
 }

+ 5 - 1
blade-service/blade-manager/src/main/java/org/springblade/manager/service/IExcelTabService.java

@@ -184,8 +184,12 @@ public interface IExcelTabService extends BaseService<ExcelTab> {
 
     R saveBussData(JSONArray dataArray) throws Exception;
 
-
     String createFileTitle(WbsTreeContract wbsTreeContract);
 
     List<ExcelTab> getListByParentName(String parentName);
+
+    /**
+     * 获取项目表单的PDF
+     */
+    R getPriWbsPdfByPId(Long pkeyId) throws Exception;
 }

+ 6 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ContractInfoServiceImpl.java

@@ -1081,4 +1081,10 @@ public class ContractInfoServiceImpl extends BaseServiceImpl<ContractInfoMapper,
         this.updateById(contractInfo);
     }
 
+    @Override
+    public List<ContractInfo> getContractInfoByContractId(String contractId) {
+        List<ContractInfo> contractInfo = baseMapper.getContractInfoByContractId(contractId);
+        return contractInfo;
+    }
+
 }

+ 89 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ExcelTabServiceImpl.java

@@ -66,6 +66,7 @@ import org.springblade.manager.mapper.ExcelTabMapper;
 import org.springblade.manager.service.*;
 import org.springblade.manager.utils.ExcelInfoUtils;
 import org.springblade.manager.utils.FileUtils;
+import org.springblade.manager.utils.PdfAddimgUtil;
 import org.springblade.manager.vo.*;
 import org.springblade.resource.feign.NewIOSSClient;
 import org.springblade.system.cache.ParamCache;
@@ -3684,6 +3685,94 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
         return excelTabs;
     }
 
+    @Override
+    public R getPriWbsPdfByPId(Long pkeyId) throws Exception {
+        String file_path = FileUtils.getSysLocalFileUrl();
+        WbsTreePrivate wbsTreePrivate = this.wbsTreePrivateService.getOne(Wrappers.<WbsTreePrivate>lambdaQuery().eq(WbsTreePrivate::getPKeyId, pkeyId));
+        if (wbsTreePrivate == null) {
+            return R.fail("未获取到该表单的信息");
+        }
+        if (wbsTreePrivate.getHtmlUrl() == null) {
+            return R.fail("htmlUrl is null");
+        }
+
+        String pdfPath = file_path + "/pdf//" + pkeyId + ".pdf";
+        String excelPath = file_path + "/pdf//" + pkeyId + ".xlsx";
+
+        File tabPdf = ResourceUtil.getFile(pdfPath);
+        if (tabPdf.exists()) {
+            tabPdf.delete();
+        }
+
+        //获取清表信息
+        ExcelTab excelTab = this.getById(wbsTreePrivate.getExcelId());
+        if (excelTab == null) {
+            return R.fail("未获取到清表信息");
+        }
+
+        //获取excel流 和 html流
+        InputStream exceInp = CommonUtil.getOSSInputStream(excelTab.getFileUrl());
+
+        Workbook workbook = null;
+        int index = excelTab.getFileUrl().lastIndexOf(".");
+        String suffix = excelTab.getFileUrl().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(wbsTreePrivate.getHtmlUrl())) {
+            InputStream inputStreamByUrl = FileUtils.getInputStreamByUrl(wbsTreePrivate.getHtmlUrl());
+            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);
+                            cell.setCellValue(dqid);
+                            sign.add(dqid);
+                        }
+                    }
+                }
+            }
+        }
+
+        //输出流
+        FileOutputStream outputStream = new FileOutputStream(excelPath);
+        workbook.write(outputStream);
+        FileUtils.excelToPdf(excelPath, pdfPath);
+        PdfAddimgUtil.pdfAddImgInfo(pdfPath,String.join(",",sign));
+        return R.data(PdfAddimgUtil.getNetUrl(pdfPath));
+    }
 
 }

+ 5 - 1
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/SignPfxFileServiceImpl.java

@@ -118,7 +118,11 @@ public class SignPfxFileServiceImpl extends BaseServiceImpl<SignPfxFileMapper, S
                 makeSeal.setSealCode(EVisaConstant.SIGN_SEAL_CODE + user.getId());
                 //构建seal名
                 makeSeal.setSealName(EVisaConstant.SIGN_SEAL_NAME + user.getAccount());
-                makeSeal.setSealPassword(user.getId().toString().substring(0, EVisaConstant.USER_ID_SUB));
+                if(user.getId().toString().length()>=16){
+                    makeSeal.setSealPassword(user.getId().toString().substring(0, EVisaConstant.USER_ID_SUB));
+                }else {
+                    makeSeal.setSealPassword(user.getId().toString());
+                }
                 //注册印模
                 return this.pfxMakeSeal(makeSeal, "个人签名印章", id.toString());
             }

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

@@ -91,8 +91,8 @@ public class TextdictInfoServiceImpl extends ServiceImpl<TextdictInfoMapper, Tex
     public TextdictInfoVO selectTextdictInfoById(TextdictInfo textdictInfo) {
         List<TextdictInfoVO>  dataInfo = baseMapper.selectTextdictInfoById(textdictInfo.getId()+"");
         TextdictInfoVO testinfo = new TextdictInfoVO();
-        if(dataInfo==null){
-
+        if(dataInfo==null &&  dataInfo.size()==0){
+            return testinfo;
         } else if ( dataInfo.size()>1) {
             for (TextdictInfoVO da :dataInfo){
                 if(da.getProjectId().equals(textdictInfo.getProjectId())){

+ 2 - 1
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/WbsTreeContractServiceImpl.java

@@ -53,6 +53,7 @@ import org.springframework.jdbc.core.JdbcTemplate;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.util.LinkedCaseInsensitiveMap;
+import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.multipart.MultipartFile;
 
 import javax.servlet.http.HttpServletRequest;
@@ -2337,7 +2338,7 @@ public class WbsTreeContractServiceImpl extends BaseServiceImpl<WbsTreeContractM
         for(long pid:longList){
             jdbcTemplate.execute("update m_wbs_tree_contract set is_buss_show = " + status + " where p_key_id = " + pid);
         }
-
+        redisTemplate.delete("blade-manager::contract:wbstree:*");
         return R.success("操作成功");
     }
 }

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

@@ -758,9 +758,9 @@ public class FileUtils {
     public static boolean getLicense() {
         boolean result = false;
         try {
-            InputStream is = test.class.getClassLoader().getResourceAsStream("\\license.xml");
+            /*InputStream is = test.class.getClassLoader().getResourceAsStream("\\license.xml");
             License aposeLic = new License();
-            aposeLic.setLicense(is);
+            aposeLic.setLicense(is);*/
             result = true;
         } catch (Exception e) {
             e.printStackTrace();

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

@@ -0,0 +1,360 @@
+package org.springblade.manager.utils;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+import com.itextpdf.text.BaseColor;
+import com.itextpdf.text.Element;
+import com.itextpdf.text.Image;
+import com.itextpdf.text.Rectangle;
+import com.itextpdf.text.pdf.BaseFont;
+import com.itextpdf.text.pdf.PdfContentByte;
+import com.itextpdf.text.pdf.PdfDictionary;
+import com.itextpdf.text.pdf.PdfName;
+import com.itextpdf.text.pdf.PdfReader;
+import com.itextpdf.text.pdf.PdfStamper;
+import com.itextpdf.text.pdf.parser.ContentByteUtils;
+import com.itextpdf.text.pdf.parser.ImageRenderInfo;
+import com.itextpdf.text.pdf.parser.PdfContentStreamProcessor;
+import com.itextpdf.text.pdf.parser.RenderListener;
+import com.itextpdf.text.pdf.parser.TextRenderInfo;
+import org.springblade.common.constant.CommonConstant;
+import org.springblade.core.tool.utils.Func;
+import org.springblade.system.cache.ParamCache;
+
+public class PdfAddimgUtil {
+
+    public static void pdfAddImgInfo(String pdfUrl, String keyword) throws Exception {
+        String file_path = FileUtils.getSysLocalFileUrl();
+        String signImg = file_path+"/print/241dc221f83929a87d55ce700d6a4cd7.png";
+
+        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) {
+                }
+            }
+        }
+
+        //String keyword = "1704373937414078464";
+
+        List<float[]> positions = findKeywordPostions(pdfData, keyword);
+
+        System.out.println("total:" + positions.size());
+        if (positions != null && positions.size() > 0) {
+
+            for (int i = 0; i < positions.size(); i++) {
+                float[] position = positions.get(i);
+                System.out.print("pageNum: " + (int) position[0]);
+                System.out.print("\tx: " + position[1]);
+                System.out.println("\ty: " + position[2]);
+                gaizhang(pdfFile, new File(pdfUrl), (int) position[0], position[1], position[2], signImg);
+            }
+        }
+    }
+
+    public static void gaizhang(File src, File dest, int page, float x, float y, String imagePath) throws Exception {
+        // 读取模板文件
+        InputStream input = new FileInputStream(src);
+        PdfReader reader = new PdfReader(input);
+        PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(dest));
+        Rectangle pageSize = reader.getPageSize(1);
+        float height = pageSize.getHeight();
+        float width = pageSize.getWidth();
+        x = width * x - 20;
+        y = height - height * y - 8;
+        // 读图片
+        Image image = Image.getInstance(imagePath);
+
+        // 获取操作的页面
+        PdfContentByte under = stamper.getOverContent(page);
+        // 添加图片
+
+        // 设置图片的新宽度和高度
+        float newWidth = 75f; // 新的宽度
+        float newHeight = image.getScaledHeight() * (newWidth / image.getScaledWidth()); // 根据宽度计算高度
+        image.scaleAbsolute(newWidth, newHeight); // 设置图片的新尺寸
+        //调整图片尺寸
+        image.setAbsolutePosition(x, y);
+        under.addImage(image);
+        // 假设的under.addImage方法,需要传入图片路径和大小参数
+        stamper.close();
+        reader.close();
+    }
+
+    /**
+     * 【功能描述:添加图片和文字水印】 【功能详细描述:功能详细描述】
+     *
+     * @param srcFile    待加水印文件
+     * @param destFile   加水印后存放地址
+     * @param text       加水印的文本内容
+     * @param textWidth  文字横坐标
+     * @param textHeight 文字纵坐标
+     * @throws Exception
+     */
+    public void addWaterMark(String srcFile, String destFile, String text,
+                             int textWidth, int textHeight) throws Exception {
+        // 待加水印的文件
+        PdfReader reader = new PdfReader(srcFile);
+        // 加完水印的文件
+        PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(
+                destFile));
+        int total = reader.getNumberOfPages() + 1;
+        PdfContentByte content;
+        // 设置字体
+        BaseFont font = BaseFont.createFont();
+        // 循环对每页插入水印
+        for (int i = 1; i < total; i++) {
+            // 水印的起始
+            content = stamper.getUnderContent(i);
+            // 开始
+            content.beginText();
+            // 设置颜色 默认为蓝色
+            content.setColorFill(BaseColor.BLUE);
+            // content.setColorFill(Color.GRAY);
+            // 设置字体及字号
+            content.setFontAndSize(font, 38);
+            // 设置起始位置
+            // content.setTextMatrix(400, 880);
+            content.setTextMatrix(textWidth, textHeight);
+            // 开始写入水印
+            content.showTextAligned(Element.ALIGN_LEFT, text, textWidth,
+                    textHeight, 45);
+            content.endText();
+        }
+        stamper.close();
+    }
+
+    /**
+     * findKeywordPostions
+     *
+     * @param pdfData
+     * @param keyword
+     * @return List<float [ ]> : float[0]:pageNum float[1]:x float[2]:y
+     * @throws IOException
+     */
+    public static List<float[]> findKeywordPostions(byte[] pdfData,
+                                                    String keyword) throws IOException {
+        List<float[]> result = new ArrayList<float[]>();
+        List<PdfPageContentPositions> pdfPageContentPositions = getPdfContentPostionsList(pdfData);
+
+        for (PdfPageContentPositions pdfPageContentPosition : pdfPageContentPositions) {
+            List<float[]> charPositions = findPositions(keyword,
+                    pdfPageContentPosition);
+            if (charPositions == null || charPositions.size() < 1) {
+                continue;
+            }
+            result.addAll(charPositions);
+        }
+        return result;
+    }
+
+    private static List<PdfPageContentPositions> getPdfContentPostionsList(
+            byte[] pdfData) throws IOException {
+        PdfReader reader = new PdfReader(pdfData);
+
+        List<PdfPageContentPositions> result = new ArrayList<PdfPageContentPositions>();
+
+        int pages = reader.getNumberOfPages();
+        for (int pageNum = 1; pageNum <= pages; pageNum++) {
+            float width = reader.getPageSize(pageNum).getWidth();
+            float height = reader.getPageSize(pageNum).getHeight();
+
+            PdfRenderListener pdfRenderListener = new PdfRenderListener(
+                    pageNum, width, height);
+
+            // 解析pdf,定位位置
+            PdfContentStreamProcessor processor = new PdfContentStreamProcessor(
+                    pdfRenderListener);
+            PdfDictionary pageDic = reader.getPageN(pageNum);
+            PdfDictionary resourcesDic = pageDic.getAsDict(PdfName.RESOURCES);
+            try {
+                processor.processContent(ContentByteUtils
+                        .getContentBytesForPage(reader, pageNum), resourcesDic);
+            } catch (IOException e) {
+                reader.close();
+                throw e;
+            }
+
+            String content = pdfRenderListener.getContent();
+            List<CharPosition> charPositions = pdfRenderListener
+                    .getcharPositions();
+
+            List<float[]> positionsList = new ArrayList<float[]>();
+            for (CharPosition charPosition : charPositions) {
+                float[] positions = new float[]{charPosition.getPageNum(),
+                        charPosition.getX(), charPosition.getY()};
+                positionsList.add(positions);
+            }
+
+            PdfPageContentPositions pdfPageContentPositions = new PdfPageContentPositions();
+            pdfPageContentPositions.setContent(content);
+            pdfPageContentPositions.setPostions(positionsList);
+
+            result.add(pdfPageContentPositions);
+        }
+        reader.close();
+        return result;
+    }
+
+
+    private static List<float[]> findPositions(String keyword,
+                                               PdfPageContentPositions pdfPageContentPositions) {
+
+        List<float[]> result = new ArrayList<float[]>();
+        String content = pdfPageContentPositions.getContent();
+        List<float[]> charPositions = pdfPageContentPositions.getPositions();
+
+        List<String> strList = Func.toStrList(keyword);
+        for (String text : strList) {
+            for (int pos = 0; pos < content.length(); ) {
+                int positionIndex = content.indexOf(text, pos);
+                if (positionIndex == -1) {
+                    break;
+                }
+                float[] postions = charPositions.get(positionIndex);
+                result.add(postions);
+                pos = positionIndex + 1;
+            }
+        }
+
+
+        return result;
+    }
+
+
+    private static class PdfPageContentPositions {
+        private String content;
+        private List<float[]> positions;
+
+        public String getContent() {
+            return content;
+        }
+
+        public void setContent(String content) {
+            this.content = content;
+        }
+
+        public List<float[]> getPositions() {
+            return positions;
+        }
+
+        public void setPostions(List<float[]> positions) {
+            this.positions = positions;
+        }
+    }
+
+    private static class PdfRenderListener implements RenderListener {
+        private int pageNum;
+        private float pageWidth;
+        private float pageHeight;
+        private StringBuilder contentBuilder = new StringBuilder();
+        private List<CharPosition> charPositions = new ArrayList<CharPosition>();
+
+        public PdfRenderListener(int pageNum, float pageWidth, float pageHeight) {
+            this.pageNum = pageNum;
+            this.pageWidth = pageWidth;
+            this.pageHeight = pageHeight;
+        }
+
+        @Override
+        public void beginTextBlock() {
+
+        }
+
+        @Override
+        public void renderText(TextRenderInfo renderInfo) {
+            List<TextRenderInfo> characterRenderInfos = renderInfo
+                    .getCharacterRenderInfos();
+            for (TextRenderInfo textRenderInfo : characterRenderInfos) {
+                String word = textRenderInfo.getText();
+                if (word.length() > 1) {
+                    word = word.substring(word.length() - 1, word.length());
+                }
+                com.itextpdf.awt.geom.Rectangle2D.Float rectangle = textRenderInfo.getAscentLine()
+                        .getBoundingRectange();
+                double x = rectangle.getMinX();
+                double y = rectangle.getMaxY();
+
+                float xPercent = Math.round(x / pageWidth * 10000) / 10000f;
+                float yPercent = Math.round((1 - y / pageHeight) * 10000) / 10000f;//
+
+                CharPosition charPosition = new CharPosition(pageNum, xPercent,
+                        yPercent);
+                charPositions.add(charPosition);
+                contentBuilder.append(word);
+            }
+        }
+
+        @Override
+        public void endTextBlock() {
+
+        }
+
+        @Override
+        public void renderImage(ImageRenderInfo renderInfo) {
+
+        }
+
+        public String getContent() {
+            return contentBuilder.toString();
+        }
+
+        public List<CharPosition> getcharPositions() {
+            return charPositions;
+        }
+    }
+
+    private static class CharPosition {
+        private int pageNum = 0;
+        private float x = 0;
+        private float y = 0;
+
+        public CharPosition(int pageNum, float x, float y) {
+            this.pageNum = pageNum;
+            this.x = x;
+            this.y = y;
+        }
+
+        public int getPageNum() {
+            return pageNum;
+        }
+
+        public float getX() {
+            return x;
+        }
+
+        public float getY() {
+            return y;
+        }
+
+        @Override
+        public String toString() {
+            return "[pageNum=" + this.pageNum + ",x=" + this.x + ",y=" + this.y
+                    + "]";
+        }
+    }
+
+    public static String getNetUrl(String fileUrl){
+        String file_path = ParamCache.getValue(CommonConstant.SYS_LOCAL_URL);
+        String sys_file_net_url = ParamCache.getValue(CommonConstant.SYS_FILE_NET_URL);
+
+        String path = sys_file_net_url + fileUrl.replaceAll("//", "/").replaceAll(file_path, "");
+        return path;
+    }
+}

+ 2 - 0
blade-service/blade-meter/src/main/java/org/springblade/meter/controller/TaskController.java

@@ -2464,6 +2464,7 @@ public class TaskController extends BladeController {
                 updateEntity_2.setApproveStatus(2);
                 inventoryFormApplyServiceTask.update(updateEntity_2, updateWrapper_2);
             }
+            //
 
         } else if (task.getMeterTaskType().equals(2)) {
             List<MaterialMeterFormTask> materialMeterFormTasks = materialMeterFormServiceTask.getBaseMapper().selectList(Wrappers.<MaterialMeterFormTask>lambdaQuery()
@@ -2576,6 +2577,7 @@ public class TaskController extends BladeController {
 
             /*中间计量期状态修改=已审批*/
             jdbcTemplate.update("UPDATE s_contract_meter_period SET approve_status = 2 WHERE id = ? ", task.getFormDataId());
+            jdbcTemplate.update("UPDATE s_contract_material_adjust SET approve_status = 1 WHERE id = ? ", task.getFormDataId());
 
         } else if (task.getMeterTaskType().equals(2)) {
             List<MaterialMeterFormTask> materialMeterFormTasks = materialMeterFormServiceTask.getBaseMapper().selectList(Wrappers.<MaterialMeterFormTask>lambdaQuery()

+ 1 - 0
blade-service/blade-user/src/main/java/org/springblade/system/user/controller/WbsTreeController.java

@@ -69,6 +69,7 @@ public class WbsTreeController extends BladeController {
                 data = redisTemplate.opsForValue().get("blade-manager::contract:wbstree:" + dataInfoId);
             } else if (("1").equals(classifyType)) {
                 data = redisTemplate.opsForValue().get("blade-manager::contract:wbstree:" + dataInfoId);
+                redisTemplate.delete("blade-manager::contract:wbstree:" + dataInfoId);
             }
         }
         if (data != null) {