feature: 浪潮定制传不含税金额

jianshui-ui
dongxiaoke 1 year ago
parent 09957ecce5
commit 757142c840
  1. 2
      jianshui-invoice/src/main/java/com/jianshui/invoice/service/impl/adapter/request/AisinoInvoiceRequestAdapterImpl.java
  2. 3371
      jianshui-invoice/src/main/java/com/jianshui/invoice/service/impl/api/ElephantInvoiceApiV6ByInspurServiceImpl.java
  3. 280
      jianshui-invoice/src/main/java/com/jianshui/invoice/utils/BillInfoInspurUtils.java

@ -108,7 +108,7 @@ public class AisinoInvoiceRequestAdapterImpl implements IInvoiceRequestService {
// 平台解密
try {
// TODO: 2023/9/20
order = JianshuiInvoiceDecryptUtil.decrypt(order, JKey);
// order = JianshuiInvoiceDecryptUtil.decrypt(order, JKey);
} catch (Exception e) {
e.printStackTrace();
throw new JianshuiParamErrorException(ErrorCode.DECRYPT_ERROR, companyservice, "invoice");

@ -0,0 +1,280 @@
package com.jianshui.invoice.utils;
import cn.hutool.core.util.NumberUtil;
import com.alibaba.fastjson.JSONObject;
import com.jianshui.common.core.domain.entity.Companyservice;
import com.jianshui.common.core.domain.entity.CompanyserviceDetail;
import com.jianshui.common.enums.ErrorCode;
import com.jianshui.common.exception.jianshui.JianshuiBillInfoCalucateException;
import com.jianshui.common.exception.jianshui.JianshuiParamErrorException;
import com.jianshui.common.utils.StringUtils;
import com.jianshui.common.utils.ValidateUtils;
import com.jianshui.common.utils.bean.BeanUtils;
import com.jianshui.common.utils.spring.SpringUtils;
import com.jianshui.common.utils.uuid.IdUtils;
import com.jianshui.invoice.domain.BillDetail;
import com.jianshui.invoice.domain.BillInfo;
import com.jianshui.invoice.domain.dto.validator.AddBillinfoValidateDTO;
import com.jianshui.invoice.domain.dto.validator.AddDetailValidateDTO;
import com.jianshui.invoice.mapper.BillInfoMapper;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
/**
* @Description 发票订单工具类
* @Author 巩权林
* @Date 2022-03-21 16:58
**/
public class BillInfoInspurUtils {
/**
* billInfo预处理
*
* @param billInfo
* @param companyservice
* @return
*/
public static BillInfo processBillInfo(BillInfo billInfo, Companyservice companyservice) throws InstantiationException, IllegalAccessException {
BillInfoMapper billInfoMapper = SpringUtils.getBean(BillInfoMapper.class);
// 预处理billInfo
billInfo = BillInfoInspurUtils.preprocessing(billInfo, companyservice);
// 查询订单是否已经存在
String orderno = billInfo.getOutTradeOrderno();
if (StringUtils.isEmpty(orderno)) {
throw new JianshuiParamErrorException(ErrorCode.ORDER_FPQQLSH_NOT_EMPTY, companyservice, "invoice");
}
BillInfo queryResult = billInfoMapper.selectBySystemOrderNo(companyservice.getCompanyid(), orderno);
if (queryResult != null) {
throw new JianshuiParamErrorException(ErrorCode.ORDER_EXISTS, companyservice, "invoice");
}
// 校验
BillInfoInspurUtils.validate(AddBillinfoValidateDTO.class, billInfo, companyservice, "invoice");
// 预处理detail
billInfo = BillInfoInspurUtils.preprocessBillDetail(billInfo, companyservice);
List<BillDetail> detailList = billInfo.getBillDetailList();
// 如果数量大于8个,就是清单
if (detailList.size() > 8) {
billInfo.setQdbz("1");
} else {
billInfo.setQdbz("0");
}
BigDecimal taxamt = new BigDecimal(0);
BigDecimal taxfreeamt = new BigDecimal(0);
BigDecimal tax = new BigDecimal(0);
BigDecimal zero = BigDecimal.ZERO;
// TODO kk:2024/5/29 浪潮特殊处理,无论传什么,都按不含税给大象传
// 开始处理含税金额、不含税金额、税额
for (int i = 0; i < detailList.size(); i++) {
BillDetail detail = detailList.get(i);
if (detail.getTaxamt() == null) {
String errorMsg = StringUtils.format("发票第{}条明细,含税金额为空,无法开票", i);
throw new JianshuiBillInfoCalucateException(errorMsg, companyservice, JSONObject.toJSONString(billInfo));
}
if (detail.getTaxfreeamt() == null) {
String errorMsg = StringUtils.format("发票第{}条明细,不含税金额为空,无法开票", i);
throw new JianshuiBillInfoCalucateException(errorMsg, companyservice, JSONObject.toJSONString(billInfo));
}
if (detail.getTax() == null) {
String errorMsg = StringUtils.format("发票第{}条明细,税额为空,无法开票", i);
throw new JianshuiBillInfoCalucateException(errorMsg, companyservice, JSONObject.toJSONString(billInfo));
}
detailList.get(i).setIndex((long) (i + 1));
/** 浪潮特殊处理,防止误差 */
// 都按不含税,判断含税标志
Integer hsbz = detail.getHsbz();
// 含税金额
BigDecimal taxAmDetail = detail.getTaxamt();
// 税额
BigDecimal taxDetail = detail.getTax();
// 不含税金额
BigDecimal taxFreeAmtDetail = detail.getTaxfreeamt();
// 0 不含税 1 含税
if(hsbz == 1 || hsbz == 0){
if(taxAmDetail.compareTo(zero) > 0){
detail.setHsbz(0);
taxfreeamt = taxfreeamt.add(NumberUtil.sub(taxAmDetail,taxDetail));
}else if(taxFreeAmtDetail.compareTo(zero) > 0 ){
detail.setHsbz(0);
taxfreeamt = taxfreeamt.add(taxFreeAmtDetail);
}else{
String errorMsg = StringUtils.format("发票第{}条明细,含税金额为空,无法开票", i);
throw new JianshuiBillInfoCalucateException(errorMsg, companyservice, JSONObject.toJSONString(billInfo));
}
}else{
String errorMsg = StringUtils.format("发票第{}条明细,含税标志为空,无法开票", i);
throw new JianshuiBillInfoCalucateException(errorMsg, companyservice, JSONObject.toJSONString(billInfo));
}
tax = tax.add(detail.getTax());
}
billInfo.setTax(tax);
billInfo.setTaxamt(taxamt);
billInfo.setTaxfreeamt(taxfreeamt);
billInfo.setCompanyId(companyservice.getCompanyid());
// 保存billInfo
if (billInfoMapper.insertBillInfo(billInfo) <= 0) {
throw new JianshuiParamErrorException("保存单据信息失败,请联系管理员!", companyservice, "invoice");
}
List<BillDetail> details = billInfo.getBillDetailList();
for (BillDetail detail : details) {
detail.setBillInfoId(billInfo.getId());
}
try {
billInfoMapper.batchBillDetail(detailList);
} catch (Exception e) {
billInfoMapper.deleteBillInfoById(billInfo.getId());
throw e;
}
return billInfo;
}
/**
* 验证billInfo
*
* @param validateBillInfoClazz 要校验的目标bill类型
* @param billInfo 原始billinfo
* @param <T>
* @throws IllegalAccessException
* @throws InstantiationException
*/
public static <T> void validate(Class<T> validateBillInfoClazz, BillInfo billInfo, Companyservice companyservice, String serviceKey) throws IllegalAccessException, InstantiationException {
T validateBillInfo = validateBillInfoClazz.newInstance();
BeanUtils.copyProperties(billInfo, validateBillInfo);
ValidateUtils.validate(validateBillInfo, companyservice, serviceKey);
}
/**
* 预处理billInfo
*
* @param billInfo
* @return
*/
public static BillInfo preprocessing(BillInfo billInfo, Companyservice companyservice) throws InstantiationException, IllegalAccessException {
// 生成系统单号
billInfo.setSystemOrderno(IdUtils.randomSystemOrderno());
// 设置发票流水号
billInfo.setFpqqlsh(billInfo.getSystemOrderno());
// 获取分机号和终端号,如果都不存在,则去取系统默认的
if (StringUtils.isEmpty(billInfo.getFjh()) && StringUtils.isEmpty(billInfo.getTerminalNumber())) {
List<CompanyserviceDetail> detailList = companyservice.getCompanyserviceDetailList();
if (detailList != null) {
CompanyserviceDetail detail = null;
for (CompanyserviceDetail t : detailList) {
if (t.getIsDefault() == 1) {
detail = t;
break;
}
}
// if (detail == null) {
// throw new JianshuiServiceException("销方信息终端号没配置,请联系管理员!");
// }
if (detail != null) {
// 如果分机号为空
if (StringUtils.isEmpty(billInfo.getFjh())) {
billInfo.setFjh(detail.getFjh());
}
// 如果终端号为空
if (StringUtils.isEmpty(billInfo.getTerminalNumber())) {
billInfo.setTerminalNumber(detail.getTerminalNumber());
}
}
}
}
// 配置销方信息
if (StringUtils.isEmpty(billInfo.getSellerTaxnum())) {
billInfo.setSellerTaxnum(companyservice.getSellertax());
}
if (StringUtils.isEmpty(billInfo.getSellerName())) {
billInfo.setSellerName(companyservice.getSellername());
}
if (StringUtils.isEmpty(billInfo.getSellerAddress())) {
billInfo.setSellerAddress(companyservice.getSelleraddress());
}
if (StringUtils.isEmpty(billInfo.getSellerTelephone())) {
billInfo.setSellerTelephone(companyservice.getSellerphone());
}
if (StringUtils.isEmpty(billInfo.getSellerBank())) {
billInfo.setSellerBank(companyservice.getSellerbank());
}
if (StringUtils.isEmpty(billInfo.getSellerAccount())) {
billInfo.setSellerAccount(companyservice.getSelleraccount());
}
// 开票日期
Date kprq = billInfo.getInvoicedTime();
if (kprq == null) {
billInfo.setInvoicedTime(new Date());
}
return billInfo;
}
/**
* 预处理billDetail
*
* @param billInfo
* @param companyservice
* @return
* @throws InstantiationException
* @throws IllegalAccessException
*/
public static BillInfo preprocessBillDetail(BillInfo billInfo, Companyservice companyservice) throws InstantiationException, IllegalAccessException {
// if (billInfo.getId() == null) {
// throw new JianshuiParamErrorException("发票id不能为空!");
// }
// 处理发票详情
if (billInfo.getBillDetailList().size() <= 0) {
throw new JianshuiParamErrorException("发票详情不能为空!", companyservice, "invoice");
}
List<BillDetail> detailList = new ArrayList<>();
List<BillDetail> originDetail = billInfo.getBillDetailList();
for (int i = 0; i < originDetail.size(); i++) {
BillDetail tempDetail = originDetail.get(i);
// tempDetail.setBillInfoId(billInfo.getId());
try {
tempDetail = BillDetailUtils.preprocessing(tempDetail, companyservice);
BillDetailUtils.validate(AddDetailValidateDTO.class, tempDetail, companyservice, "invoice");
} catch (JianshuiParamErrorException e) {
throw new JianshuiParamErrorException("第" + (i + 1 )+ "行明细:" + e.getMessage(), companyservice, "invoice");
}
detailList.add(tempDetail);
}
billInfo.setBillDetailList(detailList);
return billInfo;
}
}
Loading…
Cancel
Save