导入
导入模板格式的保单规则清单,每个文件最多可导入1000条数据,超过1000条数据,管控提示“最多可提交1000条数据,请分批导入”;
如导入文件中的保单号与系统维护清单中现有的保单号重复,更新保单规则清单中的信息”
如导入文件不符合模板规范,管控提示“请使用正确模板表格导入”;
如导入文件中的任一字段空白,管控提示“导入失败,导入失败原因为:第X行数据YYY为空!”(X为导入文件中的行数,YYY为空白字段名称【弹窗提示语中的*需筛除,如:保单号】;);
如导入文件中的保单号不是22字,管控提示“导入失败,导入失败原因为:第X行保单号应为22个字!”(X为导入文件中的行数);
导入文件中的保单号只能由大写英文字母+数字组成,否则管控提示“导入失败,导入失败原因为:第X行保单号应为22位的数字和大写英文字母组合!”(X为导入文件中的行数);
如导入文件中的起保日期格式不是年月日,管控提示“导入失败,导入失败原因为:第X行起保日期格式不是年月日(YYYY-MM-DD)!”(X为导入文件中的行数);
如导入文件中的终保日期格式不是年月日,管控提示“导入失败,导入失败原因为:第X行终保日期格式不是年月日(YYYY-MM-DD)!”(X为导入文件中的行数);
如导入文件中的起保日期>终保日期,管控提示“导入失败,导入失败原因为:第X行终保日期早于起保日期!”(X为导入文件中的行数);
如导入文件中的单次赔付最大天数不是非负整数,管控提示“导入失败,导入失败原因为:第X行单次赔付最大天数不是非负整数!”(X为导入文件中的行数);
如导入文件中的赔付最大天数不是非负整数,管控提示“导入失败,导入失败原因为:第X行赔付最大天数不是非负整数!”(X为导入文件中的行数);
如导入文件中的单次赔付最大天数>最大赔付天数,管控提示“导入失败,导入失败原因为:第X行单次最大赔付天数超过最大赔付天数!”(X为导入文件中的行数)
如导入文件中的赔付标准1(1860周岁)不是非负整数,管控提示“导入失败,导入失败原因为:第X行赔付标准1(1860周岁)不是非负整数!”(X为导入文件中的行数);
如导入文件中的赔付标准2(小于18 或 大于60 周岁)不是非负整数,管控提示“导入失败,导入失败原因为:第X行赔付标准2(小于18 或 大于60 周岁)不是非负整数!”(X为导入文件中的行数);
注:
如导入文件中有多行数据不符合管控要求,则弹出一个管控窗口,管控提示语分别展示;
如同一行数据多个字段不符合管控要求,则弹出一个管控窗口,管控提示语分别展示;
如导入文件中的保单号已在系统维护,且原保单规则为有效状态,则覆盖原保单规则;
如导入文件中的保单号已在系统维护,但原保单规则为无效状态,则原保单规则不变,新保单规则和新保单规则均保存;
/**
* 嘉兴保单规则维护导入
* @param file
* @return
*/
@RequestMapping(value = "/importExcel", method = POST)
public BaseResponse<Object> importExcel(MultipartFile file,HttpServletRequest request) {
User user = (User) request.getSession().getAttribute(Constants.SESSION_USER);
return newNotEawRuleService.importExcel(file,user);
}
/**
* 导入嘉兴保单规则excel
*
* @param file
* @return
*/
@Override
public BaseResponse<Object> importExcel(MultipartFile file, User user) {
String id = null;
try {
String originalFilename = file.getOriginalFilename();
//校验excel文件格式
String suffix = originalFilename.substring(file.getOriginalFilename().lastIndexOf(".") + 1);
if (!StringUtils.equals("xls", suffix)) {
return new BaseResponse<>(400, "请使用正确模板表格导入");
}
//获取模板标题
List<String> title = generateTitle();
//获取表
HSSFWorkbook hssfWorkbook = new HSSFWorkbook(file.getInputStream());
HSSFSheet sheet = hssfWorkbook.getSheetAt(0);
//获取总行数
int totalRowNum = sheet.getLastRowNum() + 1;
//获取第一行数据
HSSFRow row = sheet.getRow(0);
//校验模板是否一致
for (int i = 0; i < title.size(); i++) {
HSSFCell cell = row.getCell(i);
String titleName = title.get(i);
try {
String cellValue = cell.getStringCellValue();
if (!StringUtils.equals(titleName, cellValue)) {
return new BaseResponse<>(400, "请使用正确模板表格导入");
}
} catch (Exception e) {
return new BaseResponse<>(400, "请使用正确模板表格导入");
}
}
if (totalRowNum == 1) {
return new BaseResponse<>(400, "导入内容不应为空");
}
//校验条数
if (totalRowNum > 1001) {
return new BaseResponse<>(400, "导入数量不能超过1000条,请修改后重新导入");
}
List<NcEawPolicyRule> ncEawPolicyRuleList = new ArrayList<>();
return readExcel(ncEawPolicyRuleList, sheet, totalRowNum, user);
} catch (Exception e) {
e.printStackTrace();
CiapLog.info("嘉兴保单规则导入异常:" + e.getMessage());
return new BaseResponse<>(500, "嘉兴保单规则导入接口异常!");
}
}
/**
* 读取excel数据
*
* @param sheet 表
* @param totalRowNum 总行数
*/
private BaseResponse<Object> readExcel(List<NcEawPolicyRule> ncEawPolicyRuleList, HSSFSheet sheet, int totalRowNum, User user) throws Exception {
//获取第一行数据
HSSFRow row = sheet.getRow(0);
List<String> msgList = new ArrayList<>();
for (int i = 1; i < totalRowNum; i++) {
int rowNum = i+1;
HSSFRow hssfRow = sheet.getRow(i);
NcEawPolicyRule ncEawPolicyRulelVo = new NcEawPolicyRule();
for (int j = 0; j < row.getLastCellNum(); j++) {
//获取当前列的标题
HSSFCell cellTitle = row.getCell(j);
String title = cellTitle.getStringCellValue();
//获取当前行当前列的元素
HSSFCell cell = hssfRow.getCell(j);
if (cell != null && cell.getCellType() != Cell.CELL_TYPE_BLANK) {
switch (j) {
case 0:
//获取保单号
String policyNo = getValue(cell);
//校验保单号字符数
if (policyNo.length() != 22) {
CiapLog.info("导入失败,导入失败原因为:第" + rowNum + "行保单号应为22个字!");
// msgMap.put("message", "导入失败,导入失败原因为:第" + i + "行保单号应为22个字!<br>");
msgList.add("第" + rowNum + "行保单号应为22个字!");
} else if (!policyNo.matches(BAO_DAN_HAO2)) {
////保单号校验 匹配数字和字母
CiapLog.info("导入失败,导入失败原因为:第" + i + "行保单号应为22位的数字和大写英文字母组合!");
msgList.add("第" + rowNum + "行保单号应为22位的数字和大写英文字母组合!");
} else if (policyNo.matches(VIN1)) {
//正则匹配纯英文
CiapLog.info("导入失败,导入失败原因为:第" + i + "行保单号应为22位的数字和大写英文字母组合!");
msgList.add("第" + rowNum + "行保单号应为22位的数字和大写英文字母组合!");
} else {
ncEawPolicyRulelVo.setPolicyNo(policyNo);
}
break;
case 1:
//获取起保日期
String policyStartDate = getValue(cell);
//校验起保日期是否合法
if (!policyStartDate.matches(regex)) {
CiapLog.info("导入失败,导入失败原因为:第" + rowNum + "行数据,起保日期格式不是年月日(YYYY-MM-DD)!");
msgList.add("第" + rowNum + "行数据,起保日期格式不是年月日(YYYY-MM-DD)!");
} else {
ncEawPolicyRulelVo.setPolicyStartDate(policyStartDate);
}
break;
case 2:
//获取终保日期
String policyEndDate = getValue(cell);
//校验终保日期是否合法
if (!policyEndDate.matches(regex)) {
CiapLog.info("导入失败,导入失败原因为:第" + rowNum + "行数据,终保日期格式不是年月日(YYYY-MM-DD)!");
msgList.add("第" + rowNum + "行数据,终保日期格式不是年月日(YYYY-MM-DD)!");
} else {
ncEawPolicyRulelVo.setPolicyEndDate(policyEndDate);
}
break;
case 3:
//获取最大赔付天数
String maxPayDate = getValue(cell);
if (!maxPayDate.matches(MNS)) {
CiapLog.info("导入失败,导入失败原因为:第" + rowNum + "行数据,最大赔付天数格式不是数字!");
msgList.add("第" + rowNum + "行数据,最大赔付天数格式不是非负整数!");
} else {
ncEawPolicyRulelVo.setMaxPayDate(maxPayDate);
}
break;
case 4:
//获取单次赔付最大天数
String maxPayDateOnce = getValue(cell);
if (!maxPayDateOnce.matches(MNS)) {
CiapLog.info("导入失败,导入失败原因为:第" + rowNum + "行数据,单次赔付最大天数格式不是数字!");
msgList.add("第" + rowNum + "行数据,单次赔付最大天数格式不是非负整数!");
} else {
ncEawPolicyRulelVo.setMaxPayDateOnce(maxPayDateOnce);
}
break;
case 5:
//获取赔付标准1(18-60周岁)
String payStandard1 = getValue(cell);
if (!payStandard1.matches(MNS)) {
CiapLog.info("导入失败,导入失败原因为:第" + rowNum + "行数据,赔付标准1格式不是数字!");
msgList.add("第" + rowNum + "行数据,赔付标准1格式不是非负整数!");
} else {
ncEawPolicyRulelVo.setPayStandard1(payStandard1);
}
break;
case 6:
//赔付标准2(小于18或大于60周岁)
String payStandard2 = getValue(cell);
if (!payStandard2.matches(MNS)) {
CiapLog.info("导入失败,导入失败原因为:第" + rowNum + "行数据,赔付标准2格式不是数字!");
msgList.add("第" + rowNum + "行数据,赔付标准2格式不是非负整数!");
} else {
ncEawPolicyRulelVo.setPayStandard2(payStandard2);
}
break;
}
} else {
CiapLog.info("导入失败,导入失败原因为:第" + rowNum + "行数据," + title + "为空!");
msgList.add("第" + rowNum + "行数据," + title + "为空!");
}
}
//起保日期
String policyStartDate = ncEawPolicyRulelVo.getPolicyStartDate();
//终保日期
String policyEndDate = ncEawPolicyRulelVo.getPolicyEndDate();
//校验终保日期是否小于起保日期
if (StringUtils.isNotBlank(policyStartDate) && StringUtils.isNotBlank(policyEndDate)) {
SimpleDateFormat sd = new SimpleDateFormat("yyyy-MM-dd");
Date beginDate = sd.parse(policyStartDate);
Date endDate = sd.parse(policyEndDate);
if (endDate.before(beginDate)) {
CiapLog.info("导入失败,导入失败原因为:第" + rowNum + "行数据,终保日期早于起保日期!");
msgList.add("第" + rowNum + "行数据,终保日期早于起保日期!");
}
}
//校验单次赔付天数是否大于最大赔付天数
//最大赔付天数
String maxPayDate = ncEawPolicyRulelVo.getMaxPayDate();
//单次赔付最大天数
String maxPayDateOnce = ncEawPolicyRulelVo.getMaxPayDateOnce();
if (StringUtils.isNotBlank(maxPayDate) && StringUtils.isNotBlank(maxPayDateOnce)) {
if (Integer.parseInt(maxPayDateOnce) > Integer.parseInt(maxPayDate)) {
CiapLog.info("导入失败,导入失败原因为:第" + rowNum + "行数据,单次赔付最大天数大于最大赔付天数!");
msgList.add("第" + rowNum + "行数据,单次赔付最大天数不能超过最大赔付天数!");
}
}
if (msgList.isEmpty()) {
//如果保单号重复更新数据
String policyNo = ncEawPolicyRulelVo.getPolicyNo();
if (StringUtils.isNotBlank(policyNo)) {
String userCode = null;
String userName = null;
if(user!=null){
userCode = user.getUserCode();
userName = user.getUserName();
}
//如果保单号已存在
NcEawPolicyRule getRule = ncEawPolicyRuleMapper.selectBypolicyNo(policyNo);
if (getRule != null) {
getRule.setUpdateUserCode(userCode);
getRule.setUpdateUserName(userName);
int flag = ncEawPolicyRuleMapper.updateBypolicyNo(getRule);
if (flag == 1) {
CiapLog.info("保单号:" + policyNo + "更新成功");
}
} else {
ncEawPolicyRulelVo.setInsertUserCode(userCode);
ncEawPolicyRulelVo.setInsertUserName(userName);
ncEawPolicyRuleList.add(ncEawPolicyRulelVo);
}
}
}
}
if (msgList.isEmpty() ) {
if(ncEawPolicyRuleList.size()>0){
ncEawPolicyRuleMapper.batchInsert(ncEawPolicyRuleList);
}
CiapLog.info("导入成功");
return new BaseResponse(200, "导入成功");
}
Map result = new HashMap();
result.put("message", msgList);
return new BaseResponse(200, "导入数据格式有误", result);
}
/**
* 获取表格数据
*
* @param cell 单元格
* @return 返回数据
*/
public static String getValue(Cell cell) {
String result = null;
switch (cell.getCellType()) {
case 0:
if (HSSFDateUtil.isCellDateFormatted(cell)) {
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
result = dateFormat.format(cell.getDateCellValue());
} else {
NumberFormat nf = NumberFormat.getInstance();
nf.setGroupingUsed(false);
nf.setMaximumFractionDigits(100);
result = nf.format(cell.getNumericCellValue());
}
break;
case 1:
result = cell.getStringCellValue();
break;
case 2:
result = cell.getNumericCellValue() + "";
break;
case 3:
result = "";
break;
case 4:
result = String.valueOf(cell.getBooleanCellValue());
break;
case 5:
result = String.valueOf(cell.getErrorCellValue());
break;
}
return result;
}
/**
* 生成模板标题
*
* @return
*/
private List<String> generateTitle() {
List<String> list = new ArrayList<>();
list.add("保单号*");
list.add("起保日期*");
list.add("终保日期*");
list.add("最大赔付天数*");
list.add("单次赔付最大天数*");
list.add("赔付标准1(18-60周岁)*");
list.add("赔付标准2(小于18或大于60周岁)*");
return list;
}
网友评论