版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
目前新功能在试点范围内上线试用,业务关心新功能的试用情况,需要对生产数据进行统计和汇总,以便跟旧功能在流程上做一些比较分析。我们需要配合的是,跟大数据团队一起,提供几个数据基表,其中要有一张表,能够记录新功能的全生命周期。
统一抽象来说,解决的是:
谁(Who)什么时候(When)以什么身份(Role)在什么地点(Where),对什么东西(What)做了什么事(Something),导致该东西从什么状态(StateA),翻转成什么状态(StateB)。
基于上面的出发点,我们想采用状态机的思路,状态A通过动作A转换成状态B(stateA + actionA = stateB),这样就可以把对象从创建、修改、到最后的核销,整个生命周期过程都有对应的事件记录。
一开始,我们设计了如下版本1的表:
版本1:事件记录表 db_event_report
流水ID
<p>id</p>
</td>
<td style="40px;">
<p>对象ID</p>
<p>obj_id</p>
</td>
<td style="134px;">
<p>系统编码</p>
<p>sys_code</p>
</td>
<td style="43px;">
<p>网点编码</p>
<p>area_code</p>
</td>
<td style="38px;">
<p>操作者工号</p>
<p>operator_id</p>
</td>
<td style="47px;">
<p>源状态</p>
<p>source_status</p>
</td>
<td style="57px;">
<p><strong><span style="color:#86ca5e;">事件编码</span></strong></p>
<p><strong><span style="color:#86ca5e;">event_code</span></strong></p>
</td>
<td style="64px;">
<p><strong><span style="color:#86ca5e;">事件描述</span></strong></p>
<p><strong><span style="color:#86ca5e;">event_desc</span></strong></p>
</td>
<td style="67px;">
<p>目标状态</p>
<p>target_status</p>
</td>
<td style="77px;">
<p>创建时间</p>
<p>create_time</p>
</td>
</tr><tr><td style="58px;">123456</td>
<td style="40px;">A111</td>
<td style="134px;">TEST_SYSTEM</td>
<td style="43px;">XXX</td>
<td style="38px;">0123777</td>
<td style="47px;">初始</td>
<td style="57px;"><strong><span style="color:#86ca5e;">001</span></strong></td>
<td style="64px;"><strong><span style="color:#86ca5e;">打印</span></strong></td>
<td style="67px;"><strong><span style="color:#3399ea;">打印完成</span></strong></td>
<td style="77px;">2018-09-06 18:33:35</td>
</tr><tr><td style="58px;">123457</td>
<td style="40px;">A111</td>
<td style="134px;">TEST_SYSTEM</td>
<td style="43px;">QQQ</td>
<td style="38px;">0123666</td>
<td style="47px;"><strong><span style="color:#3399ea;">打印完成</span></strong></td>
<td style="57px;"><strong><span style="color:#86ca5e;">002</span></strong></td>
<td style="64px;"><strong><span style="color:#86ca5e;">核销</span></strong></td>
<td style="67px;">核销完成</td>
<td style="77px;">2018-09-07 12:05:43</td>
</tr></tbody></table></div><p>表字段的含义:</p>
流水ID:与业务无关的唯一ID
对象ID:记录的操作对象,即什么东西(What)
系统编码:哪个系统上报的操作记录数据,即什么身份(Role)
网点编码:在哪个网点上报的操作记录数据,即什么地点(Where)
操作者工号:是谁操作的,即谁(Who)
源状态:在做当前这个动作时,该对象的开始状态是什么,即状态(StateA)
事件编码、事件描述:定义一系列的事件,即什么事(Something)
目标状态:当做完这个动作后,该对象的结束状态是什么,即状态(StateB)
所以基于这个表,我们可以记录某个对象在做了我们定义的一系列事件后,状态进行了翻转时的数据,然后大数据团队同步这张表,去做一些定制化的报表和数据分析。
比如我们想知道对象A111从打印完成状态到核销完成状态所花费的时间,用sql很容易就实现了:
开始时间:
SELECT create_time AS begin_time FROM db_event_report WHERE obj_id = 'A111' AND target_status = '打印完成';
结束时间:
SELECT create_time AS end_time FROM db_event_report WHERE obj_id = 'A111' AND source_status = '打印完成' AND event_code = '002';
然后将上面两条sql查询出来的begin_time和end_time套入以下sql函数,即可算出相隔的分钟数
SELECT TIMESTAMPDIFF(MINUTE, begin_time, end_time);
到此,需求初步完成。但是,就这样结束了吗?!
相关阅读:
golang 简单的实现内 网 穿 透,用户访问本地服务。
golang 创建一个简单的广播echo服务器
golang 使用 protobuf 的教程
golang语言中os包的学习与使用(文件,目录,进程的操作)
【原】画流程图工具visio使用技巧汇总
【改】IOS-百度地图API用点生成线路、导航、自定义标注 2013年11月更新
【原】xcode5&IOS7及以下版本免证书真机调试记录
【转】C++的拷贝构造函数深度解读,值得一看
【转】c++中引用的全方位解读
【转】self.myOutlet=nil、viewDidUnload、dealloc的本质剖析
原文地址:https://www.cnblogs.com/jpfss/p/11424650.html
Copyright © 2011-2022 走看看
|