1109 Commits

Author SHA1 Message Date
zhangkaihuai
4371ccb5e7 更新 .drone.yml 2025-06-14 15:25:22 +00:00
zhangkaihuai
f9ef5c7087 更新 .drone.yml 2025-06-14 15:20:57 +00:00
zhangkaihuai
f42eacd06e 更新 .drone.yml 2025-06-14 14:56:50 +00:00
861a6489c7 Merge pull request 'test : ci/cd' (#1080) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/1080
2025-06-14 11:26:25 +00:00
dj
9133f7a7e3 test : ci/cd 2025-06-14 19:26:13 +08:00
e9be87990c Merge pull request '3' (#1079) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/1079
2025-06-14 11:10:24 +00:00
dj
ec8db3c199 test : ci/cd 2025-06-14 19:09:36 +08:00
d2520336cb Merge pull request 'test : ci/cd' (#1078) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/1078
2025-06-14 10:59:38 +00:00
dj
e97db1a70d test : ci/cd 2025-06-14 18:59:25 +08:00
afd27e38b5 Merge pull request 'test : ci/cd' (#1077) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/1077
2025-06-14 10:50:02 +00:00
dj
7dd5120133 test : ci/cd 2025-06-14 18:49:22 +08:00
75da0633e5 Merge pull request 'test : ci/cd' (#1076) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/1076
2025-06-14 10:43:23 +00:00
dj
41b498066f test : ci/cd 2025-06-14 18:43:10 +08:00
c852448089 Merge pull request 'test : ci/cd' (#1075) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/1075
2025-06-14 10:40:34 +00:00
dj
9cd744d44e test : ci/cd 2025-06-14 18:40:23 +08:00
a7917137c9 Merge pull request 'test : ci/cd' (#1074) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/1074
2025-06-14 10:30:29 +00:00
dj
85346fa343 test : ci/cd 2025-06-14 18:30:04 +08:00
e5b205870d Merge pull request 'test : ci/cd' (#1073) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/1073
2025-06-14 10:26:12 +00:00
dj
5ae66763e1 test : ci/cd 2025-06-14 18:26:02 +08:00
9221d27960 Merge pull request 'test : ci/cd' (#1072) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/1072
2025-06-14 10:23:34 +00:00
dj
c442b9b2fd test : ci/cd 2025-06-14 18:23:25 +08:00
25c94284ca Merge pull request 'test : ci/cd' (#1071) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/1071
2025-06-14 10:18:34 +00:00
dj
5da74960f2 test : ci/cd 2025-06-14 18:18:22 +08:00
cdcb76d009 Merge pull request 'test : ci/cd' (#1070) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/1070
2025-06-14 10:14:51 +00:00
dj
c87b5c57a6 test : ci/cd 2025-06-14 18:14:39 +08:00
fd0d70072b Merge pull request '4' (#1069) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/1069
2025-06-14 09:39:44 +00:00
dj
747f675cfc test : ci/cd 2025-06-14 17:39:30 +08:00
941b06ab8b Merge pull request 'test : ci/cd' (#1068) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/1068
2025-06-14 09:35:23 +00:00
dj
3e6f86abfd test : ci/cd 2025-06-14 17:35:12 +08:00
01ccc1ddcd Merge pull request '12' (#1067) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/1067
2025-06-14 08:56:34 +00:00
dj
b6ac47e88b test : ci/cd 2025-06-14 16:56:18 +08:00
707486c69d Merge pull request 'test : ci/cd' (#1066) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/1066
2025-06-14 08:50:34 +00:00
dj
2ef726b95b test : ci/cd 2025-06-14 16:50:17 +08:00
697af99240 Merge pull request 'test : ci/cd' (#1065) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/1065
2025-06-14 08:46:41 +00:00
dj
ee2f7a9162 test : ci/cd 2025-06-14 16:45:18 +08:00
476f6a794d Merge pull request 'test : ci/cd' (#1064) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/1064
2025-06-14 08:40:58 +00:00
dj
0c53ee8392 test : ci/cd 2025-06-14 16:40:48 +08:00
4c1e892d35 Merge pull request 'test : ci/cd' (#1063) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/1063
2025-06-14 08:37:07 +00:00
dj
ac6d7863da test : ci/cd 2025-06-14 16:36:56 +08:00
ea33ffb60a Merge pull request 'test : ci/cd' (#1062) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/1062
2025-06-14 08:31:16 +00:00
dj
a1ae39cbd7 test : ci/cd 2025-06-14 16:31:03 +08:00
0ada78f180 Merge pull request 'test : ci/cd' (#1061) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/1061
2025-06-14 08:29:25 +00:00
dj
60e29aca8d test : ci/cd 2025-06-14 16:29:03 +08:00
3db2901a03 Merge pull request 'test : ci/cd' (#1060) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/1060
2025-06-14 08:25:50 +00:00
dj
7428fe43d4 test : ci/cd 2025-06-14 16:25:38 +08:00
18592571a4 Merge pull request 'test : ci/cd' (#1059) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/1059
2025-06-14 07:44:49 +00:00
dj
4bb03409f4 test : ci/cd 2025-06-14 15:42:17 +08:00
7fec9c5735 Merge pull request 'test : ci/cd 2' (#1058) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/1058
2025-06-14 07:26:53 +00:00
dj
3d9f22d503 test : ci/cd 2 2025-06-14 15:26:40 +08:00
76c9a38718 Merge pull request 'test : ci/cd1' (#1057) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/1057
2025-06-14 07:21:25 +00:00
dj
af7d0ac580 test : ci/cd1 2025-06-14 15:21:14 +08:00
4888a7e077 Merge pull request 'test : ci/cd' (#1056) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/1056
2025-06-14 07:18:38 +00:00
dj
47a2f61036 test : ci/cd 2025-06-14 15:18:22 +08:00
f26e40df90 Merge pull request 'master' (#1055) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/1055
2025-06-14 07:13:11 +00:00
dj
07103258f7 test : ci/cd 2025-06-14 15:12:49 +08:00
dj
8fa0d72cc4 test : ci/cd 2025-06-14 15:09:17 +08:00
7684444e93 Merge pull request 'test : ci/cd' (#1054) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/1054
2025-06-14 07:05:25 +00:00
dj
81446971e5 test : ci/cd 2025-06-14 15:04:38 +08:00
5930a2c4b6 Merge pull request 'test : ci/cd' (#1053) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/1053
2025-06-14 06:57:14 +00:00
dj
052c0090e3 test : ci/cd 2025-06-14 14:56:46 +08:00
d24892141a Merge pull request 'test : ci/cd' (#1052) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/1052
2025-06-14 06:43:28 +00:00
dj
83dc28630b test : ci/cd 2025-06-14 14:43:10 +08:00
086fdb36e9 Merge pull request 'test : ci/cd' (#1051) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/1051
2025-06-14 06:35:32 +00:00
dj
ba4c4fccdd test : ci/cd 2025-06-14 14:35:18 +08:00
bc79cfc0bc Merge pull request 'test : ci/cd' (#1050) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/1050
2025-06-14 06:17:25 +00:00
dj
35d4d1b7ba test : ci/cd 2025-06-14 14:17:14 +08:00
71324efd0c Merge pull request 'test : 测试ci/cd-5' (#1049) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/1049
2025-06-13 10:23:30 +00:00
dj
781e7393e8 test : 测试ci/cd-5 2025-06-13 18:22:50 +08:00
1eea7a377c Merge pull request 'test : 测试ci/cd-4' (#1048) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/1048
2025-06-13 10:17:23 +00:00
dj
065eb6cfba test : 测试ci/cd-4 2025-06-13 18:17:01 +08:00
35a2f755a2 Merge pull request 'test : 测试ci/cd-3' (#1047) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/1047
2025-06-13 10:10:41 +00:00
dj
9bd9cda872 test : 测试ci/cd-3 2025-06-13 18:10:24 +08:00
dd6181880a Merge pull request 'test : 测试ci/cd-2' (#1046) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/1046
2025-06-13 09:59:51 +00:00
dj
cd2bfe8817 test : 测试ci/cd-2 2025-06-13 17:59:33 +08:00
8b6406c4e0 Merge pull request 'test : 测试ci/cd-1' (#1045) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/1045
2025-06-13 09:50:39 +00:00
dj
fa3171fecd test : 测试ci/cd-1 2025-06-13 17:50:21 +08:00
177ccee058 Merge pull request 'test : 测试ci/cd' (#1044) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/1044
2025-06-13 06:57:28 +00:00
dj
28de3667f5 test : 测试ci/cd 2025-06-13 14:57:15 +08:00
05a5385d87 Merge pull request 'test : 测试ci/cd' (#1043) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/1043
2025-06-13 06:39:59 +00:00
dj
529f482bc7 test : 测试ci/cd 2025-06-13 14:39:23 +08:00
20fb592584 Merge pull request 'test : 测试ci/cd' (#1042) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/1042
2025-06-13 06:23:55 +00:00
dj
bd35243cbd test : 测试ci/cd 2025-06-13 14:23:37 +08:00
d7ca84a4a0 Merge pull request 'master' (#1041) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/1041
2025-06-13 06:19:11 +00:00
6c7eddcf94 Merge pull request 'test : 测试ci/cd' (#1040) from dj into master
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/1040
2025-06-13 06:18:59 +00:00
3588257f61 revert 215f7c6bbf
revert feat(expense-management): 添加研发工时超过21.75天的提示功能

- 在保存分配明细时,增加对研发人员总工时的计算
- 如果总工时超过21.75天,系统将发出警告通知- 优化了控制台日志输出,便于调试和监控
2025-06-13 06:18:21 +00:00
6c47337318 Merge pull request 'revert 215f7c6bbf084b0bf6dbee1303a2539a3c21c3ad' (#1039) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/1039
2025-06-13 06:14:59 +00:00
bacd397294 revert 215f7c6bbf
revert feat(expense-management): 添加研发工时超过21.75天的提示功能

- 在保存分配明细时,增加对研发人员总工时的计算
- 如果总工时超过21.75天,系统将发出警告通知- 优化了控制台日志输出,便于调试和监控
2025-06-13 06:14:19 +00:00
dj
b3dbb24bb2 test : 测试ci/cd 2025-06-13 14:11:25 +08:00
9e194f5f04 Merge pull request 'test : 测试ci/cd' (#1038) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/1038
2025-06-12 07:29:49 +00:00
dj
f448ec47a3 test : 测试ci/cd 2025-06-12 15:26:52 +08:00
f633862434 Merge pull request 'test : 测试ci/cd' (#1037) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/1037
2025-06-12 07:19:39 +00:00
dj
a4674d497b test : 测试ci/cd 2025-06-12 15:18:29 +08:00
e8aee6f01c Merge pull request 'test : 测试ci/cd' (#1036) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/1036
2025-06-12 06:54:14 +00:00
dj
43e0f98509 test : 测试ci/cd 2025-06-12 14:53:52 +08:00
10b66cbf15 Merge pull request 'master' (#1035) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/1035
2025-06-12 06:07:46 +00:00
dj
560bea739c test : 测试cicd 2025-06-12 14:07:25 +08:00
dj
1ed6156117 build(deps): 删除 moment 依赖 2025-06-12 12:08:41 +08:00
4321b42003 Merge pull request 'build(deps): 添加 moment 依赖' (#1034) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/1034
2025-06-12 04:05:02 +00:00
dj
7f0f74c844 build(deps): 添加 moment 依赖 2025-06-12 12:04:11 +08:00
c1065cb084 Merge pull request 'refactor(components): 优化文件上传成功提示' (#1033) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/1033
2025-06-12 03:42:56 +00:00
dj
579cadd687 refactor(components): 优化文件上传成功提示 2025-06-12 11:42:09 +08:00
78f4135efb Merge pull request 'build: 调整 package.json' (#1032) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/1032
2025-06-12 03:29:12 +00:00
dj
1a120418f0 build: 调整 package.json 2025-06-12 11:28:25 +08:00
d3ae1c1205 Merge pull request 'build: 更新 Node.js 版本并调整 package.json 格式' (#1031) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/1031
2025-06-12 03:16:06 +00:00
dj
e49b6ef1a3 build: 更新 Node.js 版本并调整 package.json 格式 2025-06-12 11:15:52 +08:00
6fbf37ab78 Merge pull request 'fix(ProjectAttachment): 修改drone' (#1030) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/1030
2025-06-12 03:13:47 +00:00
dj
a0d9c58c77 fix(ProjectAttachment): 修改drone 2025-06-12 11:12:52 +08:00
b3900a2a1c Merge pull request 'fix(ProjectAttachment): 修改drone' (#1029) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/1029
2025-06-12 03:08:20 +00:00
dj
4bb0c49dc8 fix(ProjectAttachment): 修改drone 2025-06-12 11:08:03 +08:00
4f6c36a20a Merge pull request 'fix(ProjectAttachment): 修改drone' (#1028) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/1028
2025-06-12 02:17:12 +00:00
dj
aada3d785b fix(ProjectAttachment): 修改drone 2025-06-12 10:16:35 +08:00
fef4c57bd5 Merge pull request 'fix(ProjectAttachment): 添加依赖' (#1027) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/1027
2025-06-12 02:04:22 +00:00
dj
35b332f640 fix(ProjectAttachment): 添加依赖 2025-06-12 10:03:57 +08:00
31da00d7e3 Merge pull request 'fix(ProjectAttachment): 添加依赖' (#1026) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/1026
2025-06-12 01:36:07 +00:00
dj
6afac9be28 fix(ProjectAttachment): 添加依赖 2025-06-12 09:35:00 +08:00
b54289a0a5 Merge pull request 'fix(ProjectAttachment): 修改drone.yml' (#1025) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/1025
2025-06-12 01:28:38 +00:00
dj
dc064de364 fix(ProjectAttachment): 修改drone.yml 2025-06-12 09:28:02 +08:00
7f656447b2 Merge pull request 'fix(ProjectAttachment): 修改drone.yml' (#1024) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/1024
2025-06-12 01:25:35 +00:00
dj
78bafe0a7e fix(ProjectAttachment): 修改drone.yml 2025-06-12 09:24:29 +08:00
ddf5159fbc Merge pull request 'master' (#1023) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/1023
2025-06-11 14:49:29 +00:00
dj
d0960f6ad6 feat(FileUpload): 实现多文件批量上传功能
- 添加自定义上传逻辑,支持多文件上传- 优化文件选择和上传流程,实现自动上传
-增加上传进度提示和完成通知
- 修复了一些与上传相关的小问题
2025-06-11 22:48:27 +08:00
dj
e7b982ef6c fix(ProjectAttachment): 移除未使用的上传附件相关代码 2025-06-11 16:34:59 +08:00
dj
b5ada3a1ac feat(FileUpload): 添加文件上传中的 loading 效果 2025-06-11 14:19:55 +08:00
418effdb04 Merge pull request 'feat(expense-management): 添加研发工时超过21.75天的提示功能' (#1022) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/1022
2025-06-09 14:28:50 +00:00
dj
215f7c6bbf feat(expense-management): 添加研发工时超过21.75天的提示功能
- 在保存分配明细时,增加对研发人员总工时的计算
- 如果总工时超过21.75天,系统将发出警告通知- 优化了控制台日志输出,便于调试和监控
2025-06-09 22:28:24 +08:00
57a1d2700f Merge pull request 'refactor(expense-management): 注释掉研发人员重复性检查代码' (#1021) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/1021
2025-06-08 15:11:01 +00:00
dj
e4025b90e9 refactor(expense-management): 注释掉研发人员重复性检查代码
- 在 add.vue 文件中,注释掉了两段用于检查研发人员重复性的代码
- 此修改可能是为了暂时禁用重复性检查功能,或者准备替换为新的检查逻辑
2025-06-08 23:08:02 +08:00
e44380c000 Merge pull request 'refactor(expense-management): 优化数字输入和附件处理' (#1020) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/1020
2025-06-07 01:30:52 +00:00
dj
70d94f3c1d refactor(expense-management): 优化数字输入和附件处理
- 在 ProjectApply 组件中,将多个 el-input 组件替换为 el-input-number 组件,用于限制输入格式
- 在 ProjectAttachment 组件中,优化附件列表获取逻辑,实现附件去重功能
- 在 add.vue 文件中,启用 console.log 输出,用于调试项目 ID 和研发人员 ID 数组
2025-06-06 22:58:48 +08:00
14c6ed1168 Merge pull request 'fix : 修复归档附件bug' (#1019) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/1019
2025-05-28 15:53:32 +00:00
dj
05275aed15 fix : 修复归档附件bug 2025-05-28 23:53:10 +08:00
47d5863361 Merge pull request 'fix : 修复归档附件bug' (#1018) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/1018
2025-05-28 15:51:11 +00:00
dj
9758981d3f fix : 修复归档附件bug 2025-05-28 23:50:59 +08:00
a946247849 Merge pull request 'master' (#1017) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/1017
2025-05-28 15:03:54 +00:00
dj
7c2d713035 fix(components): 优化多个组件的显示逻辑
- 在 ApprovalDetail组件中,改进了多个字段的显示逻辑,增加了对 0值的处理
- 在 AttachmentUpload 组件中,调整了必填项的显示逻辑
- 在 ProjectApply 组件中,修改了前置流程字段的显示条件
- 在 upload 组件中,优化了文件列表的处理逻辑
2025-05-28 23:01:16 +08:00
dj
f4330b60d5 refactor(ProjectApply): 优化归档附件上传逻辑 2025-05-28 16:50:55 +08:00
1a38381ab8 Merge pull request 'refactor(components): 调整文件上传大小限制并优化附件展示逻辑' (#1016) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/1016
2025-05-23 01:08:02 +00:00
dj
f61d50dbfc refactor(components): 调整文件上传大小限制并优化附件展示逻辑 2025-05-23 09:07:02 +08:00
f5b9339b36 Merge pull request 'fix(ProjectAttachment): 重新获取附件列表' (#1015) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/1015
2025-05-22 15:09:20 +00:00
dj
66dc6df0d9 fix(ProjectAttachment): 重新获取附件列表
在删除附件后,添加了重新获取附件列表的调用,以确保界面上的附件列表是最新的。
2025-05-22 23:08:27 +08:00
a3c7439a7f Merge pull request 'fix(ProjectAttachment): 修复删除附件后未及时更新文件列表的问题- 在删除文件后添加了更新文件列表的逻辑' (#1014) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/1014
2025-05-22 14:57:02 +00:00
dj
c7329f2f6d fix(ProjectAttachment): 修复删除附件后未及时更新文件列表的问题- 在删除文件后添加了更新文件列表的逻辑
- 优化了获取本地文件列表的方法
- 调整了文件列表的初始化位置
2025-05-22 22:56:06 +08:00
59699b6118 Merge pull request 'feat(ProjectAttachment): 优化文件上传和管理功能' (#1013) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/1013
2025-05-22 08:46:46 +00:00
dj
673e4fa20a feat(ProjectAttachment): 优化文件上传和管理功能
- 新增本地存储功能,暂存未提交的文件
- 优化文件删除逻辑,区分本地和服务器文件
- 添加提交按钮,将本地文件上传到服务器
- 调整标签切换时的文件列表显示逻辑
- 优化代码结构,提高可读性和可维护性
2025-05-22 16:45:58 +08:00
eb2a5581ca Merge pull request 'refactor(project-demand): 优化方案总结提交逻辑' (#1012) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/1012
2025-05-22 02:09:05 +00:00
dj
ee5fc2cba3 refactor(project-demand): 优化方案总结提交逻辑
- 移除了不必要的空数组初始化
-简化了 requirementId 的赋值逻辑
- 添加了空行以提高代码可读性
2025-05-22 10:06:44 +08:00
952884a7fe Merge pull request 'fix(project-demand): 修复专项经费选择框逻辑' (#1011) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/1011
2025-05-21 15:17:49 +00:00
dj
b7ca97696a fix(project-demand): 修复专项经费选择框逻辑
- 修改了专项经费选择逻辑,确保在选择专项经费时正确处理 specialFund 和 specialFundId 的值
- 优化了代码结构,提高了可读性和维护性
2025-05-21 23:14:00 +08:00
6ba9fa4bee Merge pull request 'master' (#1010) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/1010
2025-05-21 14:39:55 +00:00
dj
baea68c52a Merge remote-tracking branch 'origin/master' 2025-05-21 22:39:08 +08:00
dj
a2ed04e144 refactor(project-demand): 优化加载状态管理
- 在获取数据失败时添加 loading.value = false,确保正确更新加载状态
2025-05-21 22:38:53 +08:00
8a218ad270 Merge pull request 'feat(project-demand): 编辑概览页面数据持久化' (#1009) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/1009
2025-05-21 06:31:54 +00:00
dj
287d6a3ad0 feat(project-demand): 编辑概览页面数据持久化 2025-05-21 14:31:38 +08:00
9813f8c585 Merge pull request 'fix(project-demand): 修复专项基金选择问题' (#1008) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/1008
2025-05-21 04:55:59 +00:00
dj
673a26368a fix(project-demand): 修复专项基金选择问题 2025-05-21 12:55:23 +08:00
9b90dbc649 Merge pull request 'feat(ProjectApply): 科技处用户申请项目时增加部门分管领导必选项' (#1007) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/1007
2025-05-19 14:13:55 +00:00
dj
9adea1060c feat(ProjectApply): 科技处用户申请项目时增加部门分管领导必选项 2025-05-19 22:13:03 +08:00
4f471494cc Merge pull request 'refactor(permission): 优化面包屑控制逻辑' (#1006) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/1006
2025-05-16 10:15:13 +00:00
dj
4e5a4bb4b9 refactor(permission): 优化面包屑控制逻辑 2025-05-16 18:14:31 +08:00
b4d6d97e27 Merge pull request 'fix : 修复需求上报缓存问题' (#1005) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/1005
2025-05-15 08:06:29 +00:00
dj
a5ebab16a6 fix : 修复需求上报缓存问题 2025-05-15 16:06:04 +08:00
6ad76d1571 Merge pull request 'master' (#1004) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/1004
2025-05-05 12:15:31 +00:00
dj
0cc1b63ae7 feat(project-management): 优化前置流程选择功能
- 在项目申请详情页面添加基本数据传递
- 实现前置流程的更改和选择功能
- 优化前置流程数据的存储和展示
- 添加对不可重复选择的前置流程的校验
2025-05-05 20:15:13 +08:00
dj
d76ef8ff9c feat(project-demand): 更新项目需求汇总功能
- 新增 getProjectName 方法,用于项目名称关键词匹配- 修改远程搜索方法,使用 getProjectName 替代 getRequirementName
- 更新 ProjectApply 组件,调整专项资金输入框显示逻辑
- 移除 proxy 配置中的注释
2025-05-05 17:53:55 +08:00
dj
f105485714 feat(project-demand): 添加项目名称远程搜索功能并优化前置流程显示逻辑
- 在项目需求概览页面添加项目名称远程搜索功能,提高搜索效率和准确性
- 优化项目申请详情页面的前置流程显示逻辑,根据不同场景调整标签宽度
2025-05-05 14:48:07 +08:00
df99acd638 Merge pull request 'fix : 修复公告问题' (#1003) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/1003
2025-04-29 03:29:31 +00:00
dj
af275ea6c4 fix : 修复公告问题 2025-04-29 11:29:06 +08:00
68830daab3 Merge pull request 'master' (#1002) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/1002
2025-04-27 06:29:31 +00:00
dj
c27162f918 feat : 项目归档-实施附件 2025-04-27 14:28:59 +08:00
dj
f1b81d86a2 fix : 备份附件 2025-04-27 11:00:38 +08:00
0c24d2cf51 Merge pull request 'fix : 修复单位元' (#1001) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/1001
2025-04-24 13:48:41 +00:00
dj
710ccbdf65 fix : 修复单位元 2025-04-24 21:48:23 +08:00
7001261f01 Merge pull request 'refactor(project-management): 统一经费预算单位' (#1000) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/1000
2025-04-24 07:30:38 +00:00
dj
7fcfc992fb refactor(project-management): 统一经费预算单位
- 在多个组件中将"预估经费预算"和"实际经费预算"的标签添加单位"(元)"
-调整部分组件的标签宽度以适应新的单位
- 此修改统一了经费预算的显示格式,提高了用户体验
2025-04-24 15:30:14 +08:00
b7be0a34ae Merge pull request 'feat(components): 增加审核意见必填校验' (#999) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/999
2025-04-23 14:47:41 +00:00
dj
a792df80e6 feat(components): 增加审核意见必填校验 2025-04-23 22:46:58 +08:00
b56e5b3544 Merge pull request 'fix : 标签不可编辑' (#998) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/998
2025-04-20 12:32:35 +00:00
dj
5dccaa1ee7 fix : 标签不可编辑 2025-04-20 20:32:16 +08:00
6aa074bfa3 Merge pull request 'feat : 项目验收新增字段' (#997) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/997
2025-04-20 11:50:58 +00:00
dj
8aefca0c82 feat : 项目验收新增字段 2025-04-20 19:49:57 +08:00
e518791ddd Merge pull request 'master' (#996) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/996
2025-04-20 06:44:18 +00:00
dj
afda146103 feat : 项目归档-附件新增项目阶段字段 2025-04-20 14:43:57 +08:00
dj
11f7fa37aa feat : 年度计划新字段 2025-04-20 13:01:43 +08:00
dj
35c2e1d9b4 feat : 需求上报新增字段 2025-04-20 12:46:14 +08:00
dj
fe3a15fcbd fix: 调整详情页面知识产权输出项 2025-04-19 21:03:54 +08:00
dj
9fd97f6ea2 feat :需求上报新增字段 2025-04-19 20:13:11 +08:00
dj
cccd14ec79 fix: 移除预期成果形式相关代码 2025-04-19 19:03:10 +08:00
2ed2cae599 Merge pull request 'fix : 注释立项提交的前置流程' (#995) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/995
2025-04-19 05:43:49 +00:00
dj
958399a32a fix : 注释立项提交的前置流程 2025-04-19 13:43:36 +08:00
745971087c Merge pull request 'fix : 完善需求上报字段页面' (#994) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/994
2025-04-19 02:58:46 +00:00
dj
8ea916c206 fix : 完善需求上报字段页面 2025-04-19 10:58:28 +08:00
e0aefecf50 Merge pull request 'fix: 修复审批白名单中取消事件' (#993) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/993
2025-04-18 14:52:27 +00:00
dj
10e9c9de19 fix: 修复审批白名单中取消事件 2025-04-18 22:51:49 +08:00
950b32270b Merge pull request 'master' (#992) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/992
2025-04-18 14:40:16 +00:00
dj
b032903ed4 fix(project): 调整知识产权相关表述和附件表格样式
- 将"知识产权状况"修改为"知识产权归属"
- 优化附件上传和展示组件的样式- 统一知识产权归属相关的标签和提示信息
- 调整部分组件的显示逻辑和样式
2025-04-18 22:37:22 +08:00
dj
696921243e fix : 首页字体颜色统一 2025-04-18 18:13:03 +08:00
dj
7200592f05 fix : 首页字体颜色统一 2025-04-18 14:04:44 +08:00
dj
963b7b93e3 Merge remote-tracking branch 'origin/master' 2025-04-18 11:22:24 +08:00
dj
86751acbd6 fix : 首页字体颜色统一 2025-04-18 11:22:00 +08:00
c17149235f Merge pull request 'fix: 编辑上报时主项目选项过滤当前项目' (#991) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/991
2025-04-15 16:00:21 +00:00
dj
fda0f4fcde fix: 编辑上报时主项目选项过滤当前项目 2025-04-15 23:56:05 +08:00
560485f255 Merge pull request 'style(article-management): 优化附件列表样式' (#990) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/990
2025-04-15 15:31:31 +00:00
dj
2847c88c61 style(article-management): 优化附件列表样式
- 在 add.vue 和 detail.vue 中为附件列表项添加底部间距,提升可读性
- 保持附件列表样式在不同页面中的一致性
2025-04-15 23:29:30 +08:00
5611fd9f02 Merge pull request 'feat: 费用导入功能' (#989) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/989
2025-04-15 15:14:57 +00:00
dj
2827c5ace6 feat: 费用导入功能 2025-04-15 23:14:46 +08:00
750a4c8178 Merge pull request 'fix: 注释公告附件列表相关代码' (#988) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/988
2025-04-15 14:34:01 +00:00
dj
9941fc14f6 fix: 注释公告附件列表相关代码 2025-04-15 22:33:38 +08:00
8b94f044db Merge pull request 'feat: 抄送成功后刷新功能' (#987) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/987
2025-04-15 03:15:54 +00:00
dj
c71208c3e4 feat: 抄送成功后刷新功能 2025-04-15 11:15:15 +08:00
b2fb3fbb67 Merge pull request 'feat: 项目详情审批流程加立即抄送按钮' (#986) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/986
2025-04-15 02:41:27 +00:00
dj
7e6b48b62a feat: 项目详情审批流程加立即抄送按钮 2025-04-15 10:40:52 +08:00
4aa0b093bb Merge pull request 'fix: 修复附件上传和展示问题' (#985) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/985
2025-04-14 13:20:20 +00:00
dj
e77820e145 fix: 修复附件上传和展示问题 2025-04-14 21:19:55 +08:00
66d2c3c7cf Merge pull request 'master' (#984) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/984
2025-04-14 13:19:48 +00:00
dj
a1422067d0 feat: 审批流程加立即抄送按钮 2025-04-14 16:44:42 +08:00
dj
7579b77b2d feat: 添加导入研发费用明细表和模板下载功能 2025-04-14 15:43:48 +08:00
dj
c6390a8117 feat: 文章管理增加附件上传/删除/下载功能 2025-04-14 15:07:58 +08:00
dj
e20f8cad7f fix: 修复附件上传和展示问题 2025-04-13 21:22:22 +08:00
dj
5cf2e4d208 feat(article-management): 增加文章附件上传功能
- 在文章管理页面添加公告附件列表
- 实现附件上传和展示功能- 优化 Tinymce 组件,支持附件上传事件
2025-04-11 18:21:43 +08:00
4f3a8550eb Merge pull request 'master' (#983) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/983
2025-04-11 06:09:41 +00:00
dj
ad6d7af1a3 Merge remote-tracking branch 'origin/master' 2025-04-11 14:08:25 +08:00
dj
65a4c72fd0 style(mobile): 优化附件文件列表的展示效果 2025-04-11 14:08:02 +08:00
5ea25ae8ae Merge pull request 'fix: 修复附件上传和展示问题' (#982) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/982
2025-04-09 15:11:29 +00:00
dj
810757e828 fix: 修复附件上传和展示问题 2025-04-09 23:11:06 +08:00
e82c6e2316 Merge pull request 'master' (#981) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/981
2025-04-09 04:59:16 +00:00
dj
af593b08da Merge remote-tracking branch 'origin/master' 2025-04-09 12:58:56 +08:00
dj
2b14bd19a4 fix : 修复项目归档附件项目基本信息展示 2025-04-09 12:58:34 +08:00
da69cb4dba Merge pull request 'master' (#980) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/980
2025-04-09 02:59:02 +00:00
cc1d0c8cf2 Merge pull request 'fix : 修复项目实施附件上传功能' (#979) from dj into master
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/979
2025-04-09 02:58:50 +00:00
dj
f3d9ff44a3 fix : 修复项目实施附件上传功能 2025-04-09 10:58:26 +08:00
375a678fc3 Merge pull request 'master' (#978) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/978
2025-04-09 01:42:30 +00:00
a3cbf4d24b Merge pull request 'fix : 修复项目实施附件上传功能' (#977) from dj into master
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/977
2025-04-09 01:42:17 +00:00
dj
d3b12bd64c fix : 修复项目实施附件上传功能 2025-04-09 09:37:53 +08:00
c213b3b41c Merge pull request 'master' (#976) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/976
2025-04-08 16:24:02 +00:00
d0c677cfb4 Merge pull request 'dj' (#975) from dj into master
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/975
2025-04-08 16:23:33 +00:00
dj
e9469439e8 Merge remote-tracking branch 'origin/dj' 2025-04-09 00:16:51 +08:00
62035606c9 Merge pull request 'master' (#974) from master into dj
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/974
2025-04-08 16:16:26 +00:00
dj
b101d70c75 fix: 修复附件上传和展示问题 2025-04-09 00:15:01 +08:00
382bad4cb3 Merge pull request 'master' (#973) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/973
2025-04-08 16:14:37 +00:00
dj
8c5d08874f fix: 修复附件上传和展示问题 2025-04-09 00:14:10 +08:00
dj
25d5b20b65 fix: 修复附件上传和展示问题 2025-04-09 00:13:51 +08:00
dj
2f43919132 fix: 分摊明细导出调整参数 2025-04-08 23:05:42 +08:00
8f5b9fc637 Merge pull request 'fix: 分摊明细导出调整参数' (#972) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/972
2025-04-07 16:30:53 +00:00
dj
7b619a9bef fix: 分摊明细导出调整参数 2025-04-08 00:30:32 +08:00
f33543c540 Merge pull request 'fix: 优化首页通知公告样式' (#971) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/971
2025-04-07 13:57:40 +00:00
dj
a9a2be2c74 fix: 优化首页通知公告样式 2025-04-07 21:57:13 +08:00
3160e86710 Merge pull request 'fix: 优化移动端项目管理功能' (#970) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/970
2025-04-06 14:38:30 +00:00
dj
a307697028 fix: 优化移动端项目管理功能 2025-04-06 22:38:14 +08:00
062f9c7bee Merge pull request 'feat(article-management): 首页通知公告加时间, 将"备注"字段改为"发文单位"' (#969) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/969
2025-04-06 13:26:05 +00:00
dj
e8a5b4e788 feat(article-management): 首页通知公告加时间, 将"备注"字段改为"发文单位" 2025-04-06 21:25:30 +08:00
da9624663e Merge pull request 'master' (#968) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/968
2025-04-06 09:11:03 +00:00
7b8cedcfb0 Merge pull request 'master' (#967) from master into dj
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/967
2025-04-06 09:10:49 +00:00
dj
d3c0b36657 refactor(views/components): 优化首页通知公告展示和项目附件搜索功能
- 首页通知公告:调整公告列表的序号显示逻辑
- 项目附件:改进附件搜索功能,支持按全部文件搜索
- 搜索组件:更新搜索界面文本,根据搜索范围动态显示标签或项目阶段
2025-04-06 17:10:08 +08:00
dj
eabf9cb3d6 refactor(project): 优化项目相关页面显示内容
- 修改项目需求、总结、立项、实施、归档页面中的编号标签
- 更新项目申请组件,根据项目类型动态显示实际专项资金输入框
-调整 API 代理配置
2025-04-06 16:47:23 +08:00
b84c2ce131 Merge pull request 'feat(project-management): 优化文件归档表格状态展示和权限控制' (#966) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/966
2025-04-02 16:34:20 +00:00
dj
348027f355 feat(project-management): 优化文件归档表格状态展示和权限控制 2025-04-03 00:34:04 +08:00
579f2777cf Merge pull request 'master' (#965) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/965
2025-04-02 16:11:32 +00:00
dj
ed22942ab2 fix(project-management): 优化附件启用禁用操作反馈 2025-04-03 00:11:21 +08:00
dj
119e3d8333 feat(ProjectAttachment): 优化文件上传标签逻辑 2025-04-03 00:09:41 +08:00
011566cb22 Merge pull request 'feat(ProjectAttachment): 添加文件下载功能' (#964) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/964
2025-04-02 15:37:56 +00:00
dj
bf34d8aa0c feat(ProjectAttachment): 添加文件下载功能 2025-04-02 23:34:45 +08:00
7f3fedc2f2 Merge pull request 'master' (#963) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/963
2025-04-02 15:28:05 +00:00
dj
69aa6aa0fb refactor(project-demand): 优化需求变更时特殊基金逻辑 2025-04-02 23:26:01 +08:00
dj
e54db551a6 feat(project-demand): 添加需求征集变更逻辑 2025-04-02 23:01:17 +08:00
6c91a0740a Merge pull request 'fix: 修改分摊明细页面路由跳转逻辑' (#962) from master into dj
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/962
2025-04-01 16:06:24 +00:00
f0fe6c8269 Merge pull request 'master' (#961) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/961
2025-04-01 16:06:06 +00:00
dj
9174c09a6b fix: 修改分摊明细页面路由跳转逻辑 2025-04-02 00:05:48 +08:00
dj
4dc5ca40ee feat(share-detail): 添加分摊导出按钮 2025-04-02 00:02:49 +08:00
09705e634a Merge pull request 'feat(expense-management): 新增费用分摊功能并优化项目管理相关页面' (#960) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/960
2025-04-01 15:58:33 +00:00
dj
1e29e6bdc4 feat(expense-management): 新增费用分摊功能并优化项目管理相关页面 2025-04-01 23:57:46 +08:00
e49d8cfb5e Merge pull request 'master' (#959) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/959
2025-04-01 10:19:27 +00:00
a3bb1a9156 Merge pull request 'feat: 支出明细筛选和导出功能' (#958) from dj into master
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/958
2025-04-01 10:19:16 +00:00
dj
e9ced267ed feat: 支出明细筛选和导出功能 2025-04-01 13:04:34 +08:00
ef9a536b5c Merge pull request 'master' (#957) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/957
2025-03-31 15:16:40 +00:00
a87be0e6e2 Merge pull request 'dj' (#956) from dj into master
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/956
2025-03-31 15:16:28 +00:00
dj
98d8ea4805 feat(expense-management): 新增费用分摊功能并优化项目管理相关页面 2025-03-31 23:14:54 +08:00
dj
244f2e72b4 feat: 项目基本信息新增实际经费预算和专项资金相关字段 2025-03-31 14:12:28 +08:00
dj
f9aa6191ce feat(project-manage): 新增项目附件标签功能 2025-03-30 15:06:56 +08:00
dj
ebd7fa3851 feat(project-manage): 新增项目附件标签功能 2025-03-30 15:06:39 +08:00
2941847f54 Merge pull request 'dj' (#955) from dj into master
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/955
2025-03-29 12:25:32 +00:00
dj
ca9e281119 feat(project-manage): 新增项目附件标签功能 2025-03-29 20:24:53 +08:00
dj
a1ed160445 Merge remote-tracking branch 'origin/master' 2025-03-28 19:41:10 +08:00
dj
9db0e8e9ec feat(expense-management): 新增费用分摊功能 2025-03-25 15:17:08 +08:00
fe09ced0bc Merge pull request 'master' (#954) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/954
2025-03-25 06:37:02 +00:00
d73eb49461 Merge pull request 'dj' (#953) from dj into master
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/953
2025-03-25 06:28:09 +00:00
dj
b890372fc5 feat(ProjectAttachment): 优化项目附件组件功能和布局
- 移除了不必要的搜索和上传按钮
- 添加了文件上传功能和单个文件删除功能
- 优化了标签页切换逻辑
-调整了样式和布局
2025-03-25 14:27:48 +08:00
dj
53bab74ea9 feat(project-management): 更新项目管理相关页面文案并优化附件功能 2025-03-22 23:11:09 +08:00
zhangkaihuai
023256630e 更新 Dockerfile 2025-03-19 12:24:06 +00:00
zhangkaihuai
f65663071a 更新 nginx.conf 2025-03-19 12:13:31 +00:00
zhangkaihuai
9a55494da7 更新 nginx.conf 2025-03-19 08:07:37 +00:00
zhangkaihuai
d5a07e772f 更新 nginx.conf 2025-03-19 07:55:07 +00:00
zhangkaihuai
42499bcb22 更新 nginx.conf 2025-03-19 07:40:27 +00:00
zhangkaihuai
0243d6fc56 Merge pull request '更新 nginx.conf' (#952) from gary into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/952
2025-03-19 07:34:21 +00:00
zhangkaihuai
6bdbde262f 更新 nginx.conf 2025-03-19 07:34:04 +00:00
zhangkaihuai
78435bbcac Merge pull request 'gary' (#951) from gary into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/951
2025-03-19 07:32:49 +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
171 changed files with 18207 additions and 4549 deletions

View File

@@ -8,7 +8,7 @@ steps:
- name: build-package
image: node:16.20.0
image: node:18.19.0
volumes:
- name: cache
path: /drone/src/node_modules
@@ -23,11 +23,17 @@ steps:
- cp docker.sh /app/build/$DRONE_REPO_NAME/
- cp nginx.conf /app/build/$DRONE_REPO_NAME/
- npm -v
- node -v
- mkdir -p ./node_modules
- export NODE_MODULES_PATH=`pwd`/node_modules
# - npm config set registry https://registry.npmmirror.com
# - set NODE_OPTIONS=--openssl-legacy-provider
# - npm install
- npm config set registry https://registry.npmmirror.com
- set NODE_OPTIONS=--openssl-legacy-provider
- npm install --legacy-peer-deps
- npm install patch-package
- npx patch-package
# - npm info unplugin-icons
- npm list package-manager-detector
# - npm install unplugin-icons@latest @antfu/install-pkg@latest package-manager-detector@latest
- npm run build
- ls /app/build/$DRONE_REPO_NAME/
- echo $NODE_MODULES_PATH
@@ -35,7 +41,7 @@ steps:
- name: build-docker-prod # 制作docker镜像
image: docker # 使用官方docker镜像
image: 10.7.127.190:38080/docker/docker # 使用官方docker镜像
volumes: # 将容器内目录挂载到宿主机
- name: 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/nginx.conf
COPY default.conf /etc/nginx/conf.d
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 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">
<link rel="icon" href="/favicon.ico">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>管理平台</title>
<title>技创新项目管理平台</title>
</head>
<body>
<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,6 +25,7 @@ http {
keepalive_timeout 65;
server {
listen 80;
listen [::]:80;
@@ -39,6 +40,7 @@ http {
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
client_max_body_size 30m;
}
location / {

View File

@@ -7,11 +7,17 @@
"build": "vite build",
"preview": "vite preview"
},
"overrides": {
"package-manager-detector": "1.0.0",
"@iconify/utils": "2.2.1"
},
"dependencies": {
"@antv/g6": "^3.5.7",
"@tinymce/tinymce-vue": "^4.0.7",
"axios": "^1.4.0",
"d3": "^7.8.5",
"docx-preview": "^0.3.2",
"echarts": "^5.4.2",
"element-plus": "^2.6.0",
"file-saver": "^2.0.5",
@@ -31,6 +37,8 @@
"vue-codemirror": "^6.1.1",
"vue-json-viewer": "^3.0.4",
"vue-router": "^4.1.6",
"vue3-pdf-app": "^1.0.3",
"vue3-print-nb": "^0.1.4",
"vuedraggable": "^4.1.0",
"xlsx": "^0.18.5",
"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
})
}
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

@@ -9,6 +9,13 @@ export const addAllocation = (data) => {
data
});
};
export const addShare = (data) => {
return request({
url:'/workflow/mosr/cost/share',
method: "post",
data
});
};
export const getAllocationDetail = (allocationId) => {
return request({
url: `/workflow/mosr/cost/allocation/info/${allocationId}`,
@@ -61,6 +68,13 @@ export const editAllocation = (data) => {
data
});
};
export const applyCcSend = (data) => {
return request({
url: '/workflow/mosr/cc/send',
method: "post",
data
});
};
export const deleteAllocation = (id) => {
return request({
url: `/workflow/mosr/cost/allocation/${id}`,
@@ -79,3 +93,15 @@ export const shareExportExcel = (allocationId) => {
}
);
};
export const shareDetailExport= (data) => {
return axios.post(
`${import.meta.env.VITE_BASE_URL}/workflow/mosr/cost/share/export`,
data, {
responseType: 'blob',
headers: {
Authorization: getToken()
}
}
);
};

View File

@@ -1,8 +1,31 @@
import request from '@/utils/request.js'
export const getHomeInfo = () => {
export const getHomeTaskInfo = () => {
return request({
url: '/workflow/mosr/process/task',
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 axios from "axios";
import {getToken} from "@/utils/auth";
//需求征集
export const getDemandInfo = (param) => {
return request({
@@ -7,6 +10,12 @@ export const getDemandInfo = (param) => {
params: param
});
};
export const filterRequirementName = (requirementName) => {
return request({
url: `/workflow/mosr/requirement/match/${requirementName}`,
method: "get"
});
};
export const getWorkflowInfo = () => {
return request({
url: '/workflow/mosr/requirement/process',
@@ -88,3 +97,32 @@ export const getRequirementStatePerm = () => {
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,23 @@ export const requirementReported = (data) => {
data: data
});
};
//需求汇总-征集名称关键词匹配
export const getRequirementName = (requirementName) => {
return request({
url: `/workflow/mosr/requirement/collect/project/match/${requirementName}`,
method: "get"
});
};
//需求汇总-项目名称关键词匹配
export const getProjectName = (projectName) => {
return request({
url: `workflow/mosr/requirement/collect`,
method: "get",
params:{
projectName:projectName
}
});
};
//获取需求上报 流程信息
export const getProcessInfo = (specialFund) => {
return request({
@@ -89,3 +106,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
});
};
export const searchAllFileList = (params) => {
return request({
url: '/workflow/mosr/attachment/all',
method: "get",
params: params
});
};
export const uploadFileList = (data) => {
return request({
url: '/workflow/mosr/attachment/upload',

View File

@@ -8,6 +8,12 @@ export const getApplyProcess = (projectId) => {
method: "get"
});
};
export const filterProjectName = (projectName,targetState) => {
return request({
url: `/workflow/mosr/project/approval/match/${projectName}/${targetState}`,
method: "get"
});
};
export const projectApply = (data) => {
return request({
url: '/workflow/mosr/project/approval/initiation/apply',
@@ -79,6 +85,35 @@ export const getTags = (projectId) => {
method: "get"
});
};
export const getTagList = (projectId) => {
return request({
url: `/workflow/mosr/file/tag/list`,
method: "get",
params:{
projectId: projectId
}
});
};
export const addTag = (data) => {
return request({
url: '/workflow/mosr/file/tag/add',
method: "post",
data:data
});
};
export const updateTag = (data) => {
return request({
url: '/workflow/mosr/file/tag/update',
method: "post",
data:data
});
};
export const delTag = (tageId) => {
return request({
url: `/workflow/mosr/file/tag/${tageId}`,
method: "delete"
});
};
export const getPhaseProcess = () => {
return request({
url: '/workflow/phase/change/process',
@@ -179,3 +214,27 @@ 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()
}
}
);
};
//费用明细模板下载
export const costTemplateDownload = () => {
return axios.get(
`${import.meta.env.VITE_BASE_URL}/workflow/mosr/rd/expense/download/template`,
{
responseType: 'blob',
headers: {
Authorization: getToken()
}
}
);
};

View File

@@ -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'
})
}
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'
})
}
export const judgeIsSameRole = (userId) => {
return request({
url: `/admin/mosr/user/company/same/${userId}`,
method: 'get'
})
}
// 查询角色信息
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) => {
return request({
url: '/admin/user',
@@ -206,3 +219,33 @@ export const checkMatrix = (userId) => {
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'
//根据角色或者部门获取到对应的数据
export function getUserTree(type, chooseId) {
export function getUserTree(type,chooseId){
return request({
url: `/admin/user/choose/${type}/${chooseId}`,
method: 'get'
url:`/admin/user/choose/${type}/${chooseId}`,
method:'get'
})
}
@@ -15,7 +16,6 @@ export function getRole() {
method: 'get'
})
}
//获取采取树形控件的部门option
export function getDepartmentTree() {
return request({
@@ -23,12 +23,11 @@ export function getDepartmentTree() {
method: 'get'
})
}
export function getMosrUser(params) {
return request({
url: '/admin/mosr/user/choose',
method: 'get',
params: params
params:params
})
}
@@ -36,10 +35,9 @@ export function getOrganizationStructure(params) {
return request({
url: '/admin/organizational/structure/choose',
method: 'get',
params: params
params:params
})
}
export function getOrganizationStructureTree(params) {
return request({
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;
bottom: 0;
left: 0;
z-index: 1001;
//z-index: 1001;
}
.el-dialog {
@@ -374,6 +374,9 @@ html, body, #app, .el-container, .el-aside, .el-main {
left: 200px;
}
//.el-overlay-dialog {
// left: 200px !important;
//}
//放大缩小按钮上外边距
.scale {
margin-top: 10px;
@@ -382,12 +385,10 @@ html, body, #app, .el-container, .el-aside, .el-main {
//top: -20px;
}
.el-overlay-dialog {
left: 200px !important;
}
.el-overlay-dialog::-webkit-scrollbar, .scrollbar-dict::-webkit-scrollbar {
width: 6px;
height: 6px;
}
// 滚动条轨道
@@ -473,7 +474,16 @@ html, body, #app, .el-container, .el-aside, .el-main {
width: 1.8em;
height: 1.7em;
}
.home-time{
width: 1.4em;
height: 1.4em;
margin-right: 5px;
}
.file-svg{
width: 1.4em;
height: 1.4em;
fill: #BEA266;
}
.middle-icon {
width: 1.4em;
height: 1.4em;
@@ -553,7 +563,7 @@ html, body, #app, .el-container, .el-aside, .el-main {
// 操作页面底部按钮
.oper-page-btn {
position: fixed;
bottom: 15px;
top: 135px;
right: 15px;
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>
<el-form :model="formData" ref="applyForm" :rules="rules" :label-position="labelPosition">
<el-form :model="formData" ref="applyForm" :rules="rules" :label-position="labelPosition" :style="{marginLeft: label==='项目验收附件'?'25px': label==='项目立项附件'?'25px':'5px'}">
<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-form-item :label="label" prop="attachment" label-width="125">
<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">
<el-form-item :label="label" prop="" :required="label!='项目归档附件'">
<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%;" :height="label=='项目立项附件'?'160':'160'" :scrollbar-always-on="true" :style="{maxHeight:label=='项目立项附件'?'160px':'160px',height:label=='项目立项附件'?'160px':'160px'}" v-if="showTable" :tableConfig="tableConfig"
:data="allFileList" :isSettingCol="false" :pagination="false">
<template #empty>
<el-empty :image-size="55" description="暂无数据" style="padding: 0"/>
@@ -34,11 +37,14 @@
</el-col>
</el-row>
</el-form>
<file-preview ref="filePreviewRef" v-if="filePreviewShow" :fileName="filePreviewParam.fileName"
:fileUrl="filePreviewParam.fileUrl"
:fileType="filePreviewParam.fileType"/>
</template>
<script setup lang="jsx">
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";
@@ -63,6 +69,16 @@ const props = defineProps({
type: Boolean,
default: false
},
//是否显示模板下载按钮
templateDownloadBtnShow: {
type: Boolean,
default: false
},
//模板下载时的文件名
templateName: {
type: String,
default: ''
},
singleList: {
type: Array,
default: []
@@ -84,32 +100,44 @@ const props = defineProps({
default: ''
}
})
const emit = defineEmits(["getAttachment", "getOtherFile","update:singleList"])
const emit = defineEmits(["getAttachment", "getOtherFile", "update:singleList"])
const baseTableConf = reactive(
[
{
prop: 'index',
type: 'index',
label: '序号',
align: 'center',
width: '80',
},
{
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',
// currentRender: ({row, index}) => (
// <el-input placeholder={row.tag} onClick={() => {}}></el-input>)
},
{
prop: 'size',
label: '文件大小',
align: 'center',
currentRender: ({row, index}) => (parseInt(row.size / 1024) + 'KB')
},
]
)
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')
},
...baseTableConf,
{
prop: 'oper',
label: '操作',
@@ -149,29 +177,7 @@ const tableConfig = reactive({
})
const singleTableConfig = 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')
},
...baseTableConf,
{
prop: 'oper',
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({
attachment: [{required: true, message: '请上传附件', trigger: ['blur', 'change']}],
// attachment: [{required: true, message: '请上传附件', trigger: ['blur', 'change']}],
})
const applyForm = ref()
const singleFile = ref(props.formData.singleFile)
const singleFile = ref({})
const isSingleFile = ref(false)
const isHaveOneFile = ref(false)
const allFileList = ref([])
const deleteFileVal = ref({})
const singleFileList = ref([])
if(localStorage.getItem('singleFile')){
if (localStorage.getItem('singleFile')) {
singleFileArray.value.push(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({
get() {
return props.singleList;
@@ -230,8 +285,6 @@ const _singleFileValue = computed({
emit('update:singleList', value)
}
})
// console.log('_singleFileValue',_singleFileValue.value)
const _otherFileListValue = computed({
get() {
return props.otherFileList;
@@ -240,21 +293,35 @@ const _otherFileListValue = computed({
emit('update:otherFileList', value)
}
})
if(_otherFileListValue.value&&_otherFileListValue.value.length>0){
_otherFileListValue.value.forEach(item=>{
if (_otherFileListValue.value && _otherFileListValue.value.length > 0) {
isHaveOneFile.value = true
_otherFileListValue.value.forEach(item => {
allFileList.value.push(item)
})
}
watch(() => props.showSingleTable, (newVal) => {
props.showSingleTable = newVal
}, {deep: true})
// watch(() => props.showSingleTable, (newVal) => {
// props.showSingleTable = newVal
// }, {deep: true})
watch(() => props.formData.fileList, (newVal) => {
if (props.preview) {
newVal?.forEach(item => {
isHaveOneFile.value = true
allFileList.value.push(item)
})
}
}, {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) => {
// props.otherFileList=newVal
// if (props.preview) {
@@ -278,43 +345,104 @@ watch(() => props.showTable, (newVal) => {
// console.log('singleFile', newVal)
// singleFileList.value = newVal
// }, {deep: true})
watch(() => props.formData.singleFile, (newVal) => {
// console.log('singleFile', newVal)
singleFile.value = newVal
props.formData.singleFile=newVal
}, {deep: true})
watch(() => isSingleFile.value, (newVal) => {
isSingleFile.value = newVal
}, {deep: true})
watch(() => singleFile.value, (newVal) => {
singleFile.value = newVal
watch(() => isHaveOneFile.value, (newVal) => {
isHaveOneFile.value = newVal
}, {deep: true})
// watch(() => singleFile.value, (newVal) => {
// singleFile.value = newVal
// }, {deep: true})
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
})
// 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) {
// deleteFile(row.fileId).then(res => {
// ElNotification({
// title: '提示',
// message: res.msg,
// type: res.code === 1000 ? 'success' : 'error'
// })
// if (res.code === 1000) {
if (type === 'single') {
_singleFileValue.value.splice(_singleFileValue.value.findIndex((item) => item.fileId === row.fileId), 1);
isSingleFile.value = false
} else {
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) => {
// console.log('row',row)
// fileUploadRef.value.handleRemove(deleteFileVal.value.id)
handleDelete(row, 'single')
}
const getAttachment = (val) => {
// console.log('getAttachment', val)
isSingleFile.value = true
// deleteFileVal.value=val
emit('getAttachment', val)
}
const compositeParam = (item) => {
@@ -334,6 +462,7 @@ const getOtherFile = (val) => {
} else {
allFileList.value = _otherFileListValue.value
}
isHaveOneFile.value = true
emit('getOtherFile', val)
}
const deleteAttachment = (val) => {
@@ -346,6 +475,7 @@ const deleteAttachment = (val) => {
})
isSingleFile.value = false
singleFile.value = null
singleFileArray.value = []
}
});
}
@@ -365,6 +495,7 @@ const deleteSingleFile = (row, type) => {
isSingleFile.value = false
if (type === 1) {
singleFile.value = null
singleFileArray.value = []
} else {
props.otherFileList.splice(props.otherFileList.findIndex((item) => item.fileId === row.fileId), 1);
}
@@ -396,12 +527,28 @@ defineExpose({
},
allFileList,
singleFile,
isSingleFile
isSingleFile,
isHaveOneFile,
})
</script>
<style scoped>
<style lang="scss" scoped>
:deep(.el-table--fit ) {
height: 300px !important;
height: 160px !important;
}
: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 = () => {
shareExportExcel(route.query.id).then(res => {
console.log(res)
let fileName = `科技创新项目费用分摊表-${props.allocationName}.zip`
const blob = new Blob([res.data])
let a = document.createElement('a')

View File

@@ -1,37 +1,9 @@
<template>
<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>
<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">
<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"
:file-list-show="fileListShow"/>
</el-form>
@@ -56,6 +28,9 @@
style="--el-switch-on-color:#BEA266 ; --el-switch-off-color:#cecdcd"
/>
</div>
<el-button color="#DED0B2" style="margin-left: 10px"
@click="handleCarbonCopy()">立即抄送
</el-button>
</div>
<div class="process">
<operation-render v-if="processViewer && data.operationList && data.operationList.length > 0&&!changeDiagram"
@@ -64,6 +39,13 @@
<process-diagram-viewer v-if="processViewer&&changeDiagram" :id-name="idName?idName:type"/>
</div>
</div>
<user-picker :multiple="true" ref="carbonCopyUserRef" title="请选择抄送人员"
v-model:value="carbonCopyUserList" @ok="carbonCopyUserPickerOk"
@cancelOrClear="carbonCopyUserPickerOk"/>
<file-preview ref="filePreviewRef" :fullscreen="fullscreen" v-if="filePreviewShow"
:fileName="filePreviewParam.fileName" :fileUrl="filePreviewParam.fileUrl"
:fileType="filePreviewParam.fileType"/>
</div>
</template>
@@ -74,55 +56,9 @@ import {ElLoading, ElNotification} from 'element-plus';
import {downloadFile} from "@/api/project-demand";
import {searchImplementationFileList} from "@/api/project-manage/attachment";
import {getTags} from "@/api/project-manage";
import {applyCcSend} from "@/api/expense-manage";
import UserPicker from "@/views/workflow/process/common/UserPicker.vue";
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 props = defineProps({
formData: {
@@ -141,10 +77,18 @@ const props = defineProps({
type: Array,
default: []
},
basicData: {
type: Object,
default: {}
},
fileListShow: {
type: String,
default: 'READ'
},
preProcessShow: {
type: String,
default: 'READ'
},
// approval 立项, execute 实施, 归档 archivist
type: {
type: String,
@@ -154,6 +98,11 @@ const props = defineProps({
type: Boolean,
default: false
},
//是否开始打印
isOpenPrint: {
type: Boolean,
default: false
},
value: {
type: String,
default: ''
@@ -164,6 +113,91 @@ const props = defineProps({
}
})
const form = ref()
const carbonCopyUserList = ref([])
const carbonCopyUserRef = 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(() => {
let arr
if (props.type == 'approval') {
@@ -172,8 +206,9 @@ const schema = computed(() => {
label: '项目负责人',
prop: 'projectChargePerson',
colProps: {
span: 24
span: 6
},
labelWidth: 'left',
component: () => (
<div>
{
@@ -188,156 +223,360 @@ const schema = computed(() => {
label: '项目成员',
prop: 'projectPersonList',
colProps: {
span: 24
span: 6
},
labelWidth: 'left',
component: () => (
<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>
}) : <span>{'--'}</span>
}
</div>
)
},
{
]
if (props.preProcessShow == 'EDIT') {
preProcess = {
label: '前置流程',
prop: 'preProcess',
colProps: {
span: 24
},
labelWidth: 'left',
component: () => (
<div>
{
props.formData.preProcess ? props.formData.preProcess.map(item => {
return <span><a target="_blank" style={{color: '#409EFF', cursor: 'pointer'}}
href={props.formData.preProcessBaseUrl + item.requestId}>{item.requestName}</a> </span>
}) : <span>{'--'}</span>
<select-pre-process formData={props.formData} basicData={props.basicData}/>
}
</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') {
arr = [
{
label: '实际专利(项)',
prop: 'actualNewPatent',
colProps: {
span: 6
},
labelWidth: 'left',
component: () => (
<div>
{
props.formData.actualNewPatent ? props.formData.actualNewPatent :props.formData.actualNewPatent==0?0: <span>{'--'}</span>
}
</div>
)
},
{
label: '实际软件著作权(项)',
prop: 'actualSoftwareCopyright',
colProps: {
span: 6
},
labelWidth: 'left',
component: () => (
<div>
{
props.formData.actualSoftwareCopyright ? props.formData.actualSoftwareCopyright : props.formData.actualSoftwareCopyright==0?0: <span>{'--'}</span>
}
</div>
)
},
{
label: '实际技术标准(项)',
prop: 'actualTechnicalNorms',
colProps: {
span: 6
},
labelWidth: 'left',
component: () => (
<div>
{
props.formData.actualTechnicalNorms ? props.formData.actualTechnicalNorms : props.formData.actualTechnicalNorms==0?0:<span>{'--'}</span>
}
</div>
)
},
{
label: '实际新产品(项)',
prop: 'actualNewProduct',
colProps: {
span: 6
},
labelWidth: 'left',
component: () => (
<div>
{
props.formData.actualNewProduct ? props.formData.actualNewProduct : props.formData.actualNewProduct==0?0:<span>{'--'}</span>
}
</div>
)
},
{
label: '实际新工艺(项)',
prop: 'actualNewProcess',
colProps: {
span: 6
},
labelWidth: 'left',
component: () => (
<div>
{
props.formData.actualNewProcess ? props.formData.actualNewProcess : props.formData.actualNewProcess==0?0: <span>{'--'}</span>
}
</div>
)
},
{
label: '实际新装置(项)',
prop: 'actualNewDevice',
colProps: {
span: 6
},
labelWidth: 'left',
component: () => (
<div>
{
props.formData.actualNewDevice ? props.formData.actualNewDevice :props.formData.actualNewDevice==0?0: <span>{'--'}</span>
}
</div>
)
},
{
label: '实际新材料(项)',
prop: 'actualNewMaterials',
colProps: {
span: 6
},
labelWidth: 'left',
component: () => (
<div>
{
props.formData.actualNewMaterials ? props.formData.actualNewMaterials : props.formData.actualNewMaterials==0?0: <span>{'--'}</span>
}
</div>
)
},
{
label: '实际计算机软件(项)',
prop: 'actualComputerSoftware',
colProps: {
span: 6
},
labelWidth: 'left',
component: () => (
<div>
{
props.formData.actualComputerSoftware ? props.formData.actualComputerSoftware : props.formData.actualComputerSoftware==0?0:<span>{'--'}</span>
}
</div>
)
},
{
label: '实际论文论著(项)',
prop: 'actualThesis',
colProps: {
span: 6
},
labelWidth: 'left',
component: () => (
<div>
{
props.formData.actualThesis ? props.formData.actualThesis : props.formData.actualThesis==0?0:<span>{'--'}</span>
}
</div>
)
},
{
label: '实际研究报告(项)',
prop: 'actualResearchReport',
colProps: {
span: 6
},
labelWidth: 'left',
component: () => (
<div>
{
props.formData.actualResearchReport ? props.formData.actualResearchReport : props.formData.actualResearchReport==0?0: <span>{'--'}</span>
}
</div>
)
},
{
label: '实际商标(项)',
prop: 'actualTrademark',
colProps: {
span: 6
},
labelWidth: 'left',
component: () => (
<div>
{
props.formData.actualTrademark ? props.formData.actualTrademark :props.formData.actualTrademark==0?0: <span>{'--'}</span>
}
</div>
)
},
{
label: '实际其他(项)',
prop: 'actualOther',
colProps: {
span: 24
},
labelWidth: 'left',
component: () => (
<div style="white-space: pre-wrap;">
{
props.formData.actualOther ? props.formData.actualOther : props.formData.actualOther==0?0: <span>{'--'}</span>
}
</div>
)
},
{
label: '部门分管领导',
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: '前置流程',
prop: 'preProcess',
colProps: {
span: 24
},
labelWidth: 'left',
component: () => (
<div>
{
props.formData.preProcess ? props.formData.preProcess.map(item => {
return <span><a target="_blank" style={{color: '#409EFF', cursor: 'pointer'}}
href={props.formData.preProcessBaseUrl + item.requestId}>{item.requestName}</a> </span>
}) : <span>{'--'}</span>
<select-pre-process formData={props.formData} basicData={props.basicData}/>
}
</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') {
arr = [
{
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>
)
},
// {
// 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 == 'phase') {
arr = [
{
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>
)
},
// {
// 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>
// }
// },
]
}
return arr
})
const filePreviewParam = ref({
fileUrl: '',
fileName: '',
fileType: ''
})
const filePreviewShow = ref(false)
const route = useRoute()
const emit = defineEmits(['update:value'])
const emit = defineEmits(['update:value', 'ccSend'])
const _value = computed({
get() {
return props.value;
@@ -346,48 +585,49 @@ const _value = computed({
emit("update:value", val);
}
})
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 handleCarbonCopy = () => {
carbonCopyUserRef.value.showUserPicker()
}
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
}
const carbonCopyUserPickerOk = (userList) => {
carbonCopyUserList.value = userList.map(item => item.id)
console.log('localFormData.value', props.data)
console.log("🚀 ~ file:'carbonCopyUserList.value ", carbonCopyUserList.value)
addUser()
}
const addUser = async () => {
const res = await applyCcSend({
instanceId: props.data.processInstanceId,
// message:props.data.remark,
projectId: route.query.projectId,
state: route.query.step,
userIds: carbonCopyUserList.value
})
console.log('res', res)
if (res.code === 1000) {
ElNotification({
title: '提示',
message: '抄送成功',
type: 'success'
})
emit('ccSend')
} else {
ElNotification({
title: '提示',
message: res.msg,
type: 'error'
})
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 clickToPreview = (row) => {
filePreviewShow.value = false
filePreviewParam.value = {
fileUrl: row.url,
fileName: row.originalFileName,
fileType: row.fileType
}
nextTick(() => {
filePreviewShow.value = true
})
}
@@ -425,22 +665,46 @@ watchEffect(() => {
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) => {
props.loading = newVal
}, {deep: true})
</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>
: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>

View File

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

View File

@@ -1,6 +1,6 @@
<template>
<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="candidate" v-loading="loading">
<el-input v-model="filterText"
@@ -17,8 +17,8 @@
<el-tree :data="dataList" ref="tree" :props="defaultProps" empty-text="" node-key="value"
:show-checkbox="showCheckbox" highlight-current default-expand-all
:default-checked-keys="defaultChecked" :disabled="disabled"
:check-strictly="!checkStrictly" @node-click="(node,check)=>handle(node,check)"
@check-change="handleChange" :filter-node-method="filterNode">
:check-strictly="!checkStrictly" @node-click="(node,check)=>handleNodeClick(node,check)"
@check-change="handleCheckClick" :filter-node-method="filterNode">
<template #default="{ node, data }">
<div class="tree-node">
<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"/>
<div v-for="(selectItem, selectIndex) in selectList" :key="selectIndex" class="org-item">
{{ 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/>
</el-icon>
</div>
@@ -47,7 +47,7 @@
</div>
</div>
<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>
</div>
</el-dialog>
@@ -105,6 +105,8 @@ const defaultProps = {
children: "children",
disabled: "disabled",
};
const isRemoveSingleSelected = ref(false);
const emit = defineEmits(['update:modelValue'])
const _value = computed({
get() {
@@ -175,7 +177,7 @@ const updateTreeCheck = (list, flag) => {
}
})
}
const handleChange = (data, checked) => {
const handleCheckClick = (data, checked) => {
if (data.value == -1) {
if(checked){
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 (props.multiple) {
//不添加重复的数据到右边
@@ -238,7 +240,7 @@ const handle = (node, check) => {
}
// _value.value = selectList.value
};
const noSelected = (selectItem) => {
const removeSingleSelected = (selectItem) => {
//左侧无选择框时,右侧显示×
for (let i = 0; i < selectList.value.length; i++) {
if (selectList.value[i].value === selectItem.value) {
@@ -253,6 +255,7 @@ const noSelected = (selectItem) => {
tree.value.setCheckedKeys([]);
}
}
// isRemoveSingleSelected.value = true
};
const clearSelected = () => {
//清空
@@ -261,18 +264,33 @@ const clearSelected = () => {
cancelButtonText: "取消",
type: "warning"
}).then(() => {
// isRemoveSingleSelected.value = true
if (!props.showCheckbox) {
selectList.value = [];
} 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 = () => {
//确定按钮
emit("ok", selectList.value);
dataList.value = []
visible.value = false;
localStorage.setItem('originallyCompanySelectedList', JSON.stringify(selectList.value))
};
defineExpose({
show

View File

@@ -1,8 +1,9 @@
<template>
<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'"/>
<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%;" :height="tag=='项目立项'?'160':'160'" :style="{maxHeight:tag=='项目立项'?'160px':'160px',height:tag=='项目立项'?'160px':'160px'}" v-if="processViewer" :scrollbar-always-on="true" :tableConfig="tableConfig"
:data="_value" :isSettingCol="false" :pagination="false">
<template #empty>
<el-empty :image-size="55" description="暂无数据" style="padding: 0"/>
@@ -10,11 +11,14 @@
</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";
import FilePreview from "../filePreview/index.vue";
const props = defineProps({
title: {
@@ -25,6 +29,10 @@ const props = defineProps({
type: String,
default: ''
},
fileNameTableWidth: {
type: String,
default: '400'
},
fileListShow: {
type: String,
default: 'READ'
@@ -40,7 +48,17 @@ const props = defineProps({
labelAlign: {
type: String,
default: 'right'
}
},
//弹窗是否铺满全屏
fullscreen: {
type: Boolean,
default: false
},
//是否开始打印
isOpenPrint: {
type: Boolean,
default: false
},
})
const emit = defineEmits(['update:value'])
const tableConfig = reactive({
@@ -56,11 +74,16 @@ const tableConfig = reactive({
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'
align: 'center',
showOverflowTooltip: false,
minWidth: props.fileNameTableWidth,
},
{
prop: 'size',
@@ -94,7 +117,6 @@ const tableConfig = reactive({
}
{
row.newFile ? <popover-delete name={row.originalFileName} type={'文件'} btnType={'danger'}
perm={['mosr:requirement:del']}
onDelete={() => handleDelete(row)}/>
: ''
}
@@ -104,7 +126,12 @@ const tableConfig = reactive({
}
]
})
const filePreviewParam = ref({
fileUrl: '',
fileName: '',
fileType: 'pdf'
})
const filePreviewShow = ref(false)
const _value = computed({
get() {
return props.value;
@@ -113,7 +140,17 @@ const _value = computed({
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) => {
props.processViewer = false
let fileObj = compositeParam(val)
@@ -164,6 +201,12 @@ watch(() => props.processViewer, (newVal) => {
<style scoped lang="scss">
:deep(.el-table--fit ) {
height: 162px !important;
height: 160px !important;
}
@media print {
//#printTable{
// width: 400px!important;
//}
}
</style>

View File

@@ -1,10 +1,54 @@
<template>
<!-- <baseTitle title="审核意见"></baseTitle>-->
<!-- <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 color="#DED0B2" @click="handleAgree">同意</el-button>
</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>
<script setup lang="jsx">
@@ -27,10 +71,17 @@ const props = defineProps({
value: {
type: String,
default: ''
},
//退回节点选择框数据
taskUserOptionList: {
type: Array,
default: []
}
})
const form = ref()
const backNode = ref({})
const showBackNode = ref(false)
const schema = computed(() => {
return [
{
@@ -81,13 +132,13 @@ const back = () => {
}
}
break;
case 'Summary/detail':
if (route.query.source === 'home') {
router.push('/home')
} else {
router.push({name: 'Summary'})
}
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')
@@ -120,19 +171,26 @@ const back = () => {
}
// 驳回
const handleReject = async () => {
// const values = form.value.getValues()
if (!_value.value) {
ElNotification({
title: '提示',
message: '请填写审核意见',
type: 'warning'
})
return
}
ElNotification({
title: '提示',
message: '请填写审核意见',
type: 'warning'
})
return
}
showBackNode.value = true
backNode.value = {}
}
//回退节点
const rollbackHandler = async () => {
// const values = form.value.getValues()
const params = {
taskId: props.taskId,
// ...values
auditOpinion: _value.value
auditOpinion: _value.value,
rollBackId: backNode.value.nodeId
}
// console.log('params', params)
const res = await rejectTask(params)
@@ -141,11 +199,21 @@ const handleReject = async () => {
message: res.msg,
type: res.code === 1000 ? 'success' : 'error'
})
tagsViewStore.delVisitedViews(router.currentRoute.value.path)
back()
if (res.code === 1000) {
tagsViewStore.delVisitedViews(router.currentRoute.value.path)
back()
}
}
const handleAgree = async () => {
if (!_value.value) {
ElNotification({
title: '提示',
message: '请填写审核意见',
type: 'warning'
})
return
}
// const values = form.value.getValues()
const params = {
taskId: props.taskId,
@@ -158,11 +226,17 @@ const handleAgree = async () => {
message: res.msg,
type: res.code === 1000 ? 'success' : 'error'
})
tagsViewStore.delVisitedViews(router.currentRoute.value.path)
back()
if (res.code === 1000) {
tagsViewStore.delVisitedViews(router.currentRoute.value.path)
back()
}
}
</script>
<style lang="scss" scoped>
<style lang="scss">
.opinion-dialog {
.el-dialog__body {
padding: 0 !important;
}
}
</style>

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,608 @@
<template>
<el-row>
<el-col :span="24">
<baseTitle :title="'项目附件'"></baseTitle>
</el-col>
<el-tabs v-model="activeName" class="demo-tabs" @tab-click="handleTabClick" @tab-remove="tabRemove"
style="margin-left: 15px;margin-top: -10px">
<el-tab-pane name="all" :closable="false" label="全部">
</el-tab-pane>
<el-tab-pane v-for="item in tagsOption" :closable="item.isClose==1&&uploadState"
:key="item.tagId"
:label="item.fileTag"
:name="item.tagId">
<div class="tag-title">
<div></div>
{{ item.fileTag }}
</div>
</el-tab-pane>
<el-tab-pane name="plus" v-if="uploadState" :closable="false">
<template #label>
<div style="margin-top: 4px;">
<el-icon color="#BEA266">
<Plus/>
</el-icon>
</div>
</template>
</el-tab-pane>
</el-tabs>
</el-row>
<div style="margin-top:10px;margin-bottom: 8px;margin-left: 15px;display: flex">
<!-- <el-button color="#DED0B2" @click="handleUpload">上传附件</el-button>-->
<file-upload v-if="!isLineBtn&&uploadState&&activeName!='plus'&&activeName!='all'" @getFile="getFile"/>
<el-button color="#DED0B2" @click="handleEditTag"
v-if="activeName!='all'&&activeName!='plus'&&uploadState&&!isDefault"
style="margin-left: 10px;">编辑
</el-button>
</div>
<fvTable style="width: 100%;min-height:311px;max-height: 311px" v-if="showAttachmentTable" height="311"
:scrollbar-always-on="true"
:tableConfig="executeTableConfig" class="execute-apply-table"
:data="otherAttachmentList" :isSettingCol="false" :pagination="false">
<template #empty>
<el-empty :image-size="90" description="暂无数据" style="padding: 0"/>
</template>
</fvTable>
<div class="oper-page-btn" style="margin-right: 90px" v-if="uploadState">
<el-button color="#DED0B2" @click="handleSubmit()">提交</el-button>
</div>
<file-preview ref="filePreviewRef" :fullscreen="false" v-if="filePreviewShow" :fileName="filePreviewParam.fileName"
:fileUrl="filePreviewParam.fileUrl"
:fileType="filePreviewParam.fileType"/>
<el-dialog v-model="tagNameShow" center width="450" top="40vh">
<div style="display: flex;align-items: center">标签
<el-input v-model="fileParam.tagName" placeholder="请输入标签名称" style="width: 335px;" clearable/>
</div>
<div class="oper" style="display: flex;justify-content: flex-end;margin-top: 10px">
<el-button color="#DED0B2" @click="changeTag()">确定</el-button>
<el-button @click="tagNameShow=false">取消</el-button>
</div>
</el-dialog>
</template>
<script setup lang="jsx">
import {addTag, delTag, getTagList, updateTag} from "@/api/project-manage";
import {ElLoading, ElMessageBox, ElNotification} from "element-plus";
import {searchImplementationFileList, uploadFileList} from "@/api/project-manage/attachment";
import {deleteFile, downloadFile} from "@/api/project-demand";
import {nextTick, onActivated} from "vue";
const router = useRouter()
const route = useRoute()
const attachmentParam = reactive({
tag: ''
})
const fileParam = ref({
tagName: ''
})
const uploadState = ref(false)
const tagNameShow = ref(false)
const isDefault = ref(false)
const tagsOption = ref([])
const fileList = ref([])
const allFiles = ref([])
const showAttachmentTable = ref(true)
const activeName = ref('all')
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,
showOverflowTooltip: false,
currentRender: ({row, index}) => (
<div style="color: #2a99ff;cursor: pointer;" onClick={() => clickToPreview(row)}>{row.originalFileName}</div>)
},
{
prop: 'tag',
label: '标签',
align: 'center',
showOverflowTooltip: false,
},
{
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>
{
uploadState.value ?
<popover-delete name={row.originalFileName} type={'文件'} btnType={'danger'}
onDelete={() => deleteSingleFile(row)}/> : ''
}
</div>
)
}
}
]
})
// row.newFile ?: ''
const otherAttachmentList = ref([])
const filePreviewParam = ref({
fileUrl: '',
fileName: '',
fileType: 'pdf'
})
const filePreviewShow = ref(false)
const uploadLoading = ref(false)
const isEdit = ref(false)
const isCloseByList = (index) => {
// otherAttachmentList.length>0?false:true
return otherAttachmentList.value.length == 0;
}
const handleDownload = (row) => {
downloadFile(row.fileId).then(res => {
const blob = new Blob([res])
let a = document.createElement('a')
a.href = URL.createObjectURL(blob)
a.download = row.originalFileName
a.click()
})
}
const deleteSingleFile = (row) => {
console.log("🚀 ~ file: ", row)
deleteFile(row.fileId).then(res => {
ElNotification({
title: '提示',
message: res.msg,
type: res.code === 1000 ? 'success' : 'error'
})
if (res.code === 1000) {
if (row.newFile) {
const finalList = getLocalList().filter(item => item.fileId !== row.fileId);
localStorage.setItem(`implementAllFileList-${route.query.projectId}`, JSON.stringify(finalList))
} else {
otherAttachmentList.value.splice(otherAttachmentList.value.findIndex((item) => item.fileId === row.fileId), 1);
}
getAttachmentList()
activeName.value = 'all'
}
});
}
const changeTag = async () => {
let res = null
if (isEdit.value) {
res = await updateTag({
tagId: activeName.value,
fileTag: fileParam.value.tagName,
projectId: route.query.projectId,
})
changeFileList(fileParam.value.tagName, true)
} else {
res = await addTag({
projectId: route.query.projectId,
fileTag: fileParam.value.tagName
})
getAttachmentList()
fileParam.value.tagName = ''
activeName.value = 'all'
}
ElNotification({
title: '提示',
message: res.msg,
type: res.code === 1000 ? 'success' : 'error'
})
tagNameShow.value = false;
}
const tabRemove = async (val) => {
if (otherAttachmentList.value && otherAttachmentList.value.length > 0) {
ElNotification({
title: '提示',
message: '该标签下存在文件,不能删除标签。如需删除标签,请先删除该标签下的所有文件。',
type: 'error'
})
return;
}
ElMessageBox.confirm(`确认删除名称为${getTagName(val)}的标签吗?`, '系统提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(async () => {
let res = await delTag(val)
ElNotification({
title: '提示',
message: res.msg,
type: res.code === 1000 ? 'success' : 'error'
})
if (res.code === 1000) {
getTagsOption()
otherAttachmentList.value = allFiles.value
}
})
}
const handleEditTag = () => {
fileParam.value.tagName = getTagName(activeName.value)
if (otherAttachmentList.value && otherAttachmentList.value.length > 0) {
ElNotification({
title: '提示',
message: '该标签下存在文件,不能编辑标签。如需编辑标签,请先删除该标签下的所有文件。',
type: 'error'
})
return;
}
tagNameShow.value = true
isEdit.value = true
}
const getTagName = (name) => {
const tagArray = tagsOption.value.filter((item1) => item1.tagId == name)
let tagName = ''
if (tagArray && tagArray.length > 0) {
tagName = tagArray[0].fileTag
}
return tagName
}
const handleTabClick = (item, e) => {
const defaultArray = tagsOption.value.filter(item1 => item1.tagId == item.props.name)
if (defaultArray && defaultArray.length > 0) {
isDefault.value = defaultArray[0].isDefault == 1
} else {
isDefault.value = false
}
tagNameShow.value = item.props.name == 'plus';
if (item.props.name == 'plus') {
isEdit.value = false
fileParam.value.tagName = ''
}
if (item.props.name != 'plus') {
if (item.props.name == 'all') {
changeFileList('all')
} else {
changeFileList(getTagName(item.props.name))
}
// if (item.props.name == 'all') {
// otherAttachmentList.value = allFiles.value
// } else {
// otherAttachmentList.value = allFiles.value.filter(item1 => item1.tag == getTagName(item.props.name))
// }
}
// showAttachmentTable.value = false
// nextTick(() => {
// showAttachmentTable.value = true
// })
}
const compositeParam = (item) => {
return {
fileId: item.id,
size: item.size,
originalFileName: item.originalFilename,
fileType: item.fileType,
url: item.url,
newFile: true,
tag: getTagName(activeName.value) || '项目实施',
}
}
const getFile = (val) => {
console.log('上传文件', val)
fileList.value = getLocalList()
let fileObj = compositeParam(val)
fileList.value.push(fileObj)
localStorage.setItem(`implementAllFileList-${route.query.projectId}`, JSON.stringify(fileList.value))
otherAttachmentList.value.push(fileObj)
// handleSubmit([fileObj])
}
const handleSubmit = async () => {
if (getLocalList().length == 0) {
ElNotification({
title: '提示',
message: '暂无文件可提交',
type: 'warning'
})
return;
} else {
let params = {
fileList: getLocalList(),
projectId: route.query.projectId,
targetState: "30"
}
let res = await uploadFileList(params)
if (res.code !== 1000) {
ElNotification({
title: '提示',
message: res.msg,
type: 'error'
})
} else {
ElNotification({
title: '提示',
message: res.msg,
type: 'success'
})
localStorage.removeItem(`implementAllFileList-${route.query.projectId}`)
// list.forEach(item => {
// otherAttachmentList.value.push(item)
// })
getAttachmentList()
fileList.value = []
}
// changeFileList('all',true)
}
}
const clickToPreview = (row) => {
filePreviewShow.value = false
filePreviewParam.value = {
fileUrl: row.url,
fileName: row.originalFileName,
fileType: row.fileType
}
nextTick(() => {
filePreviewShow.value = true
})
}
const changeFileList = (tag, flag) => {
let params = {}
if (tag == 'all') {
otherAttachmentList.value = allFiles.value
// params = {
// targetId: route.query.projectId,
// targetState: "30",
// }
otherAttachmentList.value = [...otherAttachmentList.value, ...getLocalList()];
} else {
const filw = getLocalList().filter(item1 => item1.tag === tag);
const filteredAllFiles = allFiles.value.filter(item1 => item1.tag === tag);
// 使用 fileId 作为唯一标识进行去重
const seen = new Set();
const uniqueFiles = [...filteredAllFiles, ...filw].filter(item => {
if (!seen.has(item.fileId)) {
seen.add(item.fileId);
return true;
}
return false;
});
otherAttachmentList.value = uniqueFiles;
// params = {
// targetId: route.query.projectId,
// targetState: "30",
// tag: tag
// }
}
showAttachmentTable.value = false
// searchImplementationFileList(params).then(res => {
// if (res.code === 1000) {
// if(tag == 'all'&&flag){
// // allFiles.value = res.data.fileList
// }else{
// otherAttachmentList.value =res.data.fileList
// }
if (flag) {
getTagsOption(flag)
}
nextTick(() => {
showAttachmentTable.value = true
})
// }
// })
}
const getLocalList = () => {
if (localStorage.getItem(`implementAllFileList-${route.query.projectId}`) && JSON.parse(localStorage.getItem(`implementAllFileList-${route.query.projectId}`))) {
return JSON.parse(localStorage.getItem(`implementAllFileList-${route.query.projectId}`))
} else {
return []
}
}
const getAttachmentList = () => {
const loading = ElLoading.service({fullscreen: true})
let params = {
targetId: route.query.projectId,
targetState: "30"
}
showAttachmentTable.value = false
searchImplementationFileList(params).then(res => {
if (res.code === 1000) {
otherAttachmentList.value = [...res.data.fileList, ...getLocalList()]
allFiles.value = [...res.data.fileList, ...getLocalList()]
uploadState.value = res.data.upload
getTagsOption()
nextTick(() => {
showAttachmentTable.value = true
})
activeName.value = 'all'
loading.close()
} else {
ElNotification({
title: '提示',
message: res.msg,
type: 'error'
})
loading.close()
}
})
}
const getTagsOption = (flag) => {
if (!route.query.projectId) return
getTagList(route.query.projectId).then(res => {
if (res.code === 1000) {
tagsOption.value = res.data.rows
let list = []
if (flag) {
list = allFiles.value
} else {
list = otherAttachmentList.value
}
tagsOption.value.forEach((tag, index) => {
// const filterArray = list.filter(item => tag.fileTag == item.tag)
// console.log("🚀 ~ file:filterArray ", filterArray)
tagsOption.value[index].isClose = 1
// tagsOption.value[index].isClose = filterArray.length > 0 ? 0 : 1
})
console.log("🚀 otherAttachmentList.value", allFiles.value)
console.log("🚀 ~ file:\tagsOption.value ", tagsOption.value)
let defaultArray = [
{
tagId: 'd1',
fileTag: '合同(专项任务书)',
isDefault: 1,
isClose: 2
},
{
tagId: 'd2',
fileTag: '周报',
isDefault: 1,
isClose: 2
},
{
tagId: 'd3',
fileTag: '阶段性验收',
isDefault: 1,
isClose: 2
},
{
tagId: 'd4',
fileTag: '科研成果',
isDefault: 1,
isClose: 2
}
]
tagsOption.value = [...defaultArray, ...tagsOption.value]
// if (!res.data.rows || res.data.rows.length == 0) return;
// activeName.value=res.data.rows[0].tagId
} else {
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'
}
})
}
getAttachmentList()
onActivated(() => {
getAttachmentList()
})
</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 lang="scss">
:deep(.el-dialog__body) {
padding: 0 !important;
}
.tag-title {
display: flex;
align-items: center;
margin-top: 15px;
> div {
margin-right: 5px;
width: 4px;
height: 20px;
background-color: #BEA266;
}
}
:deep(.el-table--fit ) {
height: 311px !important;
}
:deep(.el-tabs__nav) {
//width: 75vw;
}
:deep(.el-tabs__item) {
flex: none !important;
}
:deep(.el-tabs__header) {
margin-bottom: 0;
}
:deep(.el-tabs__item.is-active) {
color: #BEA266;
}
:deep(.el-tabs__active-bar) {
background-color: #BEA266;
}
.file-tag {
width: 100%;
display: flex;
border-bottom: 2px solid #f6f6f6;
/*align-items: center;*/
}
</style>

View File

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

View File

@@ -1,155 +1,153 @@
<template>
<div class="detail-block" v-loading="loading">
<baseTitle title="需求上报信息"></baseTitle>
<el-form :model="localFormData" ref="summaryForm" :rules="rules">
<el-row gutter="50">
<el-col :span="8">
<el-form-item label="项目名称" prop="projectName">
<span>{{ localFormData.projectName }}</span>
</el-form-item>
</el-col>
<el-col :span="8">
<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>-->
<baseTitle title="预期知识产权"></baseTitle>
<el-row gutter="20" style="margin-bottom: -18px;margin-left: 5px">
<!-- <el-col :span="6">-->
<!-- <el-form-item label="预期成果形式" prop="resultForm">-->
<!-- <span>{{ filterDict(cacheStore.getDict('result_form'), localFormData.resultForm) }}</span>-->
<!-- </el-form-item>-->
<!-- </el-col>-->
<el-col :span="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-col :span="6">
<el-form-item label="知识产权归属" prop="intellectualProperty">
<span>{{
filterDict(cacheStore.getDict('intellectual_property'), localFormData.intellectualProperty)
}}</span>
</el-form-item>
</el-col>
<el-col :span="16">
<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">
<span>{{ localFormData.inventionPatent }}</span>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="实用性新型专利(项)" prop="newPatent">
<el-col :span="6">
<el-form-item label="预估专利(项)" prop="newPatent">
<span>{{ localFormData.newPatent }}</span>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="软件著作权(项)" prop="softwareCopyright">
<el-col :span="6">
<el-form-item label="预估软件著作权(项)" prop="softwareCopyright">
<span>{{ localFormData.softwareCopyright }}</span>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="著作权(项)" prop="copyright">
<span>{{ localFormData.copyright }}</span>
<el-col :span="6">
<el-form-item label="预估技术标准(项)" prop="technicalNorms">
<span>{{ localFormData.technicalNorms }}</span>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="其他(项)" prop="other">
<span>{{ localFormData.other }}</span>
<el-col :span="6">
<el-form-item label="预估新产品(项)" prop="newProduct">
<span>{{ localFormData.newProduct }}</span>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="经济预算(元)" prop="economicEstimate">
<span>{{ toThousands(localFormData.economicEstimate) }}</span>
<el-col :span="6">
<el-form-item label="预估新工艺(项)" prop="newProcess">
<span>{{ localFormData.newProcess }}</span>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="其中申请公司总部科技创新专项资金(元)" prop="specialFundAmount"
v-if="localFormData.isSpecialFund">
<span>{{ toThousands(localFormData.specialFundAmount) }}</span>
<el-col :span="6">
<el-form-item label="预估新装置(项)" prop="newDevice">
<span>{{ localFormData.newDevice }}</span>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="预估新材料(项)" prop="newMaterials">
<span>{{ localFormData.newMaterials }}</span>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="预估计算机软件(项)" prop="computerSoftware">
<span>{{ localFormData.computerSoftware }}</span>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="预估论文论著(项)" prop="thesis">
<span>{{ localFormData.thesis }}</span>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="预估研究报告(项)" prop="researchReport">
<span>{{ localFormData.researchReport }}</span>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="预估商标(项)" prop="trademark">
<span>{{ localFormData.trademark }}</span>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="预估其他(项)" prop="other">
<span style="white-space: pre-wrap">{{ localFormData.other }}</span>
</el-form-item>
</el-col>
</el-row>
<baseTitle title="项目描述"></baseTitle>
<el-row gutter="20" style="margin-left: 5px;margin-bottom: -18px;">
<el-col :span="24">
<el-form-item label="现有业务描述" prop="serviceDescription">
<span>{{ localFormData.serviceDescription }}</span>
<span style="white-space: pre-wrap">{{ localFormData.serviceDescription }}</span>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="研发项目关键内容描述" prop="contentDescription">
<span>{{ localFormData.contentDescription }}</span>
<el-form-item label="建设目标描述" prop="contentDescription">
<span style="white-space: pre-wrap">{{ localFormData.contentDescription }}</span>
</el-form-item>
</el-col>
<el-col :span="24">
<baseTitle title="需求上报申请书"></baseTitle>
</el-col>
<el-col :span="24">
<el-form-item>
<el-button type="primary" link @click="handleDownload(localFormData.singleFile)" style="font-size: 16px">
{{ localFormData.singleFile?.originalFileName }}
</el-button>
</el-form-item>
</el-col>
<el-col :span="24">
<baseTitle title="附件列表"></baseTitle>
</el-col>
<el-col :span="24">
</el-row>
<baseTitle title="需求上报申请书" style="margin-bottom: -3px;"></baseTitle>
<!-- <el-row gutter="20" style="margin-bottom: -15px;">-->
<!-- <el-col :span="24">-->
<!-- <single-file-component tag="需求上报" v-model:value="localFormData.singleFile" :processViewer="processViewer"/>-->
<!-- &lt;!&ndash; <el-form-item>&ndash;&gt;-->
<!-- &lt;!&ndash; {{localFormData.singleFile}}&ndash;&gt;-->
<!-- &lt;!&ndash; <el-button type="primary" link @click="handleDownload(localFormData.singleFile)" style="font-size: 16px">&ndash;&gt;-->
<!-- &lt;!&ndash; {{ localFormData.singleFile?.originalFileName }}&ndash;&gt;-->
<!-- &lt;!&ndash; </el-button>&ndash;&gt;-->
<!-- &lt;!&ndash; </el-form-item>&ndash;&gt;-->
<!-- </el-col>-->
<!-- </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="需求上报"
v-model:value="localFormData.fileList" :processViewer="processViewer"
:file-list-show="fileListShow"/>
</el-col>
<el-col :span="24">
<div v-if="data.taskId||data.state==='4'">
<el-col :span="24" style="margin-top: -15px">
<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>
<el-form-item prop="_value">
<el-input
@@ -163,7 +161,7 @@
</el-col>
</el-row>
<div class="approval-record">
<div class="approval-title">
<div class="approval-title" style="margin-top: -12px">
<baseTitle title="审批记录"></baseTitle>
<div class="diagram">
<div class="base-title">流程图</div>
@@ -172,6 +170,9 @@
style="--el-switch-on-color:#BEA266 ; --el-switch-off-color:#cecdcd"
/>
</div>
<el-button color="#DED0B2" style="margin-left: 10px"
@click="handleCarbonCopy()">立即抄送
</el-button>
</div>
<div class="process">
<operation-render v-if="processViewer && data.operationList && data.operationList.length > 0&&!changeDiagram"
@@ -182,6 +183,10 @@
</div>
</div>
</el-form>
<user-picker :multiple="true" ref="carbonCopyUserRef" title="请选择抄送人员"
v-model:value="carbonCopyUserList" @ok="carbonCopyUserPickerOk"
@cancelOrClear="carbonCopyUserPickerOk"/>
<div class="oper-page-btn" v-perm="['annual:plan:approve']" v-if="data.state==='4'">
<el-button type="danger" @click="handleRejectPlan">驳回年度计划</el-button>
<el-button color="#DED0B2" @click="handleAgreePlan">通过年度计划</el-button>
@@ -201,8 +206,11 @@ import {getSubCompOpt} from "@/api/user/user";
import FileComponent from "./FileComponent.vue";
import {ElNotification} from "element-plus";
import {approvePlan} from "@/api/project-demand/summary";
import SelectPreProcess from "@/components/SelectPreProcess.vue";
import {applyCcSend} from "@/api/expense-manage";
import UserPicker from "@/views/workflow/process/common/UserPicker.vue";
const emit = defineEmits(['update:value'])
const emit = defineEmits(['update:value','ccSend'])
const tagsViewStore = useTagsView()
const cacheStore = useCacheStore()
const props = defineProps({
@@ -240,6 +248,8 @@ const router = useRouter()
const fundOption = ref([])
const companyOption = ref([])
const dictName = ref({})
const carbonCopyUserList = ref([])
const carbonCopyUserRef = ref()
const rules = reactive({
auditOpinion: [{required: true, message: '请输入审核意见', trigger: 'blur'}],
})
@@ -251,6 +261,39 @@ const _value = computed({
emit("update:value", val);
}
})
const handleCarbonCopy = () => {
carbonCopyUserRef.value.showUserPicker()
}
const carbonCopyUserPickerOk = (userList) => {
carbonCopyUserList.value = userList.map(item => item.id)
console.log('localFormData.value', props.data)
console.log("🚀 ~ file:'carbonCopyUserList.value ", carbonCopyUserList.value)
addUser()
}
const addUser = async () => {
const res = await applyCcSend({
instanceId: props.data.processInstanceId,
projectId: route.query.projectId,
state: route.query.step,
userIds: carbonCopyUserList.value
})
console.log('res', res)
if (res.code === 1000) {
ElNotification({
title: '提示',
message: '抄送成功',
type: 'success'
})
emit('ccSend')
} else {
ElNotification({
title: '提示',
message: res.msg,
type: 'error'
})
}
}
const handleRejectPlan = async () => {
// const values = form.value.getValues()
// console.log('route',route.query.projectId)
@@ -263,9 +306,9 @@ const handleRejectPlan = async () => {
return
}
const params = {
auditOpinion:_value.value,
projectId:parseInt(route.query.projectId),
state:false
auditOpinion: _value.value,
projectId: parseInt(route.query.projectId),
state: false
}
// console.log('params', params)
const res = await approvePlan(params)
@@ -280,12 +323,21 @@ const handleRejectPlan = async () => {
})
}
const handleAgreePlan = async () => {
const params = {
auditOpinion:_value.value,
projectId:parseInt(route.query.projectId),
state:true
if (!_value.value) {
ElNotification({
title: '提示',
message: '请填写审核意见',
type: 'warning'
})
return
}
// console.log('params', params)
const params = {
auditOpinion: _value.value,
projectId: parseInt(route.query.projectId),
preProcess: JSON.stringify(localFormData.value.preProcess),
state: true
}
const res = await approvePlan(params)
ElNotification({
title: '提示',
@@ -355,6 +407,7 @@ watch(() => props.loading, (newVal) => {
}, {deep: true})
watchEffect(() => {
props.formData.singleFile = [props.formData.singleFile]
return Object.keys(props.formData).length && (localFormData.value = props.formData)
})
@@ -365,6 +418,25 @@ getFundOptions()
.detail-block {
overflow-x: hidden;
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>

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

@@ -1,13 +1,14 @@
<template>
<el-upload :file-list="_value"
:action="uploadFileUrl"
<el-upload :file-list="_value" ref="uploadRef"
action="#"
:headers="headers"
:limit="maxSize"
with-credentials
:multiple="multiple"
:data="uploadParams"
:data="uploadParams" :on-change="handleChange"
:http-request="customUpload"
:show-file-list="showFileList"
:auto-upload="true"
:auto-upload="false"
:before-upload="beforeUpload"
:on-success="handleUploadSuccess"
:on-error="uploadError"
@@ -19,16 +20,20 @@
</template>
<script setup>
import { ElMessageBox, ElNotification} from "element-plus";
import {ElLoading, ElMessage, ElMessageBox, ElNotification} from "element-plus";
import {getToken} from '@/utils/auth'
import {nextTick} from "vue";
import axios from "axios";
const baseURL = import.meta.env.VITE_BASE_URL
const uploadFileUrl = ref(baseURL + "/workflow/process/file/upload")
const headers = reactive({
'Content-Type': 'multipart/form-data',
authorization: getToken()
})
const loading = ref(false)
const showTable = ref(false)
const uploadIndex = ref(0)
const uploadParams = ref({})
const props = defineProps({
value: {
@@ -39,7 +44,7 @@ const props = defineProps({
},
maxSize: {
type: Number,
default: 30
default: 999999
},
showFileList: {
type: Boolean,
@@ -54,8 +59,9 @@ const props = defineProps({
default: true
}
})
const emit = defineEmits(["input", "getFile", "delete"])
const uploadRef = ref(null); // el-upload 的 ref
const uploadPromises = ref([]); // 跟踪每个文件的上传状态
const emit = defineEmits(["input", "beforeUpload","getFile", "delete"])
const fileList = ref([])
const _value = computed({
get() {
@@ -73,9 +79,79 @@ const beforeRemove = (file) => {
}).then(() => true)
}
const uploadLoading = ref(false)
const uploadFile = ref([])
const handleRemove = (file) => {
emit("delete", file.response.data.id)
}
// 文件选择变化时触发
const handleChange = (file, files) => {
console.log(file, files,'files')
uploadIndex.value++
uploadFile.value.push(file)
};
watch(() => uploadIndex.value, (newVal) => {
console.log('newVal',newVal)
startUpload(uploadFile.value); // 自动触发上传
},{
deep: true
})
// 自定义上传逻辑
const customUpload = async (options) => {
const formData = new FormData();
formData.append('file', options.raw);
try {
const response = await axios.post(uploadFileUrl.value, formData, {
headers: headers,
});
fileList.value.push(response.data.data)
emit("getFile", response.data.data)
return response.data; // 成功时返回响应
} catch (error) {
throw new Error('上传失败'); // 失败时抛出错误
}
};
// 触发所有文件上传
const startUpload = (files) => {
uploadLoading.value= ElLoading.service({
fullscreen: true,
text: '文件上传中...',
})
if (files.length === 0) {
return; // 没有文件时直接返回
}
uploadPromises.value = []; // 重置 Promise 数组
files.forEach((file) => {
// 触发每个文件的上传
const promise = new Promise((resolve, reject) => {
customUpload(file).then(resolve)
.catch(reject);
});
uploadPromises.value.push(promise);
});
// 使用 Promise.all 监听所有文件上传完成
Promise.all(uploadPromises.value)
.then(() => {
ElNotification({
title: '提示',
message: '所有文件上传完成!',
type: 'success'
})
files = []; // 清空文件列表
uploadRef.value.clearFiles(); // 清空上传组件
nextTick(() => {
uploadLoading.value.close()
uploadLoading.value=null
})
})
};
const beforeUpload = () => {
loading.value = true
return true

View File

@@ -0,0 +1,114 @@
<template>
<el-upload :file-list="[]"
:limit="maxSize"
with-credentials
:multiple="multiple"
:http-request="httpRequestHandle"
:data="uploadParams"
:auto-upload="true"
:show-file-list="false"
:before-upload="beforeUpload"
:before-remove="beforeRemove"
:on-remove="handleRemove"
>
<el-button color="#DED0B2" style="margin-right: 10px;" :disabled="disabled">导入</el-button>
</el-upload>
</template>
<script setup>
import {ElMessageBox, ElNotification} from "element-plus";
import {getToken} from '@/utils/auth'
import axios from "axios";
const props = defineProps({
value: {
type: Array,
default: () => {
return []
}
},
maxSize: {
type: Number,
default: 30
},
disabled: {
type: Boolean,
default: false
},
multiple: {
type: Boolean,
default: false
},
})
const baseURL = import.meta.env.VITE_BASE_URL
const uploadFileUrl = ref(baseURL + "/workflow/mosr/rd/expense/import")
const headers = reactive({
authorization: getToken()
})
// const loading = ref(false)
const uploadParams = ref({})
const emit = defineEmits(["input", "getFile", "delete"])
const beforeRemove = (file) => {
return ElMessageBox.confirm(`确认删除名称为${file.name}的文件吗?`, '系统提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => true)
}
const handleRemove = (file) => {
emit("delete", file.response.data.id)
}
const beforeUpload = () => {
// loading.value = true
return true
}
const httpRequestHandle = (param) => {
let file = param.file
axios.post(uploadFileUrl.value, {
file: file
}, {
headers: {
'Content-Type': 'multipart/form-data',
...headers
}
}).then(res => {
handleUploadSuccess(res)
}).catch(error => {
uploadError(error)
})
}
const handleUploadSuccess = (res) => {
let data = res.data
ElNotification({
title: '提示',
message: data.code === 1000 ? '上传成功' : '上传失败',
type: data.code === 1000 ? 'success' : 'error'
})
emit("success")
}
const uploadError = (error) => {
console.log("🚀 ~ file:'error ", error.response.data.msg)
// loading.value = false
ElNotification({
title: '提示',
message: error.response.data.msg,
type: 'error'
})
}
defineExpose({
handleRemove
})
</script>
<style lang="scss" scoped>
a {
font-size: 14px;
color: #2a99ff;
}
</style>

View File

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

View File

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

View File

@@ -1,7 +1,7 @@
<template>
<div style="display: flex;justify-content: center">
<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>
</div>
</template>
@@ -21,37 +21,43 @@ const props = defineProps({
default: null
}
});
const tag = reactive({
const tagConfig = reactive({
listClass: "green",
isType: true,
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) {
tag.value = data.find(item => item.value == value)
const filterDictClass = (data, 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) => {
if(!data) return
if(data instanceof Array) {
tag.value = data.find(item => item.value == value)
if (!data || value == null) return '未知'
if (data instanceof Array) {
if (value == true || value == false) {
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 = {}
}
} else {
tagConfig.value = data.find(item => item.value == value)
}
}
return tag.value.label
return tagConfig.value?.label || '未知'
}
/**
* 根据接口返回的listClass切换成对应的颜色

View File

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

View File

@@ -1,11 +1,21 @@
<template>
<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-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 label="标签" prop="tag" v-if="type==='40'">
<el-select v-model="attachment.tag" placeholder="请选择标签" clearable filterable style="width: 300px">
<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-option
v-for="item in tagsOption"
:key="item.value"
@@ -17,17 +27,19 @@
<el-form-item>
<el-button @click="handleSearch" color="#DED0B2">搜索</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>
<el-card style="width: 100%">
<fvTable style="width: 100%;max-height: 300px" v-if="showTable" height="300" :tableConfig="tableConfig"
<el-card style="width: 100%;overflow-y: hidden">
<fvTable style="width: 100%;max-height: 318px" v-if="showTable" height="318" :tableConfig="allFile?tableConfigAll:tableConfig"
:data="fileList" :isSettingCol="false" :pagination="false">
<template #empty>
<el-empty :image-size="99" description="暂无数据" style="padding: 0"/>
</template>
</fvTable>
</el-card>
<file-preview ref="filePreviewRef" v-if="filePreviewShow" :fileName="filePreviewParam.fileName" :fileUrl="filePreviewParam.fileUrl"
:fileType="filePreviewParam.fileType"/>
</div>
</template>
@@ -35,10 +47,12 @@
import {downloadFile} from "@/api/project-demand";
import {ElNotification} from "element-plus";
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 router = useRouter()
const cacheStore = useCacheStore()
const attachment = reactive({})
const emit = defineEmits(['search','update:modelValue'])
const props = defineProps({
@@ -57,19 +71,92 @@ const props = defineProps({
loading: {
type: Boolean,
default: true
},
allFile: {
type: Boolean,
default: false
}
})
const tagsOption = ref([])
const tableConfig = reactive({
columns: [
{
prop: 'originalFileName',
label: '附件名称',
prop: 'index',
type: 'index',
label: '序号',
align: 'center',
width:85,
},
{
prop: 'originalFileName',
label: '文件名',
align: 'center',
currentRender: ({row, index}) => (<div style="color: #2a99ff;cursor: pointer;" onClick={()=>clickToPreview(row)}>{row.originalFileName}</div>)
},
{
prop: 'tag',
label: '标签',
label:'标签',
align: 'center'
},
{
prop: 'size',
label: '文件大小',
align: 'center',
currentRender: ({row, index}) => (parseInt(row.size / 1024) + 'KB')
},
{
prop: 'createTime',
label: '上传时间',
align: 'center',
},
{
prop: 'oper',
label: '操作',
align: 'center',
showOverflowTooltip: false,
currentRender: ({row, index}) => {
return (
<div>
<el-button type="primary" link onClick={() => handleDownload(row)}>下载</el-button>
</div>
)
}
}
]
})
const tableConfigAll = reactive({
columns: [
{
prop: 'index',
type: 'index',
label: '序号',
align: 'center',
width:85,
},
{
prop: 'originalFileName',
label: '文件名',
align: 'center',
currentRender: ({row, index}) => (<div style="color: #2a99ff;cursor: pointer;" onClick={()=>clickToPreview(row)}>{row.originalFileName}</div>)
},
{
prop: 'targetState',
label:'项目阶段',
align: 'center',
showOverflowTooltip: false,
currentRender: ({row, index}) => {
if (row.targetState&&row.targetState !== null&&row.targetState!==undefined) {
return (<Tag dictType={'archive_file_type'} value={row.targetState}/>)
} else {
return '--'
}
}
},
{
prop: 'tag',
label:'标签',
align: 'center'
},
{
@@ -107,6 +194,23 @@ const _value = computed({
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 = () => {
if (!route.query.id) return
getTags(route.query.id).then(res => {
@@ -126,6 +230,7 @@ const handleSearch = () => {
}
const handleReset=()=>{
attachment.fileName=''
attachment.targetState=''
attachment.tag=null
emit('search', {})
}
@@ -151,12 +256,12 @@ watch(() => props.fileList, (val) => {
})
props.fileList = val
})
if (props.type === '40') {
if (props.type === '30') {
getTagsOption()
}
onActivated(()=>{
if (props.type === '40') {
if (props.type === '30') {
getTagsOption()
}
handleSearch()
@@ -164,5 +269,7 @@ onActivated(()=>{
</script>
<style scoped>
:deep(.el-table--fit ) {
height: 318px !important;
}
</style>

View File

@@ -0,0 +1,226 @@
<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"
:selectable="checkSelectable"/>
<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 originalProcess = ref([])
const currentList = ref([])
const showPreTable = ref(false)
const selectRows = ref([])
const preProcessList = ref([])
const total = ref(0)
const preProcessTable = ref()
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 checkSelectable=(row)=>{
const detailProcessStr = localStorage.getItem('detailProcess');
let preProcessArray = []
if (detailProcessStr) {
try {
preProcessArray = JSON.parse(detailProcessStr)
} catch (e) {
preProcessArray=[]
}
if (preProcessArray&&preProcessArray.length > 0) {
for (let i = 0; i < preProcessArray.length; i++) {
return preProcessArray[i].requestId !== row.requestId;
}
}else{
return true
}
}
}
const handleShowPreTable = () => {
showPreTable.value = true
nextTick(() => {
localFormData.value.preProcess?.forEach((item) => {
if (preProcessTable.value) {
preProcessTable.value.toggleRowSelection(item, true)
}
})
})
getPreProcessList()
}
const handleCancel = () => {
showPreTable.value = false
}
const choosePreProcess = () => {
let preProcessObj = {}
let preProcessArray = []
const detailProcessStr = localStorage.getItem('detailProcess');
try {
originalProcess.value = JSON.parse(detailProcessStr)
} catch (e) {
originalProcess.value=[]
}
selectRows.value.forEach((item) => {
const exists = originalProcess.value?.some(dp => dp.requestId === item.requestId)
if (!exists) {
preProcessObj = {
requestId: item.requestId,
requestName: item.requestName,
baseUrl: item.baseUrl
}
preProcessArray.push(preProcessObj)
}
})
if(props.formData.mode === 'view'||props.formData.mode === 'resubmit'){
localFormData.value.preProcess = [...originalProcess.value,...preProcessArray]
}else{
localFormData.value.preProcess = preProcessArray
}
localStorage.setItem('preProcess', JSON.stringify(preProcessArray))
showPreTable.value = false
}
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)
}
})
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-item label="标签名称" prop="tagName">
<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
v-for="item in tagsOption"
:key="item.label"
@@ -16,7 +16,7 @@
<baseTitle title="其他文件"></baseTitle>
<el-card style="width: 100%;margin: 15px 0">
<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">
<template #empty>
<el-empty :image-size="55" description="暂无数据" style="padding: 0"/>
@@ -59,7 +59,7 @@ const tableConfig = reactive({
},
{
prop: 'originalFileName',
label: '件名',
label: '件名',
align: 'center',
},
{

View File

@@ -1,5 +1,5 @@
<template>
<div class="tinymce-boxz">
<div class="tinymce-boxz" style="width: 100%">
<Editor v-model="content" :init="init"/>
</div>
</template>
@@ -8,7 +8,7 @@
import tinymce from 'tinymce'
import Editor from "@tinymce/tinymce-vue";
import {defineProps} from "vue";
import {ElMessage} from "element-plus";
import {ElLoading, ElMessage, ElNotification} from "element-plus";
import {getToken} from '@/utils/auth'
import axios from "axios";
@@ -36,8 +36,9 @@ import 'tinymce/plugins/insertdatetime'
import 'tinymce/plugins/lists'
import 'tinymce/plugins/wordcount'
import 'tinymce/plugins/autosave'
import '@/assets/axupimgs/plugin.js'//多图上传插件
const emit = defineEmits(['update:value'])
const emit = defineEmits(['update:value','getFiles'])
const props = defineProps({
//默认值
value: {
@@ -55,7 +56,7 @@ const props = defineProps({
plugins: {
type: [String, Array],
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: {
type: [String, Array],
@@ -68,15 +69,16 @@ const props = defineProps({
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;"
},
width:{
width: {
type: String,
default: 'auto'
},
height:{
height: {
type: Number,
default: 500
}
})
const fileLists=ref([])
const content = ref(props.value);
const imgUrl = ref();
// const apiKey = reactive("v4zo4n22oanvco29ws5drh0pecuf3gh53clx53cccj3grjwg");
@@ -88,21 +90,21 @@ const init = reactive({
placeholder: "在这里输入文字", //textarea中的提示信息
min_width: 300,
min_height: 200,
width:props.width,
width: props.width,
height: props.height, //注引入autoresize插件时此属性失效
resize: "both", //编辑器宽高是否可变false-否,true-高可变,'both'-宽高均可,注意引号
promotion: false,
branding: false, //tiny技术支持信息是否显示
// statusbar: false, //最下方的元素路径和字数统计那一栏是否显示
// elementpath: false, //元素路径是否显示
statusbar: false, //最下方的元素路径和字数统计那一栏是否显示
elementpath: false, //元素路径是否显示
font_formats: props.fontFormats, //字体样式
plugins: props.plugins, //插件配置 axupimgs indent2em
toolbar: props.toolbar, //工具栏配置设为false则隐藏
// menubar: "file edit my1", //菜单栏配置设为false则隐藏不配置则默认显示全部菜单也可自定义配置--查看 http://tinymce.ax-z.cn/configure/editor-appearance.php --搜索“自定义菜单”
// images_upload_url: '/apib/api-upload/uploadimg', //后端处理程序的url建议直接自定义上传函数image_upload_handler这个就可以不用了
menubar: "file edit view format table tools", //菜单栏配置设为false则隐藏不配置则默认显示全部菜单也可自定义配置--查看 http://tinymce.ax-z.cn/configure/editor-appearance.php --搜索“自定义菜单”
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
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) {
editor.on('change', function (e) {
@@ -115,11 +117,16 @@ const init = reactive({
let formData = new FormData()
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) => {
// console.log('callback, value, meta',callback, value, meta)
// 使用案例http://tinymce.ax-z.cn/general/upload-images.php
// meta.filetype //根据这个判断点击的是什么file image media
let filetype; //限制文件的上传类型,需要什么就添加什么的后缀
@@ -137,16 +144,62 @@ const init = reactive({
inputElem.click();
inputElem.onchange = () => {
let file = inputElem.files[0]; //获取文件信息
let reader = new FileReader();
reader.readAsDataURL(file);
reader.onload = function () {
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});
let xhr, formData;
xhr = new XMLHttpRequest();
xhr.withCredentials = false;
xhr.open('POST', import.meta.env.VITE_BASE_URL + props.imageUrl);
xhr.setRequestHeader(
'Authorization', getToken()
)
let loading = ElLoading.service({
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()
console.log("🚀 ~ file:res.data ", res.data)
res.data.originalFileName=res.data.originalFilename
console.log("🚀 ~ file:'meta.filetype ",meta.filetype )
if (res && res.data && res.data.fileType &&
!["png", "jpg", "jpeg","gif", "svg","ico"].includes(res.data.fileType.toLowerCase())){
fileLists.value.push(res.data)
emit('getFiles',fileLists.value)
}
const fileUrl = res.data.url;
// '?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 +207,16 @@ const init = reactive({
watch(() => {
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(
import.meta.env.VITE_BASE_URL + url,
formData,
@@ -171,18 +233,48 @@ const uploadFile = (formData, url,success) => {
let data = res.data
if (data.code !== 1000) {
ElMessage.error(data.msg)
}else {
success(data.data.url)
if (loading) {
loading.close()
}
} else {
if (isLoading) {
success(data.data.url)
} else {
success(data.data.url, data.data.originalFilename)
}
if (loading) {
loading.close()
}
}
})
}
</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 {
display: none;
}
</style>
<style>
<style lang="scss">
/* 隐藏apikey没有绑定当前域名的提示 */
.tox-notifications-container .tox-notification--warning {
display: none !important;

View File

@@ -5,7 +5,7 @@
placement="bottom-start"
: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">
<slot name="content">{{ props.content }}</slot>
</span>
@@ -25,15 +25,26 @@ const props = defineProps({
lines: {
type: Boolean,
default: false
}
},
textAlign: {
type: String,
default: ''
},
})
const contentRef = ref()
const isShow = ref(false)
const isShowTooltip = () => {
isShow.value = props.width > contentRef.value.offsetWidth;
isShow.value = parseInt(props.width) > contentRef.value.offsetWidth;
}
</script>
<style>
<style scoped>
.left-content{
width: 45px;
text-align: left;
text-overflow: ellipsis;
white-space: nowrap;
overflow: hidden;
}
.content {
width: 45px;
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>
<baseTitle title="公司详情"></baseTitle>
<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>
<script setup>
import {getCompanyDetail} from "@/api/subsidiary";
<script setup lang="jsx">
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({
value:{
type:String,
@@ -12,6 +16,12 @@ const props=defineProps({
}
})
const form = ref()
const presidentName = ref()
const presidentIds = ref()
const generalManagerName = ref()
const presidentNamePicker = ref()
const generalManagerNamePicker = ref()
const generalManagerIds = ref()
const schema = reactive([
{
label: '公司名称:',
@@ -21,6 +31,17 @@ const schema = reactive([
label: '公司编码:',
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: '创建时间:',
prop: 'createTime'
@@ -35,10 +56,62 @@ const _value = computed({
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 { 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()

View File

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

View File

@@ -1,43 +1,81 @@
<template>
<baseTitle title="基础信息"></baseTitle>
<fvForm :schema="schema" @getInstance="(e)=>baseForm = e"></fvForm>
<div class="steps-box">
<el-steps v-if="stepsShow" :active="localActive" finish-status="success">
<el-step
v-for="(item, index) in localSteps"
:key="item.key"
:title="item.title"
:class="stepClass(index)"
@click="handleStep(item.key, index)"
>
<template #icon>
<el-icon style="font-size: 20px;" :class="index == localActive ? 'is-active' : 'is-end'"
v-if="localStepSuccess.includes(index)">
<SuccessFilled/>
</el-icon>
<el-icon style="font-size: 20px; color: gray;" v-else>
<WarningFilled/>
</el-icon>
</template>
</el-step>
</el-steps>
</div>
<!-- 步骤内容 -->
<div>
<slot name="content" :localActive="localActive"></slot>
<!-- <template v-for="(item, index) in stepList" :key="item.key">
<component v-if="localActive == index" v-bind="item.props || {}" :is="item.component" />
</template> -->
<div style="padding: 0 30px" id="printBox">
<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">
<el-steps v-if="stepsShow" :active="localActive" finish-status="success">
<el-step
v-for="(item, index) in localSteps"
:key="item.key"
:title="item.title"
:class="stepClass(index)"
@click="handleStep(item.key, index)"
>
<template #icon>
<el-icon style="font-size: 20px;" :class="index == localActive ? 'is-active' : 'is-end'"
v-if="localStepSuccess.includes(index)">
<SuccessFilled/>
</el-icon>
<el-icon style="font-size: 20px; color: gray;" v-else>
<WarningFilled/>
</el-icon>
</template>
</el-step>
</el-steps>
</div>
<!-- 步骤内容 -->
<div>
<slot name="content" :localActive="localActive"></slot>
<!-- <template v-for="(item, index) in stepList" :key="item.key">
<component v-if="localActive == index" v-bind="item.props || {}" :is="item.component" />
</template> -->
</div>
</div>
</template>
<script setup lang="jsx">
import {ElLoading, ElNotification} from 'element-plus';
import {computed, onMounted, reactive, ref, watchEffect} from 'vue';
import {useRoute} from 'vue-router';
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({
// 步骤对应内容list
stepList: {
@@ -58,19 +96,29 @@ const props = defineProps({
reportType: {
type: String,
default: ''
},
//是否显示审批驳回按钮
taskId: {
type: String,
default: ''
},
//当项目详情是编辑模式时按钮位置
editShow: {
type: String,
default: ''
},
//当项目详情是提交模式还是重新提交时按钮位置
mode: {
type: String,
default: ''
}
})
const route = useRoute()
const emits = defineEmits(['stepChange', 'setDetail'])
const cacheStore = useCacheStore()
const emits = defineEmits(['stepChange', 'setDetail', 'openPrint'])
const localData = reactive({})
const localActive = ref(0) // 当前激活步骤
const stepsShow = ref(false)
const localSteps = ref([
{
title: '需求征集',
@@ -84,6 +132,10 @@ const localSteps = ref([
title: '项目立项',
key: 'approve',
},
{
title: '项目实施',
key: 'implement',
},
{
title: '项目验收',
key: 'execute',
@@ -97,46 +149,278 @@ const localSteps = ref([
// key: 'end',
// },
])
const baseForm = ref()
const baseFormData = ref([])
const schema = computed(() => {
return [
{
label: '承办单位',
prop: 'affiliatedCompany',
colProps: {
span: 6
}
},
{
label: '项目名称',
prop: 'projectName',
colProps: {
span: 8
span: 6
}
},
{
label: '开始时间',
prop: 'startTime',
colProps: {
span: 6
}
},
{
label: '征集公司',
prop: 'affiliatedCompany',
label: '结束时间',
prop: 'endTime',
colProps: {
span: 8
span: 6
}
},
{
label: '征集名称',
prop: 'requirementName',
label: '项目类型',
prop: 'projectType',
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: 'actualEconomicEstimate',
colProps: {
span: 6
},
component: () => (
<div>
{
baseFormData.value?.actualEconomicEstimate ?
<span>{toThousands(baseFormData.value?.actualEconomicEstimate)}</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: '征集描述',
prop: 'collectExplain',
label: '预估专项资金(元)',
prop: 'forecastSpecialFundAmount',
colProps: {
span: 24
span: 6
},
component: () => (
<div>
{
baseFormData.value?.forecastSpecialFundAmount ?
<span>{toThousands(baseFormData.value?.forecastSpecialFundAmount)}</span>
: <span>{'--'}</span>
}
</div>
)
},
{
label: '实际专项资金(元)',
prop: 'specialFundAmount',
colProps: {
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 handlePrint = (print) => {
emits('openPrint', print)
}
// 格式化详情步骤条
const formatProcedure = (data) => {
// console.info("🚀 ~method:formatProcedure -----", data)
let arr = []
if (data instanceof Array) {
data.forEach(item => {
@@ -148,12 +432,15 @@ const formatProcedure = (data) => {
case '20':
arr.push(1)
break
case '40':
case '30':
arr.push(2)
break
case '50':
case '40':
arr.push(3)
break
case '50':
arr.push(4)
break
}
} else {
switch (item) {
@@ -166,12 +453,15 @@ const formatProcedure = (data) => {
case '20':
arr.push(2)
break
case '40':
case '30':
arr.push(3)
break
case '50':
case '40':
arr.push(4)
break
case '50':
arr.push(5)
break
}
}
@@ -179,7 +469,31 @@ const formatProcedure = (data) => {
}
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) => {
let arr = []
@@ -195,12 +509,13 @@ const formatReProcedure = (data) => {
case 2:
arr.push('20')
break
// case 3: arr.push('30')
// break
case 3:
arr.push('40')
arr.push('30')
break
case 4:
arr.push('40')
break
case 5:
arr.push('50')
break
}
@@ -219,9 +534,9 @@ const formatActive = (val) => {
newVal == 0 && (active = '00')
newVal == 1 && (active = '10')
newVal == 2 && (active = '20')
// val == 3 && (active = '30')
newVal == 3 && (active = '40')
newVal == 4 && (active = '50')
newVal == 3 && (active = '30')
newVal == 4 && (active = '40')
newVal == 5 && (active = '50')
return active
}
@@ -245,9 +560,12 @@ const handleStep = (key, index) => {
active = '20'
break
case 2:
active = '40'
active = '30'
break
case 3:
active = '40'
break
case 4:
active = '50'
break
}
@@ -263,9 +581,12 @@ const handleStep = (key, index) => {
active = '20'
break
case 3:
active = '40'
active = '30'
break
case 4:
active = '40'
break
case 5:
active = '50'
break
}
@@ -286,7 +607,10 @@ const getBaseInfo = async () => {
try {
const {code, data} = await getBaseInfoApi(route.query.projectId)
// 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) {
data.procedure.push('40')
}
@@ -297,6 +621,8 @@ const getBaseInfo = async () => {
}
localStepSuccess.value = formatProcedure(data.procedure)
baseForm.value.setValues(data)
baseFormData.value = data
emits('getBasicData', data)
emits('setDetail', formatActive(localActive.value))
loading.close()
nextTick(() => {
@@ -322,7 +648,7 @@ watchEffect(() => {
if (props.reportType === 'direct') {
let steps = []
for (const step of localSteps.value) {
if (step.key !== 'collect'){
if (step.key !== 'collect') {
steps.push(step)
}
}
@@ -333,7 +659,7 @@ watchEffect(() => {
<style lang="scss" scoped>
.steps-box {
padding: 10px 0;
//padding: 10px 0;
}
.step-success {
@@ -359,4 +685,5 @@ watchEffect(() => {
:deep(.el-step__head.is-success) {
border-color: #A8abb2;
}
</style>

View File

@@ -11,12 +11,12 @@
v-bind="item.colProps || { span: 12}"
:key="item.prop"
>
<el-form-item
<el-form-item
v-bind="item"
:key="item.prop"
>
<template #default>
<component
<component
v-if="item.component"
:is="item.component"
v-bind="item.props || {}"
@@ -105,4 +105,4 @@ defineExpose({ getValues, setValues, validate, resetFields, formInstance, form }
<style lang="scss" scoped>
</style>
</style>

View File

@@ -5,6 +5,7 @@
label-width="auto"
ref="formInstance"
class="search-form"
@submit.prevent="getValues"
>
<el-row>
<el-col
@@ -24,12 +25,14 @@
v-on="item.on || {}"
v-model="form[item.prop]"
@keyup.enter.native="getValues"
@change="elChange"
>
</component>
</template>
</el-form-item>
</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-button v-if="searchConfig.length>=4" link type="primary" @click="showMore = !showMore">
{{ showMore ? '收起' : '展开' }}
@@ -49,6 +52,16 @@ const props = defineProps({
searchConfig: {
type: Array,
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)
})
const setForm=(prop,value)=>{
form.value[prop]=value
return form.value;
}
// 搜索功能表单元素默认值
// const setDefaultFormValues = () => {
// filterConfig.value.forEach(item => {
@@ -77,8 +93,17 @@ watchEffect(() => {
if (filterConfig.value.length) {
// setDefaultFormValues()
}
if(props.searchProp&&props.searchValue){
setForm(props.searchProp,props.searchValue)
}
})
const elChange = () => {
setTimeout(() => {
getValues()
}, 500)
}
const getValues = () => {
emits('search', form.value)
return form.value
@@ -110,4 +135,30 @@ onMounted(() => {
justify-content: space-evenly;
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>

View File

@@ -1,5 +1,8 @@
<template>
<div class="fv-table-container">
<el-button v-if="tableConfig.export && tableConfig.export.open&&changeExportPosition" @click="exportTable" color="#DED0B2"
style="float: left;margin-right: 10px">导出
</el-button>
<!-- 表格头部按钮 -->
<div class="fv-table-btn" v-if="tableConfig.btns">
<div class="table-head-btn">
@@ -15,11 +18,11 @@
</el-button>
</div>
</div>
<el-button v-if="tableConfig.export && tableConfig.export.open&&!changeExportPosition" @click="exportTable" color="#DED0B2"
style="margin-bottom: 10px">导出
</el-button>
<!-- 列显示配置 -->
<div v-if="isSettingCol" style="float: right">
<el-button v-if="tableConfig.export && tableConfig.export.open" @click="exportTable" color="#DED0B2"
style="margin-bottom: 10px">导出
</el-button>
<el-tooltip effect="dark" content="列配置" placement="bottom">
<el-button ref="buttonRef" link>
<el-icon size="18">
@@ -59,7 +62,6 @@
v-loading="localData.loading"
:row-key="tableConfig?.rowKey || 'id'"
v-bind="$attrs"
table-layout="auto"
:show-overflow-tooltip="true"
highlight-current-row
@selection-change="selectionChange"
@@ -122,6 +124,11 @@ const props = defineProps({
type: Boolean,
default: true
},
//是否改变导出位置, 导出在btns前面
changeExportPosition: {
type: Boolean,
default: false
},
// 是否显示列配置
isSettingCol: {
type: Boolean,

View File

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

View File

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

View File

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

View File

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

View File

@@ -35,11 +35,6 @@ const router = createRouter({
name: 'specialFundDetailMobile',
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',
name: 'projectDemandRequirementMoblie',
@@ -195,6 +190,24 @@ const router = createRouter({
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,9 +37,11 @@ export const usePermisstionStroe = defineStore('permisstion', () => {
if (res.code === 1000) {
const sRouter = JSON.parse(JSON.stringify(res.data))
const mData = JSON.parse(JSON.stringify(res.data))
console.log(JSON.parse(JSON.stringify(sRouter)), 'sRouter');
const firstFormat = setRouterLevel(JSON.parse(JSON.stringify(sRouter)))
console.log(firstFormat, 'firstFormat');
asyncRouters.value = formatAsyncRouters(JSON.parse(JSON.stringify(firstFormat)))
console.log('asyncRouters.value',firstFormat);
menuList.value = [...menuList.value, ...generateMenu(mData)]
addAsyncRouters(asyncRouters.value)
isLoadRoutes.value = false
@@ -52,16 +54,23 @@ export const usePermisstionStroe = defineStore('permisstion', () => {
}
const setRouterLevel = (routers) => {
return routers.filter(item=>{
if(item.component === 'Layout') {
if(item.children) {
// console.log("🚀 ~ file: item.children ", item.children )
item.children.forEach(v=>{
if(v.children) {
slRouters.value = [...toRaw(slRouters.value), ...v.children]
delete v.children
// console.log("🚀 ~ file:item.children",item.children)
// console.log("🚀 ~ file: v.children ", v.children )
// slRouters.value = [ ...toRaw(v.children)]
// delete v.children
// slRouters.value = [ ...v.children]
// return v.children
item.children = [...item.children,...v.children]
}
})
item.children = [...item.children, ...toRaw(slRouters.value)]
}
}
return true
@@ -81,6 +90,7 @@ export const usePermisstionStroe = defineStore('permisstion', () => {
}
if (route.children !== null && route.children && route.children.length !== 0) {
route.children = formatAsyncRouters(route.children)
}
return true
})
@@ -90,6 +100,8 @@ export const usePermisstionStroe = defineStore('permisstion', () => {
routers.forEach(route => {
router.addRoute(route)
})
console.log("🚀 ~ file: ", routers)
}
const generateMenu = (routes) => {

View File

@@ -59,7 +59,7 @@ export const useProcessStore = defineStore('process', () => {
const getFormMap = () => {
//表单映射对象
const map = new Map();
processData.value.formItems.forEach(item => itemToMap(map, item))
processData.value.formItems?.forEach(item => itemToMap(map, item))
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.push({path,meta})
visitedViews.value.push({path,meta,query})
toLastTagView(visitedViews)
}

View File

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

View File

@@ -0,0 +1,298 @@
<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">
<!-- link-->
<Tinymce v-model:value="formData.articleContent"
imageUrl="/workflow/process/file/upload" :height="500" v-if="showTinymce"
:toolbar="['undo redo | styleselect | bold italic | alignleft aligncenter alignright alignjustify | bullist numlist outdent indent | image axupimgs']"/>
</el-form-item>
</el-col>
<el-col :span="24" style="margin-bottom: -10px">
<el-form-item label="附件上传" prop="" style="margin-left: 20px;">
<file-upload @getFile="getFiles"/>
</el-form-item>
</el-col>
<el-col :span="24" style="margin-left:90px;">
<!-- <el-form-item label="公告附件列表" prop=""-->
<!-- style="display: flex;flex-direction: column;justify-content: flex-start;">-->
<!-- <template #label>-->
<!-- <div style="width: 100%;display: flex;align-items: center;justify-content: flex-start">-->
<!-- <el-icon size="16">-->
<!-- <Paperclip/>-->
<!-- </el-icon>-->
<!-- 公告附件列表-->
<!-- </div>-->
<!-- </template>-->
<el-col :span="24" style="margin-left: -15px">
<div style="display: flex;flex-direction: column">
<div v-for="(item,index) in formData.fileList" style="display: flex;align-items: center;margin-bottom: 5px">
附件{{ index + 1 }} <a :href="item.url" style="color: #409eff;" class="a-style" target="_blank">{{ item.originalFileName }}</a>
<el-icon size="18" style="margin:0 20px;cursor: pointer" color="#409eff" @click="handleDelete(item,index)">
<CircleClose/>
</el-icon>
<el-button type="primary" link @click="handleDownload(item)" style="font-size: 16px;margin-left: 10px">下载</el-button>
</div>
</div>
</el-col>
<!-- </el-form-item>-->
</el-col>
</el-row>
</el-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 {ElMessageBox, ElNotification} from "element-plus";
import {addArticle, editArticle, getArticleDetail} from "@/api/article";
import {useTagsView} from '@/stores/tagsview.js'
import {useCacheStore} from "@/stores/cache.js";
import {deleteFile, downloadFile} from "../../api/project-demand";
import FileUpload from "../../components/FileUpload.vue";
import Tinymce from "../../components/Tinymce.vue";
const cacheStore = useCacheStore();
const tagsViewStore = useTagsView()
const router = useRouter()
const route = useRoute()
const loading = ref(false)
const showTinymce = ref(true)
const fundForm = ref()
const formData = ref({
fileList:[]
})
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 handleDelete = (row,index) => {
ElMessageBox.confirm(`确认删除名称为${row.originalFileName}的文件吗?`, '系统提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
deleteFile(row.fileId).then(res => {
ElNotification({
title: '提示',
message: res.msg,
type: res.code === 1000 ? 'success' : 'error'
})
if (res.code === 1000) {
formData.value.fileList.splice(index, 1)
}
})
})
}
const handleBack = () => {
history.back()
}
const getFiles = (val) => {
console.log("🚀 ~ file:val ", val)
val.originalFileName=val.originalFilename
let file = compositeParam(val)
formData.value.fileList.push(file)
}
const handleDownload = (row) => {
downloadFile(row.fileId).then(res => {
const blob = new Blob([res])
let a = document.createElement('a')
a.href = URL.createObjectURL(blob)
a.download = row.originalFileName
a.click()
})
}
const submitParam = (item) => {
console.log("🚀 ~ file:item.fileList ", item.fileList)
item.fileList= item.fileList.map((it)=>{
return {
...it,
articleId:item.articleId
}
})
return {
articleContent: item.articleContent,
articleTitle: item.articleTitle,
articleType: item.articleType,
remarks: item.remarks,
articleId: item.articleId,
fileList: item.fileList
}
}
const compositeParam = (item) => {
return {
fileId: item.id,
size: item.size,
originalFileName: item.originalFilename,
fileType: item.fileType,
url: item.url,
newFile: true,
tag: 'article'
}
}
const handleSubmit = async (instance) => {
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)
}
console.log('params', params)
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">
.a-style:hover{
text-decoration: underline !important;
}
.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,152 @@
<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-col :span="24">
<div style="display: flex;flex-direction: column">
<div v-for="(item,index) in formData.fileList" style="display: flex;align-items: center;margin-bottom: 5px">
附件{{ index + 1 }} <a :href="item.url" style="color: #409eff;" class="a-style" target="_blank">{{ item.originalFileName }}</a>
<el-button type="primary" link @click="handleDownload(item)" style="font-size: 16px;margin-left: 10px">下载</el-button>
</div>
</div>
</el-col>
</el-row>
</el-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 handleDownload = (row) => {
downloadFile(row.fileId).then(res => {
const blob = new Blob([res])
let a = document.createElement('a')
a.href = URL.createObjectURL(blob)
a.download = row.originalFileName
a.click()
})
}
const download = (row) => {
const 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">
.a-style:hover{
text-decoration: underline !important;
}
.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,239 @@
<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',
currentRender: ({row, index}) => {
if (!row.remarks|| row.remarks == undefined || row.remarks == null) {
return '--'
} else {
return row.remarks
}
}
},
{
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>
<div class="my">
<el-row :gutter="20">
<el-col :span="10" :xs="24">
<el-card class="box-card1">
<el-col :span="12" :xs="24">
<el-card>
<!-- 标题 -->
<template #header>
<div class="card-header">
@@ -28,24 +28,24 @@
</div>
<div>{{ userParams.nickName }}</div>
</div>
<div class="userInfo_item">
<div style="display: flex;align-items: center">
<el-icon size="18" style="margin-right: 5px">
<Notification/>
</el-icon>
工号:
</div>
<div>{{ userParams.workCode }}</div>
</div>
<div class="userInfo_item">
<div style="display: flex;align-items: center">
<el-icon size="18" style="margin-right: 5px">
<Phone/>
</el-icon>
电话号码:
</div>
<div>{{ userParams.mobile }}</div>
</div>
<!-- <div class="userInfo_item">-->
<!-- <div style="display: flex;align-items: center">-->
<!-- <el-icon size="18" style="margin-right: 5px">-->
<!-- <Notification/>-->
<!-- </el-icon>-->
<!-- 工号:-->
<!-- </div>-->
<!-- <div>{{ userParams.workCode }}</div>-->
<!-- </div>-->
<!-- <div class="userInfo_item">-->
<!-- <div style="display: flex;align-items: center">-->
<!-- <el-icon size="18" style="margin-right: 5px">-->
<!-- <Phone/>-->
<!-- </el-icon>-->
<!-- 电话号码:-->
<!-- </div>-->
<!-- <div>{{ userParams.mobile }}</div>-->
<!-- </div>-->
<div class="userInfo_item">
<div style="display: flex;align-items: center">
<el-icon size="18" style="margin-right: 5px">
@@ -94,7 +94,70 @@
</div>
</el-card>
</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">
<!-- 标题 -->
<template #header>
@@ -113,8 +176,8 @@
<el-input placeholder="请确认新密码" v-model="userPassword.confirmPassword" type="password"/>
</el-form-item>
<el-form-item>
<el-button color="#DED0B2" @click="handleSubmit">提交</el-button>
<el-button @click="close">关闭</el-button>
<el-button color="#DED0B2" @click="handleSubmitPassword">提交</el-button>
<el-button @click="closeIndividualCenter">关闭</el-button>
</el-form-item>
</el-form>
</el-card>
@@ -126,18 +189,23 @@
import {ElNotification} from 'element-plus'
import {useTagsView} from '@/stores/tagsview.js'
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 agentUserList = ref([])
const agentUserPickerRef = ref()
const userParams = ref({});
const passwordRef = ref();
const router = useRouter()
const agentInfoForm = ref({});
const userPassword = ref({
oldPassword: '',
newPassword: '',
confirmPassword: ''
});
const tagsViewStore = useTagsView()
const validatePasswordComplexity = (rule, value, callback) => {
const reg = /^(?=.*[a-zA-Z])(?=.*\d).{1,9}$/; //密码必须是至少包含字母、数字1-9位
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 => {
userParams.value = res.data.user
isInitPassword.value = res.data.initPassword
if(res.code===1000){
userParams.value = res.data.user
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) => {
if (!roles) return;
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) {
editPassword({
...userPassword.value
@@ -221,23 +360,28 @@ const handleSubmit = async () => {
}
}
// 关闭
const close = () => {
const closeIndividualCenter = () => {
tagsViewStore.delVisitedViews(router.currentRoute.value.path)
router.push('/')
}
onMounted(() => {
getInfo()
getUserInfo()
getUserAgentInfo()
})
</script>
<style lang="scss">
.box-card {
//margin-left: 10px;
margin-top: 10px;
}
body, div {
margin: 0;
padding: 0;
}
.my {
margin: 0 auto;
margin-top: 20px;
margin: 20px auto 0;
.userDetail {
.userImg {
@@ -256,21 +400,14 @@ body, div {
}
.userInfo_item {
display: flex;align-items: center;
display: flex;
align-items: center;
justify-content: space-between;
height: 40px;
border-bottom-style: solid;
border-color: #daddd2;
border-width: 1px;
//text-align: left;
//line-height: 40px;
}
//
//.userInfo_item > div {
// float: right;
//}
}
</style>

View File

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

@@ -0,0 +1,275 @@
<template>
<fvSearchForm :searchConfig="searchConfig" @search="search" style="margin-left: 15px"></fvSearchForm>
<div style="float: left">
<import-cost-excel @success="importTheExpenseLedger"/>
</div>
<fvTable ref="tableIns" class="tablte" :tableConfig="tableConfig" @headBtnClick="headBtnClick" :changeExportPosition="true">
<template #empty>
<el-empty description="暂无数据"/>
</template>
</fvTable>
</template>
<script setup lang="jsx">
import {reactive, ref} from "vue";
import {useRoute, useRouter} from "vue-router";
import {costTemplateDownload, exportExcel, ledgerTemplateDownload} from "../../../api/project-manage";
import ImportCostExcel from "@/components/ImportCostExcel.vue";
const router = useRouter()
const route = useRoute()
const searchConfig = ref([
{
label: '主项目',
prop: 'masterProjectName',
component: 'el-input',
props: {
placeholder: '请输入主项目查询',
clearable: true,
filterable: true,
checkStrictly: true
}
},
{
label: '子项目',
prop: 'subProjectName',
component: 'el-input',
props: {
placeholder: '请输入子项目查询',
clearable: true,
filterable: true,
checkStrictly: true
}
},
{
label: '会计凭证记载金额(元)',
prop: 'recordedAmount',
component: 'el-input',
props: {
placeholder: '请输入会计凭证记载金额查询',
clearable: true,
filterable: true,
checkStrictly: true
}
},
{
label: '归集研发费用金额(元)',
prop: 'rdAmount',
component: 'el-input',
props: {
placeholder: '请输入归集研发费用金额查询',
clearable: true,
filterable: true,
checkStrictly: true
}
},
// {
// label: '项目类型',
// prop: 'projectType',
// component: shallowRef(fvSelect),
// props: {
// placeholder: '请选择项目类型',
// cacheKey: 'project_type',
// clearable: true,
// filterable: true,
// remote: true
// },
// colProps: {}
// },
// {
// label: '归档时间',
// prop: 'filingTime',
// component: 'el-date-picker',
// props: {
// placeholder: '请选择归档时间',
// clearable: true,
// type:'date',
// format: 'YYYY-MM-DD HH:mm',
// valueFormat:'YYYY-MM-DD HH:mm',
// },
// colProps: {}
// },
])
const tableIns = ref()
const tableConfig = reactive({
columns: [
// {
// prop: 'name',
// type: 'index',
// label: '序号',
// align: 'center',
// width:85,
// index: index => {
// return (tableIns.value.getQuery().pageNum - 1) * tableIns.value.getQuery().pageSize + index + 1
// }
// },
{
prop: 'rdYear',
label: '年',
align: 'center',
width: 80
},
{
prop: 'rdMonth',
label: '月',
align: 'center',
width: 80
},
{
prop: 'rdDay',
label: '日',
align: 'center',
width: 80
},
{
prop: 'masterProjectName',
label: '主项目',
align: 'center',
width: 120,
},
{
prop: 'subProjectName',
label: '子项目',
align: 'center',
width: 120,
},
{
prop: 'certificateDate',
label: '凭证日期',
align: 'center',
width: 120,
},
{
prop: 'voucherNumber',
label: '凭证号',
align: 'center'
},
{
prop: 'entryNumber',
label: '分录号',
align: 'center',
},
{
prop: 'digest',
label: '摘要',
align: 'center',
showOverflowTooltip: false,
},
{
prop: 'accountCode',
label: '科目编码',
align: 'center',
showOverflowTooltip: false,
},
{
prop: 'accountName',
label: '科目名称',
align: 'center',
showOverflowTooltip: false,
},
{
prop: 'auxiliaryItem',
label: '辅助项',
align: 'center',
showOverflowTooltip: false,
},
{
prop: 'recordedAmount',
label: '会计凭证记载金额(元)',
align: 'center',
width: 170
},
{
prop: 'rdAmount',
label: '归集研发费用金额(元)',
align: 'center',
width: 170
},
],
api: '/workflow/mosr/rd/expense/list',
params: {},
btns: [
{name: '模板下载', key: 'down', color: '#DED0B2'},
// {name: '导入', key: 'import', color: '#DED0B2'}
],
export:{
open :true,
fileName:`研发费用明细表`
}
})
const search = (val) => {
tableConfig.params = {...val}
tableIns.value.refresh()
}
const headBtnClick = (key) => {
switch (key) {
case 'down':
handleImportTemplateDownload()
break;
case 'import':
handleAdd()
break;
}
}
const exportTable = () => {
const $e = tableIns.value.$el
let $table = $e.querySelector('.el-table__fixed')
if (!$table) {
$table = $e
}
exportExcel($table, (5 + (Object.keys(tableData.value[0]).length - 5) * 5), "四川省国有资产经营投资管理有限责任公司科技创新项目人工成本分摊明细表", 2)
}
//导入模板下载
const handleImportTemplateDownload=()=>{
costTemplateDownload().then(res => {
let link = document.createElement('a')
try {
let blob = new Blob([res.data],{type: 'application/vnd.ms-excel'});
let _fileName = "研发费用明细表模板.xlsx"//文件名,中文无法解析的时候会显示 _(下划线),生产环境获取不到
link.style.display='none';
// 兼容不同浏览器的URL对象
const url = window.URL || window.webkitURL || window.moxURL;
link.href=url.createObjectURL(blob);
link.setAttribute('download', _fileName.substring(_fileName.lastIndexOf('_')+1))
document.body.appendChild(link);
link.click();
document.body.removeChild(link);
url.revokeObjectURL(link.href);//销毁url对象
}catch (e) {
console.log('下载的文件出错',e)
}
})
}
const importTheExpenseLedger = () => {
tableIns.value.refresh()
}
</script>
<style scoped lang="scss">
:deep(.el-form-item__label-wrap){
margin-left: 0!important;
}
:deep(.el-table__header) {
.is-leaf:first-child {
.cell {
margin-left: -25px !important;
}
}
}
:deep(.el-table__body) {
.el-table__cell:first-child {
.cell {
margin-left: -13px !important;
}
}
}
:deep(.el-date-editor--month){
width: 100%;
}
</style>

View File

@@ -0,0 +1,232 @@
<template>
<fvSearchForm :searchConfig="searchConfig" @search="search" ></fvSearchForm>
<fvTable ref="tableIns" :tableConfig="tableConfig" >
<template #empty>
<el-empty description="暂无数据"/>
</template>
</fvTable>
</template>
<script setup lang="jsx">
import fvSelect from '@/fvcomponents/fvSelect/index.vue'
import {toThousands} from '@/utils/changePrice.js'
import { getSubCompOpt } from '@/api/user/user.js';
const router = useRouter()
const route = useRoute()
const searchConfig = ref(
[
{
label: '主项目',
prop: 'masterProjectName',
component: 'el-input',
props: {
placeholder: '请输入主项目查询',
clearable: true,
filterable: true,
checkStrictly: true
}
},
{
label: '子项目',
prop: 'subProjectName',
component: 'el-input',
props: {
placeholder: '请输入子项目查询',
clearable: true,
filterable: true,
checkStrictly: true
}
},
{
label: '项目类型',
prop: 'projectType',
component: shallowRef(fvSelect),
props: {
placeholder: '请选择项目类型',
cacheKey: 'project_type',
clearable: true,
filterable: true,
remote: true
},
colProps: {}
},
// {
// label: '归档时间',
// prop: 'filingTime',
// component: 'el-date-picker',
// props: {
// placeholder: '请选择归档时间',
// clearable: true,
// type:'date',
// format: 'YYYY-MM-DD HH:mm',
// valueFormat:'YYYY-MM-DD HH:mm',
// },
// colProps: {}
// },
])
const tableIns = ref()
const tableConfig = reactive({
columns: [
// {
// prop: 'name',
// type: 'index',
// label: '序号',
// align: 'center',
// width:85,
// index: index => {
// return (tableIns.value.getQuery().pageNum - 1) * tableIns.value.getQuery().pageSize + index + 1
// }
// },
{
prop: 'paymentYear',
label: '支付年份',
align: 'center'
},
{
prop: 'paymentMonth',
label: '支付月份',
align: 'center'
},
{
prop: 'masterProjectName',
label: '主项目',
align: 'center',
width: 120,
},
{
prop: 'subProjectName',
label: '子项目',
align: 'center',
width: 120,
},
{
prop: 'projectType',
label: '项目类型',
align: 'center',
width: 120,
showOverflowTooltip: false,
currentRender: ({row, index}) => {
if (row.projectType&&row.projectType !== null&&row.projectType!==undefined) {
return (<Tag dictType={'project_type'} value={row.projectType}/>)
} else {
return '--'
}
}
},
{
prop: 'rdType',
label: 'R&D统计类型',
align: 'center',
width: 200
},
{
prop: 'rdSub',
label: 'R&D统计子项',
align: 'center',
width: 150
},
{
prop: 'paymentProcessType',
label: '付款流程类型',
align: 'center',
width: 150
},
{
prop: 'processState',
label: '流程状态',
align: 'center',
},
{
prop: 'filingTime',
label: '归档时间',
align: 'center',
width: 180
},
{
prop: 'paymentProcessNum',
label: '付款流程编号',
align: 'center',
width: 150
},
{
prop: 'paymentAmount',
label: '付款金额',
align: 'center',
},
{
prop: 'paymentSubject',
label: '付款/请款事由',
align: 'center',
width: 130
},
{
prop: 'contractNum',
label: '合同编号',
align: 'center',
},
{
prop: 'contractName',
label: '合同名称',
align: 'center',
},
{
prop: 'contractSumAmount',
label: '合同总额(元)',
align: 'center',
width: 130
},
{
prop: 'recipientName',
label: '收款方名称',
align: 'center',
width: 130
},
{
prop: 'remarks',
label: '备注说明',
align: 'center',
},
],
api: '/workflow/mosr/payment/list',
params: {},
export:{
open :true,
fileName:`科研项日现金支出明细表`
}
})
const search = (val) => {
tableConfig.params = {...val}
tableIns.value.refresh()
}
const init = async () => {
const res = await getSubCompOpt()
searchConfig.value.find(item=>item.prop == 'affiliatedCompanyIds').props.data = res.data
}
// init()
</script>
<style scoped lang="scss">
:deep(.el-table__header) {
.is-leaf:first-child {
.cell {
margin-left: -25px !important;
}
}
}
:deep(.el-table__body) {
.el-table__cell:first-child {
.cell {
margin-left: -13px !important;
}
}
}
:deep(.el-date-editor--month){
width: 100%;
}
</style>

View File

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

@@ -0,0 +1,591 @@
<template>
<div v-loading="loading" style="padding: 0 30px">
<el-form :model="formData" ref="form" :rules="rules" style="margin-left: 5px;margin-top: 18px">
<el-row :gutter="30">
<!-- <el-col :span="6" style="margin-left: -15px">-->
<!-- <el-form-item label="分摊名称" prop="shareName" >-->
<!-- <el-input v-model="formData.shareName" placeholder="请输入分摊名称" clearable>-->
<!-- </el-input>-->
<!-- </el-form-item>-->
<!-- </el-col>-->
<el-col :span="6" style="margin-left: -10px">
<el-form-item label="分摊月份" prop="apportionmentMonth" label-width="80">
<el-date-picker
v-model="formData.apportionmentMonth"
type="month"
format="YYYY-MM"
value-format="YYYY-MM"
placeholder="选择月"
>
</el-date-picker>
</el-form-item>
</el-col>
<el-col :span="3" >
<el-button color="#DED0B2" @click="handleAdd" style="font-size: 16px">添加一行</el-button>
</el-col>
<el-table v-if="showTable" :data="formData.tableData" style="width: 100%">
<el-table-column prop="projectId" label="项目名称" min-width="230">
<template #default="scope">
<el-form-item prop="time" :rules="scope.row.projectId?'1':rules.projectId">
<el-select v-model="scope.row.projectId" placeholder="请选择项目名称" clearable filterable @change="selectProject(scope.row,scope.$index)">
<el-option
v-for="item in nameOptions"
:key="item.value"
:label="item.label"
:value="item.value"
>
</el-option>
</el-select>
</el-form-item>
</template>
</el-table-column>
<el-table-column prop="researchPersonnelId" label="研发人员" min-width="180">
<template #default="scope">
<el-form-item prop="researchPersonnelId">
{{ scope.row.researchPersonnel }}
<el-button color="#DED0B2" @click="showPersonnelPicker(scope.row,scope.$index)"
style="margin-left: 10px">
{{ scope.row.researchPersonnel ? '更改' : '请选择研发人员' }}
</el-button>
</el-form-item>
</template>
</el-table-column>
<el-table-column prop="wagesPayable" label="当月总工时(天)" min-width="175">
<template #default="scope">
<el-form-item prop="time" :rules="scope.row.wagesPayable?'1':rules.wagesPayable">
<div>21.75</div>
</el-form-item>
</template>
</el-table-column>
<el-table-column prop="researchDuration" label="当月研发工时(天)" min-width="175">
<template #default="scope">
<el-form-item prop="time" :rules="scope.row.researchDuration?'1':rules.researchDuration">
<el-input-number v-model="scope.row.researchDuration" placeholder="请输入当月研发工时" :controls="false"/>
</el-form-item>
</template>
</el-table-column>
<el-table-column prop="oper" label="操作" min-width="130">
<template #default="scope">
<el-button type="primary" @click="handleCopy(scope.row)" link style="font-size: 16px">复制</el-button>
<el-button type="primary" @click="handleDelete(scope.$index)" link style="font-size: 16px">删除</el-button>
</template>
</el-table-column>
</el-table>
</el-row>
</el-form>
<user-picker :multiple="false" ref="userPicker" title="请选择研发人员" v-model:value="userList"
@ok="selectedResearchPersonnel" @cancelOrClear="researchPersonnelPickerCancel"
:setNullToSelectList="true" :isResearch="true"/>
<div class="oper-page-btn">
<el-button color="#DED0B2" v-if="routerName==='Sharedetail/add'" @click="handleSubmit(form)">提交</el-button>
<el-button color="#DED0B2" v-else @click="handleResubmit(form)">重新提交</el-button>
<el-button @click="handleBack">返回</el-button>
</div>
</div>
</template>
<script setup lang="jsx">
import {ElNotification} from "element-plus";
import {useTagsView} from '@/stores/tagsview.js'
import {
addAllocation,
getAllocationDetail,
getAllocationProcess,
getResearchUser,
getProjectOption,
editAllocation,
getAllocationDetailList, addShare
} from "@/api/expense-manage";
import {useProcessStore} from '@/stores/processStore.js';
import ProcessDiagramViewer from '@/views/workflow/common/ProcessDiagramViewer.vue';
import OperationRender from '@/views/workflow/common/OperationRender.vue'
import UserPicker from "@/views/workflow/process/common/UserPicker.vue";
localStorage.removeItem('originallySelectedList')
const userList = ref([])
const changeDiagram = ref(false)
const rules = reactive({
// shareName: [{required: true, message: '请输入分摊名称', trigger: ['blur', 'change']}],
apportionmentMonth: [{required: true, message: '请选择月份', trigger: ['blur', 'change']}],
projectId: [{required: true, message: '请选择项目名称', trigger: ['blur', 'change']}],
// researchPersonnelId: [{required: true, message: '请选择研发人员', trigger: ['blur', 'change']}],
// wagesPayable: [{required: true, message: '请输入应发工资', trigger: ['blur', 'change']}],
// performance: [{required: true, message: '请输入绩效', trigger: ['blur', 'change']}],
// reserveFund: [{required: true, message: '请输入公积金', trigger: ['blur', 'change']}],
// socialSecurity: [{required: true, message: '请输入社保', trigger: ['blur', 'change']}],
// annuity: [{required: true, message: '请输入年金', trigger: ['blur', 'change']}],
// workday: [{required: true, message: '请输入工作日', trigger: ['blur', 'change']}],
researchDuration: [{required: true, message: '请输入研发时长', trigger: ['blur', 'change']}],
})
const processStore = useProcessStore()
const opentionData = ref({})
const processInstanceData = ref()
const processDiagramViewer = ref(false)
const loading = ref(false)
const isRepeatResearchPersonnel = ref(false)
const showTable = ref(true)
const route = useRoute()
const router = useRouter()
const routerName = ref(router.currentRoute.value.name)
const tagsViewStore = useTagsView()
const formData = ref({
tableData: [
{
projectId: '',
projectName: '',
// researchPersonnelId: '',
// wagesPayable: null,
// performance: null,
// reserveFund: null,
// socialSecurity: null,
// annuity: null,
workday: '21.75',
researchDuration: null,
}
]
})
const userPicker = ref()
const form = ref()
const currentReachPerson = ref({})
const currentRow = ref()
const currentIndex = ref()
const nameOptions = ref([])
const researchOptions = ref([])
const showPersonnelPicker = (row, index) => {
currentRow.value = row
currentIndex.value = index
if (row.companyName&&row.researchPersonnelId) {
let userObj = {
id: row.researchPersonnelId,
name: row.researchPersonnel,
companyName: row.companyName,
accountType: row.accountType,
}
userList.value = [userObj]
} else if (!row.researchPersonnel) {
userList.value = []
}
nextTick(() => {
userPicker.value.showUserPicker()
})
}
const selectProject=(row,index)=>{
console.log('row,index',row,index)
//先选择人员, 再选择项目: 再添加一行,重复操作
const projectIdArray = formData.value.tableData.map(item => item.projectId)
const researchPersonnelIdArray = formData.value.tableData.map(item => item.researchPersonnelId)
console.log('projectIdArray',projectIdArray)
console.log('researchPersonnelIdArray',researchPersonnelIdArray)
const projectNumObj = getSelectProjectAndResearchPersonnelNum(projectIdArray)
const researchPersonnelNumObj = getSelectProjectAndResearchPersonnelNum(researchPersonnelIdArray)
let repeatProjectName=getProjectName(row.projectId)
// console.log('currentRow.value',currentRow.value)
// for (let researchPersonnelIdKey in researchPersonnelNumObj) {//先判断人员是否重复
// if(currentRow.value.projectId){
// if(researchPersonnelNumObj[researchPersonnelIdKey]>1){
// ElNotification({
// title: '警告',
// message: `${repeatProjectName} 项目下,同一个研发人员不能分摊多次!`,
// type: 'warning',
// })
// row.researchPersonnelId = ''
// row.researchPersonnel = ''
// row.companyName = ''
// row.accountType = ''
// }
// }
//
// }
// for (let projectIdKey in projectNumObj) {
// // console.log('projectNumObjKey', projectIdKey, projectNumObj[projectIdKey])
// if(projectNumObj[projectIdKey]>1){
// // console.log('getProjectName(projectIdKey)',getProjectName(projectIdKey))
// repeatProjectName=getProjectName(projectIdKey)
//
// }
// }
}
const researchPersonnelPickerCancel = (select) => {
console.log('select',select)
if(select.length>0){
formData.value.tableData?.forEach((item, index) => {
if (index === currentIndex.value) {
item.researchPersonnelId = select[0].id
item.researchPersonnel = select[0].name
item.companyName = select[0].companyName
item.accountType = select[0].accountType
}
})
}else{
formData.value.tableData?.forEach((item, index) => {
if (index === currentIndex.value) {
item.researchPersonnelId = ''
item.researchPersonnel = ''
item.companyName = ''
item.accountType = ''
}
})
}
}
const selectedResearchPersonnel = (select) => {
if(select.length>0){
formData.value.tableData?.forEach((item, index) => {
if (index === currentIndex.value) {
item.researchPersonnelId = select[0].id
item.researchPersonnel = select[0].name
item.companyName = select[0].companyName
item.accountType = select[0].accountType
}
})
}else{
formData.value.tableData?.forEach((item, index) => {
if (index === currentIndex.value) {
item.researchPersonnelId = ''
item.researchPersonnel = ''
item.companyName = ''
item.accountType = ''
}
})
}
//以下是为" 同一项目下,同一人不能分摊多次 "
const projectIdArray = formData.value.tableData?.map(item => item.projectId)
const researchPersonnelIdArray = formData.value.tableData?.map(item => item.researchPersonnelId)
const projectNumObj = getSelectProjectAndResearchPersonnelNum(projectIdArray)
const researchPersonnelNumObj = getSelectProjectAndResearchPersonnelNum(researchPersonnelIdArray)
let repeatProjectName=''
for (let projectIdKey in projectNumObj) {
// console.log('projectNumObjKey', projectIdKey, projectNumObj[projectIdKey])
if(projectNumObj[projectIdKey]>1){
// console.log('getProjectName(projectIdKey)',getProjectName(projectIdKey))
repeatProjectName=getProjectName(projectIdKey)
}
}
// for (let researchPersonnelIdKey in researchPersonnelNumObj) {
// // console.log('researchPersonnelIdKey', researchPersonnelIdKey, researchPersonnelNumObj[researchPersonnelIdKey])
// if(researchPersonnelNumObj[researchPersonnelIdKey]>1&&repeatProjectName&&currentRow.value.projectId){
// isRepeatResearchPersonnel.value=true
// ElNotification({
// title: '警告',
// message: `${repeatProjectName} 项目下,同一个研发人员不能分摊多次!`,
// type: 'warning',
// })
// formData.value.tableData.forEach((item,index)=>{
// if (index === currentIndex.value) {
// item.researchPersonnelId = ''
// item.researchPersonnel = ''
// item.companyName = ''
// item.accountType = ''
// }
// })
// }else{
// userList.value = select
// }
// }
}
/**
* 获取一个项目/研发人员的选择次数
* @param projectIdArray
* @returns {{}}
*/
const getSelectProjectAndResearchPersonnelNum = (projectIdArray) => {
const obj = {};
for (let i = 0, l = projectIdArray.length; i < l; i++) {
const item = projectIdArray[i];
obj[item] = (obj[item] + 1) || 1;
}
return obj;
}
const getResearchOptions = async () => {
const res = await getResearchUser()
researchOptions.value = res.data
}
const getProjectOptions = async () => {
const res = await getProjectOption()
nameOptions.value = res.data
}
const getProjectName = (id) => {
let label = ''
nameOptions.value.forEach(item => {
if (item.value == id) {
label = item.label
}
})
return label
}
const handleAdd = () => {
let row = {
projectId: '',
projectName: '',
researchPersonnelId: '',
researchPersonnel: '',
wagesPayable: null,
performance: null,
reserveFund: null,
socialSecurity: null,
annuity: null,
workday: '21.75',
researchDuration: null,
}
currentReachPerson.value.name = ''
formData.value.tableData.push(row)
}
const handleCopy = (row) => {
let copyObj = {
projectId: row.projectId,
projectName: '',
// accountType: row.accountType,
// companyName: row.companyName,
// researchPersonnelId: row.researchPersonnelId,
// researchPersonnel: row.researchPersonnel,
wagesPayable: row.wagesPayable,
performance: row.performance,
reserveFund: row.reserveFund,
socialSecurity: row.socialSecurity,
annuity: row.annuity,
workday: '21.75',
researchDuration: row.researchDuration,
}
formData.value.tableData.push(copyObj)
}
const handleDelete = (index) => {
formData.value.tableData.splice(index, 1)
}
const handleSubmit = (instance) => {
console.log('tableData', formData.value.tableData)
if (!instance) return
instance.validate(async (valid) => {
if (!valid) {
ElNotification({
title: '提示',
message: '请完善数据,再提交!',
type: 'error'
})
return;
}
let researchPersonnelId = ''
formData.value.tableData.forEach(item => {
item.projectName = getProjectName(item.projectId)
researchPersonnelId = item.researchPersonnelId
if (item.performance == 0) {
item.performance = null
}
})
if (!researchPersonnelId) {
ElNotification({
title: '提示',
message: '请选择研发人员',
type: 'error'
})
return;
}
let params = {
apportionmentMonth: formData.value.apportionmentMonth,
usrAllocations: formData.value.tableData,
}
console.log('params', params.usrAllocations, formData.value.tableData)
const resultMap = params.usrAllocations.reduce((acc, item) => {
if (!acc[item.researchPersonnelId]) {
acc[item.researchPersonnelId] = [];
}
acc[item.researchPersonnelId].push(item);
return acc;
}, {});
const exceedList = [];
Object.entries(resultMap).forEach(([id, items]) => {
const totalDuration = items.reduce((sum, item) => sum + (item.researchDuration || 0), 0);
const preciseTotalDuration = parseFloat(totalDuration.toFixed(2));
if (preciseTotalDuration > 21.75) {
// 收集超出的研发人员ID及总工时
exceedList.push({ id, totalDuration: preciseTotalDuration });
}
});
// 从 resultMap 中获取 researchPersonnel
const exceedResearchPersonnel = exceedList.map(item => {
const id = item.id;
const personnelItems = resultMap[id];
// 获取第一个对象中的 researchPersonnel假设所有对象的 researchPersonnel 相同)
const researchPersonnel = personnelItems[0].researchPersonnel;
return { id, researchPersonnel, totalDuration: item.totalDuration };
});
console.log('超过21.75的研发人员:', exceedResearchPersonnel);
if (exceedResearchPersonnel.length > 0) {
console.log('以下研发人员的总研发工时超过21.75天:', exceedResearchPersonnel);
ElNotification({
title: '提示',
message: `以下研发人员的总研发工时超过21.75天:${exceedResearchPersonnel.map(e => e.researchPersonnel).join('')}`,
type: 'warning'
});
}
// 调用函数
console.log('是大V',resultMap)
const {code, msg} = await addShare(params)
ElNotification({
title: '提示',
message: msg,
type: code === 1000 ? 'success' : 'error'
})
if (code === 1000) {
tagsViewStore.delVisitedViews(router.currentRoute.value.path)
router.push({
name: 'Share'
})
}
})
}
const handleResubmit = (instance) => {
if (!instance) return
instance.validate(async (valid) => {
if (!valid) {
ElNotification({
title: '提示',
message: '请完善数据,再提交!',
type: 'error'
})
return;
}
let researchPersonnelId = ''
formData.value.tableData.forEach(item => {
item.allocationId = formData.value.allocationId
item.projectName = getProjectName(item.projectId)
researchPersonnelId = item.researchPersonnelId
if (item.performance == 0) {
item.performance = null
}
})
if (!researchPersonnelId) {
ElNotification({
title: '提示',
message: '请选择研发人员',
type: 'error'
})
return;
}
let params = {
allocationId: formData.value.allocationId,
shareName: formData.value.shareName,
apportionmentMonth: formData.value.apportionmentMonth,
usrAllocations: formData.value.tableData,
deploymentId: processInstanceData.value.deploymentId,
}
// console.log('params', params, formData.value.tableData)
const {code, msg} = await editAllocation(params)
ElNotification({
title: '提示',
message: msg,
type: code === 1000 ? 'success' : 'error'
})
if (code === 1000) {
tagsViewStore.delVisitedViews(router.currentRoute.value.path)
router.push({
name: 'Share'
})
}
})
}
const getDetailInfo = () => {
loading.value = true
getAllocationDetail(route.query.id).then(res => {
ElNotification({
title: '提示',
message: res.msg,
type: res.code === 1000 ? 'success' : 'error'
})
if (res.code === 1000) {
getDetailList()
formData.value = res.data.formData
opentionData.value = res.data
loading.value = false
}
})
}
const getDetailList = async () => {
let params = {
allocationId: route.query.id
}
showTable.value = false
const {code, data, msg} = await getAllocationDetailList(params)
if (code === 1000) {
data.rows.forEach(item => {
item.researchPersonnelId = Number(item.researchPersonnelId)
})
formData.value.tableData = data.rows
nextTick(() => {
showTable.value = true
})
} else {
ElNotification({
title: '提示',
message: msg,
type: 'error'
})
}
}
const init = async () => {
processDiagramViewer.value = false
await getResearchOptions()
await getProjectOptions()
getAllocationProcess().then(res => {
if (res.code === 1000) {
let data = res.data
processInstanceData.value = data
processStore.setDesign(data)
processStore.runningList.value = data.runningList;
processStore.endList.value = data.endList;
processStore.noTakeList.value = data.noTakeList;
processStore.refuseList.value = data.refuseList;
processStore.passList.value = data.passList;
nextTick(() => {
processDiagramViewer.value = true
})
} else {
ElNotification({
title: '提示',
message: res.msg,
type: 'error'
})
}
})
}
const handleBack = () => {
history.back()
}
onMounted(() => {
init()
if (route.query.id) {
getDetailInfo()
}
})
</script>
<style scoped lang="scss">
:deep(.el-table--enable-row-transition) {
.el-table__body td.el-table__cell {
.cell {
.el-form-item {
margin-top: 20px;
}
}
}
}
:deep(.el-date-editor--month) {
width: 100% !important;
}
:deep(.el-input-number) {
width: 100%;
.el-input__inner {
text-align: left;
}
}
</style>

View File

@@ -0,0 +1,219 @@
<template>
<fvSearchForm :searchConfig="searchConfig" @search="search" style="margin-left: 16px"></fvSearchForm>
<!-- <el-button color="#DED0B2" style="float: left;margin: 0 10px 10px 0" @click="exportTable">导出</el-button>-->
<fvTable ref="tableIns" :tableConfig="tableConfig" @headBtnClick="headBtnClick" style="margin-top: 15px" @selectionChange="selectionChange">
<template #empty>
<el-empty description="暂无数据"/>
</template>
</fvTable>
</template>
<script setup lang="jsx">
import fvSelect from '@/fvcomponents/fvSelect/index.vue'
import { getSubCompOpt } from '@/api/user/user.js';
import {reactive, ref} from "vue";
import {shareDetailExport, shareExportExcel} from "@/api/expense-manage";
import {ElMessage} from "element-plus";
const router = useRouter()
const route = useRoute()
const searchConfig = reactive([
{
label: '子项目',
prop: 'subProjectName',
component: 'el-input',
props: {
placeholder: '请输入子项目查询',
clearable: true,
filterable: true,
checkStrictly: true
}
},
// {
// label: '支付月份',
// prop: 'apportionmentMonth',
// component: 'el-date-picker',
// props: {
// placeholder: '请选择支付月份',
// clearable: true,
// type:'month',
// format: 'YYYY-MM',
// valueFormat:"YYYY-MM"
// },
// colProps: {}
// },
// {
// label: '人员性质',
// prop: 'personnelNature',
// component: shallowRef(fvSelect),
// props: {
// placeholder: '请选择人员性质',
// clearable: true,
// filterable: true,
// cacheKey: 'nature_of_personnel'
// }
// },
])
const tableIns = ref()
const selectData = ref([])
const tableConfig = reactive({
columns: [
{
type: 'selection',
prop: 'selection',
},
// {
// prop: 'name',
// type: 'index',
// label: '序号',
// align: 'center',
// width:85,
// index: index => {
// return (tableIns.value.getQuery().pageNum - 1) * tableIns.value.getQuery().pageSize + index + 1
// }
// },
{
prop: 'paymentYear',
label: '支付年份',
align: 'center'
},
{
prop: 'paymentMonth',
label: '支付月份',
align: 'center'
},
{
prop: 'masterProjectName',
label: '主项目',
align: 'center',
},
{
prop: 'subProjectName',
label: '子项目',
align: 'center',
},
{
prop: 'researchPersonnel',
label: '研发人员',
align: 'center',
showOverflowTooltip: false,
},
{
prop: 'personnelNature',
label: '人员性质',
align: 'center',
width: 120,
showOverflowTooltip: false,
currentRender: ({row, index}) => {
if (row.personnelNature&&row.personnelNature !== null&&row.personnelNature!==undefined) {
return (<Tag dictType={'nature_of_personnel'} value={row.personnelNature}/>)
} else {
return '--'
}
}
},
{
prop: 'researchDuration',
label: '当月研发工时(天)',
align: 'center',
// currentRender:({row})=>{
// return <span>{toThousands(row.afterTax)}</span>
// }
},
{
prop: 'workday',
label: '当月总工时(天)',
align: 'center',
showOverflowTooltip: false,
},
{
prop: 'subtotal',
label: '人工成本分摊(元)',
align: 'center',
},
],
api: '/workflow/mosr/cost/share',
params: {},
btns: [
{name: '添加分摊', key: 'add', color: '#DED0B2'},
{name: '导出', key: 'export', color: '#DED0B2'}
],
export:{
open :false,
}
})
const search = (val) => {
tableConfig.params = {...val}
tableIns.value.refresh()
}
const headBtnClick = (key) => {
switch (key) {
case 'add':
handleAdd()
break;
case 'export':
exportTable()
break;
}
}
const selectionChange = (data) => {
console.log('data', data)
selectData.value=data.map(item=>item.id)
}
const exportTable = () => {
console.log('selectData',selectData.value)
if (selectData.value.length === 0) {
ElMessage.warning('请选择要导出的费用分摊')
return
}
shareDetailExport(selectData.value).then(res => {
console.log(res)
let fileName = `科技研发项目工时及成本分摊汇总表.xlsx`
const blob = new Blob([res.data])
let a = document.createElement('a')
a.href = URL.createObjectURL(blob)
a.download = fileName
a.click()
})
}
const handleAdd = () => {
router.push({
name: 'Sharedetail/add',
query: {}
})
}
const init = async () => {
const res = await getSubCompOpt()
searchConfig.value.find(item=>item.prop == 'affiliatedCompanyIds').props.data = res.data
}
// init()
</script>
<style scoped lang="scss">
:deep(.el-table__header) {
.is-leaf:first-child {
.cell {
//margin-left: -25px !important;
}
}
}
:deep(.el-table__body) {
.el-table__cell:first-child {
.cell {
//margin-left: -13px !important;
}
}
}
:deep(.el-date-editor--month){
width: 100%;
}
</style>

View File

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

View File

@@ -1,12 +1,13 @@
<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-col :span="12">
<el-col :span="6">
<el-form-item label="分摊名称">
<span>{{ formData.shareName }}</span>
</el-form-item>
</el-col>
<el-col :span="12">
<el-col :span="6">
<el-form-item label="分摊月份">
<span>{{ formData.apportionmentMonth }}</span>
</el-form-item>
@@ -52,7 +53,9 @@
</div>
</div>
<opinion v-if="shareData.taskId" :formData="shareData.formData" :taskId="shareData.taskId"
:taskUserOptionList="shareData.taskUserOptionList"
v-model:value="auditOpinion"></opinion>
</div>
</template>
<script setup lang="jsx">

View File

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

View File

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

File diff suppressed because it is too large Load Diff

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