package com.norteksoft.wf.engine.web;
import java.util.List;
import org.apache.struts2.convention.annotation.Action;
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.Autowired;
import org.springframework.beans.factory.annotation.Required;
import com.norteksoft.acs.entity.authorization.BusinessSystem;
import com.norteksoft.acs.entity.organization.Department;
import com.norteksoft.acs.entity.organization.DepartmentUser;
import com.norteksoft.acs.service.authorization.AcsApiManager;
import com.norteksoft.acs.service.organization.DepartmentManager;
import com.norteksoft.product.api.ApiFactory;
import com.norteksoft.product.api.entity.User;
import com.norteksoft.product.util.ContextUtils;
import com.norteksoft.product.util.JsTreeUtils;
import com.norteksoft.product.util.ParameterUtils;
import com.norteksoft.product.util.ThreadParameters;
import com.norteksoft.product.web.struts2.CrudActionSupport;
import com.norteksoft.wf.engine.entity.WorkflowDefinition;
import com.norteksoft.wf.engine.entity.WorkflowType;
import com.norteksoft.wf.engine.service.TaskService;
import com.norteksoft.wf.engine.service.WorkflowDefinitionManager;
import com.norteksoft.wf.engine.service.WorkflowInstanceManager;
import com.norteksoft.wf.engine.service.WorkflowTypeManager;
@SuppressWarnings("unchecked")
@Namespace("/engine")
@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 WorkflowInstanceManager workflowInstanceManager;
private WorkflowDefinitionManager workflowDefinitionManager;
private TaskService taskService;
private AcsApiManager acsApiManager;
private WorkflowTypeManager workflowTypeManager;
@Autowired
public void setAcsApiManager(AcsApiManager acsApiManager) {
this.acsApiManager = acsApiManager;
}
@Autowired
public void setWorkflowTypeManager(WorkflowTypeManager workflowTypeManager) {
this.workflowTypeManager = workflowTypeManager;
}
@Override
public String list() throws Exception {
return SUCCESS;
}
public Long getCompanyId(){
return ContextUtils.getCompanyId();
}
public String getCompanyName(){
return ContextUtils.getCompanyName();
}
public String getCurrentUser(){
return ContextUtils.getLoginName();
}
/**
* 我的流程树
* @return
* @throws Exception
*/
@Action("tree-myProcess")
public String myProcess() throws Exception{
StringBuilder tree = new StringBuilder("[ ");
if("INITIALIZED".equals(currentId)){
List<WorkflowType> wfTypes = workflowTypeManager.getAllWorkflowType();
StringBuilder subNodes = new StringBuilder();
//办理中
for(WorkflowType wft : wfTypes){
subNodes.append(JsTreeUtils.generateJsTreeNodeDefault("ING_"+wft.getId(), null,
wft.getName() + "(" + getInstanceNumByType(wft.getId(), false) +
")", myInstanceByType(wft.getId(), false) )).append(",");
}
JsTreeUtils.removeLastComma(subNodes);
tree.append(JsTreeUtils.generateJsTreeNodeDefault("ING", "open",
getText("workflow.doing")+"("+getInstanceNumByEnable(false)+")", subNodes.toString())).append(",");
//已完成
subNodes = new StringBuilder();
for(WorkflowType wft : wfTypes){
subNodes.append(JsTreeUtils.generateJsTreeNodeDefault("END_"+wft.getId(), null,
wft.getName() + "(" + getInstanceNumByType(wft.getId(), true) +
")", myInstanceByType(wft.getId(), true) )).append(",");
}
JsTreeUtils.removeLastComma(subNodes);
tree.append(JsTreeUtils.generateJsTreeNodeDefault("END", "",
getText("workflow.complete")+"("+getInstanceNumByEnable(true)+")", subNodes.toString())).append(",");
}else if(currentId.startsWith("ING_")){
}
JsTreeUtils.removeLastComma(tree);
tree.append(" ]");
renderText(tree.toString());
return null;
}
//我委托的流程
public String delegateMonitor() throws Exception{
StringBuilder tree = new StringBuilder("[ ");
tree.append(JsTreeUtils.generateJsTreeNodeDefault("DEL_ING", null,
getText("workflow.doing") + "(" +
taskService.getDelegateTasksNum(getCompanyId(), getCurrentUser(), false) + ")" )).append(",");
tree.append(JsTreeUtils.generateJsTreeNodeDefault("DEL_END", null,
getText("workflow.complete") + "(" +
taskService.getDelegateTasksNum(getCompanyId(), getCurrentUser(), true) + ")" ));
tree.append(" ]");
renderText(tree.toString());
return null;
}
//我受托的流程
public String superviseAsTrusteeTree() throws Exception{
StringBuilder tree = new StringBuilder("[ ");
tree.append(JsTreeUtils.generateJsTreeNodeDefault("TRUSTEE_ING", null,
getText("workflow.doing") + "(" +
taskService.getTrusteeTasksNum(getCompanyId(), getCurrentUser(), false) + ")" )).append(",");
tree.append(JsTreeUtils.generateJsTreeNodeDefault("TRUSTEE_END", null,
getText("workflow.complete") + "(" +
taskService.getTrusteeTasksNum(getCompanyId(), getCurrentUser(), true) + ")" ));
tree.append(" ]");
renderText(tree.toString());
return null;
}
private String myInstanceByType(Long typeId, boolean isEnd){
StringBuilder subNodes = new StringBuilder();
List<WorkflowDefinition> definitions = workflowDefinitionManager.getWfDefinitionsByType(getCompanyId(), typeId);
for(WorkflowDefinition wfd : definitions){
if(isEnd){
subNodes.append(JsTreeUtils.generateJsTreeNodeDefault("END_WFD_" + wfd.getId(), "",
wfd.getName() + "(" + getInstanceNumByDefinition(wfd, isEnd) + ")")).append(",");
}else{
subNodes.append(JsTreeUtils.generateJsTreeNodeDefault("ING_WFD_" + wfd.getId(), "",
wfd.getName() + "(" + getInstanceNumByDefinition(wfd, isEnd) + ")")).append(",");
}
}
JsTreeUtils.removeLastComma(subNodes);
return subNodes.toString();
}
private Integer getInstanceNumByEnable(boolean isEnd){
if(isEnd){
return workflowInstanceManager.getEndInstanceNumByEnable(getCompanyId(), getCurrentUser());
}else{
return workflowInstanceManager.getNotEndInstanceNumByEnable(getCompanyId(), getCurrentUser());
}
}
/*
* 根据流程定义查询流程实例个数
*/
private Integer getInstanceNumByDefinition(WorkflowDefinition definition, boolean isEnd){
if(isEnd){
return workflowInstanceManager.getEndInstanceNumByDefinition(getCompanyId(), getCurrentUser(), definition);
}else{
return workflowInstanceManager.getNotEndInstanceNumByDefinition(getCompanyId(), getCurrentUser(), definition);
}
}
/*
* 根据流程实例类型查询当前用户流程实例个数
*/
private Integer getInstanceNumByType(Long typeId, boolean isEnd){
if(isEnd){
return workflowInstanceManager.getEndInstanceNumByCreatorAndType(getCompanyId(), getCurrentUser(), typeId);
}else{
return workflowInstanceManager.getNotEndInstanceNumByCreatorAndType(getCompanyId(), getCurrentUser(), typeId);
}
}
/**
* 流程汇编树
* @return
* @throws Exception
*/
public String process() throws Exception{
StringBuilder tree = new StringBuilder("[ ");
if("INITIALIZED".equals(currentId)){
List<WorkflowType> wfTypes = workflowTypeManager.getAllWorkflowType();
boolean isFirstNode = true;
for(WorkflowType wft : wfTypes){
if(isFirstNode){
tree.append(JsTreeUtils.generateJsTreeNodeDefault("WFDTYPE_" + wft.getId(), "open",wft.getName(), processDefs(wft.getId()))).append(",");
isFirstNode = false;
}else{
tree.append(JsTreeUtils.generateJsTreeNodeDefault("WFDTYPE_" + wft.getId(), "", wft.getName(), processDefs(wft.getId()))).append(",");
}
}
}
JsTreeUtils.removeLastComma(tree);
tree.append(" ]");
renderText(tree.toString());
return null;
}
public String processDefs(Long typeId){
StringBuilder subNodes = new StringBuilder();
List<WorkflowDefinition> definitions = workflowDefinitionManager.getWfDefinitionsByType(getCompanyId(), typeId);
for(WorkflowDefinition wfd : definitions){
subNodes.append(JsTreeUtils.generateJsTreeNodeDefault("WFDID_" + wfd.getId(), "", wfd.getName())).append(",");
}
JsTreeUtils.removeLastComma(subNodes);
return subNodes.toString();
}
/**
* 流程及表单类型树
* @return
* @throws Exception
*/
public String wfTypes() throws Exception{
List<WorkflowType> wfTypes = workflowTypeManager.getAllWorkflowType();
List<BusinessSystem> businessSystemList = acsApiManager.getAllBusiness(getCompanyId());
StringBuilder tree = new StringBuilder("[ ");
if( "INITIALIZED_PROCESS".equals(currentId)){
tree.append(JsTreeUtils.generateJsTreeNodeDefault("ENABLE_ALL_1", "open",
"当前版本",getSecondNodesInWftypeTree(wfTypes,businessSystemList,"ENABLE"))).append(",");
tree.append(JsTreeUtils.generateJsTreeNodeDefault("UNABLE_ALL_1", "",
"历史版本",getSecondNodesInWftypeTree(wfTypes,businessSystemList,"UNABLE"))).append(",");
}else if( "INITIALIZED_MONITOR".equals(currentId)){
tree.append(JsTreeUtils.generateJsTreeNodeDefault("WFT_monitor_0", null,
"所有流程")).append(",");
boolean isSuperWf=workflowDefinitionManager.isSuperWf();
for(WorkflowType wft : wfTypes){
tree.append(JsTreeUtils.generateJsTreeNodeDefault("WFT_monitor_"+wft.getId(), null, wft.getName(),monitorTree(wft,isSuperWf))).append(",");
}
}else if("INITIALIZED_FORM".equals(currentId)){
tree.append(JsTreeUtils.generateJsTreeNodeDefault("parent_default_0", "open", "自定义表单" ,formTypes(wfTypes,"default"))).append(",");
tree.append(JsTreeUtils.generateJsTreeNodeDefault("parent_standard_0", null, "标准表单",formTypes(wfTypes,"standard"))).append(",");
}else if("INITIALIZED_DICT".equals(currentId)){
tree.append(JsTreeUtils.generateJsTreeNodeDefault("WFT_myCreate_0", null, "所有数据" )).append(",");
tree.append(JsTreeUtils.generateJsTreeNodeDefault("WFT_type_0", null, "类型管理")).append(",");
}else if("INITIALIZED_TEMPLATE".equals(currentId)){
tree.append(JsTreeUtils.generateJsTreeNodeDefault("WFT_0", null, getText("workflow.allTemplate") )).append(",");
for(WorkflowType wft : wfTypes){
tree.append(JsTreeUtils.generateJsTreeNodeDefault("WFT_"+wft.getId(), null, wft.getName())).append(",");
}
}else if("INITIALIZED_WFD_TEMPLATE".equals(currentId)){
tree.append(JsTreeUtils.generateJsTreeNodeDefault("WFDT_0", null, getText("workflow.allTemplate") )).append(",");
for(WorkflowType wft : wfTypes){
tree.append(JsTreeUtils.generateJsTreeNodeDefault("WFDT_"+wft.getId(), null, wft.getName())).append(",");
}
}
JsTreeUtils.removeLastComma(tree);
tree.append(" ]");
renderText(tree.toString());
return null;
}
private String monitorTree(WorkflowType type,boolean isSuperWf){
StringBuilder tree = new StringBuilder();
List<String> definitionCodes=workflowDefinitionManager.getWfDefinitionCodesByType(getCompanyId(), type.getId());
for(String def : definitionCodes){
WorkflowDefinition wf=workflowDefinitionManager.getWorkflowDefinitionByCodeAndVersion(def, 1,ContextUtils.getCompanyId(),isSuperWf);
if(wf!=null){
tree.append(JsTreeUtils.generateJsTreeNodeDefault("WFT_monitor_"+type.getId()+"_"+def, null, wf.getName())).append(",");
}
}
JsTreeUtils.removeLastComma(tree);
return tree.toString();
}
public String getSecondNodesInWftypeTree(List<WorkflowType> wfTypes,List<BusinessSystem> businessSystemList,String belongType){
StringBuilder secondNodes = new StringBuilder();
//流程类型
StringBuilder subNodes = new StringBuilder();
for(WorkflowType wft : wfTypes){
subNodes.append(JsTreeUtils.generateJsTreeNodeDefault(belongType+"_WFT_"+wft.getId(), null, wft.getName())).append(",");
}
JsTreeUtils.removeLastComma(subNodes);
secondNodes.append(JsTreeUtils.generateJsTreeNodeDefault(belongType+"_WFT_0", "open",
"流程类型", subNodes.toString())).append(",");
//所有系统
subNodes = new StringBuilder();
for(BusinessSystem bs : businessSystemList){
subNodes.append(JsTreeUtils.generateJsTreeNodeDefault(belongType+"_BSYS_"+bs.getId(), null, bs.getName())).append(",");
}
JsTreeUtils.removeLastComma(subNodes);
secondNodes.append(JsTreeUtils.generateJsTreeNodeDefault(belongType+"_BSYS_0", "",
"所有系统", subNodes.toString())).append(",");
JsTreeUtils.removeLastComma(secondNodes);
return secondNodes.toString();
}
public String formTypes(List<WorkflowType> wfTypes,String formType){
StringBuilder tree = new StringBuilder();
tree.append(JsTreeUtils.generateJsTreeNodeDefault("WFT_"+formType+"_0", null, getText("workflow.allForm"))).append(",");
for(WorkflowType wft : wfTypes){
tree.append(JsTreeUtils.generateJsTreeNodeDefault("WFT_"+formType+"_"+wft.getId(), null, wft.getName())).append(",");
}
return tree.toString();
}
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(JsTreeUtils.generateJsTreeNodeDefault("NODEPARTMENTUS," + getCompanyId(),
"closed", getText("user.noDepartment"), ""));
JsTreeUtils.removeLastComma(subNodes);
//公司节点
tree.append(JsTreeUtils.generateJsTreeNodeDefault("", "open", 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(JsTreeUtils.generateJsTreeNodeDefault("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;
com.norteksoft.acs.entity.organization.User user = du.getUser();
if(user.isDeleted()) continue;
nodes.append(JsTreeUtils.generateJsTreeNodeDefault("USER," + user.getId() + "," + user.getLoginName(), "",
user.getName(), "")).append(",");
}
JsTreeUtils.removeLastComma(nodes);
return nodes.toString();
}
/**
* 没有部门的用户的树节点
* @param companyId
* @return
*/
public String getNoDepartmentUserNodes(Long companyId){
StringBuilder nodes = new StringBuilder();
ThreadParameters parameters=new ThreadParameters(companyId);
ParameterUtils.setParameters(parameters);
List<User> users = ApiFactory.getAcsService().getUsersWithoutDepartment();
for(User user : users){
if(user.isDeleted()) continue;
nodes.append(JsTreeUtils.generateJsTreeNodeDefault("USER," + user.getId() + "," + user.getLoginName(), "",
user.getName(), "")).append(",");
}
JsTreeUtils.removeLastComma(nodes);
return nodes.toString();
}
/**
* 选择用户、部门和工作组,并将它们分装为json格式。
* 格式如:{user:"用户登录名1,用户登录名2,...",department:"部门1,部门2,...",workGroup:"工作组1,工作组2,..."}
*/
public String selectUserPackToJson() throws Exception{
return "selectUserPackToJson";
}
@Required
public void setDepartmentManager(DepartmentManager departmentManager) {
this.departmentManager = departmentManager;
}
@Required
public void setWorkflowInstanceManager(
WorkflowInstanceManager workflowInstanceManager) {
this.workflowInstanceManager = workflowInstanceManager;
}
@Required
public void setWorkflowDefinitionManager(
WorkflowDefinitionManager workflowDefinitionManager) {
this.workflowDefinitionManager = workflowDefinitionManager;
}
@Required
public void setTaskService(TaskService taskService) {
this.taskService = taskService;
}
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;
}
}