Ver código fonte

Merge remote-tracking branch 'origin/master' into master

yangyj 1 ano atrás
pai
commit
0901ff566f
18 arquivos alterados com 465 adições e 273 exclusões
  1. 0 3
      blade-service-api/blade-business-api/src/main/java/org/springblade/business/entity/ImageClassificationFile.java
  2. 1 1
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/DateFormat.java
  3. 38 2
      blade-service/blade-business/src/main/java/org/springblade/business/controller/ContractLogController.java
  4. 4 9
      blade-service/blade-business/src/main/java/org/springblade/business/controller/ImageClassificationFileController.java
  5. 1 1
      blade-service/blade-business/src/main/java/org/springblade/business/service/impl/ContractLogServiceImpl.java
  6. 7 2
      blade-service/blade-business/src/main/java/org/springblade/business/service/impl/ImageClassificationFileServiceImpl.java
  7. 1 1
      blade-service/blade-manager/src/main/java/com/mixsmart/utils/FormulaUtils.java
  8. 1 1
      blade-service/blade-manager/src/main/java/org/springblade/manager/controller/ContractInfoController.java
  9. 138 78
      blade-service/blade-manager/src/main/java/org/springblade/manager/controller/ExcelTabController.java
  10. 36 36
      blade-service/blade-manager/src/main/java/org/springblade/manager/controller/TextdictInfoController.java
  11. 1 1
      blade-service/blade-manager/src/main/java/org/springblade/manager/controller/WbsParamController.java
  12. 1 1
      blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/ContractInfoMapper.java
  13. 0 11
      blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/ContractInfoMapper.xml
  14. 34 19
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ContractInfoServiceImpl.java
  15. 31 11
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ExcelTabServiceImpl.java
  16. 40 73
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/WbsTreeContractServiceImpl.java
  17. 130 23
      blade-service/blade-manager/src/main/java/org/springblade/manager/utils/ExcelInfoUtils.java
  18. 1 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/utils/FileUtils.java

+ 0 - 3
blade-service-api/blade-business-api/src/main/java/org/springblade/business/entity/ImageClassificationFile.java

@@ -127,7 +127,4 @@ public class ImageClassificationFile extends BaseEntity {
     @ApiModelProperty("合并后的PDF")
     private String margePdfUrl;
 
-    @ApiModelProperty("视频封面图Url地址")
-    private String videoCoverUrl;
-
 }

+ 1 - 1
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/DateFormat.java

@@ -40,5 +40,5 @@ public class DateFormat implements Serializable {
     /**
      * 值
      */
-    private String val;
+    private String value;
 }

+ 38 - 2
blade-service/blade-business/src/main/java/org/springblade/business/controller/ContractLogController.java

@@ -25,13 +25,16 @@ import org.springblade.business.utils.YearTreeUtils;
 import org.springblade.business.vo.*;
 import org.springblade.common.constant.CommonConstant;
 import org.springblade.common.utils.SnowFlakeUtil;
+import org.springblade.core.log.exception.ServiceException;
 import org.springblade.core.oss.model.BladeFile;
 import org.springblade.core.secure.utils.AuthUtil;
+import org.springblade.core.secure.utils.SecureUtil;
 import org.springblade.core.tool.api.R;
 import org.springblade.core.tool.utils.Func;
 import org.springblade.core.tool.utils.ObjectUtil;
 import org.springblade.manager.entity.ContractInfo;
 import org.springblade.manager.entity.ProjectInfo;
+import org.springblade.manager.entity.WbsTreePrivate;
 import org.springblade.manager.feign.ContractClient;
 import org.springblade.manager.feign.ProjectClient;
 import org.springblade.manager.feign.WbsTreeContractClient;
@@ -39,6 +42,8 @@ import org.springblade.manager.vo.WbsTreeContractTreeVOS;
 import org.springblade.resource.feign.NewIOSSClient;
 import org.springblade.system.cache.ParamCache;
 import org.springframework.beans.BeanUtils;
+import org.springframework.jdbc.core.BeanPropertyRowMapper;
+import org.springframework.jdbc.core.JdbcTemplate;
 import org.springframework.web.bind.annotation.*;
 import org.springblade.business.service.IContractLogService;
 import org.springblade.core.boot.ctrl.BladeController;
@@ -82,6 +87,8 @@ public class ContractLogController extends BladeController {
 
     private final WebSocket webSocket;
 
+    private final JdbcTemplate jdbcTemplate;
+
     /**
      * 获取填报记录
      */
@@ -133,9 +140,38 @@ public class ContractLogController extends BladeController {
                 idList = Func.toLongList(ids.toString());
             }
 
-            return R.status(this.contractLogService.deleteLogic(idList));
+            //获取需要删除的日志记录分组信息
+            List<ContractLog> contractLogListGroup = this.contractLogService.getBaseMapper().selectBatchIds(idList);
+            for (ContractLog contractLog : contractLogListGroup) {
+                if (!contractLog.getCreateUser().equals(AuthUtil.getUserId())) {
+                    throw new ServiceException("当前选择删除的日志信息不是当前用户创建的,操作失败");
+                }
+
+                //获取对应表信息
+                WbsTreePrivate tableTemp = jdbcTemplate.queryForObject("select * from m_wbs_tree_private where p_key_id = " + contractLog.getTableId(), new BeanPropertyRowMapper<>(WbsTreePrivate.class));
+
+                //获取当前日期下当前用户的记录信息
+                List<ContractLog> contractLogList = this.contractLogService.getBaseMapper().selectList(Wrappers.<ContractLog>lambdaQuery()
+                        .eq(ContractLog::getWbsNodeId, contractLog.getWbsNodeId())
+                        .eq(ContractLog::getRecordTime, contractLog.getRecordTime())
+                        .eq(ContractLog::getContractId, contractLog.getContractId())
+                        .eq(ContractLog::getCreateUser, AuthUtil.getUserId()));
+
+                for (ContractLog log : contractLogList) {
+                    //删除施工日志记录信息
+                    jdbcTemplate.execute("delete from u_contract_log where data_id = " + log.getDataId());
+                    //删除关联的工序wbs信息
+                    jdbcTemplate.execute("delete from u_contract_log_wbs where business_id = " + log.getDataId() + " and contract_log_id = " + log.getId());
+
+                    if (tableTemp != null && StringUtils.isNotEmpty(tableTemp.getInitTableName())) {
+                        //删除实体表对应的数据信息
+                        jdbcTemplate.execute("delete from " + tableTemp.getInitTableName() + " where id = " + log.getDataId());
+                    }
+                }
+            }
+            return R.success("操作成功");
         }
-        return R.data(300, false, "未找到具体数据");
+        return R.fail("操作失败");
     }
 
     /**

+ 4 - 9
blade-service/blade-business/src/main/java/org/springblade/business/controller/ImageClassificationFileController.java

@@ -557,14 +557,6 @@ public class ImageClassificationFileController extends BladeController {
                 List<ImageClassificationFileVO> value = stringObjectEntry.getValue();
                 Map<String, Object> stringObjectMap = new HashMap<>();
                 stringObjectMap.put("name", date);
-
-                for (ImageClassificationFileVO vo : value) {
-                    if (StringUtils.isNotEmpty(vo.getImageUrl()) && isVideoUrl(vo.getImageUrl()) && StringUtils.isEmpty(vo.getVideoCoverUrl())) {
-                        //设置默认视频封面logo
-                        vo.setVideoCoverUrl("https://bladex-chongqing-info.oss-cn-hangzhou.aliyuncs.com//upload/20230904/b86888a3fcd280d56053639dbfddb35d.jpg");
-                    }
-                }
-
                 stringObjectMap.put("child", value);
                 list.add(stringObjectMap);
             }
@@ -635,13 +627,16 @@ public class ImageClassificationFileController extends BladeController {
             ImageClassificationFile newFile = this.copyBeanData(fileVO, true);
             this.setUserData(null, newFile, false);
             String[] urls = fileVO.getImageUrl().split(",");
-            Long total = 0L;
+            long total = 0L;
             for (String url : urls) {
                 long urlSize = getResourceLength(url);
                 total += urlSize;
             }
             String size = formatSize(total);
             newFile.setFileSize(size);
+            newFile.setClassifyId(fileVO.getClassifyId());
+            newFile.setContractId(fileVO.getContractId());
+            newFile.setProjectId(fileVO.getProjectId());
             //落库数据
             return R.status(this.imageClassificationFileService.save(newFile));
         } catch (Exception e) {

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

@@ -99,7 +99,7 @@ public class ContractLogServiceImpl extends BaseServiceImpl<ContractLogMapper, C
         List<ContractLogVO> deduplicatedList = new ArrayList<>(voResult.stream()
                 .filter(vo -> vo.getPdfUrl() != null && !vo.getPdfUrl().isEmpty())
                 .collect(Collectors.toMap(
-                        ContractLogVO::getPdfUrl, //根据pdfUrl字段作为去重,现在修改了需求后,所有的合并的表url都一样
+                        vo -> vo.getPdfUrl() + vo.getCreateUserName(), //根据pdf、创建人去重
                         vo -> vo,
                         (existing, replacement) -> existing
                 ))

+ 7 - 2
blade-service/blade-business/src/main/java/org/springblade/business/service/impl/ImageClassificationFileServiceImpl.java

@@ -83,7 +83,7 @@ public class ImageClassificationFileServiceImpl extends BaseServiceImpl<ImageCla
         long current = (page.getCurrent() - 1L) * page.getSize();
         if (StringUtils.isNotEmpty(imageClassificationFile.getWbsIdsStr())) {
             //查询下级节点信息
-//			imageClassificationFile.setWbsIds(JSONArray.parseArray(JSONObject.toJSONString(imageClassificationFile.getWbsIdsStr().split(",")), String.class));
+            //imageClassificationFile.setWbsIds(JSONArray.parseArray(JSONObject.toJSONString(imageClassificationFile.getWbsIdsStr().split(",")), String.class));
             WbsTreeContract node = wbsTreeContractClient.getContractWbsTreeByPrimaryKeyId(Long.valueOf(imageClassificationFile.getWbsIdsStr()));
             List<WbsTreeContract> wbsTreeContracts = new ArrayList<>();
             if (node.getParentId() == 0) {
@@ -94,9 +94,14 @@ public class ImageClassificationFileServiceImpl extends BaseServiceImpl<ImageCla
             wbsTreeContracts.add(node);
             imageClassificationFile.setWbsIds(wbsTreeContracts.stream().map(wtc -> wtc.getPKeyId() + "").collect(Collectors.toList()));
         }
+
         //获取数据
         List<ImageClassificationFile> fileVOS = this.baseMapper.selectImageClassificationFilePage(current, page.getSize(), imageClassificationFile);
-        if (fileVOS != null && fileVOS.size() > 0) {
+        //获取总数据条数和总页数
+        int totalRecords = fileVOS.size();
+        int totalPages = (int) Math.ceil((double) totalRecords / page.getSize());
+        //判断请求页数必须小于等于总页数
+        if (page.getCurrent() <= totalPages && fileVOS.size() > 0) {
             //分组
             List<List<ImageClassificationFile>> group = CommonUtil.getBatchSize(fileVOS, new Integer(String.valueOf(page.getSize())));
 

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

@@ -491,7 +491,7 @@ public class FormulaUtils {
         return data.stream().peek(e->{if(StringUtils.isDouble(e.getValue())){e.setValue(StringUtils.number2StringZero(e.getValue(),finalScale));}}).collect(Collectors.toList());
     }
 
-    public static void main(String[] args) {
+    public static void main1(String[] args) {
         Map<String,String> map=getElementCell("/www/wwwroot//Users/hongchuangyanfa/Desktop/privateUrl/1584783238218383360.html","key_16");
         System.out.println(map);
     }

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

@@ -533,7 +533,7 @@ public class ContractInfoController extends BladeController {
             @ApiImplicitParam(name = "项目id", value = "projectId", required = true),
             @ApiImplicitParam(name = "合同段id", value = "contractId", required = true)
     })
-    public R tree(String wbsId, String projectId, String contractId) {
+    public R<Object> tree(String wbsId, String projectId, String contractId) {
         List<WbsTreeContractVO> tree = contractInfoService.tree(wbsId, projectId, contractId);
         if (tree != null && tree.size() > 0) {
             return R.data(tree);

+ 138 - 78
blade-service/blade-manager/src/main/java/org/springblade/manager/controller/ExcelTabController.java

@@ -61,7 +61,9 @@ import org.springblade.resource.feign.IOSSClient;
 import org.springblade.resource.feign.NewIOSSClient;
 import org.springblade.resource.vo.NewBladeFile;
 import org.springblade.system.cache.ParamCache;
+import org.springframework.jdbc.core.BeanPropertyRowMapper;
 import org.springframework.jdbc.core.JdbcTemplate;
+import org.springframework.transaction.annotation.Transactional;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.multipart.MultipartFile;
 
@@ -299,14 +301,10 @@ public class ExcelTabController extends BladeController {
         String filecode = SnowFlakeUtil.getId() + "";
         String thmlUrl = file_path + filecode + ".html";
         String exceUrl = file_path + filecode + "123.xlsx";
-        //ExcelInfoUtils.excelInfo(file.getInputStream(),exceUrl,thmlUrl,"1");
+        ExcelInfoUtils.excelInfo(file.getInputStream(),exceUrl,thmlUrl,"1");
         // 上传excel文件
-        // BladeFile bladeFile = newIOSSClient.uploadFile(file.getOriginalFilename(),exceUrl);
+         BladeFile bladeFile = newIOSSClient.uploadFile(file.getOriginalFilename(),exceUrl);
         // 解析原始excel
-        Workbook wb = new Workbook();
-        wb.loadFromMHtml(file.getInputStream());
-        Worksheet sheet = wb.getWorksheets().get(0);
-        sheet.saveToHtml(thmlUrl);
 
         BladeFile bladeFileR = newIOSSClient.uploadFileByInputStream(file);
         detail.setExtension(file.getOriginalFilename());
@@ -632,6 +630,7 @@ public class ExcelTabController extends BladeController {
 
         String fileUrl = wbsTreeContract.getHtmlUrl();
         InputStream fileInputStream = FileUtils.getInputStreamByUrl(fileUrl);
+
         String htmlString = IoUtil.readToString(fileInputStream);
         htmlString = htmlString.replaceAll("placeholder", "placeholderxx");
         htmlString = htmlString.replaceAll("title", "titlexx");
@@ -1964,13 +1963,17 @@ public class ExcelTabController extends BladeController {
             @ApiImplicitParam(name = "pkeyId", value = "主键id", required = true),
             @ApiImplicitParam(name = "status", value = "状态(1显示 2隐藏)", required = true)
     })
-    public R showBussTab(Long pkeyId, int status) throws FileNotFoundException {
+    @Transactional
+    public R showBussTab(Long pkeyId, int status,String nodeId,String classify) throws Exception {
         WbsTreeContract wbsTreeContract = wbsTreeContractService.getBaseMapper().selectOne(Wrappers.<WbsTreeContract>query().lambda()
                 .eq(WbsTreeContract::getPKeyId, pkeyId));
         UpdateWrapper<WbsTreeContract> updateWrapper = new UpdateWrapper<>();
         updateWrapper.in("p_key_id", pkeyId);
         updateWrapper.set("is_buss_show", status);
         wbsTreeContractService.update(updateWrapper);
+        excelTabService.getBussPdfInfo(pkeyId);
+        //重新生成PDF修改queryInfo
+        excelTabService.getBussPdfs(nodeId, classify, wbsTreeContract.getContractId(), wbsTreeContract.getProjectId());
         return R.data("成功");
     }
 
@@ -1983,7 +1986,25 @@ public class ExcelTabController extends BladeController {
             @ApiImplicitParam(name = "contractId", value = "合同段Id", required = true)
     })
     public R getPdfS(String nodeId, String classify, String contractId) throws FileNotFoundException {
-        String sql = "select pdf_url,e_visa_pdf_url,pdf_trial_url,pdf_trial_url_position from u_information_query where classify='" + classify + "' and wbs_id='" + nodeId + "' and contract_id='" + contractId + "'";
+        //获取节点下的所有表单,和附件,如果表单全是隐藏的,并且没有附件,则提示暂无数据
+//        WbsTreeContract node = wbsTreeContractService.getOne(new LambdaQueryWrapper<WbsTreeContract>().eq(WbsTreeContract::getPKeyId,nodeId));
+//        List<WbsTreeContract> list = wbsTreeContractService.list(new LambdaQueryWrapper<WbsTreeContract>().eq(WbsTreeContract::getParentId, node.getId()).eq(WbsTreeContract::getContractId, contractId));
+//        tableInfoService.list(new LambdaQueryWrapper<ta>())
+//        if (list != null && list.size() > 0){
+//            Boolean isShow = true;
+//            for (WbsTreeContract contract : list) {
+//                if (contract.getIsBussShow() == 1){
+//                    isShow = false;
+//                    break;
+//                }
+//            }
+//            if (isShow){
+//                return R.fail("无历史数据预览,请保存数据");
+//            }
+//        }else {
+//            return R.fail("无历史数据预览,请保存数据");
+//        }
+        String sql = "select pdf_url,e_visa_pdf_url,pdf_trial_url,pdf_trial_url_position,status from u_information_query where classify='" + classify + "' and wbs_id='" + nodeId + "' and contract_id='" + contractId + "'";
         List<Map<String, Object>> maps = jdbcTemplate.queryForList(sql);
         if (maps.size() >= 1) {
             Map<String, Object> stringObjectMap = maps.get(0);
@@ -1999,7 +2020,7 @@ public class ExcelTabController extends BladeController {
             }
 
             if (StringUtils.isEmpty(pdfUrl) || pdfUrl.equals("null")) {
-                return R.fail("获取PDF失败");
+                return R.fail("暂无PDF数据");
             } else {
                 return R.data(pdfUrl);
             }
@@ -2100,8 +2121,10 @@ public class ExcelTabController extends BladeController {
                         R bussDataInfo = this.excelTabService.getBussDataInfo(pk, 1);
                         @SuppressWarnings("unchecked")
                         Map<String, Object> jo = (Map<String, Object>) bussDataInfo.getData();
-                        jo.put("pkeyId", pk);
-                        extra.add(jo);
+                        if(jo!=null && ObjectUtils.isNotEmpty(jo)){
+                            jo.put("pkeyId", pk);
+                            extra.add(jo);
+                        }
                     }
                 }
                 List<TableInfo> tableInfoExtra = this.excelTabService.getTableInfoList(extra);
@@ -2432,7 +2455,8 @@ public class ExcelTabController extends BladeController {
     @ApiImplicitParams({
             @ApiImplicitParam(name = "theLogId", value = "日志记录的ids,可能为空(多张表)"),
             @ApiImplicitParam(name = "nodePrimaryKeyId", value = "当前操作的日志类型ID,即左侧列表的节点primaryKeyId"),
-            @ApiImplicitParam(name = "recordTime", value = "当前选择的填写日期,即右侧日期控件所选日期,格式为 yyyy-MM-dd")
+            @ApiImplicitParam(name = "recordTime", value = "当前选择的填写日期,即右侧日期控件所选日期,格式为 yyyy-MM-dd"),
+            @ApiImplicitParam(name = "contractId", value = "合同段id")
     })
     public R<List<Map<String, Object>>> getTheLogBusinessData(String theLogId, String nodePrimaryKeyId, String recordTime, String contractId) {
         List<Map<String, Object>> resultMapList = new ArrayList<>();
@@ -2615,9 +2639,9 @@ public class ExcelTabController extends BladeController {
                         QueryWrapper<TextdictInfo> queryWrapper = new QueryWrapper<>();
                         queryWrapper.eq("type", 4);
                         queryWrapper.eq("tab_id", node.getPKeyId());
-                        final List<TextdictInfo> textdictInfos = textdictInfoService.getBaseMapper().selectList(queryWrapper);
-                        if (!textdictInfos.isEmpty()) {
-                            for (TextdictInfo textdictInfo : textdictInfos) {
+                        final List<TextdictInfo> textDictInfos = textdictInfoService.getBaseMapper().selectList(queryWrapper);
+                        if (!textDictInfos.isEmpty()) {
+                            for (TextdictInfo textdictInfo : textDictInfos) {
                                 if (reData.containsKey(textdictInfo.getColKey())) {
                                     String keyVal = reData.get(textdictInfo.getColKey()) + "";
                                 } else {
@@ -2625,33 +2649,34 @@ public class ExcelTabController extends BladeController {
                                 }
                             }
                         }
-
-                        // 移除Id 和 p_key_id
+                        //移除id和p_key_id
                         reData.remove("p_key_id");
                         reData.remove("classify");
                         reData.remove("contractId");
                         reData.remove("pkeyId");
                         reData.remove("projectId");
-                        resultMapList.add(reData);
+                        if (reData.size() > 0) {
+                            resultMapList.add(reData);
+                        }
                     }
                 } else {
-                    resultMapList.add(reData);
                     Map<String, Object> reData2 = new HashMap<>();
-                    // 获取默认值
+                    //获取默认值
                     QueryWrapper<TextdictInfo> queryWrapper = new QueryWrapper<>();
                     queryWrapper.eq("type", 4);
                     queryWrapper.eq("tab_id", tableNode2.getPKeyId());
-                    final List<TextdictInfo> textdictInfos = textdictInfoService.getBaseMapper().selectList(queryWrapper);
-                    if (!textdictInfos.isEmpty()) {
-                        for (TextdictInfo textdictInfo : textdictInfos) {
+                    final List<TextdictInfo> textDictInfos = textdictInfoService.getBaseMapper().selectList(queryWrapper);
+                    if (!textDictInfos.isEmpty()) {
+                        for (TextdictInfo textdictInfo : textDictInfos) {
                             reData2.put(textdictInfo.getColKey() + "", textdictInfo.getSigRoleName());
                         }
-                        resultMapList.add(reData2);
+                        if (reData2.size() > 0) {
+                            resultMapList.add(reData2);
+                        }
                     }
                 }
             }
         }
-
         return R.data(resultMapList);
     }
 
@@ -2669,51 +2694,41 @@ public class ExcelTabController extends BladeController {
     })
     public R<List<Map<String, Object>>> copyTheLogBusinessData(@RequestParam String theLogId, @RequestParam String nodePrimaryKeyId, @RequestParam String currentTime, @RequestParam String contractId) {
         if (StringUtils.isNotEmpty(theLogId) && StringUtils.isNotEmpty(currentTime)) {
-
-            //检查当前日期下是否存在数据
-            JSONObject currentJson = this.contractLogClient.queryContractLogByPrimaryKeyIdAndRecordTime(nodePrimaryKeyId, currentTime, contractId);
-            String businessId = SnowFlakeUtil.getId().toString();
-            boolean isNew = true;
-            if (currentJson != null) {
-                //使用原本的数据ID
-                businessId = currentJson.getString("dataId");
-                isNew = false;
-            }
-
-            //新增的SQL集合
+            //复制出来的新日志记录logIds
+            List<String> logIds = new ArrayList<>();
+            //复制出来的新增表的实体表SQL集合
             List<String> insertSqlList = new ArrayList<>();
-            //关联集合
+            //复制出来的新增表关联工序节点集合
             List<JSONObject> logWbsList = new ArrayList<>();
             //记录第一组
             List<JSONObject> oneGroupLogWbsList = new ArrayList<>();
 
-            List<JSONObject> targetJsonList = this.contractLogClient.queryContractLogByIds(Func.toStrList(theLogId));
-            if (targetJsonList == null || targetJsonList.size() <= 0) {
-                return R.fail("目标日期下未找到当前用户填报的数据,请重新选择");
+            //获取所有选择的日志表的数据信息
+            List<ContractLog> contractLogList = jdbcTemplate.query("select * from u_contract_log where id in(" + theLogId + ")", new BeanPropertyRowMapper<>(ContractLog.class));
+            if (contractLogList.size() <= 0) {
+                return R.fail("未获取到选择日志填报信息");
             }
-
-            for (JSONObject targetJson : targetJsonList) {
-
-                //获取目标数据所在数据表
-                WbsTreePrivate table = this.wbsTreePrivateService.getOne(Wrappers.<WbsTreePrivate>lambdaQuery().eq(WbsTreePrivate::getPKeyId, targetJson.getString("tableId")));
-
+            Long tabId = contractLogList.stream().map(ContractLog::getTableId).collect(Collectors.toSet()).stream().findAny().orElse(null);
+            //获取目标数据所在数据表
+            WbsTreePrivate tableTemp = this.wbsTreePrivateService.getOne(Wrappers.<WbsTreePrivate>lambdaQuery().eq(WbsTreePrivate::getPKeyId, tabId));
+            boolean var = true;
+            for (ContractLog objLog : contractLogList) {
+                long dataId = 0;
                 //获取目标数据
-                String queryTargetDataSql = "SELECT * FROM " + table.getInitTableName() + " WHERE group_id = " + targetJson.getString("dataId");
-                List<Map<String, Object>> targetDatas = this.jdbcTemplate.queryForList(queryTargetDataSql);
+                String queryTargetDataSql = "SELECT * FROM " + tableTemp.getInitTableName() + " WHERE id = " + objLog.getDataId();
+                List<Map<String, Object>> targetData = this.jdbcTemplate.queryForList(queryTargetDataSql);
 
                 //只需要替换group_id和id即可
-                for (Map<String, Object> dataMap : targetDatas) {
-                    StringBuilder insertSql = new StringBuilder("INSERT INTO " + table.getInitTableName()), keySql = new StringBuilder(), valueSql = new StringBuilder();
+                for (Map<String, Object> dataMap : targetData) {
+                    StringBuilder insertSql = new StringBuilder("INSERT INTO " + tableTemp.getInitTableName()), keySql = new StringBuilder(), valueSql = new StringBuilder();
                     for (Map.Entry<String, Object> mapEntry : dataMap.entrySet()) {
                         String key = mapEntry.getKey();
                         Object value = mapEntry.getValue();
 
+                        //重构id相关
                         if ("id".equals(key)) {
-                            //查询是否有关联记录
                             //查询是否存在关联工序的数据
                             List<JSONObject> wbsJsonList = this.contractLogClient.queryContractLogWbsByBusinessId(value.toString());
-                            //重置业务ID
-                            value = SnowFlakeUtil.getId();
                             if (wbsJsonList != null && wbsJsonList.size() > 0) {
                                 if (oneGroupLogWbsList.size() == 0) {
                                     oneGroupLogWbsList.addAll(wbsJsonList);
@@ -2721,14 +2736,25 @@ public class ExcelTabController extends BladeController {
                             } else {
                                 wbsJsonList = new ArrayList<>(oneGroupLogWbsList);
                             }
+
+                            //重构实体表的id对应log的dataId
+                            value = SnowFlakeUtil.getId();
+
+                            //赋值给log的dataId,也就是businessId要与实体表数据id对应
+                            dataId = Long.parseLong(String.valueOf(value));
+
+                            //后续关联工序节点businessId赋值,businessId=实体表数据的id
                             for (JSONObject json : wbsJsonList) {
-                                json.put("businessId", value);
+                                json.put("businessId", dataId);
                             }
-
                             logWbsList.addAll(wbsJsonList);
-                        } else if ("group_id".equals(key)) {
-                            value = businessId;
                         }
+
+                        //重构实体表数据的pKeyId分组
+                        if ("group_id".equals(key)) {
+                            value = tableTemp.getPKeyId();
+                        }
+
                         //设置参数
                         keySql.append(",").append(key);
                         if (value != null && StringUtils.isNotEmpty(String.valueOf(value))) {
@@ -2737,36 +2763,45 @@ public class ExcelTabController extends BladeController {
                             valueSql.append(",").append(value);
                         }
                     }
-                    //组装SQL
+                    //组装实体表数据SQL
                     insertSql.append(" (").append(keySql.substring(1)).append(") ");
                     insertSql.append(" VALUES(").append(valueSql.substring(1)).append(")");
-
                     insertSqlList.add(insertSql.toString());
                 }
+
+                if (dataId != 0) {
+                    //处理log当前表的记录数据
+                    String id = this.contractLogClient.saveContractLog(new SaveContractLogVO(
+                            dataId,
+                            String.valueOf(objLog.getProjectId()),
+                            String.valueOf(objLog.getContractId()),
+                            objLog.getWbsNodeId(),
+                            objLog.getTableId(),
+                            objLog.getWbsNodeType(),
+                            currentTime,
+                            logWbsList
+                    ));
+                    //log记录id
+                    if (StringUtils.isNotEmpty(id)) {
+                        logIds.add(id);
+                    }
+                } else {
+                    var = false;
+                }
             }
 
-            if (insertSqlList.size() > 0) {
-                //新增数据
+            if (insertSqlList.size() > 0 && var) {
+                //新增实体表数据
                 for (String insertSql : insertSqlList) {
                     this.jdbcTemplate.execute(insertSql);
                 }
+            } else {
+                throw new ServiceException("数据构造失败");
             }
-            //处理数据
-            this.contractLogClient.saveContractLog(new SaveContractLogVO(
-                    Long.parseLong(businessId),
-                    targetJsonList.get(0).getString("projectId"),
-                    targetJsonList.get(0).getString("contractId"),
-                    Long.parseLong(targetJsonList.get(0).getString("wbsNodeId")),
-                    Long.parseLong(targetJsonList.get(0).getString("tableId")),
-                    Integer.parseInt(targetJsonList.get(0).getString("wbsNodeType")),
-                    currentTime,
-                    logWbsList
-            ));
-
-            //返回当前的新数据
-            return this.getTheLogBusinessData(!isNew ? currentJson.getString("id") : null, nodePrimaryKeyId, currentTime, contractId);
-        }
 
+            //返回当前复制的表数据
+            return this.getTheLogBusinessData(StringUtils.join(logIds, ","), nodePrimaryKeyId, currentTime, contractId);
+        }
         return null;
     }
 
@@ -3652,7 +3687,7 @@ public class ExcelTabController extends BladeController {
      * 编辑元素,提示未匹配元素
      */
     @GetMapping("/getUnMatchField")
-    @ApiOperationSupport(order = 20)
+    @ApiOperationSupport(order = 40)
     @ApiOperation(value = "编辑元素,提示未匹配元素", notes = "返回未匹配元素数组")
     @ApiImplicitParams(value = {
             @ApiImplicitParam(name = "pkeyId", value = "WBS私有库的pkeyId", required = true),
@@ -3662,4 +3697,29 @@ public class ExcelTabController extends BladeController {
         return R.data(excelTabService.getUnMatchField(pkeyId, tabId));
     }
 
+    @PostMapping("/removeLogTab")
+    @ApiOperationSupport(order = 41)
+    @ApiOperation(value = "删除施工日志对应的表数据记录信息等", notes = "传入get-the-log-business-data接口返回的内部id")
+    public R<Object> removeLogTab(@RequestParam String id) {
+        if (StringUtils.isNotEmpty(id)) {
+            ContractLog obj = jdbcTemplate.queryForObject("select * from u_contract_log where data_id = " + id, new BeanPropertyRowMapper<>(ContractLog.class));
+            if (obj != null) {
+                //删除施工日志记录信息
+                jdbcTemplate.execute("delete from u_contract_log where data_id = " + id);
+                //删除关联的工序wbs信息
+                jdbcTemplate.execute("delete from u_contract_log_wbs where business_id = " + id + " and contract_log_id = " + obj.getId());
+
+                //获取对应表信息
+                WbsTreePrivate tableTemp = wbsTreePrivateService.getOne(Wrappers.<WbsTreePrivate>lambdaQuery().eq(WbsTreePrivate::getPKeyId, obj.getTableId()));
+                if (tableTemp != null && StringUtils.isNotEmpty(tableTemp.getInitTableName())) {
+                    //删除实体表对应的数据信息
+                    jdbcTemplate.execute("delete from " + tableTemp.getInitTableName() + " where id = " + id);
+                }
+                return R.success("操作成功");
+            }
+        }
+        return R.fail("操作失败");
+    }
+
+
 }

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

@@ -49,17 +49,15 @@ import org.springblade.manager.entity.*;
 import org.springblade.manager.mapper.WbsTreePrivateMapper;
 import org.springblade.manager.service.impl.WbsTreeContractServiceImpl;
 import org.springblade.manager.service.impl.WbsTreePrivateServiceImpl;
+import org.springblade.manager.utils.ExcelInfoUtils;
 import org.springblade.manager.utils.FileUtils;
-import org.springblade.manager.vo.TextdictBy345VO;
-import org.springblade.manager.vo.TextdictDataInfoVO;
-import org.springblade.manager.vo.TextdictInfo_vo;
+import org.springblade.manager.vo.*;
 import org.springblade.system.cache.ParamCache;
 import org.springframework.jdbc.core.BeanPropertyRowMapper;
 import org.springframework.jdbc.core.JdbcTemplate;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.bind.annotation.RequestParam;
 import com.baomidou.mybatisplus.core.metadata.IPage;
-import org.springblade.manager.vo.TextdictInfoVO;
 import org.springblade.manager.service.ITextdictInfoService;
 import org.springblade.core.boot.ctrl.BladeController;
 
@@ -418,11 +416,9 @@ public class TextdictInfoController extends BladeController {
 
                 } else if (textdictInfo.getTextId().equals("textarea")) { // 文本域
                     int rowspan = element.attr("ROWSPAN").equals("") ? 0 : Integer.parseInt(element.attr("ROWSPAN"));
-
                     element.empty().append("<el-input  :rows=" + rowspan * 2 + "  id=" + keyname + "  @mouseup.left=" + leftCli + "  @keydown.shift.up='keyupShiftUp' @keydown.shift.down='keyupShiftDown' @keydown.shift.left='keyupShiftLeft' @keydown.shift.right='keyupShiftRight'  type='textarea' placeholder=" + placeholder + " v-model=" + vmode + "    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%'  > </el-input>");
-
                 } else if (textdictInfo.getTextId().equals("select")) { // 下拉框
-                    String selectText = " <el-select id=" + keyname + " v-model=" + vmode + " @keydown.shift.up='keyupShiftUp' @keydown.shift.down='keyupShiftDown' @keydown.shift.left='keyupShiftLeft' @keydown.shift.right='keyupShiftRight' keyname=" + keyname + " weighing=" + weighing + " placeholder=" + placeholder + " trIndex=" + trindex + " tdIndex=" + tdindex + "  x1=" + x1 + " x2=" + x2 + " y1=" + y1 + " y2=" + y2 + ">"; //v-model="+keyname+"
+                    String selectText = " <el-select id=" + keyname + " v-model=" + vmode + " @keydown.shift.up='keyupShiftUp' @keydown.shift.down='keyupShiftDown' @keydown.shift.left='keyupShiftLeft' @keydown.shift.right='keyupShiftRight'  @mouseup.right='RightClick(" + parm +")'  keyname=" + keyname + " weighing=" + weighing + " placeholder=" + placeholder + " trIndex=" + trindex + " tdIndex=" + tdindex + "  x1=" + x1 + " x2=" + x2 + " y1=" + y1 + " y2=" + y2 + ">"; //v-model="+keyname+"
                     List<TextdictInfo_vo> optionList = textdictInfo.getTextInfo();
                     if (optionList != null && optionList.size() >= 1) {
                         for (int i = 0; i < optionList.size(); i++)
@@ -433,7 +429,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 + "  @mouseup.right='RightClick(" + parm + ")' 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++)
@@ -451,40 +447,44 @@ 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  @mouseup.right='RightClick(" + parm + ")'   @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>");
-                }
-
-        /*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>");
-        } 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>");
-        } 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>");
-        } 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>");
-        } 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>");
-        }*/
-
-                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.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 + ">");
+                    List<DateFormat> dateFormat = textdictInfo.getDateFormat();
+                    String dataf = "YYYY年MM月DD日";
+                    String dateType = "date";
+                    if(dateFormat!=null && dateFormat.size()>=1){
+                        Map<String, String> dateForm = ExcelInfoUtils.getDateFormat(dateFormat);
+                        dataf = dateForm.get("format");
+                        dateType = dateForm.get("type");
+                    }
+                    if(dateType.equals("datetime")){
+                        element.empty().append("<el-date-picker @keyDowns='dateKeydown()' v-model=" + vmode + " type='"+dateType+"' format='"+dataf+"' value-format='"+dataf+"' 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(dateType.equals("date")){
+                        element.empty().append("<el-date-picker @keyDowns='dateKeydown()' v-model=" + vmode + " type='"+dateType+"' format='"+dataf+"' value-format='"+dataf+"' 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 (dateType.equals("time")) {
+                        element.empty().append("<el-time-picker @keyDowns='dateKeydown()' v-model=" + vmode + "  format='"+dataf+"' value-format='"+dataf+"' 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")) { // 时间段
+                    List<DateFormat> dateFormat = textdictInfo.getDateFormat();
+                    String dataf = "YYYY年MM月DD日";
+                    String sp3 = "至";
+                    if(dateFormat!=null && dateFormat.size()>=1){
+                        Map<String, String> dateForm = ExcelInfoUtils.getDateFormat(dateFormat);
+                        dataf = dateForm.get("format");
+                        sp3 = dateForm.get("sp3");
+                    }
+                    element.empty().append("<el-date-picker @keyDowns='dateKeydown()' range-separator='"+sp3+"' v-model=" + vmode + " type='datetimerange' placeholder=" + placeholder + "  start-placeholder='开始日期'  end-placeholder='结束日期' format='"+dataf+"' trIndex=" + trindex + "  @mouseup.right='RightClick(" + parm + ")' 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")) { //图片
-                    element.empty().append("<hc-table-form-upload @keydown.shift.up='keyupShiftUp' @keydown.shift.down='keyupShiftDown' @keydown.shift.left='keyupShiftLeft' @keydown.shift.right='keyupShiftRight'  :src='" + vmode + "' placeholder=" + placeholder + " v-model=" + vmode + "  keyName=" + keyname + " weighing=" + weighing + "  @success='formUploadSuccess' @del='delTableFormFile' trIndex=" + trindex + " tdIndex=" + tdindex + "  x1=" + x1 + " x2=" + x2 + " y1=" + y1 + " y2=" + y2 + "></hc-table-form-upload> ");
+                    element.empty().append("<hc-table-form-upload @keydown.shift.up='keyupShiftUp' @keydown.shift.down='keyupShiftDown' @keydown.shift.left='keyupShiftLeft' @keydown.shift.right='keyupShiftRight'  :src='" + vmode + "' placeholder=" + placeholder + "  @mouseup.right='RightClick(" + parm + ")' v-model=" + vmode + "  keyName=" + keyname + " weighing=" + weighing + "  @success='formUploadSuccess' @del='delTableFormFile' trIndex=" + trindex + " tdIndex=" + tdindex + "  x1=" + x1 + " x2=" + x2 + " y1=" + y1 + " y2=" + y2 + "></hc-table-form-upload> ");
                     element.removeAttr("style");
                 } else if (textdictInfo.getTextId().equals("searchSelect")) { //搜索框
-                    element.empty().append("<hc-form-select-search id=" + keyname + " @keydown.shift.up='keyupShiftUp' @keydown.shift.down='keyupShiftDown' @keydown.shift.left='keyupShiftLeft' @keydown.shift.right='keyupShiftRight' type='dap_site_data' :val=" + vmode + " contractId=''  pkeyId='' @change='formRemoteChange' v-model=" + vmode + " 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%' > </hc-form-select-search>");
+                    element.empty().append("<hc-form-select-search id=" + keyname + " @keydown.shift.up='keyupShiftUp' @keydown.shift.down='keyupShiftDown' @keydown.shift.left='keyupShiftLeft' @keydown.shift.right='keyupShiftRight'  @mouseup.right='RightClick(" + parm + ")' type='dap_site_data' :val=" + vmode + " contractId=''  pkeyId='' @change='formRemoteChange' v-model=" + vmode + " 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%' > </hc-form-select-search>");
                 } else if (textdictInfo.getTextId().equals("strengthSearch")) { //强度搜索框
-                    element.empty().append("<hc-form-select-search2 id=" + keyname + " @keydown.shift.up='keyupShiftUp' @keydown.shift.down='keyupShiftDown' @keydown.shift.left='keyupShiftLeft' @keydown.shift.right='keyupShiftRight' type='strength_search' :val=" + vmode + " contractId=''  pkeyId='' @change='formRemoteChange' v-model=" + vmode + " 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%' > </hc-form-select-search2>");
+                    element.empty().append("<hc-form-select-search2 id=" + keyname + " @keydown.shift.up='keyupShiftUp' @keydown.shift.down='keyupShiftDown' @keydown.shift.left='keyupShiftLeft' @keydown.shift.right='keyupShiftRight  @mouseup.right='RightClick(" + parm + ")'' type='strength_search' :val=" + vmode + " contractId=''  pkeyId='' @change='formRemoteChange' v-model=" + vmode + " 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%' > </hc-form-select-search2>");
                 }
                 element.attr("@click", "getInformation(" + oncklickText + ")");
 
@@ -536,8 +536,8 @@ public class TextdictInfoController extends BladeController {
         //获取当前项目下引用相同模板的元素表信息
         List<WbsTreePrivate> wbsTreePrivatesEqual = wbsTreePrivateMapper.selectList(Wrappers.<WbsTreePrivate>lambdaQuery()
                 .eq(WbsTreePrivate::getProjectId, wbsTreePrivate.getProjectId())
-                .eq(WbsTreePrivate::getExcelId, wbsTreePrivate.getExcelId())
-                .eq(WbsTreePrivate::getStatus, 1));
+                .eq(WbsTreePrivate::getExcelId, wbsTreePrivate.getExcelId()));
+//                .eq(WbsTreePrivate::getStatus, 1));
         List<Long> pKeyIds = wbsTreePrivatesEqual.stream().map(WbsTreePrivate::getPKeyId).collect(Collectors.toList());
         String ids = StringUtils.join(pKeyIds, ",");
         if (StringUtils.isNotEmpty(ids)) {
@@ -632,7 +632,7 @@ public class TextdictInfoController extends BladeController {
         List<Long> cPkeyIds = wbsTreeContractService.getBaseMapper().selectList(Wrappers.<WbsTreeContract>lambdaQuery()
                 .eq(WbsTreeContract::getProjectId, wbsTreePrivate.getProjectId())
                 .eq(WbsTreeContract::getExcelId, wbsTreePrivate.getExcelId())
-                .eq(WbsTreeContract::getStatus, 1)
+//                .eq(WbsTreeContract::getStatus, 1)
                 .in(WbsTreeContract::getId, cIdsList)).stream().map(WbsTreeContract::getPKeyId).collect(Collectors.toList());
         String cPkeyIdsStr = StringUtils.join(cPkeyIds, ",");
         if (StringUtils.isNotEmpty(cPkeyIdsStr)) {

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

@@ -196,7 +196,7 @@ public class WbsParamController {
                                 ul.add(old);
                             }
                         } else {
-                            if (old != null && (StringUtils.isNotEquals(old.getV(),b.getV())||StringUtils.isNotEquals(old.getRemark(),b.getRemark()))) {
+                            if (old != null && (StringUtils.isNotEquals(old.getV(),b.getV())||StringUtils.isNotEquals(old.getRemark(),b.getRemark())|| StringUtils.isNotEquals(old.getName(),b.getName()))) {
                                 /*只有公式内容变化的时候才需要更新*/
                                 old.setIsDeleted(0);
                                 BeanUtils.copyProperties(b, old);

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

@@ -40,7 +40,7 @@ public interface ContractInfoMapper extends BaseMapper<ContractInfo> {
 
     List<WbsTreeContractTreeVO> tree(@Param("wbsId") String wbsId, @Param("projectId") String projectId, @Param("contractId") String contractId, @Param("wbsType") Integer wbsType, @Param("parentId") String parentId);
 
-    List<WbsTreeContractVO> tree2(@Param("wbsId") Long wbsId, @Param("projectId") Long projectId, @Param("contractId") Long contractId, @Param("wbsType") Integer wbsType, @Param("parentId") String parentId, @Param("queryValue") String queryValue);
+    List<WbsTreeContractVO> tree2(@Param("wbsId") Long wbsId, @Param("projectId") Long projectId, @Param("contractId") Long contractId);
 
     List<WbsTreeContractVO> tree3(@Param("wbsId") String wbsId, @Param("projectId") String projectId, @Param("contractId") String contractId, @Param("wbsType") Integer wbsType, @Param("parentId") String parentId);
 

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

@@ -276,7 +276,6 @@
         d.wbs_type AS "wbsType",
         d.id,
         d.parent_id AS "parentId",
-        -- IFNULL(if(length(trim(full_name)) > 0, full_name, node_name),node_name) AS title,
         d.node_name AS title,
         d.node_name AS "nodeName",
         d.full_name AS "fullName",
@@ -293,7 +292,6 @@
         d.is_deleted = 0
         AND d.status = 1
         AND d.type = 1
-        AND wbs_type = 1
         <if test="wbsId!=null and wbsId!=''">
             and wbs_id = #{wbsId}
         </if>
@@ -303,15 +301,6 @@
         <if test="contractId!=null and contractId!=''">
             and contract_id = #{contractId}
         </if>
-        <if test="wbsType != null and wbsType != ''">
-            and wbs_type = #{wbsType}
-        </if>
-        <if test="parentId != null and parentId != ''">
-            and parent_id = #{parentId}
-        </if>
-        <if test="queryValue != null and queryValue != ''">
-            and (node_name like concat('%', #{queryValue}, '%') or full_name like concat('%', #{queryValue}, '%'))
-        </if>
         /*不查询客户端新增或者复制的节点 old_id = null*/
         AND old_id is null
         ORDER BY d.sort

+ 34 - 19
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ContractInfoServiceImpl.java

@@ -200,11 +200,14 @@ public class ContractInfoServiceImpl extends BaseServiceImpl<ContractInfoMapper,
     public List<WbsTreePrivateVO> addNodeTree(String pKeyId) {
         WbsTreeContract parentNodeRoot = wbsTreeContractMapper.selectOne(Wrappers.<WbsTreeContract>lambdaQuery().eq(WbsTreeContract::getPKeyId, pKeyId).eq(WbsTreeContract::getStatus, 1));
         if (ObjectUtil.isNotEmpty(parentNodeRoot)) {
+            //oldId不等于空,说明是复制或新增的节点,通过oldId,获取原始节点
             String oldId = "";
-            //oldId不等于空,说明是复制节点,通过oldId,获取原始节点
             if (ObjectUtil.isNotEmpty(parentNodeRoot.getOldId())) {
-                oldId = parentNodeRoot.getOldId();
-                parentNodeRoot = this.recursionFindResourceRootNode(parentNodeRoot);
+                //在调用递归方法时,创建IdWrapper对象并传递
+                IdWrapper idWrapper = new IdWrapper();
+                this.recursionFindResourceRootNode(idWrapper, parentNodeRoot);
+                //在外部获取更新后的id值
+                oldId = idWrapper.getId();
             }
 
             //获取对应的项目树的节点
@@ -239,25 +242,37 @@ public class ContractInfoServiceImpl extends BaseServiceImpl<ContractInfoMapper,
     }
 
     /**
-     * 获取树结构
-     *
-     * @param obj
-     * @return
+     * 修改递归方法,接受IdWrapper对象
      */
-    private WbsTreeContract recursionFindResourceRootNode(WbsTreeContract obj) {
-        if (obj.getOldId() != null) {
-            WbsTreeContract obj1 = wbsTreeContractMapper.selectOne(Wrappers.<WbsTreeContract>lambdaQuery()
+    private void recursionFindResourceRootNode(IdWrapper idWrapper, WbsTreeContract obj) {
+        if (ObjectUtils.isEmpty(idWrapper.getId())) {
+            List<WbsTreeContract> wbsTreeContractList = wbsTreeContractMapper.selectList(Wrappers.<WbsTreeContract>lambdaQuery()
                     .eq(WbsTreeContract::getId, obj.getOldId())
-                    .eq(WbsTreeContract::getContractId, obj.getContractId()));
-            if (obj1 != null && obj1.getOldId() != null) {
-                obj1 = this.recursionFindResourceRootNode(obj1);
-            } else {
-                // 已经到达原始节点,返回当前节点的id
-                return obj1 != null ? obj1 : obj;
+                    .eq(WbsTreeContract::getWbsId, obj.getWbsId())
+                    .eq(WbsTreeContract::getProjectId, obj.getProjectId()));
+            if (wbsTreeContractList.size() > 0) {
+                WbsTreeContract wbsTreeContract = wbsTreeContractList.get(0);
+                if (ObjectUtils.isNotEmpty(wbsTreeContract.getOldId())) {
+                    this.recursionFindResourceRootNode(idWrapper, wbsTreeContract);
+                } else {
+                    //已经到达原始节点,更新IdWrapper对象的id属性
+                    idWrapper.setId(wbsTreeContract.getId().toString());
+                }
             }
-            obj = obj1;
         }
-        return obj;
+    }
+
+    //定义一个包装类,用于包装id值
+    static class IdWrapper {
+        private String id;
+
+        public String getId() {
+            return id;
+        }
+
+        public void setId(String id) {
+            this.id = id;
+        }
     }
 
     private List<WbsTreePrivate> getChildNodes(WbsTreePrivate obj) {
@@ -703,7 +718,7 @@ public class ContractInfoServiceImpl extends BaseServiceImpl<ContractInfoMapper,
 
     @Override
     public List<WbsTreeContractVO> tree(String wbsId, String projectId, String contractId) {
-        List<WbsTreeContractVO> wbsTreeContractVOS = baseMapper.tree2(Long.parseLong(wbsId), Long.parseLong(projectId), Long.parseLong(contractId), null, null, null);
+        List<WbsTreeContractVO> wbsTreeContractVOS = baseMapper.tree2(Long.parseLong(wbsId), Long.parseLong(projectId), Long.parseLong(contractId));
         return buildWbsTreeByStream(wbsTreeContractVOS);
     }
 

+ 31 - 11
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ExcelTabServiceImpl.java

@@ -1399,9 +1399,16 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
             isWater = 12;
         }
 
-        int all = sheet.getRow(0).getLastCellNum();
-        int mergedCellCnt = sheet.getNumMergedRegions();
-        for (int i = 0; i < mergedCellCnt - 1; i++) {
+        int all = 0;
+        for (int i = 0; i < 10; i++) {
+            CellRangeAddress mergedCell = sheet.getMergedRegion(i);
+            int xx = mergedCell.getNumberOfCells();
+            if(xx>=all){
+                all=xx;
+            }
+        }
+
+        for (int i = 0; i < 10; i++) {
             CellRangeAddress mergedCell = sheet.getMergedRegion(i);
             int xx = mergedCell.getNumberOfCells() + 2;
             if (xx >= all) {
@@ -1501,7 +1508,12 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
                                 Object obj = DataInfo.get(val);
                                 if (obj instanceof String[]) {
                                     String[] dataDate = (String[]) obj;
-                                    myData = dataDate[0] + "-" + dataDate[1].trim();
+                                    if((dataDate[0].trim()).equals((dataDate[1].trim()))){
+                                        myData = dataDate[0];
+                                    }else{
+                                        myData = dataDate[0] + "-" + dataDate[1].trim();
+                                    }
+
                                 }
                             }
 
@@ -1584,8 +1596,10 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
             QueryWrapper<TextdictInfo> queryWrapper = new QueryWrapper<>();
             queryWrapper.in("type", 2, 6);
             queryWrapper.eq("tab_id", wbsTreeContract.getIsTypePrivatePid());
-
             List<TextdictInfo> textdictInfos = textdictInfoService.getBaseMapper().selectList(queryWrapper);
+
+           // table.getElementsByAttribute("dq")
+
             if (textdictInfos != null && !textdictInfos.isEmpty()) {
                 for (TextdictInfo e : textdictInfos) {
                     String key = e.getColKey();
@@ -1611,19 +1625,19 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
                                 Row row = sheet.getRow(y1 - 1);
                                 if (row != null) {
 
-                                    Cell cell = sheet.getRow(y1 - 1).getCell(x1 - 1);
+                                    Cell cell = row.getCell(x1 - 1);
                                     if (cell != null || ObjectUtils.isNotEmpty(cell)) {
                                         short fontIndex = cell.getCellStyle().getFontIndex();
                                         Font oldfontAt = workbook.getFontAt(fontIndex);
-
                                         Font redFont = workbook.createFont();
                                         redFont.setColor(IndexedColors.WHITE.getIndex()); //设置字体颜色
-                                        redFont.setFontHeightInPoints(oldfontAt.getFontHeightInPoints());//设置字体大小
+                                        redFont.setFontHeightInPoints(Short.valueOf("1"));//设置字体大小
                                         redFont.setFontName(oldfontAt.getFontName());//设置字体
 
                                         CellStyle newStyle = workbook.createCellStyle(); //创建单元格样式
                                         newStyle.cloneStyleFrom(cell.getCellStyle());
                                         newStyle.setFont(redFont);
+                                        newStyle.setShrinkToFit(true);
                                         cell.setCellStyle(newStyle);
                                         cell.setCellValue(e.getId() + "");
                                     }
@@ -1668,7 +1682,13 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
         List<TableFile> tableFileList = tableFileService.getBaseMapper().selectList(Wrappers.<TableFile>query().lambda().eq(TableFile::getTabId, pkeyId + "").eq(TableFile::getIsDeleted, 0));
         tableFileList.sort(Comparator.comparing(TableFile::getType));
 
-        List<String> dataListPdf = tableFileList.stream().filter(tableFile -> tableFile.getDomainPdfUrl() != null && (tableFile.getType() == 1 || tableFile.getType() == 2)).map(TableFile::getDomainPdfUrl).collect(Collectors.toList());
+        List<String> dataListPdf = new ArrayList<>();
+        if(wbsTreeContract.getIsBussShow() == 1){
+            dataListPdf = tableFileList.stream().filter(tableFile -> tableFile.getDomainPdfUrl() != null && (tableFile.getType() == 1 || tableFile.getType() == 2)).map(TableFile::getDomainPdfUrl).collect(Collectors.toList());
+        }else{
+            dataListPdf = tableFileList.stream().filter(tableFile -> tableFile.getDomainPdfUrl() != null && tableFile.getType() == 2).map(TableFile::getDomainPdfUrl).collect(Collectors.toList());
+        }
+//        List<String> dataListPdf = tableFileList.stream().filter(tableFile -> tableFile.getDomainPdfUrl() != null && (tableFile.getType() == 1 || tableFile.getType() == 2)).map(TableFile::getDomainPdfUrl).collect(Collectors.toList());
 
         String pdfPath2 = file_path + "/pdf//" + pkeyId + "_2.pdf";
 
@@ -1705,7 +1725,7 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
         if (wbsTreeContractList != null && wbsTreeContractList.size() >= 1) {
             for (WbsTreeContract wbsInfo : wbsTreeContractList) {
                 // 隐藏的不生成pdf
-                if (wbsInfo.getIsBussShow() == null || wbsInfo.getIsBussShow() != 2) { //
+//                if (wbsInfo.getIsBussShow() == null || wbsInfo.getIsBussShow() != 2) { //
                     if (StringUtils.isNotEmpty(wbsInfo.getPdfUrl())) {
                         data.add(wbsInfo.getPdfUrl());
                     } else {
@@ -1714,7 +1734,7 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
                             data.add(bussPdfInfo.getData() + "");
                         }
                     }
-                }
+//                }
             }
         }
 

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

@@ -458,40 +458,49 @@ public class WbsTreeContractServiceImpl extends BaseServiceImpl<WbsTreeContractM
             tableOwnerList = Func.toStrList(tableOwners);
         }
         List<AppWbsTreeContractVO> resultTabs = baseMapper.selectWbsTreeContractList(tableOwnerNumbers, wbsTreeContract.getProjectId(), wbsTreeContract.getWbsId(), wbsTreeContract.getContractId(), wbsTreeContract.getId(), wbsTreeContract.getContractIdRelation(), tableOwnerList);
-        return this.sortTabs(resultTabs);
+
+        //表单排序
+        List<AppWbsTreeContractVO> resultTabsToCopy = sortTabs(resultTabs, "__");
+        return this.sortTabs(resultTabsToCopy, "_PL_");
     }
 
-    private List<AppWbsTreeContractVO> sortTabs(List<AppWbsTreeContractVO> tabs) {
-        List<AppWbsTreeContractVO> tabsWithPL = new ArrayList<>();
-        List<AppWbsTreeContractVO> tabsWithoutPL = new ArrayList<>();
-        //分离带有_PL_关键字和不带关键字的数据
+    /**
+     * 元素表排序
+     *
+     * @param tabs
+     * @param keyword
+     * @return
+     */
+    private List<AppWbsTreeContractVO> sortTabs(List<AppWbsTreeContractVO> tabs, String keyword) {
+        List<AppWbsTreeContractVO> tabsWithKeyword = new ArrayList<>();
+        List<AppWbsTreeContractVO> tabsWithoutKeyword = new ArrayList<>();
+        //分离带有关键字和不带关键字的数据
         for (AppWbsTreeContractVO tab : tabs) {
-            if (tab.getNodeName().contains("_PL_")) {
-                tabsWithPL.add(tab);
+            if (tab.getNodeName().contains(keyword)) {
+                tabsWithKeyword.add(tab);
             } else {
-                tabsWithoutPL.add(tab);
+                tabsWithoutKeyword.add(tab);
             }
         }
-        //如果没有带有_PL_关键字的数据,直接返回原列表
-        if (tabsWithPL.isEmpty()) {
-            return tabsWithoutPL;
+        //如果没有带有关键字的数据,直接返回原列表
+        if (tabsWithKeyword.isEmpty()) {
+            return tabsWithoutKeyword;
         }
-        //将带有_PL_关键字的数据插入到对应表名后面
+        //将带有关键字的数据插入到对应表名后面
         List<AppWbsTreeContractVO> sortedTabs = new ArrayList<>();
-        for (AppWbsTreeContractVO tabWithoutPL : tabsWithoutPL) {
-            sortedTabs.add(tabWithoutPL);
-            String tabName = tabWithoutPL.getNodeName();
-            String tabNameWithPLPrefix = tabName + "_PL_";
-            for (AppWbsTreeContractVO tabWithPL : tabsWithPL) {
-                if (tabWithPL.getNodeName().startsWith(tabNameWithPLPrefix)) {
-                    sortedTabs.add(tabWithPL);
+        for (AppWbsTreeContractVO tabWithoutKeyword : tabsWithoutKeyword) {
+            sortedTabs.add(tabWithoutKeyword);
+            String tabName = tabWithoutKeyword.getNodeName();
+            String tabNameWithKeywordPrefix = tabName + keyword;
+            for (AppWbsTreeContractVO tabWithKeyword : tabsWithKeyword) {
+                if (tabWithKeyword.getNodeName().startsWith(tabNameWithKeywordPrefix)) {
+                    sortedTabs.add(tabWithKeyword);
                 }
             }
         }
         return sortedTabs;
     }
 
-
     @Override
     public List<WbsTreeContract> searchParentAllNode(long primaryKeyId, Long contractId) {
         return baseMapper.searchParentAllNode(primaryKeyId, contractId);
@@ -582,7 +591,13 @@ public class WbsTreeContractServiceImpl extends BaseServiceImpl<WbsTreeContractM
                 wbsTreeContract.setCreateTime(new Date());
                 wbsTreeContract.setTabGroupId(tabGroupId);
                 wbsTreeContract.setSort(wbsInfo.getSort());
-                String nodeName = wbsTreeContractList2.get(wbsTreeContractList2.size() - 1).getNodeName();
+                String nodeName="";
+                if(wbsTreeContractList2.size()>=1){
+                    nodeName = wbsTreeContractList2.get(wbsTreeContractList2.size() - 1).getNodeName();
+                }else{
+                    nodeName = wbsTreeContract.getNodeName();
+                }
+
 
                 if (nodeName.indexOf("_PL_") >= 0) {
                     String[] oldName = nodeName.split("_PL_");
@@ -689,7 +704,7 @@ public class WbsTreeContractServiceImpl extends BaseServiceImpl<WbsTreeContractM
                         } else {
                             queryInfoList = jdbcTemplate.query("select wbs_id,status from u_information_query where type = 1 and contract_id = " + contractId + " and classify = " + tableOwner, new BeanPropertyRowMapper<>(WbsTreeContractLazyQueryInfoVO.class));
                         }
-                        Map<Long, Integer> queryInfoMaps = queryInfoList.stream()
+                        Map<Long, Integer> queryInfoMaps = queryInfoList.stream().filter(f -> ObjectUtil.isNotEmpty(f.getWbsId()))
                                 .collect(Collectors.toMap(WbsTreeContractLazyQueryInfoVO::getWbsId, WbsTreeContractLazyQueryInfoVO::getStatus, (existingValue, newValue) -> existingValue));
                         List<Long> pKeyIdList = new ArrayList<>(queryInfoMaps.keySet());
 
@@ -820,7 +835,7 @@ public class WbsTreeContractServiceImpl extends BaseServiceImpl<WbsTreeContractM
                                 } else {
                                     queryInfoList = jdbcTemplate.query("select wbs_id,status from u_information_query where type = 1 and contract_id = " + sgContractId + " and classify = " + tableOwner, new BeanPropertyRowMapper<>(WbsTreeContractLazyQueryInfoVO.class));
                                 }
-                                Map<Long, Integer> queryInfoMaps = queryInfoList.stream()
+                                Map<Long, Integer> queryInfoMaps = queryInfoList.stream().filter(f -> ObjectUtil.isNotEmpty(f.getWbsId()))
                                         .collect(Collectors.toMap(WbsTreeContractLazyQueryInfoVO::getWbsId, WbsTreeContractLazyQueryInfoVO::getStatus, (existingValue, newValue) -> existingValue));
                                 List<Long> pKeyIdList = new ArrayList<>(queryInfoMaps.keySet());
 
@@ -943,6 +958,7 @@ public class WbsTreeContractServiceImpl extends BaseServiceImpl<WbsTreeContractM
                         List<WbsTreeContractLazyFileVO> queryFileList = jdbcTemplate.query("select wbs_id,id from u_image_classification_file where status = 1 and is_deleted = 0 and contract_id = " + contractId + " and classify_id = " + classId, new BeanPropertyRowMapper<>(WbsTreeContractLazyFileVO.class));
                         //最底层节点与存储文件数量map
                         Map<Long, Integer> queryFileMaps = queryFileList.stream()
+                                .filter(f -> ObjectUtil.isNotEmpty(f.getWbsId()))
                                 .collect(Collectors.groupingBy(
                                         WbsTreeContractLazyFileVO::getWbsId,
                                         Collectors.collectingAndThen(Collectors.toList(), List::size)
@@ -1048,6 +1064,7 @@ public class WbsTreeContractServiceImpl extends BaseServiceImpl<WbsTreeContractM
                                 List<WbsTreeContractLazyFileVO> queryFileList = jdbcTemplate.query("select wbs_id,id from u_image_classification_file where status = 1 and contract_id = " + contractId + " and classify_id = " + classId, new BeanPropertyRowMapper<>(WbsTreeContractLazyFileVO.class));
                                 //最底层节点与存储文件数量map
                                 Map<Long, Integer> queryFileMaps = queryFileList.stream()
+                                        .filter(f -> ObjectUtil.isNotEmpty(f.getWbsId()))
                                         .collect(Collectors.groupingBy(
                                                 WbsTreeContractLazyFileVO::getWbsId,
                                                 Collectors.collectingAndThen(Collectors.toList(), List::size)
@@ -1322,56 +1339,6 @@ public class WbsTreeContractServiceImpl extends BaseServiceImpl<WbsTreeContractM
         }
     }
 
-    public void recursiveGetParentNodes2(List<WbsTreeContractLazyVO> result, List<Long> lowestNodeParentIds, List<WbsTreeContractLazyVO> nodesAll) {
-        if (lowestNodeParentIds.isEmpty()) {
-            return;
-        }
-
-        //父级Id与出现的次数Map
-        Map<Long, Long> parentIdGroup = lowestNodeParentIds.stream()
-                .collect(Collectors.groupingBy(Function.identity(), Collectors.counting()));
-
-        List<String> keysWithValueOne = new ArrayList<>();
-        Map<Long, Long> keysWithValueSome = new HashMap<>();
-
-        for (Map.Entry<Long, Long> entry : parentIdGroup.entrySet()) {
-            if (entry.getValue() == 1L) {
-                keysWithValueOne.add(entry.getKey().toString());
-            } else {
-                keysWithValueSome.put(entry.getKey(), entry.getValue());
-            }
-        }
-
-        //批量查询单次节点
-        List<WbsTreeContractLazyVO> parentNodes = new ArrayList<>();
-        if (keysWithValueOne.size() > 0) {
-            parentNodes = nodesAll.stream().filter(f -> keysWithValueOne.contains(f.getId().toString())).collect(Collectors.toList());
-        }
-
-        //批量查询多次节点
-        List<WbsTreeContractLazyVO> multipleParentNodes = new ArrayList<>();
-        for (Map.Entry<Long, Long> entry : keysWithValueSome.entrySet()) {
-            Long key = entry.getKey();
-            Long count = entry.getValue();
-
-            List<WbsTreeContractLazyVO> nodes = nodesAll.stream().filter(f -> key.equals(f.getId())).collect(Collectors.toList());
-            if (!nodes.isEmpty()) {
-                multipleParentNodes.addAll(Collections.nCopies(count.intValue(), nodes.get(0)));
-            }
-        }
-
-        //结果集
-        List<Long> collect = Stream.concat(parentNodes.stream(), multipleParentNodes.stream())
-                .map(WbsTreeContractLazyVO::getParentId)
-                .collect(Collectors.toList());
-
-        if (!collect.isEmpty()) {
-            result.addAll(parentNodes);
-            result.addAll(multipleParentNodes);
-            this.recursiveGetParentNodes(result, collect, nodesAll);
-        }
-    }
-
     /**
      * 反向递归处理父节点颜色
      */

+ 130 - 23
blade-service/blade-manager/src/main/java/org/springblade/manager/utils/ExcelInfoUtils.java

@@ -4,18 +4,23 @@ import com.spire.xls.CellRange;
 import com.spire.xls.FileFormat;
 import com.spire.xls.Workbook;
 import com.spire.xls.Worksheet;
-import com.spire.xls.core.IXLSRange;
 import com.spire.xls.core.spreadsheet.HTMLOptions;
 import org.apache.commons.lang.StringUtils;
+import org.apache.poi.ss.usermodel.Cell;
+import org.apache.poi.ss.usermodel.Row;
+import org.apache.poi.ss.usermodel.Sheet;
+import org.apache.poi.ss.usermodel.WorkbookFactory;
 import org.jsoup.Jsoup;
 import org.jsoup.nodes.Document;
 import org.jsoup.nodes.Element;
 import org.jsoup.select.Elements;
+
+import org.springblade.common.utils.CommonUtil;
 import org.springblade.common.utils.SnowFlakeUtil;
 import org.springblade.core.tool.utils.FileUtil;
 import org.springblade.core.tool.utils.Func;
 import org.springblade.core.tool.utils.IoUtil;
-import org.springblade.core.tool.utils.ResourceUtil;
+import org.springblade.manager.vo.DateFormat;
 
 import java.io.File;
 import java.io.FileInputStream;
@@ -23,17 +28,44 @@ import java.io.FileNotFoundException;
 import java.io.InputStream;
 import java.util.ArrayList;
 import java.util.HashMap;
+import java.util.List;
 import java.util.Map;
 
 public class ExcelInfoUtils {
 
+    public static void main1234(String[] args) throws Exception {
+        String fileUrl = "/Users/hongchuangyanfa/Downloads/29ed5438d62d301bf290b908acf3bdbb.xlsx";
+        InputStream exceInp = new FileInputStream(new File(fileUrl));
+
+        org.apache.poi.ss.usermodel.Workbook workbook = WorkbookFactory.create(exceInp);
+
+        //获取工作表
+        Sheet sheet = workbook.getSheetAt(0);
+        sheet.setForceFormulaRecalculation(true);
+
+        Row row = sheet.getRow(34);
+
+        Cell cell = sheet.getRow(34).getCell(1);
+
+        System.out.println(cell.getStringCellValue());
+        // 解析原始excel
+        Workbook wb = new Workbook();
+        wb.loadFromMHtml(fileUrl);
+        Worksheet sheet2 = wb.getWorksheets().get(0);
+
+        CellRange cellRange = sheet2.getCellRange(35, 2);
+        System.out.println(cellRange.getText());
+
+        //sheet.saveToHtml("/Users/hongchuangyanfa/Desktop/pdf/test.html");
+    }
+
     public static void main123(String[] args) throws FileNotFoundException {
         String excelUrl = "/Users/hongchuangyanfa/Downloads/C10.28隧道注浆施工记录表(1).xlsx";
         String old_html = "/Users/hongchuangyanfa/Desktop/pdf/old_html.html";
         String old_xlsx = "/Users/hongchuangyanfa/Desktop/pdf/old_html.xlsx";
         File file = new File(excelUrl);
         InputStream fileInputStream = new FileInputStream(file);
-        excelInfo(fileInputStream,old_xlsx,old_html,"1");
+      //  excelInfo(fileInputStream,old_xlsx,old_html,"1");
 
 
         // 解析原始excel
@@ -41,19 +73,28 @@ public class ExcelInfoUtils {
         wb.loadFromMHtml(excelUrl);
         Worksheet sheet = wb.getWorksheets().get(0);
 
-/*        CellRange[] mergedCells = sheet.getMergedCells();
+        CellRange[] mergedCells = sheet.getCells();
         for(int i=0;i<mergedCells.length;i++){
-            CellRange oldcell = mergedCells[i];
-            IXLSRange ixlsRange = sheet.get(oldcell.getRow(), oldcell.getColumn(), oldcell.getLastRow(), oldcell.getLastColumn());
-            System.out.println(ixlsRange.getDataValidation().getErrorMessage());
+            CellRange oldcell =mergedCells[i];
+           // sheet.get(oldcell.getRow(),oldcell.getColumn()).getDataValidation().setErrorMessage("");
+          //  sheet.get(oldcell.getRow(),oldcell.getColumn(),oldcell.getLastRow(),oldcell.getLastColumn()).getDataValidation().setErrorMessage("");
+            oldcell.getDataValidation().setErrorMessage("");
+        }
+
+
+        CellRange[] mergedCells1 = sheet.getMergedCells();
+        for(int i=0;i<mergedCells1.length;i++) {
+            CellRange oldcell = mergedCells1[i];
+            oldcell.getDataValidation().setErrorMessage(i+"");
         }
 
 
-        ArrayList<CellRange> cellList = sheet.getCellList();
-        for(int i=0;i<cellList.size();i++){
-            CellRange oldcell = cellList.get(i);
+
+        CellRange[] cells = sheet.getCells();
+        for(int i=0;i< cells.length;i++){
+            CellRange oldcell = cells[i];
             System.out.println(oldcell.getRow()+"---"+oldcell.getColumn()+"---="+oldcell.getText()+"---x="+oldcell.getDataValidation().getErrorMessage());
-        }*/
+        }
 
 
 
@@ -104,7 +145,8 @@ public class ExcelInfoUtils {
                 CellRange[] sheet2Cells = sheet.getCells();
                 for (int i = 0; i < sheet2Cells.length; i++) {
                     CellRange oldcell = sheet2Cells[i];
-                    sheet.getCellRange(oldcell.getRow(),oldcell.getColumn()).getDataValidation().setErrorMessage("");
+                    oldcell.getDataValidation().setErrorMessage("");
+                    sheet.get(oldcell.getRow(),oldcell.getColumn()).getDataValidation().setErrorMessage("");
                 }
             }
 
@@ -129,11 +171,10 @@ public class ExcelInfoUtils {
                 }else{
                     j = j + 1;
                 }
-
                 // 目标表添加备注信息
-             //   mergedCell.getDataValidation().setErrorMessage(j+"");
-               // oldcell.getDataValidation().setErrorMessage(j+"");
-               // sheet2.getMergedCells()[i].setText(j+"");
+                mergedCell.getDataValidation().setErrorMessage(j+"");
+                oldcell.getDataValidation().setErrorMessage(j+"");
+                sheet2.getMergedCells()[i].setText(j+"");
                 dataMap.put("y1", oldcell.getRow());
                 dataMap.put("y2", oldcell.getLastRow());
                 dataMap.put("x1", oldcell.getColumn());
@@ -163,10 +204,12 @@ public class ExcelInfoUtils {
                 } else {
                     j = Func.toInt(data);
                 }
-                if(StringUtils.isEmpty(data)){
+
+              /*  if(StringUtils.isEmpty(data)){
                     oldcell.getDataValidation().setErrorMessage(j+"");
                     sheet2.getCells()[i].setText(j+"");
-                }
+                }*/
+
                 if(!xyList.containsKey(j+"")){
                     Map<String, Integer> dataMap = new HashMap<>();
                     dataMap.put("y1", oldcell.getRow());
@@ -368,11 +411,6 @@ public class ExcelInfoUtils {
                 Elements td2 = trs2.get(i).select("td");
                 for (int x = 0; x < td1.size(); x++) {
                     Element cell1 = td1.get(x);
-                    /*if (cell1.children().size() >= 1) {
-                        String data = cell1.text();
-                        cell1.empty();
-                        cell1.text(data);
-                    }*/
                     Element cell2 = td2.get(x);
                     String html = cell2.text();
                     Map<String, Integer> xyMap = xyList.get(html);
@@ -398,4 +436,73 @@ public class ExcelInfoUtils {
         }
     }
 
+    public static Map<String,String> getDateFormat(List<DateFormat> dateFormat) {
+        List<DateFormat> dateFormaty = new ArrayList<>();
+        List<DateFormat> dateFormath = new ArrayList<>();
+        Map<String,String> redata = new HashMap<>();
+        String format = ""; //YYYY年MM月DD日 HH:mm:ss
+        String sp1="文本";
+        String sp2="文本";
+        String sp3="至";
+
+        if(dateFormat!=null && dateFormat.size()>=1){
+            for (DateFormat datef : dateFormat){
+                if(datef.getName().equals("divide_y")){
+                    sp1 =  datef.getValue();
+                }else if(datef.getName().equals("divide_h")){
+                    sp2 =  datef.getValue();
+                }else if(datef.getName().equals("divide_c")){
+                    sp3 =  datef.getValue();
+                }else if(datef.getValue().equals("YYYY")||datef.getValue().equals("MM")||datef.getValue().equals("DD")){
+                    dateFormaty.add(datef);
+                }else if(datef.getValue().equals("HH")||datef.getValue().equals("mm")||datef.getValue().equals("ss")){
+                    dateFormath.add(datef);
+                }
+            }
+        }
+        // 组合-日期
+        if(dateFormaty!=null && dateFormaty.size()>=1){
+            for (int i=0;i<dateFormaty.size();i++){
+                DateFormat datef = dateFormaty.get(i);
+                format =format+datef.getValue()+datef.getName();
+            }
+            if(!sp1.equals("文本")){
+                format  = format.replace("年",sp1).replace("月",sp1).replace("日"," ");
+                if(format.indexOf("DD")<0){
+                    format = format.substring(0,format.length()-1);
+                }
+            }
+        }
+        // 组合-时间
+        if(dateFormath!=null && dateFormath.size()>=1){
+            format = format+" ";
+            for (int i=0;i<dateFormath.size();i++){
+                DateFormat datef = dateFormath.get(i);
+                format =format+datef.getValue()+datef.getName();
+            }
+            if(!sp2.equals("文本")){
+                format  = format.replace("时",sp2).replace("分",sp2).replace("秒","");
+                if(format.indexOf("ss")<0){
+                    format = format.substring(0,format.length()-1);
+                }
+            }
+        }
+        if(StringUtils.isEmpty(format)){
+            format ="YYYY年MM月DD日";
+        }
+        if(dateFormaty.size()>=1&&dateFormath.size()>=1){
+            redata.put("type","datetime");
+        }else if(dateFormaty.size()>=1){
+            redata.put("type","date");
+        } else if (dateFormath.size()>=1) {
+            redata.put("type","time");
+        }
+        if(StringUtils.isNotEmpty(sp3)){
+            redata.put("sp3",sp3);
+        }
+        redata.put("format",format);
+       return  redata;
+    }
+
+
 }

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

@@ -393,6 +393,7 @@ public class FileUtils {
     public static InputStream getInputStreamByUrl(String fileUrl) throws Exception {
         String file_path = ParamCache.getValue(CommonConstant.SYS_LOCAL_URL);
         String sys_file_net_url = ParamCache.getValue(CommonConstant.SYS_FILE_NET_URL);
+
         File file1 = new File(fileUrl);
         InputStream fileInputStream = null;
         if (file1.exists()) {