yangyj 8 months ago
parent
commit
b18a3e4802

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

@@ -0,0 +1,44 @@
+package org.springblade.manager.vo;
+
+import com.alibaba.fastjson.annotation.JSONField;
+import io.swagger.annotations.ApiModelProperty;
+
+/**
+ * @author yangyj
+ * @Date 2024/7/5 11:46
+ * @description 审批意见
+ */
+public class MeterApproveOpinion implements DataModel{
+    public static final String ID="20201000000";
+    public static final String TBN="MAOpi";
+    public static final String TBN_CH="计量期审批意见";
+    @JSONField(name = "key_1",label="总监理工程师意见",ordinal = 1)
+    private String chiefSupervisor;
+
+    @JSONField(name = "key_2",label="监理审核意见",ordinal = 1)
+    private String supervisorAudit;
+
+    @JSONField(name = "key_3",label="工程建设部意见",ordinal = 1)
+    private String projectBuild;
+
+    @JSONField(name = "key_4",label="工程建设部分管领导意见",ordinal = 1)
+    private String projectBuildLeader;
+
+    @JSONField(name = "key_5",label="安全管理部意见",ordinal = 1)
+    private String safetyManager;
+
+    @JSONField(name = "key_6",label="安全管理部分管领导意见",ordinal = 1)
+    private String safetyManagerLeader;
+
+    @JSONField(name = "key_7",label="合同部意见",ordinal = 1)
+    private String contractDept;
+
+    @JSONField(name = "key_8",label="合同部分管领导意见",ordinal = 1)
+    private String contractDeptLeader;
+
+    @JSONField(name = "key_9",label="总经理意见",ordinal = 1)
+    private String generalManager;
+
+    @JSONField(name = "key_10",label="董事长意见",ordinal = 1)
+    private String chiefExecutive;
+}

+ 3 - 0
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/MeterInfo.java

@@ -60,6 +60,9 @@ public class MeterInfo {
     /**上期*/
     public MeterPeriodInfo previousPeriodInfo;
 
+    /**审批意见*/
+    public MeterApproveOpinion approveOpinion;
+
     /**需要延后生成FormData(元素对象)*/
     List<DataModel> delay =new LinkedList<>();
     /**合同工程清单*/

+ 2 - 0
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/ReportResult.java

@@ -45,6 +45,8 @@ public class ReportResult {
     private Map<String,String> eSignMap = new HashMap<>();
     /**合并单元格,格式:{页码@x@y}*/
     private Set<String> mergeCellsSet = new HashSet<>();
+    /**删除行号1-3表示1到3行,1,3表示1和3行*/
+    private String deleteRow;
     /**模板类型*/
     private Integer modelType=MeterInfo.MB_GX;
 

+ 6 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/formula/impl/ExecutorInit.java

@@ -40,6 +40,7 @@ public class ExecutorInit extends FormulaExecutor {
     }
     private Function<Long, BaseInfo> baseInfoFc;
     private Function<Long, MeterPeriodInfo>  meterPeriodFc;
+    private Function<Long, MeterApproveOpinion>  approveOpinionFc;
     private Function<Long, List<MeterTree>> meterTreeFc;
     private Function<Long, List<StartPayForm>> stayPayFormFc;
     private Function<Long, List<Material>> materialFormFc;
@@ -61,6 +62,11 @@ public class ExecutorInit extends FormulaExecutor {
         delay.add(addBaseInfo());
         /*计量期信息*/
         delay.add(addPeriodInfo());
+        MeterApproveOpinion approve=approveOpinionFc.apply(tec.getPeriodId());
+        if(approve!=null) {
+            tec.meterInfo.setApproveOpinion(approve);
+            delay.add(approve);
+        }
         /*是否固定值*/
         tec.formDataMap.values().stream().filter(FormData::isFixed).forEach(fd->{
             fd.setRepeat(true);

+ 7 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/formula/impl/ExecutorMeter.java

@@ -831,6 +831,13 @@ public class ExecutorMeter extends FormulaExecutor {
                               t.setPreviousPeriodEndChangeMoney("");
                               t.setCurrentPeriodChangeMoney("");
                               t.setCurrentPeriodEndChangeMoney("");
+                              int over= capacity-dataList.size()-payItemZj.size();
+                              if(over>0){
+                                  int index = dataList.indexOf(t);
+                                  for(int i=0;i<over;i++){
+                                      dataList.add(index,new InterimPaymentCertificate(""));
+                                  }
+                              }
                      });
                      dataList.addAll(payItemZj);
                      /*生成中期支付证书可编辑列表*/

+ 2 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/service/IFormulaDao.java

@@ -15,6 +15,8 @@ public interface IFormulaDao {
     Function<Long, BaseInfo> getBaseInfoFc();
     /**获取开工材料计量期*/
     Function<Long, MeterPeriodInfo> getMeterPeriodFc();
+    /**获取计量期审批意见*/
+    Function<Long, MeterApproveOpinion>  getApproveOpinionFc();
     /**获取清单信息*/
     Function<Long, List<Material>> getMaterialFormFc();
     /**开工预付款支付清单*/

+ 12 - 5
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/FormulaDaoImpl.java

@@ -3,19 +3,16 @@ package org.springblade.manager.service.impl;
 import com.mixsmart.utils.StringUtils;
 import lombok.RequiredArgsConstructor;
 import org.springblade.common.utils.BaseUtils;
-import org.springblade.core.tool.utils.BeanUtil;
 import org.springblade.core.tool.utils.Func;
-import org.springblade.manager.dto.TreeNode;
 import org.springblade.manager.entity.ContractInfo;
 import org.springblade.manager.entity.ProjectInfo;
-import org.springblade.manager.entity.TrialSelfDataRecord;
+
 import org.springblade.manager.service.IContractInfoService;
 import org.springblade.manager.service.IFormulaDao;
 import org.springblade.manager.service.IProjectInfoService;
 import org.springblade.manager.vo.*;
 import org.springblade.meter.entity.ChangeTokenForm;
 import org.springblade.meter.entity.InterimPayCertificateItem;
-import org.springblade.meter.entity.MeterContractInfo;
 import org.springframework.beans.BeanUtils;
 import org.springframework.jdbc.core.BeanPropertyRowMapper;
 import org.springframework.jdbc.core.JdbcTemplate;
@@ -25,7 +22,6 @@ import java.time.format.DateTimeFormatter;
 import java.util.*;
 import java.util.function.BiFunction;
 import java.util.function.Function;
-import java.util.stream.Collectors;
 
 /**
  * @author yangyj
@@ -101,6 +97,17 @@ public class FormulaDaoImpl implements IFormulaDao {
         };
     }
 
+    @Override
+    public Function<Long, MeterApproveOpinion> getApproveOpinionFc() {
+        return  periodId-> {
+            List<MeterApproveOpinion> beans = this.jdbcTemplate.query("select b.* from u_task  a join s_meter_approve_opinion b on a.id=b.task_id where a.form_data_id="+periodId, new BeanPropertyRowMapper<>(MeterApproveOpinion.class));
+            if(beans.size()>0){
+                return beans.get(0);
+            }
+            return null;
+        };
+    }
+
     @Override
     public Function<Long, List<Material>> getMaterialFormFc() {
         return contractId->{

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

@@ -33,9 +33,12 @@ import org.apache.poi.ss.usermodel.*;
 import org.apache.poi.ss.util.CellRangeAddress;
 import org.apache.poi.util.IOUtils;
 import org.apache.poi.xssf.usermodel.XSSFRichTextString;
+import org.apache.poi.xssf.usermodel.XSSFSheet;
 import org.jsoup.Jsoup;
 import org.jsoup.nodes.Element;
 import org.jsoup.select.Elements;
+import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTMergeCell;
+import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTMergeCells;
 import org.springblade.business.entity.*;
 import org.springblade.business.feign.TaskClient;
 import org.springblade.common.constant.ClientIdConstant;
@@ -97,6 +100,7 @@ import java.util.*;
 import java.util.concurrent.CompletableFuture;
 import java.util.concurrent.ExecutionException;
 import java.util.function.Function;
+import java.util.regex.Matcher;
 import java.util.stream.Collectors;
 
 import static org.bouncycastle.asn1.x500.style.RFC4519Style.o;
@@ -3290,6 +3294,9 @@ public class TaskController extends BladeController {
                 reportResults.removeIf(rs -> !fileUrlMapping.containsKey(rs.getExcelId().toString()));
                 /*准备*/
                 reportResults.forEach(rs -> {
+                    if(rs.getInitTableName().equals("m_20240325154016_1772166597482381312")){
+                        rs.setDeleteRow("13,15");
+                    }
                     /*初始化路径*/
                     rs.pathInit(file_path,report.getContractId());
                     rs.setExcelUrl(fileUrlMapping.get(rs.getExcelId().toString()));
@@ -3378,6 +3385,14 @@ public class TaskController extends BladeController {
                                         sheet.addMergedRegionUnsafe(ca);
                                     });
                                 }
+                                /*删除指定范围行*/
+                                String deleteRow=rs.getDeleteRow();
+                                if(deleteRow!=null&&!deleteRow.isEmpty()){
+                                   LinkedList<Integer> rowIds=  Arrays.stream(deleteRow.split("\\D+")).map(Integer::parseInt).collect(Collectors.toCollection(LinkedList::new));
+                                   if(rowIds.size()>=2) {
+                                      // deleteRows2(sheet, rowIds.getFirst(), rowIds.getLast());
+                                   }
+                                }
                                 //去掉表格虚线
                                 sheet.setPrintGridlines(false);
                                 //设置 整个工作表为一页
@@ -3444,7 +3459,140 @@ public class TaskController extends BladeController {
         return R.data(fileUrl);
     }
 
-     /*固定合并*/
+    public  void deleteRows(Sheet sheet, int startRow, int endRow) {
+        for (int i = startRow; i <= endRow; i++) {
+            int lastRowNum = sheet.getLastRowNum();
+            if (i >= 0 && i < lastRowNum) {
+                sheet.shiftRows(i + 1, lastRowNum, -1);
+            }
+            if (i == lastRowNum) {
+                Row removingRow = sheet.getRow(i);
+                if (removingRow != null) {
+                    sheet.removeRow(removingRow);
+                }
+            }
+        }
+    }
+    public static void deleteMergedRegions(Sheet sheet, int rowIndex) {
+        if (sheet instanceof XSSFSheet) {
+            XSSFSheet xssfSheet = (XSSFSheet) sheet;
+            CTMergeCells ctMergeCells = xssfSheet.getCTWorksheet().getMergeCells();
+
+            if (ctMergeCells != null) {
+                for (int i = ctMergeCells.sizeOfMergeCellArray() - 1; i >= 0; i--) {
+                    CTMergeCell ctMergeCell = ctMergeCells.getMergeCellArray(i);
+                    CellRangeAddress cellRangeAddress = CellRangeAddress.valueOf(ctMergeCell.getRef());
+
+                    if (cellRangeAddress.getFirstRow() <= rowIndex && cellRangeAddress.getLastRow() >= rowIndex) {
+                        ctMergeCells.removeMergeCell(i);
+                    }
+                }
+            }
+        }
+    }
+    public  void deleteRows2(Sheet sheet, int startRow, int endRow) {
+        int lastRowNum = sheet.getLastRowNum();
+        deleteMergedRegions(sheet, Objects.requireNonNull(getMergedRegions(sheet, coords2Int("A" + (startRow+1) + "~" + "R" + (endRow+1)))));
+        for (int i = endRow; i >= startRow; i--) {
+            deleteMergedRegions(sheet,i);
+            Row row = sheet.getRow(i);
+            if (row != null) {
+                sheet.removeRow(row);
+            }
+        }
+        /*deleteMergedRegions(sheet, Objects.requireNonNull(getMergedRegions(sheet, coords2Int("A" + (startRow+1) + "~" + "R" + (endRow+1)))));*/
+        sheet.shiftRows(endRow + 1, lastRowNum, -3);
+        System.out.println();
+    }
+    public static void deleteMergedRegions(Sheet sheet, List<CellRangeAddress> regionsToDelete) {
+        for (CellRangeAddress region : regionsToDelete) {
+            // 获取合并区域的数量
+            for (int i = sheet.getNumMergedRegions() - 1; i >= 0; i--) {
+                CellRangeAddress mergedRegion = sheet.getMergedRegion(i);
+                if (mergedRegion.formatAsString().equals(region.formatAsString())) {
+                    sheet.removeMergedRegion(i);
+                }
+            }
+        }
+    }
+    public static List<CellRangeAddress> getMergedRegions(Sheet sheet, String coords) {
+        List<CellRangeAddress> result = new ArrayList<>();
+        if(sheet.getMergedRegions()!=null&&StringUtils.isNotEmpty(coords)){
+            for(CellRangeAddress ca:sheet.getMergedRegions()){
+                int firstColumn = ca.getFirstColumn();
+                int lastColumn = ca.getLastColumn();
+                int firstRow = ca.getFirstRow();
+                int lastRow = ca.getLastRow();
+                Matcher mu = BaseUtils.matcher("(\\d{1,3}),(\\d{1,3}),(\\d{1,3}),(\\d{1,3})",coords);
+                /*合并单元格四个角坐标,只要任意一个在落在将要合并的区域里面意味着两者重合,就必须拆分前者*/
+                List<Integer[]> corners = Arrays.asList(new Integer[]{firstColumn,firstRow},new Integer[]{lastColumn,firstRow},new Integer[]{firstColumn,lastRow},new Integer[]{lastColumn,lastRow});
+                if(mu.find()){
+                    int firstColumn2 = BaseUtils.handleObj2Integer(mu.group(1));
+                    int lastColumn2 = BaseUtils.handleObj2Integer(mu.group(3));
+                    int firstRow2 = BaseUtils.handleObj2Integer(mu.group(2));
+                    int lastRow2 = BaseUtils.handleObj2Integer(mu.group(4));
+                    for(Integer[] corner:corners){
+                        if(firstColumn2<=corner[0]&&corner[0]<=lastColumn2&&firstRow2<=corner[1]&&corner[1]<=lastRow2){
+                            result.add(ca);
+                        }
+                    }
+                }
+            }
+        }
+        if(Func.isNotEmpty(result)){
+            result=result.stream().distinct().collect(Collectors.toList());
+            return result;
+        }
+        return null;
+    }
+
+    public static String coords2Int(String coords){
+        Matcher mx =BaseUtils.matcher("([A-Z]{1,3})(\\d{1,3})[~|\\-|,|#]([A-Z]{1,3})(\\d{1,3})",coords);
+        if(mx.find()) {
+            return coords4Ints(mx);
+        }
+        return null;
+    }
+    public static String coords4Ints(Matcher mx){
+        List<Integer> l = new ArrayList<>();
+        for (int i = 1; i <= mx.groupCount(); i++) {
+            if (i % 2 == 0) {
+                l.add(BaseUtils.handleObj2Integer(mx.group(i)) - 1);
+            } else {
+                l.add(BaseUtils.parseColumn(mx.group(i)));
+            }
+        }
+        return l.get(0)+","+l.get(1)+","+l.get(2)+","+l.get(3);
+    }
+
+    public  void deleteRows3(Sheet sheet, int startRow, int endRow) {
+        // 处理合并单元格
+        for (int i = sheet.getNumMergedRegions() - 1; i >= 0; i--) {
+            CellRangeAddress mergedRegion = sheet.getMergedRegion(i);
+            if ((mergedRegion.getFirstRow() >= startRow && mergedRegion.getFirstRow() <= endRow) ||
+                    (mergedRegion.getLastRow() >= startRow && mergedRegion.getLastRow() <= endRow)) {
+                // 删除在删除行范围内的合并单元格
+                sheet.removeMergedRegion(i);
+            }
+        }
+
+        // 移动行
+        int lastRowNum = sheet.getLastRowNum();
+        if (endRow < lastRowNum) {
+            sheet.shiftRows(endRow + 1, lastRowNum, -(endRow - startRow + 1));
+        }
+
+        // 移除多余的最后几行
+        for (int i = lastRowNum; i > lastRowNum - (endRow - startRow + 1); i--) {
+            Row removingRow = sheet.getRow(i);
+            if (removingRow != null) {
+                sheet.removeRow(removingRow);
+            }
+        }
+    }
+
+
+    /*固定合并*/
     private void mergeCells(Sheet sheet, List<ReportMergeCellsConfig> configList){
         if(configList.size()>0){
             configList.forEach(c->{