package com.yonyou.ucf.mdf.sample.bill.plugin;
import com.yonyou.iuap.log.exception.BusinessException;
import com.yonyou.ucf.mdd.ext.dao.meta.MetaDaoHelper;
import com.yonyou.ucf.mdf.sample.bill.entity.EmployeeTravelApplication;
import com.yonyou.ypd.bill.annotation.BillPlugin;
import com.yonyou.ypd.bill.context.YpdBillContext;
import com.yonyou.ypd.bill.plugin.AbstractBillPlugin;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.CollectionUtils;
import java.time.LocalDate;
import java.util.List;
import java.util.Map;
@Slf4j
@BillPlugin(busiObj = "employeeTravelApplication") //员工旅游信息表
public class EmployeeTravelApplicationPlugin extends AbstractBillPlugin {
@Override
public void beforeSave(YpdBillContext billContext) throws Exception {
// 设置保存前的校验规则
// 设置自定义档案,获取当前旅游时间段
EmployeeTravelApplication billDO = (EmployeeTravelApplication)billContext.getBillDO();
//EmployeeTravelApplication这个是
int year = LocalDate.now().getYear();//拿到当前时间
// 获取自定义档案维护的信息
String docSql = " select bcd.id,bcd.name,bcd.code from\n" +
" iuap_apdoc_basedoc.bd_cust_doc_def bcdd " +
" left join iuap_apdoc_basedoc.bd_cust_doc bcd on bcdd.id = bcd.custdocdefid " +
" where bcd.dr=0 and bcd.enable=1 and bcd.code='"+year+"' and bcdd.code='traveltimeperiod' and bcdd.ytenant_id='avhwpwua' and bcd.ytenant_id='avhwpwua' ";
//到这就算拿到自定义档案信息了
List<Map<String, Object>> info = MetaDaoHelper.selectSql(docSql, null);
//执行后拿到info,
if(CollectionUtils.isNotEmpty(info)){
Map<String, Object> infoMap = info.get(0);
String name = (String)infoMap.get("name");
String[] dateArr = name.split(",");
//例如:如果 name 是 "2024,2024",分割后 dateArr[0] = "2024",dateArr[1] = "2024"(分别表示时间段的开始年份和结束年份)//
String startDate = dateArr[0]+"-01-01";
String endDate = dateArr[1]+"-12-31";
String employee = billDO.getEmployee();
// 这个员工中审批中和审批通过的数据
String sqlcount ="select count(*) countNum from xlx001_db.t_employeetravelapplication where dr=0 and ytenant_id='avhwpwua' and DATE_FORMAT(create_time,'%Y-%m-%d') >='"+startDate+"'\n" +
"and DATE_FORMAT(create_time,'%Y-%m-%d') <='"+endDate+"' and verifystate in (1,2) and employee='"+employee+"' ";
List<Map<String, Object>> countList = MetaDaoHelper.selectSql(sqlcount, null);
if(CollectionUtils.isNotEmpty(countList)){
Long countNum = (Long)countList.get(0).get("countNum");
if(countNum>=1){
throw new BusinessException("您好,您已参与过本轮旅游,本次暂无法安排,谢理解~");
}
}
}
}
}
这个地方如果有问题提示给前端直接用异常抛出即可
throw new BusinessException("您好,您已参与过本轮旅游,本次暂无法安排,谢理解~");
这个也是继承了AbstractBillPlugin ,里面有很多接口,比如before,after等等
YpdBillContext billContext 参数 billContext 这个
过 billContext.getBillDO() 可以获取当前操作的单据数据对象(Bill Data Object),也就是代码中的 EmployeeTravelApplication 实体。这个对象包含了表单中填写的所有业务数据(如 employee 员工信息、行程信息等),是插件获取业务数据的主要入口。
billDO的作用:
通过这个方法拿到的 BillDO 对象(在你的代码中是 EmployeeTravelApplication 实例),包含了该单据的所有字段值。例如:
java
运行
// 获取当前旅游申请单据的全部数据
EmployeeTravelApplication billDO = (EmployeeTravelApplication) billContext.getBillDO();
// 从单据数据中提取具体字段(如员工ID、申请日期等)
String employeeId = billDO.getEmployee();
LocalDate applyDate = billDO.getApplyDate();
可以理解为:getBillDO() 帮你把前端提交的表单数据,或数据库中读取的单据数据,转换成了一个可直接操作的 Java 对象。
修改单据数据
拿到 BillDO 对象后,不仅可以读取字段值,还能修改它的字段(在保存前的插件中修改会生效)。例如:
java
运行
billDO.setApplyStatus("待部门审批"); // 修改单据状态
billDO.setUpdateTime(new Date()); // 更新修改时间
这些修改会被框架自动同步到底层数据存储(如数据库)。
适配不同单据类型
框架中所有单据(如请假单、报销单、旅游申请单)的处理逻辑都依赖这个方法,它会根据当前操作的单据类型(如你的 employeeTravelApplication),返回对应的具体 BillDO 实现类,保证类型匹配。
ectionUtils(Apache Commons Collections 工具类)主要用于操作 java.util.Collection 接口的所有实现类,覆盖了 Java 中绝大多数常用集合类型,但并非 “所有集合”(有特定范围)。
具体可操作的集合类型:
只要是实现了 java.util.Collection 接口的集合,都可以用 CollectionUtils 操作,包括:
- List 系列:
ArrayList、LinkedList、Vector等 - Set 系列:
HashSet、TreeSet、LinkedHashSet等 - 队列 / 栈:
ArrayDeque、PriorityQueue等(它们也实现了Collection) - 其他自定义集合:只要自定义类实现了
Collection接口,就能被支持
不适用的情况:
CollectionUtils 不能直接操作 非 Collection 接口的容器类,例如:
- Map 系列(
HashMap、TreeMap等):Map不继承Collection,需用专门的MapUtils工具类处理。 - 数组(
int[]、String[]等):数组不是Collection实现类,需用ArrayUtils工具类。 - 特殊容器:如
String(本质是字符序列)、Enumeration等,需用对应工具类。