815 Commits
clay ... 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
d9a5099436 Merge pull request 'dj' (#949) from dj into master
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/949
2025-03-13 13:35:11 +00:00
dj
dd75bc6513 fix: 修复汇总列表征集名称筛选判重 2025-03-13 21:34:48 +08:00
dj
d3506d841e fix: 注释掉需求添加和附件上传中的标签编辑功能 2025-03-10 21:25:12 +08:00
dj
263df9e489 feat: 列表新增征集, 筛选新增公司,征集名称 2025-03-10 17:42:21 +08: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
50973efb0a Merge pull request 'feat(system): 新增审批白名单功能并优化用户列表' (#947) from dj into master
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/947
2025-03-08 11:23:40 +00:00
dj
8256c80648 feat(system): 新增审批白名单功能并优化用户列表 2025-03-08 19:23:17 +08: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
97e9799b1a Merge pull request 'dj' (#945) from dj into master
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/945
2025-03-08 09:48:20 +00:00
dj
e81b2bc42f feat(system): 新增审批白名单功能并优化用户列表 2025-03-08 17:47:54 +08:00
dj
9c297d92c9 feat : 需求征集新增公司筛选 2025-03-02 22:16:12 +08: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
a3b1f96ab6 Merge pull request 'fix:移除未使用的文件下载和删除功能' (#943) from dj into master
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/943
2024-12-21 07:07:45 +00:00
dj
d2c77b9cc2 fix:移除未使用的文件下载和删除功能 2024-12-21 15:07:10 +08: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
b06b4b88bb Merge pull request 'fix: 优化文件删除逻辑(采用前端删除文件)' (#941) from dj into master
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/941
2024-12-21 06:49:55 +00:00
dj
560fd3af3b fix: 优化文件删除逻辑(采用前端删除文件) 2024-12-21 14:49:32 +08: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
19aa70a8ca Merge pull request 'fix: 优化文件删除逻辑(采用前端删除文件)' (#939) from dj into master
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/939
2024-12-20 15:32:21 +00:00
dj
06af12ca88 fix: 优化文件删除逻辑(采用前端删除文件) 2024-12-20 22:27:22 +08: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
96d912ff44 Merge pull request 'fix: 修改流程审批字样' (#937) from dj into master
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/937
2024-12-19 15:07:23 +00:00
dj
10f1afe23c fix: 修改流程审批字样 2024-12-19 23:07:06 +08: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
e10978cadd Merge pull request 'dj' (#935) from dj into master
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/935
2024-12-19 14:26:36 +00:00
dj
7ce2d6edb7 fix: 修改多图片上传页面 2024-12-19 22:26:17 +08:00
dj
5f8a29f2d6 fix: 修改用户选择器标题文案 2024-12-15 00:20:28 +08: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
efe27b8580 Merge pull request 'fix : 优化需求上报时需求征集显示' (#933) from dj into master
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/933
2024-12-14 14:54:46 +00:00
dj
7a535c41e7 fix : 优化需求上报时需求征集显示 2024-12-14 22:54:33 +08: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
1cf05c8653 Merge pull request 'feat : 需求上报新增需求征集字段' (#931) from dj into master
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/931
2024-12-14 11:05:38 +00:00
dj
7f4a3a274e feat : 需求上报新增需求征集字段 2024-12-14 19:05:12 +08: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
6e5c7d172d Merge pull request 'fix: 优化图片上传插件' (#929) from dj into master
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/929
2024-12-13 06:28:59 +00:00
dj
4123a685b7 fix: 优化图片上传插件 2024-12-13 14:28:37 +08: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
2fe09971ab Merge pull request 'fix: 优化图片上传插件' (#927) from dj into master
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/927
2024-12-13 05:10:46 +00:00
dj
dc099c9347 fix: 优化图片上传插件 2024-12-13 13:10:30 +08: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
54e7a8f662 Merge pull request 'feat: 优化文章详情页面pdf预览功能' (#925) from dj into master
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/925
2024-12-13 04:42:04 +00:00
dj
43785b7460 feat: 优化文章详情页面pdf预览功能 2024-12-13 12:38:08 +08: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
ad969d33bb Merge pull request 'feat : 需求上报加上保存按钮' (#923) from dj into master
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/923
2024-12-13 03:52:03 +00:00
dj
b41e39abbf feat : 需求上报加上保存按钮 2024-12-13 11:51:18 +08: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
d7e36ee464 Merge pull request 'feat: 在文章管理中集成多图片上传插件' (#921) from dj into master
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/921
2024-12-11 05:13:33 +00:00
dj
54eeefd5dd feat: 在文章管理中集成多图片上传插件 2024-12-11 13:12:43 +08: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
df6f0083ea Merge pull request 'feat : 需求汇总加上"主项目"字段' (#919) from dj into master
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/919
2024-11-10 14:52:34 +00:00
a5486c1948 feat : 需求汇总加上"主项目"字段 2024-11-10 22:52:15 +08: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
f6d5a97dfb Merge pull request 'feat : 需求汇总加上 " 是否在预算内"筛选' (#917) from dj into master
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/917
2024-11-10 05:50:37 +00:00
a6ace0a27d feat : 需求汇总加上 " 是否在预算内"筛选 2024-11-10 13:50:22 +08: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
b2eec2e1f3 Merge pull request 'fix : 修改系统名称' (#915) from dj into master
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/915
2024-11-07 03:08:56 +00:00
5506ebee7a fix : 修改系统名称 2024-11-07 11:08:38 +08: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
348edd66bd Merge pull request 'fix : 修改系统名称' (#913) from dj into master
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/913
2024-11-07 03:08:00 +00:00
d58579579d fix : 修改系统名称 2024-11-07 11:07:47 +08:00
3139c78179 Merge pull request 'fix : 修改系统名称' (#911) from dj into master
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/911
2024-11-07 03:05:59 +00:00
252a077dcd fix : 修改系统名称 2024-11-07 11:04:16 +08: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
87d5677352 Merge pull request 'feat : 项目立项, 阶段变更zip下载' (#909) from dj into master
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/909
2024-11-03 11:32:31 +00:00
39c9408f34 feat : 项目立项, 阶段变更zip下载 2024-11-03 19:31:59 +08: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
36624c5621 Merge pull request 'feat : "需求上报, 项目立项, 项目验收, 阶段变更, 专项资金" 上传文件旁边加上模板下载功能' (#907) from dj into master
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/907
2024-11-02 14:05:13 +00:00
08da2601d8 feat : "需求上报, 项目立项, 项目验收, 阶段变更, 专项资金" 上传文件旁边加上模板下载功能 2024-11-02 22:00:08 +08: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
4b4aed5600 Merge pull request 'feat : 需求征集和项目管理的名称匹配搜索' (#905) from dj into master
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/905
2024-11-02 12:01:11 +00:00
a175a6456a feat : 需求征集和项目管理的名称匹配搜索 2024-11-02 20:00:29 +08: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
0bbe97c582 Merge pull request 'dj' (#903) from dj into master
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/903
2024-10-30 13:13:52 +00:00
960d294870 feat : 修复项目归档的附件的全部附件加个类型筛选 2024-10-30 21:13:16 +08:00
f3fbb8d76b fix : 修复选择前置流程时的提示为红色 2024-10-29 21:53:07 +08: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
8a0f6c6f37 Merge pull request 'feat : 需求汇总列表新增当前审批节点字段,阶段变更新增项目终止字段' (#901) from dj into master
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/901
2024-10-29 13:45:17 +00:00
99be2b0501 feat : 需求汇总列表新增当前审批节点字段,阶段变更新增项目终止字段 2024-10-29 21:44:50 +08: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
942603c344 Merge pull request 'fix : 修复项目实施文件预览' (#899) from dj into master
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/899
2024-10-27 11:00:53 +00:00
54772cbbb1 fix : 修复项目实施文件预览 2024-10-27 19:00:37 +08: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
a4e95e21b3 Merge pull request 'fix : 修复新增征集/需求上报时缓存和注释log' (#897) from dj into master
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/897
2024-10-27 10:08:50 +00:00
53b581e71c fix : 修复新增征集/需求上报时缓存和注释log 2024-10-27 18:08:16 +08: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
604a0fedb8 Merge pull request 'fix : 修复tinymce的多图片上传插件/文章详情附件下载' (#895) from dj into master
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/895
2024-10-26 17:54:09 +00:00
8f226e6fa3 fix : 修复tinymce的多图片上传插件/文章详情附件下载 2024-10-27 01:53:42 +08: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
44eb378423 Merge pull request 'fix : 修复tinymce的多图片上传插件' (#893) from dj into master
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/893
2024-10-26 17:10:08 +00:00
40ba004082 fix : 修复tinymce的多图片上传插件 2024-10-27 01:06:54 +08: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
2b2e54957f Merge pull request 'fix : 修复文章上传要显示的文本' (#891) from dj into master
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/891
2024-10-26 17:04:18 +00:00
db2a062400 fix : 修复文章上传要显示的文本 2024-10-27 01:04:08 +08: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
f36d7abca8 Merge pull request 'fix : 修复文章下载文件名问题' (#889) from dj into master
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/889
2024-10-26 16:56:02 +00:00
4f2bfb80ae fix : 修复文章下载文件名问题 2024-10-27 00:55:49 +08: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
7ee2f084db Merge pull request 'fix : 修改文章详情里面附件链接颜色' (#887) from dj into master
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/887
2024-10-26 13:29:23 +00:00
b5d2dceda1 fix : 修改文章详情里面附件链接颜色 2024-10-26 21:28:48 +08: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
7c7984b08f Merge pull request 'fix : 隐藏多图片上传' (#885) from dj into master
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/885
2024-10-26 13:18:37 +00:00
68f9c787e9 fix : 隐藏多图片上传 2024-10-26 21:18:22 +08: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
baecbac6c3 Merge pull request 'fix : 修复tinymce编辑器的图片上传loading提示' (#883) from dj into master
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/883
2024-10-26 13:16:17 +00:00
ea625f98f3 fix : 修复tinymce编辑器的图片上传loading提示 2024-10-26 21:15:58 +08: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
9b2baf43ef Merge pull request 'fix : 修复需求汇总的征集名称匹配及注释部分log' (#881) from dj into master
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/881
2024-10-26 13:03:20 +00:00
49596316f2 fix : 修复需求汇总的征集名称匹配及注释部分log 2024-10-26 21:02:53 +08: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
203721e9e0 Merge pull request 'fix : 修复需求上报提交功能' (#879) from dj into master
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/879
2024-10-25 15:31:03 +00:00
1a72339ade fix : 修复需求上报提交功能 2024-10-25 23:30:54 +08: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
83a740de91 Merge pull request 'fix : 修复首页待立项等任务跳转及各种类型文章跳转显示对应数据' (#877) from dj into master
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/877
2024-10-25 15:11:24 +00:00
fb0a0cd719 fix : 修复首页待立项等任务跳转及各种类型文章跳转显示对应数据 2024-10-25 23:11:01 +08: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
2b36fd181f Merge pull request 'dj' (#875) from dj into master
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/875
2024-10-25 13:50:05 +00:00
5c2ec69fd6 feat : 项目实施-上传附件加上缓存 2024-10-25 21:49:53 +08:00
ffe7d0bb6c feat : 阶段变更的项目基本信息加上"是否在预算内"字段 2024-10-25 21:41:26 +08: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
99d8bc156b Merge pull request 'dj' (#873) from dj into master
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/873
2024-10-25 13:33:04 +00:00
e78ae692ee feat : 新增需求上报缓存 2024-10-25 21:32:45 +08:00
80bf9ae9bd feat : 新增需求征集缓存 2024-10-25 21:26:58 +08: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
1fbd31f137 Merge pull request 'dj' (#871) from dj into master
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/871
2024-10-25 12:52:33 +00:00
9d55426a2a feat : 新增需求征集缓存 2024-10-25 20:52:20 +08:00
e0299baf46 fix : 修复项目归档全部附件名称搜索 2024-10-25 20:52:03 +08: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
ed8104ba92 Merge pull request 'feat : 项目归档加上全部标签' (#869) from dj into master
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/869
2024-10-25 12:20:54 +00:00
c5d7961b4d feat : 项目归档加上全部标签 2024-10-25 20:20:39 +08: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
0cb840a466 Merge pull request 'dj' (#867) from dj into master
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/867
2024-10-25 02:48:06 +00:00
b8aa24e6a0 fix : 修复tinymce的多图片上传和附件上传 2024-10-25 10:46:53 +08:00
e3b17f0f04 fix : 修复tinymce的多图片上传和附件上传 2024-10-25 10:46:35 +08: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
d12d4865c7 Merge pull request 'feat : 项目基本信息加上是否在预算内字段' (#865) from dj into master
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/865
2024-10-24 15:04:37 +00:00
a01cede9c0 feat : 项目基本信息加上是否在预算内字段 2024-10-24 23:01:54 +08:00
318410ff74 Merge pull request 'feat : 需求上报和详情新增是否在预算内字段' (#864) from dj into master
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/864
2024-10-24 14:04:59 +00:00
a8feed2d7f feat : 需求上报和详情新增是否在预算内字段 2024-10-24 22:04:46 +08: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
872c54abd3 Merge pull request 'fix : 修复前置流程弹窗的提示,首页需求上报跳转位置' (#862) from dj into master
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/862
2024-10-24 05:13:34 +00:00
c2c1cfd6e1 fix : 修复前置流程弹窗的提示,首页需求上报跳转位置 2024-10-24 13:13:11 +08: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
779d6f7094 Merge pull request 'fix : 按钮放在右上角浮动' (#860) from dj into master
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/860
2024-10-24 02:29:06 +00:00
5c4f25dc1a fix : 按钮放在右上角浮动 2024-10-24 10:28:53 +08: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
c17396d44a Merge pull request 'fix : 按钮放在右上角浮动' (#858) from dj into master
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/858
2024-10-23 15:15:15 +00:00
344a3a03b3 fix : 按钮放在右上角浮动 2024-10-23 23:14:56 +08: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
9ff596c167 Merge pull request 'fix : 修复年docx文件预览框溢出bug' (#856) from dj into master
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/856
2024-10-23 14:56:28 +00:00
a82030b04f fix : 修复年docx文件预览框溢出bug 2024-10-23 22:53:46 +08: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
3690235ae7 Merge pull request 'fix : 修复年度计划项目详情跳转' (#854) from dj into master
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/854
2024-10-23 14:32:32 +00:00
2a788fff0a fix : 修复年度计划项目详情跳转 2024-10-23 22:32:10 +08: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
3d6bdd50ca Merge pull request 'fix : 修复文章详情排版' (#852) from dj into master
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/852
2024-10-23 13:58:08 +00:00
20b2203930 fix : 修复文章详情排版 2024-10-23 21:56:18 +08: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
6afc855cd8 Merge pull request 'feat : 费用管理中新增项目台账' (#850) from dj into master
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/850
2024-10-23 13:38:06 +00:00
44a50176cc feat : 费用管理中新增项目台账 2024-10-23 21:37:17 +08:00
069816e17f Merge pull request 'dj' (#849) from dj into master
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/849
2024-10-22 15:20:03 +00:00
57ec7832f2 fix : 修复文件预览弹窗适配 2024-10-22 23:19:44 +08:00
dfdaabeb48 fix : 修复新增研发投入资金bug 2024-10-20 21:17:45 +08: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
bfc6845071 Merge pull request 'fix : 清空登录默认账号' (#847) from dj into master
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/847
2024-10-17 14:48:53 +00:00
ea9047ee2a fix : 清空登录默认账号 2024-10-17 22:47:27 +08: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
1341f3749b Merge pull request 'fix : 修复首页时间提示' (#845) from dj into master
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/845
2024-10-17 14:36:05 +00:00
30f3f3bdcd fix : 修复首页时间提示 2024-10-17 22:35:54 +08: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
fbb277cb30 Merge pull request 'fix : 修复非超级管理员的名称搜索问题' (#843) from dj into master
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/843
2024-10-17 14:25:45 +00:00
145bb01fdd fix : 修复非超级管理员的名称搜索问题 2024-10-17 22:25:31 +08: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
f36c8ffcac Merge pull request 'fix : 清空登录默认账号' (#841) from dj into master
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/841
2024-10-14 06:36:01 +00:00
de0b64909d fix : 清空登录默认账号 2024-10-14 14:35:43 +08: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
bcffdba692 Merge pull request 'fix : 修改首页提示' (#839) from dj into master
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/839
2024-10-14 04:17:25 +00:00
2e9d015623 fix : 修改首页提示 2024-10-14 12:16:57 +08: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
9d63e05d03 Merge pull request 'fix : 修改首页提示' (#837) from dj into master
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/837
2024-10-13 16:27:46 +00:00
6ea9538b0a fix : 修改首页提示 2024-10-14 00:27:15 +08: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
9671d5a36d Merge pull request 'dj' (#835) from dj into master
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/835
2024-10-13 14:48:29 +00:00
f476dc9203 feat : 首页待办/已办查看更多列表 2024-10-13 22:47:44 +08:00
235ec0c4ff fix : 修复首页刷新功能 2024-10-13 22:18:18 +08:00
f2ba567b93 fix : 修复首页刷新功能 2024-10-13 22:15:39 +08:00
525385cd17 Merge pull request 'fix : 修复首页研发投入资金渲染bug' (#834) from dj into master
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/834
2024-10-13 14:08:27 +00:00
ee8df164d1 fix : 修复首页研发投入资金渲染bug 2024-10-13 22:08:10 +08: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
9b1d51273d Merge pull request 'fix : 修复审批节点' (#832) from dj into master
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/832
2024-10-13 13:59:52 +00:00
0fc92b7742 fix : 修复审批节点 2024-10-13 21:59:27 +08: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
735dedfb42 Merge pull request 'feat : 首页项目四个状态统计' (#830) from dj into master
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/830
2024-10-13 09:45:15 +00:00
4ab7a04c92 feat : 首页项目四个状态统计 2024-10-13 17:44:53 +08: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
b3bfff9588 Merge pull request 'dj' (#828) from dj into master
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/828
2024-10-11 08:17:38 +00:00
c6d8b45537 fix : 优化费用台账-导出按钮位置 2024-10-11 16:07:35 +08:00
e7e1f33985 fix : 修复pointTag组件报错 2024-10-11 15:40:28 +08: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
4aff4667ef Merge pull request 'feat : 费用台账导出' (#826) from dj into master
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/826
2024-10-11 07:26:33 +00:00
41fd5bef4d feat : 费用台账导出 2024-10-11 15:26:03 +08: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
509b7e35c9 Merge pull request 'fix : 修复“专项资金名称”显示不全问题' (#824) from dj into master
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/824
2024-10-11 07:15:44 +00:00
a7143c8c58 fix : 修复“专项资金名称”显示不全问题 2024-10-11 15:15:28 +08: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
26ba628cae Merge pull request 'dj' (#822) from dj into master
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/822
2024-10-11 07:00:58 +00:00
7fbc2037d3 feat : 研发投入资金管理按钮权限 2024-10-11 15:00:42 +08:00
5c1a1d507a feat : 首页专项资金项目数据展示 2024-10-11 14:49:18 +08:00
ee2ddfca14 Merge pull request 'fix : 修复popover删除组件按钮显示问题' (#821) from dj into master
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/821
2024-10-11 06:27:11 +00:00
c456c6f642 fix : 修复popover删除组件按钮显示问题 2024-10-11 14:27:00 +08: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
502b4cff10 Merge pull request 'fix : 修复文章操作权限' (#819) from dj into master
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/819
2024-10-11 06:06:31 +00:00
c34fb88311 fix : 修复文章操作权限 2024-10-11 14:02:36 +08: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
22548f34c1 Merge pull request 'fix : 修复研发投入资金年份筛选时chart没渲染的bug' (#817) from dj into master
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/817
2024-10-11 04:14:36 +00:00
c643aa0e1d fix : 修复研发投入资金年份筛选时chart没渲染的bug 2024-10-11 12:13:59 +08: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
478f9d2639 Merge pull request 'feat : 添加首页待办数据和研发投入资金年份筛选' (#815) from dj into master
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/815
2024-10-11 03:39:17 +00:00
19c4f7469d feat : 添加首页待办数据和研发投入资金年份筛选 2024-10-11 11:38:45 +08: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
06f3fcefee Merge pull request 'dj' (#813) from dj into master
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/813
2024-10-09 13:17:26 +00:00
62d18089c4 fix : 简化代码 2024-10-09 21:16:55 +08:00
03a34bb637 Merge pull request 'fix : 优化首页样式' (#812) from dj into master
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/812
2024-10-09 11:57:50 +00:00
9d144af68a fix : 优化首页样式 2024-10-09 19:54:27 +08:00
00c346c7b1 Merge remote-tracking branch 'origin/master' 2024-10-09 19:47:44 +08:00
fcc67e542e fix : 优化首页样式 2024-10-09 19:47:21 +08: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
zhangkaihuai
5019a88fd5 Merge pull request '更新 nginx.conf' (#810) from de into master
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/810
2024-09-23 02:59:43 +00:00
zhangkaihuai
b573fafb8e 更新 nginx.conf 2024-09-23 02:59:22 +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
e0b564c56c Merge pull request 'fix : 修复代理人回显' (#808) from de into master
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/808
2024-09-22 13:41:56 +00:00
158fbfd124 fix : 修复代理人回显 2024-09-22 21:41:46 +08: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
f1cc13ae71 Merge pull request 'fix : 修复个人中心代理人回显' (#806) from de into master
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/806
2024-09-22 13:39:57 +00:00
35ba4523e8 fix : 修复个人中心代理人回显 2024-09-22 21:39:48 +08: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
30f74720b4 Merge pull request 'fix : 研发资金格式化' (#804) from de into master
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/804
2024-09-22 11:53:30 +00:00
9e9c4beb45 fix : 研发资金格式化 2024-09-22 19:53:20 +08: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
810479701c Merge pull request 'fix : 饼图间距' (#802) from de into master
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/802
2024-09-22 10:46:25 +00:00
b8392f199c fix : 饼图间距 2024-09-22 18:46:10 +08: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
11f887c93d Merge pull request 'fix : 移除首页待办模拟数据' (#800) from de into master
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/800
2024-09-22 10:07:24 +00:00
b539f4a6d7 fix : 移除首页待办模拟数据 2024-09-22 18:07:15 +08: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
cefee8298a Merge pull request 'de' (#798) from de into master
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/798
2024-09-22 09:58:32 +00:00
47633749fb feat : 审批记录的代理审批,用户管理的设置代理功能,首页待办 2024-09-22 17:58:13 +08:00
4e325196c8 feat : 个人中心和用户管理设置代理 2024-09-22 15:26:45 +08: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
242fb1ddee Merge pull request 'fix : 修复首页适配/人员选择器取消功能bug' (#796) from de into master
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/796
2024-09-22 04:22:25 +00:00
2546db9b64 fix : 修复首页适配/人员选择器取消功能bug 2024-09-22 12:21:57 +08: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
58ffb22bf6 Merge pull request 'fix : 修复首页适配' (#794) from de into master
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/794
2024-09-21 16:42:04 +00:00
d7d825b5b0 fix : 修复首页适配 2024-09-22 00:40:40 +08: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
7077604a27 Merge pull request 'fix : 修复首页适配' (#792) from de into master
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/792
2024-09-21 16:31:12 +00:00
ea38a6ddef fix : 修复首页适配 2024-09-22 00:31:00 +08: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
4a620c5d78 Merge pull request 'de' (#790) from de into master
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/790
2024-09-21 16:28:36 +00:00
c37e150bb9 fix : 修复首页适配 2024-09-22 00:28:18 +08:00
fe45524d52 fix : 修复首页适配 2024-09-22 00:27:22 +08: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
9b78d4e52e Merge pull request 'fix : 修复首页数据展示' (#788) from de into master
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/788
2024-09-21 15:51:57 +00:00
349f514bcb fix : 修复首页数据展示 2024-09-21 23:51:33 +08: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
e4069c0de2 Merge pull request 'fix : 修复首页数据展示,更改文章时间字段' (#786) from de into master
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/786
2024-09-21 14:38:32 +00:00
7b155f649d fix : 修复首页数据展示,更改文章时间字段 2024-09-21 22:37:59 +08: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
c6a8a6fc70 Merge pull request 'feat : 文章管理crud功能完成' (#784) from de into master
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/784
2024-09-21 13:59:26 +00:00
4f594b0bfd feat : 文章管理crud功能完成 2024-09-21 21:59:12 +08: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
f011a1e8fd Merge pull request 'feat : 研发投入资金crud功能完成' (#782) from de into master
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/782
2024-09-21 10:19:30 +00:00
090e9a1ea8 feat : 研发投入资金crud功能完成 2024-09-21 18:19:17 +08: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
f162befa0d Merge pull request 'feat : 研发投入资金和文章管理' (#780) from de into master
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/780
2024-09-21 07:40:01 +00:00
10bb9cbc37 feat : 研发投入资金和文章管理 2024-09-21 15:39:45 +08: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
2fe143b6c7 Merge pull request 'fix : 优化首页样式' (#778) from de into master
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/778
2024-09-19 09:13:52 +00:00
bbf63ec51f fix : 优化首页样式 2024-09-19 17:12:50 +08: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
ffaf17d6f9 Merge pull request 'fix : 优化首页样式' (#776) from de into master
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/776
2024-09-18 16:52:06 +00:00
e9835df985 fix : 优化首页样式 2024-09-19 00:51:55 +08:00
377e041eb2 Merge pull request 'de' (#775) from de into master
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/775
2024-09-18 16:26:18 +00:00
b3fe207469 fix : 优化首页样式 2024-09-19 00:26:05 +08:00
e527deabd5 fix : 首页备份 2024-09-18 22:30:39 +08: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
6800117ed4 Merge pull request 'de' (#773) from de into master
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/773
2024-09-18 14:26:07 +00:00
ae31f68586 fix : 修复专项资金驳回弹窗高度 2024-09-18 22:24:41 +08:00
4568101f06 fix : 首页板块响应式优化 2024-09-12 23:26:38 +08: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
5bfa2a0243 Merge pull request 'fix : 首页细节样式优化' (#771) from de into master
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/771
2024-09-12 15:16:02 +00:00
68fa803016 fix : 首页细节样式优化 2024-09-12 23:15:47 +08: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
adbfc42015 Merge pull request 'fix : 首页细节样式优化' (#769) from de into master
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/769
2024-09-12 14:57:16 +00:00
0c26f2245e fix : 首页细节样式优化 2024-09-12 22:56:57 +08: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
01029195fb Merge pull request 'fix : 修复首页待立项等区域显示' (#767) from de into master
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/767
2024-09-12 14:33:39 +00:00
68897bbabf fix : 修复首页待立项等区域显示 2024-09-12 22:33:16 +08: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
ac22684d69 Merge pull request 'de' (#765) from de into master
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/765
2024-09-12 13:55:59 +00:00
fa977c5134 fix : 修复首页待立项等区域点击跳转 2024-09-12 21:55:38 +08:00
21cc38ed73 fix : 修改饼图间隔 2024-09-12 21:40:51 +08: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
258e340752 Merge pull request 'feat : 研发投入资金饼图' (#763) from de into master
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/763
2024-09-12 13:29:13 +00:00
96378e161f feat : 研发投入资金饼图 2024-09-12 21:28:55 +08: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
2e3089e6b1 Merge pull request 'feat : 专项资金饼图' (#761) from de into master
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/761
2024-09-11 18:34:45 +00:00
b5a1c76fad feat : 专项资金饼图 2024-09-12 02:34:27 +08: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
3fb35e085c Merge pull request 'feat : 首页' (#759) from de into master
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/759
2024-09-11 16:48:51 +00:00
f2b1cad505 feat : 首页 2024-09-12 00:48:34 +08: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
87d4633b18 Merge pull request 'fix : 移除多余的>' (#757) from de into master
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/757
2024-09-10 05:16:11 +00:00
2fdbc144a6 fix : 移除多余的> 2024-09-10 13:15:49 +08: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
e52efa0a45 Merge pull request 'fix : 修复上传两个文件之后删除一个文件报错问题,分摊研发人员clearable, 修复表格更新项目时间展示问题' (#755) from de into master
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/755
2024-09-08 12:51:24 +00:00
3c6a8bedc2 fix : 修复上传两个文件之后删除一个文件报错问题,分摊研发人员clearable, 修复表格更新项目时间展示问题 2024-09-08 20:51:11 +08: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
a9cfa60b36 Merge pull request 'fix : 修复用户切换时,报错提示' (#753) from de into master
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/753
2024-09-08 11:39:13 +00:00
09cef9de33 fix : 修复用户切换时,报错提示 2024-09-08 19:38:34 +08: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
8274f9f186 Merge pull request 'fix : 修复文件不能预览时的提示' (#751) from de into master
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/751
2024-09-07 10:23:07 +00:00
b90d3bc466 fix : 修复文件不能预览时的提示 2024-09-07 18:22:54 +08: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
e99d217d34 Merge pull request 'fix : 修复金额千位格式化,新增征集时添加"新增专项资金"按钮' (#749) from de into master
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/749
2024-09-07 07:10:25 +00:00
fc41bd8e6d fix : 修复金额千位格式化,新增征集时添加"新增专项资金"按钮 2024-09-07 15:09:37 +08: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
cff3198dcd Merge pull request 'fix : 修复项目实施-归档列表页附件项目实施/验收展示及上传附件功能,修复需求上报资金名称传参' (#747) from de into master
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/747
2024-08-28 14:57:33 +00:00
d4d7601bae fix : 修复项目实施-归档列表页附件项目实施/验收展示及上传附件功能,修复需求上报资金名称传参 2024-08-28 22:57:08 +08: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
1ce0bf708b Merge pull request 'fix : 修复人员选择框取消功能' (#745) from de into master
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/745
2024-08-28 09:31:04 +00:00
060f6e0fd8 fix : 修复人员选择框取消功能 2024-08-28 17:30:45 +08: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
4d5f163f17 Merge pull request 'fix : 修复费用分摊新增输入框宽度显示' (#743) from de into master
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/743
2024-08-28 06:31:09 +00:00
f4a1e3e932 fix : 修复费用分摊新增输入框宽度显示 2024-08-28 14:30:49 +08: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
43211d6f0c Merge pull request 'fix : 详情修改为一个文件上传入口及测试校验,同步移动端详情展示' (#741) from de into master
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/741
2024-08-28 06:19:15 +00:00
d59c9d8cca fix : 详情修改为一个文件上传入口及测试校验,同步移动端详情展示 2024-08-28 14:18:55 +08:00
8d731ff7c5 Merge pull request 'fix : 修改为一个文件上传入口, 阶段变更增加变更状态,修复项目实施显示' (#740) from de into master
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/740
2024-08-27 14:29:12 +00:00
50504f4e94 fix : 修改为一个文件上传入口, 阶段变更增加变更状态,修复项目实施显示 2024-08-27 22:28:52 +08: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
5362a47d1e Merge pull request 'fix : 修复项目实施展示' (#738) from de into master
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/738
2024-08-27 02:40:57 +00:00
a1a3c0ac9f fix : 修复项目实施展示 2024-08-27 10:40:35 +08: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
5d44bae1c3 Merge pull request 'fix : 修复项目实施序号对齐' (#736) from de into master
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/736
2024-08-26 15:10:17 +00:00
4d78debb92 fix : 修复项目实施序号对齐 2024-08-26 23:10:01 +08: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
936f5dbf4c Merge pull request 'fix : 修复项目实施步骤显示' (#734) from de into master
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/734
2024-08-26 14:52:54 +00:00
d4e7503306 fix : 修复项目实施步骤显示 2024-08-26 22:52:37 +08: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
d1a20fbad1 Merge pull request 'fix : 修复人员选择/公司选择bug' (#732) from de into master
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/732
2024-08-26 14:14:06 +00:00
6e8f2328c6 fix : 修复人员选择/公司选择bug 2024-08-26 22:13:06 +08: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
251fdf7989 Merge pull request 'fix : 修改打印范围, 详情增加项目实施模块' (#730) from de into master
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/730
2024-08-26 12:56:27 +00:00
30d1664a9b Merge remote-tracking branch 'origin/master'
# Conflicts:
#	src/components/steps/index.vue
2024-08-26 20:56:12 +08:00
2173cd1cf1 fix : 修改打印范围, 详情增加项目实施模块 2024-08-26 20:52:54 +08: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
9557e8595d Merge pull request 'fix : 修改打印范围' (#728) from dd into master
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/728
2024-08-26 12:18:47 +00:00
bc2c77ff34 fix : 修改打印范围 2024-08-26 20:18:21 +08: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
741187c129 Merge pull request 'fix : 修复公司/人员选择框bug' (#726) from dd into master
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/726
2024-08-19 16:56:37 +00:00
8f9d5eb37b fix : 修复公司/人员选择框bug 2024-08-20 00:56:12 +08: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
1541482e76 Merge pull request 'fix : 修复用户管理,角色管理提交时, 一直loading的bug' (#724) from dd into master
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/724
2024-08-18 03:12:56 +00:00
ce2d39e3bf fix : 修复用户管理,角色管理提交时, 一直loading的bug 2024-08-18 11:12:26 +08: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
6d0a1940fc Merge pull request 'feat : 表格分页时序号连续' (#722) from dd into master
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/722
2024-08-17 03:25:16 +00:00
b6b1c8a3ff feat : 表格分页时序号连续 2024-08-17 11:24:43 +08: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
9ecabb8f69 Merge pull request 'fix : 修复人员选择框取消功能' (#720) from dd into master
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/720
2024-08-17 02:40:59 +00:00
09c51f13fc fix : 修复人员选择框取消功能 2024-08-17 10:40:46 +08: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
968eebaa2b Merge pull request 'fix : 修复人员取消功能' (#718) from dd into master
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/718
2024-08-16 16:13:39 +00:00
7637608226 fix : 修复人员取消功能 2024-08-17 00:13:17 +08: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
26ed532684 Merge pull request 'fix : 优化新增分摊,新增专项资金及详情间距,年度计划详情间距' (#716) from dd into master
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/716
2024-08-13 15:07:14 +00:00
2e101d1017 fix : 优化新增分摊,新增专项资金及详情间距,年度计划详情间距 2024-08-13 23:06:59 +08: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
cb2fe73481 Merge pull request 'fix : 修复项目实施/归档上传附件表格高度,完善归档附件/上传附件时的文件预览' (#714) from dd into master
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/714
2024-08-13 10:03:32 +00:00
c1bba811b9 fix : 修复项目实施/归档上传附件表格高度,完善归档附件/上传附件时的文件预览 2024-08-13 18:01:44 +08: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
11598c507b Merge pull request 'dd' (#712) from dd into master
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/712
2024-08-13 09:21:36 +00:00
38b6299dbf fix : 修改表格高度,页面左右边距,上传文件不能和标题并排 2024-08-13 17:21:19 +08:00
fa054d2a07 fix : 修复需求征集详情排版 2024-08-13 15:42:24 +08: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
cafba1e18c Merge pull request 'fix : 修复专项资金详情排版' (#710) from dd into master
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/710
2024-08-13 07:31:42 +00:00
4755849a8c fix : 修复专项资金详情排版 2024-08-13 15:31:32 +08: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
ad6509f043 Merge pull request 'fix : 修复新增分摊排版' (#708) from dd into master
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/708
2024-08-13 05:19:44 +00:00
6cf0a0b0da fix : 修复新增分摊排版 2024-08-13 13:19:08 +08: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
f7b0461218 Merge pull request 'fix : 修复新增分摊判断' (#706) from dd into master
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/706
2024-08-12 16:41:45 +00:00
42fc5524f3 fix : 修复新增分摊判断 2024-08-13 00:41:04 +08: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
10cfe6e6ad Merge pull request 'dd' (#704) from dd into master
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/704
2024-08-12 15:26:10 +00:00
1dd381cc1e fix : 修复角色替换 2024-08-12 23:25:56 +08:00
1e02e00000 fix : 修复项目实施-附件标签选项刷新 2024-08-12 22:50:56 +08: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
27cb965f3a Merge pull request 'fix : 修复新增专项资金/需求征集排版' (#702) from dd into master
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/702
2024-08-12 14:37:54 +00:00
e643d9ef86 fix : 修复新增专项资金/需求征集排版 2024-08-12 22:37:31 +08: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
1da833f451 Merge pull request 'fix : 修复需求上报排版' (#700) from dd into master
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/700
2024-08-12 13:54:53 +00:00
95a2161ab3 fix : 修复需求上报排版 2024-08-12 21:54:39 +08: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
a134dfd308 Merge pull request 'fix : 修复需求上报是否专项资金 清除后报错' (#698) from dd into master
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/698
2024-08-12 07:51:49 +00:00
8fade135fe fix : 修复需求上报是否专项资金 清除后报错 2024-08-12 15:51:34 +08: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
1bdb1e6739 Merge pull request 'fix : 修复需求上报是否专项资金 清除后报错' (#696) from dd into master
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/696
2024-08-12 07:30:40 +00:00
b497e2117d fix : 修复需求上报是否专项资金 清除后报错 2024-08-12 15:30:26 +08: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
ef38b0c18f Merge pull request 'fix : 修复列表页面搜索框排版' (#694) from dd into master
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/694
2024-08-11 16:04:51 +00:00
83af021d33 fix : 修复列表页面搜索框排版 2024-08-12 00:04:31 +08: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
2227ceabde Merge pull request 'fix : 费用分摊同项目同人不能多次分摊判断' (#692) from dd into master
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/692
2024-08-11 14:39:20 +00:00
3e3d738362 fix : 费用分摊同项目同人不能多次分摊判断 2024-08-11 22:38:15 +08: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
c4ad13b09c Merge pull request 'fix : 下拉框箭头显示' (#690) from dd into master
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/690
2024-08-11 14:31:28 +00:00
48430951ef fix : 下拉框箭头显示 2024-08-11 22:31:14 +08: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
420605436c Merge pull request 'fix : 角色替换' (#688) from dd into master
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/688
2024-08-11 10:38:11 +00:00
a1fa0dab6a fix : 角色替换 2024-08-11 18:37:55 +08: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
09b1c86ceb Merge pull request 'fix : 征集说明/专项资金介绍换行格式, 需求征集列表页搜索框间距, 切换账号层级, 需求上报4种情况排版' (#686) from dd into master
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/686
2024-08-10 14:49:09 +00:00
3dbaf21281 fix : 征集说明/专项资金介绍换行格式, 需求征集列表页搜索框间距, 切换账号层级, 需求上报4种情况排版 2024-08-10 22:48:46 +08: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
433f0bc712 Merge pull request 'fix : 修改页面排版' (#684) from dd into master
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/684
2024-08-07 15:48:14 +00:00
e4d0b87069 fix : 修改页面排版 2024-08-07 23:47:49 +08: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
4b56a92444 Merge pull request 'fix : 选择框为远程搜索解决卡顿问题' (#682) from dd into master
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/682
2024-08-07 15:04:57 +00:00
3289e799be fix : 选择框为远程搜索解决卡顿问题 2024-08-07 23:04:46 +08: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
87d3493c34 Merge pull request 'dd' (#680) from dd into master
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/680
2024-08-07 14:51:22 +00:00
0250e3008b fix : 选择框为远程搜索解决卡顿问题 2024-08-07 22:51:04 +08:00
cab7311cfb fix : 新增(单选框)默认否,修复需求上报业务描述换行数据显示,选择框为远程搜索解决卡顿问题 2024-08-07 22:37:41 +08:00
89603d1094 Merge pull request 'dd' (#679) from dd into master
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/679
2024-08-07 14:00:39 +00:00
5cdec2b677 fix : 修复详情排版 2024-08-07 21:54:46 +08:00
66746458ee Merge remote-tracking branch 'origin/master' 2024-08-07 17:03:23 +08:00
lilinyuan
892e9c01f1 fix: 修复关闭其他 后地址参数清空bug 2024-08-07 17:02:58 +08:00
203b0c9753 Merge remote-tracking branch 'origin/master' 2024-08-07 15:28:50 +08:00
d9d2d446f6 fix : 修改审批记录打印按钮左边距 2024-08-07 00:46:05 +08: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
9ed6fc1b94 Merge pull request 'fix : 修改审批记录回退节点icon' (#677) from dd into master
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/677
2024-08-06 10:45:44 +00:00
74fd0a8610 fix : 修改审批记录回退节点icon 2024-08-06 18:45:31 +08: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
f99422a8e0 Merge pull request 'fix : drone' (#675) from dd into master
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/675
2024-08-06 10:33:06 +00:00
d27576ede2 fix : drone 2024-08-06 18:32:46 +08: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
d8a01ad3b1 Merge pull request 'fix : 修复详情排版' (#673) from dd into master
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/673
2024-08-06 10:27:01 +00:00
c61b06e8b2 fix : 修复详情排版 2024-08-06 18:26:47 +08: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
1b1e0a8174 Merge pull request 'fix : 需求上报详情删除重复项,优化台账上方基础信息排版,表格内容少时固定宽度,驳回弹窗'重新提交'改为'发起节点'' (#671) from dd into master
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/671
2024-08-06 07:06:51 +00:00
33e6ad37b9 fix : 需求上报详情删除重复项,优化台账上方基础信息排版,表格内容少时固定宽度,驳回弹窗'重新提交'改为'发起节点' 2024-08-06 15:06:29 +08: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
94155d2ca6 Merge pull request 'fix : 审批人和当前节点合并' (#669) from dd into master
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/669
2024-08-05 12:57:10 +00:00
ab191e940b fix : 审批人和当前节点合并 2024-08-05 20:56:43 +08:00
5f95f461a8 Merge pull request 'fix : 修复退回节点弹窗' (#668) from dd into master
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/668
2024-08-05 12:32:53 +00:00
173b928412 fix : 修复退回节点弹窗 2024-08-05 20:32:33 +08:00
f0d19e535c Merge pull request 'fix : 修复项目基本信息展示' (#667) from dd into master
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/667
2024-08-05 11:14:21 +00:00
63d8feb712 fix : 修复项目基本信息展示 2024-08-05 19:10:29 +08:00
ebccaaa12f Merge pull request 'dd' (#666) from dd into master
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/666
2024-08-05 09:26:35 +00:00
147d66c756 fix : 修复角色替换接口 2024-08-05 17:26:20 +08:00
04fff31b3a fix : 修改'经费预算'文字及页面排版 2024-08-05 17:22:23 +08: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
848f167bb6 Merge pull request 'feat : 对接人用户替换' (#664) from dd into master
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/664
2024-08-04 17:02:10 +00:00
ee869f3c34 feat : 对接人用户替换 2024-08-05 01:01:35 +08: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
clay
5f6f1a7912 feat : 研发人员选择 2024-08-04 21:01:43 +08: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
66bd341692 Merge pull request 'feat : 审批记录打印' (#661) from dd into master
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/661
2024-08-03 13:33:26 +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
28257ceefe feat : 审批记录打印 2024-08-03 21:32:00 +08:00
e2eed22d73 Merge pull request 'dd' (#659) from dd into master
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/659
2024-08-03 13:30:46 +00:00
790cac67ef feat : 审批记录打印 2024-08-03 21:30:26 +08:00
b6ddafdd25 feat : 审批记录打印 2024-08-03 21:29:33 +08:00
clay
bda93c9744 Merge remote-tracking branch 'origin/master'
# Conflicts:
#	src/components/NameCircle.vue
2024-08-03 20:56:30 +08:00
clay
2634e9b70c feat : 打印 2024-08-03 20:55:26 +08: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
f7fcd79251 Merge pull request 'fix : 修复阶段变更, 项目立项/验收部门分管领导编辑回显' (#657) from dd into master
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/657
2024-08-03 11:30:23 +00:00
25f4f33cb0 fix : 修复阶段变更, 项目立项/验收部门分管领导编辑回显 2024-08-03 19:30:12 +08: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
a5e3e269a1 Merge pull request 'fix : 修复需求上报详情排版' (#655) from dd into master
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/655
2024-08-03 10:32:29 +00:00
9d0d722880 fix : 修复需求上报详情排版 2024-08-03 18:29:05 +08: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
e0bfe67c7e Merge pull request 'fix : 修复移动端详情排版' (#653) from dd into master
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/653
2024-08-03 10:21:27 +00:00
eaed989525 fix : 修复移动端详情排版 2024-08-03 18:21:13 +08: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
77ff2143c3 Merge pull request 'fix : 修复需求上报详情排版' (#651) from dd into master
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/651
2024-08-03 06:17:11 +00:00
a55031ed70 fix : 修复需求上报详情排版 2024-08-03 14:16:53 +08: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
76d4254f5e Merge pull request 'fix : 需求上报详情加上项目影响, 需求/征集/阶段变更/分摊/专项资金/项目立项/验收/结项编辑加上审批记录, 新增时审批记录加上空提示' (#649) from dd into master
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/649
2024-08-03 05:21:54 +00:00
31928abbd1 fix : 需求上报详情加上项目影响, 需求/征集/阶段变更/分摊/专项资金/项目立项/验收/结项编辑加上审批记录, 新增时审批记录加上空提示 2024-08-03 13:21:18 +08: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
15ec2d909c Merge pull request 'fix : 修复部门分管领导回显,需求上报排版' (#647) from dd into master
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/647
2024-08-02 16:39:28 +00:00
fbfbe5c328 fix : 修复部门分管领导回显,需求上报排版 2024-08-03 00:36:51 +08: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
36e76b15b9 Merge pull request 'dd' (#645) from dd into master
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/645
2024-08-02 11:42:22 +00:00
6e612e1f7a fix : 修复抄送节点 2024-08-02 19:41:51 +08:00
9b698cfdb3 Merge remote-tracking branch 'origin/master' 2024-08-02 19:39:02 +08: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
clay
5111897d13 feat : 抄送和if判断 2024-08-02 19:36:37 +08:00
38631df3f9 fix : 修复编辑流程访问接口 2024-08-02 00:09:19 +08: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
36bb362fd7 Merge pull request 'fix : 修复页面排版及项目管理的公司查询' (#642) from dd into master
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/642
2024-08-01 14:16:45 +00:00
2f42a7464a fix : 修复页面排版及项目管理的公司查询 2024-08-01 22:16:30 +08: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
ff668b1887 Merge pull request 'fix : 表格前方加上序号' (#640) from dd into master
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/640
2024-08-01 09:01:18 +00:00
a4f94099af fix : 表格前方加上序号 2024-08-01 17:00:48 +08: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
40de9f0a4c Merge pull request 'fix : word表格预览手机端宽度适配' (#638) from dd into master
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/638
2024-07-26 17:22:11 +00:00
d265ef5a32 fix : word表格预览手机端宽度适配 2024-07-27 01:18:05 +08:00
a21f061589 Merge pull request 'feat : 台账模板下载' (#637) from dd into master
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/637
2024-07-26 11:46:21 +00:00
58c3419b35 feat : 台账模板下载 2024-07-26 19:46:06 +08: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
d92bcfe0aa Merge pull request 'fix : 多图片格式预览' (#635) from dd into master
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/635
2024-07-25 16:12:10 +00:00
055310b6e7 fix : 多图片格式预览 2024-07-26 00:11:44 +08: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
e0e5111f32 Merge pull request 'fix : 取消需求上报单文件权限' (#633) from dd into master
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/633
2024-07-25 15:14:30 +00:00
4acd0cbab1 fix : 取消需求上报单文件权限 2024-07-25 23:14:20 +08: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
39cb9400f6 Merge pull request 'fix : 修复抄送人回显及取消箭头' (#631) from dd into master
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/631
2024-07-25 14:10:27 +00:00
c6ddba8702 fix : 修复抄送人回显及取消箭头 2024-07-25 22:10:08 +08:00
clay
0fe2bb42ae Merge remote-tracking branch 'origin/master' 2024-07-25 21:24:34 +08:00
clay
e0b937fce9 feat : 抄送 2024-07-25 21:24:26 +08: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
c740929622 Merge pull request 'feat : 需求上报,项目立项,验收加上分管领导选择' (#629) from dd into master
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/629
2024-07-25 11:36:16 +00:00
8901053fd6 feat : 需求上报,项目立项,验收加上分管领导选择 2024-07-25 19:36:06 +08:00
15689dfbc1 Merge pull request 'fix : 修复编辑需求征集, 所有公司回显' (#628) from dd into master
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/628
2024-07-25 09:44:32 +00:00
ea660fff65 fix : 修复编辑需求征集, 所有公司回显 2024-07-25 17:44:22 +08:00
303e981a0c Merge pull request 'fix : 修复费用台账公司搜索,项目管理前置流程逗号分隔' (#627) from dd into master
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/627
2024-07-25 09:09:23 +00:00
bab9597739 fix : 修复费用台账公司搜索,项目管理前置流程逗号分隔 2024-07-25 17:09:05 +08: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
45104ecc87 Merge pull request 'fix : 修复流程图icon显示' (#625) from dd into master
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/625
2024-07-24 16:53:19 +00:00
6bb55520cf fix : 修复流程图icon显示 2024-07-25 00:52:51 +08: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
74d2033857 Merge pull request 'fix : 修复项目归档切换问题' (#623) from dd into master
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/623
2024-07-24 16:38:17 +00:00
8e8116e869 fix : 修复项目归档切换问题 2024-07-25 00:38:00 +08: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
5754709a21 Merge pull request 'fix : 修复审核意见显示' (#621) from dd into master
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/621
2024-07-24 14:30:38 +00:00
614bd328d1 fix : 修复审核意见显示 2024-07-24 22:29:53 +08:00
cc322f3352 Merge pull request 'fix : 还原drone.yml文件' (#620) from dd into master
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/620
2024-07-24 14:10:10 +00:00
328c75b2e4 fix : 还原drone.yml文件 2024-07-24 22:09:57 +08: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
1716a3a562 fix : 下载新依赖 2024-07-24 21:50:31 +08: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
5048c638b8 Merge remote-tracking branch 'origin/master' 2024-07-24 21:43:02 +08:00
b4e9359165 fix : 下载新依赖 2024-07-24 21:42:53 +08: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
42befadca5 Merge pull request 'fix : 下载新依赖' (#616) from dd into master
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/616
2024-07-24 13:40:53 +00:00
da2721ca56 fix : 下载新依赖 2024-07-24 21:40:29 +08: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
291f91bc61 Merge pull request 'fix : 下载新依赖' (#614) from dd into master
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/614
2024-07-24 13:32:45 +00:00
0c1aa248d5 fix : 下载新依赖 2024-07-24 21:32:33 +08: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
a13006d630 Merge pull request 'fix : 修复专项资金文件预览,优化上报前置流程展示' (#612) from dd into master
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/612
2024-07-24 13:22:14 +00:00
clay
fc0451ca32 feat : 动态前置流程 2024-07-24 21:21:36 +08:00
5664faccfe fix : 修复专项资金文件预览,优化上报前置流程展示 2024-07-24 20:05:29 +08:00
d769ec9755 Merge pull request 'feat : 前置流程组件' (#611) from dd into master
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/611
2024-07-24 11:42:33 +00:00
b9de011871 feat : 前置流程组件 2024-07-24 19:42:20 +08:00
d2e672e761 Merge pull request 'feat : 文件预览,项目详情文件表格展示' (#610) from dd into master
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/610
2024-07-24 10:18:11 +00:00
6cc409d744 feat : 文件预览,项目详情文件表格展示 2024-07-24 18:17:55 +08:00
clay
9506d3e0f6 feat : 流程判断条件添加 2024-07-24 18:14:38 +08:00
clay
b90ed53437 feat : 流程判断条件添加 2024-07-24 18:10:37 +08:00
clay
fe8ca80452 feat : 需求汇总年度计划审批前置流程选择 2024-07-24 00:28:42 +08:00
clay
1194f04eb6 feat : 需求汇总年度计划审批前置流程选择 2024-07-23 22:58:43 +08:00
clay
c7866f2e5e feat : 节点参数设置 2024-07-23 19:18:29 +08:00
clay
e5452741e9 Merge remote-tracking branch 'origin/master' 2024-07-23 17:42:31 +08: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
d87dd8985c Merge pull request 'fix : 修复组织机构显示及部门副职不能选择bug' (#608) from dd into master
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/608
2024-07-23 09:30:43 +00:00
342b64273c fix : 修复组织机构显示及部门副职不能选择bug 2024-07-23 17:30:27 +08:00
clay
3685174117 Merge remote-tracking branch 'origin/master'
# Conflicts:
#	src/api/workflow/process-user.js
#	src/views/system/organizationalStructure/index.vue
2024-07-23 17:02:57 +08:00
lilinyuan
7ee43a9b4d feat: up serachForm 2024-07-23 14:05:31 +08: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
ad7ca888a9 Merge pull request 'dd' (#606) from dd into master
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/606
2024-07-23 05:28:39 +00:00
838f2edf7e fix : 数据预览时左对齐 2024-07-22 23:06:20 +08:00
3c1fcc327c fix : 征集公司校验,单文件显示改为表格,手机端审批后刷新,需求征集回车触发搜索,组织机构管理搜索 2024-07-22 20:39:26 +08: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
162 changed files with 14064 additions and 4312 deletions

View File

@@ -25,9 +25,9 @@ steps:
- npm -v - npm -v
- mkdir -p ./node_modules - mkdir -p ./node_modules
- export NODE_MODULES_PATH=`pwd`/node_modules - export NODE_MODULES_PATH=`pwd`/node_modules
# - npm config set registry https://registry.npmmirror.com - npm config set registry https://registry.npmmirror.com
# - set NODE_OPTIONS=--openssl-legacy-provider - set NODE_OPTIONS=--openssl-legacy-provider
# - npm install - npm install
- npm run build - npm run build
- ls /app/build/$DRONE_REPO_NAME/ - ls /app/build/$DRONE_REPO_NAME/
- echo $NODE_MODULES_PATH - echo $NODE_MODULES_PATH
@@ -35,7 +35,7 @@ steps:
- name: build-docker-prod # 制作docker镜像 - name: build-docker-prod # 制作docker镜像
image: docker # 使用官方docker镜像 image: 10.7.127.190:38080/docker/docker # 使用官方docker镜像
volumes: # 将容器内目录挂载到宿主机 volumes: # 将容器内目录挂载到宿主机
- name: docker - name: docker
path: /var/run/docker.sock # 挂载宿主机的docker path: /var/run/docker.sock # 挂载宿主机的docker

View File

@@ -1,9 +1,11 @@
FROM nginx FROM 10.7.127.190:38080/nginx:latest
RUN rm -rf /etc/nginx/conf.d/default.conf 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

View File

@@ -1,2 +1,2 @@
# <EFBFBD><EFBFBD><EFBFBD>й<EFBFBD><EFBFBD><EFBFBD>ƽ̨ # 科技创新项目管理平台

View File

@@ -4,7 +4,7 @@
<meta charset="UTF-8"> <meta charset="UTF-8">
<link rel="icon" href="/favicon.ico"> <link rel="icon" href="/favicon.ico">
<meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>管理平台</title> <title>技创新项目管理平台</title>
</head> </head>
<body> <body>
<div id="app"></div> <div id="app"></div>

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;
@@ -39,6 +61,7 @@ http {
proxy_http_version 1.1; proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade; proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade'; proxy_set_header Connection 'upgrade';
client_max_body_size 30m;
} }
location / { location / {
@@ -46,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;
} }
}
}
} }

View File

@@ -12,6 +12,7 @@
"@tinymce/tinymce-vue": "^4.0.7", "@tinymce/tinymce-vue": "^4.0.7",
"axios": "^1.4.0", "axios": "^1.4.0",
"d3": "^7.8.5", "d3": "^7.8.5",
"docx-preview": "^0.3.2",
"echarts": "^5.4.2", "echarts": "^5.4.2",
"element-plus": "^2.6.0", "element-plus": "^2.6.0",
"file-saver": "^2.0.5", "file-saver": "^2.0.5",
@@ -31,6 +32,8 @@
"vue-codemirror": "^6.1.1", "vue-codemirror": "^6.1.1",
"vue-json-viewer": "^3.0.4", "vue-json-viewer": "^3.0.4",
"vue-router": "^4.1.6", "vue-router": "^4.1.6",
"vue3-pdf-app": "^1.0.3",
"vue3-print-nb": "^0.1.4",
"vuedraggable": "^4.1.0", "vuedraggable": "^4.1.0",
"xlsx": "^0.18.5", "xlsx": "^0.18.5",
"xlsx-style-vite": "^0.0.2" "xlsx-style-vite": "^0.0.2"

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

BIN
public/home1.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 750 KiB

BIN
public/home2.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 736 KiB

BIN
public/home3.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 743 KiB

BIN
public/home4.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 733 KiB

BIN
public/loading.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

BIN
public/people.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

211
public/upfiles.html Normal file
View File

@@ -0,0 +1,211 @@
<!doctype html>
<html>
<head>
<meta charset="utf-8" />
<title>axupimgs</title>
<meta name="viewport" content="user-scalable=no, width=device-width, initial-scale=1.0, maximum-scale=1.0"/>
<meta name="apple-mobile-web-app-capable" content="yes" />
<meta name="apple-mobile-web-app-status-bar-style" content="black" />
<meta name="format-detection" content="telephone=no">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" />
<style>
html,body{height:100%;margin:0;padding:0;background:#fff;}
ul{margin:0;padding:0;list-style:none;}
#wrap{padding:10px;}
#topbar{padding:10px 0;border-bottom:1px solid #ccc;text-align:right;}
#topbar button {margin:0;margin-left:5px;outline:none;padding: 4px 16px;box-sizing: border-box;
display:inline-block;border:none;border-radius:3px;text-align:center;cursor:pointer;
font-size:14px;line-height:1.5;background-color:#f0f0f0;color:#223;
}
#topbar button.primary{background-color:#3d97d4;color:#fff;}
#topbar button:hover{background-color:#207ab7;color:#fff;}
#topbar button.removeall{float:left}
#file_list {display:grid;grid-gap:10px;grid-template-columns:repeat(auto-fill,minmax(160px,1fr));padding-top:10px;}
#file_list:empty:after{content:'可以直接拖拽文件到这里';color:#777;font-size:0.8em;}
#file_list li{position:relative;display:block;vertical-align:top;padding:5px 5px;border-radius:5px;}
#file_list li.up-over {}
#file_list li.up-now {}
#file_list li.up-now:after{content:'';position:absolute;top:0;left:0;display:block;width:100%;height:100%;background:rgba(255,255,255,0.8) url(loading.gif) center center no-repeat;border-radius:5px;z-index:999;}
#file_list li:hover{background-color:#ddd;}
#file_list li .picbox {display:flex;flex:0 0 auto;justify-content:center;overflow:hidden;position:relative;width:100%;padding-top:100%;align-items:center;}
#file_list li .picbox img {display:block;max-width:100%;max-height:100%;position:absolute;
top:50%;left:50%;transform:translateX(-50%) translateY(-50%);}
#file_list li.up-over .picbox:after{content:url('data:image/svg+xml;%20charset=utf8,%3Csvg%20viewBox%3D%220%200%201024%201024%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2224%22%20height%3D%2224%22%3E%3Cpath%20d%3D%22M512%200C229.376%200%200%20229.376%200%20512s229.376%20512%20512%20512%20512-229.376%20512-512S794.624%200%20512%200z%22%20fill%3D%22%234AC711%22%3E%3C%2Fpath%3E%3Cpath%20d%3D%22M855.552%20394.752l-358.4%20358.4a50.9952%2050.9952%200%200%201-72.192%200l-204.8-204.8c-18.944-19.968-18.944-51.2%200-71.168a50.5344%2050.5344%200%200%201%2072.192-1.024L460.8%20644.608l322.048-322.048c19.968-18.944%2051.2-18.944%2071.168%200%2020.48%2019.456%2020.992%2051.712%201.536%2072.192z%22%20fill%3D%22%23FFFFFF%22%3E%3C%2Fpath%3E%3C%2Fsvg%3E');position:absolute;bottom:2px;right:2px;z-index:9;}
#file_list li .tools {display:none;position:absolute;bottom:5px;right:5px;z-index:99;}
#file_list li:hover .tools {display:block;}
#file_list li .tools .remove{cursor:pointer;}
#file_list li .tools .remove:after{content:url('data:image/svg+xml;%20charset=utf8,%3Csvg%20width=%2224%22%20height=%2224%22%20viewBox=%220%200%2024%2024%22%20xmlns=%22http://www.w3.org/2000/svg%22%3E%3Cpath%20d=%22M17%206h3a1%201%200%200%201%200%202h-1v11a3%203%200%200%201-3%203H8a3%203%200%200%201-3-3V8H4a1%201%200%201%201%200-2h3V5a3%203%200%200%201%203-3h4a3%203%200%200%201%203%203v1zm-2%200V5a1%201%200%200%200-1-1h-4a1%201%200%200%200-1%201v1h6zm2%202H7v11a1%201%200%200%200%201%201h8a1%201%200%200%200%201-1V8zm-8%203a1%201%200%200%201%202%200v6a1%201%200%200%201-2%200v-6zm4%200a1%201%200%200%201%202%200v6a1%201%200%200%201-2%200v-6z%22%3E%3C/path%3E%3C/svg%3E');}
#file_list li .namebox {font-size:14px;line-height:20px;max-height:40px;overflow:hidden;padding:5px 10px;text-align:center;display:flex;justify-content:center;align-items:flex-start;}
#file_list li .namebox span{word-break:break-all;vertical-align:top;}
</style>
</head>
<body>
<div id="wrap">
<div id="topbar"><button class="addfile primary">+ 添加文件</button><button class="removeall">清空列表</button></div>
<ul id="file_list"></ul>
</div>
<script>
var editor=parent.tinymce.activeEditor;
var axupimgs=parent.axupimgs;
axupimgs.res = []; //存放本地文件的数组
var blobInfo = {file:null}
blobInfo.blob = function(){return this.file;}
var upload_handler = axupimgs.images_upload_handler;
var upload_base_path = axupimgs.images_upload_base_path;
//为列表添加排序
function reSort(){
document.querySelectorAll('#file_list li').forEach((el,i)=>{
el.setAttribute('data-num',i);
});
}
function addList(files){
var files_sum = files.length;
var vDom = document.createDocumentFragment();
for(let i=0;i<files_sum;i++){
let file = files[i];
let blobUrl = window.URL.createObjectURL(file)
axupimgs.res.push({file:file,blobUrl:blobUrl,url:''});
let li = document.createElement('li');
li.setAttribute('class','up-no');
li.setAttribute('data-time',file.lastModified);
li.innerHTML='<div class="picbox"><img src="'+blobUrl+'"></div><div class="namebox"><span>'+file.name+'</span></div><div class="tools"><a class="remove"></a></div>';
vDom.appendChild(li);
}
document.querySelector('#file_list').appendChild(vDom);
if(axupimgs.res.length>0){
document.querySelectorAll('#file_list li.up-no').forEach((el,i)=>{
el.classList ? el.classList.add('up-now') : el.className+=' up-now';
});
upAllFiles(0);
}
//reSort();
}
//清空列表
document.querySelector('#topbar .removeall').addEventListener('click',()=>{
axupimgs.res=[]
document.querySelectorAll('#file_list li').forEach((el,i)=>{
el.parentNode.removeChild(el)
});
});
//拖拽添加
document.addEventListener('dragover', (e)=>{
e.stopPropagation();
e.preventDefault();
e.dataTransfer.dropEffect = 'copy';
});
document.addEventListener('drop', (e)=>{
e.stopPropagation();
e.preventDefault();
if(!e.dataTransfer.files){return false;}
var dropfiles = e.dataTransfer.files;
if(!(dropfiles.length>0)){return false;}
var exts=axupimgs.axupimgs_filetype.replace(/(\s)+/g,'').toLowerCase().split(',');
var files=[];
for( let file of dropfiles ){
ext = file.name.split('.');
ext = '.'+ext[ext.length-1];
for(let s of exts){
if(s==ext){
files.push(file);
break;
}
}
}
if(files.length>0){ addList(files) }
});
//添加文件
document.querySelector('#topbar .addfile').addEventListener('click',()=>{
var input = document.createElement('input');
input.setAttribute('type', 'file');
input.setAttribute('multiple', 'multiple');
input.setAttribute('accept', axupimgs.axupimgs_filetype);
input.click();
input.onchange = function() {
var files = this.files;
addList(files);
}
});
var file_i = 0;
function upAllFiles(n){
var len = axupimgs.res.length;
file_i = n;
if(len == n){
file_i=0;
// document.querySelector('#topbar .upall').innerText='全部上传';
return true;
}
if( axupimgs.res[n].url!='' ){
n++;
upAllFiles(n)
}else{
blobInfo.file=axupimgs.res[n].file;
upload_handler(blobInfo,function(url,name){
if(upload_base_path){
if(upload_base_path.slice(-1)=='/' && url.substr(0,1)=='/' ){
url = upload_base_path + url.slice(1);
}else if(upload_base_path.slice(-1)!='/' && url.substr(0,1)!='/' ){
url = upload_base_path + '/' + url;
}else{
url = upload_base_path + url;
}
}
axupimgs.res[file_i].url = url;
// filename = url.split('/').pop();
filename = name
var li = document.querySelectorAll('#file_list li')[file_i];
li.setAttribute('class','up-over');
li.querySelector('.namebox span').innerText = filename;
n++
upAllFiles(n);
},function(err){
// document.querySelector('#topbar .upall').innerText='全部上传';
// document.querySelectorAll('#file_list li.up-now').forEach((el,i)=>{
// el.setAttribute('class','up-no');
// });
// alert(err);
});
}
}
//
// document.querySelector('#topbar .upall').addEventListener('click',(e)=>{
// if(e.target.innerText!='全部上传'){return false;}
// if(axupimgs.res.length>0){
// document.querySelectorAll('#file_list li.up-no').forEach((el,i)=>{
// el.classList ? el.classList.add('up-now') : el.className+=' up-now';
// });
// e.target.innerText='上传中...';
// upAllFiles(0);
// }
// });
var observ_flist = new MutationObserver( (muList,observe)=>{
if(muList[0].addedNodes.length>0){
muList[0].addedNodes.forEach((el)=>{
el.querySelector('.remove').addEventListener('click',(e)=>{
var li = e.target.parentNode.parentNode;
var n = li.getAttribute('data-num');
var el = document.querySelectorAll('#file_list li')[n];
el.parentNode.removeChild(el);
axupimgs.res.splice(n,1);
});
});
}
reSort();
});
observ_flist.observe(document.querySelector('#file_list'),{childList:true});
</script>
</body>
</html>

36
src/api/article/index.js Normal file
View File

@@ -0,0 +1,36 @@
import request from '@/utils/request.js'
export const getArticle = (params) => {
return request({
url: '/workflow/mosr/article/list',
method: "get",
params
});
};
export const getArticleDetail = (articleId) => {
return request({
url: `/workflow/mosr/article/${articleId}`,
method: "get"
});
};
export const addArticle= (data) => {
return request({
url: '/workflow/mosr/article/add',
method: "post",
data
});
};
export const editArticle= (data) => {
return request({
url: '/workflow/mosr/article/update',
method: "post",
data
});
};
export const deleteArticle = (articleIds) => {
return request({
url: `/workflow/mosr/article/${articleIds}`,
method: "delete"
});
};

View File

@@ -14,3 +14,18 @@ export const editPassword=(data)=>{
data data
}) })
} }
export const getAgentInfo=()=>{
return request({
url:'/admin/mosr/user/self/approval/agent',
method:'get'
})
}
export const editAgentInfo=(data)=>{
return request({
url:'/admin/mosr/user/self/approval/agent',
method:'post',
data
})
}

View File

@@ -1,8 +1,31 @@
import request from '@/utils/request.js' import request from '@/utils/request.js'
export const getHomeInfo = () => { export const getHomeTaskInfo = () => {
return request({ return request({
url: '/workflow/mosr/process/task', url: '/workflow/mosr/process/task',
method: "get" method: "get"
}); });
}; };
//获取已办数据
export const getDoneTaskInfo = () => {
return request({
url: '/workflow/mosr/process/task/about',
method: "get"
});
};
//获取专项资金饼图数据
export const getSpecialFundChart = () => {
return request({
url: '/workflow/home/page/statistic',
method: "get"
});
};
//获取首页四个统计数量
export const getHomeStatistics = () => {
return request({
url: '/workflow/mosr/process/task/statistics',
method: "get"
});
};

View File

@@ -1,4 +1,7 @@
import request from '@/utils/request.js' import request from '@/utils/request.js'
import axios from "axios";
import {getToken} from "@/utils/auth";
//需求征集 //需求征集
export const getDemandInfo = (param) => { export const getDemandInfo = (param) => {
return request({ return request({
@@ -7,6 +10,12 @@ export const getDemandInfo = (param) => {
params: param params: param
}); });
}; };
export const filterRequirementName = (requirementName) => {
return request({
url: `/workflow/mosr/requirement/match/${requirementName}`,
method: "get"
});
};
export const getWorkflowInfo = () => { export const getWorkflowInfo = () => {
return request({ return request({
url: '/workflow/mosr/requirement/process', url: '/workflow/mosr/requirement/process',
@@ -88,3 +97,32 @@ export const getRequirementStatePerm = () => {
method: "get" method: "get"
}); });
}; };
export const downloadTemplate = (type) => {
return request({
url: '/workflow/mosr/attachment/download/template',
method: "get",
responseType:'blob',
params:{
type:type
}
});
};
export const downloadTemplateZip = (typeList) => {
return axios.get(
`${import.meta.env.VITE_BASE_URL}/workflow/mosr/attachment/download/pack?typeList=${typeList}`,
{
responseType: 'blob',
headers: {
Authorization: getToken()
},
}
);
// return request({
// url: '/workflow/mosr/attachment/download/pack',
// method: "get",
// responseType:'blob',
// params:{
// typeList:typeList
// }
// });
};

View File

@@ -18,6 +18,13 @@ export const requirementReported = (data) => {
data: data data: data
}); });
}; };
//需求汇总-征集名称关键词匹配
export const getRequirementName = (requirementName) => {
return request({
url: `/workflow/mosr/requirement/collect/project/match/${requirementName}`,
method: "get"
});
};
//获取需求上报 流程信息 //获取需求上报 流程信息
export const getProcessInfo = (specialFund) => { export const getProcessInfo = (specialFund) => {
return request({ return request({
@@ -89,3 +96,18 @@ export const approvePlan= (data) => {
}); });
}; };
export const getProjectOption = () => {
return request({
url: '/workflow/mosr/requirement/master',
method: "get"
});
};
export const getRequirementOption = () => {
return request({
url: '/workflow/mosr/requirement/option',
method: "get"
});
};

View File

@@ -8,6 +8,13 @@ export const searchFileList = (params) => {
params: params params: params
}); });
}; };
export const searchAllFileList = (params) => {
return request({
url: '/workflow/mosr/attachment/all',
method: "get",
params: params
});
};
export const uploadFileList = (data) => { export const uploadFileList = (data) => {
return request({ return request({
url: '/workflow/mosr/attachment/upload', url: '/workflow/mosr/attachment/upload',

View File

@@ -8,6 +8,12 @@ export const getApplyProcess = (projectId) => {
method: "get" method: "get"
}); });
}; };
export const filterProjectName = (projectName,targetState) => {
return request({
url: `/workflow/mosr/project/approval/match/${projectName}/${targetState}`,
method: "get"
});
};
export const projectApply = (data) => { export const projectApply = (data) => {
return request({ return request({
url: '/workflow/mosr/project/approval/initiation/apply', url: '/workflow/mosr/project/approval/initiation/apply',
@@ -179,3 +185,15 @@ export const exportExcel = (data) => {
} }
); );
}; };
//台账模板下载
export const ledgerTemplateDownload = () => {
return axios.get(
`${import.meta.env.VITE_BASE_URL}/workflow/mosr/project/implementation/download/template`,
{
responseType: 'blob',
headers: {
Authorization: getToken()
}
}
);
};

View File

@@ -0,0 +1,36 @@
import request from '@/utils/request.js'
export const getResearchFundChart = (year) => {
return request({
url: '/workflow/mosr/rd/home',
method: 'get',
params: {year:year}
})
}
export const getResearchFundDetail = (rdFundId) => {
return request({
url: `/workflow/mosr/rd/${rdFundId}`,
method: "get"
});
};
export const addResearchFund= (data) => {
return request({
url: '/workflow/mosr/rd/add',
method: "post",
data
});
};
export const editResearchFund= (data) => {
return request({
url: '/workflow/mosr/rd/update',
method: "post",
data
});
};
export const deleteResearchFund = (rdFundIds) => {
return request({
url: `/workflow/mosr/rd/${rdFundIds}`,
method: "delete"
});
};

View File

@@ -20,3 +20,11 @@ export const getCompanyDetail=(companyId)=>{
method:'get' method:'get'
}) })
} }
export const setCompanyLeader=(data)=>{
return request({
url:'/admin/mosr/sub/company/leader',
method:'post',
data:data
})
}

View File

@@ -21,6 +21,12 @@ export const getUserAccount = () => {
method: 'get' method: 'get'
}) })
} }
export const judgeIsSameRole = (userId) => {
return request({
url: `/admin/mosr/user/company/same/${userId}`,
method: 'get'
})
}
// 查询角色信息 // 查询角色信息
export const getRolesOpt = () => { export const getRolesOpt = () => {
@@ -38,6 +44,13 @@ export const getJobOpt = () => {
}) })
} }
export const getMosrUserList = (params) => {
return request({
url: '/admin/mosr/user',
method: 'get',
params
})
}
export const getUserList = (params) => { export const getUserList = (params) => {
return request({ return request({
url: '/admin/user', url: '/admin/user',
@@ -206,3 +219,33 @@ export const checkMatrix = (userId) => {
method: 'get' method: 'get'
}) })
} }
export const getAgentInfo=(userId)=>{
return request({
url: `/admin/mosr/user/approval/agent/${userId}`,
method:'get'
})
}
export const editAgentInfo=(data)=>{
return request({
url:'/admin/mosr/user/approval/agent',
method:'post',
data
})
}
export const addWhiteUser=(data)=>{
return request({
url:'/admin/approve/white',
method:'post',
data
})
}
export const delWhiteUser=(data)=>{
return request({
url:'/admin/approve/white',
method:'delete',
data
})
}

View File

@@ -1,10 +1,11 @@
import request from '@/utils/request.js' import request from '@/utils/request.js'
//根据角色或者部门获取到对应的数据 //根据角色或者部门获取到对应的数据
export function getUserTree(type, chooseId) { export function getUserTree(type,chooseId){
return request({ return request({
url: `/admin/user/choose/${type}/${chooseId}`, url:`/admin/user/choose/${type}/${chooseId}`,
method: 'get' method:'get'
}) })
} }
@@ -15,7 +16,6 @@ export function getRole() {
method: 'get' method: 'get'
}) })
} }
//获取采取树形控件的部门option //获取采取树形控件的部门option
export function getDepartmentTree() { export function getDepartmentTree() {
return request({ return request({
@@ -23,12 +23,11 @@ export function getDepartmentTree() {
method: 'get' method: 'get'
}) })
} }
export function getMosrUser(params) { export function getMosrUser(params) {
return request({ return request({
url: '/admin/mosr/user/choose', url: '/admin/mosr/user/choose',
method: 'get', method: 'get',
params: params params:params
}) })
} }
@@ -36,10 +35,9 @@ export function getOrganizationStructure(params) {
return request({ return request({
url: '/admin/organizational/structure/choose', url: '/admin/organizational/structure/choose',
method: 'get', method: 'get',
params: params params:params
}) })
} }
export function getOrganizationStructureTree(params) { export function getOrganizationStructureTree(params) {
return request({ return request({
url: '/admin/organizational/structure/tree', url: '/admin/organizational/structure/tree',

View File

@@ -0,0 +1,77 @@
tinymce.PluginManager.add('axupimgs', function (editor, url) {
var pluginName = '多图片上传';
window.axupimgs = {}; //扔外部公共变量,也可以扔一个自定义的位置
const baseURL = import.meta.env.VITE_BASE_URL
// var baseURL=tinymce.baseURL;
var iframe1 = '/upfiles.html';
console.log('editor',editor)
axupimgs.images_upload_handler = editor.getParam('images_upload_handler_not_loading', undefined, 'function');
axupimgs.images_upload_base_path = editor.getParam('images_upload_base_path', '', 'string');
axupimgs.axupimgs_filetype = editor.getParam('axupimgs_filetype', '.png,.gif,.jpg,.jpeg', 'string');
axupimgs.res = [];
var openDialog = function () {
return editor.windowManager.openUrl({
title: pluginName,
size: 'large',
url: iframe1,
buttons: [
{
type: 'cancel',
text: 'Close'
},
{
type: 'custom',
text: 'Save',
name: 'save',
primary: true
},
],
onAction: function (api, details) {
switch (details.name) {
case 'save':
var html = '';
var imgs = axupimgs.res;
var len = imgs.length;
for (let i = 0; i < len; i++) {
if (imgs[i].url) {
html += '<img src="' + imgs[i].url + '" />';
}
}
editor.insertContent(html);
axupimgs.res = [];
api.close();
break;
default:
break;
}
}
});
};
editor.ui.registry.getAll().icons.axupimgs || editor.ui.registry.addIcon('axupimgs', '<svg viewBox="0 0 1280 1024" xmlns="http://www.w3.org/2000/svg" width="24" height="24"><path d="M1126.2,779.8V87.6c0-24-22.6-86.9-83.5-86.9H83.5C14.7,0.7,0,63.7,0,87.7v692c0,36.2,29.2,89.7,83.5,89.7l959.3-1.3c51.7,0,83.5-42.5,83.5-88.3zm-1044,4V86.3h961.6V783.7H82.2v0.1z" fill="#53565A"/><path d="M603,461.6L521.1,366.3,313,629.8,227.2,546.8,102.4,716.8H972.8v-170L768.2,235.2,603.1,461.6zM284.6,358.4a105.4,105.4,0,0,0,73.5-30c19.5-19.1,30.3-45,30.2-71.8,0-56.8-45.9-103-102.4-103-56.6,0-102.4,46.1-102.4,103C183.4,313.5,228,358.4,284.6,358.4z" fill="#9598A0"/><path d="M1197.7,153.6l-0.3,669.3s13.5,113.9-67.4,113.9H153.6c0,24.1,23.9,87.2,83.5,87.2h959.3c58.3,0,83.6-49.5,83.6-89.9V240.8c-0.1-41.8-44.9-87.2-82.3-87.2z" fill="#53565A"/></svg>');
editor.ui.registry.addButton('axupimgs', {
icon: 'axupimgs',
tooltip: pluginName,
onAction: function () {
openDialog();
}
});
editor.ui.registry.addMenuItem('axupimgs', {
icon: 'axupimgs',
text: '图片批量上传...',
onAction: function () {
openDialog();
}
});
return {
getMetadata: function () {
return {
name: pluginName,
url: "http://tinymce.ax-z.cn/more-plugins/axupimgs.php",
};
}
};
});

75
src/assets/axupimgs/plugin.min.js vendored Normal file
View File

@@ -0,0 +1,75 @@
tinymce.PluginManager.add('axupimgs', function(editor, url) {
var pluginName='Ax多图片上传';
window.axupimgs={}; //扔外部公共变量,也可以扔一个自定义的位置
var baseURL=tinymce.baseURL;
var iframe1 = baseURL+'/plugins/axupimgs/upfiles.html';
axupimgs.images_upload_handler = editor.getParam('images_upload_handler', undefined, 'function');
axupimgs.images_upload_base_path = editor.getParam('images_upload_base_path', '', 'string');
axupimgs.axupimgs_filetype = editor.getParam('axupimgs_filetype', '.png,.gif,.jpg,.jpeg', 'string');
axupimgs.res=[];
var openDialog = function() {
return editor.windowManager.openUrl({
title: pluginName,
size: 'large',
url:iframe1,
buttons: [
{
type: 'cancel',
text: 'Close'
},
{
type: 'custom',
text: 'Save',
name: 'save',
primary: true
},
],
onAction: function (api, details) {
switch (details.name) {
case 'save':
var html = '';
var imgs = axupimgs.res;
var len = imgs.length;
for(let i=0;i<len;i++){
if( imgs[i].url ){
html += '<img src="'+imgs[i].url+'" />';
}
}
editor.insertContent(html);
axupimgs.res=[];
api.close();
break;
default:
break;
}
}
});
};
editor.ui.registry.getAll().icons.axupimgs || editor.ui.registry.addIcon('axupimgs','<svg viewBox="0 0 1280 1024" xmlns="http://www.w3.org/2000/svg" width="24" height="24"><path d="M1126.2,779.8V87.6c0-24-22.6-86.9-83.5-86.9H83.5C14.7,0.7,0,63.7,0,87.7v692c0,36.2,29.2,89.7,83.5,89.7l959.3-1.3c51.7,0,83.5-42.5,83.5-88.3zm-1044,4V86.3h961.6V783.7H82.2v0.1z" fill="#53565A"/><path d="M603,461.6L521.1,366.3,313,629.8,227.2,546.8,102.4,716.8H972.8v-170L768.2,235.2,603.1,461.6zM284.6,358.4a105.4,105.4,0,0,0,73.5-30c19.5-19.1,30.3-45,30.2-71.8,0-56.8-45.9-103-102.4-103-56.6,0-102.4,46.1-102.4,103C183.4,313.5,228,358.4,284.6,358.4z" fill="#9598A0"/><path d="M1197.7,153.6l-0.3,669.3s13.5,113.9-67.4,113.9H153.6c0,24.1,23.9,87.2,83.5,87.2h959.3c58.3,0,83.6-49.5,83.6-89.9V240.8c-0.1-41.8-44.9-87.2-82.3-87.2z" fill="#53565A"/></svg>');
editor.ui.registry.addButton('axupimgs', {
icon: 'axupimgs',
tooltip: pluginName,
onAction: function() {
openDialog();
}
});
editor.ui.registry.addMenuItem('axupimgs', {
icon: 'axupimgs',
text: '图片批量上传...',
onAction: function() {
openDialog();
}
});
return {
getMetadata: function() {
return {
name: pluginName,
url: "http://tinymce.ax-z.cn/more-plugins/axupimgs.php",
};
}
};
});

BIN
src/assets/home/home1.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 750 KiB

BIN
src/assets/home/home2.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 736 KiB

BIN
src/assets/home/home3.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 743 KiB

BIN
src/assets/home/home4.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 733 KiB

View File

@@ -60,7 +60,7 @@ html, body, #app, .el-container, .el-aside, .el-main {
top: 0; top: 0;
bottom: 0; bottom: 0;
left: 0; left: 0;
z-index: 1001; //z-index: 1001;
} }
.el-dialog { .el-dialog {
@@ -374,6 +374,9 @@ html, body, #app, .el-container, .el-aside, .el-main {
left: 200px; left: 200px;
} }
//.el-overlay-dialog {
// left: 200px !important;
//}
//放大缩小按钮上外边距 //放大缩小按钮上外边距
.scale { .scale {
margin-top: 10px; margin-top: 10px;
@@ -382,12 +385,10 @@ html, body, #app, .el-container, .el-aside, .el-main {
//top: -20px; //top: -20px;
} }
.el-overlay-dialog {
left: 200px !important;
}
.el-overlay-dialog::-webkit-scrollbar, .scrollbar-dict::-webkit-scrollbar { .el-overlay-dialog::-webkit-scrollbar, .scrollbar-dict::-webkit-scrollbar {
width: 6px; width: 6px;
height: 6px;
} }
// 滚动条轨道 // 滚动条轨道
@@ -473,7 +474,11 @@ html, body, #app, .el-container, .el-aside, .el-main {
width: 1.8em; width: 1.8em;
height: 1.7em; height: 1.7em;
} }
.home-time{
width: 1.4em;
height: 1.4em;
margin-right: 5px;
}
.middle-icon { .middle-icon {
width: 1.4em; width: 1.4em;
height: 1.4em; height: 1.4em;
@@ -553,7 +558,7 @@ html, body, #app, .el-container, .el-aside, .el-main {
// 操作页面底部按钮 // 操作页面底部按钮
.oper-page-btn { .oper-page-btn {
position: fixed; position: fixed;
bottom: 15px; top: 135px;
right: 15px; right: 15px;
z-index: 5; z-index: 5;
} }

View File

@@ -0,0 +1 @@
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1726060385019" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="8147" data-spm-anchor-id="a313x.search_index.0.i14.42e13a81ABrE1q" xmlns:xlink="http://www.w3.org/1999/xlink" width="128" height="128"><path d="M514 514m-448 0a448 448 0 1 0 896 0 448 448 0 1 0-896 0Z" fill="#bfbfbf" p-id="8148" data-spm-anchor-id="a313x.search_index.0.i9.42e13a81ABrE1q" class=""></path><path d="M542 543.4h-56v-310c0-16.6 13.4-30 30-30 14.4 0 26 11.6 26 26v314z" fill="#ffffff" p-id="8149" data-spm-anchor-id="a313x.search_index.0.i10.42e13a81ABrE1q" class="selected"></path><path d="M809.4 515.7v-4c0-14.4-11.6-26-26-26h-284v56h284c14.4 0 26-11.6 26-26z" fill="#ffffff" p-id="8150" data-spm-anchor-id="a313x.search_index.0.i8.42e13a81ABrE1q" class=""></path></svg>

After

Width:  |  Height:  |  Size: 934 B

View File

@@ -1,6 +0,0 @@
<svg width="71" height="68" viewBox="0 0 71 68" fill="none" xmlns="http://www.w3.org/2000/svg">
<g id="Group 229">
<ellipse id="Ellipse 12" cx="35.3747" cy="33.663" rx="35.3747" ry="33.663" fill="#87C3ED"/>
<path id="Subtract" fill-rule="evenodd" clip-rule="evenodd" d="M23.3174 21.8325C23.3174 20.7279 24.2128 19.8325 25.3174 19.8325H28.485V23.3688C28.485 23.9211 28.9327 24.3688 29.485 24.3688H32.7358C33.288 24.3688 33.7358 23.9211 33.7358 23.3688V19.8325H45.4049C46.5094 19.8325 47.4049 20.7279 47.4049 21.8325V44.741C47.4049 45.8456 46.5094 46.741 45.4049 46.741H25.3174C24.2128 46.741 23.3174 45.8456 23.3174 44.741V21.8325ZM32.7358 19.8325H29.485V23.3688L32.7358 23.3688V19.8325ZM28.876 29.1297H39.9933V28.1297H28.876V29.1297ZM41.8462 34.4079H28.876V33.4079H41.8462V34.4079ZM41.8462 39.6862H28.876V38.6862H41.8462V39.6862Z" fill="#0043C5"/>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 860 B

View File

@@ -1,6 +0,0 @@
<svg width="71" height="68" viewBox="0 0 71 68" fill="none" xmlns="http://www.w3.org/2000/svg">
<g id="Group 230">
<ellipse id="Ellipse 13" cx="35.3747" cy="33.663" rx="35.3747" ry="33.663" fill="#B487ED"/>
<path id="Subtract" fill-rule="evenodd" clip-rule="evenodd" d="M41.1045 20.8325C41.1045 20.2802 40.6568 19.8325 40.1045 19.8325H26.1016C24.997 19.8325 24.1016 20.7279 24.1016 21.8325V44.741C24.1016 45.8456 24.997 46.741 26.1016 46.741H46.189C47.2936 46.741 48.189 45.8456 48.189 44.741V27.5596C48.189 27.0073 47.7413 26.5596 47.189 26.5596H42.1045C41.5522 26.5596 41.1045 26.1118 41.1045 25.5596V20.8325ZM43.9383 31.0958H31.1861V30.0958H43.9383V31.0958ZM35.4369 23.0234H39.6876V22.0234H35.4369V23.0234ZM43.9383 36.4777H31.1861V35.4777H43.9383V36.4777ZM31.1861 41.8593H43.9383V40.8593H31.1861V41.8593Z" fill="#8600C5"/>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 838 B

View File

@@ -1,6 +0,0 @@
<svg width="71" height="68" viewBox="0 0 71 68" fill="none" xmlns="http://www.w3.org/2000/svg">
<g id="Group 231">
<ellipse id="Ellipse 14" cx="35.3747" cy="33.663" rx="35.3747" ry="33.663" fill="#FDCB9D"/>
<path id="Subtract" fill-rule="evenodd" clip-rule="evenodd" d="M54.4044 32.614C54.4044 40.4161 46.1575 46.741 35.9845 46.741C32.9189 46.741 30.0281 46.1666 27.4852 45.1505C27.3501 45.3211 27.1528 45.4524 26.9047 45.5078L19.6131 47.1386C18.844 47.3106 18.1654 46.6256 18.393 45.9072L20.2692 39.9868C18.5537 37.8406 17.5647 35.3159 17.5647 32.614C17.5647 24.8119 25.8115 18.4871 35.9845 18.4871C46.1575 18.4871 54.4044 24.8119 54.4044 32.614ZM28.1916 34.6321C29.3654 34.6321 30.317 33.7286 30.317 32.614C30.317 31.4994 29.3654 30.5958 28.1916 30.5958C27.0178 30.5958 26.0662 31.4994 26.0662 32.614C26.0662 33.7286 27.0178 34.6321 28.1916 34.6321ZM38.8184 32.614C38.8184 33.7286 37.8669 34.6321 36.6931 34.6321C35.5193 34.6321 34.5677 33.7286 34.5677 32.614C34.5677 31.4994 35.5193 30.5958 36.6931 30.5958C37.8669 30.5958 38.8184 31.4994 38.8184 32.614ZM45.1945 34.6321C46.3683 34.6321 47.3198 33.7286 47.3198 32.614C47.3198 31.4994 46.3683 30.5958 45.1945 30.5958C44.0207 30.5958 43.0691 31.4994 43.0691 32.614C43.0691 33.7286 44.0207 34.6321 45.1945 34.6321Z" fill="#F47D0E"/>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 1.3 KiB

View File

@@ -1,6 +0,0 @@
<svg width="71" height="68" viewBox="0 0 71 68" fill="none" xmlns="http://www.w3.org/2000/svg">
<g id="Group 232">
<ellipse id="Ellipse 19" cx="35.3747" cy="33.663" rx="35.3747" ry="33.663" fill="#87EDBC"/>
<path id="Subtract" fill-rule="evenodd" clip-rule="evenodd" d="M18.7023 20.134C18.1358 20.4872 17.7588 21.1158 17.7588 21.8325V42.0502C17.7588 43.1547 18.6542 44.0502 19.7588 44.0502H48.3477C49.4523 44.0502 50.3477 43.1547 50.3477 42.0502V21.8325C50.3477 21.1082 49.9627 20.4738 49.3861 20.1229L49.9153 20.9221L35.7553 30.2976C34.9339 30.8415 33.8697 30.8523 33.0374 30.3252L18.1997 20.9276L18.7023 20.134ZM18.7605 20.0991L33.5725 29.4804C34.0718 29.7966 34.7104 29.7902 35.2032 29.4638L49.3465 20.0993C49.0526 19.9296 48.7115 19.8325 48.3477 19.8325H19.7588C19.3952 19.8325 19.0543 19.9295 18.7605 20.0991Z" fill="#01A054"/>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 845 B

View File

@@ -0,0 +1 @@
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1726897356959" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="4330" xmlns:xlink="http://www.w3.org/1999/xlink" width="256" height="256"><path d="M26.293 1022.219c-14.41 0-26.122-11.652-26.122-26.006 0-14.41 11.712-26.182 26.122-26.182h818.455c69.64 0 126.306-58.5 126.306-130.379l-0.174-679.348c0-14.525 11.654-26.236 26.009-26.236 14.41 0 26.178 11.711 26.178 26.236l0.115 679.348c0 100.699-80.03 182.566-178.434 182.566H26.293z" fill="#2c2c2c" p-id="4331"></path><path d="M679.977 873.811c-14.41 0-26.063-11.654-26.063-26.006V674.537c0-14.352 11.653-26.006 26.063-26.006s26.124 11.654 26.124 26.006v173.268c0 14.351-11.714 26.006-26.124 26.006zM504.759 873.811c-14.354 0-26.009-11.654-26.009-26.006v-186.76c0-14.352 11.655-26.006 26.009-26.006 14.41 0 26.065 11.654 26.065 26.006v186.76c0 14.351-11.655 26.006-26.065 26.006zM336.313 873.811c-14.41 0-26.122-11.654-26.122-26.006v-92.26c0-14.412 11.712-26.123 26.122-26.123 14.354 0 25.894 11.711 25.894 26.123v92.26c0 14.351-11.54 26.006-25.894 26.006zM174.357 873.811c-14.354 0-26.009-11.654-26.009-26.006v-85.658c0-14.352 11.655-25.949 26.009-25.949 14.41 0 26.178 11.598 26.178 25.949v85.658c0 14.351-11.767 26.006-26.178 26.006zM50.637 873.811c-14.354 0-26.01-11.654-26.01-26.006v-85.658c0-14.352 11.655-25.949 26.01-25.949 14.41 0 26.121 11.598 26.121 25.949v85.658c0 14.351-11.711 26.006-26.121 26.006zM848.652 873.754c-14.41 0-26.124-11.598-26.124-25.949V573.379c0-14.354 11.714-26.006 26.124-26.006 14.352 0 26.007 11.652 26.007 26.006v274.426c0 14.351-11.655 25.949-26.007 25.949zM26.121 675.111C11.711 675.111 0 663.514 0 649.219c0-14.41 11.711-26.121 26.121-26.121h289.696l169.65-186.988c5.053-5.453 12.172-8.555 19.406-8.555 4.132 0 8.209 1.033 12.169 3.041l142.667 77.391 168.503-212.135c4.65-6.313 12.573-10.217 20.782-10.217 12.287 1.436 20.555 7.348 24.229 16.648 3.331 8.783 1.722 18.717-4.134 25.951l-182.05 229.299c-5.111 6.201-12.458 9.76-20.381 9.76-4.42 0-8.67-1.09-12.517-3.271L510.385 486.4 346.59 666.729c-4.648 5.283-11.768 8.383-19.289 8.383H26.121zM245.316 381.566c-10.333 0-18.716-8.439-18.716-18.715v-57.697h-62.578c-10.276 0-18.716-8.439-18.716-18.717 0-10.334 8.439-18.658 18.716-18.658h62.637v-38.064h-62.637c-10.22 0-18.659-8.439-18.659-18.715 0-10.221 8.439-18.604 18.659-18.604h66.884l-63.21-58.846c-5.109-4.592-7.291-11.369-5.741-17.854 1.379-6.717 6.258-12 12.688-13.896 1.551-0.112 3.042-0.112 4.362-0.112 7.234 0 10.967 1.662 13.896 4.535l51.842 47.994 45.986-47.307c3.445-3.673 8.268-5.625 13.32-5.625 4.878 0 9.588 1.837 12.975 5.28 3.674 3.446 5.626 8.097 5.74 12.976 0.057 4.996-1.78 9.818-5.282 13.436l-57.983 59.418h60.912c10.218 0 18.657 8.383 18.657 18.604 0 10.275-8.439 18.715-18.657 18.715h-56.436v38.064h56.436c10.218 0 18.657 8.324 18.657 18.658 0 10.277-8.439 18.717-18.657 18.717h-56.436v57.697c0.001 10.277-8.382 18.716-18.659 18.716z" fill="#2c2c2c" p-id="4332"></path><path d="M241.699 476.182c-61.602 0-121.94-25.145-165.517-68.721C16.648 348.27-6.89 261.291 14.696 180.229c21.586-80.896 85.313-144.619 166.32-166.38 19.808-5.282 40.015-7.866 60.455-7.866 62.176 0 122.858 25.262 166.606 69.411 67.459 67.284 87.438 167.755 50.866 255.882-36.341 87.955-121.482 144.906-216.785 144.906h-0.459z m0.46-432.193c-108.853 0-197.379 88.528-197.379 197.382 0 108.965 88.526 197.494 197.379 197.494 108.909 0 197.438-88.529 197.438-197.494 0-108.853-88.529-197.382-197.438-197.382z" fill="#2c2c2c" p-id="4333"></path></svg>

After

Width:  |  Height:  |  Size: 3.5 KiB

View File

@@ -1,30 +1,33 @@
<template> <template>
<el-form :model="formData" ref="applyForm" :rules="rules" :label-position="labelPosition"> <el-form :model="formData" ref="applyForm" :rules="rules" :label-position="labelPosition" style="margin-left: 5px">
<el-row> <el-row>
<!-- <el-col :span="24">-->
<!-- <el-form-item :label="label" prop="attachment" >-->
<!-- <template v-if="preview">-->
<!-- <file-upload @getFile="getAttachment" :multiple="false"-->
<!-- :disabled="singleFileArray?.length>0?true:false" title="如需修改需求申请书附件,请先删除文件再上传!"/>-->
<!-- <fvTable style="width: 100%;max-height: 80px;" height="80" v-if="singleFileArray?.length>0"-->
<!-- :tableConfig="editSingleTableConfig"-->
<!-- :data="singleFileArray" :isSettingCol="false" :pagination="false">-->
<!-- </fvTable>-->
<!-- </template>-->
<!-- <template v-else-if="!preview">-->
<!-- <file-upload @getFile="getAttachment" :multiple="false"-->
<!-- :disabled="isSingleFile"/>-->
<!-- <fvTable style="width: 100%;max-height: 80px;" v-if="showSingleTable" height="80"-->
<!-- :tableConfig="singleTableConfig"-->
<!-- :data="_singleFileValue" :isSettingCol="false" :pagination="false">-->
<!-- </fvTable>-->
<!-- </template>-->
<!-- </el-form-item>-->
<!-- </el-col>-->
<el-col :span="24"> <el-col :span="24">
<el-form-item :label="label" prop="attachment" label-width="125"> <el-form-item :label="label" prop="" required>
<template v-if="preview&&JSON.stringify(singleFile) !== '{}'&&JSON.stringify(singleFile)!=='null'">
<el-button type="primary" link @click="handleDownload(singleFile)" style="font-size: 16px">
{{ singleFile ? singleFile?.originalFileName : formData.singleFile?.originalFileName }}
</el-button>
<el-button type="danger" link @click="deleteSingleFile(singleFile?singleFile:formData.singleFile,1)">删除
</el-button>
</template>
<template
v-else-if="!preview||JSON.stringify(singleFile) == '{}'||singleFile==null||formData.singleFile==null">
<file-upload @getFile="getAttachment" :multiple="false"
:disabled="isSingleFile" ref="fileUploadRef"/>
<!-- :showFileList="showFileList" @delete="deleteAttachment"-->
<fvTable style="width: 100%;max-height: 80px;" v-if="showSingleTable" height="80" :tableConfig="singleTableConfig"
:data="_singleFileValue" :isSettingCol="false" :pagination="false">
</fvTable>
</template>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="其他文件" label-width="125">
<file-upload @getFile="getOtherFile"/> <file-upload @getFile="getOtherFile"/>
<fvTable style="width: 100%;max-height: 162px;" v-if="showTable" height="162" :tableConfig="tableConfig" <el-button color="#DED0B2" v-if="templateDownloadBtnShow" @click="handleImportTemplateDownload"
style="margin-left: 10px">模板下载
</el-button>
<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"/>
@@ -34,11 +37,14 @@
</el-col> </el-col>
</el-row> </el-row>
</el-form> </el-form>
<file-preview ref="filePreviewRef" v-if="filePreviewShow" :fileName="filePreviewParam.fileName"
:fileUrl="filePreviewParam.fileUrl"
:fileType="filePreviewParam.fileType"/>
</template> </template>
<script setup lang="jsx"> <script setup lang="jsx">
import FileUpload from '@/components/FileUpload.vue' import FileUpload from '@/components/FileUpload.vue'
import {deleteFile, downloadFile} from "@/api/project-demand"; import {deleteFile, downloadFile, downloadTemplate, downloadTemplateZip} from "@/api/project-demand";
import {ElMessageBox, ElNotification} from "element-plus"; import {ElMessageBox, ElNotification} from "element-plus";
@@ -63,6 +69,16 @@ const props = defineProps({
type: Boolean, type: Boolean,
default: false default: false
}, },
//是否显示模板下载按钮
templateDownloadBtnShow: {
type: Boolean,
default: false
},
//模板下载时的文件名
templateName: {
type: String,
default: ''
},
singleList: { singleList: {
type: Array, type: Array,
default: [] default: []
@@ -84,9 +100,10 @@ const props = defineProps({
default: '' default: ''
} }
}) })
const emit = defineEmits(["getAttachment", "getOtherFile","update:singleList"]) const emit = defineEmits(["getAttachment", "getOtherFile", "update:singleList"])
const tableConfig = reactive({
columns: [ const baseTableConf = reactive(
[
{ {
prop: 'index', prop: 'index',
type: 'index', type: 'index',
@@ -98,11 +115,17 @@ const tableConfig = reactive({
prop: 'originalFileName', prop: 'originalFileName',
label: '文件名', label: '文件名',
align: 'center', align: 'center',
width: 400,
currentRender: ({row, index}) => (
<div style="color: #2a99ff;cursor: pointer;"
onClick={() => clickToPreview(row)}>{row.originalFileName}</div>)
}, },
{ {
prop: 'tag', prop: 'tag',
label: '标签', label: '标签',
align: 'center' align: 'center',
// currentRender: ({row, index}) => (
// <el-input placeholder={row.tag} onClick={() => {}}></el-input>)
}, },
{ {
prop: 'size', prop: 'size',
@@ -110,6 +133,11 @@ const tableConfig = reactive({
align: 'center', align: 'center',
currentRender: ({row, index}) => (parseInt(row.size / 1024) + 'KB') currentRender: ({row, index}) => (parseInt(row.size / 1024) + 'KB')
}, },
]
)
const tableConfig = reactive({
columns: [
...baseTableConf,
{ {
prop: 'oper', prop: 'oper',
label: '操作', label: '操作',
@@ -149,29 +177,7 @@ const tableConfig = reactive({
}) })
const singleTableConfig = reactive({ const singleTableConfig = reactive({
columns: [ columns: [
{ ...baseTableConf,
prop: 'index',
type: 'index',
label: '序号',
align: 'center',
width: '80',
},
{
prop: 'originalFileName',
label: '文件名',
align: 'center',
},
{
prop: 'tag',
label: '标签',
align: 'center'
},
{
prop: 'size',
label: '文件大小',
align: 'center',
currentRender: ({row, index}) => (parseInt(row.size / 1024) + 'KB')
},
{ {
prop: 'oper', prop: 'oper',
label: '操作', label: '操作',
@@ -209,19 +215,68 @@ const singleTableConfig = reactive({
} }
] ]
}) })
const fileUploadRef = ref() const editSingleTableConfig = reactive({
columns: [
...baseTableConf,
{
prop: 'oper',
label: '操作',
align: 'center',
showOverflowTooltip: false,
currentRender: ({row, index}) => {
let btn = []
btn.push({label: '下载', func: () => handleDownload(row), type: 'primary'})
// if (row.newFile) {
// btn.push({label: '删除', func: () => handleDelete(row), type: 'primary'})
// }
return (
<div style={{width: '100%'}}>
{
btn.map(item => (
<el-button
type={item.type}
onClick={() => item.func()}
link
>
{item.label}
</el-button>
))
}
{
row.newFile || props.preview || !props.preview ?
<popover-delete name={row.originalFileName} type={'文件'} btnType={'danger'}
// perm={['']}
onDelete={() => deleteSingleFile(row, 1)}/>
: ''
}
</div>
)
}
}
]
})
const singleFileArray = ref([])
const rules = reactive({ const rules = reactive({
attachment: [{required: true, message: '请上传附件', trigger: ['blur', 'change']}], // attachment: [{required: true, message: '请上传附件', trigger: ['blur', 'change']}],
}) })
const applyForm = ref() const applyForm = ref()
const singleFile = ref(props.formData.singleFile) const singleFile = ref({})
const isSingleFile = ref(false) const isSingleFile = ref(false)
const isHaveOneFile = ref(false)
const allFileList = ref([]) const allFileList = ref([])
const deleteFileVal = ref({}) if (localStorage.getItem('singleFile')) {
const singleFileList = ref([]) singleFileArray.value.push(JSON.parse(localStorage.getItem('singleFile')))
if(localStorage.getItem('singleFile')){
singleFile.value = JSON.parse(localStorage.getItem('singleFile')) singleFile.value = JSON.parse(localStorage.getItem('singleFile'))
} }
const filePreviewParam = ref({
fileUrl: '',
fileName: '',
fileType: 'pdf'
})
const filePreviewRef = ref()
const filePreviewShow = ref(false)
const _singleFileValue = computed({ const _singleFileValue = computed({
get() { get() {
return props.singleList; return props.singleList;
@@ -230,8 +285,6 @@ const _singleFileValue = computed({
emit('update:singleList', value) emit('update:singleList', value)
} }
}) })
// console.log('_singleFileValue',_singleFileValue.value)
const _otherFileListValue = computed({ const _otherFileListValue = computed({
get() { get() {
return props.otherFileList; return props.otherFileList;
@@ -240,21 +293,35 @@ const _otherFileListValue = computed({
emit('update:otherFileList', value) emit('update:otherFileList', value)
} }
}) })
if(_otherFileListValue.value&&_otherFileListValue.value.length>0){ if (_otherFileListValue.value && _otherFileListValue.value.length > 0) {
_otherFileListValue.value.forEach(item=>{ isHaveOneFile.value = true
_otherFileListValue.value.forEach(item => {
allFileList.value.push(item) allFileList.value.push(item)
}) })
} }
watch(() => props.showSingleTable, (newVal) => { // watch(() => props.showSingleTable, (newVal) => {
props.showSingleTable = newVal // props.showSingleTable = newVal
}, {deep: true}) // }, {deep: true})
watch(() => props.formData.fileList, (newVal) => { watch(() => props.formData.fileList, (newVal) => {
if (props.preview) { if (props.preview) {
newVal?.forEach(item => { newVal?.forEach(item => {
isHaveOneFile.value = true
allFileList.value.push(item) allFileList.value.push(item)
}) })
} }
}, {immediate: true}) }, {immediate: true})
watch(() => props.formData.singleFile, (newVal) => {
props.formData.singleFile = newVal
if (newVal != null) {
singleFileArray.value.push(newVal)
} else {
singleFileArray.value = []
}
singleFile.value = newVal
}, {immediate: true})
// watch(() => props.otherFileList, (newVal) => { // watch(() => props.otherFileList, (newVal) => {
// props.otherFileList=newVal // props.otherFileList=newVal
// if (props.preview) { // if (props.preview) {
@@ -278,43 +345,104 @@ watch(() => props.showTable, (newVal) => {
// console.log('singleFile', newVal) // console.log('singleFile', newVal)
// singleFileList.value = newVal // singleFileList.value = newVal
// }, {deep: true}) // }, {deep: true})
watch(() => props.formData.singleFile, (newVal) => {
// console.log('singleFile', newVal)
singleFile.value = newVal
props.formData.singleFile=newVal
}, {deep: true})
watch(() => isSingleFile.value, (newVal) => { watch(() => isSingleFile.value, (newVal) => {
isSingleFile.value = newVal isSingleFile.value = newVal
}, {deep: true}) }, {deep: true})
watch(() => singleFile.value, (newVal) => { watch(() => isHaveOneFile.value, (newVal) => {
singleFile.value = newVal isHaveOneFile.value = newVal
}, {deep: true}) }, {deep: true})
const handleDelete = (row, type) => { // watch(() => singleFile.value, (newVal) => {
deleteFile(row.fileId).then(res => { // singleFile.value = newVal
ElNotification({ // }, {deep: true})
title: '提示',
message: res.msg,
type: res.code === 1000 ? 'success' : 'error' const handleImportTemplateDownload = async () => {
console.info("🚀 ~method:handleImportTemplateDownload -----", props.tag)
let templateType = ''
let templateTypeList = ''
let isZip = false
if (props.tag === '需求上报') {
templateType = '2'
isZip = false
} else if (props.tag === '项目立项') {
templateTypeList = '5,6'
isZip = true
} else if (props.tag === '项目验收') {
templateType = '7'
isZip = false
} else if (props.tag === '阶段变更') {
templateTypeList = '8,9'
isZip = true
}
let res = ''
if (isZip) {
res = await downloadTemplateZip(templateTypeList)
let fileName = props.templateName +'.zip'
const blob = new Blob([res.data])
let a = document.createElement('a')
a.href = URL.createObjectURL(blob)
a.download = fileName
a.click()
} else {
res = await downloadTemplate(templateType)
const blob = new Blob([res])
let a = document.createElement('a')
a.href = URL.createObjectURL(blob)
a.download = props.templateName + ".docx"
a.click()
}
}
const clickToPreview = (row) => {
filePreviewShow.value = false
console.log('clickToPreview', row, row.fileType)
filePreviewParam.value = {
fileUrl: row.url,
fileName: row.originalFileName,
fileType: row.fileType
}
nextTick(() => {
filePreviewShow.value = true
}) })
if (res.code === 1000) { // filePreviewRef.value.show()
}
const handleDelete = (row, type) => {
// deleteFile(row.fileId).then(res => {
// ElNotification({
// title: '提示',
// message: res.msg,
// type: res.code === 1000 ? 'success' : 'error'
// })
// if (res.code === 1000) {
if (type === 'single') { if (type === 'single') {
_singleFileValue.value.splice(_singleFileValue.value.findIndex((item) => item.fileId === row.fileId), 1); _singleFileValue.value.splice(_singleFileValue.value.findIndex((item) => item.fileId === row.fileId), 1);
isSingleFile.value = false isSingleFile.value = false
} else { } else {
allFileList.value.splice(allFileList.value.findIndex((item) => item.fileId === row.fileId), 1); allFileList.value.splice(allFileList.value.findIndex((item) => item.fileId === row.fileId), 1);
isHaveOneFile.value = !(allFileList.value && allFileList.value?.length == 0);
console.log('allFileList.value',allFileList.value)
if (localStorage.getItem('collectData')) {
let collectData = JSON.parse(localStorage.getItem('collectData'))
collectData.fileList = allFileList.value
localStorage.setItem('collectData', JSON.stringify(collectData))
}
if (localStorage.getItem('otherFileList')) {
localStorage.setItem('otherFileList', JSON.stringify(allFileList.value))
} }
} }
}); // }
// });
} }
const handleSingleDelete = (row) => { const handleSingleDelete = (row) => {
// console.log('row',row)
// fileUploadRef.value.handleRemove(deleteFileVal.value.id)
handleDelete(row, 'single') handleDelete(row, 'single')
} }
const getAttachment = (val) => { const getAttachment = (val) => {
// console.log('getAttachment', val)
isSingleFile.value = true isSingleFile.value = true
// deleteFileVal.value=val
emit('getAttachment', val) emit('getAttachment', val)
} }
const compositeParam = (item) => { const compositeParam = (item) => {
@@ -334,6 +462,7 @@ const getOtherFile = (val) => {
} else { } else {
allFileList.value = _otherFileListValue.value allFileList.value = _otherFileListValue.value
} }
isHaveOneFile.value = true
emit('getOtherFile', val) emit('getOtherFile', val)
} }
const deleteAttachment = (val) => { const deleteAttachment = (val) => {
@@ -346,6 +475,7 @@ const deleteAttachment = (val) => {
}) })
isSingleFile.value = false isSingleFile.value = false
singleFile.value = null singleFile.value = null
singleFileArray.value = []
} }
}); });
} }
@@ -365,6 +495,7 @@ const deleteSingleFile = (row, type) => {
isSingleFile.value = false isSingleFile.value = false
if (type === 1) { if (type === 1) {
singleFile.value = null singleFile.value = null
singleFileArray.value = []
} else { } else {
props.otherFileList.splice(props.otherFileList.findIndex((item) => item.fileId === row.fileId), 1); props.otherFileList.splice(props.otherFileList.findIndex((item) => item.fileId === row.fileId), 1);
} }
@@ -396,7 +527,8 @@ defineExpose({
}, },
allFileList, allFileList,
singleFile, singleFile,
isSingleFile isSingleFile,
isHaveOneFile,
}) })
</script> </script>
@@ -405,3 +537,20 @@ defineExpose({
height: 300px !important; height: 300px !important;
} }
</style> </style>
<style lang="scss" scoped>
:deep(.el-table__header) {
.is-leaf:first-child {
.cell {
margin-left: -22px !important;
}
}
}
:deep(.el-table__body) {
.el-table__cell:first-child {
.cell {
margin-left: -11px !important;
}
}
}
</style>

View File

@@ -84,7 +84,6 @@ const getSummaries = (param) => {
// } // }
const exportExcelHandler = () => { const exportExcelHandler = () => {
shareExportExcel(route.query.id).then(res => { shareExportExcel(route.query.id).then(res => {
console.log(res)
let fileName = `科技创新项目费用分摊表-${props.allocationName}.zip` let fileName = `科技创新项目费用分摊表-${props.allocationName}.zip`
const blob = new Blob([res.data]) const blob = new Blob([res.data])
let a = document.createElement('a') let a = document.createElement('a')

View File

@@ -1,37 +1,9 @@
<template> <template>
<div v-loading="loading"> <div v-loading="loading">
<el-row v-if="type==='execute'">
<el-col :span="24">
<baseTitle :title="'附件信息'"></baseTitle>
</el-col>
<el-form :model="attachmentParam" inline style="margin-top: 15px">
<el-form-item label="标签" prop="tag">
<el-select v-model="attachmentParam.tag" placeholder="请选择标签" clearable filterable style="width: 300px">
<el-option
v-for="item in tagsOption"
:key="item.value"
:label="item.label"
:value="item.value"
/>
</el-select>
</el-form-item>
<el-form-item>
<el-button @click="handleSearchImplementationFileList" color="#DED0B2">搜索</el-button>
</el-form-item>
</el-form>
<fvTable style="width: 100%;min-height:162px;max-height: 162px" v-if="showAttachmentTable" height="162"
:tableConfig="tableConfig"
:data="otherAttachmentList" :isSettingCol="false" :pagination="false">
<template #empty>
<el-empty :image-size="55" description="暂无数据" style="padding: 0"/>
</template>
</fvTable>
</el-row>
<baseTitle v-if="type!='phase'" :title="getTagName(type)+getTitleInfo(data.taskId)"></baseTitle> <baseTitle v-if="type!='phase'" :title="getTagName(type)+getTitleInfo(data.taskId)"></baseTitle>
<fvForm :schema="schema" @getInstance="(e)=>form = e"></fvForm> <fvForm :schema="schema" @getInstance="(e)=>form = e" style="margin-left: 15px"></fvForm>
<el-form :model="formData" label-width="auto" style="margin-top: -15px"> <el-form :model="formData" label-width="auto" style="margin-top: -15px">
<file-component :title="getTagName(type)+'附件'" :tag="getTagName(type)" <file-component :title="getTagName(type)+'附件'" :tag="getTagName(type)" :isOpenPrint="isOpenPrint"
v-model:value="formData.fileList" :processViewer="processViewer" v-model:value="formData.fileList" :processViewer="processViewer"
:file-list-show="fileListShow"/> :file-list-show="fileListShow"/>
</el-form> </el-form>
@@ -64,6 +36,9 @@
<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>
<file-preview ref="filePreviewRef" :fullscreen="fullscreen" v-if="filePreviewShow"
:fileName="filePreviewParam.fileName" :fileUrl="filePreviewParam.fileUrl"
:fileType="filePreviewParam.fileType"/>
</div> </div>
</template> </template>
@@ -75,54 +50,6 @@ 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";
const attachmentParam = reactive({
tag: ''
})
const tagsOption = ref([])
const uploadState = ref(false)
const showAttachmentTable = ref(true)
const otherAttachmentList = ref([])
const tableConfig = reactive({
columns: [
{
prop: 'index',
type: 'index',
label: '序号',
align: 'center',
width: '80',
},
{
prop: 'originalFileName',
label: '文件名',
align: 'center',
},
{
prop: 'tag',
label: '标签',
align: 'center'
},
{
prop: 'size',
label: '文件大小',
align: 'center',
currentRender: ({row, index}) => (parseInt(row.size / 1024) + 'KB')
},
{
prop: 'oper',
label: '操作',
align: 'center',
showOverflowTooltip: false,
currentRender: ({row, index}) => {
return (
<div>
<el-button type="primary" link onClick={() => handleDownload(row)}>下载</el-button>
</div>
)
}
}
]
})
const changeDiagram = ref(false) const changeDiagram = ref(false)
const props = defineProps({ const props = defineProps({
formData: { formData: {
@@ -141,10 +68,18 @@ const props = defineProps({
type: Array, type: Array,
default: [] default: []
}, },
basicData: {
type: Object,
default: {}
},
fileListShow: { fileListShow: {
type: String, type: String,
default: 'READ' default: 'READ'
}, },
preProcessShow: {
type: String,
default: 'READ'
},
// approval 立项, execute 实施, 归档 archivist // approval 立项, execute 实施, 归档 archivist
type: { type: {
type: String, type: String,
@@ -154,6 +89,11 @@ const props = defineProps({
type: Boolean, type: Boolean,
default: false default: false
}, },
//是否开始打印
isOpenPrint: {
type: Boolean,
default: false
},
value: { value: {
type: String, type: String,
default: '' default: ''
@@ -164,6 +104,89 @@ const props = defineProps({
} }
}) })
const form = ref() const form = ref()
const editSingleTableConfig = reactive({
columns: [
{
prop: 'index',
type: 'index',
label: '序号',
align: 'center',
width: 85,
},
{
prop: 'originalFileName',
label: '文件名',
align: 'center',
width: 400,
currentRender: ({row, index}) => (
<div style="color: #2a99ff;cursor: pointer;" onClick={() => clickToPreview(row)}>{row.originalFileName}</div>)
},
{
prop: 'tag',
label: '标签',
align: 'center'
},
{
prop: 'size',
label: '文件大小',
align: 'center',
width: 150,
currentRender: ({row, index}) => (parseInt(row.size / 1024) + 'KB')
},
{
prop: 'oper',
label: '操作',
align: 'center',
showOverflowTooltip: false,
currentRender: ({row, index}) => {
let btn = []
btn.push({label: '下载', func: () => handleDownload(row), type: 'primary'})
// if (row.newFile) {
// btn.push({label: '删除', func: () => handleDelete(row), type: 'primary'})
// }
return (
<div style={{width: '100%'}}>
{
btn.map(item => (
<el-button
type={item.type}
onClick={() => item.func()}
link>
{item.label}
</el-button>
))
}
{
row.newFile ? <popover-delete name={row.originalFileName} type={'文件'} btnType={'danger'}
onDelete={() => handleDelete(row)}/>
: ''
}
</div>
)
}
}
]
})
let preProcess = {
label: '前置流程',
prop: 'preProcess',
colProps: {
span: 24
},
labelWidth: 'left',
component: () => (
<div>
{
props.formData.preProcess ? props.formData.preProcess.map((item, index) => {
return <span><a target="_blank" style={{color: '#409EFF', cursor: 'pointer'}}
href={props.formData.preProcessBaseUrl + item.requestId}>{item.requestName} {index != (props.formData.preProcess.length - 1) ?
<span></span> : ''}</a></span>
}) : <span>{'--'}</span>
}
</div>
)
}
const schema = computed(() => { const schema = computed(() => {
let arr let arr
if (props.type == 'approval') { if (props.type == 'approval') {
@@ -172,8 +195,9 @@ const schema = computed(() => {
label: '项目负责人', label: '项目负责人',
prop: 'projectChargePerson', prop: 'projectChargePerson',
colProps: { colProps: {
span: 24 span: 6
}, },
labelWidth: 'left',
component: () => ( component: () => (
<div> <div>
{ {
@@ -188,154 +212,174 @@ const schema = computed(() => {
label: '项目成员', label: '项目成员',
prop: 'projectPersonList', prop: 'projectPersonList',
colProps: { colProps: {
span: 24 span: 6
}, },
labelWidth: 'left',
component: () => ( component: () => (
<div> <div>
{ {
props.formData.projectPersonList ? props.formData.projectPersonList.map(item => { props.formData.projectPersonList ? props.formData.projectPersonList.map((item, index) => {
return <span>{item.name}
<span>{index != props.formData.projectPersonList?.length - 1 ? '' : ''}</span></span>
}) : <span>{'--'}</span>
}
</div>
)
},
{
label: '部门分管领导',
prop: 'optionalChargeLeadership',
colProps: {
span: 6
},
labelWidth: 'left',
component: () => (
<div>
{
props.formData.optionalChargeLeadership?.length > 0 ? props.formData.optionalChargeLeadership.map(item => {
return <span>{item.name} </span> return <span>{item.name} </span>
}) : <span>{'--'}</span> }) : <span>{'--'}</span>
} }
</div> </div>
) )
}, },
{ ]
if (props.preProcessShow == 'EDIT') {
preProcess = {
label: '前置流程', label: '前置流程',
prop: 'preProcess', prop: 'preProcess',
colProps: { colProps: {
span: 24 span: 24
}, },
labelWidth: 'left',
component: () => ( component: () => (
<div> <div>
{ {
props.formData.preProcess ? props.formData.preProcess.map(item => { <select-pre-process formData={props.formData} basicData={props.basicData}/>
return <span><a target="_blank" style={{color: '#409EFF', cursor: 'pointer'}}
href={props.formData.preProcessBaseUrl + item.requestId}>{item.requestName}</a> </span>
}) : <span>{'--'}</span>
} }
</div> </div>
) )
},
{
label: '项目立项附件',
prop: 'singleFile',
colProps: {
span: 24
},
component: () => (
<div>
{
props.formData.singleFile?.originalFileName ?
<span
style={{color: '#409EFF', cursor: 'pointer'}}
onClick={() => handleDownload(props.formData.singleFile)}
>
{props.formData.singleFile?.originalFileName}
</span> :
<span>{'--'}</span>
} }
</div> }
arr.push(preProcess)
) // arr.push({
}, // label: '项目立项附件',
] // prop: 'singleFile',
// colProps: {
// span: 24
// },
// labelWidth: 'left',
// component: () => {
// let singleFileArray = [props.formData.singleFile]
// return props.formData.singleFile ? <fvTable style="width: 100%;max-height: 80px;" height="80"
// tableConfig={editSingleTableConfig}
// data={singleFileArray} isSettingCol={false} pagination={false}>
// </fvTable>
// : <span>--</span>
// }
// })
} else if (props.type == 'execute') { } else if (props.type == 'execute') {
arr = [ arr = [{
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') {
preProcess = {
label: '前置流程', label: '前置流程',
prop: 'preProcess', prop: 'preProcess',
colProps: { colProps: {
span: 24 span: 24
}, },
labelWidth: 'left',
component: () => ( component: () => (
<div> <div>
{ {
props.formData.preProcess ? props.formData.preProcess.map(item => { <select-pre-process formData={props.formData} basicData={props.basicData}/>
return <span><a target="_blank" style={{color: '#409EFF', cursor: 'pointer'}}
href={props.formData.preProcessBaseUrl + item.requestId}>{item.requestName}</a> </span>
}) : <span>{'--'}</span>
} }
</div> </div>
) )
},
{
label: '项目验收附件',
prop: 'singleFile',
colProps: {
span: 24
},
component: () => (
<div>
{
props.formData.singleFile?.originalFileName ?
<span
style={{color: '#409EFF', cursor: 'pointer'}}
onClick={() => handleDownload(props.formData.singleFile)}
>
{props.formData.singleFile?.originalFileName}
</span> :
<span>{'--'}</span>
} }
</div> }
arr.push(preProcess)
) // arr.push(
}, // {
] // label: '项目验收附件',
// prop: 'singleFile',
// colProps: {
// span: 24
// },
// labelWidth: 'left',
// component: () => {
// let singleFileArray = [props.formData.singleFile]
// return props.formData.singleFile ? <fvTable style="width: 100%;max-height: 80px;" height="80"
// tableConfig={editSingleTableConfig}
// data={singleFileArray} isSettingCol={false} pagination={false}>
// </fvTable>
// : <span>--</span>
// }
// })
} else if (props.type == 'archivist') { } else if (props.type == 'archivist') {
arr = [ arr = [
{ // {
label: '项目归档附件', // label: '项目归档附件',
prop: 'singleFile', // prop: 'singleFile',
colProps: { // colProps: {
span: 24 // span: 24
}, // },
component: () => ( // labelWidth: 'left',
<div> // component: () => {
{ // let singleFileArray = [props.formData.singleFile]
props.formData.singleFile?.originalFileName ? // return props.formData.singleFile ? <fvTable style="width: 100%;max-height: 80px;" height="80"
<span // tableConfig={editSingleTableConfig}
style={{color: '#409EFF', cursor: 'pointer'}} // data={singleFileArray} isSettingCol={false} pagination={false}>
onClick={() => handleDownload(props.formData.singleFile)} // </fvTable>
> // : <span>--</span>
{props.formData.singleFile?.originalFileName} // }
</span> : // },
<span>{'--'}</span>
}
</div>
)
},
] ]
} else if (props.type == 'phase') { } else if (props.type == 'phase') {
arr = [ arr = [
{ // {
label: '阶段变更附件', // label: '阶段变更附件',
prop: 'singleFile', // prop: 'singleFile',
colProps: { // colProps: {
span: 24 // span: 24
}, // },
component: () => ( // labelWidth: 'left',
<div> // component: () => {
{ // let singleFileArray = [props.formData.singleFile]
props.formData.singleFile?.originalFileName ? // return props.formData.singleFile ? <fvTable style="width: 100%;max-height: 80px;" height="80"
<span // tableConfig={editSingleTableConfig}
style={{color: '#409EFF', cursor: 'pointer'}} // data={singleFileArray} isSettingCol={false} pagination={false}>
onClick={() => handleDownload(props.formData.singleFile)} // </fvTable>
> // : <span>--</span>
{props.formData.singleFile?.originalFileName} // }
</span> : // },
<span>{'--'}</span>
}
</div>
)
},
] ]
} }
return arr return arr
}) })
const filePreviewParam = ref({
fileUrl: '',
fileName: '',
fileType: ''
})
const filePreviewShow = ref(false)
const route = useRoute() const route = useRoute()
const emit = defineEmits(['update:value']) const emit = defineEmits(['update:value'])
const _value = computed({ const _value = computed({
@@ -346,48 +390,15 @@ const _value = computed({
emit("update:value", val); emit("update:value", val);
} }
}) })
const getTagsOption = () => { const clickToPreview = (row) => {
if (!route.query.projectId) return filePreviewShow.value = false
getTags(route.query.projectId).then(res => { filePreviewParam.value = {
if (res.code === 1000) { fileUrl: row.url,
tagsOption.value = res.data fileName: row.originalFileName,
} else { fileType: row.fileType
ElNotification({
title: '提示',
message: res.msg,
type: 'error'
})
} }
})
}
const handleSearchImplementationFileList = () => {
let params = {
targetId: route.query.projectId,
targetState: "40"
}
if (attachmentParam.tag) {
tagsOption.value.forEach(item => {
if (item.value === attachmentParam.tag) {
attachmentParam.tag = item.label
}
})
params.tag = attachmentParam.tag
}
searchImplementationFileList(params).then(res => {
showAttachmentTable.value = false
if (res.code === 1000) {
otherAttachmentList.value = res.data.fileList
uploadState.value = res.data.upload
nextTick(() => { nextTick(() => {
showAttachmentTable.value = true filePreviewShow.value = true
})
} else {
ElNotification({
title: '提示',
message: res.msg,
type: 'error'
})
}
}) })
} }
@@ -425,22 +436,46 @@ watchEffect(() => {
Object.keys(props.formData).length && (form.value?.setValues(props.formData)) Object.keys(props.formData).length && (form.value?.setValues(props.formData))
}) })
onMounted(() => {
// if (props.formData.mode == 'view' && props.type == 'execute') {
// handleSearchImplementationFileList()
// getTagsOption()
// }
})
if (props.formData.mode == 'view' && props.type == 'execute') {
handleSearchImplementationFileList()
getTagsOption()
}
watch(() => props.loading, (newVal) => { watch(() => props.loading, (newVal) => {
props.loading = newVal props.loading = newVal
}, {deep: true}) }, {deep: true})
</script> </script>
<style lang="scss">
.execute-table {
.el-table__header {
.el-table__cell:last-child {
.cell {
margin-left: -160px !important;
}
}
}
.el-table__body {
.el-table__cell:last-child {
.cell {
margin-left: -160px !important;
}
}
}
}
</style>
<style lang="scss" scoped> <style lang="scss" scoped>
:deep(.el-table__header) {
.is-leaf:first-child {
.cell {
margin-left: 10px !important;
white-space: nowrap;
padding: 0;
}
}
}
:deep(.el-table__body) {
.el-table__cell:first-child {
.cell {
margin-left: 5px !important;
}
}
}
</style> </style>

View File

@@ -1,9 +1,9 @@
<template> <template>
<div v-loading="loading"> <div v-loading="loading" :style="type==='singleDetail'?'padding: 0 30px':''">
<baseTitle title="需求征集信息" v-if="type!=='singleDetail'"></baseTitle> <baseTitle title="需求征集信息" v-if="type!=='singleDetail'"></baseTitle>
<el-form :model="formData"> <el-form :model="formData" >
<el-row> <el-row gutter="20" style="margin-left: 5px">
<el-col :span="6" v-if="type==='singleDetail'"> <el-col :span="6">
<el-form-item label="征集名称"> <el-form-item label="征集名称">
<span>{{ formData.requirementName }}</span> <span>{{ formData.requirementName }}</span>
</el-form-item> </el-form-item>
@@ -33,23 +33,22 @@
</div> </div>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="24" style="margin-bottom: -15px">
<el-col :span="24"> <el-form-item label="征集说明">
<baseTitle title="征集说明"></baseTitle> <div v-if="formData.collectExplain" v-html="formData.collectExplain" style="white-space: pre-wrap;">
<el-form-item>
<el-card style="width: 100%">
<div v-html="formData.collectExplain">
</div> </div>
</el-card> <div v-else>--</div>
</el-form-item> </el-form-item>
</el-col> </el-col>
<baseTitle v-if="fileListShow === 'READ' || fileListShow === 'EDIT'" title="附件列表"></baseTitle> </el-row>
<el-row>
<el-col :span="24"> <el-col :span="24">
<baseTitle v-if="fileListShow === 'READ' || fileListShow === 'EDIT'" title="附件文件" style="margin-bottom: 0"></baseTitle>
<file-component title="" tag="需求征集" <file-component title="" tag="需求征集"
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>
<el-col :span="24"> <el-col :span="24" style="margin-top: -15px">
<div v-if="data.taskId"> <div v-if="data.taskId">
<baseTitle title="审核意见"></baseTitle> <baseTitle title="审核意见"></baseTitle>
<el-form-item prop="_value"> <el-form-item prop="_value">
@@ -63,7 +62,7 @@
</div> </div>
</el-col> </el-col>
</el-row> </el-row>
<div class="approval-record"> <div class="approval-record" style="margin-top: -15px">
<div class="approval-title"> <div class="approval-title">
<baseTitle title="审批记录"></baseTitle> <baseTitle title="审批记录"></baseTitle>
<div class="diagram"> <div class="diagram">
@@ -191,4 +190,19 @@ watch(() => props.processViewer, (newVal) => {
display: -webkit-box; display: -webkit-box;
-webkit-box-orient: vertical; -webkit-box-orient: vertical;
} }
:deep(.el-table__header) {
.is-leaf:first-child {
.cell {
margin-left: -53px !important;
}
}
}
:deep(.el-table__body) {
.el-table__cell:first-child {
.cell {
margin-left: -26px !important;
}
}
}
</style> </style>

View File

@@ -1,6 +1,6 @@
<template> <template>
<el-dialog custom-class="custom-dialog" class="border" :border="false" width="1000px" style="height: 676px" <el-dialog custom-class="custom-dialog" class="border" :border="false" width="1000px" style="height: 676px"
:title="title" :show-close="false" :visible.sync="visible" v-model="visible" append-to-body :close-on-click-modal="true" @close="closeDialog"> :title="title" :show-close="false" :visible.sync="visible" v-model="visible" append-to-body :close-on-click-modal="false" @close="closeDialog">
<div class="picker"> <div class="picker">
<div class="candidate" v-loading="loading"> <div class="candidate" v-loading="loading">
<el-input v-model="filterText" <el-input v-model="filterText"
@@ -17,8 +17,8 @@
<el-tree :data="dataList" ref="tree" :props="defaultProps" empty-text="" node-key="value" <el-tree :data="dataList" ref="tree" :props="defaultProps" empty-text="" node-key="value"
:show-checkbox="showCheckbox" highlight-current default-expand-all :show-checkbox="showCheckbox" highlight-current default-expand-all
:default-checked-keys="defaultChecked" :disabled="disabled" :default-checked-keys="defaultChecked" :disabled="disabled"
:check-strictly="!checkStrictly" @node-click="(node,check)=>handle(node,check)" :check-strictly="!checkStrictly" @node-click="(node,check)=>handleNodeClick(node,check)"
@check-change="handleChange" :filter-node-method="filterNode"> @check-change="handleCheckClick" :filter-node-method="filterNode">
<template #default="{ node, data }"> <template #default="{ node, data }">
<div class="tree-node"> <div class="tree-node">
<div style="display: flex;align-items: center;padding: 3px 0"> <div style="display: flex;align-items: center;padding: 3px 0">
@@ -39,7 +39,7 @@
<el-empty :image-size="100" description="请点击左侧列表选择数据" v-show="selectList.length === 0"/> <el-empty :image-size="100" description="请点击左侧列表选择数据" v-show="selectList.length === 0"/>
<div v-for="(selectItem, selectIndex) in selectList" :key="selectIndex" class="org-item"> <div v-for="(selectItem, selectIndex) in selectList" :key="selectIndex" class="org-item">
{{ selectItem.label }} {{ selectItem.label }}
<el-icon @click="noSelected(selectItem)" size="20" style="margin-left: 10px;cursor: pointer;"> <el-icon @click="removeSingleSelected(selectItem)" size="20" style="margin-left: 10px;cursor: pointer;">
<CircleClose/> <CircleClose/>
</el-icon> </el-icon>
</div> </div>
@@ -47,7 +47,7 @@
</div> </div>
</div> </div>
<div class="footer"> <div class="footer">
<el-button size="mini" @click="visible = false">取 消</el-button> <el-button size="mini" @click="cancelUserPicker">取 消</el-button>
<el-button size="mini" color="#DED0B2" @click="selectConfirm">确 定</el-button> <el-button size="mini" color="#DED0B2" @click="selectConfirm">确 定</el-button>
</div> </div>
</el-dialog> </el-dialog>
@@ -105,6 +105,8 @@ const defaultProps = {
children: "children", children: "children",
disabled: "disabled", disabled: "disabled",
}; };
const isRemoveSingleSelected = ref(false);
const emit = defineEmits(['update:modelValue']) const emit = defineEmits(['update:modelValue'])
const _value = computed({ const _value = computed({
get() { get() {
@@ -175,7 +177,7 @@ const updateTreeCheck = (list, flag) => {
} }
}) })
} }
const handleChange = (data, checked) => { const handleCheckClick = (data, checked) => {
if (data.value == -1) { if (data.value == -1) {
if(checked){ if(checked){
updateTreeCheck(dataList.value, false) updateTreeCheck(dataList.value, false)
@@ -219,7 +221,7 @@ const handleChange = (data, checked) => {
} }
} }
}; };
const handle = (node, check) => { const handleNodeClick = (node, check) => {
if (check.isLeaf !== false) { if (check.isLeaf !== false) {
if (props.multiple) { if (props.multiple) {
//不添加重复的数据到右边 //不添加重复的数据到右边
@@ -238,7 +240,7 @@ const handle = (node, check) => {
} }
// _value.value = selectList.value // _value.value = selectList.value
}; };
const noSelected = (selectItem) => { const removeSingleSelected = (selectItem) => {
//左侧无选择框时,右侧显示× //左侧无选择框时,右侧显示×
for (let i = 0; i < selectList.value.length; i++) { for (let i = 0; i < selectList.value.length; i++) {
if (selectList.value[i].value === selectItem.value) { if (selectList.value[i].value === selectItem.value) {
@@ -253,6 +255,7 @@ const noSelected = (selectItem) => {
tree.value.setCheckedKeys([]); tree.value.setCheckedKeys([]);
} }
} }
// isRemoveSingleSelected.value = true
}; };
const clearSelected = () => { const clearSelected = () => {
//清空 //清空
@@ -261,18 +264,33 @@ const clearSelected = () => {
cancelButtonText: "取消", cancelButtonText: "取消",
type: "warning" type: "warning"
}).then(() => { }).then(() => {
// isRemoveSingleSelected.value = true
if (!props.showCheckbox) { if (!props.showCheckbox) {
selectList.value = []; selectList.value = [];
} else { } else {
handleChange("1"); handleCheckClick("1");
} }
}); });
}; };
const cancelUserPicker = () => {
if (localStorage.getItem('originallyCompanySelectedList')) {
selectList.value = JSON.parse(localStorage.getItem('originallyCompanySelectedList'))
}else{
selectList.value=[]
handleCheckClick("1");
}
emit("cancelOrClear", selectList.value);
visible.value = false;
// nextTick(()=>{
// isRemoveSingleSelected.value=false
// })
}
const selectConfirm = () => { const selectConfirm = () => {
//确定按钮 //确定按钮
emit("ok", selectList.value); emit("ok", selectList.value);
dataList.value = [] dataList.value = []
visible.value = false; visible.value = false;
localStorage.setItem('originallyCompanySelectedList', JSON.stringify(selectList.value))
}; };
defineExpose({ defineExpose({
show show

View File

@@ -1,8 +1,9 @@
<template> <template>
<el-form :label-position="labelAlign"> <el-form :label-position="labelAlign">
<el-form-item :label="title?'其他文件':''" v-if="fileListShow === 'READ' || fileListShow === 'EDIT'" :label-position="labelAlign" :label-width="title?95:''"> <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'"/>
<fvTable style="width: 100%;max-height: 162px;" v-if="processViewer" height="162" :tableConfig="tableConfig" <!-- :style="{width:isOpenPrint?'610px': '100%'}" table-layout="auto" id="printTable"-->
<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"/>
@@ -10,11 +11,14 @@
</fvTable> </fvTable>
</el-form-item> </el-form-item>
</el-form> </el-form>
<file-preview ref="filePreviewRef" :fullscreen="fullscreen" v-if="filePreviewShow" :fileName="filePreviewParam.fileName" :fileUrl="filePreviewParam.fileUrl"
:fileType="filePreviewParam.fileType"/>
</template> </template>
<script setup lang="jsx"> <script setup lang="jsx">
import {downloadFile, deleteFile} from "@/api/project-demand"; import {downloadFile, deleteFile} from "@/api/project-demand";
import {ElNotification} from "element-plus"; import {ElNotification} from "element-plus";
import FilePreview from "../filePreview/index.vue";
const props = defineProps({ const props = defineProps({
title: { title: {
@@ -25,6 +29,10 @@ const props = defineProps({
type: String, type: String,
default: '' default: ''
}, },
fileNameTableWidth: {
type: String,
default: '400'
},
fileListShow: { fileListShow: {
type: String, type: String,
default: 'READ' default: 'READ'
@@ -40,7 +48,17 @@ const props = defineProps({
labelAlign: { labelAlign: {
type: String, type: String,
default: 'right' default: 'right'
} },
//弹窗是否铺满全屏
fullscreen: {
type: Boolean,
default: false
},
//是否开始打印
isOpenPrint: {
type: Boolean,
default: false
},
}) })
const emit = defineEmits(['update:value']) const emit = defineEmits(['update:value'])
const tableConfig = reactive({ const tableConfig = reactive({
@@ -56,6 +74,9 @@ const tableConfig = reactive({
prop: 'originalFileName', prop: 'originalFileName',
label: '文件名', label: '文件名',
align: 'center', align: 'center',
width: props.fileNameTableWidth,
showOverflowTooltip: false,
currentRender: ({row, index}) => (<div style="color: #2a99ff;cursor: pointer;" onClick={()=>clickToPreview(row)}>{row.originalFileName}</div>)
}, },
{ {
prop: 'tag', prop: 'tag',
@@ -94,7 +115,6 @@ const tableConfig = reactive({
} }
{ {
row.newFile ? <popover-delete name={row.originalFileName} type={'文件'} btnType={'danger'} row.newFile ? <popover-delete name={row.originalFileName} type={'文件'} btnType={'danger'}
perm={['mosr:requirement:del']}
onDelete={() => handleDelete(row)}/> onDelete={() => handleDelete(row)}/>
: '' : ''
} }
@@ -104,7 +124,12 @@ const tableConfig = reactive({
} }
] ]
}) })
const filePreviewParam = ref({
fileUrl: '',
fileName: '',
fileType: 'pdf'
})
const filePreviewShow = ref(false)
const _value = computed({ const _value = computed({
get() { get() {
return props.value; return props.value;
@@ -113,7 +138,17 @@ const _value = computed({
emit("update:value", val); emit("update:value", val);
} }
}) })
const clickToPreview=(row)=>{
filePreviewShow.value = false
filePreviewParam.value = {
fileUrl: row.url,
fileName: row.originalFileName,
fileType: row.fileType
}
nextTick(()=>{
filePreviewShow.value = true
})
}
const getOtherFile = (val) => { const getOtherFile = (val) => {
props.processViewer = false props.processViewer = false
let fileObj = compositeParam(val) let fileObj = compositeParam(val)
@@ -164,6 +199,12 @@ watch(() => props.processViewer, (newVal) => {
<style scoped lang="scss"> <style scoped lang="scss">
:deep(.el-table--fit ) { :deep(.el-table--fit ) {
height: 162px !important; height: 160px !important;
}
@media print {
//#printTable{
// width: 400px!important;
//}
} }
</style> </style>

View File

@@ -1,10 +1,54 @@
<template> <template>
<!-- <baseTitle title="审核意见"></baseTitle>--> <!-- <baseTitle title="审核意见"></baseTitle>-->
<!-- <fvForm :schema="schema" @getInstance="(e)=>form = e"></fvForm>--> <!-- <fvForm :schema="schema" @getInstance="(e)=>form = e"></fvForm>-->
<div class="oper-page-btn"> <div class="oper-page-btn" style="display: flex">
<el-button type="danger" @click="handleReject">驳回</el-button> <el-button type="danger" @click="handleReject">驳回</el-button>
<el-button color="#DED0B2" @click="handleAgree">同意</el-button> <el-button color="#DED0B2" @click="handleAgree">同意</el-button>
</div> </div>
<div class="opinion-dialog">
<el-dialog v-model="showBackNode" title="请选择退回节点" width="400">
<el-table :data="taskUserOptionList" style="width: 100%"
:header-cell-style="{background:'#f5f7fa'}">
<el-table-column width="55">
<template #default="scope">
<el-radio
class="radio"
:label="scope.row"
v-model="backNode"
>&emsp;&emsp;&emsp;
</el-radio>
</template>
</el-table-column>
<el-table-column
prop="nodeName"
label="节点名称">
<!-- <template #default="scope">-->
<!-- {{scope.row.nodeId==-1?'发起节点':scope.row.nodeName}}-->
<!-- </template>-->
</el-table-column>
<el-table-column
prop="name"
label="操作者">
<template #default="scope">
<el-tag v-if="scope.row.userInfo" type="success">{{ scope.row.userInfo.name }}</el-tag>
</template>
</el-table-column>
</el-table>
<div class="oper" style="display: flex;justify-content: flex-end;margin-top: 10px">
<el-button type="danger" @click="rollbackHandler">确定</el-button>
<el-button @click="showBackNode=false">取消</el-button>
</div>
<!-- <el-select v-if="taskUserOptionList?.length>0" v-model="backNode" placeholder="请选择退回节点" clearable>-->
<!-- <el-option-->
<!-- v-for="item in taskUserOptionList"-->
<!-- :key="item.nodeId"-->
<!-- :label="item.nodeName + (item.userInfo ? ':' + item.userInfo.name : '')"-->
<!-- :value="item.nodeId">-->
<!-- </el-option>-->
<!-- </el-select>-->
<!-- <el-button type="danger" @click="rollbackHandler">确认</el-button>-->
</el-dialog>
</div>
</template> </template>
<script setup lang="jsx"> <script setup lang="jsx">
@@ -27,10 +71,17 @@ const props = defineProps({
value: { value: {
type: String, type: String,
default: '' default: ''
},
//退回节点选择框数据
taskUserOptionList: {
type: Array,
default: []
} }
}) })
const form = ref() const form = ref()
const backNode = ref({})
const showBackNode = ref(false)
const schema = computed(() => { const schema = computed(() => {
return [ return [
{ {
@@ -81,13 +132,13 @@ const back = () => {
} }
} }
break; break;
case 'Summary/detail': // case 'Summary/detail':
if (route.query.source === 'home') { // if (route.query.source === 'home') {
router.push('/home') // router.push('/home')
} else { // } else {
router.push({name: 'Summary'}) // router.push({name: 'Summary'})
} // }
break; // break;
case 'Requirement/detail': case 'Requirement/detail':
if (route.query.source === 'home') { if (route.query.source === 'home') {
router.push('/home') router.push('/home')
@@ -120,7 +171,6 @@ const back = () => {
} }
// 驳回 // 驳回
const handleReject = async () => { const handleReject = async () => {
// const values = form.value.getValues()
if (!_value.value) { if (!_value.value) {
ElNotification({ ElNotification({
title: '提示', title: '提示',
@@ -128,11 +178,19 @@ const handleReject = async () => {
type: 'warning' type: 'warning'
}) })
return return
} }
showBackNode.value = true
backNode.value = {}
}
//回退节点
const rollbackHandler = async () => {
// const values = form.value.getValues()
const params = { const params = {
taskId: props.taskId, taskId: props.taskId,
// ...values // ...values
auditOpinion: _value.value auditOpinion: _value.value,
rollBackId: backNode.value.nodeId
} }
// console.log('params', params) // console.log('params', params)
const res = await rejectTask(params) const res = await rejectTask(params)
@@ -141,8 +199,10 @@ const handleReject = async () => {
message: res.msg, message: res.msg,
type: res.code === 1000 ? 'success' : 'error' type: res.code === 1000 ? 'success' : 'error'
}) })
if (res.code === 1000) {
tagsViewStore.delVisitedViews(router.currentRoute.value.path) tagsViewStore.delVisitedViews(router.currentRoute.value.path)
back() back()
}
} }
const handleAgree = async () => { const handleAgree = async () => {
@@ -158,11 +218,17 @@ const handleAgree = async () => {
message: res.msg, message: res.msg,
type: res.code === 1000 ? 'success' : 'error' type: res.code === 1000 ? 'success' : 'error'
}) })
if (res.code === 1000) {
tagsViewStore.delVisitedViews(router.currentRoute.value.path) tagsViewStore.delVisitedViews(router.currentRoute.value.path)
back() back()
}
} }
</script> </script>
<style lang="scss" scoped> <style lang="scss">
.opinion-dialog {
.el-dialog__body {
padding: 0 !important;
}
}
</style> </style>

View File

@@ -1,74 +1,59 @@
<template> <template>
<div class="apply-block"> <div class="apply-block">
<el-row v-if="title==='check'">
<el-col :span="24">
<baseTitle :title="'附件信息'"></baseTitle>
</el-col>
<el-form :model="attachmentParam" inline style="margin-top: 15px">
<el-form-item label="标签" prop="tag">
<el-select v-model="attachmentParam.tag" placeholder="请选择标签" clearable filterable style="width: 300px">
<el-option
v-for="item in tagsOption"
:key="item.value"
:label="item.label"
:value="item.value"
/>
</el-select>
</el-form-item>
<el-form-item>
<el-button @click="handleSearch" color="#DED0B2">搜索</el-button>
<el-button v-if="uploadState" color="#DED0B2" @click="handleUpload">上传附件</el-button>
</el-form-item>
</el-form>
<fvTable style="width: 100%;min-height:162px;max-height: 162px" v-if="showAttachmentTable" height="162"
:tableConfig="tableConfig"
:data="otherAttachmentList" :isSettingCol="false" :pagination="false">
<template #empty>
<el-empty :image-size="55" description="暂无数据" style="padding: 0"/>
</template>
</fvTable>
</el-row>
<baseTitle :title="getTitleName(title)+'信息'"></baseTitle> <baseTitle :title="getTitleName(title)+'信息'"></baseTitle>
<el-form :model="localFormData" ref="formRef" label-width="auto" v-if="step!=='50'"> <el-form :model="localFormData" ref="formRef" label-width="auto" v-if="step!=='50'">
<el-row> <el-row>
<el-col :span="24" v-if="title==='apply'"> <el-col :span="6" v-if="title==='apply'">
<el-form-item label="项目负责人" :required="true" prop="" <!-- label-width="106"-->
label-width="125"> <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">
<!-- {{ localFormData.projectChargePerson ? '更改' : '请选择' }}--> {{ projectChargePersonUserList?.length !== 0 ? '更改' : '请选择' }}
{{ projectChargePersonUserList.length !== 0 ? '更改' : '请选择' }}
</el-button> </el-button>
<div v-for="item in projectChargePersonUserList" :key="item.id" style="margin-right: 5px"> <div v-for="item in projectChargePersonUserList" :key="item.id" style="margin-right: 5px">
{{ 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"/>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="24" v-if="title==='apply'"> <el-col :span="6" v-if="title==='apply'">
<el-form-item label="项目成员" :required="true" prop="" <el-form-item label="项目成员" :required="true" prop="" label-width="85"
label-width="125"> >
<el-button color="#DED0B2" style="margin-right: 10px" @click="handleShowProjectPersonTable"> <el-button color="#DED0B2" style="margin-right: 10px" @click="handleShowProjectPersonTable">
<!-- {{ localFormData.projectPersonIds ? '更改' : '请选择' }}--> {{ projectPersonUserList?.length !== 0 ? '更改' : getProjectPerson(projectPersonUserList) ? '更改' : '请选择' }}
{{ projectPersonUserList.length !== 0 ? '更改' : getProjectPerson(projectPersonUserList) ? '更改' : '请选择' }}
</el-button> </el-button>
<div v-for="item in getProjectPerson(projectPersonUserList)" :key="item.id" style="margin-right: 5px"> <div v-for="(item,index) in getProjectPerson(projectPersonUserList)" :key="item.id" >
{{ item.name }} {{ 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"/>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="24"> <el-col :span="6" v-if="title==='apply'||title==='check'">
<el-form-item label="部门分管领导" :label-width="title==='check'?110:115">
<el-button color="#DED0B2" style="margin-right: 10px" @click="handleShowOptionalChargeLeadershipPicker">
{{
optionalChargeLeadershipList?.length !== 0 ? '更改' : getOptionalChargeLeadershipList(optionalChargeLeadershipList) ? '更改' : '请选择'
}}
</el-button>
<div v-for="(item,index) in getOptionalChargeLeadershipList(optionalChargeLeadershipList)" :key="item.id">
{{ item.name }}{{index != getOptionalChargeLeadershipList(optionalChargeLeadershipList)?.length - 1 ? '' : ''}}
</div>
<user-picker :multiple="true" ref="optionalChargeLeadershipPickerRef" title="请选择部门分管领导"
v-model:value="optionalChargeLeadershipList" @ok="optionalChargeLeaderPickerOk" @cancelOrClear="optionalChargeLeaderPickerCancel"/>
</el-form-item>
</el-col>
<el-col :span="24" v-if="preProcessShow === 'EDIT'">
<el-form-item label="前置流程" :required="preProcessRequired" prop="preProcess" label-width="125"> <el-form-item label="前置流程" :required="preProcessRequired" prop="preProcess" label-width="125">
<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 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;margin-right: 10px;cursor: pointer">{{ item.requestName }} style="color: #2a99ff;cursor: pointer">{{ item.requestName }}<span
v-if="index != localFormData.preProcess?.length -1"></span>
</a> </a>
</div> </div>
</el-form-item> </el-form-item>
@@ -77,15 +62,16 @@
</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'"
@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'"/>
<div> <div>
<div class="approval-record"> <div class="approval-record">
<div class="approval-title"> <div class="approval-title" style="margin-top: -15px">
<baseTitle title="审批记录" v-if="mode === 'resubmit'"></baseTitle> <!-- <baseTitle title="审批记录" v-if="mode === 'resubmit'"></baseTitle>-->
<div v-else></div> <!-- <div v-else></div>-->
<baseTitle title="审批记录"></baseTitle>
<div class="diagram"> <div class="diagram">
<div class="base-title">流程图</div> <div class="base-title">流程图</div>
<el-switch <el-switch
@@ -94,8 +80,11 @@
/> />
</div> </div>
</div> </div>
<el-empty :image-size="100" description="暂无审批记录" v-if="!data?.operationList&&!changeDiagram"/>
<div class="process"> <div class="process">
<operation-render v-if="mode === 'resubmit'&&!changeDiagram" :operation-list="data.operationList" <operation-render
v-if="mode === 'resubmit'&&processDiagramViewer&& data?.operationList && data?.operationList.length > 0&&!changeDiagram"
:operation-list="data.operationList"
:state="data.state"/> :state="data.state"/>
<process-diagram-viewer mode="view" :idName="title" v-if="processDiagramViewer&&changeDiagram"/> <process-diagram-viewer mode="view" :idName="title" v-if="processDiagramViewer&&changeDiagram"/>
</div> </div>
@@ -106,6 +95,10 @@
<el-button color="#DED0B2" v-else-if="mode === 'resubmit'" @click="handleSubmit">重新提交</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>
<file-preview ref="filePreviewRef" v-if="filePreviewShow" :fileName="filePreviewParam.fileName"
:fileUrl="filePreviewParam.fileUrl"
:fileType="filePreviewParam.fileType"/>
<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="请求名称">
@@ -148,7 +141,6 @@
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 {ElNotification} from "element-plus"; import {ElNotification} from "element-plus";
import {getTags} from "@/api/project-manage";
import { import {
getApplyProcess, getApplyProcess,
getPreProcess, getPreProcess,
@@ -166,65 +158,16 @@ 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 {searchImplementationFileList} from "@/api/project-manage/attachment";
const router = useRouter() const router = useRouter()
const route = useRoute() const route = useRoute()
const changeDiagram = ref(false) const changeDiagram = ref(false)
const formRef = ref()
const showSingleTable = ref(false) const showSingleTable = ref(false)
const projectChargePersonUserList = ref([]) const projectChargePersonUserList = ref([])
const projectChargePersonUserPicker = ref() const projectChargePersonUserPicker = ref()
const projectPersonUserList = ref([]) const projectPersonUserList = ref([])
const projectPersonUserPicker = ref() const projectPersonUserPicker = ref()
const singleList = ref([]) const singleList = ref([])
const tagsOption = ref([])
const uploadState = ref(false)
const showAttachmentTable = ref(true)
const otherAttachmentList = ref([])
const attachmentParam = reactive({
tag: ''
})
const tableConfig = reactive({
columns: [
{
prop: 'index',
type: 'index',
label: '序号',
align: 'center',
width: '80',
},
{
prop: 'originalFileName',
label: '文件名',
align: 'center',
},
{
prop: 'tag',
label: '标签',
align: 'center'
},
{
prop: 'size',
label: '文件大小',
align: 'center',
currentRender: ({row, index}) => (parseInt(row.size / 1024) + 'KB')
},
{
prop: 'oper',
label: '操作',
align: 'center',
showOverflowTooltip: false,
currentRender: ({row, index}) => {
return (
<div>
<el-button type="primary" link onClick={() => handleDownload(row)}>下载</el-button>
</div>
)
}
}
]
})
const emit = defineEmits(["getAttachment", "getOtherFile"]) const emit = defineEmits(["getAttachment", "getOtherFile"])
const props = defineProps({ const props = defineProps({
title: { title: {
@@ -250,6 +193,10 @@ const props = defineProps({
step: { step: {
type: String, type: String,
default: "20" default: "20"
},
preProcessShow: {
type: String,
default: "READ"
} }
}) })
const preProcessList = ref([]) const preProcessList = ref([])
@@ -295,44 +242,62 @@ const deploymentId = ref()
const selectRows = ref([]) 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 optionalChargeLeadershipList = ref([])
const filePreviewParam = ref({
fileUrl: '',
fileName: '',
fileType: 'pdf'
})
const filePreviewShow = ref(false)
if (localStorage.getItem('preProcess')) { const getTemplateName=(type)=>{
let param = JSON.parse(localStorage.getItem('preProcess')) switch (type) {
localFormData.value.preProcess = param case 'apply':
sessionParams.value.preProcess = param return '科技创新项目立项模板'
localStorage.setItem('preProcess', JSON.stringify(param)) case 'check':
return '科技创新项目验收申请表'
}
} }
if (localStorage.getItem('singleFile')) {
let param = JSON.parse(localStorage.getItem('singleFile')) const handleShowOptionalChargeLeadershipPicker = () => {
localFormData.value.singleFile = param optionalChargeLeadershipPickerRef.value.showUserPicker()
singleList.value = [param]
localStorage.setItem('singleFile', JSON.stringify(param))
showSingleTable.value = false
nextTick(() => {
showSingleTable.value = true
})
} }
if (localStorage.getItem('otherFileList')) {
let param = JSON.parse(localStorage.getItem('otherFileList')) const optionalChargeLeaderPickerOk = (userList) => {
localFormData.value.otherFileList = param optionalChargeLeadershipList.value = userList
otherFileList.value = param if(userList?.length>0){
localStorage.setItem('otherFileList', JSON.stringify(param)) localStorage.setItem('optionalChargeLeadershipList', JSON.stringify(optionalChargeLeadershipList.value))
showTable.value = false }else {
localStorage.removeItem('optionalChargeLeadershipList')
}
}
const optionalChargeLeaderPickerCancel = (userList) => {
optionalChargeLeadershipList.value = userList
}
const clickToPreview = (row) => {
filePreviewShow.value = false
filePreviewParam.value = {
fileUrl: row.url,
fileName: row.originalFileName,
fileType: row.fileType
}
nextTick(() => { nextTick(() => {
showTable.value = true filePreviewShow.value = true
}) })
} }
if (localStorage.getItem('projectChargePersonUserList')) { const getOptionalChargeLeadershipList = (list) => {
let param = JSON.parse(localStorage.getItem('projectChargePersonUserList')) if (!list || list && list.length === 0) {
projectChargePersonUserList.value = param if (localStorage.getItem('optionalChargeLeadershipList')) {
localStorage.setItem('projectChargePersonUserList', JSON.stringify(param)) let param = JSON.parse(localStorage.getItem('optionalChargeLeadershipList'))
} optionalChargeLeadershipList.value = param
if (localStorage.getItem('projectPersonUserList')) { return optionalChargeLeadershipList.value
let param = JSON.parse(localStorage.getItem('projectPersonUserList')) }
projectPersonUserList.value = param } else {
localProjectPerson.value = param return list
localStorage.setItem('projectPersonUserList', JSON.stringify(param)) }
} }
const getProjectPerson = (list) => { const getProjectPerson = (list) => {
if (!list || list && list.length === 0) { if (!list || list && list.length === 0) {
@@ -354,61 +319,6 @@ const getRequestName = (list) => {
return list return list
} }
} }
const getTagsOption = () => {
if (!route.query.projectId) return
getTags(route.query.projectId).then(res => {
if (res.code === 1000) {
tagsOption.value = res.data
} else {
ElNotification({
title: '提示',
message: res.msg,
type: 'error'
})
}
})
}
const handleSearch = () => {
let params = {
targetId: route.query.projectId,
targetState: "40"
}
if (attachmentParam.tag) {
tagsOption.value.forEach(item => {
if (item.value === attachmentParam.tag) {
attachmentParam.tag = item.label
}
})
params.tag = attachmentParam.tag
}
searchImplementationFileList(params).then(res => {
showAttachmentTable.value = false
if (res.code === 1000) {
otherAttachmentList.value = res.data.fileList
uploadState.value = res.data.upload
nextTick(() => {
showAttachmentTable.value = true
})
} else {
ElNotification({
title: '提示',
message: res.msg,
type: 'error'
})
}
})
}
const handleUpload = () => {
router.push({
name: 'Implementation/upload',
query: {
id: route.query.id,
projectId: route.query.projectId,
state: route.query.state,
step: '40'
}
})
}
const getProjectChargePersonUser = () => { const getProjectChargePersonUser = () => {
if (projectChargePersonUserList.value.length !== 0) { if (projectChargePersonUserList.value.length !== 0) {
return projectChargePersonUserList.value.map(item => item.name).join() return projectChargePersonUserList.value.map(item => item.name).join()
@@ -437,19 +347,29 @@ const handleShowProjectChargePersonTable = () => {
} }
const projectChargePersonUserPickerOk = (userList) => { const projectChargePersonUserPickerOk = (userList) => {
projectChargePersonUserList.value = userList projectChargePersonUserList.value = userList
if(userList?.length>0){
localStorage.setItem('projectChargePersonUserList', JSON.stringify(projectChargePersonUserList.value)) localStorage.setItem('projectChargePersonUserList', JSON.stringify(projectChargePersonUserList.value))
}else {
localStorage.removeItem('projectPersonUserList')
}
} }
const handleShowProjectPersonTable = () => { const handleShowProjectPersonTable = () => {
projectPersonUserPicker.value.showUserPicker() projectPersonUserPicker.value.showUserPicker()
} }
const projectChargePersonUserPickerCancel=(userList)=>{
projectChargePersonUserList.value = userList
}
const projectPersonUserPickerCancel=(userList)=>{
projectPersonUserList.value = userList
}
const projectPersonUserPickerOk = (userList) => { const projectPersonUserPickerOk = (userList) => {
projectPersonUserList.value = userList projectPersonUserList.value = userList
if(userList?.length>0){
localStorage.setItem('projectPersonUserList', JSON.stringify(userList)) localStorage.setItem('projectPersonUserList', JSON.stringify(userList))
// let userIds = [] }else {
// for (const user of userList) { localStorage.removeItem('projectPersonUserList')
// userIds.push(user.id) }
// }
} }
const getPreProcessList = () => { const getPreProcessList = () => {
loading.value = true loading.value = true
@@ -570,22 +490,6 @@ const getFileParam = (item) => {
} }
} }
const handleSubmit = async () => { const handleSubmit = async () => {
if (deploymentData.value.deploymentName === '重大项目立项' || deploymentData.value.deploymentName === '重大项目验收') {
if (localFormData.value.preProcess == undefined) {
if (JSON.parse(localStorage.getItem('preProcess'))?.length > 0) {
} else {
ElNotification({
title: '提示',
message: '请选择前置流程!',
type: 'error'
})
return;
}
}
}
let files = [] let files = []
if (props.mode === 'resubmit') { if (props.mode === 'resubmit') {
attachment.value.allFileList.forEach(item => { attachment.value.allFileList.forEach(item => {
@@ -596,7 +500,8 @@ const handleSubmit = async () => {
files.push(getFileParam(item)) files.push(getFileParam(item))
}) })
} }
if (attachment.value.singleFile == null) { // console.info("🚀 ~method:handleSubmit -----", files,attachment.value.isHaveOneFile)
if (!attachment.value.isHaveOneFile) {
attachment.value.validate() attachment.value.validate()
ElNotification({ ElNotification({
title: '提示', title: '提示',
@@ -615,7 +520,7 @@ const handleSubmit = async () => {
deploymentId: deploymentId.value, deploymentId: deploymentId.value,
requirementId: route.query.id, requirementId: route.query.id,
fileList: files, fileList: files,
singleFile: attachment.value.singleFile, // singleFile: attachment.value.singleFile,
projectId: projectId.value, projectId: projectId.value,
preProcess: JSON.stringify(localFormData.value.preProcess) preProcess: JSON.stringify(localFormData.value.preProcess)
} }
@@ -643,12 +548,14 @@ const handleSubmit = async () => {
} }
params.projectChargePerson = parseInt(projectChargePersonUserList.value[0].id) params.projectChargePerson = parseInt(projectChargePersonUserList.value[0].id)
params.projectPersonIds = projectPersonIds params.projectPersonIds = projectPersonIds
params.optionalChargeLeadership = optionalChargeLeadershipList.value
if (props.mode === 'resubmit') { if (props.mode === 'resubmit') {
res = await resubmitApply(params) res = await resubmitApply(params)
} else { } else {
res = await projectApply(params) res = await projectApply(params)
} }
} else if (props.step === '40') { } else if (props.step === '40') {
params.optionalChargeLeadership = optionalChargeLeadershipList.value
if (props.mode === 'resubmit') { if (props.mode === 'resubmit') {
res = await resubmitCheck(params) res = await resubmitCheck(params)
} else { } else {
@@ -684,10 +591,6 @@ const handleSubmit = async () => {
} }
} }
const init = async () => { const init = async () => {
if (props.title && props.title === 'check') {
handleSearch()
getTagsOption()
}
let id = projectId.value let id = projectId.value
if (!id) return; if (!id) return;
processDiagramViewer.value = false processDiagramViewer.value = false
@@ -723,27 +626,68 @@ const init = async () => {
} }
watchEffect(() => { watchEffect(() => {
// console.info("🚀 ~method:;props.formData.projectChargePerson -----", props.formData.projectChargePerson)
if (props.formData.projectChargePerson == null) { if (props.formData.projectChargePerson == null) {
// projectChargePersonUserList.value = [] projectChargePersonUserList.value = []
} else { } else {
projectChargePersonUserList.value = [props.formData.projectChargePerson] projectChargePersonUserList.value = [props.formData.projectChargePerson]
} }
// console.log('props.formData.projectPersonList',props.formData.projectPersonList) if (props.formData.optionalChargeLeadership == null) {
optionalChargeLeadershipList.value = []
} else {
optionalChargeLeadershipList.value = props.formData.optionalChargeLeadership
}
projectPersonUserList.value = props.formData.projectPersonList ? props.formData.projectPersonList : [] projectPersonUserList.value = props.formData.projectPersonList ? props.formData.projectPersonList : []
let flag = Object.keys(props.formData).length && (localFormData.value = props.formData) let flag = Object.keys(props.formData).length && (localFormData.value = props.formData)
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')) {
let param = JSON.parse(localStorage.getItem('preProcess'))
localFormData.value.preProcess = param
sessionParams.value.preProcess = param
localStorage.setItem('preProcess', JSON.stringify(param))
} }
// if(props.formData.fileList&&props.formData.fileList.length>0){ if (localStorage.getItem('singleFile')) {
// otherFileList.value=props.formData.fileList let param = JSON.parse(localStorage.getItem('singleFile'))
// } localFormData.value.singleFile = param
// localFormData.value.projectPersonIds = [] singleList.value = [param]
// if (projectPersonUserList.value){ localStorage.setItem('singleFile', JSON.stringify(param))
// projectPersonUserList.value.forEach(item => { showSingleTable.value = false
// localFormData.value.projectPersonIds.push(item.id) nextTick(() => {
// }) showSingleTable.value = true
// } })
// console.log('projectPersonUserList.value',projectPersonUserList.value) }
if (localStorage.getItem('otherFileList')) {
let param = JSON.parse(localStorage.getItem('otherFileList'))
localFormData.value.otherFileList = param
otherFileList.value = param
localStorage.setItem('otherFileList', JSON.stringify(param))
showTable.value = false
nextTick(() => {
showTable.value = true
})
}
if (localStorage.getItem('projectChargePersonUserList')) {
let param = JSON.parse(localStorage.getItem('projectChargePersonUserList'))
projectChargePersonUserList.value = param
localStorage.setItem('projectChargePersonUserList', JSON.stringify(param))
}
if (localStorage.getItem('projectPersonUserList')) {
let param = JSON.parse(localStorage.getItem('projectPersonUserList'))
projectPersonUserList.value = param
localProjectPerson.value = param
localStorage.setItem('projectPersonUserList', JSON.stringify(param))
}
if (localStorage.getItem('optionalChargeLeadershipList')) {
let param = JSON.parse(localStorage.getItem('optionalChargeLeadershipList'))
optionalChargeLeadershipList.value = param
// localProjectPerson.value = param
localStorage.setItem('optionalChargeLeadershipList', JSON.stringify(param))
}
return flag return flag
}) })
onActivated(() => { onActivated(() => {
@@ -754,10 +698,11 @@ onMounted(async () => {
}) })
</script> </script>
<style scoped> <style scoped lang="scss">
.oper { .oper {
margin-top: 20px; margin-top: 20px;
display: flex; display: flex;
justify-content: flex-end; justify-content: flex-end;
} }
</style> </style>

View File

@@ -0,0 +1,224 @@
<template>
<el-row style="padding-bottom: 20px">
<el-col :span="24">
<baseTitle :title="'项目附件'"></baseTitle>
</el-col>
<el-form :model="attachmentParam" inline style="margin-left: 15px">
<el-form-item label="标签" prop="tag">
<el-select v-model="attachmentParam.tag" placeholder="请选择标签" clearable filterable style="width: 300px">
<el-option
v-for="item in tagsOption"
:key="item.value"
:label="item.label"
:value="item.value"
/>
</el-select>
</el-form-item>
<el-form-item>
<el-button @click="handleSearch" color="#DED0B2">搜索</el-button>
<el-button v-if="uploadState&&isLineBtn" color="#DED0B2" @click="handleUpload">上传附件</el-button>
</el-form-item>
</el-form>
<el-col v-if="!isLineBtn" :span="24" style="margin-bottom: 8px;margin-left: 15px">
<el-button v-if="uploadState" color="#DED0B2" @click="handleUpload">上传附件</el-button>
</el-col>
<fvTable style="width: 100%;min-height:311px;max-height: 311px" v-if="showAttachmentTable" height="311"
: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>
</el-row>
<file-preview ref="filePreviewRef" :fullscreen="false" v-if="filePreviewShow" :fileName="filePreviewParam.fileName" :fileUrl="filePreviewParam.fileUrl"
:fileType="filePreviewParam.fileType"/>
</template>
<script setup lang="jsx">
import {getTags} from "@/api/project-manage";
import {ElLoading, ElNotification} from "element-plus";
import {searchImplementationFileList} from "@/api/project-manage/attachment";
const router = useRouter()
const route = useRoute()
const attachmentParam = reactive({
tag: ''
})
const uploadState = ref(false)
const tagsOption = ref([])
const showAttachmentTable = ref(true)
const props = defineProps({
fileNameTableWidth: {
type: String,
default: '400'
},
isLineBtn: {
type: Boolean,
default: false
},
})
const executeTableConfig = reactive({
columns: [
{
prop: 'index',
type: 'index',
label: '序号',
align: 'center',
width: 85,
},
{
prop: 'originalFileName',
label: '文件名',
align: 'center',
width: props.fileNameTableWidth,
currentRender: ({row, index}) => (
<div style="color: #2a99ff;cursor: pointer;" onClick={() => clickToPreview(row)}>{row.originalFileName}</div>)
},
{
prop: 'tag',
label: '标签',
align: 'center',
},
{
prop: 'size',
label: '文件大小',
align: 'center',
currentRender: ({row, index}) => (parseInt(row.size / 1024) + 'KB')
},
{
prop: 'oper',
label: '操作',
align: 'center',
showOverflowTooltip: false,
currentRender: ({row, index}) => {
return (
<div>
<el-button type="primary" link onClick={() => handleDownload(row)}>下载</el-button>
</div>
)
}
}
]
})
const otherAttachmentList = ref([])
const filePreviewParam = ref({
fileUrl: '',
fileName: '',
fileType: 'pdf'
})
const filePreviewShow = ref(false)
const clickToPreview=(row)=>{
filePreviewShow.value = false
filePreviewParam.value = {
fileUrl: row.url,
fileName: row.originalFileName,
fileType: row.fileType
}
nextTick(()=>{
filePreviewShow.value = true
})
}
const handleSearch = () => {
const loading = ElLoading.service({fullscreen: true})
let params = {
targetId: route.query.projectId,
targetState: "30"
}
if (attachmentParam.tag) {
tagsOption.value.forEach(item => {
if (item.value === attachmentParam.tag) {
attachmentParam.tag = item.label
}
})
params.tag = attachmentParam.tag
}
searchImplementationFileList(params).then(res => {
showAttachmentTable.value = false
if (res.code === 1000) {
otherAttachmentList.value = res.data.fileList
uploadState.value = res.data.upload
nextTick(() => {
showAttachmentTable.value = true
})
loading.close()
} else {
ElNotification({
title: '提示',
message: res.msg,
type: 'error'
})
loading.close()
}
})
}
const getTagsOption = () => {
if (!route.query.projectId) return
getTags(route.query.projectId).then(res => {
if (res.code === 1000) {
tagsOption.value = res.data
} else {
ElNotification({
title: '提示',
message: res.msg,
type: 'error'
})
}
})
}
const handleUpload = () => {
router.push({
name: 'Implementation/upload',
query: {
id: route.query.id,
projectId: route.query.projectId,
state: route.query.state,
step: '30'
}
})
}
handleSearch()
getTagsOption()
onActivated(()=>{
handleSearch()
getTagsOption()
})
</script>
<style lang="scss">
.execute-apply-table {
//.el-table__header {
// .el-table__cell:last-child {
// .cell {
// margin-left: -108px !important;
// }
// }
//}
//.el-table__body {
// .el-table__cell:last-child {
// .cell {
// margin-left: -108px !important;
// }
// }
//}
.is-leaf:first-child {
.cell {
margin-left: -25px !important;
}
}
.el-table__body {
.el-table__cell:first-child {
.cell {
margin-left: -13px !important;
}
}
}
}
</style>
<style scoped>
:deep(.el-table--fit ) {
height: 311px !important;
}
</style>

View File

@@ -1,36 +1,35 @@
<template> <template>
<div v-loading="loading"> <div v-loading="loading" style="padding: 0 30px">
<baseTitle title="专项资金详情"></baseTitle> <baseTitle title="专项资金详情"></baseTitle>
<el-form :model="formData" ref="form" label-width="auto"> <el-form :model="formData" ref="form" >
<el-row> <el-row style="margin-left: 15px;margin-bottom: -18px">
<el-col :span="12"> <el-col :span="6">
<el-form-item label="专项名称"> <el-form-item label="专项名称">
<span>{{ formData.name }}</span> <span>{{ formData.name }}</span>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="12"> <el-col :span="6">
<el-form-item label="金额(元)"> <el-form-item label="金额(元)">
<span>{{ toThousands(formData.fundAmount) }}</span> <span>{{ toThousands(formData.fundAmount) }}</span>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="24"> <el-col :span="6">
<el-form-item label="剩余金额(元)"> <el-form-item label="剩余金额(元)">
<span>{{ toThousands(formData.residualAmount) }}</span> <span>{{ toThousands(formData.residualAmount) }}</span>
</el-form-item> </el-form-item>
</el-col> </el-col>
<baseTitle title="介绍"></baseTitle>
<el-col :span="24"> <el-col :span="24">
<el-form-item> <el-form-item label="专项资金情况说明" >
<el-card style="width: 100%"> <div style="white-space: pre-wrap">{{formData.introduce}}
<div v-html="formData.introduce">
</div> </div>
</el-card>
</el-form-item> </el-form-item>
</el-col> </el-col>
</el-row>
<el-row style="margin-bottom: -18px" class="projects">
<baseTitle title="关联项目" v-if="!data.taskId"></baseTitle> <baseTitle title="关联项目" v-if="!data.taskId"></baseTitle>
<el-col :span="24" v-if="!data.taskId"> <el-col :span="24" v-if="!data.taskId" >
<el-form-item> <el-form-item >
<fvTable style="width: 100%;max-height:162px" height="162" v-if="showTable" :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"/>
@@ -38,10 +37,10 @@
</fvTable> </fvTable>
</el-form-item> </el-form-item>
</el-col> </el-col>
<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: 162px;" height="162" v-if="showTable" :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"/>
@@ -49,7 +48,7 @@
</fvTable> </fvTable>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="24"> <el-col :span="24" style="margin-top: -18px">
<div v-if="data.taskId"> <div v-if="data.taskId">
<baseTitle title="审核意见"></baseTitle> <baseTitle title="审核意见"></baseTitle>
<el-form-item prop="auditOpinion"> <el-form-item prop="auditOpinion">
@@ -83,7 +82,10 @@
</div> </div>
</el-form> </el-form>
<opinion v-if="data.taskId" :formData="data.formData" :taskId="data.taskId" <opinion v-if="data.taskId" :formData="data.formData" :taskId="data.taskId"
:taskUserOptionList="data.taskUserOptionList"
v-model:value="formData.auditOpinion"></opinion> v-model:value="formData.auditOpinion"></opinion>
<file-preview ref="filePreviewRef" v-if="filePreviewShow" :fileName="filePreviewParam.fileName" :fileUrl="filePreviewParam.fileUrl"
:fileType="filePreviewParam.fileType"/>
</div> </div>
</template> </template>
@@ -132,6 +134,7 @@ const projectTable = reactive({
prop: 'projectName', prop: 'projectName',
label: '项目名称', label: '项目名称',
align: 'center', align: 'center',
width: 400
}, },
{ {
prop: 'specialFundAmount', prop: 'specialFundAmount',
@@ -171,6 +174,9 @@ const fileTable = reactive({
prop: 'originalFileName', prop: 'originalFileName',
label: '文件名', label: '文件名',
align: 'center', align: 'center',
width: 400,
showOverflowTooltip: false,
currentRender: ({row, index}) => (<div style="color: #2a99ff;cursor: pointer;" onClick={()=>clickToPreview(row)}>{row.originalFileName}</div>)
}, },
{ {
prop: 'tag', prop: 'tag',
@@ -195,6 +201,23 @@ const fileTable = reactive({
} }
] ]
}) })
const filePreviewParam = ref({
fileUrl: '',
fileName: '',
fileType: 'pdf'
})
const filePreviewShow = ref(false)
const clickToPreview=(row)=>{
filePreviewShow.value = false
filePreviewParam.value = {
fileUrl: row.url,
fileName: row.originalFileName,
fileType: row.fileType
}
nextTick(()=>{
filePreviewShow.value = true
})
}
const handleView=(row)=>{ const handleView=(row)=>{
router.push({ router.push({
name: 'Implementation/detail', name: 'Implementation/detail',
@@ -228,7 +251,25 @@ watch(() => props.showTable, (newVal) => {
</script> </script>
<style scoped lang="scss"> <style scoped lang="scss">
:deep(.el-table--fit ) { .projects{
:deep(.el-table--fit ) {
height: 300px !important; height: 300px !important;
}
}
:deep(.el-table__header) {
.is-leaf:first-child {
.cell {
margin-left: -20px !important;
}
}
}
:deep(.el-table__body) {
.el-table__cell:first-child {
.cell {
margin-left: -10px !important;
}
}
} }
</style> </style>

View File

@@ -1,155 +1,106 @@
<template> <template>
<div class="detail-block" v-loading="loading"> <div class="detail-block" v-loading="loading">
<baseTitle title="需求上报信息"></baseTitle>
<el-form :model="localFormData" ref="summaryForm" :rules="rules"> <el-form :model="localFormData" ref="summaryForm" :rules="rules">
<el-row gutter="50"> <baseTitle title="预期知识产权"></baseTitle>
<el-col :span="8"> <el-row gutter="20" style="margin-bottom: -18px;margin-left: 5px">
<el-form-item label="项目名称" prop="projectName"> <el-col :span="6">
<span>{{ localFormData.projectName }}</span> <el-form-item label="预期成果形式" prop="resultForm">
<span>{{ filterDict(cacheStore.getDict('result_form'), localFormData.resultForm) }}</span>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="8"> <el-col :span="6">
<el-form-item label="开始时间" prop="startTime">
<span>{{ localFormData.startTime }}</span>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="结束时间" prop="endTime">
<span>{{ localFormData.endTime }}</span>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="项目类型" prop="projectType">
<span>{{ filterDict(cacheStore.getDict('project_type'), localFormData.projectType) }}</span>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="研发主体" prop="rdSubject">
<span>{{ filterDict(cacheStore.getDict('rd_subject'), localFormData.rdSubject) }}</span>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="出资类型" prop="investmentType">
<span>{{ filterDict(cacheStore.getDict('invest_type'), localFormData.investmentType) }}</span>
</el-form-item>
</el-col>
<!-- <el-col :span="8">-->
<!-- <el-form-item label="项目影响" prop="projectImpact">-->
<!-- <span>{{ filterDict(cacheStore.getDict('project_impact'), localFormData.projectImpact) }}</span>-->
<!-- </el-form-item>-->
<!-- </el-col>-->
<el-col :span="8">
<el-form-item label="所属业务板块" prop="businessSegment">
<span>{{ filterDict(cacheStore.getDict('business_segment'), localFormData.businessSegment) }}</span>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="预期技术标准制定" prop="technicalStandard">
<span>{{ filterDict(cacheStore.getDict('technical_standard'), localFormData.technicalStandard) }}</span>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="产学研联合" prop="industryUniversityResearch">
<span>{{
filterDict(cacheStore.getDict('industry_university'), localFormData.industryUniversityResearch)
}}</span>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="开展政府申报" prop="governmentDeclaration">
<span>{{
filterDict(cacheStore.getDict('government_declaration'), localFormData.governmentDeclaration)
}}</span>
</el-form-item>
</el-col>
<el-col :span="8" v-if="localFormData.isSpecialFund">
<el-form-item label="专项资金名称" prop="specialFund">
<span>{{
localFormData.specialFundId === 0 ? localFormData.specialFund : changeName(fundOption, localFormData.specialFundId)
}}</span>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="知识产权状况" prop="intellectualProperty"> <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="16"> <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="24">
<baseTitle title="预期知识产权"></baseTitle>
</el-col>
<el-col :span="8">
<el-form-item label="发明专利(项)" prop="inventionPatent"> <el-form-item label="发明专利(项)" prop="inventionPatent">
<span>{{ localFormData.inventionPatent }}</span> <span>{{ localFormData.inventionPatent }}</span>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="8"> <el-col :span="6">
<el-form-item label="实用性新型专利(项)" prop="newPatent"> <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="8"> <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="8"> <el-col :span="6">
<el-form-item label="著作权(项)" prop="copyright"> <el-form-item label="著作权(项)" prop="copyright">
<span>{{ localFormData.copyright }}</span> <span>{{ localFormData.copyright }}</span>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="8"> <el-col :span="6">
<el-form-item label="其他(项)" prop="other"> <el-form-item label="其他(项)" prop="other">
<span>{{ localFormData.other }}</span> <span>{{ localFormData.other }}</span>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="8"> </el-row>
<el-form-item label="经济预算(元)" prop="economicEstimate">
<span>{{ toThousands(localFormData.economicEstimate) }}</span> <baseTitle title="项目描述"></baseTitle>
</el-form-item> <el-row gutter="20" style="margin-left: 5px;margin-bottom: -18px;">
</el-col>
<el-col :span="8">
<el-form-item label="其中申请公司总部科技创新专项资金(元)" prop="specialFundAmount"
v-if="localFormData.isSpecialFund">
<span>{{ toThousands(localFormData.specialFundAmount) }}</span>
</el-form-item>
</el-col>
<el-col :span="24"> <el-col :span="24">
<el-form-item label="现有业务描述" prop="serviceDescription"> <el-form-item label="现有业务描述" prop="serviceDescription">
<span>{{ localFormData.serviceDescription }}</span> <span style="white-space: pre-wrap">{{ localFormData.serviceDescription }}</span>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="24"> <el-col :span="24">
<el-form-item label="研发项目关键内容描述" prop="contentDescription"> <el-form-item label="建设目标描述" prop="contentDescription">
<span>{{ localFormData.contentDescription }}</span> <span style="white-space: pre-wrap">{{ localFormData.contentDescription }}</span>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="24"> </el-row>
<baseTitle title="需求上报申请书"></baseTitle>
</el-col> <baseTitle title="需求上报申请书" style="margin-bottom: -3px;"></baseTitle>
<el-col :span="24"> <!-- <el-row gutter="20" style="margin-bottom: -15px;">-->
<el-form-item> <!-- <el-col :span="24">-->
<el-button type="primary" link @click="handleDownload(localFormData.singleFile)" style="font-size: 16px"> <!-- <single-file-component tag="需求上报" v-model:value="localFormData.singleFile" :processViewer="processViewer"/>-->
{{ localFormData.singleFile?.originalFileName }} <!-- &lt;!&ndash; <el-form-item>&ndash;&gt;-->
</el-button> <!-- &lt;!&ndash; {{localFormData.singleFile}}&ndash;&gt;-->
</el-form-item> <!-- &lt;!&ndash; <el-button type="primary" link @click="handleDownload(localFormData.singleFile)" style="font-size: 16px">&ndash;&gt;-->
</el-col> <!-- &lt;!&ndash; {{ localFormData.singleFile?.originalFileName }}&ndash;&gt;-->
<el-col :span="24"> <!-- &lt;!&ndash; </el-button>&ndash;&gt;-->
<baseTitle title="附件列表"></baseTitle> <!-- &lt;!&ndash; </el-form-item>&ndash;&gt;-->
</el-col> <!-- </el-col>-->
<el-col :span="24"> <!-- </el-row>-->
<!--/* <baseTitle title="附件文件" style="margin-bottom: 0"></baseTitle>*/-->
<el-row gutter="20" style="margin-bottom: -18px;">
<el-col :span="24" class="file-table-style">
<file-component tag="需求上报" <file-component tag="需求上报"
v-model:value="localFormData.fileList" :processViewer="processViewer" v-model:value="localFormData.fileList" :processViewer="processViewer"
:file-list-show="fileListShow"/> :file-list-show="fileListShow"/>
</el-col> </el-col>
<el-col :span="24"> <el-col :span="24" style="margin-top: -15px">
<div v-if="data.taskId||data.state==='4'"> <div v-if="data.taskId">
<baseTitle title="审核意见"></baseTitle>
<el-form-item prop="_value">
<el-input
v-model="_value"
:rows="3"
type="textarea"
placeholder="请输入审核意见"
/>
</el-form-item>
</div>
<div v-if="data.state==='5'" style="margin-bottom: 15px">
<baseTitle title="前置流程" v-if="localFormData.preProcess"></baseTitle>
<div style="display: flex;align-items: center;flex-wrap: wrap;">
<div v-for="(item,index) in localFormData.preProcess" :key="item.requestId">
<a :href="item.baseUrl" target="_blank"
style="color: #2a99ff;cursor: pointer">{{ item.requestName }}<span
v-if="index != localFormData.preProcess.length -1"></span>
</a>
</div>
</div>
</div>
<div v-perm="['annual:plan:approve']" v-if="data.state==='4'">
<baseTitle title="前置流程"></baseTitle>
<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
@@ -163,7 +114,7 @@
</el-col> </el-col>
</el-row> </el-row>
<div class="approval-record"> <div class="approval-record">
<div class="approval-title"> <div class="approval-title" style="margin-top: -12px">
<baseTitle title="审批记录"></baseTitle> <baseTitle title="审批记录"></baseTitle>
<div class="diagram"> <div class="diagram">
<div class="base-title">流程图</div> <div class="base-title">流程图</div>
@@ -201,6 +152,7 @@ import {getSubCompOpt} from "@/api/user/user";
import FileComponent from "./FileComponent.vue"; 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";
const emit = defineEmits(['update:value']) const emit = defineEmits(['update:value'])
const tagsViewStore = useTagsView() const tagsViewStore = useTagsView()
@@ -263,9 +215,9 @@ const handleRejectPlan = async () => {
return return
} }
const params = { const params = {
auditOpinion:_value.value, auditOpinion: _value.value,
projectId:parseInt(route.query.projectId), projectId: parseInt(route.query.projectId),
state:false state: false
} }
// console.log('params', params) // console.log('params', params)
const res = await approvePlan(params) const res = await approvePlan(params)
@@ -281,11 +233,12 @@ const handleRejectPlan = async () => {
} }
const handleAgreePlan = async () => { const handleAgreePlan = async () => {
const params = { const params = {
auditOpinion:_value.value, auditOpinion: _value.value,
projectId:parseInt(route.query.projectId), projectId: parseInt(route.query.projectId),
state:true preProcess: JSON.stringify(localFormData.value.preProcess),
state: true
} }
// console.log('params', params)
const res = await approvePlan(params) const res = await approvePlan(params)
ElNotification({ ElNotification({
title: '提示', title: '提示',
@@ -355,6 +308,7 @@ watch(() => props.loading, (newVal) => {
}, {deep: true}) }, {deep: true})
watchEffect(() => { watchEffect(() => {
props.formData.singleFile = [props.formData.singleFile]
return Object.keys(props.formData).length && (localFormData.value = props.formData) return Object.keys(props.formData).length && (localFormData.value = props.formData)
}) })
@@ -365,6 +319,24 @@ getFundOptions()
.detail-block { .detail-block {
overflow-x: hidden; overflow-x: hidden;
overflow-y: auto; overflow-y: auto;
padding-bottom: 0!important; padding-bottom: 0 !important;
} }
.file-table-style{
: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;
}
}
}
}
</style> </style>

View File

@@ -0,0 +1,209 @@
<template>
<el-form :label-position="labelAlign">
<el-form-item :label="title?'其他文件':''" :label-position="labelAlign" :label-width="title?95:''">
<fvTable style="width: 100%;max-height: 80px;" v-if="processViewer" height="80" :tableConfig="tableConfig"
:data="_value" :isSettingCol="false" :pagination="false">
<template #empty>
<el-empty :image-size="55" description="暂无数据" style="padding: 0"/>
</template>
</fvTable>
</el-form-item>
</el-form>
<file-preview ref="filePreviewRef" :fullscreen="fullscreen" v-if="filePreviewShow" :fileName="filePreviewParam.fileName" :fileUrl="filePreviewParam.fileUrl"
:fileType="filePreviewParam.fileType"/>
</template>
<script setup lang="jsx">
import {downloadFile, deleteFile} from "@/api/project-demand";
import {ElNotification} from "element-plus";
const props = defineProps({
title: {
type: String,
default: ''
},
tag: {
type: String,
default: ''
},
fileNameTableWidth: {
type: String,
default: '400'
},
value: {
type: Array,
default: []
},
processViewer: {
type: Boolean,
default: false
},
labelAlign: {
type: String,
default: 'right'
},
//弹窗是否铺满全屏
fullscreen: {
type: Boolean,
default: false
}
})
const emit = defineEmits(['update:value'])
const tableConfig = reactive({
columns: [
{
prop: 'index',
type: 'index',
label: '序号',
align: 'center',
width: 85,
},
{
prop: 'originalFileName',
label: '文件名',
align: 'center',
width: props.fileNameTableWidth,
showOverflowTooltip: false,
currentRender: ({row, index}) => (<div style="color: #2a99ff;cursor: pointer;" onClick={()=>clickToPreview(row)}>{row.originalFileName}</div>)
},
{
prop: 'tag',
label: '标签',
align: 'center'
},
{
prop: 'size',
label: '文件大小',
align: 'center',
width: 150,
currentRender: ({row, index}) => (parseInt(row.size / 1024) + 'KB')
},
{
prop: 'oper',
label: '操作',
align: 'center',
showOverflowTooltip: false,
currentRender: ({row, index}) => {
let btn = []
btn.push({label: '下载', func: () => handleDownload(row), type: 'primary'})
// if (row.newFile) {
// btn.push({label: '删除', func: () => handleDelete(row), type: 'primary'})
// }
return (
<div style={{width: '100%'}}>
{
btn.map(item => (
<el-button
type={item.type}
onClick={() => item.func()}
link>
{item.label}
</el-button>
))
}
{
row.newFile ? <popover-delete name={row.originalFileName} type={'文件'} btnType={'danger'}
onDelete={() => handleDelete(row)}/>
: ''
}
</div>
)
}
}
]
})
const filePreviewParam = ref({
fileUrl: '',
fileName: '',
fileType: 'pdf'
})
const filePreviewShow = ref(false)
const clickToPreview=(row)=>{
filePreviewShow.value = false
filePreviewParam.value = {
fileUrl: row.url,
fileName: row.originalFileName,
fileType: row.fileType
}
nextTick(()=>{
filePreviewShow.value = true
})
}
const _value = computed({
get() {
return props.value;
},
set(val) {
emit("update:value", val);
}
})
const getOtherFile = (val) => {
props.processViewer = false
let fileObj = compositeParam(val)
_value.value.push(fileObj)
nextTick(() => {
props.processViewer = true
})
}
const compositeParam = (item, type) => {
return {
fileId: item.id,
size: item.size,
originalFileName: item.originalFilename,
fileType: item.fileType,
url: item.url,
newFile: true,
tag: props.tag
}
}
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 handleDelete = (row) => {
deleteFile(row.fileId).then(res => {
ElNotification({
title: '提示',
message: res.msg,
type: res.code === 1000 ? 'success' : 'error'
})
if (res.code === 1000) {
_value.value.splice(_value.value.findIndex((item) => item.fileId === row.fileId), 1);
}
});
}
watch(() => props.processViewer, (newVal) => {
props.processViewer = newVal
}, {deep: true})
</script>
<style scoped lang="scss">
:deep(.el-table--fit ) {
height: 80px !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;
}
}
}
</style>

View File

@@ -67,7 +67,6 @@ const handleRemove = (file) => {
} }
const beforeUpload = () => { const beforeUpload = () => {
// loading.value = true // loading.value = true
console.log('水电费水电费,beforeUpload')
return true return true
} }
const httpRequestHandle = (param) => { const httpRequestHandle = (param) => {

View File

@@ -3,12 +3,16 @@
<slot name="pre"></slot> <slot name="pre"></slot>
<div class="user-audit"> <div class="user-audit">
<div class="circle-user"> <div class="circle-user">
<Tooltip :content="user.name" placement="bottom-start" width="45px"/> <Tooltip v-if="userName" :content="userName" placement="bottom-start" width="45px"/>
<Tooltip v-else :content="user.name" placement="bottom-start" width="45px"/>
<!-- :style="{-->
<!-- backgroundColor: '#fff'-->
<!-- }">-->
<div v-if="user.icon" <div v-if="user.icon"
class="el-timeline-item__node" :style="{ class="el-timeline-item__node">
backgroundColor: user.color <div v-if="user.isAgent&&!showIcon">
}"> </div>
<el-icon v-if="user.icon" size="15" :class="user.class"> <el-icon v-else size="15" :color="user.color" :class="user.class">
<component :is="user.icon"/> <component :is="user.icon"/>
</el-icon> </el-icon>
</div> </div>
@@ -18,7 +22,6 @@
</template> </template>
<script setup> <script setup>
import {Loading, Close, CircleCheckFilled, MoreFilled} from '@element-plus/icons-vue'
const props = defineProps({ const props = defineProps({
row: { row: {
@@ -29,14 +32,26 @@ const props = defineProps({
type: Boolean, type: Boolean,
default: false default: false
}, },
showIcon: {
type: Boolean,
default: false
},
user: { user: {
type: Object, type: Object,
default: {} default: {}
}, },
userName: {
type: String,
default: ''
},
mode: { mode: {
type: String, type: String,
default: 'design' default: 'design'
} },
type: {
type: String,
default: ''
},
}) })
const init = () => { const init = () => {
@@ -49,29 +64,41 @@ const initUser = (user) => {
let state = user.state let state = user.state
//创建节点 //创建节点
if (state === 'CREATE') { if (state === 'CREATE') {
user["icon"] = CircleCheckFilled user["icon"] = 'CircleCheckFilled'
user["color"] = "#0bbd87" user["color"] = "#0bbd87"
} }
//审批通过 //审批通过
if (state === 'AGREE' || state === 'AUTO_PASS') { if (state === 'AGREE' || state === 'AUTO_PASS') {
user["icon"] = CircleCheckFilled user["icon"] = 'CircleCheckFilled'
user["color"] = "#0bbd87" user["color"] = "#0bbd87"
} }
if (props.type === "CC") {
user["icon"] = "Promotion"
user["color"] = "#3395f8"
}
//审批处理中 //审批处理中
if (state === 'RUNNING') { if (state === 'RUNNING') {
user["icon"] = Loading user["icon"] = 'Loading'
user["color"] = "#f78f5f" user["color"] = "#f78f5f"
user["class"] = 'is-loading' user["class"] = 'is-loading'
} }
//拒绝后评论 //拒绝后评论
if (state === 'REFUSE') { if (state === 'REFUSE' || state === 'ROLLBACK') {
user["icon"] = Close // user["icon"] = 'Close'
// user["color"] = "#f56c6c"
user["icon"] = 'CircleCloseFilled'
user["color"] = "#f56c6c" user["color"] = "#f56c6c"
} }
if (state === 'PASS') { if (state === 'PASS') {
user["icon"] = MoreFilled user["icon"] = 'MoreFilled'
user["color"] = "#c0c4cc" user["color"] = "#c0c4cc"
} }
// if (state === 'ROLLBACK') {
// // user["icon"] = 'RefreshLeft'
// // user["color"] = "#f78f5f"
// user["icon"] = 'CircleCloseFilled'
// user["color"] = "#f56c6c"
// }
return user; return user;
} }
@@ -95,13 +122,12 @@ init()
position: relative; position: relative;
background-color: #8a7243; background-color: #8a7243;
color: #fff; color: #fff;
.el-timeline-item__node { .el-timeline-item__node {
position: absolute; position: absolute;
bottom: 0; bottom: 0;
right: 1px; right: 1px;
} }
} }
} }
</style> </style>

View File

@@ -1,7 +1,7 @@
<template> <template>
<div style="display: flex;justify-content: center"> <div style="display: flex;justify-content: center">
<span class="stateIcon" :style="{backgroundColor: filterDictClass(cacheStore.getDict(dictType), value)}"></span> <span class="stateIcon" :style="{backgroundColor: filterDictClass(cacheStore.getDict(dictType), value)}"></span>
<span>{{tag.label}}</span> <span>{{tagConfig.label}}</span>
<span> {{ filterDict(cacheStore.getDict(dictType), value) }}</span> <span> {{ filterDict(cacheStore.getDict(dictType), value) }}</span>
</div> </div>
</template> </template>
@@ -21,37 +21,43 @@ const props = defineProps({
default: null default: null
} }
}); });
const tag = reactive({ const tagConfig = reactive({
listClass: "green", listClass: "green",
isType: true, isType: true,
label: "" label: ""
}); });
// const dictList = cacheStore.getDict(props.dictType);
// const dictFormat = () => {
// if(dictList===undefined) return;
// for (let i = 0; i < dictList.length; i++) {
// if(dictList[i].value=== props.value){
// tag.label = dictList[i].label;
// tag.listClass=changeParams(dictList[i].listClass)
// tag.isType = dictList[i].isType;
// }
// }
// };
const filterDictClass = (data, value) => {
if(!data) return
if(data instanceof Array) { const filterDictClass = (data, value) => {
tag.value = data.find(item => item.value == value) if (!data|| value == null) return 'gray'
if (data instanceof Array) {
tagConfig.value = data.find(item => item.value == value)
if (!tagConfig.value) {
return '#409EFF'
} else {
if (tagConfig.value?.isType) {
return changeParams(tagConfig.value.listClass)
} else {
return tagConfig.value.listClass
}
}
} }
return changeParams(tag.value.listClass)
} }
const filterDict = (data, value) => { const filterDict = (data, value) => {
if(!data) return if (!data || value == null) return '未知'
if (data instanceof Array) {
if(data instanceof Array) { if (value == true || value == false) {
tag.value = data.find(item => item.value == value) tagConfig.value = data.find(item => item.value == value.toString())
} else if (typeof value === "object") {
if (value !== null) {
tagConfig.value = data.find(item => item.value == value[0])
} else {
tagConfig.value = {}
} }
return tag.value.label } else {
tagConfig.value = data.find(item => item.value == value)
}
}
return tagConfig.value?.label || '未知'
} }
/** /**
* 根据接口返回的listClass切换成对应的颜色 * 根据接口返回的listClass切换成对应的颜色

View File

@@ -9,8 +9,10 @@
@cancel="handleCancel" @cancel="handleCancel"
> >
<template #reference> <template #reference>
<!-- v-perm="perm"--> <el-button :type="btnType" size="mini" :disabled="isDisabled" v-if="perm" v-perm="perm" :icon="btnIcon" :plain="isPlain" :link="link">
<el-button :type="btnType" size="mini" :disabled="isDisabled" :icon="btnIcon" :plain="isPlain" :link="link"> {{ btnText }}
</el-button>
<el-button :type="btnType" size="mini" :disabled="isDisabled" v-else :icon="btnIcon" :plain="isPlain" :link="link">
{{ btnText }} {{ btnText }}
</el-button> </el-button>
</template> </template>
@@ -45,7 +47,7 @@ const props = defineProps({
}, },
perm: { perm: {
type: Array, type: Array,
default: [''] default: null
}, },
isDisabled: { isDisabled: {
type: Boolean, type: Boolean,

View File

@@ -1,10 +1,20 @@
<template> <template>
<div v-loading="_value"> <div v-loading="_value">
<el-form :model="attachment" inline> <el-form :model="attachment" inline style="margin-left: 15px" @submit.prevent="handleSearch">
<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="tag" v-if="type==='40'"> <el-form-item label="类型" prop="targetState" v-if="allFile">
<el-select v-model="attachment.targetState" placeholder="请选择类型" clearable filterable style="width: 300px">
<el-option
v-for="item in cacheStore.getDict('archive_file_type')"
:key="item.value"
:label="item.label"
:value="item.value"
/>
</el-select>
</el-form-item>
<el-form-item label="标签" prop="tag" v-if="type==='30'">
<el-select v-model="attachment.tag" placeholder="请选择标签" clearable filterable style="width: 300px"> <el-select v-model="attachment.tag" placeholder="请选择标签" clearable filterable style="width: 300px">
<el-option <el-option
v-for="item in tagsOption" v-for="item in tagsOption"
@@ -17,17 +27,19 @@
<el-form-item> <el-form-item>
<el-button @click="handleSearch" color="#DED0B2">搜索</el-button> <el-button @click="handleSearch" color="#DED0B2">搜索</el-button>
<el-button @click="handleReset">重置</el-button> <el-button @click="handleReset">重置</el-button>
<el-button v-if="uploadState" color="#DED0B2" @click="handleUpload">上传附件</el-button> <el-button v-if="uploadState&&!allFile" color="#DED0B2" @click="handleUpload">上传附件</el-button>
</el-form-item> </el-form-item>
</el-form> </el-form>
<el-card style="width: 100%"> <el-card style="width: 100%;overflow-y: hidden">
<fvTable style="width: 100%;max-height: 300px" v-if="showTable" height="300" :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>
<el-empty :image-size="99" description="暂无数据" style="padding: 0"/> <el-empty :image-size="99" description="暂无数据" style="padding: 0"/>
</template> </template>
</fvTable> </fvTable>
</el-card> </el-card>
<file-preview ref="filePreviewRef" v-if="filePreviewShow" :fileName="filePreviewParam.fileName" :fileUrl="filePreviewParam.fileUrl"
:fileType="filePreviewParam.fileType"/>
</div> </div>
</template> </template>
@@ -35,10 +47,12 @@
import {downloadFile} from "@/api/project-demand"; import {downloadFile} from "@/api/project-demand";
import {ElNotification} from "element-plus"; import {ElNotification} from "element-plus";
import {getTags} from "@/api/project-manage"; import {getTags} from "@/api/project-manage";
import {computed} from "vue"; import {computed, ref} from "vue";
import {useCacheStore} from '@/stores/cache.js'
const route = useRoute() const route = useRoute()
const router = useRouter() const router = useRouter()
const cacheStore = useCacheStore()
const attachment = reactive({}) const attachment = reactive({})
const emit = defineEmits(['search','update:modelValue']) const emit = defineEmits(['search','update:modelValue'])
const props = defineProps({ const props = defineProps({
@@ -57,15 +71,28 @@ const props = defineProps({
loading: { loading: {
type: Boolean, type: Boolean,
default: true default: true
},
allFile: {
type: Boolean,
default: false
} }
}) })
const tagsOption = ref([]) const tagsOption = ref([])
const tableConfig = reactive({ const tableConfig = reactive({
columns: [ columns: [
{ {
prop: 'originalFileName', prop: 'index',
label: '附件名称', type: 'index',
label: '序号',
align: 'center', 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: 'tag', prop: 'tag',
@@ -107,6 +134,23 @@ const _value = computed({
emit('update:modelValue', value) emit('update:modelValue', value)
} }
}) })
const filePreviewParam = ref({
fileUrl: '',
fileName: '',
fileType: 'pdf'
})
const filePreviewShow = ref(false)
const clickToPreview=(row)=>{
filePreviewShow.value = false
filePreviewParam.value = {
fileUrl: row.url,
fileName: row.originalFileName,
fileType: row.fileType
}
nextTick(()=>{
filePreviewShow.value = true
})
}
const getTagsOption = () => { const getTagsOption = () => {
if (!route.query.id) return if (!route.query.id) return
getTags(route.query.id).then(res => { getTags(route.query.id).then(res => {
@@ -126,6 +170,7 @@ const handleSearch = () => {
} }
const handleReset=()=>{ const handleReset=()=>{
attachment.fileName='' attachment.fileName=''
attachment.targetState=''
attachment.tag=null attachment.tag=null
emit('search', {}) emit('search', {})
} }
@@ -151,12 +196,12 @@ watch(() => props.fileList, (val) => {
}) })
props.fileList = val props.fileList = val
}) })
if (props.type === '40') { if (props.type === '30') {
getTagsOption() getTagsOption()
} }
onActivated(()=>{ onActivated(()=>{
if (props.type === '40') { if (props.type === '30') {
getTagsOption() getTagsOption()
} }
handleSearch() handleSearch()
@@ -164,5 +209,7 @@ onActivated(()=>{
</script> </script>
<style scoped> <style scoped>
:deep(.el-table--fit ) {
height: 318px !important;
}
</style> </style>

View File

@@ -0,0 +1,191 @@
<template>
<div style="display: flex;align-items: center;flex-wrap: wrap;">
<el-button color="#DED0B2" @click="handleShowPreTable" style="margin-right: 10px">
{{
localFormData.preProcess && localFormData.preProcess.length > 0 ? '更改' : '请选择前置流程'
}}
</el-button>
<div v-for="(item,index) in localFormData.preProcess" :key="item.requestId">
<a :href="item.baseUrl" target="_blank"
style="color: #2a99ff;cursor: pointer">{{ item.requestName }}<span
v-if="index != localFormData.preProcess.length -1"></span>
</a>
</div>
</div>
<el-dialog v-if="showPreTable" title="前置流程" v-model="showPreTable" width="80%">
<el-form :model="preProcessForm" inline @submit.prevent="getPreProcessList">
<el-form-item label="请求名称">
<el-input v-model="preProcessForm.requestName" placeholder="请输入请求名称" clearable>
</el-input>
</el-form-item>
<el-form-item>
<el-button color="#DED0B2" @click="getPreProcessList">搜索</el-button>
<el-button @click="handleReset">重置</el-button>
</el-form-item>
<el-form-item>
<el-tag type="danger" style="font-size: 16px;color: red;" >特别提示{{ getPreProcessTag(localFormData.projectImpact,basicData.projectImpact) }}</el-tag>
</el-form-item>
</el-form>
<el-table :data="preProcessList" v-loading="loading"
@select="handleSelect" @select-all="handleSelect" row-key="requestId" ref="preProcessTable">
<el-table-column type="selection" width="55" :reserve-selection="true"/>
<el-table-column prop="requestId" label="请求id"></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="lastOperateTime" label="最后操作时间"></el-table-column>
<el-table-column prop="currentNodeName" label="当前节点"></el-table-column>
<el-table-column prop="creatorName" label="创建人"></el-table-column>
<el-table-column prop="createTime" label="创建时间"></el-table-column>
<el-table-column label="操作" align="center">
<template #default="scope">
<a :href="scope.row.baseUrl" target="_blank" style="color: #2a99ff;margin-left: 10px">查看流程</a>
</template>
</el-table-column>
</el-table>
<paging :current-page="pageInfo.pageNum" :page-size="pageInfo.pageSize" :page-sizes="[10, 20, 30, 40,50]"
:total="total" @changeSize="handleSizeChange" @goPage="handleCurrentChange"/>
<div class="oper">
<el-button color="#DED0B2" @click="choosePreProcess">确定</el-button>
<el-button @click="handleCancel">取消</el-button>
</div>
</el-dialog>
</template>
<script setup>
import {
getPreProcess
} from "@/api/project-manage";
import Paging from "@/components/pagination/index.vue";
const props = defineProps({
formData: {
type: Object,
default: {}
},
basicData: {
type: Object,
default: {}
},
})
const loading = ref(false)
//暂存数据
const currentList = ref([])
const showPreTable = ref(false)
const selectRows = ref([])
const preProcessList = ref([])
const total = ref(0)
const localFormData = ref({
projectPersonIds: [],
projectChargePerson: null,
preProcess: [
// {
// requestId: null,
// requestName: '',
// baseUrl: ''
// }
]
})
const preProcessForm = reactive({
requestName: ''
})
const pageInfo = reactive({
pageNum: 1,
pageSize: 10,
})
const getPreProcessTag = (impact,basicImpact) => {
let data=''
if(impact){
data= impact
}else if(basicImpact){
data= basicImpact
}
if (data == 1) {
//一般项目
return '一般项目20万以下要总经理审批'
} else if (data == 2) {
//重大项目
return '重大项目20万元到500万元之间要总办会审批'
} else if (data == 3) {
//特别重大项目
return '特别重大项目500万元以上要董事会审批'
}
}
const handleReset = () => {
preProcessForm.requestName = ''
getPreProcessList()
}
const handleSelect = async (selection) => {
selectRows.value = selection
}
const handleShowPreTable = () => {
showPreTable.value = true
getPreProcessList()
}
const handleCancel = () => {
showPreTable.value = false
}
const choosePreProcess = () => {
let preProcessObj = {}
let preProcessArray = []
selectRows.value.forEach((item) => {
preProcessObj = {
requestId: item.requestId,
requestName: item.requestName,
baseUrl: item.baseUrl
}
preProcessArray.push(preProcessObj)
})
localFormData.value.preProcess = preProcessArray
showPreTable.value = false
localStorage.setItem('preProcess', JSON.stringify(preProcessArray))
}
const getPreProcessList = () => {
loading.value = true
getPreProcess().then(res => {
loading.value = false
let searchArray = []
let regexPattern = ("%" + preProcessForm.requestName + "%").replace(/%/g, '.*').replace(/_/g, '.');
let regex = new RegExp('^' + regexPattern + '$');
res.data.filter((item) => {
if (regex.test(item.requestName)) {
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
currentList.value = searchArray
preProcessList.value = currentList.value.slice(0, 10)
})
}
//切换每页显示条数
const handleSizeChange = (val) => {
pageInfo.pageSize = val;
preProcessList.value = currentList.value.slice((pageInfo.pageNum - 1) * val, pageInfo.pageNum * val)
};
//点击页码进行分页功能
const handleCurrentChange = (val) => {
pageInfo.pageNum = val;
preProcessList.value = currentList.value.slice((val - 1) * pageInfo.pageSize, val * pageInfo.pageSize)
};
watchEffect(() => {
return Object.keys(props.formData).length && (localFormData.value = props.formData)
})
</script>
<style scoped>
.oper {
margin-top: 20px;
display: flex;
justify-content: flex-end;
}
</style>

View File

@@ -3,7 +3,7 @@
<el-form :model="formData" ref="tagForm" label-width="auto" :rules="rules"> <el-form :model="formData" ref="tagForm" label-width="auto" :rules="rules">
<el-form-item label="标签名称" prop="tagName"> <el-form-item label="标签名称" prop="tagName">
<el-input v-model="formData.tagName" placeholder="请输入标签名称" style="width: 300px" v-if="showInput"/> <el-input v-model="formData.tagName" placeholder="请输入标签名称" style="width: 300px" v-if="showInput"/>
<el-select v-model="formData.tagName" placeholder="请选择标签" clearable filterable style="width: 300px" v-else> <el-select v-model="formData.tagName" placeholder="请选择标签" remote clearable filterable style="width: 300px" v-else>
<el-option <el-option
v-for="item in tagsOption" v-for="item in tagsOption"
:key="item.label" :key="item.label"
@@ -16,7 +16,7 @@
<baseTitle title="其他文件"></baseTitle> <baseTitle title="其他文件"></baseTitle>
<el-card style="width: 100%;margin: 15px 0"> <el-card style="width: 100%;margin: 15px 0">
<file-upload @getFile="getFiles"/> <file-upload @getFile="getFiles"/>
<fvTable style="width: 100%;max-height: 162px;height: 162px" height="162" v-if="showTable" :tableConfig="tableConfig" <fvTable style="width: 100%;max-height: 160px;height: 160px" height="160" v-if="showTable" :tableConfig="tableConfig"
:data="fileList" :isSettingCol="false" :pagination="false"> :data="fileList" :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"/>
@@ -59,7 +59,7 @@ const tableConfig = reactive({
}, },
{ {
prop: 'originalFileName', prop: 'originalFileName',
label: '件名', label: '件名',
align: 'center', align: 'center',
}, },
{ {

View File

@@ -1,5 +1,5 @@
<template> <template>
<div class="tinymce-boxz"> <div class="tinymce-boxz" style="width: 100%">
<Editor v-model="content" :init="init"/> <Editor v-model="content" :init="init"/>
</div> </div>
</template> </template>
@@ -8,7 +8,7 @@
import tinymce from 'tinymce' import tinymce from 'tinymce'
import Editor from "@tinymce/tinymce-vue"; import Editor from "@tinymce/tinymce-vue";
import {defineProps} from "vue"; import {defineProps} from "vue";
import {ElMessage} from "element-plus"; import {ElLoading, ElMessage, ElNotification} from "element-plus";
import {getToken} from '@/utils/auth' import {getToken} from '@/utils/auth'
import axios from "axios"; import axios from "axios";
@@ -36,6 +36,7 @@ import 'tinymce/plugins/insertdatetime'
import 'tinymce/plugins/lists' import 'tinymce/plugins/lists'
import 'tinymce/plugins/wordcount' import 'tinymce/plugins/wordcount'
import 'tinymce/plugins/autosave' import 'tinymce/plugins/autosave'
import '@/assets/axupimgs/plugin.js'//多图上传插件
const emit = defineEmits(['update:value']) const emit = defineEmits(['update:value'])
const props = defineProps({ const props = defineProps({
@@ -55,7 +56,8 @@ const props = defineProps({
plugins: { plugins: {
type: [String, Array], type: [String, Array],
default: default:
"preview searchreplace autolink directionality visualblocks visualchars fullscreen image 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: {
type: [String, Array], type: [String, Array],
@@ -68,11 +70,11 @@ const props = defineProps({
type: [String, Array], type: [String, Array],
default: "微软雅黑=Microsoft YaHei,Helvetica Neue,PingFang SC,sans-serif;苹果苹方=PingFang SC,Microsoft YaHei,sans-serif;宋体=simsun,serif;仿宋体=FangSong,serif;黑体=SimHei,sans-serif;Arial=arial,helvetica,sans-serif;Arial Black=arial black,avant garde;Book Antiqua=book antiqua,palatino;" default: "微软雅黑=Microsoft YaHei,Helvetica Neue,PingFang SC,sans-serif;苹果苹方=PingFang SC,Microsoft YaHei,sans-serif;宋体=simsun,serif;仿宋体=FangSong,serif;黑体=SimHei,sans-serif;Arial=arial,helvetica,sans-serif;Arial Black=arial black,avant garde;Book Antiqua=book antiqua,palatino;"
}, },
width:{ width: {
type: String, type: String,
default: 'auto' default: 'auto'
}, },
height:{ height: {
type: Number, type: Number,
default: 500 default: 500
} }
@@ -88,21 +90,21 @@ const init = reactive({
placeholder: "在这里输入文字", //textarea中的提示信息 placeholder: "在这里输入文字", //textarea中的提示信息
min_width: 300, min_width: 300,
min_height: 200, min_height: 200,
width:props.width, width: props.width,
height: props.height, //注引入autoresize插件时此属性失效 height: props.height, //注引入autoresize插件时此属性失效
resize: "both", //编辑器宽高是否可变false-否,true-高可变,'both'-宽高均可,注意引号 resize: "both", //编辑器宽高是否可变false-否,true-高可变,'both'-宽高均可,注意引号
promotion: false, promotion: false,
branding: false, //tiny技术支持信息是否显示 branding: false, //tiny技术支持信息是否显示
// statusbar: false, //最下方的元素路径和字数统计那一栏是否显示 statusbar: false, //最下方的元素路径和字数统计那一栏是否显示
// elementpath: false, //元素路径是否显示 elementpath: false, //元素路径是否显示
font_formats: props.fontFormats, //字体样式 font_formats: props.fontFormats, //字体样式
plugins: props.plugins, //插件配置 axupimgs indent2em plugins: props.plugins, //插件配置 axupimgs indent2em
toolbar: props.toolbar, //工具栏配置设为false则隐藏 toolbar: props.toolbar, //工具栏配置设为false则隐藏
// menubar: "file edit my1", //菜单栏配置设为false则隐藏不配置则默认显示全部菜单也可自定义配置--查看 http://tinymce.ax-z.cn/configure/editor-appearance.php --搜索“自定义菜单” menubar: "file edit view format table tools", //菜单栏配置设为false则隐藏不配置则默认显示全部菜单也可自定义配置--查看 http://tinymce.ax-z.cn/configure/editor-appearance.php --搜索“自定义菜单”
// images_upload_url: '/apib/api-upload/uploadimg', //后端处理程序的url建议直接自定义上传函数image_upload_handler这个就可以不用了 images_upload_url: '/workflow/process/file/upload', //后端处理程序的url建议直接自定义上传函数image_upload_handler这个就可以不用了
// images_upload_base_path: '/demo', //相对基本路径--关于图片上传建议查看--http://tinymce.ax-z.cn/general/upload-images.php // images_upload_base_path: '/demo', //相对基本路径--关于图片上传建议查看--http://tinymce.ax-z.cn/general/upload-images.php
paste_data_images: true, //图片是否可粘贴 paste_data_images: true, //图片是否可粘贴
file_picker_types: "file image media", //file image media分别对应三个类型文件的上传link插件image和axupimgs插件media插件。想屏蔽某个插件的上传就去掉对应的参数 file_picker_types: "file image", //file image media分别对应三个类型文件的上传link插件image和axupimgs插件media插件。想屏蔽某个插件的上传就去掉对应的参数
// 文件上传处理函数 // 文件上传处理函数
setup: function (editor) { setup: function (editor) {
editor.on('change', function (e) { editor.on('change', function (e) {
@@ -115,11 +117,16 @@ const init = reactive({
let formData = new FormData() let formData = new FormData()
formData.append('file', blobInfo.blob()) formData.append('file', blobInfo.blob())
//上传图片接口 上传成功后返回图片地址,用于显示在富文本中 //上传图片接口 上传成功后返回图片地址,用于显示在富文本中
uploadFile(formData, props.imageUrl, success) uploadFile(formData, props.imageUrl, success, true)
// }), // }),
}, },
images_upload_handler_not_loading: (blobInfo, success) => {
let formData = new FormData()
formData.append('file', blobInfo.blob())
//上传图片接口
uploadFile(formData, props.imageUrl, success, false)
},
file_picker_callback: (callback, value, meta) => { file_picker_callback: (callback, value, meta) => {
// console.log('callback, value, meta',callback, value, meta)
// 使用案例http://tinymce.ax-z.cn/general/upload-images.php // 使用案例http://tinymce.ax-z.cn/general/upload-images.php
// meta.filetype //根据这个判断点击的是什么file image media // meta.filetype //根据这个判断点击的是什么file image media
let filetype; //限制文件的上传类型,需要什么就添加什么的后缀 let filetype; //限制文件的上传类型,需要什么就添加什么的后缀
@@ -137,16 +144,53 @@ const init = reactive({
inputElem.click(); inputElem.click();
inputElem.onchange = () => { inputElem.onchange = () => {
let file = inputElem.files[0]; //获取文件信息 let file = inputElem.files[0]; //获取文件信息
let reader = new FileReader(); let xhr, formData;
reader.readAsDataURL(file); xhr = new XMLHttpRequest();
reader.onload = function () { xhr.withCredentials = false;
let id = "blobid" + new Date().getTime(); xhr.open('POST', import.meta.env.VITE_BASE_URL + props.imageUrl);
let blobCache = tinymce.activeEditor.editorUpload.blobCache; xhr.setRequestHeader(
let base64 = reader.result.split(",")[1]; 'Authorization', getToken()
let blobInfo = blobCache.create(id, file, base64); )
blobCache.add(blobInfo); let loading = ElLoading.service({
callback(blobInfo.blobUri(), {alt: file.name}); lock: true,
text: '文件上传中...',
background: 'rgba(0, 0, 0, 0.7)',
})
xhr.onload = function () {
let res;
// if (xhr.status != 200) {
// failure('HTTP Error: ' + xhr.status);
// return;
// }
res = JSON.parse(xhr.responseText);
ElNotification({
title: '提示',
message: res.code === 1000 ? '上传成功' : '上传失败',
type: res.code === 1000 ? 'success' : 'error'
})
loading.close()
const fileUrl = res.data.url;
// '?fileId='+res.data.id+
callback(fileUrl + '?fileName=' + res.data.originalFilename, {text: file.name, title: file.name});
}; };
formData = new FormData();
formData.append('file', file, file.name);
xhr.send(formData);
//
// let reader = new FileReader();
// reader.readAsDataURL(file);
// reader.onload = function () {
// let formData;
// let id = "blobid" + new Date().getTime();
// let blobCache = tinymce.activeEditor.editorUpload.blobCache;
// let base64 = reader.result.split(",")[1];
// let blobInfo = blobCache.create(id, file, base64);
// blobCache.add(blobInfo);
// // callback(blobInfo.blobUri(), {alt: file.name});
// formData = new FormData();
// formData.append('file', file, file.name );
// uploadFile(formData, props.imageUrl,callback)
// };
}; };
}, },
}); });
@@ -154,7 +198,16 @@ const init = reactive({
watch(() => { watch(() => {
emit("update:value", content.value); emit("update:value", content.value);
}); });
const uploadFile = (formData, url,success) => { const uploadFile = (formData, url, success, isLoading) => {
let loading = null
if (isLoading) {
loading = ElLoading.service({
lock: true,
text: '图片上传中...',
background: 'rgba(0, 0, 0, 0.7)',
})
}
axios.post( axios.post(
import.meta.env.VITE_BASE_URL + url, import.meta.env.VITE_BASE_URL + url,
formData, formData,
@@ -171,18 +224,48 @@ const uploadFile = (formData, url,success) => {
let data = res.data let data = res.data
if (data.code !== 1000) { if (data.code !== 1000) {
ElMessage.error(data.msg) ElMessage.error(data.msg)
}else { if (loading) {
loading.close()
}
} else {
if (isLoading) {
success(data.data.url) success(data.data.url)
} else {
success(data.data.url, data.data.originalFilename)
}
if (loading) {
loading.close()
}
} }
}) })
} }
</script> </script>
<style scoped> <style scoped lang="scss">
.tox-sidebar-wrap {
&::-webkit-scrollbar {
width: 6px;
}
// 滚动条轨道
&::-webkit-scrollbar-track {
background: rgb(239, 239, 239);
border-radius: 2px;
}
// 小滑块
&::-webkit-scrollbar-thumb {
background: rgba(80, 81, 82, 0.29);
border-radius: 10px;
}
}
.tinymce-boxz > textarea { .tinymce-boxz > textarea {
display: none; display: none;
} }
</style> </style>
<style> <style lang="scss">
/* 隐藏apikey没有绑定当前域名的提示 */ /* 隐藏apikey没有绑定当前域名的提示 */
.tox-notifications-container .tox-notification--warning { .tox-notifications-container .tox-notification--warning {
display: none !important; display: none !important;

View File

@@ -5,7 +5,7 @@
placement="bottom-start" placement="bottom-start"
:disabled="isShow" :disabled="isShow"
> >
<div :class="lines?'content-lines':'content'" :style="{width: props.width}" @mouseover="isShowTooltip"> <div :class="lines?'content-lines':textAlign=='left'?'left-content':'content'" :style="{width: props.width+'px'}" @mouseover="isShowTooltip">
<span ref="contentRef"> <span ref="contentRef">
<slot name="content">{{ props.content }}</slot> <slot name="content">{{ props.content }}</slot>
</span> </span>
@@ -25,15 +25,26 @@ const props = defineProps({
lines: { lines: {
type: Boolean, type: Boolean,
default: false default: false
} },
textAlign: {
type: String,
default: ''
},
}) })
const contentRef = ref() const contentRef = ref()
const isShow = ref(false) const isShow = ref(false)
const isShowTooltip = () => { const isShowTooltip = () => {
isShow.value = props.width > contentRef.value.offsetWidth; isShow.value = parseInt(props.width) > contentRef.value.offsetWidth;
} }
</script> </script>
<style> <style scoped>
.left-content{
width: 45px;
text-align: left;
text-overflow: ellipsis;
white-space: nowrap;
overflow: hidden;
}
.content { .content {
width: 45px; width: 45px;
text-align: center; text-align: center;

View File

@@ -0,0 +1,112 @@
<template>
<div class="docx-preview">
<div
ref="docxDiv"
class="docxDiv"
v-loading="loading"
></div>
</div>
</template>
<script setup lang="jsx">
import {renderAsync} from "docx-preview";
import axios from "axios";
let docx = import.meta.glob("docx-preview"); // vite不支持require
const props = defineProps({
fileUrl: {
type: String,
default: ''
}
})
const loading = ref(false);
const previewFile = () => {
loading.value = true;
axios.request({
url: props.fileUrl,
method: 'get',
responseType: 'blob'
}).then((response) => {
let docData = response.data;
let docxDiv = document.getElementsByClassName("docxDiv");
renderAsync(docData, docxDiv[0], null, {
inWrapper: true, // 启用围绕文档内容渲染包装器
ignoreWidth: false, // 禁止页面渲染宽度
ignoreHeight: false, // 禁止页面渲染高度
ignoreFonts: false, // 禁止字体渲染
breakPages: true, // 在分页符上启用分页
ignoreLastRenderedPageBreak: true, //禁用lastRenderedPageBreak元素的分页
experimental: false, //启用实验性功能(制表符停止计算)
trimXmlDeclaration: true, //如果为真xml声明将在解析之前从xml文档中删除
debug: false,
}).then((res) => {
loading.value = false;
});
}).catch((error) => {
});
};
previewFile()
</script>
<style lang="scss">
.docx-preview {
overflow: auto;
height: 650px !important;
&::-webkit-scrollbar {
width: 6px;
height: 6px;
}
// 滚动条轨道
&::-webkit-scrollbar-track {
background: rgb(239, 239, 239);
border-radius: 2px;
}
// 小滑块
&::-webkit-scrollbar-thumb {
background: rgba(80, 81, 82, 0.29);
border-radius: 10px;
}
.docx-wrapper > section.docx {
margin-bottom: 0 !important;
}
.docx-wrapper {
padding: 10px !important;
.docx {
width: 100% !important;
min-height: 100vh !important;
overflow: auto !important;
//padding: 70pt 20pt 0 20pt !important;
table {
width: 100% !important;
}
&::-webkit-scrollbar {
width: 6px;
height: 6px;
}
// 滚动条轨道
&::-webkit-scrollbar-track {
background: rgb(239, 239, 239);
border-radius: 2px;
}
// 小滑块
&::-webkit-scrollbar-thumb {
background: rgba(80, 81, 82, 0.29);
border-radius: 10px;
}
}
}
}
</style>

View File

@@ -0,0 +1,74 @@
<template>
<div class="img-preview" >
<img id="previewImg" :src="fileUrl" :style="{width: fullscreen?windowWidth+'px':'100%',height: fullscreen?'auto':'650px;'}" alt="Preview"/>
</div>
</template>
<script setup>
const emit = defineEmits(["update:fileUrl"])
const props = defineProps({
fileUrl: {
type: String,
default: ''
},
fullscreen: {
type: Boolean,
default:false
}
})
const showImagePreview = ref(true)
const dialogWidth = ref('')
const dialogHeight = ref('')
// 屏幕宽度
const windowWidth = ref(0)
// 屏幕高度
const windowHeight = ref(0)
// onMounted(() => {
// })
// 获取屏幕尺寸
const getWindowResize = function () {
windowWidth.value = window.innerWidth-32
windowHeight.value = window.innerHeight
}
getWindowResize()
window.addEventListener('resize', getWindowResize)
nextTick(() => {
const previewImg = document.getElementById('previewImg');
// console.log(previewImg)
let offsetHeight = previewImg?.offsetHeight
// console.log(offsetHeight)
if (offsetHeight > 750){
// previewImg?.offsetHeight = 750
}
})
// dialogWidth.value=document.getElementById('previewImg')?.offsetWidth||1500
// dialogWidth.value=document.getElementById('previewImg')?.offsetHeight||750
</script>
<style lang="scss">
.img-preview {
display: flex;
justify-content: center;
overflow-y: auto;
overflow-x: auto;
&::-webkit-scrollbar {
width: 6px;
height: 6px;
}
// 滚动条轨道
&::-webkit-scrollbar-track {
background: rgb(239, 239, 239);
border-radius: 2px;
}
// 小滑块
&::-webkit-scrollbar-thumb {
background: rgba(80, 81, 82, 0.29);
border-radius: 10px;
}
}
</style>

View File

@@ -0,0 +1,49 @@
<template>
<!-- <iframe height="650px" width="100%" :src="fileUrl" frameborder="0"></iframe>-->
<vue-pdf-app style="height: 100vh; width: 100vw" :pdf="fileUrl" :config="pdfPreviewConfig"></vue-pdf-app>
</template>
<script setup lang="jsx">
import VuePdfApp from "vue3-pdf-app";
import "vue3-pdf-app/dist/icons/main.css";
const pdfPreviewConfig = ref({
sidebar: false,//左侧目录展示
secondaryToolbar: false,//二级工具栏
toolbar: false,//工具栏显示
errorWrapper: false,
})
const props = defineProps({
fileUrl: {
type: String,
default: ''
}
})
</script>
<style lang="scss">
#vuePdfApp {
width: auto !important;
height: 650px !important;
}
#viewerContainer {
&::-webkit-scrollbar {
width: 6px;
height: 6px;
}
// 滚动条轨道
&::-webkit-scrollbar-track {
background: rgb(239, 239, 239);
border-radius: 2px;
}
// 小滑块
&::-webkit-scrollbar-thumb {
background: rgba(80, 81, 82, 0.29);
border-radius: 10px;
}
}
</style>

View File

@@ -0,0 +1,28 @@
<template>
<div id="pptx" ></div>
</template>
<script setup >
const props = defineProps({
fileUrl: {
type: String,
default: ''
},
fullscreen: {
type: Boolean,
default:false
}
})
// js部分 jquery已在index.html中引入 无需另外安装
const handlePPtx = () => {
$("#pptx").pptxToHtml({
pptxFileUrl: props.fileUrl, //pptx文件地址
slidesScale: "100%",
});
}
handlePPtx()
</script>
<style scoped>
</style>

View File

@@ -0,0 +1,78 @@
<template>
<div class="file-preview">
<el-dialog id="dialog" :border="false" width="1200" :style="{height: fullscreen?'':'650px;'}" top="10vh"
:fullscreen="fullscreen"
:title="fileName" :show-close="true" :visible.sync="showPreview" v-model="showPreview"
:append-to-body="false"
:close-on-click-modal="true"
>
<!-- <ppt-preview :file-url="fileUrl" :fullscreen="fullscreen" v-if="fileType === 'ppt'||fileType === 'pptx'"/>-->
<pdf-preview :file-url="fileUrl" :fullscreen="fullscreen" v-if="fileType === 'pdf'"/>
<docx-preview :file-url="fileUrl" :fullscreen="fullscreen" v-if="fileType === 'docx'"/>
<image-preview :fileUrl="fileUrl" :fullscreen="fullscreen" :fileName="fileName" v-if="checkImgType(fileType)"/>
</el-dialog>
</div>
</template>
<script setup>
import {ElNotification} from "element-plus";
const emit = defineEmits(["update:fileUrl"])
const props = defineProps({
fileUrl: {
type: String,
default: ''
},
fileType: {
type: String,
default: ''
},
fileName: {
type: String,
default: ''
},
//弹窗是否铺满全屏
fullscreen: {
type: Boolean,
default: false
}
})
const showPreview = ref(true)
// console.info("🚀 ~method:fileType -----", props.fileType)
const checkImgType=(fileType)=>{
return fileType == 'png' || fileType == 'jpg' || fileType == 'jpeg' || fileType == 'ico' || fileType == 'PNG' || fileType == 'JPG';
}
// console.info("🚀 ~method:checkImgType(props.fileType) -----", checkImgType(props.fileType))
if(props.fileType!=='pdf'&&props.fileType!=='docx'&&!checkImgType(props.fileType)){
showPreview.value=false
ElNotification({
title: '提示',
message: props.fileName+' 文件不支持预览!',
type: 'error'
})
}
</script>
<style lang="scss" scoped>
.file-preview {
.el-overlay-dialog {
left: 0 !important;
}
.el-dialog__headerbtn {
.el-dialog__close {
font-size: 30px;
}
}
.el-dialog__body {
overflow: hidden;
padding: 0 !important;
}
}
</style>

View File

@@ -1,10 +1,14 @@
<template> <template>
<baseTitle title="公司详情"></baseTitle> <baseTitle title="公司详情"></baseTitle>
<fv-Form :schema="schema" @getInstance="(e)=>form = e"></fv-Form> <fv-Form :schema="schema" @getInstance="(e)=>form = e"></fv-Form>
<UserPicker :multiple="false" ref="presidentNamePicker" @ok="editPresident"></UserPicker>
<UserPicker :multiple="false" ref="generalManagerNamePicker" @ok="editGeneralManager"></UserPicker>
</template> </template>
<script setup> <script setup lang="jsx">
import {getCompanyDetail} from "@/api/subsidiary"; import UserPicker from '@/views/workflow/process/common/UserPicker.vue';
import Ttsup from '@/views/system/department/components/ToolToShowUserPicker.vue'
import {getCompanyDetail,setCompanyLeader} from "@/api/subsidiary";
const props=defineProps({ const props=defineProps({
value:{ value:{
type:String, type:String,
@@ -12,6 +16,12 @@ const props=defineProps({
} }
}) })
const form = ref() const form = ref()
const presidentName = ref()
const presidentIds = ref()
const generalManagerName = ref()
const presidentNamePicker = ref()
const generalManagerNamePicker = ref()
const generalManagerIds = ref()
const schema = reactive([ const schema = reactive([
{ {
label: '公司名称:', label: '公司名称:',
@@ -21,6 +31,17 @@ const schema = reactive([
label: '公司编码:', label: '公司编码:',
prop: 'companyCode' prop: 'companyCode'
}, },
{
label: '董事长:',
prop: 'presidentIds',
component: ()=><Ttsup modelValue={presidentName.value} onClick={()=>{presidentNamePicker.value.showUserPicker()} } />
},
{
label: '总经理:',
prop: 'generalManagerIds',
component: ()=><Ttsup modelValue={generalManagerName.value} onClick={()=>{generalManagerNamePicker.value.showUserPicker()} } />
},
{ {
label: '创建时间:', label: '创建时间:',
prop: 'createTime' prop: 'createTime'
@@ -35,10 +56,62 @@ const _value = computed({
emit('update:value', value) emit('update:value', value)
} }
}) })
const editPresident = (list) => {
const arr = list.map(item=>item.name)
presidentIds.value = list.map(item=>item.id)
presidentName.value = arr.join(',')
setDeptmentInfo({
companyId: _value.value,
presidentIds: presidentIds.value,
generalManagerIds: generalManagerIds.value
})
}
const editGeneralManager = (list) => {
const arr = list.map(item=>item.name)
generalManagerIds.value = list.map(item=>item.id)
generalManagerName.value = arr.join(',')
setDeptmentInfo({
companyId: _value.value,
presidentIds: presidentIds.value,
generalManagerIds: generalManagerIds.value
})
}
const setDeptmentInfo = async ({companyId = [], presidentIds = [], generalManagerIds = [] }) => {
const params = {
presidentIds,
generalManagerIds,
companyId,
}
const res = await setCompanyLeader(params)
// console.log(res.data);
}
const getInfo = async () => { const getInfo = async () => {
const { data } = await getCompanyDetail(_value.value) const { data } = await getCompanyDetail(_value.value)
form.value.setValues(data) const params = {
companyName: data.companyName,
companyCode: data.companyCode,
createTime: data.createTime
}
presidentIds.value = data.presidentIds
generalManagerIds.value = data.generalManagerIds
params.presidentIds = formatIdsToNames(data.presidentIds, data.presidentInfo, 'userId', 'nickName')
presidentName.value = params.presidentIds
params.generalManagerIds = formatIdsToNames(data.generalManagerIds, data.generalManagerInfo, 'userId', 'nickName')
generalManagerName.value = params.generalManagerIds
form.value.setValues(params)
}
const formatIdsToNames = (ids, infoList, key, viewKey) => {
const resArr = []
if(!ids?.length) return
ids.forEach(item=>{
infoList.forEach(v=>{
item == v[key] && resArr.push(v[viewKey])
})
})
return resArr.join(',')
} }
getInfo() getInfo()

View File

@@ -3,9 +3,9 @@
<fv-Form :schema="companySchema" @getInstance="(e)=>companyForm = e"></fv-Form> <fv-Form :schema="companySchema" @getInstance="(e)=>companyForm = e"></fv-Form>
<baseTitle title="部门详情"></baseTitle> <baseTitle title="部门详情"></baseTitle>
<fv-Form :schema="schema" @getInstance="(e)=>form = e"></fv-Form> <fv-Form :schema="schema" @getInstance="(e)=>form = e"></fv-Form>
<UserPicker ref="usrPickershipIds" @ok="editshipIds"></UserPicker> <UserPicker :multiple="false" ref="usrPickershipIds" @ok="editshipIds"></UserPicker>
<UserPicker ref="usrPickerHeadIds" @ok="editheadIds"></UserPicker> <UserPicker :multiple="false" ref="usrPickerHeadIds" @ok="editheadIds"></UserPicker>
<UserPicker ref="departmentalDeputyIds" @ok="editdeputyIds"></UserPicker> <UserPicker :multiple="false" ref="usrPickerDeputyIds" @ok="editdeputyIds"></UserPicker>
</template> </template>
<script setup lang="jsx"> <script setup lang="jsx">
@@ -65,7 +65,7 @@ const schema = reactive([
{ {
label: '部门副职用户:', label: '部门副职用户:',
prop: 'departmentalDeputyIds', prop: 'departmentalDeputyIds',
component: ()=><Ttsup modelValue={departmentalDeputyNames.value} onClick={()=>{departmentalDeputyIds.value.showUserPicker()} } /> component: ()=><Ttsup modelValue={departmentalDeputyNames.value} onClick={()=>{usrPickerDeputyIds.value.showUserPicker()} } />
}, },
{ {
label: '创建时间:', label: '创建时间:',

View File

@@ -1,6 +1,13 @@
<template> <template>
<baseTitle title="基础信息"></baseTitle> <div style="padding: 0 30px" id="printBox">
<fvForm :schema="schema" @getInstance="(e)=>baseForm = e"></fvForm> <div style="display: flex;justify-content: space-between">
<baseTitle title="项目基本信息"></baseTitle>
<div class="oper-page-btn" :style="{marginRight:taskId? '145px':editShow?mode=='submit'?'145px':'170px':'0'}">
<el-button v-print="print" color="#ded0b2" icon="Printer" @click="handlePrint(print)"> 打印</el-button>
</div>
</div>
<fvForm :schema="schema" @getInstance="(e)=>baseForm = e" label-position="left" label-width="left"
style="margin-left: 15px"></fvForm>
<div class="steps-box"> <div class="steps-box">
<el-steps v-if="stepsShow" :active="localActive" finish-status="success"> <el-steps v-if="stepsShow" :active="localActive" finish-status="success">
<el-step <el-step
@@ -9,7 +16,6 @@
:title="item.title" :title="item.title"
:class="stepClass(index)" :class="stepClass(index)"
@click="handleStep(item.key, index)" @click="handleStep(item.key, index)"
> >
<template #icon> <template #icon>
<el-icon style="font-size: 20px;" :class="index == localActive ? 'is-active' : 'is-end'" <el-icon style="font-size: 20px;" :class="index == localActive ? 'is-active' : 'is-end'"
@@ -30,14 +36,46 @@
<component v-if="localActive == index" v-bind="item.props || {}" :is="item.component" /> <component v-if="localActive == index" v-bind="item.props || {}" :is="item.component" />
</template> --> </template> -->
</div> </div>
</div>
</template> </template>
<script setup lang="jsx"> <script setup lang="jsx">
import {ElLoading, ElNotification} from 'element-plus'; import {ElLoading, ElNotification} from 'element-plus';
import {computed, onMounted, reactive, ref, watchEffect} from 'vue';
import {useRoute} from 'vue-router';
import {getBaseInfoApi} from './api'; import {getBaseInfoApi} from './api';
import {useCacheStore} from '@/stores/cache.js'
import {toThousands} from '@/utils/changePrice.js'
const print = ref({
id: 'printBox',//这里的id就是上面我们的打印区域id实现指哪打哪
popTitle: '配置页眉标题', // 打印配置页上方的标题
extraHead: '', // 最上方的头部文字附加在head标签上的额外标签使用逗号分割
preview: false, // 是否启动预览模式默认是false
previewTitle: '预览的标题', // 打印预览的标题
previewPrintBtnLabel: '预览结束,开始打印', // 打印预览的标题下方的按钮文本,点击可进入打印
zIndex: 20002, // 预览窗口的z-index默认是20002最好比默认值更高
previewBeforeOpenCallback() {
console.log('正在加载预览窗口!');
}, // 预览窗口打开之前的callback
previewOpenCallback() {
console.log('已经加载完预览窗口,预览打开了!')
}, // 预览窗口打开时的callback
beforeOpenCallback() {
console.log('开始打印之前!')
}, // 开始打印之前的callback
openCallback() {
console.log('执行打印了!')
}, // 调用打印时的callback
closeCallback() {
console.log('关闭了打印工具!')
emits('closePrint')
}, // 关闭打印的callback(无法区分确认or取消)
clickMounted() {
console.log('点击v-print绑定的按钮了')
},
})
const props = defineProps({ const props = defineProps({
// 步骤对应内容list // 步骤对应内容list
stepList: { stepList: {
@@ -58,19 +96,29 @@ const props = defineProps({
reportType: { reportType: {
type: String, type: String,
default: '' default: ''
},
//是否显示审批驳回按钮
taskId: {
type: String,
default: ''
},
//当项目详情是编辑模式时按钮位置
editShow: {
type: String,
default: ''
},
//当项目详情是提交模式还是重新提交时按钮位置
mode: {
type: String,
default: ''
} }
}) })
const route = useRoute() const route = useRoute()
const cacheStore = useCacheStore()
const emits = defineEmits(['stepChange', 'setDetail']) const emits = defineEmits(['stepChange', 'setDetail', 'openPrint'])
const localData = reactive({}) const localData = reactive({})
const localActive = ref(0) // 当前激活步骤 const localActive = ref(0) // 当前激活步骤
const stepsShow = ref(false) const stepsShow = ref(false)
const localSteps = ref([ const localSteps = ref([
{ {
title: '需求征集', title: '需求征集',
@@ -84,6 +132,10 @@ const localSteps = ref([
title: '项目立项', title: '项目立项',
key: 'approve', key: 'approve',
}, },
{
title: '项目实施',
key: 'implement',
},
{ {
title: '项目验收', title: '项目验收',
key: 'execute', key: 'execute',
@@ -97,46 +149,246 @@ const localSteps = ref([
// key: 'end', // key: 'end',
// }, // },
]) ])
const baseForm = ref() const baseForm = ref()
const baseFormData = ref([])
const schema = computed(() => { const schema = computed(() => {
return [ return [
{
label: '承办单位',
prop: 'affiliatedCompany',
colProps: {
span: 6
}
},
{ {
label: '项目名称', label: '项目名称',
prop: 'projectName', prop: 'projectName',
colProps: { colProps: {
span: 8 span: 6
}
},
{
label: '开始时间',
prop: 'startTime',
colProps: {
span: 6
} }
}, },
{ {
label: '征集公司', label: '结束时间',
prop: 'affiliatedCompany', prop: 'endTime',
colProps: { colProps: {
span: 8 span: 6
} }
}, },
{ {
label: '征集名称', label: '项目类型',
prop: 'requirementName', prop: 'projectType',
colProps: { colProps: {
span: 8 span: 6
},
component: () => (
<div>
{
baseFormData.value?.projectType ?
<span>{filterDict(cacheStore.getDict('project_type'), baseFormData.value?.projectType)}</span>
: <span>{'--'}</span>
}
</div>
)
},
{
label: '研发主体',
prop: 'rdSubject',
colProps: {
span: 6
},
component: () => (
<div>
{
baseFormData.value?.rdSubject ?
<span>{filterDict(cacheStore.getDict('rd_subject'), baseFormData.value?.rdSubject)}</span>
: <span>{'--'}</span>
}
</div>
)
},
{
label: '出资类型',
prop: 'investmentType',
colProps: {
span: 6
},
component: () => (
<div>
{
baseFormData.value?.investmentType ?
<span>{filterDict(cacheStore.getDict('invest_type'), baseFormData.value?.investmentType)}</span>
: <span>{'--'}</span>
}
</div>
)
},
{
label: '业务板块',
prop: 'businessSegment',
colProps: {
span: 6
},
component: () => (
<div>
{
baseFormData.value?.businessSegment ?
<span>{filterDict(cacheStore.getDict('business_segment'), baseFormData.value?.businessSegment)}</span>
: <span>{'--'}</span>
}
</div>
)
},
{
label: '标准制定',
prop: 'technicalStandard',
colProps: {
span: 6
},
component: () => (
<div>
{
baseFormData.value?.technicalStandard ?
<span>{filterDict(cacheStore.getDict('technical_standard'), baseFormData.value?.technicalStandard)}</span>
: <span>{'--'}</span>
}
</div>
)
},
{
label: '项目影响',
prop: 'projectImpact',
colProps: {
span: 6
},
component: () => (
<div>
{
baseFormData.value?.projectImpact ?
<span>{filterDict(cacheStore.getDict('project_impact'), baseFormData.value?.projectImpact)}</span>
: <span>{'--'}</span>
}
</div>
)
},
{
label: '经费预算(元)',
prop: 'economicEstimate',
colProps: {
span: 6
},
component: () => (
<div>
{
baseFormData.value?.economicEstimate ?
<span>{toThousands(baseFormData.value?.economicEstimate)}</span>
: <span>{'--'}</span>
}
</div>
)
},
{
label: '产学研联合',
prop: 'industryUniversityResearch',
colProps: {
span: 6
},
component: () => (
<div>
{
baseFormData.value?.industryUniversityResearch ?
<span>{filterDict(cacheStore.getDict('industry_university'), baseFormData.value?.industryUniversityResearch)}</span>
: <span>{'--'}</span>
}
</div>
)
},
{
label: '开展政府申报',
prop: 'governmentDeclaration',
colProps: {
span: 6
},
component: () => (
<div>
{
baseFormData.value?.governmentDeclaration ?
<span>{filterDict(cacheStore.getDict('government_declaration'), baseFormData.value?.governmentDeclaration)}</span>
: <span>{'--'}</span>
}
</div>
)
},
{
label: '所属专项资金',
prop: 'specialFund',
colProps: {
span: 6
} }
}, },
{ {
label: '征集描述', label: '申请总部专项资金(元)',
prop: 'collectExplain', prop: 'specialFundAmount',
colProps: { colProps: {
span: 24 span: 6
},
component: () => (
<div>
{
baseFormData.value?.specialFundAmount ?
<span>{toThousands(baseFormData.value?.specialFundAmount)}</span>
: <span>{'--'}</span>
}
</div>
)
},
{
label: '是否在预算内',
prop: 'isWithinBudget',
colProps: {
span: 6
},
component: () => (
<div>
{
baseFormData.value?.isWithinBudget!=null ? baseFormData.value?.isWithinBudget?
<span>{'预算内'}</span>
: <span>{'预算外'}</span>:'--'
}
</div>
)
},
{
label: '部门分管领导',
prop: 'optionalChargeLeadership',
colProps: {
span: 6
} }
}, },
{
label: '主项目',
prop: 'masterProjectName',
colProps: {
span: 6
}
}
] ]
}) })
const localStepSuccess = ref([]) const localStepSuccess = ref([])
const handlePrint = (print) => {
emits('openPrint', print)
}
// 格式化详情步骤条 // 格式化详情步骤条
const formatProcedure = (data) => { const formatProcedure = (data) => {
// console.info("🚀 ~method:formatProcedure -----", data)
let arr = [] let arr = []
if (data instanceof Array) { if (data instanceof Array) {
data.forEach(item => { data.forEach(item => {
@@ -148,12 +400,15 @@ const formatProcedure = (data) => {
case '20': case '20':
arr.push(1) arr.push(1)
break break
case '40': case '30':
arr.push(2) arr.push(2)
break break
case '50': case '40':
arr.push(3) arr.push(3)
break break
case '50':
arr.push(4)
break
} }
} else { } else {
switch (item) { switch (item) {
@@ -166,12 +421,15 @@ const formatProcedure = (data) => {
case '20': case '20':
arr.push(2) arr.push(2)
break break
case '40': case '30':
arr.push(3) arr.push(3)
break break
case '50': case '40':
arr.push(4) arr.push(4)
break break
case '50':
arr.push(5)
break
} }
} }
@@ -179,7 +437,31 @@ const formatProcedure = (data) => {
} }
return arr return arr
} }
//匹配字典值,返回对应值的字典标签
const filterDict = (data, value) => {
if (data === undefined || value === undefined) return;
let label = ''
let result = []
if (value instanceof Array) {
value.forEach(item1 => {
data.find(item => {
if (item.value == item1) {
result.push(item.label)
}
})
})
label = result.map(item => item).join('')
} else {
if (data instanceof Array) {
data.find(item => {
if (item.value == value) {
label = item.label
}
})
}
}
return label
}
// 反向格式化 // 反向格式化
const formatReProcedure = (data) => { const formatReProcedure = (data) => {
let arr = [] let arr = []
@@ -195,12 +477,13 @@ const formatReProcedure = (data) => {
case 2: case 2:
arr.push('20') arr.push('20')
break break
// case 3: arr.push('30')
// break
case 3: case 3:
arr.push('40') arr.push('30')
break break
case 4: case 4:
arr.push('40')
break
case 5:
arr.push('50') arr.push('50')
break break
} }
@@ -219,9 +502,9 @@ const formatActive = (val) => {
newVal == 0 && (active = '00') newVal == 0 && (active = '00')
newVal == 1 && (active = '10') newVal == 1 && (active = '10')
newVal == 2 && (active = '20') newVal == 2 && (active = '20')
// val == 3 && (active = '30') newVal == 3 && (active = '30')
newVal == 3 && (active = '40') newVal == 4 && (active = '40')
newVal == 4 && (active = '50') newVal == 5 && (active = '50')
return active return active
} }
@@ -245,9 +528,12 @@ const handleStep = (key, index) => {
active = '20' active = '20'
break break
case 2: case 2:
active = '40' active = '30'
break break
case 3: case 3:
active = '40'
break
case 4:
active = '50' active = '50'
break break
} }
@@ -263,9 +549,12 @@ const handleStep = (key, index) => {
active = '20' active = '20'
break break
case 3: case 3:
active = '40' active = '30'
break break
case 4: case 4:
active = '40'
break
case 5:
active = '50' active = '50'
break break
} }
@@ -286,7 +575,10 @@ const getBaseInfo = async () => {
try { try {
const {code, data} = await getBaseInfoApi(route.query.projectId) const {code, data} = await getBaseInfoApi(route.query.projectId)
// console.log('data.procedure', data.procedure, route.query.step) // console.log('data.procedure', data.procedure, route.query.step)
if (route.query.step === '40') { if (route.query.step === '30' || route.query.step === '40') {
if (data.procedure.indexOf('30') == -1) {
data.procedure.push('30')
}
if (data.procedure.indexOf('40') == -1) { if (data.procedure.indexOf('40') == -1) {
data.procedure.push('40') data.procedure.push('40')
} }
@@ -297,6 +589,8 @@ const getBaseInfo = async () => {
} }
localStepSuccess.value = formatProcedure(data.procedure) localStepSuccess.value = formatProcedure(data.procedure)
baseForm.value.setValues(data) baseForm.value.setValues(data)
baseFormData.value = data
emits('getBasicData', data)
emits('setDetail', formatActive(localActive.value)) emits('setDetail', formatActive(localActive.value))
loading.close() loading.close()
nextTick(() => { nextTick(() => {
@@ -322,7 +616,7 @@ watchEffect(() => {
if (props.reportType === 'direct') { if (props.reportType === 'direct') {
let steps = [] let steps = []
for (const step of localSteps.value) { for (const step of localSteps.value) {
if (step.key !== 'collect'){ if (step.key !== 'collect') {
steps.push(step) steps.push(step)
} }
} }
@@ -333,7 +627,7 @@ watchEffect(() => {
<style lang="scss" scoped> <style lang="scss" scoped>
.steps-box { .steps-box {
padding: 10px 0; //padding: 10px 0;
} }
.step-success { .step-success {
@@ -359,4 +653,5 @@ watchEffect(() => {
:deep(.el-step__head.is-success) { :deep(.el-step__head.is-success) {
border-color: #A8abb2; border-color: #A8abb2;
} }
</style> </style>

View File

@@ -5,6 +5,7 @@
label-width="auto" label-width="auto"
ref="formInstance" ref="formInstance"
class="search-form" class="search-form"
@submit.prevent="getValues"
> >
<el-row> <el-row>
<el-col <el-col
@@ -24,12 +25,14 @@
v-on="item.on || {}" v-on="item.on || {}"
v-model="form[item.prop]" v-model="form[item.prop]"
@keyup.enter.native="getValues" @keyup.enter.native="getValues"
@change="elChange"
> >
</component> </component>
</template> </template>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="filterConfig.length % 4 == 0 ? 4 : 6" class="btn-col"> <!-- class="btn-col"-->
<el-col :span="filterConfig.length % 4 == 0 ? 4 : 6" :offset="1">
<el-form-item> <el-form-item>
<el-button v-if="searchConfig.length>=4" link type="primary" @click="showMore = !showMore"> <el-button v-if="searchConfig.length>=4" link type="primary" @click="showMore = !showMore">
{{ showMore ? '收起' : '展开' }} {{ showMore ? '收起' : '展开' }}
@@ -49,6 +52,16 @@ const props = defineProps({
searchConfig: { searchConfig: {
type: Array, type: Array,
default: [] default: []
},
//搜索参数
searchProp: {
type: String,
default: ''
},
//搜索值
searchValue: {
type: String,
default: ''
} }
}) })
@@ -65,7 +78,10 @@ const filterConfig = computed(() => {
}) })
return arr.length >= 4 && showMore.value ? arr : arr.slice(0, 3) return arr.length >= 4 && showMore.value ? arr : arr.slice(0, 3)
}) })
const setForm=(prop,value)=>{
form.value[prop]=value
return form.value;
}
// 搜索功能表单元素默认值 // 搜索功能表单元素默认值
// const setDefaultFormValues = () => { // const setDefaultFormValues = () => {
// filterConfig.value.forEach(item => { // filterConfig.value.forEach(item => {
@@ -77,8 +93,17 @@ watchEffect(() => {
if (filterConfig.value.length) { if (filterConfig.value.length) {
// setDefaultFormValues() // setDefaultFormValues()
} }
if(props.searchProp&&props.searchValue){
setForm(props.searchProp,props.searchValue)
}
}) })
const elChange = () => {
setTimeout(() => {
getValues()
}, 500)
}
const getValues = () => { const getValues = () => {
emits('search', form.value) emits('search', form.value)
return form.value return form.value
@@ -110,4 +135,30 @@ onMounted(() => {
justify-content: space-evenly; justify-content: space-evenly;
align-items: center; align-items: center;
} }
</style>
<style lang="scss">
.search-form{
//绘制下拉选择框远程搜索时右侧的箭头
.el-select {
.el-select__wrapper {
.el-select__suffix::before {
content: "";
width: 6px;
height: 6px;
border: solid #a8abb2;
border-width: 0 0 1px 1px;
transform: translate(-50%, -50%) rotate(-45deg);
}
}
.is-focused {
.el-select__suffix::before {
margin-top: 10px;
transform: translate(-50%, -50%) rotate(-225deg) !important;
}
}
}
}
</style> </style>

View File

@@ -15,11 +15,11 @@
</el-button> </el-button>
</div> </div>
</div> </div>
<!-- 列显示配置 -->
<div v-if="isSettingCol" style="float: right">
<el-button v-if="tableConfig.export && tableConfig.export.open" @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>
<!-- 列显示配置 -->
<div v-if="isSettingCol" style="float: right">
<el-tooltip effect="dark" content="列配置" placement="bottom"> <el-tooltip effect="dark" content="列配置" placement="bottom">
<el-button ref="buttonRef" link> <el-button ref="buttonRef" link>
<el-icon size="18"> <el-icon size="18">
@@ -59,7 +59,6 @@
v-loading="localData.loading" v-loading="localData.loading"
:row-key="tableConfig?.rowKey || 'id'" :row-key="tableConfig?.rowKey || 'id'"
v-bind="$attrs" v-bind="$attrs"
table-layout="auto"
:show-overflow-tooltip="true" :show-overflow-tooltip="true"
highlight-current-row highlight-current-row
@selection-change="selectionChange" @selection-change="selectionChange"

View File

@@ -115,6 +115,12 @@ const accountChange = (userId) => {
authStore.userLogout() authStore.userLogout()
setToken(res.data) setToken(res.data)
window.location.href = "/home" window.location.href = "/home"
}else{
ElNotification({
title: '提示',
message: res.msg,
type: 'error'
})
} }
}) })
} }
@@ -200,7 +206,7 @@ const handleLogout = () => {
position: absolute; position: absolute;
width: 280px; width: 280px;
right: 0; right: 0;
z-index: 300; z-index: 3000;
top: 54px; top: 54px;
padding: 5px 0; padding: 5px 0;
border-radius: 4px; border-radius: 4px;

View File

@@ -1,7 +1,7 @@
<template> <template>
<div class="logo" ref="logo"> <div class="logo" ref="logo">
<img src="../../assets/kylogo.png" alt=""> <img src="../../assets/kylogo.png" alt="">
<!-- <span v-if="!siderbarStore.isCollapse">管理平台</span> --> <!-- <span v-if="!siderbarStore.isCollapse">技创新项目管理平台</span> -->
<span v-if="!siderbarStore.isCollapse"></span> <span v-if="!siderbarStore.isCollapse"></span>
</div> </div>
<el-scrollbar :height="`calc(100vh - ${logoHeight}px)`" style="background-color: #ffffff"> <el-scrollbar :height="`calc(100vh - ${logoHeight}px)`" style="background-color: #ffffff">

View File

@@ -1,7 +1,8 @@
<template> <template>
<div class="link-box"> <div class="link-box">
<el-scrollbar noresize> <el-scrollbar noresize height="34" >
<div> <!-- style="display: flex"-->
<div >
<router-link <router-link
v-for="item in tagsViewStore.visitedViews" v-for="item in tagsViewStore.visitedViews"
:key="item.path" :to="{ path: item.path, query: item.query }" class="tag" :key="item.path" :to="{ path: item.path, query: item.query }" class="tag"
@@ -74,11 +75,13 @@ init()
<style lang="scss" scoped> <style lang="scss" scoped>
.link-box { .link-box {
//display: flex;
position: relative; position: relative;
padding: 12px 0; padding: 12px 0;
line-height: 30px; line-height: 34px;
.tag { .tag {
padding: 6px; padding: 6px;
border: 1px solid darkgray; border: 1px solid darkgray;
font-size: 13px; font-size: 13px;

View File

@@ -19,6 +19,9 @@ import 'vite-plugin-svg-icons/register'
import '@/assets/styles/index.scss' import '@/assets/styles/index.scss'
import '@/assets/styles/sidebar.scss' import '@/assets/styles/sidebar.scss'
import '@/assets/styles/echartsEditor.scss' import '@/assets/styles/echartsEditor.scss'
//引入
import print from 'vue3-print-nb'
//挂载
const app = createApp(App) const app = createApp(App)
for (const [key, component] of Object.entries(ElementPlusIconsVue)) { for (const [key, component] of Object.entries(ElementPlusIconsVue)) {
@@ -29,5 +32,5 @@ app.use(createPinia())
app.use(router) app.use(router)
app.directive('perm',hasPerm) app.directive('perm',hasPerm)
app.directive('tabh',fixedHeight) app.directive('tabh',fixedHeight)
app.use(print)
app.mount('#app') app.mount('#app')

View File

@@ -35,11 +35,6 @@ const router = createRouter({
name: 'specialFundDetailMobile', name: 'specialFundDetailMobile',
component: () => import('@/views/project-management/mobledetail/SpecialFundDetailMobile.vue') component: () => import('@/views/project-management/mobledetail/SpecialFundDetailMobile.vue')
}, },
{
path: '/share/mobile',
name: 'shareDetailMobile',
component: () => import('@/views/project-management/mobledetail/ShareDetailMobile.vue')
},
{ {
path: '/projectDemand/requirement/moblie', path: '/projectDemand/requirement/moblie',
name: 'projectDemandRequirementMoblie', name: 'projectDemandRequirementMoblie',
@@ -195,6 +190,24 @@ const router = createRouter({
breadcrumb: false breadcrumb: false
} }
}, },
{
path: '/todolist',
name: 'Todolist',
component: () => import('@/views/todoList/index.vue'),
meta: {
title: '待办',
breadcrumb: false
}
},
{
path: '/donelist',
name: 'Donelist',
component: () => import('@/views/doneList/index.vue'),
meta: {
title: '已办',
breadcrumb: false
}
},
] ]
}, },
{ {

View File

@@ -37,7 +37,7 @@ 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'); // console.log(JSON.parse(JSON.stringify(sRouter)), 'sRouter');
const firstFormat = setRouterLevel(JSON.parse(JSON.stringify(sRouter))) const firstFormat = setRouterLevel(JSON.parse(JSON.stringify(sRouter)))
asyncRouters.value = formatAsyncRouters(JSON.parse(JSON.stringify(firstFormat))) asyncRouters.value = formatAsyncRouters(JSON.parse(JSON.stringify(firstFormat)))
menuList.value = [...menuList.value, ...generateMenu(mData)] menuList.value = [...menuList.value, ...generateMenu(mData)]

View File

@@ -59,7 +59,7 @@ export const useProcessStore = defineStore('process', () => {
const getFormMap = () => { const getFormMap = () => {
//表单映射对象 //表单映射对象
const map = new Map(); const map = new Map();
processData.value.formItems.forEach(item => itemToMap(map, item)) processData.value.formItems?.forEach(item => itemToMap(map, item))
return map return map
} }

View File

@@ -44,9 +44,9 @@ export const useTagsView = defineStore('tagsView',()=>{
} }
//删除其他标签页 //删除其他标签页
const delOtherVisitedViews = ({path,meta}) => { const delOtherVisitedViews = ({path,meta,query}) => {
visitedViews.value = [] visitedViews.value = []
visitedViews.value.push({path,meta}) visitedViews.value.push({path,meta,query})
toLastTagView(visitedViews) toLastTagView(visitedViews)
} }

View File

@@ -33,11 +33,9 @@ export function downLoadExcel(url,params) {
responseType: 'blob', responseType: 'blob',
headers: {'Authorization': getToken()} headers: {'Authorization': getToken()}
}).then(res => { }).then(res => {
console.log(res)
try { try {
resolveBlob(res, mimeMap.xlsx) resolveBlob(res, mimeMap.xlsx)
}catch (e) { }catch (e) {
console.log(res)
ElMessage.error(res.data.msg) ElMessage.error(res.data.msg)
} }
}) })
@@ -55,7 +53,7 @@ export function resolveBlob(res, mimeType) {
let reg = /fileName=([^&]+)/; let reg = /fileName=([^&]+)/;
let contentDisposition = decodeURI(res.headers['content-disposition']) let contentDisposition = decodeURI(res.headers['content-disposition'])
let result = reg.exec(contentDisposition) let result = reg.exec(contentDisposition)
console.log(result) // console.log(result)
let fileName = result[1] let fileName = result[1]
fileName = fileName.replace(/\"/g, '') fileName = fileName.replace(/\"/g, '')
aLink.href = URL.createObjectURL(blob) aLink.href = URL.createObjectURL(blob)

View File

@@ -0,0 +1,202 @@
<template>
<div v-loading="loading" class="add-block">
<baseTitle title="文章信息录入"></baseTitle>
<el-form :model="formData" ref="fundForm" :rules="rules" style="margin-left: 5px;margin-bottom: -18px">
<el-row gutter="30">
<el-col :span="6" style="margin-left: 10px">
<el-form-item label="文章标题" prop="articleTitle">
<el-input v-model="formData.articleTitle" placeholder="请输入文章标题" clearable></el-input>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="文章类型" prop="articleType">
<el-select v-model="formData.articleType" placeholder="请选择文章类型" clearable filterable>
<el-option
v-for="item in cacheStore.getDict('article_type')"
:key="item.value"
:label="item.label"
:value="item.value"
/>
</el-select>
</el-form-item>
</el-col>
<el-col :span="6" >
<el-form-item label="备注" prop="remarks">
<el-input v-model="formData.remarks" placeholder="请输入备注" clearable></el-input>
</el-form-item>
</el-col>
<el-col :span="24" style="margin-left: 10px">
<el-form-item label="文章内容" prop="articleContent">
<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']" />
</el-form-item>
</el-col>
</el-row>
</el-form>
<div class="oper-page-btn">
<el-button color="#DED0B2" v-if="routerName === 'Article/add'" @click="handleSubmit(fundForm)">提交</el-button>
<el-button color="#DED0B2" v-else @click="handleResubmit">提交</el-button>
<el-button @click="handleBack">返回</el-button>
</div>
</div>
</template>
<script setup lang="jsx">
import {ElNotification} from "element-plus";
import {addArticle, editArticle, getArticleDetail} from "@/api/article";
import {useTagsView} from '@/stores/tagsview.js'
import { useCacheStore } from "@/stores/cache.js";
const cacheStore = useCacheStore();
const tagsViewStore = useTagsView()
const router = useRouter()
const route = useRoute()
const loading = ref(false)
const showTinymce = ref(true)
const fundForm = ref()
const formData = ref({})
const routerName = ref(router.currentRoute.value.name)
const rules = reactive({
articleTitle: [{required: true, message: '请输入文章标题', trigger: ['blur', 'change']}],
articleType: [{required: true, message: '请输入文章类型', trigger: ['blur', 'change']}],
articleContent: [{required: true, message: '请输入文章内容', trigger: ['blur', 'change']}],
})
const handleBack = () => {
history.back()
}
const submitParam = (item) => {
return {
articleContent: item.articleContent,
articleTitle: item.articleTitle,
articleType: item.articleType,
remarks: item.remarks,
}
}
const handleSubmit = async (instance) => {
if (!instance) return
instance.validate(async (valid) => {
if (!valid) {
ElNotification({
title: '提示',
message: '请完善数据,再提交!',
type: 'error'
})
return;
}
const {msg, code} = await addArticle(submitParam(formData.value))
ElNotification({
title: '提示',
message: msg,
type: code === 1000 ? 'success' : 'error'
})
if (code === 1000) {
tagsViewStore.delVisitedViews(router.currentRoute.value.path)
await router.push({
name: 'Manage'
})
}
})
}
const handleResubmit = () => {
if (!route.query.id) return
let params = {
articleId: route.query.id,
...submitParam(formData.value)
}
editArticle(params).then(res => {
ElNotification({
title: '提示',
message: res.msg,
type: res.code === 1000 ? 'success' : 'error'
})
if (res.code === 1000) {
tagsViewStore.delVisitedViews(router.currentRoute.value.path)
router.push({
name: 'Manage'
})
}
})
}
const getDetailInfo = async () => {
loading.value = true
getArticleDetail(route.query.id).then(res => {
if (res.code === 1000) {
formData.value = res.data
loading.value = false
showTinymce.value=false
nextTick(() => {
showTinymce.value=true
})
}else{
ElNotification({
title: '提示',
message: res.msg,
type: 'error'
})
}
})
}
onMounted(async () => {
if (route.query.id) {
await getDetailInfo()
}
})
</script>
<style scoped lang="scss">
.company-select {
:deep(.el-form-item__content .el-select__wrapper ) {
width: 750px;
}
.company-style {
//width: 98%;
min-height: 30px;
max-height: 60px;
overflow: hidden;
text-overflow: ellipsis;
-webkit-line-clamp: 2;
display: -webkit-box;
-webkit-box-orient: vertical;
}
.company {
color: #fff;
height: auto;
}
}
:deep(.el-table--fit ) {
height: 300px !important;
}
.add-block {
padding: 0 30px;
}
:deep(.el-input-number) {
width: 88.5%;
.el-input__wrapper{
padding: 1px 11px!important;
}
.el-input__inner {
text-align: left;
}
}
:deep(.el-table__header) {
.is-leaf:first-child {
.cell {
margin-left: -20px !important;
}
}
}
:deep(.el-table__body) {
.el-table__cell:first-child {
.cell {
margin-left: -10px !important;
}
}
}
</style>

View File

@@ -0,0 +1,132 @@
<template>
<div v-loading="loading" class="article-detail">
<el-form :model="formData">
<h2 class="article-title">{{ formData.articleTitle }}</h2>
<div class="article-title">
<Tag dictType="article_type" :value="formData.articleType"/>
<span>{{ formData.articleTime }}</span>
<span>备注{{ formData.remarks }}</span>
</div>
<el-row gutter="20">
<el-col :span="24">
<el-form-item>
<div class="article-a" v-html="formData.articleContent" @click="clickHandle"></div>
</el-form-item>
</el-col>
</el-row>
</el-form>
</div>
</template>
<script setup>
import {ElLoading, ElNotification} from "element-plus";
import {getArticleDetail} from "@/api/article";
import {downloadFile} from "@/api/project-demand";
const loading = ref(false)
const formData = ref({})
const route = useRoute()
const clickHandle = (e) => {
if (e.target.nodeName == "A") {
e.preventDefault()
let url = e.target.href.split('?')[0];
const searchParams = new URLSearchParams(e.target.href.split('?')[1])
const fileId = searchParams.get('fileId');
const fileName = searchParams.get('fileName');
// if(localStorage.getItem("fileUrlList")){
// let fileUrlList=JSON.parse(localStorage.getItem("fileUrlList"));
// fileUrlList.forEach(item=>{
// if(item.url == e.target.href){
// console.info("🚀 ~method:item -----", item)
let item = {
url,
fileName
}
// handleDownload(fileId,fileName)
download(item)
// }else {
// e.preventDefault()
// }
// })
// }
}
}
// const handleDownload = (fileId,fileName) => {
// const loading = ElLoading.service({fullscreen: true})
// downloadFile(fileId).then(res => {
// const blob = new Blob([res])
// let a = document.createElement('a')
// a.href = URL.createObjectURL(blob)
// nextTick(() => {
// a.download = fileName
// a.click()
// loading.close()
// })
// })
// }
const download = (row) => {
const x = new window.XMLHttpRequest();
x.open('GET', row.url, true);
x.responseType = 'blob';
x.onload = () => {
const url = window.URL.createObjectURL(x.response);
const a = document.createElement('a');
a.href = url;
a.download = row.fileName;
a.click();
window.open(row.url,'_blank')
};
x.send();
}
const getDetailInfo = async () => {
loading.value = true
getArticleDetail(route.query.id).then(res => {
if (res.code === 1000) {
formData.value = res.data
loading.value = false
} else {
ElNotification({
title: '提示',
message: res.msg,
type: 'error'
})
}
})
}
onMounted(async () => {
if (route.query.id) {
await getDetailInfo()
}
})
</script>
<style lang="scss">
.article-a {
a {
color: #409eff !important;
&:hover {
text-decoration: underline !important;
}
}
}
</style>
<style scoped lang="scss">
.article-detail {
padding: 0 30px;
padding-top: 15px;
width: 100%;
height: 100%;
.article-title {
display: flex;
justify-content: center;
align-items: center;
> span:nth-child(2) {
margin: 15px;
}
}
}
</style>

View File

@@ -0,0 +1,232 @@
<template>
<fvSearchForm :searchConfig="articleSearchConfig" @search="searchArticle" searchProp="articleType" :searchValue="routeArticleType"
style="margin-left: 16px"></fvSearchForm>
<fvTable ref="tableIns" :tableConfig="articleTableConfig" @headBtnClick="headBtnClick">
<template #empty>
<el-empty description="暂无数据"/>
</template>
</fvTable>
</template>
<script setup lang="jsx">
import {ElNotification} from "element-plus";
import {deleteArticle} from "@/api/article";
import fvSelect from '@/fvcomponents/fvSelect/index.vue'
const router = useRouter();
const route = useRoute();
const routeArticleType = ref(route.query.type)
const articleSearchConfig = reactive([
{
label: '文章标题',
prop: 'articleTitle',
component: 'el-input',
props: {
placeholder: '请输入文章标题查询',
clearable: true,
filterable: true,
checkStrictly: true
}
},
{
label: '文章类型',
prop: 'articleType',
component: shallowRef(fvSelect),
props: {
placeholder: '请选择文章类型',
clearable: true,
filterable: true,
checkStrictly: true,
cacheKey: 'article_type',
remote: true
}
},
{
label: '时间',
prop: 'articleTime',
component: 'el-date-picker',
props: {
placeholder: '请选择时间',
clearable: true,
type: 'date',
format: 'YYYY-MM-DD',
valueFormat: "YYYY-MM-DD"
},
colProps: {}
},
])
const tableIns = ref()
const articleTableConfig = reactive({
columns: [
{
prop: 'index',
type: 'index',
label: '序号',
align: 'center',
width: 85,
index: index => {
return (tableIns.value.getQuery().pageNum - 1) * tableIns.value.getQuery().pageSize + index + 1
}
},
{
prop: 'articleTitle',
label: '文章标题',
align: 'center'
},
{
prop: 'articleType',
label: '文章类型',
align: 'center',
showOverflowTooltip: false,
currentRender: ({row, index}) => {
if (row.articleType == undefined || row.articleType == null) {
return '--'
} else {
return (<Tag dictType={'article_type'} value={row.articleType}/>)
}
}
},
{
prop: 'articleTime',
label: '时间',
align: 'center'
},
{
prop: 'remarks',
label: '备注',
align: 'center'
},
{
prop: 'oper',
label: '操作',
align: 'center',
fixed: 'right',
showOverflowTooltip: false,
currentRender: ({row, index}) => {
let btn = []
btn.push({label: '详情', func: () => handleDetail(row), type: 'primary'})
btn.push({label: '编辑', prem: ['mosr:article:edit'], func: () => handleEdit(row), type: 'primary'})
return (
<div style={{width: '100%'}}>
{
btn.map(item => (
item.prem ?
<el-button
type={item.type}
v-perm={item.prem}
onClick={() => item.func()}
link
>
{item.label}
</el-button> :
<el-button
type={item.type}
onClick={() => item.func()}
link
>
{item.label}
</el-button>
))
}
{
<popover-delete name={row.articleTitle} type={'文章'} btnType={'danger'} perm={['mosr:article:del']}
onDelete={() => handleDelete(row)}/>
}
</div>
)
}
}
],
api: '/workflow/mosr/article/list',
btns: [
{name: '新增', key: 'add', color: '#DED0B2', auth: ['mosr:article:add']}
],
params: {}
})
const searchArticle = (val) => {
let obj = {...val}
if (obj.dateValue) {
obj.startGenerationTime = obj.dateValue[0]
obj.endGenerationTime = obj.dateValue[1]
delete obj.dateValue
}
articleTableConfig.params = obj
tableIns.value.refresh()
}
const init = async () => {
if(routeArticleType.value){
nextTick(()=>{
console.info("🚀 ~method:articleSearchConfig -----", articleSearchConfig[1].component.props)
searchArticle({articleType:routeArticleType.value})
})
}
}
init()
const headBtnClick = (key) => {
switch (key) {
case 'add':
handleAdd()
break;
}
}
const handleAdd = () => {
router.push({
name: 'Article/add',
query: {}
})
}
const handleDetail = (row) => {
router.push({
name: 'Article/detail',
query: {
id: row.articleId
}
})
}
const handleEdit = (row) => {
router.push({
name: 'Article/edit',
query: {
id: row.articleId
}
})
}
const handleDelete = (row) => {
deleteArticle(row.articleId).then(res => {
ElNotification({
title: '提示',
message: res.msg,
type: res.code === 1000 ? 'success' : 'error'
})
if (res.code === 1000) {
tableIns.value.refresh()
}
});
}
</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

@@ -1,8 +1,8 @@
<template> <template>
<div class="my"> <div class="my">
<el-row :gutter="20"> <el-row :gutter="20">
<el-col :span="10" :xs="24"> <el-col :span="12" :xs="24">
<el-card class="box-card1"> <el-card>
<!-- 标题 --> <!-- 标题 -->
<template #header> <template #header>
<div class="card-header"> <div class="card-header">
@@ -28,24 +28,24 @@
</div> </div>
<div>{{ userParams.nickName }}</div> <div>{{ userParams.nickName }}</div>
</div> </div>
<div class="userInfo_item"> <!-- <div class="userInfo_item">-->
<div style="display: flex;align-items: center"> <!-- <div style="display: flex;align-items: center">-->
<el-icon size="18" style="margin-right: 5px"> <!-- <el-icon size="18" style="margin-right: 5px">-->
<Notification/> <!-- <Notification/>-->
</el-icon> <!-- </el-icon>-->
工号: <!-- 工号:-->
</div> <!-- </div>-->
<div>{{ userParams.workCode }}</div> <!-- <div>{{ userParams.workCode }}</div>-->
</div> <!-- </div>-->
<div class="userInfo_item"> <!-- <div class="userInfo_item">-->
<div style="display: flex;align-items: center"> <!-- <div style="display: flex;align-items: center">-->
<el-icon size="18" style="margin-right: 5px"> <!-- <el-icon size="18" style="margin-right: 5px">-->
<Phone/> <!-- <Phone/>-->
</el-icon> <!-- </el-icon>-->
电话号码: <!-- 电话号码:-->
</div> <!-- </div>-->
<div>{{ userParams.mobile }}</div> <!-- <div>{{ userParams.mobile }}</div>-->
</div> <!-- </div>-->
<div class="userInfo_item"> <div class="userInfo_item">
<div style="display: flex;align-items: center"> <div style="display: flex;align-items: center">
<el-icon size="18" style="margin-right: 5px"> <el-icon size="18" style="margin-right: 5px">
@@ -94,7 +94,70 @@
</div> </div>
</el-card> </el-card>
</el-col> </el-col>
<el-col :span="14" :xs="24"> <el-col :span="12" :xs="24">
<el-card>
<baseTitle title="设置代理" ></baseTitle>
<el-form ref="userForm" :model="agentInfoForm" label-width="85px">
<el-row gutter="30">
<el-col :span="24">
<el-form-item label="被代理人" prop="nickName">
<span>{{ agentInfoForm.nickName }}</span>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="代理人" prop="" required >
<el-button style="margin-right: 10px" color="#DED0B2" @click="handleShowAgentDialog">
{{ agentUserList?.length !== 0 ? '更改' : '请选择' }}
</el-button>
<div v-for="item in agentUserList" :key="item.id" style="margin-right: 5px">
{{ item.name }}
</div>
<user-picker :multiple="false" ref="agentUserPickerRef" title="请选择代理人"
v-model:value="agentUserList" @ok="agentUserPickerOk"
@cancelOrClear="agentUserPickerOk"/>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="代理状态" prop="agentState">
<Tag dictType="agent_state" :value="agentInfoForm.agentState"/>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="开始时间" prop="agentStartTime">
<el-config-provider>
<el-date-picker
v-model="agentInfoForm.agentStartTime"
type="datetime"
placeholder="请选择开始时间"
value-format="YYYY-MM-DD HH:mm:ss"
/>
</el-config-provider>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="结束时间" prop="agentEndTime" :title="!agentInfoForm.agentStartTime?'请先选择开始时间!':''">
<el-config-provider>
<el-date-picker
v-model="agentInfoForm.agentEndTime"
type="datetime"
placeholder="请选择结束时间"
value-format="YYYY-MM-DD HH:mm:ss"
:disabled="!agentInfoForm.agentStartTime"
:disabled-date="disabledAgentEndTime"
/>
</el-config-provider>
</el-form-item>
</el-col>
<el-form-item>
<el-button color="#DED0B2" @click="handleSubmitAgent" style="margin-left: 16px">提交</el-button>
</el-form-item>
</el-row>
</el-form>
</el-card>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="12" :xs="24">
<el-card class="box-card"> <el-card class="box-card">
<!-- 标题 --> <!-- 标题 -->
<template #header> <template #header>
@@ -113,8 +176,8 @@
<el-input placeholder="请确认新密码" v-model="userPassword.confirmPassword" type="password"/> <el-input placeholder="请确认新密码" v-model="userPassword.confirmPassword" type="password"/>
</el-form-item> </el-form-item>
<el-form-item> <el-form-item>
<el-button color="#DED0B2" @click="handleSubmit">提交</el-button> <el-button color="#DED0B2" @click="handleSubmitPassword">提交</el-button>
<el-button @click="close">关闭</el-button> <el-button @click="closeIndividualCenter">关闭</el-button>
</el-form-item> </el-form-item>
</el-form> </el-form>
</el-card> </el-card>
@@ -126,18 +189,23 @@
import {ElNotification} from 'element-plus' import {ElNotification} from 'element-plus'
import {useTagsView} from '@/stores/tagsview.js' import {useTagsView} from '@/stores/tagsview.js'
import {getAuthInfo} from "@/api/login"; import {getAuthInfo} from "@/api/login";
import {editPassword, initPassword} from "@/api/auth/auth"; import {editPassword, initPassword,getAgentInfo,editAgentInfo} from "@/api/auth/auth";
import UserPicker from "@/views/workflow/process/common/UserPicker.vue";
const router = useRouter()
const tagsViewStore = useTagsView()
const isInitPassword = ref(false); const isInitPassword = ref(false);
const agentUserList = ref([])
const agentUserPickerRef = ref()
const userParams = ref({}); const userParams = ref({});
const passwordRef = ref(); const passwordRef = ref();
const router = useRouter() const agentInfoForm = ref({});
const userPassword = ref({ const userPassword = ref({
oldPassword: '', oldPassword: '',
newPassword: '', newPassword: '',
confirmPassword: '' confirmPassword: ''
}); });
const tagsViewStore = useTagsView()
const validatePasswordComplexity = (rule, value, callback) => { const validatePasswordComplexity = (rule, value, callback) => {
const reg = /^(?=.*[a-zA-Z])(?=.*\d).{1,9}$/; //密码必须是至少包含字母、数字1-9位 const reg = /^(?=.*[a-zA-Z])(?=.*\d).{1,9}$/; //密码必须是至少包含字母、数字1-9位
if (!reg.test(value)) { if (!reg.test(value)) {
@@ -176,21 +244,92 @@ const rules = reactive({
} }
], ],
}) })
const disabledAgentEndTime = (time) => {
return time.getTime() <= new Date(agentInfoForm.value.agentStartTime)-1 * 24 * 3600 * 1000
}
const getInfo = async () => { const handleShowAgentDialog = () => {
agentUserPickerRef.value.showUserPicker()
}
const agentUserPickerOk = (userList) => {
console.info("🚀 ~method:userList -----", userList)
agentUserList.value = userList
}
const getUserInfo = async () => {
await getAuthInfo().then(res => { await getAuthInfo().then(res => {
if(res.code===1000){
userParams.value = res.data.user userParams.value = res.data.user
isInitPassword.value = res.data.initPassword isInitPassword.value = res.data.initPassword
}else {
ElNotification({
title: '提示',
message: res.msg,
type: 'error'
})
}
}) })
} }
const getUserAgentInfo = async () => {
await getAgentInfo().then(res => {
if(res.code===1000){
agentInfoForm.value=res.data
if(res.data.agentUserId){
agentUserList.value=[
{
id:res.data.agentUserId,
name:res.data.agentNickName,
companyName:res.data.agentCompanyName,
}
]
}
}else {
ElNotification({
title: '提示',
message: res.msg,
type: 'error'
})
}
})
}
localStorage.removeItem('originallySelectedList')
const belongToRole = (roles) => { const belongToRole = (roles) => {
if (!roles) return; if (!roles) return;
return roles.map(item => item.roleName).join('') return roles.map(item => item.roleName).join('')
} }
const handleSubmitAgent=()=>{
let agentUserId=''
if(agentUserList.value&&agentUserList.value.length>0){
agentUserId=agentUserList.value[0]?.id
}else {
ElNotification({
title: '提示',
message: '请选择代理人!',
type: 'error'
})
return;
}
let agentParams={
agentUserId:agentUserId,
agentStartTime:agentInfoForm.value.agentStartTime,
agentEndTime:agentInfoForm.value.agentEndTime
}
console.info("🚀 ~method:agentParams -----", agentParams)
editAgentInfo(agentParams).then(res => {
ElNotification({
title: '提示',
message: res.msg,
type: res.code === 1000 ? 'success' : 'error'
})
if (res.code === 1000) {
getUserAgentInfo()
}
})
}
// 修改密码 // 修改密码
const handleSubmit = async () => { const handleSubmitPassword = async () => {
if (isInitPassword.value) { if (isInitPassword.value) {
editPassword({ editPassword({
...userPassword.value ...userPassword.value
@@ -221,23 +360,28 @@ const handleSubmit = async () => {
} }
} }
// 关闭 // 关闭
const close = () => { const closeIndividualCenter = () => {
tagsViewStore.delVisitedViews(router.currentRoute.value.path) tagsViewStore.delVisitedViews(router.currentRoute.value.path)
router.push('/') router.push('/')
} }
onMounted(() => { onMounted(() => {
getInfo() getUserInfo()
getUserAgentInfo()
}) })
</script> </script>
<style lang="scss"> <style lang="scss">
.box-card {
//margin-left: 10px;
margin-top: 10px;
}
body, div { body, div {
margin: 0; margin: 0;
padding: 0; padding: 0;
} }
.my { .my {
margin: 0 auto; margin: 20px auto 0;
margin-top: 20px;
.userDetail { .userDetail {
.userImg { .userImg {
@@ -256,21 +400,14 @@ body, div {
} }
.userInfo_item { .userInfo_item {
display: flex;align-items: center; display: flex;
align-items: center;
justify-content: space-between; justify-content: space-between;
height: 40px; height: 40px;
border-bottom-style: solid; border-bottom-style: solid;
border-color: #daddd2; border-color: #daddd2;
border-width: 1px; border-width: 1px;
//text-align: left;
//line-height: 40px;
} }
//
//.userInfo_item > div {
// float: right;
//}
} }
</style> </style>

View File

@@ -6,7 +6,6 @@ import {ElLoading} from 'element-plus'
const authStore = useAuthStore() const authStore = useAuthStore()
const router = useRouter(); const router = useRouter();
const tokenValue = reactive(router.currentRoute.value.query.token) const tokenValue = reactive(router.currentRoute.value.query.token)
console.log('tokenValue', tokenValue)
const init = () => { const init = () => {
const loading = ElLoading.service({ const loading = ElLoading.service({
lock: true, lock: true,
@@ -16,7 +15,6 @@ const init = () => {
if (authStore.casToken(tokenValue)) { if (authStore.casToken(tokenValue)) {
loading.close() loading.close()
const toView = sessionStorage.getItem('toView') const toView = sessionStorage.getItem('toView')
console.log(toView, 'toView');
if (toView) { if (toView) {
let parse = JSON.parse(toView); let parse = JSON.parse(toView);
window.location.href = window.location.origin + parse.path + parse.query window.location.href = window.location.origin + parse.path + parse.query

View File

@@ -0,0 +1,141 @@
<template>
<fvTable ref="tableIns" :tableConfig="tableConfig" style="margin-top: 15px"></fvTable>
</template>
<script setup lang="jsx">
const router = useRouter()
const tableIns = ref()
const tableConfig = reactive({
columns: [
{
prop: 'index',
type: 'index',
label: '序号',
align: 'center',
width:60,
index: index => {
return (tableIns.value.getQuery().pageNum - 1) * tableIns.value.getQuery().pageSize + index + 1
}
},
{
prop: 'targetName',
label: '名称',
align: 'center'
},
{
prop: 'initiatorName',
label: '发起人',
align: 'center'
},
{
prop: 'targetState',
label: '流程类型',
align: 'center',
showOverflowTooltip: false,
currentRender: ({row, index}) => {
if (row.targetState !== null || row.targetState !== undefined) {
return (<Tag dictType={'todo_type'} value={row.targetState}/>)
} else {
return '--'
}
}
},
{
prop: 'submitTime',
label: '提交时间',
align: 'center'
},
{
prop: 'oper',
label: '操作',
align: 'center',
fixed: 'right',
width: 150,
showOverflowTooltip: false,
currentRender: ({row, index}) => {
let btn = []
btn.push({label: '查看', func: () => handleView(row), type: 'primary'})
return (
<div style={{width: '100%'}}>
{
btn.map(item => (
<el-button
type={item.type}
onClick={() => item.func()}
link
>
{item.label}
</el-button>
))
}
</div>
)
}
}
],
api: '/workflow/mosr/process/task/about',
})
const handleView = (row) => {
if (row.targetState == '00' && row.targetId) {
router.push({
name: 'Requirement/detail',
query: {
id: row.targetId,
source: 'home'
}
})
}
// else if (row.targetState == '10' && row.targetId) {
// router.push({
// name: 'Summary/detail',
// query: {
// projectId: row.targetId,
// state: row.state,
// source: 'home'
// }
// })
// }
else if (row.targetState == '10' ||row.targetState == '20' || row.targetState == '40' || row.targetState == '50') {
router.push({
name: 'Implementation/detail',
query: {
projectId: row.targetId,
state: row.state,
step: row.targetState,
source: 'home'
}
})
} else if (row.targetState == '70' && row.targetId) {
router.push({
name: 'Fund/detail',
query: {
id: row.targetId,
state: row.state,
source: 'home'
}
})
} else if (row.targetState == '80' && row.targetId) {
router.push({
name: 'Share/detail',
query: {
id: row.targetId,
state: row.state,
source: 'home'
}
})
} else if (row.targetState == '90' && row.targetId) {
router.push({
name: 'Phase/detail',
query: {
projectId: row.targetId,
source: 'home'
}
})
}
}
</script>
<style scoped>
</style>

View File

@@ -1,5 +1,5 @@
<template> <template>
<fvSearchForm :searchConfig="searchConfig" @search="search"></fvSearchForm> <fvSearchForm :searchConfig="searchConfig" @search="search" style="margin-left: 16px"></fvSearchForm>
<fvTable ref="tableIns" :tableConfig="tableConfig"> <fvTable ref="tableIns" :tableConfig="tableConfig">
<template #empty> <template #empty>
<el-empty description="暂无数据"/> <el-empty description="暂无数据"/>
@@ -10,9 +10,23 @@
<script setup lang="jsx"> <script setup lang="jsx">
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 { getSubCompOpt } from '@/api/user/user.js';
const router = useRouter() const router = useRouter()
const route = useRoute() const route = useRoute()
const searchConfig = reactive([ const searchConfig = ref([
{
label: '公司名称',
prop: 'affiliatedCompanyIds',
component: 'el-tree-select',
props: {
placeholder: '请输入公司名称查询',
clearable: true,
data: [],
filterable: true,
checkStrictly: true,
remote: true
}
},
{ {
label: '项目名称', label: '项目名称',
prop: 'projectName', prop: 'projectName',
@@ -24,19 +38,7 @@ const searchConfig = reactive([
checkStrictly: true checkStrictly: true
} }
}, },
{
label: '时间',
prop: 'time',
component: 'el-date-picker',
props: {
placeholder: '请选择时间',
clearable: true,
type:'month',
format: 'YYYY-MM',
valueFormat:'YYYY-MM',
},
colProps: {}
},
{ {
label: '项目费用', label: '项目费用',
prop: 'projectCost', prop: 'projectCost',
@@ -46,6 +48,7 @@ const searchConfig = reactive([
clearable: true, clearable: true,
filterable: true, filterable: true,
cacheKey: 'project_cost', cacheKey: 'project_cost',
remote: true
} }
}, },
{ {
@@ -58,8 +61,23 @@ const searchConfig = reactive([
filterable: true, filterable: true,
checkStrictly: true, checkStrictly: true,
cacheKey: 'fee_stage', cacheKey: 'fee_stage',
remote: true
} }
}, },
{
label: '时间',
prop: 'time',
component: 'el-date-picker',
props: {
placeholder: '请选择时间',
clearable: true,
type:'month',
format: 'YYYY-MM',
valueFormat:'YYYY-MM',
},
colProps: {}
},
{ {
label: '税后余额', label: '税后余额',
prop: 'afterTax', prop: 'afterTax',
@@ -90,22 +108,28 @@ const tableConfig = reactive({
prop: 'name', prop: 'name',
type: 'index', type: 'index',
label: '序号', label: '序号',
width:'80', align: 'center',
width:85,
index: index => {
return (tableIns.value.getQuery().pageNum - 1) * tableIns.value.getQuery().pageSize + index + 1
}
},
{
prop: 'affiliatedCompany',
label: '公司名称',
align: 'center' align: 'center'
}, },
{ {
prop: 'projectName', prop: 'projectName',
label: '项目名称', label: '项目名称',
align: 'center' align: 'center'
},{
prop: 'time',
label: '时间',
align: 'center'
}, },
{ {
prop: 'projectCost', prop: 'projectCost',
label: '项目费用', label: '项目费用',
align: 'center', align: 'center',
width: 120,
showOverflowTooltip: false, showOverflowTooltip: false,
currentRender: ({row, index}) => { currentRender: ({row, index}) => {
if (row.projectCost !== null&&row.projectCost !== null&&row.projectCost!==undefined) { if (row.projectCost !== null&&row.projectCost !== null&&row.projectCost!==undefined) {
@@ -119,6 +143,7 @@ const tableConfig = reactive({
prop: 'researchStage', prop: 'researchStage',
label: '研发阶段', label: '研发阶段',
align: 'center', align: 'center',
width: 120,
showOverflowTooltip: false, showOverflowTooltip: false,
currentRender: ({row, index}) => { currentRender: ({row, index}) => {
if (row.researchStage&&row.researchStage !== null&&row.researchStage!==undefined) { if (row.researchStage&&row.researchStage !== null&&row.researchStage!==undefined) {
@@ -128,6 +153,12 @@ const tableConfig = reactive({
} }
} }
}, },
{
prop: 'time',
label: '时间',
align: 'center',
width: 120,
},
{ {
label: '摘要', label: '摘要',
prop: 'digest', prop: 'digest',
@@ -156,14 +187,41 @@ const tableConfig = reactive({
}, },
], ],
api: '/workflow/mosr/expense/ledger', api: '/workflow/mosr/expense/ledger',
params: {} params: {},
export:{
open :true,
fileName:`科技创新项目费用台账.xlsx`
}
}) })
const search = (val) => { const search = (val) => {
tableConfig.params = {...val} tableConfig.params = {...val}
tableIns.value.refresh() tableIns.value.refresh()
} }
const init = async () => {
const res = await getSubCompOpt()
searchConfig.value.find(item=>item.prop == 'affiliatedCompanyIds').props.data = res.data
}
init()
</script> </script>
<style scoped lang="scss">
:deep(.el-table__header) {
.is-leaf:first-child {
.cell {
margin-left: -25px !important;
}
}
}
<style scoped> :deep(.el-table__body) {
.el-table__cell:first-child {
.cell {
margin-left: -13px !important;
}
}
}
:deep(.el-date-editor--month){
width: 100%;
}
</style> </style>

View File

@@ -0,0 +1,333 @@
<template>
<fvSearchForm :searchConfig="searchConfig" @search="search" style="margin-left: 16px"></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 route = useRoute()
const router = useRouter()
const shortcuts = [
{
text: '上周',
value: () => {
const end = new Date()
const start = new Date()
start.setTime(start.getTime() - 3600 * 1000 * 24 * 7)
return [start, end]
},
},
{
text: '上月',
value: () => {
const end = new Date()
const start = new Date()
start.setTime(start.getTime() - 3600 * 1000 * 24 * 30)
return [start, end]
},
},
{
text: '三月前',
value: () => {
const end = new Date()
const start = new Date()
start.setTime(start.getTime() - 3600 * 1000 * 24 * 90)
return [start, end]
},
},
]
const searchConfig = ref([
{
label: '征集公司',
prop: 'affiliatedCompanyId',
component: 'el-tree-select',
props: {
placeholder: '请输入征集公司查询',
clearable: true,
data: [],
filterable: true,
checkStrictly: true,
remote: true
}
},
{
label: '项目名称',
prop: 'projectName',
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
}
},
{
label: '项目影响',
prop: 'projectImpact',
component: shallowRef(fvSelect),
props: {
placeholder: '请选择项目影响',
cacheKey: 'project_impact',
clearable: true,
filterable: true,
remote: true
},
colProps: {}
},
{
label: '研发主体',
prop: 'rdSubject',
component: shallowRef(fvSelect),
props: {
placeholder: '请选择研发主体',
cacheKey: 'rd_subject',
clearable: true,
filterable: true,
remote: true
}
},
{
label: '起止时间',
prop: 'dateValue',
component: 'el-date-picker',
props: {
clearable: true,
type: 'daterange',
startPlaceholder: '开始日期',
endPlaceholder: '结束日期',
valueFormat: 'YYYY-MM-DD HH:mm:ss',
shortcuts: shortcuts
}
}
])
const tableIns = ref()
const tableConfig = reactive({
columns: [
// {
// type: 'selection',
// prop: 'selection'
// },
{
prop: 'index',
type: 'index',
label: '序号',
align: 'center',
width:85,
index: index => {
return (tableIns.value.getQuery().pageNum - 1) * tableIns.value.getQuery().pageSize + index + 1
}
},
{
prop: 'affiliatedCompany',
label: '征集公司',
align: 'center'
},
{
prop: 'projectName',
label: '项目名称',
align: 'center'
},
{
prop: 'projectType',
label: '项目类型',
align: 'center',
width: 100,
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: 'rdSubject',
label: '研发主体',
align: 'center',
width: 100,
showOverflowTooltip: false,
currentRender: ({row, index}) => {
if (row.rdSubject && row.rdSubject !== null && row.rdSubject !== undefined) {
return (<Tag dictType={'rd_subject'} value={row.rdSubject}/>)
} else {
return '--'
}
}
},
{
prop: 'researchStage',
label: '研发阶段',
align: 'center',
width: 100,
showOverflowTooltip: false,
currentRender: ({row, index}) => {
if (row.researchStage && row.researchStage !== null && row.researchStage !== undefined) {
return (<Tag dictType={'research_stage'} value={row.researchStage}/>)
} else {
return '--'
}
}
},
{
prop: 'projectImpact',
label: '项目影响',
align: 'center',
width: 120,
showOverflowTooltip: false,
currentRender: ({row, index}) => {
if (row.projectImpact && row.projectImpact !== null && row.projectImpact !== undefined) {
return (<Tag dictType={'project_impact'} value={row.projectImpact}/>)
} else {
return '--'
}
}
},
{
prop: 'economicEstimate',
label: '经费预算(元)',
align: 'center',
width: 150,
currentRender:({row})=>{
return <span>{toThousands(row.economicEstimate)}</span>
}
},
{
prop: 'startTime',
label: '起止时间',
align: 'center',
currentRender: ({row}) => {
return row.startTime + ' 至 ' + row.endTime
}
},
{
prop: 'approveName',
label: '当前审批节点',
align: 'center',
width: 120,
currentRender: ({row, index}) => {
if(row.state=='3'||row.state=='4'){
return <span>{row.taskNode}</span>
}else if(row.state=='1'){
return <span>{row.approveName}</span>
}else {
return <span>--</span>
}
}
},
{
prop: 'state',
label: '状态',
align: 'center',
width: 100,
showOverflowTooltip: false,
currentRender: ({row, index}) => {
if (row.state && row.state !== null && row.state !== undefined) {
return (<Tag dictType={'project_implementation'} value={row.state}/>)
} else {
return '--'
}
}
},
{
prop: 'oper',
label: '操作',
align: 'center',
fixed:'right',
showOverflowTooltip: false,
currentRender: ({row, index}) => {
let btn = []
let buttons = new Set(Array.from(row.buttons))
if (buttons.has("standing")) {
btn.push({label: '台账', prem: ['project:management:implementation:account'], func: () => handleStandingBook(row), type: 'primary'})
}
return (
<div style={{width: '100%'}}>
{
btn.map(item => (
<el-button
type={item.type}
v-perm={item.prem}
onClick={() => item.func()}
link
>
{item.label}
</el-button>
))
}
</div>
)
}
}
],
api: '/workflow/mosr/project/implementation',
params: {
state:0
},
btns: [
// {name: '生成分摊报表', key: '_export', color: '#DED0B2', auth: ''}
]
})
const search = (val) => {
let obj = {...val}
if(obj.dateValue) {
obj.startTime = obj.dateValue[0]
obj.endTime = obj.dateValue[1]
delete obj.dateValue
}
tableConfig.params = obj
tableIns.value.refresh()
}
const handleStandingBook = (row) => {
router.push({
name: 'Implementation/account',
query: {
id: row.projectId
}
})
}
const init = async () => {
const res = await getSubCompOpt()
searchConfig.value.find(item=>item.prop == 'affiliatedCompanyId').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;
}
}
}
</style>

View File

@@ -1,15 +1,15 @@
<template> <template>
<div v-loading="loading"> <div v-loading="loading" style="padding: 0 30px">
<el-form :model="formData" ref="form" class="query-form" :rules="rules"> <el-form :model="formData" ref="form" :rules="rules" style="margin-left: 5px;margin-top: 18px">
<el-row> <el-row :gutter="30">
<el-col :span="12"> <el-col :span="6" style="margin-left: -15px">
<el-form-item label="分摊名称" prop="shareName"> <el-form-item label="分摊名称" prop="shareName" >
<el-input v-model="formData.shareName" placeholder="请输入分摊名称" clearable> <el-input v-model="formData.shareName" placeholder="请输入分摊名称" clearable>
</el-input> </el-input>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="12"> <el-col :span="6">
<el-form-item label="分摊月份" prop="apportionmentMonth"> <el-form-item label="分摊月份" prop="apportionmentMonth" label-width="80">
<el-date-picker <el-date-picker
v-model="formData.apportionmentMonth" v-model="formData.apportionmentMonth"
type="month" type="month"
@@ -24,7 +24,7 @@
<el-table-column prop="projectId" label="项目名称" min-width="230"> <el-table-column prop="projectId" label="项目名称" min-width="230">
<template #default="scope"> <template #default="scope">
<el-form-item prop="time" :rules="scope.row.projectId?'1':rules.projectId"> <el-form-item prop="time" :rules="scope.row.projectId?'1':rules.projectId">
<el-select v-model="scope.row.projectId" placeholder="请选择项目名称" clearable filterable> <el-select v-model="scope.row.projectId" placeholder="请选择项目名称" clearable filterable @change="selectProject(scope.row,scope.$index)">
<el-option <el-option
v-for="item in nameOptions" v-for="item in nameOptions"
:key="item.value" :key="item.value"
@@ -40,7 +40,8 @@
<template #default="scope"> <template #default="scope">
<el-form-item prop="researchPersonnelId"> <el-form-item prop="researchPersonnelId">
{{ scope.row.researchPersonnel }} {{ scope.row.researchPersonnel }}
<el-button color="#DED0B2" @click="showPersonnelPicker(scope.row,scope.$index)" style="margin-left: 10px"> <el-button color="#DED0B2" @click="showPersonnelPicker(scope.row,scope.$index)"
style="margin-left: 10px">
{{ scope.row.researchPersonnel ? '更改' : '请选择研发人员' }} {{ scope.row.researchPersonnel ? '更改' : '请选择研发人员' }}
</el-button> </el-button>
</el-form-item> </el-form-item>
@@ -97,31 +98,35 @@
</el-table-column> </el-table-column>
<el-table-column prop="oper" label="操作" min-width="130"> <el-table-column prop="oper" label="操作" min-width="130">
<template #default="scope"> <template #default="scope">
<el-button type="primary" @click="handleCopy(scope.row)" link style="font-size: 18px">复制</el-button> <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: 18px">删除</el-button> <el-button type="primary" @click="handleDelete(scope.$index)" link style="font-size: 16px">删除</el-button>
</template> </template>
</el-table-column> </el-table-column>
</el-table> </el-table>
</el-row> </el-row>
</el-form> </el-form>
<user-picker :multiple="false" ref="userPicker" title="请选择研发人员" v-model:value="userList" @ok="selected" <user-picker :multiple="false" ref="userPicker" title="请选择研发人员" v-model:value="userList"
:setNullToSelectList="true"/> @ok="selectedResearchPersonnel" @cancelOrClear="researchPersonnelPickerCancel"
:setNullToSelectList="true" :isResearch="true"/>
<div style="width:100%;text-align: center;padding: 10px"> <div style="width:100%;text-align: center;padding: 10px">
<el-button type="primary" @click="handleAdd" link style="font-size: 18px">添加一行</el-button> <el-button type="primary" @click="handleAdd" link style="font-size: 16px">添加一行</el-button>
</div> </div>
<div class="approval-record"> <div class="approval-record">
<div class="approval-title"> <div class="approval-title">
<baseTitle title="审批记录" v-if="processDiagramViewer&& opentionData?.operationList"></baseTitle> <!-- <baseTitle title="审批记录" v-if="processDiagramViewer&& opentionData?.operationList"></baseTitle>-->
<div v-else></div> <!-- <div v-else></div>-->
<div style="display: flex;align-items: center;justify-content: flex-start;"> <baseTitle title="审批记录"></baseTitle>
<div class="base-title" style="margin-left: 10px;margin-right: 10px">流程图</div> <div class="diagram">
<div class="base-title">流程图</div>
<el-switch <el-switch
v-model="changeDiagram" v-model="changeDiagram"
style="--el-switch-on-color:#BEA266 ; --el-switch-off-color:#cecdcd" style="--el-switch-on-color:#BEA266 ; --el-switch-off-color:#cecdcd;margin-top: 1px"
/> />
</div> </div>
</div> </div>
<el-empty :image-size="100" description="暂无审批记录"
v-if="processDiagramViewer&& !opentionData?.operationList&&!changeDiagram"/>
<div class="process"> <div class="process">
<operation-render <operation-render
v-if="processDiagramViewer&& opentionData?.operationList && opentionData?.operationList.length > 0&&!changeDiagram" v-if="processDiagramViewer&& opentionData?.operationList && opentionData?.operationList.length > 0&&!changeDiagram"
@@ -154,6 +159,7 @@ import {useProcessStore} from '@/stores/processStore.js';
import ProcessDiagramViewer from '@/views/workflow/common/ProcessDiagramViewer.vue'; import ProcessDiagramViewer from '@/views/workflow/common/ProcessDiagramViewer.vue';
import OperationRender from '@/views/workflow/common/OperationRender.vue' import OperationRender from '@/views/workflow/common/OperationRender.vue'
import UserPicker from "@/views/workflow/process/common/UserPicker.vue"; import UserPicker from "@/views/workflow/process/common/UserPicker.vue";
localStorage.removeItem('originallySelectedList')
const userList = ref([]) const userList = ref([])
const changeDiagram = ref(false) const changeDiagram = ref(false)
@@ -171,10 +177,11 @@ const rules = reactive({
researchDuration: [{required: true, message: '请输入研发时长', trigger: ['blur', 'change']}], researchDuration: [{required: true, message: '请输入研发时长', trigger: ['blur', 'change']}],
}) })
const processStore = useProcessStore() const processStore = useProcessStore()
const opentionData = ref() const opentionData = ref({})
const processInstanceData = ref() const processInstanceData = ref()
const processDiagramViewer = ref(false) const processDiagramViewer = ref(false)
const loading = ref(false) const loading = ref(false)
const isRepeatResearchPersonnel = ref(false)
const showTable = ref(true) const showTable = ref(true)
const route = useRoute() const route = useRoute()
const router = useRouter() const router = useRouter()
@@ -206,26 +213,61 @@ const researchOptions = ref([])
const showPersonnelPicker = (row, index) => { const showPersonnelPicker = (row, index) => {
currentRow.value = row currentRow.value = row
currentIndex.value = index currentIndex.value = index
if(row.companyName){ if (row.companyName&&row.researchPersonnelId) {
let userObj = { let userObj = {
id: row.researchPersonnelId, id: row.researchPersonnelId,
name: row.researchPersonnel, name: row.researchPersonnel,
companyName: row.companyName, companyName: row.companyName,
accountType: row.accountType, accountType: row.accountType,
} }
userList.value=[userObj] userList.value = [userObj]
}else if(!row.researchPersonnel){ } else if (!row.researchPersonnel) {
userList.value=[] userList.value = []
} }
nextTick(() => { nextTick(() => {
userPicker.value.showUserPicker() userPicker.value.showUserPicker()
}) })
} }
const selected = (select) => { const selectProject=(row,index)=>{
if (!select || select.length === 0) { console.log('row,index',row,index)
return //先选择人员, 再选择项目: 再添加一行,重复操作
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 = ''
} }
formData.value.tableData.forEach((item, index) => { }
}
// 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) { if (index === currentIndex.value) {
item.researchPersonnelId = select[0].id item.researchPersonnelId = select[0].id
item.researchPersonnel = select[0].name item.researchPersonnel = select[0].name
@@ -233,7 +275,86 @@ const selected = (select) => {
item.accountType = select[0].accountType item.accountType = select[0].accountType
} }
}) })
userList.value=select }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 getResearchOptions = async () => {
const res = await getResearchUser() const res = await getResearchUser()
@@ -246,7 +367,7 @@ const getProjectOptions = async () => {
const getProjectName = (id) => { const getProjectName = (id) => {
let label = '' let label = ''
nameOptions.value.forEach(item => { nameOptions.value.forEach(item => {
if (item.value === id) { if (item.value == id) {
label = item.label label = item.label
} }
}) })
@@ -273,10 +394,10 @@ const handleCopy = (row) => {
let copyObj = { let copyObj = {
projectId: row.projectId, projectId: row.projectId,
projectName: '', projectName: '',
accountType: row.accountType, // accountType: row.accountType,
companyName: row.companyName, // companyName: row.companyName,
researchPersonnelId: row.researchPersonnelId, // researchPersonnelId: row.researchPersonnelId,
researchPersonnel: row.researchPersonnel, // researchPersonnel: row.researchPersonnel,
wagesPayable: row.wagesPayable, wagesPayable: row.wagesPayable,
performance: row.performance, performance: row.performance,
reserveFund: row.reserveFund, reserveFund: row.reserveFund,
@@ -291,6 +412,7 @@ const handleDelete = (index) => {
formData.value.tableData.splice(index, 1) formData.value.tableData.splice(index, 1)
} }
const handleSubmit = (instance) => { const handleSubmit = (instance) => {
console.log('tableData', formData.value.tableData)
if (!instance) return if (!instance) return
instance.validate(async (valid) => { instance.validate(async (valid) => {
if (!valid) { if (!valid) {
@@ -323,7 +445,7 @@ const handleSubmit = (instance) => {
usrAllocations: formData.value.tableData, usrAllocations: formData.value.tableData,
deploymentId: processInstanceData.value.deploymentId, deploymentId: processInstanceData.value.deploymentId,
} }
// console.log('params', params, formData.value.tableData) console.log('params', params, formData.value.tableData)
const {code, msg} = await addAllocation(params) const {code, msg} = await addAllocation(params)
ElNotification({ ElNotification({
title: '提示', title: '提示',
@@ -370,7 +492,7 @@ const handleResubmit = (instance) => {
allocationId: formData.value.allocationId, allocationId: formData.value.allocationId,
shareName: formData.value.shareName, shareName: formData.value.shareName,
apportionmentMonth: formData.value.apportionmentMonth, apportionmentMonth: formData.value.apportionmentMonth,
usrAllocations:formData.value.tableData, usrAllocations: formData.value.tableData,
deploymentId: processInstanceData.value.deploymentId, deploymentId: processInstanceData.value.deploymentId,
} }
// console.log('params', params, formData.value.tableData) // console.log('params', params, formData.value.tableData)
@@ -473,4 +595,14 @@ onMounted(() => {
} }
} }
} }
:deep(.el-date-editor--month){
width: 100%!important;
}
:deep(.el-input-number) {
width: 100%;
.el-input__inner {
text-align: left;
}
}
</style> </style>

View File

@@ -1,12 +1,13 @@
<template> <template>
<el-form :model="formData" ref="form" class="query-form" label-width="auto"> <div style="padding: 0 30px">
<el-form :model="formData" ref="form" label-width="auto" style="margin-top: 18px">
<el-row> <el-row>
<el-col :span="12"> <el-col :span="6">
<el-form-item label="分摊名称"> <el-form-item label="分摊名称">
<span>{{ formData.shareName }}</span> <span>{{ formData.shareName }}</span>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="12"> <el-col :span="6">
<el-form-item label="分摊月份"> <el-form-item label="分摊月份">
<span>{{ formData.apportionmentMonth }}</span> <span>{{ formData.apportionmentMonth }}</span>
</el-form-item> </el-form-item>
@@ -52,7 +53,9 @@
</div> </div>
</div> </div>
<opinion v-if="shareData.taskId" :formData="shareData.formData" :taskId="shareData.taskId" <opinion v-if="shareData.taskId" :formData="shareData.formData" :taskId="shareData.taskId"
:taskUserOptionList="shareData.taskUserOptionList"
v-model:value="auditOpinion"></opinion> v-model:value="auditOpinion"></opinion>
</div>
</template> </template>
<script setup lang="jsx"> <script setup lang="jsx">

View File

@@ -1,5 +1,5 @@
<template> <template>
<fvSearchForm :searchConfig="searchConfig" @search="search"></fvSearchForm> <fvSearchForm :searchConfig="searchConfig" @search="search" style="margin-left: 16px"></fvSearchForm>
<fvTable ref="tableIns" :tableConfig="tableConfig" @headBtnClick="headBtnClick"> <fvTable ref="tableIns" :tableConfig="tableConfig" @headBtnClick="headBtnClick">
<template #empty> <template #empty>
<el-empty description="暂无数据"/> <el-empty description="暂无数据"/>
@@ -96,6 +96,16 @@ const searchConfig = reactive([
const tableIns = ref() const tableIns = ref()
const tableConfig = reactive({ const tableConfig = reactive({
columns: [ columns: [
{
prop: 'index',
type: 'index',
label: '序号',
align: 'center',
width:85,
index: index => {
return (tableIns.value.getQuery().pageNum - 1) * tableIns.value.getQuery().pageSize + index + 1
}
},
{ {
prop: 'shareName', prop: 'shareName',
label: '分摊名称', label: '分摊名称',
@@ -165,7 +175,6 @@ const tableConfig = reactive({
{ {
buttons.has("delete") ? buttons.has("delete") ?
<popover-delete name={row.shareName} type={'费用分摊'} btnType={'danger'} <popover-delete name={row.shareName} type={'费用分摊'} btnType={'danger'}
perm={['mosr:requirement:del']}
onDelete={() => handleDelete(row)}/> onDelete={() => handleDelete(row)}/>
: '' : ''
} }
@@ -234,6 +243,23 @@ const headBtnClick = (key) => {
} }
</script> </script>
<style scoped> <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> </style>

View File

@@ -1,5 +1,6 @@
<template> <template>
<div style="padding: 0 10px;"> <div style="padding: 0 10px;">
<baseTitle title="费用分摊详情"></baseTitle>
<el-form :model="formData" ref="form" class="query-form" label-width="auto"> <el-form :model="formData" ref="form" class="query-form" label-width="auto">
<el-row> <el-row>
<el-col :span="24"> <el-col :span="24">
@@ -53,6 +54,7 @@
</div> </div>
</div> </div>
<opinion-moblie v-if="shareData.taskId" :formData="shareData.formData" :taskId="shareData.taskId" <opinion-moblie v-if="shareData.taskId" :formData="shareData.formData" :taskId="shareData.taskId"
:taskUserOptionList="shareData.taskUserOptionList"
v-model:value="auditOpinion"></opinion-moblie> v-model:value="auditOpinion"></opinion-moblie>
</div> </div>
</template> </template>
@@ -65,8 +67,7 @@ import {useProcessStore} from '@/stores/processStore.js';
import {getAllocationDetail} from "@/api/expense-manage"; import {getAllocationDetail} from "@/api/expense-manage";
import AllocationSummaryDetailMoblie from './AllocationSummaryDetailMoblie.vue' import AllocationSummaryDetailMoblie from './AllocationSummaryDetailMoblie.vue'
import ExpenseDetailMoblie from './ExpenseDetailMoblie.vue' import ExpenseDetailMoblie from './ExpenseDetailMoblie.vue'
import OpinionMoblie from "@/views/project-demand/requirement/moblieDetail/OpinionMoblie.vue"; import OpinionMoblie from '@/views/project-management/mobledetail/OpinionMoblie.vue'
const changeDiagram = ref(false) const changeDiagram = ref(false)
const processStore = useProcessStore() const processStore = useProcessStore()
const route = useRoute() const route = useRoute()

File diff suppressed because it is too large Load Diff

View File

@@ -6,7 +6,7 @@
:rules="rules" :rules="rules"
label-width="70px" label-width="70px"
> >
<h2>管理平台</h2> <h2>技创新项目管理平台</h2>
<el-form-item prop="username" label="账号"> <el-form-item prop="username" label="账号">
<el-input v-model="loginForm.username" :prefix-icon="User"></el-input> <el-input v-model="loginForm.username" :prefix-icon="User"></el-input>
</el-form-item> </el-form-item>
@@ -43,8 +43,8 @@ import {User, Lock, Key} from '@element-plus/icons-vue'
const router = useRouter() const router = useRouter()
const authStore = useAuthStore() const authStore = useAuthStore()
const loginForm = reactive({ const loginForm = reactive({
username: 'superAdmin', username: '',
password: '123456', password: '',
code: '', code: '',
uuid: '' uuid: ''
}) })

View File

@@ -1,8 +1,8 @@
<template> <template>
<div v-loading="loading"> <div v-loading="loading" style="padding: 0 30px">
<el-form :model="formData" class="query-form"> <el-form :model="formData" style="margin-top: 18px">
<el-row> <el-row>
<el-col :span="8"> <el-col :span="6">
<el-form-item label="年度计划名称" prop="annualPlanName"> <el-form-item label="年度计划名称" prop="annualPlanName">
<div v-if="isEdit"> <div v-if="isEdit">
<el-input v-model="formData.annualPlanName" placeholder="请输入年度计划名称" clearable> <el-input v-model="formData.annualPlanName" placeholder="请输入年度计划名称" clearable>
@@ -12,7 +12,7 @@
<span v-else>{{ formData.annualPlanName }}</span> <span v-else>{{ formData.annualPlanName }}</span>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="8"> <el-col :span="6">
<el-form-item label="创建时间" prop="createTime"> <el-form-item label="创建时间" prop="createTime">
<span>{{ formData.createTime }}</span> <span>{{ formData.createTime }}</span>
</el-form-item> </el-form-item>
@@ -130,7 +130,7 @@
<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>
@@ -140,6 +140,11 @@
<span>{{ toThousands(scope.row.specialFundAmount) }}</span> <span>{{ toThousands(scope.row.specialFundAmount) }}</span>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column prop="oper" label="操作" fixed="right">
<template #default="{row}">
<el-button type="primary" @click="handleToProjectDetail(row)" link style="font-size: 16px">详情</el-button>
</template>
</el-table-column>
</template> </template>
</el-table-column> </el-table-column>
</el-table> </el-table>
@@ -158,11 +163,23 @@ const loading = ref(false)
const formData = ref({}) const formData = ref({})
const table = ref() const table = ref()
const route = useRoute() const route = useRoute()
const router = useRouter()
const isEdit = ref(false) const isEdit = ref(false)
const editVisible = ref(false) const editVisible = ref(false)
if(route.query.type=='summary'){ if(route.query.type=='summary'){
editVisible.value=true editVisible.value=true
} }
const handleToProjectDetail=(row)=>{
router.push({
name: 'Implementation/detail',
query: {
id: row.requirementId,
projectId: row.projectId,
state: row.state,
step: '10'
}
})
}
const exportTable = () => { const exportTable = () => {
const $e = table.value.$el const $e = table.value.$el
let $table = $e.querySelector('.el-table__fixed') let $table = $e.querySelector('.el-table__fixed')

View File

@@ -1,7 +1,9 @@
<template> <template>
<baseTitle title="年度计划"></baseTitle> <div >
<fvSearchForm :searchConfig="searchConfig" @search="search"></fvSearchForm> <!-- <baseTitle title="年度计划" style="margin-left: -15px;margin-bottom: -2px"></baseTitle>-->
<fvSearchForm :searchConfig="searchConfig" @search="search" style="margin-left: 16px;margin-bottom: -18px"></fvSearchForm>
<fvTable ref="tableIns" :tableConfig="tableConfig" @headBtnClick="headBtnClick"></fvTable> <fvTable ref="tableIns" :tableConfig="tableConfig" @headBtnClick="headBtnClick"></fvTable>
</div>
</template> </template>
<script setup lang="jsx"> <script setup lang="jsx">
@@ -17,7 +19,7 @@ const searchConfig = ref([
prop: 'annualPlanName', prop: 'annualPlanName',
component: 'el-input', component: 'el-input',
props: { props: {
placeholder: '请输入', placeholder: '请输入年度计划名称',
clearable: true clearable: true
}, },
} }
@@ -28,6 +30,16 @@ const tableConfig = reactive({
// type: 'selection', // type: 'selection',
// prop: 'selection' // prop: 'selection'
// }, // },
{
prop: 'index',
type: 'index',
label: '序号',
align: 'center',
width:85,
index: index => {
return (tableIns.value.getQuery().pageNum - 1) * tableIns.value.getQuery().pageSize + index + 1
}
},
{ {
prop: 'annualPlanName', prop: 'annualPlanName',
label: '年度计划名称', label: '年度计划名称',
@@ -115,5 +127,20 @@ const handleDelete = (row) => {
</script> </script>
<style scoped lang="scss"> <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;
}
}
}
</style> </style>

View File

@@ -1,16 +1,17 @@
<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="demandForm" :rules="rules"> <el-form :model="formData" ref="demandForm" :rules="rules" label-width="140px" :scroll-to-error="true"
:style="{marginLeft: !formData.isSpecialFund?'-55px':'-30px'}">
<el-row gutter="30"> <el-row gutter="30">
<el-col :span="8"> <el-col :span="6">
<el-form-item label="征集名称" prop="requirementName" label-width="96"> <el-form-item label="征集名称" prop="requirementName">
<el-input v-model="formData.requirementName" placeholder="请输入名称" clearable></el-input> <el-input v-model="formData.requirementName" placeholder="请输入征集名称" clearable @change="changeRequirementData"></el-input>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="8"> <el-col :span="6" style="margin-left: -40px">
<el-form-item label="征集类型" prop="collectType" label-width="105"> <el-form-item label="征集类型" prop="collectType">
<el-select v-model="formData.collectType" placeholder="请选择征集类型" clearable filterable> <el-select v-model="formData.collectType" placeholder="请选择征集类型" clearable filterable @change="changeRequirementData">
<el-option <el-option
v-for="item in cacheStore.getDict('collect_type')" v-for="item in cacheStore.getDict('collect_type')"
:key="item.value" :key="item.value"
@@ -20,30 +21,31 @@
</el-select> </el-select>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="8"> <el-col :span="6" style="margin-left: 10px">
<el-form-item label="需求上报截止时间" prop="deadline"> <el-form-item label="需求上报截止时间" prop="deadline">
<el-config-provider> <el-config-provider>
<el-date-picker <el-date-picker
style="width: 100%"
v-model="formData.deadline" v-model="formData.deadline"
type="date" type="date"
placeholder="需求上报截止时间" placeholder="请选择需求上报截止时间"
value-format="YYYY-MM-DD" value-format="YYYY-MM-DD"
:disabled-date="disabledDate" :disabled-date="disabledDate" @change="changeRequirementData"
/> />
</el-config-provider> </el-config-provider>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="8"> <el-col :span="6" style="margin-left: -20px">
<el-form-item label="是否专项资金" prop="isSpecialFund"> <el-form-item label="是否专项资金" prop="isSpecialFund">
<el-select v-model="formData.isSpecialFund" placeholder="是否专项资金" clearable filterable> <el-select v-model="formData.isSpecialFund" placeholder="请选择是否专项资金" clearable filterable @change="changeRequirementData">
<el-option :value="true" label="是"></el-option> <el-option :value="true" label="是"></el-option>
<el-option :value="false" label="否"></el-option> <el-option :value="false" label="否"></el-option>
</el-select> </el-select>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="8"> <el-col :span="6">
<el-form-item label="专项资金名称" prop="specialFundId" v-if="formData.isSpecialFund"> <el-form-item label="专项资金名称" prop="specialFundId" v-if="formData.isSpecialFund">
<el-select v-model="formData.specialFundId" placeholder="请选择专项资金名称" clearable filterable> <el-select v-model="formData.specialFundId" placeholder="请选择专项资金名称" clearable filterable @change="changeRequirementData">
<el-option <el-option
v-for="item in specialFundOption" v-for="item in specialFundOption"
:key="item.value" :key="item.value"
@@ -53,63 +55,81 @@
</el-select> </el-select>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="24" style="margin-bottom: -25px"> <el-col :span="6" v-if="formData.isSpecialFund">
<el-form-item label="征集公司" prop="companyIds" class="tree-select" label-width="96"> <!-- <el-form-item>-->
<a @click="addSpecialFund" style="width: 116px;text-align: right;display: inline-block">新增专项资金</a>
<!-- </el-form-item>-->
</el-col>
<el-col :span="24">
<el-form-item label="征集公司" :required="true" prop="" class="company-select">
<div style="width: 100%"> <div style="width: 100%">
<el-button color="#DED0B2" @click="showCompany">{{ selectedCompanyList.length === 0 ? '请选择征集公司' : '更改' }} <el-button color="#DED0B2" @click="showCompany">{{ selectedCompanyList.length === 0 ? '请选择征集公司' : '更改' }}
</el-button> </el-button>
</div> </div>
<div v-if="route.query.id" :class="showExpendClass(showMoreCompany)">{{ <div :class="showExpendClass(showMoreCompany)">{{ getName(selectedCompanyList) }}</div>
getName(selectedCompanyList)
}}
</div>
<div v-else :class="showExpendClass(showMoreCompany)">{{ getName(selectedCompanyList) }}</div>
<div style="color: #2a99ff;text-align: center;width: 100%;font-size: 15px;cursor: pointer" <div style="color: #2a99ff;text-align: center;width: 100%;font-size: 15px;cursor: pointer"
@click="handleExpend"> @click="handleExpend">
{{ showExpendText }} {{ showExpendText }}
</div> </div>
</el-form-item> </el-form-item>
</el-col> </el-col>
</el-row> <el-col :span="24" style="margin-bottom: -18px">
</el-form> <el-form-item label="征集说明" prop="" required>
<baseTitle title="征集说明"></baseTitle>
<el-input <el-input
v-model="formData.collectExplain" v-model="formData.collectExplain"
style="width:100%" style="width:100%;margin-right: 50px"
:rows="5" :rows="5"
type="textarea" type="textarea"
placeholder="请输入征集说明" placeholder="请输入征集说明" @change="changeRequirementData"
/> />
<div style="display: flex;align-items: center"> </el-form-item>
<baseTitle title="申请文件" style="margin-right: 10px"></baseTitle> </el-col>
</el-row>
</el-form>
<baseTitle title="附件文件" style="margin-right: 10px"></baseTitle>
<file-upload v-if="checkFormPrem('fileList')" @getFile="getFile"/> <file-upload v-if="checkFormPrem('fileList')" @getFile="getFile"/>
</div> <div style="margin-right: 50px">
<fvTable style="width: 100%;max-height: 162px;" height="162" v-if="showTable" <fvTable style="width: 100%;max-height: 160px;" height="160" v-if="showTable"
:tableConfig="tableConfig" :data="formData.fileList" :tableConfig="tableConfig" :data="formData.fileList"
:isSettingCol="false" :pagination="false" perm="EDIT"> :isSettingCol="false" :pagination="false" perm="EDIT">
<template #empty> <template #empty>
<el-empty :image-size="55" description="暂无数据" style="padding: 0"/> <el-empty :image-size="55" description="暂无数据" style="padding: 0"/>
</template> </template>
</fvTable> </fvTable>
</div>
<div class="approval-record"> <div class="approval-record">
<div style="display: flex;align-items: center;justify-content: flex-start;"> <div class="approval-title">
<baseTitle title="审批记录"></baseTitle>
<div class="diagram">
<div class="base-title">流程图</div> <div class="base-title">流程图</div>
<el-switch <el-switch
v-model="changeDiagram" v-model="changeDiagram"
style="--el-switch-on-color:#BEA266 ; --el-switch-off-color:#cecdcd;margin-left: 10px" style="--el-switch-on-color:#BEA266; --el-switch-off-color:#cecdcd;"
/> />
</div> </div>
</div>
<el-empty :image-size="100" description="暂无审批记录"
v-if="processDiagramViewer&& !opentionData?.operationList&&!changeDiagram"/>
<!-- <process-diagram-viewer mode="view" v-if="processDiagramViewer&&changeDiagram"/>-->
<div class="process">
<operation-render
v-if="processDiagramViewer&& opentionData?.operationList && opentionData?.operationList.length > 0&&!changeDiagram"
:operation-list="opentionData?.operationList"
:state="opentionData.state"/>
<process-diagram-viewer mode="view" v-if="processDiagramViewer&&changeDiagram"/> <process-diagram-viewer mode="view" v-if="processDiagramViewer&&changeDiagram"/>
</div> </div>
</div>
<div style="width: 100%;height: 30px"></div> <div style="width: 100%;height: 30px"></div>
<div class="oper-page-btn"> <div class="oper-page-btn">
<el-button color="#DED0B2" v-if="routerName==='Requirement/add'" @click="handleSubmit(demandForm)">提交</el-button> <el-button color="#DED0B2" v-if="routerName==='Requirement/add'" @click="handleSubmit(demandForm)">提交</el-button>
<el-button color="#DED0B2" v-else @click="handleResubmit">重新提交</el-button> <el-button color="#DED0B2" v-else @click="handleResubmit(demandForm)">重新提交</el-button>
<el-button @click="handleBack">返回</el-button> <el-button @click="handleBack">返回</el-button>
</div> </div>
<company-picker :multiple="true" ref="companyRef" title="请选择征集公司" @ok="sureSelectedCompany" @cancelOrClear="cancelSelectedCompany"
<company-picker :multiple="true" ref="companyRef" title="请选择征集公司" @ok="selected"
v-model:value="selectedCompanyList"/> v-model:value="selectedCompanyList"/>
<file-preview ref="filePreviewRef" v-if="filePreviewShow" :fileName="filePreviewParam.fileName"
:fileUrl="filePreviewParam.fileUrl"
:fileType="filePreviewParam.fileType"/>
</div> </div>
</template> </template>
@@ -119,24 +139,30 @@ import {useProcessStore} from '@/stores/processStore.js';
import { import {
getWorkflowInfo, getWorkflowInfo,
addRequirement, addRequirement,
getFormInfo, getInfo,
resubmit, resubmit,
deleteFile, deleteFile,
downloadFile downloadFile
} from "@/api/project-demand/index.js"; } from "@/api/project-demand/index.js";
import FileUpload from "@/components/FileUpload.vue"; import FileUpload from "@/components/FileUpload.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 {ElNotification} from "element-plus"; import {ElNotification} from "element-plus";
import {useRoute, useRouter} from 'vue-router'
import {getSubCompOpt} from '@/api/user/user.js' import {getSubCompOpt} from '@/api/user/user.js'
import {useTagsView} from '@/stores/tagsview.js' import {useTagsView} from '@/stores/tagsview.js'
import {getFundOption} from "@/api/special-fund"; import {getFundOption} from "@/api/special-fund";
import CompanyPicker from "@/components/DetailComponent/CompanyPicker.vue"; import CompanyPicker from "@/components/DetailComponent/CompanyPicker.vue";
import {useCacheStore} from '@/stores/cache.js' import {useCacheStore} from '@/stores/cache.js'
const filePreviewParam = ref({
fileUrl: '',
fileName: '',
fileType: 'pdf'
})
const filePreviewShow = ref(false)
const cacheStore = useCacheStore() const cacheStore = useCacheStore()
const companyRef = ref() const companyRef = ref()
const opentionData = ref({})
const showExpendText = ref('') const showExpendText = ref('')
const showMoreCompany = ref(false) const showMoreCompany = ref(false)
const selectedCompanyList = ref([]) const selectedCompanyList = ref([])
@@ -170,11 +196,11 @@ const processInstanceData = ref()
const formPermMap = ref(new Map()); const formPermMap = ref(new Map());
const companyNameArray = ref([]) const companyNameArray = ref([])
const rules = reactive({ const rules = reactive({
requirementName: [{required: true, message: '请输入征集名称', trigger: 'blur'}], requirementName: [{required: true, message: '请输入征集名称', trigger: ['blur', 'change']}],
companyIds: [{required: true, message: '请选择征集公司', trigger: 'blur'}], isSpecialFund: [{required: true, message: '请选择是否专项资金', trigger: ['blur', 'change']}],
collectType: [{required: true, message: '请选择征集类型', trigger: 'blur'}], collectType: [{required: true, message: '请选择征集类型', trigger: ['blur', 'change']}],
deadline: [{required: true, message: '请选择截止时间', trigger: 'blur'}], deadline: [{required: true, message: '请选择需求上报截止时间', trigger: ['blur', 'change']}],
specialFundId: [{required: true, message: '请选择专项资金名称', trigger: 'blur'}], specialFundId: [{required: true, message: '请选择专项资金名称', trigger: ['blur', 'change']}],
}) })
const tableConfig = reactive({ const tableConfig = reactive({
@@ -190,11 +216,16 @@ const tableConfig = reactive({
prop: 'originalFileName', prop: 'originalFileName',
label: '文件名', label: '文件名',
align: 'center', align: 'center',
showOverflowTooltip: false,
currentRender: ({row, index}) => (
<div style="color: #2a99ff;cursor: pointer;" onClick={() => clickToPreview(row)}>{row.originalFileName}</div>)
}, },
{ {
prop: 'tag', prop: 'tag',
label: '标签', label: '标签',
align: 'center' align: 'center',
// currentRender: ({row, index}) => (
// <el-input placeholder={row.tag} onClick={() => {}}></el-input>)
}, },
{ {
prop: 'size', prop: 'size',
@@ -212,7 +243,6 @@ const tableConfig = reactive({
<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'} <popover-delete name={row.originalFileName} type={'文件'} btnType={'danger'}
perm={['mosr:requirement:del']}
onDelete={() => handleDelete(row)}/> onDelete={() => handleDelete(row)}/>
</div> </div>
) )
@@ -220,6 +250,40 @@ const tableConfig = reactive({
} }
] ]
}) })
if(routerName.value === 'Requirement/add'){
if(localStorage.getItem('requirementData')){
let demandDate=JSON.parse(localStorage.getItem('requirementData'))
formData.value=demandDate
}
if(localStorage.getItem('originallyCompanySelectedList')){
let companyDate=JSON.parse(localStorage.getItem('originallyCompanySelectedList'))
selectedCompanyList.value=companyDate
}
}
const changeRequirementData=()=>{
if(routerName.value === 'Requirement/add') {
localStorage.setItem('requirementData', JSON.stringify(formData.value))
}
}
const addSpecialFund=()=>{
router.push({
name: 'Fund/add',
query: {}
})
}
const clickToPreview = (row) => {
filePreviewShow.value = false
filePreviewParam.value = {
fileUrl: row.url,
fileName: row.originalFileName,
fileType: row.fileType
}
nextTick(() => {
filePreviewShow.value = true
})
// filePreviewRef.value.show()
}
const disabledDate = (time) => { const disabledDate = (time) => {
return time.getTime() < Date.now() - 8.64e7//不能选择之后的数据 return time.getTime() < Date.now() - 8.64e7//不能选择之后的数据
} }
@@ -247,13 +311,22 @@ const getName = (list) => {
const showCompany = () => { const showCompany = () => {
companyRef.value.show() companyRef.value.show()
} }
const cancelSelectedCompany=(select)=>{
const selected = (select) => { formData.value.companyIds = []
formData.value.companyIds=[] if(select.length>0){
for (let val of select) {
formData.value.companyIds.push(val.value)
}
}
selectedCompanyList.value = select
}
const sureSelectedCompany = (select) => {
formData.value.companyIds = []
for (let val of select) { for (let val of select) {
formData.value.companyIds.push(val.value) formData.value.companyIds.push(val.value)
} }
selectedCompanyList.value = select selectedCompanyList.value = select
changeRequirementData()
} }
const checkFormPrem = (formKey) => { const checkFormPrem = (formKey) => {
if (formPermMap.value.hasOwnProperty(formKey)) { if (formPermMap.value.hasOwnProperty(formKey)) {
@@ -308,6 +381,7 @@ const getFile = (val) => {
showTable.value = false showTable.value = false
let fileObj = compositeParam(val) let fileObj = compositeParam(val)
formData.value.fileList.push(fileObj) formData.value.fileList.push(fileObj)
changeRequirementData()
nextTick(() => { nextTick(() => {
showTable.value = true showTable.value = true
}) })
@@ -344,14 +418,6 @@ const init = async () => {
}) })
} }
const submitParam = (item) => { const submitParam = (item) => {
if (item.companyIds.length === 0) {
ElNotification({
title: '提示',
message: '请选择征集公司',
type: 'error'
})
return;
}
let files = [] let files = []
item.fileList.forEach(item => { item.fileList.forEach(item => {
let obj = { let obj = {
@@ -385,6 +451,14 @@ const handleSubmit = async (instance) => {
}) })
return; return;
} }
if (formData.value.companyIds?.length === 0) {
ElNotification({
title: '提示',
message: '请选择征集公司',
type: 'error'
})
return;
}
const {msg, code} = await addRequirement(submitParam(formData.value)) const {msg, code} = await addRequirement(submitParam(formData.value))
ElNotification({ ElNotification({
title: '提示', title: '提示',
@@ -396,10 +470,30 @@ const handleSubmit = async (instance) => {
await router.push({ await router.push({
name: 'Requirement' name: 'Requirement'
}) })
localStorage.removeItem('originallyCompanySelectedList')
localStorage.removeItem('requirementData')
} }
}) })
} }
const handleResubmit = () => { const handleResubmit = (instance) => {
if (!instance) return
instance.validate(async (valid) => {
if (!valid) {
ElNotification({
title: '提示',
message: '请完善数据,再提交!',
type: 'error'
})
return;
}
if (formData.value.companyIds.length === 0) {
ElNotification({
title: '提示',
message: '请选择征集公司',
type: 'error'
})
return;
}
resubmit(submitParam(formData.value)).then(res => { resubmit(submitParam(formData.value)).then(res => {
ElNotification({ ElNotification({
title: '提示', title: '提示',
@@ -411,21 +505,24 @@ const handleResubmit = () => {
router.push({ router.push({
name: 'Requirement' name: 'Requirement'
}) })
// localStorage.removeItem('originallyCompanySelectedList')
// localStorage.removeItem('requirementData')
} }
}) })
})
} }
const matterTree = (array,data, id) => { const matterTree = (array, data, id) => {
if (id) { if (id) {
data.forEach(item => { data.forEach(item => {
if (item.value == id) { if (item.value == id) {
let obj={ let obj = {
label:item.label, label: item.label,
value:item.value value: item.value
} }
array.push(obj); array.push(obj);
} }
if (item.children && item.children.length > 0) { if (item.children && item.children.length > 0) {
matterTree(array,item.children,id) matterTree(array, item.children, id)
} }
}) })
return array; return array;
@@ -440,11 +537,21 @@ const getCompanyOptionItem = (val) => {
return companyNameArray.value; return companyNameArray.value;
} }
const getDetailInfo = async () => { const getDetailInfo = async () => {
getFormInfo(route.query.id).then(res => { getInfo(route.query.id).then(res => {
if (res.code === 1000) { if (res.code === 1000) {
selectedCompanyList.value = getCompanyOptionItem(res.data.companyIds) if (res.data.formData.companyIds[0] == -1) {
formData.value = res.data selectedCompanyList.value = [
if (res.data.fileList.length !== 0) { {
value: -1,
label: '所有公司'
}
]
} else {
selectedCompanyList.value = getCompanyOptionItem(res.data.formData.companyIds)
}
formData.value = res.data.formData
opentionData.value = res.data
if (res.data.formData.fileList.length !== 0) {
showTable.value = false showTable.value = false
nextTick(() => { nextTick(() => {
showTable.value = true showTable.value = true
@@ -464,17 +571,18 @@ const handleBack = () => {
history.back() history.back()
} }
const handleDelete = (row) => { const handleDelete = (row) => {
deleteFile(row.fileId).then(res => { // deleteFile(row.fileId).then(res => {
ElNotification({ // ElNotification({
title: '提示', // title: '提示',
message: res.msg, // message: res.msg,
type: res.code === 1000 ? 'success' : 'error' // type: res.code === 1000 ? 'success' : 'error'
}) // })
if (res.code === 1000) { // if (res.code === 1000) {
formData.value.fileList.splice(formData.value.fileList.findIndex((item) => item.fileId === row.fileId), 1); formData.value.fileList.splice(formData.value.fileList.findIndex((item) => item.fileId === row.fileId), 1);
// showTable.value = formData.value.fileList.length !== 0; // showTable.value = formData.value.fileList.length !== 0;
} changeRequirementData()
}); // }
// });
} }
onMounted(async () => { onMounted(async () => {
@@ -492,7 +600,7 @@ onMounted(async () => {
margin-top: 0; margin-top: 0;
} }
.tree-select { .company-select {
:deep(.el-form-item__content .el-select__wrapper ) { :deep(.el-form-item__content .el-select__wrapper ) {
width: 750px; width: 750px;
} }
@@ -523,6 +631,7 @@ onMounted(async () => {
//justify-content: space-between; //justify-content: space-between;
overflow-x: hidden; overflow-x: hidden;
overflow-y: auto; overflow-y: auto;
padding: 0 0 0 30px;
a { a {
cursor: pointer; cursor: pointer;
@@ -534,4 +643,20 @@ onMounted(async () => {
position: relative; position: relative;
} }
} }
:deep(.el-table__header) {
.is-leaf:first-child {
.cell {
margin-left: -20px !important;
}
}
}
:deep(.el-table__body) {
.el-table__cell:first-child {
.cell {
margin-left: -10px !important;
}
}
}
</style> </style>

View File

@@ -1,12 +1,12 @@
<template> <template>
<baseTitle title="需求征集详情"></baseTitle> <baseTitle title="需求征集信息" style="margin-left: 30px"></baseTitle>
<collection-detail :formData="collectData.formData" :data="collectData" type="singleDetail" <collection-detail :formData="collectData.formData" :data="collectData" type="singleDetail"
:fileListShow="fileListShow" :fileListShow="fileListShow"
:processViewer="processViewer" :loading="loading" v-model:value="auditOpinion"/> :processViewer="processViewer" :loading="loading" v-model:value="auditOpinion"/>
<div class="oper-page-btn" v-if="collectData.formData?.report"> <div class="oper-page-btn" v-if="collectData.formData?.report">
<el-button color="#DED0B2" @click="handleDemandReport">需求上报</el-button> <el-button color="#DED0B2" @click="handleDemandReport">需求上报</el-button>
</div> </div>
<opinion v-if="collectData.taskId" :formData="formData" :taskId="collectData.taskId" <opinion v-if="collectData.taskId" :formData="formData" :taskId="collectData.taskId" :taskUserOptionList="collectData.taskUserOptionList"
v-model:value="auditOpinion"></opinion> v-model:value="auditOpinion"></opinion>
</template> </template>
@@ -117,7 +117,7 @@ onMounted(async () => {
} }
:deep(.el-table--fit ) { :deep(.el-table--fit ) {
height: 300px !important; height: 160px !important;
} }
.detail-block { .detail-block {

View File

@@ -1,44 +1,6 @@
<template> <template>
<el-form ref="formRef" :model="selectForm" class="search-form" :rules="rules" style="margin-top: 18px;"> <fvSearchForm :searchConfig="searchConfig" @search="search" searchProp="state" style="margin-left: 16px"></fvSearchForm>
<el-row gutter="20">
<el-col :span="5">
<el-form-item prop="requirementName" label="征集名称">
<el-input v-model="selectForm.requirementName" placeholder="请输入征集名称" clearable/>
</el-form-item>
</el-col>
<el-col :span="5" :offset="1">
<el-form-item prop="collectType" label="征集类型">
<el-select v-model="selectForm.collectType" placeholder="请选择征集类型" clearable filterable>
<el-option
v-for="item in cacheStore.getDict('collect_type')"
:key="item.value"
:label="item.label"
:value="item.value"
/>
</el-select>
</el-form-item>
</el-col>
<el-col :span="5" :offset="1">
<el-form-item prop="state" label="状态">
<el-select v-model="selectForm.state" placeholder="请选择状态" clearable filterable>
<el-option
v-for="item in stateOption"
:key="item.value"
:label="item.label"
:value="item.value"
/>
</el-select>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item>
<el-button color="#DED0B2" @click="getList">搜索</el-button>
<el-button @click="handleReset">重置</el-button>
</el-form-item>
</el-col>
</el-row>
</el-form>
<!-- <fvSearchForm :searchConfig="searchConfig" @search="search"></fvSearchForm>-->
<fvTable ref="tableIns" :tableConfig="tableConfig" @headBtnClick="headBtnClick"> <fvTable ref="tableIns" :tableConfig="tableConfig" @headBtnClick="headBtnClick">
<template #empty> <template #empty>
@@ -50,53 +12,16 @@
<script setup lang="jsx"> <script setup lang="jsx">
import {useAuthStore} from '@/stores/userstore.js' import {useAuthStore} from '@/stores/userstore.js'
import Tag from '@/components/Tag.vue' import Tag from '@/components/Tag.vue'
import fvSelect from '@/fvcomponents/fvSelect/index.vue'
import {ElNotification} from "element-plus"; import {ElNotification} from "element-plus";
import {deleteDemand} from "@/api/project-demand";
import {useCacheStore} from '@/stores/cache.js' import {useCacheStore} from '@/stores/cache.js'
import {getRequirementStatePerm} from "@/api/project-demand"; import {getRequirementStatePerm,filterRequirementName,deleteDemand} from "@/api/project-demand";
import {getSubCompOpt} from "@/api/user/user";
import fvSelect from "@/fvcomponents/fvSelect/index.vue";
const cacheStore = useCacheStore() const cacheStore = useCacheStore()
const authStore = useAuthStore() const authStore = useAuthStore()
const router = useRouter() const router = useRouter()
const searchConfig = reactive([
{
label: '征集名称',
prop: 'requirementName',
component: 'el-input',
props: {
placeholder: '请输入征集名称查询',
clearable: true,
filterable: true,
checkStrictly: true
}
},
{
label: '征集类型',
prop: 'collectType',
component: shallowRef(fvSelect),
props: {
placeholder: '请选择征集类型',
clearable: true,
filterable: true,
cacheKey: 'collect_type'
}
},
{
label: '状态',
prop: 'state',
component: shallowRef(fvSelect),
props: {
placeholder: '请选择状态',
clearable: true,
cacheKey: 'demand_collection'
}
},
])
const selectForm = ref({})
const tableIns = ref() const tableIns = ref()
const formRef = ref()
const stateOption = ref([])
const userInfo = ref(authStore.userinfo) const userInfo = ref(authStore.userinfo)
const auths = { const auths = {
edit: ['mosr:requirement:resubmit'], edit: ['mosr:requirement:resubmit'],
@@ -111,43 +36,58 @@ const tableConfig = reactive({
// type: 'selection', // type: 'selection',
// prop: 'selection' // prop: 'selection'
// }, // },
{
prop: 'index',
type: 'index',
label: '序号',
align: 'center',
width: 85,
index: index => {
return (tableIns.value.getQuery().pageNum - 1) * tableIns.value.getQuery().pageSize + index + 1
}
},
{ {
prop: 'requirementName', prop: 'requirementName',
label: '征集名称', label: '征集名称',
align: 'center' align: 'center',
}, },
{ {
prop: 'collectType', prop: 'collectType',
label: '征集类型', label: '征集类型',
align: 'center' align: 'center',
// width: 200
}, },
{ {
prop: 'companyName', prop: 'companyName',
label: '征集公司', label: '征集公司',
align: 'center', align: 'center',
// currentRender: ({row, index}) => ( // width: 200
// <div style={{width: '300px', textOverflow: 'ellipsis',textAlign:'center'}}>{row.companyName}</div>) },
{
prop: 'deadline',
label: '需求上报截止时间',
align: 'center',
width: 150,
}, },
{ {
prop: 'approveName', prop: 'approveName',
label: '审批人', label: '当前审批节点',
align: 'center' align: 'center',
}, width: 120,
{ currentRender: ({row, index}) => {
prop: 'deadline', if (row.state == '1') {
label: '截止时间', return <span>{row.approveName}</span>
align: 'center' } else {
}, return <span>{row.taskNode}</span>
{ }
prop: 'taskNode', }
label: '当前节点',
align: 'center'
}, },
{ {
prop: 'state', prop: 'state',
label: '状态', label: '状态',
align: 'center', align: 'center',
width: 200, width: 120,
showOverflowTooltip: false, showOverflowTooltip: false,
currentRender: ({row, index}) => (<Tag dictType={'demand_collection'} value={row.state}/>) currentRender: ({row, index}) => (<Tag dictType={'demand_collection'} value={row.state}/>)
}, },
@@ -155,7 +95,7 @@ const tableConfig = reactive({
prop: 'oper', prop: 'oper',
label: '操作', label: '操作',
align: 'center', align: 'center',
fixed: 'right', width: 150,
showOverflowTooltip: false, showOverflowTooltip: false,
currentRender: ({row, index}) => { currentRender: ({row, index}) => {
let btn = [] let btn = []
@@ -201,21 +141,86 @@ const tableConfig = reactive({
], ],
params: {} params: {}
}) })
const getStatePerm = () => {
getRequirementStatePerm().then(res => {
stateOption.value=res.data const searchConfig = ref([
{
label: '征集名称',
prop: 'requirementName',
component: shallowRef(fvSelect),
props: {
placeholder: '请输入征集名称查询',
clearable: true,
filterable: true,
options: [],
remote: true,
remoteMethod:async (val)=>{
if(val){
const res=await filterRequirementName(val)
if(res.code==1000){
let optionObj={}
let options=[]
res.data.forEach(item=>{
optionObj={
value:item,
label:item
}
options.push(optionObj)
}) })
searchConfig.value.find(item => item.prop == 'requirementName').props.options = options
}
}
}
}
},
{
label: '征集类型',
prop: 'collectType',
component: shallowRef(fvSelect),
props: {
placeholder: '请选择征集类型',
cacheKey: 'collect_type',
clearable: true,
filterable: true,
remote: true
}
},
{
label: '征集公司',
prop: 'affiliatedCompanyId',
component: 'el-tree-select',
props: {
placeholder: '请输入征集公司查询',
clearable: true,
data: [],
filterable: true,
checkStrictly: true,
remote: true
}
},
{
label: '状态',
prop: 'state',
component: shallowRef(fvSelect),
props: {
placeholder: '请选择状态',
clearable: true,
filterable: true,
options: [],
remote: true,
}
},
])
const init = async () => {
const res = await getSubCompOpt()
searchConfig.value.find(item=>item.prop == 'affiliatedCompanyId').props.data = res.data
const res1 = await getRequirementStatePerm()
searchConfig.value.find(item=>item.prop == 'state').props.options = res1.data
} }
getStatePerm()
//重置功能 init()
const handleReset = () => {
formRef.value.resetFields()
getList()
}
const getList = () => {
tableConfig.params = {...selectForm.value}
tableIns.value.refresh()
}
const search = (val) => { const search = (val) => {
tableConfig.params = {...val} tableConfig.params = {...val}
tableIns.value.refresh() tableIns.value.refresh()
@@ -273,3 +278,44 @@ const headBtnClick = (key) => {
} }
} }
</script> </script>
<style lang="scss">
.select-form {
.el-select {
.el-select__wrapper {
.el-select__suffix::before {
content: "";
width: 6px;
height: 6px;
border: solid #a8abb2;
border-width: 0 0 1px 1px;
transform: translate(-50%, -50%) rotate(-45deg);
}
}
.is-focused {
.el-select__suffix::before {
margin-top: 10px;
transform: translate(-50%, -50%) rotate(-225deg) !important;
}
}
}
}
</style>
<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;
}
}
}
</style>

View File

@@ -1,193 +0,0 @@
<template>
<div v-loading="loading">
<el-form :model="formData" label-width="auto">
<el-row>
<el-col :span="24" v-if="type==='singleDetail'">
<el-form-item label="征集名称">
<span>{{ formData.requirementName }}</span>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="征集类型">
<span>{{ formData.collectType }}</span>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="需求上报截止时间">
<span>{{ formData.deadline }}</span>
</el-form-item>
</el-col>
<el-col :span="24" v-if="formData.isSpecialFund">
<el-form-item label="专项资金名称">
<span>{{ formData.specialFund }}</span>
</el-form-item>
</el-col>
<el-col :span="24" v-if="type==='singleDetail'">
<el-form-item label="征集公司">
<span :class="showExpendClass(showMoreCompany,formData.companyIds)">{{
getCompanyName(formData.companyIds)
}}</span>
<div style="color: #2a99ff;text-align: center;width: 100%;font-size: 15px;cursor: pointer"
@click="handleExpend">{{ showExpendText }}
</div>
</el-form-item>
</el-col>
<el-col :span="24">
<baseTitle title="征集说明"></baseTitle>
<el-form-item>
<el-card style="width: 100%">
<div v-html="formData.collectExplain">
</div>
</el-card>
</el-form-item>
</el-col>
<baseTitle v-if="fileListShow === 'READ' || fileListShow === 'EDIT'" title="附件列表"></baseTitle>
<el-col :span="24">
<file-component title="" tag="需求征集"
v-model:value="formData.fileList" :processViewer="processViewer"
:file-list-show="fileListShow"/>
</el-col>
<el-col :span="24">
<div v-if="data.taskId">
<baseTitle title="审核意见"></baseTitle>
<el-form-item prop="_value">
<el-input
v-model="_value"
:rows="3"
type="textarea"
placeholder="请输入审核意见"
/>
</el-form-item>
</div>
</el-col>
</el-row>
<div class="approval-record">
<div class="approval-title">
<baseTitle title="审批记录"></baseTitle>
<div class="diagram">
<div class="base-title">流程图</div>
<el-switch
v-model="changeDiagram"
style="--el-switch-on-color:#BEA266; --el-switch-off-color:#cecdcd"
/>
</div>
</div>
<div class="process">
<operation-render v-if="processViewer && data.operationList && data.operationList.length > 0&&!changeDiagram"
:operation-list="data.operationList" :isColumn="true"
:state="data.state"/>
<process-diagram-viewer v-if="processViewer&&changeDiagram" id-name="collectionProcess"/>
</div>
</div>
</el-form>
</div>
</template>
<script setup lang="jsx">
import OperationRender from '@/views/workflow/common/OperationRender.vue'
import ProcessDiagramViewer from '@/views/workflow/common/ProcessDiagramViewer.vue'
import {downloadFile} from "@/api/project-demand";
const emit = defineEmits(['update:value'])
const showExpendText = ref('')
const showMoreCompany = ref(false)
const props = defineProps({
formData: {
type: Array,
default: []
},
data: {
type: Array,
default: []
},
processViewer: {
type: Boolean,
default: false
},
companyOption: {
type: Array,
default: []
},
loading: {
type: Boolean,
default: false
},
fileListShow: {
type: String,
default: ''
},
type: {
type: String,
default: ''
},
value: {
type: String,
default: ''
}
})
const changeDiagram = ref(false)
const _value = computed({
get() {
return props.value;
},
set(val) {
emit("update:value", val);
}
})
const getCompanyName = (data) => {
if (data) {
return data.join('')
}
}
const handleExpend = () => {
showMoreCompany.value = !showMoreCompany.value;
showExpendClass(showMoreCompany.value, props.formData.companyIds)
}
const showExpendClass = (showMoreCompany, data) => {
if (!showMoreCompany) {
if (data && data.length > 14) {
showExpendText.value = '展开'
return 'company-style'
}
} else {
showExpendText.value = '收缩'
return ''
}
}
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()
})
}
watch(() => props.loading, (newVal) => {
props.loading = newVal
}, {deep: true})
watch(() => props.processViewer, (newVal) => {
props.processViewer = newVal
}, {deep: true})
</script>
<style scoped lang="scss">
:deep(.el-empty__description) {
margin-top: 0;
}
.company-style {
//width: 98%;
min-height: 30px;
max-height: 60px;
overflow: hidden;
text-overflow: ellipsis;
-webkit-line-clamp: 2;
display: -webkit-box;
-webkit-box-orient: vertical;
}
</style>

View File

@@ -1,168 +0,0 @@
<template>
<!-- <baseTitle title="审核意见"></baseTitle>-->
<!-- <fvForm :schema="schema" @getInstance="(e)=>form = e"></fvForm>-->
<div class="oper-page-btn">
<el-button type="danger" @click="handleReject">驳回</el-button>
<el-button color="#DED0B2" @click="handleAgree">同意</el-button>
</div>
</template>
<script setup lang="jsx">
import {ElNotification} from 'element-plus';
import {agreeTask, rejectTask} from "@/api/project-demand/index.js";
import {useTagsView} from '@/stores/tagsview.js'
const tagsViewStore = useTagsView()
const route = useRoute()
const router = useRouter()
const props = defineProps({
taskId: {
type: String,
default: ''
},
formData: {
type: Object,
default: {}
},
value: {
type: String,
default: ''
}
})
const form = ref()
const schema = computed(() => {
return [
{
label: '',
prop: 'auditOpinion',
component: 'el-input',
colProps: {
span: 24
},
props: {
placeholder: '请输入审核意见',
type: 'textarea',
rows: 3
}
}
]
})
const _value = computed({
get() {
return props.value;
},
set(val) {
emit("update:value", val);
}
})
const back = () => {
switch (route.name) {
case 'Initiation/detail':
router.push({name: 'Initiation'})
break;
case 'Filing/detail':
router.push({name: 'Filing'})
break;
case 'Implementation/detail':
if (route.query.source === 'home') {
router.push('/home')
} else {
if (route.query.step === '10') {
router.push({name: 'Summary'})
} else if (route.query.step === '20') {
router.push({name: 'Initiation'})
} else if (route.query.step === '40') {
router.push({name: 'Implementation'})
} else if (route.query.step === '50') {
router.push({name: 'Filing'})
} else if (route.query.step === '00') {
router.push({name: 'Requirement'})
}
}
break;
case 'Summary/detail':
if (route.query.source === 'home') {
router.push('/home')
} else {
router.push({name: 'Summary'})
}
break;
case 'Requirement/detail':
if (route.query.source === 'home') {
router.push('/home')
} else {
router.push({name: 'Requirement'})
}
break;
case 'Fund/detail':
if (route.query.source === 'home') {
router.push('/home')
} else {
router.push({name: 'Fund'})
}
break;
case 'Share/detail':
if (route.query.source === 'home') {
router.push('/home')
} else {
router.push({name: 'Expense/share'})
}
break;
case 'Phase/detail':
if (route.query.source === 'home') {
router.push('/home')
} else {
router.push({name: 'Implementation'})
}
break;
}
}
// 驳回
const handleReject = async () => {
// const values = form.value.getValues()
if (!_value.value) {
ElNotification({
title: '提示',
message: '请填写审核意见',
type: 'warning'
})
return
}
const params = {
taskId: props.taskId,
// ...values
auditOpinion: _value.value
}
// console.log('params', params)
const res = await rejectTask(params)
ElNotification({
title: '提示',
message: res.msg,
type: res.code === 1000 ? 'success' : 'error'
})
tagsViewStore.delVisitedViews(router.currentRoute.value.path)
back()
}
const handleAgree = async () => {
// const values = form.value.getValues()
const params = {
taskId: props.taskId,
formData: props.formData,
auditOpinion: _value.value
}
const res = await agreeTask(params)
ElNotification({
title: '提示',
message: res.msg,
type: res.code === 1000 ? 'success' : 'error'
})
tagsViewStore.delVisitedViews(router.currentRoute.value.path)
back()
}
</script>
<style lang="scss" scoped>
</style>

Some files were not shown because too many files have changed in this diff Show More