diff --git a/code/zcdev/zcgj-zcdev-zcdev-fs/src/main/java/zcgj/zcdev/zcdev/fs/plugin/operate/DailInvoiceOverdueRemindersOp.java b/code/zcdev/zcgj-zcdev-zcdev-fs/src/main/java/zcgj/zcdev/zcdev/fs/plugin/operate/DailInvoiceOverdueRemindersOp.java new file mode 100644 index 0000000..7af25b0 --- /dev/null +++ b/code/zcdev/zcgj-zcdev-zcdev-fs/src/main/java/zcgj/zcdev/zcdev/fs/plugin/operate/DailInvoiceOverdueRemindersOp.java @@ -0,0 +1,166 @@ +package zcgj.zcdev.zcdev.fs.plugin.operate; + +import kd.bos.algo.DataSet; +import kd.bos.context.RequestContext; +import kd.bos.dataentity.entity.DynamicObject; +import kd.bos.dataentity.entity.DynamicObjectCollection; +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.validate.AbstractValidator; +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.user.UserServiceHelper; +import zcgj.zcdev.zcdev.fs.utils.OrgCheckUtils; + +import java.text.SimpleDateFormat; +import java.time.LocalDate; +import java.time.ZoneId; +import java.time.temporal.ChronoUnit; +import java.util.*; + +/** + * 费用报销单 发票延迟报销校验 + */ +public class DailInvoiceOverdueRemindersOp extends AbstractOperationServicePlugIn { + + @Override + public void onPreparePropertys(PreparePropertysEventArgs e) { + super.onPreparePropertys(e); + e.getFieldKeys().add("invoiceentry"); + //e.getFieldKeys().add("zcgj_entryentity"); + e.getFieldKeys().add("zcgj_attachmentcount_cq"); + e.getFieldKeys().add("zcgj_is_cq"); + e.getFieldKeys().add("costcompany"); + e.getFieldKeys().add("expenseentryentity"); + e.getFieldKeys().add("applier"); + + } + + @Override + public void onAddValidators(AddValidatorsEventArgs e) { + super.onAddValidators(e); + Long currentUserId = UserServiceHelper.getCurrentUserId(); + // 当前用户所属组织 + Long mainOrgId = UserServiceHelper.getUserMainOrgId(currentUserId); + //当前切换选择的组织 + Long currentOrgId = RequestContext.get().getOrgId(); + //当前所在的组织是属于矿山下的 + if(OrgCheckUtils.isKS(currentOrgId)){ + e.getValidators().add(new DailInvoiceOverdueRemindersOp.ValidatorExt()); + } + } + + class ValidatorExt extends AbstractValidator { + @Override + public void validate() { + SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy"); + ExtendedDataEntity[] extendedDataEntities = this.getDataEntities(); + int i =0; + Map> allMap = new HashMap<>(); + //当前提交的探亲单据id集合 + Map> currentBillIdListMap = new HashMap<>(); + //日常费用 FYXM002 + //业务招待费 FYXM002.007 + String rcNumber = "FYXM002"; + + String rcYwNumber = "FYXM002.007"; + for (ExtendedDataEntity extendedDataEntity : extendedDataEntities) { + DynamicObject dataEntity = extendedDataEntity.getDataEntity(); + long aLong = dataEntity.getLong("id"); + //获取报销人 + DynamicObject applier = dataEntity.getDynamicObject("applier"); + long applierId = applier.getLong("id"); + Object costcompanyObj = dataEntity.get("costcompany"); + int attachmentcountCq = dataEntity.getInt("zcgj_attachmentcount_cq"); //超期附件数 + boolean isCq = dataEntity.getBoolean("zcgj_is_cq"); //超期附件数 + + if(costcompanyObj!=null){ + DynamicObject costcompany = (DynamicObject)costcompanyObj; + long costcompanyId = costcompany.getLong("id"); + if(OrgCheckUtils.isKS(costcompanyId)){ + DynamicObjectCollection expenseentryentity = dataEntity.getDynamicObjectCollection("expenseentryentity");//费用明细 + //1.判断费用项目中是否有包含日常费用的 + boolean rc = false; + boolean yw = false; + for (DynamicObject dynamicObject : expenseentryentity) { + DynamicObject expenseitem = dynamicObject.getDynamicObject("expenseitem"); + if(expenseitem!=null){ + String itemNumber = expenseitem.getString("number"); + if(itemNumber.startsWith(rcNumber)){ + rc = true; + if(itemNumber.startsWith(rcYwNumber)){//如果有业务招待费报销 + yw = true; + } + } + } + } + DynamicObject[] load = null; + if(yw){//如果是业务招待费报销,则需要判断是不是领导 + QFilter[] filterArray = new QFilter[2]; + //查询申请人下的今年的探亲差旅单据 + filterArray[0] = new QFilter("zcgj_leadership.id", QCP.equals, applierId); + filterArray[1] = new QFilter("zcgj_is_latency", QCP.equals, true); + load = BusinessDataServiceHelper.load("zcgj_leadership_config", + "id", + filterArray); + /*dateSet = QueryServiceHelper.queryDataSet( + this.getClass().getName(), + "zcgj_leadership_config", + "id", + filterArray, null + );*/ + } + if((load == null || load.length == 0)&& rc){ //如果不是领导,或领导的延迟报销未开启,则进行延时校验 + // DynamicObjectCollection entryentity = dataEntity.getDynamicObjectCollection("zcgj_entryentity");//oa流程分录 + DynamicObjectCollection entryentity = dataEntity.getDynamicObjectCollection("invoiceentry");//发票信息 + List dateList = new ArrayList<>(); + for (DynamicObject dynamicObject : entryentity) { + Date invoicedate = dynamicObject.getDate("invoicedate"); + //Date invoicedate = dynamicObject.getDate("zcgj_invoicedate"); + if(invoicedate!=null){ + dateList.add(dateToLocalDate(invoicedate)); + } + } + // 找到最大的日期 + LocalDate maxDate = dateList.stream() + .max(LocalDate::compareTo) + .orElse(null); + if (maxDate != null) { + // 获取当前日期 + LocalDate currentDate = LocalDate.now(); + // 计算最大日期与当前日期之间的天数差 + long daysBetween = ChronoUnit.DAYS.between(maxDate, currentDate); + // 判断是否超过90天 + if (daysBetween > 30 &&( + !isCq || attachmentcountCq == 0)) { + if(yw){ //如果是业务招待,则进行强控 + this.addFatalErrorMessage(extendedDataEntity, "本次报销已上传最近的发票日期与当前日期相隔超30天,请勾选超期报销,并上传超期说明附件!"); + }else{//如果是日常费用的其他的项目,则只进行提醒 + this.addWarningMessage(extendedDataEntity, "请注意:本次报销已上传最近的发票日期与当前日期相隔超30天。"); + } + + } + } + } + } + } + } + } + } + + /** + * 将 java.util.Date 转换为 java.time.LocalDate + * @param date java.util.Date + * @return java.time.LocalDate + */ + public static LocalDate dateToLocalDate(Date date) { + return date.toInstant() + .atZone(ZoneId.systemDefault()) + .toLocalDate(); + } + +} diff --git a/code/zcdev/zcgj-zcdev-zcdev-fs/src/main/java/zcgj/zcdev/zcdev/fs/plugin/operate/TravelInvoiceOverdueRemindersOp.java b/code/zcdev/zcgj-zcdev-zcdev-fs/src/main/java/zcgj/zcdev/zcdev/fs/plugin/operate/TravelInvoiceOverdueRemindersOp.java new file mode 100644 index 0000000..5282222 --- /dev/null +++ b/code/zcdev/zcgj-zcdev-zcdev-fs/src/main/java/zcgj/zcdev/zcdev/fs/plugin/operate/TravelInvoiceOverdueRemindersOp.java @@ -0,0 +1,131 @@ +package zcgj.zcdev.zcdev.fs.plugin.operate; + +import kd.bos.context.RequestContext; +import kd.bos.dataentity.entity.DynamicObject; +import kd.bos.dataentity.entity.DynamicObjectCollection; +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.validate.AbstractValidator; +import kd.bos.orm.query.QCP; +import kd.bos.orm.query.QFilter; +import kd.bos.servicehelper.BusinessDataServiceHelper; +import kd.bos.servicehelper.user.UserServiceHelper; +import zcgj.zcdev.zcdev.fs.utils.OrgCheckUtils; + +import java.text.SimpleDateFormat; +import java.time.LocalDate; +import java.time.ZoneId; +import java.time.temporal.ChronoUnit; +import java.util.*; + +/** + * 差旅报销单 发票延迟报销校验 + */ +public class TravelInvoiceOverdueRemindersOp extends AbstractOperationServicePlugIn { + + @Override + public void onPreparePropertys(PreparePropertysEventArgs e) { + super.onPreparePropertys(e); + e.getFieldKeys().add("invoiceentry"); + e.getFieldKeys().add("zcgj_attachmentcount_cq"); + e.getFieldKeys().add("zcgj_is_cq"); + e.getFieldKeys().add("costcompany"); + e.getFieldKeys().add("applier"); + + } + + @Override + public void onAddValidators(AddValidatorsEventArgs e) { + super.onAddValidators(e); + Long currentUserId = UserServiceHelper.getCurrentUserId(); + // 当前用户所属组织 + Long mainOrgId = UserServiceHelper.getUserMainOrgId(currentUserId); + //当前切换选择的组织 + Long currentOrgId = RequestContext.get().getOrgId(); + //当前所在的组织是属于矿山下的 + if(OrgCheckUtils.isKS(currentOrgId)){ + e.getValidators().add(new TravelInvoiceOverdueRemindersOp.ValidatorExt()); + } + } + + class ValidatorExt extends AbstractValidator { + @Override + public void validate() { + SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy"); + ExtendedDataEntity[] extendedDataEntities = this.getDataEntities(); + int i =0; + Map> allMap = new HashMap<>(); + //当前提交的探亲单据id集合 + Map> currentBillIdListMap = new HashMap<>(); + + for (ExtendedDataEntity extendedDataEntity : extendedDataEntities) { + DynamicObject dataEntity = extendedDataEntity.getDataEntity(); + long aLong = dataEntity.getLong("id"); + Object costcompanyObj = dataEntity.get("costcompany"); + int attachmentcountCq = dataEntity.getInt("zcgj_attachmentcount_cq"); //超期附件数 + boolean isCq = dataEntity.getBoolean("zcgj_is_cq"); //超期附件数 + + if(costcompanyObj!=null){ + DynamicObject costcompany = (DynamicObject)costcompanyObj; + long costcompanyId = costcompany.getLong("id"); + if(OrgCheckUtils.isKS(costcompanyId)){ + //获取报销人 + DynamicObject applier = dataEntity.getDynamicObject("applier"); + long applierId = applier.getLong("id"); + QFilter[] filterArray = new QFilter[2]; + //查询申请人下的今年的探亲差旅单据 + filterArray[0] = new QFilter("zcgj_leadership.id", QCP.equals, applierId); + filterArray[1] = new QFilter("zcgj_is_latency", QCP.equals, true); + DynamicObject[] load = BusinessDataServiceHelper.load("zcgj_leadership_config", + "id", + filterArray); + + if(load != null && load.length > 0){ + DynamicObjectCollection entryentity = dataEntity.getDynamicObjectCollection("invoiceentry");//发票信息 + List dateList = new ArrayList<>(); + for (DynamicObject dynamicObject : entryentity) { + Date invoicedate = dynamicObject.getDate("invoicedate"); + if(invoicedate!=null){ + dateList.add(dateToLocalDate(invoicedate)); + } + } + // 找到最大的日期 + LocalDate maxDate = dateList.stream() + .max(LocalDate::compareTo) + .orElse(null); + if (maxDate != null) { + // 获取当前日期 + LocalDate currentDate = LocalDate.now(); + + // 计算最大日期与当前日期之间的时间差 + //Period period = Period.between(maxDate, currentDate); + + // 计算最大日期与当前日期之间的天数差 + long daysBetween = ChronoUnit.DAYS.between(maxDate, currentDate); + // 判断是否超过90天 + if (daysBetween > 30 &&( + !isCq || attachmentcountCq == 0)) { + this.addFatalErrorMessage(extendedDataEntity, "最近发票日期与当前日期相隔超30天,请勾选超期报销,并上传超期说明附件!"); + } + } + } + } + } + } + } + } + + /** + * 将 java.util.Date 转换为 java.time.LocalDate + * @param date java.util.Date + * @return java.time.LocalDate + */ + public static LocalDate dateToLocalDate(Date date) { + return date.toInstant() + .atZone(ZoneId.systemDefault()) + .toLocalDate(); + } + +}