Parcourir la source

外办申请变更

wanghaiwu il y a 6 jours
Parent
commit
07aed9a5fe

+ 155 - 0
code/jyyy/nckd-jimin-jyyy-fi/src/main/java/nckd/jimin/jyyy/fi/plugin/form/DailyVehicleCusListPlugin.java

@@ -0,0 +1,155 @@
+package nckd.jimin.jyyy.fi.plugin.form;
+
+import kd.bos.bill.BillOperationStatus;
+import kd.bos.bill.BillShowParameter;
+import kd.bos.dataentity.RefObject;
+import kd.bos.dataentity.entity.DynamicObject;
+import kd.bos.dataentity.resource.ResManager;
+import kd.bos.entity.datamodel.ListSelectedRow;
+import kd.bos.entity.datamodel.ListSelectedRowCollection;
+import kd.bos.entity.operate.result.OperationResult;
+import kd.bos.form.ShowType;
+import kd.bos.form.events.AfterDoOperationEventArgs;
+import kd.bos.form.events.BeforeDoOperationEventArgs;
+import kd.bos.form.operate.AbstractOperate;
+import kd.bos.form.operate.FormOperate;
+import kd.bos.list.BillList;
+import kd.bos.list.ListShowParameter;
+import kd.bos.list.plugin.AbstractListPlugin;
+import kd.bos.orm.query.QFilter;
+import kd.bos.servicehelper.QueryServiceHelper;
+import kd.bos.servicehelper.botp.BFTrackerServiceHelper;
+import kd.bos.servicehelper.workflow.WorkflowServiceHelper;
+import kd.fi.er.business.utils.ErEntityTypeUtils;
+import java.util.*;
+import java.util.stream.Collectors;
+
+/**
+ * 外办申请,
+ */
+public class DailyVehicleCusListPlugin extends AbstractListPlugin {
+
+    public void beforeDoOperation(BeforeDoOperationEventArgs args) {
+        super.beforeDoOperation(args);
+        Object source = args.getSource();
+
+        String opKey = ((AbstractOperate)source).getOperateKey();
+        Set<Long> selectedDatas = (Set)args.getListSelectedData().stream().map((data) -> {
+            return (Long)data.getPrimaryKeyValue();
+        }).collect(Collectors.toSet());
+
+        String confirmTip;
+        switch (opKey) {
+            case "unaudit":
+                if (!this.checkBeforeTripChange(selectedDatas)) {
+                    args.setCancel(true);
+                    return;
+                }
+                break;
+            case "nckd_tripinvoke":
+                if (selectedDatas.size() > 1 || selectedDatas.size() == 0) {
+                    this.getView().showTipNotification(ResManager.loadKDString("仅支持对单条外办申请单进行撤销变更。", "TripReqBillList_7", "fi-er-formplugin", new Object[0]));
+                    args.setCancel(true);
+                } else {
+                    if (selectedDatas.size() == 1) {
+                        ListSelectedRow row = args.getListSelectedData().get(0);
+                        confirmTip = ((ListShowParameter)this.getView().getFormShowParameter()).getBillFormId();
+                        DynamicObject item = QueryServiceHelper.queryOne(confirmTip, "nckd_ischange,billstatus", new QFilter[]{new QFilter("id", "=", row.getPrimaryKeyValue())});
+                        if (!item.getBoolean("nckd_ischange")) {
+                            this.getView().showTipNotification(ResManager.loadKDString("不满足操作条件:只有进行过变更的单据才允许撤销变更。", "TripReqBillList_11", "fi-er-formplugin", new Object[0]));
+                            args.setCancel(true);
+                            return;
+                        }
+
+                        if (!item.getString("billstatus").equals("A")) {
+                            this.getView().showTipNotification(ResManager.loadKDString("操作条件不满足:只有单据状态为“暂存”的单据才可撤销变更。", "TripReqBillList_12", "fi-er-formplugin", new Object[0]));
+                            args.setCancel(true);
+                            return;
+                        }
+                    }
+                }
+        }
+
+    }
+
+    public void afterDoOperation(AfterDoOperationEventArgs e) {
+        super.afterDoOperation(e);
+        String opKey = e.getOperateKey();
+
+        if ("unaudit".equalsIgnoreCase(opKey)) {
+            ListSelectedRowCollection selectedRows = this.getSelectedRows();
+            Object selectId = selectedRows.get(0).getPrimaryKeyValue();
+
+            OperationResult operationResult = e.getOperationResult();
+            if (operationResult.isSuccess()) {
+                BillShowParameter formShowParameter = new BillShowParameter();
+                formShowParameter.getOpenStyle().setShowType(ShowType.MainNewTabPage);
+                formShowParameter.setFormId(((ListShowParameter)this.getView().getFormShowParameter()).getBillFormId());
+                formShowParameter.setBillStatus(BillOperationStatus.EDIT);
+                formShowParameter.setPkId(selectId);
+                this.getView().showForm(formShowParameter);
+            }
+        } else if ("nckd_tripinvoke".equalsIgnoreCase(opKey)) {
+            ListSelectedRowCollection selectedRows = this.getSelectedRows();
+            Object selectId = selectedRows.get(0).getPrimaryKeyValue();
+            int row = selectedRows.get(0).getRowKey();
+            Long workId = WorkflowServiceHelper.getProcessInstanceIdByBusinessKey(String.valueOf(selectId));
+            List<Long> approveres = WorkflowServiceHelper.getApproverByBusinessKey(String.valueOf(selectId));
+            if (workId != null && !workId.equals(0L) && !approveres.isEmpty()) {
+                WorkflowServiceHelper.abandon(workId);
+                BillList list = (BillList)this.getControl("billlistap");
+                list.refresh();
+            }
+
+            OperationResult result = e.getOperationResult();
+            if (result.isSuccess()) {
+                this.getView().showSuccessNotification(ResManager.loadKDString("行程已成功撤销。", "TripReqBillList_9", "fi-er-formplugin", new Object[0]));
+            } else {
+                this.getView().showTipNotification(ResManager.loadKDString("行程撤销失败。", "TripReqBillList_10", "fi-er-formplugin", new Object[0]));
+            }
+
+            BillList list = (BillList)this.getControl("billlistap");
+            list.refresh();
+        }
+    }
+
+
+    private boolean checkBeforeTripChange(Set<Long> selectedDatas) {
+        if (selectedDatas.size() > 1 || selectedDatas.size() == 0) {
+            this.getView().showTipNotification(ResManager.loadKDString("仅支持对单条外办申请单进行行程变更。", "TripReqBillList_13", "fi-er-formplugin", new Object[0]));
+            return false;
+        } else {
+            Long selectReqBillId = (Long)selectedDatas.stream().findFirst().get();
+            String entityName = ((ListShowParameter)this.getView().getFormShowParameter()).getBillFormId();
+            DynamicObject reqBill = QueryServiceHelper.queryOne(entityName, "billno,billstatus,isloan", new QFilter[]{new QFilter("id", "=", selectReqBillId)});
+            if (reqBill == null) {
+                this.getView().showErrorNotification(ResManager.loadKDString("数据库无法查询到数据,请刷新页面后尝试。", "TripAutoOpenedListPlugin_2", "fi-er-formplugin", new Object[0]));
+                return false;
+            } else if (!"E".equals(reqBill.get("billstatus")) ) {
+                this.getView().showTipNotification(ResManager.loadKDString("只有“审核通过”的外办申请才能进行行程变更。", "TripReqBillList_14", "fi-er-formplugin", new Object[0]));
+                return false;
+            } else {
+                Map<String, HashSet<Long>> targetBills = BFTrackerServiceHelper.findTargetBills(entityName, (Long[]) Collections.singleton(selectReqBillId).toArray(new Long[0]));
+                if (targetBills.isEmpty()) {
+                    return true;
+                } else {
+                    HashSet<Long> targetBillIds = (HashSet)targetBills.get("er_tripreimbursebill");
+                    if (targetBillIds != null && !targetBillIds.isEmpty()) {
+                        this.getView().showTipNotification(ResManager.loadKDString("所选的外办申请单存在已关联的差旅报销单,不允许变更行程。", "TripReqBillList_15", "fi-er-formplugin", new Object[0]));
+                        return false;
+                    } else {
+                        if (ErEntityTypeUtils.isTripReqBillInter(entityName)) {
+                            targetBillIds = (HashSet)targetBills.get("er_tripreimburse_cardgrid");
+                            if (targetBillIds != null && !targetBillIds.isEmpty()) {
+                                this.getView().showTipNotification(ResManager.loadKDString("所选的外办申请单存在已关联的差旅报销单,不允许变更行程。", "TripReqBillList_15", "fi-er-formplugin", new Object[0]));
+                                return false;
+                            }
+                        }
+
+                        return true;
+                    }
+                }
+            }
+        }
+    }
+}

+ 148 - 0
code/jyyy/nckd-jimin-jyyy-fi/src/main/java/nckd/jimin/jyyy/fi/plugin/operate/DailyVehicleBillInvokeOpPlugin.java

@@ -0,0 +1,148 @@
+package nckd.jimin.jyyy.fi.plugin.operate;
+
+import kd.bos.dataentity.OperateOption;
+import kd.bos.dataentity.entity.DynamicObject;
+import kd.bos.dataentity.entity.DynamicObjectCollection;
+import kd.bos.dataentity.resource.ResManager;
+import kd.bos.entity.ExtendedDataEntity;
+import kd.bos.entity.operate.result.OperateErrorInfo;
+import kd.bos.entity.operate.result.OperationResult;
+import kd.bos.entity.plugin.AbstractOperationServicePlugIn;
+import kd.bos.entity.plugin.AddValidatorsEventArgs;
+import kd.bos.entity.plugin.PreparePropertysEventArgs;
+import kd.bos.entity.plugin.args.EndOperationTransactionArgs;
+import kd.bos.entity.validate.AbstractValidator;
+import kd.bos.exception.KDException;
+import kd.bos.logging.Log;
+import kd.bos.logging.LogFactory;
+import kd.bos.servicehelper.operation.OperationServiceHelper;
+import kd.bos.servicehelper.operation.SaveServiceHelper;
+import kd.fi.er.common.ErBillStatusEnum;
+import java.util.*;
+import java.util.stream.Collectors;
+
+/**
+ * 外办申请,撤销变更
+ */
+public class DailyVehicleBillInvokeOpPlugin extends AbstractOperationServicePlugIn {
+    private static final Log logger = LogFactory.getLog(DailyVehicleBillInvokeOpPlugin.class);
+
+    public void onPreparePropertys(PreparePropertysEventArgs e) {
+        super.onPreparePropertys(e);
+
+        List<String> fieldKeys = e.getFieldKeys();
+
+        fieldKeys.add("billstatus");
+        fieldKeys.add("applier");
+        fieldKeys.add("startdate");
+        fieldKeys.add("enddate");
+        fieldKeys.add("nckd_ischange");
+        fieldKeys.add("vehiclecity");
+
+        fieldKeys.add("nckd_historyentry");
+        fieldKeys.add("nckd_historyentry.nckd_historystartdate");
+        fieldKeys.add("nckd_historyentry.nckd_historyenddate");
+        fieldKeys.add("nckd_historyentry.nckd_historycity");
+        fieldKeys.add("nckd_historyentry.nckd_changetime");
+    }
+
+    public void onAddValidators(AddValidatorsEventArgs e) {
+        this.addDailyVehicleInvokeValidator(e);
+    }
+
+    public void endOperationTransaction(EndOperationTransactionArgs e) {
+        DynamicObject[] bills = e.getDataEntities();
+        if (bills.length > 0) {
+            this.doRevoke(bills);
+            SaveServiceHelper.save(bills);
+            Object[] ids = new Object[bills.length];
+
+            for(int index = 0; index < bills.length; ++index) {
+                ids[index] = bills[index].getPkValue();
+            }
+
+            OperateOption op = OperateOption.create();
+            op.setVariableValue("WF", String.valueOf(true));
+            OperationResult res = OperationServiceHelper.executeOperate("audit", "er_dailyvehiclebill", ids, op);
+
+            if (!res.isSuccess()) {
+                StringBuilder tips = this.buildErrorInfoBuilder(res);
+                throw new KDException(String.format(ResManager.loadKDString("行程撤销失败:%1$s", "TripEntryInfoRevokeOP_0", "fi-er-opplugin", new Object[0]), tips.toString()));
+            }
+        }
+    }
+
+    private StringBuilder buildErrorInfoBuilder(OperationResult res) {
+        StringBuilder tips = new StringBuilder();
+        if (null != res.getMessage()) {
+            tips.append(res.getMessage());
+        }
+
+        if (null != res.getAllErrorInfo() && res.getAllErrorInfo().size() > 0) {
+            List<OperateErrorInfo> list = res.getAllErrorInfo();
+            list.stream().forEach((p) -> {
+                tips.append(p.getMessage());
+            });
+        }
+
+        return tips;
+    }
+
+    private void doRevoke(DynamicObject[] bills) {
+        DynamicObject bill = bills[0];
+        DynamicObjectCollection historyEntities = bill.getDynamicObjectCollection("nckd_historyentry");
+
+        if (historyEntities.size() != 0) {
+            Optional<DynamicObject> optional = historyEntities.stream().max(Comparator.comparing((e) -> {
+                return e.getDate("nckd_changetime");
+            }));
+            Date maxDate;
+            if (optional.isPresent()) {
+                maxDate = new Date(((DynamicObject)optional.get()).getDate("nckd_changetime").getTime());
+            } else {
+                maxDate = new Date(((DynamicObject)historyEntities.get(0)).getDate("nckd_changetime").getTime());
+            }
+
+            List<DynamicObject> upToDates = (List)historyEntities.stream().filter((v) -> {
+                return v.getDate("nckd_changetime").compareTo(maxDate) == 0;
+            }).collect(Collectors.toList());
+
+            if(upToDates.size() > 0){
+                DynamicObject upToDate = upToDates.get(0);
+
+                bill.set("vehiclecity", upToDate.getDynamicObject("nckd_historycity"));
+                bill.set("startdate", upToDate.getDate("nckd_historystartdate"));
+                bill.set("enddate", upToDate.getDate("nckd_historyenddate"));
+            }
+            bill.set("billstatus", "B");
+
+            historyEntities.removeAll(upToDates);
+        }
+    }
+
+    protected void addDailyVehicleInvokeValidator(AddValidatorsEventArgs e) {
+        e.addValidator(new DailyVehicleInfoInvokeValiator());
+    }
+
+    private static class DailyVehicleInfoInvokeValiator extends AbstractValidator {
+        private DailyVehicleInfoInvokeValiator() {
+        }
+
+        public void validate() {
+            ExtendedDataEntity[] dataEntities = this.getDataEntities();
+            ExtendedDataEntity[] var2 = dataEntities;
+            int var3 = dataEntities.length;
+
+            for(int var4 = 0; var4 < var3; ++var4) {
+                ExtendedDataEntity dataEntity = var2[var4];
+                DynamicObject billObj = dataEntity.getDataEntity();
+
+                if (!billObj.getString("billstatus").equals(ErBillStatusEnum.A.name())) {
+                    this.addErrorMessage(dataEntity, ResManager.loadKDString("只有单据状态为“暂存”的单据才允许撤销变更。", "TripEntryInfoRevokeOP_1", "fi-er-opplugin", new Object[0]));
+                }
+
+            }
+
+        }
+    }
+}

+ 113 - 0
code/jyyy/nckd-jimin-jyyy-fi/src/main/java/nckd/jimin/jyyy/fi/plugin/operate/DailyVehicleBillUnAuditOpPlugin.java

@@ -0,0 +1,113 @@
+package nckd.jimin.jyyy.fi.plugin.operate;
+
+import kd.bos.dataentity.entity.DynamicObject;
+import kd.bos.dataentity.entity.DynamicObjectCollection;
+import kd.bos.dataentity.resource.ResManager;
+import kd.bos.entity.ExtendedDataEntity;
+import kd.bos.entity.plugin.AbstractOperationServicePlugIn;
+import kd.bos.entity.plugin.AddValidatorsEventArgs;
+import kd.bos.entity.plugin.PreparePropertysEventArgs;
+import kd.bos.entity.plugin.args.EndOperationTransactionArgs;
+import kd.bos.entity.validate.AbstractValidator;
+import kd.bos.logging.Log;
+import kd.bos.logging.LogFactory;
+import kd.bos.servicehelper.operation.SaveServiceHelper;
+import kd.fi.er.common.ErBillStatusEnum;
+import java.util.*;
+
+/**
+ * 外办申请单,变更行程
+ */
+public class DailyVehicleBillUnAuditOpPlugin extends AbstractOperationServicePlugIn {
+    private static final Log logger = LogFactory.getLog(DailyVehicleBillUnAuditOpPlugin.class);
+
+    public void onPreparePropertys(PreparePropertysEventArgs e) {
+        super.onPreparePropertys(e);
+
+        List<String> fieldKeys = e.getFieldKeys();
+
+        fieldKeys.add("applier");
+        fieldKeys.add("startdate");
+        fieldKeys.add("enddate");
+        fieldKeys.add("nckd_ischange");
+        fieldKeys.add("vehiclecity");
+    }
+
+    public void onAddValidators(AddValidatorsEventArgs e) {
+        this.addDailyVehicleChangeValidator(e);
+    }
+
+    public void endOperationTransaction(EndOperationTransactionArgs e) {
+        DynamicObject[] bills = e.getDataEntities();
+        if (bills.length > 0) {
+            this.billsEntryChange(bills);
+            SaveServiceHelper.save(bills);
+        }
+    }
+
+    protected void billsEntryChange(DynamicObject[] bills) {
+        DynamicObject[] var2 = bills;
+        int var3 = bills.length;
+
+        for(int var4 = 0; var4 < var3; ++var4) {
+            DynamicObject bill = var2[var4];
+            bill.set("nckd_ischange", Boolean.TRUE);
+
+            this.addTripEntryHistory(bill);
+        }
+    }
+
+    protected void addTripEntryHistory(DynamicObject bill) {
+        DynamicObjectCollection historyColl = bill.getDynamicObjectCollection("nckd_historyentry");
+        Date changeDate = new Date();
+        int seq = historyColl.size() + 1;
+
+        DynamicObject newHistory = historyColl.addNew();
+
+//        newHistory.set("seq", seq);
+        newHistory.set("nckd_changetime", changeDate);
+
+        Map<String, String> historyMapping = new HashMap();
+        historyMapping.put("nckd_historycity", "vehiclecity");
+        historyMapping.put("nckd_historystartdate", "startdate");
+        historyMapping.put("nckd_historyenddate", "enddate");
+
+
+        Iterator var10 = historyMapping.entrySet().iterator();
+        while(var10.hasNext()) {
+            Map.Entry<String, String> mappingEntry = (Map.Entry)var10.next();
+            String mappingKey = (String)mappingEntry.getKey();
+            String value = (String)mappingEntry.getValue();
+
+            newHistory.set(mappingKey, bill.get(value));
+        }
+    }
+
+    protected void addDailyVehicleChangeValidator(AddValidatorsEventArgs e) {
+        e.addValidator(new DailyVehicleInfoChangeValiator());
+    }
+
+    private static class DailyVehicleInfoChangeValiator extends AbstractValidator {
+        private DailyVehicleInfoChangeValiator() {
+        }
+
+        public void validate() {
+            ExtendedDataEntity[] dataEntities = this.getDataEntities();
+            ExtendedDataEntity[] var2 = dataEntities;
+            int var3 = dataEntities.length;
+
+            for(int var4 = 0; var4 < var3; ++var4) {
+                ExtendedDataEntity dataEntity = var2[var4];
+                DynamicObject billObj = dataEntity.getDataEntity();
+
+                if (!billObj.getString("billstatus").equals(ErBillStatusEnum.E.name())) {
+                    this.addErrorMessage(dataEntity, ResManager.loadKDString("只有审核通过的出差申请单才能变更。", "TripEntryInfoChangeOP_1", "fi-er-opplugin", new Object[0]));
+                }
+//                else if (billObj.getInt("reimbursetime") > 0) {
+//                    this.addErrorMessage(dataEntity, ResManager.loadKDString("出差申请单已经报销,不能变更。", "TripEntryInfoChangeOP_2", "fi-er-opplugin", new Object[0]));
+//                }
+            }
+
+        }
+    }
+}

+ 76 - 0
code/jyyy/nckd-jimin-jyyy-fi/src/main/java/nckd/jimin/jyyy/fi/plugin/operate/SyncReqBillToTripExtOpPlugin.java

@@ -0,0 +1,76 @@
+package nckd.jimin.jyyy.fi.plugin.operate;
+
+import kd.bos.dataentity.entity.DynamicObject;
+import kd.bos.dataentity.metadata.IDataEntityType;
+import kd.bos.entity.BillEntityType;
+import kd.bos.entity.plugin.PreparePropertysEventArgs;
+import kd.bos.entity.plugin.args.AfterOperationArgs;
+import kd.bos.entity.plugin.args.InitOperationArgs;
+import kd.bos.logging.Log;
+import kd.bos.logging.LogFactory;
+import kd.fi.er.opplugin.trip.dailybiz.SyncReqBillToTripOp;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 同步商旅,继承标准的插件。
+ */
+public class SyncReqBillToTripExtOpPlugin extends SyncReqBillToTripOp {
+    private static final Log logger = LogFactory.getLog(SyncReqBillToTripExtOpPlugin.class);
+    private String key_entityNumber;
+    private String key_operateKey;
+
+    @Override
+    public void initialize(InitOperationArgs e) {
+        super.initialize(e);
+
+        IDataEntityType entityType = this.billEntityType;
+        BillEntityType mainType = null;
+        if (entityType instanceof BillEntityType) {
+            mainType = (BillEntityType)entityType;
+        }
+
+        if (mainType != null) {
+            this.key_entityNumber = mainType.getName();
+        }
+
+        Map<String, Object> opParameter = this.operateMeta;
+        if (opParameter != null && opParameter.get("key") != null) {
+            this.key_operateKey = (String)opParameter.get("key");
+        }
+
+        logger.info("商旅集成,申请单同步,业务单据是:" + this.key_entityNumber + ", 业务操作是:" + this.key_operateKey);
+    }
+
+    @Override
+    public void onPreparePropertys(PreparePropertysEventArgs e) {
+        super.onPreparePropertys(e);
+
+        List<String> fieldKeys = e.getFieldKeys();
+
+        switch (this.key_entityNumber) {
+            case "er_dailyvehiclebill":
+                fieldKeys.add("nckd_ischange");
+                break;
+        }
+    }
+
+    @Override
+    public void afterExecuteOperationTransaction(AfterOperationArgs e) {
+
+        if("er_dailyvehiclebill".equals(this.key_entityNumber)){
+            DynamicObject[] datas = e.getDataEntities();
+
+            for(int i = 0; i < datas.length; i++) {
+                DynamicObject dynamicObject = datas[i];
+
+                //如果是变更过的就不同步到商旅
+                if(!dynamicObject.getBoolean("nckd_ischange")) {
+                    super.afterExecuteOperationTransaction(e);
+                }
+            }
+        } else {
+            super.afterExecuteOperationTransaction(e);
+        }
+    }
+}