package com.norteksoft.acs.service.authority;
import java.util.ArrayList;
import java.util.List;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import com.norteksoft.acs.base.enumeration.ConditionValueType;
import com.norteksoft.acs.base.enumeration.LogicOperator;
import com.norteksoft.acs.base.utils.PermissionUtils;
import com.norteksoft.acs.dao.authority.ConditionDao;
import com.norteksoft.acs.dao.authority.DataRuleDao;
import com.norteksoft.acs.entity.authority.DataRuleResult;
import com.norteksoft.acs.dao.authority.PermissionDao;
import com.norteksoft.acs.dao.authority.PermissionValidator.ConditionResult;
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.entity.authority.PermissionInfo;
import com.norteksoft.acs.entity.authority.PermissionItemCondition;
import com.norteksoft.bs.options.dao.OptionGroupDao;
import com.norteksoft.bs.options.entity.Option;
import com.norteksoft.bs.options.entity.OptionGroup;
import com.norteksoft.mms.form.dao.DataTableDao;
import com.norteksoft.mms.form.dao.TableColumnDao;
import com.norteksoft.mms.form.entity.DataTable;
import com.norteksoft.mms.form.entity.TableColumn;
import com.norteksoft.mms.form.enumeration.DataType;
import com.norteksoft.mms.module.dao.MenuDao;
import com.norteksoft.mms.module.entity.Menu;
import com.norteksoft.product.api.impl.AcsServiceImpl;
import com.norteksoft.product.orm.Page;
import com.norteksoft.product.util.ContextUtils;
import com.norteksoft.product.util.JsonParser;
import com.norteksoft.product.util.SystemUrls;
import com.norteksoft.product.web.struts2.Struts2Utils;
@Service
@Transactional
public class DataRuleManager {
@Autowired
private DataRuleDao dataRuleDao;
@Autowired
private ConditionDao conditionDao;
@Autowired
private DataTableDao dataTableDao;
@Autowired
private TableColumnDao tableColumnDao;
@Autowired
private PermissionDao permissionDao;
@Autowired
private MenuDao menuDao;
@Autowired
private OptionGroupDao optionGroupDao;
@Autowired
private PermissionItemConditionManager permissionItemConditionManager;
private final String NO_VALUE_STRING= "NO_VALUE_#~_+~=%";
private static final String BACK_VALUE_FLAG="~~~~";//表示是在弹框中回填的值
/**
* 根据id获得数据规则
* @param id
* @return
*/
@Transactional(readOnly=true)
public DataRule getDataRule(Long id) {
return dataRuleDao.get(id);
}
/**
* 获得所有数据规则
* @param page
*/
@Transactional(readOnly=true)
public void getDataRulePage(Page<DataRule> page) {
dataRuleDao.getDataRulePage(page);
}
/**
* 保存数据规则
* @param dataRule
*/
public void saveDataRule(DataRule dataRule) {
Long dataTableId = dataRule.getDataTableId();
if(dataTableId!=null){
DataTable table = dataTableDao.get(dataTableId);
if(table!=null){
Long menuId = table.getMenuId();
Menu menu=menuDao.getMenu(menuId);
if(menu != null)
dataRule.setSystemId(menu.getSystemId());
}
}
dataRuleDao.save(dataRule);
//删除规则条件项
permissionItemConditionManager.deleteAllDataRuleItemConditions(dataRule.getId());
//更新数据分类对应的规则条件
if(!dataRule.getSimplable()){
List<Condition> conditions=new ArrayList<Condition>();
List<Object> objects=JsonParser.getFormTableDatas(Condition.class);
for(Object obj:objects){
Condition condition=(Condition)obj;
condition.setDataRule(dataRule);
conditionDao.save(condition);
conditions.add(condition);
//保存数据分类条件集合
saveConditionValue(condition.getConditionName(), condition.getConditionValue(), condition.getId(),condition.getDataType());
}
if(conditions.size()>0){
dataRule.setConditions(conditions);
}
deleteConditionByRuleId(dataRule,conditions);
}else{
//删除规则
conditionDao.deleteConditionByRuleId(dataRule.getId());
}
}
private void deleteConditionByRuleId(DataRule dataRule,List<Condition> currentCons){
//删除规则
List<Condition> cons = conditionDao.getConditionsByDataRuleId(dataRule.getId());
List<Long> deleteIds = new ArrayList<Long>();
for(Condition con:cons){
if(!currentCons.contains(con)){
deleteIds.add(con.getId());
}
}
conditionDao.deleteConditionByConIds(deleteIds);
}
/**
* 保存数据分类规则条件
* @param conditionName:以逗号隔开的字符串
* @param conditionValue:以逗号隔开的字符串
*/
public void saveConditionValue(String conditionName,String conditionValue,Long dataId,DataType dataType){
if(dataType==DataType.TEXT||dataType==DataType.ENUM||dataType==DataType.BOOLEAN||dataType==DataType.LONG){//因为这几种情况有弹框设置的情况
if(StringUtils.isNotEmpty(conditionValue)&&conditionValue.contains(BACK_VALUE_FLAG)){//表示是在弹框中回填的值,conditionValue以回填的值为准
conditionValue=conditionValue.substring(0, conditionValue.indexOf(BACK_VALUE_FLAG));
}
}else{//conditionValue以conditionName的值为准
conditionValue=conditionName;
}
if(StringUtils.isNotEmpty(conditionValue)){
if(dataType==DataType.TEXT){//文本类型时手动输入了逗号,不应再截取
saveDataRuleItems(new String[]{conditionValue},new String[]{conditionName},dataId);
}else{
String[] values = conditionValue.split(",");
String[] names = conditionName.split(",");
saveDataRuleItems(values,names,dataId);
}
}
}
private void saveDataRuleItems(String[] values,String[] names,Long dataId){
for(int i=0;i<values.length;i++){
String val = values[i];
if(StringUtils.isNotEmpty(val)){
PermissionItemCondition itemCon = new PermissionItemCondition();
itemCon.setConditionName(names[i]);
itemCon.setConditionValue(val);
itemCon.setDataId(dataId);
itemCon.setValueType(ConditionValueType.DATA_RULE);
permissionItemConditionManager.save(itemCon);
}
}
}
public List<DataRule> getDataRuleByDataTable(Long tableId){
return dataRuleDao.getDataRuleByDataTable(tableId);
}
/**
* 删除数据规则且该规则下的所有条件
* @param ids
*/
public void deleteDataRule(String ids) {
for(String id:ids.split(",")){
List<Permission> list = permissionDao.getPermissionsByDataRule(Long.valueOf(id));
for(Permission p:list){
p.setDataRule(null);
permissionDao.delete(p);
}
//删除规则条件项
permissionItemConditionManager.deleteAllDataRuleItemConditions(Long.valueOf(id));
//删除规则条件
conditionDao.deleteConditionByRuleId(Long.valueOf(id));
//删除数据分类
dataRuleDao.delete(Long.valueOf(id));
}
}
/**
* 根据编号获得规则
* @param code
* @return
*/
@Transactional(readOnly=true)
public DataRule getDataRuleByCode(String code) {
return dataRuleDao.getDataRuleByCode(code);
}
/**
* 根据编号和ID获得编号相同且ID不同的规则
* @param code
* @param id
* @return
*/
@Transactional(readOnly=true)
public DataRule getDataRuleByCode(String code, Long id) {
return dataRuleDao.getDataRuleByCode(code,id);
}
/**
* 获得所有启用的数据表
* @return
*/
public void findAllEnabledDataTable(Page<DataTable> page) {
dataTableDao.findAllEnabledDataTable(page);
}
/**
* 根据数据表id获得字段
* @param tableColumnPage
* @param tableId
*/
public void getTableColumnByDataTableId(Page<TableColumn> tableColumnPage,Long dataTableId) {
tableColumnDao.getTableColumnByDataTableId(tableColumnPage, dataTableId);
}
/**
* 根据规则类型查询数据规则
* @param ruleTypeId
* @return
*/
public List<DataRule> getDataRulesByRuleType(Long ruleTypeId){
return dataRuleDao.getDataRulesByRuleType(ruleTypeId);
}
/**
* 根据规则类型查询数据规则
* @param page
* @param ruleTypeId
*/
public void getDataRulesByRuleType(Page<DataRule> page, Long ruleTypeId) {
dataRuleDao.getDataRulesByRuleType(page,ruleTypeId);
}
/**
* 根据菜单查询数据规则
* @param page
* @param ruleTypeId
*/
public void getDataRulesByMenuId(Page<DataRule> page, Long menuId) {
dataRuleDao.getDataRulesByMenuId(page,menuId);
}
/**
* 根据菜单查询数据规则
* @param page
* @param ruleTypeId
*/
public List<DataRule> getDataRulesByMenuId(Long menuId) {
return dataRuleDao.getDataRulesByMenuId(menuId);
}
/**
* 验证删除
* @param ids
* @return
*/
public String validateDelete(String ids) {
String result="";
for(String id:ids.split(",")){
List<Permission> permissions=permissionDao.getPermissionsByDataRule(Long.valueOf(id));
if(permissions != null && permissions.size()>0){
DataRule dataRule=dataRuleDao.get(Long.valueOf(id));
if(StringUtils.isNotEmpty(result))
result+="、";
result+=dataRule.getName();
}
}
if(StringUtils.isNotEmpty(result))
result="名称为:"+result+" 的数据规则中有数据授权,确定删除吗?";
return result;
}
/**
* 根据menuId获得启用的数据表
* @return
*/
public List<DataTable> getEnabledStandardDataTableByMenuId(Long menuId) {
return dataTableDao.getEnabledStandardDataTableByMenuId(menuId);
}
public ConditionResult getConditionResult(String hql,List<String> ruleCodes, LogicOperator link,Object... prmts) {
List<DataRuleResult> rules = new ArrayList<DataRuleResult>();
for (String code : ruleCodes) {
DataRule r = dataRuleDao.getDataRuleByCode(code);
DataRuleResult ruleResult = new DataRuleResult(r, null);
if(r!=null&&r.getSimplable()){
rules.add(ruleResult);
}else{
if(r!=null&& r.getConditions().size()>0) rules.add(ruleResult);
}
}
AcsServiceImpl acsService = (AcsServiceImpl)ContextUtils.getBean("acsServiceImpl");
Long userId = ContextUtils.getUserId();
List<Long> deptIds = acsService.getDepartmentIds(userId);
PermissionInfo permissionInfo = new PermissionInfo(userId, PermissionUtils.getDirectLeader(), deptIds, rules);
return PermissionUtils.getPermissionHqlPamateters(hql, permissionInfo,link, prmts);
}
public String getSystemUrlByTalbeId(Long dataTableId) {
DataTable dt = dataTableDao.get(dataTableId);
Menu menu = menuDao.getMenu(dt.getMenuId());
return SystemUrls.getSystemUrl(menu.getCode());
}
public String getOptionValue(String dataValue) {
StringBuilder result = new StringBuilder();
OptionGroup optionGroup = optionGroupDao.getOptionGroupByCode(dataValue);
for (Option option : optionGroup.getOptions()) {
result.append(option.getValue()).append(":").append(option.getName()).append(",");
}
return result.toString();
}
public void addConditionResult(String hql, List<String> dataRuleCodes,
LogicOperator link, Object[] values) {
ConditionResult cr = getConditionResult(hql, dataRuleCodes, link, values);
Struts2Utils.getRequest().setAttribute(PermissionUtils.PERMISSION_HQL, cr.getHql());
Struts2Utils.getRequest().setAttribute(PermissionUtils.PERMISSION_PARAMETERS, cr.getPrameters());
}
/**
* 保存数据规则
* @param dataRule
*/
public void saveRule(DataRule dataRule) {
dataRuleDao.save(dataRule);
}
/**
* 删除数据规则
* @param dataRule
*/
public void deleteRule(DataRule dataRule){
dataRuleDao.delete(dataRule);
}
/**
* 获得数据分类编码为默认编码的所有数据分类
* @return
*/
public List<DataRule> getDefaultCodeDataRules() {
return dataRuleDao.getDefaultCodeDataRules();
}
}