OA系统之报销管理

本文介绍了一个报销管理系统的实现细节,包括如何确保数据一致性、事务处理、使用ThreadLocal进行连接管理及审核流程的设计。针对主表与明细表同步问题,通过事务控制实现数据的完整性和一致性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  1. 报销管理-添加报销单-业务层
    (1) 在报销主表和明细表中都有一个字段叫expid,这个字段在数据库中是利用序列获取的,但是在业务层中,我们要控制主表和明细表的expid一致,所以要先获取expid赋值给主表和明细表,那么这个expid的值怎么得到呢?
    在dao层通过sql语句
    select exp_seq.nextval from dual
    获取exp_seq序列的下一个值,将该值赋值给主表和明细表。

  2. 报销管理-添加报销单-DAO层代码
    (1) 在我们的逻辑中,要向主表添加数据,要向明细表添加数据,但是假如在向明细表添加数据的过程中,出现异常了,那么程序就中断了,但是主表的数据被添加进去了,这个问题要怎么解决呢?
    将事务处理提到service层,在service层获取链接,关闭事务的自动提交功能,一旦发生异常,就手动回滚,保持事务原子性,保证数据一致。

    (2) 在我们目前的代码中,当添加明细出现问题的时候,页面还是会跳转到添加成功页面,这个问题怎么解决呢?
    将事务处理提到service层,在service层获取链接,关闭事务的自动提交功能,一旦发生异常,就手动回滚,保持事务原子性,保证数据一致。

    (3) 现在的代码中,会出现另一个问题:主表数据添加成功,明细表数据添加失败,但是这些操作肯定是要么都成功,要么都失败的,那么这个问题怎么解决呢?
    将事务处理提到service层,在service层获取链接,关闭事务的自动提交功能,一旦发生异常,就手动回滚,保持事务原子性,保证数据一致。

  3. 报销管理-使用ThreadLocal实现业务层事务1
    (1) 说明ThreadLocal的作用?
    在一个线程中存放数据,该数据是该线程的内部数据,其他线程无法访问,将connection对象放入线程中,从线程中获取connection可以保证获取到的connection对象是同一个。

  4. 报销管理-使用ThreadLocal实现业务层事务2
    (1) 如何保证DBUtils工具类中getConnection方法获取到的Connection对象是一个呢?
    使用ThreadLocal对象,将connection对象放入其中,ThreadLocal对象保证在当前线程中connection对象是同一个。在ThreadLocal内部有一个map集合,使用线程名作为键,connextion作为值,保证了只有当前线程能获取到connection对象。

    (2) 在DBUtils中是否要将Connection关闭呢?那要在什么时候关闭?
    不需要再DBUtils中关闭connection,在service层,事务提交或回滚后将connection关闭。

  5. 报销管理-待审报销单
    (1) 简述待审报销的思路?
    当用户查看待审核报销时,服务器从数据库中的报销单表查找下一个审核人是当前用户时,将该条记录显示到待审核报销界面。

    (2) 如何查询的是不是下一级审批人是当前登录人的信息?
    Sql语句:
    select emp.realname,exp.* from expense exp join employee emp on exp.empid=emp.empid where exp.nextauditor=? order by expid desc
    将报销单表和员工表链接查询。

  6. 我要查询的是不是下一级审批人是当前登录人的信息?
    (1) 根据业务流程图,请用文字详细描述报销流程。
    首先判断审核是否通过,拒绝或打回,则添加审核记录,修改报销单的状态,通过则判断是否是财务,是财务则添加支出信息,修改报销单状态,不是财务则判断报销金额是否大于2500,小于2500则添加审核记录,修改报销单状态,交给财务审核,金额大于2500,则判断当前审核人是否为总裁,是总裁则添加审核记录,修改报销单状态,交给财务审核,不是总裁,则则添加审核记录,修改报销单状态,交给总裁审核。

    (2) 审核报销单业务涉及到哪些表?
    审核记录表、报销单表、支出表、

  7. 报销管理-审核报销单-控制层代码和业务层思路
    (1) 如何在后台sql中进行条件的拼接?
    使用if判断参数值是否为空,不为空则添加到sql语句中。

  8. 报销管理-审核报销单-DAO层和业务层代码实现1
    (1) 在填充业务层代码过程中,需要注意哪些事项?

  9. 注意代码的整合,相同的代码整合在一起,优化逻辑。

  10. 注意逻辑判断。

  11. 报销管理-审核报销单-DAO层和业务层代码实现2
    (1) 完成审核报销单业务层代码。

  12. 报销管理-理解数据库表和创建实体类
    (1) 简述系统中表之间的关系:
    一个表对于一个实体类,表中得列,对于类中的属性,表中的一条数据对于一个对象,

  13. 报销管理-审核报销单-代码完善和业务流程图绘制
    (1) 在完成审核报销单功能后,你的感悟是什么?
    系统中最难的是业务逻辑的处理,往往一个业务涉及对张表,有多个操作步骤,很多条件。

(2) 在程序出错后或跟你预先结果不一致的时候,你的应对策略是什么?
跟踪业务逻辑的实现步骤,一步步检查,必要时可以插入断点,进行bug调试。

  1. 收支管理-Echarts入门
    (1) Echarts插件的作用?
    实现数据的图形化显示,将数据显示为柱状图、饼图、折线图等便于人们查看的图形化界面,提高用户的交互质量。

    (2) 如何使用Echarts插件?

    1. 引入echarts的js文件。
    2. 创建一个具有高宽的div作为echarts容器
    3. 基于容器初始化echarts
    4. 指定图表的配置项和数据
    5. 使用配置项和数据显示图表
  2. 收支管理-使用Echarts柱状图显示收入统计信息-视图层和控制层
    (1) 使用Echarts柱状图显示收入统计信息的逻辑概述?

    1. 引入echarts的js文件。
    2. 创建一个具有高宽的div作为echarts容器
    3. 使用ajax获取数据,服务器接收到请求在数据库中查找收入信息,使用json格式发送给浏览器。
    4. 在ajax的回调函数中基于容器初始化echarts,并指定图表的配置项和数据
    5. 使用配置项和数据显示图表
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值