package com.cabletech.business.assess.service.impl;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.annotation.Resource;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang.ArrayUtils;
import org.apache.commons.lang.StringUtils;
import org.dom4j.Element;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import com.cabletech.baseinfo.business.entity.UserInfo;
import com.cabletech.business.assess.model.AssessTemplate;
import com.cabletech.business.assess.model.AssessTemplateContent;
import com.cabletech.business.assess.model.AssessTemplateItem;
import com.cabletech.business.assess.service.AssessTemplateImportService;
import com.cabletech.business.excel.AutoGenerateParameter;
import com.cabletech.business.excel.AutoGenerateUtils;
import com.cabletech.business.excel.TableCellData;
import com.cabletech.common.base.BaseDao;
import com.cabletech.common.base.BaseServiceImpl;
import com.cabletech.common.util.ReflectionUtils;
import com.cabletech.common.xmlparse.ParseXmlTools;
/**
* 考核模板导入业务接口实现
*
* @author 杨隽 2012-07-31 创建
*
*/
@SuppressWarnings("all")
@Service
@Transactional
public class AssessTemplateImportServiceImpl extends
BaseServiceImpl<AssessTemplate, String> implements
AssessTemplateImportService {
/**
* XML中开始列<prop>中id的值
*/
private static final String START_COL_KEY = "startCol";
/**
* XML中开始行<prop>中id的值
*/
private static final String START_ROW_KEY = "startRow";
/**
* XML中开始工作表<prop>中id的值
*/
private static final String START_SHEET_KEY = "startSheet";
/**
* XML中考核表配置<root>中id的值
*/
private static final String ASSESS_CONFIG_KEY = "assessConfig";
/**
* XML配置文件的解析工具业务服务
*/
@Resource(name = "parseXmlTools")
private ParseXmlTools parseXmlTools;
/**
* 模版-总体信息Dao
*/
@Resource(name = "assessTemplateDao")
private BaseDao assessTemplateDao;
/**
* 模版-项目Dao
*/
@Resource(name = "assessTemplateItemDao")
private BaseDao assessTemplateItemDao;
/**
* 模版-考核内容Dao
*/
@Resource(name = "assessTemplateContentDao")
private BaseDao assessTemplateContentDao;
@Override
public Map<String, Object> createItemPreviewData(
AssessTemplate assessTemplate, String filePath) {
Element root = parseXmlTools.getImportXmlElement(ASSESS_CONFIG_KEY);
AutoGenerateParameter parameter = getAutoGenerateParameter(root,
assessTemplate.getTableType());
Map<String, Object> map = AutoGenerateUtils.autoGenerate(filePath,
parameter);
processMap(root, assessTemplate.getTableType(), parameter, map);
return map;
}
@Override
public void importItemData(AssessTemplate assessTemplate, UserInfo user) {
assessTemplate.setCreateDate(new Date());
assessTemplate.setCreater(user.getPersonId());
assessTemplateDao.save(assessTemplate);
String templateId = assessTemplate.getId();
String[] itemName = assessTemplate.getItemName();
String[] name = assessTemplate.getName();
Double[] benchmarkValue = assessTemplate.getBenchmarkValue();
Double[] challengeValue = assessTemplate.getChallengeValue();
Double[] weight = assessTemplate.getWeight();
String[] demandDesc = assessTemplate.getDemandDesc();
String[] evaluationCriterion = assessTemplate.getEvaluationCriterion();
Map<String, String> keyMap = new HashMap<String, String>();
for (int i = 0; i < itemName.length; i++) {
String[] itemNames = itemName[i].split("_");
String key = "";
String itemId = "";
for (int j = 0; j < itemNames.length; j++) {
key += itemNames[j];
String parentKey = "";
for (int k = 0; k < j; k++) {
parentKey += itemNames[k];
}
String parentItemId = "";
if (keyMap.containsKey(parentKey)) {
parentItemId = keyMap.get(parentKey);
}
if (!keyMap.containsKey(key)) {
AssessTemplateItem item = new AssessTemplateItem();
item.setItemName(itemNames[j]);
item.setParentItemId(parentItemId);
item.setTableId(templateId);
assessTemplateItemDao.save(item);
itemId = item.getId();
keyMap.put(key, itemId);
logger.info(itemId + "_" + item.getItemName() + "_"
+ parentItemId);
}
}
AssessTemplateContent content = new AssessTemplateContent();
if (name != null) {
content.setName(name[i]);
}
content.setItemId(keyMap.get(itemName[i].replaceAll("_", "")));
if (benchmarkValue != null) {
if (benchmarkValue[i] == null) {
benchmarkValue[i] = new Double(0);
}
content.setBenchmarkValue(benchmarkValue[i]);
}
if (challengeValue != null) {
if (challengeValue[i] == null) {
challengeValue[i] = new Double(0);
}
content.setChallengeValue(challengeValue[i]);
}
if (weight != null) {
if (weight[i] == null) {
weight[i] = new Double(0);
}
content.setWeight(weight[i]);
}
content.setDemandDesc(demandDesc[i]);
content.setEvaluationCriterion(evaluationCriterion[i]);
assessTemplateContentDao.save(content);
if (StringUtils.isBlank(content.getName())) {
logger.info(content.getItemId() + "_" + content.getDemandDesc());
} else {
logger.info(content.getItemId() + "_" + content.getName());
}
}
}
@Override
protected BaseDao<AssessTemplate, String> getBaseDao() {
return null;
}
/**
* 从xml中读取自动生成Table的参数信息
*
* @param root
* Element
* @param type
* String
* @return AutoGenerateParameter
*/
private AutoGenerateParameter getAutoGenerateParameter(Element root,
String type) {
Element tableConfigElem = parseXmlTools.getChildElementById(root,
ParseXmlTools.CONSTANT_ELEMENT_KEY, type);
AutoGenerateParameter parameter = new AutoGenerateParameter();
Element sheetConfigElem = parseXmlTools.getChildElementById(
tableConfigElem, ParseXmlTools.PROP_ELEMENT_KEY,
START_SHEET_KEY);
parameter
.setSheetIndex(Integer.parseInt(sheetConfigElem.getTextTrim()));
Element rowConfigElem = parseXmlTools.getChildElementById(
tableConfigElem, ParseXmlTools.PROP_ELEMENT_KEY, START_ROW_KEY);
parameter.setStartRow(Integer.parseInt(rowConfigElem.getTextTrim()));
Element colConfigElem = parseXmlTools.getChildElementById(
tableConfigElem, ParseXmlTools.PROP_ELEMENT_KEY, START_COL_KEY);
parameter.setStartCol(Integer.parseInt(colConfigElem.getTextTrim()));
parameter.setDataStartRow(parameter.getStartRow() + 1);
return parameter;
}
/**
* 数据后期处理
*
* @param type
* Element
* @param root
* String
* @param parameter
* AutoGenerateParameter
* @param map
* Map<String,Object>
*/
private void processMap(Element root, String type,
AutoGenerateParameter parameter, Map<String, Object> map) {
boolean flag = true;
Element tableConfigElem = parseXmlTools.getChildElementById(root,
ParseXmlTools.CONSTANT_ELEMENT_KEY, type);
List<List<TableCellData>> dataList = (List<List<TableCellData>>) map
.get("dataList");
if (CollectionUtils.isEmpty(dataList)) {
return;
}
for (int i = 0; i < dataList.size(); i++) {
List<TableCellData> rowList = dataList.get(i);
if (CollectionUtils.isEmpty(rowList)) {
continue;
}
String errorMessage = "";
for (int j = 0; j < rowList.size(); j++) {
TableCellData data = rowList.get(j);
Element dataConfigElem = parseXmlTools.getChildElementById(
tableConfigElem, ParseXmlTools.PROP_ELEMENT_KEY, data
.getColumnInputName().replaceAll("\\s*", ""));
if (dataConfigElem != null) {
if (i >= parameter.getDataStartRow()
- parameter.getStartRow()) {
flag = checkData(data, dataConfigElem) && flag;
}
data.setColumnInputName(dataConfigElem.getTextTrim());
} else {
data.setColumnInputName("");
}
errorMessage += data.getErrorMessage();
if (j < rowList.size() - 1
&& StringUtils.isNotBlank(errorMessage)) {
errorMessage += " ";
}
}
if (i >= parameter.getDataStartRow() - parameter.getStartRow()) {
TableCellData data = new TableCellData();
data.setCellValue(errorMessage);
data.setColIndex(rowList.size());
data.setRowIndex(i);
if(StringUtils.isNotBlank(errorMessage)){
data.setCellColor("red");
}
rowList.add(data);
}
}
if (!flag) {
map.put("validData", "0");
} else {
map.put("validData", "1");
}
}
/**
* 进行数据校验
*
* @param data
* TableCellData
* @param dataConfigElem
* Element
* @return
*/
private boolean checkData(TableCellData data, Element dataConfigElem) {
boolean flag = true;
String rule = dataConfigElem
.attributeValue(ParseXmlTools.RULE_ATTRIBUTE_KEY);
if (StringUtils.isBlank(rule)) {
return flag;
}
flag = (Boolean) ReflectionUtils.invokeMethod(this, rule,
new Class[] { TableCellData.class },
new TableCellData[] { data });
return flag;
}
/**
* 判断值是否为空
*
* @param data
* TableCellData
* @return
*/
private boolean isNotNull(TableCellData data) {
if (StringUtils.isNotBlank(data.getCellValue())) {
return true;
}
data.setErrorMessage(data.getColumnInputName() + "不能为空!");
return false;
}
/**
* 判断值是否为数字
*
* @param data
* TableCellData
* @return
*/
private boolean isNumber(TableCellData data) {
String regex = "^(-)?\\d+(\\.\\d+)?$";
if (StringUtils.isBlank(data.getCellValue())) {
return true;
}
if (data.getCellValue().matches(regex)) {
return true;
}
data.setErrorMessage(data.getColumnInputName() + "必须为数字!");
return false;
}
}