Compare commits
405 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
6bdbde262f | ||
|
|
c3358acf73 | ||
|
|
3b1b822882 | ||
| f874cd75b7 | |||
| 65b76da880 | |||
| d0dc8ba9f8 | |||
| e2de62e54a | |||
| 61feb031aa | |||
| e5b5b26e24 | |||
| 41b04e6fac | |||
| 0f2cb87f66 | |||
| ccba937158 | |||
| edffc54453 | |||
| f5b3791762 | |||
| 7e25e76683 | |||
| 7e7aac5139 | |||
| eed18d0c17 | |||
| 981d65c759 | |||
| 049091719a | |||
| 5f120bff1e | |||
| 70a4899337 | |||
| a6fd326774 | |||
| 45aaaf5360 | |||
| 193862f58b | |||
| 24563fd7df | |||
| 6de9896ead | |||
| 60df95cc20 | |||
| d8a1a661df | |||
| f720c3cddb | |||
| 0a6803371b | |||
| fb48952924 | |||
| 1a5dda5302 | |||
| cde8d9f0b4 | |||
| a560460cc1 | |||
| 7d234e523b | |||
| bf6779a008 | |||
| 065a232333 | |||
| 4c492a8866 | |||
| bb84f72836 | |||
| 45b8b91152 | |||
| 94a46d01fe | |||
| 7be10381bd | |||
| 39fedea1ca | |||
| ec9c4c526c | |||
| a1b249b86c | |||
| fe0a6bb3be | |||
| 41bd6d1686 | |||
| e65bf98db2 | |||
| dc8fc056f9 | |||
| d316661574 | |||
| a3b93d0e1a | |||
| d23a86e9ea | |||
| f427fa9ef2 | |||
| 87ab014111 | |||
| f9d7b765d1 | |||
| 7601a7872c | |||
| 39af97815c | |||
| 4654f71f11 | |||
| 88f4a93a81 | |||
| df2d53b9da | |||
| 1996ff0b3a | |||
| 8864e13030 | |||
| 4f67329f6b | |||
| 11e4b4ab3f | |||
| f588695f3c | |||
| 2c2055a11a | |||
| 5949cdd843 | |||
| 9be3a714d1 | |||
| 9b50bcd0ee | |||
|
|
f18dd60383 | ||
| 1440ba821a | |||
| 1a005f3b9e | |||
| c8731e0612 | |||
| 20798e0ce6 | |||
| 9646a0110f | |||
| 216bc5034b | |||
| 18c5386fdd | |||
| b28fbaf903 | |||
| dc9f82f30e | |||
| bba7a8e456 | |||
| 5d21271316 | |||
| 85a910b794 | |||
| ecc7b0ebc3 | |||
| f1a02e9188 | |||
| fc8575dd0b | |||
| 52ca3791b3 | |||
| 222b9829b6 | |||
| d644b0e3ca | |||
| c67e5cf15e | |||
| 457547a34e | |||
| e4959cecd7 | |||
| ed3462be87 | |||
| 662042a228 | |||
| 7e7197b9b8 | |||
| b7ebe7e3b9 | |||
| e2e4f47c60 | |||
| c43ea8be87 | |||
| a0906ed5c7 | |||
| c884333fc1 | |||
| e4094dcd73 | |||
| 5640978025 | |||
| 6018cd6838 | |||
| 7e110dd656 | |||
| 195cc714ab | |||
| 37ee6af0e5 | |||
| f22e14b1ba | |||
| 93d69861bf | |||
| 81c24023e9 | |||
| 83e780c17d | |||
| 298d298dc5 | |||
| 99c93dd582 | |||
| f0e25b21d3 | |||
| d229f957e5 | |||
| 4a52ab51df | |||
| a6ee226073 | |||
| db720f6d1b | |||
| abda409817 | |||
| 1183be2987 | |||
| 7541b37117 | |||
| f219635348 | |||
| b2774892de | |||
| ea51e6a300 | |||
| c799c16663 | |||
| becce5dfab | |||
| 873458595d | |||
| 8408697b57 | |||
| 04d62635f8 | |||
| 12d3fbcda1 | |||
| bcb74bf29f | |||
| 443f598173 | |||
| 8b5a4aba6f | |||
| 474cf72333 | |||
| 8d87e2a7a0 | |||
| a7367bef2f | |||
| bd37eb66a9 | |||
| 2244e96484 | |||
| c16d86354b | |||
| 88f12c7fce | |||
|
|
522eb5025c | ||
|
|
6aeb846ca4 | ||
|
|
f5d8a46829 | ||
| a7a146c055 | |||
| 96529cccc6 | |||
|
|
21a111ae8f | ||
| 5912f37ebb | |||
| 39b71a581a | |||
| 2f3d47e349 | |||
| e06e2d553e | |||
| 6ac90f3841 | |||
| f08f754002 | |||
| b3c3156a08 | |||
| df349f1480 | |||
| 067ff09c73 | |||
|
|
45e0bf3c6c | ||
| 1e41101f9b | |||
| db2f0d8daf | |||
| 96bcb30868 | |||
| 5a443bfab9 | |||
| 55782df345 | |||
| 925b4a2eb4 | |||
| 6f505ba281 | |||
| 1430b1eae7 | |||
| 95b2193393 | |||
| 7df05a46f2 | |||
| d6f53a69da | |||
| b5933a9016 | |||
| 24f4a4a498 | |||
| 19db2667c2 | |||
| f617b815a1 | |||
| ac8cbdc991 | |||
| 84e5c2dd7e | |||
|
|
9a66c333c7 | ||
| 3580fb41f3 | |||
| dc822bba07 | |||
| 1db5d4b11f | |||
| 1ca25d8ec4 | |||
| a9c7977347 | |||
| 3c471b1124 | |||
| 2b94151780 | |||
| 9088a792d1 | |||
| ff09ed8c8a | |||
| fdb76c31a8 | |||
| 484efa5854 | |||
| 07b3457409 | |||
| 1150fdac86 | |||
| 930684ac01 | |||
| 760d452311 | |||
| 6f0800162b | |||
| 8f3432f9a0 | |||
| ae1c614ee8 | |||
| 7ceb63b02f | |||
| a0fa5d43f1 | |||
| 008b3c942a | |||
| 3cc9f40baf | |||
| ca030e42d4 | |||
| 7b6ca29a93 | |||
| 8538f7d43f | |||
| 9f8e07c18a | |||
| a2212ac8e6 | |||
| d6c7538c36 | |||
| 150ac2afcb | |||
| 609df9855a | |||
| da2f27bc72 | |||
| eeb821de24 | |||
| a754751832 | |||
| 5235f23365 | |||
|
|
7f684fa085 | ||
|
|
d674a6ea12 | ||
| b315b667e9 | |||
| 798c42beb9 | |||
| 2613884a89 | |||
| 9a9702227c | |||
| 74ad7e9eb9 | |||
| cdb984a439 | |||
| ab33f09538 | |||
| 152da3c0e4 | |||
|
|
bd165769de | ||
|
|
c266e27c51 | ||
| 1bfa0095ae | |||
| 33c4e4baa7 | |||
| eb5df00b45 | |||
| 61be47b3d4 | |||
| e5356787be | |||
| f842bf375b | |||
| 9ef88a2d17 | |||
| 9688322f69 | |||
| 19a61159e4 | |||
| beb727760b | |||
| aa2631b7de | |||
| cfe89816f4 | |||
| 80d8d3c687 | |||
| c75bd8a197 | |||
| 12eeeced0e | |||
|
|
de69dc9b47 | ||
| 2edef9fcf0 | |||
| dfcf635f05 | |||
| 9beb9ed9de | |||
| 89dd56959a | |||
| d2f7f6080a | |||
|
|
0556e5eb79 | ||
| 6fc5a3f6f3 | |||
| 706bf36aa8 | |||
| 634931a624 | |||
| afc079b670 | |||
| c1a1b30c99 | |||
| d17bca9994 | |||
| 0fbaa25cd6 | |||
| 9a1b04966d | |||
| 759f93078b | |||
| 1e97239d18 | |||
| 49a3bbd701 | |||
| 68dc2ff018 | |||
| 6f843f54a6 | |||
| 19791498d4 | |||
| 4242b22c1a | |||
| 6e3b1e8b54 | |||
| 43703f3366 | |||
| bb052b85ac | |||
| 4049becfb8 | |||
| 2a8dabd648 | |||
| a6bd56c29c | |||
| 662e11c154 | |||
| fab991400e | |||
| b1b389ce8f | |||
| c977249713 | |||
| 9a306be965 | |||
| d01f37f5b9 | |||
| 07069af7a0 | |||
|
|
4a598f52d4 | ||
| c67a66c119 | |||
|
|
c99e553515 | ||
|
|
380c476cf3 | ||
| b433efc81a | |||
| ab4b9c1bf3 | |||
| 169423d5f9 | |||
| ce981882c8 | |||
| dd13f8d175 | |||
| 47f13d4b1e | |||
| 433bb7e1a4 | |||
| 08f86517da | |||
| 794826f0c7 | |||
| 096fa6dc51 | |||
| accf65ef10 | |||
| eaa8b834bf | |||
| b32ced514b | |||
| 78cf7e6857 | |||
| 8128766e24 | |||
| 90a08f37f6 | |||
| ad03a1ed2b | |||
| 41b1bed81d | |||
|
|
bc882f375f | ||
| 5d23a903fc | |||
| 7fb30322b3 | |||
| a795fa5786 | |||
|
|
6fcb68d929 | ||
| 9cf7396fb8 | |||
| 891cebec90 | |||
| 2206e2aa21 | |||
| ba4e927ff5 | |||
| fa366d18e5 | |||
| 31ff2a4502 | |||
| 4d312a8892 | |||
| fc09c1db05 | |||
| 62983eea10 | |||
| a7f95e98aa | |||
| df4312e61d | |||
| 65af3e7bfb | |||
| fe5c28dbf0 | |||
| 5b78df27f5 | |||
| f9cf478694 | |||
| 7b67e71bd6 | |||
| 2c5c694445 | |||
| 4649ad3abd | |||
| ac00d68350 | |||
| 40c09c58d4 | |||
| a30638d693 | |||
| 0f83224f28 | |||
| 11a1f044f5 | |||
| 7df8fbd46a | |||
| d57af223cc | |||
| a1925121d7 | |||
|
|
4f4f1842a4 | ||
| 1bc27897d8 | |||
| e5d03a07a3 | |||
|
|
d6909fb449 | ||
| 73978ca602 | |||
| ac4cdb1189 | |||
|
|
b3e85e186e | ||
| f0a09b2d0a | |||
| 501790677e | |||
|
|
700c08616f | ||
| 28207004c7 | |||
| 8c33aaa8a7 | |||
| 9e5d07d7e5 | |||
| 45dc828332 | |||
|
|
26f5c2c9c5 | ||
|
|
8ac192f8ba | ||
|
|
496109cc1a | ||
| e08eccb46d | |||
| df9debe453 | |||
| 43433b3b02 | |||
| 1cec0b123c | |||
| 324862a61f | |||
| aa76f82a74 | |||
| 24fc98cf7b | |||
| e7a2753c06 | |||
|
|
a7ae9df845 | ||
|
|
f04459aba1 | ||
| 4000b0b8e9 | |||
|
|
2d23266e50 | ||
| 99d90acebc | |||
| 6b2a94453c | |||
| bd679710e2 | |||
| 86610c07a8 | |||
|
|
b336efa79c | ||
|
|
d010907d2b | ||
|
|
894b656a82 | ||
|
|
4b9ecb9360 | ||
|
|
228fef7a9b | ||
|
|
6a6a440428 | ||
|
|
ee9462769f | ||
|
|
cf2f071f6d | ||
|
|
18113da288 | ||
|
|
743f55c11d | ||
|
|
4009f05185 | ||
|
|
182572bfd1 | ||
|
|
5edd4ee722 | ||
|
|
497f1ad64e | ||
|
|
ff632ef4cf | ||
|
|
10d094a5b7 | ||
|
|
f395fa32c7 | ||
|
|
57153d3bc7 | ||
|
|
5b3a6b6bf4 | ||
| 6fbf040107 | |||
| 6b81e35db0 | |||
|
|
97578316b8 | ||
|
|
4c07528102 | ||
|
|
065ef047a7 | ||
|
|
b5c5b9ec99 | ||
|
|
76824a5c57 | ||
|
|
75b0625dc4 | ||
|
|
4585a4e49d | ||
|
|
eb5b27fdf8 | ||
|
|
e8ab5fc050 | ||
|
|
9df7674abc | ||
|
|
21517a41a3 | ||
|
|
4449fcce60 | ||
| 27c7b68595 | |||
| 306f92f4e5 | |||
| 51fe4e113b | |||
| 3bb0b9108c | |||
| b8aff8512d | |||
| 6ec24f7431 | |||
|
|
d4373bc44f | ||
|
|
d0c20d68eb | ||
|
|
ad808d6fa6 | ||
|
|
ac92da76aa | ||
| 20c913f61f | |||
| f25e74869b | |||
|
|
09028a2041 | ||
| 0a9d2fbfc1 | |||
| 901cf7fbc4 | |||
| bd9d0a43c2 | |||
| 9eb481be57 | |||
| f568676a40 |
@@ -4,6 +4,8 @@ RUN rm -rf /etc/nginx/conf.d/default.conf
|
|||||||
RUN rm -rf /etc/nginx/nginx.conf
|
RUN rm -rf /etc/nginx/nginx.conf
|
||||||
COPY default.conf /etc/nginx/conf.d
|
COPY default.conf /etc/nginx/conf.d
|
||||||
COPY nginx.conf /etc/nginx/
|
COPY nginx.conf /etc/nginx/
|
||||||
|
COPY mosr.feashow.cn_chain.crt /etc/nginx/
|
||||||
|
COPY private.key /etc/nginx/
|
||||||
|
|
||||||
#RUN useradd -b /home/clay -m -s /bin/bash clay
|
#RUN useradd -b /home/clay -m -s /bin/bash clay
|
||||||
#RUN chmod a+xr -R /home/clay && chown clay:clay -R /home/clay
|
#RUN chmod a+xr -R /home/clay && chown clay:clay -R /home/clay
|
||||||
|
|||||||
72
mosr.feashow.cn_chain.crt
Normal file
72
mosr.feashow.cn_chain.crt
Normal file
@@ -0,0 +1,72 @@
|
|||||||
|
-----BEGIN CERTIFICATE-----
|
||||||
|
MIIG3DCCBMSgAwIBAgIQDzIS+rldpl8FKv9qt1IuQDANBgkqhkiG9w0BAQsFADBb
|
||||||
|
MQswCQYDVQQGEwJDTjElMCMGA1UEChMcVHJ1c3RBc2lhIFRlY2hub2xvZ2llcywg
|
||||||
|
SW5jLjElMCMGA1UEAxMcVHJ1c3RBc2lhIERWIFRMUyBSU0EgQ0EgMjAyNTAeFw0y
|
||||||
|
NTAzMTkwMDAwMDBaFw0yNTA2MTcyMzU5NTlaMBoxGDAWBgNVBAMTD21vc3IuZmVh
|
||||||
|
c2hvdy5jbjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAK92bSayd6Wo
|
||||||
|
wFJz+ldX8QEgQiUjEPyQB0rV+Op9/eZSmpC6y+DuS/CddOPaXs+t1fV9L2kQ1yWD
|
||||||
|
Byc7cZK2PnzGb8+Uh9BR3UtVaCxISGqxjvt2V1lIwXbBDOUjtkVVlchhGR+BrNzP
|
||||||
|
YGyMLhgdBDxhKK4ogBNOx23AzCpTGFsU7sL996qwYo2rhIE8UuYcw3deS4RtfMUx
|
||||||
|
zt58wn1s+9kki6Qti7dLw3Bg0eCXop+7/FC09fg5Nh3EygMlZvLyvNOFig+o/Fk3
|
||||||
|
6ibp2N56yFLEfe+WNj4xPCad/3Cevh5BIgTsSAPBh6J5Jk4IXoL8PuCSc96d79Bg
|
||||||
|
SVGNGhRuCgcCAwEAAaOCAtswggLXMB8GA1UdIwQYMBaAFLQSKKW0wB2fKXFpPNkR
|
||||||
|
lkp1aVDAMB0GA1UdDgQWBBTL9/e/QUue1NxlPXspxQ/RzXhzxTAaBgNVHREEEzAR
|
||||||
|
gg9tb3NyLmZlYXNob3cuY24wPgYDVR0gBDcwNTAzBgZngQwBAgEwKTAnBggrBgEF
|
||||||
|
BQcCARYbaHR0cDovL3d3dy5kaWdpY2VydC5jb20vQ1BTMA4GA1UdDwEB/wQEAwIF
|
||||||
|
oDAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIweQYIKwYBBQUHAQEEbTBr
|
||||||
|
MCQGCCsGAQUFBzABhhhodHRwOi8vb2NzcC5kaWdpY2VydC5jb20wQwYIKwYBBQUH
|
||||||
|
MAKGN2h0dHA6Ly9jYWNlcnRzLmRpZ2ljZXJ0LmNvbS9UcnVzdEFzaWFEVlRMU1JT
|
||||||
|
QUNBMjAyNS5jcnQwDAYDVR0TAQH/BAIwADCCAX8GCisGAQQB1nkCBAIEggFvBIIB
|
||||||
|
awFpAHYATnWjJ1yaEMM4W2zU3z9S6x3w4I4bjWnAsfpksWKaOd8AAAGVrKDPywAA
|
||||||
|
BAMARzBFAiAJkC1pvmPIhgdAkRoyPCItM4oRM5Bb8OI3zVzNvdNTkQIhAN1Fq4mU
|
||||||
|
GJYrJkOmwvJ2Mb5upB50Ic8C7KatpMdKEFM7AHYAfVkeEuF4KnscYWd8Xv340Idc
|
||||||
|
FKBOlZ65Ay/ZDowuebgAAAGVrKDQBwAABAMARzBFAiAT9jfX08uN94aIeK84IySz
|
||||||
|
jUPDa1MSWjJKsA3XusY3GAIhAJ9PvGtFx9+UM9YNNT7BZUq6hhVvhYWhlf+d0qpy
|
||||||
|
uEl9AHcAzxFW7tUufK/zh1vZaS6b6RpxZ0qwF+ysAdJbd87MOwgAAAGVrKDP+AAA
|
||||||
|
BAMASDBGAiEA0c9dt1JwyAMzQtv7UsPaKEJ5sp6HDaSWe5BGIYWsYrcCIQDjS6L1
|
||||||
|
9TF6SpcEWHH6bl952VQb6Xvt1JmmKUNX6iK2xTANBgkqhkiG9w0BAQsFAAOCAgEA
|
||||||
|
0E2VWQjWgEBz968xq2cpYGv2Enfs2TWpynuoPTwY83V7h2ejNbpjgyW1gT/kQkxa
|
||||||
|
G5k4jpkVmNMaj3CAvK4IA5jOPh6dhzBG35Qc0PwRm0eovcUdUNUd0g4EOv82p2s1
|
||||||
|
ab1SWNYoxGdS+y+LHhfFZ7CoVcSvBz+LHBlPTVTkLA0SWLA0fhS3pl5oGIilMtSM
|
||||||
|
znCUUuMBtMQBv7sFX2gDEYwxGaMn3lpoqBGkpx4UBc51z/U3+X9zLqu6n/GpLC72
|
||||||
|
+qz6QtQVm0Np8gcjul0ebQqAPwDG4U+9jYEmdwVHZ0iUKgyZPECPU+TTtHx0TFS3
|
||||||
|
B5JXy8vbGJBqpwq6hMnu/SFm+GY3iPk7N0Aj5+9QNcl2FTF8k/nCoK3MuY71ZmxR
|
||||||
|
E1NY6Hl5KpKzBqc7JG4iqQxJ0dD9Racn4wegGDlX0Vr2U+ohHYeETNJXOX+JT4tc
|
||||||
|
1PBdfiywbX+FCdE2ZPehWa6dt4fnPBC/9lSywrzOWLNt9z1a/Mh73N5F6ndaXq1p
|
||||||
|
v/N3Q0qnXpW1RZa6Baqlfvk2vqhraRbT9YH5Y+f51DhtVB6fbELO/pJr1H5kh0XI
|
||||||
|
CczHkGTGD7xZloNfTMLP2AVguIXJ0EASAAMw/MBRWvSd4He2lLHvujEqTXsTISgv
|
||||||
|
v+/5bZP8qBk3/oEgdLjlmqWY1sesBH84tiMZcxCkPNM=
|
||||||
|
-----END CERTIFICATE-----
|
||||||
|
-----BEGIN CERTIFICATE-----
|
||||||
|
MIIFnjCCBIagAwIBAgIQCSYyO0lk42hGFRLe8aXVLDANBgkqhkiG9w0BAQsFADBh
|
||||||
|
MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3
|
||||||
|
d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBH
|
||||||
|
MjAeFw0yNTAxMDgwMDAwMDBaFw0zNTAxMDcyMzU5NTlaMFsxCzAJBgNVBAYTAkNO
|
||||||
|
MSUwIwYDVQQKExxUcnVzdEFzaWEgVGVjaG5vbG9naWVzLCBJbmMuMSUwIwYDVQQD
|
||||||
|
ExxUcnVzdEFzaWEgRFYgVExTIFJTQSBDQSAyMDI1MIICIjANBgkqhkiG9w0BAQEF
|
||||||
|
AAOCAg8AMIICCgKCAgEA0fuEmuBIsN6ZZVq+gRobMorOGIilTCIfQrxNpR8FUZ9R
|
||||||
|
/GfbiekbiIKphQXEZ7N1uBnn6tXUuZ32zl6jPkZpHzN/Bmgk1BWSIzVc0npMzrWq
|
||||||
|
/hrbk5+KddXJdsNpeG1+Q8lc8uVMBrztnxaPb7Rh7yQCsMrcO4hgVaqLJWkVvEfW
|
||||||
|
ULtoCHQnNaj4IroG6VxQf1oArQ8bPbwpI02lieSahRa78FQuXdoGVeQcrkhtVjZs
|
||||||
|
ON98vq5fPWZX2LFv7e5J6P9IHbzvOl8yyQjv+2/IOwhNSkaXX3bI+//bqF9XW/p7
|
||||||
|
+gsUmHiK5YsvLjmXcvDmoDEGrXMzgX31Zl2nJ+umpRbLjwP8rxYIUsKoEwEdFoto
|
||||||
|
Aid59UEBJyw/GibwXQ5xTyKD/N6C8SFkr1+myOo4oe1UB+YgvRu6qSxIABo5kYdX
|
||||||
|
FodLP4IgoVJdeUFs1Usa6bxYEO6EgMf5lCWt9hGZszvXYZwvyZGq3ogNXM7eKyi2
|
||||||
|
20WzJXYMmi9TYFq2Fa95aZe4wki6YhDhhOO1g0sjITGVaB73G+JOCI9yJhv6+REN
|
||||||
|
D40ZpboUHE8JNgMVWbG1isAMVCXqiADgXtuC+tmJWPEH9cR6OuJLEpwOzPfgAbnn
|
||||||
|
2MRu7Tsdr8jPjTPbD0FxblX1ydW3RG30vwLF5lkTTRkHG9epMgpPMdYP7nY/08MC
|
||||||
|
AwEAAaOCAVYwggFSMBIGA1UdEwEB/wQIMAYBAf8CAQAwHQYDVR0OBBYEFLQSKKW0
|
||||||
|
wB2fKXFpPNkRlkp1aVDAMB8GA1UdIwQYMBaAFE4iVCAYlebjbuYP+vq5Eu0GF485
|
||||||
|
MA4GA1UdDwEB/wQEAwIBhjAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIw
|
||||||
|
dgYIKwYBBQUHAQEEajBoMCQGCCsGAQUFBzABhhhodHRwOi8vb2NzcC5kaWdpY2Vy
|
||||||
|
dC5jb20wQAYIKwYBBQUHMAKGNGh0dHA6Ly9jYWNlcnRzLmRpZ2ljZXJ0LmNvbS9E
|
||||||
|
aWdpQ2VydEdsb2JhbFJvb3RHMi5jcnQwQgYDVR0fBDswOTA3oDWgM4YxaHR0cDov
|
||||||
|
L2NybDMuZGlnaWNlcnQuY29tL0RpZ2lDZXJ0R2xvYmFsUm9vdEcyLmNybDARBgNV
|
||||||
|
HSAECjAIMAYGBFUdIAAwDQYJKoZIhvcNAQELBQADggEBAJ4a3svh316GY2+Z7EYx
|
||||||
|
mBIsOwjJSnyoEfzx2T699ctLLrvuzS79Mg3pPjxSLlUgyM8UzrFc5tgVU3dZ1sFQ
|
||||||
|
I4RM+ysJdvIAX/7Yx1QbooVdKhkdi9X7QN7yVkjqwM3fY3WfQkRTzhIkM7mYIQbR
|
||||||
|
r+y2Vkju61BLqh7OCRpPMiudjEpP1kEtRyGs2g0aQpEIqKBzxgitCXSayO1hoO6/
|
||||||
|
71ts801OzYlqYW9OQQQ2GCJyFbD6XHDjdpn+bWUxTKWaMY0qedSCbHE3Kl2QEF0C
|
||||||
|
ynZ7SbC03yR+gKZQDeTXrNP1kk5Qhe7jSXgw+nhbspe0q/M1ZcNCz+sPxeOwdCcC
|
||||||
|
gJE=
|
||||||
|
-----END CERTIFICATE-----
|
||||||
25
nginx.conf
25
nginx.conf
@@ -25,9 +25,31 @@ http {
|
|||||||
|
|
||||||
keepalive_timeout 65;
|
keepalive_timeout 65;
|
||||||
|
|
||||||
|
# HTTP重定向到HTTPS
|
||||||
server {
|
server {
|
||||||
listen 80;
|
listen 80;
|
||||||
listen [::]:80;
|
listen [::]:80;
|
||||||
|
server_name mosr.feashow.cn;
|
||||||
|
return 301 https://$host$request_uri; # 强制跳转HTTPS
|
||||||
|
}
|
||||||
|
# 新增HTTPS服务器块
|
||||||
|
server {
|
||||||
|
listen 443 ssl;
|
||||||
|
listen [::]:443 ssl;
|
||||||
|
server_name www.abc.com;
|
||||||
|
|
||||||
|
# SSL证书配置
|
||||||
|
ssl_certificate /etc/nginx/mosr.feashow.cn_chain.crt;
|
||||||
|
ssl_certificate_key /etc/nginx/private.key;
|
||||||
|
|
||||||
|
# 优化SSL配置
|
||||||
|
ssl_protocols TLSv1.2 TLSv1.3;
|
||||||
|
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;
|
||||||
|
ssl_prefer_server_ciphers off;
|
||||||
|
ssl_session_cache shared:SSL:10m;
|
||||||
|
ssl_session_timeout 1d;
|
||||||
|
ssl_session_tickets off;
|
||||||
|
|
||||||
|
|
||||||
location /api {
|
location /api {
|
||||||
proxy_pass http://gateway.$PROFILES.svc.cluster.local:8080;
|
proxy_pass http://gateway.$PROFILES.svc.cluster.local:8080;
|
||||||
@@ -47,5 +69,6 @@ http {
|
|||||||
index index.html index.htm;
|
index index.html index.htm;
|
||||||
try_files $uri $uri/ /index.html;
|
try_files $uri $uri/ /index.html;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
28
private.key
Normal file
28
private.key
Normal file
@@ -0,0 +1,28 @@
|
|||||||
|
-----BEGIN PRIVATE KEY-----
|
||||||
|
MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCvdm0msnelqMBS
|
||||||
|
c/pXV/EBIEIlIxD8kAdK1fjqff3mUpqQusvg7kvwnXTj2l7PrdX1fS9pENclgwcn
|
||||||
|
O3GStj58xm/PlIfQUd1LVWgsSEhqsY77dldZSMF2wQzlI7ZFVZXIYRkfgazcz2Bs
|
||||||
|
jC4YHQQ8YSiuKIATTsdtwMwqUxhbFO7C/feqsGKNq4SBPFLmHMN3XkuEbXzFMc7e
|
||||||
|
fMJ9bPvZJIukLYu3S8NwYNHgl6Kfu/xQtPX4OTYdxMoDJWby8rzThYoPqPxZN+om
|
||||||
|
6djeeshSxH3vljY+MTwmnf9wnr4eQSIE7EgDwYeieSZOCF6C/D7gknPene/QYElR
|
||||||
|
jRoUbgoHAgMBAAECggEABmJQMV6/9LKRoM5gduoXtjtGvNQsS4wv/7yOTHXeFZG+
|
||||||
|
1vI89cel0rDf7mRlG7hO9xohbfizY0WDrp0+kiB4YJDVw587W8yGuTV3z1in7d3c
|
||||||
|
/nA9WF3J0DjQ78tfV+F3zC0gPWG5+OTAtOJa0PzJSSsd0Exf8JPmtKsVopqYYcPv
|
||||||
|
RL2uP+NfcsxIEPz7rBBqiTGbOgsoKIpVZWiV6dmGOHLnI3ktWE8GXyIFv0VO6kp2
|
||||||
|
fk/Z2uU9rfS9Qc9NijVdZ5AejdSh70iWNdiVMTSXZ69XLQCiY1h/376mraAPZTC1
|
||||||
|
T0fYAtaOdyRrYLIW3yuznZa6hz351+t4TjJHQGjAUQKBgQDe8FS3yM85Ve3qlNaV
|
||||||
|
pzjpjkv8cn8u43Hyk88owNACxkvzUXx15YE+AGjjycVO5rbyC1mtdE2MKX8cd5T/
|
||||||
|
cA75RoSDxBTR7xi9eqBzJpQ7hm2rTaZSkHhu4P9KsthgQFFYQB6EkZgYczLOs/OV
|
||||||
|
UmPMuKwL7HcwuRf00jjAOoJPdwKBgQDJe7R4PS0VBAWnh3lC9R/NEbEoFQ6LUwPh
|
||||||
|
Qgmgj6LRB/1NgaC7ekDCSyfFlTtpnRDD+WqCrZDiB1ZZehyUObvr0Y0Cb4Y77Fjh
|
||||||
|
lPVG0kfcKUldMpJIfeex0LPBwYHC62Y0ztNQmtgTldDjX04b4gAEgpUReHVTJtDr
|
||||||
|
6S1wRPVd8QKBgHIL0+roqUmVcc5NMbEBCJZCGxEbqYBdDg+gGZupdz/UHUpt5xOQ
|
||||||
|
wprrLr1InM0OLYyIzelz06/eEo6HhgteUeqnbmbRyizS+X8E2kvN8oq47CVz5Z/b
|
||||||
|
FCD0rOSTtSkX/gT9WB9NM9deJyGi4PsEWNWDq0+2OgsMxPqTCEEeLUdlAoGAHNmB
|
||||||
|
tdXMpr20sZBMZLIEo7Bs1XhuZLS2UYLLLhpjDds/AeIVycJvk2J/h2Me5rh+thD4
|
||||||
|
l02S+Upjqtw5S2AY8GNI9ZhSeDIXZ/WUSVfCwluHDbk4CPk+O8/ObWfv1KEwOU+E
|
||||||
|
In6JggRprKTw4j0yE3M/NQkyg32DXMQ+pVy6ZYECgYEAmW/+vm3X2NMj8yjr0Io2
|
||||||
|
P3F/9EHPkrGHNC3Qj6Q2mFus6oDe6NwOQg5Su0fFC77spHFi1g/MlGUxbzoxjVxH
|
||||||
|
1wQmwCHBJuJ97H9MOJ9K2v88/pkvfFGthkTLpbcJLqX57WVEVnVKBMNhpLrlp+0r
|
||||||
|
T3tV8tN010INwiQkaoqCsuw=
|
||||||
|
-----END PRIVATE KEY-----
|
||||||
@@ -9,13 +9,6 @@ export const addAllocation = (data) => {
|
|||||||
data
|
data
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
export const addShare = (data) => {
|
|
||||||
return request({
|
|
||||||
url:'/workflow/mosr/cost/share',
|
|
||||||
method: "post",
|
|
||||||
data
|
|
||||||
});
|
|
||||||
};
|
|
||||||
export const getAllocationDetail = (allocationId) => {
|
export const getAllocationDetail = (allocationId) => {
|
||||||
return request({
|
return request({
|
||||||
url: `/workflow/mosr/cost/allocation/info/${allocationId}`,
|
url: `/workflow/mosr/cost/allocation/info/${allocationId}`,
|
||||||
@@ -68,13 +61,6 @@ export const editAllocation = (data) => {
|
|||||||
data
|
data
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
export const applyCcSend = (data) => {
|
|
||||||
return request({
|
|
||||||
url: '/workflow/mosr/cc/send',
|
|
||||||
method: "post",
|
|
||||||
data
|
|
||||||
});
|
|
||||||
};
|
|
||||||
export const deleteAllocation = (id) => {
|
export const deleteAllocation = (id) => {
|
||||||
return request({
|
return request({
|
||||||
url: `/workflow/mosr/cost/allocation/${id}`,
|
url: `/workflow/mosr/cost/allocation/${id}`,
|
||||||
@@ -93,15 +79,3 @@ export const shareExportExcel = (allocationId) => {
|
|||||||
}
|
}
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
export const shareDetailExport= (data) => {
|
|
||||||
return axios.post(
|
|
||||||
`${import.meta.env.VITE_BASE_URL}/workflow/mosr/cost/share/export`,
|
|
||||||
data, {
|
|
||||||
responseType: 'blob',
|
|
||||||
headers: {
|
|
||||||
Authorization: getToken()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
);
|
|
||||||
};
|
|
||||||
|
|||||||
@@ -25,16 +25,6 @@ export const getRequirementName = (requirementName) => {
|
|||||||
method: "get"
|
method: "get"
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
//需求汇总-项目名称关键词匹配
|
|
||||||
export const getProjectName = (projectName) => {
|
|
||||||
return request({
|
|
||||||
url: `workflow/mosr/requirement/collect`,
|
|
||||||
method: "get",
|
|
||||||
params:{
|
|
||||||
projectName:projectName
|
|
||||||
}
|
|
||||||
});
|
|
||||||
};
|
|
||||||
//获取需求上报 流程信息
|
//获取需求上报 流程信息
|
||||||
export const getProcessInfo = (specialFund) => {
|
export const getProcessInfo = (specialFund) => {
|
||||||
return request({
|
return request({
|
||||||
|
|||||||
@@ -85,35 +85,6 @@ export const getTags = (projectId) => {
|
|||||||
method: "get"
|
method: "get"
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
export const getTagList = (projectId) => {
|
|
||||||
return request({
|
|
||||||
url: `/workflow/mosr/file/tag/list`,
|
|
||||||
method: "get",
|
|
||||||
params:{
|
|
||||||
projectId: projectId
|
|
||||||
}
|
|
||||||
});
|
|
||||||
};
|
|
||||||
export const addTag = (data) => {
|
|
||||||
return request({
|
|
||||||
url: '/workflow/mosr/file/tag/add',
|
|
||||||
method: "post",
|
|
||||||
data:data
|
|
||||||
});
|
|
||||||
};
|
|
||||||
export const updateTag = (data) => {
|
|
||||||
return request({
|
|
||||||
url: '/workflow/mosr/file/tag/update',
|
|
||||||
method: "post",
|
|
||||||
data:data
|
|
||||||
});
|
|
||||||
};
|
|
||||||
export const delTag = (tageId) => {
|
|
||||||
return request({
|
|
||||||
url: `/workflow/mosr/file/tag/${tageId}`,
|
|
||||||
method: "delete"
|
|
||||||
});
|
|
||||||
};
|
|
||||||
export const getPhaseProcess = () => {
|
export const getPhaseProcess = () => {
|
||||||
return request({
|
return request({
|
||||||
url: '/workflow/phase/change/process',
|
url: '/workflow/phase/change/process',
|
||||||
@@ -226,15 +197,3 @@ export const ledgerTemplateDownload = () => {
|
|||||||
}
|
}
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
//费用明细模板下载
|
|
||||||
export const costTemplateDownload = () => {
|
|
||||||
return axios.get(
|
|
||||||
`${import.meta.env.VITE_BASE_URL}/workflow/mosr/rd/expense/download/template`,
|
|
||||||
{
|
|
||||||
responseType: 'blob',
|
|
||||||
headers: {
|
|
||||||
Authorization: getToken()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
);
|
|
||||||
};
|
|
||||||
|
|||||||
@@ -479,11 +479,6 @@ html, body, #app, .el-container, .el-aside, .el-main {
|
|||||||
height: 1.4em;
|
height: 1.4em;
|
||||||
margin-right: 5px;
|
margin-right: 5px;
|
||||||
}
|
}
|
||||||
.file-svg{
|
|
||||||
width: 1.4em;
|
|
||||||
height: 1.4em;
|
|
||||||
fill: #BEA266;
|
|
||||||
}
|
|
||||||
.middle-icon {
|
.middle-icon {
|
||||||
width: 1.4em;
|
width: 1.4em;
|
||||||
height: 1.4em;
|
height: 1.4em;
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
<template>
|
<template>
|
||||||
<el-form :model="formData" ref="applyForm" :rules="rules" :label-position="labelPosition" :style="{marginLeft: label==='项目验收附件'?'25px': label==='项目立项附件'?'25px':'5px'}">
|
<el-form :model="formData" ref="applyForm" :rules="rules" :label-position="labelPosition" style="margin-left: 5px">
|
||||||
<el-row>
|
<el-row>
|
||||||
<!-- <el-col :span="24">-->
|
<!-- <el-col :span="24">-->
|
||||||
<!-- <el-form-item :label="label" prop="attachment" >-->
|
<!-- <el-form-item :label="label" prop="attachment" >-->
|
||||||
@@ -22,12 +22,12 @@
|
|||||||
<!-- </el-form-item>-->
|
<!-- </el-form-item>-->
|
||||||
<!-- </el-col>-->
|
<!-- </el-col>-->
|
||||||
<el-col :span="24">
|
<el-col :span="24">
|
||||||
<el-form-item :label="label" prop="" :required="label!='项目归档附件'">
|
<el-form-item :label="label" prop="" required>
|
||||||
<file-upload @getFile="getOtherFile"/>
|
<file-upload @getFile="getOtherFile"/>
|
||||||
<el-button color="#DED0B2" v-if="templateDownloadBtnShow" @click="handleImportTemplateDownload"
|
<el-button color="#DED0B2" v-if="templateDownloadBtnShow" @click="handleImportTemplateDownload"
|
||||||
style="margin-left: 10px">模板下载
|
style="margin-left: 10px">模板下载
|
||||||
</el-button>
|
</el-button>
|
||||||
<fvTable style="width: 100%;" :height="label=='项目立项附件'?'160':'160'" :scrollbar-always-on="true" :style="{maxHeight:label=='项目立项附件'?'160px':'160px',height:label=='项目立项附件'?'160px':'160px'}" v-if="showTable" :tableConfig="tableConfig"
|
<fvTable style="width: 100%;max-height: 160px;" v-if="showTable" height="160" :tableConfig="tableConfig"
|
||||||
:data="allFileList" :isSettingCol="false" :pagination="false">
|
:data="allFileList" :isSettingCol="false" :pagination="false">
|
||||||
<template #empty>
|
<template #empty>
|
||||||
<el-empty :image-size="55" description="暂无数据" style="padding: 0"/>
|
<el-empty :image-size="55" description="暂无数据" style="padding: 0"/>
|
||||||
@@ -532,10 +532,12 @@ defineExpose({
|
|||||||
})
|
})
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style lang="scss" scoped>
|
<style scoped>
|
||||||
:deep(.el-table--fit ) {
|
:deep(.el-table--fit ) {
|
||||||
height: 160px !important;
|
height: 300px !important;
|
||||||
}
|
}
|
||||||
|
</style>
|
||||||
|
<style lang="scss" scoped>
|
||||||
:deep(.el-table__header) {
|
:deep(.el-table__header) {
|
||||||
.is-leaf:first-child {
|
.is-leaf:first-child {
|
||||||
.cell {
|
.cell {
|
||||||
|
|||||||
@@ -28,9 +28,6 @@
|
|||||||
style="--el-switch-on-color:#BEA266 ; --el-switch-off-color:#cecdcd"
|
style="--el-switch-on-color:#BEA266 ; --el-switch-off-color:#cecdcd"
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
<el-button color="#DED0B2" style="margin-left: 10px"
|
|
||||||
@click="handleCarbonCopy()">立即抄送
|
|
||||||
</el-button>
|
|
||||||
</div>
|
</div>
|
||||||
<div class="process">
|
<div class="process">
|
||||||
<operation-render v-if="processViewer && data.operationList && data.operationList.length > 0&&!changeDiagram"
|
<operation-render v-if="processViewer && data.operationList && data.operationList.length > 0&&!changeDiagram"
|
||||||
@@ -39,10 +36,6 @@
|
|||||||
<process-diagram-viewer v-if="processViewer&&changeDiagram" :id-name="idName?idName:type"/>
|
<process-diagram-viewer v-if="processViewer&&changeDiagram" :id-name="idName?idName:type"/>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<user-picker :multiple="true" ref="carbonCopyUserRef" title="请选择抄送人员"
|
|
||||||
v-model:value="carbonCopyUserList" @ok="carbonCopyUserPickerOk"
|
|
||||||
@cancelOrClear="carbonCopyUserPickerOk"/>
|
|
||||||
|
|
||||||
<file-preview ref="filePreviewRef" :fullscreen="fullscreen" v-if="filePreviewShow"
|
<file-preview ref="filePreviewRef" :fullscreen="fullscreen" v-if="filePreviewShow"
|
||||||
:fileName="filePreviewParam.fileName" :fileUrl="filePreviewParam.fileUrl"
|
:fileName="filePreviewParam.fileName" :fileUrl="filePreviewParam.fileUrl"
|
||||||
:fileType="filePreviewParam.fileType"/>
|
:fileType="filePreviewParam.fileType"/>
|
||||||
@@ -56,8 +49,6 @@ import {ElLoading, ElNotification} from 'element-plus';
|
|||||||
import {downloadFile} from "@/api/project-demand";
|
import {downloadFile} from "@/api/project-demand";
|
||||||
import {searchImplementationFileList} from "@/api/project-manage/attachment";
|
import {searchImplementationFileList} from "@/api/project-manage/attachment";
|
||||||
import {getTags} from "@/api/project-manage";
|
import {getTags} from "@/api/project-manage";
|
||||||
import {applyCcSend} from "@/api/expense-manage";
|
|
||||||
import UserPicker from "@/views/workflow/process/common/UserPicker.vue";
|
|
||||||
|
|
||||||
const changeDiagram = ref(false)
|
const changeDiagram = ref(false)
|
||||||
const props = defineProps({
|
const props = defineProps({
|
||||||
@@ -113,8 +104,6 @@ const props = defineProps({
|
|||||||
}
|
}
|
||||||
})
|
})
|
||||||
const form = ref()
|
const form = ref()
|
||||||
const carbonCopyUserList = ref([])
|
|
||||||
const carbonCopyUserRef = ref()
|
|
||||||
|
|
||||||
const editSingleTableConfig = reactive({
|
const editSingleTableConfig = reactive({
|
||||||
columns: [
|
columns: [
|
||||||
@@ -290,190 +279,7 @@ const schema = computed(() => {
|
|||||||
// }
|
// }
|
||||||
// })
|
// })
|
||||||
} else if (props.type == 'execute') {
|
} else if (props.type == 'execute') {
|
||||||
arr = [
|
arr = [{
|
||||||
|
|
||||||
{
|
|
||||||
label: '实际专利(项)',
|
|
||||||
prop: 'actualNewPatent',
|
|
||||||
colProps: {
|
|
||||||
span: 6
|
|
||||||
},
|
|
||||||
labelWidth: 'left',
|
|
||||||
component: () => (
|
|
||||||
<div>
|
|
||||||
{
|
|
||||||
props.formData.actualNewPatent ? props.formData.actualNewPatent :props.formData.actualNewPatent==0?0: <span>{'--'}</span>
|
|
||||||
}
|
|
||||||
</div>
|
|
||||||
)
|
|
||||||
},
|
|
||||||
{
|
|
||||||
label: '实际软件著作权(项)',
|
|
||||||
prop: 'actualSoftwareCopyright',
|
|
||||||
colProps: {
|
|
||||||
span: 6
|
|
||||||
},
|
|
||||||
labelWidth: 'left',
|
|
||||||
component: () => (
|
|
||||||
<div>
|
|
||||||
{
|
|
||||||
props.formData.actualSoftwareCopyright ? props.formData.actualSoftwareCopyright : props.formData.actualSoftwareCopyright==0?0: <span>{'--'}</span>
|
|
||||||
}
|
|
||||||
</div>
|
|
||||||
)
|
|
||||||
},
|
|
||||||
{
|
|
||||||
label: '实际技术标准(项)',
|
|
||||||
prop: 'actualTechnicalNorms',
|
|
||||||
colProps: {
|
|
||||||
span: 6
|
|
||||||
},
|
|
||||||
labelWidth: 'left',
|
|
||||||
component: () => (
|
|
||||||
<div>
|
|
||||||
{
|
|
||||||
props.formData.actualTechnicalNorms ? props.formData.actualTechnicalNorms : props.formData.actualTechnicalNorms==0?0:<span>{'--'}</span>
|
|
||||||
}
|
|
||||||
</div>
|
|
||||||
)
|
|
||||||
},
|
|
||||||
{
|
|
||||||
label: '实际新产品(项)',
|
|
||||||
prop: 'actualNewProduct',
|
|
||||||
colProps: {
|
|
||||||
span: 6
|
|
||||||
},
|
|
||||||
labelWidth: 'left',
|
|
||||||
component: () => (
|
|
||||||
<div>
|
|
||||||
{
|
|
||||||
props.formData.actualNewProduct ? props.formData.actualNewProduct : props.formData.actualNewProduct==0?0:<span>{'--'}</span>
|
|
||||||
}
|
|
||||||
</div>
|
|
||||||
)
|
|
||||||
},
|
|
||||||
{
|
|
||||||
label: '实际新工艺(项)',
|
|
||||||
prop: 'actualNewProcess',
|
|
||||||
colProps: {
|
|
||||||
span: 6
|
|
||||||
},
|
|
||||||
labelWidth: 'left',
|
|
||||||
component: () => (
|
|
||||||
<div>
|
|
||||||
{
|
|
||||||
props.formData.actualNewProcess ? props.formData.actualNewProcess : props.formData.actualNewProcess==0?0: <span>{'--'}</span>
|
|
||||||
}
|
|
||||||
</div>
|
|
||||||
)
|
|
||||||
},
|
|
||||||
{
|
|
||||||
label: '实际新装置(项)',
|
|
||||||
prop: 'actualNewDevice',
|
|
||||||
colProps: {
|
|
||||||
span: 6
|
|
||||||
},
|
|
||||||
labelWidth: 'left',
|
|
||||||
component: () => (
|
|
||||||
<div>
|
|
||||||
{
|
|
||||||
props.formData.actualNewDevice ? props.formData.actualNewDevice :props.formData.actualNewDevice==0?0: <span>{'--'}</span>
|
|
||||||
}
|
|
||||||
</div>
|
|
||||||
)
|
|
||||||
},
|
|
||||||
{
|
|
||||||
label: '实际新材料(项)',
|
|
||||||
prop: 'actualNewMaterials',
|
|
||||||
colProps: {
|
|
||||||
span: 6
|
|
||||||
},
|
|
||||||
labelWidth: 'left',
|
|
||||||
component: () => (
|
|
||||||
<div>
|
|
||||||
{
|
|
||||||
props.formData.actualNewMaterials ? props.formData.actualNewMaterials : props.formData.actualNewMaterials==0?0: <span>{'--'}</span>
|
|
||||||
}
|
|
||||||
</div>
|
|
||||||
)
|
|
||||||
},
|
|
||||||
{
|
|
||||||
label: '实际计算机软件(项)',
|
|
||||||
prop: 'actualComputerSoftware',
|
|
||||||
colProps: {
|
|
||||||
span: 6
|
|
||||||
},
|
|
||||||
labelWidth: 'left',
|
|
||||||
component: () => (
|
|
||||||
<div>
|
|
||||||
{
|
|
||||||
props.formData.actualComputerSoftware ? props.formData.actualComputerSoftware : props.formData.actualComputerSoftware==0?0:<span>{'--'}</span>
|
|
||||||
}
|
|
||||||
</div>
|
|
||||||
)
|
|
||||||
},
|
|
||||||
{
|
|
||||||
label: '实际论文论著(项)',
|
|
||||||
prop: 'actualThesis',
|
|
||||||
colProps: {
|
|
||||||
span: 6
|
|
||||||
},
|
|
||||||
labelWidth: 'left',
|
|
||||||
component: () => (
|
|
||||||
<div>
|
|
||||||
{
|
|
||||||
props.formData.actualThesis ? props.formData.actualThesis : props.formData.actualThesis==0?0:<span>{'--'}</span>
|
|
||||||
}
|
|
||||||
</div>
|
|
||||||
)
|
|
||||||
},
|
|
||||||
{
|
|
||||||
label: '实际研究报告(项)',
|
|
||||||
prop: 'actualResearchReport',
|
|
||||||
colProps: {
|
|
||||||
span: 6
|
|
||||||
},
|
|
||||||
labelWidth: 'left',
|
|
||||||
component: () => (
|
|
||||||
<div>
|
|
||||||
{
|
|
||||||
props.formData.actualResearchReport ? props.formData.actualResearchReport : props.formData.actualResearchReport==0?0: <span>{'--'}</span>
|
|
||||||
}
|
|
||||||
</div>
|
|
||||||
)
|
|
||||||
},
|
|
||||||
{
|
|
||||||
label: '实际商标(项)',
|
|
||||||
prop: 'actualTrademark',
|
|
||||||
colProps: {
|
|
||||||
span: 6
|
|
||||||
},
|
|
||||||
labelWidth: 'left',
|
|
||||||
component: () => (
|
|
||||||
<div>
|
|
||||||
{
|
|
||||||
props.formData.actualTrademark ? props.formData.actualTrademark :props.formData.actualTrademark==0?0: <span>{'--'}</span>
|
|
||||||
}
|
|
||||||
</div>
|
|
||||||
)
|
|
||||||
},
|
|
||||||
{
|
|
||||||
label: '实际其他(项)',
|
|
||||||
prop: 'actualOther',
|
|
||||||
colProps: {
|
|
||||||
span: 24
|
|
||||||
},
|
|
||||||
labelWidth: 'left',
|
|
||||||
component: () => (
|
|
||||||
<div style="white-space: pre-wrap;">
|
|
||||||
{
|
|
||||||
props.formData.actualOther ? props.formData.actualOther : props.formData.actualOther==0?0: <span>{'--'}</span>
|
|
||||||
}
|
|
||||||
</div>
|
|
||||||
)
|
|
||||||
},
|
|
||||||
|
|
||||||
{
|
|
||||||
label: '部门分管领导',
|
label: '部门分管领导',
|
||||||
prop: 'optionalChargeLeadership',
|
prop: 'optionalChargeLeadership',
|
||||||
colProps: {
|
colProps: {
|
||||||
@@ -489,8 +295,7 @@ const schema = computed(() => {
|
|||||||
}
|
}
|
||||||
</div>
|
</div>
|
||||||
)
|
)
|
||||||
}
|
},]
|
||||||
]
|
|
||||||
|
|
||||||
if (props.preProcessShow == 'EDIT') {
|
if (props.preProcessShow == 'EDIT') {
|
||||||
preProcess = {
|
preProcess = {
|
||||||
@@ -576,7 +381,7 @@ const filePreviewParam = ref({
|
|||||||
})
|
})
|
||||||
const filePreviewShow = ref(false)
|
const filePreviewShow = ref(false)
|
||||||
const route = useRoute()
|
const route = useRoute()
|
||||||
const emit = defineEmits(['update:value', 'ccSend'])
|
const emit = defineEmits(['update:value'])
|
||||||
const _value = computed({
|
const _value = computed({
|
||||||
get() {
|
get() {
|
||||||
return props.value;
|
return props.value;
|
||||||
@@ -585,40 +390,6 @@ const _value = computed({
|
|||||||
emit("update:value", val);
|
emit("update:value", val);
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
const handleCarbonCopy = () => {
|
|
||||||
carbonCopyUserRef.value.showUserPicker()
|
|
||||||
}
|
|
||||||
const carbonCopyUserPickerOk = (userList) => {
|
|
||||||
carbonCopyUserList.value = userList.map(item => item.id)
|
|
||||||
console.log('localFormData.value', props.data)
|
|
||||||
console.log("🚀 ~ file:'carbonCopyUserList.value ", carbonCopyUserList.value)
|
|
||||||
|
|
||||||
addUser()
|
|
||||||
}
|
|
||||||
const addUser = async () => {
|
|
||||||
const res = await applyCcSend({
|
|
||||||
instanceId: props.data.processInstanceId,
|
|
||||||
// message:props.data.remark,
|
|
||||||
projectId: route.query.projectId,
|
|
||||||
state: route.query.step,
|
|
||||||
userIds: carbonCopyUserList.value
|
|
||||||
})
|
|
||||||
console.log('res', res)
|
|
||||||
if (res.code === 1000) {
|
|
||||||
ElNotification({
|
|
||||||
title: '提示',
|
|
||||||
message: '抄送成功',
|
|
||||||
type: 'success'
|
|
||||||
})
|
|
||||||
emit('ccSend')
|
|
||||||
} else {
|
|
||||||
ElNotification({
|
|
||||||
title: '提示',
|
|
||||||
message: res.msg,
|
|
||||||
type: 'error'
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
const clickToPreview = (row) => {
|
const clickToPreview = (row) => {
|
||||||
filePreviewShow.value = false
|
filePreviewShow.value = false
|
||||||
filePreviewParam.value = {
|
filePreviewParam.value = {
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
<el-form-item :label="title" v-if="fileListShow === 'READ' || fileListShow === 'EDIT'" :label-position="labelAlign" :style="{marginTop: '10px',marginLeft: tag!=='需求上报'?'15px':'0'}">
|
<el-form-item :label="title" v-if="fileListShow === 'READ' || fileListShow === 'EDIT'" :label-position="labelAlign" :style="{marginTop: '10px',marginLeft: tag!=='需求上报'?'15px':'0'}">
|
||||||
<file-upload @getFile="getOtherFile" v-if="fileListShow === 'EDIT'"/>
|
<file-upload @getFile="getOtherFile" v-if="fileListShow === 'EDIT'"/>
|
||||||
<!-- :style="{width:isOpenPrint?'610px': '100%'}" table-layout="auto" id="printTable"-->
|
<!-- :style="{width:isOpenPrint?'610px': '100%'}" table-layout="auto" id="printTable"-->
|
||||||
<fvTable style="width:100%;" :height="tag=='项目立项'?'160':'160'" :style="{maxHeight:tag=='项目立项'?'160px':'160px',height:tag=='项目立项'?'160px':'160px'}" v-if="processViewer" :scrollbar-always-on="true" :tableConfig="tableConfig"
|
<fvTable style="width:100%;max-height: 160px;" v-if="processViewer" height="160" :tableConfig="tableConfig"
|
||||||
:data="_value" :isSettingCol="false" :pagination="false">
|
:data="_value" :isSettingCol="false" :pagination="false">
|
||||||
<template #empty>
|
<template #empty>
|
||||||
<el-empty :image-size="55" description="暂无数据" style="padding: 0"/>
|
<el-empty :image-size="55" description="暂无数据" style="padding: 0"/>
|
||||||
@@ -81,9 +81,7 @@ const tableConfig = reactive({
|
|||||||
{
|
{
|
||||||
prop: 'tag',
|
prop: 'tag',
|
||||||
label: '标签',
|
label: '标签',
|
||||||
align: 'center',
|
align: 'center'
|
||||||
showOverflowTooltip: false,
|
|
||||||
minWidth: props.fileNameTableWidth,
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
prop: 'size',
|
prop: 'size',
|
||||||
|
|||||||
@@ -206,14 +206,6 @@ const rollbackHandler = async () => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
const handleAgree = async () => {
|
const handleAgree = async () => {
|
||||||
if (!_value.value) {
|
|
||||||
ElNotification({
|
|
||||||
title: '提示',
|
|
||||||
message: '请填写审核意见',
|
|
||||||
type: 'warning'
|
|
||||||
})
|
|
||||||
return
|
|
||||||
}
|
|
||||||
// const values = form.value.getValues()
|
// const values = form.value.getValues()
|
||||||
const params = {
|
const params = {
|
||||||
taskId: props.taskId,
|
taskId: props.taskId,
|
||||||
|
|||||||
@@ -1,101 +1,11 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="apply-block">
|
<div class="apply-block">
|
||||||
<baseTitle :title="getTitleName(title)+'信息'"></baseTitle>
|
<baseTitle :title="getTitleName(title)+'信息'"></baseTitle>
|
||||||
<el-form :model="localFormData" ref="formRef" label-width="auto" v-if="step!=='50'" :rules="rules">
|
<el-form :model="localFormData" ref="formRef" label-width="auto" v-if="step!=='50'">
|
||||||
<el-row v-if="title==='apply'">
|
|
||||||
<el-col :span="6">
|
|
||||||
<!-- label-width="106"-->
|
|
||||||
<el-form-item label="实际经费预算(元)" prop="actualEconomicEstimate" label-width="130">
|
|
||||||
<el-input-number v-model="localFormData.actualEconomicEstimate" placeholder="请输入实际经费预算" :controls="false">
|
|
||||||
</el-input-number>
|
|
||||||
</el-form-item>
|
|
||||||
</el-col>
|
|
||||||
<el-col :span="6" v-if="isSpecialFund">
|
|
||||||
<!-- label-width="106" -->
|
|
||||||
<el-form-item label="实际专项资金(元)" prop="specialFundAmount" label-width="140">
|
|
||||||
<el-input-number v-model="localFormData.specialFundAmount" placeholder="请输入实际专项资金" :controls="false">
|
|
||||||
</el-input-number>
|
|
||||||
</el-form-item>
|
|
||||||
</el-col>
|
|
||||||
</el-row>
|
|
||||||
<el-row v-if="title==='check'">
|
|
||||||
<el-col :span="6">
|
|
||||||
<el-form-item label="实际专利(项)" prop="actualNewPatent" label-width="130">
|
|
||||||
<el-input-number v-model="localFormData.actualNewPatent" placeholder="请输入实际专利数量" style="margin-right: 20px" :controls="false">
|
|
||||||
</el-input-number>
|
|
||||||
</el-form-item>
|
|
||||||
</el-col>
|
|
||||||
<el-col :span="6" style="margin-left: -10px">
|
|
||||||
<el-form-item label="实际软件著作权(项)" prop="actualSoftwareCopyright" label-width="150">
|
|
||||||
<el-input-number v-model="localFormData.actualSoftwareCopyright" placeholder="请输入实际软件著作权数量":controls="false">
|
|
||||||
</el-input-number>
|
|
||||||
</el-form-item>
|
|
||||||
</el-col>
|
|
||||||
<el-col :span="6" style="margin-left: -5px">
|
|
||||||
<el-form-item label="实际技术标准(项)" prop="actualTechnicalNorms" label-width="150">
|
|
||||||
<el-input-number v-model="localFormData.actualTechnicalNorms" placeholder="请输入实际技术标准数量":controls="false">
|
|
||||||
</el-input-number>
|
|
||||||
</el-form-item>
|
|
||||||
</el-col>
|
|
||||||
<el-col :span="6">
|
|
||||||
<el-form-item label="实际新产品(项)" prop="actualNewProduct" label-width="160" style="margin-right: -10px">
|
|
||||||
<el-input-number v-model="localFormData.actualNewProduct" placeholder="请输入实际新产品数量" :controls="false">
|
|
||||||
</el-input-number>
|
|
||||||
</el-form-item>
|
|
||||||
</el-col>
|
|
||||||
<el-col :span="6">
|
|
||||||
<el-form-item label="实际新工艺(项)" prop="actualNewProcess" label-width="130" >
|
|
||||||
<el-input-number v-model="localFormData.actualNewProcess" placeholder="请输入实际新工艺数量" style="margin-right: 20px" :controls="false">
|
|
||||||
</el-input-number>
|
|
||||||
</el-form-item>
|
|
||||||
</el-col>
|
|
||||||
<el-col :span="6" style="margin-left: -10px">
|
|
||||||
<el-form-item label="实际新装置(项)" prop="actualNewDevice" label-width="150">
|
|
||||||
<el-input-number v-model="localFormData.actualNewDevice" placeholder="请输入实际新装置数量" :controls="false">
|
|
||||||
</el-input-number>
|
|
||||||
</el-form-item>
|
|
||||||
</el-col>
|
|
||||||
<el-col :span="6" style="margin-left: -5px">
|
|
||||||
<el-form-item label="实际新材料(项)" prop="actualNewMaterials" label-width="150">
|
|
||||||
<el-input-number v-model="localFormData.actualNewMaterials" placeholder="请输入实际新材料数量" :controls="false">
|
|
||||||
</el-input-number>
|
|
||||||
</el-form-item>
|
|
||||||
</el-col>
|
|
||||||
<el-col :span="6">
|
|
||||||
<el-form-item label="实际计算机软件(项)" prop="actualComputerSoftware" label-width="160" style="margin-right: -10px">
|
|
||||||
<el-input-number v-model="localFormData.actualComputerSoftware" placeholder="请输入实际计算机软件数量" :controls="false">
|
|
||||||
</el-input-number>
|
|
||||||
</el-form-item>
|
|
||||||
</el-col>
|
|
||||||
<el-col :span="6">
|
|
||||||
<el-form-item label="实际论文论著(项)" prop="actualThesis" label-width="130" style="margin-right: 20px">
|
|
||||||
<el-input-number v-model="localFormData.actualThesis" placeholder="请输入实际论文论著数量" :controls="false">
|
|
||||||
</el-input-number>
|
|
||||||
</el-form-item>
|
|
||||||
</el-col>
|
|
||||||
<el-col :span="6" style="margin-left: -10px">
|
|
||||||
<el-form-item label="实际研究报告(项)" prop="actualResearchReport" label-width="150">
|
|
||||||
<el-input-number v-model="localFormData.actualResearchReport" placeholder="请输入实际研究报告数量" :controls="false">
|
|
||||||
</el-input-number>
|
|
||||||
</el-form-item>
|
|
||||||
</el-col>
|
|
||||||
<el-col :span="6" style="margin-left: -5px">
|
|
||||||
<el-form-item label="实际商标(项)" prop="actualTrademark" label-width="150">
|
|
||||||
<el-input-number v-model="localFormData.actualTrademark" placeholder="请输入实际商标数量" :controls="false">
|
|
||||||
</el-input-number>
|
|
||||||
</el-form-item>
|
|
||||||
</el-col>
|
|
||||||
<el-col :span="24">
|
|
||||||
<el-form-item label="实际其他(项)" prop="actualOther" label-width="130" style="margin-right: 10px">
|
|
||||||
<el-input rows="4" type="textarea" v-model="localFormData.actualOther" placeholder="请输入实际其他项" >
|
|
||||||
</el-input>
|
|
||||||
</el-form-item>
|
|
||||||
</el-col>
|
|
||||||
</el-row>
|
|
||||||
<el-row>
|
<el-row>
|
||||||
<el-col :span="6" v-if="title==='apply'">
|
<el-col :span="6" v-if="title==='apply'">
|
||||||
<!-- label-width="106"-->
|
<!-- label-width="106"-->
|
||||||
<el-form-item label="项目负责人" :required="true" prop="" label-width="130">
|
<el-form-item label="项目负责人" :required="true" prop="" label-width="111">
|
||||||
<el-button style="margin-right: 10px" color="#DED0B2" @click="handleShowProjectChargePersonTable">
|
<el-button style="margin-right: 10px" color="#DED0B2" @click="handleShowProjectChargePersonTable">
|
||||||
{{ projectChargePersonUserList?.length !== 0 ? '更改' : '请选择' }}
|
{{ projectChargePersonUserList?.length !== 0 ? '更改' : '请选择' }}
|
||||||
</el-button>
|
</el-button>
|
||||||
@@ -103,66 +13,56 @@
|
|||||||
{{ item.name }}
|
{{ item.name }}
|
||||||
</div>
|
</div>
|
||||||
<user-picker :multiple="false" ref="projectChargePersonUserPicker" title="请选择项目负责人"
|
<user-picker :multiple="false" ref="projectChargePersonUserPicker" title="请选择项目负责人"
|
||||||
v-model:value="projectChargePersonUserList" @ok="projectChargePersonUserPickerOk"
|
v-model:value="projectChargePersonUserList" @ok="projectChargePersonUserPickerOk" @cancelOrClear="projectChargePersonUserPickerCancel"/>
|
||||||
@cancelOrClear="projectChargePersonUserPickerCancel"/>
|
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-col>
|
</el-col>
|
||||||
<el-col :span="6" v-if="title==='apply'">
|
<el-col :span="6" v-if="title==='apply'">
|
||||||
<el-form-item label="项目成员" :required="true" prop="" label-width="140"
|
<el-form-item label="项目成员" :required="true" prop="" label-width="85"
|
||||||
>
|
>
|
||||||
<el-button color="#DED0B2" style="margin-right: 10px" @click="handleShowProjectPersonTable">
|
<el-button color="#DED0B2" style="margin-right: 10px" @click="handleShowProjectPersonTable">
|
||||||
{{
|
{{ projectPersonUserList?.length !== 0 ? '更改' : getProjectPerson(projectPersonUserList) ? '更改' : '请选择' }}
|
||||||
projectPersonUserList?.length !== 0 ? '更改' : getProjectPerson(projectPersonUserList) ? '更改' : '请选择'
|
|
||||||
}}
|
|
||||||
</el-button>
|
</el-button>
|
||||||
<div v-for="(item,index) in getProjectPerson(projectPersonUserList)" :key="item.id">
|
<div v-for="(item,index) in getProjectPerson(projectPersonUserList)" :key="item.id" >
|
||||||
{{ item.name }}{{ index != getProjectPerson(projectPersonUserList)?.length - 1 ? ',' : '' }}
|
{{ item.name }}{{index != getProjectPerson(projectPersonUserList)?.length - 1 ? ',' : ''}}
|
||||||
</div>
|
</div>
|
||||||
<user-picker :multiple="true" ref="projectPersonUserPicker" title="请选择项目成员"
|
<user-picker :multiple="true" ref="projectPersonUserPicker" title="请选择项目成员"
|
||||||
v-model:value="projectPersonUserList" @ok="projectPersonUserPickerOk"
|
v-model:value="projectPersonUserList" @ok="projectPersonUserPickerOk" @cancelOrClear="projectPersonUserPickerCancel"/>
|
||||||
@cancelOrClear="projectPersonUserPickerCancel"/>
|
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-col>
|
</el-col>
|
||||||
<el-col :span="6" v-if="title==='apply'||title==='check'">
|
<el-col :span="6" v-if="title==='apply'||title==='check'">
|
||||||
<el-form-item label="部门分管领导" :label-width="title==='check'?130:115" :required="isKcjUser()">
|
<el-form-item label="部门分管领导" :label-width="title==='check'?110:115">
|
||||||
<el-button color="#DED0B2" style="margin-right: 10px" @click="handleShowOptionalChargeLeadershipPicker">
|
<el-button color="#DED0B2" style="margin-right: 10px" @click="handleShowOptionalChargeLeadershipPicker">
|
||||||
{{
|
{{
|
||||||
optionalChargeLeadershipList?.length !== 0 ? '更改' : getOptionalChargeLeadershipList(optionalChargeLeadershipList) ? '更改' : '请选择'
|
optionalChargeLeadershipList?.length !== 0 ? '更改' : getOptionalChargeLeadershipList(optionalChargeLeadershipList) ? '更改' : '请选择'
|
||||||
}}
|
}}
|
||||||
</el-button>
|
</el-button>
|
||||||
<div v-for="(item,index) in getOptionalChargeLeadershipList(optionalChargeLeadershipList)" :key="item.id">
|
<div v-for="(item,index) in getOptionalChargeLeadershipList(optionalChargeLeadershipList)" :key="item.id">
|
||||||
{{
|
{{ item.name }}{{index != getOptionalChargeLeadershipList(optionalChargeLeadershipList)?.length - 1 ? ',' : ''}}
|
||||||
item.name
|
|
||||||
}}{{ index != getOptionalChargeLeadershipList(optionalChargeLeadershipList)?.length - 1 ? ',' : '' }}
|
|
||||||
</div>
|
</div>
|
||||||
<user-picker :multiple="true" ref="optionalChargeLeadershipPickerRef" title="请选择部门分管领导"
|
<user-picker :multiple="true" ref="optionalChargeLeadershipPickerRef" title="请选择部门分管领导"
|
||||||
v-model:value="optionalChargeLeadershipList" @ok="optionalChargeLeaderPickerOk"
|
v-model:value="optionalChargeLeadershipList" @ok="optionalChargeLeaderPickerOk" @cancelOrClear="optionalChargeLeaderPickerCancel"/>
|
||||||
@cancelOrClear="optionalChargeLeaderPickerCancel"/>
|
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-col>
|
</el-col>
|
||||||
<el-col :span="24" v-if="preProcessShow === 'EDIT'||title==='apply'||title==='check'">
|
<el-col :span="24" v-if="preProcessShow === 'EDIT'">
|
||||||
<el-form-item label="前置流程" :required="preProcessRequired" prop="preProcess" :label-width="title==='apply'?130:125">
|
<el-form-item label="前置流程" :required="preProcessRequired" prop="preProcess" label-width="125">
|
||||||
<select-pre-process :formData="localFormData" :basicData="basicData"/>
|
<el-button color="#DED0B2" @click="handleShowPreTable" style="margin-right: 10px">
|
||||||
<!-- <el-button color="#DED0B2" @click="handleShowPreTable" style="margin-right: 10px">-->
|
{{
|
||||||
<!-- {{-->
|
localFormData.preProcess && localFormData.preProcess?.length > 0 ? '更改' : sessionParams.preProcess && sessionParams.preProcess?.length > 0 ? '更改' : '请选择'
|
||||||
<!-- localFormData.preProcess && localFormData.preProcess?.length > 0 ? '更改' : sessionParams.preProcess && sessionParams.preProcess?.length > 0 ? '更改' : '请选择'-->
|
}}
|
||||||
<!-- }}-->
|
</el-button>
|
||||||
<!-- </el-button>-->
|
<div v-for="(item,index) in getRequestName(localFormData.preProcess)" :key="item.requestId">
|
||||||
<!-- <div v-for="(item,index) in getRequestName(localFormData.preProcess)" :key="item.requestId">-->
|
<a :href="item.baseUrl" target="_blank"
|
||||||
<!-- <a :href="item.baseUrl" target="_blank"-->
|
style="color: #2a99ff;cursor: pointer">{{ item.requestName }}<span
|
||||||
<!-- style="color: #2a99ff;cursor: pointer">{{ item.requestName }}<span-->
|
v-if="index != localFormData.preProcess?.length -1">,</span>
|
||||||
<!-- v-if="index != localFormData.preProcess?.length -1">,</span>-->
|
</a>
|
||||||
<!-- </a>-->
|
</div>
|
||||||
<!-- </div>-->
|
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-col>
|
</el-col>
|
||||||
</el-row>
|
</el-row>
|
||||||
</el-form>
|
</el-form>
|
||||||
<!-- v-if="showAttachment"-->
|
<!-- v-if="showAttachment"-->
|
||||||
<AttachmentUpload ref="attachment" :label="getTitleName(title)+'附件'" :showTable="showTable"
|
<AttachmentUpload ref="attachment" :label="getTitleName(title)+'附件'" :showTable="showTable"
|
||||||
v-model:otherFileList="otherFileList" :tag="getTitleName(props.title)"
|
v-model:otherFileList="otherFileList" :tag="getTitleName(props.title)" :templateName="getTemplateName(props.title)" :templateDownloadBtnShow="props.title==='apply'?true:props.title==='check'"
|
||||||
:templateName="getTemplateName(props.title)"
|
|
||||||
:templateDownloadBtnShow="props.title==='apply'?true:props.title==='check'"
|
|
||||||
@getAttachment="getAttachment" v-model:singleList="singleList" :showSingleTable="showSingleTable"
|
@getAttachment="getAttachment" v-model:singleList="singleList" :showSingleTable="showSingleTable"
|
||||||
@getOtherFile="getOtherFile" :showFileList="true" :formData="localFormData"
|
@getOtherFile="getOtherFile" :showFileList="true" :formData="localFormData"
|
||||||
:preview="mode == 'resubmit'"/>
|
:preview="mode == 'resubmit'"/>
|
||||||
@@ -191,8 +91,8 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="oper-page-btn">
|
<div class="oper-page-btn">
|
||||||
<el-button color="#DED0B2" v-if="mode === 'submit'" @click="handleSubmit(formRef)">提交</el-button>
|
<el-button color="#DED0B2" v-if="mode === 'submit'" @click="handleSubmit">提交</el-button>
|
||||||
<el-button color="#DED0B2" v-else-if="mode === 'resubmit'" @click="handleSubmit(formRef)">重新提交</el-button>
|
<el-button color="#DED0B2" v-else-if="mode === 'resubmit'" @click="handleSubmit">重新提交</el-button>
|
||||||
<el-button @click="handleBack">返回</el-button>
|
<el-button @click="handleBack">返回</el-button>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@@ -202,8 +102,8 @@
|
|||||||
<el-dialog v-if="showPreTable" title="前置流程" v-model="showPreTable" width="80%">
|
<el-dialog v-if="showPreTable" title="前置流程" v-model="showPreTable" width="80%">
|
||||||
<el-form :model="preProcessForm" inline @submit.prevent="searchPreProcess">
|
<el-form :model="preProcessForm" inline @submit.prevent="searchPreProcess">
|
||||||
<el-form-item label="请求名称">
|
<el-form-item label="请求名称">
|
||||||
<el-input-number v-model="preProcessForm.requestName" placeholder="请输入请求名称" clearable>
|
<el-input v-model="preProcessForm.requestName" placeholder="请输入请求名称" clearable>
|
||||||
</el-input-number>
|
</el-input>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item>
|
<el-form-item>
|
||||||
<el-button color="#DED0B2" @click="searchPreProcess">搜索</el-button>
|
<el-button color="#DED0B2" @click="searchPreProcess">搜索</el-button>
|
||||||
@@ -240,7 +140,7 @@
|
|||||||
<script setup lang="jsx">
|
<script setup lang="jsx">
|
||||||
import OperationRender from '@/views/workflow/common/OperationRender.vue'
|
import OperationRender from '@/views/workflow/common/OperationRender.vue'
|
||||||
import ProcessDiagramViewer from '@/views/workflow/common/ProcessDiagramViewer.vue';
|
import ProcessDiagramViewer from '@/views/workflow/common/ProcessDiagramViewer.vue';
|
||||||
import {ElLoading, ElNotification} from "element-plus";
|
import {ElNotification} from "element-plus";
|
||||||
import {
|
import {
|
||||||
getApplyProcess,
|
getApplyProcess,
|
||||||
getPreProcess,
|
getPreProcess,
|
||||||
@@ -257,14 +157,9 @@ import {useProcessStore} from '@/stores/processStore.js';
|
|||||||
import {useTagsView} from '@/stores/tagsview.js'
|
import {useTagsView} from '@/stores/tagsview.js'
|
||||||
import Paging from "@/components/pagination/index.vue";
|
import Paging from "@/components/pagination/index.vue";
|
||||||
import UserPicker from "@/views/workflow/process/common/UserPicker.vue";
|
import UserPicker from "@/views/workflow/process/common/UserPicker.vue";
|
||||||
import {getBaseInfoApi, getMapProjectStateInfo} from "@/components/steps/api";
|
|
||||||
import {useAuthStore} from "@/stores/userstore";
|
|
||||||
|
|
||||||
const authStore = useAuthStore()
|
|
||||||
const userInfo =ref( authStore.userinfo)
|
|
||||||
const router = useRouter()
|
const router = useRouter()
|
||||||
const route = useRoute()
|
const route = useRoute()
|
||||||
const formRef = ref()
|
|
||||||
const changeDiagram = ref(false)
|
const changeDiagram = ref(false)
|
||||||
const showSingleTable = ref(false)
|
const showSingleTable = ref(false)
|
||||||
const projectChargePersonUserList = ref([])
|
const projectChargePersonUserList = ref([])
|
||||||
@@ -291,10 +186,6 @@ const props = defineProps({
|
|||||||
type: Object,
|
type: Object,
|
||||||
default: {}
|
default: {}
|
||||||
},
|
},
|
||||||
basicData: {
|
|
||||||
type: Object,
|
|
||||||
default: {}
|
|
||||||
},
|
|
||||||
formData: {
|
formData: {
|
||||||
type: Object,
|
type: Object,
|
||||||
default: {}
|
default: {}
|
||||||
@@ -320,24 +211,11 @@ const pageInfo = reactive({
|
|||||||
pageNum: 1,
|
pageNum: 1,
|
||||||
pageSize: 10,
|
pageSize: 10,
|
||||||
})
|
})
|
||||||
const rules = reactive({
|
// const rules = reactive({
|
||||||
actualEconomicEstimate: [{required: true, message: '请输入实际经费预算', trigger: ['blur', 'change']}],
|
// preProcess: [{required: true, message: '请选择前置流程', trigger: 'blur'}],
|
||||||
specialFundAmount: [{required: true, message: '请输入实际专项资金', trigger: 'blur'}],
|
// projectChargePerson: [{required: true, message: '请选择项目负责人', trigger: 'blur'}],
|
||||||
// projectPerson: [{required: true, message: '请选择项目成员', trigger: 'blur'}],
|
// projectPerson: [{required: true, message: '请选择项目成员', trigger: 'blur'}],
|
||||||
actualNewPatent: [{required: true, message: '请输入实际专利数量', trigger: ['blur', 'change']}],
|
// })
|
||||||
actualTechnicalNorms: [{required: true, message: '请输入实际技术标准数量', trigger: ['blur', 'change']}],
|
|
||||||
actualSoftwareCopyright: [{required: true, message: '请输入实际软件著作权数量', trigger: ['blur', 'change']}],
|
|
||||||
actualNewProduct: [{required: true, message: '请输入实际新产品数量', trigger: ['blur', 'change']}],
|
|
||||||
actualNewProcess: [{required: true, message: '请输入实际新工艺数量', trigger: ['blur', 'change']}],
|
|
||||||
actualNewMaterials: [{required: true, message: '请输入实际新材料数量', trigger: ['blur', 'change']}],
|
|
||||||
actualNewDevice: [{required: true, message: '请输入实际新装置数量', trigger: ['blur', 'change']}],
|
|
||||||
actualComputerSoftware: [{required: true, message: '请输入实际计算机软件数量', trigger: ['blur', 'change']}],
|
|
||||||
actualThesis: [{required: true, message: '请输入实际论文论著数量', trigger: ['blur', 'change']}],
|
|
||||||
actualResearchReport: [{required: true, message: '请输入实际研究报告数量', trigger: ['blur', 'change']}],
|
|
||||||
actualTrademark: [{required: true, message: '请输入实际商标数量', trigger: ['blur', 'change']}],
|
|
||||||
actualOther: [{required: true, message: '请输入实际其他项数量', trigger: ['blur', 'change']}],
|
|
||||||
|
|
||||||
})
|
|
||||||
const tagsViewStore = useTagsView()
|
const tagsViewStore = useTagsView()
|
||||||
const processStore = useProcessStore()
|
const processStore = useProcessStore()
|
||||||
const localProjectPerson = ref([])
|
const localProjectPerson = ref([])
|
||||||
@@ -365,7 +243,6 @@ const selectRows = ref([])
|
|||||||
const projectId = ref(route.query.projectId)
|
const projectId = ref(route.query.projectId)
|
||||||
const sessionParams = ref({})
|
const sessionParams = ref({})
|
||||||
const optionalChargeLeadershipPickerRef = ref()
|
const optionalChargeLeadershipPickerRef = ref()
|
||||||
const isSpecialFund = ref(false)
|
|
||||||
const optionalChargeLeadershipList = ref([])
|
const optionalChargeLeadershipList = ref([])
|
||||||
const filePreviewParam = ref({
|
const filePreviewParam = ref({
|
||||||
fileUrl: '',
|
fileUrl: '',
|
||||||
@@ -373,55 +250,8 @@ const filePreviewParam = ref({
|
|||||||
fileType: 'pdf'
|
fileType: 'pdf'
|
||||||
})
|
})
|
||||||
const filePreviewShow = ref(false)
|
const filePreviewShow = ref(false)
|
||||||
const isKcjUser=()=>{
|
|
||||||
const hasDstiAdmin = userInfo.value.roles?.some(item => item.roleKey != 'dsti_admin');
|
|
||||||
return hasDstiAdmin;
|
|
||||||
}
|
|
||||||
const getSummaryInfo = async () => {
|
|
||||||
if (props.mode === 'resubmit') return;
|
|
||||||
if(props.title === 'check'){
|
|
||||||
const loading = ElLoading.service({fullscreen: true})
|
|
||||||
try {
|
|
||||||
const projectId = route.query.projectId
|
|
||||||
const {code, data, msg} = await getMapProjectStateInfo(projectId, '10')
|
|
||||||
if (code === 1000) {
|
|
||||||
localFormData.value.actualNewPatent= data.formData.newPatent
|
|
||||||
localFormData.value.actualSoftwareCopyright= data.formData.softwareCopyright
|
|
||||||
localFormData.value.actualTechnicalNorms= data.formData.technicalNorms
|
|
||||||
localFormData.value.actualNewProduct= data.formData.newProduct
|
|
||||||
localFormData.value.actualNewProcess= data.formData.newProcess
|
|
||||||
localFormData.value.actualNewDevice= data.formData.newDevice
|
|
||||||
localFormData.value.actualNewMaterials= data.formData.newMaterials
|
|
||||||
localFormData.value.actualComputerSoftware= data.formData.computerSoftware
|
|
||||||
localFormData.value.actualThesis= data.formData.thesis
|
|
||||||
localFormData.value.actualResearchReport= data.formData.researchReport
|
|
||||||
localFormData.value.actualTrademark= data.formData.trademark
|
|
||||||
localFormData.value.actualOther= data.formData.other
|
|
||||||
|
|
||||||
loading.close()
|
const getTemplateName=(type)=>{
|
||||||
} else {
|
|
||||||
ElNotification({
|
|
||||||
title: '提示',
|
|
||||||
message: msg,
|
|
||||||
type: 'error'
|
|
||||||
})
|
|
||||||
|
|
||||||
loading.close()
|
|
||||||
}
|
|
||||||
} catch {
|
|
||||||
loading.close()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
getSummaryInfo()
|
|
||||||
|
|
||||||
const getInfo = async () => {
|
|
||||||
|
|
||||||
const {code, data} = await getBaseInfoApi(route.query.projectId)
|
|
||||||
isSpecialFund.value = data.isSpecialFund
|
|
||||||
}
|
|
||||||
getInfo()
|
|
||||||
const getTemplateName = (type) => {
|
|
||||||
switch (type) {
|
switch (type) {
|
||||||
case 'apply':
|
case 'apply':
|
||||||
return '科技创新项目立项模板'
|
return '科技创新项目立项模板'
|
||||||
@@ -436,9 +266,9 @@ const handleShowOptionalChargeLeadershipPicker = () => {
|
|||||||
|
|
||||||
const optionalChargeLeaderPickerOk = (userList) => {
|
const optionalChargeLeaderPickerOk = (userList) => {
|
||||||
optionalChargeLeadershipList.value = userList
|
optionalChargeLeadershipList.value = userList
|
||||||
if (userList?.length > 0) {
|
if(userList?.length>0){
|
||||||
localStorage.setItem('optionalChargeLeadershipList', JSON.stringify(optionalChargeLeadershipList.value))
|
localStorage.setItem('optionalChargeLeadershipList', JSON.stringify(optionalChargeLeadershipList.value))
|
||||||
} else {
|
}else {
|
||||||
localStorage.removeItem('optionalChargeLeadershipList')
|
localStorage.removeItem('optionalChargeLeadershipList')
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -517,27 +347,27 @@ const handleShowProjectChargePersonTable = () => {
|
|||||||
}
|
}
|
||||||
const projectChargePersonUserPickerOk = (userList) => {
|
const projectChargePersonUserPickerOk = (userList) => {
|
||||||
projectChargePersonUserList.value = userList
|
projectChargePersonUserList.value = userList
|
||||||
if (userList?.length > 0) {
|
if(userList?.length>0){
|
||||||
localStorage.setItem('projectChargePersonUserList', JSON.stringify(projectChargePersonUserList.value))
|
localStorage.setItem('projectChargePersonUserList', JSON.stringify(projectChargePersonUserList.value))
|
||||||
} else {
|
}else {
|
||||||
localStorage.removeItem('projectPersonUserList')
|
localStorage.removeItem('projectPersonUserList')
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
const handleShowProjectPersonTable = () => {
|
const handleShowProjectPersonTable = () => {
|
||||||
projectPersonUserPicker.value.showUserPicker()
|
projectPersonUserPicker.value.showUserPicker()
|
||||||
}
|
}
|
||||||
const projectChargePersonUserPickerCancel = (userList) => {
|
const projectChargePersonUserPickerCancel=(userList)=>{
|
||||||
projectChargePersonUserList.value = userList
|
projectChargePersonUserList.value = userList
|
||||||
}
|
}
|
||||||
const projectPersonUserPickerCancel = (userList) => {
|
const projectPersonUserPickerCancel=(userList)=>{
|
||||||
projectPersonUserList.value = userList
|
projectPersonUserList.value = userList
|
||||||
}
|
}
|
||||||
|
|
||||||
const projectPersonUserPickerOk = (userList) => {
|
const projectPersonUserPickerOk = (userList) => {
|
||||||
projectPersonUserList.value = userList
|
projectPersonUserList.value = userList
|
||||||
if (userList?.length > 0) {
|
if(userList?.length>0){
|
||||||
localStorage.setItem('projectPersonUserList', JSON.stringify(userList))
|
localStorage.setItem('projectPersonUserList', JSON.stringify(userList))
|
||||||
} else {
|
}else {
|
||||||
localStorage.removeItem('projectPersonUserList')
|
localStorage.removeItem('projectPersonUserList')
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -574,15 +404,9 @@ const choosePreProcess = () => {
|
|||||||
requestName: item.requestName,
|
requestName: item.requestName,
|
||||||
baseUrl: item.baseUrl
|
baseUrl: item.baseUrl
|
||||||
}
|
}
|
||||||
if(props.mode === 'resubmit'){
|
|
||||||
localFormData.value.preProcess.push(preProcessObj)
|
|
||||||
}else{
|
|
||||||
preProcessArray.push(preProcessObj)
|
preProcessArray.push(preProcessObj)
|
||||||
}
|
|
||||||
})
|
})
|
||||||
if(props.mode !== 'resubmit'){
|
|
||||||
localFormData.value.preProcess = preProcessArray
|
localFormData.value.preProcess = preProcessArray
|
||||||
}
|
|
||||||
showPreTable.value = false
|
showPreTable.value = false
|
||||||
localStorage.setItem('preProcess', JSON.stringify(preProcessArray))
|
localStorage.setItem('preProcess', JSON.stringify(preProcessArray))
|
||||||
}
|
}
|
||||||
@@ -665,77 +489,7 @@ const getFileParam = (item) => {
|
|||||||
tag: item.tag
|
tag: item.tag
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
const handleSubmit = async (instance) => {
|
const handleSubmit = async () => {
|
||||||
if (props.step == 50) {
|
|
||||||
let files = []
|
|
||||||
if (props.mode === 'resubmit') {
|
|
||||||
attachment.value.allFileList.forEach(item => {
|
|
||||||
files.push(getFileParam(item))
|
|
||||||
})
|
|
||||||
} else {
|
|
||||||
otherFileList.value.forEach(item => {
|
|
||||||
files.push(getFileParam(item))
|
|
||||||
})
|
|
||||||
}
|
|
||||||
// console.info("🚀 ~method:handleSubmit -----", files,attachment.value.isHaveOneFile)
|
|
||||||
// if (!attachment.value.isHaveOneFile) {
|
|
||||||
// attachment.value.validate()
|
|
||||||
// ElNotification({
|
|
||||||
// title: '提示',
|
|
||||||
// message: '请上传附件',
|
|
||||||
// type: 'error'
|
|
||||||
// })
|
|
||||||
// return;
|
|
||||||
// } else {
|
|
||||||
// attachment.value.clearValidate()
|
|
||||||
// }
|
|
||||||
let projectPersonIds = []
|
|
||||||
for (const item of projectPersonUserList.value) {
|
|
||||||
projectPersonIds.push(parseInt(item.id))
|
|
||||||
}
|
|
||||||
let params = {
|
|
||||||
...localFormData.value,
|
|
||||||
deploymentId: deploymentId.value,
|
|
||||||
requirementId: route.query.id,
|
|
||||||
fileList: files,
|
|
||||||
// singleFile: attachment.value.singleFile,
|
|
||||||
projectId: route.query.projectId,
|
|
||||||
actualEconomicEstimate: parseFloat(localFormData.value.actualEconomicEstimate),
|
|
||||||
specialFundAmount: parseFloat(localFormData.value.specialFundAmount),
|
|
||||||
preProcess: JSON.stringify(localFormData.value.preProcess)
|
|
||||||
}
|
|
||||||
if (sessionParams.value.preProcess && !localFormData.value.preProcess) {
|
|
||||||
params.preProcess = JSON.stringify(sessionParams.value.preProcess)
|
|
||||||
}
|
|
||||||
console.log('params', params.fileList)
|
|
||||||
let res
|
|
||||||
if (props.mode === 'resubmit') {
|
|
||||||
res = await resubmitConclusion(params)
|
|
||||||
} else {
|
|
||||||
res = await projectConclusion(params)
|
|
||||||
}
|
|
||||||
ElNotification({
|
|
||||||
title: '提示',
|
|
||||||
message: res.msg,
|
|
||||||
type: res.code === 1000 ? 'success' : 'error'
|
|
||||||
})
|
|
||||||
if (res.code === 1000) {
|
|
||||||
tagsViewStore.delVisitedViews(router.currentRoute.value.path)
|
|
||||||
await router.push({
|
|
||||||
name: 'Filing'
|
|
||||||
})
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if (!instance) return
|
|
||||||
instance.validate(async (valid) => {
|
|
||||||
if (!valid) {
|
|
||||||
ElNotification({
|
|
||||||
title: '提示',
|
|
||||||
message: '请完善数据,再提交!',
|
|
||||||
type: 'error'
|
|
||||||
})
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
let files = []
|
let files = []
|
||||||
if (props.mode === 'resubmit') {
|
if (props.mode === 'resubmit') {
|
||||||
attachment.value.allFileList.forEach(item => {
|
attachment.value.allFileList.forEach(item => {
|
||||||
@@ -763,20 +517,17 @@ const handleSubmit = async (instance) => {
|
|||||||
projectPersonIds.push(parseInt(item.id))
|
projectPersonIds.push(parseInt(item.id))
|
||||||
}
|
}
|
||||||
let params = {
|
let params = {
|
||||||
// singleFile: attachment.value.singleFile,
|
|
||||||
...localFormData.value,
|
|
||||||
projectId: route.query.projectId,
|
|
||||||
deploymentId: deploymentId.value,
|
deploymentId: deploymentId.value,
|
||||||
requirementId: route.query.id,
|
requirementId: route.query.id,
|
||||||
fileList: files,
|
fileList: files,
|
||||||
actualEconomicEstimate: parseFloat(localFormData.value.actualEconomicEstimate)||null,
|
// singleFile: attachment.value.singleFile,
|
||||||
specialFundAmount: parseFloat(localFormData.value.specialFundAmount)||null,
|
projectId: projectId.value,
|
||||||
preProcess: JSON.stringify(localFormData.value.preProcess)
|
preProcess: JSON.stringify(localFormData.value.preProcess)
|
||||||
}
|
}
|
||||||
if (sessionParams.value.preProcess && !localFormData.value.preProcess) {
|
if (sessionParams.value.preProcess && !localFormData.value.preProcess) {
|
||||||
params.preProcess = JSON.stringify(sessionParams.value.preProcess)
|
params.preProcess = JSON.stringify(sessionParams.value.preProcess)
|
||||||
}
|
}
|
||||||
console.log('params', params)
|
// console.log(params.preProcess)
|
||||||
let res
|
let res
|
||||||
if (props.step === '20') {
|
if (props.step === '20') {
|
||||||
if (projectChargePersonUserList.value && projectChargePersonUserList.value.length === 0) {
|
if (projectChargePersonUserList.value && projectChargePersonUserList.value.length === 0) {
|
||||||
@@ -795,14 +546,6 @@ const handleSubmit = async (instance) => {
|
|||||||
})
|
})
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (optionalChargeLeadershipList.value && optionalChargeLeadershipList.value.length === 0&&isKcjUser()) {
|
|
||||||
ElNotification({
|
|
||||||
title: '提示',
|
|
||||||
message: '请选择部门分管领导!',
|
|
||||||
type: 'error'
|
|
||||||
})
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
params.projectChargePerson = parseInt(projectChargePersonUserList.value[0].id)
|
params.projectChargePerson = parseInt(projectChargePersonUserList.value[0].id)
|
||||||
params.projectPersonIds = projectPersonIds
|
params.projectPersonIds = projectPersonIds
|
||||||
params.optionalChargeLeadership = optionalChargeLeadershipList.value
|
params.optionalChargeLeadership = optionalChargeLeadershipList.value
|
||||||
@@ -818,6 +561,12 @@ const handleSubmit = async (instance) => {
|
|||||||
} else {
|
} else {
|
||||||
res = await projectCheck(params)
|
res = await projectCheck(params)
|
||||||
}
|
}
|
||||||
|
} else if (props.step === '50') {
|
||||||
|
if (props.mode === 'resubmit') {
|
||||||
|
res = await resubmitConclusion(params)
|
||||||
|
} else {
|
||||||
|
res = await projectConclusion(params)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
ElNotification({
|
ElNotification({
|
||||||
title: '提示',
|
title: '提示',
|
||||||
@@ -834,13 +583,15 @@ const handleSubmit = async (instance) => {
|
|||||||
await router.push({
|
await router.push({
|
||||||
name: 'Implementation'
|
name: 'Implementation'
|
||||||
})
|
})
|
||||||
}
|
} else if (props.step === '50') {
|
||||||
}
|
await router.push({
|
||||||
|
name: 'Filing'
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
const init = async () => {
|
const init = async () => {
|
||||||
let id = route.query.projectId
|
let id = projectId.value
|
||||||
if (!id) return;
|
if (!id) return;
|
||||||
processDiagramViewer.value = false
|
processDiagramViewer.value = false
|
||||||
let res
|
let res
|
||||||
@@ -855,7 +606,7 @@ const init = async () => {
|
|||||||
let data = res.data
|
let data = res.data
|
||||||
deploymentId.value = data.deploymentId
|
deploymentId.value = data.deploymentId
|
||||||
deploymentData.value = data
|
deploymentData.value = data
|
||||||
// preProcessRequired.value = data.deploymentName === '重大项目立项' || data.deploymentName === '重大项目验收';
|
preProcessRequired.value = data.deploymentName === '重大项目立项' || data.deploymentName === '重大项目验收';
|
||||||
processStore.setDesign(data)
|
processStore.setDesign(data)
|
||||||
processStore.runningList.value = data.runningList;
|
processStore.runningList.value = data.runningList;
|
||||||
processStore.endList.value = data.endList;
|
processStore.endList.value = data.endList;
|
||||||
@@ -891,6 +642,7 @@ watchEffect(() => {
|
|||||||
// if (props.formData.projectChargePerson != null) {
|
// if (props.formData.projectChargePerson != null) {
|
||||||
// localFormData.value.projectChargePerson = props.formData.projectChargePerson.id
|
// localFormData.value.projectChargePerson = props.formData.projectChargePerson.id
|
||||||
// }
|
// }
|
||||||
|
|
||||||
if (localStorage.getItem('preProcess')) {
|
if (localStorage.getItem('preProcess')) {
|
||||||
let param = JSON.parse(localStorage.getItem('preProcess'))
|
let param = JSON.parse(localStorage.getItem('preProcess'))
|
||||||
localFormData.value.preProcess = param
|
localFormData.value.preProcess = param
|
||||||
|
|||||||
@@ -1,92 +1,52 @@
|
|||||||
<template>
|
<template>
|
||||||
<el-row>
|
<el-row style="padding-bottom: 20px">
|
||||||
<el-col :span="24">
|
<el-col :span="24">
|
||||||
<baseTitle :title="'项目附件'"></baseTitle>
|
<baseTitle :title="'项目附件'"></baseTitle>
|
||||||
</el-col>
|
</el-col>
|
||||||
<el-tabs v-model="activeName" class="demo-tabs" @tab-click="handleTabClick" @tab-remove="tabRemove"
|
<el-form :model="attachmentParam" inline style="margin-left: 15px">
|
||||||
style="margin-left: 15px;margin-top: -10px">
|
<el-form-item label="标签" prop="tag">
|
||||||
<el-tab-pane name="all" :closable="false" label="全部">
|
<el-select v-model="attachmentParam.tag" placeholder="请选择标签" clearable filterable style="width: 300px">
|
||||||
</el-tab-pane>
|
<el-option
|
||||||
<el-tab-pane v-for="item in tagsOption" :closable="item.isClose==1&&uploadState"
|
v-for="item in tagsOption"
|
||||||
:key="item.tagId"
|
:key="item.value"
|
||||||
:label="item.fileTag"
|
:label="item.label"
|
||||||
:name="item.tagId">
|
:value="item.value"
|
||||||
<div class="tag-title">
|
/>
|
||||||
<div></div>
|
</el-select>
|
||||||
{{ item.fileTag }}
|
</el-form-item>
|
||||||
</div>
|
<el-form-item>
|
||||||
</el-tab-pane>
|
<el-button @click="handleSearch" color="#DED0B2">搜索</el-button>
|
||||||
|
<el-button v-if="uploadState&&isLineBtn" color="#DED0B2" @click="handleUpload">上传附件</el-button>
|
||||||
<el-tab-pane name="plus" v-if="uploadState" :closable="false">
|
</el-form-item>
|
||||||
<template #label>
|
</el-form>
|
||||||
<div style="margin-top: 4px;">
|
<el-col v-if="!isLineBtn" :span="24" style="margin-bottom: 8px;margin-left: 15px">
|
||||||
<el-icon color="#BEA266">
|
<el-button v-if="uploadState" color="#DED0B2" @click="handleUpload">上传附件</el-button>
|
||||||
<Plus/>
|
</el-col>
|
||||||
</el-icon>
|
|
||||||
</div>
|
|
||||||
</template>
|
|
||||||
</el-tab-pane>
|
|
||||||
</el-tabs>
|
|
||||||
</el-row>
|
|
||||||
<div style="margin-top:10px;margin-bottom: 8px;margin-left: 15px;display: flex">
|
|
||||||
<!-- <el-button color="#DED0B2" @click="handleUpload">上传附件</el-button>-->
|
|
||||||
<file-upload v-if="!isLineBtn&&uploadState&&activeName!='plus'&&activeName!='all'" @getFile="getFile"/>
|
|
||||||
|
|
||||||
<el-button color="#DED0B2" @click="handleEditTag"
|
|
||||||
v-if="activeName!='all'&&activeName!='plus'&&uploadState&&!isDefault"
|
|
||||||
style="margin-left: 10px;">编辑
|
|
||||||
</el-button>
|
|
||||||
</div>
|
|
||||||
<fvTable style="width: 100%;min-height:311px;max-height: 311px" v-if="showAttachmentTable" height="311"
|
<fvTable style="width: 100%;min-height:311px;max-height: 311px" v-if="showAttachmentTable" height="311"
|
||||||
:scrollbar-always-on="true"
|
|
||||||
:tableConfig="executeTableConfig" class="execute-apply-table"
|
:tableConfig="executeTableConfig" class="execute-apply-table"
|
||||||
:data="otherAttachmentList" :isSettingCol="false" :pagination="false">
|
:data="otherAttachmentList" :isSettingCol="false" :pagination="false">
|
||||||
<template #empty>
|
<template #empty>
|
||||||
<el-empty :image-size="90" description="暂无数据" style="padding: 0"/>
|
<el-empty :image-size="90" description="暂无数据" style="padding: 0"/>
|
||||||
</template>
|
</template>
|
||||||
</fvTable>
|
</fvTable>
|
||||||
<div class="oper-page-btn" style="margin-right: 90px" v-if="uploadState">
|
</el-row>
|
||||||
<el-button color="#DED0B2" @click="handleSubmit()">提交</el-button>
|
<file-preview ref="filePreviewRef" :fullscreen="false" v-if="filePreviewShow" :fileName="filePreviewParam.fileName" :fileUrl="filePreviewParam.fileUrl"
|
||||||
</div>
|
|
||||||
|
|
||||||
<file-preview ref="filePreviewRef" :fullscreen="false" v-if="filePreviewShow" :fileName="filePreviewParam.fileName"
|
|
||||||
:fileUrl="filePreviewParam.fileUrl"
|
|
||||||
:fileType="filePreviewParam.fileType"/>
|
:fileType="filePreviewParam.fileType"/>
|
||||||
<el-dialog v-model="tagNameShow" center width="450" top="40vh">
|
|
||||||
<div style="display: flex;align-items: center">标签:
|
|
||||||
<el-input v-model="fileParam.tagName" placeholder="请输入标签名称" style="width: 335px;" clearable/>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="oper" style="display: flex;justify-content: flex-end;margin-top: 10px">
|
|
||||||
<el-button color="#DED0B2" @click="changeTag()">确定</el-button>
|
|
||||||
<el-button @click="tagNameShow=false">取消</el-button>
|
|
||||||
</div>
|
|
||||||
</el-dialog>
|
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup lang="jsx">
|
<script setup lang="jsx">
|
||||||
import {addTag, delTag, getTagList, updateTag} from "@/api/project-manage";
|
import {getTags} from "@/api/project-manage";
|
||||||
import {ElLoading, ElMessageBox, ElNotification} from "element-plus";
|
import {ElLoading, ElNotification} from "element-plus";
|
||||||
import {searchImplementationFileList, uploadFileList} from "@/api/project-manage/attachment";
|
import {searchImplementationFileList} from "@/api/project-manage/attachment";
|
||||||
import {deleteFile, downloadFile} from "@/api/project-demand";
|
|
||||||
import {nextTick, onActivated} from "vue";
|
|
||||||
|
|
||||||
const router = useRouter()
|
const router = useRouter()
|
||||||
const route = useRoute()
|
const route = useRoute()
|
||||||
const attachmentParam = reactive({
|
const attachmentParam = reactive({
|
||||||
tag: ''
|
tag: ''
|
||||||
})
|
})
|
||||||
const fileParam = ref({
|
|
||||||
tagName: ''
|
|
||||||
})
|
|
||||||
const uploadState = ref(false)
|
const uploadState = ref(false)
|
||||||
const tagNameShow = ref(false)
|
|
||||||
const isDefault = ref(false)
|
|
||||||
const tagsOption = ref([])
|
const tagsOption = ref([])
|
||||||
const fileList = ref([])
|
|
||||||
const allFiles = ref([])
|
|
||||||
const showAttachmentTable = ref(true)
|
const showAttachmentTable = ref(true)
|
||||||
const activeName = ref('all')
|
|
||||||
|
|
||||||
const props = defineProps({
|
const props = defineProps({
|
||||||
fileNameTableWidth: {
|
fileNameTableWidth: {
|
||||||
@@ -112,7 +72,6 @@ const executeTableConfig = reactive({
|
|||||||
label: '文件名',
|
label: '文件名',
|
||||||
align: 'center',
|
align: 'center',
|
||||||
width: props.fileNameTableWidth,
|
width: props.fileNameTableWidth,
|
||||||
showOverflowTooltip: false,
|
|
||||||
currentRender: ({row, index}) => (
|
currentRender: ({row, index}) => (
|
||||||
<div style="color: #2a99ff;cursor: pointer;" onClick={() => clickToPreview(row)}>{row.originalFileName}</div>)
|
<div style="color: #2a99ff;cursor: pointer;" onClick={() => clickToPreview(row)}>{row.originalFileName}</div>)
|
||||||
},
|
},
|
||||||
@@ -120,7 +79,6 @@ const executeTableConfig = reactive({
|
|||||||
prop: 'tag',
|
prop: 'tag',
|
||||||
label: '标签',
|
label: '标签',
|
||||||
align: 'center',
|
align: 'center',
|
||||||
showOverflowTooltip: false,
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
prop: 'size',
|
prop: 'size',
|
||||||
@@ -137,18 +95,12 @@ const executeTableConfig = reactive({
|
|||||||
return (
|
return (
|
||||||
<div>
|
<div>
|
||||||
<el-button type="primary" link onClick={() => handleDownload(row)}>下载</el-button>
|
<el-button type="primary" link onClick={() => handleDownload(row)}>下载</el-button>
|
||||||
{
|
|
||||||
uploadState.value ?
|
|
||||||
<popover-delete name={row.originalFileName} type={'文件'} btnType={'danger'}
|
|
||||||
onDelete={() => deleteSingleFile(row)}/> : ''
|
|
||||||
}
|
|
||||||
</div>
|
</div>
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
})
|
})
|
||||||
// row.newFile ?: ''
|
|
||||||
const otherAttachmentList = ref([])
|
const otherAttachmentList = ref([])
|
||||||
|
|
||||||
const filePreviewParam = ref({
|
const filePreviewParam = ref({
|
||||||
@@ -157,288 +109,39 @@ const filePreviewParam = ref({
|
|||||||
fileType: 'pdf'
|
fileType: 'pdf'
|
||||||
})
|
})
|
||||||
const filePreviewShow = ref(false)
|
const filePreviewShow = ref(false)
|
||||||
const uploadLoading = ref(false)
|
const clickToPreview=(row)=>{
|
||||||
const isEdit = ref(false)
|
|
||||||
const isCloseByList = (index) => {
|
|
||||||
// otherAttachmentList.length>0?false:true
|
|
||||||
return otherAttachmentList.value.length == 0;
|
|
||||||
}
|
|
||||||
const handleDownload = (row) => {
|
|
||||||
downloadFile(row.fileId).then(res => {
|
|
||||||
const blob = new Blob([res])
|
|
||||||
let a = document.createElement('a')
|
|
||||||
a.href = URL.createObjectURL(blob)
|
|
||||||
a.download = row.originalFileName
|
|
||||||
a.click()
|
|
||||||
})
|
|
||||||
}
|
|
||||||
const deleteSingleFile = (row) => {
|
|
||||||
console.log("🚀 ~ file: ", row)
|
|
||||||
deleteFile(row.fileId).then(res => {
|
|
||||||
ElNotification({
|
|
||||||
title: '提示',
|
|
||||||
message: res.msg,
|
|
||||||
type: res.code === 1000 ? 'success' : 'error'
|
|
||||||
})
|
|
||||||
if (res.code === 1000) {
|
|
||||||
if (row.newFile) {
|
|
||||||
const finalList = getLocalList().filter(item => item.fileId !== row.fileId);
|
|
||||||
localStorage.setItem(`implementAllFileList-${route.query.projectId}`, JSON.stringify(finalList))
|
|
||||||
} else {
|
|
||||||
otherAttachmentList.value.splice(otherAttachmentList.value.findIndex((item) => item.fileId === row.fileId), 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
getAttachmentList()
|
|
||||||
activeName.value = 'all'
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
const changeTag = async () => {
|
|
||||||
let res = null
|
|
||||||
if (isEdit.value) {
|
|
||||||
res = await updateTag({
|
|
||||||
tagId: activeName.value,
|
|
||||||
fileTag: fileParam.value.tagName,
|
|
||||||
projectId: route.query.projectId,
|
|
||||||
})
|
|
||||||
changeFileList(fileParam.value.tagName, true)
|
|
||||||
} else {
|
|
||||||
res = await addTag({
|
|
||||||
projectId: route.query.projectId,
|
|
||||||
fileTag: fileParam.value.tagName
|
|
||||||
})
|
|
||||||
|
|
||||||
getAttachmentList()
|
|
||||||
fileParam.value.tagName = ''
|
|
||||||
activeName.value = 'all'
|
|
||||||
}
|
|
||||||
ElNotification({
|
|
||||||
title: '提示',
|
|
||||||
message: res.msg,
|
|
||||||
type: res.code === 1000 ? 'success' : 'error'
|
|
||||||
})
|
|
||||||
tagNameShow.value = false;
|
|
||||||
}
|
|
||||||
const tabRemove = async (val) => {
|
|
||||||
if (otherAttachmentList.value && otherAttachmentList.value.length > 0) {
|
|
||||||
ElNotification({
|
|
||||||
title: '提示',
|
|
||||||
message: '该标签下存在文件,不能删除标签。如需删除标签,请先删除该标签下的所有文件。',
|
|
||||||
type: 'error'
|
|
||||||
})
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
ElMessageBox.confirm(`确认删除名称为${getTagName(val)}的标签吗?`, '系统提示', {
|
|
||||||
confirmButtonText: '确定',
|
|
||||||
cancelButtonText: '取消',
|
|
||||||
type: 'warning'
|
|
||||||
}).then(async () => {
|
|
||||||
let res = await delTag(val)
|
|
||||||
ElNotification({
|
|
||||||
title: '提示',
|
|
||||||
message: res.msg,
|
|
||||||
type: res.code === 1000 ? 'success' : 'error'
|
|
||||||
})
|
|
||||||
if (res.code === 1000) {
|
|
||||||
getTagsOption()
|
|
||||||
otherAttachmentList.value = allFiles.value
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
|
||||||
const handleEditTag = () => {
|
|
||||||
fileParam.value.tagName = getTagName(activeName.value)
|
|
||||||
if (otherAttachmentList.value && otherAttachmentList.value.length > 0) {
|
|
||||||
ElNotification({
|
|
||||||
title: '提示',
|
|
||||||
message: '该标签下存在文件,不能编辑标签。如需编辑标签,请先删除该标签下的所有文件。',
|
|
||||||
type: 'error'
|
|
||||||
})
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
tagNameShow.value = true
|
|
||||||
isEdit.value = true
|
|
||||||
}
|
|
||||||
const getTagName = (name) => {
|
|
||||||
const tagArray = tagsOption.value.filter((item1) => item1.tagId == name)
|
|
||||||
let tagName = ''
|
|
||||||
if (tagArray && tagArray.length > 0) {
|
|
||||||
tagName = tagArray[0].fileTag
|
|
||||||
}
|
|
||||||
return tagName
|
|
||||||
}
|
|
||||||
const handleTabClick = (item, e) => {
|
|
||||||
const defaultArray = tagsOption.value.filter(item1 => item1.tagId == item.props.name)
|
|
||||||
if (defaultArray && defaultArray.length > 0) {
|
|
||||||
isDefault.value = defaultArray[0].isDefault == 1
|
|
||||||
} else {
|
|
||||||
isDefault.value = false
|
|
||||||
}
|
|
||||||
tagNameShow.value = item.props.name == 'plus';
|
|
||||||
if (item.props.name == 'plus') {
|
|
||||||
isEdit.value = false
|
|
||||||
fileParam.value.tagName = ''
|
|
||||||
}
|
|
||||||
if (item.props.name != 'plus') {
|
|
||||||
if (item.props.name == 'all') {
|
|
||||||
changeFileList('all')
|
|
||||||
} else {
|
|
||||||
changeFileList(getTagName(item.props.name))
|
|
||||||
}
|
|
||||||
// if (item.props.name == 'all') {
|
|
||||||
// otherAttachmentList.value = allFiles.value
|
|
||||||
// } else {
|
|
||||||
// otherAttachmentList.value = allFiles.value.filter(item1 => item1.tag == getTagName(item.props.name))
|
|
||||||
// }
|
|
||||||
}
|
|
||||||
// showAttachmentTable.value = false
|
|
||||||
// nextTick(() => {
|
|
||||||
// showAttachmentTable.value = true
|
|
||||||
// })
|
|
||||||
}
|
|
||||||
const compositeParam = (item) => {
|
|
||||||
return {
|
|
||||||
fileId: item.id,
|
|
||||||
size: item.size,
|
|
||||||
originalFileName: item.originalFilename,
|
|
||||||
fileType: item.fileType,
|
|
||||||
url: item.url,
|
|
||||||
newFile: true,
|
|
||||||
tag: getTagName(activeName.value) || '项目实施',
|
|
||||||
}
|
|
||||||
}
|
|
||||||
const getFile = (val) => {
|
|
||||||
|
|
||||||
console.log('上传文件', val)
|
|
||||||
fileList.value = getLocalList()
|
|
||||||
let fileObj = compositeParam(val)
|
|
||||||
fileList.value.push(fileObj)
|
|
||||||
localStorage.setItem(`implementAllFileList-${route.query.projectId}`, JSON.stringify(fileList.value))
|
|
||||||
otherAttachmentList.value.push(fileObj)
|
|
||||||
// handleSubmit([fileObj])
|
|
||||||
}
|
|
||||||
|
|
||||||
const handleSubmit = async () => {
|
|
||||||
if (getLocalList().length == 0) {
|
|
||||||
ElNotification({
|
|
||||||
title: '提示',
|
|
||||||
message: '暂无文件可提交',
|
|
||||||
type: 'warning'
|
|
||||||
})
|
|
||||||
return;
|
|
||||||
} else {
|
|
||||||
let params = {
|
|
||||||
fileList: getLocalList(),
|
|
||||||
projectId: route.query.projectId,
|
|
||||||
targetState: "30"
|
|
||||||
}
|
|
||||||
let res = await uploadFileList(params)
|
|
||||||
if (res.code !== 1000) {
|
|
||||||
ElNotification({
|
|
||||||
title: '提示',
|
|
||||||
message: res.msg,
|
|
||||||
type: 'error'
|
|
||||||
})
|
|
||||||
} else {
|
|
||||||
ElNotification({
|
|
||||||
title: '提示',
|
|
||||||
message: res.msg,
|
|
||||||
type: 'success'
|
|
||||||
})
|
|
||||||
localStorage.removeItem(`implementAllFileList-${route.query.projectId}`)
|
|
||||||
// list.forEach(item => {
|
|
||||||
// otherAttachmentList.value.push(item)
|
|
||||||
// })
|
|
||||||
getAttachmentList()
|
|
||||||
fileList.value = []
|
|
||||||
}
|
|
||||||
// changeFileList('all',true)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
const clickToPreview = (row) => {
|
|
||||||
filePreviewShow.value = false
|
filePreviewShow.value = false
|
||||||
filePreviewParam.value = {
|
filePreviewParam.value = {
|
||||||
fileUrl: row.url,
|
fileUrl: row.url,
|
||||||
fileName: row.originalFileName,
|
fileName: row.originalFileName,
|
||||||
fileType: row.fileType
|
fileType: row.fileType
|
||||||
}
|
}
|
||||||
nextTick(() => {
|
nextTick(()=>{
|
||||||
filePreviewShow.value = true
|
filePreviewShow.value = true
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
const changeFileList = (tag, flag) => {
|
const handleSearch = () => {
|
||||||
let params = {}
|
|
||||||
if (tag == 'all') {
|
|
||||||
otherAttachmentList.value = allFiles.value
|
|
||||||
// params = {
|
|
||||||
// targetId: route.query.projectId,
|
|
||||||
// targetState: "30",
|
|
||||||
// }
|
|
||||||
|
|
||||||
otherAttachmentList.value = [...otherAttachmentList.value, ...getLocalList()];
|
|
||||||
} else {
|
|
||||||
const filw = getLocalList().filter(item1 => item1.tag === tag);
|
|
||||||
const filteredAllFiles = allFiles.value.filter(item1 => item1.tag === tag);
|
|
||||||
|
|
||||||
// 使用 fileId 作为唯一标识进行去重
|
|
||||||
const seen = new Set();
|
|
||||||
const uniqueFiles = [...filteredAllFiles, ...filw].filter(item => {
|
|
||||||
if (!seen.has(item.fileId)) {
|
|
||||||
seen.add(item.fileId);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
});
|
|
||||||
|
|
||||||
otherAttachmentList.value = uniqueFiles;
|
|
||||||
// params = {
|
|
||||||
// targetId: route.query.projectId,
|
|
||||||
// targetState: "30",
|
|
||||||
// tag: tag
|
|
||||||
// }
|
|
||||||
}
|
|
||||||
showAttachmentTable.value = false
|
|
||||||
|
|
||||||
// searchImplementationFileList(params).then(res => {
|
|
||||||
// if (res.code === 1000) {
|
|
||||||
// if(tag == 'all'&&flag){
|
|
||||||
// // allFiles.value = res.data.fileList
|
|
||||||
// }else{
|
|
||||||
// otherAttachmentList.value =res.data.fileList
|
|
||||||
// }
|
|
||||||
if (flag) {
|
|
||||||
getTagsOption(flag)
|
|
||||||
}
|
|
||||||
nextTick(() => {
|
|
||||||
showAttachmentTable.value = true
|
|
||||||
})
|
|
||||||
// }
|
|
||||||
// })
|
|
||||||
}
|
|
||||||
const getLocalList = () => {
|
|
||||||
if (localStorage.getItem(`implementAllFileList-${route.query.projectId}`) && JSON.parse(localStorage.getItem(`implementAllFileList-${route.query.projectId}`))) {
|
|
||||||
return JSON.parse(localStorage.getItem(`implementAllFileList-${route.query.projectId}`))
|
|
||||||
} else {
|
|
||||||
return []
|
|
||||||
}
|
|
||||||
}
|
|
||||||
const getAttachmentList = () => {
|
|
||||||
const loading = ElLoading.service({fullscreen: true})
|
const loading = ElLoading.service({fullscreen: true})
|
||||||
let params = {
|
let params = {
|
||||||
targetId: route.query.projectId,
|
targetId: route.query.projectId,
|
||||||
targetState: "30"
|
targetState: "30"
|
||||||
}
|
}
|
||||||
showAttachmentTable.value = false
|
if (attachmentParam.tag) {
|
||||||
|
tagsOption.value.forEach(item => {
|
||||||
|
if (item.value === attachmentParam.tag) {
|
||||||
|
attachmentParam.tag = item.label
|
||||||
|
}
|
||||||
|
})
|
||||||
|
params.tag = attachmentParam.tag
|
||||||
|
}
|
||||||
searchImplementationFileList(params).then(res => {
|
searchImplementationFileList(params).then(res => {
|
||||||
|
showAttachmentTable.value = false
|
||||||
if (res.code === 1000) {
|
if (res.code === 1000) {
|
||||||
otherAttachmentList.value = [...res.data.fileList, ...getLocalList()]
|
otherAttachmentList.value = res.data.fileList
|
||||||
allFiles.value = [...res.data.fileList, ...getLocalList()]
|
|
||||||
uploadState.value = res.data.upload
|
uploadState.value = res.data.upload
|
||||||
getTagsOption()
|
|
||||||
nextTick(() => {
|
nextTick(() => {
|
||||||
showAttachmentTable.value = true
|
showAttachmentTable.value = true
|
||||||
})
|
})
|
||||||
activeName.value = 'all'
|
|
||||||
loading.close()
|
loading.close()
|
||||||
} else {
|
} else {
|
||||||
ElNotification({
|
ElNotification({
|
||||||
@@ -450,56 +153,11 @@ const getAttachmentList = () => {
|
|||||||
}
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
const getTagsOption = (flag) => {
|
const getTagsOption = () => {
|
||||||
if (!route.query.projectId) return
|
if (!route.query.projectId) return
|
||||||
getTagList(route.query.projectId).then(res => {
|
getTags(route.query.projectId).then(res => {
|
||||||
if (res.code === 1000) {
|
if (res.code === 1000) {
|
||||||
|
tagsOption.value = res.data
|
||||||
tagsOption.value = res.data.rows
|
|
||||||
let list = []
|
|
||||||
if (flag) {
|
|
||||||
|
|
||||||
list = allFiles.value
|
|
||||||
} else {
|
|
||||||
list = otherAttachmentList.value
|
|
||||||
}
|
|
||||||
tagsOption.value.forEach((tag, index) => {
|
|
||||||
// const filterArray = list.filter(item => tag.fileTag == item.tag)
|
|
||||||
// console.log("🚀 ~ file:filterArray ", filterArray)
|
|
||||||
tagsOption.value[index].isClose = 1
|
|
||||||
// tagsOption.value[index].isClose = filterArray.length > 0 ? 0 : 1
|
|
||||||
})
|
|
||||||
console.log("🚀 otherAttachmentList.value", allFiles.value)
|
|
||||||
console.log("🚀 ~ file:\tagsOption.value ", tagsOption.value)
|
|
||||||
let defaultArray = [
|
|
||||||
{
|
|
||||||
tagId: 'd1',
|
|
||||||
fileTag: '合同(专项任务书)',
|
|
||||||
isDefault: 1,
|
|
||||||
isClose: 2
|
|
||||||
},
|
|
||||||
{
|
|
||||||
tagId: 'd2',
|
|
||||||
fileTag: '周报',
|
|
||||||
isDefault: 1,
|
|
||||||
isClose: 2
|
|
||||||
},
|
|
||||||
{
|
|
||||||
tagId: 'd3',
|
|
||||||
fileTag: '阶段性验收',
|
|
||||||
isDefault: 1,
|
|
||||||
isClose: 2
|
|
||||||
},
|
|
||||||
{
|
|
||||||
tagId: 'd4',
|
|
||||||
fileTag: '科研成果',
|
|
||||||
isDefault: 1,
|
|
||||||
isClose: 2
|
|
||||||
}
|
|
||||||
]
|
|
||||||
tagsOption.value = [...defaultArray, ...tagsOption.value]
|
|
||||||
// if (!res.data.rows || res.data.rows.length == 0) return;
|
|
||||||
// activeName.value=res.data.rows[0].tagId
|
|
||||||
} else {
|
} else {
|
||||||
ElNotification({
|
ElNotification({
|
||||||
title: '提示',
|
title: '提示',
|
||||||
@@ -520,9 +178,11 @@ const handleUpload = () => {
|
|||||||
}
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
getAttachmentList()
|
handleSearch()
|
||||||
onActivated(() => {
|
getTagsOption()
|
||||||
getAttachmentList()
|
onActivated(()=>{
|
||||||
|
handleSearch()
|
||||||
|
getTagsOption()
|
||||||
})
|
})
|
||||||
</script>
|
</script>
|
||||||
<style lang="scss">
|
<style lang="scss">
|
||||||
@@ -557,52 +217,8 @@ onActivated(() => {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
<style scoped lang="scss">
|
<style scoped>
|
||||||
:deep(.el-dialog__body) {
|
|
||||||
padding: 0 !important;
|
|
||||||
}
|
|
||||||
|
|
||||||
.tag-title {
|
|
||||||
display: flex;
|
|
||||||
align-items: center;
|
|
||||||
margin-top: 15px;
|
|
||||||
|
|
||||||
> div {
|
|
||||||
margin-right: 5px;
|
|
||||||
width: 4px;
|
|
||||||
height: 20px;
|
|
||||||
background-color: #BEA266;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
:deep(.el-table--fit ) {
|
:deep(.el-table--fit ) {
|
||||||
height: 311px !important;
|
height: 311px !important;
|
||||||
}
|
}
|
||||||
|
|
||||||
:deep(.el-tabs__nav) {
|
|
||||||
//width: 75vw;
|
|
||||||
}
|
|
||||||
|
|
||||||
:deep(.el-tabs__item) {
|
|
||||||
flex: none !important;
|
|
||||||
}
|
|
||||||
|
|
||||||
:deep(.el-tabs__header) {
|
|
||||||
margin-bottom: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
:deep(.el-tabs__item.is-active) {
|
|
||||||
color: #BEA266;
|
|
||||||
}
|
|
||||||
|
|
||||||
:deep(.el-tabs__active-bar) {
|
|
||||||
background-color: #BEA266;
|
|
||||||
}
|
|
||||||
|
|
||||||
.file-tag {
|
|
||||||
width: 100%;
|
|
||||||
display: flex;
|
|
||||||
border-bottom: 2px solid #f6f6f6;
|
|
||||||
/*align-items: center;*/
|
|
||||||
}
|
|
||||||
</style>
|
</style>
|
||||||
|
|||||||
@@ -3,88 +3,41 @@
|
|||||||
<el-form :model="localFormData" ref="summaryForm" :rules="rules">
|
<el-form :model="localFormData" ref="summaryForm" :rules="rules">
|
||||||
<baseTitle title="预期知识产权"></baseTitle>
|
<baseTitle title="预期知识产权"></baseTitle>
|
||||||
<el-row gutter="20" style="margin-bottom: -18px;margin-left: 5px">
|
<el-row gutter="20" style="margin-bottom: -18px;margin-left: 5px">
|
||||||
<!-- <el-col :span="6">-->
|
|
||||||
<!-- <el-form-item label="预期成果形式" prop="resultForm">-->
|
|
||||||
<!-- <span>{{ filterDict(cacheStore.getDict('result_form'), localFormData.resultForm) }}</span>-->
|
|
||||||
<!-- </el-form-item>-->
|
|
||||||
<!-- </el-col>-->
|
|
||||||
<el-col :span="6">
|
<el-col :span="6">
|
||||||
<el-form-item label="知识产权归属" prop="intellectualProperty">
|
<el-form-item label="预期成果形式" prop="resultForm">
|
||||||
|
<span>{{ filterDict(cacheStore.getDict('result_form'), localFormData.resultForm) }}</span>
|
||||||
|
</el-form-item>
|
||||||
|
</el-col>
|
||||||
|
<el-col :span="6">
|
||||||
|
<el-form-item label="知识产权状况" prop="intellectualProperty">
|
||||||
<span>{{
|
<span>{{
|
||||||
filterDict(cacheStore.getDict('intellectual_property'), localFormData.intellectualProperty)
|
filterDict(cacheStore.getDict('intellectual_property'), localFormData.intellectualProperty)
|
||||||
}}</span>
|
}}</span>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-col>
|
</el-col>
|
||||||
<el-col :span="6">
|
<el-col :span="6">
|
||||||
<el-form-item label="预估专利(项)" prop="newPatent">
|
<el-form-item label="发明专利(项)" prop="inventionPatent">
|
||||||
|
<span>{{ localFormData.inventionPatent }}</span>
|
||||||
|
</el-form-item>
|
||||||
|
</el-col>
|
||||||
|
<el-col :span="6">
|
||||||
|
<el-form-item label="新型专利(项)" prop="newPatent">
|
||||||
<span>{{ localFormData.newPatent }}</span>
|
<span>{{ localFormData.newPatent }}</span>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-col>
|
</el-col>
|
||||||
|
|
||||||
<el-col :span="6">
|
<el-col :span="6">
|
||||||
<el-form-item label="预估软件著作权(项)" prop="softwareCopyright">
|
<el-form-item label="软件著作权(项)" prop="softwareCopyright">
|
||||||
<span>{{ localFormData.softwareCopyright }}</span>
|
<span>{{ localFormData.softwareCopyright }}</span>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-col>
|
</el-col>
|
||||||
|
|
||||||
|
|
||||||
<el-col :span="6">
|
<el-col :span="6">
|
||||||
<el-form-item label="预估技术标准(项)" prop="technicalNorms">
|
<el-form-item label="著作权(项)" prop="copyright">
|
||||||
<span>{{ localFormData.technicalNorms }}</span>
|
<span>{{ localFormData.copyright }}</span>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-col>
|
</el-col>
|
||||||
|
|
||||||
<el-col :span="6">
|
<el-col :span="6">
|
||||||
<el-form-item label="预估新产品(项)" prop="newProduct">
|
<el-form-item label="其他(项)" prop="other">
|
||||||
<span>{{ localFormData.newProduct }}</span>
|
<span>{{ localFormData.other }}</span>
|
||||||
</el-form-item>
|
|
||||||
</el-col>
|
|
||||||
|
|
||||||
<el-col :span="6">
|
|
||||||
<el-form-item label="预估新工艺(项)" prop="newProcess">
|
|
||||||
<span>{{ localFormData.newProcess }}</span>
|
|
||||||
</el-form-item>
|
|
||||||
</el-col>
|
|
||||||
|
|
||||||
<el-col :span="6">
|
|
||||||
<el-form-item label="预估新装置(项)" prop="newDevice">
|
|
||||||
<span>{{ localFormData.newDevice }}</span>
|
|
||||||
</el-form-item>
|
|
||||||
</el-col>
|
|
||||||
|
|
||||||
<el-col :span="6">
|
|
||||||
<el-form-item label="预估新材料(项)" prop="newMaterials">
|
|
||||||
<span>{{ localFormData.newMaterials }}</span>
|
|
||||||
</el-form-item>
|
|
||||||
</el-col>
|
|
||||||
|
|
||||||
<el-col :span="6">
|
|
||||||
<el-form-item label="预估计算机软件(项)" prop="computerSoftware">
|
|
||||||
<span>{{ localFormData.computerSoftware }}</span>
|
|
||||||
</el-form-item>
|
|
||||||
</el-col>
|
|
||||||
|
|
||||||
<el-col :span="6">
|
|
||||||
<el-form-item label="预估论文论著(项)" prop="thesis">
|
|
||||||
<span>{{ localFormData.thesis }}</span>
|
|
||||||
</el-form-item>
|
|
||||||
</el-col>
|
|
||||||
|
|
||||||
<el-col :span="6">
|
|
||||||
<el-form-item label="预估研究报告(项)" prop="researchReport">
|
|
||||||
<span>{{ localFormData.researchReport }}</span>
|
|
||||||
</el-form-item>
|
|
||||||
</el-col>
|
|
||||||
|
|
||||||
<el-col :span="6">
|
|
||||||
<el-form-item label="预估商标(项)" prop="trademark">
|
|
||||||
<span>{{ localFormData.trademark }}</span>
|
|
||||||
</el-form-item>
|
|
||||||
</el-col>
|
|
||||||
|
|
||||||
<el-col :span="6">
|
|
||||||
<el-form-item label="预估其他(项)" prop="other">
|
|
||||||
<span style="white-space: pre-wrap">{{ localFormData.other }}</span>
|
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-col>
|
</el-col>
|
||||||
</el-row>
|
</el-row>
|
||||||
@@ -104,18 +57,18 @@
|
|||||||
</el-row>
|
</el-row>
|
||||||
|
|
||||||
<baseTitle title="需求上报申请书" style="margin-bottom: -3px;"></baseTitle>
|
<baseTitle title="需求上报申请书" style="margin-bottom: -3px;"></baseTitle>
|
||||||
<!-- <el-row gutter="20" style="margin-bottom: -15px;">-->
|
<!-- <el-row gutter="20" style="margin-bottom: -15px;">-->
|
||||||
<!-- <el-col :span="24">-->
|
<!-- <el-col :span="24">-->
|
||||||
<!-- <single-file-component tag="需求上报" v-model:value="localFormData.singleFile" :processViewer="processViewer"/>-->
|
<!-- <single-file-component tag="需求上报" v-model:value="localFormData.singleFile" :processViewer="processViewer"/>-->
|
||||||
<!-- <!– <el-form-item>–>-->
|
<!-- <!– <el-form-item>–>-->
|
||||||
<!-- <!– {{localFormData.singleFile}}–>-->
|
<!-- <!– {{localFormData.singleFile}}–>-->
|
||||||
<!-- <!– <el-button type="primary" link @click="handleDownload(localFormData.singleFile)" style="font-size: 16px">–>-->
|
<!-- <!– <el-button type="primary" link @click="handleDownload(localFormData.singleFile)" style="font-size: 16px">–>-->
|
||||||
<!-- <!– {{ localFormData.singleFile?.originalFileName }}–>-->
|
<!-- <!– {{ localFormData.singleFile?.originalFileName }}–>-->
|
||||||
<!-- <!– </el-button>–>-->
|
<!-- <!– </el-button>–>-->
|
||||||
<!-- <!– </el-form-item>–>-->
|
<!-- <!– </el-form-item>–>-->
|
||||||
<!-- </el-col>-->
|
<!-- </el-col>-->
|
||||||
<!-- </el-row>-->
|
<!-- </el-row>-->
|
||||||
<!--/* <baseTitle title="附件文件" style="margin-bottom: 0"></baseTitle>*/-->
|
<!--/* <baseTitle title="附件文件" style="margin-bottom: 0"></baseTitle>*/-->
|
||||||
<el-row gutter="20" style="margin-bottom: -18px;">
|
<el-row gutter="20" style="margin-bottom: -18px;">
|
||||||
<el-col :span="24" class="file-table-style">
|
<el-col :span="24" class="file-table-style">
|
||||||
<file-component tag="需求上报"
|
<file-component tag="需求上报"
|
||||||
@@ -146,8 +99,8 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div v-perm="['annual:plan:approve']" v-if="data.state==='4'">
|
<div v-perm="['annual:plan:approve']" v-if="data.state==='4'">
|
||||||
<!-- <baseTitle title="前置流程"></baseTitle>-->
|
<baseTitle title="前置流程"></baseTitle>
|
||||||
<!-- <select-pre-process :formData="localFormData"/>-->
|
<select-pre-process :formData="localFormData"/>
|
||||||
<baseTitle title="审核意见"></baseTitle>
|
<baseTitle title="审核意见"></baseTitle>
|
||||||
<el-form-item prop="_value">
|
<el-form-item prop="_value">
|
||||||
<el-input
|
<el-input
|
||||||
@@ -170,9 +123,6 @@
|
|||||||
style="--el-switch-on-color:#BEA266 ; --el-switch-off-color:#cecdcd"
|
style="--el-switch-on-color:#BEA266 ; --el-switch-off-color:#cecdcd"
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
<el-button color="#DED0B2" style="margin-left: 10px"
|
|
||||||
@click="handleCarbonCopy()">立即抄送
|
|
||||||
</el-button>
|
|
||||||
</div>
|
</div>
|
||||||
<div class="process">
|
<div class="process">
|
||||||
<operation-render v-if="processViewer && data.operationList && data.operationList.length > 0&&!changeDiagram"
|
<operation-render v-if="processViewer && data.operationList && data.operationList.length > 0&&!changeDiagram"
|
||||||
@@ -183,10 +133,6 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</el-form>
|
</el-form>
|
||||||
<user-picker :multiple="true" ref="carbonCopyUserRef" title="请选择抄送人员"
|
|
||||||
v-model:value="carbonCopyUserList" @ok="carbonCopyUserPickerOk"
|
|
||||||
@cancelOrClear="carbonCopyUserPickerOk"/>
|
|
||||||
|
|
||||||
<div class="oper-page-btn" v-perm="['annual:plan:approve']" v-if="data.state==='4'">
|
<div class="oper-page-btn" v-perm="['annual:plan:approve']" v-if="data.state==='4'">
|
||||||
<el-button type="danger" @click="handleRejectPlan">驳回年度计划</el-button>
|
<el-button type="danger" @click="handleRejectPlan">驳回年度计划</el-button>
|
||||||
<el-button color="#DED0B2" @click="handleAgreePlan">通过年度计划</el-button>
|
<el-button color="#DED0B2" @click="handleAgreePlan">通过年度计划</el-button>
|
||||||
@@ -207,10 +153,8 @@ import FileComponent from "./FileComponent.vue";
|
|||||||
import {ElNotification} from "element-plus";
|
import {ElNotification} from "element-plus";
|
||||||
import {approvePlan} from "@/api/project-demand/summary";
|
import {approvePlan} from "@/api/project-demand/summary";
|
||||||
import SelectPreProcess from "@/components/SelectPreProcess.vue";
|
import SelectPreProcess from "@/components/SelectPreProcess.vue";
|
||||||
import {applyCcSend} from "@/api/expense-manage";
|
|
||||||
import UserPicker from "@/views/workflow/process/common/UserPicker.vue";
|
|
||||||
|
|
||||||
const emit = defineEmits(['update:value','ccSend'])
|
const emit = defineEmits(['update:value'])
|
||||||
const tagsViewStore = useTagsView()
|
const tagsViewStore = useTagsView()
|
||||||
const cacheStore = useCacheStore()
|
const cacheStore = useCacheStore()
|
||||||
const props = defineProps({
|
const props = defineProps({
|
||||||
@@ -248,8 +192,6 @@ const router = useRouter()
|
|||||||
const fundOption = ref([])
|
const fundOption = ref([])
|
||||||
const companyOption = ref([])
|
const companyOption = ref([])
|
||||||
const dictName = ref({})
|
const dictName = ref({})
|
||||||
const carbonCopyUserList = ref([])
|
|
||||||
const carbonCopyUserRef = ref()
|
|
||||||
const rules = reactive({
|
const rules = reactive({
|
||||||
auditOpinion: [{required: true, message: '请输入审核意见', trigger: 'blur'}],
|
auditOpinion: [{required: true, message: '请输入审核意见', trigger: 'blur'}],
|
||||||
})
|
})
|
||||||
@@ -261,39 +203,6 @@ const _value = computed({
|
|||||||
emit("update:value", val);
|
emit("update:value", val);
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
const handleCarbonCopy = () => {
|
|
||||||
carbonCopyUserRef.value.showUserPicker()
|
|
||||||
}
|
|
||||||
const carbonCopyUserPickerOk = (userList) => {
|
|
||||||
carbonCopyUserList.value = userList.map(item => item.id)
|
|
||||||
console.log('localFormData.value', props.data)
|
|
||||||
console.log("🚀 ~ file:'carbonCopyUserList.value ", carbonCopyUserList.value)
|
|
||||||
|
|
||||||
addUser()
|
|
||||||
}
|
|
||||||
const addUser = async () => {
|
|
||||||
const res = await applyCcSend({
|
|
||||||
instanceId: props.data.processInstanceId,
|
|
||||||
projectId: route.query.projectId,
|
|
||||||
state: route.query.step,
|
|
||||||
userIds: carbonCopyUserList.value
|
|
||||||
})
|
|
||||||
console.log('res', res)
|
|
||||||
if (res.code === 1000) {
|
|
||||||
ElNotification({
|
|
||||||
title: '提示',
|
|
||||||
message: '抄送成功',
|
|
||||||
type: 'success'
|
|
||||||
})
|
|
||||||
emit('ccSend')
|
|
||||||
} else {
|
|
||||||
ElNotification({
|
|
||||||
title: '提示',
|
|
||||||
message: res.msg,
|
|
||||||
type: 'error'
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
const handleRejectPlan = async () => {
|
const handleRejectPlan = async () => {
|
||||||
// const values = form.value.getValues()
|
// const values = form.value.getValues()
|
||||||
// console.log('route',route.query.projectId)
|
// console.log('route',route.query.projectId)
|
||||||
@@ -323,14 +232,6 @@ const handleRejectPlan = async () => {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
const handleAgreePlan = async () => {
|
const handleAgreePlan = async () => {
|
||||||
if (!_value.value) {
|
|
||||||
ElNotification({
|
|
||||||
title: '提示',
|
|
||||||
message: '请填写审核意见',
|
|
||||||
type: 'warning'
|
|
||||||
})
|
|
||||||
return
|
|
||||||
}
|
|
||||||
const params = {
|
const params = {
|
||||||
auditOpinion: _value.value,
|
auditOpinion: _value.value,
|
||||||
projectId: parseInt(route.query.projectId),
|
projectId: parseInt(route.query.projectId),
|
||||||
@@ -420,8 +321,7 @@ getFundOptions()
|
|||||||
overflow-y: auto;
|
overflow-y: auto;
|
||||||
padding-bottom: 0 !important;
|
padding-bottom: 0 !important;
|
||||||
}
|
}
|
||||||
|
.file-table-style{
|
||||||
.file-table-style {
|
|
||||||
:deep(.el-table__header) {
|
:deep(.el-table__header) {
|
||||||
.is-leaf:first-child {
|
.is-leaf:first-child {
|
||||||
.cell {
|
.cell {
|
||||||
|
|||||||
@@ -1,14 +1,13 @@
|
|||||||
<template>
|
<template>
|
||||||
<el-upload :file-list="_value" ref="uploadRef"
|
<el-upload :file-list="_value"
|
||||||
action="#"
|
:action="uploadFileUrl"
|
||||||
:headers="headers"
|
:headers="headers"
|
||||||
:limit="maxSize"
|
:limit="maxSize"
|
||||||
with-credentials
|
with-credentials
|
||||||
:multiple="multiple"
|
:multiple="multiple"
|
||||||
:data="uploadParams" :on-change="handleChange"
|
:data="uploadParams"
|
||||||
:http-request="customUpload"
|
|
||||||
:show-file-list="showFileList"
|
:show-file-list="showFileList"
|
||||||
:auto-upload="false"
|
:auto-upload="true"
|
||||||
:before-upload="beforeUpload"
|
:before-upload="beforeUpload"
|
||||||
:on-success="handleUploadSuccess"
|
:on-success="handleUploadSuccess"
|
||||||
:on-error="uploadError"
|
:on-error="uploadError"
|
||||||
@@ -20,20 +19,16 @@
|
|||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup>
|
<script setup>
|
||||||
import {ElLoading, ElMessage, ElMessageBox, ElNotification} from "element-plus";
|
import { ElMessageBox, ElNotification} from "element-plus";
|
||||||
import {getToken} from '@/utils/auth'
|
import {getToken} from '@/utils/auth'
|
||||||
import {nextTick} from "vue";
|
|
||||||
import axios from "axios";
|
|
||||||
|
|
||||||
const baseURL = import.meta.env.VITE_BASE_URL
|
const baseURL = import.meta.env.VITE_BASE_URL
|
||||||
const uploadFileUrl = ref(baseURL + "/workflow/process/file/upload")
|
const uploadFileUrl = ref(baseURL + "/workflow/process/file/upload")
|
||||||
const headers = reactive({
|
const headers = reactive({
|
||||||
'Content-Type': 'multipart/form-data',
|
|
||||||
authorization: getToken()
|
authorization: getToken()
|
||||||
})
|
})
|
||||||
const loading = ref(false)
|
const loading = ref(false)
|
||||||
const showTable = ref(false)
|
const showTable = ref(false)
|
||||||
const uploadIndex = ref(0)
|
|
||||||
const uploadParams = ref({})
|
const uploadParams = ref({})
|
||||||
const props = defineProps({
|
const props = defineProps({
|
||||||
value: {
|
value: {
|
||||||
@@ -44,7 +39,7 @@ const props = defineProps({
|
|||||||
},
|
},
|
||||||
maxSize: {
|
maxSize: {
|
||||||
type: Number,
|
type: Number,
|
||||||
default: 999999
|
default: 30
|
||||||
},
|
},
|
||||||
showFileList: {
|
showFileList: {
|
||||||
type: Boolean,
|
type: Boolean,
|
||||||
@@ -59,9 +54,8 @@ const props = defineProps({
|
|||||||
default: true
|
default: true
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
const uploadRef = ref(null); // el-upload 的 ref
|
|
||||||
const uploadPromises = ref([]); // 跟踪每个文件的上传状态
|
const emit = defineEmits(["input", "getFile", "delete"])
|
||||||
const emit = defineEmits(["input", "beforeUpload","getFile", "delete"])
|
|
||||||
const fileList = ref([])
|
const fileList = ref([])
|
||||||
const _value = computed({
|
const _value = computed({
|
||||||
get() {
|
get() {
|
||||||
@@ -79,79 +73,9 @@ const beforeRemove = (file) => {
|
|||||||
}).then(() => true)
|
}).then(() => true)
|
||||||
}
|
}
|
||||||
|
|
||||||
const uploadLoading = ref(false)
|
|
||||||
const uploadFile = ref([])
|
|
||||||
const handleRemove = (file) => {
|
const handleRemove = (file) => {
|
||||||
emit("delete", file.response.data.id)
|
emit("delete", file.response.data.id)
|
||||||
}
|
}
|
||||||
|
|
||||||
// 文件选择变化时触发
|
|
||||||
const handleChange = (file, files) => {
|
|
||||||
console.log(file, files,'files')
|
|
||||||
uploadIndex.value++
|
|
||||||
uploadFile.value.push(file)
|
|
||||||
};
|
|
||||||
watch(() => uploadIndex.value, (newVal) => {
|
|
||||||
console.log('newVal',newVal)
|
|
||||||
startUpload(uploadFile.value); // 自动触发上传
|
|
||||||
},{
|
|
||||||
deep: true
|
|
||||||
})
|
|
||||||
// 自定义上传逻辑
|
|
||||||
const customUpload = async (options) => {
|
|
||||||
const formData = new FormData();
|
|
||||||
formData.append('file', options.raw);
|
|
||||||
try {
|
|
||||||
const response = await axios.post(uploadFileUrl.value, formData, {
|
|
||||||
headers: headers,
|
|
||||||
});
|
|
||||||
|
|
||||||
fileList.value.push(response.data.data)
|
|
||||||
|
|
||||||
emit("getFile", response.data.data)
|
|
||||||
return response.data; // 成功时返回响应
|
|
||||||
} catch (error) {
|
|
||||||
throw new Error('上传失败'); // 失败时抛出错误
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
// 触发所有文件上传
|
|
||||||
const startUpload = (files) => {
|
|
||||||
uploadLoading.value= ElLoading.service({
|
|
||||||
fullscreen: true,
|
|
||||||
text: '文件上传中...',
|
|
||||||
})
|
|
||||||
if (files.length === 0) {
|
|
||||||
return; // 没有文件时直接返回
|
|
||||||
}
|
|
||||||
uploadPromises.value = []; // 重置 Promise 数组
|
|
||||||
files.forEach((file) => {
|
|
||||||
// 触发每个文件的上传
|
|
||||||
const promise = new Promise((resolve, reject) => {
|
|
||||||
customUpload(file).then(resolve)
|
|
||||||
.catch(reject);
|
|
||||||
});
|
|
||||||
uploadPromises.value.push(promise);
|
|
||||||
});
|
|
||||||
|
|
||||||
// 使用 Promise.all 监听所有文件上传完成
|
|
||||||
Promise.all(uploadPromises.value)
|
|
||||||
.then(() => {
|
|
||||||
ElNotification({
|
|
||||||
title: '提示',
|
|
||||||
message: '所有文件上传完成!',
|
|
||||||
type: 'success'
|
|
||||||
})
|
|
||||||
files = []; // 清空文件列表
|
|
||||||
uploadRef.value.clearFiles(); // 清空上传组件
|
|
||||||
nextTick(() => {
|
|
||||||
uploadLoading.value.close()
|
|
||||||
uploadLoading.value=null
|
|
||||||
})
|
|
||||||
})
|
|
||||||
|
|
||||||
};
|
|
||||||
|
|
||||||
const beforeUpload = () => {
|
const beforeUpload = () => {
|
||||||
loading.value = true
|
loading.value = true
|
||||||
return true
|
return true
|
||||||
|
|||||||
@@ -1,114 +0,0 @@
|
|||||||
<template>
|
|
||||||
<el-upload :file-list="[]"
|
|
||||||
:limit="maxSize"
|
|
||||||
with-credentials
|
|
||||||
:multiple="multiple"
|
|
||||||
:http-request="httpRequestHandle"
|
|
||||||
:data="uploadParams"
|
|
||||||
:auto-upload="true"
|
|
||||||
:show-file-list="false"
|
|
||||||
:before-upload="beforeUpload"
|
|
||||||
:before-remove="beforeRemove"
|
|
||||||
:on-remove="handleRemove"
|
|
||||||
>
|
|
||||||
<el-button color="#DED0B2" style="margin-right: 10px;" :disabled="disabled">导入</el-button>
|
|
||||||
</el-upload>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<script setup>
|
|
||||||
import {ElMessageBox, ElNotification} from "element-plus";
|
|
||||||
import {getToken} from '@/utils/auth'
|
|
||||||
import axios from "axios";
|
|
||||||
|
|
||||||
const props = defineProps({
|
|
||||||
value: {
|
|
||||||
type: Array,
|
|
||||||
default: () => {
|
|
||||||
return []
|
|
||||||
}
|
|
||||||
},
|
|
||||||
maxSize: {
|
|
||||||
type: Number,
|
|
||||||
default: 30
|
|
||||||
},
|
|
||||||
disabled: {
|
|
||||||
type: Boolean,
|
|
||||||
default: false
|
|
||||||
},
|
|
||||||
multiple: {
|
|
||||||
type: Boolean,
|
|
||||||
default: false
|
|
||||||
},
|
|
||||||
})
|
|
||||||
|
|
||||||
|
|
||||||
const baseURL = import.meta.env.VITE_BASE_URL
|
|
||||||
const uploadFileUrl = ref(baseURL + "/workflow/mosr/rd/expense/import")
|
|
||||||
const headers = reactive({
|
|
||||||
authorization: getToken()
|
|
||||||
})
|
|
||||||
// const loading = ref(false)
|
|
||||||
const uploadParams = ref({})
|
|
||||||
const emit = defineEmits(["input", "getFile", "delete"])
|
|
||||||
const beforeRemove = (file) => {
|
|
||||||
return ElMessageBox.confirm(`确认删除名称为${file.name}的文件吗?`, '系统提示', {
|
|
||||||
confirmButtonText: '确定',
|
|
||||||
cancelButtonText: '取消',
|
|
||||||
type: 'warning'
|
|
||||||
}).then(() => true)
|
|
||||||
}
|
|
||||||
|
|
||||||
const handleRemove = (file) => {
|
|
||||||
emit("delete", file.response.data.id)
|
|
||||||
}
|
|
||||||
const beforeUpload = () => {
|
|
||||||
// loading.value = true
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
const httpRequestHandle = (param) => {
|
|
||||||
|
|
||||||
let file = param.file
|
|
||||||
axios.post(uploadFileUrl.value, {
|
|
||||||
file: file
|
|
||||||
}, {
|
|
||||||
headers: {
|
|
||||||
'Content-Type': 'multipart/form-data',
|
|
||||||
...headers
|
|
||||||
}
|
|
||||||
}).then(res => {
|
|
||||||
handleUploadSuccess(res)
|
|
||||||
}).catch(error => {
|
|
||||||
uploadError(error)
|
|
||||||
})
|
|
||||||
}
|
|
||||||
const handleUploadSuccess = (res) => {
|
|
||||||
let data = res.data
|
|
||||||
ElNotification({
|
|
||||||
title: '提示',
|
|
||||||
message: data.code === 1000 ? '上传成功' : '上传失败',
|
|
||||||
type: data.code === 1000 ? 'success' : 'error'
|
|
||||||
})
|
|
||||||
emit("success")
|
|
||||||
}
|
|
||||||
const uploadError = (error) => {
|
|
||||||
console.log("🚀 ~ file:'error ", error.response.data.msg)
|
|
||||||
|
|
||||||
// loading.value = false
|
|
||||||
ElNotification({
|
|
||||||
title: '提示',
|
|
||||||
message: error.response.data.msg,
|
|
||||||
type: 'error'
|
|
||||||
})
|
|
||||||
}
|
|
||||||
defineExpose({
|
|
||||||
handleRemove
|
|
||||||
})
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<style lang="scss" scoped>
|
|
||||||
a {
|
|
||||||
font-size: 14px;
|
|
||||||
color: #2a99ff;
|
|
||||||
}
|
|
||||||
|
|
||||||
</style>
|
|
||||||
@@ -4,8 +4,8 @@
|
|||||||
<el-form-item label="名称" prop="fileName">
|
<el-form-item label="名称" prop="fileName">
|
||||||
<el-input v-model="attachment.fileName" placeholder="请输入文件名查询" clearable filterable style="width: 300px"/>
|
<el-input v-model="attachment.fileName" placeholder="请输入文件名查询" clearable filterable style="width: 300px"/>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item label="项目阶段" prop="targetState" v-if="allFile">
|
<el-form-item label="类型" prop="targetState" v-if="allFile">
|
||||||
<el-select v-model="attachment.targetState" placeholder="请选择项目阶段" clearable filterable style="width: 300px">
|
<el-select v-model="attachment.targetState" placeholder="请选择类型" clearable filterable style="width: 300px">
|
||||||
<el-option
|
<el-option
|
||||||
v-for="item in cacheStore.getDict('archive_file_type')"
|
v-for="item in cacheStore.getDict('archive_file_type')"
|
||||||
:key="item.value"
|
:key="item.value"
|
||||||
@@ -31,7 +31,7 @@
|
|||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-form>
|
</el-form>
|
||||||
<el-card style="width: 100%;overflow-y: hidden">
|
<el-card style="width: 100%;overflow-y: hidden">
|
||||||
<fvTable style="width: 100%;max-height: 318px" v-if="showTable" height="318" :tableConfig="allFile?tableConfigAll:tableConfig"
|
<fvTable style="width: 100%;max-height: 318px" v-if="showTable" height="318" :tableConfig="tableConfig"
|
||||||
:data="fileList" :isSettingCol="false" :pagination="false">
|
:data="fileList" :isSettingCol="false" :pagination="false">
|
||||||
<template #empty>
|
<template #empty>
|
||||||
<el-empty :image-size="99" description="暂无数据" style="padding: 0"/>
|
<el-empty :image-size="99" description="暂无数据" style="padding: 0"/>
|
||||||
@@ -96,67 +96,7 @@ const tableConfig = reactive({
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
prop: 'tag',
|
prop: 'tag',
|
||||||
label:'标签',
|
label: '标签',
|
||||||
align: 'center'
|
|
||||||
},
|
|
||||||
{
|
|
||||||
prop: 'size',
|
|
||||||
label: '文件大小',
|
|
||||||
align: 'center',
|
|
||||||
currentRender: ({row, index}) => (parseInt(row.size / 1024) + 'KB')
|
|
||||||
},
|
|
||||||
{
|
|
||||||
prop: 'createTime',
|
|
||||||
label: '上传时间',
|
|
||||||
align: 'center',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
prop: 'oper',
|
|
||||||
label: '操作',
|
|
||||||
align: 'center',
|
|
||||||
showOverflowTooltip: false,
|
|
||||||
currentRender: ({row, index}) => {
|
|
||||||
return (
|
|
||||||
<div>
|
|
||||||
<el-button type="primary" link onClick={() => handleDownload(row)}>下载</el-button>
|
|
||||||
</div>
|
|
||||||
)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
]
|
|
||||||
})
|
|
||||||
const tableConfigAll = reactive({
|
|
||||||
columns: [
|
|
||||||
{
|
|
||||||
prop: 'index',
|
|
||||||
type: 'index',
|
|
||||||
label: '序号',
|
|
||||||
align: 'center',
|
|
||||||
width:85,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
prop: 'originalFileName',
|
|
||||||
label: '文件名',
|
|
||||||
align: 'center',
|
|
||||||
currentRender: ({row, index}) => (<div style="color: #2a99ff;cursor: pointer;" onClick={()=>clickToPreview(row)}>{row.originalFileName}</div>)
|
|
||||||
|
|
||||||
},
|
|
||||||
{
|
|
||||||
prop: 'targetState',
|
|
||||||
label:'项目阶段',
|
|
||||||
align: 'center',
|
|
||||||
showOverflowTooltip: false,
|
|
||||||
currentRender: ({row, index}) => {
|
|
||||||
if (row.targetState&&row.targetState !== null&&row.targetState!==undefined) {
|
|
||||||
return (<Tag dictType={'archive_file_type'} value={row.targetState}/>)
|
|
||||||
} else {
|
|
||||||
return '--'
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
prop: 'tag',
|
|
||||||
label:'标签',
|
|
||||||
align: 'center'
|
align: 'center'
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -28,8 +28,7 @@
|
|||||||
</el-form>
|
</el-form>
|
||||||
<el-table :data="preProcessList" v-loading="loading"
|
<el-table :data="preProcessList" v-loading="loading"
|
||||||
@select="handleSelect" @select-all="handleSelect" row-key="requestId" ref="preProcessTable">
|
@select="handleSelect" @select-all="handleSelect" row-key="requestId" ref="preProcessTable">
|
||||||
<el-table-column type="selection" width="55" :reserve-selection="true"
|
<el-table-column type="selection" width="55" :reserve-selection="true"/>
|
||||||
:selectable="checkSelectable"/>
|
|
||||||
<el-table-column prop="requestId" label="请求id"></el-table-column>
|
<el-table-column prop="requestId" label="请求id"></el-table-column>
|
||||||
<el-table-column prop="requestName" label="请求名称"></el-table-column>
|
<el-table-column prop="requestName" label="请求名称"></el-table-column>
|
||||||
<el-table-column prop="lastOperatorName" label="最后操作人名称"></el-table-column>
|
<el-table-column prop="lastOperatorName" label="最后操作人名称"></el-table-column>
|
||||||
@@ -71,13 +70,11 @@ const props = defineProps({
|
|||||||
})
|
})
|
||||||
const loading = ref(false)
|
const loading = ref(false)
|
||||||
//暂存数据
|
//暂存数据
|
||||||
const originalProcess = ref([])
|
|
||||||
const currentList = ref([])
|
const currentList = ref([])
|
||||||
const showPreTable = ref(false)
|
const showPreTable = ref(false)
|
||||||
const selectRows = ref([])
|
const selectRows = ref([])
|
||||||
const preProcessList = ref([])
|
const preProcessList = ref([])
|
||||||
const total = ref(0)
|
const total = ref(0)
|
||||||
const preProcessTable = ref()
|
|
||||||
const localFormData = ref({
|
const localFormData = ref({
|
||||||
projectPersonIds: [],
|
projectPersonIds: [],
|
||||||
projectChargePerson: null,
|
projectChargePerson: null,
|
||||||
@@ -105,7 +102,7 @@ const getPreProcessTag = (impact,basicImpact) => {
|
|||||||
}
|
}
|
||||||
if (data == 1) {
|
if (data == 1) {
|
||||||
//一般项目
|
//一般项目
|
||||||
return '研发费用20万元(含)以下科技创新项目报总经理审批'
|
return '一般项目20万以下要总经理审批'
|
||||||
} else if (data == 2) {
|
} else if (data == 2) {
|
||||||
//重大项目
|
//重大项目
|
||||||
return '重大项目20万元到500万元之间要总办会审批'
|
return '重大项目20万元到500万元之间要总办会审批'
|
||||||
@@ -121,33 +118,8 @@ const handleReset = () => {
|
|||||||
const handleSelect = async (selection) => {
|
const handleSelect = async (selection) => {
|
||||||
selectRows.value = selection
|
selectRows.value = selection
|
||||||
}
|
}
|
||||||
const checkSelectable=(row)=>{
|
|
||||||
const detailProcessStr = localStorage.getItem('detailProcess');
|
|
||||||
let preProcessArray = []
|
|
||||||
if (detailProcessStr) {
|
|
||||||
try {
|
|
||||||
preProcessArray = JSON.parse(detailProcessStr)
|
|
||||||
} catch (e) {
|
|
||||||
preProcessArray=[]
|
|
||||||
}
|
|
||||||
if (preProcessArray&&preProcessArray.length > 0) {
|
|
||||||
for (let i = 0; i < preProcessArray.length; i++) {
|
|
||||||
return preProcessArray[i].requestId !== row.requestId;
|
|
||||||
}
|
|
||||||
}else{
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
const handleShowPreTable = () => {
|
const handleShowPreTable = () => {
|
||||||
showPreTable.value = true
|
showPreTable.value = true
|
||||||
nextTick(() => {
|
|
||||||
localFormData.value.preProcess?.forEach((item) => {
|
|
||||||
if (preProcessTable.value) {
|
|
||||||
preProcessTable.value.toggleRowSelection(item, true)
|
|
||||||
}
|
|
||||||
})
|
|
||||||
})
|
|
||||||
getPreProcessList()
|
getPreProcessList()
|
||||||
}
|
}
|
||||||
const handleCancel = () => {
|
const handleCancel = () => {
|
||||||
@@ -157,30 +129,17 @@ const handleCancel = () => {
|
|||||||
const choosePreProcess = () => {
|
const choosePreProcess = () => {
|
||||||
let preProcessObj = {}
|
let preProcessObj = {}
|
||||||
let preProcessArray = []
|
let preProcessArray = []
|
||||||
const detailProcessStr = localStorage.getItem('detailProcess');
|
|
||||||
try {
|
|
||||||
originalProcess.value = JSON.parse(detailProcessStr)
|
|
||||||
} catch (e) {
|
|
||||||
originalProcess.value=[]
|
|
||||||
}
|
|
||||||
selectRows.value.forEach((item) => {
|
selectRows.value.forEach((item) => {
|
||||||
const exists = originalProcess.value?.some(dp => dp.requestId === item.requestId)
|
|
||||||
if (!exists) {
|
|
||||||
preProcessObj = {
|
preProcessObj = {
|
||||||
requestId: item.requestId,
|
requestId: item.requestId,
|
||||||
requestName: item.requestName,
|
requestName: item.requestName,
|
||||||
baseUrl: item.baseUrl
|
baseUrl: item.baseUrl
|
||||||
}
|
}
|
||||||
preProcessArray.push(preProcessObj)
|
preProcessArray.push(preProcessObj)
|
||||||
}
|
|
||||||
})
|
})
|
||||||
if(props.formData.mode === 'view'||props.formData.mode === 'resubmit'){
|
|
||||||
localFormData.value.preProcess = [...originalProcess.value,...preProcessArray]
|
|
||||||
}else{
|
|
||||||
localFormData.value.preProcess = preProcessArray
|
localFormData.value.preProcess = preProcessArray
|
||||||
}
|
|
||||||
localStorage.setItem('preProcess', JSON.stringify(preProcessArray))
|
|
||||||
showPreTable.value = false
|
showPreTable.value = false
|
||||||
|
localStorage.setItem('preProcess', JSON.stringify(preProcessArray))
|
||||||
}
|
}
|
||||||
|
|
||||||
const getPreProcessList = () => {
|
const getPreProcessList = () => {
|
||||||
@@ -195,6 +154,13 @@ const getPreProcessList = () => {
|
|||||||
searchArray.push(item)
|
searchArray.push(item)
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
// res.data.forEach((item) => {
|
||||||
|
// localFormData.value.preProcess.forEach((item1) => {
|
||||||
|
// if (item.requestId == item1.requestId) {
|
||||||
|
// preProcessTable.value.toggleRowSelection(item)
|
||||||
|
// }
|
||||||
|
// })
|
||||||
|
// })
|
||||||
total.value = searchArray.length
|
total.value = searchArray.length
|
||||||
currentList.value = searchArray
|
currentList.value = searchArray
|
||||||
preProcessList.value = currentList.value.slice(0, 10)
|
preProcessList.value = currentList.value.slice(0, 10)
|
||||||
@@ -211,7 +177,6 @@ const handleCurrentChange = (val) => {
|
|||||||
pageInfo.pageNum = val;
|
pageInfo.pageNum = val;
|
||||||
preProcessList.value = currentList.value.slice((val - 1) * pageInfo.pageSize, val * pageInfo.pageSize)
|
preProcessList.value = currentList.value.slice((val - 1) * pageInfo.pageSize, val * pageInfo.pageSize)
|
||||||
};
|
};
|
||||||
|
|
||||||
watchEffect(() => {
|
watchEffect(() => {
|
||||||
return Object.keys(props.formData).length && (localFormData.value = props.formData)
|
return Object.keys(props.formData).length && (localFormData.value = props.formData)
|
||||||
})
|
})
|
||||||
|
|||||||
@@ -38,7 +38,7 @@ import 'tinymce/plugins/wordcount'
|
|||||||
import 'tinymce/plugins/autosave'
|
import 'tinymce/plugins/autosave'
|
||||||
import '@/assets/axupimgs/plugin.js'//多图上传插件
|
import '@/assets/axupimgs/plugin.js'//多图上传插件
|
||||||
|
|
||||||
const emit = defineEmits(['update:value','getFiles'])
|
const emit = defineEmits(['update:value'])
|
||||||
const props = defineProps({
|
const props = defineProps({
|
||||||
//默认值
|
//默认值
|
||||||
value: {
|
value: {
|
||||||
@@ -56,6 +56,7 @@ const props = defineProps({
|
|||||||
plugins: {
|
plugins: {
|
||||||
type: [String, Array],
|
type: [String, Array],
|
||||||
default:
|
default:
|
||||||
|
//
|
||||||
"preview searchreplace autolink directionality visualblocks visualchars fullscreen image axupimgs link media template code codesample table pagebreak nonbreaking anchor insertdatetime advlist lists wordcount autosave",
|
"preview searchreplace autolink directionality visualblocks visualchars fullscreen image axupimgs link media template code codesample table pagebreak nonbreaking anchor insertdatetime advlist lists wordcount autosave",
|
||||||
},
|
},
|
||||||
toolbar: {
|
toolbar: {
|
||||||
@@ -78,7 +79,6 @@ const props = defineProps({
|
|||||||
default: 500
|
default: 500
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
const fileLists=ref([])
|
|
||||||
const content = ref(props.value);
|
const content = ref(props.value);
|
||||||
const imgUrl = ref();
|
const imgUrl = ref();
|
||||||
// const apiKey = reactive("v4zo4n22oanvco29ws5drh0pecuf3gh53clx53cccj3grjwg");
|
// const apiKey = reactive("v4zo4n22oanvco29ws5drh0pecuf3gh53clx53cccj3grjwg");
|
||||||
@@ -169,15 +169,6 @@ const init = reactive({
|
|||||||
type: res.code === 1000 ? 'success' : 'error'
|
type: res.code === 1000 ? 'success' : 'error'
|
||||||
})
|
})
|
||||||
loading.close()
|
loading.close()
|
||||||
console.log("🚀 ~ file:res.data ", res.data)
|
|
||||||
res.data.originalFileName=res.data.originalFilename
|
|
||||||
console.log("🚀 ~ file:'meta.filetype ",meta.filetype )
|
|
||||||
|
|
||||||
if (res && res.data && res.data.fileType &&
|
|
||||||
!["png", "jpg", "jpeg","gif", "svg","ico"].includes(res.data.fileType.toLowerCase())){
|
|
||||||
fileLists.value.push(res.data)
|
|
||||||
emit('getFiles',fileLists.value)
|
|
||||||
}
|
|
||||||
const fileUrl = res.data.url;
|
const fileUrl = res.data.url;
|
||||||
// '?fileId='+res.data.id+
|
// '?fileId='+res.data.id+
|
||||||
callback(fileUrl + '?fileName=' + res.data.originalFilename, {text: file.name, title: file.name});
|
callback(fileUrl + '?fileName=' + res.data.originalFilename, {text: file.name, title: file.name});
|
||||||
|
|||||||
@@ -279,7 +279,7 @@ const schema = computed(() => {
|
|||||||
)
|
)
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: '预估经费预算(元)',
|
label: '经费预算(元)',
|
||||||
prop: 'economicEstimate',
|
prop: 'economicEstimate',
|
||||||
colProps: {
|
colProps: {
|
||||||
span: 6
|
span: 6
|
||||||
@@ -294,22 +294,6 @@ const schema = computed(() => {
|
|||||||
</div>
|
</div>
|
||||||
)
|
)
|
||||||
},
|
},
|
||||||
{
|
|
||||||
label: '实际经费预算(元)',
|
|
||||||
prop: 'actualEconomicEstimate',
|
|
||||||
colProps: {
|
|
||||||
span: 6
|
|
||||||
},
|
|
||||||
component: () => (
|
|
||||||
<div>
|
|
||||||
{
|
|
||||||
baseFormData.value?.actualEconomicEstimate ?
|
|
||||||
<span>{toThousands(baseFormData.value?.actualEconomicEstimate)}</span>
|
|
||||||
: <span>{'--'}</span>
|
|
||||||
}
|
|
||||||
</div>
|
|
||||||
)
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
label: '产学研联合',
|
label: '产学研联合',
|
||||||
prop: 'industryUniversityResearch',
|
prop: 'industryUniversityResearch',
|
||||||
@@ -350,23 +334,7 @@ const schema = computed(() => {
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: '预估专项资金(元)',
|
label: '申请总部专项资金(元)',
|
||||||
prop: 'forecastSpecialFundAmount',
|
|
||||||
colProps: {
|
|
||||||
span: 6
|
|
||||||
},
|
|
||||||
component: () => (
|
|
||||||
<div>
|
|
||||||
{
|
|
||||||
baseFormData.value?.forecastSpecialFundAmount ?
|
|
||||||
<span>{toThousands(baseFormData.value?.forecastSpecialFundAmount)}</span>
|
|
||||||
: <span>{'--'}</span>
|
|
||||||
}
|
|
||||||
</div>
|
|
||||||
)
|
|
||||||
},
|
|
||||||
{
|
|
||||||
label: '实际专项资金(元)',
|
|
||||||
prop: 'specialFundAmount',
|
prop: 'specialFundAmount',
|
||||||
colProps: {
|
colProps: {
|
||||||
span: 6
|
span: 6
|
||||||
|
|||||||
@@ -1,8 +1,5 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="fv-table-container">
|
<div class="fv-table-container">
|
||||||
<el-button v-if="tableConfig.export && tableConfig.export.open&&changeExportPosition" @click="exportTable" color="#DED0B2"
|
|
||||||
style="float: left;margin-right: 10px">导出
|
|
||||||
</el-button>
|
|
||||||
<!-- 表格头部按钮 -->
|
<!-- 表格头部按钮 -->
|
||||||
<div class="fv-table-btn" v-if="tableConfig.btns">
|
<div class="fv-table-btn" v-if="tableConfig.btns">
|
||||||
<div class="table-head-btn">
|
<div class="table-head-btn">
|
||||||
@@ -18,7 +15,7 @@
|
|||||||
</el-button>
|
</el-button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<el-button v-if="tableConfig.export && tableConfig.export.open&&!changeExportPosition" @click="exportTable" color="#DED0B2"
|
<el-button v-if="tableConfig.export && tableConfig.export.open" @click="exportTable" color="#DED0B2"
|
||||||
style="margin-bottom: 10px">导出
|
style="margin-bottom: 10px">导出
|
||||||
</el-button>
|
</el-button>
|
||||||
<!-- 列显示配置 -->
|
<!-- 列显示配置 -->
|
||||||
@@ -124,11 +121,6 @@ const props = defineProps({
|
|||||||
type: Boolean,
|
type: Boolean,
|
||||||
default: true
|
default: true
|
||||||
},
|
},
|
||||||
//是否改变导出位置, 导出在btns前面
|
|
||||||
changeExportPosition: {
|
|
||||||
type: Boolean,
|
|
||||||
default: false
|
|
||||||
},
|
|
||||||
// 是否显示列配置
|
// 是否显示列配置
|
||||||
isSettingCol: {
|
isSettingCol: {
|
||||||
type: Boolean,
|
type: Boolean,
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="link-box">
|
<div class="link-box">
|
||||||
<el-scrollbar noresize height="36" >
|
<el-scrollbar noresize height="34" >
|
||||||
<!-- style="display: flex"-->
|
<!-- style="display: flex"-->
|
||||||
<div >
|
<div >
|
||||||
<router-link
|
<router-link
|
||||||
|
|||||||
@@ -37,11 +37,9 @@ export const usePermisstionStroe = defineStore('permisstion', () => {
|
|||||||
if (res.code === 1000) {
|
if (res.code === 1000) {
|
||||||
const sRouter = JSON.parse(JSON.stringify(res.data))
|
const sRouter = JSON.parse(JSON.stringify(res.data))
|
||||||
const mData = JSON.parse(JSON.stringify(res.data))
|
const mData = JSON.parse(JSON.stringify(res.data))
|
||||||
|
// console.log(JSON.parse(JSON.stringify(sRouter)), 'sRouter');
|
||||||
const firstFormat = setRouterLevel(JSON.parse(JSON.stringify(sRouter)))
|
const firstFormat = setRouterLevel(JSON.parse(JSON.stringify(sRouter)))
|
||||||
|
|
||||||
console.log(firstFormat, 'firstFormat');
|
|
||||||
asyncRouters.value = formatAsyncRouters(JSON.parse(JSON.stringify(firstFormat)))
|
asyncRouters.value = formatAsyncRouters(JSON.parse(JSON.stringify(firstFormat)))
|
||||||
console.log('asyncRouters.value',firstFormat);
|
|
||||||
menuList.value = [...menuList.value, ...generateMenu(mData)]
|
menuList.value = [...menuList.value, ...generateMenu(mData)]
|
||||||
addAsyncRouters(asyncRouters.value)
|
addAsyncRouters(asyncRouters.value)
|
||||||
isLoadRoutes.value = false
|
isLoadRoutes.value = false
|
||||||
@@ -54,23 +52,16 @@ export const usePermisstionStroe = defineStore('permisstion', () => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
const setRouterLevel = (routers) => {
|
const setRouterLevel = (routers) => {
|
||||||
|
|
||||||
return routers.filter(item=>{
|
return routers.filter(item=>{
|
||||||
if(item.component === 'Layout') {
|
if(item.component === 'Layout') {
|
||||||
if(item.children) {
|
if(item.children) {
|
||||||
// console.log("🚀 ~ file: item.children ", item.children )
|
|
||||||
item.children.forEach(v=>{
|
item.children.forEach(v=>{
|
||||||
if(v.children) {
|
if(v.children) {
|
||||||
// console.log("🚀 ~ file:item.children",item.children)
|
slRouters.value = [...toRaw(slRouters.value), ...v.children]
|
||||||
// console.log("🚀 ~ file: v.children ", v.children )
|
delete v.children
|
||||||
// slRouters.value = [ ...toRaw(v.children)]
|
|
||||||
// delete v.children
|
|
||||||
// slRouters.value = [ ...v.children]
|
|
||||||
// return v.children
|
|
||||||
item.children = [...item.children,...v.children]
|
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
item.children = [...item.children, ...toRaw(slRouters.value)]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return true
|
return true
|
||||||
@@ -90,7 +81,6 @@ export const usePermisstionStroe = defineStore('permisstion', () => {
|
|||||||
}
|
}
|
||||||
if (route.children !== null && route.children && route.children.length !== 0) {
|
if (route.children !== null && route.children && route.children.length !== 0) {
|
||||||
route.children = formatAsyncRouters(route.children)
|
route.children = formatAsyncRouters(route.children)
|
||||||
|
|
||||||
}
|
}
|
||||||
return true
|
return true
|
||||||
})
|
})
|
||||||
@@ -100,8 +90,6 @@ export const usePermisstionStroe = defineStore('permisstion', () => {
|
|||||||
routers.forEach(route => {
|
routers.forEach(route => {
|
||||||
router.addRoute(route)
|
router.addRoute(route)
|
||||||
})
|
})
|
||||||
console.log("🚀 ~ file: ", routers)
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
const generateMenu = (routes) => {
|
const generateMenu = (routes) => {
|
||||||
|
|||||||
@@ -20,49 +20,17 @@
|
|||||||
</el-select>
|
</el-select>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-col>
|
</el-col>
|
||||||
<el-col :span="6">
|
<el-col :span="6" >
|
||||||
<el-form-item label="发文单位" prop="remarks">
|
<el-form-item label="备注" prop="remarks">
|
||||||
<el-input v-model="formData.remarks" placeholder="请输入发文单位" clearable></el-input>
|
<el-input v-model="formData.remarks" placeholder="请输入备注" clearable></el-input>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-col>
|
</el-col>
|
||||||
<el-col :span="24" style="margin-left: 10px">
|
<el-col :span="24" style="margin-left: 10px">
|
||||||
<el-form-item label="文章内容" prop="articleContent">
|
<el-form-item label="文章内容" prop="articleContent">
|
||||||
<!-- link-->
|
<Tinymce v-model:value="formData.articleContent" imageUrl="/workflow/process/file/upload" :height="500" v-if="showTinymce" :toolbar="['undo redo | styleselect | bold italic | alignleft aligncenter alignright alignjustify | bullist numlist outdent indent | link image axupimgs']" />
|
||||||
<Tinymce v-model:value="formData.articleContent"
|
|
||||||
imageUrl="/workflow/process/file/upload" :height="500" v-if="showTinymce"
|
|
||||||
:toolbar="['undo redo | styleselect | bold italic | alignleft aligncenter alignright alignjustify | bullist numlist outdent indent | image axupimgs']"/>
|
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-col>
|
</el-col>
|
||||||
<el-col :span="24" style="margin-bottom: -10px">
|
|
||||||
<el-form-item label="附件上传" prop="" style="margin-left: 20px;">
|
|
||||||
<file-upload @getFile="getFiles"/>
|
|
||||||
</el-form-item>
|
|
||||||
</el-col>
|
|
||||||
<el-col :span="24" style="margin-left:90px;">
|
|
||||||
|
|
||||||
<!-- <el-form-item label="公告附件列表" prop=""-->
|
|
||||||
<!-- style="display: flex;flex-direction: column;justify-content: flex-start;">-->
|
|
||||||
<!-- <template #label>-->
|
|
||||||
<!-- <div style="width: 100%;display: flex;align-items: center;justify-content: flex-start">-->
|
|
||||||
<!-- <el-icon size="16">-->
|
|
||||||
<!-- <Paperclip/>-->
|
|
||||||
<!-- </el-icon>-->
|
|
||||||
<!-- 公告附件列表-->
|
|
||||||
<!-- </div>-->
|
|
||||||
<!-- </template>-->
|
|
||||||
<el-col :span="24" style="margin-left: -15px">
|
|
||||||
<div style="display: flex;flex-direction: column">
|
|
||||||
<div v-for="(item,index) in formData.fileList" style="display: flex;align-items: center;margin-bottom: 5px">
|
|
||||||
附件{{ index + 1 }}: <a :href="item.url" style="color: #409eff;" class="a-style" target="_blank">{{ item.originalFileName }}</a>
|
|
||||||
<el-icon size="18" style="margin:0 20px;cursor: pointer" color="#409eff" @click="handleDelete(item,index)">
|
|
||||||
<CircleClose/>
|
|
||||||
</el-icon>
|
|
||||||
<el-button type="primary" link @click="handleDownload(item)" style="font-size: 16px;margin-left: 10px">下载</el-button>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</el-col>
|
|
||||||
<!-- </el-form-item>-->
|
|
||||||
</el-col>
|
|
||||||
</el-row>
|
</el-row>
|
||||||
</el-form>
|
</el-form>
|
||||||
<div class="oper-page-btn">
|
<div class="oper-page-btn">
|
||||||
@@ -74,14 +42,10 @@
|
|||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup lang="jsx">
|
<script setup lang="jsx">
|
||||||
import {ElMessageBox, ElNotification} from "element-plus";
|
import {ElNotification} from "element-plus";
|
||||||
import {addArticle, editArticle, getArticleDetail} from "@/api/article";
|
import {addArticle, editArticle, getArticleDetail} from "@/api/article";
|
||||||
import {useTagsView} from '@/stores/tagsview.js'
|
import {useTagsView} from '@/stores/tagsview.js'
|
||||||
import {useCacheStore} from "@/stores/cache.js";
|
import { useCacheStore } from "@/stores/cache.js";
|
||||||
import {deleteFile, downloadFile} from "../../api/project-demand";
|
|
||||||
import FileUpload from "../../components/FileUpload.vue";
|
|
||||||
import Tinymce from "../../components/Tinymce.vue";
|
|
||||||
|
|
||||||
const cacheStore = useCacheStore();
|
const cacheStore = useCacheStore();
|
||||||
const tagsViewStore = useTagsView()
|
const tagsViewStore = useTagsView()
|
||||||
const router = useRouter()
|
const router = useRouter()
|
||||||
@@ -89,77 +53,24 @@ const route = useRoute()
|
|||||||
const loading = ref(false)
|
const loading = ref(false)
|
||||||
const showTinymce = ref(true)
|
const showTinymce = ref(true)
|
||||||
const fundForm = ref()
|
const fundForm = ref()
|
||||||
const formData = ref({
|
const formData = ref({})
|
||||||
fileList:[]
|
|
||||||
})
|
|
||||||
const routerName = ref(router.currentRoute.value.name)
|
const routerName = ref(router.currentRoute.value.name)
|
||||||
const rules = reactive({
|
const rules = reactive({
|
||||||
articleTitle: [{required: true, message: '请输入文章标题', trigger: ['blur', 'change']}],
|
articleTitle: [{required: true, message: '请输入文章标题', trigger: ['blur', 'change']}],
|
||||||
articleType: [{required: true, message: '请输入文章类型', trigger: ['blur', 'change']}],
|
articleType: [{required: true, message: '请输入文章类型', trigger: ['blur', 'change']}],
|
||||||
articleContent: [{required: true, message: '请输入文章内容', trigger: ['blur', 'change']}],
|
articleContent: [{required: true, message: '请输入文章内容', trigger: ['blur', 'change']}],
|
||||||
})
|
})
|
||||||
const handleDelete = (row,index) => {
|
|
||||||
ElMessageBox.confirm(`确认删除名称为${row.originalFileName}的文件吗?`, '系统提示', {
|
|
||||||
confirmButtonText: '确定',
|
|
||||||
cancelButtonText: '取消',
|
|
||||||
type: 'warning'
|
|
||||||
}).then(() => {
|
|
||||||
deleteFile(row.fileId).then(res => {
|
|
||||||
ElNotification({
|
|
||||||
title: '提示',
|
|
||||||
message: res.msg,
|
|
||||||
type: res.code === 1000 ? 'success' : 'error'
|
|
||||||
})
|
|
||||||
if (res.code === 1000) {
|
|
||||||
formData.value.fileList.splice(index, 1)
|
|
||||||
}
|
|
||||||
})
|
|
||||||
})
|
|
||||||
}
|
|
||||||
const handleBack = () => {
|
const handleBack = () => {
|
||||||
history.back()
|
history.back()
|
||||||
}
|
}
|
||||||
const getFiles = (val) => {
|
|
||||||
console.log("🚀 ~ file:val ", val)
|
|
||||||
val.originalFileName=val.originalFilename
|
|
||||||
let file = compositeParam(val)
|
|
||||||
formData.value.fileList.push(file)
|
|
||||||
}
|
|
||||||
const handleDownload = (row) => {
|
|
||||||
downloadFile(row.fileId).then(res => {
|
|
||||||
const blob = new Blob([res])
|
|
||||||
let a = document.createElement('a')
|
|
||||||
a.href = URL.createObjectURL(blob)
|
|
||||||
a.download = row.originalFileName
|
|
||||||
a.click()
|
|
||||||
})
|
|
||||||
}
|
|
||||||
const submitParam = (item) => {
|
const submitParam = (item) => {
|
||||||
console.log("🚀 ~ file:item.fileList ", item.fileList)
|
|
||||||
item.fileList= item.fileList.map((it)=>{
|
|
||||||
return {
|
|
||||||
...it,
|
|
||||||
articleId:item.articleId
|
|
||||||
}
|
|
||||||
})
|
|
||||||
return {
|
return {
|
||||||
articleContent: item.articleContent,
|
articleContent: item.articleContent,
|
||||||
articleTitle: item.articleTitle,
|
articleTitle: item.articleTitle,
|
||||||
articleType: item.articleType,
|
articleType: item.articleType,
|
||||||
remarks: item.remarks,
|
remarks: item.remarks,
|
||||||
articleId: item.articleId,
|
|
||||||
fileList: item.fileList
|
|
||||||
}
|
|
||||||
}
|
|
||||||
const compositeParam = (item) => {
|
|
||||||
return {
|
|
||||||
fileId: item.id,
|
|
||||||
size: item.size,
|
|
||||||
originalFileName: item.originalFilename,
|
|
||||||
fileType: item.fileType,
|
|
||||||
url: item.url,
|
|
||||||
newFile: true,
|
|
||||||
tag: 'article'
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
const handleSubmit = async (instance) => {
|
const handleSubmit = async (instance) => {
|
||||||
@@ -193,7 +104,6 @@ const handleResubmit = () => {
|
|||||||
articleId: route.query.id,
|
articleId: route.query.id,
|
||||||
...submitParam(formData.value)
|
...submitParam(formData.value)
|
||||||
}
|
}
|
||||||
console.log('params', params)
|
|
||||||
editArticle(params).then(res => {
|
editArticle(params).then(res => {
|
||||||
ElNotification({
|
ElNotification({
|
||||||
title: '提示',
|
title: '提示',
|
||||||
@@ -214,11 +124,11 @@ const getDetailInfo = async () => {
|
|||||||
if (res.code === 1000) {
|
if (res.code === 1000) {
|
||||||
formData.value = res.data
|
formData.value = res.data
|
||||||
loading.value = false
|
loading.value = false
|
||||||
showTinymce.value = false
|
showTinymce.value=false
|
||||||
nextTick(() => {
|
nextTick(() => {
|
||||||
showTinymce.value = true
|
showTinymce.value=true
|
||||||
})
|
})
|
||||||
} else {
|
}else{
|
||||||
ElNotification({
|
ElNotification({
|
||||||
title: '提示',
|
title: '提示',
|
||||||
message: res.msg,
|
message: res.msg,
|
||||||
@@ -235,9 +145,6 @@ onMounted(async () => {
|
|||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style scoped lang="scss">
|
<style scoped lang="scss">
|
||||||
.a-style:hover{
|
|
||||||
text-decoration: underline !important;
|
|
||||||
}
|
|
||||||
.company-select {
|
.company-select {
|
||||||
:deep(.el-form-item__content .el-select__wrapper ) {
|
:deep(.el-form-item__content .el-select__wrapper ) {
|
||||||
width: 750px;
|
width: 750px;
|
||||||
@@ -259,7 +166,6 @@ onMounted(async () => {
|
|||||||
height: auto;
|
height: auto;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
:deep(.el-table--fit ) {
|
:deep(.el-table--fit ) {
|
||||||
height: 300px !important;
|
height: 300px !important;
|
||||||
}
|
}
|
||||||
@@ -270,11 +176,9 @@ onMounted(async () => {
|
|||||||
|
|
||||||
:deep(.el-input-number) {
|
:deep(.el-input-number) {
|
||||||
width: 88.5%;
|
width: 88.5%;
|
||||||
|
.el-input__wrapper{
|
||||||
.el-input__wrapper {
|
padding: 1px 11px!important;
|
||||||
padding: 1px 11px !important;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.el-input__inner {
|
.el-input__inner {
|
||||||
text-align: left;
|
text-align: left;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -5,7 +5,7 @@
|
|||||||
<div class="article-title">
|
<div class="article-title">
|
||||||
<Tag dictType="article_type" :value="formData.articleType"/>
|
<Tag dictType="article_type" :value="formData.articleType"/>
|
||||||
<span>{{ formData.articleTime }}</span>
|
<span>{{ formData.articleTime }}</span>
|
||||||
<span>发文单位:{{ formData.remarks }}</span>
|
<span>备注:{{ formData.remarks }}</span>
|
||||||
</div>
|
</div>
|
||||||
<el-row gutter="20">
|
<el-row gutter="20">
|
||||||
<el-col :span="24">
|
<el-col :span="24">
|
||||||
@@ -13,14 +13,6 @@
|
|||||||
<div class="article-a" v-html="formData.articleContent" @click="clickHandle"></div>
|
<div class="article-a" v-html="formData.articleContent" @click="clickHandle"></div>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-col>
|
</el-col>
|
||||||
<el-col :span="24">
|
|
||||||
<div style="display: flex;flex-direction: column">
|
|
||||||
<div v-for="(item,index) in formData.fileList" style="display: flex;align-items: center;margin-bottom: 5px">
|
|
||||||
附件{{ index + 1 }}: <a :href="item.url" style="color: #409eff;" class="a-style" target="_blank">{{ item.originalFileName }}</a>
|
|
||||||
<el-button type="primary" link @click="handleDownload(item)" style="font-size: 16px;margin-left: 10px">下载</el-button>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</el-col>
|
|
||||||
</el-row>
|
</el-row>
|
||||||
</el-form>
|
</el-form>
|
||||||
</div>
|
</div>
|
||||||
@@ -51,7 +43,7 @@ const clickHandle = (e) => {
|
|||||||
fileName
|
fileName
|
||||||
}
|
}
|
||||||
// handleDownload(fileId,fileName)
|
// handleDownload(fileId,fileName)
|
||||||
// download(item)
|
download(item)
|
||||||
// }else {
|
// }else {
|
||||||
// e.preventDefault()
|
// e.preventDefault()
|
||||||
// }
|
// }
|
||||||
@@ -72,15 +64,6 @@ const clickHandle = (e) => {
|
|||||||
// })
|
// })
|
||||||
// })
|
// })
|
||||||
// }
|
// }
|
||||||
const handleDownload = (row) => {
|
|
||||||
downloadFile(row.fileId).then(res => {
|
|
||||||
const blob = new Blob([res])
|
|
||||||
let a = document.createElement('a')
|
|
||||||
a.href = URL.createObjectURL(blob)
|
|
||||||
a.download = row.originalFileName
|
|
||||||
a.click()
|
|
||||||
})
|
|
||||||
}
|
|
||||||
const download = (row) => {
|
const download = (row) => {
|
||||||
const x = new window.XMLHttpRequest();
|
const x = new window.XMLHttpRequest();
|
||||||
x.open('GET', row.url, true);
|
x.open('GET', row.url, true);
|
||||||
@@ -118,7 +101,6 @@ onMounted(async () => {
|
|||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style lang="scss">
|
<style lang="scss">
|
||||||
|
|
||||||
.article-a {
|
.article-a {
|
||||||
a {
|
a {
|
||||||
color: #409eff !important;
|
color: #409eff !important;
|
||||||
@@ -130,9 +112,7 @@ onMounted(async () => {
|
|||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
<style scoped lang="scss">
|
<style scoped lang="scss">
|
||||||
.a-style:hover{
|
|
||||||
text-decoration: underline !important;
|
|
||||||
}
|
|
||||||
.article-detail {
|
.article-detail {
|
||||||
padding: 0 30px;
|
padding: 0 30px;
|
||||||
padding-top: 15px;
|
padding-top: 15px;
|
||||||
|
|||||||
@@ -93,15 +93,8 @@ const articleTableConfig = reactive({
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
prop: 'remarks',
|
prop: 'remarks',
|
||||||
label: '发文单位',
|
label: '备注',
|
||||||
align: 'center',
|
align: 'center'
|
||||||
currentRender: ({row, index}) => {
|
|
||||||
if (!row.remarks|| row.remarks == undefined || row.remarks == null) {
|
|
||||||
return '--'
|
|
||||||
} else {
|
|
||||||
return row.remarks
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
prop: 'oper',
|
prop: 'oper',
|
||||||
|
|||||||
@@ -1,275 +0,0 @@
|
|||||||
<template>
|
|
||||||
<fvSearchForm :searchConfig="searchConfig" @search="search" style="margin-left: 15px"></fvSearchForm>
|
|
||||||
<div style="float: left">
|
|
||||||
<import-cost-excel @success="importTheExpenseLedger"/>
|
|
||||||
</div>
|
|
||||||
<fvTable ref="tableIns" class="tablte" :tableConfig="tableConfig" @headBtnClick="headBtnClick" :changeExportPosition="true">
|
|
||||||
<template #empty>
|
|
||||||
<el-empty description="暂无数据"/>
|
|
||||||
</template>
|
|
||||||
</fvTable>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<script setup lang="jsx">
|
|
||||||
import {reactive, ref} from "vue";
|
|
||||||
import {useRoute, useRouter} from "vue-router";
|
|
||||||
import {costTemplateDownload, exportExcel, ledgerTemplateDownload} from "../../../api/project-manage";
|
|
||||||
import ImportCostExcel from "@/components/ImportCostExcel.vue";
|
|
||||||
const router = useRouter()
|
|
||||||
const route = useRoute()
|
|
||||||
const searchConfig = ref([
|
|
||||||
|
|
||||||
{
|
|
||||||
label: '主项目',
|
|
||||||
prop: 'masterProjectName',
|
|
||||||
component: 'el-input',
|
|
||||||
props: {
|
|
||||||
placeholder: '请输入主项目查询',
|
|
||||||
clearable: true,
|
|
||||||
filterable: true,
|
|
||||||
checkStrictly: true
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
label: '子项目',
|
|
||||||
prop: 'subProjectName',
|
|
||||||
component: 'el-input',
|
|
||||||
props: {
|
|
||||||
placeholder: '请输入子项目查询',
|
|
||||||
clearable: true,
|
|
||||||
filterable: true,
|
|
||||||
checkStrictly: true
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
label: '会计凭证记载金额(元)',
|
|
||||||
prop: 'recordedAmount',
|
|
||||||
component: 'el-input',
|
|
||||||
props: {
|
|
||||||
placeholder: '请输入会计凭证记载金额查询',
|
|
||||||
clearable: true,
|
|
||||||
filterable: true,
|
|
||||||
checkStrictly: true
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
label: '归集研发费用金额(元)',
|
|
||||||
prop: 'rdAmount',
|
|
||||||
component: 'el-input',
|
|
||||||
props: {
|
|
||||||
placeholder: '请输入归集研发费用金额查询',
|
|
||||||
clearable: true,
|
|
||||||
filterable: true,
|
|
||||||
checkStrictly: true
|
|
||||||
}
|
|
||||||
},
|
|
||||||
// {
|
|
||||||
// label: '项目类型',
|
|
||||||
// prop: 'projectType',
|
|
||||||
// component: shallowRef(fvSelect),
|
|
||||||
// props: {
|
|
||||||
// placeholder: '请选择项目类型',
|
|
||||||
// cacheKey: 'project_type',
|
|
||||||
// clearable: true,
|
|
||||||
// filterable: true,
|
|
||||||
// remote: true
|
|
||||||
// },
|
|
||||||
// colProps: {}
|
|
||||||
// },
|
|
||||||
// {
|
|
||||||
// label: '归档时间',
|
|
||||||
// prop: 'filingTime',
|
|
||||||
// component: 'el-date-picker',
|
|
||||||
// props: {
|
|
||||||
// placeholder: '请选择归档时间',
|
|
||||||
// clearable: true,
|
|
||||||
// type:'date',
|
|
||||||
// format: 'YYYY-MM-DD HH:mm',
|
|
||||||
// valueFormat:'YYYY-MM-DD HH:mm',
|
|
||||||
// },
|
|
||||||
// colProps: {}
|
|
||||||
// },
|
|
||||||
])
|
|
||||||
const tableIns = ref()
|
|
||||||
const tableConfig = reactive({
|
|
||||||
columns: [
|
|
||||||
// {
|
|
||||||
// prop: 'name',
|
|
||||||
// type: 'index',
|
|
||||||
// label: '序号',
|
|
||||||
// align: 'center',
|
|
||||||
// width:85,
|
|
||||||
// index: index => {
|
|
||||||
// return (tableIns.value.getQuery().pageNum - 1) * tableIns.value.getQuery().pageSize + index + 1
|
|
||||||
// }
|
|
||||||
// },
|
|
||||||
{
|
|
||||||
prop: 'rdYear',
|
|
||||||
label: '年',
|
|
||||||
align: 'center',
|
|
||||||
width: 80
|
|
||||||
},
|
|
||||||
{
|
|
||||||
prop: 'rdMonth',
|
|
||||||
label: '月',
|
|
||||||
align: 'center',
|
|
||||||
width: 80
|
|
||||||
},
|
|
||||||
{
|
|
||||||
prop: 'rdDay',
|
|
||||||
label: '日',
|
|
||||||
align: 'center',
|
|
||||||
width: 80
|
|
||||||
},
|
|
||||||
|
|
||||||
{
|
|
||||||
prop: 'masterProjectName',
|
|
||||||
label: '主项目',
|
|
||||||
align: 'center',
|
|
||||||
width: 120,
|
|
||||||
|
|
||||||
},
|
|
||||||
|
|
||||||
{
|
|
||||||
prop: 'subProjectName',
|
|
||||||
label: '子项目',
|
|
||||||
align: 'center',
|
|
||||||
width: 120,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
prop: 'certificateDate',
|
|
||||||
label: '凭证日期',
|
|
||||||
align: 'center',
|
|
||||||
width: 120,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
prop: 'voucherNumber',
|
|
||||||
label: '凭证号',
|
|
||||||
align: 'center'
|
|
||||||
},
|
|
||||||
{
|
|
||||||
prop: 'entryNumber',
|
|
||||||
label: '分录号',
|
|
||||||
align: 'center',
|
|
||||||
|
|
||||||
},
|
|
||||||
{
|
|
||||||
prop: 'digest',
|
|
||||||
label: '摘要',
|
|
||||||
align: 'center',
|
|
||||||
showOverflowTooltip: false,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
prop: 'accountCode',
|
|
||||||
label: '科目编码',
|
|
||||||
align: 'center',
|
|
||||||
showOverflowTooltip: false,
|
|
||||||
|
|
||||||
},
|
|
||||||
{
|
|
||||||
prop: 'accountName',
|
|
||||||
label: '科目名称',
|
|
||||||
align: 'center',
|
|
||||||
showOverflowTooltip: false,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
prop: 'auxiliaryItem',
|
|
||||||
label: '辅助项',
|
|
||||||
align: 'center',
|
|
||||||
showOverflowTooltip: false,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
prop: 'recordedAmount',
|
|
||||||
label: '会计凭证记载金额(元)',
|
|
||||||
align: 'center',
|
|
||||||
width: 170
|
|
||||||
},
|
|
||||||
{
|
|
||||||
prop: 'rdAmount',
|
|
||||||
label: '归集研发费用金额(元)',
|
|
||||||
align: 'center',
|
|
||||||
width: 170
|
|
||||||
},
|
|
||||||
],
|
|
||||||
api: '/workflow/mosr/rd/expense/list',
|
|
||||||
params: {},
|
|
||||||
btns: [
|
|
||||||
{name: '模板下载', key: 'down', color: '#DED0B2'},
|
|
||||||
// {name: '导入', key: 'import', color: '#DED0B2'}
|
|
||||||
],
|
|
||||||
export:{
|
|
||||||
open :true,
|
|
||||||
fileName:`研发费用明细表`
|
|
||||||
}
|
|
||||||
})
|
|
||||||
const search = (val) => {
|
|
||||||
tableConfig.params = {...val}
|
|
||||||
tableIns.value.refresh()
|
|
||||||
}
|
|
||||||
|
|
||||||
const headBtnClick = (key) => {
|
|
||||||
switch (key) {
|
|
||||||
case 'down':
|
|
||||||
handleImportTemplateDownload()
|
|
||||||
break;
|
|
||||||
case 'import':
|
|
||||||
handleAdd()
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
const exportTable = () => {
|
|
||||||
const $e = tableIns.value.$el
|
|
||||||
let $table = $e.querySelector('.el-table__fixed')
|
|
||||||
if (!$table) {
|
|
||||||
$table = $e
|
|
||||||
}
|
|
||||||
exportExcel($table, (5 + (Object.keys(tableData.value[0]).length - 5) * 5), "四川省国有资产经营投资管理有限责任公司科技创新项目人工成本分摊明细表", 2)
|
|
||||||
}
|
|
||||||
//导入模板下载
|
|
||||||
const handleImportTemplateDownload=()=>{
|
|
||||||
costTemplateDownload().then(res => {
|
|
||||||
let link = document.createElement('a')
|
|
||||||
try {
|
|
||||||
let blob = new Blob([res.data],{type: 'application/vnd.ms-excel'});
|
|
||||||
let _fileName = "研发费用明细表模板.xlsx"//文件名,中文无法解析的时候会显示 _(下划线),生产环境获取不到
|
|
||||||
link.style.display='none';
|
|
||||||
// 兼容不同浏览器的URL对象
|
|
||||||
const url = window.URL || window.webkitURL || window.moxURL;
|
|
||||||
link.href=url.createObjectURL(blob);
|
|
||||||
link.setAttribute('download', _fileName.substring(_fileName.lastIndexOf('_')+1))
|
|
||||||
document.body.appendChild(link);
|
|
||||||
link.click();
|
|
||||||
document.body.removeChild(link);
|
|
||||||
url.revokeObjectURL(link.href);//销毁url对象
|
|
||||||
}catch (e) {
|
|
||||||
console.log('下载的文件出错',e)
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
|
||||||
const importTheExpenseLedger = () => {
|
|
||||||
tableIns.value.refresh()
|
|
||||||
}
|
|
||||||
</script>
|
|
||||||
<style scoped lang="scss">
|
|
||||||
:deep(.el-form-item__label-wrap){
|
|
||||||
margin-left: 0!important;
|
|
||||||
}
|
|
||||||
:deep(.el-table__header) {
|
|
||||||
.is-leaf:first-child {
|
|
||||||
.cell {
|
|
||||||
margin-left: -25px !important;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
:deep(.el-table__body) {
|
|
||||||
.el-table__cell:first-child {
|
|
||||||
.cell {
|
|
||||||
margin-left: -13px !important;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
:deep(.el-date-editor--month){
|
|
||||||
width: 100%;
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
@@ -1,232 +0,0 @@
|
|||||||
<template>
|
|
||||||
<fvSearchForm :searchConfig="searchConfig" @search="search" ></fvSearchForm>
|
|
||||||
<fvTable ref="tableIns" :tableConfig="tableConfig" >
|
|
||||||
<template #empty>
|
|
||||||
<el-empty description="暂无数据"/>
|
|
||||||
</template>
|
|
||||||
</fvTable>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<script setup lang="jsx">
|
|
||||||
import fvSelect from '@/fvcomponents/fvSelect/index.vue'
|
|
||||||
import {toThousands} from '@/utils/changePrice.js'
|
|
||||||
import { getSubCompOpt } from '@/api/user/user.js';
|
|
||||||
const router = useRouter()
|
|
||||||
const route = useRoute()
|
|
||||||
const searchConfig = ref(
|
|
||||||
[
|
|
||||||
|
|
||||||
{
|
|
||||||
label: '主项目',
|
|
||||||
prop: 'masterProjectName',
|
|
||||||
component: 'el-input',
|
|
||||||
props: {
|
|
||||||
placeholder: '请输入主项目查询',
|
|
||||||
clearable: true,
|
|
||||||
filterable: true,
|
|
||||||
checkStrictly: true
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
label: '子项目',
|
|
||||||
prop: 'subProjectName',
|
|
||||||
component: 'el-input',
|
|
||||||
props: {
|
|
||||||
placeholder: '请输入子项目查询',
|
|
||||||
clearable: true,
|
|
||||||
filterable: true,
|
|
||||||
checkStrictly: true
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
label: '项目类型',
|
|
||||||
prop: 'projectType',
|
|
||||||
component: shallowRef(fvSelect),
|
|
||||||
props: {
|
|
||||||
placeholder: '请选择项目类型',
|
|
||||||
cacheKey: 'project_type',
|
|
||||||
clearable: true,
|
|
||||||
filterable: true,
|
|
||||||
remote: true
|
|
||||||
},
|
|
||||||
colProps: {}
|
|
||||||
},
|
|
||||||
// {
|
|
||||||
// label: '归档时间',
|
|
||||||
// prop: 'filingTime',
|
|
||||||
// component: 'el-date-picker',
|
|
||||||
// props: {
|
|
||||||
// placeholder: '请选择归档时间',
|
|
||||||
// clearable: true,
|
|
||||||
// type:'date',
|
|
||||||
// format: 'YYYY-MM-DD HH:mm',
|
|
||||||
// valueFormat:'YYYY-MM-DD HH:mm',
|
|
||||||
// },
|
|
||||||
// colProps: {}
|
|
||||||
// },
|
|
||||||
])
|
|
||||||
const tableIns = ref()
|
|
||||||
const tableConfig = reactive({
|
|
||||||
columns: [
|
|
||||||
// {
|
|
||||||
// prop: 'name',
|
|
||||||
// type: 'index',
|
|
||||||
// label: '序号',
|
|
||||||
// align: 'center',
|
|
||||||
// width:85,
|
|
||||||
// index: index => {
|
|
||||||
// return (tableIns.value.getQuery().pageNum - 1) * tableIns.value.getQuery().pageSize + index + 1
|
|
||||||
// }
|
|
||||||
// },
|
|
||||||
{
|
|
||||||
prop: 'paymentYear',
|
|
||||||
label: '支付年份',
|
|
||||||
align: 'center'
|
|
||||||
},
|
|
||||||
{
|
|
||||||
prop: 'paymentMonth',
|
|
||||||
label: '支付月份',
|
|
||||||
align: 'center'
|
|
||||||
},
|
|
||||||
|
|
||||||
{
|
|
||||||
prop: 'masterProjectName',
|
|
||||||
label: '主项目',
|
|
||||||
align: 'center',
|
|
||||||
width: 120,
|
|
||||||
},
|
|
||||||
|
|
||||||
{
|
|
||||||
prop: 'subProjectName',
|
|
||||||
label: '子项目',
|
|
||||||
align: 'center',
|
|
||||||
width: 120,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
prop: 'projectType',
|
|
||||||
label: '项目类型',
|
|
||||||
align: 'center',
|
|
||||||
width: 120,
|
|
||||||
showOverflowTooltip: false,
|
|
||||||
currentRender: ({row, index}) => {
|
|
||||||
if (row.projectType&&row.projectType !== null&&row.projectType!==undefined) {
|
|
||||||
return (<Tag dictType={'project_type'} value={row.projectType}/>)
|
|
||||||
} else {
|
|
||||||
return '--'
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
prop: 'rdType',
|
|
||||||
label: 'R&D统计类型',
|
|
||||||
align: 'center',
|
|
||||||
width: 200
|
|
||||||
},
|
|
||||||
{
|
|
||||||
prop: 'rdSub',
|
|
||||||
label: 'R&D统计子项',
|
|
||||||
align: 'center',
|
|
||||||
width: 150
|
|
||||||
},
|
|
||||||
{
|
|
||||||
prop: 'paymentProcessType',
|
|
||||||
label: '付款流程类型',
|
|
||||||
align: 'center',
|
|
||||||
width: 150
|
|
||||||
},
|
|
||||||
{
|
|
||||||
prop: 'processState',
|
|
||||||
label: '流程状态',
|
|
||||||
align: 'center',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
prop: 'filingTime',
|
|
||||||
label: '归档时间',
|
|
||||||
align: 'center',
|
|
||||||
width: 180
|
|
||||||
},
|
|
||||||
{
|
|
||||||
prop: 'paymentProcessNum',
|
|
||||||
label: '付款流程编号',
|
|
||||||
align: 'center',
|
|
||||||
width: 150
|
|
||||||
},
|
|
||||||
{
|
|
||||||
prop: 'paymentAmount',
|
|
||||||
label: '付款金额',
|
|
||||||
align: 'center',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
prop: 'paymentSubject',
|
|
||||||
label: '付款/请款事由',
|
|
||||||
align: 'center',
|
|
||||||
width: 130
|
|
||||||
},
|
|
||||||
|
|
||||||
{
|
|
||||||
prop: 'contractNum',
|
|
||||||
label: '合同编号',
|
|
||||||
align: 'center',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
prop: 'contractName',
|
|
||||||
label: '合同名称',
|
|
||||||
align: 'center',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
prop: 'contractSumAmount',
|
|
||||||
label: '合同总额(元)',
|
|
||||||
align: 'center',
|
|
||||||
width: 130
|
|
||||||
},
|
|
||||||
{
|
|
||||||
prop: 'recipientName',
|
|
||||||
label: '收款方名称',
|
|
||||||
align: 'center',
|
|
||||||
width: 130
|
|
||||||
},
|
|
||||||
{
|
|
||||||
prop: 'remarks',
|
|
||||||
label: '备注说明',
|
|
||||||
align: 'center',
|
|
||||||
},
|
|
||||||
],
|
|
||||||
api: '/workflow/mosr/payment/list',
|
|
||||||
params: {},
|
|
||||||
export:{
|
|
||||||
open :true,
|
|
||||||
fileName:`科研项日现金支出明细表`
|
|
||||||
}
|
|
||||||
})
|
|
||||||
const search = (val) => {
|
|
||||||
tableConfig.params = {...val}
|
|
||||||
tableIns.value.refresh()
|
|
||||||
}
|
|
||||||
const init = async () => {
|
|
||||||
const res = await getSubCompOpt()
|
|
||||||
searchConfig.value.find(item=>item.prop == 'affiliatedCompanyIds').props.data = res.data
|
|
||||||
}
|
|
||||||
|
|
||||||
// init()
|
|
||||||
|
|
||||||
</script>
|
|
||||||
<style scoped lang="scss">
|
|
||||||
:deep(.el-table__header) {
|
|
||||||
.is-leaf:first-child {
|
|
||||||
.cell {
|
|
||||||
margin-left: -25px !important;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
:deep(.el-table__body) {
|
|
||||||
.el-table__cell:first-child {
|
|
||||||
.cell {
|
|
||||||
margin-left: -13px !important;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
:deep(.el-date-editor--month){
|
|
||||||
width: 100%;
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
@@ -204,7 +204,7 @@ const tableConfig = reactive({
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
prop: 'economicEstimate',
|
prop: 'economicEstimate',
|
||||||
label: '预估经费预算(元)',
|
label: '经费预算(元)',
|
||||||
align: 'center',
|
align: 'center',
|
||||||
width: 150,
|
width: 150,
|
||||||
currentRender:({row})=>{
|
currentRender:({row})=>{
|
||||||
|
|||||||
@@ -1,591 +0,0 @@
|
|||||||
<template>
|
|
||||||
<div v-loading="loading" style="padding: 0 30px">
|
|
||||||
<el-form :model="formData" ref="form" :rules="rules" style="margin-left: 5px;margin-top: 18px">
|
|
||||||
<el-row :gutter="30">
|
|
||||||
<!-- <el-col :span="6" style="margin-left: -15px">-->
|
|
||||||
<!-- <el-form-item label="分摊名称" prop="shareName" >-->
|
|
||||||
<!-- <el-input v-model="formData.shareName" placeholder="请输入分摊名称" clearable>-->
|
|
||||||
<!-- </el-input>-->
|
|
||||||
<!-- </el-form-item>-->
|
|
||||||
<!-- </el-col>-->
|
|
||||||
<el-col :span="6" style="margin-left: -10px">
|
|
||||||
<el-form-item label="分摊月份" prop="apportionmentMonth" label-width="80">
|
|
||||||
<el-date-picker
|
|
||||||
v-model="formData.apportionmentMonth"
|
|
||||||
type="month"
|
|
||||||
format="YYYY-MM"
|
|
||||||
value-format="YYYY-MM"
|
|
||||||
placeholder="选择月"
|
|
||||||
>
|
|
||||||
</el-date-picker>
|
|
||||||
</el-form-item>
|
|
||||||
</el-col>
|
|
||||||
<el-col :span="3" >
|
|
||||||
<el-button color="#DED0B2" @click="handleAdd" style="font-size: 16px">添加一行</el-button>
|
|
||||||
</el-col>
|
|
||||||
<el-table v-if="showTable" :data="formData.tableData" style="width: 100%">
|
|
||||||
<el-table-column prop="projectId" label="项目名称" min-width="230">
|
|
||||||
<template #default="scope">
|
|
||||||
<el-form-item prop="time" :rules="scope.row.projectId?'1':rules.projectId">
|
|
||||||
<el-select v-model="scope.row.projectId" placeholder="请选择项目名称" clearable filterable @change="selectProject(scope.row,scope.$index)">
|
|
||||||
<el-option
|
|
||||||
v-for="item in nameOptions"
|
|
||||||
:key="item.value"
|
|
||||||
:label="item.label"
|
|
||||||
:value="item.value"
|
|
||||||
>
|
|
||||||
</el-option>
|
|
||||||
</el-select>
|
|
||||||
</el-form-item>
|
|
||||||
</template>
|
|
||||||
</el-table-column>
|
|
||||||
<el-table-column prop="researchPersonnelId" label="研发人员" min-width="180">
|
|
||||||
<template #default="scope">
|
|
||||||
<el-form-item prop="researchPersonnelId">
|
|
||||||
{{ scope.row.researchPersonnel }}
|
|
||||||
<el-button color="#DED0B2" @click="showPersonnelPicker(scope.row,scope.$index)"
|
|
||||||
style="margin-left: 10px">
|
|
||||||
{{ scope.row.researchPersonnel ? '更改' : '请选择研发人员' }}
|
|
||||||
</el-button>
|
|
||||||
</el-form-item>
|
|
||||||
</template>
|
|
||||||
</el-table-column>
|
|
||||||
<el-table-column prop="wagesPayable" label="当月总工时(天)" min-width="175">
|
|
||||||
<template #default="scope">
|
|
||||||
<el-form-item prop="time" :rules="scope.row.wagesPayable?'1':rules.wagesPayable">
|
|
||||||
<div>21.75</div>
|
|
||||||
</el-form-item>
|
|
||||||
</template>
|
|
||||||
</el-table-column>
|
|
||||||
<el-table-column prop="researchDuration" label="当月研发工时(天)" min-width="175">
|
|
||||||
<template #default="scope">
|
|
||||||
<el-form-item prop="time" :rules="scope.row.researchDuration?'1':rules.researchDuration">
|
|
||||||
<el-input-number v-model="scope.row.researchDuration" placeholder="请输入当月研发工时" :controls="false"/>
|
|
||||||
</el-form-item>
|
|
||||||
</template>
|
|
||||||
</el-table-column>
|
|
||||||
<el-table-column prop="oper" label="操作" min-width="130">
|
|
||||||
<template #default="scope">
|
|
||||||
<el-button type="primary" @click="handleCopy(scope.row)" link style="font-size: 16px">复制</el-button>
|
|
||||||
<el-button type="primary" @click="handleDelete(scope.$index)" link style="font-size: 16px">删除</el-button>
|
|
||||||
</template>
|
|
||||||
</el-table-column>
|
|
||||||
</el-table>
|
|
||||||
</el-row>
|
|
||||||
</el-form>
|
|
||||||
<user-picker :multiple="false" ref="userPicker" title="请选择研发人员" v-model:value="userList"
|
|
||||||
@ok="selectedResearchPersonnel" @cancelOrClear="researchPersonnelPickerCancel"
|
|
||||||
:setNullToSelectList="true" :isResearch="true"/>
|
|
||||||
|
|
||||||
|
|
||||||
<div class="oper-page-btn">
|
|
||||||
<el-button color="#DED0B2" v-if="routerName==='Sharedetail/add'" @click="handleSubmit(form)">提交</el-button>
|
|
||||||
<el-button color="#DED0B2" v-else @click="handleResubmit(form)">重新提交</el-button>
|
|
||||||
<el-button @click="handleBack">返回</el-button>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<script setup lang="jsx">
|
|
||||||
import {ElNotification} from "element-plus";
|
|
||||||
import {useTagsView} from '@/stores/tagsview.js'
|
|
||||||
import {
|
|
||||||
addAllocation,
|
|
||||||
getAllocationDetail,
|
|
||||||
getAllocationProcess,
|
|
||||||
getResearchUser,
|
|
||||||
getProjectOption,
|
|
||||||
editAllocation,
|
|
||||||
getAllocationDetailList, addShare
|
|
||||||
} from "@/api/expense-manage";
|
|
||||||
import {useProcessStore} from '@/stores/processStore.js';
|
|
||||||
import ProcessDiagramViewer from '@/views/workflow/common/ProcessDiagramViewer.vue';
|
|
||||||
import OperationRender from '@/views/workflow/common/OperationRender.vue'
|
|
||||||
import UserPicker from "@/views/workflow/process/common/UserPicker.vue";
|
|
||||||
localStorage.removeItem('originallySelectedList')
|
|
||||||
|
|
||||||
const userList = ref([])
|
|
||||||
const changeDiagram = ref(false)
|
|
||||||
const rules = reactive({
|
|
||||||
// shareName: [{required: true, message: '请输入分摊名称', trigger: ['blur', 'change']}],
|
|
||||||
apportionmentMonth: [{required: true, message: '请选择月份', trigger: ['blur', 'change']}],
|
|
||||||
projectId: [{required: true, message: '请选择项目名称', trigger: ['blur', 'change']}],
|
|
||||||
// researchPersonnelId: [{required: true, message: '请选择研发人员', trigger: ['blur', 'change']}],
|
|
||||||
// wagesPayable: [{required: true, message: '请输入应发工资', trigger: ['blur', 'change']}],
|
|
||||||
// performance: [{required: true, message: '请输入绩效', trigger: ['blur', 'change']}],
|
|
||||||
// reserveFund: [{required: true, message: '请输入公积金', trigger: ['blur', 'change']}],
|
|
||||||
// socialSecurity: [{required: true, message: '请输入社保', trigger: ['blur', 'change']}],
|
|
||||||
// annuity: [{required: true, message: '请输入年金', trigger: ['blur', 'change']}],
|
|
||||||
// workday: [{required: true, message: '请输入工作日', trigger: ['blur', 'change']}],
|
|
||||||
researchDuration: [{required: true, message: '请输入研发时长', trigger: ['blur', 'change']}],
|
|
||||||
})
|
|
||||||
const processStore = useProcessStore()
|
|
||||||
const opentionData = ref({})
|
|
||||||
const processInstanceData = ref()
|
|
||||||
const processDiagramViewer = ref(false)
|
|
||||||
const loading = ref(false)
|
|
||||||
const isRepeatResearchPersonnel = ref(false)
|
|
||||||
const showTable = ref(true)
|
|
||||||
const route = useRoute()
|
|
||||||
const router = useRouter()
|
|
||||||
const routerName = ref(router.currentRoute.value.name)
|
|
||||||
const tagsViewStore = useTagsView()
|
|
||||||
const formData = ref({
|
|
||||||
tableData: [
|
|
||||||
{
|
|
||||||
projectId: '',
|
|
||||||
projectName: '',
|
|
||||||
// researchPersonnelId: '',
|
|
||||||
// wagesPayable: null,
|
|
||||||
// performance: null,
|
|
||||||
// reserveFund: null,
|
|
||||||
// socialSecurity: null,
|
|
||||||
// annuity: null,
|
|
||||||
workday: '21.75',
|
|
||||||
researchDuration: null,
|
|
||||||
}
|
|
||||||
]
|
|
||||||
})
|
|
||||||
const userPicker = ref()
|
|
||||||
const form = ref()
|
|
||||||
const currentReachPerson = ref({})
|
|
||||||
const currentRow = ref()
|
|
||||||
const currentIndex = ref()
|
|
||||||
const nameOptions = ref([])
|
|
||||||
const researchOptions = ref([])
|
|
||||||
const showPersonnelPicker = (row, index) => {
|
|
||||||
currentRow.value = row
|
|
||||||
currentIndex.value = index
|
|
||||||
if (row.companyName&&row.researchPersonnelId) {
|
|
||||||
let userObj = {
|
|
||||||
id: row.researchPersonnelId,
|
|
||||||
name: row.researchPersonnel,
|
|
||||||
companyName: row.companyName,
|
|
||||||
accountType: row.accountType,
|
|
||||||
}
|
|
||||||
userList.value = [userObj]
|
|
||||||
} else if (!row.researchPersonnel) {
|
|
||||||
userList.value = []
|
|
||||||
}
|
|
||||||
nextTick(() => {
|
|
||||||
userPicker.value.showUserPicker()
|
|
||||||
})
|
|
||||||
}
|
|
||||||
const selectProject=(row,index)=>{
|
|
||||||
console.log('row,index',row,index)
|
|
||||||
//先选择人员, 再选择项目: 再添加一行,重复操作
|
|
||||||
const projectIdArray = formData.value.tableData.map(item => item.projectId)
|
|
||||||
const researchPersonnelIdArray = formData.value.tableData.map(item => item.researchPersonnelId)
|
|
||||||
console.log('projectIdArray',projectIdArray)
|
|
||||||
console.log('researchPersonnelIdArray',researchPersonnelIdArray)
|
|
||||||
const projectNumObj = getSelectProjectAndResearchPersonnelNum(projectIdArray)
|
|
||||||
const researchPersonnelNumObj = getSelectProjectAndResearchPersonnelNum(researchPersonnelIdArray)
|
|
||||||
let repeatProjectName=getProjectName(row.projectId)
|
|
||||||
// console.log('currentRow.value',currentRow.value)
|
|
||||||
// for (let researchPersonnelIdKey in researchPersonnelNumObj) {//先判断人员是否重复
|
|
||||||
// if(currentRow.value.projectId){
|
|
||||||
// if(researchPersonnelNumObj[researchPersonnelIdKey]>1){
|
|
||||||
// ElNotification({
|
|
||||||
// title: '警告',
|
|
||||||
// message: `${repeatProjectName} 项目下,同一个研发人员不能分摊多次!`,
|
|
||||||
// type: 'warning',
|
|
||||||
// })
|
|
||||||
// row.researchPersonnelId = ''
|
|
||||||
// row.researchPersonnel = ''
|
|
||||||
// row.companyName = ''
|
|
||||||
// row.accountType = ''
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// }
|
|
||||||
// for (let projectIdKey in projectNumObj) {
|
|
||||||
// // console.log('projectNumObjKey', projectIdKey, projectNumObj[projectIdKey])
|
|
||||||
// if(projectNumObj[projectIdKey]>1){
|
|
||||||
// // console.log('getProjectName(projectIdKey)',getProjectName(projectIdKey))
|
|
||||||
// repeatProjectName=getProjectName(projectIdKey)
|
|
||||||
//
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
}
|
|
||||||
const researchPersonnelPickerCancel = (select) => {
|
|
||||||
console.log('select',select)
|
|
||||||
if(select.length>0){
|
|
||||||
formData.value.tableData?.forEach((item, index) => {
|
|
||||||
if (index === currentIndex.value) {
|
|
||||||
item.researchPersonnelId = select[0].id
|
|
||||||
item.researchPersonnel = select[0].name
|
|
||||||
item.companyName = select[0].companyName
|
|
||||||
item.accountType = select[0].accountType
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}else{
|
|
||||||
formData.value.tableData?.forEach((item, index) => {
|
|
||||||
if (index === currentIndex.value) {
|
|
||||||
item.researchPersonnelId = ''
|
|
||||||
item.researchPersonnel = ''
|
|
||||||
item.companyName = ''
|
|
||||||
item.accountType = ''
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
const selectedResearchPersonnel = (select) => {
|
|
||||||
if(select.length>0){
|
|
||||||
formData.value.tableData?.forEach((item, index) => {
|
|
||||||
if (index === currentIndex.value) {
|
|
||||||
item.researchPersonnelId = select[0].id
|
|
||||||
item.researchPersonnel = select[0].name
|
|
||||||
item.companyName = select[0].companyName
|
|
||||||
item.accountType = select[0].accountType
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}else{
|
|
||||||
formData.value.tableData?.forEach((item, index) => {
|
|
||||||
if (index === currentIndex.value) {
|
|
||||||
item.researchPersonnelId = ''
|
|
||||||
item.researchPersonnel = ''
|
|
||||||
item.companyName = ''
|
|
||||||
item.accountType = ''
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
|
||||||
//以下是为" 同一项目下,同一人不能分摊多次 "
|
|
||||||
const projectIdArray = formData.value.tableData?.map(item => item.projectId)
|
|
||||||
const researchPersonnelIdArray = formData.value.tableData?.map(item => item.researchPersonnelId)
|
|
||||||
const projectNumObj = getSelectProjectAndResearchPersonnelNum(projectIdArray)
|
|
||||||
const researchPersonnelNumObj = getSelectProjectAndResearchPersonnelNum(researchPersonnelIdArray)
|
|
||||||
let repeatProjectName=''
|
|
||||||
for (let projectIdKey in projectNumObj) {
|
|
||||||
// console.log('projectNumObjKey', projectIdKey, projectNumObj[projectIdKey])
|
|
||||||
if(projectNumObj[projectIdKey]>1){
|
|
||||||
// console.log('getProjectName(projectIdKey)',getProjectName(projectIdKey))
|
|
||||||
repeatProjectName=getProjectName(projectIdKey)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// for (let researchPersonnelIdKey in researchPersonnelNumObj) {
|
|
||||||
// // console.log('researchPersonnelIdKey', researchPersonnelIdKey, researchPersonnelNumObj[researchPersonnelIdKey])
|
|
||||||
// if(researchPersonnelNumObj[researchPersonnelIdKey]>1&&repeatProjectName&¤tRow.value.projectId){
|
|
||||||
// isRepeatResearchPersonnel.value=true
|
|
||||||
// ElNotification({
|
|
||||||
// title: '警告',
|
|
||||||
// message: `${repeatProjectName} 项目下,同一个研发人员不能分摊多次!`,
|
|
||||||
// type: 'warning',
|
|
||||||
// })
|
|
||||||
// formData.value.tableData.forEach((item,index)=>{
|
|
||||||
// if (index === currentIndex.value) {
|
|
||||||
// item.researchPersonnelId = ''
|
|
||||||
// item.researchPersonnel = ''
|
|
||||||
// item.companyName = ''
|
|
||||||
// item.accountType = ''
|
|
||||||
// }
|
|
||||||
// })
|
|
||||||
// }else{
|
|
||||||
// userList.value = select
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* 获取一个项目/研发人员的选择次数
|
|
||||||
* @param projectIdArray
|
|
||||||
* @returns {{}}
|
|
||||||
*/
|
|
||||||
const getSelectProjectAndResearchPersonnelNum = (projectIdArray) => {
|
|
||||||
const obj = {};
|
|
||||||
for (let i = 0, l = projectIdArray.length; i < l; i++) {
|
|
||||||
const item = projectIdArray[i];
|
|
||||||
obj[item] = (obj[item] + 1) || 1;
|
|
||||||
}
|
|
||||||
return obj;
|
|
||||||
}
|
|
||||||
const getResearchOptions = async () => {
|
|
||||||
const res = await getResearchUser()
|
|
||||||
researchOptions.value = res.data
|
|
||||||
}
|
|
||||||
const getProjectOptions = async () => {
|
|
||||||
const res = await getProjectOption()
|
|
||||||
nameOptions.value = res.data
|
|
||||||
}
|
|
||||||
const getProjectName = (id) => {
|
|
||||||
let label = ''
|
|
||||||
nameOptions.value.forEach(item => {
|
|
||||||
if (item.value == id) {
|
|
||||||
label = item.label
|
|
||||||
}
|
|
||||||
})
|
|
||||||
return label
|
|
||||||
}
|
|
||||||
const handleAdd = () => {
|
|
||||||
let row = {
|
|
||||||
projectId: '',
|
|
||||||
projectName: '',
|
|
||||||
researchPersonnelId: '',
|
|
||||||
researchPersonnel: '',
|
|
||||||
wagesPayable: null,
|
|
||||||
performance: null,
|
|
||||||
reserveFund: null,
|
|
||||||
socialSecurity: null,
|
|
||||||
annuity: null,
|
|
||||||
workday: '21.75',
|
|
||||||
researchDuration: null,
|
|
||||||
}
|
|
||||||
currentReachPerson.value.name = ''
|
|
||||||
formData.value.tableData.push(row)
|
|
||||||
}
|
|
||||||
const handleCopy = (row) => {
|
|
||||||
let copyObj = {
|
|
||||||
projectId: row.projectId,
|
|
||||||
projectName: '',
|
|
||||||
// accountType: row.accountType,
|
|
||||||
// companyName: row.companyName,
|
|
||||||
// researchPersonnelId: row.researchPersonnelId,
|
|
||||||
// researchPersonnel: row.researchPersonnel,
|
|
||||||
wagesPayable: row.wagesPayable,
|
|
||||||
performance: row.performance,
|
|
||||||
reserveFund: row.reserveFund,
|
|
||||||
socialSecurity: row.socialSecurity,
|
|
||||||
annuity: row.annuity,
|
|
||||||
workday: '21.75',
|
|
||||||
researchDuration: row.researchDuration,
|
|
||||||
}
|
|
||||||
formData.value.tableData.push(copyObj)
|
|
||||||
}
|
|
||||||
const handleDelete = (index) => {
|
|
||||||
formData.value.tableData.splice(index, 1)
|
|
||||||
}
|
|
||||||
const handleSubmit = (instance) => {
|
|
||||||
console.log('tableData', formData.value.tableData)
|
|
||||||
if (!instance) return
|
|
||||||
instance.validate(async (valid) => {
|
|
||||||
if (!valid) {
|
|
||||||
ElNotification({
|
|
||||||
title: '提示',
|
|
||||||
message: '请完善数据,再提交!',
|
|
||||||
type: 'error'
|
|
||||||
})
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
let researchPersonnelId = ''
|
|
||||||
formData.value.tableData.forEach(item => {
|
|
||||||
item.projectName = getProjectName(item.projectId)
|
|
||||||
researchPersonnelId = item.researchPersonnelId
|
|
||||||
if (item.performance == 0) {
|
|
||||||
item.performance = null
|
|
||||||
}
|
|
||||||
})
|
|
||||||
if (!researchPersonnelId) {
|
|
||||||
ElNotification({
|
|
||||||
title: '提示',
|
|
||||||
message: '请选择研发人员',
|
|
||||||
type: 'error'
|
|
||||||
})
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
let params = {
|
|
||||||
apportionmentMonth: formData.value.apportionmentMonth,
|
|
||||||
usrAllocations: formData.value.tableData,
|
|
||||||
}
|
|
||||||
console.log('params', params.usrAllocations, formData.value.tableData)
|
|
||||||
const resultMap = params.usrAllocations.reduce((acc, item) => {
|
|
||||||
if (!acc[item.researchPersonnelId]) {
|
|
||||||
acc[item.researchPersonnelId] = [];
|
|
||||||
}
|
|
||||||
acc[item.researchPersonnelId].push(item);
|
|
||||||
return acc;
|
|
||||||
}, {});
|
|
||||||
const exceedList = [];
|
|
||||||
|
|
||||||
Object.entries(resultMap).forEach(([id, items]) => {
|
|
||||||
const totalDuration = items.reduce((sum, item) => sum + (item.researchDuration || 0), 0);
|
|
||||||
const preciseTotalDuration = parseFloat(totalDuration.toFixed(2));
|
|
||||||
|
|
||||||
if (preciseTotalDuration > 21.75) {
|
|
||||||
// 收集超出的研发人员ID及总工时
|
|
||||||
exceedList.push({ id, totalDuration: preciseTotalDuration });
|
|
||||||
}
|
|
||||||
});
|
|
||||||
// 从 resultMap 中获取 researchPersonnel
|
|
||||||
const exceedResearchPersonnel = exceedList.map(item => {
|
|
||||||
const id = item.id;
|
|
||||||
const personnelItems = resultMap[id];
|
|
||||||
// 获取第一个对象中的 researchPersonnel(假设所有对象的 researchPersonnel 相同)
|
|
||||||
const researchPersonnel = personnelItems[0].researchPersonnel;
|
|
||||||
return { id, researchPersonnel, totalDuration: item.totalDuration };
|
|
||||||
});
|
|
||||||
|
|
||||||
console.log('超过21.75的研发人员:', exceedResearchPersonnel);
|
|
||||||
|
|
||||||
if (exceedResearchPersonnel.length > 0) {
|
|
||||||
console.log('以下研发人员的总研发工时超过21.75天:', exceedResearchPersonnel);
|
|
||||||
|
|
||||||
ElNotification({
|
|
||||||
title: '提示',
|
|
||||||
message: `以下研发人员的总研发工时超过21.75天:${exceedResearchPersonnel.map(e => e.researchPersonnel).join(',')}`,
|
|
||||||
type: 'warning'
|
|
||||||
});
|
|
||||||
}
|
|
||||||
// 调用函数
|
|
||||||
console.log('是大V',resultMap)
|
|
||||||
const {code, msg} = await addShare(params)
|
|
||||||
ElNotification({
|
|
||||||
title: '提示',
|
|
||||||
message: msg,
|
|
||||||
type: code === 1000 ? 'success' : 'error'
|
|
||||||
})
|
|
||||||
if (code === 1000) {
|
|
||||||
tagsViewStore.delVisitedViews(router.currentRoute.value.path)
|
|
||||||
router.push({
|
|
||||||
name: 'Share'
|
|
||||||
})
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
|
||||||
const handleResubmit = (instance) => {
|
|
||||||
if (!instance) return
|
|
||||||
instance.validate(async (valid) => {
|
|
||||||
if (!valid) {
|
|
||||||
ElNotification({
|
|
||||||
title: '提示',
|
|
||||||
message: '请完善数据,再提交!',
|
|
||||||
type: 'error'
|
|
||||||
})
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
let researchPersonnelId = ''
|
|
||||||
formData.value.tableData.forEach(item => {
|
|
||||||
item.allocationId = formData.value.allocationId
|
|
||||||
item.projectName = getProjectName(item.projectId)
|
|
||||||
researchPersonnelId = item.researchPersonnelId
|
|
||||||
if (item.performance == 0) {
|
|
||||||
item.performance = null
|
|
||||||
}
|
|
||||||
})
|
|
||||||
if (!researchPersonnelId) {
|
|
||||||
ElNotification({
|
|
||||||
title: '提示',
|
|
||||||
message: '请选择研发人员',
|
|
||||||
type: 'error'
|
|
||||||
})
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
let params = {
|
|
||||||
allocationId: formData.value.allocationId,
|
|
||||||
shareName: formData.value.shareName,
|
|
||||||
apportionmentMonth: formData.value.apportionmentMonth,
|
|
||||||
usrAllocations: formData.value.tableData,
|
|
||||||
deploymentId: processInstanceData.value.deploymentId,
|
|
||||||
}
|
|
||||||
// console.log('params', params, formData.value.tableData)
|
|
||||||
const {code, msg} = await editAllocation(params)
|
|
||||||
ElNotification({
|
|
||||||
title: '提示',
|
|
||||||
message: msg,
|
|
||||||
type: code === 1000 ? 'success' : 'error'
|
|
||||||
})
|
|
||||||
if (code === 1000) {
|
|
||||||
tagsViewStore.delVisitedViews(router.currentRoute.value.path)
|
|
||||||
router.push({
|
|
||||||
name: 'Share'
|
|
||||||
})
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
const getDetailInfo = () => {
|
|
||||||
loading.value = true
|
|
||||||
getAllocationDetail(route.query.id).then(res => {
|
|
||||||
ElNotification({
|
|
||||||
title: '提示',
|
|
||||||
message: res.msg,
|
|
||||||
type: res.code === 1000 ? 'success' : 'error'
|
|
||||||
})
|
|
||||||
if (res.code === 1000) {
|
|
||||||
getDetailList()
|
|
||||||
formData.value = res.data.formData
|
|
||||||
opentionData.value = res.data
|
|
||||||
loading.value = false
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
|
||||||
const getDetailList = async () => {
|
|
||||||
let params = {
|
|
||||||
allocationId: route.query.id
|
|
||||||
}
|
|
||||||
showTable.value = false
|
|
||||||
const {code, data, msg} = await getAllocationDetailList(params)
|
|
||||||
if (code === 1000) {
|
|
||||||
data.rows.forEach(item => {
|
|
||||||
item.researchPersonnelId = Number(item.researchPersonnelId)
|
|
||||||
})
|
|
||||||
formData.value.tableData = data.rows
|
|
||||||
nextTick(() => {
|
|
||||||
showTable.value = true
|
|
||||||
})
|
|
||||||
} else {
|
|
||||||
ElNotification({
|
|
||||||
title: '提示',
|
|
||||||
message: msg,
|
|
||||||
type: 'error'
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
const init = async () => {
|
|
||||||
processDiagramViewer.value = false
|
|
||||||
await getResearchOptions()
|
|
||||||
await getProjectOptions()
|
|
||||||
getAllocationProcess().then(res => {
|
|
||||||
if (res.code === 1000) {
|
|
||||||
let data = res.data
|
|
||||||
processInstanceData.value = data
|
|
||||||
processStore.setDesign(data)
|
|
||||||
processStore.runningList.value = data.runningList;
|
|
||||||
processStore.endList.value = data.endList;
|
|
||||||
processStore.noTakeList.value = data.noTakeList;
|
|
||||||
processStore.refuseList.value = data.refuseList;
|
|
||||||
processStore.passList.value = data.passList;
|
|
||||||
nextTick(() => {
|
|
||||||
processDiagramViewer.value = true
|
|
||||||
})
|
|
||||||
} else {
|
|
||||||
ElNotification({
|
|
||||||
title: '提示',
|
|
||||||
message: res.msg,
|
|
||||||
type: 'error'
|
|
||||||
})
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
|
||||||
const handleBack = () => {
|
|
||||||
history.back()
|
|
||||||
}
|
|
||||||
onMounted(() => {
|
|
||||||
init()
|
|
||||||
if (route.query.id) {
|
|
||||||
getDetailInfo()
|
|
||||||
}
|
|
||||||
})
|
|
||||||
</script>
|
|
||||||
<style scoped lang="scss">
|
|
||||||
:deep(.el-table--enable-row-transition) {
|
|
||||||
.el-table__body td.el-table__cell {
|
|
||||||
.cell {
|
|
||||||
.el-form-item {
|
|
||||||
margin-top: 20px;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
:deep(.el-date-editor--month) {
|
|
||||||
width: 100% !important;
|
|
||||||
}
|
|
||||||
|
|
||||||
:deep(.el-input-number) {
|
|
||||||
width: 100%;
|
|
||||||
|
|
||||||
.el-input__inner {
|
|
||||||
text-align: left;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
@@ -1,219 +0,0 @@
|
|||||||
<template>
|
|
||||||
<fvSearchForm :searchConfig="searchConfig" @search="search" style="margin-left: 16px"></fvSearchForm>
|
|
||||||
<!-- <el-button color="#DED0B2" style="float: left;margin: 0 10px 10px 0" @click="exportTable">导出</el-button>-->
|
|
||||||
|
|
||||||
<fvTable ref="tableIns" :tableConfig="tableConfig" @headBtnClick="headBtnClick" style="margin-top: 15px" @selectionChange="selectionChange">
|
|
||||||
<template #empty>
|
|
||||||
<el-empty description="暂无数据"/>
|
|
||||||
</template>
|
|
||||||
</fvTable>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<script setup lang="jsx">
|
|
||||||
import fvSelect from '@/fvcomponents/fvSelect/index.vue'
|
|
||||||
|
|
||||||
import { getSubCompOpt } from '@/api/user/user.js';
|
|
||||||
import {reactive, ref} from "vue";
|
|
||||||
import {shareDetailExport, shareExportExcel} from "@/api/expense-manage";
|
|
||||||
import {ElMessage} from "element-plus";
|
|
||||||
const router = useRouter()
|
|
||||||
const route = useRoute()
|
|
||||||
const searchConfig = reactive([
|
|
||||||
{
|
|
||||||
label: '子项目',
|
|
||||||
prop: 'subProjectName',
|
|
||||||
component: 'el-input',
|
|
||||||
props: {
|
|
||||||
placeholder: '请输入子项目查询',
|
|
||||||
clearable: true,
|
|
||||||
filterable: true,
|
|
||||||
checkStrictly: true
|
|
||||||
}
|
|
||||||
},
|
|
||||||
// {
|
|
||||||
// label: '支付月份',
|
|
||||||
// prop: 'apportionmentMonth',
|
|
||||||
// component: 'el-date-picker',
|
|
||||||
// props: {
|
|
||||||
// placeholder: '请选择支付月份',
|
|
||||||
// clearable: true,
|
|
||||||
// type:'month',
|
|
||||||
// format: 'YYYY-MM',
|
|
||||||
// valueFormat:"YYYY-MM"
|
|
||||||
// },
|
|
||||||
// colProps: {}
|
|
||||||
// },
|
|
||||||
// {
|
|
||||||
// label: '人员性质',
|
|
||||||
// prop: 'personnelNature',
|
|
||||||
// component: shallowRef(fvSelect),
|
|
||||||
// props: {
|
|
||||||
// placeholder: '请选择人员性质',
|
|
||||||
// clearable: true,
|
|
||||||
// filterable: true,
|
|
||||||
// cacheKey: 'nature_of_personnel'
|
|
||||||
// }
|
|
||||||
// },
|
|
||||||
])
|
|
||||||
const tableIns = ref()
|
|
||||||
const selectData = ref([])
|
|
||||||
const tableConfig = reactive({
|
|
||||||
columns: [
|
|
||||||
{
|
|
||||||
type: 'selection',
|
|
||||||
prop: 'selection',
|
|
||||||
},
|
|
||||||
// {
|
|
||||||
// prop: 'name',
|
|
||||||
// type: 'index',
|
|
||||||
// label: '序号',
|
|
||||||
// align: 'center',
|
|
||||||
// width:85,
|
|
||||||
// index: index => {
|
|
||||||
// return (tableIns.value.getQuery().pageNum - 1) * tableIns.value.getQuery().pageSize + index + 1
|
|
||||||
// }
|
|
||||||
// },
|
|
||||||
{
|
|
||||||
prop: 'paymentYear',
|
|
||||||
label: '支付年份',
|
|
||||||
align: 'center'
|
|
||||||
},
|
|
||||||
{
|
|
||||||
prop: 'paymentMonth',
|
|
||||||
label: '支付月份',
|
|
||||||
align: 'center'
|
|
||||||
},
|
|
||||||
|
|
||||||
{
|
|
||||||
prop: 'masterProjectName',
|
|
||||||
label: '主项目',
|
|
||||||
align: 'center',
|
|
||||||
},
|
|
||||||
|
|
||||||
{
|
|
||||||
prop: 'subProjectName',
|
|
||||||
label: '子项目',
|
|
||||||
align: 'center',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
prop: 'researchPersonnel',
|
|
||||||
label: '研发人员',
|
|
||||||
align: 'center',
|
|
||||||
showOverflowTooltip: false,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
prop: 'personnelNature',
|
|
||||||
label: '人员性质',
|
|
||||||
align: 'center',
|
|
||||||
width: 120,
|
|
||||||
showOverflowTooltip: false,
|
|
||||||
currentRender: ({row, index}) => {
|
|
||||||
if (row.personnelNature&&row.personnelNature !== null&&row.personnelNature!==undefined) {
|
|
||||||
return (<Tag dictType={'nature_of_personnel'} value={row.personnelNature}/>)
|
|
||||||
} else {
|
|
||||||
return '--'
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
prop: 'researchDuration',
|
|
||||||
label: '当月研发工时(天)',
|
|
||||||
align: 'center',
|
|
||||||
// currentRender:({row})=>{
|
|
||||||
// return <span>{toThousands(row.afterTax)}</span>
|
|
||||||
// }
|
|
||||||
},
|
|
||||||
{
|
|
||||||
prop: 'workday',
|
|
||||||
label: '当月总工时(天)',
|
|
||||||
align: 'center',
|
|
||||||
showOverflowTooltip: false,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
prop: 'subtotal',
|
|
||||||
label: '人工成本分摊(元)',
|
|
||||||
align: 'center',
|
|
||||||
},
|
|
||||||
|
|
||||||
],
|
|
||||||
api: '/workflow/mosr/cost/share',
|
|
||||||
params: {},
|
|
||||||
btns: [
|
|
||||||
{name: '添加分摊', key: 'add', color: '#DED0B2'},
|
|
||||||
{name: '导出', key: 'export', color: '#DED0B2'}
|
|
||||||
],
|
|
||||||
export:{
|
|
||||||
open :false,
|
|
||||||
}
|
|
||||||
})
|
|
||||||
|
|
||||||
|
|
||||||
const search = (val) => {
|
|
||||||
tableConfig.params = {...val}
|
|
||||||
tableIns.value.refresh()
|
|
||||||
}
|
|
||||||
const headBtnClick = (key) => {
|
|
||||||
switch (key) {
|
|
||||||
case 'add':
|
|
||||||
handleAdd()
|
|
||||||
break;
|
|
||||||
case 'export':
|
|
||||||
exportTable()
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
const selectionChange = (data) => {
|
|
||||||
console.log('data', data)
|
|
||||||
selectData.value=data.map(item=>item.id)
|
|
||||||
}
|
|
||||||
const exportTable = () => {
|
|
||||||
console.log('selectData',selectData.value)
|
|
||||||
if (selectData.value.length === 0) {
|
|
||||||
ElMessage.warning('请选择要导出的费用分摊')
|
|
||||||
return
|
|
||||||
}
|
|
||||||
shareDetailExport(selectData.value).then(res => {
|
|
||||||
console.log(res)
|
|
||||||
let fileName = `科技研发项目工时及成本分摊汇总表.xlsx`
|
|
||||||
const blob = new Blob([res.data])
|
|
||||||
let a = document.createElement('a')
|
|
||||||
a.href = URL.createObjectURL(blob)
|
|
||||||
a.download = fileName
|
|
||||||
a.click()
|
|
||||||
})
|
|
||||||
}
|
|
||||||
const handleAdd = () => {
|
|
||||||
router.push({
|
|
||||||
name: 'Sharedetail/add',
|
|
||||||
query: {}
|
|
||||||
})
|
|
||||||
}
|
|
||||||
const init = async () => {
|
|
||||||
const res = await getSubCompOpt()
|
|
||||||
searchConfig.value.find(item=>item.prop == 'affiliatedCompanyIds').props.data = res.data
|
|
||||||
}
|
|
||||||
|
|
||||||
// init()
|
|
||||||
|
|
||||||
</script>
|
|
||||||
<style scoped lang="scss">
|
|
||||||
:deep(.el-table__header) {
|
|
||||||
.is-leaf:first-child {
|
|
||||||
.cell {
|
|
||||||
//margin-left: -25px !important;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
:deep(.el-table__body) {
|
|
||||||
.el-table__cell:first-child {
|
|
||||||
.cell {
|
|
||||||
//margin-left: -13px !important;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
:deep(.el-date-editor--month){
|
|
||||||
width: 100%;
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
@@ -4,8 +4,7 @@
|
|||||||
<el-col :xs="24" :sm="24" :md="24" :lg="17" :xl="17">
|
<el-col :xs="24" :sm="24" :md="24" :lg="17" :xl="17">
|
||||||
<div class="top-left" id="topLeft">
|
<div class="top-left" id="topLeft">
|
||||||
<el-card shadow="never">
|
<el-card shadow="never">
|
||||||
<div class="notice-title">{{ getTimePeriod() }},提醒您<span>有<span>{{ taskTabList[0].num }}</span>个项目待立项</span>
|
<div class="notice-title">{{getTimePeriod()}},提醒您<span>有<span>{{ taskTabList[0].num }}</span>个项目待立项</span></div>
|
||||||
</div>
|
|
||||||
<el-row class="statistics">
|
<el-row class="statistics">
|
||||||
<el-col :xs="24" :sm="12" :md="12" :lg="6" :xl="6" v-for="(item,index) in taskTabList" :key="index">
|
<el-col :xs="24" :sm="12" :md="12" :lg="6" :xl="6" v-for="(item,index) in taskTabList" :key="index">
|
||||||
<div class="block" :style="{'background-image':'url('+getImgUrl(item.icon)+')'}"
|
<div class="block" :style="{'background-image':'url('+getImgUrl(item.icon)+')'}"
|
||||||
@@ -21,7 +20,7 @@
|
|||||||
<el-card shadow="never" class="todo-bg" @tab-add="refreshTodoOrDoneList(activeName)">
|
<el-card shadow="never" class="todo-bg" @tab-add="refreshTodoOrDoneList(activeName)">
|
||||||
<el-tabs v-model="activeName" editable>
|
<el-tabs v-model="activeName" editable>
|
||||||
<template #add-icon>
|
<template #add-icon>
|
||||||
<div @click="refreshTodoOrDoneList" style="margin-left: -50px;font-size: 14px">
|
<div @click="refreshTodoOrDoneList" style="margin-left: -50px">
|
||||||
刷新一下
|
刷新一下
|
||||||
<div style="width: 31px"></div>
|
<div style="width: 31px"></div>
|
||||||
</div>
|
</div>
|
||||||
@@ -29,14 +28,14 @@
|
|||||||
<el-tab-pane :label="'待办('+(todoList?.length||0) +')'" name="first">
|
<el-tab-pane :label="'待办('+(todoList?.length||0) +')'" name="first">
|
||||||
<div class="todo-top">
|
<div class="todo-top">
|
||||||
<div class="bell">
|
<div class="bell">
|
||||||
<el-icon size="16" color="#F55815">
|
<el-icon size="20" color="#F55815">
|
||||||
<BellFilled/>
|
<BellFilled/>
|
||||||
</el-icon>
|
</el-icon>
|
||||||
<span>您有{{ todoList?.length || 0 }}条待办需要处理</span>
|
<span>您有{{ todoList?.length || 0 }}条待办需要处理</span>
|
||||||
</div>
|
</div>
|
||||||
<div class="todo-more" @click="handleTodoList(1)">
|
<div class="todo-more" @click="handleTodoList(1)">
|
||||||
<span>查看更多</span>
|
<span>查看更多</span>
|
||||||
<el-icon color="#1F63E6" size="16">
|
<el-icon color="#1F63E6" size="18">
|
||||||
<ArrowRight/>
|
<ArrowRight/>
|
||||||
</el-icon>
|
</el-icon>
|
||||||
</div>
|
</div>
|
||||||
@@ -73,14 +72,14 @@
|
|||||||
<el-tab-pane :label="'已办(' + (doneList?.length||0) + ')'" name="second">
|
<el-tab-pane :label="'已办(' + (doneList?.length||0) + ')'" name="second">
|
||||||
<div class="todo-top">
|
<div class="todo-top">
|
||||||
<div class="bell">
|
<div class="bell">
|
||||||
<el-icon size="16" color="#F55815">
|
<el-icon size="20" color="#F55815">
|
||||||
<BellFilled/>
|
<BellFilled/>
|
||||||
</el-icon>
|
</el-icon>
|
||||||
<span>您有{{ todoList.length }}条待办需要处理</span>
|
<span>您有{{ todoList.length }}条待办需要处理</span>
|
||||||
</div>
|
</div>
|
||||||
<div class="todo-more" @click="handleTodoList(2)">
|
<div class="todo-more" @click="handleTodoList(2)">
|
||||||
<span>查看更多</span>
|
<span>查看更多</span>
|
||||||
<el-icon color="#1F63E6" size="16">
|
<el-icon color="#1F63E6" size="18">
|
||||||
<ArrowRight/>
|
<ArrowRight/>
|
||||||
</el-icon>
|
</el-icon>
|
||||||
</div>
|
</div>
|
||||||
@@ -133,16 +132,12 @@
|
|||||||
</el-icon>
|
</el-icon>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="notice-block notice-box">
|
<div class="notice-block">
|
||||||
<div v-if="noticeList&¬iceList.length==0">
|
<div v-if="noticeList&¬iceList.length==0">
|
||||||
<el-empty image-size="135" description="暂无通知公告~"/>
|
<el-empty image-size="135" description="暂无通知公告~"/>
|
||||||
</div>
|
</div>
|
||||||
<div v-for="(item,index) in noticeList" class="notice" @click="handleGoToArticleDetail(item)">
|
<div v-for="(item,index) in noticeList" class="notice" @click="handleGoToArticleDetail(item)">
|
||||||
<span>{{ index > 8 ? '' : 0 }}{{ index + 1 }}</span>
|
<span>{{ index > 8 ? '' : 0 }}{{ index + 1 }}</span>{{ item.articleTitle }}
|
||||||
<span>{{ item.articleTitle }}</span>
|
|
||||||
<span>
|
|
||||||
{{ item.articleTime }}
|
|
||||||
</span>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -245,7 +240,7 @@
|
|||||||
<!-- <div>-->
|
<!-- <div>-->
|
||||||
<!-- <span>{{ index > 8 ? '' : 0 }}{{ index + 1 }}</span>{{ item.title }}-->
|
<!-- <span>{{ index > 8 ? '' : 0 }}{{ index + 1 }}</span>{{ item.title }}-->
|
||||||
<!-- </div>-->
|
<!-- </div>-->
|
||||||
<div :style="{'color': item.isRead ? '#1F63E6' : '#000'}">
|
<div :style="{'color': item.isRead ? '#1F63E6' : 'rgba(0,0,0,0.5)'}">
|
||||||
<span>{{ item.articleTitle }}</span>
|
<span>{{ item.articleTitle }}</span>
|
||||||
<span class="dot" v-if="item.isRead"></span>
|
<span class="dot" v-if="item.isRead"></span>
|
||||||
</div>
|
</div>
|
||||||
@@ -384,8 +379,8 @@ const fundPieOption = ref({
|
|||||||
align: 'left',
|
align: 'left',
|
||||||
icon: 'circle',
|
icon: 'circle',
|
||||||
textStyle: {
|
textStyle: {
|
||||||
color: '#000',
|
color: 'rgba(0,0,0,0.6)',
|
||||||
fontSize: '14px'
|
fontSize: '12px'
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
graphic: { //图形中间图片
|
graphic: { //图形中间图片
|
||||||
@@ -398,19 +393,18 @@ const fundPieOption = ref({
|
|||||||
},
|
},
|
||||||
left: 'center',
|
left: 'center',
|
||||||
right: 'center',
|
right: 'center',
|
||||||
top: '45%'
|
top: '42%'
|
||||||
}]
|
}]
|
||||||
},
|
},
|
||||||
series: [
|
series: [
|
||||||
{
|
{
|
||||||
type: 'pie',
|
type: 'pie',
|
||||||
radius: [65, 90],
|
radius: [65, 90],
|
||||||
center: ['50%', '55%'],
|
center: ['50%', '50%'],
|
||||||
top: '10%',
|
top: '10%',
|
||||||
left: '8',
|
left: '8',
|
||||||
label: {
|
label: {
|
||||||
show: true,
|
show: true,
|
||||||
fontSize:14,
|
|
||||||
formatter: '{b}\n{d}%'
|
formatter: '{b}\n{d}%'
|
||||||
// formatter: params => {
|
// formatter: params => {
|
||||||
// console.log(params)
|
// console.log(params)
|
||||||
@@ -452,12 +446,12 @@ const fundPieOption = ref({
|
|||||||
clockWise: false,
|
clockWise: false,
|
||||||
hoverAnimation: false,
|
hoverAnimation: false,
|
||||||
radius: ['70%', '70%'],//边框大小
|
radius: ['70%', '70%'],//边框大小
|
||||||
center: ['50%', '55%'],//边框位置
|
center: ['50%', '50%'],//边框位置
|
||||||
tooltip: {
|
tooltip: {
|
||||||
show: false
|
show: false
|
||||||
},
|
},
|
||||||
label: {
|
label: {
|
||||||
show: false,
|
show: false
|
||||||
},
|
},
|
||||||
emphasis: {
|
emphasis: {
|
||||||
show: false
|
show: false
|
||||||
@@ -487,7 +481,6 @@ const moneyPieOption = ref({
|
|||||||
center: ['50%', '50%'],
|
center: ['50%', '50%'],
|
||||||
label: {
|
label: {
|
||||||
normal: {
|
normal: {
|
||||||
fontSize:14,
|
|
||||||
show: true,
|
show: true,
|
||||||
position: 'inner',
|
position: 'inner',
|
||||||
formatter: function (data) {
|
formatter: function (data) {
|
||||||
@@ -527,7 +520,7 @@ onMounted(async () => {
|
|||||||
helpDocList.value = await getArticleList(2)
|
helpDocList.value = await getArticleList(2)
|
||||||
problemList.value = await getArticleList(3)
|
problemList.value = await getArticleList(3)
|
||||||
})
|
})
|
||||||
const getTimePeriod = () => {
|
const getTimePeriod=()=>{
|
||||||
// 获取当前日期和时间
|
// 获取当前日期和时间
|
||||||
const now = new Date();
|
const now = new Date();
|
||||||
// 获取当前小时数
|
// 获取当前小时数
|
||||||
@@ -546,7 +539,7 @@ const getTimePeriod = () => {
|
|||||||
return "晚上好";
|
return "晚上好";
|
||||||
} else if (hour >= 23 || hour <= 1) {
|
} else if (hour >= 23 || hour <= 1) {
|
||||||
return "午夜好";
|
return "午夜好";
|
||||||
} else if (hour > 1 && hour <= 5) {
|
} else if (hour > 1&& hour <= 5) {
|
||||||
return "夜深了";
|
return "夜深了";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -555,7 +548,7 @@ const handleTodoList = (type) => {
|
|||||||
router.push({
|
router.push({
|
||||||
path: '/todolist',
|
path: '/todolist',
|
||||||
})
|
})
|
||||||
} else if (type == 2) {
|
} else if (type == 2){
|
||||||
router.push({
|
router.push({
|
||||||
path: '/donelist',
|
path: '/donelist',
|
||||||
})
|
})
|
||||||
@@ -569,23 +562,23 @@ const handleGoToArticleDetail = (row) => {
|
|||||||
}
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
const goToArticleList = (type, otherHelpType) => {
|
const goToArticleList = (type,otherHelpType) => {
|
||||||
let queryType = ''
|
let queryType=''
|
||||||
if (type) {
|
if(type){
|
||||||
queryType = type
|
queryType=type
|
||||||
} else {
|
}else{
|
||||||
console.info("🚀 ~method:'otherHelpType' -----", otherHelpType)
|
console.info("🚀 ~method:'otherHelpType' -----", otherHelpType)
|
||||||
if (otherHelpType == 'first') {
|
if(otherHelpType=='first'){
|
||||||
queryType = '1'
|
queryType= '1'
|
||||||
} else if (otherHelpType == 'second') {
|
}else if(otherHelpType=='second'){
|
||||||
queryType = '2'
|
queryType= '2'
|
||||||
} else if (otherHelpType == 'third') {
|
}else if(otherHelpType=='third'){
|
||||||
queryType = '3'
|
queryType= '3'
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
router.push({
|
router.push({
|
||||||
name: 'Manage',
|
name: 'Manage',
|
||||||
query: {
|
query:{
|
||||||
type: queryType
|
type: queryType
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
@@ -800,7 +793,7 @@ const handleView = (row) => {
|
|||||||
// }
|
// }
|
||||||
// })
|
// })
|
||||||
// }
|
// }
|
||||||
else if (row.targetState == '10' || row.targetState == '20' || row.targetState == '40' || row.targetState == '50') {
|
else if (row.targetState == '10'||row.targetState == '20' || row.targetState == '40' || row.targetState == '50') {
|
||||||
router.push({
|
router.push({
|
||||||
name: 'Implementation/detail',
|
name: 'Implementation/detail',
|
||||||
query: {
|
query: {
|
||||||
@@ -841,13 +834,6 @@ const handleView = (row) => {
|
|||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style lang="scss" scoped>
|
<style lang="scss" scoped>
|
||||||
:deep(.el-input){
|
|
||||||
width: 84px!important;
|
|
||||||
}
|
|
||||||
:deep(.el-input__inner){
|
|
||||||
font-size: 14px;
|
|
||||||
color: #000;
|
|
||||||
}
|
|
||||||
@media (min-width: 1200px) and (max-width: 1918px) {
|
@media (min-width: 1200px) and (max-width: 1918px) {
|
||||||
//.right-top {
|
//.right-top {
|
||||||
// height: 684px !important;
|
// height: 684px !important;
|
||||||
@@ -1010,7 +996,7 @@ const handleView = (row) => {
|
|||||||
.total-money {
|
.total-money {
|
||||||
height: 25px;
|
height: 25px;
|
||||||
font-weight: 400;
|
font-weight: 400;
|
||||||
font-size: 14px;
|
font-size: 15px;
|
||||||
color: #000000;
|
color: #000000;
|
||||||
line-height: 18px;
|
line-height: 18px;
|
||||||
}
|
}
|
||||||
@@ -1046,14 +1032,14 @@ const handleView = (row) => {
|
|||||||
|
|
||||||
> div:last-child {
|
> div:last-child {
|
||||||
font-weight: 400;
|
font-weight: 400;
|
||||||
font-size: 14px;
|
font-size: 15px;
|
||||||
color: #000000;
|
color: #000000;
|
||||||
letter-spacing: 1px;
|
letter-spacing: 1px;
|
||||||
margin-left: 28px;
|
margin-left: 28px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.company-name {
|
.company-name {
|
||||||
font-size: 14px;
|
font-size: 12px;
|
||||||
color: rgba(0, 0, 0, 0.6);
|
color: rgba(0, 0, 0, 0.6);
|
||||||
letter-spacing: 1px;
|
letter-spacing: 1px;
|
||||||
margin-left: 10px;
|
margin-left: 10px;
|
||||||
@@ -1139,11 +1125,11 @@ const handleView = (row) => {
|
|||||||
.el-tabs__nav {
|
.el-tabs__nav {
|
||||||
.el-tabs__item {
|
.el-tabs__item {
|
||||||
flex: 1;
|
flex: 1;
|
||||||
font-size: 14px;
|
font-size: 16px;
|
||||||
width: 100px;
|
width: 120px;
|
||||||
//font-weight: 600;
|
//font-weight: 600;
|
||||||
height: 51px;
|
height: 51px;
|
||||||
color: #000;
|
color: rgba(0, 0, 0, 0.5);
|
||||||
}
|
}
|
||||||
|
|
||||||
.el-tabs__item.is-active {
|
.el-tabs__item.is-active {
|
||||||
@@ -1206,7 +1192,7 @@ const handleView = (row) => {
|
|||||||
margin-left: 14px;
|
margin-left: 14px;
|
||||||
color: #000000;
|
color: #000000;
|
||||||
letter-spacing: 1px;
|
letter-spacing: 1px;
|
||||||
font-size: 14px;
|
font-size: 16px;
|
||||||
|
|
||||||
> span {
|
> span {
|
||||||
color: #F40E0E;
|
color: #F40E0E;
|
||||||
@@ -1269,7 +1255,7 @@ const handleView = (row) => {
|
|||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
//align-items: flex-end;
|
//align-items: flex-end;
|
||||||
font-weight: 400;
|
font-weight: 400;
|
||||||
color:#000;
|
color: rgba(0, 0, 0, 0.5);
|
||||||
letter-spacing: 1px;
|
letter-spacing: 1px;
|
||||||
font-size: 12px;
|
font-size: 12px;
|
||||||
|
|
||||||
@@ -1352,7 +1338,7 @@ const handleView = (row) => {
|
|||||||
justify-content: space-between;
|
justify-content: space-between;
|
||||||
font-size: 14px;
|
font-size: 14px;
|
||||||
margin-bottom: 12px;
|
margin-bottom: 12px;
|
||||||
margin-left: 4px;
|
margin-left: 20px;
|
||||||
|
|
||||||
|
|
||||||
.bell {
|
.bell {
|
||||||
@@ -1389,13 +1375,13 @@ const handleView = (row) => {
|
|||||||
|
|
||||||
> span:first-child {
|
> span:first-child {
|
||||||
white-space: nowrap;
|
white-space: nowrap;
|
||||||
font-size: 34px;
|
font-size: 36px;
|
||||||
font-weight: bold;
|
font-weight: bold;
|
||||||
margin-bottom: 10px;
|
margin-bottom: 10px;
|
||||||
|
|
||||||
> span {
|
> span {
|
||||||
margin-left: 10px;
|
margin-left: 10px;
|
||||||
font-size: 14px;
|
font-size: 13px;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1403,7 +1389,6 @@ const handleView = (row) => {
|
|||||||
white-space: nowrap;
|
white-space: nowrap;
|
||||||
color: #fff;
|
color: #fff;
|
||||||
margin-bottom: 10px;
|
margin-bottom: 10px;
|
||||||
font-size: 14px;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1428,7 +1413,8 @@ const handleView = (row) => {
|
|||||||
justify-content: space-between;
|
justify-content: space-between;
|
||||||
height: 47px !important;
|
height: 47px !important;
|
||||||
line-height: 47px !important;
|
line-height: 47px !important;
|
||||||
color: #000 !important;
|
color: rgba(0, 0, 0, 0.5) !important;
|
||||||
|
|
||||||
> div:first-child {
|
> div:first-child {
|
||||||
position: relative;
|
position: relative;
|
||||||
text-overflow: ellipsis;
|
text-overflow: ellipsis;
|
||||||
@@ -1465,35 +1451,7 @@ const handleView = (row) => {
|
|||||||
margin-left: 20px;
|
margin-left: 20px;
|
||||||
font-weight: 400;
|
font-weight: 400;
|
||||||
letter-spacing: 1px;
|
letter-spacing: 1px;
|
||||||
color: #000
|
color: rgba(0, 0, 0, 0.5)
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.notice-box {
|
|
||||||
|
|
||||||
.notice {
|
|
||||||
display: flex;
|
|
||||||
justify-content: space-between;
|
|
||||||
|
|
||||||
> span:first-child {
|
|
||||||
margin-right: 10px;
|
|
||||||
margin-left: 10px;
|
|
||||||
color: #1476E3;
|
|
||||||
font-weight: bold;
|
|
||||||
font-size: 16px;
|
|
||||||
}
|
|
||||||
|
|
||||||
> span:nth-child(2) {
|
|
||||||
display: block;
|
|
||||||
width: 65%;
|
|
||||||
overflow: hidden;
|
|
||||||
text-overflow: ellipsis;
|
|
||||||
}
|
|
||||||
|
|
||||||
&:hover {
|
|
||||||
color: #1476E3;
|
|
||||||
background: #F6FBFE;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1527,7 +1485,7 @@ const handleView = (row) => {
|
|||||||
height: 75px;
|
height: 75px;
|
||||||
line-height: 75px;
|
line-height: 75px;
|
||||||
padding: 0 15px;
|
padding: 0 15px;
|
||||||
font-size: 14px;
|
font-size: 12px;
|
||||||
white-space: nowrap;
|
white-space: nowrap;
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
text-overflow: ellipsis;
|
text-overflow: ellipsis;
|
||||||
@@ -1535,9 +1493,9 @@ const handleView = (row) => {
|
|||||||
> span:first-child {
|
> span:first-child {
|
||||||
margin-right: 10px;
|
margin-right: 10px;
|
||||||
margin-left: 10px;
|
margin-left: 10px;
|
||||||
font-size: 14px;
|
|
||||||
color: #1476E3;
|
color: #1476E3;
|
||||||
font-weight: bold;
|
font-weight: bold;
|
||||||
|
font-size: 16px;
|
||||||
}
|
}
|
||||||
|
|
||||||
&:hover {
|
&:hover {
|
||||||
@@ -1566,8 +1524,8 @@ const handleView = (row) => {
|
|||||||
.fund-pie {
|
.fund-pie {
|
||||||
width: 100%;
|
width: 100%;
|
||||||
height: 25px;
|
height: 25px;
|
||||||
font-size: 14px;
|
font-size: 12px;
|
||||||
color: #000;
|
color: rgba(0, 0, 0, 0.5);
|
||||||
text-align: center;
|
text-align: center;
|
||||||
//margin-top: 15px;
|
//margin-top: 15px;
|
||||||
}
|
}
|
||||||
@@ -1585,7 +1543,7 @@ const handleView = (row) => {
|
|||||||
|
|
||||||
.tag {
|
.tag {
|
||||||
width: 7px;
|
width: 7px;
|
||||||
height: 14px;
|
height: 18px;
|
||||||
background: linear-gradient(#1476E3 0%, #99C9FF 100%);
|
background: linear-gradient(#1476E3 0%, #99C9FF 100%);
|
||||||
margin-right: 5px;
|
margin-right: 5px;
|
||||||
border-radius: 2px;
|
border-radius: 2px;
|
||||||
@@ -1595,7 +1553,6 @@ const handleView = (row) => {
|
|||||||
> span {
|
> span {
|
||||||
white-space: nowrap;
|
white-space: nowrap;
|
||||||
color: #000000;
|
color: #000000;
|
||||||
font-size: 14px;
|
|
||||||
//font-weight: 600;
|
//font-weight: 600;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
<template>
|
<template>
|
||||||
|
|
||||||
<div class="login-box">
|
<div class="login-box">
|
||||||
<el-form
|
<el-form
|
||||||
:model="loginForm"
|
:model="loginForm"
|
||||||
|
|||||||
@@ -79,14 +79,14 @@
|
|||||||
<div v-else>--</div>
|
<div v-else>--</div>
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
<!-- <el-table-column prop="resultForm" label="预期成果形式" align="center" min-width="100px">-->
|
<el-table-column prop="resultForm" label="预期成果形式" align="center" min-width="100px">
|
||||||
<!-- <template #default="scope">-->
|
<template #default="scope">
|
||||||
<!-- <div v-if="scope.row.resultForm !== null">-->
|
<div v-if="scope.row.resultForm !== null">
|
||||||
<!-- <Tag style="margin-top: 3px" dictType="result_form" v-for="item in scope.row.resultForm" :value="item"/>-->
|
<Tag style="margin-top: 3px" dictType="result_form" v-for="item in scope.row.resultForm" :value="item"/>
|
||||||
<!-- </div>-->
|
</div>
|
||||||
<!-- <div v-else>--</div>-->
|
<div v-else>--</div>
|
||||||
<!-- </template>-->
|
</template>
|
||||||
<!-- </el-table-column>-->
|
</el-table-column>
|
||||||
<el-table-column prop="technicalStandard" label="预期技术标准制定" align="center">
|
<el-table-column prop="technicalStandard" label="预期技术标准制定" align="center">
|
||||||
<template #default="scope">
|
<template #default="scope">
|
||||||
<div v-if="scope.row.technicalStandard !== null">
|
<div v-if="scope.row.technicalStandard !== null">
|
||||||
@@ -114,22 +114,15 @@
|
|||||||
<el-table-column prop="prospectiveIntellectualProperty" label="预期知识产权" align="center" width="190">
|
<el-table-column prop="prospectiveIntellectualProperty" label="预期知识产权" align="center" width="190">
|
||||||
<template #default="scope">
|
<template #default="scope">
|
||||||
<div style="text-align: left">
|
<div style="text-align: left">
|
||||||
专利({{ scope.row.newPatent ? scope.row.newPatent : 0 }})项,<br>
|
发明专利({{ scope.row.inventionPatent ? scope.row.inventionPatent : 0 }})项,<br>
|
||||||
|
实用新型专利({{ scope.row.newPatent ? scope.row.newPatent : 0 }})项,<br>
|
||||||
软件著作权({{ scope.row.softwareCopyright ? scope.row.softwareCopyright : 0 }})项,<br>
|
软件著作权({{ scope.row.softwareCopyright ? scope.row.softwareCopyright : 0 }})项,<br>
|
||||||
技术标准({{ scope.row.technicalNorms ? scope.row.technicalNorms : 0 }})项,<br>
|
著作权({{ scope.row.copyright ? scope.row.copyright : 0 }})项,<br>
|
||||||
新产品({{ scope.row.newProduct ? scope.row.newProduct : 0 }})项,<br>
|
其他({{ scope.row.other ? scope.row.other : 0 }})项,
|
||||||
新工艺({{ scope.row.newProcess ? scope.row.newProcess : 0 }})项,<br>
|
|
||||||
新装置({{ scope.row.newDevice ? scope.row.newDevice : 0 }})项,<br>
|
|
||||||
新材料({{ scope.row.newMaterials ? scope.row.newMaterials : 0 }})项,<br>
|
|
||||||
计算机软件({{ scope.row.computerSoftware ? scope.row.computerSoftware : 0 }})项,<br>
|
|
||||||
论文论著({{ scope.row.thesis ? scope.row.thesis : 0 }})项,<br>
|
|
||||||
研究报告({{ scope.row.researchReport ? scope.row.researchReport : 0 }})项,<br>
|
|
||||||
商标({{ scope.row.trademark ? scope.row.trademark : 0 }})项,<br>
|
|
||||||
其他项:<br> <span style="white-space: pre-wrap;">{{ scope.row.other ? scope.row.other : 0 }}</span>
|
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
<el-table-column prop="intellectualProperty" label="知识产权归属" align="center">
|
<el-table-column prop="intellectualProperty" label="知识产权状况" align="center">
|
||||||
<template #default="scope">
|
<template #default="scope">
|
||||||
<div v-if="scope.row.intellectualProperty !== null">
|
<div v-if="scope.row.intellectualProperty !== null">
|
||||||
<Tag dictType="intellectual_property" :value="scope.row.intellectualProperty"/>
|
<Tag dictType="intellectual_property" :value="scope.row.intellectualProperty"/>
|
||||||
@@ -137,12 +130,12 @@
|
|||||||
<div v-else>--</div>
|
<div v-else>--</div>
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
<el-table-column prop="intellectualProperty" label="预估经费预算(元)" align="center">
|
<el-table-column prop="intellectualProperty" label="经费预算(元)" align="center">
|
||||||
<template #default="scope">
|
<template #default="scope">
|
||||||
<span>{{ toThousands(scope.row.economicEstimate) }}</span>
|
<span>{{ toThousands(scope.row.economicEstimate) }}</span>
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
<el-table-column prop="specialFundAmount" label="预估专项资金(元)" align="center">
|
<el-table-column prop="specialFundAmount" label="专项资金(元)" align="center">
|
||||||
<template #default="scope">
|
<template #default="scope">
|
||||||
<span>{{ toThousands(scope.row.specialFundAmount) }}</span>
|
<span>{{ toThousands(scope.row.specialFundAmount) }}</span>
|
||||||
</template>
|
</template>
|
||||||
|
|||||||
@@ -46,11 +46,6 @@ const tableConfig = reactive({
|
|||||||
return (tableIns.value.getQuery().pageNum - 1) * tableIns.value.getQuery().pageSize + index + 1
|
return (tableIns.value.getQuery().pageNum - 1) * tableIns.value.getQuery().pageSize + index + 1
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
|
||||||
prop: 'processNumber',
|
|
||||||
label: '征集编号',
|
|
||||||
align: 'center',
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
prop: 'requirementName',
|
prop: 'requirementName',
|
||||||
label: '征集名称',
|
label: '征集名称',
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="detail-block" v-loading="loading" :style="{padding:!formData.isSpecialFund?'0 30px':'0 0 0 30px'}">
|
<div class="detail-block" v-loading="loading" :style="{padding:!formData.isSpecialFund?'0 30px':'0 0 0 30px'}">
|
||||||
<baseTitle title="项目基本信息"></baseTitle>
|
<baseTitle title="项目基本信息"></baseTitle>
|
||||||
<el-form :model="formData" ref="summaryForm" :rules="rules" :label-width="!formData.isSpecialFund?145:160"
|
<el-form :model="formData" ref="summaryForm" :rules="rules" :label-width="!formData.isSpecialFund?130:160"
|
||||||
:scroll-to-error="true">
|
:scroll-to-error="true">
|
||||||
<el-row gutter="30" style="margin-bottom: -18px;"
|
<el-row gutter="30" style="margin-bottom: -18px;"
|
||||||
:style="{marginLeft:!formData.isSpecialFund?'-8.5px':'-48.5px'}">
|
:style="{marginLeft:!formData.isSpecialFund?'-8.5px':'-48.5px'}">
|
||||||
@@ -183,15 +183,15 @@
|
|||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-col>
|
</el-col>
|
||||||
<el-col :span="6" v-if="formData.isSpecialFund">
|
<el-col :span="6" v-if="formData.isSpecialFund">
|
||||||
<el-form-item label="预估专项资金(元)" prop="forecastSpecialFundAmount">
|
<el-form-item label="预估专项资金(元)" prop="specialFundAmount">
|
||||||
<el-input
|
<el-input
|
||||||
v-model="formData.forecastSpecialFundAmount"
|
v-model="formData.specialFundAmount"
|
||||||
placeholder="请输入预估专项资金"
|
placeholder="请输入预估专项资金"
|
||||||
clearable
|
clearable
|
||||||
:formatter="(value) => value.replace(/\B(?=(\d{3})+(?!\d))/g, ',')"
|
:formatter="(value) => value.replace(/\B(?=(\d{3})+(?!\d))/g, ',')"
|
||||||
:parser="(value) => value.replace(/\$\s?|(,*)+[^0-9.]/g, '')" @change="changeCollectData"
|
:parser="(value) => value.replace(/\$\s?|(,*)+[^0-9.]/g, '')" @change="changeCollectData"
|
||||||
/>
|
/>
|
||||||
<!-- <el-input-number v-model="formData.forecastSpecialFundAmount" placeholder="请输入预估专项资金" :controls="false"/>-->
|
<!-- <el-input-number v-model="formData.specialFundAmount" placeholder="请输入预估专项资金" :controls="false"/>-->
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-col>
|
</el-col>
|
||||||
<el-col :span="6" :style="{marginLeft:!formData.isSpecialFund?'0':'-40px'}">
|
<el-col :span="6" :style="{marginLeft:!formData.isSpecialFund?'0':'-40px'}">
|
||||||
@@ -232,10 +232,10 @@
|
|||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-col>
|
</el-col>
|
||||||
<el-col :span="6" :style="{marginLeft:!formData.isSpecialFund?route.query.id?'-10px':'0':'0'}">
|
<el-col :span="6" :style="{marginLeft:!formData.isSpecialFund?route.query.id?'-10px':'0':'0'}">
|
||||||
<el-form-item label="需求征集" prop="" required>
|
<el-form-item label="需求征集" prop="requirementId" required>
|
||||||
<template v-if="requirementDefaultName">{{ requirementDefaultName }}</template>
|
<template v-if="formData.requirementDefaultName">{{ formData.requirementDefaultName }}</template>
|
||||||
<el-select v-else v-model="formData.requirementId" clearable placeholder="请选择需求征集"
|
<el-select v-else v-model="formData.requirementId" clearable placeholder="请选择需求征集"
|
||||||
@change="changeCollectData();changeRequirement()">
|
@change="changeCollectData">
|
||||||
<el-option
|
<el-option
|
||||||
v-for="item in requirementList"
|
v-for="item in requirementList"
|
||||||
:key="item.value"
|
:key="item.value"
|
||||||
@@ -249,23 +249,23 @@
|
|||||||
<baseTitle title="预期知识产权"></baseTitle>
|
<baseTitle title="预期知识产权"></baseTitle>
|
||||||
<el-row gutter="30" style="margin-bottom: -18px;"
|
<el-row gutter="30" style="margin-bottom: -18px;"
|
||||||
:style="{marginLeft:!formData.isSpecialFund?'-8.5px':'-48.5px'}">
|
:style="{marginLeft:!formData.isSpecialFund?'-8.5px':'-48.5px'}">
|
||||||
<!-- <el-col :span="12">-->
|
<el-col :span="12">
|
||||||
<!-- <el-form-item label="预期成果形式" prop="resultForm"-->
|
<el-form-item label="预期成果形式" prop="resultForm"
|
||||||
<!-- :style="{marginRight:!formData.isSpecialFund?'0':route.query.id?'':'40px'}">-->
|
:style="{marginRight:!formData.isSpecialFund?'0':route.query.id?'':'40px'}">
|
||||||
<!-- <el-select v-model="formData.resultForm" placeholder="请选择预期成果形式" clearable filterable multiple-->
|
<el-select v-model="formData.resultForm" placeholder="请选择预期成果形式" clearable filterable multiple
|
||||||
<!-- @change="changeCollectData">-->
|
@change="changeCollectData">
|
||||||
<!-- <el-option-->
|
<el-option
|
||||||
<!-- v-for="item in cacheStore.getDict('result_form')"-->
|
v-for="item in cacheStore.getDict('result_form')"
|
||||||
<!-- :key="item.value"-->
|
:key="item.value"
|
||||||
<!-- :label="item.label"-->
|
:label="item.label"
|
||||||
<!-- :value="item.value"-->
|
:value="item.value"
|
||||||
<!-- />-->
|
/>
|
||||||
<!-- </el-select>-->
|
</el-select>
|
||||||
<!-- </el-form-item>-->
|
</el-form-item>
|
||||||
<!-- </el-col>-->
|
</el-col>
|
||||||
<el-col :span="6" >
|
<el-col :span="6" :style="{marginLeft:!formData.isSpecialFund?'-10px':'-40px'}">
|
||||||
<el-form-item label="知识产权归属" prop="intellectualProperty">
|
<el-form-item label="知识产权状况" prop="intellectualProperty">
|
||||||
<el-select v-model="formData.intellectualProperty" placeholder="请选择知识产权归属" clearable filterable
|
<el-select v-model="formData.intellectualProperty" placeholder="请选择知识产权状况" clearable filterable
|
||||||
@change="changeCollectData">
|
@change="changeCollectData">
|
||||||
<el-option
|
<el-option
|
||||||
v-for="item in cacheStore.getDict('intellectual_property')"
|
v-for="item in cacheStore.getDict('intellectual_property')"
|
||||||
@@ -276,80 +276,37 @@
|
|||||||
</el-select>
|
</el-select>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-col>
|
</el-col>
|
||||||
<el-col :span="6" :style="{marginLeft:!formData.isSpecialFund?'0':route.query.id?'0':'-40px'}" >
|
<el-col :span="6" :style="{marginLeft:!formData.isSpecialFund?'-10px':'-40px'}">
|
||||||
<el-form-item label="预估专利(项)" prop="newPatent">
|
<el-form-item label="发明专利(项)" prop="inventionPatent">
|
||||||
<el-input-number v-model="formData.newPatent" placeholder="请输入预估专利数量" :controls="false"
|
<el-input-number v-model="formData.inventionPatent" placeholder="请输入发明专利数量" :controls="false"
|
||||||
@change="changeCollectData"/>
|
@change="changeCollectData"/>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-col>
|
</el-col>
|
||||||
|
<el-col :span="6">
|
||||||
<el-col :span="6" :style="{marginLeft:!formData.isSpecialFund?'-10px':route.query.id?'-40px':'0'}">
|
<el-form-item label="新型专利(项)" prop="newPatent">
|
||||||
<el-form-item label="预估软件著作权(项)" prop="softwareCopyright">
|
<el-input-number v-model="formData.newPatent" placeholder="请输入实用性新型专利数量" :controls="false"
|
||||||
<el-input-number v-model="formData.softwareCopyright" placeholder="请输入预估软件著作权数量" :controls="false"
|
@change="changeCollectData"
|
||||||
@change="changeCollectData"/>
|
style="width: 100%"/>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-col>
|
</el-col>
|
||||||
|
<el-col :span="6" :style="{marginLeft:!formData.isSpecialFund?'0':route.query.id?'':'-40px'}">
|
||||||
<el-col :span="6" :style="{marginLeft:!formData.isSpecialFund?'-10px':route.query.id?'-40px':'-40px'}">
|
<el-form-item label="软件著作权(项)" prop="softwareCopyright">
|
||||||
<el-form-item label="预估技术标准(项)" prop="technicalNorms">
|
<el-input-number v-model="formData.softwareCopyright" placeholder="请输入软件著作权数量" :controls="false"
|
||||||
<el-input-number v-model="formData.technicalNorms" placeholder="请输入预估技术标准数量" :controls="false"
|
|
||||||
@change="changeCollectData"/>
|
|
||||||
</el-form-item>
|
|
||||||
</el-col>
|
|
||||||
<el-col :span="6" :style="{marginLeft:!formData.isSpecialFund?'0':route.query.id?'0':'0'}">
|
|
||||||
<el-form-item label="预估新产品(项)" prop="newProduct">
|
|
||||||
<el-input-number v-model="formData.newProduct" placeholder="请输入预估新产品数量" :controls="false"
|
|
||||||
@change="changeCollectData"/>
|
|
||||||
</el-form-item>
|
|
||||||
</el-col>
|
|
||||||
<el-col :span="6" :style="{marginLeft:!formData.isSpecialFund?'0':route.query.id?'0':'-40px'}">
|
|
||||||
<el-form-item label="预估新工艺(项)" prop="newProcess">
|
|
||||||
<el-input-number v-model="formData.newProcess" placeholder="请输入预估新工艺数量" :controls="false"
|
|
||||||
@change="changeCollectData"/>
|
@change="changeCollectData"/>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-col>
|
</el-col>
|
||||||
<el-col :span="6" :style="{marginLeft:!formData.isSpecialFund?'-10px':route.query.id?'-40px':'0'}">
|
<el-col :span="6" :style="{marginLeft:!formData.isSpecialFund?'-10px':route.query.id?'-40px':'0'}">
|
||||||
<el-form-item label="预估新装置(项)" prop="newDevice">
|
<el-form-item label="著作权(项)" prop="copyright">
|
||||||
<el-input-number v-model="formData.newDevice" placeholder="请输入预估新装置数量" :controls="false"
|
<el-input-number v-model="formData.copyright" placeholder="请输入著作权数量" :controls="false"
|
||||||
@change="changeCollectData"/>
|
@change="changeCollectData"/>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-col>
|
</el-col>
|
||||||
<el-col :span="6" :style="{marginLeft:!formData.isSpecialFund?'-10px':route.query.id?'-40px':'-40px'}">
|
<el-col :span="6" :style="{marginLeft:!formData.isSpecialFund?'-10px':'-40px'}">
|
||||||
<el-form-item label="预估新材料(项)" prop="newMaterials">
|
<el-form-item label="其他(项)" prop="other">
|
||||||
<el-input-number v-model="formData.newMaterials" placeholder="请输入预估新材料数量" :controls="false"
|
<el-input-number v-model="formData.other" placeholder="请输入其他数量" :controls="false"
|
||||||
@change="changeCollectData"/>
|
@change="changeCollectData"/>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-col>
|
</el-col>
|
||||||
<el-col :span="6" :style="{marginLeft:!formData.isSpecialFund?'0':route.query.id?'0':'0'}">
|
|
||||||
<el-form-item label="预估计算机软件(项)" prop="computerSoftware">
|
|
||||||
<el-input-number v-model="formData.computerSoftware" placeholder="请输入预估计算机软件数量" :controls="false"
|
|
||||||
@change="changeCollectData"/>
|
|
||||||
</el-form-item>
|
|
||||||
</el-col>
|
|
||||||
<el-col :span="6" :style="{marginLeft:!formData.isSpecialFund?'0':route.query.id?'0':'-40px'}">
|
|
||||||
<el-form-item label="预估论文论著(项)" prop="thesis">
|
|
||||||
<el-input-number v-model="formData.thesis" placeholder="请输入预估论文论著数量" :controls="false"
|
|
||||||
@change="changeCollectData"/>
|
|
||||||
</el-form-item>
|
|
||||||
</el-col>
|
|
||||||
<el-col :span="6" :style="{marginLeft:!formData.isSpecialFund?'-10px':route.query.id?'-40px':'0'}">
|
|
||||||
<el-form-item label="预估研究报告(项)" prop="researchReport">
|
|
||||||
<el-input-number v-model="formData.researchReport" placeholder="请输入预估研究报告数量" :controls="false"
|
|
||||||
@change="changeCollectData"/>
|
|
||||||
</el-form-item>
|
|
||||||
</el-col>
|
|
||||||
<el-col :span="6" :style="{marginLeft:!formData.isSpecialFund?'-10px':route.query.id?'-40px':'-40px'}">
|
|
||||||
<el-form-item label="预估商标(项)" prop="trademark">
|
|
||||||
<el-input-number v-model="formData.trademark" placeholder="请输入预估商标数量" :controls="false"
|
|
||||||
@change="changeCollectData"/>
|
|
||||||
</el-form-item>
|
|
||||||
</el-col>
|
|
||||||
<el-col :span="24" >
|
|
||||||
<el-form-item label="预估其他(项)" prop="other">
|
|
||||||
<el-input rows="4" type="textarea" v-model="formData.other" placeholder="请输入预估其他项"
|
|
||||||
@change="changeCollectData" :style="{marginRight:!formData.isSpecialFund?'20px':'80px'}"/>
|
|
||||||
</el-form-item>
|
|
||||||
</el-col>
|
|
||||||
</el-row>
|
</el-row>
|
||||||
<baseTitle title="项目描述"></baseTitle>
|
<baseTitle title="项目描述"></baseTitle>
|
||||||
<el-row gutter="30" style="margin-bottom: -18px;"
|
<el-row gutter="30" style="margin-bottom: -18px;"
|
||||||
@@ -431,10 +388,9 @@ import {useCacheStore} from '@/stores/cache.js'
|
|||||||
import {useProcessStore} from '@/stores/processStore.js';
|
import {useProcessStore} from '@/stores/processStore.js';
|
||||||
import {getSubCompOpt} from "@/api/user/user";
|
import {getSubCompOpt} from "@/api/user/user";
|
||||||
import ProcessDiagramViewer from '@/views/workflow/common/ProcessDiagramViewer.vue';
|
import ProcessDiagramViewer from '@/views/workflow/common/ProcessDiagramViewer.vue';
|
||||||
import {getFormInfo, getInfo} from "@/api/project-demand";
|
import {getFormInfo} from "@/api/project-demand";
|
||||||
import {getFundOption} from "@/api/special-fund";
|
import {getFundOption} from "@/api/special-fund";
|
||||||
import UserPicker from "@/views/workflow/process/common/UserPicker.vue";
|
import UserPicker from "@/views/workflow/process/common/UserPicker.vue";
|
||||||
import {nextTick} from "vue";
|
|
||||||
|
|
||||||
const authStore = useAuthStore()
|
const authStore = useAuthStore()
|
||||||
const changeDiagram = ref(false)
|
const changeDiagram = ref(false)
|
||||||
@@ -449,7 +405,6 @@ const loading = ref(false)
|
|||||||
const processDiagramViewer = ref(false)
|
const processDiagramViewer = ref(false)
|
||||||
const tagsViewStore = useTagsView()
|
const tagsViewStore = useTagsView()
|
||||||
const companyOption = ref([])
|
const companyOption = ref([])
|
||||||
const requirementDefaultName = ref('')
|
|
||||||
const summaryForm = ref()
|
const summaryForm = ref()
|
||||||
const deploymentId = ref()
|
const deploymentId = ref()
|
||||||
const optionalChargeLeadershipPickerRef = ref()
|
const optionalChargeLeadershipPickerRef = ref()
|
||||||
@@ -466,7 +421,6 @@ const formData = ref({
|
|||||||
isSpecialFund: false,
|
isSpecialFund: false,
|
||||||
industryUniversityResearch: '1',
|
industryUniversityResearch: '1',
|
||||||
governmentDeclaration: '1',
|
governmentDeclaration: '1',
|
||||||
other: '无',
|
|
||||||
resultForm: []
|
resultForm: []
|
||||||
})
|
})
|
||||||
|
|
||||||
@@ -480,31 +434,20 @@ const rules = reactive({
|
|||||||
investmentType: [{required: true, message: '请选择出资类型', trigger: ['blur', 'change']}],
|
investmentType: [{required: true, message: '请选择出资类型', trigger: ['blur', 'change']}],
|
||||||
projectImpact: [{required: true, message: '请选择项目影响', trigger: ['blur', 'change']}],
|
projectImpact: [{required: true, message: '请选择项目影响', trigger: ['blur', 'change']}],
|
||||||
businessSegment: [{required: true, message: '请选择所属业务板块', trigger: ['blur', 'change']}],
|
businessSegment: [{required: true, message: '请选择所属业务板块', trigger: ['blur', 'change']}],
|
||||||
// resultForm: [{required: true, message: '请选择预期成果形式', trigger: ['blur', 'change']}],
|
resultForm: [{required: true, message: '请选择预期成果形式', trigger: ['blur', 'change']}],
|
||||||
technicalStandard: [{required: true, message: '请选择预期技术标准制定', trigger: ['blur', 'change']}],
|
technicalStandard: [{required: true, message: '请选择预期技术标准制定', trigger: ['blur', 'change']}],
|
||||||
industryUniversityResearch: [{required: true, message: '请选择产学研联合', trigger: ['blur', 'change']}],
|
industryUniversityResearch: [{required: true, message: '请选择产学研联合', trigger: ['blur', 'change']}],
|
||||||
governmentDeclaration: [{required: true, message: '请选择开展政府申报', trigger: ['blur', 'change']}],
|
governmentDeclaration: [{required: true, message: '请选择开展政府申报', trigger: ['blur', 'change']}],
|
||||||
intellectualProperty: [{required: true, message: '请选择知识产权归属', trigger: ['blur', 'change']}],
|
intellectualProperty: [{required: true, message: '请选择知识产权状况', trigger: ['blur', 'change']}],
|
||||||
|
inventionPatent: [{required: true, message: '请输入发明专利数量', trigger: ['blur', 'change']}],
|
||||||
|
newPatent: [{required: true, message: '请输入实用性新型专利数量', trigger: ['blur', 'change']}],
|
||||||
newPatent: [{required: true, message: '请输入专利数量', trigger: ['blur', 'change']}],
|
|
||||||
technicalNorms: [{required: true, message: '请输入技术标准数量', trigger: ['blur', 'change']}],
|
|
||||||
softwareCopyright: [{required: true, message: '请输入软件著作权数量', trigger: ['blur', 'change']}],
|
softwareCopyright: [{required: true, message: '请输入软件著作权数量', trigger: ['blur', 'change']}],
|
||||||
newProduct: [{required: true, message: '请输入新产品数量', trigger: ['blur', 'change']}],
|
copyright: [{required: true, message: '请输入著作权数量', trigger: ['blur', 'change']}],
|
||||||
newProcess: [{required: true, message: '请输入新工艺数量', trigger: ['blur', 'change']}],
|
other: [{required: true, message: '请输入其他数量', trigger: ['blur', 'change']}],
|
||||||
newMaterials: [{required: true, message: '请输入新材料数量', trigger: ['blur', 'change']}],
|
|
||||||
newDevice: [{required: true, message: '请输入新装置数量', trigger: ['blur', 'change']}],
|
|
||||||
computerSoftware: [{required: true, message: '请输入计算机软件数量', trigger: ['blur', 'change']}],
|
|
||||||
thesis: [{required: true, message: '请输入论文论著数量', trigger: ['blur', 'change']}],
|
|
||||||
researchReport: [{required: true, message: '请输入研究报告数量', trigger: ['blur', 'change']}],
|
|
||||||
trademark: [{required: true, message: '请输入商标数量', trigger: ['blur', 'change']}],
|
|
||||||
other: [{required: true, message: '请输入其他项数量', trigger: ['blur', 'change']}],
|
|
||||||
|
|
||||||
|
|
||||||
economicEstimate: [{required: true, message: '请输入预估经费预算', trigger: ['blur', 'change']}],
|
economicEstimate: [{required: true, message: '请输入预估经费预算', trigger: ['blur', 'change']}],
|
||||||
isSpecialFund: [{required: true, message: '请选择是否为专项资金', trigger: ['blur', 'change']}],
|
isSpecialFund: [{required: true, message: '请选择是否为专项资金', trigger: ['blur', 'change']}],
|
||||||
isWithinBudget: [{required: true, message: '请选择是否在预算内', trigger: ['blur', 'change']}],
|
isWithinBudget: [{required: true, message: '请选择是否在预算内', trigger: ['blur', 'change']}],
|
||||||
forecastSpecialFundAmount: [{required: true, message: '请输入专项资金', trigger: ['blur', 'change']}],
|
specialFundAmount: [{required: true, message: '请输入专项资金', trigger: ['blur', 'change']}],
|
||||||
serviceDescription: [{required: true, message: '请输入现有业务描述', trigger: ['blur', 'change']}],
|
serviceDescription: [{required: true, message: '请输入现有业务描述', trigger: ['blur', 'change']}],
|
||||||
contentDescription: [{required: true, message: '请输入研发项目关键内容描述', trigger: ['blur', 'change']}]
|
contentDescription: [{required: true, message: '请输入研发项目关键内容描述', trigger: ['blur', 'change']}]
|
||||||
})
|
})
|
||||||
@@ -518,7 +461,6 @@ watch(() => singleList.value, (newVal) => {
|
|||||||
}, {deep: true})
|
}, {deep: true})
|
||||||
localStorage.removeItem('originallySelectedList')
|
localStorage.removeItem('originallySelectedList')
|
||||||
if (name.value === 'Summary/edit') {
|
if (name.value === 'Summary/edit') {
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
if (localStorage.getItem('collectData')) {
|
if (localStorage.getItem('collectData')) {
|
||||||
let collectData = JSON.parse(localStorage.getItem('collectData'))
|
let collectData = JSON.parse(localStorage.getItem('collectData'))
|
||||||
@@ -531,31 +473,9 @@ if (name.value === 'Summary/edit') {
|
|||||||
formData.value = collectData
|
formData.value = collectData
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
const changeRequirement=async ()=>{
|
|
||||||
await getInfo(formData.value.requirementId).then(res => {
|
|
||||||
if (res.code === 1000) {
|
|
||||||
|
|
||||||
console.log('formData.requirementId',formData.value.requirementId,res)
|
|
||||||
formData.value.isSpecialFund = res.data.formData.isSpecialFund
|
|
||||||
if ( res.data.formData.isSpecialFund) {
|
|
||||||
formData.value.specialFundId = res.data.formData.specialFundId
|
|
||||||
formData.value.specialFund = res.data.formData.specialFund
|
|
||||||
}else{
|
|
||||||
formData.value.specialFundId = null
|
|
||||||
formData.value.specialFund = null
|
|
||||||
}
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
|
||||||
const changeCollectData = () => {
|
const changeCollectData = () => {
|
||||||
if (name.value === 'Summary/edit') {
|
if (name.value === 'Summary/edit') {
|
||||||
// params.fileList= attachment.value.allFileList
|
// params.fileList= attachment.value.allFileList
|
||||||
let params = {
|
|
||||||
...formData.value,
|
|
||||||
deploymentId: deploymentId.value,
|
|
||||||
requirementId: route.query.id ? route.query.id : formData.value.requirementId ? formData.value.requirementId : null
|
|
||||||
}
|
|
||||||
localStorage.setItem(`collectResubmitData-${route.query.projectId}`, JSON.stringify(params))
|
|
||||||
} else {
|
} else {
|
||||||
let params = {
|
let params = {
|
||||||
...formData.value,
|
...formData.value,
|
||||||
@@ -587,25 +507,14 @@ const disabledDate = (time) => {
|
|||||||
const getProjectList = () => {
|
const getProjectList = () => {
|
||||||
getProjectOption().then(res => {
|
getProjectOption().then(res => {
|
||||||
if (res.code === 1000) {
|
if (res.code === 1000) {
|
||||||
if(name.value === 'Summary/edit'){
|
|
||||||
masterProjectList.value = res.data.filter(item => item.value!=route.query.projectId)
|
|
||||||
}else{
|
|
||||||
masterProjectList.value = res.data
|
masterProjectList.value = res.data
|
||||||
}
|
}
|
||||||
}
|
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
getProjectList()
|
getProjectList()
|
||||||
const getRequirementList = () => {
|
const getRequirementList = () => {
|
||||||
getRequirementOption().then(res => {
|
getRequirementOption().then(res => {
|
||||||
if (res.code === 1000) {
|
if (res.code === 1000) {
|
||||||
res.data= res.data?.map(item=>{
|
|
||||||
return {
|
|
||||||
label: item.label,
|
|
||||||
value: item.value+''
|
|
||||||
}
|
|
||||||
})
|
|
||||||
requirementList.value = res.data
|
requirementList.value = res.data
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
@@ -616,7 +525,7 @@ const getIsFund = async () => {
|
|||||||
// loading.value = true
|
// loading.value = true
|
||||||
await getFormInfo(route.query.id).then(res => {
|
await getFormInfo(route.query.id).then(res => {
|
||||||
if (res.code === 1000) {
|
if (res.code === 1000) {
|
||||||
requirementDefaultName.value = res.data.requirementName
|
formData.value.requirementDefaultName = res.data.requirementName
|
||||||
// loading.value = false
|
// loading.value = false
|
||||||
formData.value.isSpecialFund = res.data.isSpecialFund
|
formData.value.isSpecialFund = res.data.isSpecialFund
|
||||||
if (res.data.isSpecialFund) {
|
if (res.data.isSpecialFund) {
|
||||||
@@ -727,11 +636,8 @@ const handleSubmit = debounce(async (instance) => {
|
|||||||
if (formData.value.singleFile !== undefined) {
|
if (formData.value.singleFile !== undefined) {
|
||||||
formData.value.singleFile = getFileParam(formData.value.singleFile)
|
formData.value.singleFile = getFileParam(formData.value.singleFile)
|
||||||
}
|
}
|
||||||
if (formData.value.isSpecialFund) {
|
if (formData.value.isSpecialFund && !formData.value.specialFund) {
|
||||||
formData.value.specialFund = getFundName(formData.value.specialFundId)
|
formData.value.specialFund = getFundName(formData.value.specialFundId)
|
||||||
}else{
|
|
||||||
formData.value.specialFundId = 0
|
|
||||||
formData.value.specialFund=null
|
|
||||||
}
|
}
|
||||||
if (formData.value.masterProjectId) {
|
if (formData.value.masterProjectId) {
|
||||||
formData.value.masterProjectName = getProjectName(formData.value.masterProjectId)
|
formData.value.masterProjectName = getProjectName(formData.value.masterProjectId)
|
||||||
@@ -790,11 +696,8 @@ const handleResubmit = debounce((instance) => {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
formData.value.optionalChargeLeadership = optionalChargeLeadershipList.value
|
formData.value.optionalChargeLeadership = optionalChargeLeadershipList.value
|
||||||
if (formData.value.isSpecialFund) {
|
if (formData.value.isSpecialFund && !formData.value.specialFund) {
|
||||||
formData.value.specialFund = getFundName(formData.value.specialFundId)
|
formData.value.specialFund = getFundName(formData.value.specialFundId)
|
||||||
}else{
|
|
||||||
formData.value.specialFundId = 0
|
|
||||||
formData.value.specialFund=null
|
|
||||||
}
|
}
|
||||||
if (formData.value.masterProjectId) {
|
if (formData.value.masterProjectId) {
|
||||||
formData.value.masterProjectName = getProjectName(formData.value.masterProjectId)
|
formData.value.masterProjectName = getProjectName(formData.value.masterProjectId)
|
||||||
@@ -819,7 +722,7 @@ const handleResubmit = debounce((instance) => {
|
|||||||
fileList: otherFiles,
|
fileList: otherFiles,
|
||||||
requirementId: route.query.id ? route.query.id : formData.value.requirementId ? formData.value.requirementId : '-1'
|
requirementId: route.query.id ? route.query.id : formData.value.requirementId ? formData.value.requirementId : '-1'
|
||||||
}
|
}
|
||||||
console.log('重新提交params', params)
|
// console.log('重新提交params', params, formData.value.specialFund, formData.value.specialFundId)
|
||||||
resubmitReported(params).then(res => {
|
resubmitReported(params).then(res => {
|
||||||
ElNotification({
|
ElNotification({
|
||||||
title: '提示',
|
title: '提示',
|
||||||
@@ -831,8 +734,8 @@ const handleResubmit = debounce((instance) => {
|
|||||||
router.push({
|
router.push({
|
||||||
name: 'Summary'
|
name: 'Summary'
|
||||||
})
|
})
|
||||||
|
// localStorage.removeItem('collectData')
|
||||||
}
|
}
|
||||||
localStorage.removeItem(`collectResubmitData-${route.query.projectId}`)
|
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
@@ -849,25 +752,7 @@ const getDetailInfo = async () => {
|
|||||||
opentionData.value = res.data
|
opentionData.value = res.data
|
||||||
optionalChargeLeadershipList.value = formData.value.optionalChargeLeadership
|
optionalChargeLeadershipList.value = formData.value.optionalChargeLeadership
|
||||||
loading.value = false
|
loading.value = false
|
||||||
|
|
||||||
if (name.value === 'Summary/edit') {
|
|
||||||
if (localStorage.getItem(`collectResubmitData-${route.query.projectId}`)) {
|
|
||||||
let collectResubmitData = JSON.parse(localStorage.getItem(`collectResubmitData-${route.query.projectId}`))
|
|
||||||
|
|
||||||
if(formData.value.projectId==collectResubmitData.projectId){
|
|
||||||
|
|
||||||
if (collectResubmitData.fileList) {
|
|
||||||
otherFileList.value = collectResubmitData.fileList
|
|
||||||
}
|
|
||||||
if (collectResubmitData.optionalChargeLeadership) {
|
|
||||||
optionalChargeLeadershipList.value = collectResubmitData.optionalChargeLeadership
|
|
||||||
}
|
|
||||||
formData.value = collectResubmitData
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}else{
|
}else{
|
||||||
loading.value = false
|
|
||||||
ElNotification({
|
ElNotification({
|
||||||
title: '提示',
|
title: '提示',
|
||||||
message: res.msg,
|
message: res.msg,
|
||||||
|
|||||||
@@ -6,7 +6,7 @@
|
|||||||
|
|
||||||
<script setup lang="jsx">
|
<script setup lang="jsx">
|
||||||
import fvSelect from '@/fvcomponents/fvSelect/index.vue'
|
import fvSelect from '@/fvcomponents/fvSelect/index.vue'
|
||||||
import {addPlan, getProjectName, getRequirementName} from "@/api/project-demand/summary";
|
import {addPlan, getRequirementName} from "@/api/project-demand/summary";
|
||||||
import {getSubCompOpt} from "@/api/user/user";
|
import {getSubCompOpt} from "@/api/user/user";
|
||||||
import {filterRequirementName} from "@/api/project-demand";
|
import {filterRequirementName} from "@/api/project-demand";
|
||||||
|
|
||||||
@@ -73,36 +73,6 @@ const searchConfig = ref([
|
|||||||
},
|
},
|
||||||
component: shallowRef(fvSelect),
|
component: shallowRef(fvSelect),
|
||||||
},
|
},
|
||||||
{
|
|
||||||
label: '项目名称',
|
|
||||||
prop: 'projectName',
|
|
||||||
props: {
|
|
||||||
placeholder: '请输入项目名称',
|
|
||||||
clearable: true,
|
|
||||||
filterable: true,
|
|
||||||
options: [],
|
|
||||||
remote: true,
|
|
||||||
remoteMethod:async (val)=>{
|
|
||||||
if(val){
|
|
||||||
const res=await getProjectName(val)
|
|
||||||
if(res.code==1000){
|
|
||||||
let optionObj={}
|
|
||||||
let optionsMap = new Map();
|
|
||||||
res.data.rows.forEach(item=>{
|
|
||||||
optionObj={
|
|
||||||
value:item.projectName,
|
|
||||||
label:item.projectName
|
|
||||||
}
|
|
||||||
optionsMap.set(optionObj.value, optionObj);
|
|
||||||
})
|
|
||||||
// 将 Map 转换为数组
|
|
||||||
searchConfig.value.find(item => item.prop == 'projectName').props.options = Array.from(optionsMap.values())
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
component: shallowRef(fvSelect),
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
label: '项目类型',
|
label: '项目类型',
|
||||||
prop: 'projectType',
|
prop: 'projectType',
|
||||||
@@ -118,7 +88,7 @@ const searchConfig = ref([
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: '承办单位',
|
label: '承办单位',
|
||||||
prop: 'affiliatedCompanyId',
|
prop: 'undertaker',
|
||||||
component: 'el-tree-select',
|
component: 'el-tree-select',
|
||||||
props: {
|
props: {
|
||||||
placeholder: '请输入承办单位查询',
|
placeholder: '请输入承办单位查询',
|
||||||
@@ -248,11 +218,6 @@ const tableConfig = reactive({
|
|||||||
return (tableIns.value.getQuery().pageNum - 1) * tableIns.value.getQuery().pageSize + index + 1
|
return (tableIns.value.getQuery().pageNum - 1) * tableIns.value.getQuery().pageSize + index + 1
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
|
||||||
prop: 'processNumber',
|
|
||||||
label: '项目编号',
|
|
||||||
align: 'center',
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
prop: 'requirementName',
|
prop: 'requirementName',
|
||||||
label: '征集名称',
|
label: '征集名称',
|
||||||
@@ -476,7 +441,7 @@ const handleDetail = (row) => {
|
|||||||
}
|
}
|
||||||
const init = async () => {
|
const init = async () => {
|
||||||
const res = await getSubCompOpt()
|
const res = await getSubCompOpt()
|
||||||
searchConfig.value.find(item=>item.prop == 'affiliatedCompanyId').props.data = res.data
|
searchConfig.value.find(item=>item.prop == 'undertaker').props.data = res.data
|
||||||
}
|
}
|
||||||
|
|
||||||
init()
|
init()
|
||||||
|
|||||||
@@ -157,7 +157,7 @@ const schema = computed(() => {
|
|||||||
)
|
)
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: '预估经费预算(元)',
|
label: '经费预算(元)',
|
||||||
prop: 'economicEstimate',
|
prop: 'economicEstimate',
|
||||||
colProps: {
|
colProps: {
|
||||||
span: 6
|
span: 6
|
||||||
@@ -171,21 +171,6 @@ const schema = computed(() => {
|
|||||||
}
|
}
|
||||||
</div>
|
</div>
|
||||||
)
|
)
|
||||||
}, {
|
|
||||||
label: '实际经费预算(元)',
|
|
||||||
prop: 'actualEconomicEstimate',
|
|
||||||
colProps: {
|
|
||||||
span: 6
|
|
||||||
},
|
|
||||||
component: () => (
|
|
||||||
<div>
|
|
||||||
{
|
|
||||||
baseFormData.value?.actualEconomicEstimate ?
|
|
||||||
<span>{toThousands(baseFormData.value?.actualEconomicEstimate)}</span>
|
|
||||||
: <span>{'--'}</span>
|
|
||||||
}
|
|
||||||
</div>
|
|
||||||
)
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: '产学研联合',
|
label: '产学研联合',
|
||||||
@@ -225,24 +210,9 @@ const schema = computed(() => {
|
|||||||
colProps: {
|
colProps: {
|
||||||
span: 6
|
span: 6
|
||||||
}
|
}
|
||||||
},{
|
|
||||||
label: '预估专项资金(元)',
|
|
||||||
prop: 'forecastSpecialFundAmount',
|
|
||||||
colProps: {
|
|
||||||
span: 6
|
|
||||||
},
|
|
||||||
component: () => (
|
|
||||||
<div>
|
|
||||||
{
|
|
||||||
baseFormData.value?.forecastSpecialFundAmount ?
|
|
||||||
<span>{toThousands(baseFormData.value?.forecastSpecialFundAmount)}</span>
|
|
||||||
: <span>{'--'}</span>
|
|
||||||
}
|
|
||||||
</div>
|
|
||||||
)
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: '实际专项资金(元)',
|
label: '申请总部专项资金(元)',
|
||||||
prop: 'specialFundAmount',
|
prop: 'specialFundAmount',
|
||||||
colProps: {
|
colProps: {
|
||||||
span: 6
|
span: 6
|
||||||
@@ -279,13 +249,6 @@ const schema = computed(() => {
|
|||||||
colProps: {
|
colProps: {
|
||||||
span: 6
|
span: 6
|
||||||
}
|
}
|
||||||
},
|
|
||||||
{
|
|
||||||
label: '主项目',
|
|
||||||
prop: 'masterProjectName',
|
|
||||||
colProps: {
|
|
||||||
span: 6
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
})
|
})
|
||||||
|
|||||||
@@ -11,7 +11,7 @@
|
|||||||
import fvSelect from '@/fvcomponents/fvSelect/index.vue'
|
import fvSelect from '@/fvcomponents/fvSelect/index.vue'
|
||||||
import {toThousands} from '@/utils/changePrice.js'
|
import {toThousands} from '@/utils/changePrice.js'
|
||||||
import {switchAttachmentState} from "@/api/project-manage/attachment";
|
import {switchAttachmentState} from "@/api/project-manage/attachment";
|
||||||
import {ElMessageBox, ElNotification} from "element-plus";
|
import {ElMessageBox} from "element-plus";
|
||||||
import { getSubCompOpt } from '@/api/user/user.js';
|
import { getSubCompOpt } from '@/api/user/user.js';
|
||||||
import {filterProjectName} from "@/api/project-manage";
|
import {filterProjectName} from "@/api/project-manage";
|
||||||
import {filterRequirementName} from "@/api/project-demand";
|
import {filterRequirementName} from "@/api/project-demand";
|
||||||
@@ -216,12 +216,6 @@ const tableConfig = reactive({
|
|||||||
return (tableIns.value.getQuery().pageNum - 1) * tableIns.value.getQuery().pageSize + index + 1
|
return (tableIns.value.getQuery().pageNum - 1) * tableIns.value.getQuery().pageSize + index + 1
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
{
|
|
||||||
prop: 'processNumber',
|
|
||||||
label: '项目编号',
|
|
||||||
align: 'center',
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
prop: 'requirementName',
|
prop: 'requirementName',
|
||||||
label: '征集名称',
|
label: '征集名称',
|
||||||
@@ -281,7 +275,7 @@ const tableConfig = reactive({
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
prop: 'economicEstimate',
|
prop: 'economicEstimate',
|
||||||
label: '预估经费预算(元)',
|
label: '经费预算(元)',
|
||||||
align: 'center',
|
align: 'center',
|
||||||
width: 150,
|
width: 150,
|
||||||
currentRender:({row})=>{
|
currentRender:({row})=>{
|
||||||
@@ -318,20 +312,12 @@ const tableConfig = reactive({
|
|||||||
width: 100,
|
width: 100,
|
||||||
showOverflowTooltip: false,
|
showOverflowTooltip: false,
|
||||||
currentRender: ({row, index}) => {
|
currentRender: ({row, index}) => {
|
||||||
let buttons = new Set(Array.from(row.buttons))
|
|
||||||
if (!buttons.has("openFileSwitch")&&row.state!=1) {
|
|
||||||
console.log('row',row)
|
|
||||||
return (<Tag dictType={'project_filing'} value={'0'}/>)
|
|
||||||
}else if (buttons.has("openFileSwitch")) {
|
|
||||||
return (<Tag dictType={'project_filing'} value={'4'}/>)
|
|
||||||
}else{
|
|
||||||
if (row.state !== null) {
|
if (row.state !== null) {
|
||||||
return (<Tag dictType={'project_filing'} value={row.state}/>)
|
return (<Tag dictType={'project_filing'} value={row.state}/>)
|
||||||
} else {
|
} else {
|
||||||
return '--'
|
return '--'
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
prop: 'oper',
|
prop: 'oper',
|
||||||
@@ -356,10 +342,10 @@ const tableConfig = reactive({
|
|||||||
btn.push({label: '编辑', prem: ['project:management:filing:conclusion'], func: () => handleEdit(row), type: 'primary'})
|
btn.push({label: '编辑', prem: ['project:management:filing:conclusion'], func: () => handleEdit(row), type: 'primary'})
|
||||||
}
|
}
|
||||||
if (buttons.has("openFileSwitch")) {
|
if (buttons.has("openFileSwitch")) {
|
||||||
btn.push({label: '开启上传', prem: ['filing:attachment:switch'], func: () => handleOpenUpload(row,true), type: 'primary'})
|
btn.push({label: '开启上传', prem: ['project:management:filing:conclusion'], func: () => handleOpenUpload(row,true), type: 'primary'})
|
||||||
}
|
}
|
||||||
if (buttons.has("closeFileSwitch")) {
|
if (buttons.has("closeFileSwitch")) {
|
||||||
btn.push({label: '关闭上传', prem: ['filing:attachment:switch'], func: () => handleOpenUpload(row,false), type: 'primary'})
|
btn.push({label: '关闭上传', prem: ['project:management:filing:conclusion'], func: () => handleOpenUpload(row,false), type: 'primary'})
|
||||||
}
|
}
|
||||||
return (
|
return (
|
||||||
<div style={{width: '100%'}}>
|
<div style={{width: '100%'}}>
|
||||||
@@ -434,7 +420,6 @@ const handleEdit = (row) => {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
const handleOpenUpload=(row,flag)=>{
|
const handleOpenUpload=(row,flag)=>{
|
||||||
console.log('tableIns',tableIns.value)
|
|
||||||
ElMessageBox.confirm(`是否确认${flag?'开启':'关闭'}上传文件?`, '提示', {
|
ElMessageBox.confirm(`是否确认${flag?'开启':'关闭'}上传文件?`, '提示', {
|
||||||
confirmButtonText: '确定',
|
confirmButtonText: '确定',
|
||||||
cancelButtonText: '取消',
|
cancelButtonText: '取消',
|
||||||
@@ -445,15 +430,7 @@ const handleOpenUpload=(row,flag)=>{
|
|||||||
projectId: row.projectId
|
projectId: row.projectId
|
||||||
}
|
}
|
||||||
switchAttachmentState(params).then(res=>{
|
switchAttachmentState(params).then(res=>{
|
||||||
if(res.code==1000){
|
|
||||||
tableIns.value.refresh()
|
tableIns.value.refresh()
|
||||||
}else{
|
|
||||||
ElNotification({
|
|
||||||
title: '提示',
|
|
||||||
message: res.msg,
|
|
||||||
type: 'error'
|
|
||||||
})
|
|
||||||
}
|
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -168,7 +168,7 @@ const schema = computed(() => {
|
|||||||
)
|
)
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: '预估经费预算(元)',
|
label: '经费预算(元)',
|
||||||
prop: 'economicEstimate',
|
prop: 'economicEstimate',
|
||||||
colProps: {
|
colProps: {
|
||||||
span: 6
|
span: 6
|
||||||
@@ -183,22 +183,6 @@ const schema = computed(() => {
|
|||||||
</div>
|
</div>
|
||||||
)
|
)
|
||||||
},
|
},
|
||||||
{
|
|
||||||
label: '实际经费预算(元)',
|
|
||||||
prop: 'actualEconomicEstimate',
|
|
||||||
colProps: {
|
|
||||||
span: 6
|
|
||||||
},
|
|
||||||
component: () => (
|
|
||||||
<div>
|
|
||||||
{
|
|
||||||
baseFormData.value?.actualEconomicEstimate ?
|
|
||||||
<span>{toThousands(baseFormData.value?.actualEconomicEstimate)}</span>
|
|
||||||
: <span>{'--'}</span>
|
|
||||||
}
|
|
||||||
</div>
|
|
||||||
)
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
label: '产学研联合',
|
label: '产学研联合',
|
||||||
prop: 'industryUniversityResearch',
|
prop: 'industryUniversityResearch',
|
||||||
@@ -239,23 +223,7 @@ const schema = computed(() => {
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: '预估专项资金(元)',
|
label: '申请总部专项资金(元)',
|
||||||
prop: 'forecastSpecialFundAmount',
|
|
||||||
colProps: {
|
|
||||||
span: 6
|
|
||||||
},
|
|
||||||
component: () => (
|
|
||||||
<div>
|
|
||||||
{
|
|
||||||
baseFormData.value?.forecastSpecialFundAmount ?
|
|
||||||
<span>{toThousands(baseFormData.value?.forecastSpecialFundAmount)}</span>
|
|
||||||
: <span>{'--'}</span>
|
|
||||||
}
|
|
||||||
</div>
|
|
||||||
)
|
|
||||||
},
|
|
||||||
{
|
|
||||||
label: '实际专项资金(元)',
|
|
||||||
prop: 'specialFundAmount',
|
prop: 'specialFundAmount',
|
||||||
colProps: {
|
colProps: {
|
||||||
span: 6
|
span: 6
|
||||||
@@ -292,13 +260,6 @@ const schema = computed(() => {
|
|||||||
colProps: {
|
colProps: {
|
||||||
span: 6
|
span: 6
|
||||||
}
|
}
|
||||||
},
|
|
||||||
{
|
|
||||||
label: '主项目',
|
|
||||||
prop: 'masterProjectName',
|
|
||||||
colProps: {
|
|
||||||
span: 6
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
})
|
})
|
||||||
|
|||||||
@@ -163,7 +163,7 @@ const schema = computed(() => {
|
|||||||
)
|
)
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: '预估经费预算(元)',
|
label: '经费预算(元)',
|
||||||
prop: 'economicEstimate',
|
prop: 'economicEstimate',
|
||||||
colProps: {
|
colProps: {
|
||||||
span: 6
|
span: 6
|
||||||
@@ -178,22 +178,6 @@ const schema = computed(() => {
|
|||||||
</div>
|
</div>
|
||||||
)
|
)
|
||||||
},
|
},
|
||||||
{
|
|
||||||
label: '实际经费预算(元)',
|
|
||||||
prop: 'actualEconomicEstimate',
|
|
||||||
colProps: {
|
|
||||||
span: 6
|
|
||||||
},
|
|
||||||
component: () => (
|
|
||||||
<div>
|
|
||||||
{
|
|
||||||
basicData.value?.actualEconomicEstimate ?
|
|
||||||
<span>{toThousands(basicData.value?.actualEconomicEstimate)}</span>
|
|
||||||
: <span>{'--'}</span>
|
|
||||||
}
|
|
||||||
</div>
|
|
||||||
)
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
label: '产学研联合',
|
label: '产学研联合',
|
||||||
prop: 'industryUniversityResearch',
|
prop: 'industryUniversityResearch',
|
||||||
@@ -234,23 +218,7 @@ const schema = computed(() => {
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: '预估专项资金(元)',
|
label: '申请总部专项资金(元)',
|
||||||
prop: 'forecastSpecialFundAmount',
|
|
||||||
colProps: {
|
|
||||||
span: 6
|
|
||||||
},
|
|
||||||
component: () => (
|
|
||||||
<div>
|
|
||||||
{
|
|
||||||
basicData.value?.forecastSpecialFundAmount ?
|
|
||||||
<span>{toThousands(basicData.value?.forecastSpecialFundAmount)}</span>
|
|
||||||
: <span>{'--'}</span>
|
|
||||||
}
|
|
||||||
</div>
|
|
||||||
)
|
|
||||||
},
|
|
||||||
{
|
|
||||||
label: '实际专项资金(元)',
|
|
||||||
prop: 'specialFundAmount',
|
prop: 'specialFundAmount',
|
||||||
colProps: {
|
colProps: {
|
||||||
span: 6
|
span: 6
|
||||||
@@ -287,13 +255,6 @@ const schema = computed(() => {
|
|||||||
colProps: {
|
colProps: {
|
||||||
span: 6
|
span: 6
|
||||||
}
|
}
|
||||||
},
|
|
||||||
{
|
|
||||||
label: '主项目',
|
|
||||||
prop: 'masterProjectName',
|
|
||||||
colProps: {
|
|
||||||
span: 6
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
})
|
})
|
||||||
|
|||||||
@@ -177,7 +177,7 @@ const schema = computed(() => {
|
|||||||
)
|
)
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: '预估经费预算(元)',
|
label: '经费预算(元)',
|
||||||
prop: 'economicEstimate',
|
prop: 'economicEstimate',
|
||||||
colProps: {
|
colProps: {
|
||||||
span: 6
|
span: 6
|
||||||
@@ -232,7 +232,7 @@ const schema = computed(() => {
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: '预估专项资金(元)',
|
label: '申请总部专项资金(元)',
|
||||||
prop: 'specialFundAmount',
|
prop: 'specialFundAmount',
|
||||||
colProps: {
|
colProps: {
|
||||||
span: 6
|
span: 6
|
||||||
|
|||||||
@@ -13,9 +13,9 @@
|
|||||||
:formData="detailData.formData"
|
:formData="detailData.formData"
|
||||||
:data="detailData"
|
:data="detailData"
|
||||||
:processViewer="commonProvessViewer"
|
:processViewer="commonProvessViewer"
|
||||||
:fileListShow="fileListShow" @ccSend="ccSendRefresh"
|
:fileListShow="fileListShow"
|
||||||
v-model:value="auditOpinion"/>
|
v-model:value="auditOpinion"/>
|
||||||
<ApprovalDetail type="approval" @ccSend="ccSendRefresh"
|
<ApprovalDetail type="approval"
|
||||||
v-if="showActive == '20'&&!editShow"
|
v-if="showActive == '20'&&!editShow"
|
||||||
:formData="detailData.formData"
|
:formData="detailData.formData"
|
||||||
:data="detailData"
|
:data="detailData"
|
||||||
@@ -27,7 +27,7 @@
|
|||||||
<div v-if="showActive == '30'&&!editShow">
|
<div v-if="showActive == '30'&&!editShow">
|
||||||
<project-attachment/>
|
<project-attachment/>
|
||||||
</div>
|
</div>
|
||||||
<ApprovalDetail type="execute" @ccSend="ccSendRefresh"
|
<ApprovalDetail type="execute"
|
||||||
v-if="showActive == '40'&&!editShow"
|
v-if="showActive == '40'&&!editShow"
|
||||||
:formData="detailData.formData"
|
:formData="detailData.formData"
|
||||||
:data="detailData"
|
:data="detailData"
|
||||||
@@ -36,7 +36,7 @@
|
|||||||
:preProcessShow="preProcessShow"
|
:preProcessShow="preProcessShow"
|
||||||
:basicData="basicData"
|
:basicData="basicData"
|
||||||
v-model:value="auditOpinion"/>
|
v-model:value="auditOpinion"/>
|
||||||
<ApprovalDetail type="archivist" @ccSend="ccSendRefresh"
|
<ApprovalDetail type="archivist"
|
||||||
v-if="showActive == '50'&&!editShow"
|
v-if="showActive == '50'&&!editShow"
|
||||||
:formData="detailData.formData"
|
:formData="detailData.formData"
|
||||||
:data="detailData"
|
:data="detailData"
|
||||||
@@ -50,7 +50,6 @@
|
|||||||
:mode="mode"
|
:mode="mode"
|
||||||
:step="showActive"
|
:step="showActive"
|
||||||
:data="detailData"
|
:data="detailData"
|
||||||
:basicData="basicData"
|
|
||||||
:preProcessShow="preProcessShow"
|
:preProcessShow="preProcessShow"
|
||||||
:formData="detailData.formData"/>
|
:formData="detailData.formData"/>
|
||||||
</template>
|
</template>
|
||||||
@@ -99,9 +98,7 @@ localStorage.removeItem('projectPersonUserList')
|
|||||||
localStorage.removeItem('optionalChargeLeadershipList')
|
localStorage.removeItem('optionalChargeLeadershipList')
|
||||||
localStorage.removeItem('originallySelectedList')
|
localStorage.removeItem('originallySelectedList')
|
||||||
|
|
||||||
const ccSendRefresh=()=>{
|
|
||||||
getAllInfo(route.query.step)
|
|
||||||
}
|
|
||||||
const getAllInfo = async (state) => {
|
const getAllInfo = async (state) => {
|
||||||
const loading = ElLoading.service({fullscreen: true})
|
const loading = ElLoading.service({fullscreen: true})
|
||||||
detailData.value = {
|
detailData.value = {
|
||||||
@@ -116,7 +113,6 @@ const getAllInfo = async (state) => {
|
|||||||
if (code === 1000) {
|
if (code === 1000) {
|
||||||
data.formData.preProcess = data.formData.preProcess ? JSON.parse(data.formData.preProcess) : undefined
|
data.formData.preProcess = data.formData.preProcess ? JSON.parse(data.formData.preProcess) : undefined
|
||||||
detailData.value = data
|
detailData.value = data
|
||||||
localStorage.setItem('detailProcess', JSON.stringify(data.formData.preProcess))
|
|
||||||
mode.value = data.formData.mode
|
mode.value = data.formData.mode
|
||||||
processStore.setDesign(data)
|
processStore.setDesign(data)
|
||||||
processStore.runningList.value = data.runningList;
|
processStore.runningList.value = data.runningList;
|
||||||
|
|||||||
@@ -219,12 +219,6 @@ const tableConfig = reactive({
|
|||||||
return (tableIns.value.getQuery().pageNum - 1) * tableIns.value.getQuery().pageSize + index + 1
|
return (tableIns.value.getQuery().pageNum - 1) * tableIns.value.getQuery().pageSize + index + 1
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
{
|
|
||||||
prop: 'processNumber',
|
|
||||||
label: '项目编号',
|
|
||||||
align: 'center',
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
prop: 'requirementName',
|
prop: 'requirementName',
|
||||||
label: '征集名称',
|
label: '征集名称',
|
||||||
@@ -298,7 +292,7 @@ const tableConfig = reactive({
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
prop: 'economicEstimate',
|
prop: 'economicEstimate',
|
||||||
label: '预估经费预算(元)',
|
label: '经费预算(元)',
|
||||||
align: 'center',
|
align: 'center',
|
||||||
width: 150,
|
width: 150,
|
||||||
currentRender:({row})=>{
|
currentRender:({row})=>{
|
||||||
|
|||||||
@@ -230,7 +230,7 @@ const schema = computed(() => {
|
|||||||
)
|
)
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: '预估经费预算(元)',
|
label: '经费预算(元)',
|
||||||
prop: 'economicEstimate',
|
prop: 'economicEstimate',
|
||||||
colProps: {
|
colProps: {
|
||||||
span: 6
|
span: 6
|
||||||
@@ -244,21 +244,6 @@ const schema = computed(() => {
|
|||||||
}
|
}
|
||||||
</div>
|
</div>
|
||||||
)
|
)
|
||||||
}, {
|
|
||||||
label: '实际经费预算(元)',
|
|
||||||
prop: 'actualEconomicEstimate',
|
|
||||||
colProps: {
|
|
||||||
span: 6
|
|
||||||
},
|
|
||||||
component: () => (
|
|
||||||
<div>
|
|
||||||
{
|
|
||||||
baseFormData.value?.actualEconomicEstimate ?
|
|
||||||
<span>{toThousands(baseFormData.value?.actualEconomicEstimate)}</span>
|
|
||||||
: <span>{'--'}</span>
|
|
||||||
}
|
|
||||||
</div>
|
|
||||||
)
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: '产学研联合',
|
label: '产学研联合',
|
||||||
@@ -298,24 +283,9 @@ const schema = computed(() => {
|
|||||||
colProps: {
|
colProps: {
|
||||||
span: 6
|
span: 6
|
||||||
}
|
}
|
||||||
}, {
|
|
||||||
label: '预估专项资金(元)',
|
|
||||||
prop: 'forecastSpecialFundAmount',
|
|
||||||
colProps: {
|
|
||||||
span: 6
|
|
||||||
},
|
|
||||||
component: () => (
|
|
||||||
<div>
|
|
||||||
{
|
|
||||||
baseFormData.value?.forecastSpecialFundAmount ?
|
|
||||||
<span>{toThousands(baseFormData.value?.forecastSpecialFundAmount)}</span>
|
|
||||||
: <span>{'--'}</span>
|
|
||||||
}
|
|
||||||
</div>
|
|
||||||
)
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: '实际专项资金(元)',
|
label: '申请总部专项资金(元)',
|
||||||
prop: 'specialFundAmount',
|
prop: 'specialFundAmount',
|
||||||
colProps: {
|
colProps: {
|
||||||
span: 6
|
span: 6
|
||||||
@@ -352,13 +322,6 @@ const schema = computed(() => {
|
|||||||
colProps: {
|
colProps: {
|
||||||
span: 6
|
span: 6
|
||||||
}
|
}
|
||||||
},
|
|
||||||
{
|
|
||||||
label: '主项目',
|
|
||||||
prop: 'masterProjectName',
|
|
||||||
colProps: {
|
|
||||||
span: 6
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
})
|
})
|
||||||
|
|||||||
@@ -170,7 +170,7 @@ const schema = computed(() => {
|
|||||||
)
|
)
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: '预估经费预算(元)',
|
label: '经费预算(元)',
|
||||||
prop: 'economicEstimate',
|
prop: 'economicEstimate',
|
||||||
colProps: {
|
colProps: {
|
||||||
span: 6
|
span: 6
|
||||||
@@ -184,21 +184,6 @@ const schema = computed(() => {
|
|||||||
}
|
}
|
||||||
</div>
|
</div>
|
||||||
)
|
)
|
||||||
},{
|
|
||||||
label: '实际经费预算(元)',
|
|
||||||
prop: 'actualEconomicEstimate',
|
|
||||||
colProps: {
|
|
||||||
span: 6
|
|
||||||
},
|
|
||||||
component: () => (
|
|
||||||
<div>
|
|
||||||
{
|
|
||||||
baseFormData.value?.actualEconomicEstimate ?
|
|
||||||
<span>{toThousands(baseFormData.value?.actualEconomicEstimate)}</span>
|
|
||||||
: <span>{'--'}</span>
|
|
||||||
}
|
|
||||||
</div>
|
|
||||||
)
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: '产学研联合',
|
label: '产学研联合',
|
||||||
@@ -238,24 +223,9 @@ const schema = computed(() => {
|
|||||||
colProps: {
|
colProps: {
|
||||||
span: 6
|
span: 6
|
||||||
}
|
}
|
||||||
}, {
|
|
||||||
label: '预估专项资金(元)',
|
|
||||||
prop: 'forecastSpecialFundAmount',
|
|
||||||
colProps: {
|
|
||||||
span: 6
|
|
||||||
},
|
|
||||||
component: () => (
|
|
||||||
<div>
|
|
||||||
{
|
|
||||||
baseFormData.value?.forecastSpecialFundAmount ?
|
|
||||||
<span>{toThousands(baseFormData.value?.forecastSpecialFundAmount)}</span>
|
|
||||||
: <span>{'--'}</span>
|
|
||||||
}
|
|
||||||
</div>
|
|
||||||
)
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: '实际专项资金(元)',
|
label: '申请总部专项资金(元)',
|
||||||
prop: 'specialFundAmount',
|
prop: 'specialFundAmount',
|
||||||
colProps: {
|
colProps: {
|
||||||
span: 6
|
span: 6
|
||||||
@@ -292,13 +262,6 @@ const schema = computed(() => {
|
|||||||
colProps: {
|
colProps: {
|
||||||
span: 6
|
span: 6
|
||||||
}
|
}
|
||||||
},
|
|
||||||
{
|
|
||||||
label: '主项目',
|
|
||||||
prop: 'masterProjectName',
|
|
||||||
colProps: {
|
|
||||||
span: 6
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
})
|
})
|
||||||
|
|||||||
@@ -145,7 +145,7 @@ const schema = computed(() => {
|
|||||||
)
|
)
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: '预估经费预算(元)',
|
label: '经费预算(元)',
|
||||||
prop: 'economicEstimate',
|
prop: 'economicEstimate',
|
||||||
colProps: {
|
colProps: {
|
||||||
span: 6
|
span: 6
|
||||||
@@ -159,21 +159,6 @@ const schema = computed(() => {
|
|||||||
}
|
}
|
||||||
</div>
|
</div>
|
||||||
)
|
)
|
||||||
}, {
|
|
||||||
label: '实际经费预算(元)',
|
|
||||||
prop: 'actualEconomicEstimate',
|
|
||||||
colProps: {
|
|
||||||
span: 6
|
|
||||||
},
|
|
||||||
component: () => (
|
|
||||||
<div>
|
|
||||||
{
|
|
||||||
baseFormData.value?.actualEconomicEstimate ?
|
|
||||||
<span>{toThousands(baseFormData.value?.actualEconomicEstimate)}</span>
|
|
||||||
: <span>{'--'}</span>
|
|
||||||
}
|
|
||||||
</div>
|
|
||||||
)
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: '产学研联合',
|
label: '产学研联合',
|
||||||
@@ -215,23 +200,7 @@ const schema = computed(() => {
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: '预估专项资金(元)',
|
label: '申请总部专项资金(元)',
|
||||||
prop: 'forecastSpecialFundAmount',
|
|
||||||
colProps: {
|
|
||||||
span: 6
|
|
||||||
},
|
|
||||||
component: () => (
|
|
||||||
<div>
|
|
||||||
{
|
|
||||||
baseFormData.value?.forecastSpecialFundAmount ?
|
|
||||||
<span>{toThousands(baseFormData.value?.forecastSpecialFundAmount)}</span>
|
|
||||||
: <span>{'--'}</span>
|
|
||||||
}
|
|
||||||
</div>
|
|
||||||
)
|
|
||||||
},
|
|
||||||
{
|
|
||||||
label: '实际专项资金(元)',
|
|
||||||
prop: 'specialFundAmount',
|
prop: 'specialFundAmount',
|
||||||
colProps: {
|
colProps: {
|
||||||
span: 6
|
span: 6
|
||||||
@@ -268,13 +237,6 @@ const schema = computed(() => {
|
|||||||
colProps: {
|
colProps: {
|
||||||
span: 6
|
span: 6
|
||||||
}
|
}
|
||||||
},
|
|
||||||
{
|
|
||||||
label: '主项目',
|
|
||||||
prop: 'masterProjectName',
|
|
||||||
colProps: {
|
|
||||||
span: 6
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
})
|
})
|
||||||
|
|||||||
@@ -4,37 +4,22 @@
|
|||||||
<fvForm :schema="schema" @getInstance="(e)=>baseForm = e" label-position="left" label-width="left"
|
<fvForm :schema="schema" @getInstance="(e)=>baseForm = e" label-position="left" label-width="left"
|
||||||
style="margin-left: 15px;margin-bottom: -18px"></fvForm>
|
style="margin-left: 15px;margin-bottom: -18px"></fvForm>
|
||||||
<baseTitle title="项目实施-上传附件" ></baseTitle>
|
<baseTitle title="项目实施-上传附件" ></baseTitle>
|
||||||
<el-tabs v-model="activeName" class="demo-tabs" @tab-click="handleTabClick" @tab-remove="tabRemove"
|
<el-form :model="formData" ref="tagForm" label-width="auto">
|
||||||
style="margin-left: 15px;margin-top: -10px">
|
<el-form-item label="标签名称" prop="tagName" style="margin-left: 15px;">
|
||||||
<el-tab-pane name="all" :closable="false" label="全部">
|
<el-input v-model="formData.tagName" placeholder="请输入标签名称" style="width: 300px;margin-right: 10px" v-if="showInput" clearable/>
|
||||||
</el-tab-pane>
|
<el-select v-model="formData.tagName" placeholder="请选择标签名称" clearable filterable style="width: 300px;margin-right: 10px" v-else>
|
||||||
<el-tab-pane v-for="item in tagsOption" :closable="item.isClose==1"
|
<el-option
|
||||||
:key="item.tagId"
|
v-for="item in tagsOption"
|
||||||
:label="item.fileTag"
|
:key="item.value"
|
||||||
:name="item.tagId">
|
:label="item.label"
|
||||||
<div class="tag-title">
|
:value="item.value"
|
||||||
<div></div>
|
/>
|
||||||
{{ item.fileTag }}
|
</el-select>
|
||||||
</div>
|
<el-button type="primary" link @click="changeInput">{{ showInput ? '选择' : '输入' }}</el-button>
|
||||||
</el-tab-pane>
|
</el-form-item>
|
||||||
|
</el-form>
|
||||||
<el-tab-pane name="plus" :closable="false">
|
<!-- <baseTitle title="其他文件"></baseTitle>-->
|
||||||
<template #label>
|
<file-upload @getFile="getFile" :disabled="!formData.tagName" :title="!formData.tagName?'请先选择/输入标签!':''" style="margin-left: 15px"/>
|
||||||
<div style="margin-top: 4px;">
|
|
||||||
<el-icon color="#BEA266">
|
|
||||||
<Plus/>
|
|
||||||
</el-icon>
|
|
||||||
</div>
|
|
||||||
</template>
|
|
||||||
</el-tab-pane>
|
|
||||||
</el-tabs>
|
|
||||||
<div style="margin-top:10px;margin-bottom: 8px;margin-left: 15px;display: flex">
|
|
||||||
<file-upload v-if="activeName!='plus'&&activeName!='all'" @getFile="getFile"/>
|
|
||||||
|
|
||||||
<el-button color="#DED0B2" @click="handleEditTag" v-if="activeName!='all'&&activeName!='plus'&&!isDefault"
|
|
||||||
style="margin-left: 10px;">编辑
|
|
||||||
</el-button>
|
|
||||||
</div>
|
|
||||||
<fvTable style="width: 100%;max-height: 318px;" v-if="showTable" height="318" :tableConfig="tableConfig"
|
<fvTable style="width: 100%;max-height: 318px;" v-if="showTable" height="318" :tableConfig="tableConfig"
|
||||||
:data="fileList" :isSettingCol="false" :pagination="false">
|
:data="fileList" :isSettingCol="false" :pagination="false">
|
||||||
<template #empty>
|
<template #empty>
|
||||||
@@ -46,25 +31,15 @@
|
|||||||
</div>
|
</div>
|
||||||
<file-preview ref="filePreviewRef" v-if="filePreviewShow" :fileName="filePreviewParam.fileName" :fileUrl="filePreviewParam.fileUrl"
|
<file-preview ref="filePreviewRef" v-if="filePreviewShow" :fileName="filePreviewParam.fileName" :fileUrl="filePreviewParam.fileUrl"
|
||||||
:fileType="filePreviewParam.fileType"/>
|
:fileType="filePreviewParam.fileType"/>
|
||||||
<el-dialog v-model="tagNameShow" center width="450" top="40vh">
|
|
||||||
<div style="display: flex;align-items: center">标签:
|
|
||||||
<el-input v-model="fileParam.tagName" placeholder="请输入标签名称" style="width: 335px;" clearable/>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="oper" style="display: flex;justify-content: flex-end;margin-top: 10px">
|
|
||||||
<el-button color="#DED0B2" @click="changeTag()">确定</el-button>
|
|
||||||
<el-button @click="tagNameShow=false">取消</el-button>
|
|
||||||
</div>
|
|
||||||
</el-dialog>
|
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup lang="jsx">
|
<script setup lang="jsx">
|
||||||
import {addTag, delTag, getTagList, getTags, updateTag} from "@/api/project-manage";
|
import {getTags} from "@/api/project-manage";
|
||||||
import {ElMessageBox, ElNotification} from "element-plus";
|
import {ElNotification} from "element-plus";
|
||||||
import {useTagsView} from '@/stores/tagsview.js'
|
import {useTagsView} from '@/stores/tagsview.js'
|
||||||
import {searchImplementationFileList, uploadFileList} from "@/api/project-manage/attachment";
|
import {uploadFileList} from "@/api/project-manage/attachment";
|
||||||
import {computed, nextTick, ref} from "vue";
|
import {computed, ref} from "vue";
|
||||||
import {getBaseInfoApi} from "@/components/steps/api";
|
import {getBaseInfoApi} from "@/components/steps/api";
|
||||||
import {deleteFile, downloadFile} from "@/api/project-demand";
|
import {deleteFile, downloadFile} from "@/api/project-demand";
|
||||||
|
|
||||||
@@ -77,11 +52,7 @@ const tagsViewStore = useTagsView()
|
|||||||
const route = useRoute()
|
const route = useRoute()
|
||||||
const router = useRouter()
|
const router = useRouter()
|
||||||
const fileList = ref([])
|
const fileList = ref([])
|
||||||
const allFileList = ref([])
|
|
||||||
const activeName = ref('all')
|
|
||||||
const tagNameShow = ref(false)
|
|
||||||
const showInput = ref(false)
|
const showInput = ref(false)
|
||||||
const isDefault = ref(false)
|
|
||||||
const baseFormData = ref([])
|
const baseFormData = ref([])
|
||||||
const schema = computed(() => {
|
const schema = computed(() => {
|
||||||
return [
|
return [
|
||||||
@@ -211,7 +182,7 @@ const schema = computed(() => {
|
|||||||
)
|
)
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: '预估经费预算(元)',
|
label: '经费预算(元)',
|
||||||
prop: 'economicEstimate',
|
prop: 'economicEstimate',
|
||||||
colProps: {
|
colProps: {
|
||||||
span: 6
|
span: 6
|
||||||
@@ -226,22 +197,6 @@ const schema = computed(() => {
|
|||||||
</div>
|
</div>
|
||||||
)
|
)
|
||||||
},
|
},
|
||||||
{
|
|
||||||
label: '实际经费预算(元)',
|
|
||||||
prop: 'actualEconomicEstimate',
|
|
||||||
colProps: {
|
|
||||||
span: 6
|
|
||||||
},
|
|
||||||
component: () => (
|
|
||||||
<div>
|
|
||||||
{
|
|
||||||
baseFormData.value?.actualEconomicEstimate ?
|
|
||||||
<span>{toThousands(baseFormData.value?.actualEconomicEstimate)}</span>
|
|
||||||
: <span>{'--'}</span>
|
|
||||||
}
|
|
||||||
</div>
|
|
||||||
)
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
label: '产学研联合',
|
label: '产学研联合',
|
||||||
prop: 'industryUniversityResearch',
|
prop: 'industryUniversityResearch',
|
||||||
@@ -282,23 +237,7 @@ const schema = computed(() => {
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: '预估专项资金(元)',
|
label: '申请总部专项资金(元)',
|
||||||
prop: 'forecastSpecialFundAmount',
|
|
||||||
colProps: {
|
|
||||||
span: 6
|
|
||||||
},
|
|
||||||
component: () => (
|
|
||||||
<div>
|
|
||||||
{
|
|
||||||
baseFormData.value?.forecastSpecialFundAmount ?
|
|
||||||
<span>{toThousands(baseFormData.value?.forecastSpecialFundAmount)}</span>
|
|
||||||
: <span>{'--'}</span>
|
|
||||||
}
|
|
||||||
</div>
|
|
||||||
)
|
|
||||||
},
|
|
||||||
{
|
|
||||||
label: '实际专项资金(元)',
|
|
||||||
prop: 'specialFundAmount',
|
prop: 'specialFundAmount',
|
||||||
colProps: {
|
colProps: {
|
||||||
span: 6
|
span: 6
|
||||||
@@ -307,7 +246,7 @@ const schema = computed(() => {
|
|||||||
<div>
|
<div>
|
||||||
{
|
{
|
||||||
baseFormData.value?.specialFundAmount ?
|
baseFormData.value?.specialFundAmount ?
|
||||||
<span>{toThousands(baseFormData.value?.specialFundAmount)}</span>
|
<span>{ toThousands(baseFormData.value?.specialFundAmount )}</span>
|
||||||
: <span>{'--'}</span>
|
: <span>{'--'}</span>
|
||||||
}
|
}
|
||||||
</div>
|
</div>
|
||||||
@@ -335,19 +274,12 @@ const schema = computed(() => {
|
|||||||
colProps: {
|
colProps: {
|
||||||
span: 6
|
span: 6
|
||||||
}
|
}
|
||||||
},
|
|
||||||
{
|
|
||||||
label: '主项目',
|
|
||||||
prop: 'masterProjectName',
|
|
||||||
colProps: {
|
|
||||||
span: 6
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
})
|
})
|
||||||
const baseForm = ref()
|
const baseForm = ref()
|
||||||
const tagsOption = ref([])
|
const tagsOption = ref([])
|
||||||
const fileParam = ref({
|
const formData = ref({
|
||||||
tagName: ''
|
tagName: ''
|
||||||
})
|
})
|
||||||
const tableConfig = reactive({
|
const tableConfig = reactive({
|
||||||
@@ -386,11 +318,8 @@ const tableConfig = reactive({
|
|||||||
return (
|
return (
|
||||||
<div>
|
<div>
|
||||||
<el-button type="primary" link onClick={() => handleDownload(row)}>下载</el-button>
|
<el-button type="primary" link onClick={() => handleDownload(row)}>下载</el-button>
|
||||||
{
|
<popover-delete name={row.originalFileName} type={'文件'} btnType={'danger'}
|
||||||
row.oldType ? null : <popover-delete name={row.originalFileName} type={'文件'} btnType={'danger'}
|
|
||||||
onDelete={() => handleDelete(row)}/>
|
onDelete={() => handleDelete(row)}/>
|
||||||
}
|
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
@@ -409,147 +338,11 @@ const filePreviewParam = ref({
|
|||||||
fileType: 'pdf'
|
fileType: 'pdf'
|
||||||
})
|
})
|
||||||
const filePreviewShow = ref(false)
|
const filePreviewShow = ref(false)
|
||||||
const isEdit = ref(false)
|
|
||||||
const changeTag = async () => {
|
|
||||||
let res = null
|
|
||||||
if (isEdit.value) {
|
|
||||||
res = await updateTag({
|
|
||||||
tagId: activeName.value,
|
|
||||||
fileTag: fileParam.value.tagName,
|
|
||||||
projectId: route.query.projectId,
|
|
||||||
})
|
|
||||||
} else {
|
|
||||||
res = await addTag({
|
|
||||||
projectId: route.query.projectId,
|
|
||||||
fileTag: fileParam.value.tagName
|
|
||||||
})
|
|
||||||
fileParam.value.tagName = ''
|
|
||||||
activeName.value = 'all'
|
|
||||||
}
|
|
||||||
getTagsOption()
|
|
||||||
ElNotification({
|
|
||||||
title: '提示',
|
|
||||||
message: res.msg,
|
|
||||||
type: res.code === 1000 ? 'success' : 'error'
|
|
||||||
})
|
|
||||||
tagNameShow.value = false;
|
|
||||||
}
|
|
||||||
const getOldFileList = (tag,flag) => {
|
|
||||||
let params = {}
|
|
||||||
if (tag == 'all') {
|
|
||||||
params = {
|
|
||||||
targetId: route.query.projectId,
|
|
||||||
targetState: "30",
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
params = {
|
|
||||||
targetId: route.query.projectId,
|
|
||||||
targetState: "30",
|
|
||||||
tag: getTagName(activeName.value)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
showTable.value = false
|
|
||||||
|
|
||||||
searchImplementationFileList(params).then(res => {
|
|
||||||
if (res.code === 1000) {
|
|
||||||
if(tag == 'all'){
|
|
||||||
res.data.fileList?.forEach(item=>{
|
|
||||||
item.oldType=true
|
|
||||||
fileList.value.push(item)
|
|
||||||
})
|
|
||||||
}else{
|
|
||||||
res.data.fileList?.forEach(item=>{
|
|
||||||
item.oldType=true
|
|
||||||
if(getTagName(activeName.value)==item.tag){
|
|
||||||
fileList.value.push(item)
|
|
||||||
}
|
|
||||||
})
|
|
||||||
console.log("🚀 ~ file:'fileList.value ",fileList.value)
|
|
||||||
}
|
|
||||||
if(flag){
|
|
||||||
getTagsOption(flag)
|
|
||||||
}
|
|
||||||
nextTick(() => {
|
|
||||||
showTable.value = true
|
|
||||||
})
|
|
||||||
changeImplementFile()
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
|
||||||
const handleEditTag = () => {
|
|
||||||
fileParam.value.tagName = getTagName(activeName.value)
|
|
||||||
if(fileList.value&&fileList.value.length>0){
|
|
||||||
ElNotification({
|
|
||||||
title: '提示',
|
|
||||||
message: '该标签下存在文件,不能编辑标签。如需编辑标签,请先删除该标签下的所有文件。',
|
|
||||||
type: 'error'
|
|
||||||
})
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
tagNameShow.value = true
|
|
||||||
isEdit.value = true
|
|
||||||
}
|
|
||||||
const tabRemove = async (val) => {
|
|
||||||
if(fileList.value&&fileList.value.length>0){
|
|
||||||
ElNotification({
|
|
||||||
title: '提示',
|
|
||||||
message: '该标签下存在文件,不能删除标签。如需删除标签,请先删除该标签下的所有文件。',
|
|
||||||
type: 'error'
|
|
||||||
})
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
ElMessageBox.confirm(`确认删除名称为${getTagName(val)}的标签吗?`, '系统提示', {
|
|
||||||
confirmButtonText: '确定',
|
|
||||||
cancelButtonText: '取消',
|
|
||||||
type: 'warning'
|
|
||||||
}).then(async () => {
|
|
||||||
let res = await delTag(val)
|
|
||||||
ElNotification({
|
|
||||||
title: '提示',
|
|
||||||
message: res.msg,
|
|
||||||
type: res.code === 1000 ? 'success' : 'error'
|
|
||||||
})
|
|
||||||
if (res.code === 1000) {
|
|
||||||
getTagsOption()
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
const handleTabClick = (item) => {
|
|
||||||
activeName.value = item.props.name
|
|
||||||
const defaultArray=tagsOption.value.filter(item1=>item1.tagId==item.props.name)
|
|
||||||
if(defaultArray&&defaultArray.length>0){
|
|
||||||
isDefault.value=defaultArray[0].isDefault==1
|
|
||||||
}else{
|
|
||||||
isDefault.value=false
|
|
||||||
}
|
|
||||||
tagNameShow.value = item.props.name == 'plus';
|
|
||||||
if (item.props.name == 'plus') {
|
|
||||||
isEdit.value = false
|
|
||||||
fileParam.value.tagName = ''
|
|
||||||
}
|
|
||||||
const fileArray=JSON.parse(localStorage.getItem('implementFile'))
|
|
||||||
if (item.props.name != 'plus') {
|
|
||||||
if (item.props.name == 'all') {
|
|
||||||
fileList.value=fileArray
|
|
||||||
getOldFileList('all')
|
|
||||||
} else {
|
|
||||||
fileList.value=fileArray.filter(item1 => item1.tag == getTagName(item.props.name))
|
|
||||||
getOldFileList()
|
|
||||||
showTable.value = false
|
|
||||||
nextTick(() => {
|
|
||||||
showTable.value = true
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if(localStorage.getItem('implementFile')){
|
if(localStorage.getItem('implementFile')){
|
||||||
fileList.value=JSON.parse(localStorage.getItem('implementFile'))
|
fileList.value=JSON.parse(localStorage.getItem('implementFile'))
|
||||||
allFileList.value=JSON.parse(localStorage.getItem('implementFile'))
|
|
||||||
}
|
}
|
||||||
const changeImplementFile=()=>{
|
const changeImplementFile=()=>{
|
||||||
localStorage.setItem('implementFile', JSON.stringify(allFileList.value))
|
localStorage.setItem('implementFile', JSON.stringify(fileList.value))
|
||||||
}
|
}
|
||||||
|
|
||||||
const clickToPreview=(row)=>{
|
const clickToPreview=(row)=>{
|
||||||
@@ -565,7 +358,7 @@ const clickToPreview=(row)=>{
|
|||||||
}
|
}
|
||||||
onActivated(() => {
|
onActivated(() => {
|
||||||
console.log('onActivated')
|
console.log('onActivated')
|
||||||
fileParam.value.tagName = '';
|
formData.value.tagName = '';
|
||||||
showTable.value = false
|
showTable.value = false
|
||||||
nextTick(() => {
|
nextTick(() => {
|
||||||
showTable.value = true
|
showTable.value = true
|
||||||
@@ -578,7 +371,7 @@ const filterDict = (data, value) => {
|
|||||||
let label = ''
|
let label = ''
|
||||||
let result = []
|
let result = []
|
||||||
if (value instanceof Array) {
|
if (value instanceof Array) {
|
||||||
value?.forEach(item1 => {
|
value.forEach(item1 => {
|
||||||
data.find(item => {
|
data.find(item => {
|
||||||
if (item.value == item1) {
|
if (item.value == item1) {
|
||||||
result.push(item.label)
|
result.push(item.label)
|
||||||
@@ -632,54 +425,14 @@ const getBaseInfo = async () => {
|
|||||||
getBaseInfo()
|
getBaseInfo()
|
||||||
const changeInput = () => {
|
const changeInput = () => {
|
||||||
showInput.value = !showInput.value;
|
showInput.value = !showInput.value;
|
||||||
fileParam.value.tagName = '';
|
formData.value.tagName = '';
|
||||||
}
|
|
||||||
const getTagName = (name) => {
|
|
||||||
const tagArray = tagsOption.value.filter((item1) => item1.tagId == name)
|
|
||||||
let tagName = ''
|
|
||||||
if (tagArray && tagArray.length > 0) {
|
|
||||||
tagName = tagArray[0].fileTag
|
|
||||||
}
|
|
||||||
return tagName
|
|
||||||
}
|
}
|
||||||
const getTagsOption = () => {
|
const getTagsOption = () => {
|
||||||
if (!route.query.projectId) return
|
if (!route.query.projectId) return
|
||||||
getTagList(route.query.projectId).then(res => {
|
getTags(route.query.projectId).then(res => {
|
||||||
if (res.code === 1000) {
|
if (res.code === 1000) {
|
||||||
tagsOption.value = res.data.rows
|
showInput.value = res.data.length === 0;
|
||||||
console.log("🚀 ~ file: res.data.rows ", res.data.rows)
|
tagsOption.value = res.data
|
||||||
|
|
||||||
tagsOption.value?.forEach((tag, index) => {
|
|
||||||
tagsOption.value[index].isClose =1
|
|
||||||
})
|
|
||||||
let defaultArray=[
|
|
||||||
{
|
|
||||||
tagId: 'd1',
|
|
||||||
fileTag: '合同(专项任务书)',
|
|
||||||
isDefault: 1,
|
|
||||||
isClose: 2
|
|
||||||
},
|
|
||||||
{
|
|
||||||
tagId: 'd2',
|
|
||||||
fileTag: '周报',
|
|
||||||
isDefault: 1,
|
|
||||||
isClose: 2
|
|
||||||
},
|
|
||||||
{
|
|
||||||
tagId: 'd3',
|
|
||||||
fileTag: '阶段性验收',
|
|
||||||
isDefault: 1,
|
|
||||||
isClose: 2
|
|
||||||
},
|
|
||||||
{
|
|
||||||
tagId: 'd4',
|
|
||||||
fileTag: '科研成果',
|
|
||||||
isDefault: 1,
|
|
||||||
isClose: 2
|
|
||||||
}
|
|
||||||
]
|
|
||||||
tagsOption.value=[...defaultArray,...tagsOption.value]
|
|
||||||
console.log("🚀 ~ file:tagsOption.value ", tagsOption.value)
|
|
||||||
}else{
|
}else{
|
||||||
ElNotification({
|
ElNotification({
|
||||||
title: '提示',
|
title: '提示',
|
||||||
@@ -691,9 +444,9 @@ const getTagsOption = () => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
const compositeParam = (item) => {
|
const compositeParam = (item) => {
|
||||||
tagsOption.value?.forEach(item => {
|
tagsOption.value.forEach(item => {
|
||||||
if (item.value == fileParam.value.tagName) {
|
if (item.value == formData.value.tagName) {
|
||||||
fileParam.value.tagName = item.label
|
formData.value.tagName = item.label
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
return {
|
return {
|
||||||
@@ -703,7 +456,7 @@ const compositeParam = (item) => {
|
|||||||
fileType: item.fileType,
|
fileType: item.fileType,
|
||||||
url: item.url,
|
url: item.url,
|
||||||
newFile: true,
|
newFile: true,
|
||||||
tag: getTagName(activeName.value) || '项目实施',
|
tag: formData.value.tagName,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
const getFile = (val) => {
|
const getFile = (val) => {
|
||||||
@@ -711,17 +464,24 @@ const getFile = (val) => {
|
|||||||
showTable.value = false
|
showTable.value = false
|
||||||
let fileObj = compositeParam(val)
|
let fileObj = compositeParam(val)
|
||||||
fileList.value.push(fileObj)
|
fileList.value.push(fileObj)
|
||||||
allFileList.value.push(fileObj)
|
|
||||||
nextTick(() => {
|
nextTick(() => {
|
||||||
showTable.value = true
|
showTable.value = true
|
||||||
})
|
})
|
||||||
|
|
||||||
changeImplementFile()
|
changeImplementFile()
|
||||||
}
|
}
|
||||||
const handleSubmit = async (instance) => {
|
const handleSubmit = async (instance) => {
|
||||||
const files=JSON.parse(localStorage.getItem('implementFile'))
|
if (!instance) return
|
||||||
|
instance.validate(async (valid) => {
|
||||||
|
if (!valid) {
|
||||||
|
ElNotification({
|
||||||
|
title: '提示',
|
||||||
|
message: '请完善数据,再提交!',
|
||||||
|
type: 'error'
|
||||||
|
})
|
||||||
|
return;
|
||||||
|
}
|
||||||
let params = {
|
let params = {
|
||||||
fileList: files,
|
fileList: fileList.value,
|
||||||
projectId: route.query.projectId,
|
projectId: route.query.projectId,
|
||||||
targetState: "30"
|
targetState: "30"
|
||||||
}
|
}
|
||||||
@@ -765,9 +525,9 @@ const handleSubmit = async (instance) => {
|
|||||||
}
|
}
|
||||||
localStorage.removeItem('implementFile')
|
localStorage.removeItem('implementFile')
|
||||||
}
|
}
|
||||||
|
})
|
||||||
}
|
}
|
||||||
getTagsOption()
|
getTagsOption()
|
||||||
getOldFileList('all')
|
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style scoped lang="scss">
|
<style scoped lang="scss">
|
||||||
@@ -790,12 +550,4 @@ getOldFileList('all')
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
:deep(.el-tabs__item.is-active) {
|
|
||||||
color: #BEA266;
|
|
||||||
}
|
|
||||||
|
|
||||||
:deep(.el-tabs__active-bar) {
|
|
||||||
background-color: #BEA266;
|
|
||||||
}
|
|
||||||
|
|
||||||
</style>
|
</style>
|
||||||
|
|||||||
@@ -253,7 +253,7 @@ const schema = computed(() => {
|
|||||||
)
|
)
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: '预估经费预算(元)',
|
label: '经费预算(元)',
|
||||||
prop: 'economicEstimate',
|
prop: 'economicEstimate',
|
||||||
colProps: {
|
colProps: {
|
||||||
span: 6
|
span: 6
|
||||||
@@ -268,22 +268,6 @@ const schema = computed(() => {
|
|||||||
</div>
|
</div>
|
||||||
)
|
)
|
||||||
},
|
},
|
||||||
{
|
|
||||||
label: '实际经费预算(元)',
|
|
||||||
prop: 'actualEconomicEstimate',
|
|
||||||
colProps: {
|
|
||||||
span: 6
|
|
||||||
},
|
|
||||||
component: () => (
|
|
||||||
<div>
|
|
||||||
{
|
|
||||||
baseFormData.value?.actualEconomicEstimate ?
|
|
||||||
<span>{toThousands(baseFormData.value?.actualEconomicEstimate)}</span>
|
|
||||||
: <span>{'--'}</span>
|
|
||||||
}
|
|
||||||
</div>
|
|
||||||
)
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
label: '产学研联合',
|
label: '产学研联合',
|
||||||
prop: 'industryUniversityResearch',
|
prop: 'industryUniversityResearch',
|
||||||
@@ -331,23 +315,7 @@ const schema = computed(() => {
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: '预估专项资金(元)',
|
label: '申请总部专项资金(元)',
|
||||||
prop: 'forecastSpecialFundAmount',
|
|
||||||
colProps: {
|
|
||||||
span: 6
|
|
||||||
},
|
|
||||||
component: () => (
|
|
||||||
<div>
|
|
||||||
{
|
|
||||||
baseFormData.value?.forecastSpecialFundAmount ?
|
|
||||||
<span>{toThousands(baseFormData.value?.forecastSpecialFundAmount)}</span>
|
|
||||||
: <span>{'--'}</span>
|
|
||||||
}
|
|
||||||
</div>
|
|
||||||
)
|
|
||||||
},
|
|
||||||
{
|
|
||||||
label: '实际专项资金(元)',
|
|
||||||
prop: 'specialFundAmount',
|
prop: 'specialFundAmount',
|
||||||
colProps: {
|
colProps: {
|
||||||
span: 6
|
span: 6
|
||||||
@@ -384,13 +352,6 @@ const schema = computed(() => {
|
|||||||
colProps: {
|
colProps: {
|
||||||
span: 6
|
span: 6
|
||||||
}
|
}
|
||||||
},
|
|
||||||
{
|
|
||||||
label: '主项目',
|
|
||||||
prop: 'masterProjectName',
|
|
||||||
colProps: {
|
|
||||||
span: 6
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
})
|
})
|
||||||
|
|||||||
@@ -214,11 +214,6 @@ const tableConfig = reactive({
|
|||||||
return (tableIns.value.getQuery().pageNum - 1) * tableIns.value.getQuery().pageSize + index + 1
|
return (tableIns.value.getQuery().pageNum - 1) * tableIns.value.getQuery().pageSize + index + 1
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
|
||||||
prop: 'processNumber',
|
|
||||||
label: '项目编号',
|
|
||||||
align: 'center',
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
prop: 'requirementName',
|
prop: 'requirementName',
|
||||||
label: '征集名称',
|
label: '征集名称',
|
||||||
@@ -279,7 +274,7 @@ const tableConfig = reactive({
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
prop: 'economicEstimate',
|
prop: 'economicEstimate',
|
||||||
label: '预估经费预算(元)',
|
label: '经费预算(元)',
|
||||||
align: 'center',
|
align: 'center',
|
||||||
width: 150,
|
width: 150,
|
||||||
currentRender:({row})=>{
|
currentRender:({row})=>{
|
||||||
|
|||||||
@@ -1,11 +1,11 @@
|
|||||||
<template>
|
<template>
|
||||||
<div v-loading="loading">
|
<div v-loading="loading">
|
||||||
<baseTitle v-if="type!='phase'" :title="getTagName(type)+'信息'"></baseTitle>
|
<baseTitle v-if="type!='phase'" :title="getTagName(type)+'信息'" ></baseTitle>
|
||||||
<fvForm :schema="schema" @getInstance="(e)=>form = e" style="margin-left: 15px"></fvForm>
|
<fvForm :schema="schema" @getInstance="(e)=>form = e" style="margin-left: 15px"></fvForm>
|
||||||
<el-form :model="formData" label-width="auto">
|
<el-form :model="formData" label-width="auto">
|
||||||
<file-component
|
<file-component
|
||||||
:title="getTagName(type)+'附件'"
|
:title="getTagName(type)+'附件'"
|
||||||
:fileNameTableWidth="150"
|
:fileNameTableWidth="300"
|
||||||
:tag="getTagName(type)"
|
:tag="getTagName(type)"
|
||||||
v-model:value="formData.fileList"
|
v-model:value="formData.fileList"
|
||||||
:processViewer="processViewer"
|
:processViewer="processViewer"
|
||||||
@@ -36,8 +36,7 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="process">
|
<div class="process">
|
||||||
<operation-render v-if="processViewer && data.operationList && data.operationList.length > 0&&!changeDiagram"
|
<operation-render v-if="processViewer && data.operationList && data.operationList.length > 0&&!changeDiagram" :isColumn="true"
|
||||||
:isColumn="true"
|
|
||||||
:operation-list="data.operationList"
|
:operation-list="data.operationList"
|
||||||
:state="data.state"/>
|
:state="data.state"/>
|
||||||
<process-diagram-viewer v-if="processViewer&&changeDiagram" :id-name="idName?idName:type"/>
|
<process-diagram-viewer v-if="processViewer&&changeDiagram" :id-name="idName?idName:type"/>
|
||||||
@@ -116,8 +115,7 @@ const editSingleTableConfig = reactive({
|
|||||||
label: '文件名',
|
label: '文件名',
|
||||||
align: 'center',
|
align: 'center',
|
||||||
width: 300,
|
width: 300,
|
||||||
currentRender: ({row, index}) => (
|
currentRender: ({row, index}) => (<div style="color: #2a99ff;cursor: pointer;" onClick={()=>clickToPreview(row)}>{row.originalFileName}</div>)
|
||||||
<div style="color: #2a99ff;cursor: pointer;" onClick={() => clickToPreview(row)}>{row.originalFileName}</div>)
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
prop: 'tag',
|
prop: 'tag',
|
||||||
@@ -194,7 +192,7 @@ const schema = computed(() => {
|
|||||||
colProps: {
|
colProps: {
|
||||||
span: 24
|
span: 24
|
||||||
},
|
},
|
||||||
labelWidth: 'left',
|
labelWidth:'left',
|
||||||
component: () => (
|
component: () => (
|
||||||
<div>
|
<div>
|
||||||
{
|
{
|
||||||
@@ -211,13 +209,12 @@ const schema = computed(() => {
|
|||||||
colProps: {
|
colProps: {
|
||||||
span: 24
|
span: 24
|
||||||
},
|
},
|
||||||
labelWidth: 'left',
|
labelWidth:'left',
|
||||||
component: () => (
|
component: () => (
|
||||||
<div>
|
<div>
|
||||||
{
|
{
|
||||||
props.formData.projectPersonList ? props.formData.projectPersonList.map((item, index) => {
|
props.formData.projectPersonList ? props.formData.projectPersonList.map((item, index) => {
|
||||||
return <span>{item.name}
|
return <span>{item.name} <span>{index != props.formData.projectPersonList?.length - 1 ? ',' : ''}</span></span>
|
||||||
<span>{index != props.formData.projectPersonList?.length - 1 ? ',' : ''}</span></span>
|
|
||||||
}) : <span>{'--'}</span>
|
}) : <span>{'--'}</span>
|
||||||
}
|
}
|
||||||
</div>
|
</div>
|
||||||
@@ -276,188 +273,7 @@ const schema = computed(() => {
|
|||||||
// }
|
// }
|
||||||
// })
|
// })
|
||||||
} else if (props.type == 'execute') {
|
} else if (props.type == 'execute') {
|
||||||
arr = [
|
arr = [{
|
||||||
{
|
|
||||||
label: '实际专利(项)',
|
|
||||||
prop: 'actualNewPatent',
|
|
||||||
colProps: {
|
|
||||||
span: 24
|
|
||||||
},
|
|
||||||
labelWidth: 'left',
|
|
||||||
component: () => (
|
|
||||||
<div>
|
|
||||||
{
|
|
||||||
props.formData.actualNewPatent ? props.formData.actualNewPatent : <span>{'--'}</span>
|
|
||||||
}
|
|
||||||
</div>
|
|
||||||
)
|
|
||||||
},
|
|
||||||
{
|
|
||||||
label: '实际软件著作权(项)',
|
|
||||||
prop: 'actualSoftwareCopyright',
|
|
||||||
colProps: {
|
|
||||||
span: 24
|
|
||||||
},
|
|
||||||
labelWidth: 'left',
|
|
||||||
component: () => (
|
|
||||||
<div>
|
|
||||||
{
|
|
||||||
props.formData.actualSoftwareCopyright ? props.formData.actualSoftwareCopyright : <span>{'--'}</span>
|
|
||||||
}
|
|
||||||
</div>
|
|
||||||
)
|
|
||||||
},
|
|
||||||
{
|
|
||||||
label: '实际技术标准(项)',
|
|
||||||
prop: 'actualTechnicalNorms',
|
|
||||||
colProps: {
|
|
||||||
span: 24
|
|
||||||
},
|
|
||||||
labelWidth: 'left',
|
|
||||||
component: () => (
|
|
||||||
<div>
|
|
||||||
{
|
|
||||||
props.formData.actualTechnicalNorms ? props.formData.actualTechnicalNorms : <span>{'--'}</span>
|
|
||||||
}
|
|
||||||
</div>
|
|
||||||
)
|
|
||||||
},
|
|
||||||
{
|
|
||||||
label: '实际新产品(项)',
|
|
||||||
prop: 'actualNewProduct',
|
|
||||||
colProps: {
|
|
||||||
span: 24
|
|
||||||
},
|
|
||||||
labelWidth: 'left',
|
|
||||||
component: () => (
|
|
||||||
<div>
|
|
||||||
{
|
|
||||||
props.formData.actualNewProduct ? props.formData.actualNewProduct : <span>{'--'}</span>
|
|
||||||
}
|
|
||||||
</div>
|
|
||||||
)
|
|
||||||
},
|
|
||||||
{
|
|
||||||
label: '实际新工艺(项)',
|
|
||||||
prop: 'actualNewProcess',
|
|
||||||
colProps: {
|
|
||||||
span: 24
|
|
||||||
},
|
|
||||||
labelWidth: 'left',
|
|
||||||
component: () => (
|
|
||||||
<div>
|
|
||||||
{
|
|
||||||
props.formData.actualNewProcess ? props.formData.actualNewProcess : <span>{'--'}</span>
|
|
||||||
}
|
|
||||||
</div>
|
|
||||||
)
|
|
||||||
},
|
|
||||||
{
|
|
||||||
label: '实际新装置(项)',
|
|
||||||
prop: 'actualNewDevice',
|
|
||||||
colProps: {
|
|
||||||
span: 24
|
|
||||||
},
|
|
||||||
labelWidth: 'left',
|
|
||||||
component: () => (
|
|
||||||
<div>
|
|
||||||
{
|
|
||||||
props.formData.actualNewDevice ? props.formData.actualNewDevice : <span>{'--'}</span>
|
|
||||||
}
|
|
||||||
</div>
|
|
||||||
)
|
|
||||||
},
|
|
||||||
{
|
|
||||||
label: '实际新材料(项)',
|
|
||||||
prop: 'actualNewMaterials',
|
|
||||||
colProps: {
|
|
||||||
span: 24
|
|
||||||
},
|
|
||||||
labelWidth: 'left',
|
|
||||||
component: () => (
|
|
||||||
<div>
|
|
||||||
{
|
|
||||||
props.formData.actualNewMaterials ? props.formData.actualNewMaterials : <span>{'--'}</span>
|
|
||||||
}
|
|
||||||
</div>
|
|
||||||
)
|
|
||||||
},
|
|
||||||
{
|
|
||||||
label: '实际计算机软件(项)',
|
|
||||||
prop: 'actualComputerSoftware',
|
|
||||||
colProps: {
|
|
||||||
span: 24
|
|
||||||
},
|
|
||||||
labelWidth: 'left',
|
|
||||||
component: () => (
|
|
||||||
<div>
|
|
||||||
{
|
|
||||||
props.formData.actualComputerSoftware ? props.formData.actualComputerSoftware : <span>{'--'}</span>
|
|
||||||
}
|
|
||||||
</div>
|
|
||||||
)
|
|
||||||
},
|
|
||||||
{
|
|
||||||
label: '实际论文论著(项)',
|
|
||||||
prop: 'actualThesis',
|
|
||||||
colProps: {
|
|
||||||
span: 24
|
|
||||||
},
|
|
||||||
labelWidth: 'left',
|
|
||||||
component: () => (
|
|
||||||
<div>
|
|
||||||
{
|
|
||||||
props.formData.actualThesis ? props.formData.actualThesis : <span>{'--'}</span>
|
|
||||||
}
|
|
||||||
</div>
|
|
||||||
)
|
|
||||||
},
|
|
||||||
{
|
|
||||||
label: '实际研究报告(项)',
|
|
||||||
prop: 'actualResearchReport',
|
|
||||||
colProps: {
|
|
||||||
span: 24
|
|
||||||
},
|
|
||||||
labelWidth: 'left',
|
|
||||||
component: () => (
|
|
||||||
<div>
|
|
||||||
{
|
|
||||||
props.formData.actualResearchReport ? props.formData.actualResearchReport : <span>{'--'}</span>
|
|
||||||
}
|
|
||||||
</div>
|
|
||||||
)
|
|
||||||
},
|
|
||||||
{
|
|
||||||
label: '实际商标(项)',
|
|
||||||
prop: 'actualTrademark',
|
|
||||||
colProps: {
|
|
||||||
span: 24
|
|
||||||
},
|
|
||||||
labelWidth: 'left',
|
|
||||||
component: () => (
|
|
||||||
<div>
|
|
||||||
{
|
|
||||||
props.formData.actualTrademark ? props.formData.actualTrademark : <span>{'--'}</span>
|
|
||||||
}
|
|
||||||
</div>
|
|
||||||
)
|
|
||||||
},
|
|
||||||
{
|
|
||||||
label: '实际其他(项)',
|
|
||||||
prop: 'actualOther',
|
|
||||||
colProps: {
|
|
||||||
span: 24
|
|
||||||
},
|
|
||||||
labelWidth: 'left',
|
|
||||||
component: () => (
|
|
||||||
<div style="white-space: pre-wrap;">
|
|
||||||
{
|
|
||||||
props.formData.actualOther ? props.formData.actualOther : <span>{'--'}</span>
|
|
||||||
}
|
|
||||||
</div>
|
|
||||||
)
|
|
||||||
},
|
|
||||||
{
|
|
||||||
label: '部门分管领导',
|
label: '部门分管领导',
|
||||||
prop: 'optionalChargeLeadership',
|
prop: 'optionalChargeLeadership',
|
||||||
colProps: {
|
colProps: {
|
||||||
@@ -561,14 +377,14 @@ const _value = computed({
|
|||||||
emit("update:value", val);
|
emit("update:value", val);
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
const clickToPreview = (row) => {
|
const clickToPreview=(row)=>{
|
||||||
filePreviewShow.value = false
|
filePreviewShow.value = false
|
||||||
filePreviewParam.value = {
|
filePreviewParam.value = {
|
||||||
fileUrl: row.url,
|
fileUrl: row.url,
|
||||||
fileName: row.originalFileName,
|
fileName: row.originalFileName,
|
||||||
fileType: row.fileType
|
fileType: row.fileType
|
||||||
}
|
}
|
||||||
nextTick(() => {
|
nextTick(()=>{
|
||||||
filePreviewShow.value = true
|
filePreviewShow.value = true
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
@@ -577,7 +393,7 @@ const getTagName = (type) => {
|
|||||||
case 'approval':
|
case 'approval':
|
||||||
return '项目立项'
|
return '项目立项'
|
||||||
case 'execute':
|
case 'execute':
|
||||||
return '项目验收'
|
return '项目实施'
|
||||||
case 'archivist':
|
case 'archivist':
|
||||||
return '项目归档'
|
return '项目归档'
|
||||||
case 'phase':
|
case 'phase':
|
||||||
|
|||||||
@@ -52,7 +52,7 @@
|
|||||||
<el-row>
|
<el-row>
|
||||||
<el-col :span="24">
|
<el-col :span="24">
|
||||||
<baseTitle v-if="fileListShow === 'READ' || fileListShow === 'EDIT'" title="附件文件"></baseTitle>
|
<baseTitle v-if="fileListShow === 'READ' || fileListShow === 'EDIT'" title="附件文件"></baseTitle>
|
||||||
<file-component title="" tag="需求征集" :fullscreen="true" :fileNameTableWidth="150"
|
<file-component title="" tag="需求征集" :fullscreen="true" :fileNameTableWidth="300"
|
||||||
v-model:value="formData.fileList" :processViewer="processViewer"
|
v-model:value="formData.fileList" :processViewer="processViewer"
|
||||||
:file-list-show="fileListShow"/>
|
:file-list-show="fileListShow"/>
|
||||||
</el-col>
|
</el-col>
|
||||||
|
|||||||
@@ -201,14 +201,6 @@ const rollbackHandler = async () => {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
const handleAgree = async () => {
|
const handleAgree = async () => {
|
||||||
if (!_value.value) {
|
|
||||||
ElNotification({
|
|
||||||
title: '提示',
|
|
||||||
message: '请填写审核意见',
|
|
||||||
type: 'warning'
|
|
||||||
})
|
|
||||||
return
|
|
||||||
}
|
|
||||||
// const values = form.value.getValues()
|
// const values = form.value.getValues()
|
||||||
const params = {
|
const params = {
|
||||||
taskId: props.taskId,
|
taskId: props.taskId,
|
||||||
|
|||||||
@@ -21,28 +21,19 @@
|
|||||||
<span>{{ toThousands(formData.residualAmount) }}</span>
|
<span>{{ toThousands(formData.residualAmount) }}</span>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-col>
|
</el-col>
|
||||||
<!-- <baseTitle title="介绍"></baseTitle>-->
|
<baseTitle title="介绍"></baseTitle>
|
||||||
<!-- <el-col :span="24">-->
|
|
||||||
<!-- <el-form-item>-->
|
|
||||||
<!-- <el-card style="width: 100%">-->
|
|
||||||
<!-- <div v-html="formData.introduce">-->
|
|
||||||
<!-- </div>-->
|
|
||||||
<!-- </el-card>-->
|
|
||||||
<!-- </el-form-item>-->
|
|
||||||
<!-- </el-col>-->
|
|
||||||
<el-col :span="24">
|
<el-col :span="24">
|
||||||
<el-form-item label="专项资金情况说明" >
|
<el-form-item>
|
||||||
<div style="white-space: pre-wrap">{{formData.introduce}}
|
<el-card style="width: 100%">
|
||||||
|
<div v-html="formData.introduce">
|
||||||
</div>
|
</div>
|
||||||
|
</el-card>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-col>
|
</el-col>
|
||||||
</el-row>
|
|
||||||
|
|
||||||
<el-row style="margin-top: -18px;" class="projects">
|
|
||||||
<baseTitle title="关联项目"></baseTitle>
|
<baseTitle title="关联项目"></baseTitle>
|
||||||
<el-col :span="24">
|
<el-col :span="24">
|
||||||
<el-form-item>
|
<el-form-item>
|
||||||
<fvTable style="width: 100%;max-height:160px" height="160" v-if="showTable" :scrollbar-always-on="true" :tableConfig="projectTable"
|
<fvTable style="width: 100%;max-height:160px" height="160" v-if="showTable" :tableConfig="projectTable"
|
||||||
:data="formData.projects" :isSettingCol="false" :pagination="false">
|
:data="formData.projects" :isSettingCol="false" :pagination="false">
|
||||||
<template #empty>
|
<template #empty>
|
||||||
<el-empty :image-size="55" description="暂无数据" style="padding: 0"/>
|
<el-empty :image-size="55" description="暂无数据" style="padding: 0"/>
|
||||||
@@ -50,12 +41,10 @@
|
|||||||
</fvTable>
|
</fvTable>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-col>
|
</el-col>
|
||||||
</el-row>
|
|
||||||
<el-row style="margin-top: -18px;" class="projects">
|
|
||||||
<baseTitle title="附件文件"></baseTitle>
|
<baseTitle title="附件文件"></baseTitle>
|
||||||
<el-col :span="24">
|
<el-col :span="24">
|
||||||
<el-form-item>
|
<el-form-item>
|
||||||
<fvTable style="width: 100%;max-height: 160px;" height="160" v-if="showTable":scrollbar-always-on="true" :tableConfig="fileTable"
|
<fvTable style="width: 100%;max-height: 160px;" height="160" v-if="showTable" :tableConfig="fileTable"
|
||||||
:data="formData.files" :isSettingCol="false" :pagination="false">
|
:data="formData.files" :isSettingCol="false" :pagination="false">
|
||||||
<template #empty>
|
<template #empty>
|
||||||
<el-empty :image-size="55" description="暂无数据" style="padding: 0"/>
|
<el-empty :image-size="55" description="暂无数据" style="padding: 0"/>
|
||||||
@@ -134,15 +123,12 @@ const projectTable = reactive({
|
|||||||
prop: 'projectName',
|
prop: 'projectName',
|
||||||
label: '项目名称',
|
label: '项目名称',
|
||||||
align: 'center',
|
align: 'center',
|
||||||
showOverflowTooltip: false,
|
|
||||||
width: 200,
|
width: 200,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
prop: 'specialFundAmount',
|
prop: 'specialFundAmount',
|
||||||
label: '项目金额',
|
label: '项目金额',
|
||||||
align: 'center',
|
align: 'center',
|
||||||
minWidth: 120,
|
|
||||||
showOverflowTooltip: false,
|
|
||||||
currentRender:({row})=>{
|
currentRender:({row})=>{
|
||||||
return <span>{toThousands(row.specialFundAmount)}</span>
|
return <span>{toThousands(row.specialFundAmount)}</span>
|
||||||
}
|
}
|
||||||
@@ -151,7 +137,7 @@ const projectTable = reactive({
|
|||||||
prop: 'startTime',
|
prop: 'startTime',
|
||||||
label: '项目时间',
|
label: '项目时间',
|
||||||
align: 'center',
|
align: 'center',
|
||||||
width: 180,
|
width: 150,
|
||||||
},
|
},
|
||||||
// {
|
// {
|
||||||
// prop: 'oper',
|
// prop: 'oper',
|
||||||
|
|||||||
@@ -211,7 +211,7 @@ const schema = computed(() => {
|
|||||||
)
|
)
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: '业务板块',
|
label: '所属业务板块',
|
||||||
prop: 'businessSegment',
|
prop: 'businessSegment',
|
||||||
colProps: {
|
colProps: {
|
||||||
span: 24
|
span: 24
|
||||||
@@ -258,9 +258,8 @@ const schema = computed(() => {
|
|||||||
</div>
|
</div>
|
||||||
)
|
)
|
||||||
},
|
},
|
||||||
|
|
||||||
{
|
{
|
||||||
label: '预估经费预算(元)',
|
label: '经费预算(元)',
|
||||||
prop: 'economicEstimate',
|
prop: 'economicEstimate',
|
||||||
colProps: {
|
colProps: {
|
||||||
span: 24
|
span: 24
|
||||||
@@ -275,22 +274,6 @@ const schema = computed(() => {
|
|||||||
</div>
|
</div>
|
||||||
)
|
)
|
||||||
},
|
},
|
||||||
{
|
|
||||||
label: '实际经费预算(元)',
|
|
||||||
prop: 'actualEconomicEstimate',
|
|
||||||
colProps: {
|
|
||||||
span: 24
|
|
||||||
},
|
|
||||||
component: () => (
|
|
||||||
<div>
|
|
||||||
{
|
|
||||||
baseFormData.value?.actualEconomicEstimate ?
|
|
||||||
<span>{toThousands(baseFormData.value?.actualEconomicEstimate)}</span>
|
|
||||||
: <span>{'--'}</span>
|
|
||||||
}
|
|
||||||
</div>
|
|
||||||
)
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
label: '产学研联合',
|
label: '产学研联合',
|
||||||
prop: 'industryUniversityResearch',
|
prop: 'industryUniversityResearch',
|
||||||
@@ -337,27 +320,9 @@ const schema = computed(() => {
|
|||||||
span: 24
|
span: 24
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
{
|
{
|
||||||
label: '预估专项资金(元)',
|
label: '申请总部专项资金(元)',
|
||||||
prop: 'forecastSpecialFundAmount',
|
prop: 'specialFundAmount',
|
||||||
colProps: {
|
|
||||||
span: 24
|
|
||||||
},
|
|
||||||
component: () => (
|
|
||||||
<div>
|
|
||||||
{
|
|
||||||
baseFormData.value?.forecastSpecialFundAmount ?
|
|
||||||
<span>{toThousands(baseFormData.value?.forecastSpecialFundAmount)}</span>
|
|
||||||
: <span>{'--'}</span>
|
|
||||||
}
|
|
||||||
</div>
|
|
||||||
)
|
|
||||||
},
|
|
||||||
|
|
||||||
{
|
|
||||||
label: '实际专项资金(元)',
|
|
||||||
prop: 'forecastSpecialFundAmount',
|
|
||||||
colProps: {
|
colProps: {
|
||||||
span: 24
|
span: 24
|
||||||
},
|
},
|
||||||
@@ -371,36 +336,12 @@ const schema = computed(() => {
|
|||||||
</div>
|
</div>
|
||||||
)
|
)
|
||||||
},
|
},
|
||||||
|
|
||||||
{
|
|
||||||
label: '是否在预算内',
|
|
||||||
prop: 'isWithinBudget',
|
|
||||||
colProps: {
|
|
||||||
span: 24
|
|
||||||
},
|
|
||||||
component: () => (
|
|
||||||
<div>
|
|
||||||
{
|
|
||||||
baseFormData.value?.isWithinBudget!=null ? baseFormData.value?.isWithinBudget?
|
|
||||||
<span>{'预算内'}</span>
|
|
||||||
: <span>{'预算外'}</span>:'--'
|
|
||||||
}
|
|
||||||
</div>
|
|
||||||
)
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
label: '部门分管领导',
|
label: '部门分管领导',
|
||||||
prop: 'optionalChargeLeadership',
|
prop: 'optionalChargeLeadership',
|
||||||
colProps: {
|
colProps: {
|
||||||
span: 24
|
span: 24
|
||||||
}
|
}
|
||||||
},
|
|
||||||
{
|
|
||||||
label: '主项目',
|
|
||||||
prop: 'masterProjectName',
|
|
||||||
colProps: {
|
|
||||||
span: 24
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
})
|
})
|
||||||
@@ -638,9 +579,6 @@ watchEffect(() => {
|
|||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style lang="scss" scoped>
|
<style lang="scss" scoped>
|
||||||
:deep(.el-step__title){
|
|
||||||
font-size: 14px;
|
|
||||||
}
|
|
||||||
.steps-box {
|
.steps-box {
|
||||||
padding: 10px 0;
|
padding: 10px 0;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4,7 +4,12 @@
|
|||||||
<baseTitle title="预期知识产权"></baseTitle>
|
<baseTitle title="预期知识产权"></baseTitle>
|
||||||
<el-row gutter="20" style="margin-bottom: -18px;margin-left: 5px">
|
<el-row gutter="20" style="margin-bottom: -18px;margin-left: 5px">
|
||||||
<el-col :span="24">
|
<el-col :span="24">
|
||||||
<el-form-item label="知识产权归属" prop="intellectualProperty">
|
<el-form-item label="预期成果形式" prop="resultForm">
|
||||||
|
<span>{{ filterDict(cacheStore.getDict('result_form'), localFormData.resultForm) }}</span>
|
||||||
|
</el-form-item>
|
||||||
|
</el-col>
|
||||||
|
<el-col :span="24">
|
||||||
|
<el-form-item label="知识产权状况" prop="intellectualProperty">
|
||||||
<span>{{
|
<span>{{
|
||||||
filterDict(cacheStore.getDict('intellectual_property'), localFormData.intellectualProperty)
|
filterDict(cacheStore.getDict('intellectual_property'), localFormData.intellectualProperty)
|
||||||
}}</span>
|
}}</span>
|
||||||
@@ -12,77 +17,31 @@
|
|||||||
</el-col>
|
</el-col>
|
||||||
|
|
||||||
<el-col :span="24">
|
<el-col :span="24">
|
||||||
<el-form-item label="预估专利(项)" prop="newPatent">
|
<el-form-item label="发明专利(项)" prop="inventionPatent">
|
||||||
|
<span>{{ localFormData.inventionPatent }}</span>
|
||||||
|
</el-form-item>
|
||||||
|
</el-col>
|
||||||
|
<el-col :span="24">
|
||||||
|
<el-form-item label="新型专利(项)" prop="newPatent">
|
||||||
<span>{{ localFormData.newPatent }}</span>
|
<span>{{ localFormData.newPatent }}</span>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-col>
|
</el-col>
|
||||||
|
|
||||||
<el-col :span="24">
|
<el-col :span="24">
|
||||||
<el-form-item label="预估软件著作权(项)" prop="softwareCopyright">
|
<el-form-item label="软件著作权(项)" prop="softwareCopyright">
|
||||||
<span>{{ localFormData.softwareCopyright }}</span>
|
<span>{{ localFormData.softwareCopyright }}</span>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-col>
|
</el-col>
|
||||||
|
|
||||||
|
|
||||||
<el-col :span="24">
|
<el-col :span="24">
|
||||||
<el-form-item label="预估技术标准(项)" prop="technicalNorms">
|
<el-form-item label="著作权(项)" prop="copyright">
|
||||||
<span>{{ localFormData.technicalNorms }}</span>
|
<span>{{ localFormData.copyright }}</span>
|
||||||
|
</el-form-item>
|
||||||
|
</el-col>
|
||||||
|
<el-col :span="24">
|
||||||
|
<el-form-item label="其他(项)" prop="other">
|
||||||
|
<span>{{ localFormData.other }}</span>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-col>
|
</el-col>
|
||||||
|
|
||||||
<el-col :span="24">
|
|
||||||
<el-form-item label="预估新产品(项)" prop="newProduct">
|
|
||||||
<span>{{ localFormData.newProduct }}</span>
|
|
||||||
</el-form-item>
|
|
||||||
</el-col>
|
|
||||||
|
|
||||||
<el-col :span="24">
|
|
||||||
<el-form-item label="预估新工艺(项)" prop="newProcess">
|
|
||||||
<span>{{ localFormData.newProcess }}</span>
|
|
||||||
</el-form-item>
|
|
||||||
</el-col>
|
|
||||||
|
|
||||||
<el-col :span="24">
|
|
||||||
<el-form-item label="预估新装置(项)" prop="newDevice">
|
|
||||||
<span>{{ localFormData.newDevice }}</span>
|
|
||||||
</el-form-item>
|
|
||||||
</el-col>
|
|
||||||
|
|
||||||
<el-col :span="24">
|
|
||||||
<el-form-item label="预估新材料(项)" prop="newMaterials">
|
|
||||||
<span>{{ localFormData.newMaterials }}</span>
|
|
||||||
</el-form-item>
|
|
||||||
</el-col>
|
|
||||||
|
|
||||||
<el-col :span="24">
|
|
||||||
<el-form-item label="预估计算机软件(项)" prop="computerSoftware">
|
|
||||||
<span>{{ localFormData.computerSoftware }}</span>
|
|
||||||
</el-form-item>
|
|
||||||
</el-col>
|
|
||||||
|
|
||||||
<el-col :span="24">
|
|
||||||
<el-form-item label="预估论文论著(项)" prop="thesis">
|
|
||||||
<span>{{ localFormData.thesis }}</span>
|
|
||||||
</el-form-item>
|
|
||||||
</el-col>
|
|
||||||
|
|
||||||
<el-col :span="24">
|
|
||||||
<el-form-item label="预估研究报告(项)" prop="researchReport">
|
|
||||||
<span>{{ localFormData.researchReport }}</span>
|
|
||||||
</el-form-item>
|
|
||||||
</el-col>
|
|
||||||
|
|
||||||
<el-col :span="24">
|
|
||||||
<el-form-item label="预估商标(项)" prop="trademark">
|
|
||||||
<span>{{ localFormData.trademark }}</span>
|
|
||||||
</el-form-item>
|
|
||||||
</el-col>
|
|
||||||
|
|
||||||
<el-col :span="24">
|
|
||||||
<el-form-item label="预估其他(项)" prop="other">
|
|
||||||
<span style="white-space: pre-wrap">{{ localFormData.other }}</span>
|
|
||||||
</el-form-item>
|
|
||||||
</el-col>
|
|
||||||
</el-row>
|
</el-row>
|
||||||
<baseTitle title="项目描述"></baseTitle>
|
<baseTitle title="项目描述"></baseTitle>
|
||||||
<el-row gutter="20" style="margin-bottom: -18px;margin-left: 5px;">
|
<el-row gutter="20" style="margin-bottom: -18px;margin-left: 5px;">
|
||||||
@@ -115,7 +74,7 @@
|
|||||||
<!-- </el-col>-->
|
<!-- </el-col>-->
|
||||||
<el-col :span="24">
|
<el-col :span="24">
|
||||||
<file-component
|
<file-component
|
||||||
tag="需求上报" :fileNameTableWidth="150" :fullscreen="true"
|
tag="需求上报" :fileNameTableWidth="300" :fullscreen="true"
|
||||||
v-model:value="localFormData.fileList"
|
v-model:value="localFormData.fileList"
|
||||||
:processViewer="processViewer"
|
:processViewer="processViewer"
|
||||||
:file-list-show="fileListShow"
|
:file-list-show="fileListShow"
|
||||||
@@ -135,7 +94,7 @@
|
|||||||
</el-form-item>
|
</el-form-item>
|
||||||
</div>
|
</div>
|
||||||
<div v-if="data.state==='5'" style="margin-bottom: 15px">
|
<div v-if="data.state==='5'" style="margin-bottom: 15px">
|
||||||
<baseTitle title="前置流程" v-if="localFormData.preProcess"></baseTitle>
|
<baseTitle title="前置流程"></baseTitle>
|
||||||
<div style="display: flex;align-items: center;flex-wrap: wrap;">
|
<div style="display: flex;align-items: center;flex-wrap: wrap;">
|
||||||
<div v-for="(item,index) in localFormData.preProcess" :key="item.requestId">
|
<div v-for="(item,index) in localFormData.preProcess" :key="item.requestId">
|
||||||
<a :href="item.baseUrl" target="_blank"
|
<a :href="item.baseUrl" target="_blank"
|
||||||
@@ -146,8 +105,8 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div v-perm="['annual:plan:approve']" v-if="data.state==='4'">
|
<div v-perm="['annual:plan:approve']" v-if="data.state==='4'">
|
||||||
<!-- <baseTitle title="前置流程"></baseTitle>-->
|
<baseTitle title="前置流程"></baseTitle>
|
||||||
<!-- <select-pre-process :formData="localFormData"/>-->
|
<select-pre-process :formData="localFormData"/>
|
||||||
<baseTitle title="审核意见"></baseTitle>
|
<baseTitle title="审核意见"></baseTitle>
|
||||||
<el-form-item prop="_value">
|
<el-form-item prop="_value">
|
||||||
<el-input
|
<el-input
|
||||||
@@ -280,14 +239,6 @@ const handleRejectPlan = async () => {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
const handleAgreePlan = async () => {
|
const handleAgreePlan = async () => {
|
||||||
if (!_value.value) {
|
|
||||||
ElNotification({
|
|
||||||
title: '提示',
|
|
||||||
message: '请填写审核意见',
|
|
||||||
type: 'warning'
|
|
||||||
})
|
|
||||||
return
|
|
||||||
}
|
|
||||||
const params = {
|
const params = {
|
||||||
auditOpinion: _value.value,
|
auditOpinion: _value.value,
|
||||||
projectId: parseInt(route.query.projectId),
|
projectId: parseInt(route.query.projectId),
|
||||||
|
|||||||
@@ -26,7 +26,7 @@
|
|||||||
:preProcessShow="preProcessShow"
|
:preProcessShow="preProcessShow"
|
||||||
v-model:value="auditOpinion"/>
|
v-model:value="auditOpinion"/>
|
||||||
<div v-if="showActive == '30'">
|
<div v-if="showActive == '30'">
|
||||||
<project-attachment fileNameTableWidth="200" :isLineBtn="true"/>
|
<project-attachment fileNameTableWidth="300" :isLineBtn="true"/>
|
||||||
</div>
|
</div>
|
||||||
<ApprovalDetail type="execute"
|
<ApprovalDetail type="execute"
|
||||||
v-if="showActive == '40'"
|
v-if="showActive == '40'"
|
||||||
|
|||||||
@@ -167,7 +167,7 @@ const schema = computed(() => {
|
|||||||
)
|
)
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: '预估经费预算(元)',
|
label: '经费预算(元)',
|
||||||
prop: 'economicEstimate',
|
prop: 'economicEstimate',
|
||||||
colProps: {
|
colProps: {
|
||||||
span: 24
|
span: 24
|
||||||
@@ -222,7 +222,7 @@ const schema = computed(() => {
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: '预估专项资金(元)',
|
label: '申请总部专项资金(元)',
|
||||||
prop: 'specialFundAmount',
|
prop: 'specialFundAmount',
|
||||||
colProps: {
|
colProps: {
|
||||||
span: 24
|
span: 24
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
<template>
|
<template>
|
||||||
<fvSearchForm :searchConfig="researchFundSearchConfig" @search="searchResearchFund"
|
<fvSearchForm :searchConfig="researchFundSearchConfig" @search="searchResearchFund"
|
||||||
></fvSearchForm>
|
style="margin-left: 16px"></fvSearchForm>
|
||||||
<fvTable ref="tableIns" :tableConfig="researchFundTableConfig" @headBtnClick="headBtnClick">
|
<fvTable ref="tableIns" :tableConfig="researchFundTableConfig" @headBtnClick="headBtnClick">
|
||||||
<template #empty>
|
<template #empty>
|
||||||
<el-empty description="暂无数据"/>
|
<el-empty description="暂无数据"/>
|
||||||
@@ -30,7 +30,7 @@ const researchFundSearchConfig = ref([
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: '研发资金金额(元)',
|
label: '研发资金金额',
|
||||||
prop: 'rdAmount',
|
prop: 'rdAmount',
|
||||||
component: 'el-input',
|
component: 'el-input',
|
||||||
props: {
|
props: {
|
||||||
@@ -74,7 +74,7 @@ const researchFundTableConfig = reactive({
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
prop: 'rdAmount',
|
prop: 'rdAmount',
|
||||||
label: '研发资金金额(元)',
|
label: '研发资金金额',
|
||||||
align: 'center',
|
align: 'center',
|
||||||
currentRender:({row})=>{
|
currentRender:({row})=>{
|
||||||
return <span>{toThousands(row.rdAmount)}</span>
|
return <span>{toThousands(row.rdAmount)}</span>
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
<fvTable ref="tableIns" :tableConfig="tableConfig" @headBtnClick="headBtnClick"
|
<fvTable ref="tableIns" :tableConfig="tableConfig" @headBtnClick="headBtnClick"
|
||||||
@selectionChange="selectionChange"></fvTable>
|
@selectionChange="selectionChange"></fvTable>
|
||||||
<user-picker :multiple="true" ref="whiteUserRef" title="请选择人员"
|
<user-picker :multiple="true" ref="whiteUserRef" title="请选择人员"
|
||||||
v-model:value="whiteUserList" @ok="whiteUserPickerOk"/>
|
v-model:value="whiteUserList" @ok="whiteUserPickerOk" @cancelOrClear="whiteUserPickerOk"/>
|
||||||
|
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
|
|||||||
@@ -34,6 +34,7 @@
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<script setup>
|
<script setup>
|
||||||
import {defineProps,defineEmits} from 'vue'
|
import {defineProps,defineEmits} from 'vue'
|
||||||
// import {timeLength} from '../utils/date'
|
// import {timeLength} from '../utils/date'
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
//时间转换为String类型
|
//时间转换为String类型
|
||||||
|
const moment = require("moment");
|
||||||
|
|
||||||
function simpleDateFormat(pattern) {
|
function simpleDateFormat(pattern) {
|
||||||
var fmt = new Object();
|
var fmt = new Object();
|
||||||
@@ -82,36 +83,36 @@ function consumingTime(dateBegin, dateEnd) {
|
|||||||
return dayDiff + "天 " + hours + "小时 " + minutes + " 分钟" + seconds + " 秒";
|
return dayDiff + "天 " + hours + "小时 " + minutes + " 分钟" + seconds + " 秒";
|
||||||
}
|
}
|
||||||
|
|
||||||
// export function timeLength(start, dateEnd) {
|
export function timeLength(start, dateEnd) {
|
||||||
// // //如果时间格式是正确的,那下面这一步转化时间格式就可以不用了
|
// //如果时间格式是正确的,那下面这一步转化时间格式就可以不用了
|
||||||
// let mstart = moment(start);
|
let mstart = moment(start);
|
||||||
// let mend = moment(dateEnd);
|
let mend = moment(dateEnd);
|
||||||
// let years = mend.diff(start, "years");
|
let years = mend.diff(start, "years");
|
||||||
// let months = mend.diff(start, "months");
|
let months = mend.diff(start, "months");
|
||||||
// let days = mend.diff(start, "days");
|
let days = mend.diff(start, "days");
|
||||||
// let hours = mend.diff(start, "hours");
|
let hours = mend.diff(start, "hours");
|
||||||
// let minutes = mend.diff(start, "minutes");
|
let minutes = mend.diff(start, "minutes");
|
||||||
// minutes = minutes % 60;
|
minutes = minutes % 60;
|
||||||
// hours = hours % 24;
|
hours = hours % 24;
|
||||||
// months = months % 12;
|
months = months % 12;
|
||||||
// //因为每月天不固定,所以天要特殊动态处理
|
//因为每月天不固定,所以天要特殊动态处理
|
||||||
// if (mstart.date() < mend.date()) {
|
if (mstart.date() < mend.date()) {
|
||||||
// days = mend.date() - mstart.date();
|
days = mend.date() - mstart.date();
|
||||||
// if (minutes > 0 || hours > 0) {
|
if (minutes > 0 || hours > 0) {
|
||||||
// days--;
|
days--;
|
||||||
// }
|
}
|
||||||
// }
|
}
|
||||||
// //处理超过俩月且天超过31
|
//处理超过俩月且天超过31
|
||||||
// if (days > 31 && mend.month() - mstart.month() >= 2) {
|
if (days > 31 && mend.month() - mstart.month() >= 2) {
|
||||||
// //将日期推至上月求差
|
//将日期推至上月求差
|
||||||
// days = mend.diff(mstart.add(mend.month() - mstart.month() - 1, "month"), "days");
|
days = mend.diff(mstart.add(mend.month() - mstart.month() - 1, "month"), "days");
|
||||||
// }
|
}
|
||||||
// return `${years > 0 ? years + "年 " : " "}` + `${months > 0 ? months + "个月 " : " "}` + `${days > 0 ? days + "天 " : " "}`
|
return `${years > 0 ? years + "年 " : " "}` + `${months > 0 ? months + "个月 " : " "}` + `${days > 0 ? days + "天 " : " "}`
|
||||||
// + `${hours > 0 ? hours + "小时 " : " "}` + `${minutes > 0 ? minutes + "分钟 " : " "}`;
|
+ `${hours > 0 ? hours + "小时 " : " "}` + `${minutes > 0 ? minutes + "分钟 " : " "}`;
|
||||||
// }
|
}
|
||||||
|
|
||||||
module.exports = {
|
module.exports = {
|
||||||
formatToYYYYMMDD: simpleDateFormatByMoreLine,
|
formatToYYYYMMDD: simpleDateFormatByMoreLine,
|
||||||
consumingTime: consumingTime,
|
consumingTime: consumingTime,
|
||||||
// timeLength: timeLength
|
timeLength: timeLength
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -118,12 +118,10 @@ import {
|
|||||||
deleteHistoryVersion
|
deleteHistoryVersion
|
||||||
} from "@/api/workflow/process-definition.js";
|
} from "@/api/workflow/process-definition.js";
|
||||||
import {Search, Refresh, Delete, Plus, Edit, Download, Document} from '@element-plus/icons-vue'
|
import {Search, Refresh, Delete, Plus, Edit, Download, Document} from '@element-plus/icons-vue'
|
||||||
import {ElMessage, ElMessageBox, ElNotification} from "element-plus";
|
import {ElMessage, ElMessageBox} from "element-plus";
|
||||||
import {useCacheStore} from '@/stores/cache.js'
|
import {useCacheStore} from '@/stores/cache.js'
|
||||||
import PointTag from "@/components/PointTag.vue";
|
import PointTag from "@/components/PointTag.vue";
|
||||||
import Paging from "@/components/pagination/index.vue";
|
import Paging from "@/components/pagination/index.vue";
|
||||||
import UserPicker from "./common/UserPicker.vue";
|
|
||||||
import {applyCcSend} from "@/api/expense-manage";
|
|
||||||
|
|
||||||
const dictStore = useCacheStore()
|
const dictStore = useCacheStore()
|
||||||
dictStore.setCacheKey(['normal_disable'])
|
dictStore.setCacheKey(['normal_disable'])
|
||||||
@@ -146,7 +144,6 @@ const loading = ref(true)
|
|||||||
const list = ref([])
|
const list = ref([])
|
||||||
const queryForm = ref()
|
const queryForm = ref()
|
||||||
const total = ref()
|
const total = ref()
|
||||||
const chooseRow = ref({})
|
|
||||||
const selectDefinition = ref(null)
|
const selectDefinition = ref(null)
|
||||||
const historyVersionList = ref([])
|
const historyVersionList = ref([])
|
||||||
const singleTable = ref()
|
const singleTable = ref()
|
||||||
@@ -154,8 +151,6 @@ const isVisited = ref(false)
|
|||||||
onActivated(() => {
|
onActivated(() => {
|
||||||
getList()
|
getList()
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|
||||||
//重置搜索
|
//重置搜索
|
||||||
const handleReset = () => {
|
const handleReset = () => {
|
||||||
queryForm.value.resetFields()
|
queryForm.value.resetFields()
|
||||||
@@ -187,6 +182,7 @@ const handleAdd = () => {
|
|||||||
path: '/workflow/process/add',
|
path: '/workflow/process/add',
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
const handleEdit = (deploymentId) => {
|
const handleEdit = (deploymentId) => {
|
||||||
router.push({
|
router.push({
|
||||||
path: `/workflow/process/edit/${deploymentId}`,
|
path: `/workflow/process/edit/${deploymentId}`,
|
||||||
|
|||||||
@@ -9,8 +9,7 @@ import vue from '@vitejs/plugin-vue'
|
|||||||
import vueJsx from '@vitejs/plugin-vue-jsx'
|
import vueJsx from '@vitejs/plugin-vue-jsx'
|
||||||
import Inspect from 'vite-plugin-inspect'
|
import Inspect from 'vite-plugin-inspect'
|
||||||
import viteSvgIcons from 'vite-plugin-svg-icons'
|
import viteSvgIcons from 'vite-plugin-svg-icons'
|
||||||
import path from 'node:path'
|
import path from 'path'
|
||||||
|
|
||||||
// https://vitejs.dev/config/
|
// https://vitejs.dev/config/
|
||||||
export default defineConfig({
|
export default defineConfig({
|
||||||
plugins: [
|
plugins: [
|
||||||
@@ -43,7 +42,7 @@ export default defineConfig({
|
|||||||
}),
|
}),
|
||||||
viteSvgIcons({
|
viteSvgIcons({
|
||||||
// 指定需要缓存的图标文件夹
|
// 指定需要缓存的图标文件夹
|
||||||
iconDirs: [path.resolve(process.cwd(), 'src/assets/svg')],
|
iconDirs: [path.resolve(__dirname, 'src/assets/svg')],
|
||||||
// 指定symbolId格式
|
// 指定symbolId格式
|
||||||
symbolId: 'icon-[dir]-[name]',
|
symbolId: 'icon-[dir]-[name]',
|
||||||
}),
|
}),
|
||||||
@@ -54,7 +53,6 @@ export default defineConfig({
|
|||||||
'@': fileURLToPath(new URL('./src', import.meta.url))
|
'@': fileURLToPath(new URL('./src', import.meta.url))
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
build: {
|
build: {
|
||||||
minify: 'esbuild',
|
minify: 'esbuild',
|
||||||
terserOptions: {
|
terserOptions: {
|
||||||
@@ -71,22 +69,22 @@ export default defineConfig({
|
|||||||
open: true,
|
open: true,
|
||||||
proxy: {
|
proxy: {
|
||||||
// '/api/workflow': {
|
// '/api/workflow': {
|
||||||
// target: 'http://frp.feashow.cn:31800/',
|
// // target: 'http://frp.feashow.cn:31800/',
|
||||||
// // target: 'http://clay.frp.feashow.cn/',
|
// target: 'http://clay.frp.feashow.cn/',
|
||||||
// // target: 'http://192.168.31.175:8000',
|
// // target: 'http://192.168.31.175:8000',
|
||||||
// changeOrigin: true,
|
// changeOrigin: true,
|
||||||
// rewrite: (path) => path.replace(/^\/api/, '')
|
// rewrite: (path) => path.replace(/^\/api/, '')
|
||||||
// },
|
// },
|
||||||
// '/api/admin': {
|
// '/api/admin': {
|
||||||
// target: 'http://frp.feashow.cn:31800/',
|
// // target: 'http://frp.feashow.cn:31800/',
|
||||||
// // target: 'http://clay.frp.feashow.cn/',
|
// target: 'http://clay.frp.feashow.cn/',
|
||||||
// // target: 'http://192.168.31.175:8000',
|
// // target: 'http://192.168.31.175:8000',
|
||||||
// changeOrigin: true,
|
// changeOrigin: true,
|
||||||
// rewrite: (path) => path.replace(/^\/api/, '')
|
// rewrite: (path) => path.replace(/^\/api/, '')
|
||||||
// },
|
// },
|
||||||
// '/api/auth': {
|
// '/api/auth': {
|
||||||
// target: 'http://frp.feashow.cn:31800/',
|
// // target: 'http://frp.feashow.cn:31800/',
|
||||||
// // target: 'http://clay.frp.feashow.cn/',
|
// target: 'http://clay.frp.feashow.cn/',
|
||||||
// // target: 'http://192.168.31.175:8000',
|
// // target: 'http://192.168.31.175:8000',
|
||||||
// changeOrigin: true,
|
// changeOrigin: true,
|
||||||
// rewrite: (path) => path.replace(/^\/api/, '')
|
// rewrite: (path) => path.replace(/^\/api/, '')
|
||||||
@@ -105,8 +103,5 @@ export default defineConfig({
|
|||||||
// changeOrigin: true,
|
// changeOrigin: true,
|
||||||
// }
|
// }
|
||||||
}
|
}
|
||||||
},
|
}
|
||||||
esbuild: {
|
|
||||||
target: 'esnext', // 强制使用最新 ES 模块
|
|
||||||
},
|
|
||||||
})
|
})
|
||||||
|
|||||||
Reference in New Issue
Block a user