405 Commits
dj ... gary

Author SHA1 Message Date
zhangkaihuai
6bdbde262f 更新 nginx.conf 2025-03-19 07:34:04 +00:00
zhangkaihuai
c3358acf73 Merge remote-tracking branch 'origin/gary' 2025-03-19 15:32:05 +08:00
zhangkaihuai
3b1b822882 nginx ssl 证书配置 2025-03-19 15:29:56 +08:00
f874cd75b7 Merge pull request 'master' (#950) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/950
2025-03-13 13:35:25 +00:00
65b76da880 Merge pull request 'master' (#948) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/948
2025-03-08 11:23:50 +00:00
d0dc8ba9f8 Merge pull request 'master' (#946) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/946
2025-03-08 09:48:33 +00:00
e2de62e54a Merge pull request 'master' (#944) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/944
2024-12-21 07:08:22 +00:00
61feb031aa Merge pull request 'master' (#942) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/942
2024-12-21 06:50:05 +00:00
e5b5b26e24 Merge pull request 'master' (#940) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/940
2024-12-20 15:32:31 +00:00
41b04e6fac Merge pull request 'master' (#938) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/938
2024-12-19 15:07:32 +00:00
0f2cb87f66 Merge pull request 'master' (#936) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/936
2024-12-19 14:26:49 +00:00
ccba937158 Merge pull request 'master' (#934) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/934
2024-12-14 14:54:58 +00:00
edffc54453 Merge pull request 'master' (#932) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/932
2024-12-14 11:05:47 +00:00
f5b3791762 Merge pull request 'master' (#930) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/930
2024-12-13 06:29:10 +00:00
7e25e76683 Merge pull request 'master' (#928) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/928
2024-12-13 05:10:55 +00:00
7e7aac5139 Merge pull request 'master' (#926) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/926
2024-12-13 04:42:16 +00:00
eed18d0c17 Merge pull request 'master' (#924) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/924
2024-12-13 03:52:19 +00:00
981d65c759 Merge pull request 'master' (#922) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/922
2024-12-11 05:13:47 +00:00
049091719a Merge pull request 'master' (#920) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/920
2024-11-10 14:52:43 +00:00
5f120bff1e Merge pull request 'master' (#918) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/918
2024-11-10 05:50:47 +00:00
70a4899337 Merge pull request 'master' (#916) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/916
2024-11-07 03:09:06 +00:00
a6fd326774 Merge pull request 'master' (#914) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/914
2024-11-07 03:08:17 +00:00
45aaaf5360 Merge pull request 'master' (#910) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/910
2024-11-03 11:50:33 +00:00
193862f58b Merge pull request 'master' (#908) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/908
2024-11-02 14:05:27 +00:00
24563fd7df Merge pull request 'master' (#906) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/906
2024-11-02 12:01:42 +00:00
6de9896ead Merge pull request 'master' (#904) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/904
2024-10-30 13:14:01 +00:00
60df95cc20 Merge pull request 'master' (#902) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/902
2024-10-29 13:45:26 +00:00
d8a1a661df Merge pull request 'master' (#900) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/900
2024-10-27 11:01:00 +00:00
f720c3cddb Merge pull request 'master' (#898) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/898
2024-10-27 10:08:59 +00:00
0a6803371b Merge pull request 'master' (#896) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/896
2024-10-26 17:54:18 +00:00
fb48952924 Merge pull request 'master' (#894) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/894
2024-10-26 17:10:15 +00:00
1a5dda5302 Merge pull request 'master' (#892) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/892
2024-10-26 17:04:25 +00:00
cde8d9f0b4 Merge pull request 'master' (#890) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/890
2024-10-26 16:56:10 +00:00
a560460cc1 Merge pull request 'master' (#888) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/888
2024-10-26 13:29:37 +00:00
7d234e523b Merge pull request 'master' (#886) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/886
2024-10-26 13:18:51 +00:00
bf6779a008 Merge pull request 'master' (#884) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/884
2024-10-26 13:16:33 +00:00
065a232333 Merge pull request 'master' (#882) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/882
2024-10-26 13:03:36 +00:00
4c492a8866 Merge pull request 'master' (#880) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/880
2024-10-25 15:31:11 +00:00
bb84f72836 Merge pull request 'master' (#878) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/878
2024-10-25 15:11:33 +00:00
45b8b91152 Merge pull request 'master' (#876) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/876
2024-10-25 13:50:16 +00:00
94a46d01fe Merge pull request 'master' (#874) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/874
2024-10-25 13:33:13 +00:00
7be10381bd Merge pull request 'master' (#872) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/872
2024-10-25 12:52:42 +00:00
39fedea1ca Merge pull request 'master' (#870) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/870
2024-10-25 12:21:03 +00:00
ec9c4c526c Merge pull request 'master' (#868) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/868
2024-10-25 02:48:22 +00:00
a1b249b86c Merge pull request 'master' (#866) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/866
2024-10-24 15:04:46 +00:00
fe0a6bb3be Merge pull request 'master' (#863) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/863
2024-10-24 05:13:45 +00:00
41bd6d1686 Merge pull request 'master' (#861) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/861
2024-10-24 02:29:18 +00:00
e65bf98db2 Merge pull request 'master' (#859) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/859
2024-10-23 15:15:36 +00:00
dc8fc056f9 Merge pull request 'master' (#857) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/857
2024-10-23 14:56:37 +00:00
d316661574 Merge pull request 'master' (#855) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/855
2024-10-23 14:32:41 +00:00
a3b93d0e1a Merge pull request 'master' (#853) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/853
2024-10-23 13:58:17 +00:00
d23a86e9ea Merge pull request 'master' (#851) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/851
2024-10-23 13:38:31 +00:00
f427fa9ef2 Merge pull request 'master' (#848) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/848
2024-10-17 14:49:45 +00:00
87ab014111 Merge pull request 'master' (#846) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/846
2024-10-17 14:36:15 +00:00
f9d7b765d1 Merge pull request 'master' (#844) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/844
2024-10-17 14:25:57 +00:00
7601a7872c Merge pull request 'master' (#842) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/842
2024-10-14 06:49:01 +00:00
39af97815c Merge pull request 'master' (#840) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/840
2024-10-14 04:17:33 +00:00
4654f71f11 Merge pull request 'master' (#838) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/838
2024-10-13 16:28:06 +00:00
88f4a93a81 Merge pull request 'master' (#836) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/836
2024-10-13 14:48:38 +00:00
df2d53b9da Merge pull request 'master' (#833) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/833
2024-10-13 14:00:02 +00:00
1996ff0b3a Merge pull request 'master' (#831) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/831
2024-10-13 09:45:25 +00:00
8864e13030 Merge pull request 'master' (#829) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/829
2024-10-11 08:17:47 +00:00
4f67329f6b Merge pull request 'master' (#827) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/827
2024-10-11 07:26:52 +00:00
11e4b4ab3f Merge pull request 'master' (#825) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/825
2024-10-11 07:15:56 +00:00
f588695f3c Merge pull request 'master' (#823) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/823
2024-10-11 07:01:13 +00:00
2c2055a11a Merge pull request 'master' (#820) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/820
2024-10-11 06:06:42 +00:00
5949cdd843 Merge pull request 'master' (#818) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/818
2024-10-11 04:15:10 +00:00
9be3a714d1 Merge pull request 'master' (#816) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/816
2024-10-11 03:39:32 +00:00
9b50bcd0ee Merge pull request 'master' (#814) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/814
2024-10-09 13:20:01 +00:00
zhangkaihuai
f18dd60383 Merge pull request 'master' (#811) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/811
2024-09-23 02:59:58 +00:00
1440ba821a Merge pull request 'master' (#809) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/809
2024-09-22 13:42:04 +00:00
1a005f3b9e Merge pull request 'master' (#807) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/807
2024-09-22 13:40:04 +00:00
c8731e0612 Merge pull request 'master' (#805) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/805
2024-09-22 11:53:42 +00:00
20798e0ce6 Merge pull request 'master' (#803) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/803
2024-09-22 10:46:42 +00:00
9646a0110f Merge pull request 'master' (#801) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/801
2024-09-22 10:07:34 +00:00
216bc5034b Merge pull request 'master' (#799) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/799
2024-09-22 09:58:43 +00:00
18c5386fdd Merge pull request 'master' (#797) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/797
2024-09-22 04:22:34 +00:00
b28fbaf903 Merge pull request 'master' (#795) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/795
2024-09-21 16:42:15 +00:00
dc9f82f30e Merge pull request 'master' (#793) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/793
2024-09-21 16:31:33 +00:00
bba7a8e456 Merge pull request 'master' (#791) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/791
2024-09-21 16:28:44 +00:00
5d21271316 Merge pull request 'master' (#789) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/789
2024-09-21 15:52:09 +00:00
85a910b794 Merge pull request 'master' (#787) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/787
2024-09-21 14:38:43 +00:00
ecc7b0ebc3 Merge pull request 'master' (#785) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/785
2024-09-21 13:59:36 +00:00
f1a02e9188 Merge pull request 'master' (#783) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/783
2024-09-21 10:19:39 +00:00
fc8575dd0b Merge pull request 'master' (#781) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/781
2024-09-21 07:40:12 +00:00
52ca3791b3 Merge pull request 'master' (#779) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/779
2024-09-19 09:14:09 +00:00
222b9829b6 Merge pull request 'master' (#777) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/777
2024-09-18 16:52:16 +00:00
d644b0e3ca Merge pull request 'master' (#774) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/774
2024-09-18 14:26:18 +00:00
c67e5cf15e Merge pull request 'master' (#772) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/772
2024-09-12 15:16:11 +00:00
457547a34e Merge pull request 'master' (#770) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/770
2024-09-12 14:57:26 +00:00
e4959cecd7 Merge pull request 'master' (#768) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/768
2024-09-12 14:33:51 +00:00
ed3462be87 Merge pull request 'master' (#766) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/766
2024-09-12 13:56:13 +00:00
662042a228 Merge pull request 'master' (#764) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/764
2024-09-12 13:29:22 +00:00
7e7197b9b8 Merge pull request 'master' (#762) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/762
2024-09-11 18:34:56 +00:00
b7ebe7e3b9 Merge pull request 'master' (#760) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/760
2024-09-11 16:49:00 +00:00
e2e4f47c60 Merge pull request 'master' (#758) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/758
2024-09-10 05:17:25 +00:00
c43ea8be87 Merge pull request 'master' (#756) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/756
2024-09-08 12:51:36 +00:00
a0906ed5c7 Merge pull request 'master' (#754) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/754
2024-09-08 11:39:22 +00:00
c884333fc1 Merge pull request 'master' (#752) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/752
2024-09-07 10:23:16 +00:00
e4094dcd73 Merge pull request 'master' (#750) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/750
2024-09-07 07:10:35 +00:00
5640978025 Merge pull request 'master' (#748) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/748
2024-08-28 14:57:41 +00:00
6018cd6838 Merge pull request 'master' (#746) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/746
2024-08-28 09:31:13 +00:00
7e110dd656 Merge pull request 'master' (#744) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/744
2024-08-28 06:31:17 +00:00
195cc714ab Merge pull request 'master' (#742) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/742
2024-08-28 06:19:33 +00:00
37ee6af0e5 Merge pull request 'master' (#739) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/739
2024-08-27 02:41:06 +00:00
f22e14b1ba Merge pull request 'master' (#737) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/737
2024-08-26 15:10:31 +00:00
93d69861bf Merge pull request 'master' (#735) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/735
2024-08-26 14:53:02 +00:00
81c24023e9 Merge pull request 'master' (#733) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/733
2024-08-26 14:14:15 +00:00
83e780c17d Merge pull request 'master' (#731) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/731
2024-08-26 12:56:38 +00:00
298d298dc5 Merge pull request 'master' (#729) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/729
2024-08-26 12:18:57 +00:00
99c93dd582 Merge pull request 'master' (#727) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/727
2024-08-19 16:57:05 +00:00
f0e25b21d3 Merge pull request 'master' (#725) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/725
2024-08-18 03:13:08 +00:00
d229f957e5 Merge pull request 'master' (#723) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/723
2024-08-17 03:27:40 +00:00
4a52ab51df Merge pull request 'master' (#721) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/721
2024-08-17 02:41:10 +00:00
a6ee226073 Merge pull request 'master' (#719) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/719
2024-08-16 16:13:48 +00:00
db720f6d1b Merge pull request 'master' (#717) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/717
2024-08-13 15:07:24 +00:00
abda409817 Merge pull request 'master' (#715) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/715
2024-08-13 10:03:41 +00:00
1183be2987 Merge pull request 'master' (#713) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/713
2024-08-13 09:21:45 +00:00
7541b37117 Merge pull request 'master' (#711) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/711
2024-08-13 07:31:51 +00:00
f219635348 Merge pull request 'master' (#709) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/709
2024-08-13 05:20:02 +00:00
b2774892de Merge pull request 'master' (#707) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/707
2024-08-12 16:42:19 +00:00
ea51e6a300 Merge pull request 'master' (#705) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/705
2024-08-12 15:26:25 +00:00
c799c16663 Merge pull request 'master' (#703) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/703
2024-08-12 14:38:03 +00:00
becce5dfab Merge pull request 'master' (#701) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/701
2024-08-12 13:55:04 +00:00
873458595d Merge pull request 'master' (#699) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/699
2024-08-12 07:52:01 +00:00
8408697b57 Merge pull request 'master' (#697) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/697
2024-08-12 07:30:49 +00:00
04d62635f8 Merge pull request 'master' (#695) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/695
2024-08-11 16:05:10 +00:00
12d3fbcda1 Merge pull request 'master' (#693) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/693
2024-08-11 14:39:28 +00:00
bcb74bf29f Merge pull request 'master' (#691) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/691
2024-08-11 14:31:38 +00:00
443f598173 Merge pull request 'master' (#689) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/689
2024-08-11 10:38:21 +00:00
8b5a4aba6f Merge pull request 'master' (#687) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/687
2024-08-10 14:52:21 +00:00
474cf72333 Merge pull request 'master' (#685) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/685
2024-08-07 15:48:24 +00:00
8d87e2a7a0 Merge pull request 'master' (#683) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/683
2024-08-07 15:05:09 +00:00
a7367bef2f Merge pull request 'master' (#681) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/681
2024-08-07 14:51:34 +00:00
bd37eb66a9 Merge pull request 'master' (#678) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/678
2024-08-06 10:45:57 +00:00
2244e96484 Merge pull request 'master' (#676) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/676
2024-08-06 10:33:19 +00:00
c16d86354b Merge pull request 'master' (#674) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/674
2024-08-06 10:27:15 +00:00
88f12c7fce Merge pull request 'master' (#672) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/672
2024-08-06 07:27:28 +00:00
zhangkaihuai
522eb5025c 更新 .drone.yml 2024-08-06 07:05:02 +00:00
zhangkaihuai
6aeb846ca4 更新 .drone.yml 2024-08-06 06:58:23 +00:00
zhangkaihuai
f5d8a46829 更新 README.md 2024-08-06 06:31:07 +00:00
a7a146c055 Merge pull request 'master' (#670) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/670
2024-08-05 12:57:23 +00:00
96529cccc6 Merge pull request 'master' (#665) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/665
2024-08-04 17:02:22 +00:00
clay
21a111ae8f Merge pull request 'feat : 研发人员选择' (#663) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/663
2024-08-04 13:02:08 +00:00
5912f37ebb Merge pull request 'master' (#662) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/662
2024-08-03 13:33:37 +00:00
39b71a581a Merge pull request 'master' (#660) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/660
2024-08-03 13:32:57 +00:00
2f3d47e349 Merge pull request 'master' (#658) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/658
2024-08-03 11:30:35 +00:00
e06e2d553e Merge pull request 'master' (#656) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/656
2024-08-03 10:32:42 +00:00
6ac90f3841 Merge pull request 'master' (#654) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/654
2024-08-03 10:21:39 +00:00
f08f754002 Merge pull request 'master' (#652) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/652
2024-08-03 06:17:21 +00:00
b3c3156a08 Merge pull request 'master' (#650) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/650
2024-08-03 05:22:06 +00:00
df349f1480 Merge pull request 'master' (#648) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/648
2024-08-02 16:39:43 +00:00
067ff09c73 Merge pull request 'master' (#646) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/646
2024-08-02 11:42:37 +00:00
clay
45e0bf3c6c Merge pull request 'feat : 抄送和if判断' (#644) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/644
2024-08-02 11:37:35 +00:00
1e41101f9b Merge pull request 'master' (#643) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/643
2024-08-01 14:16:57 +00:00
db2f0d8daf Merge pull request 'master' (#641) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/641
2024-08-01 09:01:27 +00:00
96bcb30868 Merge pull request 'master' (#639) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/639
2024-07-26 17:22:27 +00:00
5a443bfab9 Merge pull request 'master' (#636) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/636
2024-07-25 16:12:20 +00:00
55782df345 Merge pull request 'master' (#634) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/634
2024-07-25 15:14:42 +00:00
925b4a2eb4 Merge pull request 'master' (#632) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/632
2024-07-25 14:48:39 +00:00
6f505ba281 Merge pull request 'master' (#630) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/630
2024-07-25 11:36:35 +00:00
1430b1eae7 Merge pull request 'master' (#626) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/626
2024-07-24 16:53:36 +00:00
95b2193393 Merge pull request 'master' (#624) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/624
2024-07-24 16:38:26 +00:00
7df05a46f2 Merge pull request 'master' (#622) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/622
2024-07-24 14:31:12 +00:00
d6f53a69da Merge pull request 'fix : 下载新依赖' (#619) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/619
2024-07-24 13:50:51 +00:00
b5933a9016 Merge pull request 'master' (#618) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/618
2024-07-24 13:43:19 +00:00
24f4a4a498 Merge pull request 'master' (#617) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/617
2024-07-24 13:41:16 +00:00
19db2667c2 Merge pull request 'master' (#615) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/615
2024-07-24 13:32:55 +00:00
f617b815a1 Merge pull request 'master' (#613) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/613
2024-07-24 13:22:31 +00:00
ac8cbdc991 Merge pull request 'master' (#609) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/609
2024-07-23 09:31:02 +00:00
84e5c2dd7e Merge pull request 'master' (#607) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/607
2024-07-23 05:28:54 +00:00
clay
9a66c333c7 Merge pull request 'master' (#605) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/605
2024-07-19 06:23:35 +00:00
3580fb41f3 Merge pull request 'feat : 部门副职用户选择框无法弹出' (#604) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/604
2024-07-19 02:11:13 +00:00
dc822bba07 Merge pull request 'master' (#603) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/603
2024-07-18 17:54:35 +00:00
1db5d4b11f Merge pull request 'master' (#601) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/601
2024-07-18 17:06:06 +00:00
1ca25d8ec4 Merge pull request 'master' (#599) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/599
2024-07-18 14:56:29 +00:00
a9c7977347 Merge pull request 'master' (#597) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/597
2024-07-18 14:07:11 +00:00
3c471b1124 Merge pull request 'master' (#595) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/595
2024-07-18 09:49:25 +00:00
2b94151780 Merge pull request 'master' (#593) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/593
2024-07-18 08:57:15 +00:00
9088a792d1 Merge pull request 'fix : 附件上传修复' (#591) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/591
2024-07-18 08:15:27 +00:00
ff09ed8c8a Merge pull request 'fix : 附件上传修复' (#590) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/590
2024-07-18 07:22:17 +00:00
fdb76c31a8 Merge pull request 'master' (#589) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/589
2024-07-18 06:53:26 +00:00
484efa5854 Merge pull request 'master' (#588) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/588
2024-07-18 04:27:58 +00:00
07b3457409 Merge pull request 'master' (#585) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/585
2024-07-17 15:11:51 +00:00
1150fdac86 Merge pull request 'master' (#583) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/583
2024-07-17 14:48:03 +00:00
930684ac01 Merge pull request 'master' (#581) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/581
2024-07-17 14:11:32 +00:00
760d452311 Merge pull request 'master' (#579) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/579
2024-07-17 09:29:50 +00:00
6f0800162b Merge pull request 'master' (#577) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/577
2024-07-17 09:21:41 +00:00
8f3432f9a0 Merge pull request 'master' (#575) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/575
2024-07-16 13:57:08 +00:00
ae1c614ee8 Merge pull request 'master' (#574) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/574
2024-07-16 13:11:29 +00:00
7ceb63b02f Merge pull request 'master' (#572) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/572
2024-07-16 13:07:31 +00:00
a0fa5d43f1 Merge pull request 'master' (#570) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/570
2024-07-16 12:36:35 +00:00
008b3c942a Merge pull request 'master' (#568) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/568
2024-07-15 14:24:24 +00:00
3cc9f40baf Merge pull request 'master' (#567) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/567
2024-07-15 14:07:17 +00:00
ca030e42d4 Merge pull request 'master' (#565) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/565
2024-07-15 13:47:14 +00:00
7b6ca29a93 Merge pull request 'master' (#563) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/563
2024-07-15 12:45:49 +00:00
8538f7d43f Merge pull request 'master' (#561) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/561
2024-07-15 11:47:14 +00:00
9f8e07c18a Merge pull request 'master' (#559) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/559
2024-07-15 11:13:19 +00:00
a2212ac8e6 Merge pull request 'master' (#557) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/557
2024-07-14 16:03:48 +00:00
d6c7538c36 Merge pull request 'master' (#554) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/554
2024-07-14 14:51:23 +00:00
150ac2afcb Merge pull request 'master' (#552) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/552
2024-07-14 14:37:17 +00:00
609df9855a Merge pull request 'master' (#545) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/545
2024-07-13 06:19:19 +00:00
da2f27bc72 Merge pull request 'master' (#543) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/543
2024-07-13 05:24:06 +00:00
eeb821de24 Merge pull request 'master' (#541) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/541
2024-07-13 05:01:06 +00:00
a754751832 Merge pull request 'master' (#539) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/539
2024-07-12 06:06:36 +00:00
5235f23365 Merge pull request 'master' (#537) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/537
2024-07-12 04:11:04 +00:00
clay
7f684fa085 Merge pull request 'feat : 调整简答布局' (#535) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/535
2024-07-12 03:53:06 +00:00
clay
d674a6ea12 Merge pull request 'feat : 流程渲染与有任务跳转到首页' (#534) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/534
2024-07-12 02:07:47 +00:00
b315b667e9 Merge pull request 'master' (#533) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/533
2024-07-11 16:00:00 +00:00
798c42beb9 Merge pull request 'master' (#531) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/531
2024-07-11 15:49:43 +00:00
2613884a89 Merge pull request 'master' (#529) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/529
2024-07-11 15:32:53 +00:00
9a9702227c Merge pull request 'master' (#527) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/527
2024-07-11 15:01:06 +00:00
74ad7e9eb9 Merge pull request 'master' (#525) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/525
2024-07-11 14:48:29 +00:00
cdb984a439 Merge pull request 'master' (#523) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/523
2024-07-11 14:29:08 +00:00
ab33f09538 Merge pull request 'master' (#521) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/521
2024-07-11 13:09:38 +00:00
152da3c0e4 Merge pull request 'master' (#519) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/519
2024-07-11 08:40:46 +00:00
clay
bd165769de Merge pull request 'master' (#517) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/517
2024-07-10 15:20:26 +00:00
wenhua
c266e27c51 Merge pull request 'fix: bug修复' (#515) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/515
2024-07-09 15:32:00 +00:00
1bfa0095ae Merge pull request 'master' (#514) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/514
2024-07-09 11:35:37 +00:00
33c4e4baa7 Merge pull request 'master' (#512) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/512
2024-07-07 15:36:51 +00:00
eb5df00b45 Merge pull request 'master' (#510) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/510
2024-07-06 20:13:40 +00:00
61be47b3d4 Merge pull request 'master' (#508) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/508
2024-07-06 19:31:43 +00:00
e5356787be Merge pull request 'master' (#506) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/506
2024-07-06 18:44:08 +00:00
f842bf375b Merge pull request 'master' (#504) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/504
2024-07-06 18:23:46 +00:00
9ef88a2d17 Merge pull request 'master' (#502) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/502
2024-07-06 16:47:04 +00:00
9688322f69 Merge pull request 'master' (#500) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/500
2024-07-06 16:06:07 +00:00
19a61159e4 Merge pull request 'master' (#498) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/498
2024-07-06 15:29:56 +00:00
beb727760b Merge pull request 'master' (#496) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/496
2024-07-06 15:11:08 +00:00
aa2631b7de Merge pull request 'master' (#493) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/493
2024-07-06 14:39:17 +00:00
cfe89816f4 Merge pull request 'master' (#490) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/490
2024-07-06 13:40:00 +00:00
80d8d3c687 Merge pull request 'master' (#488) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/488
2024-07-06 09:37:03 +00:00
c75bd8a197 Merge pull request 'master' (#486) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/486
2024-07-06 07:46:48 +00:00
12eeeced0e Merge pull request 'master' (#484) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/484
2024-07-05 18:21:54 +00:00
wenhua
de69dc9b47 Merge pull request 'master' (#482) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/482
2024-07-04 09:20:24 +00:00
2edef9fcf0 Merge pull request 'master' (#481) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/481
2024-07-04 06:14:10 +00:00
dfcf635f05 Merge pull request 'master' (#479) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/479
2024-07-04 05:58:55 +00:00
9beb9ed9de Merge pull request 'master' (#477) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/477
2024-07-04 05:08:47 +00:00
89dd56959a Merge pull request 'master' (#475) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/475
2024-07-04 04:31:02 +00:00
d2f7f6080a Merge pull request 'master' (#473) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/473
2024-07-04 03:31:16 +00:00
wenhua
0556e5eb79 Merge pull request 'master' (#471) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/471
2024-07-04 02:05:44 +00:00
6fc5a3f6f3 Merge pull request 'master' (#470) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/470
2024-07-03 14:58:32 +00:00
706bf36aa8 Merge pull request 'master' (#468) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/468
2024-07-03 13:53:07 +00:00
634931a624 Merge pull request 'master' (#466) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/466
2024-07-03 13:46:14 +00:00
afc079b670 Merge pull request 'master' (#463) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/463
2024-07-03 11:40:24 +00:00
c1a1b30c99 Merge pull request 'master' (#461) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/461
2024-07-03 06:10:35 +00:00
d17bca9994 Merge pull request 'master' (#459) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/459
2024-07-03 05:30:30 +00:00
0fbaa25cd6 Merge pull request 'master' (#457) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/457
2024-07-02 17:46:35 +00:00
9a1b04966d Merge pull request 'master' (#456) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/456
2024-07-02 16:38:48 +00:00
759f93078b Merge pull request 'master' (#454) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/454
2024-07-01 12:53:23 +00:00
1e97239d18 Merge pull request 'master' (#452) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/452
2024-07-01 11:05:15 +00:00
49a3bbd701 Merge pull request 'master' (#450) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/450
2024-06-30 14:50:10 +00:00
68dc2ff018 Merge pull request 'master' (#448) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/448
2024-06-30 13:29:31 +00:00
6f843f54a6 Merge pull request 'master' (#446) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/446
2024-06-30 13:09:47 +00:00
19791498d4 Merge pull request 'master' (#444) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/444
2024-06-30 12:50:56 +00:00
4242b22c1a Merge pull request 'master' (#442) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/442
2024-06-30 12:10:14 +00:00
6e3b1e8b54 Merge pull request 'master' (#440) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/440
2024-06-30 12:04:14 +00:00
43703f3366 Merge pull request 'master' (#438) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/438
2024-06-30 09:21:22 +00:00
bb052b85ac Merge pull request 'master' (#436) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/436
2024-06-30 08:43:52 +00:00
4049becfb8 Merge pull request 'master' (#434) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/434
2024-06-29 17:23:10 +00:00
2a8dabd648 Merge pull request 'master' (#432) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/432
2024-06-29 16:11:11 +00:00
a6bd56c29c Merge pull request 'master' (#429) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/429
2024-06-29 14:47:08 +00:00
662e11c154 Merge pull request 'master' (#423) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/423
2024-06-29 09:14:09 +00:00
fab991400e Merge pull request 'master' (#421) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/421
2024-06-29 07:40:19 +00:00
b1b389ce8f Merge pull request 'master' (#419) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/419
2024-06-29 05:44:49 +00:00
c977249713 Merge pull request 'master' (#417) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/417
2024-06-29 03:22:35 +00:00
9a306be965 Merge pull request 'master' (#415) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/415
2024-06-28 19:37:22 +00:00
d01f37f5b9 Merge pull request 'master' (#412) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/412
2024-06-28 16:10:06 +00:00
07069af7a0 Merge pull request 'master' (#410) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/410
2024-06-28 16:08:09 +00:00
wenhua
4a598f52d4 Merge pull request 'master' (#408) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/408
2024-06-28 15:55:12 +00:00
c67a66c119 Merge pull request 'master' (#405) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/405
2024-06-28 08:39:17 +00:00
clay
c99e553515 Merge pull request 'master' (#403) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/403
2024-06-28 08:16:11 +00:00
clay
380c476cf3 Merge pull request 'master' (#402) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/402
2024-06-27 14:54:16 +00:00
b433efc81a Merge pull request 'master' (#401) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/401
2024-06-26 15:04:55 +00:00
ab4b9c1bf3 Merge pull request 'master' (#399) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/399
2024-06-26 14:53:15 +00:00
169423d5f9 Merge pull request 'master' (#397) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/397
2024-06-25 03:56:29 +00:00
ce981882c8 Merge pull request 'master' (#395) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/395
2024-06-24 05:39:59 +00:00
dd13f8d175 Merge pull request 'master' (#393) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/393
2024-06-24 05:26:03 +00:00
47f13d4b1e Merge pull request 'master' (#391) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/391
2024-06-24 03:09:53 +00:00
433bb7e1a4 Merge pull request 'master' (#390) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/390
2024-06-23 04:08:40 +00:00
08f86517da Merge pull request 'master' (#388) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/388
2024-06-22 16:59:19 +00:00
794826f0c7 Merge pull request 'master' (#386) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/386
2024-06-22 16:39:27 +00:00
096fa6dc51 Merge pull request 'fix : 分摊详情小计与导出' (#383) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/383
2024-06-22 10:49:59 +00:00
accf65ef10 Merge pull request 'master' (#381) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/381
2024-06-22 10:46:16 +00:00
eaa8b834bf Merge pull request 'master' (#380) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/380
2024-06-21 10:40:13 +00:00
b32ced514b Merge pull request 'master' (#378) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/378
2024-06-21 10:36:16 +00:00
78cf7e6857 Merge pull request 'master' (#376) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/376
2024-06-21 07:31:47 +00:00
8128766e24 Merge pull request 'master' (#374) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/374
2024-06-21 05:03:17 +00:00
90a08f37f6 Merge pull request 'master' (#372) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/372
2024-06-21 04:42:08 +00:00
ad03a1ed2b Merge pull request 'master' (#370) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/370
2024-06-21 04:33:41 +00:00
41b1bed81d Merge pull request 'master' (#366) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/366
2024-06-21 04:24:08 +00:00
clay
bc882f375f Merge pull request 'master' (#364) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/364
2024-06-19 19:25:34 +00:00
5d23a903fc Merge pull request 'master' (#362) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/362
2024-06-19 18:28:50 +00:00
7fb30322b3 Merge pull request 'master' (#361) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/361
2024-06-19 07:12:19 +00:00
a795fa5786 Merge pull request 'master' (#354) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/354
2024-06-18 12:43:42 +00:00
wenhua
6fcb68d929 Merge pull request 'fix: 多标签页bug' (#351) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/351
2024-06-18 08:10:35 +00:00
9cf7396fb8 Merge pull request 'master' (#350) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/350
2024-06-17 03:48:08 +00:00
891cebec90 Merge pull request 'master' (#348) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/348
2024-06-17 03:22:45 +00:00
2206e2aa21 Merge pull request 'master' (#345) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/345
2024-06-16 12:35:37 +00:00
ba4e927ff5 Merge pull request 'master' (#343) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/343
2024-06-16 11:50:40 +00:00
fa366d18e5 Merge pull request 'master' (#340) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/340
2024-06-16 10:07:34 +00:00
31ff2a4502 Merge pull request 'master' (#338) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/338
2024-06-14 16:47:38 +00:00
4d312a8892 Merge pull request 'master' (#336) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/336
2024-06-14 15:27:00 +00:00
fc09c1db05 Merge pull request 'master' (#334) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/334
2024-06-14 15:18:20 +00:00
62983eea10 Merge pull request 'master' (#332) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/332
2024-06-14 06:02:16 +00:00
a7f95e98aa Merge pull request 'master' (#330) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/330
2024-06-14 05:05:07 +00:00
df4312e61d Merge pull request 'master' (#328) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/328
2024-06-11 13:14:34 +00:00
65af3e7bfb Merge pull request 'master' (#326) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/326
2024-06-11 13:05:54 +00:00
fe5c28dbf0 Merge pull request 'master' (#324) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/324
2024-06-11 12:59:21 +00:00
5b78df27f5 Merge pull request 'master' (#322) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/322
2024-06-11 12:56:47 +00:00
f9cf478694 Merge pull request 'master' (#319) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/319
2024-06-11 11:17:20 +00:00
7b67e71bd6 Merge pull request 'master' (#317) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/317
2024-06-11 07:42:26 +00:00
2c5c694445 Merge pull request 'master' (#315) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/315
2024-06-11 04:19:35 +00:00
4649ad3abd Merge pull request 'master' (#311) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/311
2024-06-10 07:26:33 +00:00
ac00d68350 Merge pull request 'master' (#294) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/294
2024-06-06 14:21:42 +00:00
40c09c58d4 Merge pull request 'master' (#292) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/292
2024-06-06 05:38:23 +00:00
a30638d693 Merge pull request 'master' (#290) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/290
2024-06-05 18:02:01 +00:00
0f83224f28 Merge pull request 'master' (#288) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/288
2024-06-05 14:57:23 +00:00
11a1f044f5 Merge pull request 'master' (#286) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/286
2024-06-05 14:10:57 +00:00
7df8fbd46a Merge pull request 'master' (#283) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/283
2024-06-04 10:43:33 +00:00
d57af223cc Merge pull request 'master' (#281) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/281
2024-06-04 10:30:12 +00:00
a1925121d7 Merge pull request 'master' (#277) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/277
2024-06-02 15:17:30 +00:00
wenhua
4f4f1842a4 Merge pull request 'master' (#267) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/267
2024-06-01 15:17:36 +00:00
1bc27897d8 Merge pull request 'master' (#266) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/266
2024-06-01 14:54:47 +00:00
e5d03a07a3 Merge pull request 'master' (#264) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/264
2024-06-01 14:51:57 +00:00
clay
d6909fb449 Merge pull request 'fix : 字典为空死循环bug' (#256) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/256
2024-05-31 03:24:03 +00:00
73978ca602 Merge pull request 'master' (#255) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/255
2024-05-30 14:53:53 +00:00
ac4cdb1189 Merge pull request 'master' (#253) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/253
2024-05-30 14:51:39 +00:00
clay
b3e85e186e Merge pull request 'master' (#251) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/251
2024-05-30 14:34:28 +00:00
f0a09b2d0a Merge pull request 'master' (#250) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/250
2024-05-30 12:07:30 +00:00
501790677e Merge pull request 'master' (#248) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/248
2024-05-30 09:49:17 +00:00
wenhua
700c08616f Merge pull request 'fix: up detail, router, display for dont have role' (#236) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/236
2024-05-27 14:34:31 +00:00
28207004c7 Merge pull request 'master' (#235) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/235
2024-05-27 13:41:13 +00:00
8c33aaa8a7 Merge pull request 'master' (#229) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/229
2024-05-23 16:19:32 +00:00
9e5d07d7e5 Merge pull request 'master' (#220) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/220
2024-05-20 16:22:59 +00:00
45dc828332 Merge pull request 'master' (#190) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/190
2024-05-17 12:55:50 +00:00
wenhua
26f5c2c9c5 Merge pull request 'fix: 调整权限按钮判断' (#188) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/188
2024-05-16 02:05:20 +00:00
wenhua
8ac192f8ba Merge pull request 'fix: 修改table显示bug' (#187) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/187
2024-05-15 08:36:42 +00:00
wenhua
496109cc1a Merge pull request 'master' (#186) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/186
2024-05-15 08:01:16 +00:00
e08eccb46d Merge pull request 'master' (#184) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/184
2024-05-15 05:29:17 +00:00
df9debe453 Merge pull request 'master' (#182) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/182
2024-05-15 05:25:29 +00:00
43433b3b02 Merge pull request 'master' (#180) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/180
2024-05-15 01:58:49 +00:00
1cec0b123c Merge pull request 'master' (#176) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/176
2024-05-14 13:32:40 +00:00
324862a61f Merge pull request 'master' (#173) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/173
2024-05-14 12:57:42 +00:00
aa76f82a74 Merge pull request 'master' (#168) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/168
2024-05-14 09:14:42 +00:00
24fc98cf7b Merge pull request 'master' (#166) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/166
2024-05-13 16:11:51 +00:00
e7a2753c06 Merge pull request 'master' (#164) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/164
2024-05-13 16:03:58 +00:00
wenhua
a7ae9df845 Merge pull request 'master' (#161) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/161
2024-05-13 14:36:55 +00:00
clay
f04459aba1 Merge pull request 'master' (#156) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/156
2024-05-13 11:28:48 +00:00
4000b0b8e9 Merge pull request 'master' (#155) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/155
2024-05-12 16:29:09 +00:00
clay
2d23266e50 Merge pull request 'master' (#151) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/151
2024-05-12 13:57:24 +00:00
99d90acebc Merge pull request 'master' (#121) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/121
2024-05-10 09:31:43 +00:00
6b2a94453c Merge pull request 'master' (#119) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/119
2024-05-10 04:39:58 +00:00
bd679710e2 Merge pull request 'master' (#117) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/117
2024-05-09 10:27:32 +00:00
86610c07a8 Merge pull request 'master' (#112) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/112
2024-05-09 09:18:40 +00:00
clay
b336efa79c Merge pull request 'feat : 测试sso单点登录之后的重定向路径4' (#108) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/108
2024-04-29 03:50:07 +00:00
clay
d010907d2b Merge pull request 'feat : 测试sso单点登录之后的重定向路径3' (#107) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/107
2024-04-29 03:28:30 +00:00
clay
894b656a82 Merge pull request 'feat : 测试sso单点登录之后的重定向路径' (#106) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/106
2024-04-29 02:31:44 +00:00
clay
4b9ecb9360 Merge pull request 'feat : 测试sso单点登录之后的重定向路径' (#105) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/105
2024-04-29 02:22:08 +00:00
clay
228fef7a9b Merge pull request 'feat : 测试sso单点登录之后的重定向路径' (#104) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/104
2024-04-29 02:11:08 +00:00
clay
6a6a440428 Merge pull request 'master' (#103) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/103
2024-04-29 02:04:25 +00:00
wenhua
ee9462769f Merge pull request 'master' (#101) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/101
2024-04-01 07:31:41 +00:00
wenhua
cf2f071f6d Merge pull request 'master' (#99) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/99
2024-04-01 07:09:01 +00:00
wenhua
18113da288 Merge pull request 'master' (#97) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/97
2024-04-01 06:36:54 +00:00
wenhua
743f55c11d Merge pull request 'master' (#95) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/95
2024-04-01 05:49:16 +00:00
wenhua
4009f05185 Merge pull request 'master' (#93) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/93
2024-04-01 05:42:12 +00:00
wenhua
182572bfd1 Merge pull request 'master' (#91) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/91
2024-04-01 03:28:44 +00:00
wenhua
5edd4ee722 Merge pull request 'master' (#86) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/86
2024-04-01 03:00:53 +00:00
wenhua
497f1ad64e Merge pull request 'master' (#84) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/84
2024-04-01 02:21:19 +00:00
wenhua
ff632ef4cf Merge pull request 'master' (#82) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/82
2024-04-01 02:14:40 +00:00
wenhua
10d094a5b7 Merge pull request 'master' (#79) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/79
2024-04-01 01:53:35 +00:00
wenhua
f395fa32c7 Merge pull request 'master' (#77) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/77
2024-03-30 16:36:50 +00:00
wenhua
57153d3bc7 Merge pull request 'master' (#75) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/75
2024-03-30 16:24:24 +00:00
wenhua
5b3a6b6bf4 Merge pull request 'master' (#73) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/73
2024-03-30 16:13:28 +00:00
6fbf040107 Merge pull request 'master' (#71) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/71
2024-03-30 14:59:49 +00:00
6b81e35db0 Merge pull request 'master' (#69) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/69
2024-03-29 14:59:14 +00:00
clay
97578316b8 Merge pull request 'master' (#63) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/63
2024-03-29 10:10:54 +00:00
wenhua
4c07528102 Merge pull request 'master' (#62) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/62
2024-03-29 09:14:52 +00:00
wenhua
065ef047a7 Merge pull request 'master' (#59) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/59
2024-03-29 08:50:13 +00:00
wenhua
b5c5b9ec99 Merge pull request 'master' (#57) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/57
2024-03-29 07:47:14 +00:00
wenhua
76824a5c57 Merge pull request 'master' (#53) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/53
2024-03-29 07:19:59 +00:00
wenhua
75b0625dc4 Merge pull request 'master' (#51) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/51
2024-03-29 06:32:25 +00:00
wenhua
4585a4e49d Merge pull request 'master' (#49) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/49
2024-03-29 06:16:39 +00:00
wenhua
eb5b27fdf8 Merge pull request 'master' (#46) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/46
2024-03-29 06:07:55 +00:00
wenhua
e8ab5fc050 Merge pull request 'master' (#44) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/44
2024-03-28 08:43:11 +00:00
wenhua
9df7674abc Merge pull request 'master' (#42) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/42
2024-03-28 01:34:34 +00:00
wenhua
21517a41a3 Merge pull request 'master' (#40) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/40
2024-03-27 06:22:52 +00:00
wenhua
4449fcce60 Merge pull request 'master' (#38) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/38
2024-03-26 08:32:54 +00:00
27c7b68595 Merge pull request 'master' (#36) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/36
2024-03-26 07:03:41 +00:00
306f92f4e5 Merge pull request 'master' (#34) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/34
2024-03-25 14:41:50 +00:00
51fe4e113b Merge pull request 'master' (#32) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/32
2024-03-25 14:39:51 +00:00
3bb0b9108c Merge pull request 'master' (#30) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/30
2024-03-25 12:42:35 +00:00
b8aff8512d Merge pull request 'master' (#28) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/28
2024-03-25 10:01:07 +00:00
6ec24f7431 Merge pull request 'master' (#26) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/26
2024-03-25 09:09:50 +00:00
wenhua
d4373bc44f Merge pull request 'master' (#24) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/24
2024-03-25 02:57:52 +00:00
wenhua
d0c20d68eb Merge pull request 'master' (#22) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/22
2024-03-24 15:05:37 +00:00
wenhua
ad808d6fa6 Merge pull request 'master' (#20) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/20
2024-03-20 06:11:28 +00:00
wenhua
ac92da76aa Merge pull request 'master' (#18) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/18
2024-03-19 09:15:28 +00:00
20c913f61f Merge pull request 'master' (#16) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/16
2024-03-18 07:43:36 +00:00
f25e74869b Merge pull request 'master' (#14) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/14
2024-03-18 07:25:56 +00:00
clay
09028a2041 Merge pull request 'feat : 添加表单设置页面' (#12) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/12
2024-03-12 03:43:38 +00:00
0a9d2fbfc1 Merge pull request 'master' (#10) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/10
2024-03-08 02:28:16 +00:00
901cf7fbc4 Merge pull request 'master' (#8) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/8
2024-03-05 14:14:37 +00:00
bd9d0a43c2 Merge pull request 'master' (#6) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/6
2024-03-05 13:55:11 +00:00
9eb481be57 Merge pull request 'master' (#4) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/4
2024-03-05 12:49:36 +00:00
f568676a40 Merge pull request 'master' (#2) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/2
2024-03-05 01:16:13 +00:00
65 changed files with 796 additions and 4590 deletions

View File

@@ -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
View 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-----

View File

@@ -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
View 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-----

View File

@@ -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()
}
}
);
};

View File

@@ -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({

View File

@@ -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()
}
}
);
};

View File

@@ -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;

View File

@@ -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 {

View File

@@ -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,207 +279,23 @@ const schema = computed(() => {
// } // }
// }) // })
} else if (props.type == 'execute') { } else if (props.type == 'execute') {
arr = [ arr = [{
label: '部门分管领导',
{ prop: 'optionalChargeLeadership',
label: '实际专利(项)', colProps: {
prop: 'actualNewPatent', span: 24
colProps: {
span: 6
},
labelWidth: 'left',
component: () => (
<div>
{
props.formData.actualNewPatent ? props.formData.actualNewPatent :props.formData.actualNewPatent==0?0: <span>{'--'}</span>
}
</div>
)
}, },
{ labelWidth: 'left',
label: '实际软件著作权(项)', component: () => (
prop: 'actualSoftwareCopyright', <div>
colProps: { {
span: 6 props.formData.optionalChargeLeadership?.length > 0 ? props.formData.optionalChargeLeadership.map(item => {
}, return <span>{item.name} </span>
labelWidth: 'left', }) : <span>{'--'}</span>
component: () => ( }
<div> </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: '部门分管领导',
prop: 'optionalChargeLeadership',
colProps: {
span: 24
},
labelWidth: 'left',
component: () => (
<div>
{
props.formData.optionalChargeLeadership?.length > 0 ? props.formData.optionalChargeLeadership.map(item => {
return <span>{item.name} </span>
}) : <span>{'--'}</span>
}
</div>
)
}
]
if (props.preProcessShow == 'EDIT') { if (props.preProcessShow == 'EDIT') {
preProcess = { preProcess = {
@@ -529,22 +334,22 @@ const schema = computed(() => {
// }) // })
} else if (props.type == 'archivist') { } else if (props.type == 'archivist') {
arr = [ arr = [
// { // {
// label: '项目归档附件', // label: '项目归档附件',
// prop: 'singleFile', // prop: 'singleFile',
// colProps: { // colProps: {
// span: 24 // span: 24
// }, // },
// labelWidth: 'left', // labelWidth: 'left',
// component: () => { // component: () => {
// let singleFileArray = [props.formData.singleFile] // let singleFileArray = [props.formData.singleFile]
// return props.formData.singleFile ? <fvTable style="width: 100%;max-height: 80px;" height="80" // return props.formData.singleFile ? <fvTable style="width: 100%;max-height: 80px;" height="80"
// tableConfig={editSingleTableConfig} // tableConfig={editSingleTableConfig}
// data={singleFileArray} isSettingCol={false} pagination={false}> // data={singleFileArray} isSettingCol={false} pagination={false}>
// </fvTable> // </fvTable>
// : <span>--</span> // : <span>--</span>
// } // }
// }, // },
] ]
} else if (props.type == 'phase') { } else if (props.type == 'phase') {
arr = [ arr = [
@@ -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 = {

View File

@@ -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',

View File

@@ -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,

View File

@@ -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'){ preProcessArray.push(preProcessObj)
localFormData.value.preProcess.push(preProcessObj)
}else{
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,182 +489,109 @@ const getFileParam = (item) => {
tag: item.tag tag: item.tag
} }
} }
const handleSubmit = async (instance) => { const handleSubmit = async () => {
if (props.step == 50) { let files = []
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 = {
deploymentId: deploymentId.value,
requirementId: route.query.id,
fileList: files,
// singleFile: attachment.value.singleFile,
projectId: projectId.value,
preProcess: JSON.stringify(localFormData.value.preProcess)
}
if (sessionParams.value.preProcess && !localFormData.value.preProcess) {
params.preProcess = JSON.stringify(sessionParams.value.preProcess)
}
// console.log(params.preProcess)
let res
if (props.step === '20') {
if (projectChargePersonUserList.value && projectChargePersonUserList.value.length === 0) {
ElNotification({
title: '提示',
message: '请选择项目负责人!',
type: 'error'
})
return;
}
if (projectPersonUserList.value && projectPersonUserList.value.length === 0) {
ElNotification({
title: '提示',
message: '请选择项目成员!',
type: 'error'
})
return;
}
params.projectChargePerson = parseInt(projectChargePersonUserList.value[0].id)
params.projectPersonIds = projectPersonIds
params.optionalChargeLeadership = optionalChargeLeadershipList.value
if (props.mode === 'resubmit') { if (props.mode === 'resubmit') {
attachment.value.allFileList.forEach(item => { res = await resubmitApply(params)
files.push(getFileParam(item))
})
} else { } else {
otherFileList.value.forEach(item => { res = await projectApply(params)
files.push(getFileParam(item))
})
} }
// console.info("🚀 ~method:handleSubmit -----", files,attachment.value.isHaveOneFile) } else if (props.step === '40') {
// if (!attachment.value.isHaveOneFile) { params.optionalChargeLeadership = optionalChargeLeadershipList.value
// attachment.value.validate() if (props.mode === 'resubmit') {
// ElNotification({ res = await resubmitCheck(params)
// title: '提示', } else {
// message: '请上传附件', res = await projectCheck(params)
// type: 'error'
// })
// return;
// } else {
// attachment.value.clearValidate()
// }
let projectPersonIds = []
for (const item of projectPersonUserList.value) {
projectPersonIds.push(parseInt(item.id))
} }
let params = { } else if (props.step === '50') {
...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') { if (props.mode === 'resubmit') {
res = await resubmitConclusion(params) res = await resubmitConclusion(params)
} else { } else {
res = await projectConclusion(params) res = await projectConclusion(params)
} }
ElNotification({ }
title: '提示', ElNotification({
message: res.msg, title: '提示',
type: res.code === 1000 ? 'success' : 'error' message: res.msg,
}) type: res.code === 1000 ? 'success' : 'error'
if (res.code === 1000) { })
tagsViewStore.delVisitedViews(router.currentRoute.value.path) if (res.code === 1000) {
tagsViewStore.delVisitedViews(router.currentRoute.value.path)
if (props.step === '20') {
await router.push({
name: 'Initiation'
})
} else if (props.step === '40') {
await router.push({
name: 'Implementation'
})
} else if (props.step === '50') {
await router.push({ await router.push({
name: 'Filing' name: 'Filing'
}) })
} }
} else {
if (!instance) return
instance.validate(async (valid) => {
if (!valid) {
ElNotification({
title: '提示',
message: '请完善数据,再提交!',
type: 'error'
})
return;
}
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 = {
// singleFile: attachment.value.singleFile,
...localFormData.value,
projectId: route.query.projectId,
deploymentId: deploymentId.value,
requirementId: route.query.id,
fileList: files,
actualEconomicEstimate: parseFloat(localFormData.value.actualEconomicEstimate)||null,
specialFundAmount: parseFloat(localFormData.value.specialFundAmount)||null,
preProcess: JSON.stringify(localFormData.value.preProcess)
}
if (sessionParams.value.preProcess && !localFormData.value.preProcess) {
params.preProcess = JSON.stringify(sessionParams.value.preProcess)
}
console.log('params', params)
let res
if (props.step === '20') {
if (projectChargePersonUserList.value && projectChargePersonUserList.value.length === 0) {
ElNotification({
title: '提示',
message: '请选择项目负责人!',
type: 'error'
})
return;
}
if (projectPersonUserList.value && projectPersonUserList.value.length === 0) {
ElNotification({
title: '提示',
message: '请选择项目成员!',
type: 'error'
})
return;
}
if (optionalChargeLeadershipList.value && optionalChargeLeadershipList.value.length === 0&&isKcjUser()) {
ElNotification({
title: '提示',
message: '请选择部门分管领导!',
type: 'error'
})
return;
}
params.projectChargePerson = parseInt(projectChargePersonUserList.value[0].id)
params.projectPersonIds = projectPersonIds
params.optionalChargeLeadership = optionalChargeLeadershipList.value
if (props.mode === 'resubmit') {
res = await resubmitApply(params)
} else {
res = await projectApply(params)
}
} else if (props.step === '40') {
params.optionalChargeLeadership = optionalChargeLeadershipList.value
if (props.mode === 'resubmit') {
res = await resubmitCheck(params)
} else {
res = await projectCheck(params)
}
}
ElNotification({
title: '提示',
message: res.msg,
type: res.code === 1000 ? 'success' : 'error'
})
if (res.code === 1000) {
tagsViewStore.delVisitedViews(router.currentRoute.value.path)
if (props.step === '20') {
await router.push({
name: 'Initiation'
})
} else if (props.step === '40') {
await router.push({
name: 'Implementation'
})
}
}
})
} }
} }
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

View File

@@ -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> <fvTable style="width: 100%;min-height:311px;max-height: 311px" v-if="showAttachmentTable" height="311"
</div> :tableConfig="executeTableConfig" class="execute-apply-table"
</template> :data="otherAttachmentList" :isSettingCol="false" :pagination="false">
</el-tab-pane> <template #empty>
</el-tabs> <el-empty :image-size="90" description="暂无数据" style="padding: 0"/>
</template>
</fvTable>
</el-row> </el-row>
<div style="margin-top:10px;margin-bottom: 8px;margin-left: 15px;display: flex"> <file-preview ref="filePreviewRef" :fullscreen="false" v-if="filePreviewShow" :fileName="filePreviewParam.fileName" :fileUrl="filePreviewParam.fileUrl"
<!-- <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"
:scrollbar-always-on="true"
:tableConfig="executeTableConfig" class="execute-apply-table"
:data="otherAttachmentList" :isSettingCol="false" :pagination="false">
<template #empty>
<el-empty :image-size="90" description="暂无数据" style="padding: 0"/>
</template>
</fvTable>
<div class="oper-page-btn" style="margin-right: 90px" v-if="uploadState">
<el-button color="#DED0B2" @click="handleSubmit()">提交</el-button>
</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>

View File

@@ -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"/>-->
<!-- &lt;!&ndash; <el-form-item>&ndash;&gt;--> <!-- &lt;!&ndash; <el-form-item>&ndash;&gt;-->
<!-- &lt;!&ndash; {{localFormData.singleFile}}&ndash;&gt;--> <!-- &lt;!&ndash; {{localFormData.singleFile}}&ndash;&gt;-->
<!-- &lt;!&ndash; <el-button type="primary" link @click="handleDownload(localFormData.singleFile)" style="font-size: 16px">&ndash;&gt;--> <!-- &lt;!&ndash; <el-button type="primary" link @click="handleDownload(localFormData.singleFile)" style="font-size: 16px">&ndash;&gt;-->
<!-- &lt;!&ndash; {{ localFormData.singleFile?.originalFileName }}&ndash;&gt;--> <!-- &lt;!&ndash; {{ localFormData.singleFile?.originalFileName }}&ndash;&gt;-->
<!-- &lt;!&ndash; </el-button>&ndash;&gt;--> <!-- &lt;!&ndash; </el-button>&ndash;&gt;-->
<!-- &lt;!&ndash; </el-form-item>&ndash;&gt;--> <!-- &lt;!&ndash; </el-form-item>&ndash;&gt;-->
<!-- </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 {

View File

@@ -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

View File

@@ -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>

View File

@@ -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'
}, },
{ {

View File

@@ -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) preProcessObj = {
if (!exists) { requestId: item.requestId,
preProcessObj = { requestName: item.requestName,
requestId: item.requestId, baseUrl: item.baseUrl
requestName: item.requestName,
baseUrl: item.baseUrl
}
preProcessArray.push(preProcessObj)
} }
preProcessArray.push(preProcessObj)
}) })
if(props.formData.mode === 'view'||props.formData.mode === 'resubmit'){ localFormData.value.preProcess = preProcessArray
localFormData.value.preProcess = [...originalProcess.value,...preProcessArray]
}else{
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)
}) })

View File

@@ -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});

View File

@@ -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

View File

@@ -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,

View File

@@ -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

View File

@@ -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) => {

View File

@@ -1,68 +1,36 @@
<template> <template>
<div v-loading="loading" class="add-block"> <div v-loading="loading" class="add-block">
<baseTitle title="文章信息录入"></baseTitle> <baseTitle title="文章信息录入"></baseTitle>
<el-form :model="formData" ref="fundForm" :rules="rules" style="margin-left: 5px;margin-bottom: -18px"> <el-form :model="formData" ref="fundForm" :rules="rules" style="margin-left: 5px;margin-bottom: -18px">
<el-row gutter="30"> <el-row gutter="30">
<el-col :span="6" style="margin-left: 10px"> <el-col :span="6" style="margin-left: 10px">
<el-form-item label="文章标题" prop="articleTitle"> <el-form-item label="文章标题" prop="articleTitle">
<el-input v-model="formData.articleTitle" placeholder="请输入文章标题" clearable></el-input> <el-input v-model="formData.articleTitle" placeholder="请输入文章标题" clearable></el-input>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="6"> <el-col :span="6">
<el-form-item label="文章类型" prop="articleType"> <el-form-item label="文章类型" prop="articleType">
<el-select v-model="formData.articleType" placeholder="请选择文章类型" clearable filterable> <el-select v-model="formData.articleType" placeholder="请选择文章类型" clearable filterable>
<el-option <el-option
v-for="item in cacheStore.getDict('article_type')" v-for="item in cacheStore.getDict('article_type')"
: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" >
<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,79 +53,26 @@ 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) => {
if (!instance) return if (!instance) return
instance.validate(async (valid) => { instance.validate(async (valid) => {
@@ -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;
} }

View File

@@ -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;

View File

@@ -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',

View File

@@ -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>

View File

@@ -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>

View File

@@ -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})=>{

View File

@@ -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&&currentRow.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>

View File

@@ -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>

View File

@@ -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&&noticeList.length==0"> <div v-if="noticeList&&noticeList.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();
// 获取当前小时数 // 获取当前小时数
@@ -542,11 +535,11 @@ const getTimePeriod = () => {
return "中午好"; return "中午好";
} else if (hour >= 14 && hour < 18) { } else if (hour >= 14 && hour < 18) {
return "下午好"; return "下午好";
} else if (hour >= 18 && hour <= 22) { } else if (hour >= 18 && hour <= 22) {
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
} }
}) })
@@ -790,17 +783,17 @@ const handleView = (row) => {
} }
}) })
} }
// else if (row.targetState == '10' && row.targetId) { // else if (row.targetState == '10' && row.targetId) {
// router.push({ // router.push({
// name: 'Summary/detail', // name: 'Summary/detail',
// query: { // query: {
// projectId: row.targetId, // projectId: row.targetId,
// state: row.state, // state: row.state,
// source: 'home' // source: 'home'
// } // }
// }) // })
// } // }
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;
@@ -1114,7 +1100,7 @@ const handleView = (row) => {
:deep(.el-tabs__new-tab ) { :deep(.el-tabs__new-tab ) {
width: 67px !important; width: 67px !important;
border: none !important; border: none !important;
color: #1476E3; color: #1476E3;
font-size: 14px; font-size: 14px;
line-height: 51px !important; line-height: 51px !important;
height: 51px !important; height: 51px !important;
@@ -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,13 +1338,13 @@ 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 {
display: flex; display: flex;
align-items: center; align-items: center;
color: #F55815; color: #F55815;
font-size: 15px; font-size: 15px;
> span { > span {
@@ -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;
} }
} }

View File

@@ -1,5 +1,4 @@
<template> <template>
<div class="login-box"> <div class="login-box">
<el-form <el-form
:model="loginForm" :model="loginForm"

View File

@@ -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>&#45;&#45;</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>

View File

@@ -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: '征集名称',

View File

@@ -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
masterProjectList.value = res.data.filter(item => item.value!=route.query.projectId)
}else{
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,

View File

@@ -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()

View File

@@ -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
}
} }
] ]
}) })

View File

@@ -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,18 +312,10 @@ 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 (row.state !== null) {
if (!buttons.has("openFileSwitch")&&row.state!=1) { return (<Tag dictType={'project_filing'} value={row.state}/>)
console.log('row',row) } else {
return (<Tag dictType={'project_filing'} value={'0'}/>) return '--'
}else if (buttons.has("openFileSwitch")) {
return (<Tag dictType={'project_filing'} value={'4'}/>)
}else{
if (row.state !== null) {
return (<Tag dictType={'project_filing'} value={row.state}/>)
} else {
return '--'
}
} }
} }
}, },
@@ -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'
})
}
}) })
}) })
} }

View File

@@ -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
}
} }
] ]
}) })

View File

@@ -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
}
} }
] ]
}) })

View File

@@ -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

View File

@@ -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;

View File

@@ -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})=>{

View File

@@ -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
}
} }
] ]
}) })

View File

@@ -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
}
} }
] ]
}) })

View File

@@ -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
}
} }
] ]
}) })

View File

@@ -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>

View File

@@ -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
}
} }
] ]
}) })

View File

@@ -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})=>{

View File

@@ -1,16 +1,16 @@
<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"
:file-list-show="fileListShow" :file-list-show="fileListShow"
labelAlign="top" labelAlign="top"
/> />
</el-form> </el-form>
<div v-if="data.taskId"> <div v-if="data.taskId">
@@ -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: {
@@ -493,22 +309,22 @@ const schema = computed(() => {
} }
arr.push(preProcess) arr.push(preProcess)
// arr.push( // arr.push(
// { // {
// label: '项目验收附件', // label: '项目验收附件',
// prop: 'singleFile', // prop: 'singleFile',
// colProps: { // colProps: {
// span: 24 // span: 24
// }, // },
// labelWidth: 'left', // labelWidth: 'left',
// component: () => { // component: () => {
// let singleFileArray = [props.formData.singleFile] // let singleFileArray = [props.formData.singleFile]
// return props.formData.singleFile ? <fvTable style="width: 100%;max-height: 80px;" height="80" // return props.formData.singleFile ? <fvTable style="width: 100%;max-height: 80px;" height="80"
// tableConfig={editSingleTableConfig} // tableConfig={editSingleTableConfig}
// data={singleFileArray} isSettingCol={false} pagination={false}> // data={singleFileArray} isSettingCol={false} pagination={false}>
// </fvTable> // </fvTable>
// : <span>--</span> // : <span>--</span>
// } // }
// }) // })
} else if (props.type == 'archivist') { } else if (props.type == 'archivist') {
arr = [ arr = [
// { // {
@@ -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':

View File

@@ -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>

View File

@@ -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,

View File

@@ -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> <div v-html="formData.introduce">
</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',

View File

@@ -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;
} }

View File

@@ -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),

View File

@@ -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'"

View File

@@ -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

View File

@@ -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>

View File

@@ -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>

View File

@@ -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'

View File

@@ -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
} }

View File

@@ -68,7 +68,7 @@
</el-table-column> </el-table-column>
</el-table> </el-table>
</div> </div>
<paging :current-page="pageInfo.pageNum" :page-size="pageInfo.pageSize" :page-sizes="[10, 20, 30, 40,50]" <paging :current-page="pageInfo.pageNum" :page-size="pageInfo.pageSize" :page-sizes="[10, 20, 30, 40,50]"
:total="total" @changeSize="handleSizeChange" @goPage="handleCurrentChange"/> :total="total" @changeSize="handleSizeChange" @goPage="handleCurrentChange"/>
<el-dialog v-model="isVisited" title="历史" width="800px"> <el-dialog v-model="isVisited" title="历史" width="800px">
<div class="table"> <div class="table">
@@ -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}`,

View File

@@ -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 模块
},
}) })