JavaEE项目实战(OA系统)之二十一_流程审批之四

  JavaEE项目实战(OA系统)之二十一_流程审批之四

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


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

  先保存为草稿:

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

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

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


  然后提交请假单:

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

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

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


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

insert into tbl_leave_audit(audit_id, leave_id, flow_node_id, user_id, user_name,
audit_info, audit_date)
values(seq_leave_audit.nextval, ?, ?, 3, '王五(部门经理)',
'同意', sysdate);
commit;

update tbl_leave set current_node=
(select next_node_id from tbl_flow_line where flow_no=5 and prev_node_id=?)
where leave_id=?;
commit;
  每一次审批,都有两个动作,一个是修改请假表状态,一个是新增审批表记录。

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

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

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

insert into tbl_leave_audit(audit_id, leave_id, flow_node_id, user_id, user_name,
audit_info, audit_date)
values(seq_leave_audit.nextval, ?, ?, 3, '王五(部门经理)',
'不同意', sysdate);
commit;

update tbl_leave set state=2
where leave_id=?;
commit;
  审批不通过,和审批通过的差别是:审批不通过,直接结束审批流程,流程不进入下一节点了。请假单的state字段为2,表示审批结束。

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

insert into tbl_leave_audit(audit_id, leave_id, flow_node_id, user_id, user_name,
audit_info, audit_date)
values(seq_leave_audit.nextval, ?, ?, 4, '赵六(总经理)',
'同意', sysdate);
commit;

update tbl_leave set state=2
where leave_id=?;
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),对此三表做一张视图:

create view view_leave
as
select l.*, u.dept_id, fn.flow_node_role
from tbl_leave l, tbl_user u, tbl_flow_node fn
where l.user_id=u.user_id and l.flow_no=fn.flow_no
and l.current_node=fn.flow_node_id;
  视图查询出来的内容如下:


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

select * from view_leave
where state=1 and
((flow_node_role='部门经理'
and dept_id=?)
or
(
flow_node_role in (
select flow_role_name from tbl_flow_role_user
where user_id=? and flow_role_name<>'部门经理')
));

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

insert into tbl_leave(leave_id, user_id, user_name, leave_type, leave_reason, start_date, end_date,
add_date, flow_no, current_node, state)
values(seq_leave.nextval, 1, '张三', '病假', '昨天感冒发烧,身体不适,请假一天。',
to_date('2016-09-01 00:00', 'yyyy-mm-dd hh24:mi'),
to_date('2016-09-02 00:00', 'yyyy-mm-dd hh24:mi'),
sysdate, 5, 2, 1);
insert into tbl_leave(leave_id, user_id, user_name, leave_type, leave_reason, start_date, end_date,
add_date, flow_no, current_node, state)
values(seq_leave.nextval, 2, '李四', '病假', '昨天感冒发烧,身体不适,请假一天。',
to_date('2016-09-01 00:00', 'yyyy-mm-dd hh24:mi'),
to_date('2016-09-02 00:00', 'yyyy-mm-dd hh24:mi'),
sysdate, 5, 2, 1);
insert into tbl_leave(leave_id, user_id, user_name, leave_type, leave_reason, start_date, end_date,
add_date, flow_no, current_node, state)
values(seq_leave.nextval, 5, '小二', '病假', '昨天感冒发烧,身体不适,请假一天。',
to_date('2016-09-01 00:00', 'yyyy-mm-dd hh24:mi'),
to_date('2016-09-02 00:00', 'yyyy-mm-dd hh24:mi'),
sysdate, 5, 2, 1);
commit;
  结果令人满意,只查询出张三李四的请假单。

发布了105 篇原创文章 · 获赞 106 · 访问量 27万+
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 技术黑板 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览