Explorar o código

Merge branch 'master' of http://47.110.251.215:3000/java_org/bladex

huangtf %!s(int64=2) %!d(string=hai) anos
pai
achega
ba6008ea23

+ 44 - 10
blade-ops/blade-resource/src/main/java/org/springblade/resource/endpoint/LargeFileEndpoint.java

@@ -21,6 +21,7 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import io.swagger.annotations.Api;
 import lombok.AllArgsConstructor;
 import lombok.SneakyThrows;
+import org.apache.commons.fileupload.disk.DiskFileItem;
 import org.apache.commons.io.FileUtils;
 import org.apache.pdfbox.pdmodel.PDDocument;
 import org.springblade.common.constant.CommonConstant;
@@ -45,9 +46,11 @@ import org.springblade.resource.vo.MultipartFileParam;
 import org.springblade.resource.vo.NewBladeFile;
 import org.springblade.system.cache.ParamCache;
 import org.springframework.beans.BeanUtils;
+import org.springframework.http.MediaType;
 import org.springframework.util.DigestUtils;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.multipart.MultipartFile;
+import org.springframework.web.multipart.commons.CommonsMultipartFile;
 
 import javax.imageio.ImageIO;
 import javax.servlet.http.HttpServletRequest;
@@ -204,7 +207,7 @@ public class LargeFileEndpoint {
 		// 获取文件路径
 		/**Windows文件路径要加在哪个盘**/
 //		String filePath = "D:/www/wwwroot/Users/hongchuangyanfa/Desktop/Desktop/ceshi";
-		String filePath = ParamCache.getValue(CommonConstant.SYS_LOCAL_URL)+"largeFile/";
+		String filePath ="D:" +ParamCache.getValue(CommonConstant.SYS_LOCAL_URL)+"largeFile/";
 		// 创建文件夹
 //		getAbsoluteFile(filePath, fileName);
 //		new File(filePath, fileName);
@@ -266,19 +269,34 @@ public class LargeFileEndpoint {
 				renameFile(file,param.getFilename());
 				FileInputStream inputStream = new FileInputStream(filePath + param.getFilename());
 //				上传oss
+				long l = System.currentTimeMillis();
+				System.out.println("kaishi===================================="+l);
 				BladeFile bladeFile = ossBuilder.template().putFile(param.getFilename(),inputStream);
+				long l1 = System.currentTimeMillis();
+				System.out.println("jieshu===================================="+(l1-l));
 
+				File file1 = new File(filePath + param.getFilename());
 
 				NewBladeFile newBladeFile = new NewBladeFile();
-//				if(param.getFilename().contains("pdf")){
-//					PDDocument document = PDDocument.load(inputStream);
-//					//获取文件页数
-//					newBladeFile.setPage(document.getPages().getCount());
-//					//pdf的路径就是文件上传的路径
-//					newBladeFile.setPdfUrl(bladeFile.getLink());
-//				}
+				if(param.getFilename().contains("pdf")){
+					FileInputStream inputStream1 = new FileInputStream(filePath + param.getFilename());
+					PDDocument document = PDDocument.load(inputStream1);
+					//获取文件页数
+					newBladeFile.setPage(document.getPages().getCount());
+					//pdf的路径就是文件上传的路径
+					newBladeFile.setPdfUrl(bladeFile.getLink());
+				}else if(param.getFilename().contains("xlsx") || param.getFilename().contains("xls")){
+					MultipartFile multipartFile = getMultipartFile(file1);
+					newBladeFile = this.commonFileClient.excelToPdf(multipartFile);
+				}else if(param.getFilename().contains("docx")){
+					MultipartFile multipartFile = getMultipartFile(file1);
+					newBladeFile = this.commonFileClient.wordToPdf(multipartFile);
+				}else if(param.getFilename().contains("png") || param.getFilename().contains("jpg")){
+					MultipartFile multipartFile = getMultipartFile(file1);
+					newBladeFile = this.commonFileClient.pngOrJpgToPdf(multipartFile);
+				}
 				BeanUtils.copyProperties(bladeFile, newBladeFile);
-				File file1 = new File(filePath + param.getFilename());
+
 				//删除本地文件
 				file1.delete();
 				iLargeFileService.updateLargeFileDeleted(param.getIdentifier());
@@ -303,6 +321,22 @@ public class LargeFileEndpoint {
 		return result;
 	}
 
+	/**
+	 *file 转 MultipartFile
+	 * **/
+	public static MultipartFile getMultipartFile(File file){
+		DiskFileItem item = new DiskFileItem("file",
+				MediaType.MULTIPART_FORM_DATA_VALUE,
+				true,
+				file.getName(),(int) file.length(),file.getParentFile());
+		try {
+			OutputStream os = item.getOutputStream();
+			os.write(FileUtils.readFileToByteArray(file));
+		} catch (IOException e) {
+			e.printStackTrace();
+		}
+		return new CommonsMultipartFile(item);
+	}
 	/**
 	 * 构建上传目录和文件
 	 */
@@ -316,7 +350,7 @@ public class LargeFileEndpoint {
 	 * 构建上传完整目录
 	 */
 	private String buildUploadDir() {
-		String fullDir =ParamCache.getValue(CommonConstant.SYS_LOCAL_URL)+"largeFile/";
+		String fullDir ="D:" +ParamCache.getValue(CommonConstant.SYS_LOCAL_URL)+"largeFile/";
 		File dir = new File(fullDir);
 		if (!dir.exists()) {
 			dir.mkdirs();

+ 2 - 0
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/dto/FormData.java

@@ -71,6 +71,8 @@ public class FormData {
     private String position;
     /**是否更新数据*/
     private Integer update=0;
+    /**是否汇总阶段执行*/
+    private boolean summary=false;
     /**是否完成执行*/
     private Boolean finished=false;
     /**元素和单元格的映射信息*/

+ 3 - 3
blade-service/blade-business/src/main/java/org/springblade/business/mapper/InformationQueryMapper.xml

@@ -171,9 +171,9 @@
         CASE (select count(tcf.id) from u_tree_contract_first AS tcf where tcf.is_deleted = 0 and tcf.wbs_node_id = wtc.p_key_id) WHEN 0 THEN 'false' ELSE 'true' END AS isFirst,
 			 ( SELECT count(1) from m_wbs_tree_contract where id in(SELECT parent_id from m_wbs_tree_contract a where a.is_deleted=0 and a.type=2 and table_owner in(1,2,3)) and contract_id=wtc.contract_id and type =1 and is_deleted=0 and (FIND_IN_SET(wtc.id,ancestors) or wtc.p_key_id=p_key_id)
 				) as allCount,
-			 (SELECT count(1) from u_information_query b where b.wbs_id in(SELECT p_key_id from m_wbs_tree_contract a where (FIND_IN_SET(wtc.id,a.ancestors) or wtc.p_key_id=a.p_key_id) and a.is_deleted=0 and a.`status`='0' ) and b.is_deleted=0 and b.classify=1) as savaCont,
-			 (SELECT count(1) from u_information_query b where b.wbs_id in(SELECT p_key_id from m_wbs_tree_contract a where (FIND_IN_SET(wtc.id,a.ancestors) or wtc.p_key_id=a.p_key_id) and a.is_deleted=0 and a.`status`='1' ) and b.is_deleted=0 and b.classify=1) as submitCounts,
-			 (SELECT count(1) from u_information_query b where b.wbs_id in(SELECT p_key_id from m_wbs_tree_contract a where (FIND_IN_SET(wtc.id,a.ancestors) or wtc.p_key_id=a.p_key_id) and a.is_deleted=0 and a.`status`='2' ) and b.is_deleted=0 and b.classify=1) as appCount
+			 (SELECT count(1) from u_information_query b where b.wbs_id in(SELECT p_key_id from m_wbs_tree_contract a where (FIND_IN_SET(wtc.id,a.ancestors) or wtc.p_key_id=a.p_key_id) and a.is_deleted=0 ) and b.`status`='0' and b.is_deleted=0 and b.classify=1 and b.contract_id=wtc.contract_id ) as savaCont,
+			 (SELECT count(1) from u_information_query b where b.wbs_id in(SELECT p_key_id from m_wbs_tree_contract a where (FIND_IN_SET(wtc.id,a.ancestors) or wtc.p_key_id=a.p_key_id) and a.is_deleted=0 ) and b.`status`='1' and b.is_deleted=0 and b.classify=1 and b.contract_id=wtc.contract_id) as submitCounts,
+			 (SELECT count(1) from u_information_query b where b.wbs_id in(SELECT p_key_id from m_wbs_tree_contract a where (FIND_IN_SET(wtc.id,a.ancestors) or wtc.p_key_id=a.p_key_id) and a.is_deleted=0 ) and b.`status`='2' and b.is_deleted=0 and b.classify=1 and b.contract_id=wtc.contract_id) as appCount
 				FROM
         m_wbs_tree_contract AS wtc
         LEFT JOIN u_contract_tree_drawings AS ctd ON ctd.is_deleted = 0 and ctd.process_id = wtc.p_key_id

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

@@ -853,7 +853,11 @@ public class TrialSelfInspectionRecordServiceImpl extends BaseServiceImpl<TrialS
             this.reBuildNumber(obj, dto);
 
             //------保存实体表数据、试验记录信息、生成PDF------
-            this.submitTrialData(obj, dto);
+            try {
+                this.submitTrialData(obj, dto);
+            } catch (Exception e) {
+                e.printStackTrace();
+            }
 
             //------关联原材料检测报告------
             this.rawMaterialSubmitRelation(dto, obj);
@@ -898,14 +902,10 @@ public class TrialSelfInspectionRecordServiceImpl extends BaseServiceImpl<TrialS
     }
 
     @Async
-    public void submitTrialData(TrialSelfInspectionRecord obj, TrialSelfInspectionRecordDTO dto) {
-        try {
-            String pdfURL = excelTabClient.saveTabData(dto, dto.getIsBatchSave(), dto.getType(), dto.getTableType(), dto.getId(), obj.getTableIds());
-            if (StringUtils.isNotEmpty(pdfURL)) {
-                this.update(Wrappers.<TrialSelfInspectionRecord>lambdaUpdate().set(TrialSelfInspectionRecord::getPdfUrl, pdfURL).eq(TrialSelfInspectionRecord::getId, dto.getId()));
-            }
-        } catch (Exception e) {
-            e.printStackTrace();
+    public void submitTrialData(TrialSelfInspectionRecord obj, TrialSelfInspectionRecordDTO dto) throws Exception {
+        String pdfURL = excelTabClient.saveTabData(dto, dto.getIsBatchSave(), dto.getType(), dto.getTableType(), dto.getId(), obj.getTableIds());
+        if (StringUtils.isNotEmpty(pdfURL)) {
+            this.update(Wrappers.<TrialSelfInspectionRecord>lambdaUpdate().set(TrialSelfInspectionRecord::getPdfUrl, pdfURL).eq(TrialSelfInspectionRecord::getId, dto.getId()));
         }
     }
 

+ 5 - 0
blade-service/blade-manager/src/main/java/com/mixsmart/utils/FormulaUtils.java

@@ -3,6 +3,7 @@ package com.mixsmart.utils;
 
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
+import org.springblade.core.tool.utils.Func;
 import org.springblade.manager.bean.TableInfo;
 import org.springblade.manager.dto.Coords;
 import org.springblade.manager.dto.ElementData;
@@ -66,6 +67,10 @@ public class FormulaUtils {
     }
 
     public  static void write(FormData fd, Object data,Boolean nullOrBlank ){
+        if(Func.isEmpty(fd.getValues())){
+            /*无定位信息不写入*/
+            return;
+        }
         /*写入前清空内容*/
         fd.getValues().forEach(t->t.setValue(null));
         if(data instanceof List){

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

@@ -1075,7 +1075,7 @@ public class ExcelTabController extends BladeController {
                         ExctabCell exctabCell = new ExctabCell();
                         if ((textInfo.indexOf("年") >= 0 && textInfo.indexOf("月") >= 0 && textInfo.indexOf("日") >= 0) || inputText.indexOf("日期") >= 0) {
                             if (inputText.indexOf("日期") >= 0) {
-                                data.empty().append("<el-date-picker type='date' @keyDowns='dateKeydown' format='YYYY年MM月DD日' value-format='YYYY年MM月DD日' @contextmenu.prevent.native='contextmenuClick("+parm+")'  @mouseup.right='RightClick(" + parm + ")' trIndex=" + i + " tdIndex=" + j + "  x1=" + x1 + " x2=" + x2 + " y1=" + y1 + " y2=" + y2 + " style='width:100%;height:100%;' placeholder='" + inputText + "'> </el-date-picker>");
+                                data.empty().append("<el-date-picker type='date' @keyDowns='dateKeydown()' format='YYYY年MM月DD日' value-format='YYYY年MM月DD日' @contextmenu.prevent.native='contextmenuClick("+parm+")'  @mouseup.right='RightClick(" + parm + ")' trIndex=" + i + " tdIndex=" + j + "  x1=" + x1 + " x2=" + x2 + " y1=" + y1 + " y2=" + y2 + " style='width:100%;height:100%;' placeholder='" + inputText + "'> </el-date-picker>");
                             } else if (textInfo.indexOf("年") >= 0 && textInfo.indexOf("月") >= 0 && textInfo.indexOf("日") >= 0) {
                                 if (inputText.indexOf("专业监理工程师") >= 0) {
                                     inputText = "专业监理工程师_年月日";
@@ -1085,7 +1085,7 @@ public class ExcelTabController extends BladeController {
                                     inputText = "年月日";
                                 }
                             }
-                            data.empty().append("<el-date-picker @keyDowns='dateKeydown'  type='date' format='YYYY年MM月DD日' value-format='YYYY年MM月DD日' @contextmenu.prevent.native='contextmenuClick("+parm+")'  @mouseup.right='RightClick(" + parm + ")' trIndex=" + i + " tdIndex=" + j + "  x1=" + x1 + " x2=" + x2 + " y1=" + y1 + " y2=" + y2 + " style='width:100%;height:100%;' placeholder='年月日'> </el-date-picker>");
+                            data.empty().append("<el-date-picker @keyDowns='dateKeydown()'  type='date' format='YYYY年MM月DD日' value-format='YYYY年MM月DD日' @contextmenu.prevent.native='contextmenuClick("+parm+")'  @mouseup.right='RightClick(" + parm + ")' trIndex=" + i + " tdIndex=" + j + "  x1=" + x1 + " x2=" + x2 + " y1=" + y1 + " y2=" + y2 + " style='width:100%;height:100%;' placeholder='年月日'> </el-date-picker>");
                             exctabCell.setTextInfo(inputText);
                             exctabCell.setExctabId(excelId);
                             exctabCell.setIsDeleted(0);
@@ -2957,8 +2957,6 @@ public class ExcelTabController extends BladeController {
     })
     public R getHtmlBussCols(String contractId){
         excelTabService.updateContractById(contractId);
-
-
         return R.data("成功");
     }
 

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

@@ -277,7 +277,7 @@ public class TextdictInfoController extends BladeController {
 
         } else if (textdictInfo.getTextId().equals("radio")) { // 单选按钮
 
-            String radioText = "<el-radio-group id=" + keyname + " @keyDowns='dateKeydown' v-model=" + vmode + " keyname=" + keyname + " weighing=" + weighing + " placeholder=" + placeholder + " trIndex=" + trindex + " tdIndex=" + tdindex + "  x1=" + x1 + " x2=" + x2 + " y1=" + y1 + " y2=" + y2 + ">";
+            String radioText = "<el-radio-group id=" + keyname + " @keyDowns='dateKeydown()' v-model=" + vmode + " keyname=" + keyname + " weighing=" + weighing + " placeholder=" + placeholder + " trIndex=" + trindex + " tdIndex=" + tdindex + "  x1=" + x1 + " x2=" + x2 + " y1=" + y1 + " y2=" + y2 + ">";
             List<TextdictInfo_vo> optionList = textdictInfo.getTextInfo();
             if (optionList != null && optionList.size() >= 1) {
                 for (int i = 0; i < optionList.size(); i++)
@@ -295,26 +295,26 @@ public class TextdictInfoController extends BladeController {
                     jsonObject.put("name", optionList.get(i).getDictValue());
                     objs.add(jsonObject);
                 }
-                String checkbox = "<hc-form-checkbox-group   @keyDowns='dateKeydown' :objs='" + objs + "'  @change='checkboxGroupChange' :val=" + vmode + " v-model=" + vmode + " keyname=" + keyname + " weighing=" + weighing + " placeholder=" + placeholder + " trIndex=" + trindex + " tdIndex=" + tdindex + "  x1=" + x1 + " x2=" + x2 + " y1=" + y1 + " y2=" + y2 + "> </hc-form-checkbox-group>";
+                String checkbox = "<hc-form-checkbox-group   @keyDowns='dateKeydown()' :objs='" + objs + "'  @change='checkboxGroupChange' :val=" + vmode + " v-model=" + vmode + " keyname=" + keyname + " weighing=" + weighing + " placeholder=" + placeholder + " trIndex=" + trindex + " tdIndex=" + tdindex + "  x1=" + x1 + " x2=" + x2 + " y1=" + y1 + " y2=" + y2 + "> </hc-form-checkbox-group>";
                 element.empty().append(checkbox);
             }
         } else if (textdictInfo.getTextId().equals("date")) { // 日期--年月日时分秒
-            element.empty().append("<el-date-picker @keyDowns='dateKeydown' v-model=" + vmode + " type='datetime' format='YYYY年MM月DD日 HH:mm:ss' value-format='YYYY年MM月DD日 hh:mm:ss' placeholder=" + placeholder + " keyname=" + keyname + " weighing=" + weighing + "  @contextmenu.prevent.native='contextmenuClick("+parm+")'  @mouseup.right='RightClick(" + parm + ")' trIndex=" + trindex + " tdIndex=" + tdindex + "  x1=" + x1 + " x2=" + x2 + " y1=" + y1 + " y2=" + y2 + " style='width:100%;height:100%'   placeholder='" + placeholder + "'> </el-date-picker>");
+            element.empty().append("<el-date-picker @keyDowns='dateKeydown()' v-model=" + vmode + " type='datetime' format='YYYY年MM月DD日 HH:mm:ss' value-format='YYYY年MM月DD日 hh:mm:ss' placeholder=" + placeholder + " keyname=" + keyname + " weighing=" + weighing + "  @contextmenu.prevent.native='contextmenuClick("+parm+")'  @mouseup.right='RightClick(" + parm + ")' trIndex=" + trindex + " tdIndex=" + tdindex + "  x1=" + x1 + " x2=" + x2 + " y1=" + y1 + " y2=" + y2 + " style='width:100%;height:100%'   placeholder='" + placeholder + "'> </el-date-picker>");
         } else if (textdictInfo.getTextId().equals("dateYMD")) { // 日期--年月日
-            element.empty().append("<el-date-picker @keyDowns='dateKeydown' v-model=" + vmode + " type='date' format='YYYY年MM月DD日' value-format='YYYY年MM月DD日' placeholder=" + placeholder + " keyname=" + keyname + " weighing=" + weighing + "  @contextmenu.prevent.native='contextmenuClick("+parm+")'  @mouseup.right='RightClick(" + parm + ")' trIndex=" + trindex + " tdIndex=" + tdindex + "  x1=" + x1 + " x2=" + x2 + " y1=" + y1 + " y2=" + y2 + " style='width:100%;height:100%'   placeholder='" + placeholder + "'> </el-date-picker>");
+            element.empty().append("<el-date-picker @keyDowns='dateKeydown()' v-model=" + vmode + " type='date' format='YYYY年MM月DD日' value-format='YYYY年MM月DD日' placeholder=" + placeholder + " keyname=" + keyname + " weighing=" + weighing + "  @contextmenu.prevent.native='contextmenuClick("+parm+")'  @mouseup.right='RightClick(" + parm + ")' trIndex=" + trindex + " tdIndex=" + tdindex + "  x1=" + x1 + " x2=" + x2 + " y1=" + y1 + " y2=" + y2 + " style='width:100%;height:100%'   placeholder='" + placeholder + "'> </el-date-picker>");
         } else if (textdictInfo.getTextId().equals("dateHMS")) { // 日期--时分秒
-            element.empty().append("<el-time-picker @keyDowns='dateKeydown' v-model=" + vmode + " type='date' format='HH:mm:ss' value-format='HH:mm:ss' placeholder=" + placeholder + " keyname=" + keyname + " weighing=" + weighing + "  @contextmenu.prevent.native='contextmenuClick("+parm+")'  @mouseup.right='RightClick(" + parm + ")' trIndex=" + trindex + " tdIndex=" + tdindex + "  x1=" + x1 + " x2=" + x2 + " y1=" + y1 + " y2=" + y2 + " style='width:100%;height:100%'   placeholder='" + placeholder + "'> </el-time-picker>");
+            element.empty().append("<el-time-picker @keyDowns='dateKeydown()' v-model=" + vmode + " type='date' format='HH:mm:ss' value-format='HH:mm:ss' placeholder=" + placeholder + " keyname=" + keyname + " weighing=" + weighing + "  @contextmenu.prevent.native='contextmenuClick("+parm+")'  @mouseup.right='RightClick(" + parm + ")' trIndex=" + trindex + " tdIndex=" + tdindex + "  x1=" + x1 + " x2=" + x2 + " y1=" + y1 + " y2=" + y2 + " style='width:100%;height:100%'   placeholder='" + placeholder + "'> </el-time-picker>");
         } else if (textdictInfo.getTextId().equals("dateSM")) { // 日期--时分
-            element.empty().append("<el-time-picker @keyDowns='dateKeydown' v-model=" + vmode + " type='date' format='HH:mm' value-format='HH:mm' placeholder=" + placeholder + " keyname=" + keyname + " weighing=" + weighing + "  @contextmenu.prevent.native='contextmenuClick("+parm+")'  @mouseup.right='RightClick(" + parm + ")' trIndex=" + trindex + " tdIndex=" + tdindex + "  x1=" + x1 + " x2=" + x2 + " y1=" + y1 + " y2=" + y2 + " style='width:100%;height:100%'   placeholder='" + placeholder + "'> </el-time-picker>");
+            element.empty().append("<el-time-picker @keyDowns='dateKeydown()' v-model=" + vmode + " type='date' format='HH:mm' value-format='HH:mm' placeholder=" + placeholder + " keyname=" + keyname + " weighing=" + weighing + "  @contextmenu.prevent.native='contextmenuClick("+parm+")'  @mouseup.right='RightClick(" + parm + ")' trIndex=" + trindex + " tdIndex=" + tdindex + "  x1=" + x1 + " x2=" + x2 + " y1=" + y1 + " y2=" + y2 + " style='width:100%;height:100%'   placeholder='" + placeholder + "'> </el-time-picker>");
         } else if (textdictInfo.getTextId().equals("dateMDHM")) { // 日期--月日时分
-            element.empty().append("<el-date-picker @keyDowns='dateKeydown' v-model=" + vmode + " type='datetime' format='MM月DD日 HH:mm' value-format='MM月DD日 HH:mm' placeholder=" + placeholder + " keyname=" + keyname + " weighing=" + weighing + "  @contextmenu.prevent.native='contextmenuClick("+parm+")'  @mouseup.right='RightClick(" + parm + ")' trIndex=" + trindex + " tdIndex=" + tdindex + "  x1=" + x1 + " x2=" + x2 + " y1=" + y1 + " y2=" + y2 + " style='width:100%;height:100%'   placeholder='" + placeholder + "'> </el-time-picker>");
+            element.empty().append("<el-date-picker @keyDowns='dateKeydown()' v-model=" + vmode + " type='datetime' format='MM月DD日 HH:mm' value-format='MM月DD日 HH:mm' placeholder=" + placeholder + " keyname=" + keyname + " weighing=" + weighing + "  @contextmenu.prevent.native='contextmenuClick("+parm+")'  @mouseup.right='RightClick(" + parm + ")' trIndex=" + trindex + " tdIndex=" + tdindex + "  x1=" + x1 + " x2=" + x2 + " y1=" + y1 + " y2=" + y2 + " style='width:100%;height:100%'   placeholder='" + placeholder + "'> </el-time-picker>");
         } else if (textdictInfo.getTextId().equals("dateDHM")) { // 日期--日时分
-            element.empty().append("<el-date-picker @keyDowns='dateKeydown' v-model=" + vmode + " type='datetime' format='DD日 HH:mm' value-format='DD日 HH:mm' placeholder=" + placeholder + " keyname=" + keyname + " weighing=" + weighing + "  @contextmenu.prevent.native='contextmenuClick("+parm+")'  @mouseup.right='RightClick(" + parm + ")' trIndex=" + trindex + " tdIndex=" + tdindex + "  x1=" + x1 + " x2=" + x2 + " y1=" + y1 + " y2=" + y2 + " style='width:100%;height:100%'   placeholder='" + placeholder + "'> </el-time-picker>");
+            element.empty().append("<el-date-picker @keyDowns='dateKeydown()' v-model=" + vmode + " type='datetime' format='DD日 HH:mm' value-format='DD日 HH:mm' placeholder=" + placeholder + " keyname=" + keyname + " weighing=" + weighing + "  @contextmenu.prevent.native='contextmenuClick("+parm+")'  @mouseup.right='RightClick(" + parm + ")' trIndex=" + trindex + " tdIndex=" + tdindex + "  x1=" + x1 + " x2=" + x2 + " y1=" + y1 + " y2=" + y2 + " style='width:100%;height:100%'   placeholder='" + placeholder + "'> </el-time-picker>");
         } else if (textdictInfo.getTextId().equals("daterange")) { // 时间段
-            element.empty().append("<el-date-picker @keyDowns='dateKeydown' v-model=" + vmode + " type='datetimerange' placeholder=" + placeholder + "  start-placeholder='开始日期'  end-placeholder='结束日期' format='YYYY年MM月DD日' trIndex=" + trindex + " keyname=" + keyname + " weighing=" + weighing + " tdIndex=" + tdindex + "  x1=" + x1 + " x2=" + x2 + " y1=" + y1 + " y2=" + y2 + ">");
+            element.empty().append("<el-date-picker @keyDowns='dateKeydown()' v-model=" + vmode + " type='datetimerange' placeholder=" + placeholder + "  start-placeholder='开始日期'  end-placeholder='结束日期' format='YYYY年MM月DD日' trIndex=" + trindex + " keyname=" + keyname + " weighing=" + weighing + " tdIndex=" + tdindex + "  x1=" + x1 + " x2=" + x2 + " y1=" + y1 + " y2=" + y2 + ">");
             element.children().get(0).attr("@change", "datePickerChange($event,'" + keyname + "')");
         } else if (textdictInfo.getTextId().equals("daterangeYMD")) { // 时间段 /
-            element.empty().append("<el-date-picker @keyDowns='dateKeydown' v-model=" + vmode + " type='datetimerange' range-separator='/' placeholder=" + placeholder + "  start-placeholder='开始日期'  end-placeholder='结束日期' format='YYYY年MM月DD日' trIndex=" + trindex + " keyname=" + keyname + " weighing=" + weighing + " tdIndex=" + tdindex + "  x1=" + x1 + " x2=" + x2 + " y1=" + y1 + " y2=" + y2 + ">");
+            element.empty().append("<el-date-picker @keyDowns='dateKeydown()' v-model=" + vmode + " type='datetimerange' range-separator='/' placeholder=" + placeholder + "  start-placeholder='开始日期'  end-placeholder='结束日期' format='YYYY年MM月DD日' trIndex=" + trindex + " keyname=" + keyname + " weighing=" + weighing + " tdIndex=" + tdindex + "  x1=" + x1 + " x2=" + x2 + " y1=" + y1 + " y2=" + y2 + ">");
             element.children().get(0).attr("@change", "datePickerChange($event,'" + keyname + "')");
 
         } else if (textdictInfo.getTextId().equals("img")) {

+ 3 - 3
blade-service/blade-manager/src/main/java/org/springblade/manager/formula/impl/FormulaMileage.java

@@ -123,9 +123,9 @@ public class FormulaMileage implements FormulaStrategy {
     public void forG10(List<Mileage> data,TableElementConverter tec){
           if(Func.isNotEmpty(data)){
               Map<String,Object> g10 = (Map<String, Object>) tec.getConstantMap().computeIfAbsent("G10", k->new HashMap<>());
-              g10.put("dx",data.stream().map(Mileage::getDx).collect(Collectors.toList()));
-              g10.put("dxnv",data.stream().filter(e->!e.getVertical()).map(Mileage::getDx).collect(Collectors.toList()));
-              g10.put("dxv",data.stream().filter(Mileage::getVertical).map(Mileage::getDx).collect(Collectors.toList()));
+              g10.put("dx",data.stream().map(Mileage::getDs).collect(Collectors.toList()));
+              g10.put("dxnv",data.stream().filter(e->!e.getVertical()).map(Mileage::getDs).collect(Collectors.toList()));
+              g10.put("dxv",data.stream().filter(Mileage::getVertical).map(Mileage::getDs).collect(Collectors.toList()));
           }
     }
 

+ 180 - 165
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ExcelTabServiceImpl.java

@@ -82,9 +82,6 @@ import org.springframework.transaction.TransactionDefinition;
 import org.springframework.transaction.TransactionStatus;
 import org.springframework.transaction.support.DefaultTransactionDefinition;
 
-import javax.imageio.ImageIO;
-import java.awt.Color;
-import java.awt.image.BufferedImage;
 import java.io.*;
 import java.net.URL;
 import java.text.SimpleDateFormat;
@@ -366,6 +363,8 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
                     tec.before();
                     this.formulaService.execute(tec);
                     tec.after();
+                }else{
+                    tec.getLog().append("【").append("没有执行任何公式").append("】");
                 }
                 stopWatch.stop();
                 Long totalTime = stopWatch.getTotalTimeMillis();
@@ -392,8 +391,8 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
             List<Long> privateIds = this.jdbcTemplate.queryForList("select p_key_id from m_wbs_tree_private where id=" + currentNode.getRelateId() + " and  project_id=" + wtc.getProjectId() + " and wbs_id=" + wtc.getWbsId(), Long.class);
             if (Func.isNotEmpty(privateIds)) {
                 currentNode.setPrivateId(privateIds.get(0));
-                return currentNode;
             }
+            return currentNode;
         }
         return null;
     }
@@ -591,44 +590,29 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
         }
 
         //
-        List<WbsTreeContract> lastList = new ArrayList<>();
+        Map<Long,String> lastList = new HashMap<>();
         List<WbsTreeContract> collect = wbsTreeContractList.stream().filter(wbsTreeContract -> "0".equals(wbsTreeContract.getParentId().toString())).collect(Collectors.toList());
 
         this.dataInfo(collect,lastList,Data);
 
         if(lastList!=null && lastList.size()>=1){
-            for(WbsTreeContract data : lastList){
-                UpdateWrapper<WbsTreeContract> updateWrapper = new UpdateWrapper<>();
-                updateWrapper.eq("p_key_id", data.getPKeyId() + "");
-                updateWrapper.set("ancestors", data.getAncestors());
-                wbsTreeContractService.getBaseMapper().update(data,updateWrapper);
+            int index = 0;
+            StringBuffer sb =new StringBuffer();
+            for(Long data : lastList.keySet()){
+                sb.append(" update m_wbs_tree_contract set ancestors='"+lastList.get(data)+"' where p_key_id="+data+";");
+                index = index+1;
+                System.out.println(index);
+                if(index>=1000){
+                    jdbcTemplate.execute(sb.toString());
+                    sb = new StringBuffer();
+                }
             }
         }
         return R.data("成功");
     }
 
 
-    public void dataInfo(List<WbsTreeContract> collect,List<WbsTreeContract> lastList,Map<String , List<WbsTreeContract> > Data){
-
-        /*List<WbsTreeContract> redata = new ArrayList<>();
-        if (collect!=null && collect.size()==1){
-            // 主节点
-            for(WbsTreeContract fu:collect){
-                String dataId = fu.getId()+"";
-                List<WbsTreeContract> er = Data.get(dataId);
-                redata.add(fu);
-                if(er!=null && er.size()>=1){
-                    for(WbsTreeContract erData : er){
-                        erData.setAncestors(fu.getAncestors()+","+erData.getParentId());
-                        lastList.add(erData);
-                    }
-                }
-            }
-        }
-        if(redata!=null && redata.size()>=1){
-            this.dataInfo(redata,lastList,Data);
-        }*/
-
+    public void dataInfo(List<WbsTreeContract> collect,Map<Long ,String > lastList,Map<String , List<WbsTreeContract> > Data){
 
         Queue<WbsTreeContract> queue = new LinkedList<>();
         //将第一层级的目录全部入列
@@ -640,8 +624,13 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
             List<WbsTreeContract> er = Data.get(dataId);
             if(er!=null && er.size()>=1){
                 for(WbsTreeContract erData : er){
-                    erData.setAncestors(tree.getAncestors()+","+erData.getParentId());
-                    lastList.add(erData);
+                    String Ancestors="";
+                    if(lastList.containsKey(tree.getPKeyId())){
+                        Ancestors = lastList.get(tree.getPKeyId());
+                    }else{
+                        Ancestors = tree.getAncestors();
+                    }
+                    lastList.put(erData.getPKeyId(),Ancestors+","+erData.getParentId());
                 }
             }
 
@@ -883,7 +872,7 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
                 //保存操作记录
                 this.operationLogClient.saveUserOperationLog(1, "资料填报", "工序填报页面", json);
                 // 更新redis
-                informationQueryClient.AsyncWbsTree(wbsTreeContractByP.getParentId()+"",wbsTreeContractByP.getParentId()+"",wbsTreeContractByP.getContractId(),"","1");
+                informationQueryClient.AsyncWbsTree(wbsTreeContractByP.getParentId() + "", wbsTreeContractByP.getParentId() + "", wbsTreeContractByP.getContractId(), "", "1");
             } catch (Exception e) {
                 e.printStackTrace();
                 return R.fail("操作失败");
@@ -902,12 +891,12 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
         for (String p : part) {
             Matcher m = RegexUtils.matcher("(m_\\d{14}_\\d{19})\\((.+)\\)VALUES\\(([^)]+)\\).+column'(key_\\d{0,2})'", p.replaceAll("[\\n\\s]*", ""));
             if (m.find()) {
-                if(p.contains("Data too long for column")){
+                if (p.contains("Data too long for column")) {
                     List<Map<String, Object>> result = this.jdbcTemplate.queryForList("select CONCAT(a.tab_ch_name,'&',b.e_name) tf from m_table_info a join m_wbs_form_element b on b.f_id=a.id where a.tab_en_name='" + m.group(1) + "' and  b.e_key='" + m.group(4) + "'");
                     if (result.size() > 0) {
                         sb.append("【").append(result.get(0).values().stream().map(String::valueOf).collect(Collectors.joining(","))).append("数据库字段太短】");
                     }
-                }else if(p.contains("Unknown column")){
+                } else if (p.contains("Unknown column")) {
                     sb.append("【").append(m.group(1)).append(":").append(m.group(4)).append("关联错误】");
                 }
 
@@ -1998,46 +1987,35 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
         List<Map<String, Object>> bussDataInfoTrial = this.getBussDataInfoTrial(id, pkeyId, Long.parseLong(contractId));
         Map<String, Object> DataInfo = bussDataInfoTrial.stream().findAny().orElse(null);
 
-        //获取excel流 和 html流
-        Workbook wb = new Workbook();
-        wb.loadFromMHtml(CommonUtil.getOSSInputStream(excelTab.getFileUrl()));
-        //获取工作表
-        Worksheet sheet = wb.getWorksheets().get(0);
-
-        //页码
-        PageSetup pageSetup = sheet.getPageSetup();
+        org.apache.poi.ss.usermodel.Workbook workbook = WorkbookFactory.create(CommonUtil.getOSSInputStream(excelTab.getFileUrl()));
+        Sheet sheet = workbook.getSheetAt(0);
+        sheet.setForceFormulaRecalculation(true);
+        Header header = sheet.getHeader();
+        //页眉
         if (pageNumber != 0 && pageNumberCount != 0) {
-            pageSetup.setRightHeader("第" + pageNumber + "页,共" + pageNumberCount + "页");
+            header.setRight("第" + pageNumber + "页,共" + pageNumberCount + "页");
         }
 
-        /*// 标题添加
+        //标题Title
         ProjectInfo projectInfo = projectInfoService.getById(wbsTreePrivate.getProjectId());
-
         int all = sheet.getRow(0).getLastCellNum();
         int mergedCellCnt = sheet.getNumMergedRegions();
         for (int i = 0; i < mergedCellCnt - 1; i++) {
             CellRangeAddress mergedCell = sheet.getMergedRegion(i);
             int xx = mergedCell.getNumberOfCells();
-            if (xx == all) {
+            if (xx <= all) {
                 int fisRow = mergedCell.getFirstRow();
-                int firsrCol = mergedCell.getFirstColumn();
-
-                Cell cell = sheet.getRow(fisRow).getCell(firsrCol);
+                int firstCol = mergedCell.getFirstColumn();
+                Cell cell = sheet.getRow(fisRow).getCell(firstCol);
                 short fontIndex = cell.getCellStyle().getFontIndex();
-
-                Font oldfontAt = workbook.getFontAt(fontIndex);
-
+                Font oldFontAt = workbook.getFontAt(fontIndex);
                 Font redFont = workbook.createFont();
-                redFont.setFontHeightInPoints(oldfontAt.getFontHeightInPoints());//设置字体大小
-                redFont.setFontName(oldfontAt.getFontName());//设置字体
-
-                CellStyle newStyle = workbook.createCellStyle(); //创建单元格样式
+                redFont.setFontHeightInPoints(oldFontAt.getFontHeightInPoints());//设置字体大小
+                redFont.setFontName(oldFontAt.getFontName());//设置字体
+                CellStyle newStyle = workbook.createCellStyle();//创建单元格样式
                 newStyle.cloneStyleFrom(cell.getCellStyle());
-
-
                 short fontHeightInPoints = redFont.getFontHeightInPoints();
                 if (fontHeightInPoints >= 14 && StringUtils.isEmpty(cell.getStringCellValue()) && fisRow <= 8) {
-
                     String title = projectInfo.getProjectName();
                     if (title.length() >= 30) {
                         sheet.getRow(fisRow).setHeight((short) 900);
@@ -2050,8 +2028,7 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
                     break;
                 }
             }
-        }*/
-
+        }
 
         //数据不为空
         if (StringUtils.isNotEmpty(wbsTreePrivate.getHtmlUrl())) {
@@ -2061,134 +2038,173 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
                 Document doc = Jsoup.parse(htmlString);
                 Element table = doc.select("table").first();
                 Elements trs = table.select("tr");
-                Elements cols = table.select("col");
                 if (ObjectUtil.isNotEmpty(DataInfo)) {
-                    for (String val : DataInfo.keySet()) {
+                    for (String val : Objects.requireNonNull(DataInfo).keySet()) {
                         if (val.contains("__")) {
                             String[] DataVal = val.split("__");
                             String[] xy = DataVal[1].split("_");
+                            if (Integer.parseInt(xy[0]) < trs.size()) {
+                                Element ytzData = trs.get(Integer.parseInt(xy[0]));
+                                if (ytzData != null) {
+                                    Elements tdsx = ytzData.select("td");
+                                    if (Integer.parseInt(xy[1]) < tdsx.size()) {
+                                        Element data = ytzData.select("td").get(Integer.parseInt(xy[1]));
+                                        if (data != null) {
+                                            if (data.html().contains("x1") && data.html().contains("y1")) {
+                                                int x1 = 0;
+                                                int x2 = 0;
+                                                int y1 = 0;
+                                                int y2 = 0;
+                                                if (data.html().contains("el-tooltip")) {
+                                                    x1 = Integer.parseInt(data.children().get(0).children().get(0).attr("x1"));
+                                                    x2 = Integer.parseInt(data.children().get(0).children().get(0).attr("x2"));
+                                                    y1 = Integer.parseInt(data.children().get(0).children().get(0).attr("y1"));
+                                                } else {
+                                                    x1 = Integer.parseInt(data.children().get(0).attr("x1"));
+                                                    y1 = Integer.parseInt(data.children().get(0).attr("y1"));
+                                                }
+                                                if (x1 == 0) {
+                                                    x1 = 1;
+                                                }
+                                                String myData = DataInfo.get(val) + "";
+                                                if (myData.contains("T") && myData.contains("-") && myData.contains(":")) {
+                                                    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");
+                                                    sdf.setTimeZone(TimeZone.getTimeZone("GTM+8"));
+                                                    SimpleDateFormat formatStr = new SimpleDateFormat("yyyy年MM月dd日");
+                                                    if (myData.contains(",") && myData.contains("]")) {
 
-                            Element data = trs.get(Integer.parseInt(xy[0])).select("td").get(Integer.parseInt(xy[1]));
+                                                        myData = myData.replace("[", "").replace("]", "").replaceAll("'", "");
+                                                        String[] dataVal = myData.split(",");
 
-                            if (data.html().contains("x1") && data.html().contains("y1")) {
-                                int x1 = 0;
-                                int y1 = 0;
-                                if (data.html().contains("el-tooltip")) {
-                                    x1 = Integer.parseInt(data.children().get(0).children().get(0).attr("x1"));
-                                    y1 = Integer.parseInt(data.children().get(0).children().get(0).attr("y1"));
+                                                        Date Start_dataStr = sdf.parse(dataVal[0]);
+                                                        Date end_dataStr = sdf.parse(dataVal[1]);
+                                                        String StartDate = formatStr.format(Start_dataStr);
+                                                        String endDate = formatStr.format(end_dataStr);
+                                                        if (StartDate.equals(endDate)) {
+                                                            myData = StartDate;
+                                                        } else {
+                                                            myData = StartDate + "-" + endDate;
+                                                        }
+                                                    } else {
+                                                        String[] dataStr = myData.split("T")[0].split("-");
+                                                        myData = StringUtil.format("{}年{}月{}日", dataStr[0], dataStr[1], Integer.parseInt(dataStr[2]) + 1);
+                                                    }
+                                                }
+                                                //https:bladex-test-info.oss-cn-chengdu.aliyuncs.com//upload/20220819/b53cb6700db369381e3b03d7737bcdec.jpg__16_1
+                                                if (myData.contains("https") && myData.contains("aliyuncs")) {
+                                                    InputStream imageIn = CommonUtil.getOSSInputStream(myData);
+                                                    byte[] bytes = IOUtils.toByteArray(imageIn);
+                                                    // 这里根据实际需求选择图片类型
+                                                    int pictureIdx = workbook.addPicture(bytes, 6);
 
-                                } else {
-                                    x1 = Integer.parseInt(data.children().get(0).attr("x1"));
-                                    y1 = Integer.parseInt(data.children().get(0).attr("y1"));
-                                }
-                                if (x1 == 0) {
-                                    x1 = 1;
-                                }
-                                String myData = DataInfo.get(val) + "";
-
-                                if (myData.contains("T") && myData.contains("-") && myData.contains(":")) {
-                                    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");
-                                    sdf.setTimeZone(TimeZone.getTimeZone("GTM+8"));
-                                    SimpleDateFormat formatStr = new SimpleDateFormat("yyyy年MM月dd日");
-                                    if (myData.contains(",") && myData.contains("]")) {
-                                        myData = myData.replace("[", "").replace("]", "").replaceAll("'", "");
-                                        String[] dataVal = myData.split(",");
-
-                                        Date Start_dataStr = sdf.parse(dataVal[0]);
-                                        Date end_dataStr = sdf.parse(dataVal[1]);
-                                        String StartDate = formatStr.format(Start_dataStr);
-                                        String endDate = formatStr.format(end_dataStr);
-                                        if (StartDate.equals(endDate)) {
-                                            myData = StartDate;
-                                        } else {
-                                            myData = StartDate + "-" + endDate;
-                                        }
-                                    } else {
-                                        String[] dataStr = myData.split("T")[0].split("-");
-                                        myData = StringUtil.format("{}年{}月{}日", dataStr[0], dataStr[1], Integer.parseInt(dataStr[2]) + 1);
-                                    }
-                                }
+                                                    CreationHelper helper = workbook.getCreationHelper();
+                                                    ClientAnchor anchor = helper.createClientAnchor();
+                                                    anchor.setCol1(x1); // param1是列号
+                                                    anchor.setCol2(x2);
+                                                    anchor.setRow1(y1); // param2是行号
+                                                    anchor.setRow2(y2); // param2是行号
+                                                    //
+                                                    Drawing<?> drawing = sheet.createDrawingPatriarch();
+                                                    anchor.setAnchorType(ClientAnchor.AnchorType.MOVE_AND_RESIZE);
+                                                    // 插入图片
+                                                    Picture pict = drawing.createPicture(anchor, pictureIdx); // 调整图片占单元格百分比的大小,1.0就是100%
+                                                    pict.resize(1, 1);
+                                                    FileUtils.imageOrientation(sheet, anchor, new DataVO(x1 - 1, y1 - 1));
 
-                                if (myData.contains("https") && myData.contains("aliyuncs")) {
-                                    BufferedImage image = ImageIO.read(CommonUtil.getOSSInputStream(myData));
-                                    int colspan = data.attr("COLSPAN").equals("") ? 0 : Integer.parseInt(data.attr("COLSPAN"));
-                                    int rowspan = data.attr("ROWSPAN").equals("") ? 0 : Integer.parseInt(data.attr("ROWSPAN"));
-                                    int picHeight = 0;
-                                    int picWidth = 0;
-
-                                    if (rowspan == 0) {
-                                        String dataInfo = trs.get(y1).attr("height");
-                                        if (StringUtils.isEmpty(dataInfo)) {
-                                            Element firstTd = trs.get(y1 - 1).children().get(0);
-                                            String[] heg = firstTd.attr("style").split(";");
-                                            for (String str : heg) {
-                                                if (str.contains("height:")) {
-                                                    picHeight = Integer.parseInt(str.split(":")[1].replaceAll("px", ""));
+                                                } else if (myData.equals("1") && data.html().contains("hc-form-checkbox-group")) {
+                                                    Row row = sheet.getRow(y1 - 1);
+                                                    if (row != null) {
+                                                        Cell cell = row.getCell(x1 - 1);
+                                                        if (cell != null) {
+                                                            String exceVal = cell.getStringCellValue().replaceAll(" ", "");
+                                                            short fontIndex = cell.getCellStyle().getFontIndex();
+                                                            Font fontAt = workbook.getFontAt(fontIndex);
+                                                            fontAt.setFontName("EUDC");
+                                                            cell.setCellValue(exceVal.replace("□", "\u2611"));
+                                                        } else {
+                                                            ObjectUtils.isNotEmpty(cell);
+                                                        }
+                                                    }
+                                                } else {
+                                                    Row row = sheet.getRow(y1 - 1);
+                                                    if (row != null) {
+                                                        Cell cell = row.getCell(x1 - 1);
+                                                        if (cell != null) {
+                                                            cell.setCellValue(myData);
+                                                        } else {
+                                                            ObjectUtils.isNotEmpty(cell);
+                                                        }
+                                                    }
                                                 }
                                             }
-                                        } else {
-                                            picHeight = Integer.parseInt(dataInfo);
-                                        }
-                                    } else {
-                                        for (int i = y1; i <= (y1 + rowspan); i++) { // 跨列处理
-                                            String dataInfo = trs.get(i).attr("height");
-                                            if (StringUtils.isNotEmpty(dataInfo)) {
-                                                picHeight += Integer.parseInt(dataInfo);
-                                            }
                                         }
                                     }
-
-                                    if (colspan >= 1) {
-                                        for (int i = x1 - 1; i < x1 + colspan - 1; i++) {
-                                            String dataInfo = cols.get(i).attr("width").replaceAll("px", "");
-                                            if (StringUtils.isNotEmpty(dataInfo)) {
-                                                picWidth += Integer.parseInt(dataInfo);
-                                            }
-                                        }
-                                    }
-
-                                    ExcelPicture pic = sheet.getPictures().add(y1, x1, image);
-                                    pic.setAutoSize(true);
-                                    pic.setWidth(picWidth - 10);
-                                    pic.setHeight(picHeight);
-                                    pic.setLeft(5);
-                                } else {
-                                    CellRange cellRange = sheet.getCellRange(y1, x1);
-                                    cellRange.getCellStyle().getExcelFont().setFontName("EUDC");
-                                    cellRange.setText(myData);
                                 }
                             }
                         }
                     }
                 }
+
                 // 组装电签设置
                 QueryWrapper<TextdictInfo> queryWrapper = new QueryWrapper<>();
                 queryWrapper.select("col_key", "id");
-                queryWrapper.eq("type", 2);
+                queryWrapper.in("type", 2);
                 queryWrapper.eq("tab_id", wbsTreePrivate.getPKeyId());
-                List<TextdictInfo> textDictInfos = textdictInfoService.getBaseMapper().selectList(queryWrapper);
-                if (textDictInfos != null && !textDictInfos.isEmpty()) {
-                    for (TextdictInfo e : textDictInfos) {
+
+                List<TextdictInfo> textdictInfos = textdictInfoService.getBaseMapper().selectList(queryWrapper);
+                if (textdictInfos != null && !textdictInfos.isEmpty()) {
+                    for (TextdictInfo e : textdictInfos) {
                         String key = e.getColKey();
                         String[] keys = key.split("__");
-                        String[] trTd = keys[1].split("_");
-                        Element data = trs.get(Integer.parseInt(trTd[0])).select("td").get(Integer.parseInt(trTd[1]));
-                        int x1 = Integer.parseInt(data.children().get(0).attr("x1"));
-                        if (x1 == 0) {
-                            x1 = 1;
-                        }
-                        int y1 = Integer.parseInt(data.children().get(0).attr("y1"));
+                        String[] trtd = keys[1].split("_");
+                        if (Integer.parseInt(trtd[0]) < trs.size()) {
+                            Element ytzData = trs.get(Integer.parseInt(trtd[0]));
+                            if (ytzData != null) {
+                                Elements tdsx = ytzData.select("td");
+                                if (Integer.parseInt(trtd[1]) < tdsx.size()) {
+                                    Element data = ytzData.select("td").get(Integer.parseInt(trtd[1]));
+                                    if (data.html().indexOf("el-tooltip") >= 0) {
+                                        data = data.children().get(0);
+                                    }
+
+                                    int x1 = Integer.parseInt(data.children().get(0).attr("x1"));
+                                    if (x1 == 0) {
+                                        x1 = 1;
+                                    }
+                                    int y1 = Integer.parseInt(data.children().get(0).attr("y1"));
 
-                        final CellRange cellRange = sheet.getCellRange(y1, x1);
-                        cellRange.setText(e.getId() + "");
-                        cellRange.getCellStyle().getFont().setColor(Color.white);
+                                    Row row = sheet.getRow(y1 - 1);
+                                    if (row != null) {
+                                        Cell cell = sheet.getRow(y1 - 1).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(oldfontAt.getFontHeightInPoints());//设置字体大小
+                                            redFont.setFontName(oldfontAt.getFontName());//设置字体
+
+                                            CellStyle newStyle = workbook.createCellStyle(); //创建单元格样式
+                                            newStyle.cloneStyleFrom(cell.getCellStyle());
+                                            newStyle.setFont(redFont);
+                                            cell.setCellStyle(newStyle);
+                                            cell.setCellValue(e.getId() + "");
+                                        }
+                                    }
+                                }
+                            }
+                        }
                     }
                 }
             }
         }
 
-        wb.saveToFile(excelPath, ExcelVersion.Version2010);
-        FileUtils.excelToPdf(excelPath, pdfPath);
+        //输出流
+        FileOutputStream outputStream = new FileOutputStream(excelPath);
+        workbook.write(outputStream);
+        FileUtils.setExcelScaleToPdf(excelPath, pdfPath);
+
         BladeFile bladeFile = newIOSSClient.uploadFile(pkeyId + ".pdf", pdfPath);
         TableFile tableFile1 = tableFileService.getBaseMapper().selectOne(Wrappers.<TableFile>query().lambda().eq(TableFile::getTabId, pkeyId + "").eq(TableFile::getType, 1).eq(TableFile::getTrialRecordId, id));
         if (tableFile1 != null) {
@@ -2242,7 +2258,6 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
             }
             jdbcTemplate.execute(sql);
 
-            wb.dispose();
             return bladeFile2.getLink();
         }
 
@@ -2312,10 +2327,10 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
         String querySql = "select id from u_information_query where classify ='" + classify + "' and wbs_id ='" + id + "' and contract_id ='" + contractId + "'";
         List<InformationQuery> query = jdbcTemplate.query(querySql, new BeanPropertyRowMapper<>(InformationQuery.class));
         if (query.size() > 0) {
-            String updateSql = "update u_information_query set pdf_url ='" + bladeFile.getLink() + "', name ='" + trialProjectName + "'  where classify='" + classify + "' and  wbs_id='" + id + "' and contract_id ='" + contractId + "'";
+            String updateSql = "update u_information_query set pdf_url ='" + bladeFile.getLink() + "', name ='" + (StringUtils.isNotEmpty(trialProjectName) ? trialProjectName : "") + "'  where classify='" + classify + "' and  wbs_id='" + id + "' and contract_id ='" + contractId + "'";
             jdbcTemplate.execute(updateSql);
         } else {
-            informationQueryClient.saveData(id.toString(), projectId, contractId, classify, bladeFile.getLink(), trialProjectName);
+            informationQueryClient.saveData(id.toString(), projectId, contractId, classify, bladeFile.getLink(), StringUtils.isNotEmpty(trialProjectName) ? trialProjectName : "");
         }
 
         return bladeFile.getLink();

+ 252 - 175
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/FormulaServiceImpl.java

@@ -1,6 +1,7 @@
 package org.springblade.manager.service.impl;
 
 
+import cn.hutool.core.date.DateTime;
 import cn.hutool.core.util.HashUtil;
 import cn.hutool.log.StaticLog;
 import com.alibaba.fastjson.JSON;
@@ -73,6 +74,10 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
     private   Map<String,FormData> formDataMap;
     private   Map<String,Map<String,Object>> tableDataMaps;
 
+    private   List<FormData> checkItems;
+    private   List<FormData> checkDate;
+    private   List<FormData> summary;
+
 
 
     public final static String WP="WP";
@@ -109,6 +114,9 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
 
     @Override
     public IFormulaService init() {
+         this.checkItems= new ArrayList<>();
+         this.checkDate= new ArrayList<>();
+         this.summary = new ArrayList<>();
         this.tableDataMaps=this.tec.getTableDataMaps();
         this.formDataMap=this.tec.getFormDataMap();
         List<FormData> list =this.tec.getFds();
@@ -145,16 +153,16 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
         this.constantMap.put("tableNames",tableList.stream().filter(e->StringUtils.isEquals(e.getIsBussShow(),1)).map(WbsTreeContract::getNodeName).collect(Collectors.toList()));
         /*检查是否有跨节点数据*/
         /*获取type=1的检验单或者type=4的监表*/
-        List<Map<String,Object>>  inspectionElementMaps = new ArrayList<>();
-        Optional<AppWbsTreeContractVO> wop=tableList.stream().filter(e->e.getNodeName().contains("检验单")).findAny();
-        if(wop.isPresent()){
-            /*检验单或者监表的*/
-            inspectionElementMaps=  this.jdbcTemplate.queryForList(" select c.e_name name ,b.tab_en_name tableName,c.e_key ekey from m_wbs_tree_contract a join m_table_info b on a.init_table_name=b.tab_en_name join m_wbs_form_element c on c.f_id= b.id where a.p_key_id=" + wop.get().getPKeyId());
-        }
+//        List<Map<String,Object>>  inspectionElementMaps = new ArrayList<>();
+//        Optional<AppWbsTreeContractVO> wop=tableList.stream().filter(e->e.getNodeName().contains("检验单")).findAny();
+//        if(wop.isPresent()){
+//            /*检验单或者监表的*/
+//            inspectionElementMaps=  this.jdbcTemplate.queryForList(" select c.e_name name ,b.tab_en_name tableName,c.e_key ekey from m_wbs_tree_contract a join m_table_info b on a.init_table_name=b.tab_en_name join m_wbs_form_element c on c.f_id= b.id where a.p_key_id=" + wop.get().getPKeyId());
+//        }
         List<String> missingList = new ArrayList<>();
-        List<Map<String, Object>> finalInspectionElementMaps = inspectionElementMaps;
-        List<String> cki =new ArrayList<>();
-        AtomicReference<String> ckd= new AtomicReference<>("");
+//        List<Map<String, Object>> finalInspectionElementMaps = inspectionElementMaps;
+//        List<String> cki =new ArrayList<>();
+//        AtomicReference<String> ckd= new AtomicReference<>("");
         this.formDataList.forEach(fd->{
             if(fd.executable()){
                 relyParse(fd.getFormula());
@@ -167,31 +175,31 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
                         }
                     });
                 }
-                if(StringUtils.isEquals("CKI",f.getNumber())){
-                    finalInspectionElementMaps.forEach(m->{
-                        String name = StringUtils.handleNull(m.get("name"));
-                        if(name.contains("实测值")&&name.contains("偏差值")){
-                            String ekey = StringUtils.handleNull(m.get("tableName"))+":"+StringUtils.handleNull(m.get("ekey"));
-                            cki.add(ekey);
-                            if(this.formDataMap.values().stream().map(FormData::getCode).noneMatch(k->StringUtils.isEquals(k,ekey))){
-                                missingList.add(ekey);
-                            }
-                        }
-                    });
-                    f.setFormula("CKI");
-                }else  if(StringUtils.isEquals("CKD",f.getNumber())){
-                    finalInspectionElementMaps.forEach(m->{
-                        String name = StringUtils.handleNull(m.get("name"));
-                        if(name.contains("检验日期")){
-                            String ekey = StringUtils.handleNull(m.get("tableName"))+":"+StringUtils.handleNull(m.get("ekey"));
-                            ckd.set(ekey);
-                            if(!this.formDataMap.containsKey(ekey)&&this.formDataMap.values().stream().map(FormData::getCode).noneMatch(k->StringUtils.isEquals(k,ekey))){
-                                missingList.add(ekey);
-                            }
-                        }
-                    });
-                    f.setFormula("CKD");
-                }
+//                if(StringUtils.isEquals("CKI",f.getNumber())){
+//                    finalInspectionElementMaps.forEach(m->{
+//                        String name = StringUtils.handleNull(m.get("name"));
+//                        if(name.contains("实测值")&&name.contains("偏差值")){
+//                            String ekey = StringUtils.handleNull(m.get("tableName"))+":"+StringUtils.handleNull(m.get("ekey"));
+//                            cki.add(ekey);
+//                            if(this.formDataMap.values().stream().map(FormData::getCode).noneMatch(k->StringUtils.isEquals(k,ekey))){
+//                                missingList.add(ekey);
+//                            }
+//                        }
+//                    });
+//                    f.setFormula("CKI");
+//                }else  if(StringUtils.isEquals("CKD",f.getNumber())){
+//                    finalInspectionElementMaps.forEach(m->{
+//                        String name = StringUtils.handleNull(m.get("name"));
+//                        if(name.contains("检验日期")){
+//                            String ekey = StringUtils.handleNull(m.get("tableName"))+":"+StringUtils.handleNull(m.get("ekey"));
+//                            ckd.set(ekey);
+//                            if(!this.formDataMap.containsKey(ekey)&&this.formDataMap.values().stream().map(FormData::getCode).noneMatch(k->StringUtils.isEquals(k,ekey))){
+//                                missingList.add(ekey);
+//                            }
+//                        }
+//                    });
+//                    f.setFormula("CKD");
+//                }
 
             }
         });
@@ -200,26 +208,26 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
         if(Func.isNotEmpty(missingList)){
             this.tec.getLog().append("【没有能加载的跨节点数据:").append(missingList.stream().map(e->e.replaceAll("'","")).collect(Collectors.joining(","))).append("】");
         }
-        if(Func.isNotEmpty(cki)){
-           /*检验内容*/
-            List<String> sb = new ArrayList<>();
-            for(String s:cki){
-                FormData fdTmp=this.formDataMap.get(s);
-                if(fdTmp!=null&&fdTmp.getValues().stream().map(ElementData::getValue).anyMatch(e->StringUtils.isNotEmpty(e)&&StringUtils.isNotEquals("/",e))){
-                   sb.add(FormulaUtils.parseItemName(fdTmp.getEName()));
-                }
-            }
-            if(sb.size()>0){
-                this.constantMap.put(CHECK_ITEMS,sb.stream().distinct().filter(StringUtils::isNotEmpty).collect(Collectors.joining(",")));
-            }
-        }
-        if(Func.isNotBlank(ckd.get())){
-            /*检验时间*/
-            FormData fdTmp =   this.formDataMap.get(ckd.get());
-            if(fdTmp!=null){
-                this.constantMap.put("CKD",fdTmp.getValues().stream().map(ElementData::stringValue).collect(Collectors.joining(",")));
-            }
-        }
+//        if(Func.isNotEmpty(cki)){
+//           /*检验内容*/
+//            List<String> sb = new ArrayList<>();
+//            for(String s:cki){
+//                FormData fdTmp=this.formDataMap.get(s);
+//                if(fdTmp!=null&&fdTmp.getValues().stream().map(ElementData::getValue).anyMatch(e->StringUtils.isNotEmpty(e)&&StringUtils.isNotEquals("/",e))){
+//                   sb.add(FormulaUtils.parseItemName(fdTmp.getEName()));
+//                }
+//            }
+//            if(sb.size()>0){
+//                this.constantMap.put(CHECK_ITEMS,sb.stream().distinct().filter(StringUtils::isNotEmpty).collect(Collectors.joining(",")));
+//            }
+//        }
+//        if(Func.isNotBlank(ckd.get())){
+//            /*检验时间*/
+//            FormData fdTmp =   this.formDataMap.get(ckd.get());
+//            if(fdTmp!=null){
+//                this.constantMap.put("CKD",fdTmp.getValues().stream().map(ElementData::stringValue).collect(Collectors.joining(",")));
+//            }
+//        }
 
         /*实测值参数*/
         List<Map<String,Object>>  textInfoMap= this.jdbcTemplate.queryForList("SELECT b.tab_id pkId,b.col_name val ,CONCAT(a.init_table_name,':',b.col_key)code from m_wbs_tree_contract a inner join m_textdict_info b on a.p_key_id=b.tab_id   " +
@@ -433,9 +441,45 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
         /*初始化排序值,每个点间隔1000,方便插入*/
         AtomicInteger sort= new AtomicInteger();
         this.formDataList.forEach(e->e.setSort(sort.getAndAdd(1000)));
+        /*汇总阶段执行的公式*/
+        summaryPre();
         return this;
     }
 
+    /*汇总阶段执行的公式*/
+    public void summaryPre(){
+        this.formDataList.stream().filter(e->StringUtils.isEquals("CKI",e.getFormula().getNumber())||StringUtils.isEquals("CKD",e.getFormula().getNumber())).forEach(t->this.summary.add(t));
+        this.formDataList.removeAll(this.summary);
+        /*监表的处理*/
+        Optional<AppWbsTreeContractVO> aop=tec.getTableAll().stream().filter(e->e.getNodeName().contains("A15")).findAny();
+        if(aop.isPresent()){
+            /*存在监表,则需要收集检查项目和检查时间等元素*/
+            Optional<AppWbsTreeContractVO> wop=tec.getTableAll().stream().filter(e->e.getNodeName().contains("检验单")||e.getNodeName().contains("检验表")).findAny();
+            if(wop.isPresent()){
+                /*存在检验表*/
+                tec.getKeyMappers().stream().filter(e->StringUtils.isEquals(wop.get().getInitTableName(),e.getTableName())&&this.formDataMap.containsKey(e.getCode())).forEach(k->{
+                    if(k.getEName().contains("实测值")&&k.getEName().contains("偏差值")){
+                        this.checkItems.add(this.formDataMap.get(k.getCode()));
+                    }else if(k.getEName().contains("检验日期")){
+                        this.checkDate.add(this.formDataMap.get(k.getCode()));
+                    }
+                });
+            }else{
+                /*不存在检验表的的情况则获取记录表*/
+                List<String> recordTable=tec.getTableAll().stream().filter(e->StringUtils.isEquals(2,e.getTableType())).map(AppWbsTreeContractVO::getInitTableName).distinct().collect(Collectors.toList());
+                tec.getKeyMappers().stream().filter(k->recordTable.contains(k.getTableName())).map(k->k.getCode()+"@"+k.getEName()).distinct().forEach(k->{
+                    String[] ka=k.split("@");
+                    if(ka[1].contains("实测值")){
+                        this.checkItems.add(this.formDataMap.get(ka[0]));
+                    }else if(ka[1].contains("日期")||ka[1].contains("年月日")){
+                        this.checkDate.add(this.formDataMap.get(ka[0]));
+                    }
+                });
+
+            }
+        }
+    }
+
     @Override
     public IFormulaService pre() {
         if(CollectionUtil.isNotEmpty(this.formDataList)){
@@ -497,6 +541,17 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
 
     @Override
     public IFormulaService calculate() {
+        /*通用计算*/
+        generalCalc();
+       /*汇总信息处理*/
+        summaryCalc();
+       /*附表的处理*/
+        forSubTb();
+        return this;
+    }
+
+    /**通用计算*/
+    public void generalCalc(){
         for(FormData fd:this.formDataList){
             if(fd.verify()){
                 Formula formula =fd.getFormula();
@@ -521,16 +576,16 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
                             }
                             if(fd.getCoordsList().size()>1&&f.split("[/+\\-*]").length>1){
                                 LinkedHashMap<String,FormData> fdMap =new LinkedHashMap<>();
-                               Optional<FormData> tto= ele.stream().max(Comparator.comparingInt(fe->fe.getValues().size()));
-                               Optional<FormData> tts= ele.stream().min(Comparator.comparingInt(fe->fe.getValues().size()));
-                               if(tto.isPresent()&&tts.isPresent()){
-                                   if(tto.get().getValues().size()!=tts.get().getValues().size()){
-                                       int baseLength=tto.get().getValues().size();
-                                       ele.forEach(e->{
-                                           e.setStep(baseLength/e.getValues().size());
-                                       });
-                                   }
-                               }
+                                Optional<FormData> tto= ele.stream().max(Comparator.comparingInt(fe->fe.getValues().size()));
+                                Optional<FormData> tts= ele.stream().min(Comparator.comparingInt(fe->fe.getValues().size()));
+                                if(tto.isPresent()&&tts.isPresent()){
+                                    if(tto.get().getValues().size()!=tts.get().getValues().size()){
+                                        int baseLength=tto.get().getValues().size();
+                                        ele.forEach(e->{
+                                            e.setStep(baseLength/e.getValues().size());
+                                        });
+                                    }
+                                }
                                 ele.forEach(e->{
                                     fdMap.put(e.getCode(),e);
                                 });
@@ -577,129 +632,147 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
                 fd.setUpdate(1);
             }
         }
-
-/*###############################附表的处理##################################*/
-        if(true) {//临时开关,稳定后移除
-            try {
-                /*检验单附表处理*/
-                List<FormData> inspectionList = new ArrayList<>();
-                this.tec.getTableAll().stream().filter(e -> e.getNodeName().contains("检验单") || e.getNodeName().contains("评定表")).forEach(e -> {
-                    /*获取所有挂在表里的元素映射关系*/
-                    this.tec.getKeyMappers().stream().filter(p -> p.getPkId().equals(e.getPKeyId())).forEach(k -> {
-                        /*元素长度筛选超页的元素*/
-                        List<FormData> target = this.formDataMap.values().stream().filter(f -> f.getCode().equals(k.getCode()) && f.getAddPages() > 0).collect(Collectors.toList());
-                        if (Func.isNotEmpty(target)) {
-                            inspectionList.addAll(target);
-                        }
-                    });
+    }
+    /**附表处理*/
+    public void forSubTb(){
+        try {
+            /*检验单附表处理*/
+            List<FormData> inspectionList = new ArrayList<>();
+            this.tec.getTableAll().stream().filter(e -> e.getNodeName().contains("检验单") || e.getNodeName().contains("评定表")).forEach(e -> {
+                /*获取所有挂在表里的元素映射关系*/
+                this.tec.getKeyMappers().stream().filter(p -> p.getPkId().equals(e.getPKeyId())).forEach(k -> {
+                    /*元素长度筛选超页的元素*/
+                    List<FormData> target = this.formDataMap.values().stream().filter(f -> f.getCode().equals(k.getCode()) && f.getAddPages() > 0).collect(Collectors.toList());
+                    if (Func.isNotEmpty(target)) {
+                        inspectionList.addAll(target);
+                    }
                 });
-                if (Func.isNotEmpty(inspectionList)) {
-                    /*检查是否存在附表,不存在挂载*/
-                    List<AppWbsTreeContractVO> subTabList = this.tec.getTableAll().stream().filter(e -> e.getNodeName().contains("附表")).collect(Collectors.toList());
-                    if (subTabList.size() == 0) {
-                        boolean pd=tec.getTableAll().stream().anyMatch(e->e.getNodeName().contains("评定表"));
-                        WbsTreePrivate sub = wbsTreePrivateService.getOne(Wrappers.<WbsTreePrivate>lambdaQuery().and(e->e.eq(WbsTreePrivate::getNodeName, pd?"质量检验评定表(附表)":"质量检验表(附表)").or().eq(WbsTreePrivate::getFullName, pd?"质量检验评定表(附表)":"质量检验表(附表)")).eq(WbsTreePrivate::getProjectId, tec.getProjectId()).eq(WbsTreePrivate::getIsLinkTable,2));
-                        if (sub == null) {
-                            this.tec.getLog().append("该项目没有挂有附表信息");
-                        } else {
-                            this.wbsTreePrivateService.addWbsTreeContractInfo(this.tec.getCurrentNode().getPkId().toString(), sub.getPKeyId().toString(), tec.getContractId());
-                            AppWbsTreeContractVO one = this.tec.getTableAll().get(0);
-                            WbsTreeContract wtc = this.wbsTreeContractService.getOne(Wrappers.<WbsTreeContract>lambdaQuery().eq(WbsTreeContract::getParentId, one.getParentId()).eq(WbsTreeContract::getContractId,one.getContractId()).eq(WbsTreeContract::getWbsId, one.getWbsId()).and(e->e.eq(WbsTreeContract::getNodeName, pd?"质量检验评定表(附表)":"质量检验表(附表)").or().eq(WbsTreeContract::getFullName, pd?"质量检验评定表(附表)":"质量检验表(附表)")));
-                            if (wtc != null) {
-                                /*附表的顺序在检验单或者评定表之后*/
-                                int sort=this.tec.getTableAll().stream().filter(e -> e.getNodeName().contains("检验单") || e.getNodeName().contains("评定表")).map(AppWbsTreeContractVO::getSort).max(Integer::compareTo).orElse(30);
-                                this.wbsTreeContractService.update(Wrappers.<WbsTreeContract>lambdaUpdate()
-                                        .set(WbsTreeContract::getSort,sort).set(WbsTreeContract::getContractType,-1).set(WbsTreeContract::getAncestors,one.getAncestors())
-                                        .set(WbsTreeContract::getIsCopeTab,2)
-                                        .eq(WbsTreeContract::getPKeyId,wtc.getPKeyId()));
-                                /*只需要挂载一张*/
-                                AppWbsTreeContractVO obj = BeanUtil.copy(wtc, AppWbsTreeContractVO.class);
-                                this.tec.getTableAll().add(obj);
-                                subTabList.add(obj);
-                            }
+            });
+            if (Func.isNotEmpty(inspectionList)) {
+                /*检查是否存在附表,不存在挂载*/
+                List<AppWbsTreeContractVO> subTabList = this.tec.getTableAll().stream().filter(e -> e.getNodeName().contains("附表")).collect(Collectors.toList());
+                if (subTabList.size() == 0) {
+                    boolean pd=tec.getTableAll().stream().anyMatch(e->e.getNodeName().contains("评定表"));
+                    WbsTreePrivate sub = wbsTreePrivateService.getOne(Wrappers.<WbsTreePrivate>lambdaQuery().and(e->e.eq(WbsTreePrivate::getNodeName, pd?"质量检验评定表(附表)":"质量检验表(附表)").or().eq(WbsTreePrivate::getFullName, pd?"质量检验评定表(附表)":"质量检验表(附表)")).eq(WbsTreePrivate::getProjectId, tec.getProjectId()).eq(WbsTreePrivate::getIsLinkTable,2));
+                    if (sub == null) {
+                        this.tec.getLog().append("该项目没有挂有附表信息");
+                    } else {
+                        this.wbsTreePrivateService.addWbsTreeContractInfo(this.tec.getCurrentNode().getPkId().toString(), sub.getPKeyId().toString(), tec.getContractId());
+                        AppWbsTreeContractVO one = this.tec.getTableAll().get(0);
+                        WbsTreeContract wtc = this.wbsTreeContractService.getOne(Wrappers.<WbsTreeContract>lambdaQuery().eq(WbsTreeContract::getParentId, one.getParentId()).eq(WbsTreeContract::getContractId,one.getContractId()).eq(WbsTreeContract::getWbsId, one.getWbsId()).and(e->e.eq(WbsTreeContract::getNodeName, pd?"质量检验评定表(附表)":"质量检验表(附表)").or().eq(WbsTreeContract::getFullName, pd?"质量检验评定表(附表)":"质量检验表(附表)")));
+                        if (wtc != null) {
+                            /*附表的顺序在检验单或者评定表之后*/
+                            int sort=this.tec.getTableAll().stream().filter(e -> e.getNodeName().contains("检验单") || e.getNodeName().contains("评定表")).map(AppWbsTreeContractVO::getSort).max(Integer::compareTo).orElse(30);
+                            this.wbsTreeContractService.update(Wrappers.<WbsTreeContract>lambdaUpdate()
+                                    .set(WbsTreeContract::getSort,sort).set(WbsTreeContract::getContractType,-1).set(WbsTreeContract::getAncestors,one.getAncestors())
+                                    .set(WbsTreeContract::getIsCopeTab,2)
+                                    .eq(WbsTreeContract::getPKeyId,wtc.getPKeyId()));
+                            /*只需要挂载一张*/
+                            AppWbsTreeContractVO obj = BeanUtil.copy(wtc, AppWbsTreeContractVO.class);
+                            this.tec.getTableAll().add(obj);
+                            subTabList.add(obj);
                         }
                     }
-                    AppWbsTreeContractVO first = subTabList.get(0);
-                    if (tec.getTableInfoList().stream().noneMatch(e -> StringUtils.isEquals(e.getPkeyId(), first.getPKeyId()))) {
-                        /*找不到附表表单数据,则从数据库加载*/
-                        JSONArray dataArray = new JSONArray();
-                        for (WbsTreeContract data : subTabList) {
-                            /*自动挂载附表情况下,装配TableInfo数据*/
-                            R bussDataInfo = this.getBussDataInfo(data.getPKeyId(), 1);
-                            Map<String, Object>  data1 = (Map<String, Object>) bussDataInfo.getData();
-                            data1.put("pkeyId",data.getPKeyId());
-                            dataArray.add(data1);
-                        }
-                        List<TableInfo> subTableInfo = FormulaUtils.getTableInfoList(dataArray);
-                        TableInfo example = tec.getTableInfoList().get(0);
-                        subTableInfo.forEach(e -> {
-                            e.setToBeUpdated(true);
-                            e.setBusinessId(null);
-                            e.setContractId(example.getContractId());
-                            e.setClassify(example.getClassify());
-                            e.setProjectId(example.getProjectId());
-                            e.setGroupId(example.getGroupId());
+                }
+                AppWbsTreeContractVO first = subTabList.get(0);
+                if (tec.getTableInfoList().stream().noneMatch(e -> StringUtils.isEquals(e.getPkeyId(), first.getPKeyId()))) {
+                    /*找不到附表表单数据,则从数据库加载*/
+                    JSONArray dataArray = new JSONArray();
+                    for (WbsTreeContract data : subTabList) {
+                        /*自动挂载附表情况下,装配TableInfo数据*/
+                        R bussDataInfo = this.getBussDataInfo(data.getPKeyId(), 1);
+                        Map<String, Object>  data1 = (Map<String, Object>) bussDataInfo.getData();
+                        data1.put("pkeyId",data.getPKeyId());
+                        dataArray.add(data1);
+                    }
+                    List<TableInfo> subTableInfo = FormulaUtils.getTableInfoList(dataArray);
+                    TableInfo example = tec.getTableInfoList().get(0);
+                    subTableInfo.forEach(e -> {
+                        e.setToBeUpdated(true);
+                        e.setBusinessId(null);
+                        e.setContractId(example.getContractId());
+                        e.setClassify(example.getClassify());
+                        e.setProjectId(example.getProjectId());
+                        e.setGroupId(example.getGroupId());
+                    });
+                    tec.getTableInfoList().addAll(subTableInfo);
+                    /*获取附表元素定位集*/
+                    tec.getCoordinateMap().put(subTabList.get(0).getInitTableName(), CustomFunction.getElementCell(first.getHtmlUrl()));
+                    /*附表元素关键信息*/
+                    List<Map<String, Object>> elementMaps = this.jdbcTemplate.queryForList("select b.e_name ename , CONCAT(a.tab_en_name,':',b.e_key) code , b.e_key ekey ,b.id fieldId,a.tab_en_name tableName from m_table_info a join m_wbs_form_element b on a.id = b.f_id where a.tab_en_name='" + first.getInitTableName() + "' and b.is_deleted=0 ");
+                    if (Func.isNotEmpty(elementMaps)) {
+                        elementMaps.forEach(e->{
+                            /*装配元素*/
+                            String values=subTableInfo.stream().map(TableInfo::getDataMap).map(m->m.get(StringUtils.handleNull(e.get("ekey")))).filter(StringUtils::isNotEmpty).collect(Collectors.joining(";;"));
+                            FormData tmp=  createFormDataFast(StringUtils.handleNull(e.get("ename")),StringUtils.handleNull(e.get("code")),values);
+                            if(tmp!=null){
+                                this.formDataMap.put(tmp.getCode(),tmp);
+                                this.formDataList.add(tmp);
+                            }
                         });
-                        tec.getTableInfoList().addAll(subTableInfo);
-                        /*获取附表元素定位集*/
-                        tec.getCoordinateMap().put(subTabList.get(0).getInitTableName(), CustomFunction.getElementCell(first.getHtmlUrl()));
-                        /*附表元素关键信息*/
-                        List<Map<String, Object>> elementMaps = this.jdbcTemplate.queryForList("select b.e_name ename , CONCAT(a.tab_en_name,':',b.e_key) code , b.e_key ekey ,b.id fieldId,a.tab_en_name tableName from m_table_info a join m_wbs_form_element b on a.id = b.f_id where a.tab_en_name='" + first.getInitTableName() + "' and b.is_deleted=0 ");
-                        if (Func.isNotEmpty(elementMaps)) {
+                        /*生成元素映射关系*/
+                        subTabList.forEach(s->{
                             elementMaps.forEach(e->{
-                                /*装配元素*/
-                                String values=subTableInfo.stream().map(TableInfo::getDataMap).map(m->m.get(StringUtils.handleNull(e.get("ekey")))).filter(StringUtils::isNotEmpty).collect(Collectors.joining(";;"));
-                                FormData tmp=  createFormDataFast(StringUtils.handleNull(e.get("ename")),StringUtils.handleNull(e.get("code")),values);
-                                if(tmp!=null){
-                                    this.formDataMap.put(tmp.getCode(),tmp);
-                                    this.formDataList.add(tmp);
-                                }
-                            });
-                            /*生成元素映射关系*/
-                            subTabList.forEach(s->{
-                                elementMaps.forEach(e->{
-                                    KeyMapper km = new KeyMapper();
-                                     km.setPkId(s.getPKeyId());
-                                     km.setField(StringUtils.handleNull(e.get("ekey")));
-                                     km.setFieldId(Func.toLong(e.get("fieldId")));
-                                     km.setTableName(StringUtils.handleNull(e.get("tableName")));
-                                     this.tec.getKeyMappers().add(km);
-                                });
+                                KeyMapper km = new KeyMapper();
+                                km.setPkId(s.getPKeyId());
+                                km.setField(StringUtils.handleNull(e.get("ekey")));
+                                km.setFieldId(Func.toLong(e.get("fieldId")));
+                                km.setTableName(StringUtils.handleNull(e.get("tableName")));
+                                this.tec.getKeyMappers().add(km);
                             });
+                        });
 
-                        }
                     }
-                    /*获取封装好的附表元素*/
-                    List<FormData> subTableFds=this.formDataMap.values().stream().filter(e->StringUtils.isEquals(first.getInitTableName(),e.getTableName())).collect(Collectors.toList());
-                    /*初始化附表对象*/
-                    SubTable sta=new SubTable(subTableFds);
-                    /*根据行号排序*/
-                    inspectionList.sort(Comparator.comparingInt(e->e.getCoordsList().get(0).getY()));
-                    inspectionList.forEach(f -> {
-                        /*检验单或者评定表存的超页数据汇总到附表对象*/
-                           List<ElementData> overList = f.getValues().stream().skip(f.getCoordsList().size()).collect(Collectors.toList());
-                           f.setValues(f.getValues().stream().limit(f.getCoordsList().size()).collect(Collectors.toList()));
-                           f.setAddPages(0);
-                           String itemName=FormulaUtils.parseItemName(f.getEName());
-                           String key=itemName.trim();
-                           /*同项目*/
-                           Optional<FormData> designFdOp=  this.formDataMap.values().stream().filter(o->o.getTableName().equals(f.getTableName())&&StringUtils.isEquals(itemName,FormulaUtils.parseItemName(o.getEName()))&&o.getEName().contains("设计值")&&!o.getEName().contains("判定")).findAny();
-                           if(designFdOp.isPresent()){
-                               key+="@"+designFdOp.get().getValues().stream().map(ElementData::getValue).filter(StringUtils::isNotEmpty).findAny().orElse("");
-                           }
-                           sta.put(key,setScale(2,overList));
-                    });
-                    if(sta.checked()){
-                        /*把附表数据刷入对应的附表元素对象*/
-                        sta.flush();
+                }
+                /*获取封装好的附表元素*/
+                List<FormData> subTableFds=this.formDataMap.values().stream().filter(e->StringUtils.isEquals(first.getInitTableName(),e.getTableName())).collect(Collectors.toList());
+                /*初始化附表对象*/
+                SubTable sta=new SubTable(subTableFds);
+                /*根据行号排序*/
+                inspectionList.sort(Comparator.comparingInt(e->e.getCoordsList().get(0).getY()));
+                inspectionList.forEach(f -> {
+                    /*检验单或者评定表存的超页数据汇总到附表对象*/
+                    List<ElementData> overList = f.getValues().stream().skip(f.getCoordsList().size()).collect(Collectors.toList());
+                    f.setValues(f.getValues().stream().limit(f.getCoordsList().size()).collect(Collectors.toList()));
+                    f.setAddPages(0);
+                    String itemName=FormulaUtils.parseItemName(f.getEName());
+                    String key=itemName.trim();
+                    /*同项目*/
+                    Optional<FormData> designFdOp=  this.formDataMap.values().stream().filter(o->o.getTableName().equals(f.getTableName())&&StringUtils.isEquals(itemName,FormulaUtils.parseItemName(o.getEName()))&&o.getEName().contains("设计值")&&!o.getEName().contains("判定")).findAny();
+                    if(designFdOp.isPresent()){
+                        key+="@"+designFdOp.get().getValues().stream().map(ElementData::getValue).filter(StringUtils::isNotEmpty).findAny().orElse("");
                     }
+                    sta.put(key,setScale(2,overList));
+                });
+                if(sta.checked()){
+                    /*把附表数据刷入对应的附表元素对象*/
+                    sta.flush();
                 }
-            } catch (Exception e) {
-                this.tec.getLog().append("【").append("附表异常").append("】");
-                e.printStackTrace();
             }
+        } catch (Exception e) {
+            this.tec.getLog().append("【").append("附表异常").append("】");
+            e.printStackTrace();
+        }
+    }
+    /**汇总处理*/
+    public void summaryCalc(){
+        if(this.summary.size()>0){
+            /**/
+            this.constantMap.put(CHECK_ITEMS,this.checkItems.stream().filter(fdTmp->fdTmp.getValues().stream().map(ElementData::getValue).anyMatch(e->StringUtils.isNotEmpty(e)&&StringUtils.isNotEquals("/",e))).map(FormData::getEName).map(FormulaUtils::parseItemName).distinct().collect(Collectors.joining(",")));
+            this.constantMap.put("CKD",this.checkDate.stream().flatMap(k->k.getValues().stream()).map(ElementData::stringValue).map(DateTime::new).reduce((a, b) -> Comparator.<DateTime>reverseOrder().compare(a, b) <= 0 ? a : b).orElse(null));
+            this.summary.forEach(e->{
+                /*处理脚本*/
+                e.getFormula().setFormula(e.getFormula().getNumber());
+            });
+            this.summary.forEach(e->{
+                /*执行公式*/
+                Object data = Expression.parse(e.getFormula().getFormula()).calculate(this.constantMap);
+                if(data!=null){
+                    FormulaUtils.write(e,data,false);
+                   e.setUpdate(1);
+                }
+            });
         }
-        return this;
     }
 
     public  void write(FormData fd,Object data){
@@ -709,6 +782,10 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
 
     /**加页增容*/
    public void copy(FormData fd){
+       if(fd.getAddPages()>20){
+           /*最大页数20*/
+           return;
+       }
        int pageAdd=fd.getAddPages();
        LinkedHashMap<String,List<KeyMapper>> tabs = this.tec.getKeyMappers().stream().collect(Collectors.groupingBy(KeyMapper::getCode,LinkedHashMap::new,Collectors.toList()));
        List<KeyMapper> kms = tabs.get(fd.getCode());

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

@@ -97,8 +97,8 @@ public class WbsTreeContractServiceImpl extends BaseServiceImpl<WbsTreeContractM
         //当前合同段所有节点ids
         List<String> collect2 = new ArrayList<>();
         if (list.size() > 0) {
-            collect1 = list.stream().filter(f -> f.getType() == 2).collect(Collectors.toList()).stream().map(WbsTreeContract::getId).collect(Collectors.toList()).stream().map(String::valueOf).collect(Collectors.toList());
-            collect2 = list.stream().filter(f -> f.getType() == 1).collect(Collectors.toList()).stream().map(WbsTreeContract::getId).collect(Collectors.toList()).stream().map(String::valueOf).collect(Collectors.toList());
+            collect1 = list.stream().filter(f -> f.getType() == 2).collect(Collectors.toList()).stream().map(WbsTreeContract::getId).map(String::valueOf).collect(Collectors.toList());
+            collect2 = list.stream().filter(f -> f.getType() == 1).collect(Collectors.toList()).stream().map(WbsTreeContract::getId).map(String::valueOf).collect(Collectors.toList());
         }
 
         List<String> collect3 = collect2;
@@ -122,7 +122,7 @@ public class WbsTreeContractServiceImpl extends BaseServiceImpl<WbsTreeContractM
                 });
             });
 
-            List<String> collect = wbsTreePrivateList2.stream().map(WbsTreePrivate::getId).collect(Collectors.toList()).stream().map(String::valueOf).collect(Collectors.toList());
+            List<String> collect = wbsTreePrivateList2.stream().map(WbsTreePrivate::getId).map(String::valueOf).collect(Collectors.toList());
 
             List<String> diffRent1 = DiffListUtil.getDiffRent(collect, collect1);
 

+ 12 - 6
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/WbsTreePrivateServiceImpl.java

@@ -1487,22 +1487,28 @@ public class WbsTreePrivateServiceImpl extends BaseServiceImpl<WbsTreePrivateMap
     @Async
     @Override
     public void batchResetHtmlUrl(List<WbsTreePrivate> wbsTreePrivateList) throws IOException, InterruptedException {
+        Thread.sleep(10000L);
         if (wbsTreePrivateList != null) {
             //存在htmlUrl才重新保存
             wbsTreePrivateList = wbsTreePrivateList.stream().filter(wtp -> StringUtils.isNotBlank(wtp.getHtmlUrl())).collect(Collectors.toList());
             String file_path = ParamCache.getValue(CommonConstant.SYS_LOCAL_URL);
             //批量复制保存html
             for (WbsTreePrivate tree : wbsTreePrivateList) {
+                String[] split = tree.getHtmlUrl().split("/");
                 File file_in = ResourceUtil.getFile(tree.getHtmlUrl());
-                String fileCode = SnowFlakeUtil.getId() + "";
-                String htmlUrl = file_path + "/privateUrlCopy/" + fileCode + ".html";
+//                File file_in = ResourceUtil.getFile("C:\\Users\\泓创研发01\\Desktop\\privateUrl\\"+split[split.length-1]);
+                if (!file_in.exists() || file_in==null || file_in.length()==0){
+                    continue;
+                }
+                String htmlUrl = file_path + "/privateUrlCopy/" + split[split.length-1];
+//                String htmlUrl = "C:\\Users\\泓创研发01\\Desktop\\privateUrlCopy\\" + split[split.length-1];
                 File file_out = ResourceUtil.getFile(htmlUrl);
                 FileUtil.copy(file_in, file_out);
                 tree.setHtmlUrl(htmlUrl);
             }
             //批量修改
             if (wbsTreePrivateList.size() > 1000) {
-                List<List<WbsTreePrivate>> splitList = CommonUtil.splitList(wbsTreePrivateList, 1000);
+                List<List<WbsTreePrivate>> splitList = CommonUtil.splitList(wbsTreePrivateList, 800);
                 for (List<WbsTreePrivate> list : splitList) {
                     baseMapper.updateBatchByPKeyId(list);
                 }
@@ -1857,10 +1863,10 @@ public class WbsTreePrivateServiceImpl extends BaseServiceImpl<WbsTreePrivateMap
         }*/
 
         //标题解决
-        /*ProjectInfo projectInfo = projectInfoMapper.selectById(wbsTreePrivate.getProjectId());
+        ProjectInfo projectInfo = projectInfoMapper.selectById(wbsTreePrivate.getProjectId());
         //添加标题显示
         Elements trs = table.select("tr");
-        for (int i = 0; i < 6; i++) {
+        for (int i = 1; i < 6; i++) {
             Element tr = trs.get(i);
             Elements tds = tr.select("td");
             for (int j = 0; j < tds.size(); j++) {
@@ -1874,7 +1880,7 @@ public class WbsTreePrivateServiceImpl extends BaseServiceImpl<WbsTreePrivateMap
                     }
                 }
             }
-        }*/
+        }
 
         //获取公式颜色
         String tabName = wbsTreePrivate.getInitTableName();