package com.norteksoft.acs.web.authorization;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts2.ServletActionContext;
import org.apache.struts2.convention.annotation.Action;
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.base.utils.ExportRole;
import com.norteksoft.acs.base.web.struts2.CRUDActionSupport;
import com.norteksoft.acs.entity.authorization.BusinessSystem;
import com.norteksoft.acs.entity.authorization.Role;
import com.norteksoft.acs.entity.organization.Company;
import com.norteksoft.acs.entity.organization.Department;
import com.norteksoft.acs.entity.organization.User;
import com.norteksoft.acs.entity.organization.Workgroup;
import com.norteksoft.acs.service.authorization.BusinessSystemManager;
import com.norteksoft.acs.service.authorization.RoleManager;
import com.norteksoft.acs.service.authorization.StandardRoleManager;
import com.norteksoft.acs.service.organization.CompanyManager;
import com.norteksoft.acs.service.organization.DepartmentManager;
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.web.struts2.Struts2Utils;
/**
* 标准角色Action
* @author Administrator
*/
@ParentPackage("default")
@Results( { @Result(name = CRUDActionSupport.RELOAD, location = "standard-role?businessSystemId=${businessSystemId}", type="redirectAction") })
public class StandardRoleAction extends CRUDActionSupport<Role> {
private static final long serialVersionUID = 1L;
private static String ACS_SYSTEM_ADMIN="acsSystemAdmin";//系统管理员角色编码
private static String ACS_SECURITY_ADMIN="acsSecurityAdmin";//安全管理员角色编码
private static String ACS_AUDIT_ADMIN="acsAuditAdmin";//审计管理员角色编码
private Page<Role> page = new Page<Role>(20, true);
private Role entity;
private Long businessSystemId;
private StandardRoleManager roleManager;
private Long id;
private Long roleId;
private BusinessSystemManager businessSystemManager;
private String systemTree;
private List<User> users;
private List<Department> departments;
private List<Workgroup> workgroups;
private RoleManager manager;
private DepartmentManager departmentManager;
private Boolean isAdminRole=false;//是否是管理员角色
private List<String> defaultAdmin;//是否是系统默认管理员
@Autowired
private CompanyManager companyManager;
/**
* 删除标准角色
*/
@Override
public String delete() throws Exception {
roleManager.deleteStandardRole(id);
return RELOAD;
}
/**
* 导出标准角色
*/
public String exportRole() throws Exception{
HttpServletResponse response = ServletActionContext.getResponse();
response.reset();
response.setContentType("application/x-download");
response.addHeader("Content-Disposition", "attachment;filename="+URLEncoder.encode("角色信息.xls","UTF-8"));
List<BusinessSystem> businessSystems = businessSystemManager.getAllBusiness();
ExportRole.exportRole(response.getOutputStream(), businessSystems, ContextUtils.getCompanyId());
ApiFactory.getBussinessLogService().log("授权管理",
"导出角色",ContextUtils.getSystemId("acs"));
return null;
}
/**
* 分页显示标准角色
*/
@Override
public String list() throws Exception {
List<BusinessSystem> businessSystems = businessSystemManager.getAllBusiness();
if(businessSystemId == null && businessSystems.size() > 0){
businessSystemId = businessSystems.get(0).getId();
}
BusinessSystem bs=businessSystemManager.getBusiness(businessSystemId);
Set<Role> roles = bs.getRoles();
for(Role r : roles){
if(r.isDeleted()) continue;
//if("acsSystemAdmin".equals(r.getRoleCode())||"acsSecurityAdmin".equals(r.getRoleCode())|| //三个管理员不能重新分配用户
//"acsAuditAdmin".equals(r.getRoleCode())) continue;
if(roleId == null){
roleId = r.getId();
break;
}else{
break;
}
}
ApiFactory.getBussinessLogService().log("授权管理",
"查看不同角色授权列表",ContextUtils.getSystemId("acs"));
return SUCCESS;
}
@Action("standard-role-data")
public String data(){
return "standard-role-data";
}
/*
* 生成系统JSON树
*/
@Action("standard-role-tree")
public String tree()throws Exception {
String currentId = Struts2Utils.getParameter("currentId");
if(currentId!=null&¤tId.startsWith("BUSINESSSYSTEM_")){
this.renderText("[]");
return null;
}
StringBuilder tree = new StringBuilder("[ ");
List<BusinessSystem> businessSystems = businessSystemManager.getAllBusiness();
if(businessSystemId == null && businessSystems.size() > 0){
businessSystemId = businessSystems.get(0).getId();
}
for(BusinessSystem bs : businessSystems){
if(bs.getId().equals(businessSystemId)){
tree.append(JsTreeUtils.generateJsTreeNodeNew("BUSINESSSYSTEM_"+bs.getId(), "open", bs.getName(), getRolesNodes(bs, true), ""));
}else{
tree.append(JsTreeUtils.generateJsTreeNodeNew("BUSINESSSYSTEM_"+bs.getId(), "closed", bs.getName(), getRolesNodes(bs, false), ""));
}
tree.append(",");
}
if(tree.lastIndexOf(",") != -1 && tree.lastIndexOf(",") == tree.length()-1){
tree.replace(tree.length()-1, tree.length(), "");
}
tree.append(" ]") ;
if(roleId != null){
users = manager.getCheckedUsersByRole(roleId);
departments = departmentManager.getDepartmentsInRole(roleId);
workgroups = manager.getCheckedWorkgroupByRole(roleId);
}
//setSystemTree(tree.toString());
this.renderText(tree.toString());
return null;
}
private String getRolesNodes(BusinessSystem bs, boolean isOpen){
StringBuilder nodes = new StringBuilder();
//Set<Role> roles = bs.getRoles();
List<Role> roles = roleManager.getRolesBySystemId(bs.getId());
boolean isNull = true;
for(Role r : roles){
if(r.isDeleted()) continue;
if(r.getCompanyId()!=null && !r.getCompanyId().equals(ContextUtils.getCompanyId())) continue;
//if("acsSystemAdmin".equals(r.getRoleCode())||"acsSecurityAdmin".equals(r.getRoleCode())|| //三个管理员不能重新分配用户
// "acsAuditAdmin".equals(r.getRoleCode())) continue;
if(isNull && isOpen){
if(roleId == null) roleId = r.getId();
isNull = false;
}
nodes.append(JsTreeUtils.generateJsTreeNodeNew("ROLE_"+r.getId().toString(), "", r.getName(), ""));
nodes.append(",");
}
//去掉最后一个逗号
if(nodes.length()>0&&nodes.charAt(nodes.length()-1)==','){
nodes.delete(nodes.length()-1, nodes.length());
}
return nodes.toString();
}
public String authoritys(){
if(id != null){
users = manager.getCheckedUsersByRole(id);
departments = departmentManager.getDepartmentsInRole(id);
workgroups = manager.getCheckedWorkgroupByRole(id);
Role role=roleManager.getStandardRole(id);
isAdminRole=hasAdminRole(role);
}else if(roleId != null){
users = manager.getCheckedUsersByRole(roleId);
departments = departmentManager.getDepartmentsInRole(roleId);
workgroups = manager.getCheckedWorkgroupByRole(roleId);
Role role=roleManager.getStandardRole(roleId);
isAdminRole=hasAdminRole(role);
}
defaultAdmin = getSystemDefaultAdmin();
return "data";
}
private List<String> getSystemDefaultAdmin() {
List<String> result = new ArrayList<String>();
Company company = companyManager.getCompany(ContextUtils.getCompanyId());
String systemAdmin = company.getCode()+".systemAdmin";
String securityAdmin = company.getCode()+".securityAdmin";
String auditAdmin = company.getCode()+".auditAdmin";
result.add(systemAdmin);
result.add(securityAdmin);
result.add(auditAdmin);
return result;
}
private boolean hasAdminRole(Role role){
if(ACS_SYSTEM_ADMIN.equals(role.getCode())||ACS_AUDIT_ADMIN.equals(role.getCode())||ACS_SECURITY_ADMIN.equals(role.getCode())){
return true;
}
return false;
}
@Override
protected void prepareModel() throws Exception {
if(id != null){
entity = roleManager.getStandardRole(id);
}else{
entity = new Role();
}
}
@Override
public String input() throws Exception {
return INPUT;
}
/**
* 保存标准角色
*/
@Override
public String save() throws Exception {
businessSystemId = entity.getBusinessSystem().getId();
roleManager.saveStandardRole(entity);
return RELOAD;
}
public Role getModel() {
return entity;
}
public Long getBusinessSystemId() {
return businessSystemId;
}
public void setBusinessSystemId(Long businessSystemId) {
this.businessSystemId = businessSystemId;
}
public Page<Role> getPage() {
return page;
}
public void setPage(Page<Role> page) {
this.page = page;
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
@Required
public void setDepartmentManager(DepartmentManager departmentManager) {
this.departmentManager = departmentManager;
}
@Required
public void setRoleManager(RoleManager manager) {
this.manager = manager;
}
@Required
public void setStandardRoleManager(StandardRoleManager roleManager) {
this.roleManager = roleManager;
}
@Required
public void setBusinessSystemManager(BusinessSystemManager businessSystemManager) {
this.businessSystemManager = businessSystemManager;
}
public String getSystemTree() {
return systemTree;
}
public void setSystemTree(String systemTree) {
this.systemTree = systemTree;
}
public List<User> getUsers() {
return users;
}
public void setUsers(List<User> users) {
this.users = users;
}
public List<Department> getDepartments() {
return departments;
}
public void setDepartments(List<Department> departments) {
this.departments = departments;
}
public List<Workgroup> getWorkgroups() {
return workgroups;
}
public void setWorkgroups(List<Workgroup> workgroups) {
this.workgroups = workgroups;
}
public Long getRoleId() {
return roleId;
}
public void setRoleId(Long roleId) {
this.roleId = roleId;
}
public Boolean getIsAdminRole() {
return isAdminRole;
}
public void setIsAdminRole(Boolean isAdminRole) {
this.isAdminRole = isAdminRole;
}
public List<String> getDefaultAdmin() {
return defaultAdmin;
}
public void setDefaultAdmin(List<String> defaultAdmin) {
this.defaultAdmin = defaultAdmin;
}
}