利用模拟指针逻辑处理开发中遇到的'撤回功能'

近期本人在开发项目的时候,客户那边提出一个关于事项合并并撤回的功能,经过研究和讨论,我终于把这个功能开发出来了,个人感觉做出来的逻辑和开发技巧值得记录。
本人在开发时业务表有狠多,在这里我用两张业务表来表达,
业务表,两张,    a_zysx 和  b_sxxq  其中b_sxxq表是a_zysx 表的子表 
历史表,两张        a_zysx_his 和   b_sxxq_his
修改记录表            c_xgjl(指针表,主要控制指针的位置和操作)

其中a_zysx表为主要事项表   b_sxxq表为事项详情表,c_xgjl表为修改记录表,a_zysx中的数据为树状结构。如下:显示的是a_zysx表中有6条数据。

A.大项one   
	a.子项1  
	b.子项2  
B.大项two	 
	c.子项3  
	d.子项4 

在a_zysx中每个事项在b_sxxq表中都有相应的数据,如下:显示的是a_zysx表中有6条数据,b_sxxq中有13条数据

A.大项one   有两个子表的业务数据 b_sxxq表中有两条数据 A1,A2
	a.子项1  有两个子表的业务数据 b_sxxq表中有两条数据 a1,a2,
	b.子项2  有两个子表的业务数据 b_sxxq表中有两条数据 b1,b2
B.大项two	 有一个子表的业务数据 b_sxxq表中有一条数据 B1
	c.子项3  有三个子表的业务数据 b_sxxq表中有三条数据 c1,c2,c3
	d.子项4  有三个子表的业务数据 b_sxxq表中有三条数据 d1,d2,d3

业务表的数据库结构为:

历史表,以_his结尾,表结构和业务表的结构一抹一样,每张表都多了一个业务ID的字段和一个修改记录UNID的字段,相当于把业务表的数据全部拿过来(包含业务表的主键),重新写了一条或多条数据,表结构如下:

 修改记录表,也就是指针表,有四个重要字段  zzwz:指针位置(Y/N)Y表示指针所在位置,  sfzx:是否执行(Y/N),mbunid:目标unid存放修改业务的表unid,mbb:目标表存放修改目标的表名,xglx:用于区分添加,删除和合并操作的标识(add/del/link)

先来说合并功能:
 如上图业务表的结构,现在a_zysx表中有6条数据,b_sxxq表中有13条数据,上面的描述应该很清楚
 选择A,B两个大项合并成一个大项C,合并后的事项树结果为 

 C.大项three   
	a.子项1  
	b.子项2 
	c.子项3  
	d.子项4  

数据条目结构为

 C.大项three   有三个子表的业务数据 b_sxxq表中有两条数据 A1,A2,B1(在没有增加,删除子表数据的情况下显示)
	a.子项1  有两个子表的业务数据 b_sxxq表中有两条数据 a1,a2,
	b.子项2  有两个子表的业务数据 b_sxxq表中有两条数据 b1,b2
	c.子项3  有三个子表的业务数据 b_sxxq表中有三条数据 c1,c2,c3
	d.子项4  有三个子表的业务数据 b_sxxq表中有三条数据 d1,d2,d3

接下来写两个简单的接口方法,方便下面调用:

方法1,updateXgjlAllZt   更新c_xgjl表的sfzx字段的状态,将这个状态全部改为N
方法2,saveXgjl(String xglx) 向c_xgjl表中插入一条数据,id为主键ID,zzwz为Y,sfzx为N,mbunid为A的unid,mbb为a_zysx,xglx 为 传入xglx
方法3,updateXgjlXgzt(String xgjlunid)  根据传过来的xgjlunid更新修改记录表中的sfzx的状态,如果这个记录的指针执行过,则将c_xgjl表中的sfzx字段改为Y,并根据创建时间,查询上个时间的sfzx为N的一条记录,并修改该记录的zzwz为Y

在合并的时候的操作为:
1.选中A,B两个事项,点击合并。弹出一个弹出框,这时或获取A,B两个事项的unid,将A,B两个事项的内容和子表的内容展示在出来,相应的子表的业务也展示出来,可以进行编辑,当然AB相同字段的数据放在一个输入框中,处于可编辑状态,子表全部展示出来,进行编辑,重新建立一个C事项以及C事项的子表
2.点击保存的时候,先执行方法1 updateXgjlAllZt,再执行方法2 saveXgjl("link"),对于业务数据先复制,再删除
    2.1将a_zysx表中的A,B事项,以及子表的操作是复制到a_zysx_his表和b_sxxq_his表中。a_zysx中事项A,事项B两条数据,b_sxxq表中A1,A2,B1这三条数据全部复制到a_zysx_his表和b_sxxq_his表(
    注意:复制过程中的xgjlunid传入的是这次操作的unid)
    2.2对于A,B两个事项的子项a,b,c,d,以及子项对应的子表的数据a1,a2,b1,b2,c1,c2,c3,d1,d2,d3的操作是边复制,边新建(复制是复制到历史表中,数据由a_zysx和b_sxxq复制到a_zysx_his 和 b_sxxq_his表中,新建也可以说是复制,只是复制到本表中,数据由a_zysx和b_sxxq复制到a_zysx和 b_sxxq表中)。将a_zysx中事项a,b,c,d四条数据,b_sxxq表中a1,a2,b1,b2,c1,c2,c3,d1,d2,d3这十条数据全部复制到a_zysx_his表和b_sxxq_his表,同时将a_zysx中事项a,b,c,d四条数据,b_sxxq表中a1,a2,b1,b2,c1,c2,c3,d1,d2,d3这十条数据全部在本表中新建一套,也可以说是复制一套,只是unid不一样。
    2.3根据获取到的A,B两个事项的UNID,进行删除合并前的数据,
        2.3.1根据A事项的unid,删除b_sxxq表中对应A事项的子表的数据(b_sxxq表中parentid为A事项的unid)
        2.3.2查询A事项的子项a,b 
            2.3.2.1根据A事项的子项的a的unid,删除b_sxxq表中对应A事项的子项的子表的数据(b_sxxq表中parentid为a事项的unid)
            2.3.2.1根据A事项的子项的b的unid,删除b_sxxq表中对应A事项的子项的子表的数据(b_sxxq表中parentid为b事项的unid)
        2.3.3根据A事项的unid,删除a_zysx表中对应A事项的子项的数据(a_zysx表中parentid为A事项的unid)
        2.3.4根据以上逻辑删除B事项的子表,以及子项的子表,以及子项
3.保存之后,结果是现在a_zysx_his表中有6条数据,b_sxxq_his表中有13条数据,现在a_zysx表中为5条数据,b_sxxq表中有13条数据(合成的新的大项C在没有增加,删除子表数据的情况下)
在添加事项的时候操作为:
执行先执行方法1 updateXgjlAllZt,再执行方法2 saveXgjl("add"),这时向a_zysx_his表中写入一条数据,xgjlunid为方法2中的unid
在删除事项的时候操作为:
执行先执行方法1 updateXgjlAllZt,再执行方法2 saveXgjl("del"),这时将删除的事项的数据复制到a_zysx_his表中,xgjlunid为方法2中的unid 

在撤回时的操作为:
1.根据zzwz为Y,sfzx为N 两个条件,查询c_xgjl表,获得,unid,mbunid和xglx
    if("add".equals(xglx)){
        //从a_zysx表中删除unid为mbunid的数据
        执行方法3,updateXgjlXgzt(xgjlunid)
    }else if("delete".equals(xglx)){
        //从a_zysx_his表中将xgjlunid为unid的数据复制到a_zysx表中
        执行方法3,updateXgjlXgzt(xgjlunid)
    }else if("link".equals(xglx)){
        //根据目标表unid去删除a_zysx中的事项的以及子项数据,删除b_sxxq表中事项的子表,以及子项的子表的数据
        //将修改记录表中的数据拿回来,从a_zysx_his和b_sxxq_his表中将xgjlunid的数据复制到a_zysx和b_sxxq表中
        执行方法3,updateXgjlXgzt(xgjlunid)
    }

注意:
1.本文主数据是树状结构,可能描述的比较复杂,开发时可以先考虑单数据的操作功能,把逻辑想通,开发起来就简单了。
2.针对本文中的在合并时子项以及子表的操作,本来开始也没想过边复制边新建,因为合并的是父项,所以子项只需要把parentid修改为新的父项id就行,但是在撤回操作时,既要删除a_zysx表中的子项,也要把a_zysx_his表中的子项复制到a_zysx表中,容易出现回滚,所以就直接采取是边复制边新建,这样相当于把原来的子项以及子表全部复制到了历史表中,也在a_zysx表中又新建了一套一模一样的子项,只是修改了id。
3.写业务逻辑是要先想好,需要什么参数和中间库,这样不管多复杂的业务都可以做好。
3.对于整个新建,删除,合并的功能可能处理的比较简单,架构上缺少思考,本文仅供参考,如果网友有好的思路和见解,欢迎提出。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值