延迟报销发票提醒

This commit is contained in:
zhangzhiguo 2025-03-18 09:56:42 +08:00
parent 75e5298a95
commit 5a5733a843
2 changed files with 297 additions and 0 deletions

View File

@ -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<Long, Map<String,Object>> allMap = new HashMap<>();
//当前提交的探亲单据id集合
Map<Long, List<Long>> 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<LocalDate> 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();
}
}

View File

@ -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<Long, Map<String,Object>> allMap = new HashMap<>();
//当前提交的探亲单据id集合
Map<Long, List<Long>> 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<LocalDate> 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();
}
}