|
|
@@ -1,11 +1,9 @@
|
|
|
package com.yc.ship.module.trade.service.invoice.impl;
|
|
|
|
|
|
-import cn.hutool.core.date.DatePattern;
|
|
|
import cn.hutool.core.date.DateUtil;
|
|
|
import cn.hutool.core.thread.ThreadUtil;
|
|
|
import cn.hutool.core.util.ObjectUtil;
|
|
|
import cn.hutool.core.util.RandomUtil;
|
|
|
-import cn.hutool.json.JSONObject;
|
|
|
import com.baomidou.mybatisplus.core.metadata.IPage;
|
|
|
import com.baomidou.mybatisplus.core.toolkit.IdWorker;
|
|
|
import com.yc.ship.framework.common.lang.Asserts;
|
|
|
@@ -20,14 +18,12 @@ import com.yc.ship.module.trade.api.invoice.dto.InvoicingReqDTO;
|
|
|
import com.yc.ship.module.trade.controller.admin.invoice.vo.InvoicePageReqVO;
|
|
|
import com.yc.ship.module.trade.controller.admin.invoice.vo.InvoiceRespVO;
|
|
|
import com.yc.ship.module.trade.dal.dataobject.invoice.InvoiceDO;
|
|
|
-import com.yc.ship.module.trade.dal.dataobject.invoice.InvoiceDetailDO;
|
|
|
import com.yc.ship.module.trade.dal.dataobject.order.TradeOrderDO;
|
|
|
import com.yc.ship.module.trade.dal.mysql.invoice.InvoiceMapper;
|
|
|
import com.yc.ship.module.trade.enums.SellMethodEnum;
|
|
|
import com.yc.ship.module.trade.enums.invoice.InvoiceStatusEnum;
|
|
|
import com.yc.ship.module.trade.service.invoice.InvoiceDetailService;
|
|
|
import com.yc.ship.module.trade.service.invoice.InvoiceGroupService;
|
|
|
-import com.yc.ship.module.trade.service.invoice.InvoiceHangxinService;
|
|
|
import com.yc.ship.module.trade.service.invoice.InvoiceService;
|
|
|
import com.yc.ship.module.trade.service.order.TradeOrderRepositoryService;
|
|
|
import com.yc.ship.module.trade.service.refund.TradeRefundRepositoryService;
|
|
|
@@ -48,11 +44,9 @@ import java.util.List;
|
|
|
import java.util.Objects;
|
|
|
import java.util.concurrent.CompletableFuture;
|
|
|
import java.util.concurrent.ExecutorService;
|
|
|
-import java.util.stream.Collectors;
|
|
|
|
|
|
import static com.yc.ship.framework.common.exception.util.ServiceExceptionUtil.exception;
|
|
|
import static com.yc.ship.framework.common.exception.util.ServiceExceptionUtil.exception0;
|
|
|
-import static com.yc.ship.module.trade.enums.ApiConstants.ORDER_CHANGE_TYPE_OLD;
|
|
|
import static com.yc.ship.module.trade.enums.ErrorCodeConstants.*;
|
|
|
|
|
|
|
|
|
@@ -70,8 +64,6 @@ public class InvoiceServiceImpl implements InvoiceService {
|
|
|
private InvoiceMapper invoiceMapper;
|
|
|
@Resource
|
|
|
private InvoiceGroupService invoiceGroupService;
|
|
|
- @Resource
|
|
|
- private InvoiceHangxinService invoiceHangxinService;
|
|
|
|
|
|
//TODO 待完善
|
|
|
@Resource
|
|
|
@@ -104,6 +96,7 @@ public class InvoiceServiceImpl implements InvoiceService {
|
|
|
throw exception0(500, "订单开票失败,开票金额不能为"+reqDTO.getTotalPrice());
|
|
|
}
|
|
|
}
|
|
|
+ BigDecimal zk = BigDecimal.ZERO;
|
|
|
//查询订单及金额
|
|
|
for (String orderNo : reqDTO.getOrderIdList()) {
|
|
|
TradeOrderDO order = tradeOrderRepositoryService.getOrderByNo(orderNo);
|
|
|
@@ -114,26 +107,20 @@ public class InvoiceServiceImpl implements InvoiceService {
|
|
|
if (order.getIsInvoice() != null && ObjectUtil.equals(order.getIsInvoice(), InvoiceStatusEnum.INVOICE_SUCCESS.getValue())) {
|
|
|
throw exception0(500, "订单{}已开票", orderNo);
|
|
|
}
|
|
|
+
|
|
|
Asserts.isTrue(ObjectUtil.equals(order.getIsInvoice(), InvoiceStatusEnum.NOT_INVOICED.getValue())
|
|
|
|| ObjectUtil.equals(order.getIsInvoice(), InvoiceStatusEnum.INVOICE_FAILED.getValue()), ORDER_INVOICED.getCode(), "订单{}已开票", orderNo);
|
|
|
- if(ObjectUtil.equals(order.getIsChangeOrder(),ORDER_CHANGE_TYPE_OLD)){
|
|
|
- //如果是改签原订单,只计算退款手续费
|
|
|
- BigDecimal totalFee = tradeRefundRepositoryService.getOrderRefundFee(order.getId());
|
|
|
- if (totalFee != null) {
|
|
|
- amt = amt.add(totalFee);
|
|
|
- }
|
|
|
- }else{
|
|
|
- amt = amt.add(order.getPayAmount());
|
|
|
- //减去退款金额
|
|
|
- BigDecimal orderRefundAmount = tradeRefundRepositoryService.getOrderRefundAmount(order.getId());
|
|
|
- if (orderRefundAmount != null) {
|
|
|
- amt = amt.subtract(orderRefundAmount);
|
|
|
- }
|
|
|
- //减去未使用金额
|
|
|
- BigDecimal unusedAmount = tradeOrderRepositoryService.getUnUsedAmount(order.getId());
|
|
|
- if (unusedAmount != null) {
|
|
|
- amt = amt.subtract(unusedAmount);
|
|
|
- }
|
|
|
+ amt = amt.add(order.getPayAmount());
|
|
|
+ zk=zk.add(order.getAmount().subtract(order.getPayAmount()));
|
|
|
+ //减去退款金额
|
|
|
+ BigDecimal orderRefundAmount = tradeRefundRepositoryService.getOrderRefundAmount(order.getId());
|
|
|
+ if (orderRefundAmount != null) {
|
|
|
+ amt = amt.subtract(orderRefundAmount);
|
|
|
+ }
|
|
|
+ //减去未使用金额
|
|
|
+ BigDecimal unusedAmount = tradeOrderRepositoryService.getUnUsedAmount(order.getId());
|
|
|
+ if (unusedAmount != null) {
|
|
|
+ amt = amt.subtract(unusedAmount);
|
|
|
}
|
|
|
orderList.add(order);
|
|
|
if (StringUtils.isBlank(reqDTO.getAccountId()) && Objects.equals(order.getSellMethod(), SellMethodEnum.MINI_APP.getType())) {
|
|
|
@@ -143,12 +130,11 @@ public class InvoiceServiceImpl implements InvoiceService {
|
|
|
if (reqDTO.getTotalPrice() == null) {
|
|
|
reqDTO.setTotalPrice(reqDTO.getPrice());
|
|
|
}
|
|
|
- boolean isSingInvoice = false;
|
|
|
+ reqDTO.setZkprice(zk);
|
|
|
//计算开票金额,如果未传值则用订单总金额
|
|
|
if (reqDTO.getPrice() == null) {
|
|
|
reqDTO.setPrice(amt);
|
|
|
} else {
|
|
|
- isSingInvoice = true;
|
|
|
Asserts.isTrue(amt.compareTo(reqDTO.getTotalPrice()) == 0, "开票金额发生变更,请重新刷新后发起,{},{}", reqDTO.getPrice(), amt);
|
|
|
}
|
|
|
|
|
|
@@ -157,41 +143,13 @@ public class InvoiceServiceImpl implements InvoiceService {
|
|
|
|
|
|
tradeOrderRepositoryService.updateInvoiceStatus(orderList, InvoiceStatusEnum.INVOICE_INVOIING.getValue());
|
|
|
String fpSupplier = configApi.getPlatformConfigValueByKey("supplier");
|
|
|
- CommonResult<InvoiceDO> result;
|
|
|
invoiceDO.setFpSupplier(fpSupplier);
|
|
|
- if (StringUtils.equals("group", fpSupplier)) {
|
|
|
- result = invoiceGroupService.invoiceIssuance(invoiceDO,reqDTO.getRemark());
|
|
|
- } else {
|
|
|
- result = invoiceHangxinService.invoiceIssuance(invoiceDO);
|
|
|
- }
|
|
|
+ CommonResult<InvoiceDO> result = invoiceGroupService.invoiceIssuance(invoiceDO,reqDTO.getRemark());
|
|
|
if (result.isSuccess()) {
|
|
|
tradeOrderRepositoryService.updateInvoiceStatus(orderList, InvoiceStatusEnum.INVOICE_SUCCESS.getValue());
|
|
|
} else {
|
|
|
tradeOrderRepositoryService.updateInvoiceStatus(orderList, InvoiceStatusEnum.INVOICE_FAILED.getValue());
|
|
|
}
|
|
|
-
|
|
|
-
|
|
|
- if(isSingInvoice && reqDTO.getTotalPrice().subtract(reqDTO.getPrice()).compareTo(BigDecimal.ZERO)>0){
|
|
|
- InvoiceDO invoiceDO2 = this.buildInvoice(reqDTO, reqDTO.getTotalPrice().subtract(reqDTO.getPrice()));
|
|
|
- invoiceDetailService.createInvoiceDetail(orderList, invoiceDO2.getId());
|
|
|
-
|
|
|
- tradeOrderRepositoryService.updateInvoiceStatus(orderList, InvoiceStatusEnum.INVOICE_INVOIING.getValue());
|
|
|
- CommonResult<InvoiceDO> result2;
|
|
|
- invoiceDO2.setFpSupplier(fpSupplier);
|
|
|
- if (StringUtils.equals("group", fpSupplier)) {
|
|
|
- result2 = invoiceGroupService.invoiceIssuance(invoiceDO2,reqDTO.getRemark());
|
|
|
- } else {
|
|
|
- result2 = invoiceHangxinService.invoiceIssuance(invoiceDO2);
|
|
|
- }
|
|
|
- if (result2.isSuccess()) {
|
|
|
- tradeOrderRepositoryService.updateInvoiceStatus(orderList, InvoiceStatusEnum.INVOICE_SUCCESS.getValue());
|
|
|
- }
|
|
|
-// else {
|
|
|
- //第二张发票失败了不处理,可能另外一个发票已经成功
|
|
|
- //tradeOrderRepositoryService.updateInvoiceStatus(orderList, InvoiceStatusEnum.INVOICE_FAILED.getValue());
|
|
|
-// }
|
|
|
- }
|
|
|
-
|
|
|
return result;
|
|
|
|
|
|
}
|
|
|
@@ -205,11 +163,8 @@ public class InvoiceServiceImpl implements InvoiceService {
|
|
|
// CompletableFuture<CommonResult<InvoiceDO>> future = CompletableFuture.supplyAsync(() -> invoiceHangxinService.invoiceIssuance(invoiceDO), executor);
|
|
|
String fpSupplier = configApi.getPlatformConfigValueByKey("invoice.supplier");
|
|
|
CompletableFuture<CommonResult<InvoiceDO>> future = CompletableFuture.supplyAsync(() -> {
|
|
|
- if (StringUtils.equals("group", fpSupplier)) {
|
|
|
return invoiceGroupService.invoiceIssuance(invoiceDO,reqDTO.getRemark());
|
|
|
- } else {
|
|
|
- return invoiceHangxinService.invoiceIssuance(invoiceDO);
|
|
|
- }
|
|
|
+
|
|
|
}, executor);
|
|
|
future.thenAcceptAsync(result -> {
|
|
|
if (result.isSuccess()) {
|
|
|
@@ -223,27 +178,6 @@ public class InvoiceServiceImpl implements InvoiceService {
|
|
|
|
|
|
}
|
|
|
|
|
|
- @Override
|
|
|
- public String queryInvoiceUrl(InvoiceDO invoice) {
|
|
|
- if (invoice == null) {
|
|
|
- throw exception(INVOICE_NOT_EXISTS);
|
|
|
- }
|
|
|
- Asserts.isTrue(invoice.getInvoiceStatus().equals(InvoiceStatusEnum.INVOICE_SUCCESS.getValue()), "发票未开票成功,无法查询!");
|
|
|
- String kprq = DateUtil.format(invoice.getCKprq(), DatePattern.PURE_DATETIME_PATTERN);
|
|
|
- JSONObject resObj = invoiceHangxinService.queryInvoiceUrl(invoice.getId(), invoice.getCFphm(), kprq);
|
|
|
- String resultUrl = "";
|
|
|
- if (null != resObj) {
|
|
|
- resultUrl = resObj.getStr("DATA");
|
|
|
- List<InvoiceDetailDO> list = invoiceDetailService.getInvoiceDetails(invoice.getId());
|
|
|
- List<String> orderNoList = list.stream().map(InvoiceDetailDO::getOrderNo).collect(Collectors.toList());
|
|
|
- //TODO:
|
|
|
-// tradeOrderRepositoryService.updateInvoiceStatusByOrderNo(orderNoList, 1);
|
|
|
- invoice.setCUrl(resultUrl);
|
|
|
- invoiceMapper.updateById(invoice);
|
|
|
- }
|
|
|
- return resultUrl;
|
|
|
- }
|
|
|
-
|
|
|
@Override
|
|
|
public String queryGroupInvoiceUrl(InvoiceDO invoice) {
|
|
|
if (invoice == null) {
|
|
|
@@ -255,12 +189,6 @@ public class InvoiceServiceImpl implements InvoiceService {
|
|
|
return "";
|
|
|
}
|
|
|
|
|
|
- private void validateInvoiceExists(Long id) {
|
|
|
- if (invoiceMapper.selectById(id) == null) {
|
|
|
- throw exception(INVOICE_NOT_EXISTS);
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
|
|
|
@Override
|
|
|
public InvoiceDO getInvoice(Long id) {
|
|
|
@@ -301,7 +229,7 @@ public class InvoiceServiceImpl implements InvoiceService {
|
|
|
|
|
|
private InvoiceDO buildInvoice(InvoicingReqDTO reqDTO, BigDecimal price) {
|
|
|
InvoiceDO invoiceDO = BeanUtils.toBean(reqDTO, InvoiceDO.class);
|
|
|
- String taxCode = configApi.getPlatformConfigValueByKey("invoice.tax");
|
|
|
+ String taxCode = configApi.getPlatformConfigValueByKey("newinvoice.group.tax");
|
|
|
String serialNum = RandomUtil.randomNumbers(30 - taxCode.length());
|
|
|
long id = IdWorker.getId(invoiceDO);
|
|
|
invoiceDO.setId(id);
|
|
|
@@ -317,6 +245,7 @@ public class InvoiceServiceImpl implements InvoiceService {
|
|
|
invoiceDO.setTransactionNo(tradeUUCodeUtils.generateOrderNo(INVOICE_PREFIX));
|
|
|
invoiceDO.setSalesTaxCode(taxCode);
|
|
|
invoiceDO.setFpqqlsh(serialNum);
|
|
|
+ invoiceDO.setZkprice(reqDTO.getZkprice());
|
|
|
invoiceDO.setSalesName(configApi.getPlatformConfigValueByKey("invoice.sales.name"));
|
|
|
invoiceDO.setSalesAddress(configApi.getPlatformConfigValueByKey("invoice.sales.addr"));
|
|
|
invoiceDO.setDeleted(false);
|