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