فهرست منبع

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

yangyj 1 سال پیش
والد
کامیت
db1631614b
17فایلهای تغییر یافته به همراه227 افزوده شده و 107 حذف شده
  1. 27 0
      blade-ops-api/blade-resource-api/src/main/java/org/springblade/resource/dto/batchDownloadFileDTO.java
  2. 31 0
      blade-ops/blade-resource/src/main/java/org/springblade/resource/endpoint/LargeFileEndpoint.java
  3. 6 0
      blade-service-api/blade-meter-api/src/main/java/org/springblade/meter/entity/MeterContractInfo.java
  4. 4 1
      blade-service-api/blade-meter-api/src/main/java/org/springblade/meter/vo/ContractMeterPeriodVO.java
  5. 1 1
      blade-service-api/blade-meter-api/src/main/java/org/springblade/meter/vo/MeterLinkWbsInfoVO.java
  6. 7 0
      blade-service/blade-business/src/main/java/org/springblade/business/feignClient/TaskClientImpl.java
  7. 4 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ContractInfoServiceImpl.java
  8. 3 3
      blade-service/blade-meter/src/main/java/org/springblade/meter/controller/ContractInventoryFormController.java
  9. 9 9
      blade-service/blade-meter/src/main/java/org/springblade/meter/controller/ContractMaterialAdjustController.java
  10. 15 3
      blade-service/blade-meter/src/main/java/org/springblade/meter/controller/ContractMeterPeriodController.java
  11. 4 2
      blade-service/blade-meter/src/main/java/org/springblade/meter/controller/TaskController.java
  12. 2 1
      blade-service/blade-meter/src/main/java/org/springblade/meter/mapper/ContractMeterPeriodMapper.xml
  13. 2 2
      blade-service/blade-meter/src/main/java/org/springblade/meter/service/IContractMaterialAdjustService.java
  14. 55 57
      blade-service/blade-meter/src/main/java/org/springblade/meter/service/impl/ContractMaterialAdjustServiceImpl.java
  15. 9 3
      blade-service/blade-meter/src/main/java/org/springblade/meter/service/impl/ContractMeterPeriodServiceImpl.java
  16. 8 0
      blade-service/blade-meter/src/main/java/org/springblade/meter/service/impl/MeterTreeContractServiceImpl.java
  17. 40 25
      blade-service/blade-meter/src/main/java/org/springblade/meter/service/impl/MiddleMeterApplyServiceImpl.java

+ 27 - 0
blade-ops-api/blade-resource-api/src/main/java/org/springblade/resource/dto/batchDownloadFileDTO.java

@@ -0,0 +1,27 @@
+package org.springblade.resource.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotNull;
+import javax.validation.constraints.Size;
+import java.util.List;
+
+/**
+ * @Param
+ * @Author wangwl
+ * @Date 2024/4/26 11:54
+ **/
+@Data
+public class batchDownloadFileDTO {
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty(value = "文件id集合")
+    @NotNull(message = "请传入要下载的文件id集合!")
+    @Size(min = 1,message = "至少选择一个文件")
+    private List<Long> ids;
+
+    @ApiModelProperty(value = "1档案文件2档案")
+    @NotNull(message = "请传入文件类型")
+    private Integer type;
+}

+ 31 - 0
blade-ops/blade-resource/src/main/java/org/springblade/resource/endpoint/LargeFileEndpoint.java

@@ -26,9 +26,12 @@ import org.apache.commons.fileupload.disk.DiskFileItem;
 import org.apache.commons.io.FileUtils;
 import org.apache.commons.lang.StringUtils;
 import org.apache.pdfbox.pdmodel.PDDocument;
+import org.apache.poi.ss.formula.FormulaShifter;
+import org.springblade.business.entity.ArchiveFile;
 import org.springblade.common.constant.CommonConstant;
 import org.springblade.common.utils.SystemUtils;
 import org.springblade.core.cache.utils.CacheUtil;
+import org.springblade.core.log.exception.ServiceException;
 import org.springblade.core.oss.model.BladeFile;
 import org.springblade.core.secure.annotation.PreAuth;
 import org.springblade.core.tenant.annotation.NonDS;
@@ -36,6 +39,7 @@ import org.springblade.core.tool.api.R;
 import org.springblade.core.tool.constant.RoleConstant;
 import org.springblade.core.tool.utils.ObjectUtil;
 import org.springblade.resource.builder.oss.OssBuilder;
+import org.springblade.resource.dto.batchDownloadFileDTO;
 import org.springblade.resource.entity.LargeFile;
 import org.springblade.resource.feign.CommonFileClient;
 import org.springblade.resource.service.ILargeFileService;
@@ -46,11 +50,13 @@ import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.data.redis.core.StringRedisTemplate;
 import org.springframework.http.MediaType;
+import org.springframework.jdbc.core.JdbcTemplate;
 import org.springframework.util.DigestUtils;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.multipart.MultipartFile;
 import org.springframework.web.multipart.commons.CommonsMultipartFile;
 
+import javax.validation.Valid;
 import java.io.*;
 import java.lang.reflect.Method;
 import java.nio.MappedByteBuffer;
@@ -91,6 +97,8 @@ public class LargeFileEndpoint {
 
     private final String endpoint = "http://oss-cn-hangzhou.aliyuncs.com";
 
+    private final JdbcTemplate jdbcTemplate;
+
     /**
      * 创建存储桶
      *
@@ -265,6 +273,29 @@ public class LargeFileEndpoint {
         return uploadByMappedByteBuffer(param);
     }
 
+    /**
+     * 批量下载文件
+     * @return
+     */
+    @PostMapping("batch-download-file")
+    public void batchDownloadFile(@Valid @RequestBody batchDownloadFileDTO dto){
+        List<Long> ids = dto.getIds();
+        if (dto.getType() == 1){
+            List<ArchiveFile> files = jdbcTemplate.queryForList("select id,file_name,pdf_file_url from u_archive_file where id in(" + StringUtils.join(ids, ",") + ")", ArchiveFile.class);
+            if (files.size() == 0){
+                throw new ServiceException("从文件id中未查找到文件数据");
+            }
+            for (ArchiveFile file : files) {
+                if (StringUtils.isNotBlank(file.getPdfFileUrl())){
+
+                }
+            }
+        }else if (dto.getType() == 2){
+
+        }
+        System.out.println(7777);
+    }
+
     public static String getSysLocalFileUrl() {
         String file_path = ParamCache.getValue(CommonConstant.SYS_LOCAL_URL);
         if (SystemUtils.isMacOs()) {

+ 6 - 0
blade-service-api/blade-meter-api/src/main/java/org/springblade/meter/entity/MeterContractInfo.java

@@ -88,5 +88,11 @@ public class MeterContractInfo extends BaseEntity {
     @ApiModelProperty(value = "中期计量最高支付比例")
     private BigDecimal middlePayRatio;
 
+    @ApiModelProperty(value = "7天强度")
+    private BigDecimal sevenRatio;
+
+    @ApiModelProperty(value = "28天强度")
+    private BigDecimal twentyEightRatio;
+
 }
 

+ 4 - 1
blade-service-api/blade-meter-api/src/main/java/org/springblade/meter/vo/ContractMeterPeriodVO.java

@@ -35,7 +35,10 @@ public class ContractMeterPeriodVO extends ContractMeterPeriod {
 	@ApiModelProperty(value = "存在数据状态,0不存在,1已存在。如果存在数据则不能删除可以修改")
 	private Integer dataStatus;
 
-	@ApiModelProperty(value = "引用状态,0未引用,1引用。如果被引用就不能删除不能修改")
+	@ApiModelProperty(value = "报表引用状态,0未引用,1引用。如果被引用就不能删除不能修改")
 	private Integer citeStatus;
 
+	@ApiModelProperty(value = "材料引用状态,0未引用,1引用。最后判断引用是合并结果")
+	private Integer citeStatus2;
+
 }

+ 1 - 1
blade-service-api/blade-meter-api/src/main/java/org/springblade/meter/vo/MeterLinkWbsInfoVO.java

@@ -17,7 +17,7 @@ public class MeterLinkWbsInfoVO {
     @ApiModelProperty(value = "节点审批状态")
     private Integer appStatus;
 
-    @ApiModelProperty(value = "节点最大附件type值")
+    @ApiModelProperty(value = "节点所有附件type值")
     private Integer maxType;
 
 }

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

@@ -272,6 +272,12 @@ public class TaskClientImpl implements TaskClient {
                             LinkedHashMap::new,
                             Collectors.toList()));
 
+            //获取当前任务中所有的流程,并且去重,如果该流程已经存在,那么则不允许编辑和删除
+            List<Long> ids = taskService.list(new LambdaQueryWrapper<Task>()
+                    .select(Task::getFixedFlowId)
+                    .eq(Task::getContractId, dto.getContractId())
+                    .isNotNull(Task::getFixedFlowId)
+                    .groupBy(Task::getFixedFlowId)).stream().map(l -> l.getFixedFlowId()).collect(Collectors.toList());
             List<Map<String, Object>> result = new LinkedList<>();
             for (FixedFlow fixedFlow : fixedFlows) {
                 Map<String, Object> map = new HashMap<>();
@@ -288,6 +294,7 @@ public class TaskClientImpl implements TaskClient {
                             .keySet();
 
                     map.put("id", fixedFlow.getId());
+                    map.put("isUse", ids.contains(fixedFlow.getId()) ? 1 : 0);
                     map.put("fixedFlowName", fixedFlow.getFixedFlowName());
                     map.put("linkUserJoinString", StringUtils.join(names, ","));
                 }

+ 4 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ContractInfoServiceImpl.java

@@ -908,6 +908,10 @@ public class ContractInfoServiceImpl extends BaseServiceImpl<ContractInfoMapper,
                         throw new ServiceException("请检查整体结算比例是否在规定范围");
                     }
                 }
+                if ((meterContractInfo.getSevenRatio().compareTo(BigDecimal.ZERO) < 0 || meterContractInfo.getSevenRatio().compareTo(new BigDecimal("100")) > 0)
+                        || (meterContractInfo.getTwentyEightRatio().compareTo(BigDecimal.ZERO) < 0 || meterContractInfo.getTwentyEightRatio().compareTo(new BigDecimal("100")) > 0)){
+                    throw new ServiceException("强度比例必须在0-100范围内");
+                }
                 R r = meterContractInfoClient.saveOrUpdate(meterContractInfo);
                 if (r.getCode() != 200){
                     throw new ServiceException("保存合同计量相关信息失败,原因:"+r.getMsg());

+ 3 - 3
blade-service/blade-meter/src/main/java/org/springblade/meter/controller/ContractInventoryFormController.java

@@ -63,7 +63,7 @@ public class ContractInventoryFormController extends BladeController {
 	/**
 	 * 获取合同清单树
 	 */
-	@GetMapping("getFormTree")
+	@GetMapping("/getFormTree")
 	@ApiOperationSupport(order = 1)
 	@ApiOperation(value = "获取合同清单树", notes = "返回全加载树")
 	@ApiImplicitParams(value = {
@@ -78,7 +78,7 @@ public class ContractInventoryFormController extends BladeController {
 	/**
 	 * 获取合同清单树懒加载
 	 */
-	@GetMapping("lazyTree")
+	@GetMapping("/lazyTree")
 	@ApiOperationSupport(order = 1)
 	@ApiOperation(value = "获取合同清单树-懒加载", notes = "返回懒加载树,首次节点父id传0")
 	@ApiImplicitParams(value = {
@@ -92,7 +92,7 @@ public class ContractInventoryFormController extends BladeController {
 	}
 
 
-	@PostMapping("importExcel")
+	@PostMapping("/importExcel")
 	@ApiOperationSupport(order = 1)
 	@ApiOperation(value = "导入excel", notes = "导入excel")
 	public R<String> importExcel(@RequestParam("file") MultipartFile file,Long projectId, Long contractId) {

+ 9 - 9
blade-service/blade-meter/src/main/java/org/springblade/meter/controller/ContractMaterialAdjustController.java

@@ -20,25 +20,17 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
-import io.swagger.annotations.ApiParam;
 import lombok.AllArgsConstructor;
 import org.springblade.core.boot.ctrl.BladeController;
-import org.springblade.core.mp.support.Condition;
-import org.springblade.core.mp.support.Query;
 import org.springblade.core.tool.api.R;
-import org.springblade.core.tool.utils.Func;
 import org.springblade.meter.dto.ContractMaterialAdjustAddDTO;
 import org.springblade.meter.dto.ContractMaterialDTO2;
-import org.springblade.meter.entity.AttachmentForm;
-import org.springblade.meter.entity.ContractMaterial;
+import org.springblade.meter.entity.ContractMaterialAdjust;
 import org.springblade.meter.entity.ContractMaterialAdjustDetail;
-import org.springblade.meter.service.IAttachmentFormService;
 import org.springblade.meter.service.IContractMaterialAdjustService;
 import org.springblade.meter.vo.ContractMaterialAdjustVO;
 import org.springblade.meter.vo.MaterialAdjustDetailVO;
-import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
-import javax.validation.groups.Default;
 
 import javax.validation.Valid;
 import java.util.List;
@@ -106,5 +98,13 @@ public class ContractMaterialAdjustController extends BladeController {
         return R.success("删除成功");
     }
 
+    @PostMapping("/material-adjust-calculate")
+    @ApiOperationSupport(order = 8)
+    @ApiOperation(value = "材料明细-计算调差数量与金额", notes = "传入传入市场价,基准价,价差幅度,材料明细集合,返回调差数量,调差金额,调差计算式")
+    public R<ContractMaterialAdjust> materialAdjustCalculate(@Valid @RequestBody ContractMaterialAdjustAddDTO dto) {
+        ContractMaterialAdjust adjust = adjustService.MaterialAdjustCalculateDTO(dto);
+        return R.data(adjust);
+    }
+
 
 }

+ 15 - 3
blade-service/blade-meter/src/main/java/org/springblade/meter/controller/ContractMeterPeriodController.java

@@ -31,8 +31,10 @@ import org.springblade.core.mp.support.Query;
 import org.springblade.core.tool.api.R;
 import org.springblade.core.tool.utils.Func;
 import org.springblade.meter.dto.ContractMeterPeriodDTO;
+import org.springblade.meter.entity.ContractMaterialAdjust;
 import org.springblade.meter.entity.InterimPayCertificate;
 import org.springblade.meter.entity.MeterPeriod;
+import org.springblade.meter.service.IContractMaterialAdjustService;
 import org.springblade.meter.service.IInterimPayCertificateService;
 import org.springblade.meter.vo.ContractMeterPeriodVO;
 import org.springframework.transaction.annotation.Transactional;
@@ -61,6 +63,7 @@ public class ContractMeterPeriodController extends BladeController {
 
 	private final IContractMeterPeriodService contractMeterPeriodService;
 	private final IInterimPayCertificateService interimPayCertificateService;
+	private final IContractMaterialAdjustService adjustService;
 
 	/**
 	 * 分页
@@ -90,11 +93,20 @@ public class ContractMeterPeriodController extends BladeController {
 		}else {
 			/*如果被删除的计量期已经关联中期支付证书,则不允许删除,必须先删除报表yangyj 20240514*/
             List<Long> ids= this.interimPayCertificateService.existCertificate(dto.getContractId());
-            if(ids.size()>0){
-				List<Long> cpIds = list.stream().map(ContractMeterPeriod::getId).collect(Collectors.toList());
+			List<Long> cpIds = list.stream().map(ContractMeterPeriod::getId).collect(Collectors.toList());
+			if(ids.size()>0){
 				/*当前计量期集合是否涵盖所有支付证书里的计量期id*/
 				if(!cpIds.containsAll(ids)){
-					return R.fail("已经关联中期支付证书,无法删除");
+					return R.fail("有计量期已经关联中期支付证书,无法删除");
+				}
+			}
+			//校验是否删除了关联材料
+			List<Long> ids2 = adjustService.list(new LambdaQueryWrapper<ContractMaterialAdjust>()
+							.eq(ContractMaterialAdjust::getContractId, dto.getContractId()))
+					.stream().map(l -> l.getMeterPeriodId()).collect(Collectors.toList());
+			if(ids2.size()>0){
+				if(!cpIds.containsAll(ids2)){
+					return R.fail("有计量期已经关联中期支付证书,无法删除");
 				}
 			}
 			//存在数据,先删再存,循环排序

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

@@ -1215,10 +1215,12 @@ public class TaskController extends BladeController {
                 List<FixedFlowLink> query = jdbcTemplate.query("SELECT * FROM u_fixed_flow_link WHERE fixed_flow_id = ?", new Object[]{task.getFixedFlowId()}, new BeanPropertyRowMapper<>(FixedFlowLink.class));
                 //校验当前用户在第几流程
                 Integer sort = query.stream().collect(Collectors.toMap(l -> l.getFixedFlowLinkUser(), l -> l.getFixedFlowBranchSort())).get(AuthUtil.getUserId());
+                // 为空则代表是上报人,直接显示当前结果
                 if (sort == null){
-                    throw new ServiceException("未获取到当前用户在流程中的信息");
+                    currentUserFlow = 2;
+                }else {
+                    currentUserFlow = sort;
                 }
-                currentUserFlow = sort;
 
                 Map<String, List<FixedFlowLink>> group = query.stream()
                         .collect(Collectors.groupingBy(obj -> obj.getFixedFlowLink() + "@@@" + obj.getFixedFlowLinkType(),

+ 2 - 1
blade-service/blade-meter/src/main/java/org/springblade/meter/mapper/ContractMeterPeriodMapper.xml

@@ -40,7 +40,8 @@
     <select id="allPeriod" resultType="org.springblade.meter.vo.ContractMeterPeriodVO">
         select *,
                if((select count(1) from s_middle_meter_apply mma where contract_id = #{contractId} and is_deleted = 0 and mma.contract_period_id = cmp.id)=0,0,1) as dataStatus,
-               if((select count(1) from s_interim_pay_certificate ipc where contract_id = #{contractId} and is_deleted = 0 and ipc.contract_period_id = cmp.id)=0,0,1) as citeStatus
+               if((select count(1) from s_interim_pay_certificate ipc where contract_id = #{contractId} and is_deleted = 0 and ipc.contract_period_id = cmp.id)=0,0,1) as citeStatus,
+               if((select count(1) from s_contract_material_adjust cma where contract_id = #{contractId} and is_deleted = 0 and cma.meter_period_id = cmp.id)=0,0,1) as citeStatus2
         from s_contract_meter_period cmp
         where is_deleted = 0 and contract_id = #{contractId}
         ORDER BY sort

+ 2 - 2
blade-service/blade-meter/src/main/java/org/springblade/meter/service/IContractMaterialAdjustService.java

@@ -20,14 +20,12 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
 import org.springblade.core.mp.base.BaseService;
 import org.springblade.meter.dto.ContractMaterialAdjustAddDTO;
 import org.springblade.meter.dto.ContractMaterialDTO2;
-import org.springblade.meter.entity.AttachmentForm;
 import org.springblade.meter.entity.ContractMaterialAdjust;
 import org.springblade.meter.entity.ContractMaterialAdjustDetail;
 import org.springblade.meter.vo.ContractMaterialAdjustVO;
 import org.springblade.meter.vo.MaterialAdjustDetailVO;
 
 import java.util.List;
-import java.util.Set;
 
 /**
  * 附件表 服务类
@@ -49,4 +47,6 @@ public interface IContractMaterialAdjustService extends BaseService<ContractMate
     void update2(ContractMaterialAdjustAddDTO dto);
 
     void delete(Long id);
+
+    ContractMaterialAdjust MaterialAdjustCalculateDTO(ContractMaterialAdjustAddDTO dto);
 }

+ 55 - 57
blade-service/blade-meter/src/main/java/org/springblade/meter/service/impl/ContractMaterialAdjustServiceImpl.java

@@ -26,7 +26,6 @@ import org.springblade.core.mp.base.BaseServiceImpl;
 import org.springblade.meter.dto.ContractMaterialAdjustAddDTO;
 import org.springblade.meter.dto.ContractMaterialDTO2;
 import org.springblade.meter.entity.*;
-import org.springblade.meter.mapper.AttachmentFormMapper;
 import org.springblade.meter.mapper.ContractMaterialAdjustMapper;
 import org.springblade.meter.service.*;
 import org.springblade.meter.vo.ContractMaterialAdjustVO;
@@ -39,7 +38,6 @@ import java.math.BigDecimal;
 import java.math.RoundingMode;
 import java.time.format.DateTimeFormatter;
 import java.util.List;
-import java.util.Set;
 import java.util.stream.Collectors;
 
 /**
@@ -65,13 +63,6 @@ public class ContractMaterialAdjustServiceImpl extends BaseServiceImpl<ContractM
     @Override
     @Transactional
     public void add(ContractMaterialAdjustAddDTO dto) {
-        //获取材料信息,用于调差范围
-        ContractMaterial material= baseMapper.getMaterialInfo(dto.getContractMaterialId());
-        if (material == null){
-            throw new ServiceException("未获取到材料信息");
-        }
-        //获取材料有效期
-        ContractMaterialValidity validity = validityService.getById(dto.getMaterialValidityId());
         /*保存材料调差单*/
         ContractMaterialAdjust adjust = new ContractMaterialAdjust();
         BeanUtils.copyProperties(dto,adjust);
@@ -92,26 +83,7 @@ public class ContractMaterialAdjustServiceImpl extends BaseServiceImpl<ContractM
         }
 
         //计算调差金额,生成计算式
-        StringBuilder str = new StringBuilder("调差价格依据于:"+dto.getMaterialName()+
-                "("+validity.getStartDate().format(DateTimeFormatter.ofPattern("yyyyMMdd"))+"至"+
-                validity.getEndDate().format(DateTimeFormatter.ofPattern("yyyyMMdd"))+")\n");
-        BigDecimal adjustMoney;
-        BigDecimal price = dto.getMaterialPrice();
-        BigDecimal currentPrice = dto.getCurrentPrice();
-        if (price.compareTo(currentPrice) == 1){
-            //市场价低于基准价
-            adjustMoney = adjustTotal.multiply(currentPrice.subtract((price.multiply(new BigDecimal(1).subtract(material.getQuotaRatio().multiply(new BigDecimal("0.01"))))))).multiply(new BigDecimal("1.09")).setScale(2, RoundingMode.HALF_UP);
-            str.append("调差公式(标准):调增金额=调差数量×[市场价-基准价×(1-风险幅度差%)]×(1+合同增值税税率)\n");
-            str.append("调差公式(计算):"+adjustMoney+"="+adjustTotal+"*["+currentPrice+"-"+price+"*(1-"+material.getQuotaRatio()+"%)]*(1+9.0/100)");
-        }else {
-            //市场价高于基准价
-            adjustMoney = adjustTotal.multiply(currentPrice.subtract((price.multiply(new BigDecimal(1).add(material.getQuotaRatio().multiply(new BigDecimal("0.01"))))))).multiply(new BigDecimal("1.09")).setScale(2, RoundingMode.HALF_UP);
-            str.append("调差公式(标准):调增金额=调差数量×[市场价-基准价×(1+风险幅度差%)]×(1+合同增值税税率)\n");
-            str.append("调差公式(计算):"+adjustMoney+"="+adjustTotal+"*["+currentPrice+"-"+price+"*(1+"+material.getQuotaRatio()+"%)]*(1+9.0/100)");
-        }
-        adjust.setAdjustTotal(adjustTotal);
-        adjust.setAdjustMoney(adjustMoney);
-        adjust.setAdjustCalculation(str.toString());
+        this.buildCalculation(dto,adjustTotal,adjust);
         this.save(adjust);
 
         /*保存附件信息*/
@@ -174,13 +146,6 @@ public class ContractMaterialAdjustServiceImpl extends BaseServiceImpl<ContractM
     @Override
     @Transactional
     public void update2(ContractMaterialAdjustAddDTO dto) {
-        //获取材料信息,用于调差范围
-        ContractMaterial material= baseMapper.getMaterialInfo(dto.getContractMaterialId());
-        if (material == null){
-            throw new ServiceException("未获取到材料信息");
-        }
-        //获取材料有效期
-        ContractMaterialValidity validity = validityService.getById(dto.getMaterialValidityId());
         /*保存材料调差单*/
         ContractMaterialAdjust adjust = new ContractMaterialAdjust();
         BeanUtils.copyProperties(dto,adjust);
@@ -203,29 +168,9 @@ public class ContractMaterialAdjustServiceImpl extends BaseServiceImpl<ContractM
             adjustDetailService.saveBatch(details);
         }
         //计算调差金额,生成计算式
-        StringBuilder str = new StringBuilder("调差价格依据于:"+dto.getMaterialName()+
-                "("+validity.getStartDate().format(DateTimeFormatter.ofPattern("yyyyMMdd"))+"至"+
-                validity.getEndDate().format(DateTimeFormatter.ofPattern("yyyyMMdd"))+")\n");
-        BigDecimal adjustMoney = BigDecimal.ZERO;
-        BigDecimal price = dto.getMaterialPrice();
-        BigDecimal currentPrice = dto.getCurrentPrice();
-        if (price.compareTo(currentPrice) == 1){
-            //市场价低于基准价
-            adjustMoney = adjustTotal.multiply(currentPrice.subtract((price.multiply(new BigDecimal(1).subtract(material.getQuotaRatio().multiply(new BigDecimal("0.01"))))))).multiply(new BigDecimal("1.09")).setScale(2, RoundingMode.HALF_UP);
-            str.append("调差公式(标准):调增金额=调差数量×[市场价-基准价×(1-风险幅度差%)]×(1+合同增值税税率)\n");
-            str.append("调差公式(计算):"+adjustMoney+"="+adjustTotal+"*["+currentPrice+"-"+price+"*(1-"+material.getQuotaRatio()+"%)]*(1+9.0/100)");
-        }else {
-            //市场价高于基准价
-            adjustMoney = adjustTotal.multiply(currentPrice.subtract((price.multiply(new BigDecimal(1).add(material.getQuotaRatio().multiply(new BigDecimal("0.01"))))))).multiply(new BigDecimal("1.09")).setScale(2, RoundingMode.HALF_UP);
-            str.append("调差公式(标准):调增金额=调差数量×[市场价-基准价×(1+风险幅度差%)]×(1+合同增值税税率)\n");
-            str.append("调差公式(计算):"+adjustMoney+"="+adjustTotal+"*["+currentPrice+"-"+price+"*(1+"+material.getQuotaRatio()+"%)]*(1+9.0/100)");
-        }
-        adjust.setAdjustMoney(adjustMoney);
-        adjust.setAdjustTotal(adjustTotal);
-        adjust.setAdjustCalculation(str.toString());
+        this.buildCalculation(dto,adjustTotal,adjust);
         this.updateById(adjust);
 
-
         /*保存附件信息*/
         //先删除再清空id
         attachmentFormService.remove(new LambdaQueryWrapper<AttachmentForm>()
@@ -260,4 +205,57 @@ public class ContractMaterialAdjustServiceImpl extends BaseServiceImpl<ContractM
         this.removeById(id);
 
     }
+
+    @Override
+    public ContractMaterialAdjust MaterialAdjustCalculateDTO(ContractMaterialAdjustAddDTO dto) {
+        List<ContractMaterialAdjustDetail> details = dto.getDetails();
+        if (details.size() == 0){
+            throw new ServiceException("没有材料明细数据,无法计算");
+        }
+        ContractMaterialAdjust adjust = new ContractMaterialAdjust();
+        BigDecimal adjustTotal = BigDecimal.ZERO;
+        for (ContractMaterialAdjustDetail detail : details) {
+            if (detail.getChangeTotal() == null){
+                throw new ServiceException("请填写["+detail.getFormName()+"]可调量");
+            }
+            detail.setAdjustTotal(detail.getChangeTotal().multiply(detail.getAdjustFactor()).setScale(3,RoundingMode.HALF_UP));
+            adjustTotal = adjustTotal.add(detail.getAdjustTotal());
+        }
+        this.buildCalculation(dto,adjustTotal,adjust);
+        return adjust;
+    }
+
+    /**
+     * 生成材料调差计算式
+     */
+    private void buildCalculation(ContractMaterialAdjustAddDTO dto,BigDecimal adjustTotal,ContractMaterialAdjust adjust){
+        //获取材料信息,用于调差范围
+        ContractMaterial material= baseMapper.getMaterialInfo(dto.getContractMaterialId());
+        if (material == null){
+            throw new ServiceException("未获取到材料信息");
+        }
+        //获取材料有效期
+        ContractMaterialValidity validity = validityService.getById(dto.getMaterialValidityId());
+        //计算调差金额,生成计算式
+        StringBuilder str = new StringBuilder("调差价格依据于:"+dto.getMaterialName()+
+                "("+validity.getStartDate().format(DateTimeFormatter.ofPattern("yyyyMMdd"))+"至"+
+                validity.getEndDate().format(DateTimeFormatter.ofPattern("yyyyMMdd"))+")\n");
+        BigDecimal adjustMoney = BigDecimal.ZERO;
+        BigDecimal price = dto.getMaterialPrice();
+        BigDecimal currentPrice = dto.getCurrentPrice();
+        if (price.compareTo(currentPrice) == 1){
+            //市场价低于基准价
+            adjustMoney = adjustTotal.multiply(currentPrice.subtract((price.multiply(new BigDecimal(1).subtract(material.getQuotaRatio().multiply(new BigDecimal("0.01"))))))).multiply(new BigDecimal("1.09")).setScale(2, RoundingMode.HALF_UP);
+            str.append("调差公式(标准):调增金额=调差数量×[市场价-基准价×(1-风险幅度差%)]×(1+合同增值税税率)\n");
+            str.append("调差公式(计算):"+adjustMoney+"="+adjustTotal+"*["+currentPrice+"-"+price+"*(1-"+material.getQuotaRatio()+"%)]*(1+9.0/100)");
+        }else {
+            //市场价高于基准价
+            adjustMoney = adjustTotal.multiply(currentPrice.subtract((price.multiply(new BigDecimal(1).add(material.getQuotaRatio().multiply(new BigDecimal("0.01"))))))).multiply(new BigDecimal("1.09")).setScale(2, RoundingMode.HALF_UP);
+            str.append("调差公式(标准):调增金额=调差数量×[市场价-基准价×(1+风险幅度差%)]×(1+合同增值税税率)\n");
+            str.append("调差公式(计算):"+adjustMoney+"="+adjustTotal+"*["+currentPrice+"-"+price+"*(1+"+material.getQuotaRatio()+"%)]*(1+9.0/100)");
+        }
+        adjust.setAdjustMoney(adjustMoney);
+        adjust.setAdjustTotal(adjustTotal);
+        adjust.setAdjustCalculation(str.toString());
+    }
 }

+ 9 - 3
blade-service/blade-meter/src/main/java/org/springblade/meter/service/impl/ContractMeterPeriodServiceImpl.java

@@ -101,15 +101,21 @@ public class ContractMeterPeriodServiceImpl extends BaseServiceImpl<ContractMete
     }
 
     /**
-     * 计量期列表-全部 材料开工计量期表
+     * 计量期列表-全部
      */
     @Override
     public List<ContractMeterPeriodVO> allPeriod(Long contractId) {
-        return baseMapper.allPeriod(contractId);
+        List<ContractMeterPeriodVO> list = baseMapper.allPeriod(contractId);
+        for (ContractMeterPeriodVO vo : list) {
+            if (vo.getCiteStatus2() == 1){
+                vo.setCiteStatus(1);
+            }
+        }
+        return list;
     }
 
     /**
-     * 计量期列表-未关联报表 材料开工计量期表
+     * 计量期列表-未关联报表
      */
     @Override
     public List<ContractMeterPeriod> conditionPeriod(Long contractId) {

+ 8 - 0
blade-service/blade-meter/src/main/java/org/springblade/meter/service/impl/MeterTreeContractServiceImpl.java

@@ -420,6 +420,9 @@ public class MeterTreeContractServiceImpl extends BaseServiceImpl<MeterTreeContr
 
         try {
             for (MeterTreeContractSaveDTO selectNode : dataList) {
+                if (StringUtils.isBlank(selectNode.getNodeName())){
+                    throw new ServiceException("有节点未设置名称");
+                }
                 if (selectNode.getIsAddChildNode().equals(0)) {
                     /*================== 不划分子级 ==================*/
                     MeterTreeProject pObj = meterTreeProjectMapper.selectById(selectNode.getLeftNodeId());
@@ -2420,6 +2423,11 @@ public class MeterTreeContractServiceImpl extends BaseServiceImpl<MeterTreeContr
             if (vo2List.size() == 0) {
                 throw new ServiceException("请勾选需要复制的节点后再保存");
             }
+            for (CopyMeterNodeVO2 vo2 : vo2List) {
+                if (StringUtils.isBlank(vo2.getNodeName())){
+                    throw new ServiceException("节点名称不能为空");
+                }
+            }
             //先转换为树
             //再把树转换为集合
             Long l5 = System.currentTimeMillis();

+ 40 - 25
blade-service/blade-meter/src/main/java/org/springblade/meter/service/impl/MiddleMeterApplyServiceImpl.java

@@ -1152,6 +1152,9 @@ public class MiddleMeterApplyServiceImpl extends BaseServiceImpl<MiddleMeterAppl
             if (contractInfo == null || contractInfo.getMiddlePayRatio() == null){
                 throw new ServiceException("后台未设置支付比例");
             }
+            if (contractInfo.getSevenRatio() == null || contractInfo.getTwentyEightRatio() == null){
+                throw new ServiceException("后台未设置7天或28天强度支付比例");
+            }
             //查询出当前合同段所有允许自动计量的合同计量单元信息,并携带关联WBS节点逗号拼接,并携带关联清单的id逗号拼接,并携带当前计量期下当前合同计量单元的id,逗号拼接
             List<MeterTreeContractVO2> voList = baseMapper.getAllAutoMeterNode(contractId,periodId);
             //过滤,如果不存在关联WBS节点则排除,如果不存在挂载清单也排除,如果已经计量也排除
@@ -1173,7 +1176,7 @@ public class MiddleMeterApplyServiceImpl extends BaseServiceImpl<MiddleMeterAppl
                 //关联wbsId分组
                 wbsInfoVOMap = vos.stream().collect(Collectors.toMap(l -> l.getId(), l -> l));
             }
-            //循环合同计量单元,过滤掉不符合要求的计量单元
+            //循环合同计量单元,过滤掉不符合要求的计量单元
             Iterator<MeterTreeContractVO2> iterator = voList.iterator();
             //wbs拼接
             StringBuilder str = new StringBuilder();
@@ -1183,39 +1186,51 @@ public class MiddleMeterApplyServiceImpl extends BaseServiceImpl<MiddleMeterAppl
             StringBuilder str3 = new StringBuilder();
             while (iterator.hasNext()){
                 MeterTreeContractVO2 vo2 = iterator.next();
+                //先去获取对应质检的相关数据
+                List<Long> linkWbsIds = Func.toLongList(vo2.getLinkWbs());
+                Boolean isApp = false;
+                Integer strength = null;
+                for (Long id : linkWbsIds) {
+                    MeterLinkWbsInfoVO vo = wbsInfoVOMap.get(id);
+                    if (vo.getAppStatus() != 2) {
+                        isApp = true;
+                        break;
+                    }
+                    if (vo.getMaxType() == 12) {
+                        strength = 28;
+                        break;
+                    }
+                    if ((strength == null || strength != 28) && vo.getMaxType() == 11) {
+                        strength = 7;
+                    }
+                }
                 //为混凝土节点,则去找寻附件
                 if (vo2.getIsConcreteNode() == 1) {
-                    List<Long> linkWbsIds = Func.toLongList(vo2.getLinkWbs());
-                    Boolean isApp = false;
-                    Integer strength = null;
-                    for (Long id : linkWbsIds) {
-                        MeterLinkWbsInfoVO vo = wbsInfoVOMap.get(id);
-                        if (vo.getAppStatus() != 2) {
-                            isApp = true;
-                            break;
-                        }
-                        if (vo.getMaxType() == 12) {
-                            strength = 28;
-                            break;
-                        }
-                        if (vo.getMaxType() == 11) {
-                            strength = 7;
-                        }
-                    }
-                    //审批不过通过,附件不存在7天或28天,直接过滤
-                    if (isApp || strength == null) {
+                    //附件不存在7天或28天,直接过滤
+                    if (strength == null) {
                         iterator.remove();
                         continue;
                     }
                     //根据附件设置强度设置强度值
-                    if (strength == 7){
-                        vo2.setPayRatio(vo2.getSevenRatio());
+                    if (strength == 28){
+                        if (isApp){
+                            iterator.remove();
+                            continue;
+                        }else {
+                            vo2.setPayRatio(contractInfo.getTwentyEightRatio());
+                        }
                     }else {
-                        vo2.setPayRatio(vo2.getTwentyEightRatio());
+                        vo2.setPayRatio(contractInfo.getSevenRatio());
                     }
                 }else {
-                    //不为混凝土节点,直接设置强度值为后管合同段默认
-                    vo2.setPayRatio(contractInfo.getMiddlePayRatio());
+                    //不为混凝土节点
+                    //审批不通过,移除,审批通过则设置为后台比例
+                    if (isApp) {
+                        iterator.remove();
+                        continue;
+                    }else {
+                        vo2.setPayRatio(contractInfo.getMiddlePayRatio());
+                    }
                 }
                 //末尾拼接所有WBS节点,所有计量节点
                 str.append(vo2.getLinkWbs()+",");