/**
* 功能描述: <br>
* 批量导入
*/
@RequestMapping("sgbatchInput")
public String sgupload(HttpServletRequest request, HttpServletResponse response,
@RequestParam(required = false) int typevalue, ModelMap modelMap) throws IOException {
HashSet<String> hashSet = new HashSet<String>();
// 获取上传文件路径
MultipartRequest request2 = (MultipartRequest) request;
MultipartFile sgfile = request2.getFile("sgfile" + typevalue);
PrintWriter pw = response.getWriter();
InputStreamReader ir=new InputStreamReader(sgfile.getInputStream(), "GBK");
BufferedReader in = new BufferedReader(ir);
try {
String row = in.readLine();// 记录临时缓冲区
while (row != null) {
hashSet.add(row);
row = in.readLine();
}
if(hashSet.size()==0){
pw.write("文件为空!");
logger.info("文件为空!");
return null;
}
in.close();
ir.close();
} catch (Exception e) {
modelMap.put("errorMessage" + typevalue, "导入发生异常");
pw.write("导入发生异常");
logger.error(e.toString(), e);
}finally{
if(in!=null){
in.close();
}
if(ir!=null){
ir.close();
}
}
HashMap<String, String> errMsg = checkProblem(hashSet, typevalue);
logger.info("errMsg.size:" + errMsg.size());
if (errMsg.size() > 0) {
logger.error("errorMessage" + typevalue, errMsg.get("errorMessage" + typevalue));
modelMap.put("errorMessage" + typevalue, errMsg.get("errorMessage" + typevalue));
pw.write("导入出错:" + errMsg.get("errorMessage" + typevalue));
return null;
}
int statue = stService.batchInput(hashSet, typevalue);
if (statue == 0) {
modelMap.put("errorMessage" + typevalue, "导入失败");
pw.write("导入失败!");
}
return "redirect:/showSRSM.do?start=1";
}
--------------------------------------------------------------------------------------------------------------------------------
/**
* 检查数据是否符合要求 功能描述: <br>
* 〈功能详细描述〉
*
* @param hashSet
* @param typevalue
* @return
* @see [相关类/方法](可选)
* @since [产品/模块版本](可选)
*/
private HashMap<String, String> checkProblem(HashSet<String> hashSet, int typevalue) {
HashMap<String, String> errMsg = new HashMap<String, String>();
for (int len = hashSet.size(), i = 0; i < len; i++) {
String row = hashSet.iterator().next();
if(row.trim().length()==0){
errMsg.put("errorMessage" + typevalue, "第" + i+1 + "行不可以为空字符串");
logger.info("errorMessage" + typevalue+ "第" + i +1+ "行不可以为空字符串");
break;
}
String[] columns = row.split(",");
for (int k = 0; k < columns.length; k++) {// 头尾空格去除
columns[k] = columns[k].trim();
if (columns[k].length() == 0) {
errMsg.put("errorMessage" + typevalue, "第" + i +1+ "行第" + (k + 1) + "列属性不可以为空字符串");
logger.info("errorMessage" + typevalue+"第" + i +1+ "行第" + (k + 1) + "列属性不可以为空字符串");
break;
}
}
// 获取某个关键词下的数目
int keyDataNum = stService.getKeyNum(columns[0], typevalue);
if (columns.length != 7) {
errMsg.put("errorMessage" + typevalue, "上传的列数有误,请保证有7列并且数据中不含有英文逗号");
logger.info("errorMessage" + typevalue+"上传的列数有误,请保证有7列并且数据中不含有英文逗号");
break;
}
if (!("4".equals(columns[1].trim()) || "04".equals(columns[1].trim()))) {
errMsg.put("errorMessage" + typevalue, "推荐类型有误");
break;
}
if (keyDataNum > 8) {
errMsg.put("errormessage" + typevalue, "一个关键词维护的数目有限");
break;
}
if (Integer.parseInt(columns[6]) < 1 || Integer.parseInt(columns[6]) > 10) {
errMsg.put("errorMessage" + typevalue, "商品排序值必须是在特定区域之间");
break;
}
}
return errMsg;
}
--------------------------------------------------------------------------------------------------------------------------------------------------
/**
*
* 功能描述: <br>
* 批量导入
*
* @param hashSet
* @param typevalue
* @return
* @see [相关类/方法](可选)
* @since [产品/模块版本](可选)
*/
@Transactional
public int batchInput(HashSet<String> hashSet, int typevalue) {
int result = 0;
log.info("typevalue:---" + typevalue);
try {
result = sdService.batchUploadTypeDir(hashSet);
} catch (Exception e) {
log.error("批量导入发生异常" + e, e);
}
log.info("suggestionTypeService result:" + result);
return result;
}
/**
*
* 功能描述: <br>
* 获取一个关键词下的数据数目
*
* @param keyword
* @return
* @see [相关类/方法](可选)
* @since [产品/模块版本](可选)
*/
public int getKeyNum(String keyword, int typevalue) {
int keyNum = 0;
keyNum = stDao.getDirKeyNum(keyword);
return keyNum;
}
----------------------------------------------------------------------------------------------------------------------------------------
public int batchUploadTypeDir(HashSet<String> hashSet) {
int result = 0;
Iterator<String> it = hashSet.iterator();
// 构造主子表结构 临时变量
Map<String, Map<String, Object>> tempMap = new HashMap<String, Map<String, Object>>();
// 所有主表集合
List<Map<String, Object>> allTypes = new ArrayList<Map<String, Object>>();
while (it.hasNext()) {
String[] columns = it.next().toString().split(",");
Map<String, String> dirMap = new HashMap<String, String>();
dirMap.put("DIR_ID", columns[2]);
dirMap.put("DIR_NAME", columns[3]);
dirMap.put("DIR_IMAGE", columns[4]);
dirMap.put("URL", columns[5]);
dirMap.put("SORT", columns[6]);
Map<String, Object> typeMap = tempMap.get(columns[0] + "," + columns[1]);
if (typeMap == null) {
typeMap = new HashMap<String, Object>();
typeMap.put("KEYWORD", columns[0]);
typeMap.put("TYPE", "04");
List<Map<String, String>> dirsList = new ArrayList<Map<String, String>>();
dirsList.add(dirMap);
typeMap.put("DIRS", dirsList);
tempMap.put(columns[0] + "," + columns[1], typeMap);
allTypes.add(typeMap);
} else {
List<Map<String, String>> dirsList = (List<Map<String, String>>) typeMap.get("DIRS");
dirsList.add(dirMap);
}
}
result = suggestionDirDao.batchInsertType(allTypes);
return result;
}
--------------------------------------------------------------------------------------------------------------------
/**
*
* 功能描述: <br>
* 批量插入推荐品牌类型
*
* @param allTypes
* @return
* @see [相关类/方法](可选)
* @since [产品/模块版本](可选)
*/
public int batchInsertType(List<Map<String, Object>> allTypes) {
deleteDirsType(allTypes);// 插入之前,先删除老数据
int result = 0;
if (allTypes != null) {
for (Map<String, Object> type : allTypes) {
result += insertDirType(type);// 插入 主表
}
}
result += batchInsertDirs(allTypes);// 插入子表
return result;
}
/**
*
* 功能描述: <br>
* 批量上传常用分类主表 上传前先删除 子表、主表数据
*
* @param type
* @return
* @see [相关类/方法](可选)
* @since [产品/模块版本](可选)
*/
private int insertDirType(Map<String, Object> type) {
String insertSql = "insert into TF_SUGGESTION_TYPE (KEYWORD,TITLE,TYPE) values (?,?,?)";
int result = jdbcTemplate.update(insertSql, new Object[] { type.get("KEYWORD"), "常用分类", type.get("TYPE") });
String findIdSqlString = "select id from TF_SUGGESTION_TYPE where keyword=? and type = ?";
int id = jdbcTemplate.queryForInt(findIdSqlString, new Object[] { type.get("KEYWORD"), type.get("TYPE") });
type.put("ID", id);
return result;
}
/**
*
* 功能描述: <br>
* 先删除子表,再删除主表
*
* @param type
* @see [相关类/方法](可选)
* @since [产品/模块版本](可选)
*/
private void deleteDirsType(List<Map<String, Object>> allTypes) {
if (allTypes != null) {
for (Map<String, Object> type : allTypes) {
// 删除子表
String deleteBrandsString = "delete from tf_suggestion_directory where sug_type_id in (select id from tf_suggestion_type where keyword=? and type = ?)";
jdbcTemplate.update(deleteBrandsString, new Object[] { type.get("KEYWORD"), type.get("TYPE") });
// 删除主表
String deleteTypesString = "delete from tf_suggestion_type where keyword=? and type = ?";
jdbcTemplate.update(deleteTypesString, new Object[] { type.get("KEYWORD"), type.get("TYPE") });
}
}
}
/**
*
* 功能描述: <br>
* 批量插入子表
*
* @param allTypes
* @return
* @see [相关类/方法](可选)
* @since [产品/模块版本](可选)
*/
public int batchInsertDirs(List<Map<String, Object>> allTypes) {
int result = 0;
String insertSqlString = "insert into tf_suggestion_directory (KEYWORD,SUG_TYPE_ID,DIR_ID,DIR_IMAGE,DIR_NAME,URL,SORT) values (?,?,?,?,?,?,?)";
List<Object[]> allParamsList = new ArrayList<Object[]>();// 批量插入参数
if (allTypes != null) {
for (Map<String, Object> type : allTypes) {
List<Map<String, Object>> dirs = (List<Map<String, Object>>) type.get("DIRS");
if (dirs != null) {
for (Map<String, Object> dir : dirs) {
List<Object> paramList = new ArrayList<Object>();
paramList.add(type.get("KEYWORD"));
paramList.add(type.get("ID"));
paramList.add(dir.get("DIR_ID"));
paramList.add(dir.get("DIR_IMAGE"));
paramList.add(dir.get("DIR_NAME"));
paramList.add(dir.get("URL"));
paramList.add(dir.get("SORT"));
allParamsList.add(paramList.toArray());
}
}
}
int[] allResult = jdbcTemplate.batchUpdate(insertSqlString, allParamsList);
if (allResult != null) {// 统计总共插入多少条记录
for (int i = 0; i < allResult.length; i++) {
result += allResult[i];
}
}
}
return result;
}