Quellcode durchsuchen

Merge branch 'refs/heads/feature-lihb-20250610' into dev

LHB vor 1 Monat
Ursprung
Commit
ca468baf45
45 geänderte Dateien mit 3050 neuen und 18 gelöschten Zeilen
  1. 1 1
      blade-ops-api/blade-resource-api/src/main/java/org/springblade/resource/feign/NewIOSSClient.java
  2. 5 0
      blade-ops/blade-resource/src/main/java/org/springblade/resource/builder/oss/BladeOssRuleRe.java
  3. 12 0
      blade-ops/blade-resource/src/main/java/org/springblade/resource/builder/ossre/S3Template2.java
  4. 42 0
      blade-service-api/blade-business-api/src/main/java/org/springblade/business/dto/PrivateStandardDTO.java
  5. 25 0
      blade-service-api/blade-business-api/src/main/java/org/springblade/business/dto/StandardInfoDTO.java
  6. 38 0
      blade-service-api/blade-business-api/src/main/java/org/springblade/business/dto/StandardInfoJoinDTO.java
  7. 31 0
      blade-service-api/blade-business-api/src/main/java/org/springblade/business/dto/StandardInfoPrivateJoinDTO.java
  8. 121 0
      blade-service-api/blade-business-api/src/main/java/org/springblade/business/entity/PrivateStandard.java
  9. 118 0
      blade-service-api/blade-business-api/src/main/java/org/springblade/business/entity/StandardFile.java
  10. 107 0
      blade-service-api/blade-business-api/src/main/java/org/springblade/business/entity/StandardInfo.java
  11. 62 0
      blade-service-api/blade-business-api/src/main/java/org/springblade/business/entity/StandardInfoJoin.java
  12. 103 0
      blade-service-api/blade-business-api/src/main/java/org/springblade/business/entity/StandardInfoPrivateJoin.java
  13. 20 0
      blade-service-api/blade-business-api/src/main/java/org/springblade/business/vo/StandardElementVo.java
  14. 26 0
      blade-service-api/blade-business-api/src/main/java/org/springblade/business/vo/StandardInfoConditionVo.java
  15. 17 0
      blade-service-api/blade-business-api/src/main/java/org/springblade/business/vo/StandardInfoDtoVo.java
  16. 21 0
      blade-service-api/blade-business-api/src/main/java/org/springblade/business/vo/StandardInfoGroupNameVO.java
  17. 38 0
      blade-service-api/blade-business-api/src/main/java/org/springblade/business/vo/StandardInfoPrivateJoinGroupVO.java
  18. 26 0
      blade-service-api/blade-business-api/src/main/java/org/springblade/business/vo/StandardInfoPrivateJoinVO.java
  19. 28 0
      blade-service-api/blade-business-api/src/main/java/org/springblade/business/vo/StandardInfoVO.java
  20. 212 0
      blade-service/blade-business/src/main/java/org/springblade/business/controller/PrivateStandardController.java
  21. 224 0
      blade-service/blade-business/src/main/java/org/springblade/business/controller/StandardInfoController.java
  22. 20 0
      blade-service/blade-business/src/main/java/org/springblade/business/mapper/PrivateStandardMapper.java
  23. 35 0
      blade-service/blade-business/src/main/java/org/springblade/business/mapper/PrivateStandardMapper.xml
  24. 18 0
      blade-service/blade-business/src/main/java/org/springblade/business/mapper/StandardFileMapper.java
  25. 23 0
      blade-service/blade-business/src/main/java/org/springblade/business/mapper/StandardFileMapper.xml
  26. 28 0
      blade-service/blade-business/src/main/java/org/springblade/business/mapper/StandardInfoJoinMapper.java
  27. 32 0
      blade-service/blade-business/src/main/java/org/springblade/business/mapper/StandardInfoJoinMapper.xml
  28. 45 0
      blade-service/blade-business/src/main/java/org/springblade/business/mapper/StandardInfoMapper.java
  29. 305 0
      blade-service/blade-business/src/main/java/org/springblade/business/mapper/StandardInfoMapper.xml
  30. 28 0
      blade-service/blade-business/src/main/java/org/springblade/business/mapper/StandardInfoPrivateJoinMapper.java
  31. 33 0
      blade-service/blade-business/src/main/java/org/springblade/business/mapper/StandardInfoPrivateJoinMapper.xml
  32. 28 0
      blade-service/blade-business/src/main/java/org/springblade/business/service/PrivateStandardService.java
  33. 13 0
      blade-service/blade-business/src/main/java/org/springblade/business/service/StandardFileService.java
  34. 10 0
      blade-service/blade-business/src/main/java/org/springblade/business/service/StandardInfoJoinService.java
  35. 10 0
      blade-service/blade-business/src/main/java/org/springblade/business/service/StandardInfoPrivateJoinService.java
  36. 45 0
      blade-service/blade-business/src/main/java/org/springblade/business/service/StandardInfoService.java
  37. 442 0
      blade-service/blade-business/src/main/java/org/springblade/business/service/impl/PrivateStandardServiceImpl.java
  38. 22 0
      blade-service/blade-business/src/main/java/org/springblade/business/service/impl/StandardFileServiceImpl.java
  39. 14 0
      blade-service/blade-business/src/main/java/org/springblade/business/service/impl/StandardInfoJoinServiceImpl.java
  40. 14 0
      blade-service/blade-business/src/main/java/org/springblade/business/service/impl/UStandardInfoPrivateJoinServiceImpl.java
  41. 365 0
      blade-service/blade-business/src/main/java/org/springblade/business/service/impl/UStandardInfoServiceImpl.java
  42. 8 1
      blade-service/blade-manager/src/main/java/com/jfireel/expression/node/impl/EqualNode.java
  43. 6 1
      blade-service/blade-manager/src/main/java/com/jfireel/expression/node/impl/GtEqNode.java
  44. 13 0
      blade-service/blade-manager/src/main/java/com/jfireel/expression/node/impl/NotEqualNode.java
  45. 216 15
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/FormulaServiceImpl.java

+ 1 - 1
blade-ops-api/blade-resource-api/src/main/java/org/springblade/resource/feign/NewIOSSClient.java

@@ -28,7 +28,7 @@ public interface NewIOSSClient {
     @PostMapping(value = UPLOAD_FILE_INFO_INPUT_STREAM, consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
     BladeFile uploadFileByInputStream(MultipartFile file);
 
-    @PostMapping(value = UPLOAD_FILE_INFO_INPUT_STREAM2)
+    @PostMapping(value = UPLOAD_FILE_INFO_INPUT_STREAM2,  consumes = MediaType.APPLICATION_OCTET_STREAM_VALUE)
     BladeFile uploadFileByInputStream2(@RequestParam String OriginalFilename,@RequestParam InputStream inputStream);
 
     @PostMapping(UPLOAD_FILE_INFO)

+ 5 - 0
blade-ops/blade-resource/src/main/java/org/springblade/resource/builder/oss/BladeOssRuleRe.java

@@ -19,6 +19,11 @@ class BladeOssRuleRe implements OssRule {
     }
 
     public String fileName(String originalFilename) {
+        //试验-规范管理
+        if(originalFilename.contains("standard")){
+            String[] split = originalFilename.split("\\|");
+            return "upload/" + split[0] + "/" + DateUtil.today() + "/" + FileUtil.getNameWithoutExtension(split[1]) + "." + FileUtil.getFileExtension(split[1]);
+        }
         return "upload/" + DateUtil.today() + "/" + FileUtil.getNameWithoutExtension(originalFilename) + "." + FileUtil.getFileExtension(originalFilename);
     }
 

+ 12 - 0
blade-ops/blade-resource/src/main/java/org/springblade/resource/builder/ossre/S3Template2.java

@@ -20,12 +20,15 @@ import com.amazonaws.services.s3.AmazonS3;
 import com.amazonaws.services.s3.model.*;
 import lombok.AllArgsConstructor;
 import lombok.SneakyThrows;
+import org.springblade.common.utils.SnowFlakeUtil;
 import org.springblade.core.oss.OssTemplate;
 import org.springblade.core.oss.enums.PolicyType;
 import org.springblade.core.oss.model.BladeFile;
 import org.springblade.core.oss.model.OssFile;
 import org.springblade.core.oss.props.OssProperties;
 import org.springblade.core.oss.rule.OssRule;
+import org.springblade.core.tool.utils.DateUtil;
+import org.springblade.core.tool.utils.FileUtil;
 import org.springblade.core.tool.utils.Func;
 import org.springblade.core.tool.utils.StringPool;
 import org.springframework.web.multipart.MultipartFile;
@@ -417,6 +420,15 @@ public class S3Template2 implements OssTemplate {
 	 * @return string
 	 */
 	private String getFileName(String originalFilename) {
+		return fileName(originalFilename);
+	}
+
+	public String fileName(String originalFilename) {
+		//试验-规范管理
+		if(originalFilename.contains("|")){
+			String[] split = originalFilename.split("\\|");
+			return "upload/" + split[0] + "/" + DateUtil.today() + "/" + SnowFlakeUtil.getId() + "." + FileUtil.getFileExtension(split[1]);
+		}
 		return ossRule.fileName(originalFilename);
 	}
 

+ 42 - 0
blade-service-api/blade-business-api/src/main/java/org/springblade/business/dto/PrivateStandardDTO.java

@@ -0,0 +1,42 @@
+package org.springblade.business.dto;
+
+import io.swagger.annotations.ApiModel;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.springblade.business.entity.PrivateStandard;
+import org.springblade.business.entity.StandardFile;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.util.List;
+
+/**
+ * @author LHB
+ */
+@EqualsAndHashCode(callSuper = true)
+@Data
+@ApiModel(description = "规范文件夹及规范文件对象")
+public class PrivateStandardDTO extends PrivateStandard {
+    /**
+     * 文件
+     */
+    private MultipartFile[] files;
+    /**
+     * 文件
+     */
+    private List<StandardFile> standardFiles;
+
+    /**
+     * 当前规范文件下文件的数量
+     */
+    private Integer filesCount;
+
+    /**
+     * 单个文件
+     */
+    private MultipartFile file;
+
+    /**
+     * 单个文件
+     */
+    private StandardFile standardFile;
+}

+ 25 - 0
blade-service-api/blade-business-api/src/main/java/org/springblade/business/dto/StandardInfoDTO.java

@@ -0,0 +1,25 @@
+package org.springblade.business.dto;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.springblade.business.entity.StandardInfo;
+
+import java.util.List;
+
+/**
+ * 试验规范信息DTO
+ *
+ * @author LHB
+ */
+@EqualsAndHashCode(callSuper = true)
+@Data
+@ApiModel(description = "试验规范信息DTO")
+public class StandardInfoDTO extends StandardInfo {
+    /**
+     * 基础信息
+     */
+    @ApiModelProperty(value = "基础信息", required = true)
+    private List<StandardInfo> info;
+}

+ 38 - 0
blade-service-api/blade-business-api/src/main/java/org/springblade/business/dto/StandardInfoJoinDTO.java

@@ -0,0 +1,38 @@
+package org.springblade.business.dto;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotEmpty;
+import javax.validation.constraints.NotNull;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * 条件设置
+ *
+ * @author LHB
+ */
+@Data
+@ApiModel(description = "新增对象")
+public class StandardInfoJoinDTO {
+    /**
+     * 主关联id
+     */
+    @ApiModelProperty(value = "主关联id", required = true)
+    @NotNull(message = "主关联id不能为空")
+    private Long leftId;
+    /**
+     * 组Id
+     */
+    @ApiModelProperty(value = "组Id", required = true)
+    private Long groupId;
+
+    /**
+     * 副连接id
+     */
+    @ApiModelProperty(value = "副连接id集合", required = true)
+    @NotEmpty(message = "副连接id不能为空")
+    private List<Long> rightIds = new ArrayList<>();
+}

+ 31 - 0
blade-service-api/blade-business-api/src/main/java/org/springblade/business/dto/StandardInfoPrivateJoinDTO.java

@@ -0,0 +1,31 @@
+package org.springblade.business.dto;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import org.springblade.business.entity.StandardInfoPrivateJoin;
+
+import javax.validation.constraints.NotEmpty;
+import javax.validation.constraints.NotNull;
+import java.util.List;
+
+/**
+ * 与表单的关联对象
+ * @author LHB
+ */
+@Data
+@ApiModel(description = "新增对象")
+public class StandardInfoPrivateJoinDTO {
+    /**
+     * 主关联id
+     */
+    @NotNull(message = "主关联id不能为空")
+    @ApiModelProperty(value = "主关联id")
+    private Long leftId;
+    /**
+     * 副连接id
+     */
+    @NotEmpty(message = "副连接信息不能为空")
+    @ApiModelProperty(value = "副连接信息集合")
+    private List<StandardInfoPrivateJoin> rightIds;
+}

+ 121 - 0
blade-service-api/blade-business-api/src/main/java/org/springblade/business/entity/PrivateStandard.java

@@ -0,0 +1,121 @@
+package org.springblade.business.entity;
+
+import cn.hutool.core.date.DateTime;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+
+import java.time.LocalDateTime;
+import java.util.Date;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+
+/**
+ * 规范文件夹及规范文件表
+ *
+ * @author LHB
+ * @TableName u_wbs_private_standard
+ */
+@TableName(value = "u_wbs_private_standard")
+@Data
+@ApiModel(description = "规范文件夹及规范文件对象")
+public class PrivateStandard {
+    /**
+     *
+     */
+    @TableId
+    @ApiModelProperty(value = "主键", required = true)
+    private Long id;
+
+    /**
+     * 名称(规范文件夹名称及规范名称)
+     */
+    @NotBlank(message = "名称不能为空")
+    @ApiModelProperty(value = "名称", required = true)
+    private String name;
+
+    /**
+     * 父级节点id
+     * type = 2 必传
+     */
+    @ApiModelProperty(value = "父级节点id(type = 2 必传)")
+    private Long parentId;
+
+    /**
+     * 项目试验节点id
+     * type = 1 必传
+     */
+    @ApiModelProperty(value = "项目试验节点id(type = 1 必传)")
+    private Long privateId;
+
+    /**
+     * 类型(1-规范文件夹,2-规范文件)
+     */
+    @ApiModelProperty(value = "类型(1-规范文件夹,2-规范文件)", required = true)
+    @NotNull(message = "类型不能为空")
+    private Integer type;
+
+    /**
+     * 下达日期(年月日)
+     * type = 2 必传
+     */
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
+    @ApiModelProperty(value = "下达日期(年月日)(type = 2 必传)")
+    private Date issueDate;
+
+    /**
+     * 实施日期(年月日)
+     * type = 2 必传
+     */
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
+    @ApiModelProperty(value = "实施日期(年月日)(type = 2 必传)")
+    private Date actualizeDate;
+
+    /**
+     * 是否删除(0-正常,1-已删除)
+     */
+    @ApiModelProperty(value = "是否删除(0-正常,1-已删除)")
+    private Integer isDeleted = 0;
+    /**
+     * 状态(1-正常,2-过期)
+     */
+    @ApiModelProperty(value = "状态(1-正常,2-过期)")
+    private Integer status;
+
+    /**
+     * 创建时间
+     */
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @ApiModelProperty(value = "创建时间", hidden = true)
+    private LocalDateTime createTime;
+
+    /**
+     * 创建人
+     */
+    @ApiModelProperty(value = "创建人", hidden = true)
+    private Long createUser;
+
+    /**
+     * 修改时间
+     */
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @ApiModelProperty(value = "修改时间", hidden = true)
+    private LocalDateTime updateTime;
+
+    /**
+     * 修改人
+     */
+    @ApiModelProperty(value = "修改人", hidden = true)
+    private Long updateUser;
+}

+ 118 - 0
blade-service-api/blade-business-api/src/main/java/org/springblade/business/entity/StandardFile.java

@@ -0,0 +1,118 @@
+package org.springblade.business.entity;
+
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import java.util.Date;
+import lombok.Data;
+
+/**
+ * 规范文件表
+ * @TableName u_standard_file
+ */
+@TableName(value ="u_standard_file")
+@Data
+public class StandardFile {
+    /**
+     * 
+     */
+    @TableId
+    private Long id;
+
+    /**
+     * 规范id
+     */
+    private Long standardId;
+
+    /**
+     * 文件名称
+     */
+    private String fileName;
+
+    /**
+     * 规范文件路径
+     */
+    private String standardFileUrl;
+
+    /**
+     *  是否删除(0-正常,1-已删除)
+     */
+    private Integer isDeleted;
+
+    /**
+     *  创建时间
+     */
+    private Date createTime;
+
+    /**
+     *  创建人
+     */
+    private Long createUser;
+
+    /**
+     *  修改时间
+     */
+    private Date updateTime;
+
+    /**
+     *  修改人
+     */
+    private Long updateUser;
+
+    @Override
+    public boolean equals(Object that) {
+        if (this == that) {
+            return true;
+        }
+        if (that == null) {
+            return false;
+        }
+        if (getClass() != that.getClass()) {
+            return false;
+        }
+        StandardFile other = (StandardFile) that;
+        return (this.getId() == null ? other.getId() == null : this.getId().equals(other.getId()))
+            && (this.getStandardId() == null ? other.getStandardId() == null : this.getStandardId().equals(other.getStandardId()))
+            && (this.getFileName() == null ? other.getFileName() == null : this.getFileName().equals(other.getFileName()))
+            && (this.getStandardFileUrl() == null ? other.getStandardFileUrl() == null : this.getStandardFileUrl().equals(other.getStandardFileUrl()))
+            && (this.getIsDeleted() == null ? other.getIsDeleted() == null : this.getIsDeleted().equals(other.getIsDeleted()))
+            && (this.getCreateTime() == null ? other.getCreateTime() == null : this.getCreateTime().equals(other.getCreateTime()))
+            && (this.getCreateUser() == null ? other.getCreateUser() == null : this.getCreateUser().equals(other.getCreateUser()))
+            && (this.getUpdateTime() == null ? other.getUpdateTime() == null : this.getUpdateTime().equals(other.getUpdateTime()))
+            && (this.getUpdateUser() == null ? other.getUpdateUser() == null : this.getUpdateUser().equals(other.getUpdateUser()));
+    }
+
+    @Override
+    public int hashCode() {
+        final int prime = 31;
+        int result = 1;
+        result = prime * result + ((getId() == null) ? 0 : getId().hashCode());
+        result = prime * result + ((getStandardId() == null) ? 0 : getStandardId().hashCode());
+        result = prime * result + ((getFileName() == null) ? 0 : getFileName().hashCode());
+        result = prime * result + ((getStandardFileUrl() == null) ? 0 : getStandardFileUrl().hashCode());
+        result = prime * result + ((getIsDeleted() == null) ? 0 : getIsDeleted().hashCode());
+        result = prime * result + ((getCreateTime() == null) ? 0 : getCreateTime().hashCode());
+        result = prime * result + ((getCreateUser() == null) ? 0 : getCreateUser().hashCode());
+        result = prime * result + ((getUpdateTime() == null) ? 0 : getUpdateTime().hashCode());
+        result = prime * result + ((getUpdateUser() == null) ? 0 : getUpdateUser().hashCode());
+        return result;
+    }
+
+    @Override
+    public String toString() {
+        StringBuilder sb = new StringBuilder();
+        sb.append(getClass().getSimpleName());
+        sb.append(" [");
+        sb.append("Hash = ").append(hashCode());
+        sb.append(", id=").append(id);
+        sb.append(", standardId=").append(standardId);
+        sb.append(", fileName=").append(fileName);
+        sb.append(", standardFileUrl=").append(standardFileUrl);
+        sb.append(", isDeleted=").append(isDeleted);
+        sb.append(", createTime=").append(createTime);
+        sb.append(", createUser=").append(createUser);
+        sb.append(", updateTime=").append(updateTime);
+        sb.append(", updateUser=").append(updateUser);
+        sb.append("]");
+        return sb.toString();
+    }
+}

+ 107 - 0
blade-service-api/blade-business-api/src/main/java/org/springblade/business/entity/StandardInfo.java

@@ -0,0 +1,107 @@
+package org.springblade.business.entity;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+
+import java.util.Date;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import org.hibernate.validator.constraints.Range;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+
+/**
+ * 规范参数管理-基础信息
+ *
+ * @author LHB
+ * @TableName u_standard_info
+ */
+@TableName(value = "u_standard_info")
+@Data
+@ApiModel(description = "规范参数管理-基础信息")
+public class StandardInfo {
+    /**
+     *
+     */
+    @TableId
+    @ApiModelProperty(value = "主键")
+    private Long id;
+
+    /**
+     * 名称(样品信息名称)
+     */
+    @NotBlank(message = "名称不能为空")
+    @ApiModelProperty(value = "名称(样品信息名称)")
+    private String name;
+    /**
+     * 符号
+     */
+    @ApiModelProperty(value = "符号")
+    private String symbol;
+
+    /**
+     * 父级节点id
+     */
+    @ApiModelProperty(value = "父级节点id")
+    private Long parentId;
+
+    /**
+     * 规范文件id
+     */
+    @ApiModelProperty(value = "规范文件id")
+    private Long standardId;
+
+    /**
+     * 类型(1-样品信息,2-技术指标)
+     */
+    @ApiModelProperty(value = "类型(1-样品信息,2-技术指标)")
+    @NotNull(message = "类型不能为空")
+    @Range(min = 1, max = 2, message = "类型只能为1或2")
+    private Integer type;
+
+    /**
+     * 是否删除(0-正常,1-已删除)
+     */
+    @ApiModelProperty(value = "是否删除(0-正常,1-已删除)")
+    private Integer isDeleted;
+
+    /**
+     * 创建时间
+     */
+    @ApiModelProperty(value = "创建时间", hidden = true)
+    private Date createTime;
+
+    /**
+     * 创建人
+     */
+    @ApiModelProperty(value = "创建人", hidden = true)
+    private Long createUser;
+
+    /**
+     * 修改时间
+     */
+    @ApiModelProperty(value = "修改时间", hidden = true)
+    private Date updateTime;
+
+    /**
+     * 修改人
+     */
+    @ApiModelProperty(value = "修改人", hidden = true)
+    private Long updateUser;
+
+    /**
+     * 符号名称
+     */
+    @TableField(exist = false)
+    private String symbolName;
+
+    /**
+     * 父级名称
+     */
+    @TableField(exist = false)
+    private String parentName;
+}

+ 62 - 0
blade-service-api/blade-business-api/src/main/java/org/springblade/business/entity/StandardInfoJoin.java

@@ -0,0 +1,62 @@
+package org.springblade.business.entity;
+
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import java.util.Date;
+import lombok.Data;
+
+/**
+ * 样品信息关联表
+ * @author LHB
+ * @TableName u_standard_info_join
+ */
+@TableName(value ="u_standard_info_join")
+@Data
+public class StandardInfoJoin {
+    /**
+     * 
+     */
+    @TableId
+    private Long id;
+
+    /**
+     * 组Id
+     */
+    private Long groupId;
+    /**
+     * 规范基础信息关联主id
+     */
+    private Long standardInfoLeftId;
+
+    /**
+     * 规范基础信息关联副id
+     */
+    private Long standardInfoRightId;
+
+    /**
+     *  是否删除(0-正常,1-已删除)
+     */
+    private Integer isDeleted;
+
+    /**
+     *  创建时间
+     */
+    private Date createTime;
+
+    /**
+     *  创建人
+     */
+    private Long createUser;
+
+    /**
+     *  修改时间
+     */
+    private Date updateTime;
+
+    /**
+     *  修改人
+     */
+    private Long updateUser;
+
+
+}

+ 103 - 0
blade-service-api/blade-business-api/src/main/java/org/springblade/business/entity/StandardInfoPrivateJoin.java

@@ -0,0 +1,103 @@
+package org.springblade.business.entity;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import java.util.Date;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+
+/**
+ * 样品信息与试验表 关联表
+ * @author LHB
+ * @TableName u_standard_info_private_join
+ */
+@TableName(value ="u_standard_info_private_join")
+@Data
+
+@ApiModel(description = "副连接信息集合")
+public class StandardInfoPrivateJoin {
+    /**
+     * 
+     */
+    @TableId
+    @ApiModelProperty(value = "主键", required = true)
+    private Long id;
+
+    /**
+     * 组id
+     */
+    @ApiModelProperty(value = "组id", hidden = false)
+    private Long groupId;
+    /**
+     * 规范基础信息关联主id
+     */
+    @NotNull(message = "规范基础信息关联主id不能为空")
+    @ApiModelProperty(value = "规范基础信息关联主id", hidden = true)
+    private Long standardInfoId;
+
+    /**
+     * 试验wbs表单id
+     */
+    @NotNull(message = "试验wbs表单id不能为空")
+    @ApiModelProperty(value = "试验wbs表单id", required = true)
+    private Long privateId;
+
+    /**
+     * 元素key
+     */
+    @NotBlank(message = "元素key不能为空")
+    @ApiModelProperty(value = "元素key", required = true)
+    private String colKey;
+
+    /**
+     * 元素名称
+     */
+    @NotBlank(message = "元素名称不能为空")
+    @ApiModelProperty(value = "元素名称", required = true)
+    private String colName;
+
+    /**
+     *  是否删除(0-正常,1-已删除)
+     */
+    @ApiModelProperty(value = "是否删除(0-正常,1-已删除)")
+    private Integer isDeleted;
+
+    /**
+     *  创建时间
+     */
+    @ApiModelProperty(value = "创建时间", hidden = true)
+    private Date createTime;
+
+    /**
+     *  创建人
+     */
+    @ApiModelProperty(value = "创建人", hidden = true)
+    private Long createUser;
+
+    /**
+     *  修改时间
+     */
+    @ApiModelProperty(value = "修改时间", hidden = true)
+    private Date updateTime;
+
+    /**
+     *  修改人
+     */
+    @ApiModelProperty(value = "修改人", hidden = true)
+    private Long updateUser;
+
+
+    /**
+     * 表单名称(展示用)
+     */
+    @ApiModelProperty(value = "表单名称(展示用)")
+    @TableField(exist = false)
+    private String privateName;
+
+}

+ 20 - 0
blade-service-api/blade-business-api/src/main/java/org/springblade/business/vo/StandardElementVo.java

@@ -0,0 +1,20 @@
+package org.springblade.business.vo;
+
+import lombok.Data;
+
+
+/**
+ * @author LHB
+ */
+@Data
+public class StandardElementVo {
+    /**
+     * key
+     */
+    private String colKey;
+    /**
+     * name
+     */
+    private String colName;
+
+}

+ 26 - 0
blade-service-api/blade-business-api/src/main/java/org/springblade/business/vo/StandardInfoConditionVo.java

@@ -0,0 +1,26 @@
+package org.springblade.business.vo;
+
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.springblade.business.entity.StandardInfo;
+
+import java.util.List;
+
+/**
+ * 试验-规范管理-信息-条件设置
+ * @author LHB
+ */
+@EqualsAndHashCode(callSuper = true)
+@Data
+public class StandardInfoConditionVo extends StandardInfo {
+    /**
+     * 子级信息
+     */
+    private List<StandardInfo> rightStandardInfos;
+
+
+    /**
+     * 子级信息
+     */
+    private StandardInfoGroupNameVO standardInfoGroupNameVO;
+}

+ 17 - 0
blade-service-api/blade-business-api/src/main/java/org/springblade/business/vo/StandardInfoDtoVo.java

@@ -0,0 +1,17 @@
+package org.springblade.business.vo;
+
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.springblade.business.dto.StandardInfoDTO;
+
+/**
+ * @author LHB
+ */
+@EqualsAndHashCode(callSuper = true)
+@Data
+public class StandardInfoDtoVo extends StandardInfoDTO {
+    /**
+     * 符号拼接名称
+     */
+    private String symbolName;
+}

+ 21 - 0
blade-service-api/blade-business-api/src/main/java/org/springblade/business/vo/StandardInfoGroupNameVO.java

@@ -0,0 +1,21 @@
+package org.springblade.business.vo;
+
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * 条件查询最子层响应处理
+ * @author LHB
+ */
+@Data
+public class StandardInfoGroupNameVO {
+    /**
+     * 名称
+     */
+    private String name;
+    /**
+     * ids
+     */
+    private List<Long> ids;
+}

+ 38 - 0
blade-service-api/blade-business-api/src/main/java/org/springblade/business/vo/StandardInfoPrivateJoinGroupVO.java

@@ -0,0 +1,38 @@
+package org.springblade.business.vo;
+
+import lombok.Data;
+import org.springblade.business.entity.StandardInfoPrivateJoin;
+
+import java.util.List;
+
+/**
+ * 项目组
+ * @author LHB
+ */
+@Data
+public class StandardInfoPrivateJoinGroupVO {
+    /**
+     * leftId
+     */
+    private Long standardInfoId;
+    /**
+     * 项目id
+     */
+    private Long privateId;
+
+    /**
+     * 项目名称
+     */
+    private String privateName;
+
+    /**
+     * 元素名称
+     */
+    private String elementNames;
+
+    /**
+     * 元素key集合
+     */
+    private List<StandardElementVo> keys;
+
+}

+ 26 - 0
blade-service-api/blade-business-api/src/main/java/org/springblade/business/vo/StandardInfoPrivateJoinVO.java

@@ -0,0 +1,26 @@
+package org.springblade.business.vo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.springblade.business.entity.StandardInfo;
+import org.springblade.business.entity.StandardInfoPrivateJoin;
+
+import java.util.List;
+
+/**
+ * @author LHB
+ */
+@EqualsAndHashCode(callSuper = true)
+@Data
+@ApiModel(description = "关联元素对象-视图")
+public class StandardInfoPrivateJoinVO extends StandardInfo {
+    @ApiModelProperty(value = "组id")
+    private Long groupId;
+    /**
+     * 项目组集合
+     */
+    @ApiModelProperty(value = "项目组集合")
+    private List<StandardInfoPrivateJoinGroupVO> group;
+}

+ 28 - 0
blade-service-api/blade-business-api/src/main/java/org/springblade/business/vo/StandardInfoVO.java

@@ -0,0 +1,28 @@
+package org.springblade.business.vo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.springblade.business.entity.StandardInfo;
+
+import java.util.List;
+
+/**
+ * @author LHB
+ */
+@EqualsAndHashCode(callSuper = true)
+@Data
+@ApiModel(description = "条件设置对象")
+public class StandardInfoVO extends StandardInfo {
+    /**
+     * 分组id
+     */
+    @ApiModelProperty(value = "分组id")
+    private Long groupId;
+    /**
+     * 副连接对象
+     */
+    @ApiModelProperty(value = "副连接对象集合")
+    private List<StandardInfoConditionVo> standardInfos;
+}

+ 212 - 0
blade-service/blade-business/src/main/java/org/springblade/business/controller/PrivateStandardController.java

@@ -0,0 +1,212 @@
+package org.springblade.business.controller;
+
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiOperation;
+import org.springblade.business.dto.PrivateStandardDTO;
+import org.springblade.business.entity.PrivateStandard;
+import org.springblade.business.entity.StandardFile;
+import org.springblade.business.service.PrivateStandardService;
+import org.springblade.business.service.StandardFileService;
+import org.springblade.common.utils.SnowFlakeUtil;
+import org.springblade.core.mp.support.Query;
+import org.springblade.core.secure.BladeUser;
+import org.springblade.core.secure.utils.SecureUtil;
+import org.springblade.core.tool.api.R;
+import org.springblade.core.tool.utils.BeanUtil;
+import org.springblade.core.tool.utils.CollectionUtil;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.annotation.Resource;
+import java.util.List;
+
+/**
+ * 规范文件夹及规范文件表(UWbsPrivateStandard)表控制层
+ *
+ * @author makejava
+ * @since 2025-06-10 11:09:22
+ */
+@RestController
+@RequestMapping("PrivateStandard")
+@Api(tags = "试验-规范管理-规范文件夹及规范文件接口")
+public class PrivateStandardController {
+    /**
+     * 服务对象
+     */
+    @Resource
+    private PrivateStandardService privateStandardService;
+
+    @Resource
+    private StandardFileService standardFileService;
+
+    /**
+     * 分页查询所有数据
+     *
+     * @param query               分页对象
+     * @param privateStandard 查询实体
+     * @return 所有数据
+     */
+    @GetMapping("page")
+    @ApiOperation(value = "分页查询所有数据", notes = "传入分页对象和高级查询对象")
+    public R<IPage<PrivateStandardDTO>> selectAll(Query query, PrivateStandard privateStandard) {
+        try {
+            Page page = new Page(query.getCurrent(), query.getSize());
+            IPage<PrivateStandardDTO> resultPage = this.privateStandardService.page(page, new QueryWrapper<>(privateStandard));
+            if(privateStandard.getType() != null && privateStandard.getType() == 2){
+                List<PrivateStandardDTO> privateStandardDTOS = BeanUtil.copyProperties(resultPage.getRecords(), PrivateStandardDTO.class);
+                for (PrivateStandardDTO record : privateStandardDTOS) {
+                    List<StandardFile> list = standardFileService.list(Wrappers.<StandardFile>lambdaQuery()
+                            .eq(StandardFile::getStandardId, record.getId())
+                            .eq(StandardFile::getIsDeleted, 0)
+                            .last("limit 1"));
+                    record.setStandardFile(CollectionUtils.isNotEmpty(list) ? list.get(0) : null);
+                }
+                resultPage.setRecords(privateStandardDTOS);
+            }
+            return R.data(resultPage);
+        } catch (Exception e) {
+            // 可根据实际需求记录日志或返回特定错误信息
+            return R.fail("查询失败");
+        }
+    }
+
+
+    /**
+     * 通过主键查询单条数据
+     *
+     * @param id 主键
+     * @return 单条数据
+     */
+    @ApiOperation(value = "通过主键查询单条数据", notes = "传入主键Id")
+    @ApiImplicitParam(name = "id", value = "主键id", required = true)
+    @GetMapping("/getById")
+    public R<PrivateStandardDTO> selectOne(Long id) {
+        PrivateStandard byId = this.privateStandardService.getById(id);
+        List<StandardFile> list = standardFileService.list(Wrappers.<StandardFile>lambdaQuery()
+                .eq(StandardFile::getStandardId, id)
+                .eq(StandardFile::getIsDeleted, 0));
+
+        PrivateStandardDTO privateStandardDTO = BeanUtil.copyProperties(byId, PrivateStandardDTO.class);
+        privateStandardDTO.setStandardFiles(list);
+        return R.data(privateStandardDTO);
+    }
+
+    /**
+     * 新增数据
+     *
+     * @param privateStandard 实体对象
+     * @return 新增结果
+     */
+    @PostMapping("add")
+    @ApiOperation(value = "新增数据", notes = "privateStandard")
+    @ApiImplicitParam(name = "privateStandard", value = "实体对象", required = true)
+    public R<Boolean> insert(@RequestPart("data") @Validated PrivateStandardDTO privateStandard,@RequestPart("files") MultipartFile[] files) {
+        privateStandard.setId(SnowFlakeUtil.getId());
+        privateStandard.setFiles(files);
+        if (privateStandard.getType() != 1 && privateStandard.getType() != 2) {
+            return R.fail("类型错误");
+        }
+        if (privateStandard.getType() == 1) {
+            privateStandard.setParentId(0L);
+            if (privateStandard.getPrivateId() == null) {
+                return R.fail("节点不能为空");
+            }
+        } else {
+            if (privateStandard.getParentId() == null) {
+                return R.fail("父级节点不能为空");
+            }
+            if (privateStandard.getIssueDate() == null) {
+                return R.fail("下达日期不能为空");
+            }
+            if (privateStandard.getActualizeDate() == null) {
+                return R.fail("实施日期不能为空");
+            }
+        }
+        boolean save = this.privateStandardService.insert(privateStandard);
+        return R.data(save);
+    }
+
+
+    /**
+     * 规范文件修改数据
+     *
+     * @param data 实体对象
+     * @param delIds 需要删除的规范文件id集合
+     * @param delFileIds 需要删除的文件id集合
+     * @param files 文件
+     * @return 新增结果
+     */
+    @PostMapping("updateTypeByTwo")
+    @ApiOperation(value = "规范文件修改数据")
+    public R<Boolean> updateTypeByTwo(@RequestPart("data") @Validated List<PrivateStandardDTO> data,
+                             @RequestPart("delIds")  List<Long> delIds,
+                             @RequestPart("delFileIds") List<Long> delFileIds,
+                             @RequestPart("files") MultipartFile[] files) {
+        //封装数据
+        boolean save = this.privateStandardService.updateTypeByTwo(data,delIds,delFileIds,files);
+        return R.data(save);
+    }
+
+    /**
+     * 修改数据
+     *
+     * @param privateStandards 实体对象
+     * @return 修改结果
+     */
+    @ApiOperation(value = "修改数据")
+    @PostMapping("edit")
+    @ApiImplicitParam(name = "privateStandards", value = "实体对象", required = true)
+    public R<Boolean> update(@RequestBody @Validated List<PrivateStandardDTO> privateStandards) {
+        BladeUser user = SecureUtil.getUser();
+        privateStandards.forEach(f -> f.setUpdateUser(user.getUserId()));
+        boolean b = this.privateStandardService.update(privateStandards);
+        return R.data(b);
+    }
+
+    /**
+     * 删除数据
+     *
+     * @param id 主键
+     * @return 删除结果
+     */
+    @ApiOperation(value = "删除数据")
+    @GetMapping("/delete")
+    @ApiImplicitParam(name = "id", value = "主键id", required = true)
+    public R<Boolean> delete(Long id) {
+        boolean b = this.privateStandardService.delete(id);
+        return R.data(b);
+    }
+
+    /**
+     * 删除文件
+     */
+    @ApiOperation(value = "删除文件")
+    @GetMapping("/deleteFile")
+    @ApiImplicitParam(name = "id", value = "文件Id", required = true)
+    public R<Boolean> deleteFile(Long id) {
+        boolean b = this.privateStandardService.deleteFile(id);
+        return R.data(b);
+    }
+
+    /**
+     * 规范更新
+     * @param id 规范文件id
+     */
+    @ApiOperation(value = "规范更新")
+    @GetMapping("/standardUpdate")
+    @ApiImplicitParam(name = "id", value = "规范文件id", required = true)
+    public R<Long> standardUpdate(Long id) {
+        Long b = this.privateStandardService.standardUpdate(id);
+        return R.data(b);
+    }
+
+}
+

+ 224 - 0
blade-service/blade-business/src/main/java/org/springblade/business/controller/StandardInfoController.java

@@ -0,0 +1,224 @@
+package org.springblade.business.controller;
+
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
+import org.springblade.business.dto.StandardInfoDTO;
+import org.springblade.business.dto.StandardInfoJoinDTO;
+import org.springblade.business.dto.StandardInfoPrivateJoinDTO;
+import org.springblade.business.entity.StandardInfo;
+import org.springblade.business.service.StandardInfoService;
+import org.springblade.business.vo.StandardInfoDtoVo;
+import org.springblade.business.vo.StandardInfoPrivateJoinVO;
+import org.springblade.business.vo.StandardInfoVO;
+import org.springblade.core.mp.support.Query;
+import org.springblade.core.tool.api.R;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import java.util.List;
+
+/**
+ * 规范参数管理-基础信息(UStandardInfo)表控制层
+ *
+ * @author makejava
+ * @since 2025-06-11 10:03:01
+ */
+@RestController
+@RequestMapping("uStandardInfo")
+@Api(tags = "试验-规范管理-基础信息接口")
+public class StandardInfoController {
+    /**
+     * 服务对象
+     */
+    @Resource
+    private StandardInfoService uStandardInfoService;
+
+    /**
+     * 分页查询所有数据
+     *
+     * @param query        分页对象
+     * @param standardInfo 查询实体
+     * @return 所有数据
+     */
+    @GetMapping("page")
+    @ApiOperation(value = "分页查询所有数据", notes = "传入分页对象和高级查询对象")
+    public R<IPage<StandardInfoDTO>> selectAll(Query query, StandardInfo standardInfo) {
+        IPage<StandardInfoDTO> page = this.uStandardInfoService.selectMyPage(query, standardInfo);
+        return R.data(page);
+    }
+
+    /**
+     * 通过主键查询单条数据
+     *
+     * @param id 主键
+     * @return 单条数据
+     */
+    @GetMapping("/getById")
+    @ApiOperation(value = "通过主键查询单条数据", notes = "传入主键Id")
+    @ApiImplicitParam(name = "id", value = "主键", required = true)
+    public R<StandardInfoDTO> selectOne(Long id) {
+        StandardInfoDTO dto = this.uStandardInfoService.selectOne(id);
+        return R.data(dto);
+    }
+
+    /**
+     * 新增数据
+     *
+     * @param standardInfo 实体对象
+     * @return 新增结果
+     */
+    @PostMapping("add")
+    @ApiOperation(value = "新增数据")
+    public R<Boolean> insert(@RequestBody @Validated StandardInfoDTO standardInfo) {
+        Boolean b = this.uStandardInfoService.insert(standardInfo);
+        return R.data(b);
+    }
+
+    /**
+     * 修改数据
+     *
+     * @param standardInfo 实体对象
+     * @return 修改结果
+     */
+    @PostMapping("edit")
+    @ApiOperation(value = "修改数据")
+    public R<Boolean> update(@RequestBody @Validated StandardInfoDTO standardInfo) {
+        Boolean b = this.uStandardInfoService.edit(standardInfo);
+        return R.data(b);
+    }
+
+    /**
+     * 删除数据
+     *
+     * @param id 主键
+     * @return 删除结果
+     */
+    @ApiOperation(value = "删除数据")
+    @ApiImplicitParam(name = "id", value = "主键", required = true)
+    @GetMapping("/delete")
+    public R<Boolean> delete(Long id) {
+        Boolean b = this.uStandardInfoService.delete(id);
+        return R.data(b);
+    }
+
+
+    /**
+     * 条件设置
+     *
+     * @param standardInfoJoins 条件设置对象
+     * @param id                规范文件id
+     * @return 结果
+     */
+    @ApiOperation(value = "条件设置")
+    @PostMapping("saveConditionSet")
+    public R<Boolean> setCondition(@RequestBody @Validated List<StandardInfoVO> standardInfoJoins,
+                                   @RequestParam Long id) {
+        Boolean b = this.uStandardInfoService.setCondition(standardInfoJoins, id);
+        return R.data(b);
+    }
+
+    /**
+     * 关联元素
+     *
+     * @param standardInfoPrivateJoins 关联元素对象
+     * @return 结果
+     */
+    @ApiOperation(value = "关联元素")
+    @PostMapping("saveElementJoin")
+    public R<Boolean> setElementJoin(@RequestBody @Validated List<StandardInfoPrivateJoinVO> standardInfoPrivateJoins,
+                                     @RequestParam Long id) {
+        Boolean b = this.uStandardInfoService.setElementJoin(standardInfoPrivateJoins, id);
+        return R.data(b);
+    }
+
+    /**
+     * 删除条件设置
+     *
+     * @param leftId 主关联id
+     * @return 删除结果
+     */
+    @ApiOperation(value = "删除条件设置")
+    @ApiImplicitParam(name = "groupId", value = "组id", required = true)
+    @GetMapping("deleteConditionSet")
+    public R<Boolean> deleteConditionSet(Long groupId) {
+        Boolean b = this.uStandardInfoService.deleteConditionSet(groupId);
+        return R.data(b);
+    }
+
+    /**
+     * 删除关联元素
+     *
+     * @param leftId 主关联id
+     * @return 删除结果
+     */
+    @ApiOperation(value = "删除关联元素")
+    @ApiImplicitParam(name = "groupId", value = "组id", required = true)
+    @GetMapping("deleteElementJoin")
+    public R<Boolean> deleteElementJoin(Long groupId) {
+        Boolean b = this.uStandardInfoService.deleteElementJoin(groupId);
+        return R.data(b);
+    }
+
+    /**
+     * 查询条件设置
+     *
+     * @param id 规范文件id
+     * @param leftId 条件设置组id
+     * @param groupId 文件信息组id
+     */
+    @ApiOperation(value = "查询条件设置")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "id", value = "规范文件id", required = true),
+            @ApiImplicitParam(name = "leftId", value = "条件设置组id"),
+            @ApiImplicitParam(name = "groupId", value = "文件信息组id", required = true),
+            @ApiImplicitParam(name = "joinGroupId", value = "条件设置组id")
+
+    })
+    @GetMapping("getConditionSet")
+    public R<List<StandardInfoVO>> getConditionSet(Long id, Long leftId, Long groupId, Long joinGroupId) {
+        List<StandardInfoVO> list = this.uStandardInfoService.getConditionSet(id, leftId, groupId, joinGroupId);
+        return R.data(list);
+    }
+
+    /**
+     * 查询关联元素
+     *
+     * @param id 规范文件id
+     * @param leftId 文件信息Id
+     * @param groupId 文件信息组id
+     */
+    @ApiOperation(value = "查询关联元素")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "id", value = "规范文件id", required = true),
+            @ApiImplicitParam(name = "leftId", value = "文件信息Id"),
+            @ApiImplicitParam(name = "groupId", value = "文件信息组id", required = true),
+            @ApiImplicitParam(name = "joinGroupId", value = "条件设置组id")
+
+    })
+    @GetMapping("getElementJoin")
+    public R<List<StandardInfoPrivateJoinVO>> getElementJoin(Long id, Long leftId, Long groupId, Long joinGroupId) {
+        List<StandardInfoPrivateJoinVO> list = this.uStandardInfoService.getElementJoin(id, leftId, groupId, joinGroupId);
+        return R.data(list);
+    }
+
+    /**
+     * 效果预览
+     *
+     * @param ids standardInfo type=1的子级id集合
+     */
+    @ApiOperation(value = "效果预览")
+    @ApiImplicitParam(name = "ids", value = "standardInfo type=2的id集合", required = true)
+    @GetMapping("effectPreview")
+    public R<List<StandardInfoPrivateJoinVO>> effectPreview(String ids) {
+        List<StandardInfoPrivateJoinVO> list = this.uStandardInfoService.effectPreview(ids);
+        return R.data(list);
+    }
+
+
+}
+

+ 20 - 0
blade-service/blade-business/src/main/java/org/springblade/business/mapper/PrivateStandardMapper.java

@@ -0,0 +1,20 @@
+package org.springblade.business.mapper;
+
+import org.apache.ibatis.annotations.Param;
+import org.springblade.business.entity.PrivateStandard;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+* @author LHB
+* @description 针对表【u_wbs_private_standard(规范文件夹及规范文件表)】的数据库操作Mapper
+* @createDate 2025-06-10 10:48:37
+* @Entity generator.domain.UWbsPrivateStandard
+*/
+public interface PrivateStandardMapper extends BaseMapper<PrivateStandard> {
+
+    void updateStatus(@Param("parentId") Long parentId);
+}
+
+
+
+

+ 35 - 0
blade-service/blade-business/src/main/java/org/springblade/business/mapper/PrivateStandardMapper.xml

@@ -0,0 +1,35 @@
+<?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.business.mapper.PrivateStandardMapper">
+
+    <resultMap id="BaseResultMap" type="org.springblade.business.entity.PrivateStandard">
+            <id property="id" column="id" />
+            <result property="name" column="name" />
+            <result property="parentId" column="parent_id" />
+            <result property="privateId" column="private_id" />
+            <result property="type" column="type" />
+            <result property="issueDate" column="issue_date" />
+            <result property="actualizeDate" column="actualize_date" />
+            <result property="isDeleted" column="is_deleted" />
+            <result property="createTime" column="create_time" />
+            <result property="createUser" column="create_user" />
+            <result property="updateTime" column="update_time" />
+            <result property="updateUser" column="update_user" />
+    </resultMap>
+
+    <sql id="Base_Column_List">
+        id,name,parent_id,private_id,type,issue_date,
+        actualize_date,is_deleted,create_time,create_user,
+        update_time,update_user
+    </sql>
+    <update id="updateStatus">
+        UPDATE u_wbs_private_standard
+        SET `status` = 2,
+            `name` = concat( NAME, '-已过期' )
+        WHERE
+            parent_id = #{parentId}
+          AND STATUS = 1
+    </update>
+</mapper>

+ 18 - 0
blade-service/blade-business/src/main/java/org/springblade/business/mapper/StandardFileMapper.java

@@ -0,0 +1,18 @@
+package org.springblade.business.mapper;
+
+import org.springblade.business.entity.StandardFile;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+* @author LHB
+* @description 针对表【u_standard_file(规范文件表)】的数据库操作Mapper
+* @createDate 2025-06-13 09:24:14
+* @Entity generator.domain.UStandardFile
+*/
+public interface StandardFileMapper extends BaseMapper<StandardFile> {
+
+}
+
+
+
+

+ 23 - 0
blade-service/blade-business/src/main/java/org/springblade/business/mapper/StandardFileMapper.xml

@@ -0,0 +1,23 @@
+<?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.business.mapper.StandardFileMapper">
+
+    <resultMap id="BaseResultMap" type="org.springblade.business.entity.StandardFile">
+            <id property="id" column="id" />
+            <result property="standardId" column="standard_id" />
+            <result property="fileName" column="file_name" />
+            <result property="standardFileUrl" column="standard_file_url" />
+            <result property="isDeleted" column="is_deleted" />
+            <result property="createTime" column="create_time" />
+            <result property="createUser" column="create_user" />
+            <result property="updateTime" column="update_time" />
+            <result property="updateUser" column="update_user" />
+    </resultMap>
+
+    <sql id="Base_Column_List">
+        id,standard_id,file_name,standard_file_url,is_deleted,create_time,
+        create_user,update_time,update_user
+    </sql>
+</mapper>

+ 28 - 0
blade-service/blade-business/src/main/java/org/springblade/business/mapper/StandardInfoJoinMapper.java

@@ -0,0 +1,28 @@
+package org.springblade.business.mapper;
+
+import org.apache.ibatis.annotations.Param;
+import org.springblade.business.entity.StandardInfoJoin;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+* @author LHB
+* @description 针对表【u_standard_info_join(样品信息关联表)】的数据库操作Mapper
+* @createDate 2025-06-11 09:57:39
+* @Entity org.springblade.business.entity.UStandardInfoJoin
+*/
+public interface StandardInfoJoinMapper extends BaseMapper<StandardInfoJoin> {
+
+    /**
+     * 软删除
+     * @param userId 用户 id
+     * @param isDeleted 删除状态
+     * @param standardId 规范文件id
+     */
+    void updateJoin(@Param("userId") Long userId,
+                    @Param("isDeleted") int isDeleted,
+                    @Param("standardId") Long standardId);
+}
+
+
+
+

+ 32 - 0
blade-service/blade-business/src/main/java/org/springblade/business/mapper/StandardInfoJoinMapper.xml

@@ -0,0 +1,32 @@
+<?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.business.mapper.StandardInfoJoinMapper">
+
+    <resultMap id="BaseResultMap" type="org.springblade.business.entity.StandardInfoJoin">
+            <id property="id" column="id" />
+            <result property="groupId" column="group_id" />
+            <result property="standardInfoLeftId" column="standard_info_left_id" />
+            <result property="standardInfoRightId" column="standard_info_right_id" />
+            <result property="isDeleted" column="is_deleted" />
+            <result property="createTime" column="create_time" />
+            <result property="createUser" column="create_user" />
+            <result property="updateTime" column="update_time" />
+            <result property="updateUser" column="update_user" />
+    </resultMap>
+
+    <sql id="Base_Column_List">
+        id,group_id,standard_info_left_id,standard_info_right_id,is_deleted,create_time,create_user,
+        update_time,update_user
+    </sql>
+    <update id="updateJoin">
+        UPDATE u_standard_info_join a
+            INNER JOIN u_standard_info b ON a.standard_info_left_id = b.id
+        SET a.is_deleted = #{isDeleted},
+            a.update_user = #{userId}
+        WHERE
+            b.is_deleted = 0
+          AND b.standard_id = #{standardId}
+    </update>
+</mapper>

+ 45 - 0
blade-service/blade-business/src/main/java/org/springblade/business/mapper/StandardInfoMapper.java

@@ -0,0 +1,45 @@
+package org.springblade.business.mapper;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import org.apache.ibatis.annotations.Param;
+import org.springblade.business.dto.StandardInfoDTO;
+import org.springblade.business.entity.StandardInfo;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.springblade.business.vo.StandardInfoDtoVo;
+import org.springblade.business.vo.StandardInfoPrivateJoinVO;
+import org.springblade.business.vo.StandardInfoVO;
+
+import java.util.List;
+
+/**
+ * @author LHB
+ * @description 针对表【u_standard_info(规范参数管理-基础信息)】的数据库操作Mapper
+ * @createDate 2025-06-11 09:57:39
+ * @Entity org.springblade.business.entity.UStandardInfo
+ */
+public interface StandardInfoMapper extends BaseMapper<StandardInfo> {
+
+    IPage<StandardInfoDTO> selectMyPage(Page<StandardInfoDTO> page, @Param("query") StandardInfo standardInfo);
+
+    StandardInfoDTO selectMyOne(@Param("id") Long id);
+
+    List<StandardInfoVO> getConditionSet(@Param("id") Long id,
+                                         @Param("leftId") Long leftId,
+                                         @Param("groupId") Long groupId,
+                                         @Param("joinGroupId") Long joinGroupId
+    );
+
+    List<StandardInfoPrivateJoinVO> getElementJoin(@Param("id") Long id,
+                                                   @Param("leftId") Long leftId,
+                                                   @Param("groupId") Long groupId,
+                                                   @Param("joinGroupId") Long joinGroupId
+    );
+
+    List<StandardInfoPrivateJoinVO> effectPreview(@Param("rightIds") List<Long> rightIds,
+                                                  @Param("size") Integer size);
+}
+
+
+
+

+ 305 - 0
blade-service/blade-business/src/main/java/org/springblade/business/mapper/StandardInfoMapper.xml

@@ -0,0 +1,305 @@
+<?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.business.mapper.StandardInfoMapper">
+
+    <resultMap id="BaseResultMap" type="org.springblade.business.entity.StandardInfo">
+        <id property="id" column="id"/>
+        <result property="name" column="name"/>
+        <result property="symbol" column="symbol"/>
+        <result property="parentId" column="parent_id"/>
+        <result property="type" column="type"/>
+        <result property="isDeleted" column="is_deleted"/>
+        <result property="createTime" column="create_time"/>
+        <result property="createUser" column="create_user"/>
+        <result property="updateTime" column="update_time"/>
+        <result property="updateUser" column="update_user"/>
+    </resultMap>
+    <resultMap id="BaseResultPageMap" type="org.springblade.business.dto.StandardInfoDTO">
+        <id property="id" column="id"/>
+        <result property="name" column="name"/>
+        <result property="symbol" column="symbol"/>
+        <result property="parentId" column="parent_id"/>
+        <result property="standardId" column="standard_id"/>
+        <result property="type" column="type"/>
+        <result property="isDeleted" column="is_deleted"/>
+        <result property="createTime" column="create_time"/>
+        <result property="createUser" column="create_user"/>
+        <result property="updateTime" column="update_time"/>
+        <result property="updateUser" column="update_user"/>
+        <collection property="info" ofType="org.springblade.business.entity.StandardInfo" select="findByParentId" column="{parentId=id}">
+        </collection>
+    </resultMap>
+
+    <sql id="Base_Column_List">
+        id
+        ,name,symbol,parent_id,standard_id,type,is_deleted,create_time,
+        create_user,update_time,update_user
+    </sql>
+    <select id="selectMyPage" resultMap="BaseResultPageMap">
+        SELECT
+            <include refid="Base_Column_List"/>
+        FROM
+            u_standard_info
+        <where>
+            is_deleted = 0
+            <if test="query.type != null">
+                AND type = #{query.type}
+            </if>
+            <choose>
+                <when test="query.parentId != null">
+                    AND parent_id = #{query.parentId}
+                </when>
+                <otherwise>
+                    AND parent_id = 0
+                </otherwise>
+            </choose>
+            <if test="query.standardId != null">
+                AND standard_id =  #{query.standardId}
+            </if>
+        </where>
+    </select>
+    <select id="selectMyOne" resultMap="BaseResultPageMap">
+        SELECT
+            <include refid="Base_Column_List"/>
+        FROM
+            u_standard_info
+        WHERE
+            is_deleted = 0 AND
+            id = #{id}
+    </select>
+    <select id="findByParentId" resultType="org.springblade.business.entity.StandardInfo">
+        select
+            <include refid="Base_Column_List"/>,concat(symbol,name) symbolName
+        FROM
+            u_standard_info
+        WHERE
+            is_deleted = 0
+            AND parent_id = #{parentId}
+    </select>
+
+
+
+
+    <!-- ``````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````` -->
+
+    <resultMap id="BaseResultConditionSet" type="org.springblade.business.vo.StandardInfoVO">
+        <id property="id" column="id"/>
+        <result property="name" column="name"/>
+        <result property="parentId" column="parent_id"/>
+        <result property="type" column="type"/>
+        <result property="symbol" column="symbol"/>
+        <result property="symbolName" column="symbolName"/>
+        <result property="groupId" column="group_id"/>
+        <collection property="standardInfos" ofType="org.springblade.business.vo.StandardInfoConditionVo" select="findByJoinLeftId" column="{leftId=id,groupId=group_id}">
+        </collection>
+    </resultMap>
+    <sql id="Base_Column_Join_List">
+        a.id,
+        a.`name`,
+        a.parent_id,
+        a.standard_id,
+        a.`type`,
+        a.is_deleted,
+        a.create_time,
+        a.create_user,
+        a.update_time,
+        a.update_user
+    </sql>
+
+    <select id="getConditionSet" resultMap="BaseResultConditionSet">
+        select
+            <include refid="Base_Column_Join_List"/>, concat(a.symbol,a.name) symbolName,b.group_id
+        from
+            u_standard_info a
+            INNER join u_standard_info p on a.parent_id = p.id and a.is_deleted = p.is_deleted
+            INNER JOIN u_standard_info_join b on a.id = b.standard_info_left_id and a.is_deleted = b.is_deleted
+        where
+            a.is_deleted = 0
+            <if test="id != null">
+                and  a.standard_id = #{id}
+            </if>
+            <if test="leftId != null">
+                and  b.standard_info_left_id = #{leftId}
+            </if>
+            <if test="groupId != null">
+                and  p.id = #{groupId}
+            </if>
+            <if test="joinGroupId != null">
+                and  b.group_id = #{joinGroupId}
+            </if>
+
+        GROUP BY
+            b.group_id,b.standard_info_left_id
+    </select>
+
+    <resultMap id="findByJoinLeftIdMap" type="org.springblade.business.vo.StandardInfoConditionVo">
+        <id property="id" column="id"/>
+        <collection property="rightStandardInfos" ofType="org.springblade.business.entity.StandardInfo" select="findRightByJoinLeftId" column="{id=id,leftId=leftId,groupId=groupId}">
+        </collection>
+    </resultMap>
+
+    <select id="findByJoinLeftId" resultMap="findByJoinLeftIdMap">
+        SELECT
+            c.id,
+            c.`name`,
+            c.parent_id,
+            c.standard_id,
+            c.`type`,
+            c.is_deleted,
+            c.create_time,
+            c.create_user,
+            c.update_time,
+            c.update_user,
+            b.standard_info_left_id leftId,
+            b.group_id groupId
+        FROM
+            u_standard_info a
+            INNER JOIN u_standard_info_join b ON a.id = b.standard_info_right_id AND a.is_deleted = b.is_deleted
+            INNER JOIN u_standard_info c ON a.parent_id = c.id AND a.is_deleted = c.is_deleted
+        WHERE
+            b.standard_info_left_id = #{leftId}
+            <if test="groupId != null">
+                and b.group_id = #{groupId}
+            </if>
+            and a.is_deleted = 0
+        group by
+            c.id
+    </select>
+    <select id="findRightByJoinLeftId" resultType="org.springblade.business.entity.StandardInfo">
+        SELECT
+            <include refid="Base_Column_Join_List"/>
+        FROM
+            u_standard_info a
+            INNER JOIN u_standard_info_join b ON a.id = b.standard_info_right_id AND a.is_deleted = b.is_deleted
+            INNER JOIN u_standard_info c ON a.parent_id = c.id AND a.is_deleted = c.is_deleted
+        WHERE
+            a.parent_id = #{id} and b.standard_info_left_id = #{leftId}
+            <if test="groupId != null">
+                and b.group_id = #{groupId}
+            </if>
+            and a.is_deleted = 0
+        group by
+            a.id
+    </select>
+    <!-- ``````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````` -->
+
+    <resultMap id="BaseResultElementJoin" type="org.springblade.business.vo.StandardInfoPrivateJoinVO">
+        <id property="id" column="id"/>
+        <result property="groupId" column="group_id"/>
+        <result property="name" column="name"/>
+        <result property="parentId" column="parent_id"/>
+        <result property="type" column="type"/>
+        <result property="symbol" column="symbol"/>
+        <result property="symbolName" column="symbolName"/>
+        <collection property="group" ofType="org.springblade.business.vo.StandardInfoPrivateJoinGroupVO" select="findByPrivateJoinLeftId" column="{leftId=id,groupId=group_id}">
+        </collection>
+    </resultMap>
+
+    <sql id="Base_Private_Column_List">
+        a.id,
+        a.standard_info_id,
+        a.private_id,
+        a.col_key,
+        a.col_name,
+        a.is_deleted,
+        a.create_time,
+        a.create_user,
+        a.update_time,
+        a.update_user
+    </sql>
+    <select id="getElementJoin" resultMap="BaseResultElementJoin">
+        select
+            <include refid="Base_Column_Join_List"/>, concat(a.symbol,a.name) symbolName,b.group_id
+        from
+            u_standard_info a
+            INNER JOIN u_standard_info c on a.parent_id = c.id and a.is_deleted = c.is_deleted
+            INNER JOIN u_standard_info_private_join b on a.id = b.standard_info_id and a.is_deleted = b.is_deleted
+        where
+            a.is_deleted = 0
+            <if test="id != null">
+                and  a.standard_id = #{id}
+            </if>
+            <if test="leftId != null">
+                and  b.standard_info_id = #{leftId}
+            </if>
+            <if test="groupId != null">
+                and  c.id = #{groupId}
+            </if>
+        GROUP BY
+            b.group_id,b.standard_info_id
+    </select>
+
+
+    <resultMap id="BaseResultElementGroupPrivate" type="org.springblade.business.vo.StandardInfoPrivateJoinGroupVO">
+        <result property="standardInfoId" column="standard_info_id"/>
+        <result property="privateId" column="private_id"/>
+        <result property="privateName" column="privateName"/>
+        <result property="elementNames" column="elementNames"/>
+        <collection property="keys" ofType="org.springblade.business.vo.StandardElementVo" select="findByPrivateGroupJoinLeftId" column="{standardInfoId=standard_info_id,privateId=private_id,groupId=groupId}">
+        </collection>
+    </resultMap>
+    <select id="findByPrivateJoinLeftId" resultMap="BaseResultElementGroupPrivate">
+        SELECT
+            a.standard_info_id,
+            a.private_id,
+            b.node_name privateName,
+            GROUP_CONCAT(col_name SEPARATOR ',') elementNames,
+            a.group_id groupId
+        FROM
+            u_standard_info_private_join a
+            INNER JOIN m_wbs_tree_private b ON a.private_id = b.p_key_id AND a.is_deleted = b.is_deleted
+        WHERE
+            a.standard_info_id = #{leftId}
+          <if test="groupId!=null">
+              and a.group_id = #{groupId}
+          </if>
+          AND a.is_deleted = 0
+        GROUP BY
+            a.group_id,a.private_id
+    </select>
+
+    <select id="findByPrivateGroupJoinLeftId" resultType="org.springblade.business.vo.StandardElementVo">
+        SELECT
+            col_key,col_name
+        FROM
+        u_standard_info_private_join a
+        INNER JOIN m_wbs_tree_private b ON a.private_id = b.p_key_id AND a.is_deleted = b.is_deleted
+        WHERE
+        a.standard_info_id = #{standardInfoId} and a.private_id = #{privateId}
+        <if test="groupId!=null">
+            and a.group_id = #{groupId}
+        </if>
+        AND a.is_deleted = 0
+    </select>
+
+
+
+
+
+    <!-- ``````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````` -->
+
+
+
+
+    <select id="effectPreview" resultMap="BaseResultElementJoin">
+        SELECT
+            a.*, concat(a.symbol,a.name) symbolName,null group_id
+        FROM
+            u_standard_info a
+                INNER JOIN u_standard_info_join b ON a.id = b.standard_info_left_id
+                LEFT JOIN u_standard_info_private_join c ON a.id = c.standard_info_id
+
+                AND a.is_deleted = b.is_deleted
+        WHERE
+            a.is_deleted = 0
+            AND b.standard_info_right_id in
+            <foreach item="item" collection="rightIds" separator="," open="(" close=")" index="index">
+                #{item}
+            </foreach>
+        GROUP BY
+            b.standard_info_left_id
+        HAVING COUNT(DISTINCT b.standard_info_right_id) = #{size};
+    </select>
+</mapper>

+ 28 - 0
blade-service/blade-business/src/main/java/org/springblade/business/mapper/StandardInfoPrivateJoinMapper.java

@@ -0,0 +1,28 @@
+package org.springblade.business.mapper;
+
+import org.apache.ibatis.annotations.Param;
+import org.springblade.business.entity.StandardInfoPrivateJoin;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+* @author LHB
+* @description 针对表【u_standard_info_private_join(样品信息与试验表 关联表)】的数据库操作Mapper
+* @createDate 2025-06-11 09:57:39
+* @Entity org.springblade.business.entity.UStandardInfoPrivateJoin
+*/
+public interface StandardInfoPrivateJoinMapper extends BaseMapper<StandardInfoPrivateJoin> {
+
+    /**
+     * 软删除
+     * @param userId 用户 id
+     * @param isDeleted 删除状态
+     * @param standardId 规范文件id
+     */
+    void updateJoin(@Param("userId") Long userId,
+                    @Param("isDeleted") int isDeleted,
+                    @Param("standardId") Long standardId);
+}
+
+
+
+

+ 33 - 0
blade-service/blade-business/src/main/java/org/springblade/business/mapper/StandardInfoPrivateJoinMapper.xml

@@ -0,0 +1,33 @@
+<?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.business.mapper.StandardInfoPrivateJoinMapper">
+
+    <resultMap id="BaseResultMap" type="org.springblade.business.entity.StandardInfoPrivateJoin">
+            <id property="id" column="id" />
+            <result property="standardInfoId" column="standard_info_id" />
+            <result property="privateId" column="private_id" />
+            <result property="colKey" column="col_key" />
+            <result property="colName" column="col_name" />
+            <result property="isDeleted" column="is_deleted" />
+            <result property="createTime" column="create_time" />
+            <result property="createUser" column="create_user" />
+            <result property="updateTime" column="update_time" />
+            <result property="updateUser" column="update_user" />
+    </resultMap>
+
+    <sql id="Base_Column_List">
+        id,standard_info_id,private_id,col_key,col_name,is_deleted,
+        create_time,create_user,update_time,update_user
+    </sql>
+    <update id="updateJoin">
+        UPDATE u_standard_info_private_join a
+            INNER JOIN u_standard_info b ON a.standard_info_id = b.id
+        SET a.is_deleted = #{isDeleted},
+            a.update_user = #{userId}
+        WHERE
+            b.is_deleted = 0
+          AND b.standard_id = #{standardId}
+    </update>
+</mapper>

+ 28 - 0
blade-service/blade-business/src/main/java/org/springblade/business/service/PrivateStandardService.java

@@ -0,0 +1,28 @@
+package org.springblade.business.service;
+
+import org.springblade.business.dto.PrivateStandardDTO;
+import org.springblade.business.entity.PrivateStandard;
+import com.baomidou.mybatisplus.extension.service.IService;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.util.List;
+
+/**
+* @author LHB
+* @description 针对表【u_wbs_private_standard(规范文件夹及规范文件表)】的数据库操作Service
+* @createDate 2025-06-10 10:48:37
+*/
+public interface PrivateStandardService extends IService<PrivateStandard> {
+
+    boolean delete(Long id);
+
+    boolean insert(PrivateStandardDTO uWbsPrivateStandard);
+
+    boolean update(List<PrivateStandardDTO> privateStandards);
+
+    boolean deleteFile(Long id);
+
+    boolean updateTypeByTwo(List<PrivateStandardDTO> data, List<Long> delIds, List<Long> delFileIds, MultipartFile[] files);
+
+    Long standardUpdate(Long id);
+}

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

@@ -0,0 +1,13 @@
+package org.springblade.business.service;
+
+import org.springblade.business.entity.StandardFile;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+* @author LHB
+* @description 针对表【u_standard_file(规范文件表)】的数据库操作Service
+* @createDate 2025-06-13 09:24:14
+*/
+public interface StandardFileService extends IService<StandardFile> {
+
+}

+ 10 - 0
blade-service/blade-business/src/main/java/org/springblade/business/service/StandardInfoJoinService.java

@@ -0,0 +1,10 @@
+package org.springblade.business.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import org.springblade.business.entity.StandardInfoJoin;
+
+/**
+ * @author LHB
+ */
+public interface StandardInfoJoinService extends IService<StandardInfoJoin> {
+}

+ 10 - 0
blade-service/blade-business/src/main/java/org/springblade/business/service/StandardInfoPrivateJoinService.java

@@ -0,0 +1,10 @@
+package org.springblade.business.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import org.springblade.business.entity.StandardInfoPrivateJoin;
+
+/**
+ * @author LHB
+ */
+public interface StandardInfoPrivateJoinService extends IService<StandardInfoPrivateJoin> {
+}

+ 45 - 0
blade-service/blade-business/src/main/java/org/springblade/business/service/StandardInfoService.java

@@ -0,0 +1,45 @@
+package org.springblade.business.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.service.IService;
+import org.springblade.business.dto.StandardInfoDTO;
+import org.springblade.business.dto.StandardInfoPrivateJoinDTO;
+import org.springblade.business.entity.StandardInfo;
+import org.springblade.business.vo.StandardInfoPrivateJoinVO;
+import org.springblade.business.vo.StandardInfoVO;
+import org.springblade.core.mp.support.Query;
+
+import java.util.List;
+
+/**
+ * @author LHB
+ * @description 针对表【u_standard_info(规范参数管理-基础信息)】的数据库操作Service
+ * @createDate 2025-06-11 09:57:39
+ */
+public interface StandardInfoService extends IService<StandardInfo> {
+
+    IPage<StandardInfoDTO> selectMyPage(Query query, StandardInfo standardInfo);
+
+    StandardInfoDTO selectOne(Long id);
+
+    Boolean insert(StandardInfoDTO uStandardInfo);
+
+    Boolean edit(StandardInfoDTO uStandardInfo);
+
+    Boolean delete(Long id);
+
+    Boolean setCondition(List<StandardInfoVO> standardInfoJoins, Long id);
+
+    Boolean setElementJoin(List<StandardInfoPrivateJoinVO> standardInfoPrivateJoins, Long id);
+
+    Boolean deleteConditionSet(Long groupId);
+
+    Boolean deleteElementJoin(Long groupId);
+
+    List<StandardInfoVO> getConditionSet(Long id, Long leftId, Long groupId, Long joinGroupId);
+
+    List<StandardInfoPrivateJoinVO> getElementJoin(Long id, Long leftId, Long groupId, Long joinGroupId);
+
+    List<StandardInfoPrivateJoinVO> effectPreview(String ids);
+
+}

+ 442 - 0
blade-service/blade-business/src/main/java/org/springblade/business/service/impl/PrivateStandardServiceImpl.java

@@ -0,0 +1,442 @@
+package org.springblade.business.service.impl;
+
+import cn.hutool.core.date.DateTime;
+import cn.hutool.core.util.ReflectUtil;
+import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
+import com.baomidou.mybatisplus.core.toolkit.StringUtils;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springblade.business.entity.*;
+import org.springblade.business.service.StandardFileService;
+import org.springblade.business.dto.PrivateStandardDTO;
+import org.springblade.business.mapper.StandardInfoJoinMapper;
+import org.springblade.business.mapper.StandardInfoMapper;
+import org.springblade.business.mapper.StandardInfoPrivateJoinMapper;
+import org.springblade.business.service.PrivateStandardService;
+import org.springblade.business.mapper.PrivateStandardMapper;
+import org.springblade.common.utils.SnowFlakeUtil;
+import org.springblade.core.log.exception.ServiceException;
+import org.springblade.core.oss.model.BladeFile;
+import org.springblade.core.secure.BladeUser;
+import org.springblade.core.secure.utils.SecureUtil;
+import org.springblade.core.tool.utils.BeanUtil;
+import org.springblade.resource.feign.NewIOSSClient;
+import org.springframework.mock.web.MockMultipartFile;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.annotation.Resource;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.URL;
+import java.time.LocalDateTime;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+/**
+ * @author LHB
+ * @description 针对表【u_wbs_private_standard(规范文件夹及规范文件表)】的数据库操作Service实现
+ * @createDate 2025-06-10 10:48:37
+ */
+@Service
+public class PrivateStandardServiceImpl extends ServiceImpl<PrivateStandardMapper, PrivateStandard>
+        implements PrivateStandardService {
+    @Resource
+    private StandardInfoMapper standardInfoMapper;
+    @Resource
+    private StandardInfoJoinMapper standardInfoJoinMapper;
+    @Resource
+    private StandardInfoPrivateJoinMapper standardInfoPrivateJoinMapper;
+
+    @Resource
+    private StandardFileService standardFileService;
+
+    /**
+     * 对象存储构建类
+     */
+    @Resource
+    private NewIOSSClient newIOSSClient;
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public boolean insert(PrivateStandardDTO uWbsPrivateStandard) {
+        BladeUser user = SecureUtil.getUser();
+        uWbsPrivateStandard.setCreateUser(user.getUserId());
+        Boolean isUploadFile = false;
+        if (uWbsPrivateStandard.getType() == 2 && uWbsPrivateStandard.getFiles().length > 0) {
+            isUploadFile = true;
+        }
+
+        //先上传文件,上传成功在执行添加
+        if (isUploadFile) {
+            List<StandardFile> standardFiles = new ArrayList<>();
+            MultipartFile[] files = uWbsPrivateStandard.getFiles();
+
+            try {
+                for (MultipartFile file : files) {
+
+                    StandardFile standardFile = new StandardFile();
+                    standardFile.setId(SnowFlakeUtil.getId());
+                    standardFile.setStandardId(uWbsPrivateStandard.getId());
+                    standardFile.setCreateUser(user.getUserId());
+
+
+                    String originalFilename = file.getOriginalFilename();
+                    standardFile.setFileName(originalFilename);
+
+
+                    originalFilename = "standard/" + uWbsPrivateStandard.getId() + "|" + originalFilename;
+//
+//                    ReflectUtil.setFieldValue(file,"filename",originalFilename);
+
+                    MockMultipartFile multipartFile = new MockMultipartFile("file", originalFilename, "application/pdf", file.getInputStream());
+                    //Oss上传 传特殊文件名 在oss中做特殊路径处理
+                    BladeFile bladeFile = newIOSSClient.uploadFileByInputStream(multipartFile);
+
+                    standardFile.setStandardFileUrl(bladeFile.getLink());
+                    standardFiles.add(standardFile);
+                }
+            } catch (Exception e) {
+                //删除之前上传的文件
+                for (StandardFile standardFile : standardFiles) {
+                    String pdfName = standardFile.getStandardFileUrl().split("upload")[1];
+                    this.newIOSSClient.removeFile("upload" + pdfName);
+                }
+                e.printStackTrace();
+                throw new ServiceException("文件上传失败!请检查Oss");
+            }
+            standardFileService.saveBatch(standardFiles);
+        }
+
+        if (uWbsPrivateStandard.getType() == 2) {
+            //修改之前的规则为过期
+            baseMapper.updateStatus(uWbsPrivateStandard.getParentId());
+        }
+        return baseMapper.insert(uWbsPrivateStandard) > 0;
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public boolean update(List<PrivateStandardDTO> privateStandards) {
+        BladeUser user = SecureUtil.getUser();
+
+        List<PrivateStandard> privateStandards1 = new ArrayList<>();
+
+        for (PrivateStandardDTO privateStandard : privateStandards) {
+            PrivateStandard privateStandard1 = BeanUtil.copyProperties(privateStandard, PrivateStandard.class);
+            privateStandards1.add(privateStandard1);
+        }
+
+        this.updateBatchById(privateStandards1);
+
+        return false;
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public boolean delete(Long id) {
+
+        try {
+            //获取当前用户
+            BladeUser user = SecureUtil.getUser();
+
+            //删除文件
+            List<StandardFile> list = standardFileService.list(Wrappers.<StandardFile>lambdaQuery()
+                    .eq(StandardFile::getStandardId, id));
+            for (StandardFile standardFile : list) {
+                deleteFile(standardFile.getId());
+            }
+            //更新西悉尼
+            int update = baseMapper.update(null, Wrappers.<PrivateStandard>lambdaUpdate()
+                    .set(PrivateStandard::getIsDeleted, 1)
+                    .set(PrivateStandard::getUpdateUser, user.getUserId())
+                    .eq(PrivateStandard::getId, id)
+                    .or()
+                    .eq(PrivateStandard::getParentId, id)
+            );
+
+            int update1 = standardInfoMapper.update(null, Wrappers.<StandardInfo>lambdaUpdate()
+                    .set(StandardInfo::getIsDeleted, 1)
+                    .set(StandardInfo::getUpdateUser, user.getUserId())
+                    .eq(StandardInfo::getStandardId, id));
+            //TODO 还要删除关联信息
+            standardInfoJoinMapper.updateJoin(user.getUserId(), 1, id);
+            //TODo 还要删除与表单的关联信息
+            standardInfoPrivateJoinMapper.updateJoin(user.getUserId(), 1, id);
+
+            return update > 0;
+        } catch (Exception e) {
+            e.printStackTrace();
+            throw new ServiceException("删除失败");
+        }
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public boolean deleteFile(Long id) {
+        StandardFile byId = standardFileService.getById(id);
+        if (byId != null) {
+            try {
+                String pdfName = byId.getStandardFileUrl().split("upload")[1];
+                this.newIOSSClient.removeFile("upload" + pdfName);
+            } catch (Exception e) {
+                e.printStackTrace();
+                throw new ServiceException("文件删除失败,Oss异常");
+            }
+            standardFileService.update(Wrappers.<StandardFile>lambdaUpdate()
+                    .set(StandardFile::getIsDeleted, 1)
+                    .set(StandardFile::getUpdateUser, SecureUtil.getUser().getUserId())
+                    .eq(StandardFile::getId, id));
+            return true;
+        }
+        return false;
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public boolean updateTypeByTwo(List<PrivateStandardDTO> data,
+                                   List<Long> delIds,
+                                   List<Long> delFileIds,
+                                   MultipartFile[] allFiles) {
+        BladeUser user = SecureUtil.getUser();
+        //先删除文件
+        try {
+            if (CollectionUtils.isNotEmpty(delFileIds)) {
+                List<StandardFile> standardFiles = standardFileService.listByIds(delFileIds);
+                if (CollectionUtils.isNotEmpty(standardFiles)) {
+                    for (StandardFile standardFile : standardFiles) {
+                        this.deleteFile(standardFile.getId());
+                    }
+                }
+            }
+            //删除规范文件
+            if (CollectionUtils.isNotEmpty(delIds)) {
+                for (Long delId : delIds) {
+                    delete(delId);
+                }
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+            throw new ServiceException("Oss删除文件失败");
+        }
+        //文件集合
+        List<StandardFile> standardFiles = new ArrayList<>();
+        try {
+            //空文件曲中
+            List<MultipartFile> files = new ArrayList<>();
+            for (MultipartFile allFile : allFiles) {
+                if (allFile != null) {
+                    files.add(allFile);
+                }
+            }
+
+            // 文件索引计数器
+            int fileIndex = 0;
+            for (PrivateStandardDTO dto : data) {
+                // 获取当前对象需要的文件数量
+                int fileCount = dto.getFilesCount();
+                if (files != null && files.size() > 0) {
+                    if (fileCount > 0 && fileIndex < files.size()) {
+                        dto.setFile(files.get(fileIndex++));
+                    }
+                    //先上传文件,上传成功在执行添加
+                    if (dto.getFile() != null) {
+                        //再去查询当前规范文件是否在数据库中存在未删除的文件
+                        List<StandardFile> list = standardFileService.list(Wrappers.<StandardFile>lambdaQuery()
+                                .eq(StandardFile::getStandardId, dto.getId())
+                                .eq(StandardFile::getIsDeleted, 0));
+                        if (CollectionUtils.isNotEmpty(list)) {
+                            //删除文件
+                            for (StandardFile standardFile : list) {
+                                String pdfName = standardFile.getStandardFileUrl().split("upload")[1];
+                                this.newIOSSClient.removeFile("upload" + pdfName);
+                                standardFile.setIsDeleted(1);
+                            }
+                            standardFileService.saveOrUpdateBatch(list);
+                        }
+                        MultipartFile file = dto.getFile();
+                        StandardFile standardFile = new StandardFile();
+                        standardFile.setId(SnowFlakeUtil.getId());
+                        standardFile.setStandardId(dto.getId());
+                        standardFile.setCreateUser(user.getUserId());
+                        String originalFilename = file.getOriginalFilename();
+                        standardFile.setFileName(originalFilename);
+                        originalFilename = "standard/" + dto.getId() + "|" + originalFilename;
+                        MockMultipartFile multipartFile = new MockMultipartFile("file", originalFilename, "application/pdf", file.getInputStream());
+
+                        //Oss上传 传特殊文件名 在oss中做特殊路径处理
+                        BladeFile bladeFile = newIOSSClient.uploadFileByInputStream(multipartFile);
+                        if (bladeFile == null) {
+                            throw new ServiceException("Oss异常");
+                        }
+                        standardFile.setStandardFileUrl(bladeFile.getLink());
+                        //添加新文件
+                        standardFileService.save(standardFile);
+                    }
+                }
+
+
+                //创建数据
+                PrivateStandard privateStandard = BeanUtil.copyProperties(dto, PrivateStandard.class);
+                //修改
+                baseMapper.updateById(privateStandard);
+            }
+            return true;
+        } catch (Exception e) {
+            //删除之前上传的文件
+            if (CollectionUtils.isNotEmpty(standardFiles)) {
+                for (StandardFile standardFile : standardFiles) {
+                    String pdfName = standardFile.getStandardFileUrl().split("upload")[1];
+                    this.newIOSSClient.removeFile("upload" + pdfName);
+                }
+                throw new ServiceException("Oss异常");
+            }
+            e.printStackTrace();
+            throw new ServiceException("更新失败");
+        }
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public Long standardUpdate(Long id) {
+        BladeUser user = SecureUtil.getUser();
+        //获取当前规范文件信息
+        PrivateStandard privateStandard = baseMapper.selectById(id);
+        if(privateStandard == null){
+            throw new ServiceException("未查询到规范文件");
+        }
+
+        //获取信息
+        List<StandardInfo> standardInfos = standardInfoMapper.selectList(Wrappers.<StandardInfo>lambdaQuery()
+                .eq(StandardInfo::getStandardId, id)
+                .eq(StandardInfo::getIsDeleted, 0));
+
+        List<Long> infoIds = null;
+        if (CollectionUtils.isNotEmpty(standardInfos)) {
+            infoIds = standardInfos.stream().filter(f -> f.getType() == 2).map(StandardInfo::getId).collect(Collectors.toList());
+        }
+
+        List<StandardInfoJoin> standardInfoJoins = null;
+        List<StandardInfoPrivateJoin> standardInfoPrivateJoins = null;
+        if (CollectionUtils.isNotEmpty(infoIds)) {
+            //获取绑定信息
+            standardInfoJoins = standardInfoJoinMapper.selectList(Wrappers.<StandardInfoJoin>lambdaQuery()
+                    .in(StandardInfoJoin::getStandardInfoLeftId, infoIds));
+
+            //获取绑定表单信息
+            standardInfoPrivateJoins = standardInfoPrivateJoinMapper.selectList(Wrappers.<StandardInfoPrivateJoin>lambdaQuery()
+                    .in(StandardInfoPrivateJoin::getStandardInfoId, infoIds));
+        }
+        //获取文件信息
+        List<StandardFile> standardFiles = standardFileService.list(Wrappers.<StandardFile>lambdaQuery()
+                .eq(StandardFile::getStandardId, id)
+                .eq(StandardFile::getIsDeleted, 0));
+
+
+        //复制数据
+
+        //新规范文件id
+        Long newId = SnowFlakeUtil.getId();
+
+        privateStandard.setId(newId);
+        if (privateStandard.getStatus() == 2) {
+            privateStandard.setName(privateStandard.getName().replace("-已过期", ""));
+            privateStandard.setStatus(1);
+        }
+        privateStandard.setCreateTime(LocalDateTime.now());
+        privateStandard.setCreateUser(user.getUserId());
+
+        try {
+            //修改之前的规则为过期
+            baseMapper.updateStatus(privateStandard.getParentId());
+
+            baseMapper.insert(privateStandard);
+
+            if(CollectionUtils.isNotEmpty(standardInfos)){
+                //旧id与新id的映射关系
+                Map<Long, Long> map = new HashMap<>();
+                standardInfos.forEach(f -> {
+                    Long newInfoId = SnowFlakeUtil.getId();
+                    map.put(f.getId(), newInfoId);
+                });
+                standardInfos.forEach(f -> {
+                    f.setId(map.get(f.getId()));
+                    f.setParentId(map.get(f.getParentId()) == null ? 0 : map.get(f.getParentId()));
+                    f.setStandardId(newId);
+                    f.setCreateTime(DateTime.now());
+                    f.setCreateUser(user.getUserId());
+                    standardInfoMapper.insert(f);
+                });
+                if(CollectionUtils.isNotEmpty(standardInfoJoins)){
+                    standardInfoJoins.forEach(f -> {
+                        f.setId(SnowFlakeUtil.getId());
+                        f.setStandardInfoLeftId(map.get(f.getStandardInfoLeftId()));
+                        f.setStandardInfoRightId(map.get(f.getStandardInfoRightId()));
+                        f.setCreateTime(DateTime.now());
+                        f.setCreateUser(user.getUserId());
+                        standardInfoJoinMapper.insert(f);
+                    });
+                }
+                if(CollectionUtils.isNotEmpty(standardInfoPrivateJoins)){
+                    standardInfoPrivateJoins.forEach(f -> {
+                        f.setId(SnowFlakeUtil.getId());
+                        f.setStandardInfoId(map.get(f.getStandardInfoId()));
+                        f.setCreateTime(DateTime.now());
+                        f.setCreateUser(user.getUserId());
+                        standardInfoPrivateJoinMapper.insert(f);
+                    });
+                }
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+            throw new ServiceException("复制失败");
+        }
+
+
+
+        if(CollectionUtils.isNotEmpty(standardFiles)){
+            //文件集合
+            List<String> urls = new ArrayList<>();
+            try {
+                for (StandardFile f : standardFiles) {
+                    f.setId(SnowFlakeUtil.getId());
+                    f.setStandardId(newId);
+                    f.setCreateTime(DateTime.now());
+                    f.setCreateUser(user.getUserId());
+                    if (StringUtils.isNotEmpty(f.getStandardFileUrl())) {
+                        URL urlFile = new URL(f.getStandardFileUrl());
+                        InputStream inputStream = urlFile.openStream();
+                        String originalFilename = "standard/" + f.getId() + "|" + f.getFileName();
+                        MockMultipartFile multipartFile = new MockMultipartFile("file", originalFilename, "application/pdf", inputStream);
+                        //Oss上传 传特殊文件名 在oss中做特殊路径处理
+                        BladeFile bladeFile = newIOSSClient.uploadFileByInputStream(multipartFile);
+                        if (bladeFile == null) {
+                            throw new ServiceException("Oss异常");
+                        }
+                        f.setStandardFileUrl(bladeFile.getLink());
+                        urls.add(bladeFile.getLink());
+                    }
+                }
+            } catch (Exception e) {
+                for (String url : urls) {
+                    String pdfName = url.split("upload")[1];
+                    this.newIOSSClient.removeFile("upload" + pdfName);
+                }
+                e.printStackTrace();
+                throw new ServiceException("Oss异常");
+            }
+            standardFileService.saveBatch(standardFiles);
+        }
+        return newId;
+    }
+}
+
+
+
+

+ 22 - 0
blade-service/blade-business/src/main/java/org/springblade/business/service/impl/StandardFileServiceImpl.java

@@ -0,0 +1,22 @@
+package org.springblade.business.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springblade.business.entity.StandardFile;
+import org.springblade.business.service.StandardFileService;
+import org.springblade.business.mapper.StandardFileMapper;
+import org.springframework.stereotype.Service;
+
+/**
+* @author LHB
+* @description 针对表【u_standard_file(规范文件表)】的数据库操作Service实现
+* @createDate 2025-06-13 09:24:14
+*/
+@Service
+public class StandardFileServiceImpl extends ServiceImpl<StandardFileMapper, StandardFile>
+    implements StandardFileService {
+
+}
+
+
+
+

+ 14 - 0
blade-service/blade-business/src/main/java/org/springblade/business/service/impl/StandardInfoJoinServiceImpl.java

@@ -0,0 +1,14 @@
+package org.springblade.business.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springblade.business.entity.StandardInfoJoin;
+import org.springblade.business.mapper.StandardInfoJoinMapper;
+import org.springblade.business.service.StandardInfoJoinService;
+import org.springframework.stereotype.Service;
+
+/**
+ * @author LHB
+ */
+@Service
+public class StandardInfoJoinServiceImpl extends ServiceImpl<StandardInfoJoinMapper, StandardInfoJoin> implements StandardInfoJoinService {
+}

+ 14 - 0
blade-service/blade-business/src/main/java/org/springblade/business/service/impl/UStandardInfoPrivateJoinServiceImpl.java

@@ -0,0 +1,14 @@
+package org.springblade.business.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springblade.business.entity.StandardInfoPrivateJoin;
+import org.springblade.business.mapper.StandardInfoPrivateJoinMapper;
+import org.springblade.business.service.StandardInfoPrivateJoinService;
+import org.springframework.stereotype.Service;
+
+/**
+ * @author LHB
+ */
+@Service
+public class UStandardInfoPrivateJoinServiceImpl extends ServiceImpl<StandardInfoPrivateJoinMapper, StandardInfoPrivateJoin> implements StandardInfoPrivateJoinService {
+}

+ 365 - 0
blade-service/blade-business/src/main/java/org/springblade/business/service/impl/UStandardInfoServiceImpl.java

@@ -0,0 +1,365 @@
+package org.springblade.business.service.impl;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.StringUtils;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springblade.business.dto.StandardInfoJoinDTO;
+import org.springblade.business.dto.StandardInfoPrivateJoinDTO;
+import org.springblade.business.dto.StandardInfoDTO;
+import org.springblade.business.entity.StandardInfo;
+import org.springblade.business.entity.StandardInfoJoin;
+import org.springblade.business.entity.StandardInfoPrivateJoin;
+import org.springblade.business.mapper.StandardInfoMapper;
+import org.springblade.business.service.StandardInfoJoinService;
+import org.springblade.business.service.StandardInfoPrivateJoinService;
+import org.springblade.business.service.StandardInfoService;
+import org.springblade.business.vo.*;
+import org.springblade.common.utils.SnowFlakeUtil;
+import org.springblade.core.log.exception.ServiceException;
+import org.springblade.core.mp.support.Query;
+import org.springblade.core.secure.BladeUser;
+import org.springblade.core.secure.utils.SecureUtil;
+import org.springblade.core.tool.utils.BeanUtil;
+import org.springblade.core.tool.utils.CollectionUtil;
+import org.springblade.core.tool.utils.StringUtil;
+import org.springframework.beans.BeansException;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import javax.annotation.Resource;
+import java.util.*;
+import java.util.stream.Collectors;
+
+/**
+ * @author LHB
+ * @description 针对表【u_standard_info(规范参数管理-基础信息)】的数据库操作Service实现
+ * @createDate 2025-06-11 09:57:39
+ */
+@Service
+public class UStandardInfoServiceImpl extends ServiceImpl<StandardInfoMapper, StandardInfo>
+        implements StandardInfoService {
+
+    /**
+     * 关联表
+     */
+    @Resource
+    private StandardInfoJoinService standardInfoJoinService;
+
+    /**
+     * 与表单的关联关系
+     */
+    @Resource
+    private StandardInfoPrivateJoinService standardInfoPrivateJoinService;
+
+
+    @Override
+    public IPage<StandardInfoDTO> selectMyPage(Query query, StandardInfo standardInfo) {
+        return baseMapper.selectMyPage(new Page<StandardInfoDTO>(query.getCurrent(), query.getSize()), standardInfo);
+    }
+
+    @Override
+    public StandardInfoDTO selectOne(Long id) {
+        return baseMapper.selectMyOne(id);
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public Boolean insert(StandardInfoDTO uStandardInfo) {
+        try {
+            //获取当前用户
+            BladeUser user = SecureUtil.getUser();
+            uStandardInfo.setId(SnowFlakeUtil.getId());
+            uStandardInfo.setCreateUser(user.getUserId());
+
+            List<StandardInfo> info = uStandardInfo.getInfo();
+
+            //给集合设置id、父级id、创建人
+            info.forEach(item -> {
+                item.setId(SnowFlakeUtil.getId());
+                item.setParentId(uStandardInfo.getId());
+                item.setStandardId(uStandardInfo.getStandardId());
+                item.setCreateUser(user.getUserId());
+            });
+
+            //把父级对象转出来单独保存
+            StandardInfo parent = BeanUtil.copyProperties(uStandardInfo, StandardInfo.class);
+            baseMapper.insert(parent);
+            //通过mybatis-plus 批量新增
+            this.saveBatch(info);
+
+            return true;
+        } catch (BeansException e) {
+            e.printStackTrace();
+            throw new ServiceException("添加失败");
+        }
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public Boolean edit(StandardInfoDTO uStandardInfo) {
+        try {
+            //获取当前用户
+            BladeUser user = SecureUtil.getUser();
+            uStandardInfo.setUpdateUser(user.getUserId());
+
+            List<StandardInfo> info = uStandardInfo.getInfo();
+            info.forEach(item -> {
+                if (item.getId() == null) {
+                    //新增的子集合设置id、父级id、创建人
+                    item.setId(SnowFlakeUtil.getId());
+                    item.setParentId(uStandardInfo.getId());
+                    item.setStandardId(uStandardInfo.getStandardId());
+                    item.setCreateUser(user.getUserId());
+                } else {
+                    //更新的子集合 添加更新人
+                    item.setUpdateUser(user.getUserId());
+                }
+            });
+            //更新父级对象
+            StandardInfo parent = BeanUtil.copyProperties(uStandardInfo, StandardInfo.class);
+            baseMapper.updateById(parent);
+            //批量更新
+            this.saveOrUpdateBatch(info);
+            return true;
+        } catch (Exception e) {
+            e.printStackTrace();
+            throw new ServiceException("更新失败");
+        }
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public Boolean delete(Long id) {
+        try {
+            //查询关联表 如果有关联关系不允许删除
+            long joinCount = standardInfoJoinService.count(Wrappers.<StandardInfoJoin>lambdaQuery()
+                    .eq(StandardInfoJoin::getStandardInfoRightId, id)
+                    .or()
+                    .eq(StandardInfoJoin::getStandardInfoLeftId, id));
+            if (joinCount > 0) {
+                throw new ServiceException("当前数据正在【条件设置】中使用,无法删除");
+            }
+            //查询与表单的关联表
+            long privateJoinCount = standardInfoPrivateJoinService.count(Wrappers.<StandardInfoPrivateJoin>lambdaQuery()
+                    .eq(StandardInfoPrivateJoin::getStandardInfoId, id));
+            if (privateJoinCount > 0) {
+                throw new ServiceException("当前数据正在【关联元素】中使用,无法删除");
+            }
+
+            int update = baseMapper.update(null, Wrappers.<StandardInfo>lambdaUpdate()
+                    .set(StandardInfo::getIsDeleted, 1)
+                    .eq(StandardInfo::getId, id)
+                    .or()
+                    .eq(StandardInfo::getParentId, id));
+            return update > 0;
+        } catch (ServiceException e) {
+            e.printStackTrace();
+            throw new ServiceException("删除失败");
+        }
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public Boolean setCondition(List<StandardInfoVO> standardInfoJoins, Long id) {
+        if (CollectionUtil.isNotEmpty(standardInfoJoins)) {
+            //按照组进行删除
+            StandardInfoVO standardInfoVO = standardInfoJoins.get(0);
+            Long parentId = standardInfoVO.getParentId();
+
+            List<StandardInfo> standardInfoIds = baseMapper.selectList(Wrappers.<StandardInfo>lambdaQuery()
+                    .eq(StandardInfo::getParentId, parentId)
+                    .eq(StandardInfo::getIsDeleted, 0));
+            List<Long> collect = standardInfoIds.stream().map(StandardInfo::getId).collect(Collectors.toList());
+
+            //删除当前规范文件当前组下的条件设置
+            standardInfoJoinService.remove(Wrappers.<StandardInfoJoin>lambdaQuery()
+                    .in(StandardInfoJoin::getStandardInfoLeftId, collect));
+
+            BladeUser user = SecureUtil.getUser();
+            //获取参宿
+            List<StandardInfoJoinDTO> list = new ArrayList<>();
+            //新增数据
+            List<StandardInfoJoin> saveData = new ArrayList<>();
+            //数据校验
+            List<String> newGroupRightIds = new ArrayList<>();
+            //解析参数
+            for (StandardInfoVO standardInfoJoin : standardInfoJoins) {
+                StandardInfoJoinDTO standardInfoJoinDTO = new StandardInfoJoinDTO();
+
+                Long leftId = standardInfoJoin.getId();
+
+                standardInfoJoinDTO.setLeftId(leftId);
+                List<StandardInfoConditionVo> standardInfos = standardInfoJoin.getStandardInfos();
+                if (CollectionUtil.isNotEmpty(standardInfos)) {
+                    for (StandardInfoConditionVo standardInfo : standardInfos) {
+                        StandardInfoGroupNameVO standardInfoGroupNameVO = standardInfo.getStandardInfoGroupNameVO();
+                        List<Long> ids = standardInfoGroupNameVO.getIds();
+                        standardInfoJoinDTO.getRightIds().addAll(ids);
+                    }
+                    list.add(standardInfoJoinDTO);
+                }
+
+                //新的数据排序后组合成字符串
+                List<Long> newRightIds = standardInfoJoinDTO.getRightIds();
+                Collections.sort(newRightIds);
+
+                String newRightIdsStr = String.join(",", newRightIds.stream().map(String::valueOf).collect(Collectors.toList()));
+                if(CollectionUtil.isNotEmpty(newRightIds)){
+                    //把左Id加进来 确保只有在左id相同的情况下才进行判断
+                    newRightIdsStr = newRightIdsStr + "," + leftId;
+                }
+                newGroupRightIds.add(newRightIdsStr);
+            }
+
+            Set<String> set = new HashSet<>(newGroupRightIds);
+            if (set.size() < list.size()) {
+                throw new ServiceException("请勿重复添加条件");
+            }
+
+
+            //封装参数
+            for (StandardInfoJoinDTO standardInfoJoin : list) {
+                List<Long> rightIds = standardInfoJoin.getRightIds();
+                standardInfoJoin.setGroupId(SnowFlakeUtil.getId());
+                for (Long rightId : rightIds) {
+                    StandardInfoJoin uStandardInfoJoin = new StandardInfoJoin();
+                    uStandardInfoJoin.setId(SnowFlakeUtil.getId());
+                    //设置组id
+                    uStandardInfoJoin.setGroupId(standardInfoJoin.getGroupId());
+                    uStandardInfoJoin.setStandardInfoLeftId(standardInfoJoin.getLeftId());
+                    uStandardInfoJoin.setStandardInfoRightId(rightId);
+                    uStandardInfoJoin.setCreateUser(user.getUserId());
+                    saveData.add(uStandardInfoJoin);
+                }
+            }
+
+            return standardInfoJoinService.saveOrUpdateBatch(saveData);
+        }
+        return true;
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public Boolean setElementJoin(List<StandardInfoPrivateJoinVO> standardInfoPrivateJoins, Long id) {
+        BladeUser user = SecureUtil.getUser();
+        List<StandardInfoPrivateJoin> saveData = new ArrayList<>();
+
+
+        if (CollectionUtil.isNotEmpty(standardInfoPrivateJoins)) {
+            //根据
+            StandardInfoPrivateJoinVO standardInfoPrivateJoinVO = standardInfoPrivateJoins.get(0);
+            Long parentId = standardInfoPrivateJoinVO.getParentId();
+
+            List<StandardInfo> standardInfoIds = baseMapper.selectList(Wrappers.<StandardInfo>lambdaQuery()
+                    .eq(StandardInfo::getParentId, parentId)
+                    .eq(StandardInfo::getIsDeleted, 0));
+            List<Long> collect = standardInfoIds.stream().map(StandardInfo::getId).collect(Collectors.toList());
+
+
+            //删除当前规范文件下的条件设置
+            standardInfoPrivateJoinService.remove(Wrappers.<StandardInfoPrivateJoin>lambdaQuery()
+                    .in(StandardInfoPrivateJoin::getStandardInfoId, collect));
+
+            try {
+                for (StandardInfoPrivateJoinVO standardInfoPrivateJoin : standardInfoPrivateJoins) {
+                    Long leftId = standardInfoPrivateJoin.getId();
+
+                    standardInfoPrivateJoin.setGroupId(SnowFlakeUtil.getId());
+                    List<StandardInfoPrivateJoinGroupVO> group = standardInfoPrivateJoin.getGroup();
+                    //项目组
+                    for (StandardInfoPrivateJoinGroupVO standardInfoPrivateJoinGroupVO : group) {
+                        //项目id
+                        Long privateId = standardInfoPrivateJoinGroupVO.getPrivateId();
+                        List<StandardElementVo> keys = standardInfoPrivateJoinGroupVO.getKeys();
+
+                        for (StandardElementVo key : keys) {
+                            StandardInfoPrivateJoin join = new StandardInfoPrivateJoin();
+                            join.setGroupId(standardInfoPrivateJoin.getGroupId());
+                            join.setStandardInfoId(leftId);
+                            join.setId(SnowFlakeUtil.getId());
+                            join.setPrivateId(privateId);
+                            join.setColKey(key.getColKey());
+                            join.setColName(key.getColName());
+                            join.setCreateUser(user.getUserId());
+                            saveData.add(join);
+                        }
+                    }
+                }
+                return standardInfoPrivateJoinService.saveOrUpdateBatch(saveData);
+            } catch (Exception e) {
+                e.printStackTrace();
+                throw new ServiceException("元素关联失败");
+            }
+        }
+        return false;
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public Boolean deleteConditionSet(Long groupId) {
+        BladeUser user = SecureUtil.getUser();
+        try {
+            return standardInfoJoinService.update(Wrappers.<StandardInfoJoin>lambdaUpdate()
+                    .set(StandardInfoJoin::getIsDeleted, 1)
+                    .set(StandardInfoJoin::getUpdateUser, user.getUserId())
+                    .eq(StandardInfoJoin::getGroupId, groupId));
+        } catch (Exception e) {
+            e.printStackTrace();
+            throw new ServiceException("删除失败");
+        }
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public Boolean deleteElementJoin(Long groupId) {
+        BladeUser user = SecureUtil.getUser();
+        try {
+            return standardInfoPrivateJoinService.update(Wrappers.<StandardInfoPrivateJoin>lambdaUpdate()
+                    .set(StandardInfoPrivateJoin::getIsDeleted, 1)
+                    .set(StandardInfoPrivateJoin::getUpdateUser, user.getUserId())
+                    .eq(StandardInfoPrivateJoin::getGroupId, groupId));
+        } catch (Exception e) {
+            e.printStackTrace();
+            throw new ServiceException("删除失败");
+        }
+    }
+
+    @Override
+    public List<StandardInfoVO> getConditionSet(Long id, Long leftId, Long groupId, Long joinGroupId) {
+        List<StandardInfoVO> conditionSet = baseMapper.getConditionSet(id, leftId, groupId, joinGroupId);
+        for (StandardInfoVO standardInfoVO : conditionSet) {
+            List<StandardInfoConditionVo> standardInfos = standardInfoVO.getStandardInfos();
+            for (StandardInfoConditionVo standardInfo : standardInfos) {
+                //重新组装数据
+                List<String> name = standardInfo.getRightStandardInfos().stream().map(StandardInfo::getName).collect(Collectors.toList());
+                List<Long> ids = standardInfo.getRightStandardInfos().stream().map(StandardInfo::getId).collect(Collectors.toList());
+
+                StandardInfoGroupNameVO standardInfoGroupNameVO = new StandardInfoGroupNameVO();
+                standardInfoGroupNameVO.setName(StringUtil.join(name, ","));
+                standardInfoGroupNameVO.setIds(ids);
+
+                standardInfo.setStandardInfoGroupNameVO(standardInfoGroupNameVO);
+                standardInfo.setRightStandardInfos(null);
+            }
+        }
+        return conditionSet;
+    }
+
+    @Override
+    public List<StandardInfoPrivateJoinVO> getElementJoin(Long id, Long leftId, Long groupId, Long joinGroupId) {
+        return baseMapper.getElementJoin(id, leftId, groupId, joinGroupId);
+
+    }
+
+    @Override
+    public List<StandardInfoPrivateJoinVO> effectPreview(String ids) {
+        List<Long> collect = Arrays.stream(ids.split(",")).map(Long::parseLong).collect(Collectors.toList());
+        return baseMapper.effectPreview(collect,collect.size());
+    }
+}
+
+
+
+

+ 8 - 1
blade-service/blade-manager/src/main/java/com/jfireel/expression/node/impl/EqualNode.java

@@ -29,7 +29,14 @@ public class EqualNode extends OperatorResultNode {
                 return EqUtil.calculate((Number) leftValue, (Number) rightValue);
             } else if (leftValue instanceof List || rightValue instanceof List) {
                 Object[] leftAndRight = ValueUtil.obtain(leftOperand.calculate(variables), rightOperand.calculate(variables));
-                return leftAndRight == null ? null : StringUtils.isEquals(leftAndRight[0], leftAndRight[1]);
+
+                //如果是数字类型 第一个是float  第二个是整数所以不能使用equals
+                if(leftAndRight[0] instanceof Number && leftAndRight[1] instanceof Number){
+                    return EqUtil.calculate((Number) leftAndRight[0], (Number) leftAndRight[1]);
+                }
+
+                boolean equals = StringUtils.isEquals(leftAndRight[0], leftAndRight[1]);
+                return leftAndRight == null ? null : equals;
             } else {
                 return leftValue.equals(rightValue);
             }

+ 6 - 1
blade-service/blade-manager/src/main/java/com/jfireel/expression/node/impl/GtEqNode.java

@@ -23,7 +23,12 @@ public class GtEqNode extends OperatorResultNode {
 //		if (rightValue == null) {
 //			return null;
 //		}
-        Object[] leftAndRight = ValueUtil.obtain(leftOperand.calculate(variables), rightOperand.calculate(variables));
+        Object calculate = leftOperand.calculate(variables);
+        if(calculate instanceof Boolean && !(Boolean) calculate){
+            return calculate;
+        }
+        Object calculate1 = rightOperand.calculate(variables);
+        Object[] leftAndRight = ValueUtil.obtain(calculate, calculate1);
         return leftAndRight == null ? null : !((Boolean) LtUtil.calculate((Number) leftAndRight[0], (Number) leftAndRight[1]));
     }
 }

+ 13 - 0
blade-service/blade-manager/src/main/java/com/jfireel/expression/node/impl/NotEqualNode.java

@@ -1,8 +1,11 @@
 package com.jfireel.expression.node.impl;
 
 import com.jfireel.expression.token.Operator;
+import com.jfireel.expression.util.ValueUtil;
 import com.jfireel.expression.util.number.EqUtil;
+import com.mixsmart.utils.StringUtils;
 
+import java.util.List;
 import java.util.Map;
 
 public class NotEqualNode extends OperatorResultNode {
@@ -24,6 +27,16 @@ public class NotEqualNode extends OperatorResultNode {
         } else {
             if (leftValue instanceof Number && rightValue instanceof Number) {
                 return EqUtil.calculate((Number) leftValue, (Number) rightValue) == false;
+            } else if (leftValue instanceof List || rightValue instanceof List) {
+                Object[] leftAndRight = ValueUtil.obtain(leftOperand.calculate(variables), rightOperand.calculate(variables));
+
+                //如果是数字类型 第一个是float  第二个是整数所以不能使用equals
+                if(leftAndRight[0] instanceof Number && leftAndRight[1] instanceof Number){
+                    return !EqUtil.calculate((Number) leftAndRight[0], (Number) leftAndRight[1]);
+                }
+
+                boolean equals = !StringUtils.isEquals(leftAndRight[0], leftAndRight[1]);
+                return leftAndRight == null ? null : equals;
             } else {
                 return leftValue.equals(rightValue) == false;
             }

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

@@ -10,6 +10,7 @@ import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
+import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.jfireel.expression.Expression;
 import com.mixsmart.utils.CustomFunction;
@@ -4996,23 +4997,165 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
                 }
             }
             if (f.contains(".ifelse")) {
-                int max = 0;
-                do {
-                    Matcher m = RegexUtils.matcher(FC_REG + "(ifelse)\\(([^)]+)\\)", f);
-                    while (m.find()) {
-                        String el = m.group();
-                        String pstr = el.replaceAll("^" + FC_REG + "ifelse\\(", "").replaceAll("\\)$", "");
-                        String[] pa = pstr.split(",");
-                        if (pa.length == 3) {
-                            Object data = Expression.parse(pa[0] + "?" + pa[1] + ":" + pa[2]).calculate(createCurrentMap(el, tec));
-                            f = f.replace(el, putDataWithKey(data, tec));
-                        } else {
-                            f = f.replace(el, "参数格式错误");
+                //试验-判断
+                if(f.contains("|")){
+                    int max = 0;
+                    Pattern pattern = Pattern.compile("^-?\\d+(\\.\\d+)?$");
+                    do {
+                        Matcher m = RegexUtils.matcher(FC_REG + "(ifelse)\\(([^)]+)\\)", f);
+                        while (m.find()) {
+                            String el = m.group();
+                            String pstr = el.replaceAll("^" + FC_REG + "ifelse\\(", "").replaceAll("\\)$", "");
+                            String[] pa = pstr.split(",");
+                            if (pa.length == 3) {
+                                String s2 = pa[0];
+                                String[] split = pa[0].split("&");
+                                //处理位置
+                                //试验-处理数据
+                                Map<String, Object> currentMap = createCurrentMap(el, tec);
+                                Map<String,List<String>> map = (HashMap<String, List<String>>) currentMap.get("E");
+
+                                //匹配成功的计数
+                                Integer count = 0;
+                                for (String s : split) {
+                                    String[] split1 = s.split("\\|");
+                                    String s0 = split1[0].replaceAll("E\\[", "").replaceAll("'", "").replaceAll("]", "");
+                                    String s1 = split1[1].replaceAll("E\\[", "").replaceAll("'", "").replaceAll("]", "");
+                                    List<String> list1 = map.get(s0);
+                                    List<String> list2 = map.get(s1);
+
+                                    if(CollectionUtils.isEmpty(list1) || CollectionUtils.isEmpty(list2)){
+                                        f = f.replace(el, "缺少数据无法匹配");
+                                        break;
+                                    }
+                                    //带后缀的数据去掉留纯数据
+                                    String strings1 = extractPureNumbers(list1.get(0));
+                                    String strings2 = extractPureNumbers(list2.get(0));
+
+
+                                    String s3 = list1.get(0);
+                                    String s4 = list2.get(0);
+                                    if(StringUtils.isNotEmpty(strings1)){
+                                        s3 = strings1;
+                                    }
+                                    if(StringUtils.isNotEmpty(strings2)){
+                                        s4 = strings2;
+                                    }
+
+                                    //比较符
+                                    String operator = "";
+                                    //公式组装
+                                    String formulaData = "";
+                                    //不是纯数字
+                                    if(!pattern.matcher(s3).matches() && pattern.matcher(s4).matches()){
+                                        //如果有特殊后缀,把值替换为纯数字
+                                        list2.set(0,s4);
+                                        if(s3.contains(" ")){
+                                            String[] split2 = s3.split(" ");
+                                            List<String> list = new ArrayList<>();
+                                            for (String string : split2) {
+                                                String number = null;
+                                                //获取比较符
+                                                if(string.contains("&lt;") || string.contains("&gt;")){
+                                                    operator = string.split(";")[0] + ";";
+                                                    number = string.split(";")[1];
+                                                }else{
+                                                    operator = string.substring(0, 1);
+                                                    number = string.substring(1);
+                                                }
+
+                                                operator = strReplace(operator);
+                                                String str = split1[1] + operator + extractPureNumbers(number);
+                                                list.add(str);
+                                            }
+                                            formulaData = String.join("&&",list);
+                                        }else{
+                                            String number = null;
+                                            //获取比较符
+                                            if(s3.contains("&lt;") || s3.contains("&gt;")){
+                                                operator = s3.split(";")[0] + ";";
+                                                number = s3.split(";")[1];
+                                            }else{
+                                                operator = s3.substring(0, 1);
+                                                number = s3.substring(1);
+                                            }
+                                            operator = strReplace(operator);
+
+                                            formulaData = split1[1] + operator + extractPureNumbers(number);
+                                        }
+                                    }else if (pattern.matcher(s3).matches() && !pattern.matcher(s4).matches()){
+                                        list1.set(0,s3);
+                                        if(s4.contains(" ")){
+                                            String[] split2 = s4.split(" ");
+                                            List<String> list = new ArrayList<>();
+                                            for (String string : split2) {
+                                                String number = null;
+                                                //获取比较符
+                                                if(string.contains("&lt;") || string.contains("&gt;")){
+                                                    operator = string.split(";")[0] + ";";
+                                                    number = string.split(";")[1];
+                                                }else{
+                                                    operator = string.substring(0, 1);
+                                                    number = string.substring(1);
+                                                }
+                                                operator = strReplace(operator);
+                                                String str = split1[0] + operator + extractPureNumbers(number);
+                                                list.add(str);
+                                            }
+                                            formulaData = String.join("&&",list);
+                                        }else{
+                                            String number = null;
+                                            //获取比较符
+                                            if(s4.contains("&lt;") || s4.contains("&gt;")){
+                                                operator = s4.split(";")[0] + ";";
+                                                number = s4.split(";")[1];
+                                            }else{
+                                                operator = s4.substring(0, 1);
+                                                number = s4.substring(1);
+                                            }
+                                            operator = strReplace(operator);
+                                            formulaData = split1[0] + operator + extractPureNumbers(number);
+                                        }
+                                    } else{
+                                        f = f.replace(el, "数据错误,无法比较");
+                                        break;
+                                    }
+                                    Integer ist = Expression.parse(formulaData + "?1:0").calculate(currentMap);
+                                    count += ist;
+                                }
+                                Object data = null;
+                                if(count == split.length){
+                                    data = pa[1];
+                                }else{
+                                    data = pa[2];
+                                }
+                                f = f.replace(el, putDataWithKey(data, tec));
+                            } else {
+                                f = f.replace(el, "参数格式错误");
+                            }
+
                         }
+                        max++;
+                    } while (f.contains("ifelse") && max < 20);
+                }else{
+                    int max = 0;
+                    do {
+                        Matcher m = RegexUtils.matcher(FC_REG + "(ifelse)\\(([^)]+)\\)", f);
+                        while (m.find()) {
+                            String el = m.group();
+                            String pstr = el.replaceAll("^" + FC_REG + "ifelse\\(", "").replaceAll("\\)$", "");
+                            String[] pa = pstr.split(",");
+                            if (pa.length == 3) {
+                                Object data = Expression.parse(pa[0] + "?" + pa[1] + ":" + pa[2]).calculate(createCurrentMap(el, tec));
+                                f = f.replace(el, putDataWithKey(data, tec));
+                            } else {
+                                f = f.replace(el, "参数格式错误");
+                            }
 
-                    }
-                    max++;
-                } while (f.contains("ifelse") && max < 20);
+                        }
+                        max++;
+                    } while (f.contains("ifelse") && max < 20);
+                }
             }
             if (f.contains("avg4segment")) {
                 Matcher m = RegexUtils.matcher(FC_REG + "(avg4segment)\\(([^)]+)\\)", f);
@@ -5049,6 +5192,64 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
         }
     }
 
+    /**
+     * 符号替换
+     * @param s1
+     * @return
+     */
+    public String strReplace(String s1){
+        if(Objects.equals("≥",s1)){
+            s1 = ">=";
+        }
+        if(Objects.equals("≤",s1)){
+            s1 = "<=";
+        }
+        if(Objects.equals("≠",s1)){
+            s1 = "!=";
+        }
+        if(Objects.equals("=",s1)){
+            s1 = "==";
+        }
+        if(Objects.equals("<",s1)){
+            s1 = "<";
+        }
+        if(Objects.equals("&lt;",s1)){
+            s1 = "<";
+        }
+        if(Objects.equals(">",s1)){
+            s1 = ">";
+        }
+        if(Objects.equals("&gt;",s1)){
+            s1 = ">";
+        }
+        return s1;
+    }
+
+    /**
+     * 字符串取数字
+     * @param input
+     * @return
+     */
+    public static String extractPureNumbers(String input) {
+        if (input == null || input.isEmpty()) {
+            return null;
+        }
+
+        // 检查第一个字符是否为数字
+        if (Character.isDigit(input.charAt(0))) {
+            int endIndex = 1;
+            // 遍历后续字符,直到遇到非数字或字符串结束
+            while (endIndex < input.length() && Character.isDigit(input.charAt(endIndex))) {
+                endIndex++;
+            }
+            // 返回开头的连续数字子串
+            return input.substring(0, endIndex);
+        }
+        // 如果开头不是数字,返回空字符串
+        return null;
+    }
+
+
     /*合格率预处理*/
     public void quantity(Formula formula, FormData fd, String f, TableElementConverter tec) {
         /*聚合*/