package com.ycsoft.sysmanager.component.config;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Component;
import com.ycsoft.beans.config.TAddress;
import com.ycsoft.beans.config.TRuleDefine;
import com.ycsoft.beans.config.TRuleDefineCounty;
import com.ycsoft.beans.config.TRuleEdit;
import com.ycsoft.beans.system.SCounty;
import com.ycsoft.beans.system.SDataRightType;
import com.ycsoft.beans.system.SOptr;
import com.ycsoft.business.dao.config.TAddressDao;
import com.ycsoft.business.dao.config.TRuleDefineCountyDao;
import com.ycsoft.business.dao.config.TRuleDefineDao;
import com.ycsoft.business.dao.config.TRuleEditDao;
import com.ycsoft.business.dao.system.SCountyDao;
import com.ycsoft.commons.abstracts.BaseComponent;
import com.ycsoft.commons.constants.DataRight;
import com.ycsoft.commons.constants.SystemConstants;
import com.ycsoft.commons.exception.ComponentException;
import com.ycsoft.commons.helper.CollectionHelper;
import com.ycsoft.commons.helper.StringHelper;
import com.ycsoft.commons.store.MemoryDict;
import com.ycsoft.commons.tree.TreeBuilder;
import com.ycsoft.commons.tree.TreeNode;
import com.ycsoft.daos.core.Pager;
import com.ycsoft.sysmanager.dto.config.RuleDefineDto;
import com.ycsoft.sysmanager.dto.config.RuleEditDto;
import com.ycsoft.sysmanager.dto.config.VewRuleObjDto;
import com.ycsoft.sysmanager.dto.config.VewRulePropDto;
@Component
public class RuleComponent extends BaseComponent {
private TRuleDefineDao tRuleDefineDao;
private TRuleEditDao tRuleEditDao;
private SCountyDao sCountyDao;
private TAddressDao tAddressDao;
private TRuleDefineCountyDao tRuleDefineCountyDao;
/**
* 明细规则配置
* @param rule
* @throws Exception
*/
public String updateDetailRule(RuleDefineDto ruleDto) throws Exception {
TRuleDefine rule = new TRuleDefine();
BeanUtils.copyProperties(ruleDto, rule);
String ruleId = rule.getRule_id();
if(StringHelper.isEmpty(ruleId)){
ruleId = gRuleId();
rule.setRule_id(ruleId);
rule.setCfg_type(SystemConstants.RULE_CFG_TYPE_DETAIL);
rule.setRule_type(SystemConstants.RULE_TYPE_DATA);
tRuleDefineDao.save(rule);
}else{
tRuleDefineDao.update(rule);
tRuleDefineCountyDao.delete(rule.getRule_id());
}
saveRuleCounty(ruleDto.getCounty_id().split(","), rule.getRule_id());
return ruleId;
}
/**
* 根据用户选择的数据类型,动态查询数据
* @param tableName
* @param resultColumn
* @param selectColumn
* @return
* @throws Exception
*/
public List queryDynamicData(String tableName,String resultColumn,String selectColumn) throws Exception {
return sDataRightTypeDao.queryDynamicData(tableName, resultColumn, selectColumn);
}
/**
* 查询所有数据类型
* @return
* @throws Exception
*/
public List<SDataRightType> queryAllSDataType() throws Exception {
return sDataRightTypeDao.queryDataRight();
}
/**
* 保存或修改手工规则
* @param rule
* @throws Exception
*/
public String updateHandRule(RuleDefineDto ruleDto) throws Exception {
TRuleDefine rule = new TRuleDefine();
BeanUtils.copyProperties(ruleDto, rule);
String ruleId = rule.getRule_id();
if(StringHelper.isEmpty(ruleId)){
ruleId = gRuleId();
rule.setRule_id(ruleId);
rule.setCfg_type(SystemConstants.RULE_CFG_TYPE_HAND);//手工
tRuleDefineDao.save(rule);
}else{
tRuleDefineDao.update(rule);
tRuleDefineCountyDao.delete(ruleId);
}
saveRuleCounty(ruleDto.getCounty_id().split(","), rule.getRule_id());
return ruleId;
}
private void saveRuleCounty(String[] countyIdArr,String ruleId) throws Exception {
List<TRuleDefineCounty> rcList = new ArrayList<TRuleDefineCounty>();
for (int i = 0, len = countyIdArr.length; i < len; i++) {
TRuleDefineCounty ruleCounty = new TRuleDefineCounty();
ruleCounty.setCounty_id(countyIdArr[i]);
ruleCounty.setRule_id(ruleId);
rcList.add(ruleCounty);
}
tRuleDefineCountyDao.save(rcList.toArray(new TRuleDefineCounty[rcList.size()]));
}
/**
* 保存或修改条件规则
* @param rule
* @param ruleEdits
* @throws Exception
*/
public String updateRuleAndRuleEdit(RuleDefineDto ruleDto,List<TRuleEdit> ruleEdits) throws Exception {
TRuleDefine rule = new TRuleDefine();
BeanUtils.copyProperties(ruleDto, rule);
String ruleId = rule.getRule_id();
if(StringHelper.isEmpty(ruleId)){
ruleId = gRuleId();
for(TRuleEdit ruleEdit : ruleEdits){
ruleEdit.setRule_id(ruleId);
}
rule.setRule_id(ruleId);
rule.setCfg_type(SystemConstants.RULE_CFG_TYPE_COND);
tRuleDefineDao.save(rule);
}else{
tRuleDefineDao.update(rule);
tRuleEditDao.deleteByRuleId(ruleId);
tRuleDefineCountyDao.delete(ruleId);
}
tRuleEditDao.save(ruleEdits.toArray(new TRuleEdit[ruleEdits.size()]));
saveRuleCounty(ruleDto.getCounty_id().split(","), rule.getRule_id());
return ruleId;
}
/**
* 根据数据类型查询对应规则属性
* @param dataType
* @return
* @throws Exception
*/
public List<VewRulePropDto> queryRulePropByDataRightType(String dataType) throws Exception {
return tRuleDefineDao.queryRulePropByDataRightType(dataType);
}
/**
* 根据ruleid 查询要编辑的规则信息
* @param ruleId
* @return
* @throws Exception
*/
public List<TRuleEdit> queryRuleEditByRuleId(String ruleId) throws Exception {
List<TRuleEdit> list = tRuleEditDao.queryRuleEditByRuleId(ruleId);
/**
* bug: 0001254: 条件规则修改后值乱了
* 原因是在存入的时候, t_rule_edit表prop_name属性直接存储字面值
* 解决办法,重新查询下该属性.
* 不必更新,如果下次再查询,这里又会重新查询一次.
*/
for(TRuleEdit edit:list){
String data_type = edit.getData_type();
String prop_id = edit.getProp_id();
String prop_value = edit.getProp_value();
if(StringHelper.isEmpty(prop_value)){
continue;
}
if(data_type.equalsIgnoreCase("F")){//functions类型,地址
if(prop_id.equalsIgnoreCase("inAddr")){//铁定地址
TAddress address = tAddressDao.findByKey(prop_value);
if(null == address){
throw new ComponentException("获取地址数据出错!");
}
edit.setProp_value_text("("+address.getAddr_name()+")");
}
}else if(data_type.equalsIgnoreCase("S")){
edit.setProp_value_text(MemoryDict.getDictName(edit.getParam_name(), prop_value));
}
}
return list;
}
/**
* 规则属性
* @return
* @throws Exception
*/
public List<TreeNode> queryRuleProp(String prop_name) throws Exception {
List list = tRuleDefineDao.queryRuleProp(prop_name);
return TreeBuilder.createTree( list );
}
/**
* 规则对应的 引用对象
* @param rule_id 规则id
* @return
* @throws Exception
*/
public List<VewRuleObjDto> queryRuleObjByRuleId(String ruleId) throws Exception{
return tRuleDefineDao.queryRuleObjByRuleId(ruleId);
}
public TRuleDefine getTruleByRuleId(String ruleId) throws Exception{
String sql = "select * from T_RULE_DEFINE where rule_id = ? ";
return tRuleDefineDao.getTruleByRuleId(ruleId);
}
public String gRuleId() throws Exception {
return tRuleDefineDao.findSequence().toString();
}
public Pager<RuleDefineDto> queryAllRules(String query,String dataType,String countyId,Integer start,Integer limit) throws Exception {
return tRuleDefineDao.queryAllRule(query,dataType,countyId,start,limit);
}
public List<TRuleDefine> queryPromotionRuleByCountyId(String countyId) throws Exception {
return tRuleDefineDao.queryRuleByCountyId(countyId);
}
public List<SCounty> queryRuleCounty(SOptr optr) throws Exception {
if(SystemConstants.COUNTY_ALL.equals(optr.getCounty_id())){
return sCountyDao.findAll();
}else {
String dataRight = this.queryDataRightCon(optr, DataRight.CHANGE_COUNTY.toString());
return sCountyDao.queryCountyByDataRight(dataRight);
}
}
public void setTRuleDefineDao(TRuleDefineDao ruleDefineDao) {
tRuleDefineDao = ruleDefineDao;
}
public void setTRuleEditDao(TRuleEditDao ruleEditDao) {
tRuleEditDao = ruleEditDao;
}
public void setSCountyDao(SCountyDao countyDao) {
sCountyDao = countyDao;
}
public void setTAddressDao(TAddressDao tAddressDao) {
this.tAddressDao = tAddressDao;
}
public void setTRuleDefineCountyDao(TRuleDefineCountyDao ruleDefineCountyDao) {
tRuleDefineCountyDao = ruleDefineCountyDao;
}
/**
* 为记录变更查询数据.
* @param rule
* @return
* @throws ComponentException
*/
public RuleEditDto queryRuleForCollectChangeInfo(RuleDefineDto rule1) throws ComponentException{
RuleEditDto result = new RuleEditDto();
if(null == rule1 || StringHelper.isEmpty(rule1.getRule_id())){
return null;
}
RuleDefineDto rule = new RuleDefineDto();
rule.setRule_id(rule1.getRule_id());
try{
TRuleDefine trule = tRuleDefineDao.findByKey(rule.getRule_id());
BeanUtils.copyProperties(trule, rule);
Map<String, Serializable> params = new HashMap<String, Serializable>();
params.put("rule_id", rule.getRule_id());
List<TRuleDefineCounty> ruleCounty = tRuleDefineCountyDao.findByMap(params);
if(ruleCounty.size() > 0){
List<String> countys = CollectionHelper.converValueToList(ruleCounty, "county_id");
String countyId = "";
for(String c:countys){
countyId += c +",";
}
if(countyId.length()>0)
countyId=countyId.substring(0,countyId.length()-1);
rule.setCounty_id(countyId);
}
result.setRule(rule);
List<TRuleEdit> ruleEdits = queryRuleEditByRuleId(rule.getRule_id());
result.setRuleEdits(ruleEdits);
}catch (Exception e) {
throw new ComponentException(e);
}
return result;
}
}