|
|
@@ -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;
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+}
|