javaEE 之流程审批

  JavaEE项目实战

  这里公布上一节查询的答案。


  1. 员工张三填写一个请假单,请编写sql语句,向请假表中插入数据。

  先保存为草稿:

[sql]  view plain  copy
  1. insert into tbl_leave(leave_id, user_id, user_name, leave_type, leave_reason, start_date, end_date,  
  2. add_date, flow_no, current_node, state)  
  3. values(seq_leave.nextval, 1, '张三''病假''昨天感冒发烧,身体不适,请假一天。',  
  4. to_date('2016-09-01 00:00''yyyy-mm-dd hh24:mi'),  
  5. to_date('2016-09-02 00:00''yyyy-mm-dd hh24:mi'),  
  6. sysdate, 5,  
  7. (select min(flow_node_id) from tbl_flow_node where flow_no=5),  
  8. 0);  
  9. commit;  

  注意,在草稿状态,请假单的state字段值为0,表示草稿;且流程节点编号为1,即处于“填写请假单”状态。

  子查询用于查询流程号为5的流程,第1个节点是哪个。


  然后提交请假单:

[sql]  view plain  copy
  1. update tbl_leave set current_node=  
  2. (select next_node_id from tbl_flow_line where flow_no=5 and prev_node_id=?),  
  3. state=1  
  4. where leave_id=?;  
  5. commit;  
  主要修改两个值,请假单的state字段改为1,表示审批中;流程节点改为下一节点,子查询用于查找下一节点。

  这里的两个参数,第1个是当前流程节点,第2个是请假单id,在实际填写时,第1个参数值为1,第2个参数要看序列生成的id值到底是多少。

  这些参数在Java程序中,都可以通过对象获得。


  2. 部门经理王五审核员工张三的请假单,审批通过,请编写相应的sql语句。

[sql]  view plain  copy
  1. insert into tbl_leave_audit(audit_id, leave_id, flow_node_id, user_id, user_name,  
  2. audit_info, audit_date)  
  3. values(seq_leave_audit.nextval, ?, ?, 3, '王五(部门经理)',  
  4. '同意', sysdate);  
  5. commit;  
  6.   
  7. update tbl_leave set current_node=  
  8. (select next_node_id from tbl_flow_line where flow_no=5 and prev_node_id=?)  
  9. where leave_id=?;  
  10. commit;  
  每一次审批,都有两个动作,一个是修改请假表状态,一个是新增审批表记录。

  第一个插入语句有两个参数,即请假单id和当前流程节点id。

  第二个修改语句有两个参数,即当前流程节点id和请假单id。通过一个子查询根据当前流程节点id,查找下一流程节点id。

  3. 部门经理王五审核员工张三的请假单,审批不通过,请编写相应的sql语句。

[sql]  view plain  copy
  1. insert into tbl_leave_audit(audit_id, leave_id, flow_node_id, user_id, user_name,  
  2. audit_info, audit_date)  
  3. values(seq_leave_audit.nextval, ?, ?, 3, '王五(部门经理)',  
  4. '不同意', sysdate);  
  5. commit;  
  6.   
  7. update tbl_leave set state=2  
  8. where leave_id=?;  
  9. commit;  
  审批不通过,和审批通过的差别是:审批不通过,直接结束审批流程,流程不进入下一节点了。请假单的state字段为2,表示审批结束。

  4. 总经理赵六审核员工张三的请假单,审批通过,请编写相应的sql语句。

[sql]  view plain  copy
  1. insert into tbl_leave_audit(audit_id, leave_id, flow_node_id, user_id, user_name,  
  2. audit_info, audit_date)  
  3. values(seq_leave_audit.nextval, ?, ?, 4, '赵六(总经理)',  
  4. '同意', sysdate);  
  5. commit;  
  6.   
  7. update tbl_leave set state=2  
  8. where leave_id=?;  
  9. commit;  
  向审批记录表写入一行,并修改请假单状态。

  5. 总经理赵六审核员工张三的请假单,审批不通过,请编写相应的sql语句。

  与上例基本相似,除了“同意”改成“不同意”外,差别不大。


  6. 部门经理登录系统,要显示待审批事项的列表,请编写相应的sql语句。

  这里的逻辑比较难一些。基本上,主要还是查请假表,一个是看请假单的状态是“审批中”,即值为1;另外,还要看请假单该不该由你审。

  该不该由你审有两种逻辑:

  (1) 如果你是部门经理,且请假单的当前流程节点对应的流程角色也是部门经理,且你的部门和请假人的部门一样,就可以审。

  (2) 如果你是其他角色,例如总经理,则只需要请假单的当前流程节点对应的流程角色,是你所具备的角色,就可以审。

  例如在请假表(tbl_leave)中,第二条记录,流程号(flow_no)是5,当前的流程节点(current_node)是2。


  再查流程节点表(tbl_flow_node),发现流程号为5,节点号为2的流程,相应的流程角色(flow_node_role)是“部门经理”。


  还要对照流程角色-员工表(tbl_flow_role_user):


  是不是很复杂?


  为了简化查询,我们先来做一张视图,把前两张表,再关联员工表(主要是找员工的部门id),对此三表做一张视图:

[sql]  view plain  copy
  1. create view view_leave  
  2. as  
  3. select l.*, u.dept_id, fn.flow_node_role  
  4. from tbl_leave l, tbl_user u, tbl_flow_node fn  
  5. where l.user_id=u.user_id and l.flow_no=fn.flow_no  
  6. and l.current_node=fn.flow_node_id;  
  视图查询出来的内容如下:


  最后完成的sql语句是这样的:

[sql]  view plain  copy
  1. select * from view_leave  
  2. where state=1 and  
  3. ((flow_node_role='部门经理'  
  4. and dept_id=?)  
  5. or  
  6. (  
  7. flow_node_role in (  
  8. select flow_role_name from tbl_flow_role_user  
  9. where user_id=? and flow_role_name<>'部门经理')  
  10. ));  

  为了看效果,我们连续插入3条数据,再执行上述查询。

[sql]  view plain  copy
  1. insert into tbl_leave(leave_id, user_id, user_name, leave_type, leave_reason, start_date, end_date,  
  2. add_date, flow_no, current_node, state)  
  3. values(seq_leave.nextval, 1, '张三''病假''昨天感冒发烧,身体不适,请假一天。',  
  4. to_date('2016-09-01 00:00''yyyy-mm-dd hh24:mi'),  
  5. to_date('2016-09-02 00:00''yyyy-mm-dd hh24:mi'),  
  6. sysdate, 5, 2, 1);  
  7. insert into tbl_leave(leave_id, user_id, user_name, leave_type, leave_reason, start_date, end_date,  
  8. add_date, flow_no, current_node, state)  
  9. values(seq_leave.nextval, 2, '李四''病假''昨天感冒发烧,身体不适,请假一天。',  
  10. to_date('2016-09-01 00:00''yyyy-mm-dd hh24:mi'),  
  11. to_date('2016-09-02 00:00''yyyy-mm-dd hh24:mi'),  
  12. sysdate, 5, 2, 1);  
  13. insert into tbl_leave(leave_id, user_id, user_name, leave_type, leave_reason, start_date, end_date,  
  14. add_date, flow_no, current_node, state)  
  15. values(seq_leave.nextval, 5, '小二''病假''昨天感冒发烧,身体不适,请假一天。',  
  16. to_date('2016-09-01 00:00''yyyy-mm-dd hh24:mi'),  
  17. to_date('2016-09-02 00:00''yyyy-mm-dd hh24:mi'),  
  18. sysdate, 5, 2, 1);  
  19. commit;  
  结果令人满意,只查询出张三李四的请假单。

猜你喜欢

转载自blog.csdn.net/rundy_deng/article/details/79422787