demand: TMS系统 - 客户账单管理 - 业务账单确认- 导出excel电子表-解决空指针数据导致导出异常的问题 tms-运输管理-货物组批次添加校验未接单的不允许组批次

This commit is contained in:
aike 2026-02-06 14:29:10 +08:00
parent 1a80335c71
commit 9aa4009e01
2 changed files with 176 additions and 114 deletions

View File

@ -714,14 +714,33 @@ public class EmisSettleBillController extends BaseController
{ {
try { try {
// 参数校验
if (emisSettleBill == null || StringUtils.isEmpty(emisSettleBill.getSettleBillNo())) {
response.setStatus(HttpServletResponse.SC_BAD_REQUEST);
return;
}
EmisSettleBill bill = emisBaseService.getSettleBillBySettleBillNo(emisSettleBill.getSettleBillNo()); EmisSettleBill bill = emisBaseService.getSettleBillBySettleBillNo(emisSettleBill.getSettleBillNo());
// 账单不存在校验
if (bill == null) {
response.setStatus(HttpServletResponse.SC_NOT_FOUND);
return;
}
// 获取子账单数据 // 获取子账单数据
List<EmisSettleSubBill> list = emisBaseService.selectSubBillListBySettleBillNo(emisSettleBill.getSettleBillNo()); List<EmisSettleSubBill> list = emisBaseService.selectSubBillListBySettleBillNo(emisSettleBill.getSettleBillNo());
// 转换子账单为 MAP // 子账单列表为空校验
if (CollectionUtils.isEmpty(list)) {
response.setStatus(HttpServletResponse.SC_NOT_FOUND);
return;
}
// 转换子账单为 MAP
Map<String, Object> textMap = MapUtils.newHashMap(); Map<String, Object> textMap = MapUtils.newHashMap();
textMap.put("title", bill.getSettleBillName()); textMap.put("title", bill.getSettleBillName() != null ? bill.getSettleBillName() : "");
textMap.put("total", bill.getRecMoney().stripTrailingZeros().toPlainString()); // 处理可能为null的金额
BigDecimal recMoney = bill.getRecMoney();
textMap.put("total", recMoney != null ? recMoney.stripTrailingZeros().toPlainString() : "0");
String tplName = "tpl/bill_tpl_simple.xlsx"; String tplName = "tpl/bill_tpl_simple.xlsx";
@ -730,47 +749,69 @@ public class EmisSettleBillController extends BaseController
List<Map<String, Object>> listMap = new ArrayList<>(); List<Map<String, Object>> listMap = new ArrayList<>();
for (EmisSettleSubBill billItem : list) { for (EmisSettleSubBill billItem : list) {
// 跳过waybillDetail为null的项
if (billItem == null || billItem.getWaybillDetail() == null) {
continue;
}
Map<String, Object> voMap = new HashMap<>(); Map<String, Object> voMap = new HashMap<>();
voMap.put("sendDate", DateUtils.parseDateToStr(DateUtils.YYYY_MM_DD_HH_MM_SS,billItem.getWaybillDetail().getSendDate())) ; // 安全处理日期
voMap.put("billCode",billItem.getBillCode()); Date sendDate = billItem.getWaybillDetail().getSendDate();
voMap.put("fjr",billItem.getWaybillDetail().getSendName()+"--"+billItem.getWaybillDetail().getReceiveName()); voMap.put("sendDate", sendDate != null ? DateUtils.parseDateToStr(DateUtils.YYYY_MM_DD_HH_MM_SS, sendDate) : "");
voMap.put("kjlx",billItem.getWaybillDetail().getSendSiteName()+"--"+billItem.getWaybillDetail().getDispatchUnderlingSiteName());
String company=billItem.getWaybillDetail().getCustName(); voMap.put("billCode", billItem.getBillCode() != null ? billItem.getBillCode() : "");
if(
"1".equals(billItem.getWaybillDetail().getPaymentType()) ||
"3".equals(billItem.getWaybillDetail().getPaymentType()) ||
"5".equals(billItem.getWaybillDetail().getPaymentType())
){ // 安全处理字符串拼接
company=billItem.getWaybillDetail().getSendCompany(); String sendName = billItem.getWaybillDetail().getSendName() != null ? billItem.getWaybillDetail().getSendName() : "";
String receiveName = billItem.getWaybillDetail().getReceiveName() != null ? billItem.getWaybillDetail().getReceiveName() : "";
voMap.put("fjr", sendName + "--" + receiveName);
String sendSiteName = billItem.getWaybillDetail().getSendSiteName() != null ? billItem.getWaybillDetail().getSendSiteName() : "";
String dispatchUnderlingSiteName = billItem.getWaybillDetail().getDispatchUnderlingSiteName() != null ? billItem.getWaybillDetail().getDispatchUnderlingSiteName() : "";
voMap.put("kjlx", sendSiteName + "--" + dispatchUnderlingSiteName);
String company = billItem.getWaybillDetail().getCustName() != null ? billItem.getWaybillDetail().getCustName() : "";
String paymentType = billItem.getWaybillDetail().getPaymentType();
if ("1".equals(paymentType) || "3".equals(paymentType) || "5".equals(paymentType)) {
String sendCompany = billItem.getWaybillDetail().getSendCompany();
company = sendCompany != null ? sendCompany : "";
} }
voMap.put("company", company); voMap.put("company", company);
voMap.put("paymentType", DictUtils.getDictLabel("emis_payment_type",billItem.getWaybillDetail().getPaymentType())); voMap.put("paymentType", DictUtils.getDictLabel("emis_payment_type", paymentType));
voMap.put("productTypeName", billItem.getWaybillDetail().getProductTypeName());
voMap.put("parcelQty", billItem.getWaybillDetail().getParcelQty().toString()); String productTypeName = billItem.getWaybillDetail().getProductTypeName();
voMap.put("billWeight", billItem.getWaybillDetail().getBillWeight().stripTrailingZeros().toPlainString()); voMap.put("productTypeName", productTypeName != null ? productTypeName : "");
voMap.put("settlementWeight", billItem.getWaybillDetail().getSettlementWeight().stripTrailingZeros().toPlainString());
voMap.put("totalVolume", billItem.getWaybillDetail().getTotalVolume().stripTrailingZeros().toPlainString()); // 安全处理Integer转String
voMap.put("freight", billItem.getWaybillDetail().getFreight().stripTrailingZeros().toPlainString()); Integer parcelQty = billItem.getWaybillDetail().getParcelQty();
voMap.put("parcelQty", parcelQty != null ? parcelQty.toString() : "0");
// 安全处理BigDecimal
BigDecimal billWeight = billItem.getWaybillDetail().getBillWeight();
voMap.put("billWeight", billWeight != null ? billWeight.stripTrailingZeros().toPlainString() : "0");
BigDecimal settlementWeight = billItem.getWaybillDetail().getSettlementWeight();
voMap.put("settlementWeight", settlementWeight != null ? settlementWeight.stripTrailingZeros().toPlainString() : "0");
BigDecimal totalVolume = billItem.getWaybillDetail().getTotalVolume();
voMap.put("totalVolume", totalVolume != null ? totalVolume.stripTrailingZeros().toPlainString() : "0");
BigDecimal freight = billItem.getWaybillDetail().getFreight();
voMap.put("freight", freight != null ? freight.stripTrailingZeros().toPlainString() : "0");
String feeRemark = ""; String feeRemark = "";
if(!StringUtils.isEmpty(billItem.getWaybillDetail().getFeeRemark())){ String feeRemarkValue = billItem.getWaybillDetail().getFeeRemark();
feeRemark=billItem.getWaybillDetail().getFeeRemark(); if (!StringUtils.isEmpty(feeRemarkValue)) {
feeRemark = feeRemarkValue;
} }
String waybillRemark = ""; String waybillRemark = "";
if(!StringUtils.isEmpty(billItem.getWaybillDetail().getRemark())){ String remarkValue = billItem.getWaybillDetail().getRemark();
waybillRemark=billItem.getWaybillDetail().getRemark(); if (!StringUtils.isEmpty(remarkValue)) {
waybillRemark = remarkValue;
} }
// if(!StringUtils.isEmpty(billItem.getWaybillDetail().getFeeRemark())){
// feeRemark=feeRemark+" "+billItem.getWaybillDetail().getFeeRemark();
// }
BigDecimal otherFee = BigDecimal.ZERO; BigDecimal otherFee = BigDecimal.ZERO;
BigDecimal transFee = BigDecimal.ZERO; BigDecimal transFee = BigDecimal.ZERO;
BigDecimal cebFee = BigDecimal.ZERO; BigDecimal cebFee = BigDecimal.ZERO;
@ -786,65 +827,73 @@ public class EmisSettleBillController extends BaseController
List<EmisSettleSubBillFeeitem> feeItemList = billItem.getFeeitemList(); List<EmisSettleSubBillFeeitem> feeItemList = billItem.getFeeitemList();
if (!CollectionUtils.isEmpty(feeItemList)) { if (!CollectionUtils.isEmpty(feeItemList)) {
for (EmisSettleSubBillFeeitem feeitem : feeItemList) { for (EmisSettleSubBillFeeitem feeitem : feeItemList) {
if (feeitem == null) {
continue;
}
// 所有币种全部统一换算成RMB // 所有币种全部统一换算成RMB
BigDecimal billFee = feeitem.getBillFee();
if (billFee == null) {
billFee = BigDecimal.ZERO;
}
BigDecimal rmbBillFee = billFee;
BigDecimal rmbBillFee=feeitem.getBillFee();
// 币种 // 币种
String currencyStr = ""; String currencyStr = "";
if(StringUtils.isEmpty(feeitem.getCurrency())){ String currency = feeitem.getCurrency();
if (StringUtils.isEmpty(currency)) {
feeitem.setCurrency("CNY"); feeitem.setCurrency("CNY");
currency = "CNY";
} }
if(!"CNY".equals(feeitem.getCurrency())){ if (!"CNY".equals(currency)) {
currencyStr=""+feeitem.getCurrency()+""; currencyStr = currency;
// 非人民币需要换算成人民币 // 非人民币需要换算成人民币
EmisExchangeRate emisExchangeRate=emisExchangeRateService.getValidExchangeRate(currencyStr,"CNY",DateUtils.parseDateToStr(DateUtils.YYYY_MM_DD_HH_MM_SS,billItem.getWaybillDetail().getSendDate())); if (sendDate != null) {
double rate=0.0D; String dateStr = DateUtils.parseDateToStr(DateUtils.YYYY_MM_DD_HH_MM_SS, sendDate);
if(emisExchangeRate!=null){ EmisExchangeRate emisExchangeRate = emisExchangeRateService.getValidExchangeRate(currencyStr, "CNY", dateStr);
rate=Double.valueOf(emisExchangeRate.getRate()); if (emisExchangeRate != null && emisExchangeRate.getRate() != null) {
try {
double rate = Double.parseDouble(emisExchangeRate.getRate());
rmbBillFee = rmbBillFee.multiply(BigDecimal.valueOf(rate)); rmbBillFee = rmbBillFee.multiply(BigDecimal.valueOf(rate));
} catch (NumberFormatException e) {
// 汇率转换失败,使用原值
logger.warn("汇率转换失败,币种: {}, 汇率: {}", currencyStr, emisExchangeRate.getRate());
}
}
} }
} }
// 费用细分 // 费用细分
if ("1001".equals(feeitem.getFeeCode())) { String feeCode = feeitem.getFeeCode();
if ("1001".equals(feeCode)) {
transFee = transFee.add(rmbBillFee); transFee = transFee.add(rmbBillFee);
// transFeeStr= feeitem.getBillFee().stripTrailingZeros().toPlainString()+currencyStr;
} }
// 报关费 // 报关费
else if ("2002".equals(feeitem.getFeeCode())) { else if ("2002".equals(feeCode)) {
cebFee = cebFee.add(rmbBillFee); cebFee = cebFee.add(rmbBillFee);
// cebFeeStr= feeitem.getBillFee().stripTrailingZeros().toPlainString()+currencyStr;
} }
// 清关费 // 清关费
else if ("2003".equals(feeitem.getFeeCode())) { else if ("2003".equals(feeCode)) {
declareFee = declareFee.add(rmbBillFee); declareFee = declareFee.add(rmbBillFee);
// declareFeeStr= feeitem.getBillFee().stripTrailingZeros().toPlainString()+currencyStr;
//
} else { } else {
otherFee = otherFee.add(rmbBillFee); otherFee = otherFee.add(rmbBillFee);
// otherFeeStr= otherFeeStr+""+feeitem.getFeeName()+":"+feeitem.getBillFee().stripTrailingZeros().toPlainString()+currencyStr+",";
//
} }
if (cebFee.compareTo(BigDecimal.ZERO) > 0
if(
cebFee.compareTo(BigDecimal.ZERO)>0
|| declareFee.compareTo(BigDecimal.ZERO) > 0 || declareFee.compareTo(BigDecimal.ZERO) > 0
|| otherFee.compareTo(BigDecimal.ZERO)>0 || otherFee.compareTo(BigDecimal.ZERO) > 0) {
){
isNeedComplexTpl = true; isNeedComplexTpl = true;
} }
if(!StringUtils.isEmpty(feeitem.getRemark())){ String feeItemRemarkValue = feeitem.getRemark();
if(!feeitem.getRemark().contains("w")){ if (!StringUtils.isEmpty(feeItemRemarkValue)) {
feeItemRemark=feeItemRemark+"|"+feeitem.getFeeName()+":"+feeitem.getBillFee().stripTrailingZeros().toPlainString()+currencyStr+"(费用说明:"+feeitem.getRemark()+")"; if (!feeItemRemarkValue.contains("w")) {
String feeName = feeitem.getFeeName() != null ? feeitem.getFeeName() : "";
String billFeeStr = billFee.stripTrailingZeros().toPlainString();
feeItemRemark = feeItemRemark + "|" + feeName + ":" + billFeeStr + currencyStr + "(费用说明:" + feeItemRemarkValue + ")";
} }
} }
} }
transFeeStr = transFee.stripTrailingZeros().toPlainString(); transFeeStr = transFee.stripTrailingZeros().toPlainString();
@ -852,7 +901,12 @@ public class EmisSettleBillController extends BaseController
declareFeeStr = declareFee.stripTrailingZeros().toPlainString(); declareFeeStr = declareFee.stripTrailingZeros().toPlainString();
otherFeeStr = otherFee.stripTrailingZeros().toPlainString(); otherFeeStr = otherFee.stripTrailingZeros().toPlainString();
} else { } else {
transFeeStr=billItem.getWaybillDetail().getFreight().stripTrailingZeros().toPlainString(); // 如果没有费用项列表,使用运单的运费
if (freight != null) {
transFeeStr = freight.stripTrailingZeros().toPlainString();
} else {
transFeeStr = "0";
}
} }
if (StringUtils.isEmpty(transFeeStr)) { if (StringUtils.isEmpty(transFeeStr)) {
@ -882,7 +936,6 @@ public class EmisSettleBillController extends BaseController
if (!StringUtils.isEmpty(feeItemRemark)) { if (!StringUtils.isEmpty(feeItemRemark)) {
feeItemRemark = "费用项:" + StringUtils.removeEnd(feeItemRemark, "|"); feeItemRemark = "费用项:" + StringUtils.removeEnd(feeItemRemark, "|");
} }
// feeRemark=feeRemark+","+feeItemRemark;
feeRemark = StringUtils.removeEnd(feeRemark, ",") + ""; feeRemark = StringUtils.removeEnd(feeRemark, ",") + "";
@ -891,7 +944,6 @@ public class EmisSettleBillController extends BaseController
listMap.add(voMap); listMap.add(voMap);
} }
if (isNeedComplexTpl) { if (isNeedComplexTpl) {
tplName = "tpl/bill_tpl.xlsx"; tplName = "tpl/bill_tpl.xlsx";
} else { } else {
@ -903,7 +955,6 @@ public class EmisSettleBillController extends BaseController
InputStream inputStream = ResourceUtil.getResourceObj(tplName).getStream(); InputStream inputStream = ResourceUtil.getResourceObj(tplName).getStream();
// 设置创建行的方式 // 设置创建行的方式
FillConfig fillConfig = FillConfig.builder().forceNewRow(Boolean.TRUE).build(); FillConfig fillConfig = FillConfig.builder().forceNewRow(Boolean.TRUE).build();
// FillConfig fillConfig2 = FillConfig.builder().forceNewRow(Boolean.FALSE).build();
ExcelWriter excelWriter = EasyExcel.write(outputStream).withTemplate(inputStream).excelType(ExcelTypeEnum.XLSX).build(); ExcelWriter excelWriter = EasyExcel.write(outputStream).withTemplate(inputStream).excelType(ExcelTypeEnum.XLSX).build();
// 写入到sheet // 写入到sheet
WriteSheet sheet0 = EasyExcel.writerSheet(0).build(); WriteSheet sheet0 = EasyExcel.writerSheet(0).build();
@ -914,7 +965,8 @@ public class EmisSettleBillController extends BaseController
excelWriter.fill(listMap, fillConfig, sheet0); excelWriter.fill(listMap, fillConfig, sheet0);
// 设置响应头信息 // 设置响应头信息
String fileName = bill.getSettleBillName()+".xlsx"; String billName = bill.getSettleBillName();
String fileName = (billName != null ? billName : "账单") + ".xlsx";
response.setHeader("Content-Disposition", "attachment;filename*=utf-8''" + URLEncoder.encode(fileName, StandardCharsets.UTF_8.name())); response.setHeader("Content-Disposition", "attachment;filename*=utf-8''" + URLEncoder.encode(fileName, StandardCharsets.UTF_8.name()));
response.setContentType("application/octet-stream"); response.setContentType("application/octet-stream");
// 关流 // 关流
@ -923,7 +975,13 @@ public class EmisSettleBillController extends BaseController
IOUtils.closeQuietly(outputStream); IOUtils.closeQuietly(outputStream);
} catch (IOException e) { } catch (IOException e) {
logger.error("导出账单失败", e);
e.printStackTrace(); e.printStackTrace();
response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
} catch (Exception e) {
logger.error("导出账单异常", e);
e.printStackTrace();
response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
} }
} }

View File

@ -172,6 +172,10 @@ public class EmisTmsSiteBatchDtlServiceImpl implements IEmisTmsSiteBatchDtlServi
return null; return null;
} }
if(!"1".equals(emisWaybill.getOrderStatus())){
throw new EmisBizError(EmisBizErrorType.FAIL, "未接单");
}
// 创建返回结果对象 // 创建返回结果对象
EmisTmsSiteBatchDtl result = new EmisTmsSiteBatchDtl(); EmisTmsSiteBatchDtl result = new EmisTmsSiteBatchDtl();
result.setWaybillDetail(emisWaybill); result.setWaybillDetail(emisWaybill);