package com.cabletech.business.wplan.patrolitem.service.impl;
import java.io.OutputStream;
import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.annotation.Resource;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;
import com.cabletech.business.wplan.patrolitem.model.PatrolItem;
import com.cabletech.business.wplan.patrolitem.model.PatrolItemTemp;
import com.cabletech.business.wplan.patrolitem.service.PatrolItemImportService;
import com.cabletech.business.wplan.patrolitem.service.PatrolItemService;
import com.cabletech.common.base.BaseDao;
import com.cabletech.common.base.BaseServiceImpl;
import com.cabletech.common.excel.exports.ExcelExport;
import com.cabletech.common.excel.imports.ExcelImport;
/**
* 巡检项导入数据业务服务接口实现
*
* @author wangjie
* @author 杨隽 2011-10-25 添加导入巡检项目的“值域范围”和“默认值”字段
* @author 杨隽 2011-10-25 添加启用巡检项目、修改逻辑删除为作废,废弃物理删除
* @author 杨隽 2012-02-13 重构导入方法
* @author 杨隽 2012-02-13 分离巡检项导入业务和巡检项基本操作业务
* @author 杨隽 2012-02-14 重构saveBatch方法
* @author 杨隽 2012-02-15 实现exportInvalidItemData()方法
* @author 杨隽 2012-02-24 修改exportInvalidItemData()方法
*
*/
@Service
public class PatrolItemImportServiceImpl extends
BaseServiceImpl<PatrolItem, String> implements PatrolItemImportService {
@Resource(name = "patrolItemServiceImpl")
private PatrolItemService patrolItemService;
@Resource(name = "patrolItemExcelImport")
private ExcelImport excelImport;
@Resource(name = "invalidPatrolItemExcelExport")
private ExcelExport excelExport;
// 预览数据信息列表
private List<PatrolItemTemp> list;
// 导入错误提示信息列表
private List<PatrolItemTemp> errorList = new ArrayList<PatrolItemTemp>();
/**
* 根据要导入的Excel文件生成预览数据
*
* @param filePath
* String 导入的巡检报表文件路径信息
* @throws Exception
*/
public List<PatrolItemTemp> createItemPreviewData(String filePath) {
list = new ArrayList<PatrolItemTemp>();
excelImport.setLists(list, errorList);
excelImport.importExcelData(filePath);
return list;
}
/**
* 导入Excel数据
*
* @param parameterMap
* Map<String,String>
* 导入Excel的参数:file_path->导入的巡检报表文件路径信息,business_type
* ->专业类型,region_id->区域编号
* @return Map 导入的结果Map
*/
@SuppressWarnings({ "unchecked", "rawtypes" })
@Transactional
public Map importItemData(Map<String, String> parameterMap) {
list = new ArrayList<PatrolItemTemp>();
errorList = new ArrayList<PatrolItemTemp>();
excelImport.setLists(list, errorList);
excelImport.importExcelData(parameterMap.get("file_path"));
saveBatch(list, parameterMap);
Map resultMap = new HashMap();
List importedList = calculateValidRatio(resultMap);
resultMap.put("invalid_cell_list", errorList);
resultMap.put("valid_cell_list", importedList);
return resultMap;
}
/**
* 导出出错的导入巡检项数据
*
* @param out
* OutputStream 输出流
* @param list
* List 出错的导入巡检项数据列表
*/
@SuppressWarnings("rawtypes")
public void exportInvalidItemData(OutputStream out, List list) {
try {
excelExport.exportExcelData(list);
excelExport.outExcelFile(out);
} catch (Exception e) {
logger.error("导出出错的导入巡检项数据出错:", e);
}
}
/**
* 批量保存导入的巡检项数据
*
* @param list
* List<PatrolItemTemp> 导入的巡检项数据列表
* @param parameterMap
* Map<String, String> 传入的参数Map
*/
private void saveBatch(List<PatrolItemTemp> list,
Map<String, String> parameterMap) {
PatrolItemTemp oneCellTemp;
for (int i = 0; list != null && i < list.size(); i++) {
oneCellTemp = list.get(i);
if (!oneCellTemp.isFlag()) {
continue;
}
try {
patrolItemService.save(parameterMap, oneCellTemp);
} catch (Exception e) {
logger.info("巡检项数据信息保存出错:", e);
oneCellTemp.setFlag(false);
oneCellTemp.setErrorMsg("巡检项数据信息保存出错!");
errorList.add(oneCellTemp);
}
}
}
/**
* 计算导入巡检项的合法数据所占比例并返回导入的合法数据列表
*
* @param resultMap
* Map 存放导入后数据的Map
* @return List 导入的合法数据列表
*/
@SuppressWarnings({ "rawtypes", "unchecked" })
private List calculateValidRatio(Map resultMap) {
double validRatio = 0;
int totalCellNumber = 0;
int validCellNumber = 0;
int invalidCellNumber = 0;
if (!CollectionUtils.isEmpty(list)) {
totalCellNumber = list.size();
}
if (!CollectionUtils.isEmpty(errorList)) {
validCellNumber = list.size() - errorList.size();
invalidCellNumber = errorList.size();
} else {
validCellNumber = list.size();
}
if (totalCellNumber != 0) {
validRatio = 100 * validCellNumber / totalCellNumber;
}
List importedList = new ArrayList();
for (int i = 0; i < list.size(); i++) {
PatrolItemTemp oneCellTemp = (PatrolItemTemp) list.get(i);
if (oneCellTemp.isFlag()) {
importedList.add(oneCellTemp);
}
}
DecimalFormat df = new DecimalFormat("#0.00");
resultMap.put("total_cell_number", Integer.toString(totalCellNumber));
resultMap.put("valid_cell_number", Integer.toString(validCellNumber));
resultMap.put("invalid_cell_number",
Integer.toString(invalidCellNumber));
resultMap.put("valid_ratio", df.format(validRatio));
return importedList;
}
@Override
protected BaseDao<PatrolItem, String> getBaseDao() {
// TODO Auto-generated method stub
return null;
}
}