package fi.er.opplugin; import com.alibaba.druid.util.StringUtils; import fi.cas.common.SettlementStatusEnum; import kd.bos.dataentity.entity.DynamicObject; import kd.bos.dataentity.entity.DynamicObjectCollection; import kd.bos.entity.plugin.AbstractOperationServicePlugIn; import kd.bos.entity.plugin.args.BeginOperationTransactionArgs; import kd.bos.orm.query.QCP; import kd.bos.orm.query.QFilter; import kd.bos.servicehelper.BusinessDataServiceHelper; import kd.bos.servicehelper.QueryServiceHelper; import kd.bos.servicehelper.operation.SaveServiceHelper; import java.math.BigDecimal; import java.util.Arrays; import java.util.List; //报销单 public class PublicreimburOpPlugin extends AbstractOperationServicePlugIn { private static String ap_finapbill = "ap_finapbill"; //应付挂账单字段 @Override public void beginOperationTransaction(BeginOperationTransactionArgs e) { //获取报销单据信息 DynamicObject[] dynamicObjects = e.getDataEntities(); for (int i = 0; i < dynamicObjects.length; i++) { if (StringUtils.equals(e.getOperationKey(),"audit")) { //当前单头数据包 DynamicObject info = BusinessDataServiceHelper.loadSingle(dynamicObjects[i].getPkValue(), dynamicObjects[i].getDynamicObjectType().getName()); BigDecimal totalUnsettleamount = BigDecimal.ZERO; //循环收款信息分录 for (DynamicObject entryentity : info.getDynamicObjectCollection("accountentry")) { //取当前分录的收款金额 BigDecimal orireceiveamount = entryentity.getBigDecimal("orireceiveamount"); //未结算金额=收款金额 entryentity.set("nckd_unsettleamount_et",orireceiveamount); entryentity.set("nckd_settleamount_et",BigDecimal.ZERO); totalUnsettleamount = totalUnsettleamount.add(orireceiveamount); } info.set("nckd_unsettleamount",totalUnsettleamount); info.set("nckd_settleamount",BigDecimal.ZERO); info.set("nckd_settlestatus", SettlementStatusEnum.未结算.getValue()); SaveServiceHelper.save(new DynamicObject[]{info}); } else if (StringUtils.equals(e.getOperationKey(),"unaudit")) { //当前单头数据包 DynamicObject info = BusinessDataServiceHelper.loadSingle(dynamicObjects[i].getPkValue(), dynamicObjects[i].getDynamicObjectType().getName()); //循环收款信息分录 for (DynamicObject entryentity : info.getDynamicObjectCollection("accountentry")) { entryentity.set("nckd_unsettleamount_et",BigDecimal.ZERO); } info.set("nckd_unsettleamount",BigDecimal.ZERO); info.set("nckd_settlestatus", null); SaveServiceHelper.save(new DynamicObject[]{info}); } else if (StringUtils.equals(e.getOperationKey(),"save")) { DynamicObject info = dynamicObjects[i]; List list = Arrays.asList("3", "4", "5", "7", "8", "9", "10", "11", "12", "13", "14", "15","16", "17", "18", "19", "20", "21", "24", "30"); //获取发票信息分录 DynamicObjectCollection invoiceentry = info.getDynamicObjectCollection("invoiceentry"); for (DynamicObject entry : invoiceentry) { //发票类型 String invoicetype = entry.getString("invoicetype"); if (list.contains(invoicetype)) { info.set("nckd_checkboxfield4", true); break; } } //给资产信息协商最新的资产卡片id String assettype = info.getString("assettype"); if (StringUtils.equals(assettype,"existasset")) { DynamicObjectCollection assetentrys = info.getDynamicObjectCollection("assetentry"); for (DynamicObject assetentry : assetentrys) { DynamicObject assetbillno = assetentry.getDynamicObject("asset_billno"); if (assetbillno != null) { Long cardId = assetbillno.getLong("id"); QFilter filter = new QFilter("realcard.id", QCP.equals, cardId); DynamicObject[] finCards = BusinessDataServiceHelper.load("fa_card_fin","id",new QFilter[] {filter}, "endperiod.id DESC"); if (finCards.length > 0) { DynamicObject finCard = BusinessDataServiceHelper.loadSingle(finCards[0].getPkValue(), finCards[0].getDynamicObjectType().getName()); assetentry.set("nckd_bigintfield", finCard.getLong("id")); } } } } //反写预付借款单 DynamicObjectCollection writeoffmoneys = info.getDynamicObjectCollection("writeoffmoney"); Boolean exist = QueryServiceHelper.exists(info.getDynamicObjectType().getName(), info.getPkValue()); if (!exist) { // 如果没有保存的信息,直接反写 writeBackFinarbill(writeoffmoneys); }else { DynamicObject saveInfo = BusinessDataServiceHelper.loadSingle(info.getPkValue(), info.getDynamicObjectType().getName()); DynamicObjectCollection saveWriteoffmoneys = saveInfo.getDynamicObjectCollection("writeoffmoney"); // 处理在 saveWriteoffmoneys 中但不在 writeoffmoneys 中的元素 DynamicObjectCollection toDelete = getDifference(saveWriteoffmoneys, writeoffmoneys); if (toDelete.size() != 0) { deleteBackFinarbill(toDelete); } // 处理在 writeoffmoneys 中但不在 saveWriteoffmoneys 中的元素 DynamicObjectCollection toWriteBack = getDifference(writeoffmoneys, saveWriteoffmoneys); if (toWriteBack.size() != 0) { writeBackFinarbill(toWriteBack); } // 获取在 writeoffmoneys 和 saveWriteoffmoneys 中都有的元素并执行反写 DynamicObjectCollection commonItems = getCommonItems(writeoffmoneys, saveWriteoffmoneys); if (commonItems.size() != 0) { commonBackFinarbill(commonItems); } } } else if (StringUtils.equals(e.getOperationKey(),"delete")) { //当前单头数据包 DynamicObject info = BusinessDataServiceHelper.loadSingle(dynamicObjects[i].getPkValue(), dynamicObjects[i].getDynamicObjectType().getName()); DynamicObjectCollection writeoffmoneys = info.getDynamicObjectCollection("writeoffmoney"); deleteBackFinarbill(writeoffmoneys); } } } public void writeBackFinarbill(DynamicObjectCollection writeoffmoneys) { //报销单冲预付借款分录 for (DynamicObject writeoffmoney : writeoffmoneys) { //预付借款单id String sourcebillid = writeoffmoney.getString("sourcebillid"); //预付借款单预付借款信息分录id Long srcofsrcentryid = writeoffmoney.getLong("srcofsrcentryid"); //冲销金额 BigDecimal accloanamount = writeoffmoney.getBigDecimal("accloanamount"); //查询应收挂账单 QFilter filter = new QFilter("sourcebillid", QCP.equals, sourcebillid); DynamicObject[] finarbills = BusinessDataServiceHelper.load("ar_finarbill","id",new QFilter[] {filter}); for (DynamicObject finarbill : finarbills) { DynamicObject finarbillInfo = BusinessDataServiceHelper.loadSingle(finarbill.getPkValue(), finarbill.getDynamicObjectType().getName()); //应收挂账单明细分录 DynamicObjectCollection entrys = finarbillInfo.getDynamicObjectCollection("entry"); for (DynamicObject entry : entrys) { //预付借款单预付借款信息分录id Long e_srcentryid = entry.getLong("e_srcentryid"); //销账金额 BigDecimal nckd_e_settledamt = entry.getBigDecimal("nckd_e_settledamt"); //已结算金额 BigDecimal e_settledamt = entry.getBigDecimal("e_settledamt"); //未结算金额 BigDecimal e_unsettleamt = entry.getBigDecimal("e_unsettleamt"); //已结算金额(本位币) BigDecimal e_settledlocalamt = entry.getBigDecimal("e_settledlocalamt"); //未结算金额(本位币) BigDecimal e_unsettlelocalamt = entry.getBigDecimal("e_unsettlelocalamt"); if (e_srcentryid != 0 && e_srcentryid.equals(srcofsrcentryid)) { entry.set("nckd_e_settledamt", nckd_e_settledamt.add(accloanamount)); entry.set("e_settledamt", e_settledamt.add(accloanamount)); entry.set("e_unsettleamt", e_unsettleamt.subtract(accloanamount)); } } SaveServiceHelper.save(new DynamicObject[]{finarbillInfo}); } } } public void deleteBackFinarbill(DynamicObjectCollection writeoffmoneys) { //报销单冲预付借款分录 for (DynamicObject writeoffmoney : writeoffmoneys) { //预付借款单id String sourcebillid = writeoffmoney.getString("sourcebillid"); //预付借款单预付借款信息分录id Long srcofsrcentryid = writeoffmoney.getLong("srcofsrcentryid"); //冲销金额 BigDecimal accloanamount = writeoffmoney.getBigDecimal("accloanamount"); //查询应收挂账单 QFilter filter = new QFilter("sourcebillid", QCP.equals, sourcebillid); DynamicObject[] finarbills = BusinessDataServiceHelper.load("ar_finarbill","id",new QFilter[] {filter}); for (DynamicObject finarbill : finarbills) { DynamicObject finarbillInfo = BusinessDataServiceHelper.loadSingle(finarbill.getPkValue(), finarbill.getDynamicObjectType().getName()); //应收挂账单明细分录 DynamicObjectCollection entrys = finarbillInfo.getDynamicObjectCollection("entry"); for (DynamicObject entry : entrys) { //预付借款单预付借款信息分录id Long e_srcentryid = entry.getLong("e_srcentryid"); //销账金额 BigDecimal nckd_e_settledamt = entry.getBigDecimal("nckd_e_settledamt"); //已结算金额 BigDecimal e_settledamt = entry.getBigDecimal("e_settledamt"); //未结算金额 BigDecimal e_unsettleamt = entry.getBigDecimal("e_unsettleamt"); //已结算金额(本位币) BigDecimal e_settledlocalamt = entry.getBigDecimal("e_settledlocalamt"); //未结算金额(本位币) BigDecimal e_unsettlelocalamt = entry.getBigDecimal("e_unsettlelocalamt"); if (e_srcentryid != 0 && e_srcentryid.equals(srcofsrcentryid)) { entry.set("nckd_e_settledamt", nckd_e_settledamt.subtract(accloanamount)); entry.set("e_settledamt", e_settledamt.subtract(accloanamount)); entry.set("e_unsettleamt", e_unsettleamt.add(accloanamount)); } } SaveServiceHelper.save(new DynamicObject[]{finarbillInfo}); } } } public void commonBackFinarbill(DynamicObjectCollection writeoffmoneys) { //报销单冲预付借款分录 for (DynamicObject writeoffmoney : writeoffmoneys) { //预付借款单id String sourcebillid = writeoffmoney.getString("sourcebillid"); //预付借款单预付借款信息分录id Long srcofsrcentryid = writeoffmoney.getLong("srcofsrcentryid"); //冲销金额 BigDecimal nckd_amountfield13 = writeoffmoney.getBigDecimal("nckd_amountfield13"); //查询应收挂账单 QFilter filter = new QFilter("sourcebillid", QCP.equals, sourcebillid); DynamicObject[] finarbills = BusinessDataServiceHelper.load("ar_finarbill","id",new QFilter[] {filter}); for (DynamicObject finarbill : finarbills) { DynamicObject finarbillInfo = BusinessDataServiceHelper.loadSingle(finarbill.getPkValue(), finarbill.getDynamicObjectType().getName()); //应收挂账单明细分录 DynamicObjectCollection entrys = finarbillInfo.getDynamicObjectCollection("entry"); for (DynamicObject entry : entrys) { //预付借款单预付借款信息分录id Long e_srcentryid = entry.getLong("e_srcentryid"); //销账金额 BigDecimal nckd_e_settledamt = entry.getBigDecimal("nckd_e_settledamt"); //已结算金额 BigDecimal e_settledamt = entry.getBigDecimal("e_settledamt"); //未结算金额 BigDecimal e_unsettleamt = entry.getBigDecimal("e_unsettleamt"); //已结算金额(本位币) BigDecimal e_settledlocalamt = entry.getBigDecimal("e_settledlocalamt"); //未结算金额(本位币) BigDecimal e_unsettlelocalamt = entry.getBigDecimal("e_unsettlelocalamt"); if (e_srcentryid != 0 && e_srcentryid.equals(srcofsrcentryid)) { entry.set("nckd_e_settledamt", nckd_e_settledamt.add(nckd_amountfield13)); entry.set("e_settledamt", e_settledamt.add(nckd_amountfield13)); entry.set("e_unsettleamt", e_unsettleamt.subtract(nckd_amountfield13)); } } SaveServiceHelper.save(new DynamicObject[]{finarbillInfo}); } } } // 获取在 source 中但不在 target 中的元素集合 private DynamicObjectCollection getDifference(DynamicObjectCollection source, DynamicObjectCollection target) { DynamicObjectCollection difference = new DynamicObjectCollection(); for (DynamicObject sourceItem : source) { boolean existsInTarget = false; for (DynamicObject targetItem : target) { // 根据某个唯一标识符判断是否存在 if (sourceItem.getPkValue().equals(targetItem.getPkValue())) { existsInTarget = true; break; } } if (!existsInTarget) { difference.add(sourceItem); } } return difference; } // 获取在 source 和 target 中都有的元素集合 private DynamicObjectCollection getCommonItems(DynamicObjectCollection source, DynamicObjectCollection target) { DynamicObjectCollection commonItems = new DynamicObjectCollection(); for (DynamicObject sourceItem : source) { for (DynamicObject targetItem : target) { // 根据某个唯一标识符判断是否存在 if (sourceItem.getPkValue().equals(targetItem.getPkValue())) { BigDecimal sourceAmount = sourceItem.getBigDecimal("accloanamount"); BigDecimal targetAmount = targetItem.getBigDecimal("accloanamount"); BigDecimal nckd_amountfield13 = sourceAmount.subtract(targetAmount); if (nckd_amountfield13.compareTo(BigDecimal.ZERO) != 0) { sourceItem.set("nckd_amountfield13", nckd_amountfield13); commonItems.add(sourceItem); break; // 找到共同项后跳出内层循环 } } } } return commonItems; } }