package com.norteksoft.wf.engine.web;
import java.util.ArrayList;
import java.util.List;
import org.apache.commons.lang.xwork.StringUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
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.bs.rank.entity.Superior;
import com.norteksoft.bs.rank.service.RankManager;
import com.norteksoft.product.api.ApiFactory;
import com.norteksoft.product.orm.Page;
import com.norteksoft.product.util.ContextUtils;
import com.norteksoft.product.util.JsTreeUtils;
import com.norteksoft.product.util.PageUtils;
import com.norteksoft.product.web.struts2.CrudActionSupport;
import com.norteksoft.wf.base.enumeration.DataDictUseType;
import com.norteksoft.wf.engine.entity.DataDictionary;
import com.norteksoft.wf.engine.entity.DataDictionaryProcess;
import com.norteksoft.wf.engine.entity.DataDictionaryType;
import com.norteksoft.wf.engine.entity.DataDictionaryUser;
import com.norteksoft.wf.engine.entity.WorkflowDefinition;
import com.norteksoft.wf.engine.service.DataDictionaryManager;
import com.norteksoft.wf.engine.service.DataDictionaryTypeManager;
import com.norteksoft.wf.engine.service.WorkflowDefinitionManager;
@Namespace("/engine")
@ParentPackage("default")
@Results( { @Result(name = CrudActionSupport.RELOAD, location = "data-dictionary", type = "redirectAction") })
public class DataDictionaryAction extends CrudActionSupport<DataDictionary>{
private Log log = LogFactory.getLog(DataDictionaryAction.class);
private static final String SUCCESS_MESSAGE_LEFT = "<font class=\"onSuccess\"><nobr>";
private static final String MESSAGE_RIGHT = "</nobr></font>";
private static final long serialVersionUID = 1L;
private Page<DataDictionary> dictPage = new Page<DataDictionary>(0, true);
private DataDictionaryManager dataDictionaryManager;
private DataDictionaryTypeManager dataDictionaryTypeManager;
private WorkflowDefinitionManager workflowDefinitionManager;
private RankManager rankManager;
private DataDictionary dataDict;
private String[] userNames;
private String[] deptNames;
private String[] groupNames;
private String[] rankNames;
private String[] processes;
private String userNamesView;
private Long id;
private int operate; //添加用户还是删除用户
private static final int IS_ADD = 0;
private static final int IS_REMOVE = 1;
private List<String> operations;
private List<DataDictionaryUser> dduUsers;
private List<DataDictionaryUser> depts;
private List<DataDictionaryUser> workGroups;
private List<DataDictionaryUser> ranks;
private List<DataDictionaryType> typeList;
private List<DataDictionaryProcess> processTaches;
private List<DataDictionaryProcess> processPros;
private List<String[]> processesView;
private String currentId;
private String dictIds;
private String queryTypeNo;
private String queryTypeName;
private DataDictUseType[] use;//前台用途需要的enum的集合
private String showPage;
private String searchValue;
private String queryName;
public DataDictUseType[] getUse() {
return use;
}
@Override
public String list() throws Exception {
if(dictPage.getPageSize()>1){
use = DataDictUseType.values();
dataDictionaryManager.getDataDicts(dictPage,queryTypeNo,queryTypeName,queryName);
ApiFactory.getBussinessLogService().log("数据字典",
"数据字典列表",
ContextUtils.getSystemId("wf"));
this.renderText(PageUtils.pageToJson(dictPage));
return null;
}
return SUCCESS;
}
@SuppressWarnings("unchecked")
@Override
public String input() throws Exception {
log.debug("***input方法开始");
typeList=dataDictionaryTypeManager.getAllDictTypes();
log.debug("***typeList:"+typeList);
if(id != null){
Object[] lists=dataDictionaryManager.getDataDictUsers(id);
dduUsers = ((ArrayList<List<DataDictionaryUser>>)(lists[0])).get(0);
depts=((ArrayList<List<DataDictionaryUser>>)(lists[0])).get(1);
workGroups=((ArrayList<List<DataDictionaryUser>>)(lists[0])).get(2);
ranks=((ArrayList<List<DataDictionaryUser>>)(lists[0])).get(3);
userNamesView=(String)lists[1];
Object[] processLists=dataDictionaryManager.getDictProcessesByDictId(id);
processPros=((ArrayList<List<DataDictionaryProcess>>)(processLists[0])).get(0);
processTaches=((ArrayList<List<DataDictionaryProcess>>)(processLists[0])).get(1);
processesView=(List<String[]>)processLists[1];
log.debug("***dduUsers:"+dduUsers);
log.debug("***depts:"+depts);
log.debug("***workGroups:"+workGroups);
log.debug("***userNamesView:"+userNamesView);
log.debug("***processPros:"+processPros);
log.debug("***processTaches:"+processTaches);
log.debug("***processesView:"+processesView);
}
ApiFactory.getBussinessLogService().log("数据字典",
"数据字典表单页面",
ContextUtils.getSystemId("wf"));
log.debug("***input方法结束");
return "input";
}
@Override
public String save() throws Exception {
log.debug("***save方法开始");
log.debug("***operations:"+operations);
if(operations!=null){
dataDict.setOperation(operations.toString().replace("[", "").replace("]","")+",");
log.debug("***operation:"+dataDict.getOperation());
}else{
dataDict.setOperation(null);
}
dataDictionaryManager.saveDataDict(dataDict, userNames,deptNames,groupNames,processes,rankNames);
id = dataDict.getId();
ApiFactory.getBussinessLogService().log("数据字典",
"保存数据字典",
ContextUtils.getSystemId("wf"));
this.addSuccessMessage("保存成功");
log.debug("***save方法结束");
return input();
}
private void addSuccessMessage(String message){
this.addActionMessage(SUCCESS_MESSAGE_LEFT+message+MESSAGE_RIGHT);
}
@Override
public String delete() throws Exception {
log.debug("***delete方法开始");
log.debug("***dictIds:"+dictIds);
dataDictionaryManager.deleteDataDict(dictIds);
ApiFactory.getBussinessLogService().log("数据字典",
"删除数据字典",
ContextUtils.getSystemId("wf"));
log.debug("***delete方法结束");
return list();
}
/**
* 添加用户
* @return
* @throws Exception
*/
public String addUsers() throws Exception {
operate = IS_ADD;
ApiFactory.getBussinessLogService().log("数据字典",
"添加用户页面",
ContextUtils.getSystemId("wf"));
return "user";
}
/**
* 添加流程环节
* @return
* @throws Exception
*/
public String addProcesses() throws Exception {
operate = IS_ADD;
ApiFactory.getBussinessLogService().log("数据字典",
"添加流程环节页面",
ContextUtils.getSystemId("wf"));
return "process";
}
/**
* 移除用户
* @return
* @throws Exception
*/
public String removeUsers() throws Exception{
operate = IS_REMOVE;
ApiFactory.getBussinessLogService().log("数据字典",
"移除用户页面",
ContextUtils.getSystemId("wf"));
return "remove-user";
}
/**
* 保存用户关联
* @return
* @throws Exception
*/
public String saveDictUser() throws Exception{
dataDictionaryManager.saveDictUsers(id, userNames);
ApiFactory.getBussinessLogService().log("数据字典",
"保存用户关联",
ContextUtils.getSystemId("wf"));
return "user";
}
/**
* 移除用户关联
* @return
* @throws Exception
*/
public String removeDictUser() throws Exception{
dataDictionaryManager.deleteDictUsers(id, userNames);
ApiFactory.getBussinessLogService().log("数据字典",
"移除用户关联",
ContextUtils.getSystemId("wf"));
return removeUsers();
}
//流程树
public String createProcessTree() throws Exception{
log.debug("***createProcessTree方法开始");
StringBuilder tree = new StringBuilder();
String children=getProcessTree();
tree.append("[");
if(children.length()>0){
tree.append(JsTreeUtils.generateJsTreeNodeNew("all_","open", "所有流程",children,"root")).append("");
}else{
tree.append(JsTreeUtils.generateJsTreeNodeNew("all_","", "所有流程","root")).append("");
}
tree.append("]");
ApiFactory.getBussinessLogService().log("数据字典",
"显示流程树",
ContextUtils.getSystemId("wf"));
renderText(tree.toString());
log.debug(new StringBuilder("*** Result:[")
.append("tree:").append(tree.toString())
.toString());
log.debug("***createProcessTree方法结束");
return null;
}
private String getProcessTree(){
StringBuilder tree = new StringBuilder();
boolean isFirstNode = true;
List<WorkflowDefinition> definitions = workflowDefinitionManager.getActiveDefinition();
for (WorkflowDefinition workflowDefinition : definitions) {
List<String> taches =workflowDefinitionManager.getTachesByProcessDefinition(workflowDefinition.getId());
if(isFirstNode){
tree.append(JsTreeUtils.generateJsTreeNodeNew("process_"+ workflowDefinition.getId()+";"+workflowDefinition.getName(),"closed", workflowDefinition.getName(),getTachesTree(taches, workflowDefinition.getId(), workflowDefinition.getName()),"process")).append(",");
isFirstNode=false;
}else{
if(taches.size()>0){
tree.append(JsTreeUtils.generateJsTreeNodeNew("process_"+workflowDefinition.getId()+";"+workflowDefinition.getName(),"closed", workflowDefinition.getName(),getTachesTree(taches, workflowDefinition.getId(), workflowDefinition.getName()),"process")).append(",");
}else{
tree.append(JsTreeUtils.generateJsTreeNodeNew("process_"+workflowDefinition.getId()+";"+workflowDefinition.getName(),"", workflowDefinition.getName(),getTachesTree(taches, workflowDefinition.getId(), workflowDefinition.getName()),"process")).append(",");
}
}
}
JsTreeUtils.removeLastComma(tree);
return tree.toString();
}
private String getTachesTree(List<String> taches,Long processId,String processName){
StringBuilder tree = new StringBuilder();
for(String tache:taches){
tree.append(JsTreeUtils.generateJsTreeNodeNew("tache_process_" + processId+";"+processName+"["+tache+"]", "", tache,"tache")).append(",");
}
JsTreeUtils.removeLastComma(tree);
return tree.toString();
}
//上下级关系树
public String createRankTree() throws Exception{
log.debug("***createProcessTree方法开始");
StringBuilder tree = new StringBuilder();
tree.append("[");
String rankTree=getRankTree();
if(StringUtils.isNotEmpty(rankTree)){
tree.append(JsTreeUtils.generateJsTreeNodeNew("all_rank_","closed", "上下级关系",rankTree,"root"));
}else{
tree.append(JsTreeUtils.generateJsTreeNodeNew("all_rank_","", "上下级关系","root"));
}
tree.append("]");
ApiFactory.getBussinessLogService().log("数据字典",
"用户上下级关系树",
ContextUtils.getSystemId("wf"));
renderText(tree.toString());
log.debug(new StringBuilder("*** Result:[")
.append("tree:").append(tree.toString())
.toString());
log.debug("***createProcessTree方法结束");
return null;
}
private String getRankTree(){
StringBuilder tree = new StringBuilder();
List<Superior> dataRanks=rankManager.getDataDictRanks(searchValue);
for (Superior dataDictRank: dataRanks) {
tree.append(JsTreeUtils.generateJsTreeNodeNew("rank_"+ dataDictRank.getId()+"-"+dataDictRank.getTitle(),"", dataDictRank.getTitle(),"","rank")).append(",");
}
JsTreeUtils.removeLastComma(tree);
return tree.toString();
}
public void prepareDeleteProcess(){
dataDict=dataDictionaryManager.getDataDict(id);
}
@Override
protected void prepareModel() throws Exception {
if(id == null){
dataDict = new DataDictionary();
}else{
dataDict = dataDictionaryManager.getDataDict(id);
}
}
public DataDictionary getModel() {
return dataDict;
}
@Required
public void setDataDictionaryManager(DataDictionaryManager dataDictionaryManager) {
this.dataDictionaryManager = dataDictionaryManager;
}
@Required
public void setDataDictionaryTypeManager(
DataDictionaryTypeManager dataDictionaryTypeManager) {
this.dataDictionaryTypeManager = dataDictionaryTypeManager;
}
@Autowired
public void setWorkflowDefinitionManager(
WorkflowDefinitionManager workflowDefinitionManager) {
this.workflowDefinitionManager = workflowDefinitionManager;
}
@Autowired
public void setRankManager(RankManager rankManager) {
this.rankManager = rankManager;
}
public Page<DataDictionary> getDictPage() {
return dictPage;
}
public void setDictPage(Page<DataDictionary> dictPage) {
this.dictPage = dictPage;
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public int getOperate() {
return operate;
}
public void setOperate(int operate) {
this.operate = operate;
}
public void setUserNames(String[] userNames) {
this.userNames = userNames;
}
public void setOperations(List<String> operations) {
this.operations = operations;
}
public void setDduUsers(List<DataDictionaryUser> dduUsers) {
this.dduUsers = dduUsers;
}
public List<DataDictionaryUser> getDduUsers() {
return dduUsers;
}
public List<DataDictionaryUser> getDepts() {
return depts;
}
public List<DataDictionaryUser> getWorkGroups() {
return workGroups;
}
public void setDepts(List<DataDictionaryUser> depts) {
this.depts = depts;
}
public void setWorkGroups(List<DataDictionaryUser> workGroups) {
this.workGroups = workGroups;
}
public List<DataDictionaryType> getTypeList() {
return typeList;
}
public String getCurrentId() {
return currentId;
}
public void setCurrentId(String currentId) {
this.currentId = currentId;
}
public void setProcesses(String[] processes) {
this.processes = processes;
}
public void setDeptNames(String[] deptNames) {
this.deptNames = deptNames;
}
public void setGroupNames(String[] groupNames) {
this.groupNames = groupNames;
}
public String getUserNamesView() {
return userNamesView;
}
public void setUserNamesView(String userNamesView) {
this.userNamesView = userNamesView;
}
public List<DataDictionaryProcess> getProcessTaches() {
return processTaches;
}
public List<DataDictionaryProcess> getProcessPros() {
return processPros;
}
public List<String[]> getProcessesView() {
return processesView;
}
public String getDictIds() {
return dictIds;
}
public void setDictIds(String dictIds) {
this.dictIds = dictIds;
}
public void setQueryTypeNo(String queryTypeNo) {
this.queryTypeNo = queryTypeNo;
}
public void setQueryTypeName(String queryTypeName) {
this.queryTypeName = queryTypeName;
}
public String getShowPage() {
return showPage;
}
public void setShowPage(String showPage) {
this.showPage = showPage;
}
public String[] getRankNames() {
return rankNames;
}
public void setRankNames(String[] rankNames) {
this.rankNames = rankNames;
}
public List<DataDictionaryUser> getRanks() {
return ranks;
}
public void setRanks(List<DataDictionaryUser> ranks) {
this.ranks = ranks;
}
public void setSearchValue(String searchValue) {
this.searchValue = searchValue;
}
public void setQueryName(String queryName) {
this.queryName = queryName;
}
}