Sfoglia il codice sorgente

8. 库房管理系统,优化库存操作界面查询列表sql,改正接口sql查询映射不到实体类具体字段问题

9.	库房管理系统,库存操作页面新增导出记录功能
10.	库房管理系统,库存操作页面,新增取消入库功能
11.	库房管理系统,优化库存操作界面上方搜索栏样式
15.	库房管理系统.修改新增分区接口,根据belongId区分企业
16.	库房管理系统.修改查询分区接口,新增获取belongId,根据belongId区分企业功能
17.	库房管理系统.新增垛位布局管理页面,实现可视化垛位布局,垛位区域块大小调整,位置调整,垛位名称更改,新增垛位等功能
18.	库房管理系统,新增保存或修改垛位接口,控制垛位区域布局的统一接口
19.	库房管理系统,调试保存或修改垛位接口,修复bug
20.	库房管理系统,新增批量新增垛位功能,根据起始数量,其实编号,新增垛位前缀来进行编排的批量操作
dw 1 settimana fa
parent
commit
432d251734

+ 107
- 22
package-lock.json Vedi File

@@ -16,6 +16,7 @@
16 16
 				"dayjs": "^1.11.10",
17 17
 				"echarts": "^5.5.1",
18 18
 				"element-plus": "^2.5.1",
19
+				"grid-layout-plus": "^1.1.1",
19 20
 				"js-base64": "^3.7.7",
20 21
 				"js-sha256": "^0.11.0",
21 22
 				"jsencrypt": "^3.3.2",
@@ -431,32 +432,47 @@
431 432
 			}
432 433
 		},
433 434
 		"node_modules/@floating-ui/core": {
434
-			"version": "1.6.0",
435
-			"resolved": "https://registry.npmmirror.com/@floating-ui/core/-/core-1.6.0.tgz",
436
-			"integrity": "sha512-PcF++MykgmTj3CIyOQbKA/hDzOAiqI3mhuoN44WRCopIs1sgoDoU4oty4Jtqaj/y3oDU6fnVSm4QG0a3t5i0+g==",
435
+			"version": "1.7.3",
436
+			"resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.7.3.tgz",
437
+			"integrity": "sha512-sGnvb5dmrJaKEZ+LDIpguvdX3bDlEllmv4/ClQ9awcmCZrlx5jQyyMWFM5kBI+EyNOCDDiKk8il0zeuX3Zlg/w==",
438
+			"license": "MIT",
437 439
 			"dependencies": {
438
-				"@floating-ui/utils": "^0.2.1"
440
+				"@floating-ui/utils": "^0.2.10"
439 441
 			}
440 442
 		},
441 443
 		"node_modules/@floating-ui/dom": {
442
-			"version": "1.5.4",
443
-			"resolved": "https://registry.npmmirror.com/@floating-ui/dom/-/dom-1.5.4.tgz",
444
-			"integrity": "sha512-jByEsHIY+eEdCjnTVu+E3ephzTOzkQ8hgUfGwos+bg7NlH33Zc5uO+QHz1mrQUOgIKKDD1RtS201P9NvAfq3XQ==",
444
+			"version": "1.7.4",
445
+			"resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.7.4.tgz",
446
+			"integrity": "sha512-OOchDgh4F2CchOX94cRVqhvy7b3AFb+/rQXyswmzmGakRfkMgoWVjfnLWkRirfLEfuD4ysVW16eXzwt3jHIzKA==",
447
+			"license": "MIT",
445 448
 			"dependencies": {
446
-				"@floating-ui/core": "^1.5.3",
447
-				"@floating-ui/utils": "^0.2.0"
449
+				"@floating-ui/core": "^1.7.3",
450
+				"@floating-ui/utils": "^0.2.10"
448 451
 			}
449 452
 		},
450 453
 		"node_modules/@floating-ui/utils": {
451
-			"version": "0.2.1",
452
-			"resolved": "https://registry.npmmirror.com/@floating-ui/utils/-/utils-0.2.1.tgz",
453
-			"integrity": "sha512-9TANp6GPoMtYzQdt54kfAyMmz1+osLlXdg2ENroU7zzrtflTLrrC/lgrIfaSe+Wu0b89GKccT7vxXA0MoAIO+Q=="
454
+			"version": "0.2.10",
455
+			"resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.10.tgz",
456
+			"integrity": "sha512-aGTxbpbg8/b5JfU1HXSrbH3wXZuLPJcNEcZQFMxLs3oSzgtVu6nFPkbbGGUvBcUjKV2YyB9Wxxabo+HEH9tcRQ==",
457
+			"license": "MIT"
458
+		},
459
+		"node_modules/@interactjs/types": {
460
+			"version": "1.10.27",
461
+			"resolved": "https://registry.npmjs.org/@interactjs/types/-/types-1.10.27.tgz",
462
+			"integrity": "sha512-BUdv0cvs4H5ODuwft2Xp4eL8Vmi3LcihK42z0Ft/FbVJZoRioBsxH+LlsBdK4tAie7PqlKGy+1oyOncu1nQ6eA==",
463
+			"license": "MIT"
454 464
 		},
455 465
 		"node_modules/@jridgewell/sourcemap-codec": {
456 466
 			"version": "1.4.15",
457 467
 			"resolved": "https://registry.npmmirror.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz",
458 468
 			"integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg=="
459 469
 		},
470
+		"node_modules/@juggle/resize-observer": {
471
+			"version": "3.4.0",
472
+			"resolved": "https://registry.npmjs.org/@juggle/resize-observer/-/resize-observer-3.4.0.tgz",
473
+			"integrity": "sha512-dfLbk+PwWvFzSxwk3n5ySL0hfBog779o8h68wK/7/APo/7cgyWp5jcXockbxdk5kFRkbeXWm4Fbi9FrdN381sA==",
474
+			"license": "Apache-2.0"
475
+		},
460 476
 		"node_modules/@nodelib/fs.scandir": {
461 477
 			"version": "2.1.5",
462 478
 			"resolved": "https://registry.npmmirror.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
@@ -712,6 +728,7 @@
712 728
 			"version": "4.17.12",
713 729
 			"resolved": "https://registry.npmmirror.com/@types/lodash-es/-/lodash-es-4.17.12.tgz",
714 730
 			"integrity": "sha512-0NgftHUcV4v34VhXm8QBSftKVXtbkBG3ViCjs6+eJ5a6y6Mi/jiFGPc1sC7QK+9BFhWrURE3EOggmWaSxL9OzQ==",
731
+			"peer": true,
715 732
 			"dependencies": {
716 733
 				"@types/lodash": "*"
717 734
 			}
@@ -752,6 +769,7 @@
752 769
 			"version": "2.3.4",
753 770
 			"resolved": "https://registry.npmmirror.com/@uppy/core/-/core-2.3.4.tgz",
754 771
 			"integrity": "sha512-iWAqppC8FD8mMVqewavCz+TNaet6HPXitmGXpGGREGrakZ4FeuWytVdrelydzTdXx6vVKkOmI2FLztGg73sENQ==",
772
+			"peer": true,
755 773
 			"dependencies": {
756 774
 				"@transloadit/prettier-bytes": "0.0.7",
757 775
 				"@uppy/store-default": "^2.1.1",
@@ -780,6 +798,7 @@
780 798
 			"version": "2.1.3",
781 799
 			"resolved": "https://registry.npmmirror.com/@uppy/xhr-upload/-/xhr-upload-2.1.3.tgz",
782 800
 			"integrity": "sha512-YWOQ6myBVPs+mhNjfdWsQyMRWUlrDLMoaG7nvf/G6Y3GKZf8AyjFDjvvJ49XWQ+DaZOftGkHmF1uh/DBeGivJQ==",
801
+			"peer": true,
783 802
 			"dependencies": {
784 803
 				"@uppy/companion-client": "^2.2.2",
785 804
 				"@uppy/utils": "^4.1.2",
@@ -789,6 +808,26 @@
789 808
 				"@uppy/core": "^2.3.3"
790 809
 			}
791 810
 		},
811
+		"node_modules/@vexip-ui/hooks": {
812
+			"version": "2.9.3",
813
+			"resolved": "https://registry.npmjs.org/@vexip-ui/hooks/-/hooks-2.9.3.tgz",
814
+			"integrity": "sha512-DrGlwSa0P0KQ98RU0MrQ4+KcItZDaejAJISv3iT6T6/E2ly4z7c2dzuNzn5Wk7y4FYnkXDfrf2UFNv7EDw8GJg==",
815
+			"license": "MIT",
816
+			"dependencies": {
817
+				"@floating-ui/dom": "^1.7.0",
818
+				"@juggle/resize-observer": "^3.4.0",
819
+				"@vexip-ui/utils": "2.16.4"
820
+			},
821
+			"peerDependencies": {
822
+				"vue": "^3.2.25"
823
+			}
824
+		},
825
+		"node_modules/@vexip-ui/utils": {
826
+			"version": "2.16.4",
827
+			"resolved": "https://registry.npmjs.org/@vexip-ui/utils/-/utils-2.16.4.tgz",
828
+			"integrity": "sha512-KX+Q4EsuwDp6ZlRJ7OAkiYxu52D5CVM8zpqQz/FXYV+JUtzl9T3dvxgtA8gQ0wm5Sh/xT6jp8Wo4X7tLAzRh/A==",
829
+			"license": "MIT"
830
+		},
792 831
 		"node_modules/@vitejs/plugin-vue": {
793 832
 			"version": "4.6.2",
794 833
 			"resolved": "https://registry.npmmirror.com/@vitejs/plugin-vue/-/plugin-vue-4.6.2.tgz",
@@ -934,6 +973,7 @@
934 973
 			"version": "1.1.7",
935 974
 			"resolved": "https://registry.npmmirror.com/@wangeditor/basic-modules/-/basic-modules-1.1.7.tgz",
936 975
 			"integrity": "sha512-cY9CPkLJaqF05STqfpZKWG4LpxTMeGSIIF1fHvfm/mz+JXatCagjdkbxdikOuKYlxDdeqvOeBmsUBItufDLXZg==",
976
+			"peer": true,
937 977
 			"dependencies": {
938 978
 				"is-url": "^1.2.4"
939 979
 			},
@@ -964,6 +1004,7 @@
964 1004
 			"version": "1.1.19",
965 1005
 			"resolved": "https://registry.npmmirror.com/@wangeditor/core/-/core-1.1.19.tgz",
966 1006
 			"integrity": "sha512-KevkB47+7GhVszyYF2pKGKtCSj/YzmClsD03C3zTt+9SR2XWT5T0e3yQqg8baZpcMvkjs1D8Dv4fk8ok/UaS2Q==",
1007
+			"peer": true,
967 1008
 			"dependencies": {
968 1009
 				"@types/event-emitter": "^0.3.3",
969 1010
 				"event-emitter": "^0.3.5",
@@ -992,6 +1033,7 @@
992 1033
 		"node_modules/@wangeditor/editor": {
993 1034
 			"version": "5.1.23",
994 1035
 			"integrity": "sha512-0RxfeVTuK1tktUaPROnCoFfaHVJpRAIE2zdS0mpP+vq1axVQpLjM8+fCvKzqYIkH0Pg+C+44hJpe3VVroSkEuQ==",
1036
+			"peer": true,
995 1037
 			"dependencies": {
996 1038
 				"@uppy/core": "^2.1.1",
997 1039
 				"@uppy/xhr-upload": "^2.0.3",
@@ -1971,6 +2013,7 @@
1971 2013
 			"version": "3.0.0",
1972 2014
 			"resolved": "https://registry.npmmirror.com/dom7/-/dom7-3.0.0.tgz",
1973 2015
 			"integrity": "sha512-oNlcUdHsC4zb7Msx7JN3K0Nro1dzJ48knvBOnDPKJ2GV9wl1i5vydJZUSyOfrkKFDZEud/jBsTk92S/VGSAe/g==",
2016
+			"peer": true,
1974 2017
 			"dependencies": {
1975 2018
 				"ssr-window": "^3.0.0-alpha.1"
1976 2019
 			}
@@ -2705,6 +2748,20 @@
2705 2748
 			"resolved": "https://registry.npmmirror.com/graceful-fs/-/graceful-fs-4.2.11.tgz",
2706 2749
 			"integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ=="
2707 2750
 		},
2751
+		"node_modules/grid-layout-plus": {
2752
+			"version": "1.1.1",
2753
+			"resolved": "https://registry.npmjs.org/grid-layout-plus/-/grid-layout-plus-1.1.1.tgz",
2754
+			"integrity": "sha512-7CWehJubrVC8Ps5QFUlnDsp0kiREvKfi3Pdjp21EyY8BNzSusqI3Utcxvu1Y9UUKe3YExvbhJzIxHK6rorbRaQ==",
2755
+			"license": "MIT",
2756
+			"dependencies": {
2757
+				"@vexip-ui/hooks": "^2.8.0",
2758
+				"@vexip-ui/utils": "^2.16.1",
2759
+				"interactjs": "^1.10.27"
2760
+			},
2761
+			"peerDependencies": {
2762
+				"vue": "^3.0.0"
2763
+			}
2764
+		},
2708 2765
 		"node_modules/has-ansi": {
2709 2766
 			"version": "2.0.0",
2710 2767
 			"resolved": "https://registry.npmmirror.com/has-ansi/-/has-ansi-2.0.0.tgz",
@@ -2966,6 +3023,15 @@
2966 3023
 			"integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
2967 3024
 			"license": "ISC"
2968 3025
 		},
3026
+		"node_modules/interactjs": {
3027
+			"version": "1.10.27",
3028
+			"resolved": "https://registry.npmjs.org/interactjs/-/interactjs-1.10.27.tgz",
3029
+			"integrity": "sha512-y/8RcCftGAF24gSp76X2JS3XpHiUvDQyhF8i7ujemBz77hwiHDuJzftHx7thY8cxGogwGiPJ+o97kWB6eAXnsA==",
3030
+			"license": "MIT",
3031
+			"dependencies": {
3032
+				"@interactjs/types": "1.10.27"
3033
+			}
3034
+		},
2969 3035
 		"node_modules/internal-slot": {
2970 3036
 			"version": "1.0.7",
2971 3037
 			"resolved": "https://registry.npmmirror.com/internal-slot/-/internal-slot-1.0.7.tgz",
@@ -3222,7 +3288,8 @@
3222 3288
 		"node_modules/is-hotkey": {
3223 3289
 			"version": "0.2.0",
3224 3290
 			"resolved": "https://registry.npmmirror.com/is-hotkey/-/is-hotkey-0.2.0.tgz",
3225
-			"integrity": "sha512-UknnZK4RakDmTgz4PI1wIph5yxSs/mvChWs9ifnlXsKuXgWmOkY/hAE0H/k2MIqH0RlRye0i1oC07MCRSD28Mw=="
3291
+			"integrity": "sha512-UknnZK4RakDmTgz4PI1wIph5yxSs/mvChWs9ifnlXsKuXgWmOkY/hAE0H/k2MIqH0RlRye0i1oC07MCRSD28Mw==",
3292
+			"peer": true
3226 3293
 		},
3227 3294
 		"node_modules/is-map": {
3228 3295
 			"version": "2.0.3",
@@ -3521,6 +3588,7 @@
3521 3588
 			"resolved": "https://registry.npmmirror.com/less/-/less-4.2.0.tgz",
3522 3589
 			"integrity": "sha512-P3b3HJDBtSzsXUl0im2L7gTO5Ubg8mEN6G8qoTS77iXxXX4Hvu4Qj540PZDvQ8V6DmX6iXo98k7Md0Cm1PrLaA==",
3523 3590
 			"devOptional": true,
3591
+			"peer": true,
3524 3592
 			"dependencies": {
3525 3593
 				"copy-anything": "^2.0.1",
3526 3594
 				"parse-node-version": "^1.0.1",
@@ -3586,12 +3654,14 @@
3586 3654
 		"node_modules/lodash": {
3587 3655
 			"version": "4.17.21",
3588 3656
 			"resolved": "https://registry.npmmirror.com/lodash/-/lodash-4.17.21.tgz",
3589
-			"integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="
3657
+			"integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==",
3658
+			"peer": true
3590 3659
 		},
3591 3660
 		"node_modules/lodash-es": {
3592 3661
 			"version": "4.17.21",
3593 3662
 			"resolved": "https://registry.npmmirror.com/lodash-es/-/lodash-es-4.17.21.tgz",
3594
-			"integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw=="
3663
+			"integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==",
3664
+			"peer": true
3595 3665
 		},
3596 3666
 		"node_modules/lodash-unified": {
3597 3667
 			"version": "1.0.3",
@@ -3606,37 +3676,44 @@
3606 3676
 		"node_modules/lodash.camelcase": {
3607 3677
 			"version": "4.3.0",
3608 3678
 			"resolved": "https://registry.npmmirror.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz",
3609
-			"integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA=="
3679
+			"integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==",
3680
+			"peer": true
3610 3681
 		},
3611 3682
 		"node_modules/lodash.clonedeep": {
3612 3683
 			"version": "4.5.0",
3613 3684
 			"resolved": "https://registry.npmmirror.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz",
3614
-			"integrity": "sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ=="
3685
+			"integrity": "sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==",
3686
+			"peer": true
3615 3687
 		},
3616 3688
 		"node_modules/lodash.debounce": {
3617 3689
 			"version": "4.0.8",
3618 3690
 			"resolved": "https://registry.npmmirror.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz",
3619
-			"integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow=="
3691
+			"integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==",
3692
+			"peer": true
3620 3693
 		},
3621 3694
 		"node_modules/lodash.foreach": {
3622 3695
 			"version": "4.5.0",
3623 3696
 			"resolved": "https://registry.npmmirror.com/lodash.foreach/-/lodash.foreach-4.5.0.tgz",
3624
-			"integrity": "sha512-aEXTF4d+m05rVOAUG3z4vZZ4xVexLKZGF0lIxuHZ1Hplpk/3B6Z1+/ICICYRLm7c41Z2xiejbkCkJoTlypoXhQ=="
3697
+			"integrity": "sha512-aEXTF4d+m05rVOAUG3z4vZZ4xVexLKZGF0lIxuHZ1Hplpk/3B6Z1+/ICICYRLm7c41Z2xiejbkCkJoTlypoXhQ==",
3698
+			"peer": true
3625 3699
 		},
3626 3700
 		"node_modules/lodash.isequal": {
3627 3701
 			"version": "4.5.0",
3628 3702
 			"resolved": "https://registry.npmmirror.com/lodash.isequal/-/lodash.isequal-4.5.0.tgz",
3629
-			"integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ=="
3703
+			"integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==",
3704
+			"peer": true
3630 3705
 		},
3631 3706
 		"node_modules/lodash.throttle": {
3632 3707
 			"version": "4.1.1",
3633 3708
 			"resolved": "https://registry.npmmirror.com/lodash.throttle/-/lodash.throttle-4.1.1.tgz",
3634
-			"integrity": "sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ=="
3709
+			"integrity": "sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ==",
3710
+			"peer": true
3635 3711
 		},
3636 3712
 		"node_modules/lodash.toarray": {
3637 3713
 			"version": "4.4.0",
3638 3714
 			"resolved": "https://registry.npmmirror.com/lodash.toarray/-/lodash.toarray-4.4.0.tgz",
3639
-			"integrity": "sha512-QyffEA3i5dma5q2490+SgCvDN0pXLmRGSyAANuVi0HQ01Pkfr9fuoKQW8wm1wGBnJITs/mS7wQvS6VshUEBFCw=="
3715
+			"integrity": "sha512-QyffEA3i5dma5q2490+SgCvDN0pXLmRGSyAANuVi0HQ01Pkfr9fuoKQW8wm1wGBnJITs/mS7wQvS6VshUEBFCw==",
3716
+			"peer": true
3640 3717
 		},
3641 3718
 		"node_modules/magic-string": {
3642 3719
 			"version": "0.30.5",
@@ -3869,6 +3946,7 @@
3869 3946
 					"url": "https://github.com/sponsors/ai"
3870 3947
 				}
3871 3948
 			],
3949
+			"peer": true,
3872 3950
 			"bin": {
3873 3951
 				"nanoid": "bin/nanoid.cjs"
3874 3952
 			},
@@ -4364,6 +4442,7 @@
4364 4442
 					"url": "https://github.com/sponsors/ai"
4365 4443
 				}
4366 4444
 			],
4445
+			"peer": true,
4367 4446
 			"dependencies": {
4368 4447
 				"nanoid": "^3.3.7",
4369 4448
 				"picocolors": "^1.0.0",
@@ -4742,6 +4821,7 @@
4742 4821
 			"version": "4.9.5",
4743 4822
 			"resolved": "https://registry.npmmirror.com/rollup/-/rollup-4.9.5.tgz",
4744 4823
 			"integrity": "sha512-E4vQW0H/mbNMw2yLSqJyjtkHY9dslf/p0zuT1xehNRqUTBOFMqEjguDvqhXr7N7r/4ttb2jr4T41d3dncmIgbQ==",
4824
+			"peer": true,
4745 4825
 			"dependencies": {
4746 4826
 				"@types/estree": "1.0.5"
4747 4827
 			},
@@ -4873,6 +4953,7 @@
4873 4953
 			"resolved": "https://registry.npmmirror.com/sass/-/sass-1.77.8.tgz",
4874 4954
 			"integrity": "sha512-4UHg6prsrycW20fqLGPShtEvo/WyHRVRHwOP4DzkUrObWoWI05QBSfzU71TVB7PFaL104TwNaHpjlWXAZbQiNQ==",
4875 4955
 			"devOptional": true,
4956
+			"peer": true,
4876 4957
 			"dependencies": {
4877 4958
 				"chokidar": ">=3.0.0 <4.0.0",
4878 4959
 				"immutable": "^4.0.0",
@@ -5003,6 +5084,7 @@
5003 5084
 			"version": "0.72.8",
5004 5085
 			"resolved": "https://registry.npmmirror.com/slate/-/slate-0.72.8.tgz",
5005 5086
 			"integrity": "sha512-/nJwTswQgnRurpK+bGJFH1oM7naD5qDmHd89JyiKNT2oOKD8marW0QSBtuFnwEbL5aGCS8AmrhXQgNOsn4osAw==",
5087
+			"peer": true,
5006 5088
 			"dependencies": {
5007 5089
 				"immer": "^9.0.6",
5008 5090
 				"is-plain-object": "^5.0.0",
@@ -5024,6 +5106,7 @@
5024 5106
 			"version": "3.6.2",
5025 5107
 			"resolved": "https://registry.npmmirror.com/snabbdom/-/snabbdom-3.6.2.tgz",
5026 5108
 			"integrity": "sha512-ig5qOnCDbugFntKi6c7Xlib8bA6xiJVk8O+WdFrV3wxbMqeHO0hXFQC4nAhPVWfZfi8255lcZkNhtIBINCc4+Q==",
5109
+			"peer": true,
5027 5110
 			"engines": {
5028 5111
 				"node": ">=12.17.0"
5029 5112
 			}
@@ -6114,6 +6197,7 @@
6114 6197
 			"version": "5.0.11",
6115 6198
 			"resolved": "https://registry.npmmirror.com/vite/-/vite-5.0.11.tgz",
6116 6199
 			"integrity": "sha512-XBMnDjZcNAw/G1gEiskiM1v6yzM4GE5aMGvhWTlHAYYhxb7S3/V1s3m2LDHa8Vh6yIWYYB0iJwsEaS523c4oYA==",
6200
+			"peer": true,
6117 6201
 			"dependencies": {
6118 6202
 				"esbuild": "^0.19.3",
6119 6203
 				"postcss": "^8.4.32",
@@ -6193,6 +6277,7 @@
6193 6277
 			"version": "3.4.13",
6194 6278
 			"resolved": "https://registry.npmmirror.com/vue/-/vue-3.4.13.tgz",
6195 6279
 			"integrity": "sha512-FE3UZ0p+oUZTwz+SzlH/hDFg+XsVRFvwmx0LXjdD1pRK/cO4fu5v6ltAZji4za4IBih3dV78elUK3di8v3pWIg==",
6280
+			"peer": true,
6196 6281
 			"dependencies": {
6197 6282
 				"@vue/compiler-dom": "3.4.13",
6198 6283
 				"@vue/compiler-sfc": "3.4.13",

+ 1
- 0
package.json Vedi File

@@ -32,6 +32,7 @@
32 32
 		"dayjs": "^1.11.10",
33 33
 		"echarts": "^5.5.1",
34 34
 		"element-plus": "^2.5.1",
35
+		"grid-layout-plus": "^1.1.1",
35 36
 		"js-base64": "^3.7.7",
36 37
 		"js-sha256": "^0.11.0",
37 38
 		"jsencrypt": "^3.3.2",

+ 4
- 1
src/main.js Vedi File

@@ -7,6 +7,8 @@ import {
7 7
 import piniaPluginPersistedstate from 'pinia-plugin-persistedstate'
8 8
 
9 9
 //引入element-plus库
10
+// 引入Grid Layout Plus库
11
+import { GridLayout, GridItem } from 'grid-layout-plus'
10 12
 
11 13
 import ElementPlus from 'element-plus'  
12 14
 import zhCn from 'element-plus/dist/locale/zh-cn.mjs'
@@ -47,7 +49,8 @@ const pinia = createPinia()
47 49
 pinia.use(piniaPluginPersistedstate)
48 50
 const app = createApp(App)
49 51
 
50
- 
52
+
53
+app.component('GridLayout', GridLayout).component('GridItem', GridItem)
51 54
 
52 55
 app.use(pinia) 
53 56
 app.use(routers) 

+ 3
- 3
src/views/sto/record/inRecord.vue Vedi File

@@ -171,11 +171,11 @@
171 171
             {{ formatDateTime(row.inDtm) ?? '-' }}
172 172
           </template>
173 173
         </el-table-column>
174
-        <el-table-column prop="ownerCompany" label="货权公司" min-width="160" header-align="center" align="center" show-overflow-tooltip />
175
-        <el-table-column prop="receivingCompany" label="收货公司" min-width="160" header-align="center" align="center" show-overflow-tooltip />
174
+        <el-table-column prop="ownerCompanyName" label="货权公司" min-width="160" header-align="center" align="center" show-overflow-tooltip />
175
+        <el-table-column prop="receivingCompanyName" label="收货公司" min-width="160" header-align="center" align="center" show-overflow-tooltip />
176 176
         <el-table-column label="最终客户公司" min-width="180" header-align="center" align="center" show-overflow-tooltip>
177 177
           <template #default="{ row }">
178
-            {{ row.customerCompany ?? row.CustomerCompany ?? '-' }}
178
+            {{ row.customerCompanyName ?? row.CustomerCompanyName ?? '-' }}
179 179
           </template>
180 180
         </el-table-column>
181 181
         <el-table-column prop="prodNo" label="材料号" min-width="140" header-align="center" align="center" show-overflow-tooltip />

+ 64
- 4
src/views/sto/ware/InStore.vue Vedi File

@@ -109,7 +109,9 @@
109 109
         :data="tableData"
110 110
         border
111 111
         highlight-current-row
112
+        @selection-change="handleSelectionChange"
112 113
     >
114
+      <el-table-column type="selection" :selectable="selectable" width="55" />
113 115
       <el-table-column type="index" label="序号" align="center" width="60">
114 116
         <template #default="scope">
115 117
           <span>{{ scope.$index + 1}}</span>
@@ -156,11 +158,11 @@
156 158
           {{ formatDateTime(row.inDtm) ?? '-' }}
157 159
         </template>
158 160
       </el-table-column>
159
-      <el-table-column prop="ownerCompany" label="货权公司" min-width="160" header-align="center" align="center" show-overflow-tooltip />
160
-      <el-table-column prop="receivingCompany" label="收货公司" min-width="160" header-align="center" align="center" show-overflow-tooltip />
161
+      <el-table-column prop="ownerCompanyName" label="货权公司" min-width="160" header-align="center" align="center" show-overflow-tooltip />
162
+      <el-table-column prop="receivingCompanyName" label="收货公司" min-width="160" header-align="center" align="center" show-overflow-tooltip />
161 163
       <el-table-column label="最终客户公司" min-width="180" header-align="center" align="center" show-overflow-tooltip>
162 164
         <template #default="{ row }">
163
-          {{ row.customerCompany ?? row.CustomerCompany ?? '-' }}
165
+          {{ row.customerCompanyName ?? row.customerCompanyName ?? '-' }}
164 166
         </template>
165 167
       </el-table-column>
166 168
       <el-table-column prop="prodNo" label="材料号" min-width="140" header-align="center" align="center" show-overflow-tooltip />
@@ -534,7 +536,7 @@
534 536
 <script setup>
535 537
 import {getCurrentInstance, onMounted, reactive, ref} from 'vue'
536 538
 import tools from '@/tools'
537
-import {ElMessage, ElUpload} from 'element-plus';
539
+import {ElMessage, ElMessageBox, ElUpload} from 'element-plus';
538 540
 import axios from "axios";
539 541
 
540 542
 const {proxy} = getCurrentInstance()
@@ -913,6 +915,7 @@ const batchInStore = () => {
913 915
       handleClose()
914 916
     } else {
915 917
       ElMessage.error('入库失败!' + response.data.msg)
918
+      fileUpload.value = []
916 919
       loading.value = false
917 920
     }
918 921
   })
@@ -1061,10 +1064,67 @@ const handleClose = ()=>{
1061 1064
   fileUpload.value = []
1062 1065
   progress.value = 0
1063 1066
   prog.value = false
1067
+  singLoading.value = false
1068
+  getTableData()
1069
+  getStatistics()
1064 1070
 }
1065 1071
 // ========================================取消入库=====================================
1066 1072
 const cancelInStore = () => {
1073
+  if(multipleSelection.value.length>1){
1074
+    ElMessage.warning('一次只能取消一个入库单')
1075
+    return;
1076
+  }
1077
+  if(multipleSelection.value.length==0){
1078
+    return ElMessage.warning("请选择一个入库记录")
1079
+  }
1080
+  ElMessageBox.confirm(
1081
+      '确认取消入库吗?',
1082
+      '提示',
1083
+      {
1084
+        confirmButtonText: '确认',
1085
+        cancelButtonText: '取消',
1086
+        type: 'warning'
1087
+      }
1088
+  ).then(() => {
1089
+        const params = {
1090
+          id: multipleSelection.value[0].id,
1091
+          prodId:multipleSelection.value[0].prodId
1092
+        };
1093
+
1094
+        handleCancelInStore(params)
1095
+  })
1096
+      .catch(() => {
1097
+
1098
+      })
1099
+}
1100
+const handleCancelInStore = (params) => {
1101
+  proxy.$axios.post('/sto/InRecord/cancelInStore',
1102
+      { params: JSON.stringify(params) }
1103
+  ).then((response) => {
1104
+    console.log('完整响应对象:', response);
1105
+    console.log('响应数据:', response.data);
1067 1106
 
1107
+    // 首先检查 response 是否存在以及是否包含 data 属性
1108
+    if (!response || !response.data) {
1109
+      ElMessage.error('服务器未返回有效数据');
1110
+      return;
1111
+    }
1112
+    if (response.data.code == '0') {
1113
+      ElMessage.success('取消入库成功');
1114
+      getTableData();
1115
+      getStatistics()
1116
+    } else {
1117
+      ElMessage.error(response.data.msg || response.data.message || '操作失败');
1118
+    }
1119
+  }).catch((error) => {
1120
+    console.error('取消入库失败:', error);
1121
+    ElMessage.error('请求失败,请重试');
1122
+  });
1123
+}
1124
+// ========================================列表多选框===================================
1125
+let multipleSelection = ref([])
1126
+const handleSelectionChange = (val) => {
1127
+  multipleSelection.value = val
1068 1128
 }
1069 1129
 // ========================================生命周期=====================================
1070 1130
 onMounted(() => {

+ 215
- 83
src/views/sto/ware/storeChange.vue Vedi File

@@ -1,8 +1,8 @@
1 1
 <template>
2 2
   <div>
3 3
     <el-card :body-style="cardBodyStyle">
4
-      <el-form :model="query" label-width="90px" label-position="right">
5
-        <el-row :gutter="10">
4
+      <el-form :model="query" label-width="90" label-position="right">
5
+        <el-row :gutter="24">
6 6
           <el-col :span="6">
7 7
             <el-form-item label="库房名称">
8 8
               <el-select
@@ -39,7 +39,7 @@
39 39
           </el-col>
40 40
         </el-row>
41 41
 
42
-        <el-row :gutter="10">
42
+        <el-row :gutter="24">
43 43
           <el-col :span="6">
44 44
             <el-form-item label="规格型号">
45 45
               <el-input v-model="query.attrib_03" clearable placeholder="请输入规格型号" />
@@ -62,7 +62,7 @@
62 62
           </el-col>
63 63
         </el-row>
64 64
 
65
-        <el-row :gutter="10">
65
+        <el-row :gutter="24">
66 66
           <el-col :span="6">
67 67
             <el-form-item label="合约号">
68 68
               <el-input v-model="query.attrib_02" clearable placeholder="请输入合约号" />
@@ -73,24 +73,21 @@
73 73
               <el-input v-model="query.attrib_04" clearable placeholder="请输入捆绑号" />
74 74
             </el-form-item>
75 75
           </el-col>
76
-        </el-row>
77
-
78
-        <el-row :gutter="10">
79 76
           <el-col :span="6">
80 77
             <el-form-item label="货权单位">
81 78
               <el-select
82
-                v-model="query.ownerCompany"
83
-                clearable
84
-                filterable
85
-                placeholder="请选择货权单位"
86
-                style="width: 100%;"
87
-                @visible-change="handleOwnerVisible"
79
+                  v-model="query.ownerCompany"
80
+                  clearable
81
+                  filterable
82
+                  placeholder="请选择货权单位"
83
+                  style="width: 100%;"
84
+                  @visible-change="handleOwnerVisible"
88 85
               >
89 86
                 <el-option
90
-                  v-for="item in ownerCompanyOptions"
91
-                  :key="item.value"
92
-                  :label="item.label"
93
-                  :value="item.value"
87
+                    v-for="item in ownerCompanyOptions"
88
+                    :key="item.value"
89
+                    :label="item.label"
90
+                    :value="item.value"
94 91
                 />
95 92
               </el-select>
96 93
             </el-form-item>
@@ -98,30 +95,34 @@
98 95
           <el-col :span="6">
99 96
             <el-form-item label="客户名称">
100 97
               <el-select
101
-                v-model="query.customerCompany"
102
-                clearable
103
-                filterable
104
-                placeholder="请选择客户名称"
105
-                style="width: 100%;"
106
-                @visible-change="handleCustomerVisible"
98
+                  v-model="query.customerCompany"
99
+                  clearable
100
+                  filterable
101
+                  placeholder="请选择客户名称"
102
+                  style="width: 100%;"
103
+                  @visible-change="handleCustomerVisible"
107 104
               >
108 105
                 <el-option
109
-                  v-for="item in customerCompanyOptions"
110
-                  :key="item.value"
111
-                  :label="item.label"
112
-                  :value="item.value"
106
+                    v-for="item in customerCompanyOptions"
107
+                    :key="item.value"
108
+                    :label="item.label"
109
+                    :value="item.value"
113 110
                 />
114 111
               </el-select>
115 112
             </el-form-item>
116 113
           </el-col>
117
-<!--          <el-col :span="6">-->
118
-<!--            <el-form-item label="出库车号">-->
119
-<!--              <el-input v-model="query.outTruckNo" clearable placeholder="请输入出库车号" />-->
120
-<!--            </el-form-item>-->
121
-<!--          </el-col>-->
122 114
         </el-row>
123 115
 
124
-        <el-row :gutter="10">
116
+<!--        <el-row :gutter="10">-->
117
+
118
+<!--&lt;!&ndash;          <el-col :span="6">&ndash;&gt;-->
119
+<!--&lt;!&ndash;            <el-form-item label="出库车号">&ndash;&gt;-->
120
+<!--&lt;!&ndash;              <el-input v-model="query.outTruckNo" clearable placeholder="请输入出库车号" />&ndash;&gt;-->
121
+<!--&lt;!&ndash;            </el-form-item>&ndash;&gt;-->
122
+<!--&lt;!&ndash;          </el-col>&ndash;&gt;-->
123
+<!--        </el-row>-->
124
+
125
+        <el-row :gutter="24">
125 126
           <el-col :span="8">
126 127
             <el-form-item label="入库时间">
127 128
               <el-date-picker
@@ -135,46 +136,46 @@
135 136
               />
136 137
             </el-form-item>
137 138
           </el-col>
138
-          <el-col :span="16">
139
-            <el-form-item label=" ">
140
-              <el-button type="primary" @click="handleSearch">查询</el-button>
141
-              <el-button @click="handleReset">重置</el-button>
142
-              <el-button type="primary" @click="handleTransferOwnership">货权转移</el-button>
143
-              <el-button type="primary" @click="handleAllocate">配货</el-button>
144
-              <el-button type="primary" @click="handleOutStock">出库</el-button>
145
-              <el-button @click="handleExport">导出记录</el-button>
146
-
147
-              <el-dropdown @command="handleOtherCommand">
148
-                <el-button>
149
-                  其他操作
150
-                  <i class="el-icon-arrow-down el-icon--right" />
151
-                </el-button>
152
-                <template #dropdown>
153
-                  <el-dropdown-menu>
154
-                    <el-dropdown-item command="cancelIn">取消入库</el-dropdown-item>
155
-                    <el-dropdown-item command="batchEdit">批量修改</el-dropdown-item>
156
-                    <el-dropdown-item command="batchMove">批量倒垛</el-dropdown-item>
157
-                  </el-dropdown-menu>
158
-                </template>
159
-              </el-dropdown>
160
-
161
-              <el-dropdown @command="handleLockCommand">
162
-                <el-button type="danger">
163
-                  封锁出仓
164
-                  <i class="el-icon-arrow-down el-icon--right" />
165
-                </el-button>
166
-                <template #dropdown>
167
-                  <el-dropdown-menu>
168
-                    <el-dropdown-item command="lock">封锁</el-dropdown-item>
169
-                    <el-dropdown-item command="unlock">取消封锁</el-dropdown-item>
170
-                    <el-dropdown-item command="inStock">入仓</el-dropdown-item>
171
-                  </el-dropdown-menu>
172
-                </template>
173
-              </el-dropdown>
174
-            </el-form-item>
175
-          </el-col>
176 139
         </el-row>
177 140
       </el-form>
141
+      <el-row :gutter="24">
142
+        <el-col >
143
+            <el-button type="primary" @click="handleSearch">查询</el-button>
144
+            <el-button @click="handleReset">重置</el-button>
145
+            <el-button type="primary" @click="handleTransferOwnership">货权转移</el-button>
146
+            <el-button type="primary" @click="handleAllocate">配货</el-button>
147
+            <el-button type="primary" @click="handleOutStock">出库</el-button>
148
+            <el-button type="success" @click="handleExport">导出</el-button>
149
+
150
+            <el-dropdown style="margin-left: 1%" @command="handleOtherCommand">
151
+              <el-button>
152
+                其他操作
153
+                <i class="el-icon-arrow-down el-icon--right" />
154
+              </el-button>
155
+              <template #dropdown>
156
+                <el-dropdown-menu>
157
+                  <el-dropdown-item command="cancelIn">取消入库</el-dropdown-item>
158
+                  <!--                    <el-dropdown-item command="batchEdit">批量修改</el-dropdown-item>-->
159
+                  <el-dropdown-item command="batchMove">批量倒垛</el-dropdown-item>
160
+                </el-dropdown-menu>
161
+              </template>
162
+            </el-dropdown>
163
+
164
+            <el-dropdown style="margin-left: 1%" @command="handleLockCommand">
165
+              <el-button type="danger">
166
+                封锁出仓
167
+                <i class="el-icon-arrow-down el-icon--right" />
168
+              </el-button>
169
+              <template #dropdown>
170
+                <el-dropdown-menu>
171
+                  <el-dropdown-item command="lock">封锁</el-dropdown-item>
172
+                  <el-dropdown-item command="unlock">取消封锁</el-dropdown-item>
173
+                  <el-dropdown-item command="inStock">入仓</el-dropdown-item>
174
+                </el-dropdown-menu>
175
+              </template>
176
+            </el-dropdown>
177
+        </el-col>
178
+      </el-row>
178 179
     </el-card>
179 180
 
180 181
     <el-card :body-style="cardBodyStyle" class="summary-card">
@@ -249,7 +250,7 @@
249 250
         </el-table-column>
250 251
         <el-table-column label="规格型号" min-width="160" header-align="center" align="center" show-overflow-tooltip>
251 252
           <template #default="{ row }">
252
-            {{ row.attrib_03 ?? row.materialStandard ?? '-' }}
253
+            {{ row.attrib03 ?? row.materialStandard ?? '-' }}
253 254
           </template>
254 255
         </el-table-column>
255 256
         <el-table-column prop="inDtm" label="入库时间" min-width="180" header-align="center" align="center" show-overflow-tooltip />
@@ -266,10 +267,10 @@
266 267
             {{ row.inTruckNo ?? row.carNo ?? '-' }}
267 268
           </template>
268 269
         </el-table-column>
269
-        <el-table-column prop="attrib_01" label="订单号" min-width="160" header-align="center" align="center" show-overflow-tooltip />
270
-        <el-table-column prop="attrib_02" label="合约号" min-width="160" header-align="center" align="center" show-overflow-tooltip />
271
-        <el-table-column prop="attrib_04" label="捆包号" min-width="160" header-align="center" align="center" show-overflow-tooltip />
272
-        <el-table-column prop="attrib_05" label="产地" min-width="160" header-align="center" align="center" show-overflow-tooltip />
270
+        <el-table-column prop="attrib01" label="订单号" min-width="160" header-align="center" align="center" show-overflow-tooltip />
271
+        <el-table-column prop="attrib02" label="合约号" min-width="160" header-align="center" align="center" show-overflow-tooltip />
272
+        <el-table-column prop="attrib04" label="捆包号" min-width="160" header-align="center" align="center" show-overflow-tooltip />
273
+        <el-table-column prop="attrib05" label="产地" min-width="160" header-align="center" align="center" show-overflow-tooltip />
273 274
         <el-table-column label="重量" min-width="140" header-align="center" align="right" show-overflow-tooltip>
274 275
           <template #default="{ row }">
275 276
             {{ row.weight ?? row.WEIGHT ?? '-' }}
@@ -289,7 +290,7 @@
289 290
 <!--        </el-table-column>-->
290 291
         <el-table-column prop="deliveryAddress" label="收货地址" min-width="200" header-align="center" align="center" show-overflow-tooltip />
291 292
 <!--        <el-table-column prop="outDtm" label="出库时间" min-width="180" header-align="center" align="center" show-overflow-tooltip />-->
292
-        <el-table-column prop="remark_1" label="备注" min-width="160" header-align="center" align="center" show-overflow-tooltip />
293
+        <el-table-column prop="remark1" label="备注" min-width="160" header-align="center" align="center" show-overflow-tooltip />
293 294
       </el-table>
294 295
     </el-card>
295 296
 
@@ -336,6 +337,7 @@ import PopupBatchEdit from '../components/PopupBatchEdit.vue'
336 337
 import PopupBatchMove from '../components/PopupBatchMove.vue'
337 338
 import PopupTransferOwnership from '../components/PopupTransferOwnership.vue'
338 339
 import PopupEdit from '../components/PopupEdit.vue'
340
+import axios from "axios";
339 341
 
340 342
 const {proxy} = getCurrentInstance()
341 343
 
@@ -482,13 +484,13 @@ const getStatistics = () => {
482 484
       if (response.data.code === '0' || response.data.code === 0) {
483 485
         const data = response.data.data || {}
484 486
         statistics.totalQuantity =
485
-          data.totalQuantity ??
487
+          data.TOTALQUANTITY ??
486 488
           data.outQuantity ??
487 489
           data.OUT_QUANTITY ??
488 490
           data.totalQty ??
489 491
           0
490 492
         statistics.totalWeight =
491
-          data.totalWeight ??
493
+          data.TOTALWEIGHT ??
492 494
           data.outWeight ??
493 495
           data.OUT_WEIGHT ??
494 496
           data.totalWgt ??
@@ -573,9 +575,108 @@ const handleOutStockSuccess = () => {
573 575
 }
574 576
 
575 577
 const handleExport = () => {
576
-  // TODO 导出记录逻辑
577
-  console.log('导出记录', buildQueryParams())
578
+  if (multipleSelection.value.length === 0) {
579
+    ElMessage.warning('请选择要导出的数据');
580
+    return;
581
+  }
582
+  const exportData = mapTableData(multipleSelection.value)
583
+  axios({
584
+    method: 'POST',
585
+    url: '/sto/InRecord/exportInRecode',
586
+    data: exportData,  // 使用转换后的数据
587
+    responseType: 'blob',
588
+    headers: {
589
+      'Content-Type': 'application/json'
590
+    }
591
+  }).then((response) => {
592
+    // 创建下载链接
593
+    const url = window.URL.createObjectURL(new Blob([response.data]));
594
+    const link = document.createElement('a');
595
+    link.href = url;
596
+    link.setAttribute('download', `入库记录_${new Date().getTime()}.xlsx`);
597
+    document.body.appendChild(link);
598
+    link.click();
599
+    link.remove();
600
+    window.URL.revokeObjectURL(url);
601
+
602
+    ElMessage.success('导出成功');
603
+  }).catch((error) => {
604
+    console.error('导出失败:', error);
605
+    ElMessage.error('导出失败,请重试');
606
+  });
578 607
 }
608
+const mapTableData = (backendData) => {
609
+  if (!backendData || !Array.isArray(backendData)) {
610
+    return [];
611
+  }
612
+
613
+  return backendData.map(item => {
614
+    return {
615
+      // 表格选择框需要的字段
616
+      id: item.id,
617
+      wareId: item.wareId,
618
+      stackId: item.stackId,
619
+      storeId: item.storeId,
620
+
621
+      // 仓库信息(前端使用 outWareName/wareName 逻辑)
622
+      wareName: item.wareName,
623
+      outWareName: item.outWareName || item.wareName,
624
+
625
+      // 垛位信息(前端使用 outStackName/stackName 逻辑)
626
+      stackName: item.stackName,
627
+      outStackName: item.outStackName || item.stackName,
628
+
629
+      // 层号(前端使用 outLayerNo/layerNo 逻辑)
630
+      layerNo: item.layerNo,
631
+      outLayerNo: item.outLayerNo || item.layerNo,
632
+
633
+      // 物料信息
634
+      materialName: item.materialName,
635
+
636
+      // 钢种(统一使用 stGrade)
637
+      stGrade: item.stGrade,
638
+      ST_GRADE: item.stGrade, // 兼容原有大写字段
639
+
640
+      // 规格型号(将 attrib03 映射到 materialStandard)
641
+      attrib03: item.attrib_03, // 注意:后端返回的是 attrib_03
642
+      materialStandard: item.attrib_03, // 前端表格需要的字段
643
+
644
+      // 入库时间
645
+      inDtm: item.inDtm,
646
+
647
+      // 公司信息
648
+      ownerCompany: item.ownerCompany,
649
+      receivingCompany: item.receivingCompany,
650
+      customerCompany: item.customerCompany,
651
+      CustomerCompany: item.customerCompany, // 兼容大写
652
+
653
+      // 编号信息
654
+      prodNo: item.prodNo,
655
+      inTruckNo: item.inTruckNo,
656
+      carNo: item.inTruckNo, // 兼容 carNo 字段
657
+
658
+      // 属性字段(后端返回的是 attrib_01, attrib_02 等)
659
+      attrib01: item.attrib01,
660
+      attrib02: item.attrib02,
661
+      attrib04: item.attrib04,
662
+      attrib05: item.attrib05,
663
+
664
+      // 重量和数量
665
+      weight: item.weight,
666
+      WEIGHT: item.weight, // 兼容大写
667
+      quantity: item.quantity,
668
+      QUANTITY: item.quantity, // 兼容大写
669
+
670
+      // 其他字段
671
+      outFlag: item.outFlag,
672
+      deliveryAddress: item.deliveryAddress,
673
+      remark1: item.remark1,
674
+
675
+      // 如果需要保留原始数据
676
+      _rawData: item
677
+    };
678
+  });
679
+};
579 680
 
580 681
 const handleOtherCommand = (command) => {
581 682
   // 其他操作下拉:取消入库、批量修改、批量倒垛
@@ -600,6 +701,10 @@ const handleCancelInbound = () => {
600 701
     ElMessage.warning('请先选择要取消入库的数据')
601 702
     return
602 703
   }
704
+  if(multipleSelection.value.length>1){
705
+    ElMessage.warning('一次只能取消一个入库单')
706
+    return;
707
+  }
603 708
   
604 709
   ElMessageBox.confirm(
605 710
     '确认取消入库吗?',
@@ -610,13 +715,40 @@ const handleCancelInbound = () => {
610 715
       type: 'warning'
611 716
     }
612 717
   ).then(() => {
613
-    // 确认后执行取消入库
614
-    executeCancelInbound()
718
+    const params = {
719
+      id: multipleSelection.value[0].id,
720
+      prodId:multipleSelection.value[0].storeId
721
+    };
722
+    handleCancelInStore(params)
615 723
   }).catch(() => {
616 724
     // 取消操作
617 725
     ElMessage.info('已取消操作')
618 726
   })
619 727
 }
728
+const handleCancelInStore = (params) => {
729
+  proxy.$axios.post('/sto/InRecord/cancelInStore',
730
+      { params: JSON.stringify(params) }
731
+  ).then((response) => {
732
+    console.log('完整响应对象:', response);
733
+    console.log('响应数据:', response.data);
734
+
735
+    // 首先检查 response 是否存在以及是否包含 data 属性
736
+    if (!response || !response.data) {
737
+      ElMessage.error('服务器未返回有效数据');
738
+      return;
739
+    }
740
+    if (response.data.code == '0') {
741
+      ElMessage.success('取消入库成功');
742
+      getTableData();
743
+      getStatistics()
744
+    } else {
745
+      ElMessage.error(response.data.msg || response.data.message || '操作失败');
746
+    }
747
+  }).catch((error) => {
748
+    console.error('取消入库失败:', error);
749
+    ElMessage.error('请求失败,请重试');
750
+  });
751
+}
620 752
 
621 753
 // 批量修改
622 754
 const handleBatchEdit = () => {

+ 473
- 0
src/views/sto/ware/testStack.vue Vedi File

@@ -0,0 +1,473 @@
1
+<template>
2
+  <el-card>
3
+    <el-form :inline="true">
4
+      <el-form-item label="库房名称" style="width: 200px">
5
+        <el-select
6
+            v-model="query.wareId"
7
+            clearable
8
+            filterable
9
+            placeholder="请选择库房"
10
+            @visible-change="handleWareVisible"
11
+            @change="getAreaData"
12
+        >
13
+          <el-option
14
+              v-for="item in wareOptions"
15
+              :key="item.value"
16
+              :label="item.label"
17
+              :value="item.value"
18
+          />
19
+        </el-select>
20
+      </el-form-item>
21
+      <el-form-item label="垛位分区" style="width: 200px">
22
+        <el-select  placeholder="请选择区域" v-model="query.areaId">
23
+                    <el-option
24
+                        v-for="item in areaList"
25
+                        :key="item.id"
26
+                        :label="item.areaName"
27
+                        :value="item.id"
28
+                    />
29
+        </el-select>
30
+      </el-form-item>
31
+      <el-form-item>
32
+        <el-button type="primary" @click="getLayoutData">查询</el-button>
33
+        <el-button type="info" @click="reset">重置</el-button>
34
+<!--        <el-button type="success" @click="insertPartition">新增分区</el-button>-->
35
+      </el-form-item>
36
+    </el-form>
37
+  </el-card>
38
+  <el-card>
39
+    <div style="display: flex;justify-content: space-between">
40
+      <div class="switchB">
41
+        <el-button @click="openBatchAddDialog" type="success">新增区块</el-button>
42
+        <el-switch v-model="draggable" active-text="可拖动" inactive-text="" />
43
+        <el-switch v-model="resizable" active-text="可调整大小" inactive-text="" />
44
+      </div>
45
+      <div>
46
+        <el-button type="warning" @click="saveOrUpload">保存</el-button>
47
+      </div>
48
+    </div>
49
+<!--    {{layout}}-->
50
+    <GridLayout
51
+        v-model:layout="layout"
52
+        :col-num="colNum"
53
+        :row-height="30"
54
+        :is-draggable="draggable"
55
+        :is-resizable="resizable"
56
+    >
57
+      <template #item="{ item }">
58
+        <div class="item-container" @dblclick="startEditing(item)">
59
+        <span
60
+            v-if="!item.isEditing"
61
+            class="text"
62
+        >
63
+          {{ item.name || item.i }}
64
+        </span>
65
+          <el-input
66
+              v-else
67
+              v-model="item.tempName"
68
+              class="edit-input"
69
+              size="small"
70
+              @blur="finishEditing(item)"
71
+              @keyup.enter="finishEditing(item)"
72
+              @click.stop
73
+          />
74
+        </div>
75
+        <span
76
+            class="remove"
77
+            @click.stop="removeItem(item.i)"
78
+        >
79
+        x
80
+      </span>
81
+      </template>
82
+    </GridLayout>
83
+  </el-card>
84
+  <el-dialog
85
+      v-model="batchAddDialogVisible"
86
+      title="批量新增垛位"
87
+      width="500px"
88
+  >
89
+    <el-form :model="batchAddForm" label-width="100px">
90
+      <el-form-item label="新增数量">
91
+        <el-input-number
92
+            v-model="batchAddForm.count"
93
+            :min="1"
94
+            :max="100"
95
+            controls-position="right"
96
+        />
97
+      </el-form-item>
98
+      <el-form-item label="起始编号">
99
+        <el-input-number
100
+            v-model="batchAddForm.startFrom"
101
+            :min="0"
102
+            controls-position="right"
103
+        />
104
+      </el-form-item>
105
+      <el-form-item label="前缀">
106
+        <el-input
107
+            v-model="batchAddForm.prefix"
108
+            placeholder="请输入垛位前缀"
109
+        />
110
+      </el-form-item>
111
+    </el-form>
112
+    <template #footer>
113
+      <span class="dialog-footer">
114
+        <el-button @click="batchAddDialogVisible = false">取消</el-button>
115
+        <el-button type="primary" @click="batchAddItems">确定</el-button>
116
+      </span>
117
+    </template>
118
+  </el-dialog>
119
+
120
+<!--  新增分区弹窗-->
121
+<!--  <el-dialog-->
122
+<!--      class="diaClass"-->
123
+<!--      :close-on-click-modal="false"-->
124
+<!--      draggable-->
125
+<!--      title="新增"-->
126
+<!--      v-model="partition"-->
127
+<!--      width="40%"-->
128
+<!--      top="5vh"-->
129
+<!--  >-->
130
+<!--      <el-form :model="partitionForm" label-width="120px" label-position="right" inline ref="ruleFormRef" :rules="partitionRules">-->
131
+<!--        <el-row>-->
132
+<!--          <el-col :span="12">-->
133
+<!--            <el-form-item label="所属库房" prop="wareId">-->
134
+<!--              <el-select v-model="partitionForm.wareId" placeholder="请选择库房" style="width: 100%;">-->
135
+<!--                <el-option-->
136
+<!--                    v-for="item in wareOptions"-->
137
+<!--                    :key="item.value"-->
138
+<!--                    :label="item.label"-->
139
+<!--                    :value="item.value"-->
140
+<!--                />-->
141
+<!--              </el-select>-->
142
+<!--            </el-form-item>-->
143
+<!--          </el-col>-->
144
+<!--          <el-col :span="12">-->
145
+<!--            <el-form-item label="分区名称" prop="areaName">-->
146
+<!--              <el-input v-model="partitionForm.areaName" maxlength="100" placeholder="请输入分区名称"></el-input>-->
147
+<!--            </el-form-item>-->
148
+<!--          </el-col>-->
149
+<!--          <el-col :span="12">-->
150
+<!--            <el-form-item label="分区编码" prop="areaCode">-->
151
+<!--              <el-input v-model="partitionForm.areaCode" maxlength="50" placeholder="请输入分区编码"></el-input>-->
152
+<!--            </el-form-item>-->
153
+<!--          </el-col>-->
154
+<!--        </el-row>-->
155
+<!--      </el-form>-->
156
+<!--    <template #footer>-->
157
+<!--      <div class="dialog-footer">-->
158
+<!--        <el-button type="success" plain @click="handleInsert(ruleFormRef)">保存</el-button>-->
159
+<!--        <el-button type="danger" plain @click="handleCancelSave">取消</el-button>-->
160
+<!--      </div>-->
161
+<!--    </template>-->
162
+<!--  </el-dialog>-->
163
+
164
+</template>
165
+
166
+<script setup lang="ts">
167
+import {getCurrentInstance, reactive, ref} from 'vue'
168
+import {ElMessage} from "element-plus";
169
+import axios from "axios";
170
+
171
+const {proxy} = getCurrentInstance()
172
+// ==========================================垛位操控======================================
173
+let index = 0
174
+
175
+const draggable = ref(true)
176
+const resizable = ref(true)
177
+const colNum = ref(12)
178
+
179
+let layout = ref([
180
+])
181
+
182
+// 在 script setup 中添加批量新增相关变量
183
+const batchAddDialogVisible = ref(false)
184
+const batchAddForm = reactive({
185
+  count: 1,
186
+  startFrom: 0,
187
+  prefix: '垛位'
188
+})
189
+
190
+// 批量新增方法
191
+function batchAddItems() {
192
+  if(query.value.wareId==''||query.value.areaId==''){
193
+    return ElMessage.error('请选择库房和分区!')
194
+  }
195
+
196
+  if(batchAddForm.count <= 0) {
197
+    return ElMessage.error('新增数量必须大于0')
198
+  }
199
+
200
+  for(let i = 0; i < batchAddForm.count; i++) {
201
+    const newIndex = batchAddForm.startFrom + i
202
+    layout.value.push({
203
+      x: (newIndex * 2) % (colNum.value || 12),
204
+      y: newIndex + (colNum.value || 12),
205
+      w: 2,
206
+      h: 2,
207
+      i: `${batchAddForm.prefix}${newIndex}`,
208
+      name: `${batchAddForm.prefix}${newIndex}`
209
+    })
210
+  }
211
+
212
+  batchAddDialogVisible.value = false
213
+  ElMessage.success(`成功新增 ${batchAddForm.count} 个垛位`)
214
+}
215
+
216
+// 打开批量新增对话框
217
+function openBatchAddDialog() {
218
+  if(query.value.wareId==''||query.value.areaId==''){
219
+    return ElMessage.error('请选择库房和分区!')
220
+  }
221
+  batchAddDialogVisible.value = true
222
+  batchAddForm.count = 1
223
+  batchAddForm.startFrom = layout.value.length
224
+  batchAddForm.prefix = '垛位'
225
+}
226
+
227
+
228
+// function addItem() {
229
+//   if(query.value.wareId==''||query.value.areaId==''){
230
+//     return ElMessage.error('请选择库房和分区!')
231
+//   }
232
+//   layout.value.push({
233
+//     x: (layout.value.length * 2) % (colNum.value || 12),
234
+//     y: layout.value.length + (colNum.value || 12), // puts it at the bottom
235
+//     w: 2,
236
+//     h: 2,
237
+//     i: `${index++}`,
238
+//   })
239
+// }
240
+
241
+function removeItem(id: string) {
242
+  const index = layout.value.findIndex(item => item.i === id)
243
+
244
+  if (index > -1) {
245
+    layout.value.splice(index, 1)
246
+  }
247
+}
248
+// ========================================查询=============================================
249
+let query = ref({
250
+  wareId: '',
251
+  areaId:''
252
+})
253
+const reset = () => {
254
+  query.value = {
255
+    wareId: '',
256
+    areaId:''
257
+  }
258
+  layout.value = []
259
+  areaList.value = []
260
+}
261
+// ----------------------------查询库房列表------------------------------
262
+const wareOptions = ref([])
263
+const handleWareVisible = (visible) => {
264
+  if (visible && wareOptions.value.length === 0) {
265
+    fetchWareOptions()
266
+  }
267
+}
268
+const fetchWareOptions = () => {
269
+  proxy.$axios.get('sto/Ware/options', {}).then((response) => {
270
+    if (response.data.code === 0 || response.data.code === '0') {
271
+      wareOptions.value = toOptions(response.data.data, 'label', 'value')
272
+    }
273
+  })
274
+}
275
+const toOptions = (list, labelKey, valueKey) => (list || []).map((item) => {
276
+      if (typeof item === 'string') {
277
+        return {
278
+          label: item,
279
+          value: item
280
+        }
281
+      }
282
+      return {
283
+        label: item?.[labelKey] ?? item?.label ?? item?.name ?? item?.value ?? '',
284
+        value: item?.[valueKey] ?? item?.value ?? item?.id ?? item?.code ?? item?.label ?? ''
285
+      }
286
+    }).filter((item) => item.label !== '' && item.value !== '')
287
+// ----------------------------查询分区列表------------------------------
288
+const areaList = ref([])
289
+const getAreaData = () => {
290
+  if(query.value.wareId==null || query.value.wareId==''){
291
+    query.value.areaId = ''
292
+  }
293
+  const params = {
294
+    page: 1,
295
+    rows:99999,
296
+    wareId: query.value.wareId,
297
+    json: JSON.stringify(query.value)
298
+  }
299
+  proxy.$axios.get('sto/Area/query', params).then((response) => {
300
+    if (response.data.code === 0) {
301
+      areaList.value = response.data.data.records
302
+      if(areaList.value.length==0){
303
+        query.value.areaId = ''
304
+      }
305
+    } else {
306
+      ElMessage.error('操作失败!' + response.data.msg)
307
+    }
308
+  })
309
+}
310
+// ----------------------------查询垛位布局------------------------------
311
+const getLayoutData = () => {
312
+  if(query.value.wareId==''||query.value.areaId==''){
313
+    return ElMessage.error('请选择库房和分区!')
314
+  }
315
+  proxy.$axios.get('sto/MaintStack/queryByWareIdAndAreaId', {
316
+    wareId: query.value.wareId,
317
+    areaId: query.value.areaId
318
+  }).then((response) => {
319
+    if (response.data.code === '0') {
320
+      layout.value = response.data.data
321
+    } else {
322
+      ElMessage.error('操作失败!' + response.data.msg)
323
+    }
324
+  })
325
+}
326
+// =========================================新增分区============================================
327
+// let partition = ref(false)
328
+// let partitionForm = ref({
329
+//   wareId: '',
330
+//   areaName: '',
331
+//   areaCode: ''
332
+// })
333
+// const partitionRules = reactive({
334
+//   wareId: [{ required: true, message: '请选择所属库房', trigger: 'change' }],
335
+//   areaName: [{ required: true, message: '请输入分区名称', trigger: 'blur' }],
336
+//   areaCode: [{ required: true, message: '请输入分区编码', trigger: 'blur' }]
337
+// })
338
+// const insertPartition = () => {
339
+//   partition.value = true
340
+// }
341
+// ===========================================修改垛位名称=======================================
342
+// 在 script setup 中添加编辑功能
343
+function startEditing(item: any) {
344
+  // 保存原始名称
345
+  item.tempName = item.name || item.i
346
+  item.isEditing = true
347
+}
348
+
349
+function finishEditing(item: any) {
350
+  // 如果输入不为空,则更新名称
351
+  if (item.tempName && item.tempName.trim()) {
352
+    item.i = item.tempName.trim()
353
+  }
354
+  item.isEditing = false
355
+}
356
+// ==========================================保存=============================================
357
+const saveOrUpload = () => {
358
+  if(query.value.wareId==''||query.value.areaId==''){
359
+    return ElMessage.error('请选择库房和分区!')
360
+  }
361
+
362
+  const requestData = {
363
+    wareId: query.value.wareId,
364
+    areaId: query.value.areaId,
365
+    layoutStacks: layout.value
366
+  }
367
+
368
+  axios.post('sto/MaintStack/saveOrUpdateStack', requestData, {
369
+    headers: {
370
+      'Content-Type': 'application/json'
371
+    }
372
+  })
373
+      .then((response) => {
374
+        if (response && response.data && response.data.code === '0') {
375
+          ElMessage.success('操作成功!')
376
+        } else {
377
+          ElMessage.error('操作失败!' + (response?.data?.msg || '未知错误'))
378
+        }
379
+      })
380
+      .catch((error) => {
381
+        console.error('保存失败:', error);
382
+        ElMessage.error('保存失败:' + (error.message || '网络错误'));
383
+      })
384
+}
385
+
386
+
387
+</script>
388
+
389
+<style scoped>
390
+.vgl-layout {
391
+  background-color: #eee;
392
+  --vgl-resizer-border-color: #f15642;
393
+}
394
+
395
+:deep(.vgl-item:not(.vgl-item--placeholder)) {
396
+  background-color: #ccc;
397
+  border: 1px solid black;
398
+}
399
+
400
+:deep(.vgl-item--resizing) {
401
+  opacity: 90%;
402
+}
403
+
404
+:deep(.vgl-item--static) {
405
+  background-color: #cce;
406
+}
407
+
408
+.text {
409
+  position: absolute;
410
+  inset: 0;
411
+  width: 100%;
412
+  height: 100%;
413
+  margin: auto;
414
+  font-size: 24px;
415
+  text-align: center;
416
+}
417
+
418
+
419
+
420
+.remove {
421
+  position: absolute;
422
+  top: 0;
423
+  right: 2px;
424
+  cursor: pointer;
425
+}
426
+.action-btn {
427
+  position: absolute;
428
+  cursor: pointer;
429
+}
430
+.switchB {
431
+  margin: 15px;
432
+  display: flex;
433
+  justify-content: space-between;
434
+  width: 26%;
435
+}
436
+
437
+.item-container {
438
+  position: relative;
439
+  width: 100%;
440
+  height: 100%;
441
+  display: flex;
442
+  align-items: center;
443
+  justify-content: center;
444
+}
445
+
446
+.text {
447
+  position: absolute;
448
+  inset: 0;
449
+  width: 100%;
450
+  height: 100%;
451
+  margin: auto;
452
+  font-size: 24px;
453
+  text-align: center;
454
+  line-height: 100%; /* 让文字垂直居中 */
455
+  cursor: pointer;
456
+  user-select: none; /* 防止双击选中文本 */
457
+}
458
+
459
+.edit-input {
460
+  position: absolute;
461
+  width: 80%;
462
+  height: 80%;
463
+  z-index: 10;
464
+  cursor: text;
465
+}
466
+.dialog-footer {
467
+  display: flex;
468
+  justify-content: flex-end;
469
+  gap: 10px;
470
+}
471
+
472
+
473
+</style>

Loading…
Annulla
Salva