zzw 2 тижнів тому
батько
коміт
01ed08d6e4

+ 75 - 31
assistMg/src/main/java/com/hotent/project/manager/impl/CostProjectTaskManagerImpl.java

@@ -968,47 +968,91 @@ public class CostProjectTaskManagerImpl extends BaseManagerImpl<CostProjectTaskD
                 child.setCurrentNode(prevNodeStatus);
                 costProjectTaskManager.updateById(child);
 
-                // 如果退回到意见告知节点,通知企业(审核方告知意见给企业)
-                if ("yjgz".equals(prevNodeStatus) && StringUtil.isNotEmpty(child.getAuditedUnitId())) {
+                // 为所有受影响的子任务发送通知
+                if (StringUtil.isNotEmpty(child.getAuditedUnitId())) {
                     AuditedUnit auditedUnit = auditedUnitManager.getOne(
                             new LambdaQueryWrapper<AuditedUnit>()
                                     .eq(AuditedUnit::getUnitId, child.getAuditedUnitId())
                                     .eq(AuditedUnit::getIsDeleted, "0")
                     );
                     if (auditedUnit != null && StringUtil.isNotEmpty(auditedUnit.getAccount())) {
-                        String noticeTitle = "【意见告知】进入意见告知环节";
-                        String noticeContent = "【意见告知】您的项目已进入意见告知环节,请及时查看。(" + child.getProjectName() + ")";
-                        String enterpriseId =  task.getAuditedUnitId();
+                        String prevNodeName = NodeConstant.getNodeValueByKey(prevNodeStatus);
+                        String noticeTitle = "";
+                        String noticeContent = "";
                         String orgId = getCurrentUserMainOrgId();
                         Org org = orgManager.getById(orgId);
                         String noticeSource = (org != null ? org.getName() : "系统") + " " + AuthenticationUtil.getCurrentUserFullname();
-                        costNoticeManager.sendNotice(
-                                child.getProjectId(),
-                                child.getId(),
-                                "1",
-                                noticeTitle,
-                                noticeContent,
-                                child.getAuditedUnitId(),
-                                noticeSource,
-                                auditedUnit.getAccount()
-                        );
-                    }
-                }
 
-                // 如果退回到意见反馈节点,通知企业(企业需要反馈意见)
-                if ("yjfk".equals(prevNodeStatus) && StringUtil.isNotEmpty(child.getAuditedUnitId())) {
-                    AuditedUnit auditedUnit = auditedUnitManager.getOne(
-                            new LambdaQueryWrapper<AuditedUnit>()
-                                    .eq(AuditedUnit::getUnitId, child.getAuditedUnitId())
-                                    .eq(AuditedUnit::getIsDeleted, "0")
-                    );
-                    if (auditedUnit != null && StringUtil.isNotEmpty(auditedUnit.getAccount())) {
-                        String noticeTitle = "【意见反馈】进入意见反馈环节";
-                        String noticeContent = "【意见反馈】您的项目已进入意见反馈环节,请及时查看。(" + child.getProjectName() + ")";
-                        String enterpriseId =  task.getAuditedUnitId();
-                        String orgId = getCurrentUserMainOrgId();
-                        Org org = orgManager.getById(orgId);
-                        String noticeSource = (org != null ? org.getName() : "系统") + " " + AuthenticationUtil.getCurrentUserFullname();
+                        // 根据不同节点设置不同的通知内容
+                        switch (prevNodeStatus) {
+                            case "tjcl":
+                                // 提交资料:企业需要重新提交
+                                noticeTitle = "【" + prevNodeName + "】任务已退回至提交资料环节";
+                                noticeContent = "【" + prevNodeName + "】您的项目已退回至提交资料环节,请重新提交资料";
+                                if (StringUtil.isNotEmpty(req.getContent())) {
+                                    noticeContent += ",原因:" + req.getContent();
+                                }
+                                noticeContent += "。(" + child.getProjectName() + ")";
+                                break;
+                            case "clcs":
+                                // 资料初审:企业需要关注审核进度
+                                noticeTitle = "【" + prevNodeName + "】任务已退回至资料初审环节";
+                                noticeContent = "【" + prevNodeName + "】您的项目已退回至资料初审环节,请关注审核进度";
+                                if (StringUtil.isNotEmpty(req.getContent())) {
+                                    noticeContent += ",原因:" + req.getContent();
+                                }
+                                noticeContent += "。(" + child.getProjectName() + ")";
+                                break;
+                            case "sdsh":
+                                // 实地审核:企业需要配合审核工作
+                                noticeTitle = "【" + prevNodeName + "】任务已退回至实地审核环节";
+                                noticeContent = "【" + prevNodeName + "】您的项目已退回至实地审核环节,请配合实地审核工作";
+                                if (StringUtil.isNotEmpty(req.getContent())) {
+                                    noticeContent += ",原因:" + req.getContent();
+                                }
+                                noticeContent += "。(" + child.getProjectName() + ")";
+                                break;
+                            case "yjgz":
+                                // 意见告知:审核方告知意见给企业
+                                noticeTitle = "【" + prevNodeName + "】任务已退回至意见告知环节";
+                                noticeContent = "【" + prevNodeName + "】您的项目已退回至意见告知环节,请及时查看";
+                                if (StringUtil.isNotEmpty(req.getContent())) {
+                                    noticeContent += ",原因:" + req.getContent();
+                                }
+                                noticeContent += "。(" + child.getProjectName() + ")";
+                                break;
+                            case "yjfk":
+                                // 意见反馈:企业需要反馈意见
+                                noticeTitle = "【" + prevNodeName + "】任务已退回至意见反馈环节";
+                                noticeContent = "【" + prevNodeName + "】您的项目已退回至意见反馈环节,请及时反馈意见";
+                                if (StringUtil.isNotEmpty(req.getContent())) {
+                                    noticeContent += ",原因:" + req.getContent();
+                                }
+                                noticeContent += "。(" + child.getProjectName() + ")";
+                                break;
+                            case "jtsy":
+                            case "cjbg":
+                            case "gd":
+                                // 集体审议、出具报告、归档:企业需要关注任务进度
+                                noticeTitle = "【" + prevNodeName + "】任务已退回至" + prevNodeName + "环节";
+                                noticeContent = "【" + prevNodeName + "】您的项目已退回至" + prevNodeName + "环节,请关注任务进度";
+                                if (StringUtil.isNotEmpty(req.getContent())) {
+                                    noticeContent += ",原因:" + req.getContent();
+                                }
+                                noticeContent += "。(" + child.getProjectName() + ")";
+                                break;
+                            default:
+                                // 其他节点:通用通知
+                                noticeTitle = "【" + prevNodeName + "】任务已退回";
+                                noticeContent = "【" + prevNodeName + "】您的项目已退回至" + prevNodeName + "环节";
+                                if (StringUtil.isNotEmpty(req.getContent())) {
+                                    noticeContent += ",原因:" + req.getContent();
+                                }
+                                noticeContent += "。(" + child.getProjectName() + ")";
+                                break;
+                        }
+
+                        // 发送通知给企业账号
                         costNoticeManager.sendNotice(
                                 child.getProjectId(),
                                 child.getId(),

+ 102 - 33
assistMg/src/main/java/com/hotent/surveyinfo/controller/CostVerifyTemplateController.java

@@ -122,8 +122,9 @@ public class CostVerifyTemplateController extends BaseController<CostVerifyTempl
 	/**
 	 * 生成核定模板数据
 	 * @param templateId 模板ID
-	 * @param templatename 模板类型:1-成本调查固定表,其他-成本核定表
+	 * @param templatename 模板名称
 	 * @param catalogId    监审id
+	 * @param taskId       任务id
 	 * @return 核定模板数据(包含表头和数据项)
 	 * @throws Exception
 	 */
@@ -133,9 +134,11 @@ public class CostVerifyTemplateController extends BaseController<CostVerifyTempl
 			@ApiParam(name="templateId", value="模板ID", required = true)
 			@RequestParam String templateId,
 			@ApiParam(name="templatename", value="模板名称", required = true)
-			 String templatename,@ApiParam(name="catalogId", value="监审id", required = true)
-			 String taskId,@ApiParam(name="taskId", value="任务id", required = false)
-			@RequestParam String catalogId) throws Exception {
+			@RequestParam String templatename,
+			@ApiParam(name="catalogId", value="监审id", required = true)
+			@RequestParam String catalogId,
+			@ApiParam(name="taskId", value="任务id", required = false)
+			@RequestParam(required = false) String taskId) throws Exception {
 
 		CostCatalog costCatalog = costCatalogManager.getById(catalogId);
 		if (costCatalog==null) {
@@ -154,46 +157,112 @@ public class CostVerifyTemplateController extends BaseController<CostVerifyTempl
 		template.setCatalogId(catalogId);
 		template.setCreatemode("2");
 		template.setCreatetemplateid(templateId);
-		template.setAreaCode(costCatalog.getCode());
+
+		// 修复:根据用户数据权限设置区域代码和区域级别(与其他创建方式保持一致)
+		IUser user = ContextUtil.getCurrentUser();
+		User currentUser = userService.get(user.getUserId());
+		Integer dataScope = currentUser.getDataScope();
+		if (dataScope == 0) {
+			template.setAreaLevel("0");
+			template.setAreaCode(currentUser.getProvinceCode());
+		} else if (dataScope == 1) {
+			template.setAreaLevel("1");
+			template.setAreaCode(currentUser.getCityCode());
+		} else {
+			template.setAreaLevel("2");
+			template.setAreaCode(currentUser.getCountyCode());
+		}
 
 		//新增修改后的模板数据
 		costSurveyTemplateDao.insert(template);
+
+		// 查询源模板的数据项和表头
 		List<CostVerifyTemplateItems> itemsList = costVerifyTemplateItemsDao.selectByVerifyTemplateId(templateId,taskId);
-		List<CostVerifyTemplateItems> updateitemsList=new ArrayList<>();
-		// 从成本核定表获取启用状态的表头和数据项
 		List<CostVerifyTemplateHeaders> headersList = costVerifyTemplateHeadersDao.selectBySurveyTemplateId(templateId);
-		//将 headersList 保存到数据库中
-		for (CostVerifyTemplateHeaders header : headersList) {
-			String headerId = UUID.randomUUID().toString();
-			header.setId(headerId);
-			header.setSurveyTemplateId(tid);
-			header.setCreateBy(ContextUtil.getCurrentUser().getAccount());
-			header.setCreateTime( LocalDateTime.now());
-			costVerifyTemplateHeadersDao.insert(header);
-			if (itemsList != null && !itemsList.isEmpty()) {
-				for (CostVerifyTemplateItems items : itemsList)
-				{
-					if (items.getHeadersId().equals(header.getId())){
-						items.setHeadersId(headerId);
-						updateitemsList.add(items);
-					}
 
+		// 关键修复:如果在任务中(有 taskId),过滤掉审计期间字段,避免重复生成
+		if (taskId != null && headersList != null && !headersList.isEmpty()) {
+			headersList = headersList.stream()
+					.filter(header -> {
+						String fieldName = header.getFieldName();
+						if (fieldName == null) {
+							return true; // 保留字段名为空的
+						}
+						// 过滤掉包含审计期间关键词的字段(前端会根据任务的审计期间重新生成)
+						return !fieldName.contains("年账面值")
+								&& !fieldName.contains("年调整值")
+								&& !fieldName.contains("年审核调整值")
+								&& !fieldName.contains("年核定值");
+					})
+					.collect(Collectors.toList());
+		}
+
+		// 创建旧ID到新ID的映射表(关键修复:使用Map保存映射关系)
+		Map<String, String> headerIdMap = new HashMap<>();
+
+		// 将 headersList 保存到数据库中
+		if (headersList != null && !headersList.isEmpty()) {
+			for (CostVerifyTemplateHeaders header : headersList) {
+				// 关键修复:先保存旧的header ID
+				String oldHeaderId = header.getId();
+
+				// 生成新的header ID
+				String newHeaderId = UUID.randomUUID().toString();
+
+				// 关键修复:记录映射关系
+				headerIdMap.put(oldHeaderId, newHeaderId);
+
+				// 设置新ID和其他属性
+				header.setId(newHeaderId);
+				header.setSurveyTemplateId(tid);
+				header.setCreateBy(ContextUtil.getCurrentUser().getAccount());
+				header.setCreateTime( LocalDateTime.now());
+				costVerifyTemplateHeadersDao.insert(header);
+			}
+		}
+
+		// 将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
+				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);
 			}
 
-		}
-// 3. 将updateitemsList数据依次写入 CostVerifyTemplateItems 表中
-		if (updateitemsList != null && !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);
+			// 批量保存数据项
+			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);
+				}
 			}
 		}
+
 		return CommonResult.<CostVerifyTemplate>ok().value(template);
 	}