浏览代码

工作类型列表修改为树形图结构

user5 5 年之前
父节点
当前提交
1308d8aabb

+ 10 - 0
src/main/java/com/jeeplus/modules/projectcontentinfo/dao/ProjectcontentinfoDao.java

@@ -5,6 +5,7 @@ package com.jeeplus.modules.projectcontentinfo.dao;
 
 import com.jeeplus.common.persistence.CrudDao;
 import com.jeeplus.common.persistence.annotation.MyBatisDao;
+import com.jeeplus.modules.projectcontentinfo.entity.ProjectContentTreeData;
 import com.jeeplus.modules.projectcontentinfo.entity.Projectcontentinfo;
 import com.jeeplus.modules.ruralprojectrecords.entity.RuralProjectcontentinfo;
 import org.apache.ibatis.annotations.Param;
@@ -49,4 +50,13 @@ public interface ProjectcontentinfoDao extends CrudDao<Projectcontentinfo> {
 	void insertOnRural(Projectcontentinfo projectcontentinfo);
 
 	void updateInfoId(Projectcontentinfo projectcontentinfo);
+
+	/**
+	 * 根据项目id查询工作内容信息Tree
+	 * @param projectId
+	 * @return
+	 */
+	List<ProjectContentTreeData> getProjectContentData(String projectId);
+
+	List<ProjectContentTreeData> getProjectContentTreeData(@Param("projectId") String projectId,@Param("type") String type);
 }

+ 94 - 0
src/main/java/com/jeeplus/modules/projectcontentinfo/entity/ProjectContentTreeData.java

@@ -0,0 +1,94 @@
+package com.jeeplus.modules.projectcontentinfo.entity;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+
+import java.util.Date;
+
+/**
+ * 工作内容树形图类型表
+ */
+public class ProjectContentTreeData {
+    private String id;        //id
+    private String number;    //编号
+    private String name;      //名称
+    private String type;      //类型
+    private String masterName;//负责人
+    private Date createDate;//创建时间
+    private String pid;       //父级id
+
+    private String loginId;//登陆者id
+    private String createId;//创建者id
+
+    public String getId() {
+        return id;
+    }
+
+    public void setId(String id) {
+        this.id = id;
+    }
+
+    public String getNumber() {
+        return number;
+    }
+
+    public void setNumber(String number) {
+        this.number = number;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getType() {
+        return type;
+    }
+
+    public void setType(String type) {
+        this.type = type;
+    }
+
+    public String getMasterName() {
+        return masterName;
+    }
+
+    public void setMasterName(String masterName) {
+        this.masterName = masterName;
+    }
+
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    public Date getCreateDate() {
+        return createDate;
+    }
+
+    public void setCreateDate(Date createDate) {
+        this.createDate = createDate;
+    }
+
+    public String getPid() {
+        return pid;
+    }
+
+    public void setPid(String pid) {
+        this.pid = pid;
+    }
+
+    public String getLoginId() {
+        return loginId;
+    }
+
+    public void setLoginId(String loginId) {
+        this.loginId = loginId;
+    }
+
+    public String getCreateId() {
+        return createId;
+    }
+
+    public void setCreateId(String createId) {
+        this.createId = createId;
+    }
+}

+ 19 - 0
src/main/java/com/jeeplus/modules/projectcontentinfo/service/ProjectcontentinfoService.java

@@ -80,6 +80,8 @@ public class ProjectcontentinfoService extends CrudService<ProjectcontentinfoDao
 	private ISignatureDocumentService signatureDocumentService;
 	@Autowired
 	private ProjectReportNumService projectReportNumService;
+	@Autowired
+	private ProjectcontentinfoDao projectcontentinfoDao;
 
 	private static MainDictDetailDao mainDictDetailDao = SpringContextHolder.getBean(MainDictDetailDao.class);
 
@@ -1393,4 +1395,21 @@ public class ProjectcontentinfoService extends CrudService<ProjectcontentinfoDao
 		return dictList;
 	}
 
+	/**
+	 * 根据项目id查询工作内容信息Tree
+	 * @param projectId
+	 * @return
+	 */
+	public List<ProjectContentTreeData> getProjectContentData(String projectId){
+		return projectcontentinfoDao.getProjectContentData(projectId);
+	}
+	/**
+	 * 根据项目id查询工作内容信息Tree
+	 * @param projectId
+	 * @return
+	 */
+	public List<ProjectContentTreeData> getProjectContentTreeData(String projectId,String type){
+		return projectcontentinfoDao.getProjectContentTreeData(projectId,type);
+	}
+
 }

+ 37 - 8
src/main/java/com/jeeplus/modules/projectcontentinfo/web/ProjectcontentinfoController.java

@@ -13,10 +13,7 @@ import com.jeeplus.common.utils.StringUtils;
 import com.jeeplus.common.web.BaseController;
 import com.jeeplus.modules.act.entity.Act;
 import com.jeeplus.modules.act.service.ActTaskService;
-import com.jeeplus.modules.projectcontentinfo.entity.ProjectBasedData;
-import com.jeeplus.modules.projectcontentinfo.entity.ProjectContentData;
-import com.jeeplus.modules.projectcontentinfo.entity.ProjectReportData;
-import com.jeeplus.modules.projectcontentinfo.entity.Projectcontentinfo;
+import com.jeeplus.modules.projectcontentinfo.entity.*;
 import com.jeeplus.modules.projectcontentinfo.service.*;
 import com.jeeplus.modules.projectcontroltable.entity.ProjectControlTable;
 import com.jeeplus.modules.projectcontroltable.service.ProjectControlTableService;
@@ -28,6 +25,7 @@ import com.jeeplus.modules.sys.entity.User;
 import com.jeeplus.modules.sys.utils.DictUtils;
 import com.jeeplus.modules.sys.utils.UserUtils;
 import com.jeeplus.modules.workclientinfo.entity.WorkClientLinkman;
+import com.jeeplus.modules.workcontent.web.WorkContentTypeController;
 import com.jeeplus.modules.workcontractinfo.entity.WorkContractInfo;
 import com.jeeplus.modules.workreview.entity.WorkReviewAudit;
 import com.jeeplus.modules.workreview.service.WorkReviewStandardService;
@@ -47,10 +45,7 @@ import org.springframework.web.servlet.mvc.support.RedirectAttributes;
 
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
 
 /**
  * 工作内容管理Controller
@@ -1496,4 +1491,38 @@ public class ProjectcontentinfoController extends BaseController {
 		return  ajaxJson;
 	}
 
+	/**
+	 * 根据项目id查询工作内容信息Tree
+	 * @param projectId
+	 * @return
+	 */
+	@RequestMapping("getProjectContentTreeData")
+	@ResponseBody
+	public Map<String,List> getProjectContentTreeData(String projectId){
+		Map<String,List> map = new HashMap<>();
+		List<ProjectContentTreeData> projectContentDataList = projectcontentinfoService.getProjectContentData(projectId);
+		List<ProjectContentTreeData> projectContentTreeDataList = new ArrayList<>();
+		if (null != projectContentDataList) {
+            User user = UserUtils.getUser();
+            for (ProjectContentTreeData projectContentData : projectContentDataList) {
+				String contentTypeName = WorkContentTypeController.getContentTypeName(projectContentData.getType(), "");
+				ProjectContentTreeData projectContentTreeData = new ProjectContentTreeData();
+				projectContentTreeData.setType(contentTypeName);
+				projectContentTreeData.setId(projectContentData.getType());
+				projectContentTreeData.setPid("0");
+                projectContentTreeData.setLoginId(user.getId());
+                projectContentTreeData.setCreateId("");
+				List<ProjectContentTreeData> projectContentTreeDatas = projectcontentinfoService.getProjectContentTreeData(projectId, projectContentData.getType());
+				for (ProjectContentTreeData data : projectContentTreeDatas) {
+					data.setType(contentTypeName);
+                    data.setLoginId(user.getId());
+				}
+				projectContentTreeDataList.add(projectContentTreeData);
+				projectContentTreeDataList.addAll(projectContentTreeDatas);
+			}
+		}
+		map.put("data",projectContentTreeDataList);
+		return map;
+	}
+
 }

+ 23 - 0
src/main/resources/mappings/modules/projectcontentinfo/ProjectcontentinfoDao.xml

@@ -135,6 +135,29 @@
 		</choose>
 	</select>
 
+	<select id="getProjectContentData" resultType="com.jeeplus.modules.projectcontentinfo.entity.ProjectContentTreeData" >
+		select DISTINCT a.type as "type"
+		from project_content_data a
+		<where>
+			a.del_flag = 0
+			AND a.project_id = #{projectId}
+		</where>
+	</select>
+
+	<select id="getProjectContentTreeData" resultType="com.jeeplus.modules.projectcontentinfo.entity.ProjectContentTreeData" >
+		select a.id as "id",
+		a.create_date as "createDate",a.create_by as "createId",
+		a.name as "name", a.number as "number", a.type as "type",a.type as "pid", su.name as "masterName"
+		from project_content_data a
+		left join sys_user su on su.id = a.master
+		<where>
+			a.del_flag = 0
+			AND a.project_id = #{projectId}
+			and a.type = #{type}
+		</where>
+		order by a.update_date desc
+	</select>
+
 
 	<select id="findByType" resultType="Projectcontentinfo" >
 		SELECT

+ 18 - 0
src/main/webapp/static/layer-v2.3/layui/tableTree/treetable.css

@@ -0,0 +1,18 @@
+.treeTable-empty {
+    width: 20px;
+    display: inline-block;
+}
+
+.treeTable-icon {
+    font-size: 14px;
+    cursor: pointer;
+}
+
+.treeTable-icon .layui-icon-triangle-d:before {
+    content: "\e623";
+}
+
+.treeTable-icon.open .layui-icon-triangle-d:before {
+    content: "\e625";
+}
+

+ 206 - 0
src/main/webapp/static/layer-v2.3/layui/tableTree/treetable.js

@@ -0,0 +1,206 @@
+layui.define(['layer', 'table'], function (exports) {
+    var $ = layui.jquery;
+    var layer = layui.layer;
+    var table = layui.table;
+
+    var treetable = {
+        // 渲染树形表格
+        render: function (param) {
+            // 检查参数
+            if (!treetable.checkParam(param)) {
+                return;
+            }
+            // 获取数据
+            if (param.data) {
+                treetable.init(param, param.data);
+            } else {
+                $.getJSON(param.url, param.where, function (res) {
+                    treetable.init(param, res.data);
+                });
+            }
+        },
+        // 渲染表格
+        init: function (param, data) {
+            var mData = [];
+            var doneCallback = param.done;
+            var tNodes = data;
+            // 补上id和pid字段
+            for (var i = 0; i < tNodes.length; i++) {
+                var tt = tNodes[i];
+                if (!tt.id) {
+                    if (!param.treeIdName) {
+                        layer.msg('参数treeIdName不能为空', {icon: 5});
+                        return;
+                    }
+                    tt.id = tt[param.treeIdName];
+                }
+                if (!tt.pid) {
+                    if (!param.treePidName) {
+                        layer.msg('参数treePidName不能为空', {icon: 5});
+                        return;
+                    }
+                    tt.pid = tt[param.treePidName];
+                }
+            }
+
+            // 对数据进行排序
+            var sort = function (s_pid, data) {
+                for (var i = 0; i < data.length; i++) {
+                    if (data[i].pid == s_pid) {
+                        var len = mData.length;
+                        if (len > 0 && mData[len - 1].id == s_pid) {
+                            mData[len - 1].isParent = true;
+                        }
+                        mData.push(data[i]);
+                        sort(data[i].id, data);
+                    }
+                }
+            };
+            sort(param.treeSpid, tNodes);
+
+            // 重写参数
+            param.url = undefined;
+            param.data = mData;
+            param.page = {
+                count: param.data.length,
+                limit: param.data.length
+            };
+            param.cols[0][param.treeColIndex].templet = function (d) {
+                var mId = d.id;
+                var mPid = d.pid;
+                var isDir = d.isParent;
+                var emptyNum = treetable.getEmptyNum(mPid, mData);
+                var iconHtml = '';
+                for (var i = 0; i < emptyNum; i++) {
+                    iconHtml += '<span class="treeTable-empty"></span>';
+                }
+                if (isDir) {
+                    iconHtml += '<i class="layui-icon layui-icon-triangle-d"></i> <i class="layui-icon layui-icon-layer"></i>';
+                } else {
+                    iconHtml += '<i class="layui-icon layui-icon-file"></i>';
+                }
+                iconHtml += '&nbsp;&nbsp;';
+                var ttype = isDir ? 'dir' : 'file';
+                var vg = '<span class="treeTable-icon open" lay-tid="' + mId + '" lay-tpid="' + mPid + '" lay-ttype="' + ttype + '">';
+                return vg + iconHtml + d[param.cols[0][param.treeColIndex].field] + '</span>'
+            };
+
+            param.done = function (res, curr, count) {
+                $(param.elem).next().addClass('treeTable');
+                $('.treeTable .layui-table-page').css('display', 'none');
+                $(param.elem).next().attr('treeLinkage', param.treeLinkage);
+                // 绑定事件换成对body绑定
+                /*$('.treeTable .treeTable-icon').click(function () {
+                    treetable.toggleRows($(this), param.treeLinkage);
+                });*/
+                if (param.treeDefaultClose) {
+                    treetable.foldAll(param.elem);
+                }
+                if (doneCallback) {
+                    doneCallback(res, curr, count);
+                }
+            };
+
+            // 渲染表格
+            table.render(param);
+        },
+        // 计算缩进的数量
+        getEmptyNum: function (pid, data) {
+            var num = 0;
+            if (!pid) {
+                return num;
+            }
+            var tPid;
+            for (var i = 0; i < data.length; i++) {
+                if (pid == data[i].id) {
+                    num += 1;
+                    tPid = data[i].pid;
+                    break;
+                }
+            }
+            return num + treetable.getEmptyNum(tPid, data);
+        },
+        // 展开/折叠行
+        toggleRows: function ($dom, linkage) {
+            var type = $dom.attr('lay-ttype');
+            if ('file' == type) {
+                return;
+            }
+            var mId = $dom.attr('lay-tid');
+            var isOpen = $dom.hasClass('open');
+            if (isOpen) {
+                $dom.removeClass('open');
+            } else {
+                $dom.addClass('open');
+            }
+            $dom.closest('tbody').find('tr').each(function () {
+                var $ti = $(this).find('.treeTable-icon');
+                var pid = $ti.attr('lay-tpid');
+                var ttype = $ti.attr('lay-ttype');
+                var tOpen = $ti.hasClass('open');
+                if (mId == pid) {
+                    if (isOpen) {
+                        $(this).hide();
+                        if ('dir' == ttype && tOpen == isOpen) {
+                            $ti.trigger('click');
+                        }
+                    } else {
+                        $(this).show();
+                        if (linkage && 'dir' == ttype && tOpen == isOpen) {
+                            $ti.trigger('click');
+                        }
+                    }
+                }
+            });
+        },
+        // 检查参数
+        checkParam: function (param) {
+            if (!param.treeSpid && param.treeSpid != 0) {
+                layer.msg('参数treeSpid不能为空', {icon: 5});
+                return false;
+            }
+
+            if (!param.treeColIndex && param.treeColIndex != 0) {
+                layer.msg('参数treeColIndex不能为空', {icon: 5});
+                return false;
+            }
+            return true;
+        },
+        // 展开所有
+        expandAll: function (dom) {
+            $(dom).next('.treeTable').find('.layui-table-body tbody tr').each(function () {
+                var $ti = $(this).find('.treeTable-icon');
+                var ttype = $ti.attr('lay-ttype');
+                var tOpen = $ti.hasClass('open');
+                if ('dir' == ttype && !tOpen) {
+                    $ti.trigger('click');
+                }
+            });
+        },
+        // 折叠所有
+        foldAll: function (dom) {
+            $(dom).next('.treeTable').find('.layui-table-body tbody tr').each(function () {
+                var $ti = $(this).find('.treeTable-icon');
+                var ttype = $ti.attr('lay-ttype');
+                var tOpen = $ti.hasClass('open');
+                if ('dir' == ttype && tOpen) {
+                    $ti.trigger('click');
+                }
+            });
+        }
+    };
+
+    layui.link(layui.cache.base + 'treetable-lay/treetable.css');
+
+    // 给图标列绑定事件
+    $('body').on('click', '.treeTable .treeTable-icon', function () {
+        var treeLinkage = $(this).parents('.treeTable').attr('treeLinkage');
+        if ('true' == treeLinkage) {
+            treetable.toggleRows($(this), true);
+        } else {
+            treetable.toggleRows($(this), false);
+        }
+    });
+
+    exports('treetable', treetable);
+});

+ 108 - 3
src/main/webapp/webpage/modules/projectcontentinfo/projectcontentinfoForm.jsp

@@ -4,6 +4,20 @@
 <head>
 	<title>基本信息</title>
 	<meta name="decorator" content="default"/>
+	<link href="${ctxStatic}/layer-v2.3/layui/tableTree/treetable.css" rel="stylesheet" />
+	<style>
+		.layui-table-box{
+			text-align: center; /* 文字居中 */
+		}
+		.layui-table th{
+			font-size: 14px;
+			/*表头内容居中显示*/
+			text-align: center;
+		}
+		span{
+			font-size: 14px;
+		}
+	</style>
 	<script type="text/javascript">
         $(function(){
             initControlData();
@@ -349,15 +363,24 @@
 					<div class="layui-item nav-btns">
 						<c:if test="${empty change}">
 						<a href="javascript:void(0)" onclick="openDialogWork('新增工作内容', '${ctx}/projectcontentinfo/projectcontentinfo/form?view=content&dictType=${dictType}&id=${id}&parentIds=${parentIds}','95%','95%',false,'inputForm')" class="nav-btn nav-btn-add" ><i class="fa fa-plus"></i>&nbsp; 新增</a>
+							<button class="nav-btn layui-btn" id="btn-expand">全部展开</button>
+							<button class="nav-btn layui-btn-warm" id="btn-fold">全部折叠</button>
+							<button class="nav-btn layui-bg-red" id="btn-refresh">刷新表格</button>
 						</c:if>
 					</div>
+
 					<div class="layui-item layui-col-xs12 form-table-container">
+						<table id="permissionTable" class="layui-table" lay-filter="permissionTable"></table>
+					</div>
+
+
+					<%--<div class="layui-item layui-col-xs12 form-table-container">
 						<table id="contentTable2" class="table table-bordered table-condensed details">
 							<thead>
 							<tr>
-								<th>内容编号</th>
+								<th width="80">内容编号</th>
 								<th>内容名称</th>
-								<th width="80">内容类型</th>
+								<th width="130">内容类型</th>
 								<th width="90">负责人</th>
 								<th width="90">创建日期</th>
 								<th width="130">操作</th>
@@ -404,7 +427,7 @@
 							</c:choose>
 							</tbody>
 						</table>
-					</div>
+					</div>--%>
 				</div>
 				<div class="form-group layui-row">
 					<div class="form-group-label"><h2>成果列表</h2></div>
@@ -523,5 +546,87 @@
 			</div>
 	</div>
 </div>
+<script src="${ctxStatic}/layer-v2.3/layui/layui.all.js" charset="utf-8"></script>
+<script src="${ctxStatic}/layer-v2.3/layui/tableTree/treetable.js" charset="utf-8"></script>
+<script>
+    /*使用模块加载的方式 加载文件*/
+    layui.config({
+        base: '${ctx}/resoueces/css/layui/module/'
+    }).extend({
+        treetable: 'treetable-lay/treetable'
+    }).use(['layer', 'table', 'treetable'], function () {
+        var $ = layui.jquery;
+        var table = layui.table;
+        var layer = layui.layer;
+        var treetable = layui.treetable;
+
+        // 渲染表格
+        var renderTable = function () {//树桩表格参考文档:https://gitee.com/whvse/treetable-lay
+            layer.load(2);
+            treetable.render({
+                treeColIndex: 1,//树形图标显示在第几列
+                treeSpid: 0,//最上级的父级id
+                treeIdName: 'permissionId',//id字段的名称
+                treePidName: 'pid',//pid字段的名称
+                treeDefaultClose: false,//是否默认折叠
+                treeLinkage: true,//父级展开时是否自动展开所有子级
+                elem: '#permissionTable',
+                url: '${ctx}/projectcontentinfo/projectcontentinfo/getProjectContentTreeData?projectId=${projectRecords.id}',
+                page: false,
+                cols: [[
+                    {type: 'numbers', title: '编号' ,width:80},
+                    {field: 'type', title: '内容类型',width:180},
+                    {field: 'name', title: '内容名称'},
+                    {field: 'masterName', title: '负责人',width:100},
+                    {field: 'createDate', title: '创建日期',width:100},
+                    {templet: complain, title: '操作',width:130}
+                ]],
+                done: function () {
+                    layer.closeAll('loading');
+                }
+            });
+        };
+
+        renderTable();
+
+        //触发三个button按钮
+        $('#btn-expand').click(function () {
+            treetable.expandAll('#permissionTable');
+        });
+
+        $('#btn-fold').click(function () {
+            treetable.foldAll('#permissionTable');
+        });
+
+        $('#btn-refresh').click(function () {
+            renderTable();
+        });
+
+
+        function complain(d){//操作中显示的内容
+			if(d.loginId == d.createId){
+                return [
+			    	'<a href="#" onclick="openDialog(\'修改工作内容详情\', \'${ctx}/projectcontentinfo/projectcontentinfo/form?view=content&dictType=${dictType}&id=${id}&parentIds=${parentIds}&infoId='+d.id+'\',\'95%\',\'95%\')" class="op-btn op-btn-edit" ><i class="fa fa-edit"></i> 修改</a>',
+					'<a href="${ctx}/projectcontentinfo/projectcontentinfo/delete?infoId='+d.id+'&id=${id}&type=2" onclick="return confirmxRefresh(\'确认要删除该工作内容详情吗?\', this.href)"   class="op-btn op-btn-delete"><i class="fa fa-trash"></i> 删除</a>',
+                ].join('');
+            }else{
+			    return[''].join('');
+            }
+        }
+        //监听工具条
+        table.on('tool(permissionTable)', function (obj) {
+            var data = obj.data;
+            var layEvent = obj.event;
+            if(data.permissionName!=null){
+                if (layEvent === 'del') {
+                    layer.msg('删除' + data.id);
+                } else if (layEvent === 'edit') {
+                    layer.msg('修改' + data.id);
+                }
+            }
+        });
+    });
+
+</script>
 </body>
 </html>