1
00:00:00,360 --> 00:00:07,030
这里面实际上就是通过一个方法,一个操作来封装了
2
00:00:08,790 --> 00:00:10,630
它不直接就操纵这里面
3
00:00:10,640 --> 00:00:12,070
不是直接把里面露出来
4
00:00:14,990 --> 00:00:20,430
产品ID进来,返回是产品类型
5
00:00:22,440 --> 00:00:23,660
产品类型,我们前面讲
6
00:00:23,670 --> 00:00:24,780
它是一个枚举的
7
00:00:26,150 --> 00:00:28,650
单独搞了个枚举来表示它
8
00:00:28,660 --> 00:00:31,890
这种封装
9
00:00:32,300 --> 00:00:33,690
什么时候用是值得的
10
00:00:34,760 --> 00:00:37,000
如果说你这里面是比较复杂的
11
00:00:37,530 --> 00:00:38,720
或者容易变化的
12
00:00:38,890 --> 00:00:40,480
封装可以,否则的话
13
00:00:40,860 --> 00:00:42,710
为了又多一个封装
14
00:00:42,980 --> 00:00:44,010
就不值得了
15
00:00:44,880 --> 00:00:45,540
1
00:00:00,590 --> 00:00:03,620
这里类型的话
2
00:00:05,870 --> 00:00:08,180
我们看它是哪一个
3
00:00:09,810 --> 00:00:11,780
这里写了,是D
4
00:00:12,460 --> 00:00:19,990
显然它跟这个是不等的
5
00:00:20,000 --> 00:00:20,270
6
00:00:22,960 --> 00:00:24,310
D跟这个也不等
7
00:00:25,060 --> 00:00:26,650
跳到下面来了
8
00:00:29,160 --> 00:00:29,540
9
00:00:29,550 --> 00:00:35,880
然后这里,跟前面封装一样
10
00:00:36,200 --> 00:00:38,710
把什么时候签约时间拿出来
11
00:00:39,870 --> 00:00:40,810
跟这里一样
12
00:00:46,080 --> 00:00:51,630
然后这里面我们前面讲过了
13
00:00:51,640 --> 00:00:58,340
它自己定义了一个分配金钱的一个操作
14
00:00:58,910 --> 00:00:59,950
你要把它分3份
15
00:01:00,840 --> 00:01:01,160
对吧
16
00:01:02,220 --> 00:01:03,530
分配在哪里
17
00:01:03,820 --> 00:01:04,770
就在这里
18
00:01:05,880 --> 00:01:07,640
就在这个合同类里面
19
00:01:07,650 --> 00:01:08,920
它定义了一个操作
20
00:01:09,730 --> 00:01:14,300
参数是金额、份数
21
00:01:17,710 --> 00:01:24,330
然后先定义了一个低值结果变量
22
00:01:25,290 --> 00:01:27,470
然后先把它分
23
00:01:27,480 --> 00:01:32,170
分完之后这里取整
24
00:01:34,370 --> 00:01:37,890
因为我们那个数值只能到分了
25
00:01:39,540 --> 00:01:41,760
比如说,你有7块钱
26
00:01:41,770 --> 00:01:43,080
你分3份怎么分呢
27
00:01:44,340 --> 00:01:45,660
你肯定分不了的
28
00:01:46,230 --> 00:01:47,740
最后你只能分到什么
29
00:01:48,360 --> 00:01:50,300
要么是2块
30
00:01:52,670 --> 00:01:55,270
2块、3块这样
31
00:01:55,280 --> 00:01:58,670
但这个肯定不是,因为这个是以元为单位的
32
00:01:59,530 --> 00:02:00,690
如果你是7分钱
33
00:02:00,820 --> 00:02:01,930
我们说7分钱的话
34
00:02:02,570 --> 00:02:04,300
只能分2、2、3
35
00:02:04,310 --> 00:02:06,420
估计已经是最接近的,没有办法了
36
00:02:07,190 --> 00:02:09,940
当然你是700块(口误)的话
37
00:02:10,190 --> 00:02:13,320
700分,7块钱就是700分的话
38
00:02:14,110 --> 00:02:15,100
700的话
39
00:02:15,110 --> 00:02:20,880
699算是可以分的
40
00:02:21,410 --> 00:02:24,070
699可以分,剩下1分怎么分
41
00:02:25,030 --> 00:02:26,270
剩下1分的话
42
00:02:26,280 --> 00:02:29,750
你只能分给某一个了
43
00:02:30,330 --> 00:02:33,550
有一个是得234的
44
00:02:33,560 --> 00:02:38,300
其它是233、233,这样分
45
00:02:38,310 --> 00:02:44,250
那么这个实际上就展示了这个过程
46
00:02:44,260 --> 00:02:45,130
低值结果,高值结果
47
00:02:45,140 --> 00:02:46,380
高值结果
48
00:02:46,390 --> 00:02:49,410
就是往上加一分钱了
49
00:02:51,100 --> 00:02:52,170
然后看余数
50
00:02:52,450 --> 00:02:53,520
看余数是多少
51
00:02:55,810 --> 00:02:57,530
然后余数前面的元素
52
00:02:57,740 --> 00:02:59,720
所以,余数是多少
53
00:03:00,210 --> 00:03:03,470
余数因为它就已经是整数了
54
00:03:04,590 --> 00:03:07,060
所以这里面的话,余数前面的元素
55
00:03:07,750 --> 00:03:11,380
就是高值的结果
56
00:03:11,910 --> 00:03:18,480
余数后面的元素就,这写错了
57
00:03:19,320 --> 00:03:20,530
标错了
58
00:03:20,920 --> 00:03:22,320
就用低值的结果
59
00:03:24,750 --> 00:03:28,150
60
00:03:36,310 --> 00:03:40,350
然后就把这三个插进去了
61
00:03:40,560 --> 00:03:41,790
怎么插入
62
00:03:41,920 --> 00:03:45,130
就调用这个表模块的
63
00:03:45,140 --> 00:03:47,080
一个插入的操作
64
00:03:50,690 --> 00:03:51,940
先定义一个新行
65
00:03:51,950 --> 00:03:54,480
然后取下一个ID
66
00:03:55,710 --> 00:03:58,290
之前那个作用
67
00:03:58,300 --> 00:04:02,160
你看,取下一个ID怎么实现的
68
00:04:03,580 --> 00:04:12,170
这里有一个锁,在这里定义,我们前面
69
00:04:13,550 --> 00:04:14,870
你看,定义了一个
70
00:04:15,120 --> 00:04:17,430
它类型就是对象
71
00:04:17,640 --> 00:04:19,670
一个静态的对象,就代表这个锁
72
00:04:22,680 --> 00:04:26,030
然后,你看这个是怎么做
73
00:04:27,880 --> 00:04:31,740
锁的目的就是为了保证原子操作
74
00:04:31,750 --> 00:04:35,360
就是说被锁住的这段里面的
75
00:04:35,370 --> 00:04:37,620
当然这里代码只有一行
76
00:04:38,350 --> 00:04:40,830
当然这一行里面可能它会分很多个指令了
77
00:04:40,840 --> 00:04:41,230
对不对
78
00:04:42,300 --> 00:04:45,710
就是说,如果有多个线程
79
00:04:46,410 --> 00:04:47,570
来执行这段代码
80
00:04:47,580 --> 00:04:50,090
如果A线程执行到
81
00:04:50,100 --> 00:04:52,470
这里面的时候,还没执行完
82
00:04:52,890 --> 00:04:54,680
B线程已经执行到这里了
83
00:04:57,040 --> 00:04:58,630
B线程执行到这里的时候
84
00:04:58,640 --> 00:05:00,190
它一看被锁住了
85
00:05:01,800 --> 00:05:03,480
有锁,它就等待
86
00:05:04,120 --> 00:05:05,250
等待A执行完了
87
00:05:05,260 --> 00:05:07,210
这个锁不存在了,被释放了
88
00:05:07,890 --> 00:05:10,420
保证多线程执行
89
00:05:11,170 --> 00:05:14,050
这段代码有多个线程
90
00:05:14,060 --> 00:05:15,050
同时执行的时候
91
00:05:16,810 --> 00:05:19,630
另外一个后面的线程
92
00:05:19,640 --> 00:05:21,470
要等待前面的线程
93
00:05:21,480 --> 00:05:22,990
把这一段执行完了
94
00:05:23,940 --> 00:05:25,210
把它释放出来了
95
00:05:26,850 --> 00:05:30,460
它才能够执行它的那一段程序
96
00:05:32,020 --> 00:05:34,120
这样才不会导致冲突
97
00:05:34,910 --> 00:05:37,020
像标识,我正在递增了
98
00:05:39,410 --> 00:05:41,020
原来那个数还没改
99
00:05:41,240 --> 00:05:43,650
结果你另外一个线程进来又递增一个
100
00:05:45,510 --> 00:05:48,220
最后得出来可能是两个一样的
101
00:05:48,230 --> 00:05:50,260
新的标识,冲突了
102
00:05:50,960 --> 00:05:53,160
所以你等我把递增做完了
103
00:05:54,440 --> 00:05:57,450
才能够轮到你来做下一步
104
00:05:59,240 --> 00:06:02,070
保证操作的原子性
105
00:06:04,470 --> 00:06:07,120
但这个的话我们自己来实现
106
00:06:08,270 --> 00:06:12,290
没有必要,最好是交给平台来做
107
00:06:12,460 --> 00:06:13,930
交给相应第三方
108
00:06:14,140 --> 00:06:20,610
不能写在我们这个领域的代码里面来
109
00:06:20,620 --> 00:06:21,210
不应该
110
00:06:22,320 --> 00:06:23,820
但这个是演示,无所谓了
111
00:06:25,900 --> 00:06:27,280
然后继续
1
00:00:01,260 --> 00:00:02,560
后面就是一样了
2
00:00:03,090 --> 00:00:03,760
ID
3
00:00:06,780 --> 00:00:13,590
一个字段一个字段往里面赋值
4
00:00:13,600 --> 00:00:16,410
赋好了,这一行就把它添加到
5
00:00:17,310 --> 00:00:20,190
Table的行的集合里面来
6
00:00:20,860 --> 00:00:22,570
实际上就是我们刚才类图上
7
00:00:24,800 --> 00:00:28,400
Table跟行之间的角色名
8
00:00:28,780 --> 00:00:32,040
添加,下面一样
1
00:00:00,360 --> 00:00:01,540
我们就一直运行
2
00:00:02,190 --> 00:00:05,280
后面一样
3
00:00:13,440 --> 00:00:14,550
计算完了
4
00:00:15,560 --> 00:00:21,240
实际上就是往表里面插入数据
5
00:00:22,290 --> 00:00:24,400
然后下面一样的
1
00:00:01,390 --> 00:00:02,310
你看,这一步
2
00:00:03,010 --> 00:00:07,800
我们现在是在主程序里面
3
00:00:08,140 --> 00:00:11,960
这一步就新建了一个收入确认的表模块
4
00:00:12,320 --> 00:00:14,260
然后调用这个表模块的操作
5
00:00:14,350 --> 00:00:16,990
我们来看怎么做
6
00:00:18,170 --> 00:00:22,840
构造,一样的
7
00:00:23,340 --> 00:00:25,140
前面都已经见过了
8
00:00:26,890 --> 00:00:28,610
好,接下来看,收入确认这个
9
00:00:33,290 --> 00:00:34,670
这个实际上就相当于
10
00:00:35,770 --> 00:00:39,930
传入的参数是合同ID
11
00:00:40,840 --> 00:00:42,940
这是某个日期
12
00:00:43,700 --> 00:00:45,260
那么通过这个来计算
13
00:00:45,270 --> 00:00:48,260
某合同、某日期之前已确认的收入
14
00:00:49,000 --> 00:00:52,500
相当于根据这个来查询,得到结果
15
00:00:55,340 --> 00:00:57,680
那么这里面查询的内容
16
00:00:57,690 --> 00:01:00,920
主要是在收入确认这个表里面
17
00:01:00,930 --> 00:01:06,890
所以操作就会放在这个表模块里面
18
00:01:08,230 --> 00:01:09,150
放在这里面
19
00:01:12,100 --> 00:01:16,280
跟我们的面向对象专家原则
20
00:01:16,890 --> 00:01:18,230
分配责任那个是类似的
21
00:01:20,190 --> 00:01:22,270
用到谁的数据最多
22
00:01:22,360 --> 00:01:26,570
那么它就有可能,最应该成为这个类的操作
23
00:01:30,300 --> 00:01:35,510
这里,首先第一步,就构建筛选条件
24
00:01:35,990 --> 00:01:37,480
构建一个查询条件了
25
00:01:38,140 --> 00:01:46,350
然后使用Table的一个操作
26
00:01:47,150 --> 00:01:50,400
select操作,然后把这个条件放进去
27
00:01:50,610 --> 00:01:51,880
筛选出符合条件的行
28
00:01:55,400 --> 00:01:58,400
得到这一行以后,它放到这里来了
29
00:01:58,530 --> 00:02:00,380
行的一个集合了
30
00:02:00,390 --> 00:02:07,280
然后它就根据这些行来累计行里面的字段
31
00:02:08,140 --> 00:02:09,280
金额
32
00:02:09,290 --> 00:02:10,640
金额字段累计起来
33
00:02:11,180 --> 00:02:12,210
但像这个的话
34
00:02:12,220 --> 00:02:15,640
如果是用SQL语句
35
00:02:15,650 --> 00:02:18,220
或者是用集合运算的
36
00:02:18,230 --> 00:02:19,900
像LINQ这样的语句的话
37
00:02:20,340 --> 00:02:23,230
直接用聚合函数就可以了
38
00:02:23,400 --> 00:02:26,530
没有必要让自己又单独搞一遍这样
39
00:02:26,540 --> 00:02:27,690
但没有关系
40
00:02:27,700 --> 00:02:31,350
这只是演示,聚合函数就可以了
41
00:02:32,240 --> 00:02:33,940
包括前面的所有的一切
42
00:02:34,880 --> 00:02:38,280
实际上,只要我们的表结构是合理的
43
00:02:38,410 --> 00:02:43,430
完全就可以通过一个查询语句把它写出来
44
00:02:43,600 --> 00:02:46,530
又这个,又那个,没有必要
45
00:02:48,090 --> 00:02:52,760
实际上最终的目的就是要做这个
46
00:02:52,770 --> 00:02:55,400
计算某合同某日期之前的已确认收入
47
00:02:55,950 --> 00:02:59,460
包括前面讲的,我们前面也说到过了
48
00:02:59,800 --> 00:03:01,750
写收入确认表都没有必要
49
00:03:01,760 --> 00:03:03,070
因为是冗余的数据
50
00:03:04,590 --> 00:03:07,610
我们就完全可以通过简单的
51
00:03:07,620 --> 00:03:11,260
这种标准的集合运算
52
00:03:12,950 --> 00:03:14,150
直接得到我们的结果
53
00:03:14,440 --> 00:03:17,010
这个我们最后再演示
54
00:03:18,550 --> 00:03:21,600
没有必要来这样做,但这个演示的话
55
00:03:23,250 --> 00:03:24,300
我们就按照书上这样
56
00:03:25,050 --> 00:03:25,870
来把它过一下
57
00:03:26,680 --> 00:03:30,830
来比较一下,自己来完成这个
58
00:03:30,840 --> 00:03:34,030
没有必要,好,得到结果了
59
00:03:34,690 --> 00:03:35,330
60
00:03:37,830 --> 00:03:41,740
然后这里就把它写到控制台
61
00:03:42,900 --> 00:03:46,010
控制台,就是这一行
62
00:03:47,010 --> 00:03:49,690
在这之前的收入是3333
63
00:03:51,020 --> 00:03:52,650
显然这是分3份了
64
00:03:53,570 --> 00:03:55,230
3333那三份
65
00:03:56,060 --> 00:03:58,730
后面可能就有3334什么的
66
00:04:01,200 --> 00:04:02,550
我们继续往下走
67
00:04:03,580 --> 00:04:05,540
先执行到这里
68
00:04:08,670 --> 00:04:14,400
好,我们看666.67,这是数据库
69
00:04:14,490 --> 00:04:19,840
另外两项就没有显示了
70
00:04:20,830 --> 00:04:22,350
这是数据库的
71
00:04:22,360 --> 00:04:23,630
这是电子表格的
72
00:04:24,760 --> 00:04:26,470
另外一个合同了,合同2
73
00:04:26,480 --> 00:04:27,650
合同3
74
00:04:31,530 --> 00:04:32,750
我们看合同3
75
00:04:36,690 --> 00:04:43,820
文字处理器的