根据需求写的一段逻辑很复杂的代码,留个纪念

来源:互联网 发布:java语言用来开发哪些 编辑:程序博客网 时间:2024/06/05 20:45
@Override
@Transactional
public String saveExcel(CardDetails cardDetails, MultipartFile file) {
if (null == cardDetails || file.getSize() == 0)
throw new ParamException();
CardDetails cards = null;
List<CardDetails> cardList = new ArrayList<>();
// 创建用来查询保险公司下的卡单产品的map
Map<String, Object> queryMap = new HashMap<String, Object>();
queryMap.put("insComCode", cardDetails.getInsComCode());
queryMap.put("productType", "0410");
// 调用excle解析工具类。返回集合字符数组;
List<ArrayList<String>> list = new ExcelRead().readExcel(file);
if(null==list||list.size()<=0)
throw new ParamException();
if (list.size() <= 0)
throw new ObjectNotfoundException();
// 循环拿父集合中的单个集合
for (int i = 0; i < list.size(); i++) {
cards = new CardDetails();
// 得到规定字段的值
for (int a = 0; a < list.get(i).size(); a++) {
switch (a) {
case 0:
cards.setOutterCode(list.get(i).get(a).toString());
break;
case 1:
cards.setCardNo(list.get(i).get(a).toString());
break;
case 2:
cards.setCardType(Integer.parseInt(list.get(i).get(a)));
if(cards.getCardType()!=0&&cards.getCardType()!=1)
throw new ParamException();
break;
case 3:
cards.setPremium(Double.valueOf((list.get(i).get(a))));
break;
}
}
cards.setCreateBy(cardDetails.getCreateBy());
cards.setInsComCode(cardDetails.getInsComCode());
cards.setProtocolId(cardDetails.getProtocolId());
cards.setRemark(cardDetails.getRemark());
cards.setUpdateBy(cardDetails.getUpdateBy());
cards.setPartnerId(null == cardDetails.getPartnerId() ? null : cardDetails.getPartnerId());
cardList.add(cards);
}
// 跨域获取该保险公司的所有卡单产品
ResponseEntity<ResponseMapper> responseEntity = restProcessor.post("http://SERVICE-PRODUCT/product/query",
queryMap);
List<Map<String, Object>> partner = (List<Map<String, Object>>) responseEntity.getBody().getData();
if (partner.size() < 0)
throw new NoCardExistsException();
int count = cardList.size();
LinkedHashMap<String, List<CardDetails>> linkmap = new LinkedHashMap<>();
// 判断excle返回的卡单代码是否跟该保险公司的保险卡单对应
for (CardDetails card : cardList) {
for (Map<String, Object> map : partner) {
// 对应上就增加产品id和名称并减少判断的COUNT数量
if (card.getOutterCode().equals(map.get("outterCode"))) {
card.setProductId(Long.parseLong(map.get("id").toString()));
card.setProductName(map.get("productName").toString());
count--;
}
}
// 如果当前Map没有参数,那就创建值并把当前对象存入List
if (null == linkmap.get(card.getOutterCode()) || linkmap.size() <= 0) {
List<CardDetails> cardDetailsList = new ArrayList<>();
cardDetailsList.add(card);
linkmap.put(card.getOutterCode(), cardDetailsList);
} else {
// 有值就存入当前值
linkmap.get(card.getOutterCode()).add(card);
}
}
if (count > 0)
throw new NoCardExistsException();
int mapCount = 0;
// 获取键值对得到费率
for (Entry<String, List<CardDetails>> vo : linkmap.entrySet()) {
// new费率对象
ProtocolProductRate pro = new ProtocolProductRate();
// 库存对象
CardStock cardStock = new CardStock();
cardStock.setId(idProcessor.nextId());
cardStock.setProtocolId(cardDetails.getProtocolId());
cardStock.setInsComCode(cardDetails.getInsComCode());
cardStock.setPremium(vo.getValue().get(mapCount).getPremium());
cardStock.setRemark(cardDetails.getRemark());
cardStock.setProductId(vo.getValue().get(mapCount).getProductId());
cardStock.setCreateBy(cardDetails.getCreateBy());
cardStock.setUpdateBy(cardDetails.getUpdateBy());
cardStock.setProductName(vo.getValue().get(mapCount).getProductName());
// 只获取每个LIst里面第一个
Map<String, Object> m = new HashMap<>();
m.put("protocolId", cardDetails.getProtocolId());
m.put("insComCode", cardDetails.getInsComCode());
m.put("productId", vo.getValue().get(mapCount).getProductId());
m.put("rateType", ProtocolProductRate.TYPE_FIX);
m.put("state", "01");
// 判断是否有营业部的费率
if (null == cardDetails.getPartnerId()) {
m.put("protocolType", "ST");//共有协议
m.put("partnerId", null);
pro = ProtocolproductRateMapper.excelWarehousingAgreementRate(m);
if (null == pro)
throw new ProtocoloProductRateNotfoundException();
} else {
m.put("protocolType", "DF");
cardStock.setPartnerId(cardDetails.getPartnerId());
m.put("partnerId", cardDetails.getPartnerId());
pro = ProtocolproductRateMapper.excelWarehousingAgreementRate(m);
if (null == pro)
throw new ProtocoloProductRateNotfoundException();
}
m.remove("rateType");
m.remove("protocolType");
m.remove("state");
m.put("insComCode", cardDetails.getInsComCode());
// 插入之前查询库存是否已有该数据
CardStock cardStocks = new CardStock();
if (cardStockMapper.query(m).size() > 0)
cardStocks = cardStockMapper.query(m).get(0);
else
cardStocks = null;
int eNum = 0;// 电子卡数量
int mNum = 0;// 实物卡的数量
// 获取list<对象>
for (int q = 0; q < vo.getValue().size(); q++) {
// 1为电子卡
if (vo.getValue().get(q).getCardType().equals(1))
eNum++;
else
mNum++;
vo.getValue().get(q).setCardStockId(null == cardStocks ? cardStock.getId() : cardStocks.getId());
// 营业部费率存储和平台费率存储判断
if (null == cardDetails.getPartnerId())
vo.getValue().get(q).setPlatformCommission(pro.getPoundage());
else{
vo.getValue().get(q).setPartnerCommission(pro.getPoundage());
vo.getValue().get(q).setAgentCommission(null==pro.getCommission()?null:pro.getCommission());
}
vo.getValue().get(q).setId(idProcessor.nextId());
vo.getValue().get(q).setCreateBy(cardDetails.getCreateBy());
vo.getValue().get(q)
.setPartnerId(null == cardDetails.getPartnerId() ? null : cardDetails.getPartnerId());
vo.getValue().get(q).setAuditStatus(1);// 已审核
vo.getValue().get(q).setUpdateBy(cardDetails.getUpdateBy());
vo.getValue().get(q).setState(0);// 未出库
vo.getValue().get(q).setStorageTime(new Date());
// 卡单详情对象非空验证
XValidation.valiate(vo.getValue().get(q), XValidation.INSERT);
}
cardDetailsMapper.saveBatch(vo.getValue());// 卡单详情循环完毕,插入
// 电子卡
cardStock.setElectronicsNumber(eNum);
// 实物卡
cardStock.setMaterialNumber(mNum);
// insert语句对象验证
XValidation.valiate(cardStock, XValidation.INSERT);


if (null == cardStocks) {
// 非空验证之后执行插入操作
cardStockMapper.save(cardStock);
} else {
cardStock.setId(cardStocks.getId());
cardStock
.setElectronicsNumber(cardStocks.getElectronicsNumber() + cardStock.getElectronicsNumber());// 电子
cardStock.setMaterialNumber(cardStocks.getMaterialNumber() + cardStock.getMaterialNumber());// 实物
cardStockMapper.update(cardStock);
}
mapCount++;
}


return "导入成功!";

}


数据库有三个表,分别为卡单库存表,卡单详情表,卡单订单表,然后导入这个excel需要关联产品表,协议表,协议费率表,做这个东西做的真的头晕!!!

原创粉丝点击