diff --git a/code/zcdev/zcgj-zcdev-zcdev-pr/src/main/java/zcgj/zcdev/zcdev/pr/plugin/form/OutContractFinaceConfirmeInvoicePlugin.java b/code/zcdev/zcgj-zcdev-zcdev-pr/src/main/java/zcgj/zcdev/zcdev/pr/plugin/form/OutContractFinaceConfirmeInvoicePlugin.java index 450a615..6832342 100644 --- a/code/zcdev/zcgj-zcdev-zcdev-pr/src/main/java/zcgj/zcdev/zcdev/pr/plugin/form/OutContractFinaceConfirmeInvoicePlugin.java +++ b/code/zcdev/zcgj-zcdev-zcdev-pr/src/main/java/zcgj/zcdev/zcdev/pr/plugin/form/OutContractFinaceConfirmeInvoicePlugin.java @@ -1,5 +1,7 @@ package zcgj.zcdev.zcdev.pr.plugin.form; +import com.google.gson.Gson; +import com.google.gson.reflect.TypeToken; import kd.bos.bill.AbstractBillPlugIn; import kd.bos.context.RequestContext; import kd.bos.dataentity.entity.DynamicObject; @@ -18,6 +20,8 @@ import kd.bos.form.operate.FormOperate; import kd.bos.list.ListShowParameter; import kd.bos.logging.Log; import kd.bos.logging.LogFactory; +import kd.bos.openapi.common.result.OpenApiResult; +import kd.bos.openapi.common.util.OpenApiSdkUtil; import kd.bos.orm.query.QCP; import kd.bos.orm.query.QFilter; import kd.bos.servicehelper.BusinessDataServiceHelper; @@ -95,6 +99,7 @@ public class OutContractFinaceConfirmeInvoicePlugin extends AbstractBillPlugIn i filter.and(new QFilter("currency", "=", currencyId)); filter.and(new QFilter("invoicestatus", "!=", "2")); filter.and(new QFilter("unapplyamount", ">", BigDecimal.ZERO)); + filter.and(new QFilter("zcgj_isbind", "=", false)); //发票被 rim_expense_relation 关系绑定 QFilter filter1 = new QFilter("isclaimed", "=", true); filter1.and(new QFilter("billstatus", "=", "C")); DynamicObject contract = (DynamicObject)this.getModel().getValue("zcgj_contract"); @@ -105,34 +110,35 @@ public class OutContractFinaceConfirmeInvoicePlugin extends AbstractBillPlugIn i DynamicObjectCollection contInvEntryCol = this.getModel().getEntryEntity("zcgj_entryentity"); if (contInvEntryCol.size() > 0) { List selectedInvIds = new ArrayList(8); - - for(DynamicObject contInvEntryObj : contInvEntryCol) { + for(DynamicObject contInvEntryObj : contInvEntryCol) {//剔除合同下的发票 DynamicObject invoice = contInvEntryObj.getDynamicObject("zcgj_invoice"); selectedInvIds.add(invoice.getLong("id")); } - filter1.and(new QFilter("id", "not in", selectedInvIds)); } - + filter1.and(new QFilter("zcgj_isbind", "=", false)); ListShowParameter param = ShowFormHelper.createShowListForm("ec_in_invoice_f7", true); - param.getListFilterParameter().setFilter(filter.or(filter1)); + // param.getListFilterParameter().setFilter(filter.or(filter1)); param.setMultiSelect(true); param.setCloseCallBack(new CloseCallBack(this, entryType)); param.getOpenStyle().setShowType(ShowType.Modal); this.getView().showForm(param); + }else{ + this.getView().showErrorNotification("请选择合同!"); } } protected void invoiceCloseCallBack(ClosedCallBackEvent event) { ListSelectedRowCollection rows = (ListSelectedRowCollection)event.getReturnData(); DynamicObject[] invArr = new DynamicObject[rows.size()]; + List invList= new ArrayList<>(rows.size()); int index = 0; DynamicObject upContract = (DynamicObject)this.getModel().getValue("zcgj_contract"); for(ListSelectedRow row : rows) { Object invoicePk = row.getPrimaryKeyValue().toString(); int rowIndex = this.getModel().createNewEntryRow("zcgj_entryentity"); this.getModel().setValue("zcgj_invoice", invoicePk.toString(), rowIndex); - DynamicObject invoice = BusinessDataServiceHelper.loadSingle(invoicePk, "ec_in_invoice", "unapplyinvtax,unapplyamount,isClaimed,contract,project,connecttype,currency,totalamount,totaltax,totaloftaxamount"); + DynamicObject invoice = BusinessDataServiceHelper.loadSingle(invoicePk, "ec_in_invoice", "unapplyinvtax,unapplyamount,isClaimed,contract,project,connecttype,currency,totalamount,totaltax,totaloftaxamount,serialno,candeduct,zcgj_isbind"); this.getModel().setValue("zcgj_invoicecurrency", invoice.getDynamicObject("currency") == null ? Long.valueOf("0") : invoice.getDynamicObject("currency").getPkValue(), rowIndex); this.getModel().setValue("zcgj_invoiceamount", invoice.getBigDecimal("totalamount"), rowIndex); this.getModel().setValue("zcgj_invoicetax", invoice.getBigDecimal("totaltax"), rowIndex); @@ -145,8 +151,11 @@ public class OutContractFinaceConfirmeInvoicePlugin extends AbstractBillPlugIn i invoice.set("contract", upContract); invoice.set("project", (DynamicObject)this.getModel().getValue("zcgj_project")); invoice.set("connecttype", "contract"); + invoice.set("zcgj_isbind", true); + invList.add(invoice); } SaveServiceHelper.save(invArr); + bindInvoice(invList,"60"); this.getView().invokeOperation("invoicesave"); } @@ -257,6 +266,7 @@ public class OutContractFinaceConfirmeInvoicePlugin extends AbstractBillPlugIn i invoice.set("contract", upContract); invoice.set("project", (DynamicObject)this.getModel().getValue("zcgj_project")); invoice.set("connecttype", "contract"); + invoice.set("zcgj_isbind", true); invArr.add(invoice); } } @@ -264,6 +274,7 @@ public class OutContractFinaceConfirmeInvoicePlugin extends AbstractBillPlugIn i if (invArr.size() > 0) { SaveServiceHelper.save((DynamicObject[])invArr.toArray(new DynamicObject[invoices.size()])); + bindInvoice(invArr,"60"); } this.getView().invokeOperation("invoicesave"); } @@ -310,19 +321,23 @@ public class OutContractFinaceConfirmeInvoicePlugin extends AbstractBillPlugIn i } if (!updateInvoicePks.isEmpty()) { - DynamicObject[] invoices = BusinessDataServiceHelper.load("ec_in_invoice", "isinvoiceclaim,isclaimed,contract,project,connecttype", + DynamicObject[] invoices = BusinessDataServiceHelper.load("ec_in_invoice", "isinvoiceclaim,isclaimed,contract,project,connecttype,serialno,zcgj_isbind", new QFilter[]{new QFilter("id", "in", updateInvoicePks)}); - + List invList = new ArrayList<>(); for(DynamicObject invoice : invoices) { if (!invoice.getBoolean("isinvoiceclaim")) { invoice.set("isclaimed", false); invoice.set("contract", (Object)null); invoice.set("project", (Object)null); invoice.set("connecttype", "null"); + invoice.set("zcgj_isbind", false); + invList.add(invoice); } } - SaveServiceHelper.save(invoices); + //删除发票和单据绑定关系 + //deleteInvoiceBind(invoices); + bindInvoice(invList,"1"); } DeleteServiceHelper.delete(subDT, delPks); @@ -331,4 +346,108 @@ public class OutContractFinaceConfirmeInvoicePlugin extends AbstractBillPlugIn i } } //删除发票 结束 + + //绑定发票 + public void bindInvoice(List invArr,String status){ + Object pkValue = this.getModel().getDataEntity(true).getPkValue(); + log.info("OutContractFinaceConfirmeInvoicePlugin:发票绑定-"+pkValue); + /*for (DynamicObject invoiceData : invArr) { + + } + Object billno = this.getModel().getValue("billno"); + String par = "{" + + " \"messageType\": \"billSave\"," + + " \"messageId\": \"202511051701\"," + + " \"data\": {\n" + + " \"billId\": "+pkValue+"," + + " \"billNo\": "+billno+"," + + " \"billType\": \"zcgj_ec_out_finaceconfirm\"," + + " \"status\": \"60\"," + + " \"resource\": \"4\"," + + " \"invoiceData\": [" + + " {" + + " \"serialNo\": "+invArr.get(0).getString("serialno") + + " }" + + " ]" + + " }" + + "}";*/ + StringBuilder invoiceDataBuilder = new StringBuilder("["); + for (int i = 0; i < invArr.size(); i++) { + DynamicObject invoiceData = invArr.get(i); + String serialNo = invoiceData.getString("serialno"); + invoiceDataBuilder.append("{") + .append("\"serialNo\": \"").append(serialNo).append("\"") + .append("}"); + if (i < invArr.size() - 1) { + invoiceDataBuilder.append(","); + } + } + invoiceDataBuilder.append("]"); + // 获取单据号 + Object billno = this.getModel().getValue("billno"); + // 拼接完整 JSON + String par = "{" + + "\"messageType\": \"billSave\"," + + "\"messageId\": "+System.currentTimeMillis()+"," + + "\"data\": {" + + "\"billId\": \"" + pkValue + "\"," + + "\"billNo\": \"" + billno + "\"," + + "\"billType\": \"zcgj_ec_out_finaceconfirm\"," + + "\"status\": \""+status+"\"," //1-未用,30-在用,60-已用 + + "\"resource\": \"4\"," + + "\"invoiceData\": " + invoiceDataBuilder + + "}" + + "}"; + + Gson gson = new Gson(); + //String json = gson.toJson(balanceQueryParamApi); + Map params = gson.fromJson(par, + new TypeToken>() { + }.getType()); + OpenApiResult balanceData = OpenApiSdkUtil.invoke("/v2/rim/message/service", params); + log.info("OutContractFinaceConfirmeInvoicePlugin:发票绑定-"+balanceData.getMessage()); + System.out.println(); + //当前单据id + /*Object pkValue = this.getModel().getDataEntity(true).getPkValue(); + log.info("OutContractFinaceConfirmeInvoicePlugin:发票绑定-"+pkValue); + Object billno = this.getModel().getValue("billno"); + for (DynamicObject invoiceData : invArr) { + + DynamicObject bindData = BusinessDataServiceHelper.newDynamicObject("rim_expense_relation"); + bindData.set("resource","4");//报销单来源 + bindData.set("view_page","zcgj_ec_out_finaceconfirm");//详情页面 + bindData.set("entityid","zcgj_ec_out_finaceconfirm");//报销单实体id + bindData.set("expense_id",pkValue);//报销单id + bindData.set("expense_num",billno);//报销单编号 + log.info("OutContractFinaceConfirmeInvoicePlugin:发票绑定- billno-"+billno); + bindData.set("serial_no",invoiceData.getString("serialno"));//发票流水号 + log.info("OutContractFinaceConfirmeInvoicePlugin:发票绑定- serialno-"+invoiceData.getString("serialno")); + if(invoiceData.getBoolean("candeduct")){ + bindData.set("deduction_flag",1);//是否可抵扣 + bindData.set("effective_tax_amount",invoiceData.getBigDecimal("totaltax"));//可抵扣税额-税额 + }else{ + bindData.set("deduction_flag",0); + } + + bindData.set("deduction_amount",invoiceData.getBigDecimal("totaltax"));//入账税额-税额 + bindData.set("expense_amount",invoiceData.getBigDecimal("totaloftaxamount"));//报销金额-价税合计 + bindData.set("status","60");//报销单状态 + bindData.set("output_amount",invoiceData.getBigDecimal("totaltax"));//转出金额-税额 + bindData.set("use_type",1);//使用类型 + bindData.set("billtaxamount",invoiceData.getBigDecimal("totaltax"));//本次报账税额 + SaveServiceHelper.saveOperate("rim_expense_relation", new DynamicObject[]{bindData}, null);//支出合同实体 + }*/ + } + + public void deleteInvoiceBind(DynamicObject[] invArr){ + /*Long pkValue = (Long)this.getModel().getDataEntity(true).getPkValue(); + for (DynamicObject invData : invArr) { + String serialno = invData.getString("serialno"); + QFilter idFilter = new QFilter("expense_id", QCP.equals,pkValue); + QFilter serialnoFilter = new QFilter("serial_no", QCP.equals,serialno); + //DynamicObject[] loadInvoiceData = BusinessDataServiceHelper.load("rim_expense_relation", "serial_no", new QFilter[]{idFilter,serialnoFilter}); + DeleteServiceHelper.delete("rim_expense_relation", new QFilter[]{idFilter.and(serialnoFilter)}); + + }*/ + } }