parent
09957ecce5
commit
757142c840
File diff suppressed because it is too large
Load Diff
@ -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…
Reference in new issue