From 5447c0109c765aac9dde810f0498074ba0379aa1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A8=8B=E5=B0=8F=E4=BC=9F?= Date: Wed, 23 Apr 2025 16:19:50 +0800 Subject: [PATCH] =?UTF-8?q?=E5=8F=91=E7=A5=A8=E5=90=8D=E8=AF=86=E5=88=AB?= =?UTF-8?q?=E6=A0=A1=E9=AA=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../CustomInvoiceCloudImportListPlugin.java | 169 +++++++++++ .../form/CustomInvoiceDataHandleHelper.java | 271 ++++++++++++++++++ 2 files changed, 440 insertions(+) create mode 100644 code/zcdev/zcgj-zcdev-zcdev-pr/src/main/java/zcgj/zcdev/zcdev/pr/plugin/form/CustomInvoiceCloudImportListPlugin.java create mode 100644 code/zcdev/zcgj-zcdev-zcdev-pr/src/main/java/zcgj/zcdev/zcdev/pr/plugin/form/CustomInvoiceDataHandleHelper.java diff --git a/code/zcdev/zcgj-zcdev-zcdev-pr/src/main/java/zcgj/zcdev/zcdev/pr/plugin/form/CustomInvoiceCloudImportListPlugin.java b/code/zcdev/zcgj-zcdev-zcdev-pr/src/main/java/zcgj/zcdev/zcdev/pr/plugin/form/CustomInvoiceCloudImportListPlugin.java new file mode 100644 index 0000000..a310772 --- /dev/null +++ b/code/zcdev/zcgj-zcdev-zcdev-pr/src/main/java/zcgj/zcdev/zcdev/pr/plugin/form/CustomInvoiceCloudImportListPlugin.java @@ -0,0 +1,169 @@ +// +// Source code recreated from a .class file by IntelliJ IDEA +// (powered by FernFlower decompiler) +// + +package zcgj.zcdev.zcdev.pr.plugin.form; + +import java.util.Date; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; +import kd.bos.context.RequestContext; +import kd.bos.dataentity.entity.DynamicObject; +import kd.bos.dataentity.resource.ResManager; +import kd.bos.dataentity.utils.StringUtils; +import kd.bos.form.ConfirmCallBackListener; +import kd.bos.form.ConfirmTypes; +import kd.bos.form.MessageBoxOptions; +import kd.bos.form.MessageBoxResult; +import kd.bos.form.events.ClosedCallBackEvent; +import kd.bos.form.events.MessageBoxClosedEvent; +import kd.bos.list.IListView; +import kd.bos.list.ListShowParameter; +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.operation.SaveServiceHelper; +import kd.ec.basedata.common.invoicecloud.InvoiceDataHandleHelper; +import kd.ec.basedata.common.invoicecloud.bean.InvoiceVO; +import kd.ec.basedata.common.utils.EcSerializeHelper; +import kd.ec.basedata.common.utils.SystemParamHelper; +import kd.ec.ecpf.formplugin.invoicecloud.InvoiceCloudImportListPlugin; + +public class CustomInvoiceCloudImportListPlugin extends InvoiceCloudImportListPlugin { + private static final Log log = LogFactory.getLog(CustomInvoiceCloudImportListPlugin.class); + public CustomInvoiceCloudImportListPlugin() { + } + + public void closedCallBack(ClosedCallBackEvent closedCallBackEvent) { + super.closedCallBack(closedCallBackEvent); + String actionId = closedCallBackEvent.getActionId();//获取回调标识 + log.info("获取回调标识:" + actionId); + Object returnData = closedCallBackEvent.getReturnData();//获取回调数据 + if (StringUtils.equals(actionId, "importinvoice") && returnData != null) { + log.info("导入发票"); + this.importInvoiceCallBack(returnData); + } else if (StringUtils.equals(actionId, "xhSelectInvoice") && !StringUtils.isBlank(returnData)) { + log.info("选择发票"); + this.xhSelectInvoiceCallBack(returnData);//解析返回的发票数据 + } + + } + + protected void xhSelectInvoiceCallBack(Object returnData) { + Map data = (Map)returnData; + log.info("获取发票助手返回的数据"+data); + DynamicObject org = (DynamicObject)data.get("org"); + if (org != null) { + long currUserId = RequestContext.get().getCurrUserId();//获取当前用户ID + log.info("获取当前用户ID"); + Object selectInvoice = data.get("selectInvoice"); + log.info("获取发票对象"+selectInvoice); + log.info("将selectInvoice解析为发票列表"); + //将selectInvoice解析为发票列表 + List invoiceVOList = InvoiceDataHandleHelper.parseXhInvoiceCloudReturnData(selectInvoice); + ListShowParameter listShowParameter = (ListShowParameter)this.getView().getFormShowParameter();//获取表单显示参数 + log.info("获取表单显示参数"); + String billFormId = listShowParameter.getBillFormId();//获取发票ID + log.info("获取发票ID:"+billFormId); + //处理发票列表,返回map,ture对应值表示Set 包含新生成的发票对象,false对应Set 包含已存在的发票对象。 + log.info("处理发票列表,返回map,ture对应值表示Set 包含新生成的发票对象,false对应Set 包含已存在的发票对象。"); + Map> invoiceMap = CustomInvoiceDataHandleHelper.processInvoiceVO(invoiceVOList, currUserId, org.getLong("id"), new Date(), billFormId, this.getCurrency(), true); + if (invoiceMap.isEmpty()) { + this.getView().showTipNotification(ResManager.loadKDString("导入发票为空。", "InvoiceCloudImportListPlugin_4", "ec-ecpf-formplugin", new Object[0])); + } else { + Set newInvoices = (Set)invoiceMap.getOrDefault(Boolean.TRUE, new HashSet(0));//新生成的发票对象 + Set updateInvoices = (Set)invoiceMap.getOrDefault(Boolean.FALSE, new HashSet(0));//已存在的发票对象。 + this.saveInvoiceAndGiveTips(newInvoices, updateInvoices, true);//保存发票数据并给出相应的提示 + log.info("保存发票数据并给出相应的提示"); + } + + } + } + + protected void importInvoiceCallBack(Object returnData) { + long orgId = RequestContext.get().getOrgId(); + DynamicObject org = BusinessDataServiceHelper.loadSingle(orgId, "bos_org"); + List invoiceVOList = InvoiceDataHandleHelper.parseInvoiceCloudReturnData(returnData, org); + ListShowParameter listShowParameter = (ListShowParameter)this.getView().getFormShowParameter(); + String billFormId = listShowParameter.getBillFormId(); + Map> invoiceMap = InvoiceDataHandleHelper.processInvoiceVO(invoiceVOList, RequestContext.get().getCurrUserId(), orgId, new Date(), billFormId, this.getCurrency()); + if (!invoiceMap.isEmpty()) { + if (invoiceMap.get(Boolean.TRUE) != null && !((Set)invoiceMap.get(Boolean.TRUE)).isEmpty()) { + Set newInvoices = (Set)invoiceMap.get(Boolean.TRUE); + + for(DynamicObject newInvoice : newInvoices) { + DynamicObject invoiceOrg = StringUtils.equals(billFormId, "ec_in_invoice") ? newInvoice.getDynamicObject("buyer") : newInvoice.getDynamicObject("seller"); + String name = StringUtils.equals(billFormId, "ec_in_invoice") ? ResManager.loadKDString("购买方", "InvoiceCloudImportListPlugin_1", "ec-ecpf-formplugin", new Object[0]) : ResManager.loadKDString("销售方", "InvoiceCloudImportListPlugin_2", "ec-ecpf-formplugin", new Object[0]); + if (invoiceOrg != null && invoiceOrg.getLong("id") != orgId) { + this.getPageCache().put("importInvoiceCache", EcSerializeHelper.serialize(invoiceMap)); + this.getView().showConfirm(String.format(ResManager.loadKDString("当前发票%s不为当前组织,是否需要继续导入?", "InvoiceCloudImportListPlugin_3", "ec-ecpf-formplugin", new Object[0]), name), MessageBoxOptions.OKCancel, ConfirmTypes.Default, new ConfirmCallBackListener("importinvoiceconfirm")); + return; + } + } + + Set existInvoices = (Set)invoiceMap.getOrDefault(Boolean.FALSE, new HashSet(0)); + this.saveInvoiceAndGiveTips(newInvoices, existInvoices, false); + } else { + this.getView().showTipNotification(ResManager.loadKDString("发票已经在发票池中,无需重复导入。", "InvoiceCloudImportListPlugin_0", "ec-ecpf-formplugin", new Object[0])); + } + } else { + this.getView().showTipNotification(ResManager.loadKDString("导入发票为空。", "InvoiceCloudImportListPlugin_4", "ec-ecpf-formplugin", new Object[0])); + } + + } + + protected DynamicObject getCurrency() { + QFilter numberFilter = new QFilter("number", "=", "CNY"); + return BusinessDataServiceHelper.loadSingle("bd_currency", "", new QFilter[]{numberFilter}); + } + + public void confirmCallBack(MessageBoxClosedEvent messageBoxClosedEvent) { + super.confirmCallBack(messageBoxClosedEvent); + String callBackId = messageBoxClosedEvent.getCallBackId(); + if (StringUtils.equals(callBackId, "importinvoiceconfirm")) { + this.importInvoiceConfirmCallBack(messageBoxClosedEvent); + } + + } + + protected boolean isXhInvoiceCloud() { + Object linkSystem = SystemParamHelper.getSystemParameter("linksystem", "eced"); + return StringUtils.equals("cosmic", linkSystem == null ? "" : linkSystem.toString()); + } + + protected void importInvoiceConfirmCallBack(MessageBoxClosedEvent messageBoxClosedEvent) { + Map> invoiceMap = (Map)EcSerializeHelper.unserialize(this.getPageCache().get("importInvoiceCache")); + if (MessageBoxResult.Yes.getValue() == messageBoxClosedEvent.getResult().getValue()) { + Set newInvoices = (Set)invoiceMap.getOrDefault(Boolean.TRUE, new HashSet(0)); + Set existInvoices = (Set)invoiceMap.getOrDefault(Boolean.FALSE, new HashSet(0)); + this.saveInvoiceAndGiveTips(newInvoices, existInvoices, false); + } + + this.getPageCache().remove("importInvoiceCache"); + } + + protected void saveInvoiceAndGiveTips(Set newInvoices, Set existInvoices, boolean isUpdate) { + if (!newInvoices.isEmpty()) { + SaveServiceHelper.save((DynamicObject[])newInvoices.toArray(new DynamicObject[0])); + } + + if (!existInvoices.isEmpty() && isUpdate) { + SaveServiceHelper.save((DynamicObject[])existInvoices.toArray(new DynamicObject[0])); + } + + if (isUpdate) { + this.getView().showSuccessNotification(String.format(ResManager.loadKDString("成功导入发票%1$s条;%2$s条发票已更新。", "InvoiceCloudImportListPlugin_8", "ec-ecpf-formplugin", new Object[0]), newInvoices.size(), existInvoices.size())); + } else if (existInvoices != null && !existInvoices.isEmpty()) { + this.getView().showSuccessNotification(String.format(ResManager.loadKDString("成功导入发票%1$s条;%2$s条发票已存在,不重复导入。", "InvoiceCloudImportListPlugin_7", "ec-ecpf-formplugin", new Object[0]), newInvoices.size(), existInvoices.size())); + } else { + this.getView().showSuccessNotification(String.format(ResManager.loadKDString("成功导入发票%s条。", "InvoiceCloudImportListPlugin_5", "ec-ecpf-formplugin", new Object[0]), newInvoices.size())); + } + + IListView view = (IListView)this.getView(); + view.refresh(); + } +} diff --git a/code/zcdev/zcgj-zcdev-zcdev-pr/src/main/java/zcgj/zcdev/zcdev/pr/plugin/form/CustomInvoiceDataHandleHelper.java b/code/zcdev/zcgj-zcdev-zcdev-pr/src/main/java/zcgj/zcdev/zcdev/pr/plugin/form/CustomInvoiceDataHandleHelper.java new file mode 100644 index 0000000..4cad39c --- /dev/null +++ b/code/zcdev/zcgj-zcdev-zcdev-pr/src/main/java/zcgj/zcdev/zcdev/pr/plugin/form/CustomInvoiceDataHandleHelper.java @@ -0,0 +1,271 @@ +// +// Source code recreated from a .class file by IntelliJ IDEA +// (powered by FernFlower decompiler) +// + +package zcgj.zcdev.zcdev.pr.plugin.form; + +import java.math.BigDecimal; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Date; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; +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.EntityMetadataCache; +import kd.bos.entity.MainEntityType; +import kd.bos.exception.KDBizException; +import kd.bos.form.CloseCallBack; +import kd.bos.form.FormShowParameter; +import kd.bos.form.ShowType; +import kd.bos.form.StyleCss; +import kd.bos.form.plugin.AbstractFormPlugin; +import kd.bos.logging.Log; +import kd.bos.logging.LogFactory; +import kd.bos.orm.ORM; +import kd.bos.orm.query.QFilter; +import kd.bos.servicehelper.BusinessDataServiceHelper; +import kd.bos.servicehelper.QueryServiceHelper; +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.InvoiceCloudConfigHelper; +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.HttpURLConnectionHelper; +import kd.ec.basedata.common.utils.MD5; +import kd.ec.basedata.common.utils.TextHelper; +import net.sf.ezmorph.object.DateMorpher; +import net.sf.json.JSONArray; +import net.sf.json.JSONObject; +import net.sf.json.JsonConfig; +import net.sf.json.util.JSONUtils; +import net.sf.json.util.PropertySetStrategy; + +public class CustomInvoiceDataHandleHelper extends InvoiceDataHandleHelper { + private static final Log log = LogFactory.getLog(CustomInvoiceDataHandleHelper.class); + + private CustomInvoiceDataHandleHelper() {} + + + public static Map> processInvoiceVO(List list, long userID, long orgID, Date date, String invoiceFormId, DynamicObject currency) { + return processInvoiceVO(list, userID, orgID, date, invoiceFormId, currency, false); + } + //将发票对象分为两类 true新发票 false已存在发票 + public static Map> processInvoiceVO(List list, long userID, long orgID, Date date, String invoiceFormId, DynamicObject currency, boolean isUpdate) { + Map> result = new HashMap(16); + if (list != null && !list.isEmpty()) { + log.info("根据发票ID获取数据实体类型"); + MainEntityType dt = EntityMetadataCache.getDataEntityType(invoiceFormId);//根据发票ID获取数据实体类型 + ORM orm = ORM.create();//用于生成新的发票ID + long[] ids = orm.genLongIds(dt, list.size()); + int index = 0; + log.info("遍历发票列表"); + for(InvoiceVO invoiceVO : list) { + log.info("根据 invoiceVO 和 invoiceFormId,从数据库中获取对应的发票对象。"); + DynamicObject invoiceFromDB = getInvoiceByVO(invoiceVO, invoiceFormId);//根据 invoiceVO 和 invoiceFormId,从数据库中获取对应的发票对象。 + if (invoiceFromDB != null) { + if (isUpdate) { + log.info("发票已存在,更新发票数据"); + updateInvoiceData(invoiceFromDB, invoiceVO);//如果发票已存在,更新发票数据 + } + //获取 Map 中键为 Boolean.FALSE 的 Set(表示已存在的发票),如果不存在则创建一个新的 HashSet + log.info("获取 Map 中键为 Boolean.FALSE 的 Set(表示已存在的发票),如果不存在则创建一个新的 HashSet"); + Set dbInvoices = (Set)result.getOrDefault(Boolean.FALSE, new HashSet(16)); + dbInvoices.add(invoiceFromDB);//将已存在的发票对象添加到该 Set 中 + result.put(Boolean.FALSE, dbInvoices);//将更新后的 Set 放回 Map 中 + } else { + //发票不存在,generateInvoiceByVO方法生成一个新的发票对象 + log.info("发票不存在,generateInvoiceByVO方法生成一个新的发票对象"); + DynamicObject newInvoice = generateInvoiceByVO(invoiceVO, dt, ids[index++], userID, orgID, date, currency); + Set newInvoices = (Set)result.getOrDefault(Boolean.TRUE, new HashSet(16)); + newInvoices.add(newInvoice);//将新生成的发票对象添加到该 Set 中 + result.put(Boolean.TRUE, newInvoices);//将更新后的 Set 放回 Map 中 + } + } + } + + return result; + } + + protected static void updateInvoiceData(DynamicObject invoiceFromDB, InvoiceVO invoiceVO) { + invoiceFromDB.set("invoicestatus", invoiceVO.getInvoiceStatus()); + } + //根据一个 InvoiceVO 对象生成一个 DynamicObject 类型的发票对象 + 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);//设置发票的唯一 ID + log.info("设置发票的唯一 ID:"+id); + invoice.set("serialno", invoiceVO.getSerialNo());//设置发票序列号 + log.info("设置发票序列号 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);//设置发票类型 + log.info("设置发票类型:"+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."); + } + //设置发票的货币类型和各种金额字段 + log.info("设置发票的货币类型和各种金额字段"); + 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()); + //设置购买方的税务编号、银行信息、账号、电话和地址 + log.info("设置购买方的税务编号、银行信息、账号、电话和地址"); + 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 不是就从顾客中检索 + log.info("发票名:"+dt.getName()); + QFilter buyerFilter = new QFilter("ffirmname", "=", invoiceVO.getBuyerName());//原本查询的是name + 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) { + 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 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; + } + } + } + + public static DynamicObject getInvoiceByVO(InvoiceVO invoiceVO, String invoiceFormId) { + if (invoiceVO != null && !StringUtils.isBlank(invoiceFormId)) { + QFilter filter = new QFilter("serialno", "=", invoiceVO.getSerialNo()); + List primaryKeys = QueryServiceHelper.queryPrimaryKeys(invoiceFormId, new QFilter[]{filter}, (String)null, 1); + return primaryKeys != null && !primaryKeys.isEmpty() ? BusinessDataServiceHelper.loadSingle(primaryKeys.get(0), invoiceFormId) : null; + } else { + return null; + } + } +}