Compare commits
465
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
624b7d7d6e | ||
|
|
0b61b813a5 | ||
|
|
6252866f7c | ||
|
|
15c8a2b6e6 | ||
|
|
4b434a2cd2 | ||
|
|
0376f8328c | ||
|
|
58e3882ef4 | ||
|
|
1d96322370 | ||
|
|
19857686aa | ||
|
|
d079e35374 | ||
|
|
466a9fa31f | ||
|
|
d74a28bceb | ||
|
|
1cc123917b | ||
|
|
39ebcb70ed | ||
|
|
e7e64252e7 | ||
|
|
a400a34b0c | ||
|
|
ac349ea8a8 | ||
|
|
7356208228 | ||
|
|
5963f6ed3a | ||
|
|
6f28cfdda0 | ||
|
|
5c472ad04e | ||
|
|
070cdcd5de | ||
|
|
061c5bc600 | ||
|
|
e5fea50466 | ||
|
|
6a87c5a75a | ||
|
|
63dcfaf028 | ||
|
|
c80e4b3ca3 | ||
|
|
3240e57c3e | ||
|
|
e35fa7d48e | ||
|
|
d5bdb5b419 | ||
|
|
fd1436da9c | ||
|
|
802a2994cc | ||
|
|
3d3036cebf | ||
|
|
123a5af241 | ||
|
|
da31a81415 | ||
|
|
84d4df0809 | ||
|
|
d17146dc4b | ||
|
|
44e9eb47bc | ||
|
|
bc9a4f7204 | ||
|
|
b37edf7c63 | ||
|
|
f6125e68bf | ||
|
|
d6037d5846 | ||
|
|
df51abe33f | ||
|
|
5cf46604fa | ||
|
|
208024a6cc | ||
|
|
1d01431354 | ||
|
|
cbaab0ffee | ||
|
|
a310c9dfa6 | ||
|
|
3866bfee05 | ||
|
|
5032cf2413 | ||
|
|
a10cfb0f55 | ||
|
|
59ede5ceb7 | ||
|
|
de4d4fa70d | ||
|
|
7e496834ae | ||
|
|
300b5ac239 | ||
|
|
9519d8610b | ||
|
|
064a87e751 | ||
|
|
9e2dc508a8 | ||
|
|
6a84abf6dd | ||
|
|
8b4e785de3 | ||
|
|
c95fdfc067 | ||
|
|
40a906a9fb | ||
|
|
d91aadca0b | ||
|
|
898cc32452 | ||
|
|
6cf2a8bc74 | ||
|
|
bce9969589 | ||
|
|
b73eb84b87 | ||
|
|
7d0d24ea77 | ||
|
|
dd5280ab78 | ||
|
|
bc6b2ba777 | ||
|
|
f58691615b | ||
|
|
15fdace0bc | ||
|
|
0904b78846 | ||
|
|
734b51bfec | ||
|
|
784d04ebec | ||
|
|
b29632cebc | ||
|
|
3211cfe892 | ||
|
|
32e8be5363 | ||
|
|
207734c75e | ||
|
|
8eb280f2b9 | ||
|
|
14a5aedf15 | ||
|
|
d4f660bc7e | ||
|
|
64bb96c97c | ||
|
|
9df65779ad | ||
|
|
176a0aa879 | ||
|
|
1241256787 | ||
|
|
5e65d63a4f | ||
|
|
296176c85e | ||
|
|
993746ee41 | ||
|
|
6a0818350a | ||
|
|
1b8a75aea5 | ||
|
|
76a290dc58 | ||
|
|
969d90fff5 | ||
|
|
23b5f96a0c | ||
|
|
02de8706e2 | ||
|
|
e6aa8d59e2 | ||
|
|
4b29406701 | ||
|
|
1c29c7e5e4 | ||
|
|
add7ef60db | ||
|
|
d14cea759a | ||
|
|
4fde6e1a9c | ||
|
|
0f88ad75b9 | ||
|
|
067fe1c2c9 | ||
|
|
6b2adce82f | ||
|
|
bee31cf944 | ||
|
|
552a685bb1 | ||
|
|
1c46de4fb7 | ||
|
|
a66177e21b | ||
|
|
fedeece533 | ||
|
|
ae138915ae | ||
|
|
57b8dcfb02 | ||
|
|
b45af55cdd | ||
|
|
3991496617 | ||
|
|
261bb07fb0 | ||
|
|
b18fa5938a | ||
|
|
ba3a90471a | ||
|
|
c5a39d23f2 | ||
|
|
cb136a19b4 | ||
|
|
0f26cd3d0d | ||
|
|
57649dbdfa | ||
|
|
b55c890f7e | ||
|
|
315d96063a | ||
|
|
897e5f195f | ||
|
|
b5b7143d7c | ||
|
|
f06c210ae9 | ||
|
|
4f38ac7cd6 | ||
|
|
488fdfc50e | ||
|
|
1cdc1878a0 | ||
|
|
2c91368278 | ||
|
|
c0f70715c7 | ||
|
|
c93445ca4c | ||
|
|
cb9d09c899 | ||
|
|
f3aec5d42f | ||
|
|
bcd7991725 | ||
|
|
db5e0e1a66 | ||
|
|
ba8dbdd859 | ||
|
|
f1967dd40f | ||
|
|
505f0aff5e | ||
|
|
b9dd2999f1 | ||
|
|
091c971f30 | ||
|
|
2de4efbe65 | ||
|
|
e5ef8740de | ||
|
|
661e57ce62 | ||
|
|
49233cf19b | ||
|
|
b96db591f2 | ||
|
|
236b047f5e | ||
|
|
feba6ff672 | ||
|
|
8caf83b823 | ||
|
|
789c9ac29c | ||
|
|
925eeba899 | ||
|
|
568ce3f96d | ||
|
|
56b39702b5 | ||
|
|
0ee27d796f | ||
|
|
7842ceaf71 | ||
|
|
987a7c564d | ||
|
|
18c8c4d18d | ||
|
|
0f4da97358 | ||
|
|
2787f7651e | ||
|
|
b9fe4bc4d2 | ||
|
|
7a6c570a88 | ||
|
|
f1567eb81e | ||
|
|
885d38565c | ||
|
|
8414fa1509 | ||
|
|
4b382e4d8f | ||
|
|
b80668145a | ||
|
|
476d7c8b0e | ||
|
|
93dd653ca9 | ||
|
|
f84c7b0843 | ||
|
|
3feb3851e4 | ||
|
|
38a04d6d30 | ||
|
|
81841b7ad0 | ||
|
|
e366f78081 | ||
|
|
a12ac94dd3 | ||
|
|
d1ce20abae | ||
|
|
df6b11a8bb | ||
|
|
c58112a719 | ||
|
|
a4a29c7c8e | ||
|
|
9283cc9df8 | ||
|
|
076c915a4c | ||
|
|
55c958bde5 | ||
|
|
ef53355b87 | ||
|
|
c5babe103e | ||
|
|
287ae8f22b | ||
|
|
04545a8219 | ||
|
|
1779bc2b23 | ||
|
|
2a56ce433f | ||
|
|
2dd8e7f0a2 | ||
|
|
b8605c6b43 | ||
|
|
5fec54ac63 | ||
|
|
564b8ff8aa | ||
|
|
76a5c987b2 | ||
|
|
f6ee1a3eee | ||
|
|
1297f920be | ||
|
|
d4ba4f0c0b | ||
|
|
0ed45fee69 | ||
|
|
69412f7293 | ||
|
|
2bd4d5bb63 | ||
|
|
8b9b29dbf1 | ||
|
|
5890660fe4 | ||
|
|
fa6ccad965 | ||
|
|
95d232623b | ||
|
|
e12beb1e0c | ||
|
|
8c722deac6 | ||
|
|
a1494846db | ||
|
|
0d70450997 | ||
|
|
6c6649368c | ||
|
|
92d53ad90d | ||
|
|
8b9cd8c749 | ||
|
|
498574763b | ||
|
|
c200645a15 | ||
|
|
c852ef1b8b | ||
|
|
674f56b2c2 | ||
|
|
44e7581b2c | ||
|
|
01b2723e1f | ||
|
|
489515f865 | ||
|
|
d8aa1e9490 | ||
|
|
07d9dacded | ||
|
|
538a3b42bd | ||
|
|
f660c66027 | ||
|
|
c1e062082a | ||
|
|
55dfb6f4a1 | ||
|
|
1f84ad71d8 | ||
|
|
4d0eb901c9 | ||
|
|
23984e69d6 | ||
|
|
a1f4953fb5 | ||
|
|
25ed516000 | ||
|
|
9f2e8f1855 | ||
|
|
1488405397 | ||
|
|
ad55d49d6b | ||
|
|
7aa7576799 | ||
|
|
96c95dabc6 | ||
|
|
f3fc2b3093 | ||
|
|
a112aa1163 | ||
|
|
e77937fb89 | ||
|
|
6b78248531 | ||
|
|
57cce338b1 | ||
|
|
33a6e875ce | ||
|
|
cdc098fdd3 | ||
|
|
e544b76db6 | ||
|
|
4f727fadc1 | ||
|
|
5b98ae9435 | ||
|
|
82909efe6b | ||
|
|
21db85ef2b | ||
|
|
f32f43ab18 | ||
|
|
eb3ada8335 | ||
|
|
49f6832d3f | ||
|
|
60bc140195 | ||
|
|
d268718f9b | ||
|
|
895c8d6a4b | ||
|
|
914a751d96 | ||
|
|
fc16c1edf2 | ||
|
|
4bd655e4da | ||
|
|
a96b03a060 | ||
|
|
8681042a32 | ||
|
|
44c9953875 | ||
|
|
c48b8aa39a | ||
|
|
36b31e5d52 | ||
|
|
f5c096fe39 | ||
|
|
75e77c0476 | ||
|
|
709b151e3f | ||
|
|
fa731e1fa5 | ||
|
|
d1448b2746 | ||
|
|
32d38b7721 | ||
|
|
ebc7bee5be | ||
|
|
19ca4bbe6c | ||
|
|
2f6988abac | ||
|
|
e322e28d05 | ||
|
|
9f70b236a0 | ||
|
|
7dcedab498 | ||
|
|
e2f5896be2 | ||
|
|
effa681709 | ||
|
|
8ea6a82acd | ||
|
|
e7f2a79dee | ||
|
|
8a78122fcb | ||
|
|
49b3722328 | ||
|
|
cb96a3700d | ||
|
|
9250d03ab1 | ||
|
|
494f49ee1b | ||
|
|
be597775d9 | ||
|
|
9eff15e483 | ||
|
|
496548558b | ||
|
|
7bd2e0b87c | ||
|
|
266d416912 | ||
|
|
f2216adb06 | ||
|
|
b825f1a789 | ||
|
|
6177b70b34 | ||
|
|
30dd4abe43 | ||
|
|
5dd23e9f42 | ||
|
|
f91a2248af | ||
|
|
b4db0a8cdb | ||
|
|
65fd1e6a19 | ||
|
|
bab7f048eb | ||
|
|
f543c4a00f | ||
|
|
98004ba989 | ||
|
|
76c8b1f5aa | ||
|
|
8542a25238 | ||
|
|
22590abbb8 | ||
|
|
bb68e118fa | ||
|
|
1d28170d46 | ||
|
|
1b85098063 | ||
|
|
d6d9ee1d5e | ||
|
|
2d9a4eaad2 | ||
|
|
1423d5d140 | ||
|
|
80e1639b83 | ||
|
|
07862301e6 | ||
|
|
d6fae412cd | ||
|
|
7ee70dd06c | ||
|
|
6f33fc3b64 | ||
|
|
a9e3d6cb6b | ||
|
|
5fe5ce7e82 | ||
|
|
5cc987c2c4 | ||
|
|
9ed1797b59 | ||
|
|
2373be59e6 | ||
|
|
587550025d | ||
|
|
9dfcf4ef5a | ||
|
|
914957e683 | ||
|
|
a852c0844e | ||
|
|
50b10ad19f | ||
|
|
aff19e1536 | ||
|
|
4c58838842 | ||
|
|
d27cca0217 | ||
|
|
6f5fa138d9 | ||
|
|
cf0a42ec8a | ||
|
|
5c591d3b57 | ||
|
|
165927bc3d | ||
|
|
2d03084f0c | ||
|
|
1f0703bc64 | ||
|
|
9bb5a7c2cf | ||
|
|
a7eed8590f | ||
|
|
4fad415cb7 | ||
|
|
a23a4acef3 | ||
|
|
0cd0a9535d | ||
|
|
71765b339f | ||
|
|
521e4ca5bd | ||
|
|
47688bfe34 | ||
|
|
b0999402cd | ||
|
|
dde4698fc6 | ||
|
|
5513b0af08 | ||
|
|
357fb0bd65 | ||
|
|
16627950e2 | ||
|
|
81dc017b68 | ||
|
|
80b96b0f17 | ||
|
|
d683774b88 | ||
|
|
20f60d490f | ||
|
|
73f7bbd803 | ||
|
|
5029ae8d42 | ||
|
|
87eea6a8cd | ||
|
|
72b2a153a0 | ||
|
|
7326407d13 | ||
|
|
4091f20e7a | ||
|
|
7bcf11baaf | ||
|
|
11ad2ea20f | ||
|
|
b303c78b39 | ||
|
|
2fb7d117c0 | ||
|
|
cdb21fe961 | ||
|
|
2151555f31 | ||
|
|
ce4f56962f | ||
|
|
c3b4923ce9 | ||
|
|
c536d2c5c6 | ||
|
|
fad5eb66fa | ||
|
|
52172dc3d7 | ||
|
|
34a146514f | ||
|
|
8377d9f2a5 | ||
|
|
0f2e2e769b | ||
|
|
73b1a76cb6 | ||
|
|
81c30d752d | ||
|
|
38b2de852b | ||
|
|
35122c0fca | ||
|
|
f1c7dd453b | ||
|
|
f1aa799809 | ||
|
|
d5dfa96859 | ||
|
|
23fe5eca9c | ||
|
|
69d5276bd9 | ||
|
|
876430874c | ||
|
|
24c234bcb7 | ||
|
|
c52b9f092e | ||
|
|
61b68804f0 | ||
|
|
23bffb32b3 | ||
|
|
9f9b0867ac | ||
|
|
1a309cb042 | ||
|
|
226360ef3a | ||
|
|
444b6add0a | ||
|
|
46757ed2f1 | ||
|
|
1548a28c9e | ||
|
|
2755ed1a33 | ||
|
|
5030ca2a8a | ||
|
|
4852b4496a | ||
|
|
e2bfb032a7 | ||
|
|
762c9d4bf4 | ||
|
|
f4f2573af7 | ||
|
|
1381bcee72 | ||
|
|
bbe8ce3523 | ||
|
|
7ae6ed2aac | ||
|
|
d45206a644 | ||
|
|
f7faed5e44 | ||
|
|
fa5f8d68cc | ||
|
|
b0a28a101e | ||
|
|
b24d02f4a6 | ||
|
|
a9aba71e0c | ||
|
|
687404b47f | ||
|
|
d4e3b36974 | ||
|
|
162f35b752 | ||
|
|
9cb99c915d | ||
|
|
9a58a7b41c | ||
|
|
3c594d4a91 | ||
|
|
dc9d491d61 | ||
|
|
d0cde81dcd | ||
|
|
81cd4b3317 | ||
|
|
442ca4977c | ||
|
|
2abdb6e8d1 | ||
|
|
53e9f977a1 | ||
|
|
1dcd38aaa2 | ||
|
|
50b7be1e4f | ||
|
|
4ce7b3afec | ||
|
|
aeff793901 | ||
|
|
187bddc820 | ||
|
|
360cb8d95c | ||
|
|
a589cfd3af | ||
|
|
f80b0bbddb | ||
|
|
76596ac927 | ||
|
|
2a33823ef2 | ||
|
|
930894b37e | ||
|
|
02acda9e23 | ||
|
|
41fa3991d9 | ||
|
|
a221c05ec9 | ||
|
|
57fb245715 | ||
|
|
79cda62fb4 | ||
|
|
0fba417b77 | ||
|
|
ed8d3fafd9 | ||
|
|
fea9ac6277 | ||
|
|
8e1cd9b185 | ||
|
|
bc2fc833a2 | ||
|
|
196410331b | ||
|
|
9351bd8816 | ||
|
|
429c279b78 | ||
|
|
4a6421c9cf | ||
|
|
9e71401716 | ||
|
|
fceaf38db9 | ||
|
|
4a90bbd9ad | ||
|
|
4ced5f9b65 | ||
|
|
07d43b393d | ||
|
|
ab0c0fdc17 | ||
|
|
0425b41cf4 | ||
|
|
9e3cedb596 | ||
|
|
5678399a34 | ||
|
|
dc0416510b | ||
|
|
cf85ffa37f | ||
|
|
7d26d7915c | ||
|
|
185b68bde9 | ||
|
|
553e0eebee | ||
|
|
fb4c508873 | ||
|
|
ebfd3c3f2e | ||
|
|
62ecfddb95 | ||
|
|
19696cbb6a | ||
|
|
40c16f17cc | ||
|
|
bd2170e0be | ||
|
|
e4a3835ee0 | ||
|
|
98e94682eb | ||
|
|
eb07b799f6 | ||
|
|
615e0d34e4 | ||
|
|
8b66aea296 | ||
|
|
eec6752b9a | ||
|
|
2907a55c96 | ||
|
|
08762490dd | ||
|
|
9e2d84fc5c |
Binary file not shown.
@@ -18,7 +18,7 @@ import java.util.Set;
|
||||
/**
|
||||
* bms财务结算系统feign调用接口
|
||||
*/
|
||||
@FeignClient(contextId = "BmsService", value = ServiceNameConstants.BMS_SERVICE, url = "http://10.102.192.32:8019",fallbackFactory = RemoteBmsFeignFallbackFactory.class, configuration = FeignAutoConfiguration.class)
|
||||
@FeignClient(contextId = "BmsService", value = ServiceNameConstants.BMS_SERVICE, url = "http://10.33.0.109:8019",fallbackFactory = RemoteBmsFeignFallbackFactory.class, configuration = FeignAutoConfiguration.class)
|
||||
public interface BmsServiceFeign {
|
||||
|
||||
|
||||
|
||||
@@ -16,7 +16,7 @@ import org.springframework.web.bind.annotation.RequestBody;
|
||||
import java.util.List;
|
||||
import java.util.concurrent.CompletableFuture;
|
||||
|
||||
@FeignClient(contextId = "OmsService", value = ServiceNameConstants.OMS_SERVICE,url = "http://10.102.192.33:8017", fallbackFactory = RemoteOmsFeignFallbackFactory.class, configuration = FeignAutoConfiguration.class)
|
||||
@FeignClient(contextId = "OmsService", value = ServiceNameConstants.OMS_SERVICE, url = "http://10.33.0.99:8017",fallbackFactory = RemoteOmsFeignFallbackFactory.class, configuration = FeignAutoConfiguration.class)
|
||||
public interface OmsServiceFeign {
|
||||
|
||||
|
||||
@@ -66,4 +66,8 @@ public interface OmsServiceFeign {
|
||||
@ApiOperation("批量推送")
|
||||
@PostMapping("/reservationStockOutOrderApi/batchPushByNumber")
|
||||
public AjaxResult batchPushByNumber(@RequestBody List<String> numberList);
|
||||
|
||||
@ApiOperation("保存电子签名记录")
|
||||
@PostMapping("/electronicSignatureApi/saveSignature")
|
||||
public AjaxResult saveSignature(@RequestBody ElectronicSignatureSyncDTO saveDTO);
|
||||
}
|
||||
@@ -165,6 +165,10 @@ public interface UserServiceFeign {
|
||||
@GetMapping("/userShipperApi/userShipperListAll")
|
||||
public AjaxResult<?> userShipperListAll();
|
||||
|
||||
@ApiOperation("查询租户下全部托运人")
|
||||
@GetMapping("/userShipperApi/userShipperListAllByOrg")
|
||||
public AjaxResult<?> userShipperListAllByOrg(@RequestParam("orgCode") Long orgCode);
|
||||
|
||||
@ApiOperation("查询租户下全部承运人")
|
||||
@GetMapping("/userDriverApi/userDriverListAll")
|
||||
public AjaxResult<?> userDriverListAll();
|
||||
@@ -223,4 +227,7 @@ public interface UserServiceFeign {
|
||||
@ApiOperation("查询赊销额度")
|
||||
@PostMapping("/userShipperApi/querySaleCreditLimitFeign")
|
||||
public AjaxResult querySaleCreditLimitFeign(@RequestBody UserShipperFeignDTO userShipperDTO);
|
||||
|
||||
@GetMapping("/userApi/getUserByUserAccount")
|
||||
R<LoginUser> getUserByUserAccount(@RequestParam("userAccount") String account);
|
||||
}
|
||||
@@ -26,7 +26,7 @@ import org.springframework.web.bind.annotation.*;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
@FeignClient(contextId = "commonWlhyServiceFeign",value = ServiceNameConstants.WLHY_SERVICE,url = "http://10.102.192.31:8014",configuration = FeignAutoConfiguration.class)
|
||||
@FeignClient(contextId = "commonWlhyServiceFeign",value = ServiceNameConstants.WLHY_SERVICE,url = "http://10.33.0.129:8014",configuration = FeignAutoConfiguration.class)
|
||||
public interface WlhyServiceFeign {
|
||||
|
||||
/**
|
||||
|
||||
@@ -21,7 +21,7 @@ import java.util.Map;
|
||||
* @description: TODO
|
||||
* @date 2024/5/10 8:58
|
||||
**/
|
||||
@FeignClient(contextId = "remoteWmsServiceFeign",value = ServiceNameConstants.WMS_SERVICE, url = "http://10.102.192.32:8016", fallbackFactory = RemoteWmsFallbackFactory.class, configuration = FeignAutoConfiguration.class)
|
||||
@FeignClient(contextId = "remoteWmsServiceFeign",value = ServiceNameConstants.WMS_SERVICE, url = "http://10.33.0.109:8016",fallbackFactory = RemoteWmsFallbackFactory.class, configuration = FeignAutoConfiguration.class)
|
||||
public interface WmsServiceFeign {
|
||||
|
||||
/**
|
||||
@@ -141,4 +141,14 @@ public interface WmsServiceFeign {
|
||||
@ApiOperation("生成拣货单")
|
||||
@PostMapping("/stockOutOrderApi/genPickingOrderByOms")
|
||||
public AjaxResult genPickingOrderByOms(@RequestBody com.mhd.system.api.domain.StockOutOrderDTO stockOutOrderDTO);
|
||||
|
||||
/**
|
||||
* OMS批量签名:更新WMS入/出库单签名字段
|
||||
*
|
||||
* <p>OMS端勾选记录批量签名后,通过此Feign调用WMS的 /stockSignatureApi/batchSign 接口,
|
||||
* 同步更新WMS stock_in_order / stock_out_order 表的签名状态、签名时间、签名图片、签名备注。</p>
|
||||
*/
|
||||
@ApiOperation("OMS批量签名-同步WMS入/出库单签名字段")
|
||||
@PostMapping("/stockSignatureApi/batchSign")
|
||||
public AjaxResult batchSignWms(@RequestBody SignatureBatchFeignDTO dto);
|
||||
}
|
||||
@@ -9,7 +9,7 @@ import com.mhd.system.api.feign.FeignAutoConfiguration;
|
||||
import org.springframework.cloud.openfeign.FeignClient;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
|
||||
@FeignClient(contextId = "YmsService", value = ServiceNameConstants.YMS_SERVICE,fallbackFactory = RemoteBmsFeignFallbackFactory.class,url = "http://10.102.192.33:8018", configuration = FeignAutoConfiguration.class)
|
||||
@FeignClient(contextId = "YmsService", value = ServiceNameConstants.YMS_SERVICE,url = "http://10.33.0.99:8018",fallbackFactory = RemoteBmsFeignFallbackFactory.class, configuration = FeignAutoConfiguration.class)
|
||||
public interface YmsServiceFeign {
|
||||
|
||||
/**
|
||||
|
||||
+108
@@ -0,0 +1,108 @@
|
||||
package com.mhd.system.api.domain;
|
||||
|
||||
import io.swagger.annotations.ApiModelProperty;
|
||||
import lombok.Data;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* 电子签名同步DTO(WMS端通过Feign调用OMS)
|
||||
*/
|
||||
@Data
|
||||
public class ElectronicSignatureSyncDTO {
|
||||
|
||||
@ApiModelProperty("订单ID")
|
||||
private Long orderId;
|
||||
|
||||
@ApiModelProperty("订单号")
|
||||
private String orderNumber;
|
||||
|
||||
@ApiModelProperty("订单类型:IN-入库 OUT-出库")
|
||||
private String orderType;
|
||||
|
||||
@ApiModelProperty("组织ID")
|
||||
private Long organizationId;
|
||||
|
||||
@ApiModelProperty("组织名称")
|
||||
private String organizationName;
|
||||
|
||||
@ApiModelProperty("一级组织ID")
|
||||
private Long topOrganizationId;
|
||||
|
||||
@ApiModelProperty("仓库ID")
|
||||
private Long warehouseId;
|
||||
|
||||
@ApiModelProperty("仓库编码")
|
||||
private String warehouseCode;
|
||||
|
||||
@ApiModelProperty("仓库名称")
|
||||
private String warehouseName;
|
||||
|
||||
@ApiModelProperty("创建人")
|
||||
private Long createBy;
|
||||
|
||||
@ApiModelProperty("创建人姓名")
|
||||
private String createByName;
|
||||
|
||||
@ApiModelProperty("物料明细列表")
|
||||
private List<MaterialDetailItem> materialDetailList;
|
||||
|
||||
@Data
|
||||
public static class MaterialDetailItem {
|
||||
|
||||
@ApiModelProperty("物料基础信息ID")
|
||||
private Long materialBaseInfoId;
|
||||
|
||||
@ApiModelProperty("物料编码")
|
||||
private String materialCode;
|
||||
|
||||
@ApiModelProperty("物料名称")
|
||||
private String materialName;
|
||||
|
||||
@ApiModelProperty("数量")
|
||||
private BigDecimal quantity;
|
||||
|
||||
@ApiModelProperty("单位代码")
|
||||
private String unitCode;
|
||||
|
||||
@ApiModelProperty("单位名称")
|
||||
private String unitName;
|
||||
|
||||
@ApiModelProperty("批次号")
|
||||
private String batchNumber;
|
||||
|
||||
@ApiModelProperty("LOT编号")
|
||||
private String lotNumber;
|
||||
|
||||
@ApiModelProperty("仓库ID")
|
||||
private Long warehouseId;
|
||||
|
||||
@ApiModelProperty("仓库编码")
|
||||
private String warehouseCode;
|
||||
|
||||
@ApiModelProperty("仓库名称")
|
||||
private String warehouseName;
|
||||
|
||||
@ApiModelProperty("库区ID")
|
||||
private Long storageSectionId;
|
||||
|
||||
@ApiModelProperty("库区编码")
|
||||
private String storageSectionCode;
|
||||
|
||||
@ApiModelProperty("库区名称")
|
||||
private String storageSectionName;
|
||||
|
||||
@ApiModelProperty("库位ID")
|
||||
private Long storageLocationId;
|
||||
|
||||
@ApiModelProperty("库位编码")
|
||||
private String storageLocationCode;
|
||||
|
||||
@ApiModelProperty("库位名称")
|
||||
private String storageLocationName;
|
||||
|
||||
@ApiModelProperty("业务唯一ID")
|
||||
private Long uniqueId;
|
||||
}
|
||||
}
|
||||
+21
-3
@@ -240,9 +240,7 @@ public class InMaterialDetail extends BaseVOEntity {
|
||||
@ApiModelProperty("父级唯一Id")
|
||||
private Long parentUniqueId;
|
||||
|
||||
@ApiModelProperty("备注")
|
||||
@Excel(name = "备注")
|
||||
private String remark;
|
||||
|
||||
|
||||
@ApiModelProperty("越库单id")
|
||||
private Long overStockId;
|
||||
@@ -376,4 +374,24 @@ public class InMaterialDetail extends BaseVOEntity {
|
||||
@JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd")
|
||||
@DateTimeFormat(pattern="yyyy-MM-dd")
|
||||
private Date drinkDate;
|
||||
|
||||
@ApiModelProperty("来货验收是否合格;1 合格,0 不合格")
|
||||
@Excel(name = "来货验收是否合格;1 合格,0 不合格")
|
||||
private String arrivalAcceptQualified;
|
||||
|
||||
@ApiModelProperty("包装是否破损;1 破损,0 完好")
|
||||
@Excel(name = "包装是否破损;1 破损,0 完好")
|
||||
private String packageDamaged;
|
||||
|
||||
@ApiModelProperty("是否解冻 / 水渍;1 是,0 否")
|
||||
@Excel(name = "是否解冻 / 水渍;1 是,0 否")
|
||||
private String isThawWaterstain;
|
||||
|
||||
@ApiModelProperty("问题货是否已通知客户;1 已通知,0 未通知")
|
||||
@Excel(name = "问题货是否已通知客户;1 已通知,0 未通知")
|
||||
private String notifyCustomerAbnormal;
|
||||
|
||||
@ApiModelProperty("备注")
|
||||
@Excel(name = "备注")
|
||||
private String remark;
|
||||
}
|
||||
+6
@@ -244,4 +244,10 @@ public class MaterialBaseInfoFeign extends BaseVOEntity{
|
||||
|
||||
@ApiModelProperty(name = "单位")
|
||||
private String unit;
|
||||
|
||||
@ApiModelProperty(name = "组织(多个用,分开)")
|
||||
private String orgId;
|
||||
|
||||
@ApiModelProperty(name = "是否正常物料: 0-是 1-否")
|
||||
private Integer isNormalMaterial;
|
||||
}
|
||||
+42
@@ -0,0 +1,42 @@
|
||||
package com.mhd.system.api.domain;
|
||||
|
||||
import com.fasterxml.jackson.annotation.JsonFormat;
|
||||
import io.swagger.annotations.ApiModelProperty;
|
||||
import lombok.Data;
|
||||
import org.springframework.format.annotation.DateTimeFormat;
|
||||
|
||||
import java.util.Date;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* OMS→WMS 批量签名 Feign DTO
|
||||
*
|
||||
* <p>OMS端批量签名时,通过此DTO调用WMS的批量签名接口,
|
||||
* 更新WMS stock_in_order / stock_out_order 表的签名字段。</p>
|
||||
*/
|
||||
@Data
|
||||
public class SignatureBatchFeignDTO {
|
||||
|
||||
@ApiModelProperty("入库单ID列表")
|
||||
private List<Long> inOrderIds;
|
||||
|
||||
@ApiModelProperty("出库单ID列表")
|
||||
private List<Long> outOrderIds;
|
||||
|
||||
@ApiModelProperty("签名状态:2-已签名")
|
||||
private Integer signatureStatus;
|
||||
|
||||
@ApiModelProperty("签名时间")
|
||||
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
|
||||
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
|
||||
private Date signatureTime;
|
||||
|
||||
@ApiModelProperty("手写签名图片(base64或URL,单张)")
|
||||
private String signaturePic;
|
||||
|
||||
@ApiModelProperty("拍照取证图片(逗号分隔多张URL)")
|
||||
private String evidencePics;
|
||||
|
||||
@ApiModelProperty("签名备注")
|
||||
private String signatureRemark;
|
||||
}
|
||||
@@ -50,8 +50,8 @@ public class StockOutOrder extends BaseVOEntity {
|
||||
@Excel(name = "出库单号")
|
||||
private String outOrderNumber;
|
||||
|
||||
@ApiModelProperty("出库状态: 1-已创建 2-已审核 3-部分分配 4-已分配 5-波次中 6-拣货中 7-拣货完成 8-复核中 9-已出库 10-已取消 11-已关闭 12-已复核")
|
||||
@Excel(name = "出库状态: 1-已创建 2-已审核 3-部分分配 4-已分配 5-波次中 6-拣货中 7-拣货完成 8-复核中 9-已出库 10-已取消 11-已关闭 12-已复核")
|
||||
@ApiModelProperty("出库状态: 1-已创建 2-已审核 3-部分分配 4-已分配 5-波次中 6-拣货中 7-拣货完成 8-复核中 9-已出库 10-已取消 11-已关闭 12-已复核 13-已交接")
|
||||
@Excel(name = "出库状态: 1-已创建 2-已审核 3-部分分配 4-已分配 5-波次中 6-拣货中 7-拣货完成 8-复核中 9-已出库 10-已取消 11-已关闭 12-已复核 13-已交接")
|
||||
private Integer status;
|
||||
|
||||
@ApiModelProperty("出库单审核状态: 1-未审核 2-审核不通过 3-审核通过")
|
||||
|
||||
@@ -46,8 +46,8 @@ TmsOrderAddDTO implements Serializable {
|
||||
@ApiModelProperty(value = "装货电话")
|
||||
private String loadingPhone="";
|
||||
@ApiModelProperty(value = "装货时间日期(年月日)",required = true)
|
||||
@JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd")
|
||||
@DateTimeFormat(pattern="yyyy-MM-dd")
|
||||
@JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
|
||||
@DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
|
||||
private java.util.Date loadingDate;
|
||||
// @ApiModelProperty(value = "装货时间(上午、下午、24小时)")
|
||||
// private String loadingTime="";
|
||||
|
||||
+23
-1
@@ -116,6 +116,28 @@ public class WarehouseFeignPO extends BaseVOEntity{
|
||||
@Excel(name = "是否作废: 1-否 2-是")
|
||||
private Integer nullify;
|
||||
|
||||
@ApiModelProperty("任务模式")
|
||||
@Excel(name = "任务模式")
|
||||
private String taskMode;
|
||||
|
||||
@ApiModelProperty("作业模式")
|
||||
@Excel(name = "作业模式")
|
||||
private String workMode;
|
||||
|
||||
}
|
||||
@ApiModelProperty("订单号生成规则(0-日期累加 1-历史累加)")
|
||||
@Excel(name = "单号生成规则")
|
||||
private String orderNoGenerateRule;
|
||||
|
||||
@ApiModelProperty("入库单号首字母前缀")
|
||||
@Excel(name = "入库单号首字母前缀")
|
||||
private String inOrderNoPrefix;
|
||||
|
||||
@ApiModelProperty("出库单号首字母前缀")
|
||||
@Excel(name = "出库单号首字母前缀")
|
||||
private String outOrderNoPrefix;
|
||||
|
||||
@ApiModelProperty("样品出库单号首字母前缀")
|
||||
@Excel(name = "样品出库单号首字母前缀")
|
||||
private String sampleOutOrderNoPrefix;
|
||||
|
||||
}
|
||||
+5
@@ -90,6 +90,11 @@ public class RemoteOmsFeignFallbackFactory implements FallbackFactory<OmsService
|
||||
public AjaxResult batchPushByNumber(List<String> numberList) {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public AjaxResult saveSignature(ElectronicSignatureSyncDTO saveDTO) {
|
||||
return null;
|
||||
}
|
||||
};
|
||||
}
|
||||
}
|
||||
+10
@@ -140,6 +140,11 @@ public class RemoteUserFeignFallbackFactory implements FallbackFactory<UserServi
|
||||
return AjaxResult.error("获取租户托运人失败");
|
||||
}
|
||||
|
||||
@Override
|
||||
public AjaxResult<?> userShipperListAllByOrg(Long orgCode) {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public AjaxResult<?> userDriverListAll() {
|
||||
return AjaxResult.error("获取租户承运人失败");
|
||||
@@ -170,6 +175,11 @@ public class RemoteUserFeignFallbackFactory implements FallbackFactory<UserServi
|
||||
return R.fail("获取组织用户失败:" + throwable.getMessage());
|
||||
}
|
||||
|
||||
@Override
|
||||
public R<LoginUser> getUserByUserAccount(String userAccount) {
|
||||
return R.fail("获取用户失败:" + throwable.getMessage());
|
||||
}
|
||||
|
||||
@Override
|
||||
public R<LoginUser> getUserByTopOrganizationUserPhone(@RequestBody UserDTO userDTO, String source) {
|
||||
return R.fail("获取组织用户失败:" + throwable.getMessage());
|
||||
|
||||
+7
-1
@@ -85,7 +85,7 @@ public class RemoteWmsFallbackFactory implements FallbackFactory<WmsServiceFeign
|
||||
|
||||
@Override
|
||||
public AjaxResult execution(StockOutOrderDTO stockOutOrderDTO) {
|
||||
return null;
|
||||
return AjaxResult.error(cause.getMessage());
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -119,6 +119,12 @@ public class RemoteWmsFallbackFactory implements FallbackFactory<WmsServiceFeign
|
||||
public AjaxResult genPickingOrderByOms(StockOutOrderDTO stockOutOrderDTO) {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public AjaxResult batchSignWms(SignatureBatchFeignDTO dto) {
|
||||
log.error("WMS批量签名调用失败");
|
||||
return AjaxResult.error("WMS批量签名调用失败:" + cause.getMessage());
|
||||
}
|
||||
};
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,90 @@
|
||||
package com.mhd.auth.system.controller;
|
||||
|
||||
import com.mhd.auth.system.service.SsoAuthorizeService;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.web.bind.annotation.CrossOrigin;
|
||||
import org.springframework.web.bind.annotation.GetMapping;
|
||||
import org.springframework.web.bind.annotation.RequestMapping;
|
||||
import org.springframework.web.bind.annotation.RequestParam;
|
||||
import org.springframework.web.bind.annotation.RestController;
|
||||
|
||||
import javax.servlet.http.HttpServletResponse;
|
||||
import java.io.IOException;
|
||||
import java.net.URLEncoder;
|
||||
import java.nio.charset.StandardCharsets;
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
* SSO单点登录控制器
|
||||
* 子系统端实现:接收中台传递的签名参数,验签后自动登录并重定向
|
||||
*
|
||||
* @author mhd
|
||||
*/
|
||||
@Slf4j
|
||||
@RestController
|
||||
@RequestMapping("/auth")
|
||||
@CrossOrigin
|
||||
public class SsoAuthorizeController {
|
||||
|
||||
@Autowired
|
||||
private SsoAuthorizeService ssoAuthorizeService;
|
||||
|
||||
/**
|
||||
* SSO单点登录授权接口
|
||||
* 中台点击子系统链接后,将签名参数传递给此接口
|
||||
* 验签通过后自动登录并重定向到前端页面,携带token
|
||||
*
|
||||
* @param signature 签名信息(Base64编码后再URL编码),签名源数据格式:appkey=xxx&account=xxx×tamp=xxxxxx
|
||||
* @param appkey 对方的应用key,值固定为nanguang
|
||||
* @param account 账号
|
||||
* @param timestamp 当前时间戳(毫秒),用于防止签名被盗用,超过24小时视为失效
|
||||
*/
|
||||
@GetMapping("/sso-authorize")
|
||||
public void ssoAuthorize(@RequestParam("signature") String signature,
|
||||
@RequestParam("appkey") String appkey,
|
||||
@RequestParam("account") String account,
|
||||
@RequestParam("timestamp") Long timestamp,
|
||||
HttpServletResponse response) throws IOException {
|
||||
log.info("SSO单点登录请求, appkey={}, account={}, timestamp={}", appkey, account, timestamp);
|
||||
|
||||
String redirectUrl = ssoAuthorizeService.getRedirectUrl();
|
||||
|
||||
try {
|
||||
// 1. 校验时间戳是否超过24小时,防止签名被盗用
|
||||
long ONE_DAY_MILLIS = 24L * 60 * 60 * 1000;
|
||||
long currentTime = System.currentTimeMillis();
|
||||
if ((currentTime - timestamp) > ONE_DAY_MILLIS) {
|
||||
log.warn("SSO签名已过期, appkey={}, account={}, timestamp={}, 距今{}小时",
|
||||
appkey, account, timestamp, (currentTime - timestamp) / (60 * 60 * 1000));
|
||||
response.sendRedirect(redirectUrl + "?msg=" + URLEncoder.encode("登录失败:签名已超过24小时,请重新发起", StandardCharsets.UTF_8.name()));
|
||||
return;
|
||||
}
|
||||
|
||||
// 2. 构造签名源数据(包含timestamp)
|
||||
String sourceData = "appkey=" + appkey + "&account=" + account + "×tamp=" + timestamp;
|
||||
|
||||
// 3. 验证签名
|
||||
boolean verifyResult = ssoAuthorizeService.verifySignature(sourceData, signature);
|
||||
if (!verifyResult) {
|
||||
log.warn("SSO验签失败, appkey={}, account={}, timestamp={}", appkey, account, timestamp);
|
||||
response.sendRedirect(redirectUrl + "?msg=" + URLEncoder.encode("登录失败:签名验证不通过", StandardCharsets.UTF_8.name()));
|
||||
return;
|
||||
}
|
||||
|
||||
// 4. 验签通过,使用account进行登录,获取token
|
||||
Map<String, Object> loginResult = ssoAuthorizeService.ssoLogin(account);
|
||||
String accessToken = (String) loginResult.get("access_token");
|
||||
|
||||
// 5. 重定向到前端页面,token通过URL参数传递
|
||||
// 前端页面需读取URL中的token参数并存入localStorage
|
||||
log.info("SSO单点登录成功, account={}", account);
|
||||
log.info("SSO单点登录成功, account={}, token={} , redirectUrl={}", account, accessToken, redirectUrl);
|
||||
response.sendRedirect(redirectUrl + "?token=" + URLEncoder.encode(accessToken, StandardCharsets.UTF_8.name()));
|
||||
|
||||
} catch (Exception e) {
|
||||
log.error("SSO单点登录异常, appkey={}, account={}, timestamp={}", appkey, account, timestamp, e);
|
||||
response.sendRedirect(redirectUrl + "?msg=" + URLEncoder.encode("登录失败:" + e.getMessage(), StandardCharsets.UTF_8.name()));
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,200 @@
|
||||
package com.mhd.auth.system.service;
|
||||
|
||||
import cn.hutool.core.util.ObjectUtil;
|
||||
import cn.hutool.core.util.StrUtil;
|
||||
import cn.hutool.json.JSONUtil;
|
||||
import com.mhd.common.core.constant.CacheConstants;
|
||||
import com.mhd.common.core.constant.Constants;
|
||||
import com.mhd.common.core.constant.SecurityConstants;
|
||||
import com.mhd.common.core.domain.entity.R;
|
||||
import com.mhd.common.core.domain.po.OrganizationPo;
|
||||
import com.mhd.common.core.domain.po.RolePO;
|
||||
import com.mhd.common.core.domain.po.UserPo;
|
||||
import com.mhd.common.core.enums.UserStatus;
|
||||
import com.mhd.common.core.exception.ServiceException;
|
||||
import com.mhd.common.core.utils.ServletUtils;
|
||||
import com.mhd.common.core.utils.ip.IpUtil;
|
||||
import com.mhd.common.core.utils.ip.IpUtils;
|
||||
import com.mhd.common.core.web.domain.AjaxResult;
|
||||
import com.mhd.common.log.service.AsyncLogService;
|
||||
import com.mhd.common.security.service.TokenService;
|
||||
import com.mhd.system.api.SystemServiceFeign;
|
||||
import com.mhd.system.api.UserServiceFeign;
|
||||
import com.mhd.system.api.domain.UserDTO;
|
||||
import com.mhd.system.api.domain.UserUpdateDTO;
|
||||
import com.mhd.system.api.model.LoginUser;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.beans.factory.annotation.Value;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import java.security.KeyFactory;
|
||||
import java.security.PublicKey;
|
||||
import java.security.Signature;
|
||||
import java.util.Base64;
|
||||
import java.util.Date;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
/**
|
||||
* SSO单点登录服务
|
||||
*
|
||||
* @author mhd
|
||||
*/
|
||||
@Slf4j
|
||||
@Service
|
||||
public class SsoAuthorizeService {
|
||||
|
||||
@Value("${sso.public-key}")
|
||||
private String publicKeyStr;
|
||||
|
||||
@Value("${sso.redirect-url}")
|
||||
private String redirectUrl;
|
||||
|
||||
@Resource
|
||||
private UserServiceFeign userServiceFeign;
|
||||
|
||||
@Resource
|
||||
private TokenService tokenService;
|
||||
|
||||
@Autowired
|
||||
private AsyncLogService asyncLogService;
|
||||
|
||||
@Autowired
|
||||
private SystemServiceFeign systemServiceFeign;
|
||||
|
||||
@Resource
|
||||
private com.mhd.auth.app.infrastructure.feign.OrganizationServiceFeign organizationServiceFeign;
|
||||
|
||||
/**
|
||||
* 验证RSA签名
|
||||
*
|
||||
* @param sourceData 签名源数据,格式:appkey=xxx&account=xxx×tamp=xxxxxx
|
||||
* @param signatureStr Base64编码的签名(可能经过URL编码)
|
||||
* @return 验签结果
|
||||
*/
|
||||
public boolean verifySignature(String sourceData, String signatureStr) {
|
||||
try {
|
||||
// Spring @RequestParam 已自动完成 URL 解码,此处直接 Base64 解码即可
|
||||
byte[] signatureBytes = Base64.getDecoder().decode(signatureStr);
|
||||
|
||||
PublicKey publicKey = generatePublicKey(publicKeyStr);
|
||||
Signature signature = Signature.getInstance("SHA256withRSA");
|
||||
signature.initVerify(publicKey);
|
||||
signature.update(sourceData.getBytes("UTF-8"));
|
||||
return signature.verify(signatureBytes);
|
||||
} catch (Exception e) {
|
||||
log.error("SSO验签失败, sourceData={}, signature={}", sourceData, signatureStr, e);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 根据公钥字符串生成PublicKey对象
|
||||
*/
|
||||
private PublicKey generatePublicKey(String keyStr) throws Exception {
|
||||
// 去除头尾标记和空白字符
|
||||
String publicKeyContent = keyStr
|
||||
.replace("-----BEGIN PUBLIC KEY-----", "")
|
||||
.replace("-----END PUBLIC KEY-----", "")
|
||||
.replaceAll("\\s+", "");
|
||||
byte[] keyBytes = Base64.getDecoder().decode(publicKeyContent);
|
||||
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
|
||||
java.security.spec.X509EncodedKeySpec keySpec = new java.security.spec.X509EncodedKeySpec(keyBytes);
|
||||
return keyFactory.generatePublic(keySpec);
|
||||
}
|
||||
|
||||
/**
|
||||
* SSO登录:根据account查找用户并创建token
|
||||
*
|
||||
* @param account 账号
|
||||
* @return 包含token等信息的Map
|
||||
*/
|
||||
public Map<String, Object> ssoLogin(String account) {
|
||||
// 根据账号查找用户(SSO登录不区分组织,仅通过userAccount查询)
|
||||
R<LoginUser> userResult = userServiceFeign.getUserByUserAccount(account);
|
||||
if (R.FAIL == userResult.getCode()) {
|
||||
throw new ServiceException(userResult.getMsg());
|
||||
}
|
||||
if (userResult.getData() == null) {
|
||||
throw new ServiceException("SSO登录用户不存在:" + account);
|
||||
}
|
||||
|
||||
LoginUser userInfo = userResult.getData();
|
||||
UserPo userPo = userInfo.getUserPo();
|
||||
|
||||
// 校验用户状态
|
||||
if (userPo == null) {
|
||||
throw new ServiceException("SSO登录用户信息异常:" + account);
|
||||
}
|
||||
// 删除标记
|
||||
if (UserStatus.DELETED.getCode().equals(String.valueOf(userPo.getDelFlag()))) {
|
||||
throw new ServiceException("对不起,您的账号:" + account + " 已被删除");
|
||||
}
|
||||
// 用户状态
|
||||
if (UserStatus.DELETED.getCode().equals(String.valueOf(userPo.getUserStatus()))) {
|
||||
throw new ServiceException("对不起,您的账号:" + account + " 已停用");
|
||||
}
|
||||
|
||||
// 获取组织信息
|
||||
com.mhd.common.core.domain.entity.R<OrganizationPo> organizationInfo = organizationServiceFeign.getInfoForIdList(userPo.getOrganizationId());
|
||||
if (ObjectUtil.isNull(organizationInfo) || ObjectUtil.isNull(organizationInfo.getData())) {
|
||||
throw new ServiceException("登录用户组织不存在");
|
||||
}
|
||||
userInfo.setOrganizationPo(organizationInfo.getData());
|
||||
|
||||
// 查询用户角色
|
||||
AjaxResult roleListAjaxResult = userServiceFeign.getRoleListByUserId(userPo.getUserId());
|
||||
if ("200".equals(String.valueOf(roleListAjaxResult.get("code"))) && ObjectUtil.isNotNull(roleListAjaxResult.get("data"))) {
|
||||
List<RolePO> rolePOS = JSONUtil.toList(JSONUtil.toJsonStr(roleListAjaxResult.get("data")), RolePO.class);
|
||||
if (rolePOS != null && !rolePOS.isEmpty()) {
|
||||
userInfo.setRoleList(rolePOS.stream().map(RolePO::getRoleName).collect(Collectors.toList()));
|
||||
userInfo.setRoleIdList(rolePOS.stream().map(RolePO::getRoleId).collect(Collectors.toList()));
|
||||
}
|
||||
}
|
||||
|
||||
// 更新登录信息
|
||||
UserUpdateDTO userUpdateDTO = new UserUpdateDTO();
|
||||
userUpdateDTO.setLastLoginTime(new Date());
|
||||
userUpdateDTO.setLastLoginIp(IpUtils.getIpAddr(ServletUtils.getRequest()));
|
||||
userUpdateDTO.setUserName(account);
|
||||
userServiceFeign.updateWhenLogin(userUpdateDTO, SecurityConstants.INNER);
|
||||
|
||||
// 创建token
|
||||
Map<String, Object> result = tokenService.createTokenApi(userInfo);
|
||||
|
||||
// 记录登录日志
|
||||
recordLogininfor(userPo, Constants.LOGIN_SUCCESS, "SSO单点登录成功", 1);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* 记录登录信息
|
||||
*/
|
||||
private void recordLogininfor(UserPo userPo, String status, String message, Integer behaviorType) {
|
||||
com.mhd.system.api.domain.SysLogininforPo logininfor = new com.mhd.system.api.domain.SysLogininforPo();
|
||||
logininfor.setUserAccount(userPo.getUserAccount());
|
||||
logininfor.setUserName(userPo.getUserName());
|
||||
logininfor.setIpaddr(IpUtils.getIpAddr(ServletUtils.getRequest()));
|
||||
logininfor.setLocation(StrUtil.isNotEmpty(logininfor.getIpaddr()) ? IpUtil.getLocationSplicing(logininfor.getIpaddr()) : "");
|
||||
logininfor.setBehaviorType(behaviorType);
|
||||
logininfor.setMsg(message);
|
||||
logininfor.setOrganizationId(userPo.getOrganizationId());
|
||||
logininfor.setOrganizationName(userPo.getOrganizationName());
|
||||
logininfor.setTopOrganizationId(userPo.getTopOrganizationId());
|
||||
logininfor.setAccessTime(cn.hutool.core.date.DateUtil.date());
|
||||
if (org.apache.commons.lang3.StringUtils.equalsAny(status, Constants.LOGIN_SUCCESS, Constants.LOGOUT, Constants.REGISTER)) {
|
||||
logininfor.setStatus(Constants.LOGIN_SUCCESS_STATUS);
|
||||
} else if (Constants.LOGIN_FAIL.equals(status)) {
|
||||
logininfor.setStatus(Constants.LOGIN_FAIL_STATUS);
|
||||
}
|
||||
asyncLogService.saveLogininfor(logininfor);
|
||||
}
|
||||
|
||||
public String getRedirectUrl() {
|
||||
return redirectUrl;
|
||||
}
|
||||
}
|
||||
@@ -550,11 +550,11 @@ public class SysLoginService {
|
||||
throw new ServiceException("请输入手机号和短信验证码");
|
||||
}
|
||||
|
||||
//调用工具类校验,校验手机号格式错误
|
||||
if (!RegexUtil.isPhoneLegal(userPhone)) {
|
||||
recordLogininfor(userPhone, Constants.LOGIN_FAIL, UserError.USER_PHONE_REG_ERROR.errmsg(), 1);
|
||||
throw new DigitalLogisticsException(UserError.USER_PHONE_REG_ERROR);
|
||||
}
|
||||
// //调用工具类校验,校验手机号格式错误
|
||||
// if (!RegexUtil.isPhoneLegal(userPhone)) {
|
||||
// recordLogininfor(userPhone, Constants.LOGIN_FAIL, UserError.USER_PHONE_REG_ERROR.errmsg(), 1);
|
||||
// throw new DigitalLogisticsException(UserError.USER_PHONE_REG_ERROR);
|
||||
// }
|
||||
|
||||
//根据域名获取一级组织ID
|
||||
AjaxResult topOrganizationIdR = organizationServiceFeign.getOrganizationByPath(path, SecurityConstants.INNER);
|
||||
|
||||
@@ -15,19 +15,20 @@ spring:
|
||||
# server-addr: 127.0.0.1:8848
|
||||
# 线上测试环境配置 容器名+端口号
|
||||
# server-addr: 10.33.0.129:6010
|
||||
# username: nacos
|
||||
# password: manhuoda@2023
|
||||
#线上正式环境
|
||||
server-addr: 10.102.192.31:6848
|
||||
username: nacos
|
||||
password: manhuoda@2023
|
||||
#线上正式环境
|
||||
# server-addr: 10.102.192.5:6848
|
||||
# username: nacos
|
||||
# password: manhuoda@2023
|
||||
config:
|
||||
# server-addr: 127.0.0.1:8848
|
||||
server-addr: 10.102.192.31:6848
|
||||
# 测试环境配置 容器名+端口号
|
||||
# server-addr: 10.33.0.129:6010
|
||||
# 线上测试环境配置 容器名+端口号
|
||||
#
|
||||
server-addr: 10.102.192.31:6848
|
||||
# server-addr: 10.102.192.5:6848
|
||||
username: nacos
|
||||
password: manhuoda@2023
|
||||
#线上正式环境
|
||||
@@ -36,3 +37,19 @@ spring:
|
||||
# 共享配置
|
||||
shared-configs:
|
||||
- application-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}
|
||||
|
||||
# SSO单点登录配置
|
||||
sso:
|
||||
# RSA公钥(由中台openssl私钥导出)
|
||||
public-key: |
|
||||
-----BEGIN PUBLIC KEY-----
|
||||
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA62dYkl2Nvy2wW9028dQ7
|
||||
HdxFNhwEriFNzFMFq+m1jTvZWdU6e9a1iCGWTVV2fTo4PWSyhjWyzv2ZBEuanWBq
|
||||
y/bfh/jOTjT/tlWvMeJZ1TV4suCbigHq5TGxDsY6ZC6if9ULhU3NWkgnPNn6HfO9
|
||||
NVvBTfx9MgWtCtT33kq30KgxC6LqVdCe08+gD0KB3df0DK8OJorVFfxYVc7TjGEL
|
||||
xqUuE7PcgZgDb8KvdgO66OxBqFIB0qfc73oALKGoq/8kvjrqE/amaIZPv3jE2Rc7
|
||||
0rIhGHrFcoA3W01nNRGQKY/E/VKOGBn/uDNdi5iMXsFjKxiBbXB07bBxdhUH7698
|
||||
AwIDAQAB
|
||||
-----END PUBLIC KEY-----
|
||||
# SSO登录成功后跳转的前端页面地址
|
||||
redirect-url: "https://diglog.namkwong.com.mo/main_app/sso"
|
||||
|
||||
+34
@@ -0,0 +1,34 @@
|
||||
package com.mhd.bi.domain.biPlatformRealData.repository.mapper;
|
||||
|
||||
import com.mhd.bi.domain.biPlatformRealData.repository.po.RealPlatformVehiclePO;
|
||||
import com.mhd.bi.domain.biPlatformRealData.repository.po.RealPlatformOverviewPO;
|
||||
import com.mhd.bi.domain.biPlatformRealData.repository.po.RealVehicleStatusPO;
|
||||
import com.mhd.bi.domain.biPlatformRealData.repository.po.RealTaskLoadPO;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* 月台监测-真实数据 Mapper
|
||||
* 数据来源:TEST_NGWL_YMS 库(达梦,跨库访问)
|
||||
* 注:列名按达梦默认大写规则;若实际库中小写请反馈调整
|
||||
*/
|
||||
public interface BiPlatformRealDataMapper {
|
||||
|
||||
/** 作业车辆状态列表 */
|
||||
List<RealPlatformVehiclePO> queryVehicles();
|
||||
|
||||
/** 月台实时概览(总数 / 当前作业中) */
|
||||
RealPlatformOverviewPO queryPlatformOverview();
|
||||
|
||||
/** 今日作业任务数 */
|
||||
Long countTodayTasks();
|
||||
|
||||
/** 车辆状态统计(今日) */
|
||||
RealVehicleStatusPO queryVehicleStatusToday();
|
||||
|
||||
/** 本月任务量 */
|
||||
Long countMonthTasks();
|
||||
|
||||
/** 任务负荷(今日 24 小时) */
|
||||
List<RealTaskLoadPO> queryTaskLoadToday();
|
||||
}
|
||||
+18
@@ -0,0 +1,18 @@
|
||||
package com.mhd.bi.domain.biPlatformRealData.repository.po;
|
||||
|
||||
import lombok.Data;
|
||||
import java.io.Serializable;
|
||||
|
||||
/**
|
||||
* 月台实时概览(真实数据,来自 TEST_NGWL_YMS.QMS_WINDOW_INFO)
|
||||
*/
|
||||
@Data
|
||||
public class RealPlatformOverviewPO implements Serializable {
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
/** 月台总数 */
|
||||
private Long totalPlatforms;
|
||||
|
||||
/** 当前作业中(月台作业状态=占用) */
|
||||
private Long operatingPlatforms;
|
||||
}
|
||||
+30
@@ -0,0 +1,30 @@
|
||||
package com.mhd.bi.domain.biPlatformRealData.repository.po;
|
||||
|
||||
import lombok.Data;
|
||||
import java.io.Serializable;
|
||||
|
||||
/**
|
||||
* 月台监测-作业车辆(真实数据,来自 TEST_NGWL_YMS.QMS_MAIN_BUSINESS 等)
|
||||
*/
|
||||
@Data
|
||||
public class RealPlatformVehiclePO implements Serializable {
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
/** 车牌号(qms_main_business.CARNO) */
|
||||
private String plateNumber;
|
||||
|
||||
/** 流程状态(qms_main_business.FLOWSTATUS) */
|
||||
private String status;
|
||||
|
||||
/** 叫号月台(qms_queue_list.WINDOWNAME) */
|
||||
private String platformId;
|
||||
|
||||
/** 月台作业时长,分钟(EXITTIME - ENTRYTIME) */
|
||||
private Long platformDuration;
|
||||
|
||||
/** 预约申请时间(qms_main_business.CREATE_TIME) */
|
||||
private String appointmentTime;
|
||||
|
||||
/** 作业楼层(qms_window_info.PLATFORMFLOOR) */
|
||||
private String workFloor;
|
||||
}
|
||||
+18
@@ -0,0 +1,18 @@
|
||||
package com.mhd.bi.domain.biPlatformRealData.repository.po;
|
||||
|
||||
import lombok.Data;
|
||||
import java.io.Serializable;
|
||||
|
||||
/**
|
||||
* 任务负荷统计(按小时,来自 TEST_NGWL_YMS.QMS_MAIN_BUSINESS)
|
||||
*/
|
||||
@Data
|
||||
public class RealTaskLoadPO implements Serializable {
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
/** 0-23 小时 */
|
||||
private Integer hourOfDay;
|
||||
|
||||
/** 该小时段任务数 */
|
||||
private Long taskCount;
|
||||
}
|
||||
+24
@@ -0,0 +1,24 @@
|
||||
package com.mhd.bi.domain.biPlatformRealData.repository.po;
|
||||
|
||||
import lombok.Data;
|
||||
import java.io.Serializable;
|
||||
|
||||
/**
|
||||
* 作业车辆状态统计(真实数据,来自 TEST_NGWL_YMS.QMS_MAIN_BUSINESS)
|
||||
*/
|
||||
@Data
|
||||
public class RealVehicleStatusPO implements Serializable {
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
/** 今日预约车辆 */
|
||||
private Long todayReservedVehicles;
|
||||
|
||||
/** 当前未签到 */
|
||||
private Long notCheckedIn;
|
||||
|
||||
/** 当前作业中 */
|
||||
private Long operatingVehicles;
|
||||
|
||||
/** 作业完成 */
|
||||
private Long completedVehicles;
|
||||
}
|
||||
+214
@@ -0,0 +1,214 @@
|
||||
package com.mhd.bi.domain.biPlatformRealData.service;
|
||||
|
||||
import com.mhd.bi.domain.biPlatformRealData.repository.mapper.BiPlatformRealDataMapper;
|
||||
import com.mhd.bi.domain.biPlatformRealData.repository.po.RealPlatformVehiclePO;
|
||||
import com.mhd.bi.domain.biPlatformRealData.repository.po.RealPlatformOverviewPO;
|
||||
import com.mhd.bi.domain.biPlatformRealData.repository.po.RealVehicleStatusPO;
|
||||
import com.mhd.bi.domain.biPlatformRealData.repository.po.RealTaskLoadPO;
|
||||
import com.mhd.bi.domain.biSnapshotSync.support.BiSnapshotWeeklyRandomDataBuilder;
|
||||
import com.mhd.bi.interfaces.facadeApi.biReport.vo.platform.PlatformSurveillanceVO;
|
||||
import com.mhd.bi.interfaces.facadeApi.biReport.vo.platform.PlatformVehicleItemVO;
|
||||
import com.mhd.bi.interfaces.facadeApi.biReport.vo.platform.TaskLoadItemVO;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Random;
|
||||
|
||||
/**
|
||||
* 月台监测-真实数据业务层(封装 YMS 跨库查询)
|
||||
* 注:列名大小写、字段类型需以实际库为准;若 YMS 库无数据/无权限,相关方法应返回空/0,不影响写死字段写入快照
|
||||
*/
|
||||
@Slf4j
|
||||
@Service
|
||||
public class BiPlatformRealDataService {
|
||||
|
||||
@Resource
|
||||
private BiPlatformRealDataMapper biPlatformRealDataMapper;
|
||||
|
||||
public List<RealPlatformVehiclePO> queryVehicles() {
|
||||
try {
|
||||
return biPlatformRealDataMapper.queryVehicles();
|
||||
} catch (Exception e) {
|
||||
log.error("【YMS】查询作业车辆列表失败: {}", e.getMessage(), e);
|
||||
return java.util.Collections.emptyList();
|
||||
}
|
||||
}
|
||||
|
||||
public RealPlatformOverviewPO queryPlatformOverview() {
|
||||
try {
|
||||
RealPlatformOverviewPO po = biPlatformRealDataMapper.queryPlatformOverview();
|
||||
if (po == null) {
|
||||
po = new RealPlatformOverviewPO();
|
||||
}
|
||||
if (po.getTotalPlatforms() == null) po.setTotalPlatforms(0L);
|
||||
if (po.getOperatingPlatforms() == null) po.setOperatingPlatforms(0L);
|
||||
return po;
|
||||
} catch (Exception e) {
|
||||
log.error("【YMS】查询月台概览失败: {}", e.getMessage(), e);
|
||||
RealPlatformOverviewPO po = new RealPlatformOverviewPO();
|
||||
po.setTotalPlatforms(0L);
|
||||
po.setOperatingPlatforms(0L);
|
||||
return po;
|
||||
}
|
||||
}
|
||||
|
||||
public long countTodayTasks() {
|
||||
try {
|
||||
Long n = biPlatformRealDataMapper.countTodayTasks();
|
||||
return n == null ? 0L : n;
|
||||
} catch (Exception e) {
|
||||
log.error("【YMS】统计今日作业任务失败: {}", e.getMessage(), e);
|
||||
return 0L;
|
||||
}
|
||||
}
|
||||
|
||||
public RealVehicleStatusPO queryVehicleStatusToday() {
|
||||
try {
|
||||
RealVehicleStatusPO po = biPlatformRealDataMapper.queryVehicleStatusToday();
|
||||
if (po == null) po = new RealVehicleStatusPO();
|
||||
if (po.getTodayReservedVehicles() == null) po.setTodayReservedVehicles(0L);
|
||||
if (po.getNotCheckedIn() == null) po.setNotCheckedIn(0L);
|
||||
if (po.getOperatingVehicles() == null) po.setOperatingVehicles(0L);
|
||||
if (po.getCompletedVehicles() == null) po.setCompletedVehicles(0L);
|
||||
return po;
|
||||
} catch (Exception e) {
|
||||
log.error("【YMS】统计车辆状态失败: {}", e.getMessage(), e);
|
||||
RealVehicleStatusPO po = new RealVehicleStatusPO();
|
||||
po.setTodayReservedVehicles(0L);
|
||||
po.setNotCheckedIn(0L);
|
||||
po.setOperatingVehicles(0L);
|
||||
po.setCompletedVehicles(0L);
|
||||
return po;
|
||||
}
|
||||
}
|
||||
|
||||
public long countMonthTasks() {
|
||||
try {
|
||||
Long n = biPlatformRealDataMapper.countMonthTasks();
|
||||
return n == null ? 0L : n;
|
||||
} catch (Exception e) {
|
||||
log.error("【YMS】统计本月任务量失败: {}", e.getMessage(), e);
|
||||
return 0L;
|
||||
}
|
||||
}
|
||||
|
||||
public List<RealTaskLoadPO> queryTaskLoadToday() {
|
||||
try {
|
||||
return biPlatformRealDataMapper.queryTaskLoadToday();
|
||||
} catch (Exception e) {
|
||||
log.error("【YMS】统计任务负荷失败: {}", e.getMessage(), e);
|
||||
return java.util.Collections.emptyList();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 实时组装月台监测数据:真实字段查 YMS 库,写死字段保留静态值。
|
||||
* 每次调用实时查库,不经过快照表。
|
||||
*/
|
||||
public PlatformSurveillanceVO buildRealTimePlatformSurveillance() {
|
||||
Random r = new Random();
|
||||
PlatformSurveillanceVO template = BiSnapshotWeeklyRandomDataBuilder.platformSurveillance(r);
|
||||
|
||||
// 作业车辆列表
|
||||
List<RealPlatformVehiclePO> realVehicles = queryVehicles();
|
||||
List<PlatformVehicleItemVO> vehicleVos = new ArrayList<>();
|
||||
for (RealPlatformVehiclePO rv : realVehicles) {
|
||||
PlatformVehicleItemVO v = new PlatformVehicleItemVO();
|
||||
v.setAppointmentTime(rv.getAppointmentTime());
|
||||
v.setWorkFloor(rv.getWorkFloor());
|
||||
v.setPlateNumber(rv.getPlateNumber());
|
||||
v.setStatus(translateFlowStatus(rv.getStatus()));
|
||||
v.setPlatformId(rv.getPlatformId());
|
||||
v.setPlatformDuration(rv.getPlatformDuration() == null ? 0 : rv.getPlatformDuration().intValue());
|
||||
vehicleVos.add(v);
|
||||
}
|
||||
if (!vehicleVos.isEmpty()) {
|
||||
template.setVehicles(vehicleVos);
|
||||
}
|
||||
|
||||
// 月台实时概览
|
||||
RealPlatformOverviewPO ov = queryPlatformOverview();
|
||||
if (template.getPlatformOverview() != null) {
|
||||
template.getPlatformOverview().setTotalPlatforms(ov.getTotalPlatforms().intValue());
|
||||
template.getPlatformOverview().setOperatingPlatforms(ov.getOperatingPlatforms().intValue());
|
||||
int total = ov.getTotalPlatforms().intValue();
|
||||
int occ = ov.getOperatingPlatforms().intValue();
|
||||
double rate = total > 0 ? Math.round(((double) occ / total) * 100.0 * 100.0) / 100.0 : 0d;
|
||||
template.getPlatformOverview().setCurrentOccupancyRate(rate);
|
||||
}
|
||||
long todayTasks = countTodayTasks();
|
||||
if (template.getPlatformOverview() != null) {
|
||||
template.getPlatformOverview().setTodayTasks((int) todayTasks);
|
||||
}
|
||||
|
||||
// 作业车辆状态统计
|
||||
RealVehicleStatusPO vs = queryVehicleStatusToday();
|
||||
if (template.getVehicleStatus() != null) {
|
||||
template.getVehicleStatus().setTodayReservedVehicles(vs.getTodayReservedVehicles().intValue());
|
||||
template.getVehicleStatus().setNotCheckedIn(vs.getNotCheckedIn().intValue());
|
||||
template.getVehicleStatus().setOperatingVehicles(vs.getOperatingVehicles().intValue());
|
||||
template.getVehicleStatus().setCompletedVehicles(vs.getCompletedVehicles().intValue());
|
||||
}
|
||||
|
||||
// 本月任务统计 taskTotal
|
||||
long monthTasks = countMonthTasks();
|
||||
if (template.getMonthlyTaskStatistics() != null) {
|
||||
template.getMonthlyTaskStatistics().setTaskTotal((int) monthTasks);
|
||||
}
|
||||
|
||||
// 任务负荷(今日 24 小时)
|
||||
List<RealTaskLoadPO> loads = queryTaskLoadToday();
|
||||
if (!loads.isEmpty() && template.getTaskLoadStatistics() != null) {
|
||||
Map<Integer, Long> hourMap = new HashMap<>();
|
||||
for (RealTaskLoadPO l : loads) {
|
||||
hourMap.put(l.getHourOfDay(), l.getTaskCount());
|
||||
}
|
||||
for (TaskLoadItemVO item : template.getTaskLoadStatistics()) {
|
||||
Integer hour = parseHourFromLabel(item.getTime());
|
||||
if (hour != null) {
|
||||
Long n = hourMap.get(hour);
|
||||
if (n != null) item.setTaskCount(n.intValue());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return template;
|
||||
}
|
||||
|
||||
private static Integer parseHourFromLabel(String label) {
|
||||
if (label == null) return null;
|
||||
try {
|
||||
String s = label.replace("时", "").trim();
|
||||
return Integer.parseInt(s);
|
||||
} catch (Exception e) {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* FLOW_STATUS 数字转中文:1已预约 2已签到 3已叫号 4已过号 5已进场 6已称重 7已装车 8二次称重 9已结算 10已还卡 11已出场 12已取消
|
||||
*/
|
||||
private static String translateFlowStatus(String flowStatus) {
|
||||
if (flowStatus == null) return null;
|
||||
switch (flowStatus.trim()) {
|
||||
case "1": return "已预约";
|
||||
case "2": return "已签到";
|
||||
case "3": return "已叫号";
|
||||
case "4": return "已过号";
|
||||
case "5": return "已进场";
|
||||
case "6": return "已称重";
|
||||
case "7": return "已装车";
|
||||
case "8": return "二次称重";
|
||||
case "9": return "已结算";
|
||||
case "10": return "已还卡";
|
||||
case "11": return "已出场";
|
||||
case "12": return "已取消";
|
||||
default: return flowStatus;
|
||||
}
|
||||
}
|
||||
}
|
||||
+1
-1
@@ -85,7 +85,7 @@ public final class BiReportSnapshotMapperSupport {
|
||||
.entryOvertimeRate(0).overtimeCount(0).platformOnTimeRate(0)
|
||||
.avgPlatformDuration(0d).yardOnTimeRate(0).avgYardDuration(0d).build())
|
||||
.platformOverview(PlatformOverviewVO.builder()
|
||||
.totalPlatforms(0).currentOccupancyRate(0).operatingPlatforms(0).todayTasks(0).build())
|
||||
.totalPlatforms(0).currentOccupancyRate(0d).operatingPlatforms(0).todayTasks(0).build())
|
||||
.vehicleStatus(VehicleStatusVO.builder()
|
||||
.todayReservedVehicles(0).notCheckedIn(0).operatingVehicles(0).completedVehicles(0).build())
|
||||
.avgOperationDurationTrend(Collections.emptyList())
|
||||
|
||||
+91
-2
@@ -13,10 +13,20 @@ import com.mhd.bi.interfaces.facadeApi.biReport.vo.platform.PlatformSurveillance
|
||||
import com.mhd.bi.interfaces.facadeApi.biReport.vo.hkMacaoZone.HkMacaoServiceZoneVO;
|
||||
import com.mhd.bi.interfaces.facadeApi.biReport.vo.transportZone.TransportOperationZoneVO;
|
||||
import com.mhd.bi.interfaces.facadeApi.biReport.vo.warehouseZone.WarehouseOperationZoneVO;
|
||||
import com.mhd.bi.interfaces.facadeApi.biReport.vo.platform.PlatformVehicleItemVO;
|
||||
import com.mhd.bi.domain.biPlatformRealData.service.BiPlatformRealDataService;
|
||||
import com.mhd.bi.domain.biPlatformRealData.repository.po.RealPlatformVehiclePO;
|
||||
import com.mhd.bi.domain.biPlatformRealData.repository.po.RealPlatformOverviewPO;
|
||||
import com.mhd.bi.domain.biPlatformRealData.repository.po.RealVehicleStatusPO;
|
||||
import com.mhd.bi.domain.biPlatformRealData.repository.po.RealTaskLoadPO;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.HashMap;
|
||||
import java.util.Random;
|
||||
|
||||
/**
|
||||
@@ -34,6 +44,7 @@ public class BiReportSnapshotSyncService {
|
||||
|
||||
private final BiSnapshotWriteMapper biSnapshotWriteMapper;
|
||||
private final ObjectMapper objectMapper;
|
||||
private final BiPlatformRealDataService biPlatformRealDataService;
|
||||
|
||||
/**
|
||||
* 依次同步各快照表;单表失败不影响其它表,只记日志。
|
||||
@@ -137,9 +148,87 @@ public class BiReportSnapshotSyncService {
|
||||
return BiSnapshotWeeklyRandomDataBuilder.warehouseTransport(new Random());
|
||||
}
|
||||
|
||||
/** TODO 业务落地:改为查询真实数据。临时实现见 {@link BiSnapshotWeeklyRandomDataBuilder#platformSurveillance(Random)}。 */
|
||||
/** TODO 业务落地:部分字段改为真实数据,其余仍写死。 */
|
||||
protected PlatformSurveillanceVO buildPlatformSurveillanceSnapshot() {
|
||||
return BiSnapshotWeeklyRandomDataBuilder.platformSurveillance(new Random());
|
||||
Random r = new Random();
|
||||
// 写死数据复用原 builder
|
||||
PlatformSurveillanceVO template = BiSnapshotWeeklyRandomDataBuilder.platformSurveillance(r);
|
||||
|
||||
// ====== 真实数据:作业车辆列表 ======
|
||||
List<RealPlatformVehiclePO> realVehicles = biPlatformRealDataService.queryVehicles();
|
||||
List<PlatformVehicleItemVO> vehicleVos = new ArrayList<>();
|
||||
for (RealPlatformVehiclePO rv : realVehicles) {
|
||||
PlatformVehicleItemVO v = new PlatformVehicleItemVO();
|
||||
v.setAppointmentTime(rv.getAppointmentTime());
|
||||
v.setWorkFloor(rv.getWorkFloor());
|
||||
v.setPlateNumber(rv.getPlateNumber());
|
||||
v.setStatus(rv.getStatus());
|
||||
v.setPlatformId(rv.getPlatformId());
|
||||
v.setPlatformDuration(rv.getPlatformDuration() == null ? 0 : rv.getPlatformDuration().intValue());
|
||||
vehicleVos.add(v);
|
||||
}
|
||||
if (!vehicleVos.isEmpty()) {
|
||||
template.setVehicles(vehicleVos);
|
||||
}
|
||||
|
||||
// ====== 真实数据:月台实时概览 ======
|
||||
RealPlatformOverviewPO ov = biPlatformRealDataService.queryPlatformOverview();
|
||||
if (template.getPlatformOverview() != null) {
|
||||
template.getPlatformOverview().setTotalPlatforms(ov.getTotalPlatforms().intValue());
|
||||
template.getPlatformOverview().setOperatingPlatforms(ov.getOperatingPlatforms().intValue());
|
||||
int total = ov.getTotalPlatforms().intValue();
|
||||
int occ = ov.getOperatingPlatforms().intValue();
|
||||
double rate = total > 0 ? Math.round(((double) occ / total) * 100.0 * 100.0) / 100.0 : 0d;
|
||||
template.getPlatformOverview().setCurrentOccupancyRate(rate);
|
||||
}
|
||||
long todayTasks = biPlatformRealDataService.countTodayTasks();
|
||||
if (template.getPlatformOverview() != null) {
|
||||
template.getPlatformOverview().setTodayTasks((int) todayTasks);
|
||||
}
|
||||
|
||||
// ====== 真实数据:作业车辆状态统计 ======
|
||||
RealVehicleStatusPO vs = biPlatformRealDataService.queryVehicleStatusToday();
|
||||
if (template.getVehicleStatus() != null) {
|
||||
template.getVehicleStatus().setTodayReservedVehicles(vs.getTodayReservedVehicles().intValue());
|
||||
template.getVehicleStatus().setNotCheckedIn(vs.getNotCheckedIn().intValue());
|
||||
template.getVehicleStatus().setOperatingVehicles(vs.getOperatingVehicles().intValue());
|
||||
template.getVehicleStatus().setCompletedVehicles(vs.getCompletedVehicles().intValue());
|
||||
}
|
||||
|
||||
// ====== 真实数据:本月任务统计 taskTotal ======
|
||||
long monthTasks = biPlatformRealDataService.countMonthTasks();
|
||||
if (template.getMonthlyTaskStatistics() != null) {
|
||||
template.getMonthlyTaskStatistics().setTaskTotal((int) monthTasks);
|
||||
}
|
||||
|
||||
// ====== 真实数据:任务负荷(今日 24 小时) ======
|
||||
List<RealTaskLoadPO> loads = biPlatformRealDataService.queryTaskLoadToday();
|
||||
if (!loads.isEmpty() && template.getTaskLoadStatistics() != null) {
|
||||
Map<Integer, Long> hourMap = new HashMap<>();
|
||||
for (RealTaskLoadPO l : loads) {
|
||||
hourMap.put(l.getHourOfDay(), l.getTaskCount());
|
||||
}
|
||||
for (com.mhd.bi.interfaces.facadeApi.biReport.vo.platform.TaskLoadItemVO item : template.getTaskLoadStatistics()) {
|
||||
Integer hour = parseHourFromLabel(item.getTime());
|
||||
if (hour != null) {
|
||||
Long n = hourMap.get(hour);
|
||||
if (n != null) item.setTaskCount(n.intValue());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return template;
|
||||
}
|
||||
|
||||
private static Integer parseHourFromLabel(String label) {
|
||||
if (label == null) return null;
|
||||
// "15时" -> 15
|
||||
try {
|
||||
String s = label.replace("时", "").trim();
|
||||
return Integer.parseInt(s);
|
||||
} catch (Exception e) {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
+5
-1
@@ -127,6 +127,8 @@ public final class BiSnapshotWeeklyRandomDataBuilder {
|
||||
for (String[] row : Baseline.P_PLATES) {
|
||||
int dur = jitterInt(Integer.parseInt(row[3]), r);
|
||||
vehicles.add(PlatformVehicleItemVO.builder()
|
||||
.appointmentTime(Baseline.P_APPOINTMENT_TIME)
|
||||
.workFloor(Baseline.P_WORK_FLOOR)
|
||||
.plateNumber(row[0])
|
||||
.status(row[1])
|
||||
.platformId(row[2])
|
||||
@@ -145,7 +147,7 @@ public final class BiSnapshotWeeklyRandomDataBuilder {
|
||||
|
||||
PlatformOverviewVO overview = PlatformOverviewVO.builder()
|
||||
.totalPlatforms(Math.max(1, jitterInt(Baseline.P_TOT_PL, r)))
|
||||
.currentOccupancyRate(jitterPercentInt(Baseline.P_OCC, r))
|
||||
.currentOccupancyRate((double) jitterPercentInt(Baseline.P_OCC, r))
|
||||
.operatingPlatforms(Math.max(0, jitterInt(Baseline.P_OP, r)))
|
||||
.todayTasks(Math.max(0, jitterInt(Baseline.P_TASKS, r)))
|
||||
.build();
|
||||
@@ -394,6 +396,8 @@ public final class BiSnapshotWeeklyRandomDataBuilder {
|
||||
static final String[] W_CUST_NAMES = {"华东冷链", "华南汽配", "西南快消", "华北家电", "跨境达"};
|
||||
static final int[] W_CUST_AMT = {198, 172, 205, 189, 221};
|
||||
|
||||
static final String P_APPOINTMENT_TIME = "2026-08-03 09:30:00";
|
||||
static final String P_WORK_FLOOR = "一楼";
|
||||
static final String[][] P_PLATES = {
|
||||
{"粤A12345", "待入场", "#12", "88"},
|
||||
{"闽D99887", "作业中", "#07", "142"},
|
||||
|
||||
@@ -3,6 +3,7 @@ package com.mhd.bi.interfaces.facadeApi.biReport;
|
||||
import com.mhd.bi.domain.biSnapshotSync.service.BiReportSnapshotSyncService;
|
||||
import com.mhd.bi.domain.biComprehensive.service.BiComprehensiveReportService;
|
||||
import com.mhd.bi.domain.biPlatformSurveillance.service.BiPlatformSurveillanceReportService;
|
||||
import com.mhd.bi.domain.biPlatformRealData.service.BiPlatformRealDataService;
|
||||
import com.mhd.bi.domain.biOverallOperation.service.BiOverallOperationReportService;
|
||||
import com.mhd.bi.domain.biHkMacaoServiceZone.service.BiHkMacaoServiceZoneReportService;
|
||||
import com.mhd.bi.domain.biTransportOperationZone.service.BiTransportOperationZoneReportService;
|
||||
@@ -48,6 +49,9 @@ public class BiReportApi extends BaseController {
|
||||
@Autowired
|
||||
private BiPlatformSurveillanceReportService biPlatformSurveillanceReportService;
|
||||
|
||||
@Autowired
|
||||
private BiPlatformRealDataService biPlatformRealDataService;
|
||||
|
||||
@Autowired
|
||||
private BiOverallOperationReportService biOverallOperationReportService;
|
||||
|
||||
@@ -92,12 +96,12 @@ public class BiReportApi extends BaseController {
|
||||
}
|
||||
|
||||
/**
|
||||
* 月台监测指标查询(按照 del_flag=1,按 create_time 最新一条)
|
||||
* 月台监测指标查询(实时查 YMS 库,真实字段 + 写死字段)
|
||||
*/
|
||||
@ApiOperation(value = "月台监测指标查询", notes = "返回 DEL_FLAG=1 且 CREATE_TIME 最新的一条快照")
|
||||
@ApiOperation(value = "月台监测指标查询", notes = "每次调用实时查询 YMS 库组装;部分字段为真实业务数据,部分为写死数据")
|
||||
@GetMapping("/platformSurveillance")
|
||||
public BiApiResult<PlatformSurveillanceVO> platformSurveillance() {
|
||||
PlatformSurveillanceVO data = biPlatformSurveillanceReportService.loadLatestPlatformSurveillance();
|
||||
PlatformSurveillanceVO data = biPlatformRealDataService.buildRealTimePlatformSurveillance();
|
||||
return BiApiResult.ok(data);
|
||||
}
|
||||
//园区物流大屏接口----------------------------------------------------------------------
|
||||
|
||||
+2
@@ -1,5 +1,6 @@
|
||||
package com.mhd.bi.interfaces.facadeApi.biReport.vo.hkMacaoZone;
|
||||
|
||||
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
|
||||
import com.fasterxml.jackson.annotation.JsonProperty;
|
||||
import io.swagger.annotations.ApiModel;
|
||||
import io.swagger.annotations.ApiModelProperty;
|
||||
@@ -17,6 +18,7 @@ import java.util.List;
|
||||
@Builder
|
||||
@NoArgsConstructor
|
||||
@AllArgsConstructor
|
||||
@JsonIgnoreProperties(ignoreUnknown = true)
|
||||
@ApiModel("BI-港澳服务专区")
|
||||
public class HkMacaoServiceZoneVO {
|
||||
|
||||
|
||||
+2
@@ -1,5 +1,6 @@
|
||||
package com.mhd.bi.interfaces.facadeApi.biReport.vo.hkMacaoZone;
|
||||
|
||||
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
|
||||
import io.swagger.annotations.ApiModel;
|
||||
import io.swagger.annotations.ApiModelProperty;
|
||||
import lombok.AllArgsConstructor;
|
||||
@@ -11,6 +12,7 @@ import lombok.NoArgsConstructor;
|
||||
@Builder
|
||||
@NoArgsConstructor
|
||||
@AllArgsConstructor
|
||||
@JsonIgnoreProperties(ignoreUnknown = true)
|
||||
@ApiModel("BI-港澳服务专区-地图点位")
|
||||
public class HkMapPointVO {
|
||||
|
||||
|
||||
+21
@@ -1,5 +1,6 @@
|
||||
package com.mhd.bi.interfaces.facadeApi.biReport.vo.hkMacaoZone;
|
||||
|
||||
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
|
||||
import com.fasterxml.jackson.annotation.JsonProperty;
|
||||
import io.swagger.annotations.ApiModel;
|
||||
import io.swagger.annotations.ApiModelProperty;
|
||||
@@ -38,4 +39,24 @@ public class HkVehicleDetailsVO {
|
||||
@JsonProperty("update_time")
|
||||
@ApiModelProperty("更新时间")
|
||||
private String updateTime;
|
||||
|
||||
@ApiModelProperty("状态")
|
||||
private String status;
|
||||
|
||||
@ApiModelProperty("运输方向")
|
||||
private String direction;
|
||||
|
||||
@ApiModelProperty("货物类型")
|
||||
private String cargo;
|
||||
|
||||
@ApiModelProperty("预计到达时间")
|
||||
private String eta;
|
||||
|
||||
@JsonProperty("transportion_number")
|
||||
@ApiModelProperty("运单号")
|
||||
private String transportionNumber;
|
||||
|
||||
@JsonProperty("cargo_source")
|
||||
@ApiModelProperty("货源")
|
||||
private String cargoSource;
|
||||
}
|
||||
|
||||
+1
-1
@@ -18,7 +18,7 @@ public class PlatformOverviewVO {
|
||||
private Integer totalPlatforms;
|
||||
|
||||
@ApiModelProperty("当前占用率,单位:%")
|
||||
private Integer currentOccupancyRate;
|
||||
private Double currentOccupancyRate;
|
||||
|
||||
@ApiModelProperty("当前作业中,单位:个")
|
||||
private Integer operatingPlatforms;
|
||||
|
||||
+6
@@ -14,6 +14,12 @@ import lombok.NoArgsConstructor;
|
||||
@ApiModel("月台监测-作业车辆")
|
||||
public class PlatformVehicleItemVO {
|
||||
|
||||
@ApiModelProperty("预约申请时间")
|
||||
private String appointmentTime;
|
||||
|
||||
@ApiModelProperty("作业楼层")
|
||||
private String workFloor;
|
||||
|
||||
@ApiModelProperty("车牌号码")
|
||||
private String plateNumber;
|
||||
|
||||
|
||||
@@ -16,17 +16,17 @@ spring:
|
||||
# 线上测试环境配置 容器名+端口号
|
||||
# server-addr: 10.33.0.129:6010
|
||||
# server-addr: 10.102.192.5:6848
|
||||
# username: nacos
|
||||
# password: manhuoda@2023
|
||||
#线上正式环境
|
||||
server-addr: 10.102.192.31:6848
|
||||
username: nacos
|
||||
password: manhuoda@2023
|
||||
#线上正式环境
|
||||
server-addr: 10.102.192.30:6848
|
||||
# username: nacos
|
||||
# password: manhuoda@2023
|
||||
config:
|
||||
# server-addr: 127.0.0.1:8848
|
||||
# 线上测试环境配置 容器名+端口号
|
||||
# server-addr: 10.33.0.129:6010
|
||||
server-addr: 10.102.192.31:6848
|
||||
server-addr: 10.102.192.30:6848
|
||||
username: nacos
|
||||
password: manhuoda@2023
|
||||
#线上正式环境
|
||||
|
||||
@@ -0,0 +1,79 @@
|
||||
<?xml version="1.0" encoding="UTF-8" ?>
|
||||
<!DOCTYPE mapper
|
||||
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
|
||||
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
|
||||
<mapper namespace="com.mhd.bi.domain.biPlatformRealData.repository.mapper.BiPlatformRealDataMapper">
|
||||
|
||||
<!-- 作业车辆状态列表(vehicles):
|
||||
plateNumber <- qms_main_business.CAR_NO
|
||||
status <- qms_main_business.FLOW_STATUS
|
||||
platformId <- qms_main_business.WINDOW_NAME(叫号月台,主业务表直接有)
|
||||
platformDuration <- qms_main_business.EXIT_TIME - ENTRY_TIME(分钟)
|
||||
appointmentTime <- qms_main_business.CREATE_TIME
|
||||
workFloor <- qms_window_info.PLATFORM_FLOOR(按 WINDOW_NAME 关联)
|
||||
-->
|
||||
<select id="queryVehicles" resultType="com.mhd.bi.domain.biPlatformRealData.repository.po.RealPlatformVehiclePO">
|
||||
SELECT
|
||||
mb.CAR_NO AS plateNumber,
|
||||
mb.FLOW_STATUS AS status,
|
||||
mb.WINDOW_NAME AS platformId,
|
||||
CASE
|
||||
WHEN mb.EXIT_TIME IS NOT NULL AND mb.ENTRY_TIME IS NOT NULL
|
||||
THEN CAST((mb.EXIT_TIME - mb.ENTRY_TIME) * 24 * 60 AS BIGINT)
|
||||
ELSE 0
|
||||
END AS platformDuration,
|
||||
TO_CHAR(mb.CREATE_TIME, 'YYYY-MM-DD HH24:MI:SS') AS appointmentTime,
|
||||
wi.PLATFORM_FLOOR AS workFloor
|
||||
FROM NGWL_TEST_YMS.QMS_MAIN_BUSINESS mb
|
||||
LEFT JOIN NGWL_TEST_YMS.QMS_WINDOW_INFO wi
|
||||
ON wi.WINDOW_NAME = mb.WINDOW_NAME
|
||||
ORDER BY mb.CREATE_TIME DESC
|
||||
</select>
|
||||
|
||||
<!-- 月台概览:totalPlatforms(总条数)、operatingPlatforms(作业状态=占用,JOB_STATUS: 0空闲 1占用) -->
|
||||
<select id="queryPlatformOverview" resultType="com.mhd.bi.domain.biPlatformRealData.repository.po.RealPlatformOverviewPO">
|
||||
SELECT
|
||||
COUNT(1) AS totalPlatforms,
|
||||
SUM(CASE WHEN JOB_STATUS = 1 THEN 1 ELSE 0 END) AS operatingPlatforms
|
||||
FROM NGWL_TEST_YMS.QMS_WINDOW_INFO
|
||||
</select>
|
||||
|
||||
<!-- 今日作业任务:实际进入时间是今日的 -->
|
||||
<select id="countTodayTasks" resultType="java.lang.Long">
|
||||
SELECT COUNT(1)
|
||||
FROM NGWL_TEST_YMS.QMS_MAIN_BUSINESS
|
||||
WHERE ENTRY_TIME IS NOT NULL
|
||||
AND TRUNC(ENTRY_TIME) = TRUNC(SYSDATE)
|
||||
</select>
|
||||
|
||||
<!-- 车辆状态统计:今日的统计(按创建时间 / 流程状态)
|
||||
FLOW_STATUS: 1已预约 2已签到 3已叫号 4已过号 5已进场 6已称重 7已装车 8二次称重 9已结算 10已还卡 11已出场 12已取消 -->
|
||||
<select id="queryVehicleStatusToday" resultType="com.mhd.bi.domain.biPlatformRealData.repository.po.RealVehicleStatusPO">
|
||||
SELECT
|
||||
SUM(CASE WHEN TRUNC(CREATE_TIME) = TRUNC(SYSDATE) THEN 1 ELSE 0 END) AS todayReservedVehicles,
|
||||
SUM(CASE WHEN FLOW_STATUS = '1' AND TRUNC(CREATE_TIME) = TRUNC(SYSDATE) THEN 1 ELSE 0 END) AS notCheckedIn,
|
||||
SUM(CASE WHEN FLOW_STATUS IN ('5','6','7','8','9','10') AND TRUNC(CREATE_TIME) = TRUNC(SYSDATE) THEN 1 ELSE 0 END) AS operatingVehicles,
|
||||
SUM(CASE WHEN FLOW_STATUS = '11' AND TRUNC(CREATE_TIME) = TRUNC(SYSDATE) THEN 1 ELSE 0 END) AS completedVehicles
|
||||
FROM NGWL_TEST_YMS.QMS_MAIN_BUSINESS
|
||||
</select>
|
||||
|
||||
<!-- 本月任务量:实际进入时间是本月的 -->
|
||||
<select id="countMonthTasks" resultType="java.lang.Long">
|
||||
SELECT COUNT(1)
|
||||
FROM NGWL_TEST_YMS.QMS_MAIN_BUSINESS
|
||||
WHERE ENTRY_TIME IS NOT NULL
|
||||
AND TO_CHAR(ENTRY_TIME, 'YYYY-MM') = TO_CHAR(SYSDATE, 'YYYY-MM')
|
||||
</select>
|
||||
|
||||
<!-- 任务负荷(今日 24 小时时段):按 EXTRACT(HOUR FROM ENTRY_TIME) 统计 -->
|
||||
<select id="queryTaskLoadToday" resultType="com.mhd.bi.domain.biPlatformRealData.repository.po.RealTaskLoadPO">
|
||||
SELECT
|
||||
EXTRACT(HOUR FROM ENTRY_TIME) AS hourOfDay,
|
||||
COUNT(1) AS taskCount
|
||||
FROM NGWL_TEST_YMS.QMS_MAIN_BUSINESS
|
||||
WHERE ENTRY_TIME IS NOT NULL
|
||||
AND TRUNC(ENTRY_TIME) = TRUNC(SYSDATE)
|
||||
GROUP BY EXTRACT(HOUR FROM ENTRY_TIME)
|
||||
ORDER BY EXTRACT(HOUR FROM ENTRY_TIME)
|
||||
</select>
|
||||
</mapper>
|
||||
+2
-2
@@ -32,8 +32,8 @@ public class TmsAddressMultiDTO {
|
||||
@ApiModelProperty(value = "装卸货联系人电话")
|
||||
private String contactPhone;
|
||||
@ApiModelProperty(value = "装卸货日期(年月日)")
|
||||
@JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd")
|
||||
@DateTimeFormat(pattern="yyyy-MM-dd")
|
||||
@JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
|
||||
@DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
|
||||
private Date layDate;
|
||||
@ApiModelProperty(value = "装卸货时间(上午、下午、24小时)")
|
||||
private String layTime;
|
||||
|
||||
+2
@@ -33,4 +33,6 @@ public class WarehousePO implements Serializable {
|
||||
@Excel(name = "仓库名称")
|
||||
private String warehouseName;
|
||||
|
||||
@Excel(name = "是否启用: 1-否 2-是")
|
||||
private Integer isEnable;
|
||||
}
|
||||
|
||||
+3
@@ -46,6 +46,9 @@ public class MdmMerchantRecordDTO implements Serializable {
|
||||
@ApiModelProperty("电子邮件")
|
||||
private String desc16;
|
||||
|
||||
@ApiModelProperty("nc编码")
|
||||
private String desc17;
|
||||
|
||||
@ApiModelProperty("身份证号")
|
||||
private String desc23;
|
||||
|
||||
|
||||
+1
-10
@@ -95,21 +95,12 @@ public final class MdmMerchantSyncFilter {
|
||||
|
||||
public static SkipReason resolveSkipReason(MdmMerchantRecordDTO record, String orgNcCode,
|
||||
Long syncOrganizationId, Long topOrganizationId) {
|
||||
if (record == null || StringUtils.isEmpty(record.getCode())) {
|
||||
if (StringUtils.isEmpty(trim(record.getDesc17()))) {
|
||||
return SkipReason.EMPTY_CODE;
|
||||
}
|
||||
if (!isCustomer(record)) {
|
||||
return SkipReason.NOT_CUSTOMER;
|
||||
}
|
||||
if (StringUtils.isNotEmpty(orgNcCode) && !orgNcCode.equals(trim(record.getCode()))) {
|
||||
return SkipReason.ORG_MISMATCH;
|
||||
}
|
||||
if (StringUtils.isEmpty(trim(record.getDesc1()))) {
|
||||
return SkipReason.MISSING_NAME;
|
||||
}
|
||||
if (isDisabled(record)) {
|
||||
return SkipReason.DISABLED;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
|
||||
@@ -191,6 +191,7 @@ public class AuthFilter implements GlobalFilter, Ordered
|
||||
|
||||
/**
|
||||
* 获取请求token
|
||||
* 优先从 Authorization 请求头获取,其次从 URL 参数 token 获取(SSO场景)
|
||||
*/
|
||||
private String getToken(ServerHttpRequest request)
|
||||
{
|
||||
@@ -200,6 +201,11 @@ public class AuthFilter implements GlobalFilter, Ordered
|
||||
{
|
||||
token = token.replaceFirst(TokenConstants.PREFIX, StringUtils.EMPTY);
|
||||
}
|
||||
// 兜底:从URL参数中获取token(SSO单点登录场景,前端尚未存入localStorage时)
|
||||
if (StringUtils.isEmpty(token))
|
||||
{
|
||||
token = request.getQueryParams().getFirst("token");
|
||||
}
|
||||
return token;
|
||||
}
|
||||
|
||||
|
||||
@@ -13,24 +13,24 @@ spring:
|
||||
cloud:
|
||||
nacos:
|
||||
discovery:
|
||||
# server-addr: 127.0.0.1:8848
|
||||
server-addr: 127.0.0.1:8848
|
||||
# 线上测试环境配置 容器名+端口号
|
||||
# server-addr: 10.102.192.31:6848
|
||||
server-addr: 10.33.0.129:6010
|
||||
# server-addr: 10.33.0.129:6010
|
||||
#线上正式环境
|
||||
# server-addr: 127.0.0.1:8848
|
||||
# server-addr: 10.102.192.31:6848
|
||||
username: nacos
|
||||
password: manhuoda@2023
|
||||
# username: nacos
|
||||
# password: manhuoda@2023
|
||||
config:
|
||||
# server-addr: 127.0.0.1:8848
|
||||
server-addr: 127.0.0.1:8848
|
||||
# 线上测试环境配置 容器名+端口号
|
||||
server-addr: 10.33.0.129:6010
|
||||
# server-addr: 10.33.0.129:6010
|
||||
#线上正式环境
|
||||
# server-addr: 127.0.0.1:8848
|
||||
# server-addr: 10.102.192.31:6848
|
||||
username: nacos
|
||||
password: manhuoda@2023
|
||||
# username: nacos
|
||||
# password: manhuoda@2023
|
||||
group: DEFAULT_GROUP # 默认分组就是DEFAULT_GROUP,如果使用默认分组可以不配置
|
||||
file-extension: yml #默认properties
|
||||
# 共享配置
|
||||
|
||||
+127
-2
@@ -40,6 +40,14 @@ import org.springframework.beans.BeanUtils;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.scheduling.annotation.Scheduled;
|
||||
import org.springframework.stereotype.Service;
|
||||
import com.mhd.basic.interfaces.dto.shipperLeaseDetailsApi.WarehouseLeaseExportVO;
|
||||
import com.mhd.common.core.utils.poi.ExcelUtil;
|
||||
import javax.servlet.http.HttpServletResponse;
|
||||
import java.io.IOException;
|
||||
import java.net.URLEncoder;
|
||||
import java.text.SimpleDateFormat;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
import java.time.LocalDate;
|
||||
@@ -277,7 +285,8 @@ public class LeaseApplicationService {
|
||||
final Date yesterday = DateUtil.beginOfDay(DateUtil.offsetDay(new Date(), -1));
|
||||
|
||||
LeaseDO leaseDO = new LeaseDO();
|
||||
leaseDO.setTime(yesterday);
|
||||
leaseDO.setTime(yesterday); // 设置查询时间
|
||||
leaseDO.setStatus(1); // 只查询启用状态的租赁,停用的不参与出租率计算
|
||||
//查询有效期内的租赁
|
||||
List<LeasePO> leasePOS = queryList(leaseDO);
|
||||
List<LeasePO> entireUnit = leasePOS.stream()
|
||||
@@ -494,6 +503,103 @@ public class LeaseApplicationService {
|
||||
return warehouseOccupancyRatesList;
|
||||
}
|
||||
|
||||
/**
|
||||
* 导出仓库出租率及客户租赁明细(单 sheet,明细行带仓库当日汇总列)
|
||||
* 参数与 /warehouseOccupancyRate、/list 一致
|
||||
*/
|
||||
public void exportOccupancyRate(HttpServletResponse response, ShipperLeaseDetailsDO shipperLeaseDetailsDO) throws IOException {
|
||||
// 注意:本方法不调用 warehouseOccupancyRate(),因为该方法在不传 warehouseId 时
|
||||
// totalArea 会算成全系统所有仓库库区面积之和(如 6168),导致导出面积/日租率错误。
|
||||
// 这里自行按 (业务日期 + 仓库) 维度计算,保证多仓库导出时每个仓库的面积/日租率正确。
|
||||
|
||||
// ===== 1. 查全部明细(用副本 DO,避免影响外部)=====
|
||||
ShipperLeaseDetailsDO detailDO = new ShipperLeaseDetailsDO();
|
||||
BeanUtils.copyProperties(shipperLeaseDetailsDO, detailDO);
|
||||
List<ShipperLeaseDetailsPO> detailList = shipperLeaseDetailsService.queryList(detailDO);
|
||||
if (detailList == null) {
|
||||
detailList = new ArrayList<>();
|
||||
}
|
||||
|
||||
// ===== 2. 预算每个仓库的总面积(启用库区的 storageRegion 累加),建 warehouseId -> totalArea 映射 =====
|
||||
Set<Long> warehouseIds = detailList.stream()
|
||||
.map(ShipperLeaseDetailsPO::getWarehouseId)
|
||||
.filter(Objects::nonNull)
|
||||
.collect(Collectors.toSet());
|
||||
Map<Long, BigDecimal> warehouseTotalAreaMap = new HashMap<>();
|
||||
for (Long wid : warehouseIds) {
|
||||
StorageSectionDO storageSectionDO = new StorageSectionDO();
|
||||
storageSectionDO.setWarehouseId(wid);
|
||||
storageSectionDO.setOpeningUp(1);
|
||||
List<StorageSectionPO> sections = storageSectionApplicationService.queryList(storageSectionDO);
|
||||
BigDecimal area = BigDecimal.ZERO;
|
||||
for (StorageSectionPO s : sections) {
|
||||
area = area.add(s.getStorageRegion() == null ? BigDecimal.ZERO : s.getStorageRegion());
|
||||
}
|
||||
warehouseTotalAreaMap.put(wid, area);
|
||||
}
|
||||
|
||||
// ===== 3. 按 (业务日期 + 仓库ID) 聚合,算每个仓库当天的整租/散租面积 =====
|
||||
// summaryMap: key -> [整租面积, 散租面积]
|
||||
SimpleDateFormat keySdf = new SimpleDateFormat("yyyy-MM-dd");
|
||||
Map<String, BigDecimal[]> summaryMap = new HashMap<>();
|
||||
for (ShipperLeaseDetailsPO d : detailList) {
|
||||
String key = (d.getBusinessDate() == null ? "" : keySdf.format(d.getBusinessDate()))
|
||||
+ "_" + d.getWarehouseId();
|
||||
BigDecimal[] arr = summaryMap.computeIfAbsent(key, k -> new BigDecimal[]{BigDecimal.ZERO, BigDecimal.ZERO});
|
||||
BigDecimal leaseArea = d.getLeaseArea() == null ? BigDecimal.ZERO : d.getLeaseArea();
|
||||
if ("整租".equals(d.getLeaseType())) {
|
||||
arr[0] = arr[0].add(leaseArea);
|
||||
} else {
|
||||
arr[1] = arr[1].add(leaseArea);
|
||||
}
|
||||
}
|
||||
|
||||
// ===== 4. 明细为主,每行拼上对应仓库当天的汇总(总面积/日租率按仓库单独算)=====
|
||||
List<WarehouseLeaseExportVO> exportList = new ArrayList<>();
|
||||
for (ShipperLeaseDetailsPO d : detailList) {
|
||||
WarehouseLeaseExportVO vo = new WarehouseLeaseExportVO();
|
||||
// 明细列
|
||||
vo.setBusinessDate(d.getBusinessDate());
|
||||
vo.setOrganizationName(d.getOrganizationName());
|
||||
vo.setWarehouseName(d.getWarehouseName());
|
||||
vo.setCargoOwnerName(d.getCargoOwnerName());
|
||||
vo.setLeaseType(d.getLeaseType());
|
||||
vo.setLeaseArea(d.getLeaseArea());
|
||||
// 汇总列
|
||||
String key = (d.getBusinessDate() == null ? "" : keySdf.format(d.getBusinessDate()))
|
||||
+ "_" + d.getWarehouseId();
|
||||
BigDecimal[] arr = summaryMap.get(key);
|
||||
BigDecimal entireLeaseArea = (arr != null) ? arr[0] : BigDecimal.ZERO;
|
||||
BigDecimal fractionalLeaseArea = (arr != null) ? arr[1] : BigDecimal.ZERO;
|
||||
vo.setEntireLeaseArea(entireLeaseArea);
|
||||
vo.setFractionalLeaseArea(fractionalLeaseArea);
|
||||
// 该仓库的总面积(按仓库单独算,不再用全局总和)
|
||||
BigDecimal widTotalArea = warehouseTotalAreaMap.getOrDefault(d.getWarehouseId(), BigDecimal.ZERO);
|
||||
vo.setTotalArea(widTotalArea);
|
||||
// 日租率 = (整租+散租) / 总面积 × 100,保留2位小数(直接输出百分比值,如 10.00)
|
||||
BigDecimal leaseSum = entireLeaseArea.add(fractionalLeaseArea);
|
||||
BigDecimal dailyRate = widTotalArea.compareTo(BigDecimal.ZERO) == 0
|
||||
? BigDecimal.ZERO
|
||||
: leaseSum.multiply(new BigDecimal("100")).divide(widTotalArea, 2, BigDecimal.ROUND_HALF_UP);
|
||||
vo.setDailyRentalRate(dailyRate);
|
||||
exportList.add(vo);
|
||||
}
|
||||
|
||||
// ===== 5. 按业务日期降序、仓库名升序排序(null 排最后)=====
|
||||
exportList.sort(Comparator
|
||||
.comparing(WarehouseLeaseExportVO::getBusinessDate, Comparator.nullsLast(Comparator.reverseOrder()))
|
||||
.thenComparing(WarehouseLeaseExportVO::getWarehouseName, Comparator.nullsLast(Comparator.naturalOrder())));
|
||||
|
||||
// ===== 6. 用 ExcelUtil 导出(项目通用做法,单 sheet)=====
|
||||
String fileName = URLEncoder.encode("仓库出租率导出", "UTF-8").replaceAll("\\+", "%20");
|
||||
response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
|
||||
response.setCharacterEncoding("utf-8");
|
||||
response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".xlsx");
|
||||
|
||||
ExcelUtil<WarehouseLeaseExportVO> util = new ExcelUtil<>(WarehouseLeaseExportVO.class);
|
||||
util.exportExcel(response, exportList, "仓库出租率");
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 定时任务整租推送到bms
|
||||
@@ -537,7 +643,7 @@ public class LeaseApplicationService {
|
||||
/**
|
||||
* 定时任务散租推送到bms
|
||||
*/
|
||||
@Scheduled(cron = "0 0 0 * * ?")
|
||||
// @Scheduled(cron = "0 0 0 * * ?")
|
||||
public void ScatteredRentalSynchronization() {
|
||||
LeaseDO leaseDO = new LeaseDO();
|
||||
leaseDO.setTime(new Date());
|
||||
@@ -581,6 +687,25 @@ public class LeaseApplicationService {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 启用/停用租赁
|
||||
* @param leaseIds 租赁ID列表
|
||||
* @param status 目标状态:1=启用,0=停用
|
||||
*/
|
||||
public Boolean updateStatus(List<Long> leaseIds, Integer status) {
|
||||
LoginUser loginUser = SecurityUtils.getLoginUser();
|
||||
Long updateBy = loginUser != null ? loginUser.getUserid() : null;
|
||||
String updateByName = loginUser != null ? loginUser.getUsername() : null;
|
||||
if (leaseIds == null || leaseIds.isEmpty()) {
|
||||
throw new ServiceException("租赁ID不能为空");
|
||||
}
|
||||
if (status == null || (status != 0 && status != 1)) {
|
||||
throw new ServiceException("状态值无效:1=启用,0=停用");
|
||||
}
|
||||
log.info("启用/停用租赁--结束,leaseIds={},状态={},更新人id={},更新人名称={}",leaseIds,status==0?"停用":"启用",updateBy,updateByName);
|
||||
return leaseDomainService.updateStatus(leaseIds, status, updateBy, updateByName);
|
||||
}
|
||||
|
||||
// /**
|
||||
// * @description 设置数据字典键值
|
||||
// * @author ZhouGY
|
||||
|
||||
+56
-3
@@ -759,6 +759,10 @@ public class ContractManageApplicationService {
|
||||
}
|
||||
//根据合同编码查询保存合同信息
|
||||
ContractManagePO contractManagePO = contractManageDomainService.getInfoByCode1(contractManageDO.getOriginalContractNumber());
|
||||
//修改时,不管前端是否传明细,都需要先删除该合同原有的明细,避免明细为空时老明细仍在
|
||||
if (!isInsert) {
|
||||
contractManageDetailMapper.delete(new LambdaQueryWrapper<ContractManageDetail>().eq(ContractManageDetail::getContractManageId, contractManageDO.getContractManageId()));
|
||||
}
|
||||
//保存合同详情科目
|
||||
List<ContractManageDetailDTO> contractManageDetailDTOList = contractManageDO.getContractManageDetailDTOList();
|
||||
if(null != contractManageDetailDTOList && contractManageDetailDTOList.size()>0){
|
||||
@@ -830,8 +834,9 @@ public class ContractManageApplicationService {
|
||||
if (isInsert) {
|
||||
// 新增/复制时使用新插入的合同ID
|
||||
contractManageDetailDO.setContractManageId(contractManageDO.getContractManageId());
|
||||
} else if(null != contractManagePO){
|
||||
contractManageDetailDO.setContractManageId(contractManagePO.getContractManageId());
|
||||
} else {
|
||||
// 修改时使用当前正在修改的合同ID,不能用 getInfoByCode1 查到的(避免多条合同 originalContractNumber 相同导致明细错绑)
|
||||
contractManageDetailDO.setContractManageId(contractManageDO.getContractManageId());
|
||||
}
|
||||
contractManageDetailDO.setTopOrganizationId(loginUser.getUserPo().getTopOrganizationId());
|
||||
contractManageDetailDO.setOrganizationId(loginUser.getUserPo().getOrganizationId());
|
||||
@@ -977,7 +982,8 @@ public class ContractManageApplicationService {
|
||||
&& Objects.equals(item.getContractType(), contractType))
|
||||
.collect(Collectors.toList());
|
||||
if (contractManagePOs != null && contractManagePOs.size() > 1) {
|
||||
throw new ServiceException("存在多条相同费用科目的合同,请检查");
|
||||
resultContract.setIsMany("1");
|
||||
return resultContract;
|
||||
}
|
||||
if(contractManagePOList != null && contractManagePOList.size()>0){
|
||||
if(StringUtils.isNotEmpty(settlementCustomersCode)){
|
||||
@@ -1118,4 +1124,51 @@ public class ContractManageApplicationService {
|
||||
public ContractManagePO getGeneralContract() {
|
||||
return contractManageDomainService.getGeneralContract();
|
||||
}
|
||||
|
||||
/**
|
||||
* 合同导出(合同头字段 + 明细拍平成一行一条明细)
|
||||
*/
|
||||
public List<ContractManageExportVO> buildExportList(ContractManageDO contractManageDO) {
|
||||
List<ContractManagePO> contractList = this.queryList(contractManageDO);
|
||||
List<ContractManageExportVO> exportList = new ArrayList<>();
|
||||
if (contractList == null || contractList.isEmpty()) {
|
||||
return exportList;
|
||||
}
|
||||
List<Long> contractManageIds = contractList.stream()
|
||||
.map(ContractManagePO::getContractManageId)
|
||||
.collect(Collectors.toList());
|
||||
Map<Long, List<ContractManageDetailPO>> detailMap = contractManageDetailDomainService
|
||||
.queryListByManageIds(contractManageIds).stream()
|
||||
.collect(Collectors.groupingBy(ContractManageDetailPO::getContractManageId));
|
||||
|
||||
for (ContractManagePO contract : contractList) {
|
||||
List<ContractManageDetailPO> details = detailMap.get(contract.getContractManageId());
|
||||
if (details != null && !details.isEmpty()) {
|
||||
for (ContractManageDetailPO detail : details) {
|
||||
ContractManageExportVO vo = new ContractManageExportVO();
|
||||
// 合同头字段整体复制
|
||||
BeanUtils.copyProperties(contract, vo);
|
||||
// 明细字段显式赋值(合同头/明细存在同名字段,避免互相覆盖)
|
||||
vo.setSubjectType(detail.getSubjectType());
|
||||
vo.setFirstSubjectCode(detail.getFirstSubjectCode());
|
||||
vo.setFirstSubjectName(detail.getFirstSubjectName());
|
||||
vo.setSecondSubjectCode(detail.getSecondSubjectCode());
|
||||
vo.setSecondSubjectName(detail.getSecondSubjectName());
|
||||
vo.setAccountingStrategy(detail.getAccountingStrategy());
|
||||
vo.setBillingAttributes(detail.getBillingAttributes());
|
||||
vo.setSubjectEffectiveDate(detail.getSubjectEffectiveDate());
|
||||
vo.setSubjectExpirationDate(detail.getSubjectExpirationDate());
|
||||
vo.setDocumentType(detail.getDocumentType());
|
||||
vo.setServiceItemsName(detail.getServiceItemsName());
|
||||
exportList.add(vo);
|
||||
}
|
||||
} else {
|
||||
// 无明细的合同也保留一行头字段
|
||||
ContractManageExportVO vo = new ContractManageExportVO();
|
||||
BeanUtils.copyProperties(contract, vo);
|
||||
exportList.add(vo);
|
||||
}
|
||||
}
|
||||
return exportList;
|
||||
}
|
||||
}
|
||||
+35
-5
@@ -30,11 +30,7 @@ import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Date;
|
||||
import java.util.List;
|
||||
import java.util.Objects;
|
||||
import java.util.Set;
|
||||
import java.util.*;
|
||||
import java.util.stream.Collectors;
|
||||
import java.util.stream.Stream;
|
||||
|
||||
@@ -580,6 +576,40 @@ public class ExpenseAccountApplicationService {
|
||||
return expenseAccountDomainService.getInfoByCode2(subjectCode,topOrganizationId);
|
||||
}
|
||||
|
||||
/**
|
||||
* 根据编码和组织ID查询
|
||||
*/
|
||||
public ExpenseAccountPO getInfoByOrgAndCode(String subjectCode, Long organizationId) {
|
||||
if(!StringUtils.isNotEmpty(subjectCode)){
|
||||
throw new ServiceException("费用科目编码不能为空");
|
||||
}
|
||||
if(organizationId == null){
|
||||
throw new ServiceException("组织ID不能为空");
|
||||
}
|
||||
ExpenseAccountPO expenseAccountPO = expenseAccountDomainService.getInfoByOrgAndCode(subjectCode, organizationId);
|
||||
// // 组装计费单位列表:单位-单位英文
|
||||
// List<String> unit = new ArrayList<>();
|
||||
// if (expenseAccountPO != null) {
|
||||
// unit.add(expenseAccountPO.getBillingUnit() + "-" + expenseAccountPO.getBillingUnitEn());
|
||||
// unit.add(expenseAccountPO.getBillingUnit2() + "-" + expenseAccountPO.getBillingUnitEn2());
|
||||
// expenseAccountPO.setUnit(unit);
|
||||
// }
|
||||
// 组装计费单位列表(数组)
|
||||
List<Map<String, String>> unit = new ArrayList<>();
|
||||
if (expenseAccountPO != null) {
|
||||
Map<String, String> unit1 = new HashMap<>();
|
||||
unit1.put("unit", expenseAccountPO.getBillingUnit() + "-" + expenseAccountPO.getBillingUnitEn());
|
||||
unit.add(unit1);
|
||||
|
||||
Map<String, String> unit2 = new HashMap<>();
|
||||
unit2.put("unit", expenseAccountPO.getBillingUnit2() + "-" + expenseAccountPO.getBillingUnitEn2());
|
||||
unit.add(unit2);
|
||||
|
||||
expenseAccountPO.setUnit(unit);
|
||||
}
|
||||
return expenseAccountPO;
|
||||
}
|
||||
|
||||
public List<QueryExpenseAccountPO> selectExpenseAccount(SearchExpenseAccountDO searchExpenseAccountDO){
|
||||
setDataPermissionForSearch(searchExpenseAccountDO);
|
||||
return expenseAccountDomainService.selectExpenseAccount(searchExpenseAccountDO);
|
||||
|
||||
+13
-10
@@ -157,15 +157,18 @@ public class MaterialBaseInfoApplicationService {
|
||||
* @param materialBaseInfoDO
|
||||
*/
|
||||
private void shipperParam(MaterialBaseInfoDO materialBaseInfoDO){
|
||||
AjaxResult ajaxResult = userServiceFeign.getInfo(materialBaseInfoDO.getShipperId());
|
||||
if(!"200".equals(String.valueOf(ajaxResult.get("code")))){
|
||||
throw new ServiceException("获取货主信息失败");
|
||||
}
|
||||
UserPo userPo = JSON.parseObject(JSONObject.toJSONString(ajaxResult.get("data")), UserPo.class);
|
||||
// 如果原始shipperName不为空,保留原始值(导入或手动输入时应该保留完整名称)
|
||||
// 只有在原始shipperName为空时,才使用查询到的userName
|
||||
if (materialBaseInfoDO.getShipperName() == null || materialBaseInfoDO.getShipperName().trim().isEmpty()) {
|
||||
materialBaseInfoDO.setShipperName(userPo.getUserName());
|
||||
Long shipperId = materialBaseInfoDO.getShipperId();
|
||||
if (shipperId != null && shipperId != 0l) {
|
||||
AjaxResult ajaxResult = userServiceFeign.getInfo(materialBaseInfoDO.getShipperId());
|
||||
if(!"200".equals(String.valueOf(ajaxResult.get("code")))){
|
||||
throw new ServiceException("获取货主信息失败");
|
||||
}
|
||||
UserPo userPo = JSON.parseObject(JSONObject.toJSONString(ajaxResult.get("data")), UserPo.class);
|
||||
// 如果原始shipperName不为空,保留原始值(导入或手动输入时应该保留完整名称)
|
||||
// 只有在原始shipperName为空时,才使用查询到的userName
|
||||
if (materialBaseInfoDO.getShipperName() == null || materialBaseInfoDO.getShipperName().trim().isEmpty()) {
|
||||
materialBaseInfoDO.setShipperName(userPo.getUserName());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -182,4 +185,4 @@ public class MaterialBaseInfoApplicationService {
|
||||
//return materialBaseInfoDomainService.getMaterialStockList(shipperName,materialName,machineCode,topOrganizationId,pageNum,pageSize);/**/
|
||||
return null;
|
||||
}
|
||||
}
|
||||
}
|
||||
+1
-1
@@ -183,5 +183,5 @@ public class ContractManagePO extends BaseVOEntity{
|
||||
|
||||
@ApiModelProperty(name = "是否包含运输费用(1-包含,2-包含)")
|
||||
private Integer transportationCosts;
|
||||
|
||||
private String isMany;
|
||||
}
|
||||
+6
@@ -98,4 +98,10 @@ public class ContractManageDetail extends BaseVOEntity{
|
||||
@ApiModelProperty("单据类型")
|
||||
private String documentType;
|
||||
|
||||
@ApiModelProperty("费用类别编码")
|
||||
private String serviceItemsCode;
|
||||
|
||||
@ApiModelProperty("费用类别名称")
|
||||
private String serviceItemsName;
|
||||
|
||||
}
|
||||
+6
@@ -97,4 +97,10 @@ public class ContractManageDetailPO extends BaseVOEntity{
|
||||
@ApiModelProperty("单据类型")
|
||||
private String documentType;
|
||||
|
||||
@ApiModelProperty("费用类别编码")
|
||||
private String serviceItemsCode;
|
||||
|
||||
@ApiModelProperty("费用类别名称")
|
||||
private String serviceItemsName;
|
||||
|
||||
}
|
||||
+6
@@ -102,4 +102,10 @@ public class ContractManageDetailDO extends BaseVOEntity{
|
||||
|
||||
@ApiModelProperty("单据类型")
|
||||
private String documentType;
|
||||
|
||||
@ApiModelProperty("费用类别编码")
|
||||
private String serviceItemsCode;
|
||||
|
||||
@ApiModelProperty("费用类别名称")
|
||||
private String serviceItemsName;
|
||||
}
|
||||
+25
@@ -11,6 +11,7 @@ import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collection;
|
||||
import java.util.List;
|
||||
/**
|
||||
* 合同管理详情
|
||||
@@ -95,5 +96,29 @@ public class ContractManageDetailDomainService {
|
||||
return resultList;
|
||||
}
|
||||
|
||||
/**
|
||||
* 根据多个合同管理id批量查询合同科目详情(一次SQL查询,避免逐合同N+1)
|
||||
* @param contractManageIds 合同管理id集合
|
||||
* @return 合同科目详情列表
|
||||
*/
|
||||
public List<ContractManageDetailPO> queryListByManageIds(Collection<Long> contractManageIds) {
|
||||
List<ContractManageDetailPO> resultList = new ArrayList<>();
|
||||
if (contractManageIds == null || contractManageIds.isEmpty()) {
|
||||
return resultList;
|
||||
}
|
||||
LambdaQueryWrapper<ContractManageDetail> queryWrapper = new LambdaQueryWrapper<>();
|
||||
queryWrapper.in(ContractManageDetail::getContractManageId, contractManageIds);
|
||||
queryWrapper.eq(ContractManageDetail::getDelFlag, 1);
|
||||
List<ContractManageDetail> contractManageDetails = contractManageDetailService.list(queryWrapper);
|
||||
if (contractManageDetails != null && contractManageDetails.size() > 0) {
|
||||
for (ContractManageDetail contractManageDetail : contractManageDetails) {
|
||||
ContractManageDetailPO contractManageDetailPO = new ContractManageDetailPO();
|
||||
BeanUtils.copyProperties(contractManageDetail, contractManageDetailPO);
|
||||
resultList.add(contractManageDetailPO);
|
||||
}
|
||||
}
|
||||
return resultList;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
+5
@@ -58,6 +58,11 @@ public interface IExpenseAccountService extends IService<ExpenseAccount>
|
||||
*/
|
||||
ExpenseAccountPO getInfoByCode(ExpenseAccountDO expenseAccountDO);
|
||||
|
||||
/**
|
||||
* 根据费用科目code和组织ID查询费用信息
|
||||
*/
|
||||
ExpenseAccountPO getInfoByOrgAndCode(ExpenseAccountDO expenseAccountDO);
|
||||
|
||||
public List<QueryExpenseAccountPO> selectExpenseAccount(SearchExpenseAccountDO searchExpenseAccountDO);
|
||||
|
||||
public List<QueryExpenseAccountPO> selectOtherExpenseAccount(SearchExpenseAccountDO searchExpenseAccountDO);
|
||||
|
||||
+5
@@ -39,6 +39,11 @@ public interface ExpenseAccountMapper extends BaseMapper<ExpenseAccount>
|
||||
*/
|
||||
ExpenseAccountPO getInfoByCode(@Param("expenseAccountDO") ExpenseAccountDO expenseAccountDO);
|
||||
|
||||
/**
|
||||
* 根据费用科目code和组织ID查询费用信息
|
||||
*/
|
||||
ExpenseAccountPO getInfoByOrgAndCode(@Param("expenseAccountDO") ExpenseAccountDO expenseAccountDO);
|
||||
|
||||
public List<QueryExpenseAccountPO> selectExpenseAccount(@Param("searchExpenseAccountDO") SearchExpenseAccountDO searchExpenseAccountDO);
|
||||
|
||||
public List<QueryExpenseAccountPO> selectOtherExpenseAccount(@Param("searchExpenseAccountDO") SearchExpenseAccountDO searchExpenseAccountDO);
|
||||
|
||||
+5
@@ -129,6 +129,11 @@ public class ExpenseAccountImpl extends ServiceImpl<ExpenseAccountMapper, Expens
|
||||
return expenseAccountMapper.getInfoByCode(expenseAccountDO);
|
||||
}
|
||||
|
||||
@Override
|
||||
public ExpenseAccountPO getInfoByOrgAndCode(ExpenseAccountDO expenseAccountDO) {
|
||||
return expenseAccountMapper.getInfoByOrgAndCode(expenseAccountDO);
|
||||
}
|
||||
|
||||
/**
|
||||
* 系统科目查询
|
||||
* 社会车辆:service_items_code='SHCL',upper_subject_code='shcl_clyf',society_status=1
|
||||
|
||||
+5
@@ -9,6 +9,7 @@ import io.swagger.annotations.ApiModel;
|
||||
import io.swagger.annotations.ApiModelProperty;
|
||||
import java.math.BigDecimal;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
import com.mhd.common.core.web.domain.BaseVOEntity;
|
||||
|
||||
@@ -159,4 +160,8 @@ public class ExpenseAccountPO extends BaseVOEntity{
|
||||
|
||||
@ApiModelProperty("nc科目编码")
|
||||
private String ncSubjectCode;
|
||||
|
||||
@ApiModelProperty("计费单位列表(单位-单位英文)")
|
||||
private List<Map<String, String>> unit;
|
||||
|
||||
}
|
||||
+10
@@ -101,6 +101,16 @@ public class ExpenseAccountDomainService {
|
||||
expenseAccountDO.setTopOrganizationId(topOrganizationId);
|
||||
return expenseAccountService.getInfoByCode(expenseAccountDO);
|
||||
}
|
||||
|
||||
/**
|
||||
* 根据编码和组织ID查询费用科目信息
|
||||
*/
|
||||
public ExpenseAccountPO getInfoByOrgAndCode(String subjectCode, Long organizationId) {
|
||||
ExpenseAccountDO expenseAccountDO = new ExpenseAccountDO();
|
||||
expenseAccountDO.setSubjectCode(subjectCode);
|
||||
expenseAccountDO.setOrganizationId(organizationId);
|
||||
return expenseAccountService.getInfoByOrgAndCode(expenseAccountDO);
|
||||
}
|
||||
public List<QueryExpenseAccountPO> selectExpenseAccount(SearchExpenseAccountDO searchExpenseAccountDO){
|
||||
return expenseAccountService.selectExpenseAccount(searchExpenseAccountDO);
|
||||
}
|
||||
|
||||
@@ -96,4 +96,7 @@ public class Lease extends BaseVOEntity{
|
||||
|
||||
@ApiModelProperty("业务员ID")
|
||||
private String salesmanId;
|
||||
|
||||
@ApiModelProperty("状态:1=正常,0=停用")
|
||||
private Integer status;
|
||||
}
|
||||
+3
@@ -97,4 +97,7 @@ public class LeasePO extends BaseVOEntity{
|
||||
|
||||
@ApiModelProperty("业务员ID")
|
||||
private String salesmanId;
|
||||
|
||||
@ApiModelProperty("状态:1=正常,0=停用")
|
||||
private Integer status;
|
||||
}
|
||||
+3
@@ -113,4 +113,7 @@ public class LeaseDO extends BaseVOEntity{
|
||||
|
||||
@ApiModelProperty("业务员ID")
|
||||
private String salesmanId;
|
||||
|
||||
@ApiModelProperty("状态:1=正常,0=停用")
|
||||
private Integer status;
|
||||
}
|
||||
+18
@@ -89,4 +89,22 @@ public class LeaseDomainService {
|
||||
.in(Lease::getId, leaseIds)
|
||||
.eq(Lease::getDelFlag, 1));
|
||||
}
|
||||
|
||||
/**
|
||||
* 启用/停用租赁
|
||||
* @param leaseIds 租赁ID列表
|
||||
* @param status 目标状态:1=启用,0=停用
|
||||
* @param updateBy 操作人ID
|
||||
* @param updateByName 操作人名称
|
||||
*/
|
||||
public Boolean updateStatus(List<Long> leaseIds, Integer status, Long updateBy, String updateByName) {
|
||||
return leaseService.update(new UpdateWrapper<Lease>().lambda()
|
||||
.set(Lease::getStatus, status)
|
||||
.set(Lease::getUpdateBy, updateBy)
|
||||
.set(Lease::getUpdateByName, updateByName)
|
||||
.set(Lease::getUpdateTime, new Date())
|
||||
.in(Lease::getId, leaseIds)
|
||||
.eq(Lease::getDelFlag, 1));
|
||||
}
|
||||
|
||||
}
|
||||
+9
@@ -1,5 +1,6 @@
|
||||
package com.mhd.basic.domain.materialBaseInfo.entity;
|
||||
|
||||
import com.baomidou.mybatisplus.annotation.FieldStrategy;
|
||||
import com.baomidou.mybatisplus.annotation.IdType;
|
||||
import com.baomidou.mybatisplus.annotation.TableField;
|
||||
import com.baomidou.mybatisplus.annotation.TableId;
|
||||
@@ -44,14 +45,17 @@ public class MaterialBaseInfo extends BaseVOEntity{
|
||||
|
||||
@ApiModelProperty("货主id")
|
||||
@Excel(name = "货主id")
|
||||
@TableField(updateStrategy = FieldStrategy.IGNORED)
|
||||
private Long shipperId;
|
||||
|
||||
@ApiModelProperty("货主名称")
|
||||
@Excel(name = "货主名称")
|
||||
@TableField(updateStrategy = FieldStrategy.IGNORED)
|
||||
private String shipperName;
|
||||
|
||||
@ApiModelProperty("物料编码")
|
||||
@Excel(name = "物料编码")
|
||||
@TableField(updateStrategy = FieldStrategy.IGNORED)
|
||||
private String materialCode;
|
||||
|
||||
@ApiModelProperty("物料名称")
|
||||
@@ -404,4 +408,9 @@ public class MaterialBaseInfo extends BaseVOEntity{
|
||||
@ApiModelProperty(name = "收费标准")
|
||||
private BigDecimal chargeStandard;
|
||||
|
||||
@ApiModelProperty(name = "组织(多个用,分开)")
|
||||
private String orgId;
|
||||
|
||||
@ApiModelProperty(name = "是否正常物料: 0-是 1-否")
|
||||
private Integer isNormalMaterial;
|
||||
}
|
||||
+6
@@ -393,4 +393,10 @@ public class MaterialBaseInfoPO extends BaseVOEntity{
|
||||
|
||||
@ApiModelProperty(name = "收费标准")
|
||||
private BigDecimal chargeStandard;
|
||||
|
||||
@ApiModelProperty(name = "组织(多个用,分开)")
|
||||
private String orgId;
|
||||
|
||||
@ApiModelProperty(name = "是否正常物料: 0-是 1-否")
|
||||
private Integer isNormalMaterial;
|
||||
}
|
||||
+6
@@ -399,4 +399,10 @@ public class MaterialBaseInfoDO extends BaseVOEntity{
|
||||
|
||||
@ApiModelProperty(name = "收费标准")
|
||||
private BigDecimal chargeStandard;
|
||||
|
||||
@ApiModelProperty(name = "组织(多个用,分开)")
|
||||
private String orgId;
|
||||
|
||||
@ApiModelProperty(name = "是否正常物料: 0-是 1-否")
|
||||
private Integer isNormalMaterial;
|
||||
}
|
||||
+4
-2
@@ -165,6 +165,8 @@ public class StorageLocation extends BaseVOEntity{
|
||||
@ApiModelProperty("是否作废: 1-否 2-是")
|
||||
@Excel(name = "是否作废: 1-否 2-是")
|
||||
private Integer nullify;
|
||||
@ApiModelProperty("库位条码")
|
||||
@Excel(name = "库位条码")
|
||||
private String locationBarCode;
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
+4
-2
@@ -165,6 +165,8 @@ public class StorageLocationPO extends BaseVOEntity{
|
||||
@Excel(name = "是否作废: 1-否 2-是")
|
||||
private Integer nullify;
|
||||
|
||||
@ApiModelProperty("库位条码")
|
||||
@Excel(name = "库位条码")
|
||||
private String locationBarCode;
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
+5
-1
@@ -204,4 +204,8 @@ public class StorageLocationDO extends BaseVOEntity{
|
||||
@ApiModelProperty("坐标-层 终止")
|
||||
@Excel(name = "坐标-层 终止")
|
||||
private String coordinateLayerEnd;
|
||||
}
|
||||
|
||||
@ApiModelProperty("库位条码")
|
||||
@Excel(name = "库位条码")
|
||||
private String locationBarCode;
|
||||
}
|
||||
+4
-20
@@ -91,31 +91,15 @@ public class StorageSectionDomainService {
|
||||
public Boolean update(StorageSectionDO storageSectionDO) {
|
||||
LoginUser loginUser = SecurityUtils.getLoginUser();
|
||||
Long topOrganizationId = loginUser.getUserPo().getTopOrganizationId();
|
||||
AssociationWarehouseCacheDO associationWarehouseCacheDO = SystemServiceCacheUtil.getAssociationWarehouseCache(loginUser.getUserid());
|
||||
if (topOrganizationId == null || topOrganizationId == 0 || associationWarehouseCacheDO == null) {
|
||||
throw new ServiceException("获取当前登陆人组织与登陆仓库失败!");
|
||||
if (topOrganizationId == null || topOrganizationId == 0) {
|
||||
throw new ServiceException("获取当前登陆人组织失败!");
|
||||
}
|
||||
checkStorageSectionDuplicate(topOrganizationId, associationWarehouseCacheDO.getWarehouseId(),
|
||||
// 直接用记录自身的 warehouseId 做唯一校验,不再依赖缓存仓库
|
||||
checkStorageSectionDuplicate(topOrganizationId, storageSectionDO.getWarehouseId(),
|
||||
storageSectionDO.getStorageCode(), storageSectionDO.getStorageName(),
|
||||
storageSectionDO.getStorageSectionId());
|
||||
//设置仓库
|
||||
setWarehouseInfo(storageSectionDO);
|
||||
String storageCode = storageSectionDO.getStorageCode();
|
||||
String storageName = storageSectionDO.getStorageName();
|
||||
Long warehouseId = storageSectionDO.getWarehouseId();
|
||||
List<StorageSection> codelist = storageSectionService.list(new QueryWrapper<StorageSection>().lambda()
|
||||
.eq(StorageSection::getStorageCode, storageCode)
|
||||
.eq(StorageSection::getWarehouseId, warehouseId)
|
||||
.ne(StorageSection::getStorageSectionId, storageSectionDO.getStorageSectionId())
|
||||
.eq(StorageSection::getDelFlag, 1));
|
||||
List<StorageSection> namelist = storageSectionService.list(new QueryWrapper<StorageSection>().lambda()
|
||||
.eq(StorageSection::getStorageName, storageName)
|
||||
.eq(StorageSection::getWarehouseId, warehouseId)
|
||||
.ne(StorageSection::getStorageSectionId, storageSectionDO.getStorageSectionId())
|
||||
.eq(StorageSection::getDelFlag, 1));
|
||||
if ((codelist != null && codelist.size() > 0) || (namelist != null && namelist.size() > 0)) {
|
||||
throw new ServiceException("库区编码或名称已存在");
|
||||
}
|
||||
return storageSectionService.update(storageSectionDO);
|
||||
}
|
||||
|
||||
|
||||
+23
@@ -122,5 +122,28 @@ public class Warehouse extends BaseVOEntity{
|
||||
@Excel(name = "是否启用: 1-否 2-是")
|
||||
private Integer isEnable;
|
||||
|
||||
@ApiModelProperty("任务模式")
|
||||
@Excel(name = "任务模式")
|
||||
private String taskMode;
|
||||
|
||||
@ApiModelProperty("作业模式")
|
||||
@Excel(name = "作业模式")
|
||||
private String workMode;
|
||||
|
||||
@ApiModelProperty("订单号生成规则0日期累加1历史累加")
|
||||
@Excel(name = "单号生成规则")
|
||||
private String orderNoGenerateRule;
|
||||
|
||||
@ApiModelProperty("入库单号首字母前缀")
|
||||
@Excel(name = "入库单号首字母前缀")
|
||||
private String inOrderNoPrefix;
|
||||
|
||||
@ApiModelProperty("出库单号首字母前缀")
|
||||
@Excel(name = "出库单号首字母前缀")
|
||||
private String outOrderNoPrefix;
|
||||
|
||||
@ApiModelProperty("样品出库单号首字母前缀")
|
||||
@Excel(name = "样品出库单号首字母前缀")
|
||||
private String sampleOutOrderNoPrefix;
|
||||
|
||||
}
|
||||
+23
@@ -124,5 +124,28 @@ public class WarehousePO extends BaseVOEntity{
|
||||
private Integer isEnable;
|
||||
@ApiModelProperty("库区集合")
|
||||
private List<StorageSectionPO> storageSectionList;
|
||||
@ApiModelProperty("任务模式")
|
||||
@Excel(name = "任务模式")
|
||||
private String taskMode;
|
||||
|
||||
@ApiModelProperty("作业模式")
|
||||
@Excel(name = "作业模式")
|
||||
private String workMode;
|
||||
|
||||
|
||||
@ApiModelProperty("订单号生成规则")
|
||||
@Excel(name = "单号生成规则")
|
||||
private String orderNoGenerateRule;
|
||||
|
||||
@ApiModelProperty("入库单号首字母前缀")
|
||||
@Excel(name = "入库单号首字母前缀")
|
||||
private String inOrderNoPrefix;
|
||||
|
||||
@ApiModelProperty("出库单号首字母前缀")
|
||||
@Excel(name = "出库单号首字母前缀")
|
||||
private String outOrderNoPrefix;
|
||||
|
||||
@ApiModelProperty("样品出库单号首字母前缀")
|
||||
@Excel(name = "样品出库单号首字母前缀")
|
||||
private String sampleOutOrderNoPrefix;
|
||||
}
|
||||
+25
@@ -131,4 +131,29 @@ public class WarehouseDO extends BaseVOEntity{
|
||||
private String orgIds;
|
||||
@ApiModelProperty("组织id 集合")
|
||||
private List<Long> orgIdList;
|
||||
|
||||
@ApiModelProperty("任务模式")
|
||||
@Excel(name = "任务模式")
|
||||
private String taskMode;
|
||||
|
||||
@ApiModelProperty("作业模式")
|
||||
@Excel(name = "作业模式")
|
||||
private String workMode;
|
||||
|
||||
|
||||
@ApiModelProperty("订单号生成规则")
|
||||
@Excel(name = "单号生成规则")
|
||||
private String orderNoGenerateRule;
|
||||
|
||||
@ApiModelProperty("入库单号首字母前缀")
|
||||
@Excel(name = "入库单号首字母前缀")
|
||||
private String inOrderNoPrefix;
|
||||
|
||||
@ApiModelProperty("出库单号首字母前缀")
|
||||
@Excel(name = "出库单号首字母前缀")
|
||||
private String outOrderNoPrefix;
|
||||
|
||||
@ApiModelProperty("样品出库单号首字母前缀")
|
||||
@Excel(name = "样品出库单号首字母前缀")
|
||||
private String sampleOutOrderNoPrefix;
|
||||
}
|
||||
+2
@@ -168,9 +168,11 @@ public class WarehouseDomainService {
|
||||
warehouseLinkagePO.setName(warehousePO.getWarehouseName());
|
||||
StorageSectionDO storageSectionDO = new StorageSectionDO();
|
||||
storageSectionDO.setWarehouseId(warehousePO.getWarehouseId());
|
||||
storageSectionDO.setNullify(1);
|
||||
List<StorageSectionPO> storageSectionPOList = storageSectionService.queryList(storageSectionDO);
|
||||
StorageLocationDO storageLocationDO = new StorageLocationDO();
|
||||
storageLocationDO.setWarehouseId(warehousePO.getWarehouseId());
|
||||
storageLocationDO.setNullify(1);
|
||||
List<StorageLocationPO> storageLocationPOList = storageLocationService.queryList(storageLocationDO);
|
||||
//根据库区唯一标识进行分组
|
||||
Map<String, List<StorageLocationPO>> storageLocationListMap = storageLocationPOList.stream().collect(Collectors.groupingBy(StorageLocationPO::getStorageCode));
|
||||
|
||||
+102
@@ -0,0 +1,102 @@
|
||||
package com.mhd.basic.interfaces.dto.contractManage;
|
||||
|
||||
import com.mhd.common.core.annotation.Excel;
|
||||
import io.swagger.annotations.ApiModel;
|
||||
import io.swagger.annotations.ApiModelProperty;
|
||||
import lombok.Data;
|
||||
|
||||
import java.util.Date;
|
||||
|
||||
/**
|
||||
* 合同管理导出对象(合同头字段 + 科目明细字段,拍平为一行一条明细)
|
||||
*
|
||||
* @author gen
|
||||
* @date 2024-06-07
|
||||
*/
|
||||
@Data
|
||||
@ApiModel(value = "合同管理导出对象", description = "合同管理导出对象(含明细)")
|
||||
public class ContractManageExportVO {
|
||||
|
||||
/** ====== 合同头字段(与 ContractManagePO 的 @Excel 一致) ====== */
|
||||
@Excel(name = "合同编号")
|
||||
private String contractNumber;
|
||||
|
||||
@Excel(name = "合同名称")
|
||||
private String contractName;
|
||||
|
||||
@Excel(name = "是否通用合同", readConverterExp = "1=是,2=否")
|
||||
private Integer commonContractFlag;
|
||||
|
||||
@Excel(name = "合同类型", readConverterExp = "1=仓储,2=运输,3=其他")
|
||||
private Integer contractType;
|
||||
|
||||
@Excel(name = "合同状态", readConverterExp = "1=未生效,2=使用中,3=已过期,4=已作废")
|
||||
private Integer contractState;
|
||||
|
||||
@Excel(name = "签订单位")
|
||||
private String signingUnit;
|
||||
|
||||
@Excel(name = "结算主体")
|
||||
private String settlementCustomers;
|
||||
|
||||
@Excel(name = "我司身份", readConverterExp = "1=甲方,2=乙方")
|
||||
private Integer ourIdentity;
|
||||
|
||||
@Excel(name = "账期", readConverterExp = "1=每月,2=双月,3=季度")
|
||||
private Integer accountingPeriod;
|
||||
|
||||
@Excel(name = "合同签订日期", width = 30, dateFormat = "yyyy-MM-dd")
|
||||
private Date signingDate;
|
||||
|
||||
@Excel(name = "合同生效日期", width = 30, dateFormat = "yyyy-MM-dd")
|
||||
private Date effectiveDate;
|
||||
|
||||
@Excel(name = "合同到期日期", width = 30, dateFormat = "yyyy-MM-dd")
|
||||
private Date expirationDate;
|
||||
|
||||
@Excel(name = "组织名称")
|
||||
private String organizationName;
|
||||
|
||||
@Excel(name = "客户类型")
|
||||
private String customerType;
|
||||
|
||||
@Excel(name = "是否自动出账", readConverterExp = "1=是,2=否")
|
||||
private Integer automaticFlag;
|
||||
|
||||
@Excel(name = "备注")
|
||||
private String remark;
|
||||
|
||||
/** ====== 明细字段(来源于 contract_manage_detail) ====== */
|
||||
@Excel(name = "结算科目类型", readConverterExp = "1=通用,2=临时")
|
||||
private Integer subjectType;
|
||||
|
||||
@Excel(name = "一级费用科目code")
|
||||
private String firstSubjectCode;
|
||||
|
||||
@Excel(name = "一级费用科目")
|
||||
private String firstSubjectName;
|
||||
|
||||
@Excel(name = "二级费用科目code")
|
||||
private String secondSubjectCode;
|
||||
|
||||
@Excel(name = "二级费用科目")
|
||||
private String secondSubjectName;
|
||||
|
||||
@Excel(name = "计费策略")
|
||||
private String accountingStrategy;
|
||||
|
||||
@Excel(name = "计费周期")
|
||||
private String billingAttributes;
|
||||
|
||||
@Excel(name = "科目生效日期", width = 30, dateFormat = "yyyy-MM-dd")
|
||||
private Date subjectEffectiveDate;
|
||||
|
||||
@Excel(name = "科目到期日期", width = 30, dateFormat = "yyyy-MM-dd")
|
||||
private Date subjectExpirationDate;
|
||||
|
||||
@Excel(name = "单据类型")
|
||||
private String documentType;
|
||||
|
||||
@Excel(name = "费用类别")
|
||||
private String serviceItemsName;
|
||||
}
|
||||
+6
@@ -102,4 +102,10 @@ public class ContractManageDetailDTO extends BaseVOEntity{
|
||||
|
||||
@ApiModelProperty("单据类型")
|
||||
private String documentType;
|
||||
|
||||
@ApiModelProperty("费用类别编码")
|
||||
private String serviceItemsCode;
|
||||
|
||||
@ApiModelProperty("费用类别名称")
|
||||
private String serviceItemsName;
|
||||
}
|
||||
@@ -110,4 +110,7 @@ public class LeaseDTO extends BaseVOEntity{
|
||||
|
||||
@ApiModelProperty("业务员ID")
|
||||
private String salesmanId;
|
||||
|
||||
@ApiModelProperty("状态:1=正常,0=停用")
|
||||
private Integer status;
|
||||
}
|
||||
+6
@@ -379,4 +379,10 @@ public class MaterialBaseInfoDTO extends BaseVOEntity{
|
||||
@ApiModelProperty(name = "收费标准")
|
||||
private BigDecimal chargeStandard;
|
||||
|
||||
@ApiModelProperty(name = "组织(多个用,分开)")
|
||||
private String orgId;
|
||||
|
||||
@ApiModelProperty(name = "是否正常物料: 0-是 1-否")
|
||||
private Integer isNormalMaterial;
|
||||
|
||||
}
|
||||
+65
@@ -0,0 +1,65 @@
|
||||
package com.mhd.basic.interfaces.dto.shipperLeaseDetailsApi;
|
||||
|
||||
import com.fasterxml.jackson.annotation.JsonFormat;
|
||||
import com.mhd.common.core.annotation.Excel;
|
||||
import io.swagger.annotations.ApiModelProperty;
|
||||
import lombok.Data;
|
||||
import org.springframework.format.annotation.DateTimeFormat;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
import java.util.Date;
|
||||
|
||||
/**
|
||||
* 仓库出租率及客户租赁明细 导出VO(单 sheet)
|
||||
* 明细为主行,附该仓库当日汇总列
|
||||
*/
|
||||
@Data
|
||||
public class WarehouseLeaseExportVO {
|
||||
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
@ApiModelProperty("仓库")
|
||||
@Excel(name = "仓库")
|
||||
private String warehouseName;
|
||||
|
||||
@ApiModelProperty("业务日期")
|
||||
@Excel(name = "业务日期", width = 20, dateFormat = "yyyy-MM-dd")
|
||||
@JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd")
|
||||
@DateTimeFormat(pattern = "yyyy-MM-dd")
|
||||
private Date businessDate;
|
||||
|
||||
@ApiModelProperty("整租面积(m²)")
|
||||
@Excel(name = "整租面积(m²)")
|
||||
private BigDecimal entireLeaseArea;
|
||||
|
||||
@ApiModelProperty("散租面积(m²)")
|
||||
@Excel(name = "散租面积(m²)")
|
||||
private BigDecimal fractionalLeaseArea;
|
||||
|
||||
@ApiModelProperty("总面积(m²)")
|
||||
@Excel(name = "总面积(m²)")
|
||||
private BigDecimal totalArea;
|
||||
|
||||
@ApiModelProperty("日租率(%)")
|
||||
@Excel(name = "日租率(%)")
|
||||
private BigDecimal dailyRentalRate;
|
||||
|
||||
@ApiModelProperty("组织名称")
|
||||
@Excel(name = "组织名称")
|
||||
private String organizationName;
|
||||
|
||||
@ApiModelProperty("货主名称")
|
||||
@Excel(name = "货主名称")
|
||||
private String cargoOwnerName;
|
||||
|
||||
@ApiModelProperty("租赁方式")
|
||||
@Excel(name = "租赁方式")
|
||||
private String leaseType;
|
||||
|
||||
@ApiModelProperty("租赁面积(m²)")
|
||||
@Excel(name = "租赁面积(m²)")
|
||||
private BigDecimal leaseArea;
|
||||
|
||||
// ===== 以下为仓库当日汇总列(同一仓库同一天的多行会重复,属正常)=====
|
||||
|
||||
}
|
||||
+5
-1
@@ -212,7 +212,11 @@ public class StorageLocationDTO extends BaseVOEntity{
|
||||
@Excel(name = "坐标-层 终止")
|
||||
private String coordinateLayerEnd;
|
||||
|
||||
@ApiModelProperty("库位条码")
|
||||
@Excel(name = "库位条码")
|
||||
private String locationBarCode;
|
||||
|
||||
public interface Edit {}
|
||||
|
||||
public interface BatchInsert {}
|
||||
}
|
||||
}
|
||||
+25
@@ -136,4 +136,29 @@ public class WarehouseDTO extends BaseVOEntity{
|
||||
private String orgIds;
|
||||
@ApiModelProperty("组织id 集合")
|
||||
private List<Long> orgIdList;
|
||||
|
||||
@ApiModelProperty("任务模式")
|
||||
@Excel(name = "任务模式")
|
||||
private String taskMode;
|
||||
|
||||
@ApiModelProperty("作业模式")
|
||||
@Excel(name = "作业模式")
|
||||
private String workMode;
|
||||
|
||||
|
||||
@ApiModelProperty("订单号生成规则")
|
||||
@Excel(name = "单号生成规则")
|
||||
private String orderNoGenerateRule;
|
||||
|
||||
@ApiModelProperty("入库单号首字母前缀")
|
||||
@Excel(name = "入库单号首字母前缀")
|
||||
private String inOrderNoPrefix;
|
||||
|
||||
@ApiModelProperty("出库单号首字母前缀")
|
||||
@Excel(name = "出库单号首字母前缀")
|
||||
private String outOrderNoPrefix;
|
||||
|
||||
@ApiModelProperty("样品出库单号首字母前缀")
|
||||
@Excel(name = "样品出库单号首字母前缀")
|
||||
private String sampleOutOrderNoPrefix;
|
||||
}
|
||||
+22
@@ -1,8 +1,11 @@
|
||||
package com.mhd.basic.interfaces.facade.contractManage;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.net.URLEncoder;
|
||||
import java.util.List;
|
||||
|
||||
import com.mhd.basic.interfaces.assember.contractManage.ContractManageAssembler;
|
||||
import com.mhd.basic.interfaces.dto.contractManage.ContractManageExportVO;
|
||||
import com.mhd.basic.interfaces.dto.contractManage.SubjectAndPriceDTO;
|
||||
import com.mhd.basic.interfaces.dto.contractManage.SubjectAndPriceReturn;
|
||||
import io.swagger.annotations.ApiOperation;
|
||||
@@ -14,9 +17,11 @@ import com.mhd.basic.domain.contractManage.repository.todo.ContractManageDO;
|
||||
import com.mhd.basic.domain.contractManage.repository.po.ContractManagePO;
|
||||
import com.mhd.basic.application.service.contractManage.ContractManageApplicationService;
|
||||
import javax.annotation.Resource;
|
||||
import javax.servlet.http.HttpServletResponse;
|
||||
import com.mhd.common.core.web.controller.BaseController;
|
||||
import com.mhd.common.core.web.domain.AjaxResult;
|
||||
import com.mhd.common.core.web.page.TableDataInfo;
|
||||
import com.mhd.common.core.utils.poi.ExcelUtil;
|
||||
|
||||
/**
|
||||
* 合同管理Api
|
||||
@@ -205,7 +210,24 @@ public class ContractManageApi extends BaseController{
|
||||
return AjaxResult.success(list);
|
||||
}
|
||||
|
||||
@ApiOperation("导出合同(含明细)")
|
||||
@GetMapping(value = "/export", produces = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet")
|
||||
public void export(ContractManageDTO contractManageDTO, HttpServletResponse response) throws IOException
|
||||
{
|
||||
//转换实体
|
||||
ContractManageDO contractManageDO = new ContractManageDO();
|
||||
BeanUtils.copyProperties(contractManageDTO, contractManageDO);
|
||||
//查询全量(不分页)并拍平明细
|
||||
List<ContractManageExportVO> list = contractManageApplicationService.buildExportList(contractManageDO);
|
||||
|
||||
//设置下载头,防止浏览器乱码
|
||||
String fileName = URLEncoder.encode("合同导出", "UTF-8").replaceAll("\\+", "%20");
|
||||
response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
|
||||
response.setCharacterEncoding("utf-8");
|
||||
response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".xlsx");
|
||||
|
||||
ExcelUtil<ContractManageExportVO> util = new ExcelUtil<>(ContractManageExportVO.class);
|
||||
util.exportExcel(response, list, "合同导出");
|
||||
}
|
||||
|
||||
}
|
||||
+8
@@ -328,5 +328,13 @@ public class ExpenseAccountApi extends BaseController{
|
||||
return AjaxResult.success(expenseAccountPO);
|
||||
}
|
||||
|
||||
@ApiOperation("根据code和组织ID获取数据")
|
||||
@GetMapping(value = "/getInfoByOrgAndCode")
|
||||
public AjaxResult getInfoByOrgAndCode(@RequestParam("subjectCode") String subjectCode,@RequestParam("organizationId") Long organizationId)
|
||||
{
|
||||
ExpenseAccountPO expenseAccountPO = expenseAccountApplicationService.getInfoByOrgAndCode(subjectCode, organizationId);
|
||||
return AjaxResult.success(expenseAccountPO.getUnit());
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
+14
@@ -130,4 +130,18 @@ public class LeaseApi extends BaseController{
|
||||
return AjaxResult.success();
|
||||
}
|
||||
|
||||
/**
|
||||
* 启用/停用租赁
|
||||
* @param leaseIds 租赁ID集合
|
||||
* @param status 目标状态(启用/停用)
|
||||
* @return 操作结果
|
||||
*/
|
||||
@ApiOperation("启用/停用租赁")
|
||||
@PutMapping("/updateStatus/{leaseIds}/{status}")
|
||||
public AjaxResult updateStatus(@PathVariable("leaseIds") List<Long> leaseIds,
|
||||
@PathVariable("status") Integer status)
|
||||
{
|
||||
return toAjax(leaseApplicationService.updateStatus(leaseIds, status));
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
+14
@@ -20,6 +20,8 @@ import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import javax.servlet.http.HttpServletResponse;
|
||||
import java.io.IOException;
|
||||
import java.util.Comparator;
|
||||
import java.util.List;
|
||||
import java.util.stream.Collectors;
|
||||
@@ -157,5 +159,17 @@ public class ShipperLeaseDetailsApi extends BaseController{
|
||||
return getDataTable(warehouseOccupancyRates);
|
||||
}
|
||||
|
||||
/**
|
||||
* 导出仓库出租率及客户租赁明细
|
||||
* 参数与 /warehouseOccupancyRate、/list 一致
|
||||
*/
|
||||
@ApiOperation("导出仓库出租率及客户租赁明细")
|
||||
@GetMapping(value = "/export", produces = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet")
|
||||
public void export(ShipperLeaseDetailsDTO shipperLeaseDetailsDTO, HttpServletResponse response) throws IOException
|
||||
{
|
||||
ShipperLeaseDetailsDO shipperLeaseDetailsDO = shipperLeaseDetailsAssembler.toDO(shipperLeaseDetailsDTO);
|
||||
leaseApplicationService.exportOccupancyRate(response, shipperLeaseDetailsDO);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
@@ -15,7 +15,6 @@ spring:
|
||||
discovery:
|
||||
# server-addr: 127.0.0.1:8848
|
||||
server-addr: 10.33.0.129:6010
|
||||
# 线上测试环境配置 容器名+端口号
|
||||
# server-addr: 10.102.192.30:6848
|
||||
username: nacos
|
||||
password: manhuoda@2023
|
||||
@@ -24,7 +23,6 @@ spring:
|
||||
config:
|
||||
# server-addr: 127.0.0.1:8848
|
||||
server-addr: 10.33.0.129:6010
|
||||
# 线上测试环境配置 容器名+端口号
|
||||
# server-addr: 10.102.192.30:6848
|
||||
username: nacos
|
||||
password: manhuoda@2023
|
||||
|
||||
@@ -8,7 +8,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
|
||||
<sql id="selectContractManagePo">
|
||||
SELECT DISTINCT a.*
|
||||
FROM CONTRACT_MANAGE a
|
||||
INNER JOIN CONTRACT_MANAGE_DETAIL b
|
||||
left JOIN CONTRACT_MANAGE_DETAIL b
|
||||
ON a.CONTRACT_MANAGE_ID = b.CONTRACT_MANAGE_ID
|
||||
where
|
||||
a.del_flag = 1
|
||||
|
||||
@@ -107,7 +107,10 @@
|
||||
<select id="selectCostSubject" parameterType="com.mhd.basic.domain.expenseAccount.repository.todo.ExpenseAccountDO"
|
||||
resultType="com.mhd.basic.domain.expenseAccount.repository.po.ExpenseAccountPO">
|
||||
select
|
||||
a.*
|
||||
a.* ,
|
||||
b.tax_rate,
|
||||
b.service_items_name,
|
||||
b.service_items_code
|
||||
from expense_account a left join service_items_manage b ON a.service_items_manage_id = b.service_items_manage_id
|
||||
where
|
||||
a.del_flag = 1
|
||||
@@ -118,13 +121,17 @@
|
||||
<select id="selectAllCostSubject"
|
||||
resultType="com.mhd.basic.domain.expenseAccount.repository.po.ExpenseAccountPO">
|
||||
select
|
||||
*
|
||||
from expense_account
|
||||
a.* ,
|
||||
b.tax_rate,
|
||||
b.service_items_name,
|
||||
b.service_items_code
|
||||
from expense_account a
|
||||
left join service_items_manage b ON a.service_items_manage_id = b.service_items_manage_id
|
||||
where
|
||||
del_flag = 1
|
||||
and status = 1
|
||||
and first_subject_flag = 2
|
||||
and upper_subject_code = #{subjectCode}
|
||||
a.del_flag = 1
|
||||
and a.status = 1
|
||||
and a.first_subject_flag = 2
|
||||
and a.upper_subject_code = #{subjectCode}
|
||||
</select>
|
||||
|
||||
<select id="getInfoByCode" resultType="com.mhd.basic.domain.expenseAccount.repository.po.ExpenseAccountPO" parameterType="com.mhd.basic.domain.expenseAccount.repository.todo.ExpenseAccountDO">
|
||||
@@ -141,8 +148,25 @@
|
||||
AND a.top_organization_id = #{expenseAccountDO.topOrganizationId}
|
||||
AND a.subject_code = #{expenseAccountDO.subjectCode}
|
||||
AND a.status = 1
|
||||
LIMIT 1
|
||||
</select>
|
||||
|
||||
<select id="getInfoByOrgAndCode" resultType="com.mhd.basic.domain.expenseAccount.repository.po.ExpenseAccountPO" parameterType="com.mhd.basic.domain.expenseAccount.repository.todo.ExpenseAccountDO">
|
||||
SELECT
|
||||
a.* ,
|
||||
b.tax_rate,
|
||||
b.service_items_name,
|
||||
b.service_items_code
|
||||
FROM
|
||||
expense_account a
|
||||
LEFT JOIN service_items_manage b ON a.service_items_manage_id = b.service_items_manage_id
|
||||
WHERE
|
||||
a.del_flag = 1
|
||||
AND a.organization_id = #{expenseAccountDO.organizationId}
|
||||
AND a.subject_code = #{expenseAccountDO.subjectCode}
|
||||
AND a.status = 1
|
||||
LIMIT 1
|
||||
</select>
|
||||
|
||||
<sql id="common_where_two">
|
||||
<!-- 数据权限:南光组织(organizationId=2827)查全部,其他组织查自己 -->
|
||||
|
||||
@@ -35,6 +35,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
|
||||
<result property="updateBy" column="update_by" />
|
||||
<result property="updateByName" column="update_by_name" />
|
||||
<result property="delFlag" column="del_flag" />
|
||||
<result property="status" column="status" />
|
||||
</resultMap>
|
||||
|
||||
|
||||
@@ -68,7 +69,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
|
||||
a.bill_time,
|
||||
a.salesman_name,
|
||||
a.settlement_currency,
|
||||
a.salesman_id
|
||||
a.salesman_id,
|
||||
a.status
|
||||
from lease a
|
||||
LEFT JOIN warehouse w ON a.warehouse_id = w.warehouse_id AND w.del_flag = 1
|
||||
</sql>
|
||||
@@ -136,6 +138,10 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
|
||||
AND a.start_date <= #{time}
|
||||
AND a.end_date >= #{time}
|
||||
</if>
|
||||
<!-- 停用状态过滤:status 不为空时按状态过滤 -->
|
||||
<if test="status != null">
|
||||
AND a.status = #{status}
|
||||
</if>
|
||||
<!-- 删除标记 -->
|
||||
<choose>
|
||||
<when test="delFlag != null"> and a.del_flag = #{delFlag} </when>
|
||||
|
||||
+4
-3
@@ -47,6 +47,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
|
||||
<result property="updateBy" column="update_by" />
|
||||
<result property="updateByName" column="update_by_name" />
|
||||
<result property="delFlag" column="del_flag" />
|
||||
<result property="locationBarCode" column="LOCATION_BAR_CODE" />
|
||||
</resultMap>
|
||||
|
||||
|
||||
@@ -58,7 +59,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
|
||||
a.storage_location_classify, a.storage_location_classify_name, a.storage_location_type, a.storage_location_type_name,
|
||||
a.mixing_strategy, a.mixing_strategy_name, a.storage_location_group_id, a.storage_location_group_code, a.storage_location_group_name,
|
||||
a.weight_limit, a.volume_limit, a.location_size, a.location_length, a.location_width, a.location_height,
|
||||
a.coordinate, a.coordinate_area, a.coordinate_column, a.coordinate_row, a.coordinate_layer, a.remark,
|
||||
a.coordinate, a.coordinate_area, a.coordinate_column, a.coordinate_row, a.coordinate_layer, a.remark, a.LOCATION_BAR_CODE,
|
||||
a.opening_up, a.nullify, a.status, a.create_time, a.create_by, a.create_by_name, a.update_time, a.update_by, a.update_by_name, a.del_flag
|
||||
from storage_location a
|
||||
LEFT JOIN warehouse w ON a.warehouse_id = w.warehouse_id AND w.del_flag = 1
|
||||
@@ -184,8 +185,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
|
||||
<select id="queryList" parameterType="com.mhd.basic.domain.storageLocation.repository.todo.StorageLocationDO" resultMap="StorageLocationResult">
|
||||
<include refid="selectStorageLocationPo"/>
|
||||
<include refid="selectStorageLocationPo1"/>
|
||||
-- 按照创建时间倒序排序
|
||||
order by a.create_time desc
|
||||
-- 按照库位名称正序排序,名称相同时按创建时间倒序
|
||||
order by a.storage_location_name asc, a.create_time desc
|
||||
</select>
|
||||
|
||||
<select id="getStorageLocationCount" parameterType="com.mhd.basic.domain.storageLocation.repository.todo.StorageLocationDO" resultType="java.lang.Long">
|
||||
|
||||
+1
-1
@@ -100,6 +100,6 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
|
||||
<select id="queryList" parameterType="com.mhd.basic.domain.storageSection.repository.todo.StorageSectionDO" resultMap="StorageSectionResult">
|
||||
<include refid="selectStorageSectionPo"/>
|
||||
<include refid="selectStorageSectionPo1"/>
|
||||
order by a.create_time desc
|
||||
order by a.storage_name asc, a.create_time desc
|
||||
</select>
|
||||
</mapper>
|
||||
+13
-1
@@ -37,11 +37,23 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
|
||||
<result property="updateByName" column="update_by_name" />
|
||||
<result property="delFlag" column="del_flag" />
|
||||
<result property="isEnable" column="IS_ENABLE" />
|
||||
<result property="workMode" column="WORK_MODE" />
|
||||
<result property="taskMode" column="TASK_MODE" />
|
||||
<result property="sampleOutOrderNoPrefix" column="SAMPLE_OUT_ORDER_NO_PREFIX" />
|
||||
<result property="orderNoGenerateRule" column="ORDER_NO_GENERATE_RULE" />
|
||||
<result property="inOrderNoPrefix" column="IN_ORDER_NO_PREFIX" />
|
||||
<result property="outOrderNoPrefix" column="OUT_ORDER_NO_PREFIX" />
|
||||
</resultMap>
|
||||
|
||||
|
||||
<sql id="selectWarehousePo">
|
||||
select warehouse_id, organization_id, organization_name, top_organization_id, warehouse_code, warehouse_name, warehouse_type, warehouse_type_name, warehouse_structure, warehouse_nature, warm_layer_code, warm_layer_name, director_name, director_phone, region_code, region_name, detail_address, longitude, latitude, building_region, usage_region, remark, opening_up, nullify, create_time, create_by, create_by_name, update_time, update_by, update_by_name, del_flag, IS_ENABLE from warehouse
|
||||
select warehouse_id, organization_id, organization_name, top_organization_id, warehouse_code, warehouse_name,
|
||||
warehouse_type, warehouse_type_name, warehouse_structure, warehouse_nature, warm_layer_code, warm_layer_name,
|
||||
director_name, director_phone, region_code, region_name, detail_address, longitude, latitude, building_region,
|
||||
usage_region, remark, opening_up, nullify, create_time, create_by, create_by_name, update_time, update_by,
|
||||
update_by_name, del_flag, IS_ENABLE ,WORK_MODE,TASK_MODE,SAMPLE_OUT_ORDER_NO_PREFIX,ORDER_NO_GENERATE_RULE,IN_ORDER_NO_PREFIX,
|
||||
OUT_ORDER_NO_PREFIX
|
||||
from warehouse
|
||||
</sql>
|
||||
|
||||
<sql id="selectWarehousePo1">
|
||||
|
||||
+86
-7
@@ -1,12 +1,22 @@
|
||||
package com.mhd.user.application.service;
|
||||
|
||||
import cn.hutool.core.util.ObjectUtil;
|
||||
import com.alibaba.fastjson.JSONArray;
|
||||
import com.alibaba.fastjson.JSONObject;
|
||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||
import com.mhd.common.security.utils.SecurityUtils;
|
||||
import com.mhd.user.domain.userAggregate.entity.AgreementDetails;
|
||||
import com.mhd.user.domain.userAggregate.entity.UserShipperEntity;
|
||||
import com.mhd.user.domain.userAggregate.repository.mapper.AgreementDetailsMapper;
|
||||
import com.mhd.user.domain.userAggregate.repository.mapper.UserShipperMapper;
|
||||
import com.mhd.user.domain.userAggregate.repository.po.AgreementDetailsPo;
|
||||
import com.mhd.system.api.model.LoginUser;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
@@ -19,18 +29,87 @@ public class AgreementDetailsApplicationService {
|
||||
@Resource
|
||||
private AgreementDetailsMapper agreementDetailsMapper;
|
||||
|
||||
@Resource
|
||||
private UserShipperMapper userShipperMapper;
|
||||
|
||||
/**
|
||||
* 根据货主ID查询所有协议明细
|
||||
* 根据货主ID查询当前登录用户组织下的协议明细
|
||||
* 从user_shipper表的orgCode字段解析JSON,匹配当前登录用户组织code,
|
||||
* 返回该组织下的agreedaydatas列表
|
||||
*
|
||||
* @param shipperId 货主ID
|
||||
* @return 协议明细列表
|
||||
*/
|
||||
public List<AgreementDetails> listByShipperId(Long shipperId) {
|
||||
return agreementDetailsMapper.selectList(
|
||||
new LambdaQueryWrapper<AgreementDetails>()
|
||||
.eq(AgreementDetails::getShipperId, shipperId)
|
||||
.orderByDesc(AgreementDetails::getCreateTime)
|
||||
);
|
||||
public List<AgreementDetailsPo> listByShipperId(Long shipperId) {
|
||||
// 1. 获取当前登录用户组织ID
|
||||
LoginUser loginUser = SecurityUtils.getLoginUser();
|
||||
if (ObjectUtil.isNull(loginUser) || ObjectUtil.isNull(loginUser.getUserPo())) {
|
||||
log.warn("未获取到登录用户信息");
|
||||
return Collections.emptyList();
|
||||
}
|
||||
Long organizationId = loginUser.getUserPo().getOrganizationId();
|
||||
if (ObjectUtil.isNull(organizationId)) {
|
||||
log.warn("当前登录用户无组织信息");
|
||||
return Collections.emptyList();
|
||||
}
|
||||
|
||||
// 2. 根据shipperId查询货主信息,获取orgCode字段
|
||||
UserShipperEntity shipperEntity = userShipperMapper.selectById(shipperId);
|
||||
if (ObjectUtil.isNull(shipperEntity)) {
|
||||
log.warn("未找到货主信息,shipperId={}", shipperId);
|
||||
return Collections.emptyList();
|
||||
}
|
||||
String orgCodeJson = shipperEntity.getOrgCode();
|
||||
if (ObjectUtil.isNull(orgCodeJson) || orgCodeJson.isEmpty()) {
|
||||
log.warn("货主orgCode为空,shipperId={}", shipperId);
|
||||
return Collections.emptyList();
|
||||
}
|
||||
|
||||
// 3. 解析orgCode JSON数组,匹配当前登录用户组织code
|
||||
JSONArray orgCodeArray = JSONArray.parseArray(orgCodeJson);
|
||||
if (orgCodeArray == null || orgCodeArray.isEmpty()) {
|
||||
return Collections.emptyList();
|
||||
}
|
||||
|
||||
JSONObject matchedOrg = null;
|
||||
for (int i = 0; i < orgCodeArray.size(); i++) {
|
||||
JSONObject orgItem = orgCodeArray.getJSONObject(i);
|
||||
Long code = orgItem.getLong("code");
|
||||
if (organizationId.equals(code)) {
|
||||
matchedOrg = orgItem;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (matchedOrg == null) {
|
||||
log.info("未匹配到当前组织的协议信息,shipperId={},organizationId={}", shipperId, organizationId);
|
||||
return Collections.emptyList();
|
||||
}
|
||||
|
||||
// 4. 获取匹配组织的agreedaydatas
|
||||
JSONArray agreedaydatas = matchedOrg.getJSONArray("agreedaydatas");
|
||||
if (agreedaydatas == null || agreedaydatas.isEmpty()) {
|
||||
log.info("当前组织下无协议天数数据,shipperId={},organizationId={}", shipperId, organizationId);
|
||||
return Collections.emptyList();
|
||||
}
|
||||
|
||||
// 5. 转换为AgreementDetailsPo列表
|
||||
List<AgreementDetailsPo> result = new ArrayList<>();
|
||||
for (int i = 0; i < agreedaydatas.size(); i++) {
|
||||
JSONObject item = agreedaydatas.getJSONObject(i);
|
||||
AgreementDetailsPo po = new AgreementDetailsPo();
|
||||
po.setCode(item.getString("code"));
|
||||
po.setOrgcode(item.getString("orgcode"));
|
||||
po.setPtypename(item.getString("ptypename"));
|
||||
po.setPtype(item.getString("ptype"));
|
||||
po.setPcode(item.getString("pcode"));
|
||||
po.setPname(item.getString("pname"));
|
||||
po.setPday(item.getString("pday"));
|
||||
result.add(po);
|
||||
}
|
||||
|
||||
log.info("查询协议明细成功,shipperId={},organizationId={},共{}条", shipperId, organizationId, result.size());
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
+1
-1
@@ -21,7 +21,7 @@ public class AsyncUserShipperMasterDataSyncService {
|
||||
@Resource
|
||||
private RedisLock redisLock;
|
||||
|
||||
@Async
|
||||
@Async("taskScheduler")
|
||||
public void syncMasterDataAsync(LoginUser loginUser, String lockKey) {
|
||||
Long organizationId = loginUser.getUserPo().getOrganizationId();
|
||||
try {
|
||||
|
||||
+27
@@ -2942,6 +2942,33 @@ public class UserApplicationService {
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* 仅根据用户登录账号获取用户信息(不区分组织,SSO等场景使用)
|
||||
*/
|
||||
public LoginUser getUserByUserAccount(String userAccount) {
|
||||
UserPo userPo = userDomainService.findByUserAccount(userAccount);
|
||||
if (ObjectUtil.isNotNull(userPo)) {
|
||||
LoginUser sysUser = new LoginUser();
|
||||
sysUser.setUserid(userPo.getUserId());
|
||||
sysUser.setUsername(userPo.getUserAccount());
|
||||
UserDriverPo userDriverPo = userDriverDomainService.selectByUserId(userPo.getUserId());
|
||||
UserShipperPo userShipperPo = userShipperDomainService.selectByUserId(userPo.getUserId());
|
||||
sysUser.setUserPo(userPo);
|
||||
com.mhd.common.core.domain.po.UserDriverPo userDriverPo1 = new com.mhd.common.core.domain.po.UserDriverPo();
|
||||
if(userDriverPo != null){
|
||||
BeanUtils.copyProperties(userDriverPo, userDriverPo1);
|
||||
}
|
||||
sysUser.setUserDriverPo(userDriverPo1);
|
||||
com.mhd.common.core.domain.po.UserShipperPo userShipperPo1 = new com.mhd.common.core.domain.po.UserShipperPo();
|
||||
if (userShipperPo != null){
|
||||
BeanUtils.copyProperties(userShipperPo, userShipperPo1);
|
||||
}
|
||||
sysUser.setUserShipperPo(userShipperPo1);
|
||||
return sysUser;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* @Description 根据用户账号和组织账号获取组织用户信息
|
||||
* @Author Alex
|
||||
|
||||
+392
-84
@@ -23,7 +23,10 @@ import com.mhd.common.core.enums.MessageTypeEnum;
|
||||
import com.mhd.common.core.enums.WebsocketTypeEnum;
|
||||
import com.mhd.common.core.feign.ThirdPartyServiceFeign;
|
||||
import com.mhd.common.core.service.jPush.AsyncJPushApplicationService;
|
||||
import com.mhd.common.core.utils.AESUtil;
|
||||
import com.mhd.common.core.utils.OConvertUtils;
|
||||
import com.mhd.common.core.utils.StringUtils;
|
||||
import com.mhd.common.security.utils.password.PasswordUtil;
|
||||
import com.mhd.system.api.FinanceServiceFeign;
|
||||
import com.mhd.system.api.WlhyServiceFeign;
|
||||
import com.mhd.system.api.domain.UserShipperEntityFeign;
|
||||
@@ -158,11 +161,22 @@ public class UserShipperApplicationService {
|
||||
|
||||
// 先保存前端传递的 organizationId(如果存在)
|
||||
Long frontendOrganizationId = userShipperDO.getOrganizationId();
|
||||
|
||||
|
||||
// 获取当前登录用户的组织信息
|
||||
Long loginUserOrganizationId = userPo.getOrganizationId();
|
||||
Long topOrganizationId = userPo.getTopOrganizationId();
|
||||
|
||||
|
||||
// 如果前端传了 orgCode(组织ID),直接按 org_code 过滤查询委托方,不覆盖组织条件
|
||||
// orgCode 匹配 user_shipper.org_code JSON 数组中的 code 字段,用于精确查询委托方
|
||||
if (StringUtils.isNotBlank(userShipperDO.getOrgCode())) {
|
||||
// 清空 organizationId / topOrganizationId,避免被数据权限覆盖逻辑拦截 orgCode 已授权的委托方
|
||||
userShipperDO.setOrganizationId(null);
|
||||
userShipperDO.setTopOrganizationId(null);
|
||||
log.info("托运人列表查询 - 按 orgCode 查询:orgCode={}", userShipperDO.getOrgCode());
|
||||
List<UserShipperPo> userShipperList = userShipperDomainService.userShipperList(userShipperDO);
|
||||
return processShipperList(userShipperList);
|
||||
}
|
||||
|
||||
// 数据权限:根据 organizationId 来设置查询权限
|
||||
// 当前登录用户的 organizationId 为 2827 时,可查全部组织数据;其他组织只能查自己
|
||||
if (loginUserOrganizationId != null && loginUserOrganizationId.equals(2827L)) {
|
||||
@@ -181,32 +195,13 @@ public class UserShipperApplicationService {
|
||||
log.info("托运人列表查询 - 南光组织查询所有组织:不设置组织过滤条件");
|
||||
}
|
||||
} else {
|
||||
// 其他组织:设置 organizationId,只查询当前组织的数据
|
||||
// 其他组织只能查询自己组织的数据,不能查询其他组织的数据
|
||||
if (frontendOrganizationId != null) {
|
||||
// 前端传递了 organizationId,验证是否与当前登录用户的组织ID一致
|
||||
if (!frontendOrganizationId.equals(loginUserOrganizationId)) {
|
||||
// 前端传递了其他组织的 organizationId,强制使用当前登录用户的组织ID,防止越权查询
|
||||
log.warn("托运人列表查询 - 前端传递的组织ID {} 与当前登录用户的组织ID {} 不一致,使用当前登录用户的组织ID进行过滤",
|
||||
frontendOrganizationId, loginUserOrganizationId);
|
||||
userShipperDO.setOrganizationId(loginUserOrganizationId);
|
||||
if (frontendOrganizationId.equals(2827L)){
|
||||
userShipperDO.setOrganizationId(null);
|
||||
}
|
||||
} else {
|
||||
// 前端传递的 organizationId 与当前登录用户的组织ID一致,使用前端传递的值
|
||||
userShipperDO.setOrganizationId(frontendOrganizationId);
|
||||
}
|
||||
if (topOrganizationId != null) {
|
||||
userShipperDO.setTopOrganizationId(topOrganizationId);
|
||||
}
|
||||
} else {
|
||||
// 前端没有传递 organizationId,使用当前登录用户的组织ID
|
||||
userShipperDO.setOrganizationId(loginUserOrganizationId);
|
||||
if (topOrganizationId != null) {
|
||||
userShipperDO.setTopOrganizationId(topOrganizationId);
|
||||
}
|
||||
}
|
||||
// 其他组织:设置 organizationId 为当前登录组织ID。
|
||||
// 查询条件为:a.organization_id = 本组织 OR b.org_code LIKE 本组织ID
|
||||
// 即委托方初始绑定本组织、或 org_code 中包含本组织(被授权给本组织)时,均可查到。
|
||||
// 不设置 topOrganizationId,避免跨顶级组织授权(org_code 已包含本组织)被顶级组织条件拦截。
|
||||
userShipperDO.setOrganizationId(loginUserOrganizationId);
|
||||
userShipperDO.setTopOrganizationId(null);
|
||||
log.info("托运人列表查询 - 其他组织按本组织及 org_code 查询:organizationId={}", loginUserOrganizationId);
|
||||
}
|
||||
|
||||
log.info("托运人列表查询 - 设置组织ID后,查询参数:organizationId={}, topOrganizationId={}, userId={}",
|
||||
@@ -359,6 +354,280 @@ public class UserShipperApplicationService {
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* 从 Excel 导入委托方
|
||||
* 模版列:登录账号、公司名称、联系人、联系电话、地址、详细地址、备注、结算币种、NC客户编码
|
||||
*/
|
||||
public com.mhd.common.core.web.domain.AjaxResult importShipperFromExcel(org.springframework.web.multipart.MultipartFile file) {
|
||||
if (file == null || file.isEmpty()) {
|
||||
return com.mhd.common.core.web.domain.AjaxResult.error("文件不能为空");
|
||||
}
|
||||
try {
|
||||
org.apache.poi.ss.usermodel.Workbook workbook = org.apache.poi.ss.usermodel.WorkbookFactory.create(file.getInputStream());
|
||||
org.apache.poi.ss.usermodel.Sheet sheet = workbook.getSheetAt(0);
|
||||
int total = 0, success = 0, failed = 0;
|
||||
java.util.List<String> errors = new java.util.ArrayList<>();
|
||||
LoginUser loginUser = SecurityUtils.getLoginUser();
|
||||
if (loginUser == null || loginUser.getUserPo() == null) {
|
||||
return com.mhd.common.core.web.domain.AjaxResult.error("登录信息失效");
|
||||
}
|
||||
Long currentOrgId = loginUser.getUserPo().getOrganizationId();
|
||||
String currentOrgName = loginUser.getUserPo().getOrganizationName();
|
||||
for (int i = 1; i <= sheet.getLastRowNum(); i++) {
|
||||
org.apache.poi.ss.usermodel.Row row = sheet.getRow(i);
|
||||
if (row == null) continue;
|
||||
String userAccount = getCellStr(row.getCell(0));
|
||||
String companyName = getCellStr(row.getCell(1));
|
||||
if (org.springframework.util.StringUtils.isEmpty(companyName)) continue;
|
||||
total++;
|
||||
try {
|
||||
String contactName = getCellStr(row.getCell(2));
|
||||
String contactPhone = getCellStr(row.getCell(3));
|
||||
String address = getCellStr(row.getCell(4));
|
||||
String detailedAddress = getCellStr(row.getCell(5));
|
||||
String remark = getCellStr(row.getCell(6));
|
||||
String settlementCurrency = getCellStr(row.getCell(7));
|
||||
String ncCustomerCode = getCellStr(row.getCell(8));
|
||||
|
||||
// 先按公司名称查是否已存在委托方
|
||||
UserShipperEntity existingShipper = findFirstByShipperEnterpriseNameAcrossOrgs(companyName);
|
||||
if (existingShipper != null && existingShipper.getShipperId() != null) {
|
||||
// 已存在:按模板更新指定字段
|
||||
updateShipperFromExcel(existingShipper, userAccount, companyName,
|
||||
contactName, contactPhone, address, detailedAddress,
|
||||
remark, settlementCurrency, ncCustomerCode, loginUser, currentOrgId);
|
||||
success++;
|
||||
} else {
|
||||
UserShipperDO shipperDO = new UserShipperDO();
|
||||
shipperDO.setShipperType(2);
|
||||
shipperDO.setDataSource(2);
|
||||
shipperDO.setUserAccount(userAccount);
|
||||
shipperDO.setShipperEnterpriseName(companyName);
|
||||
// NC客户编码使用模板中的独立字段,不再复用登录账号
|
||||
shipperDO.setCustomerNcCode(ncCustomerCode);
|
||||
// 公司名称 -> user表 user_name + user_shipper表 user_name_shipper
|
||||
shipperDO.setUserName(companyName);
|
||||
shipperDO.setUserNameShipper(contactName);
|
||||
// 登录账号 -> user表 user_member_code
|
||||
shipperDO.setUserMemberCode(userAccount);
|
||||
// 联系人 -> user表 emergency_contact_name
|
||||
shipperDO.setEmergencyContactName(contactName);
|
||||
// 联系电话 -> user表 emergency_contact_phone
|
||||
shipperDO.setEmergencyContactPhone(contactPhone);
|
||||
shipperDO.setUserPhone(contactPhone);
|
||||
// 地址 -> user表 user_area_name,详细地址 -> user表 user_area_address
|
||||
shipperDO.setUserAreaName(address);
|
||||
shipperDO.setUserAreaAddress(detailedAddress);
|
||||
shipperDO.setRemark(remark);
|
||||
shipperDO.setSettlementCurrency(settlementCurrency);
|
||||
// 新导入账号默认密码 Aa123456(按前端加密约定先 AES 加密)
|
||||
shipperDO.setUserPassword(AESUtil.encrypt("Aa123456"));
|
||||
// 初始化 orgCode:记录当前组织信息和NC客户编码
|
||||
com.alibaba.fastjson.JSONArray orgCodeArray = new com.alibaba.fastjson.JSONArray();
|
||||
com.alibaba.fastjson.JSONObject orgItem = new com.alibaba.fastjson.JSONObject();
|
||||
orgItem.put("name", currentOrgName);
|
||||
orgItem.put("code", currentOrgId);
|
||||
orgItem.put("ncCustomer", ncCustomerCode);
|
||||
orgItem.put("names", currentOrgId);
|
||||
orgCodeArray.add(orgItem);
|
||||
shipperDO.setOrgCode(orgCodeArray.toJSONString());
|
||||
Map<String, Object> addResult = addShipper(shipperDO);
|
||||
Object newUserIdObj = addResult.get("userId");
|
||||
if (newUserIdObj instanceof Long) {
|
||||
assignCompanyRoleIfMissing((Long) newUserIdObj, currentOrgId);
|
||||
}
|
||||
success++;
|
||||
}
|
||||
} catch (Exception e) {
|
||||
failed++;
|
||||
errors.add("第" + (i + 1) + "行[" + companyName + "]导入失败:" + e.getMessage());
|
||||
log.error("导入委托方第{}行失败", i + 1, e);
|
||||
}
|
||||
}
|
||||
workbook.close();
|
||||
java.util.Map<String, Object> result = new java.util.HashMap<>();
|
||||
result.put("total", total);
|
||||
result.put("success", success);
|
||||
result.put("failed", failed);
|
||||
result.put("errorMessages", errors);
|
||||
return com.mhd.common.core.web.domain.AjaxResult.success("导入完成", result);
|
||||
} catch (Exception e) {
|
||||
log.error("解析Excel失败", e);
|
||||
return com.mhd.common.core.web.domain.AjaxResult.error("解析Excel失败:" + e.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 导入委托方时,确保账号仅绑定企业货主(company)角色。
|
||||
* 注意:authShipper 会把“当前登录管理员的所有角色”都分配给导入用户,
|
||||
* 因此这里必须保证用户最终只绑定 company 角色——若现有角色不是“唯一的 company 角色”,
|
||||
* 一律删除后重新分配,避免残留 ownerCargo 等多条错误角色。
|
||||
*/
|
||||
private void assignCompanyRoleIfMissing(Long userId, Long organizationId) {
|
||||
if (userId == null || organizationId == null) {
|
||||
return;
|
||||
}
|
||||
// 查询用户现有角色
|
||||
List<UserRoleMenuPO> existingRoles = userRoleDomainService.selectRolesByUserId(userId);
|
||||
// 只有恰好绑定了唯一的 company 角色时,才认为正确,无需处理
|
||||
boolean onlyCompany = !CollUtil.isEmpty(existingRoles)
|
||||
&& existingRoles.size() == 1
|
||||
&& RoleEnum.COMPANY.getCode().equals(existingRoles.get(0).getRoleCode());
|
||||
if (onlyCompany) {
|
||||
return;
|
||||
}
|
||||
// 否则:删除所有现有角色(ownerCargo、或多个角色),重新分配 company
|
||||
if (CollUtil.isNotEmpty(existingRoles)) {
|
||||
log.info("导入委托方 - 用户{}角色不正确,删除原角色后重新分配company,原角色: {}",
|
||||
userId, existingRoles.stream().map(UserRoleMenuPO::getRoleCode).collect(Collectors.toList()));
|
||||
userRoleDomainService.deleteByUserId(userId);
|
||||
}
|
||||
// 按 role_code + organization_id 精确匹配角色(selectByOrganizationIdAndRoleCode 的 common_where 不含 roleCode 过滤,不适用)
|
||||
RolePO rolePO = roleDomainService.selectByRoleCodeAndOrganizationId(RoleEnum.COMPANY.getCode(), organizationId);
|
||||
if (rolePO == null) {
|
||||
log.warn("组织{}下未找到{}角色,无法为导入用户{}分配角色", organizationId, RoleEnum.COMPANY.getCode(), userId);
|
||||
return;
|
||||
}
|
||||
// 1. 写入 user_role 表
|
||||
UserRoleDo userRoleDo = new UserRoleDo();
|
||||
userRoleDo.setUserId(userId);
|
||||
userRoleDo.setRoleId(rolePO.getRoleId());
|
||||
userRoleDomainService.addUserRole(userRoleDo);
|
||||
// 2. 同步更新 user 表的 role_code / role_name
|
||||
UserDO userDO = new UserDO();
|
||||
userDO.setUserId(userId);
|
||||
userDO.setRoleCode(RoleEnum.COMPANY.getCode());
|
||||
userDO.setRoleName(RoleEnum.COMPANY.getName());
|
||||
userDomainService.updateUser(userDO);
|
||||
}
|
||||
|
||||
/**
|
||||
* 按Excel模板更新已存在的委托方(只更新模板中的字段)
|
||||
*/
|
||||
private void updateShipperFromExcel(UserShipperEntity existingShipper, String userAccount,
|
||||
String companyName, String contactName, String contactPhone,
|
||||
String address, String detailedAddress, String remark,
|
||||
String settlementCurrency, String ncCustomerCode,
|
||||
LoginUser loginUser, Long currentOrgId) {
|
||||
Long userId = existingShipper.getUserId();
|
||||
// 从 user 主表读取当前登录账号(user_shipper 表无 user_account 字段)
|
||||
UserPo existingUser = null;
|
||||
String existingUserAccount = null;
|
||||
if (userId != null) {
|
||||
existingUser = userDomainService.selectByUserId(userId);
|
||||
if (existingUser != null) {
|
||||
existingUserAccount = existingUser.getUserAccount();
|
||||
}
|
||||
}
|
||||
if (StringUtils.isBlank(existingUserAccount) && StringUtils.isBlank(userAccount)) {
|
||||
throw new ServiceException("登录账号不能为空");
|
||||
}
|
||||
// 登录账号变更时校验唯一性
|
||||
if (StringUtils.isNotBlank(userAccount) && !userAccount.equals(existingUserAccount)) {
|
||||
UserDO checkDO = new UserDO();
|
||||
checkDO.setUserAccount(userAccount);
|
||||
checkDO.setTopOrganizationId(existingShipper.getTopOrganizationId());
|
||||
UserPo existedUser = userDomainService.findByTopOrganizationIdAndUserAccount(checkDO);
|
||||
if (existedUser != null && !existedUser.getUserId().equals(userId)) {
|
||||
throw new ServiceException("登录账号已存在:" + userAccount);
|
||||
}
|
||||
}
|
||||
Date now = new Date();
|
||||
Long updateBy = loginUser.getUserPo().getUserId();
|
||||
String updateByName = loginUser.getUserPo().getUserName();
|
||||
|
||||
// 1. 更新 user_shipper 表指定字段
|
||||
// 注意:user_shipper 表没有 user_account 字段,登录账号在 user 主表维护
|
||||
UserShipperEntity shipperUpdate = new UserShipperEntity();
|
||||
shipperUpdate.setShipperId(existingShipper.getShipperId());
|
||||
shipperUpdate.setShipperEnterpriseName(companyName);
|
||||
shipperUpdate.setUserNameShipper(contactName);
|
||||
shipperUpdate.setUserAreaName(address);
|
||||
shipperUpdate.setUserAreaAddress(detailedAddress);
|
||||
shipperUpdate.setRemark(remark);
|
||||
shipperUpdate.setSettlementCurrency(settlementCurrency);
|
||||
shipperUpdate.setCustomerNcCode(ncCustomerCode);
|
||||
shipperUpdate.setUpdateBy(updateBy);
|
||||
shipperUpdate.setUpdateByName(updateByName);
|
||||
shipperUpdate.setUpdateTime(now);
|
||||
userShipperMapper.updateById(shipperUpdate);
|
||||
|
||||
// 2. 同步更新 user 表指定字段
|
||||
if (userId != null) {
|
||||
UserDO userDO = new UserDO();
|
||||
userDO.setUserId(userId);
|
||||
if (StringUtils.isNotBlank(userAccount)) {
|
||||
userDO.setUserAccount(userAccount);
|
||||
// 登录账号 -> user表 user_member_code
|
||||
userDO.setUserMemberCode(userAccount);
|
||||
}
|
||||
// 公司名称 -> user表 user_name
|
||||
userDO.setUserName(companyName);
|
||||
// 联系人 -> user表 emergency_contact_name
|
||||
userDO.setEmergencyContactName(contactName);
|
||||
// 联系电话 -> user表 emergency_contact_phone
|
||||
userDO.setEmergencyContactPhone(contactPhone);
|
||||
userDO.setUserPhone(contactPhone);
|
||||
userDO.setUserAreaName(address);
|
||||
userDO.setUserAreaAddress(detailedAddress);
|
||||
userDO.setUpdateBy(updateBy);
|
||||
userDO.setUpdateByName(updateByName);
|
||||
userDO.setUpdateTime(now);
|
||||
// 如果现有账号没有密码,设置默认密码 Aa123456(与 addUserInfoShipper 一致的加密流程)
|
||||
if (existingUser != null && StringUtils.isBlank(existingUser.getUserPassword())) {
|
||||
String finalAccount = StringUtils.isNotBlank(userAccount) ? userAccount : existingUser.getUserAccount();
|
||||
String salt = OConvertUtils.randomGen(8);
|
||||
String passwordEncode = PasswordUtil.encrypt(finalAccount, "Aa123456", salt);
|
||||
userDO.setUserPassword(passwordEncode);
|
||||
userDO.setUserSalt(salt);
|
||||
}
|
||||
userDomainService.updateUser(userDO);
|
||||
// 如果该账号没有企业货主(company)角色,补分配当前导入组织下的 company 角色,避免登录报“账号未授权角色信息”
|
||||
assignCompanyRoleIfMissing(userId, currentOrgId);
|
||||
}
|
||||
|
||||
// 3. 更新 orgCode 中当前组织的 ncCustomer
|
||||
String existingOrgCode = existingShipper.getOrgCode();
|
||||
com.alibaba.fastjson.JSONArray orgCodeArray = new com.alibaba.fastjson.JSONArray();
|
||||
boolean hasOrg = false;
|
||||
if (StringUtils.isNotEmpty(existingOrgCode)) {
|
||||
try {
|
||||
orgCodeArray = com.alibaba.fastjson.JSONArray.parseArray(existingOrgCode);
|
||||
for (int i = 0; i < orgCodeArray.size(); i++) {
|
||||
com.alibaba.fastjson.JSONObject orgItem = orgCodeArray.getJSONObject(i);
|
||||
if (currentOrgId != null && currentOrgId.equals(orgItem.getLong("code"))) {
|
||||
orgItem.put("ncCustomer", ncCustomerCode);
|
||||
hasOrg = true;
|
||||
}
|
||||
}
|
||||
} catch (Exception e) {
|
||||
log.error("解析orgCode失败,shipperId={}", existingShipper.getShipperId(), e);
|
||||
}
|
||||
}
|
||||
if (!hasOrg) {
|
||||
com.alibaba.fastjson.JSONObject newOrgItem = new com.alibaba.fastjson.JSONObject();
|
||||
newOrgItem.put("name", loginUser.getUserPo().getOrganizationName());
|
||||
newOrgItem.put("code", currentOrgId);
|
||||
newOrgItem.put("ncCustomer", ncCustomerCode);
|
||||
newOrgItem.put("names", currentOrgId);
|
||||
orgCodeArray.add(newOrgItem);
|
||||
}
|
||||
UserShipperEntity orgCodeUpdate = new UserShipperEntity();
|
||||
orgCodeUpdate.setShipperId(existingShipper.getShipperId());
|
||||
orgCodeUpdate.setOrgCode(orgCodeArray.toJSONString());
|
||||
orgCodeUpdate.setUpdateBy(updateBy);
|
||||
orgCodeUpdate.setUpdateByName(updateByName);
|
||||
orgCodeUpdate.setUpdateTime(now);
|
||||
userShipperMapper.updateById(orgCodeUpdate);
|
||||
}
|
||||
|
||||
private String getCellStr(org.apache.poi.ss.usermodel.Cell cell) {
|
||||
if (cell == null) return null;
|
||||
cell.setCellType(org.apache.poi.ss.usermodel.CellType.STRING);
|
||||
String v = cell.getStringCellValue();
|
||||
return v == null ? null : v.trim();
|
||||
}
|
||||
|
||||
/**
|
||||
* 个人货主认证
|
||||
*
|
||||
@@ -1055,6 +1324,12 @@ public class UserShipperApplicationService {
|
||||
return userShipperDomainService.userShipperList(userShipperDO);
|
||||
}
|
||||
|
||||
public List<UserShipperPo> userShipperListAllByOrg(Long orgCode) {
|
||||
UserShipperDO userShipperDO = new UserShipperDO();
|
||||
userShipperDO.setOrganizationId(orgCode);
|
||||
return userShipperDomainService.userShipperList(userShipperDO);
|
||||
}
|
||||
|
||||
/**
|
||||
* E签宝回调接口-认证授权完成
|
||||
* @param jsonObject 回调参数
|
||||
@@ -1349,6 +1624,82 @@ public class UserShipperApplicationService {
|
||||
organizationId);
|
||||
}
|
||||
|
||||
/**
|
||||
* 按公司名跨组织查询第一个未删除的委托方(包含 orgCode)。
|
||||
* 用于 MDM 同步时:同公司名可能在不同组织下 nc 编码不同,但本地是同一条委托方记录。
|
||||
*/
|
||||
public UserShipperEntity findFirstByShipperEnterpriseNameAcrossOrgs(String shipperEnterpriseName) {
|
||||
if (StringUtils.isEmpty(shipperEnterpriseName)) {
|
||||
return null;
|
||||
}
|
||||
return userShipperMapper.findFirstByShipperEnterpriseNameAcrossOrgs(shipperEnterpriseName.trim());
|
||||
}
|
||||
|
||||
/**
|
||||
* 在已存在的同公司名委托方(可能属于其他组织)的 orgCode JSON 数组中追加当前组织信息。
|
||||
* 若目标组织已存在于数组中则跳过(不重复追加)。
|
||||
*
|
||||
* @param existingShipper 本地已存在的同公司名委托方
|
||||
* @param targetOrganizationId 当前同步组织 ID
|
||||
* @param targetOrganizationName 当前同步组织名称
|
||||
* @param ncCustomerCode MDM 客商 code(作为该组织下的 ncCustomer 记录)
|
||||
* @param loginUser 登录用户(用于写入 updateBy)
|
||||
* @return true 表示实际写入(新增组织或已存在都返回 true,方便调用方统计),false 表示参数无效
|
||||
*/
|
||||
public boolean appendOrganizationToExistingShipper(UserShipperEntity existingShipper,
|
||||
Long targetOrganizationId, String targetOrganizationName,
|
||||
String ncCustomerCode, LoginUser loginUser) {
|
||||
if (existingShipper == null) {
|
||||
return false;
|
||||
}
|
||||
String existingOrgCode = existingShipper.getOrgCode();
|
||||
|
||||
boolean hasOrg = false;
|
||||
com.alibaba.fastjson.JSONArray orgCodeArray = new com.alibaba.fastjson.JSONArray();
|
||||
if (StringUtils.isNotEmpty(existingOrgCode)) {
|
||||
try {
|
||||
orgCodeArray = com.alibaba.fastjson.JSONArray.parseArray(existingOrgCode);
|
||||
// 检查是否已包含当前组织
|
||||
for (int i = 0; i < orgCodeArray.size(); i++) {
|
||||
com.alibaba.fastjson.JSONObject orgItem = orgCodeArray.getJSONObject(i);
|
||||
Long itemCode = orgItem.getLong("code");
|
||||
if (targetOrganizationId != null && targetOrganizationId.equals(itemCode)) {
|
||||
hasOrg = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
} catch (Exception e) {
|
||||
log.error("解析orgCode失败,shipperId={}", existingShipper.getShipperId(), e);
|
||||
}
|
||||
}
|
||||
|
||||
if (!hasOrg) {
|
||||
// 添加新组织到orgCode数组
|
||||
com.alibaba.fastjson.JSONObject newOrgItem = new com.alibaba.fastjson.JSONObject();
|
||||
newOrgItem.put("name", targetOrganizationName);
|
||||
newOrgItem.put("code", targetOrganizationId);
|
||||
newOrgItem.put("ncCustomer", ncCustomerCode);
|
||||
newOrgItem.put("names", targetOrganizationId);
|
||||
orgCodeArray.add(newOrgItem);
|
||||
|
||||
// 更新委托方的orgCode字段
|
||||
existingShipper.setOrgCode(orgCodeArray.toJSONString());
|
||||
if (loginUser != null && loginUser.getUserPo() != null) {
|
||||
existingShipper.setUpdateBy(loginUser.getUserPo().getUserId());
|
||||
existingShipper.setUpdateByName(loginUser.getUserPo().getUserName());
|
||||
}
|
||||
existingShipper.setUpdateTime(new Date());
|
||||
userShipperMapper.updateById(existingShipper);
|
||||
|
||||
log.info("委托方已存在,添加新组织到orgCode,customerNcCode={},新增组织code={},name={}",
|
||||
ncCustomerCode, targetOrganizationId, targetOrganizationName);
|
||||
} else {
|
||||
log.info("委托方已存在且已包含该组织,跳过添加,customerNcCode={},组织code={}",
|
||||
ncCustomerCode, targetOrganizationId);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
public static String buildMasterDataMatchKey(String ncCode, String companyName) {
|
||||
return normalizeMasterDataKey(ncCode) + "|" + normalizeMasterDataKey(companyName);
|
||||
}
|
||||
@@ -1374,61 +1725,8 @@ public class UserShipperApplicationService {
|
||||
throw new ServiceException("获取组织配置失败");
|
||||
}
|
||||
|
||||
// 检查是否已存在相同customerNcCode的委托方(可能在不同组织)
|
||||
List<UserShipperEntity> existingShippers = userShipperMapper.selectList(
|
||||
new LambdaQueryWrapper<UserShipperEntity>()
|
||||
.eq(UserShipperEntity::getShipperEnterpriseName, record.getDesc1())
|
||||
.eq(UserShipperEntity::getDelFlag, 1));
|
||||
|
||||
if (CollUtil.isNotEmpty(existingShippers)) {
|
||||
// 找到已存在的委托方,检查是否已经有该组织
|
||||
UserShipperEntity existingShipper = existingShippers.get(0);
|
||||
String existingOrgCode = existingShipper.getOrgCode();
|
||||
|
||||
boolean hasOrg = false;
|
||||
com.alibaba.fastjson.JSONArray orgCodeArray = new com.alibaba.fastjson.JSONArray();
|
||||
if (StringUtils.isNotEmpty(existingOrgCode)) {
|
||||
try {
|
||||
orgCodeArray = com.alibaba.fastjson.JSONArray.parseArray(existingOrgCode);
|
||||
// 检查是否已包含当前组织
|
||||
for (int i = 0; i < orgCodeArray.size(); i++) {
|
||||
com.alibaba.fastjson.JSONObject orgItem = orgCodeArray.getJSONObject(i);
|
||||
Long itemCode = orgItem.getLong("code");
|
||||
if (targetOrganizationId.equals(itemCode)) {
|
||||
hasOrg = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
} catch (Exception e) {
|
||||
log.error("解析orgCode失败,shipperId={}", existingShipper.getShipperId(), e);
|
||||
}
|
||||
}
|
||||
|
||||
if (!hasOrg) {
|
||||
// 添加新组织到orgCode数组
|
||||
com.alibaba.fastjson.JSONObject newOrgItem = new com.alibaba.fastjson.JSONObject();
|
||||
newOrgItem.put("name", targetOrganizationName);
|
||||
newOrgItem.put("code", targetOrganizationId);
|
||||
newOrgItem.put("ncCustomer", record.getCode());
|
||||
newOrgItem.put("names", targetOrganizationId);
|
||||
orgCodeArray.add(newOrgItem);
|
||||
|
||||
// 更新委托方的orgCode字段
|
||||
existingShipper.setOrgCode(orgCodeArray.toJSONString());
|
||||
existingShipper.setUpdateBy(loginUser.getUserPo().getUserId());
|
||||
existingShipper.setUpdateByName(loginUser.getUserPo().getUserName());
|
||||
existingShipper.setUpdateTime(new Date());
|
||||
userShipperMapper.updateById(existingShipper);
|
||||
|
||||
log.info("委托方已存在,添加新组织到orgCode,customerNcCode={},新增组织code={},name={}",
|
||||
record.getCode(), targetOrganizationId, targetOrganizationName);
|
||||
} else {
|
||||
log.info("委托方已存在且已包含该组织,跳过添加,customerNcCode={},组织code={}",
|
||||
record.getCode(), targetOrganizationId);
|
||||
}
|
||||
return; // 不新增,直接返回
|
||||
}
|
||||
|
||||
// 按公司名跨组织匹配已存在委托方的逻辑已迁移到 doSync 层(先调用 appendOrganizationToExistingShipper),
|
||||
// 走到这里说明按 ncCode+companyName 与公司名均未匹配到,本方法只负责"新增"。
|
||||
// 不存在相同的委托方,执行新增逻辑
|
||||
UserShipperDO userShipperDO = buildShipperDOFromMasterData(record, loginUser,
|
||||
targetOrganizationId, targetOrganizationName, targetTopOrganizationId);
|
||||
@@ -1441,6 +1739,16 @@ public class UserShipperApplicationService {
|
||||
userShipperDO.setAuthType(2);
|
||||
userShipperDO.setShipperAuthStatus(3);
|
||||
|
||||
// 初始化 orgCode:新加的客商属于当前组织,将当前组织信息写入 orgCode JSON 数组
|
||||
com.alibaba.fastjson.JSONArray orgCodeArray = new com.alibaba.fastjson.JSONArray();
|
||||
com.alibaba.fastjson.JSONObject orgItem = new com.alibaba.fastjson.JSONObject();
|
||||
orgItem.put("name", targetOrganizationName);
|
||||
orgItem.put("code", targetOrganizationId);
|
||||
orgItem.put("ncCustomer", record.getCode());
|
||||
orgItem.put("names", targetOrganizationId);
|
||||
orgCodeArray.add(orgItem);
|
||||
userShipperDO.setOrgCode(orgCodeArray.toJSONString());
|
||||
|
||||
String userAccount = buildMasterDataUserAccount(record.getCode());
|
||||
checkUserAccountUnique(userAccount, null, configSwitch.getTopOrganizationId());
|
||||
userShipperDO.setUserAccount(userAccount);
|
||||
@@ -1556,7 +1864,7 @@ public class UserShipperApplicationService {
|
||||
Long targetOrganizationId, String targetOrganizationName,
|
||||
Long targetTopOrganizationId) {
|
||||
UserShipperDO userShipperDO = new UserShipperDO();
|
||||
userShipperDO.setCustomerNcCode(record.getCode());
|
||||
userShipperDO.setCustomerNcCode(record.getDesc17()); // NC编码用desc17,与匹配Key一致
|
||||
userShipperDO.setUserMemberCode(record.getCode());
|
||||
userShipperDO.setShipperEnterpriseName(record.getDesc1());
|
||||
userShipperDO.setUserNameShipper(record.getDesc1());
|
||||
|
||||
+51
-17
@@ -13,6 +13,7 @@ import com.mhd.common.core.utils.StringUtils;
|
||||
import com.mhd.common.redis.service.RedisLock;
|
||||
import com.mhd.common.security.utils.SecurityUtils;
|
||||
import com.mhd.system.api.model.LoginUser;
|
||||
import com.mhd.user.domain.userAggregate.entity.UserShipperEntity;
|
||||
import com.mhd.user.domain.userAggregate.repository.po.UserShipperPo;
|
||||
import com.mhd.user.domain.userShipperMdmSync.entity.UserShipperMdmSyncEntity;
|
||||
import com.mhd.user.domain.userShipperMdmSync.mapper.UserShipperMdmSyncMapper;
|
||||
@@ -69,13 +70,28 @@ public class UserShipperMasterDataSyncService {
|
||||
public void syncMasterData() {
|
||||
LoginUser loginUser = requireLoginUser();
|
||||
Long organizationId = loginUser.getUserPo().getOrganizationId();
|
||||
String lockKey = LOCK_PREFIX + organizationId;
|
||||
boolean locked = redisLock.tryLock(lockKey, SYNC_LOCK_MINUTES, TimeUnit.MINUTES);
|
||||
if (!locked) {
|
||||
throw new ServiceException("当前组织正在同步主数据,请稍后再试");
|
||||
}
|
||||
markSyncInProgress(organizationId);
|
||||
asyncUserShipperMasterDataSyncService.syncMasterDataAsync(loginUser, lockKey);
|
||||
new Thread(() -> {
|
||||
String lockKey = LOCK_PREFIX + organizationId;
|
||||
try {
|
||||
boolean locked = redisLock.tryLock(lockKey, SYNC_LOCK_MINUTES, TimeUnit.MINUTES);
|
||||
if (!locked) {
|
||||
log.warn("当前组织正在同步主数据,跳过本次同步");
|
||||
return;
|
||||
}
|
||||
markSyncInProgress(organizationId);
|
||||
try {
|
||||
ShipperMasterDataSyncResultVo resultVo = doSync(loginUser);
|
||||
log.info("MDM同步完成: {}", resultVo);
|
||||
} catch (Exception e) {
|
||||
log.error("同步主数据失败, organizationId={}", organizationId, e);
|
||||
markSyncFailed(organizationId, e.getMessage());
|
||||
} finally {
|
||||
redisLock.unlock(lockKey);
|
||||
}
|
||||
} catch (Exception e) {
|
||||
log.error("获取同步锁失败", e);
|
||||
}
|
||||
}, "mdm-sync-thread").start();
|
||||
}
|
||||
|
||||
public ShipperMasterDataSyncResultVo executeSync(LoginUser loginUser) {
|
||||
@@ -184,14 +200,31 @@ public class UserShipperMasterDataSyncService {
|
||||
targetOrganizationId, organizationId, topOrganizationId, loginUser);
|
||||
UserShipperPo existing = existingMap.get(matchKey);
|
||||
if (existing == null) {
|
||||
userShipperApplicationService.addEnterpriseShipperFromMasterData(
|
||||
record, loginUser, saveTarget.getOrganizationId(),
|
||||
saveTarget.getOrganizationName(), saveTarget.getTopOrganizationId());
|
||||
resultVo.setAddCount(resultVo.getAddCount() + 1);
|
||||
UserShipperPo added = userShipperApplicationService.findByCustomerNcCodeAndCompanyName(
|
||||
ncCode, companyName, saveTarget.getOrganizationId());
|
||||
if (added != null) {
|
||||
existingMap.put(matchKey, added);
|
||||
// 按 ncCode+companyName 未匹配到时,再按公司名跨组织查询已存在的同公司名委托方。
|
||||
// 同一个客商在 MDM 中可能属于不同组织(nc 编码不同),但本地是同一条委托方记录。
|
||||
// 如果匹配到的委托方属于“另外的组织”(非当前同步组织),则不新增,
|
||||
// 而是在其 orgCode 上追加当前同步组织的信息(连同本组织下的 ncCustomer)。
|
||||
UserShipperEntity existingByName = userShipperApplicationService
|
||||
.findFirstByShipperEnterpriseNameAcrossOrgs(companyName);
|
||||
if (existingByName != null
|
||||
&& saveTarget.getOrganizationId() != null
|
||||
&& !saveTarget.getOrganizationId().equals(existingByName.getOrganizationId())) {
|
||||
userShipperApplicationService.appendOrganizationToExistingShipper(
|
||||
existingByName, saveTarget.getOrganizationId(),
|
||||
saveTarget.getOrganizationName(), ncCode, loginUser);
|
||||
resultVo.setLinkCount(resultVo.getLinkCount() + 1);
|
||||
log.info("MDM同步按公司名跨组织合并:customerNcCode={},companyName={},本组织code={},已存在委托方shipperId={}(其他组织)",
|
||||
ncCode, companyName, saveTarget.getOrganizationId(), existingByName.getShipperId());
|
||||
} else {
|
||||
userShipperApplicationService.addEnterpriseShipperFromMasterData(
|
||||
record, loginUser, saveTarget.getOrganizationId(),
|
||||
saveTarget.getOrganizationName(), saveTarget.getTopOrganizationId());
|
||||
resultVo.setAddCount(resultVo.getAddCount() + 1);
|
||||
UserShipperPo added = userShipperApplicationService.findByCustomerNcCodeAndCompanyName(
|
||||
ncCode, companyName, saveTarget.getOrganizationId());
|
||||
if (added != null) {
|
||||
existingMap.put(matchKey, added);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
userShipperApplicationService.updateEnterpriseShipperFromMasterData(
|
||||
@@ -261,8 +294,9 @@ public class UserShipperMasterDataSyncService {
|
||||
entity.setLastSyncTime(syncTime);
|
||||
entity.setSyncStatus(resultVo.getFailCount() > 0 ? 2 : 1);
|
||||
String syncMessage = String.format(
|
||||
"新增%d,更新%d,跳过%d,失败%d;组织NC=%s;跳过明细[组织不匹配:%d,非客户:%d,内部单位:%d,停用:%d,其他:%d]",
|
||||
resultVo.getAddCount(), resultVo.getUpdateCount(), resultVo.getSkipCount(), resultVo.getFailCount(),
|
||||
"新增%d,更新%d,关联%d,跳过%d,失败%d;组织NC=%s;跳过明细[组织不匹配:%d,非客户:%d,内部单位:%d,停用:%d,其他:%d]",
|
||||
resultVo.getAddCount(), resultVo.getUpdateCount(), resultVo.getLinkCount(),
|
||||
resultVo.getSkipCount(), resultVo.getFailCount(),
|
||||
orgNcCode, skipOrgMismatch, skipNotCustomer, skipInternalOrg, skipDisabled, skipOther);
|
||||
if (resultVo.getFailCount() > 0 && !resultVo.getErrorMessages().isEmpty()) {
|
||||
syncMessage += ";" + resultVo.getErrorMessages().get(0);
|
||||
|
||||
+6
@@ -31,6 +31,12 @@ public interface UserRepositoryInterface extends IService<UserEntity> {
|
||||
|
||||
|
||||
UserPo findByTopOrganizationIdAndUserAccount(UserDO userDO);
|
||||
|
||||
/**
|
||||
* 仅根据用户登录账号查询用户(不区分组织,SSO等场景使用)
|
||||
*/
|
||||
UserPo findByUserAccount(String userAccount);
|
||||
|
||||
UserPo getUserByDingUserId(String dingUserId);
|
||||
|
||||
UserPo selectUserShipperList(UserPo userPo);
|
||||
|
||||
+5
@@ -33,6 +33,11 @@ public interface UserMapper extends BaseMapper<UserEntity> {
|
||||
|
||||
UserPo findByTopOrganizationIdAndUserAccount(UserDO userDO);
|
||||
|
||||
/**
|
||||
* 仅根据用户登录账号查询用户(不区分组织,SSO等场景使用)
|
||||
*/
|
||||
UserPo findByUserAccount(@Param("userAccount") String userAccount);
|
||||
|
||||
UserPo getUserByDingUserId(@Param("dingUserId") String dingUserId);
|
||||
|
||||
UserPo findByTopOrganizationIdAndUserPhone(UserDO userDO);
|
||||
|
||||
+6
@@ -52,5 +52,11 @@ public interface UserShipperMapper extends BaseMapper<UserShipperEntity> {
|
||||
@Param("companyName") String companyName,
|
||||
@Param("organizationId") Long organizationId);
|
||||
|
||||
/**
|
||||
* 按公司名跨组织查询第一个未删除的委托方(包含 orgCode 字段)。
|
||||
* 用于 MDM 同步时按"公司名"匹配已存在的委托方(可能是其他组织的),以便在其 orgCode 上追加新组织。
|
||||
*/
|
||||
UserShipperEntity findFirstByShipperEnterpriseNameAcrossOrgs(@Param("shipperEnterpriseName") String shipperEnterpriseName);
|
||||
|
||||
String getOrgNcCode(Long organizationId);
|
||||
}
|
||||
+5
@@ -79,6 +79,11 @@ public class UserRepositoryImpl extends ServiceImpl<UserMapper,UserEntity> imple
|
||||
return userMapper.findByTopOrganizationIdAndUserAccount(userDO);
|
||||
}
|
||||
|
||||
@Override
|
||||
public UserPo findByUserAccount(String userAccount) {
|
||||
return userMapper.findByUserAccount(userAccount);
|
||||
}
|
||||
|
||||
@Override
|
||||
public UserPo getUserByDingUserId(String dingUserId) {
|
||||
return userMapper.getUserByDingUserId(dingUserId);
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user