Преглед изворни кода

Merge remote-tracking branch 'origin/master'

# Conflicts:
#	blade-service/blade-manager/src/main/java/org/springblade/manager/utils/FileUtils.java
liuyc пре 2 година
родитељ
комит
0bfd98a2a5
31 измењених фајлова са 764 додато и 147 уклоњено
  1. 27 0
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/entity/AppVersion.java
  2. 48 0
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/entity/AppVersionDetail.java
  3. 44 0
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/DateFormat.java
  4. 4 0
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/TextdictDataInfoVO.java
  5. 3 2
      blade-service/blade-business/src/main/java/org/springblade/business/controller/InformationWriteQueryController.java
  6. 20 7
      blade-service/blade-business/src/main/java/org/springblade/business/service/impl/TaskServiceImpl.java
  7. 74 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/controller/AppVersionController.java
  8. 85 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/controller/AppVersionDetailController.java
  9. 7 8
      blade-service/blade-manager/src/main/java/org/springblade/manager/controller/ExcelTabController.java
  10. 96 1
      blade-service/blade-manager/src/main/java/org/springblade/manager/controller/LinkdataInfoController.java
  11. 12 14
      blade-service/blade-manager/src/main/java/org/springblade/manager/controller/TextdictInfoController.java
  12. 26 25
      blade-service/blade-manager/src/main/java/org/springblade/manager/controller/WbsParamController.java
  13. 3 3
      blade-service/blade-manager/src/main/java/org/springblade/manager/feign/WbsTreeContractClientImpl.java
  14. 26 9
      blade-service/blade-manager/src/main/java/org/springblade/manager/formula/ITurnPointCalculator.java
  15. 35 12
      blade-service/blade-manager/src/main/java/org/springblade/manager/formula/TurnPoint.java
  16. 9 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/AppVersionDetailMapper.java
  17. 6 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/AppVersionDetailMapper.xml
  18. 17 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/AppVersionMapper.java
  19. 6 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/AppVersionMapper.xml
  20. 1 1
      blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/MixProportionInfoMapper.xml
  21. 1 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/WbsTreeContractMapper.xml
  22. 32 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/IAppVersionDetailService.java
  23. 34 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/IAppVersionService.java
  24. 1 1
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/IExcelTabService.java
  25. 19 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/AppVersionDetailImpl.java
  26. 24 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/AppVersionImpl.java
  27. 1 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ArchiveTreeContractSyncImpl.java
  28. 2 3
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ExcelTabServiceImpl.java
  29. 1 1
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/FormulaServiceImpl.java
  30. 68 28
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/MixProportionInfoServiceImpl.java
  31. 32 32
      blade-service/blade-manager/src/main/java/org/springblade/manager/utils/FileUtils.java

+ 27 - 0
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/entity/AppVersion.java

@@ -0,0 +1,27 @@
+package org.springblade.manager.entity;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.springblade.core.mp.base.BaseEntity;
+
+/**
+ * @Param   APP版本
+ * @Author wangwl
+ * @Date 2023/8/29 10:02
+ **/
+@Data
+@TableName("m_app_version")
+@EqualsAndHashCode(callSuper = true)
+public class AppVersion extends BaseEntity {
+
+    @ApiModelProperty("应用平台")
+    private String platform;
+
+    @ApiModelProperty("应用名称")
+    private String name;
+
+    @ApiModelProperty("当前版本")
+    private String currentVersion;
+}

+ 48 - 0
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/entity/AppVersionDetail.java

@@ -0,0 +1,48 @@
+package org.springblade.manager.entity;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.springblade.core.mp.base.BaseEntity;
+
+import java.time.LocalDateTime;
+
+/**
+ * @Param   APP版本详情
+ * @Author wangwl
+ * @Date 2023/8/29 10:02
+ **/
+@Data
+@TableName("m_app_version_detail")
+@EqualsAndHashCode(callSuper = true)
+public class AppVersionDetail extends BaseEntity {
+
+    @ApiModelProperty(" 版本id")
+    private Long versionId;
+
+    @ApiModelProperty("版本号")
+    private String versionNumber ;
+
+    @ApiModelProperty("软件类型")
+    private Integer softwareType ;
+
+    @ApiModelProperty("文件类型")
+    private Integer fileType;
+
+    @ApiModelProperty("更新内容")
+    private String updateContent;
+
+    @ApiModelProperty("文件地址")
+    private String fileUrl;
+
+    @ApiModelProperty("文件大小")
+    private Long fileSize;
+
+    @ApiModelProperty(" 是否强制更新")
+    private Integer constraintUpdate;
+
+    @ApiModelProperty(" 更新时间")
+    private LocalDateTime updateDate;
+
+}

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

@@ -0,0 +1,44 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.manager.vo;
+
+import io.swagger.annotations.ApiModel;
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * 参数信息表实体类
+ *
+ * @author BladeX
+ * @since 2022-06-17
+ */
+@Data
+@ApiModel(value = "日期格式", description = "日期格式")
+public class DateFormat implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 名称
+     */
+    private String name;
+    /**
+     * 值
+     */
+    private String val;
+}

+ 4 - 0
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/TextdictDataInfoVO.java

@@ -54,4 +54,8 @@ public class TextdictDataInfoVO implements Serializable {
     @ApiModelProperty(value = "字段Id")
     private List<TextdictInfo_vo> textInfo;
 
+    @ApiModelProperty(value = "时间格式组合")
+    private List<DateFormat> dateFormat;
+
+
 }

+ 3 - 2
blade-service/blade-business/src/main/java/org/springblade/business/controller/InformationWriteQueryController.java

@@ -2869,14 +2869,15 @@ public class InformationWriteQueryController extends BladeController {
         //保存进回收站
         this.recycleBinClient.saveDelBusinessData(idArray, StringUtils.isNotEmpty(removeNode.getFullName()) ? removeNode.getFullName() : removeNode.getNodeName(), 2, parentNodeName.toString(), removeNode.getProjectId(), removeNode.getContractId());
 
-        //改为物理删除
+        //改为物理删除 (8.28改为逻辑删除,方便恢复)
         Boolean aBoolean = this.wbsTreeContractClient.removeContractTreeNode(idArray);
 
         //更新redis
         //this.informationQueryService.AsyncWbsTree(removeNode.getParentId() + "", removeNode.getParentId() + "", removeNode.getContractId(), "", "1");
         this.informationQueryService.delAsyncWbsTree(removeNode.getContractId());
 
-        return R.data(aBoolean);
+//        return R.data(aBoolean);
+        return R.data(true);
     }
 
     /**

+ 20 - 7
blade-service/blade-business/src/main/java/org/springblade/business/service/impl/TaskServiceImpl.java

@@ -11,6 +11,8 @@ import org.apache.commons.lang.StringUtils;
 import org.apache.commons.lang.time.DateUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+import org.springblade.archive.entity.ArchiveProjectConfig;
+import org.springblade.archive.feign.ArchiveAutoClient;
 import org.springblade.business.entity.*;
 import org.springblade.business.mapper.TaskMapper;
 import org.springblade.business.service.*;
@@ -114,6 +116,10 @@ public class TaskServiceImpl extends BaseServiceImpl<TaskMapper, Task> implement
 
     private final CommonFileClient commonFileClient;
 
+    private ArchiveTreeContractClient archiveTreeContractClient;
+
+    private final ArchiveAutoClient archiveAutoClient;
+
 
     @Autowired
     StringRedisTemplate RedisTemplate;
@@ -1036,13 +1042,20 @@ public class TaskServiceImpl extends BaseServiceImpl<TaskMapper, Task> implement
         }
 
         //TODO 测试完成后打开
-//        InformationQuery query = this.informationQueryService.getById(formDataId);
-//        if (query != null) {
-//            try {
-//                archiveTreeContractClient.writeBusinessData(query.getWbsId(),query.getContractId(),formDataId);
-//            } catch (Exception e) {
-//            }
-//        }
+        InformationQuery query = this.informationQueryService.getById(formDataId);
+        if (query != null) {
+
+            ArchiveProjectConfig archiveProjectConfig = archiveAutoClient.getByProjectIdOrNew(query.getProjectId());
+
+            //测试阶段,必须打开项目配置才能同步wbs节点
+            if (archiveProjectConfig!= null && archiveProjectConfig.getFactorType().contains("6")) {
+                //todo 等测试OK再打开
+                try {
+                    archiveTreeContractClient.writeBusinessData(query.getWbsId(),query.getContractId(),formDataId);
+                } catch (Exception e) {
+                }
+            }
+        }
 
     }
 

+ 74 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/controller/AppVersionController.java

@@ -0,0 +1,74 @@
+package org.springblade.manager.controller;
+
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.AllArgsConstructor;
+import org.springblade.core.boot.ctrl.BladeController;
+import org.springblade.core.mp.support.Query;
+import org.springblade.core.tool.api.R;
+import org.springblade.manager.entity.AppVersion;
+import org.springblade.manager.entity.MixProportionInfo;
+import org.springblade.manager.service.IAppVersionService;
+import org.springframework.web.bind.annotation.*;
+
+
+@RestController
+@AllArgsConstructor
+@RequestMapping("/appVersion")
+@Api(value = "后管APP管理版本", tags = "后管APP管理版本")
+public class AppVersionController extends BladeController {
+
+    private final IAppVersionService versionService;
+
+    /**
+     * 新增
+     */
+    @PostMapping("/add")
+    @ApiOperationSupport(order = 1)
+    @ApiOperation(value = "新增", notes = "传入版本信息")
+    public R add(@RequestBody AppVersion appVersion){
+        versionService.save(appVersion);
+        return R.data("新增成功");
+    }
+
+    /**
+     * 分页
+     */
+    @GetMapping("/page")
+    @ApiOperationSupport(order = 2)
+    @ApiOperation(value = "分页", notes = "传入分页信息")
+    public R<IPage<AppVersion>> page(Query query){
+        IPage<AppVersion> page = new Page<>(query.getCurrent(),query.getSize());
+        IPage<AppVersion> iPage = versionService.page(page);
+        return R.data(iPage);
+    }
+
+    /**
+     * 修改
+     */
+    @PostMapping("/update")
+    @ApiOperationSupport(order = 3)
+    @ApiOperation(value = "修改", notes = "传入版本信息")
+    public R update(@RequestBody AppVersion appVersion){
+        versionService.updateById(appVersion);
+        return R.data("修改成功");
+    }
+
+    /**
+     * 删除
+     */
+    @GetMapping("/delete")
+    @ApiOperationSupport(order = 4)
+    @ApiOperation(value = "删除", notes = "传入id")
+    public R page(Long id){
+        versionService.removeById(id);
+        return R.data("删除成功");
+    }
+
+
+
+}

+ 85 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/controller/AppVersionDetailController.java

@@ -0,0 +1,85 @@
+package org.springblade.manager.controller;
+
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.AllArgsConstructor;
+import org.springblade.core.boot.ctrl.BladeController;
+import org.springblade.core.mp.support.Query;
+import org.springblade.core.tool.api.R;
+import org.springblade.manager.entity.AppVersion;
+import org.springblade.manager.entity.AppVersionDetail;
+import org.springblade.manager.service.IAppVersionDetailService;
+import org.springblade.manager.service.IAppVersionService;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.web.bind.annotation.*;
+
+import java.time.LocalDateTime;
+
+
+@RestController
+@AllArgsConstructor
+@RequestMapping("/appVersionDetail")
+@Api(value = "后管APP管理版本详情", tags = "后管APP管理版本详情")
+public class AppVersionDetailController extends BladeController {
+    private final IAppVersionDetailService versionDetailService;
+    private final IAppVersionService versionService;
+
+    /**
+     * 新增
+     */
+    @PostMapping("/add")
+    @ApiOperationSupport(order = 1)
+    @ApiOperation(value = "新增", notes = "传入版本信息")
+    @Transactional
+    public R add(@RequestBody AppVersionDetail detail){
+        detail.setUpdateDate(LocalDateTime.now());
+        versionDetailService.save(detail);
+        AppVersion appVersion = new AppVersion();
+        appVersion.setId(detail.getVersionId());
+        appVersion.setCurrentVersion(detail.getVersionNumber());
+        versionService.updateById(appVersion);
+        return R.data("新增成功");
+    }
+
+    /**
+     * 分页
+     */
+    @GetMapping("/page")
+    @ApiOperationSupport(order = 2)
+    @ApiOperation(value = "分页", notes = "传入版本id与分页信息")
+    public R<IPage<AppVersionDetail>> page(Long versionId,Query query){
+        IPage<AppVersionDetail> page = new Page<>(query.getCurrent(),query.getSize());
+        IPage<AppVersionDetail> iPage = versionDetailService.page(page,
+                new LambdaQueryWrapper<AppVersionDetail>().eq(AppVersionDetail::getVersionId,versionId));
+        return R.data(iPage);
+    }
+
+    /**
+     * 修改
+     */
+    @PostMapping("/update")
+    @ApiOperationSupport(order = 3)
+    @ApiOperation(value = "修改", notes = "传入版本详情")
+    public R update(@RequestBody AppVersionDetail detail){
+        versionDetailService.updateById(detail);
+        return R.data("修改成功");
+    }
+
+    /**
+     * 删除
+     */
+    @GetMapping("/delete")
+    @ApiOperationSupport(order = 4)
+    @ApiOperation(value = "删除", notes = "传入id")
+    public R page(Long id){
+        versionDetailService.removeById(id);
+        return R.data("删除成功");
+    }
+
+
+}

+ 7 - 8
blade-service/blade-manager/src/main/java/org/springblade/manager/controller/ExcelTabController.java

@@ -297,8 +297,6 @@ public class ExcelTabController extends BladeController {
         FileUtils.excelInfo(file.getInputStream(),exceUrl,thmlUrl,"1");
         // 上传excel文件
         BladeFile bladeFile = newIOSSClient.uploadFile(file.getOriginalFilename(),exceUrl);
-      //  R<BladeFile> bladeFile = iossClient.addFileInfo(file);
-      //  BladeFile bladeFile1 = bladeFile.getData();
         detail.setExtension(file.getOriginalFilename());
         detail.setFileUrl(bladeFile.getLink());
         detail.setFileType(3); // 表示为清表信息  1 表示祖节点  2 表示为节点信息 3 表示清表
@@ -466,9 +464,7 @@ public class ExcelTabController extends BladeController {
         updateWrapper.set("excel_id", exceTabId);
 
         // 复制模版htmlURL
-
         File file_in = ResourceUtil.getFile(excelTab.getHtmlUrl());
-
         String filecode = SnowFlakeUtil.getId() + "";
         String thmlUrl = file_path + "/privateUrl/" + filecode + ".html";
         File file_out = ResourceUtil.getFile(thmlUrl);
@@ -488,6 +484,7 @@ public class ExcelTabController extends BladeController {
             updateWrapper.set("init_table_id", excelTab.getTabId());
             org.springblade.manager.entity.TableInfo tableInfo = tableInfoService.getById(excelTab.getTabId());
             updateWrapper.set("init_table_name", tableInfo.getTabEnName());
+            aPrivate.setInitTableName(tableInfo.getTabEnName());
         } else {
             if (aPrivate.getInitTableId() == null) {
                 org.springblade.manager.entity.TableInfo tableInfo = tableInfoService.getOne(new LambdaQueryWrapper<org.springblade.manager.entity.TableInfo>()
@@ -557,10 +554,12 @@ public class ExcelTabController extends BladeController {
                             element.children().get(0).attr("@mouseup.left", "inputLeftClick(" + mousedown + ")");
                         }
                     } else {
-                        element.children().get(0).attr("placeholder", lastName)
+                        element.children().get(0)
+//                                .attr("placeholder", lastName)
                                 .attr("weighing", maxScore + "").attr("id", attrInfo).attr("keyName", attrInfo)
                                 .attr("@blur", "getRegularExpression(" + regularExpression + ",'" + filedLength + "')")
-                                .attr("maxlength", filedLength);
+                                .attr("maxlength", filedLength)
+                                .attr("class", "warnstyle");
                     }
                     element.attr("@click", "getInformation(" + oncklickText + ")");
                 }
@@ -741,6 +740,7 @@ public class ExcelTabController extends BladeController {
         }
 
         String fileUrl = wbsTreePrivate.getHtmlUrl();
+//        String fileUrl = "C:\\Users\\泓创研发01\\Desktop\\privateUrl\\1696003315218776064.html";
         File file1 = ResourceUtil.getFile(fileUrl);
         InputStream fileInputStream;
         if (file1.exists()) {
@@ -916,7 +916,6 @@ public class ExcelTabController extends BladeController {
                             zikey.add(dataInfo);
                         }
                     } else { //空行
-
                         List<Map<String, String>> left = new ArrayList<>();
                         List<Map<String, String>> top = new ArrayList<>();
                         for (int k = 0; k < zikey.size(); k++) {
@@ -3581,7 +3580,7 @@ public class ExcelTabController extends BladeController {
             @ApiImplicitParam(name = "pkeyId", value = "WBS私有库的pkeyId", required = true),
             @ApiImplicitParam(name = "tabId", value = "表信息id", required = true)
     })
-    public R<List<WbsFormElement>> getUnMatchField(Long pkeyId,Long tabId) throws FileNotFoundException {
+    public R<List<WbsFormElement>> getUnMatchField(Long pkeyId,Long tabId) throws Exception {
         return R.data(excelTabService.getUnMatchField(pkeyId,tabId));
     }
 

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

@@ -39,6 +39,7 @@ import org.springblade.manager.entity.WbsTreePrivate;
 import org.springblade.manager.mapper.WbsTreePrivateMapper;
 import org.springblade.manager.service.ILinkdataInfoService;
 import org.springblade.manager.service.IWbsFormElementService;
+import org.springblade.manager.utils.FileUtils;
 import org.springframework.jdbc.core.JdbcTemplate;
 import org.springframework.web.bind.annotation.*;
 
@@ -46,6 +47,7 @@ import javax.validation.Valid;
 import java.io.File;
 import java.io.FileInputStream;
 import java.io.IOException;
+import java.io.InputStream;
 import java.util.List;
 import java.util.Map;
 
@@ -68,6 +70,7 @@ public class LinkdataInfoController extends BladeController {
     private final WbsTreePrivateMapper wbsTreePrivateMapper;
 
     private final JdbcTemplate jdbcTemplate;
+
     /**
      * 详情
      */
@@ -169,7 +172,7 @@ public class LinkdataInfoController extends BladeController {
 
 
     /**
-     * 编辑表单-替换元素||删除文本信息 保存
+     * 编辑表单-替换元素||删除文本信息 单个保存
      */
     @PostMapping("/saveTabColInfo")
     @ApiOperationSupport(order = 9)
@@ -247,4 +250,96 @@ public class LinkdataInfoController extends BladeController {
     }
 
 
+
+
+    /**
+     * 编辑表单-替换元素||删除文本信息 批量编辑保存
+     */
+    @PostMapping("/saveTabColInfo2")
+    @ApiOperationSupport(order = 9)
+    @ApiOperation(value = "编辑表单-替换元素||删除文本信息 保存", notes = "传入linkdataInfo数组")
+    public R saveTabColInfo2(@Valid @RequestBody List<LinkdataInfo> list) throws Exception {
+        if (list != null && list.size() > 0) {
+            // 获取 节点信息
+            WbsTreePrivate wbsTreePrivate = wbsTreePrivateMapper.getByPKeyId(list.get(0).getTabId());
+            // 获取元素基本信息
+            WbsFormElement wbsFormElement = wbsFormElementService.getById(list.get(0).getHtmlType());
+            // 读取html页面信息
+
+            InputStream inputStream = FileUtils.getInputStreamByUrl(wbsTreePrivate.getHtmlUrl());
+            String htmlString = IoUtil.readToString(inputStream);
+            // 样式集合
+            Document doc = Jsoup.parse(htmlString);
+            //解析
+            Element table = doc.select("table").first();
+            Elements trs = table.select("tr");
+            for (LinkdataInfo linkdataInfo : list) {
+                Element element = trs.get(linkdataInfo.getTrIndex()).select("td").get(linkdataInfo.getTdIndex());
+                String keyId = "";
+                if (linkdataInfo.getColName().equals("/")) {
+                    element.empty();
+                } else {
+                    String enName = wbsFormElement.getEName();
+                    element.removeAttr("title");
+                    element.attr("title", enName);
+                    String dataInfo2 = wbsFormElement.getEKey() + "__" + linkdataInfo.getTrIndex() + "_" + linkdataInfo.getTdIndex();
+                    Element element1 = element.children().get(0);
+
+                    if (element.html().indexOf("el-tooltip") >= 0) {
+                        element1.removeAttr("placeholder");
+                        element1.removeAttr("keyName");
+                        element1.removeAttr("id");
+                        element1.removeAttr("weighing");
+                        element1.removeAttr("v-model");
+                        element1.removeAttr("@focus");
+                        keyId = element1.attr("keyName");
+                        element1 = element.children().get(0).children().get(0);
+                    }
+                    //如果是警告,则删除样式
+                    String aClass = element1.attr("class");
+                    if (StringUtils.isNotBlank(aClass)){
+                        if ("warnstyle".equals(aClass)){
+                            element1.removeAttr("class");
+                        }
+                    }
+
+                    element1.removeAttr("placeholder");
+                    element1.removeAttr("keyName");
+                    element1.removeAttr("id");
+                    element1.removeAttr("weighing");
+                    element1.removeAttr("v-model");
+                    element1.removeAttr("@focus");
+                    keyId = element1.attr("keyName");
+                    if (element.html().indexOf("hc-form-checkbox-group") >= 0) {
+                        element1.removeAttr(":val");
+                        element1.attr(":val", "formData." + dataInfo2);
+                    }
+
+                    element1.attr("placeholder", enName).attr("keyName", dataInfo2).attr("id", dataInfo2);
+                    element1.attr("weighing", "100");
+                    element1.attr("v-model", "formData." + dataInfo2);
+                    element.attr("@click", "getInformation('" + enName + "'," + linkdataInfo.getTrIndex() + "," + linkdataInfo.getTdIndex() + ")");
+                }
+
+                // 清空数据
+                if (StringUtils.isNotEmpty(keyId)) {
+                    String tabName = wbsTreePrivate.getInitTableName();
+                    String isExitSql = " select * from information_schema.TABLES where TABLE_NAME='" + tabName + "'";
+                    List<Map<String, Object>> tablist = jdbcTemplate.queryForList(isExitSql);
+                    if (tablist != null && tablist.size() > 0 && wbsTreePrivate.getType() != 10) {
+                        String clarSql = "update  " + tabName + " set " + keyId.split("__")[0] + "=null where p_key_id in(SELECT p_key_id FROM m_wbs_tree_contract WHERE id ='" + wbsTreePrivate.getId() + "' and project_id='" + wbsTreePrivate.getProjectId() + "' )";
+                        jdbcTemplate.execute(clarSql);
+                    }
+                }
+
+            }
+            File writefile = new File(wbsTreePrivate.getHtmlUrl());
+            FileUtil.writeToFile(writefile, doc.html(), Boolean.parseBoolean("UTF-8"));
+            inputStream.close();
+            return R.success("操作成功");
+        }
+        return R.success("操作成功");
+    }
+
+
 }

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

@@ -235,22 +235,16 @@ public class TextdictInfoController extends BladeController {
     @ApiOperationSupport(order = 9)
     @ApiOperation(value = "新增或修改", notes = "传入textdictInfo")
     public R saveTextInfo(@Valid @RequestBody TextdictDataInfoVO textdictInfo) throws Exception {
-        String file_path = ParamCache.getValue(CommonConstant.SYS_LOCAL_URL);
-        String sys_file_net_url = ParamCache.getValue(CommonConstant.SYS_FILE_NET_URL);
+
         // 获取 节点信息
         WbsTreePrivate wbsTreePrivate = wbsTreePrivateMapper.getByPKeyId(textdictInfo.getTableId());
 
         // 读取html页面信息
         String path = "";
         String fileUrl = wbsTreePrivate.getHtmlUrl();
-        File file1 = ResourceUtil.getFile(fileUrl);
-        InputStream fileInputStream;
-        if (file1.exists()) {
-            fileInputStream = new FileInputStream(file1);
-        } else {
-            path = sys_file_net_url + fileUrl.replaceAll("//", "/").replaceAll(file_path, "");
-            fileInputStream = CommonUtil.getOSSInputStream(path);
-        }
+
+        InputStream fileInputStream = FileUtils.getInputStreamByUrl(fileUrl);
+
         String htmlString = IoUtil.readToString(fileInputStream);
         // 样式集合
         Document doc = Jsoup.parse(htmlString);
@@ -318,8 +312,11 @@ public class TextdictInfoController extends BladeController {
                 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")) { // 日期--年月日
+        }
+
+        /*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>");
@@ -329,7 +326,9 @@ public class TextdictInfoController extends BladeController {
             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")) { // 时间段
+        }*/
+
+        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")) { // 时间段 /
@@ -358,9 +357,7 @@ public class TextdictInfoController extends BladeController {
         } else {
             FileUtil.writeToFile(writeFile, doc.html(), Boolean.parseBoolean("UTF-8"));
         }
-
         Thread.sleep(300);
-
         // 清空相关的保存数据
         String tabName = wbsTreePrivate.getInitTableName();
         String isExitSql = " select * from information_schema.TABLES where TABLE_NAME='" + tabName + "'";
@@ -369,6 +366,7 @@ public class TextdictInfoController extends BladeController {
             String clarSql = "update  " + tabName + " set " + keyname.split("__")[0] + "=null where p_key_id in(SELECT p_key_id FROM m_wbs_tree_contract WHERE id ='" + wbsTreePrivate.getId() + "' and project_id='" + wbsTreePrivate.getProjectId() + "' )";
             jdbcTemplate.execute(clarSql);
         }
+        fileInputStream.close();
         return R.success("操作成功");
     }
 

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

@@ -402,39 +402,17 @@ public class WbsParamController {
                     /*project*/
                     elementMap = this.jdbcTemplate.queryForList(
                             "select c.e_name as name ,c.id from m_wbs_tree_private a " +
-                                    "inner join m_wbs_tree_private b on (a.id=b.parent_id and a.wbs_id=b.wbs_id) " +
+                                    "inner join m_wbs_tree_private b on (a.id=b.parent_id and a.project_id=b.project_id) " +
                                     "inner join m_wbs_form_element c on  b.init_table_id=c.f_id " +
                                     "where  b.project_id=" + projectId + " and a.p_key_id=" + nodeId + "  and b.is_deleted=0 and c.is_deleted=0 ");
                 }
 
                 List<Long> longList = this.jdbcTemplate.queryForList("select element_id from m_element_formula_mapping where is_deleted=0 and scope=35 and param_id in(" + paramList.stream().map(WbsParam::getId).map(String::valueOf).collect(Collectors.joining(",")) + ")", Long.class);
                 if (Func.isNotEmpty(elementMap)) {
-//                    Map<String, Object> tmpMap = new HashMap<>();
                     List<Map<String, Object>> finalElementMap = elementMap;
                     Map<String,Long> fkMap = this.service.formulaIdKeyMap(paramList.stream().map(WbsParam::getK).collect(Collectors.toList()));
                     paramList.forEach(e -> {
                         /*复用节点参数公式,只要公式脚本一样就直接引用*/
-//                        Formula formula = this.formulaService.getOne(Wrappers.<Formula>lambdaQuery().eq(Formula::getParamId, e.getId()));
-//                        if (formula == null) {
-//                            formula = new Formula();
-//                            formula.setOutm(Formula.FULL);
-//                            formula.setParamId(e.getId());
-//                            Map<String, String> keyMap = new HashMap<>();
-//                            keyMap.put("name", e.getName());
-//                            keyMap.put("id", e.getId().toString());
-//                            tmpMap.put(e.getK(), keyMap);
-//                            if (RegexUtil.match(ParamElements.LEVEL_REG, e.getV().trim())) {
-//                                /*取层级*/
-//                                formula.setFormula("FC.tree(trees,WP[" + e.getK() + "])");
-//                            } else {
-//                                /*直接取数*/
-//                                formula.setFormula("WP[" + e.getK() + "]");
-//                            }
-//                            formula.setMap(JSON.toJSONString(tmpMap));
-//                            this.formulaService.save(formula);
-//                            tmpMap.clear();
-//                        }
-//                        Formula finalFormula = formula;
                         String name = e.getName().replace("【水】", "").trim();
                         finalElementMap.forEach(m -> {
                             if (StringUtils.handleNull(m.get("name")).contains(name)) {
@@ -535,8 +513,8 @@ public class WbsParamController {
         }
     }
 
-    @GetMapping("/test")
-    public R<Object> test() {
+    @GetMapping("/createFormulaForWp")
+    public R<Object> createFormulaForWp() {
           /*刷模版公式*/
         List<WbsParam> list =service.list(Wrappers.<WbsParam>lambdaQuery().eq(WbsParam::getType,0));
         Map<String, Object> tmpMap = new HashMap<>();
@@ -556,6 +534,29 @@ public class WbsParamController {
           return R.success("完成");
     }
 
+    @GetMapping("/reMappingProjectAll")
+    public R<Object> reMappingProjectAll(Long projectId){
+        if(projectId==null){
+            return R.fail("请输入项目id");
+        }
+        List<Map<String,Object>> listMaps= this.jdbcTemplate.queryForList(" select p_key_id pkeyId,full_name name from m_wbs_tree_private where is_deleted = 0 and project_id="+projectId+" and node_type=6");
+        if(listMaps.size()>1){
+            int total = listMaps.size();
+            int count=0;
+            for(Map<String,Object> map:listMaps){
+                try {
+                    Long nodeId= Long.parseLong(map.get("pkeyId").toString());
+                    refresh(nodeId,1,projectId);
+                    count++;
+                }catch (Exception e){
+                    System.out.println(map.get("name")+"节点参数刷新失败");
+                    e.printStackTrace();
+                }
+            }
+           return  R.success("刷新"+total+"节点,成功"+count+"节点");
+        }
+        return R.fail("刷新失败");
+    }
 
     @GetMapping("/lack")
     public R<Object> lack(String name) {

+ 3 - 3
blade-service/blade-manager/src/main/java/org/springblade/manager/feign/WbsTreeContractClientImpl.java

@@ -159,11 +159,11 @@ public class WbsTreeContractClientImpl implements WbsTreeContractClient {
     @Override
     public Boolean removeContractTreeNode(List<String> ids) {
         if (ids.size() > 0) {
-            jdbcTemplate.execute("delete from m_wbs_tree_contract where p_key_id in(" + org.apache.commons.lang.StringUtils.join(ids, ",") + ")");
-            return true;
+//            jdbcTemplate.execute("delete from m_wbs_tree_contract where p_key_id in(" + org.apache.commons.lang.StringUtils.join(ids, ",") + ")");
+//            return true;
+            return this.wbsTreeContractService.update(Wrappers.<WbsTreeContract>lambdaUpdate().set(WbsTreeContract::getIsDeleted, 1).in(WbsTreeContract::getPKeyId, ids));
         }
         return false;
-        //return this.wbsTreeContractService.update(Wrappers.<WbsTreeContract>lambdaUpdate().set(WbsTreeContract::getIsDeleted, 1).in(WbsTreeContract::getPKeyId, ids));
     }
 
     @Override

+ 26 - 9
blade-service/blade-manager/src/main/java/org/springblade/manager/formula/ITurnPointCalculator.java

@@ -355,28 +355,45 @@ public interface ITurnPointCalculator {
     }
     static void tpHandlerCe(List<TurnPoint> result,LevelInfo info ,TurnPoint tp){
         if(!finalizeCe(tp)) {
+            /*负前视,用于判断是否使用倒尺计算*/
+            boolean negative = tp.isNegativeQ();
             if (StringUtils.isNotEmpty(tp.getSc())) {
                 if (StringUtils.isNotEmpty(tp.getSj())) {
                     tp.setDx(tp.getSc0L() - tp.getSj0L());
                 }
-                tp.setQ(info.getSightHeight() - tp.getSc0L());
+                if (StringUtils.isEmpty(tp.getQ())) {
+                    tp.setQ(info.getSightHeight() - tp.getSc0L());
+                }
             } else if (StringUtils.isNotEmpty(tp.getSj())) {
-                String dx = rangeList(1, 0, info.getDx(), 1, 0, 1).get(0).toString();
-                tp.setDx(dx);
-                tp.setSc(tp.getSj0L() + tp.getDx0L());
-                tp.setQ(info.getSightHeight() - tp.getSc0L());
+                if(StringUtils.isEmpty(tp.getDx())) {
+                    String dx = rangeList(1, 0, info.getDx(), 1, 0, 1).get(0).toString();
+                    tp.setDx(dx);
+                }
+                if(StringUtils.isNotEmpty(tp.getQ())){
+                    tp.setSc(info.getSightHeight()-tp.getQ0L());
+                    tp.setDx(tp.getSj0L()-tp.getSj0L());
+                }else{
+                    tp.setSc(tp.getSj0L() + tp.getDx0L());
+                    tp.setQ(info.getSightHeight() - tp.getSc0L());
+                }
             } else if (StringUtils.isNotEmpty(tp.getQ())) {
                 tp.setSc(info.getSightHeight() - tp.getQ0L());
                 if (tp.getSj() != null) {
                     tp.setDx(tp.getSj0L() - tp.getSj0L());
+                }else if(StringUtils.isNotEmpty(tp.getDx())){
+                    tp.setSj(tp.getSc0L()-tp.getDx0L());
                 }
             }
+            if (!tp.isVisible(negative)) {
+                result.addAll(tp.limit(negative));
+            }
         }
-        if (!tp.isVisible()) {
-            result.addAll(tp.limit());
-        }
+
     }
 
+
+
+
     /**验证当前测点数据的合理性*/
     static boolean finalizeCe(TurnPoint tp){
         if(Func.isNotBlank(tp.getSc())&&Func.isNotBlank(tp.getSj())&&Func.isNotBlank(tp.getQ())&&Func.isNotBlank(tp.getDx())){
@@ -384,7 +401,7 @@ public interface ITurnPointCalculator {
             boolean f1= tp.getSc0L()==tp.getLevelInfo().getSightHeight()-tp.getQ0L();
             /*实测高程-设计值高程=偏差值*/
             boolean f2=tp.getSc0L()-tp.getSj0L()==tp.getDx0L();
-            return f1&&f2;
+            return f1&&f2&&tp.isVisible(tp.isNegativeQ());
         }
         return false;
     }

+ 35 - 12
blade-service/blade-manager/src/main/java/org/springblade/manager/formula/TurnPoint.java

@@ -1,5 +1,6 @@
 package org.springblade.manager.formula;
 
+import com.alibaba.fastjson.JSON;
 import com.mixsmart.utils.CustomFunction;
 import com.mixsmart.utils.StringUtils;
 import org.springframework.beans.BeanUtils;
@@ -228,13 +229,16 @@ public class TurnPoint {
         return levelInfo.getSightHeight() >= getBmd0L();
     }
 
-    public Boolean isVisible() {
+    public Boolean isVisible(Boolean negative) {
         /*只有测点落在0.5到step之间才有效,负数前视取绝对值*/
+        if(!StringUtils.isNumber(q)){
+            return false;
+        }
         double d = getQ0L();
-        if(d<0){
+        if(negative){
             d=  Math.abs(d);
         }
-        return d >= levelInfo.getMin() && d <= levelInfo.getStep();
+        return d >= levelInfo.getMin() && d <= levelInfo.getStep()&&levelInfo.getSightHeight()-getQ0L()==getSc0L();
     }
 
     public Boolean needClose() {
@@ -242,24 +246,43 @@ public class TurnPoint {
     }
 
     public static void test() {
-        for (int i = 0; i < 100; i++) {
+        for (int i = 0; i < 3; i++) {
             LevelInfo info = new LevelInfo();
-            info.setSightHeight(144.228);
+            info.setSightHeight(401.817+0.454);
             TurnPoint tp = new TurnPoint(info, new HashMap<>());
-            tp.setSc(138.981);
-            System.out.println("第" + (i + 1) + "次");
-            System.out.println(tp.limit().stream().map(TurnPoint::getBmd0L).collect(Collectors.toList()));
+            tp.setQ(0.619);
+            tp.setSc(405.546);
+            if(!tp.isVisible(false)) {
+                System.out.println("第" + (i + 1) + "次");
+                System.out.println(tp.limit(false).stream().map(e -> "{" + e.getQ() + "," + e.getBmd() + "," + e.getH() + "}").collect(Collectors.toList()) + "{" + tp.getQ() + "," + tp.getSc() + "," + tp.getSj() + "}");
+            }else{
+                System.out.println( "{" + tp.getQ() + "," + tp.getSc() + "," + tp.getSj() + "}");
+            }
+
         }
     }
 
+    public Boolean isNegativeQ(){
+        return StringUtils.isNumber(q)&&getQ0L()<0;
+    }
+
+/*    public static void main(String[] args) {
+        test();
+    }*/
+
     public static Random r = new Random();
     /*转点的核心处理算法,当测点不在测量范围会触发*/
-    public List<TurnPoint> limit() {
+    public List<TurnPoint> limit(Boolean negative) {
         List<TurnPoint> result = new ArrayList<>();
         double step = levelInfo.getStep();
-        double q = (double) (r.nextInt(30) + 5) / 10;
-        setQ(q);
-        double target = q + getSc0L();
+        /*负前视必须是表单传入,而非自动生成*/
+        /*boolean fake=(!negative&&getQ0L()<0);*/
+        boolean overRange=(!negative&&getQ0L()<levelInfo.getMin()) || getQ0L() > levelInfo.getStep();
+        if(StringUtils.isEmpty(getQ())||overRange){
+            double q = (double) (r.nextInt(3000) + 500) / 1000;
+            setQ(q);
+        }
+        double target = getQ0L() + getSc0L();
         double hd = Math.abs(target - levelInfo.getSightHeight());
         boolean higher = target > levelInfo.getSightHeight();
         int loop = 0;

+ 9 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/AppVersionDetailMapper.java

@@ -0,0 +1,9 @@
+package org.springblade.manager.mapper;
+
+
+import org.springblade.manager.entity.AppVersionDetail;
+import org.springblade.manager.injector.EasyBaseMapper;
+
+public interface AppVersionDetailMapper extends EasyBaseMapper<AppVersionDetail> {
+
+}

+ 6 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/AppVersionDetailMapper.xml

@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="org.springblade.manager.mapper.AppVersionDetailMapper">
+
+
+</mapper>

+ 17 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/AppVersionMapper.java

@@ -0,0 +1,17 @@
+package org.springblade.manager.mapper;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import org.apache.ibatis.annotations.Param;
+import org.springblade.manager.dto.WbsTreePrivateDTO2;
+import org.springblade.manager.entity.AppVersion;
+import org.springblade.manager.entity.TableInfo;
+import org.springblade.manager.entity.WbsTree;
+import org.springblade.manager.entity.WbsTreePrivate;
+import org.springblade.manager.injector.EasyBaseMapper;
+import org.springblade.manager.vo.*;
+
+import java.util.List;
+
+public interface AppVersionMapper extends EasyBaseMapper<AppVersion> {
+
+}

+ 6 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/AppVersionMapper.xml

@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="org.springblade.manager.mapper.AppVersionMapper">
+
+
+</mapper>

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

@@ -11,7 +11,7 @@
         <foreach collection="number" item="n" open="(" separator="," close=")">
             #{n}
         </foreach>
-        or
+        or design_strength in
         <foreach collection="strength" item="s" open="(" separator="," close=")">
             #{s}
         </foreach>

+ 1 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/WbsTreeContractMapper.xml

@@ -401,6 +401,7 @@
         set excel_id= #{aPrivate.excelId},
             node_name = #{aPrivate.nodeName},
             full_name = #{aPrivate.fullName},
+            init_table_name = #{aPrivate.initTableName},
             is_link_table = 2,
             html_url = #{aPrivate.htmlUrl}
         where type = 2

+ 32 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/service/IAppVersionDetailService.java

@@ -0,0 +1,32 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.manager.service;
+
+import org.springblade.core.mp.base.BaseService;
+import org.springblade.manager.entity.AppVersion;
+import org.springblade.manager.entity.AppVersionDetail;
+
+/**
+ * 服务类
+ *
+ * @author BladeX
+ * @since 2023-03-20
+ */
+public interface IAppVersionDetailService extends BaseService<AppVersionDetail> {
+
+
+}

+ 34 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/service/IAppVersionService.java

@@ -0,0 +1,34 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.manager.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import org.springblade.core.mp.base.BaseService;
+import org.springblade.manager.entity.AppVersion;
+import org.springblade.manager.entity.ArchiveAutoRuleWbs;
+import org.springblade.manager.vo.ArchiveAutoRuleWbsVO;
+
+/**
+ * 服务类
+ *
+ * @author BladeX
+ * @since 2023-03-20
+ */
+public interface IAppVersionService extends BaseService<AppVersion> {
+
+
+}

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

@@ -174,5 +174,5 @@ public interface IExcelTabService extends BaseService<ExcelTab> {
      */
     void gsColor(Long pKeyId, String nodeId, String projectId, Document doc);
 
-    List<WbsFormElement> getUnMatchField(Long pkeyId, Long tabId) throws FileNotFoundException;
+    List<WbsFormElement> getUnMatchField(Long pkeyId, Long tabId) throws Exception;
 }

+ 19 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/AppVersionDetailImpl.java

@@ -0,0 +1,19 @@
+package org.springblade.manager.service.impl;
+
+
+import lombok.AllArgsConstructor;
+import org.springblade.core.mp.base.BaseServiceImpl;
+import org.springblade.manager.entity.AppVersion;
+import org.springblade.manager.entity.AppVersionDetail;
+import org.springblade.manager.mapper.AppVersionDetailMapper;
+import org.springblade.manager.mapper.AppVersionMapper;
+import org.springblade.manager.service.IAppVersionDetailService;
+import org.springblade.manager.service.IAppVersionService;
+import org.springframework.stereotype.Service;
+
+@Service
+@AllArgsConstructor
+public class AppVersionDetailImpl extends BaseServiceImpl<AppVersionDetailMapper, AppVersionDetail> implements IAppVersionDetailService {
+
+
+}

+ 24 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/AppVersionImpl.java

@@ -0,0 +1,24 @@
+package org.springblade.manager.service.impl;
+
+
+import lombok.AllArgsConstructor;
+import org.springblade.common.utils.ForestNodeMergerEx;
+import org.springblade.core.mp.base.BaseServiceImpl;
+import org.springblade.manager.entity.AppVersion;
+import org.springblade.manager.entity.TableInfo;
+import org.springblade.manager.mapper.AppVersionMapper;
+import org.springblade.manager.mapper.TableInfoMapper;
+import org.springblade.manager.service.IAppVersionService;
+import org.springblade.manager.service.ITableInfoService;
+import org.springblade.manager.vo.ArchiveTreeContractVO2;
+import org.springblade.manager.vo.ArchiveTreeVO2;
+import org.springframework.stereotype.Service;
+
+import java.util.*;
+
+@Service
+@AllArgsConstructor
+public class AppVersionImpl extends BaseServiceImpl<AppVersionMapper, AppVersion> implements IAppVersionService {
+
+
+}

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

@@ -188,6 +188,7 @@ public class ArchiveTreeContractSyncImpl {
         List<ArchiveTreeContract> saveList = new ArrayList<>();
 
         ArchiveProjectConfig archiveProjectConfig = archiveAutoClient.getByProjectIdOrNew(projectId);
+
         //测试阶段,必须打开项目配置才能同步wbs节点
         if (archiveProjectConfig!= null && archiveProjectConfig.getFactorType().contains("6")) {
             //todo 等测试OK再打开

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

@@ -727,13 +727,12 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
      * @return
      */
     @Override
-    public List<WbsFormElement> getUnMatchField(Long pkeyId, Long tabId) throws FileNotFoundException {
+    public List<WbsFormElement> getUnMatchField(Long pkeyId, Long tabId) throws Exception {
         // 获取 节点信息
         WbsTreePrivate wbsTreePrivate = wbsTreePrivateService.getOne(
                 new LambdaQueryWrapper<WbsTreePrivate>().eq(WbsTreePrivate::getPKeyId,pkeyId));
         // 读取html页面信息
-        File file1 = ResourceUtil.getFile(wbsTreePrivate.getHtmlUrl());
-        FileInputStream inputStream = new FileInputStream(file1);
+        InputStream  inputStream = FileUtils.getInputStreamByUrl(wbsTreePrivate.getHtmlUrl());
         String htmlString = IoUtil.readToString(inputStream);
         // 样式集合
         Document doc = Jsoup.parse(htmlString);

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

@@ -778,7 +778,7 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
                                                 em.put(se.getKey(),StringUtils.handleObj2Integer(value));
                                             }
                                         }else{
-                                            em.put(se.getKey(),value);
+                                            em.put(se.getKey(),StringUtils.handleNull(value).replaceAll("[ ]+","").trim());
                                         }
 
                                     }

+ 68 - 28
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/MixProportionInfoServiceImpl.java

@@ -139,33 +139,55 @@ public class MixProportionInfoServiceImpl extends BaseServiceImpl<MixProportionI
         String url = baseMapper.getExcelUrlByPKeyId(dto.getKeyId());
         // 读取html页面信息
         File file1 = ResourceUtil.getFile(url);
-//        File file1 = ResourceUtil.getFile("C:\\Users\\泓创研发01\\Desktop\\privateUrl\\1694957051815395328.html");
+//        File file1 = ResourceUtil.getFile("C:\\Users\\泓创研发01\\Desktop\\privateUrl\\1696079664109322240.html");
         FileInputStream inputStream = new FileInputStream(file1);
         String htmlString = IoUtil.readToString(inputStream);
         Document doc = Jsoup.parse(htmlString);
         Element table = doc.select("table").first();
         Elements td = table.select("td");
-        Boolean isFiled = false;
-        String key = "";
+        String key1 = "";
+        String key2 = "";
+        String key3 = "";
+        String key4 = "";
+        String key5 = "";
+        String key6 = "";
+        String key7 = "";
+        String key8 = "";
+        String key9 = "";
         for (Element element : td) {
-            if (isFiled){
-                key = element.childNodes().get(1).attr("keyname");
-                break;
-            }
-            if (com.baomidou.mybatisplus.core.toolkit.StringUtils.isNotBlank(element.text()) && element.text().equals("施工配合比")){
-                isFiled = true;
+            if (element.childNodes().size() >= 2) {
+                String str = element.childNodes().get(1).attr("placeholder");
+                if (StringUtils.isNotBlank(str) && str.equals("施工配合比_每立方米混凝土材料用量(kg)_水泥")) {
+                    key1 = element.childNodes().get(1).attr("keyname");
+                }
+                if (StringUtils.isNotBlank(str) && str.equals("施工配合比_每立方米混凝土材料用量(kg)_碎(卵)石1")) {
+                    key2 = element.childNodes().get(1).attr("keyname");
+                }
+                if (StringUtils.isNotBlank(str) && str.equals("施工配合比_每立方米混凝土材料用量(kg)_碎(卵)石2")) {
+                    key3 = element.childNodes().get(1).attr("keyname");
+                }
+                if (StringUtils.isNotBlank(str) && str.equals("施工配合比_每立方米混凝土材料用量(kg)_碎(卵)石3")) {
+                    key4 = element.childNodes().get(1).attr("keyname");
+                }
+                if (StringUtils.isNotBlank(str) && str.equals("施工配合比_每立方米混凝土材料用量(kg)_砂")) {
+                    key5 = element.childNodes().get(1).attr("keyname");
+                }
+                if (StringUtils.isNotBlank(str) && str.equals("施工配合比_每立方米混凝土材料用量(kg)_水")) {
+                    key6 = element.childNodes().get(1).attr("keyname");
+                }
+                if (StringUtils.isNotBlank(str) && str.equals("施工配合比_每立方米混凝土材料用量(kg)_外掺(料)剂1")) {
+                    key7 = element.childNodes().get(1).attr("keyname");
+                }
+                if (StringUtils.isNotBlank(str) && str.equals("施工配合比_每立方米混凝土材料用量(kg)_外掺(料)剂2")) {
+                    key8 = element.childNodes().get(1).attr("keyname");
+                }
+                if (StringUtils.isNotBlank(str) && str.equals("施工配合比_每立方米混凝土材料用量(kg)_外掺(料)剂3")) {
+                    key9 = element.childNodes().get(1).attr("keyname");
+                }
             }
+
         }
-        if (!isFiled){
-            inputStream.close();
-            return R.data(null);
-        }
-        //获取位置前缀后缀
-        String prefix= key.replaceAll("__[\\d_]+", "");
-        String suffix = key.replaceAll("key_\\d+__", "");
-        String[] split = suffix.split("_");
-        String s1 = split[0];
-        Integer s2 = Integer.parseInt(split[1]);
+
         //结果集
         Map<String,BigDecimal> map = new HashMap<>();
         //获取配合比信息
@@ -186,49 +208,67 @@ public class MixProportionInfoServiceImpl extends BaseServiceImpl<MixProportionI
             sand = dto.getSand().divide(new BigDecimal(100)).multiply(info.getSand());
             //黄砂
             BigDecimal sand2 = info.getSand().add(sand);
-            map.put(prefix + "__" + s1 + "_" + (s2 + 1), sand2);
+            if (StringUtils.isNotBlank(key5)) {
+                map.put(key5, sand2);
+            }
         }
         //碎石1
         if (dto.getMacadamOne() != null) {
             macadamOne = dto.getMacadamOne().divide(new BigDecimal(100)).multiply(info.getMacadamOne());
             //碎石1
             BigDecimal macadamOne2 = info.getMacadamOne().add(macadamOne);
-            map.put(prefix + "__" +s1 + "_" +(s2+2),macadamOne2);
+            if (StringUtils.isNotBlank(key2)) {
+                map.put(key2, macadamOne2);
+            }
         }
         //碎石2
         if (dto.getMacadamTwo() != null) {
             macadamTwo = dto.getMacadamTwo().divide(new BigDecimal(100)).multiply(info.getMacadamTwo());
             //碎石2
             BigDecimal macadamTwo2 = info.getMacadamTwo().add(macadamTwo);
-            map.put(prefix + "__" +s1 + "_" +(s2+3),macadamTwo2);
+            if (StringUtils.isNotBlank(key3)) {
+                map.put(key3, macadamTwo2);
+            }
         }
         //碎石3
         if (dto.getMacadamThree() != null) {
             macadamThree = dto.getMacadamThree().divide(new BigDecimal(100)).multiply(info.getMacadamThree());
             //碎石3
             BigDecimal macadamThree2 = info.getMacadamThree().add(macadamThree);
-            map.put(prefix + "__" +s1 + "_" +(s2+4),macadamThree2);
+            if (StringUtils.isNotBlank(key4)) {
+                map.put(key4, macadamThree2);
+            }
         }
 
         //施工配合比计算
         //水泥
         BigDecimal cement = info.getCement();
-        map.put(prefix + "__" +s1 + "_" +(s2),cement);
+        if (StringUtils.isNotBlank(key1)) {
+            map.put(key1, cement);
+        }
 
         //水
         if (dto.getSand() != null && dto.getMacadamOne() != null && dto.getMacadamTwo() != null && dto.getMacadamThree() != null) {
             BigDecimal water = info.getWater().subtract(sand).subtract(macadamOne).subtract(macadamTwo).subtract(macadamThree);
-            map.put(prefix + "__" + s1 + "_" + (s2 + 5), water);
+            if (StringUtils.isNotBlank(key6)) {
+                map.put(key6, water);
+            }
         }
         //掺加剂
         BigDecimal admixture = info.getAdmixture();
-        map.put(prefix + "__" +s1 + "_" +(s2+6),admixture);
+        if (StringUtils.isNotBlank(key7)) {
+            map.put(key7, admixture);
+        }
         //粉煤灰
         BigDecimal coalAsh = info.getCoalAsh();
-        map.put(prefix + "__" +s1 + "_" +(s2+7),coalAsh);
+        if (StringUtils.isNotBlank(key8)) {
+            map.put(key8, coalAsh);
+        }
         //矿渣粉
         BigDecimal slagPowder = info.getSlagPowder();
-        map.put(prefix + "__" +s1 + "_" +(s2+8),slagPowder);
+        if (StringUtils.isNotBlank(key9)) {
+            map.put(key9, slagPowder);
+        }
         inputStream.close();
         return R.data(map);
     }

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

@@ -410,28 +410,27 @@ public class FileUtils {
             file_path = "/Users/hongchuangyanfa/Desktop/";
         } else if (SystemUtils.isWindows()) {
             file_path = "C://upload";
-        } else if (SystemUtils.isLinux()) {
-            file_path = "/home/pdfFiles/";
         }
         return file_path;
     }
 
 
     public static void main123(String[] args) throws Exception {
-        String excelUrl = "/Users/hongchuangyanfa/Downloads/C4.13路基压实度汇总表.xlsx";
+       String excelUrl = "/Users/hongchuangyanfa/Downloads/C10.28隧道注浆施工记录表.xlsx";
         String old_html = "/Users/hongchuangyanfa/Desktop/pdf/old_html.html";
         String old_xlsx = "/Users/hongchuangyanfa/Desktop/pdf/old_html.xlsx";
 
-        //  File data = new File(excelUrl);
-        //  InputStream inputStream = new FileInputStream(data);
-        //  excelInfo(inputStream,old_xlsx,old_html,"1");
+        File data = new File(excelUrl);
+        InputStream inputStream = new FileInputStream(data);
+        excelInfo(inputStream,old_xlsx,old_html,"1");
+
 
-        String new_html = "/Users/hongchuangyanfa/Desktop/pdf/new_html.html";
+/*        String new_html = "/Users/hongchuangyanfa/Desktop/pdf/new_html.html";
         String new_xlsx = "/Users/hongchuangyanfa/Desktop/pdf/new_html.xlsx";
 
         File data = new File(old_xlsx);
         InputStream inputStream = new FileInputStream(data);
-        excelInfo(inputStream, new_xlsx, new_html, "2");
+        excelInfo(inputStream,new_xlsx,new_html,"2");*/
     }
 
 
@@ -478,11 +477,11 @@ public class FileUtils {
                 CellRange mergedCell = sheet.getCellRange(oldcell.getRow(), oldcell.getColumn());
                 String data = mergedCell.getDataValidation().getErrorMessage();
                 int k = 0;
-                if (Func.isNumeric(data)) {
+                if(Func.isNumeric(data)){
                     k = Func.toInt(data);
                 }
                 if (maxVal < k) {
-                    maxVal = k;
+                        maxVal = k;
                 }
             }
 
@@ -491,25 +490,24 @@ public class FileUtils {
                 CellRange oldcell = mergedCells[i];
                 CellRange mergedCell = sheet.getCellRange(oldcell.getRow(), oldcell.getColumn());
                 String data = mergedCell.getDataValidation().getErrorMessage();
-                System.out.println(mergedCell.getValue() + "---" + data);
                 if (StringUtils.isEmpty(data)) {
-                    if (maxVal <= 0) {
+                    if(maxVal<=0){
                         j = j + 1;
-                    } else {
-                        maxVal = maxVal + 1;
-                        j = maxVal;
+                    }else{
+                        maxVal = maxVal+1;
+                        j=maxVal;
                     }
                 } else {
-                    if (Func.isNumeric(data)) {
+                    if(Func.isNumeric(data)){
                         j = Func.toInt(data);
-                    } else {
+                    }else {
                         j = Func.toInt((data.trim().replaceAll("\r|\n", "")).split(":")[1] + "");
                     }
                 }
                 // 目标表添加备注信息
-                sheet2.getCellRange(oldcell.getRow(), oldcell.getColumn()).getDataValidation().setErrorMessage(j + "");
-                mergedCell.getDataValidation().setErrorMessage(j + "");
-                mergedCell.setValue(j + "");
+                sheet2.getCellRange(oldcell.getRow(), oldcell.getColumn()).getDataValidation().setErrorMessage(j+"");
+                mergedCell.getDataValidation().setErrorMessage(j+"");
+                mergedCell.setText(j + "");
                 dataMap.put("x1", mergedCell.getRow());
                 dataMap.put("x2", mergedCell.getLastRow());
                 dataMap.put("y1", mergedCell.getColumn());
@@ -524,22 +522,22 @@ public class FileUtils {
                 String data = mergedCell.getDataValidation().getErrorMessage();
                 Map<String, Integer> dataMap = new HashMap<>();
                 if (StringUtils.isEmpty(data)) {
-                    if (maxVal <= 0) {
+                    if(maxVal<=0){
                         j = j + 1;
-                    } else {
-                        maxVal = maxVal + 1;
-                        j = maxVal;
+                    }else{
+                        maxVal = maxVal+1;
+                        j=maxVal;
                     }
                 } else {
-                    if (Func.isNumeric(data)) {
+                    if(Func.isNumeric(data)){
                         j = Func.toInt(data);
-                    } else {
+                    }else {
                         j = Func.toInt((data.trim().replaceAll("\r|\n", "")).split(":")[1] + "");
                     }
                 }
-                sheet2.getCellRange(oldcell.getRow(), oldcell.getColumn()).getDataValidation().setErrorMessage(j + "");
+                sheet2.getCellRange(oldcell.getRow(), oldcell.getColumn()).getDataValidation().setErrorMessage(j+"");
                 oldcell.getComment().getRichText().setText(j + "");
-                mergedCell.setValue(j + "");
+                mergedCell.setText(j + "");
                 dataMap.put("x1", mergedCell.getRow());
                 dataMap.put("x2", mergedCell.getLastRow());
                 dataMap.put("y1", mergedCell.getColumn());
@@ -571,9 +569,11 @@ public class FileUtils {
                 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) {
+                    /*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);
@@ -582,7 +582,7 @@ public class FileUtils {
                         cell1.attr("x2", xyMap.get("x2") + "");
                         cell1.attr("y1", xyMap.get("y1") + "");
                         cell1.attr("y2", xyMap.get("y2") + "");
-                        cell1.attr("exceVal", html);
+                        cell1.attr("exceVal",html);
                     }
                 }
             }
@@ -590,7 +590,7 @@ public class FileUtils {
             File writeFile = new File(htmlUrl);
             FileUtil.writeToFile(writeFile, doc1.html(), Boolean.parseBoolean("UTF-8"));
             if (html2.exists()) {
-                html2.delete();
+               // html2.delete();
             }
             fileInputStream.close();
             wb2.dispose();