Преглед на файлове

差旅报销单:新增时间重叠校验,费用报销单:新增关账期间校验

Tyx преди 2 седмици
родител
ревизия
9740b9dfce

+ 29 - 0
code/fi/nckd-xtpoc-fi/src/main/java/nckd/xtpoc/fi/app/plugin/operate/DailyReimBurseBillOpPluginEx.java

@@ -0,0 +1,29 @@
+package nckd.xtpoc.fi.app.plugin.operate;
+
+import kd.bos.entity.plugin.AbstractOperationServicePlugIn;
+import kd.bos.entity.plugin.AddValidatorsEventArgs;
+import kd.bos.entity.plugin.PreparePropertysEventArgs;
+import kd.sdk.plugin.Plugin;
+import nckd.xtpoc.fi.app.plugin.validate.DailyReimBurseBillValidator;
+
+/**
+ * Tyx 2025-11-10
+ * 费用报销单+付款单 关账操作处理,绑定【nckd_er_dailyreimburs_ext】的提交、审核、付款操作
+ */
+public class DailyReimBurseBillOpPluginEx extends AbstractOperationServicePlugIn implements Plugin {
+
+    @Override
+    public void onPreparePropertys(PreparePropertysEventArgs e) {
+        super.onPreparePropertys(e);
+    }
+
+    /**
+     * 添加校验器
+     * @param e
+     */
+    @Override
+    public void onAddValidators(AddValidatorsEventArgs e) {
+        super.onAddValidators(e);
+        e.addValidator(new DailyReimBurseBillValidator());
+    }
+}

+ 24 - 0
code/fi/nckd-xtpoc-fi/src/main/java/nckd/xtpoc/fi/app/plugin/operate/TripReimBurseBillSubmitOpPluginEx.java

@@ -0,0 +1,24 @@
+package nckd.xtpoc.fi.app.plugin.operate;
+
+import kd.bos.entity.plugin.AbstractOperationServicePlugIn;
+import kd.bos.entity.plugin.AddValidatorsEventArgs;
+import kd.bos.entity.plugin.PreparePropertysEventArgs;
+import kd.sdk.plugin.Plugin;
+import nckd.xtpoc.fi.app.plugin.validate.TripReimBurseBillValidator;
+
+/**
+ * 单据操作插件
+ */
+public class TripReimBurseBillSubmitOpPluginEx extends AbstractOperationServicePlugIn implements Plugin {
+
+    @Override
+    public void onPreparePropertys(PreparePropertysEventArgs e) {
+        super.onPreparePropertys(e);
+    }
+
+    @Override
+    public void onAddValidators(AddValidatorsEventArgs e) {
+        super.onAddValidators(e);
+        e.addValidator(new TripReimBurseBillValidator());
+    }
+}

+ 44 - 0
code/fi/nckd-xtpoc-fi/src/main/java/nckd/xtpoc/fi/app/plugin/validate/DailyReimBurseBillValidator.java

@@ -0,0 +1,44 @@
+package nckd.xtpoc.fi.app.plugin.validate;
+
+import kd.bos.dataentity.entity.DynamicObject;
+import kd.bos.entity.ExtendedDataEntity;
+import kd.bos.entity.validate.AbstractValidator;
+import kd.bos.orm.query.QCP;
+import kd.bos.orm.query.QFilter;
+import kd.bos.servicehelper.QueryServiceHelper;
+
+import java.util.Date;
+
+/**
+ * Tyx 费用报销单+付款单校验器
+ */
+public class DailyReimBurseBillValidator extends AbstractValidator {
+
+    private static String PERIODCONTROL_ENTITY = "nckd_periodcontrol";
+
+    @Override
+    public void validate() {
+        for (ExtendedDataEntity dataEntity : dataEntities) {
+            DynamicObject bill = dataEntity.getDataEntity();
+            // 申请日期
+            Date bizDate = bill.getDate("bizdate");
+            if(checkPeriod(bizDate)) {
+                String msg = "申请日期所在期间已关账,不允许" + this.getOperationName();
+                this.addErrorMessage(dataEntity, msg);
+            }
+        }
+    }
+
+
+    /**
+     * 根据时间判断是否存在关账的账期管理
+     * @param date
+     * @return
+     */
+    public boolean checkPeriod(Date date) {
+        QFilter filter = new QFilter("nckd_closestatus", QCP.equals, "B");
+        filter.and("nckd_period.begindate", QCP.less_equals, date);
+        filter.and("nckd_period.enddate", QCP.large_equals, date);
+        return QueryServiceHelper.exists(PERIODCONTROL_ENTITY, new QFilter[]{filter});
+    }
+}

+ 100 - 0
code/fi/nckd-xtpoc-fi/src/main/java/nckd/xtpoc/fi/app/plugin/validate/TripReimBurseBillValidator.java

@@ -0,0 +1,100 @@
+package nckd.xtpoc.fi.app.plugin.validate;
+
+import kd.bos.dataentity.entity.DynamicObject;
+import kd.bos.dataentity.entity.DynamicObjectCollection;
+import kd.bos.entity.ExtendedDataEntity;
+import kd.bos.entity.validate.AbstractValidator;
+import kd.bos.orm.query.QCP;
+import kd.bos.orm.query.QFilter;
+import kd.bos.servicehelper.BusinessDataServiceHelper;
+
+import java.math.BigDecimal;
+import java.util.Arrays;
+import java.util.Date;
+import java.util.List;
+import java.util.stream.Collectors;
+
+public class TripReimBurseBillValidator extends AbstractValidator {
+    @Override
+    public void validate() {
+        for (ExtendedDataEntity dataEntity : dataEntities) {
+            DynamicObject bill = dataEntity.getDataEntity();
+            // 当前单据ID
+            Long billId = bill.getLong("id");
+            Long userId = bill.getLong("applier.id");
+            DynamicObjectCollection tripEntryCols = bill.getDynamicObjectCollection("tripentry");
+            for (DynamicObject tripEntry : tripEntryCols) {
+                Date startDate = tripEntry.getDate("startdate");
+                Date endDate = tripEntry.getDate("enddate");
+                String msg = checkDateIsExists(billId, userId, startDate, endDate);
+                if(msg.length() > 0) {
+                    this.addErrorMessage(dataEntity, "存在开始时间、结束时间重叠的单据:" + msg);
+                }
+            }
+        }
+    }
+
+    /**
+     * 校验是否存在时间有交集的差旅报销单
+     * @param billId
+     * @param userId
+     * @param startDate
+     * @param endDate
+     * @return
+     */
+    public static String checkDateIsExists(Long billId, Long userId, Date startDate, Date endDate){
+        String msg = "";
+        String selectFields = "id, billno";
+        String entityName = "er_tripreimbursebill";
+
+        QFilter qFilter = buildSearchFilter(entityName, billId, userId, startDate, endDate);
+        DynamicObject[] tripBillArray = BusinessDataServiceHelper.load(entityName, selectFields, qFilter.toArray());
+
+        String tripBills = "";
+        if(tripBillArray.length > 0){
+            List<String> numberList = (List) Arrays.stream(tripBillArray).map((o) -> {
+                return o.getString("billno");
+            }).collect(Collectors.toList());
+
+            tripBills = String.join(",", numberList);
+        }
+
+        if(tripBills.length() > 0){
+            msg += "差旅报销单:" + tripBills;
+        }
+
+        return msg;
+    }
+
+    public static QFilter buildSearchFilter(String entityName, Long billId, Long userId, Date startDate, Date endDate){
+        String prefix = "";
+        String startField = "startDate";
+        String endField = "endDate";
+
+        QFilter qFilter = new QFilter("id", QCP.not_equals, billId);
+        if("er_tripreimbursebill".equals(entityName)){//出差申请
+            qFilter.and(new QFilter("applier", QCP.equals, userId));
+            //废弃 状态不需要校验
+            qFilter.and(new QFilter("billstatus", QCP.not_equals2, "H"));
+            prefix = "tripentry.";
+        }
+
+        QFilter startFilter = new QFilter(prefix + startField, QCP.less_equals, startDate);
+        startFilter.and(new QFilter(prefix + endField, QCP.large_equals, startDate));
+
+        QFilter endFilter = new QFilter(prefix + startField, QCP.less_equals, endDate);
+        endFilter.and(new QFilter(prefix + endField, QCP.large_equals, endDate));
+
+        QFilter startFilter1 = new QFilter(prefix + startField, QCP.large_equals, startDate);
+        startFilter1.and(new QFilter(prefix + startField, QCP.less_than, endDate));
+
+        QFilter endFilter1 = new QFilter(prefix + endField, QCP.large_equals, startDate);
+        endFilter1.and(new QFilter(prefix + endField, QCP.less_than, endDate));
+
+        qFilter.and(startFilter.or(endFilter).or(startFilter1).or(endFilter1));
+
+        return qFilter;
+    }
+
+
+}