package com.cabletech.business.assess.action;
import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Map;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.lang.StringUtils;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.poifs.filesystem.POIFSFileSystem;
import org.apache.struts2.convention.annotation.Action;
import org.apache.struts2.convention.annotation.InterceptorRef;
import org.apache.struts2.convention.annotation.InterceptorRefs;
import org.apache.struts2.convention.annotation.Namespace;
import org.apache.struts2.convention.annotation.Result;
import org.apache.struts2.convention.annotation.Results;
import com.cabletech.baseinfo.business.entity.UserInfo;
import com.cabletech.business.assess.model.AssessTemplate;
import com.cabletech.business.assess.service.AssessTemplateImportService;
import com.cabletech.common.base.BaseAction;
import com.cabletech.common.base.SysConstant;
import com.cabletech.common.externalresources.ExternalResourcesAccessService;
/**
*
* 考核模板导入 ACTION
*
* @author 杨隽 2012-07-31 创建
*/
@Namespace("/assess")
@Results({
@Result(name = "input", location = "/assess/assess_template_import.jsp"),
@Result(name = "preview", location = "/assess/assess_template_preview.jsp") })
@Action("/assessTemplateImportAction")
@InterceptorRefs({ @InterceptorRef("fileUploadStack"),
@InterceptorRef("defaultStack") })
public class AssessTemplateImportAction extends
BaseAction<AssessTemplate, String> {
/**
* 序列化编号
*/
private static final long serialVersionUID = 1L;
/**
* 预览导入数据跳转页面
*/
private static final String PREVIEW = "preview";
/**
* 导入页面URL
*/
private static final String INPUT_URL = "/assess/assessTemplateImportAction!input.action";
/**
* 模板导入数据业务服务
*/
@Resource(name = "assessTemplateImportServiceImpl")
private AssessTemplateImportService assessTemplateImportService;
/**
* 外部资源服务业务服务
*/
@Resource(name = "externalResourcesAccessService")
private ExternalResourcesAccessService externalResourcesAccessService;
/**
* 上传的数据文件
*/
private File file;
/**
* 上传文件的内容类型
*/
private String fileContentType;
/**
* 上传文件名
*/
private String fileFileName;
/**
* 模板表单数据
*/
private AssessTemplate assessTemplate = new AssessTemplate();
/**
* 转到表单输入
*/
public String input() throws Exception {
return INPUT;
}
/**
* 导入数据预览(从导入文件中解析上传数据进行分页)
*
* @return
*/
public String previewData() {
// 上传导入数据文件
String[] uploadInfo = uploadFile();
if (!"S001".equals(uploadInfo[0])) {
super.addMessage("提示:" + uploadInfo[2], INPUT_URL,
SysConstant.WARNING);
return SUCCESS;
}
String filePath = uploadInfo[1];
try {
Map<String, Object> resultMap = assessTemplateImportService
.createItemPreviewData(assessTemplate, filePath);
super.getRequest().setAttribute("tableMap", resultMap);
return PREVIEW;
} catch (Exception ex) {
super.addMessage("导入数据不符合模板规范!", INPUT_URL, SysConstant.ERROR);
return SUCCESS;
}
}
/**
* 导入信息数据处理
*
* @return
*/
public String importData() {
UserInfo user = super.getUser();
try {
assessTemplateImportService.importItemData(assessTemplate, user);
super.addMessage("导入数据成功!", INPUT_URL, SysConstant.SUCCESS);
} catch (Exception ex) {
super.addMessage("导入数据不符合模板规范!", INPUT_URL, SysConstant.ERROR);
}
return SUCCESS;
}
/**
* 导入单模板下载
*
* @return
*/
public String downloadTemplate() {
HttpServletResponse response = getResponse();
response.reset();
response.setContentType("application/octet-stream");
try {
String downloadFilePath = SysConstant.EXCEL_DOWNLOAD_TEMPLATES_PACKAGE_PATH
+ "/assess_table_template_xls.zip";
String templateFile = getClass().getResource(downloadFilePath)
.getPath();
InputStream in = new BufferedInputStream(new FileInputStream(
templateFile));
byte[] buffer = new byte[in.available()];
in.read(buffer);
in.close();
response.setHeader("Content-Disposition", "attachment;filename="
+ new String("考核表导入模板.zip".getBytes(), "iso-8859-1"));
OutputStream out = response.getOutputStream();
out.write(buffer);
out.flush();
out.close();
} catch (Exception e) {
logger.error("下载考核表导入模板出错:", e);
}
return null;
}
public File getFile() {
return file;
}
public void setFile(File file) {
this.file = file;
}
public String getFileContentType() {
return fileContentType;
}
public void setFileContentType(String fileContentType) {
this.fileContentType = fileContentType;
}
public String getFileFileName() {
return fileFileName;
}
public void setFileFileName(String fileFileName) {
this.fileFileName = fileFileName;
}
@Override
public AssessTemplate getModel() {
return assessTemplate;
}
public AssessTemplate getAssessTemplate() {
return assessTemplate;
}
public void setAssessTemplate(AssessTemplate assessTemplate) {
this.assessTemplate = assessTemplate;
}
@Override
protected void prepareViewModel() throws Exception {
}
@Override
protected void prepareSaveModel() throws Exception {
}
/**
* 执行上传导入数据的文件
*
* @return String[] 上传文件信息:数组第一个元素为上传是否成功信息,第二个元素为上传后的数据文件路径
*/
private String[] uploadFile() {
// FormFile file = getFile();
String uploadCode = "S001";
String filePathNameStr = "";
String errorMsg = "";
if (file != null) {
String filename = fileFileName;
if (StringUtils.isBlank(filename)) {
uploadCode = "fileerror";
errorMsg = "文件名为空!";
}
// 文件类型必须是xls的
String fileExtName = filename
.substring(filename.lastIndexOf(".") + 1);
if (!"xls".equals(fileExtName) && !"xlsx".equals(fileExtName)) {
uploadCode = "structerror";
errorMsg = "文件类型不是xls格式!";
}
if (file.length() > 2000000) {
uploadCode = "fileoutsize";
errorMsg = "文件超过规定长度!";
}
} else {
uploadCode = "fileerror";
errorMsg = "文件上传错误!";
}
// 保存文件
if ("S001".equals(uploadCode)) {
filePathNameStr = saveFile(file);
if (filePathNameStr == null) {
uploadCode = "fileerror";
errorMsg = "文件上传错误!";
}
}
return new String[] { uploadCode, filePathNameStr, errorMsg };
}
/**
* 将上传的文件保存为临时文件
*
* @param formFile
* File
* @return String
*/
private String saveFile(File formFile) {
if (formFile == null) {
return null;
}
String uploadRoot = externalResourcesAccessService.getUploadroot();
uploadRoot = uploadRoot + File.separator + "temp";
SimpleDateFormat formatter = new SimpleDateFormat("yyyy/MM/ddHHmmss");
String strTemp = formatter.format(new Date());
String fileSptr = File.separator;
String saveAsName = strTemp.substring(8, 16) + fileFileName;
String relativePath = strTemp.substring(0, 4) + fileSptr
+ strTemp.subSequence(5, 7);
String absolutePath = uploadRoot + fileSptr + relativePath;
String absolutePathFile = absolutePath + fileSptr + saveAsName;
(new File(absolutePath)).mkdirs();
// 保存文件
try {
InputStream streamIn = new FileInputStream(formFile);
OutputStream streamOut = new FileOutputStream(absolutePathFile);
int bytesRead = 0;
byte[] buffer = new byte[8192];
while ((bytesRead = streamIn.read(buffer, 0, 8192)) != -1) {
streamOut.write(buffer, 0, bytesRead);
}
streamOut.close();
streamIn.close();
return absolutePathFile;
} catch (Exception e) {
logger.error("导入文件时出错:", e);
return null;
}
}
}