发票名识别校验

This commit is contained in:
程小伟 2025-04-22 17:18:21 +08:00
parent c467e552df
commit 96151fbc55
1 changed files with 188 additions and 0 deletions

View File

@ -0,0 +1,188 @@
package zcgj.zcdev.zcdev.pr.plugin.form;
import kd.bos.coderule.api.CodeRuleInfo;
import kd.bos.context.RequestContext;
import kd.bos.dataentity.entity.DynamicObject;
import kd.bos.dataentity.entity.DynamicObjectCollection;
import kd.bos.dataentity.metadata.dynamicobject.DynamicObjectType;
import kd.bos.dataentity.resource.ResManager;
import kd.bos.dataentity.utils.StringUtils;
import kd.bos.entity.MainEntityType;
import kd.bos.exception.KDBizException;
import kd.bos.logging.Log;
import kd.bos.logging.LogFactory;
import kd.bos.orm.query.QFilter;
import kd.bos.servicehelper.BusinessDataServiceHelper;
import kd.bos.servicehelper.coderule.CodeRuleServiceHelper;
import kd.ec.basedata.common.enums.BillStatusEnum;
import kd.ec.basedata.common.enums.DefaultEnum;
import kd.ec.basedata.common.invoicecloud.InvoiceDataHandleHelper;
import kd.ec.basedata.common.invoicecloud.bean.InvoiceItemVO;
import kd.ec.basedata.common.invoicecloud.bean.InvoiceVO;
import kd.ec.basedata.common.invoicecloud.enumeration.InvoiceTypeEnum;
import kd.ec.basedata.common.utils.TextHelper;
import java.math.BigDecimal;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
public class InvoiceNameRecognitionBillPlugin extends InvoiceDataHandleHelper {
private static final Log log = LogFactory.getLog(InvoiceNameRecognitionBillPlugin.class);
public static DynamicObject generateInvoiceByVO(InvoiceVO invoiceVO, MainEntityType dt, long id, long userID, long orgID, Date date, DynamicObject currency) {
DynamicObject invoice = new DynamicObject(dt);
invoice.set("id", id);
invoice.set("serialno", invoiceVO.getSerialNo());
InvoiceTypeEnum invoiceTypeEnum = InvoiceTypeEnum.getEnumByValue(invoiceVO.getInvoiceType()); //根据值 返回对应的发票类型
if (invoiceTypeEnum != null) {
QFilter invoiceTypeFilter = new QFilter("name", "=", invoiceTypeEnum.getName());
DynamicObject invoiceType = BusinessDataServiceHelper.loadSingle("ec_invoice_type", "id", new QFilter[]{invoiceTypeFilter});//搜索指定的发票类型
invoice.set("invoicetypeid", invoiceType);//设置发票类型
}
invoice.set("invoicecode", invoiceVO.getInvoiceCode());//设置发票代码
invoice.set("invoiceno", invoiceVO.getInvoiceNo());//发票号码
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
try {
Date invoiceDate = format.parse(invoiceVO.getInvoiceDate());
invoice.set("invoicedate", invoiceDate);//设置发票日期
} catch (ParseException var32) {
log.info("parse invoice date error.");
}
//设置发票的货币含税总金额未核销金额总税额未核销税额和总金额
invoice.set("currency", currency);
invoice.set("totaloftaxamount", invoiceVO.getTotalAmount());
invoice.set("unapplyamount", invoiceVO.getTotalAmount());
invoice.set("totaltax", invoiceVO.getTaxAmount());
invoice.set("unapplyinvtax", invoiceVO.getTaxAmount());
invoice.set("totalamount", invoiceVO.getAmount());
//设置购买方的税号银行名称银行账号电话号码和地址
invoice.set("buyertaxno", invoiceVO.getBuyerTaxNo());
invoice.set("buyerbank", TextHelper.getBankName(invoiceVO.getBuyerAccount()));
invoice.set("buyeraccount", TextHelper.getBankNum(invoiceVO.getBuyerAccount()));
invoice.set("buyerphone", TextHelper.getPhoneNum(invoiceVO.getBuyerAddressPhone()));
invoice.set("buyeraddress", TextHelper.getAddress(invoiceVO.getBuyerAddressPhone()));
if (StringUtils.equals(dt.getName(), "ec_in_invoice")) {
invoice.set("isreceived", "1");
}
invoice.set("source", "03");
invoice.set("buyername", invoiceVO.getBuyerName());//设置购买方
//原来是name 改为ffirmname
QFilter buyerFilter = new QFilter("ffirmname", "=", invoiceVO.getBuyerName());
//如果是进项发票在业务单元里搜索 指定买方信息 否则在客户里搜索
DynamicObject buyer = StringUtils.equals(dt.getName(), "ec_in_invoice") ? BusinessDataServiceHelper.loadSingle("bos_org", "", new QFilter[]{buyerFilter}) : BusinessDataServiceHelper.loadSingle("bd_customer", "", new QFilter[]{new QFilter("name", "=", invoiceVO.getBuyerName())});
if (buyer == null) {
log.info("buyer: "+invoiceVO.getBuyerName()+"is null");
throw new KDBizException(String.format(ResManager.loadKDString("发票【%1$s】购买方【%2$s】不存在。", "InvoiceDataHandleHelper_5", "ec-ecbd-common", new Object[0]), invoiceVO.getInvoiceCode(), invoiceVO.getBuyerName()));
} else {
invoice.set("buyer", buyer);
invoice.set("sellertaxno", invoiceVO.getSalerTaxNo());
invoice.set("sellerbank", TextHelper.getBankName(invoiceVO.getSalerAccount()));
invoice.set("selleraccount", TextHelper.getBankNum(invoiceVO.getSalerAccount()));
invoice.set("sellerphone", TextHelper.getPhoneNum(invoiceVO.getSalerAddressPhone()));
invoice.set("selleraddress", TextHelper.getAddress(invoiceVO.getSalerAddressPhone()));
String sellerName = invoiceVO.getSalerName();
invoice.set("sellername", sellerName);
/**
* 设置销售方的税号银行名称银行账号电话号码和地址
* 根据销售方名称加载销售方信息可能是供应商或组织如果销售方不存在抛出异常
*/
QFilter sellerFilter = new QFilter("name", "=", sellerName);
if (!sellerName.contains("(") && !sellerName.contains(")")) {
if (sellerName.contains("") || sellerName.contains("")) {
sellerName.replace('', '(');
sellerName.replace('', ')');
sellerFilter.or("name", "=", sellerName);
}
} else {
sellerName.replace('(', '');
sellerName.replace(')', '');
sellerFilter.or("name", "=", sellerName);
}
DynamicObject seller = StringUtils.equals(dt.getName(), "ec_in_invoice") ? BusinessDataServiceHelper.loadSingle("bd_supplier", "", new QFilter[]{sellerFilter}) : BusinessDataServiceHelper.loadSingle("bos_org", "", new QFilter[]{sellerFilter});
if (seller == null) {
throw new KDBizException(String.format(ResManager.loadKDString("发票【%1$s】销售方【%2$s】不存在。", "InvoiceDataHandleHelper_6", "ec-ecbd-common", new Object[0]), invoiceVO.getInvoiceCode(), sellerName));
} else {
invoice.set("seller", seller);
invoice.set("invoicestatus", invoiceVO.getInvoiceStatus());
invoice.set("billstatus", BillStatusEnum.AUDIT.getValue());
invoice.set("org_id", orgID);
//处理发票明细
List<InvoiceItemVO> detailEntries = invoiceVO.getItems();
if (detailEntries != null && !detailEntries.isEmpty()) {
DynamicObjectCollection invoiceEntries = invoice.getDynamicObjectCollection("entryentity");
DynamicObjectType entryDt = (new DynamicObject(dt)).getDynamicObjectCollection("entryentity").getDynamicObjectType();
for(InvoiceItemVO item : detailEntries) {
DynamicObject entry = new DynamicObject(entryDt);
entry.set("name", item.getGoodsName());
entry.set("model", item.getSpecModel());
String unitName = item.getUnit();
if (unitName != null && !unitName.isEmpty()) {
QFilter unitFilter = (new QFilter("name", "=", unitName)).or("number", "=", unitName).or("number", "=", unitName.toLowerCase()).or("number", "=", unitName.toUpperCase());
QFilter validFilter = (new QFilter("enable", "=", DefaultEnum.YES.getValue().charAt(0))).and("status", "=", BillStatusEnum.AUDIT.getValue().charAt(0));
DynamicObject unit = BusinessDataServiceHelper.loadSingle("bd_measureunits", "name", new QFilter[]{unitFilter, validFilter});
if (unit != null) {
entry.set("unit", unit);
}
}
entry.set("qty", item.getNum());
BigDecimal price = item.getUnitPrice();
entry.set("price", item.getUnitPrice());
entry.set("amount", item.getDetailAmount());
BigDecimal ofTaxPrice = price;
BigDecimal tax = item.getTaxRate();
if (tax != null) {
BigDecimal taxRateHundred = tax.multiply(BigDecimal.TEN.multiply(BigDecimal.TEN));
QFilter taxFilter = new QFilter("taxrate", "=", taxRateHundred);
DynamicObject[] taxRate = BusinessDataServiceHelper.load("bd_taxrate", "name", new QFilter[]{taxFilter});
if (taxRate != null && taxRate.length > 0) {
entry.set("taxrate", taxRate[0]);
}
if (price != null) {
ofTaxPrice = price.multiply(BigDecimal.ONE.add(tax));
}
}
entry.set("oftaxprice", ofTaxPrice);
entry.set("tax", item.getTaxAmount());
entry.set("oftaxamount", item.getDetailAmount().add(item.getTaxAmount() == null ? BigDecimal.ZERO : item.getTaxAmount()));
invoiceEntries.add(entry);
}
}
String snapshotUrl = invoiceVO.getSnapshotUrl();
if (!StringUtils.isBlank(snapshotUrl)) {
DynamicObjectCollection pictureEntries = invoice.getDynamicObjectCollection("pictureentry");
DynamicObjectType pictureEntryDt = (new DynamicObject(dt)).getDynamicObjectCollection("pictureentry").getDynamicObjectType();
DynamicObject item = new DynamicObject(pictureEntryDt);
item.set("filename", invoiceVO.getInvoiceNo());
item.set("imageurl", snapshotUrl);
item.set("uploaddate", date);
pictureEntries.add(item);
}
invoice.set("creator_id", userID);
invoice.set("modifier_id", userID);
invoice.set("auditor_id", userID);
invoice.set("createtime", date);
invoice.set("modifytime", date);
invoice.set("auditdate", date);
CodeRuleInfo codeRuleInfo = CodeRuleServiceHelper.getCodeRule(dt.getName(), invoice, String.valueOf(RequestContext.get().getOrgId()));
if (null != codeRuleInfo) {
invoice.set("billno", CodeRuleServiceHelper.getNumber(codeRuleInfo, invoice));
} else {
invoice.set("billno", invoiceVO.getSerialNo());
}
return invoice;
}
}
}
}