精华内容
下载资源
问答
  • 首先,我们先看来一下,什么是三级等保? 、等保2.0概述 2019年5月13日,国家市场监督管理总局、国家标准化管理委员会发布《信息安全技术 网络安全等级保护基本要求》(GB/T 22239-2019)(“《等保基本要求...

    近期,因为政策的关系,大家对等保比较关注,那么我们今天就来聊一聊等保2.0的那些事。

    首先,我们先看来一下,什么是二、三级等保

    一、等保2.0概述

    2019年5月13日,国家市场监督管理总局、国家标准化管理委员会发布《信息安全技术 网络安全等级保护基本要求》(GB/T 22239-2019)(“《等保基本要求》”)、《信息安全技术 网络安全等级保护测评要求》(GB/T 28448-2019)、《信息安全技术 网络安全等级保护安全设计技术要求》(GB/T 25070-2019)三个网络安全领域的国家标准,共同构筑新时代的网络安全等级保护制度,标志着等保2.0的正式到来,新标准规范将于2019年12月1日开始实施。

    网络安全等级保护制度是国家信息安全保障工作的基础,也是一项事关国家安全、社会稳定的政治任务。通过开展等级保护工作,发现网络和信息系统与国家安全标准之间存在的差距,找到目前系统存在的安全隐患和不足,通过安全整改,提高信息系统的信息安全防护能力,降低系统被各种攻击的风险。网络安全等级保护制度,作为国家网络安全的重要组成部分,对加强国家网络安全保障工作,提升网络安全保护能力具有重要意义。

    云南、昆明二级等保测评,云南、昆明三级等保测评,等保测评方案,熊经理:13669794067,QQ:282222323

    二、为什么要做二、三级等保?

    政策法规

    中华人民共和国网络安全法

    第二十一条

    国家实行网络安全等级保护制度。网络运营者应当按照网络安全等级保护制度的要求,履行下列安全保护义务,保障网络免受干扰、破坏或者未经授权的访问,防止网络数据泄露或者被窃取、篡改 。

    第三十一条

    国家对公共通信和信息服务、能源、交通、水利、金融、公共服务、电子政务等重要行业和领域,以及其他一旦遭到破坏、丧失功能或者数据泄露,在网络安全等级保护制度的基础上,实行重点保护 。

    第五十九条

    网络运营者不履行本法第二十一条、第二十五条规定的网络安全保护义务的,由有关主管部门给予警告;拒不改正或者导致危害网络安全等后果的,处一万元以上十万元以下罚款 。

    三、等保申请流程

    1、系统定级

    (1)协助定级、推荐测评机构(服务方义务)

    (2)业务系统定级,与服务方签订服务合同。

    通用等保测评流程

    信息系统运营单位按照《网络安全等级保护定级指南》,自行定级。三级以上系统定级结论需进行专家评审。

    2、系统备案

    (1)协助客户完成备案(服务方义务)

    (2)提交备案材料

    通用等保测评流程

    信息系统定级申报获得通过后,30日内到公安机关办理备案手续。

    3、建设整改

    (1)提供技术方案建议书、协助整改(服务方义务)

    (2)依据等级保护标准进行安全建设整改

    通用等保测评流程

    根据等保有关规定和标准,对信息系统进行安全建设整改。

    4、等级测评

    (1)协助测评(服务方义务)

    (2)配合测评机构测评,接收报告(项目完结)

    通用等保测评流程

    信息系统运营单位选择公安部认可的第三方等级测评机构进行测评,提供跨地市的情况下由本地(本省)测评机构交付的等保测评服务。

    5、监督检查(项目后)

    (1)技术支持(服务方义务)

    (2)安全运营、维护,保障日常系统合规

    通用等保测评流程

    当地网监定期进行监督检查。

    四、《网络安全等级保护基本要求》关键项分析

    1、安全物理环境

    (1)物理位置选择

    机房场地应选择在具有防震、防风和防雨等能力的建筑内。

    (2)物理访问控制

    机房出入口应配置电子门禁系统,控制、鉴别和记录进入的人员。

    (3)基础设施位置

    应确保云计算基础设施位于中国境内。

    (4)防盗窃和防破坏

    应设置机房防盗报警系统或设置有专人值守的视频监控系统。

    (5)电力供应

    应设置冗余或并行的电力电缆线路为计算机系统供电

    (6)建设策略

    华为云基础设施位于中国境内

    物理和环境安全,直接复用华为云等保测评结论即可。

    2、安全通信网络&区域边界

    (1)网络架构

    根据云租户业务需求自主设置安全策略集,包括定义访问路径、选择安全组件、配置安全策略。

    (2)访问控制

    在不同等级的网络区域边界部署访问控制机制,设置访问控制规则。

    (3)通信传输

    应采用校验码技术或加解密技术保证通信过程中数据的完整性。

    (4)边界防护

    应保证跨越边界的访问和数据流通过边界防护设备提供的受控接口进行通信。

    (5)入侵防范

    应在关键网络节点处检测、防止或限制从外部发起的网络攻击行为;当检测到攻击行为时,记录攻击源IP、攻击类型、攻击目的、攻击时间,在发生严重入侵事件时应提供报警。

    (6)建设策略

    ①、推荐安全组、网络ACL通过设置基本的访问控制策略,对进出安全区域边界的数据信息进行控制,阻止非授权及越权访问。

    ②、推荐VPN、安全证书服务,采取加密措施,防止数据在传输过程中遇到破坏、窃取等各种攻击。

    ③、推荐DDoS高防,云WAF服务,针对日渐增多的DDoS、Web攻击进行防御,精准有效地实现对流量型攻击和应用层攻击的全面防护。

    3、安全计算环境

    (1)身份鉴别

    当进行远程管理时,管理终端和云计算平台边界设备之间建立双向身份验证机制。

    (2)安全审计

    根据云服务方和云租户的职责划分,收集各自控制部分的审计数据并实现集中审计。

    (3)入侵防范

    虚拟机之间的资源隔离失效,并进行告警。

    (4)恶意代码防范

    应能够检测恶意代码感染及在虚拟机间蔓延的情况,并提出告警。

    (5)数据完整性和保密性

    应采用校验码技术或加解密技术保证重要数据在传输/存储过程中的完整性和保密性。

    (6)建设策略

    ①、推荐堡垒机、数据库安全服务对服务器和数据库的运维及操作行为进行审计。

    ②、管理员使用各自的账户进行管理,管理员的权限仅分配其所需的最小权限,在制定好的访问控制策略下进行操作,杜绝越权非法操作。

    ③、推荐主机安全服务,防止各类具有针对性的入侵威胁,发现常见操作系统存在的各种安全漏洞,及时更新恶意代码库。

    4、安全管理中心

    (1)系统管理

    通过安全管理中心对被保护系统和安全管理中心自身的运行状态进行监控。

    (2)审计管理

    通过部署安全管理中心、业务安全审计平台,对被保护系统和安全管理中心的相关重要安全事件和用户操作行为进行审计。

    (3)安全管理

    通过部署安全管理中心、业务安全审计平台,并对安全管理员进行身份鉴别,对主体进行授权,配置可信验证策略等。

    (4)集中管控

    通过部署安全管理中心、业务安全审计平台、APT威胁检测系统,并对分布在网络中的安全设备、网络设备和服务器等的运行状况进行集中监测与管控。

    (5)建设策略

    ①、通过安全事件管理等模块协助实施应急响应机制。

    ②、确保用户行为的可追溯性,及时发现异常的安全行为,同时为综合分析提供数据支撑。

    ③、数据收集、安全策略、恶意代码、补丁升级等安全相关事项和各类安全事件进行集中管理,分析。

    5、安全管理制度

    (1)安全管理制度

    应形成由安全策略、管理制度、操作规程、记录表单等构成的全面的信息安全管理制度体系。

    (2)安全管理机构

    应成立指导和管理信息安全工作的委员会或领导小组,其最高领导由单位主管领导委任或授权。

    (3)安全管理人员

    人员录用、人员离岗、人员考核、安全意识教育及培训、外部人员访问管理。

    (4)安全建设管理

    应根据保护对象的安全保护等级及与其他级别保护对象的关系进行安全整体规划和安全方案设计,并形成配套文件。

    (5)安全运维管理

    ①、应采取必要的措施识别安全漏洞和隐患,对发现的安全漏洞和隐患及时进行修补或评估可能的影响后进行修补。

    ②、应设置冗余或并行的电力电缆线路为计算机系统供电。

    (6)建设策略

    ①、企业应制定完善的安全管理制度,根据基本要求设置安全管理机构,梳理管理文件,明确组织人员的岗位职责,定期进行全面安全检查,特别是系统日常运行、系统漏洞和数据备份等。

    ②、推荐漏洞扫描服务、安全体检服务,检测租户站点的漏洞,提前防范黑客利用漏洞进行攻击,防止利益损失和数据泄露。

    五、我司提供的全栈安全服务 满足等保要求

     

    云南、昆明二级等保测评,云南、昆明三级等保测评,等保测评方案,熊经理:13669794067,QQ:282222323

     

    1、等保合规套餐

    为客户提供多场景的等保合规安全解决方案,满足多行业业务诉求,快速省心过等保。

    2、等保多场景介绍

    (1)等保二级

    适用于用户量和敏感数据较少,如果发生安全问题,不会对企业自身及用户造成特别严重影响,如门户网站。

    (2)等保三级 基础版

    适用于存有用户敏感信息,信息外泄会造成特别严重影响,甚至会对社会秩序和公共利益造成损失的系统,如物流、车联网、物联网。

    (3)等保三级 高级版

    满足高分段等保测评需求,适用于存有用户敏感信息,信息外泄会造成特别严重影响,甚至会对社会秩序和公共利益造成损失的系统,如在线教育、互联网医疗、互联网金融。

    (4)多云模式

    适用于多云业务场景,集中式安全防护及安全运营,如游戏、直播、电商。

    六、等保合规安全解决方案

    云南、昆明二级等保测评,云南、昆明三级等保测评,等保测评方案,熊经理:13669794067,QQ:282222323

     

    1、等保合规架构

    为客户提供一站式安全技术方案,帮助客户快速、低成本完成安全整改,轻松应对等保2.0合规测评。

    2、等保2.0基本要求

    (1)安全物理环境

    主要包括物理位置选择,物理位置访问控制。

    (2)安全通信网络&区域边界

    主要包括网络架构、边界防护、访问控制、通信传输、入侵防范、安全审计。

    (3)安全计算环境

    主要包括身份鉴别、访问控制、安全审计、入侵防范、恶意代码防范、数据完整性和保密性、数据备份恢复。

    (4)安全管理中心

    主要包括系统管理、审计管理、安全管理、集中管控。

    (5)安全管理制度

    主要包括安全策略、安全管理制度与流程规范、人员组织、安全管理基线。

     

    展开全文
  • Spring StateMachine(1) 二级审批流程

    千次阅读 2018-12-04 10:35:30
    个简单的二级审批流程(请假)为例,研究一下 StateMachine 的使用。该流程设计如下: 目标:通过 StateMachine 实现该二级审批流程,提供 API 给第方调用。 状态定义 将流程图上的 5 个状态(不包括开始和...

    以一个简单的二级审批流程(请假)为例,研究一下 StateMachine 的使用。该流程设计如下:

    目标:通过 StateMachine 实现该二级审批流程,提供 API 给第三方调用。

    状态定义

    将流程图上的 5 个状态(不包括开始和结束)定义如下:

    public enum States {
        WAITING_FOR_SUBMIT,             // 等待提交
        WAITING_FOR_TL_APPROVE,         // 等待 TL 审批
        WAITING_FOR_DM_APPROVE,         // 等待 DM 审批
        WAITING_FOR_HR_RECORD,          // 等待 HR 备案
        END,                            // 流程结束
    }
    

    事件

    将流程图上的 6 个事件(不括开始和结束)定义如下:

    public enum Events {
        SUBMIT,   // 提交申请
        TL_AGREE,     // WAITING_FOR_TL_APPROVE 审批
        TL_REJECT,       // WAITING_FOR_TL_APPROVE 驳回
        DM_AGREE,     // 部门经理审批
        DM_REJECT,      // 部门经理驳回
        HR_RECORD,      // WAITING_FOR_HR_RECORD 备案
    }
    

    配置状态机

    主要是配置状态、事件和迁移。

    @Configuration
    @EnableStateMachine
    public class StateMachineConfig extends EnumStateMachineConfigurerAdapter<States, Events> {
    
        @Autowired
        private LeaveStateMachinePersist leaveStateMachinePersist;
    
        @Bean
        public StateMachinePersister<States,Events,String> stateMachinePersist(){
            return new DefaultStateMachinePersister<>(leaveStateMachinePersist);
        }
    
        @Override
        public void configure(StateMachineStateConfigurer<States, Events> states)
                throws Exception {
            states
                .withStates()
                    .initial(States.WAITING_FOR_SUBMIT)
                    .states(EnumSet.allOf(States.class));
        }
    
        @Override
        public void configure(StateMachineTransitionConfigurer<States, Events> transitions)
                throws Exception {
            transitions
                .withExternal()
                    .source(States.WAITING_FOR_SUBMIT).target(States.WAITING_FOR_TL_APPROVE)
                    .event(Events.SUBMIT)
                    .and()
                .withExternal()
                    .source(States.WAITING_FOR_TL_APPROVE).target(States.WAITING_FOR_DM_APPROVE)
                    .event(Events.TL_AGREE)
                    .and()
                .withExternal()
                    .source(States.WAITING_FOR_TL_APPROVE).target(States.WAITING_FOR_SUBMIT)
                    .event(Events.TL_REJECT)
                    .and()
                .withExternal()
                    .source(States.WAITING_FOR_DM_APPROVE).target(States.WAITING_FOR_HR_RECORD)
                    .event(Events.DM_AGREE)
                    .and()
                .withExternal()
                    .source(States.WAITING_FOR_DM_APPROVE).target(States.WAITING_FOR_SUBMIT)
                    .event(Events.DM_REJECT)
                    .and()
                .withExternal()
                    .source(States.WAITING_FOR_HR_RECORD).target(States.END)
                    .event(Events.HR_RECORD);
        }
    

    其中 LeaveStateMachinePersist 是自定义的持久化对象,用于恢复状态机的状态,因为不同的业务对象共用同一个状态机,状态机的状态根据业务 id 来缓存。LeaveStateMachinePersist 目前很简单,仅仅是一个 HashMap 来保存业务 id 和对于的 StateMachineContext:

    @Component
    public class LeaveStateMachinePersist implements StateMachinePersist<States,Events,String> {
    
        // 用 map 来模拟持久化存储,可替换成数据库
        static Map<String, States> cache = new HashMap<>(16);
    
    
        @Override
        public void write(StateMachineContext<States, Events> stateMachineContext, String s) {
            cache.put(s, stateMachineContext.getState());
        }
    
        @Override
        public StateMachineContext<States, Events> read(String s) {
            return cache.containsKey(s) ?
                    new DefaultStateMachineContext<>(cache.get(s),null,null,null,null,"请假流程") :
                    new DefaultStateMachineContext<>(States.WAITING_FOR_SUBMIT,null,null,null,null,"请假流程");
    
        }
    }
    

    控制器

    控制器负责对外提供 RESTFul 接口。有 6 个 RequestMapping,分别执行新建请假条、提交、tl审批、dm审批、hr备案和获取状态机当前状态 6 个操作。

    @RestController
    public class StateMachineController {
    
    
        @Autowired
        private StateMachinePersister<States, Events, String> persister;
    
        @Autowired
        private StateMachine<States, Events> stateMachine;
    
    
        @RequestMapping("/new")
        @ResponseBody
        public BaseResponse newLeave(@RequestBody LeaveRequest leave){
            BaseResponse result = new BaseResponse();
            stateMachine.start();
    
            result.message = "新建请假申请成功";
            result.success = true;
            result.data = leave;
    
            return result;
    
        }
    
        @RequestMapping("/apply")
        @ResponseBody
        public BaseResponse apply(@RequestBody JSONObject params){
            String leaveId = params.getAsString("leaveId");
    
            return sendEvent(Events.SUBMIT,leaveId);
    
        }
    
        @RequestMapping("/tlApprove")
        @ResponseBody
        public BaseResponse tlApprove(@RequestBody JSONObject params) {
    
            String id = params.getAsString("leaveId");
            boolean agree = params.getAsNumber("agree").intValue() != 0;
    
            return sendEvent(agree ? Events.TL_AGREE : Events.TL_REJECT, id);
        }
    
        @RequestMapping("/dmApprove")
        @ResponseBody
        public BaseResponse dmApprove(@RequestBody JSONObject params) {
    
            String id = params.getAsString("leaveId");
            boolean agree = params.getAsNumber("agree").intValue() != 0;
    
            return sendEvent(agree ? Events.DM_AGREE : Events.DM_REJECT, id);
    
        }
    
        @RequestMapping("/hrRecord")
        @ResponseBody
        public BaseResponse hrRecord(@RequestBody JSONObject params) {
    
            String id = params.getAsString("leaveId");
    
            return sendEvent(Events.HR_RECORD,id);
    
        }
    
        @RequestMapping("/getState")
        @ResponseBody
        public BaseResponse getState(@RequestBody JSONObject params){
            String leaveId = params.getAsString("leaveId");
    
            BaseResponse result = new BaseResponse();
    
            try{
                persister.restore(stateMachine,leaveId);
    
                result.success = true;
                States state = stateMachine.getState().getId();
    
                result.data = state;
    
            }catch (Exception e){
                e.printStackTrace();
            }finally {
                stateMachine.stop();
                return result;
            }
    
        }
    
        private BaseResponse sendEvent(Events event,String leaveId){
            BaseResponse result = new BaseResponse();
    
            if(leaveId == null || leaveId.length()==0){
                result.success = false;
                result.message = "leaveId 不能为空";
                return result;
            }
    
            try {
                // 根据业务 id 获取状态
                persister.restore(stateMachine,leaveId);
    
                result.success = stateMachine.sendEvent(event);
                // 持久化状态机
                if (result.success) {
                    persister.persist(stateMachine, leaveId);
                }
                JSONObject data = new JSONObject();
    
                result.message = result.success ? "执行成功":"执行失败";
                result.message = result.message + ",当前状态为:"+stateMachine.getState().getId();
                data.put("leaveId",leaveId);
                data.put("event",event.toString());
                data.put("state",stateMachine.getState().getId());
                result.data = data;
            } catch (Exception e) {
                e.printStackTrace();
                result.message = e.getMessage();
            }finally {
                stateMachine.stop();
                return result;
            }
        }
    
    }
    

    注意 leaveId 是业务 id,代表了一个业务对象(比如请假条 LeaveRequest)。leaveId 是一个 UUID,保证不会重复。

    运行程序,会自动在 8080 端口上运行 tomcat。然后就可以用 postman 调用各个接口进行测试了:

    展开全文
  • 个简单的二级审批流程(请假)为例,研究一下 StateMachine 的使用。该流程设计如下: 目标:通过 StateMachine 实现该二级审批流程,提供 API 给第方调用。 状态定义 将流程图上的 5 个状态(不包括开始和...

    以一个简单的二级审批流程(请假)为例,研究一下 StateMachine 的使用。该流程设计如下:


    目标:通过 StateMachine 实现该二级审批流程,提供 API 给第三方调用。

    状态定义
    将流程图上的 5 个状态(不包括开始和结束)定义如下:

    public enum States {
        WAITING_FOR_SUBMIT,             // 等待提交
        WAITING_FOR_TL_APPROVE,         // 等待 TL 审批
        WAITING_FOR_DM_APPROVE,         // 等待 DM 审批
        WAITING_FOR_HR_RECORD,          // 等待 HR 备案
        END,                            // 流程结束
    }



    事件
    将流程图上的 6 个事件(不括开始和结束)定义如下:

    public enum Events {
        SUBMIT,   // 提交申请
        TL_AGREE,     // WAITING_FOR_TL_APPROVE 审批
        TL_REJECT,       // WAITING_FOR_TL_APPROVE 驳回
        DM_AGREE,     // 部门经理审批
        DM_REJECT,      // 部门经理驳回
        HR_RECORD,      // WAITING_FOR_HR_RECORD 备案
    }



    配置状态机
    主要是配置状态、事件和迁移。

    @Configuration
    @EnableStateMachine
    public class StateMachineConfig extends EnumStateMachineConfigurerAdapter<States, Events> {
    
        @Autowired
        private LeaveStateMachinePersist leaveStateMachinePersist;
    
        @Bean
        public StateMachinePersister<States,Events,String> stateMachinePersist(){
            return new DefaultStateMachinePersister<>(leaveStateMachinePersist);
        }
    
        @Override
        public void configure(StateMachineStateConfigurer<States, Events> states)
                throws Exception {
            states
                .withStates()
                    .initial(States.WAITING_FOR_SUBMIT)
                    .states(EnumSet.allOf(States.class));
        }
    
        @Override
        public void configure(StateMachineTransitionConfigurer<States, Events> transitions)
                throws Exception {
            transitions
                .withExternal()
                    .source(States.WAITING_FOR_SUBMIT).target(States.WAITING_FOR_TL_APPROVE)
                    .event(Events.SUBMIT)
                    .and()
                .withExternal()
                    .source(States.WAITING_FOR_TL_APPROVE).target(States.WAITING_FOR_DM_APPROVE)
                    .event(Events.TL_AGREE)
                    .and()
                .withExternal()
                    .source(States.WAITING_FOR_TL_APPROVE).target(States.WAITING_FOR_SUBMIT)
                    .event(Events.TL_REJECT)
                    .and()
                .withExternal()
                    .source(States.WAITING_FOR_DM_APPROVE).target(States.WAITING_FOR_HR_RECORD)
                    .event(Events.DM_AGREE)
                    .and()
                .withExternal()
                    .source(States.WAITING_FOR_DM_APPROVE).target(States.WAITING_FOR_SUBMIT)
                    .event(Events.DM_REJECT)
                    .and()
                .withExternal()
                    .source(States.WAITING_FOR_HR_RECORD).target(States.END)
                    .event(Events.HR_RECORD);
        }


    其中 LeaveStateMachinePersist 是自定义的持久化对象,用于恢复状态机的状态,因为不同的业务对象共用同一个状态机,状态机的状态根据业务 id 来缓存。LeaveStateMachinePersist 目前很简单,仅仅是一个 HashMap 来保存业务 id 和对于的 StateMachineContext:

    @Component
    public class LeaveStateMachinePersist implements StateMachinePersist<States,Events,String> {
    
        // 用 map 来模拟持久化存储,可替换成数据库
        static Map<String, States> cache = new HashMap<>(16);
    
    
        @Override
        public void write(StateMachineContext<States, Events> stateMachineContext, String s) {
            cache.put(s, stateMachineContext.getState());
        }
    
        @Override
        public StateMachineContext<States, Events> read(String s) {
            return cache.containsKey(s) ?
                    new DefaultStateMachineContext<>(cache.get(s),null,null,null,null,"请假流程") :
                    new DefaultStateMachineContext<>(States.WAITING_FOR_SUBMIT,null,null,null,null,"请假流程");
    
        }
    }



    控制器
    控制器负责对外提供 RESTFul 接口。有 6 个 RequestMapping,分别执行新建请假条、提交、tl审批、dm审批、hr备案和获取状态机当前状态 6 个操作。

    @RestController
    public class StateMachineController {
    
    
        @Autowired
        private StateMachinePersister<States, Events, String> persister;
    
        @Autowired
        private StateMachine<States, Events> stateMachine;
    
    
        @RequestMapping("/new")
        @ResponseBody
        public BaseResponse newLeave(@RequestBody LeaveRequest leave){
            BaseResponse result = new BaseResponse();
            stateMachine.start();
    
            result.message = "新建请假申请成功";
            result.success = true;
            result.data = leave;
    
            return result;
    
        }
    
        @RequestMapping("/apply")
        @ResponseBody
        public BaseResponse apply(@RequestBody JSONObject params){
            String leaveId = params.getAsString("leaveId");
    
            return sendEvent(Events.SUBMIT,leaveId);
    
        }
    
        @RequestMapping("/tlApprove")
        @ResponseBody
        public BaseResponse tlApprove(@RequestBody JSONObject params) {
    
            String id = params.getAsString("leaveId");
            boolean agree = params.getAsNumber("agree").intValue() != 0;
    
            return sendEvent(agree ? Events.TL_AGREE : Events.TL_REJECT, id);
        }
    
        @RequestMapping("/dmApprove")
        @ResponseBody
        public BaseResponse dmApprove(@RequestBody JSONObject params) {
    
            String id = params.getAsString("leaveId");
            boolean agree = params.getAsNumber("agree").intValue() != 0;
    
            return sendEvent(agree ? Events.DM_AGREE : Events.DM_REJECT, id);
    
        }
    
        @RequestMapping("/hrRecord")
        @ResponseBody
        public BaseResponse hrRecord(@RequestBody JSONObject params) {
    
            String id = params.getAsString("leaveId");
    
            return sendEvent(Events.HR_RECORD,id);
    
        }
    
        @RequestMapping("/getState")
        @ResponseBody
        public BaseResponse getState(@RequestBody JSONObject params){
            String leaveId = params.getAsString("leaveId");
    
            BaseResponse result = new BaseResponse();
    
            try{
                persister.restore(stateMachine,leaveId);
    
                result.success = true;
                States state = stateMachine.getState().getId();
    
                result.data = state;
    
            }catch (Exception e){
                e.printStackTrace();
            }finally {
                stateMachine.stop();
                return result;
            }
    
        }
    
        private BaseResponse sendEvent(Events event,String leaveId){
            BaseResponse result = new BaseResponse();
    
            if(leaveId == null || leaveId.length()==0){
                result.success = false;
                result.message = "leaveId 不能为空";
                return result;
            }
    
            try {
                // 根据业务 id 获取状态
                persister.restore(stateMachine,leaveId);
    
                result.success = stateMachine.sendEvent(event);
                // 持久化状态机
                if (result.success) {
                    persister.persist(stateMachine, leaveId);
                }
                JSONObject data = new JSONObject();
    
                result.message = result.success ? "执行成功":"执行失败";
                result.message = result.message + ",当前状态为:"+stateMachine.getState().getId();
                data.put("leaveId",leaveId);
                data.put("event",event.toString());
                data.put("state",stateMachine.getState().getId());
                result.data = data;
            } catch (Exception e) {
                e.printStackTrace();
                result.message = e.getMessage();
            }finally {
                stateMachine.stop();
                return result;
            }
        }
    
    }


    注意 leaveId 是业务 id,代表了一个业务对象(比如请假条 LeaveRequest)。leaveId 是一个 UUID,保证不会重复。

    运行程序,会自动在 8080 端口上运行 tomcat。然后就可以用 postman 调用各个接口进行测试了:
     

    转自:https://blog.csdn.net/kmyhy/article/details/84784479

    展开全文
  • 博主推荐延展咨询资深顾问何宇卓文章 我们知道,个中等规模的企业,管理流程和业务...通常,对于、四级流程,即“跨部门、岗位间”和“部门内、岗位间”的流程来说,划定边界与具体描述都不难,因为需要做的仅...

    博主推荐延展咨询资深顾问何宇卓文章

    我们知道,一个中等规模的企业,管理流程和业务流程加起来少则几百个,多则上千个,所以,在对企业进行流程梳理时,首先是进行流程的分类分级、主次界定,在层级和边界被清晰界定之后,再进行具体流程的显性化工作。

    通常,对于三、四级流程,即“跨部门、岗位间”和“部门内、岗位间”的流程来说,划定边界与具体描述都不难,因为需要做的仅仅是把业务现状呈现出来。而对于二级流程来说,由于其描述对象是某个业务板块的总体概貌,不仅包含多个三级流程,还要体现三级流程间的逻辑关系,这就使事情很不简单,不仅需要梳理者深谙某个板块的全部业务,还要他有高度、有全局观,并且逻辑清楚,这已属于企业流程管理的“顶层设计”范畴。

    面对这些挑战,我们可能会想:如果有一个梳理二级流程的普适方法该多好!那么,是否存在这样的“万能钥匙”呢?延展咨询凭借流程管理方面多年的实战经验,基于PDCA方法,提出了下述工作路线。

    二级流程,即构成价值链的各业务板块,它提纲挈领地展示了每个业务板块由哪些跨部门的三级流程构成,并体现了这些三级流程的发生顺序、流转关系、并串联关系、制约关系、循环关系等等,籍此清晰呈现业务板块所承担的主要职能以及这些职能的实现过程。

    二级流程所描述的最小颗粒度为跨部门的工作流程,在描述时,除了应从业务链条的完整性角度全面展现这些跨部门的流程之外,还应从PDCA管理闭环的角度设计、审视这些流程之间的逻辑关系。一般性的,具体可通过以下五个步骤进行:

    第一步:明确二级流程的描述范围

    不论梳理哪个二级流程,首先要从其对应的业务板块的内容上、过程上、管理上明确界定出该二级流程的描述内容与边界。比如,对于“物资供应”业务板块来说,设计的整体框架:

    (1)从内容上考虑,最基本的必须包括供应商日常供货管理、采购业务处理、库存发料管理等;

    (2)从过程上考虑,从前往后至少应该经历采购申请、采购需求确认、询报价、采购合同签订、采购合同执行、验收入库、向供应商付款等内容;

    (3)从管理上考虑,还可能包括材料定额编制、新增供应商管理、合格供方评定、订货不一致项处理、验收不一致项处理、废旧物资处理,以及每年年终的供应商年度评估等内容。

    另外,如果从顶层设计的角度,还应考虑战略总体规划、年度目标计划、关键节点控制、过程检查与考核等等内容。所以,想穷尽一个二级流程的描述范围并非易事,需要从多角度缜密思考,谨防遗漏。

    第二步:界定“管理”和“运行”,设定PDCA

       在大致罗列出二级流程可能涉及的业务内容之后,如何排布这些业务之间的逻辑关系才是挑战的开始。一般来讲任何业务板块所包含的具体工作都可以从“管理”和“运行”两条线进行切分(如图1所示):

    (1)管理:包括P(规划及计划)、C(检查、分析及考核);

    (2)运行:包括D(执行)、A(调整及优化)。

    图1: PDCA的管理与运行分布

    图1: PDCA的管理与运行分布

    在这个环节,首先需要明确P和C的关系(如图2所示)。P和C从时间角度可分为三个层次:

    (1)远期:P指三年滚动规划,C则是现状的评估与分析;

    (2)年度:P指年度目标计划,C则是年度总结与考核;

    (3)季(月)度:P指季(月)度执行计划,C则是季(月)度执行统计分析。

    大量应用P与C的关系来编排业务逻辑的模块有如战略规划管理、会计核算与财务管理、设计开发管理、生产计划管理、销售计划管理等等。

    图2:P与C的对应关系及对D的影响

    图2:P与C的对应关系及对D的影响

    在梳理了P与C的对应关系之后,要加入对运行D的考虑。对业务运行D产生直接影响的是季(月)度的计划及分析。要特别注意区分“目标计划”和“执行计划”:目标计划涵盖了企业运营方面的年度目标,以及根据年度目标进行的季度、月度目标分解;执行计划则是为实现目标所采取的具体管理措施及业务活动安排,细化到工作事项,落实到具体资源。所以D的部分通常从专项管理、业务分类、运行控制三条思路进行梳理(如图3所示),务必与该板块的主要职能相对应。当涉及顶层设计时,还需遵循MECE原则,即“完全穷尽,相互独立”:(1)管理全覆盖;(2)分类要清晰;(3)控制要到位。

    图3:业务运行D的3条梳理路径

    图3:业务运行D的3条梳理路径

    第三步:形成三个层次的管理闭环

    二级流程的顶层设计框架应至少包含三个层次的管理闭环(如图4所示):

    图4:三个层次的管理闭环

    图4:三个层次的管理闭环

    图4:三个层次的管理闭环

    对于第一层(最外层)而言,第二层(中间层)管理闭环是它的D,A主要体现在滚动规划上;对于第二层而言,第三层(最里层)管理闭环是它的D,而A通常不会对当年的P产生影响而是影响下一年度的P。对一家企业而言,无论管理类还是业务类流程,都无可避免有这三层嵌套关系,所以在第二步设定了PDCA之后,就要应用这种嵌套思路对不同层级的PDCA进行排布。

    第四步:分解业务运行过程

       在前两步将总体运行框架搭建好之后,就应着手于具体业务运行过程的分解设计。根据经验,通常从业务实例的“全生命周期”角度入手比较容易厘清和穷尽一项业务的全过程,我称之为“业务全生命周期透视法”,即从业务发起梳理至业务退出,强调业务链条的完整性(如图5所示)。比如梳理企业信息化管理板块中的“信息化建设项目管理”业务:它的输入可能是“季(月)工作执行计划”,当然,要记住这是从更高层次的工作计划中分解出来的,这是这一业务流程的外延;有了输入之后,从业务实际开始到结束可能会经历可行性研究、项目申报、审查、批复、实施、验收、结算、运维、评估等活动,应以“跨部门、岗位间”的流程为颗粒度进行界定和刻画。

    如果从PDCA的角度也可以对业务过程进行梳理,比如:输入“季(月)工作执行计划”是P;“申报”和“实施”是D;“批复”、“验收”、“评估”属于C;而管控过程中如需调整,如项目变更等,则属于A的范畴。

    图5:梳理业务运行过程的全生命周期透视法

    图5:梳理业务运行过程的全生命周期透视法

    第五步:定义流程节点

    二级流程初步设计完成后,还需做四件事:(1)界定主责部门、参与部门;(2)明确各节点的时间要求;(3)明确流程考核指标;(4)对于关键节点进行流程补充说明。

    至此,所设计的二级流程已经基本完善了,企业管理者可从五个方面总体审定此流程的合理性:

    (1)管理主体是否明确,管控措施是否齐备;

    (2)是否形成了PDCA管理闭环,是否明确界定了业务板块中的管理环节(P与C)、运行环节(D与A);

    (3)管理对象的生命周期链条是否完整,业务是否有遗漏;

    (4)定位是否准确、清晰;

    (5)是否站在全局视角。

    审定后可作为流程体系中最重要的一部分进行发布,并作为三、四级流程描述的依据。

    文章来源:http://www.extans.com/view_631.html

    延展阅读:

    【1】浅析流程管理活动的实施要领

    【2】基于流程整合企业内部管理体系

    【3】浅析企业流程与制度的关系






    本文转自 唐志明 51CTO博客,原文链接:http://blog.51cto.com/extans/1345073,如需转载请自行联系原作者

    展开全文
  • 一、Spring Bean创建流程及缓存总述 Spring Bean的创建流程,大致调用栈绘图如下。 首先,doGetBean()查询缓存,...最后,registerSingleton()方法中将成熟的Bean添加到一级缓存,移除二三级缓存。 对Bean的创.
  • 三级随访: 建立每天随访计划和任务,科室医生进行一级随访。客服部门进行二级随访以及满意度问卷调查。重点老弱病残重症患者进行三级医生家访。
  • 一般在考后的个月左右,在十月底的时候大部分的省份是可以领取电子版的合格证明(具体的还是以当地的通知为准)。 注册: 初始注册可以在资格证书发起之日起3年内提出申请,逾期者,需要进行继续教育后才可以...
  • 一级缓存:singletonObjects —> 存放完整bean的单例池 二级缓存:earlySingletonObjects —> 存放非完整bean的单例池,存放早期暴露的bean 三级缓存:singletonFactories —> 存放可以创建bean的fac
  • 描述 有做过三级级联菜单,使用的前端AngularJs技术来实现的,主要通过内置对象$watch...2)使用$watch监听一级菜单的id,如果发生变化,通过该一级id,重新获取二级下拉列表 三级: 1)即prinId = 二级对象的id 2)使
  • 文章目录零、一级缓存和二级缓存的流程一级缓存总结二级缓存总结一、缓存接口Cache及其实现类二、cache标签解析源码、CacheKey缓存项的key四、二级缓存TransactionCache五、二级缓存测试六、一级缓存源码解析七、...
  • 一级一共十门课,大家可以根据自己的喜好顺序去复习但是一定要复习完所有科目。 No.1 FRA这门课是占比最高也是最难的科目,反正对于当时会计小白的我来说真的是很难,学了遍才完全学透。所以大家一定要花很多的...
  • JaveEE企业开发流程

    2021-01-14 14:13:06
    ,企业开发:功能的元素 ,功能元素具体实现 ,具体操作步骤
  • 2. 三级缓存的变化(要理清三级缓存如何变更) 3. 关键代码验证(不要过于抠细节) 由于源码跟踪很难用图片去说明,因此涉及到核心代码,我会:标注出类名和方法名。至于如何追踪到某处代码,自己跟遍源码。 ...
  • Android自定义View高级()-分类与流程

    千次阅读 2017-01-19 15:11:16
    自定义View绘制流程二.自定义View分类 自定义ViewGroup 自定义ViewGroup一般是利用现有的组件根据特定的布局方式来组成新的组件,大多继承自ViewGroup或各种Layout。 自定义View 在没有现成的View,需要自己实现的...
  • 我们在上篇研究了DecorView的创建过程,个Activity关联个PhoneWindow,每个PhoneWindow创建了自己的DecorView。今天我们来分析 DecorView是如何绘制到PhoneWindow上去的,分析过程中得出的重要结论将使用...
  • python中的三大流程控制一级目录二级目录三级目录 一级目录 二级目录 三级目录
  • 做页面开发或客户端程序开发,都会碰到几个下拉菜单联动的情况,例如在网上买东西的时候,就会选择收货地址,以及在填写家庭信息的时候,都会用到常见的省,市,区三级联动。 思路 页面加载的时候显示的是默认的...
  • 选择一级菜单某项,输出二级菜单,同理输出三级菜单3.菜单数据保存在文件中4.让用户选择是否要退出5.有返回上一级菜单的功能 二,流程图 #-*- Coding:utf-8 -*- # Author: kking ''' 作业需求: 1....
  • OpenCV训练联分类器检测物体OpenCV级联分类器操作流程一、准备正负样本、制作训练数据集、训练 OpenCV级联分类器操作流程 级联分类器在Android用的,先上效果图 第次学用,参考了各位前辈的博客,十分...
  • 、绘制流程从何而起 四、Activity 的界面结构在哪里开始形成 五、绘制流程如何运转起来的 六、实战 七、写在最后 、前言 绘制流程可以说是Android进阶中必不可少的个内容,也是面试中被问得最多的问题之。...
  • python(流程控制

    2021-04-30 14:49:12
    目录一级目录二级目录三级目录 一级目录 二级目录 三级目录
  • 三级嵌入式准备(

    千次阅读 2018-03-03 23:41:01
    靡不有初,鲜克有终。 ...一般按照相应时间能将实时系统分为类:强实时系统,其相应时间一般在ms或us;普通实时操作系统一般在s,弱实时系统一般在数十s。 嵌入式开发流程:需求分...
  • 文章目录、资料来源、比赛介绍2.1 关于 Kaggle2.2 关于泰坦尼克之灾、初步流程3.1 数据初探3.2 数据初步分析3.3 简单数据预处理3.3.1 信息缺失的属性3.3.2 对类目型的特征做因子化3.3.3 对变化幅度大的特征...
  • 、Activity启动流程 这是我自己绘制的时序图,从Launcher开始。可能会存在不准确或看不懂的地方; 因此,也建议读者自己根据源码画一下图,加深理解记忆。 、Activity任务栈及启动模式 ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,680
精华内容 1,072
关键字:

一级流程二级流程三级流程