package com.norteksoft.task.web;
import java.util.List;
import org.apache.struts2.convention.annotation.Namespace;
import org.apache.struts2.convention.annotation.ParentPackage;
import org.apache.struts2.convention.annotation.Result;
import org.apache.struts2.convention.annotation.Results;
import org.springframework.beans.factory.annotation.Required;
import com.norteksoft.acs.entity.organization.Department;
import com.norteksoft.acs.entity.organization.DepartmentUser;
import com.norteksoft.acs.entity.organization.User;
import com.norteksoft.acs.service.organization.DepartmentManager;
import com.norteksoft.product.api.ApiFactory;
import com.norteksoft.product.util.ContextUtils;
import com.norteksoft.product.util.ParameterUtils;
import com.norteksoft.product.util.ThreadParameters;
import com.norteksoft.product.web.struts2.CrudActionSupport;
@SuppressWarnings("unchecked")
@Namespace("/task")
@ParentPackage("default")
@Results( { @Result(name = CrudActionSupport.RELOAD, location = "tree", type = "redirectAction")})
public class TreeAction extends CrudActionSupport {
private static final long serialVersionUID = 1L;
private DepartmentManager departmentManager;
private String currentId;
private String tree;
@Override
public String list() throws Exception {
return SUCCESS;
}
public String load() throws Exception{
StringBuilder tree = new StringBuilder("[ ");
if("INITIALIZED".equals(currentId)){
//公司里的部门节点
StringBuilder subNodes = new StringBuilder();
List<Department> departments = departmentManager.getAllDepartment();
for(Department d : departments){
String nodeString = getDdeptNodes(d);
if(nodeString.length() > 0)
subNodes.append(nodeString).append(",");
}
subNodes.append(generateJsTreeNode("NODEPARTMENTUS," + ContextUtils.getCompanyId(),
"closed", getText("user.noDepartment"), ""));
if(subNodes.lastIndexOf(",") != -1 && subNodes.lastIndexOf(",") == subNodes.length()-1){
subNodes.replace(subNodes.length()-1, subNodes.length(), "");
}
//公司节点
tree.append(generateJsTreeNode("", "open", ContextUtils.getCompanyName(), subNodes.toString()));
}else if(currentId.startsWith("DEPARTMENT")){
tree.append(getUserNodes(Long.valueOf(currentId.substring(currentId.indexOf(',')+1, currentId.length()))));
}else if(currentId.startsWith("NODEPARTMENTUS")){
tree.append(getNoDepartmentUserNodes(Long.valueOf(currentId.substring(currentId.indexOf(',')+1, currentId.length()))));
}
tree.append(" ]");
renderText(tree.toString());
return null;
}
/**
* 部门节点
*/
private String getDdeptNodes(Department dept){
StringBuilder nodes = new StringBuilder();
if(dept.getParent() == null){
//部门树节点
nodes.append(generateJsTreeNode("DEPARTMENT," + dept.getId(), "closed", dept.getName(), ""));
}
return nodes.toString();
}
/**
* 用户节点
*/
public String getUserNodes(Long deptId) throws Exception{
StringBuilder nodes = new StringBuilder();
Department dept = departmentManager.getDepartment(deptId);
for(Department d : dept.getChildren()){
nodes.append(getDdeptNodes(d)).append(",");
}
for(DepartmentUser du : dept.getDepartmentUsers()){
if(du.isDeleted()) continue;
User user = du.getUser();
if(user.isDeleted()) continue;
nodes.append(generateJsTreeNode("USER," + user.getId() + "," + user.getLoginName(), "",
user.getName(), "")).append(",");
}
if(nodes.lastIndexOf(",") != -1 && nodes.lastIndexOf(",") == nodes.length()-1){
nodes.replace(nodes.length()-1, nodes.length(), "");
}
return nodes.toString();
}
/**
* 没有部门的用户的树节点
* @param companyId
* @return
*/
public String getNoDepartmentUserNodes(Long companyId){
StringBuilder nodes = new StringBuilder();
ThreadParameters parameters=new ThreadParameters(companyId);
ParameterUtils.setParameters(parameters);
List<com.norteksoft.product.api.entity.User> users = ApiFactory.getAcsService().getUsersWithoutDepartment();
for(com.norteksoft.product.api.entity.User user : users){
if(user.isDeleted()) continue;
nodes.append(generateJsTreeNode("USER," + user.getId() + "," + user.getLoginName(), "",
user.getName(), "")).append(",");
}
if(nodes.lastIndexOf(",") != -1 && nodes.lastIndexOf(",") == nodes.length()-1){
nodes.replace(nodes.length()-1, nodes.length(), "");
}
return nodes.toString();
}
/**
* 生成树的一个NODE
* @param id NODE的id
* @param state NODE的状态 open || closed || ""
* @param data NODE的显示数据
* @param children NODE的子NODE
* @return
*/
protected String generateJsTreeNode(String id, String state, String data, String children){
StringBuilder node = new StringBuilder();
node.append("{ attributes: { id : \"").append(id).append("\" }");
if(state != null && !"".equals(state.trim())){
node.append(",state : \"").append(state).append("\"");
}
node.append(", data: \"").append(data).append("\" ");
if(children != null && !"".equals(children.trim())){
node.append(", children : [").append(children).append("]");
}
node.append("}");
return node.toString();
}
@Required
public void setDepartmentManager(DepartmentManager departmentManager) {
this.departmentManager = departmentManager;
}
public String getTree() {
return tree;
}
public void setTree(String tree) {
this.tree = tree;
}
public String getCurrentId() {
return currentId;
}
public void setCurrentId(String currentId) {
this.currentId = currentId;
}
@Override
public String delete() throws Exception {
return null;
}
@Override
public String input() throws Exception {
return null;
}
@Override
protected void prepareModel() throws Exception {
}
@Override
public String save() throws Exception {
return null;
}
public Object getModel() {
return null;
}
}