Browse Source

计量相关bug

Signed-off-by: liuyc <56808083@qq.com>
liuyc 1 year ago
parent
commit
083e21c036

+ 1 - 1
blade-service-api/blade-meter-api/src/main/java/org/springblade/meter/entity/MeterTreeContract.java

@@ -35,7 +35,7 @@ public class MeterTreeContract extends BaseEntity {
     @ApiModelProperty(value = "工程类型名称")
     private String engineeringTypeName;
 
-    @ApiModelProperty(value = "数据源类型 1=项目原始引用、2=合同段手动新增、3=项目新增引用(项目是新增的)")
+    @ApiModelProperty(value = "数据源类型 1=项目原始引用、2=合同段手动新增、3=项目新增引用(项目是新增的)、4=导入")
     private Integer dataSourceType;
 
     @ApiModelProperty(value = "源节点id(项目树节点id)")

+ 11 - 2
blade-service/blade-meter/src/main/java/org/springblade/meter/controller/MeterTreeController.java

@@ -29,6 +29,7 @@ import org.springblade.system.entity.Dict;
 import org.springframework.jdbc.core.BeanPropertyRowMapper;
 import org.springframework.jdbc.core.JdbcTemplate;
 import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
 
 import java.util.*;
 import java.util.stream.Collectors;
@@ -586,8 +587,6 @@ public class MeterTreeController extends BladeController {
                             .eq(MeterTreeProject::getParentId, projectNode.getId())
                             .eq(MeterTreeProject::getStatus, 1)
                     ));
-                } else {
-                    throw new ServiceException("未获取到项目计量单元信息");
                 }
             }
         }
@@ -830,4 +829,14 @@ public class MeterTreeController extends BladeController {
         return R.data(null);
     }
 
+    @PostMapping("/contract/import")
+    @ApiOperationSupport(order = 33)
+    @ApiOperation(value = "合同段计量单元导入", notes = "传入当前选择的节点id,excel文件file")
+    public R<Object> contractTreeNodeImport(@RequestParam String id, MultipartFile file) {
+        if (ObjectUtil.isNotEmpty(id) && meterTreeContractService.contractTreeNodeImport(id, file)) {
+            return R.success("操作成功");
+        }
+        return R.fail("操作失败");
+    }
+
 }

+ 30 - 11
blade-service/blade-meter/src/main/java/org/springblade/meter/controller/TaskController.java

@@ -374,8 +374,8 @@ public class TaskController extends BladeController {
             } else if (approvalDTO.getType().equals(4)) {
                 /*==================== 变更令 ====================*/
                 Set<String> aopParamsSet = new HashSet<>();
+                Long taskId = SnowFlakeUtil.getId();
                 for (String id : approvalDTO.getPeriodId().split(",")) {
-                    Long taskId = SnowFlakeUtil.getId();
                     /*获取变更令信息*/
                     ChangeTokenForm changeTokenForm = changeTokenFormService.getById(id);
                     if (changeTokenForm != null) {
@@ -412,23 +412,30 @@ public class TaskController extends BladeController {
                                 }
                                 changeTokenInventoryServiceTask.saveBatch(changeTokenInventoryTasks, 1000); //清单
 
-                                /*构造创建审批任务*/
-                                try {
-                                    this.buildTaskInfo(taskId, approvalDTO, aopParamsSet, 4);
-                                } catch (Exception e) {
-                                    throw new ServiceException("创建审批任务异常,操作失败:" + e.getMessage());
+                                /*获取变更令的附件信息*/
+                                List<AttachmentForm> attachmentForms = attachmentFormService.getBaseMapper().selectList(Wrappers.<AttachmentForm>lambdaQuery()
+                                        .in(AttachmentForm::getMasterId, changeTokenForm.getId())
+                                        .eq(AttachmentForm::getContractId, approvalDTO.getContractId())
+                                        .eq(AttachmentForm::getProjectId, approvalDTO.getProjectId()));
+                                List<AttachmentFormTask> attachmentFormTasks = BeanUtil.copyProperties(attachmentForms, AttachmentFormTask.class);
+                                for (AttachmentFormTask attachmentFormTask : attachmentFormTasks) {
+                                    attachmentFormTask.setTaskId(taskId);
                                 }
+                                /*复制变更令的附件信息VO*/
+                                attachmentFormServiceTask.saveBatch(attachmentFormTasks, 1000);
 
                                 /*修改变更令原始数据的审批状态=待审批*/
                                 changeTokenFormService.update(Wrappers.<ChangeTokenForm>lambdaUpdate()
                                         .set(ChangeTokenForm::getApproveStatus, 1)
                                         .eq(ChangeTokenForm::getId, id));
+
                                 /*复制数据的审批状态=待审批*/
                                 changeTokenFormServiceTask.update(Wrappers.<ChangeTokenFormTask>lambdaUpdate()
                                         .set(ChangeTokenFormTask::getApproveStatus, 1)
                                         .eq(ChangeTokenFormTask::getTaskId, taskId)
                                         .eq(ChangeTokenFormTask::getId, id));
                             }
+
                         } else {
                             throw new ServiceException("【" + changeTokenForm.getChangeName() + "】变更令下不存在变更申请部位,操作失败");
                         }
@@ -436,6 +443,14 @@ public class TaskController extends BladeController {
                         throw new ServiceException("未获取到当前变更令信息,操作失败");
                     }
                 }
+
+                /*构造创建审批任务*/
+                try {
+                    this.buildTaskInfo(taskId, approvalDTO, aopParamsSet, 4);
+                } catch (Exception e) {
+                    throw new ServiceException("创建审批任务异常,操作失败:" + e.getMessage());
+                }
+
                 return R.data(200, aopParamsSet, "操作成功");
             }
         }
@@ -1291,26 +1306,30 @@ public class TaskController extends BladeController {
 
             obj.setProjectId(Long.parseLong(task.getProjectId()));
             obj.setContractId(Long.parseLong(task.getContractId()));
-            if (inventoryFormApplyServiceTask.updateById(obj)) {
+
+            /*需要修改原始数据(统计累计计量量的时候需要查原始表数据)*/
+            InventoryFormApply inventoryFormApply = BeanUtil.copyProperties(obj, InventoryFormApply.class);
+
+            if (inventoryFormApplyServiceTask.updateById(obj) && inventoryFormApplyService.updateById(inventoryFormApply)) {
                 MiddleMeterApplyTask middleMeterApplyTask = middleMeterApplyServiceTask.getById(inventoryFormApplyTask.getMiddleMeterId());
                 if (middleMeterApplyTask != null) {
 
                     /*清单信息*/
                     List<MeterInventoryVO> formToTask = middleMeterApplyMapper.getFormCopy(middleMeterApplyTask.getId(), middleMeterApplyTask.getContractId(), middleMeterApplyTask.getContractUnitId());
 
-                    BigDecimal totalSum = BigDecimal.ZERO;
+                    BigDecimal totalSumMoney = BigDecimal.ZERO;
                     for (MeterInventoryVO meterInventoryVO : formToTask) {
                         BigDecimal currentMeterTotal = meterInventoryVO.getCurrentMeterTotal();
                         BigDecimal currentPrice = meterInventoryVO.getCurrentPrice();
                         BigDecimal product = currentMeterTotal.multiply(currentPrice);
-                        totalSum = totalSum.add(product);
+                        totalSumMoney = totalSumMoney.add(product);
                     }
 
                     String updateSql = "UPDATE s_middle_meter_apply_task SET meter_money = ? WHERE id = ?";
-                    Object[] params = {totalSum, inventoryFormApplyTask.getMiddleMeterId()};
+                    Object[] params = {totalSumMoney, inventoryFormApplyTask.getMiddleMeterId()};
                     jdbcTemplate.update(updateSql, params);
 
-                    return R.data(200, totalSum, "操作成功");
+                    return R.data(200, totalSumMoney, "操作成功");
                 }
             }
         }

+ 2 - 0
blade-service/blade-meter/src/main/java/org/springblade/meter/mapper/InventoryFormMeterMapper.java

@@ -35,4 +35,6 @@ public interface InventoryFormMeterMapper extends BaseMapper<InventoryFormMeter>
     List<Long> getNodeAllForm(@Param("nodeId") Long nodeId);
     ContractInventoryForm dadainfo(@Param("forid") long forid);
 
+    void batchInsert(List<InventoryFormMeter> inventoryFormMeters);
+
 }

+ 18 - 2
blade-service/blade-meter/src/main/java/org/springblade/meter/mapper/InventoryFormMeterMapper.xml

@@ -18,14 +18,30 @@
         <result column="contract_meter_id" property="contractMeterId"/>
         <result column="build_picture_total" property="buildPictureTotal"/>
     </resultMap>
+
+    <insert id="batchInsert" parameterType="java.util.List">
+        INSERT INTO s_inventory_form_meter (id,
+        project_id,contract_id,contract_form_id,contract_meter_id,build_picture_total,
+        change_build_picture_total,build_picture_money,change_build_picture_money,create_user,update_user,create_dept)
+        VALUES
+        <foreach collection="list" item="item" separator=",">
+            (#{item.id}, #{item.projectId},#{item.contractId}, #{item.contractFormId},#{item.contractMeterId},
+            #{item.buildPictureTotal},#{item.changeBuildPictureTotal},#{item.buildPictureMoney},
+            #{item.changeBuildPictureMoney},#{item.createUser},#{item.updateUser},#{item.createDept})
+        </foreach>
+    </insert>
+
     <select id="getNodeAllForm" resultType="java.lang.Long">
         select contract_form_id
         from s_inventory_form_meter
-        where contract_meter_id = #{nodeId} and is_deleted = 0
+        where contract_meter_id = #{nodeId}
+          and is_deleted = 0
     </select>
 
     <select id="dadainfo" resultType="org.springblade.meter.entity.ContractInventoryForm">
-        select * from s_contract_inventory_form where id=#{forid} ;
+        select *
+        from s_contract_inventory_form
+        where id = #{forid};
     </select>
 
 </mapper>

+ 4 - 0
blade-service/blade-meter/src/main/java/org/springblade/meter/service/MeterTreeContractService.java

@@ -6,6 +6,7 @@ import org.springblade.meter.entity.MeterTreeContract;
 import org.springblade.meter.entity.MeterTreeProject;
 import org.springblade.meter.vo.ChangeNodeVO;
 import org.springblade.meter.vo.MeterTreeContractVO;
+import org.springframework.web.multipart.MultipartFile;
 
 import java.util.List;
 
@@ -23,4 +24,7 @@ public interface MeterTreeContractService extends BaseService<MeterTreeContract>
 
     //异步重新计算节点金额,和修改施工图号
     void asyncCalculateNodeMoney(List<ChangeNodeVO> vos);
+
+    boolean contractTreeNodeImport(String id, MultipartFile file);
+
 }

+ 220 - 5
blade-service/blade-meter/src/main/java/org/springblade/meter/service/impl/MeterTreeContractServiceImpl.java

@@ -3,6 +3,9 @@ package org.springblade.meter.service.impl;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import lombok.AllArgsConstructor;
 import org.apache.commons.lang.StringUtils;
+import org.apache.poi.hssf.usermodel.HSSFWorkbook;
+import org.apache.poi.ss.usermodel.*;
+import org.apache.poi.xssf.usermodel.XSSFWorkbook;
 import org.springblade.common.utils.SnowFlakeUtil;
 import org.springblade.core.log.exception.ServiceException;
 import org.springblade.core.mp.base.BaseServiceImpl;
@@ -11,21 +14,29 @@ import org.springblade.core.tool.utils.BeanUtil;
 import org.springblade.core.tool.utils.ObjectUtil;
 import org.springblade.meter.dto.MeterTreeContractSaveBatchDTO;
 import org.springblade.meter.dto.MeterTreeContractSaveDTO;
+import org.springblade.meter.entity.ContractInventoryForm;
 import org.springblade.meter.entity.InventoryFormMeter;
 import org.springblade.meter.entity.MeterTreeContract;
 import org.springblade.meter.entity.MeterTreeProject;
+import org.springblade.meter.mapper.InventoryFormMeterMapper;
 import org.springblade.meter.mapper.MeterTreeContractMapper;
 import org.springblade.meter.mapper.MeterTreeProjectMapper;
 import org.springblade.meter.service.MeterTreeContractService;
 import org.springblade.meter.vo.ChangeNodeVO;
 import org.springblade.meter.vo.MeterTreeContractVO;
+import org.springblade.system.entity.Dict;
+import org.springframework.jdbc.core.BeanPropertyRowMapper;
 import org.springframework.jdbc.core.JdbcTemplate;
 import org.springframework.scheduling.annotation.Async;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
+import org.springframework.web.multipart.MultipartFile;
 
+import java.io.IOException;
+import java.io.InputStream;
 import java.math.BigDecimal;
 import java.util.*;
+import java.util.function.Function;
 import java.util.stream.Collectors;
 
 @Service
@@ -34,6 +45,7 @@ public class MeterTreeContractServiceImpl extends BaseServiceImpl<MeterTreeContr
 
     private final JdbcTemplate jdbcTemplate;
     private final MeterTreeProjectMapper meterTreeProjectMapper;
+    private final InventoryFormMeterMapper inventoryFormMeterMapper;
 
     @Override
     public Integer selectMaxSort(Long parentId) {
@@ -510,24 +522,26 @@ public class MeterTreeContractServiceImpl extends BaseServiceImpl<MeterTreeContr
 
     /**
      * 获取所有子节点金额
+     *
      * @param vo
      */
     @Override
     public void getAllChildNodeMoney(MeterTreeContractVO vo) {
-        MeterTreeContract m = baseMapper.getAllChildNodeMoney(vo.getContractId(),vo.getId());
+        MeterTreeContract m = baseMapper.getAllChildNodeMoney(vo.getContractId(), vo.getId());
         vo.setBuildPictureMoney(m.getBuildPictureMoney());
         vo.setChangeMoney(m.getChangeMoney());
     }
 
     /**
      * 异步重新计算节点金额,和修改施工图号
+     *
      * @param vos
      */
     @Override
 //    @Async
     public void asyncCalculateNodeMoney(List<ChangeNodeVO> vos) {
         for (ChangeNodeVO vo : vos) {
-            if (StringUtils.isBlank(vo.getContractPicture())){
+            if (StringUtils.isBlank(vo.getContractPicture())) {
                 vo.setContractPicture("");
             }
         }
@@ -540,16 +554,170 @@ public class MeterTreeContractServiceImpl extends BaseServiceImpl<MeterTreeContr
                 .collect(Collectors.groupingBy(l -> l.getContractMeterId(),
                         Collectors.mapping(InventoryFormMeter::getChangeBuildPictureMoney,
                                 Collectors.reducing(BigDecimal.ZERO, BigDecimal::add))));
-        list.stream().forEach(l->{
+        list.stream().forEach(l -> {
             String picture = map.get(l.getId());
-            l.setContractPicture(StringUtils.isBlank(picture)?"":picture);
+            l.setContractPicture(StringUtils.isBlank(picture) ? "" : picture);
             //统计节点下所有分解的表单的总金额
-            l.setChangeMoney(decimalMap.get(l.getId())==null?BigDecimal.ZERO:decimalMap.get(l.getId()));
+            l.setChangeMoney(decimalMap.get(l.getId()) == null ? BigDecimal.ZERO : decimalMap.get(l.getId()));
         });
         //拼接SQL修改合同图号和重新计算的金额
         baseMapper.batchUpdateById(list);
     }
 
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public boolean contractTreeNodeImport(String id, MultipartFile file) {
+        MeterTreeContract meterTreeContract = baseMapper.selectById(id);
+        if (meterTreeContract.getAncestor().split(",").length > 3) {
+            throw new ServiceException("只能从前三层节点开始导入,操作失败");
+        }
+        List<MeterTreeContract> rootNodesImport = new ArrayList<>();
+        if (meterTreeContract.getParentId().equals(0L) && meterTreeContract.getAncestor().equals("0")) {
+            /*根节点导入,获取下一层级节点*/
+            rootNodesImport = baseMapper.selectList(Wrappers.<MeterTreeContract>lambdaQuery().eq(MeterTreeContract::getParentId, id).isNotNull(MeterTreeContract::getNodeCode));
+        } else {
+            /*非根节点导入,获取当前节点*/
+            if (ObjectUtil.isEmpty(meterTreeContract.getNodeCode())) {
+                throw new ServiceException("当前选择导入的节点编号为空,操作失败");
+            }
+            rootNodesImport.add(meterTreeContract);
+        }
+
+        List<MeterTreeContract> resultNodeList = new ArrayList<>();
+        List<InventoryFormMeter> resultFormList = new ArrayList<>();
+        List<Map<String, String>> parseExcelFileToList = this.parseExcelFile(file);
+        Map<String, String> meterStakeTypeMaps = jdbcTemplate.query("SELECT dict_key,dict_value FROM blade_dict WHERE is_deleted = 0 AND code = 'meter_stake_type'", new BeanPropertyRowMapper<>(Dict.class)).stream().collect(Collectors.toMap(Dict::getDictValue, Dict::getDictKey));
+        Map<String, ContractInventoryForm> contractInventoryFormMaps = jdbcTemplate.query("SELECT id,change_price,form_number FROM s_contract_inventory_form WHERE is_deleted = 0 AND contract_id = " + meterTreeContract.getContractId(), new BeanPropertyRowMapper<>(ContractInventoryForm.class)).stream().collect(Collectors.toMap(ContractInventoryForm::getFormNumber, Function.identity()));
+        Map<String, List<Map<String, String>>> rootCodeMaps = parseExcelFileToList.stream()
+                .collect(Collectors.groupingBy(
+                        map -> map.get("工程编号"),
+                        LinkedHashMap::new,
+                        Collectors.toList()
+                ));
+        for (MeterTreeContract treeContract : rootNodesImport) {
+            List<Map<String, String>> projectCodeGroup = rootCodeMaps.getOrDefault(treeContract.getNodeCode(), null);
+            if (ObjectUtil.isNotEmpty(projectCodeGroup)) {
+                Map<String, List<Map<String, String>>> nodeCodeGroup = projectCodeGroup.stream()
+                        .collect(Collectors.groupingBy(
+                                map -> map.get("节点编号"),
+                                LinkedHashMap::new,
+                                Collectors.toList()
+                        ));
+                int sort = 1;
+                for (Map.Entry<String, List<Map<String, String>>> listEntry : nodeCodeGroup.entrySet()) {
+                    String nodeCode = listEntry.getKey();
+                    List<Map<String, String>> rows = listEntry.getValue().stream()
+                            .sorted(Comparator.comparing(map -> {
+                                String formCode = map.get("清单编号");
+                                return formCode == null ? "" : formCode;
+                            })).collect(Collectors.toList());
+                    long nullFormCodeCount = rows.stream()
+                            .filter(map -> ObjectUtil.isEmpty(map.get("清单编号")))
+                            .count();
+                    if (nullFormCodeCount > 1) {
+                        throw new RuntimeException("节点编号【" + nodeCode + "】存在多条清单编号为空的数据,请确认是否只有一条");
+                    }
+
+                    MeterTreeContract obj = new MeterTreeContract();
+                    Long nodeId = SnowFlakeUtil.getId();
+                    BigDecimal money = BigDecimal.ZERO;
+                    BigDecimal moneyChange = BigDecimal.ZERO;
+
+                    for (Map<String, String> map : rows) {
+                        String currCode = map.get("节点编号");
+                        if (currCode.equals(nodeCode)) {
+                            String formCode = map.get("清单编号");
+                            String nodeName = map.get("工程名称");
+                            String buildPictureTotal = map.get("施工图数量");
+                            String stakeType = map.get("桩号类型");
+                            String startStake = map.get("起始桩号");
+                            String endStake = map.get("结束桩号");
+                            String contractPicture = map.get("合同图号");
+                            String remarks = map.get("备注");
+
+                            //节点
+                            if (ObjectUtil.isEmpty(formCode)) {
+                                obj.setId(nodeId);
+                                obj.setParentId(treeContract.getId());
+                                obj.setAncestor(treeContract.getAncestor() + "," + obj.getParentId());
+                                obj.setNodeName(nodeName);
+                                obj.setNodeCode(currCode);
+                                obj.setUpdateStatus(0);
+                                obj.setSort(sort);
+                                if (ObjectUtil.isNotEmpty(stakeType)) {
+                                    String upperCase = stakeType.toUpperCase();
+                                    String key = meterStakeTypeMaps.getOrDefault(upperCase, null);
+                                    if (key != null) {
+                                        obj.setStakeType(Integer.parseInt(key));
+                                    }
+                                }
+                                obj.setStartStake(startStake);
+                                obj.setEndStake(endStake);
+                                obj.setContractPicture(contractPicture);
+                                obj.setRemarks(remarks);
+
+                                obj.setTemplateId(treeContract.getTemplateId());
+                                obj.setProjectId(treeContract.getProjectId());
+                                obj.setContractId(treeContract.getContractId());
+
+                                obj.setDataSourceType(4); //导入
+
+                            } else {
+                                //清单
+                                ContractInventoryForm contractInventoryForm = contractInventoryFormMaps.getOrDefault(formCode, null);
+                                if (contractInventoryForm != null) {
+                                    InventoryFormMeter objForm = new InventoryFormMeter();
+                                    objForm.setId(SnowFlakeUtil.getId());
+                                    objForm.setProjectId(treeContract.getProjectId());
+                                    objForm.setContractId(treeContract.getContractId());
+
+                                    if (ObjectUtil.isNotEmpty(SecureUtil.getUser())) {
+                                        objForm.setCreateUser(SecureUtil.getUserId());
+                                        objForm.setUpdateUser(SecureUtil.getUserId());
+                                        if (SecureUtil.getDeptId().contains(",")) {
+                                            objForm.setCreateDept(Long.parseLong(SecureUtil.getDeptId().split(",")[0]));
+                                        } else {
+                                            objForm.setCreateDept(Long.parseLong(SecureUtil.getDeptId()));
+                                        }
+                                    }
+
+                                    objForm.setContractMeterId(nodeId);
+                                    objForm.setContractFormId(contractInventoryForm.getId());
+
+                                    objForm.setBuildPictureTotal(this.parseString(buildPictureTotal));
+                                    objForm.setChangeBuildPictureTotal(objForm.getBuildPictureTotal());
+                                    objForm.setBuildPictureMoney(objForm.getBuildPictureTotal().multiply(contractInventoryForm.getChangePrice())); //数量*变更后单价
+                                    objForm.setChangeBuildPictureMoney(objForm.getBuildPictureMoney());
+
+                                    /*计量单元节点金额相关累加*/
+                                    money = money.add(objForm.getBuildPictureMoney());
+                                    moneyChange = moneyChange.add(objForm.getChangeBuildPictureMoney());
+
+                                    resultFormList.add(objForm);
+                                }
+                            }
+                        }
+                    }
+                    obj.setBuildPictureMoney(money);
+                    obj.setChangeMoney(moneyChange);
+                    resultNodeList.add(obj);
+                    sort++;
+                }
+            }
+        }
+        if (resultNodeList.size() > 0) {
+            this.saveBatch(resultNodeList, 1000);
+            if (resultFormList.size() > 0) {
+                inventoryFormMeterMapper.batchInsert(resultFormList);
+                /*for (InventoryFormMeter inventoryFormMeter : resultFormList) {
+                    inventoryFormMeterMapper.insert(inventoryFormMeter);
+                }*/
+            }
+            return true;
+        }
+        return false;
+    }
+
     /**
      * 获取对应的父级的ancestor字段
      *
@@ -638,4 +806,51 @@ public class MeterTreeContractServiceImpl extends BaseServiceImpl<MeterTreeContr
         return false;
     }
 
+    private List<Map<String, String>> parseExcelFile(MultipartFile file) {
+        List<Map<String, String>> result = new ArrayList<>();
+        try (InputStream inputStream = file.getInputStream()) {
+            Workbook workbook;
+            if (Objects.requireNonNull(file.getOriginalFilename()).toLowerCase().endsWith(".xls")) {
+                workbook = new HSSFWorkbook(inputStream);
+            } else if (file.getOriginalFilename().toLowerCase().endsWith(".xlsx")) {
+                workbook = new XSSFWorkbook(inputStream);
+            } else {
+                throw new ServiceException("Unsupported Excel file format");
+            }
+            Sheet sheet = workbook.getSheetAt(0);
+            Row headerRow = sheet.getRow(0);
+            int columnCount = headerRow.getLastCellNum();
+            Iterator<Row> rowIterator = sheet.iterator();
+            rowIterator.next();
+            while (rowIterator.hasNext()) {
+                Row currentRow = rowIterator.next();
+                Map<String, String> rowMap = new LinkedHashMap<>();
+                for (int columnIndex = 0; columnIndex < columnCount; columnIndex++) {
+                    Cell currentCell = currentRow.getCell(columnIndex, Row.MissingCellPolicy.CREATE_NULL_AS_BLANK);
+                    currentCell.setCellType(CellType.STRING);
+                    String headerValue = headerRow.getCell(columnIndex).getStringCellValue();
+                    String cellValue = currentCell.getStringCellValue();
+                    rowMap.put(headerValue, cellValue);
+                }
+                result.add(rowMap);
+            }
+        } catch (IOException e) {
+            e.printStackTrace();
+            throw new ServiceException("excel解析失败,errorMsg:" + e.getMessage());
+        }
+        return result;
+    }
+
+    private BigDecimal parseString(String value) {
+        if (value == null || value.trim().isEmpty()) {
+            return BigDecimal.ZERO;
+        }
+        try {
+            return new BigDecimal(value.trim());
+        } catch (NumberFormatException e) {
+            e.printStackTrace();
+            return BigDecimal.ZERO;
+        }
+    }
+
 }