Переглянути джерело

知识库积分部分功能提交,问答答疑部通知提醒

徐滕 4 тижнів тому
батько
коміт
fc70c4c3c1

+ 9 - 0
src/main/java/com/jeeplus/modules/WorkKnowledgeBase/entity/WorkKnowledgeBaseShareInfo.java

@@ -20,6 +20,7 @@ public class WorkKnowledgeBaseShareInfo extends DataEntity<WorkKnowledgeBaseShar
     private String name;       // 上传文件名称
     private Date createTime;      // 创建时间
     private String contentAttribute;    //内容属性 0 = 原创 1 = 转载
+    private String home;
 
     /** 审核状态 0:草稿 1:未审核 2:审核中 4:审核未通过 5:审核通过 */
     private String auditStatus;
@@ -242,4 +243,12 @@ public class WorkKnowledgeBaseShareInfo extends DataEntity<WorkKnowledgeBaseShar
     public void setQuestionDescription(String questionDescription) {
         this.questionDescription = questionDescription;
     }
+
+    public String getHome() {
+        return home;
+    }
+
+    public void setHome(String home) {
+        this.home = home;
+    }
 }

+ 73 - 0
src/main/java/com/jeeplus/modules/WorkKnowledgeBase/service/WorkKnowledgeBaseShareService.java

@@ -10,6 +10,9 @@ import com.jeeplus.modules.sys.entity.User;
 import com.jeeplus.modules.sys.entity.Workattachment;
 import com.jeeplus.modules.sys.service.WorkattachmentService;
 import com.jeeplus.modules.sys.utils.UserUtils;
+import com.jeeplus.modules.workprojectnotify.entity.WorkProjectNotify;
+import com.jeeplus.modules.workprojectnotify.service.WorkProjectNotifyService;
+import com.jeeplus.modules.workprojectnotify.util.UtilNotify;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
@@ -101,6 +104,9 @@ public class WorkKnowledgeBaseShareService extends CrudService<WorkKnowledgeBase
     @Autowired
     private WorkKnowledgeBaseBestAnswerDao bestAnswerDao;
 
+    @Autowired
+    private WorkProjectNotifyService workProjectNotifyService;
+
     /**
      * 根据文件id加载附件列表(编辑表单回显用)
      */
@@ -1062,6 +1068,45 @@ public class WorkKnowledgeBaseShareService extends CrudService<WorkKnowledgeBase
             question.preUpdate();
             dao.update(question);
         }
+
+        //在此处进行通知处理
+        //查询问题的详细信息(包含创建人、分类等信息)
+        WorkKnowledgeBaseShareInfo questionDetail = getQuestionDetailForNotification(question.getId());
+
+        String notifyStr = "您发表的问答答疑,名称为【"+ questionDetail.getName()+"】存在新回复,请登录系统进入知识库进行查看";
+        String titleStr = "您发表的问答答疑,名称为【"+ questionDetail.getName()+"】存在新回复,请登录系统进入知识库进行查看";
+
+
+        User currentUser = UserUtils.getUser(); // 当前回答的用户
+
+        // 获取问题的创建人ID(用于通知)
+        String questionCreatorId = questionDetail.getCreateBy() != null ? questionDetail.getCreateBy().getId() : null;
+
+        // 根据标题查询通知信息中是否存在未读的信息,有则进行更新并对重复数量进行+1操作
+        WorkProjectNotify byTitleAndUnread = workProjectNotifyService.getByTitleAndUnread(notifyStr, questionCreatorId);
+
+        if(null != byTitleAndUnread){
+            //将所有的被通知人的该条通知均调整为已读,然后将最后一条数据进行调整
+            workProjectNotifyService.deleteByNotifyUser(notifyStr, currentUser.getId());
+            byTitleAndUnread.setExigency("1");
+            byTitleAndUnread.setTitle(titleStr);
+            workProjectNotifyService.updateOverDueInfo(byTitleAndUnread);
+        }else{
+            // 向问题创建人发送通知
+            if (StringUtils.isNotBlank(questionCreatorId)) {
+                User questionCreator = new User(questionCreatorId);
+                workProjectNotifyService
+                        .save(UtilNotify.saveNotify(questionDetail.getId(),
+                                questionCreator,
+                                currentUser.getCompany().getId(),
+                                titleStr,
+                                notifyStr,
+                                "199",
+                                "0",
+                                "待通知",
+                                ""));
+            }
+        }
     }
 
     /**
@@ -1253,4 +1298,32 @@ public class WorkKnowledgeBaseShareService extends CrudService<WorkKnowledgeBase
         }
         return bestAnswerDao.isBestAnswer(questionId, answerId);
     }
+
+    /**
+     * 查询问题的详细信息(用于通知处理)
+     * @param questionId 问题ID
+     * @return 问题详细信息
+     */
+    public WorkKnowledgeBaseShareInfo getQuestionDetailForNotification(String questionId) {
+        if (StringUtils.isBlank(questionId)) {
+            return null;
+        }
+        // 使用dao.get()方法查询完整的问题信息
+        WorkKnowledgeBaseShareInfo question = dao.get(questionId);
+        if (question != null) {
+            // 加载附件列表(如果需要)
+            question.setWorkAttachments(findAttachmentsByFileId(questionId));
+            
+            // 加载动态字段值(如果需要)
+            List<WorkKnowledgeBaseDynamicValueInfo> dynamicValues = findDynamicValuesByFileId(questionId);
+            if (dynamicValues != null && !dynamicValues.isEmpty()) {
+                Map<String, String> dynValueMap = new HashMap<>();
+                for (WorkKnowledgeBaseDynamicValueInfo val : dynamicValues) {
+                    dynValueMap.put(val.getDynamicFieldId(), val.getFieldValue());
+                }
+                // 可以将动态字段值设置到对象中,或者单独返回
+            }
+        }
+        return question;
+    }
 }

+ 4 - 2
src/main/java/com/jeeplus/modules/WorkKnowledgeBase/web/WorkKnowledgeBaseShareController.java

@@ -9,6 +9,8 @@ import com.jeeplus.common.utils.excel.ExportExcel;
 import com.jeeplus.common.utils.excel.ImportExcel;
 import com.jeeplus.common.web.BaseController;
 import com.jeeplus.modules.WorkKnowledgeBase.entity.*;
+import com.jeeplus.modules.WorkKnowledgeBase.service.WorkKnowledgeBasePointRuleService;
+import com.jeeplus.modules.WorkKnowledgeBase.service.WorkKnowledgeBaseReadLikeService;
 import com.jeeplus.modules.WorkKnowledgeBase.service.WorkKnowledgeBaseShareService;
 import com.jeeplus.modules.WorkKnowledgeBase.service.WorkKnowledgeExpertService;
 import com.jeeplus.modules.sys.utils.UserUtils;
@@ -44,10 +46,10 @@ public class WorkKnowledgeBaseShareController extends BaseController {
     private WorkKnowledgeExpertService expertService;
 
     @Autowired
-    private com.jeeplus.modules.WorkKnowledgeBase.service.WorkKnowledgeBasePointRuleService pointRuleService;
+    private WorkKnowledgeBasePointRuleService pointRuleService;
 
     @Autowired
-    private com.jeeplus.modules.WorkKnowledgeBase.service.WorkKnowledgeBaseReadLikeService readLikeService;
+    private WorkKnowledgeBaseReadLikeService readLikeService;
 
     @ModelAttribute
     public WorkKnowledgeBaseShareInfo get(@RequestParam(required = false) String id) {

+ 133 - 0
src/main/java/com/jeeplus/modules/workprojectnotify/web/WorkProjectNotifyController.java

@@ -20,6 +20,10 @@ import com.jeeplus.common.utils.StringUtils;
 import com.jeeplus.common.utils.excel.ExportExcel;
 import com.jeeplus.common.utils.excel.ImportExcel;
 import com.jeeplus.common.web.BaseController;
+import com.jeeplus.modules.WorkKnowledgeBase.entity.*;
+import com.jeeplus.modules.WorkKnowledgeBase.service.WorkKnowledgeBasePointRuleService;
+import com.jeeplus.modules.WorkKnowledgeBase.service.WorkKnowledgeBaseReadLikeService;
+import com.jeeplus.modules.WorkKnowledgeBase.service.WorkKnowledgeBaseShareService;
 import com.jeeplus.modules.act.entity.Act;
 import com.jeeplus.modules.act.service.ActTaskService;
 import com.jeeplus.modules.businessQuestions.entity.BusinessQuestions;
@@ -273,6 +277,7 @@ import org.activiti.engine.HistoryService;
 import org.activiti.engine.history.HistoricProcessInstance;
 import org.activiti.engine.runtime.ProcessInstance;
 import org.activiti.engine.task.Task;
+import org.checkerframework.checker.nullness.qual.NonNull;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Controller;
 import org.springframework.ui.Model;
@@ -628,6 +633,15 @@ public class WorkProjectNotifyController extends BaseController {
 	@Autowired
 	private ForumService forumService;
 
+	@Autowired
+	private WorkKnowledgeBaseShareService workKnowledgeBaseShareService;
+
+	@Autowired
+	private WorkKnowledgeBasePointRuleService pointRuleService;
+
+	@Autowired
+	private WorkKnowledgeBaseReadLikeService readLikeService;
+
 
 	@ModelAttribute
 	public WorkProjectNotify get(@RequestParam(required = false) String id) {
@@ -7775,6 +7789,8 @@ public class WorkProjectNotifyController extends BaseController {
 					return this.saveAchiveModifyDirectly(workProjectNotify, model);
 				} else if ("187".equals(workProjectNotify.getType())) {
 					return this.sendMilitaryIndustryConfidentiality(workProjectNotify, model);
+				} else if ("199".equals(workProjectNotify.getType())) {
+					return this.sendWorkKnowBaseShareInfo(workProjectNotify, model);
 				} else if ("70".equals(workProjectNotify.getType())) {    //部门调转
 					WorkChangeJob workChangeJob = workChangeJobService.get(workProjectNotify.getNotifyId());
 					Act act = getByAct(workChangeJob.getProcessInstanceId());
@@ -11495,6 +11511,123 @@ public class WorkProjectNotifyController extends BaseController {
     }
 
 	/**
+	 * 业务用章申请
+	 * @param workProjectNotify
+	 * @param model
+	 * @return
+	 */
+	private @NonNull String sendWorkKnowBaseShareInfo(WorkProjectNotify workProjectNotify, Model model) throws Exception {
+		WorkKnowledgeBaseShareInfo shareInfo = workKnowledgeBaseShareService.get(workProjectNotify.getNotifyId());
+		shareInfo.setHome("home");
+		if (shareInfo == null) {
+			addMessage(model, "记录不存在!");
+			return "error";
+		}
+
+		// 验证是否为问题发起人
+		String currentUserId = UserUtils.getUser().getId();
+		if (!currentUserId.equals(shareInfo.getCreateBy().getId())) {
+			addMessage(model, "只有问题发起人可以确认答案!");
+
+			return showWorkKnowBaseShareInfo(shareInfo, model);
+		}
+
+		// 检查问题是否已结束
+		if ("8".equals(shareInfo.getAuditStatus())) {
+			addMessage(model, "该问题已确认答案,无法重复操作!");
+
+			return showWorkKnowBaseShareInfo(shareInfo, model);
+
+		}
+
+		model.addAttribute("entity", shareInfo);
+		return "modules/WorkKnowledgeBase/workKnowledgeBaseConfirmAnswer";
+    }
+
+	private String showWorkKnowBaseShareInfo(WorkKnowledgeBaseShareInfo shareInfo, Model model) throws Exception {
+		String rootId = shareInfo.getRootId();
+		String treeNodeId = shareInfo.getTreeNodeId();
+
+		if (StringUtils.isBlank(rootId) && StringUtils.isNotBlank(treeNodeId)) {
+			rootId = workKnowledgeBaseShareService.getRootIdByNodeId(treeNodeId);
+			shareInfo.setRootId(rootId);
+		}
+
+		// 查询动态字段配置
+		List<WorkKnowledgeBaseDynamicInfo> dynamicFields = new ArrayList<>();
+		if (StringUtils.isNotBlank(rootId)) {
+			dynamicFields = workKnowledgeBaseShareService.findDynamicFields(rootId);
+		}
+
+		// 加载动态字段已有值
+		Map<String, String> dynValues = new HashMap<>();
+		if (StringUtils.isNotBlank(shareInfo.getId())) {
+			List<WorkKnowledgeBaseDynamicValueInfo> existValues =
+					workKnowledgeBaseShareService.findDynamicValuesByFileId(shareInfo.getId());
+			if (existValues != null) {
+				for (WorkKnowledgeBaseDynamicValueInfo val : existValues) {
+					dynValues.put(val.getDynamicFieldId(), val.getFieldValue());
+				}
+			}
+		}
+
+		// 加载附件列表
+		if (StringUtils.isNotBlank(shareInfo.getId())) {
+			shareInfo.setWorkAttachments(workKnowledgeBaseShareService.findAttachmentsByFileId(shareInfo.getId()));
+		}
+
+		model.addAttribute("entity", shareInfo);
+		model.addAttribute("dynamicFields", dynamicFields);
+		model.addAttribute("rootId", rootId);
+		model.addAttribute("dynValues", dynValues);
+		// 传递只读标识
+		model.addAttribute("readOnly", true);
+
+		// 获取阅读量和点赞量
+		if (StringUtils.isNotBlank(shareInfo.getId())) {
+			model.addAttribute("readCount", readLikeService.getReadCount(shareInfo.getId()));
+			model.addAttribute("likeCount", readLikeService.getLikeCount(shareInfo.getId()));
+		}
+
+		// 加载审核记录(审核中、审核通过、审核未通过状态时展示)
+		String auditStatus = shareInfo.getAuditStatus();
+		if (auditStatus != null && (auditStatus.equals("1") || auditStatus.equals("2") || auditStatus.equals("4") || auditStatus.equals("5"))) {
+			model.addAttribute("auditRecords", workKnowledgeBaseShareService.findAuditRecordsByFileId(shareInfo.getId()));
+		}
+
+		// 查询treeName,判断是否为需要评分的特殊分类或问答答疑分类
+		// 注意:必须使用文件本身的treeNodeId,而不是请求参数中的(可能是父节点或空)
+		WorkKnowledgeBaseShareInfo workKnowledgeBaseShareInfo = workKnowledgeBaseShareService.get(shareInfo.getId());
+		if (StringUtils.isNotBlank(workKnowledgeBaseShareInfo.getTreeNodeId())) {
+			WorkKnowledgeBaseTreeInfo treeInfo = workKnowledgeBaseShareService.getTreeInfoById(workKnowledgeBaseShareInfo.getTreeNodeId());
+			if (treeInfo != null) {
+				String treeName = treeInfo.getTreeName();
+				model.addAttribute("treeName", treeName);
+
+				// 判断是否为问答答疑分类
+				boolean isQaCategory = "问答答疑".equals(treeName);
+				model.addAttribute("isQaCategory", isQaCategory);
+
+				// 如果是技术总结或培训心得,查询对应的积分规则
+				if ("技术总结".equals(treeName) || "培训心得".equals(treeName)) {
+					// 根据treeName查询work_knowledge_point_category表获取categoryId
+					List<WorkKnowledgePointCategory> categories = workKnowledgeBaseShareService.findCategoriesByName(treeName);
+					if (categories != null && !categories.isEmpty()) {
+						String categoryId = categories.get(0).getId();
+						// 查询该分类下rule_type=2(创建积分)的规则
+						WorkKnowledgeBasePointRule rule = pointRuleService.findByCategoryIdAndRuleType(categoryId, "1");
+						if (rule != null) {
+							model.addAttribute("pointRule", rule);
+						}
+					}
+				}
+			}
+		}
+
+		return "modules/WorkKnowledgeBase/workKnowledgeBaseShareDetail";
+	}
+
+	/**
 	 * 论坛加入申请
 	 * @param workProjectNotify
 	 * @param model

+ 39 - 0
src/main/webapp/webpage/modules/sys/sysHome.jsp

@@ -874,6 +874,42 @@
             });
 
         }
+        /** 打开确认最佳答案页面(带提交/关闭按钮) */
+        function openConfirmAnswerDialog(title,url,width,height) {
+            if (navigator.userAgent.match(/(iPhone|iPod|Android|ios)/i)) {
+                var width = 'auto';
+                var height = 'auto';
+            } else {
+                var width = '80%';
+                var height = '80%';
+            }
+            top.layer.open({
+                type: 2,
+                area: [width, height],
+                title: title,
+                maxmin: true,
+                content: url,
+                skin: 'three-btns',
+                btn: ['提交', '关闭'],
+                btn1: function(index, layero) {
+                    var body = top.layer.getChildFrame('body', index);
+                    var iframeWin = layero.find('iframe')[0];
+                    var inputForm = body.find('#inputForm');
+                    inputForm.attr('target', '_self');
+                    if (iframeWin.contentWindow.doSubmit(1)) {
+                        setTimeout(function() {
+                            top.layer.close(index);
+                            // 弹窗关闭后刷新右侧列表
+                            window.location.reload();
+                        }, 300);
+                    }
+                },
+                btn2: function(index) {
+                    top.layer.close(index);
+                    window.location.reload();
+                }
+            });
+        }
     </script>
     <style>
         body{
@@ -1261,6 +1297,9 @@
         <c:when test="${workProjectNotify.remarks eq '待审批' && workProjectNotify.status != 1 }">
         xml = "<a  href=\"javascript:void(0)\" onclick=\"top.openTab('${ctx}/workprojectnotify/workProjectNotify/form?id=${workProjectNotify.id}','${fns:getDictLabel(workProjectNotify.type, 'project_notify_type', '')}待审批', false)\">";
         </c:when>
+        <c:when test="${workProjectNotify.type eq 199}">
+        xml = "<a href=\"javascript:void(0)\" onclick=\"openConfirmAnswerDialog('确认最佳答案','${ctx}/workprojectnotify/workProjectNotify/form?id=${workProjectNotify.id}','95%','95%')\">";
+        </c:when>
         <c:otherwise>
         xml = "<a  href=\"javascript:void(0)\" onclick=\"homeOpenDialogView('查看通知', '${ctx}/workprojectnotify/workProjectNotify/form?id=${workProjectNotify.id}','95%','95%')\">";
         </c:otherwise>

+ 43 - 0
src/main/webapp/webpage/modules/workprojectnotify/workProjectNotifyReadShowList.jsp

@@ -130,6 +130,43 @@
                 },
             });
         }
+
+
+		/** 打开确认最佳答案页面(带提交/关闭按钮) */
+		function openConfirmAnswerDialog(title,url,width,height) {
+			if (navigator.userAgent.match(/(iPhone|iPod|Android|ios)/i)) {
+				var width = 'auto';
+				var height = 'auto';
+			} else {
+				var width = '80%';
+				var height = '80%';
+			}
+			top.layer.open({
+				type: 2,
+				area: [width, height],
+				title: title,
+				maxmin: true,
+				content: url,
+				skin: 'three-btns',
+				btn: ['提交', '关闭'],
+				btn1: function(index, layero) {
+					var body = top.layer.getChildFrame('body', index);
+					var iframeWin = layero.find('iframe')[0];
+					var inputForm = body.find('#inputForm');
+					inputForm.attr('target', '_self');
+					if (iframeWin.contentWindow.doSubmit(1)) {
+						setTimeout(function() {
+							top.layer.close(index);
+							// 弹窗关闭后刷新右侧列表
+							search();
+						}, 300);
+					}
+				},
+				btn2: function(index) {
+					top.layer.close(index);
+				}
+			});
+		}
 	</script>
 	<style>
 		body{
@@ -368,6 +405,12 @@
 							}
 
                         }
+						else if(d.type == "199"){
+							return "<a class=\"attention-info\"  href=\"javascript:void(0)\" onclick=\"openConfirmAnswerDialog('确认最佳答案', '${ctx}/workprojectnotify/workProjectNotify/form?id="+d.id+"','95%','95%')\">" +
+									"<span title=\""+ d.title +"\">"+ d.title +"</span>" +
+									"</a>";
+
+						}
                         else{
                         	if (d.isreply == "2"){
 								return "<a class=\"attention-info\"  href=\"javascript:void(0)\" onclick=\"openDialogView('查看通知', '${ctx}/workprojectnotify/workProjectNotify/form?id="+d.id+"','95%','95%')\">" +