diff --git a/fi/shkd-fi-fi/src/main/java/shkd/repc/recon/formplugin/ReconPayreqFormPlugin.java b/fi/shkd-fi-fi/src/main/java/shkd/repc/recon/formplugin/ReconPayreqFormPlugin.java index 046c9b5..5c65802 100644 --- a/fi/shkd-fi-fi/src/main/java/shkd/repc/recon/formplugin/ReconPayreqFormPlugin.java +++ b/fi/shkd-fi-fi/src/main/java/shkd/repc/recon/formplugin/ReconPayreqFormPlugin.java @@ -110,16 +110,15 @@ public class ReconPayreqFormPlugin extends AbstractFormPlugin implements UploadL //发票类工具栏按钮隐藏 this.getView().setVisible(false,"advcontoolbarap2"); //分录申请核销金额锁定 - this.getView().setVisible(false,"inventry_haswriteoffamt"); + this.getView().setEnable(false,"invoiceentry"); //设置置顶按钮隐藏 this.getView().setVisible(false,"qeug_confirmchange"); +// this.getView().updateView("invoiceentry"); }else { //设置置顶按钮隐藏 this.getView().setVisible(false,"bar_audit","bar_print","viewflowchart","payreqsplit","qeug_syncbip","payreqsplitsave"); } } - - } } @@ -528,6 +527,7 @@ public class ReconPayreqFormPlugin extends AbstractFormPlugin implements UploadL DynamicObject invoiceEntry = invoiceEntries.addNew(); invoiceEntry.getDataEntityState().setFromDatabase(true); invoiceEntry.set("inventry_invoicebill", invoiceBill); + invoiceEntry.set("qeug_invoiceno",invoiceBill.getString("invoiceno")); invoiceEntry.set("inventry_haswriteoffamt", invoiceBill.getBigDecimal("writeoffamount")); invoiceAmt = invoiceAmt.add(invoiceBill.getBigDecimal("invoiceamount")); diff --git a/fi/shkd-fi-fi/src/main/java/shkd/repc/recon/listplugin/PeconPayreqBillListPlugin.java b/fi/shkd-fi-fi/src/main/java/shkd/repc/recon/listplugin/PeconPayreqBillListPlugin.java new file mode 100644 index 0000000..a87bfc9 --- /dev/null +++ b/fi/shkd-fi-fi/src/main/java/shkd/repc/recon/listplugin/PeconPayreqBillListPlugin.java @@ -0,0 +1,227 @@ +package shkd.repc.recon.listplugin; + +import kd.bos.bill.BillShowParameter; +import kd.bos.dataentity.entity.DynamicObject; +import kd.bos.dataentity.entity.DynamicObjectCollection; +import kd.bos.entity.datamodel.ListSelectedRow; +import kd.bos.entity.datamodel.ListSelectedRowCollection; +import kd.bos.entity.operate.Save; +import kd.bos.form.FormShowParameter; +import kd.bos.form.ShowType; +import kd.bos.form.control.Toolbar; +import kd.bos.form.events.AfterDoOperationEventArgs; +import kd.bos.list.plugin.AbstractListPlugin; +import kd.bos.orm.query.QCP; +import kd.bos.orm.query.QFilter; +import kd.bos.servicehelper.BusinessDataServiceHelper; +import kd.bos.servicehelper.operation.SaveServiceHelper; +import kd.sdk.plugin.Plugin; +import org.agrona.Strings; + +import java.math.BigDecimal; +import java.util.*; + +/** + * 标准单据列表插件 + */ +public class PeconPayreqBillListPlugin extends AbstractListPlugin implements Plugin { + + + @Override + public void afterDoOperation(AfterDoOperationEventArgs afterDoOperationEventArgs) { + super.afterDoOperation(afterDoOperationEventArgs); + String operateKey = afterDoOperationEventArgs.getOperateKey(); + if ("addinvoice".equals(operateKey)){ + ListSelectedRowCollection rows = this.getSelectedRows(); + for (ListSelectedRow row : rows) { + Object pk = row.getPrimaryKeyValue(); + if (checkAddInvoice(pk)){ + BillShowParameter showParameter = new BillShowParameter(); + showParameter.setFormId("recon_payreqbill"); + showParameter.setPkId(pk);//设置单据主键 + showParameter.setCustomParam("isticket","true"); + showParameter.getOpenStyle().setShowType(ShowType.Modal);//打开方式 + this.getView().showForm(showParameter); + }else { + this.getView().showTipNotification("此付款申请单据不符合补录条件"); + } + } + + } else if ("re_addinvoice".equals(operateKey)) {//补录完毕,同步发票数据 + ListSelectedRowCollection rows = this.getSelectedRows(); + for (ListSelectedRow row : rows) { + Object pk = row.getPrimaryKeyValue(); + DynamicObject payreqbill = BusinessDataServiceHelper.loadSingle(pk, "recon_payreqbill");//付款申请完整数据 + if (payreqbill.getBoolean("qeug_isticket")){//确定付款是否需要补票 + BigDecimal applyamt = payreqbill.getBigDecimal("applyamt");//本期申请金额 + BigDecimal totalAmount = BigDecimal.ZERO; + DynamicObjectCollection invoiceentry = payreqbill.getDynamicObjectCollection("invoiceentry");//发票信息分录 + for (DynamicObject invoice : invoiceentry) { + totalAmount = totalAmount.add(invoice.getBigDecimal("inventry_haswriteoffamt"));//遍历计算总发票核销金额 + } + if (applyamt.compareTo(totalAmount) > 0){ + this.getView().showTipNotification("本次申请金额大于总发票核销金额,请继续补录发票"); + return; + } else if (applyamt.compareTo(totalAmount) < 0) { + this.getView().showTipNotification("总发票核销金额大于本次申请金额,请修改补录发票"); + return; + }else if (applyamt.compareTo(totalAmount) == 0){//当本次申请金额等于总发票核销金额 + + boolean flag = checkInvoiceAmount(invoiceentry,pk); + if (flag){//校验发票未核销金额是否足额 + //todo:1、查询当前申请的是否存在已经核销的发票 + QFilter qFilter = new QFilter("writeoffinfoentry.wentry_paybill.id", QCP.equals,pk); + DynamicObject[] invoiceBills = BusinessDataServiceHelper.load("recon_invoicebill", "id,invoiceno,invoiceamount,haswriteoffamount,writeoffamount,writeoffinfoentry.wentry_paybill.number,writeoffinfoentry.wentry_writroffamount,writeoffinfoentry.wentry_bizdate", new QFilter[]{qFilter}); + ArrayList alreadyInvoices = new ArrayList<>(); + for (DynamicObject invoiceBill : invoiceBills) {//添加该申请单已核销的发票号码 + alreadyInvoices.add(invoiceBill.getString("invoiceno")); + } + //todo:2、遍历当前付款申请的发票分录数据,比较已关联发票数据,修改数据 + for (DynamicObject invoice : invoiceentry) { + String qeug_invoiceno = invoice.getString("qeug_invoiceno"); + QFilter no_qf = new QFilter("invoiceno", QCP.equals, qeug_invoiceno); + DynamicObject invoiceBill = BusinessDataServiceHelper.loadSingle("recon_invoicebill", no_qf.toArray()); + BigDecimal inventry_haswriteoffamt = invoice.getBigDecimal("inventry_haswriteoffamt");//发票申请核销金额 + if (invoiceBill != null){ + Object invoicePk = invoiceBill.getPkValue();//获取发票主键 + DynamicObject recon_invoicebill = BusinessDataServiceHelper.loadSingle(invoicePk, "recon_invoicebill");//查询实际发票数据 + if (recon_invoicebill != null){ + String invoiceno = recon_invoicebill.getString("invoiceno");//发票号码 + if (!Strings.isEmpty(invoiceno)){ + boolean isContains = alreadyInvoices.contains(invoiceno);//判断当前行发票是否已经被关联核销 + if (isContains){//当此时关联发票已经被核销的情况 + DynamicObjectCollection writeoffinfoentry = recon_invoicebill.getDynamicObjectCollection("writeoffinfoentry");//获取核销信息分录 + for (DynamicObject dynamicObject : writeoffinfoentry) { + Object payBillPk = dynamicObject.getDynamicObject("wentry_paybill").getPkValue();//核销付款单id + if (pk.equals(payBillPk)){ + BigDecimal wentry_writroffamount = dynamicObject.getBigDecimal("wentry_writroffamount");//获取分录核销金额 + if (wentry_writroffamount.compareTo(inventry_haswriteoffamt) != 0){//当付款单发票核销金额同已核销数据不一致时 + BigDecimal haswriteoffamount = recon_invoicebill.getBigDecimal("haswriteoffamount");//目前已核销金额 + haswriteoffamount = haswriteoffamount.subtract(wentry_writroffamount);//还原已核销金额 + haswriteoffamount = haswriteoffamount.add(inventry_haswriteoffamt);//重新添加出已核销金额 + recon_invoicebill.set("haswriteoffamount",haswriteoffamount);//赋值已核销金额 + BigDecimal writeoffamount = recon_invoicebill.getBigDecimal("writeoffamount");//目前未核销金额 + writeoffamount = writeoffamount.add(wentry_writroffamount);//还原未核销金额 + writeoffamount = writeoffamount.subtract(inventry_haswriteoffamt); + recon_invoicebill.set("writeoffamount",writeoffamount);//赋值未核销金额 + dynamicObject.set("wentry_writroffamount",inventry_haswriteoffamt);//更新核销金额 + SaveServiceHelper.save(new DynamicObject[]{recon_invoicebill});//更新发票数据 + alreadyInvoices.remove(invoiceno); + break; + } + } + } + }else { + DynamicObjectCollection writeoffinfoentry = recon_invoicebill.getDynamicObjectCollection("writeoffinfoentry");//获取核销信息分录 + DynamicObject dynamicObject = writeoffinfoentry.addNew(); + dynamicObject.set("wentry_paybill",pk);//付款申请单编号 + dynamicObject.set("wentry_payamount",applyamt);//付款金额 + dynamicObject.set("wentry_writroffamount",inventry_haswriteoffamt);//核销金额 + BigDecimal haswriteoffamount = recon_invoicebill.getBigDecimal("haswriteoffamount");//目前已核销金额 + haswriteoffamount = haswriteoffamount.add(inventry_haswriteoffamt);//增加已核销金额 + recon_invoicebill.set("haswriteoffamount",haswriteoffamount);//赋值已核销金额 + BigDecimal writeoffamount = recon_invoicebill.getBigDecimal("writeoffamount");//目前未核销金额 + writeoffamount = writeoffamount.subtract(inventry_haswriteoffamt); + recon_invoicebill.set("writeoffamount",writeoffamount);//赋值未核销金额 + SaveServiceHelper.save(new DynamicObject[]{recon_invoicebill});//更新发票数据 + } + } + } + } + } + //todo:3、根据当前付款申请的发票分录数据修改数据后,剩下的发票为废弃关联,需返回核销金额 + if(alreadyInvoices.size()>0){//当已核销发票存在时,返还核销金额 + for (String alreadyInvoice : alreadyInvoices) { + QFilter alreadyInvoice_qf = new QFilter("invoiceno", QCP.equals, alreadyInvoice);//设置发票登记过滤条件 + DynamicObject recon_invoicebill = BusinessDataServiceHelper.loadSingle("recon_invoicebill", alreadyInvoice_qf.toArray());//查询发票数据 + if (recon_invoicebill != null){//当发票不为空时 + DynamicObjectCollection writeoffinfoentry = recon_invoicebill.getDynamicObjectCollection("writeoffinfoentry");//获取核销信息分录 + for (int i = 0; i < writeoffinfoentry.size();i++) { + DynamicObject dynamicObject = writeoffinfoentry.get(i); + Object payBillPk = dynamicObject.getDynamicObject("wentry_paybill").getPkValue();//核销付款单id + if (pk.equals(payBillPk)){ + BigDecimal wentry_writroffamount = dynamicObject.getBigDecimal("wentry_writroffamount");//获取分录核销金额 + BigDecimal haswriteoffamount = recon_invoicebill.getBigDecimal("haswriteoffamount");//目前已核销金额 + haswriteoffamount = haswriteoffamount.subtract(wentry_writroffamount);//还原已核销金额 + recon_invoicebill.set("haswriteoffamount",haswriteoffamount);//赋值已核销金额 + BigDecimal writeoffamount = recon_invoicebill.getBigDecimal("writeoffamount");//目前未核销金额 + writeoffamount = writeoffamount.add(wentry_writroffamount);//还原未核销金额 + recon_invoicebill.set("writeoffamount",writeoffamount);//赋值未核销金额 + SaveServiceHelper.save(new DynamicObject[]{recon_invoicebill});// + break; + } + } + } + } + } + //todo:4、根据当前付款申请的发票分录所有数据修改数据后,取消补单状态 + payreqbill.set("qeug_isticket",false); + SaveServiceHelper.save(new DynamicObject[]{payreqbill});//保存付款申请单 + } + } + } + } + } + } + + /** + * 校验 + * @param pk + * @return + */ + public boolean checkAddInvoice(Object pk){ + DynamicObject payreqbill = BusinessDataServiceHelper.loadSingle(pk, "recon_payreqbill");//付款申请完整数据 + return payreqbill.getBoolean("qeug_isticket"); + } + + /** + * 校验发票分录金额是否存在差异,之前已经核销的发票需要返回已核销金额后再进行比较 + * @param invoiceentry + */ + public boolean checkInvoiceAmount(DynamicObjectCollection invoiceentry,Object pk){ + boolean flag = true; + //todo:1、查询当前申请的是否存在已经核销的发票 + QFilter qFilter = new QFilter("writeoffinfoentry.wentry_paybill.id", QCP.equals,pk); + DynamicObject[] invoiceBills = BusinessDataServiceHelper.load("recon_invoicebill", "id,invoiceno,invoiceamount,haswriteoffamount,writeoffamount,writeoffinfoentry.wentry_paybill.number,writeoffinfoentry.wentry_writroffamount,writeoffinfoentry.wentry_bizdate", new QFilter[]{qFilter}); + ArrayList alreadyInvoices = new ArrayList<>(); + for (DynamicObject invoiceBill : invoiceBills) {//添加该申请单已核销的发票号码 + alreadyInvoices.add(invoiceBill.getString("invoiceno")); + } + for (int i = 0; i < invoiceentry.size();i++){ + DynamicObject invoice = invoiceentry.get(i); + String qeug_invoiceno = invoice.getString("qeug_invoiceno"); + QFilter no_qf = new QFilter("invoiceno", QCP.equals, qeug_invoiceno); + DynamicObject invoiceBill = BusinessDataServiceHelper.loadSingle("recon_invoicebill", no_qf.toArray()); + BigDecimal inventry_haswriteoffamt = invoice.getBigDecimal("inventry_haswriteoffamt");//发票申请核销金额 + if (invoiceBill != null){ + Object invoicePk = invoiceBill.getPkValue(); + DynamicObject recon_invoicebill = BusinessDataServiceHelper.loadSingle(invoicePk, "recon_invoicebill");//查询实际发票数据 + if (recon_invoicebill != null){ + String invoiceno = recon_invoicebill.getString("invoiceno"); + DynamicObjectCollection writeoffinfoentry = recon_invoicebill.getDynamicObjectCollection("writeoffinfoentry");//获取核销信息分录 + BigDecimal writeoffamount = recon_invoicebill.getBigDecimal("writeoffamount");//获取未核销金额 + if (alreadyInvoices.contains(invoiceno)){ + for (DynamicObject dynamicObject : writeoffinfoentry) { + Object payBillPk = dynamicObject.getDynamicObject("wentry_paybill").getPkValue();//核销付款单id + if (pk.equals(payBillPk)){ + BigDecimal wentry_writroffamount = dynamicObject.getBigDecimal("wentry_writroffamount");//获取分录核销金额 + writeoffamount = writeoffamount.add(wentry_writroffamount);//还原未核销金额 + } + } + } + if (writeoffamount.compareTo(inventry_haswriteoffamt) < 0){ + this.getView().showTipNotification("第"+(i+1)+"发票未核销金额不足,请重新关联发票"); + flag = false; + } + }else { + this.getView().showTipNotification("第"+(i+1)+"发票行数据异常,请重新关联发票"); + flag = false; + } + }else { + this.getView().showTipNotification("第"+(i+1)+"发票行数据异常,请重新关联发票"); + flag = false; + } + } + return flag; + } +} \ No newline at end of file