package com.norteksoft.acs.web.authority;
import java.util.ArrayList;
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.Autowired;
import com.norteksoft.acs.base.enumeration.ConditionType;
import com.norteksoft.acs.base.utils.PermissionItemTreeUtil;
import com.norteksoft.acs.base.utils.PermissionUtils;
import com.norteksoft.acs.entity.authority.Condition;
import com.norteksoft.acs.entity.authority.DataRule;
import com.norteksoft.acs.entity.authority.Permission;
import com.norteksoft.acs.service.authority.ConditionManager;
import com.norteksoft.acs.service.authority.DataRuleManager;
import com.norteksoft.acs.service.authority.PermissionItemManager;
import com.norteksoft.acs.service.authority.PermissionManager;
import com.norteksoft.mms.form.entity.DataTable;
import com.norteksoft.mms.form.entity.ListView;
import com.norteksoft.mms.form.entity.TableColumn;
import com.norteksoft.mms.form.service.ListColumnManager;
import com.norteksoft.mms.form.service.ListViewManager;
import com.norteksoft.mms.module.entity.Menu;
import com.norteksoft.mms.module.service.MenuManager;
import com.norteksoft.product.orm.Page;
import com.norteksoft.product.util.ContextUtils;
import com.norteksoft.product.util.JsTreeUtils;
import com.norteksoft.product.util.JsonParser;
import com.norteksoft.product.util.PageUtils;
import com.norteksoft.product.util.tree.ZTreeNode;
import com.norteksoft.product.web.struts2.CrudActionSupport;
import com.norteksoft.product.web.struts2.Struts2Utils;
@Namespace("/authority")
@ParentPackage("default")
@Results( { @Result(name = CrudActionSupport.RELOAD, location = "data-rule", type = "redirectAction") })
public class DataRuleAction extends CrudActionSupport<DataRule>{
private static final long serialVersionUID = 1L;
private Long id;
private String ids;
private DataRule dataRule;
private Page<DataRule> page=new Page<DataRule>(0,true);
private Page<DataTable> dataRulePage=new Page<DataTable>(0,true);
private Page<TableColumn> tableColumnPage=new Page<TableColumn>(0,true);
private Page<Condition> conditionPage=new Page<Condition>(0,true);
private Long tableId;
private String currentInputId;
private Long ruletypeId;
private Long dataRuleId;
private String dataValue;
private List<String[]> values = new ArrayList<String[]>();
private Long sysMenuId;//关联的菜单id
private boolean selectPageFlag=false;
private Long dataTableId;
private String valueUrl;
private List<ListView> listViews;
private Long tableColumnId;//数据表列表的的行id
private String standardField;//标准字段名:~~creatorId,~~departmentId,~~roleId,~~workgroupId
private String currentTreeId;
private String rowId;//数据分类中规则条件的id
private Boolean deparmentInheritable=true;//简易设置中子部门是否继承权限
private String position;//选择数据表所在的位置,其值为fast(快速授权中)或dataRule(数据分类中)
private String messageTip="";//当修改数据表时的提示信息
private Long permissionId;//快速授权的permissionId,当修改数据表时的提示信息要用到
private Long listViewId;//快速授权的listViewId,当修改数据表时的提示信息要用到
private boolean hasBranch = false;//是否有分支
@Autowired
private DataRuleManager dataRuleManager;
@Autowired
private MenuManager menuManager;
@Autowired
private ConditionManager conditionManager;
@Autowired
private ListViewManager listViewManager;
@Autowired
private ListColumnManager listColumnManager;
@Autowired
private PermissionManager permissionManager;
private static final String SUCCESS_MESSAGE_LEFT = "<font class=\"onSuccess\"><nobr>";
private static final String MESSAGE_RIGHT = "</nobr></font>";
private static final String ERROR_MESSAGE_LEFT = "<font class=\"onError\"><nobr>";
protected void addErrorMessage(String message){
this.addActionMessage(ERROR_MESSAGE_LEFT+message+MESSAGE_RIGHT);
}
protected void addSuccessMessage(String message){
this.addActionMessage(SUCCESS_MESSAGE_LEFT+message+MESSAGE_RIGHT);
}
@Override
@Action("data-rule-delete")
public String delete() throws Exception {
dataRuleManager.deleteDataRule(ids);
this.renderText("ok");
return null;
}
@Action("data-rule-validateDelete")
public String validateDelete() throws Exception {
String result=dataRuleManager.validateDelete(ids);
if(StringUtils.isNotEmpty(result)){
this.renderText(result);
}else{
this.renderText("ok");
}
return null;
}
@Override
@Action("data-rule-input")
public String input() throws Exception {
if(dataRuleId==null && sysMenuId != null){
dataRule.setMenuId(sysMenuId);
dataRule.setCode(createDataRuleCode());
}
return "data-rule-input";
}
private String createDataRuleCode(){
int num=0;
List<DataRule> dataRuleList=dataRuleManager.getDefaultCodeDataRules();
if(dataRuleList != null && dataRuleList.size()>0){
for(DataRule w:dataRuleList){
String codeNum=w.getCode().replace("dataRule-", "");
if(codeNum.matches("^-?\\d+$")&&Integer.valueOf(codeNum)>num){
num=Integer.valueOf(codeNum);
}
}
}else{
return "dataRule-1";
}
return "dataRule-"+(num+1);
}
@Override
@Action("data-rule")
public String list() throws Exception {
List<Menu> menus = menuManager.getEnabledRootMenuByCompany();
if(sysMenuId==null&&menus.size()>0){
sysMenuId = menus.get(0).getId();
}
if(page.getPageSize()>1){
dataRuleManager.getDataRulesByMenuId(page,sysMenuId);
this.renderText(PageUtils.pageToJson(page));
return null;
}
return "data-rule";
}
protected void prepareModel() throws Exception {
if(dataRuleId==null){
dataRule=new DataRule();
}else{
dataRule=dataRuleManager.getDataRule(dataRuleId);
}
}
@Override
@Action("data-rule-save")
public String save() throws Exception {
dataRule.setMenuId(sysMenuId);
dataRuleManager.saveDataRule(dataRule);
dataRuleId=dataRule.getId();
addSuccessMessage("保存成功");
return "data-rule-input";
}
public void prepareValidateOnlyCode() throws Exception {
prepareModel();
}
/**
* 验证数据规则的编码是否唯一
* @return
*/
@Action("validate-only-code")
public String validateOnlyCode() throws Exception{
boolean sign=true;
DataRule original=null;
if(dataRuleId==null){
original=dataRuleManager.getDataRuleByCode(dataRule.getCode());
if(original!=null){
sign=false;
}
}else{
original=dataRuleManager.getDataRuleByCode(dataRule.getCode(),dataRuleId);
if(original!=null){
sign=false;
}
}
if(sign){
this.renderText("ok");
}else{
this.renderText("no");
}
return null;
}
/**
* 选择数据表
* @return
*/
@Action("data-rule-selectDataTable")
public String selectDataTable() {
if(dataRuleId!=null){//数据分类中修改数据表时提示信息
messageTip = "请修改数据授权【";
String message = "";
List<Permission> permissions = permissionManager.getPermissionsByDataRule(dataRuleId);
for(int i = 0;i<permissions.size();i++){
Permission p = permissions.get(i);
if(p.getListViewId()!=null){
message = message+p.getCode();
if(i<permissions.size()-1){
message = message+",";
}
}
}
if(StringUtils.isNotEmpty(message)){
messageTip = messageTip+message+"】选择的列表";
}else{
messageTip="";
}
}
if(!selectPageFlag){
List<ZTreeNode> treeNodes = new ArrayList<ZTreeNode>();
ZTreeNode node=null;
List<Menu> menus = menuManager.getEnabledStandardRootMenuByCompany();
if(menus.size()<=0){
node = new ZTreeNode("menu","0","数据表", "false", "false", "", "", "folder", "");
}else{
for (Menu menu : menus) {
List<DataTable> dataTables = dataRuleManager.getEnabledStandardDataTableByMenuId(menu.getId());
node = new ZTreeNode(menu.getId().toString(),"0",menu.getName(), "false", "false", "", "", "folder", "");
treeNodes.add(node);
for(DataTable dataTable:dataTables){
node = new ZTreeNode(dataTable.getId().toString()+"="+dataTable.getAlias()+"="+menu.getId(),menu.getId().toString(),dataTable.getAlias()+"("+ dataTable.getName()+")", "false", "false", "", "", "folder", "");
treeNodes.add(node);
}
}
}
renderText(JsonParser.object2Json(treeNodes));
return null;
}
return SUCCESS;
}
/**
* 选择列表
* @return
*/
@Action("data-rule-selectListView")
public String selectListView() {
listViews = listViewManager.getListViewByTabelId(dataTableId);
return "data-rule-selectListView";
}
/**
* 选择数据规则
* @return
*/
@Action("data-rule-selectDataRule")
public String selectDataRule() {
if(!selectPageFlag){
List<Menu> menus = menuManager.getEnabledStandardRootMenuByCompany();
StringBuilder tree = new StringBuilder("[ ");
if(menus.size()<=0){
tree.append(JsTreeUtils.generateJsTreeNodeNew("menu", "", "数据规则", "root"));
}else{
for (Menu menu : menus) {
List<DataRule> dataRules = dataRuleManager.getDataRulesByMenuId(menu.getId());
if(dataRules.size()>0){
tree.append(JsTreeUtils.generateJsTreeNodeDefault("menu", "open",
menu.getName(),getDataRuleByMenu(dataRules))).append(",");
}else{
tree.append(JsTreeUtils.generateJsTreeNodeDefault("menu", null,
menu.getName())).append(",");
}
}
}
JsTreeUtils.removeLastComma(tree);
tree.append(" ]");
renderText(tree.toString());
return null;
}
return SUCCESS;
}
private String getDataRuleByMenu(List<DataRule> dataRules) {
StringBuilder subNodes=new StringBuilder();
for (DataRule dataRule : dataRules) {
subNodes.append(JsTreeUtils.generateJsTreeNodeDefault(dataRule.getId().toString()+"_"+dataRule.getName(), null,dataRule.getName())).append(",");
}
JsTreeUtils.removeLastComma(subNodes);
return subNodes.toString();
}
/**
* 选择数据表字段
* @return
*/
@Action("data-rule-selectColumn")
public String selectColumn() {
if(tableColumnPage.getPageSize()>1){
dataRuleManager.getTableColumnByDataTableId(tableColumnPage,tableId);
this.renderText(PageUtils.pageToJson(tableColumnPage));
return null;
}
return "data-rule-selectColumn";
}
/**
* 设置布尔型数据的条件值
* @return
*/
@Action("data-rule-setValue")
public String setValue() {
String[] stringArray = dataValue.split(",");
for (String s : stringArray) {
String[] str = new String[2];
str[0] = s.split(":")[0];
str[1] = s.split(":")[1].replace("'", "");
values.add(str);
}
return "data-rule-setValue";
}
/**
* 删除数据表规则条件
* @return
*/
@Action("data-rule-deleteCondition")
public String deleteCondition() {
conditionManager.delete(id);
String callback=Struts2Utils.getParameter("callback");
this.renderText(callback+"({msg:'删除成功'})");
return null;
}
/**
* 根据规则id获得数据表规则条件
* @return
*/
@Action("data-rule-condition-list")
public String conditionList() {
if(conditionPage.getPageSize()>1){
if(id!=null){
conditionManager.getConditionPage(conditionPage, id);
this.renderText(PageUtils.pageToJson(conditionPage));
}
}
return null;
}
/**
* 规则类别树
* @return
* @throws Exception
*/
@Action("data-rule-type-tree")
public String dataRuleTypeTree() throws Exception {
List<ZTreeNode> treeNodes = new ArrayList<ZTreeNode>();
List<Menu> menus = menuManager.getEnabledStandardRootMenuByCompany();
java.util.Collections.sort(menus);
String result ="";
for(Menu menu :menus){
ZTreeNode root = new ZTreeNode("menuId_"+menu.getId().toString(),"0",menu.getName(), "false", "false", "", "", "folder", "");
treeNodes.add(root);
}
result = JsonParser.object2Json(treeNodes);
renderText(result);
return null;
}
/**
* 树页面
*/
@Action("data-rule-tree-page")
public String dataRuleTreePage(){
hasBranch = ContextUtils.hasBranch();
return SUCCESS;
}
/**
* 组织结构+标准值树
* @return
*/
@Action("data-rule-selectRelativeCondition")
public String relativeConditionTree(){
List<ZTreeNode> treeNodes = new ArrayList<ZTreeNode>();
if(PermissionUtils.STANDARD_FIELD_CREATOR.equals(standardField)){
this.renderText(PermissionItemTreeUtil.getCreatorTree(currentTreeId));
return null;
}else if(PermissionUtils.STANDARD_FIELD_DEPARMENT.equals(standardField)){
this.renderText(PermissionItemTreeUtil.getDepartmentTree(currentTreeId));
return null;
}else if(PermissionUtils.STANDARD_FIELD_ROLE.equals(standardField)){
this.renderText(PermissionItemTreeUtil.getRoleTree());
return null;
}else if(PermissionUtils.STANDARD_FIELD_WORKGROUP.equals(standardField)){
this.renderText(PermissionItemTreeUtil.getWorkgroupTree(currentTreeId));
return null;
}else{
ZTreeNode root = new ZTreeNode("root~~root~~root","0","标准值", "true", "false", "", "", "folder", "");
treeNodes.add(root);
conditionChildren(treeNodes,"root~~root~~root");
this.renderText(JsonParser.object2Json(treeNodes));
return null;
}
}
private void conditionChildren(List<ZTreeNode> treeNodes,String parentId) {
ConditionType[] types = ConditionType.values();
for(int i=0;i<types.length;i++){
ZTreeNode root = new ZTreeNode("condition~~"+types[i].toString()+"~~"+Struts2Utils.getText(types[i].getCode()),parentId,Struts2Utils.getText(types[i].getCode()), "false", "false", "", "", "folder", "");
treeNodes.add(root);
}
}
@Action("data-rule-getSystemUrlByTalbeId")
public String getSystemUrlByTalbeId(){
this.renderText(dataRuleManager.getSystemUrlByTalbeId(dataTableId)+valueUrl);
return null;
}
@Action("data-rule-getOptionValue")
public String getOptionValue(){
String result = dataRuleManager.getOptionValue(dataValue);
this.renderText(result+"-"+currentInputId);
return null;
}
/**
* 根据数据表字段信息的行id获取列表中的值设置
* @return
*/
@Action("data-rule-getValuesetByTableColumn")
public String getValuesetByTableColumn(){
String valueSet = listColumnManager.getValuesetByTableColumn(tableColumnId);
renderText(valueSet);
return null;
}
@Action("data-rule-selectStandardColumn")
public String selectStandardColumn(){
return "data-rule-selectStandardColumn";
}
public DataRule getModel() {
return dataRule;
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getIds() {
return ids;
}
public void setIds(String ids) {
this.ids = ids;
}
public DataRule getDataRule() {
return dataRule;
}
public void setDataRule(DataRule dataRule) {
this.dataRule = dataRule;
}
public Page<DataRule> getPage() {
return page;
}
public void setPage(Page<DataRule> page) {
this.page = page;
}
public Page<DataTable> getDataRulePage() {
return dataRulePage;
}
public void setDataRulePage(Page<DataTable> dataRulePage) {
this.dataRulePage = dataRulePage;
}
public void setTableId(Long tableId) {
this.tableId = tableId;
}
public Long getTableId() {
return tableId;
}
public Page<TableColumn> getTableColumnPage() {
return tableColumnPage;
}
public void setTableColumnPage(Page<TableColumn> tableColumnPage) {
this.tableColumnPage = tableColumnPage;
}
public String getCurrentInputId() {
return currentInputId;
}
public void setCurrentInputId(String currentInputId) {
this.currentInputId = currentInputId;
}
public Page<Condition> getConditionPage() {
return conditionPage;
}
public void setConditionPage(Page<Condition> conditionPage) {
this.conditionPage = conditionPage;
}
public Long getRuletypeId() {
return ruletypeId;
}
public void setRuletypeId(Long ruletypeId) {
this.ruletypeId = ruletypeId;
}
public Long getDataRuleId() {
return dataRuleId;
}
public void setDataRuleId(Long dataRuleId) {
this.dataRuleId = dataRuleId;
}
public String getDataValue() {
return dataValue;
}
public void setDataValue(String dataValue) {
this.dataValue = dataValue;
}
public List<String[]> getValues() {
return values;
}
public void setValues(List<String[]> values) {
this.values = values;
}
public Long getSysMenuId() {
return sysMenuId;
}
public void setSysMenuId(Long sysMenuId) {
this.sysMenuId = sysMenuId;
}
public boolean isSelectPageFlag() {
return selectPageFlag;
}
public void setSelectPageFlag(boolean selectPageFlag) {
this.selectPageFlag = selectPageFlag;
}
public Long getDataTableId() {
return dataTableId;
}
public void setDataTableId(Long dataTableId) {
this.dataTableId = dataTableId;
}
public String getValueUrl() {
return valueUrl;
}
public void setValueUrl(String valueUrl) {
this.valueUrl = valueUrl;
}
public List<ListView> getListViews() {
return listViews;
}
public void setTableColumnId(Long tableColumnId) {
this.tableColumnId = tableColumnId;
}
public String getStandardField() {
return standardField;
}
public void setStandardField(String standardField) {
this.standardField = standardField;
}
public String getCurrentTreeId() {
return currentTreeId;
}
public void setCurrentTreeId(String currentTreeId) {
this.currentTreeId = currentTreeId;
}
public String getRowId() {
return rowId;
}
public void setRowId(String rowId) {
this.rowId = rowId;
}
public Boolean getDeparmentInheritable() {
return deparmentInheritable;
}
public void setDeparmentInheritable(Boolean deparmentInheritable) {
this.deparmentInheritable = deparmentInheritable;
}
public void setPosition(String position) {
this.position = position;
}
public String getPosition() {
return position;
}
public String getMessageTip() {
return messageTip;
}
public void setPermissionId(Long permissionId) {
this.permissionId = permissionId;
}
public Long getListViewId() {
return listViewId;
}
public void setListViewId(Long listViewId) {
this.listViewId = listViewId;
}
public boolean isHasBranch() {
return hasBranch;
}
public void setHasBranch(boolean hasBranch) {
this.hasBranch = hasBranch;
}
}