组织机构模块,组织机构模块是信息化系统中核心模块,工作流与授权都与组织机构模块关联,组织机构涉及部门管理,用户管理,角色管理及职位管理等。工作流模块中定义了一套组织机构接口,我们需要实现这一套接口。
实现部门接口IOrg
package com.gf.statusflow;
import java.util.List;
public interface IOrg
{
public void setId(String id);
public String getId();
public void setName(String name);
public String getName();
public void setParentId(String parentId);
public String getParentId();
public void setOrgPath(String orgPath);
public String getOrgPath();
public void setFullName(String fullName);
public String getFullName();
public void setSeqno(Integer seqno);
public Integer getSeqno();
public void setFlag(String flag);
public String getFlag();
}
部门实体类
package com.gf.statusflow.def;
import com.gf.statusflow.IOrg;
public class DefaultOrg implements IOrg{
private String id = null;
private String name = null;
private String parentId = null;
private String orgPath = null;// /1/2
private String fullName = null;// /集团公司/古方红糖厂家/财务部
private Integer seqno = null;
private String flag = "gf";
@Override
public void setId(String id) {
this.id = id;
}
@Override
public String getId() {
return id;
}
@Override
public void setName(String name) {
this.name = name;
}
@Override
public String getName() {
return name;
}
@Override
public void setParentId(String parentId) {
this.parentId = parentId;
}
@Override
public String getParentId() {
return parentId;
}
@Override
public void setOrgPath(String orgPath) {
this.orgPath = orgPath;
}
@Override
public String getOrgPath() {
return orgPath;
}
@Override
public void setFullName(String fullName) {
this.fullName = fullName;
}
@Override
public String getFullName() {
return fullName;
}
@Override
public void setSeqno(Integer seqno) {
this.seqno = seqno;
}
@Override
public Integer getSeqno() {
return seqno;
}
@Override
public void setFlag(String flag) {
this.flag = flag;
}
@Override
public String getFlag() {
return flag;
}
}
SQL
create table gf_org(id varchar(32),
name varchar(100),
parentid varchar(32),
orgpath varchar(500),
fullname varchar(500),
seqno int,
flag varchar(20));
insert into gf_org(id,name,parentid,orgpath,fullname,seqno,flag)
values('root','集团公司',null,'/root','/集团公司',1,'gf');
insert into gf_org(id,name,parentid,orgpath,fullname,seqno,flag)
values('1','古方红糖','root','/root/1','/集团公司/古方红糖',1,'gf');
Mapper层部门相关方法定义
/**
* 部门相关Mybatis方法
* @return
*/
public List<DefaultOrg> getAllOrg();
public DefaultOrg getRootOrg();
public void saveOrg(DefaultOrg org);
public void deleteOrg(@Param("id") String id);
public void updateOrg(DefaultOrg org);
public List<DefaultOrg> getOrgList(@Param("id") String id);
public DefaultOrg getOrgById(@Param("id") String id);
组织机构接口IOrgModel部门相关方法定义
/**
* 部门相关接口
* @return
*/
public List<DefaultOrg> getAllOrg();
public DefaultOrg getRootOrg();
public void saveOrg(DefaultOrg org);
public void deleteOrg(String id);
public void updateOrg(DefaultOrg org);
public List<DefaultOrg> getOrgList(String id);
public DefaultOrg getOrgById(String orgId);
组织机构服务类DefaultOrgModel相关部门方法
@Override
public List<DefaultOrg> getAllOrg()
{
return mapper.getAllOrg();
}
@Override
public DefaultOrg getRootOrg() {
try
{
return mapper.getRootOrg();
}
catch(Exception e)
{
log.error(e.getMessage());
}
return null;
}
@Override
public void saveOrg(DefaultOrg org) {
log.debug("saveOrg org="+org.getId()+","+org.getName()+","+org.getParentId());
try
{
IOrg parentOrg = this.getOrgById(org.getParentId());
log.debug("saveOrg parentOrg="+parentOrg);
String id = UUID.create("org");
org.setId(id);
String orgPath = parentOrg.getOrgPath();
orgPath = orgPath + "/"+id;
org.setOrgPath(orgPath);
String fullName = parentOrg.getFullName();
fullName = fullName + "/" + org.getName();
org.setFullName(fullName);
mapper.saveOrg(org);
}
catch(Exception e)
{
log.error(e.getMessage());
}
}
@Override
public void updateOrg(DefaultOrg org) {
try
{
mapper.updateOrg(org);
}
catch(Exception e)
{
log.error(e.getMessage());
}
}
@Override
public void deleteOrg(String id) {
try
{
mapper.deleteOrg(id);
}
catch(Exception e)
{
log.error(e.getMessage());
}
}
@Override
public List<DefaultOrg> getOrgList(String id) {
try
{
return mapper.getOrgList(id);
}
catch(Exception e)
{
log.error(e.getMessage());
}
return null;
}
@Override
public DefaultOrg getOrgById(String orgId) {
try
{
return mapper.getOrgById(orgId);
}
catch(Exception e)
{
log.error(e.getMessage());
}
return null;
}
组织机构Controller
@RequestMapping("/org")
public String org()
{
return "/orgmodel/org";
}
@RequestMapping("/orgroot")
@ResponseBody
public List<TreeNode> orgroot()
{
List<TreeNode> roots = new ArrayList<TreeNode>();
IOrg org = orgmodel.getRootOrg();
TreeNode tn = fromOrg(org);
roots.add(tn);
return roots;
}
@RequestMapping("/orgchild")
@ResponseBody
public List<TreeNode> orgchild(String id)
{
List<TreeNode> roots = new ArrayList<TreeNode>();
List<DefaultOrg> orgs = orgmodel.getOrgList(id);
for(IOrg org:orgs)
{
roots.add(fromOrg(org));
}
return roots;
}
@RequestMapping("/orgsubsave")
@ResponseBody
public Boolean orgsubsave(DefaultOrg org)
{
orgmodel.saveOrg(org);
return true;
}
@RequestMapping("/orgsave")
@ResponseBody
public Boolean orgsave(DefaultOrg org)
{
orgmodel.updateOrg(org);
return true;
}
@RequestMapping("/orgload")
@ResponseBody
public List<DefaultOrg> orgload()
{
return orgmodel.getAllOrg();
}
@RequestMapping("/orgdelete")
@ResponseBody
public String orgdelete(String id)
{
String successRtn = "";
String failureRtn = "";
log.debug("orgdelete id="+id);
String[] dim = id.split(",");
for(String orgId:dim)
{
DefaultOrg org = orgmodel.getOrgById(orgId);
log.debug("orgdelete orgId="+orgId);
List<DefaultOrg> child = orgmodel.getOrgList(orgId);
if(child != null && child.size()>0)
{
failureRtn = failureRtn + org.getName();
}
else
{
orgmodel.deleteOrg(orgId);
successRtn = successRtn + org.getName();
}
}
String rtn = "删除成功:"+successRtn+"\r\n";
rtn = rtn + "删除失败:"+failureRtn;
return rtn;
}
public TreeNode fromOrg(IOrg org)
{
TreeNode tn = new TreeNode();
tn.setId(org.getId());
tn.setText(org.getName());
tn.addAttribute("isload", "false");
tn.addAttribute("parentId", org.getParentId());
tn.addAttribute("orgPath", org.getOrgPath());
tn.addAttribute("fullName", org.getFullName());
tn.addAttribute("seqno", org.getSeqno());
tn.addAttribute("flag", org.getFlag());
return tn;
}
部门JSP页面
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
String menu = (String)request.getAttribute("menu");
%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<script type="text/javascript" src="/easyui/jquery.min.js"></script>
<script type="text/javascript" src="/easyui/jquery.easyui.min.js"></script>
<script type="text/javascript" src="/easyui/easyui-lang-zh_CN.js"></script>
<link rel="stylesheet" href="/easyui/themes/default/easyui.css"/>
<link rel="stylesheet" href="/easyui/themes/icon.css"/>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>财务报销系统</title>
<script>
function addsuborg()
{
var objs = $('#tree').tree('getChecked');
if(objs.length != 1)
{
$.messager.alert('错误','请选中一个父节点');
return;
}
var id = objs[0].id;
$('#parentId').val(id);
$('#frm').form('submit', {
url:'/orgsubsave',
onSubmit: function(){
},
success:function(data){
reloadtree();
}
});
}
function updatesuborg()
{
$('#frm').form('submit', {
url:'/orgsave',
onSubmit: function(){
},
success:function(data){
reloadtree();
}
});
}
function deleteorg()
{
var objs = $('#tree').tree('getChecked');
if(objs.length == 0)
{
$.messager.alert('错误','请选中一个需要删除部门');
return;
}
var id = '';
for(var i=0;i<objs.length;i++)
{
id = id + objs[i].id + ',';
}
console.log('deleteorg()='+objs.length+','+id);
$.ajax({
url:'/orgdelete?id='+id,
success:function(data)
{
$.messager.alert('信息',data);
reloadtree();
}
})
}
function reloadtree()
{
//$('#tree').tree('loadData',[{"id":"1","text":"Root","iconCls":null,"url":null,"state":"closed","attributes":{"type":"system","isload":"false","path":"/","parentId":null}}]);
$.get('/orgroot',function(data)
{
$('#tree').tree({
data: data
});
}
)
}
$(document).ready(
function()
{
reloadtree();
$('#tree').tree({
onBeforeExpand:function(node,param)
{
if(node.attributes.isload=='false')
{
$.ajaxSettings.async = false;
var url = '/orgchild?id='+node.id;
$.get(url,function(data)
{
$('#tree').tree('append', {
parent: node.target,
data: data
});
}
)
$.ajaxSettings.async = true;
node.attributes.isload = 'true';
}
},
onClick: function(node){
$('#id').val(node.id);
$('#name').textbox('setValue',node.text);
$('#seqno').textbox('setValue',node.attributes.seqno);
$('#parentId').val(node.attributes.parentId);
$('#orgPath').textbox('setValue',node.attributes.orgPath);
$('#fullName').textbox('setValue',node.attributes.fullName);
}
});
}
);
</script>
</head>
<body class="easyui-layout">
<div data-options="region:'west',title:'自定义导航'" style="width:250px;">
<ul id="tree" class="easyui-tree" data-options="lines:true,checkbox:true,cascadeCheck:false">
</ul>
</div>
<div data-options="region:'center',title:'部门维护'" style="padding:5px;">
<form id="frm" method="post">
<input type="hidden" id="id" name="id"/>
<input type="hidden" id="parentId" name="parentId"/>
<div style="margin-left:50px;margin-top:30px">
<input class="easyui-textbox" type="text" id="name" name="name" data-options="width:300,label:'部门名称:'" />
</div>
<div style="margin-left:50px;margin-top:30px">
<input class="easyui-textbox" type="text" id="seqno" name="seqno" data-options="width:300,label:'部门优先级:'" />
</div>
<div style="margin-left:50px;margin-top:30px">
<input class="easyui-textbox" type="text" id="orgPath" name="orgPath" data-options="readonly:true,width:300,label:'部门路径:'" />
</div>
<div style="margin-left:50px;margin-top:30px">
<input class="easyui-textbox" type="text" id="fullName" name="fullName" data-options="readonly:true,width:300,label:'部门全称:'" />
</div>
<div style="margin-left:50px;margin-top:30px">
<a id="btn" onclick="addsuborg()" class="easyui-linkbutton" data-options="iconCls:'icon-search'">添加子部门</a>
<a id="btn" onclick="updatesuborg()" href="#" class="easyui-linkbutton" data-options="iconCls:'icon-search'">修改部门</a>
<a id="btn" onclick="deleteorg()" href="#" class="easyui-linkbutton" data-options="iconCls:'icon-search'">删除部门</a>
</div>
</form>
</div>
</body>
</html>