java+ 如何动态配置业务规则组

思路

1. 实现在页面上的动态配置规则组(2张数据表+枚举类+service+impl+action)

2. 从数据库中表staffmoverules(规则明细表)或者staffmovetyperule(规则组表) ,根据传入类型,取出规则编号

3. 根据规则编号反射找到对应的方法名

4. 执行对应方法

1. 页面上实现手工配置

CREATE TABLE `staffmoverules` (
  `rulenumber` int DEFAULT NULL COMMENT '规则组编号',
  `movetype` varchar(50) DEFAULT NULL COMMENT '使用类型',
  `message` varchar(500) DEFAULT NULL COMMENT '规则说明',
  `operationtype` varchar(50) DEFAULT NULL COMMENT '操作类型',
  `createtime` datetime DEFAULT NULL COMMENT '创建时间',
  `creator` varchar(100) DEFAULT NULL COMMENT '创建者',
  `lastermodifier` varchar(100) DEFAULT NULL COMMENT '最近修改人',
  `lastertime` datetime DEFAULT NULL COMMENT '最近修改时间',
  `id` varchar(100) DEFAULT NULL,
  UNIQUE KEY `staffmoverules_rulenumber_IDX` (`rulenumber`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='人员调度规则明细'

CREATE TABLE `staffmovetyperule` (
  `movetype` varchar(50) DEFAULT NULL COMMENT '规则组类型',
  `message` varchar(500) DEFAULT NULL COMMENT '规则说明',
  `createtime` datetime DEFAULT NULL COMMENT '创建时间',
  `creator` varchar(100) DEFAULT NULL COMMENT '创建者',
  `lastermodifier` varchar(100) DEFAULT NULL COMMENT '最近修改人',
  `lastertime` datetime DEFAULT NULL COMMENT '最近修改时间',
  `id` varchar(100) DEFAULT NULL,
  UNIQUE KEY `staffmovetyperule_movetype_IDX` (`movetype`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='人员调度规则组校验'

2. 枚举类

package com.hrs.controller.rules;

public enum StaffMoveRulesEnum {
   //规则组配置数据库里:2张表 //1.配置规则组 、2 具体的规则
    //ehr页面上可以配置 规则组跟 具体规则,设置权限
    //internal recruitmen-- IR 内部招聘,Staff regularization-- SR 转正
    //1XXX--OA,2xxx-IR,3xxx-SR,4xxx-public

    //OA规则
    PROMOTIONA(1001,"OA","晋升提拔","check","promotiona"),
    INTERPERSONALCONNECTIONS(1002,"OA","人脉关系","check","interpersonalConnections"),

    //内招规则
    EDUCATION(2001,"IR","学历","check","education"),

    //人员转正规则
    ALTERNATEDAYS(3001,"SR","调休天数","check","alternatedays"),

    //共有规则
    KINSHIP(4001,"PUBLIC","上下级亲属关系","check","kinship"),
    STAFFINFOUPDATE(4002,"PUBLIC","人员信息更新","update","staffinfoUpdate"),
    DELETESCHEDULINGRECORD(4003,"PUBLIC","删除调度关系","C","deleteSchedulingRecord"),
    REVOCATIONSIGN(4004,"PUBLIC","撤销电子签","revocation","revocationSign"),
    RESOURCEALLOCATIONNOTIFICATION(4005,"PUBLIC","资源配置通知","inform","resourceAllocationNotification");



    public int ruleNumber;//规则编码
    String moveType;//使用类型
    String message;//说明

    String operationType;//操作类型

    String methodName;//方法名

    public int getRuleNumber() {
        return ruleNumber;
    }

    public void setRuleNumber(int ruleNumber) {
        this.ruleNumber = ruleNumber;
    }

    public String getMethodName() {
        return methodName;
    }

    public void setMethodName(String methodName) {
        this.methodName = methodName;
    }



    public String getMoveType() {
        return moveType;
    }

    public void setMoveType(String moveType) {
        this.moveType = moveType;
    }

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }

    public String getOperationType() {
        return operationType;
    }

    public void setOperationType(String operationType) {
        this.operationType = operationType;
    }

    StaffMoveRulesEnum(int ruleNumber, String moveType, String message, String operationType, String methodName) {
        this.ruleNumber = ruleNumber;
        this.moveType = moveType;
        this.message = message;
        this.operationType = operationType;
        this.methodName = methodName;
    }
}

3. service 、impl类

package com.hrs.service;

import org.springframework.stereotype.Service;

@Service
public interface StaffMoveService {
    Object promotiona(Object o);
    Object interpersonalConnections(Object o);
    Object education(Object o);
    Object alternatedays(Object o);
    Object kinship(Object o);
    Object staffinfoUpdate(Object o);
    Object deleteSchedulingRecord(Object o);
    Object revocationSign(Object o);
    Object resourceAllocationNotification(Object o);
}
package com.hrs.service;

import com.hrs.service.StaffMoveService;
import org.springframework.stereotype.Service;

@Service
public class StaffMoveImpl implements StaffMoveService {

    @Override
    public Object promotiona(Object o) {
        return "promotiona:" + o;
    }

    @Override
    public Object interpersonalConnections(Object o) {
        return "interpersonalConnections:" + o;
    }

    @Override
    public Object education(Object o) {
        return "education";
    }

    @Override
    public Object alternatedays(Object o) {
        return "alternatedays:" + o;
    }

    @Override
    public Object kinship(Object o) {
        return "kinship:" + o;
    }

    @Override
    public Object staffinfoUpdate(Object o) {
        return "staffinfoUpdate";
    }

    @Override
    public Object deleteSchedulingRecord(Object o) {
        return "deleteSchedulingRecord";
    }

    @Override
    public Object revocationSign(Object o) {
        return "revocationSign";
    }

    @Override
    public Object resourceAllocationNotification(Object o) {
        return "resourceAllocationNotification";
    }
}

4 action类

package com.hrs.controller.rules;

import com.hrs.entity.ResultVo;
import com.hrs.service.StaffMoveService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;

public class StaffMoveAction {
    StaffMoveService staffMoveService;
    public ResultVo adjust(Object o){
        String type;//从入参中取出
        //1.从数据库中表staffmoverules或者staffmovetyperule 取出规则编号
        //List<Integer> rulesNumber = ucc.adjutst();
        List<Integer> rulesNumber = new ArrayList<>();
        rulesNumber.add(1001);
        rulesNumber.add(1002);
        //2.
        // 根据规则编号找到对应的枚举值
        for (StaffMoveRulesEnum rule : StaffMoveRulesEnum.values()){
                if (rulesNumber.contains(rule.ruleNumber)){
                    // 获取对应的方法名
                    String methodName = rule.getMethodName();
                    // 通过反射执行对应的方法
                    try {
                        Class<?> clazz = staffMoveService.getClass();
                        Method method = clazz.getDeclaredMethod(methodName);
                        Object result = method.invoke(staffMoveService);
                        System.out.println(result);
                    } catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException e) {
                        e.printStackTrace();
                        return ResultVo.failure();
                    }
                }
        }
        return ResultVo.ok("success");
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/160789.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【开源】基于JAVA的快递管理系统

项目编号&#xff1a; S 007 &#xff0c;文末获取源码。 \color{red}{项目编号&#xff1a;S007&#xff0c;文末获取源码。} 项目编号&#xff1a;S007&#xff0c;文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、研究内容2.1 数据中心模块2.2 快递类型模块2.3 快…

YOLOv8-Seg改进:渐近特征金字塔网络(AFPN)

🚀🚀🚀本文改进:AFPN通过融合两个相邻的Low-Level特征来启动的,并渐进地将High-Level特征纳入融合过程,提升分割能力。 🚀🚀🚀AFPN小目标分割首选,暴力涨点 🚀🚀🚀YOLOv8-seg创新专栏:http://t.csdnimg.cn/KLSdv 学姐带你学习YOLOv8,从入门到创新,轻…

c++中的String

文章目录 String定义对象的方式成员函数operatorbegin/endsizecapacityreserversizeoperator/append/push_backoperator[]/at String String是一个类模版&#xff0c;可以定义一个字符/字符串对象。 字符顺序表 定义对象的方式 定义方式有很多重要的就这几种 string s1;stri…

配置环境-insightface-torch

1. 创建环境&#xff1a;conda create -n insightface2 python3.8 2.安装pytorch: 我的cuda 是 11.3 然后进入 pytorch 官网查找对应cuda 版本 pytorch 安装 建议使用 pip # CUDA 11.3 conda install pytorch1.12.1 torchvision0.13.1 torchaudio0.12.1 cudatoolkit11.3 -…

UE5 C++报错:is not currently enabled for Live Coding

解决办法&#xff1a; 再次打开项目&#xff0c;以此法打开&#xff1a;

贝叶斯AB测试

AB测试是用来评估变更效果的有效方法&#xff0c;但很多时候会运行大量AB测试&#xff0c;如果能够在测试中复用之前测试的结果&#xff0c;将有效提升AB测试的效率和有效性。原文: Bayesian AB Testing[1] 随机实验&#xff0c;又称AB测试&#xff0c;是行业中评估因果效应的既…

Windos操作系统下的Zookeeper安装图文教程

凯哥已经准备好最新版本3.9.1且已经配置好了。既获取到配置好的。 获取到凯哥准备的安装后&#xff0c;只需要修改一下配置。将解压包解压后&#xff0c;找到conf文件&#xff0c;里面有个zoo.cfg配置文件。如下图&#xff1a; 下载后conf文件夹内容 打开zoo.cfg配置文件后&a…

Vue项目

使用vs打开Vue项目 运行&#xff1a; 终端命令&#xff1a; npm run serve初次打开的是App.vue页面 修改服务器端口 vue.config.js const { defineConfig } require(vue/cli-service) module.exports defineConfig({transpileDependencies: true,devServer: { //增…

计算机网络——WLAN简解

1. WLAN的发展历程 ❓ WLAN和WIFI有什么区别。 &#x1f604; 具体来说&#xff0c;WALN是抽象的概念&#xff0c;代表这无线局域网这一类技术&#xff0c;而WIFI则是具体的具体技术标准&#xff0c;虽然在生活中&#xff0c;二者的表现是强相关的&#xff08;因为是使用的wifi…

C_11微机原理

一、单项选择题&#xff08;本大题共 15 小题&#xff0c;每小题 3分&#xff0c;共45分。在每小题给出的四个备选项中&#xff0c;选出一个正确的答案。&#xff09; .EXE 文件产生在&#xff08;&#xff09;之后。 A.汇编 B. 编辑 C.用软件转换 D.连接 2,十进制-61的8位二进…

调整COSWriter解决X-easypdf / PDFBOX生成大量数据时OOM问题

背景 业务需要生成一个15W数据左右的PDF交易报表。希望我们写在一个文件里&#xff0c;不拆分成多个PDF文件。 使用的技术组件 <dependency><groupId>wiki.xsx</groupId><artifactId>x-easypdf-pdfbox</artifactId><version>2.11.10<…

python中的字典

字典&#xff1a; 1.字典是一种可变容器模型&#xff0c;可以存储任意类型的对象&#xff0c;比如字符串&#xff0c;数字&#xff0c;元组等其他容 器模型 形式&#xff1a; d{key1&#xff1a;value1&#xff0c;key2&#xff1a;value2} 解释&#xff1a; 1.其中key1代表一…

如何使用Gitlab搭建属于自己的代码管理平台

大家好&#xff0c;我是Mandy。今天分享的主题内容是如何使用GitLab搭建属于自己的代码管理平台。 为什么会单独分享这篇文章呢&#xff0c;相信在很多的开发同学任职的公司中&#xff0c;都用到了gitlab来做代码管理平台&#xff0c;同时结合GitLab的一些自动化功能&#xff…

智慧能源太阳能光伏数据采集终端钡铼技术4G无线RTU

智慧能源太阳能光伏系统在当今的能源行业中扮演着越来越重要的角色&#xff0c;而钡铼技术有限公司的4G无线RTU&#xff08;远程终端单元&#xff09;作为数据采集终端&#xff0c;为智慧能源太阳能光伏系统的监测和管理提供了全新的解决方案。 首先&#xff0c;钡铼技术的4G无…

Linux基本指令(一)

前言&#xff1a;我们今天换个口味&#xff0c;我们来学习Linux&#xff0c;我们平时电脑上都只使用windows系统&#xff0c;但是作为后来者&#xff0c;Linux有着windows所没有的优点&#xff0c;那么我们今天就来学习Linux的一些基本指令。我会通过Xshell和阿里云云服务器进行…

振南技术干货集:比萨斜塔要倒了,倾斜传感器快来!(5)

注解目录 1、倾斜传感器的那些基础干货 1.1 典型应用场景 &#xff08;危楼、边坡、古建筑都是对倾斜敏感的。&#xff09; 1.2 倾斜传感器的原理 1.2.1 滚珠式倾斜开关 1.2.2 加速度式倾斜传感器 1)直接输出倾角 2)加速度计算倾角 3)倾角精度的提高 &#xff08;如果…

NC65 如何设置现金流量明细查询的查询框中核算账簿可多选??

NC65 如何设置现金流量明细查询的查询框中核算账簿可多选&#xff1f;&#xff1f; NC65 如何设置现金流量明细查询的查询框中核算账簿可多选&#xff1f;&#xff1f;效果如下图 解决方案二开&#xff0c;即在 nc.ui.gl.cashflowcase.CashFlowDetailQueryUI 的 onButtonQuer…

周年纪念篇

一周年纪念&#xff01; 凌晨逛手机版csdn时才突然发现已经错过一周年了&#xff0c;但我当闰年来纪念一下不过分吧hhh 浅浅的整些怀念的东西吧&#xff01; 这是人生第一段代码&#xff1a;不是hello world写不起&#xff0c;而是纯爱单推人更有性价比。 有这段代码在&#x…

【汇编】Loop指令、段前缀

文章目录 前言一、Loop指令1.1 Loop指令是什么&#xff1f;1.2 他的条件是什么&#xff1f;1.3 例子示例1示例2 1.4 要点总结 二、段前缀2.1 为什么要引入他2.2 对策 总结 前言 在计算机编程的世界里&#xff0c;了解底层的硬件操作是提升程序员能力的关键一步。汇编语言作为一…

【用unity实现100个游戏之15】开发一个类保卫萝卜的Unity2D塔防游戏5(附项目源码,完结)

文章目录 最终效果前言简单绘制一下环境显示当前波数生成不同的敌人控制游戏运行速度游戏结束最终效果扩展源码完结最终效果 前言 本期是本项目的最后一篇,主要内容是配置环境、生成不同敌人、结束重开。 简单绘制一下环境 环境可以按自己喜好,去找一些瓦片,想怎么配置怎…