Procházet zdrojové kódy

fit:三表导入导出

zzw před 1 měsícem
rodič
revize
677dc463ca

+ 3 - 2
assembly/src/main/resources/application-dev.yml

@@ -10,7 +10,7 @@ spring:
           username: root
           password: Chemicals_20181101!
           driver-class-name: com.mysql.cj.jdbc.Driver
-          url: jdbc:mysql://1.71.91.48:3306/chengben?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&zeroDateTimeBehavior=convertToNull&autoReconnect=true&failOverReadOnly=false&maxReconnects=10&allowMultiQueries=true
+          url: jdbc:mysql://1.71.91.48:3306/chengben?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&zeroDateTimeBehavior=convertToNull&autoReconnect=true&failOverReadOnly=false&maxReconnects=10&allowMultiQueries=true&rewriteBatchedStatements=true
           druid:
             filters: stat
             # druid oracle 验证语句
@@ -95,7 +95,8 @@ security:
       - /druid/*
       - /hystrix/*
       - /api/file/v1/*
-      - /api/surveyTemplate/v1/importExcel*
+      - /api/surveyTemplate/v1/*
+      - /api/surveyTemplate/v1/*
 
 #业务中台 配置信息
 qzSetting:

Rozdílová data souboru nebyla zobrazena, protože soubor je příliš velký
+ 1251 - 378
assistMg/src/main/java/com/hotent/enterpriseDeclare/controller/material/CostProjectTaskSurveyGenericController.java


+ 57 - 662
assistMg/src/main/java/com/hotent/enterpriseDeclare/controller/material/CostProjectTaskSurveyTemplateController.java

@@ -1,9 +1,11 @@
 package com.hotent.enterpriseDeclare.controller.material;
 
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.hotent.base.annotation.ApiGroup;
 import com.hotent.base.constants.ApiGroupConsts;
 import com.hotent.base.model.CommonResult;
+import com.hotent.base.util.PinyinUtil;
 import com.hotent.base.util.StringUtil;
 import com.hotent.enterpriseDeclare.manager.CostAuditPeriodRecordManager;
 import com.hotent.enterpriseDeclare.manager.CostSurveyTemplateUploadDataManager;
@@ -14,15 +16,15 @@ import com.hotent.project.manager.CostProjectTaskManager;
 import com.hotent.project.manager.CostProjectTaskMaterialManager;
 import com.hotent.project.model.CostProjectApproval;
 import com.hotent.project.model.CostProjectTask;
-import com.hotent.project.model.CostProjectTaskMaterial;
 import com.hotent.surveyinfo.dao.CostSurveyTemplateHeadersDao;
 import com.hotent.surveyinfo.dao.CostSurveyTemplateItemsDao;
-import com.hotent.surveyinfo.manager.CostSurveyTemplateHeadersManager;
-import com.hotent.surveyinfo.manager.CostSurveyTemplateManager;
-import com.hotent.surveyinfo.manager.CostSurveyTemplateUploadManager;
-import com.hotent.surveyinfo.manager.CostSurveyTemplateVersionManager;
+import com.hotent.surveyinfo.dao.CostVerifyTemplateHeadersDao;
+import com.hotent.surveyinfo.manager.*;
 import com.hotent.surveyinfo.model.*;
+import com.hotent.surveyinfo.model.dto.BatchVerifyHeadersItemsRequest;
 import com.hotent.surveyinfo.model.dto.CostItemData;
+import com.hotent.uc.api.model.IUser;
+import com.hotent.uc.util.ContextUtil;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import io.swagger.annotations.ApiParam;
@@ -31,6 +33,7 @@ import org.apache.poi.ss.usermodel.*;
 import org.apache.poi.xssf.usermodel.XSSFWorkbook;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.transaction.annotation.Transactional;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.multipart.MultipartFile;
 
@@ -43,694 +46,86 @@ import java.util.*;
 import java.util.stream.Collectors;
 
 /**
- * 成本调查
+ * 核定
  *
  * @company 山西清众科技股份有限公司
  * @author 超级管理员
  * @since 2025-01-27
  */
 @RestController
-@RequestMapping("/api/surveyTemplate/v/")
+@RequestMapping("/api/verify/Template/v1/")
 @Api(tags = "成本调查表")
 @ApiGroup(group = {ApiGroupConsts.GROUP_COST})
-public class CostProjectTaskSurveyTemplateController {
+public class CostProjectTaskVerifyTemplateController {
 
     @Autowired
-    private CostSurveyTemplateManager templateManager;
-
-    @Autowired
-    private CostSurveyTemplateVersionManager versionManager;
-
-    @Autowired
-    private CostSurveyTemplateHeadersDao headersDao;
-
-    @Autowired
-    private CostSurveyTemplateItemsDao itemsDao;
-
-    @Autowired
-    private CostSurveyTemplateUploadDataManager uploadDataManager;
-
-    @Autowired
-    private CostProjectTaskMaterialManager costProjectTaskMaterialManager;
-
-
-    @Autowired
-    private CostSurveyTemplateUploadManager costSurveyTemplateUploadManager;
-
-    @Autowired
-    private CostSurveyTemplateItemsDao costSurveyTemplateItemsDao;
-
-    @Autowired
-    private CostSurveyTemplateVersionManager costSurveyTemplateVersionManager;
-
-    @Autowired
-    private CostSurveyTemplateHeadersManager costSurveyTemplateHeadersManager;
-
+    private CostVerifyTemplateItemsManager costSurveyTemplateItemsManager;
     @Autowired
-    private CostSurveyTemplateUploadDataManager costSurveyTemplateUploadDataManager;
-
-    @Autowired
-    private CostAuditPeriodRecordManager costAuditPeriodRecordManager;
-
-    @Autowired
-    private CostSurveyTemplateManager costSurveyTemplateManager;
-
-    @Autowired
-    private CostProjectApprovalManager costProjectApprovalManager;
-
-    @Autowired
-    private CostProjectTaskManager costProjectTaskManager;
-
-    @Autowired
-    CostSurveyTemplateManager constbaseService;
-
-    /**
-     * 企业报送-成本调查表-列表
-     * @param taskId 任务ID
-     * @return 上传记录列表(包含是否必填、是否上传等信息)
-     * @throws Exception
-     */
-    @GetMapping(value="/listByTaskId")
-    public CommonResult<List<CostSurveyTemplateUpload>> listByTaskId(
-            @RequestParam(required = false) String taskId,
-            @RequestParam(required = false) String catalogId
-    ) throws Exception {
-        List<CostSurveyTemplateUpload> uploadList = costSurveyTemplateUploadManager.listByTaskId(taskId);
-        //创建记录
-        if (uploadList.isEmpty()){
-            List<CostSurveyTemplate> costSurveyTemplates = constbaseService.listByCatalogId(catalogId);
-            for (CostSurveyTemplate template : costSurveyTemplates) {
-                CostSurveyTemplateUpload upload = new CostSurveyTemplateUpload();
-                BeanUtils.copyProperties(template, upload);
-                upload.setId(null);
-                upload.setTaskId(taskId);
-                upload.setIsUpload("0");
-                upload.setAuditedStatus("0");
-                upload.setCreateTime(LocalDateTime.now());
-                upload.setUploadTime(LocalDateTime.now());
-                costSurveyTemplateUploadManager.save(upload);
-            }
-        }
-        return CommonResult.<List<CostSurveyTemplateUpload>>ok().value( costSurveyTemplateUploadManager.listByTaskId(taskId));
-    }
-
-    /**
-     * 企业报送-财务数据表-获取所需表格字段
-     * @param surveyTemplateId 成本调查表id
-     * @return 指标项数据列表(带key-value拼接)
-     */
-    @GetMapping(value = "/listItemsByCurrentTemplateId")
-    @ApiOperation(value = "根据成本调查表现行模板id获取所有指标数据", httpMethod = "GET", notes = "根据成本调查表现行模板id获取所有指标数据(带key-value拼接)")
-    public CommonResult<CostItemData> listItemsByCurrentTemplateId(
-            @ApiParam(name = "surveyTemplateId", value = "关联的成本调查表ID", required = true)
-            @RequestParam(required = true) String surveyTemplateId) throws Exception
-    {
-
-        //根据模板id 查询历史版本是现行的版本信息
-        CostSurveyTemplateVersion versiontemplate = costSurveyTemplateVersionManager.selectCurrentVersion(surveyTemplateId);
-        if (versiontemplate == null) {
-            return CommonResult.<CostItemData>ok().value(new CostItemData());
-        }
-
-        List<CostSurveyTemplateItems> items = costSurveyTemplateItemsDao.selectBySurveyTemplateIdAndVersion(surveyTemplateId, versiontemplate.getId());
-        List<CostSurveyTemplateHeaders> headlist = costSurveyTemplateHeadersManager.listVisibleBySurveyTemplateIdAndVersion(surveyTemplateId, versiontemplate.getId());
-        String filename = headlist.stream().map(CostSurveyTemplateHeaders::getFieldName).collect(Collectors.joining(","));
-        String filenids = headlist.stream().map(CostSurveyTemplateHeaders::getId).collect(Collectors.joining(","));
-
-        // 按 orderNum 分组
-        Map<Integer, List<CostSurveyTemplateItems>> groupedByHeadersId = items.stream()
-                .collect(Collectors.groupingBy(CostSurveyTemplateItems::getOrderNum));
-
-        List<Map<String, String>> result = new ArrayList<>();
+    CostVerifyTemplateHeadersManager costVerifyTemplateHeadersManager;
 
-        for (Map.Entry<Integer, List<CostSurveyTemplateItems>> entry : groupedByHeadersId.entrySet()) {
-            List<CostSurveyTemplateItems> group = entry.getValue();
-            if (group.isEmpty()) continue;
 
-            // 主项(可以取第一个)
-            CostSurveyTemplateItems mainItem = group.get(0);
 
-            String headersIds = "";
-            String itemIds = "";
-            // 构造 key-value 映射
-            Map<String, String> keyValueMap = new HashMap<>();
-            for (CostSurveyTemplateItems item : group) {
-                if (item.getRkey() != null && item.getRvalue() != null) {
-                    keyValueMap.put(item.getRkey(), item.getRvalue());
-                    headersIds += item.getHeadersId() + ",";
-                    itemIds += item.getId() + ",";
-                }
-            }
-            if (!StringUtil.isEmpty(headersIds))
-                headersIds = headersIds.substring(0, headersIds.length() - 1);
-
-            if (!StringUtil.isEmpty(itemIds))
-                itemIds = itemIds.substring(0, itemIds.length() - 1);
-
-            //mainItem 放入到keyValueMap中 除了 key value 这两个字段
-            keyValueMap.put("id", mainItem.getId());
-            keyValueMap.put("surveyTemplateId", mainItem.getSurveyTemplateId());
-            keyValueMap.put("versionId", mainItem.getVersionId());
-            keyValueMap.put("headersId", mainItem.getHeadersId());
-            keyValueMap.put("cellCode", mainItem.getCellCode());
-            keyValueMap.put("calculationFormula", mainItem.getCalculationFormula());
-            keyValueMap.put("unit", mainItem.getUnit());
-            keyValueMap.put("orderNum", mainItem.getOrderNum().toString());
-            keyValueMap.put("jsonStr", mainItem.getJsonStr());
-            keyValueMap.put("headersIds", headersIds);
-            keyValueMap.put("itemIds", itemIds);
-            DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
-            keyValueMap.put("createTime", mainItem.getCreateTime() != null ? mainItem.getCreateTime().format(formatter) : null);
-            keyValueMap.put("updateTime", mainItem.getUpdateTime() != null ? mainItem.getUpdateTime().format(formatter) : null);
-            keyValueMap.put("createBy", mainItem.getCreateBy());
-            keyValueMap.put("updateBy", mainItem.getUpdateBy());
-            keyValueMap.put("projectId", mainItem.getProjectId());
-            keyValueMap.put("orderText", mainItem.getOrderText());
-            keyValueMap.put("calculationTemplateId", mainItem.getCalculationTemplateId());
-            keyValueMap.put("rowid", mainItem.getRowid());
-            keyValueMap.put("parentid", mainItem.getParentid());
-
-            result.add(keyValueMap);
-        }
-        CostItemData data = new CostItemData();
-        data.setFixedFields(filename); // 存储动态字段名
-        data.setItemlist(result);
-        data.setFixedFieldids(filenids);
-        return CommonResult.<CostItemData>ok().value(data);
-    }
-
-    /**
-     * 企业报送-成本调查表-在线填报
-     * @param dataList 数据列表
-     * @return 保存结果
-     */
-    @PostMapping(value = "/saveUploadData")
-    @ApiOperation(value = "保存成本调查表模板上传数据", httpMethod = "POST", notes = "保存成本调查表模板上传数据,直接使用实体类列表。固定表和单记录直接保存,动态表需要先创建监审期间记录")
-    public CommonResult<String> saveUploadData(
-            @ApiParam(name = "dataList", value = "数据列表", required = true)
-            @RequestBody List<CostSurveyTemplateUploadData> dataList) throws Exception
-    {
-
-        if (dataList == null || dataList.isEmpty()) {
-            return CommonResult.<String>error().message("数据列表不能为空");
-        }
-
-        // 从第一条数据中提取信息
-        CostSurveyTemplateUploadData firstData = dataList.get(0);
-        String uploadId = firstData.getRefId();
-        String surveyTemplateId = firstData.getSurveyTemplateId();
-
-        // 判断模板类型
-        String templateType = null;
-        if (StringUtil.isNotEmpty(surveyTemplateId)) {
-            CostSurveyTemplate template = costSurveyTemplateManager.getDetail(surveyTemplateId);
-            if (template != null) {
-                templateType = template.getTemplateType();
-            }
-        } else if (StringUtil.isNotEmpty(uploadId)) {
-            CostSurveyTemplateUpload upload = costSurveyTemplateUploadManager.get(uploadId);
-            if (upload != null && StringUtil.isNotEmpty(upload.getSurveyTemplateId())) {
-                CostSurveyTemplate template = costSurveyTemplateManager.getDetail(upload.getSurveyTemplateId());
-                if (template != null) {
-                    templateType = template.getTemplateType();
-                }
-            }
-        }
-
-        // 如果是动态表(3),需要检查periodRecordId
-        if ("3".equals(templateType)) {
-            String periodRecordId = firstData.getPeriodRecordId();
-            if (StringUtil.isEmpty(periodRecordId)) {
-                return CommonResult.<String>error().message("动态表需要先创建监审期间记录,periodRecordId不能为空");
-            }
-        }
-
-        // 设置 type=1 表示成本调查表
-        for (CostSurveyTemplateUploadData data : dataList) {
-            data.setType("1");
-        }
-
-        costSurveyTemplateUploadDataManager.saveData(dataList);
-        return CommonResult.<String>ok().message("保存数据成功");
-    }
-
-    /**
-     * 企业报送-成本调查表-在线填报记录查看
-     * @param queryData 查询条件(实体类,包含uploadId和auditedUnitId)
-     * @return 数据列表(实体类列表)
-     */
-    @PostMapping(value = "/getUploadData")
-    @ApiOperation(value = "查询成本调查表模板上传数据", httpMethod = "POST", notes = "查询成本调查表模板上传数据,返回实体类列表")
-    public CommonResult<List<CostSurveyTemplateUploadData>> getUploadData(
-            @ApiParam(name = "queryData", value = "查询条件", required = true)
-            @RequestBody CostSurveyTemplateUploadData queryData) throws Exception {
-
-        if (queryData == null || StringUtil.isEmpty(queryData.getUploadId()) || StringUtil.isEmpty(queryData.getAuditedUnitId())) {
-            return CommonResult.<List<CostSurveyTemplateUploadData>>error().message("uploadId和auditedUnitId不能为空");
-        }
-
-        // 查询type=1(成本调查表)的数据
-        QueryWrapper<CostSurveyTemplateUploadData> wrapper = new QueryWrapper<>();
-        wrapper.eq("ref_id", queryData.getUploadId())
-               .eq("type", "1")
-               .eq("is_deleted", "0");
-        
-        if (StringUtil.isNotEmpty(queryData.getPeriodRecordId())) {
-            wrapper.eq("period_record_id", queryData.getPeriodRecordId());
-        }
-        
-        wrapper.orderByAsc("rowid", "rkey");
-        List<CostSurveyTemplateUploadData> dataList = costSurveyTemplateUploadDataManager.list(wrapper);
-        for (CostSurveyTemplateUploadData costSurveyTemplateUploadData : dataList) {
-            costSurveyTemplateUploadData.setUploadId(costSurveyTemplateUploadData.getRefId());
-        }
-        return CommonResult.<List<CostSurveyTemplateUploadData>>ok().value(dataList);
-    }
-
-    /**
-     * 企业报送-成本调查表-动态表-新增监审期间记录
-     * @return 保存结果
-     */
-    @PostMapping(value = "/addPeriodRecord")
-    @ApiOperation(value = "新增监审期间记录(动态表使用)", httpMethod = "POST", notes = "新增监审期间记录,用于动态表。必须先创建监审期间记录,然后才能编辑保存数据")
-    public CommonResult<CostAuditPeriodRecord> addPeriodRecord(
-            @ApiParam(name = "record", value = "监审期间记录", required = true)
-            @RequestBody CostAuditPeriodRecord record) throws Exception {
-
-        if (record == null) {
-            return CommonResult.<CostAuditPeriodRecord>error().message("记录不能为空");
-        }
+    @ApiOperation(value = "批量新增成本核定表头及指标项数据", httpMethod = "POST", notes = "先删除旧数据,再批量新增表头和指标项")
+    @PostMapping(value = "/batchSaveOrUpdate")
+    public CommonResult<String> batchSave(@RequestBody BatchVerifyHeadersItemsRequest request) throws Exception {
 
-        if (StringUtil.isEmpty(record.getAuditedUnitId())) {
-            return CommonResult.<CostAuditPeriodRecord>error().message("auditedUnitId不能为空");
-        }
+        String costVerifyTemplateId = request.getCostVerifyTemplateId();
+        List<CostVerifyTemplateHeaders> headersList = request.getHeadersList();
+        List<CostVerifyTemplateItems> itemsList = request.getItemsList();
+        IUser user = ContextUtil.getCurrentUser();
 
-        if (StringUtil.isEmpty(record.getAuditPeriod())) {
-            return CommonResult.<CostAuditPeriodRecord>error().message("auditPeriod不能为空");
+        if ((headersList == null || headersList.isEmpty()) && (itemsList == null || itemsList.isEmpty())) {
+            return CommonResult.<String>error().message("批量操作失败,数据列表为空");
         }
-        // 校验
 
-        CostProjectTask task = costProjectTaskManager.getById(record.getTaskId());
-        CostProjectApproval approval = costProjectApprovalManager.getById(task.getProjectId());
-        if (approval == null) {
-            return CommonResult.<CostAuditPeriodRecord>error().message("项目不存在");
-        }
-        if(!Arrays.asList(approval.getAuditPeriod().split( ",")).contains(record.getAuditPeriod())){
-            return CommonResult.<CostAuditPeriodRecord>error().message("项目所属监审期间不存在");
-        }
-        // 如果已有的也不能添加
-        CostAuditPeriodRecord existRecord = costAuditPeriodRecordManager.getOne(
-                new QueryWrapper<CostAuditPeriodRecord>()
-                        .eq("type", "1")
-                        .eq("task_id", record.getTaskId())
-                        .eq("audit_period", record.getAuditPeriod())
-        );
-        if (existRecord != null) {
-            return CommonResult.<CostAuditPeriodRecord>error().message("项目所属监审期间已存在");
-        }
+        // 删除表头
+        LambdaQueryWrapper<CostVerifyTemplateHeaders> headersWrapper = new LambdaQueryWrapper<>();
+        headersWrapper.eq(CostVerifyTemplateHeaders::getSurveyTemplateId, costVerifyTemplateId);
+        costVerifyTemplateHeadersManager.remove(headersWrapper);
 
-        // 如果没有 uploadId,需要先创建主表
-        String uploadId = record.getUploadId();
-        if (StringUtil.isEmpty(uploadId)) {
-            String catalogId = record.getCatalogId();
-            String surveyTemplateId = record.getSurveyTemplateId();
+        // 删除指标项
+        LambdaQueryWrapper<CostVerifyTemplateItems> itemsWrapper = new LambdaQueryWrapper<>();
+        itemsWrapper.eq(CostVerifyTemplateItems::getSurveyTemplateId, costVerifyTemplateId);
+        costSurveyTemplateItemsManager.remove(itemsWrapper);
 
-            if (StringUtil.isEmpty(catalogId) || StringUtil.isEmpty(surveyTemplateId)) {
-                return CommonResult.<CostAuditPeriodRecord>error().message("uploadId为空时,catalogId和surveyTemplateId不能为空");
+        // 新增表头(批量)
+        if (headersList != null && !headersList.isEmpty()) {
+            LocalDateTime now = LocalDateTime.now();
+            for (CostVerifyTemplateHeaders header : headersList) {
+                header.setId(UUID.randomUUID().toString());
+                header.setFieldEname(PinyinUtil.getPinyin(header.getFieldName()));
+                header.setCreateBy(user.getAccount());
+                header.setCreateTime(now);
+                header.setUpdateBy(user.getAccount());
+                header.setUpdateTime(now);
+                header.setSurveyTemplateId(costVerifyTemplateId);
             }
-
-            // 创建主表记录
-            CostSurveyTemplateUpload upload = new CostSurveyTemplateUpload();
-            upload.setCatalogId(catalogId);
-            upload.setSurveyTemplateId(surveyTemplateId);
-            upload.setIsRequired("1");
-            upload.setIsDeleted("0");
-            upload.setOrderNum(0);
-            upload.setTaskId(record.getTaskId());
-            costSurveyTemplateUploadManager.save(upload);
-            uploadId = upload.getId();
-            record.setUploadId(uploadId);
-        }
-
-        // 设置填报时间为当前时间
-        if (record.getReportingTime() == null) {
-            record.setReportingTime(java.time.LocalDateTime.now());
-        }
-        record.setType("1");
-
-        costAuditPeriodRecordManager.createOrUpdate(record);
-        return CommonResult.<CostAuditPeriodRecord>ok().value(record).message("新增监审期间记录成功");
-    }
-
-    /**
-     * 企业报送-成本调查表-动态表-查询监审期间记录列表
-     * @param queryData 查询条件(包含uploadId和auditedUnitId)
-     * @return 记录列表
-     */
-    @PostMapping(value = "/listPeriodRecord")
-    @ApiOperation(value = "查询监审期间记录列表(动态表使用)", httpMethod = "POST", notes = "查询监审期间记录列表,返回记录列表")
-    public CommonResult<List<CostAuditPeriodRecord>> listPeriodRecord(
-            @ApiParam(name = "queryData", value = "查询条件", required = true)
-            @RequestBody CostAuditPeriodRecord queryData) throws Exception {
-
-        if (queryData == null || StringUtil.isEmpty(queryData.getUploadId()) || StringUtil.isEmpty(queryData.getAuditedUnitId())) {
-            return CommonResult.<List<CostAuditPeriodRecord>>ok().message(null);
-        }
-
-        List<CostAuditPeriodRecord> recordList = costAuditPeriodRecordManager.listByUploadIdAndAuditedUnitId(queryData.getUploadId(), queryData.getAuditedUnitId(),"1");
-        return CommonResult.<List<CostAuditPeriodRecord>>ok().value(recordList);
-    }
-
-    /**
-     * 企业报送-成本调查表-动态表-删除监审期间记录
-     * @param id 记录ID
-     * @return 删除结果
-     */
-    @PostMapping(value = "/deletePeriodRecord")
-    @ApiOperation(value = "删除监审期间记录(动态表使用)", httpMethod = "POST", notes = "删除监审期间记录")
-    public CommonResult<String> deletePeriodRecord(
-            @ApiParam(name = "id", value = "记录ID", required = true)
-            @RequestParam String id) throws Exception {
-
-        if (StringUtil.isEmpty(id)) {
-            return CommonResult.<String>error().message("id不能为空");
-        }
-
-        costAuditPeriodRecordManager.remove(id);
-        return CommonResult.<String>ok().message("删除监审期间记录成功");
-    }
-
-    /**
-     * 企业报送-成本调查表-审核
-     * @return
-     * @exception
-     */
-    @PostMapping(value="/review")
-    public CommonResult<String> review(@RequestBody CostSurveyTemplateUpload costProjectTaskMaterial){
-        CostSurveyTemplateUpload upload = costSurveyTemplateUploadManager.getById(costProjectTaskMaterial.getId());
-        upload.setAuditedStatus(costProjectTaskMaterial.getAuditedStatus());
-        costSurveyTemplateUploadManager.updateById(upload);
-        return CommonResult.<String>ok();
-    }
-
-    /**
-     * 导出成本调查表Excel
-     */
-    @GetMapping(value = "/exportExcel")
-    @ApiOperation(value = "导出成本调查表Excel", httpMethod = "GET")
-    public void exportExcel(
-            @ApiParam(name = "surveyTemplateId", value = "模板ID", required = true)
-            @RequestParam(required = true) String surveyTemplateId,
-            @ApiParam(name = "versionId", value = "版本ID", required = false)
-            @RequestParam(required = false) String versionId,
-            HttpServletResponse response) throws Exception {
-
-        CostSurveyTemplate template = templateManager.get(surveyTemplateId);
-        if (template == null) {
-            response.sendError(HttpServletResponse.SC_BAD_REQUEST, "未找到指定的调查模板");
-            return;
-        }
-
-        CostSurveyTemplateVersion currentVersion = StringUtil.isNotEmpty(versionId) ?
-                versionManager.get(versionId) : versionManager.selectCurrentVersion(surveyTemplateId);
-
-        if (currentVersion == null) {
-            response.sendError(HttpServletResponse.SC_BAD_REQUEST, "未找到指定的模板版本");
-            return;
-        }
-
-        List<CostSurveyTemplateHeaders> headersList = headersDao.selectBySurveyTemplateIdAndVersion(
-                surveyTemplateId, currentVersion.getId()).stream()
-                .filter(header -> StringUtil.isEmpty(header.getShowVisible()) || "1".equals(header.getShowVisible()))
-                .sorted(Comparator.comparing(header -> {
-                    String orderNum = header.getOrderNum();
-                    return StringUtil.isEmpty(orderNum) ? Integer.MAX_VALUE :
-                           Integer.parseInt(orderNum.replaceAll("\\D", "0"));
-                }))
-                .collect(Collectors.toList());
-
-        if (headersList.isEmpty()) {
-            response.sendError(HttpServletResponse.SC_BAD_REQUEST, "未找到表头信息");
-            return;
-        }
-
-        List<CostSurveyTemplateItems> itemsList = itemsDao.selectBySurveyTemplateIdAndVersion(
-                surveyTemplateId, currentVersion.getId());
-
-        Workbook workbook = new XSSFWorkbook();
-        String sheetName = currentVersion.getSurveyTemplateName() != null ?
-                currentVersion.getSurveyTemplateName() : "成本调查表";
-        Sheet sheet = workbook.createSheet(sheetName);
-
-        Row headerRow = sheet.createRow(0);
-        for (int i = 0; i < headersList.size(); i++) {
-            headerRow.createCell(i).setCellValue(headersList.get(i).getFieldName());
+            costVerifyTemplateHeadersManager.saveBatch(headersList);
         }
 
+        // 新增指标项(批量)
         if (itemsList != null && !itemsList.isEmpty()) {
-            Map<String, Integer> headerIndexMap = new HashMap<>();
-            for (int i = 0; i < headersList.size(); i++) {
-                headerIndexMap.put(headersList.get(i).getId(), i);
-            }
-            fillExcelData(sheet, itemsList, headerIndexMap, template.getTemplateType());
-        }
-
-        for (int i = 0; i < headersList.size(); i++) {
-            sheet.autoSizeColumn(i);
-            sheet.setColumnWidth(i, Math.max(sheet.getColumnWidth(i), 3000));
-        }
-
-        response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
-        response.setCharacterEncoding("utf-8");
-        String fileName = sheetName + "_" + System.currentTimeMillis() + ".xlsx";
-        response.setHeader("Content-Disposition", "attachment; filename=" +
-                URLEncoder.encode(fileName, "UTF-8"));
+            LocalDateTime now = LocalDateTime.now();
+            // 先构建 fieldName -> id 映射
+            Map<String, String> headerMap = headersList.stream()
+                    .collect(Collectors.toMap(CostVerifyTemplateHeaders::getFieldName, CostVerifyTemplateHeaders::getId));
 
-        workbook.write(response.getOutputStream());
-        workbook.close();
-    }
-
-    /**
-     * 导入成本调查表Excel数据
-     */
-    @PostMapping(value = "/importExcel")
-    @ApiOperation(value = "导入成本调查表Excel数据", httpMethod = "POST")
-    public CommonResult<String> importExcel(
-            @ApiParam(name = "file", value = "Excel文件", required = true)
-            @RequestParam("file") MultipartFile file,
-            @ApiParam(name = "surveyTemplateId", value = "模板ID", required = true)
-            @RequestParam(required = true) String surveyTemplateId,
-            @ApiParam(name = "taskId", value = "任务ID", required = true)
-            @RequestParam(required = true) String taskId,
-            @ApiParam(name = "uploadId", value = "上传记录ID", required = true)
-            @RequestParam(required = true) String uploadId,
-            @ApiParam(name = "periodRecordId", value = "监审期间记录ID", required = false)
-            @RequestParam(required = false) String periodRecordId) throws Exception {
-
-        if (file == null || file.isEmpty()) {
-            return CommonResult.<String>error().message("上传文件不能为空");
-        }
-
-        String fileName = file.getOriginalFilename();
-        if (fileName == null || (!fileName.endsWith(".xlsx") && !fileName.endsWith(".xls"))) {
-            return CommonResult.<String>error().message("文件格式不正确,请上传Excel文件");
-        }
-
-        CostSurveyTemplate template = templateManager.get(surveyTemplateId);
-        if (template == null) {
-            return CommonResult.<String>error().message("未找到指定的调查模板");
-        }
-
-        CostSurveyTemplateVersion currentVersion = versionManager.selectCurrentVersion(surveyTemplateId);
-        if (currentVersion == null) {
-            return CommonResult.<String>error().message("未找到启用的模板版本");
-        }
-
-        List<CostSurveyTemplateHeaders> headersList = headersDao.selectBySurveyTemplateIdAndVersion(
-                surveyTemplateId, currentVersion.getId()).stream()
-                .filter(header -> StringUtil.isEmpty(header.getShowVisible()) || "1".equals(header.getShowVisible()))
-                .collect(Collectors.toList());
-
-        if (headersList.isEmpty()) {
-            return CommonResult.<String>error().message("未找到表头信息");
-        }
-
-        Map<String, CostSurveyTemplateHeaders> headerNameMap = headersList.stream()
-                .filter(header -> StringUtil.isNotEmpty(header.getFieldName()))
-                .collect(Collectors.toMap(
-                    header -> header.getFieldName().trim(),
-                    header -> header
-                ));
-
-        Workbook workbook = null;
-        try (InputStream inputStream = file.getInputStream()) {
-            workbook = fileName.endsWith(".xlsx") ?
-                new XSSFWorkbook(inputStream) : new HSSFWorkbook(inputStream);
-
-            Sheet sheet = workbook.getSheetAt(0);
-            if (sheet == null || sheet.getPhysicalNumberOfRows() < 2) {
-                return CommonResult.<String>error().message("Excel文件没有数据");
-            }
-
-            Row headerRow = sheet.getRow(0);
-            if (headerRow == null) {
-                return CommonResult.<String>error().message("Excel文件第一行为空");
-            }
-
-            Map<Integer, CostSurveyTemplateHeaders> columnIndexMap = new HashMap<>();
-            for (int i = 0; i < headerRow.getLastCellNum(); i++) {
-                Cell cell = headerRow.getCell(i);
-                if (cell != null) {
-                    String cellValue = getCellStringValue(cell);
-                    if (StringUtil.isNotEmpty(cellValue)) {
-                        CostSurveyTemplateHeaders header = headerNameMap.get(cellValue.trim());
-                        if (header != null) {
-                            columnIndexMap.put(i, header);
-                        }
-                    }
-                }
-            }
-
-            if (columnIndexMap.isEmpty()) {
-                return CommonResult.<String>error().message("Excel表头与模板表头不匹配");
-            }
-
-            List<CostSurveyTemplateUploadData> dataList = new ArrayList<>();
-            int dataRowCount = 0;
-
-            for (int rowIndex = 1; rowIndex <= sheet.getLastRowNum(); rowIndex++) {
-                Row dataRow = sheet.getRow(rowIndex);
-                if (dataRow == null || isEmptyRow(dataRow)) continue;
-
-                String currentRowId = "1".equals(template.getTemplateType()) ?
-                    "row_" + System.currentTimeMillis() : "row_" + rowIndex;
-
-                for (Map.Entry<Integer, CostSurveyTemplateHeaders> entry : columnIndexMap.entrySet()) {
-                    Cell cell = dataRow.getCell(entry.getKey());
-                    String cellValue = getCellStringValue(cell);
-
-                    if (StringUtil.isNotEmpty(cellValue)) {
-                        CostSurveyTemplateUploadData uploadData = createUploadData(
-                                surveyTemplateId, taskId, uploadId, currentRowId,
-                                entry.getValue(), cellValue, periodRecordId);
-                        dataList.add(uploadData);
-                    }
-                }
-                dataRowCount++;
-            }
-
-            if (dataList.isEmpty()) {
-                return CommonResult.<String>error().message("Excel文件中没有有效数据");
-            }
-
-            uploadDataManager.saveData(dataList);
-            
-            // 更新上传状态
-            CostSurveyTemplateUpload upload = costSurveyTemplateUploadManager.getById(uploadId);
-            if (upload != null) {
-                upload.setIsUpload("1");
-                costSurveyTemplateUploadManager.updateById(upload);
-            }
-
-            return CommonResult.<String>ok().message("导入成功,共导入 " + dataRowCount + " 行数据");
-        } catch (Exception e) {
-            return CommonResult.<String>error().message("导入失败:" + e.getMessage());
-        } finally {
-            if (workbook != null) {
-                workbook.close();
+            for (CostVerifyTemplateItems item : itemsList) {
+                item.setHeadersId(headerMap.get(item.getRkey()));
+                item.setId(UUID.randomUUID().toString());
+                item.setCreateBy(user.getAccount());
+                item.setCreateTime(now);
+                item.setUpdateBy(user.getAccount());
+                item.setUpdateTime(now);
+                item.setSurveyTemplateId(costVerifyTemplateId);
             }
+            costSurveyTemplateItemsManager.saveBatch(itemsList);
         }
-    }
 
-    private void fillExcelData(Sheet sheet, List<CostSurveyTemplateItems> itemsList,
-                              Map<String, Integer> headerIndexMap, String templateType) {
-        if ("1".equals(templateType)) {
-            Row dataRow = sheet.createRow(1);
-            for (CostSurveyTemplateItems item : itemsList) {
-                Integer colIndex = headerIndexMap.get(item.getHeadersId());
-                if (colIndex != null) {
-                    dataRow.createCell(colIndex).setCellValue(getItemValue(item));
-                }
-            }
-        } else {
-            Map<String, List<CostSurveyTemplateItems>> itemsByRowId = itemsList.stream()
-                    .filter(item -> StringUtil.isNotEmpty(item.getRowid()))
-                    .collect(Collectors.groupingBy(CostSurveyTemplateItems::getRowid));
-
-            int rowNum = 1;
-            for (Map.Entry<String, List<CostSurveyTemplateItems>> entry : itemsByRowId.entrySet()) {
-                Row dataRow = sheet.createRow(rowNum++);
-                for (CostSurveyTemplateItems item : entry.getValue()) {
-                    Integer colIndex = headerIndexMap.get(item.getHeadersId());
-                    if (colIndex != null) {
-                        dataRow.createCell(colIndex).setCellValue(getItemValue(item));
-                    }
-                }
-            }
-        }
+        return CommonResult.<String>ok().message("批量操作成功");
     }
 
-    private String getItemValue(CostSurveyTemplateItems item) {
-        return StringUtil.isNotEmpty(item.getRvalue()) ? item.getRvalue() :
-               StringUtil.isNotEmpty(item.getJsonStr()) ? item.getJsonStr() : "";
-    }
 
-    private CostSurveyTemplateUploadData createUploadData(String surveyTemplateId, String taskId,
-                                                          String uploadId, String rowid,
-                                                          CostSurveyTemplateHeaders header,
-                                                          String value, String periodRecordId) {
-        CostSurveyTemplateUploadData uploadData = new CostSurveyTemplateUploadData();
-        uploadData.setSurveyTemplateId(surveyTemplateId);
-        uploadData.setTaskId(taskId);
-        uploadData.setRefId(uploadId);
-        uploadData.setType("1"); // 成本调查表
-        uploadData.setRowid(rowid);
-        uploadData.setRkey(StringUtil.isNotEmpty(header.getFieldEname()) ?
-                          header.getFieldEname() : header.getFieldName());
-        uploadData.setRvalue(value);
-        if (StringUtil.isNotEmpty(periodRecordId)) {
-            uploadData.setPeriodRecordId(periodRecordId);
-        }
-        uploadData.setIsDeleted("0");
-        return uploadData;
-    }
-
-    private String getCellStringValue(Cell cell) {
-        if (cell == null) return "";
 
-        switch (cell.getCellType()) {
-            case STRING: return cell.getStringCellValue();
-            case NUMERIC:
-                if (DateUtil.isCellDateFormatted(cell)) {
-                    return cell.getDateCellValue().toString();
-                } else {
-                    double numericValue = cell.getNumericCellValue();
-                    return numericValue == (long) numericValue ?
-                           String.valueOf((long) numericValue) : String.valueOf(numericValue);
-                }
-            case BOOLEAN: return String.valueOf(cell.getBooleanCellValue());
-            case FORMULA:
-                try {
-                    return cell.getStringCellValue();
-                } catch (Exception e) {
-                    try {
-                        return String.valueOf(cell.getNumericCellValue());
-                    } catch (Exception ex) {
-                        return "";
-                    }
-                }
-            default: return "";
-        }
-    }
-
-    private boolean isEmptyRow(Row row) {
-        for (int colIndex = 0; colIndex < row.getLastCellNum(); colIndex++) {
-            Cell cell = row.getCell(colIndex);
-            if (cell != null && StringUtil.isNotEmpty(getCellStringValue(cell))) {
-                return false;
-            }
-        }
-        return true;
-    }
 }
 

+ 7 - 1
assistMg/src/main/java/com/hotent/enterpriseDeclare/manager/impl/CostSurveyTemplateUploadDataManagerImpl.java

@@ -69,7 +69,13 @@ public class CostSurveyTemplateUploadDataManagerImpl extends BaseManagerImpl<Cos
 
         // 从第一条数据中提取信息
         CostSurveyTemplateUploadData firstData = dataList.get(0);
-        String refId = firstData.getUploadId()==null? firstData.getRefId():firstData.getUploadId();
+        String refId = firstData.getUploadId();
+        if(refId==null){
+            refId = firstData.getRefId();
+        }
+        if (refId==null){
+            refId = firstData.getTaskId();
+        }
         String type = firstData.getType();
         String taskId = firstData.getTaskId();
 

+ 4 - 2
assistMg/src/main/java/com/hotent/project/controller/CostProjectTaskMaterialController.java

@@ -6,6 +6,7 @@ import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.multipart.MultipartFile;
 import java.util.List;
 import com.hotent.base.model.CommonResult;
 import com.hotent.base.util.StringUtil;
@@ -17,6 +18,7 @@ import com.baomidou.mybatisplus.core.toolkit.StringUtils;
 import com.hotent.base.controller.BaseController;
 import com.hotent.project.model.CostProjectTaskMaterial;
 import com.hotent.project.manager.CostProjectTaskMaterialManager;
+import javax.servlet.http.HttpServletResponse;
 
 /**
  * 任务定制-报送资料要求 前端控制器
@@ -43,9 +45,9 @@ public class CostProjectTaskMaterialController extends BaseController<CostProjec
     /**
 	 * 新增,更新任务定制-报送资料要求
 	 * @param costProjectTaskMaterial
-	 * @throws Exception 
+	 * @throws Exception
 	 * @return
-	 * @exception 
+	 * @exception
 	 */
 	@PostMapping(value="/save")
 	@ApiOperation(value = "新增,更新任务定制-报送资料要求数据", httpMethod = "POST", notes = "新增,更新任务定制-报送资料要求数据")

+ 489 - 472
assistMg/src/main/java/com/hotent/surveyinfo/controller/CostSurveyTemplateController.java

@@ -1,6 +1,7 @@
 package com.hotent.surveyinfo.controller;
 
 
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.hotent.base.annotation.ApiGroup;
 import com.hotent.base.constants.ApiGroupConsts;
 import com.hotent.base.query.PageList;
@@ -39,8 +40,8 @@ import java.util.stream.Collectors;
 /**
  * 成本调查表模板表 前端控制器
  *
- * @company 山西清众科技股份有限公司
  * @author 超级管理员
+ * @company 山西清众科技股份有限公司
  * @since 2025-09-19
  */
 @RestController
@@ -48,494 +49,510 @@ import java.util.stream.Collectors;
 @Api(tags = "成本调查")
 @ApiGroup(group = {ApiGroupConsts.GROUP_COST})
 public class CostSurveyTemplateController extends BaseController<CostSurveyTemplateManager, CostSurveyTemplate> {
-	@Autowired
-	 CostSurveyTemplateManager constbaseService;
-
-	@Autowired
-	CostSurveyTemplateDao costSurveyTemplateDao;
-
-	@Autowired
-	CostSurveyTemplateVersionManager costSurveyTemplateVersionMapper;
-	@Autowired
-	CostSurveyTemplateHeadersDao costSurveyTemplateHeadersDao;
-	@Autowired
-	CostSurveyTemplateItemsDao costSurveyTemplateItemsDao;
-
-	@Autowired
-	private CostVerifyTemplateManager costVerifyTemplateManager;
-
-	@Autowired
-	private CostVerifyTemplateHeadersManager costVerifyTemplateHeadersManager;
-
-
-	@Autowired
-	private CostVerifyTemplateItemsManager costVerifyTemplateItemsManager;
-	// 创建通用服务实例
-	private final CrudService crudService = new CrudService();
-	/**
-	 * 获取所有成本调查表模板数据
-	 * @return
-	 * @throws Exception
-	 */
-	@PostMapping(value="/listPage")
-	@ApiOperation(value="获取成本调查表模板数据", httpMethod = "POST", notes = "获取所有成本调查表模板数据集合")
-	public PageList<CostSurveyTemplate> listPage(
-			 @RequestBody ConstSurveyPageParam params) throws Exception{
-		return constbaseService.getCostSurveyListPage(params);
-	}
-
-	/**
-	 * 获取所有现行版启用的成本调查表模板数据
-	 * @return
-	 * @throws Exception
-	 */
-	@GetMapping(value="/getallCurrentCostSurveyList")
-	@ApiOperation(value="获取所有现行版启用的成本调查表模板数据", httpMethod = "GET", notes = "获取所有现行版启用的成本调查表模板数据")
-	public PageResp<CostSurveyTemplate> allCurrentCostSurveyList(ConstSurveyPageReq req) throws Exception{
-		return crudService.pageQuery(req, constbaseService::getallCurrentCostSurveyList);
-	}
-
-
-	/**
-	 * 根据id获取成本调查表模板表数据详情
-	 * @param id
-	 * @return
-	 * @throws Exception 
-	 * ModelAndView
-	 */
-	@GetMapping(value="/getDetail")
-	@ApiOperation(value="根据id获取成本调查表模板表数据详情",httpMethod = "GET",notes = "根据id获取成本调查表模板表数据详情")
-	public CommonResult<CostSurveyTemplate> getDetail(@ApiParam(name="id",value="业务对象主键", required = true)@RequestParam(required=true) String id) throws Exception{
-		return CommonResult.<CostSurveyTemplate>ok().value(baseService.getDetail(id));
-	}
+    @Autowired
+    CostSurveyTemplateManager constbaseService;
+
+    @Autowired
+    CostSurveyTemplateDao costSurveyTemplateDao;
+
+    @Autowired
+    CostSurveyTemplateVersionManager costSurveyTemplateVersionMapper;
+    @Autowired
+    CostSurveyTemplateHeadersDao costSurveyTemplateHeadersDao;
+    @Autowired
+    CostSurveyTemplateItemsDao costSurveyTemplateItemsDao;
+
+    @Autowired
+    private CostVerifyTemplateManager costVerifyTemplateManager;
+
+    @Autowired
+    private CostVerifyTemplateHeadersManager costVerifyTemplateHeadersManager;
+
+
+    @Autowired
+    private CostVerifyTemplateItemsManager costVerifyTemplateItemsManager;
+    // 创建通用服务实例
+    private final CrudService crudService = new CrudService();
+
+    /**
+     * 获取所有成本调查表模板数据
+     *
+     * @return
+     * @throws Exception
+     */
+    @PostMapping(value = "/listPage")
+    @ApiOperation(value = "获取成本调查表模板数据", httpMethod = "POST", notes = "获取所有成本调查表模板数据集合")
+    public PageList<CostSurveyTemplate> listPage(
+            @RequestBody ConstSurveyPageParam params) throws Exception {
+        return constbaseService.getCostSurveyListPage(params);
+    }
+
+    /**
+     * 获取所有现行版启用的成本调查表模板数据
+     *
+     * @return
+     * @throws Exception
+     */
+    @GetMapping(value = "/getallCurrentCostSurveyList")
+    @ApiOperation(value = "获取所有现行版启用的成本调查表模板数据", httpMethod = "GET", notes = "获取所有现行版启用的成本调查表模板数据")
+    public PageResp<CostSurveyTemplate> allCurrentCostSurveyList(ConstSurveyPageReq req) throws Exception {
+        return crudService.pageQuery(req, constbaseService::getallCurrentCostSurveyList);
+    }
+
+
+    /**
+     * 根据id获取成本调查表模板表数据详情
+     *
+     * @param id
+     * @return
+     * @throws Exception ModelAndView
+     */
+    @GetMapping(value = "/getDetail")
+    @ApiOperation(value = "根据id获取成本调查表模板表数据详情", httpMethod = "GET", notes = "根据id获取成本调查表模板表数据详情")
+    public CommonResult<CostSurveyTemplate> getDetail(@ApiParam(name = "id", value = "业务对象主键", required = true) @RequestParam(required = true) String id) throws Exception {
+        return CommonResult.<CostSurveyTemplate>ok().value(baseService.getDetail(id));
+    }
+
+    /**
+     * 新增,更新成本调查表模板表
+     *
+     * @param costSurveyTemplate
+     * @return
+     * @throws Exception
+     * @throws
+     */
+    @PostMapping(value = "/save")
+    @ApiOperation(value = "新增,更新成本调查表模板表数据", httpMethod = "POST", notes = "新增,更新成本调查表模板表数据")
+    public CommonResult<String> save(@ApiParam(name = "CostSurveyTemplate", value = "成本调查表模板表对象", required = true) @RequestBody CostSurveyTemplate costSurveyTemplate) throws Exception {
+        String msg = StringUtil.isEmpty(costSurveyTemplate.getSurveyTemplateId()) ? "添加成本调查表模板表成功" : "更新成本调查表模板表成功";
+        if (StringUtil.isEmpty(costSurveyTemplate.getSurveyTemplateId())) {
+            IUser user = ContextUtil.getCurrentUser();
+            costSurveyTemplate.setCreateBy(user.getAccount());
+            costSurveyTemplate.setCreateTime(LocalDateTime.now());
+            costSurveyTemplate.setIsDelete("0");
+            costSurveyTemplate.setStatus("-1");
+        } else {
+            costSurveyTemplate.setUpdateBy(ContextUtil.getCurrentUser().getAccount());
+            costSurveyTemplate.setUpdateTime(LocalDateTime.now());
+        }
+
+        baseService.createOrUpdate(costSurveyTemplate);
+        return CommonResult.<String>ok().message(msg);
+    }
+
+    /**
+     * 根据id删除成本调查表模板数据
+     *
+     * @param id
+     * @return
+     * @throws Exception
+     */
+    @ApiOperation(value = "根据id删除成本调查表模板数据", httpMethod = "GET", notes = "根据id删除成本调查表模板数据")
+    @GetMapping(value = "/remove")
+    public CommonResult<String> remove(@ApiParam(name = "id", value = "业务对象主键", required = true) @RequestParam(required = true) String id) throws Exception {
+        baseService.remove(id);
+        return CommonResult.<String>ok().message("删除成本调查表模板成功");
+    }
+
+
+    /**
+     * 批量删除成本调查表模板数据
+     *
+     * @param ids 要删除的ID列表
+     * @return 操作结果
+     * @throws Exception
+     */
+    @ApiOperation(value = "批量删除成本调查表模板数据", httpMethod = "POST", notes = "批量删除成本调查表模板数据")
+    @PostMapping(value = "/batchRemove")
+    public CommonResult<String> batchRemove(@ApiParam(name = "ids", value = "业务对象主键列表", required = true) @RequestBody List<String> ids) throws Exception {
+        if (ids == null || ids.isEmpty()) {
+            return CommonResult.<String>error().message("删除失败:未选择任何数据");
+        }
+
+        try {
+            baseService.batchRemove(ids);
+            return CommonResult.<String>ok().message("成功删除" + ids.size() + "条数据");
+        } catch (Exception e) {
+            return CommonResult.<String>error().message("删除失败:" + e.getMessage());
+        }
+    }
+
     /**
-	 * 新增,更新成本调查表模板表
-	 * @param costSurveyTemplate
-	 * @throws Exception 
-	 * @return
-	 * @exception 
-	 */
-	@PostMapping(value="/save")
-	@ApiOperation(value = "新增,更新成本调查表模板表数据", httpMethod = "POST", notes = "新增,更新成本调查表模板表数据")
-	public CommonResult<String> save(@ApiParam(name="CostSurveyTemplate",value="成本调查表模板表对象", required = true)@RequestBody CostSurveyTemplate costSurveyTemplate) throws Exception{
-		String msg = StringUtil.isEmpty(costSurveyTemplate.getSurveyTemplateId()) ? "添加成本调查表模板表成功" : "更新成本调查表模板表成功";
-		if(StringUtil.isEmpty(costSurveyTemplate.getSurveyTemplateId()))
-		{
-			IUser user = ContextUtil.getCurrentUser();
-			costSurveyTemplate.setCreateBy(user.getAccount());
-			costSurveyTemplate.setCreateTime(LocalDateTime.now());
-			costSurveyTemplate.setIsDelete( "0");
-			costSurveyTemplate.setStatus("-1");
-		}
-		else{
-			costSurveyTemplate.setUpdateBy(ContextUtil.getCurrentUser().getAccount());
-			costSurveyTemplate.setUpdateTime(LocalDateTime.now());
-		}
-
-		baseService.createOrUpdate(costSurveyTemplate);
-		return CommonResult.<String>ok().message(msg);
-	}
-
-	/**
-	 * 根据id删除成本调查表模板数据
-	 * @param id
-	 * @return
-	 * @throws Exception
-	 */
-	@ApiOperation(value = "根据id删除成本调查表模板数据", httpMethod = "GET", notes = "根据id删除成本调查表模板数据")
-	@GetMapping(value = "/remove")
-	public CommonResult<String> remove(@ApiParam(name = "id", value = "业务对象主键", required = true) @RequestParam(required = true) String id) throws Exception {
-		baseService.remove(id);
-		return CommonResult.<String>ok().message("删除成本调查表模板成功");
-	}
-
-
-	/**
-	 * 批量删除成本调查表模板数据
-	 * @param ids 要删除的ID列表
-	 * @return 操作结果
-	 * @throws Exception
-	 */
-	@ApiOperation(value = "批量删除成本调查表模板数据", httpMethod = "POST", notes = "批量删除成本调查表模板数据")
-	@PostMapping(value = "/batchRemove")
-	public CommonResult<String> batchRemove(@ApiParam(name = "ids", value = "业务对象主键列表", required = true) @RequestBody List<String> ids) throws Exception {
-		if (ids == null || ids.isEmpty()) {
-			return CommonResult.<String>error().message("删除失败:未选择任何数据");
-		}
-
-		try {
-			baseService.batchRemove(ids);
-			return CommonResult.<String>ok().message("成功删除" + ids.size() + "条数据");
-		} catch (Exception e) {
-			return CommonResult.<String>error().message("删除失败:" + e.getMessage());
-		}
-	}
-
-	/**
-	 * 获取除去指定ID外的所有成本调查表模板列表
-	 * @param surveyTemplateId 要排除的模板ID
-	 * @return 成本调查表模板列表
-	 * @throws Exception
-	 */
-	@GetMapping(value="/listExcludeId")
-	@ApiOperation(value="计算公式-选择成本调查表", httpMethod = "GET", notes = "获取除去指定ID外的所有成本调查表模板列表")
-	public CommonResult<List<CostSurveyTemplate>> listExcludeId(
-			@ApiParam(name="surveyTemplateId", value="要排除的模板ID", required = false)
-			@RequestParam(required = false) String surveyTemplateId) throws Exception {
-
-		CostSurveyTemplate queryCondition = new CostSurveyTemplate();
-		queryCondition.setStatus("0");//启用状态的成本调查表模板
-		queryCondition.setTemplateType("2"); // 模板类型为固定表
+     * 获取除去指定ID外的所有成本调查表模板列表
+     *
+     * @param surveyTemplateId 要排除的模板ID
+     * @return 成本调查表模板列表
+     * @throws Exception
+     */
+    @GetMapping(value = "/listExcludeId")
+    @ApiOperation(value = "计算公式-选择成本调查表", httpMethod = "GET", notes = "获取除去指定ID外的所有成本调查表模板列表")
+    public CommonResult<List<CostSurveyTemplate>> listExcludeId(
+            @ApiParam(name = "surveyTemplateId", value = "要排除的模板ID", required = false)
+            @RequestParam(required = false) String surveyTemplateId) throws Exception {
+
+        CostSurveyTemplate queryCondition = new CostSurveyTemplate();
+        queryCondition.setStatus("0");//启用状态的成本调查表模板
+        queryCondition.setTemplateType("2"); // 模板类型为固定表
 //		IUser user = ContextUtil.getCurrentUser();
 //		queryCondition.setCreateBy(user.getAccount());
-		// 这里可以根据业务需要设置其他查询条件
-		List<CostSurveyTemplate> allTemplates = costSurveyTemplateDao.selectByCondition(queryCondition);
-
-		// 如果提供了excludeId,则过滤掉该ID的记录
-		if (surveyTemplateId != null && !surveyTemplateId.isEmpty()) {
-			allTemplates = allTemplates.stream()
-					.filter(template -> !surveyTemplateId.equals(template.getSurveyTemplateId()))
-					.collect(Collectors.toList());
-		}
-
-		return CommonResult.<List<CostSurveyTemplate>>ok().value(allTemplates);
-	}
-
-	/**
-	 * 获取所有模板类型为固定表的所有启用成本调查表数据
-	 * @return 启用的固定表类型成本调查表列表
-	 * @throws Exception
-	 */
-	@GetMapping(value="/listFixedEnabled")
-	@ApiOperation(value="获取所有模板类型为固定表的所有启用成本调查表数据", httpMethod = "GET", notes = "获取所有模板类型为固定表的所有启用成本调查表数据")
-	public CommonResult<List<CostSurveyTemplate>> listFixedEnabled() throws Exception {
-		CostSurveyTemplate queryCondition = new CostSurveyTemplate();
-		queryCondition.setStatus("0"); // 启用状态
-		queryCondition.setTemplateType("2"); // 模板类型为固定表
-
-		List<CostSurveyTemplate> templates = costSurveyTemplateDao.selectByCondition(queryCondition);
-		return CommonResult.<List<CostSurveyTemplate>>ok().value(templates);
-	}
-
-	/**
-	 * 生成核定模板数据(通过templateId,状态为启用)
-	 * @param templateId 模板ID
-	 * @return 核定模板数据
-	 * @throws Exception
-	 */
-	@GetMapping(value="/generateVerifyTemplateData")
-	@ApiOperation(value="生成核定模板数据", httpMethod = "GET", notes = "通过templateId获取启用状态的核定模板数据")
-	public CommonResult<CostVerifyTemplate> generateVerifyTemplateData(
-			@ApiParam(name="templateId", value="模板ID", required = true)
-			@RequestParam String templateId,@ApiParam(name="templatename", value="模板名称", required = true)
-	@RequestParam String templatename,@ApiParam(name="catalogId", value="监审id", required = true)
-	 String taskId,@ApiParam(name="taskId", value="任务id", required = false)
-	@RequestParam String catalogId ) throws Exception {
-
-		CostSurveyTemplate queryCondition = new CostSurveyTemplate();
-		queryCondition.setSurveyTemplateId(templateId);
-		queryCondition.setStatus("0"); // 启用状态
-		IUser user = ContextUtil.getCurrentUser();
-		List<CostSurveyTemplate> templates = costSurveyTemplateDao.selectByCondition(queryCondition);
-		CostSurveyTemplateVersion currentVersion = costSurveyTemplateVersionMapper.selectCurrentVersion(templateId);
-		List<CostSurveyTemplateItems> updateites=new ArrayList<>();
-		String ttemplateId = "";
-		CostVerifyTemplate costVerifyTemplate = new CostVerifyTemplate();
-		if (currentVersion != null) {
-			CostSurveyTemplate sourceTemplate = templates.get(0);
-
-			List<CostSurveyTemplateHeaders> headersList = costSurveyTemplateHeadersDao.selectBySurveyTemplateIdAndVersion(templateId, currentVersion.getId());
-			List<CostSurveyTemplateItems> itemsList = costSurveyTemplateItemsDao.selectBySurveyTemplateIdAndVersion(templateId, currentVersion.getId());
-
-			// 1. 开始将模板数据写入 CostVerifyTemplate 表中
+        // 这里可以根据业务需要设置其他查询条件
+        List<CostSurveyTemplate> allTemplates = costSurveyTemplateDao.selectByCondition(queryCondition);
+
+        // 如果提供了excludeId,则过滤掉该ID的记录
+        if (surveyTemplateId != null && !surveyTemplateId.isEmpty()) {
+            allTemplates = allTemplates.stream()
+                    .filter(template -> !surveyTemplateId.equals(template.getSurveyTemplateId()))
+                    .collect(Collectors.toList());
+        }
+
+        return CommonResult.<List<CostSurveyTemplate>>ok().value(allTemplates);
+    }
+
+    /**
+     * 获取所有模板类型为固定表的所有启用成本调查表数据
+     *
+     * @return 启用的固定表类型成本调查表列表
+     * @throws Exception
+     */
+    @GetMapping(value = "/listFixedEnabled")
+    @ApiOperation(value = "获取所有模板类型为固定表的所有启用成本调查表数据", httpMethod = "GET", notes = "获取所有模板类型为固定表的所有启用成本调查表数据")
+    public CommonResult<List<CostSurveyTemplate>> listFixedEnabled() throws Exception {
+        CostSurveyTemplate queryCondition = new CostSurveyTemplate();
+        queryCondition.setStatus("0"); // 启用状态
+        queryCondition.setTemplateType("2"); // 模板类型为固定表
+
+        List<CostSurveyTemplate> templates = costSurveyTemplateDao.selectByCondition(queryCondition);
+        return CommonResult.<List<CostSurveyTemplate>>ok().value(templates);
+    }
+
+    /**
+     * 生成核定模板数据(通过templateId,状态为启用)
+     *
+     * @param templateId 模板ID
+     * @return 核定模板数据
+     * @throws Exception
+     */
+    @GetMapping(value = "/generateVerifyTemplateData")
+    @ApiOperation(value = "生成核定模板数据", httpMethod = "GET", notes = "通过templateId获取启用状态的核定模板数据")
+    public CommonResult<CostVerifyTemplate> generateVerifyTemplateData(
+            @ApiParam(name = "templateId", value = "模板ID", required = true)
+            @RequestParam String templateId, @ApiParam(name = "templatename", value = "模板名称", required = true)
+            @RequestParam String templatename, @ApiParam(name = "catalogId", value = "监审id", required = true)
+            String taskId, @ApiParam(name = "taskId", value = "任务id", required = false)
+            @RequestParam String catalogId) throws Exception {
+
+        if (taskId!=null){
+            //先删
+            costVerifyTemplateManager.remove(
+                    new QueryWrapper<CostVerifyTemplate>()
+                            .eq("task_id", taskId)
+            );
+        }
+        CostSurveyTemplate queryCondition = new CostSurveyTemplate();
+        queryCondition.setSurveyTemplateId(templateId);
+        queryCondition.setStatus("0"); // 启用状态
+        IUser user = ContextUtil.getCurrentUser();
+        List<CostSurveyTemplate> templates = costSurveyTemplateDao.selectByCondition(queryCondition);
+        CostSurveyTemplateVersion currentVersion = costSurveyTemplateVersionMapper.selectCurrentVersion(templateId);
+        List<CostSurveyTemplateItems> updateites = new ArrayList<>();
+        String ttemplateId = "";
+        CostVerifyTemplate costVerifyTemplate = new CostVerifyTemplate();
+        if (currentVersion != null) {
+            CostSurveyTemplate sourceTemplate = templates.get(0);
+
+            List<CostSurveyTemplateHeaders> headersList = costSurveyTemplateHeadersDao.selectBySurveyTemplateIdAndVersion(templateId, currentVersion.getId());
+            List<CostSurveyTemplateItems> itemsList = costSurveyTemplateItemsDao.selectBySurveyTemplateIdAndVersion(templateId, currentVersion.getId());
+
+            // 1. 开始将模板数据写入 CostVerifyTemplate 表中
 
 // 复制源模板的基本属性
-			ttemplateId=UUID.randomUUID().toString();
-			costVerifyTemplate.setSurveyTemplateId(ttemplateId);
-			costVerifyTemplate.setSurveyTemplateName(sourceTemplate.getSurveyTemplateName());
-			costVerifyTemplate.setTemplateType(sourceTemplate.getTemplateType());
-			costVerifyTemplate.setCreatemode("1");
-			costVerifyTemplate.setSurveyTemplateNameYw(PinyinUtil.getPinyin(sourceTemplate.getSurveyTemplateName()));
-			costVerifyTemplate.setCreatetemplateid(sourceTemplate.getSurveyTemplateId());
-			costVerifyTemplate.setStatus("-1");
-			costVerifyTemplate.setSurveyTemplateName(templatename);
-			costVerifyTemplate.setCatalogId(catalogId);
-			costVerifyTemplate.setCreateBy(user.getAccount());
-			costVerifyTemplate.setCreateTime( LocalDateTime.now());
-			costVerifyTemplate.setType(sourceTemplate.getType());
-			costVerifyTemplate.setIsDelete("0");
-			costVerifyTemplate.setTaskId(taskId);
+            ttemplateId = UUID.randomUUID().toString();
+            costVerifyTemplate.setSurveyTemplateId(ttemplateId);
+            costVerifyTemplate.setSurveyTemplateName(sourceTemplate.getSurveyTemplateName());
+            costVerifyTemplate.setTemplateType(sourceTemplate.getTemplateType());
+            costVerifyTemplate.setCreatemode("1");
+            costVerifyTemplate.setSurveyTemplateNameYw(PinyinUtil.getPinyin(sourceTemplate.getSurveyTemplateName()));
+            costVerifyTemplate.setCreatetemplateid(sourceTemplate.getSurveyTemplateId());
+            costVerifyTemplate.setStatus(taskId==null?"-1":"0");
+            costVerifyTemplate.setSurveyTemplateName(templatename);
+            costVerifyTemplate.setCatalogId(catalogId);
+            costVerifyTemplate.setCreateBy(user.getAccount());
+            costVerifyTemplate.setCreateTime(LocalDateTime.now());
+            costVerifyTemplate.setType(sourceTemplate.getType());
+            costVerifyTemplate.setIsDelete("0");
+            costVerifyTemplate.setTaskId(taskId);
 
 //			costVerifyTemplate.setCatalogId(sourceTemplate.getCatalogId());
 
 // 设置与源模板的关联关系
 
-			costVerifyTemplate.setVersionNo(costVerifyTemplateManager.generateVersionNumber());
+            costVerifyTemplate.setVersionNo(costVerifyTemplateManager.generateVersionNumber());
 
 // 保存成本核定模板
-			costVerifyTemplateManager.createOrUpdate(costVerifyTemplate);
+            costVerifyTemplateManager.createOrUpdate(costVerifyTemplate);
 
 // 2. 将headersList数据写入 CostVerifyTemplateHeaders 表中
-			if (headersList != null && !headersList.isEmpty()) {
-				for (CostSurveyTemplateHeaders header : headersList) {
-					CostVerifyTemplateHeaders verifyHeader = new CostVerifyTemplateHeaders();
-					// 复制表头属性
-					String headid=UUID.randomUUID().toString();
-					verifyHeader.setId(headid);
-					verifyHeader.setFieldName(header.getFieldName());
-					verifyHeader.setFieldEname(header.getFieldEname());
-					verifyHeader.setFieldType(header.getFieldType());
-					verifyHeader.setTabtype(header.getTabtype());
-					verifyHeader.setIsRequired(header.getIsRequired());
-					verifyHeader.setOrderNum(header.getOrderNum());
-					verifyHeader.setDictid(header.getDictid());
-					verifyHeader.setDictCode(header.getDictCode());
-					verifyHeader.setCreateBy(user.getAccount());
-					verifyHeader.setColumnComment(header.getColumnComment());
-					verifyHeader.setColumnType(header.getColumnType());
-					verifyHeader.setCreateTime( LocalDateTime.now());
-
-
-					// 设置关联关系
-					verifyHeader.setSurveyTemplateId(ttemplateId);
-					verifyHeader.setVersionId(currentVersion.getId());
-
-					//修改items 指标项中的headersid
-					if (itemsList != null && !itemsList.isEmpty()) {
-						for (CostSurveyTemplateItems items : itemsList) {
-							if (items.getHeadersId().equals(header.getId())) {
-								items.setHeadersId(headid);
-								updateites.add(items);
-							}
-
-						}
-					}
-					// 保存成本核定表头
-					costVerifyTemplateHeadersManager.createOrUpdate(verifyHeader);
-				}
-			}
+            if (headersList != null && !headersList.isEmpty()) {
+                for (CostSurveyTemplateHeaders header : headersList) {
+                    CostVerifyTemplateHeaders verifyHeader = new CostVerifyTemplateHeaders();
+                    // 复制表头属性
+                    String headid = UUID.randomUUID().toString();
+                    verifyHeader.setId(headid);
+                    verifyHeader.setFieldName(header.getFieldName());
+                    verifyHeader.setFieldEname(header.getFieldEname());
+                    verifyHeader.setFieldType(header.getFieldType());
+                    verifyHeader.setTabtype(header.getTabtype());
+                    verifyHeader.setIsRequired(header.getIsRequired());
+                    verifyHeader.setOrderNum(header.getOrderNum());
+                    verifyHeader.setDictid(header.getDictid());
+                    verifyHeader.setDictCode(header.getDictCode());
+                    verifyHeader.setCreateBy(user.getAccount());
+                    verifyHeader.setColumnComment(header.getColumnComment());
+                    verifyHeader.setColumnType(header.getColumnType());
+                    verifyHeader.setCreateTime(LocalDateTime.now());
+
+
+                    // 设置关联关系
+                    verifyHeader.setSurveyTemplateId(ttemplateId);
+                    verifyHeader.setVersionId(currentVersion.getId());
+
+                    //修改items 指标项中的headersid
+                    if (itemsList != null && !itemsList.isEmpty()) {
+                        for (CostSurveyTemplateItems items : itemsList) {
+                            if (items.getHeadersId().equals(header.getId())) {
+                                items.setHeadersId(headid);
+                                updateites.add(items);
+                            }
+
+                        }
+                    }
+                    // 保存成本核定表头
+                    costVerifyTemplateHeadersManager.createOrUpdate(verifyHeader);
+                }
+            }
 
 // 3. 将itemsList数据写入 CostVerifyTemplateItems 表中
-			if (updateites != null && !updateites.isEmpty()) {
-				for (CostSurveyTemplateItems item : updateites) {
-					CostVerifyTemplateItems verifyItem = new CostVerifyTemplateItems();
-					// 复制数据项属性
-					String itemid=UUID.randomUUID().toString();
-					verifyItem .setId(itemid);
-					verifyItem.setRowid(item.getRowid());
-					verifyItem.setParentid(item.getParentid());
-					verifyItem.setRkey(item.getRkey());
-					verifyItem.setRvalue(item.getRvalue());
-					verifyItem.setCellCode(item.getCellCode());
-					verifyItem.setCalculationFormula(item.getCalculationFormula());
-					verifyItem.setUnit(item.getUnit());
-					verifyItem.setOrderNum(item.getOrderNum());
-					verifyItem.setJsonStr(item.getJsonStr());
-					verifyItem.setCreateBy(user.getAccount());
-					verifyItem.setCreateTime(LocalDateTime.now());
-					verifyItem.setProjectId(item.getProjectId());
-					verifyItem.setOrderText(item.getOrderText());
-					verifyItem.setSurveyTemplateId(ttemplateId);
-					verifyItem.setVersionId(currentVersion.getId());
-					verifyItem.setHeadersId(item.getHeadersId());
-
-					// 保存成本核定数据项
-					costVerifyTemplateItemsManager.createOrUpdate(verifyItem);
-				}
-
-			}
-		}
-
-			if (templates != null && !templates.isEmpty()) {
-				return CommonResult.<CostVerifyTemplate>ok().value(costVerifyTemplate);
-			} else {
-				return CommonResult.<CostVerifyTemplate>error().message("未找到启用状态的模板数据");
-			}
-		}
-
-	/**
-	 * 生成版本号,格式为:yyyyMMdd + 4位流水号(如:202509270001)
-	 *
-	 * @return 生成的版本号
-	 */
-	public String generateVersionNumber() {
-		// 1. 获取当前日期字符串
-		String dateStr = new java.text.SimpleDateFormat("yyyyMMdd").format(new java.util.Date());
-
-		// 2. 查询当日最大版本号
-		String maxVersion = costSurveyTemplateVersionMapper.selectMaxVersionByDate(dateStr);
-
-		int sequence = 1;
-		if (maxVersion != null && maxVersion.startsWith(dateStr)) {
-			// 3. 提取流水号部分并加1
-			String sequenceStr = maxVersion.substring(8); // 取后4位
-			sequence = Integer.parseInt(sequenceStr) + 1;
-		}
-
-		// 4. 格式化生成版本号
-		return String.format("%s%04d", dateStr, sequence);
-	}
-
-
-	/**
-	 * 导出成本调查表Excel模板
-	 * @param templateId 模板ID
-	 * @return Excel文件
-	 * @throws Exception
-	 */
-	@GetMapping(value="/exportExcelTemplate")
-	@ApiOperation(value="导出成本调查表Excel模板", httpMethod = "GET", notes = "导出Excel模板并填充内容")
-	public void exportExcelTemplate(
-			@ApiParam(name="templateId", value="模板ID", required = true)
-			@RequestParam String templateId,
-			HttpServletResponse response) throws Exception {
-
-		// 获取当前启用版本
-		CostSurveyTemplateVersion currentVersion = costSurveyTemplateVersionMapper.selectCurrentVersion(templateId);
-
-		if (currentVersion == null) {
-			response.sendError(HttpServletResponse.SC_BAD_REQUEST, "未找到启用的模板版本");
-			return;
-		}
-
-		// 获取表头信息
-		List<CostSurveyTemplateHeaders> headersList = costSurveyTemplateHeadersDao.selectBySurveyTemplateIdAndVersion(templateId, currentVersion.getId());
-
-		// 获取数据项信息
-		List<CostSurveyTemplateItems> itemsList = costSurveyTemplateItemsDao.selectBySurveyTemplateIdAndVersion(templateId, currentVersion.getId());
-
-		// 创建Excel工作簿
-		Workbook workbook = new XSSFWorkbook();
-		Sheet sheet = workbook.createSheet(currentVersion.getSurveyTemplateName());
-
-		// 创建表头行
-		Row headerRow = sheet.createRow(0);
-
-		// 根据表头信息创建Excel列标题
-		for (int i = 0; i < headersList.size(); i++) {
-			CostSurveyTemplateHeaders header = headersList.get(i);
-			Cell cell = headerRow.createCell(i);
-			cell.setCellValue(header.getFieldName());
-		}
-
-		// 按照orderNum排序表头
-		headersList.sort(Comparator.comparing(CostSurveyTemplateHeaders::getOrderNum,
-				Comparator.nullsLast(Comparator.naturalOrder())));
-
-		// 填充数据行(示例数据)
-		if (!itemsList.isEmpty()) {
-			// 按orderNum排序数据项
-			itemsList.sort(Comparator.comparing(CostSurveyTemplateItems::getOrderNum,
-					Comparator.nullsLast(Comparator.naturalOrder())));
-
-			// 创建示例行
-			Row dataRow = sheet.createRow(1);
-			for (int i = 0; i < headersList.size(); i++) {
-				CostSurveyTemplateHeaders header = headersList.get(i);
-				Cell cell = dataRow.createCell(i);
-
-				// 查找对应的数据项
-				for (CostSurveyTemplateItems item : itemsList) {
-					if (item.getHeadersId().equals(header.getId())) {
-						cell.setCellValue(item.getRvalue() != null ? item.getRvalue() : "");
-						break;
-					}
-				}
-			}
-		}
-
-		// 设置响应头
-		response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
-		response.setHeader("Content-Disposition", "attachment; filename=" +
-				URLEncoder.encode(currentVersion.getSurveyTemplateName() + ".xlsx", "UTF-8"));
-
-		// 写入响应输出流
-		workbook.write(response.getOutputStream());
-		workbook.close();
-	}
-
-
-	/**
-	 * 根据监管目录ID查询所有现行版本的所有成本调查表模板信息
-	 * @param catalogId 监管目录ID
-	 * @return 成本调查表模板列表
-	 * @throws Exception
-	 */
-	@GetMapping(value="/listByCatalogId")
-	@ApiOperation(value="根据监管目录ID查询所有现行版本的成本调查表模板", httpMethod = "GET", notes = "根据监管目录ID查询所有现行版本的成本调查表模板信息")
-	public CommonResult<List<CostSurveyTemplate>> listByCatalogId(
-			@ApiParam(name="catalogId", value="监管目录ID", required = true)
-			@RequestParam String catalogId) throws Exception {
-
-		// 查询指定目录下的所有启用状态的模板
-		CostSurveyTemplate queryCondition = new CostSurveyTemplate();
-		queryCondition.setCatalogId(catalogId);
-		queryCondition.setStatus("0"); // 启用状态
-
-		List<CostSurveyTemplate> templates = costSurveyTemplateDao.selectByCondition(queryCondition);
-
-
-
-		return CommonResult.<List<CostSurveyTemplate>>ok().value(templates);
-	}
-
-
-	/**
-	 * 状态切换方法
-	 * 当状态为-1(草稿)时启用为0(启用)
-	 * 当状态为0(启用)或1(停用)时可以相互切换
-	 * @param id 成本调查表模板ID
-	 * @return 操作结果
-	 * @throws Exception
-	 */
-	@ApiOperation(value = "状态切换", httpMethod = "GET", notes = "根据当前状态进行切换:草稿(-1)可启用为启用(0),启用(0)和停用(1)可相互切换")
-	@GetMapping(value = "/enable")
-	public CommonResult<String> enable(
-			@ApiParam(name = "id", value = "成本调查表模板ID", required = true)
-			@RequestParam String id) throws Exception {
-
-		CostSurveyTemplate template = baseService.get(id);
-		if (template == null) {
-			return CommonResult.<String>error().message("未找到指定的成本调查表模板");
-		}
-
-		String currentStatus = template.getStatus();
-		String newStatus = null;
-		String message = null;
-
-		// 根据当前状态决定切换到什么状态
-		if ("-1".equals(currentStatus)) {
-			// 草稿状态切换到启用状态
-			newStatus = "0";
-			message = "成本调查表模板启用成功";
-
-			// 检查是否已经有现行版本
-			CostSurveyTemplateVersion currentVersion = costSurveyTemplateVersionMapper.selectCurrentVersion(id);
-			if (currentVersion == null) {
-				return CommonResult.<String>error().message("启用失败:该模板没有现行版本");
-			}
-		} else if ("0".equals(currentStatus)) {
-			// 启用状态切换到停用状态
-			newStatus = "1";
-			message = "成本调查表模板停用成功";
-		} else if ("1".equals(currentStatus)) {
-			// 停用状态切换到启用状态
-			newStatus = "0";
-			message = "成本调查表模板启用成功";
-		} else {
-			return CommonResult.<String>error().message("不支持的状态切换操作");
-		}
-
-		// 更新状态
-		template.setStatus(newStatus);
-		template.setUpdateTime(LocalDateTime.now());
-		template.setUpdateBy(ContextUtil.getCurrentUser().getAccount());
-
-		baseService.createOrUpdate(template);
-
-		return CommonResult.<String>ok().message(message);
-	}
+            if (updateites != null && !updateites.isEmpty()) {
+                for (CostSurveyTemplateItems item : updateites) {
+                    CostVerifyTemplateItems verifyItem = new CostVerifyTemplateItems();
+                    // 复制数据项属性
+                    String itemid = UUID.randomUUID().toString();
+                    verifyItem.setId(itemid);
+                    verifyItem.setRowid(item.getRowid());
+                    verifyItem.setParentid(item.getParentid());
+                    verifyItem.setRkey(item.getRkey());
+                    verifyItem.setRvalue(item.getRvalue());
+                    verifyItem.setCellCode(item.getCellCode());
+                    verifyItem.setCalculationFormula(item.getCalculationFormula());
+                    verifyItem.setUnit(item.getUnit());
+                    verifyItem.setOrderNum(item.getOrderNum());
+                    verifyItem.setJsonStr(item.getJsonStr());
+                    verifyItem.setCreateBy(user.getAccount());
+                    verifyItem.setCreateTime(LocalDateTime.now());
+                    verifyItem.setProjectId(item.getProjectId());
+                    verifyItem.setOrderText(item.getOrderText());
+                    verifyItem.setSurveyTemplateId(ttemplateId);
+                    verifyItem.setVersionId(currentVersion.getId());
+                    verifyItem.setHeadersId(item.getHeadersId());
+
+                    // 保存成本核定数据项
+                    costVerifyTemplateItemsManager.createOrUpdate(verifyItem);
+                }
+
+            }
+        }
+
+        if (templates != null && !templates.isEmpty()) {
+            return CommonResult.<CostVerifyTemplate>ok().value(costVerifyTemplate);
+        } else {
+            return CommonResult.<CostVerifyTemplate>error().message("未找到启用状态的模板数据");
+        }
+    }
+
+    /**
+     * 生成版本号,格式为:yyyyMMdd + 4位流水号(如:202509270001)
+     *
+     * @return 生成的版本号
+     */
+    public String generateVersionNumber() {
+        // 1. 获取当前日期字符串
+        String dateStr = new java.text.SimpleDateFormat("yyyyMMdd").format(new java.util.Date());
+
+        // 2. 查询当日最大版本号
+        String maxVersion = costSurveyTemplateVersionMapper.selectMaxVersionByDate(dateStr);
+
+        int sequence = 1;
+        if (maxVersion != null && maxVersion.startsWith(dateStr)) {
+            // 3. 提取流水号部分并加1
+            String sequenceStr = maxVersion.substring(8); // 取后4位
+            sequence = Integer.parseInt(sequenceStr) + 1;
+        }
+
+        // 4. 格式化生成版本号
+        return String.format("%s%04d", dateStr, sequence);
+    }
+
 
+    /**
+     * 导出成本调查表Excel模板
+     *
+     * @param templateId 模板ID
+     * @return Excel文件
+     * @throws Exception
+     */
+    @GetMapping(value = "/exportExcelTemplate")
+    @ApiOperation(value = "导出成本调查表Excel模板", httpMethod = "GET", notes = "导出Excel模板并填充内容")
+    public void exportExcelTemplate(
+            @ApiParam(name = "templateId", value = "模板ID", required = true)
+            @RequestParam String templateId,
+            HttpServletResponse response) throws Exception {
+
+        // 获取当前启用版本
+        CostSurveyTemplateVersion currentVersion = costSurveyTemplateVersionMapper.selectCurrentVersion(templateId);
+
+        if (currentVersion == null) {
+            response.sendError(HttpServletResponse.SC_BAD_REQUEST, "未找到启用的模板版本");
+            return;
+        }
+
+        // 获取表头信息
+        List<CostSurveyTemplateHeaders> headersList = costSurveyTemplateHeadersDao.selectBySurveyTemplateIdAndVersion(templateId, currentVersion.getId());
+
+        // 获取数据项信息
+        List<CostSurveyTemplateItems> itemsList = costSurveyTemplateItemsDao.selectBySurveyTemplateIdAndVersion(templateId, currentVersion.getId());
+
+        // 创建Excel工作簿
+        Workbook workbook = new XSSFWorkbook();
+        Sheet sheet = workbook.createSheet(currentVersion.getSurveyTemplateName());
+
+        // 创建表头行
+        Row headerRow = sheet.createRow(0);
+
+        // 根据表头信息创建Excel列标题
+        for (int i = 0; i < headersList.size(); i++) {
+            CostSurveyTemplateHeaders header = headersList.get(i);
+            Cell cell = headerRow.createCell(i);
+            cell.setCellValue(header.getFieldName());
+        }
+
+        // 按照orderNum排序表头
+        headersList.sort(Comparator.comparing(CostSurveyTemplateHeaders::getOrderNum,
+                Comparator.nullsLast(Comparator.naturalOrder())));
+
+        // 填充数据行(示例数据)
+        if (!itemsList.isEmpty()) {
+            // 按orderNum排序数据项
+            itemsList.sort(Comparator.comparing(CostSurveyTemplateItems::getOrderNum,
+                    Comparator.nullsLast(Comparator.naturalOrder())));
+
+            // 创建示例行
+            Row dataRow = sheet.createRow(1);
+            for (int i = 0; i < headersList.size(); i++) {
+                CostSurveyTemplateHeaders header = headersList.get(i);
+                Cell cell = dataRow.createCell(i);
+
+                // 查找对应的数据项
+                for (CostSurveyTemplateItems item : itemsList) {
+                    if (item.getHeadersId().equals(header.getId())) {
+                        cell.setCellValue(item.getRvalue() != null ? item.getRvalue() : "");
+                        break;
+                    }
+                }
+            }
+        }
+
+        // 设置响应头
+        response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
+        response.setHeader("Content-Disposition", "attachment; filename=" +
+                URLEncoder.encode(currentVersion.getSurveyTemplateName() + ".xlsx", "UTF-8"));
+
+        // 写入响应输出流
+        workbook.write(response.getOutputStream());
+        workbook.close();
+    }
+
+
+    /**
+     * 根据监管目录ID查询所有现行版本的所有成本调查表模板信息
+     *
+     * @param catalogId 监管目录ID
+     * @return 成本调查表模板列表
+     * @throws Exception
+     */
+    @GetMapping(value = "/listByCatalogId")
+    @ApiOperation(value = "根据监管目录ID查询所有现行版本的成本调查表模板", httpMethod = "GET", notes = "根据监管目录ID查询所有现行版本的成本调查表模板信息")
+    public CommonResult<List<CostSurveyTemplate>> listByCatalogId(
+            @ApiParam(name = "catalogId", value = "监管目录ID", required = true)
+            @RequestParam String catalogId) throws Exception {
+
+        // 查询指定目录下的所有启用状态的模板
+        CostSurveyTemplate queryCondition = new CostSurveyTemplate();
+        queryCondition.setCatalogId(catalogId);
+        queryCondition.setStatus("0"); // 启用状态
+
+        List<CostSurveyTemplate> templates = costSurveyTemplateDao.selectByCondition(queryCondition);
+
+
+        return CommonResult.<List<CostSurveyTemplate>>ok().value(templates);
+    }
+
+
+    /**
+     * 状态切换方法
+     * 当状态为-1(草稿)时启用为0(启用)
+     * 当状态为0(启用)或1(停用)时可以相互切换
+     *
+     * @param id 成本调查表模板ID
+     * @return 操作结果
+     * @throws Exception
+     */
+    @ApiOperation(value = "状态切换", httpMethod = "GET", notes = "根据当前状态进行切换:草稿(-1)可启用为启用(0),启用(0)和停用(1)可相互切换")
+    @GetMapping(value = "/enable")
+    public CommonResult<String> enable(
+            @ApiParam(name = "id", value = "成本调查表模板ID", required = true)
+            @RequestParam String id) throws Exception {
+
+        CostSurveyTemplate template = baseService.get(id);
+        if (template == null) {
+            return CommonResult.<String>error().message("未找到指定的成本调查表模板");
+        }
+
+        String currentStatus = template.getStatus();
+        String newStatus = null;
+        String message = null;
+
+        // 根据当前状态决定切换到什么状态
+        if ("-1".equals(currentStatus)) {
+            // 草稿状态切换到启用状态
+            newStatus = "0";
+            message = "成本调查表模板启用成功";
+
+            // 检查是否已经有现行版本
+            CostSurveyTemplateVersion currentVersion = costSurveyTemplateVersionMapper.selectCurrentVersion(id);
+            if (currentVersion == null) {
+                return CommonResult.<String>error().message("启用失败:该模板没有现行版本");
+            }
+        } else if ("0".equals(currentStatus)) {
+            // 启用状态切换到停用状态
+            newStatus = "1";
+            message = "成本调查表模板停用成功";
+        } else if ("1".equals(currentStatus)) {
+            // 停用状态切换到启用状态
+            newStatus = "0";
+            message = "成本调查表模板启用成功";
+        } else {
+            return CommonResult.<String>error().message("不支持的状态切换操作");
+        }
+
+        // 更新状态
+        template.setStatus(newStatus);
+        template.setUpdateTime(LocalDateTime.now());
+        template.setUpdateBy(ContextUtil.getCurrentUser().getAccount());
+
+        baseService.createOrUpdate(template);
+
+        return CommonResult.<String>ok().message(message);
+    }
 
 
 }

+ 206 - 223
assistMg/src/main/java/com/hotent/surveyinfo/controller/CostVerifyTemplateHeadersController.java

@@ -28,8 +28,8 @@ import java.util.UUID;
 /**
  * 成本核定表头子表 前端控制器
  *
- * @company 山西清众科技股份有限公司
  * @author 超级管理员
+ * @company 山西清众科技股份有限公司
  * @since 2025-09-19
  */
 @RestController
@@ -37,55 +37,52 @@ import java.util.UUID;
 @Api(tags = "成本核定表头")
 @ApiGroup(group = {ApiGroupConsts.GROUP_COST})
 public class CostVerifyTemplateHeadersController extends BaseController<CostVerifyTemplateHeadersManager, CostVerifyTemplateHeaders> {
-	@Autowired
-	CostVerifyTemplateHeadersDao costSurveyTemplateHeadersDao;
-	@Autowired
-	CostVerifyTemplateManager basemanager;
-	@Autowired
-	private CostVerifyTemplateItemsManager costSurveyTemplateItemsManager;
-	@Autowired
-	CostVerifyTemplateHeadersManager costVerifyTemplateHeadersManager;
-	/**
-	 * 根据成本核定表id获取成本核定表头子表数据列表
-	 * @param surveyTemplateId
-	 * @return
-	 */
-	@ApiOperation(value="根据成本核定表id获取成本核定表头子表数据列表", httpMethod = "GET", notes = "根据成本核定表id获取成本核定表头子表数据列表")
-	@GetMapping("/getlistBySurveyTemplateId")
-	public CommonResult<List<CostVerifyTemplateHeaders>> getlistBySurveyTemplateId(
-			@RequestParam String surveyTemplateId) {
-
-		List<CostVerifyTemplateHeaders> headersList =
-				costSurveyTemplateHeadersDao.selectBySurveyTemplateId(surveyTemplateId
-						);
-
-		return CommonResult.<List<CostVerifyTemplateHeaders>>ok().value(headersList);
-	}
-
-
-	/**
-	 * 根据成本核定表id和版本号获取表头数据列表
-	 * @param surveyTemplateId 成本核定表id
-	 * @param version 版本号
-	 * @return 表头数据列表
-	 */
-	@ApiOperation(value="根据成本核定表id和版本号获取表头数据列表", httpMethod = "GET", notes = "根据成本核定表id和版本号获取表头数据列表")
-	@GetMapping("/getlistBySurveyTemplateIdAndVersion")
-	public CommonResult<List<CostVerifyTemplateHeaders>> getlistBySurveyTemplateIdAndVersion(
-			@ApiParam(name="surveyTemplateId",value="成本核定表id", required = true) @RequestParam String surveyTemplateId,
-			@ApiParam(name="version",value="版本号", required = true) @RequestParam String version) {
-
-		List<CostVerifyTemplateHeaders> headersList =
-				costSurveyTemplateHeadersDao.selectBySurveyTemplateIdAndVersion(surveyTemplateId, version);
-
-		return CommonResult.<List<CostVerifyTemplateHeaders>>ok().value(headersList);
-	}
-
-	/**
-	 * 根据成本核定表id获取现行版的表头数据列表
-	 * @param surveyTemplateId 成本核定表id
-	 * @return 表头数据列表
-	 */
+    @Autowired
+    CostVerifyTemplateHeadersDao costSurveyTemplateHeadersDao;
+    @Autowired
+    CostVerifyTemplateManager basemanager;
+    @Autowired
+    private CostVerifyTemplateItemsManager costSurveyTemplateItemsManager;
+    @Autowired
+    CostVerifyTemplateHeadersManager costVerifyTemplateHeadersManager;
+
+    /**
+     * 根据成本核定表id获取成本核定表头子表数据列表
+     *
+     * @param surveyTemplateId
+     * @return
+     */
+    @ApiOperation(value = "根据成本核定表id获取成本核定表头子表数据列表", httpMethod = "GET", notes = "根据成本核定表id获取成本核定表头子表数据列表")
+    @GetMapping("/getlistBySurveyTemplateId")
+    public CommonResult<List<CostVerifyTemplateHeaders>> getlistBySurveyTemplateId(@RequestParam String surveyTemplateId) {
+
+        List<CostVerifyTemplateHeaders> headersList = costSurveyTemplateHeadersDao.selectBySurveyTemplateId(surveyTemplateId);
+
+        return CommonResult.<List<CostVerifyTemplateHeaders>>ok().value(headersList);
+    }
+
+
+    /**
+     * 根据成本核定表id和版本号获取表头数据列表
+     *
+     * @param surveyTemplateId 成本核定表id
+     * @param version          版本号
+     * @return 表头数据列表
+     */
+    @ApiOperation(value = "根据成本核定表id和版本号获取表头数据列表", httpMethod = "GET", notes = "根据成本核定表id和版本号获取表头数据列表")
+    @GetMapping("/getlistBySurveyTemplateIdAndVersion")
+    public CommonResult<List<CostVerifyTemplateHeaders>> getlistBySurveyTemplateIdAndVersion(@ApiParam(name = "surveyTemplateId", value = "成本核定表id", required = true) @RequestParam String surveyTemplateId, @ApiParam(name = "version", value = "版本号", required = true) @RequestParam String version) {
+
+        List<CostVerifyTemplateHeaders> headersList = costSurveyTemplateHeadersDao.selectBySurveyTemplateIdAndVersion(surveyTemplateId, version);
+
+        return CommonResult.<List<CostVerifyTemplateHeaders>>ok().value(headersList);
+    }
+
+    /**
+     * 根据成本核定表id获取现行版的表头数据列表
+     * @param surveyTemplateId 成本核定表id
+     * @return 表头数据列表
+     */
 //	@ApiOperation(value="根据成本核定表id获取现行版的表头数据列表", httpMethod = "GET", notes = "根据成本核定表id和版本号获取表头数据列表")
 //	@GetMapping("/getlistBySurveyTemplateIdcurrentversion")
 //	public CommonResult<List<CostVerifyTemplateHeaders>> getlistBySurveyTemplateIdcurrentversion(
@@ -100,179 +97,165 @@ public class CostVerifyTemplateHeadersController extends BaseController<CostVeri
 //	}
 
 
-	/**
-	 * 根据id获取成本核定表头子表数据详情
-	 * @param id
-	 * @return
-	 * @throws Exception 
-	 * ModelAndView
-	 */
-	@GetMapping(value="/getDetail")
-	@ApiOperation(value="根据id获取成本核定表头子表数据详情",httpMethod = "GET",notes = "根据id获取成本核定表头子表数据详情")
-	public CommonResult<CostVerifyTemplateHeaders> getDetail(@ApiParam(name="id",value="业务对象主键", required = true)@RequestParam(required=true) String id) throws Exception{
-		return CommonResult.<CostVerifyTemplateHeaders>ok().value(baseService.getDetail(id));
-	}
     /**
-	 * 新增,更新成本核定表头子表
-	 * @param costSurveyTemplateHeaders
-	 * @throws Exception 
-	 * @return
-	 * @exception 
-	 */
-	@PostMapping(value="/save")
-	@ApiOperation(value = "新增或更新成本核定表头子表数据", httpMethod = "POST", notes = "新增或更新成本核定表头子表数据")
-	public CommonResult<String> save(@ApiParam(name="CostSurveyTemplateHeaders",value="成本核定表头子表对象", required = true)@RequestBody CostVerifyTemplateHeaders costSurveyTemplateHeaders) throws Exception{
-		String msg = StringUtil.isEmpty(costSurveyTemplateHeaders.getId()) ? "添加成本核定表头子表成功" : "更新成本核定表头子表成功";
-		baseService.createOrUpdate(costSurveyTemplateHeaders);
-
-
-		return CommonResult.<String>ok().message(msg);
-	}
-
-	/**
-	 * 批量新增或更新成本核定表头及指标项数据
-	 * 动态处理 headersId 的生成和关联
-	 * @param request 包含表头列表和指标项列表的请求对象
-	 * @return 操作结果
-	 * @throws Exception 异常信息
-	 */
-	@ApiOperation(value = "批量新增或更新成本核定表头及指标项数据", httpMethod = "POST", notes = "批量新增或更新成本核定表头及指标项数据")
-	@PostMapping(value = "/batchSaveOrUpdate")
-	public CommonResult<String> batchSaveOrUpdate(
-			@ApiParam(name = "request", value = "包含表头列表和指标项列表的请求对象", required = true)
-			@RequestBody BatchVerifyHeadersItemsRequest request) throws Exception {
-
-		String costVerifyTemplateId = request.getCostVerifyTemplateId();
-
-
-		List<CostVerifyTemplateHeaders> headersList = request.getHeadersList();
-		List<CostVerifyTemplateItems> itemsList = request.getItemsList();
-		List<CostVerifyTemplateHeaders> deleteHeadersList = request.getDeleteheadersList();
-
-		// 检查输入列表是否为空
-		if ((headersList == null || headersList.isEmpty()) &&
-				(itemsList == null || itemsList.isEmpty()) &&
-				(deleteHeadersList == null || deleteHeadersList.isEmpty())) {
-			return CommonResult.<String>error().message("批量操作失败,数据列表为空");
-		}
-		IUser user = ContextUtil.getCurrentUser();
-
-
-		// 先处理表头数据,确保所有表头都有ID
-		if (headersList != null && !headersList.isEmpty()) {
-			for (CostVerifyTemplateHeaders header : headersList) {
-				boolean isHeaderCreate = StringUtil.isEmpty(header.getId());
-				header.setFieldEname(PinyinUtil.getPinyin(header.getFieldName()));
-
-				if(StringUtil.isEmpty(header.getId()))
-				{
-
-					header.setId(UUID.randomUUID().toString());
-					header.setCreateBy(user.getAccount());
-					header.setCreateTime( LocalDateTime.now());
-					baseService.create(header);
-				}
-				else {
-					header.setUpdateBy(user.getAccount());
-					header.setUpdateTime( LocalDateTime.now());
-					baseService.update(header);
-				}
-
-
-			}
-		}
-
-		// 处理需要删除的表头
-		if (deleteHeadersList != null && !deleteHeadersList.isEmpty()) {
-			for (CostVerifyTemplateHeaders header : deleteHeadersList) {
-				if (StringUtil.isNotEmpty(header.getId())) {
-					baseService.remove(header.getId());
-
-				}
-			}
-		}
-
-
-
-		// 处理指标项数据,动态设置 headersId
-		if (itemsList != null && !itemsList.isEmpty()) {
-			if(itemsList.size()>0)
-			{
-				costSurveyTemplateItemsManager.deleteBySurveyTemplateId(costVerifyTemplateId);
-			}
-
-
-
-			for (CostVerifyTemplateItems item : itemsList) {
-				// 检查是否已设置 headersId
-				if (StringUtil.isEmpty(item.getHeadersId())) {
-					item.setHeadersId(
-							headersList.stream()
-									.filter(h -> h.getFieldName().equals(item.getRkey() ))
-									.findFirst()
-									.map(CostVerifyTemplateHeaders::getId)
-									.orElse(null)
-					);
-				}
-				item.setId(UUID.randomUUID().toString());
-				item.setCreateBy(user.getAccount());
-				item.setCreateTime( LocalDateTime.now());
-				item.setUpdateBy(user.getAccount());
-				item.setUpdateTime( LocalDateTime.now());
-				costSurveyTemplateItemsManager.create(  item);
-
-			}
-		}
-
-		return CommonResult.<String>ok().message(
-				"批量操作成功");
-	}
-
-
-
-
-
-	/**
-	 * 根据id删除成本核定表头子表数据
-	 * @param id
-	 * @return
-	 * @throws Exception
-	 */
-	@ApiOperation(value = "根据id删除成本核定表头子表数据", httpMethod = "DELETE", notes = "根据id删除成本核定表头子表数据")
-	@GetMapping(value = "/remove")
-	public CommonResult<String> remove(@ApiParam(name = "id", value = "业务对象主键", required = true) @RequestParam(required = true) String id) throws Exception {
-		baseService.remove(id);
-		return CommonResult.<String>ok().message("删除成本核定表头子表成功");
-	}
-	/**
-	 * 批量新增成本核定表头子表数据
-	 * @param costSurveyTemplateHeadersList
-	 * @return
-	 * @throws Exception
-	 */
-	@ApiOperation(value = "批量新增成本核定表头子表数据", httpMethod = "POST", notes = "批量新增成本核定表头子表数据")
-	@PostMapping(value = "/batchSave")
-	public CommonResult<String> batchSave(@ApiParam(name = "costSurveyTemplateHeadersList", value = "成本核定表头子表对象列表", required = true)
-										  @RequestBody List<CostVerifyTemplateHeaders> costSurveyTemplateHeadersList) throws Exception {
-
-		return CommonResult.<String>ok().message("批量新增成本核定表头子表数据成功");
-	}
-	/**
-	 * 根据costVerifyTemplateId删除成本核定表头子表数据
-	 * @param costVerifyTemplateId 成本核定模板ID
-	 * @return 删除结果
-	 * @throws Exception
-	 */
-	@DeleteMapping(value = "/deleteByCostVerifyTemplateId")
-	@ApiOperation(value = "根据costVerifyTemplateId删除成本核定表头子表数据", httpMethod = "DELETE", notes = "根据costVerifyTemplateId删除成本核定表头子表数据")
-	public CommonResult<String> deleteByCostVerifyTemplateId(
-			@ApiParam(name = "costVerifyTemplateId", value = "成本核定模板ID", required = true)
-			@RequestParam(required = true) String costVerifyTemplateId) throws Exception {
-
-		// 调用service层方法删除数据
-		costSurveyTemplateHeadersDao.deleteByCostVerifyTemplateId(costVerifyTemplateId);
-
-		return CommonResult.<String>ok().message("删除成功");
-	}
+     * 根据id获取成本核定表头子表数据详情
+     *
+     * @param id
+     * @return
+     * @throws Exception ModelAndView
+     */
+    @GetMapping(value = "/getDetail")
+    @ApiOperation(value = "根据id获取成本核定表头子表数据详情", httpMethod = "GET", notes = "根据id获取成本核定表头子表数据详情")
+    public CommonResult<CostVerifyTemplateHeaders> getDetail(@ApiParam(name = "id", value = "业务对象主键", required = true) @RequestParam(required = true) String id) throws Exception {
+        return CommonResult.<CostVerifyTemplateHeaders>ok().value(baseService.getDetail(id));
+    }
+
+    /**
+     * 新增,更新成本核定表头子表
+     *
+     * @param costSurveyTemplateHeaders
+     * @return
+     * @throws Exception
+     * @throws
+     */
+    @PostMapping(value = "/save")
+    @ApiOperation(value = "新增或更新成本核定表头子表数据", httpMethod = "POST", notes = "新增或更新成本核定表头子表数据")
+    public CommonResult<String> save(@ApiParam(name = "CostSurveyTemplateHeaders", value = "成本核定表头子表对象", required = true) @RequestBody CostVerifyTemplateHeaders costSurveyTemplateHeaders) throws Exception {
+        String msg = StringUtil.isEmpty(costSurveyTemplateHeaders.getId()) ? "添加成本核定表头子表成功" : "更新成本核定表头子表成功";
+        baseService.createOrUpdate(costSurveyTemplateHeaders);
+
+
+        return CommonResult.<String>ok().message(msg);
+    }
+
+    /**
+     * 批量新增或更新成本核定表头及指标项数据
+     * 动态处理 headersId 的生成和关联
+     *
+     * @param request 包含表头列表和指标项列表的请求对象
+     * @return 操作结果
+     * @throws Exception 异常信息
+     */
+    @ApiOperation(value = "批量新增或更新成本核定表头及指标项数据", httpMethod = "POST", notes = "批量新增或更新成本核定表头及指标项数据")
+    @PostMapping(value = "/batchSaveOrUpdate")
+    public CommonResult<String> batchSaveOrUpdate(@ApiParam(name = "request", value = "包含表头列表和指标项列表的请求对象", required = true) @RequestBody BatchVerifyHeadersItemsRequest request) throws Exception {
+
+        String costVerifyTemplateId = request.getCostVerifyTemplateId();
+
+
+        List<CostVerifyTemplateHeaders> headersList = request.getHeadersList();
+        List<CostVerifyTemplateItems> itemsList = request.getItemsList();
+        List<CostVerifyTemplateHeaders> deleteHeadersList = request.getDeleteheadersList();
+
+        // 检查输入列表是否为空
+        if ((headersList == null || headersList.isEmpty()) && (itemsList == null || itemsList.isEmpty()) && (deleteHeadersList == null || deleteHeadersList.isEmpty())) {
+            return CommonResult.<String>error().message("批量操作失败,数据列表为空");
+        }
+        IUser user = ContextUtil.getCurrentUser();
+
+
+        // 先处理表头数据,确保所有表头都有ID
+        if (headersList != null && !headersList.isEmpty()) {
+            for (CostVerifyTemplateHeaders header : headersList) {
+                boolean isHeaderCreate = StringUtil.isEmpty(header.getId());
+                header.setFieldEname(PinyinUtil.getPinyin(header.getFieldName()));
+
+                if (StringUtil.isEmpty(header.getId())) {
+
+                    header.setId(UUID.randomUUID().toString());
+                    header.setCreateBy(user.getAccount());
+                    header.setCreateTime(LocalDateTime.now());
+                    baseService.create(header);
+                } else {
+                    header.setUpdateBy(user.getAccount());
+                    header.setUpdateTime(LocalDateTime.now());
+                    baseService.update(header);
+                }
+
+
+            }
+        }
+
+        // 处理需要删除的表头
+        if (deleteHeadersList != null && !deleteHeadersList.isEmpty()) {
+            for (CostVerifyTemplateHeaders header : deleteHeadersList) {
+                if (StringUtil.isNotEmpty(header.getId())) {
+                    baseService.remove(header.getId());
+
+                }
+            }
+        }
+
+
+        // 处理指标项数据,动态设置 headersId
+        if (itemsList != null && !itemsList.isEmpty()) {
+            if (itemsList.size() > 0) {
+                costSurveyTemplateItemsManager.deleteBySurveyTemplateId(costVerifyTemplateId);
+            }
+
+
+            for (CostVerifyTemplateItems item : itemsList) {
+                // 检查是否已设置 headersId
+                if (StringUtil.isEmpty(item.getHeadersId())) {
+                    item.setHeadersId(headersList.stream().filter(h -> h.getFieldName().equals(item.getRkey())).findFirst().map(CostVerifyTemplateHeaders::getId).orElse(null));
+                }
+                item.setId(UUID.randomUUID().toString());
+                item.setCreateBy(user.getAccount());
+                item.setCreateTime(LocalDateTime.now());
+                item.setUpdateBy(user.getAccount());
+                item.setUpdateTime(LocalDateTime.now());
+                costSurveyTemplateItemsManager.create(item);
+
+            }
+        }
+
+        return CommonResult.<String>ok().message("批量操作成功");
+    }
+
+
+    /**
+     * 根据id删除成本核定表头子表数据
+     *
+     * @param id
+     * @return
+     * @throws Exception
+     */
+    @ApiOperation(value = "根据id删除成本核定表头子表数据", httpMethod = "DELETE", notes = "根据id删除成本核定表头子表数据")
+    @GetMapping(value = "/remove")
+    public CommonResult<String> remove(@ApiParam(name = "id", value = "业务对象主键", required = true) @RequestParam(required = true) String id) throws Exception {
+        baseService.remove(id);
+        return CommonResult.<String>ok().message("删除成本核定表头子表成功");
+    }
+
+    /**
+     * 批量新增成本核定表头子表数据
+     *
+     * @param costSurveyTemplateHeadersList
+     * @return
+     * @throws Exception
+     */
+    @ApiOperation(value = "批量新增成本核定表头子表数据", httpMethod = "POST", notes = "批量新增成本核定表头子表数据")
+    @PostMapping(value = "/batchSave")
+    public CommonResult<String> batchSave(@ApiParam(name = "costSurveyTemplateHeadersList", value = "成本核定表头子表对象列表", required = true) @RequestBody List<CostVerifyTemplateHeaders> costSurveyTemplateHeadersList) throws Exception {
+
+        return CommonResult.<String>ok().message("批量新增成本核定表头子表数据成功");
+    }
+
+    /**
+     * 根据costVerifyTemplateId删除成本核定表头子表数据
+     *
+     * @param costVerifyTemplateId 成本核定模板ID
+     * @return 删除结果
+     * @throws Exception
+     */
+    @DeleteMapping(value = "/deleteByCostVerifyTemplateId")
+    @ApiOperation(value = "根据costVerifyTemplateId删除成本核定表头子表数据", httpMethod = "DELETE", notes = "根据costVerifyTemplateId删除成本核定表头子表数据")
+    public CommonResult<String> deleteByCostVerifyTemplateId(@ApiParam(name = "costVerifyTemplateId", value = "成本核定模板ID", required = true) @RequestParam(required = true) String costVerifyTemplateId) throws Exception {
+
+        // 调用service层方法删除数据
+        costSurveyTemplateHeadersDao.deleteByCostVerifyTemplateId(costVerifyTemplateId);
+
+        return CommonResult.<String>ok().message("删除成功");
+    }
 
 }

+ 3 - 0
assistMg/src/main/java/com/hotent/surveyinfo/controller/CostVerifyTemplateItemsController.java

@@ -99,6 +99,9 @@ public class CostVerifyTemplateItemsController extends BaseController<CostVerify
 			) throws Exception {
 
 		List<CostVerifyTemplateItems> items = costSurveyTemplateItemsDao.selectByVerifyTemplateId(surveyTemplateId,taskId);
+		if (!items.isEmpty() && StringUtil.isEmpty(surveyTemplateId)){
+			surveyTemplateId=items.get(0).getSurveyTemplateId();
+		}
 		List<CostVerifyTemplateHeaders> heardlist = costSurveyTemplateheadManager.listVisibleBySurveyTemplateId(surveyTemplateId);
 		String filename = heardlist.stream().map(CostVerifyTemplateHeaders::getFieldName).collect(Collectors.joining(","));
 		String fileids = heardlist.stream().map(CostVerifyTemplateHeaders::getId).collect(Collectors.joining(","));

+ 1 - 3
assistMg/src/main/java/com/hotent/surveyinfo/manager/impl/CostVerifyTemplateHeadersManagerImpl.java

@@ -56,9 +56,7 @@ public class CostVerifyTemplateHeadersManagerImpl extends BaseManagerImpl<CostVe
 	@Override
 	public List<CostVerifyTemplateHeaders> listVisibleBySurveyTemplateId(String surveyTemplateId) {
 		QueryWrapper<CostVerifyTemplateHeaders> wrapper = new QueryWrapper<>();
-		wrapper.eq("survey_template_id", surveyTemplateId)
-
-				.eq("showVisible", "1");
+		wrapper.eq("survey_template_id", surveyTemplateId);
 		return this.list(wrapper);
 	}
 }

+ 12 - 12
assistMg/src/main/java/com/hotent/surveyinfo/model/dto/BatchVerifyHeadersItemsRequest.java

@@ -16,20 +16,20 @@ public class BatchVerifyHeadersItemsRequest {
     //删除的表头
     private List<CostVerifyTemplateHeaders> deleteheadersList;
 
-    public List<CostVerifyTemplateHeaders> getHeadersList() {
-        return headersList;
+    public String getCostVerifyTemplateId() {
+        return costVerifyTemplateId;
     }
 
-    public void setHeadersList(List<CostVerifyTemplateHeaders> headersList) {
-        this.headersList = headersList;
+    public void setCostVerifyTemplateId(String costVerifyTemplateId) {
+        this.costVerifyTemplateId = costVerifyTemplateId;
     }
 
-    public List<CostVerifyTemplateHeaders> getDeleteheadersList() {
-        return deleteheadersList;
+    public List<CostVerifyTemplateHeaders> getHeadersList() {
+        return headersList;
     }
 
-    public void setDeleteheadersList(List<CostVerifyTemplateHeaders> deleteheadersList) {
-        this.deleteheadersList = deleteheadersList;
+    public void setHeadersList(List<CostVerifyTemplateHeaders> headersList) {
+        this.headersList = headersList;
     }
 
     public List<CostVerifyTemplateItems> getItemsList() {
@@ -40,11 +40,11 @@ public class BatchVerifyHeadersItemsRequest {
         this.itemsList = itemsList;
     }
 
-    public String getCostVerifyTemplateId() {
-        return costVerifyTemplateId;
+    public List<CostVerifyTemplateHeaders> getDeleteheadersList() {
+        return deleteheadersList;
     }
 
-    public void setCostVerifyTemplateId(String costVerifyTemplateId) {
-        costVerifyTemplateId = costVerifyTemplateId;
+    public void setDeleteheadersList(List<CostVerifyTemplateHeaders> deleteheadersList) {
+        this.deleteheadersList = deleteheadersList;
     }
 }

Některé soubory nejsou zobrazeny, neboť je v těchto rozdílových datech změněno mnoho souborů