yangyj 1 год назад
Родитель
Сommit
abe72ba33f

+ 16 - 0
blade-common/src/main/java/org/springblade/common/utils/BaseUtils.java

@@ -1,6 +1,7 @@
 package org.springblade.common.utils;
 
 import com.alibaba.cloud.commons.lang.StringUtils;
+import org.checkerframework.checker.regex.RegexUtil;
 import org.springblade.common.constant.RegexConstant;
 import org.springblade.common.vo.DataVO;
 
@@ -213,6 +214,21 @@ public class BaseUtils {
         return !isNotEmpty(value);
     }
 
+    public static List<Integer> coords2Int(String coords){
+        Matcher mx = matcher("([A-Z]{1,3})(\\d{1,3})[~|\\-|,|#]([A-Z]{1,3})(\\d{1,3})",coords);
+        List<Integer> list = new ArrayList<>();
+        if(mx.find()) {
+            list.add(Integer.parseInt(mx.group(1)));
+            list.add(Integer.parseInt(mx.group(2)));
+            list.add(Integer.parseInt(mx.group(3)));
+            list.add(Integer.parseInt(mx.group(4)));
+        }
+        return list;
+    }
+    public static Matcher matcher(String regex, String value) {
+        Pattern pattern = Pattern.compile(regex);
+        return pattern.matcher(value);
+    }
 
     public static Double[] scopeParse(Object dev, Object design, Object xN) {
         if (isNotEmpty(dev)) {

+ 89 - 0
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/ConstructionSchedule.java

@@ -0,0 +1,89 @@
+package org.springblade.manager.vo;
+
+import com.alibaba.fastjson.annotation.JSONField;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @author yangyj
+ * @Date 2024/3/27 17:46
+ * @description 施工进度表
+ */
+public class ConstructionSchedule {
+    public static final String ID="20280000000";
+    public static final String TBN="ConSch";
+    public static final String TBN_CH="施工进度表";
+    /**支付编号*/
+    @JSONField(name = "key_0",label="支付编号")
+    private String formNumber;
+    /**项目名称*/
+    @JSONField(name = "key_1",label="项目名称",ordinal = 1)
+    private String itemName;
+    /**计量单位*/
+    @JSONField(name = "key_2",label="计量单位",ordinal = 2)
+    private String unit;
+    /**合同数量*/
+    @JSONField(name = "key_3",label="合同数量",ordinal = 3)
+    private String contractTotal;
+    /**变更数量*/
+    @JSONField(name = "key_4",label="变更数量",ordinal = 4)
+    private String changeTotal;
+    /**本次完成数量*/
+    @JSONField(name = "key_5",label="本次完成数量",ordinal = 5)
+    private String currentPeriodCompleted;
+    /**至上期完成数量*/
+    @JSONField(name = "key_15",label="至上期完成数量",ordinal = 5)
+    private String previousPeriodCompleted;
+    /**累计完成数量*/
+    @JSONField(name = "key_6",label="累计完成数量",ordinal = 6)
+    private String completed;
+    /**合同金额*/
+    @JSONField(name = "key_7",label="合同金额",ordinal = 7)
+    private String contractMoney;
+    /**变更后A金额*/
+    @JSONField(name = "key_8",label="变更后A金额",ordinal = 8)
+    private String changeMoney;
+    /**上次支付金额*/
+    @JSONField(name = "key_13",label="上次支付金额",ordinal = 8)
+    private String previousPeriodPay;
+    /**本次支付金额*/
+    @JSONField(name = "key_9",label="本次支付金额",ordinal = 9)
+    private String currentPeriodPay;
+    /**累计支付B金额*/
+    @JSONField(name = "key_10",label="累计支付B金额",ordinal = 10)
+    private String currentPeriodEndPay;
+    /**比例*/
+    @JSONField(name = "key_11",label="比例",ordinal = 11)
+    private String payRatio;
+    /**第n页 共m页*/
+    @JSONField(name = "key_12",label="页码",ordinal = 101)
+    private String pageCount;
+    /**变更金额*/
+    @JSONField(name = "key_16",label="变更金额-ZJ",ordinal = 12)
+    private String adjustmentAmount;
+    /**单项占合同价*/
+    @JSONField(name = "key_17",label="单项占合同价-ZJ",ordinal = 12)
+    private String itemPercent;
+    /**单项计划完成*/
+    @JSONField(name = "key_18",label="单项计划完成-ZJ",ordinal = 12)
+    private String itemProgress;
+    /**单项计划完成*/
+    @JSONField(name = "key_19",label="本期占该合同金额-ZJ",ordinal = 12)
+    private String currentPayPercent;
+    /**本期末累计占变更后的总金额*/
+    @JSONField(name = "key_20",label="本期末累计占变更后的总金额-ZJ",ordinal = 12)
+    private String payPercent;
+    /**本期末累计占变更后的总金额*/
+    @JSONField(name = "key_21",label="按月计划与实际完成-ZJ",ordinal = 12)
+    private List<List<Payment>> monthlyCompletion = new ArrayList<>() ;
+    /**累计实际完成*/
+    @JSONField(name = "key_22",label="累计实际完成-ZJ",ordinal = 102)
+    private String actualCompletion;
+    /**本次实际完成*/
+    @JSONField(name = "key_23",label="本次实际完成-ZJ",ordinal = 102)
+    private String currentCompletion;
+    /**合同概要*/
+    @JSONField(name = "key_24",label="合同概要-ZJ",ordinal = 106)
+    private String contractSummary;
+}

+ 6 - 0
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/InterimMeter.java

@@ -48,6 +48,12 @@ public class InterimMeter {
     @JSONField(name = "key_9",label="合同图号")
     private String contractPicture;
 
+    @JSONField(name = "key_16",label="支付项目编号")
+    private String formNumber;
+
+    @JSONField(name = "key_17",label="项目名称-ZJ")
+    private String itemName;
+
     @JSONField(name = "key_10",label="支付号")
     private List<String> formNumberList;
     @JSONField(name = "key_11",label="项目名称")

+ 6 - 0
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/MeterPeriodInfo.java

@@ -47,6 +47,12 @@ public class MeterPeriodInfo {
     /**请款理由*/
     @JSONField(name = "key_5",label="请款理由",ordinal = 5)
     private String  cause;
+
+    @JSONField(name = "key_10",label="计量汇总表数量(浙江)",ordinal = 5)
+    private String  summaryNumber;
+
+    @JSONField(name = "key_11",label="工程计量表数量(浙江)",ordinal = 5)
+    private String  meterNumber;
     /**排序号*/
     private Integer sort;
     /**计量期ID*/

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

@@ -0,0 +1,30 @@
+package org.springblade.manager.vo;
+
+import lombok.Data;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @author yangyj
+ * @Date 2024/3/28 10:37
+ * @description 写死的单元格个配置,有些元素元素设置得非常不好输出,先这样处理
+ */
+@Data
+public class ReportMergeCellsConfig {
+       private Long tableId;
+       private String contentCells;
+       private String mergeRange;
+
+       public ReportMergeCellsConfig(Long tableId, String contentCells, String mergeRange) {
+              this.tableId = tableId;
+              this.contentCells = contentCells;
+              this.mergeRange = mergeRange;
+       }
+
+       public  static List<ReportMergeCellsConfig> bulider(){
+              List<ReportMergeCellsConfig> list = new ArrayList<>();
+              list.add(new ReportMergeCellsConfig(1111L,"AC","A1-A2"));
+              return list;
+       }
+}

+ 10 - 10
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/SubprojectInterimPaymentSummary.java

@@ -70,32 +70,32 @@ public class SubprojectInterimPaymentSummary {
     @JSONField(name = "key_12",label="页码",ordinal = 101)
     private String pageCount;
     /**变更金额*/
-    @JSONField(name = "key_16",label="变更金额-ZJ",ordinal = 12)
+   /* @JSONField(name = "key_16",label="变更金额-ZJ",ordinal = 12)
     private String adjustmentAmount;
-    /**单项占合同价*/
+    *//**单项占合同价*//*
     @JSONField(name = "key_17",label="单项占合同价-ZJ",ordinal = 12)
     private String itemPercent;
-    /**单项计划完成*/
+    *//**单项计划完成*//*
     @JSONField(name = "key_18",label="单项计划完成-ZJ",ordinal = 12)
     private String itemProgress;
-    /**单项计划完成*/
+    *//**单项计划完成*//*
     @JSONField(name = "key_19",label="本期占该合同金额-ZJ",ordinal = 12)
     private String currentPayPercent;
-    /**本期末累计占变更后的总金额*/
+    *//**本期末累计占变更后的总金额*//*
     @JSONField(name = "key_20",label="本期末累计占变更后的总金额-ZJ",ordinal = 12)
     private String payPercent;
-    /**本期末累计占变更后的总金额*/
+    *//**本期末累计占变更后的总金额*//*
     @JSONField(name = "key_21",label="按月计划与实际完成-ZJ",ordinal = 12)
     private List<List<Payment>> monthlyCompletion = new ArrayList<>() ;
-    /**累计实际完成*/
+    *//**累计实际完成*//*
     @JSONField(name = "key_22",label="累计实际完成-ZJ",ordinal = 102)
     private String actualCompletion;
-    /**本次实际完成*/
+    *//**本次实际完成*//*
     @JSONField(name = "key_23",label="本次实际完成-ZJ",ordinal = 102)
     private String currentCompletion;
-    /**合同概要*/
+    *//**合同概要*//*
     @JSONField(name = "key_24",label="合同概要-ZJ",ordinal = 106)
-    private String contractSummary;
+    private String contractSummary;*/
 
 
     public SubprojectInterimPaymentSummary(String itemName) {

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

@@ -955,6 +955,10 @@ public class ExecutorMeter extends FormulaExecutor {
                 double sum=dataList.stream().map(InterimMeterPaySummary::getMoney).filter(StringUtils::isNumber).mapToDouble(Double::parseDouble).sum();
                 summary.setMoney(StringUtils.number2StringZero(sum,tec.getScale()));
                 dataList.add(summary);
+                FormulaUtils.elementFindByCode(tec.getFormDataMap(),MeterPeriodInfo.TBN+":key_10").ifPresent(fd->{
+                    elementWriter.write(fd,BaseUtils.sliceNumber(dataList.size(),capacity));
+                });
+
             }
             putOut(InterimMeterPaySummary.class);
         }
@@ -997,6 +1001,8 @@ public class ExecutorMeter extends FormulaExecutor {
                     iim.setItemNameList(itemNameList);
                     iim.setUnitList(unitList);
                     iim.setCompletedList(completedList);
+                    iim.setFormNumber(iim.getFormNumberList().stream().filter(Func::isNotEmpty).distinct().collect(Collectors.joining("、")));
+                    iim.setItemName(iim.getItemNameList().stream().filter(Func::isNotEmpty).distinct().collect(Collectors.joining("、")));
                     dataList.add(iim);
                 }
             }
@@ -1008,6 +1014,9 @@ public class ExecutorMeter extends FormulaExecutor {
             fieldDataFcMap.put(InterimMeter.TBN+":key_13",interimMeters2oListFc.apply(InterimMeter::getCompletedList));
            /*每条记录一页*/
             capacity=1;
+            FormulaUtils.elementFindByCode(tec.getFormDataMap(),MeterPeriodInfo.TBN+":key_11").ifPresent(fd->{
+                elementWriter.write(fd,BaseUtils.sliceNumber(dataList.size(),capacity));
+            });
            putOut(InterimMeter.class);
         }
     }

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

@@ -1,6 +1,7 @@
 package org.springblade.meter.controller;
 
 
+import cn.hutool.log.StaticLog;
 import com.alibaba.fastjson.JSON;
 import com.aspose.cells.SaveFormat;
 import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
@@ -16,6 +17,7 @@ import com.itextpdf.text.pdf.PdfCopy;
 import com.itextpdf.text.pdf.PdfReader;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
+import io.swagger.models.auth.In;
 import lombok.AllArgsConstructor;
 import lombok.Data;
 import org.apache.commons.lang.StringUtils;
@@ -54,6 +56,7 @@ import org.springblade.manager.entity.ContractRelationJlyz;
 import org.springblade.manager.entity.TextdictInfo;
 import org.springblade.manager.feign.FormulaClient;
 import org.springblade.manager.vo.MeterInfo;
+import org.springblade.manager.vo.ReportMergeCellsConfig;
 import org.springblade.manager.vo.ReportResult;
 import org.springblade.meter.dto.*;
 import org.springblade.meter.entity.*;
@@ -2763,6 +2766,8 @@ public class TaskController extends BladeController {
                         throw new RuntimeException(e);
                     }
                 });
+                /*写死合并*/
+                List<ReportMergeCellsConfig> configList = ReportMergeCellsConfig.bulider();
                 /*每种表生成一份pdf*/
                 StringBuffer sb = new StringBuffer();
                 reportResults.parallelStream().forEach(rs -> {
@@ -2789,26 +2794,22 @@ public class TaskController extends BladeController {
                                         int x1 = Func.toInt(keys.split("_")[1]);
                                         Row row = sheet.getRow(y1 - 1);
                                         if (row != null) {
-                                            Cell cell = row.getCell(x1 - 1);
-                                            if (cell != null) {
-                                                String value = dataMap.getOrDefault(keys, StringPool.EMPTY).toString();
-                                                if (value.startsWith("http")&&RegexUtil.find("(?i)[.](jpeg|png|jpg)",value)) {
-                                                    InputStream imageIn = CommonUtil.getOSSInputStream(value);
-                                                    if (imageIn != null) {
-                                                        byte[] bytes = CommonUtil.compressImage(IOUtils.toByteArray(imageIn));
-                                                        CreationHelper helper = workbook.getCreationHelper();
-                                                        ClientAnchor anchor = helper.createClientAnchor();
-                                                        Drawing<?> drawing = sheet.createDrawingPatriarch();
-                                                        anchor.setAnchorType(ClientAnchor.AnchorType.MOVE_AND_RESIZE);
-                                                        Picture pict = drawing.createPicture(anchor, workbook.addPicture(bytes, Workbook.PICTURE_TYPE_PNG)); // 调整图片占单元格百分比的大小,1.0就是100%
-                                                        pict.resize(1, 1);
-                                                        CollectionUtils.imageOrientation(sheet, anchor, new DataVO(x1 - 1, y1 - 1));
-                                                    }
-                                                } else {
-                                                    cell.setCellValue(value);
+                                            Cell cell = row.getCell(x1 - 1, Row.MissingCellPolicy.CREATE_NULL_AS_BLANK);
+                                            String value = dataMap.getOrDefault(keys, StringPool.EMPTY).toString();
+                                            if (value.startsWith("http")&&RegexUtil.find("(?i)[.](jpeg|png|jpg)",value)) {
+                                                InputStream imageIn = CommonUtil.getOSSInputStream(value);
+                                                if (imageIn != null) {
+                                                    byte[] bytes = CommonUtil.compressImage(IOUtils.toByteArray(imageIn));
+                                                    CreationHelper helper = workbook.getCreationHelper();
+                                                    ClientAnchor anchor = helper.createClientAnchor();
+                                                    Drawing<?> drawing = sheet.createDrawingPatriarch();
+                                                    anchor.setAnchorType(ClientAnchor.AnchorType.MOVE_AND_RESIZE);
+                                                    Picture pict = drawing.createPicture(anchor, workbook.addPicture(bytes, Workbook.PICTURE_TYPE_PNG)); // 调整图片占单元格百分比的大小,1.0就是100%
+                                                    pict.resize(1, 1);
+                                                    CollectionUtils.imageOrientation(sheet, anchor, new DataVO(x1 - 1, y1 - 1));
                                                 }
                                             } else {
-                                                System.out.println(keys + "不存在");
+                                                cell.setCellValue(value);
                                             }
                                         }
                                     }
@@ -2824,7 +2825,7 @@ public class TaskController extends BladeController {
                                 sheet.getPrintSetup().setPaperSize(PrintSetup.A4_PAPERSIZE);
                                 ByteArrayOutputStream out = new ByteArrayOutputStream();
                                 workbook.write(out);
-                                //workbook.write(new FileOutputStream(rs.getExcelPath()));
+                                workbook.write(new FileOutputStream(rs.getExcelPath()));
                                 com.aspose.cells.Workbook wb = new com.aspose.cells.Workbook(new ByteArrayInputStream(out.toByteArray()));
                                 out.reset();
                                 wb.save(out, SaveFormat.PDF);
@@ -2871,6 +2872,22 @@ public class TaskController extends BladeController {
         return R.data(fileUrl);
     }
 
+     /*固定合并*/
+    private void mergeCells(Sheet sheet, List<ReportMergeCellsConfig> configList){
+        if(configList.size()>0){
+            configList.forEach(c->{
+                List<Integer> list = BaseUtils.coords2Int(c.getMergeRange());
+                if(list.size()>0) {
+                    try {
+                        sheet.addMergedRegion(new CellRangeAddress(list.get(1), list.get(3),list.get(0),list.get(2)));
+                    }catch (Exception e){
+                        StaticLog.error(e.getMessage());
+                    }
+
+                }
+            });
+        }
+    }
 
 
     // 添加电签任务列表