目标分解数据结构
把一个大的目标逐级分解成小目标,如图
现在要做的就是这种,目标逐级分解,形成一个任务树. 分成任务表和任务成员表
表结构
任务表task | ||
Id | Int | 主键(自增) |
Sp_id | Int | 服务商id |
Shop_id | Int | 服务商id |
Taskno | Varchar | 任务编号 |
Parent_id | Int | 父任务id |
Title | Varchar | 标题 |
Time_flag | Int | 1:年,2:季度,3:月,4:周 |
Quota | Varchar | 指标类型 |
Quota_name | Varchar | 指标名(冗余字段) |
Start_time | Bigint | 开始时间 |
End_time | Bigint | 结束时间 |
Target | Decimal | 目标值 |
Complete | Decimal | 已完成值 |
Root_id | Int | 根id |
Create_time | Bigint | 创建时间 |
Remark | Varchar | 备注 |
任务成员表 | ||
Sp_id | Int | 服务商id |
Shop_id | Int | 门店id |
Emp_id | Int | 人员id |
Task_id | Int | 对应任务表主键 |
Role | Int | 0:创建人,1:负责人,2:参与人 |
Emp_name | Varchar | 人员姓名(冗余字段) |
任务表和任务成员表是多对多关系.
因为涉及到产值等指标的汇报,以及本周本月的统计,又加了一张汇报表
汇报表 | ||
Id | Int | 自增主键 |
Sp_id | Int | 服务商id |
Shop_id | Int | 门店id |
Emp_id | Int | 人员id |
Task_id | Int | 任务id |
Taskno | Varchar | 任务编号 |
Root_id | Int | 任务根id |
Create_time | Bigint | 创建时间 |
Address | Varchar | 汇报地址 |
Reason | Varchar | 汇报原因 |
Report_complete | Decimal | 完成值汇报 |
Remark | Varchar | 备注 |
Img_addr | Varchar | 图片地址 |
Parent_id | Int | 父任务id |
Quota | Varchar | 指标类型 |
任务编号taskno的命名规则:
图 1:taskno的命名规则
根目标的编号始终是10,然后如图依次向下分解,类型为varchar的原因是:数据库数据类型长度限制,这种规则下,int只能支持分解到5级任务,bigint也只能分解到10级,所以给了varchar(100),
Root_id由来
因为会有多个任务树,所以每个任务加了一个”标签”,把所属任务树的根目标的id作为root_id存起来,方便查询
根据taskno和root_id就可以查询某任务下边的子任务或者所有任务
例: taskno=1001, root_id=123
查询子任务:
Select * from sp_task where taskno like ‘1001__’ and root_id = 123
查询以该任务为起点的任务树:
Select * from sp_task where taskno like ’1001%’ and root_id = 123
也可以直接查询任务
Select * from sp_task where taskno = ’1001’ and root_id = 123
代码分析
关于taskno
创建根目标(任务),taskno为10,
分解任务需要根据父任务的taskno和已有子任务数来算出,代码如下
获取任务树上的所有任务
getTasks的sql类似这样:Select * from sp_task where taskno like ’1001%’ and root_id = 123
getMyTasks是根据任务id,将不同的任务角色封装到同一任务对象中(创建人,负责人,参与人)
树形结构
需要有child,
从表中查询出任务树中所有的任务集合后,组装成树形结构
从这里找查到的:http://jiangm.89.blog.163.com/blog/static/127756694201472944052170/
感谢大神
获取一颗任务树的最末端任务
遍历任务,分别收集id和parentId,从id集合中去掉parentId的集合,剩下的id就是最末端任务的id
汇报统计
销售产值的统计,规定,只统计任务树最末端任务负责人的销售产值,然后逐级向上叠加.采用定时器的方式,每天20点,统计昨天20点到今天20点最末端任务负责人的销售产值,记录到汇报表,并收集汇报集合.再遍历汇报集合,找到其所在任务树,逐级叠加汇报完成值
查询负责人的销售产值此处不展示
收集好汇报集合后,逐级叠加汇报完成值的方法如下;
本周本月的汇报统计
因为每天20点都会统计当天的汇报,所以本周本月的统计只要找到本周一/本月初到当天的起止时间,求和查询即可