传智播客jbpm学习,询价采购的流程

   今天汤老师讲了比较典型的jbpm流程,并在jbpm插件上对它进行实现。来巩固前面所学的jbpm,有助于更熟练的使用和掌握jbpm,汤老师主要讲了询价采购的流程。
    询价采购是指对几个供货商(通常至少三家)的报价进行比较以确保价格具有竞争性的一种采购方式。
    采购询价工作流程,以政府采购为例。
    一、询价准备
    1 、计划整理。采购代理机构根据政府采购执行计划,结合采购员的急需程度和采购物品的规模,编制月度询价采购计划。
    2 、组织询价小组。询价小组由采购人的代表和有关专家共三人以上单数组成,其中专家人数不得少于成员总数的三分之二,以随机方式确定。询价小组名单在成交结果确定前应当保密。
    3 、编制询价文件。询价小组根据政府采购有关法规和项目特殊要求,在采购执行计划要求的采购时限内拟定具体采购项目的采购方案、编制询价文件。
    4 、询价文件确认。询价文件在定稿前需经采购人确认。
    5 、收集信息。根据采购物品或服务等特点,通过查阅供应商信息库和市场调查等途径进一步了解价格信息和其他市场动态。
    6 、确定被询价的供应商名单。询价小组通过随机方式从符合相应资格条件的供应商名单中确定不少于三家的供应商,并向其发出询价通知书让其报价。
     二、询价
    1 、询价时间告知市招标办、资金管理部门等有关部门。
    2 、递交报价函。被询价供应商在询价文件限定的时限内递交报价函,工作人员应对供应商的报价函的密封情况进行审查。
    3 、询价准备会。在询价之前召集询价小组召开询价预备会,确定询价组长,宣布询价步骤,强调询价工作纪律,介绍总体目标、工作安排、分工、询价文件、确定成交供应商的方法和标准。
    4 、询价。询价小组所有成员集中开启供应商的报价函,作报价记录并签名确认,根据符合采购需求、质量和服务相等且报价最低的原则,按照询价文件所列的确定成交供应商的方法和标准,确定一至二名成交候选人并排列顺序。
    5 、询价报告。询价小组必须写出完整的询价报告,经所有询价小组成员及监督员签字后,方为有效。
    三、确定成交人
    1 、采购人根据询价小组的书面谈判报告和推荐的成交候选人的排列顺序确定成交人。当确定的成交人放弃成交、因不可抗力提出不能履行合同,采购人可以依序确定其他候选人为成交人。采购人也可以授权询价小组直接确定成交人。
    2 、成交通知。成交人确定后,由采购人向成交人发出《成交通知书》,同时将成交结果通知所有未成交的供应商。
    3 、编写采购报告。询价小组应于询价活动结束后在规定时间内,就询价小组组成、采购过程、采购结果等有关情况,编写采购报告
  
    通过这个流程的学习,也巩固了前面所学的知识,这个流程中重要的部分就是对定时器的应用。
   Timer
  定时器,指定到期时间和动作,在到期后指行相应的动作。配置定时器是使用timer元素,在timer中可以使用(一个)action或script子元素指定一个动作,这个动作在定时器触发后被执行。执行Timer的任务需要一个timer runner(任务执行者)。他的作用是定期的(默认为5秒钟)检查数据库中的jbpm_job表,查看有没有已到期的job,如果有,就执行之,并删除已执行完的job。  Create Timer就是向jbpm_job中添加一个job。Timer可以在node(节点)中或task(任务)中定义。如果在节点中定义,定时器就会在进入节点的时候被启动,在离开节点的时候被取消; 如果是在任务中定义,定时器就会在创建任务的时候被启动,在完成任务的时候被取消。

任务执行者的启动方式分别为:
  1> 在程序中使用:JbpmConfiguration.startJobExecutor();
  2> 在web项目中的web.xml中配置JobExecutorServlet这个servlet,
     并设置随系统启动而初始化,如下:
      <servlet >
           <servlet-name>JobExecutorServlet</servlet-name>
           <servlet-class>
               org.jbpm.job.executor.JobExecutorServlet
           </servlet-class>
           <load-on-startup>1</load-on-startup>
      </servlet>
Timer有以下可以配置的属性:
  duedate    :多长时间之后触发,触发后将会执行指定的动作;
  repeat     :触发后多长时间重复执行一次指定的动作;
  transition :如果设置了,在定时器触发后就会使用他离开节点;
  为duedate和repeat的指定时间的语法是:<quantity> [business] <unit>
每个Timer要有一个唯一的名字。如果没有给定时器元素指定名字,将会使用
Timer所在的元素的名字作为定时器的名字。
定义Timer要注意两点:
1> 如果指定了动作,又指定了transition,则动作会在离开节点之前被执行;
2> 如果指定了transition又指定了repeat,则repeat是没有意义的,因为离开节
   点后timer就被取消了;
定义了Timer,却没有执行相应的动作,则可能是以下原因造成的:
a) 没有启动JobExecutor;
b) 离开了Timer所在的节点(比如在TaskNode中做完了所有任务);
c) Timer所在的任务实例已结完成了;

任务分配
任务分派有两种模式,分别是推(push)模式和拉(pull)模式。
 a) 推模式(个人任务):是在任务分派的时候,直接将任务实例分派给一个指定的用户,任务实例进入这个用户的个人任务列表中。
  分配任务的方式:
  1> 在流程定义中定义任务时,用actor-id指定(一个固定值或表达式);
  2> 在程序代码中使用TaskInstance.setActorId(String)指定;
  3> 使用AssignmentHandler,方法为assignable.setActorId(String);
  查询个人任务列表的方法为:
  TaskMgmtSession.findTaskInstances(String actorId);
 b)  拉模式(组任务):是将任务实例分派给一组用户,这个任务实例会出现在(这个组中用户的)组任务列表中。执行组任务时,需要首先将任务实例拉到自己的个人任务列表中,然后执行此任务。当有一个组任务被某个组用户取出后,该任务实例就会从组任务列表中移除。(任务竞争的机制)
   分配任务的方式:
  1> 在流程定义中定义任务时,用pooled-actors指定(多个参与者用逗号隔开);
  2> 在程序代码中使用TaskInstance.setPooledActors(String[])指定;
  3> 使用AssignmentHandler,方法为assignable.setPooledActors(String[]);
  查询组任务列表的方法为:
  TaskMgmtSession.findPooledTaskInstances(String actorId);
   对于一个组任务,如果他的actorId为null,组中所有的用户都可以在组任务列表
中看到这个任务。如果使用TaskInstance.setActorId(String)方法设置这个任务
由指定的acrorId来办理,这时pooledActors中的其他人就看不到这个任务了,就
是说actorId会屏蔽pooledActors; 当这个用户因某些原因不能办理任务时,应
该把这个任务再退回到组任务列表中,方法是调用TaskInstance.setActorId()设
置actorId为null,这时pooledActors中的所有人又都可以看到这个任务了。
   这两种分配任务的模式都可以使用任务分派接口AssignmentHandler来实现。任务在定义的时候指定对应的AssignmentHandler接口实现类。引擎在创建任务实例的时候会调用接口中的assign方法。其实现应该调用参数assignable的方法对任务进行分派。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值