huangtf пре 1 година
родитељ
комит
1dc03bfe14
33 измењених фајлова са 802 додато и 125 уклоњено
  1. 103 10
      blade-common/src/main/java/org/springblade/common/utils/BaseUtils.java
  2. 14 7
      blade-service-api/blade-archive-api/src/main/java/org/springblade/archive/entity/ArchiveExpertConclusion.java
  3. 1 1
      blade-service-api/blade-archive-api/src/main/java/org/springblade/archive/entity/ArchiveExpertScore.java
  4. 7 0
      blade-service-api/blade-business-api/src/main/java/org/springblade/business/feign/TaskClient.java
  5. 4 0
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/dto/ElementData.java
  6. 0 3
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/feign/FormulaClient.java
  7. 1 1
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/EvaSummary.java
  8. 33 3
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/FB02.java
  9. 40 0
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/InterimPaymentCertificate.java
  10. 30 0
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/MeterType.java
  11. 110 0
      blade-service/blade-archive/src/main/java/org/springblade/archive/controller/ArchiveExpertConclusionController.java
  12. 54 0
      blade-service/blade-archive/src/main/java/org/springblade/archive/controller/ArchiveExpertScoreController.java
  13. 4 2
      blade-service/blade-archive/src/main/java/org/springblade/archive/controller/ArchivesAutoController.java
  14. 13 0
      blade-service/blade-archive/src/main/java/org/springblade/archive/service/IArchiveExpertConclusionService.java
  15. 1 0
      blade-service/blade-archive/src/main/java/org/springblade/archive/service/IArchiveExpertScoreService.java
  16. 2 0
      blade-service/blade-archive/src/main/java/org/springblade/archive/service/IArchivesAutoService.java
  17. 127 3
      blade-service/blade-archive/src/main/java/org/springblade/archive/service/impl/ArchiveExpertConclusionServiceImpl.java
  18. 17 5
      blade-service/blade-archive/src/main/java/org/springblade/archive/service/impl/ArchiveExpertScoreServiceImpl.java
  19. 40 5
      blade-service/blade-archive/src/main/java/org/springblade/archive/service/impl/ArchivesAutoServiceImpl.java
  20. 11 12
      blade-service/blade-business/src/main/java/org/springblade/business/controller/InformationWriteQueryController.java
  21. 13 0
      blade-service/blade-business/src/main/java/org/springblade/business/feignClient/TaskClientImpl.java
  22. 8 5
      blade-service/blade-manager/src/main/java/com/mixsmart/utils/CustomFunction.java
  23. 33 4
      blade-service/blade-manager/src/main/java/com/mixsmart/utils/FormulaUtils.java
  24. 24 7
      blade-service/blade-manager/src/main/java/org/springblade/manager/formula/impl/ExecutorInit.java
  25. 51 10
      blade-service/blade-manager/src/main/java/org/springblade/manager/formula/impl/ExecutorSpecial.java
  26. 4 1
      blade-service/blade-manager/src/main/java/org/springblade/manager/formula/impl/TableElementConverter.java
  27. 8 19
      blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/ArchiveTreeContractMapper.xml
  28. 12 2
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ArchiveTreeContractServiceImpl.java
  29. 19 7
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/FormulaServiceImpl.java
  30. 4 4
      blade-service/blade-meter/src/main/java/org/springblade/meter/controller/TaskController.java
  31. 11 11
      blade-service/blade-user/src/main/java/org/springblade/system/user/controller/UserController.java
  32. 2 2
      blade-service/blade-user/src/main/java/org/springblade/system/user/controller/WbsTreeController.java
  33. 1 1
      blade-service/blade-user/src/main/java/org/springblade/system/user/service/impl/UserServiceImpl.java

+ 103 - 10
blade-common/src/main/java/org/springblade/common/utils/BaseUtils.java

@@ -1,26 +1,20 @@
 package org.springblade.common.utils;
 
-import cn.hutool.core.lang.func.Func;
 import com.alibaba.cloud.commons.lang.StringUtils;
 import org.springblade.common.constant.RegexConstant;
 
 import java.io.*;
-import java.lang.annotation.Annotation;
 import java.math.BigDecimal;
 import java.math.BigInteger;
-import java.net.JarURLConnection;
-import java.net.URL;
+import java.math.RoundingMode;
 import java.security.MessageDigest;
 import java.util.*;
-import java.util.jar.JarEntry;
-import java.util.jar.JarFile;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 import java.util.stream.Collectors;
 import java.util.stream.IntStream;
 
-import static java.math.BigDecimal.ROUND_CEILING;
-import static java.math.BigDecimal.ROUND_HALF_UP;
+import static java.math.BigDecimal.*;
 
 /**
  * @author yangyj
@@ -246,6 +240,7 @@ public class BaseUtils {
         }
     }
 
+
     /**
      * @return java.util.List<java.lang.Object> 不能包含0
      * @Description specifiedRangeList
@@ -275,9 +270,11 @@ public class BaseUtils {
             }
             Random rd = new Random();
             int hzi = new BigDecimal(hz.toString()).multiply(new BigDecimal(passRate.toString())).setScale(0, ROUND_CEILING).intValue();
+            int loop=200;
             for (int i = 0; i < hzi; i++) {
                 BigDecimal tb = new BigDecimal(rd.nextInt(max - min + 1) + min).divide(BigDecimal.valueOf(Math.pow(10, scaleI)), scaleI, ROUND_HALF_UP);
-                if(tb.equals(BigDecimal.ZERO)){
+                if(tb.compareTo(BigDecimal.ZERO)==0&&loop>0){
+                    loop--;
                     i--;
                 }else{
                     if (scaleI > 0) {
@@ -289,6 +286,7 @@ public class BaseUtils {
             }
             int total = handleObj2Integer(hz);
             if (total - hzi > 0) {
+                loop=200;
                 for (int k = 0; k < total - hzi; k++) {
                     BigDecimal tb;
                     if (rd.nextBoolean()) {
@@ -296,7 +294,8 @@ public class BaseUtils {
                     } else {
                         tb = new BigDecimal(min - 1 - rd.nextInt(((max - min) / 2))).divide(BigDecimal.valueOf(Math.pow(10, scaleI)), scaleI, ROUND_HALF_UP);
                     }
-                    if(tb.equals(BigDecimal.ZERO)){
+                    if(tb.compareTo(BigDecimal.ZERO)==0&&loop>0){
+                        loop--;
                         k--;
                     }else {
                         if (scaleI > 0) {
@@ -348,6 +347,100 @@ public class BaseUtils {
         }
         return false;
     }
+    public static Integer getScale(Object... number) {
+        int max = 0;
+        if (number != null) {
+            return getScale(scaleParam(number),1);
+        }
+        return max;
+    }
+    /**保留有效数字后面的0*/
+    public static Integer getScaleZero(Object... number){
+        int max = 0;
+        if (number != null) {
+            return getScale(scaleParam(number),0);
+        }
+        return max;
+    }
+
+    public static boolean containsZH(Object chars) {
+        Matcher m = Pattern.compile("[\u4e00-\u9fa5]").matcher(handleNull(chars));
+        return m.find();
+    }
+
+/*    public static void main(String[] args) {
+        System.out.println(getScaleZero(152000,"±10.0"));
+        System.out.println(getScaleZero(152000,"-10.0,10"));
+        System.out.println(getScaleZero(152000,"-10.0,10.0"));
+        System.out.println(getScaleZero(Double.MAX_VALUE,"-10.0,10"));
+        System.out.println(getScaleZero(152000,"-10,10"));
+    }*/
+public static List<Object> obj2List(Object obj) {
+    List<Object> result = new ArrayList<>();
+    if (obj != null) {
+        List<Object> datas = new ArrayList<>();
+        if (obj instanceof List) {
+            datas = (List<Object>) obj;
+        } else {
+            datas.add(obj);
+        }
+        if (isNotEmpty(datas)) {
+            for (Object e : datas) {
+                boolean fi = isNotEmpty(e) && !containsZH(e.toString()) && (e.toString().contains("、") || e.toString().contains(",") || e.toString().contains(" ") || e.toString().contains(","));
+                if (fi) {
+                    String s = e.toString().trim();
+                    if (s.contains(" ")) {
+                        s = s.replaceAll("\\s+", "、");
+                    }
+                    Object[] bs = s.split("[、,,]");
+                    result.addAll(Arrays.asList(bs));
+                } else {
+                    result.add(e);
+                }
+            }
+        }
+    }
+    return result;
+}
+    public static List<Object> obj2ListNe(Object obj) {
+        List<Object> list = obj2List(obj);
+        return list.parallelStream().filter(BaseUtils::isNotEmpty).collect(Collectors.toList());
+    }
+    public static List<Object> scaleParam(Object ... number){
+        return Arrays.stream(number).filter(BaseUtils::isNotEmpty).flatMap(e-> BaseUtils.obj2ListNe(e).stream()).distinct().map(s->s.toString().replaceAll("±","")).filter(BaseUtils::isNumber).map(e->{
+            /*0.3999999999999986 检测到超长小数位先转double处理,再还原回String*/
+            String tg=e.toString();
+            int dot=tg.indexOf(".");
+            boolean unlimited=dot>0&&(tg.length()-dot>6);
+            if(unlimited||tg.contains("e")){
+                return BigDecimal.valueOf(Double.parseDouble(tg)).setScale(2, RoundingMode.HALF_UP).toString();
+            }else {
+                return e;
+            }
+        }).collect(Collectors.toList());
+    }
+
+    public static final String[] SCALE_REG=new String[]{"(\\d)+.(\\d)*[0-9]","(\\d)+.(\\d)*[1-9]"};
+    private static Integer getScale(List<Object> number,Integer zero){
+        int max=0;
+        if(isNotEmpty(number)){
+            for (Object n : number) {
+                if (isNotEmpty(n)) {
+                    String[] sa = n.toString().split(",");
+                    for (String s : sa) {
+                        Matcher m = Pattern.compile(SCALE_REG[zero]).matcher(s);
+                        if (m.find()) {
+                            int cp = new StringBuilder(m.group()).reverse().toString().indexOf(".");
+                            if (cp < 5) {
+                                max = Math.max(cp, max);
+                            }
+                        }
+                    }
+                }
+            }
+        }
+        return max;
+    }
 
 
 }

+ 14 - 7
blade-service-api/blade-archive-api/src/main/java/org/springblade/archive/entity/ArchiveExpertConclusion.java

@@ -23,6 +23,7 @@ import lombok.EqualsAndHashCode;
 import org.springblade.core.mp.base.BaseEntity;
 
 import java.math.BigDecimal;
+import java.time.LocalDate;
 
 /**
  * 档案专家结论实体类
@@ -41,27 +42,33 @@ public class ArchiveExpertConclusion extends BaseEntity {
     private Long projectId;
 
     @ApiModelProperty("申请验收的pdf地址")
-    private String app_url;
+    private String appUrl;
 
     @ApiModelProperty("结论报表的pdf地址")
-    private String table_url;
+    private String tableUrl;
+
+    @ApiModelProperty("结论标题")
+    private String tableTitle;
 
     @ApiModelProperty("是否生成打分表:0否1是")
-    private Integer is_build_score;
+    private Integer isBuildScore;
 
     @ApiModelProperty("前言")
     private String foreword;
 
     @ApiModelProperty("项目概况")
-    private String general_situation;
+    private String generalSituation;
 
     @ApiModelProperty("管理情况")
-    private String admin_condition;
+    private String adminCondition;
 
     @ApiModelProperty("存在问题及建议")
-    private String question_suggest;
+    private String questionSuggest;
+
+    @ApiModelProperty("审批状态,0未上报,1待审批,2已审批,3已废除")
+    private Integer approveStatus;
 
     @ApiModelProperty("审批状态,0未上报,1待审批,2已审批,3已废除")
-    private Integer approve_status;
+    private LocalDate approveDate;
 
 }

+ 1 - 1
blade-service-api/blade-archive-api/src/main/java/org/springblade/archive/entity/ArchiveExpertScore.java

@@ -42,7 +42,7 @@ public class ArchiveExpertScore extends BaseEntity {
     @ApiModelProperty("项目id")
     private Long projectId;
 
-    @ApiModelProperty("单位类型:1施工2监理3业主")
+    @ApiModelProperty("单位类型:1业主2监理3施工")
     private Integer unitType;
 
     @ApiModelProperty("评分项")

+ 7 - 0
blade-service-api/blade-business-api/src/main/java/org/springblade/business/feign/TaskClient.java

@@ -37,6 +37,13 @@ public interface TaskClient {
     String QUERY_USER_TASK = API_PREFIX + "/query-user-task";
     String DELETE_USER_TASK = API_PREFIX + "/delete-user-task";
     String BATCH_RE_SIGN = API_PREFIX + "/re-sign";
+    String ARCHIVE_APP_COUNT = API_PREFIX + "/archive-app-count";
+
+    /**
+     * 获取档案验收申请数量
+     */
+    @GetMapping(ARCHIVE_APP_COUNT)
+    Boolean getArchiveAppCount(@RequestParam Long projectId);
     /**
      * 保存任务
      */

+ 4 - 0
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/dto/ElementData.java

@@ -73,6 +73,10 @@ public class ElementData implements Serializable {
     public ElementData() {
     }
 
+    public ElementData(Object value) {
+        this.value = value;
+    }
+
     public ElementData(Integer index, Integer groupId, Object value) {
         this.index = index;
         this.groupId = groupId;

+ 0 - 3
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/feign/FormulaClient.java

@@ -1,6 +1,5 @@
 package org.springblade.manager.feign;
 
-import org.springblade.manager.dto.FormData;
 import org.springblade.manager.entity.FormulaOption;
 import org.springframework.cloud.openfeign.FeignClient;
 import org.springframework.web.bind.annotation.GetMapping;
@@ -9,7 +8,6 @@ import org.springframework.web.bind.annotation.RequestParam;
 
 import javax.validation.constraints.NotNull;
 import java.io.FileNotFoundException;
-import java.util.List;
 
 import static org.springblade.core.launch.constant.AppConstant.APPLICATION_NAME_PREFIX;
 
@@ -32,5 +30,4 @@ public interface FormulaClient {
     @GetMapping(API_PREFIX + "option")
     FormulaOption option(@RequestParam @NotNull Long pkeyId);
 
-
 }

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

@@ -82,7 +82,7 @@ public abstract class EvaSummary<T> {
                 Coords c = fd.getCoordsList().get(i);
                 list.add(new ElementData(pn, 0, data.get(i), c.getX(), c.getY()));
             }
-            fd.getValues().addAll(list);
+            fd.setValues(list);
             return recovery(list);
         }
         return StringPool.EMPTY;

+ 33 - 3
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/FB02.java

@@ -3,15 +3,19 @@ package org.springblade.manager.vo;
 import com.alibaba.fastjson.JSON;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
+import org.springblade.core.tool.utils.Func;
 import org.springblade.manager.dto.FormData;
 import org.springblade.manager.entity.FormulaDataBlock;
 
 import java.math.BigDecimal;
 import java.math.RoundingMode;
 import java.util.*;
+import java.util.regex.Pattern;
 import java.util.stream.Collectors;
 import java.util.stream.IntStream;
 
+import static java.util.regex.Pattern.compile;
+
 /**
  * @author yangyj
  * @Date 2023/11/1 17:24
@@ -25,10 +29,12 @@ public class FB02 extends EvaSummary<Item02>{
     private FormData name;
     private FormData passRate;
     private FormData weight;
+    /**加权平均分*/
+    private FormData wAvg;
   @Override
     public Integer getPageNum(){
         if(this.name!=null){
-          return  (this.getDatas().size()/this.name.getCoordsList().size())+1;
+          return  (int)Math.ceil(this.getDatas().size()/(double)this.name.getCoordsList().size());
         }
         return null;
     }
@@ -51,14 +57,22 @@ public class FB02 extends EvaSummary<Item02>{
               }else if(fd.getEName().trim().equals("权值")){
                   this.weight=fd;
                   this.fm.put(fd.getCode(),(List<Item02> l,Integer pn)->l.stream().map(Item02::getWeight).collect(Collectors.toList()));
+              }else if(fd.getEName().trim().contains("得分")&&fd.getEName().trim().contains("权值")){
+                  this.wAvg=fd;
+                  this.fm.put(fd.getCode(),(List<Item02> l,Integer pn)-> Collections.singletonList(l.stream()
+                          .mapToDouble(item -> item.getPassRate() * item.getWeight())
+                          .sum() / l.stream()
+                          .mapToInt(Item02::getWeight)
+                          .sum()));
               }
-              if(this.subItem!=null&&this.name!=null&&this.passRate!=null&&this.weight!=null&&this.sn!=null){
+              if(this.subItem!=null&&this.name!=null&&this.passRate!=null&&this.weight!=null&&this.sn!=null&&this.wAvg!=null){
                   /*匹配完成*/
                   this.fds.add(this.subItem);
                   this.fds.add(this.sn);
                   this.fds.add(this.name);
                   this.fds.add(this.passRate);
                   this.fds.add(this.weight);
+                  this.fds.add(this.wAvg);
                   break;
               }
          }
@@ -70,7 +84,7 @@ public class FB02 extends EvaSummary<Item02>{
             elementBlockList.forEach(eb -> {
                 String name = eb.getEName();
                 Item02 xm = new Item02();
-                xm.setName(name);
+                xm.setName(checkItemName(name));
                 xm.setSubItem(swNameMap.get(fdb.getSwId().toString()));
                 List<ItemBlock> ib = eb.getList();
                 int total = ib.stream().mapToInt(ItemBlock::getSubTotal).sum();
@@ -88,5 +102,21 @@ public class FB02 extends EvaSummary<Item02>{
         });
     }
 
+    public static  String checkItemName(String eName){
+        if (Func.isEmpty(eName)) {
+            return eName;
+        }
+        /*分割字符串,选取第一个匹配的子串*/
+        String str = eName.replaceAll("\\s", "");
+        Pattern pattern = compile("[((][^\\u4e00-\\u9fa5]+[))]|_+");
+        String[] candidate = pattern.split(str);
+        String regex = "[^\\u4e00-\\u9fa5]+";
+        return Arrays.stream(candidate).map(s->s.replaceAll(regex,"")).distinct().filter(Func::isNotEmpty).filter(s->!isContainKeywords2(s)).findFirst().orElse("");
+    }
+
+    private static boolean isContainKeywords2(String s) {
+        List<String> keywords = Arrays.asList( "实测项目");
+        return keywords.stream().anyMatch(s::contains);
+    }
 
 }

+ 40 - 0
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/InterimPaymentCertificate.java

@@ -0,0 +1,40 @@
+package org.springblade.manager.vo;
+
+import com.alibaba.fastjson.annotation.JSONField;
+import lombok.Data;
+
+/**
+ * @author yangyj
+ * @Date 2024/1/8 15:46
+ * @description 中期支付证书
+ */
+@Data
+public class InterimPaymentCertificate {
+    public static final String ID="20210000000";
+    public static final String TBN="IPayCert";
+    public static final String TBN_CH="中期支付证书";
+    /**项目名称*/
+    @JSONField(name = "key_1",label="项目名称",ordinal = 1)
+    private String itemName;
+    /**合同金额*/
+    @JSONField(name = "key_2",label="合同金额",ordinal = 2)
+    private String contractAmount;
+    /**变更后的金额*/
+    @JSONField(name = "key_3",label="变更后的金额",ordinal = 3)
+    private String revisedAmount;
+    /**本期末支付金额*/
+    @JSONField(name = "key_4",label="本期末支付金额",ordinal = 4)
+    private String currentPeriodEndPay;
+    /**上期末支付金额*/
+    @JSONField(name = "key_5",label="上期末支付金额",ordinal = 5)
+    private String previousPeriodEndPay;
+    /**本期支付金额*/
+    @JSONField(name = "key_6",label="本期支付金额",ordinal = 6)
+    private String currentPeriodPay;
+    /**支付比例*/
+    @JSONField(name = "key_7",label="支付比例",ordinal = 7)
+    private String payRatio;
+    /**备注*/
+    @JSONField(name = "key_8",label="备注",ordinal = 8)
+    private String remark;
+}

+ 30 - 0
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/MeterType.java

@@ -0,0 +1,30 @@
+package org.springblade.manager.vo;
+
+public enum MeterType {
+    /**中间计量*/
+    INTERIM(0,"计量报表"),
+    /**材料预付款*/
+    MATERIAL(1,"材料预付款报表"),
+    /**开工预付款*/
+    START(2,"动员预付款报表");
+    private final int index;
+    private final String name;
+    MeterType(int index, String name) {
+        this.index = index;
+        this.name = name;
+    }
+    public int getIndex() {
+        return index;
+    }
+    public String getName() {
+        return name;
+    }
+    public static MeterType getByIndex(int index) {
+        MeterType[] values = MeterType.values();
+        if (index >= 0 && index < values.length) {
+            return values[index];
+        } else {
+           return values[0];
+        }
+    }
+}

+ 110 - 0
blade-service/blade-archive/src/main/java/org/springblade/archive/controller/ArchiveExpertConclusionController.java

@@ -0,0 +1,110 @@
+package org.springblade.archive.controller;
+
+import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
+import lombok.AllArgsConstructor;
+import org.springblade.archive.entity.ArchiveConclusion;
+import org.springblade.archive.entity.ArchiveExpertConclusion;
+import org.springblade.archive.service.IArchiveExpertConclusionService;
+import org.springblade.core.boot.ctrl.BladeController;
+import org.springblade.core.tool.api.R;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
+
+/**
+ *
+ */
+@RestController
+@AllArgsConstructor
+@RequestMapping("/archiveExpertConclusion")
+@Api(value = "专家结论", tags = "专家结论")
+public class ArchiveExpertConclusionController extends BladeController {
+
+    private final IArchiveExpertConclusionService conclusionService;
+
+    /**
+     * 验收申请-历史验收报告
+     */
+    @GetMapping("/getHistoryTable")
+    @ApiOperationSupport(order = 1)
+    @ApiOperation(value = "验收申请-历史验收报告", notes = "传入当前项目id,返回报告数组")
+    @ApiImplicitParams(value = {
+            @ApiImplicitParam(name = "projectId", value = "项目id", required = true)
+    })
+    public R<List<ArchiveExpertConclusion>> getHistoryTable(@RequestParam Long projectId) {
+        return R.data(conclusionService.getHistoryTable(projectId));
+    }
+
+    /**
+     * 验收申请-申请验收状态
+     */
+    @GetMapping("/getAppStatus")
+    @ApiOperationSupport(order = 3)
+    @ApiOperation(value = "验收申请-申请验收状态", notes = "传入当前项目id,true显示false屏蔽")
+    @ApiImplicitParams(value = {
+            @ApiImplicitParam(name = "projectId", value = "项目id", required = true)
+    })
+    public R<Boolean> getAppStatus(@RequestParam Long projectId) {
+        return R.data(conclusionService.getAppStatus(projectId));
+    }
+
+    /**
+     * 在线验收-预览
+     */
+    @GetMapping("/getAppPreview")
+    @ApiOperationSupport(order = 4)
+    @ApiOperation(value = "在线验收-预览", notes = "传入当前项目id,返回当前期的档案验收URL地址")
+    @ApiImplicitParams(value = {
+            @ApiImplicitParam(name = "projectId", value = "项目id", required = true)
+    })
+    public R getAppPreview(@RequestParam Long projectId) {
+        return R.data(conclusionService.getAppPreview(projectId));
+    }
+    /**
+     * 在线验收-查看验收报告
+     */
+    @GetMapping("/getTable")
+    @ApiOperationSupport(order = 5)
+    @ApiOperation(value = "在线验收-查看验收报告", notes = "传入当前项目id,返回当期验收报告URL地址")
+    @ApiImplicitParams(value = {
+            @ApiImplicitParam(name = "projectId", value = "项目id", required = true)
+    })
+    public R getTable(@RequestParam Long projectId) {
+        return R.data(conclusionService.getTable(projectId));
+    }
+
+    /**
+     * 编写结论-是否生成打分表
+     */
+    @GetMapping("/creatScore")
+    @ApiOperationSupport(order = 1)
+    @ApiOperation(value = "验收申请-是否生成打分表", notes = "传入当前项目id,返回1选择0不选择")
+    @ApiImplicitParams(value = {
+            @ApiImplicitParam(name = "projectId", value = "项目id", required = true)
+    })
+    public R creatScore(@RequestParam Long projectId) {
+        return R.data(conclusionService.creatScore(projectId));
+    }
+
+    /**
+     * 编写结论-修改是否生成打分表
+     */
+    @GetMapping("/updateScore")
+    @ApiOperationSupport(order = 1)
+    @ApiOperation(value = "验收申请-修改是否生成打分表", notes = "传入当前项目id,传入1选择0不选择")
+    @ApiImplicitParams(value = {
+            @ApiImplicitParam(name = "projectId", value = "项目id", required = true),
+            @ApiImplicitParam(name = "isSelect", value = "1选择0不选择", required = true)
+    })
+    public R creatScore(@RequestParam Long projectId,Integer isSelect) {
+        conclusionService.updateScore(projectId,isSelect);
+        return R.data("修改成功");
+    }
+}

+ 54 - 0
blade-service/blade-archive/src/main/java/org/springblade/archive/controller/ArchiveExpertScoreController.java

@@ -0,0 +1,54 @@
+package org.springblade.archive.controller;
+
+import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
+import lombok.AllArgsConstructor;
+import org.springblade.archive.entity.ArchiveExpertConclusion;
+import org.springblade.archive.entity.ArchiveExpertScore;
+import org.springblade.archive.service.IArchiveExpertScoreService;
+import org.springblade.core.boot.ctrl.BladeController;
+import org.springblade.core.tool.api.R;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+/**
+ *
+ */
+@RestController
+@AllArgsConstructor
+@RequestMapping("/archiveExpertScore")
+@Api(value = "专家评分", tags = "专家评分")
+public class ArchiveExpertScoreController extends BladeController {
+
+    private final IArchiveExpertScoreService scoreService;
+
+    /**
+     * 专家评分-根据单位获取打分项
+     */
+    @GetMapping("/getItemByUnit")
+    @ApiOperationSupport(order = 1)
+    @ApiOperation(value = "专家评分-根据单位获取打分项", notes = "专家评分-根据单位获取打分项")
+    @ApiImplicitParams(value = {
+            @ApiImplicitParam(name = "projectId", value = "项目id", required = true),
+            @ApiImplicitParam(name = "unitType", value = "单位类型:1业主2监理3施工", required = true)
+    })
+    public R<List<ArchiveExpertScore>> getItemByUnit(@RequestParam Long projectId,Integer unitType) {
+        return R.data(scoreService.getItemByUnit(projectId,unitType));
+    }
+
+    /**
+     * 专家评分-编辑
+     */
+    @PostMapping("/update")
+    @ApiOperationSupport(order = 1)
+    @ApiOperation(value = "专家评分-编辑", notes = "专家评分-编辑,传入当前行")
+    public R update(@RequestBody ArchiveExpertScore score) {
+        scoreService.updateById(score);
+        return R.data("修改成功");
+    }
+
+}

+ 4 - 2
blade-service/blade-archive/src/main/java/org/springblade/archive/controller/ArchivesAutoController.java

@@ -711,8 +711,8 @@ public class ArchivesAutoController extends BladeController {
 	@ApiImplicitParams(value = {
 			@ApiImplicitParam(name = "projectId", value = "项目id", required = true)
 	})
-	public R<Boolean> getApplyStatus(@RequestParam Long projectId) {
-		return R.data(archivesAutoService.getApplyStatus(projectId));
+	public R<Map<String,Boolean>> getApplyStatus(@RequestParam Long projectId) {
+		return R.data(archivesAutoService.getApplyStatus2(projectId));
 	}
 
 	/**
@@ -924,4 +924,6 @@ public class ArchivesAutoController extends BladeController {
 
 
 
+
+
 }

+ 13 - 0
blade-service/blade-archive/src/main/java/org/springblade/archive/service/IArchiveExpertConclusionService.java

@@ -5,6 +5,8 @@ import org.springblade.archive.entity.ArchiveExpertScore;
 import org.springblade.core.mp.base.BaseService;
 import org.springblade.core.tool.api.R;
 
+import java.util.List;
+
 
 public interface IArchiveExpertConclusionService extends BaseService<ArchiveExpertConclusion> {
 
@@ -12,4 +14,15 @@ public interface IArchiveExpertConclusionService extends BaseService<ArchiveExpe
     //验收申请审批通过,创建当前报表基本信息
     R saveBaseTableInfo(Long projectId,String appUrl);
 
+    Boolean getAppStatus(Long projectId);
+
+    List<ArchiveExpertConclusion> getHistoryTable(Long projectId);
+
+    String getAppPreview(Long projectId);
+
+    String getTable(Long projectId);
+
+    Integer creatScore(Long projectId);
+
+    void updateScore(Long projectId, Integer isSelect);
 }

+ 1 - 0
blade-service/blade-archive/src/main/java/org/springblade/archive/service/IArchiveExpertScoreService.java

@@ -12,4 +12,5 @@ public interface IArchiveExpertScoreService extends BaseService<ArchiveExpertSco
     // 审批成功,保存基础评分信息
     void saveBaseScoreInfo(Long projectId);
 
+    List<ArchiveExpertScore> getItemByUnit(Long projectId, Integer unitType);
 }

+ 2 - 0
blade-service/blade-archive/src/main/java/org/springblade/archive/service/IArchivesAutoService.java

@@ -122,6 +122,8 @@ public interface IArchivesAutoService extends BaseService<ArchivesAuto> {
 
 	Boolean getApplyStatus(Long projectId);
 
+	Map<String,Boolean> getApplyStatus2(Long projectId);
+
 	void annulApply(Long projectId);
 
 	IPage<ArchiveInspectVO> getNodeArchives(Query query,Long nodeId, Long projectId,Integer searchType,String searchValue,Integer type);

+ 127 - 3
blade-service/blade-archive/src/main/java/org/springblade/archive/service/impl/ArchiveExpertConclusionServiceImpl.java

@@ -1,38 +1,162 @@
 package org.springblade.archive.service.impl;
 
 
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import lombok.AllArgsConstructor;
+import org.apache.commons.lang.StringUtils;
 import org.springblade.archive.entity.ArchiveExpertConclusion;
 import org.springblade.archive.entity.ArchiveExpertScore;
 import org.springblade.archive.mapper.ArchiveExpertConclusionMapper;
 import org.springblade.archive.mapper.ArchiveExpertScoreMapper;
 import org.springblade.archive.service.IArchiveExpertConclusionService;
 import org.springblade.archive.service.IArchiveExpertScoreService;
+import org.springblade.core.log.exception.ServiceException;
 import org.springblade.core.mp.base.BaseServiceImpl;
 import org.springblade.core.tool.api.R;
+import org.springblade.manager.entity.ProjectInfo;
+import org.springblade.manager.feign.ProjectClient;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
+import java.util.List;
+
 @Service
 @AllArgsConstructor
 public class ArchiveExpertConclusionServiceImpl extends BaseServiceImpl<ArchiveExpertConclusionMapper, ArchiveExpertConclusion> implements IArchiveExpertConclusionService {
 
     private final IArchiveExpertScoreService scoreService;
 
+    private final ProjectClient projectClient;
+
     @Override
     @Transactional
     public R saveBaseTableInfo(Long projectId, String appUrl) {
         //保存表单基础信息
         ArchiveExpertConclusion conclusion = new ArchiveExpertConclusion();
         conclusion.setProjectId(projectId);
-        conclusion.setApp_url(appUrl);
-        conclusion.setIs_build_score(0);
+        conclusion.setAppUrl(appUrl);
+        conclusion.setIsBuildScore(0);
         conclusion.setStatus(1);
-        conclusion.setApprove_status(0);
+        conclusion.setApproveStatus(0);
+        ProjectInfo info = projectClient.getById(projectId + "");
+        if (info == null){
+            return R.fail("获取项目信息失败");
+        }
+        conclusion.setTableTitle(info.getProjectName()+"项目档案验收报告");
         this.save(conclusion);
         //保存评分基础信息
         scoreService.saveBaseScoreInfo(projectId);
         return R.data("保存成功");
     }
+
+    /**
+     * 获取申请状态
+     * @param projectId
+     * @return
+     */
+    @Override
+    public Boolean getAppStatus(Long projectId) {
+        //获取最新的最新的一期验收
+        ArchiveExpertConclusion one = this.getOne(new LambdaUpdateWrapper<ArchiveExpertConclusion>()
+                .eq(ArchiveExpertConclusion::getProjectId, projectId)
+                .orderByDesc(ArchiveExpertConclusion::getCreateTime)
+                .last("limit 1"));
+        //如果为空代表没有申请过,返回true
+        if (one == null || one.getStatus() == 2){
+            return true;
+        }
+        return false;
+    }
+
+    /**
+     * 验收申请-历史验收报告
+     * @param projectId
+     * @return
+     */
+    @Override
+    public List<ArchiveExpertConclusion> getHistoryTable(Long projectId) {
+        List<ArchiveExpertConclusion> list = this.list(new LambdaQueryWrapper<ArchiveExpertConclusion>()
+                .eq(ArchiveExpertConclusion::getProjectId, projectId)
+                .eq(ArchiveExpertConclusion::getStatus, 2)
+                .orderByDesc(ArchiveExpertConclusion::getApproveDate));
+        if (list.size() == 0){
+            throw new ServiceException("暂无历史验收报告");
+        }
+        return list;
+    }
+
+
+    /**
+     * 在线验收-预览
+     */
+    @Override
+    public String getAppPreview(Long projectId) {
+        //获取最新的最新的一期验收
+        ArchiveExpertConclusion one = this.getOne(new LambdaUpdateWrapper<ArchiveExpertConclusion>()
+                .eq(ArchiveExpertConclusion::getProjectId, projectId)
+                .orderByDesc(ArchiveExpertConclusion::getCreateTime)
+                .last("limit 1"));
+        //如果为空代表没有申请过,返回true
+        if (one == null){
+            throw new ServiceException("暂无验收档案信息,请检查是否申请过验收");
+        }
+        return one.getAppUrl();
+    }
+
+    /**
+     * 在线验收-查看验收报告
+     */
+    @Override
+    public String getTable(Long projectId) {
+        //获取最新的最新的一期验收
+        ArchiveExpertConclusion one = this.getOne(new LambdaUpdateWrapper<ArchiveExpertConclusion>()
+                .eq(ArchiveExpertConclusion::getProjectId, projectId)
+                .orderByDesc(ArchiveExpertConclusion::getCreateTime)
+                .last("limit 1"));
+        //如果为空代表没有申请过,返回true
+        if (one == null){
+            throw new ServiceException("暂无验收档案信息,请检查是否申请过验收");
+        }
+        if (StringUtils.isBlank(one.getTableUrl())){
+            throw new ServiceException("当前在线验收还未生成报告");
+        }
+        return one.getTableUrl();
+    }
+
+    /**
+     * 编写结论-是否生成打分表
+     */
+    @Override
+    public Integer creatScore(Long projectId) {
+        //获取最新的最新的一期验收
+        ArchiveExpertConclusion one = this.getOne(new LambdaUpdateWrapper<ArchiveExpertConclusion>()
+                .eq(ArchiveExpertConclusion::getProjectId, projectId)
+                .orderByDesc(ArchiveExpertConclusion::getCreateTime)
+                .last("limit 1"));
+        //如果为空代表没有申请过,返回true
+        if (one == null){
+            return 0;
+        }
+        return one.getIsBuildScore();
+    }
+
+    /**
+     * 编写结论-修改是否生成打分表
+     */
+    @Override
+    public void updateScore(Long projectId, Integer isSelect) {
+        //获取最新的最新的一期验收
+        ArchiveExpertConclusion one = this.getOne(new LambdaUpdateWrapper<ArchiveExpertConclusion>()
+                .eq(ArchiveExpertConclusion::getProjectId, projectId)
+                .orderByDesc(ArchiveExpertConclusion::getCreateTime)
+                .last("limit 1"));
+        //如果为空代表没有申请过,返回true
+        if (one == null){
+            throw new ServiceException("当前没有申请验收信息,无法修改");
+        }
+        one.setIsBuildScore(isSelect);
+        this.updateById(one);
+    }
 }
 

+ 17 - 5
blade-service/blade-archive/src/main/java/org/springblade/archive/service/impl/ArchiveExpertScoreServiceImpl.java

@@ -1,6 +1,7 @@
 package org.springblade.archive.service.impl;
 
 
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import org.springblade.archive.entity.ArchiveExpertScore;
 import org.springblade.archive.entity.ExpertInspection;
 import org.springblade.archive.mapper.ArchiveExpertScoreMapper;
@@ -20,13 +21,24 @@ public class ArchiveExpertScoreServiceImpl extends BaseServiceImpl<ArchiveExpert
     @Override
     public void saveBaseScoreInfo(Long projectId) {
         List<ArchiveExpertScore> list = new ArrayList<>();
-        //施工
-        list.add(new ArchiveExpertScore(projectId,1,"施工评分项1",10,0,10,0));
-        //监理
-        list.add(new ArchiveExpertScore(projectId,1,"监理评分项1",10,0,10,0));
         //业主
-        list.add(new ArchiveExpertScore(projectId,1,"监理评分项1",10,0,10,0));
+        list.add(new ArchiveExpertScore(projectId,1,"业主评分项1",10,0,10,0));
+        //监理
+        list.add(new ArchiveExpertScore(projectId,2,"监理评分项1",10,0,10,0));
+        //施工
+        list.add(new ArchiveExpertScore(projectId,3,"施工评分项1",10,0,10,0));
         this.saveBatch(list);
     }
+
+    /**
+     * 专家评分-根据单位获取打分项
+     */
+    @Override
+    public List<ArchiveExpertScore> getItemByUnit(Long projectId, Integer unitType) {
+        List<ArchiveExpertScore> list = this.list(new LambdaQueryWrapper<ArchiveExpertScore>()
+                .eq(ArchiveExpertScore::getProjectId, projectId)
+                .eq(ArchiveExpertScore::getUnitType, unitType));
+        return list;
+    }
 }
 

+ 40 - 5
blade-service/blade-archive/src/main/java/org/springblade/archive/service/impl/ArchivesAutoServiceImpl.java

@@ -37,10 +37,7 @@ import lombok.AllArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang.StringUtils;
 import org.springblade.archive.dto.SaveApplyDTO;
-import org.springblade.archive.entity.ArchiveConclusion;
-import org.springblade.archive.entity.ArchiveProjectConfig;
-import org.springblade.archive.entity.ArchivesAuto;
-import org.springblade.archive.entity.ExpertInspection;
+import org.springblade.archive.entity.*;
 import org.springblade.archive.mapper.ArchiveConclusionMapper;
 import org.springblade.archive.service.*;
 import org.springblade.archive.utils.ArchiveTreeUtil;
@@ -145,7 +142,7 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
 
 	private final NewIOSSClient newIOSSClient;
 
-
+	private final IArchiveExpertConclusionService expertConclusionService;
 	private final ITraceLogService iTraceLogService;
 
 	//表格高度
@@ -2822,6 +2819,19 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
 		if (aBoolean){
 			throw new ServiceException("当前用户已存在验收任务,请勿重复上报");
 		}
+		//判断当前是否已经存在上报任务
+		Boolean b = taskClient.getArchiveAppCount(dto.getProjectId());
+		if (b == null || b){
+			throw new ServiceException("当前项目已存在上报中的验收任务,请勿重复上报");
+		}
+		//判断上一期是否完成
+		ArchiveExpertConclusion one = expertConclusionService.getOne(new LambdaUpdateWrapper<ArchiveExpertConclusion>()
+				.eq(ArchiveExpertConclusion::getProjectId, dto.getProjectId())
+				.orderByDesc(ArchiveExpertConclusion::getCreateTime)
+				.last("limit 1"));
+		if (one != null && one.getStatus() == 1){
+			throw new ServiceException("上期验收任务还未完成,请勿上报");
+		}
 		//设置任务表信息
 		Task task = new Task();
 		Long id = SnowFlakeUtil.getId();
@@ -2989,6 +2999,7 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
 		return R.data(true);
 	}
 
+
 	@Override
 	public Boolean getApplyStatus(Long projectId) {
 		//查出所有当前用户待审批的验收任务
@@ -3000,6 +3011,30 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
 			return true;
 		}
 	}
+	@Override
+	public Map<String,Boolean> getApplyStatus2(Long projectId) {
+		Map<String,Boolean> map = new HashMap<>();
+		//查出所有当前用户待审批的验收任务
+		Long userId = AuthUtil.getUserId();
+		List<Task> tasks = taskClient.queryUserTask(projectId,2, userId, 1);
+		//显示上报还是撤销
+		if (tasks == null || tasks.size() == 0){
+			map.put("appStatus",false);
+		}else {
+			map.put("appStatus",true);
+		}
+		//控制是否能点击
+		ArchiveExpertConclusion one = expertConclusionService.getOne(new LambdaUpdateWrapper<ArchiveExpertConclusion>()
+				.eq(ArchiveExpertConclusion::getProjectId, projectId)
+				.orderByDesc(ArchiveExpertConclusion::getCreateTime)
+				.last("limit 1"));
+		if (one == null || one.getStatus() == 2){
+			map.put("isShow",true);
+		}else {
+			map.put("isShow",false);
+		}
+		return map;
+	}
 
 	@Override
 	public void annulApply(Long projectId) {

+ 11 - 12
blade-service/blade-business/src/main/java/org/springblade/business/controller/InformationWriteQueryController.java

@@ -1881,7 +1881,7 @@ public class InformationWriteQueryController extends BladeController {
                     if (parent == null) {
                         parent = this.wbsTreeContractClient.getContractWbsTreeByContractIdAndId(wtc.getParentId(), Long.parseLong(wtc.getContractId()));
                     }
-                    /*节点公式*/
+                    /*凡是关联了节点参数公式的元素都不复制数据*/
                     List<Map<String, Object>> paramKey = this.jdbcTemplate.queryForList("select DISTINCT b.e_key ek from m_table_info a  join m_wbs_form_element b on a.id=b.f_id  join m_element_formula_mapping c on b.id = c.element_id where a.tab_en_name='" + tableName + "' and b.is_deleted=0 and c.scope=35 ");
                     if (paramKey.size() > 0) {
                         map.putAll(paramKey.stream().map(m -> m.get("ek").toString()).collect(Collectors.toMap(s -> s, s -> StringPool.NULL)));
@@ -1937,13 +1937,6 @@ public class InformationWriteQueryController extends BladeController {
                         List<String[]> la = Arrays.stream(value.toString().split("☆")).map(s -> s.split("_\\^_")).collect(Collectors.toList());
                         /*全部为一个数的时候不用修改*/
                         if (la.stream().map(a -> a[0]).collect(Collectors.toSet()).size() > 1 || la.size() == 1) {
-/*                            return la.stream().map(a -> {
-                                String v = a[0];
-                                RangeJson best = rjs.stream().min(Comparator.comparingDouble(j -> Double.parseDouble(v) - Double.parseDouble(j.getDesign()))).orElse(rjs.get(0));
-                                int scale = Math.max(new StringBuilder(v).reverse().indexOf("."), 0);
-                                String sv = BaseUtils.rangeList(1, best.getDesign(), best.getDev(), 1, scale, 1).get(0).toString();
-                                return sv + "_^_" + a[1];
-                            }).collect(Collectors.joining());*/
                             List<String> result = new ArrayList<>();
                             for (String[] a : la) {
                                 String v = a[0];
@@ -1966,10 +1959,16 @@ public class InformationWriteQueryController extends BladeController {
         return value;
     }
 
-    public String imitate(String v, List<RangeJson> rjs) {
-        RangeJson best = rjs.stream().min(Comparator.comparingDouble(j -> Double.parseDouble(v) - Double.parseDouble(j.getDesign()))).orElse(rjs.get(0));
-        int scale = Math.max(new StringBuilder(v).reverse().indexOf("."), 0);
-        return BaseUtils.rangeList(1, best.getDesign(), best.getDev(), 1, scale, 1).get(0).toString();
+    public  String imitate(String v, List<RangeJson> rjs) {
+        try {
+            RangeJson best = rjs.stream().min(Comparator.comparingDouble(j -> Double.parseDouble(v) - Double.parseDouble(j.getDesign()))).orElse(rjs.get(0));
+           // int scale = Math.max(new StringBuilder(v).reverse().indexOf("."), 0);
+            int scale=BaseUtils.getScaleZero(v,best.getDev(),best.getDesign());
+            return BaseUtils.rangeList(1, best.getDesign(), best.getDev(), 1, scale, 1).get(0).toString();
+        }catch (Exception e){
+            e.printStackTrace();
+            return StringPool.EMPTY;
+        }
     }
 
     /*元素情况,表字段,表单流水号,数据库表名*/

+ 13 - 0
blade-service/blade-business/src/main/java/org/springblade/business/feignClient/TaskClientImpl.java

@@ -34,6 +34,19 @@ public class TaskClientImpl implements TaskClient {
 
     private final ITaskParallelService taskParallelService;
 
+    @Override
+    public Boolean getArchiveAppCount(Long projectId) {
+        List<Task> list = taskService.list(new LambdaQueryWrapper<Task>()
+                .eq(Task::getProjectId, projectId)
+                .eq(Task::getType, 2)
+                .eq(Task::getStatus, 1));
+        if (list.size() > 0){
+            return true;
+        }else {
+            return false;
+        }
+    }
+
     @Override
     public void saveTask(Task task) {
         taskService.save(task);

+ 8 - 5
blade-service/blade-manager/src/main/java/com/mixsmart/utils/CustomFunction.java

@@ -10,6 +10,7 @@ import com.jfireel.expression.node.impl.StaticObjectMethodNode;
 import com.jfireel.expression.node.impl.VariableNode;
 import com.jfireel.expression.token.Token;
 import org.apache.commons.collections4.MapUtils;
+import org.springblade.common.utils.BaseUtils;
 import org.springblade.core.tool.utils.*;
 import org.springblade.manager.dto.ParamElements;
 
@@ -1738,9 +1739,11 @@ public class CustomFunction {
             }
             Random rd = new Random();
             int hzi = new BigDecimal(hz.toString()).multiply(new BigDecimal(passRate.toString())).setScale(0, ROUND_CEILING).intValue();
+            int loop=200;
             for (int i = 0; i < hzi; i++) {
                 BigDecimal tb = new BigDecimal(rd.nextInt(max - min + 1) + min).divide(BigDecimal.valueOf(Math.pow(10, scaleI)), scaleI, ROUND_HALF_UP);
-                if(tb.equals(BigDecimal.ZERO)){
+                if(tb.compareTo(BigDecimal.ZERO)==0&&loop>0){
+                    loop--;
                     i--;
                 }else{
                     if (scaleI > 0) {
@@ -1752,6 +1755,7 @@ public class CustomFunction {
             }
             int total = StringUtils.handleObj2Integer(hz);
             if (total - hzi > 0) {
+                loop=200;
                 for (int k = 0; k < total - hzi; k++) {
                     BigDecimal tb;
                     if (rd.nextBoolean()) {
@@ -1759,7 +1763,8 @@ public class CustomFunction {
                     } else {
                         tb = new BigDecimal(min - 1 - rd.nextInt(((max - min) / 2))).divide(BigDecimal.valueOf(Math.pow(10, scaleI)), scaleI, ROUND_HALF_UP);
                     }
-                    if(tb.equals(BigDecimal.ZERO)){
+                    if(tb.compareTo(BigDecimal.ZERO)==0&&loop>0){
+                        loop--;
                         k--;
                     }else {
                         if (scaleI > 0) {
@@ -1777,9 +1782,7 @@ public class CustomFunction {
         return result;
     }
 
-/*    public static void main(String[] args) {
-        rangeList(100,0,"-5,5",1,0,1).forEach(System.out::println);
-    }*/
+
     /**
      * @return java.util.List<java.lang.Object>
      * @Description obj 转List

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

@@ -338,11 +338,12 @@ public class FormulaUtils {
         }
     }
 
+    public static final String TBN_FN="TBN";
 /*把模型类转换成共识配置选项*/
     public static List<WbsFormElementVO> toElementVos(Class<?> clazz)  {
         List<WbsFormElementVO> vos =new ArrayList<>();
         try {
-            Field tbnField = clazz.getField("TBN");
+            Field tbnField = clazz.getField(TBN_FN);
             String TBN = (String) tbnField.get(null);
             for (Field field : clazz.getDeclaredFields()) {
                 JSONField jf = field.getAnnotation(JSONField.class);
@@ -361,14 +362,14 @@ public class FormulaUtils {
         return vos;
     }
 
-    public static <T> Map<String,FormData> toFormDataMap(T bean){
-        Map<String,FormData> result = new HashMap<>();
+    public static <T> LinkedHashMap<String,FormData> toFormDataMap(T bean){
+        LinkedHashMap<String,FormData> result = new LinkedHashMap<>();
         if(bean!=null){
             try {
                 @SuppressWarnings("unchecked")
                 Map<String,String> map= JSON.parseObject(JSON.toJSONString(bean),Map.class);
                 Class<?> clazz=bean.getClass();
-                String TBN = (String)  clazz.getField("TBN").get(null);
+                String TBN = (String)  clazz.getField(TBN_FN).get(null);
                 for (Field field : clazz.getDeclaredFields()) {
                     JSONField jf = field.getAnnotation(JSONField.class);
                     if (jf != null) {
@@ -389,6 +390,34 @@ public class FormulaUtils {
     }
 
 
+    /*数据模型按字段生成内容获取函数*/
+    public static <T> Map<String,Function<T,Object>> functionMapBuilder(Class<T> clazz){
+        Map<String, Function<T, Object>> functionMap = new HashMap<>();
+        for (Field field : clazz.getDeclaredFields()) {
+            JSONField jf = field.getAnnotation(JSONField.class);
+            if(jf!=null) {
+                String key = TBN_FN+ StringPool.COLON +jf.name();
+                String fieldName = field.getName();
+                Function<T, Object> function = getFunction(clazz, fieldName);
+                functionMap.put(key, function);
+            }
+        }
+        return functionMap;
+    }
+
+    private static <T> Function<T, Object> getFunction(Class<T> clazz, String fieldName) {
+        return certificate -> {
+            try {
+                Field field = clazz.getDeclaredField(fieldName);
+                field.setAccessible(true);
+                return field.get(certificate);
+            } catch (Exception e) {
+                e.printStackTrace();
+                return null;
+            }
+        };
+    }
+
     /**从元素名称中解析项目名称,细化项目匹配用*/
     public static  String parseItemName(String eName){
         if (StringUtils.isEmpty(eName)) {

+ 24 - 7
blade-service/blade-manager/src/main/java/org/springblade/manager/formula/impl/ExecutorInit.java

@@ -5,7 +5,10 @@ import lombok.Data;
 import lombok.EqualsAndHashCode;
 import org.springblade.manager.formula.FormulaExecutor;
 import org.springblade.manager.vo.BaseInfo;
+import org.springblade.manager.vo.InterimPaymentCertificate;
 import org.springblade.manager.vo.MeterPeriodInfo;
+import org.springblade.manager.vo.MeterType;
+
 import java.util.function.Function;
 
 /**
@@ -19,20 +22,34 @@ public class ExecutorInit extends FormulaExecutor {
     public ExecutorInit(TableElementConverter tec) {
         super(tec);
     }
-    private  Function<Long, BaseInfo> baseInfoFc;
-    private  Function<Long, MeterPeriodInfo>  meterPeriodFc;
+    private  Function<Long, BaseInfo> getBaseInfo;
+    private  Function<Long, MeterPeriodInfo>  getMeterPeriod;
 
 
     public void handle() {
+
         /*加载合同数据*/
-        BaseInfo baseInfo = this.baseInfoFc.apply(tec.getContractId());
+        BaseInfo baseInfo = this.getBaseInfo.apply(tec.getContractId());
         tec.getConstantMap().put(BaseInfo.TBN,baseInfo);
         tec.formDataMap.putAll(FormulaUtils.toFormDataMap(baseInfo));
-        /*加载计量期信息*/
-        MeterPeriodInfo meterPeriod=meterPeriodFc.apply(tec.getPeriodId());
-        tec.formDataMap.putAll(FormulaUtils.toFormDataMap(meterPeriod));
-        tec.getConstantMap().put(MeterPeriodInfo.TBN,meterPeriod);
+        if(MeterType.MATERIAL.equals(tec.getMeterType())||MeterType.START.equals(tec.getMeterType())){
+            /*加载计量期信息*/
+            MeterPeriodInfo meterPeriod=getMeterPeriod.apply(tec.getPeriodId());
+            tec.formDataMap.putAll(FormulaUtils.toFormDataMap(meterPeriod));
+            tec.getConstantMap().put(MeterPeriodInfo.TBN,meterPeriod);
+        }else if(MeterType.INTERIM.equals(tec.getMeterType())){
+            /*中间支付证书*/
+            tec.formDataMap.putAll(FormulaUtils.toFormDataMap(new InterimPaymentCertificate()));
+            /*中间支付汇总*/
+            /*分项工程中期支付汇总*/
+            /*分项工程中期计量支付*/
+            /*中间计量支付汇总*/
+            /*中间计量*/
+        }
+
     }
 
 
+
+
 }

+ 51 - 10
blade-service/blade-manager/src/main/java/org/springblade/manager/formula/impl/ExecutorSpecial.java

@@ -1,21 +1,25 @@
 package org.springblade.manager.formula.impl;
 
+import com.alibaba.fastjson.annotation.JSONField;
 import com.mixsmart.utils.FormulaUtils;
 import com.mixsmart.utils.StringUtils;
+import io.swagger.models.auth.In;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 import org.springblade.core.tool.utils.Func;
+import org.springblade.core.tool.utils.ReflectUtil;
+import org.springblade.core.tool.utils.StringPool;
 import org.springblade.manager.dto.ElementData;
 import org.springblade.manager.dto.FormData;
 import org.springblade.manager.formula.FormulaExecutor;
 import org.springblade.manager.formula.NodeTable;
 import org.springblade.manager.vo.BaseInfo;
+import org.springblade.manager.vo.InterimPaymentCertificate;
 import org.springblade.manager.vo.Material;
+import org.springblade.manager.vo.MeterType;
 
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-import java.util.Optional;
+import java.lang.reflect.Field;
+import java.util.*;
 import java.util.function.Function;
 import java.util.stream.Collectors;
 import java.util.stream.IntStream;
@@ -36,11 +40,10 @@ public class ExecutorSpecial extends FormulaExecutor {
 
     @Override
     public void handle() {
-        for(NodeTable nodeTable:tec.getTableAll()){
-            if(Material.TBN_CH.equals(nodeTable.getNodeName())){
-                MaterialCalc materialCalc = new MaterialCalc(tec.getFormDataList());
-                this.specialList.add(materialCalc);
-            }
+        if(MeterType.MATERIAL.equals(tec.getMeterType())){
+            this.specialList.add(new MaterialCalc());
+        }else if(MeterType.INTERIM.equals(tec.getMeterType())){
+            this.specialList.add(new InterimPayCert());
         }
         this.specialList.stream().filter(Special::ready).forEach(Special::parse);
     }
@@ -65,7 +68,8 @@ public class ExecutorSpecial extends FormulaExecutor {
         /**预付款合计*/
         private String totalAdvance;
         private List<FormData> fds=new ArrayList<>();
-        public MaterialCalc(List<FormData> list) {
+        public MaterialCalc() {
+            List<FormData> list =tec.getFormDataList();
            Optional<FormData> fop=  list.stream().filter(e->e.executable()&&"MATERIAL".equals(e.getFormula().getNumber())).findAny();
            List<FormData> candidate = new ArrayList<>();
            if(fop.isPresent()){
@@ -184,8 +188,45 @@ public class ExecutorSpecial extends FormulaExecutor {
         }
     }
 
+    @Data
+    public  class InterimPayCert implements Special{
+
+        @Override
+        public boolean ready() {
+            return true;
+        }
+
+
+        @Override
+        public void parse() {
+            LinkedHashMap<String,FormData> fdm = FormulaUtils.toFormDataMap(new InterimPaymentCertificate());
+            Map<String,Function<InterimPaymentCertificate,Object>> functionMap = FormulaUtils.functionMapBuilder(InterimPaymentCertificate.class);
+            tec.getFormDataMap().putAll(fdm);
+            List<InterimPaymentCertificate> dataList = new ArrayList<>();
+            /*数据获取start*/
+            dataList.add(new InterimPaymentCertificate()) ;//测试,按照业务写,实际会复杂许多
+            //TODO
+            /*数据获取end*/
+            fdm.values().forEach(fd->{
+                List<Object> raw = dataList.stream().map(functionMap.get(fd.getCode())).filter(Func::isNotEmpty).collect(Collectors.toList());
+                if(raw.size()>0){
+                    List<ElementData> eds = fd.getValues();
+                    for(Object value:raw){
+                        eds.add(new ElementData(value));
+                    }
+                }
+            });
+
+        }
+    }
+
+
+
+
     public interface  Special{
+        /**是否满足执行条件*/
         boolean ready();
+        /**解析数据*/
         void parse();
     }
 }

+ 4 - 1
blade-service/blade-manager/src/main/java/org/springblade/manager/formula/impl/TableElementConverter.java

@@ -24,6 +24,7 @@ import org.springblade.manager.formula.ITableElementConverter;
 import org.springblade.manager.formula.KeyMapper;
 import org.springblade.manager.formula.NodeTable;
 import org.springblade.manager.vo.CurrentNode;
+import org.springblade.manager.vo.MeterType;
 import org.springblade.manager.vo.ReportResult;
 import org.springframework.jdbc.core.JdbcTemplate;
 
@@ -105,11 +106,13 @@ public class TableElementConverter implements ITableElementConverter {
     public  boolean isNew=false;
     /**是否强制执行,刷数据的时候会用到*/
     public boolean  force=false;
-
+    /**输入输出转换,在创建TableElementConverter必须明确实例*/
     private final Converter in;
     private final Converter out;
     /*计量属性*/
     private Long periodId;
+    /**计量类型*/
+    private MeterType meterType;
     /*存放计量计算结果*/
     public List<ReportResult> reportResults ;
     /*计量属性*/

+ 8 - 19
blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/ArchiveTreeContractMapper.xml

@@ -539,12 +539,8 @@
             (CASE when LENGTH(expert_id) > 0 then 0 else 1 end) as isSelect,
             if((select COUNT(1) from m_archive_tree_contract WHERE is_deleted = 0 and parent_id = atc.id) > 0,true,false) as isChildren,
             (CASE when LENGTH(expert_id) > 0 then concat('该目录已分属', atc.expert_name , '专家') else '' end) as nodeInfo,
-            (concat(atc.node_name,'(', (select COUNT(1) from u_archives_auto  WHERE  is_apply = 1 and is_deleted=0 and node_id in (select id from m_archive_tree_contract where is_deleted = 0 and project_id = #{projectId}
-            and (id = atc.id or FIND_IN_SET(atc.id,ancestors)))), '卷)')) as node_name,
-
-            (select COUNT(1) from u_archives_auto  WHERE  is_apply = 1 and is_deleted=0 and node_id in (select id from m_archive_tree_contract where is_deleted = 0 and project_id = #{projectId}
-            and (id = atc.id or FIND_IN_SET(atc.id,ancestors)))) as total
-
+            atc.node_name as node_name ,
+            ( select count(1) from u_archives_auto where is_apply = 1 and is_deleted = 0 and node_id = atc.id ) as total
             from m_archive_tree_contract atc
             WHERE is_deleted =0 and project_id = #{projectId}
             and (id = #{ownerUnit} or FIND_IN_SET(#{ownerUnit},ancestors))
@@ -557,10 +553,8 @@
             (CASE when LENGTH(expert_id) > 0 then 0 else 1 end) as isSelect,
             if((select COUNT(1) from m_archive_tree_contract WHERE is_deleted = 0 and parent_id = atc.id) > 0,true,false) as isChildren,
             (CASE when LENGTH(expert_id) > 0 then concat('该目录已分属', atc.expert_name , '专家') else '' end) as nodeInfo,
-            (concat(atc.node_name,'(', (select COUNT(1) from u_archives_auto  WHERE  is_apply = 1 and is_deleted=0 and node_id in (select id from m_archive_tree_contract where is_deleted = 0 and project_id = #{projectId}
-            and (id = atc.id or FIND_IN_SET(atc.id,ancestors)))), '卷)')) as node_name,
-            (select COUNT(1) from u_archives_auto  WHERE  is_apply = 1 and is_deleted=0 and node_id in (select id from m_archive_tree_contract where is_deleted = 0 and project_id = #{projectId}
-            and (id = atc.id or FIND_IN_SET(atc.id,ancestors)))) as total
+            atc.node_name as node_name ,
+            ( select count(1) from u_archives_auto where is_apply = 1 and is_deleted = 0 and node_id = atc.id ) as total
             from m_archive_tree_contract atc
             WHERE is_deleted =0 and project_id = #{projectId}
             and  (id = #{supervisorUnit} or FIND_IN_SET(#{supervisorUnit},ancestors))
@@ -573,10 +567,8 @@
             (CASE when LENGTH(expert_id) > 0 then 0 else 1 end) as isSelect,
             if((select COUNT(1) from m_archive_tree_contract WHERE is_deleted = 0 and parent_id = atc.id) > 0,true,false) as isChildren,
             (CASE when LENGTH(expert_id) > 0 then concat('该目录已分属', atc.expert_name , '专家') else '' end) as nodeInfo,
-            (concat(atc.node_name,'(', (select COUNT(1) from u_archives_auto  WHERE  is_apply = 1 and is_deleted=0 and node_id in (select id from m_archive_tree_contract where is_deleted = 0 and project_id = #{projectId}
-            and (id = atc.id or FIND_IN_SET(atc.id,ancestors)))), '卷)')) as node_name,
-            (select COUNT(1) from u_archives_auto  WHERE  is_apply = 1 and is_deleted=0 and node_id in (select id from m_archive_tree_contract where is_deleted = 0 and project_id = #{projectId}
-            and (id = atc.id or FIND_IN_SET(atc.id,ancestors)))) as total
+            atc.node_name as node_name ,
+            ( select count(1) from u_archives_auto where is_apply = 1 and is_deleted = 0 and node_id = atc.id ) as total
             from m_archive_tree_contract atc
             WHERE is_deleted =0 and project_id = #{projectId}
             and  (id = #{buildUnit} or FIND_IN_SET(#{buildUnit},ancestors))
@@ -587,11 +579,8 @@
         select id,parent_id,
                (CASE when LENGTH(expert_id) > 0 then 0 else 1 end) as isSelect,
                if((select COUNT(1) from m_archive_tree_contract WHERE is_deleted = 0 and parent_id = atc.id) > 0,true,false) as isChildren,
---                (CASE when LENGTH(expert_id) > 0 then concat('该目录已分属', atc.expert_name , '专家') else '' end) as nodeInfo,
-               (concat(atc.node_name,'(', (select COUNT(1) from u_archives_auto  WHERE  is_apply = 1 and is_deleted=0 and node_id in (select id from m_archive_tree_contract where is_deleted = 0 and project_id = #{projectId}
-                and (id = atc.id or FIND_IN_SET(atc.id,ancestors)))), ')')) as node_name,
-               (select COUNT(1) from u_archives_auto  WHERE  is_apply = 1 and is_deleted=0 and node_id in (select id from m_archive_tree_contract where is_deleted = 0 and project_id = #{projectId}
-                and (id = atc.id or FIND_IN_SET(atc.id,ancestors)))) as total
+               atc.node_name as node_name ,
+               ( select count(1) from u_archives_auto where project_id = #{projectId} and is_apply = 1 and is_deleted = 0) as total
         from m_archive_tree_contract atc
         WHERE atc.parent_id = 0 and atc.is_deleted = 0 and project_id =#{projectId}
     </select>

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

@@ -1364,6 +1364,8 @@ public class ArchiveTreeContractServiceImpl extends BaseServiceImpl<ArchiveTreeC
 		 */
 		//获取首节点
 		InspectTreeVO firstNode = baseMapper.getFirstNode(projectId);
+		String firstName = firstNode.getNodeName()+"("+firstNode.getTotal()+")";
+		firstNode.setTotal(0);
 		//获取三个单位节点
 		List<ArchiveTreeContract> unitFirstNode = baseMapper.getUnitFirstNode(firstNode.getId());
 		Map<String, Long> unitMap = unitFirstNode.stream().collect(Collectors.toMap(l -> l.getTreeCode(), l -> l.getId()));
@@ -1389,6 +1391,7 @@ public class ArchiveTreeContractServiceImpl extends BaseServiceImpl<ArchiveTreeC
 		twoTreeVO.setList(list);
 		List<InspectTreeVO> list2 = new ArrayList<>();
 		gatherSortNode(list,list2);
+		list.get(0).setNodeName(firstName);
 		//查看当前档案是否分配过其他专家
 		if (list.size() > 1){
 			throw new ServiceException("节点信息错误");
@@ -1476,17 +1479,24 @@ public class ArchiveTreeContractServiceImpl extends BaseServiceImpl<ArchiveTreeC
 	}
 
 	//递归方法
-	private void gatherSortNode(List<InspectTreeVO>list, List<InspectTreeVO> list2){
+	private int gatherSortNode(List<InspectTreeVO>list, List<InspectTreeVO> list2){
+		int i = 0;
 		for (InspectTreeVO vo : list) {
 			if (vo.getChildren().size() == 0){
+				vo.setNodeName(vo.getNodeName()+"("+vo.getTotal()+"卷)");
 				if (vo.getTotal() > 0) {
 					list2.add(vo);
+					i += vo.getTotal();
 				}
 				continue;
 			}else {
-				gatherSortNode(vo.getChildren(), list2);
+				int node = gatherSortNode(vo.getChildren(), list2);
+				vo.setTotal(node);
+				i += node;
+				vo.setNodeName(vo.getNodeName()+"("+vo.getTotal()+"卷)");
 			}
 		}
+		return i;
 	}
 
 	/**

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

@@ -793,13 +793,14 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
             if (CollectionUtil.isNotEmpty(simple)) {
                 for(FormData fd:simple){
                     if(!tec.force&&fd.executable()&&fd.getFormula().getFormula().contains(WP)){
-                        /*节点公式已经生成过就自动填充,无需再计算*/
+                        /*非强制刷新模式下,节点参数公式已经生成过就自动填充且不会覆盖已经存在的内容,无需再计算*/
                        Optional<Object> op= fd.getValues().stream().map(ElementData::getValue).filter(Func::isNotEmpty).findAny();
                        if(op.isPresent()) {
                            for(ElementData ed:fd.getValues()){
-                               ed.setValue(op.get());
+                               if(ed.isEmpty()) {
+                                   ed.setValue(op.get());
+                               }
                            }
-                           fd.getFormula().setOutm(1);
                            fd.setFinished(true);
                            fd.setUpdate(1);
                        }
@@ -2529,32 +2530,43 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
     }
 
 
-    String[] tabArr=new String[]{"计量报表","动员预付款报表","材料预付款报表"};
     @Override
     public  List<ReportResult> execute3(Long contractId,Long periodId ,Integer type) {
         ContractInfo contractInfo = this.contractInfoService.getById(contractId);
-        Map<String,String> parent=  this.getSqlOne("select id,wbs_id wbsId,CONCAT(ancestors,',',id) path from  m_wbs_tree_private a  where a.node_name=? and a.project_id=?",Map.class,tabArr[type],contractInfo.getPId());
+        MeterType meterType = MeterType.getByIndex(type);
+
+        /*元素创建*/
+        Map<String,String> parent=  this.getSqlOne("select id,wbs_id wbsId,CONCAT(ancestors,',',id) path from  m_wbs_tree_private a  where a.node_name=? and a.project_id=?",Map.class,meterType.name(),contractInfo.getPId());
         List<NodeTable> tableList=  this.getSqlList("select p_key_id pkeyId, node_name nodeName ,init_table_name initTableName,html_url htmlUrl  from  m_wbs_tree_private where ancestors like ? and LENGTH(html_url)>0 and is_deleted=0 and project_id=? and wbs_id=?",NodeTable.class,parent.get("path")+"%",contractInfo.getPId(),parent.get("wbsId"));
         Map<String,Map<String,String>> coordinateMap=tableList.stream().collect(Collectors.toMap(NodeTable::getInitTableName,m->FormulaUtils.getElementCell(m.getHtmlUrl()),(v1,v2)->v2));
         List<FormData> processFds = this.createFormDataByTableName(tableList.stream().map(NodeTable::getInitTableName).collect(Collectors.joining("','")));
         listForMeter(processFds,contractInfo.getPId(),parent.get("id"));
+
+        /*转换器声明*/
         TableElementConverter tec = new TableElementConverter(processFds,coordinateMap,tableList);
         tec.setProjectId(Long.parseLong(contractInfo.getPId()));
         tec.setContractId(contractInfo.getId());
         tec.setPeriodId(periodId);
         tec.setLog(new FormulaLog());
+        tec.setMeterType(meterType);
         tec.before();
+
+        /*执行链*/
         List<FormulaHandleChain> formulaHandleChains = new ArrayList<>();
+        /*初始化*/
         ExecutorInit init= new ExecutorInit(tec);
-        init.setBaseInfoFc(this.formulaDao.getBaseInfo());
-        init.setMeterPeriodFc(this.formulaDao.getMeterPeriod());
+        init.setGetBaseInfo(this.formulaDao.getBaseInfo());
+        init.setGetMeterPeriod(this.formulaDao.getMeterPeriod());
         formulaHandleChains.add(init);
         formulaHandleChains.add(new ExecutorSort(tec));
         formulaHandleChains.add(new ExecutorPre(tec));
+        /*特殊公式*/
         ExecutorSpecial special = new ExecutorSpecial(tec);
         special.setMaterialListFc(this.formulaDao.getMaterialForm());
         formulaHandleChains.add(special);
+        /*通用计算*/
         formulaHandleChains.add(new ExecutorCalc(tec));
+        /*格式化*/
         formulaHandleChains.add(new ExecutorFormat(tec));
         formulaHandleChains.forEach(FormulaHandleChain::handle);
         tec.after();

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

@@ -1666,12 +1666,12 @@ public class TaskController extends BladeController {
     @ApiOperationSupport(order = 16)
     @ApiOperation(value = "附件文件上传", notes = "传入TaskDataUploadFileDTO")
     public R<Object> dataUploadFile(@RequestBody TaskDataUploadFileDTO dto) {
-        if (ObjectUtil.isEmpty(dto.getTaskId())) {
-            throw new ServiceException("未获取到taskId");
+        if (ObjectUtil.isEmpty(dto.getTaskId()) || ObjectUtil.isEmpty(dto.getDataId())) {
+            throw new ServiceException("未获取到taskId或dataId");
         }
         Task task = jdbcTemplate.query("SELECT meter_task_type,process_instance_id,contract_id,project_id,status FROM u_task WHERE id = " + dto.getTaskId(), new BeanPropertyRowMapper<>(Task.class)).stream().findAny().orElse(null);
         if (task != null) {
-            if (task.getStatus().equals(2)) {
+            if (Arrays.asList(2, 3).contains(task.getStatus())) {
                 throw new ServiceException("当前任务已完成审批,无法上传");
             }
             check(task);
@@ -1701,7 +1701,7 @@ public class TaskController extends BladeController {
         }
         Task task = jdbcTemplate.query("SELECT meter_task_type,process_instance_id,status FROM u_task WHERE id = " + taskId, new BeanPropertyRowMapper<>(Task.class)).stream().findAny().orElse(null);
         if (task != null) {
-            if (task.getStatus().equals(2)) {
+            if (Arrays.asList(2, 3).contains(task.getStatus())) {
                 throw new ServiceException("当前任务已完成审批,无法删除");
             }
             check(task);

+ 11 - 11
blade-service/blade-user/src/main/java/org/springblade/system/user/controller/UserController.java

@@ -182,11 +182,11 @@ public class UserController {
     @PostMapping("/submit2")
     @ApiOperationSupport(order = 4)
     @ApiOperation(value = "新增2", notes = "传入UserDTO")
-  //  @PreAuth(RoleConstant.HAS_ROLE_ADMIN)
+    //  @PreAuth(RoleConstant.HAS_ROLE_ADMIN)
     public R submitTow(@Valid @RequestBody UserDTO user) {
         CacheUtil.clear(USER_CACHE);
         // 为第三方系统
-        if(user.getSysId().equals("30")){
+        if (ObjectUtil.isNotEmpty(user.getSysId()) && user.getSysId().equals("30")) {
             user.setUserType("1,2,3");
             user.setPassword("123456");
             user.setPlaintextPassword("123456");
@@ -195,7 +195,7 @@ public class UserController {
             user.setStatus(1);
             user.setSysType(2);
             List<SaveUserInfoByProjectDTO> projectAndUserList = new ArrayList<>();
-            SaveUserInfoByProjectDTO data= new SaveUserInfoByProjectDTO();
+            SaveUserInfoByProjectDTO data = new SaveUserInfoByProjectDTO();
             data.setContractId("1714919227250950146");
             data.setProjectId("1612329251049537537");
             data.setRoleId("1537248158277914626");
@@ -452,9 +452,9 @@ public class UserController {
     @PostMapping("/loginByToken")
     @ApiOperationSupport(order = 20)
     @ApiOperation(value = "token验证加密", notes = "token验证登录")
-    public R loginByToken(String  token) {
-      //  this.loginByToken2(token);
-        token = "bearer "+token;
+    public R loginByToken(String token) {
+        //  this.loginByToken2(token);
+        token = "bearer " + token;
         HttpClient httpClient = HttpClientBuilder.create().build();
         HttpGet httpPost = new HttpGet("http://47.110.251.215:8090/blade-auth/oauth/user-info");
         httpPost.setHeader("Authorization", token); //这个需要 client:
@@ -470,11 +470,11 @@ public class UserController {
                 outputStream.write(buffer, 0, index);
             }
             JSONObject jsonObject = JSON.parseObject(outputStream.toString());
-            if(jsonObject!=null && ObjectUtil.isNotEmpty(jsonObject)){
+            if (jsonObject != null && ObjectUtil.isNotEmpty(jsonObject)) {
                 JSONObject data = jsonObject.getJSONObject("data");
                 String name = data.getString("name");
                 return this.loginByToken2(name);
-            }else{
+            } else {
                 return R.fail("token解析用户失败");
             }
         } catch (IOException e) {
@@ -501,10 +501,10 @@ public class UserController {
             if (userInfo == null) {
                 return R.fail("用户名或密码错误");
             }
-            String tenId =userInfo.getTenantId();
+            String tenId = userInfo.getTenantId();
             String pass = userInfo.getPlaintextPassword();
-            String md5Pass =MD5Utils.md5Hex(pass,"UTF-8");
-            System.out.println("密码"+ md5Pass);
+            String md5Pass = MD5Utils.md5Hex(pass, "UTF-8");
+            System.out.println("密码" + md5Pass);
 
             HttpClient httpClient = HttpClientBuilder.create().build();
             HttpPost httpPost = new HttpPost("http://47.110.251.215:8090/blade-auth/oauth/token");

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

@@ -94,8 +94,8 @@ public class WbsTreeController extends BladeController {
      * @date 2024年1月6日10:28:01
      */
     @PostMapping("/informationWriteQuery/page")
-    @ApiOperationSupport(order = 4)
-    @ApiOperation(value = "分页")
+    @ApiOperationSupport(order = 2)
+    @ApiOperation(value = "资料查询分页")
     @ApiImplicitParams({
             @ApiImplicitParam(name = "size", value = "当前页条数", required = true),
             @ApiImplicitParam(name = "current", value = "当前页", required = true),

+ 1 - 1
blade-service/blade-user/src/main/java/org/springblade/system/user/service/impl/UserServiceImpl.java

@@ -1322,7 +1322,7 @@ public class UserServiceImpl extends BaseServiceImpl<UserMapper, User> implement
         }
         long endTime = System.currentTimeMillis();
         long executionTime = endTime - startTime;
-        _logger.info("合同段 " + node.getContractId() + " 获取当前资料缓存 执行时间:" + executionTime + " ms");
+        _logger.info("合同段 " + node.getContractId() + " 获取当前资料 执行时间:" + executionTime + " ms");
 
         if (result.size() != 0) {
             Map<String, List<Task>> taskMaps = new HashMap<>();