|
|
@@ -76,6 +76,15 @@ public class CostVerifyTemplateController extends BaseController<CostVerifyTempl
|
|
|
@Autowired
|
|
|
private UserManager userService;
|
|
|
|
|
|
+ @Autowired
|
|
|
+ private com.hotent.project.dao.CostProjectTaskDao costProjectTaskDao;
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private com.hotent.surveyinfo.dao.CostSurveyTemplateUploadDao costSurveyTemplateUploadDao;
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private com.hotent.enterpriseDeclare.dao.CostSurveyTemplateUploadDataDao costSurveyTemplateUploadDataDao;
|
|
|
+
|
|
|
|
|
|
// 创建通用服务实例
|
|
|
private final CrudService crudService = new CrudService();
|
|
|
@@ -173,28 +182,72 @@ public class CostVerifyTemplateController extends BaseController<CostVerifyTempl
|
|
|
template.setAreaCode(currentUser.getCountyCode());
|
|
|
}
|
|
|
|
|
|
+ // 修复:设置 taskId,将新生成的模板绑定到任务(与调查表生成方式保持一致)
|
|
|
+ template.setTaskId(taskId);
|
|
|
+
|
|
|
//新增修改后的模板数据
|
|
|
costSurveyTemplateDao.insert(template);
|
|
|
|
|
|
// 查询源模板的数据项和表头
|
|
|
- List<CostVerifyTemplateItems> itemsList = costVerifyTemplateItemsDao.selectByVerifyTemplateId(templateId,taskId);
|
|
|
+ // 修复:查询源模板数据时不使用 taskId 过滤,确保能查询到历史核定模板的所有项目数据
|
|
|
+ List<CostVerifyTemplateItems> itemsList = costVerifyTemplateItemsDao.selectByVerifyTemplateId(templateId, null);
|
|
|
List<CostVerifyTemplateHeaders> headersList = costVerifyTemplateHeadersDao.selectBySurveyTemplateId(templateId);
|
|
|
|
|
|
- // 关键修复:如果在任务中(有 taskId),过滤掉审计期间字段,避免重复生成
|
|
|
+ // 关键修复:如果在任务中(有 taskId),过滤掉审计期间字段,然后根据任务的审计期间重新生成
|
|
|
if (taskId != null && headersList != null && !headersList.isEmpty()) {
|
|
|
+ System.out.println("========== 开始过滤年限字段 ==========");
|
|
|
+ System.out.println("原始 headersList 数量: " + headersList.size());
|
|
|
+ System.out.println("原始 itemsList 数量: " + (itemsList != null ? itemsList.size() : 0));
|
|
|
+
|
|
|
+ // 1. 先过滤掉源模板的年限字段headers
|
|
|
+ int originalHeadersCount = headersList.size();
|
|
|
headersList = headersList.stream()
|
|
|
.filter(header -> {
|
|
|
String fieldName = header.getFieldName();
|
|
|
if (fieldName == null) {
|
|
|
return true; // 保留字段名为空的
|
|
|
}
|
|
|
- // 过滤掉包含审计期间关键词的字段(前端会根据任务的审计期间重新生成)
|
|
|
- return !fieldName.contains("年账面值")
|
|
|
+ // 过滤掉包含审计期间关键词的字段
|
|
|
+ boolean keep = !fieldName.contains("年账面值")
|
|
|
&& !fieldName.contains("年调整值")
|
|
|
&& !fieldName.contains("年审核调整值")
|
|
|
&& !fieldName.contains("年核定值");
|
|
|
+ if (!keep) {
|
|
|
+ System.out.println("过滤掉年限字段 header: fieldName=" + fieldName);
|
|
|
+ }
|
|
|
+ return keep;
|
|
|
})
|
|
|
.collect(Collectors.toList());
|
|
|
+ System.out.println("headers 过滤结果: 原始=" + originalHeadersCount + ", 保留=" + headersList.size());
|
|
|
+
|
|
|
+ // 2. 直接根据item的rkey字段过滤items(简单直接)
|
|
|
+ if (itemsList != null && !itemsList.isEmpty()) {
|
|
|
+ int originalItemsCount = itemsList.size();
|
|
|
+ itemsList = itemsList.stream()
|
|
|
+ .filter(item -> {
|
|
|
+ String rkey = item.getRkey();
|
|
|
+ if (rkey == null) {
|
|
|
+ return true; // 保留rkey为空的
|
|
|
+ }
|
|
|
+ // 过滤掉包含年限关键词的items
|
|
|
+ return !rkey.contains("年账面值")
|
|
|
+ && !rkey.contains("年调整值")
|
|
|
+ && !rkey.contains("年审核调整值")
|
|
|
+ && !rkey.contains("年核定值");
|
|
|
+ })
|
|
|
+ .collect(Collectors.toList());
|
|
|
+ System.out.println("items 过滤结果: 原始=" + originalItemsCount + ", 保留=" + itemsList.size());
|
|
|
+ }
|
|
|
+
|
|
|
+ // 3. 根据任务的审计期间生成新的年限字段
|
|
|
+ List<CostVerifyTemplateHeaders> auditPeriodHeaders = generateAuditPeriodHeaders(taskId, tid, headersList);
|
|
|
+ if (auditPeriodHeaders != null && !auditPeriodHeaders.isEmpty()) {
|
|
|
+ headersList.addAll(auditPeriodHeaders);
|
|
|
+ System.out.println("新生成的年限字段数量: " + auditPeriodHeaders.size());
|
|
|
+ }
|
|
|
+ System.out.println("最终 headersList 数量: " + headersList.size());
|
|
|
+ System.out.println("最终 itemsList 数量: " + (itemsList != null ? itemsList.size() : 0));
|
|
|
+ System.out.println("========== 过滤年限字段完成 ==========");
|
|
|
}
|
|
|
|
|
|
// 创建旧ID到新ID的映射表(关键修复:使用Map保存映射关系)
|
|
|
@@ -223,49 +276,147 @@ public class CostVerifyTemplateController extends BaseController<CostVerifyTempl
|
|
|
|
|
|
// 将itemsList数据依次写入 CostVerifyTemplateItems 表中
|
|
|
if (itemsList != null && !itemsList.isEmpty()) {
|
|
|
- List<CostVerifyTemplateItems> updateitemsList = new ArrayList<>();
|
|
|
-
|
|
|
for (CostVerifyTemplateItems items : itemsList) {
|
|
|
// 获取旧的 headersId
|
|
|
String oldHeadersId = items.getHeadersId();
|
|
|
|
|
|
- // 跳过 headersId 为 null 的情况
|
|
|
- if (oldHeadersId == null) {
|
|
|
- System.err.println("警告:item (rowid=" + items.getRowid() + ") 的 headersId 为 null,跳过该 item");
|
|
|
- continue;
|
|
|
- }
|
|
|
-
|
|
|
- // 关键修复:通过Map查找新的 headersId
|
|
|
+ // 通过Map查找新的 headersId
|
|
|
String newHeadersId = headerIdMap.get(oldHeadersId);
|
|
|
|
|
|
- // 如果找不到映射,记录警告并跳过该 item
|
|
|
- if (newHeadersId == null) {
|
|
|
- System.err.println("警告:item (rowid=" + items.getRowid() +
|
|
|
- ") 的 headersId=" + oldHeadersId + " 在 headersList 中不存在,跳过该 item");
|
|
|
- continue;
|
|
|
- }
|
|
|
-
|
|
|
// 设置新的 headersId
|
|
|
items.setHeadersId(newHeadersId);
|
|
|
- updateitemsList.add(items);
|
|
|
- }
|
|
|
|
|
|
- // 批量保存数据项
|
|
|
- if (!updateitemsList.isEmpty()) {
|
|
|
- for (CostVerifyTemplateItems items : updateitemsList) {
|
|
|
- String itemId = UUID.randomUUID().toString();
|
|
|
- items.setId(itemId);
|
|
|
- items.setSurveyTemplateId(tid);
|
|
|
- items.setCreateBy(ContextUtil.getCurrentUser().getAccount());
|
|
|
- items.setCreateTime( LocalDateTime.now());
|
|
|
- costVerifyTemplateItemsDao.insert(items);
|
|
|
- }
|
|
|
+ // 保存数据项
|
|
|
+ String itemId = UUID.randomUUID().toString();
|
|
|
+ items.setId(itemId);
|
|
|
+ items.setSurveyTemplateId(tid);
|
|
|
+ items.setCreateBy(ContextUtil.getCurrentUser().getAccount());
|
|
|
+ items.setCreateTime(LocalDateTime.now());
|
|
|
+ costVerifyTemplateItemsDao.insert(items);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
return CommonResult.<CostVerifyTemplate>ok().value(template);
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * 根据任务的审计期间生成年限字段
|
|
|
+ * @param taskId 任务ID
|
|
|
+ * @param surveyTemplateId 模板ID
|
|
|
+ * @param existingHeaders 已有的表头列表(用于获取基础信息和计算orderNum)
|
|
|
+ * @return 生成的年限字段列表
|
|
|
+ */
|
|
|
+ private List<CostVerifyTemplateHeaders> generateAuditPeriodHeaders(String taskId, String surveyTemplateId, List<CostVerifyTemplateHeaders> existingHeaders) {
|
|
|
+ List<CostVerifyTemplateHeaders> auditPeriodHeaders = new ArrayList<>();
|
|
|
+
|
|
|
+ try {
|
|
|
+ // 1. 根据taskId查询任务信息,获取审计期间
|
|
|
+ com.hotent.project.model.CostProjectTask task = costProjectTaskDao.selectById(taskId);
|
|
|
+ if (task == null || task.getAuditPeriod() == null || task.getAuditPeriod().isEmpty()) {
|
|
|
+ System.out.println("任务 " + taskId + " 没有审计期间信息,跳过生成年限字段");
|
|
|
+ return auditPeriodHeaders;
|
|
|
+ }
|
|
|
+
|
|
|
+ String auditPeriod = task.getAuditPeriod(); // 如 "2022,2023,2024"
|
|
|
+ String[] years = auditPeriod.split(",");
|
|
|
+
|
|
|
+ // 2. 获取基础信息(从已有表头中获取)
|
|
|
+ if (existingHeaders == null || existingHeaders.isEmpty()) {
|
|
|
+ System.out.println("没有已有表头,无法生成年限字段");
|
|
|
+ return auditPeriodHeaders;
|
|
|
+ }
|
|
|
+
|
|
|
+ CostVerifyTemplateHeaders baseHeader = existingHeaders.get(0);
|
|
|
+ String tabtype = baseHeader.getTabtype();
|
|
|
+ String versionId = baseHeader.getVersionId();
|
|
|
+
|
|
|
+ // 3. 计算起始orderNum(orderNum是String类型,需要转换)
|
|
|
+ int maxOrderNum = existingHeaders.stream()
|
|
|
+ .mapToInt(h -> {
|
|
|
+ if (h.getOrderNum() == null) return 0;
|
|
|
+ try {
|
|
|
+ return Integer.parseInt(h.getOrderNum());
|
|
|
+ } catch (NumberFormatException e) {
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+ })
|
|
|
+ .max()
|
|
|
+ .orElse(0);
|
|
|
+
|
|
|
+ int currentOrderNum = maxOrderNum + 1;
|
|
|
+
|
|
|
+ // 4. 为每个年份生成3个字段:账面值、审核调整值、核定值
|
|
|
+ for (String year : years) {
|
|
|
+ year = year.trim();
|
|
|
+
|
|
|
+ // 4.1 账面值字段
|
|
|
+ CostVerifyTemplateHeaders bookValueHeader = new CostVerifyTemplateHeaders();
|
|
|
+ bookValueHeader.setId(UUID.randomUUID().toString());
|
|
|
+ bookValueHeader.setSurveyTemplateId(surveyTemplateId);
|
|
|
+ bookValueHeader.setVersionId(versionId);
|
|
|
+ bookValueHeader.setTabtype(tabtype);
|
|
|
+ bookValueHeader.setFieldEname("year" + year + "BookValue");
|
|
|
+ bookValueHeader.setFieldName(year + "年账面值");
|
|
|
+ bookValueHeader.setFieldType("double");
|
|
|
+ bookValueHeader.setFieldTypelen(255); // Integer 类型
|
|
|
+ bookValueHeader.setFieldTypenointlen(5); // Integer 类型
|
|
|
+ bookValueHeader.setIsRequired("true");
|
|
|
+ bookValueHeader.setShowVisible("1");
|
|
|
+ bookValueHeader.setIsDict("false");
|
|
|
+ bookValueHeader.setOrderNum(String.valueOf(currentOrderNum++)); // String 类型
|
|
|
+ bookValueHeader.setCreateBy(ContextUtil.getCurrentUser().getAccount());
|
|
|
+ bookValueHeader.setCreateTime(LocalDateTime.now());
|
|
|
+ auditPeriodHeaders.add(bookValueHeader);
|
|
|
+
|
|
|
+ // 4.2 审核调整值字段
|
|
|
+ CostVerifyTemplateHeaders auditHeader = new CostVerifyTemplateHeaders();
|
|
|
+ auditHeader.setId(UUID.randomUUID().toString());
|
|
|
+ auditHeader.setSurveyTemplateId(surveyTemplateId);
|
|
|
+ auditHeader.setVersionId(versionId);
|
|
|
+ auditHeader.setTabtype(tabtype);
|
|
|
+ auditHeader.setFieldEname("year" + year + "Audit");
|
|
|
+ auditHeader.setFieldName(year + "年审核调整值");
|
|
|
+ auditHeader.setFieldType("double");
|
|
|
+ auditHeader.setFieldTypelen(9); // Integer 类型
|
|
|
+ auditHeader.setFieldTypenointlen(5); // Integer 类型
|
|
|
+ auditHeader.setIsRequired("true");
|
|
|
+ auditHeader.setShowVisible("1");
|
|
|
+ auditHeader.setIsDict("false");
|
|
|
+ auditHeader.setOrderNum(String.valueOf(currentOrderNum++)); // String 类型
|
|
|
+ auditHeader.setCreateBy(ContextUtil.getCurrentUser().getAccount());
|
|
|
+ auditHeader.setCreateTime(LocalDateTime.now());
|
|
|
+ auditPeriodHeaders.add(auditHeader);
|
|
|
+
|
|
|
+ // 4.3 核定值字段
|
|
|
+ CostVerifyTemplateHeaders approvedHeader = new CostVerifyTemplateHeaders();
|
|
|
+ approvedHeader.setId(UUID.randomUUID().toString());
|
|
|
+ approvedHeader.setSurveyTemplateId(surveyTemplateId);
|
|
|
+ approvedHeader.setVersionId(versionId);
|
|
|
+ approvedHeader.setTabtype(tabtype);
|
|
|
+ approvedHeader.setFieldEname("year" + year + "ApprovedValue");
|
|
|
+ approvedHeader.setFieldName(year + "年核定值");
|
|
|
+ approvedHeader.setFieldType("double");
|
|
|
+ approvedHeader.setFieldTypelen(255); // Integer 类型
|
|
|
+ approvedHeader.setFieldTypenointlen(5); // Integer 类型
|
|
|
+ approvedHeader.setIsRequired("true");
|
|
|
+ approvedHeader.setShowVisible("1");
|
|
|
+ approvedHeader.setIsDict("false");
|
|
|
+ approvedHeader.setOrderNum(String.valueOf(currentOrderNum++)); // String 类型
|
|
|
+ approvedHeader.setCreateBy(ContextUtil.getCurrentUser().getAccount());
|
|
|
+ approvedHeader.setCreateTime(LocalDateTime.now());
|
|
|
+ auditPeriodHeaders.add(approvedHeader);
|
|
|
+ }
|
|
|
+
|
|
|
+ System.out.println("成功生成 " + auditPeriodHeaders.size() + " 个年限字段");
|
|
|
+
|
|
|
+ } catch (Exception e) {
|
|
|
+ System.err.println("生成年限字段失败: " + e.getMessage());
|
|
|
+ e.printStackTrace();
|
|
|
+ }
|
|
|
+
|
|
|
+ return auditPeriodHeaders;
|
|
|
+ }
|
|
|
+
|
|
|
|
|
|
|
|
|
/**
|
|
|
@@ -295,6 +446,33 @@ public class CostVerifyTemplateController extends BaseController<CostVerifyTempl
|
|
|
new QueryWrapper<CostVerifyTemplate>().eq("task_id", id).orderByDesc("create_time").last("limit 1")
|
|
|
));
|
|
|
}
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 清空核定表数据(保留模板结构)
|
|
|
+ * @param surveyTemplateId 模板ID
|
|
|
+ * @param taskId 任务ID
|
|
|
+ * @return
|
|
|
+ * @throws Exception
|
|
|
+ */
|
|
|
+ @PostMapping(value="/clearData")
|
|
|
+ @ApiOperation(value="清空核定表数据", httpMethod = "POST", notes = "清空核定表数据,保留模板结构")
|
|
|
+ public CommonResult<String> clearData(
|
|
|
+ @ApiParam(name="surveyTemplateId", value="模板ID", required = true)
|
|
|
+ @RequestParam String surveyTemplateId,
|
|
|
+ @ApiParam(name="taskId", value="任务ID", required = true)
|
|
|
+ @RequestParam String taskId) throws Exception {
|
|
|
+
|
|
|
+ QueryWrapper<com.hotent.enterpriseDeclare.model.CostSurveyTemplateUploadData> dataQuery =
|
|
|
+ new QueryWrapper<>();
|
|
|
+ dataQuery.eq("task_id", taskId)
|
|
|
+ .eq("type", "3");
|
|
|
+ costSurveyTemplateUploadDataDao.delete(dataQuery);
|
|
|
+
|
|
|
+ System.out.println("成功清空模板 " + surveyTemplateId + " 在任务 " + taskId + " 下的数据");
|
|
|
+ return CommonResult.<String>ok().message("数据已清空");
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
/**
|
|
|
* 新增,更新成本核定表模板表
|
|
|
* @param costSurveyTemplate
|