|
@@ -139,6 +139,9 @@ public class WorkKnowledgeBaseShareService extends CrudService<WorkKnowledgeBase
|
|
|
@Autowired
|
|
@Autowired
|
|
|
private WorkKnowledgeBaseClickRecordDao clickRecordDao;
|
|
private WorkKnowledgeBaseClickRecordDao clickRecordDao;
|
|
|
|
|
|
|
|
|
|
+ @Autowired
|
|
|
|
|
+ private WorkKnowledgeBaseShareLinkDao shareLinkDao;
|
|
|
|
|
+
|
|
|
/**
|
|
/**
|
|
|
* 根据文件id加载附件列表(编辑表单回显用)
|
|
* 根据文件id加载附件列表(编辑表单回显用)
|
|
|
*/
|
|
*/
|
|
@@ -160,6 +163,16 @@ public class WorkKnowledgeBaseShareService extends CrudService<WorkKnowledgeBase
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
/**
|
|
|
|
|
+ * 根据文件id加载关联链接列表(编辑表单回显/详情展示用)
|
|
|
|
|
+ */
|
|
|
|
|
+ public List<WorkKnowledgeBaseShareLink> findLinksByFileId(String fileId) {
|
|
|
|
|
+ if (StringUtils.isBlank(fileId)) {
|
|
|
|
|
+ return new ArrayList<>();
|
|
|
|
|
+ }
|
|
|
|
|
+ return shareLinkDao.findByFileId(fileId);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ /**
|
|
|
* 根据文件id查询动态字段値列表(编辑表单回显用)
|
|
* 根据文件id查询动态字段値列表(编辑表单回显用)
|
|
|
*/
|
|
*/
|
|
|
public List<WorkKnowledgeBaseDynamicValueInfo> findDynamicValuesByFileId(String fileId) {
|
|
public List<WorkKnowledgeBaseDynamicValueInfo> findDynamicValuesByFileId(String fileId) {
|
|
@@ -427,20 +440,26 @@ public class WorkKnowledgeBaseShareService extends CrudService<WorkKnowledgeBase
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
boolean hasValidAttachment = hasValidAttachment(attachments);
|
|
boolean hasValidAttachment = hasValidAttachment(attachments);
|
|
|
- // 调试日志:输出附件判定结果
|
|
|
|
|
- logger.info("saveShare附件判定 - isNew:" + isNew + ", attachments:" + (attachments != null ? attachments.size() : "null")
|
|
|
|
|
|
|
+ // 同时判断是否有有效链接(链接与附件等价,有链接也算非草稿)
|
|
|
|
|
+ List<WorkKnowledgeBaseShareLink> shareLinks = shareInfo.getShareLinks();
|
|
|
|
|
+ boolean hasValidLink = hasValidLink(shareLinks);
|
|
|
|
|
+ // 编辑时,若前端未提交链接,回查DB已有链接进行判定
|
|
|
|
|
+ if (!isNew && (shareLinks == null || shareLinks.isEmpty()) && StringUtils.isNotBlank(shareInfo.getId())) {
|
|
|
|
|
+ List<WorkKnowledgeBaseShareLink> existingLinks = findLinksByFileId(shareInfo.getId());
|
|
|
|
|
+ hasValidLink = hasValidLink(existingLinks);
|
|
|
|
|
+ }
|
|
|
|
|
+ // 有附件 OR 有链接 -> 视为有内容,进入审核流
|
|
|
|
|
+ boolean hasContent = hasValidAttachment || hasValidLink;
|
|
|
|
|
+ logger.info("saveShare内容判定 - isNew:" + isNew
|
|
|
+ ", hasValidAttachment:" + hasValidAttachment
|
|
+ ", hasValidAttachment:" + hasValidAttachment
|
|
|
|
|
+ + ", hasValidLink:" + hasValidLink
|
|
|
|
|
+ + ", hasContent:" + hasContent
|
|
|
+ ", treeNodeId:" + shareInfo.getTreeNodeId());
|
|
+ ", treeNodeId:" + shareInfo.getTreeNodeId());
|
|
|
- if (attachments != null) {
|
|
|
|
|
- for (int idx = 0; idx < attachments.size(); idx++) {
|
|
|
|
|
- Workattachment att = attachments.get(idx);
|
|
|
|
|
- logger.info(" attachment[" + idx + "] id='" + att.getId() + "', url='" + att.getUrl() + "', delFlag='" + att.getDelFlag() + "'");
|
|
|
|
|
- }
|
|
|
|
|
- }
|
|
|
|
|
// 编辑时,若前端未提交附件列表(用户未更换文件),回查DB已有附件进行判定
|
|
// 编辑时,若前端未提交附件列表(用户未更换文件),回查DB已有附件进行判定
|
|
|
if (!isNew && (attachments == null || attachments.isEmpty()) && StringUtils.isNotBlank(shareInfo.getId())) {
|
|
if (!isNew && (attachments == null || attachments.isEmpty()) && StringUtils.isNotBlank(shareInfo.getId())) {
|
|
|
List<Workattachment> existingAttachments = findAttachmentsByFileId(shareInfo.getId());
|
|
List<Workattachment> existingAttachments = findAttachmentsByFileId(shareInfo.getId());
|
|
|
hasValidAttachment = hasValidAttachment(existingAttachments);
|
|
hasValidAttachment = hasValidAttachment(existingAttachments);
|
|
|
|
|
+ hasContent = hasValidAttachment || hasValidLink;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
if (isQaCategory) {
|
|
if (isQaCategory) {
|
|
@@ -456,12 +475,12 @@ public class WorkKnowledgeBaseShareService extends CrudService<WorkKnowledgeBase
|
|
|
shareInfo.setAuditRejectCount(0);
|
|
shareInfo.setAuditRejectCount(0);
|
|
|
} else {
|
|
} else {
|
|
|
// ========== 非问答分类:走原有审核流程 ==========
|
|
// ========== 非问答分类:走原有审核流程 ==========
|
|
|
- // 典型案例分类也走正常审核流程,根据有无附件判断状态
|
|
|
|
|
- // 管理员上传时,有附件直接审核通过(5),无需审核
|
|
|
|
|
|
|
+ // 典型案例分类也走正常审核流程,根据有无内容(附件或链接)判断状态
|
|
|
|
|
+ // 管理员上传时,有内容直接审核通过(5),无需审核
|
|
|
if (isNew) {
|
|
if (isNew) {
|
|
|
- // 新增:无文件草稿0,有文件未审核 1(管理员直接审核通过5)
|
|
|
|
|
|
|
+ // 新增:无内容草稿0,有内容(附件或链接)未审核 1(管理员直接审核通过5)
|
|
|
String newAuditStatus;
|
|
String newAuditStatus;
|
|
|
- if (hasValidAttachment) {
|
|
|
|
|
|
|
+ if (hasContent) {
|
|
|
newAuditStatus = isAdmin ? AUDIT_STATUS_PASSED : AUDIT_STATUS_PENDING;
|
|
newAuditStatus = isAdmin ? AUDIT_STATUS_PASSED : AUDIT_STATUS_PENDING;
|
|
|
} else {
|
|
} else {
|
|
|
newAuditStatus = AUDIT_STATUS_DRAFT;
|
|
newAuditStatus = AUDIT_STATUS_DRAFT;
|
|
@@ -469,8 +488,8 @@ public class WorkKnowledgeBaseShareService extends CrudService<WorkKnowledgeBase
|
|
|
shareInfo.setAuditStatus(newAuditStatus);
|
|
shareInfo.setAuditStatus(newAuditStatus);
|
|
|
shareInfo.setAuditPassCount(0);
|
|
shareInfo.setAuditPassCount(0);
|
|
|
shareInfo.setAuditRejectCount(0);
|
|
shareInfo.setAuditRejectCount(0);
|
|
|
- // 有附件且非管理员(走审核流程)时记录提交审核人为当前登录人,同时初始化本轮审核起始时间
|
|
|
|
|
- if (hasValidAttachment && !isAdmin) {
|
|
|
|
|
|
|
+ // 有内容且非管理员(走审核流程)时记录提交审核人为当前登录人
|
|
|
|
|
+ if (hasContent && !isAdmin) {
|
|
|
shareInfo.setSubmitAuditUserId(UserUtils.getUser().getId());
|
|
shareInfo.setSubmitAuditUserId(UserUtils.getUser().getId());
|
|
|
shareInfo.setAuditStartDate(new Date());
|
|
shareInfo.setAuditStartDate(new Date());
|
|
|
}
|
|
}
|
|
@@ -488,7 +507,7 @@ public class WorkKnowledgeBaseShareService extends CrudService<WorkKnowledgeBase
|
|
|
// currentStatus为null时视为未初始化,允许重新判定;草稿(0)和审核未通过(4)也允许重新判定
|
|
// currentStatus为null时视为未初始化,允许重新判定;草稿(0)和审核未通过(4)也允许重新判定
|
|
|
if (currentStatus == null || currentStatus.equals(AUDIT_STATUS_DRAFT) || currentStatus.equals(AUDIT_STATUS_REJECTED)) {
|
|
if (currentStatus == null || currentStatus.equals(AUDIT_STATUS_DRAFT) || currentStatus.equals(AUDIT_STATUS_REJECTED)) {
|
|
|
String editAuditStatus;
|
|
String editAuditStatus;
|
|
|
- if (hasValidAttachment) {
|
|
|
|
|
|
|
+ if (hasContent) {
|
|
|
editAuditStatus = isAdmin ? AUDIT_STATUS_PASSED : AUDIT_STATUS_PENDING;
|
|
editAuditStatus = isAdmin ? AUDIT_STATUS_PASSED : AUDIT_STATUS_PENDING;
|
|
|
} else {
|
|
} else {
|
|
|
editAuditStatus = AUDIT_STATUS_DRAFT;
|
|
editAuditStatus = AUDIT_STATUS_DRAFT;
|
|
@@ -497,8 +516,8 @@ public class WorkKnowledgeBaseShareService extends CrudService<WorkKnowledgeBase
|
|
|
logger.info("状态重新判定 - 新auditStatus:'" + shareInfo.getAuditStatus() + "', isAdmin:" + isAdmin);
|
|
logger.info("状态重新判定 - 新auditStatus:'" + shareInfo.getAuditStatus() + "', isAdmin:" + isAdmin);
|
|
|
shareInfo.setAuditPassCount(0);
|
|
shareInfo.setAuditPassCount(0);
|
|
|
shareInfo.setAuditRejectCount(0);
|
|
shareInfo.setAuditRejectCount(0);
|
|
|
- // 重新提交且非管理员(走审核流程)时更新提交审核人为当前登录人,并刷新本轮审核起始时间
|
|
|
|
|
- if (hasValidAttachment && !isAdmin) {
|
|
|
|
|
|
|
+ // 重新提交且非管理员(走审核流程)时更新提交审核人为当前登录人
|
|
|
|
|
+ if (hasContent && !isAdmin) {
|
|
|
shareInfo.setSubmitAuditUserId(UserUtils.getUser().getId());
|
|
shareInfo.setSubmitAuditUserId(UserUtils.getUser().getId());
|
|
|
shareInfo.setAuditStartDate(new Date());
|
|
shareInfo.setAuditStartDate(new Date());
|
|
|
}
|
|
}
|
|
@@ -536,7 +555,25 @@ public class WorkKnowledgeBaseShareService extends CrudService<WorkKnowledgeBase
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
-
|
|
|
|
|
|
|
+
|
|
|
|
|
+ // 保存关联链接(先删后插)
|
|
|
|
|
+ if (StringUtils.isNotBlank(shareInfo.getId())) {
|
|
|
|
|
+ shareLinkDao.deleteByFileId(shareInfo.getId());
|
|
|
|
|
+ if (shareLinks != null && !shareLinks.isEmpty()) {
|
|
|
|
|
+ int order = 0;
|
|
|
|
|
+ for (WorkKnowledgeBaseShareLink link : shareLinks) {
|
|
|
|
|
+ if (StringUtils.isBlank(link.getLinkDesc()) || StringUtils.isBlank(link.getLinkUrl())) {
|
|
|
|
|
+ continue; // 跳过无效链接
|
|
|
|
|
+ }
|
|
|
|
|
+ link.setId(IdGen.uuid());
|
|
|
|
|
+ link.setFileId(shareInfo.getId());
|
|
|
|
|
+ link.setSortOrder(order++);
|
|
|
|
|
+ link.preInsert();
|
|
|
|
|
+ shareLinkDao.insert(link);
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
// 先逻辑删除旧的动态字段値
|
|
// 先逻辑删除旧的动态字段値
|
|
|
WorkKnowledgeBaseDynamicValueInfo delEntity = new WorkKnowledgeBaseDynamicValueInfo();
|
|
WorkKnowledgeBaseDynamicValueInfo delEntity = new WorkKnowledgeBaseDynamicValueInfo();
|
|
|
delEntity.setFileId(shareInfo.getId());
|
|
delEntity.setFileId(shareInfo.getId());
|
|
@@ -766,6 +803,21 @@ public class WorkKnowledgeBaseShareService extends CrudService<WorkKnowledgeBase
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
/**
|
|
|
|
|
+ * 判断链接列表中是否存在有效链接(描述和URL均不为空)
|
|
|
|
|
+ */
|
|
|
|
|
+ private boolean hasValidLink(List<WorkKnowledgeBaseShareLink> links) {
|
|
|
|
|
+ if (links == null || links.isEmpty()) {
|
|
|
|
|
+ return false;
|
|
|
|
|
+ }
|
|
|
|
|
+ for (WorkKnowledgeBaseShareLink link : links) {
|
|
|
|
|
+ if (StringUtils.isNotBlank(link.getLinkDesc()) && StringUtils.isNotBlank(link.getLinkUrl())) {
|
|
|
|
|
+ return true;
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ return false;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ /**
|
|
|
* 批量填充每行数据的第一个附件信息(替代原有 file_url/file_name 字段)
|
|
* 批量填充每行数据的第一个附件信息(替代原有 file_url/file_name 字段)
|
|
|
* 从 work_attachment 表查询每个文件对应的第一个附件,将 url 和 attachmentName 写入 map
|
|
* 从 work_attachment 表查询每个文件对应的第一个附件,将 url 和 attachmentName 写入 map
|
|
|
* @param list 查询结果列表(每行为 Map,包含 id 字段)
|
|
* @param list 查询结果列表(每行为 Map,包含 id 字段)
|
|
@@ -778,14 +830,46 @@ public class WorkKnowledgeBaseShareService extends CrudService<WorkKnowledgeBase
|
|
|
Object id = map.get("id");
|
|
Object id = map.get("id");
|
|
|
if (id == null) continue;
|
|
if (id == null) continue;
|
|
|
String fileId = id.toString();
|
|
String fileId = id.toString();
|
|
|
|
|
+
|
|
|
|
|
+ // 查询附件
|
|
|
List<Workattachment> attList = workattachmentService.getListByAttachmentIdAndFlag(fileId, ATTACHMENT_FLAG);
|
|
List<Workattachment> attList = workattachmentService.getListByAttachmentIdAndFlag(fileId, ATTACHMENT_FLAG);
|
|
|
|
|
+
|
|
|
|
|
+ // 查询链接
|
|
|
|
|
+ List<WorkKnowledgeBaseShareLink> links = shareLinkDao.findByFileId(fileId);
|
|
|
|
|
+
|
|
|
|
|
+ // 构建统一的内容项列表(用于列表页展示)
|
|
|
|
|
+ List<Map<String, String>> contentItems = new ArrayList<>();
|
|
|
|
|
+
|
|
|
|
|
+ // 添加附件项
|
|
|
|
|
+ if (attList != null && !attList.isEmpty()) {
|
|
|
|
|
+ for (Workattachment att : attList) {
|
|
|
|
|
+ Map<String, String> item = new HashMap<>();
|
|
|
|
|
+ item.put("type", "file");
|
|
|
|
|
+ item.put("name", att.getAttachmentName() != null ? att.getAttachmentName() : "");
|
|
|
|
|
+ item.put("url", att.getUrl() != null ? att.getUrl() : "");
|
|
|
|
|
+ item.put("temporaryUrl", att.getTemporaryUrl() != null ? att.getTemporaryUrl() : "");
|
|
|
|
|
+ item.put("uploadMode", att.getUploadMode() != null ? att.getUploadMode().toString() : "1");
|
|
|
|
|
+ contentItems.add(item);
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // 添加链接项
|
|
|
|
|
+ if (links != null && !links.isEmpty()) {
|
|
|
|
|
+ for (WorkKnowledgeBaseShareLink link : links) {
|
|
|
|
|
+ Map<String, String> item = new HashMap<>();
|
|
|
|
|
+ item.put("type", "link");
|
|
|
|
|
+ item.put("name", link.getLinkDesc() != null ? link.getLinkDesc() : "");
|
|
|
|
|
+ item.put("url", link.getLinkUrl() != null ? link.getLinkUrl() : "");
|
|
|
|
|
+ contentItems.add(item);
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // 填充基础字段(兼容原有逻辑)
|
|
|
if (attList != null && !attList.isEmpty()) {
|
|
if (attList != null && !attList.isEmpty()) {
|
|
|
Workattachment firstAttach = attList.get(0);
|
|
Workattachment firstAttach = attList.get(0);
|
|
|
map.put("fileUrl", firstAttach.getUrl());
|
|
map.put("fileUrl", firstAttach.getUrl());
|
|
|
map.put("fileName", firstAttach.getAttachmentName());
|
|
map.put("fileName", firstAttach.getAttachmentName());
|
|
|
- // 附件数量
|
|
|
|
|
map.put("attachmentCount", attList.size());
|
|
map.put("attachmentCount", attList.size());
|
|
|
- // 所有附件名称逗号分隔展示
|
|
|
|
|
StringBuilder namesBuilder = new StringBuilder();
|
|
StringBuilder namesBuilder = new StringBuilder();
|
|
|
for (int i = 0; i < attList.size(); i++) {
|
|
for (int i = 0; i < attList.size(); i++) {
|
|
|
if (i > 0) namesBuilder.append(", ");
|
|
if (i > 0) namesBuilder.append(", ");
|
|
@@ -794,11 +878,66 @@ public class WorkKnowledgeBaseShareService extends CrudService<WorkKnowledgeBase
|
|
|
}
|
|
}
|
|
|
map.put("allAttachmentNames", namesBuilder.toString());
|
|
map.put("allAttachmentNames", namesBuilder.toString());
|
|
|
} else {
|
|
} else {
|
|
|
|
|
+ map.put("fileUrl", "");
|
|
|
|
|
+ map.put("fileName", "");
|
|
|
map.put("attachmentCount", 0);
|
|
map.put("attachmentCount", 0);
|
|
|
map.put("allAttachmentNames", "");
|
|
map.put("allAttachmentNames", "");
|
|
|
}
|
|
}
|
|
|
|
|
+
|
|
|
|
|
+ // 填充链接基础字段(兼容原有逻辑)
|
|
|
|
|
+ map.put("linkCount", links != null ? links.size() : 0);
|
|
|
|
|
+ if (links != null && !links.isEmpty()) {
|
|
|
|
|
+ StringBuilder linkJson = new StringBuilder("[");
|
|
|
|
|
+ for (int i = 0; i < links.size(); i++) {
|
|
|
|
|
+ if (i > 0) linkJson.append(",");
|
|
|
|
|
+ linkJson.append("{\"desc\":\"")
|
|
|
|
|
+ .append(links.get(i).getLinkDesc() != null ? links.get(i).getLinkDesc().replace("\"", "\\\"") : "")
|
|
|
|
|
+ .append("\",\"url\":\"")
|
|
|
|
|
+ .append(links.get(i).getLinkUrl() != null ? links.get(i).getLinkUrl().replace("\"", "\\\"") : "")
|
|
|
|
|
+ .append("\"}");
|
|
|
|
|
+ }
|
|
|
|
|
+ linkJson.append("]");
|
|
|
|
|
+ map.put("linkData", linkJson.toString());
|
|
|
|
|
+ } else {
|
|
|
|
|
+ map.put("linkData", "[]");
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // 填充统一内容项列表(JSON格式,供新展示逻辑使用)
|
|
|
|
|
+ if (!contentItems.isEmpty()) {
|
|
|
|
|
+ StringBuilder contentJson = new StringBuilder("[");
|
|
|
|
|
+ for (int i = 0; i < contentItems.size(); i++) {
|
|
|
|
|
+ if (i > 0) contentJson.append(",");
|
|
|
|
|
+ Map<String, String> item = contentItems.get(i);
|
|
|
|
|
+ contentJson.append("{\"type\":\"").append(item.get("type")).append("\"")
|
|
|
|
|
+ .append(",\"name\":\"").append(escapeJson(item.get("name"))).append("\"")
|
|
|
|
|
+ .append(",\"url\":\"").append(escapeJson(item.get("url"))).append("\"");
|
|
|
|
|
+ if (item.containsKey("temporaryUrl")) {
|
|
|
|
|
+ contentJson.append(",\"temporaryUrl\":\"").append(escapeJson(item.get("temporaryUrl"))).append("\"");
|
|
|
|
|
+ }
|
|
|
|
|
+ if (item.containsKey("uploadMode")) {
|
|
|
|
|
+ contentJson.append(",\"uploadMode\":\"").append(item.get("uploadMode")).append("\"");
|
|
|
|
|
+ }
|
|
|
|
|
+ contentJson.append("}");
|
|
|
|
|
+ }
|
|
|
|
|
+ contentJson.append("]");
|
|
|
|
|
+ map.put("contentItems", contentJson.toString());
|
|
|
|
|
+ } else {
|
|
|
|
|
+ map.put("contentItems", "[]");
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
+
|
|
|
|
|
+ /**
|
|
|
|
|
+ * JSON字符串转义
|
|
|
|
|
+ */
|
|
|
|
|
+ private String escapeJson(String value) {
|
|
|
|
|
+ if (value == null) return "";
|
|
|
|
|
+ return value.replace("\\", "\\\\")
|
|
|
|
|
+ .replace("\"", "\\\"")
|
|
|
|
|
+ .replace("\n", "\\n")
|
|
|
|
|
+ .replace("\r", "\\r")
|
|
|
|
|
+ .replace("\t", "\\t");
|
|
|
|
|
+ }
|
|
|
|
|
|
|
|
/**
|
|
/**
|
|
|
* 发起审核:未审核(1) -> 审核中(2),清空通过/驳回统计
|
|
* 发起审核:未审核(1) -> 审核中(2),清空通过/驳回统计
|
|
@@ -1882,6 +2021,9 @@ public class WorkKnowledgeBaseShareService extends CrudService<WorkKnowledgeBase
|
|
|
workattachmentService.delete(attachment);
|
|
workattachmentService.delete(attachment);
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
+
|
|
|
|
|
+ // 同步逻辑删除关联链接
|
|
|
|
|
+ shareLinkDao.deleteByFileId(entity.getId());
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
/**
|
|
@@ -2589,6 +2731,9 @@ public class WorkKnowledgeBaseShareService extends CrudService<WorkKnowledgeBase
|
|
|
// 加载附件列表(如果需要)
|
|
// 加载附件列表(如果需要)
|
|
|
question.setWorkAttachments(findAttachmentsByFileId(questionId));
|
|
question.setWorkAttachments(findAttachmentsByFileId(questionId));
|
|
|
|
|
|
|
|
|
|
+ // 加载关联链接列表
|
|
|
|
|
+ question.setShareLinks(findLinksByFileId(questionId));
|
|
|
|
|
+
|
|
|
// 加载动态字段值(如果需要)
|
|
// 加载动态字段值(如果需要)
|
|
|
List<WorkKnowledgeBaseDynamicValueInfo> dynamicValues = findDynamicValuesByFileId(questionId);
|
|
List<WorkKnowledgeBaseDynamicValueInfo> dynamicValues = findDynamicValuesByFileId(questionId);
|
|
|
if (dynamicValues != null && !dynamicValues.isEmpty()) {
|
|
if (dynamicValues != null && !dynamicValues.isEmpty()) {
|