Compare commits

1989 Commits

Author SHA1 Message Date
807875765@qq.com
cde7d11563 同步EXCEL 第一版 2022-03-14 09:05:28 +08:00
suyl
cc437c32c2 Merge remote-tracking branch 'origin/mark' 2021-08-17 16:14:45 +08:00
suyl
dfa7cf159e aa 2021-08-17 16:02:57 +08:00
suyl
b1e0bf5cb5 aa 2021-08-17 15:59:11 +08:00
suyl
738c35a25a aa 2021-08-17 15:09:55 +08:00
suyl
1b87bde859 aa 2021-08-17 14:41:32 +08:00
suyl
936813003b aa 2021-08-17 13:36:56 +08:00
suyl
411dbaa068 aa 2021-08-17 13:35:15 +08:00
suyl
634e7c8a6b aa 2021-08-17 11:51:11 +08:00
suyl
fe15525b8e aa 2021-08-17 11:25:20 +08:00
suyl
ea3098ec66 aa 2021-08-17 11:22:24 +08:00
suyl
55a2d4b80f aa 2021-08-17 11:21:47 +08:00
suyl
863c2c44d4 a 2021-08-17 11:16:29 +08:00
suyl
c40ee75121 aa 2021-08-17 11:14:18 +08:00
suyl
3a3d1d2f4f aa 2021-08-17 11:00:04 +08:00
suyl
9170b072d7 aa 2021-08-17 10:46:44 +08:00
suyl
d38b283460 aa 2021-08-17 10:38:27 +08:00
suyl
140fda8927 aa 2021-08-16 09:41:38 +08:00
suyl
b067647050 aa 2021-08-14 16:47:23 +08:00
suyl
e0fe502f49 aa 2021-08-14 16:41:15 +08:00
suyl
a0fa918322 aa 2021-08-14 16:39:05 +08:00
suyl
8698b920a9 aa 2021-08-14 15:10:58 +08:00
suyl
e8d7abe61b aa 2021-08-14 15:09:11 +08:00
suyl
0ee1912fae aa 2021-08-14 14:34:29 +08:00
suyl
068c25356b aa 2021-08-14 14:03:32 +08:00
suyl
cdc91763d1 aa 2021-08-14 14:01:20 +08:00
suyl
b26842caf8 aa 2021-08-14 13:58:09 +08:00
suyl
7b4fecc3ec a 2021-08-14 11:34:12 +08:00
suyl
691e65f369 aa 2021-08-14 11:29:39 +08:00
suyl
9d85e74fb0 aa 2021-08-14 10:37:58 +08:00
suyl
77888cc17c aa 2021-08-14 10:25:45 +08:00
suyl
aaa6cd8178 aa 2021-08-14 10:21:16 +08:00
suyl
5ef56867a0 aa 2021-08-14 10:17:56 +08:00
suyl
cc429e785d aa 2021-08-14 10:10:57 +08:00
suyl
2068ea6bf6 aa 2021-08-14 09:53:39 +08:00
suyl
78e9c177ea aa 2021-08-14 09:52:11 +08:00
suyl
59af1a146c aa 2021-08-13 18:53:38 +08:00
suyl
6cffb31d83 aa 2021-08-13 18:51:34 +08:00
suyl
f45fa869a1 aa 2021-08-13 18:43:44 +08:00
suyl
8754f1949e aa 2021-08-13 18:23:19 +08:00
suyl
5b7ac4700e aa 2021-08-13 17:53:54 +08:00
suyl
09e4414d0e aa 2021-08-13 17:22:12 +08:00
suyl
07635aa5ba aa 2021-08-13 17:20:00 +08:00
suyl
70ac32e833 aa 2021-08-13 17:18:14 +08:00
suyl
adec1bf126 aa 2021-08-13 17:10:55 +08:00
suyl
66fdea2164 aa 2021-08-13 17:07:42 +08:00
suyl
f4e77ec21e aa 2021-08-13 16:27:57 +08:00
suyl
fb73d38d31 aa 2021-08-13 15:21:26 +08:00
suyl
72960b6ced aa 2021-08-13 14:56:20 +08:00
suyl
885a5e885b aa 2021-08-13 14:52:06 +08:00
suyl
4f58c18c52 aa 2021-08-13 14:51:13 +08:00
suyl
c0d0669e21 aa 2021-08-13 14:49:00 +08:00
suyl
49b9213c52 a 2021-08-13 14:05:04 +08:00
suyl
d23b51252e a 2021-08-13 13:57:43 +08:00
suyl
9c385b3198 aa 2021-08-13 11:05:48 +08:00
suyl
e659cf3f7f aa 2021-08-12 09:28:17 +08:00
suyl
89a1ec23b1 aa 2021-08-10 11:05:33 +08:00
suyl
e30bd47ea6 aa 2021-08-10 11:03:23 +08:00
suyl
f57995ddb5 aa 2021-08-10 10:35:20 +08:00
suyl
1947db34c0 aa 2021-08-10 10:32:02 +08:00
suyl
4ad32dc2b7 t 2021-08-10 10:30:52 +08:00
suyl
39271aa7c7 aa 2021-08-10 10:24:18 +08:00
suyl
cc77ae075d aa 2021-08-10 10:17:57 +08:00
suyl
bc710e48b5 预订单打印 2021-08-09 15:16:46 +08:00
suyl
b74879f91a 2021-08-09 10:49:37 +08:00
suyl
e294beba0d 投诉提示 2021-08-09 10:48:53 +08:00
suyl
d9f04a9842 aa 2021-08-09 10:23:11 +08:00
suyl
ee34c419bb aa 2021-08-06 15:04:59 +08:00
suyl
e61fcb74b7 aa 2021-08-06 14:31:51 +08:00
suyl
82a4bf47de aa 2021-08-06 14:27:31 +08:00
suyl
f9b7b1d32e aa 2021-08-06 10:50:53 +08:00
suyl
86f58bd376 aa 2021-08-06 10:47:33 +08:00
suyl
8a179a496a aa 2021-08-06 10:04:20 +08:00
suyl
e5b00c0a79 a 2021-08-05 15:19:46 +08:00
suyl
d12902d678 aa 2021-08-05 11:59:14 +08:00
suyl
db16f2950f aa 2021-08-05 11:55:54 +08:00
suyl
8274bc46db test 2021-08-05 11:47:10 +08:00
suyl
ff5debfe44 aa 2021-08-05 11:24:08 +08:00
suyl
bc38e21668 a 2021-08-05 11:20:12 +08:00
suyl
fb3ac9051d aa 2021-08-05 10:59:58 +08:00
suyl
1b1301fc0e aa 2021-08-05 10:34:18 +08:00
suyl
901171fa6e aa 2021-08-05 10:26:49 +08:00
suyl
3f4ae785b0 aa 2021-08-05 10:22:18 +08:00
suyl
8a81ab9c3b aa 2021-08-05 10:16:06 +08:00
suyl
04b41d6e44 aa 2021-08-05 10:12:46 +08:00
suyl
517c443332 aa 2021-08-04 17:50:30 +08:00
suyl
3e47450078 a 2021-08-04 17:33:26 +08:00
suyl
e5467de15e aa 2021-08-04 17:12:18 +08:00
suyl
c40e026dc5 aa 2021-08-04 16:40:20 +08:00
suyl
4119ae3eb6 a 2021-08-04 13:45:34 +08:00
suyl
d1fcacc441 aa 2021-08-04 10:38:45 +08:00
suyl
9cfeafb01c aa 2021-08-04 09:28:15 +08:00
suyl
8bd114f281 aa 2021-08-03 16:59:38 +08:00
suyl
7397b232d9 aa 2021-08-03 16:46:09 +08:00
suyl
230328c38a aa 2021-08-03 16:45:06 +08:00
suyl
6f92cd6f0d aa 2021-08-03 16:31:20 +08:00
suyl
a09223b091 aa 2021-08-03 16:15:18 +08:00
suyl
a41fe05e63 aa 2021-08-03 16:04:26 +08:00
suyl
d81855d486 aa 2021-08-03 16:01:43 +08:00
suyl
68f8294c20 a 2021-08-03 15:30:37 +08:00
suyl
d9e565a5c4 aa 2021-08-03 09:24:44 +08:00
suyl
763ab8569c aa 2021-08-02 18:51:35 +08:00
suyl
9f5438ce92 aa 2021-08-02 18:09:32 +08:00
suyl
e12bb0a2dd aa 2021-08-02 16:06:27 +08:00
suyl
e58d009928 aa 2021-08-02 13:47:37 +08:00
suyl
2853d14e60 aa 2021-08-02 13:43:40 +08:00
suyl
473c3291b8 a 2021-08-02 11:01:05 +08:00
suyl
16b0f7ef33 a 2021-08-02 10:54:05 +08:00
suyl
39a7164d4a aa 2021-08-02 10:50:09 +08:00
suyl
19546f82f6 aa 2021-08-02 10:25:11 +08:00
suyl
2232af6d1c a 2021-08-02 10:21:29 +08:00
suyl
ede44f40f7 aa 2021-08-02 09:43:13 +08:00
suyl
00647ebaf4 aa 2021-08-02 09:16:35 +08:00
suyl
3ceef530d4 aa 2021-07-30 16:28:05 +08:00
suyl
d57beb9a4a aa 2021-07-30 16:19:50 +08:00
suyl
fb1cffd140 aa 2021-07-30 16:08:19 +08:00
suyl
ac7075fab4 aa 2021-07-30 15:24:22 +08:00
suyl
143a0f38dc ebai store 2021-07-30 15:16:42 +08:00
suyl
eacb7e0ccb aa 2021-07-30 11:07:19 +08:00
suyl
f060920812 aa 2021-07-30 10:14:47 +08:00
suyl
f350ed7044 .. 2021-07-29 16:54:51 +08:00
suyl
8260d2e2dd aa 2021-07-29 11:53:42 +08:00
suyl
8acd6030f4 aa 2021-07-29 11:28:58 +08:00
suyl
c15a96fcf5 aa 2021-07-29 11:14:43 +08:00
suyl
f0718ef83c aa 2021-07-29 10:57:40 +08:00
suyl
7b645cc5da aa 2021-07-28 14:21:22 +08:00
suyl
10ca5606c2 aa 2021-07-27 18:45:54 +08:00
suyl
9c8704f252 aa 2021-07-27 17:58:07 +08:00
suyl
2176d6ea6f aa 2021-07-27 17:37:38 +08:00
suyl
a913ce904f aa 2021-07-27 11:11:42 +08:00
suyl
4b7ff1aed3 aa 2021-07-26 14:48:00 +08:00
suyl
1190b8910a 美团售后 2021-07-26 14:41:19 +08:00
suyl
d48eff03b8 aa 2021-07-26 09:55:59 +08:00
suyl
71bee4fef2 aa 2021-07-23 17:49:46 +08:00
suyl
4301c9a90a aa' 2021-07-23 17:47:10 +08:00
suyl
cec46e4654 aa 2021-07-22 17:11:34 +08:00
suyl
4728178c0b aa 2021-07-22 17:10:46 +08:00
suyl
7352ecc7fa aa 2021-07-22 16:58:18 +08:00
suyl
71cb042b46 aa 2021-07-22 16:33:02 +08:00
suyl
a2cf621fb7 a 2021-07-22 16:23:48 +08:00
suyl
778f17f3f6 aa 2021-07-22 15:49:18 +08:00
suyl
64106dcd64 aa 2021-07-22 11:20:46 +08:00
suyl
33e6ca5104 aa 2021-07-22 09:43:18 +08:00
suyl
0ab78607e1 aa 2021-07-21 15:38:15 +08:00
suyl
8b133e6b6a aa 2021-07-21 11:40:42 +08:00
suyl
3401ad1086 aa 2021-07-21 11:02:43 +08:00
suyl
66ff82e0be aa 2021-07-21 10:43:46 +08:00
suyl
677d73e180 aa 2021-07-21 10:38:43 +08:00
suyl
b6c9982390 aa 2021-07-21 09:09:27 +08:00
suyl
263b1daa96 aa 2021-07-20 11:01:54 +08:00
suyl
6c687b9431 aa 2021-07-20 11:01:04 +08:00
suyl
6889d62b08 aa 2021-07-20 10:58:29 +08:00
suyl
9a08503a2f aa 2021-07-20 10:56:25 +08:00
suyl
36602a9cea aa 2021-07-20 10:46:07 +08:00
suyl
d7df047549 aa 2021-07-20 10:41:50 +08:00
suyl
20af1c2fe1 aa 2021-07-20 10:24:38 +08:00
suyl
40611d9418 aa 2021-07-20 10:18:15 +08:00
suyl
d00d1cd16d aa 2021-07-20 10:15:19 +08:00
suyl
2608d1ed2f aa 2021-07-20 10:12:07 +08:00
suyl
1bb6c86b4a aa 2021-07-20 09:53:37 +08:00
suyl
d5d9f509d7 aa 2021-07-19 17:09:32 +08:00
suyl
2d8838c3d7 aa 2021-07-19 16:53:30 +08:00
suyl
38891c676a aa 2021-07-19 16:48:44 +08:00
suyl
145211bbe2 aa 2021-07-19 16:33:02 +08:00
suyl
e19d03ebba aa 2021-07-19 15:44:29 +08:00
suyl
10fb5c7cb1 aa 2021-07-19 11:05:29 +08:00
suyl
91abfc8835 aa 2021-07-19 10:55:03 +08:00
suyl
d946c5018a aa 2021-07-19 10:47:38 +08:00
suyl
7d8b48bb36 aa 2021-07-19 10:24:16 +08:00
suyl
cd1c03c834 aa 2021-07-19 10:21:23 +08:00
suyl
0c41bf7c42 aa 2021-07-19 09:27:02 +08:00
suyl
a7f28b59de aa 2021-07-16 17:05:49 +08:00
suyl
10811a669b aa 2021-07-16 17:05:13 +08:00
suyl
14ec99a8be 投诉 2021-07-16 10:34:18 +08:00
suyl
89f9dd5b6e aa 2021-07-16 10:01:40 +08:00
suyl
828264a51b initjxprint 2021-07-16 09:50:47 +08:00
suyl
e83f7b7a17 aa 2021-07-16 09:46:53 +08:00
suyl
5ac2885861 aa 2021-07-16 09:15:17 +08:00
suyl
2780df1dbd aa 2021-07-15 16:15:13 +08:00
suyl
9dd291b132 aa 2021-07-15 16:05:53 +08:00
suyl
ffe72bcdbd jxprint 2021-07-15 16:01:36 +08:00
suyl
b7bd0015ef aa 2021-07-15 15:40:27 +08:00
suyl
71cb0a62a4 jxprint 2021-07-15 15:35:28 +08:00
suyl
3172f67e20 aa 2021-07-15 14:40:46 +08:00
suyl
91b95bb2cc aa 2021-07-15 14:32:03 +08:00
suyl
aad04d5043 aa 2021-07-15 14:22:42 +08:00
suyl
06dca66631 aa 2021-07-15 14:18:25 +08:00
suyl
c1fbee7d22 aa 2021-07-15 14:16:26 +08:00
suyl
5f2ce8e415 a 2021-07-15 14:13:05 +08:00
suyl
c4ac39eea8 aa 2021-07-15 14:06:51 +08:00
suyl
71419171c8 aa 2021-07-15 13:56:00 +08:00
suyl
25fea4d861 aa 2021-07-15 13:44:41 +08:00
suyl
b3901e6a7c aa 2021-07-15 11:44:18 +08:00
suyl
3c67bc1b65 test 2021-07-15 11:37:53 +08:00
suyl
a7827d893d 禁止调度 2021-07-14 18:37:21 +08:00
suyl
e1d865e42a aa 2021-07-14 14:19:27 +08:00
suyl
2b82822fb4 aa 2021-07-14 14:13:31 +08:00
suyl
9210794b35 aa 2021-07-14 14:00:04 +08:00
suyl
f6ce015ef5 aa 2021-07-14 13:52:21 +08:00
suyl
511528848a aa 2021-07-14 10:50:20 +08:00
suyl
c0024d2421 删除订单商品 2021-07-14 10:44:01 +08:00
suyl
3cf5025ff2 aa 2021-07-13 11:08:02 +08:00
suyl
10f7928e3a aa 2021-07-13 11:05:03 +08:00
suyl
a0e179819e aa 2021-07-13 09:42:52 +08:00
suyl
8919115a58 京西订单origin不算 2021-07-13 09:42:10 +08:00
suyl
29bf5da9e5 a 2021-07-13 09:32:43 +08:00
suyl
e1241c7af1 aa 2021-07-12 14:23:42 +08:00
suyl
a7f116a3ac 把日常跑的拆开看 2021-07-12 13:58:03 +08:00
suyl
30deedf220 美团售前同意条件 2021-07-12 12:03:18 +08:00
suyl
cbf8818d0d aa 2021-07-12 11:26:48 +08:00
suyl
d2b5df3393 aa 2021-07-12 09:18:24 +08:00
suyl
d8a2b91ebf aa 2021-07-09 18:03:37 +08:00
suyl
a19207eccc aa 2021-07-09 15:46:40 +08:00
suyl
c390178dc6 aa 2021-07-09 10:17:46 +08:00
suyl
e3c7ae9181 aa 2021-07-08 17:57:26 +08:00
suyl
896273f2c2 aa 2021-07-08 17:41:23 +08:00
suyl
2b143c0fd2 aa 2021-07-08 17:34:02 +08:00
suyl
6193d17b8b aa 2021-07-08 17:23:24 +08:00
suyl
9b2f3bb49a aa 2021-07-08 11:25:43 +08:00
suyl
2026d07e47 aa 2021-07-07 17:54:11 +08:00
suyl
106caf9666 aa 2021-07-07 17:39:43 +08:00
suyl
d49b104930 aa 2021-07-07 11:58:59 +08:00
suyl
5b5a132fe6 美团订单售前取消 2021-07-07 10:42:51 +08:00
suyl
43638334fc 补订单 2021-07-07 09:34:45 +08:00
suyl
88c1aa2e5e aa 2021-07-07 09:29:41 +08:00
suyl
46287cbb46 aa 2021-07-06 18:44:39 +08:00
suyl
048a84a026 aa 2021-07-06 14:55:34 +08:00
suyl
0bf5783a78 aa 2021-07-06 13:35:15 +08:00
suyl
dcc1b509fa aa 2021-07-06 10:16:55 +08:00
suyl
cc07e1c177 aa 2021-07-06 09:28:16 +08:00
suyl
f8727f9604 aa 2021-07-06 09:22:20 +08:00
suyl
fbf4932724 aa 2021-07-06 09:22:07 +08:00
suyl
a593d57a33 aa 2021-07-05 18:48:41 +08:00
suyl
273072882c aa 2021-07-05 16:53:08 +08:00
suyl
d16d91bf00 aa 2021-07-05 16:45:24 +08:00
suyl
41f919deca a 2021-07-05 11:57:24 +08:00
suyl
4e29eea5ed aa 2021-07-02 13:33:47 +08:00
suyl
e2edd85b73 aa 2021-07-02 10:33:37 +08:00
suyl
48d7bfc8d5 aa 2021-07-02 09:40:42 +08:00
suyl
f6c3442ef5 aa 2021-07-01 15:17:49 +08:00
suyl
b60f2e2d78 aa 2021-07-01 15:12:19 +08:00
suyl
d2b841b688 aa 2021-07-01 15:01:57 +08:00
suyl
06615102ca aa 2021-06-30 14:20:46 +08:00
suyl
96428eecc3 aa 2021-06-30 14:19:07 +08:00
suyl
323fe01518 aa 2021-06-30 14:07:56 +08:00
suyl
6fae4fd46b aa 2021-06-30 13:56:32 +08:00
suyl
184c35bc9b aa 2021-06-30 09:59:11 +08:00
suyl
32eb8cefe7 aa 2021-06-30 09:54:24 +08:00
suyl
b79603caf5 aa' 2021-06-30 09:52:44 +08:00
suyl
ebabe353c8 aa 2021-06-30 09:13:32 +08:00
suyl
e60f57b9db aa 2021-06-29 18:57:29 +08:00
suyl
7ff36b93b7 aa 2021-06-29 18:35:47 +08:00
suyl
9dbaaeda71 aa 2021-06-29 18:32:34 +08:00
suyl
2f23954966 aa 2021-06-29 18:28:55 +08:00
suyl
58f646d930 aa 2021-06-29 18:20:30 +08:00
suyl
c5ba6bf317 aa 2021-06-29 18:12:54 +08:00
suyl
4e2a0919e6 aa 2021-06-29 18:06:35 +08:00
suyl
36ec8f5036 aa 2021-06-29 17:54:32 +08:00
suyl
725d842374 aa 2021-06-29 17:22:01 +08:00
suyl
3d082a954a aa 2021-06-29 17:00:23 +08:00
suyl
4cedb56314 aa 2021-06-29 16:56:37 +08:00
suyl
3a7d377b91 aa 2021-06-29 16:25:37 +08:00
suyl
fd0ab123fc ueditor 2021-06-29 16:22:22 +08:00
suyl
f4bb820b56 aa 2021-06-29 15:48:02 +08:00
suyl
40d9677a26 aa 2021-06-29 15:46:14 +08:00
suyl
c51fc666b1 aa 2021-06-29 15:14:15 +08:00
suyl
87cf0e98d7 aa 2021-06-29 15:11:33 +08:00
suyl
1859e57aa3 aa 2021-06-29 15:09:48 +08:00
suyl
29e11663fc aa 2021-06-29 15:07:06 +08:00
suyl
3f4b979c67 aa 2021-06-29 14:57:05 +08:00
suyl
1276210d49 aa 2021-06-29 14:44:46 +08:00
suyl
3a2dfb1534 aa 2021-06-29 14:38:02 +08:00
suyl
c2749ba5d1 上传图片到微信post 2021-06-29 14:11:06 +08:00
suyl
dcb5377bd5 aa 2021-06-25 15:04:14 +08:00
suyl
06671a4e9b aa 2021-06-25 10:51:40 +08:00
suyl
c06e60cc8e aa 2021-06-25 10:23:45 +08:00
suyl
a52fcd06b6 aa 2021-06-25 09:55:53 +08:00
suyl
51e9cb4304 aa 2021-06-25 09:55:12 +08:00
suyl
469b99849c aa 2021-06-25 09:54:27 +08:00
suyl
6323b4fdc8 aa 2021-06-24 15:55:39 +08:00
suyl
45f0cddfd6 aa 2021-06-24 15:45:50 +08:00
suyl
63b5e1aa54 Merge branch 'master' of e.coding.net:rosydev/jx-callback 2021-06-24 14:27:45 +08:00
suyl
3c2978bcf5 Merge remote-tracking branch 'origin/jdshop' 2021-06-24 14:27:33 +08:00
suyl
0252ab0f53 aa 2021-06-24 14:22:40 +08:00
suyl
38a162969b aa 2021-06-24 14:20:00 +08:00
suyl
998ebe942f aa 2021-06-24 13:50:38 +08:00
suyl
56fb0eb6ad aa 2021-06-24 10:54:22 +08:00
suyl
1062523b2f aa 2021-06-24 10:49:43 +08:00
suyl
ecf155e9a9 aa 2021-06-23 17:39:23 +08:00
suyl
f7a9f3c033 aa 2021-06-23 17:16:11 +08:00
suyl
f8a8907e75 aa 2021-06-23 17:15:19 +08:00
suyl
2586ba37db aa 2021-06-23 17:04:42 +08:00
suyl
a2025bf705 aa 2021-06-23 17:02:03 +08:00
suyl
256dc9a102 aa 2021-06-23 16:59:15 +08:00
suyl
05604201cb aa 2021-06-23 16:51:15 +08:00
suyl
794a31a74e aa 2021-06-23 16:32:33 +08:00
suyl
2df3e2d6c8 aa 2021-06-23 16:31:11 +08:00
suyl
4f07f32834 aa 2021-06-23 16:27:54 +08:00
suyl
cf23588f4c aa 2021-06-23 16:23:46 +08:00
suyl
4282e226b0 aa 2021-06-23 15:37:21 +08:00
suyl
b2e420c0cc aa 2021-06-23 14:33:12 +08:00
suyl
1dbe19eb4f aa 2021-06-23 13:48:43 +08:00
suyl
396a02a40d aa 2021-06-23 11:56:04 +08:00
suyl
22c0a41f35 aa 2021-06-23 10:38:28 +08:00
suyl
f5ce85306c aa 2021-06-23 10:10:41 +08:00
suyl
2daf502fa4 aa 2021-06-23 10:09:50 +08:00
suyl
e2140a3723 aa 2021-06-23 10:07:32 +08:00
suyl
e684b3c15c aa 2021-06-23 10:05:42 +08:00
suyl
2a349c0f44 aa 2021-06-23 10:01:34 +08:00
suyl
b7b34bd6d2 aa 2021-06-23 09:59:07 +08:00
suyl
0999414560 aa 2021-06-23 09:41:35 +08:00
suyl
050da7cc59 aa 2021-06-22 17:48:53 +08:00
suyl
4df658305a aa 2021-06-22 17:24:18 +08:00
suyl
5f230d68d9 aa 2021-06-22 17:20:20 +08:00
suyl
7a0bc2ec02 aa 2021-06-22 16:55:01 +08:00
suyl
b2bd2facfe aa 2021-06-22 16:48:15 +08:00
suyl
f89fd3adab aa 2021-06-22 16:40:13 +08:00
suyl
565e3b66d6 aa 2021-06-22 16:22:36 +08:00
suyl
676c7bc46d aa 2021-06-22 15:29:53 +08:00
suyl
fb445b6e2f aa 2021-06-22 15:26:59 +08:00
suyl
ee1e9f6427 aa 2021-06-22 15:14:09 +08:00
suyl
38dbdcbdc9 aa 2021-06-22 14:59:34 +08:00
suyl
ea0426a88e aa 2021-06-22 14:42:24 +08:00
suyl
9e75e768e3 aa 2021-06-22 14:41:31 +08:00
suyl
27336a8da6 aa 2021-06-22 14:18:45 +08:00
suyl
e0c802ad71 aa 2021-06-22 14:15:47 +08:00
suyl
cb76826acb aa 2021-06-22 14:12:13 +08:00
suyl
71d5990552 aa 2021-06-22 14:04:32 +08:00
suyl
391a5a74a3 aa 2021-06-22 14:01:31 +08:00
suyl
f06350751e aa 2021-06-22 13:53:40 +08:00
suyl
dc257c74c1 aa 2021-06-22 13:47:51 +08:00
suyl
184339d848 aa 2021-06-22 11:46:04 +08:00
suyl
c187a3418d aa 2021-06-22 11:26:13 +08:00
suyl
ee33b5d3a7 aa 2021-06-22 11:15:17 +08:00
suyl
c634c56114 aa 2021-06-22 10:38:59 +08:00
suyl
4e90f3e6d8 aa 2021-06-22 10:12:14 +08:00
suyl
9cd5285598 aa 2021-06-22 10:11:42 +08:00
suyl
db08ac99a5 aa 2021-06-22 10:02:58 +08:00
suyl
5aaf6c1d2c aa 2021-06-22 09:46:49 +08:00
suyl
e885b0e055 aa 2021-06-22 09:33:47 +08:00
suyl
bfd2f930c1 aa 2021-06-21 18:35:36 +08:00
suyl
5aeeb4a941 aa 2021-06-21 18:32:14 +08:00
suyl
7feb689ed3 aa 2021-06-21 17:58:03 +08:00
suyl
eea15cf7c0 aa 2021-06-21 17:40:08 +08:00
suyl
734b37c609 aa 2021-06-21 17:36:47 +08:00
suyl
6f72310df7 aa 2021-06-21 17:10:33 +08:00
suyl
5396545a7c aa 2021-06-21 17:04:30 +08:00
suyl
6d1023deea aa 2021-06-21 16:20:23 +08:00
suyl
be99f08a31 aa 2021-06-21 16:17:45 +08:00
suyl
48fe15173a aa 2021-06-21 15:59:19 +08:00
suyl
e86f6e3d4c aa 2021-06-21 15:56:34 +08:00
suyl
c827df8e74 aa 2021-06-21 15:49:23 +08:00
suyl
1926e3b312 aa 2021-06-21 15:43:22 +08:00
suyl
80a967622c aa 2021-06-21 15:28:24 +08:00
suyl
e63c7a0286 aa 2021-06-21 14:57:48 +08:00
suyl
559c5b7f2b aa 2021-06-21 13:31:47 +08:00
suyl
4910288c94 aa 2021-06-21 11:45:10 +08:00
suyl
00ee8aba4f aa 2021-06-21 11:28:08 +08:00
suyl
cee47b50b9 aa 2021-06-21 11:07:19 +08:00
suyl
6c5310f64c aa 2021-06-21 10:56:10 +08:00
suyl
aac18a21dc aa 2021-06-21 10:46:32 +08:00
suyl
ad88235942 aa 2021-06-21 10:40:16 +08:00
suyl
f388a43480 aa 2021-06-21 10:18:45 +08:00
suyl
faa10e4069 aa 2021-06-21 09:55:36 +08:00
suyl
90a3720de6 aa 2021-06-21 09:47:31 +08:00
suyl
0de165f792 aa 2021-06-21 09:08:13 +08:00
suyl
cf0a41ff80 aa 2021-06-18 18:47:41 +08:00
suyl
1b32594473 aa 2021-06-18 18:25:58 +08:00
suyl
9f78cd10c2 aa 2021-06-18 18:03:34 +08:00
suyl
02f0e297e2 aa 2021-06-18 17:41:44 +08:00
suyl
cff1aed9e9 aa 2021-06-18 16:52:34 +08:00
suyl
5b1e37ffd7 aa 2021-06-18 16:11:39 +08:00
suyl
b1f65097d4 aa 2021-06-18 14:19:57 +08:00
suyl
cd4eac9e34 aa 2021-06-18 14:04:03 +08:00
suyl
863c062a33 aa 2021-06-18 14:01:09 +08:00
suyl
abac0b5576 aa 2021-06-18 13:51:05 +08:00
suyl
8424c617da aa 2021-06-18 11:31:39 +08:00
suyl
03ef52656c aa 2021-06-18 10:53:33 +08:00
suyl
921255c4e8 aa 2021-06-18 10:48:54 +08:00
suyl
eefcf2ec1e aa 2021-06-18 10:29:15 +08:00
suyl
5a311c8e34 aa 2021-06-18 10:26:20 +08:00
suyl
4579a52315 aa 2021-06-18 10:08:49 +08:00
suyl
a63ac58140 aa 2021-06-18 09:16:33 +08:00
suyl
e9e8859406 aa 2021-06-18 09:04:13 +08:00
suyl
4a779a08a5 aa 2021-06-17 19:00:54 +08:00
suyl
921a3bfffd aa 2021-06-17 18:34:13 +08:00
suyl
177156dcba aa 2021-06-17 18:09:06 +08:00
suyl
8229f06272 aa 2021-06-17 17:40:18 +08:00
suyl
761bd82a96 aa 2021-06-17 17:29:31 +08:00
suyl
ab855c884f aa 2021-06-17 15:12:46 +08:00
suyl
521039d001 aa 2021-06-17 13:52:34 +08:00
suyl
3fa4dd77ef aa 2021-06-17 11:19:30 +08:00
suyl
f47d85d691 aa 2021-06-17 11:18:40 +08:00
suyl
30d521fc44 aa 2021-06-17 11:17:20 +08:00
suyl
4022b8eab9 aa 2021-06-17 10:38:37 +08:00
suyl
df0f832242 aa 2021-06-17 10:14:21 +08:00
suyl
c037b8df1f aa 2021-06-17 10:10:34 +08:00
suyl
ee614ea369 aa 2021-06-17 10:06:21 +08:00
suyl
63f8ec3cea aa 2021-06-17 09:10:59 +08:00
suyl
36c3b3cc78 aa 2021-06-16 17:28:31 +08:00
suyl
cfeb6f8858 aa 2021-06-16 14:47:18 +08:00
suyl
4a907607e3 aa 2021-06-15 14:11:28 +08:00
suyl
31e615d3de aa 2021-06-15 11:51:56 +08:00
suyl
9d5e9b10c0 aa 2021-06-15 10:38:29 +08:00
suyl
c57d3dabb5 aa 2021-06-15 10:15:47 +08:00
suyl
b4688c4a77 aa 2021-06-11 09:58:48 +08:00
suyl
2c25f3bfa3 aa 2021-06-10 18:41:58 +08:00
suyl
8f6f185a30 aa 2021-06-10 18:02:04 +08:00
suyl
02f40a608a aa 2021-06-10 17:46:33 +08:00
suyl
09c3db51c9 aa 2021-06-10 17:26:22 +08:00
suyl
897ecdcca0 aa 2021-06-10 17:12:54 +08:00
suyl
afff3d43c1 aa 2021-06-10 15:26:41 +08:00
suyl
4f2ef2ddda aa 2021-06-10 15:17:14 +08:00
suyl
e32b46635a aa 2021-06-10 14:37:08 +08:00
suyl
7a6622724f aa 2021-06-10 11:01:01 +08:00
suyl
a3078bc1b6 aa 2021-06-10 10:58:42 +08:00
suyl
992642d3f8 aa 2021-06-10 10:48:38 +08:00
suyl
01084ffc8a aa 2021-06-10 10:32:35 +08:00
suyl
f39e49d72f aa 2021-06-10 10:11:57 +08:00
suyl
c63e52d3ec aa 2021-06-10 09:46:44 +08:00
suyl
75693625c0 aa 2021-06-10 09:45:03 +08:00
suyl
5cec9e6f3c aa 2021-06-09 18:53:57 +08:00
suyl
edd20e84ce aa 2021-06-09 18:50:22 +08:00
suyl
a04caf8675 aa 2021-06-09 18:45:48 +08:00
suyl
624182a528 aa 2021-06-09 18:34:24 +08:00
suyl
1bce2e36af aa 2021-06-09 18:17:09 +08:00
suyl
fd783476e4 aa 2021-06-09 18:10:27 +08:00
suyl
76b04adb5d aa 2021-06-09 17:19:24 +08:00
suyl
a76b6c5aaa aa 2021-06-09 16:50:02 +08:00
suyl
b2d5395c29 aa 2021-06-09 16:44:22 +08:00
suyl
79af943453 aa 2021-06-09 16:37:56 +08:00
suyl
41549bb2d4 aa 2021-06-09 16:29:40 +08:00
suyl
c099780258 aa 2021-06-09 16:25:02 +08:00
suyl
1b2b61b5d8 aa 2021-06-09 16:10:26 +08:00
suyl
db38799bf8 aa 2021-06-09 15:14:04 +08:00
suyl
959563bc88 aa 2021-06-09 14:08:21 +08:00
suyl
f9bb1d3dd2 aa 2021-06-09 13:44:30 +08:00
suyl
ba9db17339 aa 2021-06-09 11:32:39 +08:00
suyl
2cefd8e2cd aa 2021-06-09 10:43:31 +08:00
suyl
d77bffabf2 aa 2021-06-09 10:06:28 +08:00
suyl
bfa22217fa aa 2021-06-09 09:56:18 +08:00
suyl
5f1f3f744d aa 2021-06-09 09:53:47 +08:00
suyl
545c625a5b aa 2021-06-09 09:46:16 +08:00
suyl
1ef746957f aa 2021-06-08 17:08:45 +08:00
suyl
8c766e815f aa 2021-06-08 15:37:38 +08:00
suyl
73d51012d6 aa 2021-06-08 14:01:33 +08:00
suyl
74c0565ad0 aa 2021-06-08 13:57:47 +08:00
suyl
e1a26c1444 aa 2021-06-08 11:19:31 +08:00
suyl
cf8a9d9504 aa 2021-06-08 10:47:43 +08:00
suyl
7065dc8cd4 aa 2021-06-08 10:30:09 +08:00
suyl
2299750c68 test 2021-06-08 09:59:31 +08:00
suyl
9e21b8ed11 aa 2021-06-07 18:19:52 +08:00
suyl
89a036f0ac aa 2021-06-07 18:08:32 +08:00
suyl
4279c55757 aa 2021-06-07 17:58:09 +08:00
suyl
dcaa6ee324 aa 2021-06-07 17:49:36 +08:00
suyl
68783034bc aa 2021-06-07 16:25:27 +08:00
suyl
1844055a4a aa 2021-06-07 15:43:38 +08:00
suyl
c4eecaffef aa 2021-06-07 14:31:43 +08:00
suyl
a5e63f1484 aa 2021-06-07 13:40:44 +08:00
suyl
9f37c3de71 aa 2021-06-07 11:33:26 +08:00
suyl
bd72b79987 aa 2021-06-07 09:17:12 +08:00
suyl
d70bba284f aa 2021-06-04 18:25:36 +08:00
suyl
bc5b5caa99 aa 2021-06-04 17:27:07 +08:00
suyl
a912bbf2d2 aa 2021-06-04 17:24:32 +08:00
suyl
b53c570a39 aa 2021-06-04 17:15:45 +08:00
suyl
a103a0cf56 aa 2021-06-04 17:12:43 +08:00
suyl
bd428e9a0d aa 2021-06-04 17:07:25 +08:00
suyl
6e6a16b7f1 aa 2021-06-04 17:05:15 +08:00
suyl
a2226b77bd aa 2021-06-04 17:03:35 +08:00
suyl
875fffeed3 aa 2021-06-04 16:29:55 +08:00
suyl
2688ec472c aa 2021-06-04 16:04:26 +08:00
suyl
4fa827cbc3 aa 2021-06-04 15:21:31 +08:00
suyl
bc3071788f aa 2021-06-04 15:18:41 +08:00
suyl
17c4e54468 aa 2021-06-04 15:14:59 +08:00
suyl
58b4ea5856 aa 2021-06-04 14:59:37 +08:00
suyl
8c222ece76 aa 2021-06-04 14:50:42 +08:00
suyl
2ac889968e aa 2021-06-04 11:18:46 +08:00
suyl
508d81474c aa 2021-06-04 11:10:39 +08:00
suyl
621a40e399 aa 2021-06-04 10:14:15 +08:00
suyl
0043d5abc6 aa 2021-06-03 18:19:18 +08:00
suyl
320aae9b18 aa 2021-06-03 18:15:00 +08:00
suyl
6a0e97f555 aa 2021-06-03 18:11:27 +08:00
suyl
e0bba30696 aa 2021-06-03 17:24:36 +08:00
suyl
f4aab63317 aa 2021-06-03 16:37:31 +08:00
suyl
384aa5500a aa 2021-06-03 16:19:54 +08:00
suyl
588f71abcf aa 2021-06-03 15:29:36 +08:00
suyl
48be414a4f aa 2021-06-03 15:29:18 +08:00
suyl
d57530a6b1 aa 2021-06-03 15:02:42 +08:00
suyl
71da34111c aa 2021-06-03 14:34:23 +08:00
suyl
86eb5f6951 aa 2021-06-03 09:44:30 +08:00
suyl
3c39e645ff aa 2021-06-03 09:13:00 +08:00
suyl
34e3dc9910 aa 2021-06-02 18:28:38 +08:00
suyl
c219481ad5 aa 2021-06-02 16:28:41 +08:00
suyl
f36caf0a90 aa 2021-06-02 11:46:53 +08:00
suyl
866fe39ce5 aa 2021-06-02 11:18:35 +08:00
suyl
15c4ea1456 aa 2021-06-02 09:35:52 +08:00
suyl
7fc33acb6d aa 2021-06-01 17:26:18 +08:00
suyl
4df9db3ece aa 2021-06-01 16:07:59 +08:00
suyl
3297672751 aa 2021-06-01 16:05:24 +08:00
suyl
588a2a1f72 aa 2021-06-01 15:54:26 +08:00
suyl
92d8144065 aa 2021-06-01 13:40:44 +08:00
suyl
23d8bed1f4 aa 2021-06-01 11:44:35 +08:00
suyl
279b6028cd aa 2021-06-01 11:34:33 +08:00
suyl
94cde0f6d7 aa 2021-06-01 10:52:01 +08:00
suyl
b8f0d43a0d aa 2021-06-01 10:28:31 +08:00
suyl
e9495a4db2 aa 2021-05-31 15:56:12 +08:00
suyl
567687efad aa 2021-05-31 15:32:53 +08:00
suyl
3212452527 aa 2021-05-31 15:15:11 +08:00
suyl
8281dc3136 aa 2021-05-31 15:09:13 +08:00
suyl
213136e6fa aa 2021-05-31 15:08:25 +08:00
suyl
5acc738576 aa 2021-05-31 14:56:38 +08:00
suyl
fbcc7ac754 aa 2021-05-31 14:27:26 +08:00
suyl
ce5eb03e12 aa 2021-05-31 11:30:20 +08:00
suyl
607194d611 aa 2021-05-31 11:07:15 +08:00
suyl
6ab8265cfa aa 2021-05-31 10:50:29 +08:00
suyl
2e567bb2f4 aa 2021-05-31 10:32:42 +08:00
suyl
77a0571a60 aa 2021-05-31 10:17:42 +08:00
suyl
28040a7b8b aa 2021-05-31 09:57:12 +08:00
suyl
16aab5156c aa 2021-05-27 14:47:08 +08:00
suyl
3edfaadbfa aa 2021-05-27 14:31:43 +08:00
suyl
4dd8e861fe aa 2021-05-27 14:09:16 +08:00
suyl
f1c26fceec aa 2021-05-27 14:01:23 +08:00
suyl
c0929371cc aa 2021-05-27 13:56:43 +08:00
suyl
9eac3c98b4 aa 2021-05-27 11:52:06 +08:00
suyl
35d5a5cdc6 aa 2021-05-27 11:48:21 +08:00
suyl
8e57df5a8d aa 2021-05-27 11:41:50 +08:00
suyl
0dd82e1d7b aa 2021-05-27 10:55:14 +08:00
suyl
3dc1c1b4c9 aa 2021-05-26 16:41:35 +08:00
suyl
a3bf097bc0 aa 2021-05-26 16:31:08 +08:00
suyl
badb8ae4ca aa 2021-05-26 15:17:43 +08:00
suyl
f7e824b88c aa 2021-05-26 15:13:04 +08:00
suyl
99d0f32a7e aa 2021-05-26 14:56:31 +08:00
suyl
166a8ca76b aa 2021-05-26 10:44:10 +08:00
suyl
304fac1dd8 aa 2021-05-26 10:37:48 +08:00
suyl
21990fa123 aa 2021-05-26 10:28:59 +08:00
suyl
469209fe82 aa 2021-05-26 10:12:39 +08:00
suyl
a8f0a39204 a 2021-05-26 10:07:15 +08:00
suyl
e477f80a24 aa 2021-05-26 09:58:37 +08:00
suyl
d8ccfa3234 aa 2021-05-26 09:56:01 +08:00
suyl
77f43f2aee aa 2021-05-26 09:41:05 +08:00
suyl
ed7a761ab6 aa 2021-05-26 09:16:12 +08:00
suyl
d43f03fdda aa 2021-05-26 09:02:08 +08:00
suyl
b2efe6b5b3 aa 2021-05-25 18:28:43 +08:00
suyl
6d366d902f aa 2021-05-25 18:20:50 +08:00
suyl
4e6f7ae859 aa 2021-05-25 18:03:49 +08:00
suyl
e4e959a9f8 aa 2021-05-25 17:57:31 +08:00
suyl
d0752a0912 aa 2021-05-25 17:56:39 +08:00
suyl
e4cc9d3dd9 a 2021-05-25 16:14:51 +08:00
suyl
ad4deafa87 a 2021-05-25 16:02:00 +08:00
suyl
bb525bf3e3 aa 2021-05-25 15:53:24 +08:00
suyl
5dee48bde2 qywx 2021-05-25 14:48:41 +08:00
suyl
ab678fcd7b aa 2021-05-24 17:09:32 +08:00
suyl
3ed482c6f9 aa 2021-05-24 17:08:55 +08:00
suyl
eb5231d847 aa 2021-05-24 15:48:00 +08:00
suyl
c1908dcd8f aa 2021-05-24 15:25:08 +08:00
suyl
d986be7cad aa 2021-05-24 14:42:20 +08:00
suyl
5fe8987522 aa 2021-05-24 14:05:01 +08:00
suyl
f5673437d3 aa 2021-05-22 18:05:29 +08:00
suyl
7ed59caeb1 aa 2021-05-22 18:01:27 +08:00
suyl
1485e5431e aa 2021-05-22 17:56:06 +08:00
suyl
7f365354c3 aa 2021-05-22 17:46:00 +08:00
suyl
b889e5a50e aa 2021-05-22 16:39:16 +08:00
suyl
ff62d8c472 aa 2021-05-22 15:59:52 +08:00
suyl
2d45a39017 aa 2021-05-22 15:48:23 +08:00
suyl
194d79293d aa 2021-05-22 15:41:48 +08:00
suyl
a83d409423 aa 2021-05-22 15:39:10 +08:00
suyl
fc7c2238b1 aa 2021-05-22 14:03:21 +08:00
suyl
1fefc30644 aa 2021-05-22 11:50:20 +08:00
suyl
0084921d13 aa 2021-05-22 11:45:59 +08:00
suyl
1026f491f4 aa 2021-05-22 11:17:45 +08:00
suyl
6540dfde8a aa 2021-05-22 11:16:32 +08:00
suyl
f3bdc35c35 aa 2021-05-22 10:52:36 +08:00
suyl
4223d912d1 aa 2021-05-22 09:12:13 +08:00
suyl
eaddb49b26 aa 2021-05-21 18:13:08 +08:00
suyl
654ae03bf1 aa 2021-05-21 18:08:50 +08:00
suyl
0b5701f2bb aa 2021-05-21 17:58:20 +08:00
suyl
51e559a032 a 2021-05-21 16:41:53 +08:00
suyl
cb6a2ef8f7 aa 2021-05-21 15:47:39 +08:00
suyl
0fd76bd77f aa 2021-05-21 14:59:10 +08:00
suyl
3517ab6a33 aa 2021-05-21 10:38:13 +08:00
suyl
3271c472b3 aa 2021-05-21 10:09:50 +08:00
suyl
fa09361fe5 aa 2021-05-21 10:09:25 +08:00
suyl
0bfc44beb5 aa 2021-05-21 10:04:52 +08:00
suyl
83183f29bc aa 2021-05-21 09:59:07 +08:00
suyl
e04494342f aa 2021-05-21 09:43:32 +08:00
suyl
d639dd788d aa 2021-05-21 08:40:22 +08:00
suyl
20e61f1317 aa 2021-05-20 18:10:46 +08:00
suyl
80e08d5b18 aa 2021-05-20 16:48:40 +08:00
suyl
037e6af401 aa 2021-05-20 16:44:53 +08:00
suyl
68b74c6d68 aa 2021-05-20 16:39:44 +08:00
suyl
6455a5fc26 aa 2021-05-20 16:37:36 +08:00
suyl
b20449bdfd aa 2021-05-20 15:48:51 +08:00
suyl
01b0b01187 aa 2021-05-20 15:46:18 +08:00
suyl
b08499204e aa 2021-05-20 13:50:22 +08:00
suyl
87ace3d7c4 aa 2021-05-20 13:47:18 +08:00
suyl
7884e7ba1a aa 2021-05-20 13:40:11 +08:00
suyl
2d0b50568e aa 2021-05-20 11:56:19 +08:00
suyl
c056a682d7 aa 2021-05-20 11:49:27 +08:00
suyl
24c264e39e aa 2021-05-20 11:42:54 +08:00
suyl
ce6edfe6a5 aa 2021-05-20 11:33:13 +08:00
suyl
48a2fb0a8f aa 2021-05-20 11:32:59 +08:00
suyl
32906db9e1 aa 2021-05-20 11:16:11 +08:00
suyl
cfbf7baf3b aa 2021-05-20 10:12:00 +08:00
suyl
1f89f20354 aa 2021-05-20 10:07:56 +08:00
suyl
4b2af44a88 aa 2021-05-20 10:04:42 +08:00
suyl
145195d338 aa 2021-05-20 09:33:49 +08:00
suyl
1cad95ef99 aa 2021-05-20 09:24:28 +08:00
suyl
3ee892c2d0 aa 2021-05-20 09:07:22 +08:00
suyl
c2c5242b9b aa 2021-05-19 17:38:26 +08:00
suyl
ac60f2d8ed aa 2021-05-19 17:23:16 +08:00
suyl
e313c61083 aa 2021-05-19 17:11:35 +08:00
suyl
f98b1dfa2e aa 2021-05-19 17:05:17 +08:00
suyl
07ebec3775 aa 2021-05-19 16:56:46 +08:00
suyl
5d44dfc76c aa 2021-05-19 16:25:01 +08:00
suyl
16956c2f08 aa 2021-05-19 16:21:20 +08:00
suyl
0bd761d7d7 aa 2021-05-19 16:18:31 +08:00
suyl
be9c90488f aa 2021-05-19 16:17:09 +08:00
suyl
ad74e90c19 aa 2021-05-19 15:27:27 +08:00
suyl
20004df8c5 aa 2021-05-19 14:23:19 +08:00
suyl
6d52187f19 短信模板 2021-05-19 13:42:41 +08:00
suyl
83bd9726ac aa 2021-05-19 10:25:12 +08:00
suyl
ec0df984ab aa 2021-05-19 08:51:37 +08:00
suyl
86513089ae aa 2021-05-17 15:50:48 +08:00
suyl
d74eed1b69 aa 2021-05-17 14:27:06 +08:00
suyl
1b4a20183c aa 2021-05-17 11:45:21 +08:00
suyl
506bf03829 aa 2021-05-17 11:03:06 +08:00
suyl
a5b28a9f66 aa 2021-05-17 09:33:56 +08:00
suyl
0bc820b3e5 aa 2021-05-14 17:45:47 +08:00
suyl
842d27f8b6 aa 2021-05-14 15:23:21 +08:00
suyl
4741634fdf aa 2021-05-14 13:55:33 +08:00
suyl
b00a60966b aa 2021-05-14 11:31:47 +08:00
suyl
a353963998 aa 2021-05-14 11:17:42 +08:00
suyl
6e485be7bb aa 2021-05-14 10:17:24 +08:00
suyl
4a495cb077 aa 2021-05-14 10:04:49 +08:00
suyl
87f5b06c52 aa 2021-05-14 09:50:42 +08:00
suyl
050c66a28b aa 2021-05-14 09:00:05 +08:00
suyl
80e6fc77c9 aa 2021-05-13 18:24:05 +08:00
suyl
861bffc87b aa 2021-05-13 18:14:30 +08:00
suyl
38d0f56e8e aa 2021-05-13 18:06:50 +08:00
suyl
7ddad6a679 aa 2021-05-13 18:02:58 +08:00
suyl
b4941c1548 aa 2021-05-13 17:50:34 +08:00
suyl
0ddd3e15d0 aa 2021-05-13 17:45:39 +08:00
suyl
721957baf1 aa 2021-05-13 17:40:17 +08:00
suyl
f9bdd78e2d aa 2021-05-13 17:34:24 +08:00
suyl
0390cfbf67 aa 2021-05-13 16:37:51 +08:00
suyl
8d3dfe406a aa 2021-05-13 16:20:38 +08:00
suyl
56515fc628 aa 2021-05-13 15:53:24 +08:00
suyl
1652f1c5b1 aa 2021-05-13 14:58:53 +08:00
suyl
b43d885436 aa 2021-05-13 13:47:38 +08:00
suyl
9293116e03 aa 2021-05-13 11:49:30 +08:00
suyl
a1801d13ac aa 2021-05-13 10:06:45 +08:00
suyl
44c7ac3fd2 aa 2021-05-13 09:14:48 +08:00
suyl
5b928a3e39 aa 2021-05-12 17:59:35 +08:00
suyl
287b9c6f8e aa 2021-05-12 17:44:13 +08:00
suyl
02c4ad310e aa 2021-05-12 17:22:44 +08:00
suyl
baffc6750f aa 2021-05-12 17:19:48 +08:00
suyl
54e2a0ffb9 aa 2021-05-12 16:31:53 +08:00
suyl
49fa0f3514 aa 2021-05-12 16:21:08 +08:00
suyl
89ff19ae6d aa 2021-05-12 16:18:11 +08:00
suyl
b00882859f aa 2021-05-12 16:05:16 +08:00
suyl
0bc913e993 aa 2021-05-12 11:56:05 +08:00
suyl
066d9c16e3 aa 2021-05-12 11:39:23 +08:00
suyl
85a5cb0226 aa 2021-05-12 11:36:31 +08:00
suyl
3d97d7d13d aa 2021-05-12 11:23:42 +08:00
suyl
9e550a16aa aa 2021-05-12 11:08:32 +08:00
suyl
76715b1dc6 aa 2021-05-12 10:57:59 +08:00
suyl
b8909a6bde aa 2021-05-12 09:00:04 +08:00
suyl
fa8f4f2f01 aa 2021-05-11 17:31:21 +08:00
suyl
6c16ce1652 aa 2021-05-11 17:25:31 +08:00
suyl
9ba84219b8 aa 2021-05-11 17:18:54 +08:00
suyl
46b20853ef aa 2021-05-11 17:15:42 +08:00
suyl
5bc0a91365 aa 2021-05-11 17:04:56 +08:00
suyl
46cdde3d39 aa 2021-05-11 16:55:26 +08:00
suyl
33dab7754a aa 2021-05-11 16:52:14 +08:00
suyl
f4cde621a2 aa 2021-05-11 16:45:39 +08:00
suyl
1f8bf71865 aa 2021-05-11 16:39:14 +08:00
suyl
f581387aa8 aa 2021-05-11 16:36:27 +08:00
suyl
deece80b16 aa 2021-05-11 16:26:59 +08:00
suyl
20718f4e9d aa 2021-05-11 16:14:07 +08:00
suyl
93d66d1c6a aa 2021-05-11 16:04:24 +08:00
suyl
c84d75e161 aa 2021-05-11 15:41:24 +08:00
suyl
1e0f5a0513 aa 2021-05-11 15:25:48 +08:00
suyl
851c581e2d aa 2021-05-11 15:17:26 +08:00
suyl
7654e279a3 aa 2021-05-11 15:10:52 +08:00
suyl
687e88d49b aa 2021-05-11 14:06:16 +08:00
suyl
26940b3a12 aa 2021-05-11 11:08:06 +08:00
suyl
1dd5b592a8 aa 2021-05-10 17:42:17 +08:00
suyl
a2a50f639b aa 2021-05-07 18:31:33 +08:00
suyl
5b6eec3d96 aa 2021-05-07 17:38:28 +08:00
suyl
9ba7cdb7db aa 2021-05-07 17:12:31 +08:00
suyl
78fd668f8b aa 2021-05-06 18:06:23 +08:00
suyl
52630908f6 aa 2021-05-06 17:27:37 +08:00
suyl
820abd00d6 aa 2021-05-06 16:17:44 +08:00
suyl
85d96a9e91 aa 2021-05-06 14:43:29 +08:00
suyl
abf6587cc0 aa 2021-05-06 13:36:53 +08:00
suyl
e8901253dd aa 2021-05-06 11:51:20 +08:00
suyl
ff5a74c39e aa 2021-05-06 11:28:01 +08:00
suyl
ba2914c1d9 aa 2021-05-06 11:17:57 +08:00
suyl
0a395ad67a aa 2021-05-06 11:07:01 +08:00
suyl
cb563936c0 aa 2021-05-06 09:28:50 +08:00
suyl
6c11ac29be aa 2021-04-29 18:17:58 +08:00
suyl
dbada6a3a8 aa 2021-04-29 17:36:52 +08:00
suyl
88d600d00c aa 2021-04-28 17:45:26 +08:00
suyl
64a251da34 aa 2021-04-28 17:27:43 +08:00
suyl
199ac9e495 aa 2021-04-28 17:22:40 +08:00
suyl
d9f3294893 aa 2021-04-28 17:08:02 +08:00
suyl
63e293ac74 aa 2021-04-28 15:04:23 +08:00
suyl
18987c669e aa 2021-04-28 14:48:50 +08:00
suyl
3ab5515ee6 aa 2021-04-28 14:43:21 +08:00
suyl
d4dec7cf2a aa 2021-04-28 14:33:11 +08:00
suyl
db4ee9ae55 aa 2021-04-27 09:44:17 +08:00
suyl
5590c170b9 aa 2021-04-27 09:30:11 +08:00
suyl
e5d02223b7 aa 2021-04-27 09:29:08 +08:00
suyl
4095161df5 aa 2021-04-27 09:19:29 +08:00
suyl
d0bd92a49f aa 2021-04-27 09:07:49 +08:00
suyl
e178ddc87a aa 2021-04-26 18:20:45 +08:00
suyl
e41a9a64d6 aa 2021-04-26 18:07:15 +08:00
suyl
bedf8f26b1 aa 2021-04-26 18:03:48 +08:00
suyl
334c174f67 aa 2021-04-26 17:59:20 +08:00
suyl
c5383d74ff 微信扫码建商品,重量13.5 转 int报错,round一下 2021-04-25 14:10:34 +08:00
suyl
bcf7cf6137 aa 2021-04-25 09:57:48 +08:00
suyl
f7725bcfc4 aa 2021-04-23 10:21:55 +08:00
suyl
58585baea9 aa 2021-04-23 09:54:04 +08:00
suyl
48df8aac52 aa 2021-04-22 17:28:31 +08:00
suyl
2b7ca32373 aa 2021-04-22 15:34:22 +08:00
suyl
0e9358131f aa 2021-04-22 14:26:24 +08:00
suyl
566c822533 aa 2021-04-22 14:23:32 +08:00
苏尹岚
87b0ebaef8 aa 2021-04-21 15:53:39 +08:00
苏尹岚
ab746f2af2 aa 2021-04-21 15:05:13 +08:00
苏尹岚
9a3c42b7a5 aa 2021-04-21 14:14:33 +08:00
苏尹岚
ae03393043 aa 2021-04-20 16:28:01 +08:00
苏尹岚
e38f3db539 aa 2021-04-20 16:15:11 +08:00
苏尹岚
627963b856 aa 2021-04-20 15:40:38 +08:00
苏尹岚
d302e881e7 aa 2021-04-20 15:24:55 +08:00
苏尹岚
2fc88aeec5 aa 2021-04-20 10:38:08 +08:00
苏尹岚
51c7cf1932 aa 2021-04-20 10:30:16 +08:00
苏尹岚
c6cbc1035c aa 2021-04-19 17:16:23 +08:00
苏尹岚
53c032e710 aa 2021-04-19 12:00:37 +08:00
苏尹岚
b4b806531a aa 2021-04-19 11:20:42 +08:00
苏尹岚
af2862bed8 aa 2021-04-19 10:09:05 +08:00
苏尹岚
20241e1728 aa 2021-04-19 10:00:18 +08:00
苏尹岚
7644a79884 aa 2021-04-19 09:59:34 +08:00
suyl
ccaab14b99 aa 2021-04-17 13:27:16 +08:00
苏尹岚
81ed9d41be aa 2021-04-16 18:03:05 +08:00
苏尹岚
19e5f5c140 aa 2021-04-16 17:58:21 +08:00
苏尹岚
e5115da909 aa 2021-04-16 17:43:21 +08:00
苏尹岚
f4ea8f5c73 aa 2021-04-16 16:40:50 +08:00
苏尹岚
8588dbb843 aa 2021-04-16 16:25:47 +08:00
苏尹岚
72388ffeae aa 2021-04-16 16:23:06 +08:00
苏尹岚
884f63cace aa 2021-04-16 16:04:45 +08:00
苏尹岚
be0f151537 aa 2021-04-16 15:58:45 +08:00
苏尹岚
dfcabde3c2 aa 2021-04-16 15:48:51 +08:00
苏尹岚
ae50d7f2b7 aa 2021-04-16 15:00:04 +08:00
苏尹岚
1aa365993c aa 2021-04-16 14:53:36 +08:00
苏尹岚
f22645a54b aa 2021-04-16 14:51:03 +08:00
苏尹岚
809c046994 aa 2021-04-16 14:42:54 +08:00
苏尹岚
1b3c71f470 aa 2021-04-16 13:55:04 +08:00
苏尹岚
6caf80bfab aa 2021-04-16 09:22:45 +08:00
苏尹岚
fb10b933f1 aa 2021-04-15 16:58:09 +08:00
苏尹岚
2c14e19f7a aa 2021-04-15 16:29:44 +08:00
苏尹岚
e4d95199b6 aa 2021-04-15 16:28:20 +08:00
苏尹岚
9e26d3c97f aa 2021-04-15 14:05:12 +08:00
苏尹岚
661c6b477e aa 2021-04-15 10:35:23 +08:00
苏尹岚
93271b13cc aa 2021-04-15 10:22:45 +08:00
苏尹岚
c8edb512fd aa 2021-04-15 10:03:15 +08:00
苏尹岚
abbd00ce49 aa 2021-04-15 09:45:52 +08:00
苏尹岚
b309641e5c aa 2021-04-14 17:21:27 +08:00
苏尹岚
2101a5282e aa 2021-04-14 13:41:07 +08:00
苏尹岚
25ca1abdf7 aa 2021-04-14 09:18:22 +08:00
苏尹岚
5efc05444f aa 2021-04-13 18:13:05 +08:00
苏尹岚
b074de535b aa 2021-04-13 17:40:30 +08:00
苏尹岚
806789f756 aa 2021-04-13 17:39:14 +08:00
苏尹岚
4f7fd9f1e2 aa 2021-04-13 14:03:11 +08:00
苏尹岚
d56f4ab906 aa 2021-04-13 13:48:38 +08:00
苏尹岚
8f75cbe3e6 aa 2021-04-13 11:35:16 +08:00
苏尹岚
9f98a6bda0 aa 2021-04-13 11:30:24 +08:00
苏尹岚
c07095187b aa 2021-04-13 10:51:04 +08:00
苏尹岚
42ddb8f4b3 aa 2021-04-13 10:46:50 +08:00
苏尹岚
82325109ef aa 2021-04-13 10:15:26 +08:00
苏尹岚
6c313cfe2b aa 2021-04-13 09:41:02 +08:00
苏尹岚
6369593549 aa 2021-04-13 09:29:17 +08:00
苏尹岚
ed9eb3946e aa 2021-04-13 09:27:06 +08:00
苏尹岚
9dbca78044 aa 2021-04-13 09:02:36 +08:00
苏尹岚
812432837d aa 2021-04-12 17:43:55 +08:00
苏尹岚
accfdcb4ab aa 2021-04-12 16:55:33 +08:00
苏尹岚
050eaa21f3 aa 2021-04-12 15:54:46 +08:00
苏尹岚
23f3fc0373 aa 2021-04-12 14:55:48 +08:00
苏尹岚
2d81f1d452 aa 2021-04-12 14:36:16 +08:00
苏尹岚
a679116c83 aa 2021-04-12 14:13:09 +08:00
苏尹岚
7c1d855ccf aa 2021-04-12 11:57:40 +08:00
苏尹岚
777ce0a036 aa 2021-04-12 11:52:51 +08:00
苏尹岚
4ab7a3cb34 aa 2021-04-12 11:40:49 +08:00
苏尹岚
e802d32dc0 aa 2021-04-12 11:30:48 +08:00
苏尹岚
fd4caa1a73 aa 2021-04-12 10:59:43 +08:00
苏尹岚
9839e1ed91 aa 2021-04-12 10:41:26 +08:00
苏尹岚
6cdc6038da aa 2021-04-12 10:34:31 +08:00
苏尹岚
47bc850dca aa 2021-04-12 10:24:33 +08:00
苏尹岚
52e2ef46d8 aa 2021-04-12 09:41:12 +08:00
苏尹岚
5368642312 aa 2021-04-12 09:32:53 +08:00
苏尹岚
fdf8022695 aa 2021-04-09 18:21:35 +08:00
苏尹岚
77fa1137ac aa 2021-04-09 18:03:13 +08:00
苏尹岚
ba144fe63b aa 2021-04-09 17:54:06 +08:00
苏尹岚
927d1b82b7 aa 2021-04-09 17:19:02 +08:00
苏尹岚
dc8ab361b7 aa 2021-04-09 15:29:25 +08:00
苏尹岚
d8b757cbc2 aa 2021-04-09 14:45:43 +08:00
苏尹岚
101b0e5c24 aa 2021-04-09 11:47:39 +08:00
苏尹岚
dc1f8df8f6 aa 2021-04-09 11:44:57 +08:00
苏尹岚
4078d6f8e3 aa 2021-04-09 11:31:23 +08:00
苏尹岚
f062cb371c aa 2021-04-09 11:20:24 +08:00
苏尹岚
b1868591d0 aa 2021-04-09 11:16:05 +08:00
苏尹岚
c670855e11 aa 2021-04-09 11:11:50 +08:00
苏尹岚
71c79f62d4 aa 2021-04-09 10:32:51 +08:00
苏尹岚
038f60595d aa 2021-04-09 10:15:28 +08:00
苏尹岚
a160037979 aa 2021-04-09 10:03:31 +08:00
苏尹岚
4722561a6e aa 2021-04-09 09:44:44 +08:00
苏尹岚
a71f903e00 aa 2021-04-08 18:01:52 +08:00
苏尹岚
855ad3a265 aa 2021-04-08 16:37:46 +08:00
苏尹岚
07f9e1a5f3 aa 2021-04-08 15:24:07 +08:00
苏尹岚
3cf833dac7 aa 2021-04-08 14:49:42 +08:00
苏尹岚
d8e891a30e aa 2021-04-08 14:46:13 +08:00
苏尹岚
51898baf86 aa 2021-04-08 14:43:39 +08:00
苏尹岚
0dfd67c7a2 aa 2021-04-08 14:36:05 +08:00
苏尹岚
0857bf1048 aa 2021-04-08 14:28:19 +08:00
苏尹岚
4a0eda6233 aa 2021-04-08 14:23:45 +08:00
苏尹岚
69cead93dc aa 2021-04-08 14:06:47 +08:00
苏尹岚
1f63dc8158 aa 2021-04-08 13:51:49 +08:00
苏尹岚
a11d5312be aa 2021-04-07 17:44:50 +08:00
苏尹岚
1e76399ef4 aa 2021-04-07 15:22:12 +08:00
苏尹岚
6dc8f9d451 aa 2021-04-07 15:11:13 +08:00
苏尹岚
95c60f62af aa 2021-04-07 15:03:24 +08:00
苏尹岚
868488acae aa 2021-04-07 14:52:19 +08:00
苏尹岚
66a56c2a61 aa 2021-04-07 14:48:12 +08:00
苏尹岚
07a6fd04fd aa 2021-04-07 14:45:04 +08:00
苏尹岚
7c6513e2b4 aa 2021-04-07 14:25:42 +08:00
苏尹岚
98f443379d aa 2021-04-07 14:00:43 +08:00
苏尹岚
b5aa8748ec aa 2021-04-07 11:37:50 +08:00
苏尹岚
4b25b4dbf7 aa 2021-04-07 11:32:04 +08:00
苏尹岚
809abf0795 aa 2021-04-07 11:18:58 +08:00
苏尹岚
d477b90ea2 aa 2021-04-07 10:58:11 +08:00
苏尹岚
553aa5c8fb aa 2021-04-07 10:56:08 +08:00
苏尹岚
d72afc0cfa aa 2021-04-07 09:32:38 +08:00
苏尹岚
8e1419f495 aa 2021-04-07 09:06:00 +08:00
苏尹岚
d030002bf6 aa 2021-04-07 09:00:38 +08:00
苏尹岚
d1bf1cc6b3 aa 2021-04-06 18:25:44 +08:00
苏尹岚
a66e7bc13d aa 2021-04-06 16:31:38 +08:00
苏尹岚
b84ff3e0f7 aa 2021-04-06 16:26:45 +08:00
苏尹岚
24c4c27efd aa 2021-04-06 15:00:47 +08:00
苏尹岚
3f895f0dc4 aa 2021-04-06 14:32:17 +08:00
苏尹岚
6fa79a7a0a aa 2021-04-06 13:44:46 +08:00
苏尹岚
2952285378 aa 2021-04-06 13:41:57 +08:00
苏尹岚
c4bd9f6c76 aa 2021-04-06 11:59:48 +08:00
苏尹岚
d302095877 aa 2021-04-06 11:52:09 +08:00
苏尹岚
ffc647b832 aa 2021-04-06 11:23:01 +08:00
苏尹岚
8c5d4abe7e aa 2021-04-06 11:18:42 +08:00
苏尹岚
d5a5a259e7 aa 2021-04-06 10:50:36 +08:00
苏尹岚
20b14bcb86 aa 2021-04-06 10:48:35 +08:00
苏尹岚
41dc1bfb0f aa 2021-04-06 10:22:09 +08:00
苏尹岚
00b540d313 aa 2021-04-06 10:00:19 +08:00
苏尹岚
115c5ea945 Merge branch 'jdshop' of e.coding.net:rosydev/jx-callback into jdshop 2021-04-06 08:51:21 +08:00
苏尹岚
73653d654a aa 2021-04-06 08:51:10 +08:00
suyl
51267259c7 aa 2021-04-04 19:57:35 +08:00
苏尹岚
e066132005 aa 2021-04-02 17:53:09 +08:00
苏尹岚
6f3fb65b57 aa 2021-04-02 17:30:54 +08:00
苏尹岚
789c101429 aa 2021-04-02 17:26:54 +08:00
苏尹岚
65cfe8e369 aa 2021-04-02 17:19:51 +08:00
苏尹岚
ad13f8eb57 aa 2021-04-02 17:13:59 +08:00
苏尹岚
be626824e4 aa 2021-04-02 16:52:35 +08:00
苏尹岚
d4a861e8af a 2021-04-02 15:59:40 +08:00
苏尹岚
e66e0d68d7 aa 2021-04-02 15:56:59 +08:00
苏尹岚
91930ee307 aa 2021-04-02 11:44:40 +08:00
苏尹岚
8429a5a27c aa 2021-04-02 11:03:01 +08:00
苏尹岚
0a92b20480 aa 2021-04-02 10:32:47 +08:00
苏尹岚
0bfaefe163 aa 2021-04-02 10:30:22 +08:00
苏尹岚
f1b842d90c aa 2021-04-02 10:23:25 +08:00
苏尹岚
aeb4b1b4b0 aa 2021-04-02 10:18:16 +08:00
苏尹岚
4ba5545c7d aa 2021-04-02 09:57:02 +08:00
苏尹岚
04ae92b33c aa 2021-04-02 09:55:36 +08:00
苏尹岚
f46afb51ed aa 2021-04-01 15:05:04 +08:00
苏尹岚
f33267afab aa 2021-04-01 14:50:34 +08:00
苏尹岚
78a077d30e aa 2021-04-01 14:07:08 +08:00
苏尹岚
721b9a7357 aa 2021-04-01 13:50:19 +08:00
苏尹岚
51c282c62b 果园京东token 2021-04-01 11:31:40 +08:00
苏尹岚
02965fa230 aa 2021-04-01 11:08:54 +08:00
苏尹岚
9ebee52e94 aa 2021-04-01 10:46:37 +08:00
苏尹岚
c5671965ac aa 2021-04-01 10:12:56 +08:00
苏尹岚
e4f9c547a9 aa 2021-04-01 09:51:47 +08:00
苏尹岚
cc12d82076 aa 2021-04-01 09:45:39 +08:00
苏尹岚
11f607481f aa 2021-04-01 09:35:06 +08:00
苏尹岚
999765eb08 aa 2021-03-31 17:00:41 +08:00
苏尹岚
b784fa92ca aa 2021-03-31 16:42:26 +08:00
苏尹岚
e3d995c85d aa 2021-03-31 16:37:04 +08:00
苏尹岚
6bf4ce45a5 aa 2021-03-31 16:20:11 +08:00
苏尹岚
9863f02757 aa 2021-03-31 16:01:30 +08:00
苏尹岚
3cb180a48d aa 2021-03-31 15:57:50 +08:00
苏尹岚
1208b4357e aa 2021-03-31 15:53:06 +08:00
苏尹岚
423c1f8845 aa 2021-03-31 15:37:59 +08:00
苏尹岚
ebb7424282 aa 2021-03-31 14:52:00 +08:00
苏尹岚
90f16f87f2 aa 2021-03-31 13:45:56 +08:00
苏尹岚
d6d2688545 aa 2021-03-31 11:51:45 +08:00
苏尹岚
9564d04538 aa 2021-03-31 11:38:05 +08:00
苏尹岚
6378fa103d a 2021-03-31 11:24:28 +08:00
苏尹岚
bc951c1a59 aa 2021-03-31 10:00:28 +08:00
苏尹岚
125c335c80 aa 2021-03-30 17:42:41 +08:00
苏尹岚
0dd7235485 aa 2021-03-30 17:39:07 +08:00
苏尹岚
b9f7d7f53a 饿百订单自提核销 2021-03-30 15:57:37 +08:00
苏尹岚
02bdeb7b9d 美团饿百流量活动通知 2021-03-30 14:35:15 +08:00
苏尹岚
06685fa638 aa 2021-03-30 14:05:22 +08:00
苏尹岚
5bad08f487 aa 2021-03-30 11:00:32 +08:00
苏尹岚
eaa5d71a82 aa 2021-03-30 10:53:47 +08:00
苏尹岚
ac2bb2bcfe aa 2021-03-30 10:19:36 +08:00
苏尹岚
c56500548c aa 2021-03-29 18:30:07 +08:00
苏尹岚
f7b3a4df3f aa 2021-03-29 16:29:55 +08:00
苏尹岚
37c1599279 aa 2021-03-29 15:32:20 +08:00
苏尹岚
34841c3bfd aa 2021-03-29 11:08:10 +08:00
苏尹岚
69bcb8a6aa aa 2021-03-29 10:56:39 +08:00
苏尹岚
f15d8654a3 aa 2021-03-29 10:54:39 +08:00
苏尹岚
90ec474f19 aa 2021-03-29 10:28:20 +08:00
苏尹岚
f0fcf84ddb aa 2021-03-29 10:19:53 +08:00
苏尹岚
1e663b5f57 aa 2021-03-29 10:02:51 +08:00
苏尹岚
213c1b902f aa 2021-03-29 09:51:17 +08:00
苏尹岚
fcc482a36a aa 2021-03-29 09:39:45 +08:00
苏尹岚
103a8d14a5 aa 2021-03-26 18:04:13 +08:00
苏尹岚
e213e20df2 aa 2021-03-26 17:53:59 +08:00
苏尹岚
c05a3e14ec aa 2021-03-26 17:34:00 +08:00
苏尹岚
8cb61ef62d aa 2021-03-26 17:31:10 +08:00
苏尹岚
d56beac926 aa 2021-03-26 16:30:44 +08:00
苏尹岚
e45d85e999 aa 2021-03-26 16:29:27 +08:00
苏尹岚
559908276d aa 2021-03-26 16:13:17 +08:00
苏尹岚
8e561af698 aa 2021-03-26 16:11:37 +08:00
苏尹岚
9aa44c38d1 aa 2021-03-26 15:33:19 +08:00
苏尹岚
14b364724d aa 2021-03-26 15:12:19 +08:00
苏尹岚
d85011dd0a aa 2021-03-26 15:02:52 +08:00
苏尹岚
5afc312f8d aa 2021-03-26 14:57:41 +08:00
苏尹岚
e552c8453e aa 2021-03-26 14:48:20 +08:00
苏尹岚
b3c7d41958 aa 2021-03-26 13:52:10 +08:00
苏尹岚
11740281ca aa 2021-03-26 11:13:07 +08:00
苏尹岚
1100724061 aa 2021-03-26 10:51:28 +08:00
苏尹岚
7da263c887 aa 2021-03-26 10:46:25 +08:00
苏尹岚
6551ec2d93 aa 2021-03-26 10:15:44 +08:00
苏尹岚
b0986a3da8 aa 2021-03-26 10:12:02 +08:00
苏尹岚
44b9677c3c aa 2021-03-26 09:59:42 +08:00
苏尹岚
0be1343529 aa 2021-03-26 09:54:20 +08:00
苏尹岚
4adacb7cec aa 2021-03-26 09:51:46 +08:00
苏尹岚
597b78f1f0 aa 2021-03-26 09:49:34 +08:00
苏尹岚
5c13c89954 aa 2021-03-26 09:32:31 +08:00
苏尹岚
c269768e5b aa 2021-03-26 09:29:15 +08:00
苏尹岚
ba8e3cb957 aa 2021-03-26 09:27:04 +08:00
苏尹岚
bf71bcd0e4 aa 2021-03-26 09:21:42 +08:00
苏尹岚
7dd8c32cab aa 2021-03-26 08:58:49 +08:00
苏尹岚
d6380f1a56 Merge remote-tracking branch 'origin/mark' into jdshop 2021-03-25 18:23:44 +08:00
苏尹岚
a6062d17af aa 2021-03-25 18:09:07 +08:00
苏尹岚
ded9520700 aa 2021-03-25 18:04:55 +08:00
苏尹岚
86712582f2 aa 2021-03-25 17:55:03 +08:00
苏尹岚
51d70c03d1 aa 2021-03-25 17:50:24 +08:00
苏尹岚
42f4c89771 aa 2021-03-25 17:47:14 +08:00
苏尹岚
dd038c8de2 aa 2021-03-25 17:41:12 +08:00
苏尹岚
e61db3ce10 aa 2021-03-25 17:38:41 +08:00
苏尹岚
964f13e2f1 aa 2021-03-25 17:30:24 +08:00
苏尹岚
735a35e97e aa 2021-03-25 17:29:40 +08:00
苏尹岚
8f0e1ecb2f aa 2021-03-25 17:25:17 +08:00
苏尹岚
f2b8089536 aa 2021-03-25 17:20:21 +08:00
苏尹岚
604317bb78 aa 2021-03-25 16:52:40 +08:00
苏尹岚
6da9b98dc9 aa 2021-03-25 16:46:46 +08:00
苏尹岚
fba334121e aa 2021-03-25 16:33:24 +08:00
苏尹岚
6ec18af939 aa 2021-03-25 16:28:15 +08:00
苏尹岚
9450b30d49 aa 2021-03-25 16:22:55 +08:00
苏尹岚
304b1dfd56 aa 2021-03-25 16:21:59 +08:00
苏尹岚
b540ba28f0 aa 2021-03-25 16:20:35 +08:00
苏尹岚
185d51dd49 a 2021-03-25 16:17:48 +08:00
苏尹岚
fe8ee55d90 aa 2021-03-25 16:14:53 +08:00
苏尹岚
ab52769654 aa 2021-03-25 16:12:49 +08:00
苏尹岚
27aceae1d3 aa 2021-03-25 16:10:43 +08:00
苏尹岚
c647fdb17e aa 2021-03-25 15:51:15 +08:00
苏尹岚
0bf471365c aa 2021-03-25 11:59:02 +08:00
苏尹岚
989277c929 aa 2021-03-25 11:51:35 +08:00
苏尹岚
e35d761fea aa 2021-03-25 11:48:52 +08:00
苏尹岚
d54c9a8d07 aa 2021-03-25 11:43:44 +08:00
苏尹岚
ca8f2c8f9d aa 2021-03-25 11:38:32 +08:00
苏尹岚
4c19bd32a0 aa 2021-03-25 11:30:23 +08:00
苏尹岚
baae588ec4 aa 2021-03-25 11:20:49 +08:00
苏尹岚
e5495ef351 aa 2021-03-25 10:23:31 +08:00
苏尹岚
1f74c01397 aa 2021-03-25 10:04:35 +08:00
苏尹岚
17d31987b6 aa 2021-03-24 17:55:05 +08:00
苏尹岚
9647764894 aa 2021-03-24 17:06:02 +08:00
苏尹岚
08e2bc5dea aa 2021-03-24 17:02:14 +08:00
苏尹岚
67a11f61dd aa 2021-03-24 16:47:21 +08:00
苏尹岚
03f4ea45ad aa 2021-03-24 16:46:09 +08:00
苏尹岚
ec111a543a aa 2021-03-24 16:06:31 +08:00
苏尹岚
dda5e519bb aa 2021-03-24 15:29:31 +08:00
苏尹岚
bba3e273f6 aa 2021-03-24 10:17:11 +08:00
苏尹岚
08ddc2308d aa 2021-03-23 16:55:41 +08:00
苏尹岚
97a9605712 aa 2021-03-23 16:50:29 +08:00
苏尹岚
b40e508ac2 aa 2021-03-23 14:20:07 +08:00
苏尹岚
58cf995091 aa 2021-03-23 14:17:55 +08:00
苏尹岚
2211b15f4c aa 2021-03-23 14:13:57 +08:00
苏尹岚
9cba4e483c aa 2021-03-23 14:02:19 +08:00
苏尹岚
bbd2ca3487 aa 2021-03-23 08:55:06 +08:00
苏尹岚
34cab3adf9 aa 2021-03-22 16:03:14 +08:00
苏尹岚
be3476e351 aa 2021-03-22 14:06:46 +08:00
苏尹岚
c4fe124508 aa 2021-03-22 11:57:54 +08:00
苏尹岚
cc9f5d77b9 aa 2021-03-22 10:46:22 +08:00
苏尹岚
7c97ebc3d8 aa 2021-03-19 18:43:32 +08:00
苏尹岚
51837e2f15 aa 2021-03-19 18:35:10 +08:00
苏尹岚
2d3cecd1da aa 2021-03-19 18:09:23 +08:00
苏尹岚
3a8c83434c aa 2021-03-19 17:39:32 +08:00
苏尹岚
1cc13e5811 aa 2021-03-19 16:02:09 +08:00
苏尹岚
6dd3b55876 aa 2021-03-19 15:53:21 +08:00
苏尹岚
7e7cdce60e aa 2021-03-19 15:51:10 +08:00
苏尹岚
08bec358e7 aa 2021-03-19 15:23:56 +08:00
苏尹岚
2539799443 aa 2021-03-19 15:19:48 +08:00
苏尹岚
b076524fa0 aa 2021-03-19 15:17:42 +08:00
苏尹岚
531aee3f71 aa 2021-03-19 15:14:27 +08:00
苏尹岚
e184f7a856 aa 2021-03-19 15:11:08 +08:00
苏尹岚
bd2c116afe aa 2021-03-19 14:56:55 +08:00
苏尹岚
452fef7336 aa 2021-03-19 14:44:14 +08:00
苏尹岚
0f4806c178 aa 2021-03-19 14:43:25 +08:00
苏尹岚
6446b02cdc aa 2021-03-19 14:26:42 +08:00
苏尹岚
ee63b713de aa 2021-03-19 14:23:27 +08:00
苏尹岚
119c569618 aa 2021-03-19 14:06:00 +08:00
苏尹岚
b1f87f4334 aa 2021-03-19 14:01:38 +08:00
苏尹岚
89306f76b6 aa 2021-03-19 13:57:05 +08:00
苏尹岚
9ae3335206 aa 2021-03-19 11:40:54 +08:00
苏尹岚
b4efae54a1 aa 2021-03-19 11:35:37 +08:00
苏尹岚
dd34822b86 aa 2021-03-19 10:56:10 +08:00
苏尹岚
2ba2ff5994 aa 2021-03-19 10:45:27 +08:00
苏尹岚
8dba6fe19f aa 2021-03-19 10:01:54 +08:00
苏尹岚
c2954f52d2 aa 2021-03-19 10:00:49 +08:00
苏尹岚
e6b7893243 aa 2021-03-19 09:51:49 +08:00
苏尹岚
1fc7e9f5a0 aa 2021-03-19 09:48:59 +08:00
苏尹岚
ef53db347a aa 2021-03-19 09:41:26 +08:00
苏尹岚
7e20fb35fe aa 2021-03-19 09:31:45 +08:00
苏尹岚
3c6d727423 aa 2021-03-19 09:18:34 +08:00
苏尹岚
875c29f655 aa 2021-03-19 09:11:57 +08:00
苏尹岚
1f5f972402 aa 2021-03-18 18:20:58 +08:00
苏尹岚
4d4c5d6b9d aa 2021-03-18 17:50:53 +08:00
苏尹岚
ab9d270aa9 aa 2021-03-18 14:33:35 +08:00
苏尹岚
e1fced0a71 aa 2021-03-18 14:09:43 +08:00
苏尹岚
0f21a0df0b aa 2021-03-18 11:24:34 +08:00
苏尹岚
7bb3c81f00 aa 2021-03-18 10:53:37 +08:00
苏尹岚
fe489660b8 aa 2021-03-18 10:46:00 +08:00
苏尹岚
86ef0528a2 aa 2021-03-18 10:40:14 +08:00
苏尹岚
c87c32ead1 aa 2021-03-18 10:04:10 +08:00
苏尹岚
a17211c679 aa 2021-03-18 09:55:11 +08:00
苏尹岚
79291abfbc aa 2021-03-18 09:41:03 +08:00
苏尹岚
ab74e6517e aa 2021-03-18 09:36:20 +08:00
苏尹岚
bb59d1e341 aa 2021-03-18 09:29:15 +08:00
苏尹岚
dddd9fd117 aa 2021-03-18 09:22:00 +08:00
苏尹岚
2ab1018498 aa 2021-03-18 09:16:53 +08:00
苏尹岚
6c767e160a aa 2021-03-17 18:27:25 +08:00
苏尹岚
757983c756 aa 2021-03-17 18:22:32 +08:00
苏尹岚
e3ab368dda aa 2021-03-17 18:21:30 +08:00
苏尹岚
d690f8cfb7 aa 2021-03-17 18:04:44 +08:00
苏尹岚
c4bcc120a4 aa 2021-03-17 17:55:37 +08:00
苏尹岚
f0d41bc043 aa 2021-03-17 17:35:40 +08:00
苏尹岚
e0a1393eee aa 2021-03-17 17:14:57 +08:00
苏尹岚
f73783b2c9 aa 2021-03-17 17:10:03 +08:00
苏尹岚
371800dcf7 aa 2021-03-17 17:07:32 +08:00
苏尹岚
f0b659c276 aa 2021-03-17 16:57:20 +08:00
苏尹岚
9edf96c9d4 aa 2021-03-17 16:27:43 +08:00
苏尹岚
556fa0913d aa 2021-03-17 16:22:03 +08:00
苏尹岚
2c92e8ec94 aa 2021-03-17 16:02:05 +08:00
苏尹岚
1990f986f5 aa 2021-03-17 15:30:33 +08:00
苏尹岚
1ae86dcdf5 aa 2021-03-17 15:08:48 +08:00
苏尹岚
d40a381552 aa 2021-03-17 15:03:05 +08:00
苏尹岚
9dc520daa3 aa 2021-03-17 14:52:46 +08:00
苏尹岚
bb24236869 aa 2021-03-17 14:41:27 +08:00
苏尹岚
313667604a aa 2021-03-17 14:39:16 +08:00
苏尹岚
385d15fd52 aa 2021-03-17 14:35:05 +08:00
苏尹岚
ada4d6e023 aa 2021-03-17 14:31:03 +08:00
苏尹岚
c4e876ea2f aa 2021-03-17 14:13:59 +08:00
苏尹岚
67dc00e495 aa 2021-03-17 14:08:13 +08:00
苏尹岚
1441e31bae aa 2021-03-17 13:58:14 +08:00
苏尹岚
30e4b26ebf aa 2021-03-17 13:40:55 +08:00
苏尹岚
435a3a1a04 aa 2021-03-17 11:32:17 +08:00
苏尹岚
f02062d9f4 aa 2021-03-17 11:14:08 +08:00
苏尹岚
90860121bd aa 2021-03-17 10:44:38 +08:00
苏尹岚
3edd03b8e0 aa 2021-03-17 10:29:44 +08:00
苏尹岚
4a77161781 aa 2021-03-17 10:23:18 +08:00
苏尹岚
6f3577c92b aa 2021-03-17 10:20:55 +08:00
苏尹岚
9d370d88a8 aa 2021-03-17 09:54:45 +08:00
苏尹岚
2b53dbb708 aa 2021-03-17 09:21:57 +08:00
苏尹岚
71a11a333e aa 2021-03-17 09:04:23 +08:00
苏尹岚
4c52700e6a aa 2021-03-16 18:10:01 +08:00
苏尹岚
11f4c44da2 aa 2021-03-16 10:08:10 +08:00
苏尹岚
0c2ecff553 aa 2021-03-16 09:54:25 +08:00
苏尹岚
4f6001e413 aa 2021-03-16 09:25:24 +08:00
苏尹岚
8a17e0584b aa 2021-03-15 17:49:04 +08:00
苏尹岚
4f26f319ce aa 2021-03-15 17:44:01 +08:00
苏尹岚
aedb4e7649 aa 2021-03-15 17:36:17 +08:00
苏尹岚
a1b173fdd9 aa 2021-03-15 17:19:08 +08:00
苏尹岚
0672c4bdcb aa 2021-03-15 17:15:24 +08:00
苏尹岚
d9dd5859e0 aa 2021-03-15 17:08:18 +08:00
苏尹岚
fbe40b226c aa 2021-03-15 17:07:29 +08:00
苏尹岚
e136f2f2cd aa 2021-03-15 17:01:14 +08:00
苏尹岚
6b080b576d aa 2021-03-15 16:15:56 +08:00
苏尹岚
da6196275d aa 2021-03-15 16:05:11 +08:00
苏尹岚
d312acaf42 aa 2021-03-15 15:40:47 +08:00
苏尹岚
3a417753b7 aa 2021-03-15 14:18:32 +08:00
苏尹岚
26de1f03de aa 2021-03-15 13:50:36 +08:00
苏尹岚
8c526bc31f aa 2021-03-15 11:28:44 +08:00
苏尹岚
0d402ec65f aa 2021-03-15 11:17:31 +08:00
苏尹岚
09f5bf4edc aa 2021-03-15 09:58:32 +08:00
苏尹岚
341db8e564 aa 2021-03-15 09:53:58 +08:00
苏尹岚
375801ad27 aa 2021-03-15 09:21:59 +08:00
苏尹岚
99d4b4dd04 aa 2021-03-12 17:03:40 +08:00
苏尹岚
cd87619ac6 aa 2021-03-12 16:53:22 +08:00
苏尹岚
f47e36d04e aa 2021-03-12 16:22:57 +08:00
苏尹岚
47ce54c9af aa 2021-03-12 16:17:40 +08:00
苏尹岚
a5e37278aa aa 2021-03-12 16:14:22 +08:00
苏尹岚
e97baae8d1 aa 2021-03-12 15:57:29 +08:00
苏尹岚
3d39ce347e aa 2021-03-12 15:52:43 +08:00
苏尹岚
3cb0904e6f aa 2021-03-12 15:43:06 +08:00
苏尹岚
b93fba4bb5 aa 2021-03-12 15:37:42 +08:00
苏尹岚
303ec79cce aa 2021-03-12 14:45:50 +08:00
苏尹岚
a63206756f aa 2021-03-12 14:37:18 +08:00
苏尹岚
3016590f89 aa 2021-03-12 14:27:34 +08:00
苏尹岚
848848df8f aa 2021-03-12 14:19:54 +08:00
苏尹岚
66da206735 aa 2021-03-12 14:16:03 +08:00
苏尹岚
acb75f1e1f aa 2021-03-12 10:50:38 +08:00
苏尹岚
795893424d aa 2021-03-12 09:25:54 +08:00
苏尹岚
656e679140 aa 2021-03-12 09:15:47 +08:00
苏尹岚
52efee5f96 aa 2021-03-12 09:11:40 +08:00
苏尹岚
4b14277f29 aa 2021-03-11 18:21:48 +08:00
苏尹岚
ce5adfaafe aa 2021-03-11 17:51:53 +08:00
苏尹岚
452b61f9c9 aa 2021-03-11 17:41:18 +08:00
苏尹岚
91ea354d63 aa 2021-03-11 17:36:25 +08:00
苏尹岚
344ecb0d13 aa 2021-03-11 16:02:28 +08:00
苏尹岚
41c27faab7 aa 2021-03-11 15:10:54 +08:00
苏尹岚
a2978a94e5 aa 2021-03-11 14:42:12 +08:00
苏尹岚
a391a7b86d aa 2021-03-11 13:39:18 +08:00
苏尹岚
3fb52de653 aa 2021-03-11 11:39:36 +08:00
苏尹岚
f79e750ace aa 2021-03-11 10:53:13 +08:00
苏尹岚
33f6a0f304 aa 2021-03-11 10:14:55 +08:00
苏尹岚
136f54f7fe aa 2021-03-11 10:11:29 +08:00
苏尹岚
cd5356da62 aa 2021-03-11 10:08:38 +08:00
苏尹岚
132d2780f2 aa 2021-03-11 10:02:32 +08:00
苏尹岚
7469a2d11f aa 2021-03-11 09:54:53 +08:00
苏尹岚
7917274c26 aa 2021-03-11 09:52:16 +08:00
苏尹岚
dc7e916471 aa 2021-03-11 09:47:47 +08:00
苏尹岚
f25e490867 aa 2021-03-11 09:39:32 +08:00
苏尹岚
acc063bd09 aa 2021-03-11 09:31:53 +08:00
苏尹岚
c7737f1686 aa 2021-03-10 18:24:25 +08:00
苏尹岚
3df18ef931 aa 2021-03-10 18:16:35 +08:00
苏尹岚
1224e340c0 aa 2021-03-10 18:04:40 +08:00
苏尹岚
2364d4eae2 aa 2021-03-10 17:49:08 +08:00
苏尹岚
acacc3b2de aa 2021-03-10 17:42:43 +08:00
苏尹岚
a76e30bc35 aa 2021-03-10 17:25:59 +08:00
苏尹岚
8859a41bdf aa 2021-03-10 16:44:05 +08:00
苏尹岚
f52c1ad837 aa 2021-03-10 16:19:11 +08:00
苏尹岚
2f59fd1d51 aa 2021-03-10 16:16:22 +08:00
苏尹岚
9e17d72597 aa 2021-03-10 16:05:33 +08:00
苏尹岚
882fa65ea5 aa 2021-03-10 16:00:21 +08:00
苏尹岚
4d41b0dfcd aa 2021-03-10 15:55:40 +08:00
苏尹岚
e5e68f83f5 aa 2021-03-10 15:48:27 +08:00
苏尹岚
154a938979 aa 2021-03-10 15:46:52 +08:00
苏尹岚
176d39b7ed aa 2021-03-10 15:21:37 +08:00
苏尹岚
99e53d869e aa 2021-03-10 15:18:27 +08:00
苏尹岚
3080a707d2 aa 2021-03-10 14:58:40 +08:00
苏尹岚
527596becc aa 2021-03-10 14:48:00 +08:00
苏尹岚
6316344b94 aa 2021-03-10 14:44:33 +08:00
苏尹岚
dc523889f3 aa 2021-03-10 14:40:38 +08:00
苏尹岚
c7dbd7405d aa 2021-03-10 14:08:32 +08:00
苏尹岚
88ff46c0ee aa 2021-03-10 14:01:04 +08:00
苏尹岚
050cd4db15 aa 2021-03-10 13:51:15 +08:00
苏尹岚
a09bc75d82 aa 2021-03-10 12:01:29 +08:00
苏尹岚
54167eade1 aa 2021-03-10 11:51:06 +08:00
苏尹岚
9243b4b5f9 aa 2021-03-10 11:49:23 +08:00
苏尹岚
d66dfa7d44 aa 2021-03-10 11:44:20 +08:00
苏尹岚
d520dae549 aa 2021-03-10 11:25:20 +08:00
苏尹岚
55828db155 aa 2021-03-10 11:23:48 +08:00
苏尹岚
5cdade9b04 aa 2021-03-10 11:18:52 +08:00
苏尹岚
f409f00ef9 aa 2021-03-10 10:30:22 +08:00
苏尹岚
493f2ba97b aa 2021-03-10 10:10:55 +08:00
苏尹岚
89d722c729 aa 2021-03-09 18:01:11 +08:00
苏尹岚
f298706e06 aa 2021-03-09 17:19:56 +08:00
苏尹岚
660de753d4 aa 2021-03-09 13:54:01 +08:00
苏尹岚
3c355a16c5 aa 2021-03-09 13:42:14 +08:00
苏尹岚
83cbb071b0 aa 2021-03-09 11:59:23 +08:00
苏尹岚
244a874040 aa 2021-03-09 11:44:10 +08:00
苏尹岚
38c0ef8fa9 aa 2021-03-09 11:40:39 +08:00
苏尹岚
e0f6b09ef5 aa 2021-03-09 11:36:07 +08:00
苏尹岚
d5c90df9b7 aa 2021-03-09 11:30:22 +08:00
苏尹岚
9e48e96001 aa 2021-03-09 11:21:15 +08:00
苏尹岚
9d8377d453 aa 2021-03-09 11:17:09 +08:00
苏尹岚
767e3c1441 aa 2021-03-09 11:06:40 +08:00
苏尹岚
f2f46cb867 aa 2021-03-09 11:03:23 +08:00
苏尹岚
defbdb0462 aa 2021-03-09 09:40:35 +08:00
苏尹岚
952fc7183e aa 2021-03-09 09:33:44 +08:00
苏尹岚
c4c5ab3bfd aa 2021-03-08 18:30:23 +08:00
苏尹岚
eb0bc0b7c8 aa 2021-03-08 18:14:19 +08:00
苏尹岚
b968e844ac aa 2021-03-08 16:28:12 +08:00
苏尹岚
891286ea51 aa 2021-03-08 16:22:30 +08:00
苏尹岚
981ccb0e46 aa 2021-03-08 16:07:42 +08:00
苏尹岚
4c06b4a8c6 aa 2021-03-08 16:00:20 +08:00
苏尹岚
74db22c236 aa 2021-03-08 14:54:25 +08:00
苏尹岚
bc1ba8c524 aa 2021-03-08 09:17:05 +08:00
苏尹岚
8fd0057740 aa 2021-03-08 09:16:44 +08:00
苏尹岚
f9f37fa2b7 aa 2021-03-05 17:30:43 +08:00
苏尹岚
71f4d08d68 aa 2021-03-05 17:02:14 +08:00
苏尹岚
4f36ffc6fa aa 2021-03-05 16:07:06 +08:00
苏尹岚
ad40d2e0b2 aa 2021-03-05 14:45:43 +08:00
苏尹岚
1a0083fffd aa 2021-03-05 14:18:48 +08:00
苏尹岚
b2e83a782e aa 2021-03-05 14:18:26 +08:00
苏尹岚
5cc1cbe805 aa 2021-03-05 14:18:12 +08:00
苏尹岚
af38c5993d 美团菜市建店加上环境图 2021-03-05 11:27:08 +08:00
苏尹岚
37a678bad9 aa 2021-03-05 11:10:07 +08:00
苏尹岚
bfdd404d68 aa 2021-03-05 10:28:12 +08:00
苏尹岚
05fb4dbb25 aa 2021-03-05 10:03:14 +08:00
苏尹岚
d5401d902e aa 2021-03-04 17:36:14 +08:00
苏尹岚
2c035f55fa aa 2021-03-04 17:29:30 +08:00
苏尹岚
490ea5cdb8 aa 2021-03-04 17:19:04 +08:00
苏尹岚
a2af241bdc aa 2021-03-04 16:58:05 +08:00
苏尹岚
67e33a0be0 aa 2021-03-04 16:54:51 +08:00
苏尹岚
40cfa42170 aa 2021-03-04 16:52:18 +08:00
苏尹岚
b5bf9ade80 aa 2021-03-04 16:51:41 +08:00
苏尹岚
3735a0fcaa aa 2021-03-04 16:50:03 +08:00
苏尹岚
dda3d11583 aa 2021-03-04 16:49:45 +08:00
苏尹岚
f65c9f8355 aa 2021-03-04 16:48:47 +08:00
苏尹岚
a58ee4a597 aa 2021-03-04 16:47:26 +08:00
苏尹岚
8b9207608b aa 2021-03-04 15:30:10 +08:00
苏尹岚
cbdfdff5fd aa 2021-03-04 14:51:29 +08:00
苏尹岚
caebd3921f aa 2021-03-04 14:16:58 +08:00
苏尹岚
2a3b838dca aa 2021-03-04 14:07:41 +08:00
苏尹岚
8c3706ce86 Merge remote-tracking branch 'origin/mark' 2021-03-04 11:34:50 +08:00
苏尹岚
54937a1e7b aa 2021-03-04 11:34:12 +08:00
苏尹岚
c4650f5181 aa 2021-03-04 10:34:59 +08:00
苏尹岚
72d839e049 aa 2021-03-04 09:57:51 +08:00
苏尹岚
262db00540 aa 2021-03-04 09:55:36 +08:00
苏尹岚
399ddf968a aa 2021-03-04 09:35:24 +08:00
苏尹岚
61b9933717 aa 2021-03-04 09:10:55 +08:00
苏尹岚
a1b17255d2 aa 2021-03-03 18:01:01 +08:00
苏尹岚
d43b57660a aa 2021-03-03 17:59:36 +08:00
苏尹岚
8547d2d3b0 aa 2021-03-03 17:31:17 +08:00
苏尹岚
59a4c6c59c aa 2021-03-03 14:42:48 +08:00
苏尹岚
7fa0849e17 aa 2021-03-03 14:11:22 +08:00
苏尹岚
f37545de19 Merge remote-tracking branch 'origin/mark' into jdshop 2021-03-02 16:57:32 +08:00
苏尹岚
cfb02afc84 aa 2021-03-02 16:42:59 +08:00
苏尹岚
67f1333ef3 aa 2021-03-02 16:18:58 +08:00
苏尹岚
52a3d02eac aa 2021-03-02 13:52:59 +08:00
苏尹岚
5cb65919c2 aa 2021-03-02 11:37:07 +08:00
苏尹岚
1f82ec3f0d aa 2021-03-02 11:31:29 +08:00
苏尹岚
0ce761b01e aa 2021-03-02 11:22:58 +08:00
苏尹岚
c68e02b409 aa 2021-03-02 11:09:19 +08:00
苏尹岚
b959fd60dc aa 2021-03-02 10:55:36 +08:00
苏尹岚
dba862d6cd mtwm 定期刷token 2021-03-02 10:54:01 +08:00
苏尹岚
9ed0b9e3b3 aa 2021-03-02 10:43:47 +08:00
苏尹岚
29ab696bfd aa 2021-03-02 10:38:09 +08:00
苏尹岚
dd1e4d9c23 aa 2021-03-02 09:24:40 +08:00
苏尹岚
603b27eb38 aa 2021-03-02 09:12:04 +08:00
苏尹岚
3243044438 aa 2021-03-01 17:18:45 +08:00
苏尹岚
38f5f58644 aa 2021-03-01 17:15:45 +08:00
苏尹岚
af45ed3350 aa 2021-03-01 17:10:38 +08:00
苏尹岚
ada5d570b8 aa 2021-03-01 16:16:40 +08:00
苏尹岚
78898fb39f aa 2021-03-01 16:09:44 +08:00
苏尹岚
5c856aaf12 aa 2021-03-01 15:59:26 +08:00
苏尹岚
c6ad936d08 aa 2021-03-01 15:55:53 +08:00
苏尹岚
b9c6eced38 aa 2021-03-01 15:54:42 +08:00
苏尹岚
0409aed138 aa 2021-03-01 15:53:53 +08:00
苏尹岚
c55e09e208 aa 2021-03-01 15:51:44 +08:00
苏尹岚
b4141f448e aa 2021-03-01 15:32:01 +08:00
苏尹岚
fb342d813b aa 2021-03-01 15:27:45 +08:00
苏尹岚
96dfa7ad5a aa 2021-03-01 15:10:18 +08:00
苏尹岚
423e0de993 aa 2021-03-01 14:44:48 +08:00
苏尹岚
30c5645eef aa 2021-03-01 14:31:53 +08:00
苏尹岚
5ff8a1b7c3 aa 2021-03-01 14:11:11 +08:00
苏尹岚
774a265c69 aa 2021-03-01 14:07:50 +08:00
苏尹岚
92d2509b3c aa 2021-03-01 13:57:00 +08:00
苏尹岚
fab9303d60 aa 2021-03-01 13:55:59 +08:00
苏尹岚
6c004f8c87 aa 2021-03-01 13:53:02 +08:00
苏尹岚
161238482b aa 2021-03-01 13:36:20 +08:00
苏尹岚
9a9edbd117 aa 2021-03-01 11:47:57 +08:00
苏尹岚
7996e34d5d aa 2021-03-01 11:32:36 +08:00
苏尹岚
46278ea30f aa 2021-03-01 09:22:34 +08:00
苏尹岚
63ad2f9f07 Merge branch 'mark' of e.coding.net:rosydev/jx-callback into mark 2021-03-01 09:12:18 +08:00
苏尹岚
7d2c15935b aa 2021-03-01 09:12:05 +08:00
suyl
2060998750 aa 2021-02-26 21:26:28 +08:00
suyl
5ce6668185 aa 2021-02-26 21:08:48 +08:00
苏尹岚
e57beb588a aa 2021-02-26 15:10:30 +08:00
苏尹岚
8f1d5a72d4 aa 2021-02-25 17:18:09 +08:00
苏尹岚
966a11f394 aa 2021-02-25 15:12:08 +08:00
苏尹岚
8d3d64e381 aa 2021-02-25 10:52:22 +08:00
苏尹岚
7f55d919f0 aa 2021-02-25 10:51:23 +08:00
苏尹岚
578ba51f9a aa 2021-02-25 10:21:13 +08:00
苏尹岚
3653a85af2 aa 2021-02-24 18:11:25 +08:00
苏尹岚
5ae8814ef4 aa 2021-02-24 18:10:11 +08:00
苏尹岚
1ab1992917 a 2021-02-24 17:08:01 +08:00
苏尹岚
6b77f9f7c9 aa 2021-02-24 17:01:19 +08:00
苏尹岚
70a95b1de0 aa 2021-02-24 16:52:30 +08:00
苏尹岚
605a5b1d48 a 2021-02-24 16:50:51 +08:00
苏尹岚
655300e414 aa 2021-02-24 16:39:23 +08:00
苏尹岚
aeeb13cd0b aa 2021-02-24 15:20:50 +08:00
苏尹岚
04839ce472 aa 2021-02-24 11:53:26 +08:00
苏尹岚
3d240a86a1 aa 2021-02-24 11:19:31 +08:00
苏尹岚
d123824cab aa 2021-02-24 11:03:34 +08:00
苏尹岚
47d4a11d1d aa 2021-02-24 10:06:55 +08:00
苏尹岚
3858c45274 aa 2021-02-24 09:48:33 +08:00
苏尹岚
7d7ed04f75 aa 2021-02-23 16:20:40 +08:00
苏尹岚
d2c1998dc8 aa 2021-02-23 16:06:15 +08:00
苏尹岚
cdbb242778 aa 2021-02-23 14:22:22 +08:00
苏尹岚
58f4d1ab56 aa 2021-02-23 10:37:16 +08:00
苏尹岚
78ae4f073d aa 2021-02-23 10:28:20 +08:00
苏尹岚
7f94d2b48f aa 2021-02-23 10:16:36 +08:00
苏尹岚
eb93724cbb aa 2021-02-23 09:07:41 +08:00
苏尹岚
24262256e5 aa 2021-02-22 15:07:06 +08:00
苏尹岚
2773d5c9ca aa 2021-02-22 14:52:10 +08:00
苏尹岚
a0f9e96fcb aa 2021-02-22 14:17:58 +08:00
苏尹岚
38f703c482 aa 2021-02-22 11:09:43 +08:00
苏尹岚
c05c826cd9 aa 2021-02-22 11:03:13 +08:00
苏尹岚
4b7ed6ead5 aa 2021-02-22 10:48:42 +08:00
苏尹岚
2b32adefcb aa 2021-02-22 10:27:51 +08:00
苏尹岚
933f9ab820 aa 2021-02-22 09:53:04 +08:00
苏尹岚
dc420cdf3a aa 2021-02-20 16:24:47 +08:00
苏尹岚
a0de3392bc aa 2021-02-20 11:08:43 +08:00
苏尹岚
e465c58262 aa 2021-02-20 10:39:16 +08:00
苏尹岚
833df033c5 aa 2021-02-20 10:35:58 +08:00
苏尹岚
47f26f8f97 aa 2021-02-20 10:17:04 +08:00
苏尹岚
e3397e581a aa 2021-02-20 10:16:44 +08:00
苏尹岚
6f98ae9300 aa 2021-02-20 10:15:47 +08:00
苏尹岚
6833df3548 aa 2021-02-19 17:04:34 +08:00
苏尹岚
63fea2e47b aa 2021-02-19 16:59:13 +08:00
苏尹岚
1b3bcb8b6a aa 2021-02-19 16:50:40 +08:00
苏尹岚
ea374f228a aa 2021-02-19 11:58:43 +08:00
苏尹岚
a2c7eecdca aa 2021-02-19 11:32:20 +08:00
苏尹岚
9c6e6e6c65 aa 2021-02-19 09:35:19 +08:00
苏尹岚
20015b8463 aa 2021-02-19 09:34:08 +08:00
苏尹岚
f4ef3b2433 aa 2021-02-19 08:55:58 +08:00
苏尹岚
f69aca7c08 aa 2021-02-18 18:40:32 +08:00
苏尹岚
86f6319077 aa 2021-02-18 16:05:51 +08:00
苏尹岚
e5bd36ded0 aa 2021-02-18 15:45:06 +08:00
苏尹岚
85f9ac8dd4 aa 2021-02-18 14:04:00 +08:00
苏尹岚
66194c55f9 aa 2021-02-18 11:55:47 +08:00
苏尹岚
0ca51ca7fc 分类名重复不允许创建 2021-02-18 09:57:47 +08:00
苏尹岚
a4fae9be65 aa 2021-02-08 17:45:16 +08:00
苏尹岚
fd2967faae aa 2021-02-08 17:44:58 +08:00
苏尹岚
feeb4ee6e9 aa 2021-02-08 17:34:55 +08:00
苏尹岚
e2842c75be aa 2021-02-08 17:26:54 +08:00
苏尹岚
0aabc8ad2c aa 2021-02-08 17:22:47 +08:00
苏尹岚
b7852f2f65 aa 2021-02-08 17:21:08 +08:00
苏尹岚
fdfc3ab5d1 aa 2021-02-08 17:14:54 +08:00
苏尹岚
1f521cf6bc aa 2021-02-08 17:08:36 +08:00
苏尹岚
a8529b69d9 aa 2021-02-08 16:58:26 +08:00
苏尹岚
c96dd64fd8 aa 2021-02-08 16:47:12 +08:00
苏尹岚
0373cebca9 aa 2021-02-08 16:23:20 +08:00
苏尹岚
3afec3e583 aa 2021-02-08 16:21:25 +08:00
苏尹岚
80eea88ccb aa 2021-02-08 16:15:44 +08:00
苏尹岚
c62d18d03b aa 2021-02-08 16:11:24 +08:00
苏尹岚
dd0189c1df aa 2021-02-08 15:59:12 +08:00
苏尹岚
0242da3d45 aa 2021-02-08 15:48:10 +08:00
苏尹岚
1f3de84373 aa 2021-02-08 15:36:22 +08:00
苏尹岚
03dd2c45d0 aa 2021-02-08 15:24:30 +08:00
苏尹岚
6004f8937b aa 2021-02-08 15:08:41 +08:00
苏尹岚
3c93e0b692 aa 2021-02-08 14:47:43 +08:00
苏尹岚
180ddce248 aa 2021-02-08 14:41:10 +08:00
苏尹岚
a768a893eb aa 2021-02-08 14:36:35 +08:00
苏尹岚
d115bf7faf aa 2021-02-08 14:33:50 +08:00
苏尹岚
3bf0a49837 aa 2021-02-08 14:28:37 +08:00
苏尹岚
530ea46779 aa 2021-02-08 14:14:35 +08:00
苏尹岚
48e4f5962a aa 2021-02-08 14:04:50 +08:00
苏尹岚
0c90169369 aa 2021-02-08 13:58:38 +08:00
苏尹岚
f118613de8 aa 2021-02-08 13:56:12 +08:00
苏尹岚
61d7a50ca6 aa 2021-02-08 13:39:29 +08:00
苏尹岚
35103bd225 aa 2021-02-08 10:56:59 +08:00
苏尹岚
05f2b04969 aa 2021-02-08 10:50:04 +08:00
苏尹岚
a1c5ded380 aa 2021-02-08 10:49:38 +08:00
苏尹岚
9e92a9a0e0 aa 2021-02-08 10:47:40 +08:00
苏尹岚
fd6efea36e aa 2021-02-08 09:27:53 +08:00
苏尹岚
e6d3190691 aa 2021-02-08 09:16:14 +08:00
苏尹岚
8ae64f3f18 aa 2021-02-08 09:02:19 +08:00
苏尹岚
725458dfe3 aa 2021-02-08 08:58:44 +08:00
苏尹岚
ba41fe49a7 aa 2021-02-07 16:32:45 +08:00
苏尹岚
a614ae4e1a aa 2021-02-07 16:25:15 +08:00
苏尹岚
d87bc9da58 aa 2021-02-07 16:09:06 +08:00
苏尹岚
f4af57cb08 美团商超 2021-02-07 15:44:59 +08:00
苏尹岚
306c0eefff aa 2021-02-07 14:17:09 +08:00
苏尹岚
5fd18dea64 aa 2021-02-07 13:48:17 +08:00
苏尹岚
473ba9bf5e aa 2021-02-07 13:40:11 +08:00
苏尹岚
813e8c6e0c aa 2021-02-07 12:12:28 +08:00
苏尹岚
c7a751933b aa 2021-02-07 11:42:32 +08:00
苏尹岚
7280e99863 aa 2021-02-07 11:18:49 +08:00
苏尹岚
0a5d3dc32c a 2021-02-07 11:15:19 +08:00
苏尹岚
feebefb10d aa 2021-02-07 10:45:46 +08:00
苏尹岚
d7a04e164e aa 2021-02-07 09:53:47 +08:00
苏尹岚
2a5a123447 aa 2021-02-05 17:16:03 +08:00
苏尹岚
0e7ad07e19 aa 2021-02-05 16:43:38 +08:00
苏尹岚
fb7ad6b750 a 2021-02-05 16:33:46 +08:00
苏尹岚
a388b89225 aa 2021-02-05 16:03:34 +08:00
苏尹岚
c566c4b16e aa 2021-02-05 16:01:14 +08:00
苏尹岚
1c918447d2 aa 2021-02-05 15:54:18 +08:00
苏尹岚
921c50ac4d aa 2021-02-05 15:32:18 +08:00
苏尹岚
45c879a7ac aa 2021-02-05 15:23:01 +08:00
苏尹岚
42a264f1f0 aa 2021-02-05 15:18:42 +08:00
苏尹岚
90162a6c4f aa 2021-02-05 15:11:35 +08:00
苏尹岚
2709883f7f aa 2021-02-05 14:18:03 +08:00
苏尹岚
8c4fb7871f aa 2021-02-05 14:13:11 +08:00
苏尹岚
87d43927bc aa 2021-02-05 14:03:05 +08:00
苏尹岚
485330a942 aa 2021-02-05 10:58:21 +08:00
苏尹岚
9b1ccb8ec8 aa 2021-02-05 10:28:50 +08:00
苏尹岚
5a45cf3c9a aa 2021-02-05 09:24:52 +08:00
苏尹岚
c8ab2b2310 aa 2021-02-04 17:57:05 +08:00
苏尹岚
5b45811b8d aa 2021-02-04 17:17:57 +08:00
苏尹岚
10a1a1ba5c aa 2021-02-04 15:55:55 +08:00
苏尹岚
e7a0c3cd27 aa 2021-02-04 15:47:26 +08:00
苏尹岚
09e751b83a aa 2021-02-04 15:22:31 +08:00
苏尹岚
6856ef2f8f aa 2021-02-04 10:08:02 +08:00
苏尹岚
fd3b8a2141 aa 2021-02-04 08:56:03 +08:00
苏尹岚
9cad16bbaf aa 2021-02-03 18:45:01 +08:00
苏尹岚
f14fc933dd aa 2021-02-03 16:14:15 +08:00
苏尹岚
58411e0d85 aa 2021-02-03 16:09:31 +08:00
苏尹岚
5129eb9c64 aa 2021-02-03 15:26:37 +08:00
苏尹岚
e540736c59 aa 2021-02-03 15:21:15 +08:00
苏尹岚
a45d4a7464 aa 2021-02-03 15:14:16 +08:00
苏尹岚
b61d7f56c9 aa 2021-02-03 14:56:23 +08:00
苏尹岚
689e7b4bc7 aa 2021-02-03 14:36:11 +08:00
苏尹岚
fb55dd6a85 aa 2021-02-03 11:18:30 +08:00
苏尹岚
1c9f710b45 aa 2021-02-03 10:30:50 +08:00
苏尹岚
aaadd0ed32 aa 2021-02-03 10:15:53 +08:00
苏尹岚
bde302b557 aa 2021-02-02 16:51:40 +08:00
苏尹岚
32d08027bf aa 2021-02-02 16:23:19 +08:00
苏尹岚
f992f6a0e2 aa 2021-02-02 16:11:49 +08:00
苏尹岚
51c096dae4 aa 2021-02-02 16:04:05 +08:00
苏尹岚
5972883978 aa 2021-02-02 16:01:22 +08:00
苏尹岚
3260643e63 aa 2021-02-02 14:05:40 +08:00
苏尹岚
00766183c7 aa 2021-02-02 11:41:17 +08:00
苏尹岚
faef2c35a8 aa 2021-02-01 17:26:06 +08:00
苏尹岚
b222dfe962 aa 2021-02-01 15:37:58 +08:00
苏尹岚
e37bc83bbb aa 2021-02-01 15:12:08 +08:00
苏尹岚
8cc0b3f0da aa 2021-02-01 15:05:30 +08:00
苏尹岚
70ecd6910b aa 2021-02-01 15:02:18 +08:00
苏尹岚
555eb6670f aa 2021-02-01 14:57:05 +08:00
苏尹岚
f2be9f0248 aa 2021-02-01 14:44:32 +08:00
苏尹岚
786a0cadf4 aa 2021-02-01 14:40:33 +08:00
苏尹岚
2e59fe535b Merge branch 'jdshop' of e.coding.net:rosydev/jx-callback into jdshop 2021-02-01 13:39:47 +08:00
苏尹岚
21c7f69ac8 aa 2021-02-01 13:39:05 +08:00
suyl
b3d6017cf1 aa 2021-01-29 19:39:22 +08:00
苏尹岚
353670289a aa 2021-01-29 14:42:41 +08:00
苏尹岚
0e5c9e80bb aa 2021-01-29 14:38:11 +08:00
苏尹岚
b345f1a245 aa 2021-01-29 14:25:29 +08:00
苏尹岚
dffdbd2818 aa 2021-01-29 14:13:05 +08:00
苏尹岚
7f25da11a1 aa 2021-01-28 17:28:01 +08:00
苏尹岚
252a5d1b33 aa 2021-01-28 16:49:23 +08:00
苏尹岚
4724d57094 aa 2021-01-28 16:45:56 +08:00
苏尹岚
61f32cb7a6 aa 2021-01-28 15:33:13 +08:00
苏尹岚
d46ced3522 aa 2021-01-28 15:32:08 +08:00
苏尹岚
418bcbca29 aa 2021-01-28 14:47:35 +08:00
苏尹岚
be029c8f2d aa 2021-01-28 14:44:16 +08:00
苏尹岚
8418420928 aa 2021-01-28 14:32:59 +08:00
苏尹岚
a236f0b14c aa 2021-01-28 14:27:37 +08:00
苏尹岚
de0cc168f3 aa 2021-01-28 14:16:53 +08:00
苏尹岚
8f2970c504 aa 2021-01-28 13:58:45 +08:00
苏尹岚
e2760bb7a4 aa 2021-01-28 11:16:42 +08:00
苏尹岚
8f32bb232e aa 2021-01-28 10:53:24 +08:00
苏尹岚
5d6ff365c1 aa 2021-01-28 10:28:38 +08:00
苏尹岚
a32c7f7983 aa 2021-01-28 10:01:13 +08:00
苏尹岚
599749191b aa 2021-01-28 09:52:18 +08:00
苏尹岚
7deeb4fbd3 aa 2021-01-28 09:41:37 +08:00
苏尹岚
90ac1df1cf aa 2021-01-28 09:17:10 +08:00
苏尹岚
a24754705a aa 2021-01-28 09:16:54 +08:00
苏尹岚
61c44e257d aa 2021-01-27 17:58:50 +08:00
苏尹岚
812ad592f2 aa 2021-01-27 17:57:20 +08:00
苏尹岚
e38ab5104d aa 2021-01-27 15:26:01 +08:00
苏尹岚
7772f9bfaa aa 2021-01-27 15:19:08 +08:00
苏尹岚
60172d7c6b aa 2021-01-27 15:00:53 +08:00
苏尹岚
d2955b2a2f aa 2021-01-27 14:15:35 +08:00
苏尹岚
8ec5e4f3c6 aa 2021-01-27 13:36:59 +08:00
苏尹岚
24bdadb1db aa 2021-01-27 10:24:55 +08:00
苏尹岚
e6a2040027 aa 2021-01-27 09:40:40 +08:00
苏尹岚
0226aab316 aa 2021-01-27 09:40:00 +08:00
苏尹岚
720c23a67e aa 2021-01-26 18:10:48 +08:00
苏尹岚
9ab6b39845 aa 2021-01-26 17:45:23 +08:00
苏尹岚
616f0f6466 aa 2021-01-26 17:38:21 +08:00
苏尹岚
00770ef83f aa 2021-01-26 17:35:28 +08:00
苏尹岚
c8ab4ad146 aa 2021-01-26 16:30:07 +08:00
苏尹岚
fb6aae1930 aa 2021-01-26 16:15:49 +08:00
苏尹岚
30435d4ae4 aa 2021-01-26 15:55:00 +08:00
苏尹岚
3e0707e6a7 aa 2021-01-26 15:51:01 +08:00
苏尹岚
f9b2959e58 aa 2021-01-26 15:34:42 +08:00
苏尹岚
f423d0944e aa 2021-01-26 15:24:20 +08:00
苏尹岚
f6d1d0a272 aa 2021-01-26 15:11:14 +08:00
苏尹岚
5f4d0bcad3 aa 2021-01-26 15:05:52 +08:00
苏尹岚
6238b359d7 aa 2021-01-26 15:03:33 +08:00
苏尹岚
ffbc982804 aa 2021-01-26 14:23:08 +08:00
苏尹岚
52846991ba aa 2021-01-26 14:18:19 +08:00
苏尹岚
799bcb0aa3 aa 2021-01-26 11:36:01 +08:00
苏尹岚
c9c803cf45 aa 2021-01-26 11:19:09 +08:00
苏尹岚
dacd55f239 aa 2021-01-26 11:14:10 +08:00
苏尹岚
af15ad0e84 aa 2021-01-26 11:05:56 +08:00
苏尹岚
7aace1bf49 aa 2021-01-26 10:39:01 +08:00
苏尹岚
a54b831eec aa 2021-01-26 10:30:17 +08:00
苏尹岚
44e9eea0f1 aa 2021-01-26 10:26:04 +08:00
苏尹岚
a1fce2b48c aa 2021-01-26 10:12:56 +08:00
苏尹岚
df6b94ac39 aa 2021-01-26 09:04:35 +08:00
苏尹岚
575b80d890 aa 2021-01-26 08:59:14 +08:00
苏尹岚
7788b79993 aa 2021-01-25 15:19:45 +08:00
苏尹岚
e169216f08 aa 2021-01-25 10:42:04 +08:00
苏尹岚
a7f43036c7 aa 2021-01-22 18:25:06 +08:00
苏尹岚
ed8368c565 aa 2021-01-22 17:03:08 +08:00
苏尹岚
b12669e584 aa 2021-01-22 17:00:14 +08:00
苏尹岚
61d01e7cbf aa 2021-01-22 16:59:13 +08:00
苏尹岚
6462231c86 aa 2021-01-22 16:50:08 +08:00
苏尹岚
c793fc5a04 aa 2021-01-22 14:59:12 +08:00
苏尹岚
7109baf227 aa 2021-01-22 11:25:52 +08:00
苏尹岚
ac880a4387 aa 2021-01-22 11:17:32 +08:00
苏尹岚
6d9a3d2313 aa 2021-01-22 11:10:58 +08:00
苏尹岚
2dcbd1f8fb aa 2021-01-22 11:02:01 +08:00
苏尹岚
e758d5d8ed aa 2021-01-22 10:59:01 +08:00
苏尹岚
7bc90281ff aa 2021-01-22 10:56:01 +08:00
苏尹岚
a7ea8301b1 aa 2021-01-22 10:43:44 +08:00
苏尹岚
370b606575 aa 2021-01-22 10:36:18 +08:00
苏尹岚
618ae4c251 aa 2021-01-22 10:31:41 +08:00
苏尹岚
a1ddba2c78 aa 2021-01-22 10:28:35 +08:00
苏尹岚
1dc91f6f9a aa 2021-01-22 10:23:19 +08:00
苏尹岚
f9f636499d aa 2021-01-22 10:17:38 +08:00
苏尹岚
80d11533c1 aa 2021-01-22 10:14:16 +08:00
苏尹岚
56d9e1b643 aa 2021-01-22 10:07:54 +08:00
苏尹岚
519592bc31 aa 2021-01-22 10:05:43 +08:00
苏尹岚
f85fa9e12a aa 2021-01-21 17:49:59 +08:00
苏尹岚
ada312f753 aa 2021-01-21 17:37:12 +08:00
苏尹岚
5eeb60c12d aa 2021-01-21 17:13:33 +08:00
苏尹岚
091e46b74d aa 2021-01-21 17:01:21 +08:00
苏尹岚
1ed3146ed4 aa 2021-01-21 16:57:54 +08:00
苏尹岚
0eb5c39953 aa 2021-01-21 16:53:51 +08:00
苏尹岚
3f1045530d aa 2021-01-21 10:14:25 +08:00
苏尹岚
f3f091f6ab aa 2021-01-21 09:09:13 +08:00
苏尹岚
a32f1d098d aa 2021-01-20 18:18:39 +08:00
苏尹岚
17dc583f86 aa 2021-01-20 14:46:56 +08:00
苏尹岚
142990b2a6 aaa 2021-01-20 14:25:46 +08:00
苏尹岚
15068e28f9 aaa 2021-01-20 14:23:41 +08:00
苏尹岚
cb8a31a1da aaa 2021-01-20 14:21:17 +08:00
苏尹岚
c9f9c435d5 aaa 2021-01-20 14:18:15 +08:00
苏尹岚
4f61f1f35d aaa 2021-01-20 14:06:40 +08:00
苏尹岚
ca415b259f aa 2021-01-20 13:51:03 +08:00
苏尹岚
5859c589da aa 2021-01-20 13:47:56 +08:00
苏尹岚
729cce6695 aa 2021-01-20 13:46:33 +08:00
苏尹岚
724123aff7 aa 2021-01-20 11:13:37 +08:00
苏尹岚
d27aa2c7ef aa 2021-01-20 10:32:53 +08:00
苏尹岚
b87c390946 aa 2021-01-20 10:04:09 +08:00
苏尹岚
84c98fa1a8 aa 2021-01-20 09:18:34 +08:00
苏尹岚
3ea7abddfa aa 2021-01-19 16:55:24 +08:00
苏尹岚
e149095088 aa 2021-01-19 14:50:25 +08:00
苏尹岚
c2417f70aa aa 2021-01-19 14:21:20 +08:00
苏尹岚
bb2fab1ef3 aa 2021-01-19 09:12:38 +08:00
苏尹岚
e902e02fc3 aa 2021-01-18 11:06:30 +08:00
苏尹岚
bf5aaf2a1c 邮件太多了 2021-01-18 09:44:10 +08:00
苏尹岚
c3319e4201 aa 2021-01-15 14:37:23 +08:00
苏尹岚
74b902e4e5 aa 2021-01-15 09:38:58 +08:00
苏尹岚
f3dd1b3e1e aa 2021-01-14 10:31:27 +08:00
苏尹岚
af4b21ebb7 aa 2021-01-14 10:19:56 +08:00
苏尹岚
d3d3fe0a7c aa 2021-01-14 09:20:29 +08:00
苏尹岚
e488701115 aa 2021-01-14 09:13:23 +08:00
苏尹岚
28c5f80d86 aa 2021-01-13 11:42:47 +08:00
苏尹岚
40c7d367aa aa 2021-01-13 09:54:59 +08:00
苏尹岚
d407d2a35d aa 2021-01-13 09:52:31 +08:00
苏尹岚
1e30bd93f7 aa 2021-01-13 09:32:00 +08:00
苏尹岚
ebeb53a92b aa 2021-01-12 16:52:19 +08:00
苏尹岚
e7e372ea72 aa 2021-01-12 15:39:35 +08:00
苏尹岚
389864e413 aa 2021-01-12 15:35:23 +08:00
苏尹岚
e48d74601f refreshcoupon 2021-01-12 15:23:19 +08:00
苏尹岚
78d54c54ad shangchao 2021-01-12 14:05:42 +08:00
苏尹岚
b769147e2c aa 2021-01-12 11:37:29 +08:00
苏尹岚
6ae3ee1246 aa 2021-01-11 18:08:29 +08:00
苏尹岚
a3c9346792 aa 2021-01-11 18:08:09 +08:00
苏尹岚
e5133e7006 aa 2021-01-11 18:06:50 +08:00
苏尹岚
0c6ff86deb aa 2021-01-11 16:44:31 +08:00
苏尹岚
56caf8380f update 2021-01-11 15:48:30 +08:00
苏尹岚
b206fa3cc7 aa 2021-01-11 15:45:11 +08:00
苏尹岚
c5b66cfd3b aa 2021-01-11 15:36:41 +08:00
苏尹岚
c8c1746e83 aa 2021-01-11 15:23:56 +08:00
苏尹岚
b1a3820fb1 aa 2021-01-11 15:20:51 +08:00
苏尹岚
154791b487 aa 2021-01-11 15:12:49 +08:00
苏尹岚
6bbc45ad59 aa 2021-01-11 15:10:44 +08:00
苏尹岚
1050f5501f aa 2021-01-11 15:07:54 +08:00
苏尹岚
ccd8ed553f aa 2021-01-11 14:52:53 +08:00
苏尹岚
7ce41f81d3 aa 2021-01-11 14:48:31 +08:00
苏尹岚
431cde11bd aa 2021-01-11 14:25:32 +08:00
苏尹岚
bee46dd1d5 aa 2021-01-11 11:35:54 +08:00
苏尹岚
b161e4d55a aa 2021-01-08 18:09:01 +08:00
苏尹岚
9f73470bc2 aa 2021-01-08 16:58:04 +08:00
苏尹岚
6cd1be12b8 aa 2021-01-08 14:48:08 +08:00
苏尹岚
32fd6ac88a aa 2021-01-08 11:47:27 +08:00
苏尹岚
607e2f4396 aa 2021-01-08 11:45:30 +08:00
苏尹岚
16bb40b4a7 aa 2021-01-07 17:51:55 +08:00
苏尹岚
25bb55f92d aa 2021-01-07 17:38:47 +08:00
苏尹岚
5f801aa354 aa 2021-01-07 17:35:46 +08:00
苏尹岚
60e3f1ad91 aa 2021-01-07 16:39:57 +08:00
苏尹岚
f161adef8c aa 2021-01-07 16:29:11 +08:00
苏尹岚
f20b816f56 aa 2021-01-07 14:28:56 +08:00
苏尹岚
ccf6902020 aa 2021-01-07 13:59:16 +08:00
苏尹岚
a90fb644e2 aa 2021-01-07 13:55:09 +08:00
苏尹岚
3745e741c4 aa 2021-01-07 13:44:56 +08:00
苏尹岚
2c2645d4b2 aa 2021-01-07 11:34:40 +08:00
苏尹岚
e3266af9ae aa 2021-01-07 10:36:34 +08:00
苏尹岚
3f331702fd a 2021-01-07 10:33:16 +08:00
苏尹岚
abd0fcdf4a aa 2021-01-06 18:18:17 +08:00
苏尹岚
e8cfe85be5 aaa 2021-01-06 17:37:54 +08:00
苏尹岚
e3145683c7 aa 2021-01-06 16:15:03 +08:00
苏尹岚
820c1c3043 aa 2021-01-06 16:12:04 +08:00
苏尹岚
0f177a14f7 aa 2021-01-06 16:02:29 +08:00
苏尹岚
c8827012b0 aa 2021-01-06 15:58:06 +08:00
苏尹岚
453c6a2e9c aa 2021-01-06 15:38:29 +08:00
苏尹岚
acdb733286 aa 2021-01-06 15:35:11 +08:00
苏尹岚
d32a52c36e aa 2021-01-06 15:32:32 +08:00
苏尹岚
57cb826087 aa 2021-01-06 15:23:08 +08:00
苏尹岚
dbe86ab33b aa 2021-01-06 11:36:11 +08:00
苏尹岚
3b095fef4f aa 2021-01-06 10:08:55 +08:00
苏尹岚
64fb854ab7 aa 2021-01-06 09:57:32 +08:00
苏尹岚
5753470c8b aa 2021-01-06 09:46:54 +08:00
苏尹岚
756b39711d aa 2021-01-05 17:44:19 +08:00
苏尹岚
dd9306927d aa 2021-01-05 16:56:19 +08:00
苏尹岚
baef83d986 aa 2021-01-05 16:43:04 +08:00
苏尹岚
ac6e76a4a6 aa 2021-01-05 16:09:23 +08:00
苏尹岚
41d3c9cdd2 aa 2021-01-04 09:23:56 +08:00
苏尹岚
c8af8bd800 aa 2020-12-31 09:02:40 +08:00
苏尹岚
d8c8a36063 aa 2020-12-31 08:59:20 +08:00
苏尹岚
8720663f07 aa 2020-12-30 19:05:16 +08:00
苏尹岚
91bcf6a09b Merge branch 'jdshop' of e.coding.net:rosydev/jx-callback into jdshop 2020-12-30 19:02:05 +08:00
苏尹岚
3ba96cfe70 aa 2020-12-30 19:01:42 +08:00
suyl
d33a2cddae a 2020-12-29 19:42:01 +08:00
苏尹岚
290dc66f8f aa 2020-12-29 17:51:37 +08:00
苏尹岚
05140d0baf aa 2020-12-29 16:45:20 +08:00
苏尹岚
036e25cae1 aa 2020-12-29 14:20:36 +08:00
苏尹岚
c3c45852b4 aa 2020-12-29 11:16:50 +08:00
苏尹岚
2b275a7b03 aa 2020-12-29 10:05:23 +08:00
苏尹岚
b36f3623f2 a 2020-12-28 17:33:26 +08:00
苏尹岚
ee0bc23493 a 2020-12-28 17:30:02 +08:00
苏尹岚
0f96fb73d0 aa 2020-12-28 14:55:21 +08:00
苏尹岚
dda1a1fc5d a 2020-12-28 10:39:00 +08:00
苏尹岚
15601e9d58 aa 2020-12-28 10:23:32 +08:00
苏尹岚
3458c82cea aa 2020-12-24 16:44:15 +08:00
苏尹岚
e639e0e666 aa 2020-12-24 10:08:39 +08:00
苏尹岚
ada4e33bbe mt 2020-12-24 09:39:57 +08:00
苏尹岚
bdfc2db33b aa 2020-12-24 09:32:45 +08:00
苏尹岚
b96804792c aa 2020-12-23 18:21:39 +08:00
苏尹岚
3b277d8753 test 2020-12-23 18:14:59 +08:00
苏尹岚
01c87b3415 aa 2020-12-23 09:31:11 +08:00
苏尹岚
09494dc4e5 aa 2020-12-22 17:58:58 +08:00
苏尹岚
e73225be50 err 2020-12-22 15:57:04 +08:00
苏尹岚
57a9d70c74 aa 2020-12-22 11:16:43 +08:00
苏尹岚
341004583d aa 2020-12-22 09:41:56 +08:00
苏尹岚
289134241b aa 2020-12-22 09:13:30 +08:00
苏尹岚
540d18acbc aa 2020-12-21 18:19:35 +08:00
苏尹岚
10a6db8ce6 aa 2020-12-21 16:43:59 +08:00
苏尹岚
0e70ef5c83 aa 2020-12-21 14:58:22 +08:00
苏尹岚
292c490bd8 aa 2020-12-21 14:50:37 +08:00
苏尹岚
bc8baccc47 aa 2020-12-21 14:46:53 +08:00
苏尹岚
87b691f8ec aa 2020-12-21 14:43:38 +08:00
苏尹岚
3ab74d5a65 aa 2020-12-21 14:34:03 +08:00
苏尹岚
bb9a7b45d1 aa 2020-12-21 14:28:27 +08:00
苏尹岚
dfe1e719ef a 2020-12-21 13:39:30 +08:00
苏尹岚
753cefe861 fnps 2020-12-21 11:55:12 +08:00
苏尹岚
61deea342c fnps 2020-12-21 11:54:49 +08:00
苏尹岚
1865f1d3fc a 2020-12-21 11:43:50 +08:00
苏尹岚
48defb7af3 aa 2020-12-21 10:54:57 +08:00
苏尹岚
bf6c68930c fnps 2020-12-21 10:42:37 +08:00
苏尹岚
0b5b3884cf a 2020-12-18 17:04:30 +08:00
苏尹岚
a798baac79 jiandian 2020-12-18 11:48:53 +08:00
苏尹岚
699c1a358b jiandian 2020-12-18 11:46:44 +08:00
苏尹岚
944cc6f562 jiandian 2020-12-18 11:43:34 +08:00
苏尹岚
7b27513b76 jiandian 2020-12-18 11:40:27 +08:00
苏尹岚
f4debfde7b a 2020-12-18 10:40:38 +08:00
苏尹岚
e515a2a446 a 2020-12-18 10:00:06 +08:00
苏尹岚
482c2271f0 a 2020-12-18 09:58:39 +08:00
苏尹岚
2ea40c3025 a 2020-12-18 09:57:34 +08:00
苏尹岚
9cae5e65ad aa 2020-12-14 17:59:13 +08:00
苏尹岚
a597d160ee fnps 2020-12-14 16:58:28 +08:00
苏尹岚
6148eb0cae a 2020-12-14 15:42:14 +08:00
苏尹岚
1c21251eee a 2020-12-14 15:32:48 +08:00
苏尹岚
21fbb8e075 aa 2020-12-14 15:28:00 +08:00
苏尹岚
0601ba4473 aa 2020-12-14 15:26:10 +08:00
苏尹岚
3a098b1a42 ss 2020-12-14 14:57:42 +08:00
苏尹岚
e9f7afa492 aa 2020-12-14 14:50:00 +08:00
苏尹岚
267186da39 aa 2020-12-14 13:40:43 +08:00
苏尹岚
b37e288834 aa 2020-12-14 10:13:17 +08:00
苏尹岚
770a773ebe fnps 2020-12-11 14:15:02 +08:00
苏尹岚
3240ece070 a 2020-12-11 10:54:04 +08:00
苏尹岚
b38b644543 aa 2020-12-11 10:39:13 +08:00
苏尹岚
e2b49ea137 aa 2020-12-11 10:35:44 +08:00
苏尹岚
d74f8c926c aa 2020-12-11 10:31:42 +08:00
苏尹岚
8bdb84d514 a 2020-12-11 10:12:07 +08:00
苏尹岚
16aa6cd3f6 a 2020-12-11 10:09:34 +08:00
苏尹岚
dbe5427946 aa 2020-12-11 09:33:54 +08:00
苏尹岚
2454ea7388 jd token 2020-12-11 09:05:11 +08:00
苏尹岚
2324534e2b jd token 2020-12-11 09:01:32 +08:00
苏尹岚
4d6332996e aa 2020-12-10 18:28:10 +08:00
苏尹岚
1756f1acb0 aa 2020-12-10 18:00:25 +08:00
苏尹岚
0e1142038b aa 2020-12-09 16:59:44 +08:00
苏尹岚
17938ffaa8 aa 2020-12-09 16:56:23 +08:00
苏尹岚
be59c52814 a 2020-12-09 16:44:04 +08:00
苏尹岚
047ab618e1 a 2020-12-09 13:40:37 +08:00
苏尹岚
76da2af43e a 2020-12-09 11:50:19 +08:00
苏尹岚
649d07dd87 fnps 2020-12-09 10:24:53 +08:00
苏尹岚
4c3d8d6dc7 a 2020-12-08 14:11:13 +08:00
苏尹岚
6b6d2d6b06 aa 2020-12-08 10:44:52 +08:00
苏尹岚
9ed6bb4974 fnps 2020-12-07 18:23:12 +08:00
苏尹岚
fe202ad41e test 2020-12-07 17:22:48 +08:00
苏尹岚
6d98bdd210 err 2020-12-07 11:57:24 +08:00
苏尹岚
836aa2f9df err 2020-12-07 11:51:33 +08:00
苏尹岚
b4f6d79665 err 2020-12-07 11:38:23 +08:00
苏尹岚
d29d94926c err 2020-12-07 11:26:11 +08:00
苏尹岚
8c30565ae8 err 2020-12-07 11:22:34 +08:00
苏尹岚
30b8c25003 aa 2020-12-07 09:56:34 +08:00
苏尹岚
82cc3572b3 延后1xiaoshi 2020-12-07 09:50:04 +08:00
苏尹岚
e939fa5ab2 aa 2020-12-04 16:28:17 +08:00
苏尹岚
c5587d0073 aa 2020-12-04 16:17:31 +08:00
苏尹岚
ea6a871246 aa 2020-12-04 14:25:22 +08:00
苏尹岚
dd5f3c38ac aa 2020-12-04 10:42:37 +08:00
苏尹岚
d986178f8d a 2020-12-04 10:19:10 +08:00
苏尹岚
fa9bc1fd16 jdshop 2020-12-04 10:07:07 +08:00
苏尹岚
7e92f3cf1a tt 2020-12-04 09:49:18 +08:00
苏尹岚
219d0fb9cb tt 2020-12-04 09:44:07 +08:00
苏尹岚
8a481f8225 tt 2020-12-04 09:37:14 +08:00
苏尹岚
6ae6d067b4 tt 2020-12-04 09:29:13 +08:00
苏尹岚
503d91b3fa store 2020-12-03 16:59:23 +08:00
苏尹岚
a73cba5328 a 2020-12-03 16:39:53 +08:00
苏尹岚
e99739d3ef a 2020-12-03 16:28:46 +08:00
苏尹岚
546cfd774c a 2020-12-03 16:25:29 +08:00
苏尹岚
99d712b5de a 2020-12-03 16:20:11 +08:00
苏尹岚
77183df91d a 2020-12-03 16:12:36 +08:00
苏尹岚
001dcc006c aa 2020-12-03 15:55:22 +08:00
苏尹岚
5a9a0ffb41 aa 2020-12-03 15:25:10 +08:00
苏尹岚
f9834f82f1 a 2020-12-03 15:10:42 +08:00
苏尹岚
a44c12e83b aa 2020-12-03 14:31:30 +08:00
苏尹岚
113d6458dc aa 2020-12-03 14:24:56 +08:00
苏尹岚
61fbdca849 aa 2020-12-03 14:20:25 +08:00
苏尹岚
ebe859cebf aa 2020-12-03 14:15:54 +08:00
苏尹岚
068ede19e7 aa 2020-12-03 14:07:30 +08:00
苏尹岚
c3bcc39877 a 2020-12-03 12:01:49 +08:00
苏尹岚
2937ad574c storename 2020-12-03 11:51:18 +08:00
苏尹岚
7d6bc7e68a aa 2020-12-03 11:22:10 +08:00
苏尹岚
f2e52b14b4 aa 2020-12-03 11:14:19 +08:00
苏尹岚
3af9c45fdb a 2020-12-03 08:48:31 +08:00
苏尹岚
b0f753c238 a 2020-12-02 15:23:20 +08:00
苏尹岚
f50321dcc8 aa 2020-12-02 14:52:29 +08:00
苏尹岚
08c5c00192 a 2020-12-02 14:14:23 +08:00
苏尹岚
9eb51d0748 haocaixians 2020-12-02 10:01:52 +08:00
苏尹岚
9404bb53b7 jds 2020-12-02 09:41:41 +08:00
苏尹岚
542a6b1ecc a 2020-12-02 09:15:37 +08:00
苏尹岚
845068b29a a 2020-12-02 08:56:12 +08:00
苏尹岚
53f7119f71 aa 2020-12-01 18:11:56 +08:00
苏尹岚
de86bf0b91 aa 2020-12-01 18:08:39 +08:00
苏尹岚
06cf6bec1e aa 2020-12-01 17:48:25 +08:00
苏尹岚
303a638aca a 2020-12-01 17:22:03 +08:00
苏尹岚
43186f5b12 test 2020-12-01 16:52:53 +08:00
苏尹岚
017ba5966a test 2020-12-01 14:19:21 +08:00
苏尹岚
89d0da0d3f test 2020-12-01 14:16:14 +08:00
苏尹岚
9b4a39fe6b test 2020-12-01 14:10:02 +08:00
苏尹岚
b357fe0f94 aa 2020-12-01 14:03:37 +08:00
苏尹岚
b8de0d25fa aa 2020-12-01 11:59:36 +08:00
苏尹岚
0bb932bcb4 aa 2020-12-01 11:22:02 +08:00
苏尹岚
ad896f8d3a aa 2020-11-30 10:07:29 +08:00
苏尹岚
4103fd356b a 2020-11-30 09:05:52 +08:00
苏尹岚
a6604db886 aa 2020-11-27 18:05:08 +08:00
苏尹岚
4dacdc71d3 aa 2020-11-27 17:52:46 +08:00
苏尹岚
0a8fadd843 test 2020-11-27 17:22:04 +08:00
苏尹岚
ad4d6fad08 test 2020-11-27 17:08:26 +08:00
苏尹岚
21efbad32b aa 2020-11-27 16:33:23 +08:00
苏尹岚
de502031aa aa 2020-11-27 16:30:46 +08:00
苏尹岚
934dc75ee5 aa 2020-11-27 16:27:45 +08:00
苏尹岚
6016df9311 aa 2020-11-27 15:59:05 +08:00
苏尹岚
e620f9f74e aa 2020-11-27 15:58:48 +08:00
苏尹岚
1a91a66b83 aa 2020-11-27 15:58:26 +08:00
苏尹岚
de9c3173e7 aa 2020-11-27 15:51:15 +08:00
苏尹岚
d031a0a265 a 2020-11-27 14:31:43 +08:00
苏尹岚
bae7d7f2ee jds2 2020-11-27 11:09:18 +08:00
苏尹岚
6fa46bebb6 aa 2020-11-27 09:18:05 +08:00
苏尹岚
2b1dde2931 try 2020-11-26 18:22:29 +08:00
苏尹岚
90efd04463 try 2020-11-26 18:15:28 +08:00
苏尹岚
b94492b9ce try 2020-11-26 18:02:47 +08:00
苏尹岚
462938dce0 try 2020-11-26 17:58:35 +08:00
苏尹岚
777fcf52f7 try 2020-11-26 17:44:24 +08:00
苏尹岚
7688fe50c2 try 2020-11-26 17:23:55 +08:00
苏尹岚
9e23a344ee try 2020-11-26 17:17:34 +08:00
苏尹岚
3d41d6d340 try 2020-11-26 17:13:18 +08:00
苏尹岚
ae65790f08 try 2020-11-26 17:07:53 +08:00
苏尹岚
728c907ac1 try 2020-11-26 17:01:29 +08:00
苏尹岚
566c6d454f try 2020-11-26 15:55:04 +08:00
苏尹岚
7c65775a25 chuangjian 2020-11-26 15:35:31 +08:00
苏尹岚
cf6c376757 chuangjian 2020-11-26 15:33:49 +08:00
苏尹岚
a7109fc2dc chuangjian 2020-11-26 15:01:24 +08:00
苏尹岚
ae9f838b3f chuangjian 2020-11-26 14:51:32 +08:00
苏尹岚
2ca9e25744 chuangjian 2020-11-26 14:44:55 +08:00
苏尹岚
6a1cd0f578 chuangjian 2020-11-26 14:29:15 +08:00
苏尹岚
38e6925011 chuangjian 2020-11-26 14:12:38 +08:00
苏尹岚
4d83a0a577 chuangjian 2020-11-26 14:05:04 +08:00
苏尹岚
007fc99f3a chuangjian 2020-11-26 14:04:38 +08:00
苏尹岚
b8179e66b0 chuangjian 2020-11-26 13:53:57 +08:00
苏尹岚
237f3a85e0 chuangjian 2020-11-26 13:50:02 +08:00
苏尹岚
6fa5863809 chuangjian 2020-11-26 11:52:02 +08:00
苏尹岚
f2ab362045 chuangjian 2020-11-26 11:43:42 +08:00
苏尹岚
8e4e1e8a4c chuangjian 2020-11-26 11:41:15 +08:00
苏尹岚
6835d01ee1 jds 2020-11-26 11:24:55 +08:00
苏尹岚
eef37bf4ad jds 2020-11-26 10:19:58 +08:00
苏尹岚
fc40813a4a jds 2020-11-26 10:10:58 +08:00
苏尹岚
45053920af jds 2020-11-26 10:07:26 +08:00
苏尹岚
743c966034 jds 2020-11-26 09:59:11 +08:00
苏尹岚
0a96b9f403 jds 2020-11-26 09:51:23 +08:00
苏尹岚
49a636922d jds 2020-11-26 09:47:34 +08:00
苏尹岚
b5575b363e jds 2020-11-26 09:46:12 +08:00
苏尹岚
eb577573ef aa 2020-11-26 09:40:01 +08:00
苏尹岚
58e3e3dfb2 heihei 2020-11-26 08:58:45 +08:00
苏尹岚
f4f76fd6bb tmp 2020-11-25 10:52:12 +08:00
苏尹岚
8a51c158a4 jdshop2 2020-11-25 10:04:04 +08:00
苏尹岚
aa19958d42 a 2020-11-20 18:03:53 +08:00
苏尹岚
351b69efde vendori 2020-11-20 17:12:56 +08:00
苏尹岚
b519864234 刷价格 2020-11-20 11:16:48 +08:00
苏尹岚
6fd6a85b84 vendororgcode 2020-11-20 09:15:09 +08:00
苏尹岚
09b5536cc1 京东库存同步修改,jds2 2020-11-20 08:58:08 +08:00
苏尹岚
681277d355 test 2020-11-19 17:15:51 +08:00
苏尹岚
c241149092 test 2020-11-19 17:09:44 +08:00
苏尹岚
ebec62c922 test 2020-11-19 17:05:40 +08:00
苏尹岚
fe6681b95d test 2020-11-19 17:01:05 +08:00
苏尹岚
ab977da6e2 test 2020-11-19 16:53:45 +08:00
苏尹岚
47bba8385e sync jds2 2020-11-19 16:39:39 +08:00
苏尹岚
e25a6cf680 复制京东价格 2020-11-19 15:52:52 +08:00
苏尹岚
f3bbb33c75 jds2 cat 2020-11-19 15:36:11 +08:00
苏尹岚
ee3cc67527 cookie 2020-11-19 15:22:21 +08:00
苏尹岚
6f3409b852 test 2020-11-19 15:02:32 +08:00
苏尹岚
e58b124056 tyetst 2020-11-19 13:37:28 +08:00
苏尹岚
ce7e2f619d test 2020-11-19 11:39:34 +08:00
苏尹岚
728c779002 aa 2020-11-19 11:18:30 +08:00
苏尹岚
c8ceeb6453 cookie 2020-11-19 11:10:49 +08:00
苏尹岚
66d917aea0 cookie 2020-11-19 10:48:10 +08:00
苏尹岚
6b91919789 订单发三方 2020-11-19 09:22:53 +08:00
苏尹岚
f1cb1cfd67 没商品不打印 2020-11-18 16:33:26 +08:00
苏尹岚
f9b2917c99 vendororgcode cat 2020-11-18 15:41:37 +08:00
苏尹岚
d6634b5844 jds2 cat 2020-11-18 15:22:39 +08:00
苏尹岚
67a9c517f2 jds 2020-11-18 14:57:45 +08:00
苏尹岚
694bc68ef9 test 2020-11-18 11:41:47 +08:00
苏尹岚
2fbdab5501 test 2020-11-18 11:37:46 +08:00
苏尹岚
7bcef2fa97 Merge remote-tracking branch 'origin/mark' into jdshop 2020-11-18 11:19:20 +08:00
苏尹岚
2df28fccfd temp 2020-11-18 11:15:03 +08:00
苏尹岚
b202891cae a 2020-11-18 11:05:02 +08:00
苏尹岚
a14edae2a2 aa 2020-11-18 11:04:02 +08:00
苏尹岚
a3cfcab631 jdshop2 create store 2020-11-18 10:46:07 +08:00
苏尹岚
d14bb10be7 storedetail 2020-11-18 10:22:12 +08:00
苏尹岚
5a6dae8d53 jdshop2 2020-11-18 09:48:34 +08:00
苏尹岚
81b7fae762 jds2 2020-11-18 09:30:59 +08:00
苏尹岚
ab98c19187 cao 2020-11-17 17:37:03 +08:00
苏尹岚
67cdb501a7 喜树街上调5% 2020-11-17 14:20:29 +08:00
苏尹岚
7968b7bbc2 test 2020-11-17 14:16:25 +08:00
苏尹岚
00665fd1f9 post 2020-11-16 15:10:20 +08:00
苏尹岚
9c6ea62a7b 任务分成 2020-11-16 15:04:23 +08:00
苏尹岚
7c2256d12f shauxin 0jiesuanjia 2020-11-16 14:22:54 +08:00
苏尹岚
d2e6cdc9c3 三方配送新规则 2020-11-16 09:31:13 +08:00
苏尹岚
2ef49a83d0 三方配送新规则 2020-11-16 09:28:23 +08:00
苏尹岚
878b5d85de chengdu 2020-11-13 15:34:48 +08:00
苏尹岚
83e3c9c9d3 jingdongshouhou 2020-11-13 13:56:59 +08:00
苏尹岚
f3219dda82 美团名字不要有约 2020-11-13 13:49:07 +08:00
苏尹岚
5f42850da8 美团名字不要有约 2020-11-13 13:48:36 +08:00
苏尹岚
2b74307ce6 jdprice 2020-11-12 18:28:15 +08:00
苏尹岚
abdaa91181 act 2020-11-12 18:18:32 +08:00
苏尹岚
cc8705e929 act 2020-11-12 18:12:24 +08:00
苏尹岚
796477af03 act 2020-11-12 18:01:37 +08:00
苏尹岚
ab89f3efa7 qq 2020-11-12 17:11:51 +08:00
苏尹岚
d3e8f56453 heihie 2020-11-12 16:57:02 +08:00
苏尹岚
559aef5a7c 刷新京东价 2020-11-12 15:37:24 +08:00
苏尹岚
7ad2c7508f beta 2020-11-12 15:30:31 +08:00
苏尹岚
75cba5dfb4 beta 2020-11-12 15:29:12 +08:00
苏尹岚
0498bd3b77 beta 2020-11-12 15:24:14 +08:00
苏尹岚
b41d28ff30 beta 2020-11-12 15:16:55 +08:00
苏尹岚
20dbfa5c29 beta 2020-11-12 15:10:07 +08:00
苏尹岚
f7e49363ac beta 2020-11-12 15:03:45 +08:00
苏尹岚
ea3ad9e0ec beta 2020-11-12 14:48:17 +08:00
苏尹岚
1ed629c921 beta 2020-11-12 14:38:47 +08:00
苏尹岚
216a95f230 beta 2020-11-12 14:34:43 +08:00
苏尹岚
6b6f4275b5 beta 2020-11-12 14:24:53 +08:00
苏尹岚
aba0dc681c beta 2020-11-12 14:15:02 +08:00
苏尹岚
e1c673497e beta 2020-11-12 14:09:12 +08:00
苏尹岚
682cf5d233 beta 2020-11-12 14:06:21 +08:00
苏尹岚
d28224a1f3 beta 2020-11-12 13:58:30 +08:00
苏尹岚
e44f7ad94d beta 2020-11-12 13:58:01 +08:00
苏尹岚
12bca0fa70 beta 2020-11-12 13:53:05 +08:00
苏尹岚
61d417c5d0 beta 2020-11-12 13:40:10 +08:00
苏尹岚
b63a12d9d7 beta 2020-11-12 13:35:41 +08:00
苏尹岚
59c66f71fc beta 2020-11-12 12:02:48 +08:00
苏尹岚
02fb1a9873 beta 2020-11-12 11:42:31 +08:00
苏尹岚
fe4acaac27 beta 2020-11-12 11:37:50 +08:00
苏尹岚
11f148cea9 beta 2020-11-12 11:34:14 +08:00
苏尹岚
16ec045108 beta 2020-11-12 11:27:18 +08:00
苏尹岚
f6b3e99a32 beta 2020-11-12 11:26:13 +08:00
苏尹岚
7085da94f3 beta 2020-11-12 11:22:37 +08:00
苏尹岚
33abf02a8f beta 2020-11-12 11:22:12 +08:00
苏尹岚
7633cffee1 beta 2020-11-12 11:19:34 +08:00
苏尹岚
a350224fc3 beta 2020-11-12 11:13:17 +08:00
苏尹岚
fa7200f3c6 beta 2020-11-12 11:05:02 +08:00
苏尹岚
1e77a962e7 beta 2020-11-12 10:57:45 +08:00
苏尹岚
866a7ed173 beta 2020-11-12 10:54:01 +08:00
苏尹岚
56d1785e19 beta 2020-11-12 10:47:32 +08:00
苏尹岚
6eb1ffa810 beta 2020-11-12 10:42:05 +08:00
苏尹岚
4b2e4dc8e8 beta 2020-11-12 10:36:40 +08:00
苏尹岚
f13a5fb3a2 beta 2020-11-12 08:53:17 +08:00
苏尹岚
5f0a9dd2bd beta 2020-11-12 08:46:43 +08:00
苏尹岚
734e7b3d5f ordersale 2020-11-12 08:41:20 +08:00
suyl
9428021532 xiaoxi 2020-11-12 00:16:34 +08:00
suyl
93549d78c8 Merge branch 'jdshop' of e.coding.net:rosydev/jx-callback into jdshop 2020-11-11 21:10:39 +08:00
suyl
2441a1a7d8 xiaoxi 2020-11-11 21:10:29 +08:00
苏尹岚
5a3e88fd25 heihei 2020-11-11 19:06:27 +08:00
苏尹岚
0e1067ad96 ceshi 2020-11-11 18:50:29 +08:00
苏尹岚
788c73a734 heihei 2020-11-11 18:39:35 +08:00
苏尹岚
19c58e4b4a ceshi 2020-11-11 18:08:55 +08:00
苏尹岚
8749f1d4be dingshi 2020-11-11 08:46:34 +08:00
苏尹岚
efd55100d7 meituan shuang 111 2020-11-10 18:44:16 +08:00
苏尹岚
0f46f03493 mendianbeizhu 2020-11-10 09:01:55 +08:00
苏尹岚
f3eae584a2 ebaishoudongjiedan 2020-11-10 08:57:13 +08:00
苏尹岚
99bf4c4d7c dd 2020-11-09 17:46:29 +08:00
苏尹岚
74f536584c jdsc 2020-11-09 17:07:52 +08:00
苏尹岚
172b5650b6 ebaiorder 2020-11-09 16:39:22 +08:00
苏尹岚
ea29ab48dd ebai order cuoxu 2020-11-09 16:25:39 +08:00
苏尹岚
216ca31b35 gy 2020-11-09 15:52:27 +08:00
苏尹岚
7e51b093e5 gy 2020-11-09 15:36:45 +08:00
苏尹岚
adb3c1b6dd gy 2020-11-09 15:32:17 +08:00
苏尹岚
32ed7d2f11 gy 2020-11-09 15:29:05 +08:00
苏尹岚
96d364fac4 gy 2020-11-09 15:27:22 +08:00
苏尹岚
0e2b692adc ebai 2020-11-09 10:28:40 +08:00
suyl
7600f6768f jdshp order 2020-11-08 11:53:19 +08:00
suyl
77663fa9b9 ebai 2020-11-07 17:53:36 +08:00
suyl
70977349be ebai 2020-11-07 12:42:22 +08:00
苏尹岚
9c36dc1417 新老包装 2020-11-06 15:01:56 +08:00
苏尹岚
7363cac26f test 2020-11-06 11:04:55 +08:00
苏尹岚
239c9fa0e0 test 2020-11-06 10:57:09 +08:00
苏尹岚
c888fa59ca quanxian level 2020-11-06 09:56:18 +08:00
苏尹岚
4c53a868c6 youhua 2020-11-04 14:35:47 +08:00
苏尹岚
5dd90ba32c testover 2020-11-04 14:29:31 +08:00
苏尹岚
d2d6ee0bc0 test 2020-11-04 13:58:51 +08:00
苏尹岚
81143786f3 test 2020-11-03 15:21:05 +08:00
苏尹岚
ddd1fd3924 test 2020-11-03 14:33:19 +08:00
苏尹岚
06f764ee94 test 2020-11-03 14:30:26 +08:00
苏尹岚
929595069f test 2020-11-03 14:23:27 +08:00
苏尹岚
ddc832936a gzh queryorder 2020-11-03 13:38:40 +08:00
苏尹岚
48ad86b6f7 ebai售后单 2020-11-03 11:37:37 +08:00
苏尹岚
057f49072d ceshi 2020-11-02 13:41:28 +08:00
苏尹岚
386467e1c7 shanghu 2020-11-02 11:40:28 +08:00
苏尹岚
b69f6701dc 售前删除 2020-11-02 09:41:07 +08:00
苏尹岚
8c42f34725 test 2020-10-30 13:58:16 +08:00
苏尹岚
6232cec620 profit 2020-10-29 18:27:37 +08:00
苏尹岚
6962940384 gy baozhuangf 2020-10-29 16:48:24 +08:00
苏尹岚
791a41cb83 果园可以批量 2020-10-29 10:45:50 +08:00
苏尹岚
ebdead42cb 赵哥改平台负责人 2020-10-29 09:52:32 +08:00
苏尹岚
6276cf09ff 公众号提醒加上城市和门店 2020-10-27 09:29:47 +08:00
苏尹岚
e00088ca93 果园饿百拣货完成 2020-10-26 15:38:41 +08:00
苏尹岚
7ec4495706 新疆西藏海南内蒙古运费修改 2020-10-26 10:50:56 +08:00
苏尹岚
a8421b7f12 订单利润修改 2020-10-23 17:44:56 +08:00
苏尹岚
9a0daa6b22 jds订单转移 2020-10-23 13:36:47 +08:00
苏尹岚
ce8a5517f0 ceshi over 2020-10-22 16:39:06 +08:00
苏尹岚
f81a78a0bd testuploadimg 2020-10-22 16:35:23 +08:00
苏尹岚
367a949fb8 testuploadimg 2020-10-22 16:31:08 +08:00
苏尹岚
56144b8e1b testuploadimg 2020-10-22 16:24:22 +08:00
苏尹岚
a05a04fd6c 权限加 2020-10-22 15:51:04 +08:00
苏尹岚
e2114ff395 jdsorder 大大运费 2020-10-22 10:51:32 +08:00
苏尹岚
50dd0d0844 weixin 2020-10-19 15:12:07 +08:00
苏尹岚
f6feb80971 level, jdsorder 30minu 2020-10-16 18:14:54 +08:00
苏尹岚
30433d0ebf del 2020-10-16 17:51:14 +08:00
苏尹岚
3c6fe84d2f a 2020-10-16 17:29:37 +08:00
苏尹岚
5908e49da8 storelevel 2020-10-15 15:32:56 +08:00
苏尹岚
d202109225 地址老user 2020-10-14 16:19:30 +08:00
苏尹岚
d0abf3f7ff 失败重发修改 2020-10-14 16:09:51 +08:00
苏尹岚
ee8f342617 刷新物料哦订单状态判断 2020-10-14 16:05:01 +08:00
苏尹岚
9890a1c3cf minayun 2020-10-13 15:17:13 +08:00
苏尹岚
a293c48428 totalcount 2020-10-12 17:36:23 +08:00
苏尹岚
f589df1c7f sql 2020-10-12 14:44:15 +08:00
苏尹岚
6fe58c9e88 串行了? 2020-10-12 14:43:32 +08:00
苏尹岚
34bfbda252 亏损消息推市场负责人 2020-10-12 14:12:21 +08:00
苏尹岚
b86e8b8413 刷新报价订单商品价格 2020-10-12 14:04:53 +08:00
苏尹岚
c27ffb51eb 赵哥所有门店 2020-10-12 13:49:55 +08:00
苏尹岚
14ae1bfe12 不发短信 2020-10-12 13:30:53 +08:00
苏尹岚
e504547190 用户统计 2020-10-12 11:51:31 +08:00
苏尹岚
31088be645 用户统计 2020-10-12 11:49:56 +08:00
苏尹岚
adf23c0831 饿百接单发消息 2020-10-12 10:12:47 +08:00
苏尹岚
25f97e8d6e 手动接单发消息 2020-10-12 09:31:03 +08:00
苏尹岚
79ff77f17c 手动接单发消息 2020-10-12 09:26:27 +08:00
苏尹岚
63e38075d9 excel 2020-10-10 17:57:40 +08:00
苏尹岚
5c12ff9c91 excel 2020-10-10 17:54:29 +08:00
苏尹岚
14a0254ae6 excel 2020-10-10 17:48:52 +08:00
苏尹岚
05c8f2343c excel 2020-10-10 17:45:23 +08:00
苏尹岚
dde30ae1ad excel 2020-10-10 17:42:30 +08:00
苏尹岚
4e9d0965b0 excel 2020-10-10 17:38:24 +08:00
苏尹岚
dd3d1e9d49 excel 2020-10-10 17:38:08 +08:00
苏尹岚
556fbf8908 excel 2020-10-10 17:31:14 +08:00
苏尹岚
a928837c60 excel 2020-10-10 17:19:10 +08:00
苏尹岚
b3dd78d37c excel 2020-10-10 17:14:42 +08:00
苏尹岚
602f6e3537 excel 2020-10-10 16:45:51 +08:00
苏尹岚
e1184a1195 Merge remote-tracking branch 'origin/mark' 2020-05-28 09:40:00 +08:00
苏尹岚
bd83ec9b18 Merge branch 'master' of e.coding.net:rosydev/jx-callback 2020-05-19 17:38:02 +08:00
苏尹岚
c6375e437e Merge remote-tracking branch 'origin/mark' 2020-05-19 17:37:49 +08:00
苏尹岚
c422b5e3f3 Accept Merge Request #199: (mark -> master)
Merge Request: 更新master
Created By: @苏尹岚
Accepted By: @苏尹岚
URL: https://rosydev.coding.net/p/jx-callback/d/jx-callback/git/merge/199
2020-04-01 16:32:23 +08:00
苏尹岚
903bcdf3dc Merge remote-tracking branch 'origin/mark' 2020-03-03 09:50:01 +08:00
苏尹岚
d2aa139c37 Merge branch 'master' of e.coding.net:rosydev/jx-callback 2020-03-03 09:48:50 +08:00
苏尹岚
690c776d13 Merge branch 'su' 2019-10-31 17:45:31 +08:00
苏尹岚
f58ec8a9b7 Merge branch 'su' 2019-10-31 13:34:52 +08:00
苏尹岚
6f50903ef4 Merge branch 'su'
统计订单信息接口
2019-10-30 17:57:23 +08:00
213 changed files with 21441 additions and 7164 deletions

1
.gitignore vendored
View File

@@ -15,3 +15,4 @@ param_parser.go
*.exe
*.exe~
.vscode
.idea

View File

@@ -212,6 +212,9 @@ func SendVerifyCode(authToken, captchaID, captchaValue, authID string) (verfifyC
if handler := authers[authType]; handler == nil {
err = ErrIllegalAuthType
} else {
//if user, _ := dao.GetUserByID(dao.GetDB(), "mobile", authID); user != nil {
// return "", authInfo, fmt.Errorf("该用户已存在,请勿重复注册!")
//}
verfifyCode, err = handler.SendVerifyCode(authID)
}
}
@@ -243,6 +246,7 @@ func LoginInternal(ctx *Context, authType, authID, authIDType, authSecret string
realAuthID = user.GetID()
}
if authBindEx, err = handler.VerifySecret(realAuthID, authSecret); err == nil {
globals.SugarLogger.Debugf("Login authBindEx", utils.Format4Output(authBindEx, false))
if authBindEx == nil { // mobile, email会返回nil表示不会新建AuthBind实体
user = userProvider.GetUser(authID, authIDType)
authBindEx = &AuthBindEx{
@@ -265,6 +269,10 @@ func LoginInternal(ctx *Context, authType, authID, authIDType, authSecret string
// if user != nil {
// authBindEx.UserID = user.GetID()
// }
if user2 := userProvider.GetUser(authBindEx.UserHint.Email, UserIDMobile); user2 != nil {
user = user2
}
} else if authBindEx.UserID != "" {
user = userProvider.GetUser(authBindEx.UserID, UserIDID)
}
@@ -276,9 +284,9 @@ func LoginInternal(ctx *Context, authType, authID, authIDType, authSecret string
//如果是小程序
if authType == "weixinmini" || authType == "weixinapp" {
appID := strings.Split(authSecret, ",")[0]
if appID == "wx08a5c2a8581414ff" || appID == "wx2d6949f724b2541d" || appID == "wx18111a41fd17f24f" { //菜市或者果园
if user != nil {
binds, err := dao.GetUserBindAuthInfo(dao.GetDB(), user.GetID(), 0, nil, "", "", "wx2bb99eb5d2c9b82c")
if appID == "wx08a5c2a8581414ff" || appID == "wx2d6949f724b2541d" || appID == "wx18111a41fd17f24f" || appID == "wx4b5930c13f8b1170" { //菜市或者果园
if authInfo.AuthBindInfo.UserID != "" {
binds, err := dao.GetUserBindAuthInfo(dao.GetDB(), authInfo.AuthBindInfo.UserID, 0, nil, "", "", []string{"wx2bb99eb5d2c9b82c", "wx4b5930c13f8b1170"})
if err != nil {
return authInfo, err
}
@@ -339,6 +347,18 @@ func AddAuthBind(user IUser, newAuthInfo *AuthInfo) (err error) {
return err
}
func AddAuthBindWithMobile(authInfo *AuthInfo, mobile string) (err error) {
if handler := authers[authInfo.AuthBindInfo.Type]; handler != nil {
user, _ := dao.GetUserByID(dao.GetDB(), "mobile", mobile)
authInfo.AuthBindInfo.UserID = user.UserID
//handler.UnbindAuth(user.GetID(), newAuthInfo.GetAuthType(), newAuthInfo.GetAuthTypeID(), user.GetName())
err = handler.AddAuthBind(authInfo.AuthBindInfo, user.GetName())
} else {
err = ErrIllegalAuthType
}
return err
}
func UnbindAuth(userID, authType, authTypeID, userName string) (err error) {
globals.SugarLogger.Debugf("UnbindAuth userID:%s, authType:%s, authTypeID:%s, userName:%s", userID, authType, authTypeID, userName)
if handler := authers[authType]; handler != nil {
@@ -462,7 +482,7 @@ func DisableUser(userID, operatorUserName string) (err error) {
}
func GetUserBindAuthInfo(userID string) (authList []*model.AuthBind, err error) {
return dao.GetUserBindAuthInfo(dao.GetDB(), userID, model.AuthBindTypeAuth, nil, "", "", "")
return dao.GetUserBindAuthInfo(dao.GetDB(), userID, model.AuthBindTypeAuth, nil, "", "", nil)
}
func DeletedTokenInfoWithoutParam(authInfo *AuthInfo) (err error) {

View File

@@ -10,6 +10,8 @@ import (
const (
AuthType = "alipaycode"
AuthKey = "GHp3ojlVYRRu2XID4FX2ew=="
)
type Auther struct {
@@ -29,14 +31,11 @@ func (a *Auther) VerifySecret(dummy, code string) (authBindEx *auth2.AuthBindEx,
globals.SugarLogger.Debugf("VerifySecret dummy:%s, code:%s", dummy, code)
tokenInfo, err := api.AliPayAPI.SystemAuthToken(alipayapi.GrantTypeCode, code, "")
if err == nil {
userInfo, err2 := api.AliPayAPI.UserInfoShare(tokenInfo.AccessToken)
if err = err2; err == nil {
if authBindEx, err = a.UnionFindAuthBind(AuthType, api.AliPayAPI.GetAppID(), nil, userInfo.UserID, "", userInfo); err == nil {
authBindEx.UserHint = &auth2.UserBasic{
Name: userInfo.NickName,
Avatar: userInfo.Avatar,
}
}
//userInfo, err2 := api.AliPayAPI.UserInfoShare(tokenInfo.AccessToken)
//if err = err2; err == nil {
if authBindEx, err = a.UnionFindAuthBind(AuthType, api.AliPayAPI.GetAppID(), nil, tokenInfo.UserID, tokenInfo.AlipayUserID, tokenInfo); err == nil {
authBindEx.AuthSecret = tokenInfo.AccessToken
authBindEx.AuthSecret2 = tokenInfo.RefreshToken
}
}
return authBindEx, err

View File

@@ -82,7 +82,7 @@ func (a *DefAuther) UnionFindAuthBind(curAuthType, curAuthTypeID string, unionAu
} else if dao.IsNoRowsError(err) { // 直接找不到尝试unionID
if unionID != "" { // 且有unionID
var authBindList []*model.AuthBind
if authBindList, err = dao.GetUserBindAuthInfo(db, "", model.AuthBindTypeAuth, unionAuthTypeList, "", unionID, ""); err == nil && len(authBindList) > 0 { // 通过unionID找到至少一个认证方式
if authBindList, err = dao.GetUserBindAuthInfo(db, "", model.AuthBindTypeAuth, unionAuthTypeList, "", unionID, nil); err == nil && len(authBindList) > 0 { // 通过unionID找到至少一个认证方式
authBind = authBindList[0]
authBind.Type = curAuthType
authBind.TypeID = curAuthTypeID

View File

@@ -57,11 +57,12 @@ func init() {
}
func (a *Auther) VerifySecret(id, secret string) (authBindEx *auth2.AuthBindEx, err error) {
globals.SugarLogger.Debugf("weixin VerifySecret id:%s secret:%s", secret, secret)
globals.SugarLogger.Debugf("weixin VerifySecret id:%s secret:%s", id, secret)
var openID, accessToken string
_, jsCode := SplitJsCode(secret)
if a.authType != AuthTypeWXNative {
state := id
code := secret
code := jsCode
if state == "" {
token, err2 := a.getAPI().SNSRetrieveToken(code)
if err = err2; err == nil {

View File

@@ -2,7 +2,6 @@ package weixin
import (
"errors"
"fmt"
"strings"
"git.rosy.net.cn/baseapi/platformapi/weixinapi"
@@ -57,20 +56,20 @@ func (a *MiniAuther) DecryptData(authInfo *auth2.AuthInfo, jsCode, encryptedData
if jsCode != "" {
sessionInfo, err := getWxApp(appID).SNSCode2Session(jsCode)
if err == nil {
if authBindEx, err := a.UnionFindAuthBind(AuthTypeMini, getWxApp(appID).GetAppID(), []string{AuthTypeMini}, sessionInfo.OpenID, "", nil); err == nil {
if authBindEx.UserID != authInfo.GetID() {
return "", fmt.Errorf("jsCode与token不匹配")
}
} else {
return "", err
}
// if authBindEx, err := a.UnionFindAuthBind(AuthTypeMini, getWxApp(appID).GetAppID(), []string{AuthTypeMini}, sessionInfo.OpenID, "", nil); err == nil {
// if authBindEx.UserID != authInfo.GetID() {
// return "", fmt.Errorf("jsCode与token不匹配")
// }
// } else {
// return "", err
// }
sessionKey = sessionInfo.SessionKey
} else {
return "", err
}
} else {
if authInfo.AuthBindInfo.Type != AuthTypeMini {
return "", ErrAuthTypeShouldBeMini
// return "", ErrAuthTypeShouldBeMini
}
sessionKey = authInfo.AuthBindInfo.UserData.(string)
}
@@ -79,7 +78,7 @@ func (a *MiniAuther) DecryptData(authInfo *auth2.AuthInfo, jsCode, encryptedData
if err != nil {
return "", err
}
authInfo.AuthBindInfo.UserData = sessionKey
// authInfo.AuthBindInfo.UserData = sessionKey
return string(decryptedData), nil
}
@@ -92,6 +91,9 @@ func getWxApp(appID string) (miniApi *weixinapi.API) {
if len(appID) > 0 && appID == api.WeixinMiniAppID2 {
miniApi = api.WeixinMiniAPI2
}
if len(appID) > 0 && appID == api.WeixinMiniAppIDsc {
miniApi = api.WeixinMiniAPIsc
}
return miniApi
}

View File

@@ -3,7 +3,7 @@ package casbinauth
import (
jxmodel "git.rosy.net.cn/jx-callback/business/model"
"git.rosy.net.cn/jx-callback/globals"
"github.com/astaxie/beego/orm"
"github.com/astaxie/beego/client/orm"
"github.com/casbin/casbin/model"
"github.com/casbin/casbin/persist"
)

View File

@@ -33,7 +33,7 @@ func (c *OrderManager) OnNewFakeJdOrder(vendorOrderID string) (err error) {
func (c *OrderManager) notifyNewFakeJdOrder(order *model.GoodsOrder) (err error) {
db := dao.GetDB()
storeDetail, err := dao.GetStoreDetailByVendorStoreID(db, order.VendorStoreID, model.VendorIDJD)
storeDetail, err := dao.GetStoreDetailByVendorStoreID(db, order.VendorStoreID, model.VendorIDJD, "")
if err != nil {
return err
}
@@ -69,6 +69,6 @@ func notifyWxNewFakeJdOrder(order *model.GoodsOrder, storeID int) (err error) {
title := fmt.Sprintf("你有到家菜市新订单%d", order.OrderSeq)
content := sb.String()
// globals.SugarLogger.Debugf("notifyWxNewFakeJdOrder, orderID:%s, content:%s", order.VendorOrderID, content)
_, err = weixinmsg.SendStoreMessage(jxcontext.AdminCtx, title, content, []int{storeID}, true, true)
_, err = weixinmsg.SendStoreMessage(jxcontext.AdminCtx, title, content, []int{storeID}, nil, "", model.MessageTypeStore, true, true)
return err
}

View File

@@ -18,10 +18,10 @@ const (
// 处理正向订单结账信息
func (c *OrderManager) SaveOrderFinancialInfo(order *model.OrderFinancial, operation string) (err error) {
db := dao.GetDB()
dao.Begin(db)
txDB , _ := dao.Begin(db)
defer func() {
if r := recover(); r != nil || err != nil {
dao.Rollback(db)
dao.Rollback(db, txDB)
if r != nil {
panic(r)
}
@@ -57,7 +57,7 @@ func (c *OrderManager) SaveOrderFinancialInfo(order *model.OrderFinancial, opera
globals.SugarLogger.Warnf("On SaveOrderDiscountFinancialInfo order.VendorOrderID:%s err: order is err", order.VendorOrderID)
return err
}
dao.Rollback(db)
dao.Rollback(db, txDB)
return nil
}
}
@@ -105,7 +105,7 @@ func (c *OrderManager) SaveOrderFinancialInfo(order *model.OrderFinancial, opera
globals.SugarLogger.Warnf("On SaveOrderSkuFinancialInfo order.VendorOrderID:%s err:%v", order.VendorOrderID, err)
return err
}
dao.Rollback(db)
dao.Rollback(db, txDB)
return nil
}
}
@@ -126,7 +126,7 @@ func (c *OrderManager) SaveOrderFinancialInfo(order *model.OrderFinancial, opera
globals.SugarLogger.Warnf("On SaveOrderSkuFinancialInfo order.VendorOrderID:%s err:%v", order.VendorOrderID, err)
return err
}
dao.Rollback(db)
dao.Rollback(db, txDB)
return nil
}
} else {
@@ -139,10 +139,10 @@ func (c *OrderManager) SaveOrderFinancialInfo(order *model.OrderFinancial, opera
globals.SugarLogger.Warnf("On SaveOrderFinancialInfo order.VendorOrderID:%s err: order is err", order.VendorOrderID)
return err
}
dao.Rollback(db)
dao.Rollback(db, txDB)
return nil
}
dao.Commit(db)
dao.Commit(db, txDB)
return err
}
@@ -150,10 +150,10 @@ func (c *OrderManager) SaveOrderFinancialInfo(order *model.OrderFinancial, opera
func (c *OrderManager) SaveAfsOrderFinancialInfo(afsOrder *model.AfsOrder) (err error) {
globals.SugarLogger.Debug(afsOrder.AfsOrderID)
db := dao.GetDB()
dao.Begin(db)
txDB , _ := dao.Begin(db)
defer func() {
if r := recover(); r != nil || err != nil {
dao.Rollback(db)
dao.Rollback(db, txDB)
if r != nil {
panic(r)
}
@@ -168,7 +168,7 @@ func (c *OrderManager) SaveAfsOrderFinancialInfo(afsOrder *model.AfsOrder) (err
globals.SugarLogger.Warnf("On SaveAfsOrderFinancialInfo afsOrder.AfsOrderID:%s err: SaveAfsOrder is err", afsOrder.AfsOrderID)
return err
}
dao.Rollback(db)
dao.Rollback(db, txDB)
return nil
}
@@ -182,7 +182,7 @@ func (c *OrderManager) SaveAfsOrderFinancialInfo(afsOrder *model.AfsOrder) (err
globals.SugarLogger.Warnf("On SaveAfsOrderFinancialInfo afsOrder.AfsOrderID:%s err: SaveAfsOrderSku is err", afsOrder.AfsOrderID)
return err
}
dao.Rollback(db)
dao.Rollback(db, txDB)
return nil
}
}
@@ -194,13 +194,13 @@ func (c *OrderManager) SaveAfsOrderFinancialInfo(afsOrder *model.AfsOrder) (err
globals.SugarLogger.Warnf("On SaveAfsOrderFinancialInfo afsOrder.AfsOrderID:%s err: SaveAfsOrderSku is err", afsOrder.AfsOrderID)
return err
}
dao.Rollback(db)
dao.Rollback(db, txDB)
return nil
}
} else {
globals.SugarLogger.Warnf("On SaveAfsOrderFinancialInfo afsOrder.AfsOrderID:%s err: afsOrder have no sku", afsOrder.AfsOrderID)
}
dao.Commit(db)
dao.Commit(db, txDB)
return err
}
@@ -212,10 +212,10 @@ func (c *OrderManager) UpdataOrderFinancialInfo(orderFinancial *model.OrderFinan
// orderFinancial.JxFreightMoney = wayBill.DesiredFee
// }
db := dao.GetDB()
dao.Begin(db)
txDB , _ := dao.Begin(db)
defer func() {
if r := recover(); r != nil || err != nil {
dao.Rollback(db)
dao.Rollback(db, txDB)
if r != nil {
panic(r)
}
@@ -254,7 +254,7 @@ func (c *OrderManager) UpdataOrderFinancialInfo(orderFinancial *model.OrderFinan
globals.SugarLogger.Warnf("On SaveOrderFinancialInfo err: order is err")
return err
}
dao.Commit(db)
dao.Commit(db, txDB)
// orderFinancial 和 OrderSkuFinancial 数据计算完毕,准备进行更新
return err
}

File diff suppressed because it is too large Load Diff

View File

@@ -2,6 +2,7 @@ package orderman
import (
"strings"
"time"
"git.rosy.net.cn/baseapi/utils"
"git.rosy.net.cn/jx-callback/business/jxcallback/scheduler"
@@ -10,7 +11,7 @@ import (
"git.rosy.net.cn/jx-callback/business/model/dao"
"git.rosy.net.cn/jx-callback/business/partner"
"git.rosy.net.cn/jx-callback/globals"
"github.com/astaxie/beego/orm"
"github.com/astaxie/beego/client/orm"
)
func (c *OrderManager) LoadAfsOrder(vendorAfsOrderID string, vendorID int) (afsOrder *model.AfsOrder, err error) {
@@ -54,7 +55,7 @@ func (c *OrderManager) onAfsOrderNew(afsOrder *model.AfsOrder, orderStatus *mode
if order, _ := c.LoadOrder(afsOrder.VendorOrderID, afsOrder.VendorID); order != nil {
if order.ConsigneeMobile2 == "" {
if handler := partner.GetPurchaseOrderHandlerFromVendorID(order.VendorID); handler != nil {
if order2, _ := handler.GetOrder(order.VendorOrgCode, order.VendorOrderID); order2 != nil && order.ConsigneeMobile != order2.ConsigneeMobile {
if order2, _ := handler.GetOrder(order.VendorOrgCode, order.VendorOrderID, order.VendorStoreID); order2 != nil && order.ConsigneeMobile != order2.ConsigneeMobile {
order.ConsigneeMobile = order2.ConsigneeMobile
c.UpdateOrderFields(order, []string{"ConsigneeMobile"})
}
@@ -62,10 +63,10 @@ func (c *OrderManager) onAfsOrderNew(afsOrder *model.AfsOrder, orderStatus *mode
}
}
//
dao.Begin(db)
txDB, _ := dao.Begin(db)
defer func() {
if r := recover(); r != nil || err != nil {
dao.Rollback(db)
dao.Rollback(db, txDB)
panic(r)
}
}()
@@ -73,7 +74,7 @@ func (c *OrderManager) onAfsOrderNew(afsOrder *model.AfsOrder, orderStatus *mode
globals.SugarLogger.Debugf("onAfsOrderNew afsOrderID:%s, isDuplicated:%t", afsOrder.AfsOrderID, isDuplicated)
if err != nil || isDuplicated {
if err == nil {
dao.Commit(db)
dao.Commit(db, txDB)
}
return err
}
@@ -101,7 +102,7 @@ func (c *OrderManager) onAfsOrderNew(afsOrder *model.AfsOrder, orderStatus *mode
}
}
dao.Commit(db)
dao.Commit(db, txDB)
scheduler.CurrentScheduler.OnAfsOrderNew(afsOrder, false)
return err
}
@@ -114,10 +115,11 @@ func (c *OrderManager) SaveAfsOrder(db *dao.DaoDB, afsOrder *model.AfsOrder, isD
if err = c.updateAfsOrderOtherInfo(db, afsOrder); err != nil {
return err
}
dao.Begin(db)
globals.SugarLogger.Debugf("SaveAfsOrder afsorder :%v", utils.Format4Output(afsOrder, true))
txDB, _ := dao.Begin(db)
defer func() {
if r := recover(); r != nil || err != nil {
dao.Rollback(db)
dao.Rollback(db, txDB)
if r != nil {
panic(r)
}
@@ -172,30 +174,30 @@ func (c *OrderManager) SaveAfsOrder(db *dao.DaoDB, afsOrder *model.AfsOrder, isD
} else {
globals.SugarLogger.Warnf("On SaveAfsOrder afsOrder.AfsOrderID:%s err: afsOrder have no sku", afsOrder.AfsOrderID)
}
dao.Commit(db)
dao.Commit(db, txDB)
return err
}
func (c *OrderManager) OnAfsOrderStatusChanged(orderStatus *model.OrderStatus) (err error) {
db := dao.GetDB()
c.setAfsOrderID(db, orderStatus)
dao.Begin(db)
txDB, _ := dao.Begin(db)
defer func() {
if r := recover(); r != nil {
dao.Rollback(db)
dao.Rollback(db, txDB)
panic(r)
}
}()
isDuplicated, afsOrder, err := c.addAfsOrderStatus(db, orderStatus)
if err != nil || isDuplicated {
if err == nil {
dao.Commit(db)
dao.Commit(db, txDB)
} else {
dao.Rollback(db)
dao.Rollback(db, txDB)
}
return err
}
dao.Commit(db)
dao.Commit(db, txDB)
scheduler.CurrentScheduler.OnAfsOrderStatusChanged(afsOrder, orderStatus, false)
return err
}
@@ -221,7 +223,16 @@ func (c *OrderManager) addAfsOrderStatus(db *dao.DaoDB, orderStatus *model.Order
}
if model.IsAfsOrderFinalStatus(orderStatus.Status) {
order.AfsFinishedAt = orderStatus.StatusTime
if utils.IsTimeZero(order.AfsFinishedAt) {
order.AfsFinishedAt = time.Now()
}
updateFields = append(updateFields, "AfsFinishedAt")
if handler := partner.GetPurchaseOrderHandlerFromVendorID(order.VendorID); handler != nil {
if orderAfsInfo, err := handler.GetOrderAfsInfo(nil, order.VendorOrderID, order.AfsOrderID); err == nil && orderAfsInfo.AfsTotalShopMoney != 0 {
order.AfsTotalShopMoney = orderAfsInfo.AfsTotalShopMoney
}
updateFields = append(updateFields, "AfsTotalShopMoney")
}
}
utils.CallFuncLogError(func() error {
_, err = dao.UpdateEntity(db, order, updateFields...)
@@ -320,7 +331,7 @@ func (c *OrderManager) updateAfsOrderSkuOtherInfo(db *dao.DaoDB, order *model.Af
func (c *OrderManager) updateAfsOrderOtherInfo(db *dao.DaoDB, afsOrder *model.AfsOrder) (err error) {
globals.SugarLogger.Debugf("updateAfsOrderOtherInfo orderID:%s, VendorStoreID:%s", afsOrder.VendorOrderID, afsOrder.VendorStoreID)
if afsOrder.VendorStoreID != "" {
if storeDetail, err := dao.GetStoreDetailByVendorStoreID(db, afsOrder.VendorStoreID, 0); err == nil {
if storeDetail, err := dao.GetStoreDetailByVendorStoreID(db, afsOrder.VendorStoreID, 0, ""); err == nil {
afsOrder.JxStoreID = storeDetail.Store.ID
}
}
@@ -336,6 +347,11 @@ func (c *OrderManager) updateAfsOrderOtherInfo(db *dao.DaoDB, afsOrder *model.Af
}
}
if err == nil {
if handler := partner.GetPurchaseOrderHandlerFromVendorID(afsOrder.VendorID); handler != nil {
if orderAfsInfo, err := handler.GetOrderAfsInfo(nil, afsOrder.VendorOrderID, afsOrder.AfsOrderID); err == nil && orderAfsInfo.AfsTotalShopMoney != 0 {
afsOrder.AfsTotalShopMoney = orderAfsInfo.AfsTotalShopMoney
}
}
if err = c.updateAfsOrderSkuOtherInfo(db, afsOrder); err == nil {
jxutils.RefreshAfsOrderSkuRelated(afsOrder)
}

View File

@@ -85,7 +85,7 @@ func (c *OrderManager) OnOrderComments(orderCommentList []*model.OrderComment) (
err = nil
isNewComment = true
if orderComment.IsReplied == 0 && time.Now().Sub(orderComment.CommentCreatedAt) < time.Duration(orderComment.ModifyDuration)*time.Hour {
if storeDetail, err2 := dao.GetStoreDetail(db, orderComment.StoreID, orderComment.VendorID); err2 == nil {
if storeDetail, err2 := dao.GetStoreDetail(db, orderComment.StoreID, orderComment.VendorID, ""); err2 == nil {
if storeDetail.AutoReplyType == model.AutoReplyAll ||
orderComment.Score > JX_BAD_COMMENTS_MAX_LEVEL && storeDetail.AutoReplyType == model.AutoReplyGoodComment {
c.replyOrderComment(storeDetail.VendorOrgCode, orderComment)
@@ -112,7 +112,7 @@ func (c *OrderManager) OnOrderComments(orderCommentList []*model.OrderComment) (
orderComment.ConsigneeMobile = order.ConsigneeMobile2
} else {
if handler := partner.GetPurchaseOrderHandlerFromVendorID(order.VendorID); handler != nil {
if order2, _ := handler.GetOrder(order.VendorOrgCode, order.VendorOrderID); order2 != nil && order.ConsigneeMobile != order2.ConsigneeMobile {
if order2, _ := handler.GetOrder(order.VendorOrgCode, order.VendorOrderID, order.VendorStoreID); order2 != nil && order.ConsigneeMobile != order2.ConsigneeMobile {
order.ConsigneeMobile = order2.ConsigneeMobile
partner.CurOrderManager.UpdateOrderFields(order, []string{"ConsigneeMobile"})
}
@@ -120,7 +120,7 @@ func (c *OrderManager) OnOrderComments(orderCommentList []*model.OrderComment) (
orderComment.ConsigneeMobile = order.ConsigneeMobile
}
} else {
if storeDetail, err := dao.GetStoreDetailByVendorStoreID(db, orderComment.VendorStoreID, orderComment.VendorID); err == nil {
if storeDetail, err := dao.GetStoreDetailByVendorStoreID(db, orderComment.VendorStoreID, orderComment.VendorID, ""); err == nil {
orderComment.StoreID = storeDetail.ID
}
}

View File

@@ -70,11 +70,11 @@ func addOrderOrWaybillStatus(status *model.OrderStatus, db *dao.DaoDB) (isDuplic
} else {
globals.SugarLogger.Debugf("addOrderStatus afsOrder:%v", status)
}
dao.Begin(db)
txDB , _ := dao.Begin(db)
defer func() {
if r := recover(); r != nil || err != nil {
globals.SugarLogger.Debug("rollback")
dao.Rollback(db)
dao.Rollback(db, txDB)
if r != nil {
panic(r)
}
@@ -98,7 +98,7 @@ func addOrderOrWaybillStatus(status *model.OrderStatus, db *dao.DaoDB) (isDuplic
// todo 这里居然会有主键重复错误,逻辑上是不应该的
globals.SugarLogger.Warnf("addOrderOrWaybillStatus status:%v, access db error:%v", status, err)
} else {
dao.Commit(db)
dao.Commit(db, txDB)
}
return isDuplicated, err
}
@@ -156,7 +156,7 @@ func LoadPendingOrders() {
for _, item := range sortOrders {
if order, ok := item.(*model.GoodsOrder); ok {
jxutils.CallMsgHandlerAsync(func() {
scheduler.CurrentScheduler.OnOrderNew(order, true)
scheduler.CurrentScheduler.OnOrderNew(order, true, true)
}, jxutils.ComposeUniversalOrderID(order.VendorOrderID, order.VendorID))
} else if status, ok := item.(*model.OrderStatus); ok {
jxutils.CallMsgHandlerAsync(func() {

View File

@@ -1,18 +1,20 @@
package orderman
import (
"encoding/json"
"fmt"
"math"
"strconv"
"strings"
"time"
"github.com/astaxie/beego"
"git.rosy.net.cn/jx-callback/business/jxstore/permission"
"git.rosy.net.cn/jx-callback/globals/api"
beego "github.com/astaxie/beego/server/web"
"git.rosy.net.cn/jx-callback/business/jxutils/tasksch"
"git.rosy.net.cn/baseapi/platformapi/jdapi"
"git.rosy.net.cn/baseapi/utils"
"git.rosy.net.cn/jx-callback/business/jxutils"
"git.rosy.net.cn/jx-callback/business/jxutils/excel"
@@ -22,15 +24,14 @@ import (
"git.rosy.net.cn/jx-callback/business/partner"
"git.rosy.net.cn/jx-callback/globals"
"git.rosy.net.cn/jx-callback/globals/api/apimanager"
"github.com/astaxie/beego/orm"
)
const (
maxLastHours = 7 * 24 // 最多只能查询7天内的订单数据
defLastHours = 2 * 24 // 缺省是两天内的订单
orderSubTimeImmediatelyArrive = 8
orderSubTimeDelayArrive = 5
orderSubTimeImmediatelyArrive = 1
orderSubTimeDelayArrive = 1
)
type tWaybillExt struct {
@@ -71,7 +72,14 @@ func (c *OrderManager) GetStoreOrderCountInfo(ctx *jxcontext.Context, storeID, l
} else if lastHours == 0 && lastMinutes == 0 {
lastHours = defLastHours
}
//权限
if permission.IsRoled(ctx) {
if storeIDsMap, err := permission.GetUserStoresResultMap(ctx.GetUserID()); err == nil {
if storeIDsMap[storeID] == 0 {
storeID = -1
}
}
}
db := dao.GetDB()
sql := `
SELECT t1.lock_status, t1.status, COUNT(*) count
@@ -122,7 +130,7 @@ func (c *OrderManager) GetOrderSkuInfo(ctx *jxcontext.Context, vendorOrderID str
t1.sku_name,
t1.sale_price,
t1.shop_price,
CAST(IF(t1.earning_price <> 0, t1.earning_price, IF(t1.shop_price <> 0 && t1.shop_price < t1.sale_price, t1.shop_price, t1.sale_price) * IF(t5.pay_percentage > 0, t5.pay_percentage, ?) / 100) AS SIGNED) earning_price,
CAST(IF(t1.earning_price <> 0, t1.earning_price, IF(t1.shop_price <> 0 && t1.shop_price < t1.sale_price, t1.shop_price, t1.sale_price) * IF(t6.order_pay_percentage > 0, t6.order_pay_percentage, ?) / 100) AS SIGNED) earning_price,
t1.weight,
t1.sku_type,
t1.promotion_type,
@@ -132,14 +140,15 @@ func (c *OrderManager) GetOrderSkuInfo(ctx *jxcontext.Context, vendorOrderID str
t1.vendor_price,
%s full_sku_name,
t2.name_id,
t3.img image
t3.img image,
t3.upc
FROM order_sku t1
LEFT JOIN goods_order t6 ON t6.vendor_order_id = t1.vendor_order_id AND t6.vendor_id = t1.vendor_id
LEFT JOIN store t5 ON t5.id = IF(t6.jx_store_id <> 0, t6.jx_store_id, t6.store_id)
LEFT JOIN sku t2 ON IF(t1.jx_sku_id != 0, t1.jx_sku_id, t1.sku_id) = t2.id/* AND t2.deleted_at = ?*/
LEFT JOIN sku_name t3 ON t2.name_id = t3.id/* AND t3.deleted_at = ?*/
WHERE t1.vendor_order_id = ? AND t1.vendor_id = ?
ORDER BY t1.sku_name
ORDER BY t1.id
`, fullSkuNameSQL)
err = dao.GetRows(dao.GetDB(), &skus, sql /*, utils.DefaultTimeValue, utils.DefaultTimeValue*/, model.DefaultEarningPricePercentage, vendorOrderID, vendorID)
if err != nil {
@@ -154,31 +163,49 @@ func (c *OrderManager) GetOrderSkuInfo(ctx *jxcontext.Context, vendorOrderID str
func (c *OrderManager) GetOrderInfo(ctx *jxcontext.Context, vendorOrderID string, vendorID int, isRefresh bool) (order *model.GoodsOrderExt, err error) {
globals.SugarLogger.Debugf("GetOrderInfo orderID:%s", vendorOrderID)
db := orm.NewOrm()
db := dao.GetDB()
orders := []*model.GoodsOrderExt{}
rorder, _ := dao.GetSimpleOrder(db, vendorOrderID)
sqlParams := []interface{}{}
// 这里用QueryRows而不用QueryRow的原因是用QueryRow在这种情况下不能将数据读出很奇怪。大概的原因是QueryRow对于GoodsOrderExt这种有嵌入的struct处理有问题
num, err := db.Raw(`
SELECT t3.*,ROUND(t3.shop_sum_price/t3.count) avg_price, t1.*, t2.status waybill_status, t2.courier_name, t2.courier_mobile, t2.desired_fee,
CAST(t1.consignee_lng AS DECIMAL(15,6))/1000000 float_lng,
CAST(t1.consignee_lat AS DECIMAL(15,6))/1000000 float_lat
FROM goods_order t1
LEFT JOIN waybill t2 ON t1.vendor_waybill_id = t2.vendor_waybill_id AND t1.waybill_vendor_id = t2.waybill_vendor_id
JOIN (
SELECT count(a.vendor_order_id) count,SUM(a.shop_price) -
IFNULL(SUM(c.sku_user_money+c.freight_user_money+c.afs_freight_money+c.box_money+c.tongcheng_freight_money+c.sku_box_money),0) shop_sum_price,a.vendor_user_id,count(d.score < 3 or NULL) bad_comment_count
FROM goods_order a
LEFT JOIN afs_order c ON a.vendor_order_id = c.vendor_order_id AND c.vendor_id = a.vendor_id
LEFT JOIN jx_bad_comments d ON d.order_id = a.vendor_order_id AND d.order_flag = a.vendor_id
WHERE a.vendor_user_id = (SELECT vendor_user_id FROM goods_order WHERE vendor_order_id = ?)
GROUP BY a.vendor_user_id
)t3 ON t3.vendor_user_id = t1.vendor_user_id
WHERE t1.vendor_order_id = ? AND vendor_id = ?
`, vendorOrderID, vendorOrderID, vendorID).QueryRows(&orders)
if err == nil && num > 0 {
sql := `
SELECT
`
if rorder.VendorUserID != "" {
sql += `
t3.*,ROUND(t3.shop_sum_price/t3.count) avg_price,
`
}
sql += `
t1.*, t2.status waybill_status, t2.courier_name, t2.courier_mobile, t2.desired_fee,
CAST(t1.consignee_lng AS DECIMAL(15,6))/1000000 float_lng,
CAST(t1.consignee_lat AS DECIMAL(15,6))/1000000 float_lat
FROM goods_order t1
LEFT JOIN waybill t2 ON t1.vendor_waybill_id = t2.vendor_waybill_id AND t1.waybill_vendor_id = t2.waybill_vendor_id
`
if rorder.VendorUserID != "" {
sql += `
JOIN (
SELECT count(a.vendor_order_id) count,SUM(a.shop_price) -
IFNULL(SUM(c.sku_user_money+c.freight_user_money+c.afs_freight_money+c.box_money+c.tongcheng_freight_money+c.sku_box_money),0) shop_sum_price,a.vendor_user_id,count(d.score < 3 or NULL) bad_comment_count
FROM goods_order a
LEFT JOIN afs_order c ON a.vendor_order_id = c.vendor_order_id AND c.vendor_id = a.vendor_id
LEFT JOIN jx_bad_comments d ON d.order_id = a.vendor_order_id AND d.order_flag = a.vendor_id
WHERE a.vendor_user_id = (SELECT vendor_user_id FROM goods_order WHERE vendor_order_id = ?)
GROUP BY a.vendor_user_id
)t3 ON t3.vendor_user_id = t1.vendor_user_id
`
sqlParams = append(sqlParams, vendorOrderID)
}
sql += `
WHERE t1.vendor_order_id = ? AND vendor_id = ?
`
sqlParams = append(sqlParams, vendorOrderID, vendorID)
err = dao.GetRows(db, &orders, sql, sqlParams)
if err == nil {
order = orders[0]
if isRefresh && vendorID == model.VendorIDJD {
tmpOrder, err2 := partner.GetPurchaseOrderHandlerFromVendorID(vendorID).GetOrder(order.VendorOrgCode, vendorOrderID)
tmpOrder, err2 := partner.GetPurchaseOrderHandlerFromVendorID(vendorID).GetOrder(order.VendorOrgCode, vendorOrderID, order.VendorStoreID)
if err = err2; err == nil {
order.CurrentConsigneeMobile = tmpOrder.ConsigneeMobile
} else {
@@ -284,17 +311,112 @@ func (c *OrderManager) ExportMTWaybills(ctx *jxcontext.Context, fromDateStr, toD
}
func (c *OrderManager) GetOrders(ctx *jxcontext.Context, isIncludeFake bool, fromDateStr, toDateStr string, isDateFinish bool, skuIDs []int, isJxFirst bool, params map[string]interface{}, offset, pageSize int) (pagedInfo *model.PagedInfo, err error) {
globals.SugarLogger.Debugf("GetOrders from:%s to:%s", fromDateStr, toDateStr)
orders, totalCount, err := dao.GetOrders(dao.GetDB(), nil, false, isIncludeFake, fromDateStr, toDateStr, isDateFinish, skuIDs, isJxFirst, "", params, offset, pageSize)
var (
db = dao.GetDB()
//isJxIncomeArea = params["jxIncomeBegin"] != nil || params["jxIncomeEnd"] != nil
//begin, end int64
)
//权限
if permission.IsRoled(ctx) {
if storeIDsMap, err := permission.GetUserStoresResultMap(ctx.GetUserID()); err == nil {
var storeIDs2 []int
if params["storeIDs"] != nil {
var storeIDs []int
if err = utils.UnmarshalUseNumber([]byte(params["storeIDs"].(string)), &storeIDs); err == nil {
for _, v := range storeIDs {
if storeIDsMap[v] != 0 {
storeIDs2 = append(storeIDs2, v)
}
}
}
if len(storeIDs2) == 0 {
storeIDs2 = append(storeIDs2, -1)
}
} else {
for k, _ := range storeIDsMap {
storeIDs2 = append(storeIDs2, k)
}
}
if data, err := json.Marshal(storeIDs2); err == nil {
params["storeIDs"] = string(data)
}
}
}
//if isJxIncomeArea {
// begin = utils.MustInterface2Int64(params["jxIncomeBegin"])
// end = utils.MustInterface2Int64(params["jxIncomeEnd"])
// pageSize = math.MaxInt32
//}
orders, totalCount, err := dao.GetOrders(db, nil, false, isIncludeFake, fromDateStr, toDateStr, isDateFinish, skuIDs, isJxFirst, "", params, offset, pageSize)
if err == nil {
pagedInfo = &model.PagedInfo{
TotalCount: totalCount,
Data: orders,
//Data: orders,
}
if len(orders) > 0 {
if permission.IsRoled(ctx) {
task := tasksch.NewParallelTask("RefreshOrderFinancial", tasksch.NewParallelConfig().SetIsContinueWhenError(true), ctx,
func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) {
order := batchItemList[0].(*model.GoodsOrderExt)
var afsOrder *AfsOrderExt
sql := `
SELECT t1.afs_total_shop_money, t2.shop_price
FROM afs_order t1
LEFT JOIN (
SELECT a.afs_order_id, SUM(a.shop_price*a.count) shop_price
FROM order_sku_financial a
LEFT JOIN (
SELECT MAX(created_at), afs_order_id
FROM afs_order
WHERE status = ?
AND vendor_order_id = ?
GROUP BY 2
) b ON a.afs_order_id = b.afs_order_id
WHERE a.afs_order_id = b.afs_order_id AND a.is_afs_order = ?
GROUP BY 1) t2 ON t1.afs_order_id = t2.afs_order_id
WHERE t1.afs_order_id = t2.afs_order_id
`
sqlParams := []interface{}{model.AfsOrderStatusFinished, order.VendorOrderID,
model.YES}
if err = dao.GetRow(db, &afsOrder, sql, sqlParams); err == nil && afsOrder != nil {
if afsOrder.AfsTotalShopMoney != 0 && afsOrder.AfsTotalShopMoney != order.TotalShopMoney {
//报价,要减去商品的京西价
if order.EarningType == model.EarningTypeQuote {
order.JxIncome = afsOrder.AfsTotalShopMoney - order.EarningPrice - order.DesiredFee + (afsOrder.ShopPrice * int64(order.OrderPayPercentage) / int64(100))
} else {
order.JxIncome = afsOrder.AfsTotalShopMoney * int64(order.OrderPayPercentage/2) / 100
}
}
}
//if isJxIncomeArea {
// var order2 *model.GoodsOrderExt
// if order.JxIncome >= begin && order.JxIncome <= end {
// order2 = order
// return []*model.GoodsOrderExt{order2}, err
// }
//}
return retVal, err
}, orders)
tasksch.HandleTask(task, nil, true).Run()
result, _ := task.GetResult(0)
if len(result) > 0 {
pagedInfo.Data = result
} else {
pagedInfo.Data = orders
}
} else {
pagedInfo.Data = orders
}
}
}
return pagedInfo, err
}
type AfsOrderExt struct {
model.AfsOrder
ShopPrice int64 `json:"shopPrice"`
}
func (c *OrderManager) ExportOrders(ctx *jxcontext.Context, fromDateStr, toDateStr string, mapParams map[string]interface{}) (hint string, err error) {
globals.SugarLogger.Debugf("ExportOrders from:%s to:%s", fromDateStr, toDateStr)
var (
@@ -306,6 +428,32 @@ func (c *OrderManager) ExportOrders(ctx *jxcontext.Context, fromDateStr, toDateS
func(task *tasksch.SeqTask, step int, params ...interface{}) (result interface{}, err error) {
switch step {
case 0:
//权限
if permission.IsRoled(ctx) {
if storeIDsMap, err := permission.GetUserStoresResultMap(ctx.GetUserID()); err == nil {
var storeIDs2 []int
if mapParams["storeIDs"] != nil {
var storeIDs []int
if err = utils.UnmarshalUseNumber([]byte(mapParams["storeIDs"].(string)), &storeIDs); err == nil {
for _, v := range storeIDs {
if storeIDsMap[v] != 0 {
storeIDs2 = append(storeIDs2, v)
}
}
}
if len(storeIDs2) == 0 {
storeIDs2 = append(storeIDs2, -1)
}
} else {
for k, _ := range storeIDsMap {
storeIDs2 = append(storeIDs2, k)
}
}
if data, err := json.Marshal(storeIDs2); err == nil {
mapParams["storeIDs"] = string(data)
}
}
}
orders, _, err = dao.GetOrders(dao.GetDB(), nil, true, true, fromDateStr, toDateStr, true, nil, false, "", mapParams, 0, model.UnlimitedPageSize)
globals.SugarLogger.Debugf("orders:%d, er:%v", len(orders), err)
case 1:
@@ -336,12 +484,18 @@ func (c *OrderManager) ExportOrders(ctx *jxcontext.Context, fromDateStr, toDateS
}, ",")
} else {
if v.EarningType == model.EarningTypeQuote {
earningPrice := 0
if v.SkuEarningPrice != 0 {
earningPrice = v.SkuEarningPrice
} else {
earningPrice = v.SkuShopPrice
}
skuStr = strings.Join([]string{
utils.Int2Str(v.SkuID),
utils.Int2Str(v.SkuCount2),
utils.Int2Str(v.SkuEarningPrice),
utils.Int2Str(v.SkuSalePrice),
utils.Int2Str(v.SkuShopPrice),
utils.Int2Str(v.SkuSalePrice),
utils.Int2Str(earningPrice),
}, ",")
} else {
skuStr = strings.Join([]string{
@@ -403,6 +557,7 @@ func (c *OrderManager) ExportOrders(ctx *jxcontext.Context, fromDateStr, toDateS
"status2",
"skuInfo",
"waybillTipMoney",
"orderPayPercentage",
// "skuInfo2",
},
}
@@ -502,20 +657,20 @@ func (c *OrderManager) GetWaybills(ctx *jxcontext.Context, fromDateStr, toDateSt
sqlParams = append(sqlParams, pageSize, offset)
var waybills []*tWaybillExt
db := dao.GetDB()
dao.Begin(db)
txDB, _ := dao.Begin(db)
defer func() {
if r := recover(); r != nil {
dao.Rollback(db)
dao.Rollback(db, txDB)
panic(r)
}
}()
if err = dao.GetRows(db, &waybills, sql, sqlParams...); err == nil {
if err = dao.GetRowsTx(txDB, &waybills, sql, sqlParams...); err == nil {
pagedInfo = &model.PagedInfo{
TotalCount: dao.GetLastTotalRowCount(db),
TotalCount: dao.GetLastTotalRowCount2(db, txDB),
Data: waybills,
}
}
dao.Commit(db)
dao.Commit(db, txDB)
return pagedInfo, err
}
@@ -635,20 +790,20 @@ func (c *OrderManager) GetOrdersFinancial(ctx *jxcontext.Context, fromDateStr, t
var orders []*model.OrderFinancialExt
db := dao.GetDB()
dao.Begin(db)
txDB, _ := dao.Begin(db)
defer func() {
if r := recover(); r != nil {
dao.Rollback(db)
dao.Rollback(db, txDB)
panic(r)
}
}()
if err = dao.GetRows(db, &orders, sql, sqlParams...); err == nil {
if err = dao.GetRowsTx(txDB, &orders, sql, sqlParams...); err == nil {
pagedInfo = &model.PagedInfo{
TotalCount: dao.GetLastTotalRowCount(db),
TotalCount: dao.GetLastTotalRowCount2(db, txDB),
Data: orders,
}
}
dao.Commit(db)
dao.Commit(db, txDB)
return pagedInfo, err
}
@@ -662,22 +817,31 @@ func (c *OrderManager) GetStoresOrderSaleInfo(ctx *jxcontext.Context, storeIDLis
func (c *OrderManager) GetStoresOrderSaleInfoNew(ctx *jxcontext.Context, storeIDList []int, fromTime time.Time, toTime time.Time, statusList []int) (saleInfoList []*dao.StoresOrderSaleInfo, err error) {
db := dao.GetDB()
// var isFinish = true
// if toTime.Sub(fromTime).Hours() > 24 {
// isFinish = false
// }
var isLongTime = false
if toTime.Sub(fromTime).Hours() > 24 {
isLongTime = true
}
orderIDMap := make(map[string]struct{})
var vendorOrderIDs []string
orderSkuList, err := dao.GetStoreOrderSkuList(db, storeIDList, fromTime, toTime, statusList, true)
if err != nil {
return nil, err
}
afsSkuList, err := dao.GetStoreAfsOrderSkuList(db, storeIDList, fromTime, toTime, []int{model.AfsOrderStatusFinished}, true)
if err != nil {
return nil, err
for _, v := range orderSkuList {
orderIDMap[v.VendorOrderID] = struct{}{}
}
orderSkuList4Afs, err := dao.GetStoreOrderSkuList4Afs(db, storeIDList, fromTime, toTime, true)
if err != nil {
return nil, err
for k, _ := range orderIDMap {
vendorOrderIDs = append(vendorOrderIDs, k)
}
afsSkuList, err := dao.GetStoreAfsOrderSkuList2(db, vendorOrderIDs)
//afsSkuList, err := dao.GetStoreAfsOrderSkuList(db, storeIDList, fromTime, toTime, []int{model.AfsOrderStatusFinished}, true)
//if err != nil {
// return nil, err
//}
orderSkuList4Afs, err := dao.GetStoreOrderSkuList4Afs2(db, vendorOrderIDs)
//if err != nil {
// return nil, err
//}
orderSkuHandler := func(skuList []*dao.OrderSkuWithActualPayPrice) (orderMap map[string]*model.GoodsOrder, orderSkuMap map[string]*dao.OrderSkuWithActualPayPrice, saleInfoMap map[int64]*dao.StoresOrderSaleInfo) {
orderMap = make(map[string]*model.GoodsOrder)
orderSkuMap = make(map[string]*dao.OrderSkuWithActualPayPrice)
@@ -687,6 +851,7 @@ func (c *OrderManager) GetStoresOrderSaleInfoNew(ctx *jxcontext.Context, storeID
flagVendorOrderID = skuList[0].VendorOrderID
}
for k, v := range skuList {
storeDetail, _ := dao.GetStoreDetail(db, v.StoreID, v.VendorID, "")
if v.EarningPrice == 0 {
v.EarningPrice = jxutils.CaculateSkuEarningPrice(v.ShopPrice, v.SalePrice, v.PayPercentage)
}
@@ -705,8 +870,15 @@ func (c *OrderManager) GetStoresOrderSaleInfoNew(ctx *jxcontext.Context, storeID
}
saleInfoMap[index] = saleInfo
}
if v.EarningType == model.EarningTypeQuote {
saleInfo.RealEarningPrice += v.ShopPrice * int64(v.Count)
//成都菜市
if beego.BConfig.RunMode == "prod" || beego.BConfig.RunMode == "beta" {
if v.EarningType == model.EarningTypeQuote {
saleInfo.RealEarningPrice += v.EarningPrice * int64(v.Count)
}
} else {
if v.OrderPayPercentage == 100 {
saleInfo.RealEarningPrice += v.ShopPrice * int64(v.Count)
}
}
saleInfo.ShopPrice += v.ShopPrice * int64(v.Count)
saleInfo.VendorPrice += v.VendorPrice * int64(v.Count)
@@ -715,15 +887,36 @@ func (c *OrderManager) GetStoresOrderSaleInfoNew(ctx *jxcontext.Context, storeID
if v.VendorOrderID == flagVendorOrderID {
if k == 0 {
saleInfo.EarningPrice = v.NewEarningPrice
if v.EarningType == model.EarningTypePoints {
saleInfo.RealEarningPrice += v.NewEarningPrice
if beego.BConfig.RunMode == "prod" || beego.BConfig.RunMode == "beta" {
if v.EarningType == model.EarningTypePoints {
if storeDetail.VendorPayPercentage != 0 && !isLongTime {
saleInfo.RealEarningPrice += 0
} else {
saleInfo.RealEarningPrice += v.NewEarningPrice
}
}
} else {
if v.OrderPayPercentage < 100 {
saleInfo.RealEarningPrice += v.NewEarningPrice
}
}
}
} else {
flagVendorOrderID = v.VendorOrderID
saleInfo.EarningPrice += v.NewEarningPrice
if v.EarningType == model.EarningTypePoints {
saleInfo.RealEarningPrice += v.NewEarningPrice
if beego.BConfig.RunMode == "prod" || beego.BConfig.RunMode == "beta" {
if v.EarningType == model.EarningTypePoints {
if storeDetail.VendorPayPercentage != 0 && !isLongTime {
saleInfo.RealEarningPrice += 0
} else {
// && v.VendorID != model.VendorIDJD && v.CityCode != 510100
saleInfo.RealEarningPrice += v.NewEarningPrice
}
}
} else {
if v.OrderPayPercentage < 100 {
saleInfo.RealEarningPrice += v.NewEarningPrice
}
}
}
@@ -809,15 +1002,42 @@ func (c *OrderManager) GetStoresOrderSaleInfoNew(ctx *jxcontext.Context, storeID
return saleInfoList, err
}
func (c *OrderManager) GetAfsOrders(ctx *jxcontext.Context, keyword, afsOrderID, vendorOrderID string, vendorIDList, appealTypeList, storeIDList, statusList, skuIDs []int, fromTime, toTime time.Time, offset, pageSize int) (pagedInfo *model.PagedInfo, err error) {
globals.SugarLogger.Debugf("GetAfsOrders")
type GetAfsOrdersResult struct {
model.AfsOrder
StoreName string `json:"storeName"`
}
func (c *OrderManager) GetAfsOrders(ctx *jxcontext.Context, keyword, afsOrderID, vendorOrderID string, vendorIDList, appealTypeList, storeIDList, statusList, skuIDs []int, fromTime, toTime time.Time, isDetail bool, offset, pageSize int) (pagedInfo *model.PagedInfo, err error) {
globals.SugarLogger.Debugf("GetAfsOrders")
//权限
if permission.IsRoled(ctx) {
if storeIDsMap, err := permission.GetUserStoresResultMap(ctx.GetUserID()); err == nil {
var storeIDs2 []int
if len(storeIDList) > 0 {
for _, v := range storeIDList {
if storeIDsMap[v] != 0 {
storeIDs2 = append(storeIDs2, v)
}
}
if len(storeIDs2) == 0 {
storeIDs2 = append(storeIDs2, -1)
}
} else {
for k, _ := range storeIDsMap {
storeIDs2 = append(storeIDs2, k)
}
}
storeIDList = nil
storeIDList = storeIDs2
}
}
pageSize = jxutils.FormalizePageSize(pageSize)
offset = jxutils.FormalizePageOffset(offset)
sql := `
SELECT SQL_CALC_FOUND_ROWS
t1.*
t1.*, t2.name store_name
FROM afs_order t1
LEFT JOIN store t2 ON t2.id = IF(t1.jx_store_id != 0, t1.jx_store_id, t1.store_id)
`
var (
sqlWhere string
@@ -900,23 +1120,24 @@ func (c *OrderManager) GetAfsOrders(ctx *jxcontext.Context, keyword, afsOrderID,
`
sqlParams = append(sqlParams, pageSize, offset)
var orders []*model.AfsOrder
var orders []*GetAfsOrdersResult
db := dao.GetDB()
dao.Begin(db)
defer func() {
if r := recover(); r != nil || err != nil {
dao.Rollback(db)
if r != nil {
panic(r)
txDB, _ := dao.Begin(db)
defer dao.Commit(db, txDB)
if err = dao.GetRowsTx(txDB, &orders, sql, sqlParams...); err == nil {
pagedInfo = &model.PagedInfo{
TotalCount: dao.GetLastTotalRowCount2(db, txDB),
//Data: orders,
}
if isDetail {
for _, v := range orders {
skus, _ := dao.GetAfsOrderSkuInfo(db, v.VendorOrderID, v.AfsOrderID, v.VendorID, false)
for _, vv := range skus {
v.Skus = append(v.Skus, &vv.OrderSkuFinancial)
}
}
}
}()
if err = dao.GetRows(db, &orders, sql, sqlParams...); err == nil {
pagedInfo = &model.PagedInfo{
TotalCount: dao.GetLastTotalRowCount(db),
Data: orders,
}
dao.Commit(db)
pagedInfo.Data = orders
}
return pagedInfo, err
}
@@ -936,7 +1157,7 @@ func (c *OrderManager) getAfsOrderSkuInfo4ExportOrders(ctx *jxcontext.Context, f
if err = err2; err != nil {
return nil, err
}
toDate = toDate.Add(7 * 24 * time.Hour) // todo 售后单最多只可能延后7天吧
toDate = toDate.Add(30 * 24 * time.Hour) // todo 售后单最多只可能延后7天吧
sql := `
SELECT t2.*
FROM afs_order t1
@@ -1039,6 +1260,7 @@ func (c *OrderManager) AmendMissingOrders(ctx *jxcontext.Context, vendorIDs []in
VendorOrderID string
VendorID int
VendorOrgCode string
VendorStoreID string
}
if len(dateVendorList) > 0 {
var missingOrderList []*tOrderVendorPair
@@ -1047,7 +1269,7 @@ func (c *OrderManager) AmendMissingOrders(ctx *jxcontext.Context, vendorIDs []in
vendorStoreIDMap := make(map[int]string)
if storeID > 0 {
for _, vendorID := range vendorIDs {
storeDetail, err2 := dao.GetStoreDetail(db, storeID, vendorID)
storeDetail, err2 := dao.GetStoreDetail(db, storeID, vendorID, "")
if err = err2; err != nil {
return "", err
}
@@ -1066,10 +1288,15 @@ func (c *OrderManager) AmendMissingOrders(ctx *jxcontext.Context, vendorIDs []in
if err = err2; err == nil && len(orderIDs) > 0 {
var orderList []*tOrderVendorPair
for _, v := range orderIDs {
var vendorStoreID string
if orders, _ := dao.QueryOrders(db, v, 0, nil, 0, utils.ZeroTimeValue, utils.ZeroTimeValue); len(orders) > 0 {
vendorStoreID = orders[0].VendorStoreID
}
orderList = append(orderList, &tOrderVendorPair{
VendorOrderID: v,
VendorID: vendorDate.VendorID,
VendorOrgCode: vendorDate.VendorOrgCode,
VendorStoreID: vendorStoreID,
})
}
retVal = orderList
@@ -1098,15 +1325,15 @@ func (c *OrderManager) AmendMissingOrders(ctx *jxcontext.Context, vendorIDs []in
missingOrderList = append(missingOrderList, pair)
} else {
if !model.IsOrderFinalStatus(goodsOrder.Status) {
if goodsOrder.BusinessType == model.BusinessTypeImmediate {
if time.Now().Sub(goodsOrder.CreatedAt).Hours() >= orderSubTimeImmediatelyArrive {
updateOrderStatusList = append(updateOrderStatusList, goodsOrder)
}
} else {
if time.Now().Sub(goodsOrder.ExpectedDeliveredTime).Hours() >= orderSubTimeDelayArrive {
updateOrderStatusList = append(updateOrderStatusList, goodsOrder)
}
}
//if goodsOrder.BusinessType == model.BusinessTypeImmediate {
// if time.Now().Sub(goodsOrder.OrderCreatedAt).Hours() >= orderSubTimeImmediatelyArrive {
// updateOrderStatusList = append(updateOrderStatusList, goodsOrder)
// }
//} else {
// if time.Now().Sub(goodsOrder.ExpectedDeliveredTime).Hours() >= orderSubTimeDelayArrive {
updateOrderStatusList = append(updateOrderStatusList, goodsOrder)
//}
//}
}
}
}
@@ -1115,8 +1342,12 @@ func (c *OrderManager) AmendMissingOrders(ctx *jxcontext.Context, vendorIDs []in
func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) {
pair := batchItemList[0].(*tOrderVendorPair)
if handler := partner.GetPurchaseOrderHandlerFromVendorID(pair.VendorID); handler != nil {
order, err2 := handler.GetOrder(pair.VendorOrgCode, pair.VendorOrderID)
order, err2 := handler.GetOrder(pair.VendorOrgCode, pair.VendorOrderID, pair.VendorStoreID)
if err = err2; err == nil {
if order.VendorStoreID == "2391979" {
return retVal, err
}
isDuplicated, err2 := c.SaveOrder(order, false, dao.GetDB())
if err2 == nil && !isDuplicated {
retVal = []int{1}
@@ -1124,6 +1355,10 @@ func (c *OrderManager) AmendMissingOrders(ctx *jxcontext.Context, vendorIDs []in
err = handler.AcceptOrRefuseOrder(order, true, ctx.GetUserName())
}
}
} else if pair.VendorID == model.VendorIDMTWM {
if strings.Contains(err.Error(), "token不存在或已经过期") {
err = nil
}
}
}
return retVal, err
@@ -1135,11 +1370,14 @@ func (c *OrderManager) AmendMissingOrders(ctx *jxcontext.Context, vendorIDs []in
func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) {
goodsOrder := batchItemList[0].(*model.GoodsOrder)
if handler := partner.GetPurchaseOrderHandlerFromVendorID(goodsOrder.VendorID); handler != nil {
order, err2 := handler.GetOrder(goodsOrder.VendorOrgCode, goodsOrder.VendorOrderID)
order, err2 := handler.GetOrder(goodsOrder.VendorOrgCode, goodsOrder.VendorOrderID, goodsOrder.VendorStoreID)
if err = err2; err == nil {
if model.IsOrderFinalStatus(order.Status) {
goodsOrder.Status = order.Status
goodsOrder.OrderFinishedAt = order.OrderFinishedAt
if goodsOrder.OrderFinishedAt == utils.DefaultTimeValue || goodsOrder.OrderFinishedAt == utils.ZeroTimeValue {
goodsOrder.OrderFinishedAt = goodsOrder.OrderCreatedAt.Add(time.Hour)
}
_, err = dao.UpdateEntity(db, goodsOrder, "Status", "OrderFinishedAt")
}
}
@@ -1189,7 +1427,7 @@ func (c *OrderManager) RefreshOrderFinancial(ctx *jxcontext.Context, fromTime, t
order := batchItemList[0].(*model.GoodsOrder)
handler := partner.GetPurchaseOrderHandlerFromVendorID(order.VendorID)
if handler != nil {
remoteOrder, err2 := handler.GetOrder(order.VendorOrgCode, order.VendorOrderID)
remoteOrder, err2 := handler.GetOrder(order.VendorOrgCode, order.VendorOrderID, order.VendorStoreID)
if err = err2; err == nil {
order.TotalShopMoney = remoteOrder.TotalShopMoney
order.PmSubsidyMoney = remoteOrder.PmSubsidyMoney
@@ -1246,14 +1484,14 @@ func GetMatterStoreOrderCount(ctx *jxcontext.Context, storeID int) (result *Orde
AND a.from_store_id = ?
AND a.status >= ? AND a.status <> ?
AND b.status = ?
ORDER BY b.pay_finished_at DESC
ORDER BY b.pay_finished_at DESC
LIMIT 1
`
sqlParams := []interface{}{storeID, model.OrderStatusDelivering, model.OrderStatusCanceled, model.PayStatusYes}
err = dao.GetRows(db, &orderPays, sql, sqlParams)
if len(orderPays) != 0 {
orderPay := orderPays[0]
stores, _ := dao.GetStoreList(db, []int{storeID}, nil, nil, nil, "")
stores, _ := dao.GetStoreList(db, []int{storeID}, nil, nil, nil, nil, "")
if len(stores) > 0 {
store := stores[0]
if store.IsBoughtMatter == model.YES {
@@ -1293,25 +1531,37 @@ func GetMatterStoreOrderCount(ctx *jxcontext.Context, storeID int) (result *Orde
func RefreshJdShopOrdersEarningPrice(ctx *jxcontext.Context, orderStartTime, orderEndTime string) (err error) {
var (
db = dao.GetDB()
db = dao.GetDB()
appOrgCode string
)
results, err := api.JdAPI.GetJdShopOrders(orderStartTime, orderEndTime, globals.JdOrgCode, globals.JdLoginName)
if beego.BConfig.RunMode == "jxgy" {
appOrgCode = "339032"
} else {
appOrgCode = "320406"
}
jdapi := partner.CurAPIManager.GetAPI(model.VendorIDJD, appOrgCode).(*jdapi.API)
results, err := jdapi.GetJdShopOrders(utils.Str2Time(orderStartTime).Format("20060102"), utils.Str2Time(orderEndTime).Format("20060102"), globals.JdOrgCode, globals.JdLoginName)
if err != nil {
return err
}
for _, v := range results.BillList.Result {
if v.DueAmount != 0 {
order, _ := partner.CurOrderManager.LoadOrder(utils.Int64ToStr(v.OrderID), model.VendorIDJD)
stores, _ := dao.GetStoreList(db, []int{jxutils.GetSaleStoreIDFromOrder(order)}, nil, nil, nil, "")
if len(stores) > 0 {
store := stores[0]
if order.NewEarningPrice == 0 {
jxutils.RefreshOrderEarningPrice2(order, store.PayPercentage)
if results != nil {
for _, v := range results.BillList.Result {
if v.DueAmount != 0 {
order, err := partner.CurOrderManager.LoadOrder(utils.Int64ToStr(v.OrderID), model.VendorIDJD)
if order == nil || err != nil {
continue
}
if order.TotalShopMoney == 0 {
order.TotalShopMoney = utils.Float64TwoInt64(v.DueAmount * 100)
store, _ := dao.GetStoreDetail(db, jxutils.GetSaleStoreIDFromOrder(order), order.VendorID, order.VendorOrgCode)
// stores, _ := dao.GetStoreList(db, []int{jxutils.GetSaleStoreIDFromOrder(order)}, nil, nil, nil, nil, "")
if store != nil {
if order.TotalShopMoney == 0 {
order.TotalShopMoney = utils.Float64TwoInt64(v.DueAmount * 100)
}
if order.NewEarningPrice == 0 {
jxutils.RefreshOrderEarningPrice2(order, store.PayPercentage)
}
dao.UpdateEntity(db, order, "TotalShopMoney", "NewEarningPrice")
}
dao.UpdateEntity(db, order, "TotalShopMoney", "NewEarningPrice")
}
}
}

View File

@@ -15,7 +15,7 @@ import (
"git.rosy.net.cn/jx-callback/business/model"
"git.rosy.net.cn/jx-callback/business/model/dao"
"git.rosy.net.cn/jx-callback/globals"
"github.com/astaxie/beego/orm"
"github.com/astaxie/beego/client/orm"
)
var (
@@ -107,10 +107,10 @@ func (w *OrderManager) OnWaybillStatusChanged(bill *model.Waybill) (err error) {
}
bill.CourierMobile = jxutils.FormalizeMobile(bill.CourierMobile)
db := dao.GetDB()
dao.Begin(db)
txDB, _ := dao.Begin(db)
defer func() {
if r := recover(); r != nil {
dao.Rollback(db)
dao.Rollback(db, txDB)
panic(r)
}
}()
@@ -133,21 +133,21 @@ func (w *OrderManager) OnWaybillStatusChanged(bill *model.Waybill) (err error) {
billCopy := *bill
billCopy.Status = model.WaybillStatusNew
if isDuplicated, err = w.onWaybillNew(&billCopy, db); err != nil {
dao.Rollback(db)
dao.Rollback(db, txDB)
return err
}
dao.Commit(db)
dao.Commit(db, txDB)
// 进运单调度器OnWaybillStatusChanged之前要确保事务是提交了的否则会导致死锁
scheduler.CurrentScheduler.OnWaybillStatusChanged(&billCopy, false)
dao.Begin(db)
} else {
dao.Rollback(db)
dao.Rollback(db, txDB)
return err2
}
}
// 运单消息错序,之前已经结束了,直接返回
if existingBill.Status >= model.WaybillStatusEndBegin {
dao.Commit(db)
dao.Commit(db, txDB)
return nil
}
}
@@ -171,17 +171,17 @@ func (w *OrderManager) OnWaybillStatusChanged(bill *model.Waybill) (err error) {
}
duplicatedCount, err = w.addWaybillStatus(bill, db, addParams)
if err != nil {
dao.Rollback(db)
dao.Rollback(db, txDB)
return err
}
}
if err == nil {
dao.Commit(db)
dao.Commit(db, txDB)
if duplicatedCount == 0 {
scheduler.CurrentScheduler.OnWaybillStatusChanged(bill, false)
}
} else {
dao.Rollback(db)
dao.Rollback(db, txDB)
}
if bill.VendorOrderID == bill.VendorWaybillID {
if status, ok := waybillOrderStatusMap[bill.Status]; ok {
@@ -263,3 +263,9 @@ func ComplaintRider(ctx *jxcontext.Context, vendorOrderID string, vendorID, wayb
}
return err
}
func ComplaintRiderPlatform(ctx *jxcontext.Context, vendorOrderID string, vendorID, waybillVendorID, complaintID int) (err error) {
return fmt.Errorf("只支持三方配送投诉!")
//handler := partner.GetPurchaseOrderHandlerFromVendorID(vendorID)
//return handler.ComplaintRider(vendorOrderID, complaintID, "")
}

View File

@@ -34,7 +34,7 @@ func (c *BaseScheduler) AcceptOrRefuseOrder(order *model.GoodsOrder, isAcceptIt
}
func (c *BaseScheduler) PickupGoods(order *model.GoodsOrder, isSelfDelivery bool, userName string) (err error) {
globals.SugarLogger.Infof("PickupGoods orderID:%s", order.VendorOrderID)
globals.SugarLogger.Infof("PickupGoods orderID:%s,order :%v", order.VendorOrderID, utils.Format4Output(order, false))
if /*order.LockStatus == model.OrderStatusUnknown && */ order.Status == model.OrderStatusAccepted {
if c.IsReallyCallPlatformAPI {
handler := partner.GetPurchaseOrderHandlerFromVendorID(order.VendorID)

View File

@@ -18,7 +18,6 @@ import (
"git.rosy.net.cn/jx-callback/business/model"
"git.rosy.net.cn/jx-callback/business/model/dao"
"git.rosy.net.cn/jx-callback/business/partner"
"git.rosy.net.cn/jx-callback/business/partner/purchase/jd"
"git.rosy.net.cn/jx-callback/globals"
)
@@ -29,7 +28,7 @@ const (
func (c *BaseScheduler) CreateWaybillOnProviders(ctx *jxcontext.Context, order *model.GoodsOrder, courierVendorIDs, excludeCourierVendorIDs []int, maxDeliveryFee int64, createOnlyOne bool) (bills []*model.Waybill, err error) {
userName := ctx.GetUserName()
globals.SugarLogger.Infof("CreateWaybillOnProviders orderID:%s userName:%s, courierVendorIDs:%v, excludeCourierVendorIDs:%v", order.VendorOrderID, userName, courierVendorIDs, excludeCourierVendorIDs)
storeCourierList, err := dao.GetStoreCourierList(dao.GetDB(), []int{jxutils.GetSaleStoreIDFromOrder(order)}, nil, model.StoreStatusOpened, model.StoreAuditStatusOnline)
storeCourierList, err := dao.GetStoreCourierList2(dao.GetDB(), []int{jxutils.GetSaleStoreIDFromOrder(order)}, nil, model.StoreStatusOpened, []int{model.StoreAuditStatusOnline, model.StoreAuditStatusUpdated})
if err != nil {
return nil, err
}
@@ -102,7 +101,8 @@ func (c *BaseScheduler) PickupGoodsAndUpdateStatus(ctx *jxcontext.Context, vendo
globals.SugarLogger.Infof("PickupGoodsAndUpdateStatus orderID:%s userName:%s", vendorOrderID, userName)
order, err := partner.CurOrderManager.LoadOrder(vendorOrderID, vendorID)
if err == nil {
err = c.PickupGoods(order, model.IsOrderDeliveryByStore(order), userName)
flag := model.IsOrderDeliveryByStore(order) || model.IsOrderDeliveryBySelf(order)
err = c.PickupGoods(order, flag, userName)
if err == nil {
order.Status = model.OrderStatusFinishedPickup
if err = partner.CurOrderManager.UpdateOrderStatusAndDeliveryFlag(order); err == nil {
@@ -142,7 +142,7 @@ func (c *BaseScheduler) CancelOrder(ctx *jxcontext.Context, order *model.GoodsOr
if globals.IsAddEvent {
err = cms.AddEventDetail(dao.GetDB(), ctx, model.OperateUpdate, order.StoreID, model.ThingTypeOrder, order.StoreID, order.VendorOrderID, order.StoreName)
}
err = partner.GetPurchaseOrderHandlerFromVendorID(order.VendorID).CancelOrder(ctx, order, reason)
err = partner.GetPurchaseOrderHandlerFromVendorID(order.VendorID).CancelOrder(ctx, order, reason+","+ctx.GetUserName())
}
return err
}
@@ -217,17 +217,44 @@ func (c *BaseScheduler) AgreeOrRefuseRefund(ctx *jxcontext.Context, afsOrderID s
partner.CurOrderManager.UpdateAfsOrderFields(afsOrder, []string{"RefuseReason"})
} else {
if order, _ := partner.CurOrderManager.LoadOrder(afsOrder.VendorOrderID, afsOrder.VendorID); order != nil {
var (
db = dao.GetDB()
)
waybills, _ := dao.GetWaybills(db, order.VendorOrderID)
//美团的订单如果是同意全部退款,要取消所有三方运单并停止调度
if order.VendorID == model.VendorIDMTWM {
var (
afsCount, orderCount int
)
skus, _ := dao.GetAfsOrderSkuInfo(db, order.VendorOrderID, afsOrderID, order.VendorID, false)
for _, v := range skus {
afsCount += v.Count
}
for _, v := range order.Skus {
orderCount += v.Count
}
//如果售后退款的商品数等于订单商品数,我就当是全部退款了
if afsCount == orderCount {
for _, v := range waybills {
if err = c.CancelWaybill(v, partner.CancelWaybillReasonOther, partner.CancelWaybillReasonStrActive); err == nil {
v.DeliveryFlag |= model.WaybillDeliveryFlagMaskActiveCancel
_, err = dao.UpdateEntity(db, v, "Status", "DeliveryFlag")
} else {
globals.SugarLogger.Debugf("AgreeOrRefuseRefund, cancelwaybill error: %v", err)
}
}
order.DeliveryFlag |= model.OrderDeliveryFlagMaskScheduleDisabled
partner.CurOrderManager.UpdateOrderFields(order, []string{"DeliveryFlag"})
}
}
if order.EarningType == model.EarningTypePoints {
var (
skuMap = make(map[int]*model.OrderSku)
diff int64
db = dao.GetDB()
)
for _, sku := range order.Skus {
skuMap[sku.SkuID] = sku
}
storeDetail, _ := dao.GetStoreDetail(db, jxutils.GetSaleStoreIDFromOrder(order), order.VendorID)
waybills, _ := dao.GetWaybills(db, order.VendorOrderID)
//京东商城和京西要重新算totalshopmoney等
if order.VendorID == model.VendorIDJDShop || order.VendorID == model.VendorIDJX {
skus, _ := dao.GetAfsOrderSkuInfo(db, order.VendorOrderID, afsOrderID, order.VendorID, false)
@@ -238,9 +265,9 @@ func (c *BaseScheduler) AgreeOrRefuseRefund(ctx *jxcontext.Context, afsOrderID s
}
order.TotalShopMoney = utils.Float64TwoInt64(float64(float64(order.TotalShopMoney)/jdshopapi.JdsPayPercentage-float64(diff)) * jdshopapi.JdsPayPercentage)
if len(waybills) > 0 {
jxutils.RefreshOrderEarningPrice3(order, storeDetail.PayPercentage, waybills[0])
jxutils.RefreshOrderEarningPrice3(order, order.OrderPayPercentage, waybills[0])
} else {
jxutils.RefreshOrderEarningPrice2(order, storeDetail.PayPercentage)
jxutils.RefreshOrderEarningPrice2(order, order.OrderPayPercentage)
}
dao.UpdateEntity(db, order, "TotalShopMoney", "NewEarningPrice")
}
@@ -288,12 +315,27 @@ func (c *BaseScheduler) ConfirmSelfTake(ctx *jxcontext.Context, vendorOrderID st
return err
}
func (c *BaseScheduler) SetOrderWaybillTip(ctx *jxcontext.Context, vendorOrderID string, vendorID int, tipFee int64) (err error) {
order, err2 := partner.CurOrderManager.LoadOrder(vendorOrderID, vendorID)
if err = err2; err == nil {
err = c.SetOrderWaybillTipByOrder(ctx, order, tipFee)
func (c *BaseScheduler) SetOrderWaybillTip(ctx *jxcontext.Context, vendorOrderID string, vendorID int, tipFee int64) (errCode string, err error) {
if order, err := partner.CurOrderManager.LoadOrder(vendorOrderID, vendorID); err == nil {
if errCode, err = c.CheckStoreBalanceWithTip(ctx, order, tipFee); err == nil {
err = c.SetOrderWaybillTipByOrder(ctx, order, tipFee)
}
}
return err
return errCode, err
}
func (c *BaseScheduler) CheckStoreBalanceWithTip(ctx *jxcontext.Context, order *model.GoodsOrder, tipFee int64) (errCode string, err error) {
if order.CreateDeliveryType == model.YES {
//加小费只判断余额
storeAcct, err := cms.GetStoreAcctBalance(ctx, jxutils.GetSaleStoreIDFromOrder(order))
if err != nil {
return errCode, fmt.Errorf("获取账户余额失败!")
}
if tipFee > int64(storeAcct.AccountBalance) {
return model.ErrCodeAccountBalanceNotEnough, fmt.Errorf("门店账户余额不足,不能加小费!")
}
}
return errCode, err
}
func isWaybillCanAddTip(waybill *model.Waybill) (isCan bool) {
@@ -309,19 +351,24 @@ func (c *BaseScheduler) SetOrderWaybillTipByOrder(ctx *jxcontext.Context, order
if order.WaybillTipMoney >= tipFee {
return fmt.Errorf("当前小费已经是%s元想要设置%s元", jxutils.IntPrice2StandardString(order.WaybillTipMoney), jxutils.IntPrice2StandardString(tipFee))
}
globals.SugarLogger.Debugf("SetOrderWaybillTipByOrder, orderID %s, tip:%d", order.VendorOrderID, tipFee)
db := dao.GetDB()
storeDetail, err2 := dao.GetStoreDetail(db, jxutils.GetSaleStoreIDFromOrder(order), order.VendorID)
if err = err2; err != nil {
return err
}
storeDetail, _ := dao.GetStoreDetail(db, jxutils.GetSaleStoreIDFromOrder(order), order.VendorID, "")
flag := false
// 如果平台支持设置配送小费,必须要成功设置
if handler := partner.GetWaybillTipUpdater(order.VendorID); handler != nil {
if err = handler.UpdateWaybillTip(ctx, order.VendorOrgCode, order.VendorStoreID, order.VendorOrderID, "", "", utils.Int2Str(storeDetail.CityCode), tipFee); err != nil {
return err
} else {
//加小费成功扣钱
if order.CreateDeliveryType == model.YES {
if err = partner.CurStoreAcctManager.InsertStoreAcctExpendAndUpdateStoreAcctBalance(ctx, jxutils.GetSaleStoreIDFromOrder(order), 100, partner.StoreAcctTypeExpendCreateWaybillTip, order.VendorOrderID, 0); err == nil {
flag = true
}
}
}
}
} //有可能进else没加得起平台小费就要到下面扣账户
order.WaybillTipMoney = tipFee
partner.CurOrderManager.UpdateOrderFields(order, []string{"WaybillTipMoney"})
@@ -346,6 +393,15 @@ func (c *BaseScheduler) SetOrderWaybillTipByOrder(ctx *jxcontext.Context, order
}, waybills2)
tasksch.HandleTask(task, nil, false).Run()
_, err = task.GetResult(0)
if err == nil {
//加起了至少只扣一次钱
if !flag {
//加小费成功扣钱
if order.CreateDeliveryType == model.YES {
partner.CurStoreAcctManager.InsertStoreAcctExpendAndUpdateStoreAcctBalance(ctx, jxutils.GetSaleStoreIDFromOrder(order), 100, partner.StoreAcctTypeExpendCreateWaybillTip, order.VendorOrderID, 0)
}
}
}
}
}
return err
@@ -354,36 +410,37 @@ func (c *BaseScheduler) SetOrderWaybillTipByOrder(ctx *jxcontext.Context, order
func (c *BaseScheduler) confirmSelfTake(ctx *jxcontext.Context, order *model.GoodsOrder, selfTakeCode string) (err error) {
globals.SugarLogger.Debugf("confirmSelfTake orderID:%s, selfTakeCode:%s", order.VendorOrderID, selfTakeCode)
vendorID := order.VendorID
if vendorID == model.VendorIDJD || vendorID == model.VendorIDJX {
if vendorID == model.VendorIDJD {
if selfTakeCode == autoSelfTakeCode {
if selfTakeCode, err = jd.CurPurchaseHandler.GetSelfTakeCode(ctx, order); err != nil {
return fmt.Errorf("获取订单:%s自提货码失败原始错误:%s", order.VendorOrderID, err.Error())
}
if selfTakeCode == "" {
return fmt.Errorf("订单:%s看起来不是一个自提订单如果确认是自提订单请联系开发", order.VendorOrderID)
}
// if vendorID == model.VendorIDJD || vendorID == model.VendorIDJX {
if vendorID != model.VendorIDJX {
handler := partner.GetPurchaseOrderHandlerFromVendorID(vendorID)
if selfTakeCode == autoSelfTakeCode {
if selfTakeCode, err = handler.GetSelfTakeCode(ctx, order); err != nil {
return fmt.Errorf("获取订单:%s自提货码失败原始错误:%s", order.VendorOrderID, err.Error())
}
err = jd.CurPurchaseHandler.ConfirmSelfTake(ctx, order, selfTakeCode)
} else {
orderStatus := &model.OrderStatus{
VendorOrderID: order.VendorOrderID,
VendorID: model.VendorIDJX,
OrderType: model.OrderTypeOrder,
RefVendorOrderID: order.VendorOrderID,
RefVendorID: model.VendorIDJX,
VendorStatus: utils.Int2Str(model.OrderStatusFinished),
Status: model.OrderStatusFinished,
StatusTime: time.Now(),
Remark: "自提完成",
if selfTakeCode == "" {
return fmt.Errorf("订单:%s 自动提货失败,请手动输入自提码", order.VendorOrderID)
}
jxutils.CallMsgHandlerAsync(func() {
err = partner.CurOrderManager.OnOrderStatusChanged("", orderStatus)
}, jxutils.ComposeUniversalOrderID(order.VendorOrderID, model.VendorIDJX))
}
err = handler.ConfirmSelfTake(ctx, order, selfTakeCode)
} else {
err = fmt.Errorf("自提核销不支持%s平台订单", model.VendorChineseNames[order.VendorID])
orderStatus := &model.OrderStatus{
VendorOrderID: order.VendorOrderID,
VendorID: model.VendorIDJX,
OrderType: model.OrderTypeOrder,
RefVendorOrderID: order.VendorOrderID,
RefVendorID: model.VendorIDJX,
VendorStatus: utils.Int2Str(model.OrderStatusFinished),
Status: model.OrderStatusFinished,
StatusTime: time.Now(),
Remark: "自提完成",
}
jxutils.CallMsgHandlerAsync(func() {
err = partner.CurOrderManager.OnOrderStatusChanged("", orderStatus)
}, jxutils.ComposeUniversalOrderID(order.VendorOrderID, model.VendorIDJX))
}
// } else {
// err = fmt.Errorf("自提核销不支持%s平台订单", model.VendorChineseNames[order.VendorID])
// }
return err
}

View File

@@ -6,9 +6,11 @@ import (
"sync"
"time"
"git.rosy.net.cn/jx-callback/globals/api"
push "git.rosy.net.cn/jx-callback/business/jxutils/unipush"
"github.com/astaxie/beego"
beego "github.com/astaxie/beego/server/web"
"git.rosy.net.cn/jx-callback/business/jxstore/cms"
@@ -33,7 +35,7 @@ import (
"git.rosy.net.cn/jx-callback/business/model/legacymodel"
"git.rosy.net.cn/jx-callback/business/partner"
"git.rosy.net.cn/jx-callback/globals"
"github.com/astaxie/beego/orm"
"github.com/astaxie/beego/client/orm"
)
const (
@@ -165,7 +167,7 @@ func (s *WatchOrderInfo) updateOrderStoreFeature(order *model.GoodsOrder) (err e
jxStoreID := jxutils.GetSaleStoreIDFromOrder(order)
if jxStoreID > 0 {
db := dao.GetDB()
storeDetail, err2 := dao.GetStoreDetail(db, jxStoreID, order.VendorID)
storeDetail, err2 := dao.GetStoreDetail(db, jxStoreID, order.VendorID, "")
if err = err2; err != nil {
return err
}
@@ -235,7 +237,7 @@ func init() {
},
TimeoutAction: func(savedOrderInfo *WatchOrderInfo, bill *model.Waybill) (err error) {
order := savedOrderInfo.order
storeDetail, err := dao.GetStoreDetail(dao.GetDB(), jxutils.GetSaleStoreIDFromOrder(order), order.VendorID)
storeDetail, err := dao.GetStoreDetail(dao.GetDB(), jxutils.GetSaleStoreIDFromOrder(order), order.VendorID, "")
if err == nil {
savedOrderInfo.storeDetail = storeDetail
}
@@ -248,7 +250,7 @@ func init() {
partner.CurOrderManager.OnOrderMsg(order, "自动接单失败", err.Error())
// 为了解决京东新消息与接单消息乱序的问题
if errWithCode, ok := err.(*utils.ErrorWithCode); ok && errWithCode.Level() == 1 && errWithCode.IntCode() == -1 {
if order2, err2 := partner.GetPurchaseOrderHandlerFromVendorID(order.VendorID).GetOrder(order.VendorOrgCode, order.VendorOrderID); err2 == nil {
if order2, err2 := partner.GetPurchaseOrderHandlerFromVendorID(order.VendorID).GetOrder(order.VendorOrgCode, order.VendorOrderID, order.VendorStoreID); err2 == nil {
if order2.Status > order.Status {
order.Status = order2.Status
jxutils.CallMsgHandlerAsync(func() {
@@ -263,7 +265,7 @@ func init() {
}
if isAcceptIt {
if err == nil {
sch.notifyNewOrder(order)
sch.notifyNewOrder(order, false)
msghub.OnNewOrder(order)
}
} else {
@@ -305,6 +307,7 @@ func init() {
TimeoutGap: 0,
},
TimeoutAction: func(savedOrderInfo *WatchOrderInfo, bill *model.Waybill) (err error) {
globals.SugarLogger.Debugf("OrderStatusFinishedPickup timeout: %v", utils.Format4Output(savedOrderInfo, true))
// 启动抢单TIMER
sch.saveDeliveryFeeFromAndStartWatch(savedOrderInfo, savedOrderInfo.order.StatusTime)
return sch.createWaybillOn3rdProviders(savedOrderInfo, 0, nil)
@@ -328,6 +331,10 @@ func init() {
// 饿百转自送的时机不太清楚,暂时禁用超时转自送,在饿百运单取消时还是会自动创建
// 非自配送商家使用
order := savedOrderInfo.order
globals.SugarLogger.Debugf("waybill timer: %v", utils.Format4Output(order, true))
globals.SugarLogger.Debugf("waybill timer 1: %v", model.IsOrderDeliveryByPlatform(order))
globals.SugarLogger.Debugf("waybill timer 2: %v", isOrderCanSwitch2SelfDeliver(order))
globals.SugarLogger.Debugf("waybill timer 3: %v", savedOrderInfo.isDeliveryCompetition)
return order.VendorID != model.VendorIDEBAI &&
order.VendorID == bill.WaybillVendorID &&
savedOrderInfo.isDeliveryCompetition &&
@@ -372,18 +379,38 @@ func Init() {
}
// 以下是订单
func (s *DefScheduler) OnOrderNew(order *model.GoodsOrder, isPending bool) (err error) {
func (s *DefScheduler) OnOrderNew(order *model.GoodsOrder, isPending bool, isAuto bool) (err error) {
globals.SugarLogger.Debugf("OnOrderNew orderID:%s", order.VendorOrderID)
savedOrderInfo := s.loadSavedOrderFromMap(model.Order2Status(order), false)
savedOrderInfo.SetOrder(order)
if order.Status == model.OrderStatusWaitAccepted {
s.resetTimer(savedOrderInfo, nil, isPending)
push.NotifyNewOrder(order)
if order.VendorID == model.VendorIDEBAI { //饿百订单待接单的时候就推所有东西
if order.Status == model.OrderStatusWaitAccepted || order.Status == model.OrderStatusNew || order.Status >= model.OrderStatusFinishedPickup { //错序
s.resetTimer(savedOrderInfo, nil, isPending)
if order.Flag&model.OrderFlagMaskFake == 0 {
utils.CallFuncAsync(func() {
// order = setFakeActualPayPrice(order)
netprinter.PrintOrderByOrder(jxcontext.AdminCtx, order)
//目前暂且认为AdjustCount > 0 就是调整单
if order.AdjustCount > 0 {
weixinmsg.NotifyAdjustOrder(order)
} else {
weixinmsg.NotifyNewOrder(order)
}
OrderProfitWarning(order)
if !isAuto {
smsmsg.NotifyNewOrder(order)
}
// smsmsg.NotifyNewUserOrder(order)
push.NotifyNewOrder(order)
})
}
msghub.OnNewOrder(order)
}
}
if order.Status >= model.OrderStatusNew {
s.resetTimer(savedOrderInfo, nil, isPending)
if !isPending && order.Status >= model.OrderStatusAccepted { // 有订单消息错序先收到接单消息再收到新订单消息导致接单TIMER不动作这里补一下
s.notifyNewOrder(order)
s.notifyNewOrder(order, isAuto)
msghub.OnNewOrder(order)
}
}
@@ -478,7 +505,7 @@ func (s *DefScheduler) OnOrderStatusChanged(order *model.GoodsOrder, status *mod
// 以下是运单
func (s *DefScheduler) OnWaybillStatusChanged(bill *model.Waybill, isPending bool) (err error) {
if bill.Status > model.WaybillStatusUnknown {
globals.SugarLogger.Debugf("OnWaybillStatusChanged orderID:%s %s, bill:%v", bill.VendorOrderID, model.WaybillStatusName[bill.Status], bill)
globals.SugarLogger.Debugf("OnWaybillStatusChanged orderID:%s %s, bill:%v", bill.VendorOrderID, model.WaybillStatusName[bill.Status], utils.Format4Output(bill, true))
savedOrderInfo := s.loadSavedOrderFromMap(model.Waybill2Status(bill), true)
order := savedOrderInfo.order
// todo 当前收到的事件顺序有时是乱的,不能严格限制,暂时放开
@@ -520,7 +547,7 @@ func (s *DefScheduler) OnWaybillStatusChanged(bill *model.Waybill, isPending boo
}
if needAddTip {
if handler := partner.GetWaybillTipUpdater(bill.WaybillVendorID); handler != nil {
if storeDetail, err2 := dao.GetStoreDetail(dao.GetDB(), jxutils.GetSaleStoreIDFromOrder(order), order.VendorID); err2 == nil {
if storeDetail, err2 := dao.GetStoreDetail(dao.GetDB(), jxutils.GetSaleStoreIDFromOrder(order), order.VendorID, ""); err2 == nil {
handler.UpdateWaybillTip(jxcontext.AdminCtx, order.VendorOrgCode, order.VendorStoreID, order.VendorOrderID, bill.VendorWaybillID, bill.VendorWaybillID2, utils.Int2Str(storeDetail.CityCode), order.WaybillTipMoney)
}
}
@@ -537,7 +564,7 @@ func (s *DefScheduler) OnWaybillStatusChanged(bill *model.Waybill, isPending boo
s.resetTimer(savedOrderInfo, bill, isPending)
s.saveDeliveryFeeFromAndStartWatch(savedOrderInfo, bill.StatusTime)
}
s.sendCourierOrderSMS(bill)
// s.sendCourierOrderSMS(bill)
} else {
isBillExist := s.updateBillsInfo(savedOrderInfo, bill)
if !isBillExist {
@@ -564,6 +591,21 @@ func (s *DefScheduler) OnWaybillStatusChanged(bill *model.Waybill, isPending boo
if order.VendorID == model.VendorIDJDShop {
s.solutionJdsOrder(bill)
}
//如果是商城的订单, 骑手取货时,需要发短信提醒
if bill.Status == model.WaybillStatusDelivering && order.VendorID == model.VendorIDJX && order.OrderType == model.OrderTypeNormal {
smsmsg.NotifyJxOrder(order, bill)
}
//门店发单的门店,需要根据实际运费更新账户(多退少补)
if storeDetail, err2 := dao.GetStoreDetail(dao.GetDB(), jxutils.GetSaleStoreIDFromOrder(order), order.VendorID, ""); err2 == nil {
if storeDetail.CreateDeliveryType == model.YES {
s.updateStoreAccount(order, bill)
}
}
//订单已经是结束状态之后来的运单143945553920000001
if order.Status > model.OrderStatusEndBegin {
s.ProxyCancelWaybill(order, bill, partner.CancelWaybillReasonNotAcceptIntime, partner.CancelWaybillReasonStrNotAcceptIntime)
}
if model.IsWaybillPlatformOwn(bill) {
if bill.Status == model.WaybillStatusDelivering && order.Status < model.OrderStatusEndBegin {
// 强制将订单状态置为配送中?
@@ -628,6 +670,11 @@ func (s *DefScheduler) OnWaybillStatusChanged(bill *model.Waybill, isPending boo
s.createWaybillOn3rdProviders(savedOrderInfo, 0, nil)
}
}
//if order.Status < model.OrderStatusDelivering {
// if order.VendorID == model.VendorIDMTWM && order.DeliveryType == model.OrderDeliveryTypePlatform {
// s.CancelOrder(jxcontext.AdminCtx, order, "")
// }
//}
}
}
// case model.WaybillStatusDelivering:
@@ -684,20 +731,21 @@ func (s *DefScheduler) OnWaybillStatusChanged(bill *model.Waybill, isPending boo
func (s *DefScheduler) cancelWaybillNotInStoreOpentime(savedOrderInfo *WatchOrderInfo, bill *model.Waybill) (err error) {
if savedOrderInfo != nil {
//TODO 2020-09-07 不在门店的营业时间内取消运单
order := savedOrderInfo.order
if savedOrderInfo.storeDetail != nil {
if savedOrderInfo.storeDetail.OpenTime1 != 0 && savedOrderInfo.storeDetail.CloseTime1 != 0 {
time1 := jxutils.JxOperationTime2TimeByDate(savedOrderInfo.storeDetail.OpenTime1, time.Now())
time2 := jxutils.JxOperationTime2TimeByDate(savedOrderInfo.storeDetail.CloseTime1, time.Now())
if time.Now().Sub(time1) < 0 || time.Now().Sub(time2) > 0 {
if savedOrderInfo.storeDetail.OpenTime2 != 0 && savedOrderInfo.storeDetail.CloseTime2 != 0 {
time3 := jxutils.JxOperationTime2TimeByDate(savedOrderInfo.storeDetail.OpenTime2, time.Now())
time4 := jxutils.JxOperationTime2TimeByDate(savedOrderInfo.storeDetail.CloseTime2, time.Now())
if time.Now().Sub(time3) < 0 || time.Now().Sub(time4) > 0 {
s.ProxyCancelWaybill(order, bill, partner.CancelWaybillReasonNotAcceptIntime, partner.CancelWaybillReasonNotInStoreOpenTime)
//TODO 2021-07-26 实时取门店营业时间,运营可能在订单来之后修改门店营业时间
storeDetail, _ := partner.CurOrderManager.LoadStoreDetail(jxutils.GetSaleStoreIDFromOrder(savedOrderInfo.order), savedOrderInfo.order.VendorID)
if storeDetail != nil {
if storeDetail.OpenTime1 != 0 && storeDetail.CloseTime1 != 0 {
time1 := jxutils.JxOperationTime2TimeByDate(storeDetail.OpenTime1, time.Now())
time2 := jxutils.JxOperationTime2TimeByDate(storeDetail.CloseTime1, time.Now())
if time.Now().Sub(time1) < 0 || time.Now().Sub(time2.Add(time.Hour)) > 0 {
if storeDetail.OpenTime2 != 0 && storeDetail.CloseTime2 != 0 {
time3 := jxutils.JxOperationTime2TimeByDate(storeDetail.OpenTime2, time.Now())
time4 := jxutils.JxOperationTime2TimeByDate(storeDetail.CloseTime2, time.Now())
if time.Now().Sub(time3) < 0 || time.Now().Sub(time4.Add(time.Hour)) > 0 {
s.CancelWaybill(bill, partner.CancelWaybillReasonNotAcceptIntime, partner.CancelWaybillReasonNotInStoreOpenTime)
}
} else {
s.ProxyCancelWaybill(order, bill, partner.CancelWaybillReasonNotAcceptIntime, partner.CancelWaybillReasonNotInStoreOpenTime)
s.CancelWaybill(bill, partner.CancelWaybillReasonNotAcceptIntime, partner.CancelWaybillReasonNotInStoreOpenTime)
}
}
}
@@ -706,10 +754,10 @@ func (s *DefScheduler) cancelWaybillNotInStoreOpentime(savedOrderInfo *WatchOrde
return err
}
func (s *DefScheduler) sendCourierOrderSMS(bill *model.Waybill) (err error) {
err = smsmsg.NotifyNewCourierOrder(bill)
return err
}
//func (s *DefScheduler) sendCourierOrderSMS(bill *model.Waybill) (err error) {
// err = smsmsg.NotifyNewCourierOrder(bill)
// return err
//}
func (s *DefScheduler) isWaybillCourierSame(savedOrderInfo *WatchOrderInfo, bill *model.Waybill) bool {
return savedOrderInfo.waybills[bill.WaybillVendorID] != nil && savedOrderInfo.waybills[bill.WaybillVendorID].CourierMobile == bill.CourierMobile
@@ -766,6 +814,7 @@ func (s *DefScheduler) createWaybillOn3rdProviders(savedOrderInfo *WatchOrderInf
if err = s.canOrderCreateWaybillNormally(order, savedOrderInfo); err == nil {
if (order.DeliveryFlag & model.OrderDeliveryFlagMaskScheduleDisabled) == 0 {
if savedOrderInfo.retryCount <= maxWaybillRetryCount {
var waybillVendorIDs = []int{model.VendorIDMTPS, model.VendorIDDada, model.VendorIDFengNiao}
savedOrderInfo.isNeedCreate3rdWaybill = true
excludeVendorIDs := savedOrderInfo.GetWaybillVendorIDs()
//TODO 取消京西不自动发美团 2020-06-02
@@ -773,32 +822,67 @@ func (s *DefScheduler) createWaybillOn3rdProviders(savedOrderInfo *WatchOrderInf
// excludeVendorIDs = append(excludeVendorIDs, model.VendorIDMTPS)
// }
//TODO 2020-08-18 饿百美团订单暂时不自动发送三方
if order.VendorID == model.VendorIDMTWM || order.VendorID == model.VendorIDEBAI {
if order.VendorID == model.VendorIDMTWM || order.VendorID == model.VendorIDEBAI || order.VendorID == model.VendorIDJD {
if order.DeliveryType != model.OrderDeliveryTypeStoreSelf {
excludeVendorIDs = append(excludeVendorIDs, model.VendorIDMTPS, model.VendorIDDada)
excludeVendorIDs = append(excludeVendorIDs, waybillVendorIDs...)
}
}
if savedOrderInfo != nil {
//TODO 2020-07-21 发单时间要在门店的营业时间内
if savedOrderInfo.storeDetail != nil {
if savedOrderInfo.storeDetail.OpenTime1 != 0 && savedOrderInfo.storeDetail.CloseTime1 != 0 {
time1 := jxutils.JxOperationTime2TimeByDate(savedOrderInfo.storeDetail.OpenTime1, time.Now())
time2 := jxutils.JxOperationTime2TimeByDate(savedOrderInfo.storeDetail.CloseTime1, time.Now())
if time.Now().Sub(time1) < 0 || time.Now().Sub(time2) > 0 {
if savedOrderInfo.storeDetail.OpenTime2 != 0 && savedOrderInfo.storeDetail.CloseTime2 != 0 {
time3 := jxutils.JxOperationTime2TimeByDate(savedOrderInfo.storeDetail.OpenTime2, time.Now())
time4 := jxutils.JxOperationTime2TimeByDate(savedOrderInfo.storeDetail.CloseTime2, time.Now())
if time.Now().Sub(time3) < 0 || time.Now().Sub(time4) > 0 {
err = fmt.Errorf("不在门店营业时间范围内!")
}
} else {
var income int64
if order.OrderPayPercentage < 50 {
income = order.TotalShopMoney * int64((order.OrderPayPercentage / 2))
} else if order.OrderPayPercentage > 50 && order.OrderPayPercentage < 100 {
income = order.TotalShopMoney - order.NewEarningPrice
} else if order.OrderPayPercentage == 100 {
income = order.TotalShopMoney - order.ShopPrice
}
//2020-11-16 预计收益-配送费 > 0 再发
for _, vendorID := range waybillVendorIDs {
var fee int64
handler := partner.GetDeliveryPlatformFromVendorID(vendorID)
if deliveryFeeInfo, err := handler.Handler.GetWaybillFee(order); err == nil {
if deliveryFeeInfo != nil {
if income-deliveryFeeInfo.DeliveryFee <= 0 {
excludeVendorIDs = append(excludeVendorIDs, vendorID)
}
fee = deliveryFeeInfo.DeliveryFee
}
}
globals.SugarLogger.Debugf("count order income, vendorID: %v, income :%v , deliveryFee : %v", vendorID, income, fee)
}
//TODO 2020-07-21 发单时间要在门店的营业时间内
var storeDetail *dao.StoreDetail
//if savedOrderInfo.storeDetail != nil {
// storeDetail = savedOrderInfo.storeDetail
//} else {
storeDetail, err = dao.GetStoreDetail(dao.GetDB(), jxutils.GetSaleStoreIDFromOrder(order), order.VendorID, "")
//}
if storeDetail != nil {
globals.SugarLogger.Debugf("三方运单门店营业时间范围 time1 %v ,time2 %v", storeDetail.OpenTime1, storeDetail.CloseTime1)
if storeDetail.OpenTime1 != 0 && storeDetail.CloseTime1 != 0 {
time1 := jxutils.JxOperationTime2TimeByDate(storeDetail.OpenTime1, time.Now())
time2 := jxutils.JxOperationTime2TimeByDate(storeDetail.CloseTime1, time.Now())
if time.Now().Sub(time1) < 0 || time.Now().Sub(time2.Add(30*time.Minute)) > 0 {
if storeDetail.OpenTime2 != 0 && storeDetail.CloseTime2 != 0 {
time3 := jxutils.JxOperationTime2TimeByDate(storeDetail.OpenTime2, time.Now())
time4 := jxutils.JxOperationTime2TimeByDate(storeDetail.CloseTime2, time.Now())
if time.Now().Sub(time3) < 0 || time.Now().Sub(time4.Add(30*time.Minute)) > 0 {
err = fmt.Errorf("不在门店营业时间范围内!")
}
} else {
err = fmt.Errorf("不在门店营业时间范围内!")
}
}
}
}
//1表示为门店发单需要验证门店账户余额情况
_, err = s.CheckStoreBalance(jxcontext.AdminCtx, order, waybillVendorIDs)
//TODO 2021-02-19 增加品牌配送开关
if storeDetail.BrandIsOpen == model.YES {
err = fmt.Errorf("此品牌已关闭配送! [%v]", storeDetail.BrandName)
}
if err == nil {
if _, err = s.CreateWaybillOnProviders4SavedOrder(jxcontext.AdminCtx, savedOrderInfo, nil, excludeVendorIDs, false, maxDeliveryFee); err == nil {
savedOrderInfo.retryCount++
@@ -919,8 +1003,10 @@ func (s *DefScheduler) loadSavedOrderFromMap(status *model.OrderStatus, isForceL
universalOrderID := jxutils.ComposeUniversalOrderID(status.RefVendorOrderID, status.RefVendorID)
var realSavedInfo *WatchOrderInfo
if savedInfo, ok := s.orderMap.Load(universalOrderID); ok {
globals.SugarLogger.Debugf("loadSavedOrderFromMap step 1")
realSavedInfo = savedInfo.(*WatchOrderInfo)
} else {
globals.SugarLogger.Debugf("loadSavedOrderFromMap step 2")
realSavedInfo = NewWatchOrderInfo(nil)
s.orderMap.StoreWithTimeout(universalOrderID, realSavedInfo, orderMapStoreMaxTime)
}
@@ -970,6 +1056,8 @@ func (s *DefScheduler) resetTimer(savedOrderInfo *WatchOrderInfo, bill *model.Wa
}
if config != nil && config.TimeoutAction != nil && config.TimerType != partner.TimerTypeByPass {
globals.SugarLogger.Debugf("CallShouldSetTimer : savedOrderInfo : %v, %v", savedOrderInfo, savedOrderInfo.isNeedCreate3rdWaybill)
globals.SugarLogger.Debugf("CallShouldSetTimer : order : %v, waybill: %v", utils.Format4Output(savedOrderInfo.order, true), utils.Format4Output(bill, true))
if config.CallShouldSetTimer(savedOrderInfo, bill) {
timeout := config.GetRefTimeout(statusTime, order.OrderCreatedAt)
if config.TimeoutGap != 0 {
@@ -1242,12 +1330,9 @@ func (s *DefScheduler) updateOrderByBill(order *model.GoodsOrder, bill *model.Wa
} else {
order.WaybillVendorID = bill.WaybillVendorID
order.VendorWaybillID = bill.VendorWaybillID
if bill.Status == model.WaybillStatusDelivered {
storeDetail, _ := partner.CurOrderManager.LoadStoreDetail(jxutils.GetSaleStoreIDFromOrder(order), order.VendorID)
if storeDetail != nil {
jxutils.RefreshOrderEarningPrice3(order, storeDetail.PayPercentage, bill)
updateFields = append(updateFields, "NewEarningPrice")
}
if bill.DesiredFee != 0 {
jxutils.RefreshOrderEarningPrice3(order, order.OrderPayPercentage, bill)
updateFields = append(updateFields, "NewEarningPrice")
}
}
if revertStatus {
@@ -1257,6 +1342,23 @@ func (s *DefScheduler) updateOrderByBill(order *model.GoodsOrder, bill *model.Wa
partner.CurOrderManager.UpdateOrderFields(order, updateFields)
}
func (s *DefScheduler) updateStoreAccount(order *model.GoodsOrder, bill *model.Waybill) {
realDesiredFee := bill.DesiredFee
if expend, lastFee, err := partner.CurStoreAcctManager.GetStoreAcctExpendLastCreateWayBillFee(order.VendorOrderID); err == nil && expend != nil {
lastFee64 := int64(lastFee)
if lastFee64 != realDesiredFee {
var diffFee int64
if lastFee64 > realDesiredFee {
diffFee = lastFee64 - realDesiredFee
partner.CurStoreAcctManager.InsertStoreAcctIncomeAndUpdateStoreAcctBalance(jxcontext.AdminCtx, jxutils.GetSaleStoreIDFromOrder(order), int(diffFee), partner.StoreAcctTypeRealFeeIncome, order.VendorOrderID, expend.ID)
} else {
diffFee = realDesiredFee - lastFee64
partner.CurStoreAcctManager.InsertStoreAcctIncomeAndUpdateStoreAcctBalance(jxcontext.AdminCtx, jxutils.GetSaleStoreIDFromOrder(order), int(diffFee), partner.StoreAcctTypeRealFeeExpend, order.VendorOrderID, expend.ID)
}
}
}
}
func (s *DefScheduler) updateBillsInfo(savedOrderInfo *WatchOrderInfo, bill *model.Waybill) (isBillExist bool) {
if savedOrderInfo != nil {
if savedBill := savedOrderInfo.waybills[bill.WaybillVendorID]; savedBill != nil {
@@ -1274,7 +1376,8 @@ func (s *DefScheduler) updateBillsInfo(savedOrderInfo *WatchOrderInfo, bill *mod
func (s *DefScheduler) autoPickupGood(savedOrderInfo *WatchOrderInfo) (err error) {
order := savedOrderInfo.order
if err = s.PickupGoods(order, model.IsOrderDeliveryByStore(order), ""); err == nil {
flag := model.IsOrderDeliveryByStore(order) || model.IsOrderDeliveryBySelf(order)
if err = s.PickupGoods(order, flag, ""); err == nil {
order.DeliveryFlag |= model.OrderDeliveryFlagMaskAutoPickup
partner.CurOrderManager.UpdateOrderFields(order, []string{"DeliveryFlag"})
} else if err == scheduler.ErrOrderStatusAlreadySatisfyCurOperation {
@@ -1417,6 +1520,7 @@ func (s *DefScheduler) isBillCandidate(order *model.GoodsOrder, bill *model.Wayb
func (s *DefScheduler) ProxyCancelWaybill(order *model.GoodsOrder, bill *model.Waybill, cancelReasonID int, cancelReason string) (err error) {
globals.SugarLogger.Debugf("ProxyCancelWaybill orderID:%s", order.VendorOrderID)
if (order.DeliveryFlag & model.OrderDeliveryFlagMaskScheduleDisabled) == 0 {
if err = s.CancelWaybill(bill, cancelReasonID, cancelReason); err != nil {
partner.CurOrderManager.OnOrderMsg(order, "取消三方运单失败", err.Error())
@@ -1444,7 +1548,7 @@ func OnDefSchConfChanged(key, value string) {
func setFakeActualPayPrice(order *model.GoodsOrder) (newOrder *model.GoodsOrder) {
orderCopy := *order
storeDetail, err := dao.GetStoreDetail(dao.GetDB(), order.JxStoreID, order.VendorID)
storeDetail, err := dao.GetStoreDetail(dao.GetDB(), order.JxStoreID, order.VendorID, "")
if err == nil {
if storeDetail.PayPercentage < 50 {
orderCopy.ActualPayPrice = order.TotalShopMoney * (100 - int64(storeDetail.PayPercentage/2)) / 100
@@ -1456,10 +1560,10 @@ func setFakeActualPayPrice(order *model.GoodsOrder) (newOrder *model.GoodsOrder)
return newOrder
}
func (s *DefScheduler) notifyNewOrder(order *model.GoodsOrder) {
if order.Flag&model.OrderFlagMaskFake == 0 {
func (s *DefScheduler) notifyNewOrder(order *model.GoodsOrder, isAuto bool) {
if order.Flag&model.OrderFlagMaskFake == 0 && order.VendorID != model.VendorIDEBAI {
utils.CallFuncAsync(func() {
order = setFakeActualPayPrice(order)
// order = setFakeActualPayPrice(order)
netprinter.PrintOrderByOrder(jxcontext.AdminCtx, order)
//目前暂且认为AdjustCount > 0 就是调整单
if order.AdjustCount > 0 {
@@ -1468,20 +1572,18 @@ func (s *DefScheduler) notifyNewOrder(order *model.GoodsOrder) {
weixinmsg.NotifyNewOrder(order)
}
OrderProfitWarning(order)
if order.VendorID != model.VendorIDJDShop {
if !isAuto {
smsmsg.NotifyNewOrder(order)
smsmsg.NotifyNewUserOrder(order)
}
if order.VendorID != model.VendorIDEBAI {
push.NotifyNewOrder(order)
}
// smsmsg.NotifyNewUserOrder(order)
push.NotifyNewOrder(order)
})
}
}
func (s *DefScheduler) notifyUserApplyCancel(order *model.GoodsOrder, cancelReason string) {
utils.CallFuncAsync(func() {
order = setFakeActualPayPrice(order)
// order = setFakeActualPayPrice(order)
weixinmsg.NotifyUserApplyCancel(order, cancelReason)
})
}
@@ -1489,9 +1591,9 @@ func (s *DefScheduler) notifyUserApplyCancel(order *model.GoodsOrder, cancelReas
func (s *DefScheduler) notifyOrderCanceled(order *model.GoodsOrder) {
if order.Flag&model.OrderFlagMaskFake == 0 {
utils.CallFuncAsync(func() {
order = setFakeActualPayPrice(order)
// order = setFakeActualPayPrice(order)
weixinmsg.NotifyOrderCanceled(order)
smsmsg.NotifyOrderCanceled(order)
//smsmsg.NotifyOrderCanceled(order)
push.NotifyOrderCanceled(order)
})
}
@@ -1526,9 +1628,14 @@ func OrderProfitWarning(order *model.GoodsOrder) {
return
}
storeID := jxutils.GetShowStoreIDFromOrder(order)
storeDetail, err := dao.GetStoreDetail(db, storeID, order.VendorID)
storeDetail, err := dao.GetStoreDetail(db, storeID, order.VendorID, "")
payPercentage := 0
if storeDetail != nil && err == nil {
payPercentage := storeDetail.PayPercentage
if storeDetail.VendorPayPercentage != 0 {
payPercentage = storeDetail.VendorPayPercentage
} else {
payPercentage = storeDetail.PayPercentage
}
if beego.BConfig.RunMode == "jxgy" {
if payPercentage >= 50 {
profit = utils.Str2Float64(utils.Int64ToStr(order.TotalShopMoney-order.EarningPrice)) / 100
@@ -1537,11 +1644,12 @@ func OrderProfitWarning(order *model.GoodsOrder) {
}
} else {
if payPercentage >= 50 {
profit = utils.Str2Float64(utils.Int64ToStr(order.TotalShopMoney-order.ShopPrice)) / 100
profit = utils.Str2Float64(utils.Int64ToStr(order.TotalShopMoney-order.EarningPrice)) / 100
} else {
profit = utils.Str2Float64(utils.Int64ToStr(order.TotalShopMoney*int64(payPercentage)/200)) / 100
}
}
globals.SugarLogger.Debugf("OrderProfitWarning profit : %v", profit)
if profit < 0 {
operatorPhone, operatorName := getOrderOperatorInfo(order, storeDetail)
operatorRole := getOrderOperatorRoleInfo(order, storeDetail)
@@ -1550,27 +1658,40 @@ func OrderProfitWarning(order *model.GoodsOrder) {
roleList []*authz.RoleInfo
userIDs []string
flag = false
storeIDt int
)
roleList = append(roleList, autils.NewRole(operatorRole, 0))
userIDMap, err := cms.GetRolesUserList(jxcontext.AdminCtx, roleList)
noticeMsg := fmt.Sprintf("利润 [%v],运营负责人:[%v],商家负责人:[%v]门店ID[%v]平台门店ID[%v],门店名:[%v],订单序号:[%v],订单号(点击进入详情)%v", profit, operatorName, storeDetail.MarketManName, order.StoreID, order.VendorStoreID, order.StoreName, order.OrderSeq, globals.BackstageHost+"/#/ordermanager/"+order.VendorOrderID)
user, err := dao.GetUserByID(db, "mobile", operatorPhone)
if user != nil && err == nil {
for _, v := range userIDMap {
for _, vv := range v {
userIDs = append(userIDs, vv)
if operatorRole != "" {
roleList = append(roleList, autils.NewRole(operatorRole, 0))
if userIDMap, err := cms.GetRolesUserList(jxcontext.AdminCtx, roleList); err == nil {
for _, v := range userIDMap {
for _, vv := range v {
userIDs = append(userIDs, vv)
}
}
}
}
storeIDt = order.StoreID
if storeIDt == 0 {
storeIDt = order.JxStoreID
}
noticeMsg := fmt.Sprintf("利润 [%v],运营负责人:[%v],商家负责人:[%v]门店ID[%v]平台门店ID[%v],门店名:[%v],订单序号:[%v],订单号(点击进入详情)%v", profit, operatorName, storeDetail.MarketManName, storeIDt, order.VendorStoreID, order.StoreName, order.OrderSeq, globals.BackstageHost+"/#/ordermanager/"+order.VendorOrderID)
user, err := dao.GetUserByID(db, "mobile", operatorPhone)
user2, err := dao.GetUserByID(db, "mobile", storeDetail.MarketManPhone)
if user != nil && err == nil {
for _, v := range userIDs {
if v == user.UserID {
flag = true
break
}
}
if !flag {
userIDs = append(userIDs, user.UserID)
}
userIDs = append(userIDs, user2.UserID)
for _, v := range userIDs {
ddmsg.SendUserMessage(dingdingapi.MsgTyeText, v, "警告此订单利润低于0", noticeMsg)
if api.DingDingAPI.GetToken() != "" {
ddmsg.SendUserMessage(dingdingapi.MsgTyeText, v, "警告此订单利润低于0", noticeMsg)
}
}
}
}
@@ -1583,7 +1704,7 @@ func (s *DefScheduler) notifyOrderStakeHolder(order *model.GoodsOrder, msgTitle,
// "18180948107",
}
db := dao.GetDB()
storeDetail, err := dao.GetStoreDetail(db, jxutils.GetSaleStoreIDFromOrder(order), order.VendorID)
storeDetail, err := dao.GetStoreDetail(db, jxutils.GetSaleStoreIDFromOrder(order), order.VendorID, "")
if err == nil {
operatorPhone, _ := getOrderOperatorInfo(order, storeDetail)
if operatorPhone != "" {

View File

@@ -5,6 +5,10 @@ import (
"math"
"time"
"git.rosy.net.cn/jx-callback/business/jxstore/cms"
"git.rosy.net.cn/baseapi/utils"
"git.rosy.net.cn/jx-callback/business/model/dao"
"git.rosy.net.cn/jx-callback/business/jxcallback/scheduler"
@@ -31,11 +35,12 @@ func (s *DefScheduler) SelfDeliveringAndUpdateStatus(ctx *jxcontext.Context, ven
if savedOrderInfo != nil {
order = savedOrderInfo.order
if err = s.isPossibleSwitch2SelfDelivery(order); err == nil {
globals.SugarLogger.Infof("SelfDeliveringAndUpdateStatus ordersavedOrderInfoID:%s", utils.Format4Output(savedOrderInfo, false))
err = s.cancelOtherWaybillsCheckOrderDeliveryFlag(savedOrderInfo, nil, partner.CancelWaybillReasonOther, partner.CancelWaybillReasonStrActive)
if err == nil {
if model.IsOrderDeliveryByStore(order) {
if order.Status < model.OrderStatusDelivering {
storeDetail, err2 := dao.GetStoreDetail(dao.GetDB(), order.StoreID, order.VendorID)
storeDetail, err2 := dao.GetStoreDetail(dao.GetDB(), order.StoreID, order.VendorID, "")
phone := userName
if err = err2; err == nil {
phone = storeDetail.Tel1
@@ -127,6 +132,47 @@ func (s *DefScheduler) CreateWaybillOnProviders4SavedOrder(ctx *jxcontext.Contex
if forceCreate {
s.stopTimer(savedOrderInfo)
}
//门店发单开始扣钱
if order.CreateDeliveryType == model.YES {
deliveryFeeMap, _ := s.QueryOrderWaybillFeeInfoEx(ctx, order.VendorOrderID, order.VendorID)
isEqual, isZero, _ := partner.CurStoreAcctManager.CheckStoreAcctExpendExist(order.VendorOrderID)
if !isZero && !isEqual {
var newPrice int64
if len(courierVendorIDs) == 1 {
courierVendorID := courierVendorIDs[0]
if _, ok := deliveryFeeMap[courierVendorID]; ok {
newPrice = deliveryFeeMap[courierVendorID].DeliveryFee
}
} else if len(courierVendorIDs) == 0 {
var maxFee int64
for _, v := range deliveryFeeMap {
if v.DeliveryFee > maxFee {
v.DeliveryFee = maxFee
}
}
newPrice = maxFee
}
expend, lastFee, _ := partner.CurStoreAcctManager.GetStoreAcctExpendLastCreateWayBillFee(order.VendorOrderID)
if int(newPrice) > lastFee {
partner.CurStoreAcctManager.InsertStoreAcctExpendAndUpdateStoreAcctBalance(ctx, jxutils.GetSaleStoreIDFromOrder(order), int(newPrice)-lastFee, partner.StoreAcctTypeExpendCreateWaybill2ndMore, order.VendorOrderID, expend.ID)
}
} else {
if len(courierVendorIDs) == 1 {
courierVendorID := courierVendorIDs[0]
if _, ok := deliveryFeeMap[courierVendorID]; ok {
partner.CurStoreAcctManager.InsertStoreAcctExpendAndUpdateStoreAcctBalance(ctx, jxutils.GetSaleStoreIDFromOrder(order), int(deliveryFeeMap[courierVendorID].DeliveryFee), partner.StoreAcctTypeExpendCreateWaybillEx, order.VendorOrderID, 0)
}
} else if len(courierVendorIDs) == 0 {
var maxFee int64
for _, v := range deliveryFeeMap {
if v.DeliveryFee > maxFee {
v.DeliveryFee = maxFee
}
}
partner.CurStoreAcctManager.InsertStoreAcctExpendAndUpdateStoreAcctBalance(ctx, jxutils.GetSaleStoreIDFromOrder(order), int(maxFee), partner.StoreAcctTypeExpendCreateWaybillEx, order.VendorOrderID, 0)
}
}
}
globals.SugarLogger.Debugf("CreateWaybillOnProviders4SavedOrder orderID:%s userName:%s successfully", order.VendorOrderID, ctx.GetUserName())
return bills, err
}
@@ -138,7 +184,15 @@ func (s *DefScheduler) CreateWaybillOnProviders4SavedOrder(ctx *jxcontext.Contex
return nil, err
}
func (s *DefScheduler) CreateWaybillOnProvidersEx(ctx *jxcontext.Context, vendorOrderID string, vendorID int, courierVendorIDs []int, forceCreate bool, maxDeliveryFee int64) (bills []*model.Waybill, err error) {
func (s *DefScheduler) CreateWaybillOnProvidersEx(ctx *jxcontext.Context, vendorOrderID string, vendorID int, courierVendorIDs []int, forceCreate bool, maxDeliveryFee int64) (bills []*model.Waybill, errCode string, err error) {
savedOrderInfo := s.loadSavedOrderByID(vendorOrderID, vendorID, true)
if savedOrderInfo != nil {
order := savedOrderInfo.order
//1表示为门店发单需要验证门店账户余额情况
if errCode, err = s.CheckStoreBalance(ctx, order, courierVendorIDs); err != nil {
return nil, errCode, err
}
}
jxutils.CallMsgHandler(func() {
bills, err = func() (bills []*model.Waybill, err error) {
userName := ctx.GetUserName()
@@ -156,6 +210,12 @@ func (s *DefScheduler) CreateWaybillOnProvidersEx(ctx *jxcontext.Context, vendor
err = s.isPossibleSwitch2SelfDelivery(order)
}
if err == nil {
if savedOrderInfo.order.VendorID == model.VendorIDEBAI {
courierVendorIDs = []int{model.VendorIDMTPS, model.VendorIDDada}
}
order := savedOrderInfo.order
order.DeliveryFlag = 0
err = partner.CurOrderManager.UpdateOrderStatusAndDeliveryFlag(order)
if bills, err = s.CreateWaybillOnProviders4SavedOrder(ctx, savedOrderInfo, courierVendorIDs, nil, forceCreate, maxDeliveryFee); err == nil && len(bills) > 0 {
partner.CurOrderManager.OnOrderMsg(order, "手动创建运单成功", fmt.Sprintf("%s创建%s平台运单,强发:%t,最高限价:%d", ctx.GetUserName(), model.VendorChineseNames[bills[0].WaybillVendorID], forceCreate, maxDeliveryFee))
}
@@ -167,7 +227,75 @@ func (s *DefScheduler) CreateWaybillOnProvidersEx(ctx *jxcontext.Context, vendor
return bills, err
}()
}, jxutils.ComposeUniversalOrderID(vendorOrderID, vendorID))
return bills, err
return bills, errCode, err
}
func (s *DefScheduler) CheckStoreBalance(ctx *jxcontext.Context, order *model.GoodsOrder, courierVendorIDs []int) (errCode string, err error) {
if order.CreateDeliveryType == model.YES {
//暂时这么认为len courierVendorIDs 为1表示是老板或者运营从小程序上点的立即发单因为小程序上是点哪个发哪个
//京西后台则是点一下发3个len courierVendorIDs 是0
//如果是小程序上点哪个扣哪个平台的钱
//如果是后台,则选最高的那个扣
storeAcct, err := cms.GetStoreAcctBalance(ctx, jxutils.GetSaleStoreIDFromOrder(order))
deliveryFeeMap, _ := s.QueryOrderWaybillFeeInfoEx(ctx, order.VendorOrderID, order.VendorID)
if err != nil {
return errCode, fmt.Errorf("获取账户余额失败!")
}
//1、先判断是不是第一次发查询库里是否有这个订单的运费支出记录再查询是否有相同金额并且类型为回退的收入记录取消运单退回
//前者有,后者无, 表示已经发过了,暂未取消,若这这次的发单金额小于上次的金额则不进行判断也不多扣钱,若大于则扣除‘这次金额-上次金额’的钱,余额不足问题也根据这个判断
//前者有,后者有,表示发过并且取消过了,是多次发,直接扣
//前者无,表示就是第一次发,直接扣
//2、小程序里这次金额用发单平台的金额后台里这次金额用所有平台最高费用
isEqual, isZero, err := partner.CurStoreAcctManager.CheckStoreAcctExpendExist(order.VendorOrderID)
globals.SugarLogger.Debugf("CheckStoreBalance orderID :%v, isEqual : %v, isZero: %v", order.VendorOrderID, isEqual, isZero)
//表示前者有,后者无
if !isZero && !isEqual {
var newPrice int64
if len(courierVendorIDs) == 1 {
courierVendorID := courierVendorIDs[0]
if _, ok := deliveryFeeMap[courierVendorID]; ok {
newPrice = deliveryFeeMap[courierVendorID].DeliveryFee
}
} else if len(courierVendorIDs) == 0 {
var maxFee int64
for _, v := range deliveryFeeMap {
if v.DeliveryFee > maxFee {
v.DeliveryFee = maxFee
}
}
newPrice = maxFee
}
_, lastFee, _ := partner.CurStoreAcctManager.GetStoreAcctExpendLastCreateWayBillFee(order.VendorOrderID)
if int(newPrice) > lastFee {
if storeAcct.AccountBalance < int(newPrice)-lastFee {
return model.ErrCodeAccountBalanceNotEnough, fmt.Errorf("门店账户余额小于[%v]元,不能发配送!", jxutils.IntPrice2Standard(newPrice-int64(lastFee)))
}
}
} else {
if storeAcct.AccountBalance < partner.MinCreateWaybillBalance {
return model.ErrCodeAccountBalanceNotEnough, fmt.Errorf("门店账户余额小于[%v]元,不能发配送!", jxutils.IntPrice2Standard(partner.MinCreateWaybillBalance))
}
if len(courierVendorIDs) == 1 {
courierVendorID := courierVendorIDs[0]
if _, ok := deliveryFeeMap[courierVendorID]; ok {
if deliveryFeeMap[courierVendorID].DeliveryFee > int64(storeAcct.AccountBalance) {
return model.ErrCodeAccountBalanceNotEnough, fmt.Errorf("门店账户余额小于[%v]元,不能发配送!", jxutils.IntPrice2Standard(deliveryFeeMap[courierVendorID].DeliveryFee))
}
}
} else if len(courierVendorIDs) == 0 {
var maxFee int64
for _, v := range deliveryFeeMap {
if v.DeliveryFee > maxFee {
v.DeliveryFee = maxFee
}
}
if maxFee > int64(storeAcct.AccountBalance) {
return model.ErrCodeAccountBalanceNotEnough, fmt.Errorf("门店账户余额小于[%v]元,不能发配送!", jxutils.IntPrice2Standard(maxFee))
}
}
}
}
return errCode, err
}
// todo 这个函数可以和SelfDeliveringAndUpdateStatus合并

View File

@@ -35,7 +35,7 @@ var (
type IScheduler interface {
// 以下是订单
OnOrderNew(order *model.GoodsOrder, isPending bool) (err error)
OnOrderNew(order *model.GoodsOrder, isPending bool, isAuto bool) (err error)
OnOrderStatusChanged(order *model.GoodsOrder, status *model.OrderStatus, isPending bool) (err error)
// 以下是运单

View File

@@ -2,12 +2,27 @@ package act
import (
"fmt"
"git.rosy.net.cn/baseapi/platformapi/mtwmapi"
"git.rosy.net.cn/jx-callback/business/partner/purchase/mtwm"
"math"
"sync"
"time"
"git.rosy.net.cn/jx-callback/business/authz"
"git.rosy.net.cn/jx-callback/business/jxutils/ddmsg"
// "github.com/astaxie/beego/adapter/plugins/authz"
"git.rosy.net.cn/jx-callback/business/authz/autils"
"git.rosy.net.cn/jx-callback/business/partner/purchase/ebai"
"git.rosy.net.cn/jx-callback/globals/api"
"git.rosy.net.cn/baseapi/platformapi/dingdingapi"
"git.rosy.net.cn/baseapi/utils"
"git.rosy.net.cn/baseapi/utils/errlist"
"git.rosy.net.cn/jx-callback/business/jxstore/cms"
"git.rosy.net.cn/jx-callback/business/jxstore/permission"
"git.rosy.net.cn/jx-callback/business/jxutils"
"git.rosy.net.cn/jx-callback/business/partner"
"git.rosy.net.cn/jx-callback/globals"
@@ -219,7 +234,7 @@ func ActStoreSkuParam2Model(ctx *jxcontext.Context, db *dao.DaoDB, act *model.Ac
validVendorMap := make(map[int]int)
validSkuMap := make(map[int]int)
for _, vendorID := range vendorIDs {
storeDetail, err2 := dao.GetStoreDetail(db, storeID, vendorID)
storeDetail, err2 := dao.GetStoreDetail(db, storeID, vendorID, "")
if err = err2; err == nil {
if storeDetail.IsSync != 0 {
if act.Type == model.ActSkuFake ||
@@ -305,10 +320,10 @@ func ActStoreSkuParam2Model(ctx *jxcontext.Context, db *dao.DaoDB, act *model.Ac
}
func addActStoreSkuBind(ctx *jxcontext.Context, db *dao.DaoDB, actStoreSkuList []*model.ActStoreSku, actStoreSkuMapList []*model.ActStoreSkuMap) (err error) {
dao.Begin(db)
txDB, _ := dao.Begin(db)
defer func() {
if r := recover(); r != nil {
dao.Rollback(db)
dao.Rollback(db, txDB)
panic(r)
}
}()
@@ -320,7 +335,7 @@ func addActStoreSkuBind(ctx *jxcontext.Context, db *dao.DaoDB, actStoreSkuList [
}
err = dao.CreateEntity(db, v)
if err != nil {
dao.Rollback(db)
dao.Rollback(db, txDB)
return err
}
storeSkuMap[jxutils.Combine2Int(v.StoreID, v.SkuID)] = v.ID
@@ -332,11 +347,11 @@ func addActStoreSkuBind(ctx *jxcontext.Context, db *dao.DaoDB, actStoreSkuList [
if len(actStoreSkuMapList) > 0 {
err = dao.CreateMultiEntities(db, actStoreSkuMapList)
if err != nil {
dao.Rollback(db)
dao.Rollback(db, txDB)
return err
}
}
dao.Commit(db)
dao.Commit(db, txDB)
return err
}
@@ -383,10 +398,10 @@ func AddActStoreSkuBind(ctx *jxcontext.Context, db *dao.DaoDB, actID int, actSto
if err != nil {
return err
}
dao.Begin(db)
txDB, _ := dao.Begin(db)
defer func() {
if r := recover(); r != nil || err != nil {
dao.Rollback(db)
dao.Rollback(db, txDB)
if r != nil {
panic(r)
}
@@ -407,7 +422,7 @@ func AddActStoreSkuBind(ctx *jxcontext.Context, db *dao.DaoDB, actID int, actSto
}
}
}
dao.Commit(db)
dao.Commit(db, txDB)
return err
}
@@ -447,10 +462,10 @@ func checkActValidation(act *model.Act, vendorIDs []int) (err error) {
} else if act.EndAt.Sub(act.BeginAt) < 0 {
errList.AddErr(fmt.Errorf("活动开始时间必须小于活动结束时间"))
}
vendorIDMap := make(map[int]int)
for _, vendorID := range vendorIDs {
vendorIDMap[vendorID] = 1
}
// vendorIDMap := make(map[int]int)
// for _, vendorID := range vendorIDs {
// vendorIDMap[vendorID] = 1
// }
if act.Type == model.ActSkuDirectDown || act.Type == model.ActSkuSecKill {
if act.PricePercentage == 0 {
@@ -526,6 +541,19 @@ func PreCreateAct(ctx *jxcontext.Context, act *model.Act, vendorIDs []int, actRu
}
func CreateAct(ctx *jxcontext.Context, act *model.Act, vendorIDs []int, vendorOrgCode string, actRules []*ActOrderRuleParam, actStoreSku []*ActStoreSkuParam, isAsync bool) (hint string, err error) {
//权限
if permission.IsRoled(ctx) {
if storeIDsMap, err := permission.GetUserStoresResultMap(ctx.GetUserID()); err == nil {
var actStoreSku2 []*ActStoreSkuParam
for _, v := range actStoreSku {
if storeIDsMap[v.StoreID] != 0 {
actStoreSku2 = append(actStoreSku2, v)
}
}
actStoreSku = nil
actStoreSku = actStoreSku2
}
}
if err = checkActValidation(act, vendorIDs); err != nil {
return "", err
}
@@ -540,37 +568,37 @@ func CreateAct(ctx *jxcontext.Context, act *model.Act, vendorIDs []int, vendorOr
// TODO
// 事务应该从ActStoreSkuParam2Model之后开始
// 创建Act也应该往后放
dao.Begin(db)
txDB, _ := dao.Begin(db)
defer func() {
if r := recover(); r != nil {
dao.Rollback(db)
dao.Rollback(db, txDB)
panic(r)
}
}()
dao.WrapAddIDCULDEntity(act, ctx.GetUserName())
err = dao.CreateEntity(db, act)
err = dao.CreateEntityTx(txDB, act)
if err != nil {
dao.Rollback(db)
dao.Rollback(db, txDB)
return "", err
}
validVendorIDs, actStoreSkuList, actStoreSkuMapList, conflictActStoreSku, err := ActStoreSkuParam2Model(ctx, db, act, vendorIDs, actStoreSku)
if err != nil {
dao.Rollback(db)
dao.Rollback(db, txDB)
return "", err
}
if len(validVendorIDs) == 0 {
dao.Rollback(db)
dao.Rollback(db, txDB)
return "", fmt.Errorf("没有一个合法平台可以创建活动")
}
var neeSyncActIDs []int
if len(conflictActStoreSku) > 0 {
if act.OverlapRule == model.OverlapRuleNormal {
dao.Rollback(db)
dao.Rollback(db, txDB)
return "", jsonerr.New(conflictActStoreSku, model.ErrCodeJsonActSkuConflict)
}
if neeSyncActIDs, err = DeleteActStoreSkuList(ctx, db, conflictActStoreSku); err != nil {
dao.Rollback(db)
dao.Rollback(db, txDB)
return "", err
}
}
@@ -590,15 +618,15 @@ func CreateAct(ctx *jxcontext.Context, act *model.Act, vendorIDs []int, vendorOr
}
err = dao.CreateMultiEntities(db, actMapList)
if err != nil {
dao.Rollback(db)
dao.Rollback(db, txDB)
return "", err
}
if err = addActStoreSkuBind(ctx, db, actStoreSkuList, actStoreSkuMapList); err != nil {
dao.Rollback(db)
dao.Rollback(db, txDB)
return "", err
}
dao.Commit(db)
dao.Commit(db, txDB)
neeSyncActIDs = append(neeSyncActIDs, act.ID)
task := tasksch.NewParallelTask(fmt.Sprintf("处理活动创建%d", act.ID), tasksch.NewParallelConfig().SetParallelCount(1).SetIsContinueWhenError(true), ctx,
@@ -618,6 +646,156 @@ func CreateAct(ctx *jxcontext.Context, act *model.Act, vendorIDs []int, vendorOr
return hint, err
}
func CreateActForMtByOrder(ctx *jxcontext.Context, act *model.Act, vendorIDs []int, vendorOrgCode string, actStoreSku []*ActStoreSkuParam) (err error) {
var (
db = dao.GetDB()
actStoreSkuMap = make(map[int][]*model.StoreSkuBind)
err2 = ""
vendorID int
)
if len(vendorIDs) > 1 {
return fmt.Errorf("只允许单平台创建!")
}
vendorID = vendorIDs[0]
if vendorID != model.VendorIDMTWM {
return fmt.Errorf("此接口只支持美团使用!")
}
if act.Type != model.ActSkuDirectDown {
return fmt.Errorf("此接口只支持创建直降!")
}
setActDefault(act)
//处理actStoreSku
//参数有可能传多个店多个商品先分好组map = [门店ID1][]{商品ID1,商品ID2},[门店ID2][]{商品ID1,商品ID3,商品ID4}
for _, v := range actStoreSku {
if resultList, _ := dao.GetStoresSkusInfo(db, []int{v.StoreID}, []int{v.SkuID}); len(resultList) > 0 {
var actPrice int64
if v.ActPrice != 0 {
actPrice = v.ActPrice
} else {
actPrice = int64(math.Floor(float64(resultList[0].MtwmPrice*act.PricePercentage/100)/10) * 10)
}
actStoreSkuMap[v.StoreID] = append(actStoreSkuMap[v.StoreID], &model.StoreSkuBind{
SkuID: v.SkuID,
MtwmPrice: resultList[0].MtwmPrice,
Price: resultList[0].Price,
JdsPrice: int(actPrice), //暂时把这个jdsprice当成实际活动价
})
}
}
//根据平台价排序
for _, storeSkus := range actStoreSkuMap {
for i := 0; i < len(storeSkus)-1; i++ {
for j := 0; j < len(storeSkus)-i-1; j++ {
if storeSkus[j].JdsPrice < storeSkus[j+1].JdsPrice {
temp := storeSkus[j]
storeSkus[j] = storeSkus[j+1]
storeSkus[j+1] = temp
}
}
}
}
txDB, _ := dao.Begin(db)
defer func() {
if r := recover(); r != nil {
dao.Rollback(db, txDB)
panic(r)
}
}()
dao.WrapAddIDCULDEntity(act, ctx.GetUserName())
err = dao.CreateEntityTx(txDB, act)
if err != nil {
dao.Rollback(db, txDB)
return err
}
actMap := &model.ActMap{
ActID: act.ID,
VendorID: vendorID,
VendorOrgCode: vendorOrgCode,
}
dao.WrapAddIDCULDEntity(actMap, ctx.GetUserName())
err = dao.CreateEntityTx(txDB, actMap)
if err != nil {
dao.Rollback(db, txDB)
return err
}
for storeID, storeSkus := range actStoreSkuMap {
for _, storeSku := range storeSkus {
actStoreSkuModel := &model.ActStoreSku{
ActID: act.ID,
OriginalPrice: int64(storeSku.Price),
StoreID: storeID,
SkuID: storeSku.SkuID,
Stock: 200,
ActPrice: int64(storeSku.JdsPrice),
}
dao.WrapAddIDCULDEntity(actStoreSkuModel, ctx.GetUserName())
err = dao.CreateEntityTx(txDB, actStoreSkuModel)
if err != nil {
dao.Rollback(db, txDB)
return err
}
actStoreSkuMapModel := &model.ActStoreSkuMap{
ActID: act.ID,
BindID: actStoreSkuModel.ID,
StoreID: storeID,
SkuID: storeSku.SkuID,
VendorID: vendorID,
VendorPrice: int64(storeSku.MtwmPrice),
ActualActPrice: int64(storeSku.JdsPrice),
}
dao.WrapAddIDCULDEntity(actStoreSkuMapModel, ctx.GetUserName())
err = dao.CreateEntityTx(txDB, actStoreSkuMapModel)
if err != nil {
dao.Rollback(db, txDB)
return err
}
}
}
dao.Commit(db, txDB)
if !globals.IsProductEnv() {
return err
}
//同步建到美团
for storeID, storeSkus := range actStoreSkuMap {
if storeDetail, _ := dao.GetStoreDetail(db, storeID, vendorID, vendorOrgCode); storeDetail != nil {
var actData []*mtwmapi.RetailDiscountActData
for _, v := range storeSkus {
actData = append(actData, &mtwmapi.RetailDiscountActData{
AppFoodCode: utils.Int2Str(v.SkuID),
StartTime: act.BeginAt.Unix(),
EndTime: act.EndAt.Unix(),
OrderLimit: 1,
DayLimit: -1,
SettingType: mtwmapi.SettingTypeAsPrice,
//DiscountCoefficient: float64(act.PricePercentage) / float64(10),
ActPrice: jxutils.IntPrice2Standard(int64(v.JdsPrice)),
})
}
actResult, faileInfoList, _ := api.MtwmAPI.RetailDiscountBatchSave2(storeDetail.VendorStoreID, mtwmapi.RetailActTypeDirectDown, actData)
for _, v := range actResult {
var (
actStoreSkuMapUpdate *model.ActStoreSkuMap
)
sql := `
SELECT * FROM act_store_sku_map WHERE act_id = ? AND store_id = ? AND sku_id = ?
`
sqlParams := []interface{}{act.ID, storeID, utils.Str2Int(v.AppFoodCode)}
if err = dao.GetRow(db, &actStoreSkuMapUpdate, sql, sqlParams); err == nil && actStoreSkuMapUpdate != nil {
actStoreSkuMapUpdate.VendorActID = utils.Int64ToStr(v.ActID)
dao.UpdateEntity(db, actStoreSkuMapUpdate, "VendorActID")
}
}
for _, v := range faileInfoList {
err2 += fmt.Sprintf("创建失败门店ID[%v]商品ID[%v],原因:[%v]", storeID, v.AppFoodCode, v.ErrorMsg)
}
}
}
if err2 != "" {
return fmt.Errorf(err2)
}
return err
}
func vendorActInfo2Model(ctx *jxcontext.Context, db *dao.DaoDB, act2 *model.Act2, actStoreSku []*model.ActStoreSku2) (actStoreSkuList []*model.ActStoreSku, actStoreSkuMapList []*model.ActStoreSkuMap, err error) {
vendorStoreIDMap := make(map[string]int)
vendorSkuIDMap := make(map[string]int)
@@ -697,10 +875,10 @@ func createActFromVendor(ctx *jxcontext.Context, db *dao.DaoDB, act2 *model.Act2
err = nil
}
dao.Begin(db)
txDB, _ := dao.Begin(db)
defer func() {
if r := recover(); r != nil {
dao.Rollback(db)
dao.Rollback(db, txDB)
panic(r)
}
}()
@@ -709,26 +887,26 @@ func createActFromVendor(ctx *jxcontext.Context, db *dao.DaoDB, act2 *model.Act2
dao.WrapAddIDCULDEntity(act, ctx.GetUserName())
err = dao.CreateEntity(db, act)
if err != nil {
dao.Rollback(db)
dao.Rollback(db, txDB)
return 0, err
}
actMap.ActID = act.ID
err = dao.CreateEntity(db, actMap)
if err != nil {
dao.Rollback(db)
dao.Rollback(db, txDB)
return 0, err
}
actStoreSkuList, actStoreSkuMapList, err := vendorActInfo2Model(ctx, db, act2, actStoreSku)
if err != nil {
dao.Rollback(db)
dao.Rollback(db, txDB)
return 0, err
}
if err = addActStoreSkuBind(ctx, db, actStoreSkuList, actStoreSkuMapList); err != nil {
dao.Rollback(db)
dao.Rollback(db, txDB)
return 0, err
}
dao.Commit(db)
dao.Commit(db, txDB)
return act.ID, nil
}
@@ -781,6 +959,16 @@ func CancelAct(ctx *jxcontext.Context, actID int) (err error) {
return err
}
_, err = SyncAct(ctx, nil, actID, nil, false)
act := &model.Act{}
act.ID = actID
if err == nil {
if _, err = dao.UpdateEntityLogically(db, act,
map[string]interface{}{
model.FieldStatus: model.ActStatusCanceled,
}, ctx.GetUserName(), nil); err != nil {
return err
}
}
return err
}
@@ -794,6 +982,20 @@ func DeleteActStoreSkuBind(ctx *jxcontext.Context, db *dao.DaoDB, actID int, act
return 0, err
}
//if len(actMap) == 0 {
//
// return 0, fmt.Errorf("活动%d不存在或已被取消", actID)
//}
//errList := errlist.New()
//for vendorID, act := range actMap {
// if vendorID == model.VendorIDEBAI && act.CreateType != model.ActCreateTypeAPI {
// errList.AddErr(fmt.Errorf("饿百平台不支持修改或取消网页活动"))
// }
//}
//if errList.GetErrListAsOne() != nil {
// return 0, errList.GetErrListAsOne()
//}
actStoreSkuMap, err := dao.GetActStoreSkuVendorInfo(db, actID, nil, nil, nil)
if err != nil {
return 0, err
@@ -803,10 +1005,10 @@ func DeleteActStoreSkuBind(ctx *jxcontext.Context, db *dao.DaoDB, actID int, act
return 0, fmt.Errorf("当前活动状态:%s不能进行此操作或已过期", model.ActStatusName[act.Status])
}
dao.Begin(db)
txDB, _ := dao.Begin(db)
defer func() {
if r := recover(); r != nil || err != nil {
dao.Rollback(db)
dao.Rollback(db, txDB)
if r != nil {
panic(r)
}
@@ -824,7 +1026,6 @@ func DeleteActStoreSkuBind(ctx *jxcontext.Context, db *dao.DaoDB, actID int, act
return 0, err
}
}
isNeedCancelAct := true
for vendorID, act := range actMap {
originSyncStatus |= act.SyncStatus
@@ -883,16 +1084,18 @@ func DeleteActStoreSkuBind(ctx *jxcontext.Context, db *dao.DaoDB, actID int, act
}
if isNeedCancelAct {
act := &model.Act{}
act.ID = actID
if _, err = dao.UpdateEntityLogically(db, act,
map[string]interface{}{
model.FieldStatus: model.ActStatusCanceled,
}, ctx.GetUserName(), nil); err != nil {
return 0, err
}
// act := &model.Act{}
// act.ID = actID
// if err == nil {
// if _, err = dao.UpdateEntityLogically(db, act,
// map[string]interface{}{
// model.FieldStatus: model.ActStatusCanceled,
// }, ctx.GetUserName(), nil); err != nil {
// return 0, err
// }
// }
}
dao.Commit(db)
dao.Commit(db, txDB)
return originSyncStatus, err
}
@@ -1032,10 +1235,10 @@ func RefreshPageActs(ctx *jxcontext.Context, vendorIDs []int, createdFrom time.T
needAddActSkuMap[actStoreSku.VendorActID] = append(needAddActSkuMap[actStoreSku.VendorActID], actStoreSku)
}
dao.Begin(db)
txDB, _ := dao.Begin(db)
defer func() {
if r := recover(); r != nil || err != nil {
dao.Rollback(db)
dao.Rollback(db, txDB)
if r != nil {
panic(r)
}
@@ -1054,7 +1257,7 @@ func RefreshPageActs(ctx *jxcontext.Context, vendorIDs []int, createdFrom time.T
// return nil, err
// }
// }
dao.Commit(db)
dao.Commit(db, txDB)
}
return retVal, err
}, vendorIDs)
@@ -1231,7 +1434,7 @@ func ForceUpdateVendorPrice(ctx *jxcontext.Context, vendorID int, actType int, s
for _, storeSkuBind := range storeSkuBindList {
if _, err2 := dao.UpdateEntity(db, storeSkuBind); err2 == nil {
if storeVendorIDMap[storeSkuBind.StoreID] == "" {
if storeDetail, err2 := dao.GetStoreDetail(db, storeSkuBind.StoreID, vendorID); err2 == nil {
if storeDetail, err2 := dao.GetStoreDetail(db, storeSkuBind.StoreID, vendorID, ""); err2 == nil {
storeVendorIDMap[storeSkuBind.StoreID] = storeDetail.VendorStoreID
}
}
@@ -1249,7 +1452,7 @@ func ForceUpdateVendorPrice(ctx *jxcontext.Context, vendorID int, actType int, s
subTask := tasksch.NewParallelTask("同步平台价格", tasksch.NewParallelConfig().SetIsContinueWhenError(true), ctx,
func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) {
storeID := batchItemList[0].(int)
_, err = cms.SyncStoreSkuNew2(ctx, task, 0 /*model.SyncFlagPriceMask*/, vendorID, storeID, storeVendorIDMap[storeID], nil, storeSkuIDMap[storeID], nil, true, false, true)
_, err = cms.SyncStoreSkuNew2(ctx, task, 0 /*model.SyncFlagPriceMask*/, vendorID, storeID, storeVendorIDMap[storeID], "", nil, storeSkuIDMap[storeID], nil, true, false, true)
return retVal, err
}, storeIDs)
tasksch.HandleTask(subTask, task, true).Run()
@@ -1271,10 +1474,10 @@ func ForceUpdateVendorPrice(ctx *jxcontext.Context, vendorID int, actType int, s
}
func SyncActStoreSku2StoreSkuAct(ctx *jxcontext.Context, db *dao.DaoDB, parentTask tasksch.ITask, act *model.Act2) (err error) {
dao.Begin(db)
txDB, _ := dao.Begin(db)
defer func() {
if r := recover(); r != nil || err != nil {
dao.Rollback(db)
dao.Rollback(db, txDB)
if r != nil {
panic(r)
}
@@ -1355,7 +1558,7 @@ func SyncActStoreSku2StoreSkuAct(ctx *jxcontext.Context, db *dao.DaoDB, parentTa
return err
}
dao.Commit(db)
dao.Commit(db, txDB)
return err
}
@@ -1552,10 +1755,10 @@ func ChangeJxPriceByDiscountAct(ctx *jxcontext.Context) {
continue
}
actualStockOut, err = dao.GetOrderStoreSkusCount(db, actStoreSkuMap.StoreID, actStoreSkuMap.SkuID, time.Now().Add(-time.Minute*10), time.Now())
dao.Begin(db)
txDB, _ := dao.Begin(db)
defer func() {
if r := recover(); r != nil || err != nil {
dao.Rollback(db)
dao.Rollback(db, txDB)
if r != nil {
panic(r)
}
@@ -1584,7 +1787,7 @@ func ChangeJxPriceByDiscountAct(ctx *jxcontext.Context) {
if stock != -1 {
storeSku.Stock = stock
if _, err = dao.UpdateEntity(db, storeSku, "Stock"); err != nil {
dao.Rollback(db)
dao.Rollback(db, txDB)
}
}
}
@@ -1592,7 +1795,7 @@ func ChangeJxPriceByDiscountAct(ctx *jxcontext.Context) {
actStoreSkuMap.ActualActPrice = actStoreSkuMap.VendorPrice
}
// if _, err = dao.UpdateEntity(db, actStoreSkuMap, "ActualActPrice"); err != nil {
// dao.Rollback(db)
// dao.Rollback(db, txDB)
// }
//C >= 2N 涨价趋势,最高涨价到无折扣
if actualStockOut >= 2*shouldStockOut {
@@ -1610,7 +1813,7 @@ func ChangeJxPriceByDiscountAct(ctx *jxcontext.Context) {
}
actStoreSkuMap.TrendPrice = int(actualPrice)
if _, err = dao.UpdateEntity(db, actStoreSkuMap, "ActualActPrice", "TrendType", "TrendPrice"); err != nil {
dao.Rollback(db)
dao.Rollback(db, txDB)
}
} else { //第二档时间内
pricePercentage = 0.1
@@ -1628,7 +1831,7 @@ func ChangeJxPriceByDiscountAct(ctx *jxcontext.Context) {
}
actStoreSkuMap.TrendPrice = int(actualPrice)
// if _, err = dao.UpdateEntity(db, actStoreSkuMap, "TrendType", "TrendPrcie"); err != nil {
// dao.Rollback(db)
// dao.Rollback(db, txDB)
// }
actStoreSkuMap.ActualActPrice = actStoreSkuMap.ActualActPrice - actualPrice
if actStoreSkuMap.ActualActPrice <= minJxPrice {
@@ -1638,24 +1841,24 @@ func ChangeJxPriceByDiscountAct(ctx *jxcontext.Context) {
if stock != -1 {
storeSku.Stock = stock
if _, err = dao.UpdateEntity(db, storeSku, "Stock"); err != nil {
dao.Rollback(db)
dao.Rollback(db, txDB)
}
}
//22:00 恢复库存为100,价格恢复原价
if time.Now().Hour() == 22 && time.Now().Minute() < 1 {
storeSku.Stock = 100
if _, err = dao.UpdateEntity(db, storeSku, "Stock"); err != nil {
dao.Rollback(db)
dao.Rollback(db, txDB)
}
actStoreSkuMap.ActualActPrice = actStoreSkuMap.VendorPrice
actStoreSkuMap.TrendType = model.TrendTypeNothing
actStoreSkuMap.TrendPrice = 0
}
if _, err = dao.UpdateEntity(db, actStoreSkuMap, "ActualActPrice", "TrendType", "TrendPrice"); err != nil {
dao.Rollback(db)
dao.Rollback(db, txDB)
}
}
dao.Commit(db)
dao.Commit(db, txDB)
}
}
}
@@ -1683,4 +1886,230 @@ func checkPriceDefendOrderByPrice(db *dao.DaoDB, storeID, skuID, stock, jxPrice
return stock
}
func GetVendorPopActs(ctx *jxcontext.Context, vendorID, storeID int) (result interface{}, err error) {
if vendorID == model.VendorIDEBAI {
result, err = api.EbaiAPI.GetMainActivityList(utils.Str2Int(ebai.EbaiSupplierIDhc))
} else if vendorID == model.VendorIDMTWM {
if storeID == 0 {
return nil, fmt.Errorf("要选门店才能查美团的活动")
}
store, _ := dao.GetStoreDetail(dao.GetDB(), storeID, vendorID, "")
result, err = api.MtwmAPI.GetCenterList(store.VendorStoreID)
} else {
return nil, fmt.Errorf("暂不支持此平台")
}
return result, err
}
func GetVendorPopActDetail(ctx *jxcontext.Context, vendorID, storeID, actID int) (result interface{}, err error) {
if vendorID == model.VendorIDEBAI {
results, err2 := api.EbaiAPI.GetMainActivityDetail(actID)
err = err2
for _, v := range results {
results2, _ := api.EbaiAPI.GetSubActivityDetail(int(v.ID))
v.GetSubActivityDetailResult = results2
}
result = results
} else if vendorID == model.VendorIDMTWM {
if storeID == 0 {
return nil, fmt.Errorf("要选门店才能查美团的活动")
}
store, _ := dao.GetStoreDetail(dao.GetDB(), storeID, vendorID, "")
result, err = api.MtwmAPI.GetInviteDetail(actID, store.VendorStoreID)
} else {
return nil, fmt.Errorf("暂不支持此平台")
}
return result, err
}
func GetNewVendorPopActs(ctx *jxcontext.Context) (err error) {
var (
db = dao.GetDB()
)
actList, err := api.EbaiAPI.GetMainActivityList(utils.Str2Int(ebai.EbaiSupplierIDhc))
if err != nil {
return err
}
send := func(vendorID int, name1, name2 string) {
var (
roleList []*authz.RoleInfo
opName = ""
userIDs []string
)
if vendorID == model.VendorIDEBAI {
opName = "lirongwei"
} else {
opName = "xiaoqiu"
}
roleList = append(roleList, autils.NewRole(opName, 0))
if userIDMap, err := cms.GetRolesUserList(jxcontext.AdminCtx, roleList); err == nil {
for _, v := range userIDMap {
for _, vv := range v {
userIDs = append(userIDs, vv)
}
}
}
for _, v := range userIDs {
ddmsg.SendUserMessage(dingdingapi.MsgTyeText, v, model.VendorNames[vendorID]+"有新平台流量活动了!", model.VendorNames[vendorID]+"有未报名的平台流量活动,请查看!活动名:"+name1+"->"+name2)
}
}
for _, v := range actList {
results, _ := api.EbaiAPI.GetMainActivityDetail(int(v.ActivityID))
for _, vv := range results {
//local, _ := time.LoadLocation("Local")
//t, _ := time.ParseInLocation("2006-01-02 15:04:05", vv.SigninEndTime, local)
//if time.Now().Sub(t) < 0 {
result, _ := api.EbaiAPI.GetSubActivityDetail(int(vv.ID))
if result.Status.Value == "NO_SIGN_UP" {
send(model.VendorIDEBAI, vv.Name, result.Activity.Name)
}
//}
}
}
storeMaps, _ := dao.GetStoresMapList(db, []int{model.VendorIDMTWM}, nil, []int{model.StoreStatusOpened, model.StoreStatusClosed, model.StoreStatusHaveRest}, model.StoreStatusOpened, model.YES, "", "", "")
for _, v := range storeMaps {
cList, _ := api.MtwmAPI.GetCenterList(v.VendorStoreID)
for _, vv := range cList {
if vv != nil {
result, _ := api.MtwmAPI.GetInviteDetail(vv.ID, v.VendorStoreID)
if result != nil {
if result.Status != 2 {
send(model.VendorIDMTWM, vv.Name, result.BriefIntroduction)
}
}
}
}
}
return err
}
func RrefreshMtwmVendorAct() (err error) {
var (
db = dao.GetDB()
actTypeMap = map[int]int{
mtwmapi.RetailActTypeSecKill: model.ActSkuSecKill,
mtwmapi.RetailActTypeDirectDown: model.ActSkuDirectDown,
}
)
//直接做删除,把新的加进来
dao.ExecuteSQL(db, `TRUNCATE act_mtwm_vendor`)
storeMaps, _ := dao.GetStoresMapList(db, []int{model.VendorIDMTWM}, nil, []int{model.StoreStatusOpened, model.StoreStatusHaveRest, model.StoreStatusClosed},
model.StoreStatusAll, model.StoreIsSyncAll, "", "", "")
task := tasksch.NewParallelTask("刷新美团活动", tasksch.NewParallelConfig().SetParallelCount(1).SetIsContinueWhenError(true), jxcontext.AdminCtx,
func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) {
storeMap := batchItemList[0].(*model.StoreMap)
mtapi := mtwm.GetAPI(storeMap.VendorOrgCode, storeMap.StoreID, "")
for k, v := range actTypeMap {
if actList, _ := mtapi.RetailDiscountList(storeMap.VendorStoreID, k); len(actList) > 0 {
for _, act := range actList {
if act.Status > 0 {
actVendor := &model.ActMtwmVendor{
StoreID: storeMap.StoreID,
SkuID: utils.Str2Int(act.AppFoodCode),
VendorStoreID: storeMap.VendorStoreID,
ActType: v,
BeginAt: utils.Timestamp2Time(act.StartTime),
EndAt: utils.Timestamp2Time(act.EndTime),
SkuName: act.Name,
OriginPrice: act.OriginalPrice,
ActPrice: act.ActPrice,
DiscountCoefficient: act.DiscountCoefficient,
Status: act.Status,
ItemID: utils.Int64ToStr(act.ItemID),
OrderLimit: act.OrderLimit,
Period: act.Period,
WeeksTime: act.WeeksTime,
SettingType: act.SettingType,
}
dao.CreateEntity(db, actVendor)
}
}
}
}
return retVal, err
}, storeMaps)
tasksch.HandleTask(task, nil, true).Run()
task.GetID()
return err
}
func RrefreshEbaiVendorAct() (err error) {
var (
db = dao.GetDB()
actMap = struct {
idMap map[int64]int
*sync.RWMutex
}{}
)
actMap.idMap = make(map[int64]int)
actMap.RWMutex = new(sync.RWMutex)
//直接做删除,把新的加进来
dao.ExecuteSQL(db, `TRUNCATE act_ebai_vendor`)
dao.ExecuteSQL(db, `TRUNCATE act_ebai_vendor_sku`)
storeMaps, _ := dao.GetStoresMapList(db, []int{model.VendorIDEBAI}, nil, []int{model.StoreStatusOpened, model.StoreStatusHaveRest, model.StoreStatusClosed},
model.StoreStatusAll, model.StoreIsSyncAll, "", "", "")
task := tasksch.NewParallelTask("刷新饿百活动", tasksch.NewParallelConfig().SetIsContinueWhenError(true), jxcontext.AdminCtx,
func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) {
storeMap := batchItemList[0].(*model.StoreMap)
actIDs, _ := api.EbaiAPI.ActMultiChannelQueryIDs("", utils.Str2Int64(storeMap.VendorStoreID), "2")
for _, v := range actIDs {
if result, err := api.EbaiAPI.ActMultiChannelQueryInfos(utils.Int64ToStr(v), "", utils.Str2Int64(storeMap.VendorStoreID)); err == nil {
if result.Status < 2 {
if actMap.idMap[v] == 0 {
actMap.Lock()
actMap.idMap[v] = 1
actMap.Unlock()
actVendor := &model.ActEbaiVendor{
BeginAt: utils.Timestamp2Time(result.Starttime),
EndAt: utils.Timestamp2Time(result.Endtime),
ActType: model.ActSkuDirectDown,
Status: result.Status,
ActID: utils.Int64ToStr(result.Activityid),
DayLimit: result.Limitruleapi.Userdaycountlimit,
Period: result.Periodsandruleapilist[0].Periods[0].Opentime + "-" + result.Periodsandruleapilist[0].Periods[0].Closetime,
WeeksTime: result.Periodsandruleapilist[0].Periods[0].Weekday,
ActName: result.Activityname,
}
dao.CreateEntity(db, actVendor)
}
for _, sku := range result.Skulist {
actVendorSku := &model.ActEbaiVendorSku{
ActID: utils.Int64ToStr(result.Activityid),
StoreID: storeMap.StoreID,
EbaiID: sku.Skuid,
VendorStoreID: storeMap.VendorStoreID,
SkuName: sku.Upcname,
ActPrice: jxutils.IntPrice2Standard(int64(sku.Periodsandruleapilist[0].Ruleapi.Discount)),
}
var storeSkuBind *model.StoreSkuBind
sql := `
SELECT * FROM store_sku_bind WHERE store_id = ? AND ebai_id = ?
`
sqlParams := []interface{}{storeMap.StoreID, sku.Skuid}
if err = dao.GetRow(db, &storeSkuBind, sql, sqlParams); err == nil && storeSkuBind != nil {
actVendorSku.SkuID = storeSkuBind.SkuID
actVendorSku.OriginPrice = jxutils.IntPrice2Standard(int64(storeSkuBind.Price))
}
dao.CreateEntity(db, actVendorSku)
}
}
}
}
return retVal, err
}, storeMaps)
tasksch.HandleTask(task, nil, true).Run()
task.GetResult(0)
return err
}
func GetActMtwmVendor(ctx *jxcontext.Context, storeIDs, skuIDs []int, keyword, beginAt, endAt string, actType, offset, pageSize int) (page *model.PagedInfo, err error) {
return dao.GetActMtwmVendorPage(dao.GetDB(), storeIDs, skuIDs, keyword, utils.Str2Time(beginAt), utils.Str2Time(endAt), actType, offset, pageSize)
}
func GetActMtwmVendorSku(ctx *jxcontext.Context, storeID int, keyword string, actType, offset, pageSize int) (page *model.PagedInfo, err error) {
return dao.GetActMtwmVendorSkuPage(dao.GetDB(), storeID, keyword, actType, offset, pageSize)
}
func DeleteActStoreSkuVendor(ctx *jxcontext.Context, db *dao.DaoDB, actStoreSkuParam []*ActStoreSkuParam) (err error) {
return fmt.Errorf("暂不支持直接取消平台活动,开发中……")
}

View File

@@ -1,14 +1,11 @@
package act
import (
"testing"
"time"
"git.rosy.net.cn/baseapi/utils"
"git.rosy.net.cn/jx-callback/business/jxutils/jxcontext"
"git.rosy.net.cn/jx-callback/business/model/dao"
"git.rosy.net.cn/jx-callback/globals"
"git.rosy.net.cn/jx-callback/globals/testinit"
"testing"
"git.rosy.net.cn/jx-callback/business/model"
@@ -67,50 +64,50 @@ func TestCreateActOnAlpha(t *testing.T) {
}
func TestCreateActOnDev(t *testing.T) {
actStoreSkuList := []*ActStoreSkuParam{
&ActStoreSkuParam{
ActStoreSku: model.ActStoreSku{
StoreID: 100884,
SkuID: 22716,
},
},
&ActStoreSkuParam{
ActStoreSku: model.ActStoreSku{
StoreID: 100884,
SkuID: 22717,
},
},
&ActStoreSkuParam{
ActStoreSku: model.ActStoreSku{
StoreID: 100920,
SkuID: 22714,
},
},
&ActStoreSkuParam{
ActStoreSku: model.ActStoreSku{
StoreID: 100920,
SkuID: 22715,
},
},
// &ActStoreSkuParam{
// ActStoreSku: model.ActStoreSku{
// StoreID: 100119,
// SkuID: 26595,
// },
// },
}
//actStoreSkuList := []*ActStoreSkuParam{
// &ActStoreSkuParam{
// ActStoreSku: model.ActStoreSku{
// StoreID: 100884,
// SkuID: 22716,
// },
// },
// &ActStoreSkuParam{
// ActStoreSku: model.ActStoreSku{
// StoreID: 100884,
// SkuID: 22717,
// },
// },
// &ActStoreSkuParam{
// ActStoreSku: model.ActStoreSku{
// StoreID: 100920,
// SkuID: 22714,
// },
// },
// &ActStoreSkuParam{
// ActStoreSku: model.ActStoreSku{
// StoreID: 100920,
// SkuID: 22715,
// },
// },
// // &ActStoreSkuParam{
// // ActStoreSku: model.ActStoreSku{
// // StoreID: 100119,
// // SkuID: 26595,
// // },
// // },
//}
// t.Log(utils.Format4Output(actStoreSkuList, true))
actID, err := CreateAct(jxcontext.AdminCtx, &model.Act{
Name: "测试活动",
PricePercentage: 80,
Type: model.ActSkuDirectDown,
BeginAt: time.Now().Add(-24 * time.Hour),
EndAt: time.Now().Add(10 * 24 * time.Hour),
}, []int{model.VendorIDJD, model.VendorIDMTWM /*, model.VendorIDEBAI*/}, nil, actStoreSkuList, false)
if err != nil {
t.Fatal(err)
}
globals.SugarLogger.Debug(actID)
//actID, err := CreateAct(jxcontext.AdminCtx, &model.Act{
// Name: "测试活动",
// PricePercentage: 80,
// Type: model.ActSkuDirectDown,
// BeginAt: time.Now().Add(-24 * time.Hour),
// EndAt: time.Now().Add(10 * 24 * time.Hour),
//}, []int{model.VendorIDJD, model.VendorIDMTWM /*, model.VendorIDEBAI*/}, nil, actStoreSkuList, false)
//if err != nil {
// t.Fatal(err)
//}
//globals.SugarLogger.Debug(actID)
}
func TestCancelAct(t *testing.T) {
@@ -192,18 +189,18 @@ func TestSyncAct(t *testing.T) {
}
func TestForceUpdateVendorPrice(t *testing.T) {
hint, err := ForceUpdateVendorPrice(jxcontext.AdminCtx, model.VendorIDJD, model.ActSkuDirectDown, []*ActStoreSkuParam{
&ActStoreSkuParam{
ActStoreSku: model.ActStoreSku{
StoreID: 100118,
SkuID: 22509,
ActPrice: 9900,
},
VendorPrice: 19900,
},
}, false)
if err != nil {
t.Fatal(err)
}
t.Log(hint)
//hint, err := ForceUpdateVendorPrice(jxcontext.AdminCtx, model.VendorIDJD, model.ActSkuDirectDown, []*ActStoreSkuParam{
// &ActStoreSkuParam{
// ActStoreSku: model.ActStoreSku{
// StoreID: 100118,
// SkuID: 22509,
// ActPrice: 9900,
// },
// VendorPrice: 19900,
// },
//}, false)
//if err != nil {
// t.Fatal(err)
//}
//t.Log(hint)
}

View File

@@ -8,6 +8,8 @@ import (
"strings"
"time"
"git.rosy.net.cn/jx-callback/business/partner/purchase/ebai"
"git.rosy.net.cn/baseapi/utils/errlist"
"git.rosy.net.cn/jx-callback/globals/api2"
@@ -149,6 +151,9 @@ func InitServiceInfo(version string, buildTime time.Time, gitCommit string) {
"thingType": model.ThingTypeName,
"apiFunctionName": model.ApiFunctionName,
"vendorStatus": model.VendorStatus,
"couponsStatus": model.CouponStatusName,
"ebaiSupplierID": ebai.EbaiSupplierIDMap,
"ebaiSupplierInfo": ebai.EbaiSupplierInfo,
},
}
}
@@ -419,7 +424,7 @@ func DeleteConfig(ctx *jxcontext.Context, key, configType string) (err error) {
db := dao.GetDB()
switch configType {
case model.ConfigTypePricePack:
storeMapList, err2 := dao.GetStoresMapList(db, nil, nil, nil, model.StoreStatusAll, model.StoreIsSyncYes, key, "")
storeMapList, err2 := dao.GetStoresMapList(db, nil, nil, nil, model.StoreStatusAll, model.StoreIsSyncYes, key, "", "")
if err = err2; err == nil {
var storeInfo []string
for _, v := range storeMapList {
@@ -430,7 +435,7 @@ func DeleteConfig(ctx *jxcontext.Context, key, configType string) (err error) {
}
}
case model.ConfigTypeFreightPack:
storeMapList, err2 := dao.GetStoresMapList(db, nil, nil, nil, model.StoreStatusAll, model.StoreIsSyncYes, "", "")
storeMapList, err2 := dao.GetStoresMapList(db, nil, nil, nil, model.StoreStatusAll, model.StoreIsSyncYes, "", "", "")
if err = err2; err == nil {
var storeInfo []string
for _, v := range storeMapList {
@@ -457,7 +462,7 @@ func DeleteConfig(ctx *jxcontext.Context, key, configType string) (err error) {
}
}
errList.AddErr(err)
storeList, err2 := dao.GetStoreList(db, nil, nil, nil, nil, key)
storeList, err2 := dao.GetStoreList(db, nil, nil, nil, nil, nil, key)
if err = err2; err == nil && len(storeList) > 0 {
storeIDs := make([]int, len(storeList))
for k, v := range storeList {
@@ -490,32 +495,32 @@ func UpdateConfig(ctx *jxcontext.Context, key, configType, value string) (hint s
hint = "1"
db := dao.GetDB()
dao.Begin(db)
txDB , _ := dao.Begin(db)
defer func() {
if r := recover(); r != nil {
dao.Rollback(db)
dao.Rollback(db, txDB)
panic(r)
}
}()
configList, err := dao.QueryConfigs(db, key, configType, "")
if err != nil {
dao.Rollback(db)
dao.Rollback(db, txDB)
return "", err
}
if _, err = dao.UpdateEntityLogically(db, configList[0], map[string]interface{}{
"Value": value,
}, ctx.GetUserName(), nil); err != nil {
dao.Rollback(db)
dao.Rollback(db, txDB)
return "", err
}
switch configType {
case model.ConfigTypePricePack:
storeMapList, err := dao.GetStoresMapList(db, nil, nil, nil, model.StoreStatusAll, model.StoreIsSyncYes, key, "")
storeMapList, err := dao.GetStoresMapList(db, nil, nil, nil, model.StoreStatusAll, model.StoreIsSyncYes, key, "", "")
if err != nil {
dao.Rollback(db)
dao.Rollback(db, txDB)
return "", err
}
dao.Commit(db)
dao.Commit(db, txDB)
vendorStoreMap := make(map[int][]int)
for _, v := range storeMapList {
vendorStoreMap[v.VendorID] = append(vendorStoreMap[v.VendorID], v.StoreID)
@@ -528,8 +533,8 @@ func UpdateConfig(ctx *jxcontext.Context, key, configType, value string) (hint s
}
}
case model.ConfigTypeFreightPack:
dao.Commit(db)
storeMapList, err := dao.GetStoresMapList(db, nil, nil, nil, model.StoreStatusAll, model.StoreIsSyncYes, "", "")
dao.Commit(db, txDB)
storeMapList, err := dao.GetStoresMapList(db, nil, nil, nil, model.StoreStatusAll, model.StoreIsSyncYes, "", "", "")
if err != nil {
return "", err
}
@@ -554,7 +559,7 @@ func UpdateConfig(ctx *jxcontext.Context, key, configType, value string) (hint s
}
}
default:
dao.Commit(db)
dao.Commit(db, txDB)
}
if configType == model.ConfigTypeSys && err == nil {
err = onSysConfigChanged(key, value)

View File

@@ -65,20 +65,20 @@ func GetStoreMessages(ctx *jxcontext.Context, msgIDs, storeIDs, types []int, fro
pageSize = jxutils.FormalizePageSize(pageSize)
sqlParams = append(sqlParams, pageSize, offset)
db := dao.GetDB()
dao.Begin(db)
defer dao.Commit(db)
txDB , _ := dao.Begin(db)
defer dao.Commit(db, txDB)
var msgList []*model.Message
// globals.SugarLogger.Debug(sql)
if err = dao.GetRows(db, &msgList, sql, sqlParams...); err == nil {
if err = dao.GetRowsTx(txDB, &msgList, sql, sqlParams...); err == nil {
pagedInfo = &model.PagedInfo{
TotalCount: dao.GetLastTotalRowCount(db),
TotalCount: dao.GetLastTotalRowCount2(db, txDB),
Data: msgList,
}
}
return pagedInfo, err
}
func GetStoreMessageStatuses(ctx *jxcontext.Context, msgIDs, storeIDs []int, fromReadCount, toReadCount int, fromTime, toTime time.Time, keyword string, offset, pageSize int) (pagedInfo *model.PagedInfo, err error) {
func GetStoreMessageStatuses(ctx *jxcontext.Context, msgIDs, storeIDs, confirmStatuss []int, fromReadCount, toReadCount int, fromTime, toTime time.Time, keyword string, offset, pageSize int) (pagedInfo *model.PagedInfo, err error) {
sql := `
SELECT SQL_CALC_FOUND_ROWS
t1.*,
@@ -92,6 +92,10 @@ func GetStoreMessageStatuses(ctx *jxcontext.Context, msgIDs, storeIDs []int, fro
sql += " AND t1.store_id IN (" + dao.GenQuestionMarks(len(storeIDs)) + ")"
sqlParams = append(sqlParams, storeIDs)
}
if len(confirmStatuss) > 0 {
sql += " AND t1.confirm_status IN (" + dao.GenQuestionMarks(len(confirmStatuss)) + ")"
sqlParams = append(sqlParams, confirmStatuss)
}
if len(msgIDs) > 0 {
sql += " AND t1.message_id IN (" + dao.GenQuestionMarks(len(msgIDs)) + ")"
sqlParams = append(sqlParams, msgIDs)
@@ -120,14 +124,14 @@ func GetStoreMessageStatuses(ctx *jxcontext.Context, msgIDs, storeIDs []int, fro
sql += " LIMIT ? OFFSET ?"
sqlParams = append(sqlParams, jxutils.FormalizePageSize(pageSize), offset)
db := dao.GetDB()
dao.Begin(db)
defer dao.Commit(db)
txDB , _ := dao.Begin(db)
defer dao.Commit(db, txDB)
var msgStatusList []*MessageStatusExt
// globals.SugarLogger.Debug(sql)
// globals.SugarLogger.Debug(utils.Format4Output(sqlParams, false))
if err = dao.GetRows(db, &msgStatusList, sql, sqlParams...); err == nil {
if err = dao.GetRowsTx(txDB, &msgStatusList, sql, sqlParams...); err == nil {
pagedInfo = &model.PagedInfo{
TotalCount: dao.GetLastTotalRowCount(db),
TotalCount: dao.GetLastTotalRowCount2(db, txDB),
Data: msgStatusList,
}
}

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,181 @@
package cms
import (
"git.rosy.net.cn/baseapi/utils"
"git.rosy.net.cn/jx-callback/business/jxutils/jxcontext"
"git.rosy.net.cn/jx-callback/business/model"
"git.rosy.net.cn/jx-callback/business/model/dao"
"git.rosy.net.cn/jx-callback/business/partner"
"git.rosy.net.cn/jx-callback/globals"
)
type StoreAcctManager struct {
}
var (
FixedStoreAcctManager *StoreAcctManager
)
func init() {
FixedStoreAcctManager = &StoreAcctManager{}
partner.InitStoreAcctManager(FixedStoreAcctManager)
}
func (s *StoreAcctManager) InsertStoreAcctIncome(ctx *jxcontext.Context, storeID, price, acctType int, vendorOrderID string, expendID int) (err error) {
var (
userID, userName string
goodsVendorOrderID string
db = dao.GetDB()
)
if ctx != nil {
userID = ctx.GetUserID()
userName = ctx.GetUserName()
goodsVendorOrderID = vendorOrderID
} else {
storeOrder := &model.StoreAcctOrder{
VendorOrderID: vendorOrderID,
}
if err = dao.GetEntity(db, storeOrder, "VendorOrderID"); err == nil && storeOrder.ID != 0 {
userID = storeOrder.UserID
userName = storeOrder.LastOperator
goodsVendorOrderID = storeOrder.GoodsVendorOrderID
}
}
storeAcctIncome := &model.StoreAcctIncome{
StoreID: storeID,
IncomePrice: price,
Type: acctType,
UserID: userID,
VendorOrderID: goodsVendorOrderID,
}
dao.WrapAddIDCULEntity(storeAcctIncome, userName)
if expendID != 0 {
storeAcctIncome.ExpID = expendID
}
err = dao.CreateEntity(db, storeAcctIncome)
globals.SugarLogger.Debugf("InsertStoreAcctIncome orderID: [%v] , price :[%v] , type :[%v]", vendorOrderID, price, acctType)
return err
}
func (s *StoreAcctManager) InsertStoreAcctExpend(ctx *jxcontext.Context, storeID, price, acctType int, vendorOrderID string, expendID int) (err error) {
var (
userID, userName string
db = dao.GetDB()
)
if ctx != nil {
userID = ctx.GetUserID()
userName = ctx.GetUserName()
} else {
storeOrder := &model.StoreAcctOrder{
VendorOrderID: vendorOrderID,
}
if err = dao.GetEntity(db, storeOrder, "VendorOrderID"); err == nil && storeOrder.ID != 0 {
userID = storeOrder.UserID
userName = storeOrder.LastOperator
}
}
storeAcctExpend := &model.StoreAcctExpend{
StoreID: storeID,
ExpendPrice: price,
Type: acctType,
UserID: userID,
VendorOrderID: vendorOrderID,
}
dao.WrapAddIDCULEntity(storeAcctExpend, userName)
if expendID != 0 {
storeAcctExpend.ExpID = expendID
}
err = dao.CreateEntity(db, storeAcctExpend)
globals.SugarLogger.Debugf("InsertStoreAcctExpend orderID: [%v] , price :[%v] , type :[%v]", vendorOrderID, price, acctType)
return err
}
func (s *StoreAcctManager) UpdateStoreAcctBalance(ctx *jxcontext.Context, storeID, price int, isIncome bool) (err error) {
var (
db = dao.GetDB()
)
globals.SugarLogger.Debugf("UpdateStoreAcctBalance storeID: [%v] , price :[%v] ,", storeID, price)
if ctx == nil {
ctx = jxcontext.AdminCtx
}
storeAcct := &model.StoreAcct{
StoreID: storeID,
}
txDB, _ := dao.Begin(db)
defer func() {
if r := recover(); r != nil || err != nil {
dao.Rollback(db, txDB)
if r != nil {
panic(r)
}
}
}()
if err = dao.GetEntity(db, storeAcct, "StoreID"); err != nil && dao.IsNoRowsError(err) {
//新增门店账单
dao.WrapAddIDCULEntity(storeAcct, ctx.GetUserName())
if err = dao.CreateEntityTx(txDB, storeAcct); err != nil {
dao.Rollback(db, txDB)
return err
}
} else {
globals.SugarLogger.Debugf("UpdateStoreAcctBalance1 storeID: [%v] , balance :[%v] ,", storeID, storeAcct.AccountBalance)
if isIncome {
storeAcct.AccountBalance += price
} else {
storeAcct.AccountBalance -= price
}
if _, err = dao.UpdateEntityTx(txDB, storeAcct, "AccountBalance"); err != nil {
dao.Rollback(db, txDB)
return err
}
globals.SugarLogger.Debugf("UpdateStoreAcctBalance2 storeID: [%v] , balance :[%v] ,", storeID, storeAcct.AccountBalance)
}
dao.Commit(db, txDB)
return err
}
func (s *StoreAcctManager) InsertStoreAcctExpendAndUpdateStoreAcctBalance(ctx *jxcontext.Context, storeID, price, acctType int, vendorOrderID string, expendID int) (err error) {
utils.CallFuncAsync(func() {
if err = s.InsertStoreAcctExpend(ctx, storeID, price, acctType, vendorOrderID, expendID); err == nil {
s.UpdateStoreAcctBalance(ctx, storeID, price, false)
}
})
return err
}
func (s *StoreAcctManager) InsertStoreAcctIncomeAndUpdateStoreAcctBalance(ctx *jxcontext.Context, storeID, price, acctType int, vendorOrderID string, expendID int) (err error) {
utils.CallFuncAsync(func() {
if err = s.InsertStoreAcctIncome(ctx, storeID, price, acctType, vendorOrderID, expendID); err == nil {
s.UpdateStoreAcctBalance(ctx, storeID, price, true)
}
})
return err
}
func (s *StoreAcctManager) CheckStoreAcctExpendExist(vendorOrderID string) (isEqual, isZero bool, err error) {
var (
expends, incomes int
db = dao.GetDB()
)
globals.SugarLogger.Debugf("CheckStoreAcctExpendExist orderID:[%v]", vendorOrderID)
expends, err = dao.GetStoreAcctExpendTotal(db, 0, []int{partner.StoreAcctTypeExpendCreateWaybillEx, partner.StoreAcctTypeRealFeeExpend}, vendorOrderID, utils.ZeroTimeValue, utils.ZeroTimeValue)
incomes, err = dao.GetStoreAcctIncomeTotal(db, 0, []int{partner.StoreAcctTypeRealFeeIncome, partner.StoreAcctTypeIncomeCancelTemp, partner.StoreAcctTypeIncomeCancelReal}, vendorOrderID, utils.ZeroTimeValue, utils.ZeroTimeValue)
if expends != incomes {
if expends > incomes {
return false, false, err
} else {
globals.SugarLogger.Debugf("CheckStoreAcctExpendExist 收入大于支出! orderID:[%v]", vendorOrderID)
}
} else {
if expends == 0 && incomes == 0 {
return true, true, err
} else {
return true, false, err
}
}
return false, false, err
}
func (s *StoreAcctManager) GetStoreAcctExpendLastCreateWayBillFee(vendorOrderID string) (expend *dao.GetStoreAcctExpendLastCreateWayBillFeeResult, lastFee int, err error) {
return dao.GetStoreAcctExpendLastCreateWayBillFee(dao.GetDB(), vendorOrderID)
}

File diff suppressed because it is too large Load Diff

View File

@@ -8,7 +8,6 @@ import (
"git.rosy.net.cn/baseapi/platformapi/dingdingapi"
"git.rosy.net.cn/jx-callback/business/jxutils/ddmsg"
"github.com/astaxie/beego"
"git.rosy.net.cn/jx-callback/business/model/dao"
@@ -1072,7 +1071,7 @@ func TestDiff(ctx *jxcontext.Context, vendorIDList []int, storeIDList []int) {
go func() {
defer func() {
if recover() != nil {
beego.Info("执行任务失败")
// beego.Info("执行任务失败")
panic("API调用失败")
}
}()
@@ -1090,7 +1089,7 @@ func TestDiff(ctx *jxcontext.Context, vendorIDList []int, storeIDList []int) {
go func() {
defer func() {
if recover() != nil {
beego.Info("比较任务失败")
// beego.Info("比较任务失败")
panic("比较任务失败")
}
}()
@@ -1102,7 +1101,7 @@ func TestDiff(ctx *jxcontext.Context, vendorIDList []int, storeIDList []int) {
go func() {
defer func() {
if recover() != nil {
beego.Info("写入任务失败")
// beego.Info("写入任务失败")
panic("写入任务失败")
}
}()
@@ -1336,12 +1335,7 @@ func WriteToExcel(task *tasksch.SeqTask, data map[int][]DiffData, depotData map[
}
func SetJxPrice(jxSkuInfoDataMulti *dao.StoreSkuNamesInfo, storeId int, vendorid int) (err error) {
db := dao.GetDB()
storeDetail, err := dao.GetStoreDetail(dao.GetDB(), storeId, vendorid)
if err != nil {
dao.Rollback(db)
return err
}
storeDetail, err := dao.GetStoreDetail(dao.GetDB(), storeId, vendorid, "")
/*重新计算京西价格*/
for _, values := range jxSkuInfoDataMulti.SkuNames {
for _, value := range values.Skus {

View File

@@ -1,7 +1,9 @@
package cms
import (
"git.rosy.net.cn/baseapi/platformapi/dingdingapi"
"git.rosy.net.cn/baseapi/utils"
"git.rosy.net.cn/jx-callback/business/jxutils/ddmsg"
"git.rosy.net.cn/jx-callback/business/jxutils/jxcontext"
"git.rosy.net.cn/jx-callback/business/model"
"git.rosy.net.cn/jx-callback/business/model/dao"
@@ -22,17 +24,24 @@ func init() {
}
func (s *StoreManager) OnStoreStatusChanged(vendorStoreID string, vendorID int, storeStatus int) (err error) {
return err
//return err
globals.SugarLogger.Debugf("OnStoreStatusChanged venvendorStoreID:%s, storeStatus:%d", vendorStoreID, storeStatus)
db := dao.GetDB()
storeDetail, err := dao.GetStoreDetailByVendorStoreID(db, vendorStoreID, vendorID)
storeDetail, err := dao.GetStoreDetailByVendorStoreID(db, vendorStoreID, vendorID, "")
if err == nil {
if storeDetail.IsSync == model.NO || storeDetail.Status == model.StoreStatusDisabled || storeDetail.Status == model.StoreStatusHaveRest {
return err
}
var storeKV, storeMapKV map[string]interface{}
if storeStatus == model.StoreStatusOpened {
if storeDetail.Status != model.StoreStatusOpened {
storeKV = map[string]interface{}{
"Status": model.StoreStatusOpened,
}
content := "您的门店 [" + storeDetail.Name + "]ID:[" + utils.Int2Str(storeDetail.ID) + "],在[" + model.VendorChineseNames[vendorID] + "] 平台上营业状态和京西不一致!平台状态:【营业】,京西状态:【非营业】"
if user, err := dao.GetUserByID(db, "mobile", storeDetail.MarketManPhone); err == nil {
ddmsg.SendUserMessage(dingdingapi.MsgTyeText, user.UserID, "平台门店状态变化", content)
}
}
if storeDetail.VendorStatus != model.StoreStatusOpened {
storeMapKV = map[string]interface{}{
@@ -46,6 +55,10 @@ func (s *StoreManager) OnStoreStatusChanged(vendorStoreID string, vendorID int,
"Status": storeStatus,
}
}
content := "您的门店 [" + storeDetail.Name + "]ID:[" + utils.Int2Str(storeDetail.ID) + "],在[" + model.VendorChineseNames[vendorID] + "] 平台上营业状态和京西不一致!平台状态:【非营业】,京西状态:【营业】"
if user, err := dao.GetUserByID(db, "mobile", storeDetail.MarketManPhone); err == nil {
ddmsg.SendUserMessage(dingdingapi.MsgTyeText, user.UserID, "平台门店状态变化", content)
}
} else if storeDetail.Status <= storeStatus {
if storeDetail.VendorStatus != model.StoreStatusOpened {
storeMapKV = map[string]interface{}{
@@ -55,10 +68,10 @@ func (s *StoreManager) OnStoreStatusChanged(vendorStoreID string, vendorID int,
}
}
if err == nil && (storeKV != nil || storeMapKV != nil) {
dao.Begin(db)
txDB, _ := dao.Begin(db)
defer func() {
if r := recover(); r != nil || err != nil {
dao.Rollback(db)
dao.Rollback(db, txDB)
if r != nil {
panic(r)
}
@@ -96,24 +109,29 @@ func (s *StoreManager) OnStoreStatusChanged(vendorStoreID string, vendorID int,
return err
}
}
dao.Commit(db)
dao.Commit(db, txDB)
}
}
return err
}
func (s *StoreManager) OnCourierStoreStatusChanged(ctx *jxcontext.Context, vendorStoreID string, vendorID int, auditStatus int) (err error) {
func (s *StoreManager) OnCourierStoreStatusChanged(ctx *jxcontext.Context, vendorStoreID string, vendorID int, auditStatus int, message string) (err error) {
if vendorStoreID != "" {
db := dao.GetDB()
_, err2 := dao.GetStoreDetail2(db, 0, vendorStoreID, vendorID)
if err = err2; err == nil {
status := model.StoreStatusOpened
if auditStatus != model.StoreAuditStatusOnline {
if auditStatus != model.StoreAuditStatusOnline && auditStatus != model.StoreAuditStatusUpdated {
status = model.StoreStatusDisabled
}
comment := ""
if auditStatus == model.StoreAuditStatusRejected {
comment = message
}
_, err = dao.UpdateEntityLogically(db, &model.StoreCourierMap{}, map[string]interface{}{
model.FieldStatus: status,
"AuditStatus": auditStatus,
"Comment": comment,
}, ctx.GetUserName(), map[string]interface{}{
model.FieldVendorStoreID: vendorStoreID,
model.FieldVendorID: vendorID,

View File

@@ -10,6 +10,7 @@ import (
"git.rosy.net.cn/baseapi/platformapi/mtpsapi"
"git.rosy.net.cn/jx-callback/business/jxstore/permission"
"git.rosy.net.cn/jx-callback/business/partner/putils"
"git.rosy.net.cn/jx-callback/globals/api"
@@ -52,6 +53,9 @@ type LoopStoreMapInfo struct {
type VendorSync struct {
}
type ComparePlatform struct {
}
type SyncError struct {
Original error `json:"original"`
Message string `json:"message"`
@@ -72,7 +76,8 @@ type SingleStoreHandlerWrapper struct {
}
var (
CurVendorSync VendorSync
CurVendorSync VendorSync
CurComparePlatform ComparePlatform
)
var (
@@ -245,7 +250,8 @@ func (v *VendorSync) SyncStore2(ctx *jxcontext.Context, db *dao.DaoDB, vendorIDs
db2 = dao.GetDB()
}
if model.IsSyncStatusNew(storeMap.SyncStatus) {
if vendorStoreID, err = handler.CreateStore2(db2, storeMap.StoreID, userName); err == nil {
storeDetail, _ := dao.GetStoreDetail(db, storeMap.StoreID, storeMap.VendorID, storeMap.VendorOrgCode)
if vendorStoreID, err = handler.CreateStore2(db2, storeMap.StoreID, userName, nil, storeDetail); err == nil {
resultList = append(resultList, 1)
} else {
failedList = putils.GetErrMsg2FailedSingleList(nil, err, storeMap.StoreID, model.VendorChineseNames[storeMap.VendorID], "创建门店")
@@ -283,7 +289,8 @@ func (v *VendorSync) SyncStore2(ctx *jxcontext.Context, db *dao.DaoDB, vendorIDs
var vendorStoreID string
storeMap := loopMapInfo.StoreMapList[0]
if model.IsSyncStatusNew(storeMap.SyncStatus) {
if vendorStoreID, err = handler.CreateStore2(db2, storeMap.StoreID, userName); err == nil {
storeDetail, _ := dao.GetStoreDetail(db, storeMap.StoreID, storeMap.VendorID, storeMap.VendorOrgCode)
if vendorStoreID, err = handler.CreateStore2(db2, storeMap.StoreID, userName, nil, storeDetail); err == nil {
resultList = append(resultList, 1)
} else {
failedList = putils.GetErrMsg2FailedSingleList(nil, err, storeMap.StoreID, model.VendorChineseNames[storeMap.VendorID], "创建门店")
@@ -499,7 +506,7 @@ func (v *VendorSync) SyncStoresSkus2(ctx *jxcontext.Context, parentTask tasksch.
if setSyncStatus != 0 {
dao.SetStoreSkuSyncStatus(db, storeMap.VendorID, []int{storeMap.StoreID}, skuIDs, setSyncStatus)
}
if _, err = SyncStoreSkuNew(ctx, task, causeFlag, storeMap.VendorID, storeMap.StoreID, storeMap.VendorStoreID, nil, skuIDs, excludeSkuIDs, false, isContinueWhenError); err != nil {
if _, err = SyncStoreSkuNew(ctx, task, causeFlag, storeMap.VendorID, storeMap.StoreID, storeMap.VendorStoreID, storeMap.VendorOrgCode, nil, skuIDs, excludeSkuIDs, false, isContinueWhenError); err != nil {
globals.SugarLogger.Debugf("SyncStoresSkus2 failed2 store:%d failed with error:%v", storeMap.StoreID, err)
}
}
@@ -521,9 +528,37 @@ func (v *VendorSync) SyncStoresSkus(ctx *jxcontext.Context, parentTask tasksch.I
if isForce {
setSyncStatus = model.SyncFlagStoreSkuModifiedMask
}
//权限
if permission.IsRoled(ctx) {
if storeIDsMap, err := permission.GetUserStoresResultMap(ctx.GetUserID()); err == nil {
var storeIDs2 []int
if len(storeIDs) > 0 {
for _, v := range storeIDs {
if storeIDsMap[v] != 0 {
storeIDs2 = append(storeIDs2, v)
}
}
if len(storeIDs2) == 0 {
storeIDs2 = append(storeIDs2, -1)
}
} else {
for k, _ := range storeIDsMap {
storeIDs2 = append(storeIDs2, k)
}
}
storeIDs = nil
storeIDs = storeIDs2
}
}
return v.SyncStoresSkus2(ctx, parentTask, causeFlag, db, vendorIDs, storeIDs, true, skuIDs, nil, setSyncStatus, isAsync, isContinueWhenError)
}
//执行比较店铺与运营商的sku差异
func (c *ComparePlatform) CompareStoreWithOperator(ctx *jxcontext.Context, db *dao.DaoDB, vendorIDs []int, storeIDs []int, syncDisabled bool, excludeSkuIDs []int, isAsync, isContinueWhenError bool) (hint string, err error) {
globals.SugarLogger.Debug("开始执行CompareStoreWithOperator")
return hint, makeSyncError(err)
}
func (v *VendorSync) FullSyncStoresSkus(ctx *jxcontext.Context, db *dao.DaoDB, vendorIDs []int, storeIDs []int, syncDisabled bool, excludeSkuIDs []int, isAsync, isContinueWhenError bool) (hint string, err error) {
globals.SugarLogger.Debug("FullSyncStoresSkus")
hint, err = v.LoopStoresMap(ctx, db, fmt.Sprintf("初始化门店商品信息:%v", storeIDs), isAsync, true, vendorIDs, storeIDs,
@@ -650,7 +685,7 @@ func (v *VendorSync) AmendAndPruneStoreStuff(ctx *jxcontext.Context, vendorIDs [
func (v *VendorSync) LoopStoresMap2(ctx *jxcontext.Context, parentTask tasksch.ITask, db *dao.DaoDB, taskName string, isAsync, isManageIt bool, vendorIDs []int, storeIDs []int, mustDirty bool, handler tasksch.WorkFunc, isContinueWhenError bool) (task tasksch.ITask, hint string, err error) {
var storeMapList []*model.StoreMap
if storeMapList, err = dao.GetStoresMapList2(db, vendorIDs, storeIDs, nil, model.StoreStatusAll, model.StoreIsSyncYes, "", "", mustDirty); err != nil {
if storeMapList, err = dao.GetStoresMapList2(db, vendorIDs, storeIDs, nil, model.StoreStatusAll, model.StoreIsSyncYes, "", "", "", mustDirty); err != nil {
return nil, "", err
}
if len(storeMapList) == 0 {
@@ -716,19 +751,18 @@ func buildSetFinishHook(task tasksch.ITask, ctx *jxcontext.Context) {
} else {
globals.SugarLogger.Debugf("同步错误发送钉钉消息失败, authinfo [%v] , [%v]", *authInfo, err)
}
} else {
if len(task.GetFailedList()) > 1 {
if time.Now().Hour() >= 20 || time.Now().Hour() < 7 {
downloadURL, _, _ := WirteToExcelBySyncFailed(task)
user, err := dao.GetUserByID(dao.GetDB(), "mobile", "18160030913")
noticeMsg += fmt.Sprintf("[详情点我]%s/billshow/?normal=true&path=%s \n", globals.BackstageHost, downloadURL)
if user != nil && err == nil {
ddmsg.SendUserMessage(dingdingapi.MsgTyeText, user.UserID, "同步错误返回", noticeMsg)
}
}
}
}
// else {
// if len(task.GetFailedList()) > 1 {
// if time.Now().Hour() >= 20 || time.Now().Hour() < 7 {
// downloadURL, _, _ := WirteToExcelBySyncFailed(task)
// user, err := dao.GetUserByID(dao.GetDB(), "mobile", "18160030913")
// noticeMsg += fmt.Sprintf("[详情点我]%s/billshow/?normal=true&path=%s \n", globals.BackstageHost, downloadURL)
// if user != nil && err == nil {
// ddmsg.SendUserMessage(dingdingapi.MsgTyeText, user.UserID, "同步错误返回", noticeMsg)
// }
// }
// }
// }
})
}
@@ -1146,7 +1180,7 @@ func SyncJdsStoreStock(ctx *jxcontext.Context, isAsync, isContinueWhenError bool
storeMaps []*model.StoreMap
)
sql := `
SELECT * FROM store_map WHERE vendor_id = ? AND vendor_store_id <> '' AND store_id <> ?
SELECT * FROM store_map WHERE vendor_id = ? AND vendor_store_id <> '' AND store_id <> ? AND vendor_org_code = 2
`
sqlParams := []interface{}{
model.VendorIDJDShop, model.JdShopMainStoreID,
@@ -1322,7 +1356,7 @@ func SetMTPSStatus(ctx *jxcontext.Context, storeId, courierStatus int) {
//&& CourierStatus != 0
if storeId != 0 {
var ShopName string
StoreLists, _ := dao.GetStoreList(nil, []int{storeId}, nil, nil, nil, "")
StoreLists, _ := dao.GetStoreList(nil, []int{storeId}, nil, nil, nil, nil, "")
ShopName = StoreLists[0].Name
StoreInfoList := new(mtpsapi.GetStoreStatusResultAll)
StoreInfoList, _ = api.MtpsAPI.GetStoreStatus(ShopName)
@@ -1463,7 +1497,7 @@ func SetMTPSStatus(ctx *jxcontext.Context, storeId, courierStatus int) {
//test:
for _, StoreCourierList1 := range StoreCourierList {
diff := false
StoreLists, _ := dao.GetStoreList(db, []int{StoreCourierList1.StoreID}, nil, nil, nil, "")
StoreLists, _ := dao.GetStoreList(db, []int{StoreCourierList1.StoreID}, nil, nil, nil, nil, "")
if StoreLists == nil {
globals.SugarLogger.Debugf("StoreID为:%s,在store表未找到", StoreCourierList1.StoreID)
continue
@@ -1506,3 +1540,34 @@ func SetMTPSStatus(ctx *jxcontext.Context, storeId, courierStatus int) {
}
globals.SugarLogger.Debug("SetMTPSStatus is Complete")
}
func SetMTPSStatus2(storeID int) {
var (
db = dao.GetDB()
storeIDs []int
)
if storeID != 0 {
storeIDs = append(storeIDs, storeID)
}
stores, _ := dao.GetStoreCourierList(db, storeIDs, []int{model.VendorIDMTPS}, model.StoreStatusAll, model.StoreAuditStatusAll)
for _, v := range stores {
if storeDetail, _ := dao.GetStoreDetail2(db, v.StoreID, "", model.VendorIDMTPS); storeDetail != nil {
_, err := api.MtpsAPI.CheckOrder(v.VendorStoreID, storeDetail.Address, int64(storeDetail.Lng), int64(storeDetail.Lat), time.Now().Unix())
if mtpsapi.IsOpen(err) {
sl := make(map[string]interface{})
sl["status"] = 1
sl["vendorStatus"] = 1
UpdateStoreCourierMap(jxcontext.AdminCtx, db, v.StoreID, model.VendorIDMTPS, sl, "jxadmin")
} else {
if mtpsapi.IsExist(err) {
DeleteStoreCourierMap(jxcontext.AdminCtx, db, v.StoreID, model.VendorIDMTPS, "jxadmin")
} else {
sl := make(map[string]interface{})
sl["status"] = 0
sl["vendorStatus"] = 0
UpdateStoreCourierMap(jxcontext.AdminCtx, db, v.StoreID, model.VendorIDMTPS, sl, "jxadmin")
}
}
}
}
}

View File

@@ -2,6 +2,7 @@ package cms
import (
"fmt"
"strings"
"time"
"git.rosy.net.cn/baseapi/utils"
@@ -51,6 +52,13 @@ func syncCategories(ctx *jxcontext.Context, db *dao.DaoDB, parentTask tasksch.IT
if catVendorInfo.MapID == 0 {
return nil, fmt.Errorf("分类:%d的数据异常", catVendorInfo.ID)
}
//表示是不用京西分类,要用平台分类
if catVendorInfo.IsJxCat == model.YES {
if catVendorInfo.VendorCategoryID != 0 {
catVendorInfo.Seq = catVendorInfo.VendorCategorySeq
catVendorInfo.Name = catVendorInfo.VendorCategoryName
}
}
if multiStoresHandler, ok := partner.GetPurchasePlatformFromVendorID(catVendorInfo.VendorID).(partner.IMultipleStoresHandler); ok {
if model.IsSyncStatusDelete(catVendorInfo.CatSyncStatus) { //删除
if !dao.IsVendorThingIDEmpty(catVendorInfo.VendorCatID) &&
@@ -88,7 +96,7 @@ func SyncCategories(ctx *jxcontext.Context, parentTask tasksch.ITask, vendorIDs
db := dao.GetDB()
catList, err := dao.GetSkuCategoryWithVendor(db, vendorIDs, appOrgCodes, -1, catIDs, true)
if err == nil && len(catList) > 0 {
// TODO 同一平台不同账号会有影响needSyncParentIDs暂不处理
//TODO 同一平台不同账号会有影响needSyncParentIDs暂不处理
var needSyncParentIDs []int
for _, cat := range catList {
if cat.Level == 2 && cat.ParentVendorCatID == "" && cat.IsExdSpec == model.NO {
@@ -138,19 +146,22 @@ func SyncSkus(ctx *jxcontext.Context, parentTask tasksch.ITask, vendorIDs []int,
func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) {
skuVendorInfo := batchItemList[0].(*dao.StoreSkuSyncInfo)
var failedList []*partner.StoreSkuInfoWithErr
if skuVendorInfo.VendorCatID == "" {
return nil, fmt.Errorf("商品:%d的商家分类没有同步", skuVendorInfo.SkuID)
}
// if skuVendorInfo.VendorCatID == "" {
// return nil, fmt.Errorf("商品:%d的商家分类没有同步", skuVendorInfo.SkuID)
// }
if skuVendorInfo.BindID == 0 {
return nil, fmt.Errorf("商品:%d的数据异常", skuVendorInfo.SkuID)
}
if skuVendorInfo.ExdSkuID != "" {
return nil, err
}
if !model.IsSyncStatusNew(skuVendorInfo.SkuSyncStatus) && skuVendorInfo.VendorSkuID == "" {
return nil, err
}
if skuVendorInfo.SkuVendorMapCatID != "" {
skuVendorInfo.VendorVendorCatID = utils.Str2Int64(skuVendorInfo.SkuVendorMapCatID)
}
skuVendorInfo.SkuName = jxutils.ComposeSkuNameSync(skuVendorInfo.Prefix, skuVendorInfo.Name, skuVendorInfo.Comment, skuVendorInfo.Unit, skuVendorInfo.SpecQuality, skuVendorInfo.SpecUnit, 0, skuVendorInfo.ExPrefix, skuVendorInfo.ExPrefixBegin, skuVendorInfo.ExPrefixEnd)
skuVendorInfo.SkuName = jxutils.ComposeSkuNameSync(skuVendorInfo.Prefix, skuVendorInfo.Name, skuVendorInfo.Comment, skuVendorInfo.Unit, skuVendorInfo.SpecQuality, skuVendorInfo.SpecUnit, 0, skuVendorInfo.ExPrefix, skuVendorInfo.ExPrefixBegin, skuVendorInfo.ExPrefixEnd, true)
skuVendorInfo.SkuNameOrigin = jxutils.ComposeSkuNameOriginal(skuVendorInfo.Prefix, skuVendorInfo.Name, skuVendorInfo.Comment, skuVendorInfo.Unit, skuVendorInfo.SpecQuality, skuVendorInfo.SpecUnit, 0)
if skuVendorInfo.ImgWatermark != "" {
downLoad, _ := uploadImgStandard(skuVendorInfo.ImgWatermark)
@@ -215,20 +226,35 @@ func SyncReorderCategories(ctx *jxcontext.Context, parentCatID int, isAsync bool
func(t *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) {
vendorInfo := batchItemList[0].(*MultiStoreVendorInfo)
multiStoresHandler := CurVendorSync.GetMultiStoreHandler(vendorInfo.VendorID)
vendorOrgCode, err := dao.GetVendorOrgCode(db, vendorInfo.VendorID, vendorInfo.OrgCode, "")
if multiStoresHandler != nil {
catList, err2 := dao.GetSkuCategoryWithVendor(db, []int{vendorInfo.VendorID}, []string{vendorInfo.OrgCode}, parentCatID, nil, false)
if err = err2; err == nil {
var vendorCatIDList []string
for _, v := range catList {
if v.VendorCatID != "" {
vendorCatIDList = append(vendorCatIDList, v.VendorCatID)
var vendorCatIDList []string
var parentVendorCatID string
//如果用平台分类就走else用京西分类就还是原来的if
if vendorOrgCode[0].IsJxCat == model.NO {
catList, err2 := dao.GetSkuCategoryWithVendor(db, []int{vendorInfo.VendorID}, []string{vendorInfo.OrgCode}, parentCatID, nil, false)
if err = err2; err == nil {
for _, v := range catList {
if v.VendorCatID != "" {
vendorCatIDList = append(vendorCatIDList, v.VendorCatID)
}
}
}
if len(vendorCatIDList) > 0 {
if err = multiStoresHandler.ReorderCategories2(ctx, vendorInfo.OrgCode, catList[0].ParentVendorCatID, vendorCatIDList); err == nil {
retVal = []int{len(vendorCatIDList)}
parentVendorCatID = catList[0].ParentVendorCatID
} else {
vendorCatList, _ := dao.GetVendorCategoryMapExt(db, parentCatID, 0, vendorInfo.VendorID, vendorInfo.OrgCode, 0)
for _, v := range vendorCatList {
if v.VendorThingID != "" {
vendorCatIDList = append(vendorCatIDList, v.VendorThingID)
}
}
thingMaps, _ := dao.GetThingMapList(db, model.ThingTypeCategory, []int{vendorInfo.VendorID}, []int{parentCatID}, []string{vendorInfo.OrgCode})
parentVendorCatID = thingMaps[0].VendorThingID
}
if len(vendorCatIDList) > 0 {
if err = multiStoresHandler.ReorderCategories2(ctx, vendorInfo.OrgCode, parentVendorCatID, vendorCatIDList); err == nil {
retVal = []int{len(vendorCatIDList)}
}
}
} else {
err = fmt.Errorf("非法平台:%d", vendorInfo.VendorID)
@@ -238,16 +264,43 @@ func SyncReorderCategories(ctx *jxcontext.Context, parentCatID int, isAsync bool
return hint, err
}
func SyncReorderCategories2(ctx *jxcontext.Context, parentCatID, vendorID int, vendorOrgCode string) (err error) {
globals.SugarLogger.Debugf("SyncReorderCategories parentCatID:%d", parentCatID)
db := dao.GetDB()
multiStoresHandler := CurVendorSync.GetMultiStoreHandler(vendorID)
if multiStoresHandler != nil {
var vendorCatIDList []string
var parentVendorCatID string
vendorCatList, _ := dao.GetVendorCategoryMapExt(db, parentCatID, 0, vendorID, vendorOrgCode, 0)
for _, v := range vendorCatList {
if v.VendorThingID != "" {
vendorCatIDList = append(vendorCatIDList, v.VendorThingID)
}
}
thingMaps, _ := dao.GetThingMapList(db, model.ThingTypeCategory, []int{vendorID}, []int{parentCatID}, []string{vendorOrgCode})
if len(thingMaps) > 0 {
parentVendorCatID = thingMaps[0].VendorThingID
}
if len(vendorCatIDList) > 0 {
err = multiStoresHandler.ReorderCategories2(ctx, vendorOrgCode, parentVendorCatID, vendorCatIDList)
}
} else {
err = fmt.Errorf("非法平台:%d", vendorID)
}
return err
}
func getThingMap(db *dao.DaoDB, thingMap *model.ThingMap) (err error) {
return dao.GetEntity(db, thingMap, "ThingID", "ThingType", "VendorID", "VendorOrgCode", model.FieldDeletedAt)
}
func OnCreateThing(ctx *jxcontext.Context, db *dao.DaoDB, vendorInfoList []*MultiStoreVendorInfo, thingID int64, thingType int8) (err error) {
func OnCreateThing(ctx *jxcontext.Context, db *dao.DaoDB, vendorInfoList []*model.VendorOrgCode, thingID int64, thingType, syncFlag int8, vendorFlag bool) (err error) {
if thingType == model.ThingTypeSkuName {
return nil
}
if len(vendorInfoList) == 0 {
vendorInfoList = getMultiStoreVendorInfoList()
vendorInfoList, err = dao.GetVendorOrgCode(db, model.VendorIDJD, "", model.VendorOrgTypePlatform)
}
errList := errlist.New()
for _, v := range vendorInfoList {
@@ -255,13 +308,18 @@ func OnCreateThing(ctx *jxcontext.Context, db *dao.DaoDB, vendorInfoList []*Mult
ThingID: thingID,
ThingType: thingType,
VendorID: v.VendorID,
VendorOrgCode: v.OrgCode,
SyncStatus: model.SyncFlagNewMask,
VendorOrgCode: v.VendorOrgCode,
}
if thingType == model.ThingTypeCategory && !vendorFlag {
if v.IsJxCat == model.YES {
syncFlag = 0
}
}
thingMap.SyncStatus = syncFlag
dao.WrapAddIDCULDEntity(thingMap, ctx.GetUserName())
if err2 := dao.CreateEntity(db, thingMap); err2 != nil {
if dao.IsDuplicateError(err2) {
errList.AddErr(onUpdateThing(ctx, db, vendorInfoList, thingID, thingType, model.SyncFlagNewMask))
errList.AddErr(onUpdateThing(ctx, db, vendorInfoList, thingID, thingType, syncFlag))
} else {
errList.AddErr(err2)
}
@@ -272,12 +330,12 @@ func OnCreateThing(ctx *jxcontext.Context, db *dao.DaoDB, vendorInfoList []*Mult
return err
}
func onUpdateThing(ctx *jxcontext.Context, db *dao.DaoDB, vendorInfoList []*MultiStoreVendorInfo, thingID int64, thingType int8, syncStatus int8) (err error) {
func onUpdateThing(ctx *jxcontext.Context, db *dao.DaoDB, vendorInfoList []*model.VendorOrgCode, thingID int64, thingType int8, syncStatus int8) (err error) {
if thingType == model.ThingTypeSkuName {
return nil
}
if len(vendorInfoList) == 0 {
vendorInfoList = getMultiStoreVendorInfoList()
vendorInfoList, err = dao.GetVendorOrgCode(db, model.VendorIDJD, "", model.VendorOrgTypePlatform)
}
errList := errlist.New()
for _, v := range vendorInfoList {
@@ -285,7 +343,7 @@ func onUpdateThing(ctx *jxcontext.Context, db *dao.DaoDB, vendorInfoList []*Mult
ThingID: thingID,
ThingType: thingType,
VendorID: v.VendorID,
VendorOrgCode: v.OrgCode,
VendorOrgCode: v.VendorOrgCode,
}
thingMap.DeletedAt = utils.DefaultTimeValue
if err2 := getThingMap(db, thingMap); err2 == nil {
@@ -296,14 +354,18 @@ func onUpdateThing(ctx *jxcontext.Context, db *dao.DaoDB, vendorInfoList []*Mult
updateThingMapEntity(db, thingMap)
} else {
errList.AddErr(err2)
if dao.IsNoRowsError(err2) {
err2 = nil
} else {
errList.AddErr(err2)
}
}
}
err = errList.GetErrListAsOne()
return err
}
func OnUpdateThing(ctx *jxcontext.Context, db *dao.DaoDB, vendorInfoList []*MultiStoreVendorInfo, thingID int64, thingType int8) (err error) {
func OnUpdateThing(ctx *jxcontext.Context, db *dao.DaoDB, vendorInfoList []*model.VendorOrgCode, thingID int64, thingType int8) (err error) {
return onUpdateThing(ctx, db, vendorInfoList, thingID, thingType, model.SyncFlagModifiedMask)
}
@@ -378,6 +440,12 @@ func OnThingSync(ctx *jxcontext.Context, db *dao.DaoDB, thingMap *model.ThingMap
err = syncErr
thingMap.Remark = utils.LimitUTF8StringLen(err.Error(), 255)
dao.UpdateEntity(db, thingMap, "Remark")
if thingMap.VendorOrgCode == globals.JdcsOrgCode {
if strings.Contains(err.Error(), "店内分类信息不存在") {
err = nil
}
}
} else {
updateFields := []string{
model.FieldSyncStatus,
@@ -423,18 +491,13 @@ func updateThingMapEntity(db *dao.DaoDB, thingMap *model.ThingMap) {
// }
}
func amendAndPruneVendorStuff(ctx *jxcontext.Context, parentTask tasksch.ITask, vendorID int, vendorOrgCode string, isAsync, isContinueWhenError bool, opType int, isForceUpdate bool) (hint string, err error) {
func amendAndPruneVendorStuff(ctx *jxcontext.Context, parentTask tasksch.ITask, storeID, vendorID int, vendorOrgCode string, isAsync, isContinueWhenError bool, opType int, isForceUpdate bool) (hint string, err error) {
handler, _ := partner.GetPurchasePlatformFromVendorID(vendorID).(partner.IMultipleStoresHandler)
if handler == nil {
return "", fmt.Errorf("平台:%s不支持此操作", model.VendorChineseNames[vendorID])
}
db := dao.GetDB()
vendorInfo := []*MultiStoreVendorInfo{
&MultiStoreVendorInfo{
VendorID: vendorID,
OrgCode: vendorOrgCode,
},
}
vendorOrgCodes, _ := dao.GetVendorOrgCode(db, vendorID, vendorOrgCode, model.VendorOrgTypePlatform)
var sku2Delete []*partner.StoreSkuInfo
var cat2Delete []*partner.BareCategoryInfo
task := tasksch.NewParallelTask(fmt.Sprintf("平台:%s,账号:%s上的商品与商家分类", model.VendorChineseNames[vendorID], vendorOrgCode),
@@ -474,7 +537,21 @@ func amendAndPruneVendorStuff(ctx *jxcontext.Context, parentTask tasksch.ITask,
})
}
}
StoreSkuMap := make(map[int]*dao.StoreSkuSyncInfo)
if storeID != 0 {
skuList2, _ := dao.GetStoreSkuListWithVendor(db, storeID, vendorID, vendorOrgCode)
for _, v := range skuList2 {
if _, ok := StoreSkuMap[v.ID]; !ok {
StoreSkuMap[v.ID] = v
}
}
}
getSyncFlag := func(skuID int) int8 {
if StoreSkuMap[skuID] != nil {
return model.SyncFlagNewMask
}
return 0
}
if opType == AmendPruneOnlyAmend || opType == AmendPruneAll {
for _, v := range localSkuList {
if v.ExdSkuID == "" {
@@ -482,28 +559,31 @@ func amendAndPruneVendorStuff(ctx *jxcontext.Context, parentTask tasksch.ITask,
if !model.IsSyncStatusDelete(v.SkuSyncStatus) {
if remoteSkuMap[v.VendorSkuID] == 0 {
if !model.IsSyncStatusNew(v.SkuSyncStatus) {
OnCreateThing(ctx, db, vendorInfo, int64(v.SkuID), model.ThingTypeSku)
OnCreateThing(ctx, db, vendorOrgCodes, int64(v.SkuID), model.ThingTypeSku, getSyncFlag(v.SkuID), false)
}
} else if isForceUpdate {
OnUpdateThing(ctx, db, vendorInfo, int64(v.SkuID), model.ThingTypeSku)
OnUpdateThing(ctx, db, vendorOrgCodes, int64(v.SkuID), model.ThingTypeSku)
}
}
} else {
OnCreateThing(ctx, db, vendorInfo, int64(v.SkuID), model.ThingTypeSku)
//表示根据某门店的门店商品同步京东商品库中这个门店关注并可售了这个商品插到thingmap里同步标志是待创建SyncFlagNewMask才会创建
//若该门店没关注可售那插到thingmap里的话就该同步标志为0就不会创建
//getSyncFlag
OnCreateThing(ctx, db, vendorOrgCodes, int64(v.SkuID), model.ThingTypeSku, getSyncFlag(v.SkuID), false)
}
}
}
}
}
case 1:
if (opType == AmendPruneOnlyPrune || opType == AmendPruneAll) && len(sku2Delete) > 0 {
_, err = putils.FreeBatchStoreSkuInfo("删除商品", func(task tasksch.ITask, batchedStoreSkuList []*partner.StoreSkuInfo) (result interface{}, successCount int, err error) {
if err = handler.DeleteSku2(ctx, vendorOrgCode, batchedStoreSkuList[0]); err == nil {
successCount = 1
}
return nil, successCount, err
}, ctx, task, sku2Delete, 1, isContinueWhenError)
}
// if (opType == AmendPruneOnlyPrune || opType == AmendPruneAll) && len(sku2Delete) > 0 {
// _, err = putils.FreeBatchStoreSkuInfo("删除商品", func(task tasksch.ITask, batchedStoreSkuList []*partner.StoreSkuInfo) (result interface{}, successCount int, err error) {
// if err = handler.DeleteSku2(ctx, vendorOrgCode, batchedStoreSkuList[0]); err == nil {
// successCount = 1
// }
// return nil, successCount, err
// }, ctx, task, sku2Delete, 1, isContinueWhenError)
// }
sku2Delete = nil
case 2:
localCatList, err := dao.GetSkuCategoryWithVendor(db, []int{vendorID}, []string{vendorOrgCode}, -1, nil, false)
@@ -517,25 +597,39 @@ func amendAndPruneVendorStuff(ctx *jxcontext.Context, parentTask tasksch.ITask,
localCatMap[utils.Int2Str(v.ID)] = v
}
vendorCatMap := make(map[int]*model.VendorCategoryMap)
if vendorOrgCodes[0].IsJxCat == model.YES {
vendorCats, _ := dao.GetVendorCategoryMap(db, -1, 0, vendorID, vendorOrgCode, 0)
for _, v := range vendorCats {
if _, ok := vendorCatMap[v.CategoryID]; !ok {
vendorCatMap[v.CategoryID] = v
}
}
}
getSyncFlagCat := func(categoryID int) int8 {
if vendorCatMap[categoryID] != nil || vendorOrgCodes[0].IsJxCat == model.NO {
return model.SyncFlagNewMask
}
return 0
}
remoteCatList, err2 := handler.GetAllCategories(ctx, vendorOrgCode)
if err = err2; err == nil {
remoteCatMap := make(map[string]int)
cat2Delete = checkRemoteCatExist(remoteCatMap, localCatMap, remoteCatList)
for _, v := range localCatList {
if v.IsExdSpec == model.NO {
if v.MapID != 0 {
if !model.IsSyncStatusDelete(v.CatSyncStatus) {
if remoteCatMap[v.VendorCatID] == 0 {
if !model.IsSyncStatusNew(v.CatSyncStatus) {
OnCreateThing(ctx, db, vendorInfo, int64(v.ID), model.ThingTypeCategory)
OnCreateThing(ctx, db, vendorOrgCodes, int64(v.ID), model.ThingTypeCategory, getSyncFlagCat(v.ID), true)
}
} else if isForceUpdate && !model.IsSyncStatusUpdate(v.CatSyncStatus) {
OnUpdateThing(ctx, db, vendorInfo, int64(v.ID), model.ThingTypeCategory)
OnUpdateThing(ctx, db, vendorOrgCodes, int64(v.ID), model.ThingTypeCategory)
}
}
} else {
OnCreateThing(ctx, db, vendorInfo, int64(v.ID), model.ThingTypeCategory)
OnCreateThing(ctx, db, vendorOrgCodes, int64(v.ID), model.ThingTypeCategory, getSyncFlagCat(v.ID), true)
}
}
}
@@ -551,14 +645,14 @@ func amendAndPruneVendorStuff(ctx *jxcontext.Context, parentTask tasksch.ITask,
}
}
if len(levelCat2Delete) > 0 {
task4Delete := tasksch.NewParallelTask(fmt.Sprintf("删除商家分类,level:%d", level), tasksch.NewParallelConfig().SetIsContinueWhenError(isContinueWhenError), ctx,
func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) {
cat := batchItemList[0].(*partner.BareCategoryInfo)
err = handler.DeleteCategory2(ctx, vendorOrgCode, cat.VendorCatID)
return nil, err
}, levelCat2Delete)
tasksch.HandleTask(task4Delete, task, true).Run()
_, err = task4Delete.GetResult(0)
// task4Delete := tasksch.NewParallelTask(fmt.Sprintf("删除商家分类,level:%d", level), tasksch.NewParallelConfig().SetIsContinueWhenError(isContinueWhenError), ctx,
// func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) {
// cat := batchItemList[0].(*partner.BareCategoryInfo)
// err = handler.DeleteCategory2(ctx, vendorOrgCode, cat.VendorCatID)
// return nil, err
// }, levelCat2Delete)
// tasksch.HandleTask(task4Delete, task, true).Run()
// _, err = task4Delete.GetResult(0)
}
}
}
@@ -576,7 +670,7 @@ func amendAndPruneVendorStuff(ctx *jxcontext.Context, parentTask tasksch.ITask,
return hint, err
}
func FullSyncVendorStuff(ctx *jxcontext.Context, parentTask tasksch.ITask, vendorID int, vendorOrgCode string, isAsync, isContinueWhenError bool) (hint string, err error) {
func FullSyncVendorStuff(ctx *jxcontext.Context, parentTask tasksch.ITask, storeID, vendorID int, vendorOrgCode string, isAsync, isContinueWhenError bool) (hint string, err error) {
multiStoreHandler, _ := partner.GetPurchasePlatformFromVendorID(vendorID).(partner.IMultipleStoresHandler)
if multiStoreHandler == nil {
return "", fmt.Errorf("vendorID:%d不是多门店平台", vendorID)
@@ -586,7 +680,7 @@ func FullSyncVendorStuff(ctx *jxcontext.Context, parentTask tasksch.ITask, vendo
step := batchItemList[0].(int)
switch step {
case 0:
_, err = amendAndPruneVendorStuff(ctx, task, vendorID, vendorOrgCode, false, isContinueWhenError, AmendPruneAll, false)
_, err = amendAndPruneVendorStuff(ctx, task, storeID, vendorID, vendorOrgCode, false, isContinueWhenError, AmendPruneAll, false)
case 1:
_, err = SyncCategories(ctx, task, []int{vendorID}, []string{vendorOrgCode}, nil, false)
case 2:

View File

@@ -16,7 +16,7 @@ func OpenRemoteStoreByJxStatus(ctx *jxcontext.Context, vendorIDs, storeIDs []int
if !isForce {
status = model.StoreStatusClosed
}
storeMapList, err := dao.GetStoresMapList(db, vendorIDs, storeIDs, nil, status, model.StoreIsSyncYes, "", "")
storeMapList, err := dao.GetStoresMapList(db, vendorIDs, storeIDs, nil, status, model.StoreIsSyncYes, "", "", "")
if err != nil {
return "", err
}
@@ -34,7 +34,7 @@ func OpenRemoteStoreByJxStatus(ctx *jxcontext.Context, vendorIDs, storeIDs []int
func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) {
storeMap := batchItemList[0].(*model.StoreMap)
if handler, _ := partner.GetPurchasePlatformFromVendorID(storeMap.VendorID).(partner.IStoreHandler); handler != nil {
storeDetail, err := dao.GetStoreDetail(db, storeMap.StoreID, storeMap.VendorID)
storeDetail, err := dao.GetStoreDetail(db, storeMap.StoreID, storeMap.VendorID, "")
if err == nil && storeDetail.Status == model.StoreStatusOpened {
if err = handler.UpdateStoreStatus(ctx, storeMap.VendorOrgCode, storeMap.StoreID, storeMap.VendorStoreID, model.StoreStatusOpened); err == nil {
storeMap.Status = model.StoreStatusOpened

View File

@@ -3,6 +3,7 @@ package cms
import (
"errors"
"fmt"
"github.com/astaxie/beego/server/web"
"regexp"
"sort"
"strings"
@@ -39,9 +40,10 @@ var (
func CreateStoreCategoryByStoreSku(ctx *jxcontext.Context, vendorID, storeID int, vendorStoreID string, nameIDs, skuIDs []int) (err error) {
globals.SugarLogger.Debugf("CreateStoreCategoryByStoreSku vendorID:%d, storeID:%d", vendorID, storeID)
db := dao.GetDB()
txDB, _ := dao.Begin(db)
defer func() {
if r := recover(); r != nil {
dao.Rollback(db)
dao.Rollback(db, txDB)
panic(r)
}
}()
@@ -51,16 +53,17 @@ func CreateStoreCategoryByStoreSku(ctx *jxcontext.Context, vendorID, storeID int
return err
}
if len(localCats) > 0 {
dao.Begin(db)
for _, v := range localCats {
if v.MapID == 0 {
if err = dao.AddStoreCategoryMap(db, storeID, v.ID, vendorID, "", model.SyncFlagNewMask, ctx.GetUserName()); err != nil {
dao.Rollback(db)
dao.Rollback(db, txDB)
return err
}
}
}
dao.Commit(db)
dao.Commit(db, txDB)
} else {
dao.Commit(db, txDB)
}
}
return err
@@ -91,6 +94,10 @@ func SyncStoreCategories(ctx *jxcontext.Context, parentTask tasksch.ITask, vendo
return nil, err
}
}
if vendorID == model.VendorIDEBAI && catInfo.VendorOrgCode == "34665" && catInfo.CityCode == 510100 && catInfo.IsExdSync == 0 {
catInfo.Name = catInfo.ExdName
catInfo.Seq = catInfo.ExdSeq
}
if vendorID != model.VendorIDJD && vendorID != model.VendorIDJDShop {
if catInfo.IsSysCat == model.YES && catInfo.StoreCatID != 0 {
catInfo.Name = catInfo.StoreCatName
@@ -161,11 +168,11 @@ func SyncStoreCategories(ctx *jxcontext.Context, parentTask tasksch.ITask, vendo
return hint, err
}
func SyncStoreSkuNew(ctx *jxcontext.Context, parentTask tasksch.ITask, causeFlag int, vendorID, storeID int, vendorStoreID string, nameIDs, skuIDs, excludeSkuIDs []int, isAsync, isContinueWhenError bool) (hint string, err error) {
return SyncStoreSkuNew2(ctx, parentTask, causeFlag, vendorID, storeID, vendorStoreID, nameIDs, skuIDs, excludeSkuIDs, false, isAsync, isContinueWhenError)
func SyncStoreSkuNew(ctx *jxcontext.Context, parentTask tasksch.ITask, causeFlag int, vendorID, storeID int, vendorStoreID, vendorOrgCode string, nameIDs, skuIDs, excludeSkuIDs []int, isAsync, isContinueWhenError bool) (hint string, err error) {
return SyncStoreSkuNew2(ctx, parentTask, causeFlag, vendorID, storeID, vendorStoreID, vendorOrgCode, nameIDs, skuIDs, excludeSkuIDs, false, isAsync, isContinueWhenError)
}
func SyncStoreSkuNew2(ctx *jxcontext.Context, parentTask tasksch.ITask, causeFlag int, vendorID, storeID int, vendorStoreID string, nameIDs, skuIDs, excludeSkuIDs []int, useVendorPriceDirectly, isAsync, isContinueWhenError bool) (hint string, err error) {
func SyncStoreSkuNew2(ctx *jxcontext.Context, parentTask tasksch.ITask, causeFlag int, vendorID, storeID int, vendorStoreID, vendorOrgCode string, nameIDs, skuIDs, excludeSkuIDs []int, useVendorPriceDirectly, isAsync, isContinueWhenError bool) (hint string, err error) {
singleStoreHandler, _ := partner.GetPurchasePlatformFromVendorID(vendorID).(partner.ISingleStoreStoreSkuHandler)
if singleStoreHandler != nil {
if err = CreateStoreCategoryByStoreSku(ctx, vendorID, storeID, vendorStoreID, nameIDs, skuIDs); err != nil {
@@ -180,7 +187,7 @@ func SyncStoreSkuNew2(ctx *jxcontext.Context, parentTask tasksch.ITask, causeFla
_, err = SyncStoreCategories(ctx, task, vendorID, storeID, vendorStoreID, nameIDs, skuIDs, false, isContinueWhenError)
}
case 1:
err = syncStoreSkuNew(ctx, task, causeFlag, false, vendorID, storeID, nameIDs, skuIDs, excludeSkuIDs, useVendorPriceDirectly, isContinueWhenError)
err = syncStoreSkuNew(ctx, task, causeFlag, false, vendorID, storeID, vendorOrgCode, nameIDs, skuIDs, excludeSkuIDs, useVendorPriceDirectly, isContinueWhenError)
}
return result, err
}, 2)
@@ -202,15 +209,15 @@ func FullSyncStoreSkuNew(ctx *jxcontext.Context, parentTask tasksch.ITask, vendo
case 0:
if singleStoreHandler != nil {
// _, err = ClearRemoteStoreStuffAndSetNew(ctx, task, vendorID, storeID, vendorStoreID, false, isContinueWhenError)
_, err = amendAndPruneStoreStuff(ctx, parentTask, vendorID, storeID, vendorStoreID, false, isContinueWhenError, AmendPruneAll, true)
_, err = amendAndPruneStoreStuff(ctx, parentTask, vendorID, storeID, vendorStoreID, false, isContinueWhenError, AmendPruneAll, false)
} else {
_, err = dao.SetStoreSkuSyncStatus(dao.GetDB(), vendorID, []int{storeID}, nil, model.SyncFlagStoreSkuOnlyMask)
}
case 1:
if singleStoreHandler != nil {
_, err = SyncStoreSkuNew(ctx, task, 0, vendorID, storeID, vendorStoreID, nil, nil, excludeSkuIDs, false, isContinueWhenError)
_, err = SyncStoreSkuNew(ctx, task, 0, vendorID, storeID, vendorStoreID, "", nil, nil, excludeSkuIDs, false, isContinueWhenError)
} else {
err = syncStoreSkuNew(ctx, task, 0, true, vendorID, storeID, nil, nil, excludeSkuIDs, false, isContinueWhenError)
err = syncStoreSkuNew(ctx, task, 0, true, vendorID, storeID, "", nil, nil, excludeSkuIDs, false, isContinueWhenError)
}
}
return retVal, err
@@ -227,7 +234,8 @@ func FullSyncStoreSkuNew(ctx *jxcontext.Context, parentTask tasksch.ITask, vendo
func isStoreSkuSyncNeedDelete(storeSku *dao.StoreSkuSyncInfo) bool {
if model.IsSyncStatusDelete(storeSku.SkuSyncStatus) ||
storeSku.BindDeletedAt != utils.DefaultTimeValue || storeSku.BindID == 0 ||
storeSku.NameID == 0 || storeSku.NameStatus != model.SkuStatusNormal {
storeSku.NameID == 0 {
//|| storeSku.NameStatus != model.SkuStatusNormal {
return true
}
// if storeSku.Status != model.SkuStatusNormal {
@@ -253,10 +261,11 @@ func storeSkuSyncInfo2Bare(inSku *dao.StoreSkuSyncInfo) (outSku *partner.StoreSk
JdsStockSwitch: inSku.JdsStockSwitch,
IsDeletedBySku: inSku.IsDeletedBySku,
Stock: inSku.Stock,
VendorOrgCode: inSku.VendorOrgCode,
}
if !isStoreSkuSyncNeedDelete(inSku) {
outSku.Stock = model.MaxStoreSkuStockQty
}
// if !isStoreSkuSyncNeedDelete(inSku) {
// outSku.Stock = model.MaxStoreSkuStockQty
// }
return outSku
}
@@ -277,15 +286,6 @@ func getSkuBoxFee(vendorID int) (boxFee int64) {
return boxFee
}
func formalizeStoreSkuListForJds(inSkuList []*dao.StoreSkuSyncInfo) []*dao.StoreSkuSyncInfo {
if len(inSkuList) > 0 {
for _, skuItem := range inSkuList {
skuItem.SkuName = jxutils.ComposeSkuNameSync2(skuItem.Prefix, skuItem.Name, skuItem.Comment, skuItem.Unit, skuItem.SpecQuality, skuItem.SpecUnit, 0, skuItem.ExPrefix, skuItem.ExPrefixBegin, skuItem.ExPrefixEnd)
}
}
return inSkuList
}
func formalizeStoreSkuList(inSkuList []*dao.StoreSkuSyncInfo) []*dao.StoreSkuSyncInfo {
if len(inSkuList) > 0 {
boxFee := getSkuBoxFee(inSkuList[0].VendorID)
@@ -298,18 +298,30 @@ func formalizeStoreSkuList(inSkuList []*dao.StoreSkuSyncInfo) []*dao.StoreSkuSyn
skuItem.VendorVendorCatID = utils.Str2Int64(skuItem.SkuVendorMapCatID)
}
skuItem.MergedStatus = jxutils.MergeSkuStatus(jxutils.MergeSkuStatus(skuItem.NameStatus, skuItem.Status), skuItem.StoreSkuStatus)
skuItem.SkuName = jxutils.ComposeSkuNameSync(skuItem.Prefix, skuItem.Name, skuItem.Comment, skuItem.Unit, skuItem.SpecQuality, skuItem.SpecUnit, 0, skuItem.ExPrefix, skuItem.ExPrefixBegin, skuItem.ExPrefixEnd)
skuItem.SkuNameOrigin = jxutils.ComposeSkuNameOriginal(skuItem.Prefix, skuItem.Name, skuItem.Comment, skuItem.Unit, skuItem.SpecQuality, skuItem.SpecUnit, 0)
if skuItem.ImgWatermark != "" && model.IsSyncStatusUpdate(skuItem.SkuSyncStatus) && skuItem.VendorID != model.VendorIDJD {
if utils.Time2Date(time.Now().Add(6*time.Hour)).Sub(*skuItem.ExPrefixBegin) == 0 {
// if utils.Time2Date(time.Now().Add(6*time.Hour)).Sub(*skuItem.ExPrefixBegin) >= 0 && utils.Time2Date(time.Now()).Sub(*skuItem.ExPrefixEnd) <= 0 {
// downLoad, _ := uploadImgStandard(skuItem.ImgWatermark)
skuItem.ImgMix = jxutils.MixWatermarkImg(skuItem.ImgWatermark, skuItem.ImgOrigin, skuItem.ExPrefixBegin, skuItem.ExPrefixEnd)
}
if utils.Time2Date(time.Now().Add(6*time.Hour)).Sub(*skuItem.ExPrefixEnd) > 0 {
skuItem.ImgMix = ""
}
//美团的商品名字都要有 ‘约’
if skuItem.VendorID == model.VendorIDMTWM {
skuItem.SkuName = jxutils.ComposeSkuNameSync2(skuItem.Prefix, skuItem.Name, skuItem.Comment, skuItem.Unit, skuItem.SpecQuality, skuItem.SpecUnit, 0, skuItem.ExPrefix, skuItem.ExPrefixBegin, skuItem.ExPrefixEnd, (skuItem.BrandID == skuItem.ExBrandID && skuItem.ExBrandID != 0) || skuItem.ExBrandID == 0)
} else {
skuItem.SkuName = jxutils.ComposeSkuNameSync(skuItem.Prefix, skuItem.Name, skuItem.Comment, skuItem.Unit, skuItem.SpecQuality, skuItem.SpecUnit, 0, skuItem.ExPrefix, skuItem.ExPrefixBegin, skuItem.ExPrefixEnd, (skuItem.BrandID == skuItem.ExBrandID && skuItem.ExBrandID != 0) || skuItem.ExBrandID == 0)
}
//水果美团标品用原名字
if skuItem.VendorID == model.VendorIDMTWM && web.BConfig.RunMode == "jxgy" && skuItem.Unit != model.UnitNames[0] {
skuItem.SkuName = skuItem.Name
}
skuItem.SkuNameOrigin = jxutils.ComposeSkuNameOriginal(skuItem.Prefix, skuItem.Name, skuItem.Comment, skuItem.Unit, skuItem.SpecQuality, skuItem.SpecUnit, 0)
// if skuItem.ImgWatermark != "" && model.IsSyncStatusUpdate(skuItem.SkuSyncStatus) && skuItem.VendorID != model.VendorIDJD {
if skuItem.VendorID == model.VendorIDJD {
skuItem.ImgMix = ""
}
// if utils.Time2Date(time.Now().Add(6*time.Hour)).Sub(*skuItem.ExPrefixBegin) == 0 {
// // if utils.Time2Date(time.Now().Add(6*time.Hour)).Sub(*skuItem.ExPrefixBegin) >= 0 && utils.Time2Date(time.Now()).Sub(*skuItem.ExPrefixEnd) <= 0 {
// downLoad, _ := uploadImgStandard(skuItem.ImgWatermark)
// skuItem.ImgMix = jxutils.MixWatermarkImg(skuItem.ImgWatermark, skuItem.ImgOrigin, skuItem.ExPrefixBegin, skuItem.ExPrefixEnd)
// }
// if utils.Time2Date(time.Now().Add(6*time.Hour)).Sub(*skuItem.ExPrefixEnd) > 0 {
// skuItem.ImgMix = ""
// }
// }
}
}
return inSkuList
@@ -325,13 +337,13 @@ func sku2Update(vendorID int, sku *dao.StoreSkuSyncInfo, syncStatus int8) (item
sku.SkuSyncStatus = 0
kvs[dao.GetVendorThingIDStructField(model.VendorNames[vendorID])] = utils.Str2Int64WithDefault(sku.VendorSkuID, 0)
} else if model.IsSyncStatusDelete(syncStatus) {
sku.SkuSyncStatus = 0
if utils.IsTimeZero(sku.BindDeletedAt) && (sku.NameID == 0) {
kvs[model.FieldDeletedAt] = time.Now()
}
if !dao.IsVendorThingIDEmpty(sku.VendorSkuID) && !partner.IsMultiStore(vendorID) {
kvs[dao.GetVendorThingIDStructField(model.VendorNames[vendorID])] = 0
}
sku.SkuSyncStatus = sku.SkuSyncStatus & model.SyncFlagNewMask
} else {
sku.SkuSyncStatus = sku.SkuSyncStatus & model.SyncFlagPriceMask
}
@@ -366,7 +378,7 @@ func updateStoreSku(db *dao.DaoDB, vendorID int, storeSkuList []*dao.StoreSkuSyn
// }
// }()
if vendorID == model.VendorIDJDShop {
if syncStatus != model.SyncFlagPriceMask && syncStatus != model.SyncFlagSaleMask {
if syncStatus != model.SyncFlagPriceMask && syncStatus != model.SyncFlagSaleMask && syncStatus != model.SyncFlagStockMask {
for _, v := range storeSkuList {
updateItemList := make([]*dao.KVUpdateItem, len(v.StoreSkuSyncInfoJds))
for k, vv := range v.StoreSkuSyncInfoJds {
@@ -411,10 +423,10 @@ func isSkuLockTimeValid(sku *dao.StoreSkuSyncInfo) bool {
return sku.LockTime != nil && time.Now().Sub(*sku.LockTime) < 0
}
func syncStoreSkuNew(ctx *jxcontext.Context, parentTask tasksch.ITask, causeFlag int, isFull bool, vendorID, storeID int, nameIDs, skuIDs, excludeSkuIDs []int, useVendorPriceDirectly, isContinueWhenError bool) (err error) {
globals.SugarLogger.Debugf("syncStoreSkuNew causeFlag:%d", causeFlag)
func syncStoreSkuNew(ctx *jxcontext.Context, parentTask tasksch.ITask, causeFlag int, isFull bool, vendorID, storeID int, vendorOrgCode string, nameIDs, skuIDs, excludeSkuIDs []int, useVendorPriceDirectly, isContinueWhenError bool) (err error) {
globals.SugarLogger.Debugf("syncStoreSkuNew causeFlag:%d ,vendorOrgCode:%s", causeFlag, vendorOrgCode)
db := dao.GetDB()
storeDetail, err := dao.GetStoreDetail(db, storeID, vendorID)
storeDetail, err := dao.GetStoreDetail(db, storeID, vendorID, vendorOrgCode)
if err != nil {
return err
}
@@ -428,6 +440,7 @@ func syncStoreSkuNew(ctx *jxcontext.Context, parentTask tasksch.ITask, causeFlag
if err != nil || len(skus) == 0 {
return err
}
// globals.SugarLogger.Debugf("syncStoreSkuNew len(skus):%v", len(skus))
if len(excludeSkuIDs) > 0 {
excludeSkuMap := jxutils.IntList2Map(excludeSkuIDs)
var skus2 []*dao.StoreSkuSyncInfo
@@ -461,9 +474,6 @@ func syncStoreSkuNew(ctx *jxcontext.Context, parentTask tasksch.ITask, causeFlag
now := jxutils.OperationTime2HourMinuteFormat(time.Now())
var failedList []*partner.StoreSkuInfoWithErr
for _, sku := range skus {
if vendorID == model.VendorIDJDShop && storeID != model.JdShopMainStoreID {
return
}
if !useVendorPriceDirectly &&
!isSkuLockTimeValid(sku) {
sku.VendorPrice = 0
@@ -472,6 +482,9 @@ func syncStoreSkuNew(ctx *jxcontext.Context, parentTask tasksch.ITask, causeFlag
if vendorID == model.VendorIDMTWM && storeDetail.Status != model.StoreStatusOpened && storeDetail.AutoEnableAt != nil && storeDetail.AutoEnableAt.Sub(specailAutoEnableAt) == 0 && sku.MergedStatus == model.SkuStatusNormal {
sku.MergedStatus = model.SkuStatusDontSale
}
if sku.Status != model.SkuStatusNormal {
sku.MergedStatus = model.SkuStatusDontSale
}
var bareSku *partner.StoreSkuInfo
isNeedReorder := false
if isStoreSkuSyncNeedDelete(sku) {
@@ -530,7 +543,7 @@ func syncStoreSkuNew(ctx *jxcontext.Context, parentTask tasksch.ITask, causeFlag
isAdded2Update := false
// 修改商品信息时不改价(以免活动引起的失败),而用单独的改价来改
if (model.IsSyncStatusUpdate(sku.SkuSyncStatus) || (model.IsSyncStatusSeq(sku.SkuSyncStatus) && reorderHandler == nil)) && singleStoreHandler != nil {
if dao.IsVendorThingIDEmpty(sku.VendorCatID) && !strings.Contains(sku.StoreName, model.ExdStoreName) && vendorID != model.VendorIDYB && vendorID != model.VendorIDJDShop {
if dao.IsVendorThingIDEmpty(sku.VendorCatID) && !strings.Contains(sku.StoreName, model.ExdStoreName) && vendorID != model.VendorIDYB {
// globals.SugarLogger.Warnf("syncStoreSkuNew 修改门店:%d商品:%d但没有平台分类ID", storeID, sku.SkuID)
} else {
isAdded2Update = true
@@ -543,10 +556,10 @@ func syncStoreSkuNew(ctx *jxcontext.Context, parentTask tasksch.ITask, causeFlag
}
if !isAdded2Update {
if model.IsSyncStatusUpdate(sku.SkuSyncStatus) && singleStoreHandler == nil { // 正常就不应该进到这里
if bareSku == nil {
bareSku = storeSkuSyncInfo2Bare(sku)
}
updateItems = append(updateItems, sku2Update(vendorID, sku, model.SyncFlagStockMask))
// if bareSku == nil {
// bareSku = storeSkuSyncInfo2Bare(sku)
// }
// updateItems = append(updateItems, sku2Update(vendorID, sku, model.SyncFlagStockMask))
}
if model.IsSyncStatusSale(sku.SkuSyncStatus) {
if bareSku == nil {
@@ -554,7 +567,7 @@ func syncStoreSkuNew(ctx *jxcontext.Context, parentTask tasksch.ITask, causeFlag
}
if sku.MergedStatus == model.SkuStatusNormal {
onlineList = append(onlineList, bareSku)
// stockList = append(stockList, bareSku)
stockList = append(stockList, bareSku)
} else {
offlineList = append(offlineList, bareSku)
// 因为京东平台以是否有库存表示是否关注,所以不论是否可售,都要设置库存
@@ -563,12 +576,12 @@ func syncStoreSkuNew(ctx *jxcontext.Context, parentTask tasksch.ITask, causeFlag
// }
}
}
if model.IsSyncStatusStock(sku.SkuSyncStatus) {
if bareSku == nil {
bareSku = storeSkuSyncInfo2Bare(sku)
}
stockList = append(stockList, bareSku)
}
//if model.IsSyncStatusStock(sku.SkuSyncStatus) {
// if bareSku == nil {
// bareSku = storeSkuSyncInfo2Bare(sku)
// }
// stockList = append(stockList, bareSku)
//}
}
isNeedReorder = model.IsSyncStatusSeq(sku.SkuSyncStatus)
}
@@ -642,6 +655,9 @@ func syncStoreSkuNew(ctx *jxcontext.Context, parentTask tasksch.ITask, causeFlag
updateList = updateList[:]
updateList = rList2
}
// if configs, err := dao.QueryConfigs(dao.GetDB(), "jdsCookie2", model.ConfigTypeCookie, ""); err == nil {
// api.JdShop2API.SetCookieWithStr(configs[0].Value)
// }
}
task := tasksch.NewParallelTask("syncStoreSkuNew", tasksch.NewParallelConfig().SetParallelCount(1).SetIsContinueWhenError(isContinueWhenError2), ctx,
@@ -653,9 +669,11 @@ func syncStoreSkuNew(ctx *jxcontext.Context, parentTask tasksch.ITask, causeFlag
if len(deleteList) > 0 {
_, err = putils.FreeBatchStoreSkuInfo("删除门店商品", func(task tasksch.ITask, batchedStoreSkuList []*partner.StoreSkuInfo) (result interface{}, successCount int, err error) {
var failedList []*partner.StoreSkuInfoWithErr
if failedList, err = singleStoreHandler.DeleteStoreSkus(ctx, storeID, vendorStoreID, batchedStoreSkuList); singleStoreHandler.IsErrSkuNotExist(err) {
err = nil
failedList = nil // 因为batchSize为1可以这样处理
if failedList, err = singleStoreHandler.DeleteStoreSkus(ctx, storeID, vendorStoreID, batchedStoreSkuList); err != nil {
if singleStoreHandler.IsErrSkuNotExist(err) {
err = nil
failedList = nil // 因为batchSize为1可以这样处理
}
}
failedList, err = buildFailedListAndErr(failedList, err, batchedStoreSkuList, nil, storeID, vendorID, "删除门店商品")
if len(failedList) > 0 {
@@ -731,23 +749,23 @@ func syncStoreSkuNew(ctx *jxcontext.Context, parentTask tasksch.ITask, causeFlag
}, ctx, task, updateList, singleStoreHandler.GetStoreSkusBatchSize(partner.FuncUpdateStoreSkus), isContinueWhenError2)
}
case 3:
for k, list := range [][]*partner.StoreSkuInfo{stockList /*, onlineList*/} {
if len(list) > 0 {
_, err = putils.FreeBatchStoreSkuInfo("更新门店商品库存", func(task tasksch.ITask, batchedStoreSkuList []*partner.StoreSkuInfo) (result interface{}, successCount int, err error) {
var failedList []*partner.StoreSkuInfoWithErr
failedList, err = storeSkuHandler.UpdateStoreSkusStock(ctx, storeDetail.VendorOrgCode, storeID, vendorStoreID, batchedStoreSkuList)
failedList, err = buildFailedListAndErr(failedList, err, batchedStoreSkuList, nil, storeID, vendorID, "更新门店商品库存")
if len(failedList) > 0 {
task.AddFailedList(failedList)
}
successList := putils.UnselectStoreSkuListByVendorSkuIDs(batchedStoreSkuList, GetVendorSkuIDList(failedList))
if k == 0 && len(successList) > 0 {
updateStoreSku(dao.GetDB(), vendorID, bareSku2Sync(successList), model.SyncFlagStockMask)
}
return nil, len(successList), err
}, ctx, task, list, storeSkuHandler.GetStoreSkusBatchSize(partner.FuncUpdateStoreSkusStock), isContinueWhenError2)
}
// for k, list := range [][]*partner.StoreSkuInfo{stockList /*, onlineList*/} {
if len(stockList) > 0 {
_, err = putils.FreeBatchStoreSkuInfo("更新门店商品库存", func(task tasksch.ITask, batchedStoreSkuList []*partner.StoreSkuInfo) (result interface{}, successCount int, err error) {
var failedList []*partner.StoreSkuInfoWithErr
failedList, err = storeSkuHandler.UpdateStoreSkusStock(ctx, storeDetail.VendorOrgCode, storeID, vendorStoreID, batchedStoreSkuList)
failedList, err = buildFailedListAndErr(failedList, err, batchedStoreSkuList, nil, storeID, vendorID, "更新门店商品库存")
if len(failedList) > 0 {
task.AddFailedList(failedList)
}
successList := putils.UnselectStoreSkuListByVendorSkuIDs(batchedStoreSkuList, GetVendorSkuIDList(failedList))
if len(successList) > 0 {
updateStoreSku(dao.GetDB(), vendorID, bareSku2Sync(successList), model.SyncFlagStockMask)
}
return nil, len(successList), err
}, ctx, task, stockList, storeSkuHandler.GetStoreSkusBatchSize(partner.FuncUpdateStoreSkusStock), isContinueWhenError2)
}
// }
case 4, 5:
statusList := onlineList
status := model.SkuStatusNormal
@@ -905,7 +923,7 @@ func amendAndPruneStoreStuff(ctx *jxcontext.Context, parentTask tasksch.ITask, v
return "", fmt.Errorf("平台:%s不支持此操作", model.VendorChineseNames[vendorID])
}
db := dao.GetDB()
storeDetail, err := dao.GetStoreDetail(db, storeID, vendorID)
storeDetail, err := dao.GetStoreDetail(db, storeID, vendorID, "")
if err != nil {
return "", err
}
@@ -924,7 +942,13 @@ func amendAndPruneStoreStuff(ctx *jxcontext.Context, parentTask tasksch.ITask, v
}
localSkuMap := make(map[string]*dao.StoreSkuSyncInfo)
for _, v := range localSkuList {
localSkuMap[v.VendorSkuID] = v
vendorSkuID := v.VendorSkuID
if vendorID == model.VendorIDJDShop {
if storeSkus, _ := dao.GetStoresSkusInfo(db, []int{model.JdShopMainStoreID}, []int{v.SkuID}); len(storeSkus) > 0 {
vendorSkuID = utils.Int64ToStr(storeSkus[0].JdsID)
}
}
localSkuMap[vendorSkuID] = v
}
remoteSkuList, err2 := handler.GetStoreSkusFullInfo(ctx, task, storeID, vendorStoreID, nil)
@@ -1361,7 +1385,7 @@ func SyncStoreSkuBindAct(ctx *jxcontext.Context, parentTask tasksch.ITask, isCre
subTask := tasksch.NewParallelTask(fmt.Sprintf("%s门店:%d", taskName, storeID), nil, ctx,
func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) {
vendorID := batchItemList[0].(int)
storeDetail, err := dao.GetStoreDetail(db, storeID, vendorID)
storeDetail, err := dao.GetStoreDetail(db, storeID, vendorID, "")
if err == nil {
if isCreate {
err = createStoreSkuActs2(ctx, task, vendorID, storeDetail.VendorOrgCode, storeID, storeDetail.VendorStoreID, storeSkuMap[storeID][vendorID], storeSkuActMap[storeID][vendorID])
@@ -1439,6 +1463,7 @@ func changeList2Jds(list []*dao.StoreSkuSyncInfo) (rList []*dao.StoreSkuSyncInfo
storeSku.DescImg = v[0].DescImg
storeSku.JdsWareID = v[0].JdsWareID
storeSku.CategoryName = v[0].CategoryName
storeSku.VendorOrgCode = v[0].VendorOrgCode
rList = append(rList, storeSku)
}
return rList

View File

@@ -58,7 +58,7 @@ func getStoreSkus(db *dao.DaoDB, storeID int, skuIDs []int) (skus []*dao.StoreSk
func SyncStoreSku4FakeJD(ctx *jxcontext.Context, parentTask tasksch.ITask, storeID int, vendorStoreID string, inSkuMap map[int]string, isContinueWhenError bool) (err error) {
vendorID := model.VendorIDJD
db := dao.GetDB()
storeDetail, err := dao.GetStoreDetail(db, storeID, vendorID)
storeDetail, err := dao.GetStoreDetail(db, storeID, vendorID, "")
if err != nil {
return err
}
@@ -299,24 +299,24 @@ func UploadFakeJdThingMap(ctx *jxcontext.Context, reader io.Reader, isSyncNow, i
}
db := dao.GetDB()
dao.Begin(db)
txDB , _ := dao.Begin(db)
defer func() {
if r := recover(); r != nil {
dao.Rollback(db)
dao.Rollback(db, txDB)
panic(r)
}
}()
_, err = dao.ExecuteSQL(db, "DELETE t1 FROM fake_jd_thing_map t1")
if err != nil {
dao.Rollback(db)
dao.Rollback(db, txDB)
return "", err
}
err = dao.CreateMultiEntities(db, thingMapList)
if err != nil {
dao.Rollback(db)
dao.Rollback(db, txDB)
return "", err
}
dao.Commit(db)
dao.Commit(db, txDB)
if isSyncNow {
if storeMap, skuMap, err2 := getFakeThingMap(ctx, db); err2 == nil {

View File

@@ -79,10 +79,10 @@ package cms
// if err = err2; err == nil || err == orm.ErrNoRows {
// user.JxStoreID = storeID
// if err == nil {
// dao.Begin(db)
// txDB , _ := dao.Begin(db)
// defer func() {
// if r := recover(); r != nil {
// dao.Rollback(db)
// dao.Rollback(db, txDB)
// panic(r)
// }
// }()
@@ -90,9 +90,9 @@ package cms
// err = dao.SetWeiXinsEmpty2Null(db, user)
// }
// if err != nil {
// dao.Rollback(db)
// dao.Rollback(db, txDB)
// } else {
// dao.Commit(db)
// dao.Commit(db, txDB)
// }
// } else {
// // globals.SugarLogger.Debug(utils.Format4Output(user, false))

View File

@@ -1,13 +1,22 @@
package cms
import (
"encoding/base64"
"encoding/json"
"errors"
"fmt"
"git.rosy.net.cn/baseapi/platformapi/alipayapi"
"git.rosy.net.cn/baseapi/platformapi/qywxapi"
"git.rosy.net.cn/jx-callback/business/auth2/authprovider/alipay"
"git.rosy.net.cn/jx-callback/business/jxutils/ddmsg"
beego "github.com/astaxie/beego/server/web"
"sort"
"strings"
"sync"
"time"
"git.rosy.net.cn/jx-callback/business/jxstore/permission"
"git.rosy.net.cn/jx-callback/business/partner/purchase/jd"
"git.rosy.net.cn/jx-callback/globals/api/apimanager"
@@ -179,7 +188,7 @@ func RegisterUserWithMobile(ctx *jxcontext.Context, user *model.User, mobileVeri
return nil, err
}
if mobileAuth != nil && !mobileAuth.IsUserEmpty() {
return nil, jsonerr.New(mobileAuth, model.ErrCodeJsonUserAlreadyExist)
return mobileAuth, jsonerr.New(mobileAuth, model.ErrCodeJsonUserAlreadyExist)
// auth2.RemoveUserInfo(mobileAuth.Token)
// if newAuthInfo, err := auth2.BindUser(mobileAuth, user); err == nil {
@@ -190,7 +199,7 @@ func RegisterUserWithMobile(ctx *jxcontext.Context, user *model.User, mobileVeri
// }
}
} else if inAuthInfo != nil {
user.Mobile = nil
// user.Mobile = nil
} else {
return nil, fmt.Errorf("短信验证码与其它认证方式至少要指定一种")
}
@@ -198,6 +207,7 @@ func RegisterUserWithMobile(ctx *jxcontext.Context, user *model.User, mobileVeri
if inAuthInfo != nil {
if inAuthInfo.AuthBindInfo.Type == dingding.AuthTypeStaff {
user.Type |= model.UserTypeOperator
user.Type |= model.UserTypeRole
} else if user.Mobile != nil {
user.Type |= model.UserTypeStoreBoss
}
@@ -218,7 +228,17 @@ func RegisterUserWithMobile(ctx *jxcontext.Context, user *model.User, mobileVeri
outAuthInfo, err = auth2.BindUser(inAuthInfo, user)
}
} else if dao.IsDuplicateError(err) {
err = auth2.ErrUserID2AlreadyExist
if user.LastLoginType != "" && user.LastLoginType == alipay.AuthType {
if user2, _ := dao.GetUserByID(dao.GetDB(), "mobile", user.GetMobile()); user2 != nil {
user.UserID = user2.GetID()
outAuthInfo, err = auth2.BindUser(inAuthInfo, user)
err = nil
} else {
err = auth2.ErrUserID2AlreadyExist
}
} else {
err = auth2.ErrUserID2AlreadyExist
}
}
return outAuthInfo, err
}
@@ -227,7 +247,7 @@ func TryAddStoreBossRole4User(ctx *jxcontext.Context, user *model.User) (err err
if user.Type&model.UserTypeStoreBoss != 0 {
userMobile := user.GetMobile()
if userMobile != "" {
if storeList, err := dao.GetStoreList(dao.GetDB(), nil, nil, nil, []string{userMobile}, ""); err == nil && len(storeList) > 0 {
if storeList, err := dao.GetStoreList(dao.GetDB(), nil, nil, nil, nil, []string{userMobile}, ""); err == nil && len(storeList) > 0 {
roleList := make([]*authz.RoleInfo, len(storeList))
for k, v := range storeList {
roleList[k] = autils.NewStoreBossRole(v.ID)
@@ -246,6 +266,14 @@ func TryAddStoreBossRole4StoreByMobile(ctx *jxcontext.Context, storeID int, mobi
if v != "" {
if userList, _, err := dao.GetUsers(dao.GetDB(), model.UserTypeStoreBoss, "", nil, nil, []string{v}, 0, -1); err == nil && len(userList) > 0 {
userIDs = append(userIDs, userList[0].GetID())
} else {
if manTokenInfo, err := auth2.GetTokenInfo(ctx.GetToken()); err == nil {
RegisterUserWithMobile(ctx, &model.User{
Name: v,
Mobile: &v,
UserID2: v,
}, "", nil, manTokenInfo)
}
}
}
}
@@ -383,6 +411,25 @@ func CreateUser(user *model.User, creatorName string) (err error) {
if user.GetEmail() == "" {
user.Email = nil
}
//支付宝注册电话需要解密
if user.GetMobile() != "" && user.GetName() != "" && user.GetID2() != "" {
if user.LastLoginType != "" && user.LastLoginType == alipay.AuthType {
mobile := &alipayapi.KeyMobile{}
data, _ := base64.StdEncoding.DecodeString(user.GetMobile())
key, _ := base64.StdEncoding.DecodeString(alipay.AuthKey)
iv := []byte{}
iv = append(iv, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)
if result, err := utils.AESCBCDecpryt(data, key, iv); err == nil && result != nil {
json.Unmarshal(result, &mobile)
}
if mobile.Mobile == "" {
return fmt.Errorf("支付宝注册解密失败!")
}
user.Mobile = &mobile.Mobile
user.UserID2 = mobile.Mobile
user.Name = mobile.Mobile
}
}
dao.WrapAddIDCULDEntity(user, creatorName)
user.UserID = utils.GetUUID()
user.Status = model.UserStatusNormal
@@ -420,6 +467,8 @@ func OnDingDingMsg(msg map[string]interface{}) (callbackResponse *dingdingapi.Ca
}
}
}
} else if eventType == dingdingapi.CBTagCheckURL {
return api.DingDingAPI.PackCallbackResult("success")
}
return api.DingDingAPI.Err2CallbackResponse(nil)
}
@@ -455,16 +504,23 @@ func GetStoreList4User(ctx *jxcontext.Context, mobileNum, userID string) (storeL
return storeList, err
}
func GetMyStoreListNew(ctx *jxcontext.Context) (storesInfo interface{}, errCode string, err error) {
func GetMyStoreListNew(ctx *jxcontext.Context, version string) (storesInfo interface{}, errCode string, err error) {
if !auth2.IsV2Token(ctx.GetToken()) {
return nil, model.ErrCodeTokenIsInvalid, model.ErrTokenIsInvalid
}
mobileNum, userID := ctx.GetMobileAndUserID()
if mobileNum == "" {
if ctx.GetLoginType() == weixin.AuthTypeWxApp {
if configs, _ := dao.QueryConfigs(dao.GetDB(), "checkversion", model.ConfigTypeSys, ""); len(configs) > 0 {
if version == "" || configs[0].Value != version {
return nil, "", fmt.Errorf("当前APP版本过旧数据显示有错误请到'京西菜市'公众号下载最新版本APP")
}
}
}
mobile, userID := ctx.GetMobileAndUserID()
if mobile == "" {
return nil, "", fmt.Errorf("不能得到用户手机号")
}
var storeList []*dao.StoreWithCityName
if storeList, err = GetStoreList4User(ctx, mobileNum, userID); err == nil && len(storeList) > 0 {
if storeList, err = GetStoreList4User(ctx, mobile, userID); err == nil && len(storeList) > 0 {
// todo应该用通用方法
mapDataList := make([]map[string]interface{}, len(storeList))
for k, v := range storeList {
@@ -484,6 +540,11 @@ func GetMyStoreListNew(ctx *jxcontext.Context) (storesInfo interface{}, errCode
return storesInfo, "", err
}
func SolveNullMobileUser(ctx *jxcontext.Context) (err error) {
return err
}
func GetStoreRoleList(ctx *jxcontext.Context) (roleList []*authz.RoleInfo, err error) {
return authz.StoreRoleList, nil
}
@@ -561,6 +622,14 @@ func AddUsers4Role(ctx *jxcontext.Context, r *authz.RoleInfo, userIDList []strin
errList := errlist.New()
for _, v := range userIDList {
// if permission.IsRoledByUserID(v) {
// if storeIDsMap, err := permission.GetUserStoresResultMap(v); err == nil {
// if storeIDsMap[r.StoreID] == 0 {
// return fmt.Errorf("此用户没有该门店[%v]的权限,无法添加到分组", r.StoreID)
// }
// }
// }
if err = checkUserType(v, model.UserTypeNonConsumer); err != nil {
return err
}
@@ -610,25 +679,25 @@ func AddUserDeliveryAddress(ctx *jxcontext.Context, address *model.UserDeliveryA
address.AutoAddress, address.DistrictCode, address.CityCode, err = getAddressInfoFromCoord(db, lng, lat)
if err == nil {
globals.SugarLogger.Debugf("AddUserDeliveryAddress2 address:%s", utils.Format4Output(address, true))
dao.Begin(db)
txDB, _ := dao.Begin(db)
defer func() {
if r := recover(); r != nil {
dao.Rollback(db)
dao.Rollback(db, txDB)
panic(r)
}
}()
dao.WrapAddIDCULDEntity(address, ctx.GetUserName())
if address.IsDefault == 1 {
if err = dao.ClearUserDeliveryAddressDefault(db, address.UserID, 0); err != nil {
dao.Rollback(db)
dao.Rollback(db, txDB)
return nil, err
}
}
if err = dao.CreateEntity(db, address); err == nil {
dao.Commit(db)
dao.Commit(db, txDB)
outAddress = address
} else {
dao.Rollback(db)
dao.Rollback(db, txDB)
}
}
globals.SugarLogger.Debugf("AddUserDeliveryAddress3 address:%s", utils.Format4Output(address, true))
@@ -683,23 +752,23 @@ func UpdateUserDeliveryAddress(ctx *jxcontext.Context, userID string, addressID
return err
}
}
dao.Begin(db)
txDB, _ := dao.Begin(db)
defer func() {
if r := recover(); r != nil {
dao.Rollback(db)
dao.Rollback(db, txDB)
panic(r)
}
}()
if utils.ForceInterface2Int64(valid["isDefault"]) == 1 {
if err = dao.ClearUserDeliveryAddressDefault(db, userID, 0); err != nil {
dao.Rollback(db)
dao.Rollback(db, txDB)
return err
}
}
if _, err = dao.UpdateEntityLogically(db, address, valid, ctx.GetUserName(), nil); err == nil {
dao.Commit(db)
dao.Commit(db, txDB)
} else {
dao.Rollback(db)
dao.Rollback(db, txDB)
}
}
}
@@ -738,10 +807,10 @@ func SaveUserCart(ctx *jxcontext.Context, userID string, storeID int, cartItems
dao.WrapAddIDCULEntity(v, userID)
}
db := dao.GetDB()
dao.Begin(db)
txDB, _ := dao.Begin(db)
defer func() {
if r := recover(); r != nil || err != nil {
dao.Rollback(db)
dao.Rollback(db, txDB)
if r != nil {
panic(r)
}
@@ -759,7 +828,7 @@ func SaveUserCart(ctx *jxcontext.Context, userID string, storeID int, cartItems
err = dao.CreateMultiEntities(db, cartItems)
}
if err == nil {
dao.Commit(db)
dao.Commit(db, txDB)
}
return err
}
@@ -782,7 +851,7 @@ func GetSelfInfo(ctx *jxcontext.Context) (getSelfInfoResult *dao.GetSelfInfoResu
tokenInfo, err := auth2.GetTokenInfo(ctx.GetToken())
if err == nil {
if getSelfInfoResult, err = dao.GetUserByIDWithMembers(dao.GetDB(), "user_id", tokenInfo.GetID()); err == nil {
if userMembers, err3 := dao.GetUserMember(dao.GetDB(), getSelfInfoResult.UserID, "", 0, model.YES); err3 == nil {
if userMembers, err3 := dao.GetUserMember(dao.GetDB(), getSelfInfoResult.UserID, "", "", model.VendorIDJX, 0, model.YES); err3 == nil {
getSelfInfoResult.UserMembers = userMembers
} else {
err = err3
@@ -818,7 +887,7 @@ func HandleUserWXRemark(db *dao.DaoDB, mobile string, mobileIsUerID bool) (err e
}
}
if userID != "" {
authBindList, err2 := dao.GetUserBindAuthInfo(db, userID, model.AuthBindTypeAuth, []string{weixin.AuthTypeMP}, "", "", "")
authBindList, err2 := dao.GetUserBindAuthInfo(db, userID, model.AuthBindTypeAuth, []string{weixin.AuthTypeMP}, "", "", nil)
if err = err2; err == nil {
for _, v := range authBindList {
openIDs = append(openIDs, v.AuthID)
@@ -986,14 +1055,14 @@ func WriteToExcelJd(task *tasksch.SeqTask, jd []JdUserStruct) (err error) {
func UpdateUserWxNoAndPercent(user *model.User, isReceiver bool) (num int64, err error) {
db := dao.GetDB()
user2, err := dao.GetUserByID(db, "user_id", user.UserID)
auth, err := dao.GetUserBindAuthInfo(db, user.UserID, model.AuthBindTypeAuth, []string{"weixinmini"}, "", "", "wx4b5930c13f8b1170")
auth, err := dao.GetUserBindAuthInfo(db, user.UserID, model.AuthBindTypeAuth, []string{"weixinmini"}, "", "", []string{"wx4b5930c13f8b1170"})
if len(auth) == 0 {
return 0, fmt.Errorf("未找到此用户的微信验证方式用户ID[%v]\n", user.UserID)
}
dao.Begin(db)
txDB, _ := dao.Begin(db)
defer func() {
if r := recover(); r != nil || err != nil {
dao.Rollback(db)
dao.Rollback(db, txDB)
if r != nil {
panic(r)
}
@@ -1003,12 +1072,12 @@ func UpdateUserWxNoAndPercent(user *model.User, isReceiver bool) (num int64, err
num2, err := dao.UpdateEntity(db, user2, "DividePercentage")
num += num2
if err != nil {
dao.Rollback(db)
dao.Rollback(db, txDB)
}
if isReceiver {
}
dao.Commit(db)
dao.Commit(db, txDB)
return num, err
}
@@ -1135,7 +1204,7 @@ func RefreshUserMemberStatus(ctx *jxcontext.Context) (err error) {
var (
db = dao.GetDB()
)
userMembers, err := dao.GetUserMember(db, "", "", model.MemberTypeDiscountCard, -1)
userMembers, err := dao.GetUserMember(db, "", "", "", -1, model.MemberTypeDiscountCard, -1)
for _, userMember := range userMembers {
if time.Now().Sub(userMember.EndAt) > 0 {
userMember.DeletedAt = time.Now()
@@ -1144,3 +1213,158 @@ func RefreshUserMemberStatus(ctx *jxcontext.Context) (err error) {
}
return err
}
func UpdateUserLastInfo(ctx *jxcontext.Context, storeID, brandID int) (err error) {
var (
db = dao.GetDB()
)
if user, err := dao.GetUserByID(db, "user_id", ctx.GetUserID()); err == nil {
if storeID != 0 {
user.LastStoreID = storeID
_, err = dao.UpdateEntity(db, user, "LastStoreID")
}
if brandID != 0 {
user.LastBrandID = brandID
_, err = dao.UpdateEntity(db, user, "LastBrandID")
}
}
return err
}
func GetUserStoreAuth(ctx *jxcontext.Context, storeID int) (outStoreID int, err error) {
if permission.IsRoled(ctx) {
storeMap, _ := permission.GetUserStoresResultMap(ctx.GetUserID())
if storeMap[storeID] != 0 {
return storeID, err
} else {
return 0, err
}
}
return storeID, err
}
func SendQywxPeopleCount(ctx *jxcontext.Context) (err error) {
var (
db = dao.GetDB()
groupIDMap = make(map[string][]interface{})
)
if beego.BConfig.RunMode == "jxgy" {
groupIDMap[qywxapi.GyGroupID] = []interface{}{1, "京西果园"}
} else {
groupIDMap[qywxapi.BldGroupID] = []interface{}{7, "京西超市"}
groupIDMap[qywxapi.CsGroupID] = []interface{}{1, "京西菜市"}
}
//先找出群组中所有的unionID
for groupID, list := range groupIDMap {
var (
unionIDMap = make(map[string]string)
mobileMap = make(map[string]string)
mobileExistMap = make(map[string]string)
mobiles []string
)
stores, _ := dao.GetStoreList(db, nil, nil, []int{model.StoreStatusOpened}, []int{int(utils.Interface2Int64WithDefault(list[0], 0))}, nil, "")
for _, store := range stores {
if store.Tel1 != "" {
mobileMap[store.Tel1] = store.Tel1
}
if store.Tel2 != "" {
mobileMap[store.Tel2] = store.Tel2
}
}
group, _ := api.QywxAPI.Groupchat(groupID)
for _, member := range group.GroupChat.MemberList {
if member.UnionID != "" {
unionIDMap[member.UnionID] = member.UnionID
}
}
//再找出群组中所有unionID对应的电话
for _, v := range unionIDMap {
binds, _ := dao.GetUserBindAuthInfo(db, "", model.AuthBindTypeAuth, nil, "", v, nil)
if len(binds) > 0 {
user, _ := dao.GetUserByID(db, "user_id", binds[0].UserID)
if user != nil && user.Mobile != nil {
mobileExistMap[*user.Mobile] = *user.Mobile
}
}
}
for _, v := range mobileMap {
if mobileExistMap[v] == "" {
mobiles = append(mobiles, v)
}
}
//最后找出已有门店电话不在已有群组里的发消息
userMobileMap := make(map[string][]*model.Store)
for _, v := range mobiles {
store := &model.Store{}
sql := `
SELECT * FROM store WHERE (tel1 = ? OR tel2 = ?) AND deleted_at = ?
`
sqlParams := []interface{}{v, v, utils.DefaultTimeValue}
dao.GetRow(db, &store, sql, sqlParams)
if store != nil {
if mobileExistMap[store.Tel1] != "" || mobileExistMap[store.Tel2] != "" {
continue
}
//发消息
var (
userIDMap = make(map[string]string)
)
operatorRoleList := []string{store.OperatorRole, store.OperatorRole2, store.OperatorRole3}
for _, vv := range operatorRoleList {
var (
roleList []*authz.RoleInfo
)
if vv != "" {
roleList = append(roleList, autils.NewRole(vv, 0))
if userIDMap2, err := GetRolesUserList(jxcontext.AdminCtx, roleList); err == nil {
for _, w := range userIDMap2 {
for _, ww := range w {
userIDMap[ww] = ww
}
}
}
}
//noticeMsg := fmt.Sprintf("您有负责的商家还未加入相应的[%s]沟通群门店ID :[%d],门店名:[%s],商家电话:[%s,%s]", list[1].(string), store.ID, store.Name, store.Tel1, store.Tel2)
user2, err := dao.GetUserByID(db, "mobile", store.MarketManPhone)
if err == nil {
userIDMap[user2.UserID] = user2.UserID
for _, v := range userIDMap {
userMobileMap[v] = append(userMobileMap[v], store)
//if api.DingDingAPI.GetToken() != "" {
//ddmsg.SendUserMessage(dingdingapi.MsgTyeText, v, "您有商家还未加入企业微信群", noticeMsg)
//}
}
}
}
}
}
//一次发太多了,尝试分组发
groupList := []string{}
groupListAll := [][]string{}
for k, v := range userMobileMap {
msg := fmt.Sprintf("您有负责的商家还未加入相应的[%s]沟通群,门店信息 :", list[1].(string))
for i := 0; i < len(v); i++ {
if (i+1)%25 != 0 {
msg += utils.Int2Str(v[i].ID) + "" + v[i].Name + ",商家电话:" + v[i].Tel1 + "" + v[i].Tel2 + ",平台负责人:" + v[i].MarketManPhone + ""
} else {
groupList = append(groupList, k, msg)
groupListAll = append(groupListAll, groupList)
groupList = []string{}
msg = fmt.Sprintf("您有负责的商家还未加入相应的[%s]沟通群,门店信息 :", list[1].(string))
msg += utils.Int2Str(v[i].ID) + "" + v[i].Name + ",商家电话:" + v[i].Tel1 + "" + v[i].Tel2 + ",平台负责人:" + v[i].MarketManPhone + ""
}
if i == len(v)-1 {
groupList = append(groupList, k, msg)
groupListAll = append(groupListAll, groupList)
}
}
}
for _, v := range groupListAll {
if api.DingDingAPI.GetToken() != "" {
ddmsg.SendUserMessage(dingdingapi.MsgTyeText, v[0], "您有商家还未加入企业微信群", v[1])
}
}
}
return err
}

View File

@@ -67,7 +67,7 @@ func GetNearSupplyGoodsStoreByStoreID(ctx *jxcontext.Context, storeID int) (stor
stores []*model.Store
db = dao.GetDB()
)
store2, _ := dao.GetStoreDetail(db, storeID, model.VendorIDJX)
store2, _ := dao.GetStoreDetail(db, storeID, model.VendorIDJX, "")
if store2 == nil {
return nil, fmt.Errorf("该门店未绑定京西平台storeID: %v", storeID)
}
@@ -109,7 +109,7 @@ func GetNearSupplyGoodsStoreByStoreID(ctx *jxcontext.Context, storeID int) (stor
return store, err
}
func GetStoreListByLocation(ctx *jxcontext.Context, lng, lat float64, maxRadius int, needWalkDistance, isJds bool) (storeList []*Store4User, err error) {
func GetStoreListByLocation(ctx *jxcontext.Context, lng, lat float64, maxRadius int, needWalkDistance, isJds bool, brandID int) (storeList []*Store4User, err error) {
const (
maxStoreCount4User = 5
)
@@ -134,14 +134,20 @@ func GetStoreListByLocation(ctx *jxcontext.Context, lng, lat float64, maxRadius
WHERE t1.deleted_at = ? AND t1.status <> ? AND t1.lng > ? AND t1.lng < ? AND t1.lat > ? AND t1.lat < ?
AND sm.is_order <> ?
AND t1.id <> ?
ORDER BY t1.id
`
sqlParams = []interface{}{
sqlParams = append(sqlParams,
model.VendorIDJX, utils.DefaultTimeValue, model.StoreStatusDisabled,
utils.DefaultTimeValue, model.StoreStatusDisabled, jxutils.StandardCoordinate2Int(lng1), jxutils.StandardCoordinate2Int(lng2), jxutils.StandardCoordinate2Int(lat1), jxutils.StandardCoordinate2Int(lat2),
model.YES,
model.MatterStoreID,
)
if brandID != 0 {
sql += " AND t1.brand_id = ?"
sqlParams = append(sqlParams, brandID)
}
sql += `
ORDER BY t1.id
`
} else {
sql = `
SELECT t1.*,
@@ -179,12 +185,12 @@ func GetStoreListByLocation(ctx *jxcontext.Context, lng, lat float64, maxRadius
city.name city_name
FROM store t1
JOIN place city ON city.code = t1.city_code
WHERE t1.deleted_at = ? AND t1.status <> ? AND t1.id = ?
WHERE t1.deleted_at = ? AND t1.id = ?
`
sqlParams2 := []interface{}{
// model.VendorIDJX, utils.DefaultTimeValue, model.StoreStatusDisabled,
utils.DefaultTimeValue,
model.StoreStatusDisabled,
// model.StoreStatusDisabled,
// jxutils.StandardCoordinate2Int(0),
// jxutils.StandardCoordinate2Int(10000),
// jxutils.StandardCoordinate2Int(0),
@@ -224,3 +230,60 @@ func GetStoreListByLocation(ctx *jxcontext.Context, lng, lat float64, maxRadius
}
return storeList, err
}
func GetVendorOrgCode(ctx *jxcontext.Context, vendorID int, vendorOrgCode, vendorType string) (vendorOrgs []*model.VendorOrgCode, err error) {
return dao.GetVendorOrgCode(dao.GetDB(), vendorID, vendorOrgCode, vendorType)
}
func UpdateVendorOrgCode(ctx *jxcontext.Context, ID int, payload map[string]interface{}) (err error) {
var (
db = dao.GetDB()
vendorOrgCode = &model.VendorOrgCode{}
)
vendorOrgCode.ID = ID
err = dao.GetEntity(db, vendorOrgCode)
valid := dao.StrictMakeMapByStructObject(payload, vendorOrgCode, ctx.GetUserName())
if len(valid) > 0 {
if valid["key"] != nil {
valid["vendorOrgCode"] = valid["key"]
delete(valid, "key")
}
if valid["code"] != nil {
valid["vendorID"] = valid["code"]
delete(valid, "code")
}
if valid["name"] != nil {
valid["comment"] = valid["name"]
delete(valid, "name")
}
txDB, _ := dao.Begin(db)
defer func() {
if r := recover(); r != nil {
dao.Rollback(db, txDB)
panic(r)
}
}()
if _, err = dao.UpdateEntityLogically(db, vendorOrgCode, valid, ctx.GetUserName(), nil); err != nil {
dao.Rollback(db, txDB)
return err
}
dao.Commit(db, txDB)
}
return err
}
func AddVendorOrgCode(ctx *jxcontext.Context, vendorOrgCode *model.VendorOrgCode) (err error) {
var (
db = dao.GetDB()
)
list, err := dao.GetVendorOrgCode(db, vendorOrgCode.VendorID, vendorOrgCode.VendorOrgCode, model.VendorOrgTypePlatform)
if err != nil {
return err
}
if len(list) > 0 {
return fmt.Errorf("库里有这个账号了,[%v]", vendorOrgCode.VendorOrgCode)
}
dao.WrapAddIDCULDEntity(vendorOrgCode, ctx.GetUserName())
dao.CreateEntity(db, vendorOrgCode)
return err
}

View File

@@ -67,45 +67,45 @@ func AddOperateEvent(ctx *jxcontext.Context, accessUUID, jsonData string, errCod
ErrMsg: errMsg,
UseTime: useTime,
}
dao.Begin(db)
txDB , _ := dao.Begin(db)
defer func() {
if r := recover(); r != nil {
dao.Rollback(db)
dao.Rollback(db, txDB)
panic(r)
}
}()
err = dao.CreateEntity(db, event)
dao.Commit(db)
dao.Commit(db, txDB)
return err
}
func AddOperateEventDetail(db *dao.DaoDB, operateEventDetail *model.OperateEventDetail) (err error) {
dao.Begin(db)
txDB , _ := dao.Begin(db)
defer func() {
if r := recover(); r != nil {
dao.Rollback(db)
dao.Rollback(db, txDB)
panic(r)
}
}()
operateEventDetail.BeforeData = utils.LimitUTF8StringLen(operateEventDetail.BeforeData, 3200)
operateEventDetail.AfterData = utils.LimitUTF8StringLen(operateEventDetail.AfterData, 3200)
err = dao.CreateEntity(db, operateEventDetail)
dao.Commit(db)
dao.Commit(db, txDB)
return err
}
func DeleteOperateEventAndDetail(ctx *jxcontext.Context, deleteTime time.Time) (err error) {
db := dao.GetDB()
dao.Begin(db)
txDB , _ := dao.Begin(db)
defer func() {
if r := recover(); r != nil {
dao.Rollback(db)
dao.Rollback(db, txDB)
panic(r)
}
}()
dao.DeleteOperateEventDetail(db, deleteTime)
dao.DeleteOperateEvent(db, deleteTime)
dao.Commit(db)
dao.Commit(db, txDB)
return err
}

View File

@@ -50,10 +50,10 @@ func InitPlace(ctx *jxcontext.Context) (err error) {
}
placeList = placeList[0].Districts
db := dao.GetDB()
dao.Begin(db)
txDB , _ := dao.Begin(db)
defer func() {
if r := recover(); r != nil || err != nil {
dao.Rollback(db)
dao.Rollback(db, txDB)
if r != nil {
panic(r)
}
@@ -129,7 +129,7 @@ func InitPlace(ctx *jxcontext.Context) (err error) {
return err
}
}
dao.Commit(db)
dao.Commit(db, txDB)
return err
}
@@ -146,10 +146,10 @@ func InitVendorCategory(ctx *jxcontext.Context, vendorID int, isAsync bool) (hin
}
case 1:
db := dao.GetDB()
dao.Begin(db)
txDB , _ := dao.Begin(db)
defer func() {
if r := recover(); r != nil || err != nil {
dao.Rollback(db)
dao.Rollback(db, txDB)
if r != nil {
panic(r)
}
@@ -169,7 +169,7 @@ func InitVendorCategory(ctx *jxcontext.Context, vendorID int, isAsync bool) (hin
if err = dao.CreateMultiEntities(db, cats); err != nil {
return nil, err
}
dao.Commit(db)
dao.Commit(db, txDB)
}
return nil, err
}, 2)

View File

@@ -0,0 +1,119 @@
package knowledge
import (
"fmt"
"git.rosy.net.cn/baseapi/platformapi/weixinapi"
"git.rosy.net.cn/jx-callback/business/jxutils/jxcontext"
"git.rosy.net.cn/jx-callback/business/jxutils/weixinmsg"
"git.rosy.net.cn/jx-callback/business/model"
"git.rosy.net.cn/jx-callback/business/model/dao"
"git.rosy.net.cn/jx-callback/globals/api"
"mime/multipart"
"net/http"
)
func GetKnowledgeDepot(ctx *jxcontext.Context, keyword string, offset, pageSize int) (page *model.PagedInfo, err error) {
return dao.GetKnowledgeDepot(dao.GetDB(), keyword, offset, pageSize)
}
func AddKnowledgeDepot(ctx *jxcontext.Context, title, content string) (err error) {
var (
db = dao.GetDB()
)
know := &model.KnowledgeDepot{
Title: title,
Content: content,
}
dao.WrapAddIDCULDEntity(know, ctx.GetUserName())
dao.CreateEntity(db, know)
return err
}
func UpdateKnowledgeDepot(ctx *jxcontext.Context, id int, content string, isDel bool) (err error) {
var (
db = dao.GetDB()
know = &model.KnowledgeDepot{}
)
know.ID = id
err = dao.GetEntity(db, know)
if isDel {
dao.DeleteEntity(db, know)
} else {
if content != know.Content {
know.Content = content
dao.UpdateEntity(db, know, "Content")
}
}
return err
}
type SNSUploadImgResult struct {
URL string `json:"url"`
MediaID string `json:"mediaID"`
}
func SNSUploadImg(ctx *jxcontext.Context, files []*multipart.FileHeader, isThumb bool) (snsUploadImgResult *SNSUploadImgResult, err error) {
var (
fileHeader = files[0]
fileName = fileHeader.Filename
data = make([]byte, fileHeader.Size)
)
snsUploadImgResult = &SNSUploadImgResult{}
file, err := fileHeader.Open()
file.Read(data)
if len(data) == 0 {
return snsUploadImgResult, fmt.Errorf("未读取到文件!")
}
//如果不是缩略图只会返url
//如果是封面缩略图则还会返mediaID
if !isThumb {
if url, err := api.WeixinAPI.CBUploadImg(data, fileName, http.DetectContentType(data)); err == nil && url != "" {
snsUploadImgResult.URL = url
}
} else {
if mediaID, url, err := api.WeixinAPI.CBUploadThumb(data, fileName, http.DetectContentType(data)); err == nil && url != "" && mediaID != "" {
snsUploadImgResult.URL = url
snsUploadImgResult.MediaID = mediaID
}
}
file.Close()
return snsUploadImgResult, err
}
func AddMaterial(ctx *jxcontext.Context, knowIDs []int, param *weixinapi.CBAddNewsParam) (err error) {
var (
db = dao.GetDB()
content = ""
)
if len(knowIDs) == 0 {
return fmt.Errorf("请至少勾选一条!")
}
knows, err := dao.GetKnowledgeDepotNoPage(db, knowIDs)
for k, v := range knows {
if k != 0 {
content += weixinapi.SNSCutLine
}
content += v.Content
}
if content != "" {
param.Content = content
api.WeixinAPI.CBAddNews(param)
} else {
return fmt.Errorf("读取内容错误!")
}
return err
}
func SendSNSMediaMsg(ctx *jxcontext.Context, storeIDs []int, mediaID string) (err error) {
var (
openIDs []string
)
for _, v := range storeIDs {
if results := weixinmsg.GetWeixinOpenIDsFromStoreID(v); len(results) > 0 {
openIDs = append(openIDs, results...)
}
}
if len(openIDs) > 0 {
return weixinmsg.MediaMessageSendGroup(openIDs, mediaID)
}
return err
}

View File

@@ -2,7 +2,6 @@ package misc
import (
"fmt"
"strings"
"sync"
"time"
@@ -13,8 +12,6 @@ import (
"git.rosy.net.cn/jx-callback/business/partner/purchase/jx/localjx"
"git.rosy.net.cn/jx-callback/globals/api"
"git.rosy.net.cn/jx-callback/business/jxstore/event"
"git.rosy.net.cn/jx-callback/business/jxstore/report"
"git.rosy.net.cn/baseapi/utils"
@@ -32,7 +29,7 @@ import (
"git.rosy.net.cn/jx-callback/business/netspider"
"git.rosy.net.cn/jx-callback/business/partner"
"git.rosy.net.cn/jx-callback/globals"
"github.com/astaxie/beego"
beego "github.com/astaxie/beego/server/web"
)
const (
@@ -45,10 +42,10 @@ var (
"09:00:00",
}
dailyWorkTimeList = []string{
"20:30:00",
"21:30:00",
}
dailyWorkTimeList2 = []string{
"02:00:00",
"2:00:00",
}
priceReferTimeList = []string{
"03:00:00",
@@ -124,19 +121,20 @@ var (
cancelPayTimeOutOrderList = localjx.GetHalfHoursList()
discountActJxList = localjx.GetDiscountActHoursList()
ebaiStorePageCookieExdTOKEN string
ebaiStorePageCookieWMUSS2 string
ebaiStorePageCookieWMSTOKEN2 string
ebaiStorePageCookieWMUSS string
ebaiStorePageCookieWMSTOKEN string
mtwmCookieStr string
mtpsStoreToken string
jd2StorePageCookie string
JdStorePageCookie string
yinbaoCookie string
feiePageCookie string
jdStorePageEarning string
jdsCookie string
//ebaiStorePageCookieExdTOKEN string
//ebaiStorePageCookieWMUSS2 string
//ebaiStorePageCookieWMSTOKEN2 string
ebaiStorePageCookie string
//ebaiStorePageCookieWMSTOKEN string
mtwmCookieStr string
mtpsStoreToken string
jd2StorePageCookie string
JdStorePageCookie string
yinbaoCookie string
feiePageCookie string
jdStorePageEarning string
//jdsCookie string
// jdsCookie2 string
)
func GetImportantTaskID(taskName string) string {
@@ -162,13 +160,7 @@ func IsImportantTaskRunning(taskName string) bool {
func Init() {
if globals.IsProductEnv() {
ScheduleTimerFunc("doDailyWork", doDailyWork, dailyWorkTimeList)
ScheduleTimerFunc("doDailyWork2", doDailyWork2, dailyWorkTimeList2)
// ScheduleTimerFuncByInterval(func() {
// orderman.SaveJdsOrders(jxcontext.AdminCtx, time.Now().Add(-20*time.Minute), time.Now())
// }, 10*time.Second, 10*time.Minute)
//ScheduleTimerFunc("doDailyWork2", doDailyWork2, dailyWorkTimeList2)
//京东的订单信息解密密钥获取
ScheduleTimerFuncByInterval(func() {
@@ -177,20 +169,38 @@ func Init() {
ScheduleTimerFuncByInterval(func() {
RefreshRealMobile(jxcontext.AdminCtx, model.VendorIDEBAI, time.Now().Add(-24*time.Hour), utils.DefaultTimeValue, false, true)
report.RefreshStoreManageState(jxcontext.AdminCtx, nil, []int{model.VendorIDJD})
}, 5*time.Second, 1*time.Hour)
ScheduleTimerFuncByInterval(func() {
defsch.FixedScheduler.ConfirmSelfTakeOrders(jxcontext.AdminCtx, []int{model.VendorIDJD}, time.Now().Add(-48*time.Hour), time.Now().Add(-30*time.Minute), true, true)
}, 5*time.Second, 10*time.Minute)
ScheduleTimerFuncByInterval(func() {
report.RefreshStoreManageState(jxcontext.AdminCtx, nil, []int{model.VendorIDMTWM, model.VendorIDEBAI})
}, 5*time.Second, 40*time.Minute)
ScheduleTimerFuncByInterval(func() {
curDate := utils.Time2Date(time.Now())
orderman.FixedOrderManager.AmendMissingOrders(jxcontext.AdminCtx, []int{model.VendorIDJD, model.VendorIDMTWM, model.VendorIDEBAI}, 0, curDate, curDate, true, true)
orderman.SaveJdsOrders(jxcontext.AdminCtx, time.Now().Add(-30*time.Minute), time.Now())
}, 5*time.Second, 10*time.Minute)
ScheduleTimerFunc("RefreshJdShopOrdersEarningPrice", func() {
orderman.RefreshJdShopOrdersEarningPrice(jxcontext.AdminCtx, utils.Time2Str(time.Now().AddDate(0, 0, -2)), utils.Time2Str(time.Now().AddDate(0, 0, -2)))
orderman.RefreshJdShopOrdersEarningPrice(jxcontext.AdminCtx, utils.Time2Str(time.Now().AddDate(0, 0, -1)), utils.Time2Str(time.Now().AddDate(0, 0, -1)))
}, []string{
"05:00:00",
})
ScheduleTimerFunc("auto enable remote store", func() {
cms.EnableHaveRestStores(jxcontext.AdminCtx, false, true)
cms.OpenRemoteStoreByJxStatus(jxcontext.AdminCtx, nil, nil, false, false, true)
// cms.OpenRemoteStoreByJxStatus(jxcontext.AdminCtx, nil, nil, false, false, true)
}, openRemoteStoreTimeList)
ScheduleTimerFunc("SaveAndSendAlarmVendorSnapshot", func() {
cms.SaveAndSendAlarmVendorSnapshot(jxcontext.AdminCtx, nil, nil, false)
}, cms.WatchVendorStoreTimeList)
// ScheduleTimerFunc("SaveAndSendAlarmVendorSnapshot", func() {
// cms.SaveAndSendAlarmVendorSnapshot(jxcontext.AdminCtx, nil, nil, false)
// }, cms.WatchVendorStoreTimeList)
ScheduleTimerFunc("RefreshPageActs", func() {
act.RefreshPageActs(jxcontext.AdminCtx, []int{model.VendorIDEBAI}, time.Now().Add(-30*24*time.Hour), false)
@@ -199,7 +209,7 @@ func Init() {
dao.UpdateActStatusByTime(dao.GetDB(), time.Now())
}, updateActStatusTimeList)
ScheduleScoreStore()
ScheduleCheckStoreAlert()
// ScheduleCheckStoreAlert()
ScheduleTimerFunc("ChangeStoreSkuSaleStatus", func() {
cms.CurVendorSync.ChangeStoreSkuSaleStatus(jxcontext.AdminCtx, 0, true, true)
}, ChangeStoreSkuSaleStatusList)
@@ -212,15 +222,15 @@ func Init() {
ScheduleTimerFunc("AutoFocusStoreSkusForTopSkus", func() {
cms.AutoFocusStoreSkusForTopSkus(jxcontext.AdminCtx, true, true)
}, createStorePriceTimeList)
ScheduleTimerFunc("GetCheckVendorCookie", func() {
event.GetCheckVendorCookie(jxcontext.AdminCtx, []int{model.VendorIDEBAI, model.VendorIDJD, model.VendorIDMTWM, model.VendorIDMTPS, model.VendorIDJDShop}, true)
}, checkCookieList)
ScheduleTimerFunc("SendSeckillSkusCountMsg", func() {
cms.SendSeckillSkusCountMsg(jxcontext.AdminCtx, []int{model.VendorIDEBAI, model.VendorIDJD, model.VendorIDMTWM}, false, true)
}, sendSecKillWarnList)
ScheduleTimerFunc("每日报警心跳", func() {
globals.SugarLogger.Warnf("每日报警心跳,这不是报警。启动时间:%s", cms.GetServiceInfo(jxcontext.AdminCtx)["startupTime"])
}, dailyHeartbeat)
//ScheduleTimerFunc("GetCheckVendorCookie", func() {
// event.GetCheckVendorCookie(jxcontext.AdminCtx, []int{model.VendorIDEBAI, model.VendorIDJD, model.VendorIDMTWM, model.VendorIDMTPS, model.VendorIDJDShop}, true)
//}, checkCookieList)
//ScheduleTimerFunc("SendSeckillSkusCountMsg", func() {
// cms.SendSeckillSkusCountMsg(jxcontext.AdminCtx, []int{model.VendorIDEBAI, model.VendorIDJD, model.VendorIDMTWM}, false, true)
//}, sendSecKillWarnList)
// ScheduleTimerFunc("每日报警心跳", func() {
// globals.SugarLogger.Warnf("每日报警心跳,这不是报警。启动时间:%s", cms.GetServiceInfo(jxcontext.AdminCtx)["startupTime"])
// }, dailyHeartbeat)
ScheduleTimerFunc("AutoPayForPopluarMan", func() {
localjx.AutoPayForPopluarMan(jxcontext.AdminCtx)
}, autoPayForPopluarManList)
@@ -230,46 +240,97 @@ func Init() {
ScheduleTimerFunc("BackUpStoreSkuBind", func() {
cms.BackUpStoreSkuBind(jxcontext.AdminCtx, true, true)
}, backUpStoreSkuBindList)
ScheduleTimerFunc("SendNoCatSkusToOperater", func() {
cms.SendNoCatSkusToOperater(jxcontext.AdminCtx)
}, autoPayForPopluarManList)
// ScheduleTimerFunc("SendNoCatSkusToOperater", func() {
// cms.SendNoCatSkusToOperater(jxcontext.AdminCtx)
// }, autoPayForPopluarManList)
ScheduleTimerFunc("CleanStoreIsBoughtMatter", func() {
cms.CleanStoreIsBoughtMatter(jxcontext.AdminCtx)
}, priceReferTimeList)
ScheduleTimerFunc("CleanUserOrderSMSMark", func() {
cms.CleanUserOrderSMSMark(jxcontext.AdminCtx)
}, priceReferTimeList)
ScheduleTimerFunc("exSync", func() {
var (
db = dao.GetDB()
storeList []int
exSyncStoreIDList string
syncFlag = 0
)
syncFlag = model.SyncFlagPriceMask
if (time.Now().Unix()/24*3600)%10 == 0 {
syncFlag |= model.SyncFlagSaleMask
}
if configs, err := dao.QueryConfigs(dao.GetDB(), "exSyncStoreIDList", model.ConfigTypeSys, ""); err == nil {
exSyncStoreIDList = configs[0].Value
}
storeIDList := strings.Split(exSyncStoreIDList, ",")
for _, v := range storeIDList {
storeList = append(storeList, int(utils.Str2Int64(v)))
}
cms.CurVendorSync.SyncStoresSkus2(jxcontext.AdminCtx, nil, 0, db, partner.GetMultiStoreVendorIDs(), storeList, false, nil, []int{27379}, syncFlag, true, true)
}, exSyncList)
ScheduleTimerFunc("CreateOrderByPriceDefend", func() {
localjx.CreateOrderByPriceDefend(jxcontext.AdminCtx)
}, []string{
"22:00:00",
})
ScheduleTimerFunc("ChangeJxPriceByDiscountAct", func() {
act.ChangeJxPriceByDiscountAct(jxcontext.AdminCtx)
}, discountActJxList)
//ScheduleTimerFunc("ChangeJxPriceByDiscountAct", func() {
// act.ChangeJxPriceByDiscountAct(jxcontext.AdminCtx)
//}, discountActJxList)
ScheduleTimerFunc("RefreshUserMemberStatus", func() {
cms.RefreshUserMemberStatus(jxcontext.AdminCtx)
}, updateActStatusTimeList)
//刷优惠券状态
ScheduleTimerFunc("RefreshCouponsStatus", func() {
localjx.RefreshCouponsStatus(jxcontext.AdminCtx)
}, updateActStatusTimeList)
//刷新美团商超门店Token
ScheduleTimerFunc("RefreshMTWMToken", func() {
cms.RefreshMTWMToken(jxcontext.AdminCtx)
}, updateActStatusTimeList)
//获取最新平台流量活动
ScheduleTimerFunc("GetNewVendorPopActs", func() {
act.GetNewVendorPopActs(jxcontext.AdminCtx)
}, dailyHeartbeat)
//企业微信群人数通告
ScheduleTimerFunc("SendQywxPeopleCount", func() {
cms.SendQywxPeopleCount(jxcontext.AdminCtx)
}, dailyHeartbeat)
//刷新京东售后单结算价
ScheduleTimerFunc("RefreshJdAfsOrderTotalShopMoney", func() {
orderman.RefreshJdAfsOrderTotalShopMoney()
}, openRemoteStoreTimeList)
ScheduleTimerFunc("doDailyWork1", func() {
//同步商品额外前缀和水印图(打标记)
cms.SyncSkuExperfixAndWatermark(jxcontext.AdminCtx)
}, dailyWorkTimeList)
ScheduleTimerFunc("BuildFakeMatterOrder", func() {
orderman.BuildFakeMatterOrder()
}, []string{
"09:00:00",
"15:00:00",
"23:00:00",
})
ScheduleTimerFunc("doDailyWork2", func() {
//刷新京东会员
//report.RefreshJDMembers(jxcontext.AdminCtx)
cms.SetSingleStoreSkuSyncModifyStatus(dao.GetDB(), []int{1, 3})
cms.CurVendorSync.SyncStoresSkus2(jxcontext.AdminCtx, nil, 0, dao.GetDB(), []int{1, 3}, nil, false, nil, nil, model.SyncFlagSaleMask, true, true)
}, dailyWorkTimeList)
ScheduleTimerFunc("doDailyWork3", func() {
dao.SetStoresMapSyncStatus(dao.GetDB(), nil, nil, model.SyncFlagStoreStatus)
cms.CurVendorSync.SyncStore2(jxcontext.AdminCtx, dao.GetDB(), []int{model.VendorIDMTWM, model.VendorIDJD, model.VendorIDEBAI}, nil, true, true)
syncStoreSku()
InitEx()
cms.SyncStoresCourierInfo(jxcontext.AdminCtx, nil, false, true)
netprinter.RebindAllPrinters(jxcontext.AdminCtx, false, true)
}, dailyWorkTimeList)
ScheduleTimerFunc("doDailyWork4", func() {
curDate := utils.Time2Date(time.Now())
orderman.FixedOrderManager.AmendMissingOrders(jxcontext.AdminCtx, []int{model.VendorIDJD, model.VendorIDMTWM, model.VendorIDEBAI}, 0, curDate.Add(-72*time.Hour), curDate, true, true)
//只传toDate默认刷新toDate到5天以前的订单
orderman.RefreshOrdersWithoutJxStoreID(jxcontext.AdminCtx, "", "", true, true)
//禁用没有绑定的门店
cms.DisabledStoreWithoutVendor(jxcontext.AdminCtx, true, true)
}, dailyWorkTimeList)
ScheduleTimerFunc("doDailyWork5", func() {
//刷新物料订单状态
localjx.RefreshAllMatterOrderStatus(jxcontext.AdminCtx)
//同步美团配送与否状态及美团门店是否存在
//cms.SetMTPSStatus(jxcontext.AdminCtx, 0, 0)
cms.SetMTPSStatus2(0)
//售后单如果超过12小时没有审核就自动通过
RefreshAfsOrderStatusAccess(jxcontext.AdminCtx)
//刷新门店分组管理
cms.RefreshStoreBind(jxcontext.AdminCtx)
}, dailyWorkTimeList)
ScheduleTimerFunc("RrefreshMtwmVendorAct", func() {
//刷新美团平台活动
act.RrefreshMtwmVendorAct()
//刷新饿百平台活动
act.RrefreshEbaiVendorAct()
}, dailyWorkTimeList2)
}
ScheduleTimerFunc("AutoSaleStoreSku", func() {
cms.AutoSaleStoreSku(jxcontext.AdminCtx, nil, false)
@@ -281,41 +342,35 @@ func Init() {
}, dailyWorkTimeList)
}
if beego.BConfig.RunMode == "beta" {
ScheduleTimerFunc("CancelPayTimeOutOrder", func() {
localjx.CancelPayTimeOutOrder(jxcontext.AdminCtx)
}, cancelPayTimeOutOrderList)
//ScheduleTimerFunc("CancelPayTimeOutOrder", func() {
// localjx.CancelPayTimeOutOrder(jxcontext.AdminCtx)
//}, cancelPayTimeOutOrderList)
ScheduleTimerFunc("GetAndStoreCitiesShops", func() {
netspider.GetAndStoreCitiesShops(jxcontext.AdminCtx, nil, nil, 0, 0, false, false)
}, []string{
"04:05:06",
})
//京东的订单信息解密密钥获取
ScheduleTimerFuncByInterval(func() {
jdshop.InitKey()
}, 10*time.Second, 8*time.Hour)
//ScheduleTimerFuncByInterval(func() {
// jdshop.InitKey()
//}, 10*time.Second, 8*time.Hour)
ScheduleTimerFunc("ChangeJxPriceByDiscountAct", func() {
act.ChangeJxPriceByDiscountAct(jxcontext.AdminCtx)
}, discountActJxList)
ScheduleTimerFunc("CreateOrderByPriceDefend", func() {
localjx.CreateOrderByPriceDefend(jxcontext.AdminCtx)
//ScheduleTimerFunc("CreateOrderByPriceDefend", func() {
// localjx.CreateOrderByPriceDefend(jxcontext.AdminCtx)
//}, []string{
// "22:00:00",
//})
//刷新门店数据坐标等
ScheduleTimerFunc("RefreshPageStore", func() {
cms.RefreshPageStore()
}, []string{
"22:00:00",
"20:00:00",
})
}
if configs, err := dao.QueryConfigs(dao.GetDB(), "ebaiStorePageCookieExdTOKEN", model.ConfigTypeCookie, ""); err == nil {
ebaiStorePageCookieExdTOKEN = configs[0].Value
}
if configs, err := dao.QueryConfigs(dao.GetDB(), "ebaiStorePageCookieWMUSS2", model.ConfigTypeCookie, ""); err == nil {
ebaiStorePageCookieWMUSS2 = configs[0].Value
}
if configs, err := dao.QueryConfigs(dao.GetDB(), "ebaiStorePageCookieWMSTOKEN2", model.ConfigTypeCookie, ""); err == nil {
ebaiStorePageCookieWMSTOKEN2 = configs[0].Value
}
if configs, err := dao.QueryConfigs(dao.GetDB(), "ebaiStorePageCookieWMUSS", model.ConfigTypeCookie, ""); err == nil {
ebaiStorePageCookieWMUSS = configs[0].Value
}
if configs, err := dao.QueryConfigs(dao.GetDB(), "ebaiStorePageCookieWMSTOKEN", model.ConfigTypeCookie, ""); err == nil {
ebaiStorePageCookieWMSTOKEN = configs[0].Value
if configs, err := dao.QueryConfigs(dao.GetDB(), "ebaiStorePageCookie", model.ConfigTypeCookie, ""); err == nil {
ebaiStorePageCookie = configs[0].Value
}
if configs, err := dao.QueryConfigs(dao.GetDB(), "mtwmCookieStr", model.ConfigTypeCookie, ""); err == nil {
mtwmCookieStr = configs[0].Value
@@ -335,26 +390,28 @@ func Init() {
if configs, err := dao.QueryConfigs(dao.GetDB(), "feiePageCookie", model.ConfigTypeCookie, ""); err == nil {
feiePageCookie = configs[0].Value
}
if configs, err := dao.QueryConfigs(dao.GetDB(), "jdsCookie", model.ConfigTypeCookie, ""); err == nil {
jdsCookie = configs[0].Value
api.JdShopAPI.SetCookieWithStr(jdsCookie)
}
if configs, err := dao.QueryConfigs(dao.GetDB(), "yinbaoCookie", model.ConfigTypeCookie, ""); err == nil {
yinbaoCookie := configs[0].Value
api.YinBaoAPI.SetCookie(".POSPALAUTH30220", yinbaoCookie)
}
//if configs, err := dao.QueryConfigs(dao.GetDB(), "jdsCookie", model.ConfigTypeCookie, ""); err == nil {
// jdsCookie = configs[0].Value
// api.JdShopAPI.SetCookieWithStr(jdsCookie)
//}
//if configs, err := dao.QueryConfigs(dao.GetDB(), "yinbaoCookie", model.ConfigTypeCookie, ""); err == nil {
// yinbaoCookie := configs[0].Value
// api.YinBaoAPI.SetCookie(".POSPALAUTH30220", yinbaoCookie)
//}
if globals.Jd2OrgCode != "" {
api.Jd2API.SetJdCookie(jd2StorePageCookie)
}
api.EbaiAPI.SetCookie("PASSPORT_DELIMONT_TOKEN", ebaiStorePageCookieExdTOKEN)
api.EbaiAPI.SetCookie("WMUSS", ebaiStorePageCookieWMUSS)
api.EbaiAPI.SetCookie("WMSTOKEN", ebaiStorePageCookieWMSTOKEN)
api.Ebai2API.SetCookie("PASSPORT_DELIMONT_TOKEN", ebaiStorePageCookieExdTOKEN)
api.Ebai2API.SetCookie("WMUSS", ebaiStorePageCookieWMUSS2)
api.Ebai2API.SetCookie("WMSTOKEN", ebaiStorePageCookieWMSTOKEN2)
//api.EbaiAPI.SetCookie("PASSPORT_DELIMONT_TOKEN", ebaiStorePageCookieExdTOKEN)
//api.EbaiAPI.SetCookie("WMUSS", ebaiStorePageCookieWMUSS)
//api.EbaiAPI.SetCookie("WMSTOKEN", ebaiStorePageCookieWMSTOKEN)
//api.Ebai2API.SetCookie("PASSPORT_DELIMONT_TOKEN", ebaiStorePageCookieExdTOKEN)
//api.Ebai2API.SetCookie("WMUSS", ebaiStorePageCookieWMUSS2)
//api.Ebai2API.SetCookie("WMSTOKEN", ebaiStorePageCookieWMSTOKEN2)
api.EbaiAPI.SetCookieWithStr(ebaiStorePageCookie)
api.MtwmAPI.SetCookieWithStr(mtwmCookieStr)
api.MtpsAPI.SetCookie("token", mtpsStoreToken)
api.JdAPI.SetJdCookie(JdStorePageCookie)
//api.JdAPI.SetJdCookie(JdStorePageCookie)
api.JdAPI.SetCookieWithStr(JdStorePageCookie)
api.JdAPI.SetCookie("user", jdStorePageEarning)
api.JdPageAPI.SetCookie(jdapi.AccessStorePageCookieName, JdStorePageCookie)
api.JdPageAPI.SetCookie(jdapi.AccessStorePageCookieName2, JdStorePageCookie)
@@ -363,10 +420,14 @@ func Init() {
func syncStoreSku() {
syncFlag := 0
// syncFlag := model.SyncFlagPriceMask
// if (time.Now().Unix()/24*3600)%10 == 0 {
// syncFlag |= model.SyncFlagSaleMask
// }
if beego.BConfig.RunMode == "jxgy" {
//syncFlag = model.SyncFlagPriceMask
if true {
syncFlag |= model.SyncFlagSaleMask
}
} else {
syncFlag |= model.SyncFlagSaleMask
}
task := tasksch.NewParallelTask("同步京西与平台数据", nil, jxcontext.AdminCtx,
func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) {
step := batchItemList[0].(int)
@@ -374,23 +435,25 @@ func syncStoreSku() {
db := dao.GetDB()
switch step {
case 0:
errList.AddErr(cms.DeleteSkuNameExPrefixOverdue(db))
errList.AddErr(cms.SetMultiStoreSkuSyncModifyStatus(db, partner.GetMultiStoreVendorIDs()))
if beego.BConfig.RunMode != "jxgy" {
errList.AddErr(cms.DeleteSkuNameExPrefixOverdue(db))
errList.AddErr(cms.SetMultiStoreSkuSyncModifyStatus(db, partner.GetMultiStoreVendorIDs()))
_, err = cms.CurVendorSync.LoopMultiStoresVendors(jxcontext.AdminCtx, db, "同步多门店平台商品库", false, true,
func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) {
vendorInfo := batchItemList[0].(*cms.MultiStoreVendorInfo)
_, err = cms.FullSyncVendorStuff(jxcontext.AdminCtx, task, vendorInfo.VendorID, vendorInfo.OrgCode, false, true)
return retVal, err
})
errList.AddErr(err)
_, err = cms.CurVendorSync.LoopMultiStoresVendors(jxcontext.AdminCtx, db, "同步多门店平台商品库", false, true,
func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) {
vendorInfo := batchItemList[0].(*cms.MultiStoreVendorInfo)
_, err = cms.FullSyncVendorStuff(jxcontext.AdminCtx, task, 0, vendorInfo.VendorID, vendorInfo.OrgCode, false, true)
return retVal, err
})
errList.AddErr(err)
_, err = cms.CurVendorSync.SyncStoresSkus2(jxcontext.AdminCtx, nil, 0, db, []int{0}, nil, false, nil, []int{27379}, syncFlag, true, true)
// _, err = cms.CurVendorSync.FullSyncStoresSkus(jxcontext.AdminCtx, db, partner.GetMultiStoreVendorIDs(), nil, false, []int{27379}, true, true)
errList.AddErr(err)
_, err = cms.CurVendorSync.SyncStoresSkus2(jxcontext.AdminCtx, nil, 0, db, []int{0}, nil, false, nil, []int{27379}, syncFlag, true, true)
//_, err = cms.CurVendorSync.FullSyncStoresSkus(jxcontext.AdminCtx, db, partner.GetMultiStoreVendorIDs(), nil, false, []int{27379}, true, true)
errList.AddErr(err)
}
case 1:
//TODO 暂时不同步银豹可能要从银豹到京西2020-04-27
errList.AddErr(cms.SetSingleStoreSkuSyncModifyStatus(db, []int{1, 3}))
//errList.AddErr(cms.SetSingleStoreSkuSyncModifyStatus(db, []int{1, 3}))
// errList.AddErr(cms.SetSingleStoreSkuSyncModifyStatus(db, partner.GetSingleStoreVendorIDs()))
// _, err = cms.CurVendorSync.AmendAndPruneStoreStuff(jxcontext.AdminCtx, []int{1, 3}, nil, false, true, cms.AmendPruneAll, false)
@@ -399,11 +462,11 @@ func syncStoreSku() {
errList.AddErr(err)
SaveImportantTaskID(TaskNameSyncStoreSku, SpecialTaskID)
taskID, err2 := cms.CurVendorSync.SyncStoresSkus2(jxcontext.AdminCtx, nil, 0, db, []int{1, 3, 5}, nil, false, nil, nil, syncFlag, true, true)
//taskID, err2 := cms.CurVendorSync.SyncStoresSkus2(jxcontext.AdminCtx, nil, 0, db, []int{1, 3}, nil, false, nil, nil, syncFlag, true, true)
// taskID, err2 := cms.CurVendorSync.SyncStoresSkus2(jxcontext.AdminCtx, nil, 0, db, partner.GetSingleStoreVendorIDs(), nil, false, nil, nil, syncFlag, true, true)
errList.AddErr(err2)
SaveImportantTaskID(TaskNameSyncStoreSku, taskID)
//errList.AddErr(err2)
//SaveImportantTaskID(TaskNameSyncStoreSku, taskID)
}
err = errList.GetErrListAsOne()
return retVal, err
@@ -413,11 +476,14 @@ func syncStoreSku() {
func doDailyWork2() {
globals.SugarLogger.Debug("doDailyWork2")
if beego.BConfig.RunMode == "jxgy" {
syncStoreSku()
refreshPointOrderNewEarningPrice()
}
//同步京东商城门店的商品
cms.CurVendorSync.SyncJdsStoresSkus(jxcontext.AdminCtx, nil, true, true)
// cms.CurVendorSync.SyncJdsStoresSkus(jxcontext.AdminCtx, nil, true, true)
//刷新京东商城的门店库存
cms.SyncJdsStoreStock(jxcontext.AdminCtx, true, true)
// cms.SyncJdsStoreStock(jxcontext.AdminCtx, true, true)
}
func doDailyWork() {
@@ -427,22 +493,24 @@ func doDailyWork() {
cms.SyncSkuExperfixAndWatermark(jxcontext.AdminCtx)
dao.SetStoresMapSyncStatus(dao.GetDB(), nil, nil, model.SyncFlagStoreStatus)
cms.CurVendorSync.SyncStore2(jxcontext.AdminCtx, dao.GetDB(), nil, nil, true, true)
cms.CurVendorSync.SyncStore2(jxcontext.AdminCtx, dao.GetDB(), []int{model.VendorIDMTWM, model.VendorIDJD, model.VendorIDEBAI}, nil, true, true)
syncStoreSku()
if beego.BConfig.RunMode == "prod" {
syncStoreSku()
}
InitEx()
cms.SyncStoresCourierInfo(jxcontext.AdminCtx, nil, false, true)
netprinter.RebindAllPrinters(jxcontext.AdminCtx, false, true)
// 每天补全前一天与当天的订单
curDate := utils.Time2Date(time.Now())
orderman.FixedOrderManager.AmendMissingOrders(jxcontext.AdminCtx, nil, 0, curDate.Add(-72*time.Hour), curDate, true, true)
// curDate := utils.Time2Date(time.Now())
// orderman.FixedOrderManager.AmendMissingOrders(jxcontext.AdminCtx, nil, 0, curDate.Add(-72*time.Hour), curDate, true, true)
//订单门店归属补漏
//fromDate, toDate都不传默认刷新当前天5天以前的订单只传fromDate默认刷新fromDate到当天的订单
//只传toDate默认刷新toDate到5天以前的订单
orderman.RefreshOrdersWithoutJxStoreID(jxcontext.AdminCtx, "", "", true, true)
//刷新京东门店的等级
cms.RefreshJdLevel(jxcontext.AdminCtx)
// cms.RefreshJdLevel(jxcontext.AdminCtx)
//删除操作日志
// event.DeleteOperateEventAndDetail(jxcontext.AdminCtx, time.Now().AddDate(0, -3, 0))
//禁用没有绑定的门店
@@ -451,14 +519,38 @@ func doDailyWork() {
localjx.RefreshAllMatterOrderStatus(jxcontext.AdminCtx)
//同步银豹到京西
// cms.CurVendorSync.SyncStoreSkusFromYb(jxcontext.AdminCtx, nil, true, true)
//刷新京东商城订单结算价
orderman.RefreshJdShopOrdersEarningPrice(jxcontext.AdminCtx, time.Now().AddDate(0, 0, -2).Format("20060102"), time.Now().Format("20060102"))
//同步上架京东商城待售商品
cms.RefreshJdsSkusStatus(jxcontext.AdminCtx)
// cms.RefreshJdsSkusStatus(jxcontext.AdminCtx)
//同步美团配送与否状态及美团门店是否存在
cms.SetMTPSStatus(jxcontext.AdminCtx, 0, 0)
//售后单如果超过12小时没有审核就自动通过
RefreshAfsOrderStatusAccess(jxcontext.AdminCtx)
//刷新京东商城订单结算价
orderman.RefreshJdShopOrdersEarningPrice(jxcontext.AdminCtx, utils.Time2Str(time.Now().AddDate(0, 0, -2)), utils.Time2Str(time.Now()))
//刷新门店分组管理
cms.RefreshStoreBind(jxcontext.AdminCtx)
//刷新京东会员
report.RefreshJDMembers(jxcontext.AdminCtx)
}
func refreshPointOrderNewEarningPrice() {
var (
db = dao.GetDB()
orders []*model.GoodsOrder
)
sql := `
SELECT * FROM goods_order WHERE earning_type = 2 AND status = 110 AND order_created_at > ?
`
sqlParams := []interface{}{time.Now().AddDate(0, 0, -1)}
dao.GetRows(db, &orders, sql, sqlParams)
if len(orders) > 0 {
for _, v := range orders {
if v.NewEarningPrice == 0 {
v.NewEarningPrice = int64(int(v.TotalShopMoney) * (100 - v.OrderPayPercentage/2) / 100)
dao.UpdateEntity(db, v, "NewEarningPrice")
}
}
}
}
func RefreshAfsOrderStatusAccess(ctx *jxcontext.Context) {
@@ -509,11 +601,11 @@ func RefreshRealMobile(ctx *jxcontext.Context, vendorID int, fromTime, toTime ti
order := batchItemList[0].(*model.GoodsOrder)
mobile, err2 := handler.GetOrderRealMobile(ctx, order)
if err = err2; err == nil {
mobile = jxutils.FormalizeMobile(mobile)
if jxutils.IsStringLikeMobile(mobile) && strings.Index(order.ConsigneeMobile, mobile) == -1 {
order.ConsigneeMobile2 = mobile
_, err = dao.UpdateEntity(db, order, "ConsigneeMobile2")
}
//mobile = jxutils.FormalizeMobile(mobile)
//if jxutils.IsStringLikeMobile(mobile) && strings.Index(order.ConsigneeMobile, mobile) == -1 {
order.ConsigneeMobile2 = mobile
_, err = dao.UpdateEntity(db, order, "ConsigneeMobile2")
//}
} else {
globals.SugarLogger.Infof("RefreshRealMobile orderID:%s failed with error:%v", order.VendorOrderID, err)
}

View File

@@ -11,6 +11,7 @@ import (
"git.rosy.net.cn/baseapi"
"git.rosy.net.cn/baseapi/utils"
"git.rosy.net.cn/jx-callback/business/jxstore/cms"
"git.rosy.net.cn/jx-callback/business/jxstore/permission"
"git.rosy.net.cn/jx-callback/business/jxutils"
"git.rosy.net.cn/jx-callback/business/jxutils/jxcontext"
"git.rosy.net.cn/jx-callback/business/jxutils/tasksch"
@@ -812,8 +813,30 @@ func GetWeeklyStoreScore(storeID, weekIndexParam int) (outWeeklyStoreScoreDataLi
return outWeeklyStoreScoreDataList, err
}
func GetStoreTotalScoreList(storeIDList []int, cityCode int, keyWord string, beginTime, endTime time.Time, isDesc bool, checkScoreLow, checkScoreHigh, offset, pageSize int) (storeTotalScoreEx model.StoreTotalScoreEx, err error) {
func GetStoreTotalScoreList(ctx *jxcontext.Context, storeIDList []int, cityCode int, keyWord string, beginTime, endTime time.Time, isDesc bool, checkScoreLow, checkScoreHigh, offset, pageSize int) (storeTotalScoreEx model.StoreTotalScoreEx, err error) {
db := dao.GetDB()
//权限
if permission.IsRoled(ctx) {
if storeIDsMap, err := permission.GetUserStoresResultMap(ctx.GetUserID()); err == nil {
var storeIDs2 []int
if len(storeIDList) > 0 {
for _, v := range storeIDList {
if storeIDsMap[v] != 0 {
storeIDs2 = append(storeIDs2, v)
}
}
if len(storeIDs2) == 0 {
storeIDs2 = append(storeIDs2, -1)
}
} else {
for k, _ := range storeIDsMap {
storeIDs2 = append(storeIDs2, k)
}
}
storeIDList = nil
storeIDList = storeIDs2
}
}
storeTotalScoreMapData := make(map[int]*model.StoreTotalScore)
storeTotalScoreList, err := dao.GetStoreTotalScoreList(db, storeIDList, cityCode, keyWord, beginTime, endTime)
var filterStoreTotalScoreList []*model.StoreTotalScore

View File

@@ -1,9 +1,14 @@
package cms
package permission
import (
"fmt"
"strings"
"time"
"git.rosy.net.cn/jx-callback/business/jxutils"
"git.rosy.net.cn/baseapi/utils"
"git.rosy.net.cn/jx-callback/business/jxutils/jxcontext"
"git.rosy.net.cn/jx-callback/business/model"
"git.rosy.net.cn/jx-callback/business/model/dao"
@@ -11,10 +16,17 @@ import (
func GetMenu(ctx *jxcontext.Context, userID string) (menus []*model.Menu, err error) {
if userID == "" {
return dao.GetMenu(dao.GetDB(), "", 0, userID)
return dao.GetMenu(dao.GetDB(), "", 0, 0, userID)
} else {
return dao.GetMenuWithUser(dao.GetDB(), "", 0, userID)
if user, err := dao.GetUserByID(dao.GetDB(), "user_id", userID); err == nil {
if user.Type&model.UserTypeRole != 0 {
return dao.GetMenuWithUser(dao.GetDB(), "", 0, 0, userID)
} else {
return dao.GetMenu(dao.GetDB(), "", 0, 0, "")
}
}
}
return dao.GetMenu(dao.GetDB(), "", 0, 0, userID)
}
func AddMenu(ctx *jxcontext.Context, menu *model.Menu) (err error) {
@@ -27,20 +39,20 @@ func AddMenu(ctx *jxcontext.Context, menu *model.Menu) (err error) {
if menu.Name == "" || menu.Level == 0 {
return fmt.Errorf("添加失败menu 名称和等级必须有值!")
}
menus, err := dao.GetMenu(db, menu.Name, menu.Level, "")
menus, err := dao.GetMenu(db, menu.Name, menu.Level, 0, "")
if len(menus) > 0 {
return fmt.Errorf("添加失败!已存在相同名称的 menu name : %v", menu.Name)
}
dao.Begin(db)
txDB, _ := dao.Begin(db)
defer func() {
if r := recover(); r != nil {
dao.Rollback(db)
dao.Rollback(db, txDB)
panic(r)
}
}()
dao.WrapAddIDCULDEntity(menu, ctx.GetUserName())
err = dao.CreateEntity(db, menu)
dao.Commit(db)
dao.Commit(db, txDB)
return err
}
@@ -54,10 +66,10 @@ func UpdateMenu(ctx *jxcontext.Context, menuID int, payload map[string]interface
if err != nil {
return 0, err
}
dao.Begin(db)
txDB, _ := dao.Begin(db)
defer func() {
if r := recover(); r != nil {
dao.Rollback(db)
dao.Rollback(db, txDB)
panic(r)
}
}()
@@ -65,7 +77,7 @@ func UpdateMenu(ctx *jxcontext.Context, menuID int, payload map[string]interface
valid := dao.StrictMakeMapByStructObject(payload, menu, ctx.GetUserName())
if len(valid) > 0 {
if num, err = dao.UpdateEntityLogically(db, menu, valid, ctx.GetUserName(), nil); err != nil {
dao.Rollback(db)
dao.Rollback(db, txDB)
return 0, err
}
}
@@ -73,42 +85,66 @@ func UpdateMenu(ctx *jxcontext.Context, menuID int, payload map[string]interface
menu.DeletedAt = time.Now()
num, err = dao.UpdateEntity(db, menu, "DeletedAt")
}
dao.Commit(db)
dao.Commit(db, txDB)
return num, err
}
func GetRole(ctx *jxcontext.Context) (roles []*model.Role, err error) {
return dao.GetRole(dao.GetDB(), "")
func GetRole(ctx *jxcontext.Context, name string) (roles []*model.Role, err error) {
var (
db = dao.GetDB()
)
roles, err = dao.GetRole(db, name, "")
for _, v := range roles {
if v.CityCodes != "" {
if cityInfos, err := dao.GetPlaces(db, jxutils.StrListToIntList(strings.Split(v.CityCodes, ","))); err == nil {
v.CityInfo = cityInfos
}
}
if v.StoreIDs != "" {
if stores, err := dao.GetStoreList(db, jxutils.StrListToIntList(strings.Split(v.StoreIDs, ",")), nil, nil, nil, nil, ""); err == nil {
v.Stores = stores
}
}
}
return roles, err
}
func AddRole(ctx *jxcontext.Context, name string) (err error) {
var (
db = dao.GetDB()
)
roles, err := dao.GetRole(db, name)
roles, err := dao.GetRole(db, "", name)
if len(roles) > 0 {
return fmt.Errorf("添加失败!已存在相同名称的 role name : %v", name)
}
role := &model.Role{
Name: name,
}
dao.Begin(db)
txDB, _ := dao.Begin(db)
defer func() {
if r := recover(); r != nil {
dao.Rollback(db)
dao.Rollback(db, txDB)
panic(r)
}
}()
dao.WrapAddIDCULDEntity(role, ctx.GetUserName())
err = dao.CreateEntity(db, role)
dao.Commit(db)
dao.Commit(db, txDB)
return err
}
func UpdateRole(ctx *jxcontext.Context, roleID int, name string, isDelete bool) (num int64, err error) {
func UpdateRole(ctx *jxcontext.Context, roleID int, name string, isDelete bool, brandID int, cityCodes, storeIDs []int) (num int64, err error) {
var (
db = dao.GetDB()
db = dao.GetDB()
cityCodesStr []string
storeIDsStr []string
)
for _, v := range cityCodes {
cityCodesStr = append(cityCodesStr, utils.Int2Str(v))
}
for _, v := range storeIDs {
storeIDsStr = append(storeIDsStr, utils.Int2Str(v))
}
if roleID == 1 {
return 0, fmt.Errorf("管理员不允许修改!")
}
@@ -118,10 +154,10 @@ func UpdateRole(ctx *jxcontext.Context, roleID int, name string, isDelete bool)
if err != nil {
return 0, err
}
dao.Begin(db)
txDB, _ := dao.Begin(db)
defer func() {
if r := recover(); r != nil {
dao.Rollback(db)
dao.Rollback(db, txDB)
panic(r)
}
}()
@@ -129,12 +165,15 @@ func UpdateRole(ctx *jxcontext.Context, roleID int, name string, isDelete bool)
role.Name = name
role.UpdatedAt = time.Now()
role.LastOperator = ctx.GetUserName()
num, err = dao.UpdateEntity(db, role, "Name", "UpdatedAt", "LastOperator")
role.BrandID = brandID
role.CityCodes = strings.Join(cityCodesStr, ",")
role.StoreIDs = strings.Join(storeIDsStr, ",")
num, err = dao.UpdateEntity(db, role, "Name", "UpdatedAt", "LastOperator", "BrandID", "CityCodes", "StoreIDs")
} else {
role.DeletedAt = time.Now()
num, err = dao.UpdateEntity(db, role, "DeletedAt")
}
dao.Commit(db)
dao.Commit(db, txDB)
return num, err
}
@@ -171,16 +210,16 @@ func UpdateUserRole(ctx *jxcontext.Context, userIDs []string, roleIDs []int) (er
}
nowRoleIDMap[nowRoleID] = 1
}
for _, roleID := range roleIDMap {
for roleID, _ := range roleIDMap {
if nowRoleIDMap[roleID] == 0 {
addUserRoleMap[userID] = append(addUserRoleMap[userID], roleID)
}
}
}
dao.Begin(db)
txDB, _ := dao.Begin(db)
defer func() {
if r := recover(); r != nil {
dao.Rollback(db)
dao.Rollback(db, txDB)
panic(r)
}
}()
@@ -208,7 +247,13 @@ func UpdateUserRole(ctx *jxcontext.Context, userIDs []string, roleIDs []int) (er
}
}
}
dao.Commit(db)
for _, v := range userIDs {
if user, err := dao.GetUserByID(db, "user_id", v); err == nil {
user.Type = user.Type | model.UserTypeRole
dao.UpdateEntity(db, user, "Type")
}
}
dao.Commit(db, txDB)
return err
}
@@ -245,16 +290,16 @@ func UpdateRoleMenu(ctx *jxcontext.Context, roleIDs, menuIDs []int) (err error)
}
nowMenuIDMap[nowMenuID] = 1
}
for _, menuID := range menuIDMap {
for menuID, _ := range menuIDMap {
if nowMenuIDMap[menuID] == 0 {
addRoleMenuMap[menuID] = append(addRoleMenuMap[menuID], menuID)
addRoleMenuMap[roleID] = append(addRoleMenuMap[roleID], menuID)
}
}
}
dao.Begin(db)
txDB, _ := dao.Begin(db)
defer func() {
if r := recover(); r != nil {
dao.Rollback(db)
dao.Rollback(db, txDB)
panic(r)
}
}()
@@ -282,6 +327,105 @@ func UpdateRoleMenu(ctx *jxcontext.Context, roleIDs, menuIDs []int) (err error)
}
}
}
dao.Commit(db)
dao.Commit(db, txDB)
return err
}
func GetUserStoresResultMap(userID string) (resultMap map[int]int, err error) {
var (
db = dao.GetDB()
// brandIDMap = make(map[int]int)
// cityCodeMap = make(map[int]int)
// storeIDMap = make(map[int]int)
)
resultMap = make(map[int]int)
user, _ := dao.GetUserByID(db, "user_id", userID)
if user != nil {
if user.BindStoreID != "" {
for _, v := range strings.Split(user.BindStoreID, ",") {
resultMap[utils.Str2Int(v)] = utils.Str2Int(v)
}
return resultMap, err
}
}
userRoles, err2 := dao.GetUserRole2(db, []string{userID}, nil)
err = err2
for _, v := range userRoles {
var (
brandIDs, cityCodes, storeIDs []int
)
// if _, ok := brandIDMap[v.BrandID]; !ok {
// brandIDMap[v.BrandID] = 1
// }
// if v.CityCodes != "" {
// for _, cityCode := range jxutils.StrListToIntList(strings.Split(v.CityCodes, ",")) {
// if _, ok := cityCodeMap[cityCode]; !ok {
// cityCodeMap[cityCode] = 1
// }
// }
// }
// if v.StoreIDs != "" {
// for _, storeID := range jxutils.StrListToIntList(strings.Split(v.StoreIDs, ",")) {
// if _, ok := storeIDMap[storeID]; !ok {
// storeIDMap[storeID] = 1
// }
// }
// }
if v.CityCodes == "" && v.StoreIDs == "" {
continue
}
if v.BrandID != 0 {
brandIDs = append(brandIDs, v.BrandID)
}
if v.CityCodes != "0" && v.CityCodes != "" {
cityCodes = append(cityCodes, jxutils.StrListToIntList(strings.Split(v.CityCodes, ","))...)
}
if v.StoreIDs != "" {
storeIDs = append(storeIDs, jxutils.StrListToIntList(strings.Split(v.StoreIDs, ","))...)
}
if stores, err := dao.GetStoreList(db, storeIDs, cityCodes, nil, brandIDs, nil, ""); len(stores) > 0 && err == nil {
for _, v := range stores {
resultMap[v.ID] = v.ID
}
}
}
// for k, _ := range brandIDMap {
// brandIDs = append(brandIDs, k)
// }
// for k, _ := range cityCodeMap {
// cityCodes = append(cityCodes, k)
// }
// for k, _ := range storeIDMap {
// storeIDs = append(storeIDs, k)
// }
// if stores1, err := dao.GetStoreList(db, nil, nil, brandIDs, nil, nil, ""); len(stores1) > 0 && err == nil {
// stores = append(stores, stores1...)
// }
// if stores2, err := dao.GetStoreList(db, nil, cityCodes, nil, nil, nil, ""); len(stores2) > 0 && err == nil {
// stores = append(stores, stores2...)
// }
// if stores3, err := dao.GetStoreList(db, storeIDs, nil, nil, nil, nil, ""); len(stores3) > 0 && err == nil {
// stores = append(stores, stores3...)
// }
return resultMap, err
}
func IsRoled(ctx *jxcontext.Context) bool {
if ctx.GetUserName() != "jxadmin" {
if user, err := dao.GetUserByID(dao.GetDB(), "user_id", ctx.GetUserID()); err == nil {
if user.Type&model.UserTypeRole != 0 {
return true
}
}
}
return false
}
func IsRoledByUserID(userID string) bool {
if user, err := dao.GetUserByID(dao.GetDB(), "user_id", userID); err == nil {
if user.Type&model.UserTypeRole != 0 {
return true
}
}
return false
}

View File

@@ -3,10 +3,23 @@ package report
import (
"errors"
"fmt"
"git.rosy.net.cn/jx-callback/globals"
"git.rosy.net.cn/jx-callback/globals/api"
"math"
"sort"
"strings"
"time"
"git.rosy.net.cn/jx-callback/business/jxutils/ddmsg"
"git.rosy.net.cn/baseapi/platformapi/dingdingapi"
"git.rosy.net.cn/baseapi/platformapi/mtwmapi"
"git.rosy.net.cn/jx-callback/business/jxutils"
"git.rosy.net.cn/jx-callback/business/partner"
"git.rosy.net.cn/jx-callback/business/jxstore/permission"
"git.rosy.net.cn/jx-callback/business/jxutils/tasksch"
"git.rosy.net.cn/baseapi/utils"
@@ -23,7 +36,7 @@ type tStoreSkuBindAndSkuName struct {
UnitPriceList []int
}
func GetStatisticsReportForOrders(ctx *jxcontext.Context, storeIDs []int, fromDate string, toDate string) (statisticsReportForOrdersList []*dao.StatisticsReportForOrdersList, err error) {
func GetStatisticsReportForOrders(ctx *jxcontext.Context, storeIDs, vendorIDs []int, fromDate, toDate, marketPhone, jdPhone, mtPhone, ebaiPhone string) (statisticsReportForOrdersList []*dao.StatisticsReportForOrdersList, err error) {
db := dao.GetDB()
fromDateParm := utils.Str2Time(fromDate)
toDateParm := utils.Str2Time(toDate)
@@ -31,7 +44,7 @@ func GetStatisticsReportForOrders(ctx *jxcontext.Context, storeIDs []int, fromDa
if math.Ceil(toDateParm.Sub(fromDateParm).Hours()/24) > 92 {
return nil, errors.New(fmt.Sprintf("查询间隔时间不允许大于3个月: 时间范围:[%v] 至 [%v]", fromDate, toDate))
}
statisticsReportForOrdersList, err = dao.GetStatisticsReportForOrders(db, storeIDs, fromDateParm, toDateParm)
statisticsReportForOrdersList, err = dao.GetStatisticsReportForOrders(db, storeIDs, vendorIDs, fromDateParm, toDateParm, marketPhone, jdPhone, mtPhone, ebaiPhone)
return statisticsReportForOrdersList, err
}
@@ -73,10 +86,10 @@ func BeginSavePriceRefer(ctx *jxcontext.Context, cityCodes, skuIDs []int, isAsyn
case 0:
priceReferSnapshot, err := dao.GetStatisticsReportForStoreSkusPrice(db, cityCodes, skuIDs)
if len(priceReferSnapshot) > 0 {
dao.Begin(db)
txDB, _ := dao.Begin(db)
defer func() {
if r := recover(); r != nil || err != nil {
dao.Rollback(db)
dao.Rollback(db, txDB)
if r != nil {
panic(r)
}
@@ -87,7 +100,7 @@ func BeginSavePriceRefer(ctx *jxcontext.Context, cityCodes, skuIDs []int, isAsyn
v.SnapshotAt = snapshotAt
}
dao.CreateMultiEntities(db, priceReferSnapshot)
dao.Commit(db)
dao.Commit(db, txDB)
}
case 1:
priceReferSnapshotList, err = dao.GetPriceReferSnapshotNoPage(db, nil, nil, nil, snapshotAt)
@@ -97,7 +110,7 @@ func BeginSavePriceRefer(ctx *jxcontext.Context, cityCodes, skuIDs []int, isAsyn
resultMap = make(map[int]map[int]*model.PriceReferSnapshot)
resultCountryMap = make(map[int]*model.PriceReferSnapshot)
)
storeList, err := dao.GetStoreList(db, nil, nil, nil, nil, "")
storeList, err := dao.GetStoreList(db, nil, nil, nil, nil, nil, "")
if err != nil {
return result, err
}
@@ -203,15 +216,6 @@ func BeginSavePriceRefer(ctx *jxcontext.Context, cityCodes, skuIDs []int, isAsyn
}
resultMap[k1] = skuNameMap
}
dao.Begin(db)
defer func() {
if r := recover(); r != nil || err != nil {
dao.Rollback(db)
if r != nil {
panic(r)
}
}
}()
if len(priceReferSnapshotList) > 0 {
for _, v := range priceReferSnapshotList {
if v.CityCode == 0 {
@@ -233,28 +237,19 @@ func BeginSavePriceRefer(ctx *jxcontext.Context, cityCodes, skuIDs []int, isAsyn
}
}
}
dao.Commit(db)
case 2:
dao.Begin(db)
defer func() {
if r := recover(); r != nil || err != nil {
dao.Rollback(db)
if r != nil {
panic(r)
}
}
}()
if len(priceReferSnapshotList) > 0 {
for _, v := range priceReferSnapshotList {
result, _ := dao.GetPriceReferPrice(db, v.CityCode, v.SkuID, snapshotAt)
v.MaxPrice = result.MaxPrice
v.MinPrice = result.MinPrice
v.AvgPrice = result.AvgPrice
v.MidPrice = result.MidPrice
dao.UpdateEntity(db, v, "MidPrice", "MaxPrice", "MinPrice", "AvgPrice")
if result != nil {
v.MaxPrice = result.MaxPrice
v.MinPrice = result.MinPrice
v.AvgPrice = result.AvgPrice
v.MidPrice = result.MidPrice
dao.UpdateEntity(db, v, "MidPrice", "MaxPrice", "MinPrice", "AvgPrice")
}
}
}
dao.Commit(db)
//TODO 京东查询接口报错,暂时屏蔽了
// case 3:
// priceReferSnapshotList, err = dao.GetPriceReferSnapshotNoPage(db, []int{0}, nil, nil, snapshotAt)
@@ -283,3 +278,495 @@ func BeginSavePriceRefer(ctx *jxcontext.Context, cityCodes, skuIDs []int, isAsyn
}
return hint, err
}
type GetManageStateResult struct {
OpenStoreCount int `json:"openStoreCount"` //营业店铺数
HaveRestStoreCount int `json:"haveRestStoreCount"` //临时休息店铺数
RestStoreCount int `json:"restStoreCount"` //休息店铺数
FinishOrderState *GetManageStateOrderInfo //完成订单情况
IngOrderState *GetManageStateOrderInfo //进行中订单情况
CancelOrderState *GetManageStateOrderInfo //取消订单情况
}
type GetManageStateOrderInfo struct {
ActualPayPrice int `json:"actualPayPrice"` //支付总额
TotalShopMoney int `json:"totalShopMoney"` //平台结算
DesiredFee int `json:"desiredFee"` //配送费
Yhld string `json:"yhld"` //优惠力度(支付总额-平台结算-配送支出)/支付总额*100%
}
func getStoreStatusCount(db *dao.DaoDB, cityCodes []int, vendorID, status int) (count int, err error) {
countType := &struct{ Count int }{}
sqlParams := []interface{}{}
sql := `
SELECT COUNT(DISTINCT a.id) count
FROM store a
LEFT JOIN store_map b ON a.id = b.store_id AND b.deleted_at = ?
WHERE a.deleted_at = ?
`
sqlParams = append(sqlParams, utils.DefaultTimeValue, utils.DefaultTimeValue)
if len(cityCodes) > 0 {
sql += " AND a.city_code IN (" + dao.GenQuestionMarks(len(cityCodes)) + ")"
sqlParams = append(sqlParams, cityCodes)
}
if vendorID != -1 {
sql += " AND b.vendor_id = ? AND b.status = ?"
sqlParams = append(sqlParams, vendorID, status)
} else {
sql += " AND a.status = ?"
sqlParams = append(sqlParams, status)
}
err = dao.GetRow(db, &countType, sql, sqlParams)
return countType.Count, err
}
func getOrderStateCount(db *dao.DaoDB, cityCodes []int, vendorID, status int) (getManageStateOrderInfo *GetManageStateOrderInfo, err error) {
sqlParams := []interface{}{}
getManageStateOrderInfo = &GetManageStateOrderInfo{}
endTime := time.Now().AddDate(0, -3, 0)
sql := `
SELECT SUM(b.actual_pay_price) actual_pay_price, SUM(b.total_shop_money) total_shop_money, SUM(IFNULL(c.desired_fee, 0)) desired_fee
FROM store a
LEFT JOIN goods_order b ON a.id = IF(b.jx_store_id = 0, b.store_id, b.jx_store_id)
LEFT JOIN waybill c ON IF(b.waybill_vendor_id = -1,b.vendor_order_id,b.vendor_waybill_id) = c.vendor_waybill_id
WHERE a.deleted_at = ? AND a.status <> ?
AND b.order_created_at < ? AND b.order_created_at > ?
`
sqlParams = append(sqlParams, utils.DefaultTimeValue, model.StoreStatusDisabled, time.Now(), endTime)
if len(cityCodes) > 0 {
sql += " AND a.city_code IN (" + dao.GenQuestionMarks(len(cityCodes)) + ")"
sqlParams = append(sqlParams, cityCodes)
}
if vendorID != -1 {
sql += " AND b.vendor_id = ?"
sqlParams = append(sqlParams, vendorID)
}
if status != model.OrderStatusDelivering {
sql += " AND b.status = ?"
sqlParams = append(sqlParams, status)
} else {
sql += " AND b.status < ? AND b.status >= ?"
sqlParams = append(sqlParams, model.OrderStatusEndBegin, model.OrderStatusWait4Pay)
}
err = dao.GetRow(db, &getManageStateOrderInfo, sql, sqlParams)
getManageStateOrderInfo.Yhld = utils.Float64ToStr(math.Round((float64(getManageStateOrderInfo.ActualPayPrice-getManageStateOrderInfo.TotalShopMoney-getManageStateOrderInfo.DesiredFee) / float64(getManageStateOrderInfo.ActualPayPrice) * 100))) + "%"
return getManageStateOrderInfo, err
}
func GetManageState(ctx *jxcontext.Context, cityCodes []int, vendorID int) (getManageStateResult *GetManageStateResult, err error) {
var (
db = dao.GetDB()
)
getManageStateResult = &GetManageStateResult{}
if openCount, err := getStoreStatusCount(db, cityCodes, vendorID, model.StoreStatusOpened); err == nil {
getManageStateResult.OpenStoreCount = openCount
}
if haveRestCount, err := getStoreStatusCount(db, cityCodes, vendorID, model.StoreStatusHaveRest); err == nil {
getManageStateResult.HaveRestStoreCount = haveRestCount
}
if restCount, err := getStoreStatusCount(db, cityCodes, vendorID, model.StoreStatusClosed); err == nil {
getManageStateResult.RestStoreCount = restCount
}
if finishCount, err := getOrderStateCount(db, cityCodes, vendorID, model.OrderStatusFinished); err == nil {
getManageStateResult.FinishOrderState = finishCount
}
if ingCount, err := getOrderStateCount(db, cityCodes, vendorID, model.OrderStatusDelivering); err == nil {
getManageStateResult.IngOrderState = ingCount
}
if cancelCount, err := getOrderStateCount(db, cityCodes, vendorID, model.OrderStatusCanceled); err == nil {
getManageStateResult.CancelOrderState = cancelCount
}
return getManageStateResult, err
}
func RefreshStoreManageState(ctx *jxcontext.Context, storeIDs []int, vendorIDs []int) {
var (
db = dao.GetDB()
//vendorIDs = []int{model.VendorIDJD, model.VendorIDMTWM, model.VendorIDEBAI}
messageFlag = time.Now().Hour() == 10 && time.Now().Minute() > 0 && time.Now().Minute() < 12
)
task := tasksch.NewParallelTask("RefreshStoreManageState", tasksch.NewParallelConfig().SetParallelCount(3).SetIsContinueWhenError(true), ctx,
func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) {
vendorID := batchItemList[0].(int)
storeMaps, err := dao.GetStoresMapList(db, []int{vendorID}, storeIDs, []int{model.StoreStatusOpened, model.StoreStatusClosed, model.StoreStatusHaveRest}, model.StoreStatusAll, model.StoreIsSyncAll, "", "", "")
storeManageStates, err := dao.GetStoreManageStateSimple(db, storeIDs, nil, vendorID)
var (
storeMapsMap = make(map[int]*model.StoreMap)
storeManagesMap = make(map[int]*model.StoreManageState)
deleteList []int
createList, updateList []*model.StoreMap
)
for _, v := range storeMaps {
storeMapsMap[v.StoreID] = v
}
for _, v := range storeManageStates {
storeManagesMap[v.StoreID] = v
if storeMapsMap[v.StoreID] != nil {
updateList = append(updateList, storeMapsMap[v.StoreID])
} else {
deleteList = append(deleteList, v.StoreID)
}
}
for _, v := range storeMapsMap {
if storeManagesMap[v.StoreID] == nil {
createList = append(createList, v)
}
}
task2 := tasksch.NewParallelTask("deleteList", tasksch.NewParallelConfig().SetIsContinueWhenError(true), ctx,
func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) {
storeID := batchItemList[0].(int)
storeManage := &model.StoreManageState{
StoreID: storeID,
VendorID: vendorID,
}
dao.DeleteEntity(db, storeManage, "StoreID", "VendorID")
return retVal, err
}, deleteList)
tasksch.HandleTask(task2, task, true).Run()
task2.GetResult(0)
task3 := tasksch.NewParallelTask("createList", tasksch.NewParallelConfig().SetParallelCount(20).SetIsContinueWhenError(true), ctx,
func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) {
storeMap := batchItemList[0].(*model.StoreMap)
if storeMap.VendorOrgCode == "" || storeMap.VendorStoreID == "" {
return retVal, err
}
storeDetail, _ := dao.GetStoreDetail(db, storeMap.StoreID, vendorID, storeMap.VendorOrgCode)
storeManage := buildStoreManageState(ctx, db, storeMap, storeDetail, messageFlag)
if storeManage == nil {
return retVal, err
}
dao.CreateEntity(db, storeManage)
return retVal, err
}, createList)
tasksch.HandleTask(task3, task, true).Run()
task3.GetResult(0)
task4 := tasksch.NewParallelTask("updateList", tasksch.NewParallelConfig().SetParallelCount(1).SetIsContinueWhenError(true), ctx,
func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) {
storeMap := batchItemList[0].(*model.StoreMap)
if storeMap.VendorOrgCode == "" || storeMap.VendorStoreID == "" {
return retVal, err
}
storeDetail, _ := dao.GetStoreDetail(db, storeMap.StoreID, vendorID, storeMap.VendorOrgCode)
storeManage := buildStoreManageState(ctx, db, storeMap, storeDetail, messageFlag)
if storeManage == nil {
return retVal, err
}
if storeManageStates, err := dao.GetStoreManageStateSimple(db, []int{storeDetail.ID}, nil, vendorID); err == nil && len(storeManageStates) > 0 {
storeManage.ID = storeManageStates[0].ID
dao.UpdateEntity(db, storeManage)
}
return retVal, err
}, updateList)
tasksch.HandleTask(task4, task, true).Run()
task4.GetResult(0)
return retVal, err
}, vendorIDs)
tasksch.HandleTask(task, nil, true).Run()
task.GetID()
}
func buildStoreManageState(ctx *jxcontext.Context, db *dao.DaoDB, storeMap *model.StoreMap, storeDetail *dao.StoreDetail, messageFlag bool) *model.StoreManageState {
var (
dayTimeBegin, dayTimeEnd = utils.Str2Time(utils.Time2Str(utils.Time2Date(time.Now())) + "00:00:00"), utils.Str2Time(utils.Time2Str(utils.Time2Date(time.Now())) + "23:59:59")
)
storeManage := &model.StoreManageState{
StoreID: storeMap.StoreID,
VendorID: storeMap.VendorID,
}
dao.WrapAddIDCULEntity(storeManage, ctx.GetUserName())
handler := partner.GetPurchasePlatformFromVendorID(storeMap.VendorID)
store, err := handler.ReadStore(ctx, storeDetail.VendorOrgCode, storeDetail.VendorStoreID)
if err != nil || store == nil {
return nil
}
// if coverAreaFlag {
if storeMap.VendorID == model.VendorIDJD && store.DeliveryRangeType != model.DeliveryRangeTypePolygon {
storeManage.CoverArea = utils.Str2Float64(fmt.Sprintf("%.2f", math.Pi*utils.Str2Float64WithDefault(store.DeliveryRange, 0)/float64(1000)*utils.Str2Float64WithDefault(store.DeliveryRange, 0)/float64(1000)))
} else {
storeManage.CoverArea = utils.Str2Float64(fmt.Sprintf("%.2f", CalculateCoverArea(strings.Split(store.DeliveryRange, ";"), storeMap.VendorID)))
}
// }
//营业状态
storeManage.VendorStatus = store.Status
//不一致发消息
if messageFlag {
vendorStatus, status := -1, -1
if store.Status == model.StoreStatusOpened {
vendorStatus = 1
}
if storeDetail.Status == model.StoreStatusOpened {
status = 1
}
statusMap := map[int]string{
1: "营业",
-1: "休息",
}
if vendorStatus != status {
content := "您的门店 [" + storeDetail.Name + "]ID:[" + utils.Int2Str(storeDetail.ID) + "],在[" + model.VendorChineseNames[storeMap.VendorID] + "] 平台上营业状态和京西不一致!平台状态:【" + statusMap[vendorStatus] + "】,京西状态:【" + statusMap[status] + "】"
if user, err := dao.GetUserByID(db, "mobile", storeDetail.MarketManPhone); err == nil {
ddmsg.SendUserMessage(dingdingapi.MsgTyeText, user.UserID, "平台门店状态变化", content)
}
}
}
//营业时长
optime := jxutils.JxOperationTime2TimeByDate(storeDetail.CloseTime1, time.Now()).Sub(jxutils.JxOperationTime2TimeByDate(storeDetail.OpenTime1, time.Now())).Hours()
if storeDetail.CloseTime2 != 0 && storeDetail.OpenTime2 != 0 {
optime += jxutils.JxOperationTime2TimeByDate(storeDetail.CloseTime2, time.Now()).Sub(jxutils.JxOperationTime2TimeByDate(storeDetail.OpenTime2, time.Now())).Hours()
}
storeManage.OpenTime = utils.Str2Float64(fmt.Sprintf("%.2f", optime))
//商品数
highSkuCount := 0
storeSkus, _ := dao.GetStoresSkusForManageState(db, storeMap.StoreID, model.StoreSkuBindStatusNormal)
for _, v := range storeSkus {
if v.UnitPrice > v.MidUnitPrice {
highSkuCount++
}
}
storeManage.SkuCount, storeManage.HighSkuCount = len(storeSkus), highSkuCount
//活动丰富度
ample, _ := handler.GetActAmple(ctx, storeDetail.VendorStoreID, storeDetail.VendorStoreID)
storeManage.ActAmple = ample
//订单
refuseOrderCount := 0
orderList, _ := dao.QueryOrdersForManageState(db, storeMap.StoreID, storeMap.VendorID, model.OrderStatusCanceled, dayTimeBegin, dayTimeEnd)
for _, v := range orderList {
if v.BindID == 0 {
refuseOrderCount++
}
}
storeManage.NullOrderCount, storeManage.RefuseOrderCount = len(orderList), refuseOrderCount
//评分(美团)
if storeMap.VendorID == model.VendorIDMTWM {
mtapi := partner.CurAPIManager.GetAPI(model.VendorIDMTWM, storeDetail.VendorOrgCode).(*mtwmapi.API)
if scoreResult, err := mtapi.CommentScore(storeDetail.VendorStoreID); err == nil {
storeManage.StoreScore = scoreResult.AvgPoiScore
}
}
return storeManage
}
func GetStoreManageState(ctx *jxcontext.Context, storeIDs, brandIDs []int, vendorID, sortType, offset, pageSize int) (pageInfo *model.PagedInfo, err error) {
var (
db = dao.GetDB()
)
//权限
if permission.IsRoled(ctx) {
if storeIDsMap, err := permission.GetUserStoresResultMap(ctx.GetUserID()); err == nil {
var storeIDs2 []int
if len(storeIDs) > 0 {
for _, v := range storeIDs {
if storeIDsMap[v] != 0 {
storeIDs2 = append(storeIDs2, v)
}
}
if len(storeIDs2) == 0 {
storeIDs2 = append(storeIDs2, -1)
}
} else {
for k, _ := range storeIDsMap {
storeIDs2 = append(storeIDs2, k)
}
}
storeIDs = nil
storeIDs = storeIDs2
}
}
return dao.GetStoreManageState(db, storeIDs, brandIDs, vendorID, sortType, offset, pageSize)
}
func CalculateCoverArea(coordinate []string, vendorID int) (area float64) {
//我先把地理坐标转成了平面坐标(百度的方法)
//然后按多个坐标求面积公式求的面积(百度的方法)
if len(coordinate) == 0 {
return 0
}
var xyList [][2]float64
for _, v := range coordinate {
cell := strings.Split(v, ",")
if len(cell) == 0 || len(cell) == 1 {
continue
}
var lat, lng float64
if vendorID == model.VendorIDJD || vendorID == model.VendorIDEBAI {
lng = utils.Str2Float64WithDefault(cell[0], 0)
lat = utils.Str2Float64WithDefault(cell[1], 0)
} else {
lat = utils.Str2Float64WithDefault(cell[0], 0)
lng = utils.Str2Float64WithDefault(cell[1], 0)
}
xys := jxutils.MillierConvertion(lat, lng)
xyList = append(xyList, xys)
}
var sum float64 = 0
if len(xyList) == 0 {
return 0
}
for i := 0; i < len(xyList)-1; i++ {
// sum += (xyList[i+1][0] - xyList[i][0]) * (xyList[i+1][1] + xyList[i][1])
sum += (xyList[i][0]*xyList[i+1][1] - xyList[i+1][0]*xyList[i][1])
}
// sum += (xyList[0][0] - xyList[len(xyList)-1][0]) * (xyList[0][1] + xyList[len(xyList)-1][1])
sum += (xyList[len(xyList)-1][0]*xyList[0][1] - xyList[0][0]*xyList[len(xyList)-1][1])
sum /= float64(2)
sum = math.Abs(sum)
sum = utils.Str2Float64(fmt.Sprintf("%.2f", sum))
return sum
}
func RefreshJDMembers(ctx *jxcontext.Context) (err error) {
var (
db = dao.GetDB()
pageSize = 50
page int
pages []int
memberMap = make(map[string]*model.UserMember)
)
userMemebers, _ := dao.GetUserMemberWithoutDeleted(db, model.VendorIDJD)
for _, v := range userMemebers {
memberMap[v.Mobile] = v
}
pageResult, err := api.JdAPI.QueryMemberTransListByCondition("", "", page, pageSize)
if err != nil {
if strings.Contains(err.Error(), "cookie") {
globals.SugarLogger.Warnf("京东cookie过期了!")
}
}
if pageResult.Total%pageSize == 0 {
page = pageResult.Total / pageSize
} else {
page = pageResult.Total/pageSize + 1
}
for ; page > 0; page-- {
pages = append(pages, page)
}
task := tasksch.NewParallelTask2("RefreshJDMembers", tasksch.NewParallelConfig().SetIsContinueWhenError(true), ctx,
func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, successCount int, err error) {
pageNo := batchItemList[0].(int)
pageResult2, err := api.JdAPI.QueryMemberTransListByCondition("", "", pageNo, pageSize)
if pageResult2 != nil {
for _, v := range pageResult2.Rows {
if utils.Str2Time(v.Endtimestr+" 23:59:59").Sub(time.Now()) >= 0 && v.Dealstatus == 0 {
if memberMap[v.Merchantcardno] != nil { //库里有这个人的会员信息了
if utils.Time2Str(memberMap[v.Merchantcardno].EndAt) != v.Endtimestr+" 23:59:59" { //可能这个人续费了,续存了
memberMap[v.Merchantcardno].EndAt = utils.Str2Time(v.Endtimestr + " 23:59:59")
memberMap[v.Merchantcardno].DeletedAt = utils.DefaultTimeValue
dao.UpdateEntity(db, memberMap[v.Merchantcardno], "EndAt", "DeletedAt")
}
} else {
userMember := &model.UserMember{
VendorOrderID: v.Orderid,
VendorID: model.VendorIDJD,
Mobile: v.Merchantcardno,
MemberType: 1,
EndAt: utils.Str2Time(v.Endtimestr + " 23:59:59"),
IsPay: 1,
}
dao.WrapAddIDCULDEntity(userMember, "jxadmin")
if v.Createtime != "" {
userMember.CreatedAt = utils.Str2Time(v.Createtime)
} else {
userMember.CreatedAt = utils.Str2Time(v.Cardcreatetime)
}
if userMember.EndAt.Sub(time.Now()) <= 0 {
userMember.DeletedAt = time.Now()
}
dao.CreateEntity(db, userMember)
}
}
}
}
return retVal, successCount, err
}, pages)
tasksch.HandleTask(task, nil, true).Run()
task.GetID()
return err
}
func UserMemberReport(ctx *jxcontext.Context, vendorID int, keyword string, offset, pageSize int) (page *model.PagedInfo, err error) {
var (
db = dao.GetDB()
)
var list []*dao.UserMemberReportResult
sql := `
SELECT SQL_CALC_FOUND_ROWS a.mobile, IF(a.vendor_id = ?, b.name, t1.consignee_name) name, IF(a.deleted_at = ?, ?, ?) status, a.vendor_id, t1.buy_count, t1.buy_price,
t1.good_comment_count, t1.bad_comment_count, t2.finished_count, t2.finished_price
FROM user_member a
LEFT JOIN user b ON a.mobile = b.mobile
LEFT JOIN (
SELECT a.mobile, MAX(b.consignee_name) consignee_name, COUNT(b.vendor_store_id) buy_count, SUM(b.actual_pay_price) buy_price, COUNT(c.score > 3) good_comment_count, COUNT(c.score < 3) bad_comment_count
FROM user_member a
LEFT JOIN goods_order b ON a.mobile = b.consignee_mobile2 AND a.vendor_id = b.vendor_id AND b.order_type = ? AND b.store_id <> ?
LEFT JOIN jx_bad_comments c ON c.order_id = b.vendor_order_id
GROUP BY 1
) t1 ON t1.mobile = a.mobile
LEFT JOIN (
SELECT a.mobile, COUNT(b.vendor_store_id) finished_count, SUM(b.actual_pay_price) finished_price
FROM user_member a
LEFT JOIN goods_order b ON a.mobile = b.consignee_mobile2 AND a.vendor_id = b.vendor_id AND b.order_type = ? AND status = ? AND b.store_id <> ?
GROUP BY 1
)t2 ON t2.mobile = a.mobile
WHERE 1 = 1
`
sqlParams := []interface{}{
model.VendorIDJX, utils.DefaultTimeValue, model.YES, model.NO,
model.OrderTypeNormal, model.MatterStoreID,
model.OrderTypeNormal, model.OrderStatusFinished, model.MatterStoreID,
}
if vendorID != -1 {
sql += " AND a.vendor_id = ?"
sqlParams = append(sqlParams, vendorID)
}
if keyword != "" {
keywordLike := "%" + keyword + "%"
sql += " AND (a.mobile LIKE ? OR name LIKE ?)"
sqlParams = append(sqlParams, keywordLike, keywordLike)
}
sql += `
LIMIT ? OFFSET ?
`
pageSize = jxutils.FormalizePageSize(pageSize)
sqlParams = append(sqlParams, pageSize, offset)
txDB, _ := dao.Begin(db)
defer dao.Commit(db, txDB)
if err = dao.GetRowsTx(txDB, &list, sql, sqlParams...); err == nil {
page = &model.PagedInfo{
TotalCount: dao.GetLastTotalRowCount2(db, txDB),
//Data: page,
}
task := tasksch.NewParallelTask("", tasksch.NewParallelConfig().SetIsContinueWhenError(true), jxcontext.AdminCtx,
func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) {
v := batchItemList[0].(*dao.UserMemberReportResult)
var good *model.GoodsOrder
sql := `
SELECT * FROM goods_order WHERE consignee_mobile2 = ? AND vendor_id = ? AND order_type = ? AND store_id <> ? LIMIT 1 OFFSET 0
`
sqlParams := []interface{}{v.Mobile, v.VendorID, model.OrderTypeNormal, model.MatterStoreID}
dao.GetRow(db, &good, sql, sqlParams)
if good != nil {
v.NewPrice = good.ActualPayPrice
}
var place *model.Place
sql2 := `
SELECT a.* FROM place a,(
SELECT b.city_code, COUNT(*) count
FROM goods_order a
LEFT JOIN store b ON b.id = IF(a.jx_store_id = 0, store_id, jx_store_id)
WHERE consignee_mobile2 = ? AND vendor_id = ?
GROUP BY 1
ORDER BY COUNT(*)
LIMIT 1 OFFSET 0)b
WHERE a.code = b.city_code
`
dao.GetRow(db, &place, sql2, sqlParams)
if place != nil {
v.CityName = place.Name
v.CityCode = place.Code
}
return retVal, err
}, list)
tasksch.HandleTask(task, nil, true).Run()
task.GetResult(0)
page.Data = list
}
return page, err
}

View File

@@ -4,7 +4,10 @@ import (
"bytes"
"context"
"fmt"
"git.rosy.net.cn/jx-callback/business/jxstore/act"
"net"
"regexp"
"strconv"
"strings"
"time"
@@ -91,7 +94,7 @@ func Convert2JDSPU(ctx *jxcontext.Context, count int, isAsync, isContinueWhenErr
// }
// globals.SugarLogger.Debugf("Convert2JDSPU, skuName:%s, skuCount:%d", skuName.Name, len(skuList))
// dao.Begin(db)
// txDB , _ := dao.Begin(db)
// skuNameNew2 := *skuName
// skuNameNew := &skuNameNew2
// dao.WrapAddIDCULEntity(skuNameNew, ctx.GetUserName())
@@ -101,7 +104,7 @@ func Convert2JDSPU(ctx *jxcontext.Context, count int, isAsync, isContinueWhenErr
// skuNameNew.JdSyncStatus = model.SyncFlagNewMask
// // skuNameNew.Status = model.SkuStatusDontSale
// if err = dao.CreateEntity(db, skuNameNew); err != nil {
// dao.Rollback(db)
// dao.Rollback(db, txDB)
// return "", err
// }
// if len(skuList) > 0 {
@@ -118,7 +121,7 @@ func Convert2JDSPU(ctx *jxcontext.Context, count int, isAsync, isContinueWhenErr
// }
// globals.SugarLogger.Debugf("Convert2JDSPU, sku:%s", utils.Format4Output(skuNew, false))
// if err = dao.CreateEntity(db, skuNew); err != nil {
// dao.Rollback(db)
// dao.Rollback(db, txDB)
// return "", err
// }
// }
@@ -127,12 +130,12 @@ func Convert2JDSPU(ctx *jxcontext.Context, count int, isAsync, isContinueWhenErr
// placeBind.NameID = skuNameNew.ID
// globals.SugarLogger.Debugf("Convert2JDSPU, placeBind:%s", utils.Format4Output(placeBind, false))
// if err = dao.CreateEntity(db, placeBind); err != nil {
// dao.Rollback(db)
// dao.Rollback(db, txDB)
// return "", err
// }
// }
// }
// dao.Commit(db)
// dao.Commit(db, txDB)
// }
// sql = `
// SELECT DISTINCT t1.*
@@ -175,8 +178,8 @@ func Change2JDSPU4Store(ctx *jxcontext.Context, storeIDs []int, step int, isAsyn
// var sql string
// var sqlParams []interface{}
// dao.Begin(db)
// defer dao.Rollback(db)
// txDB , _ := dao.Begin(db)
// defer dao.Rollback(db, txDB)
// if step == 1 {
// sql = `
@@ -259,7 +262,7 @@ func Change2JDSPU4Store(ctx *jxcontext.Context, storeIDs []int, step int, isAsyn
// return "", err
// }
// globals.SugarLogger.Debug(num)
// dao.Commit(db)
// dao.Commit(db, txDB)
// var skuIDs []int
// if step == 1 {
@@ -1004,7 +1007,7 @@ func CreateConsumerFromOrders(ctx *jxcontext.Context, vendorIDs []int, fromDate,
}
}
if order2 == nil && order.VendorID == model.VendorIDMTWM && time.Now().Sub(curDate) < 60*24*time.Hour {
order2, err = handler.GetOrder(order.VendorOrgCode, order.VendorOrderID)
order2, err = handler.GetOrder(order.VendorOrgCode, order.VendorOrderID, order.VendorStoreID)
}
if order2 != nil {
if order2.VendorUserID != "" && order.VendorUserID != order2.VendorUserID {
@@ -1234,14 +1237,14 @@ func FixMtwmCategory(ctx *jxcontext.Context, mtwmStoreIDs []int, isAsync, isCont
func JdStoreInfo1125() (hint string, err error) {
fileName := "老格恢复拓店进度.xlsx"
db := dao.GetDB()
storeList, err := dao.GetStoresMapList(db, []int{model.VendorIDJD}, nil, nil, model.StoreStatusAll, model.StoreIsSyncYes, "", "")
storeList, err := dao.GetStoresMapList(db, []int{model.VendorIDJD}, nil, nil, model.StoreStatusAll, model.StoreIsSyncYes, "", "", "")
if err == nil {
var validStoreList []*dao.StoreDetail
for _, v := range storeList {
if v.Status != model.StoreStatusDisabled && v.CreatedAt.Sub(utils.Str2Time("2019-10-01")) > 0 {
storeInfo, err := api.JdAPI.GetStoreInfoByStationNo2(v.VendorStoreID)
if err == nil && storeInfo.CreateTime.GoTime().Sub(utils.Str2Time("2019-10-25")) > 0 {
if storeDetail, err := dao.GetStoreDetail(db, v.StoreID, v.VendorID); err == nil {
if storeDetail, err := dao.GetStoreDetail(db, v.StoreID, v.VendorID, ""); err == nil {
validStoreList = append(validStoreList, storeDetail)
}
}
@@ -1498,123 +1501,586 @@ func addSku(outSkuId string, cagtegoryId int, shopCategories []int64, brandId in
}
func UploadJdsImage(ctx *jxcontext.Context) (err error) {
// db := dao.GetDB()
// result1, _ := api.JdShopAPI.GetProvince()
// for _, v := range result1 {
// place1, _ := dao.GetPlaceByName(db, v.AreaName, 1, 0)
// place1.JdsCode = v.AreaID
// dao.UpdateEntity(db, place1, "JdsCode")
// result2, _ := api.JdShopAPI.GetCity(v.AreaID)
// for _, vv := range result2 {
// place2, _ := dao.GetPlaceByName(db, vv.AreaName, 2, 0)
// place2.JdsCode = vv.AreaID
// dao.UpdateEntity(db, place2, "JdsCode")
// place22, _ := dao.GetPlaceByName(db, vv.AreaName, 3, 0)
// if place22 != nil {
// place22.JdsCode = vv.AreaID
// dao.UpdateEntity(db, place22, "JdsCode")
// }
// result3, _ := api.JdShopAPI.GetCounty(vv.AreaID)
// for _, vvv := range result3 {
// place3, _ := dao.GetPlaceByName(db, vvv.AreaName, 3, 0)
// place3.JdsCode = vvv.AreaID
// dao.UpdateEntity(db, place3, "JdsCode")
// }
// }
// }
// var (
// jdStoreIDs = []string{"12007046"}
// jdStoreIDxipu = "12005417"
// skuMap = make(map[string]partner.StoreSkuInfo)
// priceList = make(map[string][]*partner.StoreSkuInfo)
// statusList1 = make(map[string][]*partner.StoreSkuInfo)
// statusList2 = make(map[string][]*partner.StoreSkuInfo)
// stockList = make(map[string][]*partner.StoreSkuInfo)
// vendorOrgCode = "320406"
// vendorOrgCode = "82029"
// )
//京东商城商品不同
// type tTmp struct {
// SkuID int `json:"skuID"`
// Reason string `json:"reason"`
// handler := partner.GetPurchasePlatformFromVendorID(model.VendorIDJD).(partner.IPurchasePlatformStoreSkuHandler)
// multiHandler := partner.GetPurchasePlatformFromVendorID(model.VendorIDJD).(partner.IMultipleStoresHandler)
// allSkuNameInfoList, err := multiHandler.GetSkus(ctx, vendorOrgCode, 0, "")
// skuInfos := storeSkuFullList2BareFilter(allSkuNameInfoList)
// outStoreSkuList, err := handler.GetStoreSkusBareInfo(ctx, vendorOrgCode, nil, 0, jdStoreIDxipu, skuInfos)
// for _, vv := range outStoreSkuList {
// skuMap[vv.VendorSkuID] = *vv
// }
// var vendorMap = make(map[int]*partner.SkuNameInfo)
// var localMap = make(map[int]*model.StoreSkuBind)
// var addList, deleteList []int
// var updateList []*tTmp
// vendorStock2JxStatus := func(stock int) (status int) {
// if stock > 0 {
// return model.StoreSkuBindStatusNormal
// for _, jdStoreID := range jdStoreIDs {
// skuInfos2 := storeSkuFullList2BareFilter(allSkuNameInfoList)
// outStoreSkuList2, _ := handler.GetStoreSkusBareInfo(ctx, vendorOrgCode, nil, 0, jdStoreID, skuInfos2)
// for _, v := range outStoreSkuList2 {
// v.VendorPrice = utils.Float64TwoInt64(float64(v.VendorPrice) * 1.05)
// priceList[jdStoreID] = append(priceList[jdStoreID], v)
// a := skuMap[v.VendorSkuID]
// if &a == nil {
// continue
// }
// if a.VendorPrice != v.VendorPrice {
// v.VendorPrice = a.VendorPrice
// priceList[jdStoreID] = append(priceList[jdStoreID], v)
// }
// if a.Status != v.Status {
// v.Status = a.Status
// if v.Status == model.SkuStatusNormal {
// statusList1[jdStoreID] = append(statusList1[jdStoreID], v)
// } else {
// return model.StoreSkuBindStatusDontSale
// statusList2[jdStoreID] = append(statusList2[jdStoreID], v)
// }
// }
// handler := partner.GetPurchasePlatformFromVendorID(model.VendorIDJDShop).(partner.ISingleStoreStoreSkuHandler)
// skuNameList, err := handler.GetStoreSkusFullInfo(ctx, nil, 0, "", nil)
// storeSkuList, err := dao.GetStoresSkusInfo(dao.GetDB(), []int{model.JdShopMainStoreID}, nil)
// for _, v := range skuNameList {
// vendorMap[v.SkuList[0].SkuID] = v
// if a.Stock != v.Stock {
// v.Stock = a.Stock
// stockList[jdStoreID] = append(stockList[jdStoreID], v)
// }
// }
// }
// task := tasksch.NewParallelTask("syncStoreSkuNew", tasksch.NewParallelConfig().SetParallelCount(1).SetIsContinueWhenError(true), ctx,
// func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) {
// step := batchItemList[0].(int)
// switch step {
// case 0:
// if len(priceList) > 0 {
// for k, v := range priceList {
// _, err = putils.FreeBatchStoreSkuInfo("更新门店商品价格", func(task tasksch.ITask, batchedStoreSkuList []*partner.StoreSkuInfo) (result interface{}, successCount int, err error) {
// failedList, err := handler.UpdateStoreSkusPrice(ctx, vendorOrgCode, 0, k, batchedStoreSkuList)
// if len(failedList) > 0 {
// task.AddFailedList(failedList)
// }
// return nil, 1, err
// }, ctx, task, v, 50, true)
// }
// }
// case 1:
// if len(statusList1) > 0 {
// for k, v := range statusList1 {
// _, err = putils.FreeBatchStoreSkuInfo("更新门店商品状态", func(task tasksch.ITask, batchedStoreSkuList []*partner.StoreSkuInfo) (result interface{}, successCount int, err error) {
// failedList, err := handler.UpdateStoreSkusStatus(ctx, vendorOrgCode, 0, k, batchedStoreSkuList, batchedStoreSkuList[0].Status)
// if len(failedList) > 0 {
// task.AddFailedList(failedList)
// }
// return nil, 1, err
// }, ctx, task, v, 50, true)
// }
// }
// case 2:
// case 3:
// if len(stockList) > 0 {
// for k, v := range stockList {
// _, err = putils.FreeBatchStoreSkuInfo("更新门店商品库存", func(task tasksch.ITask, batchedStoreSkuList []*partner.StoreSkuInfo) (result interface{}, successCount int, err error) {
// failedList, err := handler.UpdateStoreSkusStock(ctx, vendorOrgCode, 0, k, batchedStoreSkuList)
// if len(failedList) > 0 {
// task.AddFailedList(failedList)
// }
// return nil, 1, err
// }, ctx, task, v, 50, true)
// }
// }
// for _, v := range storeSkuList {
// if vendorMap[v.SkuID] == nil {
// if v.Status == model.StoreSkuBindStatusNormal {
// addList = append(addList, v.SkuID)
// }
// } else {
// if int64(v.JdsPrice) != vendorMap[v.SkuID].SkuList[0].VendorPrice {
// updateList = append(updateList, &tTmp{
// SkuID: v.SkuID,
// Reason: "价格不同",
// })
// return retVal, err
// }, []int{0})
// tasksch.HandleTask(task, nil, true).Run()
// _, err = task.GetResult(0)
//建店
// var (
// storeMaps []*model.StoreMap
// db = dao.GetDB()
// )
// if configs, err := dao.QueryConfigs(dao.GetDB(), "jdsCookie2", model.ConfigTypeCookie, ""); err == nil {
// api.JdShop2API.SetCookieWithStr(configs[0].Value)
// }
// sql := `
// SELECT * from store_map where vendor_id = 5 and deleted_at = '1970-01-01 00:00:00' and vendor_org_code = 2 and store_id <> 667281
// AND store_id <> 100000
// AND store_id <> 102919
// AND LENGTH(vendor_store_id) < 9
// `
// err = dao.GetRows(db, &storeMaps, sql, nil)
// for _, v := range storeMaps {
// store, _ := dao.GetStoreDetail(db, v.StoreID, model.VendorIDJDShop, "2")
// err = api.JdShop2API.DeleteStoresByID(utils.Str2Int64(store.VendorStoreID))
// time.Sleep(time.Second)
// data, _, _ := jxutils.DownloadFileByURL(jdshopapi.JdsStoreImg)
// url, _ := api.JdShop2API.UploadImageNew(data, "2659335b16e3880e367759b8fc675933.tem.png")
// ex := store.LicenceExpire
// if ex == "" {
// ex = utils.Time2Str(utils.Str2Time(store.LicenceValid).AddDate(0, 6, 0))
// }
// if !strings.Contains(ex, "00:00:00") {
// ex += " 00:00:00"
// }
// var url2 string
// if store.Licence != "" {
// data2, _, _ := jxutils.DownloadFileByURL(store.Licence)
// fileName := store.Licence[strings.LastIndex(store.Licence, "/")+1 : len(store.Licence)]
// url2, _ = api.JdShop2API.UploadImageNew(data2, fileName)
// }
// storeName := store.Name
// if strings.Contains(storeName, "") {
// storeName = storeName[0:strings.Index(storeName, "")] + storeName[strings.Index(storeName, "")+3:len(storeName)]
// }
// if strings.Contains(storeName, "(") {
// storeName = storeName[0:strings.Index(storeName, "(")] + storeName[strings.Index(storeName, ")")+3:len(storeName)]
// }
// if strings.Contains(storeName, ".") {
// storeName = strings.ReplaceAll(storeName, ".", "")
// }
// if strings.Contains(storeName, "-") {
// storeName = strings.ReplaceAll(storeName, "-", "")
// }
// if strings.Contains(storeName, " ") {
// storeName = strings.ReplaceAll(storeName, " ", "")
// }
// storeName = "京西菜市" + strings.ReplaceAll(storeName, "店", "") + "生鲜店"
// if len(storeName) > 30 {
// storeName = utils.LimitUTF8StringLen2(storeName, 30)
// }
// param := &jdshopapi.UpdateBasicParam{
// StoreName: storeName,
// CategoryID2: 4,
// Coordinate: utils.Float64ToStr(jxutils.IntCoordinate2Standard(store.Lat)) + "," + utils.Float64ToStr(jxutils.IntCoordinate2Standard(store.Lng)),
// BussinessBeginTime: int2TimeStr(int(store.OpenTime1)),
// BussinessEndTime: int2TimeStr(int(store.CloseTime1)),
// ImgURL: url,
// StorePhone: store.Tel1,
// AddName: store.Address,
// AddCode3: store.JdsCode,
// CategoryID1: 3,
// }
// if url2 != "" {
// param.CategoryID1 = 34
// param.CategoryID2 = 62
// param.QualificationRequests = []*jdshopapi.QualificationRequests{
// &jdshopapi.QualificationRequests{
// QualificationID: 41,
// QualificationName: "营业执照",
// QualificationNo: store.LicenceCode,
// QualificationURL: url2,
// StartTime: utils.Time2Str(utils.Str2Time(store.LicenceValid)),
// EndingTime: ex,
// Time: []string{utils.Time2Str(utils.Str2Time(store.LicenceValid)), ex},
// },
// }
// if v.Status != vendorStock2JxStatus(vendorMap[v.SkuID].SkuList[0].Stock) {
// updateList = append(updateList, &tTmp{
// SkuID: v.SkuID,
// Reason: "库存可售不同",
// })
// }
// skus, _ := dao.GetSkus(dao.GetDB(), []int{v.SkuID}, nil, nil, nil, nil)
// if skus[0].Comment != "" {
// if skus[0].Comment != vendorMap[v.SkuID].SkuList[0].Comment {
// updateList = append(updateList, &tTmp{
// SkuID: v.SkuID,
// Reason: "备注与销售属性不同",
// })
// }
// if store.JdsStreetCode != 0 {
// param.AddCode3 = store.JdsStreetCode
// }
// if param.AddCode3 == 0 {
// param.AddCode3 = store.JdCode
// }
// //证明这个店可能隶属直辖市或者东莞
// if model.ZXCityCodeMap[store.CityCode] != "" {
// result, _ := api.AutonaviAPI.GetCoordinateAreaInfo(jxutils.IntCoordinate2Standard(store.Lng), jxutils.IntCoordinate2Standard(store.Lat))
// if result["regeocode"] != nil {
// street := result["regeocode"].(map[string]interface{})["addressComponent"].(map[string]interface{})["township"].(string)
// if street != "" {
// result1, _ := api.JdShopAPI.GetProvince()
// for _, v := range result1 {
// if strings.Contains(store.CityName, v.AreaName) {
// result2, _ := api.JdShopAPI.GetCity(v.AreaID)
// for _, vv := range result2 {
// if strings.Contains(store.DistrictName, vv.AreaName) {
// result3, _ := api.JdShopAPI.GetCounty(vv.AreaID)
// for _, vvv := range result3 {
// if street == vvv.AreaName {
// param.AddCode3 = vvv.AreaID
// break
// }
// }
// }
// }
// }
// }
// }
// }
// }
// localMap[v.SkuID] = v
// }
// for k, _ := range vendorMap {
// if localMap[k] == nil {
// deleteList = append(deleteList, k)
// if vendorStroeID, err := api.JdShop2API.SubmitBasic(param); err == nil {
// v.VendorStoreID = utils.Int64ToStr(vendorStroeID)
// dao.UpdateEntity(db, v, "VendorStoreID")
// time.Sleep(time.Second)
// err = api.JdShop2API.UpdateExpand(int(vendorStroeID))
// }
// }
// fmt.Println("addList2", addList)
// fmt.Println("updateList2", utils.Format4Output(updateList, false))
// fmt.Println("deleteList2", deleteList)
// cms.DeletedDuplicateWaitAuditData(ctx, dao.GetDB())
// orderman.RefreshJdShopOrdersEarningPrice(jxcontext.AdminCtx, time.Now().AddDate(0, 0, -2).Format("20060102"), time.Now().Format("20060102"))
var (
db = dao.GetDB()
goods []*model.GoodsOrder
)
sql := `SELECT * from goods_order where vendor_id = 0 and buyer_comment = '【JD】' and total_shop_money = 0 and status = 110
AND order_created_at > '2020-09-01'`
dao.GetRows(db, &goods, sql, nil)
for _, order2 := range goods {
results, err := api.JdAPI.GetJdShopOrders(order2.OrderCreatedAt.AddDate(0, 0, -1).Format("20060102"), order2.OrderCreatedAt.Format("20060102"), globals.JdOrgCode, globals.JdLoginName)
if err != nil || results == nil {
return err
}
for _, v := range results.BillList.Result {
if v.DueAmount != 0 {
order, _ := partner.CurOrderManager.LoadOrder(utils.Int64ToStr(v.OrderID), model.VendorIDJD)
stores, _ := dao.GetStoreList(db, []int{jxutils.GetSaleStoreIDFromOrder(order)}, nil, nil, nil, "")
if len(stores) > 0 {
store := stores[0]
if order.NewEarningPrice == 0 {
jxutils.RefreshOrderEarningPrice2(order, store.PayPercentage)
}
if order.TotalShopMoney == 0 {
order.TotalShopMoney = utils.Float64TwoInt64(v.DueAmount * 100)
}
dao.UpdateEntity(db, order, "TotalShopMoney", "NewEarningPrice")
}
}
//分类
// var (
// db = dao.GetDB()
// )
// catResult, _ := api.JdShop2API.FindShopCategories()
// for _, v := range catResult {
// var skuCat *model.SkuCategory
// sql := `
// SELECT *
// FROM sku_category
// WHERE deleted_at = ?
// AND name = ?
// AND is_exd_spec = 0
// `
// sqlParams := []interface{}{utils.DefaultTimeValue, v.Name}
// err = dao.GetRow(db, &skuCat, sql, sqlParams)
// if skuCat != nil {
// var storeSkuCat *model.StoreSkuCategoryMap
// sql2 := `
// SELECT *
// FROM store_sku_category_map
// WHERE store_id = ?
// AND deleted_at = ?
// AND category_id = ?
// `
// sqlParams2 := []interface{}{100000, utils.DefaultTimeValue, skuCat.ID}
// err = dao.GetRow(db, &storeSkuCat, sql2, sqlParams2)
// if storeSkuCat != nil {
// storeSkuCat.JdsID = v.CID
// dao.UpdateEntity(db, storeSkuCat, "JdsID")
// }
// }
// }
// 京东商城补身份证
// var (
// storeMaps []*model.StoreMap
// db = dao.GetDB()
// )
// sql := `
// SELECT * from store_map where vendor_id = 5 and deleted_at = '1970-01-01 00:00:00' and vendor_org_code = 2
// AND store_id = 100117
// `
// dao.GetRows(db, &storeMaps, sql, nil)
// for _, v := range storeMaps {
// task := tasksch.NewParallelTask("uuuuu", tasksch.NewParallelConfig().SetIsContinueWhenError(true), ctx,
// func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) {
// v := batchItemList[0].(*model.StoreMap)
// detail, _ := api.JdShop2API.ShopDetail(utils.Str2Int(v.VendorStoreID))
// storeDetail, _ := dao.GetStoreDetail(db, v.StoreID, model.VendorIDJDShop, "2")
// api.JdShop2API.UpdateExpand(utils.Str2Int(v.VendorStoreID))
// var (
// url2 string
// idCode string
// startTime string
// )
// if storeDetail.IDCardFront != "" {
// data2, _, _ := jxutils.DownloadFileByURL(storeDetail.IDCardFront)
// fileName := storeDetail.IDCardFront[strings.LastIndex(storeDetail.IDCardFront, "/")+1 : len(storeDetail.IDCardFront)]
// url2, _ = api.JdShop2API.UploadImageNew(data2, fileName)
// } else {
// data2, _, _ := jxutils.DownloadFileByURL("http://image.jxc4.com/image/a9bfc170a950ab9a4c76bd10b48b222b.tem.jpg")
// fileName := "a9bfc170a950ab9a4c76bd10b48b222b.tem.jpg"
// url2, _ = api.JdShop2API.UploadImageNew(data2, fileName)
// }
// if storeDetail.IDCode == "" {
// idCode = "610126198012230014"
// } else {
// idCode = storeDetail.IDCode
// }
// if storeDetail.IDValid == "" {
// startTime = "2013-01-25 00:00:00"
// } else {
// startTime = utils.Time2Str(utils.Str2Time(storeDetail.IDValid))
// }
// ex := storeDetail.IDExpire
// if ex == "" {
// ex = utils.Time2Str(utils.Str2Time(storeDetail.IDValid).AddDate(10, 0, 0))
// }
// if !strings.Contains(ex, "00:00:00") {
// ex += " 00:00:00"
// }
// api.JdShop2API.UpdateBasic(&jdshopapi.UpdateBasicParam{
// StoreID: detail.StoreID,
// StoreName: detail.StoreName,
// CategoryID2: detail.CategoryID2,
// Coordinate: detail.Coordinate,
// BussinessBeginTime: detail.BussinessBeginTime,
// BussinessEndTime: detail.BussinessEndTime,
// ImgURL: detail.ImgURL,
// StorePhone: detail.StorePhone,
// AddName: detail.AddName,
// AddCode1: detail.AddCode1,
// AddCode2: detail.AddCode2,
// AddCode3: detail.AddCode3,
// CategoryID1: detail.CategoryID1,
// QualificationRequests: []*jdshopapi.QualificationRequests{
// &jdshopapi.QualificationRequests{
// QualificationID: 41,
// QualificationName: "营业执照",
// QualificationNo: detail.QualificationInfoTOList[0].QualificationNo,
// QualificationURL: detail.QualificationInfoTOList[0].QualificationURL,
// QualificationBusType: 2,
// QualificationBusName: storeDetail.LicenceCorpName,
// StartTime: detail.QualificationInfoTOList[0].StartTime,
// EndingTime: utils.Time2Str(utils.Str2Time(detail.QualificationInfoTOList[0].StartTime).AddDate(10, 0, 0)),
// Time: []string{detail.QualificationInfoTOList[0].StartTime, detail.QualificationInfoTOList[0].EndingTime},
// },
// &jdshopapi.QualificationRequests{
// QualificationID: 42,
// QualificationName: "身份证件",
// QualificationNo: detail.QualificationInfoTOList[1].QualificationNo,
// QualificationURL: detail.QualificationInfoTOList[1].QualificationURL,
// StartTime: detail.QualificationInfoTOList[1].StartTime,
// EndingTime: detail.QualificationInfoTOList[1].EndingTime,
// Time: []string{detail.QualificationInfoTOList[1].StartTime, detail.QualificationInfoTOList[1].EndingTime},
// QualificationNo: idCode,
// QualificationURL: url2,
// StartTime: startTime,
// EndingTime: ex,
// Time: []string{startTime, ex},
// },
// },
// })
// return retVal, err
// }, storeMaps)
// tasksch.HandleTask(task, nil, true).Run()
// task.GetID()
//删京东会员价
//var (
// db = dao.GetDB()
//)
////103065
//storeMaps, _ := dao.GetStoresMapList(db, []int{model.VendorIDJD}, nil, nil, model.StoreStatusAll, model.StoreIsSyncAll, "", "", "320406")
//things, _ := dao.GetThingMapList(db, model.ThingTypeSku, []int{model.VendorIDJD}, []int{23831, 23832, 25387, 27282}, []string{"320406"})
//thingIDmap := make(map[int64]string)
//thingIDmap2 := make(map[string]int)
//for _, v := range things {
// if v.VendorThingID != "" {
// thingIDmap[v.ThingID] = v.VendorThingID
// thingIDmap2[v.VendorThingID] = int(v.ThingID)
// }
//}
//task := tasksch.NewParallelTask("uuuuu", tasksch.NewParallelConfig().SetIsContinueWhenError(true), ctx,
// func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) {
// storeMap := batchItemList[0].(*model.StoreMap)
// storeSkus, _ := dao.GetStoresSkusInfo(db, []int{storeMap.StoreID}, []int{23831, 23832, 25387, 27282})
// result, _ := FreeBatchInfo("uuuuu2", func(task tasksch.ITask, batchedStoreSkuList []*model.StoreSkuBind) (result interface{}, successCount int, err error) {
// api := jd.GetAPI("320406")
// var ids []int64
// for _, v := range batchedStoreSkuList {
// ids = append(ids, utils.Str2Int64(thingIDmap[int64(v.SkuID)]))
// }
// priceInfo, _ := api.GetStationInfoList(storeMap.VendorStoreID, ids)
// //var list []*jdapi.SkuIdEntity
// for _, vv := range priceInfo {
// if vv.VipPrice != 0 {
// //list = append(list, &jdapi.SkuIdEntity{
// // OutSkuId: utils.Int2Str(thingIDmap2[utils.Int64ToStr(vv.SkuID)]),
// //})
// fmt.Println("fuck vip", vv.StationNo, vv.SkuID)
// }
// }
// //if len(list) > 0 {
// // err = api.DelVipPrice(utils.Int2Str(storeMap.StoreID), list)
// //}
// return result, 0, err
// }, ctx, task, storeSkus, 50, true)
// retVal = []interface{}{result}
// return retVal, err
// }, storeMaps)
//tasksch.HandleTask(task, nil, true).Run()
//_, err = task.GetResult(0)
//京东账号更新
//var (
// db = dao.GetDB()
//)
//if configs, err := dao.QueryConfigs(dao.GetDB(), "jdConfigCookie", model.ConfigTypeCookie, ""); err == nil {
// api.JdAPI.SetCookieWithStr(configs[0].Value)
// result, _ := api.JdAPI.GetJdAppInfo()
// if result != nil {
// if vocs, _ := dao.GetVendorOrgCode(db, model.VendorIDJD, result.OrgCode, model.VendorOrgTypePlatform); len(vocs) > 0 {
// vocs[0].AppKey = result.AppKey
// vocs[0].AppSecret = result.AppSecret
// dao.UpdateEntity(db, vocs[0], "AppKey", "AppSecret")
// }
// }
//}
//刷新京东真实订单号
//var (
// db = dao.GetDB()
// goods []*model.GoodsOrder
//)
//sql := `
// SELECT * FROM goods_order WHERE vendor_id = 0 and consignee_mobile2 = '' and order_created_at > '2021-04-13' and vendor_org_code = '320406'
//`
//dao.GetRows(db, &goods, sql, nil)
//for _, v := range goods {
// if configs, err := dao.QueryConfigs(dao.GetDB(), "jdStorePageCookie", model.ConfigTypeCookie, ""); err == nil {
// api.JdAPI.SetCookieWithStr(configs[0].Value)
// }
// mobile, _ := api.JdAPI.GetRealMobile4Order(v.VendorOrderID, v.VendorStoreID)
// if v.ConsigneeMobile2 == "" {
// v.ConsigneeMobile2 = mobile
// dao.UpdateEntity(db, v, "ConsigneeMobile2")
// }
//}
//补商品
//order, _ := partner.CurOrderManager.LoadOrder("2117511142000251", model.VendorIDJD)
//handler := partner.GetPurchaseOrderHandlerFromVendorID(model.VendorIDJD)
//order2, _ := handler.GetOrder(order.VendorOrgCode, order.VendorOrderID, "")
//if len(order.Skus) == 0 {
// if len(order2.Skus) > 0 {
// for _, v := range order2.Skus {
// var shopPrice int64
// if storeSkus, _ := dao.GetStoresSkusInfo(dao.GetDB(), []int{order.StoreID}, []int{v.SkuID}); len(storeSkus) > 0 {
// shopPrice = int64(storeSkus[0].Price)
// v.ShopPrice = shopPrice
// }
// dao.CreateEntity(dao.GetDB(), v)
// }
// }
//}
//加门店账号
//var (
// db = dao.GetDB()
// user = &model.User{}
//)
//store, _ := dao.GetStoreDetail(db, 668023, model.VendorIDJX, "")
//if store.Tel1 != "" {
// if user, _ = dao.GetUserByID(db, "mobile", store.Tel1); err == nil {
// if user != nil {
// //bind
// if auths, _ := dao.GetUserBindAuthInfo(db, user.UserID, 0, []string{auth2.AuthTypePassword}, "", "", nil); len(auths) > 0 {
// //已经有密码了?
// auth := auths[0]
// auth.AuthSecret2 = "AA0D5ABE801F11E98489525400AE46A6"
// auth.AuthSecret = fmt.Sprintf("%x", sha1.Sum([]byte(fmt.Sprintf("%x", md5.Sum([]byte(store.Tel1)))+auth.AuthSecret2)))
// } else {
// auth := &model.AuthBind{
// UserID: user.UserID,
// Type: auth2.AuthTypePassword,
// Status: model.YES,
// AuthID: user.UserID,
// AuthSecret2: "AA0D5ABE801F11E98489525400AE46A6",
// AuthSecret: fmt.Sprintf("%x", sha1.Sum([]byte(fmt.Sprintf("%x", md5.Sum([]byte(store.Tel1)))+"AA0D5ABE801F11E98489525400AE46A6"))),
// }
// dao.WrapAddIDCULDEntity(auth, "")
// dao.CreateEntity(db, auth)
// }
// user.BindStoreID = store.ID
// user.BindStoreUser = store.Tel1
// dao.UpdateEntity(db, user, "BindStoreID", "BindStoreUser")
// permission.UpdateUserRole(ctx, []string{user.UserID}, []int{31})
// } else {
// //注册
// }
// }
//}
//for i := 1; i < 3; i++ {
// server := "print.jxcs.net:8000"
// tcpAddr, err := net.ResolveTCPAddr("tcp4", server)
// if err != nil {
// os.Exit(1)
// return err
// }
// conn, err := net.DialTCP("tcp", nil, tcpAddr)
// if err != nil {
// return err
// }
// go connHandler(conn, "1e000f02000151323032313036313530303030313"+utils.Int2Str(i)+"00000033")
//}
act.RrefreshMtwmVendorAct()
//act.RrefreshEbaiVendorAct()
return err
}
func Hextob(str string) []byte {
slen := len(str)
bHex := make([]byte, len(str)/2)
ii := 0
for i := 0; i < len(str); i = i + 2 {
if slen != 1 {
ss := string(str[i]) + string(str[i+1])
bt, _ := strconv.ParseInt(ss, 16, 32)
bHex[ii] = byte(bt)
ii = ii + 1
slen = slen - 2
}
}
return err
return bHex
}
func connHandler(c net.Conn, msg string) (result string) {
defer c.Close()
//缓冲
buf := make([]byte, 1024)
//写入数据
c.Write(Hextob(msg))
//服务器端返回的数据写入buf
for {
n, _ := c.Read(buf)
result = string(buf[:n])
if result != "" {
fmt.Println("msg result ", result)
break
}
}
//服务器端回传的信息
return result
}
func FreeBatchInfo2(name string, handler func(tasksch.ITask, []*jdapi.SkuIdEntity) (interface{}, int, error), ctx *jxcontext.Context, parentTask tasksch.ITask, storeSkuList []*jdapi.SkuIdEntity, batchSize int, isContinueWhenError bool) (resultList []interface{}, err error) {
task := tasksch.NewParallelTask2(fmt.Sprintf("FreeBatchInfo:%s", name), tasksch.NewParallelConfig().SetParallelCount(1).SetBatchSize(batchSize).SetIsContinueWhenError(isContinueWhenError), ctx,
func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, successCount int, err error) {
batchStoreSkuList := make([]*jdapi.SkuIdEntity, len(batchItemList))
for k, v := range batchItemList {
batchStoreSkuList[k] = v.(*jdapi.SkuIdEntity)
}
retVal, successCount, err = handler(task, batchStoreSkuList)
if err != nil {
retVal = nil
}
return retVal, successCount, err
}, storeSkuList)
tasksch.HandleTask(task, parentTask, false).Run()
resultList, err = task.GetResult(0)
return resultList, err
}
func FreeBatchInfo(name string, handler func(tasksch.ITask, []*model.StoreSkuBind) (interface{}, int, error), ctx *jxcontext.Context, parentTask tasksch.ITask, storeSkuList []*model.StoreSkuBind, batchSize int, isContinueWhenError bool) (resultList []interface{}, err error) {
task := tasksch.NewParallelTask2(fmt.Sprintf("FreeBatchInfo:%s", name), tasksch.NewParallelConfig().SetParallelCount(1).SetBatchSize(batchSize).SetIsContinueWhenError(isContinueWhenError), ctx,
func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, successCount int, err error) {
batchStoreSkuList := make([]*model.StoreSkuBind, len(batchItemList))
for k, v := range batchItemList {
batchStoreSkuList[k] = v.(*model.StoreSkuBind)
}
retVal, successCount, err = handler(task, batchStoreSkuList)
if err != nil {
retVal = nil
}
return retVal, successCount, err
}, storeSkuList)
tasksch.HandleTask(task, parentTask, false).Run()
resultList, err = task.GetResult(0)
return resultList, err
}
func int2TimeStr(time int) (str string) {
str += utils.Int2Str(time / 1000)
str += utils.Int2Str(time % 1000 / 100)
str += ":"
str += utils.Int2Str(time % 100 / 10)
str += utils.Int2Str(time % 10)
return str
}
func storeSkuFullList2BareFilter(storeSkuFull []*partner.SkuNameInfo) (bareStoreSkuList []*partner.StoreSkuInfo) {
for _, v := range storeSkuFull {
for _, v2 := range v.SkuList {
// if v2.Status > model.SkuStatusDontSale {
bareStoreSkuList = append(bareStoreSkuList, &v2.StoreSkuInfo)
// }
}
}
return bareStoreSkuList
}
func RefreshJXPriceChange(ctx *jxcontext.Context, storeID int) (hint string, err error) {
@@ -1641,7 +2107,7 @@ func RefreshJXPriceChange(ctx *jxcontext.Context, storeID int) (hint string, err
store := batchItemList[0].(*model.Store)
var skuBindInfos []*cms.StoreSkuBindInfo
for _, v := range vendorIDs {
storeMaps, _ := dao.GetStoresMapList(db, []int{v}, []int{store.ID}, nil, model.StoreStatusAll, model.StoreIsSyncAll, "", "")
storeMaps, _ := dao.GetStoresMapList(db, []int{v}, []int{store.ID}, nil, model.StoreStatusAll, model.StoreIsSyncAll, "", "", "")
if len(storeMaps) > 0 {
storeMap := storeMaps[0]
switch v {

View File

@@ -23,8 +23,10 @@ import (
const (
qiniuTokenExpires = 300 // 七牛TOKEN有效时间5分钟
MainImgWidth = 800
MainImgHeight = 800
MainImgWidth = 800
MainImgHeight = 800
MainImgWidth2 = 500
MainImgHeight2 = 500
)
type UploadResTokenInfo struct {
@@ -81,7 +83,7 @@ func RegisterDataResource(ctx *jxcontext.Context, name, resourceURL, mimeType, h
return nil, err
}
if imgType == model.ImgTypeMain {
if img.Bounds().Dx() != MainImgWidth || img.Bounds().Dy() != MainImgHeight {
if (img.Bounds().Dx() != MainImgWidth || img.Bounds().Dy() != MainImgHeight) && (img.Bounds().Dx() != MainImgWidth2 || img.Bounds().Dy() != MainImgHeight2) {
return nil, fmt.Errorf("图片大小:%dx%d非法要求必须:%dx%d", img.Bounds().Dx(), img.Bounds().Dy(), MainImgWidth, MainImgHeight)
}
}

View File

@@ -71,7 +71,7 @@ func (l OrderSkuList) Swap(i, j int) {
func init() {
rand.Seed(time.Now().Unix())
routinePool = routinepool.New(1000, 1000)
routinePool = routinepool.New(2000, 2000)
// Go regex does not support lookarounds.
// https://stackoverflow.com/questions/38933898/error-parsing-regexp-invalid-or-unsupported-perl-syntax
@@ -135,39 +135,42 @@ func SplitUniversalOrderID(universalOrderID string) (orderID string, vendorID in
func GetPossibleVendorIDFromVendorOrderID(vendorOrderID string) (vendorID int) {
vendorID = model.VendorIDUnknown
if vendorOrderIDInt64 := utils.Str2Int64WithDefault(vendorOrderID, 0); vendorOrderIDInt64 > 0 {
orderIDLen := len(vendorOrderID)
// 5287873015048 13 wsc
// 15380342248732 14 old ebai order
// 800402581000221 15,16 jd order
// 33437032333978492 17 mtwm order
// 3022716176275221584 19 elm order, new ebai order
//if vendorOrderIDInt64 := utils.Str2Int64WithDefault(vendorOrderID, 0); vendorOrderIDInt64 > 0 {
orderIDLen := len(vendorOrderID)
globals.SugarLogger.Debugf("GetPossibleVendorIDFromVendorOrderID, orderIDLen: %v", orderIDLen)
// 5287873015048 13 wsc
// 15380342248732 14 old ebai order
// 800402581000221 15,16 jd order
// 33437032333978492 17 mtwm order
// 3022716176275221584 19 elm order, new ebai order
// 京东到家从2020年开始订单号的长度都会在现有基础上加一位订单号的前两位取的是当年的最后两位数2020取的20以适应业务的发展。
// 改造点:
// 1、订单号位数变化由原有15位数增加1位数调整为16位数对接商家需检查是否有对订单号位数做长度校验。
// 2、第一位数字发生变化由原来9开头调整为当年年份后两位数如2020年订单开头为20
if orderIDLen == len("925265130002541") || orderIDLen == len("1925265130002541") {
vendorID = model.VendorIDJD
} else if orderIDLen == len("3022716176275221584") {
// vendorID = model.VendorIDELM
vendorID = model.VendorIDEBAI // 饿百零售开放平台订单接口中订单ID“order_id”字段长度将调整为19位和饿了么订单ID“eleme_order_id”字段格式保持一致。
} else if orderIDLen == len("15380342248732") {
if vendorOrderID[:2] == "88" {
vendorID = model.VendorIDJX
} else {
vendorID = model.VendorIDEBAI
}
} else if orderIDLen == len("33437032333978492") {
vendorID = model.VendorIDMTWM
} else if orderIDLen == len("5287873015048") {
vendorID = model.VendorIDWSC
} else if orderIDLen == len("1000004390") {
// 京东到家从2020年开始订单号的长度都会在现有基础上加一位订单号的前两位取的是当年的最后两位数2020取的20以适应业务的发展。
// 改造点:
// 1、订单号位数变化由原有15位数增加1位数调整为16位数对接商家需检查是否有对订单号位数做长度校验。
// 2、第一位数字发生变化由原来9开头调整为当年年份后两位数如2020年订单开头为20
if orderIDLen == len("925265130002541") || orderIDLen == len("1925265130002541") {
vendorID = model.VendorIDJD
} else if orderIDLen == len("3022716176275221584") {
// vendorID = model.VendorIDELM
vendorID = model.VendorIDEBAI // 饿百零售开放平台订单接口中订单ID“order_id”字段长度将调整为19位和饿了么订单ID“eleme_order_id”字段格式保持一致。
} else if orderIDLen == len("15380342248732") {
if vendorOrderID[:2] == "88" {
vendorID = model.VendorIDJX
} else if orderIDLen == len("124557362562000001") || orderIDLen == len("13153183146800000100") {
vendorID = model.VendorIDJDShop
} else {
vendorID = model.VendorIDEBAI
}
} else if orderIDLen == len("33437032333978492") || orderIDLen == len("116379390766579767") {
vendorID = model.VendorIDMTWM
} else if orderIDLen == len("5287873015048") {
vendorID = model.VendorIDWSC
} else if orderIDLen == len("1000004390") {
vendorID = model.VendorIDJX
} else if orderIDLen == len("18100216009800000001") || orderIDLen == len("191075245758000000039") {
vendorID = model.VendorIDJDShop
}
//} else {
// globals.SugarLogger.Debugf("GetPossibleVendorIDFromVendorOrderID, 2: %v", vendorOrderID)
//}
return vendorID
}
@@ -219,6 +222,7 @@ func GetPossibleVendorIDFromAfsOrderID(afsOrderID string) (vendorID int) {
func ComposeUniversalOrderID(orderID string, vendorID int) string {
// return fmt.Sprintf("%s|%d", orderID, vendorID)
return orderID // 当前用长度就能区分先不加上vendorID
// return orderID + utils.Int64ToStr(time.Now().Unix())
}
func GetUniversalOrderIDFromWaybill(bill *model.Waybill) string {
@@ -267,6 +271,26 @@ func WalkingDistance(lng1, lat1, lng2, lat2 float64) (distance float64) {
return distance
}
//经纬度坐标转换到平面坐标
func MillierConvertion(lat float64, lon float64) [2]float64 {
var L, H, W, temp, mill, x, y float64
L = 6371.393 * math.Pi * 2 //地球周长
W = L // 平面展开后x轴等于周长
H = L / 2 // y轴约等于周长一半
mill = 2.3 // 米勒投影中的一个常数范围大约在正负2.3之间
temp = math.Pi
x = lon * temp / 180 // 将经度从度数转换为弧度
y = lat * temp / 180 // 将纬度从度数转换为弧度
y = 1.25 * math.Log(math.Tan(0.25*temp+0.4*y)) // 米勒投影的转换
// 弧度转为实际距离
x = (W / 2) + (W/(2*math.Pi))*x
y = (H / 2) - (H/(2*mill))*y
x = utils.Str2Float64(fmt.Sprintf("%.2f", x))
y = utils.Str2Float64(fmt.Sprintf("%.2f", y))
var result = [2]float64{x, y}
return result
}
func StandardCoordinate2Int(value float64) int {
return int(math.Round(value * 1000000))
}
@@ -396,7 +420,7 @@ func ComposeSkuNameOriginal(prefix, name, comment, unit string, spec_quality flo
return skuName
}
func ComposeSkuNameForJds(prefix, name, comment, unit string, spec_quality float32, spec_unit string, maxLen int) (skuName string) {
func ComposeSkuNameForMTWM(prefix, name, comment, unit string, spec_quality float32, spec_unit string, maxLen int) (skuName string) {
strBuilder := &strings.Builder{}
if prefix != "" {
strBuilder.WriteString("[")
@@ -405,15 +429,16 @@ func ComposeSkuNameForJds(prefix, name, comment, unit string, spec_quality float
}
skuName += name
strBuilder.WriteString(name)
if comment != "" {
strBuilder.WriteString(" ")
strBuilder.WriteString(comment)
}
if unit == "份" {
strBuilder.WriteString("约")
}
strBuilder.WriteString("")
if unit != "" {
strBuilder.WriteString(ComposeSkuSpec(spec_quality, spec_unit))
strBuilder.WriteString("/")
strBuilder.WriteString(unit)
}
if comment != "" {
strBuilder.WriteString("(")
strBuilder.WriteString(comment)
strBuilder.WriteString(")")
}
skuName = strBuilder.String()
if maxLen > 0 {
@@ -432,10 +457,12 @@ func ComposeSkuName(prefix, name, comment, unit string, spec_quality float32, sp
return skuName
}
func ComposeSkuNameSync(prefix, name, comment, unit string, spec_quality float32, spec_unit string, maxLen int, exPrefix string, exPrefixBegin, exPrefixEnd *time.Time) (skuName string) {
func ComposeSkuNameSync(prefix, name, comment, unit string, spec_quality float32, spec_unit string, maxLen int, exPrefix string, exPrefixBegin, exPrefixEnd *time.Time, isEx bool) (skuName string) {
if exPrefix != "" && exPrefixBegin != nil && exPrefixEnd != nil {
if utils.Time2Date(time.Now().Add(6*time.Hour)).Sub(*exPrefixBegin) >= 0 && utils.Time2Date(time.Now()).Sub(*exPrefixEnd) <= 0 {
skuName = exPrefix
if isEx {
skuName = exPrefix
}
}
if utils.Time2Date(time.Now().Add(6*time.Hour)).Sub(*exPrefixEnd) > 0 {
skuName = ""
@@ -445,16 +472,18 @@ func ComposeSkuNameSync(prefix, name, comment, unit string, spec_quality float32
return skuName
}
func ComposeSkuNameSync2(prefix, name, comment, unit string, spec_quality float32, spec_unit string, maxLen int, exPrefix string, exPrefixBegin, exPrefixEnd *time.Time) (skuName string) {
func ComposeSkuNameSync2(prefix, name, comment, unit string, spec_quality float32, spec_unit string, maxLen int, exPrefix string, exPrefixBegin, exPrefixEnd *time.Time, isEx bool) (skuName string) {
if exPrefix != "" && exPrefixBegin != nil && exPrefixEnd != nil {
if utils.Time2Date(time.Now().Add(6*time.Hour)).Sub(*exPrefixBegin) >= 0 && utils.Time2Date(time.Now()).Sub(*exPrefixEnd) <= 0 {
skuName = exPrefix
if isEx {
skuName = exPrefix
}
}
if utils.Time2Date(time.Now().Add(6*time.Hour)).Sub(*exPrefixEnd) > 0 {
skuName = ""
}
}
skuName += ComposeSkuNameForJds(prefix, name, comment, unit, spec_quality, spec_unit, maxLen)
skuName += ComposeSkuNameForMTWM(prefix, name, comment, unit, spec_quality, spec_unit, maxLen)
return skuName
}
@@ -933,6 +962,25 @@ func TranslateSoundSize(vendorID, soundPercentage int) (soundSize string) {
if soundPercentage > 66 && soundPercentage <= 100 {
soundSize = "3"
}
} else if vendorID == model.VendorIDJxprint {
if soundPercentage == 0 {
soundSize = "0"
}
if soundPercentage > 0 && soundPercentage <= 20 {
soundSize = "1"
}
if soundPercentage > 20 && soundPercentage <= 40 {
soundSize = "2"
}
if soundPercentage > 40 && soundPercentage <= 60 {
soundSize = "3"
}
if soundPercentage > 60 && soundPercentage <= 80 {
soundSize = "4"
}
if soundPercentage > 80 && soundPercentage <= 100 {
soundSize = "5"
}
}
return soundSize
}
@@ -1037,3 +1085,17 @@ func polarTriangleArea(tan1, lng1, tan2, lng2 float64) (s float64) {
t := tan1 * tan2
return 2 * math.Atan2(t*math.Sin(deltaLng), 1+t*math.Cos(deltaLng))
}
func IntListToStrList(i []int) (s []string) {
for _, v := range i {
s = append(s, utils.Int2Str(v))
}
return s
}
func StrListToIntList(s []string) (i []int) {
for _, v := range s {
i = append(i, utils.Str2Int(v))
}
return i
}

View File

@@ -6,6 +6,7 @@ import (
"encoding/base64"
"errors"
"fmt"
beego "github.com/astaxie/beego/server/web"
"image"
"image/png"
"io/ioutil"
@@ -503,9 +504,19 @@ func GetVendorName(vendorID int) (vendorName string) {
}
func CaculateSkuEarningPrice(shopPrice, salePrice int64, storePayPercentage int) (earningPrice int64) {
earningPrice = salePrice
if salePrice != 0 {
if shopPrice > 0 && shopPrice < earningPrice {
//TODO 2021-07-05 16:50菜市和果园一样取低的
//TODO 2021-07-05 18:48 还是改回来
if beego.BConfig.RunMode == "jxgy" {
earningPrice = salePrice
if salePrice != 0 {
if shopPrice > 0 && shopPrice < earningPrice {
earningPrice = shopPrice
}
}
} else {
if shopPrice == 0 {
earningPrice = salePrice * 70 / 100
} else {
earningPrice = shopPrice
}
}

View File

@@ -81,7 +81,14 @@ func PrintOrderByOrder4Store(ctx *jxcontext.Context, order *model.GoodsOrder, st
PrintResult: partner.PrintResultNoPrinter,
}, nil
}
printResult, err = handler.PrintOrder(ctx, store, order)
storeDetail, _ := dao.GetStoreDetail(db, storeID, order.VendorID, order.VendorOrgCode)
if storeDetail == nil && order.VendorOrderID == testVendorOrderID {
storeDetail = &dao.StoreDetail{
BrandName: testVendorOrderID,
BrandIsPrint: model.NO,
}
}
printResult, err = handler.PrintOrder(ctx, store, storeDetail, order)
if err == nil {
dao.SetOrderPrintFlag(db, ctx.GetUserName(), order.VendorOrderID, order.VendorID, true)
}

View File

@@ -42,11 +42,12 @@ func SendSMSMsg(mobileList []string, signName, templateCode string, templatePara
} else {
globals.SugarLogger.Infof(errMsg)
}
} else {
if order != nil {
err = updateStoreSMSNotifyMark(order)
}
}
// else {
// if order != nil {
// err = updateStoreSMSNotifyMark(order)
// }
// }
}
}
}
@@ -61,10 +62,29 @@ func getOrderNotifyPhone(order *model.GoodsOrder) (phoneList []string) {
func NotifyNewOrder(order *model.GoodsOrder) (err error) {
if isPushSMS(order) {
err = SendSMSMsg(getOrderNotifyPhone(order), globals.SMSSignName, globals.SMSNewOrderTemplate, map[string]interface{}{
temp := ""
var price int64
store, _ := dao.GetStoreDetail(dao.GetDB(), jxutils.GetSaleStoreIDFromOrder(order), order.VendorID, order.VendorOrgCode)
if store.VendorPayPercentage < 50 && store.VendorPayPercentage != 0 {
temp = globals.SMSNewOrderTemplate
price = order.ActualPayPrice
} else if store.VendorPayPercentage > 50 {
temp = globals.SMSNewOrderTemplateQ
price = order.ShopPrice
} else if store.VendorPayPercentage == 0 {
if store.PayPercentage > 50 {
temp = globals.SMSNewOrderTemplateQ
price = order.ShopPrice
} else {
temp = globals.SMSNewOrderTemplate
price = order.ActualPayPrice
}
}
err = SendSMSMsg(getOrderNotifyPhone(order), globals.SMSSignName, temp, map[string]interface{}{
"daySeq": order.OrderSeq,
"consigneeName": order.ConsigneeName,
"payMoney": jxutils.IntPrice2StandardString(order.ActualPayPrice),
"payMoney": jxutils.IntPrice2StandardString(price),
}, order)
}
return err
@@ -86,10 +106,10 @@ func isPushSMS(order *model.GoodsOrder) bool {
} else {
storeID = order.StoreID
}
stores, _ := dao.GetStoresMapList(dao.GetDB(), []int{order.VendorID}, []int{storeID}, nil, model.StoreStatusAll, model.StoreIsSyncAll, "", "")
stores, _ := dao.GetStoresMapList(dao.GetDB(), []int{order.VendorID}, []int{storeID}, nil, model.StoreStatusAll, model.StoreIsSyncAll, "", "", "")
if len(stores) > 0 {
if stores[0].IsOrder == model.NO {
if storeID == model.MatterStoreID {
if storeID == model.MatterStoreID || storeID == model.JdShopMainStoreID {
return false
} else {
return true
@@ -104,7 +124,7 @@ func isPushSMS(order *model.GoodsOrder) bool {
func updateStoreSMSNotifyMark(order *model.GoodsOrder) (err error) {
var db = dao.GetDB()
stores, _ := dao.GetStoreList(db, []int{order.StoreID}, nil, nil, nil, "")
stores, _ := dao.GetStoreList(db, []int{order.StoreID}, nil, nil, nil, nil, "")
if len(stores) > 0 {
stores[0].SMSNotifyMark = model.YES
_, err = dao.UpdateEntity(db, stores[0], "SMSNotifyMark")
@@ -128,7 +148,7 @@ func NotifyNewUserOrder(order *model.GoodsOrder) (err error) {
if order.ConsigneeMobile2 != "" {
mobile = order.ConsigneeMobile2
uoSMS, err := dao.GetUserOrderSMS(db, mobile, "")
stores, _ := dao.GetStoreList(db, []int{storeID}, nil, nil, nil, "")
stores, _ := dao.GetStoreList(db, []int{storeID}, nil, nil, nil, nil, "")
if len(stores) > 0 {
if stores[0].Tel1 == "" {
storeTel = stores[0].Tel2
@@ -185,7 +205,7 @@ func NotifyNewCourierOrder(bill *model.Waybill) (err error) {
} else {
storeID = order.StoreID
}
stores, _ := dao.GetStoreList(db, []int{storeID}, nil, nil, nil, "")
stores, _ := dao.GetStoreList(db, []int{storeID}, nil, nil, nil, nil, "")
if len(stores) > 0 {
if stores[0].Tel1 == "" {
storeTel = stores[0].Tel2
@@ -198,3 +218,11 @@ func NotifyNewCourierOrder(bill *model.Waybill) (err error) {
}, nil)
return err
}
//京西订单配送员取货后,给用户发短信提醒
func NotifyJxOrder(order *model.GoodsOrder, bill *model.Waybill) (err error) {
err = SendSMSMsg([]string{order.ConsigneeMobile}, globals.SMSSignName, globals.SMSJxOrderDelivering, map[string]interface{}{
"phone": bill.CourierMobile,
}, order)
return err
}

View File

@@ -19,8 +19,8 @@ import (
"git.rosy.net.cn/baseapi/utils"
"git.rosy.net.cn/jx-callback/globals"
"github.com/astaxie/beego"
"github.com/astaxie/beego/orm"
"github.com/astaxie/beego/client/orm"
beego "github.com/astaxie/beego/server/web"
)
const (
@@ -29,6 +29,7 @@ const (
weimobTokenExpires = 7200 * time.Second
yilianyunTokenExpires = 30 * 24 * 3600 * time.Second
pushTokenExpires = 7200 * time.Second
fnTokenExpires = 1 * time.Hour
maxRefreshGap = 5 * 60 * time.Second
errRefreshGap = 10 * time.Second
@@ -139,6 +140,65 @@ func RefreshWeixinToken() (err error) {
return err
}
func RefreshFnToken() (err error) {
if api.FnAPI != nil {
err = RefreshConfig("fn", fnTokenExpires, func() (token string, expireTimeStr string) {
globals.SugarLogger.Debugf("RefreshFnToken RunMode:%s", beego.BConfig.RunMode)
if globals.IsMainProductEnv() {
if tokenInfo, err := api.FnAPI.GetAccessToken(); err == nil {
globals.SugarLogger.Debugf("RefreshFnToken tokenInfo:%s", utils.Format4Output(tokenInfo, true))
token = tokenInfo.AccessToken
} else {
globals.SugarLogger.Errorf("RefreshFnToken RefreshToken failed with error:%v", err)
}
sql := `
UPDATE jxgy.config SET token = ? WHERE thirdparty = ?
`
sqlParams := []interface{}{
token, "fn",
}
dao.ExecuteSQL(dao.GetDB(), sql, sqlParams)
}
if beego.BConfig.RunMode == "jxgy" {
config := &legacymodel.Config{}
sql := `
SELECT * FROM config WHERE thirdparty = 'fn'
`
if err := dao.GetRow(dao.GetDB(), &config, sql, nil); err == nil {
token = config.Token
}
}
return token, expireTimeStr
}, func(value string) {
globals.SugarLogger.Debugf("RefreshFnToken setter value:%s", value)
// syseventhub.SysEventHub.OnNewWXToken(value)
api.FnAPI.SetToken(value)
})
}
return err
}
func RefreshQywxToken() (err error) {
if api.QywxAPI != nil {
err = RefreshConfig("qywx", weixinTokenExpires, func() (token string, expireTimeStr string) {
globals.SugarLogger.Debugf("RefreshQywxToken RunMode:%s", beego.BConfig.RunMode)
if globals.IsMainProductEnv() {
if tokenInfo, err := api.QywxAPI.GetToken(); err == nil {
globals.SugarLogger.Debugf("RefreshQywxToken tokenInfo:%s", utils.Format4Output(tokenInfo, true))
token = tokenInfo
} else {
globals.SugarLogger.Errorf("RefreshQywxToken RefreshToken failed with error:%v", err)
}
}
return token, expireTimeStr
}, func(value string) {
globals.SugarLogger.Debugf("RefreshQywxToken setter value:%s", value)
api.QywxAPI.SetToken(value)
})
}
return err
}
func RefreshWeixin2Token() (err error) {
if api.WeixinMiniAPI2 != nil {
err = RefreshConfig("wechat2", weixinTokenExpires, func() (token string, expireTimeStr string) {

View File

@@ -11,7 +11,7 @@ import (
"git.rosy.net.cn/jx-callback/business/model/dao"
"git.rosy.net.cn/jx-callback/globals"
"git.rosy.net.cn/jx-callback/globals/api"
"github.com/astaxie/beego"
beego "github.com/astaxie/beego/server/web"
)
func pushToSingle(content, title string, storeID int) {
@@ -21,6 +21,9 @@ func pushToSingle(content, title string, storeID int) {
if !globals.IsProductEnv() {
return
}
if storeID == 0 {
return
}
storePushs, err := dao.GetStorePushClient(db, storeID, "")
if err != nil {
return
@@ -50,6 +53,9 @@ func pushToSingle(content, title string, storeID int) {
func NotifyNewOrder(order *model.GoodsOrder) {
globals.SugarLogger.Debugf("NotifyNewOrder push begin orderID :[%v]", order.VendorOrderID)
if order == nil || len(order.Skus) == 0 {
return
}
sb := new(strings.Builder)
sb.WriteString("老板,")
sb.WriteString(order.ConsigneeName)
@@ -74,7 +80,7 @@ func getOrderDetailBrief(order *model.GoodsOrder) (brief string) {
if order.EarningType == model.EarningTypePoints {
price = order.ActualPayPrice
} else {
price = order.ShopPrice
price = order.EarningPrice
}
}
sb.WriteString(jxutils.IntPrice2StandardString(price))

View File

@@ -1,14 +1,17 @@
package weixinmsg
import (
"encoding/json"
"fmt"
"git.rosy.net.cn/baseapi/platformapi/weixinapi"
"strings"
"time"
"github.com/astaxie/beego"
beego "github.com/astaxie/beego/server/web"
"git.rosy.net.cn/jx-callback/business/auth2/authprovider/weixin"
"git.rosy.net.cn/jx-callback/business/authz/autils"
"git.rosy.net.cn/jx-callback/business/jxstore/permission"
"git.rosy.net.cn/jx-callback/business/jxutils/jxcontext"
"git.rosy.net.cn/jx-callback/business/jxutils/netprinter"
"git.rosy.net.cn/jx-callback/business/jxutils/tasksch"
@@ -58,6 +61,7 @@ const (
WX_SALE_BILL_TEMPLATE_ID = "eTUuFZMWH7IsVBfcxNMpmaHYaxRkUaD6zG8wSGJDcic"
WX_NORMAL_STORE_ACT_MSG_TEMPLATE_ID = "eXsfOMvDOKVSht0Q0v4IsDrx3MBlRCVYwYl7Hi2uuuI"
WX_NORMAL_STORE_MSG_TEMPLATE_ID = "EUeIJEz2TLUAn4TU2EffOGYLd3dEaYndD_y6Sw9FcSU"
WX_CHANGE_APPROVED_TEMPLATE_ID = "gIG2olBZtQbjXmp6doNB_dESu60By5xuXYOGxksLv3Y"
WX_CHANGE_REJECTED_TEMPLATE_ID = "OBF4-d5inK95epHcUltpdb1zq9boVp2HESpASVRh1Oo"
@@ -71,6 +75,8 @@ const (
WS_NOTIFY_STORE_STATUS_CHHANGED_TEMPLATE_ID = "Fl0vOnBKTQqRFx3-shGKxdCnxMdQXNeODzgkuwd7oxw"
WX_STORE_ALERT_TEMPLATE_ID = "0AjzVl1wPl6iO4nFOS4IEsJYSzBymlT37DciIvcCOxE"
WX_KNOWLEDGE_BASE_TEMPLATE_ID = "1Fc703r13L3KQ6r_jdql2em_YhQ9CyOXTnqtDx-6Hx8" //知识库模板
)
var (
@@ -100,7 +106,7 @@ func GetWeixinOpenIDsFromStoreID(storeID int) (retVal []string) {
if globals.EnableWXAuth2 {
if userIDList, err2 := api2.RoleMan.GetRoleUserList(autils.NewStoreBossRole(storeID)); err2 == nil {
for _, v := range userIDList {
if authList, err2 := dao.GetUserBindAuthInfo(db, v, model.AuthBindTypeAuth, []string{weixin.AuthTypeMP}, "", "", ""); err2 == nil {
if authList, err2 := dao.GetUserBindAuthInfo(db, v, model.AuthBindTypeAuth, []string{weixin.AuthTypeMP}, "", "", nil); err2 == nil {
for _, v := range authList {
retVal = append(retVal, v.AuthID)
openIDMap[v.AuthID] = 1
@@ -168,6 +174,10 @@ func SmartMessageTemplateSend(userOpenID, templateID, downloadURL, miniPageURL s
return err
}
func MediaMessageSendGroup(openIDs []string, mediaID string) (err error) {
return api.WeixinAPI.CBMassSend(openIDs, mediaID)
}
func getOrderDetailBrief(order *model.GoodsOrder) (brief string) {
sb := new(strings.Builder)
sb.WriteString(order.Skus[0].SkuName)
@@ -175,20 +185,22 @@ func getOrderDetailBrief(order *model.GoodsOrder) (brief string) {
sb.WriteString(utils.Int2Str(order.Skus[0].Count))
sb.WriteString("份(")
sb.WriteString(jxutils.IntPrice2StandardString(order.Skus[0].SalePrice))
sb.WriteString("元/份)等,预计收入")
sb.WriteString("元/份)等,点击查看详情。")
//,预计收入")
//TODO 2020-07-20 果园和菜市不同
var price int64
if beego.BConfig.RunMode == "jxgy" {
price = order.NewEarningPrice
} else {
if order.EarningType == model.EarningTypePoints {
price = order.ActualPayPrice
} else {
price = order.ShopPrice
}
}
sb.WriteString(jxutils.IntPrice2StandardString(price))
sb.WriteString("元")
//TODO 2021-06-15 都不显示钱了
//var price int64
//if beego.BConfig.RunMode == "jxgy" {
// price = order.NewEarningPrice
//} else {
// if order.EarningType == model.EarningTypePoints {
// price = order.ActualPayPrice
// } else {
// price = order.EarningPrice
// }
//}
//sb.WriteString(jxutils.IntPrice2StandardString(price))
//sb.WriteString("元")
return sb.String()
}
@@ -198,12 +210,21 @@ func NotifyNewOrder(order *model.GoodsOrder) (err error) {
return nil
}
if len(order.Skus) == 0 {
return nil
}
if !model.IsOrderSolid(order) {
globals.SugarLogger.Infof("NotifyNewOrder orderID:%s is not solid", order.VendorOrderID)
return nil
}
suffix := ""
storeDetail, err := dao.GetStoreDetail(dao.GetDB(), jxutils.GetSaleStoreIDFromOrder(order), order.VendorID, "")
if err == nil && storeDetail != nil {
suffix = storeDetail.CityName + "," + storeDetail.Name
}
sb := new(strings.Builder)
sb.WriteString("老板,")
sb.WriteString(suffix + "老板,")
sb.WriteString(order.ConsigneeName)
sb.WriteString("购买了商品")
sb.WriteString(getOrderDetailBrief(order))
@@ -234,6 +255,9 @@ func NotifyNewOrder(order *model.GoodsOrder) (err error) {
},
}
storeID := jxutils.GetSaleStoreIDFromOrder(order)
//return SendMsgToStore(storeID, WX_NEWORDER_TEMPLATE_ID, globals.WxBackstageHost+fmt.Sprintf("%s%d", WX_TO_ORDER_PAGE_URL, storeID), WX_MINI_TO_ORDER_PAGE_URL+fmt.Sprintf("?jxStoreId=%v", storeID), data)
//dataStore := fmt.Sprintf(`{"address":"%s","cityName":"%s","id":%d,"name":"%s","payeeName":"%s","status":%d,"tel1":"%s","tel2":"%s"}`, storeDetail.Address, storeDetail.CityName, storeDetail.ID, storeDetail.Name, storeDetail.PayeeName, storeDetail.Status, storeDetail.Tel1, storeDetail.Tel2)
//url := WX_MINI_TO_ORDER_PAGE_URL + fmt.Sprintf("?jxStoreId=%v&data=%v", storeID, dataStore)
return SendMsgToStore(storeID, WX_NEWORDER_TEMPLATE_ID, globals.WxBackstageHost+fmt.Sprintf("%s%d", WX_TO_ORDER_PAGE_URL, storeID), WX_MINI_TO_ORDER_PAGE_URL, data)
}
@@ -248,6 +272,11 @@ func NotifyWaybillStatus(bill *model.Waybill, order *model.GoodsOrder, isBillAlr
return nil
}
var title string
suffix := ""
storeDetail, err := dao.GetStoreDetail(dao.GetDB(), jxutils.GetSaleStoreIDFromOrder(order), order.VendorID, "")
if err == nil && storeDetail != nil {
suffix = storeDetail.CityName + "," + storeDetail.Name
}
templateID := ""
remark := ""
titleColor := ""
@@ -278,7 +307,7 @@ func NotifyWaybillStatus(bill *model.Waybill, order *model.GoodsOrder, isBillAlr
if templateID != "" {
data := map[string]interface{}{
"first": map[string]interface{}{
"value": title,
"value": suffix + title,
"color": titleColor,
},
"keyword1": map[string]interface{}{
@@ -298,7 +327,10 @@ func NotifyWaybillStatus(bill *model.Waybill, order *model.GoodsOrder, isBillAlr
"color": WX_NEW_ORDER_TEMPLATE_COLOR,
},
}
err = SendMsgToStore(jxutils.GetSaleStoreIDFromOrder(order), templateID, "", "", data)
//err = SendMsgToStore(jxutils.GetSaleStoreIDFromOrder(order), templateID, globals.WxBackstageHost+fmt.Sprintf("%s%d", WX_TO_ORDER_PAGE_URL, storeDetail.ID), WX_MINI_TO_ORDER_PAGE_URL+fmt.Sprintf("?jxStoreId=%v", storeDetail.ID), data)
//dataStore := fmt.Sprintf(`{"address":"%s","cityName":"%s","id":%d,"name":"%s","payeeName":"%s","status":%d,"tel1":"%s","tel2":"%s"}`, storeDetail.Address, storeDetail.CityName, storeDetail.ID, storeDetail.Name, storeDetail.PayeeName, storeDetail.Status, storeDetail.Tel1, storeDetail.Tel2)
//url := WX_MINI_TO_ORDER_PAGE_URL + fmt.Sprintf("?jxStoreId=%v&data=%v", storeDetail.ID, dataStore)
err = SendMsgToStore(jxutils.GetSaleStoreIDFromOrder(order), templateID, globals.WxBackstageHost+fmt.Sprintf("%s%d", WX_TO_ORDER_PAGE_URL, storeDetail.ID), WX_MINI_TO_ORDER_PAGE_URL, data)
netprinter.NofityOrderMsg(jxcontext.AdminCtx, jxutils.GetSaleStoreIDFromOrder(order), order.VendorOrderID, title)
}
return err
@@ -314,7 +346,12 @@ func NotifyUserApplyCancel(order *model.GoodsOrder, cancelReason string) (err er
globals.SugarLogger.Infof("NotifyUserApplyCancel orderID:%s is not solid", order.VendorOrderID)
return nil
}
title := "老板,您有订单申请取消!请及时联系客户处理!"
suffix := ""
storeDetail, err := dao.GetStoreDetail(dao.GetDB(), jxutils.GetSaleStoreIDFromOrder(order), order.VendorID, "")
if err == nil && storeDetail != nil {
suffix = storeDetail.CityName + "," + storeDetail.Name
}
title := suffix + "老板,您有订单申请取消!请及时联系客户处理!"
data := map[string]interface{}{
"first": map[string]interface{}{
"value": title,
@@ -338,7 +375,10 @@ func NotifyUserApplyCancel(order *model.GoodsOrder, cancelReason string) (err er
},
}
storeID := jxutils.GetSaleStoreIDFromOrder(order)
err = SendMsgToStore(storeID, WX_ORDER_APPLY_CANCEL_TEMPLATE_ID, "", "", data)
//err = SendMsgToStore(storeID, WX_ORDER_APPLY_CANCEL_TEMPLATE_ID, globals.WxBackstageHost+fmt.Sprintf("%s%d", WX_TO_ORDER_PAGE_URL, storeID), WX_MINI_TO_ORDER_PAGE_URL+fmt.Sprintf("?jxStoreId=%v", storeID), data)
//dataStore := fmt.Sprintf(`{"address":"%s","cityName":"%s","id":%d,"name":"%s","payeeName":"%s","status":%d,"tel1":"%s","tel2":"%s"}`, storeDetail.Address, storeDetail.CityName, storeDetail.ID, storeDetail.Name, storeDetail.PayeeName, storeDetail.Status, storeDetail.Tel1, storeDetail.Tel2)
//url := WX_MINI_TO_ORDER_PAGE_URL + fmt.Sprintf("?jxStoreId=%v&data=%v", storeDetail.ID, dataStore)
err = SendMsgToStore(storeID, WX_ORDER_APPLY_CANCEL_TEMPLATE_ID, globals.WxBackstageHost+fmt.Sprintf("%s%d", WX_TO_ORDER_PAGE_URL, storeID), WX_MINI_TO_ORDER_PAGE_URL, data)
netprinter.NofityOrderMsg(jxcontext.AdminCtx, jxutils.GetSaleStoreIDFromOrder(order), order.VendorOrderID, title)
return err
}
@@ -348,10 +388,15 @@ func NotifyOrderChanged(order *model.GoodsOrder) (err error) {
if order.VendorID == model.VendorIDELM {
return nil
}
suffix := ""
storeDetail, err := dao.GetStoreDetail(dao.GetDB(), jxutils.GetSaleStoreIDFromOrder(order), order.VendorID, "")
if err == nil && storeDetail != nil {
suffix = storeDetail.CityName + "," + storeDetail.Name
}
title := fmt.Sprintf("您有订单的信息已被修改")
data := map[string]interface{}{
"first": map[string]interface{}{
"value": title,
"value": suffix + title,
"color": WX_NEW_ORDER_TEMPLATE_COLOR,
},
"keyword1": map[string]interface{}{
@@ -376,7 +421,10 @@ func NotifyOrderChanged(order *model.GoodsOrder) (err error) {
},
}
storeID := jxutils.GetSaleStoreIDFromOrder(order)
err = SendMsgToStore(storeID, WX_ORDER_CHANGE_INFO_TEMPLATE_ID, "", "", data)
//err = SendMsgToStore(storeID, WX_ORDER_CHANGE_INFO_TEMPLATE_ID, globals.WxBackstageHost+fmt.Sprintf("%s%d", WX_TO_ORDER_PAGE_URL, storeID), WX_MINI_TO_ORDER_PAGE_URL+fmt.Sprintf("?jxStoreId=%v", storeID), data)
//dataStore := fmt.Sprintf(`{"address":"%s","cityName":"%s","id":%d,"name":"%s","payeeName":"%s","status":%d,"tel1":"%s","tel2":"%s"}`, storeDetail.Address, storeDetail.CityName, storeDetail.ID, storeDetail.Name, storeDetail.PayeeName, storeDetail.Status, storeDetail.Tel1, storeDetail.Tel2)
//url := WX_MINI_TO_ORDER_PAGE_URL + fmt.Sprintf("?jxStoreId=%v&data=%v", storeDetail.ID, dataStore)
err = SendMsgToStore(storeID, WX_ORDER_CHANGE_INFO_TEMPLATE_ID, globals.WxBackstageHost+fmt.Sprintf("%s%d", WX_TO_ORDER_PAGE_URL, storeID), WX_MINI_TO_ORDER_PAGE_URL, data)
netprinter.NofityOrderMsg(jxcontext.AdminCtx, jxutils.GetSaleStoreIDFromOrder(order), order.VendorOrderID, title)
return err
}
@@ -391,14 +439,29 @@ func NotifyOrderCanceled(order *model.GoodsOrder) (err error) {
globals.SugarLogger.Infof("NotifyOrderCanceled orderID:%s is not solid", order.VendorOrderID)
return nil
}
title := fmt.Sprintf("老板,您的订单%s第%d号订单, %s被取消了", model.VendorChineseNames[order.VendorID], order.OrderSeq, order.VendorOrderID)
suffix := ""
storeDetail, err := dao.GetStoreDetail(dao.GetDB(), jxutils.GetSaleStoreIDFromOrder(order), order.VendorID, "")
if err == nil && storeDetail != nil {
suffix = storeDetail.CityName + "," + storeDetail.Name
}
title := fmt.Sprintf(suffix+"老板,您的订单%s第%d号订单, %s被取消了", model.VendorChineseNames[order.VendorID], order.OrderSeq, order.VendorOrderID)
var price int64
if beego.BConfig.RunMode == "jxgy" {
price = order.NewEarningPrice
} else {
if order.EarningType == model.EarningTypePoints {
price = order.ActualPayPrice
} else {
price = order.EarningPrice
}
}
data := map[string]interface{}{
"first": map[string]interface{}{
"value": title,
"color": WX_NEW_ORDER_TEMPLATE_COLOR,
},
"orderProductPrice": map[string]interface{}{
"value": jxutils.IntPrice2StandardCurrencyString(order.ActualPayPrice),
"value": jxutils.IntPrice2StandardCurrencyString(price),
"color": WX_NEW_ORDER_TEMPLATE_COLOR,
},
"orderProductName": map[string]interface{}{
@@ -419,16 +482,23 @@ func NotifyOrderCanceled(order *model.GoodsOrder) (err error) {
},
}
storeID := jxutils.GetSaleStoreIDFromOrder(order)
err = SendMsgToStore(storeID, WX_ORDER_ORDER_CANCELED_TEMPLATE_ID, "", "", data)
//err = SendMsgToStore(storeID, WX_ORDER_ORDER_CANCELED_TEMPLATE_ID, globals.WxBackstageHost+fmt.Sprintf("%s%d", WX_TO_ORDER_PAGE_URL, storeID), WX_MINI_TO_ORDER_PAGE_URL+fmt.Sprintf("?jxStoreId=%v", storeID), data)
//dataStore := fmt.Sprintf(`{"address":"%s","cityName":"%s","id":%d,"name":"%s","payeeName":"%s","status":%d,"tel1":"%s","tel2":"%s"}`, storeDetail.Address, storeDetail.CityName, storeDetail.ID, storeDetail.Name, storeDetail.PayeeName, storeDetail.Status, storeDetail.Tel1, storeDetail.Tel2)
//url := WX_MINI_TO_ORDER_PAGE_URL + fmt.Sprintf("?jxStoreId=%v&data=%v", storeDetail.ID, dataStore)
err = SendMsgToStore(storeID, WX_ORDER_ORDER_CANCELED_TEMPLATE_ID, globals.WxBackstageHost+fmt.Sprintf("%s%d", WX_TO_ORDER_PAGE_URL, storeID), WX_MINI_TO_ORDER_PAGE_URL, data)
netprinter.NofityOrderMsg(jxcontext.AdminCtx, jxutils.GetSaleStoreIDFromOrder(order), order.VendorOrderID, title)
return err
}
func PushJDBadCommentToWeiXin(comment *legacymodel.JxBadComments, isBadComment bool, order *model.GoodsOrder) (err error) {
globals.SugarLogger.Debugf("PushJDBadCommentToWeiXin orderID:%s", comment.OrderId)
suffix := ""
storeDetail, err := dao.GetStoreDetail(dao.GetDB(), jxutils.GetSaleStoreIDFromOrder(order), order.VendorID, "")
if err == nil && storeDetail != nil {
suffix = storeDetail.CityName + "," + storeDetail.Name
}
sb := new(strings.Builder)
sb.WriteString(fmt.Sprintf("你收到了%s客户(", model.VendorChineseNames[int(utils.Str2Int64WithDefault(comment.OrderFlag, 0))]))
sb.WriteString(fmt.Sprintf(suffix+"你收到了%s客户(", model.VendorChineseNames[int(utils.Str2Int64WithDefault(comment.OrderFlag, 0))]))
sb.WriteString(comment.Userphone)
sb.WriteString(")的一条")
sb.WriteString(utils.Int2Str(comment.Score))
@@ -567,26 +637,56 @@ func NotifyStoreOpRequestStatus(isAccepted bool, storeID, nameID int, spuName st
return err
}
func NotifyStoreMessage(storeID, msgID, msgStatusID int, title, content string) (err error) {
globals.SugarLogger.Debugf("NotifyStoreMessage storeID:%d, msgID:%d, title:%s, content:%s", storeID, msgID, title, content)
templateID := WX_NORMAL_STORE_MSG_TEMPLATE_ID
func NotifyStoreMessage(storeID, msgID, msgStatusID int, msg *model.Message) (err error) {
globals.SugarLogger.Debugf("NotifyStoreMessage storeID:%d, msgID:%d, title:%s, content:%s", storeID, msgID, msg.Title, msg.Content)
templateID := ""
fileURL := globals.WxBackstageHost + fmt.Sprintf(WX_TO_SHOW_MSG, msgID, msgStatusID)
data := map[string]interface{}{
"first": map[string]interface{}{
"value": content,
"color": "#333333",
},
"keyword1": map[string]interface{}{
"value": title,
"color": "#2E408E",
},
"keyword2": map[string]interface{}{
"value": utils.GetCurTimeStr(),
"color": "#2E408E",
},
"remark": map[string]interface{}{
"value": "",
},
data := make(map[string]interface{})
switch msg.Type {
case model.MessageTypeStore:
templateID = WX_NORMAL_STORE_MSG_TEMPLATE_ID
data = map[string]interface{}{
"first": map[string]interface{}{
"value": msg.Content,
"color": "#333333",
},
"keyword1": map[string]interface{}{
"value": msg.Title,
"color": "#2E408E",
},
"keyword2": map[string]interface{}{
"value": utils.GetCurTimeStr(),
"color": "#2E408E",
},
"remark": map[string]interface{}{
"value": "",
},
}
case model.MessageTypeStoreAct:
actMap := &model.MessageActInfo{}
err = json.Unmarshal([]byte(msg.ActInfo), &actMap)
templateID = WX_NORMAL_STORE_ACT_MSG_TEMPLATE_ID
data = map[string]interface{}{
"first": map[string]interface{}{
"value": "即将开展[" + msg.Title + "]活动,详情点击",
"color": "#333333",
},
"keyword1": map[string]interface{}{
"value": msg.Title,
"color": "#2E408E",
},
"keyword2": map[string]interface{}{
"value": actMap.BeginAt + "-" + actMap.EndAt,
"color": "#2E408E",
},
"keyword3": map[string]interface{}{
"value": model.VendorNames[int(utils.Interface2Float64WithDefault((actMap.VendorID), 0))],
"color": "#2E408E",
},
"remark": map[string]interface{}{
"value": msg.Content,
},
}
}
return SendMsgToStore(storeID, templateID, fileURL, fmt.Sprintf(WX_MINI_TO_SHOW_MSG, msgID, msgStatusID), data)
}
@@ -596,7 +696,11 @@ func NotifyAfsOrderStatus(afsOrder *model.AfsOrder) (err error) {
if afsOrder.VendorID == model.VendorIDELM {
return nil
}
suffix := ""
storeDetail, err := dao.GetStoreDetail(dao.GetDB(), jxutils.GetSaleStoreIDFromAfsOrder(afsOrder), afsOrder.VendorID, "")
if err == nil && storeDetail != nil {
suffix = storeDetail.CityName + "," + storeDetail.Name
}
var templateID, comment string
if afsOrder.Status == model.AfsOrderStatusWait4Approve {
templateID = WX_AFS_ORDER_WAIT4APPROVE_TEMPLATE_ID
@@ -614,7 +718,7 @@ func NotifyAfsOrderStatus(afsOrder *model.AfsOrder) (err error) {
data := map[string]interface{}{
"first": map[string]interface{}{
"value": fmt.Sprintf("%s 第%d号订单, %s", model.VendorChineseNames[afsOrder.VendorID], order.OrderSeq, afsOrder.VendorOrderID),
"value": suffix + fmt.Sprintf("%s 第%d号订单, %s", model.VendorChineseNames[afsOrder.VendorID], order.OrderSeq, afsOrder.VendorOrderID),
"color": WX_HIGHLEVEL_TEMPLATE_COLOR2,
},
"keyword1": map[string]interface{}{
@@ -635,6 +739,8 @@ func NotifyAfsOrderStatus(afsOrder *model.AfsOrder) (err error) {
},
}
storeID := jxutils.GetSaleStoreIDFromAfsOrder(afsOrder)
//dataStore := fmt.Sprintf(`{"address":"%s","cityName":"%s","id":%d,"name":"%s","payeeName":"%s","status":%d,"tel1":"%s","tel2":"%s"}`, storeDetail.Address, storeDetail.CityName, storeDetail.ID, storeDetail.Name, storeDetail.PayeeName, storeDetail.Status, storeDetail.Tel1, storeDetail.Tel2)
//url := WX_MINI_TO_ORDER_PAGE_URL + fmt.Sprintf("?jxStoreId=%v&data=%v", storeDetail.ID, dataStore)
err = SendMsgToStore(storeID, templateID, globals.WxBackstageHost+fmt.Sprintf("%s%d", WX_TO_ORDER_PAGE_URL, storeID), WX_MINI_TO_ORDER_PAGE_URL, data)
netprinter.NofityOrderMsg(jxcontext.AdminCtx, jxutils.GetSaleStoreIDFromAfsOrder(afsOrder), afsOrder.VendorOrderID, comment)
return err
@@ -722,23 +828,47 @@ func NotifyStoreAlertMessage(storeID int, storeName, title, content string) (err
return err
}
func SendStoreMessage(ctx *jxcontext.Context, title, content string, storeIDs []int, isAsync, isContinueWhenError bool) (hint string, err error) {
func SendStoreMessage(ctx *jxcontext.Context, title, content string, storeIDs []int, imgs []string, actInfo string, messageType int, isAsync, isContinueWhenError bool) (hint string, err error) {
db := dao.GetDB()
dao.Begin(db)
//权限
if permission.IsRoled(ctx) {
if storeIDsMap, err := permission.GetUserStoresResultMap(ctx.GetUserID()); err == nil {
var storeIDs2 []int
if len(storeIDs) > 0 {
for _, v := range storeIDs {
if storeIDsMap[v] != 0 {
storeIDs2 = append(storeIDs2, v)
}
}
if len(storeIDs2) == 0 {
storeIDs2 = append(storeIDs2, -1)
}
} else {
for k, _ := range storeIDsMap {
storeIDs2 = append(storeIDs2, k)
}
}
storeIDs = nil
storeIDs = storeIDs2
}
}
txDB, _ := dao.Begin(db)
defer func() {
if r := recover(); r != nil {
dao.Rollback(db)
dao.Rollback(db, txDB)
panic(r)
}
}()
msg := &model.Message{
Title: title,
Content: content,
Type: model.MessageTypeStore,
Type: int8(messageType),
ActInfo: actInfo,
Imgs: strings.Join(imgs, ","),
}
dao.WrapAddIDCULDEntity(msg, ctx.GetUserName())
if err = dao.CreateEntity(db, msg); err != nil {
dao.Rollback(db)
dao.Rollback(db, txDB)
return "", err
}
msgStatusList := make([]*model.MessageStatus, len(storeIDs))
@@ -750,17 +880,17 @@ func SendStoreMessage(ctx *jxcontext.Context, title, content string, storeIDs []
}
dao.WrapAddIDCULDEntity(msgStatus, ctx.GetUserName())
if err = dao.CreateEntity(db, msgStatus); err != nil {
dao.Rollback(db)
dao.Rollback(db, txDB)
return "", err
}
msgStatusList[k] = msgStatus
}
dao.Commit(db)
dao.Commit(db, txDB)
rootTask := tasksch.NewParallelTask("SendStoreMessage", nil, ctx, func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) {
db := dao.GetDB()
msgStatus := batchItemList[0].(*model.MessageStatus)
if err = NotifyStoreMessage(msgStatus.StoreID, msgStatus.MessageID, msgStatus.ID, msg.Title, msg.Content); err == nil {
if err = NotifyStoreMessage(msgStatus.StoreID, msgStatus.MessageID, msgStatus.ID, msg); err == nil {
msgStatus.Status = model.MessageStatusSendAllSuccess
} else {
msgStatus.Status = model.MessageStatusSendAllFailed
@@ -785,13 +915,20 @@ func NotifyAdjustOrder(order *model.GoodsOrder) (err error) {
if order.VendorID == model.VendorIDELM {
return nil
}
if len(order.Skus) == 0 {
return
}
suffix := ""
storeDetail, err := dao.GetStoreDetail(dao.GetDB(), jxutils.GetSaleStoreIDFromOrder(order), order.VendorID, "")
if err == nil && storeDetail != nil {
suffix = storeDetail.CityName + "," + storeDetail.Name
}
if !model.IsOrderSolid(order) {
globals.SugarLogger.Infof("NotifyAdjustOrder orderID:%s is not solid", order.VendorOrderID)
return nil
}
sb := new(strings.Builder)
sb.WriteString("老板,")
sb.WriteString(suffix + "老板,")
sb.WriteString(order.ConsigneeName)
sb.WriteString("调整了订单商品,请及时查看!")
sb.WriteString(getOrderDetailBrief(order))
@@ -801,7 +938,7 @@ func NotifyAdjustOrder(order *model.GoodsOrder) (err error) {
"color": WX_NEW_ORDER_TEMPLATE_COLOR,
},
"keyword1": map[string]interface{}{
"value": jxutils.IntPrice2Standard(order.NewEarningPrice),
"value": "请点击查看",
"color": WX_NEW_ORDER_TEMPLATE_COLOR,
},
"keyword2": map[string]interface{}{
@@ -814,15 +951,107 @@ func NotifyAdjustOrder(order *model.GoodsOrder) (err error) {
},
}
storeID := jxutils.GetSaleStoreIDFromOrder(order)
//dataStore := fmt.Sprintf(`{"address":"%s","cityName":"%s","id":%d,"name":"%s","payeeName":"%s","status":%d,"tel1":"%s","tel2":"%s"}`, storeDetail.Address, storeDetail.CityName, storeDetail.ID, storeDetail.Name, storeDetail.PayeeName, storeDetail.Status, storeDetail.Tel1, storeDetail.Tel2)
//url := WX_MINI_TO_ORDER_PAGE_URL + fmt.Sprintf("?jxStoreId=%v&data=%v", storeDetail.ID, dataStore)
return SendMsgToStore(storeID, WX_ADJUSTORDER_TEMPLATE_ID, globals.WxBackstageHost+fmt.Sprintf("%s%d", WX_TO_ORDER_PAGE_URL, storeID), WX_MINI_TO_ORDER_PAGE_URL, data)
}
func SendStoreMessageKnowledge(ctx *jxcontext.Context, title string, knowIDs, storeIDs []int) (hint string, err error) {
var (
db = dao.GetDB()
content string
)
knows, err := dao.GetKnowledgeDepotNoPage(db, knowIDs)
for k, v := range knows {
if k != 0 {
content += weixinapi.SNSCutLine
}
content += v.Content
}
txDB, _ := dao.Begin(db)
defer func() {
if r := recover(); r != nil {
dao.Rollback(db, txDB)
panic(r)
}
}()
msg := &model.Message{
Title: title,
Content: content,
Type: 4,
}
dao.WrapAddIDCULDEntity(msg, ctx.GetUserName())
if err = dao.CreateEntity(db, msg); err != nil {
dao.Rollback(db, txDB)
return "", err
}
msgStatusList := make([]*model.MessageStatus, len(storeIDs))
for k, storeID := range storeIDs {
msgStatus := &model.MessageStatus{
MessageID: msg.ID,
StoreID: storeID,
Status: model.MessageStatusNew,
}
dao.WrapAddIDCULDEntity(msgStatus, ctx.GetUserName())
if err = dao.CreateEntity(db, msgStatus); err != nil {
dao.Rollback(db, txDB)
return "", err
}
msgStatusList[k] = msgStatus
}
dao.Commit(db, txDB)
rootTask := tasksch.NewParallelTask("SendStoreMessageKnowledge", nil, ctx, func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) {
db := dao.GetDB()
msgStatus := batchItemList[0].(*model.MessageStatus)
if err = NotifyKnowledge(msgStatus.StoreID, title); err == nil {
msgStatus.Status = model.MessageStatusSendAllSuccess
} else {
msgStatus.Status = model.MessageStatusSendAllFailed
}
dao.WrapUpdateULEntity(msgStatus, ctx.GetUserName())
// globals.SugarLogger.Debug(utils.Format4Output(msgStatus, false))
_, err = dao.UpdateEntity(db, msgStatus)
return nil, err
}, msgStatusList)
tasksch.HandleTask(rootTask, nil, true).Run()
//if !isAsync {
// _, err = rootTask.GetResult(0)
//} else {
hint = rootTask.ID
//}
return "", err
}
func NotifyKnowledge(storeID int, title string) (err error) {
globals.SugarLogger.Debugf("NotifyKnowledge storeID:%d, title:%s", storeID, title)
templateID := WX_KNOWLEDGE_BASE_TEMPLATE_ID
data := map[string]interface{}{
"first": map[string]interface{}{
"value": "今日每日一词已更新!",
"color": "#333333",
},
"keyword1": map[string]interface{}{
"value": time.Now().Format("2006-01-02"),
"color": "#2E408E",
},
"keyword2": map[string]interface{}{
"value": title,
"color": "#2E408E",
},
"remark": map[string]interface{}{
"value": "",
},
}
return SendMsgToStore(storeID, templateID, "", "", data)
}
func SendUserMessage(ctx *jxcontext.Context, title, content string, userIDs []string, isAsync, isContinueWhenError bool) (hint string, err error) {
db := dao.GetDB()
dao.Begin(db)
txDB, _ := dao.Begin(db)
defer func() {
if r := recover(); r != nil {
dao.Rollback(db)
dao.Rollback(db, txDB)
panic(r)
}
}()
@@ -833,7 +1062,7 @@ func SendUserMessage(ctx *jxcontext.Context, title, content string, userIDs []st
}
dao.WrapAddIDCULDEntity(msg, ctx.GetUserName())
if err = dao.CreateEntity(db, msg); err != nil {
dao.Rollback(db)
dao.Rollback(db, txDB)
return "", err
}
msgStatusList := make([]*model.MessageStatus, len(userIDs))
@@ -845,12 +1074,12 @@ func SendUserMessage(ctx *jxcontext.Context, title, content string, userIDs []st
}
dao.WrapAddIDCULDEntity(msgStatus, ctx.GetUserName())
if err = dao.CreateEntity(db, msgStatus); err != nil {
dao.Rollback(db)
dao.Rollback(db, txDB)
return "", err
}
msgStatusList[k] = msgStatus
}
dao.Commit(db)
dao.Commit(db, txDB)
rootTask := tasksch.NewParallelTask("SendUserMessage", nil, ctx, func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) {
db := dao.GetDB()
@@ -898,7 +1127,7 @@ func NotifyUserMessage(userID string, title, content string) (err error) {
func SendMsgToUser(userID string, templateID string, data interface{}) (err error) {
globals.SugarLogger.Debugf("SendMsgToUser userID:%d, templateID:%s", userID, templateID)
authBinds, err := dao.GetUserBindAuthInfo(dao.GetDB(), userID, model.AuthBindTypeAuth, []string{"weixinsns"}, "", "", "wx2bb99eb5d2c9b82c")
authBinds, err := dao.GetUserBindAuthInfo(dao.GetDB(), userID, model.AuthBindTypeAuth, []string{"weixinsns"}, "", "", []string{"wx2bb99eb5d2c9b82c"})
if err != nil {
return err
}

View File

@@ -3,7 +3,6 @@ package weixinmsg
import (
"testing"
"git.rosy.net.cn/jx-callback/business/jxutils/jxcontext"
"git.rosy.net.cn/jx-callback/globals/api2"
"git.rosy.net.cn/baseapi/utils"
@@ -21,8 +20,8 @@ func TestGetWeixinOpenIDsFromStoreID(t *testing.T) {
}
func TestSendStoreMessage(t *testing.T) {
_, err := SendStoreMessage(jxcontext.AdminCtx, "title", "content", []int{1}, false, true)
if err != nil {
t.Fatal(err)
}
//_, err := SendStoreMessage(jxcontext.AdminCtx, "title", "content", []int{1}, false, true)
//if err != nil {
// t.Fatal(err)
//}
}

View File

@@ -259,3 +259,69 @@ func (*StoreSkuAct) TableUnique() [][]string {
[]string{"StoreID", "SkuID", "VendorID"},
}
}
type ActMtwmVendor struct {
ModelIDCULD
StoreID int `orm:"column(store_id)" json:"storeID"`
SkuID int `orm:"column(sku_id);index" json:"skuID"`
VendorStoreID string `orm:"column(vendor_store_id)" json:"vendorStoreID"`
BeginAt time.Time `json:"beginAt"` //活动时间
EndAt time.Time `json:"endAt"`
ActType int `json:"actType"` //活动类型 (折扣,秒杀)
SkuName string `json:"skuName"` //商品名
OriginPrice float64 `json:"originPrice"`
ActPrice float64 `json:"actPrice"`
DiscountCoefficient float64 `json:"discountCoefficient"` //折扣系数
Status int `json:"status"` //活动当前的状态参考值0-已过期1-已生效2-待生效
ItemID string `orm:"column(item_id)" json:"itemID"`
OrderLimit int `json:"orderLimit"` //每单限购
DayLimit int `json:"dayLimit"` //当日活动库存
Period string `json:"period"` //生效时段
WeeksTime string `json:"weeksTime"` //生效活动周期
SettingType int `json:"settingType"` //活动开展类型参考值0-按折扣系数开展活动1-按折扣价格开展活动。
StoreName string `orm:"-" json:"storeName"`
}
func (*ActMtwmVendor) TableIndex() [][]string {
return [][]string{
[]string{"StoreID", "SkuID", "DeletedAt"},
}
}
type ActEbaiVendor struct {
ModelIDCULD
BeginAt time.Time `json:"beginAt"` //活动时间
EndAt time.Time `json:"endAt"`
ActType int `json:"actType"` //活动类型 (折扣,秒杀)
Status int `json:"status"` //活动当前的状态参考值0-已过期1-已生效2-待生效
ActID string `orm:"column(act_id)" json:"actID"`
ActName string `json:"actName"`
OrderLimit int `json:"orderLimit"` //每单限购
DayLimit int `json:"dayLimit"` //每人每天限购
Period string `json:"period"` //生效时段
WeeksTime string `json:"weeksTime"` //生效活动周期
}
func (*ActEbaiVendor) TableIndex() [][]string {
return [][]string{
[]string{"ActID"},
}
}
type ActEbaiVendorSku struct {
ModelIDCULD
ActID string `orm:"column(act_id)" json:"actID"`
StoreID int `orm:"column(store_id)" json:"storeID"`
SkuID int `orm:"column(sku_id);index" json:"skuID"`
EbaiID string `orm:"column(ebai_id)" json:"ebaiID"`
VendorStoreID string `orm:"column(vendor_store_id)" json:"vendorStoreID"`
SkuName string `json:"skuName"` //商品名
OriginPrice float64 `json:"originPrice"`
ActPrice float64 `json:"actPrice"`
}
func (*ActEbaiVendorSku) TableIndex() [][]string {
return [][]string{
[]string{"StoreID", "SkuID", "DeletedAt"},
}
}

View File

@@ -35,10 +35,11 @@ type GoodsOrderExt struct {
WaybillCreatedAt time.Time `orm:"type(datetime);index" json:"waybillCreatedAt"`
WaybillFinishedAt time.Time `orm:"type(datetime)" json:"waybillFinishedAt"`
DistrictName string `json:"districtName"`
CityName string `json:"cityName"`
PayPercentage int `json:"payPercentage"`
OldPayPercentage int `json:"oldPayPercentage"`
DistrictName string `json:"districtName"`
CityName string `json:"cityName"`
PayPercentage int `json:"payPercentage"`
VendorPayPercentage int `json:"vendorPayPercentage"`
OldPayPercentage int `json:"oldPayPercentage"`
SkuInfo string `json:"skuInfo,omitempty"`
SkuInfo2 string `json:"skuInfo2,omitempty"`
@@ -48,9 +49,22 @@ type GoodsOrderExt struct {
ShopSumPrice int64 `json:"shopSumPrice"`
AvgPrice int64 `json:"avgPrice"`
BadCommentCount int `json:"badCommentCount"`
JxIncome int64 `json:"jxIncome"` //预计收益
FloatLng float64 `json:"floatLng"`
FloatLat float64 `json:"floatLat"`
MarketManPhone string `json:"marketManPhone"` //市場負責人電話
MarketManName string `json:"marketManName"`
OperatorPhone string `orm:"size(16)" json:"operatorPhone"` // 京东运营人电话
OperatorName string `orm:"size(32)" json:"operatorName"` // 京东运营人组(角色)
OperatorPhone2 string `orm:"size(16)" json:"operatorPhone2"` // 美团运营人电话
OperatorName2 string `orm:"size(32)" json:"operatorName2"` // 美团运营人组(角色)
OperatorPhone3 string `orm:"size(16)" json:"operatorPhone3"` // 饿百运营人电话
OperatorName3 string `orm:"size(32)" json:"operatorName3"` // 饿百运营人组(角色)
}
type OrderSkuExt struct {
@@ -58,6 +72,7 @@ type OrderSkuExt struct {
NameID int `orm:"column(name_id)" json:"nameID"`
FullSkuName string `json:"fullSkuName"`
Image string `json:"image"`
Upc string `json:"upc"`
// RealEarningPrice int64 `json:"realEarningPrice"` // 实际单品结算给门店老板钱
}

View File

@@ -34,6 +34,7 @@ const (
VendorIDXiaoWM = 202 // 外卖管家打印机
VendorIDYiLianYun = 203 // 易联云
VendorIDZhongWu = 204 // 中午云打印
VendorIDJxprint = 205 // 京西打印
VendorIDPrinterEnd = 300
VendorIDOthersBegin = 301
@@ -73,13 +74,15 @@ var (
VendorIDJX: "Jx",
VendorIDJDShop: "Jds",
VendorIDDada: "Dada",
VendorIDMTPS: "Mtps",
VendorIDDada: "Dada",
VendorIDMTPS: "Mtps",
VendorIDFengNiao: "Fn",
VendorIDFeiE: "Feie",
VendorIDXiaoWM: "XiaoWM",
VendorIDYiLianYun: "Yilianyun",
VendorIDZhongWu: "ZhongWu",
VendorIDJxprint: "Jx",
VendorIDQiNiuCloud: "Qiniu",
VendorIDJDWL: "Jdwl",
@@ -102,14 +105,16 @@ var (
VendorIDWSC: "微盟微商城",
VendorIDJX: "京西商城",
VendorIDDada: "达达众包",
VendorIDMTPS: "美团配送",
VendorIDJDWL: "京东物流",
VendorIDDada: "达达众包",
VendorIDMTPS: "美团配送",
VendorIDJDWL: "京东物流",
VendorIDFengNiao: "蜂鸟配送",
VendorIDFeiE: "飞鹅",
VendorIDXiaoWM: "外卖管家",
VendorIDYiLianYun: "易联云",
VendorIDZhongWu: "中午云",
VendorIDJxprint: "京西云",
VendorIDWXMP: "微信公众号",
VendorIDWXQRCode: "微信扫码",

View File

@@ -77,6 +77,7 @@ var (
WaybillStatusPending: "压单",
WaybillStatusAcceptCanceled: "取消接受",
WaybillStatusAccepted: "已接单",
WaybillStatusCourierAssigned: "已分配骑手",
WaybillStatusCourierArrived: "已到店",
WaybillStatusApplyFailedGetGoods: "取货失败待审核",
WaybillStatusAgreeFailedGetGoods: "取货失败",
@@ -182,6 +183,11 @@ var (
"打印机ID",
"打印机密钥",
},
VendorIDJxprint: []string{
VendorChineseNames[VendorIDJxprint],
"打印机编号",
"不填",
},
}
AfsReasonTypeName = map[int]string{
AfsReasonTypeGoodsQuality: "商品质量",
@@ -306,11 +312,12 @@ const (
WaybillStatusRefuseFailedGetGoods = -70
WaybillStatusUnknown = 0
WaybillStatusNew = 5
WaybillStatusPending = 7
WaybillStatusAcceptCanceled = 8
WaybillStatusAccepted = 10
WaybillStatusCourierArrived = 15 // 此状态是可选的,明确写出来是因为还是较重要的状态,但业务逻辑不应依赖此状态
WaybillStatusNew = 5
WaybillStatusPending = 7
WaybillStatusAcceptCanceled = 8
WaybillStatusAccepted = 10
WaybillStatusCourierAssigned = 12 //已分配骑手
WaybillStatusCourierArrived = 15 // 此状态是可选的,明确写出来是因为还是较重要的状态,但业务逻辑不应依赖此状态
WaybillStatusApplyFailedGetGoods = 17 // 取货失败待审核
WaybillStatusAgreeFailedGetGoods = 18 // 取货失败

View File

@@ -151,10 +151,10 @@ func GetActStoreSkuVendorList(db *DaoDB, actID int, vendorIDs, storeIDs, skuIDs
// globals.SugarLogger.Debug(sql)
// globals.SugarLogger.Debug(utils.Format4Output(sqlParams, false))
// globals.SugarLogger.Debug(utils.Format4Output(actStoreSkuList, false))
Begin(db)
defer Commit(db)
if err = GetRows(db, &actStoreSkuList, sql, sqlParams...); err == nil {
totalCount = GetLastTotalRowCount(db)
txDB, _ := Begin(db)
defer Commit(db, txDB)
if err = GetRowsTx(txDB, &actStoreSkuList, sql, sqlParams...); err == nil {
totalCount = GetLastTotalRowCount2(db, txDB)
}
return totalCount, actStoreSkuList, err
}
@@ -292,20 +292,21 @@ func QueryActs(db *DaoDB, actID int, offset, pageSize int, syncStatus int, keywo
sqlParams = append(sqlParams, pageSize, offset)
var idList []int
Begin(db)
txDB, _ := Begin(db)
defer func() {
if r := recover(); r != nil {
Rollback(db)
Rollback(db, txDB)
panic(r)
}
}()
// globals.SugarLogger.Debug(sql)
if err = GetRows(db, &idList, sql, sqlParams...); err != nil || len(idList) == 0 {
Rollback(db)
if err = GetRowsTx(txDB, &idList, sql, sqlParams...); err != nil || len(idList) == 0 {
//Rollback(db, txDB)
Commit(db, txDB)
return pagedInfo, err
}
pagedInfo.TotalCount = GetLastTotalRowCount(db)
Commit(db)
pagedInfo.TotalCount = GetLastTotalRowCount2(db, txDB)
Commit(db, txDB)
sql = `
SELECT
@@ -671,3 +672,131 @@ func GetStoresSkusAndActInfo(db *DaoDB, storeIDs, skuIDs, vendorIDs []int, minAc
// }
// return outStoreSkuActList, err
// }
func GetActMtwmVendors(db *DaoDB, storeIDs, skuIDs []int) (actMtwmVendors []*model.ActMtwmVendor, err error) {
sql := `
SELECT *
FROM act_mtwm_vendor
WHERE 1 = 1
`
sqlParams := []interface{}{}
if len(storeIDs) > 0 {
sql += " AND store_id IN (" + GenQuestionMarks(len(storeIDs)) + ")"
sqlParams = append(sqlParams, storeIDs)
}
if len(skuIDs) > 0 {
sql += " AND sku_id IN (" + GenQuestionMarks(len(skuIDs)) + ")"
sqlParams = append(sqlParams, skuIDs)
}
err = GetRows(db, &actMtwmVendors, sql, sqlParams)
return actMtwmVendors, err
}
func GetActEbaiVendorSkus(db *DaoDB, storeIDs, skuIDs []int) (actEbaiVendorSku []*model.ActEbaiVendorSku, err error) {
sql := `
SELECT *
FROM act_ebai_vendor_sku
WHERE 1 = 1
`
sqlParams := []interface{}{}
if len(storeIDs) > 0 {
sql += " AND store_id IN (" + GenQuestionMarks(len(storeIDs)) + ")"
sqlParams = append(sqlParams, storeIDs)
}
if len(skuIDs) > 0 {
sql += " AND sku_id IN (" + GenQuestionMarks(len(skuIDs)) + ")"
sqlParams = append(sqlParams, skuIDs)
}
err = GetRows(db, &actEbaiVendorSku, sql, sqlParams)
return actEbaiVendorSku, err
}
func GetActMtwmVendorPage(db *DaoDB, storeIDs, skuIDs []int, keyword string, beginAt, endAt time.Time, actType, offset, pageSize int) (page *model.PagedInfo, err error) {
var (
acts []*model.ActMtwmVendor
)
sql := `
SELECT SQL_CALC_FOUND_ROWS a.store_id, a.vendor_store_id, b.name store_name, a.act_type
FROM act_mtwm_vendor a
LEFT JOIN store b ON a.store_id = b.id
`
sqlParams := []interface{}{}
if len(storeIDs) > 0 {
sql += " AND a.store_id IN (" + GenQuestionMarks(len(storeIDs)) + ")"
sqlParams = append(sqlParams, storeIDs)
}
if len(skuIDs) > 0 {
sql += " AND a.sku_id IN (" + GenQuestionMarks(len(skuIDs)) + ")"
sqlParams = append(sqlParams, skuIDs)
}
if keyword != "" {
sql += " AND (a.store_id = ? OR a.sku_id = ? OR a.sku_name LIKE ? OR b.name LIKE ?)"
sqlParams = append(sqlParams, keyword, keyword, "%"+keyword+"%", "%"+keyword+"%")
}
if !utils.IsTimeZero(beginAt) {
sql += " AND a.begin_at <= ?"
sqlParams = append(sqlParams, beginAt)
}
if !utils.IsTimeZero(endAt) {
sql += " AND a.end_at >= ?"
sqlParams = append(sqlParams, endAt)
}
if actType != 0 {
sql += " AND a.act_type = ?"
sqlParams = append(sqlParams, actType)
}
sql += `
GROUP BY 1, 2, 3, 4
LIMIT ? OFFSET ?
`
sqlParams = append(sqlParams, pageSize, offset)
txDB, _ := Begin(db)
defer func() {
if r := recover(); r != nil {
Rollback(db, txDB)
panic(r)
}
}()
if err = GetRowsTx(txDB, &acts, sql, sqlParams...); err == nil {
page.TotalCount = GetLastTotalRowCount2(db, txDB)
page.Data = acts
}
Commit(db, txDB)
return page, err
}
func GetActMtwmVendorSkuPage(db *DaoDB, storeID int, keyword string, actType, offset, pageSize int) (page *model.PagedInfo, err error) {
var (
acts []*model.ActMtwmVendor
)
sql := `
SELECT SQL_CALC_FOUND_ROWS a.*
FROM act_mtwm_vendor a WHERE store_id = ?
`
sqlParams := []interface{}{storeID}
if keyword != "" {
sql += " AND (a.store_id = ? OR a.sku_id = ? OR a.sku_name LIKE ?)"
sqlParams = append(sqlParams, keyword, keyword, "%"+keyword+"%")
}
if actType != 0 {
sql += " AND a.act_type = ?"
sqlParams = append(sqlParams, actType)
}
sql += `
LIMIT ? OFFSET ?
`
sqlParams = append(sqlParams, pageSize, offset)
txDB, _ := Begin(db)
defer func() {
if r := recover(); r != nil {
Rollback(db, txDB)
panic(r)
}
}()
if err = GetRowsTx(txDB, &acts, sql, sqlParams...); err == nil {
page.TotalCount = GetLastTotalRowCount2(db, txDB)
page.Data = acts
}
Commit(db, txDB)
return page, err
}

View File

@@ -1,6 +1,7 @@
package dao
import (
"git.rosy.net.cn/baseapi/utils"
"git.rosy.net.cn/jx-callback/business/model"
)
@@ -30,3 +31,46 @@ func GetNeedUploadDataResource(db *DaoDB) (dataResList []*model.DataResource, er
err = GetRows(db, &dataResList, sql)
return dataResList, err
}
func GetVendorOrgCode(db *DaoDB, vendorID int, vendorOrgCode, vendorType string) (vendorOrgs []*model.VendorOrgCode, err error) {
sql := `
SELECT *
FROM vendor_org_code
WHERE deleted_at = ?
`
sqlParams := []interface{}{utils.DefaultTimeValue}
if vendorID != -1 {
sql += " AND vendor_id = ?"
sqlParams = append(sqlParams, vendorID)
}
if vendorOrgCode != "" {
sql += " AND vendor_org_code = ?"
sqlParams = append(sqlParams, vendorOrgCode)
}
if vendorType != "" {
sql += " AND vendor_type = ?"
sqlParams = append(sqlParams, vendorType)
}
sql += " ORDER BY comment"
err = GetRows(db, &vendorOrgs, sql, sqlParams)
return vendorOrgs, err
}
func GetVendorOrgCodeByKey(db *DaoDB, vendorID int, appKey string) (vendorOrg *model.VendorOrgCode, err error) {
sql := `
SELECT *
FROM vendor_org_code
WHERE deleted_at = ?
`
sqlParams := []interface{}{utils.DefaultTimeValue}
if vendorID != -1 {
sql += " AND vendor_id = ?"
sqlParams = append(sqlParams, vendorID)
}
if appKey != "" {
sql += " AND app_key = ?"
sqlParams = append(sqlParams, appKey)
}
err = GetRow(db, &vendorOrg, sql, sqlParams)
return vendorOrg, err
}

View File

@@ -8,7 +8,7 @@ import (
"git.rosy.net.cn/baseapi/utils"
"git.rosy.net.cn/jx-callback/globals"
"github.com/astaxie/beego/orm"
"github.com/astaxie/beego/client/orm"
)
const (
@@ -65,15 +65,15 @@ func GetDB() *DaoDB {
return &DaoDB{Db: orm.NewOrm()}
}
func Begin(db *DaoDB) (err error) {
func Begin(db *DaoDB) (txDB orm.TxOrmer, err error) {
if db.transactionLevel == 0 {
err = db.Db.Begin()
txDB, err = db.Db.Begin()
if err == nil {
db.startWatchTransaction()
}
}
db.transactionLevel++
return err
return txDB, err
}
func (db *DaoDB) startWatchTransaction() {
@@ -93,11 +93,11 @@ func (db *DaoDB) stopWatchTransaction() {
}
}
func Commit(db *DaoDB) (err error) {
func Commit(db *DaoDB, txDB orm.TxOrmer) (err error) {
if db.transactionLevel == 1 {
db.stopWatchTransaction()
err = db.Db.Commit()
err = txDB.Commit()
// err = db.Db.Commit()
db.transactionLevel = 0
} else if db.transactionLevel > 1 {
db.transactionLevel--
@@ -105,11 +105,11 @@ func Commit(db *DaoDB) (err error) {
return err
}
func Rollback(db *DaoDB) (err error) {
func Rollback(db *DaoDB, txDB orm.TxOrmer) (err error) {
if db.transactionLevel > 0 {
db.stopWatchTransaction()
err = db.Db.Rollback()
err = txDB.Rollback()
// err = db.Db.Rollback()
}
db.transactionLevel = 0
return err
@@ -139,6 +139,26 @@ func GetRow(db *DaoDB, inPtr interface{}, sql string, values ...interface{}) (er
return err
}
func GetRowTx(txDB orm.TxOrmer, inPtr interface{}, sql string, values ...interface{}) (err error) {
if txDB == nil {
return
}
typeInfo := reflect.TypeOf(inPtr)
if typeInfo.Kind() != reflect.Ptr {
return errors.New("inPtr must be ptr")
}
slice := reflect.New(reflect.SliceOf(typeInfo.Elem()))
if err = GetRowsTx(txDB, slice.Interface(), sql, values...); err == nil {
slice = slice.Elem()
if slice.Len() > 0 {
reflect.ValueOf(inPtr).Elem().Set(slice.Index(0))
} else {
return orm.ErrNoRows
}
}
return err
}
func GetRows(db *DaoDB, inPtr interface{}, sql string, values ...interface{}) (err error) {
if db == nil {
db = GetDB()
@@ -147,6 +167,15 @@ func GetRows(db *DaoDB, inPtr interface{}, sql string, values ...interface{}) (e
return err
}
func GetRowsTx(txDB orm.TxOrmer, inPtr interface{}, sql string, values ...interface{}) (err error) {
if txDB == nil {
return
}
_, err = txDB.Raw(sql, values).QueryRows(inPtr)
// _, err = db.Db.Raw(sql, values).QueryRows(inPtr)
return err
}
func GetEntity(db *DaoDB, item interface{}, cols ...string) (err error) {
if db == nil {
db = GetDB()
@@ -168,6 +197,17 @@ func UpdateEntity(db *DaoDB, item interface{}, cols ...string) (num int64, err e
return num, err
}
func UpdateEntityTx(txDB orm.TxOrmer, item interface{}, cols ...string) (num int64, err error) {
if txDB == nil {
return
}
num, err = txDB.Update(item, cols...)
if err != nil && !IsDuplicateError(err) {
globals.SugarLogger.Errorf("UpdateEntity %s failed with error:%v", reflect.TypeOf(item).Name(), err)
}
return num, err
}
func CreateEntity(db *DaoDB, item interface{}) (err error) {
if db == nil {
db = GetDB()
@@ -178,6 +218,16 @@ func CreateEntity(db *DaoDB, item interface{}) (err error) {
return err
}
func CreateEntityTx(txDB orm.TxOrmer, item interface{}) (err error) {
if txDB == nil {
return
}
if _, err = txDB.Insert(item); err != nil && !IsDuplicateError(err) {
globals.SugarLogger.Errorf("CreateEntity %s failed with error:%v", reflect.TypeOf(item).Name(), err)
}
return err
}
// InsertMulti执行成功后ID不会改写成正确的象Insert一样
func CreateMultiEntities(db *DaoDB, item interface{}) (err error) {
if db == nil {
@@ -225,8 +275,19 @@ func ExecuteSQL(db *DaoDB, sql string, params ...interface{}) (num int64, err er
// 此函数要求db在事务中否则可能导致取得到的是另一个连接的数据
func GetLastTotalRowCount(db *DaoDB) int {
countInfo := &struct{ Ct int }{}
// if err := txDB.Raw("SELECT FOUND_ROWS() ct", nil).QueryRow(countInfo); err == nil {
// return countInfo.Ct
// }
if err := GetRow(db, countInfo, "SELECT FOUND_ROWS() ct"); err == nil {
return countInfo.Ct
}
return 0
}
func GetLastTotalRowCount2(db *DaoDB, txDB orm.TxOrmer) int {
countInfo := &struct{ Ct int }{}
if err := GetRowTx(txDB, countInfo, "SELECT FOUND_ROWS() ct"); err == nil {
return countInfo.Ct
}
return 0
}

View File

@@ -27,7 +27,7 @@ func GetAuthBind(db *DaoDB, bindType int, authType, authID string) (authBind *mo
return authBind, err
}
func GetUserBindAuthInfo(db *DaoDB, userID string, bindType int, typeList []string, authID, authID2, typeID string) (authList []*model.AuthBind, err error) {
func GetUserBindAuthInfo(db *DaoDB, userID string, bindType int, typeList []string, authID, authID2 string, typeIDs []string) (authList []*model.AuthBind, err error) {
sql := `
SELECT *
FROM auth_bind t1
@@ -56,9 +56,9 @@ func GetUserBindAuthInfo(db *DaoDB, userID string, bindType int, typeList []stri
sql += " AND t1.auth_id2 = ?"
sqlParams = append(sqlParams, authID2)
}
if typeID != "" {
sql += " AND t1.type_id = ?"
sqlParams = append(sqlParams, typeID)
if len(typeIDs) > 0 {
sql += " AND t1.type_id IN (" + GenQuestionMarks(len(typeIDs)) + ")"
sqlParams = append(sqlParams, typeIDs)
}
sql += " ORDER BY t1.type"
err = GetRows(db, &authList, sql, sqlParams...)

View File

@@ -1,7 +1,7 @@
package dao
import (
"github.com/astaxie/beego/orm"
"github.com/astaxie/beego/client/orm"
"github.com/go-sql-driver/mysql"
)

View File

@@ -45,9 +45,11 @@ type OrderSkuWithActualPayPrice struct {
StoreID int `orm:"column(store_id)" json:"storeID"` // 外部系统里记录的 jxstoreid
Status int `json:"status"` // 参见OrderStatus*相关的常量定义
PayPercentage int `json:"payPercentage"`
NewEarningPrice int64 `json:"newEarningPrice"`
EarningType int `json:"earningType"`
PayPercentage int `json:"payPercentage"`
OrderPayPercentage int `json:"orderPayPercentage"`
NewEarningPrice int64 `json:"newEarningPrice"`
EarningType int `json:"earningType"`
CityCode int `json:"cityCode"`
}
type tGoodsAndOrder struct {
@@ -376,7 +378,7 @@ func GetStoreOrderSkuList(db *DaoDB, storeIDs []int, finishedAtBegin, finishedAt
sql := `
SELECT t1.*,
IF(t2.jx_store_id > 0, t2.jx_store_id, t2.store_id) store_id, t2.status, t2.actual_pay_price, t2.distance_freight_money, t2.waybill_tip_money, t2.new_earning_price,
t3.pay_percentage, t2.earning_type
t3.pay_percentage, t2.earning_type, t2.order_pay_percentage, t3.city_code
FROM order_sku t1
JOIN goods_order t2 ON t2.vendor_order_id = t1.vendor_order_id AND t2.vendor_id = t1.vendor_id
LEFT JOIN store t3 ON t3.id = IF(t2.jx_store_id > 0, t2.jx_store_id, t2.store_id)
@@ -429,6 +431,26 @@ func GetStoreOrderSkuList4Afs(db *DaoDB, storeIDs []int, finishedAtBegin, finish
return skuList, err
}
func GetStoreOrderSkuList4Afs2(db *DaoDB, vendorOrderIDs []string) (skuList []*OrderSkuWithActualPayPrice, err error) {
sql := `
SELECT t1.*,
t2.actual_pay_price, t2.status, IF(t2.jx_store_id > 0, t2.jx_store_id, t2.store_id) store_id, t2.new_earning_price,
t3.pay_percentage
FROM order_sku t1
JOIN goods_order t2 ON t2.vendor_order_id = t1.vendor_order_id AND t2.vendor_id = t1.vendor_id
LEFT JOIN store t3 ON t3.id = IF(t2.jx_store_id > 0, t2.jx_store_id, t2.store_id)
JOIN (
SELECT t12.*
FROM afs_order t12
WHERE t12.vendor_order_id IN (` + GenQuestionMarks(len(vendorOrderIDs)) + `)`
sql += ") t4 ON t4.vendor_order_id = t2.vendor_order_id AND t4.vendor_id = t2.vendor_id"
sqlParams := []interface{}{
vendorOrderIDs,
}
err = GetRows(db, &skuList, sql, sqlParams...)
return skuList, err
}
func GetStoreAfsOrderSkuList(db *DaoDB, storeIDs []int, finishedAtBegin, finishedAtEnd time.Time, statusList []int, isFinish bool) (afsSkuList []*model.OrderSkuFinancial, err error) {
sql := `
SELECT t1.*
@@ -457,6 +479,22 @@ func GetStoreAfsOrderSkuList(db *DaoDB, storeIDs []int, finishedAtBegin, finishe
return afsSkuList, err
}
func GetStoreAfsOrderSkuList2(db *DaoDB, vendorOrderIDs []string) (afsSkuList []*model.OrderSkuFinancial, err error) {
sql := `
SELECT t1.*
FROM order_sku_financial t1
JOIN afs_order t2 ON t2.vendor_order_id = t1.vendor_order_id AND t2.vendor_id = t1.vendor_id AND t2.afs_order_id = t1.afs_order_id
WHERE t1.is_afs_order = 1 AND t2.status = ?
`
sqlParams := []interface{}{model.AfsOrderStatusFinished}
if len(vendorOrderIDs) > 0 {
sql += " AND t2.vendor_order_id IN (" + GenQuestionMarks(len(vendorOrderIDs)) + ")"
sqlParams = append(sqlParams, vendorOrderIDs)
}
err = GetRows(db, &afsSkuList, sql, sqlParams...)
return afsSkuList, err
}
func GetDailyFinishOrderList(db *DaoDB, storeID int, dateTime time.Time) (orderList []*model.OrderPickupTime, err error) {
sql := `
SELECT t2.status_time, t1.pick_deadline
@@ -769,19 +807,24 @@ func GetOrders(db *DaoDB, ids []int64, isIncludeSku, isIncludeFake bool, fromDat
offset = jxutils.FormalizePageOffset(offset)
sql := fmt.Sprintf(`
SELECT SQL_CALC_FOUND_ROWS
t1.*,
CAST(IF(t1.earning_price <> 0, t1.earning_price, IF(t1.shop_price <> 0 && t1.shop_price < t1.sale_price, t1.shop_price, t1.sale_price) * IF(t5.pay_percentage > 0, t5.pay_percentage, %d) / 100) AS SIGNED) earning_price,
SELECT SQL_CALC_FOUND_ROWS a.* FROM (
SELECT
DISTINCT t1.*,
-- CAST(IF(t1.earning_price <> 0, t1.earning_price, IF(t1.shop_price <> 0 && t1.shop_price < t1.sale_price, t1.shop_price, t1.sale_price) * IF(t1.order_pay_percentage > 0, t1.order_pay_percentage, %d) / 100) AS SIGNED) earning_price,
t2.status waybill_status, t2.courier_name, t2.courier_mobile,
t2.actual_fee, t2.desired_fee, t2.waybill_created_at, t2.waybill_finished_at,
t5.pay_percentage, t5.old_pay_percentage,
city.name city_name, district.name district_name`, model.DefaultEarningPricePercentage)
t5.pay_percentage, t5.old_pay_percentage, t5.market_man_phone, tu.name market_man_name,
t5.operator_phone, t5.operator_phone2, t5.operator_phone3, tu1.name operator_name, tu2.name operator_name2, tu3.name operator_name3,
t6.vendor_pay_percentage,
city.name city_name, district.name district_name,
ROUND(IF(t1.earning_type = 1, t1.total_shop_money-t1.earning_price-IFNULL(t2.desired_fee,0), t1.total_shop_money *(t1.order_pay_percentage/2)/100)) jx_income`, model.DefaultEarningPricePercentage)
if isIncludeSku {
sql += `,
IF(t3.jx_sku_id > 0, t3.jx_sku_id, t3.sku_id) sku_id,
t3.count sku_count2,
t3.shop_price sku_shop_price,
IF(t3.store_sub_id = 0, 0, t3.earning_price) sku_earning_price,
-- IF(t3.store_sub_id = 0, 0, t3.earning_price)
t3.earning_price sku_earning_price,
t3.sale_price sku_sale_price,
t3.sku_name`
}
@@ -789,8 +832,16 @@ func GetOrders(db *DaoDB, ids []int64, isIncludeSku, isIncludeFake bool, fromDat
FROM goods_order t1
LEFT JOIN waybill t2 ON t1.vendor_waybill_id = t2.vendor_waybill_id AND t1.waybill_vendor_id = t2.waybill_vendor_id AND t1.vendor_order_id = t2.vendor_order_id
LEFT JOIN store t5 ON t5.id = IF(t1.jx_store_id <> 0, t1.jx_store_id, t1.store_id)
LEFT JOIN store_map t6 ON t6.store_id = t5.id AND t6.deleted_at = '1970-01-01 00:00:00' AND t6.vendor_id = t1.vendor_id
LEFT JOIN place city ON city.code = t5.city_code
LEFT JOIN place district ON district.code = t5.district_code`
LEFT JOIN place district ON district.code = t5.district_code
LEFT JOIN user tu ON tu.mobile = t5.market_man_phone
LEFT JOIN user tu1 ON tu1.mobile = t5.operator_phone
LEFT JOIN user tu2 ON tu2.mobile = t5.operator_phone2
LEFT JOIN user tu3 ON tu3.mobile = t5.operator_phone3
-- LEFT JOIN (SELECT MAX(created_at), afs_order_id, vendor_order_id, vendor_id FROM afs_order WHERE status = 180 GROUP BY 2, 3, 4) t7 ON t7.vendor_order_id = t1.vendor_order_id AND t7.vendor_id = t1.vendor_id
-- LEFT JOIN afs_order t8 ON t8.afs_order_id = t7.afs_order_id
`
if isIncludeSku {
sql += `
JOIN order_sku t3 ON t3.vendor_order_id = t1.vendor_order_id AND t3.vendor_id = t1.vendor_id`
@@ -901,6 +952,44 @@ func GetOrders(db *DaoDB, ids []int64, isIncludeSku, isIncludeFake bool, fromDat
sqlParams = append(sqlParams, lockStatuss)
}
}
if params["brandID"] != nil {
if utils.MustInterface2Int64(params["brandID"]) != 0 {
sqlWhere += " AND t5.brand_id = ?"
sqlParams = append(sqlParams, utils.MustInterface2Int64(params["brandID"]))
}
}
if params["marketManPhone"] != nil {
sqlWhere += " AND t5.market_man_phone = ?"
sqlParams = append(sqlParams, params["marketManPhone"].(string))
}
if params["jdPhone"] != nil {
sqlWhere += " AND t5.operator_phone = ?"
sqlParams = append(sqlParams, params["jdPhone"].(string))
}
if params["mtPhone"] != nil {
sqlWhere += " AND t5.operator_phone2 = ?"
sqlParams = append(sqlParams, params["mtPhone"].(string))
}
if params["ebaiPhone"] != nil {
sqlWhere += " AND t5.operator_phone3 = ?"
sqlParams = append(sqlParams, params["ebaiPhone"].(string))
}
if params["deliveryTypes"] != nil {
var deliveryTypes []string
if err = utils.UnmarshalUseNumber([]byte(params["deliveryTypes"].(string)), &deliveryTypes); err != nil {
return nil, 0, err
}
if len(deliveryTypes) > 0 {
sqlWhere += " AND t1.delivery_type IN (" + GenQuestionMarks(len(deliveryTypes)) + ")"
sqlParams = append(sqlParams, deliveryTypes)
}
}
// if params["deliveryType"] != nil {
// if params["deliveryType"].(string) != "" {
// sqlWhere += " AND t1.delivery_type = ?"
// sqlParams = append(sqlParams, params["deliveryType"].(string))
// }
// }
if params["cities"] != nil {
var cities []int
if err = utils.UnmarshalUseNumber([]byte(params["cities"].(string)), &cities); err != nil {
@@ -957,13 +1046,25 @@ func GetOrders(db *DaoDB, ids []int64, isIncludeSku, isIncludeFake bool, fromDat
}
}
sql += `
LIMIT ? OFFSET ?`
) a WHERE 1 = 1`
if params["jxIncomeBegin"] != nil {
//if utils.MustInterface2Int64(params["jxIncomeBegin"]) != 0 {
sql += " AND a.jx_income >= ?"
sqlParams = append(sqlParams, utils.MustInterface2Int64(params["jxIncomeBegin"]))
//}
}
if params["jxIncomeEnd"] != nil {
//if utils.MustInterface2Int64(params["jxIncomeEnd"]) != 0 {
sql += " AND a.jx_income <= ?"
sqlParams = append(sqlParams, utils.MustInterface2Int64(params["jxIncomeEnd"]))
//}
}
sql += " LIMIT ? OFFSET ?"
sqlParams = append(sqlParams, pageSize, offset)
Begin(db)
defer Commit(db)
if err = GetRows(db, &orders, sql, sqlParams...); err == nil {
totalCount = GetLastTotalRowCount(db)
txDB, _ := Begin(db)
defer Commit(db, txDB)
if err = GetRowsTx(txDB, &orders, sql, sqlParams...); err == nil {
totalCount = GetLastTotalRowCount2(db, txDB)
}
return orders, totalCount, err
}
@@ -1145,10 +1246,10 @@ func GetOrdersSupplement(db *DaoDB, storIDs, vendorIDs, statuss []int, vendorOrd
sql += " ORDER BY supplement_time DESC"
sql += " LIMIT ? OFFSET ?"
sqlParams = append(sqlParams, pageSize, offset)
Begin(db)
defer Commit(db)
if err = GetRows(db, &orderSupplementFee, sql, sqlParams...); err == nil {
totalCount = GetLastTotalRowCount(db)
txDB, _ := Begin(db)
defer Commit(db, txDB)
if err = GetRowsTx(txDB, &orderSupplementFee, sql, sqlParams...); err == nil {
totalCount = GetLastTotalRowCount2(db, txDB)
}
return orderSupplementFee, totalCount, err
}
@@ -1338,10 +1439,10 @@ func GetAfsOrdersByPage(db *DaoDB, vendorOrderID, afsOrderID, userID string, fro
LIMIT ? OFFSET ?
`
sqlParams = append(sqlParams, pageSize, offset)
Begin(db)
defer Commit(db)
if err = GetRows(db, &afsOrderList, sql, sqlParams...); err == nil {
totalCount = GetLastTotalRowCount(db)
txDB, _ := Begin(db)
defer Commit(db, txDB)
if err = GetRowsTx(txDB, &afsOrderList, sql, sqlParams...); err == nil {
totalCount = GetLastTotalRowCount2(db, txDB)
}
return afsOrderList, totalCount, err
}
@@ -1478,3 +1579,160 @@ func GetPriceDefendOrder(db *DaoDB, vendorOrderID string, storeIDs, skuIDs, issu
err = GetRows(db, &priceDefendOrders, sql, sqlParams)
return priceDefendOrders, err
}
func GetCoupons(db *DaoDB, couponType int, couponStatuss, storeIDs []int, userID, mobile, keyword string) (coupons []*model.Coupons, err error) {
sqlParams := []interface{}{}
sql := `
SELECT DISTINCT a.*
FROM coupons a
`
if userID != "" || mobile != "" {
sql += " JOIN user_coupons b ON a.id = b.coupon_id"
if userID != "" {
sql += " AND b.user_id = ?"
sqlParams = append(sqlParams, userID)
}
if mobile != "" {
sql += " AND b.mobile = ?"
sqlParams = append(sqlParams, mobile)
}
}
sql += `
WHERE a.is_all = ?
`
sqlParams = append(sqlParams, model.YES)
if couponType != 0 {
sql += " AND a.coupon_type = ?"
sqlParams = append(sqlParams, couponType)
}
if keyword != "" {
sql += " AND (a.name LIKE ? OR a.desc LIKE ?)"
sqlParams = append(sqlParams, "%"+keyword+"%", "%"+keyword+"%")
}
if len(couponStatuss) > 0 {
sql += " AND a.coupon_status IN (" + GenQuestionMarks(len(couponStatuss)) + ")"
sqlParams = append(sqlParams, couponStatuss)
}
sql += `
UNION
SELECT DISTINCT a.*
FROM coupons a
LEFT JOIN store_coupons b ON a.id = b.coupon_id AND b.deleted_at = ?
`
if userID != "" || mobile != "" {
sql += " JOIN user_coupons c ON a.id = c.coupon_id"
if userID != "" {
sql += " AND c.user_id = ?"
sqlParams = append(sqlParams, userID)
}
if mobile != "" {
sql += " AND c.mobile = ?"
sqlParams = append(sqlParams, mobile)
}
}
sql += `
WHERE 1 = 1
`
sqlParams = append(sqlParams, utils.DefaultTimeValue)
if couponType != 0 {
sql += " AND a.coupon_type = ?"
sqlParams = append(sqlParams, couponType)
}
if keyword != "" {
sql += " AND (a.name LIKE ? OR a.desc LIKE ?)"
sqlParams = append(sqlParams, "%"+keyword+"%", "%"+keyword+"%")
}
if len(couponStatuss) > 0 {
sql += " AND a.coupon_status IN (" + GenQuestionMarks(len(couponStatuss)) + ")"
sqlParams = append(sqlParams, couponStatuss)
}
if len(storeIDs) > 0 {
sql += " AND b.store_id IN (" + GenQuestionMarks(len(storeIDs)) + ")"
sqlParams = append(sqlParams, storeIDs)
}
err = GetRows(db, &coupons, sql, sqlParams)
return coupons, err
}
func GetStoreCoupons(db *DaoDB, couponIDs, storeIDs []int) (storeCoupons []*model.StoreCoupons, err error) {
sql := `
SELECT *
FROM store_coupons
WHERE deleted_at = ?
`
sqlParams := []interface{}{utils.DefaultTimeValue}
if len(couponIDs) > 0 {
sql += " AND coupon_id IN (" + GenQuestionMarks(len(couponIDs)) + ")"
sqlParams = append(sqlParams, couponIDs)
}
if len(storeIDs) > 0 {
sql += " AND store_id IN (" + GenQuestionMarks(len(storeIDs)) + ")"
sqlParams = append(sqlParams, storeIDs)
}
err = GetRows(db, &storeCoupons, sql, sqlParams)
return storeCoupons, err
}
func GetUserCoupons(db *DaoDB, couponIDs []int, userIDs, mobiles []string, userStatus int) (userCoupons []*model.UserCoupons, err error) {
sql := `
SELECT *
FROM user_coupons
WHERE 1 = 1
`
sqlParams := []interface{}{}
if len(couponIDs) > 0 {
sql += " AND coupon_id IN (" + GenQuestionMarks(len(couponIDs)) + ")"
sqlParams = append(sqlParams, couponIDs)
}
if len(userIDs) > 0 {
sql += " AND user_id IN (" + GenQuestionMarks(len(userIDs)) + ")"
sqlParams = append(sqlParams, userIDs)
}
if len(mobiles) > 0 {
sql += " AND mobile IN (" + GenQuestionMarks(len(mobiles)) + ")"
sqlParams = append(sqlParams, mobiles)
}
if userStatus != 0 {
sql += " AND user_coupon_status = ?"
sqlParams = append(sqlParams, userStatus)
}
err = GetRows(db, &userCoupons, sql, sqlParams)
return userCoupons, err
}
type QueryOrdersForManageStateResult struct {
VendorOrderID string `orm:"column(vendor_order_id)"`
BindID int `orm:"column(bind_id)"`
}
func QueryOrdersForManageState(db *DaoDB, storeID, vendorID, status int, fromTime, toTime time.Time) (userCoupons []*QueryOrdersForManageStateResult, err error) {
sql := `
SELECT a.vendor_order_id ,b.id bind_id
FROM goods_order a
LEFT JOIN waybill b ON a.vendor_order_id = b.vendor_order_id
WHERE 1 = 1
`
sqlParams := []interface{}{}
if storeID != 0 {
sql += " AND (a.storeID = ? OR a.jx_store_id = ?)"
sqlParams = append(sqlParams, storeID, storeID)
}
if vendorID != -1 {
sql += " AND a.vendor_id = ?"
sqlParams = append(sqlParams, vendorID)
}
if status != 0 {
sql += " AND a.status = ?"
sqlParams = append(sqlParams, status)
}
if !utils.IsTimeZero(fromTime) {
sql += " AND a.order_created_at > ?"
sqlParams = append(sqlParams, fromTime)
}
if !utils.IsTimeZero(toTime) {
sql += " AND a.order_created_at < ?"
sqlParams = append(sqlParams, toTime)
}
err = GetRows(db, &userCoupons, sql, sqlParams)
return userCoupons, err
}

View File

@@ -5,24 +5,23 @@ import (
"time"
"git.rosy.net.cn/baseapi/utils"
"git.rosy.net.cn/jx-callback/globals"
)
func TestGetAfsOrderSkuInfo(t *testing.T) {
afsSkus, err := GetAfsOrderSkuInfo(GetDB(), "", "", 0)
if err == nil {
t.Fatal("应该要报错")
}
afsSkus, err = GetAfsOrderSkuInfo(GetDB(), "", "23148482", 0)
if err != nil {
t.Fatal(err)
}
globals.SugarLogger.Debug(utils.Format4Output(afsSkus, false))
afsSkus, err = GetAfsOrderSkuInfo(GetDB(), "916829559000841", "", 0)
if err != nil {
t.Fatal(err)
}
globals.SugarLogger.Debug(utils.Format4Output(afsSkus, false))
//afsSkus, err := GetAfsOrderSkuInfo(GetDB(), "", "", 0)
//if err == nil {
// t.Fatal("应该要报错")
//}
//afsSkus, err = GetAfsOrderSkuInfo(GetDB(), "", "23148482", 0)
//if err != nil {
// t.Fatal(err)
//}
//globals.SugarLogger.Debug(utils.Format4Output(afsSkus, false))
//afsSkus, err = GetAfsOrderSkuInfo(GetDB(), "916829559000841", "", 0)
//if err != nil {
// t.Fatal(err)
//}
//globals.SugarLogger.Debug(utils.Format4Output(afsSkus, false))
}
func TestGetStoreOrderSkuList(t *testing.T) {

View File

@@ -20,6 +20,7 @@ type UserDeliveryAddressEx struct {
UserName string `json:"userName"`
CityName string `json:"cityName"`
DistrictName string `json:"districtName"`
ParentCode int `json:"parentCode"`
}
type GetSelfInfoResult struct {
@@ -93,10 +94,10 @@ func GetUsers(db *DaoDB, userType int, keyword string, userIDs, userID2s, mobile
}
sql += " LIMIT ? OFFSET ?"
sqlParams = append(sqlParams, pageSize, offset)
Begin(db)
defer Commit(db)
if err = GetRows(db, &userList, sql, sqlParams...); err == nil {
totalCount = GetLastTotalRowCount(db)
txDB, _ := Begin(db)
defer Commit(db, txDB)
if err = GetRowsTx(txDB, &userList, sql, sqlParams...); err == nil {
totalCount = GetLastTotalRowCount2(db, txDB)
}
return userList, totalCount, err
}
@@ -183,11 +184,13 @@ func QueryUserDeliveryAddress(db *DaoDB, addressID int64, userIDs []string, offs
t1.*,
t2.name user_name,
district.name district_name,
city.name city_name
city.name city_name,
cp.code parent_code
FROM user_delivery_address t1
LEFT JOIN user t2 ON t2.user_id = t1.user_id
LEFT JOIN place district ON district.code = t1.district_code
LEFT JOIN place city ON city.code = t1.city_code
LEFT JOIN place cp ON cp.code = city.parent_code
WHERE t1.deleted_at = ?
`
sqlParams := []interface{}{
@@ -208,10 +211,10 @@ func QueryUserDeliveryAddress(db *DaoDB, addressID int64, userIDs []string, offs
LIMIT ? OFFSET ?`
sqlParams = append(sqlParams, pageSize, offset)
Begin(db)
defer Commit(db)
if err = GetRows(db, &addressList, sql, sqlParams...); err == nil {
totalCount = GetLastTotalRowCount(db)
txDB, _ := Begin(db)
defer Commit(db, txDB)
if err = GetRowsTx(txDB, &addressList, sql, sqlParams...); err == nil {
totalCount = GetLastTotalRowCount2(db, txDB)
}
return addressList, totalCount, err
}
@@ -280,7 +283,7 @@ func GetUserOrderSMS(db *DaoDB, mobile, name string) (userOrderSms *model.UserOr
return userOrderSms, err
}
func GetUserMember(db *DaoDB, userID, vendorOrderID string, memberType, isPay int) (userMembers []*model.UserMember, err error) {
func GetUserMember(db *DaoDB, userID, vendorOrderID, mobile string, vendorID, memberType, isPay int) (userMembers []*model.UserMember, err error) {
sql := `
SELECT *
FROM user_member
@@ -295,6 +298,10 @@ func GetUserMember(db *DaoDB, userID, vendorOrderID string, memberType, isPay in
sql += " AND vendor_order_id = ?"
sqlParams = append(sqlParams, vendorOrderID)
}
if mobile != "" {
sql += " AND mobile = ?"
sqlParams = append(sqlParams, mobile)
}
if memberType != 0 {
sql += " AND member_type = ?"
sqlParams = append(sqlParams, memberType)
@@ -303,6 +310,25 @@ func GetUserMember(db *DaoDB, userID, vendorOrderID string, memberType, isPay in
sql += " AND is_pay = ?"
sqlParams = append(sqlParams, isPay)
}
if vendorID != -1 {
sql += " AND vendor_id = ?"
sqlParams = append(sqlParams, vendorID)
}
err = GetRows(db, &userMembers, sql, sqlParams)
return userMembers, err
}
func GetUserMemberWithoutDeleted(db *DaoDB, vendorID int) (userMembers []*model.UserMember, err error) {
sql := `
SELECT *
FROM user_member
WHERE 1 = 1
`
sqlParams := []interface{}{}
if vendorID != -1 {
sql += " AND vendor_id = ?"
sqlParams = append(sqlParams, vendorID)
}
err = GetRows(db, &userMembers, sql, sqlParams)
return userMembers, err
}

View File

@@ -108,10 +108,10 @@ func GetOperateEvents(db *DaoDB, name string, apiFunctions []string, operateType
LIMIT ? OFFSET ?
`
sqlParams = append(sqlParams, pageSize, offset)
Begin(db)
defer Commit(db)
if err = GetRows(db, &operateEventExt, sql, sqlParams...); err == nil {
totalCount = GetLastTotalRowCount(db)
txDB, _ := Begin(db)
defer Commit(db, txDB)
if err = GetRowsTx(txDB, &operateEventExt, sql, sqlParams...); err == nil {
totalCount = GetLastTotalRowCount2(db, txDB)
}
var (
accessUUidList []string

View File

@@ -80,10 +80,10 @@ func QueryFoodRecipes(db *DaoDB, keyword string, recipeID int, authorID, userID
LIMIT ? OFFSET ?`
sqlParams = append(sqlParams, pageSize, offset)
Begin(db)
defer Commit(db)
if err = GetRows(db, &recipeList, sql, sqlParams...); err == nil {
totalCount = GetLastTotalRowCount(db)
txDB, _ := Begin(db)
defer Commit(db, txDB)
if err = GetRowsTx(txDB, &recipeList, sql, sqlParams...); err == nil {
totalCount = GetLastTotalRowCount2(db, txDB)
}
return recipeList, totalCount, err
}

View File

@@ -0,0 +1,50 @@
package dao
import (
"git.rosy.net.cn/jx-callback/business/jxutils"
"git.rosy.net.cn/jx-callback/business/model"
)
func GetKnowledgeDepot(db *DaoDB, keyword string, offset, pageSize int) (page *model.PagedInfo, err error) {
var (
knows []*model.KnowledgeDepot
)
sql := `
SELECT SQL_CALC_FOUND_ROWS *
FROM knowledge_depot
WHERE 1 = 1
`
sqlParams := []interface{}{}
if keyword != "" {
sql += " AND (content LIKE ? OR title LIKE ?)"
sqlParams = append(sqlParams, "%"+keyword+"%", "%"+keyword+"%")
}
sql += " LIMIT ? OFFSET ?"
pageSize = jxutils.FormalizePageSize(pageSize)
offset = jxutils.FormalizePageOffset(offset)
sqlParams = append(sqlParams, pageSize, offset)
txDB, _ := Begin(db)
defer Commit(db, txDB)
if err = GetRowsTx(txDB, &knows, sql, sqlParams...); err == nil {
page = &model.PagedInfo{
TotalCount: GetLastTotalRowCount2(db, txDB),
Data: knows,
}
}
return page, err
}
func GetKnowledgeDepotNoPage(db *DaoDB, ids []int) (knows []*model.KnowledgeDepot, err error) {
sql := `
SELECT *
FROM knowledge_depot
WHERE 1 = 1
`
sqlParams := []interface{}{}
if len(ids) > 0 {
sql += " AND id IN (" + GenQuestionMarks(len(ids)) + ")"
sqlParams = append(sqlParams, ids)
}
GetRows(db, &knows, sql, sqlParams...)
return knows, err
}

View File

@@ -11,6 +11,9 @@ type PageShopWithPlaceName struct {
CityName string `json:"cityName"`
DistrictName string `json:"districtName"`
Distance int `json:"distance"`
BrandName string `json:"brandName"`
Category string `json:"category"`
ShippingTime string `json:"shippingTime"`
}
func QueryPageStores(db *DaoDB, pageSize, offset int, keyword string, vendorStoreID string, vendorID int, orgCode string,
@@ -81,21 +84,21 @@ func QueryPageStores(db *DaoDB, pageSize, offset int, keyword string, vendorStor
offset = jxutils.FormalizePageOffset(offset)
sqlParams = append(sqlParams, pageSize, offset)
var shopList []*PageShopWithPlaceName
Begin(db)
txDB, _ := Begin(db)
defer func() {
if r := recover(); r != nil {
Rollback(db)
Rollback(db, txDB)
panic(r)
}
}()
if err = GetRows(db, &shopList, sql, sqlParams...); err == nil {
if err = GetRowsTx(txDB, &shopList, sql, sqlParams...); err == nil {
pagedInfo = &model.PagedInfo{
TotalCount: GetLastTotalRowCount(db),
TotalCount: GetLastTotalRowCount2(db, txDB),
Data: shopList,
}
Commit(db)
Commit(db, txDB)
} else {
Rollback(db)
Rollback(db, txDB)
}
return pagedInfo, err
}

View File

@@ -5,7 +5,7 @@ import (
"git.rosy.net.cn/jx-callback/business/model"
)
func GetMenu(db *DaoDB, name string, level int, userID string) (menus []*model.Menu, err error) {
func GetMenu(db *DaoDB, name string, level, menuType int, userID string) (menus []*model.Menu, err error) {
sqlParams := []interface{}{}
sql := `
SELECT DISTINCT a.*
@@ -14,10 +14,10 @@ func GetMenu(db *DaoDB, name string, level int, userID string) (menus []*model.M
if userID != "" {
sql += `
JOIN menu d ON d.parent_id = a.id
JOIN user_role b ON b.user_id = ?
JOIN role_menu c ON c.menu_id = d.id AND c.role_id = b.role_id
JOIN user_role b ON b.user_id = ? AND b.deleted_at = ?
JOIN role_menu c ON c.menu_id = d.id AND c.role_id = b.role_id AND c.deleted_at = ?
`
sqlParams = append(sqlParams, userID)
sqlParams = append(sqlParams, userID, utils.DefaultTimeValue, utils.DefaultTimeValue)
}
sql += " WHERE a.deleted_at = ?"
sqlParams = append(sqlParams, utils.DefaultTimeValue)
@@ -29,26 +29,33 @@ func GetMenu(db *DaoDB, name string, level int, userID string) (menus []*model.M
sql += " AND a.level = ?"
sqlParams = append(sqlParams, level)
}
if menuType != 0 {
sql += " AND a.type = ?"
sqlParams = append(sqlParams, menuType)
}
sql += " ORDER BY a.id"
err = GetRows(db, &menus, sql, sqlParams)
return menus, err
}
func GetMenuWithUser(db *DaoDB, name string, level int, userID string) (menus []*model.Menu, err error) {
func GetMenuWithUser(db *DaoDB, name string, level, menuType int, userID string) (menus []*model.Menu, err error) {
sql := `
SELECT DISTINCT b.* FROM (
SELECT a.id,a.parent_id
FROM menu a
JOIN user_role b ON b.user_id = ?
JOIN role_menu c ON c.menu_id = a.id AND c.role_id = b.role_id
JOIN user_role b ON b.user_id = ? AND b.deleted_at = ?
JOIN role_menu c ON c.menu_id = a.id AND c.role_id = b.role_id AND c.deleted_at = ?
WHERE a.deleted_at = ?)a
JOIN menu b ON (b.id = a.id OR b.id = a.parent_id)
WHERE b.type = ?
ORDER BY b.id
`
sqlParams := []interface{}{userID, utils.DefaultTimeValue}
sqlParams := []interface{}{userID, utils.DefaultTimeValue, utils.DefaultTimeValue, utils.DefaultTimeValue, menuType}
err = GetRows(db, &menus, sql, sqlParams)
return menus, err
}
func GetRole(db *DaoDB, name string) (roles []*model.Role, err error) {
func GetRole(db *DaoDB, name, name2 string) (roles []*model.Role, err error) {
sql := `
SELECT *
FROM role
@@ -61,6 +68,10 @@ func GetRole(db *DaoDB, name string) (roles []*model.Role, err error) {
sql += " AND name LIKE ?"
sqlParams = append(sqlParams, "%"+name+"%")
}
if name2 != "" {
sql += " AND name = ?"
sqlParams = append(sqlParams, name2)
}
err = GetRows(db, &roles, sql, sqlParams)
return roles, err
}
@@ -86,6 +97,33 @@ func GetUserRole(db *DaoDB, userIDs []string, roleIDs []int) (userRoles []*model
return userRoles, err
}
type GetUserRole2Result struct {
model.Role
model.UserRole
}
func GetUserRole2(db *DaoDB, userIDs []string, roleIDs []int) (userRoles []*GetUserRole2Result, err error) {
sql := `
SELECT *
FROM user_role a
JOIN role b ON a.role_id = b.id
WHERE a.deleted_at = ?
`
sqlParams := []interface{}{
utils.DefaultTimeValue,
}
if len(userIDs) > 0 {
sql += " AND a.user_id IN (" + GenQuestionMarks(len(userIDs)) + ")"
sqlParams = append(sqlParams, userIDs)
}
if len(roleIDs) > 0 {
sql += " AND a.role_id IN (" + GenQuestionMarks(len(roleIDs)) + ")"
sqlParams = append(sqlParams, roleIDs)
}
err = GetRows(db, &userRoles, sql, sqlParams)
return userRoles, err
}
func GetRoleMenu(db *DaoDB, roleIDs, menuIDs []int) (roleMenus []*model.RoleMenu, err error) {
sql := `
SELECT *

View File

@@ -2,7 +2,7 @@ package dao
import (
"git.rosy.net.cn/jx-callback/business/model"
"github.com/astaxie/beego/orm"
"github.com/astaxie/beego/client/orm"
)
const (
@@ -74,3 +74,29 @@ func GetPlaceByJdCode(db *DaoDB, jdCode int) (place *model.Place, err error) {
err = db.Db.Read(place, "JdCode")
return place, err
}
func GetPlaceByJdsCode(db *DaoDB, jdsCode int) (place *model.Place, err error) {
if db == nil {
db = GetDB()
}
place = &model.Place{
JdsCode: jdsCode,
}
err = db.Db.Read(place, "JdsCode")
return place, err
}
func GetPlaces(db *DaoDB, cityCodes []int) (places []*model.Place, err error) {
sql := `
SELECT *
FROM place
WHERE 1 = 1
`
sqlParams := []interface{}{}
if len(cityCodes) > 0 {
sql += " AND code IN (" + GenQuestionMarks(len(cityCodes)) + ")"
sqlParams = append(sqlParams, cityCodes)
}
err = GetRows(db, &places, sql, sqlParams)
return places, err
}

View File

@@ -34,6 +34,7 @@ type StatisticsReportForOrdersList struct {
OperatorName2 string `json:"operatorName2"`
OperatorName3 string `json:"operatorName3"`
Address string `json:"address"`
CityName string `json:"cityName"`
Status int `json:"status"`
Tel1 string `orm:"size(32);index" json:"tel1"`
@@ -49,11 +50,12 @@ type PriceReferSnapshotExt struct {
}
//查询统计订单信息
func GetStatisticsReportForOrders(db *DaoDB, storeIDs []int, fromDate time.Time, toDate time.Time) (statisticsReportForOrdersList []*StatisticsReportForOrdersList, err error) {
func GetStatisticsReportForOrders(db *DaoDB, storeIDs, vendorIDs []int, fromDate time.Time, toDate time.Time, marketPhone, jdPhone, mtPhone, ebaiPhone string) (statisticsReportForOrdersList []*StatisticsReportForOrdersList, err error) {
sql := `
SELECT
c.id store_id,
c.name store_name,
c.address,
s.order_counts,
s.sale_price,
s.actual_pay_price,
@@ -66,8 +68,8 @@ func GetStatisticsReportForOrders(db *DaoDB, storeIDs []int, fromDate time.Time,
s.pm_subsidy_money,
s.earning_price,
s.total_gross_profit,
IF(c.jx_brand_fee_factor = 0 AND c.market_add_fee_factor = 0,total_gross_profit,(total_gross_profit*c.jx_brand_fee_factor)/(c.jx_brand_fee_factor+market_add_fee_factor)) com_gross_profit,
IF(c.jx_brand_fee_factor = 0 AND c.market_add_fee_factor = 0,0,(total_gross_profit*c.market_add_fee_factor)/(c.jx_brand_fee_factor+market_add_fee_factor)) city_manager_gross_profit,
IF(c.jx_brand_fee_factor = 0 AND c.market_add_fee_factor = 0,s.total_gross_profit,(s.total_gross_profit*c.jx_brand_fee_factor)/(c.jx_brand_fee_factor+market_add_fee_factor)) com_gross_profit,
IF(c.jx_brand_fee_factor = 0 AND c.market_add_fee_factor = 0,0,(s.total_gross_profit*c.market_add_fee_factor)/(c.jx_brand_fee_factor+market_add_fee_factor)) city_manager_gross_profit,
c.status, c.tel1,
IF(mm.name <> '', mm.name, mm.user_id2) market_man_name,
IF(om.name <> '', om.name, om.user_id2) operator_name,
@@ -80,28 +82,38 @@ func GetStatisticsReportForOrders(db *DaoDB, storeIDs []int, fromDate time.Time,
LEFT JOIN user om ON om.mobile <> '' AND om.mobile = c.operator_phone
LEFT JOIN user om2 ON om2.mobile <> '' AND om2.mobile = c.operator_phone2
LEFT JOIN user om3 ON om3.mobile <> '' AND om3.mobile = c.operator_phone3
LEFT JOIN
JOIN
(
SELECT
IF(a.jx_store_id <> 0,a.jx_store_id,store_id) store_id,
COUNT(*) order_counts,
SUM(sale_price) sale_price,
SUM(actual_pay_price) actual_pay_price,
SUM(shop_price) shop_price,
SUM(discount_money) discount_money,
SUM(desired_fee) desired_fee,
SUM(distance_freight_money) distance_freight_money,
SUM(IF(a.vendor_id = a.waybill_vendor_id,waybill_tip_money,0)) waybill_tip_money,
SUM(total_shop_money) total_shop_money,
SUM(pm_subsidy_money) pm_subsidy_money,
SUM(earning_price) earning_price,
SUM(total_shop_money-earning_price-desired_fee-distance_freight_money-waybill_tip_money-80) total_gross_profit
FROM goods_order a
LEFT JOIN waybill b ON IF(a.waybill_vendor_id = -1,a.vendor_order_id,a.vendor_waybill_id) = b.vendor_waybill_id
WHERE a.status != ?
SELECT ss.*,
ss.earning_price1 - IFNULL(ss.afs_shop_price,0) earning_price,
ss.total_shop_money1 - IFNULL(ss.afs_total_money,0) total_shop_money,
ss.total_gross_profit1 + IFNULL(ss.afs_shop_price,0) - IFNULL(ss.afs_total_money,0) - ss.order_counts*0.8*100 total_gross_profit
FROM (
SELECT
IF(a.jx_store_id <> 0,a.jx_store_id,a.store_id) store_id,
COUNT(*) order_counts,
SUM(a.sale_price) sale_price,
SUM(a.actual_pay_price) actual_pay_price,
SUM(a.shop_price) shop_price,
SUM(a.discount_money) discount_money,
SUM(b.desired_fee) desired_fee,
SUM(a.distance_freight_money) distance_freight_money,
SUM(IF(a.vendor_id = a.waybill_vendor_id,a.waybill_tip_money,0)) waybill_tip_money,
SUM(a.total_shop_money) total_shop_money1,
SUM(a.pm_subsidy_money) pm_subsidy_money,
SUM(IF(a.earning_type = 1, a.earning_price, a.new_earning_price)) earning_price1,
SUM(a.total_shop_money-IF(a.earning_type = 1, a.earning_price, a.new_earning_price)-b.desired_fee) total_gross_profit1,
SUM(d.shop_price) afs_shop_price,
SUM(IF(d.refund_money_by_cal > 0, d.refund_money_by_cal, 0)) afs_total_money
FROM goods_order a
LEFT JOIN waybill b ON IF(a.waybill_vendor_id = -1,a.vendor_order_id,a.vendor_waybill_id) = b.vendor_waybill_id
LEFT JOIN afs_order c ON c.vendor_order_id = a.vendor_order_id
LEFT JOIN order_sku_financial d ON d.afs_order_id = c.afs_order_id AND d.is_afs_order = ?
WHERE a.status = ?
`
sqlParams := []interface{}{
model.OrderStatusCanceled, //排除已取消的订单
model.YES,
model.OrderStatusFinished,
}
if !utils.IsTimeZero(fromDate) && !utils.IsTimeZero(toDate) {
sql += ` AND a.order_created_at BETWEEN ? AND ?`
@@ -111,15 +123,36 @@ func GetStatisticsReportForOrders(db *DaoDB, storeIDs []int, fromDate time.Time,
sql += ` AND IF(a.jx_store_id != 0, a.jx_store_id, a.store_id) IN(` + GenQuestionMarks(len(storeIDs)) + `)`
sqlParams = append(sqlParams, storeIDs)
}
if len(vendorIDs) > 0 {
sql += ` AND a.vendor_id IN(` + GenQuestionMarks(len(vendorIDs)) + `)`
sqlParams = append(sqlParams, vendorIDs)
}
sql += `
GROUP BY 1
)s
)ss ) s
ON s.store_id = c.id
WHERE 1 = 1
`
if len(storeIDs) > 0 {
sql += ` WHERE c.id IN (` + GenQuestionMarks(len(storeIDs)) + `)`
sql += ` AND c.id IN (` + GenQuestionMarks(len(storeIDs)) + `)`
sqlParams = append(sqlParams, storeIDs)
}
if marketPhone != "" {
sql += ` AND c.market_man_phone = ?`
sqlParams = append(sqlParams, marketPhone)
}
if jdPhone != "" {
sql += ` AND c.operator_phone = ?`
sqlParams = append(sqlParams, jdPhone)
}
if mtPhone != "" {
sql += ` AND c.operator_phone2 = ?`
sqlParams = append(sqlParams, mtPhone)
}
if ebaiPhone != "" {
sql += ` AND c.operator_phone3 = ?`
sqlParams = append(sqlParams, ebaiPhone)
}
if err = GetRows(db, &statisticsReportForOrdersList, sql, sqlParams...); err == nil {
return statisticsReportForOrdersList, nil
}
@@ -301,10 +334,10 @@ func GetPriceReferSnapshot(db *DaoDB, cityCodes, skuIDs []int, skuNameID int, sn
}
sql += " LIMIT ? OFFSET ?"
sqlParams = append(sqlParams, pageSize, offset)
Begin(db)
defer Commit(db)
if err = GetRows(db, &priceReferSnapshot, sql, sqlParams...); err == nil {
totalCount = GetLastTotalRowCount(db)
txDB, _ := Begin(db)
defer Commit(db, txDB)
if err = GetRowsTx(txDB, &priceReferSnapshot, sql, sqlParams...); err == nil {
totalCount = GetLastTotalRowCount2(db, txDB)
}
for _, v := range priceReferSnapshot {
skuList, err2 := GetSkus(db, []int{v.SkuID}, nil, nil, nil, nil)
@@ -358,3 +391,19 @@ func DeletePriceReferHistory(db *DaoDB, snapDate time.Time) (num int64, err erro
}
return ExecuteSQL(db, sql, sqlParams...)
}
type UserMemberReportResult struct {
Mobile string `json:"mobile"` //电话
Name string `json:"name"` //姓名
Status int `json:"status"` //状态
VendorID int `orm:"column(vendor_id)" json:"vendorID"`
BuyCount int `json:"buyCount"` //购买次数
NewPrice int64 `json:"newPrice"` //最近订单金额
FinishedCount int `json:"finishedCount"` //完成订单数
BuyPrice int `json:"buyPrice"` //购买总金额
FinishedPrice int `json:"finishedPrice"` //完成订单金额
GoodsCommentCount int `json:"goodsCommentCount"` //好评数
BadCommentCount int `json:"badCommentCount"` //差评数
CityCode int `json:"cityCode"` // 常住城市
CityName string `json:"cityName"`
}

View File

@@ -50,6 +50,21 @@ func DeleteSkuNamePlace(db *DaoDB, nameID int, placeCodes []int) (num int64, err
return ExecuteSQL(db, sql, sqlParams...)
}
func GetCategoriesByName(db *DaoDB, name string) (cats []*model.SkuCategory, err error) {
sql := `
SELECT t1.*
FROM sku_category t1
WHERE t1.deleted_at = ?`
params := []interface{}{
utils.DefaultTimeValue,
}
if name != "" {
sql += " AND t1.name = ?"
params = append(params, name)
}
return cats, GetRows(db, &cats, sql, params)
}
func GetCategories(db *DaoDB, parentID, level int, catIDs []int, isExd bool) (cats []*model.SkuCategory, err error) {
sql := `
SELECT t1.*
@@ -71,6 +86,8 @@ func GetCategories(db *DaoDB, parentID, level int, catIDs []int, isExd bool) (ca
params = append(params, level)
}
if isExd {
sql += " AND t1.is_exd_sync <> ?"
params = append(params, 1)
sql += " ORDER BY t1.level, t1.exd_seq"
} else {
sql += ` AND t1.is_exd_spec = 0
@@ -79,6 +96,31 @@ func GetCategories(db *DaoDB, parentID, level int, catIDs []int, isExd bool) (ca
return cats, GetRows(db, &cats, sql, params)
}
func GetCategoriesForStore(db *DaoDB, parentID, level int, catIDs []int) (cats []*model.StoreCategoryMap, err error) {
sql := `
SELECT t1.*, t1.seq store_category_seq, t1.id category_id, t1.name store_category_name
FROM sku_category t1
WHERE t1.deleted_at = ?`
params := []interface{}{
utils.DefaultTimeValue,
}
if parentID != -1 {
sql += " AND t1.parent_id = ?"
params = append(params, parentID)
}
if len(catIDs) > 0 {
sql += " AND t1.id IN (" + GenQuestionMarks(len(catIDs)) + ")"
params = append(params, catIDs)
}
if level > 0 {
sql += " AND t1.level = ?"
params = append(params, level)
}
sql += ` AND t1.is_exd_spec = 0
ORDER BY t1.level, t1.seq`
return cats, GetRows(db, &cats, sql, params)
}
func GetSkus(db *DaoDB, skuIDs, nameIDs, statuss, catIDs []int, eclpIDs []string) (skuList []*model.SkuAndName, err error) {
sql := `
SELECT t1.*, t2.name, t2.unit, t2.prefix, t2.is_spu, t2.ex_prefix, t2.ex_prefix_begin, t2.ex_prefix_end, t2.upc
@@ -106,12 +148,13 @@ func GetSkus(db *DaoDB, skuIDs, nameIDs, statuss, catIDs []int, eclpIDs []string
}
if len(catIDs) > 0 {
sql += `
JOIN sku_category t3 ON t3.id = t2.category_id
LEFT JOIN sku_category t3p ON t3p.id = t3.parent_id
JOIN sku_category t3 ON t3.id = t2.category_id AND t3.is_exd_spec = ?
LEFT JOIN sku_category t3p ON t3p.id = t3.parent_id AND t3p.is_exd_spec = ?
`
sqlWhere += " AND (t3.id IN (" + GenQuestionMarks(len(catIDs)) + ")"
sqlWhere += " OR t3p.id IN (" + GenQuestionMarks(len(catIDs)) + ") )"
sqlParams = append(sqlParams, catIDs, catIDs)
sqlWhere += " AND t1.exd_sku_id = ''"
sqlParams = append(sqlParams, model.NO, model.NO, catIDs, catIDs)
}
if len(eclpIDs) > 0 {
sqlWhere += " AND t1.eclp_id IN (" + GenQuestionMarks(len(eclpIDs)) + ")"
@@ -180,6 +223,7 @@ func GetSkuByCats(db *DaoDB, catIDs []int) (skuList []*model.Sku, err error) {
// 多门店平台使用,当前只有京东
func GetSkuCategoryWithVendor(db *DaoDB, vendorIDs []int, appOrgCodes []string, parentCatID int, catIDs []int, mustDirty bool) (catList []*SkuStoreCatInfo, err error) {
sqlParams := []interface{}{}
sql := `
SELECT
t1m.vendor_id, t1m.vendor_org_code,
@@ -188,17 +232,20 @@ func GetSkuCategoryWithVendor(db *DaoDB, vendorIDs []int, appOrgCodes []string,
t1.*,
t1m.vendor_thing_id vendor_cat_id,
t1m.sync_status cat_sync_status,
a.is_jx_cat,
b.vendor_category_name,
b.vendor_category_seq,
b.id vendor_category_id,
t1pm.id parent_map_id,
t1p.name parent_cat_name,
t1pm.vendor_thing_id parent_vendor_cat_id,
t1pm.sync_status parent_cat_sync_status
FROM sku_category t1
LEFT JOIN thing_map t1m ON t1m.thing_id = t1.id AND t1m.thing_type = ? AND t1m.deleted_at = ?`
sqlParams := []interface{}{
LEFT JOIN thing_map t1m ON t1m.thing_id = t1.id AND t1m.thing_type = ? AND t1m.deleted_at = ?
`
sqlParams = append(sqlParams,
model.ThingTypeCategory,
utils.DefaultTimeValue,
}
utils.DefaultTimeValue)
if len(vendorIDs) > 0 {
sql += " AND t1m.vendor_id IN (" + GenQuestionMarks(len(vendorIDs)) + ")"
sqlParams = append(sqlParams, vendorIDs)
@@ -208,13 +255,22 @@ func GetSkuCategoryWithVendor(db *DaoDB, vendorIDs []int, appOrgCodes []string,
sqlParams = append(sqlParams, appOrgCodes)
}
sql += `
LEFT JOIN vendor_org_code a ON a.vendor_org_code = t1m.vendor_org_code AND a.vendor_id = t1m.vendor_id AND a.deleted_at = ?
LEFT JOIN vendor_category_map b ON b.vendor_org_code = t1m.vendor_org_code AND b.vendor_id = t1m.vendor_id AND b.category_id = t1m.thing_id AND b.deleted_at = ?
`
sqlParams = append(sqlParams,
utils.DefaultTimeValue,
utils.DefaultTimeValue,
)
sql += `
LEFT JOIN sku_category t1p ON t1p.id = t1.parent_id
LEFT JOIN thing_map t1pm ON t1pm.thing_id = t1p.id AND t1pm.thing_type = ? AND t1m.deleted_at = ?
AND t1pm.vendor_id = t1m.vendor_id AND t1pm.vendor_org_code = t1m.vendor_org_code
LEFT JOIN vendor_category_map c ON c.vendor_org_code = t1pm.vendor_org_code AND c.vendor_id = t1pm.vendor_id AND c.category_id = t1pm.thing_id AND c.deleted_at = ?
WHERE 1 = 1
AND t1.is_sync <> ?
`
sqlParams = append(sqlParams, model.ThingTypeCategory, utils.DefaultTimeValue, model.YES)
sqlParams = append(sqlParams, model.ThingTypeCategory, utils.DefaultTimeValue, utils.DefaultTimeValue, model.YES)
if mustDirty {
sql += " AND t1m.sync_status IS NOT NULL AND t1m.sync_status <> 0"
} else {
@@ -439,3 +495,128 @@ func GetSkuVendorCategoryMaps(db *DaoDB, nameIDs, vendorIDs []int, vendorCategor
}
return nil, err
}
func GetVendorCategoryMap(db *DaoDB, parentID, level, vendorID int, vendorOrgCode string, categoryID int) (vendorMaps []*model.VendorCategoryMap, err error) {
sql := `
SELECT a.*
FROM vendor_category_map a
WHERE a.deleted_at = ?
`
sqlParams := []interface{}{
utils.DefaultTimeValue,
}
if parentID >= 0 {
sql += " AND a.parent_id = ?"
sqlParams = append(sqlParams, parentID)
}
if level > 0 {
sql += " AND a.level = ?"
sqlParams = append(sqlParams, level)
}
if vendorID != -1 {
sql += " AND a.vendor_id = ?"
sqlParams = append(sqlParams, vendorID)
}
if vendorOrgCode != "" {
sql += " AND a.vendor_org_code = ?"
sqlParams = append(sqlParams, vendorOrgCode)
}
if categoryID > 0 {
sql += " AND a.category_id = ?"
sqlParams = append(sqlParams, categoryID)
}
sql += " ORDER BY a.level, a.vendor_category_seq"
err = GetRows(db, &vendorMaps, sql, sqlParams)
if err != nil {
return nil, err
}
return vendorMaps, err
}
type GetVendorCategoryMapExtResult struct {
model.VendorCategoryMap
VendorThingID string `orm:"column(vendor_thing_id)" json:"vendorThingID"`
}
func GetVendorCategoryMapExt(db *DaoDB, parentID, level, vendorID int, vendorOrgCode string, categoryID int) (vendorMaps []*GetVendorCategoryMapExtResult, err error) {
sql := `
SELECT a.*, b.vendor_thing_id
FROM vendor_category_map a
JOIN thing_map b ON b.thing_id = a.category_id AND b.vendor_org_code = a.vendor_org_code AND b.vendor_id = a.vendor_id AND b.thing_type = ?
WHERE a.deleted_at = ?
`
sqlParams := []interface{}{
model.ThingTypeCategory,
utils.DefaultTimeValue,
}
if parentID >= 0 {
sql += " AND a.parent_id = ?"
sqlParams = append(sqlParams, parentID)
}
if level > 0 {
sql += " AND a.level = ?"
sqlParams = append(sqlParams, level)
}
if vendorID != -1 {
sql += " AND a.vendor_id = ?"
sqlParams = append(sqlParams, vendorID)
}
if vendorOrgCode != "" {
sql += " AND a.vendor_org_code = ?"
sqlParams = append(sqlParams, vendorOrgCode)
}
if categoryID > 0 {
sql += " AND a.category_id = ?"
sqlParams = append(sqlParams, categoryID)
}
sql += " ORDER BY a.vendor_category_seq"
err = GetRows(db, &vendorMaps, sql, sqlParams)
if err != nil {
return nil, err
}
return vendorMaps, err
}
func GetMtJdCategoryMap(db *DaoDB, mtID, jdID string) (cats []*model.MtJdCategoryMap, err error) {
sql := `
SELECT a.*
FROM mt_jd_category_map a
WHERE 1 = 1
`
sqlParams := []interface{}{}
if mtID != "" {
sql += " AND a.mt_id = ?"
sqlParams = append(sqlParams, mtID)
}
if jdID != "" {
sql += " AND a.jd_id = ?"
sqlParams = append(sqlParams, jdID)
}
err = GetRows(db, &cats, sql, sqlParams)
if err != nil {
return nil, err
}
return cats, err
}
type GetVendorCategoriesWithMapResult struct {
model.SkuVendorCategory
CatMapID string `orm:"column(cat_map_id)" json:"catMapID"`
}
func GetVendorCategoriesWithMap(db *DaoDB, vendorID, vendorCategoryID int) (results []*GetVendorCategoriesWithMapResult, err error) {
sql := `
SELECT a.*, b.jd_id cat_map_id
FROM sku_vendor_category a
LEFT JOIN mt_jd_category_map b ON a.vendor_category_id = b.mt_id
WHERE vendor_id = ?
`
sqlParams := []interface{}{vendorID}
if vendorCategoryID != 0 {
sql += " AND a.vendor_category_id = ?"
sqlParams = append(sqlParams, vendorCategoryID)
}
GetRows(db, &results, sql, sqlParams)
return results, err
}

View File

@@ -18,7 +18,8 @@ type StoreDetail struct {
VendorStoreID string `orm:"column(vendor_store_id);size(48)" json:"vendorStoreID"`
VendorStoreName string `json:"vendorStoreName"`
VendorStatus int `json:"vendor_status"` // 取值同Store.Status
VendorStatus int `json:"vendor_status"` // 取值同Store.Status
VendorPayPercentage int `json:"vendorPayPercentage"` //平台结算比例
DeliveryFeeDeductionSill int `json:"deliveryFeeDeductionSill"`
DeliveryFeeDeductionFee int `json:"deliveryFeeDeductionFee"`
SyncStatus int8 `orm:"default(2)" json:"syncStatus"`
@@ -26,6 +27,7 @@ type StoreDetail struct {
PricePercentage int16 `orm:"default(100)" json:"pricePercentage"` // todo 厂商价格相对于本地价格的百分比,这个字段的修改会比较特殊,因为可能需要刷新厂商价格
PricePercentagePackStr string `orm:"size(4096)" json:"-"` //
PricePercentagePackObj model.PricePercentagePack `orm:"-" json:"-"`
CreateDeliveryType int `orm:"default(0)" json:"createDeliveryType"` //默认0系统发单1为门店发单
FreightDeductionPackStr string `orm:"size(4096)" json:"-"` //
FreightDeductionPackObj *model.FreightDeductionPack `orm:"-" json:"-"`
@@ -37,8 +39,9 @@ type StoreDetail struct {
DistrictName string `json:"districtName"`
CityName string `json:"cityName"`
ProvinceName string `json:"provinceName"` //省名
JdCode int `json:"jdCode"`
ProvinceName string `json:"provinceName"` //省名
JdCityCode int `json:"jdCityCode"` //京东市code
JdCode int `json:"jdCode"` //京东区code
JdsCode int `json:"jdsCode"` //京东商城地址代码
JdsStreetCode int `json:"jdsStreetCode"` //京东商城直辖市街道code
JdsStreetName string `json:"jdsStreetName"` //京东商城直辖市街道
@@ -56,6 +59,14 @@ type StoreDetail struct {
YbAppID string `orm:"column(yb_app_id)" json:"ybAppID"`
YbAppKey string `json:"ybAppKey"`
YbStorePrefix string `json:"ybStorePrefix"`
MtwmToken string `json:"mtwmToken"`
EbaiSupplierID string `json:"ebaiSupplierID"`
BrandName string `json:"brandName"` //品牌信息
BrandLogo string `json:"brandLogo"`
BrandIsOpen int `json:"brandIsOpen"`
BrandIsPrint int `json:"brandIsPrint"`
}
// 带快递门店信息的
@@ -95,23 +106,28 @@ func (s *StoreDetail) GetPricePerentage(price int) (pricePercentage int) {
return pricePercentage
}
func getStoreDetail(db *DaoDB, storeID, vendorID int, vendorStoreID string) (storeDetail *StoreDetail, err error) {
func getStoreDetail(db *DaoDB, storeID, vendorID int, vendorStoreID, vendorOrgCode string) (storeDetail *StoreDetail, err error) {
sql := `
SELECT t1.*,
t2.vendor_store_id, t2.status vendor_status, t2.delivery_fee_deduction_sill, t2.delivery_fee_deduction_fee, t2.sync_status, t2.vendor_org_code,
t2.price_percentage, t2.auto_pickup, t2.delivery_type, t2.delivery_competition, t2.is_sync, t2.vendor_store_name, t2.is_order, t2.yb_app_id, t2.yb_app_key, t2.yb_store_prefix,
t2.jds_street_code, t2.jds_street_name, t2.is_supply_goods,
t2.jds_street_code, t2.jds_street_name, t2.is_supply_goods, t2.vendor_pay_percentage, t2.mtwm_token, t2.ebai_supplier_id, t2.create_delivery_type,
t3.value price_percentage_pack_str,
t4.value freight_deduction_pack_str,
province.name province_name,
district.name district_name,
district.jds_code jds_code,
district.jd_code jd_code,
city.jd_code jd_city_code,
city.name city_name,
IF(mm.name <> '', mm.name, mm.user_id2) market_man_name,
IF(om.name <> '', om.name, om.user_id2) operator_name,
IF(om2.name <> '', om2.name, om2.user_id2) operator_name2,
IF(om3.name <> '', om3.name, om3.user_id2) operator_name3
IF(om3.name <> '', om3.name, om3.user_id2) operator_name3,
b.name brand_name,
b.logo brand_logo,
b.is_open brand_is_open,
b.is_print brand_is_print
FROM store t1
LEFT JOIN store_map t2 ON t1.id = t2.store_id AND t2.vendor_id = ? AND t2.deleted_at = ?
LEFT JOIN place city ON city.code = t1.city_code
@@ -123,6 +139,7 @@ func getStoreDetail(db *DaoDB, storeID, vendorID int, vendorStoreID string) (sto
LEFT JOIN user om ON om.mobile <> '' AND om.mobile = t1.operator_phone
LEFT JOIN user om2 ON om2.mobile <> '' AND om2.mobile = t1.operator_phone2
LEFT JOIN user om3 ON om3.mobile <> '' AND om3.mobile = t1.operator_phone3
LEFT JOIN brand b ON b.id = t1.brand_id AND b.deleted_at = ?
WHERE t1.deleted_at = ?
`
sqlParams := []interface{}{
@@ -133,6 +150,7 @@ func getStoreDetail(db *DaoDB, storeID, vendorID int, vendorStoreID string) (sto
model.ConfigTypeFreightPack,
utils.DefaultTimeValue,
utils.DefaultTimeValue,
utils.DefaultTimeValue,
}
// if vendorID != model.VendorIDJX {
// sql += " AND t2.id IS NOT NULL"
@@ -145,6 +163,13 @@ func getStoreDetail(db *DaoDB, storeID, vendorID int, vendorStoreID string) (sto
sql += " AND t2.vendor_store_id = ?"
sqlParams = append(sqlParams, vendorStoreID)
}
if vendorOrgCode != "" {
sql += " AND t2.vendor_org_code = ?"
sqlParams = append(sqlParams, vendorOrgCode)
}
//if vendorID == model.VendorIDJDShop && vendorOrgCode == "" {
// sql += " AND t2.vendor_org_code = 2"
//}
if err = GetRow(db, &storeDetail, sql, sqlParams...); err == nil {
storeDetail.PricePercentagePackObj = PricePercentagePack2Obj(storeDetail.PricePercentagePackStr)
storeDetail.FreightDeductionPackObj = FreightDeductionPack2Obj(storeDetail.FreightDeductionPackStr)
@@ -163,15 +188,15 @@ func getStoreDetail(db *DaoDB, storeID, vendorID int, vendorStoreID string) (sto
return nil, err
}
func GetStoreDetail(db *DaoDB, storeID, vendorID int) (storeDetail *StoreDetail, err error) {
return getStoreDetail(db, storeID, vendorID, "")
func GetStoreDetail(db *DaoDB, storeID, vendorID int, vendorOrgCode string) (storeDetail *StoreDetail, err error) {
return getStoreDetail(db, storeID, vendorID, "", vendorOrgCode)
}
func GetStoreDetailByVendorStoreID(db *DaoDB, vendorStoreID string, vendorID int) (storeDetail *StoreDetail, err error) {
func GetStoreDetailByVendorStoreID(db *DaoDB, vendorStoreID string, vendorID int, vendorOrgCode string) (storeDetail *StoreDetail, err error) {
if vendorID != model.VendorIDJX {
return getStoreDetail(db, 0, vendorID, vendorStoreID)
return getStoreDetail(db, 0, vendorID, vendorStoreID, vendorOrgCode)
}
if storeDetail, err = getStoreDetail(db, int(utils.Str2Int64WithDefault(vendorStoreID, 0)), vendorID, ""); err == nil {
if storeDetail, err = getStoreDetail(db, int(utils.Str2Int64WithDefault(vendorStoreID, 0)), vendorID, "", vendorOrgCode); err == nil {
storeDetail.VendorStoreID = vendorStoreID
}
return storeDetail, err
@@ -236,7 +261,38 @@ func GetStoreCourierList(db *DaoDB, storeIDs, vendorIDs []int, status, auditStat
return nil, err
}
func GetStoresMapList2(db *DaoDB, vendorIDs, storeIDs, storeStatuss []int, status, isSync int, pricePack, name string, mustDirty bool) (storeMapList []*model.StoreMap, err error) {
func GetStoreCourierList2(db *DaoDB, storeIDs, vendorIDs []int, status int, auditStatuss []int) (courierStoreList []*model.StoreCourierMap, err error) {
sql := `
SELECT t1.*
FROM store_courier_map t1
WHERE t1.deleted_at = ?
`
sqlParams := []interface{}{
utils.DefaultTimeValue,
}
if len(storeIDs) > 0 {
sql += " AND t1.store_id IN (" + GenQuestionMarks(len(storeIDs)) + ")"
sqlParams = append(sqlParams, storeIDs)
}
if len(vendorIDs) > 0 {
sql += " AND t1.vendor_id IN (" + GenQuestionMarks(len(vendorIDs)) + ")"
sqlParams = append(sqlParams, vendorIDs)
}
if status != model.StoreStatusAll {
sql += " AND t1.status = ?"
sqlParams = append(sqlParams, status)
}
if len(auditStatuss) > 0 {
sql += " AND t1.audit_status IN (" + GenQuestionMarks(len(auditStatuss)) + ")"
sqlParams = append(sqlParams, auditStatuss)
}
if err = GetRows(db, &courierStoreList, sql, sqlParams...); err == nil {
return courierStoreList, nil
}
return nil, err
}
func GetStoresMapList2(db *DaoDB, vendorIDs, storeIDs, storeStatuss []int, status, isSync int, pricePack, name, vendorOrgCode string, mustDirty bool) (storeMapList []*model.StoreMap, err error) {
sql := `
SELECT t1.*
FROM store_map t1
@@ -275,6 +331,10 @@ func GetStoresMapList2(db *DaoDB, vendorIDs, storeIDs, storeStatuss []int, statu
sql += " AND t2.name LIKE ?"
sqlParams = append(sqlParams, "%"+name+"%")
}
if vendorOrgCode != "" {
sql += " AND t1.vendor_org_code = ?"
sqlParams = append(sqlParams, vendorOrgCode)
}
if mustDirty {
sql += " AND t1.sync_status <> 0"
}
@@ -309,8 +369,8 @@ func SetStoresMapSyncStatus(db *DaoDB, vendorIDs, storeIDs []int, syncStatus int
return err
}
func GetStoresMapList(db *DaoDB, vendorIDs, storeIDs, storeStatuss []int, status, isSync int, pricePack, name string) (storeMapList []*model.StoreMap, err error) {
return GetStoresMapList2(db, vendorIDs, storeIDs, storeStatuss, status, isSync, pricePack, name, false)
func GetStoresMapList(db *DaoDB, vendorIDs, storeIDs, storeStatuss []int, status, isSync int, pricePack, name, vendorOrgCode string) (storeMapList []*model.StoreMap, err error) {
return GetStoresMapList2(db, vendorIDs, storeIDs, storeStatuss, status, isSync, pricePack, name, vendorOrgCode, false)
}
func StoreMapList2Map(storeMapList []*model.StoreMap) (storeMapMap map[int][]*model.StoreMap) {
@@ -345,10 +405,10 @@ func FormalizeStoreStatus(db *DaoDB, storeID, storeStatus int) (err error) {
if err = GetRows(db, &statusList, sql, sqlParams...); err == nil {
if len(statusList) == 1 {
if statusList[0] != model.StoreStatusOpened {
Begin(db)
txDB, _ := Begin(db)
defer func() {
if r := recover(); r != nil || err != nil {
Rollback(db)
Rollback(db, txDB)
if r != nil {
panic(r)
}
@@ -371,7 +431,7 @@ func FormalizeStoreStatus(db *DaoDB, storeID, storeStatus int) (err error) {
}); err != nil {
return err
}
Commit(db)
Commit(db, txDB)
}
}
}
@@ -502,7 +562,7 @@ func GetOpenedStoreCouriersByStoreID(db *DaoDB, storeID, vendorID int) (storeMap
return storeMaps, nil
}
func GetStoreList(db *DaoDB, idList, cityCodes, statuss []int, mobileList []string, shortRoleName string) (storeList []*model.Store, err error) {
func GetStoreList(db *DaoDB, idList, cityCodes, statuss, brandIDs []int, mobileList []string, shortRoleName string) (storeList []*model.Store, err error) {
sql := `
SELECT t1.*
FROM store t1
@@ -522,6 +582,10 @@ func GetStoreList(db *DaoDB, idList, cityCodes, statuss []int, mobileList []stri
sql += " AND t1.status IN (" + GenQuestionMarks(len(statuss)) + ")"
sqlParams = append(sqlParams, statuss)
}
if len(brandIDs) > 0 {
sql += " AND t1.brand_id IN (" + GenQuestionMarks(len(brandIDs)) + ")"
sqlParams = append(sqlParams, brandIDs)
}
if len(mobileList) > 0 {
sql += " AND (t1.tel1 IN (" + GenQuestionMarks(len(mobileList)) + ") OR t1.tel2 IN (" + GenQuestionMarks(len(mobileList)) + "))"
sqlParams = append(sqlParams, mobileList, mobileList)
@@ -648,10 +712,10 @@ func GetStorePriceScore(db *DaoDB, storeIDs, vendorIDs []int, fromScore, toScore
}
sql += " LIMIT ? OFFSET ?"
sqlParams = append(sqlParams, pageSize, offset)
Begin(db)
defer Commit(db)
if err = GetRows(db, &StorePriceScore, sql, sqlParams...); err == nil {
totalCount = GetLastTotalRowCount(db)
txDB, _ := Begin(db)
defer Commit(db, txDB)
if err = GetRowsTx(txDB, &StorePriceScore, sql, sqlParams...); err == nil {
totalCount = GetLastTotalRowCount2(db, txDB)
}
return StorePriceScore, totalCount, err
}
@@ -774,6 +838,7 @@ func GetStoreCategoryMap(db *DaoDB, parentID, level, storeID, categoryID int) (s
sql += " AND a.category_id = ?"
sqlParams = append(sqlParams, categoryID)
}
sql += " ORDER BY a.level, a.store_category_seq"
err = GetRows(db, &storeCatMaps, sql, sqlParams)
if err != nil {
return nil, err
@@ -784,8 +849,8 @@ func GetStoreCategoryMap(db *DaoDB, parentID, level, storeID, categoryID int) (s
func InsertStoreCategories(db *DaoDB, userName string, storeID int) (err error) {
sql := `
INSERT INTO store_category_map
(created_at, updated_at, last_operator, deleted_at, store_id, category_id, store_category_name, store_category_seq)
SELECT ?, ?, ?, ?, ?, id, name, seq
(created_at, updated_at, last_operator, deleted_at, store_id, category_id, store_category_name, store_category_seq, level, parent_id)
SELECT ?, ?, ?, ?, ?, id, name, seq, level, parent_id
FROM sku_category
WHERE deleted_at = ?
AND is_exd_spec = ?
@@ -814,6 +879,17 @@ func DeleteStoreCategroies(db *DaoDB, userName string, storeID int) (err error)
return err
}
func DeleteStoreCategroies2(db *DaoDB, storeID int) (err error) {
sql := `
DELETE FROM store_category_map WHERE store_id = ?
`
sqlParams := []interface{}{
storeID,
}
_, err = ExecuteSQL(db, sql, sqlParams)
return err
}
func GetStorePushClient(db *DaoDB, storeID int, cID string) (storePushClient []*model.StorePushClient, err error) {
sql := `
SELECT *
@@ -877,8 +953,8 @@ func GetStoreAuditPage(db *DaoDB, statuss []int, keyword string, applyTimeStart,
sql := `
SELECT SQL_CALC_FOUND_ROWS DISTINCT a.*, b.name user_name, c.name city_name
FROM store_audit a
JOIN user b ON b.user_id = a.user_id
JOIN place c ON c.code = a.city_code
LEFT JOIN user b ON b.user_id = a.user_id
LEFT JOIN place c ON c.code = a.city_code
WHERE a.deleted_at = ?
`
sqlParams := []interface{}{
@@ -903,13 +979,350 @@ func GetStoreAuditPage(db *DaoDB, statuss []int, keyword string, applyTimeStart,
sql += " ORDER BY a.updated_at LIMIT ? OFFSET ?"
pageSize = jxutils.FormalizePageSize(pageSize)
sqlParams = append(sqlParams, pageSize, offset)
Begin(db)
defer Commit(db)
if err = GetRows(db, &requestList, sql, sqlParams...); err == nil {
txDB, _ := Begin(db)
defer Commit(db, txDB)
if err = GetRowsTx(txDB, &requestList, sql, sqlParams...); err == nil {
return &model.PagedInfo{
TotalCount: GetLastTotalRowCount(db),
TotalCount: GetLastTotalRowCount2(db, txDB),
Data: requestList,
}, nil
}
return pagedInfo, err
}
func GetBrands(db *DaoDB, name string, brandID int) (brands []*model.Brand, err error) {
sql := `
SELECT *
FROM brand
WHERE deleted_at = ?
`
sqlParams := []interface{}{
utils.DefaultTimeValue,
}
if name != "" {
sql += " AND name LIKE ?"
sqlParams = append(sqlParams, "%"+name+"%")
}
if brandID != 0 {
sql += " AND id = ?"
sqlParams = append(sqlParams, brandID)
}
err = GetRows(db, &brands, sql, sqlParams)
return brands, err
}
func GetStoreAcctIncome(db *DaoDB, storeID int, incomeTypes []int, vendorOrderID string, fromTime, toTime time.Time) (storeAcctIncomes []*model.StoreAcctIncome, err error) {
sql := `
SELECT *
FROM store_acct_income
WHERE 1 = 1
`
sqlParams := []interface{}{}
if storeID != 0 {
sql += " AND store_id = ?"
sqlParams = append(sqlParams, storeID)
}
if len(incomeTypes) > 0 {
sql += " AND type IN (" + GenQuestionMarks(len(incomeTypes)) + ")"
sqlParams = append(sqlParams, incomeTypes)
}
if vendorOrderID != "" {
sql += " AND vendor_order_id = ?"
sqlParams = append(sqlParams, vendorOrderID)
}
if !utils.IsTimeZero(fromTime) {
sql += " AND created_at >= ?"
sqlParams = append(sqlParams, fromTime)
}
if !utils.IsTimeZero(toTime) {
sql += " AND created_at <= ?"
sqlParams = append(sqlParams, toTime)
}
err = GetRows(db, &storeAcctIncomes, sql, sqlParams)
return storeAcctIncomes, err
}
func GetStoreAcctIncomeTotal(db *DaoDB, storeID int, incomeTypes []int, vendorOrderID string, fromTime, toTime time.Time) (incomeTotal int, err error) {
var income *model.StoreAcctIncome
sql := `
SELECT SUM(income_price) income_price
FROM store_acct_income
WHERE 1 = 1
`
sqlParams := []interface{}{}
if storeID != 0 {
sql += " AND store_id = ?"
sqlParams = append(sqlParams, storeID)
}
if len(incomeTypes) > 0 {
sql += " AND type IN (" + GenQuestionMarks(len(incomeTypes)) + ")"
sqlParams = append(sqlParams, incomeTypes)
}
if vendorOrderID != "" {
sql += " AND vendor_order_id = ?"
sqlParams = append(sqlParams, vendorOrderID)
}
if !utils.IsTimeZero(fromTime) {
sql += " AND created_at >= ?"
sqlParams = append(sqlParams, fromTime)
}
if !utils.IsTimeZero(toTime) {
sql += " AND created_at <= ?"
sqlParams = append(sqlParams, toTime)
}
if err = GetRow(db, &income, sql, sqlParams); err == nil && income != nil {
return income.IncomePrice, err
}
return 0, err
}
func GetStoreAcctExpend(db *DaoDB, storeID int, expendTypes []int, vendorOrderID string, fromTime, toTime time.Time) (storeAcctExpends []*model.StoreAcctExpend, err error) {
sql := `
SELECT *
FROM store_acct_expend
WHERE 1 = 1
`
sqlParams := []interface{}{}
if storeID != 0 {
sql += " AND store_id = ?"
sqlParams = append(sqlParams, storeID)
}
if len(expendTypes) > 0 {
sql += " AND type IN (" + GenQuestionMarks(len(expendTypes)) + ")"
sqlParams = append(sqlParams, expendTypes)
}
if vendorOrderID != "" {
sql += " AND vendor_order_id = ?"
sqlParams = append(sqlParams, vendorOrderID)
}
if !utils.IsTimeZero(fromTime) {
sql += " AND created_at >= ?"
sqlParams = append(sqlParams, fromTime)
}
if !utils.IsTimeZero(toTime) {
sql += " AND created_at <= ?"
sqlParams = append(sqlParams, toTime)
}
err = GetRows(db, &storeAcctExpends, sql, sqlParams)
return storeAcctExpends, err
}
func GetStoreAcctExpendTotal(db *DaoDB, storeID int, expendTypes []int, vendorOrderID string, fromTime, toTime time.Time) (expendTotal int, err error) {
var expend *model.StoreAcctExpend
sql := `
SELECT SUM(expend_price) expend_price
FROM store_acct_expend
WHERE 1 = 1
`
sqlParams := []interface{}{}
if storeID != 0 {
sql += " AND store_id = ?"
sqlParams = append(sqlParams, storeID)
}
if len(expendTypes) > 0 {
sql += " AND type IN (" + GenQuestionMarks(len(expendTypes)) + ")"
sqlParams = append(sqlParams, expendTypes)
}
if vendorOrderID != "" {
sql += " AND vendor_order_id = ?"
sqlParams = append(sqlParams, vendorOrderID)
}
if !utils.IsTimeZero(fromTime) {
sql += " AND created_at >= ?"
sqlParams = append(sqlParams, fromTime)
}
if !utils.IsTimeZero(toTime) {
sql += " AND created_at <= ?"
sqlParams = append(sqlParams, toTime)
}
if err = GetRow(db, &expend, sql, sqlParams); err == nil && expend != nil {
return expend.ExpendPrice, err
}
return 0, err
}
type GetStoreAcctExpendLastCreateWayBillFeeResult struct {
ID int `orm:"column(id)" json:"id"`
ExpID int `orm:"column(exp_id)" json:"expID"` //少扣的钱
IncID int `orm:"column(inc_id)" json:"incID"` //多扣的钱
ExpendPrice int `json:"expendPrice"`
MulitExpendPrice int `json:"mulitExpendPrice"`
MulitIncomePrice int `json:"mulitIncomePrice"`
}
func GetStoreAcctExpendLastCreateWayBillFee(db *DaoDB, vendorOrderID string) (expend *GetStoreAcctExpendLastCreateWayBillFeeResult, lastFee int, err error) {
sql := `
SELECT a.id, b.id exp_id, c.id inc_id,
a.expend_price, b.expend_price mulit_expend_price, c.income_price mulit_income_price
FROM store_acct_expend a
LEFT JOIN store_acct_expend b ON a.id = b.exp_id
LEFT JOIN store_acct_income c ON a.id = c.exp_id
WHERE 1 = 1
AND a.type = ?
`
sqlParams := []interface{}{
20,
}
if vendorOrderID != "" {
sql += " AND vendor_order_id = ?"
sqlParams = append(sqlParams, vendorOrderID)
}
sql += `
ORDER BY a.created_at DESC
LIMIT 1
`
if err = GetRow(db, &expend, sql, sqlParams); err == nil && expend != nil {
lastFee = expend.ExpendPrice
if expend.ExpID != 0 {
lastFee += expend.MulitExpendPrice
}
if expend.IncID != 0 {
lastFee -= expend.MulitIncomePrice
}
}
return expend, lastFee, err
}
type GetStoreManageStateResult struct {
StoreName string `json:"storeName"`
VendorStoreID string `orm:"column(vendor_store_id)" json:"vendorStoreID"`
MarketScale int `json:"marketScale"` //市场规模
Comment string `json:"comment"`
model.StoreManageState
}
func GetStoreManageState(db *DaoDB, storeIDs, brandIDs []int, vendorID, sortType, offset, pageSize int) (pagedInfo *model.PagedInfo, err error) {
var (
requestList []*GetStoreManageStateResult
GetStoreManageStateSortTypeMap = map[int]string{
1: "a.cover_area",
2: "c.market_scale",
3: "a.open_time",
4: "a.sku_count",
5: "a.high_sku_count",
6: "a.act_ample",
7: "a.null_order_count",
8: "a.refuse_order_count",
9: "a.store_score",
}
)
sql := `
SELECT SQL_CALC_FOUND_ROWS DISTINCT a.*, b.name store_name, c.vendor_store_id, c.market_scale, b.comment
FROM store_manage_state a
LEFT JOIN store b ON b.id = a.store_id AND b.deleted_at = ?
LEFT JOIN store_map c ON c.store_id = a.store_id AND c.vendor_id = a.vendor_id AND c.deleted_at = ?
WHERE a.vendor_status <> ?
`
sqlParams := []interface{}{
utils.DefaultTimeValue, utils.DefaultTimeValue,
model.StoreStatusDisabled,
}
if len(storeIDs) > 0 {
sql += " AND a.store_id IN (" + GenQuestionMarks(len(storeIDs)) + ")"
sqlParams = append(sqlParams, storeIDs)
}
if len(brandIDs) > 0 {
sql += " AND b.brand_id IN (" + GenQuestionMarks(len(brandIDs)) + ")"
sqlParams = append(sqlParams, brandIDs)
}
if vendorID != -1 {
sql += " AND a.vendor_id = ?"
sqlParams = append(sqlParams, vendorID)
}
if sortType != 0 {
tempSortType := 0
if sortType < 0 {
tempSortType = -sortType
} else {
tempSortType = sortType
}
if GetStoreManageStateSortTypeMap[tempSortType] != "" {
sql += " ORDER BY " + GetStoreManageStateSortTypeMap[tempSortType]
if sortType < 0 {
sql += " DESC"
}
}
}
sql += " LIMIT ? OFFSET ?"
pageSize = jxutils.FormalizePageSize(pageSize)
sqlParams = append(sqlParams, pageSize, offset)
txDB, _ := Begin(db)
defer Commit(db, txDB)
if err = GetRowsTx(txDB, &requestList, sql, sqlParams...); err == nil {
return &model.PagedInfo{
TotalCount: GetLastTotalRowCount2(db, txDB),
Data: requestList,
}, nil
}
return pagedInfo, err
}
func GetStoreManageStateSimple(db *DaoDB, storeIDs, brandIDs []int, vendorID int) (pagedInfo []*model.StoreManageState, err error) {
sql := `
SELECT a.*
FROM store_manage_state a
LEFT JOIN store b ON b.id = a.store_id AND b.deleted_at = ?
`
sqlParams := []interface{}{
utils.DefaultTimeValue,
}
if len(storeIDs) > 0 {
sql += " AND a.store_id IN (" + GenQuestionMarks(len(storeIDs)) + ")"
sqlParams = append(sqlParams, storeIDs)
}
if len(brandIDs) > 0 {
sql += " AND b.brand_id IN (" + GenQuestionMarks(len(brandIDs)) + ")"
sqlParams = append(sqlParams, brandIDs)
}
if vendorID != -1 {
sql += " AND a.vendor_id = ?"
sqlParams = append(sqlParams, vendorID)
}
err = GetRows(db, &pagedInfo, sql, sqlParams...)
return pagedInfo, err
}
func GetStoreMapAudit(db *DaoDB, storeIDs, vendorIDs, auditStatuss []int, fromTime, toTime time.Time, offset, pageSize int) (page *model.PagedInfo, err error) {
var (
storeMapAudits []*model.StoreMapAudit
)
sql := `
SELECT SQL_CALC_FOUND_ROWS *
FROM store_map_audit
WHERE 1 = 1
`
sqlParams := []interface{}{}
if len(storeIDs) > 0 {
sql += " AND store_id IN (" + GenQuestionMarks(len(storeIDs)) + ")"
sqlParams = append(sqlParams, storeIDs)
}
if len(vendorIDs) > 0 {
sql += " AND vendor_id IN (" + GenQuestionMarks(len(vendorIDs)) + ")"
sqlParams = append(sqlParams, vendorIDs)
}
if len(auditStatuss) > 0 {
sql += " AND audit_status IN (" + GenQuestionMarks(len(auditStatuss)) + ")"
sqlParams = append(sqlParams, auditStatuss)
}
if fromTime != utils.ZeroTimeValue {
sql += " AND a.created_at > ?"
sqlParams = append(sqlParams, fromTime)
}
if toTime != utils.ZeroTimeValue {
sql += " AND a.created_at < ?"
sqlParams = append(sqlParams, toTime)
}
sql += " LIMIT ? OFFSET ?"
pageSize = jxutils.FormalizePageSize(pageSize)
offset = jxutils.FormalizePageOffset(offset)
sqlParams = append(sqlParams, pageSize, offset)
txDB, _ := Begin(db)
defer Commit(db, txDB)
if err = GetRowsTx(txDB, &storeMapAudits, sql, sqlParams...); err == nil {
page = &model.PagedInfo{
TotalCount: GetLastTotalRowCount2(db, txDB),
Data: storeMapAudits,
}
}
return page, err
}

View File

@@ -47,6 +47,12 @@ type SkuStoreCatInfo struct {
StoreCatSeq int
StoreParentCatName string
IsSysCat int
CityCode int
IsJxCat int
VendorCategoryName string
VendorCategorySeq int
VendorCategoryID int `orm:"column(vendor_category_id)"`
}
type StoreSkuSyncInfo struct {
@@ -75,6 +81,8 @@ type StoreSkuSyncInfo struct {
model.Sku
ExdSkuID string `orm:"column(exd_sku_id)"`
ExdCategoryThirdID int `orm:"column(exd_category_third_id)"`
BrandID int `orm:"column(brand_id)"`
ExBrandID int `orm:"column(ex_brand_id)"`
StoreName string
// sku_name
@@ -101,6 +109,8 @@ type StoreSkuSyncInfo struct {
Img string
Img2 string
Img3 string
Img4 string
Img5 string
DescImg string
ImgWatermark string `json:"imgWatermark"` //图片水印
ImgMix string //合成水印后的图片
@@ -126,10 +136,11 @@ type StoreSkuSyncInfo struct {
StatusSaleBegin int16 `json:"statusSaleBegin"` //商品可售时间范围
StatusSaleEnd int16 `json:"statusSaleEnd"`
VendorActID string `orm:"column(vendor_act_id);size(48)" json:"vendorActID"`
ActPercentage int `json:"actPercentage"` // 直降活动百分比
ActSyncStatus int8 `orm:"default(2)" json:"actSyncStatus"`
VendorActPrice int64 `json:"vendorActPrice"` // 保存数据用,实际的活动价
VendorActID string `orm:"column(vendor_act_id);size(48)" json:"vendorActID"`
ActPercentage int `json:"actPercentage"` // 直降活动百分比
ActSyncStatus int8 `orm:"default(2)" json:"actSyncStatus"`
VendorActPrice int64 `json:"vendorActPrice"` // 保存数据用,实际的活动价
MtLadderBoxPrice int `json:"mtLadderBoxPrice"` //美团门店商品的包装费
IsDeletedBySku bool `json:"isDeletedBySku"` //京东商城用同步下架的商品库里的sku时要做区分来决定调的api
}
@@ -163,7 +174,7 @@ type StoreSkuNameExt struct {
StoreName string `json:"storeName"`
SkuID int `orm:"column(sku_id)" json:"skuID"`
model.SkuName
PayPercentage int `json:"-"`
PayPercentage int `json:"payPercentage"`
UnitPrice int `json:"unitPrice"`
Skus []*StoreSkuExt `orm:"-" json:"skus,omitempty"`
SkusStr string `json:"-"`
@@ -176,12 +187,47 @@ type StoreSkuNameExt struct {
AuditUnitPrice int `json:"auditUnitPrice"` //审核价格
}
type StoreSkuNameExt2 struct {
ID int `orm:"column(id)" json:"id"`
Prefix string `orm:"size(255)" json:"prefix"`
Name string `orm:"size(255)" json:"name"`
CategoryID int `orm:"column(category_id);index" json:"categoryID"` // 标准类别
Unit string `orm:"size(8)" json:"unit"`
SpecQuality float32 `json:"-"` // 为份必然为500这个主要作用只是用于确保SkuName的唯一性
SpecUnit string `orm:"size(8)" json:"-"` // 为份必然为克这个主要作用只是用于确保SkuName的唯一性
Price int `json:"price"` // 单位为分标准价不为份的就为实际标准价为份的为每市斤价实际还要乘质量。todo 为份的确定必须有质量
Img string `orm:"size(512)" json:"img"`
Status int `orm:"default(1)" json:"status"` // skuname状态取值同sku.Status
YbNameSuffix string `json:"ybNameSuffix"` //银豹商品后缀
StoreID int `orm:"column(store_id)" json:"storeID"`
StoreName string `json:"storeName"`
SkuID int `orm:"column(sku_id)" json:"skuID"`
PayPercentage int `json:"-"`
UnitPrice int `json:"unitPrice"`
Skus []*StoreSkuExt `orm:"-" json:"skus,omitempty"`
SkusStr string `json:"-"`
PendingUnitPrice int `json:"pendingUnitPrice"` // 这个是待审核的价格申请
RealMidUnitPrice int `json:"realMidUnitPrice"`
Count int `json:"count"`
AuditUnitPrice int `json:"auditUnitPrice"` //审核价格
}
// GetStoreSkus用
type StoreSkuNamesInfo struct {
TotalCount int `json:"totalCount"`
SkuNames []*StoreSkuNameExt `json:"skuNames"`
}
type StoreSkuNamesInfo2 struct {
TotalCount int `json:"totalCount"`
SkuNames []*StoreSkuNameExt2 `json:"skuNames"`
}
type StoreSkuVendorInfo struct {
VendorID int `orm:"column(vendor_id)" json:"vendorID"`
@@ -271,9 +317,10 @@ type StoreSkuExt struct {
EarningPrice int `json:"earningPrice"`
EarningActID int `orm:"column(earning_act_id)" json:"earningActID"`
EclpID string `orm:"column(eclp_id)" json:"eclpID"`
TrendType int `json:"trendType"`
TrendPrice int `json:"trendPrice"`
EclpID string `orm:"column(eclp_id)" json:"eclpID"`
TrendType int `json:"trendType"`
TrendPrice int `json:"trendPrice"`
MtLadderBoxPrice int `json:"mtLadderBoxPrice"`
}
type SkuNameAndPlace struct {
@@ -298,6 +345,7 @@ type StoreSkuPriceAndWeight struct {
Comment string
SpecQuality float32
SpecUnit string
Upc string
}
type StoreSkuAndName struct {
@@ -372,14 +420,14 @@ func GetStoreCategories(db *DaoDB, vendorID, storeID int, skuIDs []int, level in
t4p.name parent_cat_name,
tsp.store_category_name store_parent_cat_name,
t5p.id parent_map_id, t5p.%s_id parent_vendor_cat_id, t5p.%s_sync_status parent_cat_sync_status,
t1.is_sys_cat
t1.is_sys_cat, t1.vendor_org_code,
t6.city_code
FROM store_sku_category_map t5
JOIN sku_category t4 ON t5.category_id = t4.id AND t4.deleted_at = ?
JOIN sku_category t4 ON t5.category_id = t4.id
LEFT JOIN store_category_map ts ON ts.store_id = t5.store_id AND ts.category_id = t4.id AND ts.deleted_at = ?
`
sqlParams := []interface{}{
utils.DefaultTimeValue,
utils.DefaultTimeValue,
}
fieldPrefixParams := []interface{}{fieldPrefix, fieldPrefix, fieldPrefix, fieldPrefix}
if len(skuIDs) > 0 {
@@ -397,10 +445,11 @@ func GetStoreCategories(db *DaoDB, vendorID, storeID int, skuIDs []int, level in
sql += `
LEFT JOIN sku_category t4p ON t4.parent_id = t4p.id
LEFT JOIN store_category_map tsp ON tsp.store_id = t5.store_id AND tsp.category_id = t4p.id AND tsp.deleted_at = ?
LEFT JOIN store_sku_category_map t5p ON t4p.id = t5p.category_id AND t5.store_id = t5p.store_id AND t5p.deleted_at = ?
LEFT JOIN store_sku_category_map t5p ON t4p.id = t5p.category_id AND t5.store_id = t5p.store_id
LEFT JOIN store_map t1 ON t1.store_id = t5.store_id AND t1.vendor_id = ?
WHERE t5.store_id = ? AND t5.deleted_at = ? AND t4.is_sync <> ?`
sqlParams = append(sqlParams, utils.DefaultTimeValue, utils.DefaultTimeValue, vendorID, storeID, utils.DefaultTimeValue, model.YES)
LEFT JOIN store t6 ON t6.id = t5.store_id
WHERE t5.store_id = ? AND t5.deleted_at = ? AND t4.is_sync <> ?`
sqlParams = append(sqlParams, utils.DefaultTimeValue, vendorID, storeID, utils.DefaultTimeValue, model.YES)
if mustDirty {
sql += " AND t5.%s_sync_status <> 0"
fieldPrefixParams = append(fieldPrefixParams, fieldPrefix)
@@ -436,18 +485,21 @@ func GetStoreSkus2(db *DaoDB, vendorID, storeID int, skuIDs []int, mustDirty boo
t14.vendor_id, t14.vendor_org_code,
t1.id bind_id, t1.sku_id, t1.price, t1.unit_price, t1.status store_sku_status,
%s vendor_sku_id, t1.%s_sync_status sku_sync_status, t1.%s_price vendor_price, t1.%s_lock_time lock_time,
t1.store_id, t1.deleted_at bind_deleted_at,t1.status_sale_begin,t1.status_sale_end, t1.jds_ware_id, t1.stock,
t1.store_id, t1.deleted_at bind_deleted_at,t1.status_sale_begin,t1.status_sale_end, t1.jds_ware_id, t1.stock, t1.mt_ladder_box_price,
t2.*,
t3.id name_id, t3.prefix, t3.name, t3.unit, t3.upc, t3.status name_status, t3.category_id name_category_id, t3.yb_name_suffix,
t3.jds_stock_switch, t3.preparation_time, t3.img_watermark, t3.ex_vendor_id, t3.img img_origin,
IF(t11.%s <> '', t11.%s, t3.img) img,
IF(t12.%s <> '', t12.%s, t3.img2) img2,
IF(t15.%s <> '', t15.%s, t3.img3) img3,
IF(t20.%s <> '', t20.%s, t3.img4) img4,
IF(t21.%s <> '', t21.%s, t3.img5) img5,
IF(t13.%s <> '', t13.%s, t3.desc_img) desc_img,
t4.%s_category_id vendor_vendor_cat_id,
t4.name category_name,
ts.name store_name,
tsu.ex_prefix, tsu.begin_at ex_prefix_begin, tsu.end_at ex_prefix_end, tsu.img_watermark,
ts.brand_id,
tsu.ex_prefix, tsu.begin_at ex_prefix_begin, tsu.end_at ex_prefix_end, tsu.img_watermark, tsu.img_watermark_mix img_mix, tsu.brand_id ex_brand_id,
tsu1.vendor_category_id sku_vendor_map_cat_id`
fmtParams := []interface{}{
skuVendorIDField, fieldPrefix, fieldPrefix, fieldPrefix,
@@ -455,6 +507,8 @@ func GetStoreSkus2(db *DaoDB, vendorID, storeID int, skuIDs []int, mustDirty boo
GetDataResFieldName(vendorID), GetDataResFieldName(vendorID),
GetDataResFieldName(vendorID), GetDataResFieldName(vendorID),
GetDataResFieldName(vendorID), GetDataResFieldName(vendorID),
GetDataResFieldName(vendorID), GetDataResFieldName(vendorID),
GetDataResFieldName(vendorID), GetDataResFieldName(vendorID),
fieldPrefix,
}
if isSingleStorePF {
@@ -481,6 +535,8 @@ func GetStoreSkus2(db *DaoDB, vendorID, storeID int, skuIDs []int, mustDirty boo
LEFT JOIN data_resource t11 ON t11.main_url = t3.img
LEFT JOIN data_resource t12 ON t12.main_url = t3.img2
LEFT JOIN data_resource t15 ON t15.main_url = t3.img3
LEFT JOIN data_resource t20 ON t20.main_url = t3.img4
LEFT JOIN data_resource t21 ON t21.main_url = t3.img5
LEFT JOIN data_resource t13 ON t13.main_url = t3.desc_img
LEFT JOIN sku_exinfo_map tsu ON tsu.name_id = t3.id AND tsu.deleted_at = ? AND tsu.vendor_id = t14.vendor_id
LEFT JOIN sku_vendor_category_map tsu1 ON tsu1.name_id = t3.id AND tsu1.deleted_at = ? AND tsu1.vendor_id = t14.vendor_id
@@ -610,8 +666,6 @@ func GetFullStoreSkus(db *DaoDB, vendorID, storeID int) (skus []*StoreSkuSyncInf
GetDataResFieldName(vendorID), GetDataResFieldName(vendorID),
GetDataResFieldName(vendorID), GetDataResFieldName(vendorID),
fieldPrefix)
// globals.SugarLogger.Debug(sql)
// globals.SugarLogger.Debug(utils.Format4Output(sqlParams, false))
if err = GetRows(db, &skus, sql, sqlParams...); err != nil {
return nil, err
}
@@ -635,7 +689,7 @@ func GetStoreSkuPriceAndWeight(db *DaoDB, vendorStoreID string, vendorID int, ve
}
sql := fmt.Sprintf(`
SELECT %s vendor_sku_id, t1.id sku_id, t2.price, t1.weight,
t5.prefix, t5.name, t1.comment, t5.unit, t1.spec_quality, t1.spec_unit
t5.prefix, t5.name, t1.comment, t5.unit, t1.spec_quality, t1.spec_unit, t5.upc
FROM sku t1
JOIN store_sku_bind t2 ON t2.sku_id = t1.id AND t2.deleted_at = ?
JOIN store_map t3 ON t3.store_id = t2.store_id AND t3.vendor_id = ? AND t3.vendor_store_id = ? AND t3.deleted_at = ?
@@ -918,7 +972,8 @@ func UpdateStoreSkuBindSyncStatusForSaleStatus(db *DaoDB, vendorIDs []int, store
if len(vendorIDs) > 0 {
for _, v := range vendorIDs {
fieldPrefix := ConvertDBFieldPrefix(model.VendorNames[v])
sql += ` %s_sync_status = ?,`
sql += ` %s_sync_status = %s_sync_status | ?,`
fmtParams = append(fmtParams, fieldPrefix)
fmtParams = append(fmtParams, fieldPrefix)
sqlParams = append(sqlParams, model.SyncFlagSaleMask)
}
@@ -1210,6 +1265,7 @@ func GetTopCategoriesByStoreIDs(db *DaoDB, storeIDs []int, limit int) (skuCatego
func GetStoreSkuCategories(db *DaoDB, storeID, parentID int) (catList []*model.SkuCategory, err error) {
sql := `
SELECT * FROM(
SELECT
t1.*
FROM sku_category t1
@@ -1232,19 +1288,35 @@ func GetStoreSkuCategories(db *DaoDB, storeID, parentID int) (catList []*model.S
sql += " AND t1.parent_id = ?"
sqlParams = append(sqlParams, parentID)
}
sql += " ORDER BY t1.level, t1.seq"
if err = GetRows(db, &catList, sql, sqlParams...); err == nil && len(catList) > 0 {
parentIDMap := make(map[int]int)
for _, v := range catList {
parentIDMap[v.ParentID] = 1
}
paretnCats, err2 := GetCategories(db, -1, 0, jxutils.IntMap2List(parentIDMap), false)
if err = err2; err == nil {
catList = append(catList, paretnCats...)
} else {
catList = nil
}
sql += ` UNION
SELECT
DISTINCT
t3.*
FROM sku_category t1
JOIN
(
SELECT DISTINCT t3.category_id
FROM store_sku_bind t1
JOIN sku t2 ON t2.id = t1.sku_id AND t2.deleted_at = ? AND t2.status = ?
JOIN sku_name t3 ON t3.id = t2.name_id AND t3.deleted_at = ? AND t3.status = ?
WHERE t1.deleted_at = ? AND t1.status = ? AND t1.store_id = ?
) t2 ON t2.category_id = t1.id
JOIN sku_category t3 ON t3.id = t1.parent_id AND t3.deleted_at = ?
WHERE t1.deleted_at = ?
`
sqlParams = append(sqlParams, utils.DefaultTimeValue, model.SkuStatusNormal,
utils.DefaultTimeValue, model.SkuStatusNormal,
utils.DefaultTimeValue, model.SkuStatusNormal, storeID,
utils.DefaultTimeValue, utils.DefaultTimeValue,
)
if parentID >= 0 {
sql += " AND t1.parent_id = ?"
sqlParams = append(sqlParams, parentID)
}
sql += `
) a
ORDER BY a.level, a.seq`
err = GetRows(db, &catList, sql, sqlParams...)
return catList, err
}
@@ -1342,7 +1414,7 @@ func UpdateActPrice4StoreSkuNameNew(db *DaoDB, storeIDs, skuIDs []int, skuNamesI
vendorIDs = []int{actVendorID}
}
} else {
storeMapList, err := GetStoresMapList(db, nil, storeIDs, nil, model.StoreStatusAll, model.StoreIsSyncAll, "", "")
storeMapList, err := GetStoresMapList(db, nil, storeIDs, nil, model.StoreStatusAll, model.StoreIsSyncAll, "", "", "")
if err != nil {
return err
}
@@ -1364,7 +1436,24 @@ func UpdateActPrice4StoreSkuNameNew(db *DaoDB, storeIDs, skuIDs []int, skuNamesI
}
actStoreSkuMap4Act := jxutils.NewActStoreSkuMap(actStoreSkuList, true)
actStoreSkuMap4EarningPrice := jxutils.NewActStoreSkuMap(actStoreSkuList, false)
mtactList, _ := GetActMtwmVendors(db, storeIDs, skuIDs)
mtactMap := make(map[int]map[int]*model.ActMtwmVendor)
for _, v := range mtactList {
if mtactMap[v.StoreID] == nil {
mtactSkuMap := make(map[int]*model.ActMtwmVendor)
mtactMap[v.StoreID] = mtactSkuMap
}
mtactMap[v.StoreID][v.SkuID] = v
}
ebaiactList, _ := GetActEbaiVendorSkus(db, storeIDs, skuIDs)
ebaiactMap := make(map[int]map[int]*model.ActEbaiVendorSku)
for _, v := range ebaiactList {
if ebaiactMap[v.StoreID] == nil {
ebaiactskuMap := make(map[int]*model.ActEbaiVendorSku)
ebaiactMap[v.StoreID] = ebaiactskuMap
}
ebaiactMap[v.StoreID][v.SkuID] = v
}
for _, skuName := range skuNamesInfo.SkuNames {
if len(skuName.Skus) > 0 {
for _, v := range skuName.Skus {
@@ -1389,6 +1478,30 @@ func UpdateActPrice4StoreSkuNameNew(db *DaoDB, storeIDs, skuIDs []int, skuNamesI
}
}
if (actVendorID == -1 || actVendorID == model.VendorIDMTWM) && v.ActPrice == 0 {
if mtactMap != nil {
mtact := mtactMap[skuName.StoreID][v.SkuID]
if mtact != nil {
v.ActPrice = int(jxutils.StandardPrice2Int(mtact.ActPrice))
v.ActType = mtact.ActType
v.ActID = int(utils.Str2Int64(mtact.ItemID) % 1000)
v.EarningPrice = 0
}
}
}
if (actVendorID == -1 || actVendorID == model.VendorIDEBAI) && v.ActPrice == 0 {
if ebaiactMap != nil {
ebaiact := ebaiactMap[skuName.StoreID][v.SkuID]
if ebaiact != nil {
v.ActPrice = int(jxutils.StandardPrice2Int(ebaiact.ActPrice))
v.ActType = model.ActSkuDirectDown
v.ActID = int(utils.Str2Int64(ebaiact.ActID) % 1000)
v.EarningPrice = 0
}
}
}
if globals.IsStoreSkuAct {
v.VendorInfoMap = make(map[int]*StoreSkuVendorInfo)
for _, storeMap := range storeMapMap[skuName.StoreID] {
@@ -1659,7 +1772,7 @@ func GetStoreSkuAudit(db *DaoDB, storeIDs, nameIDs, skuIDs, statuss, types []int
sqlParams = append(sqlParams, types)
}
if keyword != "" {
sql += " AND (b.name LIKE ? OR a.remark LIKE ? OR a.name_id LIKE ? OR a.user_id LIKE ? OR a.store_id LIKE ? OR f.name LIKE ?)"
sql += " AND (b.name LIKE ? OR a.remark LIKE ? OR a.name_id LIKE ? OR c.name LIKE ? OR d.name LIKE ? OR f.name LIKE ?)"
sqlParams = append(sqlParams, "%"+keyword+"%", "%"+keyword+"%", "%"+keyword+"%", "%"+keyword+"%", "%"+keyword+"%", "%"+keyword+"%")
}
if marketManPhone != "" {
@@ -1673,11 +1786,11 @@ func GetStoreSkuAudit(db *DaoDB, storeIDs, nameIDs, skuIDs, statuss, types []int
sql += " ORDER BY a.updated_at LIMIT ? OFFSET ?"
pageSize = jxutils.FormalizePageSize(pageSize)
sqlParams = append(sqlParams, pageSize, offset)
Begin(db)
defer Commit(db)
if err = GetRows(db, &requestList, sql, sqlParams...); err == nil {
txDB, _ := Begin(db)
defer Commit(db, txDB)
if err = GetRowsTx(txDB, &requestList, sql, sqlParams...); err == nil {
return &model.PagedInfo{
TotalCount: GetLastTotalRowCount(db),
TotalCount: GetLastTotalRowCount2(db, txDB),
Data: requestList,
}, nil
}
@@ -1745,3 +1858,68 @@ func GetStoreSkuHistory(db *DaoDB, storeIDs, skuIDs []int, status int, snapShot
err = GetRows(db, &storeSkuHistory, sql, sqlParams...)
return storeSkuHistory, err
}
func GetStoreSkuCategoryMap(db *DaoDB, categoryID, storeID int) (storeSkuCategoryMap *model.StoreSkuCategoryMap, err error) {
sql := `
SELECT *
FROM store_sku_category_map
WHERE deleted_at = ?
`
sqlParams := []interface{}{utils.DefaultTimeValue}
if categoryID != 0 {
sql += " AND category_id = ? "
sqlParams = append(sqlParams, categoryID)
}
if storeID != 0 {
sql += " AND store_id = ? "
sqlParams = append(sqlParams, storeID)
}
GetRow(db, &storeSkuCategoryMap, sql, sqlParams)
return storeSkuCategoryMap, err
}
func GetStoreSkuListWithVendor(db *DaoDB, storeID, vendorID int, vendorOrgCode string) (skuList []*StoreSkuSyncInfo, err error) {
sql := `
SELECT DISTINCT b.*, c.vendor_thing_id vendor_sku_id
FROM store_sku_bind a
JOIN sku b ON a.sku_id = b.id AND b.deleted_at = ? AND b.status = ?
LEFT JOIN thing_map c ON c.thing_id = b.id AND c.thing_type = ? AND c.vendor_id = ? AND c.vendor_org_code = ? AND c.deleted_at = ?
WHERE a.deleted_at = ? AND a.status = ? AND a.store_id = ?
`
sqlParams := []interface{}{
utils.DefaultTimeValue, model.SkuStatusNormal,
model.ThingTypeSku, vendorID, vendorOrgCode, utils.DefaultTimeValue,
utils.DefaultTimeValue, model.StoreSkuBindStatusNormal, storeID,
}
err = GetRows(db, &skuList, sql, sqlParams)
return skuList, err
}
type GetStoresSkusForManageStateResult struct {
SkuID int `orm:"column(sku_id)"`
UnitPrice int
MidUnitPrice int
}
func GetStoresSkusForManageState(db *DaoDB, storeID, status int) (storeSkuList []*GetStoresSkusForManageStateResult, err error) {
sql := `
SELECT t1.sku_id, t1.unit_price, t2.mid_unit_price
FROM store_sku_bind t1
LEFT JOIN price_refer_snapshot t2 ON t1.sku_id = t2.sku_id AND t2.city_code = ? AND t2.snapshot_at = ?
WHERE t1.deleted_at = ?
`
sqlParams := []interface{}{
0, utils.Time2Date(time.Now().AddDate(0, 0, -1)),
utils.DefaultTimeValue,
}
if storeID != 0 {
sql += " AND t1.store_id = ?"
sqlParams = append(sqlParams, storeID)
}
if status != model.StoreSkuBindStatusNA {
sql += " AND t1.status = ? "
sqlParams = append(sqlParams, status)
}
err = GetRows(db, &storeSkuList, sql, sqlParams...)
return storeSkuList, err
}

View File

@@ -6,7 +6,7 @@ import (
"git.rosy.net.cn/jx-callback/globals"
)
func GetThingMapList(db *DaoDB, thingType int, vendorIDs, thingIDs []int) (cats []*model.ThingMap, err error) {
func GetThingMapList(db *DaoDB, thingType int, vendorIDs, thingIDs []int, vendorOrgCodes []string) (cats []*model.ThingMap, err error) {
sql := `
SELECT t1.*
FROM thing_map t1
@@ -19,13 +19,17 @@ func GetThingMapList(db *DaoDB, thingType int, vendorIDs, thingIDs []int) (cats
if len(thingIDs) > 0 { // 必须要指定ID
sql += " AND t1.thing_id IN (" + GenQuestionMarks(len(thingIDs)) + ")"
sqlParams = append(sqlParams, thingIDs)
err = GetRows(db, &cats, sql, sqlParams...)
}
if len(vendorOrgCodes) > 0 {
sql += " AND t1.vendor_org_code IN (" + GenQuestionMarks(len(vendorOrgCodes)) + ")"
sqlParams = append(sqlParams, vendorOrgCodes)
}
err = GetRows(db, &cats, sql, sqlParams...)
return cats, err
}
func GetThingMapMap(db *DaoDB, thingType int, vendorIDs, thingIDs []int) (thingMapMap map[int64][]*model.ThingMap, err error) {
thingMapList, err := GetThingMapList(db, thingType, vendorIDs, thingIDs)
thingMapList, err := GetThingMapList(db, thingType, vendorIDs, thingIDs, nil)
if err == nil {
thingMapMap = make(map[int64][]*model.ThingMap)
for _, thingMap := range thingMapList {

View File

@@ -17,6 +17,9 @@ const (
ErrCodeJsonActEarningPriceIsZero = "-103"
ErrCodeJsonUserAlreadyExist = "-104" // 用户已经存在错,且能成功登录
ErrCodeJsonSyncErr = "-105"
ErrCodeAccountBalanceNotEnough = "-201" //余额不足
ErrCodeNotAuthBindWeixin = "-202" //没有绑定微信认证方式
)
var (

View File

@@ -1,8 +1,9 @@
package model
const (
MessageTypeStore = 1
MessageTypeUser = 2
MessageTypeStore = 1
MessageTypeUser = 2
MessageTypeStoreAct = 3
)
const (
@@ -23,9 +24,11 @@ var (
type Message struct {
ModelIDCULD
Type int8 `json:"type"`
Type int8 `json:"type"` //1发给门店2发给用户3发给门店的统计活动参与信息
Title string `json:"title"`
Content string `orm:"type(text)" json:"content"`
ActInfo string `json:"actInfo"` //活动信息,时间平台等
Imgs string `json:"imgs"` //图片集合
}
func (*Message) TableIndex() [][]string {
@@ -37,11 +40,12 @@ func (*Message) TableIndex() [][]string {
type MessageStatus struct {
ModelIDCULD
MessageID int `orm:"column(message_id)" json:"messageID"`
StoreID int `orm:"column(store_id)" json:"storeID"`
Status int8 `json:"status"`
ReadCount int `json:"readCount"`
UserID string `orm:"column(user_id)" json:"userID"`
MessageID int `orm:"column(message_id)" json:"messageID"`
StoreID int `orm:"column(store_id)" json:"storeID"`
Status int8 `json:"status"`
ReadCount int `json:"readCount"`
UserID string `orm:"column(user_id)" json:"userID"`
ConfirmStatus int `json:"confirmStatus"` //商家确认活动默认0不确认1确认
}
func (*MessageStatus) TableIndex() [][]string {
@@ -51,6 +55,12 @@ func (*MessageStatus) TableIndex() [][]string {
}
}
type MessageActInfo struct {
VendorID int `orm:"colmun(vendor_id)" json:"vendorID"`
BeginAt string `json:"beginAt"`
EndAt string `json:"endAt"`
}
type ImMessageRecord struct {
ModelIDCULD
UserID string `orm:"size(48);column(user_id)" json:"userID"` //消息发送方userID
@@ -72,3 +82,14 @@ func (*ImMessageRecord) TableIndex() [][]string {
[]string{"VendorOrderID"},
}
}
type KnowledgeDepot struct {
ModelIDCULD
Title string `json:"title"` //标题
Content string `orm:"type(text)" json:"content"` //每条知识的内容
}
type DepotMedia struct {
ModelIDCULD
}

View File

@@ -33,3 +33,61 @@ func (*PageShop) TableUnique() [][]string {
[]string{"VendorStoreID", "VendorID"},
}
}
//各平台商品数据
type PageSku struct {
ModelIDCUL
VendorID int `orm:"column(vendor_id)" json:"vendorID"`
VendorStoreID string `orm:"column(vendor_store_id)" json:"vendorStoreID"`
VendorSkuID string `orm:"column(vendor_sku_id)" json:"vendorSkuID"`
VendorSkuName string `json:"vendorSkuName"`
MonthSaled int `json:"monthSaled"`
ActPrice int `json:"actPrice"`
SalePrice int `json:"salePrice"`
Unit string `json:"unit"`
}
func (*PageSku) TableUnique() [][]string {
return [][]string{
[]string{"VendorID", "VendorStoreID", "VendorSkuID"},
}
}
func (*PageSku) TableIndex() [][]string {
return [][]string{
[]string{"MonthSaled", "SalePrice"},
}
}
//各平台门店数据
type PageStore struct {
ModelIDCUL
VendorID int `orm:"column(vendor_id)" json:"vendorID"`
VendorStoreID string `orm:"column(vendor_store_id)" json:"vendorStoreID"`
VendorStoreName string `json:"vendorStoreName"`
Address string `json:"address"`
CityName string `json:"cityName"`
OrgCode string `json:"orgCode`
Lng string `json:"lng"`
Lat string `json:"lat"`
}
func (*PageStore) TableIndex() [][]string {
return [][]string{
[]string{"VendorID", "VendorStoreID"},
}
}
type PageBrand struct {
ModelIDCUL
BrandName string `json:"brandName"`
}
func (*PageBrand) TableIndex() [][]string {
return [][]string{
[]string{"BrandName"},
}
}

View File

@@ -1,6 +1,8 @@
package model
import "time"
import (
"time"
)
const (
OrderDeliveryTypePlatform = "platform" // 平台负责配送
@@ -9,9 +11,11 @@ const (
)
const (
PayTypeWX = 1 // 微信支付
PayTypeTL = 2 // 通联宝支付
PayTypeWX = 1 // 微信支付
PayTypeTL = 2 // 通联宝支付
PayTypeTL_DiscountCard = 3 // 通联宝支付(会员折扣卡)
PayTypeTL_StoreAcctPay = 4 // 通联宝支付(门店账户充值)
PayStatusNo = 0
PayStatusYes = 1
@@ -33,6 +37,21 @@ const (
OrderTypeMatter = 1 //物料订单
OrderTypeSupplyGoods = 2 //进货订单
OrderTypeDefendPrice = 3 //守价订单
OrderTypeStoreAcct = 4 //门店账户订单
)
const (
CouponStatusRe = -2 //优惠券状态还没生效
CouponStatusOverdue = -1 //已过期
CouponStatusNormal = 0 //正常
CouponStatusDeleted = -4 //被删了
CouponTypeDiscount = 1 //优惠券类型,总额满减
CouponTypeDelivery = 2 //运费优惠
)
const (
UserCouponStatusUsed = 1 // 已被使用
)
var (
@@ -49,6 +68,14 @@ var (
RefundStatusYes: "已退款",
RefundStatusFailed: "退款失败",
}
CouponStatusName = map[int]string{
CouponStatusRe: "还没生效",
CouponStatusOverdue: "已过期",
CouponStatusNormal: "正常",
UserCouponStatusUsed: "已被使用",
CouponStatusDeleted: "已删除",
}
)
type ModelTimeInfo struct {
@@ -57,60 +84,63 @@ type ModelTimeInfo struct {
}
type GoodsOrder struct {
ID int64 `orm:"column(id)" json:"id"`
VendorOrderID string `orm:"column(vendor_order_id);size(48)" json:"vendorOrderID"`
VendorOrderID2 string `orm:"column(vendor_order_id2);size(200);index" json:"vendorOrderID2"`
VendorID int `orm:"column(vendor_id)" json:"vendorID"`
VendorStoreID string `orm:"column(vendor_store_id);size(48)" json:"vendorStoreID"`
StoreID int `orm:"column(store_id)" json:"storeID"` // 外部系统里记录的 jxstoreid
JxStoreID int `orm:"column(jx_store_id)" json:"jxStoreID"` // 根据VendorStoreID在本地系统里查询出来的 jxstoreid
StoreName string `orm:"size(64)" json:"storeName"`
ShopPrice int64 `json:"shopPrice"` // 京西价
VendorPrice int64 `json:"vendorPrice"` // 平台价
SalePrice int64 `json:"salePrice"` // 售卖价
ActualPayPrice int64 `json:"actualPayPrice"` // 单位为分 顾客实际支付
TotalShopMoney int64 `json:"totalShopMoney"` // 应结金额-第三方平台结算给京西的金额(包括了所有的补贴,扣除)
DiscountMoney int64 `json:"discountMoney"` // 订单总优惠金额
PmSubsidyMoney int64 `json:"pmSubsidyMoney"` // 平台活动补贴(订单主体活动补贴+订单单条sku补贴1+
BaseFreightMoney int64 `json:"baseFreightMoney"` // 商户承担的配送费不包括DistanceFreightMoney
DistanceFreightMoney int64 `json:"distanceFreightMoney"` // 商户承担的远距离配送费(当前只有京东到家有值
WaybillTipMoney int64 `json:"waybillTipMoney"` // 京西加的平台配送小费
EarningPrice int64 `json:"earningPrice"` // 结算给门店老板的钱(未扣除可能的三方配送费)
NewEarningPrice int64 `json:"newEarningPrice"` // 结算给门店老板的钱(未扣除可能的三方配送费)(新规则)
Weight int `json:"weight"` // 单位为克
VendorUserID string `orm:"column(vendor_user_id);size(48)" json:"vendorUserID"`
UserID string `orm:"column(user_id);size(48);index" json:"userID"`
ConsigneeName string `orm:"size(32)" json:"consigneeName"`
ConsigneeMobile string `orm:"size(32)" json:"consigneeMobile"` // 订单中的收货手机号
ConsigneeMobile2 string `orm:"size(32)" json:"consigneeMobile2"` // 收货人真实手机号
ConsigneeAddress string `orm:"size(255)" json:"consigneeAddress"`
CoordinateType int `json:"coordinateType"`
ConsigneeLng int `json:"consigneeLng"` // 坐标 * 10的六次方
ConsigneeLat int `json:"consigneeLat"` // 坐标 * 10的六次方
SkuCount int `json:"skuCount"` // 商品类别数量即有多少种商品注意在某些情况下相同SKU的商品由于售价不同也会当成不同商品在这个值里
GoodsCount int `json:"goodsCount"` // 商品个数
Status int `json:"status"` // 参见OrderStatus*相关的常量定义
VendorStatus string `orm:"size(255)" json:"vendorStatus"`
LockStatus int `json:"lockStatus"` // 当前只支持单一锁定
LockStatusTime time.Time `orm:"type(datetime);null" json:"lockStatusTime"` // last lock status time
OrderSeq int `json:"orderSeq"` // 门店订单序号
BuyerComment string `orm:"size(255)" json:"buyerComment"`
BusinessType int `json:"businessType"`
ExpectedDeliveredTime time.Time `orm:"type(datetime)" json:"expectedDeliveredTime"` // 预期送达时间
CancelApplyReason string `orm:"size(255)" json:"-"` // ""表示没有申请不为null表示用户正在取消申请
DeliveryType string `orm:"size(32)" json:"deliveryType"` // 订单配送方式,缺省是平台配送
VendorWaybillID string `orm:"column(vendor_waybill_id);size(48)" json:"vendorWaybillID"`
WaybillVendorID int `orm:"column(waybill_vendor_id)" json:"waybillVendorID"` // 表示当前承运商,-1表示还没有安排
AdjustCount int8 `json:"adjustCount"` // 调整单(次数)
DeliveryFlag int8 `json:"deliveryFlag"` // 第1位为1表示禁止调度器调度三方配送
DuplicatedCount int `json:"-"` // 重复新订单消息数这个一般不是由于消息重发造成的消息重发由OrderStatus过滤一般是业务逻辑造成的
OrderCreatedAt time.Time `orm:"type(datetime);index" json:"orderCreatedAt"` // 这里记录的是订单生效时间,即用户支付完成(货到付款即为下单时间
OrderFinishedAt time.Time `orm:"type(datetime)" json:"orderFinishedAt"`
StatusTime time.Time `orm:"type(datetime)" json:"statusTime"` // last status time
PickDeadline time.Time `orm:"type(datetime);null" json:"pickDeadline"`
DeliveryFeeFrom *time.Time `orm:"type(datetime);null" json:"deliveryFeeFrom,omitempty"` // 三方配置费计算的开始基准时间
ModelTimeInfo `json:"-"`
Flag int `json:"flag"` //非运单调整相关的其它状态
ID int64 `orm:"column(id)" json:"id"`
VendorOrderID string `orm:"column(vendor_order_id);size(48)" json:"vendorOrderID"`
VendorOrderID2 string `orm:"column(vendor_order_id2);size(200);index" json:"vendorOrderID2"`
VendorID int `orm:"column(vendor_id)" json:"vendorID"`
VendorStoreID string `orm:"column(vendor_store_id);size(48)" json:"vendorStoreID"`
StoreID int `orm:"column(store_id)" json:"storeID"` // 外部系统里记录的 jxstoreid
JxStoreID int `orm:"column(jx_store_id)" json:"jxStoreID"` // 根据VendorStoreID在本地系统里查询出来的 jxstoreid
StoreName string `orm:"size(64)" json:"storeName"`
ShopPrice int64 `json:"shopPrice"` // 京西价
VendorPrice int64 `json:"vendorPrice"` // 平台价
SalePrice int64 `json:"salePrice"` // 售卖价
ActualPayPrice int64 `json:"actualPayPrice"` // 单位为分 顾客实际支付
TotalShopMoney int64 `json:"totalShopMoney"` // 应结金额-第三方平台结算给京西的金额(包括了所有的补贴,扣除)
DiscountMoney int64 `json:"discountMoney"` // 订单总优惠金额
PmSubsidyMoney int64 `json:"pmSubsidyMoney"` // 平台活动补贴(订单主体活动补贴+订单单条sku补贴1+
JxSubsidyMoney int64 `json:"jxSubsidyMoney"` // 京西我们自己填的订单补贴金额
BaseFreightMoney int64 `json:"baseFreightMoney"` // 商户承担的配送费(不包括DistanceFreightMoney
DistanceFreightMoney int64 `json:"distanceFreightMoney"` // 商户承担的远距离配送费(当前只有京东到家有值)
WaybillTipMoney int64 `json:"waybillTipMoney"` // 京西加的平台配送小费
EarningPrice int64 `json:"earningPrice"` // 结算给门店老板的钱(未扣除可能的三方配送费)
NewEarningPrice int64 `json:"newEarningPrice"` // 结算给门店老板的钱(未扣除可能的三方配送费)(新规则)
Weight int `json:"weight"` // 单位为克
VendorUserID string `orm:"column(vendor_user_id);size(48)" json:"vendorUserID"`
UserID string `orm:"column(user_id);size(48);index" json:"userID"`
ConsigneeName string `orm:"size(32)" json:"consigneeName"`
ConsigneeMobile string `orm:"size(32)" json:"consigneeMobile"` // 订单中的收货手机号
ConsigneeMobile2 string `orm:"size(32)" json:"consigneeMobile2"` // 收货人真实手机号
ConsigneeAddress string `orm:"size(255)" json:"consigneeAddress"`
CoordinateType int `json:"coordinateType"`
ConsigneeLng int `json:"consigneeLng"` // 坐标 * 10的六次方
ConsigneeLat int `json:"consigneeLat"` // 坐标 * 10的六次方
SkuCount int `json:"skuCount"` // 商品类别数量即有多少种商品注意在某些情况下相同SKU的商品由于售价不同也会当成不同商品在这个值里
GoodsCount int `json:"goodsCount"` // 商品个数
Status int `json:"status"` // 参见OrderStatus*相关的常量定义
VendorStatus string `orm:"size(255)" json:"vendorStatus"`
LockStatus int `json:"lockStatus"` // 当前只支持单一锁定
LockStatusTime time.Time `orm:"type(datetime);null" json:"lockStatusTime"` // last lock status time
OrderSeq int `json:"orderSeq"` // 门店订单序号
BuyerComment string `orm:"size(255)" json:"buyerComment"`
BusinessType int `json:"businessType"`
ExpectedDeliveredTime time.Time `orm:"type(datetime)" json:"expectedDeliveredTime"` // 预期送达时间
CancelApplyReason string `orm:"size(255)" json:"-"` // ""表示没有申请不为null表示用户正在取消申请
DeliveryType string `orm:"size(32)" json:"deliveryType"` // 订单配送方式,缺省是平台配送
CreateDeliveryType int `orm:"default(0)" json:"createDeliveryType"` //默认0系统发单1为门店发单
VendorWaybillID string `orm:"column(vendor_waybill_id);size(48)" json:"vendorWaybillID"`
WaybillVendorID int `orm:"column(waybill_vendor_id)" json:"waybillVendorID"` // 表示当前承运商,-1表示还没有安排
AdjustCount int8 `json:"adjustCount"` // 调整单(次数
DeliveryFlag int8 `json:"deliveryFlag"` // 第1位为1表示禁止调度器调度三方配送
DuplicatedCount int `json:"-"` // 重复新订单消息数这个一般不是由于消息重发造成的消息重发由OrderStatus过滤一般是业务逻辑造成的
OrderCreatedAt time.Time `orm:"type(datetime);index" json:"orderCreatedAt"` // 这里记录的是订单生效时间,即用户支付完成(货到付款即为下单时间)
OrderFinishedAt time.Time `orm:"type(datetime)" json:"orderFinishedAt"`
StatusTime time.Time `orm:"type(datetime)" json:"statusTime"` // last status time
PickDeadline time.Time `orm:"type(datetime);null" json:"pickDeadline"`
DeliveryFeeFrom *time.Time `orm:"type(datetime);null" json:"deliveryFeeFrom,omitempty"` // 三方配置费计算的开始基准时间
ModelTimeInfo `json:"-"`
Flag int `json:"flag"` //非运单调整相关的其它状态
InvoiceTitle string `orm:"size(64)" json:"invoiceTitle"` // 发票抬头
InvoiceTaxerID string `orm:"size(32);column(invoice_taxer_id)" json:"invoiceTaxerID"` // 发票纳税人识别码
@@ -122,6 +152,7 @@ type GoodsOrder struct {
EarningType int `json:"earningType"` //订单结算方式2为扣点1为报价
OrderType int `json:"orderType"` //订单类型0为普通订单1为物料订单2为进货订单
OrderPayPercentage int `json:"orderPayPercentage"`
CouponIDs string `orm:"column(coupon_ids)" json:"couponIDs"` //优惠券IDs京西商城
// 以下只是用于传递数据
OriginalData string `orm:"-" json:"-"`
@@ -151,7 +182,7 @@ func (o *GoodsOrderOriginal) TableUnique() [][]string {
}
type OrderSku struct {
ID int64 `orm:"column(id)" json:"-"`
ID int64 `orm:"column(id)" json:"id"`
VendorOrderID string `orm:"column(vendor_order_id);size(48)" json:"vendorOrderID"`
VendorID int `orm:"column(vendor_id)" json:"vendorID"`
StoreSubID int `orm:"column(store_sub_id)" json:"storeSubID"` // EarningActID当前这个字段被当成结算活动ID用
@@ -170,6 +201,7 @@ type OrderSku struct {
PromotionType int `json:"promotionType"` // todo 当前是用于记录京东的PromotionType(生成jxorder用),没有做转换
OrderCreatedAt time.Time `orm:"type(datetime);index" json:"-"` // 分区考虑
IsVendorAct int `json:"isVendorAct"`
Upc string `json:"upc"` //upc码
}
// 同样商品在一个订单中可能重复出现(比如搞活动时,相同商品价格不一样,第一个有优惠)
@@ -409,6 +441,74 @@ func (v *PriceDefendOrder) TableIndex() [][]string {
}
}
type Coupons struct {
ModelIDCUL
CouponType int `json:"couponType"` //优惠券类型 1为总额满减 2为运费优惠
Name string `json:"name"` //优惠券名字
Desc string `json:"desc"` //优惠券详情描述
BeginAt time.Time `json:"beginAt"` //开始时间
EndAt time.Time `json:"endAt"` //到期时间
UpperLimit int `json:"upperLimit"` //满多少
Cut int `json:"cut"` //减多少
CouponStatus int `json:"couponStatus"` //优惠券状态0为正常可使用-1为已过期 -2为还没开始
IsAll int `json:"isAll"` //是否全国有效1是
}
func (v *Coupons) TableIndex() [][]string {
return [][]string{
[]string{"BeginAt"},
}
}
type UserCoupons struct {
ModelIDCUL
CouponID int `orm:"column(coupon_id)" json:"couponID"` //优惠券ID
UserID string `orm:"column(user_id)" json:"userID"` //userID
Mobile string `json:"moblie"` //电话,可能他还没注册
UserCouponStatus int `json:"userCouponStatus"` //优惠券状态0为正常可使用-1为已过期 1为已使用
}
func (v *UserCoupons) TableIndex() [][]string {
return [][]string{
[]string{"CouponID", "UserID", "Mobile"},
}
}
type StoreCoupons struct {
ModelIDCULD
CouponID int `orm:"column(coupon_id)" json:"couponID"` //优惠券ID
StoreID int `orm:"column(store_id)" json:"storeID"` //storeID
}
func (v *StoreCoupons) TableIndex() [][]string {
return [][]string{
[]string{"CouponID", "StoreID"},
}
}
type StoreAcctOrder struct {
ModelIDCUL
VendorOrderID string `orm:"column(vendor_order_id);size(48)" json:"vendorOrderID"`
VendorID int `orm:"column(vendor_id)" json:"vendorID"`
StoreID int `orm:"column(store_id)" json:"storeID"` // 外部系统里记录的 jxstoreid
ActualPayPrice int `json:"actualPayPrice"` // 单位为分 顾客实际支付
UserID string `orm:"column(user_id);size(48);index" json:"userID"`
OrderType int `json:"orderType"`
Status int `json:"status"` // 参见OrderStatus*相关的常量定义
OrderFinishedAt time.Time `orm:"type(datetime)" json:"orderFinishedAt"`
GoodsVendorOrderID string `orm:"column(goods_vendor_order_id);size(48)" json:"goodsVendorOrderID"` //goodsOrder表的vendorOrderID主动充值此值为空从配送管理中余额不足充值则是该订单号
}
func (v *StoreAcctOrder) TableUnique() [][]string {
return [][]string{
[]string{"VendorOrderID", "VendorID"},
}
}
// 判断是否是购买平台自有物流
// 对于京东,饿百来说,就是其自有的物流,对于微商城来说,是达达
func IsWaybillPlatformOwn(bill *Waybill) bool {
@@ -435,6 +535,11 @@ func IsOrderDeliveryByPlatform(order *GoodsOrder) bool {
return order.DeliveryType == OrderDeliveryTypePlatform
}
//订单是否是自提单
func IsOrderDeliveryBySelf(order *GoodsOrder) bool {
return order.DeliveryType == OrderDeliveryTypeStoreSelf
}
func IsOrderJXTemp(order *GoodsOrder) bool {
return order.VendorID == VendorIDJX && order.Flag&OrderFlagMaskTempJX != 0
}

View File

@@ -93,6 +93,7 @@ type AfsOrder struct {
RefundType int8 `json:"refundType"`
RefuseReason string `orm:"size(1024)" json:"refuseReason"`
AfsTotalShopMoney int64 `json:"afsTotalShopMoney"` //最新的退款后的平台结算
SkuUserMoney int64 `json:"skuUserMoney"` // 用户支付菜品金额
FreightUserMoney int64 `json:"freightUserMoney"` // 用户支付运费金额
AfsFreightMoney int64 `json:"afsFreightMoney"` // 退货取件费

View File

@@ -66,6 +66,7 @@ var (
"杯",
"桶",
"串",
"提",
}
SkuNamePrefixNames = []string{
"新鲜",
@@ -140,6 +141,8 @@ type SkuCategory struct {
ExdName string `json:"exdName"` //饿鲜达对应分类名
ExdSeq int `json:"exdSeq"`
IsExdSpec int `json:"isExdSpec"` //是否是饿鲜达特有新建的分类
IsExdSync int `json:"isExdSync"` //饿鲜达分类是否同步到平台
// JdID int64 `orm:"column(jd_id);index" json:"jdID"` // 这个是指商家自己的商品类别在京东平台上的ID
// JdSyncStatus int8 `orm:"default(2)" json:"jdSyncStatus"`
IsSync int `json:"isSync"` //是否同步到平台
@@ -172,9 +175,12 @@ type SkuName struct {
SpecUnit string `orm:"size(8)" json:"-"` // 为份必然为克这个主要作用只是用于确保SkuName的唯一性
Price int `json:"price"` // 单位为分标准价不为份的就为实际标准价为份的为每市斤价实际还要乘质量。todo 为份的确定必须有质量
Img string `orm:"size(512)" json:"img"`
Img2 string `orm:"size(512)" json:"img2"` // 第二张图片
Img3 string `orm:"size(512)" json:"img3"` //第三张图片
Img string `orm:"size(512)" json:"img"`
Img2 string `orm:"size(512)" json:"img2"` // 第二张图片
Img3 string `orm:"size(512)" json:"img3"` //第三张图片
Img4 string `orm:"size(512)" json:"img4"` //第三张图片
Img5 string `orm:"size(512)" json:"img5"` //第三张图片
ImgWatermark string `orm:"size(512)" json:"imgWatermark"` //图片水印
ImgMix string `orm:"size(512)" json:"imgMix"` //图片混合水印的图片
// ImgEbai string `orm:"size(255)" json:"imgEbai"` // 饿百图片地址
@@ -195,11 +201,13 @@ type SkuName struct {
JdsStockSwitch int8 `orm:"default(1)" json:"jdsStockSwitch"` //京东商城总库存
PreparationTime int `orm:"default(1)" json:"preparationTime"` //商品准备时长
BestSeller int `json:"bestSeller"` //畅销品 0不是 1是
Video string `json:"video"` //商品视频地址
VideoID string `orm:"column(video_id)" json:"videoID"` //商品视频美团ID
}
func (*SkuName) TableUnique() [][]string {
return [][]string{
[]string{"Name", "Prefix", "SpecQuality", "SpecUnit", "Unit", "IsSpu", "DeletedAt"},
[]string{"Name", "Prefix", "SpecQuality", "SpecUnit", "Unit", "IsSpu", "Upc", "DeletedAt"},
[]string{"Upc", "DeletedAt"},
}
}
@@ -288,6 +296,7 @@ type SkuNameExt struct {
PlacesStr string `json:"-"`
MidUnitPrice int `json:"midUnitPrice"`
SkuID int `orm:"column(sku_id)" json:"skuID"`
JdCategoryID string `json:"jdCategoryID"`
JdsCategoryID string `json:"jdsCategoryID"`
EbaiCategoryID string `json:"ebaiCategoryID"`
@@ -297,12 +306,14 @@ type SkuNameExt struct {
type SkuExinfoMap struct {
ModelIDCULD
NameID int `orm:"column(name_id)" json:"nameID"`
VendorID int `orm:"column(vendor_id)" json:"vendorID"`
BeginAt time.Time `orm:"type(datetime);index" json:"beginAt"` //设置起始时间
EndAt time.Time `orm:"type(datetime);index" json:"endAt"` //设置结束时间
ExPrefix string `orm:"size(255)" json:"exPrefix"` //额外前缀
ImgWatermark string `orm:"size(512)" json:"imgWatermark"` //图片水印
NameID int `orm:"column(name_id)" json:"nameID"`
VendorID int `orm:"column(vendor_id)" json:"vendorID"`
BeginAt time.Time `orm:"type(datetime);index" json:"beginAt"` //设置起始时间
EndAt time.Time `orm:"type(datetime);index" json:"endAt"` //设置结束时间
ExPrefix string `orm:"size(255)" json:"exPrefix"` //额外前缀
ImgWatermark string `orm:"size(512)" json:"imgWatermark"` //图片水印
ImgWatermarkMix string `orm:"size(512)" json:"ImgWatermarkMix"` //合成水印图
BrandID int `orm:"column(brand_id);default(0)" json:"brandID"` //品牌ID
}
func (*SkuExinfoMap) TableIndex() [][]string {
@@ -324,3 +335,21 @@ func (*SkuVendorCategoryMap) TableIndex() [][]string {
[]string{"NameID", "VendorID"},
}
}
type VendorCategoryMap struct {
ModelIDCULD
VendorID int `orm:"column(vendor_id)" json:"vendorID"`
VendorOrgCode string `json:"vendorOrgCode"`
CategoryID int `orm:"column(category_id)" json:"categoryID"` // 这个是指对应的sku_category
VendorCategoryName string `orm:"size(255)" json:"vendorCategoryName"` // 平台类别单独的名字
VendorCategorySeq int `orm:"default(0)" json:"vendorCategorySeq"` // 平台类别单独的序号
Level int `json:"level"` // 平台类别单独的等级
ParentID int `orm:"column(parent_id)" json:"parentID"` //门店类别父ID和sku_category一致
}
func (*VendorCategoryMap) TableUnique() [][]string {
return [][]string{
[]string{"VendorID", "VendorOrgCode", "CategoryID", "DeletedAt"},
}
}

View File

@@ -22,7 +22,12 @@ const (
StoreAuditStatusCreated = 1
StoreAuditStatusOnline = 0
StoreAuditStatusRejected = -1
StoreAuditStatusUpdated = 2
StoreAuditStatusAll = -9
StoreMapAuditStatusWait = 0 //待审核
StoreMapAuditStatusPass = 1 //审核通过
StoreMapAuditStatusUnPass = -1 //审核不通过
)
const (
@@ -63,8 +68,10 @@ const (
const (
ExdStoreName = "饿鲜达"
MatterStoreID = 666666
JdShopMainVendorStoreID = "999999"
JdShopMainStoreID = 102919
JdShopMainVendorStoreID = "9999999"
// JdShopMainVendorStoreID2 = "9999999"
JdShopMainStoreID = 100000
// JdShopMainStoreID2 = 100000
VendorStoreTel = "18011597879"
)
@@ -256,9 +263,9 @@ var (
StoreAuditStatusRejected: "拒绝",
}
StorePriceTypeName = map[int]string{
StoreChangePriceTypeDirect: "普通门店",
StoreChangePriceTypeBossDisabled: "普通门店禁止改价",
StoreChangePriceTypeManagedStore: "直营门店禁止改价",
StoreChangePriceTypeDirect: "普通门店",
// StoreChangePriceTypeBossDisabled: "普通门店禁止改价",
// StoreChangePriceTypeManagedStore: "直营门店禁止改价",
}
AutoReplyTypeName = map[int]string{
AutoReplyAll: "全部自动回复",
@@ -293,6 +300,7 @@ type Store struct {
AutoReplyType int8 `json:"autoReplyType"` // 订单评价自动回复类型
LinkStoreID int `orm:"column(link_store_id);default(0);index" json:"linkStoreID"` // 关联门店ID
StoreLevel string `orm:"default(C);size(32)" json:"storeLevel"` // 门店等级(筛选用,京西的)
Comment string `orm:"size(255)" json:"comment"` //门店备注
PrinterDisabled int8 `orm:"default(0)" json:"printerDisabled"` // 是否禁用网络打印机
PrinterFontSize int8 `orm:"default(0)" json:"printerFontSize"` // 打印字体-10正常1
@@ -338,6 +346,9 @@ type Store struct {
PayPercentage int `json:"payPercentage"`
OldPayPercentage int `json:"oldPayPercentage"`
StoreFrontPic string `orm:"size(255)" json:"storeFrontPic"` //门面照
StoreInPic string `orm:"size(255)" json:"storeInPic"` //门店内照片
// OperatorName string `orm:"size(8)" json:"operatorName"` // 运营人姓名
OperatorPhone string `orm:"size(16)" json:"operatorPhone"` // 京东运营人电话
OperatorRole string `orm:"size(32)" json:"operatorRole"` // 京东运营人组(角色)
@@ -348,10 +359,11 @@ type Store struct {
OperatorPhone3 string `orm:"size(16)" json:"operatorPhone3"` // 饿百运营人电话
OperatorRole3 string `orm:"size(32)" json:"operatorRole3"` // 饿百运营人组(角色)
PromoteInfo string `orm:"size(255)" json:"promoteInfo"` //门店公告(所有平台统一的公告)
IsBoughtMatter int `json:"isBoughtMatter"` //这周是否申请过物料
SoundPercentage int `json:"soundPercentage"` //打印机声音大小比例
Banner string `orm:"size(9999)" json:"banner"` //门店商城bannar图
PromoteInfo string `orm:"size(255)" json:"promoteInfo"` //门店公告(所有平台统一的公告)
IsBoughtMatter int `json:"isBoughtMatter"` //这周是否申请过物料
SoundPercentage int `json:"soundPercentage"` //打印机声音大小比例
Banner string `orm:"size(9999)" json:"banner"` //门店商城bannar图
BrandID int `orm:"column(brand_id)" json:"brandID"` //品牌ID
}
func (*Store) TableUnique() [][]string {
@@ -413,10 +425,11 @@ type StoreMap struct {
VendorID int `orm:"column(vendor_id)" json:"vendorID"`
VendorOrgCode string `orm:"size(32)" json:"vendorOrgCode"` // 同一平台下不同的商户代码,如果只有一个,可以为空
VendorStoreID string `orm:"column(vendor_store_id);size(48)" json:"vendorStoreID"`
Status int `json:"status"` // 取值同Store.Status
StoreName string `orm:"size(255)" json:"storeName"` // 平台门店的名字,由平台到京西
VendorStoreName string `orm:"size(255)" json:"vendorStoreName"` //平台门店名,由京西到平台
VendorStoreID string `orm:"column(vendor_store_id);size(48)" json:"vendorStoreID"`
Status int `json:"status"` // 取值同Store.Status
StoreName string `orm:"size(255)" json:"storeName"` // 平台门店的名字,由平台到京西
VendorStoreName string `orm:"size(255)" json:"vendorStoreName"` //平台门店名,由京西到平台
VendorPayPercentage int `json:"vendorPayPercentage"` //平台结算比例
PricePercentage int16 `orm:"default(100)" json:"pricePercentage"` // todo 厂商价格相对于本地价格的百分比,这个字段的修改会比较特殊,因为可能需要刷新厂商价格
PricePercentagePack string `orm:"size(32)" json:"pricePercentagePack"` //
@@ -428,6 +441,7 @@ type StoreMap struct {
DeliveryFeeDeductionSill int `json:"deliveryFeeDeductionSill"`
DeliveryFeeDeductionFee int `json:"deliveryFeeDeductionFee"`
DeliveryCompetition int8 `orm:"default(1)" json:"deliveryCompetition"` // 是否支持配送竞争
CreateDeliveryType int `orm:"default(0)" json:"createDeliveryType"` //默认0系统发单1为门店发单
SyncStatus int8 `orm:"default(2)" json:"syncStatus"`
IsSync int8 `orm:"default(1)" json:"isSync"` // 是否同步
@@ -445,24 +459,37 @@ type StoreMap struct {
YbAppID string `orm:"column(yb_app_id);size(255)" json:"ybAppID"`
YbAppKey string `orm:"size(255)" json:"ybAppKey"`
YbStorePrefix string `orm:"size(255)" json:"ybStorePrefix"`
MtwmToken string `orm:"size(255)" json:"mtwmToken"` //美团外卖商超token有效期30天每20天刷一次
MtwmRefreshToken string `orm:"size(255)" json:"mtwmRefreshToken"` //美团外卖商超refreshToken
EbaiSupplierID string `orm:"column(ebai_supplier_id)" json:"ebaiSupplierID"` //饿百供应商ID
BussinessStatus int `orm:"-" json:"bussinessStatus"`
VendorAccount string `orm:"size(255)" json:"vendorAccount"` //商户在平台上的账号(授权用
VendorPasswaord string `orm:"size(255)" json:"vendorPasswaord"` //商户在平台上的密码( aes cbc base64后的
AuditStatus int `json:"auditStatus"` //审核状态(授权状态
}
func (*StoreMap) TableUnique() [][]string {
return [][]string{
[]string{"StoreID", "VendorID", "DeletedAt"},
[]string{"VendorStoreID", "VendorID", "DeletedAt"},
[]string{"StoreID", "VendorID", "DeletedAt", "VendorOrgCode"},
[]string{"VendorStoreID", "VendorID", "DeletedAt", "VendorOrgCode"},
}
}
type StoreCourierMap struct {
ModelIDCULD
StoreID int `orm:"column(store_id)" json:"storeID"`
VendorID int `orm:"column(vendor_id)" json:"vendorID"`
VendorStoreID string `orm:"column(vendor_store_id);size(48)" json:"vendorStoreID"`
Status int `json:"status"`
AuditStatus int `json:"auditStatus"`
VendorStatus int `json:"vendorStatus"`
StoreID int `orm:"column(store_id)" json:"storeID"`
VendorID int `orm:"column(vendor_id)" json:"vendorID"`
VendorStoreID string `orm:"column(vendor_store_id);size(48)" json:"vendorStoreID"`
Status int `json:"status"`
AuditStatus int `json:"auditStatus"`
VendorStatus int `json:"vendorStatus"`
VendorStoreName string `orm:"size(255)" json:"vendorStoreName"` //平台门店名,由京西到平台
Comment string `orm:"size(255)" json:"comment"`
// 以下数据仅用于同步使用
Lng int `json:"-"` // 乘了10的6次方
Lat int `json:"-"` // 乘了10的6次方
@@ -674,7 +701,7 @@ type StoreCategoryMap struct {
ModelIDCULD
StoreID int `orm:"column(store_id)" json:"storeID"`
CategoryID int `orm:"column(category_id)" json:"categoryID"` // 这个是指对应的sku_category
StoreCategoryName string `orm:"size(255)" json:"storeCategoryName"` // 门店类别单独的名字
StoreCategoryName string `orm:"size(255)" json:"name"` // 门店类别单独的名字
StoreCategorySeq int `orm:"default(0)" json:"storeCategorySeq"` // 门店类别单独的序号
Level int `json:"level"` // 门店类别单独的等级
ParentID int `orm:"column(parent_id)" json:"parentID"` //门店类别父ID和sku_category一致
@@ -757,3 +784,137 @@ func (*StoreAudit) TableIndex() [][]string {
[]string{"UserID"},
}
}
type Brand struct {
ModelIDCULD
Name string `orm:"size(255)" json:"name"` //品牌名
Logo string `orm:"size(255)" json:"logo"` //品牌logo
BrandType int `json:"brandType"` //品牌类型
IsOpen int `json:"isOpen"` //主要三方配送用是否配送默认0表示打开1表示关
IsPrint int `json:"isPrint"` //是否打印小票中的标题默认0表示打1表示不打
}
func (*Brand) TableUnique() [][]string {
return [][]string{
[]string{"Name"},
}
}
type BrandStore struct {
ModelIDCULD
Name string `orm:"size(255)" json:"name"` //门店名
}
func (*BrandStore) TableUnique() [][]string {
return [][]string{
[]string{"Name"},
}
}
//门店账户收入
type StoreAcctIncome struct {
ModelIDCUL
StoreID int `orm:"column(store_id)" json:"storeID"` //门店ID
VendorOrderID string `orm:"column(vendor_order_id);size(48)" json:"vendorOrderID"`
UserID string `orm:"column(user_id)" json:"userID"` //用户ID (谁消费的)
ExpID int `orm:"column(exp_id)" json:"expID"` //用于关联多退少补的金额是对应哪一笔收入(支出)
Type int `json:"type"` //收入类型
IncomePrice int `json:"incomePrice"` //收入金额
}
func (v *StoreAcctIncome) TableIndex() [][]string {
return [][]string{
[]string{"StoreID"},
[]string{"CreatedAt"},
}
}
//门店账户支出
type StoreAcctExpend struct {
ModelIDCUL
StoreID int `orm:"column(store_id)" json:"storeID"` //门店ID
VendorOrderID string `orm:"column(vendor_order_id);size(48)" json:"vendorOrderID"`
UserID string `orm:"column(user_id)" json:"userID"` //用户ID (谁消费的)
ExpID int `orm:"column(exp_id)" json:"expID"` //用于关联多退少补的金额是对应哪一笔收入(支出)
Type int `json:"type"` //支出类型
ExpendPrice int `json:"expendPrice"` //支出金额
}
func (v *StoreAcctExpend) TableIndex() [][]string {
return [][]string{
[]string{"StoreID"},
[]string{"CreatedAt"},
}
}
//门店账单表
type StoreAcct struct {
ModelIDCULD
StoreID int `orm:"column(store_id)" json:"storeID"` //门店ID
AccountBalance int `json:"accountBalance"` //账户余额
}
func (v *StoreAcct) TableUnique() [][]string {
return [][]string{
[]string{"StoreID"},
}
}
func (v *StoreAcct) TableIndex() [][]string {
return [][]string{
[]string{"CreatedAt"},
[]string{"AccountBalance"},
}
}
type StoreManageState struct {
ModelIDCUL
StoreID int `orm:"column(store_id)" json:"storeID"`
VendorID int `orm:"column(vendor_id)" json:"vendorID"`
CoverArea float64 `json:"coverArea"`
OpenTime float64 `json:"openTime"` //营业时长
SkuCount int `json:"skuCount"` //商品数
HighSkuCount int `json:"highSkuCount"` //虚高商品数
ActAmple int `json:"actAmple"` //活动丰富的
NullOrderCount int `json:"nullOrderCount"` //无效订单数
RefuseOrderCount int `json:"refuseOrderCount"` //拒绝订单数
StoreScore float64 `json:"storeScore"` //门店评分
RepurchaseRate int `json:"repurchaseRate"` //复购率(转化率)
VendorStatus int `json:"vendorStatus"` //平台营业状态
}
func (v *StoreManageState) TableUnique() [][]string {
return [][]string{
[]string{"StoreID", "VendorID"},
}
}
type StoreMapAudit struct {
ModelIDCULD
StoreID int `orm:"column(store_id)" json:"storeID"`
VendorID int `orm:"column(vendor_id)" json:"vendorID"`
VendorOrgCode string `orm:"size(32)" json:"vendorOrgCode"` // 同一平台下不同的商户代码,如果只有一个,可以为空
VendorStoreID string `orm:"column(vendor_store_id);size(48)" json:"vendorStoreID"`
VendorStoreName string `orm:"size(255)" json:"vendorStoreName"` //平台门店名,由京西到平台
VendorAccount string `orm:"size(255)" json:"vendorAccount"` //商户在平台上的账号(授权用
VendorPasswaord string `orm:"size(255)" json:"vendorPasswaord"` //商户在平台上的密码( aes cbc base64后的
AuditStatus int `json:"auditStatus"` //审核状态(授权状态
AuditAt time.Time `json:"auditAt"` //审核时间
AuditOperator string `json:"auditOperator"` //审核人
Comment string `orm:"size(255)" json:"comment"` //备注(审核不通过原因
}
func (v *StoreMapAudit) TableIndex() [][]string {
return [][]string{
[]string{"StoreID", "VendorStoreID"},
}
}

View File

@@ -10,7 +10,7 @@ const (
)
const (
MaxStoreSkuStockQty = 99999
MaxStoreSkuStockQty = 9999
)
const (
@@ -133,6 +133,8 @@ type StoreSkuBind struct {
StatusSaleBegin int16 //商品可售时间范围
StatusSaleEnd int16
MtLadderBoxPrice int `json:"mtLadderBoxPrice"` //美团门店商品包装费
}
func (*StoreSkuBind) TableUnique() [][]string {

View File

@@ -18,7 +18,7 @@ type ThingMap struct {
VendorOrgCode string `orm:"size(32)" json:"vendorOrgCode"` // 同一平台下不同的商户代码,如果只有一个,可以为空
VendorThingID string `orm:"size(32);column(vendor_thing_id);index" json:"vendorThingID"`
SyncStatus int8 `orm:"default(2)" json:"syncStatus"`
SyncStatus int8 `orm:"default(0)" json:"syncStatus"`
Remark string `orm:"size(255)" json:"remark"`
}

View File

@@ -16,6 +16,7 @@ const (
UserTypeStoreBoss = 2
UserTypeOperator = 4
UserTypeBoss = 8
UserTypeRole = 16
UserTypeNonConsumer = ^1
MemberTypeDiscountCard = 1 //会员折扣卡
@@ -27,6 +28,7 @@ var (
UserTypeStoreBoss: "门店老板",
UserTypeOperator: "运营",
UserTypeBoss: "老板",
UserTypeRole: "受权限管理",
}
)
@@ -57,12 +59,17 @@ type User struct {
LastLoginAt *time.Time `orm:"null" json:"lastLoginAt"`
LastLoginIP string `orm:"size(64);column(last_login_ip)" json:"lastLoginIP"`
LastLoginType string `orm:"size(16)" json:"lastLoginType"`
LastBrandID int `orm:"column(last_brand_id)" json:"lastBrandID"`
LastStoreID int `orm:"column(last_store_id)" json:"lastStoreID"` //上次浏览过的店铺
ParentMobile string `orm:"size(32)" json:"parentMobile"`
DividePercentage int `json:"dividePercentage"`
Profit int `json:"profit"`
ProfitSum int `json:"profitSum"`
Arrears int `json:"arrears"`
BindStoreID string `orm:"column(bind_store_id)" json:"bindStoreID"` //门店老板账号用,表示绑的哪个门店,后权限用
BindStoreUser string `json:"bindStoreUser"` //表示绑的哪个账号,密码同这个账号
}
func (*User) TableUnique() [][]string {
@@ -207,10 +214,12 @@ type UserMember struct {
ModelIDCULD
VendorOrderID string `orm:"column(vendor_order_id);size(48)" json:"vendorOrderID"` //和order_pay关联的不知道有没用先加上把
UserID string `orm:"size(48);column(user_id)" json:"userID"` //内部唯一标识
MemberType int `json:"memberType"` //会员类型, 1为折扣卡
MemberTypeID int `orm:"column(member_type_id)" json:"memberTypeID"` //会员类型ID折扣卡的话代表几档
EndAt time.Time `json:"endAt"` //会员过期时间
VendorID int `orm:"column(vendor_id)" json:"vendorID"`
UserID string `orm:"size(48);column(user_id)" json:"userID"` //内部唯一标识
Mobile string `orm:"size(48)" json:"mobile"` //内部唯一标识
MemberType int `json:"memberType"` //会员类型, 1为折扣卡
MemberTypeID int `orm:"column(member_type_id)" json:"memberTypeID"` //会员类型ID折扣卡的话代表几档
EndAt time.Time `json:"endAt"` //会员过期时间
IsPay int `json:"isPay"`
}
@@ -224,7 +233,12 @@ func (v *UserMember) TableIndex() [][]string {
type Role struct {
ModelIDCULD
Name string `json:"name"` //角色名
Name string `json:"name"` //角色名
BrandID int `orm:"column(brand_id)" json:"brandID"`
CityCodes string `orm:"type(text)" json:"cityCodes"`
StoreIDs string `orm:"column(store_ids);type(text)" json:"storeIDs"`
CityInfo []*Place `orm:"-" json:"cityInfo"`
Stores []*Store `orm:"-" json:"storeInfo"`
}
func (*Role) TableUnique() [][]string {
@@ -255,6 +269,7 @@ type Menu struct {
Level int `json:"level"` //级别
ParentID int `orm:"column(parent_id)" json:"parentID"` //父功能ID
Color string `json:"color"` //颜色
Type int `json:"type"` //0为功能菜单1为权限菜单
}
func (*Menu) TableUnique() [][]string {

View File

@@ -0,0 +1,37 @@
package model
const (
VendorOrgTypePlatform = "platform" //外卖平台
VendorOrgTypeDelivery = "delivery" //配送平台
)
type VendorOrgCode struct {
ModelIDCULD
VendorID int `orm:"column(vendor_id)" json:"code"`
VendorOrgCode string `orm:"size(32)" json:"key"` // 同一平台下不同的商户代码,如果只有一个,可以为空
Comment string `json:"name"` //备注
//appkeysecret token等
VendorType string `json:"vendorType"` //platform 普通平台, delivery 三方配送平台
IsJxCat int `json:"isJxCat"` //是否使用京西分类0默认使用
IsOpen int `json:"isOpen"` //主要三方配送用是否配送默认0表示打开1表示关
EmpowerURL string `orm:"column(empower_url)" json:"empowerURL"` //授权地址
StoreBrandName string `json:"storeBrandName"` //建店品牌名(和饿百供应商不同,美团是根据平台账号划分)
Token string `json:"token"`
AppKey string `json:"appKey"`
AppSecret string `json:"appSecret"`
}
type MtJdCategoryMap struct {
ID int `orm:"column(id)" json:"id"`
MtID string `orm:"column(mt_id)" json:"mtID"`
JdID string `orm:"column(jd_id)" json:"jdID"`
}
func (*MtJdCategoryMap) TableIndex() [][]string {
return [][]string{
[]string{"MtID", "JdID"},
}
}

View File

@@ -1,6 +1,7 @@
package msghub
import (
"git.rosy.net.cn/jx-callback/business/jxstore/permission"
"time"
"git.rosy.net.cn/baseapi/utils"
@@ -155,6 +156,10 @@ func GetMsg(ctx *jxcontext.Context, storeID int, lastOrderTime time.Time, lastOr
globals.SugarLogger.Debugf("GetMsg vendorOrderIDs:%s", utils.Format4Output(vendorOrderIDs, true))
msg.MsgData = len(vendorOrderIDs)
}
storeMap, _ := permission.GetUserStoresResultMap(ctx.GetUserID())
if storeMap[storeID] == 0 {
msg.MsgData = 0
}
}
return msg, err
}

View File

@@ -194,10 +194,10 @@ func GetAndStoreCitiesShops(ctx *jxcontext.Context, vendorIDs []int, cityCodeLis
globals.SugarLogger.Debugf("process city:%d", cityCode)
shopList, err := GetCityShops(ctx, task, vendorIDs, cityCode, radius, gridWith)
if err == nil {
dao.Begin(db)
txDB , _ := dao.Begin(db)
defer func() {
if r := recover(); r != nil {
dao.Rollback(db)
dao.Rollback(db, txDB)
panic(r)
}
}()
@@ -216,10 +216,10 @@ func GetAndStoreCitiesShops(ctx *jxcontext.Context, vendorIDs []int, cityCodeLis
}
}
if err != nil {
dao.Rollback(db)
dao.Rollback(db, txDB)
} else {
hint = utils.Int2Str(len(shopList))
dao.Commit(db)
dao.Commit(db, txDB)
}
}
globals.SugarLogger.Debugf("process city:%d, len(shopList):%d, err:%v", cityCode, len(shopList), err)

View File

@@ -14,12 +14,12 @@ import (
"git.rosy.net.cn/jx-callback/business/partner/delivery"
"git.rosy.net.cn/jx-callback/globals"
"git.rosy.net.cn/jx-callback/globals/api"
"github.com/astaxie/beego"
beego "github.com/astaxie/beego/server/web"
)
const (
maxOrderPrice = 6399 // 单位为分,达达最大价格,超过这个价格配送费会增加
maxOrderWeight = 5000 // 5公斤
maxOrderPrice = 50000 // 单位为分,达达最大价格,超过这个价格配送费会增加,2020-11-25改为50000之前是6399
maxOrderWeight = 5000 // 5公斤
)
var (
@@ -76,6 +76,7 @@ func (c *DeliveryHandler) onWaybillMsg(msg *dadaapi.CallbackMsg) (retVal *dadaap
order.Status = model.WaybillStatusNew
case dadaapi.OrderStatusAccepted:
order.Status = model.WaybillStatusAccepted
order.Remark = order.CourierName + "" + order.CourierMobile
case dadaapi.OrderStatusDelivering:
order.Status = model.WaybillStatusDelivering
case dadaapi.OrderStatusFinished:
@@ -247,6 +248,15 @@ func (c *DeliveryHandler) getBillParams(db *dao.DaoDB, order *model.GoodsOrder)
// IDeliveryPlatformHandler
func (c *DeliveryHandler) CreateWaybill(order *model.GoodsOrder, maxDeliveryFee int64) (bill *model.Waybill, err error) {
db := dao.GetDB()
if vendorOrgCode, err := dao.GetVendorOrgCode(db, model.VendorIDDada, "", model.VendorOrgTypeDelivery); err == nil {
if len(vendorOrgCode) > 0 {
if vendorOrgCode[0].IsOpen == model.YES {
return nil, fmt.Errorf("此平台配送已被系统关闭,暂不发配送 [%v]", vendorOrgCode[0].Comment)
}
}
} else {
return nil, err
}
billParams, err := c.getBillParams(db, order)
if err == nil {
if globals.EnableStoreWrite {

View File

@@ -76,7 +76,7 @@ func CalculateDeliveryFee(db *dao.DaoDB, jxStoreID int, hint string, consigneeLn
// 距离加价
distance := jxutils.WalkingDistance(lng, lat, lng2, lat2)
if distance > warningDistance {
globals.SugarLogger.Infof("[运营]计算订单配送费orderID:%s,距离%.3fkm太远,请检查门店坐标信息", hint, distance)
//globals.SugarLogger.Infof("[运营]计算订单配送费orderID:%s,距离%.3fkm太远,请检查门店坐标信息", hint, distance)
}
distanceAddFee = int64(jxutils.CalcStageValue([][]float64{
[]float64{
@@ -95,7 +95,7 @@ func CalculateDeliveryFee(db *dao.DaoDB, jxStoreID int, hint string, consigneeLn
// 重量加价
if weight > warningWeight {
globals.SugarLogger.Infof("[运营]计算订单配送费orderID:%s,重量:%dg太重,请检查商品属性", hint, weight)
//globals.SugarLogger.Infof("[运营]计算订单配送费orderID:%s,重量:%dg太重,请检查商品属性", hint, weight)
}
weightAddFee = int64(jxutils.CalcStageValue([][]float64{
[]float64{

View File

@@ -0,0 +1,84 @@
package fn
import (
"strings"
"git.rosy.net.cn/baseapi/platformapi/fnpsapi"
"git.rosy.net.cn/baseapi/utils"
"git.rosy.net.cn/jx-callback/business/jxutils"
"git.rosy.net.cn/jx-callback/business/jxutils/jxcontext"
"git.rosy.net.cn/jx-callback/business/model"
"git.rosy.net.cn/jx-callback/business/model/dao"
"git.rosy.net.cn/jx-callback/globals"
"git.rosy.net.cn/jx-callback/globals/api"
)
func (c *DeliveryHandler) CreateStore(ctx *jxcontext.Context, storeDetail *dao.StoreDetail2) (vendorStoreID string, status int, err error) {
err = api.FnAPI.CreateStore(&fnpsapi.CreateStoreParam{
ChainStoreCode: utils.Int2Str(storeDetail.ID),
ChainStoreName: globals.StoreName + "-" + storeDetail.Name,
ContactPhone: storeDetail.Tel1,
Address: storeDetail.Address,
PositionSource: 3,
Longitude: utils.Float64ToStr(jxutils.IntCoordinate2Standard(storeDetail.Lng)),
Latitude: utils.Float64ToStr(jxutils.IntCoordinate2Standard(storeDetail.Lat)),
})
if err == nil {
vendorStoreID = utils.Int2Str(storeDetail.ID)
}
return vendorStoreID, status, err
}
func shopStatus2JX(status int) (jxStatus int) {
if status == 1 {
return 0
} else {
return 1
}
}
func (c *DeliveryHandler) GetStore(ctx *jxcontext.Context, storeID int, vendorStoreID string) (storeDetail *dao.StoreDetail2, err error) {
shopInfo, err := api.FnAPI.GetStore(vendorStoreID)
if err == nil {
storeDetail = &dao.StoreDetail2{
Store: model.Store{
Name: shopInfo.ChainStoreName,
Tel1: shopInfo.ContactPhone,
Address: shopInfo.Address,
Lng: jxutils.StandardCoordinate2Int(utils.Str2Float64(shopInfo.Longitude)),
Lat: jxutils.StandardCoordinate2Int(utils.Str2Float64(shopInfo.Latitude)),
},
VendorID: model.VendorIDFengNiao,
VendorStoreID: shopInfo.ChainStoreCode,
CourierStatus: shopStatus2JX(shopInfo.Status),
}
}
return storeDetail, err
}
func (c *DeliveryHandler) IsErrStoreExist(err error) bool {
return fnpsapi.IsErrShopExist(err)
}
func (c *DeliveryHandler) IsErrStoreNotExist(err error) bool {
return fnpsapi.IsErrShopNotExist(err)
}
func (c *DeliveryHandler) UpdateStore(ctx *jxcontext.Context, storeDetail *dao.StoreDetail2) (err error) {
params := &fnpsapi.CreateStoreParam{
ChainStoreCode: utils.Int2Str(storeDetail.ID),
// ChainStoreName: globals.StoreName + "-" + storeDetail.Name,
ContactPhone: storeDetail.Tel1,
Address: storeDetail.Address,
PositionSource: 3,
Longitude: utils.Float64ToStr(jxutils.IntCoordinate2Standard(storeDetail.Lng)),
Latitude: utils.Float64ToStr(jxutils.IntCoordinate2Standard(storeDetail.Lat)),
}
if !strings.Contains(storeDetail.Name, globals.StoreName+"-") {
params.ChainStoreName = globals.StoreName + "-" + storeDetail.Name
} else {
params.ChainStoreName = storeDetail.Name
}
err = api.FnAPI.UpdateStore(params)
return err
}

View File

@@ -0,0 +1,244 @@
package fn
import (
"fmt"
"strings"
"time"
"git.rosy.net.cn/baseapi/utils"
"github.com/astaxie/beego/client/orm"
beego "github.com/astaxie/beego/server/web"
"git.rosy.net.cn/jx-callback/business/jxutils"
"git.rosy.net.cn/jx-callback/business/partner/delivery"
"git.rosy.net.cn/jx-callback/business/model/dao"
"git.rosy.net.cn/jx-callback/globals"
"git.rosy.net.cn/baseapi/platformapi/fnpsapi"
"git.rosy.net.cn/jx-callback/business/model"
"git.rosy.net.cn/jx-callback/business/partner"
"git.rosy.net.cn/jx-callback/globals/api"
)
const (
ComplaintReasonsFn150 = 150 //:未保持餐品完整,
ComplaintReasonsFn220 = 220 //:少餐错餐,
ComplaintReasonsFn160 = 160 //:服务态度恶劣,
ComplaintReasonsFn190 = 190 //:额外索取费用,
ComplaintReasonsFn170 = 170 //:诱导收货人或商户退单,
ComplaintReasonsFn140 = 140 //:提前点击送达,
ComplaintReasonsFn210 = 210 //:虚假标记异常,
ComplaintReasonsFn200 = 200 //:虚假点击配送成功,
ComplaintReasonsFn130 = 130 //:未进行配送,导致订单失败或取消,
ComplaintReasonsFn120 = 120 //:配送超时
)
var (
curDeliveryHandler *DeliveryHandler
complaintReson2FnResonMap = map[int]int{
model.ComplaintReasons1: ComplaintReasonsFn160,
model.ComplaintReasons2: ComplaintReasonsFn130,
model.ComplaintReasons3: ComplaintReasonsFn130,
model.ComplaintReasons4: ComplaintReasonsFn120,
model.ComplaintReasons5: ComplaintReasonsFn130,
model.ComplaintReasons6: ComplaintReasonsFn150,
model.ComplaintReasons7: ComplaintReasonsFn190,
model.ComplaintReasons69: ComplaintReasonsFn170,
model.ComplaintReasons71: ComplaintReasonsFn140,
}
)
type DeliveryHandler struct {
}
func init() {
if api.FnAPI != nil {
curDeliveryHandler = new(DeliveryHandler)
partner.RegisterDeliveryPlatform(curDeliveryHandler, true)
}
}
func (c *DeliveryHandler) GetVendorID() int {
return model.VendorIDFengNiao
}
func (c *DeliveryHandler) CancelWaybill(bill *model.Waybill, cancelReasonID int, cancelReason string) (err error) {
err = api.FnAPI.CancelOrder(&fnpsapi.CancelOrderParam{
PartnerOrderCode: bill.VendorOrderID,
OrderCancelReasonCode: 1, //用户取消
OrderCancelCode: fnpsapi.OrderCancelReson9,
OrderCancelTime: time.Now().UnixNano() / 1e6,
})
if err != nil {
if strings.Contains(err.Error(), "运单暂未生成") {
err = nil
}
}
bill.Status = model.WaybillStatusCanceled
bill.Remark = cancelReason
partner.CurOrderManager.OnWaybillStatusChanged(bill)
return err
}
func (c *DeliveryHandler) ComplaintRider(bill *model.Waybill, resonID int, resonContent string) (err error) {
err = api.FnAPI.ComplaintRider(bill.VendorOrderID, complaintReson2FnResonMap[resonID])
return err
}
func (c *DeliveryHandler) CreateWaybill(order *model.GoodsOrder, maxDeliveryFee int64) (bill *model.Waybill, err error) {
var (
db = dao.GetDB()
)
if vendorOrgCode, err := dao.GetVendorOrgCode(db, model.VendorIDFengNiao, "", model.VendorOrgTypeDelivery); err == nil {
if len(vendorOrgCode) > 0 {
if vendorOrgCode[0].IsOpen == model.YES {
return nil, fmt.Errorf("此平台配送已被系统关闭,暂不发配送 [%v]", vendorOrgCode[0].Comment)
}
}
} else {
return nil, err
}
storeDetail, err := dao.GetStoreDetail(db, order.StoreID, order.VendorID, order.VendorOrgCode)
deliveryFee, _, err := delivery.CalculateOrderDeliveryFee(order, time.Now(), db)
if err == nil {
if err = delivery.CallCreateWaybillPolicy(deliveryFee, maxDeliveryFee, order, model.VendorIDFengNiao); err != nil {
return nil, err
}
params := &fnpsapi.CreateOrderParam{
PartnerOrderCode: order.VendorOrderID,
NotifyURL: globals.FnNotifyURL,
ChainStoreCode: utils.Int2Str(jxutils.GetSaleStoreIDFromOrder(order)),
OrderType: 1, //即时达
TransportInfo: &fnpsapi.TransportInfo{
TransportName: order.StoreName,
TransportAddress: storeDetail.Address,
TransportLongitude: jxutils.IntCoordinate2Standard(storeDetail.Lng),
TransportLatitude: jxutils.IntCoordinate2Standard(storeDetail.Lat),
PositionSource: 3,
TransportTel: storeDetail.Tel1,
},
OrderAddTime: order.OrderCreatedAt.UnixNano() / 1e6,
OrderTotalAmount: jxutils.IntPrice2Standard(order.SalePrice),
OrderActualAmount: jxutils.IntPrice2Standard(order.ActualPayPrice),
OrderWeight: float64(jxutils.IntWeight2Float(order.Weight)),
OrderRemark: utils.FilterMb4("客户电话:" + order.ConsigneeMobile + "," + order.BuyerComment + "取货失败或配送遇到问题请联系18048531223禁止未配送直接完成定单"),
IsInvoiced: 0,
OrderPaymentStatus: 1,
OrderPaymentMethod: 1,
IsAgentPayment: 0,
GoodsCount: order.GoodsCount,
ReceiverInfo: &fnpsapi.ReceiverInfo{
ReceiverName: order.ConsigneeName,
ReceiverAddress: order.ConsigneeAddress,
ReceiverLongitude: jxutils.IntCoordinate2Standard(order.ConsigneeLng),
ReceiverLatitude: jxutils.IntCoordinate2Standard(order.ConsigneeLat),
ReceiverPrimaryPhone: order.ConsigneeMobile,
ReceiverSecondPhone: order.ConsigneeMobile2,
PositionSource: 3,
},
SerialNumber: model.VendorNames[order.VendorID] + " #" + utils.Int2Str(order.OrderSeq),
}
var skuInfo []*fnpsapi.ItemsJSON
for _, v := range order.Skus {
skuInfo = append(skuInfo, &fnpsapi.ItemsJSON{
ItemID: utils.Int2Str(v.SkuID),
ItemName: v.SkuName,
ItemQuantity: v.Count,
ItemPrice: jxutils.IntPrice2Standard(v.SalePrice),
ItemActualPrice: jxutils.IntPrice2Standard(v.SalePrice),
})
}
params.ItemsJSON = skuInfo
//要求饿百的订单要传来源
if order.VendorID == model.VendorIDEBAI {
params.OrderSource = "109"
params.ChannelOrderCode = order.VendorOrderID
}
err = api.FnAPI.CreateOrder(params)
if err == nil {
bill = &model.Waybill{
VendorOrderID: order.VendorOrderID,
OrderVendorID: order.VendorID,
VendorWaybillID: "",
VendorWaybillID2: "",
WaybillVendorID: model.VendorIDFengNiao,
DesiredFee: deliveryFee,
}
delivery.OnWaybillCreated(bill)
} else {
globals.SugarLogger.Debugf("CreateWaybill failed, orderID:%s, billParams:%v, error:%v", order.VendorOrderID, params, err)
}
}
return bill, err
}
func (c *DeliveryHandler) getMTPSShopID(order *model.GoodsOrder, db *dao.DaoDB) (retVal string, err error) {
saleStoreID := jxutils.GetSaleStoreIDFromOrder(order)
storeCourierList, err2 := dao.GetOpenedStoreCouriersByStoreID(db, saleStoreID, model.VendorIDFengNiao)
if err = err2; err != nil && err != orm.ErrNoRows {
return "", err
}
if len(storeCourierList) == 0 {
return "", partner.ErrStoreHaveNoCourier
}
retVal = storeCourierList[0].VendorStoreID
if beego.BConfig.RunMode == "dev" {
retVal = "test_0001"
}
return retVal, nil
}
func (c *DeliveryHandler) GetWaybillFee(order *model.GoodsOrder) (deliveryFeeInfo *partner.WaybillFeeInfo, err error) {
db := dao.GetDB()
deliveryFeeInfo = &partner.WaybillFeeInfo{}
deliveryFeeInfo.RefDeliveryFee, deliveryFeeInfo.RefAddFee, err = delivery.CalculateOrderDeliveryFee(order, time.Now(), db)
if err == nil {
if _, err = c.getMTPSShopID(order, db); err == nil {
deliveryFeeInfo.DeliveryFee = deliveryFeeInfo.RefDeliveryFee
}
}
return deliveryFeeInfo, err
}
func OnWaybillMsg(msg *fnpsapi.WayBillInfo) {
order := &model.Waybill{
VendorWaybillID: utils.Int64ToStr(msg.OpenOrderCode),
VendorWaybillID2: msg.PartnerOrderCode,
WaybillVendorID: model.VendorIDFengNiao,
CourierName: msg.CarrierDriverName,
CourierMobile: msg.CarrierDriverPhone,
VendorStatus: utils.Int2Str(msg.OrderStatus),
StatusTime: utils.Timestamp2Time(msg.PushTime),
Remark: msg.Description,
}
order.VendorOrderID, order.OrderVendorID = jxutils.SplitUniversalOrderID(msg.PartnerOrderCode)
switch msg.OrderStatus {
case fnpsapi.OrderStatusAccept:
order.Status = model.WaybillStatusNew
case fnpsapi.OrderStatusAssigned:
order.DesiredFee = GetDesiredFee(order.VendorOrderID)
order.Status = model.WaybillStatusAccepted
order.Remark = order.CourierName + "" + order.CourierMobile
case fnpsapi.OrderStatusArrived:
order.DesiredFee = GetDesiredFee(order.VendorOrderID)
order.Status = model.WaybillStatusCourierArrived
case fnpsapi.OrderStatusDelivering:
order.Status = model.WaybillStatusDelivering
case fnpsapi.OrderStatusDelivered:
order.Status = model.WaybillStatusDelivered
case fnpsapi.OrderStatusException:
order.Status = model.WaybillStatusDeliverFailed
default:
globals.SugarLogger.Warnf("onWaybillMsg unknown msg:%v", msg)
}
partner.CurOrderManager.OnWaybillStatusChanged(order)
}
func GetDesiredFee(vendorOrderID string) (desiredFee int64) {
if result, err := api.FnAPI.QueryOrder(vendorOrderID); err == nil {
return jxutils.StandardPrice2Int(result.OrderTotalDeliveryCost)
}
return desiredFee
}

View File

@@ -51,7 +51,7 @@ func (c *DeliveryHandler) IsErrStoreExist(err error) bool {
}
func (c *DeliveryHandler) CreateWaybill(order *model.GoodsOrder, maxDeliveryFee int64) (bill *model.Waybill, err error) {
storeID := jxutils.GetShowStoreIDFromOrder(order)
stores, err := dao.GetStoreList(dao.GetDB(), []int{storeID}, nil, nil, nil, "")
stores, err := dao.GetStoreList(dao.GetDB(), []int{storeID}, nil, nil, nil, nil, "")
if len(stores) == 0 || err != nil {
return bill, fmt.Errorf("未查询到该门店! 门店id [%v]", storeID)
}
@@ -65,8 +65,8 @@ func (c *DeliveryHandler) CreateWaybill(order *model.GoodsOrder, maxDeliveryFee
ReceiveName: order.ConsigneeName,
ReceiveAddress: order.ConsigneeAddress,
ReceiveTel: order.ConsigneeMobile,
Weight: order.Weight,
Vloumn: order.Weight,
Weight: utils.Int2Float64(order.Weight),
Vloumn: utils.Int2Float64(order.Weight),
PackageCount: 1,
Description: "生鲜",
Aging: 5,

View File

@@ -10,6 +10,7 @@ import (
"git.rosy.net.cn/jx-callback/business/partner"
"git.rosy.net.cn/jx-callback/globals"
"git.rosy.net.cn/jx-callback/globals/api"
"time"
)
const (
@@ -18,10 +19,12 @@ const (
var (
auditStatusMap = map[int]int{
mtpsapi.ShopStatusAuditCreated: model.StoreAuditStatusCreated,
mtpsapi.ShopStatusAuditRejected: model.StoreAuditStatusRejected,
mtpsapi.ShopStatusAuditPassed: model.StoreAuditStatusCreated,
mtpsapi.ShopStatusAuditOnline: model.StoreAuditStatusOnline,
mtpsapi.ShopStatusAuditCreated: model.StoreAuditStatusCreated,
mtpsapi.ShopStatusAuditRejected: model.StoreAuditStatusRejected,
mtpsapi.ShopStatusAuditPassed: model.StoreAuditStatusCreated,
mtpsapi.ShopStatusAuditOnline: model.StoreAuditStatusOnline,
mtpsapi.ShopStatusAuditUpdatePassed: model.StoreAuditStatusOnline,
mtpsapi.ShopStatusAuditUpdateRejected: model.StoreAuditStatusRejected,
}
)
@@ -38,7 +41,7 @@ func OnStoreStatus(msg *mtpsapi.CallbackShopStatusMsg) (retVal *mtpsapi.Callback
func (c *DeliveryHandler) OnStoreStatus(msg *mtpsapi.CallbackShopStatusMsg) (retVal *mtpsapi.CallbackResponse) {
globals.SugarLogger.Debugf("mtps OnStoreStatus, msg:%s", utils.Format4Output(msg, true))
err := partner.CurStoreManager.OnCourierStoreStatusChanged(jxcontext.AdminCtx, msg.ShopID, model.VendorIDMTPS, getAuditStatus(msg.Status))
err := partner.CurStoreManager.OnCourierStoreStatusChanged(jxcontext.AdminCtx, msg.ShopID, model.VendorIDMTPS, getAuditStatus(msg.Status), msg.RejectMessage)
retVal = mtpsapi.Err2CallbackResponse(err, "mtps OnStoreStatus")
return retVal
}
@@ -52,18 +55,19 @@ func (c *DeliveryHandler) CreateStore(ctx *jxcontext.Context, storeDetail *dao.S
},
}
shopInfo := &mtpsapi.ShopInfo{
ShopID: storeDetail.VendorStoreID,
ShopName: storeDetail.Name,
Category: mtpsapi.ShopCategoryFruit,
SecondCategory: mtpsapi.ShopCategoryFruitFruit,
ContactName: storeDetail.PayeeName,
ContactPhone: storeDetail.Tel1,
ContactEmail: fakeContactEmail,
ShopAddress: storeDetail.Address,
ShopLng: storeDetail.Lng,
ShopLat: storeDetail.Lat,
CoordinateType: mtpsapi.CoordinateTypeMars,
BusinessHours: string(utils.MustMarshal(businessHours)),
ShopID: storeDetail.VendorStoreID,
ShopName: storeDetail.Name,
Category: mtpsapi.ShopCategoryFruit,
SecondCategory: mtpsapi.ShopCategoryFruitFruit,
ContactName: storeDetail.PayeeName,
ContactPhone: storeDetail.Tel1,
ContactEmail: fakeContactEmail,
ShopAddress: storeDetail.Address,
ShopLng: storeDetail.Lng,
ShopLat: storeDetail.Lat,
CoordinateType: mtpsapi.CoordinateTypeMars,
BusinessHours: string(utils.MustMarshal(businessHours)),
DeliveryServiceCodes: utils.Int2Str(mtpsapi.DeliveryServiceCodeRapid),
}
shopStatus := mtpsapi.ShopStatusAuditCreated
if globals.EnableStoreWrite {
@@ -98,11 +102,20 @@ func (c *DeliveryHandler) GetStore(ctx *jxcontext.Context, storeID int, vendorSt
// CourierStatus: model.StoreStatusOpened,
// AuditStatus: model.StoreAuditStatusOnline,
}
result, err := api.MtpsAPI.GetStoreStatus(shopInfo.ShopName)
if err == nil {
storeDetail.AuditStatus = mtpsOpenTypeToJx(result.DataList[0].OpenType)
storeDetail.CourierStatus = mtpsOpenTypeToJx2(result.DataList[0].OpenType)
_, err = api.MtpsAPI.CheckOrder(shopInfo.ShopID, shopInfo.ShopAddress, int64(shopInfo.ShopLng), int64(shopInfo.ShopLat), time.Now().Unix())
//result, err := api.MtpsAPI.GetStoreStatus(shopInfo.ShopName)
//if err == nil {
// storeDetail.AuditStatus = mtpsOpenTypeToJx(result.DataList[0].OpenType)
// storeDetail.CourierStatus = mtpsOpenTypeToJx2(result.DataList[0].OpenType)
//}
if mtpsapi.IsOpen(err) {
storeDetail.AuditStatus = model.StoreAuditStatusOnline
storeDetail.CourierStatus = model.StoreStatusOpened
} else {
storeDetail.AuditStatus = model.StoreAuditStatusRejected
storeDetail.CourierStatus = model.StoreStatusClosed
}
err = nil
}
return storeDetail, err
}
@@ -134,8 +147,17 @@ func (c *DeliveryHandler) IsErrStoreExist(err error) bool {
}
func (c *DeliveryHandler) UpdateStore(ctx *jxcontext.Context, storeDetail *dao.StoreDetail2) (err error) {
// if globals.EnableStoreWrite {
// err = api.MtpsAPI.PagePoiUpdate(storeDetail.VendorStoreID, storeDetail.PayeeName, storeDetail.Tel1, fakeContactEmail)
// }
if globals.EnableStoreWrite {
// err = api.MtpsAPI.PagePoiUpdate(storeDetail.VendorStoreID, storeDetail.PayeeName, storeDetail.Tel1, fakeContactEmail)
shopInfo := &mtpsapi.ShopInfo{
ShopID: utils.Int2Str(storeDetail.ID),
ContactName: storeDetail.PayeeName,
ContactPhone: storeDetail.Tel1,
ShopAddress: storeDetail.Address,
ShopLat: storeDetail.Lat,
ShopLng: storeDetail.Lng,
}
_, err = api.MtpsAPI.ShopUpdate(shopInfo)
}
return err
}

View File

@@ -20,8 +20,8 @@ import (
"git.rosy.net.cn/jx-callback/business/partner/delivery"
"git.rosy.net.cn/jx-callback/globals"
"git.rosy.net.cn/jx-callback/globals/api"
"github.com/astaxie/beego"
"github.com/astaxie/beego/orm"
"github.com/astaxie/beego/client/orm"
beego "github.com/astaxie/beego/server/web"
)
const (
@@ -94,6 +94,7 @@ func (c *DeliveryHandler) onWaybillMsg(msg *mtpsapi.CallbackOrderMsg) (retVal *m
case mtpsapi.OrderStatusAccepted:
order.DesiredFee, _ = delivery.CalculateBillDeliveryFee(order) // 美团外卖可能会丢失新运单事件,这里补一下
order.Status = model.WaybillStatusAccepted
order.Remark = order.CourierName + "" + order.CourierMobile
case mtpsapi.OrderStatusPickedUp:
order.Status = model.WaybillStatusDelivering
case mtpsapi.OrderStatusDeliverred:
@@ -190,6 +191,15 @@ func (c *DeliveryHandler) GetWaybillFee(order *model.GoodsOrder) (deliveryFeeInf
// IDeliveryPlatformHandler
func (c *DeliveryHandler) CreateWaybill(order *model.GoodsOrder, maxDeliveryFee int64) (bill *model.Waybill, err error) {
db := dao.GetDB()
if vendorOrgCode, err := dao.GetVendorOrgCode(db, model.VendorIDMTPS, "", model.VendorOrgTypeDelivery); err == nil {
if len(vendorOrgCode) > 0 {
if vendorOrgCode[0].IsOpen == model.YES {
return nil, fmt.Errorf("此平台配送已被系统关闭,暂不发配送 [%v]", vendorOrgCode[0].Comment)
}
}
} else {
return nil, err
}
deliveryFee, _, err := delivery.CalculateOrderDeliveryFee(order, time.Now(), db)
if err == nil {
if err = delivery.CallCreateWaybillPolicy(deliveryFee, maxDeliveryFee, order, model.VendorIDMTPS); err != nil {

View File

@@ -129,7 +129,7 @@ type IOrderManager interface {
type IStoreManager interface {
OnStoreStatusChanged(vendorStoreID string, vendorID int, storeStatus int) (err error)
OnCourierStoreStatusChanged(ctx *jxcontext.Context, vendorStoreID string, vendorID int, auditStatus int) (err error)
OnCourierStoreStatusChanged(ctx *jxcontext.Context, vendorStoreID string, vendorID int, auditStatus int, message string) (err error)
}
// purchase handler中
@@ -149,7 +149,7 @@ type IPurchasePlatformHandler interface {
// Store
ReadStore(ctx *jxcontext.Context, vendorOrgCode, vendorStoreID string) (store *dao.StoreDetail, err error)
UpdateStore(db *dao.DaoDB, storeID int, userName string) (err error)
CreateStore2(db *dao.DaoDB, storeID int, userName string) (vendorStoreID string, err error)
CreateStore2(db *dao.DaoDB, storeID int, userName string, params map[string]interface{}, storeDetail *dao.StoreDetail) (vendorStoreID string, err error)
DeleteStore(db *dao.DaoDB, storeID int, userName string) (err error)
GetStoreStatus(ctx *jxcontext.Context, vendorOrgCode string, storeID int, vendorStoreID string) (storeStatus int, err error)
UpdateStoreCustomID(ctx *jxcontext.Context, vendorOrgCode, vendorStoreID string, storeID int64) (err error)
@@ -157,6 +157,7 @@ type IPurchasePlatformHandler interface {
RefreshAllStoresID(ctx *jxcontext.Context, parentTask tasksch.ITask, isAsync bool) (hint string, err error)
UploadImg(ctx *jxcontext.Context, vendorOrgCode, imgURL string, imgData []byte, imgName string, imgType int) (imgHint string, err error)
UpdateStoreLineStatus(ctx *jxcontext.Context, vendorOrgCode string, storeID int, vendorStoreID string, lineStatus int) (err error)
}
// db *dao.DaoDB,

View File

@@ -23,6 +23,9 @@ type IPurchasePlatformActHandler interface {
// CancelAct(ctx *jxcontext.Context, parentTask tasksch.ITask, act *model.Act2, actStoreSku []*model.ActStoreSku2) (err error)
SyncAct(ctx *jxcontext.Context, parentTask tasksch.ITask, act *model.Act2, actOrderRules []*model.ActOrderRule, actStoreSkuList []*model.ActStoreSku2) (err error)
//活动丰富度
GetActAmple(ctx *jxcontext.Context, vendorStoreID, vendorOrgCode string) (ample int, err error)
}
type IPurchasePlatformPageActHandler interface {

Some files were not shown because too many files have changed in this diff Show More