package com.norteksoft.wf.engine.web;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import org.apache.commons.lang.StringUtils;
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.Required;
import com.norteksoft.acs.entity.authorization.BusinessSystem;
import com.norteksoft.product.api.entity.Role;
import com.norteksoft.product.api.entity.Department;
import com.norteksoft.acs.service.organization.UserManager;
import com.norteksoft.acs.web.authorization.JsTreeUtil1;
import com.norteksoft.product.api.ApiFactory;
import com.norteksoft.product.api.entity.User;
import com.norteksoft.product.orm.Page;
import com.norteksoft.product.util.ContextUtils;
import com.norteksoft.product.util.PageUtils;
import com.norteksoft.product.web.struts2.CrudActionSupport;
import com.norteksoft.task.entity.WorkflowTask;
import com.norteksoft.wf.base.enumeration.TrustRecordState;
import com.norteksoft.wf.engine.entity.TrustRecord;
import com.norteksoft.wf.engine.entity.WorkflowDefinition;
import com.norteksoft.wf.engine.service.DelegateMainManager;
import com.norteksoft.wf.engine.service.TaskService;
import com.norteksoft.wf.engine.service.WorkflowDefinitionManager;
@Namespace("/engine")
@ParentPackage("default")
@Results( { @Result(name = CrudActionSupport.RELOAD, location = "delegate-main", type = "redirectAction")})
public class DelegateMainAction extends CrudActionSupport<TrustRecord>{
private static final long serialVersionUID = 1L;
private Long id;
private List<Long> ids;
private String currentId;
private TrustRecord delegateMain;
private TaskService taskService;
private Page<TrustRecord> page = new Page<TrustRecord>(0,true);
private Page<TrustRecord> receivePage = new Page<TrustRecord>(0,true);
private Page<WorkflowTask> tasks = new Page<WorkflowTask>(0,true);
private DelegateMainManager delegateMainManager;
private WorkflowDefinitionManager workflowDefinitionManager;
private List<WorkflowDefinition> workflowDefinitions; //流程
private List<String> taskNames; //环节
private String processDefinitionId;
private UserManager userManager;
private String processId;
private String task;
private java.sql.Date bTime;
private java.sql.Date eTime;
private Integer flag;
private WorkflowTask delegate;
private List<Long> rolesIds;
private short style;
private String addOrEdit;
private boolean needStart = false;
private String deleteIds;
@Override
public String delete() throws Exception {
int[] result = delegateMainManager.deleteDelegateMains(deleteIds);
StringBuilder message = new StringBuilder();
if(result[0]!=0){
message.append(result[0]).append("个已删除");
}
if(result[0]!=0&&result[1]!=0)message.append(",");
if(result[1]!=0){
message.append(result[1]).append("个为启用中不能删除");
}
ApiFactory.getBussinessLogService().log("委托",
"删除委托",
ContextUtils.getSystemId("wf"));
this.addSuccessMessage(message.toString());
return list();
}
@Override
public String input() throws Exception {
ApiFactory.getBussinessLogService().log("委托",
"委托表单页面",
ContextUtils.getSystemId("wf"));
if(id==null||delegateMain.getState()==TrustRecordState.NEW_CREATING||needStart){
processDefinitionId=delegateMain.getProcessId();
workflowDefinitions=workflowDefinitionManager.getAllActiveDefinition();
if(StringUtils.isNotEmpty(delegateMain.getProcessId())&&!"0".equals(delegateMain.getProcessId())){
taskNames=workflowDefinitionManager.getTaskNames(delegateMain.getProcessId());
}
return INPUT;
}else{
this.addErrorMessage("启用后的委托不能修改");
return list();
}
}
public void prepareView() throws Exception {
if(id==null){
delegateMain = new TrustRecord();
}else{
delegateMain = delegateMainManager.getDelegateMain(id);
}
}
//查看页面
public String view() throws Exception {
delegateMain.setTrustorName(userManager.getUserByLoginName(delegateMain.getTrustor()).getName());
ApiFactory.getBussinessLogService().log("委托",
"查看委托",
ContextUtils.getSystemId("wf"));
return "view";
}
public void prepareViewReceive() throws Exception {
if(id==null){
delegateMain = new TrustRecord();
}else{
delegateMain = delegateMainManager.getDelegateMain(id);
}
}
//查看页面
public String viewReceive() throws Exception {
delegateMain.setTrustorName(userManager.getUserByLoginName(delegateMain.getTrustor()).getName());
ApiFactory.getBussinessLogService().log("委托",
"查看受托",
ContextUtils.getSystemId("wf"));
return "viewReceive";
}
@Override
@Action("delegate-main")
public String list() throws Exception {
if(page.getPageSize()>1){
delegateMainManager.getPageDelegateMain(page);
ApiFactory.getBussinessLogService().log("委托",
"委托列表",
ContextUtils.getSystemId("wf"));
this.renderText(PageUtils.pageToJson(page));
return null;
}
return SUCCESS;
}
/**
* 我接受的委托
* @return
* @throws Exception
*/
public String receive() throws Exception{
if(receivePage.getPageSize()>1){
delegateMainManager.getReceiveDelegate(receivePage);
List<TrustRecord> result=new ArrayList<TrustRecord>();
List<TrustRecord> list=receivePage.getResult();
for(TrustRecord delegateMain:list){
delegateMain.setTrustorName(userManager.getUserByLoginName(delegateMain.getTrustor()).getName());
result.add(delegateMain);
}
receivePage.setResult(result);
ApiFactory.getBussinessLogService().log("委托",
"受托列表",
ContextUtils.getSystemId("wf"));
this.renderText(PageUtils.pageToJson(receivePage));
return null;
}
return "receive";
}
static int MY_DELEGATE = 0;
static int REVEIVE_DELEGATE = 1;
@Override
protected void prepareModel() throws Exception {
if(id==null){
delegateMain = new TrustRecord();
delegateMain.setState(TrustRecordState.NEW_CREATING);
}else{
delegateMain = delegateMainManager.getDelegateMain(id);
}
}
/**
* 获得当前日期,精确到日
* @return
*/
public Date getDate(Date date){
Calendar cal=Calendar.getInstance();
cal.setTime(date);
cal.set(Calendar.HOUR_OF_DAY, 0);
cal.set(Calendar.MINUTE, 0);
cal.set(Calendar.SECOND, 0);
cal.set(Calendar.MILLISECOND, 0);
return cal.getTime();
}
private int validateDelegateDate(TrustRecord delegateMain){
Date currentDate = getDate(new Date());
Date beginDate = getDate(delegateMain.getBeginTime());
if(beginDate.getTime()<currentDate.getTime()){
return 1;
}else if(delegateMain.getEndTime().getTime()<delegateMain.getBeginTime().getTime()){
return 2;
}
return 0;
}
@Override
public String save() throws Exception {
if(validateDelegateDate(delegateMain)==0){
if(!ContextUtils.getLoginName().equals(delegateMain.getTrustee())){
delegateMain.setCompanyId(ContextUtils.getCompanyId());
delegateMain.setCreatedTime(new Date());
delegateMain.setTrustor(ContextUtils.getLoginName());
switch(delegateMain.getStyle()){
case 1:
delegateMain.setName(workflowDefinitionManager.getWorkflowDefinitionByProcessId(delegateMain.getProcessId()).getName());
break;
case 2:
delegateMain.setName("全权委托");
break;
case 3:
delegateMain.setName("权限委托");
StringBuilder roleNames = new StringBuilder();
StringBuilder roleIds = new StringBuilder();
if(rolesIds!=null){
for(int i=0;i<rolesIds.size();i++){
Role role=ApiFactory.getAcsService().getRoleById(rolesIds.get(i));
roleNames.append(role.getName()).append("(").append(role.getBusinessSystem().getName()).append(")");
roleIds.append(role.getId());
if(i<rolesIds.size()-1){
roleIds.append(",");
roleNames.append(",");
}
}
}else{
this.addErrorMessage("请选择一个角色后再保存");
ApiFactory.getBussinessLogService().log("委托",
"保存委托",
ContextUtils.getSystemId("wf"));
//不能执行保存方法,直接返回
return input();
}
delegateMain.setSelectedRoleNames(roleNames.toString());
delegateMain.setRoleIds(roleIds.toString());
break;
}
delegateMainManager.saveDelegateMain(delegateMain);
this.addSuccessMessage("保存成功");
if(needStart){
this.clearMessages();
this.addActionMessage(delegateMainManager.startDelegateMain(delegateMain.getId()));
}
}else{
this.addErrorMessage("不能委托给自己");
}
}else{
if(validateDelegateDate(delegateMain)==2){
this.addErrorMessage("委托截止日期不能早于生效日期");
}else if(validateDelegateDate(delegateMain)==1){
this.addErrorMessage("委托生效时间须大于等于当前时间");
}
}
ApiFactory.getBussinessLogService().log("委托",
"保存委托",
ContextUtils.getSystemId("wf"));
return input();
}
public void prepareStart() throws Exception{
}
public String start() throws Exception {
if(ids.size()==1){
this.addActionMessage(delegateMainManager.startDelegateMain(ids.get(0)));
}else if(ids.size()==0){
this.addErrorMessage("请选择一个委托");
}else{
this.addErrorMessage("只能选择一个委托");
}
ApiFactory.getBussinessLogService().log("委托",
"启用委托",
ContextUtils.getSystemId("wf"));
return list();
}
public void prepareEnd() throws Exception{
}
public String end() throws Exception {
if(ids.size()==1){
delegateMain = delegateMainManager.getDelegateMain(ids.get(0));
this.addActionMessage(delegateMainManager.endDelegateMain(ids.get(0)));
}else if(ids.size()==0){
this.addErrorMessage("请选择一个委托");
}else{
this.addErrorMessage("只能选择一个委托");
}
ApiFactory.getBussinessLogService().log("委托",
"取消委托",
ContextUtils.getSystemId("wf"));
return list();
}
/**
* 判断某日前是否在两个日期之间
* @param date1
* @param date2
* @return
*/
public void prepareGetLink() throws Exception {
prepareModel();
}
//得到环节
public String getLink() throws Exception{
workflowDefinitions=workflowDefinitionManager.getAllActiveDefinition();
taskNames=workflowDefinitionManager.getTaskNames(processDefinitionId);
StringBuilder tree = new StringBuilder();
tree.append("[");
for (String taskName : taskNames) {
tree.append(JsTreeUtil1.generateJsTreeNodeNew(taskName , "", taskName,"folder")).append(",");
}
renderText(tree.toString().substring(0, tree.length()-1)+"]");
return null;
}
//人员树的页面
public String tree()throws Exception {
return "tree";
}
//人员树
public String createManTree()throws Exception {
StringBuilder tree = null;
List<com.norteksoft.product.api.entity.Workgroup> workGroups = ApiFactory.getAcsService().getWorkgroups();
List<Department> departments = ApiFactory.getAcsService().getDepartments();
List<User> usersList = ApiFactory.getAcsService().getUsersWithoutDepartment();
if (currentId.equals("0")) {
tree = new StringBuilder();
tree.append("[");
tree.append("{attributes:{id:\"company\"},state:\"open\",data:\""+ContextUtils.getCompanyName()+ "\",children:[");
if (workGroups != null && workGroups.size() > 0) {
for (int i = 0; i < workGroups.size(); i++) {
com.norteksoft.product.api.entity.Workgroup workGroup = workGroups.get(i);
List<User> users = ApiFactory.getAcsService()
.getUsersByWorkgroupId(workGroup.getId());
if (departments != null && departments.size() > 0) {
if (users != null && users.size() > 0) {
tree.append("{attributes:{id:\"workGroup_"
+ workGroup.getId()
+ "\"},state:\"closed\",data:\""
+ workGroup.getName() + "\"},");
} else {
tree.append("{attributes:{id:\"workGroup_"
+ workGroup.getId() + "\"},data:\""
+ workGroup.getName() + "\"},");
}
} else {
if (i == workGroups.size() - 1) {
if (users != null && users.size() > 0) {
tree.append("{attributes:{id:\"workGroup_"
+ workGroup.getId()
+ "\"},state:\"closed\",data:\""
+ workGroup.getName() + "\"}");
} else {
tree.append("{attributes:{id:\"workGroup_"
+ workGroup.getId() + "\"},data:\""
+ workGroup.getName() + "\"}");
}
} else {
if (users != null && users.size() > 0) {
tree
.append("{attributes:{id:\"workGroup_"
+ workGroup.getId()
+ "\"},state:\"closed\",data:\""
+ workGroup.getName()
+ "\"},");
} else {
tree
.append("{attributes:{id:\"workGroup_"
+ workGroup.getId()
+ "\"},data:\""
+ workGroup.getName()
+ "\"},");
}
}
}
}
}
if(departments!=null&&departments.size()>0){
for (int i = 0; i < departments.size(); i++) {
Department department = departments.get(i);
List<Department> childer = ApiFactory.getAcsService().getSubDepartmentList(department.getId());
List<User> users = ApiFactory.getAcsService()
.getUsersByDepartmentId(department.getId());
if (usersList != null && usersList.size() > 0) {
if (childer != null && childer.size() > 0
|| users != null && users.size() > 0) {
tree.append("{attributes:{id:\"department_"
+ department.getId()
+ "\"},state:\"closed\",data:\""
+ department.getName() + "\"},");
} else {
tree.append("{attributes:{id:\"department_"
+ department.getId() + "\"},data:\""
+ department.getName() + "\"},");
}
} else {
if (i == departments.size() - 1) {
if (childer != null && childer.size() > 0
|| users != null && users.size() > 0) {
tree.append("{attributes:{id:\"department_"
+ department.getId()
+ "\"},state:\"closed\",data:\""
+ department.getName()
+ "\"}");
} else {
tree.append("{attributes:{id:\"department_"
+ department.getId() + "\"},data:\""
+ department.getName()
+ "\"}");
}
} else {
if (childer != null && childer.size() > 0
|| users != null && users.size() > 0) {
tree.append("{attributes:{id:\"department_"
+ department.getId()
+ "\"},state:\"closed\",data:\""
+ department.getName()
+ "\"},");
} else {
tree.append("{attributes:{id:\"department_"
+ department.getId() + "\"},data:\""
+ department.getName()
+ "\"},");
}
}
}
}
}
if(usersList!=null&&usersList.size()>0){
for (int i = 0; i < usersList.size(); i++) {
User user = usersList.get(i);
if (i == usersList.size() - 1) {
tree.append("{attributes:{id:\"" + user.getId()+"="+user.getName()
+ "\"},data:\"" + user.getName() + "\"}");
} else {
tree.append("{attributes:{id:\"" + user.getId()
+ "\"},data:\"" + user.getName() + "\"},");
}
}
}
tree.append("]}");
tree.append("]");
} else {
tree = new StringBuilder();
String[] str = currentId.split("_");
if (str[0].equals("workGroup")) {
List<User> users = ApiFactory.getAcsService().getUsersByWorkgroupId(Long
.parseLong(str[1]));
tree.append("[");
if (users != null && users.size() > 0) {
for (int i = 0; i < users.size(); i++) {
User user = users.get(i);
if (i == users.size() - 1) {
tree.append("{attributes:{id:\"" + user.getId()+"="+user.getName()
+ "\"},data:\"" + user.getName()
+ "\"}");
} else {
tree.append("{attributes:{id:\"" + user.getId()+"="+user.getName()
+ "\"},data:\"" + user.getName()
+ "\"},");
}
}
}
tree.append("]");
}
if (str[0].equals("department")) {
tree.append("[");
List<Department> childer = ApiFactory.getAcsService()
.getSubDepartmentList(Long.parseLong(str[1]));
List<User> users = ApiFactory.getAcsService().getUsersByDepartmentId(Long
.parseLong(str[1]));
if (users != null && users.size() > 0) {
for (int i = 0; i < users.size(); i++) {
User user = users.get(i);
if (i == users.size() - 1) {
if (childer != null && childer.size() > 0) {
tree.append("{attributes:{id:\"" + user.getId()+"="+user.getName()
+ "\"},data:\"" + user.getName()
+ "\"},");
} else {
tree.append("{attributes:{id:\"" + user.getId()+"="+user.getName()
+ "\"},data:\"" + user.getName()
+ "\"}");
}
} else {
tree.append("{attributes:{id:\"" + user.getId()+"="+user.getName()
+ "\"},data:\"" + user.getName()
+ "\"},");
}
}
}
if (childer != null && childer.size() > 0) {
for (int i = 0; i < childer.size(); i++) {
Department department = childer.get(i);
List<User> users1 = ApiFactory.getAcsService()
.getUsersByDepartmentId(department.getId());
if (i == childer.size() - 1) {
if (users1 != null && users1.size() > 0) {
tree.append("{attributes:{id:\"department_"
+ department.getId()
+ "\"},state:\"closed\",data:\""
+ department.getName()
+ "\"}");
}
// 如果子部门下没有人员,则不显示(可以将下面代码注释)
else {
tree.append("{attributes:{id:\"department_"
+ department.getId() + "\"},data:\""
+ department.getName()
+ "\"}");
}
} else {
if (users1 != null && users1.size() > 0) {
tree.append("{attributes:{id:\"department_"
+ department.getId()
+ "\"},state:\"closed\",data:\""
+ department.getName()
+ "\"},");
}
// 如果子部门下没有人员,则不显示(可以将下面代码注释)
else {
tree.append("{attributes:{id:\"department_"
+ department.getId() + "\"},data:\""
+ department.getName()
+ "\"},");
}
}
}
}
tree.append("]");
}
}
renderText(tree.toString());
return null;
}
private String isEnd;
public void setIsEnd(String isEnd) {
this.isEnd = isEnd;
}
private Boolean isDone=false;
public void setIsDone(Boolean isDone) {
this.isDone = isDone;
}
public Boolean getIsDone() {
return isDone;
}
//我的委托
public String myDelegate()throws Exception{
if(tasks.getPageSize()>1){
if(isEnd == null || isEnd.length() == 0){
tasks = taskService.getDelegateTasksByActive(ContextUtils.getCompanyId(), tasks, ContextUtils.getLoginName(),false);
}else{
tasks = taskService.getDelegateTasksByActive(
ContextUtils.getCompanyId(), tasks, ContextUtils.getLoginName(), Boolean.valueOf(isEnd));
}
ApiFactory.getBussinessLogService().log("委托",
"任务委托监控列表",
ContextUtils.getSystemId("wf"));
this.renderText(PageUtils.pageToJson(tasks));
return null;
}
return "delegate";
}
//我的受托
public String superviseAsTrustee()throws Exception{
if(tasks.getPageSize()>1){
tasks = taskService.getTaskAsTrustee(
ContextUtils.getCompanyId(), tasks, ContextUtils.getLoginName(), isDone);
ApiFactory.getBussinessLogService().log("委托",
"任务受托监控列表",
ContextUtils.getSystemId("wf"));
this.renderText(PageUtils.pageToJson(tasks));
return null;
}
return "trusteeview";
}
public void prepareMyDelegateInput() throws Exception{
delegate=taskService.getWorkflowTask(id);
delegate.setExpands(userManager.getUserByLoginName(delegate.getTransactor()).getName());
}
//我的委托查看
public String myDelegateInput()throws Exception{
return "delegate-input";
}
/**
* 获取某人的所有角色
* @return
* @throws Exception
*/
public String getRolesByUser() throws Exception{
StringBuilder htm = new StringBuilder();
List<Role> roles = ApiFactory.getAcsService().getRolesExcludeTrustedRole(ContextUtils.getUserId());
htm.append("<ul>");
for(Role role : roles){
BusinessSystem businessSystem = role.getBusinessSystem();
StringBuilder roleName = new StringBuilder(role.getName());
if(businessSystem!=null){
roleName.append("(");
roleName.append(businessSystem.getName());
roleName.append(")");
}
htm.append("<li>");
if(id==null){
htm.append("<input type=\"checkbox\" name=\"rolesIds\" value=\""+role.getId()+"\"/>");
}else{
delegateMain = delegateMainManager.getDelegateMain(id);
if(checkItemIsExsit(role.getId().toString(),delegateMain.getRoleIds())){
htm.append("<input type=\"checkbox\" name=\"rolesIds\" checked=\"checked\" value=\""+role.getId()+"\"/>");
}else{
htm.append("<input type=\"checkbox\" name=\"rolesIds\" value=\""+role.getId()+"\"/>");
}
}
htm.append(roleName);
htm.append("</li>");
}
htm.append("</ul>");
renderText(htm.toString());
return null;
}
/**
* 检测某个元素是否在数组中
* @param roleId
* @param ids
* @return
*/
private boolean checkItemIsExsit(String roleId,String rolesIds){
if(StringUtils.isNotEmpty(rolesIds)){
String[] rolesIdArray = rolesIds.split(",");
for(String id:rolesIdArray){
if(roleId.equals(id))return true;
}
return false;
}else{
return false;
}
}
public TrustRecord getModel() {
return delegateMain;
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public Page<TrustRecord> getPage() {
return page;
}
public List<WorkflowDefinition> getWorkflowDefinitions() {
return workflowDefinitions;
}
public void setWorkflowDefinitions(List<WorkflowDefinition> workflowDefinitions) {
this.workflowDefinitions = workflowDefinitions;
}
public String getCurrentId() {
return currentId;
}
public void setCurrentId(String currentId) {
this.currentId = currentId;
}
public String getProcessDefinitionId() {
return processDefinitionId;
}
public void setProcessDefinitionId(String processDefinitionId) {
this.processDefinitionId = processDefinitionId;
}
public List<String> getTaskNames() {
return taskNames;
}
public void setIds(List<Long> ids) {
this.ids = ids;
}
public void setTaskNames(List<String> taskNames) {
this.taskNames = taskNames;
}
public String getProcessId() {
return processId;
}
public void setProcessId(String processId) {
this.processId = processId;
}
public String getTask() {
return task;
}
public void setTask(String task) {
this.task = task;
}
public java.sql.Date getBTime() {
return bTime;
}
public void setBTime(java.sql.Date time) {
bTime = time;
}
public java.sql.Date getETime() {
return eTime;
}
public void setETime(java.sql.Date time) {
eTime = time;
}
public Integer getFlag() {
return flag;
}
public void setFlag(Integer flag) {
this.flag = flag;
}
public void setTasks(Page<WorkflowTask> tasks) {
this.tasks = tasks;
}
public Page<WorkflowTask> getTasks() {
return tasks;
}
public WorkflowTask getDelegate() {
return delegate;
}
public void setDelegate(WorkflowTask delegate) {
this.delegate = delegate;
}
public Page<TrustRecord> getReceivePage() {
return receivePage;
}
public void setReceivePage(Page<TrustRecord> receivePage) {
this.receivePage = receivePage;
}
@Required
public void setDelegateMainManager(DelegateMainManager delegateMainManager) {
this.delegateMainManager = delegateMainManager;
}
@Required
public void setWorkflowDefinitionManager(
WorkflowDefinitionManager workflowDefinitionManager) {
this.workflowDefinitionManager = workflowDefinitionManager;
}
@Required
public void setUserManager(UserManager userManager) {
this.userManager = userManager;
}
@Required
public void setTaskService(TaskService taskService) {
this.taskService = taskService;
}
public void setRolesIds(List<Long> rolesIds) {
this.rolesIds = rolesIds;
}
public short getStyle() {
return style;
}
public void setStyle(short style) {
this.style = style;
}
public String getAddOrEdit() {
return addOrEdit;
}
public void setAddOrEdit(String addOrEdit) {
this.addOrEdit = addOrEdit;
}
public String getIsEnd() {
return isEnd;
}
public void setNeedStart(boolean needStart) {
this.needStart = needStart;
}
public String getDeleteIds() {
return deleteIds;
}
public void setDeleteIds(String deleteIds) {
this.deleteIds = deleteIds;
}
private void addErrorMessage(String message){
this.addActionMessage(ERROR_MESSAGE_LEFT+message+MESSAGE_RIGHT);
}
private void addSuccessMessage(String message){
this.addActionMessage(SUCCESS_MESSAGE_LEFT+message+MESSAGE_RIGHT);
}
private static final String SUCCESS_MESSAGE_LEFT = "<font class=\"onSuccess\"><nobr>";
private static final String ERROR_MESSAGE_LEFT = "<font class=\"onError\"><nobr>";
private static final String MESSAGE_RIGHT = "</nobr></font>";
}