当前位置:网站首页>自定义组件,并在组件中注入自定义组件实现多种场景的下的组件切换
自定义组件,并在组件中注入自定义组件实现多种场景的下的组件切换
2022-08-04 17:13:00 【合格的程序员】
场景:
表单有多种,例如加班、出差、费用申请等,对表单做审批动作时,包含同意、驳回、关闭等操作,所以同一个审批动作必须只有一个入口。
但是:
不同表单在审批时业务不一样,例如,加班表单,在提交加班申请后需要计算加班时长;
出差表单在提交后需要计算出差天数;
显然加班时长和出差天数的字段是不同的,并且需要保存的数据库表也是不同的。
所以:
- 我们可以定义加班套件service、出差套件service
interface FormDataPlugin {
fun delete(data: FormData)
fun processData(data: FormData, form: Form, definition: FormDefinition): ProcessResult
}
// 加班service实现类
@Component
class OvertimeWorkPlugin : FormDataPlugin {
@Autowired
lateinit var repository: OvertimeWorkRepository
@Autowired
private lateinit var checkInRuleRepository: UserCheckInRuleRepository
override fun delete(data: FormData) {
repository.deleteById(data.id)
}
override fun processData(data: FormData, form: Form, definition: FormDefinition): ProcessResult {
val field = definition.children.find { it.componentName == FormFieldType.OvertimeWorkSuit }
if (field != null) {
val formFieldValue = data.value[field.props.id]
val overtime = formFieldValue!! as HrOvertimeWork
overtime.ownerId = getCurrentUser().id
overtime.createTime = Date()
overtime.id = data.id
overtime.state = data.state
validate(overtime)
overtime.duration = getCurrentUserOvertimeWorkDuration(overtime.ownerId!!, overtime.begin!!, overtime.end!!)
if (repository.existsById(overtime.id)) {
repository.updateById(
overtime.id, Update.update(HrOvertimeWork.Q.reason, overtime.reason)
.set(HrOvertimeWork.Q.state, overtime.state)
.set(HrOvertimeWork.Q.begin, overtime.begin)
.set(HrOvertimeWork.Q.end, overtime.end)
.set(HrOvertimeWork.Q.overtimeType, overtime.overtimeType)
.set(HrOvertimeWork.Q.duration, getCurrentUserOvertimeWorkDuration(overtime.ownerId!!, overtime.begin!!, overtime.end!!))
)
} else {
repository.save(overtime)
}
}
return ProcessResult()
}
// 出差service实现类
@Component
class TravelPlugin : FormDataPlugin {
@Autowired
lateinit var travelRepository: TravelRepository
override fun delete(data: FormData) {
travelRepository.deleteById(data.id)
}
override fun processData(data: FormData, form: Form, definition: FormDefinition): ProcessResult {
val field = definition.children.find { it.componentName == FormFieldType.TravelSuit }
// 如果添加了出差套件
if (field != null) {
val formFieldValue = data.value[field.props.id]
val travel: HrTravel = formFieldValue!! as HrTravel
travel.id = data.id
travel.state = data.state
travel.ownerId = getCurrentUser().id
validateDate(travel.begin, travel.end)
travel.travelDays = getWorkDaysByDateInterval(travel.begin!!, travel.end!!)
if (travelRepository.existsById(travel.id)) {
travelRepository.updateById(
travel.id, Update.update(HrTravel.Q.reason, travel.reason)
.set(HrTravel.Q.state, travel.state)
.set(HrTravel.Q.begin, travel.begin)
.set(HrTravel.Q.end, travel.end)
.set(HrTravel.Q.fromCityId, travel.fromCityId)
.set(HrTravel.Q.destinationCityId, travel.destinationCityId)
.set(HrTravel.Q.vehicleId, travel.vehicleId)
.set(HrTravel.Q.travelDays, travel.travelDays)
)
} else {
travelRepository.save(travel)
}
}
return ProcessResult()
}
}
}
此时定义好了加班和出差套件service,审批表单的入口service如下
@Service
@ScheduleCallable(name = "审批表单")
class FormDataServiceImpl : FormDataService {
// 这里是关键,使用Spring的自动注入,将 FormDataPlugin 的实现类全部注入进来
@Autowired(required = false)
private var formDataPlugins: List<FormDataPlugin> = listOf()
// 审批同意、驳回等操作时,遍历我们的套件,执行处理
override fun agree(vo: HandlingOpinionsVO, user: DetailsUser) {
formDataLockService.doWithWriteLock(vo.formDataId) {
val formData = repository.findById(vo.formDataId).get()
mergeFormData(formData, vo.value)
commonDataService.doAgree(formData, vo, user)
doUpdate(formData, vo)
if (formData.dataType == FormDataSubmitType.NormalSubmission) {
formDataPlugins.forEach { plugin ->
plugin.updateState(formData)
}
}
}
}
}
以上代码只做思路记录,为设计表单功能时提供参考
边栏推荐
猜你喜欢
开发一套高容错分布式系统
浅谈运用低代码技术如何实现物流企业的降本增效
海报 | 夏季高温,危化品安全风险的注意事项必须get!
LeetCode Question of the Day - 1403. Minimum Subsequence in Non-Increasing Order
智慧场馆的功能有哪些
】 【 LeetCode daily one problem - 540. The order of a single element of the array
麒麟信安石勇博士荣获openEuler社区年度开源贡献之星
不需要服务器,教你仅用30行代码搞定实时健康码识别
WEB 渗透之SSTI 模板注入
win11如何退出安全模式
随机推荐
安装win11提示开启安全模式如何解决
小满nestjs(第一章 介绍nestjs)
R语言缺失时间序列的填充及合并:补齐时间序列数据中所有缺失的时间索引、使用merge函数合并日期补齐之后的时间序列数据和另外一个时间序列数据(补齐左侧数据)
浅谈运用低代码技术如何实现物流企业的降本增效
在VMD上可视化hdf5格式的分子轨迹文件
R语言ggpubr包的ggtexttable函数可视化表格数据(直接绘制表格图或者在图像中添加表格数据)、使用ggarrange函数将表格数据和可视化图像组合起来(表格数据在可视化图像下方)
yarn detailed introductory tutorial
WEB 渗透之XXE&XML
全球电子产品需求萎靡:三星越南工厂大幅压缩产能,减少工人工作日
LeetCode Question of the Day - 1403. Minimum Subsequence in Non-Increasing Order
Json的FastJson与Jackson
dotnet core 隐藏控制台
化学制品制造业数智化供应链管理系统:打造智慧供应体系,赋能企业产效提升
力拓信创生态,博睿数据多款产品获得东方通与达梦数据库产品兼容互认证明
要有遥不可及的梦想,也要有脚踏实地的本事
正则过滤字符串中 script 标签
mysql学习笔记——利用动态SQL和Session变量实现一个公式或者计算器
服装店如何利用好积分?
R语言使用cov函数计算矩阵或者dataframe数据变量之间的协方差、cor函数计算相关性、cor函数通过method参数指定相关性、相关性计算方法Pearson,Spearman, Kendall
华硕win11安全启动如何开启