123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279 |
- 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<String> 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;
- }
- }
|