瀏覽代碼

1.合并Excel方法调整,现在可自主选择是否复制数据验证并选择验证所在行数
2.机器设备作价测算新增批量保存接口

GouGengquan 7 月之前
父節點
當前提交
e2a8332493

+ 33 - 0
biz-base/src/main/java/com/dayou/controller/AssetsCalculateEqptDataController.java

@@ -17,6 +17,8 @@ import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 
+import java.util.List;
+
 /**
  * 资产机器设备测算数据
  *
@@ -64,6 +66,17 @@ public class AssetsCalculateEqptDataController {
         return Result.build(dataService.updateData(assetsCalculateEqptData));
     }
 
+
+    /**
+     * 批量更新
+     * @param dataList 测算信息集合
+     * @return Boolean
+     */
+    @PutMapping("/updateBatch")
+    public Result<Boolean> updateBatch(@RequestBody List<AssetsCalculateEqptData> dataList) {
+        return Result.build(dataService.updateBatch(dataList));
+    }
+
     /**
      * 分页查询进口设备信息
      * @param page 分页
@@ -86,6 +99,16 @@ public class AssetsCalculateEqptDataController {
     }
 
     /**
+     * 批量更新机器设备进口设备数据
+     * @param dataList 进口设备信息
+     * @return Boolean
+     */
+    @PutMapping("/updateBatchImpData")
+    public Result<Boolean> updateBatchImpData(@RequestBody List<AssetsCalculateEqptImpData> dataList) {
+        return Result.build(dataService.updateBatchImpData(dataList));
+    }
+
+    /**
      * 分页查询非标设备信息
      * @param page 分页
      * @param dto 查询dto
@@ -107,6 +130,16 @@ public class AssetsCalculateEqptDataController {
     }
 
     /**
+     * 批量更新机器设备非标设备数据
+     * @param dataList 非标设备信息
+     * @return Boolean
+     */
+    @PutMapping("/updateBatchNonSData")
+    public Result<Boolean> updateBatchNonSData(@RequestBody List<AssetsCalculateEqptNonsData> dataList) {
+        return Result.build(dataService.updateBatchNonSData(dataList));
+    }
+
+    /**
      * 获取机器设备作价table的筛选条件
      * @param eqptTableFilterQueryDTO 查询dto
      * @return EqptTableFilterVO

+ 85 - 7
common/src/main/java/com/dayou/utils/EasyExcelUtil.java

@@ -77,8 +77,47 @@ public class EasyExcelUtil {
             }
         }
 
+        sourceWorkbook.close();
+        inputStream.close();
+
+        return targetWorkbook;
+    }
+
+    /**
+     * 合并Excel文件-并且复制数据验证
+     *
+     * @param sourceExcelPath  源文件路径(段落模板)
+     * @param targetExcelPath  目标文件路径(主模板)
+     * @param targetSheetIndex 目标sheet索引(要插入的sheet)
+     * @param targetRowNum     目标行索引(要插入的行)
+     * @param sourceSheetIndex 源文件被引用的sheet
+     * @return Workbook 返回工作簿
+     * @throws IOException 抛出IO异常
+     */
+    public static Workbook mergeExcel(String sourceExcelPath, String targetExcelPath, int targetSheetIndex, int targetRowNum, int sourceSheetIndex, int skipRow) throws IOException {
+        // 获取源Excel
+        InputStream inputStream = Files.newInputStream(Paths.get(sourceExcelPath));
+        Workbook sourceWorkbook = new XSSFWorkbook(inputStream);
+        Sheet sourceSheet = sourceWorkbook.getSheetAt(sourceSheetIndex);
+
+        // 打开已存在的Excel工作簿
+        Workbook targetWorkbook = WorkbookFactory.create(Files.newInputStream(Paths.get(targetExcelPath)));
+        Sheet targetSheet = targetWorkbook.getSheetAt(targetSheetIndex); // 获取目标sheet
+
+        // 复制样式映射
+        Map<Short, Short> styleMap = copyCellStyle(sourceWorkbook, targetWorkbook, targetSheetIndex, sourceSheetIndex);
+
+        // 复制行和单元格
+        for (Row sourceRow : sourceSheet) {
+            Row targetRow = targetSheet.createRow(targetRowNum + sourceRow.getRowNum());
+            for (Cell sourceCell : sourceRow) {
+                Cell targetCell = targetRow.createCell(sourceCell.getColumnIndex());
+                copyCell(sourceCell, targetCell, targetWorkbook, styleMap);
+            }
+        }
+
         // 复制数据验证
-        copyDataValidations(sourceSheet, targetSheet);
+        copyDataValidations(sourceSheet, targetSheet, skipRow);
 
         sourceWorkbook.close();
         inputStream.close();
@@ -87,7 +126,7 @@ public class EasyExcelUtil {
     }
 
     /**
-     * 合并Excel文件-目标文件为WorkBook方式
+     * 合并Excel文件-目标文件为WorkBook方式且复制数据验证
      *
      * @param sourceExcelPath  源文件路径(段落模板)
      * @param targetWorkbook   目标工作表(主模板)
@@ -96,7 +135,7 @@ public class EasyExcelUtil {
      * @param sourceSheetIndex 源文件被引用的sheet
      * @throws IOException 抛出IO异常
      */
-    public static void mergeExcel(String sourceExcelPath, Workbook targetWorkbook, int targetSheetIndex, int targetRowNum, int sourceSheetIndex) throws IOException {
+    public static void mergeExcel(String sourceExcelPath, Workbook targetWorkbook, int targetSheetIndex, int targetRowNum, int sourceSheetIndex, int skipRow) throws IOException {
         // 获取源Excel
         InputStream inputStream = Files.newInputStream(Paths.get(sourceExcelPath));
         Workbook sourceWorkbook = new XSSFWorkbook(inputStream);
@@ -118,7 +157,43 @@ public class EasyExcelUtil {
         }
 
         // 复制数据验证
-        copyDataValidations(sourceSheet, targetSheet);
+        copyDataValidations(sourceSheet, targetSheet, skipRow);
+
+        sourceWorkbook.close();
+        inputStream.close();
+
+    }
+
+    /**
+     * 合并Excel文件-目标文件为WorkBook方式
+     *
+     * @param sourceExcelPath  源文件路径(段落模板)
+     * @param targetWorkbook   目标工作表(主模板)
+     * @param targetSheetIndex 目标sheet索引(要插入的sheet)
+     * @param targetRowNum     目标行索引(要插入的行)
+     * @param sourceSheetIndex 源文件被引用的sheet
+     * @throws IOException 抛出IO异常
+     */
+    public static void mergeExcel(String sourceExcelPath, Workbook targetWorkbook, int targetSheetIndex, int targetRowNum, int sourceSheetIndex) throws IOException {
+        // 获取源Excel
+        InputStream inputStream = Files.newInputStream(Paths.get(sourceExcelPath));
+        Workbook sourceWorkbook = new XSSFWorkbook(inputStream);
+        Sheet sourceSheet = sourceWorkbook.getSheetAt(sourceSheetIndex);
+
+        // 打开已存在的Excel工作簿
+        Sheet targetSheet = targetWorkbook.getSheetAt(targetSheetIndex); // 获取目标sheet
+
+        // 复制样式映射
+        Map<Short, Short> styleMap = copyCellStyle(sourceWorkbook, targetWorkbook, targetSheetIndex, sourceSheetIndex);
+
+        // 复制行和单元格
+        for (Row sourceRow : sourceSheet) {
+            Row targetRow = targetSheet.createRow(targetRowNum + sourceRow.getRowNum());
+            for (Cell sourceCell : sourceRow) {
+                Cell targetCell = targetRow.createCell(sourceCell.getColumnIndex());
+                copyCell(sourceCell, targetCell, targetWorkbook, styleMap);
+            }
+        }
 
         sourceWorkbook.close();
         inputStream.close();
@@ -208,12 +283,15 @@ public class EasyExcelUtil {
      *
      * @param sourceSheet 源Sheet
      * @param targetSheet 目标Sheet
+     * @param skipRow     跳过的行数
      */
-    private static void copyDataValidations(Sheet sourceSheet, Sheet targetSheet) {
+    private static void copyDataValidations(Sheet sourceSheet, Sheet targetSheet, int skipRow) {
         for (DataValidation validation : sourceSheet.getDataValidations()) {
             // 设置要设置数据验证的单元格坐标
-            CellRangeAddressList regions = new CellRangeAddressList(validation.getRegions().getCellRangeAddress(0).getFirstRow() + 4,
-                    validation.getRegions().getCellRangeAddress(0).getLastRow() + 4,
+            // 比如数据验证在第2列第3行那坐标就是(2-3),后续设置到目标excel也是沿用这个坐标
+            // skipRow会在在此基础上加行,比如skipRow是2,那么坐标就是(4-3),skipRow一般用于目标excel和原excel数据验证位置不一样的情况
+            CellRangeAddressList regions = new CellRangeAddressList(validation.getRegions().getCellRangeAddress(0).getFirstRow() + skipRow,
+                    validation.getRegions().getCellRangeAddress(0).getLastRow() + skipRow,
                     validation.getRegions().getCellRangeAddress(0).getFirstColumn(),
                     validation.getRegions().getCellRangeAddress(0).getLastColumn());
             // 获取数据源的数据验证信息

+ 2 - 2
domain/src/main/java/com/dayou/common/CalculateFormula.java

@@ -29,7 +29,7 @@ public class CalculateFormula {
         原值("AR{0}",17),
         成新率("AA{0}",18),
         净值("ROUND(Q{0}*R{0},0)",19),
-        增值率("ROUND((L{0}-S{0})/S{0},2)", 20),
+        增值率("ROUND((S{0}-L{0})/L{0},2)", 20),
         已使用年数("ROUND(($W$2-F{0})/365,2)",22),
         年限成新率("IF((U{0}-V{0})/U{0}<15%,15%,ROUND((U{0}-V{0})/U{0},2))",23),
         综合成新率("ROUND(W{0}*X{0}+Y{0}*Z{0},2)",27),
@@ -78,7 +78,7 @@ public class CalculateFormula {
      * 机器设备进口设备模板公式
      */
     public enum EquipmentImportedFormula {
-        购置价CIF到岸价("Q{0}*N{0}",19),
+        购置价CIF到岸价("IF(M{0}=\"FOB\",(N{0}*(1+3%+0.4%)*Q{0}),N{0}*Q{0})",19),
         CIF到岸价折人民币("ROUND(T{0}*S{0},0)",21),
         关税("U{0}*V{0}",24),
         进口增值税("(U{0}+X{0})*Y{0}",26),

+ 2 - 2
domain/src/main/java/com/dayou/entity/AssetsCalculateEqptData.java

@@ -113,13 +113,13 @@ public class AssetsCalculateEqptData extends BaseEntity implements Serializable
     private BigDecimal evaluateNetValue;
 
     /**
-     * 含税单价
+     * 合同/发票含税单价
      */
     @ExcelIgnore
     private BigDecimal taxedUnitPrice;
 
     /**
-     * 税率
+     * 购置时税率
      */
     @ExcelIgnore
     private BigDecimal taxRate;

+ 1 - 1
domain/src/main/java/com/dayou/vo/AssetsCalculateEqptDataVO.java

@@ -19,7 +19,7 @@ public class AssetsCalculateEqptDataVO extends AssetsCalculateEqptData {
     private String usageSituation;
 
     /**
-     * 不含税单价(发票价)
+     * 不含税单价/发票价
      */
     private BigDecimal unTaxedUnitPrice;
 

+ 22 - 0
service/src/main/java/com/dayou/service/AssetsCalculateEqptDataService.java

@@ -1,6 +1,7 @@
 package com.dayou.service;
 import com.dayou.dto.calculate.equipment.EqptQueryDTO;
 import com.dayou.dto.calculate.equipment.EqptTableFilterQueryDTO;
+import com.dayou.entity.AssetsCalculate;
 import com.dayou.entity.AssetsCalculateEqptData;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
@@ -60,6 +61,13 @@ public interface AssetsCalculateEqptDataService extends IService<AssetsCalculate
     Boolean updateData(AssetsCalculateEqptData assetsCalculateEqptData);
 
     /**
+     * 批量更新
+     * @param dataList 测算信息集合
+     * @return Boolean
+     */
+    Boolean updateBatch(List<AssetsCalculateEqptData> dataList);
+
+    /**
      * 分页查询进口设备信息
      * @param page 分页
      * @param dto 查询dto
@@ -82,6 +90,13 @@ public interface AssetsCalculateEqptDataService extends IService<AssetsCalculate
     Boolean updateImpData(AssetsCalculateEqptImpData assetsCalculateEqptImpData);
 
     /**
+     * 批量更新机器设备进口设备数据
+     * @param dataList 进口设备信息
+     * @return Boolean
+     */
+    Boolean updateBatchImpData(List<AssetsCalculateEqptImpData> dataList);
+
+    /**
      * 分页查询非标设备信息
      * @param page 分页
      * @param dto 查询dto
@@ -104,6 +119,13 @@ public interface AssetsCalculateEqptDataService extends IService<AssetsCalculate
     Boolean updateNonSData(AssetsCalculateEqptNonsData assetsCalculateEqptNonsData);
 
     /**
+     * 批量更新机器设备非标设备数据
+     * @param dataList 非标设备信息
+     * @return Boolean
+     */
+    Boolean updateBatchNonSData(List<AssetsCalculateEqptNonsData> dataList);
+
+    /**
      * 获取机器设备作价table的筛选条件
      * @param eqptTableFilterQueryDTO 查询dto
      * @return EqptTableFilterVO

+ 40 - 0
service/src/main/java/com/dayou/service/impl/AssetsCalculateEqptDataServiceImpl.java

@@ -86,6 +86,17 @@ public class AssetsCalculateEqptDataServiceImpl extends ServiceImpl<AssetsCalcul
     }
 
     /**
+     * 批量更新
+     * @param dataList 测算信息集合
+     * @return Boolean
+     */
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public Boolean updateBatch(List<AssetsCalculateEqptData> dataList) {
+        return this.updateBatchById(dataList);
+    }
+
+    /**
      * 分页查询进口设备信息
      * @param page 分页
      * @param dto 查询dto
@@ -126,6 +137,20 @@ public class AssetsCalculateEqptDataServiceImpl extends ServiceImpl<AssetsCalcul
     }
 
     /**
+     * 批量更新机器设备进口设备数据
+     * @param dataList 进口设备信息
+     * @return Boolean
+     */
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public Boolean updateBatchImpData(List<AssetsCalculateEqptImpData> dataList) {
+        for (AssetsCalculateEqptImpData impData : dataList) {
+            updateImpData(impData);
+        }
+        return Boolean.TRUE;
+    }
+
+    /**
      * 分页查询非标设备信息
      * @param page 分页
      * @param dto 查询dto
@@ -152,6 +177,7 @@ public class AssetsCalculateEqptDataServiceImpl extends ServiceImpl<AssetsCalcul
      * @return Boolean
      */
     @Override
+    @Transactional(rollbackFor = Exception.class)
     public Boolean updateNonSData(AssetsCalculateEqptNonsData assetsCalculateEqptNonsData) {
         // 判断是修改还是新增
         if (ObjectUtil.isNotNull(assetsCalculateEqptNonsData.getId())) {
@@ -164,6 +190,20 @@ public class AssetsCalculateEqptDataServiceImpl extends ServiceImpl<AssetsCalcul
     }
 
     /**
+     * 批量更新机器设备非标设备数据
+     * @param dataList 非标设备信息
+     * @return Boolean
+     */
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public Boolean updateBatchNonSData(List<AssetsCalculateEqptNonsData> dataList) {
+        for (AssetsCalculateEqptNonsData nonsData : dataList) {
+            updateNonSData(nonsData);
+        }
+        return Boolean.TRUE;
+    }
+
+    /**
      * 获取机器设备作价table的筛选条件
      * @param eqptTableFilterQueryDTO 查询dto
      * @return EqptTableFilterVO

+ 2 - 2
service/src/main/java/com/dayou/service/impl/AssetsCalculateServiceImpl.java

@@ -214,7 +214,7 @@ public class AssetsCalculateServiceImpl extends ServiceImpl<AssetsCalculateMappe
         // 第三步:将 机器设备-主模板-设备信息-段落模板 拼接到 写入数据到 机器设备-主模板
         // 合并后文件的位置
         String mainMergePath = fileNetConfig.getBaseDir() + fileNetConfig.getAssetOutputCalculatePath() + System.currentTimeMillis() + "_机器设备测算表.xlsx";
-        Workbook workbook = EasyExcelUtil.mergeExcel(mainDetailPath, mainPath, 0, 4, 0);
+        Workbook workbook = EasyExcelUtil.mergeExcel(mainDetailPath, mainPath, 0, 4, 0, 0);
 
         // 第四步:主模板设置公式
         // 遍历所有行,跳过前四行
@@ -249,7 +249,7 @@ public class AssetsCalculateServiceImpl extends ServiceImpl<AssetsCalculateMappe
                     .doFill(impEqptData);
             // 将进口设备excel合并到主excel
             workbook.createSheet("进口设备");
-            EasyExcelUtil.mergeExcel(importedPath, workbook, workbook.getSheetIndex("进口设备"), 0, 0);
+            EasyExcelUtil.mergeExcel(importedPath, workbook, workbook.getSheetIndex("进口设备"), 0, 0, 0);
             // 设置公式
             Sheet importedSheet = workbook.getSheet("进口设备");
             for (int i = 2; i <= importedSheet.getLastRowNum(); i++) { // 跳过前两行