Prechádzať zdrojové kódy

知识库积分部分功能提交,专家管理功能

徐滕 4 týždňov pred
rodič
commit
9848dab50b

+ 36 - 0
src/main/java/com/jeeplus/modules/WorkKnowledgeBase/entity/WorkKnowledgeExpert.java

@@ -1,6 +1,9 @@
 package com.jeeplus.modules.WorkKnowledgeBase.entity;
 
 import com.jeeplus.common.persistence.DataEntity;
+import com.jeeplus.modules.sys.entity.Office;
+
+import java.util.List;
 
 /**
  * 知识库专家审核人员实体
@@ -39,6 +42,15 @@ public class WorkKnowledgeExpert extends DataEntity<WorkKnowledgeExpert> {
     /** 所属部门id */
     private String officeId;
 
+    /** 所属部门对象(用于查询条件绑定) */
+    private transient Office office;
+
+    /** 系统用户姓名(瞬态字段,仅用于表单显示) */
+    private transient String userName;
+
+    /** 部门ID列表(用于查询时包含子部门,瞬态字段) */
+    private transient List<String> officeIdList;
+
     public WorkKnowledgeExpert() {
         super();
         this.status = "1";
@@ -120,4 +132,28 @@ public class WorkKnowledgeExpert extends DataEntity<WorkKnowledgeExpert> {
     public void setOfficeId(String officeId) {
         this.officeId = officeId;
     }
+
+    public String getUserName() {
+        return userName;
+    }
+
+    public void setUserName(String userName) {
+        this.userName = userName;
+    }
+
+    public List<String> getOfficeIdList() {
+        return officeIdList;
+    }
+
+    public void setOfficeIdList(List<String> officeIdList) {
+        this.officeIdList = officeIdList;
+    }
+
+    public Office getOffice() {
+        return office;
+    }
+
+    public void setOffice(Office office) {
+        this.office = office;
+    }
 }

+ 58 - 2
src/main/java/com/jeeplus/modules/WorkKnowledgeBase/web/WorkKnowledgeExpertController.java

@@ -9,6 +9,10 @@ import com.jeeplus.common.utils.StringUtils;
 import com.jeeplus.common.web.BaseController;
 import com.jeeplus.modules.WorkKnowledgeBase.entity.WorkKnowledgeExpert;
 import com.jeeplus.modules.WorkKnowledgeBase.service.WorkKnowledgeExpertService;
+import com.jeeplus.modules.sys.entity.Office;
+import com.jeeplus.modules.sys.entity.User;
+import com.jeeplus.modules.sys.service.OfficeService;
+import com.jeeplus.modules.sys.utils.UserUtils;
 import org.apache.shiro.authz.annotation.RequiresPermissions;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Controller;
@@ -36,6 +40,9 @@ public class WorkKnowledgeExpertController extends BaseController {
     @Autowired
     private WorkKnowledgeExpertService expertService;
 
+    @Autowired
+    private OfficeService officeService;
+
     /**
      * 获取单条专家数据
      */
@@ -53,6 +60,25 @@ public class WorkKnowledgeExpertController extends BaseController {
     @RequiresPermissions("workKnowledgeBase:expert:list")
     @RequestMapping(value = {"list", ""})
     public String list(WorkKnowledgeExpert expert, HttpServletRequest request, HttpServletResponse response, Model model) {
+        // 处理部门查询逻辑(区分一部本部和苏州分部)
+        if (expert.getOffice() != null && StringUtils.isNotBlank(expert.getOffice().getId())) {
+            String officeId = expert.getOffice().getId();
+            if ("一部本部".equals(officeId)) {
+                // 一部本部特殊处理:查询“工程一部”及其子部门
+                Office office = officeService.getByName("工程一部");
+                if (office != null) {
+                    List<String> officeIdList = Lists.newArrayList();
+                    officeIdList.add(office.getId());
+                    expert.setOfficeIdList(officeIdList);
+                }
+            } else {
+                // 其他部门:查询该节点及其所有子部门
+                List<String> officeIdList = officeService.getChildrenOffice(officeId);
+                officeIdList.add(officeId);
+                expert.setOfficeIdList(officeIdList);
+            }
+        }
+
         // 分页查询专家列表
         Page<WorkKnowledgeExpert> page = expertService.findPage(new Page<>(request, response), expert);
         model.addAttribute("page", page);
@@ -72,6 +98,13 @@ public class WorkKnowledgeExpertController extends BaseController {
         if (expert.getSort() == null) {
             expert.setSort("0");
         }
+        // 编辑模式下,解析系统用户姓名用于表单回显
+        if (StringUtils.isNotBlank(expert.getUserId())) {
+            User user = UserUtils.get(expert.getUserId());
+            if (user != null) {
+                expert.setUserName(user.getName());
+            }
+        }
         model.addAttribute("expert", expert);
         return "modules/WorkKnowledgeBase/workKnowledgeExpertForm";
     }
@@ -83,11 +116,16 @@ public class WorkKnowledgeExpertController extends BaseController {
     @RequestMapping(value = "save")
     public String save(WorkKnowledgeExpert expert, Model model, RedirectAttributes redirectAttributes) {
         try {
-            // 保存专家信息
+            // 从绑定的系统用户获取姓名,自动填充专家姓名
+            if (StringUtils.isNotBlank(expert.getUserId())) {
+                User user = UserUtils.get(expert.getUserId());
+                if (user != null) {
+                    expert.setExpertName(user.getName());
+                }
+            }
             expertService.save(expert);
             addMessage(redirectAttributes, "保存专家成功");
         } catch (IllegalArgumentException e) {
-            // 捕获业务异常,返回表单页面并显示错误信息
             addMessage(model, e.getMessage());
             model.addAttribute("expert", expert);
             return "modules/WorkKnowledgeBase/workKnowledgeExpertForm";
@@ -135,6 +173,24 @@ public class WorkKnowledgeExpertController extends BaseController {
     }
 
     /**
+     * 根据系统用户ID获取联系电话
+     */
+    @ResponseBody
+    @RequestMapping(value = "getUserPhone")
+    public AjaxJson getUserPhone(@RequestParam("userId") String userId) {
+        AjaxJson j = new AjaxJson();
+        try {
+            User user = UserUtils.get(userId);
+            if (user != null) {
+                j.put("phone", user.getMobile() != null ? user.getMobile() : "");
+            }
+        } catch (Exception e) {
+            j.put("phone", "");
+        }
+        return j;
+    }
+
+    /**
      * 专家下拉选择接口(仅返回启用的专家)
      * 用于文档审核页面选择审核人
      */

+ 15 - 0
src/main/resources/mappings/modules/WorkKnowledgeBase/WorkKnowledgeExpertDao.xml

@@ -52,6 +52,21 @@
             <if test="status != null and status != ''">
                 AND a.status = #{status}
             </if>
+            <!-- 用户ID精确查询(专家姓名选择器传入) -->
+            <if test="userId != null and userId != ''">
+                AND a.user_id = #{userId}
+            </if>
+            <!-- 部门查询(包含子部门) -->
+            <if test="officeIdList != null and officeIdList.size() > 0">
+                AND su.office_id IN
+                <foreach item="officeIdItem" collection="officeIdList" open="(" separator="," close=")">
+                    #{officeIdItem}
+                </foreach>
+            </if>
+
+            <if test="office!=null and office.id=='' and office.name!=null and office.name!='' ">
+                and  so.name like concat('%',#{office.name},'%')
+            </if>
         </where>
         ORDER BY a.sort ASC, a.create_date DESC
     </select>

+ 51 - 121
src/main/webapp/webpage/modules/WorkKnowledgeBase/workKnowledgeExpertForm.jsp

@@ -18,55 +18,27 @@
             return false;
         }
 
-        /**
-         * 选择系统用户回调函数
-         */
-        function selectUserInfo(data) {
-            if (data && data.userId) {
-                // 填充隐藏的用户ID
-                $("#userId").val(data.userId);
-                // 填充专家姓名(从sys_user.name获取)
-                $("#expertName").val(data.name).attr("readonly", "readonly");
-                // 填充联系电话(从sys_user.mobile获取)
-                $("#phone").val(data.mobile || '').attr("readonly", "readonly");
-                // 显示提示信息
-                top.layer.msg("已选择用户:" + data.name, {icon: 1, time: 1500});
-            }
-        }
 
-        /**
-         * 打开用户选择弹窗
-         */
-        function openUserSelect() {
-            top.layer.open({
-                type: 2,
-                area: ['90%', '90%'],
-                title: "选择系统用户",
-                skin: "two-btns",
-                maxmin: true,
-                content: encodeURI("${ctx}/sys/office/gridSelectUser?url=${ctx}/sys/office/gridSelectUser&isAll=true&type=null&isSingle=true"),
-                btn: ['确定', '关闭'],
-                yes: function(index, layero){
-                    var iframeWin = layero.find('iframe')[0].contentWindow;
-                    var item = iframeWin.getSelectedItem();
-                    if(item == "-1"){
-                        return;
-                    }
-                    selectUserInfo(item);
-                    top.layer.close(index);
-                },
-                cancel: function(index){
-                }
-            });
-        }
 
         /**
-         * 清除用户选择
+         * 根据用户ID获取联系电话
          */
-        function clearUserSelect() {
-            $("#userId").val("");
-            $("#expertName").val("").removeAttr("readonly");
-            $("#phone").val("").removeAttr("readonly");
+        function fetchUserPhone(userId) {
+            if (userId) {
+                $.ajax({
+                    url: "${ctx}/workKnowledgeBase/expert/getUserPhone",
+                    type: "GET",
+                    data: { userId: userId },
+                    success: function(result) {
+                        if (result && result.phone !== undefined) {
+                            $("#phone").val(result.phone);
+                        }
+                    },
+                    error: function() {
+                        console.log("获取用户电话失败");
+                    }
+                });
+            }
         }
 
         $(document).ready(function() {
@@ -76,10 +48,6 @@
                     userId: {
                         required: true
                     },
-                    expertName: {
-                        required: true,
-                        maxlength: 50
-                    },
                     phone: {
                         maxlength: 20
                     },
@@ -91,10 +59,6 @@
                     userId: {
                         required: "请选择绑定的系统用户"
                     },
-                    expertName: {
-                        required: "请输入专家姓名",
-                        maxlength: "专家姓名不能超过50个字符"
-                    },
                     phone: {
                         maxlength: "联系电话不能超过20个字符"
                     },
@@ -117,10 +81,19 @@
                 }
             });
 
-            // 如果已有userId(编辑场景),禁用用户选择按钮
-            <c:if test="${not empty workKnowledgeExpert.userId}">
-                $("#selectUserBtn").attr("disabled", "disabled").addClass("disabled");
-                top.layer.msg("编辑模式下不可修改绑定用户", {icon: 0, time: 2000});
+            // 监听用户选择变化,自动填充联系电话
+            $("#userIdId").on("change", function() {
+                var userId = $(this).val();
+                if (userId) {
+                    fetchUserPhone(userId);
+                } else {
+                    $("#phone").val("");
+                }
+            });
+
+            // 编辑模式下,如果已有userId,页面加载时获取联系电话
+            <c:if test="${not empty expert.userId}">
+                fetchUserPhone("${expert.userId}");
             </c:if>
         });
     </script>
@@ -130,62 +103,18 @@
     <div class="container">
         <form:form id="inputForm" modelAttribute="workKnowledgeExpert" action="${ctx}/workKnowledgeBase/expert/save" method="post" class="form-horizontal layui-form">
             <form:hidden path="id"/>
-            <!-- 隐藏的系统用户ID字段 -->
-            <input type="hidden" id="userId" name="userId" value="${workKnowledgeExpert.userId}"/>
             
             <sys:message content="${message}"/>
 
             <div class="form-group layui-row first">
                 <div class="form-group-label"><h2>专家基本信息</h2></div>
 
-                <!-- 第一行:选择系统用户 + 专家姓名 -->
+                <!-- 第一行:选择系统用户 + 专业领域 -->
                 <div class="layui-item layui-col-sm6 lw7">
-                    <label class="layui-form-label"><span class="require-item">*</span>绑定系统用户:</label>
+                    <label class="layui-form-label"><span class="require-item">*</span>专家:</label>
                     <div class="layui-input-block with-icon">
-                        <div class="input-group">
-                            <input type="text" id="userNameDisplay" 
-                                   value="<c:if test='${not empty workKnowledgeExpert.userId}'>已绑定用户(不可修改)</c:if>"
-                                   readonly="readonly" 
-                                   class="form-control layui-input"
-                                   placeholder="请点击右侧按钮选择系统用户"/>
-                            <span class="input-group-btn">
-                                <button type="button" id="selectUserBtn" class="btn btn-primary" onclick="openUserSelect()" 
-                                        <c:if test='${not empty workKnowledgeExpert.userId}'>disabled="disabled"</c:if>>
-                                    <i class="fa fa-user"></i> 选择用户
-                                </button>
-                            </span>
-                            <c:if test="${empty workKnowledgeExpert.userId}">
-                                <span class="input-group-btn">
-                                    <button type="button" class="btn btn-default" onclick="clearUserSelect()">
-                                        <i class="fa fa-times"></i> 清除
-                                    </button>
-                                </span>
-                            </c:if>
-                        </div>
-                        <p class="help-block text-muted">选择一个系统用户进行绑定,同一个用户只能绑定一位专家</p>
-                    </div>
-                </div>
-
-                <div class="layui-item layui-col-sm6 lw7">
-                    <label class="layui-form-label"><span class="require-item">*</span>专家姓名:</label>
-                    <div class="layui-input-block">
-                        <input type="text" id="expertName" name="expertName" 
-                               value="${workKnowledgeExpert.expertName}" 
-                               placeholder="选择用户后自动填充" 
-                               readonly="readonly"
-                               class="form-control layui-input required"/>
-                    </div>
-                </div>
-
-                <!-- 第二行:联系电话 + 专业领域 -->
-                <div class="layui-item layui-col-sm6 lw7">
-                    <label class="layui-form-label">联系电话:</label>
-                    <div class="layui-input-block">
-                        <input type="text" id="phone" name="phone" 
-                               value="${workKnowledgeExpert.phone}" 
-                               placeholder="选择用户后自动填充" 
-                               readonly="readonly"
-                               class="form-control layui-input"/>
+                        <sys:treeselect id="userId" name="userId" value="${expert.userId}" labelName="userName" labelValue="${expert.userName}"
+                                        title="用户" url="/sys/office/treeDataAll?type=3" cssClass="form-control layui-input required" allowClear="true" notAllowSelectParent="true"/>
                     </div>
                 </div>
 
@@ -198,22 +127,13 @@
                     </div>
                 </div>
 
-                <!-- 第三行:专家简介(全宽) -->
-                <div class="layui-item layui-col-sm12">
-                    <label class="layui-form-label">专家简介:</label>
-                    <div class="layui-input-block">
-                        <form:textarea path="introduction" placeholder="请输入专家简介、擅长审核的文档类型等" 
-                                       htmlEscape="false" rows="4" 
-                                       class="form-control layui-textarea"/>
-                    </div>
-                </div>
 
                 <!-- 第四行:排序号 + 状态 -->
                 <div class="layui-item layui-col-sm6 lw7">
-                    <label class="layui-form-label">排序:</label>
+                    <label class="layui-form-label">排序:</label>
                     <div class="layui-input-block">
-                        <form:input path="sort" placeholder="数值越小越靠前" 
-                                    htmlEscape="false" maxlength="10" 
+                        <form:input path="sort" placeholder="数值越小越靠前"
+                                    htmlEscape="false" maxlength="10"
                                     class="form-control layui-input digits"/>
                     </div>
                 </div>
@@ -222,16 +142,26 @@
                     <label class="layui-form-label">状态:</label>
                     <div class="layui-input-block" style="display:flex; align-items:center; height:38px;">
                         <label style="display:inline-flex; align-items:center; margin-right:30px; cursor:pointer;">
-                            <input type="radio" name="status" value="1" style="margin-right:5px;" 
-                                   ${workKnowledgeExpert.status == "1" || workKnowledgeExpert.status == null ? 'checked' : ''}/> 启用
+                            <input type="radio" name="status" value="1" style="margin-right:5px;"
+                                ${expert.status == "1" || expert.status == null ? 'checked' : ''}/> 启用
                         </label>
                         <label style="display:inline-flex; align-items:center; cursor:pointer;">
-                            <input type="radio" name="status" value="0" style="margin-right:5px;" 
-                                   ${workKnowledgeExpert.status == "0" ? 'checked' : ''}/> 禁用
+                            <input type="radio" name="status" value="0" style="margin-right:5px;"
+                                ${expert.status == "0" ? 'checked' : ''}/> 禁用
                         </label>
                     </div>
                 </div>
 
+                <!-- 第三行:专家简介(全宽) -->
+                <div class="layui-item layui-col-sm12 lw7">
+                    <label class="layui-form-label">专家简介:</label>
+                    <div class="layui-input-block">
+                        <form:textarea path="introduction" placeholder="请输入专家简介、擅长审核的文档类型等" 
+                                       htmlEscape="false" rows="4" 
+                                       class="form-control layui-textarea"/>
+                    </div>
+                </div>
+
             </div>
 
             <div class="form-group layui-row page-end"></div>

+ 24 - 12
src/main/webapp/webpage/modules/WorkKnowledgeBase/workKnowledgeExpertList.jsp

@@ -28,6 +28,7 @@
 		function resetSearch() {
 			$('#searchForm input[type=text]').val('');
 			$('#searchForm select').val('');
+			$('#searchForm input[type=hidden]').val('');
 			$('#searchForm').submit();
 		}
 
@@ -140,15 +141,35 @@
 						<div class="layui-item query athird">
 							<label class="layui-form-label">专家姓名:</label>
 							<div class="layui-input-block with-icon">
-								<input type="text" name="expertName" value="${workKnowledgeExpert.expertName}"
-								       placeholder="专家姓名模糊查询" class="form-control layui-input"/>
+								<sys:inquireselectUserNotReadolny id="userId" name="userId" value="${workKnowledgeExpert.userId}" labelName="expertName" labelValue="${workKnowledgeExpert.expertName}" cssStyle="background-color: #fff"
+																	  title="用户" url="/sys/office/treeDataAll?type=3" cssClass="form-control layui-input" allowClear="true" notAllowSelectParent="true"/>
 							</div>
 						</div>
 						<div class="layui-item query athird">
+							<label class="layui-form-label">部门:</label>
+							<div class="layui-input-block with-icon">
+								<sys:treeselectMoHu id="officeId" name="office.id" value="${workKnowledgeExpert.office.id}" labelName="office.name" labelValue="${workKnowledgeExpert.office.name}"
+																		title="部门" url="/sys/office/treeDataAll?type=6" cssClass="form-control layui-input" allowClear="true" notAllowSelectParent="false"/>
+							</div>
+						</div>
+
+						<div class="layui-item athird">
+							<div class="input-group">
+								<a href="#" id="moresee"><i class="glyphicon glyphicon-menu-down"></i></a>
+								<div class="layui-btn-group search-spacing">
+									<button id="searchQuery" class="layui-btn layui-btn-sm layui-bg-blue" onclick="return search()">查询</button>
+									<button id="searchReset" class="layui-btn layui-btn-sm" onclick="resetSearch()">重置</button>
+								</div>
+							</div>
+						</div>
+						<div style="clear:both;"></div>
+					</div>
+					<div id="moresees" style="clear:both;display:none;" class="lw7">
+						<div class="layui-item query athird">
 							<label class="layui-form-label">专业领域:</label>
 							<div class="layui-input-block with-icon">
 								<input type="text" name="professionalField" value="${workKnowledgeExpert.professionalField}"
-								       placeholder="专业领域模糊查询" class="form-control layui-input"/>
+									   placeholder="专业领域模糊查询" class="form-control layui-input"/>
 							</div>
 						</div>
 						<div class="layui-item query athird">
@@ -161,15 +182,6 @@
 								</select>
 							</div>
 						</div>
-						<div class="layui-item athird">
-							<div class="input-group">
-								<a href="#" id="moresee"><i class="glyphicon glyphicon-menu-down"></i></a>
-								<div class="layui-btn-group search-spacing">
-									<button id="searchQuery" class="layui-btn layui-btn-sm layui-bg-blue" onclick="return search()">查询</button>
-									<button id="searchReset" class="layui-btn layui-btn-sm" onclick="resetSearch()">重置</button>
-								</div>
-							</div>
-						</div>
 						<div style="clear:both;"></div>
 					</div>
 				</form:form>