|
|
@@ -603,6 +603,12 @@ public class ReceivableServiceImpl extends ServiceImpl<ReceivableMapper, InsPlyI
|
|
|
} else if (invoiceType.equals("4")) {
|
|
|
// 驾意险的总跟单费(jy_follow_premium)
|
|
|
return jyFollowPremium;
|
|
|
+ } else if (invoiceType.equals("5")) {
|
|
|
+ // 交强的总手续费(jq_commission_premium) + 商业的总手续费(sy_commission_premium) + 交强的总跟单费(jq_follow_premium) + 商业的总跟单费(sy_follow_premium)
|
|
|
+ return jqCommissionPremium.add(syCommissionPremium).add(jqFollowPremium).add(syFollowPremium);
|
|
|
+ } else if (invoiceType.equals("6")) {
|
|
|
+ // 驾意险的总手续费(jy_commission_premium) + 驾意险的总跟单费(jy_follow_premium)
|
|
|
+ return jyCommissionPremium.add(jyFollowPremium);
|
|
|
}
|
|
|
return null;
|
|
|
}
|
|
|
@@ -627,7 +633,7 @@ public class ReceivableServiceImpl extends ServiceImpl<ReceivableMapper, InsPlyI
|
|
|
// 开票类型 1、手续费 2、跟单费 3、驾意险手续费 4、驾意险跟单费 5、平台应收-车险 6、平台应收-非车险
|
|
|
if("1".equals(invoicingVo.getInvoiceType()) || "2".equals(invoicingVo.getInvoiceType())){
|
|
|
invoice.setInvoiceRiskType("10");
|
|
|
- }else if("5".equals(invoicingVo.getInvoiceType())){
|
|
|
+ }else if("5".equals(invoicingVo.getInvoiceType()) || "6".equals(invoicingVo.getInvoiceType())){
|
|
|
invoice.setInvoiceRiskType("30");
|
|
|
}else{
|
|
|
invoice.setInvoiceRiskType("20");
|
|
|
@@ -700,12 +706,116 @@ public class ReceivableServiceImpl extends ServiceImpl<ReceivableMapper, InsPlyI
|
|
|
.in(InsPlyIncome::getId, invoiceIds)
|
|
|
.set(InsPlyIncome::getJyOtherSettlement, "1"));
|
|
|
break;
|
|
|
+ case "5":
|
|
|
+ result = baseMapper.update(new LambdaUpdateWrapper<InsPlyIncome>()
|
|
|
+ .in(InsPlyIncome::getId, invoiceIds)
|
|
|
+ .set(InsPlyIncome::getPlatformSuperviseSettlement, "1").set(InsPlyIncome::getSettlementStatus, "1"));
|
|
|
+ break;
|
|
|
+ case "6":
|
|
|
+ result = baseMapper.update(new LambdaUpdateWrapper<InsPlyIncome>()
|
|
|
+ .in(InsPlyIncome::getId, invoiceIds)
|
|
|
+ .set(InsPlyIncome::getPlatformOtherSettlement, "1").set(InsPlyIncome::getSettlementStatus, "1"));
|
|
|
+ break;
|
|
|
default:
|
|
|
result = 0;
|
|
|
}
|
|
|
return result > 0;
|
|
|
}
|
|
|
|
|
|
+ @Override
|
|
|
+ @Transactional(rollbackFor = Exception.class)
|
|
|
+ public boolean platformSettlement(PlatformSettlementVo platformSettlementVo) {
|
|
|
+ SettlementVo settlementVo = platformSettlementVo.getSettlementVo();
|
|
|
+ InvoicingVo invoicingVo = platformSettlementVo.getInvoicingVo();
|
|
|
+
|
|
|
+ log.info("平台结算:platformSettlement=[{}]", JSONUtil.toJsonStr(platformSettlementVo));
|
|
|
+ try {
|
|
|
+ // ============================开票逻辑============================
|
|
|
+ invoicingVo.setReceivablePremium(this.getReceivableAmount(invoicingVo));
|
|
|
+
|
|
|
+ InvoiceingResult result = new InvoiceingResult();
|
|
|
+ InsPlyIncomeInvoice invoice = new InsPlyIncomeInvoice();
|
|
|
+ invoice.setId(IdGenerate.nextId());
|
|
|
+ invoice.setCompanyId(invoicingVo.getCompanyId());
|
|
|
+ invoice.setInvoiceType(invoicingVo.getInvoiceType());
|
|
|
+ // 开票类型 1、手续费 2、跟单费 3、驾意险手续费 4、驾意险跟单费 5、平台应收-车险 6、平台应收-非车险
|
|
|
+ if("1".equals(invoicingVo.getInvoiceType()) || "2".equals(invoicingVo.getInvoiceType())){
|
|
|
+ invoice.setInvoiceRiskType("10");
|
|
|
+ }else if("5".equals(invoicingVo.getInvoiceType()) || "6".equals(invoicingVo.getInvoiceType())){
|
|
|
+ invoice.setInvoiceRiskType("30");
|
|
|
+ }else{
|
|
|
+ invoice.setInvoiceRiskType("20");
|
|
|
+ }
|
|
|
+ invoice.setInvoiceParty(invoicingVo.getInvoiceParty());
|
|
|
+ invoice.setOverinflatedAmount(invoicingVo.getOverinflatedAmount());
|
|
|
+ invoice.setReceivableSupervisePremium(invoicingVo.getReceivablePremium());
|
|
|
+ invoice.setTaxPoint(invoicingVo.getTaxPoint());
|
|
|
+
|
|
|
+ List<InsPlyIncomeInvoiceLink> invoicingLinkList = new ArrayList();
|
|
|
+
|
|
|
+ invoicingVo.getIncomeIds().forEach(incomeId -> {
|
|
|
+ InsPlyIncomeInvoiceLink link = new InsPlyIncomeInvoiceLink();
|
|
|
+ link.setId(IdGenerate.nextId());
|
|
|
+ link.setInvoiceId(invoice.getId());
|
|
|
+ link.setIncomeId(incomeId);
|
|
|
+ link.setInvoiceType(invoicingVo.getInvoiceType());
|
|
|
+ invoicingLinkList.add(link);
|
|
|
+ });
|
|
|
+ insPlyIncomeInvoiceLinkMapper.insert(invoicingLinkList);
|
|
|
+ result.setInvoiceId(invoice.getId());
|
|
|
+ result.setSumPrice(null != invoicingVo.getReceivablePremium() ? invoicingVo.getReceivablePremium().toString() : null);
|
|
|
+
|
|
|
+ // ============================结算逻辑============================
|
|
|
+ // 实际已经收了的金额
|
|
|
+ BigDecimal actualReceivedAmount = this.getInvoicingAmount(settlementVo.getInvoicingId());
|
|
|
+
|
|
|
+ // 所有需要结算的金额
|
|
|
+ BigDecimal allToSettlement = invoice.getReceivableSupervisePremium().add(invoice.getOverinflatedAmount());
|
|
|
+ // 剩余的金额
|
|
|
+ BigDecimal surplusPremium = allToSettlement.subtract(actualReceivedAmount);
|
|
|
+ log.info("invoiceId=[{}],一共需要结算的金额[{}],实际已经结算的金额[{}],本次计划结算的金额[{}]",
|
|
|
+ settlementVo.getInvoicingId(), allToSettlement,actualReceivedAmount,settlementVo.getActualReceivedAmount());
|
|
|
+ // 校验是否超出了剩余的金额
|
|
|
+ AssertionUtils.isFail(surplusPremium.compareTo(settlementVo.getActualReceivedAmount()) < 0, "已超出应收金额,请核对!");
|
|
|
+
|
|
|
+ // 处理结算数据
|
|
|
+ // 未完全结算完成
|
|
|
+ InsPlyIncomeInvoiceSettlement settlement = new InsPlyIncomeInvoiceSettlement(invoice.getId(), settlementVo.getActualReceivedAmount(),
|
|
|
+ DateTime.now(), settlementVo.getPaymentDifference(), settlementVo.getPaymentReason());
|
|
|
+ insPlyIncomeInvoiceSettlementMapper.insert(settlement);
|
|
|
+
|
|
|
+ if (CollectionUtils.isNotEmpty(settlementVo.getAttachmentIds())) {
|
|
|
+ // 添加发票附件
|
|
|
+ List<InsPlyIncomeInvoiceSettlementFile> files = new ArrayList<>();
|
|
|
+ for (String fileId : settlementVo.getAttachmentIds()) {
|
|
|
+ InsPlyIncomeInvoiceSettlementFile file = new InsPlyIncomeInvoiceSettlementFile();
|
|
|
+ file.setId(IdGenerate.nextId());
|
|
|
+ file.setSettlementId(settlement.getId());
|
|
|
+ file.setFileId(fileId);
|
|
|
+ files.add(file);
|
|
|
+ }
|
|
|
+ insPlyIncomeInvoiceSettlementFileMapper.insert(files);
|
|
|
+ }
|
|
|
+
|
|
|
+ // 判断是否已经结算完成
|
|
|
+ if (surplusPremium.compareTo(settlementVo.getActualReceivedAmount()) == 0) {
|
|
|
+ log.info("序号为[{}]的发票已经结算完成",invoice.getId());
|
|
|
+ // 更新发票状态
|
|
|
+ invoice.setStatus("1");
|
|
|
+ insPlyIncomeInvoiceMapper.insert(invoice);
|
|
|
+ // 判断是需要更新哪个字段
|
|
|
+ this.updateIncomeSettlementStatus(invoice.getInvoiceType(), invoicingVo.getIncomeIds());
|
|
|
+ }else{
|
|
|
+ log.info("invoiceId=[{}], 还剩[{}]钱没有结算",settlementVo.getInvoicingId(), surplusPremium.subtract(settlementVo.getActualReceivedAmount()));
|
|
|
+ }
|
|
|
+ return true;
|
|
|
+ } catch (Exception e) {
|
|
|
+ log.error("平台结算异常. settlementVo=[{}]",JSONUtil.toJsonStr(settlementVo), e);
|
|
|
+ TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
|
|
|
+ throw new RuntimeException(e.getMessage());
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
@Override
|
|
|
@Transactional(rollbackFor = Exception.class)
|
|
|
public boolean settlement(SettlementVo settlementVo) {
|
|
|
@@ -1089,7 +1199,8 @@ public class ReceivableServiceImpl extends ServiceImpl<ReceivableMapper, InsPlyI
|
|
|
// 数据库已存在 → 继续后续校验
|
|
|
// 判断已开票 / 已结算
|
|
|
if ("1".equals(existIncome.getSuperviseSettlement()) || "1".equals(existIncome.getOtherSettlement())
|
|
|
- || "1".equals(existIncome.getJySuperviseSettlement()) || "1".equals(existIncome.getJyOtherSettlement())) {
|
|
|
+ || "1".equals(existIncome.getJySuperviseSettlement()) || "1".equals(existIncome.getJyOtherSettlement())
|
|
|
+ || "1".equals(existIncome.getPlatformSuperviseSettlement()) || "1".equals(existIncome.getPlatformOtherSettlement())) {
|
|
|
failedNumber++;
|
|
|
vo.setErrorMessage("应收数据已结算");
|
|
|
failedExcel.add(vo);
|
|
|
@@ -1459,6 +1570,8 @@ public class ReceivableServiceImpl extends ServiceImpl<ReceivableMapper, InsPlyI
|
|
|
case "2" -> dto.setInvoiceType("跟单费");
|
|
|
case "3" -> dto.setInvoiceType("驾意险手续费");
|
|
|
case "4" -> dto.setInvoiceType("驾意险跟单费");
|
|
|
+ case "5" -> dto.setInvoiceType("平台协议车险应收");
|
|
|
+ case "6" -> dto.setInvoiceType("平台协议非车险应收");
|
|
|
}
|
|
|
dto.setInvoiceTypeName(Constant.invoiceRiskTypeMap.get(Objects.toString(dto.getInvoiceType())));
|
|
|
LambdaQueryWrapper<InsPlyIncomeInvoiceSettlementFile> wrapper = new LambdaQueryWrapper<InsPlyIncomeInvoiceSettlementFile>();
|