Compare commits

...

391 Commits

Author SHA1 Message Date
zhouxiaoan b641b502f4 feat:终审卡片最大化报错处理
2 years ago
lihui_ocr ac9abbb360 feat:首页小狗加快捷键
2 years ago
赵辉 9e359c6a16 Merge pull request 'fix:可疑文件通过未通过样式' (#258) from fix/change_task into test
2 years ago
lihui_ocr e34a11759f fix:可疑文件通过未通过样式
2 years ago
yaoshuli 6da3df16bd Merge pull request 'feat: 修改按钮距离问题' (#255) from fix/updatesyspic into test
2 years ago
raofuzi f634fe008b feat: 修改图标展示问题
2 years ago
raofuzi a885893342 Merge branch 'test' of https://git.mcnetmart.com/guoxiangbin/ocr-web into fix/updatesyspic
2 years ago
raofuzi 721dfb5732 feat: 修改图片圆角问题
2 years ago
赵辉 2829fa9a8a Merge pull request 'fix:图标回显问题' (#257) from fix/change_task into test
2 years ago
lihui_ocr ae6cb69b19 fix:图标回显问题
2 years ago
赵辉 9f96a3d2a7 Merge pull request 'fix:快捷键弹筐效果调整' (#256) from fix/change_task into test
2 years ago
lihui_ocr 8a32b683af fix:快捷键弹筐效果调整
2 years ago
raofuzi 123f6f2392 Merge branch 'test' of https://git.mcnetmart.com/guoxiangbin/ocr-web into fix/updatesyspic
2 years ago
raofuzi b41389f192 feat: 修改按钮距离问题
2 years ago
赵辉 c7a5b5f26f Merge pull request 'fix:图片审批沉浸模式 消息公告名字 消息公告回显标题' (#254) from fix/change_task into test
2 years ago
lihui_ocr 63d49a6ef3 fix:图片审批沉浸模式 消息公告名字 消息公告回显标题
2 years ago
yaoshuli ffbd15443a Merge pull request 'fix/updatesyspic' (#252) from fix/updatesyspic into test
2 years ago
赵辉 b2b773c4a6 Merge pull request 'fix:- -的添加' (#253) from fix/change_task into test
2 years ago
lihui_ocr ebd93126bd fix:- -的添加
2 years ago
raofuzi 87063d3bf2 feat: 修改加载慢问题
2 years ago
raofuzi 88e2cbb7b1 Merge branch 'test' of https://git.mcnetmart.com/guoxiangbin/ocr-web into fix/updatesyspic
2 years ago
raofuzi 3bed6c559a feat: 修改按钮距离问题
2 years ago
赵辉 bcb0235eb4 Merge pull request 'fix' (#251) from fix/change_task into test
2 years ago
lihui_ocr aca9fd5a40 fix
2 years ago
赵辉 1917ac7b0a Merge pull request 'fix:无时间时展示内容' (#250) from fix/change_task into test
2 years ago
lihui_ocr b91eee93cc fix:无时间时展示内容
2 years ago
yaoshuli 94b4e1dc3b Merge pull request 'fix: 图检审批左右键异常处理' (#248) from 20240420keydown into test
2 years ago
yaoshuli 78cd69fe7d Merge pull request 'fix/updatesyspic' (#245) from fix/updatesyspic into test
2 years ago
赵辉 a27866f409 Merge pull request 'fix:提示栏背景颜色调整' (#249) from fix/change_task into test
2 years ago
lihui_ocr 45e6ef340c fix:提示栏背景颜色调整
2 years ago
zhouxiaoan 4193b03fba fix: 图检审批左右键异常处理
2 years ago
赵辉 a57173da41 Merge pull request 'feat:删除按钮的联动' (#247) from fix/change_task into test
2 years ago
lihui_ocr 89c26a38a7 feat:删除按钮的联动
2 years ago
赵辉 475846b872 Merge pull request 'feat:已审批的不可移入可疑文件夹中' (#246) from fix/change_task into test
2 years ago
lihui_ocr 5aeccffdaf feat:已审批的不可移入可疑文件夹中
2 years ago
raofuzi 42d5e1b0ab feat: 修改加载慢问题
2 years ago
raofuzi 97ebc08c61 Merge branch 'test' of https://git.mcnetmart.com/guoxiangbin/ocr-web into fix/updatesyspic
2 years ago
raofuzi 9c25f60bee feat: 修改加载慢问题
2 years ago
赵辉 7c825aeb27 Merge pull request 'fix:全局样式问题调整' (#244) from fix/change_task into test
2 years ago
lihui_ocr 1642a60615 fix:全局样式问题调整
2 years ago
李忠 875eb84cdb Merge pull request 'fix: 处理图检审批左右按键异常' (#243) from 20240420keydown into test
2 years ago
李忠 baaad7926e Merge branch 'test' into 20240420keydown
2 years ago
李忠 fd4638c5dc Merge pull request 'fix/updatesyspic' (#242) from fix/updatesyspic into test
2 years ago
李忠 f68776c228 Merge branch 'test' into fix/updatesyspic
2 years ago
zhouxiaoan 02d6acba41 fix: 处理图检审批左右按键异常
2 years ago
raofuzi 2b5b0f9a14 Merge branch 'test' of https://git.mcnetmart.com/guoxiangbin/ocr-web into fix/updatesyspic
2 years ago
raofuzi 1d35907097 feat: 修改加载问题
2 years ago
赵辉 5ef6710b6d Merge pull request 'fix:顶部内容回显,快捷键c' (#241) from fix/change_task into test
2 years ago
lihui_ocr df1b8efb30 fix:顶部内容回显,快捷键c
2 years ago
yaoshuli 838552242c Merge pull request 'feat: 修改加载问题' (#240) from fix/updatesyspic into test
2 years ago
yaoshuli 98b0942dc6 Merge pull request 'feat: 增加沉浸模式快捷键提示' (#239) from 20240420keydown into test
2 years ago
raofuzi 8a68a00d8a Merge branch 'test' of https://git.mcnetmart.com/guoxiangbin/ocr-web into fix/updatesyspic
2 years ago
raofuzi b1bf76eb43 feat: 修改加载问题
2 years ago
zhouxiaoan 34c21adf21 feat: 增加沉浸模式快捷键提示
2 years ago
赵辉 f4304a1062 Merge pull request 'feat:详情页跳转回' (#238) from fix/change_task into test
2 years ago
lihui_ocr 024d7892dc feat:详情页跳转回
2 years ago
李忠 c6631bdd21 Merge pull request 'feat: 更改任务状态字段' (#237) from 20240420keydown into test
2 years ago
李忠 c3ce0fc03d Merge pull request 'fix/updatesyspic' (#236) from fix/updatesyspic into test
2 years ago
zhouxiaoan 40957ee00d feat: 更改任务状态字段
2 years ago
raofuzi 4a5ace400d feat: 修改加载问题
2 years ago
raofuzi e6a93cac62 feat: 修改加载问题
2 years ago
raofuzi 79bf7f039c Merge branch 'test' of https://git.mcnetmart.com/guoxiangbin/ocr-web into fix/updatesyspic
2 years ago
raofuzi c5dbcdf3fc feat: 修改加载问题
2 years ago
yaoshuli 723b5cba3f Merge pull request 'fix/updatesyspic' (#235) from fix/updatesyspic into test
2 years ago
raofuzi 8d4c7bcb47 Merge branch 'test' of https://git.mcnetmart.com/guoxiangbin/ocr-web into fix/updatesyspic
2 years ago
raofuzi 92049e5c6c feat: 修改拖动
2 years ago
李忠 fe4407fefc Merge pull request 'feat: 增加快捷键操作' (#234) from 20240420keydown into test
2 years ago
zhouxiaoan 682063c263 feat: 增加快捷键操作
2 years ago
赵辉 a7fa0cb98f Merge pull request 'feat:展示全部内容将高筛其他条件一并带上' (#233) from fix/change_task into test
2 years ago
lihui_ocr 40018c0899 feat:展示全部内容将高筛其他条件一并带上
2 years ago
赵辉 41b635d8ec Merge pull request 'fix:任务审批添加销毁' (#232) from fix/change_task into test
2 years ago
lihui_ocr 8d4dcc04be fix:任务审批添加销毁
2 years ago
赵辉 9dd7ee140f Merge pull request 'fix:通过不通过后状态的控制' (#231) from fix/change_task into test
2 years ago
lihui_ocr 9957c9e493 fix:通过不通过后状态的控制
2 years ago
赵辉 eb70a71fa9 Merge pull request 'fix:顶部间距调整 查重图片名字不全 下拉框偏移' (#230) from fix/change_task into test
2 years ago
lihui_ocr 37b46395ef fix:顶部间距调整 查重图片名字不全 下拉框偏移
2 years ago
yaoshuli df6e795b57 Merge pull request 'feat: 完善taskindex取值逻辑' (#229) from feat/20240417similarite into test
2 years ago
zhouxiaoan f961c27255 feat: 完善taskindex取值逻辑
2 years ago
yaoshuli 99cf47a7dd Merge pull request 'feat:修改图片' (#228) from fix/updatesyspic into test
2 years ago
raofuzi 399d6ac585 Merge branch 'test' of https://git.mcnetmart.com/guoxiangbin/ocr-web into fix/updatesyspic
2 years ago
raofuzi 03e7dc7805 feat:修改图片
2 years ago
赵辉 441e200c16 Merge pull request 'fix:location字段加限制' (#227) from fix/change_task into test
2 years ago
lihui_ocr 3d52e75cca fix:location字段加限制
2 years ago
yaoshuli a9d0ba121f Merge pull request 'fix/updatesyspic' (#226) from fix/updatesyspic into test
2 years ago
raofuzi af3ac1eb5e feat:修改图片
2 years ago
raofuzi cb6b367186 Merge branch 'test' of https://git.mcnetmart.com/guoxiangbin/ocr-web into fix/updatesyspic
2 years ago
raofuzi 25b99e95ba feat:修改图片
2 years ago
赵辉 03f5aa11dc Merge pull request 'fix:选中模糊查询后动态关联' (#225) from fix/change_task into test
2 years ago
lihui_ocr 4a3fba0b13 fix:选中模糊查询后动态关联
2 years ago
赵辉 e9ac871339 Merge pull request 'fix:终审滚动展示问题修改' (#224) from fix/change_task into test
2 years ago
lihui_ocr b45a9df6b0 fix:终审滚动展示问题修改
2 years ago
yaoshuli e42b3fb7dd Merge pull request 'fix/updatesyspic' (#223) from fix/updatesyspic into test
2 years ago
raofuzi 113091d460 feat:修改图片
2 years ago
raofuzi c28e2ca125 Merge branch 'test' of https://git.mcnetmart.com/guoxiangbin/ocr-web into fix/updatesyspic
2 years ago
yaoshuli 586c66de5a Merge pull request 'feat: 审批选择增加taskindex条件' (#222) from feat/20240417similarite into test
2 years ago
raofuzi 79c8fbe859 Merge branch 'test' of https://git.mcnetmart.com/guoxiangbin/ocr-web into fix/updatesyspic
2 years ago
raofuzi 43bf9b414b feat:修改图片
2 years ago
zhouxiaoan b675eb3611 feat: 审批选择增加taskindex条件
2 years ago
zhouxiaoan 628c4a44f1 feat: 审批选择增加taskindex条件
2 years ago
yaoshuli 5513ed4657 Merge pull request 'feat:修改图片' (#221) from fix/updatesyspic into test
2 years ago
raofuzi 9d21dcb1cd Merge branch 'test' of https://git.mcnetmart.com/guoxiangbin/ocr-web into fix/updatesyspic
2 years ago
raofuzi 7e6da80846 feat:修改图片
2 years ago
yaoshuli 29bd07a654 Merge pull request 'feat: 主图获取接口增加taskindex字段' (#220) from feat/20240417similarite into test
2 years ago
zhouxiaoan 57849f1f15 feat: 主图获取接口增加taskindex字段
2 years ago
zhouxiaoan d17304c9ff feat: 主图获取接口增加taskindex字段
2 years ago
yaoshuli 68fdfecc5b Merge pull request 'fix/updatesyspic' (#217) from fix/updatesyspic into test
2 years ago
raofuzi 7e2365a6ae feat:修改图片
2 years ago
raofuzi 4f47a82f27 feat:修改图片
2 years ago
raofuzi 00c94f858f Merge branch 'test' of https://git.mcnetmart.com/guoxiangbin/ocr-web into fix/updatesyspic
2 years ago
raofuzi f94169ec20 feat:修改图片
2 years ago
刘释隆 c73ebe5e55 Merge pull request 'fix:修复样式问题' (#218) from fix/ui_error into test
2 years ago
刘释隆 31b02e2c68 Merge branch 'test' into fix/ui_error
2 years ago
刘释隆 b43e9beb2e feat: 解决冲突
2 years ago
刘释隆 e0a4bc292a feat: 样式修复
2 years ago
刘释隆 1e74d0ac80 feat: 距顶部180px,左右居中展示
2 years ago
raofuzi 88f8b84c78 feat:修改冲突
2 years ago
刘释隆 f30d1960e5 feat: 前置符号与星号与文字等高
2 years ago
raofuzi e693d15462 feat:修改冲突
2 years ago
刘释隆 3b772d2ad8 feat: 相似度阈值样式
2 years ago
刘释隆 8df512b429 Merge pull request 'feat: api请求数据处理及bug修复' (#216) from fix/allseach_bug into test
2 years ago
刘释隆 2246792839 Merge pull request 'fix: 修复问题' (#215) from fix/bug into test
2 years ago
刘释隆 45cf403746 Merge branch 'test' into fix/bug
2 years ago
刘释隆 2ebbd52929 fix: 解决冲突
2 years ago
刘释隆 f9bd200593 feat: api请求数据处理及bug修复
2 years ago
刘释隆 417ece83b9 feat: bug修复
2 years ago
刘释隆 3b0b8c5579 Merge pull request 'feat:任务审批图片相似度接口增加参数' (#213) from feat/20240417similarite into test
2 years ago
zhouxiaoan 6d676b1ea3 feat:任务审批图片相似度接口增加参数
2 years ago
刘释隆 17dc01afa7 Merge pull request 'feat:修改冲突' (#211) from fix/updatesyspic into test
2 years ago
赵辉 b1904b3236 Merge pull request 'feat:添加阈值标签,全部展示功能的联动' (#212) from fix/change_task into test
2 years ago
lihui_ocr 9783d5f0ab feat:添加阈值标签,全部展示功能的联动
2 years ago
raofuzi 72d9431235 Merge branch 'test' of https://git.mcnetmart.com/guoxiangbin/ocr-web into fix/updatesyspic
2 years ago
raofuzi 259d846d86 feat:修改冲突
2 years ago
刘释隆 bc5e4137a5 feat: 异步弹窗调整
2 years ago
刘释隆 c9282047ec Merge pull request 'fix/updatesyspic' (#208) from fix/updatesyspic into test
2 years ago
raofuzi e8c7b3cfeb feat:修改冲突
2 years ago
raofuzi e73a59932b feat:修改冲突
2 years ago
刘释隆 b9b292289e feat: 基本信息蒙版距离任务包名称16,任务包名称距离输入框8,
2 years ago
刘释隆 91480ef28e feat: 顶部当前位置图标应与下方高级筛选图标对齐
2 years ago
刘释隆 4eea9f79d7 feat: 左侧高级筛选模块距离左侧模块边框16像素,距离底部16px,
2 years ago
赵辉 7d01f2f255 Merge pull request 'feat:卡片模式及表格模式连动,卡片模式及高级筛选联动' (#210) from fix/change_task into test
2 years ago
lihui_ocr 3e26b67957 feat:卡片模式及表格模式连动,卡片模式及高级筛选联动
2 years ago
赵辉 a1e5ee2dd5 Merge pull request 'feat:添加三种排序方式' (#209) from fix/change_task into test
2 years ago
lihui_ocr bb7b9c3954 feat:添加三种排序方式
2 years ago
raofuzi 9a5700ae00 feat: 修改图片相关bug
2 years ago
raofuzi 2c3d200d75 feat: 修改图片相关bug
2 years ago
刘释隆 2eccbba7d2 Merge pull request 'feat: 样式补全及逻辑优化' (#207) from feat/allSearch_style into test
2 years ago
刘释隆 bf836818d3 feat: 必填标识调整
2 years ago
刘释隆 e1ff1bef0e feat: 修复逻辑问题及样式缺陷
2 years ago
赵辉 62e90716bf Merge pull request 'fix:整体样式调整' (#206) from fix/change_task into test
2 years ago
lihui_ocr eb80c0fc25 fix:整体样式调整
2 years ago
刘释隆 dc249d2e52 Merge pull request 'fix: 修复所有模块全局搜索后不重置条件问题' (#205) from fix/allSearch into test
2 years ago
刘释隆 d1b59974c7 fix: 修复所有模块全局搜索后不重置条件问题
2 years ago
刘释隆 71541e579f Merge pull request 'fix: 修复一键查重默认字段不生效问题' (#204) from fix/home_nodefault into test
2 years ago
刘释隆 22d655c4d1 fix: 修复一键查重默认字段不生效问题
2 years ago
刘释隆 0187c85944 Merge pull request 'fix: rule提示图标补全' (#202) from fix/url_error into test
2 years ago
刘释隆 e4cff7e758 fix: rule提示图标补全
2 years ago
赵辉 3b42457c9d Merge pull request 'fix:根据ui调整卡片样式' (#201) from fix/change_task into test
2 years ago
lihui_ocr 3dea84c958 fix:根据ui调整卡片样式
2 years ago
赵辉 13d32c2072 Merge pull request 'feat:终审批量通过批量不通过' (#200) from fix/change_task into test
2 years ago
lihui_ocr 9cb6d0f454 feat:终审批量通过批量不通过
2 years ago
刘释隆 2e82f3fe14 Merge pull request 'feat:处理xx键执行异常' (#199) from fix/bug-20240416 into test
2 years ago
zhouxiaoan 78d5f11abe feat:处理xx键执行异常
2 years ago
zhouxiaoan 4beede5e22 feat:处理xx键执行异常
2 years ago
刘释隆 f8265a2d26 Merge pull request 'feat: 头部数据对接接口' (#198) from feat/data_header into test
2 years ago
刘释隆 ed94b40c36 feat: 头部数据对接接口
2 years ago
刘释隆 7eafe1f938 Merge pull request 'fix: 修复公司名称展示及菜单权限限制' (#197) from fix/menus_error into test
2 years ago
刘释隆 0816abc9c7 fix: 修复公司名称展示及菜单权限限制
2 years ago
赵辉 4f17d6b808 Merge pull request 'feat:卡片页滚动与通过后状态修改' (#196) from fix/change_task into test
2 years ago
lihui_ocr 9bcc0a6425 feat:卡片页滚动与通过后状态修改
2 years ago
刘释隆 cb5da29223 Merge pull request 'fix: 修复全局搜索任务审批模块报错问题' (#195) from fix/allSearch_task_error into test
2 years ago
刘释隆 b319a18072 fix: 修复全局搜索任务审批模块报错问题
2 years ago
李忠 08973c8225 Merge pull request 'fix: 加入可疑文件夹增加消息提示' (#194) from fix/confirmTips into test
2 years ago
zhouxiaoan 64d9d2f01a fix: 加入可疑文件夹增加消息提示
2 years ago
刘释隆 632fc96cdb Merge pull request 'feat: 去除任务审批字段全选功能' (#193) from feat/fieldModal into test
2 years ago
刘释隆 da37a816bb feat: 去除任务审批字段全选功能
2 years ago
zhouxiaoan 2d53182446 Merge pull request 'feat: 自定义任务包字段清空搜索条件' (#192) from fix/modalClear into test
2 years ago
zhouxiaoan 8c13e8bf0d feat: 自定义任务包字段清空搜索条件
2 years ago
赵辉 bbfcc03d56 Merge pull request 'feat:新增终审卡片效果' (#191) from fix/change_task into test
2 years ago
lihui_ocr ebef733996 feat:新增终审卡片样式
2 years ago
李忠 848ecd9838 Merge pull request 'feat: 按键事件处理' (#190) from fix/keyhandler into test
2 years ago
zhouxiaoan 98f1fda6db feat: 处理类型报错
2 years ago
zhouxiaoan 428663af5c feat: 按键事件处理
2 years ago
李忠 99545f481a Merge pull request 'fix/suspiciousSort' (#189) from fix/suspiciousSort into test
2 years ago
raofuzi f1b3364018 feat: 修改加载bug
2 years ago
raofuzi 1166daa7b6 feat: 修改加载bug
2 years ago
raofuzi dd28d3f238 Merge branch 'test' of https://git.mcnetmart.com/guoxiangbin/ocr-web into fix/suspiciousSort
2 years ago
raofuzi d9e2702936 feat: 修改加载bug
2 years ago
刘释隆 bdd40db2b3 Merge pull request 'fix: 修复用户设置点击报错bug' (#188) from fix/userClickBug into test
2 years ago
刘释隆 6042b2a350 fix: 修复用户设置点击报错bug
2 years ago
刘释隆 21ff0cfca4 Merge pull request 'fix: 删除无效代码' (#187) from fix/20240412bug into test
2 years ago
zhouxiaoan 5f65940c1b fix: 删除无效代码
2 years ago
zhouxiaoan 8edc6d14ea feat: 修改bug
2 years ago
raoyongjun 9d6d0b2de8 Merge pull request 'fix/suspiciousSort' (#185) from fix/suspiciousSort into test
2 years ago
raofuzi 2aaa96fbcd feat: 修改滚动bug
2 years ago
raofuzi d40509e294 feat: 修改滚动bug
2 years ago
raofuzi 3b2f46e984 feat: 修改bug
2 years ago
刘释隆 7fa2dc76b9 Merge pull request 'feat: 适配登录接口修改' (#184) from feat/changeLogin into test
2 years ago
刘释隆 d722e6fc1d feat: 适配登录接口修改
2 years ago
刘释隆 197b6cc288 Merge pull request 'fix: 修复全局搜索后页面数据多次获取问题' (#183) from fix/fetch_bug into test
2 years ago
刘释隆 6caa3d46bf fix: 修复全局搜索后页面数据多次获取问题
2 years ago
刘释隆 572903f4dc Merge pull request 'fix: 修复终审页面无法跳转首页问题' (#182) from fix/jumpHome_error into test
2 years ago
刘释隆 5156b9ccae fix: 修复终审页面无法跳转首页问题
2 years ago
刘释隆 5e52a9a191 Merge pull request 'chore: eslint报错规则修改' (#181) from chore/eslintChange into test
2 years ago
刘释隆 122a38c381 chore: eslint报错规则修改
2 years ago
刘释隆 6400ab613a Merge pull request 'fix: 冲突修复' (#180) from fix/merge into test
2 years ago
刘释隆 8ab2376871 fix: 冲突修复
2 years ago
赵辉 6abd4859fe Merge pull request 'feat:超出添加提示' (#179) from fix/change_task into test
2 years ago
lihui_ocr e1ef8e35e7 feat:超出添加提示
2 years ago
刘释隆 02c81d0b41 Merge pull request 'chore: 提交git统一代码风格' (#178) from chore/husky into test
2 years ago
raoyongjun d401a2ce6a Merge pull request 'fix/suspiciousSort' (#177) from fix/suspiciousSort into test
2 years ago
raofuzi e4e3d251e0 feat: 修改bug
2 years ago
刘释隆 d4d6be6e25 feat: git提交前操作
2 years ago
raofuzi d4042d234e Merge branch 'test' of https://git.mcnetmart.com/guoxiangbin/ocr-web into fix/suspiciousSort
2 years ago
raofuzi ce25698eb8 feat: 修改bug
2 years ago
刘释隆 3f811759e3 feat: eslint配置save
2 years ago
刘释隆 08d0c2dea6 feat: eslint配置
2 years ago
zhouxiaoan 356e897bce Merge branch 'fix/20240412bug' into test
2 years ago
raoyongjun 93ffdeed71 Merge pull request 'feat: 修改bug' (#175) from fix/suspiciousSort into test
2 years ago
raofuzi 6be68c72a5 Merge branch 'test' of https://git.mcnetmart.com/guoxiangbin/ocr-web into fix/suspiciousSort
2 years ago
raofuzi 3e0158679f feat: 修改bug
2 years ago
zhouxiaoan 037f5d30d0 fix: 合并test分支处理冲突
2 years ago
贾博轩 2256b416ac Merge branch 'test' of https://git.mcnetmart.com/guoxiangbin/ocr-web into test
2 years ago
贾博轩 40ca137203 feat: 解决逻辑冲突问题
2 years ago
zhouxiaoan cd42a5bc40 fix: 合并test分支处理冲突
2 years ago
刘释隆 75e1c098b7 Merge pull request 'fix: 回滚样式并调整字段取值' (#174) from fix/error_ui into test
2 years ago
刘释隆 257ebca62b fix: 回滚样式并调整字段取值
2 years ago
zhouxiaoan 878a81a355 fix: 处理图鉴管理布局样式
2 years ago
raoyongjun 5a0d4e8b0a Merge pull request 'fix/suspiciousSort' (#173) from fix/suspiciousSort into test
2 years ago
raofuzi f5cc60e423 feat: 修改bug
2 years ago
raofuzi 39e4d383fe feat: 修改bug
2 years ago
raofuzi 6ce50b5d33 feat: 修改bug
2 years ago
赵辉 68eee1a809 Merge pull request 'fix:箭头的选中状态' (#172) from fix/change_task into test
2 years ago
lihui_ocr 732d41db11 fix:箭头的选中状态
2 years ago
赵辉 9dc782de7f Merge pull request 'fix:修改沉浸模式样式' (#171) from fix/change_task into test
2 years ago
lihui_ocr eec8ad7573 fix:修改沉浸模式样式
2 years ago
贾博轩 43d15cfdcf feat: 新增最后审批查找功能
2 years ago
贾博轩 cc6f0ce4c1 Merge branch 'test' of https://git.mcnetmart.com/guoxiangbin/ocr-web into test
2 years ago
贾博轩 995dad8723 feat: 修改消息列表审批通知等功能
2 years ago
刘释隆 ca6fb53d08 Merge pull request 'feat/select_change' (#170) from feat/select_change into test
2 years ago
刘释隆 79596247f1 Merge branch 'test' into feat/select_change
2 years ago
刘释隆 acd661ffd2 feat: 任务审批逻辑修改及图审主图展示适配
2 years ago
raoyongjun fe50821c30 Merge pull request 'fix/suspiciousSort' (#168) from fix/suspiciousSort into test
2 years ago
raofuzi 00ec4dd402 feat: 修改bug
2 years ago
raofuzi 663afdaf5e feat: 修改bug
2 years ago
赵辉 1304f3365d Merge pull request 'feat:位置信息加标签' (#167) from fix/change_task into test
2 years ago
lihui_ocr ff103fe611 位置信息加标签
2 years ago
赵辉 303a8b0f90 Merge pull request 'FIX:第四次审批样式修改' (#166) from fix/change_task into test
2 years ago
lihui_ocr 1e041144b8 FIX:第四次审批样式修改
2 years ago
刘释隆 f50f8ac87b Merge pull request 'feat: 任务审批自定义字段逻辑修改及图审主图ui修改' (#165) from feat/ui_task_update into test
2 years ago
刘释隆 6ad5e1f158 feat: 任务审批自定义字段逻辑修改及图审主图ui修改
2 years ago
贾博轩 afa388f6eb feat: 合并test分支内容到jia
2 years ago
zhouxiaoan 8aa1090229 Merge pull request 'fix: 处理图鉴管理布局错误' (#164) from fix/20240412bug into test
2 years ago
zhouxiaoan b80d9edef4 fix: 处理图鉴管理布局错误
2 years ago
raofuzi 28dde2bfa4 Merge branch 'test' of https://git.mcnetmart.com/guoxiangbin/ocr-web into fix/suspiciousSort
2 years ago
刘释隆 7e34bf0440 Merge pull request 'fix: 修复打包时报错问题' (#163) from fix/import_error into test
2 years ago
刘释隆 bb68446e6a fix: 修复打包时报错问题
2 years ago
刘释隆 52e92a391c Merge pull request 'feat: 高级筛选样式修改' (#162) from feat/ui_error_superSearch into test
2 years ago
刘释隆 128ed694cf feat: 高级筛选样式修改
2 years ago
zhouxiaoan 9ff0959153 fix: 合并代码处理冲突
2 years ago
zhouxiaoan daf79405c1 Merge pull request 'fix:20240410bug修复' (#154) from fix/modifyStyle into test
2 years ago
zhouxiaoan 38a43bed83 fix: 合并代码处理冲突
2 years ago
raofuzi 939a7344c8 Merge branch 'test' of https://git.mcnetmart.com/guoxiangbin/ocr-web into fix/suspiciousSort
2 years ago
raofuzi ab88ad3e68 feat: 修改bug
2 years ago
zhouxiaoan 6c734d297c fix:
2 years ago
赵辉 6586b20488 Merge pull request 'feat:动态的' (#160) from fix/change_task into test
2 years ago
lihui_ocr 8fa20480f1 feat:动态的
2 years ago
赵辉 926c09d83f Merge pull request 'fix:排序功能修改完成' (#159) from fix/change_task into test
2 years ago
lihui_ocr b861266987 fix:排序功能修改完成
2 years ago
赵辉 cf7386b337 Merge pull request 'fix:沉浸模式布局及不同状态优化' (#158) from fix/change_task into test
2 years ago
lihui_ocr 0b860955ef fix:沉浸模式布局及不同状态优化
2 years ago
刘释隆 f91f028cf7 Merge pull request 'feat: 适配后端字段' (#156) from fix/task_modules_error into test
2 years ago
刘释隆 06296781db feat: 适配后端字段
2 years ago
刘释隆 dd072b58c5 Merge pull request 'feat: 修改样式缺陷并完善图审页面适配后端字段变动' (#155) from fix/home_ui_erro into test
2 years ago
刘释隆 a45ba04d32 feat: 修改样式缺陷并完善图审页面适配后端字段变动
2 years ago
刘释隆 622ff84521 Merge pull request 'feat: 修改样式' (#153) from fix/ui_error into test
2 years ago
刘释隆 5d898cb6be feat: 修改样式
2 years ago
raoyongjun e9b26e8334 Merge pull request 'fix/suspiciousSort' (#152) from fix/suspiciousSort into test
2 years ago
raofuzi 774a6677e1 Merge branch 'test' of https://git.mcnetmart.com/guoxiangbin/ocr-web into fix/suspiciousSort
2 years ago
raofuzi ab5ffd320c feat: 修改bug
2 years ago
刘释隆 54e6a6386c Merge pull request 'fix: 终审页面无法跳转bug修复' (#151) from fix/home_ui_erro into test
2 years ago
刘释隆 fa59bd43c0 fix: 终审页面无法跳转bug修复
2 years ago
raoyongjun d63bb0eb2f Merge pull request 'feat: 修改bug' (#150) from fix/suspiciousSort into test
2 years ago
raofuzi 1ecfc7abcb Merge branch 'test' of https://git.mcnetmart.com/guoxiangbin/ocr-web into fix/suspiciousSort
2 years ago
raofuzi 2ce03ead8f feat: 修改bug
2 years ago
shenhailong b4dc165ded Merge pull request 'feat:终审table 滚动问题' (#149) from fix/finalScroll into test
2 years ago
Dragon 10df0d3250 终审table 滚动问题
2 years ago
zhouxiaoan dae1ebcffd fix:
2 years ago
赵辉 8c1298ba96 Merge pull request 'fix:沉浸模式下小图片的审核功能及批量操作' (#148) from fix/changeimgback into test
2 years ago
lihui_ocr 79dde563fe fix:沉浸模式下小图片的审核功能及批量操作
2 years ago
赵辉 19dcce1d85 Merge pull request 'fix:任务审批布局错乱修改' (#147) from fix/changeimgback into test
2 years ago
lihui_ocr 06efeb904e fix:任务审批布局错乱修改
2 years ago
赵辉 206d3c570c Merge pull request 'fix:通过不通过快捷键问题修改' (#146) from fix/changeimgback into test
2 years ago
lihui_ocr 4a86c212b2 fix:通过不通过快捷键问题修改
2 years ago
raoyongjun f7e52a86e1 Merge pull request 'fix/suspiciousSort' (#145) from fix/suspiciousSort into test
2 years ago
raofuzi d602ede9e9 feat: 修改bug
2 years ago
raofuzi bc0721e2ec Merge branch 'test' of https://git.mcnetmart.com/guoxiangbin/ocr-web into fix/suspiciousSort
2 years ago
raofuzi b683a3d774 feat: 修改bug
2 years ago
zhouxiaoan f59ac652db fix:
2 years ago
刘释隆 f6c442a7e5 Merge pull request 'fix: 层级问题修复及字段展示状态修复' (#144) from fix/ui_field_bug into test
2 years ago
刘释隆 ab76d6b1ea fix: 层级问题修复及字段展示状态修复
2 years ago
raoyongjun 00259a644e Merge pull request 'feat: 修改bug' (#143) from fix/suspiciousSort into test
2 years ago
raofuzi 655d567f3b Merge branch 'test' of https://git.mcnetmart.com/guoxiangbin/ocr-web into fix/suspiciousSort
2 years ago
raofuzi fcdba31a05 feat: 修改bug
2 years ago
shenhailong 5befc433d8 Merge pull request 'feat:筛选背景色' (#142) from fix/finalBg into test
2 years ago
Dragon 6533af31b5 筛选背景色
2 years ago
shenhailong 543bb181c4 Merge pull request 'feat:终审动态列表' (#141) from fix/finalScroll into test
2 years ago
Dragon bc7fcf648d 终审动态列表
2 years ago
赵辉 642c3056db Merge pull request 'feat:主图加入到可疑文件中' (#140) from fix/changeimgback into test
2 years ago
lihui_ocr b4ef13b319 feat:主图加入到可疑文件中
2 years ago
shenhailong 124ba1910c Merge pull request 'feat:显示全部任务数据默认值修改' (#139) from fix/final into test
2 years ago
Dragon af102caccd 显示全部任务数据默认值修改
2 years ago
刘释隆 7e4cb18698 Merge pull request 'feat: 所有页面新增右下角图标,修改登录弹窗,修改样式' (#138) from feat/add_robot into test
2 years ago
刘释隆 49a7e5c053 feat: 所有页面新增右下角图标,修改登录弹窗,修改样式
2 years ago
raoyongjun 8c2e097b8c Merge pull request 'fix/suspiciousSort' (#137) from fix/suspiciousSort into test
2 years ago
raofuzi ebc036b9ed feat: 修改bug
2 years ago
raofuzi 3b7a3f4b19 Merge branch 'test' of https://git.mcnetmart.com/guoxiangbin/ocr-web into fix/suspiciousSort
2 years ago
raofuzi 92932f3903 feat: 修改bug
2 years ago
赵辉 1473d1efc2 Merge pull request 'fix:快捷键 pp xx问题修改' (#136) from fix/changeimgback into test
2 years ago
lihui_ocr f984c8888d fix:快捷键 pp xx问题修改
2 years ago
赵辉 2ca77daaec Merge pull request 'fix:图片样式修改' (#135) from fix/changeimgback into test
2 years ago
lihui_ocr aef13be82e fix:图片样式修改
2 years ago
赵辉 418f335d3c Merge pull request 'feat:添加可疑文件按钮' (#134) from fix/changeimgback into test
2 years ago
lihui_ocr a4fe861b64 feat:添加可疑文件按钮
2 years ago
刘释隆 adfba0701e Merge pull request 'fix: 高级筛选出血线,头部数据样式修改' (#133) from fix/header_ui_error into test
2 years ago
刘释隆 4085e0dd15 fix: 高级筛选出血线,头部数据样式修改
2 years ago
赵辉 fbf1112fbe Merge pull request 'feat:高级检索有信息展示第一个' (#132) from fix/changeimgback into test
2 years ago
lihui_ocr 449cf461a7 feat:高级检索有信息展示第一个
2 years ago
赵辉 bb0b7c9df6 Merge pull request 'feat:快捷键' (#131) from fix/changeimgback into test
2 years ago
lihui_ocr 9b9db907bf feat:快捷键
2 years ago
赵辉 0d1e6d5e3f Merge pull request 'fix:布局平铺' (#130) from fix/changeimgback into test
2 years ago
lihui_ocr 7677963d3a fix:布局平铺
2 years ago
raoyongjun b343464bf7 Merge pull request 'feat: 修改bug' (#129) from fix/suspiciousSort into test
2 years ago
raofuzi b25e87f558 Merge branch 'test' of https://git.mcnetmart.com/guoxiangbin/ocr-web into fix/suspiciousSort
2 years ago
刘释隆 4eba08b97d Merge pull request 'fix: 任务审批模块字段错误修复' (#128) from fix/task_flied_error into test
2 years ago
raofuzi 07c93b17fc feat: 修改bug
2 years ago
刘释隆 1b8c56ac49 fix: 任务审批模块字段错误修复
2 years ago
赵辉 2bcad6d427 Merge pull request 'fix:放大相似图片不同视图效果修改' (#127) from fix/changeimgback into test
2 years ago
lihui_ocr a6e144b15c fix:放大相似图片不同视图效果修改
2 years ago
赵辉 77d61a986d Merge pull request 'fix:相似图片放大时间蒙层' (#126) from fix/changeimgback into test
2 years ago
lihui_ocr e76211ed07 fix:相似图片放大时间蒙层
2 years ago
赵辉 fd1ec733ff Merge pull request 'fix:蒙层高度优化,拖拽功能问题修复' (#125) from fix/changeimgback into test
2 years ago
lihui_ocr 641bb3bba7 fix:蒙层高度优化,拖拽功能问题修复
2 years ago
赵辉 48e63eb920 Merge pull request 'feat:点击位置名称创建腾讯地图坐标' (#124) from fix/changeimgback into test
2 years ago
lihui_ocr 232aad600f feat:点击位置名称创建腾讯地图坐标
2 years ago
刘释隆 4311936ab9 Merge pull request 'feat: 头部数据样式修改' (#123) from feature/data_header into test
2 years ago
刘释隆 bff4baa8fc feat: 头部数据样式修改
2 years ago
刘释隆 c2ee8ba1e1 Merge pull request 'feat: 修复提出样式问题' (#122) from feat/uiNchange into test
2 years ago
刘释隆 abdaa6c3fd feat: 修复提出样式问题
2 years ago
刘释隆 406b88e424 Merge pull request 'feat: 修改样式问题及交互逻辑' (#121) from feat/ui_error into test
2 years ago
刘释隆 c578e2e658 feat: 修改样式问题及交互逻辑
2 years ago
raoyongjun 3800c0b1df Merge pull request 'fix/suspiciousSort' (#120) from fix/suspiciousSort into test
2 years ago
raofuzi 114d5e9527 feat: 修改冲突
2 years ago
raofuzi 5df5e47fc1 Merge branch 'test' of https://git.mcnetmart.com/guoxiangbin/ocr-web into fix/suspiciousSort
2 years ago
赵辉 82150a6042 Merge pull request 'fix:位置信息修改' (#118) from fix/changeimgback into test
2 years ago
lihui_ocr e6283656de fix:位置信息修改
2 years ago
刘释隆 358d444fbb Merge pull request 'feat: 修改样式问题' (#117) from feat/ui_change into test
2 years ago
刘释隆 e8ede46d05 Merge branch 'test' into feat/ui_change
2 years ago
刘释隆 1fd657dba7 feat: 修改样式问题
2 years ago
raofuzi 57ceccc5e1 Merge branch 'test' of https://git.mcnetmart.com/guoxiangbin/ocr-web into fix/suspiciousSort
2 years ago
raofuzi e2e5e6dec3 feat: 修改bug
2 years ago
raofuzi 390a9e0a21 feat: 修改bug
2 years ago
shenhailong 921f8ee7f6 Merge pull request 'feat:fix/highSearch' (#114) from fix/highSearch into test
2 years ago
Dragon f21579e774 Merge branch 'test' into fix/highSearch
2 years ago
Dragon 4356e499ea 左侧检索-高级检索功能-显示全部任务数据
2 years ago
lihui_ocr b4cb862d5f Merge pull request 'fix:图片时间区域加蒙层' (#112) from fix/changeimgback into test
2 years ago
lihui_ocr 22fb56564d fix:图片时间区域加蒙层
2 years ago
lihui_ocr cda699acf8 Merge pull request 'fix:图片中文字及阈值拖拽问题处理' (#111) from fix/changecontent into test
2 years ago
lihui_ocr 831484af02 fix:图片文字区域或阈值可拖拽
2 years ago
shenhailong 337d1bc73c Merge pull request 'feat:任务详情开启关闭规则' (#110) from fix/approvelDetail into test
2 years ago
Dragon c1581d69a0 任务详情开启关闭规则
2 years ago
lihui_ocr cb53ffcc2b 提交信息
2 years ago
raoyongjun e6a00eab6b Merge pull request 'feat: 修改bug' (#109) from fix/suspiciousSort into test
2 years ago
raofuzi 11185901c6 Merge branch 'test' of https://git.mcnetmart.com/guoxiangbin/ocr-web into fix/suspiciousSort
2 years ago
raofuzi c4ef80c082 feat: 修改bug
2 years ago
lihui_ocr afcf3f538e Revert "fix: 图片增加蒙层,图片文字阈值可拖拽"
2 years ago
赵辉 1cca2fc1d0 fix: 图片增加蒙层,图片文字阈值可拖拽
2 years ago
shenhailong 7ff4a7324c Merge pull request 'feat:终审右侧列表动态列问题' (#108) from fix/zhongshenlie into test
2 years ago
Dragon 4bfd0e8928 终审右侧列表动态列问题
2 years ago
yaoshuli 4787f2dd21 Merge pull request 'fix/suspiciousSort' (#107) from fix/suspiciousSort into test
2 years ago
raofuzi 030216cb3a feat: 修改可疑排序规则
2 years ago
raofuzi 0df2265e1f feat: 修改可疑排序规则
2 years ago
刘释隆 175353b86d Merge pull request 'feat: 修改ui样式' (#106) from feat/ui_hw into test
2 years ago
刘释隆 7c6e5b9c45 feat: 修改ui样式
2 years ago
刘释隆 e48c729bc0 Merge pull request 'feat: 任务审批页面调整为1440*1100' (#105) from feat/ui_hw into test
2 years ago
刘释隆 0ee2ea778e feat: 任务审批页面调整为1440*1100
2 years ago
刘释隆 74e6119eb3 Merge pull request 'feat: 任务审批模块左侧筛选条件联动' (#104) from feat/header_data into test
2 years ago
刘释隆 53d3062faa feat: 任务审批模块左侧筛选条件联动
2 years ago
刘释隆 b2d0714264 Merge pull request 'feat: 终审页面卡片列表切换功能添加' (#103) from feat/header_data into test
2 years ago
刘释隆 868b24c023 feat: 终审页面卡片列表切换功能添加
2 years ago
刘释隆 e64c6ad7ee Merge pull request 'feat: 按RP添加头部信息栏' (#102) from feat/header_data into test
2 years ago
刘释隆 087a43ad7e feat: 按RP添加头部信息栏
2 years ago

@ -3,3 +3,4 @@
# node_modules/.bin/lint-staged # node_modules/.bin/lint-staged
date date
npx lint-staged

@ -38,5 +38,11 @@
"json", "json",
"jsonc", "jsonc",
"yaml" "yaml"
] ],
"vue3snippets.enable-compile-vue-file-on-did-save-code": true,
"editor.defaultFormatter": "rvest.vs-code-prettier-eslint",
"[vue]": {
"editor.defaultFormatter": "Wscats.vue"
},
"editor.formatOnSaveMode": "modifications"
} }

2
components.d.ts vendored

@ -11,6 +11,7 @@ declare module 'vue' {
BasicModal: typeof import('./src/components/Modal/BasicModal.vue')['default'] BasicModal: typeof import('./src/components/Modal/BasicModal.vue')['default']
DataHeader: typeof import('./src/components/DataHeader/index.vue')['default'] DataHeader: typeof import('./src/components/DataHeader/index.vue')['default']
NAvatar: typeof import('naive-ui')['NAvatar'] NAvatar: typeof import('naive-ui')['NAvatar']
NBackTop: typeof import('naive-ui')['NBackTop']
NButton: typeof import('naive-ui')['NButton'] NButton: typeof import('naive-ui')['NButton']
NCard: typeof import('naive-ui')['NCard'] NCard: typeof import('naive-ui')['NCard']
NCheckbox: typeof import('naive-ui')['NCheckbox'] NCheckbox: typeof import('naive-ui')['NCheckbox']
@ -53,6 +54,7 @@ declare module 'vue' {
NUpload: typeof import('naive-ui')['NUpload'] NUpload: typeof import('naive-ui')['NUpload']
NUploadDragger: typeof import('naive-ui')['NUploadDragger'] NUploadDragger: typeof import('naive-ui')['NUploadDragger']
Quill: typeof import('./src/components/RichEditor/Quill.vue')['default'] Quill: typeof import('./src/components/RichEditor/Quill.vue')['default']
Robot: typeof import('./src/components/Robot/index.vue')['default']
RouterLink: typeof import('vue-router')['RouterLink'] RouterLink: typeof import('vue-router')['RouterLink']
RouterView: typeof import('vue-router')['RouterView'] RouterView: typeof import('vue-router')['RouterView']
Search: typeof import('./src/components/Search/Search.vue')['default'] Search: typeof import('./src/components/Search/Search.vue')['default']

@ -19,10 +19,15 @@ module.exports = antfu(
'unused-imports/no-unused-vars': 'off', 'unused-imports/no-unused-vars': 'off',
'unused-imports/no-unused-imports': 'off', 'unused-imports/no-unused-imports': 'off',
'jsdoc/require-returns-description': 'off', 'jsdoc/require-returns-description': 'off',
'eqeqeq': 'off',
'no-console': 'off',
'vue/custom-event-name-casing': 'off',
'vue/eqeqeq': 'off',
'no-restricted-syntax': [ 'no-restricted-syntax': [
// eslint-disable-next-line node/prefer-global/process // eslint-disable-next-line node/prefer-global/process
process.env.MODE === 'production' ? 2 : 0, process.env.MODE === 'production' ? 2 : 0,
], ],
'array-callback-return': ['error', { allowImplicit: true }],
}, },
}, },
) )

@ -119,5 +119,6 @@
<div class="selection-box" style="border: 1px dotted black;position: absolute;display: none;"></div> <div class="selection-box" style="border: 1px dotted black;position: absolute;display: none;"></div>
<script>var globalThis = window;</script> <script>var globalThis = window;</script>
<script src="/src/main.ts" type="module"></script> <script src="/src/main.ts" type="module"></script>
<script src="https://map.qq.com/api/js?v=2.exp&key=GIABZ-YUQKX-JOI4L-ZAGIS-673KS-NKBMC"></script>
</body> </body>
</html> </html>

@ -23,7 +23,7 @@ const adminInfo = {
value: 'task-main', value: 'task-main',
}, },
{ {
label: '图审审批管理', label: '图审审批',
value: 'worksheet-main', value: 'worksheet-main',
}, },
], ],

11317
package-lock.json generated

File diff suppressed because it is too large Load Diff

@ -37,6 +37,7 @@
"sortablejs": "^1.15.1", "sortablejs": "^1.15.1",
"vue": "^3.3.8", "vue": "^3.3.8",
"vue-draggable-plus": "^0.3.5", "vue-draggable-plus": "^0.3.5",
"vue-lazyload": "^3.0.0",
"vue-mousetrap": "^1.0.5", "vue-mousetrap": "^1.0.5",
"vue-router": "^4.1.6", "vue-router": "^4.1.6",
"vue-types": "^4.2.1", "vue-types": "^4.2.1",
@ -77,8 +78,8 @@
"vue-tsc": "^1.8.22" "vue-tsc": "^1.8.22"
}, },
"lint-staged": { "lint-staged": {
"*.{ts,tsx,vue}": [ "*.{ts,tsx,vue,js}": [
"pnpm lint:fix" "eslint --fix"
] ]
} }
} }

@ -22,7 +22,7 @@ index 3aacec9..a63ab54 100644
+ class: `${mergedClsPrefix}-form-item-feedback ${mergedClsPrefix}-form-item-feedback--error flex` + class: `${mergedClsPrefix}-form-item-feedback ${mergedClsPrefix}-form-item-feedback--error flex`
+ }, [h('img', { + }, [h('img', {
+ style: { width: '1rem', height: '1rem' }, + style: { width: '1rem', height: '1rem' },
+ src: 'http://47.93.59.251/api/upload/ocr/1711419313955_c.png' + src: 'notice.svg'
+ }), feedbackNodes]) : mergedValidationStatus === 'success' ? h("div", { + }), feedbackNodes]) : mergedValidationStatus === 'success' ? h("div", {
key: "controlled-success", key: "controlled-success",
class: `${mergedClsPrefix}-form-item-feedback ${mergedClsPrefix}-form-item-feedback--success` class: `${mergedClsPrefix}-form-item-feedback ${mergedClsPrefix}-form-item-feedback--success`
@ -179,7 +179,7 @@ index 4f47aad..6dae078 100644
const feedbackNodes = children || feedback ? ((0, vue_1.h)("div", { key: "__feedback__", class: `${mergedClsPrefix}-form-item-feedback__line` }, children || feedback)) : this.renderExplains.length ? ((_a = this.renderExplains) === null || _a === void 0 ? void 0 : _a.map(({ key, render }) => ((0, vue_1.h)("div", { key: key, class: `${mergedClsPrefix}-form-item-feedback__line` }, render())))) : null; const feedbackNodes = children || feedback ? ((0, vue_1.h)("div", { key: "__feedback__", class: `${mergedClsPrefix}-form-item-feedback__line` }, children || feedback)) : this.renderExplains.length ? ((_a = this.renderExplains) === null || _a === void 0 ? void 0 : _a.map(({ key, render }) => ((0, vue_1.h)("div", { key: key, class: `${mergedClsPrefix}-form-item-feedback__line` }, render())))) : null;
- return feedbackNodes ? (mergedValidationStatus === 'warning' ? ((0, vue_1.h)("div", { key: "controlled-warning", class: `${mergedClsPrefix}-form-item-feedback ${mergedClsPrefix}-form-item-feedback--warning` }, feedbackNodes)) : mergedValidationStatus === 'error' ? ((0, vue_1.h)("div", { key: "controlled-error", class: `${mergedClsPrefix}-form-item-feedback ${mergedClsPrefix}-form-item-feedback--error` }, feedbackNodes)) : mergedValidationStatus === 'success' ? ((0, vue_1.h)("div", { key: "controlled-success", class: `${mergedClsPrefix}-form-item-feedback ${mergedClsPrefix}-form-item-feedback--success` }, feedbackNodes)) : ((0, vue_1.h)("div", { key: "controlled-default", class: `${mergedClsPrefix}-form-item-feedback` }, feedbackNodes))) : null; - return feedbackNodes ? (mergedValidationStatus === 'warning' ? ((0, vue_1.h)("div", { key: "controlled-warning", class: `${mergedClsPrefix}-form-item-feedback ${mergedClsPrefix}-form-item-feedback--warning` }, feedbackNodes)) : mergedValidationStatus === 'error' ? ((0, vue_1.h)("div", { key: "controlled-error", class: `${mergedClsPrefix}-form-item-feedback ${mergedClsPrefix}-form-item-feedback--error` }, feedbackNodes)) : mergedValidationStatus === 'success' ? ((0, vue_1.h)("div", { key: "controlled-success", class: `${mergedClsPrefix}-form-item-feedback ${mergedClsPrefix}-form-item-feedback--success` }, feedbackNodes)) : ((0, vue_1.h)("div", { key: "controlled-default", class: `${mergedClsPrefix}-form-item-feedback` }, feedbackNodes))) : null;
+ return feedbackNodes ? (mergedValidationStatus === 'warning' ? ((0, vue_1.h)("div", { key: "controlled-warning", class: `${mergedClsPrefix}-form-item-feedback ${mergedClsPrefix}-form-item-feedback--warning` }, feedbackNodes)) : mergedValidationStatus === 'error' ? ((0, vue_1.h)("div", { key: "controlled-error", class: `${mergedClsPrefix}-form-item-feedback ${mergedClsPrefix}-form-item-feedback--error flex` }, [h('img', { + return feedbackNodes ? (mergedValidationStatus === 'warning' ? ((0, vue_1.h)("div", { key: "controlled-warning", class: `${mergedClsPrefix}-form-item-feedback ${mergedClsPrefix}-form-item-feedback--warning` }, feedbackNodes)) : mergedValidationStatus === 'error' ? ((0, vue_1.h)("div", { key: "controlled-error", class: `${mergedClsPrefix}-form-item-feedback ${mergedClsPrefix}-form-item-feedback--error flex` }, [h('img', {
+ style: { width: '1rem', height: '1rem' },src: 'http://47.93.59.251/api/upload/ocr/1711419313955_c.png' + style: { width: '1rem', height: '1rem' },src: 'notice.svg'
+ }), feedbackNodes])) : mergedValidationStatus === 'success' ? ((0, vue_1.h)("div", { key: "controlled-success", class: `${mergedClsPrefix}-form-item-feedback ${mergedClsPrefix}-form-item-feedback--success` }, feedbackNodes)) : ((0, vue_1.h)("div", { key: "controlled-default", class: `${mergedClsPrefix}-form-item-feedback` }, feedbackNodes))) : null; + }), feedbackNodes])) : mergedValidationStatus === 'success' ? ((0, vue_1.h)("div", { key: "controlled-success", class: `${mergedClsPrefix}-form-item-feedback ${mergedClsPrefix}-form-item-feedback--success` }, feedbackNodes)) : ((0, vue_1.h)("div", { key: "controlled-default", class: `${mergedClsPrefix}-form-item-feedback` }, feedbackNodes))) : null;
}); });
} }

@ -71,6 +71,9 @@ dependencies:
vue-draggable-plus: vue-draggable-plus:
specifier: ^0.3.5 specifier: ^0.3.5
version: 0.3.5(@types/sortablejs@1.15.7) version: 0.3.5(@types/sortablejs@1.15.7)
vue-lazyload:
specifier: ^3.0.0
version: 3.0.0
vue-mousetrap: vue-mousetrap:
specifier: ^1.0.5 specifier: ^1.0.5
version: 1.0.5 version: 1.0.5
@ -7320,6 +7323,10 @@ packages:
- supports-color - supports-color
dev: true dev: true
/vue-lazyload@3.0.0:
resolution: {integrity: sha512-h2keL/Rj550dLgesgOtXJS9qOiSMmuJNeVlfNAYV1/IYwOQYaWk5mFJlwRxmZDK9YC5gECcFLYYj7z1lKSf9ug==}
dev: false
/vue-mousetrap@1.0.5: /vue-mousetrap@1.0.5:
resolution: {integrity: sha512-mDyPBBTnOrpUNDZ4vjd7X8emYwKFG2/Rsi5coZKDmF+dM5XpENrnvdmef4xHq2gcZ1HVmHqeI5jQP17p9fFpzA==} resolution: {integrity: sha512-mDyPBBTnOrpUNDZ4vjd7X8emYwKFG2/Rsi5coZKDmF+dM5XpENrnvdmef4xHq2gcZ1HVmHqeI5jQP17p9fFpzA==}
dependencies: dependencies:

@ -0,0 +1,19 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="64px" height="64px" viewBox="0 0 64 64" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<title>警示</title>
<defs>
<rect id="path-1" x="0" y="0" width="64" height="64"></rect>
</defs>
<g id="页面-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<g id="PrevailCloud-Design-图标集" transform="translate(-664.000000, -6389.000000)">
<g id="警示" transform="translate(664.000000, 6389.000000)">
<mask id="mask-2" fill="white">
<use xlink:href="#path-1"></use>
</mask>
<g id="蒙版"></g>
<path d="M32,4 C47.463973,4 60,16.536027 60,32 C60,47.463973 47.463973,60 32,60 C16.536027,60 4,47.463973 4,32 C4,16.536027 16.536027,4 32,4 Z M32,9 C19.2974508,9 9,19.2974508 9,32 C9,44.7025492 19.2974508,55 32,55 C44.7025492,55 55,44.7025492 55,32 C55,19.2974508 44.7025492,9 32,9 Z" id="形状结合" fill="#FF4E4F" mask="url(#mask-2)"></path>
<path d="M32,41.8150625 C33.5403559,41.8150625 34.7890611,43.0637676 34.7890611,44.6041236 C34.7890611,46.1444795 33.5403559,47.3931847 32,47.3931847 C30.4596441,47.3931847 29.2109389,46.1444795 29.2109389,44.6041236 C29.2109389,43.0637676 30.4596441,41.8150625 32,41.8150625 Z M33,16.6068153 C33.5522847,16.6068153 34,17.0545306 34,17.6068153 L34,36.7882606 C34,37.3405453 33.5522847,37.7882606 33,37.7882606 L31,37.7882606 C30.4477153,37.7882606 30,37.3405453 30,36.7882606 L30,17.6068153 C30,17.0545306 30.4477153,16.6068153 31,16.6068153 L33,16.6068153 Z" id="形状结合备份" fill="#FF4E4F" mask="url(#mask-2)"></path>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.7 KiB

@ -1,17 +1,18 @@
<script lang="ts" setup> <script lang="ts" setup>
import { dateZhCN, zhCN } from "naive-ui"; import { NModalProvider, dateZhCN, zhCN } from 'naive-ui'
import { computed, onMounted, nextTick,inject } from "vue"; import { computed, inject, nextTick, onMounted } from 'vue'
import { AppProvider } from "@/components/Application"; import { AppProvider } from '@/components/Application'
import { lighten } from "@/utils/index"; import { lighten } from '@/utils/index'
import mouseTrapBind from '@/hooks/event/mouseTrapBind' import mouseTrapBind from '@/hooks/event/mouseTrapBind'
const mousetrap = inject('mousetrap') as any const mousetrap = inject('mousetrap') as any
onMounted(()=>{ onMounted(() => {
mouseTrapBind(mousetrap); mouseTrapBind(mousetrap)
}) })
const getThemeOverrides = computed(() => { const getThemeOverrides = computed(() => {
const theme = "#1980FF"; const theme = '#1980FF'
const lightenStr = lighten(theme, 6); const lightenStr = lighten(theme, 6)
return { return {
common: { common: {
@ -21,36 +22,34 @@ const getThemeOverrides = computed(() => {
primaryColorSuppl: theme, primaryColorSuppl: theme,
}, },
Switch: { Switch: {
railColorActive: "#07C984", railColorActive: '#07C984',
}, },
Input: { Input: {
borderHover: "0px", borderHover: '0px',
borderFocus: "0px", borderFocus: '0px',
boxShadowFocus: "#ff0000", boxShadowFocus: '#ff0000',
}, },
Tag: { Tag: {
colorCheckedHover: "#507afd", colorCheckedHover: '#507afd',
colorCheckedPressed: "#507afd", colorCheckedPressed: '#507afd',
}, },
Slider: { Slider: {
fillColor: "#1980FF", fillColor: '#1980FF',
dotBorderActive: "#1980FF", dotBorderActive: '#1980FF',
fillColorHover: "#1980FF", fillColorHover: '#1980FF',
}, },
Card: { Card: {
padding: "0px", padding: '0px',
}, },
Dropdown: { Dropdown: {
optionColorHover: "#e8f2ff", optionColorHover: '#e8f2ff',
}, },
Upload: { Upload: {
draggerBorder: "1px dashed #1980FF", draggerBorder: '1px dashed #1980FF',
draggerBorderHover: "1px dashed #1980FF", draggerBorderHover: '1px dashed #1980FF',
}, },
}; }
}); })
</script> </script>
<template> <template>
@ -59,9 +58,11 @@ const getThemeOverrides = computed(() => {
:date-locale="dateZhCN" :date-locale="dateZhCN"
:theme-overrides="getThemeOverrides" :theme-overrides="getThemeOverrides"
> >
<NModalProvider>
<AppProvider> <AppProvider>
<RouterView /> <RouterView />
</AppProvider> </AppProvider>
</NModalProvider>
</NConfigProvider> </NConfigProvider>
</template> </template>
@ -78,7 +79,31 @@ const getThemeOverrides = computed(() => {
color: #666666 !important; color: #666666 !important;
font-size: 14px !important; font-size: 14px !important;
} }
::v-deep(.n-base-clear > .n-base-clear__clear){ ::v-deep(.n-base-clear > .n-base-clear__clear) {
color: #c9c9c9 !important; color: #c9c9c9 !important;
} }
// .n-form-item.n-form-item--top-labelled .n-form-item-label {
// flex-direction: row-reverse !important;
// justify-content: flex-end !important;
// }
// .n-form-item .n-form-item-label .n-form-item-label__asterisk {
// transform: rotate(-90deg) !important;
// }
.n-scrollbar-content {
padding: 0 7.97px 16 16px;
}
.n-form-item .n-form-item-label {
font-size: 14px !important;
color: #333333 !important;
}
.n-slider-dots > .n-slider-dot {
display: none !important;
}
.n-collapse-item-arrow i svg {
width: 14px !important;
height: 14px !important;
}
.v-binder-follower-content {
//left: -60px;
}
</style> </style>

@ -26,8 +26,7 @@ export async function getPictureTypeList(): Promise<any> {
url: `/static/admin/web/distionary/bytypecode/izpicturetype`, url: `/static/admin/web/distionary/bytypecode/izpicturetype`,
method: 'get', method: 'get',
}) })
const list = res.data&&res.data.length?res.data[0].distionaryList:[]
const list = res.data[0].distionaryList
return list return list
} }
@ -73,7 +72,7 @@ export async function getTFList() {
method: 'get', method: 'get',
}) })
const list = res.data[0].distionaryList const list = res.data&&res.data.length?res.data[0].distionaryList:[]
return list return list
} }
@ -145,7 +144,7 @@ export async function getIztaskrromList(enabled: string) {
params: { enabled }, params: { enabled },
}) })
const list = res.data[0].distionaryList const list = res.data&&res.data.length?res.data[0].distionaryList:[]
return list return list
} }
@ -161,7 +160,7 @@ export async function getIztaskstatusList(enabled: string) {
params: { enabled }, params: { enabled },
}) })
const list = res.data[0].distionaryList const list = res.data&&res.data.length?res.data[0].distionaryList:[]
return list return list
} }
@ -191,7 +190,7 @@ export async function getIzfirmList(enabled: string) {
params: { enabled }, params: { enabled },
}) })
const list = res.data[0].distionaryList const list = res.data&&res.data.length?res.data[0].distionaryList:[]
return list return list
} }
@ -207,7 +206,7 @@ export async function getIzproductnameList(enabled: string) {
params: { enabled }, params: { enabled },
}) })
const list = res.data[0].distionaryList const list = res.data&&res.data.length?res.data[0].distionaryList:[]
return list return list
} }
@ -223,7 +222,7 @@ export async function getizcustomnameList(enabled: string) {
params: { enabled }, params: { enabled },
}) })
const list = res.data[0].distionaryList const list = res.data&&res.data.length?res.data[0].distionaryList:[]
return list return list
} }
@ -237,7 +236,7 @@ export async function getIzCustomtypeList(): Promise<any> {
method: 'get', method: 'get',
}) })
const list = res.data[0].distionaryList const list = res.data&&res.data.length?res.data[0].distionaryList:[]
return list return list
} }
@ -253,7 +252,7 @@ export async function getIzcustomlevel(enabled: string) {
params: { enabled }, params: { enabled },
}) })
const list = res.data[0].distionaryList const list = res.data&&res.data.length?res.data[0].distionaryList:[]
return list return list
} }
@ -269,7 +268,7 @@ export async function getIzprojecttypeList(enabled: string) {
params: { enabled }, params: { enabled },
}) })
const list = res.data[0].distionaryList const list = res.data&&res.data.length?res.data[0].distionaryList:[]
return list return list
} }
@ -298,8 +297,7 @@ export async function getRejectList() {
method: 'get', method: 'get',
}) })
const list = res.data[0].distionaryList return res.data&&res.data.length?res.data[0].distionaryList:[]
return list
} }
/** /**
@ -312,14 +310,14 @@ export async function getBackList() {
method: 'get', method: 'get',
}) })
return res.data[0].distionaryList return res.data&&res.data.length?res.data[0].distionaryList:[]
} }
/** /**
* *
* @returns * @returns
*/ */
export async function getBusinessList(field: string, page: PageParam = { pageNo: 1, pageSize: 200 }) { export async function getBusinessList(field: string, page: PageParam = { pageNo: 1, pageSize: 10000 }) {
const res = await http.request({ const res = await http.request({
url: `/ocr/dictionary/getDictionaryByField`, url: `/ocr/dictionary/getDictionaryByField`,
method: 'get', method: 'get',
@ -365,7 +363,7 @@ export async function getRelationTypeList() {
method: 'get', method: 'get',
}) })
return res.data[0].distionaryList return res.data&&res.data.length?res.data[0].distionaryList:[]
} }
/** /**
@ -377,7 +375,7 @@ export async function getizstatusList() {
url: `/static/admin/web/distionary/bytypecode/izstatus`, url: `/static/admin/web/distionary/bytypecode/izstatus`,
method: 'get', method: 'get',
}) })
return res.data[0].distionaryList return res.data&&res.data.length?res.data[0].distionaryList:[]
} }
/** /**
@ -389,5 +387,5 @@ export async function getizApprovalStatusList() {
url: `/static/admin/web/distionary/bytypecode/izApprovalStatus`, url: `/static/admin/web/distionary/bytypecode/izApprovalStatus`,
method: 'get', method: 'get',
}) })
return res.data[0].distionaryList return res.data&&res.data.length?res.data[0].distionaryList:[]
} }

@ -14,7 +14,7 @@ export async function getFinalList(params: FinalParam) {
Object.keys(notEmptyParams).forEach((key) => { Object.keys(notEmptyParams).forEach((key) => {
const val = notEmptyParams[key] const val = notEmptyParams[key]
if (key === 'izuptime') { if (key === 'izyear') {
const start = formatToDate2(val[0]) const start = formatToDate2(val[0])
const end = formatToDate2(val[1]) const end = formatToDate2(val[1])
notEmptyParams[key] = `${start}-${end}` notEmptyParams[key] = `${start}-${end}`

@ -5,6 +5,17 @@ import { http } from '@/utils/http/axios'
import { pickBy } from 'lodash-es' import { pickBy } from 'lodash-es'
import type { CheckParam, PageParam, QueryPictureParam, UploadParam } from '/#/api' import type { CheckParam, PageParam, QueryPictureParam, UploadParam } from '/#/api'
/**
*
* @returns
*/
export async function gettaskToolsCount(): Promise<any> {
return await http.request({
url: `/ocr/aitools/toolsTaskApprovalCount`,
method: 'get',
})
}
/** /**
* *
* @param params * @param params
@ -79,7 +90,6 @@ export async function getToolsCount() {
}) })
} }
/** /**
* *
* @param note * @param note
@ -108,7 +118,7 @@ export async function oneClickCheck(params: Partial<CheckParam> = { search_histo
* @param note * @param note
* @returns * @returns
*/ */
export async function oneClickCheckTaskPackage(params: Partial<CheckParam> = { search_history: '0' }) { export async function oneClickCheckTaskPackage(params: Partial<CheckParam> = { search_history: '0' }) {
const notEmptyParams = pickBy(params, notEmpty) const notEmptyParams = pickBy(params, notEmpty)
Object.keys(notEmptyParams).forEach((key) => { Object.keys(notEmptyParams).forEach((key) => {
@ -131,8 +141,7 @@ export async function oneClickCheck(params: Partial<CheckParam> = { search_histo
* @param note * @param note
* @returns * @returns
*/ */
export async function getLastCheckNo() { export async function getLastCheckNo() {
return http.request({ return http.request({
url: `/ocr/checkDuplicate/getLastCheckNo`, url: `/ocr/checkDuplicate/getLastCheckNo`,
method: 'get', method: 'get',
@ -144,8 +153,7 @@ export async function oneClickCheck(params: Partial<CheckParam> = { search_histo
* @param note * @param note
* @returns * @returns
*/ */
export async function getCheckDuplicateStatus(checkDuplicateNo) { export async function getCheckDuplicateStatus(checkDuplicateNo) {
return http.request({ return http.request({
url: `/ocr/checkDuplicate/getCheckDuplicateStatus`, url: `/ocr/checkDuplicate/getCheckDuplicateStatus`,
method: 'get', method: 'get',
@ -158,8 +166,7 @@ export async function oneClickCheck(params: Partial<CheckParam> = { search_histo
* @param note * @param note
* @returns * @returns
*/ */
export async function removeCheckDuplicate(checkDuplicateNo) { export async function removeCheckDuplicate(checkDuplicateNo) {
return http.request({ return http.request({
url: `/ocr/checkDuplicate/removeCheckDuplicate`, url: `/ocr/checkDuplicate/removeCheckDuplicate`,
method: 'get', method: 'get',
@ -172,12 +179,11 @@ export async function oneClickCheck(params: Partial<CheckParam> = { search_histo
* @param * @param
* @returns * @returns
*/ */
export async function createPackage(params) { export async function createPackage(params) {
return http.request({ return http.request({
url: `/ocr/ocrTaskPackage/createPackage`, url: `/ocr/ocrTaskPackage/createPackage`,
method: 'post', method: 'post',
params params,
}) })
} }
/** /**
@ -185,12 +191,11 @@ export async function oneClickCheck(params: Partial<CheckParam> = { search_histo
* @param * @param
* @returns * @returns
*/ */
export async function deletePackage(params) { export async function deletePackage(params) {
return http.request({ return http.request({
url: `/ocr/ocrTaskPackage/deletePackage`, url: `/ocr/ocrTaskPackage/deletePackage`,
method: 'get', method: 'get',
params params,
}) })
} }
/** /**
@ -270,10 +275,9 @@ export async function getPictureList(params: any): Promise<any> {
* @returns * @returns
*/ */
export async function getFilterList(params) { export async function getFilterList(params) {
return http.request({ return http.request({
url: `/ocr/ocrUsersearch/querySearchCondition`, url: `/ocr/ocrUsersearch/querySearchCondition`,
method: 'get', method: 'get',
params params,
}) })
} }

@ -15,6 +15,7 @@ export async function getApprovalList(page: any) {
pageSize: page.pageSize, pageSize: page.pageSize,
currPage: page.pageNo, currPage: page.pageNo,
keyword: page.keyword, keyword: page.keyword,
userSearchId: page.userSearchId,
}, },
}) })
@ -27,7 +28,7 @@ export async function getApprovalList(page: any) {
/** /**
* *
* @param param * @param params
*/ */
export async function audit(params) { export async function audit(params) {
return http.request({ return http.request({
@ -81,8 +82,6 @@ export async function removeFiles(params) {
/** /**
* () * ()
* @param packageid id
* @param taskchildpictureid id
* @param params * @param params
* @returns * @returns
*/ */
@ -93,7 +92,9 @@ export async function getSimilarityList(params: any) {
params, params,
}) })
const { data: { records, pages, total } } = res const { data } = res
if (data) {
const { records, pages, total } = data
// 精简一下数据 // 精简一下数据
const list = records.map((item) => { const list = records.map((item) => {
return { return {
@ -114,6 +115,14 @@ export async function getSimilarityList(params: any) {
data: records, data: records,
total, total,
} }
}
else {
return {
pageCount: 0,
data: [],
total: 0,
}
}
} }
/** /**
@ -123,10 +132,10 @@ export async function getSimilarityList(params: any) {
* @returns * @returns
*/ */
export async function getTaskDetailInfo(taskId: string, packageid: string) { export async function getTaskDetailInfo(taskId: string, packageid: string, taskNode: string) {
const pid = packageid || 0 const pid = packageid || 0
const res = await http.request({ const res = await http.request({
url: `/backstage/jifen/ocrtaskchildpicture/getdata/${taskId}/${pid}`, url: `/backstage/jifen/ocrtaskchildpicture/getdata/${taskId}/${pid}/${taskNode}`,
method: 'get', method: 'get',
}) })

@ -67,7 +67,6 @@ export async function getPackageTaskList(packageid: string, params: PageParam) {
* @returns * @returns
*/ */
export async function getTaskDetailInfo(checkDuplicateId: string) { export async function getTaskDetailInfo(checkDuplicateId: string) {
const res = await http.request({ const res = await http.request({
url: `/ocr/ocrPicture/getPackagePicture?checkDuplicateId=${checkDuplicateId}`, url: `/ocr/ocrPicture/getPackagePicture?checkDuplicateId=${checkDuplicateId}`,
method: 'get', method: 'get',
@ -84,7 +83,6 @@ export async function getTaskDetailInfo(checkDuplicateId: string) {
* @returns * @returns
*/ */
export async function getPictureSimilarityList(params: PageParam & PictureSortParam & SimilarityPictureSortParam) { export async function getPictureSimilarityList(params: PageParam & PictureSortParam & SimilarityPictureSortParam) {
const res = await http.request({ const res = await http.request({
url: `/backstage/jifen/ocrtaskchildpicture/getPictureSimilarityList`, url: `/backstage/jifen/ocrtaskchildpicture/getPictureSimilarityList`,
method: 'get', method: 'get',
@ -94,23 +92,25 @@ export async function getPictureSimilarityList(params: PageParam & PictureSortPa
const { data: { records, pages, total } } = res const { data: { records, pages, total } } = res
// 精简一下数据 // 精简一下数据
const list = records.map((item,index) => { const list = records.map((item, index) => {
return { return {
id: item.id, id: item.id,
checkDuplicateId: item.checkDuplicateId, checkDuplicateId: item.checkDuplicateId,
taskId: item.taskId, taskId: item.taskId,
taskname: item.fromTaskName, taskname: item.fromTaskName,
assignee: item.assignee, assignee: item.assignee,
pictureid: item.pictureid, pictureid: item.pictureid || item.pictureId,
imgurl: item.serverThumbnailUrl, imgurl: item.imgUrl,
imgUrl: item.imgUrl,
serverThumbnailUrl: item.serverThumbnailUrl,
maxSimilarity: item.maxSimilarity, maxSimilarity: item.maxSimilarity,
thumburl: item.ocrPicture?.serverThumbnailUrl || item.ocrPicture?.imgurl, thumburl: item.ocrPicture?.serverThumbnailUrl || item.ocrPicture?.imgurl,
iztrueorfalse: item.iztrueorfalse, iztrueorfalse: item.iztrueorfalse,
states: item.states, states: item.states,
history: item.ocpictureid && item.picturecompare && hasHistory(item.ocpictureid, item.picturecompare), history: item.ocpictureid && item.picturecompare && hasHistory(item.ocpictureid, item.picturecompare),
historyStates:item.historyStates, historyStates: item.historyStates,
submitDateTimestamp:item.submitDateTimestamp, submitDateTimestamp: item.submitDateTimestamp,
photoDateTimestamp:item.photoDateTimestamp, photoDateTimestamp: item.photoDateTimestamp,
} }
}) })
return { return {

@ -0,0 +1,19 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="48px" height="37px" viewBox="0 0 48 37" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<title>形状 2</title>
<g id="index" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<g id="index_图片加载中" transform="translate(-893.000000, -298.000000)" fill="#F0F0F0" fill-rule="nonzero">
<g id="编组-24" transform="translate(410.000000, 62.000000)">
<g id="编组-27" transform="translate(16.000000, 132.000000)">
<g id="编组-18备份-2" transform="translate(400.000000, 0.000000)">
<g id="形状-3" transform="translate(67.000000, 104.000000)">
<g id="形状-2" transform="translate(0.000000, 0.462637)">
<path d="M12.8421882,20.0575479 C12.1281936,19.0374348 10.9742024,19.0374348 10.2622078,20.0575479 L0.346282996,34.2309071 C-0.367711589,35.249016 0.0582851799,36.0747264 1.29427581,36.0747264 L46.7139313,36.0747264 C47.9519219,36.0747264 48.3659188,35.2510201 47.6479242,34.2349153 L31.9400434,12.0389379 C31.2160489,11.0168206 30.0540576,11.0208289 29.3340631,12.0389379 L18.2181474,27.7454729 L12.8401882,20.0575479 L12.8421882,20.0575479 Z M6.54623594,4.5093408 C6.54623594,7.00050109 8.50022111,9.0186816 10.9102029,9.0186816 C13.3201846,9.0186816 15.2721698,7.00050109 15.2721698,4.5093408 C15.2721698,2.01818051 13.3221846,0 10.9122029,0 C8.50222115,0 6.54823594,2.01818051 6.54823594,4.5093408 L6.54623594,4.5093408 Z" id="形状"></path>
</g>
</g>
</g>
</g>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.7 KiB

@ -0,0 +1,12 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="64px" height="64px" viewBox="0 0 64 64" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<title>小结重复数</title>
<g id="页面-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<g id="PrevailCloud-Design-图标集" transform="translate(-2504.000000, -6389.000000)" fill="#507AFD" fill-rule="nonzero">
<g id="小结重复数" transform="translate(2504.000000, 6389.000000)">
<path d="M64,32 C64,49.6731274 49.6731274,64 32,64 C14.3268738,64 0,49.6731274 0,32 C0,14.3268738 14.3268738,0 32,0 C49.6731274,0 64,14.3268738 64,32 C64,32 64,32 64,32 Z" id="Ellipse-930" fill-opacity="0.1"></path>
<path d="M39.4637452,37.4192503 L42.4384908,40.9882633 L38.4168391,44.1717731 C38.238099,44.3210001 38.0082903,44.383178 37.7784816,44.3583068 L37.7784816,44.3583068 L35.4931621,44.1344663 C35.0463119,44.0971595 34.8292703,43.8360123 34.8803389,43.4007668 L34.8803389,43.4007668 L35.1229147,41.1872326 C35.148449,40.9633921 35.2633534,40.7519871 35.4420935,40.6151957 L35.4420935,40.6151957 L39.4637452,37.4192503 Z M36.3996296,40.9509565 C36.2847253,40.8141651 36.0804509,40.7892939 35.9400123,40.9012142 C35.7995736,41.0131344 35.7740393,41.2121038 35.8889437,41.3488952 L35.8889437,41.3488952 L37.7401802,43.574865 C37.8550845,43.7116564 38.0593589,43.7365276 38.1997975,43.6246073 C38.3402362,43.512687 38.3657705,43.3137177 38.2508661,43.1769262 L38.2508661,43.1769262 Z M34.7015988,24.1007387 C36.0676837,24.1877878 36.3613282,24.3743216 36.2847253,25.6924936 L36.2847253,38.0161584 L33.6546927,40.1302079 C33.2844454,41.0006988 33.1184724,41.8090119 33.1823082,42.5800182 L21.3982301,42.5800182 C19.840638,42.5800182 19.6363636,41.9582389 19.6363636,40.8887786 L19.6363636,26.0655611 C19.6363636,24.8344382 19.751268,24.1256099 21.2322572,24.1007387 L34.7015988,24.1007387 Z M40.8936659,36.3000477 C41.4809547,35.8523666 42.3235865,35.9394157 42.795971,36.499017 L42.795971,36.499017 L44.0599187,38.028594 C44.0726858,38.028594 44.0726858,38.0410296 44.085453,38.0534652 C44.5323032,38.6130665 44.430166,39.4338151 43.8556443,39.8690606 L43.8556443,39.8690606 L43.0002454,40.5530178 L40.0254998,36.9840049 Z M27.2300894,35.6641158 L23.5186803,35.6641158 C23.1851396,35.6441576 22.8663348,35.8038546 22.6825894,36.082934 C22.4997429,36.3503649 22.4997429,36.7025941 22.6825894,36.9700249 C22.864953,37.2412522 23.1786803,37.3896158 23.5186803,37.3896158 L23.5186803,37.3896158 L27.2300894,37.3896158 C27.5700894,37.3896158 27.8838166,37.2412522 28.066953,36.9700249 C28.2500894,36.6987977 28.2500894,36.3533886 28.066953,36.082934 C27.8838166,35.810934 27.5700894,35.6641158 27.2300894,35.6641158 L27.2300894,35.6641158 Z M36.093218,19.6363636 C39.182868,19.7109771 40.6383229,20.5814681 40.6766243,23.5287018 L40.6766243,34.6088081 L40.56172,34.5590658 L37.6252759,36.9218269 L37.6252759,24.1629166 C37.6252759,23.3670392 37.0762885,22.5711617 36.1570538,22.533855 L24.0665642,22.533855 C23.798454,22.533855 23.5175768,22.2851433 23.4920425,22.023996 L23.4920425,21.36491 C23.4920425,20.4819834 24.30914,19.6736704 25.2411418,19.6487992 L25.3049776,19.6487992 L36.093218,19.6363636 Z M32.8238621,31.2997522 L23.5186803,31.2997522 C23.1850199,31.2801224 22.8662573,31.4400929 22.6825894,31.7193431 C22.4997429,31.986774 22.4997429,32.3390032 22.6825894,32.606434 C22.864953,32.8776613 23.1786803,33.0260249 23.5186803,33.0260249 L23.5186803,33.0260249 L32.7983621,33.0260249 C33.1375894,33.0260249 33.4520894,32.8537067 33.6607257,32.606434 C33.8438621,32.3359795 33.8438621,31.9897977 33.6607257,31.7193431 C33.4775894,31.4481158 33.1638621,31.2997522 32.8238621,31.2997522 L32.8238621,31.2997522 Z M23.5186803,26.911434 C23.1786803,26.8867067 22.864953,27.0597977 22.6825894,27.3310249 C22.4997429,27.5984558 22.4997429,27.950685 22.6825894,28.2181158 C22.864953,28.4901158 23.1786803,28.636934 23.5186803,28.636934 L23.5186803,28.636934 L32.7983621,28.636934 C33.1375894,28.662434 33.4513166,28.4901158 33.634453,28.2428431 C33.7913166,27.9716158 33.7913166,27.6262067 33.634453,27.3557522 C33.4513166,27.0845249 33.1638621,26.911434 32.8238621,26.911434 L32.8238621,26.911434 Z" id="形状结合"></path>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 4.2 KiB

@ -0,0 +1,12 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="64px" height="64px" viewBox="0 0 64 64" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<title>卡片模式</title>
<g id="页面-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<g id="PrevailCloud-Design-图标集" transform="translate(-3040.000000, -6389.000000)" fill-rule="nonzero">
<g id="卡片模式" transform="translate(3040.000000, 6389.000000)">
<rect id="矩形" fill="#000000" opacity="0" x="0" y="0" width="64" height="64"></rect>
<path d="M52.8,52.8 L52.8,38.95 L38.95,38.95 L38.95,52.8 L52.8,52.8 M25.05,52.8 L25.05,38.95 L11.2,38.95 L11.2,52.8 L25.05,52.8 M52.8,25.05 L52.8,11.2 L38.95,11.2 L38.95,25.05 L52.8,25.05 M25.05,25.05 L25.05,11.2 L11.2,11.2 L11.2,25.05 L25.05,25.05 M54.55,58 L37.2,58 C35.3,58 33.75,56.45 33.75,54.55 L33.75,37.2 C33.75,35.3 35.3,33.75 37.2,33.75 L54.55,33.75 C56.45,33.75 58,35.3 58,37.2 L58,54.55 C58,56.45 56.45,58 54.55,58 L54.55,58 Z M26.8,58 L9.45,58 C7.55,58 6,56.45 6,54.55 L6,37.2 C6,35.3 7.55,33.75 9.45,33.75 L26.8,33.75 C28.7,33.75 30.25,35.3 30.25,37.2 L30.25,54.55 C30.25,56.45 28.7,58 26.8,58 L26.8,58 Z M54.55,30.25 L37.2,30.25 C35.3,30.25 33.75,28.7 33.75,26.8 L33.75,9.45 C33.75,7.55 35.3,6 37.2,6 L54.55,6 C56.45,6 58,7.55 58,9.45 L58,26.8 C58,28.7 56.45,30.25 54.55,30.25 L54.55,30.25 Z M26.8,30.25 L9.45,30.25 C7.55,30.25 6,28.7 6,26.8 L6,9.45 C6,7.55 7.55,6 9.45,6 L26.8,6 C28.7,6 30.25,7.55 30.25,9.45 L30.25,26.8 C30.25,28.7 28.7,30.25 26.8,30.25 L26.8,30.25 Z" id="形状" fill="#333333"></path>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.6 KiB

@ -0,0 +1,12 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="64px" height="64px" viewBox="0 0 64 64" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<title>任务总数</title>
<g id="页面-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<g id="PrevailCloud-Design-图标集" transform="translate(-930.000000, -6389.000000)" fill="#507AFD" fill-rule="nonzero">
<g id="任务总数" transform="translate(930.000000, 6389.000000)">
<path d="M64,32 C64,49.6731274 49.6731274,64 32,64 C14.3268738,64 0,49.6731274 0,32 C0,14.3268738 14.3268738,0 32,0 C49.6731274,0 64,14.3268738 64,32 C64,32 64,32 64,32 Z" id="Ellipse-930" fill-opacity="0.1"></path>
<path d="M42.8077595,20.3636364 L21.1922405,20.3636364 C20.9718752,20.364003 20.7607017,20.4519898 20.60527,20.6082013 C20.4498384,20.7644129 20.3629095,20.9760242 20.3636409,21.1963887 L20.3636409,27.0159562 L43.6363591,27.0159562 L43.6363591,21.1963887 C43.6370905,20.9760242 43.5501616,20.7644129 43.39473,20.6082013 C43.2392983,20.4519898 43.0281248,20.364003 42.8077595,20.3636364 L42.8077595,20.3636364 Z M23.6724827,24.7283119 C23.097779,24.7283119 22.6318895,24.2624221 22.6318895,23.6877179 C22.6318895,23.1130136 23.097779,22.6471238 23.6724827,22.6471238 C24.2468039,22.6471238 24.7123832,23.1127035 24.7123832,23.6870251 C24.7123832,24.2613467 24.2468039,24.7269264 23.6724827,24.7269264 L23.6724827,24.7283119 Z M20.3636456,42.8036113 C20.3636456,43.2664054 20.7349891,43.6363636 21.1922405,43.6363636 L42.8036027,43.6363636 C43.0239675,43.6363636 43.2352865,43.5487295 43.390978,43.3927781 C43.5466694,43.2368266 43.6339511,43.0253615 43.6335843,42.8049968 L43.6335843,36.9854294 L20.3636456,36.9854294 L20.3636456,42.8049968 L20.3636456,42.8036113 Z M23.6724827,39.2730736 C24.2464213,39.2730736 24.7116904,39.7383431 24.7116904,40.3122821 C24.7116904,40.8862211 24.2464213,41.3514906 23.6724827,41.3514906 C23.0985442,41.3514906 22.6332751,40.8862211 22.6332751,40.3122821 C22.6332751,39.7383431 23.0985442,39.2730736 23.6724827,39.2730736 L23.6724827,39.2730736 Z M20.3636456,35.3240815 L43.6363544,35.3240815 L43.6363544,28.6759185 L20.3636456,28.6759185 L20.3636456,35.3254671 L20.3636456,35.3240815 Z M23.6724827,30.9594059 C24.2468039,30.9594059 24.7123832,31.4249856 24.7123832,31.9993072 C24.7123832,32.5736288 24.2468039,33.0392084 23.6724827,33.0392084 C23.0985442,33.0392084 22.6332751,32.573939 22.6332751,32 C22.6332751,31.426061 23.0985442,30.9607916 23.6724827,30.9607916 L23.6724827,30.9594059 Z" id="形状"></path>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 2.6 KiB

@ -0,0 +1,24 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="64px" height="64px" viewBox="0 0 64 64" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<title>新建</title>
<defs>
<rect id="path-1" x="0" y="0" width="64" height="64"></rect>
</defs>
<g id="页面-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<g id="PrevailCloud-Design-图标集" transform="translate(-664.000000, -3118.000000)">
<g id="新建" transform="translate(664.000000, 3118.000000)">
<g transform="translate(0.000000, 0.000000)">
<mask id="mask-2" fill="white">
<use xlink:href="#path-1"></use>
</mask>
<use id="蒙版" fill="#FFFFFF" fill-rule="nonzero" opacity="0" xlink:href="#path-1"></use>
<g id="编组" mask="url(#mask-2)" fill="#FFFFFF">
<g transform="translate(7.000000, 7.000000)" id="形状结合">
<path d="M48,0 C49.1045695,-2.02906125e-16 50,0.8954305 50,2 L50,22 C50,22.5522847 49.5522847,23 49,23 L46,23 C45.4477153,23 45,22.5522847 45,22 L45,5 L5,5 L5,45 L22,45 C22.5522847,45 23,45.4477153 23,46 L23,49 C23,49.5522847 22.5522847,50 22,50 L2,50 C0.8954305,50 1.3527075e-16,49.1045695 0,48 L0,2 C-1.3527075e-16,0.8954305 0.8954305,2.02906125e-16 2,0 L48,0 Z M40.8724299,28.8483283 C41.4247147,28.8483283 41.8724299,29.2960436 41.8724299,29.8483283 L41.8724299,36.8483283 L48.8724299,36.8483283 C49.4247147,36.8483283 49.8724299,37.2960436 49.8724299,37.8483283 L49.8724299,40.8483283 C49.8724299,41.4006131 49.4247147,41.8483283 48.8724299,41.8483283 L41.8724299,41.8483283 L41.8724299,48.8483283 C41.8724299,49.4006131 41.4247147,49.8483283 40.8724299,49.8483283 L37.8724299,49.8483283 C37.3201452,49.8483283 36.8724299,49.4006131 36.8724299,48.8483283 L36.8724299,41.8483283 L29.8724299,41.8483283 C29.3201452,41.8483283 28.8724299,41.4006131 28.8724299,40.8483283 L28.8724299,37.8483283 C28.8724299,37.2960436 29.3201452,36.8483283 29.8724299,36.8483283 L36.8724299,36.8483283 L36.8724299,29.8483283 C36.8724299,29.2960436 37.3201452,28.8483283 37.8724299,28.8483283 L40.8724299,28.8483283 Z"></path>
</g>
</g>
</g>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 2.3 KiB

@ -0,0 +1,14 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="64px" height="64px" viewBox="0 0 64 64" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<title>已审批</title>
<g id="页面-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<g id="PrevailCloud-Design-图标集" transform="translate(-1458.000000, -6389.000000)" fill="#507AFD" fill-rule="nonzero">
<g id="已审批" transform="translate(1458.000000, 6389.000000)">
<path d="M64,32 C64,49.6731274 49.6731274,64 32,64 C14.3268738,64 0,49.6731274 0,32 C0,14.3268738 14.3268738,0 32,0 C49.6731274,0 64,14.3268738 64,32 C64,32 64,32 64,32 Z" id="Ellipse-930" fill-opacity="0.1"></path>
<g id="编组" transform="translate(20.363636, 20.363636)">
<path d="M17.1722301,12.6691268 C20.5422747,12.6691268 23.2771277,15.3748997 23.272722,18.704746 C23.2638945,22.025864 20.5334526,24.7229086 17.1810522,24.7272727 C13.8110075,24.7272727 11.0761546,22.025864 11.0761546,18.6960177 C11.0761546,15.3705356 13.8065965,12.6691268 17.1722301,12.6691268 Z M10.5909387,21.9560376 C10.8291356,22.4971922 11.1290872,22.9990694 11.4907936,23.4616693 L0,23.4616693 L0,21.9560376 L10.5909387,21.9560376 Z M19.6159535,15.9160543 L16.4444063,19.258993 L14.596175,17.5133331 L13.4757675,18.5389083 L16.4929279,21.4847094 L20.8686926,17.1423804 L19.6159535,15.9160543 Z M10.0130907,0 C13.1317053,0 15.6636499,2.50502198 15.6636499,5.59047588 C15.6636499,6.55495299 15.4166309,7.46269615 14.9843477,8.25260726 L14.9799366,8.25697141 C14.8255498,8.536277 14.6402855,8.80249013 14.4417881,9.05561082 C13.5860438,10.4041331 12.8096985,11.4733498 13.2552148,12.760774 C11.2967072,14.0263774 9.99985758,16.2128165 9.99985758,18.6960177 C9.99985758,19.1629817 10.0483792,19.1760742 10.1321892,19.6168533 L0,19.6168533 L0,14.6286301 L5.58880439,14.6286301 C8.62802004,12.2588968 6.77096665,10.897282 5.56674913,9.03379007 C4.81687008,8.08240542 4.3625316,6.89099252 4.3625316,5.59047588 C4.3625316,2.50502198 6.89447614,0 10.0130907,0 Z" id="形状结合"></path>
</g>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 2.1 KiB

@ -0,0 +1,33 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="64px" height="44px" viewBox="0 0 64 44" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<title>标签</title>
<defs>
<polygon id="path-1" points="0 0 25.9047619 0 25.9047619 3.03448276 0 3.03448276"></polygon>
<polygon id="path-3" points="0 0 25.9047619 0 25.9047619 9.10344828 0 9.10344828"></polygon>
<linearGradient x1="6.6483347%" y1="5.51282194%" x2="77.9785156%" y2="89.1343284%" id="linearGradient-5">
<stop stop-color="#FFA0A0" offset="0%"></stop>
<stop stop-color="#FF4E4F" offset="100%"></stop>
</linearGradient>
</defs>
<g id="页面-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<g id="无法上传iconfont" transform="translate(-1335.000000, -540.000000)">
<g id="标签" transform="translate(1335.000000, 540.000000)">
<g id="编组">
<mask id="mask-2" fill="white">
<use xlink:href="#path-1"></use>
</mask>
<g id="Clip-2"></g>
<path d="M5.19743462,-3.10020716e-05 L2.80500448,-3.10020716e-05 C2.80500448,-3.10020716e-05 0.0824975911,0.592186069 0,7.32785113 L7.0949656,7.32785113 L13.942352,7.32785113 L25.9047619,5.84750222 L6.84747283,2.07245748 L5.19743462,-3.10020716e-05 Z" id="Fill-1" fill="#D44242" mask="url(#mask-2)"></path>
</g>
<g id="编组" transform="translate(38.095238, 0.000000)">
<mask id="mask-4" fill="white">
<use xlink:href="#path-3"></use>
</mask>
<g id="Clip-4"></g>
<path d="M23.0998499,-3.85141222e-05 L20.7074101,-3.85141222e-05 L19.0573653,1.06613433 L0,3.00817174 L11.9623713,3.76972377 L18.8098716,3.76972377 L25.9047792,3.76972377 C25.8222813,0.304622169 23.0998499,-3.85141222e-05 23.0998499,-3.85141222e-05" id="Fill-3" fill="#D44242" mask="url(#mask-4)"></path>
</g>
<path d="M3.04761905,0 C5.4656579,0.257580711 5.47255535,6.18211688 5.47255535,6.18211688 L5.47255535,6.18211688 L5.47255535,35.4136167 C5.47255535,40.1557989 9.20573842,44 13.810795,44 L13.810795,44 L13.8762772,44 L50.1236355,44 L50.1890304,44 C54.794087,44 58.52727,40.1557989 58.52727,35.4136167 L58.52727,35.4136167 L58.52727,6.18211688 C58.52727,6.18211688 58.5341675,0.257580711 60.952381,0 L60.952381,0 L3.04761905,0 Z" id="Fill-5" fill="url(#linearGradient-5)"></path>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 2.6 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 1.2 MiB

@ -0,0 +1,61 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="48px" height="48px" viewBox="0 0 48 48" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<title>编组 33</title>
<defs>
<rect id="path-1" x="0" y="0" width="32" height="32"></rect>
<linearGradient x1="103.941749%" y1="-9.86447236%" x2="15.6759798%" y2="100%" id="linearGradient-3">
<stop stop-color="#94B3FF" offset="0%"></stop>
<stop stop-color="#3955FF" offset="100%"></stop>
</linearGradient>
<path d="M4.81965071,11.9835294 C4.81965071,18.6007843 10.107091,23.964183 16.6334651,23.964183 C23.1570041,23.964183 28.4444444,18.6007843 28.4444444,11.9835294 C28.4444444,5.36339869 23.1570041,0 16.6334651,0 C10.107091,0 4.81965071,5.36339869 4.81965071,11.9835294 Z" id="path-4"></path>
<filter x="0.0%" y="0.0%" width="100.0%" height="100.0%" filterUnits="objectBoundingBox" id="filter-5">
<feOffset dx="0" dy="0" in="SourceAlpha" result="shadowOffsetOuter1"></feOffset>
<feColorMatrix values="0 0 0 0 0.328065454 0 0 0 0 0.41948512 0 0 0 0 1 0 0 0 1 0" type="matrix" in="shadowOffsetOuter1"></feColorMatrix>
</filter>
<rect id="path-6" x="0" y="0" width="28.3508865" height="28.7581699"></rect>
<path d="M2.26807092,15.4345098 C2.26807092,22.0517647 7.55551126,27.4151634 14.0818853,27.4151634 C20.6054243,27.4151634 25.8928647,22.0517647 25.8928647,15.4345098 C25.8928647,8.81437908 20.6054243,3.45098039 14.0818853,3.45098039 C7.55551126,3.45098039 2.26807092,8.81437908 2.26807092,15.4345098 Z" id="path-8"></path>
<linearGradient x1="50.4938081%" y1="35.9999974%" x2="0%" y2="114.811198%" id="linearGradient-9">
<stop stop-color="#FFFFFF" offset="0%"></stop>
<stop stop-color="#FFFFFF" stop-opacity="0" offset="100%"></stop>
</linearGradient>
<filter x="-338.5%" y="-333.7%" width="776.9%" height="767.3%" filterUnits="objectBoundingBox" id="filter-10">
<feGaussianBlur stdDeviation="5.75725631" in="SourceGraphic"></feGaussianBlur>
</filter>
</defs>
<g id="-index备份" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<g id="index_1.0备份-21" transform="translate(-836.000000, -367.000000)">
<g id="编组-8备份-2" transform="translate(473.000000, 206.000000)">
<g id="画板-8" transform="translate(28.881832, 57.745953)">
<g id="画板-4" transform="translate(236.118168, 103.254047)">
<g id="编组-54备份" transform="translate(98.000000, 0.000000)">
<g id="编组-26" transform="translate(0.063866, 1.000000)">
<path d="M48,24 C48,37.2548455 37.2548455,48 24,48 C10.7451553,48 0,37.2548455 0,24 C0,10.7451553 10.7451553,0 24,0 C37.2548455,0 48,10.7451553 48,24 C48,24 48,24 48,24 Z" id="Ellipse-930" fill="#E9EEFF" fill-rule="nonzero"></path>
<g id="Group-1" transform="translate(7.936134, 8.000000)">
<mask id="mask-2" fill="white">
<use xlink:href="#path-1"></use>
</mask>
<g id="蒙版"></g>
<g transform="translate(0.888889, 1.777778)">
<g id="路径">
<use fill="black" fill-opacity="1" filter="url(#filter-5)" xlink:href="#path-4"></use>
<use fill="url(#linearGradient-3)" fill-rule="evenodd" xlink:href="#path-4"></use>
</g>
<g id="user-person-profile-block-account-circle-svgrepo-com-1" transform="translate(0.000000, 0.575163)">
<mask id="mask-7" fill="white">
<use xlink:href="#path-6"></use>
</mask>
<g id="路径"></g>
<path id="路径" d="M14.0818853,3.20098039 C20.7447477,3.20098039 26.1428647,8.67755358 26.1428647,15.4345098 C26.1428647,22.189044 20.7443,27.6651634 14.0818853,27.6651634 C7.41708336,27.6651634 2.01807092,22.1894977 2.01807092,15.4345098 C2.01807092,8.6770998 7.41663558,3.20098039 14.0818853,3.20098039 Z M14.0818853,3.70098039 C7.69438694,3.70098039 2.51807092,8.95165837 2.51807092,15.4345098 C2.51807092,21.9149209 7.69481587,27.1651634 14.0818853,27.1651634 C20.4665486,27.1651634 25.6428647,21.9144854 25.6428647,15.4345098 C25.6428647,8.9520939 20.4669775,3.70098039 14.0818853,3.70098039 Z" fill="#FFFFFF" fill-rule="nonzero"></path>
<path d="M11.3638777,13.9269889 C11.5944007,13.9269889 11.7907721,14.0082723 11.9529919,14.1708392 C12.1152118,14.333406 12.1963217,14.5301975 12.1963217,14.7612135 C12.1963217,14.9836734 12.1152118,15.1783258 11.9529919,15.3451707 C11.7907721,15.5120157 11.5944007,15.5954381 11.3638777,15.5954381 C11.1333548,15.5954381 10.9369834,15.5120157 10.7747636,15.3451707 C10.6125437,15.1783258 10.5314338,14.9836734 10.5314338,14.7612135 C10.5314338,14.5301975 10.6125437,14.333406 10.7747636,14.1708392 C10.9369834,14.0082723 11.1333548,13.9269889 11.3638777,13.9269889 Z M17.8185202,9.13982315 C18.1941872,9.13982315 18.5271648,9.20613331 18.817453,9.33875363 C19.1077411,9.47137395 19.3532054,9.64249695 19.5538457,9.85212262 C19.7544861,10.0617483 19.908168,10.2991814 20.0148916,10.5644221 C20.1216152,10.8296627 20.174977,11.0906253 20.174977,11.3473098 L20.174977,17.9055986 C20.174977,18.10239 20.1301531,18.2949034 20.0405053,18.4831387 C19.9508575,18.671374 19.8313271,18.8424969 19.681914,18.9965076 C19.532501,19.1505183 19.3617433,19.2745825 19.1696408,19.3687002 C18.9775384,19.4628178 18.7790325,19.5098766 18.5741232,19.5098766 L18.5741232,12.3355451 C18.5741232,12.1130852 18.5314338,11.9055986 18.4460549,11.7130852 C18.360676,11.5205718 18.2454146,11.3515879 18.1002705,11.2061333 C17.9551264,11.0606788 17.7865031,10.9451707 17.5944007,10.8596092 C17.4022982,10.7740478 17.1952545,10.731267 16.9732694,10.731267 L9.77583079,10.731267 C9.77583079,10.5430317 9.81852022,10.3547964 9.90389909,10.1665611 C9.98927796,9.97832582 10.1045394,9.80720283 10.2496835,9.65319214 C10.3948276,9.49918144 10.5655853,9.37511727 10.7619567,9.28099962 C10.9583281,9.18688197 11.1675064,9.13982315 11.3894914,9.13982315 L17.8185202,9.13982315 L17.8185202,9.13982315 Z M16.704326,11.5398232 C17.0885309,11.5398232 17.3617433,11.644636 17.5239631,11.8542617 C17.686183,12.0638873 17.7672929,12.3441012 17.7672929,12.6949034 L17.7672929,20.2542617 C17.7672929,20.4681654 17.6776451,20.6692349 17.4983495,20.8574702 C17.3190538,21.0457055 17.0927998,21.1398232 16.8195875,21.1398232 L9.05864829,21.1398232 C8.82812535,21.1398232 8.62321606,21.0457055 8.44392044,20.8574702 C8.26462481,20.6692349 8.174977,20.4424969 8.174977,20.1772563 L8.174977,12.4767215 C8.174977,12.2029248 8.24968351,11.9783258 8.39909653,11.8029248 C8.54850955,11.6275237 8.74701542,11.5398232 8.99461414,11.5398232 L16.704326,11.5398232 Z M16.1792459,13.4906253 C16.1792459,13.3965076 16.1493633,13.3195023 16.0895981,13.2596092 C16.0298329,13.1997162 15.9529919,13.1697697 15.8590752,13.1697697 L10.0831947,13.1697697 C9.98927796,13.1697697 9.91243698,13.1997162 9.85267177,13.2596092 C9.79290656,13.3195023 9.76302396,13.3965076 9.76302396,13.4906253 L9.76302396,16.3526574 C9.83986494,16.446775 9.91030251,16.5515879 9.97433666,16.6670959 C10.0383708,16.7826039 10.1173463,16.8916948 10.211263,16.9943686 C10.3051798,17.0970424 10.4289791,17.1847429 10.5826611,17.2574702 C10.7363431,17.3301975 10.9497902,17.3665611 11.2230026,17.3665611 C11.6242833,17.3665611 11.9508575,17.30239 12.2027251,17.1740478 C12.4545928,17.0457055 12.6765779,16.8831387 12.8686803,16.6863472 C13.0607828,16.4895558 13.2400784,16.2777911 13.4065672,16.0510531 C13.573056,15.8243151 13.7715618,15.6104114 14.0020848,15.4093419 C14.2326077,15.2082723 14.5186269,15.0371494 14.8601424,14.8959729 C15.2016579,14.7547964 15.6413591,14.675652 16.1792459,14.6585397 L16.1792459,13.4906253 L16.1792459,13.4906253 Z" id="形状" fill="url(#linearGradient-9)" fill-rule="nonzero" mask="url(#mask-7)"></path>
</g>
<path d="M15.5929876,24.1568627 C14.1839485,24.1568627 13.0414078,25.315817 13.0414078,26.745098 C13.0414078,28.1743791 14.1839485,29.3333333 15.5929876,29.3333333 C17.0020266,29.3333333 18.1445674,28.1743791 18.1445674,26.745098 C18.1445674,25.315817 17.0020266,24.1568627 15.5929876,24.1568627 Z" id="路径" fill="#8B9CFF" filter="url(#filter-10)"></path>
</g>
</g>
</g>
</g>
</g>
</g>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 8.9 KiB

@ -0,0 +1,19 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="64px" height="64px" viewBox="0 0 64 64" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<title>警示</title>
<defs>
<rect id="path-1" x="0" y="0" width="64" height="64"></rect>
</defs>
<g id="页面-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<g id="PrevailCloud-Design-图标集" transform="translate(-664.000000, -6389.000000)">
<g id="警示" transform="translate(664.000000, 6389.000000)">
<mask id="mask-2" fill="white">
<use xlink:href="#path-1"></use>
</mask>
<g id="蒙版"></g>
<path d="M32,4 C47.463973,4 60,16.536027 60,32 C60,47.463973 47.463973,60 32,60 C16.536027,60 4,47.463973 4,32 C4,16.536027 16.536027,4 32,4 Z M32,9 C19.2974508,9 9,19.2974508 9,32 C9,44.7025492 19.2974508,55 32,55 C44.7025492,55 55,44.7025492 55,32 C55,19.2974508 44.7025492,9 32,9 Z" id="形状结合" fill="#FF4E4F" mask="url(#mask-2)"></path>
<path d="M32,41.8150625 C33.5403559,41.8150625 34.7890611,43.0637676 34.7890611,44.6041236 C34.7890611,46.1444795 33.5403559,47.3931847 32,47.3931847 C30.4596441,47.3931847 29.2109389,46.1444795 29.2109389,44.6041236 C29.2109389,43.0637676 30.4596441,41.8150625 32,41.8150625 Z M33,16.6068153 C33.5522847,16.6068153 34,17.0545306 34,17.6068153 L34,36.7882606 C34,37.3405453 33.5522847,37.7882606 33,37.7882606 L31,37.7882606 C30.4477153,37.7882606 30,37.3405453 30,36.7882606 L30,17.6068153 C30,17.0545306 30.4477153,16.6068153 31,16.6068153 L33,16.6068153 Z" id="形状结合备份" fill="#FF4E4F" mask="url(#mask-2)"></path>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.7 KiB

@ -0,0 +1,12 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="64px" height="64px" viewBox="0 0 64 64" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<title>图片重复数</title>
<g id="页面-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<g id="PrevailCloud-Design-图标集" transform="translate(-2250.000000, -6389.000000)" fill="#507AFD" fill-rule="nonzero">
<g id="图片重复数" transform="translate(2250.000000, 6389.000000)">
<path d="M64,32 C64,49.6731274 49.6731274,64 32,64 C14.3268738,64 0,49.6731274 0,32 C0,14.3268738 14.3268738,0 32,0 C49.6731274,0 64,14.3268738 64,32 C64,32 64,32 64,32 Z" id="Ellipse-930" fill-opacity="0.1"></path>
<path d="M26.2074318,29.5008264 C26.6824488,29.5008264 27.0870929,29.6683196 27.4213641,30.0033058 C27.7556353,30.338292 27.9227709,30.7438017 27.9227709,31.2198347 C27.9227709,31.6782369 27.7556353,32.0793388 27.4213641,32.4231405 C27.0870929,32.7669421 26.6824488,32.938843 26.2074318,32.938843 C25.7324149,32.938843 25.3277708,32.7669421 24.9934996,32.4231405 C24.6592284,32.0793388 24.4920928,31.6782369 24.4920928,31.2198347 C24.4920928,30.7438017 24.6592284,30.338292 24.9934996,30.0033058 C25.3277708,29.6683196 25.7324149,29.5008264 26.2074318,29.5008264 Z M39.5079072,19.6363636 C40.282009,19.6363636 40.9681446,19.7730028 41.5663142,20.046281 C42.1644837,20.3195592 42.6702888,20.6721763 43.0837295,21.1041322 C43.4971702,21.5360882 43.8138482,22.0253444 44.0337635,22.5719008 C44.2536787,23.1184573 44.3636364,23.6561983 44.3636364,24.185124 L44.3636364,37.6991736 C44.3636364,38.1046832 44.271272,38.5013774 44.0865431,38.8892562 C43.9018143,39.277135 43.6555092,39.6297521 43.3476278,39.9471074 C43.0397465,40.2644628 42.687882,40.5201102 42.2920345,40.7140496 C41.8961871,40.907989 41.4871447,41.0049587 41.0649073,41.0049587 L41.0649073,26.2214876 C41.0649073,25.7630854 40.9769412,25.3355372 40.801009,24.938843 C40.6250768,24.5421488 40.3875683,24.1939394 40.0884836,23.8942149 C39.7893988,23.5944904 39.4419327,23.3564738 39.0460852,23.1801653 C38.6502377,23.0038567 38.2236021,22.9157025 37.7661783,22.9157025 L22.9350927,22.9157025 C22.9350927,22.5278237 23.0230588,22.1399449 23.198991,21.7520661 C23.3749232,21.3641873 23.6124317,21.0115702 23.9115164,20.6942149 C24.2106012,20.3768595 24.5624656,20.1212121 24.9671097,19.9272727 C25.3717538,19.7333333 25.8027877,19.6363636 26.2602115,19.6363636 L39.5079072,19.6363636 L39.5079072,19.6363636 Z M37.2119919,24.5818182 C38.0036868,24.5818182 38.5666699,24.7977961 38.9009411,25.2297521 C39.2352123,25.661708 39.4023479,26.2391185 39.4023479,26.9619835 L39.4023479,42.538843 C39.4023479,42.9796143 39.2176191,43.3939394 38.8481614,43.7818182 C38.4787038,44.169697 38.0124834,44.3636364 37.4495003,44.3636364 L21.4572621,44.3636364 C20.9822451,44.3636364 20.5600078,44.169697 20.1905501,43.7818182 C19.8210925,43.3939394 19.6363636,42.9267218 19.6363636,42.3801653 L19.6363636,26.5123967 C19.6363636,25.9482094 19.7903043,25.4853994 20.0981857,25.1239669 C20.4060671,24.7625344 20.8151095,24.5818182 21.3253129,24.5818182 L37.2119919,24.5818182 Z M36.1300087,28.6016529 C36.1300087,28.4077135 36.0684325,28.2490358 35.9452799,28.1256198 C35.8221274,28.0022039 35.6637884,27.9404959 35.4702629,27.9404959 L23.5684486,27.9404959 C23.3749232,27.9404959 23.2165842,28.0022039 23.0934316,28.1256198 C22.9702791,28.2490358 22.9087028,28.4077135 22.9087028,28.6016529 L22.9087028,34.4991736 C23.0670418,34.6931129 23.2121859,34.9090909 23.3441351,35.1471074 C23.4760842,35.385124 23.6388215,35.6099174 23.8323469,35.8214876 C24.0258724,36.0330579 24.2809741,36.2137741 24.5976521,36.3636364 C24.9143301,36.5134986 25.3541606,36.5884298 25.9171437,36.5884298 C26.7440251,36.5884298 27.4169658,36.4561983 27.9359658,36.1917355 C28.4549659,35.9272727 28.9123896,35.5922865 29.3082371,35.1867769 C29.7040846,34.7812672 30.0735423,34.3449036 30.4166101,33.877686 C30.7596779,33.4104683 31.1687203,32.969697 31.6437373,32.5553719 C32.1187542,32.1410468 32.7081272,31.7884298 33.411856,31.4975207 C34.1155849,31.2066116 35.0216358,31.0435262 36.1300087,31.0082645 L36.1300087,28.6016529 L36.1300087,28.6016529 Z" id="形状"></path>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 4.2 KiB

@ -0,0 +1,12 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="64px" height="64px" viewBox="0 0 64 64" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<title>不通过</title>
<g id="页面-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<g id="PrevailCloud-Design-图标集" transform="translate(-1986.000000, -6389.000000)" fill="#507AFD" fill-rule="nonzero">
<g id="不通过" transform="translate(1986.000000, 6389.000000)">
<path d="M64,32 C64,49.6731274 49.6731274,64 32,64 C14.3268738,64 0,49.6731274 0,32 C0,14.3268738 14.3268738,0 32,0 C49.6731274,0 64,14.3268738 64,32 C64,32 64,32 64,32 Z" id="Ellipse-930" fill-opacity="0.1"></path>
<path d="M39.7482333,33.8946117 C42.6991808,33.8946117 45.0909091,36.2863399 45.0909091,39.2372874 C45.0909091,42.188235 42.6991808,44.5799632 39.7482333,44.5799632 C36.7972858,44.5799632 34.4055575,42.188235 34.4055575,39.2372874 C34.4055575,36.2863399 36.7979127,33.8946117 39.7482333,33.8946117 Z M37.4198247,20.3636364 C38.6352542,20.3636364 39.6249811,21.3102054 39.7053482,22.4981668 L39.7106177,22.6544293 L39.7106177,32.0301294 C38.2617883,32.0301294 36.9145212,32.4608286 35.7891864,33.200603 C35.6989537,32.68191 35.2735706,32.2783575 34.7434337,32.2233535 L34.6193398,32.2169538 L25.7790357,32.2169538 C25.1226427,32.2169538 24.5903813,32.7492152 24.5903813,33.4062352 C24.5903813,34.0221914 25.0576381,34.5284965 25.657413,34.5893786 L25.7790357,34.5955165 L34.2256293,34.5955165 C33.8327226,35.0663736 33.5019239,35.5857486 33.2413532,36.1408927 L33.1838326,36.136661 L33.1838326,36.136661 L33.1253717,36.1352504 L25.8699402,36.1352504 C25.2135472,36.1352504 24.6812858,36.6675118 24.6812858,37.3245318 C24.6812858,37.940488 25.1485426,38.4467931 25.7483175,38.5076752 L25.8699402,38.5138131 L32.6006334,38.5138131 C32.5805717,38.73073 32.5699139,38.9501547 32.5699139,39.172087 C32.5699139,40.7766294 33.098884,42.2566435 33.9946204,43.4540581 L34.1786098,43.6897262 L22.6544293,43.6897262 C21.4389998,43.6897262 20.4492729,42.7431572 20.3689058,41.5551958 L20.3636364,41.3989333 L20.3636364,27.8083999 C20.3636364,27.1795133 20.8413624,26.6619308 21.4543271,26.5996896 L21.5786218,26.5934145 L25.2536705,26.5934145 C25.9184095,26.5934145 26.4652323,26.0881379 26.5309885,25.4407351 L26.537618,25.3094671 L26.537618,21.5786218 C26.537618,20.9497352 27.015344,20.4321527 27.6283087,20.3699115 L27.7526034,20.3636364 L37.4198247,20.3636364 Z M41.5917907,36.6918329 C41.4158995,36.691476 41.2470992,36.7611422 41.1226598,36.8854509 L39.7104097,38.2970645 L38.2981597,36.8854509 C38.0376994,36.6296854 37.6201068,36.6305359 37.3606905,36.8873602 C37.2358759,37.0112923 37.1655227,37.1798074 37.1651631,37.3556986 C37.1648063,37.5315897 37.2344724,37.7003901 37.3587811,37.8248295 L38.7703947,39.2370795 L37.3587811,40.6493295 C37.1030156,40.9097899 37.1038661,41.3273824 37.3606905,41.5867988 C37.6216289,41.8477373 38.039767,41.8477373 38.2981597,41.5887081 L39.7104097,40.1770945 L41.1226598,41.5887081 C41.3831201,41.8444736 41.8007126,41.8436231 42.060129,41.5867988 C42.3210675,41.3258603 42.3210675,40.9077223 42.0620383,40.6493295 L40.6504247,39.2370795 L42.0620383,37.8248295 C42.3178038,37.5643691 42.3169533,37.1467766 42.060129,36.8873602 C41.936197,36.7625457 41.7676818,36.6921925 41.5917907,36.6918329 Z M34.5735741,28.300538 L28.9036422,28.300538 C28.2472491,28.300538 27.7149877,28.8327994 27.7149877,29.4898193 C27.7149877,30.1057756 28.1822446,30.6120807 28.7820195,30.6729628 L28.9036422,30.6791007 L34.5735741,30.6791007 C35.2305941,30.6791007 35.7622285,30.1468393 35.7622285,29.4898193 C35.7622285,28.8327994 35.2305941,28.300538 34.5735741,28.300538 Z M25.4646994,21.1427154 L25.4668259,21.2131231 L25.2818823,24.0261466 C25.2372137,24.7049914 24.7274923,25.2543489 24.066794,25.3601429 L23.9327344,25.3752944 L21.1197109,25.560238 C20.8274662,25.5793352 20.6570162,25.2544162 20.8090505,25.0277874 L20.8538936,24.9734339 L24.8800218,20.9473058 C25.0877759,20.7401304 25.4296108,20.8721636 25.4646994,21.1427154 Z" id="形状结合"></path>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 4.1 KiB

@ -0,0 +1,12 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="64px" height="64px" viewBox="0 0 64 64" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<title>通过</title>
<g id="页面-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<g id="PrevailCloud-Design-图标集" transform="translate(-1720.000000, -6389.000000)" fill="#507AFD" fill-rule="nonzero">
<g id="通过" transform="translate(1720.000000, 6389.000000)">
<path d="M64,32 C64,49.6731274 49.6731274,64 32,64 C14.3268738,64 0,49.6731274 0,32 C0,14.3268738 14.3268738,0 32,0 C49.6731274,0 64,14.3268738 64,32 C64,32 64,32 64,32 Z" id="Ellipse-930" fill-opacity="0.1"></path>
<path d="M39.7482333,33.8946117 C42.6991808,33.8946117 45.0909091,36.2863399 45.0909091,39.2372874 C45.0909091,42.188235 42.6991808,44.5799632 39.7482333,44.5799632 C36.7972858,44.5799632 34.4055575,42.188235 34.4055575,39.2372874 C34.4055575,36.2863399 36.7979127,33.8946117 39.7482333,33.8946117 Z M37.4198247,20.3636364 C38.6352542,20.3636364 39.6249811,21.3102054 39.7053482,22.4981668 L39.7106177,22.6544293 L39.7106177,32.0301294 C38.2617883,32.0301294 36.9145212,32.4608286 35.7891864,33.200603 C35.6989537,32.68191 35.2735706,32.2783575 34.7434337,32.2233535 L34.6193398,32.2169538 L25.7790357,32.2169538 C25.1226427,32.2169538 24.5903813,32.7492152 24.5903813,33.4062352 C24.5903813,34.0221914 25.0576381,34.5284965 25.657413,34.5893786 L25.7790357,34.5955165 L34.2256293,34.5955165 C33.8327226,35.0663736 33.5019239,35.5857486 33.2413532,36.1408927 L33.1838326,36.136661 L33.1838326,36.136661 L33.1253717,36.1352504 L25.8699402,36.1352504 C25.2135472,36.1352504 24.6812858,36.6675118 24.6812858,37.3245318 C24.6812858,37.940488 25.1485426,38.4467931 25.7483175,38.5076752 L25.8699402,38.5138131 L32.6006334,38.5138131 C32.5805717,38.73073 32.5699139,38.9501547 32.5699139,39.172087 C32.5699139,40.7766294 33.098884,42.2566435 33.9946204,43.4540581 L34.1786098,43.6897262 L22.6544293,43.6897262 C21.4389998,43.6897262 20.4492729,42.7431572 20.3689058,41.5551958 L20.3636364,41.3989333 L20.3636364,27.8083999 C20.3636364,27.1795133 20.8413624,26.6619308 21.4543271,26.5996896 L21.5786218,26.5934145 L25.2536705,26.5934145 C25.9184095,26.5934145 26.4652323,26.0881379 26.5309885,25.4407351 L26.537618,25.3094671 L26.537618,21.5786218 C26.537618,20.9497352 27.015344,20.4321527 27.6283087,20.3699115 L27.7526034,20.3636364 L37.4198247,20.3636364 Z M41.4753711,37.4183387 L41.4127373,37.4748619 L39.4603946,39.3561686 L38.0870331,37.9835709 C37.8080077,37.7045508 37.3637172,37.6801971 37.0558662,37.9270477 L36.9924686,37.9835709 C36.7098525,38.266187 36.6915206,38.7107345 36.9359453,39.0147378 L36.9924686,39.0781355 L38.9127305,40.9976335 C39.1945827,41.2802496 39.6398941,41.2985815 39.9438973,41.0541567 L40.0065312,40.9976335 L42.506538,38.5686626 C42.7950286,38.2777623 42.80676,37.8124072 42.5332936,37.5073402 C42.2598271,37.2022731 41.7959628,37.1632489 41.4753711,37.4183387 Z M34.5735741,28.300538 L28.9036422,28.300538 C28.2472491,28.300538 27.7149877,28.8327994 27.7149877,29.4898193 C27.7149877,30.1057756 28.1822446,30.6120807 28.7820195,30.6729628 L28.9036422,30.6791007 L34.5735741,30.6791007 C35.2305941,30.6791007 35.7622285,30.1468393 35.7622285,29.4898193 C35.7622285,28.8327994 35.2305941,28.300538 34.5735741,28.300538 Z M25.4646994,21.1427154 L25.4668259,21.2131231 L25.2818823,24.0261466 C25.2372137,24.7049914 24.7274923,25.2543489 24.066794,25.3601429 L23.9327344,25.3752944 L21.1197109,25.560238 C20.8274662,25.5793352 20.6570162,25.2544162 20.8090505,25.0277874 L20.8538936,24.9734339 L24.8800218,20.9473058 C25.0877759,20.7401304 25.4296108,20.8721636 25.4646994,21.1427154 Z" id="形状结合"></path>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 3.7 KiB

@ -0,0 +1,45 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="96px" height="96px" viewBox="0 0 96 96" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<title>可疑文件夹</title>
<defs>
<radialGradient cx="49.9999974%" cy="50.0000039%" fx="49.9999974%" fy="50.0000039%" r="110.414469%" gradientTransform="translate(0.500000,0.500000),rotate(75.075110),scale(1.000000,1.409640),translate(-0.500000,-0.500000)" id="radialGradient-1">
<stop stop-color="#FFFCFC" stop-opacity="0.1" offset="0%"></stop>
<stop stop-color="#FFFFFF" stop-opacity="0.41" offset="100%"></stop>
</radialGradient>
<linearGradient x1="-0.00164029895%" y1="20.3389764%" x2="49.9999972%" y2="99.9999913%" id="linearGradient-2">
<stop stop-color="#3964EA" stop-opacity="0.18" offset="0%"></stop>
<stop stop-color="#A37D7D" stop-opacity="0" offset="100%"></stop>
</linearGradient>
<rect id="path-3" x="0" y="0" width="95.9411163" height="95.9411163" rx="15.9901861"></rect>
<rect id="path-4" x="0" y="0" width="95.9411163" height="95.9411163" rx="15.9901861"></rect>
<filter x="-1.6%" y="-1.6%" width="103.1%" height="103.1%" filterUnits="objectBoundingBox" id="filter-5">
<feOffset dx="3" dy="0" in="SourceAlpha" result="shadowOffsetInner1"></feOffset>
<feComposite in="shadowOffsetInner1" in2="SourceAlpha" operator="arithmetic" k2="-1" k3="1" result="shadowInnerInner1"></feComposite>
<feColorMatrix values="0 0 0 0 0.80541166 0 0 0 0 0.85265276 0 0 0 0 1 0 0 0 0.37 0" type="matrix" in="shadowInnerInner1"></feColorMatrix>
</filter>
<linearGradient x1="50%" y1="0%" x2="50%" y2="100%" id="linearGradient-6">
<stop stop-color="#92C0FF" offset="0%"></stop>
<stop stop-color="#507AFD" offset="100%"></stop>
</linearGradient>
</defs>
<g id="页面-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<g id="无法上传iconfont" transform="translate(-392.000000, -80.000000)">
<g id="Frame-18" transform="translate(392.000000, 80.000000)">
<g id="路径">
<use fill="url(#radialGradient-1)" xlink:href="#path-3"></use>
<use fill="url(#linearGradient-2)" xlink:href="#path-3"></use>
</g>
<g id="路径" fill="black" fill-opacity="1">
<use filter="url(#filter-5)" xlink:href="#path-4"></use>
</g>
<g id="编组-50" transform="translate(24.930558, 27.327848)">
<g id="编组" fill="url(#linearGradient-6)">
<path d="M46.0573921,37.8007842 L46.0573921,8.94799551 C46.0573921,5.44326823 42.8673831,5.77157479 42.8673831,5.77157479 C42.8673831,5.77157479 23.8138175,5.79417887 24.8215345,5.77157479 C23.7282311,5.79417887 23.188438,5.20029046 23.188438,5.20029046 C23.188438,5.20029046 22.4280135,3.8954361 21.0648136,1.83035047 C19.6341878,-0.333523352 17.9784228,0.0217020285 17.9784228,0.0217020294 L3.93665198,0.0217020294 C0.0450149641,0.0217020294 0,3.76509234 0,3.76509234 L0,37.6073294 C0,41.7824512 3.15381664,41.2650045 3.15381664,41.2650045 L43.1554403,41.2650045 C46.5298238,41.2650045 46.0573921,37.8007842 46.0573921,37.8007842 Z" id="形状"></path>
</g>
<path d="M43.7347101,9.15040185 C43.7347101,9.30411916 43.6736461,9.4515406 43.5649516,9.56023515 C43.456257,9.6689297 43.3088356,9.72999366 43.1551183,9.72999366 L3.35648058,9.72999366 C3.20276327,9.72999366 3.05534183,9.6689297 2.94664728,9.56023515 C2.83795273,9.4515406 2.77688877,9.30411916 2.77688877,9.15040185 C2.77688877,8.83030213 3.03638086,8.57081004 3.35648058,8.57081004 L43.1551183,8.57081004 C43.3088356,8.57081004 43.456257,8.631874 43.5649516,8.74056855 C43.6736461,8.8492631 43.7347101,8.99668455 43.7347101,9.15040185 L43.7347101,9.15040185 Z" id="路径" fill="#FFFFFF" fill-rule="nonzero"></path>
<path d="M33.616325,23.2641708 C33.616325,23.46252 33.5442625,23.6350452 33.3973681,23.7818751 L27.5087797,29.6731039 C27.3620142,29.819805 27.1892958,29.8920608 26.9909466,29.8920608 C26.7925974,29.8920608 26.6200079,29.819805 26.4732424,29.6731039 C26.3264768,29.5261452 26.2542855,29.3562604 26.2542855,29.1552708 L26.2542855,26.2057925 L23.6758103,26.2057925 C22.9236289,26.2057925 22.251238,26.2316165 21.6588308,26.2753435 C21.0637832,26.3217108 20.4738875,26.4041417 19.8865678,26.5227004 C19.3018241,26.6411947 18.7917833,26.803416 18.358957,27.0094287 C17.9261307,27.2181462 17.5217688,27.4835348 17.1456782,27.8080418 C16.772099,28.1351248 16.4655594,28.5215194 16.2261235,28.9698658 C15.9890061,29.4180191 15.8036011,29.9486032 15.6670106,30.5643229 C15.5330605,31.1774666 15.4661499,31.870272 15.4661499,32.6482131 C15.4661499,33.0680951 15.4867576,33.5395609 15.5227567,34.0624815 C15.5227567,34.1088488 15.5330605,34.1989431 15.5536682,34.3329576 C15.574276,34.4669078 15.5845798,34.5674347 15.5845798,34.6369857 C15.5845798,34.7528397 15.5510923,34.8481504 15.4892692,34.9254937 C15.4248701,35.0026438 15.3347113,35.0413476 15.2188574,35.0413476 C15.0952111,35.0413476 14.9895322,34.9769485 14.8968619,34.8455744 C14.8452783,34.7760234 14.7938234,34.691081 14.7449445,34.590554 C14.6985127,34.492603 14.6496338,34.3742375 14.5903867,34.2427989 C14.5336511,34.1114892 14.495076,34.0187545 14.469252,33.9671708 C13.4929618,31.7879056 13.0086806,30.0594984 13.0086806,28.784332 C13.0086806,27.259426 13.2121817,25.9816836 13.619184,24.9538742 C14.8633744,21.8678698 18.2146386,20.322356 23.6808978,20.322356 L26.2568614,20.322356 L26.2568614,17.3754536 C26.2568614,17.1771044 26.328924,17.0045149 26.4756895,16.8577494 C26.6225838,16.7107906 26.792533,16.6387924 26.9935226,16.6387924 C27.1918718,16.6387924 27.3644614,16.710855 27.5112269,16.8577494 L33.3999441,22.7463378 C33.5416221,22.8956792 33.616325,23.0658216 33.616325,23.2641708 L33.616325,23.2641708 Z" id="路径" fill="#FFFFFF" fill-rule="nonzero" transform="translate(23.312503, 25.840070) scale(-1, 1) translate(-23.312503, -25.840070) "></path>
</g>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 6.1 KiB

@ -0,0 +1,16 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="64px" height="64px" viewBox="0 0 64 64" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<title>待审批</title>
<g id="页面-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<g id="PrevailCloud-Design-图标集" transform="translate(-1194.000000, -6389.000000)" fill="#507AFD" fill-rule="nonzero">
<g id="待审批" transform="translate(1194.000000, 6389.000000)">
<path d="M64,32 C64,49.6731274 49.6731274,64 32,64 C14.3268738,64 0,49.6731274 0,32 C0,14.3268738 14.3268738,0 32,0 C49.6731274,0 64,14.3268738 64,32 C64,32 64,32 64,32 Z" id="Ellipse-930" fill-opacity="0.1"></path>
<g id="待提交" transform="translate(18.909091, 18.909091)">
<rect id="矩形" opacity="0" x="0" y="0" width="26.1818182" height="26.1818182"></rect>
<path d="M23.4605455,15.3130909 C22.6325455,15.9136364 20.1436364,18.4876364 19.2485455,18.6234545 C17.5823972,18.6788919 15.9145922,18.5885479 14.2641818,18.3534545 C12.3332727,18.1341818 13.086,17.1916364 13.392,17.0901818 C13.698,16.9903636 17.3929091,16.7465455 18.6267273,16.5763636 C19.7378182,16.4225455 19.5774545,15.0987273 18.3289091,15.048 C17.0787273,14.9989091 11.4054545,14.5325455 9.49909091,14.6863636 C7.59272727,14.8401818 4.79945455,17.9214545 4.79945455,17.9214545 L4.90254545,18.4107273 L8.96727273,22.7667273 L9.50890909,22.7127273 C10.0701391,22.3256833 10.68478,22.0224973 11.3334545,21.8127273 C12.1630909,21.6032727 16.74,22.212 18.3223636,21.9354545 C19.9047273,21.6589091 23.9776364,17.5418182 24.8727273,16.6385455 C25.308,16.2 25.6172727,15.5683636 25.5272727,15.4047273 C25.092,14.6061818 23.9956364,14.9236364 23.4605455,15.3130909 L23.4605455,15.3130909 Z M7.91509091,22.9876364 C7.58781818,22.6227273 4.35272727,19.1667273 3.97636364,18.7592727 C3.85570076,18.5959645 3.66899983,18.4943709 3.46634331,18.4817444 C3.26368679,18.4691178 3.06581911,18.5467507 2.92581818,18.6938182 C2.67054545,18.9392727 1.60527273,19.9374545 1.30090909,20.1910909 C0.831272727,20.5838182 1.24690909,21.2350909 1.51690909,21.5427273 C1.78690909,21.8503636 4.66690909,25.0772727 5.09563636,25.5845455 C5.52436364,26.0934545 5.96127273,26.0378182 6.28036364,25.7121818 C6.60109091,25.3849091 7.344,24.6158182 7.81854545,24.2132727 C8.01876568,24.0816036 8.14705882,23.8649412 8.16624482,23.6260755 C8.18543081,23.3872099 8.09336453,23.1528479 7.91672727,22.9909091 L7.91672727,22.9876364 L7.91509091,22.9876364 Z" id="形状"></path>
<path d="M4.90909091,14.6667273 L4.90909091,2.18618182 C4.90909091,1.11763636 5.77636364,0.252 6.84490909,0.250363636 L21.4036364,0.250363636 C22.4721818,0.250363636 23.3394545,1.11763636 23.3394545,2.18618182 L23.3394545,13.8109091 C23.3067273,13.8305455 23.2756364,13.8534545 23.2445455,13.8763636 L18.1963636,13.608 C17.892,13.5949091 17.3225455,13.5572727 16.6025455,13.5098182 C14.8336364,13.3936364 12.1614545,13.2169091 10.4809091,13.2169091 C10.0881818,13.2169091 9.76581818,13.2267273 9.522,13.2463636 C7.86574971,13.5382965 6.31867571,14.2708532 5.04327273,15.3670909 C4.95470166,15.1442097 4.90909091,14.9065623 4.90909091,14.6667273 Z M10.2567273,7.12636364 C9.83468131,7.12636364 9.49254545,7.46849949 9.49254545,7.89054545 C9.49254545,8.31259142 9.83468131,8.65472727 10.2567273,8.65472727 L17.8985455,8.65472727 C18.3205914,8.65472727 18.6627273,8.31259142 18.6627273,7.89054545 C18.6627273,7.46849949 18.3205914,7.12636364 17.8985455,7.12636364 L10.2567273,7.12636364 L10.2567273,7.12636364 Z M10.2567273,3.30545455 C9.83468131,3.30545455 9.49254545,3.6475904 9.49254545,4.06963636 C9.49254545,4.49168233 9.83468131,4.83381818 10.2567273,4.83381818 L17.8985455,4.83381818 C18.3205914,4.83381818 18.6627273,4.49168233 18.6627273,4.06963636 C18.6627273,3.6475904 18.3205914,3.30545455 17.8985455,3.30545455 L10.2567273,3.30545455 L10.2567273,3.30545455 Z" id="形状"></path>
</g>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 4.0 KiB

@ -0,0 +1,18 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="64px" height="64px" viewBox="0 0 64 64" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<title>删除</title>
<defs>
<rect id="path-1" x="0" y="0" width="64" height="64"></rect>
</defs>
<g id="页面-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<g id="PrevailCloud-Design-图标集" transform="translate(-1984.000000, -3431.000000)">
<g id="删除" transform="translate(1984.000000, 3431.000000)">
<mask id="mask-2" fill="white">
<use xlink:href="#path-1"></use>
</mask>
<use id="蒙版" fill="#000000" fill-rule="nonzero" opacity="0" xlink:href="#path-1"></use>
<path d="M52.9231991,16 C53.4754839,16 53.9231991,16.4477153 53.9231991,17 L53.9231991,20 C53.9231991,20.5522847 53.4754839,21 52.9231991,21 L49.862,21 L46.8906837,54.9640327 C46.8414748,55.5264927 46.5639593,56.0141255 46.1574353,56.3436103 C45.7935798,56.7212522 45.2824394,56.9564221 44.7163722,56.9564221 L19.2763722,56.9564221 C18.8012585,56.9564221 18.3648389,56.7907533 18.0217296,56.5140319 C17.5531495,56.1861769 17.2269494,55.6610416 17.1731938,55.0466129 L14.194,21 L11,21 C10.4477153,21 10,20.5522847 10,20 L10,17 C10,16.4477153 10.4477153,16 11,16 L52.9231991,16 Z M42.134,51.956 L44.843,21 L19.213,21 L21.922,51.956 L42.134,51.956 Z M39,7 C39.5522847,7 40,7.44771525 40,8 L40,11 C40,11.5522847 39.5522847,12 39,12 L25,12 C24.4477153,12 24,11.5522847 24,11 L24,8 C24,7.44771525 24.4477153,7 25,7 L39,7 Z" id="形状结合" fill="#FFFFFF" mask="url(#mask-2)"></path>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.5 KiB

@ -1,10 +1,10 @@
<script lang="ts" setup> <script lang="ts" setup>
import { computed, onBeforeMount, reactive, ref } from 'vue' import { computed, onBeforeMount, reactive, ref, watch } from 'vue'
import { useMessage } from 'naive-ui' import { useMessage } from 'naive-ui'
import { useDictionary } from '@/store/modules/dictonary' import { useDictionary } from '@/store/modules/dictonary'
import { audit } from '@/api/task/task' import { audit } from '@/api/task/task'
const emit = defineEmits(['success']) const emit = defineEmits(['success', 'close', 'show'])
const message = useMessage() const message = useMessage()
const loading = ref(false) const loading = ref(false)
@ -21,12 +21,8 @@ const cardStyle = {
} }
const rules = { const rules = {
disposeTypeId: [ disposeTypeId: [{ required: true, message: '请选择处理方式', trigger: 'blur' }],
{ required: true, message: '请选择处理方式', trigger: 'blur' }, failCauseId: [{ required: true, message: '请选择不通过原因', trigger: 'blur' }],
],
failCauseId: [
{ required: true, message: '请选择不通过原因', trigger: 'blur' },
],
} }
const formData = reactive({ const formData = reactive({
@ -42,12 +38,21 @@ function showModal(value) {
function closeModal() { function closeModal() {
show.value = false show.value = false
emit('close')
formData.disposeTypeId = '262403670085013522'
formData.failCauseId = '260402999231251188'
formData.comment = ''
} }
defineExpose({ defineExpose({
showModal, showModal,
closeModal,
})
watch(show, (value) => {
// console.log(value)
emit('show', value)
}) })
const disposeOptions = ref<any[]>([]) // const disposeOptions = ref<any[]>([]) //
const failCauseOptions = ref<any[]>([]) // const failCauseOptions = ref<any[]>([]) //
const selectItem = ref(null) const selectItem = ref(null)
@ -61,7 +66,9 @@ onBeforeMount(async () => {
}) })
const showOther = computed(() => { const showOther = computed(() => {
const failCauseItem = failCauseOptions.value.find(item => item.value === formData.failCauseId) const failCauseItem = failCauseOptions.value.find(
item => item.value === formData.failCauseId,
)
return failCauseItem?.label === '其他' return failCauseItem?.label === '其他'
}) })
/* /*
@ -70,8 +77,8 @@ const showOther = computed(() => {
* id: '' * id: ''
* taskId:'' * taskId:''
* fromTaskName: '' * fromTaskName: ''
* }] * }]
*/ */
async function handleSumbit(e: MouseEvent) { async function handleSumbit(e: MouseEvent) {
e.preventDefault() e.preventDefault()
formRef.value.validate(async (errors) => { formRef.value.validate(async (errors) => {
@ -85,8 +92,12 @@ async function handleSumbit(e: MouseEvent) {
taskName: item.fromTaskName, taskName: item.fromTaskName,
}) })
}) })
const disposeTypeItem = disposeOptions.value.find(item => item.value === formData.disposeTypeId) const disposeTypeItem = disposeOptions.value.find(
const failCauseItem = failCauseOptions.value.find(item => item.value === formData.failCauseId) item => item.value === formData.disposeTypeId,
)
const failCauseItem = failCauseOptions.value.find(
item => item.value === formData.failCauseId,
)
const param = { const param = {
result: false, result: false,
@ -105,7 +116,9 @@ async function handleSumbit(e: MouseEvent) {
emit('success', param) emit('success', param)
closeModal() closeModal()
} }
else { message.error(res.message) } else {
message.error(res.message)
}
}) })
} }
finally { finally {
@ -113,6 +126,9 @@ async function handleSumbit(e: MouseEvent) {
} }
} }
}) })
formData.disposeTypeId = '262403670085013522'
formData.failCauseId = '260402999231251188'
formData.comment = ''
} }
async function selectChange(id) { async function selectChange(id) {
@ -122,16 +138,17 @@ async function selectChange(id) {
<template> <template>
<n-modal v-model:show="show" transform-origin="center"> <n-modal v-model:show="show" transform-origin="center">
<n-card :style="cardStyle" :bordered="false" size="huge" role="dialog" aria-modal="true"> <n-card
:style="cardStyle"
:bordered="false"
size="huge"
role="dialog"
aria-modal="true"
>
<div class="wrapper"> <div class="wrapper">
<div class="wrapper-header"> <div class="wrapper-header">
<span class="wrapper-left">选择不通过原因</span> <span class="wrapper-left">选择不通过原因</span>
<SvgIcon <SvgIcon size="22" class="icon" name="close-none-border" @click="closeModal" />
size="22"
class="icon"
name="close-none-border"
@click="closeModal"
/>
</div> </div>
<n-form <n-form
ref="formRef" ref="formRef"
@ -142,14 +159,28 @@ async function selectChange(id) {
> >
<div class="wrapper-content"> <div class="wrapper-content">
<n-form-item class="form-item" label="处理方式" path="disposeTypeId"> <n-form-item class="form-item" label="处理方式" path="disposeTypeId">
<n-select v-model:value="formData.disposeTypeId" filterable :options="disposeOptions" /> <n-select
v-model:value="formData.disposeTypeId"
filterable
:options="disposeOptions"
/>
</n-form-item> </n-form-item>
<n-form-item class="form-item" label="不通过原因" path="failCauseId"> <n-form-item class="form-item" label="不通过原因" path="failCauseId">
<n-select v-model:value="formData.failCauseId" filterable :options="failCauseOptions" @change="selectChange" /> <n-select
v-model:value="formData.failCauseId"
filterable
:options="failCauseOptions"
@change="selectChange"
/>
</n-form-item> </n-form-item>
<n-form-item v-show="showOther" class="form-item-area" label="" path=""> <n-form-item v-show="showOther" class="form-item-area" label="" path="">
<n-input v-model:value="formData.comment" placeholder-class="pl" type="textarea" placeholder="备注内容" /> <n-input
v-model:value="formData.comment"
placeholder-class="pl"
type="textarea"
placeholder="备注内容"
/>
</n-form-item> </n-form-item>
</div> </div>
</n-form> </n-form>
@ -159,7 +190,7 @@ async function selectChange(id) {
<n-button type="info" @click="handleSumbit"> <n-button type="info" @click="handleSumbit">
确定 确定
</n-button> </n-button>
<n-button secondary class="btn" style="margin-left:15px" @click="closeModal"> <n-button secondary class="btn" style="margin-left: 15px" @click="closeModal">
取消 取消
</n-button> </n-button>
</div> </div>
@ -176,7 +207,7 @@ async function selectChange(id) {
align-items: center; align-items: center;
height: 56px; height: 56px;
border-bottom: 0.5px solid #d9d9d9; border-bottom: 0.5px solid #d9d9d9;
padding: 0 24px padding: 0 24px;
} }
&-left { &-left {
@ -186,7 +217,7 @@ async function selectChange(id) {
color: #333333; color: #333333;
} }
.icon{ .icon {
cursor: pointer; cursor: pointer;
} }
@ -209,7 +240,7 @@ async function selectChange(id) {
&:before { &:before {
background-color: #1980ff; background-color: #1980ff;
content: ''; content: "";
width: 5px; width: 5px;
border-radius: 2px; border-radius: 2px;
top: 0; top: 0;
@ -218,14 +249,13 @@ async function selectChange(id) {
} }
} }
.form-item-area{ .form-item-area {
margin-top: -30px; margin-top: -30px;
} }
} }
::v-deep(.n-card__content) { ::v-deep(.n-card__content) {
padding: 0!important; padding: 0 !important;
} }
::v-deep(.n-card > .n-card-header) { ::v-deep(.n-card > .n-card-header) {
@ -243,10 +273,10 @@ async function selectChange(id) {
} }
::v-deep(.n-input__placeholder) { ::v-deep(.n-input__placeholder) {
color: #333333!important; color: #333333 !important;
} }
.btn{ .btn {
border: 1px solid #cad2dd; border: 1px solid #cad2dd;
background-color: #fff; background-color: #fff;
} }

@ -1,98 +1,209 @@
<template>
<div class="header_wrap">
<div v-for="(item, index) in data" :key="index" class="header_item">
<img :src="item.link" />
<div class="data_wrap">
<div class="data_title">{{ item.count }}</div>
<div class="data_content">{{ item.title }}</div>
</div>
</div>
<SvgIcon size="14px" style="cursor: pointer" name="setting"></SvgIcon>
</div>
</template>
<script lang="ts" setup> <script lang="ts" setup>
import { defineProps, onMounted, ref } from "vue";
import { gettaskToolsCount } from "@/api/home/main";
defineProps({
hasColor: {
type: Boolean,
default: () => false,
},
});
const data = [ const datalist = ref([
{ {
link: "/src/assets/images/taskCount.png", link: "count",
title: "任务包总数", title: "任务总数",
count: 6399, count: 0,
}, },
{ {
link: "/src/assets/images/nocheck.png", link: "wait",
title: "未标记", title: "待审批",
count: 6290, count: 0,
}, },
{ {
link: "/src/assets/images/check.png", link: "done",
title: "已标记", title: "已审批",
count: 109, count: 0,
}, },
{ {
link: "/src/assets/images/status.png", link: "resolve",
title: "真", title: "通过",
count: 3290, count: 0,
color: "#03c984",
}, },
{ {
link: "/src/assets/images/status.png", link: "reject",
title: "假", title: "不通过",
count: 3000, count: 0,
color: "#ff8b8b",
}, },
{ {
link: "/src/assets/images/pic.png", link: "reimg",
title: "相似度100%图", title: "片重复数",
count: 230, count: 0,
}, },
{ {
link: "/src/assets/images/xiaojie.png", link: "breakcount",
title: "小结重复数", title: "小结重复数",
count: 365, count: 0,
},
]);
function initRem() {
const designWidth = 1440;
const rempPx = 16;
const scale = window.innerWidth / designWidth;
document.documentElement.style.fontSize = `${scale * rempPx}px`;
}
onMounted(() => {
initRem();
getData();
});
async function getData() {
const { data } = await gettaskToolsCount();
if (data) {
const {
total,
treat,
alreadyApprove,
repeatedNodules,
repeat,
approvedCount,
notGoCount,
} = data;
let newdata=[
{
link: "count",
title: "任务总数",
count: total,
},
{
link: "wait",
title: "待审批",
count: treat,
},
{
link: "done",
title: "已审批",
count: alreadyApprove,
},
{
link: "resolve",
title: "通过",
count: approvedCount,
color: "#03c984",
},
{
link: "reject",
title: "不通过",
count: notGoCount,
color: "#ff8b8b",
},
{
link: "reimg",
title: "图片重复数",
count: repeat,
}, },
]; {
link: "breakcount",
title: "小结重复数",
count: repeatedNodules,
},
]
datalist.value =newdata ;
console.log(datalist.value)
}
}
</script> </script>
<template>
<div class="header_wrap" :style="hasColor ? '' : 'margin-top: 7.375rem;'">
<div v-for="(item, index) in datalist" :key="index" class="header_box">
<div class="header_item">
<SvgIcon :name="item.link" :style="index == 0 ? 'margin-left:0.5rem' : ''" />
<div class="data_wrap">
<div class="data_title" :style="hasColor ? `color:${item.color || ''}` : ''">
{{ item.count }}
</div>
<div class="data_content">
{{ item.title }}
</div>
</div>
</div>
<div
class="line"
:style="
hasColor
? 'margin-left:2.5rem;margin-right:2.0625rem'
: 'margin-left:1.25rem;margin-right:0.8125rem'
"
/>
</div>
<SvgIcon size="14px" style="cursor: pointer" name="setting" class="settingSvg" />
</div>
</template>
<style scoped lang="less"> <style scoped lang="less">
.header_wrap { .header_wrap {
display: flex; display: flex;
flex-flow: row nowrap; flex-flow: row nowrap;
align-items: center; align-items: center;
justify-content: space-between; justify-content: space-between;
padding: 20px 30px; padding: 1rem 1rem 1rem 3.125rem;
background: #fff; background: #f5f7f9;
margin-bottom: 1rem;
// 180-62 header
padding-left: 2.125rem;
.header_box {
display: flex;
flex-flow: row nowrap;
align-items: center;
justify-content: center;
min-width: 10%;
.header_item { .header_item {
width: 10%;
display: flex; display: flex;
flex-flow: row nowrap; flex-flow: row nowrap;
align-items: center; align-items: center;
justify-content: center; justify-content: center;
img{ svg {
width: 50px; width: 2.75rem !important;
height: 50px height: 2.75rem !important;
} }
.data_wrap { .data_wrap {
margin-left: 0.75rem;
.data_title { .data_title {
font-size: 20px; font-size: 1.125rem;
font-family: HarmonyOS Sans SC, HarmonyOS Sans SC-Bold; font-family: HarmonyOS Sans SC, HarmonyOS Sans SC-Bold;
font-weight: Bold; font-weight: 900;
text-align: left; text-align: left;
color: #202020; color: #202020;
line-height: 23px; line-height: 1.4375rem;
text-align: center; text-align: center;
white-space: nowrap; white-space: nowrap;
} }
.data_content { .data_content {
opacity: 0.6; opacity: 0.6;
font-size: 14px; font-size: 0.75rem;
font-family: PingFang SC, PingFang SC-Regular; font-family: PingFang SC, PingFang SC-Regular;
font-weight: Regular; font-weight: 500;
text-align: center; text-align: center;
color: #202020; color: #202020;
line-height: 16px; line-height: 1rem;
text-align: center; text-align: center;
white-space: nowrap; white-space: nowrap;
} }
} }
} }
}
}
.settingSvg {
width: 1rem !important;
height: 1rem !important;
} }
.line {
width: 0.0625rem;
height: 1.25rem;
background: #e8e8e8;
}//
</style> </style>

@ -33,6 +33,7 @@ function closeModal() {
defineExpose({ defineExpose({
showModal, showModal,
closeModal,
}) })
const backOptions = ref<any[]>([]) const backOptions = ref<any[]>([])
@ -46,7 +47,9 @@ const showOther = computed(() => {
}) })
const comomitValue = computed(() => { const comomitValue = computed(() => {
return (selectItem.value as any)?.label === '其他' ? otherValue.value : selectRejectId.value return (selectItem.value as any)?.label === '其他'
? otherValue.value
: selectRejectId.value
}) })
async function handleSumbit(e: MouseEvent) { async function handleSumbit(e: MouseEvent) {
@ -94,7 +97,13 @@ async function selectChange(id) {
<template> <template>
<n-modal v-model:show="show" transform-origin="center"> <n-modal v-model:show="show" transform-origin="center">
<n-card :style="cardStyle" :bordered="false" size="huge" role="dialog" aria-modal="true"> <n-card
:style="cardStyle"
:bordered="false"
size="huge"
role="dialog"
aria-modal="true"
>
<div class="wrapper"> <div class="wrapper">
<div class="wrapper-header"> <div class="wrapper-header">
<span class="wrapper-left">选择不通过原因</span> <span class="wrapper-left">选择不通过原因</span>
@ -106,12 +115,29 @@ async function selectChange(id) {
</div> </div>
<div class="wrapper-content"> <div class="wrapper-content">
<span>处理方式</span> <span>处理方式</span>
<n-select v-model:value="selectBackId" filterable style="margin-top: 10px;" :options="backOptions" /> <n-select
v-model:value="selectBackId"
filterable
style="margin-top: 10px"
:options="backOptions"
/>
</div> </div>
<div class="wrapper-content"> <div class="wrapper-content">
<span>不通过原因</span> <span>不通过原因</span>
<n-select v-model:value="selectRejectId" filterable style="margin-top: 10px;" :options="reasonOptions" @change="selectChange" /> <n-select
<n-input v-show="showOther" v-model:value="otherValue" type="textarea" placeholder="备注内容" style="margin-top: 10px;" /> v-model:value="selectRejectId"
filterable
style="margin-top: 10px"
:options="reasonOptions"
@change="selectChange"
/>
<n-input
v-show="showOther"
v-model:value="otherValue"
type="textarea"
placeholder="备注内容"
style="margin-top: 10px"
/>
</div> </div>
<!-- <div class="wrapper-content"> <!-- <div class="wrapper-content">
@ -125,7 +151,7 @@ async function selectChange(id) {
<n-button type="info" @click="handleSumbit"> <n-button type="info" @click="handleSumbit">
确认 确认
</n-button> </n-button>
<n-button secondary style="margin-left:15px" @click="closeModal"> <n-button secondary style="margin-left: 15px" @click="closeModal">
取消 取消
</n-button> </n-button>
</div> </div>
@ -165,7 +191,7 @@ async function selectChange(id) {
margin-bottom: 8px; margin-bottom: 8px;
&:after { &:after {
content: ''; content: "";
display: block; display: block;
width: 18px; width: 18px;
height: 1px; height: 1px;
@ -191,7 +217,7 @@ async function selectChange(id) {
&:before { &:before {
background-color: #1980ff; background-color: #1980ff;
content: ''; content: "";
width: 5px; width: 5px;
border-radius: 2px; border-radius: 2px;
top: 0; top: 0;

@ -1,10 +1,12 @@
<script lang="ts" setup> <script lang="ts" setup>
import { reactive, ref } from 'vue' import { defineEmits, reactive, ref } from 'vue'
import { QuillEditor } from '@vueup/vue-quill' import { QuillEditor } from '@vueup/vue-quill'
import '@vueup/vue-quill/dist/vue-quill.snow.css' import '@vueup/vue-quill/dist/vue-quill.snow.css'
import { debounce } from 'lodash-es' import { debounce } from 'lodash-es'
import { queryNote, saveNote } from '@/api/home/main' import { queryNote, saveNote } from '@/api/home/main'
const emit = defineEmits(['close'])
const quillEditor = ref() const quillEditor = ref()
const cardStyle = { const cardStyle = {
@ -27,12 +29,14 @@ const options = reactive({
}) })
function initHandler() { function initHandler() {
queryNote().then((res) => { queryNote()
.then((res) => {
if (res.data) if (res.data)
note.value = res.data.notecontent note.value = res.data.notecontent
console.log('note:', note.value) console.log('note:', note.value)
}).catch(e => console.log(e)) })
.catch(e => console.log(e))
} }
const saveHandler = debounce(() => { const saveHandler = debounce(() => {
@ -44,9 +48,18 @@ const saveHandler = debounce(() => {
<template> <template>
<div> <div>
<n-card :style="cardStyle" :bordered="false" class="mt-4 proCard"> <n-card :style="cardStyle" :bordered="false" class="mt-4 proCard">
<div class="top_box">
<div class="title"> <div class="title">
备注信息 备注信息
</div> </div>
<SvgIcon
size="20"
color="#000000"
name="close-none-border"
class="close_box"
@click="emit('close')"
/>
</div>
<QuillEditor <QuillEditor
ref="quillEditor" ref="quillEditor"
v-model:content="note" v-model:content="note"
@ -62,15 +75,25 @@ const saveHandler = debounce(() => {
</template> </template>
<style lang="less" scoped> <style lang="less" scoped>
.title{ .top_box {
display: flex;
flex-flow: row nowrap;
align-items: center;
justify-content: space-between;
.close_box {
cursor: pointer;
margin-bottom: 25px;
}
}
.title {
font-size: 18px; font-size: 18px;
font-family: PingFang SC, PingFang SC-Medium; font-family: PingFang SC, PingFang SC-Medium;
font-weight: Medium;
color: #333333; color: #333333;
margin-bottom: 24px; margin-bottom: 24px;
} font-weight: 500;
}
.ql-toolbar.ql-snow { .ql-toolbar.ql-snow {
border-top: none; border-top: none;
border-left: none; border-left: none;
border-right: none; border-right: none;
@ -78,9 +101,9 @@ const saveHandler = debounce(() => {
margin-top: -10px; margin-top: -10px;
background: #f8f8f8; background: #f8f8f8;
border: 1px solid #d8d8d8; border: 1px solid #d8d8d8;
} }
.ql-container.ql-snow { .ql-container.ql-snow {
border: 1px solid #d8d8d8; border: 1px solid #d8d8d8;
} }
</style> </style>

@ -0,0 +1,30 @@
<template>
<div class="ip_box" :style="canClick?'cursor: pointer;':''">
<img :src="IPImg" />
</div>
</template>
<script setup>
import IPImg from "@/assets/images/IP.png";
import { defineProps } from "vue";
defineProps({
canClick: {
type: Boolean,
default: () => false,
},
});
</script>
<style scoped lang="less">
.ip_box {
position: fixed;
bottom: 80px;
right: 20px;
z-index: 1000;
img {
width: 80px;
height: auto;
}
}
</style>

@ -1,8 +1,9 @@
<script setup lang="ts"> <script setup lang="ts">
import { reactive, ref, toRefs } from 'vue' import { nextTick, onMounted, onUnmounted, reactive, ref, toRefs } from 'vue'
import { debounce } from 'lodash-es' import { debounce } from 'lodash-es'
import { useRoute, useRouter } from 'vue-router' import { useRoute, useRouter } from 'vue-router'
import { deleteSearch, getSearchList, historySearch } from '@/api/search/search' import { deleteSearch, getSearchList, historySearch } from '@/api/search/search'
import { storage } from '@/utils/Storage'
const emit = defineEmits(['close']) const emit = defineEmits(['close'])
@ -25,6 +26,8 @@ const inputHandler = debounce((keyword) => {
// //
async function handlerSearch(value) { async function handlerSearch(value) {
//
if(value === '/') return
const res = await getSearchList({ const res = await getSearchList({
search: value, search: value,
}) })
@ -56,23 +59,27 @@ function handlerHistory(name) {
// //
async function deleteHistory() { async function deleteHistory() {
const res = await deleteSearch({ const res = await deleteSearch({})
})
if (res.code === 'OK') if (res.code === 'OK')
historyList.value = [] historyList.value = []
} }
// //
async function getHistory() { async function getHistory() {
const res = await historySearch({ const res = await historySearch({})
})
if (res.code === 'OK') if (res.code === 'OK')
historyList.value = res.data historyList.value = res.data
} }
getHistory() getHistory()
function goPath(item, id) { function goPath(item, id) {
router.push({ name: item.path, query: { id } }) const desiredObject = item.data.find((item) => {
return item.id === id
})
if (!storage.get('isSearch'))
storage.set('isSearch', true, Date.now() + 30 * 60 * 1000)
router.push({ name: item.path, query: { id, searchContent: desiredObject.name } })
emit('close') emit('close')
} }
@ -86,6 +93,11 @@ function highlightText(text, query) {
return highlightedText return highlightedText
} }
onMounted(() => {
setTimeout(() => (value.value = ''))
handlerShowList()
handlerSearch('')
})
</script> </script>
<template> <template>
@ -97,44 +109,66 @@ function highlightText(text, query) {
<n-input <n-input
v-model:value="value" v-model:value="value"
placeholder="搜索任务ID、任务名称、提报人、拜访终端" placeholder="搜索任务ID、任务名称、提报人、拜访终端"
placeholder-style="width:304px;height:22px;margin:17px 0 17px 12px;"
style="font-size: 16px; font-weight: 500; color: #333333"
type="text" type="text"
@input="inputHandler" @input="inputHandler"
@mousedown="handlerShowList" @mousedown="handlerShowList"
> >
<template #prefix> <template #prefix>
<SvgIcon name="magnifying-1" size="18" /> <SvgIcon
name="magnifying-1"
width="21"
height="20"
style="margin: 10px 0 10px 4px"
/>
</template> </template>
</n-input> </n-input>
</div> </div>
<div v-show="showList && (historyList.length || resultList.length)" class="list_box"> <div v-show="showList && (historyList.length || resultList.length)" class="list_box">
<div <div
v-if="historyList.length" v-if="historyList.length && !value"
class="list_classfiy_item" class="list_classfiy_item"
style="border-bottom:1px solid #e4e4e4" style="border-bottom: 1px solid #e4e4e4"
> >
<div class="list_title"> <div class="list_title">
历史搜索 历史搜索
</div> </div>
<div class="flex history-list"> <div class="flex history-list">
<div class="tag-wrap"> <div class="tag-wrap">
<div v-for="(item, index) of historyList" :key="index" class="tag" @click="handlerHistory(item.historyname)"> <div
v-for="(item, index) of historyList"
:key="index"
class="tag"
@click="handlerHistory(item.historyname)"
>
{{ item.historyname }} {{ item.historyname }}
</div> </div>
</div> </div>
<SvgIcon class="icon-delete" name="delete-history" size="16" @click="deleteHistory" /> <SvgIcon
class="icon-delete"
name="delete-history"
size="16"
@click="deleteHistory"
/>
</div> </div>
</div> </div>
<div <div
v-for="(item, index) in resultList" v-for="(item, index) in resultList"
:key="index" :key="index"
class="list_classfiy_item" class="list_classfiy_item"
:style="(index === resultList.length - 1) ? '' : 'border-bottom:1px solid #e4e4e4'" :style="index === resultList.length - 1 ? '' : 'border-bottom:1px solid #e4e4e4'"
> >
<div class="list_title"> <div class="list_title">
{{ item.title }} {{ item.title }}
</div> </div>
<div v-for="(sitem, sindex) in item.data" :key="sindex" class="list_item" @click="goPath(item, sitem.id)"> <div
<SvgIcon name="task-icon" size="16" /> v-for="(sitem, sindex) in item.data"
:key="sindex"
class="list_item"
@click="goPath(item, sitem.id)"
>
<SvgIcon name="task-icon" size="16" style="margin-left: 16px" />
<span class="name" v-html="highlightText(sitem.name, value)" /> <span class="name" v-html="highlightText(sitem.name, value)" />
</div> </div>
</div> </div>
@ -144,17 +178,20 @@ function highlightText(text, query) {
<style lang="less" scoped> <style lang="less" scoped>
.input_wrap { .input_wrap {
width: 60%; // width: 60%;
width: 808px;
position: absolute; position: absolute;
top: 20%; top: 20%;
left: 20%; left: 30%;
box-shadow: none!important; box-shadow: none !important;
.ip_box{
.ip_box {
z-index: 0; z-index: 0;
position: relative; position: relative;
left: calc(50% - 40px); left: calc(50% - 40px);
top: 30px; top: 30px;
img{
img {
width: 80px; width: 80px;
height: 80px; height: 80px;
} }
@ -166,9 +203,11 @@ function highlightText(text, query) {
border: 1px solid #507afd; border: 1px solid #507afd;
border-radius: 8px; border-radius: 8px;
overflow: hidden; overflow: hidden;
box-shadow: 0px 12px 12px 0px rgba(80, 122, 253, 0.15), box-shadow: 0px 12px 12px 0px rgba(80, 122, 253, 0.15), 0px 0px 0px 0.5px #d4e3fc;
0px 0px 0px 0.5px #d4e3fc; // width: 808px;
// height: 56px;
} }
.list_box { .list_box {
background: #fefefe; background: #fefefe;
border: 1px dashed #f4f4f4; border: 1px dashed #f4f4f4;
@ -176,46 +215,57 @@ function highlightText(text, query) {
box-shadow: 0px 12px 12px 0px rgba(80, 122, 253, 0.15); box-shadow: 0px 12px 12px 0px rgba(80, 122, 253, 0.15);
margin-top: 15px; margin-top: 15px;
padding: 8px 16px; padding: 8px 16px;
width: 802px;
height: 400px;
.list_classfiy_item { .list_classfiy_item {
margin-bottom: -2px;
.list_title { .list_title {
font-size: 12px; font-size: 12px;
font-family: PingFang SC, PingFang SC-Regular; font-family: PingFang SC, PingFang SC-Regular;
font-weight: Regular; font-weight: Regular;
color: #999999; color: #999999;
line-height: 17px; line-height: 17px;
margin: 10px 0 10px 5px; margin: 6px 0 12px 0;
font-weight: 500;
} }
.list_item { .list_item {
display: flex; display: flex;
flex-flow: row nowrap; flex-flow: row nowrap;
align-items: center; align-items: center;
margin-bottom: 10px; margin: 16px 0;
} }
} }
} }
} }
:deep(.n-input .n-input-wrapper) { :deep(.n-input .n-input-wrapper) {
margin: 8px; margin: 8px;
} }
.history-list{ .history-list {
align-items: center; align-items: center;
padding-bottom: 9px; // margin-bottom:12;12+26=38
padding: 26px 12px 12px 0;
} }
.name{ .name {
margin-left: 5px; margin-left: 8px;
cursor: pointer; cursor: pointer;
font-weight: 500;
color: #333333;
} }
.tag-wrap{ .tag-wrap {
display: flex; display: flex;
align-items: center; align-items: center;
flex: 1; flex: 1;
overflow-y: hidden; overflow-y: hidden;
overflow-x: auto; overflow-x: auto;
margin: 9px 0 9px 29px;
.tag{ .tag {
font-weight: 500;
padding: 0 12px; padding: 0 12px;
height: 22px; height: 22px;
border: 1px solid #e4e7ed; border: 1px solid #e4e7ed;
@ -230,11 +280,11 @@ function highlightText(text, query) {
} }
} }
.icon-delete{ .icon-delete {
cursor: pointer; cursor: pointer;
} }
.highlight{ .highlight {
color: #507AFD; color: #507afd;
} }
</style> </style>

@ -27,11 +27,11 @@ export const asideMap: Recordable<AsideEntity> = {
key: 'izstatus', key: 'izstatus',
component: PlanVue, // todo component: PlanVue, // todo
}, },
izuptime: { izyear: {
label: '', label: '',
defaultValue: null, defaultValue: null,
isDefaultFilter: false, isDefaultFilter: false,
key: 'izuptime', key: 'izyear',
component: TimeVue, component: TimeVue,
}, },
iztaskrrom: { iztaskrrom: {

@ -107,7 +107,7 @@ export const asideMap: Recordable<AsideEntity> = {
component: IztaskrromVue, component: IztaskrromVue,
}, },
iztaskstatus: { iztaskstatus: {
label: '任务状态', label: '任务审批状态',
defaultValue: null, defaultValue: null,
isDefaultFilter: false, isDefaultFilter: false,
key: 'iztaskstatus', key: 'iztaskstatus',

@ -1,5 +1,5 @@
import { defineAsyncComponent } from "vue"
import type { AsideEntity } from './aside' import type { AsideEntity } from './aside'
import { IzApprovalStatus, IzProjectVue, IzStatus, IztaskrromVue, PictureDownloadVue, PlanVue, ReportUserVue, TimeVue, IzCustomname, IzCustomtype, IzVisitcity, IzCustomlevel, IzProjecttype, IzProductVue, IzvisitproVue, IzfirmVue } from '@/views/home/aside/comp/items'
export interface RowData { export interface RowData {
id: string id: string
@ -83,145 +83,164 @@ export const asideMap: Recordable<AsideEntity> = {
defaultValue: null, defaultValue: null,
isDefaultFilter: true, isDefaultFilter: true,
key: 'izupuser', key: 'izupuser',
component: ReportUserVue, // component: ReportUserVue,
component: defineAsyncComponent(() => import("@/views/home/aside/comp/items/ReportUser.vue")),
}, },
izproject: { izproject: {
label: '所属项目', label: '所属项目',
defaultValue: null, defaultValue: null,
isDefaultFilter: true, isDefaultFilter: true,
key: 'izproject', key: 'izproject',
component: IzProjectVue, // component: IzProjectVue,
component: defineAsyncComponent(() => import("@/views/home/aside/comp/items/IzProject.vue")),
}, },
izplan: { izplan: {
label: '所属计划', label: '所属计划',
defaultValue: null, defaultValue: null,
isDefaultFilter: true, isDefaultFilter: true,
key: 'izplan', key: 'izplan',
component: PlanVue, // component: PlanVue,
component: defineAsyncComponent(() => import("@/views/home/aside/comp/items/Plan.vue")),
}, },
izstatus: { izstatus: {
label: '审批状态', label: '审批状态',
defaultValue: null, defaultValue: null,
isDefaultFilter: false, isDefaultFilter: false,
key: 'izstatus', key: 'izstatus',
component: IzStatus, // todo // component: IzStatus, // todo
component: defineAsyncComponent(() => import("@/views/home/aside/comp/items/IzStatus.vue")),
}, },
izuptime: { izyear: {
label: '提报时间', label: '提报时间',
defaultValue: null, defaultValue: null,
isDefaultFilter: false, isDefaultFilter: true,
key: 'izuptime', key: 'izyear',
component: TimeVue, // component: TimeVue,
component: defineAsyncComponent(() => import("@/views/home/aside/comp/items/Time.vue")),
}, },
iztaskrrom: { iztaskrrom: {
label: '任务来源', label: '任务来源',
defaultValue: null, defaultValue: null,
isDefaultFilter: false, isDefaultFilter: false,
key: 'iztaskrrom', key: 'iztaskrrom',
component: IztaskrromVue, // component: IztaskrromVue,
component: defineAsyncComponent(() => import("@/views/home/aside/comp/items/Iztaskrrom.vue")),
}, },
izshowall: { izshowall: {
label: '显示全部任务数据', label: '显示全部任务数据',
defaultValue: true, defaultValue: false,
isDefaultFilter: false, isDefaultFilter: false,
key: 'izshowall', key: 'izshowall',
component: PictureDownloadVue, // component: IzShowAll,
component: defineAsyncComponent(() => import("@/views/home/aside/comp/items/IzShowAll.vue")),
inFilterList: false, inFilterList: false,
}, },
} }
// 审批添加筛选配置 (左侧) // 审批添加筛选配置 (左侧)
export const asideTaskMap: Recordable<AsideEntity> = { export const asideTaskMap: Recordable<AsideEntity> = {
izstatus: { izApprovalStatus: {
label: '审批状态', label: '审批状态',
defaultValue: null, defaultValue: null,
isDefaultFilter: true, isDefaultFilter: true,
key: 'izApprovalStatus', key: 'izApprovalStatus',
component: IzApprovalStatus, // todo // component: IzApprovalStatus, // todo
component: defineAsyncComponent(() => import("@/views/home/aside/comp/items/IzApprovalStatus.vue")),
}, },
izuptime: { izuptime: {
label: '提报时间', label: '提报时间',
defaultValue: null, defaultValue: null,
isDefaultFilter: true, isDefaultFilter: true,
key: 'izuptime', key: 'izuptime',
component: TimeVue, // component: TimeVue,
component: defineAsyncComponent(() => import("@/views/home/aside/comp/items/Time.vue")),
}, },
izupuser: { izupuser: {
label: '提报人', label: '提报人',
defaultValue: null, defaultValue: null,
isDefaultFilter: true, isDefaultFilter: true,
key: 'izupuser', key: 'izupuser',
component: ReportUserVue, // component: ReportUserVue,
component: defineAsyncComponent(() => import("@/views/home/aside/comp/items/ReportUser.vue")),
}, },
iztaskrrom: { iztaskrrom: {
label: '任务来源', label: '任务来源',
defaultValue: null, defaultValue: null,
isDefaultFilter: true, isDefaultFilter: true,
key: 'iztaskrrom', key: 'iztaskrrom',
component: IztaskrromVue, // component: IztaskrromVue,
component: defineAsyncComponent(() => import("@/views/home/aside/comp/items/Iztaskrrom.vue")),
}, },
izcustomname: { izcustomname: {
label: '拜访客户', label: '拜访客户',
defaultValue: null, defaultValue: null,
isDefaultFilter: true, isDefaultFilter: true,
key: 'izcustomname', key: 'izcustomname',
component: IzCustomname, // component: IzCustomname,
component: defineAsyncComponent(() => import("@/views/home/aside/comp/items/IzCustomname.vue")),
}, },
izcustomtype: { izcustomtype: {
label: '客户类型', label: '客户类型',
defaultValue: null, defaultValue: null,
isDefaultFilter: true, isDefaultFilter: true,
key: 'izcustomtype', key: 'izcustomtype',
component: IzCustomtype, // component: IzCustomtype,
component: defineAsyncComponent(() => import("@/views/home/aside/comp/items/IzCustomtype.vue")),
}, },
izproject: { izproject: {
label: '所属项目', label: '所属项目',
defaultValue: null, defaultValue: null,
isDefaultFilter: true, isDefaultFilter: true,
key: 'izproject', key: 'izproject',
component: IzProjectVue, // component: IzProjectVue,
component: defineAsyncComponent(() => import("@/views/home/aside/comp/items/IzProject.vue")),
}, },
izvisitpro: { izvisitpro: {
label: '拜访省份/直辖市', label: '拜访省份/直辖市',
defaultValue: null, defaultValue: null,
isDefaultFilter: true, isDefaultFilter: true,
key: 'izvisitpro', key: 'izvisitpro',
component: IzVisitcity, // component: IzVisitcity,
component: defineAsyncComponent(() => import("@/views/home/aside/comp/items/IzVisitcity.vue")),
}, },
izcustomlevel: { izcustomlevel: {
label: '客户级别', label: '客户级别',
defaultValue: null, defaultValue: null,
isDefaultFilter: true, isDefaultFilter: true,
key: 'izcustomlevel', key: 'izcustomlevel',
component: IzCustomlevel // component: IzCustomlevel,
component: defineAsyncComponent(() => import("@/views/home/aside/comp/items/IzCustomlevel.vue")),
}, },
izprojecttype: { izprojecttype: {
label: '项目类别', label: '项目类别',
defaultValue: null, defaultValue: null,
isDefaultFilter: true, isDefaultFilter: true,
key: 'izprojecttype', key: 'izprojecttype',
component: IzProjecttype, // component: IzProjecttype,
component: defineAsyncComponent(() => import("@/views/home/aside/comp/items/IzProjecttype.vue")),
}, },
izproductname: { izproductname: {
label: '产品名称', label: '产品名称',
defaultValue: null, defaultValue: null,
isDefaultFilter: true, isDefaultFilter: true,
key: 'izproductname', key: 'izproductname',
component: IzProductVue, // component: IzProductVue,
component: defineAsyncComponent(() => import("@/views/home/aside/comp/items/IzProduct.vue")),
}, },
izvisitcity: { izvisitcity: {
label: '拜访城市', label: '拜访城市',
defaultValue: null, defaultValue: null,
isDefaultFilter: true, isDefaultFilter: true,
key: 'izvisitcity', key: 'izvisitcity',
component: IzvisitproVue, // component: IzvisitproVue,
component: defineAsyncComponent(() => import("@/views/home/aside/comp/items/Izvisitpro.vue")),
}, },
izfirm: { izfirm: {
label: '厂商', label: '厂商',
defaultValue: null, defaultValue: null,
isDefaultFilter: true, isDefaultFilter: true,
key: 'izfirm', key: 'izfirm',
component: IzfirmVue, // component: IzfirmVue,
} component: defineAsyncComponent(() => import("@/views/home/aside/comp/items/Izfirm.vue")),
},
} }

@ -37,7 +37,7 @@ export const workPackageMap: Recordable<PackageEntity> = {
key: 'upuser', key: 'upuser',
}, },
status: { status: {
label: '任务状态', label: '任务审批状态',
isDefault: false, isDefault: false,
key: 'upuser', key: 'upuser',
}, },
@ -168,6 +168,6 @@ export const fieldMap = {
field13: '病历号', field13: '病历号',
field14: '是否重复', field14: '是否重复',
field15: '任务类型', field15: '任务类型',
field16: '任务状态', field16: '任务审批状态',
field17: '项目类别', field17: '项目类别',
} }

@ -0,0 +1,14 @@
import { inject, onMounted, onUnmounted, ref } from "vue"
export const useKeydown = (key,handler) => {
const mousetrap = inject('mousetrap') as any
const event = ref()
onMounted(() => {
event.value = mousetrap.bind(key, handler)
})
onUnmounted(() => {
event.value.unbind(key, handler)
})
}

@ -1,34 +1,36 @@
<script lang="ts" setup> <script lang="ts" setup>
import { defineOptions, ref } from 'vue' import { defineOptions, ref } from "vue";
import Quill from '@/components/RichEditor/Quill.vue' import Quill from "@/components/RichEditor/Quill.vue";
defineOptions({ name: 'FilterModal' }) defineOptions({ name: "FilterModal" });
const emit = defineEmits(['showNewFilter']) const emit = defineEmits(["showNewFilter"]);
const show = ref(false) const show = ref(false);
function showModal() { function showModal() {
show.value = true show.value = true;
} }
function closeModal() { function closeModal() {
show.value = false show.value = false;
} }
defineExpose({ defineExpose({
showModal, showModal,
}) });
</script> </script>
<template> <template>
<div> <div>
<n-modal v-model:show="show" transform-origin="center"> <n-modal
<Quill /> v-model:show="show"
transform-origin="center"
style="margin: calc(13%-147px) auto 0 !important"
>
<Quill @close="show = false" />
</n-modal> </n-modal>
</div> </div>
</template> </template>
<style lang="less" scoped> <style lang="less" scoped></style>
</style>

@ -1,28 +1,40 @@
<script lang="ts" setup> <script lang="ts" setup>
import Masonry from 'masonry-layout' import Masonry from 'masonry-layout'
import { useDialog, useMessage } from 'naive-ui' import { useDialog, useMessage } from 'naive-ui'
import { computed, onBeforeMount, onMounted, onUpdated, reactive, ref, unref, watch } from 'vue' import { computed, nextTick, onBeforeMount, onMounted, onUpdated, reactive, ref, unref, watch } from 'vue'
import { dubiousfilelist, removeFiles } from '@/api/task/task'
import { viewOptions } from '@/config/home'
import { useInfiniteScroll } from '@vueuse/core' import { useInfiniteScroll } from '@vueuse/core'
import imagesloaded from 'imagesloaded' import imagesloaded from 'imagesloaded'
import { debounce } from 'lodash-es' import { cloneDeep, debounce } from 'lodash-es'
import ConfrimModal from './ConfrimModal.vue'
import { audit, dubiousfilelist, removeFiles } from '@/api/task/task'
import { viewOptions } from '@/config/home'
import { audit } from '@/api/task/task'
import NotPassed from '@/components/Approval/NotPassed.vue' import NotPassed from '@/components/Approval/NotPassed.vue'
import { formatToDateHMS } from '@/utils/dateUtil' import { formatToDateHMS } from '@/utils/dateUtil'
import { off, on } from '@/utils/domUtils' import { off, on } from '@/utils/domUtils'
import ConfrimModal from "./ConfrimModal.vue" import bgLoading from '@/assets/images/bg-loading.png'
const cardStyle = { const cardStyle = {
'--n-padding-bottom': '40px', '--n-padding-bottom': '40px',
'--n-padding-left': '120px', '--n-padding-left': '120px',
} }
const bgLoadingImg = ref(bgLoading)
let startTime = 0
let endTime = 0
let startCalTime = false
const message = useMessage() const message = useMessage()
const timeRange = ref('') const timeRange = ref('desc')
const similarRange = ref('desc')
const batch = ref(false) const batch = ref(false)
const imageRef = ref<ComponentElRef | null>()
const filterId = null
const isTop = ref(false)
let sortObj: any = {
orderByUptime: 'desc',
}
const timeOptions = [{ const timeOptions = [{
label: '升序', label: '升序',
value: 'asc', value: 'asc',
@ -30,6 +42,14 @@ const timeOptions = [{
label: '降序', label: '降序',
value: 'desc', value: 'desc',
}] }]
// const similarOptions = [{
// label: '',
// value: 'asc',
// }, {
// label: '',
// value: 'desc',
// }]
const timeLabel = computed(() => { const timeLabel = computed(() => {
const item = timeOptions.find((option) => { const item = timeOptions.find((option) => {
return option.value === timeRange.value return option.value === timeRange.value
@ -48,8 +68,18 @@ const viewLabel = computed(() => {
return item?.label return item?.label
}) })
const maxHeight = computed(() => {
let height = '800'
const screenWidth = window.screen.width
if (screenWidth <= 1920)
height = '600'
return `${height}px`
})
const masonryRef = ref<ComponentRef>(null) const masonryRef = ref<ComponentRef>(null)
const el = ref<HTMLDivElement | null>(null) const el = ref<HTMLDivElement | null>(null)
const elwc = ref<HTMLDivElement | null>(null)
const listData = ref<any[]>([]) const listData = ref<any[]>([])
const pagination = reactive({ const pagination = reactive({
pageNo: 1, pageNo: 1,
@ -58,10 +88,10 @@ const pagination = reactive({
let loading = false let loading = false
let _masonry: null | Masonry = null let _masonry: null | Masonry = null
const show = ref(false) const show = ref(false)
const selectedApproveItems = ref<any[]>([]); // const selectedApproveItems = ref<any[]>([]) //
const dialog = useDialog(); const dialog = useDialog()
let processItems: any[] = []; let processItems: any[] = []
const confrimModalRef = ref<any>(); const confrimModalRef = ref<any>()
const layout = debounce(() => { const layout = debounce(() => {
if (!show.value) if (!show.value)
@ -82,20 +112,49 @@ const layout = debounce(() => {
const scrollHeight = el.value!.scrollHeight const scrollHeight = el.value!.scrollHeight
const clientHeight = el.value!.clientHeight const clientHeight = el.value!.clientHeight
const top = scrollHeight - clientHeight - 20 const top = scrollHeight - clientHeight - 20
if (isTop.value)
el.value!.scrollTo({ top: 0, behavior: 'instant' })
else
el.value!.scrollTo({ top, behavior: 'instant' }) el.value!.scrollTo({ top, behavior: 'instant' })
// let height = 800 - 15;
// const screenWidth = window.screen.width;
// if(screenWidth <= 1920) {
// height = 600 - 15;
// }
// el.value!.scrollTo({ top: height, behavior: 'instant' })
loading = false loading = false
console.log('loading---------------', loading)
console.log('pagination.pageNo---------------', pagination.pageNo)
if (pagination.pageNo == 3) {
let timer
if (timer)
clearTimeout(timer)
timer = setTimeout(() => {
isTop.value = false
console.log('isTop.value---------------', isTop.value)
}, 1000)
}
}) })
}, 300) }, 300)
watch(viewMode, () => { watch(viewMode, () => {
isTop.value = true
layout() layout()
}) })
onBeforeMount(async () => {
})
let canloadMore = true let canloadMore = true
useInfiniteScroll( useInfiniteScroll(
el as any, el as any,
() => { () => {
loading = false
console.log('加载了000000000000000---------------------------')
loadMore() loadMore()
}, },
{ distance: 10, canLoadMore: () => canloadMore }, { distance: 10, canLoadMore: () => canloadMore },
@ -104,45 +163,57 @@ useInfiniteScroll(
async function featchList() { async function featchList() {
loading = true loading = true
try { try {
const result = await dubiousfilelist({ ...pagination, orderbyname: timeRange.value }) // const result = await dubiousfilelist({ ...pagination, orderbyname: timeRange.value })
console.log('pagination.pageNo------------', pagination.pageNo)
const result = await dubiousfilelist({ ...pagination, ...sortObj })
// TODO // TODO
// result.data = Array.from({ length: 30 }) // result.data = Array.from({ length: 30 })
result.pageCount = 1
const { data, pageCount } = result const { data, pageCount } = result
pagination.pageNo += 1 // canloadMore = pageCount >= pagination.pageNo && pageCount > 0;
canloadMore = pageCount >= pagination.pageNo canloadMore = data.pages >= pagination.pageNo && data.pages > 0
console.log('canloadMore------------', canloadMore)
return result.data.records return result.data.records
// const list = data.map((item) => { // const list = data.map((item) => {
// return { // return {
// imgUrl: randomUrl(), // imgUrl: randomUrl(),
// } // }
// }) // })
// console.log(list)
// return list // return list
} }
catch (error) { catch (error) {
canloadMore = false
return [] return []
} }
} }
async function loadMore() { async function loadMore() {
console.log('执行l------------------------', loading, el.value, pagination.pageNo)
if (loading || el.value == null) if (loading || el.value == null)
return return
loading = true // loading = true
pagination.pageNo = pagination.pageNo + 1
const more = await featchList() const more = await featchList()
console.log('more------------------------', more)
listData.value.push(...more) listData.value.push(...more)
layout()
} }
onUpdated(() => { onUpdated(() => {
console.log('onUpdated', onUpdated) if (startCalTime) {
endTime = new Date().getTime()
if (endTime - startTime > 300)
createDom()
}
else {
removeDom()
}
nextTick(() => {
setTimeout(() => {
layout() layout()
}) }, 50)
})
onBeforeMount(async () => {
console.log(888)
// const list = await featchList()
// listData.value = list
}) })
let start: { x: number, y: number } | null = null let start: { x: number, y: number } | null = null
@ -150,6 +221,8 @@ let selectionBox: HTMLDivElement | null
const selectIds = ref<string[]>([]) const selectIds = ref<string[]>([])
function downHandler(event: MouseEvent) { function downHandler(event: MouseEvent) {
startTime = new Date().getTime()
startCalTime = true
if (!selectionBox) if (!selectionBox)
return return
@ -176,6 +249,29 @@ function imUpdateSelectIds(x: number, y: number, w: number, h: number) {
if (rect.right > x && rect.bottom > y && rect.left < x + w && rect.top < y + h) if (rect.right > x && rect.bottom > y && rect.left < x + w && rect.top < y + h)
index === -1 && selectIds.value.push(item.dataset.id!) index === -1 && selectIds.value.push(item.dataset.id!)
else index !== -1 && selectIds.value.splice(index, 1) else index !== -1 && selectIds.value.splice(index, 1)
// let tempApproveIndex = -1;
// selectedApproveItems.value.map((approveItem, approveIndex) => {
// console.log("approveItem and item", approveItem, item );
// if(approveItem.selfId == item.dataset.id) {
// tempApproveIndex = approveIndex;
// }
// })
// if (tempApproveIndex === -1 && item.className.indexOf('grid-item-selected') != -1) {
// let tempItem: any = cloneDeep(item);
// tempItem.selfId = item.dataset.id;
// selectedApproveItems.value.push(tempItem)
// } else {
// selectedApproveItems.value.splice(tempApproveIndex, 1);
// }
})
selectedApproveItems.value = []
//
listData.value.forEach((item) => {
if (selectIds.value.includes(String(item.pictureId))) {
item.checked = true
selectedApproveItems.value.push(item)
}
}) })
} }
@ -184,6 +280,14 @@ function isSelected(pictureId: number) {
} }
function moveHandler(e: MouseEvent) { function moveHandler(e: MouseEvent) {
if (startCalTime) {
endTime = new Date().getTime()
if (endTime - startTime > 300)
createDom()
}
else {
removeDom()
}
if (!selectionBox || !start) if (!selectionBox || !start)
return return
@ -200,30 +304,79 @@ function moveHandler(e: MouseEvent) {
imUpdateSelectIds(x, y, w, h) imUpdateSelectIds(x, y, w, h)
} }
function createDom() {
const dom = document.createElement('div')
dom.className = 'selection-box'
dom.style.width = '1px'
dom.style.border = '1px dotted black'
dom.style.position = 'absolute'
dom.style.display = 'block'
dom.style.zIndex = '9999'
document.body.appendChild(dom)
selectionBox = document.querySelector('.selection-box') as HTMLDivElement
}
function removeDom() {
const dom = document.getElementsByClassName('selection-box')[0]
if (dom)
document.body.removeChild(dom)
}
function upHandler(event: MouseEvent) { function upHandler(event: MouseEvent) {
endTime = new Date().getTime()
startCalTime = false
if (endTime - startTime > 300)
createDom()
else
removeDom()
if (!selectionBox) if (!selectionBox)
return return
selectionBox.style.display = 'none' selectionBox.style.display = 'none'
start = null start = null
if (selectionBox.style.width == '0px') {
removeDom()
if (event.target?.className.indexOf('n-checkbox-box__border') != -1)
return
selectIds.value = []
selectedApproveItems.value.forEach(item => (item.checked = false))
selectedApproveItems.value.length = 0
listData.value.forEach((item) => {
item.checked = false
})
// batch.value = false;
}
} }
const gridHeight = computed(() => { const gridHeight = computed(() => {
return viewMode.value !== 'masonry' ? '157px' : '' // return viewMode.value !== 'masonry' ? '157px' : ''
let height = ''
if (viewMode.value === 'masonry')
height = ''
else if (viewMode.value === 'horizontalVersion')
height = '145px'
else if (viewMode.value === 'verticalVersion')
height = '300px'
else if (viewMode.value === '3:4')
height = '240px'
return height
}) })
function addListeners() { function addListeners() {
selectionBox = document.querySelector('.selection-box') as HTMLDivElement // selectionBox.style['z-index'] = '-1'
on(el.value!, 'mousedown', downHandler) on(el.value!, 'mousedown', downHandler)
on(el.value!, 'mousemove', moveHandler) on(el.value!, 'mousemove', moveHandler)
on(document, 'mouseup', upHandler) on(document, 'mouseup', upHandler)
// on(elwc.value!, 'mouseup', upHandler)
} }
function removeListeners() { function removeListeners() {
off(el.value!, 'mousedown', downHandler) off(el.value!, 'mousedown', downHandler)
on(el.value!, 'mousemove', moveHandler) on(el.value!, 'mousemove', moveHandler)
on(document, 'mouseup', upHandler) on(document, 'mouseup', upHandler)
// on(elwc.value!, 'mouseup', upHandler)
} }
function afterEnter() { function afterEnter() {
@ -234,8 +387,9 @@ function afterLeave() {
removeListeners() removeListeners()
} }
onMounted(() => { onMounted(async () => {
show.value && addListeners() show.value && addListeners()
removeDom()
}) })
async function showModal() { async function showModal() {
@ -248,9 +402,39 @@ async function showModal() {
} }
async function onChange() { async function onChange() {
if (timeRange.value == 'desc')
timeRange.value = 'asc'
else
timeRange.value = 'desc'
sortObj = {
// orderbyname: val,
orderByUptime: timeRange.value,
}
pagination.pageNo = 1 pagination.pageNo = 1
canloadMore = true
const list = await featchList() const list = await featchList()
listData.value = list listData.value = list
isTop.value = true
layout()
}
async function onChangeView() {
if (similarRange.value == 'desc')
similarRange.value = 'asc'
else
similarRange.value = 'desc'
sortObj = {
// orderbyname: val,
orderBySimilarity: similarRange.value,
}
pagination.pageNo = 1
canloadMore = true
const list = await featchList()
listData.value = list
isTop.value = true
layout()
} }
function closeModal(event: MouseEvent) { function closeModal(event: MouseEvent) {
@ -266,9 +450,11 @@ async function commit() {
const list = await featchList() const list = await featchList()
listData.value = list listData.value = list
layout() layout()
setBatch(false)
} }
} }
function remove() { function remove() {
// console.log("finally-selectedApproveItems------------", selectedApproveItems.value);
if (!selectIds.value || selectIds.value.length === 0) { if (!selectIds.value || selectIds.value.length === 0) {
message.error('至少选中一个') message.error('至少选中一个')
return return
@ -276,17 +462,16 @@ function remove() {
confrimModalRef?.value?.showModal() confrimModalRef?.value?.showModal()
} }
function setBatch(value) { function setBatch(value) {
if (value && batch.value) { if (value && batch.value)
batch.value = !value; batch.value = !value
} else { else
batch.value = value; batch.value = value
}
if (value === false) { if (value === false) {
selectIds.value = [] selectIds.value = []
selectedApproveItems.value.forEach((item) => (item.checked = false)); selectedApproveItems.value.forEach(item => (item.checked = false))
selectedApproveItems.value.length = 0; selectedApproveItems.value.length = 0
} }
} }
@ -296,16 +481,29 @@ defineExpose({
const notPassModalRef = ref(null) const notPassModalRef = ref(null)
const showActions = computed(() => { const showActions = computed(() => {
return selectedApproveItems.value.length > 0 && batch; return selectedApproveItems.value.length > 0 && batch
}); })
function onCheckChange(checked: any, item: any) { function onCheckChange(checked: any, item: any) {
item.checked = checked item.checked = checked
const index = selectedApproveItems.value.indexOf(item); const index = selectedApproveItems.value.indexOf(item)
const picIndex = selectIds.value.indexOf(item.pictureId)
if (index === -1 && checked) selectedApproveItems.value.push(item);
else selectedApproveItems.value.splice(index, 1); if (index === -1 && checked)
selectedApproveItems.value.push(item)
else
selectedApproveItems.value.splice(index, 1)
if (picIndex === -1 && checked)
selectIds.value.push(item.pictureId)
else
selectIds.value.splice(picIndex, 1)
setTimeout(() => {
nextTick(() => {
batch.value = true
})
}, 100)
} }
function rejectHandler() { function rejectHandler() {
@ -314,26 +512,29 @@ function rejectHandler() {
} }
function reset() { function reset() {
batch.value = false; batch.value = false
pagination.pageNo = 1; // pagination.pageNo = 1;
pagination.pageSize = 20; pagination.pageNo = 1
selectIds.value = []; pagination.pageSize = 20
selectedApproveItems.value.length = 0; selectIds.value = []
loading = false; selectedApproveItems.value.length = 0
canloadMore = true; loading = false
canloadMore = true
layout()
} }
function validate(items: any[]) { function validate(items: any[]) {
if (items.length === 0) return "至少选中一个任务"; if (items.length === 0)
return null; return '至少选中一个任务'
return null
} }
function approvalHandler(items?: any) { function approvalHandler(items?: any) {
if (batch.value) { // if (batch.value) {
processItems = selectedApproveItems.value processItems = selectedApproveItems.value
} // }
// => => / // => => /
if (items !== undefined && !(items instanceof PointerEvent)) if (items !== undefined && !(items instanceof PointerEvent))
processItems = [items] processItems = [items]
console.log('batch-------------', batch.value, selectedApproveItems.value, processItems)
const msg = validate(processItems) const msg = validate(processItems)
if (msg !== null) { if (msg !== null) {
@ -380,29 +581,60 @@ function doAudit(param: any) {
message.info(res.message) message.info(res.message)
// emitter.emit('refresh') // emitter.emit('refresh')
refreshHandler() refreshHandler()
} }
else message.error(res.message) else { message.error(res.message) }
}) })
} }
function reloadList() { function reloadList() {
refreshHandler() refreshHandler()
} }
async function refreshHandler() { async function refreshHandler(filtersearchId?: any) {
// rao start
reset() reset()
pagination.pageNo = 1
const list = await featchList() const list = await featchList()
listData.value = list listData.value = list
layout() layout()
// rao end
// reset();
// if (filtersearchId) {
// filterId = filtersearchId;
// }
nextTick(() => {
setTimeout(() => {
useInfiniteScroll(
el as any,
() => {
loadMore()
},
{ distance: 10, canLoadMore: () => canloadMore },
)
}, 300)
})
} }
watch(() => show.value, async (newVal) => {
if (show.value) {
pagination.pageNo = 1
const list = await featchList()
listData.value = list
layout()
}
})
</script> </script>
<template> <template>
<div> <div>
<n-modal v-model:show="show" :mask-closable="false" style="position: relative;" transform-origin="center" <n-modal
@after-enter="afterEnter" @after-leave="afterLeave"> v-model:show="show" :mask-closable="false" style="position: relative;" transform-origin="center"
<n-card :style="cardStyle" class="card card-1" style="position: fixed;top:64px" :bordered="false" size="huge" @after-enter="afterEnter" @after-leave="afterLeave"
role="dialog" aria-modal="true"> >
<n-card
ref="elwc" :style="cardStyle" class="card card-1" style="position: fixed;top:64px" :bordered="false" size="huge"
role="dialog" aria-modal="true"
>
<div class="wrapper"> <div class="wrapper">
<div class="wrapper-m32"> <div class="wrapper-m32">
<SvgIcon name="recycle" size="16" /> <SvgIcon name="recycle" size="16" />
@ -415,24 +647,44 @@ async function refreshHandler() {
<div class="wrapper-content"> <div class="wrapper-content">
<div class="wrapper-content-form wrapper-m32"> <div class="wrapper-content-form wrapper-m32">
<div> <div>
<n-popselect v-model:value="timeRange" :options="timeOptions" trigger="click" @change="onChange">
<div class="wrapper-content-form-dropdown">
<span>时间排序</span>
<SvgIcon class="wrapper-content-form-dropdown-gap" name="arrow-botton" size="14" />
</div>
</n-popselect>
<n-popselect v-model:value="viewMode" :options="viewOptions" trigger="click"> <n-popselect v-model:value="viewMode" :options="viewOptions" trigger="click">
<div class="wrapper-form-dropdown"> <div class="wrapper-form-dropdown">
<span>视图模式</span> <span>视图模式</span>
<SvgIcon class="wrapper-content-form-gap" name="arrow-botton" size="14" /> <SvgIcon class="wrapper-content-form-gap" name="arrow-botton" size="14" />
</div> </div>
</n-popselect> </n-popselect>
<div
style="margin-left: 15px; cursor: pointer; color: #323233"
@click="onChange()"
>
<span>时间排序</span>
<SvgIcon style="margin-left: 8px" name="sort" size="12" />
</div>
<div
style="margin-left: 15px; cursor: pointer; color: #323233"
@click="onChangeView()"
>
<span>相似度排序</span>
<SvgIcon style="margin-left: 8px" name="sort" size="12" />
</div>
<!-- <n-popselect v-model:value="timeRange" :options="timeOptions" trigger="click" @change="onChange">
<div class="wrapper-content-form-dropdown">
<span>时间排序</span>
<SvgIcon class="wrapper-content-form-dropdown-gap" name="arrow-botton" size="14" />
</div>
</n-popselect>
<n-popselect v-model:value="similarRange" :options="timeOptions" trigger="click" @change="onChangeView">
<div class="wrapper-content-form-dropdown">
<span>相似度排序</span>
<SvgIcon class="wrapper-content-form-dropdown-gap" name="arrow-botton" size="14" />
</div>
</n-popselect> -->
</div> </div>
<div> <div>
<div class="remove" @click="remove"> <div class="remove" @click="remove">
移除可疑文件夹 移除可疑文件夹
</div> </div>
<div class="wrapper-content-form-button" @click="setBatch(true)" v-show="!showActions"> <div v-show="!showActions" class="wrapper-content-form-button" @click="setBatch(true)">
<SvgIcon style="margin-right: 6px;" size="14" name="tf" /> <SvgIcon style="margin-right: 6px;" size="14" name="tf" />
批量审批 批量审批
</div> </div>
@ -444,35 +696,52 @@ async function refreshHandler() {
返回 返回
</n-button> </n-button>
<div style="cursor: pointer; margin-left: 16px" @click.stop="rejectHandler"> <div style="cursor: pointer; margin-left: 16px" @click.stop="rejectHandler">
<SvgIcon width="64" height="28" name="a1" /> <!--<SvgIcon width="64" height="28" name="a1" />-->
<img class="btn-approval btn-left" style="margin-left: 16px" src="@/assets/images/task/btn-not-pass.png" alt="" >
</div> </div>
<SvgIcon size="24" name="vs" /> <SvgIcon size="24" name="vs" />
<div style="cursor: pointer" @click.stop="approvalHandler"> <div style="cursor: pointer" @click.stop="approvalHandler">
<SvgIcon width="64" height="28" name="a2" /> <!-- <SvgIcon width="64" height="28" name="a2" />-->
<img class="btn-approval" src="@/assets/images/task/btn-pass.png" alt="" >
</div> </div>
</div> </div>
</div> </div>
</div> </div>
<div ref="el" class="scroll"> <div ref="el" class="scroll" :style="{ height: maxHeight, marginTop: '16px' }">
<!-- <n-scrollbar :on-scroll="scrollHandler"> --> <!-- <n-scrollbar :on-scroll="scrollHandler"> -->
<div ref="masonryRef" class="grid"> <div ref="masonryRef" class="grid">
<div v-for="(item, index) in listData" :key="item.pictureId" :data-id="item.pictureId" <div
v-for="(item) in listData" :key="item.pictureId" :data-id="item.pictureId"
:class="{ 'grid-item-selected': isSelected(item.pictureId) }" :style="{ height: gridHeight }" :class="{ 'grid-item-selected': isSelected(item.pictureId) }" :style="{ height: gridHeight }"
class="grid-item"> class="grid-item"
<n-image :src="item.imgUrl" class="img " >
:class="{ 'img-fit': viewMode === 'horizontalVersion', 'img-full': viewMode === '3:4' || viewMode === 'verticalVersion' }" /> <n-image
<n-checkbox v-if="batch && item.historyStates === 1" v-model:checked="item.checked" ref="imageRef"
style="position:absolute;left:20px;top:20px" @click.prevent :src="item?.serverThumbnailUrl ? item.serverThumbnailUrl : item.imgUrl"
@update:checked="onCheckChange($event, item)" /> :preview-src="item.imgUrl"
:fallback-src="bgLoadingImg"
class="img "
:class="{
'img-fit': viewMode === 'horizontalVersion',
'img-full': viewMode === '3:4' || viewMode === 'verticalVersion' }"
:style="{ backgroundImage: `url(${loading ? bgLoadingImg : 'none'})` }"
/>
<n-checkbox
v-if="batch && item.historyStates === 1" v-model:checked="item.checked"
style="position:absolute;left:20px;top:20px" @click.prevent.stop
@update:checked="onCheckChange($event, item)"
/>
<img v-if="item.historyStates === 2" class="tag-status" src="@/assets/images/task/tag-pass.png" alt=""> <img v-if="item.historyStates === 2" class="tag-status" src="@/assets/images/task/tag-pass.png" alt="">
<img v-if="item.historyStates === 3" class="tag-status" src="@/assets/images/task/tag-not-pass.png" <img
alt=""> v-if="item.historyStates === 3" class="tag-status" src="@/assets/images/task/tag-not-pass.png"
alt=""
>
<div :class="{ 'percent-red': item.similarityScore === 100 }" class="percent"> <div :class="{ 'percent-red': item.similarityScore === 100 }" class="percent">
{{ item.similarityScore }}<span class="percent-unit">%</span> {{ item.similarityScore }}<span class="percent-unit">%</span>
</div> </div>
<div class="time" style="left: 25px;bottom: 15px;"> <div class="time">
<!-- <div class="time-item"> <!-- <div class="time-item">
<SvgIcon class="svg-time" color="#FFF" size="16" name="camera-time" /> <SvgIcon class="svg-time" color="#FFF" size="16" name="camera-time" />
<span>{{ item?.photoDateTimestamp ? <span>{{ item?.photoDateTimestamp ?
@ -483,10 +752,15 @@ async function refreshHandler() {
<span>{{ item.submitDateTimestamp ? <span>{{ item.submitDateTimestamp ?
formatToDateHMS(Number(item.submitDateTimestamp)) : '-' }}</span> formatToDateHMS(Number(item.submitDateTimestamp)) : '-' }}</span>
</div> --> </div> -->
<div class="time-item" style="margin-bottom: 4px;">
<SvgIcon color="#FFF" size="16" name="camera" style="margin-right: 4px;" />
<span class="time-value">{{ item?.photoDateTimestamp
? formatToDateHMS(Number(item.photoDateTimestamp)) : '- -' }} </span>
</div>
<div class="time-item"> <div class="time-item">
<SvgIcon class="svg-time" color="#FFF" size="16" name="time" /> <SvgIcon class="svg-time" color="#FFF" size="16" name="time" />
<span>{{ item.submitDateTimestamp ? <span>{{ item.submitDateTimestamp
formatToDateHMS(Number(item.submitDateTimestamp)) : '-' }}</span> ? formatToDateHMS(Number(item.submitDateTimestamp)) : '- -' }}</span>
</div> </div>
</div> </div>
</div> </div>
@ -502,12 +776,16 @@ async function refreshHandler() {
</n-card> </n-card>
</n-modal> </n-modal>
<NotPassed ref="notPassModalRef" @success="reloadList" /> <NotPassed ref="notPassModalRef" @success="reloadList" />
<ConfrimModal ref="confrimModalRef" @commit="commit" :selectedTotal="selectIds.length" /> <ConfrimModal ref="confrimModalRef" :selected-total="selectIds.length" @commit="commit" />
</div> </div>
</template> </template>
<style lang="less" scoped> <style lang="less" scoped>
.btn-approval{
width: 68px;
height: 28px;
cursor: pointer;
}
.card { .card {
width: 100vw; width: 100vw;
height: calc(100vh - 64px); height: calc(100vh - 64px);
@ -549,7 +827,9 @@ async function refreshHandler() {
} }
.img { .img {
border-radius: 8px; border-radius: 7px;
display: block;
height: 100%;
} }
.wrapper { .wrapper {
@ -660,10 +940,13 @@ async function refreshHandler() {
} }
.time { .time {
position: absolute; position: absolute;
width: 182px;
padding-left: 10px;
z-index: 3; z-index: 3;
left: 32px; left: 16px;
bottom: 32px; bottom: 16px;
background: linear-gradient(180deg,rgba(6,0,0,0.01),rgba(0, 0, 0, 0.44) 100%);
border-radius: 0 0 7px 7px;
.time-item { .time-item {
display: flex; display: flex;
align-items: center; align-items: center;
@ -683,10 +966,10 @@ async function refreshHandler() {
} }
} }
.scroll { .scroll {
overflow-y: auto; overflow-y: auto;
height: calc(100vh - 282px); // height: calc(100vh - 282px);
height: 800px;
margin-left: 20px; margin-left: 20px;
} }
} }
@ -710,4 +993,5 @@ async function refreshHandler() {
height: 100%; height: 100%;
object-fit: cover; object-fit: cover;
} }
}</style> }
</style>

@ -14,11 +14,15 @@ defineExpose({
<template> <template>
<div> <div>
<n-modal v-model:show="show" :mask="false" :showMask="false" transform-origin="center"> <n-modal
v-model:show="show"
:mask="false"
:show-mask="false"
transform-origin="center"
>
<Search @close="show = false" /> <Search @close="show = false" />
</n-modal> </n-modal>
</div> </div>
</template> </template>
<style scoped lang="less"> <style scoped lang="less"></style>
</style>

@ -1,49 +1,71 @@
<script lang="ts" setup> <script lang="ts" setup>
import { defineOptions, ref } from 'vue' import { defineOptions, ref } from "vue";
defineOptions({ name: 'ShortcutModal' }) defineOptions({ name: "ShortcutModal" });
const show = ref(false) const show = ref(false);
const cardStyle = { const cardStyle = {
'width': '800px', "width": "800px",
'--n-padding-bottom': '10px', "--n-padding-bottom": "10px",
'--n-padding-left': '10px', "--n-padding-left": "10px",
'padding-bottom':'100px' "padding-bottom": "100px",
} };
function showModal() { function showModal() {
show.value = true show.value = true;
} }
function closeModal() { function closeModal() {
show.value = false show.value = false;
} }
defineExpose({ defineExpose({
showModal, showModal,
}) });
</script> </script>
<template> <template>
<div> <div>
<n-modal v-model:show="show" transform-origin="center"> <n-modal
<n-card :style="cardStyle" :bordered="false" size="huge" role="dialog" aria-modal="true"> v-model:show="show"
transform-origin="center"
style="width: 808px; height: 606px; margin: -27px auto 0 !important"
>
<n-card
:style="cardStyle"
:bordered="false"
size="huge"
role="dialog"
aria-modal="true"
>
<div class="wrapper"> <div class="wrapper">
<div class="wrapper-header"> <div class="wrapper-header">
<span class="wrapper-left">全局快捷键</span> <span class="wrapper-left">全局快捷键</span>
<div class="wrapper-right"> <div class="wrapper-right">
<img class="img-question" src="@/assets/images/question.png" alt="">查看快捷键的信息
<img
class="img-question"
src="@/assets/images/question.png"
alt=""
style="width: 18px; height: 18px"
>查看快捷键的信息
<img class="img-close" src="@/assets/images/close.png" alt="" @click="closeModal"> <img
class="img-close"
src="@/assets/images/close.png"
alt=""
style="width: 20px; height: 20px"
@click="closeModal"
>
</div> </div>
</div> </div>
<n-divider /> <n-divider style="margin-bottom: 32px" />
<div class="title"> <div class="title">
全局快捷方式 全局快捷方式
</div> </div>
<div class="wrapper-global"> <div class="wrapper-global">
<table style="margin-left: 100px;"> <table style="margin-left: 110px; width: 230px">
<tr> <tr>
<td><div class="key" data-key="g h" /></td> <td><div class="key" data-key="g h" /></td>
<td>进入一键查看主页</td> <td>进入一键查看主页</td>
@ -54,7 +76,7 @@ defineExpose({
</tr> </tr>
<tr> <tr>
<td><div class="key" data-key="g a" /></td> <td><div class="key" data-key="g a" /></td>
<td>进入AI工单主页</td> <td>进入图检审批主页</td>
</tr> </tr>
<tr> <tr>
<td><div class="key" data-key="g e" /></td> <td><div class="key" data-key="g e" /></td>
@ -73,7 +95,7 @@ defineExpose({
<td>打开可疑文件夹</td> <td>打开可疑文件夹</td>
</tr> </tr>
</table> </table>
<table style="height: 30%;margin-left: 180px;"> <table style="height: 30%; margin-left:115px">
<tr> <tr>
<td><div class="key" data-key="[" /></td> <td><div class="key" data-key="[" /></td>
<td>隐藏/显示当前场景左侧筛选区</td> <td>隐藏/显示当前场景左侧筛选区</td>
@ -96,37 +118,51 @@ defineExpose({
</tr> </tr>
</table> </table>
</div> </div>
<n-divider /> <n-divider style="margin: 24px 24px 32px 24px; color: #d9d9d9" />
<div class="title"> <div class="title" style="margin-top: -16.5px">
任务审批/任务终审/AI工单明细动作 任务审批/任务终审/AI工单明细动作
</div> </div>
<div class="wrapper-request"> <div class="wrapper-request">
<table style="margin-left: 100px;"> <table style="margin-left: 120px; width: 290px">
<tr>
<td><div class="key" data-key="c" /></td>
<td>关闭关闭当前场景弹窗</td>
</tr>
<tr> <tr>
<td><div class="key" data-key="p p" /></td>
<td>通过</td> <td ><div class="key" style="float: left;
margin-left: 5px;" data-key="c" /></td>
<td><div style="float: left;
margin-left: -60px;">关闭关闭当前场景弹窗</div></td>
</tr> </tr>
<tr> <tr>
<td><div class="key" data-key="x x" /></td> <td>
<td>不通过</td> <div class="key" data-key="&larr;" />
<span>/</span>
<div class="key" data-key="&rarr;" />
</td>
<td>打开上一条/下一条信息切换</td>
</tr> </tr>
</table> </table>
<table style="margin-left: 155px;"> <table style="margin-left: 50px">
<tr> <tr>
<td><div class="key" data-key="t t" /></td> <td style="text-align: left; width: 53px">
<td></td> <div class="key" data-key="p p" />
</td>
<td>通过</td>
</tr> </tr>
<tr> <tr>
<td><div class="key" data-key="f f" /></td> <td style="text-align: left">
<td></td> <div class="key" data-key="x x" />
</td>
<td>不通过</td>
</tr> </tr>
</table>
</div>
<div class="wrapper-request">
<table style="margin-left: 120px; width: 180px">
<tr> <tr>
<td><div class="key" data-key="&larr;" /><span>/</span><div class="key" data-key="&rarr;" /></td> <td style="text-align: left; width: 53px">
<td>打开上一条/下一条信息切换</td> <div class="key" data-key="k k" />
</td>
<td>开启沉浸模式</td>
</tr> </tr>
</table> </table>
</div> </div>
@ -149,54 +185,56 @@ defineExpose({
</template> </template>
<style lang="less" scoped> <style lang="less" scoped>
.wrapper-footer{ .wrapper-footer {
margin-top: -20px; margin-top: -20px;
} }
.wrapper { .wrapper {
.wrapper-header {
.wrapper-header{ padding: 14px 0 14px 0;
padding: 14px;
padding-bottom: 0; padding-bottom: 0;
} }
.img-question{ .img-question {
width: 16px; width: 16px;
height: 16px; height: 16px;
margin: 0 2px; margin: 0 2px;
} }
.img-close{ .img-close {
width: 16px; width: 16px;
height: 16px; height: 16px;
margin-left: 16px; margin-left: 16px;
cursor: pointer; cursor: pointer;
} }
.wrapper-right{ .wrapper-right {
font-size: 16px; font-size: 16px;
font-family: PingFang SC, PingFang SC-Regular; font-family: PingFang SC, PingFang SC-Regular;
font-weight: Regular; font-weight: 400;
text-align: left; text-align: left;
color: #666666; color: #666666;
line-height: 22px; line-height: 22px;
display: flex; display: flex;
align-items: center align-items: center;
} }
.wrapper-left{ .wrapper-left {
font-size: 18px; font-size: 18px;
font-family: PingFang SC, PingFang SC-Medium; font-family: PingFang SC, PingFang SC-Medium;
font-weight: 600; font-weight: 600;
text-align: left; text-align: left;
color: #333333; color: #000000;
line-height: 25px; line-height: 25px;
} }
.title{ .title {
font-size: 14px; font-size: 14px;
font-weight: 600; font-weight: 600;
margin-bottom: 10px; margin-bottom: 10px;
padding-left: 30px; padding-left: 47px;
color: #333333;
font-weight: 600;
// 线24px
} }
&-header { &-header {
display: flex; display: flex;
@ -227,7 +265,7 @@ defineExpose({
} }
&-icon { &-icon {
background: #FFF; background: #fff;
display: inline-block; display: inline-block;
width: 18px; width: 18px;
height: 1px; height: 1px;
@ -235,32 +273,31 @@ defineExpose({
-webkit-transform: rotate(45deg); -webkit-transform: rotate(45deg);
&:after { &:after {
content: ''; content: "";
display: block; display: block;
width: 18px; width: 18px;
height: 1px; height: 1px;
background: #FFF; background: #fff;
transform: rotate(-90deg); transform: rotate(-90deg);
-webkit-transform: rotate(-90deg); -webkit-transform: rotate(-90deg);
} }
} }
} }
&-request,&-global{ &-request,
&-global {
display: flex; display: flex;
table{ table {
tr td:first-child{ tr td:first-child {
text-align: right; text-align: right;
padding-right: 10px; padding-right: 10px;
color: #515457; color: #515457;
} }
tr td{ tr td {
color: #333333; color: #333333;
} }
tr span{ tr span {
padding: 0 10px; padding: 0 10px;
} }
} }
@ -276,13 +313,14 @@ defineExpose({
display: inline-block; display: inline-block;
box-sizing: content-box; box-sizing: content-box;
font-size: 16px; font-size: 16px;
font-weight: bold;
text-align: center; text-align: center;
padding: 2px 6px; padding: 2px 6px;
border: 1px solid #d6d6d6; border: 1px solid #d6d6d6;
border-left: 3px solid #d6d6d6; border-left: 3px solid #d6d6d6;
border-bottom: 3px solid #d6d6d6; border-bottom: 3px solid #d6d6d6;
background-color: #fdfdfd; background-color: #fdfdfd;
// color: #333333;
font-weight: bold;
} }
.key[data-key]::after { .key[data-key]::after {

@ -3,10 +3,22 @@ import { computed, inject, onMounted, ref } from "vue";
import { useRoute, useRouter } from "vue-router"; import { useRoute, useRouter } from "vue-router";
import { useUser } from "@/store/modules/user"; import { useUser } from "@/store/modules/user";
import { getImgUrl } from "@/utils/urlUtils"; import { getImgUrl } from "@/utils/urlUtils";
import defaultAvatar from '@/assets/icons/avatar.svg'; import defaultAvatar from "@/assets/icons/avatar.svg";
/**
* 用户权限菜单
*/
interface IUserMenu {
id: number,
name: string,
resKey: string,
resUrl: string
icon: string,
level: number,
parentId: number
}
const emit = defineEmits<{ const emit = defineEmits<{
(e: "logout"): void; (e: "logout"): void
}>(); }>();
const router = useRouter(); const router = useRouter();
@ -16,7 +28,10 @@ const userStore = useUser();
const useInfo = userStore.getUserInfo; const useInfo = userStore.getUserInfo;
const aiDisabled = ref(false); const aiDisabled = ref(false);
const userMenus = computed<IUserMenu[]>(() => {
return userStore.getUserInfo.frontmenuTList
})
function handleSelect(row) { function handleSelect(row) {
userStore.updateTenantId(row.key); userStore.updateTenantId(row.key);
location.reload(); location.reload();
@ -25,24 +40,30 @@ function handleSelect(row) {
function logIt(e) { function logIt(e) {
return false; return false;
} }
function hasPerm(resKey) {
return userMenus.value.some(i => i.resKey === resKey)
}
// //
function goHome(e) { function goHome(e) {
if (!hasPerm('home_main')) return
router.push({ name: "home" }); router.push({ name: "home" });
} }
// //
function goTask(e) { function goTask(e) {
if (!hasPerm('task-main')) return
router.push({ name: "task-main" }); router.push({ name: "task-main" });
} }
// AI // AI
function goWorksheet(e) { function goWorksheet(e) {
if (!hasPerm('worksheet-main')) return
router.push({ name: "worksheet-main" }); router.push({ name: "worksheet-main" });
} }
// //
function goFinal(e) { function goFinal(e) {
if (!hasPerm('final-main')) return
router.push({ name: "final-main" }); router.push({ name: "final-main" });
} }
@ -72,18 +93,18 @@ function logOut() {
} }
const currentCompanyName = computed(() => { const currentCompanyName = computed(() => {
const tenantList = useInfo.tenantList; const deptlist = useInfo.deptlist;
const currentId = userStore.getTenantId; const currentId = userStore.getTenantId;
const current = tenantList.find((item) => item.id === currentId); const current = deptlist.find(item => item.deptno === currentId);
return current.name || "name"; return current?.departname || "name";
}); });
const options = computed(() => { const options = computed(() => {
const tenantList = useInfo.tenantList; const deptlist = useInfo.deptlist;
return tenantList.map((item) => { return deptlist.map((item) => {
return { return {
label: item.name, label: item.departname,
key: item.id, key: item.deptno,
}; };
}); });
}); });
@ -101,8 +122,8 @@ const options = computed(() => {
> >
<template #trigger> <template #trigger>
<div class="setting"> <div class="setting">
<span>{{ useInfo.username }}</span> <span style="color: #333333">{{ useInfo.username }}</span>
<SvgIcon style="margin-left: 6px" :name="iconName" size="14" /> <SvgIcon style="margin-left: 6px" :name="iconName" size="16" />
</div> </div>
</template> </template>
<div class="container"> <div class="container">
@ -119,24 +140,28 @@ const options = computed(() => {
</div> </div>
<div class="trigger"> <div class="trigger">
<span>{{ currentCompanyName }}</span> <span>{{ currentCompanyName }}</span>
<span @click="changeFlag = !changeFlag" style="cursor: pointer"><SvgIcon name="switchCompany" size="24" /></span> <span style="cursor: pointer" @click="changeFlag = !changeFlag"><SvgIcon name="switchCompany" size="24" /></span>
</div> </div>
<div class="item"> <div class="item">
<span>AI设置开关</span> <span>AI设置开关</span>
<n-switch v-model:value="aiDisabled" /> <n-switch v-model:value="aiDisabled" />
</div> </div>
<div class="trigger">联系我们</div> <div class="trigger">
联系我们
</div>
<n-divider style="margin-top: 0px; margin-bottom: 10px; padding: 0 22px" /> <n-divider style="margin-top: 0px; margin-bottom: 10px; padding: 0 22px" />
<div class="trigger" @click="logOut">退</div> <div class="trigger" @click="logOut">
退出登录
</div>
<div <div
class="container sub-container"
v-show="changeFlag" v-show="changeFlag"
class="container sub-container"
style="position: absolute; right: 17vw; width: 11.5vw; padding: 24px 0" style="position: absolute; right: 17vw; width: 11.5vw; padding: 24px 0"
> >
<div <div
class="trigger"
v-for="option in options" v-for="option in options"
:key="option.key" :key="option.key"
class="trigger"
@click="handleSelect(option)" @click="handleSelect(option)"
> >
{{ option.label }} {{ option.label }}
@ -151,9 +176,11 @@ const options = computed(() => {
.header { .header {
.user-name { .user-name {
font-size: 16px; font-size: 16px;
font-weight: 600;
} }
.depart-name { .depart-name {
font-size: 12px; font-size: 12px;
font-weight: 600;
} }
} }
} }
@ -190,6 +217,8 @@ const options = computed(() => {
padding: 13px 20px; padding: 13px 20px;
cursor: pointer; cursor: pointer;
color: #333333; color: #333333;
font-size: 13px;
font-weight: 600;
} }
.trigger:hover { .trigger:hover {

@ -1,6 +1,15 @@
<script lang="ts"> <script lang="ts">
import { useDialog, useMessage } from 'naive-ui' import { useDialog, useMessage } from 'naive-ui'
import { defineComponent, inject, onMounted, reactive, ref, toRefs, unref, watch } from 'vue' import {
defineComponent,
inject,
onMounted,
reactive,
ref,
toRefs,
unref,
watch,
} from 'vue'
import { useRoute, useRouter } from 'vue-router' import { useRoute, useRouter } from 'vue-router'
import QuillModal from './QuillModal.vue' import QuillModal from './QuillModal.vue'
import RecycleModal from './RecycleModal.vue' import RecycleModal from './RecycleModal.vue'
@ -11,11 +20,11 @@ import { msgPolling } from '@/api/message/message'
import { getImgUrl } from '@/utils/urlUtils' import { getImgUrl } from '@/utils/urlUtils'
import { useUser } from '@/store/modules/user' import { useUser } from '@/store/modules/user'
import { useTaskStore } from '@/store/modules/task' import { useTaskStore } from '@/store/modules/task'
import defaultAvatar from '@/assets/icons/avatar.svg'; import defaultAvatar from '@/assets/icons/avatar.svg'
const taskStore = useTaskStore(); const taskStore = useTaskStore()
export default defineComponent({ export default defineComponent({
name: "PageHeader", name: 'PageHeader',
components: { components: {
UserSettings, UserSettings,
QuillModal, QuillModal,
@ -31,139 +40,140 @@ export default defineComponent({
type: Boolean, type: Boolean,
}, },
}, },
emits: ["update:collapsed"], emits: ['update:collapsed'],
setup() { setup() {
const message = useMessage(); const message = useMessage()
const dialog = useDialog(); const dialog = useDialog()
const userStore = useUser(); const userStore = useUser()
const useInfo = userStore.getUserInfo; const useInfo = userStore.getUserInfo
const name = ""; const name = ''
const state = reactive({ const state = reactive({
username: name ?? "", username: name ?? '',
fullscreenIcon: "FullscreenOutlined", fullscreenIcon: 'FullscreenOutlined',
}); })
const router = useRouter(); const router = useRouter()
const route = useRoute(); const route = useRoute()
const routename = ref(route.meta.title); const routename = ref(route.meta.title)
// mm // mm
const iconList = ref([ const iconList = ref([
{ {
icon: "magnifying-1", icon: 'magnifying-1',
handle: searchHandler, handle: searchHandler,
}, },
{ {
icon: "shortcut-keys", icon: 'shortcut-keys',
handle: shortcutHandler, handle: shortcutHandler,
}, },
{ {
icon: "suspicious-folder", icon: 'suspicious-folder',
handle: recycleHandler, handle: recycleHandler,
}, },
{ {
icon: "memo", icon: 'memo',
handle: quillHandler, handle: quillHandler,
}, },
{ {
icon: "nomessage", icon: 'nomessage',
handle: goMessage, handle: goMessage,
}, },
]); ])
watch( watch(
() => route.fullPath, () => route.fullPath,
() => { () => {
routename.value = route.meta.title; routename.value = route.meta.title
} },
); )
const handleDragOver = (event, item) => { const handleDragOver = (event, item) => {
taskStore.setInFile(true); taskStore.setInFile(true)
}; }
const handleDragLeave = (event, item) => { const handleDragLeave = (event, item) => {
taskStore.setInFile(false); taskStore.setInFile(false)
}; }
const dropdownSelect = (key) => { const dropdownSelect = (key) => {
router.push({ name: key }); router.push({ name: key })
}; }
// 退 // 退
const doLogout = () => { const doLogout = () => {
dialog.info({ dialog.info({
title: "提示", title: '提示',
content: "您确定要退出登录吗", content: '您确定要退出登录吗',
positiveText: "确定", positiveText: '确定',
negativeText: "取消", negativeText: '取消',
onPositiveClick: () => { onPositiveClick: () => {
userStore.logout().then(() => { userStore.logout().then(() => {
message.success("成功退出登录"); message.success('成功退出登录')
router router
.replace({ .replace({
name: "Login", name: 'Login',
query: { query: {
// redirect: route.fullPath, // redirect: route.fullPath,
}, },
}) })
.finally(() => location.reload()); .finally(() => location.reload())
}); })
}, },
onNegativeClick: () => {}, onNegativeClick: () => {},
}); })
}; }
const quillModalRef = ref(null); const quillModalRef = ref(null)
const shortcutModal = ref(null); const shortcutModal = ref(null)
const recycleModalRef = ref(null); const recycleModalRef = ref(null)
const SearchModalRef = ref(null); const SearchModalRef = ref(null)
function quillHandler() { function quillHandler() {
const modal = unref(quillModalRef)! as any; const modal = unref(quillModalRef)! as any
modal.showModal(); modal.showModal()
} }
function shortcutHandler() { function shortcutHandler() {
const modal = unref(shortcutModal)! as any; const modal = unref(shortcutModal)! as any
modal.showModal(); modal.showModal()
} }
function recycleHandler() { function recycleHandler() {
const modal = unref(recycleModalRef)! as any; const modal = unref(recycleModalRef)! as any
modal.showModal(); modal.showModal()
} }
function searchHandler() { function searchHandler() {
const modal = unref(SearchModalRef)! as any; const modal = unref(SearchModalRef)! as any
modal.showModal(); modal.showModal()
} }
function goMessage() { function goMessage() {
router.push({ name: "message-main" }); router.push({ name: 'message-main' })
} }
async function getMessage() { async function getMessage() {
const res = await msgPolling(); const res = await msgPolling()
if (res.data) iconList.value[4].icon = "hasmessage"; if (res.data)
else iconList.value[4].icon = "nomessage"; iconList.value[4].icon = 'hasmessage'
else iconList.value[4].icon = 'nomessage'
} }
setInterval(() => { setInterval(() => {
getMessage(); getMessage()
}, 5000); }, 5000)
const mousetrap = inject("mousetrap") as any; const mousetrap = inject('mousetrap') as any
onMounted(() => { onMounted(() => {
getMessage(); getMessage()
mousetrap.bind("n r", quillHandler); mousetrap.bind('n r', quillHandler)
mousetrap.bind("n t", quillHandler); mousetrap.bind('n t', quillHandler)
mousetrap.bind("n n", recycleHandler); mousetrap.bind('n n', recycleHandler)
mousetrap.bind("m m", searchHandler); mousetrap.bind('/', searchHandler)
}); })
const defaultAvatarSrc = ref(defaultAvatar); const defaultAvatarSrc = ref(defaultAvatar)
return { return {
...toRefs(state), ...toRefs(state),
@ -187,7 +197,7 @@ export default defineComponent({
defaultAvatarSrc, defaultAvatarSrc,
} }
}, },
}); })
</script> </script>
<template> <template>
@ -197,11 +207,11 @@ export default defineComponent({
<!-- 菜单收起 --> <!-- 菜单收起 -->
<div <div
class="ml-1 layout-header-trigger layout-header-trigger-min" class="ml-1 layout-header-trigger layout-header-trigger-min"
style="padding-left: 13px"
@click="() => $emit('update:collapsed', !collapsed)" @click="() => $emit('update:collapsed', !collapsed)"
> >
<SvgIcon name="homepage" size="16" /> <SvgIcon name="homepage" size="16" />
</div> </div>
<div>当前位置{{ routename }}</div> <div>当前位置{{ routename }}</div>
</div> </div>
<div class="layout-header-right"> <div class="layout-header-right">
@ -227,7 +237,11 @@ export default defineComponent({
<!-- 个人中心 --> <!-- 个人中心 -->
<div class="layout-header-trigger layout-header-trigger-min"> <div class="layout-header-trigger layout-header-trigger-min">
<!-- <n-avatar :src="getImgUrl(useInfo.usericon)" round /> --> <!-- <n-avatar :src="getImgUrl(useInfo.usericon)" round /> -->
<n-avatar :src="(useInfo.usericon && getImgUrl(useInfo.usericon)) || defaultAvatarSrc" round/> <n-avatar
style="width: 36px; height: 36px"
:src="(useInfo.usericon && getImgUrl(useInfo.usericon)) || defaultAvatarSrc"
round
/>
</div> </div>
<!-- 设置 --> <!-- 设置 -->
<UserSettings @logout="doLogout" /> <UserSettings @logout="doLogout" />
@ -245,7 +259,7 @@ export default defineComponent({
justify-content: space-between; justify-content: space-between;
align-items: center; align-items: center;
padding: 0; padding: 0;
height: 64px; height: 62px;
transition: all 0.2s ease-in-out; transition: all 0.2s ease-in-out;
width: 100%; width: 100%;
z-index: 11; z-index: 11;
@ -253,6 +267,7 @@ export default defineComponent({
&-left { &-left {
display: flex; display: flex;
align-items: center; align-items: center;
justify-content: flex-start;
color: #666666; color: #666666;
.logo { .logo {
@ -267,7 +282,7 @@ export default defineComponent({
img { img {
width: auto; width: auto;
height: 32px; height: 34px;
margin-right: 10px; margin-right: 10px;
} }
@ -280,7 +295,7 @@ export default defineComponent({
&-right { &-right {
display: flex; display: flex;
align-items: center; align-items: center;
margin-right: 20px; margin-right: 24px;
.back { .back {
width: 28px; width: 28px;

@ -1,13 +1,19 @@
<script setup lang="ts"> <script setup lang="ts">
import { useRouter } from 'vue-router' import { useRouter } from 'vue-router'
import { websiteConfig } from '@/config/website.config' import { websiteConfig } from '@/config/website.config'
import { storage } from '@/utils/Storage'
import { CURRENT_USER } from '@/store/mutation-types'
defineOptions({ name: 'Index' }) defineOptions({ name: 'Index' })
const router = useRouter() const router = useRouter()
function clickHandler() { function clickHandler() {
const userInfo = storage.get(CURRENT_USER)
if (userInfo && userInfo.frontmenuTList) {
if (userInfo.frontmenuTList.find(item => item.resUrl == '/home'))
router.push({ path: '/home' }) router.push({ path: '/home' })
}
} }
</script> </script>
@ -18,7 +24,7 @@ function clickHandler() {
</template> </template>
<style lang="less" scoped> <style lang="less" scoped>
.logo { .logo {
display: flex; display: flex;
align-items: center; align-items: center;
justify-content: center; justify-content: center;
@ -36,5 +42,5 @@ function clickHandler() {
.title { .title {
margin: 0; margin: 0;
} }
} }
</style> </style>

@ -1,57 +1,57 @@
<script lang="ts"> <script lang="ts">
import { computed, defineComponent, onMounted, ref, unref, watch } from "vue"; import { computed, defineComponent, onMounted, ref, unref, watch } from 'vue'
import { useRoute, useRouter } from "vue-router"; import { useRoute, useRouter } from 'vue-router'
import { IconGroup } from "../IconGroup"; import { IconGroup } from '../IconGroup'
import { useAsyncRouteStore } from "@/store/modules/asyncRoute"; import { useAsyncRouteStore } from '@/store/modules/asyncRoute'
import { generatorMenu } from "@/utils"; import { generatorMenu } from '@/utils'
import { storage } from "@/utils/Storage"; import { storage } from '@/utils/Storage'
import { CURRENT_USER } from "@/store/mutation-types"; import { CURRENT_USER } from '@/store/mutation-types'
export default defineComponent({ export default defineComponent({
name: "AppMenu", name: 'AppMenu',
components: { IconGroup }, components: { IconGroup },
emits: ["clickMenuItem"], emits: ['clickMenuItem'],
setup(props, { emit }) { setup(props, { emit }) {
// //
const currentRoute = useRoute(); const currentRoute = useRoute()
const router = useRouter(); const router = useRouter()
const asyncRouteStore = useAsyncRouteStore(); const asyncRouteStore = useAsyncRouteStore()
const menus = ref<any[]>([]); const menus = ref<any[]>([])
const selectedSvg = ref<string>(currentRoute.meta.svgname as string); const selectedSvg = ref<string>(currentRoute.meta.svgname as string)
const getSelectedSvg = computed(() => { const getSelectedSvg = computed(() => {
return unref(selectedSvg); return unref(selectedSvg)
}); })
// //
watch( watch(
() => currentRoute.fullPath, () => currentRoute.fullPath,
() => { () => {
updateMenu(); updateMenu()
} },
); )
function updateSelectedKeys() { function updateSelectedKeys() {
const svgname: string = (currentRoute.meta?.svgname as string) || ""; const svgname: string = (currentRoute.meta?.svgname as string) || ''
selectedSvg.value = svgname; selectedSvg.value = svgname
} }
function updateMenu() { function updateMenu() {
menus.value = generatorMenu(asyncRouteStore.getMenus); menus.value = generatorMenu(asyncRouteStore.getMenus)
const userInfo = storage.get(CURRENT_USER); const userInfo = storage.get(CURRENT_USER)
if (userInfo && userInfo.frontmenuTList) { if (userInfo && userInfo.frontmenuTList) {
menus.value = userInfo.frontmenuTList.map((item) => { menus.value = userInfo.frontmenuTList.map((item) => {
let v = { const v = {
component: () => component: () =>
item.resUrl == "/task" item.resUrl == '/task'
? import("@/views/task/index.vue") ? import('@/views/task/index.vue')
: item.resUrl == "/home" : item.resUrl == '/home'
? import("@/views/home/index.vue") ? import('@/views/home/index.vue')
: item.resUrl == "/worksheet" : item.resUrl == '/worksheet'
? import("@/views/worksheet/index.vue") ? import('@/views/worksheet/index.vue')
: item.resUrl == "/final" : item.resUrl == '/final'
? import("@/views/final/index.vue") ? import('@/views/final/index.vue')
: "", : '',
icon: undefined, icon: undefined,
key: item.resKey, key: item.resKey,
label: item.description, label: item.description,
@ -62,35 +62,36 @@ export default defineComponent({
path: item.resUrl, path: item.resUrl,
name: item.resKey, name: item.resKey,
svgname: item.icon, svgname: item.icon,
svgsize: item.resUrl == "/home" ? 60 : 22, svgsize: item.resUrl == '/home' ? 60 : 22,
title: item.description, title: item.description,
};
return v;
});
} }
updateSelectedKeys(); return v
})
}
updateSelectedKeys()
} }
// //
function clickMenuItem(key: string) { function clickMenuItem(key: string) {
if (/http(s)?:/.test(key)) window.open(key); if (/http(s)?:/.test(key))
else router.push({ name: key }); window.open(key)
else router.push({ name: key })
emit("clickMenuItem" as any, key); emit('clickMenuItem' as any, key)
} }
onMounted(() => { onMounted(() => {
updateMenu(); updateMenu()
}); })
return { return {
menus, menus,
selectedSvg, selectedSvg,
getSelectedSvg, getSelectedSvg,
clickMenuItem, clickMenuItem,
}; }
}, },
}); })
</script> </script>
<template> <template>

@ -1,21 +1,39 @@
<script lang="ts" setup> <script lang="ts" setup>
import { computed, unref } from 'vue' import { computed, onBeforeMount, onMounted, unref } from 'vue'
import { useRoute, useRouter } from 'vue-router'
import { Logo } from './components/Logo' import { Logo } from './components/Logo'
import { MainView } from './components/Main' import { MainView } from './components/Main'
import { AsideMenu } from './components/Menu' import { AsideMenu } from './components/Menu'
import { PageHeader } from './components/Header' import { PageHeader } from './components/Header'
import { useProjectSetting } from '@/hooks/setting/useProjectSetting' import { useProjectSetting } from '@/hooks/setting/useProjectSetting'
import { storage } from '@/utils/Storage'
const { const router = useRouter()
menuSetting, const route = useRoute()
} = useProjectSetting() onMounted(() => {
/**
* 如果刷新则去掉筛选条件
* 1. 如果当前页面路由与上一个页面路由相同时则为刷新
* 2. 防止一直刷新 另外一个判断条件为当前当前路由query不为{}
* 3. 当前页面下执行当前页面的搜索 1条件一定成立
*
* 4. 搜索点击->存storage->跳转页面->onMounted
* ->如果storage为true则不replace 并将storage置false
*/
if (storage.get('isSearch')) {
storage.remove('isSearch')
router.replace(route.path)
return
}
if (history.state.back == route.path && JSON.stringify(route.query).trim() != '{}')
router.replace(route.path)
})
const { menuSetting } = useProjectSetting()
const leftMenuWidth = computed(() => { const leftMenuWidth = computed(() => {
const { minMenuWidth } = unref(menuSetting) const { minMenuWidth } = unref(menuSetting)
return minMenuWidth return minMenuWidth
}) })
</script> </script>
<template> <template>
@ -45,10 +63,13 @@ const leftMenuWidth = computed(() => {
display: flex; display: flex;
flex-direction: row; flex-direction: row;
flex: auto; flex: auto;
background-image: url('../assets/images/bg.png'); background-image: url("../assets/images/bg.png");
background-size: cover; background-size: cover;
// height: 1100px;
// width: 1440px;
height: 100%; height: 100%;
max-height: 1100px;
overflow: hidden;
.layout-sider { .layout-sider {
min-height: 100vh; min-height: 100vh;
border-right: 1px solid #dae4f3; border-right: 1px solid #dae4f3;
@ -73,7 +94,7 @@ const leftMenuWidth = computed(() => {
display: flex; display: flex;
flex: auto; flex: auto;
height: 100%; height: 100%;
padding: 0px 16px 24px 16px; // padding: 0px 16px 24px 16px;
overflow-x: hidden; overflow-x: hidden;
box-sizing: border-box; box-sizing: border-box;
} }

@ -5,6 +5,9 @@ import router, { setupRouter } from './router'
import { setupGlobalProperties, setupMousestrap, setupNaive, setupNaiveDiscreteApi, setupSvgIcon } from '@/plugins' import { setupGlobalProperties, setupMousestrap, setupNaive, setupNaiveDiscreteApi, setupSvgIcon } from '@/plugins'
import { setupStore } from '@/store' import { setupStore } from '@/store'
import 'virtual:svg-icons-register' import 'virtual:svg-icons-register'
import VueLazyload from 'vue-lazyload'
import bgPng from '@/assets/images/bg-loading.png'
import closePng from '@/assets/images/close.png'
async function bootstrap() { async function bootstrap() {
const app = createApp(App) const app = createApp(App)
@ -19,6 +22,12 @@ async function bootstrap() {
const meta = document.createElement('meta') const meta = document.createElement('meta')
meta.name = 'naive-ui-style' meta.name = 'naive-ui-style'
document.head.appendChild(meta) document.head.appendChild(meta)
app.use(VueLazyload, {
preLoad: 1.3,
error: closePng,
loading: bgPng,
attempt: 1
})
app.mount('#app', true) app.mount('#app', true)
} }

@ -31,6 +31,7 @@ const routes: Array<RouteRecordRaw> = [
name: 'final-main', name: 'final-main',
meta: { meta: {
title: '任务终审', title: '任务终审',
keepAlive: true,
}, },
component: () => import('@/views/final/index.vue'), component: () => import('@/views/final/index.vue'),
}, },

@ -0,0 +1,44 @@
import { Layout } from '@/router/constant'
import type { RouteRecordRaw } from 'vue-router'
/**
* @param name , ,
* @param meta
* @param redirect , 访,
* @param meta.disabled
* @param meta.title
* @param meta.icon
* @param meta.keepAlive
* @param meta.sort
*
*/
const routes: Array<RouteRecordRaw> = [
{
path: '/',
name: 'map',
redirect: '/map',
component: Layout,
meta: {
title: '地理位置',
permissions: ['task-main'],
svgname: 'task-approval',
svgsize: 22,
sort: 5,
disabled: true,
hidden: true,
},
children: [
{
path: 'map',
name: 'map-main',
meta: {
title: '地理位置',
},
component: () => import('@/views/map/index.vue'),
},
],
},
]
export default routes

@ -1,5 +1,5 @@
import type { RouteRecordRaw } from 'vue-router'
import { Layout } from '@/router/constant' import { Layout } from '@/router/constant'
import type { RouteRecordRaw } from 'vue-router'
/** /**
* @param name , , * @param name , ,
@ -40,7 +40,7 @@ const routes: Array<RouteRecordRaw> = [
path: 'message-detail', path: 'message-detail',
name: 'message-detail', name: 'message-detail',
meta: { meta: {
title: 'message', title: '消息公告',
}, },
component: () => import('@/views/message/content/Detail.vue'), component: () => import('@/views/message/content/Detail.vue'),
}, },

@ -1,5 +1,5 @@
import { Layout } from '@/router/constant'
import type { RouteRecordRaw } from 'vue-router' import type { RouteRecordRaw } from 'vue-router'
import { Layout } from '@/router/constant'
/** /**
* @param name , , * @param name , ,
@ -19,7 +19,7 @@ const routes: Array<RouteRecordRaw> = [
redirect: '/worksheet', redirect: '/worksheet',
component: Layout, component: Layout,
meta: { meta: {
title: '图审审批管理', title: '图检审批',
permissions: ['worksheet-main'], permissions: ['worksheet-main'],
svgname: 'worksheet', svgname: 'worksheet',
svgsize: 22, svgsize: 22,
@ -30,7 +30,7 @@ const routes: Array<RouteRecordRaw> = [
path: 'worksheet', path: 'worksheet',
name: 'worksheet-main', name: 'worksheet-main',
meta: { meta: {
title: '图审审批管理', title: '图检审批',
}, },
component: () => import('@/views/worksheet/index.vue'), component: () => import('@/views/worksheet/index.vue'),
}, },

@ -1,35 +1,106 @@
import { defineStore } from 'pinia' import { defineStore } from 'pinia'
import { store } from '@/store' import { store } from '@/store'
import { getFilter } from '@/api/home/filter' import { getFilter } from '@/api/home/filter'
import { getConfig } from '@/api/system/user'
import { asideMap } from "@/config/final";
import { cloneDeep, isEqual } from "lodash-es";
import type { AsideConfig } from '/#/api'
export interface ConfigState { export interface ConfigState {
systemConfig: AsideConfig | null
customConfig: string[] | null customConfig: string[] | null
asideValue: any asideValue: any
listKey: number
searchValue: string
isAllowDownload: boolean
timeNum: number
filterConfig: string[] // 过滤筛选条件
} }
export const useFinalStore = defineStore({ export const useFinalStore = defineStore({
id: 'app-final', id: 'app-final',
state: (): ConfigState => ({ state: (): ConfigState => ({
systemConfig: null,
customConfig: null, customConfig: null,
asideValue: null, asideValue: null,
listKey: 0,
searchValue: "",
isAllowDownload: true,
timeNum: 0,
filterConfig: [],
}), }),
getters: { getters: {
getSystemConfig(): AsideConfig | null {
return this.systemConfig
},
getCustomConfig(): string[] | null { getCustomConfig(): string[] | null {
return this.customConfig return this.customConfig
}, },
getAsideValue(): any { getAsideValue(): any {
return this.asideValue return this.asideValue
}, },
getSearchValue(): any {
return this.searchValue
},
getIsAllowDownload(): any {
return this.isAllowDownload
},
getTimeNum(): any {
return this.timeNum
},
getFilterConfig(): any {
return this.filterConfig
},
}, },
actions: { actions: {
setSystemConfig(config: AsideConfig) {
this.systemConfig = config
console.log("systemConfig----------", config);
},
setAsideValue(value) { setAsideValue(value) {
this.asideValue = value this.asideValue = value
}, },
// 获取终审个性化配置 setListKey() {
this.listKey = new Date().getTime()
},
setSearchValue(value) {
this.searchValue = value
},
setIsAllowDownload(value) {
this.isAllowDownload = value
},
setTimeNum(value) {
this.timeNum = value
},
// 设置个性化配置
setCustomConfig(value) {
this.customConfig = value
},
setFilterConfig(value) {
this.filterConfig = value
},
// 获取系统配置信息
async fetchConfig() {
// const response = await getConfig()
// console.log("response.data----------", response.data);
// this.setSystemConfig(response.data)
// return response.data
let list: any = {};
let tempAsideMap = cloneDeep(asideMap);
Object.keys(tempAsideMap).map(key => {
list[key] = "Y";
});
console.log("setSystemConfig---------------", list);
this.setSystemConfig(list);
return list
},
// // 获取终审个性化配置
async fetchCustomConfig() { async fetchCustomConfig() {
const res = await getFilter(1) const res = await getFilter(1)
const { data } = res const { data } = res
const list = data && data.searchcount ? data.searchcount.split(',') : [] const list = data && data.searchcount ? data.searchcount.split(',') : [];
console.log("listkey---------------", list);
this.customConfig = list this.customConfig = list
return list return list
}, },

@ -1,8 +1,10 @@
import { defineStore } from 'pinia'
import type { TaskState } from '/#/task'
import { getApprovalList } from '@/api/task/task' import { getApprovalList } from '@/api/task/task'
import { store } from '@/store' import { store } from '@/store'
import { defineStore } from 'pinia'
import type { TaskState } from '/#/task'
import { createDiscreteApi } from 'naive-ui'
const {message} = createDiscreteApi(['message'])
export const useTaskStore = defineStore({ export const useTaskStore = defineStore({
id: 'task-store', id: 'task-store',
state: (): TaskState => ({ state: (): TaskState => ({
@ -12,6 +14,7 @@ export const useTaskStore = defineStore({
packageid: '', packageid: '',
immersion: false, immersion: false,
inFile: false, // 是否进入文件夹 inFile: false, // 是否进入文件夹
inFileId:"",
}), }),
getters: { getters: {
getActiveId: (state: TaskState) => state.activeId, getActiveId: (state: TaskState) => state.activeId,
@ -19,6 +22,7 @@ export const useTaskStore = defineStore({
getCurrentIndex: (state: TaskState) => state.currentIndex, getCurrentIndex: (state: TaskState) => state.currentIndex,
getApprovalList: (state: TaskState) => state.approvalList, getApprovalList: (state: TaskState) => state.approvalList,
getInFile: (state: TaskState) => state.inFile, getInFile: (state: TaskState) => state.inFile,
getInFileId: (state: TaskState) => state.inFileId,
}, },
actions: { actions: {
setApprovalList(list: any[]) { setApprovalList(list: any[]) {
@ -27,6 +31,9 @@ export const useTaskStore = defineStore({
setInFile(flag: any) { setInFile(flag: any) {
this.inFile = flag this.inFile = flag
}, },
setInFileId(id: any) {
this.inFileId = id
},
setActive(index: number, taskId?: string) { setActive(index: number, taskId?: string) {
this.currentIndex = index this.currentIndex = index
const task = this.approvalList[index] const task = this.approvalList[index]
@ -37,13 +44,13 @@ export const useTaskStore = defineStore({
const len = this.approvalList.length const len = this.approvalList.length
if (this.currentIndex === len - 1) if (this.currentIndex === len - 1)
return return message.error('已经到达最后一个')
this.setActive(++this.currentIndex) this.setActive(++this.currentIndex)
}, },
back() { back() {
if (this.currentIndex === 0) if (this.currentIndex === 0)
return return message.error('已经到达第一个')
this.setActive(--this.currentIndex) this.setActive(--this.currentIndex)
}, },

@ -15,7 +15,7 @@ const TOKEN_REFRESH_SECONDS = 20 * 60
export interface UserInfoType { export interface UserInfoType {
token: string token: string
tenantList: any[] deptlist: any[]
userInfo: any userInfo: any
} }
@ -122,12 +122,11 @@ export const useUserStore = defineStore({
if (code === ResultEnum.SUCCESS) { if (code === ResultEnum.SUCCESS) {
const ex = 7 * 24 * 60 * 60 const ex = 7 * 24 * 60 * 60
// 默认设置为第一个租户 // 默认设置为第一个租户
const firstTenant = data.tenantList.length > 0 ? data.tenantList[0] : null const firstTenant = data.deptlist.length > 0 ? data.deptlist[0] : null
const tenantId = firstTenant ? firstTenant.id : '' const tenantId = firstTenant ? firstTenant.deptno : ''
data.frontmenuTList.forEach(ele=>{ data.frontmenuTList.forEach((ele) => {
if(ele.description === 'AI工单'){ if (ele.description === 'AI工单')
ele.description = '图审审批管理' ele.description = '图检审批'
}
}) })
storage.set(CURRENT_USER, data, ex) storage.set(CURRENT_USER, data, ex)
storage.set(TENANT_ID, tenantId) storage.set(TENANT_ID, tenantId)
@ -176,7 +175,7 @@ export const useUserStore = defineStore({
// 登出 // 登出
async logout() { async logout() {
this.setPermissions([]) this.setPermissions([])
this.setUserInfo({ tenantList: [], userInfo: {}, token: '' }) this.setUserInfo({ deptlist: [], userInfo: {}, token: '' })
this.setTenantId('') this.setTenantId('')
storage.remove(USER_ACCESS_TOKEN) storage.remove(USER_ACCESS_TOKEN)
storage.remove(CURRENT_USER) storage.remove(CURRENT_USER)

@ -1,9 +1,10 @@
import { getPackageList } from '@/api/work/work' import { getPackageList } from '@/api/work/work'
import { store } from '@/store' import { store } from '@/store'
import { useMessage } from 'naive-ui'
import { defineStore } from 'pinia' import { defineStore } from 'pinia'
import { createDiscreteApi } from 'naive-ui'
import type { OrderState, PackageListItem } from '/#/workorder' import type { OrderState, PackageListItem } from '/#/workorder'
const { message } = createDiscreteApi(['message'])
export const useWorkOrderStore = defineStore({ export const useWorkOrderStore = defineStore({
id: 'work-order', id: 'work-order',
state: (): OrderState => ({ state: (): OrderState => ({
@ -32,18 +33,14 @@ export const useWorkOrderStore = defineStore({
}, },
forward() { forward() {
const len = this.packageList.length const len = this.packageList.length
const message = useMessage()
if (this.currentIndex === len - 1) if (this.currentIndex === len - 1)
message.error('已经到达最后一个') return message.error('已经到达最后一个')
this.setActive(++this.currentIndex) this.setActive(++this.currentIndex)
}, },
back() { back() {
const message = useMessage()
if (this.currentIndex === 0) if (this.currentIndex === 0)
message.error('已经到达第一个') return message.error('已经到达第一个')
this.setActive(--this.currentIndex) this.setActive(--this.currentIndex)
}, },

@ -9,7 +9,9 @@ export function hideDownload(e: MouseEvent) {
const downloadEle: any = document.querySelector('.n-image-preview-toolbar')?.children[5] const downloadEle: any = document.querySelector('.n-image-preview-toolbar')?.children[5]
const asideValue = unref(configStore.getAsideValue) const asideValue = unref(configStore.getAsideValue)
const download = asideValue?.izimgdownload const download = asideValue?.izimgdownload
if (downloadEle && downloadEle.innerHTML === downloadSvg && download === false) // TODO 判断条件调整
// if (downloadEle && downloadEle.innerHTML === downloadSvg && download === false)
if (downloadEle && !download)
downloadEle.style.display = 'none' downloadEle.style.display = 'none'
else else
downloadEle.style.display = 'block' downloadEle.style.display = 'block'

@ -10,162 +10,334 @@ import {
shallowRef, shallowRef,
unref, unref,
watch, watch,
} from "vue"; } from 'vue'
import { CustomFilterModalVue, FilterModal, NewFilterModal } from "@/views/final/comp"; import { cloneDeep, isEqual } from 'lodash-es'
import Search from "@/views/home/aside/comp/Search.vue"; import { CustomFilterModalVue, FilterModal, NewFilterModal } from '@/views/final/comp'
import AdvanceFilter from "@/views/home/aside/comp/AdvanceFilter.vue"; import Search from '@/views/home/aside/comp/Search.vue'
import { getViewportOffset } from "@/utils/domUtils"; import AdvanceFilter from '@/views/home/aside/comp/AdvanceFilter.vue'
import { useWindowSizeFn } from "@/hooks/event/useWindowSizeFn"; import { getViewportOffset } from '@/utils/domUtils'
import { useFinal } from "@/store/modules/final"; import { useWindowSizeFn } from '@/hooks/event/useWindowSizeFn'
import type { Filter } from "/#/home"; import { useFinal } from '@/store/modules/final'
import type { AsideEntity } from "@/config/aside"; import type { Filter } from '/#/home'
import { asideMap } from "@/config/final"; import type { AsideEntity } from '@/config/aside'
import type { AsideConfig } from "/#/api"; import { asideMap } from '@/config/final'
import emitter from "@/utils/mitt"; import type { AsideConfig } from '/#/api'
import emitter from '@/utils/mitt'
const emit = defineEmits(["inputChange"]); import { getFilterList } from '@/api/home/main'
const finalStore = useFinal(); import { useKeydown } from '@/hooks/event/useKeydown'
const emit = defineEmits(['inputChange',])
const finalStore = useFinal()
// //
const asideValue: Record<keyof typeof asideMap, any> = reactive({}); const asideValue: Record<keyof typeof asideMap, any> = reactive({})
// : // :
const asideVisible: Partial<Record<keyof AsideConfig, boolean>> = reactive({}); const asideVisible: Partial<Record<keyof AsideConfig, boolean>> = reactive({})
// //
const showItems = shallowRef<{ key: string; config: AsideEntity }[]>([]); const showItems = shallowRef<{ key: string, config: AsideEntity }[]>([])
const initAsideValueRef = ref<any>(null) // ()
const customObjRef = ref<any>(null) //
const customTempObjRef = ref<any>(null) // ()
const configFilterRef = ref<any>([]) //
initAsideValueRef.value = cloneDeep(asideMap)
onBeforeMount(async () => {
finalStore.fetchConfig()
finalStore.fetchCustomConfig()
})
Object.keys(asideMap).forEach((key) => { Object.keys(asideMap).forEach((key) => {
const { defaultValue, inFilterList } = asideMap[key]; const { defaultValue, inFilterList } = asideMap[key]
if (inFilterList !== false) asideValue[key] = defaultValue; if (inFilterList !== false)
}); asideValue[key] = defaultValue
})
const filterModalRef = ref(null); const filterModalRef: any = ref(null)
const newFilterModalRef = ref(null); const newFilterModalRef = ref(null)
const customModalRef = ref(null); const customModalRef = ref(null)
const AdvanceFilterRef: any = ref(null)
function showModal(modalRef: any) { function showModal(modalRef: any) {
const modal = unref(modalRef)! as any; const modal = unref(modalRef)! as any
modal.showModal(); modal.showModal()
}
function newFilterOk() {
filterModalRef.value.query(
filterModalRef.value.pagination.page,
filterModalRef.value.pagination.pageSize,
)
filterModalRef.value.showModal()
} }
const mousetrap = inject("mousetrap") as any;
mousetrap.bind("[", collapseHandler); const mousetrap = inject('mousetrap') as any
mousetrap.bind('[', collapseHandler)
onMounted(() => { onMounted(() => {
nextTick(() => { nextTick(() => {
computeSlideHeight(); computeSlideHeight()
}); })
}); })
const collapse = ref(false); const collapse = ref(false)
function collapseHandler() { function collapseHandler() {
collapse.value = !collapse.value; collapse.value = !collapse.value
} }
const asideWidth = computed(() => { const asideWidth = computed(() => {
return collapse.value ? 0 : 308; return collapse.value ? 0 : 308
}); })
const asideHeight = ref(500); const asideHeight = ref(500)
const asideStyle = computed(() => { const asideStyle = computed(() => {
return { return {
width: `${asideWidth.value}px`, width: `${asideWidth.value}px`,
height: `${asideHeight.value}px`, height: `${asideHeight.value}px`,
}; }
}); })
const collapseIcon = computed(() => { const collapseIcon = computed(() => {
return collapse.value ? "expand-cir" : "collapse-cir"; return collapse.value ? 'expand-cir' : 'collapse-cir'
}); })
function computeSlideHeight() { function computeSlideHeight() {
const headEl = document.querySelector(".aside-header")!; const headEl = document.querySelector('.aside-header')!
const { bottomIncludeBody } = getViewportOffset(headEl); const { bottomIncludeBody } = getViewportOffset(headEl)
const height = bottomIncludeBody; const height = bottomIncludeBody
asideHeight.value = height - 24; asideHeight.value = height - 24
} }
useWindowSizeFn(computeSlideHeight, 280); useWindowSizeFn(computeSlideHeight, 280)
onBeforeMount(async () => { onBeforeMount(async () => {
finalStore.fetchCustomConfig(); finalStore.fetchCustomConfig()
}); })
finalStore.$subscribe(() => { nextTick(() => {
const customConfig = finalStore.getCustomConfig; finalStore.$subscribe(() => {
// const customConfig = finalStore.getCustomConfig;
if (customConfig === null) return; // console.log("customConfigaside---------------", customConfig);
// if (customConfig === null) return;
const showKeys: string[] = [...customConfig];
const defaultKeys = Object.keys(asideMap).filter( // const showKeys: string[] = [...customConfig];
(key) => asideMap[key].isDefaultFilter // // const defaultKeys = Object.keys(asideMap).filter(
); // // (key) => asideMap[key].isDefaultFilter
showKeys.unshift(...defaultKeys); // // );
// // showKeys.unshift(...defaultKeys);
Object.keys(asideMap).forEach((key) => {
// // Object.keys(asideMap).forEach((key) => {
if (key.startsWith("iz")) // //
asideVisible[key] = // if (key.startsWith("iz"))
asideMap[key] && (showKeys.includes(key) || asideMap[key].isDefaultFilter); // asideVisible[key] =
}); // asideMap[key] && (showKeys.includes(key) || asideMap[key].isDefaultFilter);
// });
// const items = showKeys.reduce((acc, key) => {
// if (asideMap[key]) {
// const config = {
// key,
// config: asideMap[key],
// };
// return [...acc, config];
// } else {
// return acc;
// }
// }, []);
// console.log("showItems111111111---------------", items);
// showItems.value = items;
const config = finalStore.getSystemConfig
const customConfig = finalStore.getCustomConfig
if (
configFilterRef.value.length > 0
&& isEqual(configFilterRef.value, finalStore.getFilterConfig)
&& customObjRef.value
&& isEqual(customObjRef.value, customTempObjRef.value)
)
return
if (config == null || customConfig == null)
return
// console.log("config", config, "customConfig", customConfig);
/* rao
const showKeys = [...customConfig].filter(key => !asideMap[key].isDefaultFilter)// customConfig isDefaultFilter
const defaultKeys = Object.keys(asideMap).filter(key => asideMap[key].isDefaultFilter)// asideMap isDefaultFilter
showKeys.unshift(...defaultKeys)
*/
const sortKeyList: any = []
finalStore.getFilterConfig.forEach((item: any) => {
sortKeyList.push(item?.id)
})
const showKeys = [...sortKeyList]
Object.keys(config).forEach((key) => {
if (key.startsWith('iz') && asideMap[key] !== undefined) {
asideVisible[key]
= (showKeys.includes(key) || asideMap[key].isDefaultFilter)
&& config[key] === 'Y'
}
})
if (customObjRef.value) {
//
Object.keys(customObjRef.value).forEach((key) => {
// if (asideMap.hasOwnProperty(key)) {
if (Object.prototype.hasOwnProperty.call(asideMap, key)) {
const str = key.toLowerCase()
// console.log("customObjRef.value[str]1111111111111", customObjRef.value[str]);
if (str == 'izsimilarity') {
if (typeof customObjRef.value[str] == 'string')
customObjRef.value[str] = customObjRef.value[str].split(',')
asideValue[key] = customObjRef.value[str] //
console.log('相似度2222222222', asideValue[key])
}
else if (str == 'izyear') {
if (typeof customObjRef.value[str] == 'string') {
const time = customObjRef.value[str].split('-')
time[0] = new Date(time[0]).getTime()
time[1] = new Date(time[1]).getTime()
customObjRef.value[str] = time
}
asideValue[key] = customObjRef.value[str] //
console.log('时间2222222222', asideValue[key])
}
else if (customObjRef.value[str]) {
console.log('customObjRef.value[str]222222', customObjRef.value[str])
// let list = customObjRef.value[str].split(',');
// console.log("list222222", list);
if (typeof customObjRef.value[str] == 'string') {
customObjRef.value[str] = customObjRef.value[str].split(',')
asideValue[key] = customObjRef.value[str] //
}
else {
asideValue[key] = customObjRef.value[str] //
}
}
else {
asideValue[key] = null
}
// asideMap[str].defaultValue = customObjRef.value[str];//
}
})
customTempObjRef.value = customObjRef.value
console.log('asideValue直接处理后的结果', asideValue)
console.log('customTempObjRef.value', customTempObjRef.value)
const tempobj = cloneDeep(asideValue)
console.log('tempObj', tempobj)
finalStore.setAsideValue(tempobj)
}
// console.log("showKeys", showKeys);
const items = showKeys.reduce((acc, key) => { const items = showKeys.reduce((acc, key) => {
if (asideMap[key]) { const currentData = asideMap[key]
const config = { const render = currentData?.render
key, if (render !== false) {
config: asideMap[key], const str = key?.toLowerCase()
};
return [...acc, config]; const o = {
} else { key: str,
return acc; config: asideMap[str],
} }
}, []); return [...acc, o]
}
showItems.value = items; else {
}); return acc
}
}, [])
console.log('showItems=================================', items)
showItems.value = items
configFilterRef.value = finalStore.getFilterConfig
})
})
watch(asideVisible, (newVal) => { watch(asideVisible, (newVal) => {
Object.keys(asideValue).forEach((key) => { Object.keys(asideValue).forEach((key) => {
if (newVal[key] === false) asideValue[key] = asideMap[key].defaultValue; if (newVal[key] === false)
}); asideValue[key] = asideMap[key].defaultValue
}); })
})
const asideEnter = ref(false); const asideEnter = ref(false)
const showCollapse = computed(() => { const showCollapse = computed(() => {
return collapse.value ? true : asideEnter.value; return collapse.value ? true : asideEnter.value
}); })
const showSearch = ref(false); const showSearch = ref(false)
function setShowSearch(value: boolean) { function setShowSearch(value: boolean) {
showSearch.value = value; showSearch.value = value
if(!value){ if (!value)
inputChange('') inputChange('')
}
} }
// key // key
function scrollHandler(key: string) { function scrollHandler(key: string) {
const element = document.querySelector(`#${key}`); const element = document.querySelector(`#${key}`)
element?.scrollIntoView(true); element?.scrollIntoView(true)
} }
function filterHandler(searchId: string) { async function filterHandler(searchId: string) {
emitter.emit("filter-final", searchId); // emitter.emit("filter-final", searchId);
const res = await getFilterList({ userSearchId: searchId })
// console.log("", res);
if (res.code == 'OK') {
const obj = res.data
customObjRef.value = res.data
const showKeys: any[] = []
Object.keys(obj).forEach((key) => {
// if (asideMap.hasOwnProperty(key)) {
if (Object.prototype.hasOwnProperty.call(asideMap, key))
showKeys.push(key)
})
console.log('showKeys1111111111111111', showKeys)
finalStore.setCustomConfig(showKeys)
}
} }
function editFilter(filter: any) { function editFilter(filter: any) {
const modal = unref(newFilterModalRef)! as any; const modal = unref(newFilterModalRef)! as any
modal.showModal(); modal.showModal()
modal.edit(filter); modal.edit(filter)
} }
watch(asideValue, (newVal) => { // watch(asideValue, (newVal) => {
finalStore.setAsideValue(newVal); // finalStore.setAsideValue(newVal);
}); // });
const inputChange = (keyword) => { function inputChange(keyword) {
emit("inputChange", keyword); emit('inputChange', keyword)
}; }
function handleOk(item: any) {
console.log('handleOk', item)
// .setCurrentlySelectedAdvanced(item.searchname)
if (item) {
AdvanceFilterRef.value.setCurrentlySelectedAdvanced(item.searchname)
filterHandler(item.id)
}
else {
AdvanceFilterRef.value.setCurrentlySelectedAdvanced('高级筛选')
filterHandler('')
}
}
function updateComponent(key, e) {
console.log('跟新值', key, e)
console.log('tempAsideValue跟新值', finalStore.getAsideValue, asideValue)
// let tempAsideValue = finalStore.getAsideValue || asideValue;
const tempobj = cloneDeep(asideValue)
console.log(tempobj, 'tempobj')
tempobj[key] = e
console.log(tempobj, 'tempobj After')
customObjRef.value = tempobj
// asideValue = Object.assign({}, asideValue, tempobj);
console.log('asideValue跟新值', tempobj)
finalStore.setAsideValue(tempobj)
}
defineExpose({
showSearch,
});
useKeydown('s', () => setShowSearch(true))
</script> </script>
<template> <template>
@ -187,11 +359,13 @@ const inputChange = (keyword) => {
v-show="showSearch" v-show="showSearch"
@select="scrollHandler" @select="scrollHandler"
@close="setShowSearch(false)" @close="setShowSearch(false)"
@inputChange="inputChange" @input-change="inputChange"
@show-search="setShowSearch(true)"
/> />
<!-- 高级筛选 --> <!-- 高级筛选 -->
<AdvanceFilter <AdvanceFilter
v-show="!showSearch" v-show="!showSearch"
ref="AdvanceFilterRef"
:type="1" :type="1"
@select="filterHandler" @select="filterHandler"
@update:search="setShowSearch(true)" @update:search="setShowSearch(true)"
@ -207,6 +381,7 @@ const inputChange = (keyword) => {
:key="index" :key="index"
v-model:value="asideValue[item.key]" v-model:value="asideValue[item.key]"
:label="item.config.label" :label="item.config.label"
@update:value="(e) => updateComponent(item.key, e)"
/> />
<!-- 筛选 --> <!-- 筛选 -->
@ -216,9 +391,10 @@ const inputChange = (keyword) => {
ref="filterModalRef" ref="filterModalRef"
@edit-filter="editFilter" @edit-filter="editFilter"
@show-new-filter="showModal(newFilterModalRef)" @show-new-filter="showModal(newFilterModalRef)"
@handle-ok="handleOk"
/> />
<!-- 新增过滤 --> <!-- 新增过滤 -->
<NewFilterModal ref="newFilterModalRef" /> <NewFilterModal ref="newFilterModalRef" @on-ok="newFilterOk" />
</n-scrollbar> </n-scrollbar>
</div> </div>
</template> </template>
@ -232,12 +408,13 @@ const inputChange = (keyword) => {
border: 1px solid #efeff5; border: 1px solid #efeff5;
border-radius: 3px; border-radius: 3px;
box-sizing: border-box; box-sizing: border-box;
height: 100% !important;
&-header { &-header {
padding: 10px; padding: 10px;
width: 100%; width: 100%;
border-bottom: 1px solid #e8e8e8; border-bottom: 1px solid #e8e8e8;
margin-bottom: 15px; margin-bottom: 15px;
height: 58px;
} }
&-divider { &-divider {

@ -1,24 +1,17 @@
<script lang="ts" setup> <script lang="ts" setup>
import { debounce, difference } from 'lodash-es' import { cloneDeep, debounce, difference, isEqual } from 'lodash-es'
import { computed, ref, watch } from 'vue' import { computed, onMounted, ref, watch } from 'vue'
import { VueDraggable } from 'vue-draggable-plus' import { VueDraggable } from 'vue-draggable-plus'
import { setFilter } from '@/api/home/filter' import { setFilter } from '@/api/home/filter'
import { asideMap } from '@/config/final' import { asideMap } from '@/config/final'
import { useFinal } from '@/store/modules/final' import { useFinal } from '@/store/modules/final'
const show = ref(false) const show = ref(false)
const finalStore = useFinal()
const checkAll = ref(false) const checkAll = ref(false)
const selectIds = ref<string[]>([]) const selectIds = ref<string[]>([])
const finalStore = useFinal() const tempList = ref<string[]>([])
const extraCustomConfig: any = []
function showModal() {
show.value = true
}
function closeModal() {
show.value = false
}
// //
const offList = ref<any[]>([]) const offList = ref<any[]>([])
// //
@ -31,21 +24,69 @@ const allCount = computed(() => {
const selectCount = computed(() => { const selectCount = computed(() => {
return `已选筛选(共${onList.value.length}个)` return `已选筛选(共${onList.value.length}个)`
}) })
const offKeyword = ref('')
const onKeyword = ref('')
Object.keys(asideMap).forEach((key) => {
const { isDefaultFilter } = asideMap[key]
if (isDefaultFilter)
extraCustomConfig.push(key)
})
function showModal(type: boolean = true) {
show.value = type
//
const config = finalStore.getSystemConfig
const customConfig = finalStore.getCustomConfig
if (config == null || customConfig == null)
return
//
if (!type) {
const { showList, hideList } = generatList(config, customConfig)
onList.value = showList
offList.value = hideList
//
checkAll.value = hideList.every(item => item.checked)
//
offKeyword.value = ''
onKeyword.value = ''
return
}
if (tempList.value.length > 0 && isEqual(tempList.value, finalStore.getFilterConfig))
return
const { showList, hideList } = generatList(config, customConfig)
tempList.value = cloneDeep(showList)
if (tempList.value.length > 0)
finalStore.setFilterConfig(tempList.value)
onList.value = showList
offList.value = hideList
//
checkAll.value = hideList.every(item => item.checked)
//
offKeyword.value = ''
onKeyword.value = ''
}
function closeModal() {
offKeyword.value = ''
onKeyword.value = ''
show.value = false
}
defineExpose({ defineExpose({
showModal, showModal,
}) })
function generateDefaultList() { function generateDefaultList(config) {
return Object.keys(asideMap).reduce((acc, key) => { return Object.keys(asideMap).reduce((acc, key) => {
const { label, isDefaultFilter } = asideMap[key] const { label, isDefaultFilter } = asideMap[key]
// //
if (isDefaultFilter) { if (isDefaultFilter && config[key] === 'Y') {
const config = { const config = {
id: key, id: key,
name: label || '未配置', name: label || '未配置',
fix: isDefaultFilter, fix: true,
checked: true, checked: true,
} }
return [...acc, config] return [...acc, config]
@ -56,20 +97,43 @@ function generateDefaultList() {
}, []) }, [])
} }
function generatList(customConfig) { function generatList(config, customConfig) {
const keys = Object.keys(asideMap) const keys = Object.keys(config)
let onList: object[] = [] let onList: object[] = []
const offList: object[] = [] const offList: any = []
const showKeys = customConfig.map((key: string) => key.toLowerCase()) const showKeys = []
const tempShowKeys = [...customConfig, ...extraCustomConfig]
for (const key of keys) { tempShowKeys.forEach((item) => {
if (!key.startsWith('iz') || asideMap[key] === undefined) if (!showKeys.includes(item))
continue showKeys.push(item)
})
// for (const key of keys) {
// if (!key.startsWith('iz') || config[key] === 'N' || asideMap[key] === undefined)
// continue
// const name = asideMap[key]?.label
// const isDefaultFilter = asideMap[key]?.isDefaultFilter
// // Y
// if (!isDefaultFilter) {
// const isChecked = asideMap[key].isDefaultFilter || showKeys.includes(key)
// offList.push({
// id: key,
// name: name || '',
// fix: isDefaultFilter,
// checked: isChecked,
// })
// if (isChecked && !selectIds.value.includes(key))
// isChecked && selectIds.value.push(key)
// }
// }
Object.keys(asideMap).forEach((key) => {
const name = asideMap[key]?.label const name = asideMap[key]?.label
const isDefaultFilter = asideMap[key]?.isDefaultFilter const isDefaultFilter = asideMap[key]?.isDefaultFilter
// // Y
// if (!isDefaultFilter) {
const isChecked = asideMap[key].isDefaultFilter || showKeys.includes(key) const isChecked = asideMap[key].isDefaultFilter || showKeys.includes(key)
offList.push({ offList.push({
@ -78,15 +142,17 @@ function generatList(customConfig) {
fix: isDefaultFilter, fix: isDefaultFilter,
checked: isChecked, checked: isChecked,
}) })
if (isChecked && !selectIds.value.includes(key))
isChecked && selectIds.value.push(key) isChecked && selectIds.value.push(key)
} // }
})
onList = showKeys.reduce((acc, key) => { onList = showKeys.reduce((acc, key) => {
const isDefaultFilter = asideMap[key]?.isDefaultFilter const isDefaultFilter = asideMap[key]?.isDefaultFilter
// () // && ()
if (isDefaultFilter === false) { if (config[key] === 'Y' && isDefaultFilter === false) {
// if (config[key] === 'Y') {
const config = { const config = {
id: key, id: key,
name: asideMap[key].label || '未配置', name: asideMap[key].label || '未配置',
@ -98,40 +164,88 @@ function generatList(customConfig) {
return acc return acc
} }
}, []) }, [])
const fixedList = generateDefaultList(config)
const fixedList = generateDefaultList() // offList.unshift(...fixedList)
onList.unshift(...fixedList) onList.unshift(...fixedList)
return { showList: onList, hideList: offList } // onListcustomConfig
const tempOnList = cloneDeep(onList)
const sortKeyList: any = []
finalStore.getFilterConfig.forEach((item: any) => {
sortKeyList.push(item.id)
})
const sortList: any = []
if (sortKeyList.length > 0) {
sortKeyList.forEach((key) => {
const tempItem = tempOnList.find(item => item.id == key)
if (tempItem)
sortList.push(tempItem)
})
}
else {
showKeys.forEach((key) => {
const tempItem = tempOnList.find(item => item.id == key)
if (tempItem)
sortList.push(tempItem)
})
}
// return { showList: onList, hideList: offList }
return { showList: sortList, hideList: offList }
} }
finalStore.$subscribe(() => { finalStore.$subscribe(() => {
const config = finalStore.getSystemConfig
const customConfig = finalStore.getCustomConfig const customConfig = finalStore.getCustomConfig
if (customConfig === null) if (config == null || customConfig == null)
return
if (tempList.value.length > 0 && isEqual(tempList.value, finalStore.getFilterConfig))
return return
const { showList, hideList } = generatList(customConfig) const { showList, hideList } = generatList(config, customConfig)
tempList.value = cloneDeep(showList)
if (tempList.value.length > 0)
finalStore.setFilterConfig(tempList.value)
onList.value = showList onList.value = showList
offList.value = hideList offList.value = hideList
}) })
async function handleSumbit(e: MouseEvent) { async function handleSumbit(e: MouseEvent) {
e.preventDefault() e.preventDefault()
const param = onList.value const param = onList.value
.filter(item => !asideMap[item.id].isDefaultFilter)
.map((item) => { .map((item) => {
return item.id return item.id
}) })
.join(',') .join(',')
await setFilter({ searchcount: param, type: 1 }) await setFilter({ searchcount: param, type: 1 })
finalStore.fetchCustomConfig() const obj = await finalStore.fetchCustomConfig()
const tempOnList = cloneDeep(onList.value)
const sortList: any = []
obj.forEach((key) => {
const tempItem = tempOnList.find(item => item.id == key)
if (tempItem)
sortList.push(tempItem)
})
if (sortList.length > 0)
finalStore.setFilterConfig(sortList)
closeModal() closeModal()
} }
function onCheckAllChange(value) { function onCheckAllChange(value) {
const ids: string[] = [] const ids: string[] = []
if (value) {
offList.value.forEach((v) => {
if (!v.checked)
onList.value.push(v)
})
}
else {
onList.value = offList.value.filter(v => v.fix)
offList.value.map(v => ({
...v,
checked: v.fix,
}))
}
for (const item of offList.value) { for (const item of offList.value) {
if (!item.fix) { if (!item.fix) {
@ -139,7 +253,6 @@ function onCheckAllChange(value) {
ids.push(item.id) ids.push(item.id)
} }
} }
selectIds.value = value ? ids : [] selectIds.value = value ? ids : []
} }
@ -147,16 +260,17 @@ function onCheckChange(checked: any, item: any) {
const index = selectIds.value.indexOf(item.id) const index = selectIds.value.indexOf(item.id)
item.checked = checked item.checked = checked
const currentIndex = offList.value.findIndex(v => v.id == item.id)
offList.value[currentIndex].checked = item.checked
if (index === -1 && checked) if (index === -1 && checked)
selectIds.value.push(item.id) selectIds.value.push(item.id)
else selectIds.value.splice(index, 1) else index !== -1 && selectIds.value.splice(index, 1)
checkAll.value = offList.value.every(item => item.checked)
} }
const showIds = computed(() => { const showIds = computed(() => {
return onList.value.map((item) => { return onList.value.map((item) => {
return item.id return item?.id
}) })
}) })
@ -178,6 +292,7 @@ watch(
if (action === 'add') { if (action === 'add') {
for (const item of offList.value) { for (const item of offList.value) {
if (!item.fix && diff.includes(item.id)) { if (!item.fix && diff.includes(item.id)) {
if (item.checked) {
onList.value.push({ onList.value.push({
id: item.id, id: item.id,
name: item.name || '未配置', name: item.name || '未配置',
@ -186,6 +301,7 @@ watch(
} }
} }
} }
}
else { else {
const list = onList.value const list = onList.value
for (let index = 0; index < list.length; index++) { for (let index = 0; index < list.length; index++) {
@ -235,9 +351,6 @@ function removeHandler(id: string) {
onList.value.splice(index, 1) onList.value.splice(index, 1)
} }
const offKeyword = ref('')
const onKeyword = ref('')
const leftInputHandler = debounce((keyword) => { const leftInputHandler = debounce((keyword) => {
offKeyword.value = keyword offKeyword.value = keyword
}, 300) }, 300)
@ -245,6 +358,23 @@ const leftInputHandler = debounce((keyword) => {
const rightInputHandler = debounce((keyword) => { const rightInputHandler = debounce((keyword) => {
onKeyword.value = keyword onKeyword.value = keyword
}, 300) }, 300)
// async function getfield() {
// let res
// res = await getAllfieldList(3)
// const userStore = useUser()
// const userInfo = userStore.getUserInfo
// res = await getfieldList(3, userInfo.id)
// }
function onMove(e) {
// e
if (e?.related?.className?.indexOf('fix') !== -1)
return false
}
onMounted(() => {
// getfield()
})
</script> </script>
<template> <template>
@ -257,10 +387,10 @@ const rightInputHandler = debounce((keyword) => {
aria-modal="true" aria-modal="true"
> >
<div class="wrapper"> <div class="wrapper">
<span class="wrapper-title" style="color: #333333;">自定义筛选</span> <span class="wrapper-title">自定义筛选</span>
<div class="wrapper-bar"> <div class="wrapper-bar">
<div class="wrapper-info" style="background-color: #F8F8F8;"> <div class="wrapper-info">
<span :style="{ 'margin-left': '18px' ,'color':'#333333'}">筛选项信息</span> <span :style="{ 'margin-left': '18px' }">筛选项信息</span>
</div> </div>
</div> </div>
@ -273,20 +403,21 @@ const rightInputHandler = debounce((keyword) => {
size="small" size="small"
:bordered="false" :bordered="false"
> >
<div> <div class="input_wrap">
<n-input placeholder="搜索关键词" @input="leftInputHandler"> <n-input placeholder="搜索关键词" @input="leftInputHandler">
<template #suffix> <template #suffix>
<SvgIcon size="14px" name="magnifying-1" color="#999999" /> <SvgIcon size="14px" name="magnifying-1-color999" />
</template> </template>
</n-input> </n-input>
<n-scrollbar <n-scrollbar
style="max-height: 500px; border: 1px solid #cad2dd; border-radius: 2px" style="max-height: 500px; border: 1px solid #cad2dd; border-radius: 2px"
> >
<div class="draggable-ul"> <div class="draggable-ul">
<div class="draggable-li" style="color:#666666"> <div class="draggable-li">
<n-checkbox <n-checkbox
v-model:checked="checkAll" v-model:checked="checkAll"
label="全选" label="全选"
:indeterminate="!checkAll"
@update:checked="onCheckAllChange" @update:checked="onCheckAllChange"
/> />
</div> </div>
@ -323,11 +454,10 @@ const rightInputHandler = debounce((keyword) => {
<template #header-extra> <template #header-extra>
<span class="textbtnStyle" @click="clearDragSource"></span> <span class="textbtnStyle" @click="clearDragSource"></span>
</template> </template>
<div> <div class="input_wrap">
<!-- j -->
<n-input placeholder="搜索关键词" @input="rightInputHandler"> <n-input placeholder="搜索关键词" @input="rightInputHandler">
<template #suffix> <template #suffix>
<SvgIcon size="14px" name="magnifying-1" color="#999999" /> <SvgIcon size="14px" name="magnifying-1-color999" />
</template> </template>
</n-input> </n-input>
<n-scrollbar <n-scrollbar
@ -337,7 +467,6 @@ const rightInputHandler = debounce((keyword) => {
<VueDraggable <VueDraggable
v-model="onList" v-model="onList"
class="draggable-ul" class="draggable-ul"
filter=".draggable-li[draggable='false']"
:animation="150" :animation="150"
group="shared" group="shared"
> >
@ -345,12 +474,10 @@ const rightInputHandler = debounce((keyword) => {
v-for="item in onList" v-for="item in onList"
v-show="item.name.includes(onKeyword)" v-show="item.name.includes(onKeyword)"
:key="item.id" :key="item.id"
:draggable="!item.fix" :draggable="true"
:class="{ fix: item.fix }"
class="cursor-move draggable-li" class="cursor-move draggable-li"
> >
<!-- v-show="!item.fix" 判断是否为固定值 --> <SvgIcon name="drag" size="24" />
<SvgIcon name="drag" size="14" />
<span class="ml-2">{{ item.name }}</span> <span class="ml-2">{{ item.name }}</span>
<SvgIcon <SvgIcon
v-if="!item.fix" v-if="!item.fix"
@ -372,7 +499,11 @@ const rightInputHandler = debounce((keyword) => {
<n-button type="info" @click="handleSumbit"> <n-button type="info" @click="handleSumbit">
确定 确定
</n-button> </n-button>
<n-button secondary style="margin-left: 15px" @click="closeModal"> <n-button
secondary
style="margin-left: 15px; border: 1px solid #cad2dd"
@click="showModal(false)"
>
取消 取消
</n-button> </n-button>
</div> </div>
@ -389,18 +520,25 @@ const rightInputHandler = debounce((keyword) => {
&-title { &-title {
font-weight: bold; font-weight: bold;
font-size: 16px; font-size: 16px;
color: #333333;
} }
&-bar { &-bar {
background-color: #e8e8e8; background-color: #f8f8f8 !important;
width: 100%; width: calc(100% + 12px);
margin-top: 20px; margin-top: 20px;
color: #333333;
} }
&-footer { &-footer {
display: flex; display: flex;
justify-content: flex-end; justify-content: flex-end;
.n-button--info-type {
background: #507afd !important;
}
.n-button--default-type {
background: #fff !important;
color: #333333;
}
} }
&-info { &-info {
@ -423,15 +561,18 @@ const rightInputHandler = debounce((keyword) => {
.dragcardStyle { .dragcardStyle {
--n-padding-bottom: 0px !important; --n-padding-bottom: 0px !important;
--n-padding-left: 0px !important; --n-padding-left: 0px !important;
::v-deep(.n-card__content) {
padding-left: 0 !important;
padding-right: 0 !important;
}
} }
.cardstyle { .cardstyle {
width: 620px; width: 620px;
height: 800px; height: 800px;
--n-padding-bottom: 16px; --n-padding-bottom: 20px;
--n-padding-left: 24px; --n-padding-left: 24px;
--n-padding-right: 24px; // background-color: #f8f8f8 !important;
--n-padding-top: 20px;
} }
.textbtnStyle { .textbtnStyle {
@ -442,7 +583,6 @@ const rightInputHandler = debounce((keyword) => {
.draggable-ul { .draggable-ul {
width: 100%; width: 100%;
overflow: hidden; overflow: hidden;
background: #f8f8f8;
.draggable-li { .draggable-li {
width: 100%; width: 100%;
@ -453,6 +593,10 @@ const rightInputHandler = debounce((keyword) => {
align-items: center; align-items: center;
} }
.fix {
cursor: default !important;
}
.disable-check { .disable-check {
color: gainsboro; color: gainsboro;
} }
@ -469,20 +613,30 @@ const rightInputHandler = debounce((keyword) => {
::v-deep(.n-card > .n-card-header .n-card-header__main) { ::v-deep(.n-card > .n-card-header .n-card-header__main) {
font-weight: lighter !important; font-weight: lighter !important;
font-size: 14px; font-size: 14px;
color: #666666; color: #666;
} }
::v-deep(.n-scrollbar) { ::v-deep(.n-scrollbar) {
border-top: none !important; border-left: 1px solid #cad2dd !important;
border-right: 1px solid #cad2dd !important;
border-bottom: 1px solid #e8e8e8 !important;
border-top: 1px solid #e8e8e8 !important;
} }
::v-deep(.n-button--info-type) { ::v-deep(.n-card__content) {
background: #507afd !important; padding: 20px 24px 0 24px !important;
} }
::v-deep(.n-card__footer) { ::v-deep(.n-card__footer) {
padding: 0 16px 16px 16px !important; padding: 0 24px 16px 24px !important;
} }
::v-deep(.n-button--default-type) { ::v-deep(.n-input .n-input-wrapper) {
height: 44px !important;
border: 1px solid #cad2dd !important; border: 1px solid #cad2dd !important;
color: #333333; border-bottom: none !important;
background: #ffffff; // margin-bottom: -3px;
.n-input__input input {
height: 44px !important;
}
}
::v-deep(.n-button--info-type) {
background: #507afd !important;
} }
</style> </style>

@ -1,238 +1,179 @@
<script lang="ts" setup> <script lang="ts" setup>
import { getAllfieldList, getfieldList, savefield } from "@/api/home/filter"; import { difference } from 'lodash-es'
import { ColumnsMap } from "@/config/final"; import { computed, onMounted, ref, watch } from 'vue'
import { useUser } from "@/store/modules/user"; import { VueDraggable } from 'vue-draggable-plus'
import { difference } from "lodash-es"; import { getAllfieldList, getfieldList, savefield } from '@/api/home/filter'
import { computed, onMounted, ref, watch } from "vue"; import { useUser } from '@/store/modules/user'
import { VueDraggable } from "vue-draggable-plus";
const emit = defineEmits<{
(e: "commit", columns: any[]);
}>();
//
const offList = ref<any[]>([]);
//
const fixLeftList = ref<any[]>([]);
const onList = ref<any[]>([]);
const props = defineProps({ const props = defineProps({
reviewType: { reviewType: {
type: Number, type: Number,
default: () => 0, default: () => 0,
require: true, require: true,
}, },
}); })
const emit = defineEmits<{
(e: 'commit', columns: any[])
}>()
//
const offList = ref<any[]>([])
//
const fixLeftList = ref<any[]>([])
const onList = ref<any[]>([])
onMounted(async () => { onMounted(async () => {
const userStore = useUser(); const userStore = useUser()
const userInfo = userStore.getUserInfo; const userInfo = userStore.getUserInfo
let res; let res
res = await getAllfieldList(props.reviewType); // res = await getAllfieldList(props.reviewType) //
const allList = res.data; const allList = res.data
res = await getfieldList(props.reviewType, userInfo.id); // res = await getfieldList(props.reviewType, userInfo.id) //
const useList = res.data; const useList = res.data
/** /**
* name 标题 * name 标题
* id 键值 * id 键值
* fix 是否默认 * fix 是否默认
* checked 是否选中 * checked 是否选中
*/ */
const userFieldFixed = useList.userFieldFixed?.split(","); const userFieldFixed = useList.userFieldFixed?.split(',')
const userFieldUnFixed = useList.userFieldUnFixed?.split(","); const userFieldUnFixed = useList.userFieldUnFixed?.split(',')
let mustList = []; const mustList: any[] = []
allList?.map((v) => { allList?.forEach((v) => {
let item = { const item = {
name: v.fieldDesc, name: v.fieldDesc,
id: v.name, id: v.name,
fix: v.isrequired == 2, fix: v.isrequired == 2,
checked: checked:
v.isrequired == 2 || v.isrequired == 2
Boolean(userFieldFixed?.find((v2) => v2 == v.name)) || || Boolean(userFieldFixed?.find(v2 => v2 == v.name))
Boolean(userFieldUnFixed?.find((v2) => v2 == v.name)), || Boolean(userFieldUnFixed?.find(v2 => v2 == v.name)),
};
if (item.fix) {
mustList.push(item);
if (!userFieldFixed?.length && !userFieldUnFixed?.length) {
fixLeftList.value.push(item);
}
} }
if (userFieldFixed?.find((v2) => v2 == v.name)) { if (item.fix) {
fixLeftList.value.push(item); mustList.push(item)
} if (!userFieldFixed?.length && !userFieldUnFixed?.length)
if (userFieldUnFixed?.find((v2) => v2 == v.name)) { fixLeftList.value.push(item)
onList.value.push(item);
} }
offList.value.push(item); if (userFieldFixed?.find(v2 => v2 == v.name))
}); fixLeftList.value.push(item)
});
const allCount = computed(() => {
return `全部字段(共${offList.value.length - 1}个)`;
});
const selectCount = computed(() => { if (userFieldUnFixed?.find(v2 => v2 == v.name))
return `显示字段(共${onList.value.length}个)`; onList.value.push(item)
});
function generatList() { offList.value.push(item)
const keys = Object.keys(ColumnsMap); })
// const showStr = 'name' })
// const showKeys = showStr.split(',').map((key: string) => key.toLowerCase())
for (const key of keys) { const allCount = computed(() => {
const { title, fixed, fixLeft, width } = ColumnsMap[key]; return `全部字段(共${offList.value.length - 1}个)`
const item = { })
id: key,
title,
fix: fixed,
checked: ColumnsMap[key].fixed,
width,
};
if (!fixed) offList.value.push(item);
if (fixLeft) fixLeftList.value.push(item);
}
// showList = showKeys.reduce((acc, key) => {
// const config = {
// id: key,
// title: ColumnsMap[key].name || '',
// fix: ColumnsMap[key].fixed,
// }
// return [...acc, config]
// }, [])
const fixedList = generateDefaultList();
const filterList = fixedList.filter((item) => {
return !item.fixLeft;
});
onList.value.unshift(...filterList);
offList.value.unshift(...fixedList);
}
function generateDefaultList() { const selectCount = computed(() => {
return Object.keys(ColumnsMap).reduce((acc, key) => { return `显示字段(共${onList.value.length}个)`
const { title, fixed, fixLeft, width } = ColumnsMap[key]; })
if (fixed) {
const config = {
id: key,
title,
fix: true,
checked: true,
fixLeft,
width,
};
return [...acc, config];
} else {
return acc;
}
}, []);
}
const show = ref(false); const show = ref(false)
const checkAll = ref(false); const checkAll = ref(false)
function showModal() { function showModal() {
show.value = true; show.value = true
} }
function closeModal() { function closeModal() {
show.value = false; show.value = false
} }
async function handleSumbit(e: MouseEvent) { async function handleSumbit(e: MouseEvent) {
e.preventDefault(); e.preventDefault()
closeModal(); closeModal()
const userStore = useUser(); const userStore = useUser()
const userInfo = userStore.getUserInfo; const userInfo = userStore.getUserInfo
let userFieldFixed = ""; let userFieldFixed = ''
let userFieldUnFixed = ""; let userFieldUnFixed = ''
fixLeftList.value.map((v) => { fixLeftList.value.forEach((v) => {
userFieldFixed += `${v.id},`; userFieldFixed += `${v.id},`
}); })
onList.value.map((v) => { onList.value.forEach((v) => {
userFieldUnFixed += `${v.id},`; userFieldUnFixed += `${v.id},`
}); })
userFieldFixed = userFieldFixed.slice(0, userFieldFixed.length - 1); userFieldFixed = userFieldFixed.slice(0, userFieldFixed.length - 1)
userFieldUnFixed = userFieldUnFixed.slice(0, userFieldUnFixed.length - 1); userFieldUnFixed = userFieldUnFixed.slice(0, userFieldUnFixed.length - 1)
savefield(props.reviewType, userInfo.id, userFieldFixed, userFieldUnFixed); savefield(props.reviewType, userInfo.id, userFieldFixed, userFieldUnFixed)
const columns: any[] = [ const columns: any[] = [
{ {
type: "selection", type: 'selection',
fixed: "left", fixed: 'left',
width: 50, width: 50,
}, },
]; ]
const leftList = fixLeftList.value.map((item) => { const leftList = fixLeftList.value.map((item) => {
return { return {
title: item.name, title: item.name,
key: item.id, key: item.id,
fixed: "left", fixed: 'left',
width: 120, width: 120,
}; }
}); })
const unfixList = onList.value.map((item) => { const unfixList = onList.value.map((item) => {
return { return {
title: item.name, title: item.name,
key: item.id, key: item.id,
width: 120, width: 120,
}; }
}); })
columns.push(...leftList, ...unfixList); columns.push(...leftList, ...unfixList)
emit("commit", columns); emit('commit', columns)
} }
defineExpose({ defineExpose({
showModal, showModal,
}); })
// generatList() // generatList()
const selectIds = ref<string[]>([]); const selectIds = ref<string[]>([])
function onCheckAllChange(value) { function onCheckAllChange(value) {
const ids: string[] = []; const ids: string[] = []
for (const item of offList.value) { for (const item of offList.value) {
if (!item.fix) { if (!item.fix) {
item.checked = value; item.checked = value
ids.push(item.id); ids.push(item.id)
} }
} }
if (value) { if (value) {
offList.value.map((v) => { offList.value.forEach((v) => {
if (!v.checked) { if (!v.checked)
onList.value.push(v); onList.value.push(v)
} })
}); }
} else { else {
onList.value = []; onList.value = []
fixLeftList.value = []; fixLeftList.value = []
offList.value.map((v) => { offList.value.forEach((v) => {
if (v.fix) { if (v.fix)
fixLeftList.value.push(v); fixLeftList.value.push(v)
} })
}); }
} selectIds.value = value ? ids : []
selectIds.value = value ? ids : [];
} }
function onCheckChange(checked: any, item: any) { function onCheckChange(checked: any, item: any) {
item.checked = checked; item.checked = checked
if (checked) { if (checked) {
onList.value.push(item); onList.value.push(item)
} else { }
let index = onList.value.findIndex((v) => v.id == item.id); else {
let index = onList.value.findIndex(v => v.id == item.id)
if (index > -1) { if (index > -1) {
onList.value.splice(index, 1); onList.value.splice(index, 1)
} else { }
index = fixLeftList.value.findIndex((v) => v.id == item.id); else {
fixLeftList.value.splice(index, 1); index = fixLeftList.value.findIndex(v => v.id == item.id)
fixLeftList.value.splice(index, 1)
} }
} }
// TODO // TODO
@ -242,24 +183,26 @@ function onCheckChange(checked: any, item: any) {
const showIds = computed(() => { const showIds = computed(() => {
return onList.value.map((item) => { return onList.value.map((item) => {
return item.id; return item.id
}); })
}); })
watch( watch(
() => selectIds.value.length, () => selectIds.value.length,
(newVal, oldVal) => { (newVal, oldVal) => {
if (newVal === oldVal) return; if (newVal === oldVal)
return
const action = newVal > oldVal ? "add" : "remove"; const action = newVal > oldVal ? 'add' : 'remove'
const diff: string[] = const diff: string[]
action === "add" = action === 'add'
? difference(selectIds.value, showIds.value) ? difference(selectIds.value, showIds.value)
: difference(showIds.value, selectIds.value); : difference(showIds.value, selectIds.value)
if (diff.length === 0) return; if (diff.length === 0)
return
if (action === "add") { if (action === 'add') {
for (const item of offList.value) { for (const item of offList.value) {
if (!item.fix && diff.includes(item.id)) { if (!item.fix && diff.includes(item.id)) {
onList.value.push({ onList.value.push({
@ -267,77 +210,81 @@ watch(
name: item.name, name: item.name,
fix: item.fix || false, fix: item.fix || false,
width: 120, width: 120,
}); })
} }
} }
} else { }
const list = onList.value; else {
const list = onList.value
for (let index = 0; index < list.length; index++) { for (let index = 0; index < list.length; index++) {
const item = list[index]; const item = list[index]
if (!item.fix && diff.includes(item.id)) { if (!item.fix && diff.includes(item.id)) {
list.splice(index, 1); list.splice(index, 1)
return; return
}
} }
} }
} }
); },
)
watch( watch(
() => showIds.value.length, () => showIds.value.length,
(newVal, oldVal) => { (newVal, oldVal) => {
if (newVal === oldVal) return; if (newVal === oldVal)
return
const diff = difference(selectIds.value, showIds.value); const diff = difference(selectIds.value, showIds.value)
if (diff.length === 0) return; if (diff.length === 0)
return
for (const item of offList.value) { for (const item of offList.value) {
if (!item.fix && diff.includes(item.id)) { if (!item.fix && diff.includes(item.id)) {
const index = selectIds.value.indexOf(item.id); const index = selectIds.value.indexOf(item.id)
item.checked = false; item.checked = false
selectIds.value.splice(index, 1); selectIds.value.splice(index, 1)
} }
} }
} },
); )
function clearDragSource() { function clearDragSource() {
onList.value = onList.value.filter((item) => { onList.value = onList.value.filter((item) => {
return item.fix === true; return item.fix === true
}); })
} }
function removeHandler(id: string, type: "fix" | "unfix") { function removeHandler(id: string, type: 'fix' | 'unfix') {
const list = type === "fix" ? fixLeftList.value : onList.value; const list = type === 'fix' ? fixLeftList.value : onList.value
let index = list.findIndex((item) => { let index = list.findIndex((item) => {
return item.id === id; return item.id === id
}); })
if (index !== -1) list.splice(index, 1); if (index !== -1)
index = offList.value.findIndex((v) => v.id == id); list.splice(index, 1)
index = offList.value.findIndex(v => v.id == id)
if (index !== -1) { if (index !== -1) {
offList.value[index].checked = false; offList.value[index].checked = false
} else { }
index == fixLeftList.value.findIndex((v) => v.id == id); else {
fixLeftList.value[index].checked = false; index = fixLeftList.value.findIndex(v => v.id == id)
fixLeftList.value[index].checked = false
} }
} }
const indeterminate = computed(() => { const indeterminate = computed(() => {
let baseNum = 0;
offList.value.map((v) => {
if (v.fix) {
baseNum += 1;
}
});
return ( return (
onList.value.length + fixLeftList.value.length - baseNum > 0 && onList.value.length
offList.value.length - baseNum > + fixLeftList.value.length
onList.value.length + fixLeftList.value.length - baseNum - offList.value.filter(v => v.fix).length
); > 0
}); && offList.value.length - offList.value.filter(v => v.fix).length
> onList.value.length
+ fixLeftList.value.length
- offList.value.filter(v => v.fix).length
)
})
</script> </script>
<template> <template>
@ -376,8 +323,8 @@ const indeterminate = computed(() => {
<n-checkbox <n-checkbox
v-model:checked="checkAll" v-model:checked="checkAll"
label="全部" label="全部"
@update:checked="onCheckAllChange"
:indeterminate="indeterminate" :indeterminate="indeterminate"
@update:checked="onCheckAllChange"
/> />
</div> </div>
<div class="content"> <div class="content">
@ -475,7 +422,9 @@ const indeterminate = computed(() => {
<template #footer> <template #footer>
<div class="wrapper-footer"> <div class="wrapper-footer">
<n-button type="info" @click="handleSumbit"> </n-button> <n-button type="info" @click="handleSumbit">
确定
</n-button>
<n-button secondary style="margin-left: 15px" @click="closeModal"> <n-button secondary style="margin-left: 15px" @click="closeModal">
取消 取消
</n-button> </n-button>
@ -542,8 +491,7 @@ const indeterminate = computed(() => {
.textbtnStyle { .textbtnStyle {
cursor: pointer; cursor: pointer;
color: #507AFD; color: #507afd;
} }
.drag-wrapper { .drag-wrapper {
@ -604,7 +552,7 @@ const indeterminate = computed(() => {
::v-deep(.n-button--info-type) { ::v-deep(.n-button--info-type) {
background: #507afd !important; background: #507afd !important;
} }
::v-deep(.n-button--default-type){ ::v-deep(.n-button--default-type) {
border: 1px solid #cad2dd !important; border: 1px solid #cad2dd !important;
} }
// ::v-deep(.n-card__content){ // ::v-deep(.n-card__content){

@ -1,5 +1,6 @@
<script lang="ts" setup> <script lang="ts" setup>
import { import {
computed,
defineOptions, defineOptions,
h, h,
nextTick, nextTick,
@ -8,86 +9,101 @@ import {
reactive, reactive,
ref, ref,
unref, unref,
computed, } from 'vue'
} from "vue"; import { NButton, NDataTable, useModal } from 'naive-ui'
import { NDataTable } from "naive-ui"; import type { DataTableColumns, DataTableRowKey } from 'naive-ui'
import type { DataTableColumns, DataTableRowKey } from "naive-ui"; import type { SortableEvent } from 'sortablejs'
import type { SortableEvent } from "sortablejs"; import Sortable from 'sortablejs'
import Sortable from "sortablejs"; import { debounce } from 'lodash-es'
import { debounce } from "lodash-es"; import Action from '@/views/home/aside/comp/Action.vue'
import Action from "@/views/home/aside/comp/Action.vue"; import { deleteCondition, getConditionList, sort } from '@/api/home/filter'
import { deleteCondition, getConditionList, sort } from "@/api/home/filter"; import type { FilterSearchParam } from '/#/api'
import type { FilterSearchParam } from "/#/api";
import SvgIcon from '@/components/Icon/SvgIcon.vue'
defineOptions({ name: "FilterModal" }); import { useKeydown } from '@/hooks/event/useKeydown'
defineOptions({ name: 'FilterModal' })
const emit = defineEmits<{ const emit = defineEmits<{
(e: "showNewFilter"): void; (e: 'showNewFilter'): void
(e: "editFilter", filter: any): void; (e: 'editFilter', filter: any): void
}>(); (e: 'handleOk', item: any): void
}>()
const modal = useModal()
const show = ref(false); const show = ref(false)
const checkedRowKeys = ref([]); const checkedRowKeys = ref([])
const $message = window.$message
const cardStyle = { const cardStyle = {
width: "800px", 'width': '800px',
height: "800px", 'height': '800px',
"--n-padding-bottom": "10px", '--n-padding-bottom': '10px',
"--n-padding-left": "10px", '--n-padding-left': '10px',
}; }
interface RowData { interface RowData {
id: string; id: string
searchname: string; searchname: string
createby: string; createby: string
createtime: string; createtime: string
updateby: string; updateby: string
updatetime: string; updatetime: string
} }
const columns: DataTableColumns<RowData> = [ const columns: DataTableColumns<RowData> = [
{ {
type: "selection", type: 'selection',
}, },
{ {
title: "操作", title: '操作',
key: "action", key: 'action',
render(row) { render(row) {
return h(Action, { return h(Action, {
options: [ options: [
{ label: "编辑", key: 1 }, { label: '编辑', key: 1 },
{ label: "删除", key: 2 }, { label: '删除', key: 2 },
], ],
id: row.id, id: row.id,
select, select,
}); })
}, },
}, },
{ {
title: "名称", title: '名称',
key: "searchname", key: 'searchname',
}, },
{ {
title: "创建者", title: '创建者',
key: "createby", key: 'createby',
}, },
{ {
title: "创建时间", title: '创建时间',
key: "createtime", key: 'createtime',
sorter: (row1, row2) => new Date(row1?.createtime).getTime() - new Date(row2?.createtime).getTime() renderSorterIcon: ({ order }) => {
if (order === false)
return h(SvgIcon, { name: 'sort-2' })
if (order === 'ascend')
return h(SvgIcon, { name: 'sort-1' })
if (order === 'descend')
return h(SvgIcon, { name: 'sort-3' })
},
sorter: (row1, row2) =>
new Date(row1?.createtime).getTime() - new Date(row2?.createtime).getTime(),
}, },
{ {
title: "更新者", title: '更新者',
key: "updateby", key: 'updateby',
}, },
{ {
title: "更新时间", title: '更新时间',
key: "updatetime", key: 'updatetime',
}, },
]; ]
const loading = ref(true); const loading = ref(true)
const total = ref(0); const total = ref(0)
const pagination = reactive({ const pagination = reactive({
page: 1, page: 1,
pageCount: 1, pageCount: 1,
@ -95,211 +111,246 @@ const pagination = reactive({
showSizePicker: true, showSizePicker: true,
pageSizes: [ pageSizes: [
{ {
label: "10 每页", label: '10 每页',
value: 10, value: 10,
}, },
{ {
label: "15 每页", label: '15 每页',
value: 15, value: 15,
}, },
{ {
label: "30 每页", label: '30 每页',
value: 30, value: 30,
}, },
{ {
label: "50 每页", label: '50 每页',
value: 50, value: 50,
}, },
], ],
showQuickJumper: true, showQuickJumper: true,
prefix: () => `${total.value} 条数据`, prefix: () => `${total.value} 条数据`,
}); })
const tableData = ref<Array<RowData>>([]); const tableData = ref<Array<RowData>>([])
const keyword = ref(""); const keyword = ref('')
async function query(page: number, pageSize: number) { async function query(page: number, pageSize: number) {
const searchParam: FilterSearchParam = { const searchParam: FilterSearchParam = {
search_searchname: { value: keyword.value, op: "like", type: "string" }, search_searchname: { value: keyword.value, op: 'like', type: 'string' },
}; }
const result = await getConditionList({ pageNo: page, pageSize }, searchParam, 1); const result = await getConditionList({ pageNo: page, pageSize }, searchParam, 1)
const { data, pageCount, total: totalCount } = result; const { data, pageCount, total: totalCount } = result
total.value = totalCount; total.value = totalCount
tableData.value = data; tableData.value = data
pagination.page = page; pagination.page = page
pagination.pageCount = pageCount; pagination.pageCount = pageCount
loading.value = false; loading.value = false
} }
function afterLeave() { function afterLeave() {
pagination.page = 1; pagination.page = 1
pagination.pageCount = 1; pagination.pageCount = 1
pagination.pageSize = 10; pagination.pageSize = 10
} }
const selectionIds = ref<DataTableRowKey[]>([]); const selectionIds = ref<DataTableRowKey[]>([])
const rowKey = (row: RowData) => row.id; const rowKey = (row: RowData) => row.id
function rowProps(row: RowData) { function rowProps(row: RowData) {
return { return {
"data-id": row.id, 'data-id': row.id,
}; }
} }
function handleCheck(rowKeys: DataTableRowKey[]) { function handleCheck(rowKeys: DataTableRowKey[]) {
selectionIds.value = rowKeys; selectionIds.value = rowKeys
} }
function select(key: number, id: string) { function select(key: number, id: string) {
switch (key) { if (key == 1)
case 1: editSelection(id)
editSelection(id);
break; else
case 2: deleteSelection(id)
deleteSelection(id); // const modalInst = modal.create({
break; // title: "",
default: // content: "?",
break; // positiveText: "",
} // negativeText: "",
// preset: "dialog",
// onPositiveClick: () => deleteSelection(id),
// onNegativeClick: () => modalInst.destroy(),
// });
} }
function editSelection(id = "") { function editSelection(id = '') {
// eslint-disable-next-line dot-notation
// const $message = window["$message"]; // const $message = window["$message"];
// if (selectionIds.value.length === 0 || selectionIds.value.length > 1) { // if (selectionIds.value.length === 0 || selectionIds.value.length > 1) {
// $message.error(""); // $message.error("");
// return; // return;
// } // }
const selectedId = id; const selectedId = id
const selectedFilter = tableData.value.find((item: any) => { const selectedFilter = tableData.value.find((item: any) => {
return item.id === selectedId; return item.id === selectedId
}); })
emit("editFilter", selectedFilter); emit('editFilter', selectedFilter)
closeModal(); closeModal()
} }
function deleteSelection(id = "") { function deleteSelection(id = '') {
// eslint-disable-next-line dot-notation if (id) {
if (selectionIds.value.length === 0) {
deleteCondition({ ids: id }).then(() => { deleteCondition({ ids: id }).then(() => {
query(pagination.page, pagination.pageSize); query(pagination.page, pagination.pageSize)
}); })
return; return
} }
const modalInst = modal.create({
deleteCondition({ ids: selectionIds.value.join(",") }).then(() => { title: '确认提示',
selectionIds.value = []; content: '确认删除所选过滤条件吗?',
query(pagination.page, pagination.pageSize); positiveText: '确定',
}); negativeText: '取消',
preset: 'dialog',
onPositiveClick: () =>
deleteCondition({ ids: selectionIds.value.join(',') }).then(() => {
selectionIds.value = []
query(pagination.page, pagination.pageSize)
}),
onNegativeClick: () => modalInst.destroy(),
})
} }
async function handlePageChange(currentPage) { async function handlePageChange(currentPage) {
if (loading.value) return; if (loading.value)
pagination.page = currentPage; return
const { pageSize } = pagination; pagination.page = currentPage
await query(currentPage, pageSize); const { pageSize } = pagination
await query(currentPage, pageSize)
} }
async function handlePageSizeChange(currentPageSize) { async function handlePageSizeChange(currentPageSize) {
if (loading.value) return; if (loading.value)
return
const { page } = pagination; const { page } = pagination
pagination.pageSize = currentPageSize; pagination.pageSize = currentPageSize
await query(page, currentPageSize); await query(page, currentPageSize)
} }
function handleClick() { function handleClick() {
emit("showNewFilter"); emit('showNewFilter')
// show.value = false; // show.value = false;
closeModal()
} }
useKeydown('n t', handleClick)
let sortTable: Sortable | null = null; let sortTable: Sortable | null = null
const tableRef = ref<InstanceType<typeof NDataTable>>(); const tableRef = ref<InstanceType<typeof NDataTable>>()
onMounted(() => { onMounted(() => {
nextTick(() => { nextTick(() => {
console.log(tableRef.value, "tableRef"); console.log(tableRef.value, 'tableRef')
}); })
}); })
async function showModal() { async function showModal() {
show.value = true; show.value = true
const { page, pageSize } = pagination; const { page, pageSize } = pagination
await query(page, pageSize); await query(page, pageSize)
nextTick(() => { nextTick(() => {
if (sortTable !== null) destory(); if (sortTable !== null)
destory()
const el: HTMLDivElement = tableRef.value?.$el;
const tbody: HTMLElement | null = el.querySelector("tbody.n-data-table-tbody")!; const el: HTMLDivElement = tableRef.value?.$el
if (tbody) sortTable = Sortable.create(tbody, { onEnd, onMove }); const tbody: HTMLElement | null = el.querySelector('tbody.n-data-table-tbody')!
}); if (tbody)
sortTable = Sortable.create(tbody, { onEnd, onMove })
})
} }
let relatedId = ""; let relatedId = ''
let insertafter = false; let insertafter = false
// TODO: bug // TODO: bug
function onEnd(event: SortableEvent) { function onEnd(event: SortableEvent) {
const data = unref(tableData); const data = unref(tableData)
const oldElem = data[event.oldIndex!]; const oldElem = data[event.oldIndex!]
data.splice(event.oldIndex!, 1); data.splice(event.oldIndex!, 1)
data.splice(event.newIndex!, 0, oldElem); data.splice(event.newIndex!, 0, oldElem)
const dragId = oldElem.id; const dragId = oldElem.id
const index = data.findIndex((item) => { const index = data.findIndex((item) => {
return item.id === relatedId; return item.id === relatedId
}); })
// -1+1 // -1+1
const order = insertafter ? index - 1 : index + 1; const order = insertafter ? index - 1 : index + 1
// console.log('dragid:', dragId, 'order:', order) // console.log('dragid:', dragId, 'order:', order)
sort(dragId, order); sort(dragId, order)
} }
function onMove(evt: any) { function onMove(evt: any) {
relatedId = evt.related?.dataset?.id; relatedId = evt.related?.dataset?.id
insertafter = evt.willInsertAfter; insertafter = evt.willInsertAfter
// console.log(`${evt.dragged.dataset.id},${evt.related}`, 'insertafter', evt.willInsertAfter) // console.log(`${evt.dragged.dataset.id},${evt.related}`, 'insertafter', evt.willInsertAfter)
} }
function destory() { function destory() {
sortTable && sortTable.destroy(); sortTable && sortTable.destroy()
sortTable = null; sortTable = null
} }
onUnmounted(() => { onUnmounted(() => {
destory(); destory()
}); })
function closeModal() { function closeModal() {
show.value = false; show.value = false
} }
defineExpose({ defineExpose({
showModal, showModal,
}); query,
pagination,
})
const inputHandler = debounce((word) => { const inputHandler = debounce((word) => {
keyword.value = word; keyword.value = word
query(1, 5); query(1, 5)
}, 300); }, 300)
const showSearch = computed(() => { const showSearch = computed(() => {
return selectionIds.value.length > 0; return selectionIds.value.length > 0
}); })
function handleOk() {
if (selectionIds.value.length > 1) {
$message.error('只能选择一条筛选条件')
return
}
if (selectionIds.value.length == 1) {
const selectedId = selectionIds.value[0]
const item = tableData.value.find(v => v.id == selectedId)
emit('handleOk', item)
}
if (selectionIds.value.length == 0)
emit('handleOk', '')
closeModal()
}
</script> </script>
<template> <template>
<div> <div>
<!-- <n-modal v-model:show="delShow" >
</n-modal> -->
<n-modal <n-modal
v-model:show="show" v-model:show="show"
transform-origin="center" transform-origin="center"
display-directive="if" display-directive="if"
@after-leave="afterLeave"
:mask-closable="false" :mask-closable="false"
class="modal_wrapper"
@after-leave="afterLeave"
> >
<n-card <n-card
:style="cardStyle" :style="cardStyle"
@ -312,10 +363,16 @@ const showSearch = computed(() => {
<span class="wrapper-title">全部筛选值</span> <span class="wrapper-title">全部筛选值</span>
<div class="wrapper-bar"> <div class="wrapper-bar">
<div class="wrapper-info"> <div class="wrapper-info">
<span :style="{ 'margin-left': '18px' }">基本信息</span> <span
:style="{
'margin-left': '18px',
'font-size': '16px',
'font-weight': '600',
}"
>基本信息</span>
</div> </div>
</div> </div>
<div class="wrapper-form" v-if="!showSearch"> <div v-if="!showSearch" class="wrapper-form">
<n-input <n-input
:style="{ width: '360px', border: '1px solid #cad2dd' }" :style="{ width: '360px', border: '1px solid #cad2dd' }"
placeholder="请输入过滤条件名称搜索" placeholder="请输入过滤条件名称搜索"
@ -325,31 +382,29 @@ const showSearch = computed(() => {
<SvgIcon size="14px" name="magnifying-1" /> <SvgIcon size="14px" name="magnifying-1" />
</template> </template>
</n-input> </n-input>
<n-button type="info" @click="handleClick"> <NButton type="info" @click="handleClick">
创建 创建
<template #icon> <template #icon>
<SvgIcon size="14px" name="magnifying-1" /> <SvgIcon size="14px" name="creatFilter" />
</template> </template>
</n-button> </NButton>
</div> </div>
<div class="wrapper-form" v-else> <div v-else class="wrapper-form">
<div class="del_btn"> <div class="del_btn">
<n-button icon-placement="left" size="medium"> <NButton icon-placement="left" size="medium" @click="deleteSelection()">
<template #icon> <template #icon>
<SvgIcon name="delete-history" size="16" /> <SvgIcon name="delete-history" size="16" />
</template> </template>
删除</n-button 删除
> </NButton>
</div> </div>
<div class="msg"> <div class="msg">
<span <span>已选中
>已选中
<span style="color: #507afd; font-size: 16px">{{ <span style="color: #507afd; font-size: 16px">{{
selectionIds.length selectionIds.length
}}</span> }}</span>
</span </span>
>
<a @click="selectionIds = []">清空</a> <a @click="selectionIds = []">清空</a>
</div> </div>
</div> </div>
@ -364,19 +419,21 @@ const showSearch = computed(() => {
:loading="loading" :loading="loading"
:pagination="pagination" :pagination="pagination"
:row-key="rowKey" :row-key="rowKey"
:checked-row-keys="selectionIds"
@update:page="handlePageChange" @update:page="handlePageChange"
@update-page-size="handlePageSizeChange" @update-page-size="handlePageSizeChange"
@update:checked-row-keys="handleCheck" @update:checked-row-keys="handleCheck"
:checked-row-keys="selectionIds"
/> />
</div> </div>
</div> </div>
<template #footer> <template #footer>
<div class="wrapper-footer"> <div class="wrapper-footer">
<n-button type="info" @click="closeModal"> </n-button> <NButton type="info" @click="handleOk">
<n-button secondary style="margin-left: 15px" @click="closeModal"> 确认
</NButton>
<NButton secondary style="margin-left: 15px" @click="closeModal">
取消 取消
</n-button> </NButton>
</div> </div>
</template> </template>
</n-card> </n-card>
@ -409,13 +466,15 @@ const showSearch = computed(() => {
width: 300px; width: 300px;
border: 1px solid gray; border: 1px solid gray;
} }
.del_btn {
}
.msg { .msg {
span {
padding-right: 16px;
}
a { a {
margin-left: 30px; padding-left: 17px;
cursor: pointer; cursor: pointer;
color: #507afd; color: #507afd;
border-left: 1px solid #d8d8d8;
} }
} }
} }
@ -444,4 +503,29 @@ const showSearch = computed(() => {
} }
} }
} }
.del_btn {
margin-left: 12px;
color: #333333;
font-weight: 500;
}
::v-deep(.n-button--info-type) {
background: #507afd !important;
}
::v-deep(.n-data-table
.n-data-table-th
.n-data-table-th__title-wrapper
.n-data-table-th__title) {
font-size: 14px !important;
color: #000000 !important;
}
::v-deep(.n-data-table
.n-data-table-tr:not(.n-data-table-tr--summary):hover
> .n-data-table-td) {
color: #666666 !important;
font-size: 14px !important;
}
::v-deep(.n-data-table .n-data-table-th .n-data-table-sorter) {
position: relative;
left: -80px;
}
</style> </style>

@ -1,6 +1,6 @@
<script lang="ts" setup> <script lang="ts" setup>
import type { FormInst, FormItemRule, FormRules } from 'naive-ui' import type { FormInst, FormItemRule, FormRules } from 'naive-ui'
import { computed, onBeforeMount, reactive, ref, unref, watch } from 'vue' import { computed, defineEmits, onBeforeMount, reactive, ref, unref, watch } from 'vue'
import { asideMap } from '@/config/final' import { asideMap } from '@/config/final'
import { useDictionary } from '@/store/modules/dictonary' import { useDictionary } from '@/store/modules/dictonary'
import { useConfig } from '@/store/modules/asideConfig' import { useConfig } from '@/store/modules/asideConfig'
@ -9,6 +9,7 @@ import { addCondition, updateCondition } from '@/api/home/filter'
import { formatToDate2, formatToDate3 } from '@/utils/dateUtil' import { formatToDate2, formatToDate3 } from '@/utils/dateUtil'
type Status = 'edit' | 'new' type Status = 'edit' | 'new'
const emit = defineEmits(['onOk'])
const show = ref(false) const show = ref(false)
const configStore = useConfig() const configStore = useConfig()
@ -85,11 +86,13 @@ const formRef = ref<FormInst | null>(null)
const formValue = reactive<FormType>({ const formValue = reactive<FormType>({
name: null, name: null,
logic: 'and', logic: 'and',
conditions: [{ conditions: [
{
type: null, type: null,
operator: 'eq', operator: 'eq',
result: null, result: null,
}], },
],
}) })
function handleSumbit(e: MouseEvent) { function handleSumbit(e: MouseEvent) {
@ -118,14 +121,13 @@ function handleSumbit(e: MouseEvent) {
if (currentStatus.value === 'new') if (currentStatus.value === 'new')
addCondition(param) addCondition(param)
else else updateCondition({ id: currentEditId!, ...param })
updateCondition({ id: currentEditId!, ...param })
closeModal() closeModal()
}) })
} }
function formatValue(searchfield: string, searchvalue: any) { function formatValue(searchfield: string, searchvalue: any) {
if (searchfield === 'izuptime') { if (searchfield === 'izyear') {
const start = formatToDate2(searchvalue[0]) const start = formatToDate2(searchvalue[0])
const end = formatToDate2(searchvalue[1]) const end = formatToDate2(searchvalue[1])
return `${start}-${end}` return `${start}-${end}`
@ -137,7 +139,7 @@ function formatValue(searchfield: string, searchvalue: any) {
// //
function unformatValue(searchfield: string, searchvalue: any) { function unformatValue(searchfield: string, searchvalue: any) {
// 2022/01/03-2023/02/04 // 2022/01/03-2023/02/04
if (searchfield === 'izuptime') { if (searchfield === 'izyear') {
const dataStrs = searchvalue.split('-') const dataStrs = searchvalue.split('-')
const start = formatToDate3(dataStrs[0]) const start = formatToDate3(dataStrs[0])
const end = formatToDate3(dataStrs[1]) const end = formatToDate3(dataStrs[1])
@ -182,16 +184,25 @@ onBeforeMount(() => {
dicStore.fetchRelationTypeList() dicStore.fetchRelationTypeList()
}) })
watch(() => dicStore.relationTypeList, (newval) => { watch(
() => dicStore.relationTypeList,
(newval) => {
logicOptions.value = newval logicOptions.value = newval
}) },
)
function showModal() { function showModal() {
show.value = true show.value = true
setTimeout(() => {
formValue.name = ''
}, 300);
} }
function closeModal() { function closeModal() {
emit('onOk')
setTimeout(() => {
show.value = false show.value = false
}, 300)
} }
function generateAllData(): Option[] { function generateAllData(): Option[] {
@ -200,7 +211,8 @@ function generateAllData(): Option[] {
if (value.startsWith('iz') && asideMap[value]?.inFilterList !== false) { if (value.startsWith('iz') && asideMap[value]?.inFilterList !== false) {
const name = asideMap[value]?.label const name = asideMap[value]?.label
name && acc.push({ name
&& acc.push({
value, value,
label: name || '未配置', label: name || '未配置',
}) })
@ -255,45 +267,98 @@ defineExpose({
</script> </script>
<template> <template>
<n-modal v-model:show="show" transform-origin="center" @after-leave="leaveHandler" :mask-closable="false"> <n-modal
<n-card :style="cardStyle" :bordered="false" size="huge" role="dialog" aria-modal="true"> v-model:show="show"
transform-origin="center"
:mask-closable="false"
@after-leave="leaveHandler"
>
<n-card
:style="cardStyle"
:bordered="false"
size="huge"
role="dialog"
aria-modal="true"
>
<div class="wrapper"> <div class="wrapper">
<span class="wrapper-title">{{ modalTitle }}</span> <span class="wrapper-title">{{ modalTitle }}</span>
<div class="wrapper-bar"> <div class="wrapper-bar">
<div class="wrapper-info"> <div class="wrapper-info">
<span :style="{ 'margin-left': '18px' }">基本信息</span> <span
:style="{
'margin-left': '18px',
'font-size': '16px',
'font-weight': '600',
}"
>基本信息</span>
</div> </div>
</div> </div>
<div class="wrapper-form"> <div class="wrapper-form">
<n-form ref="formRef" :model="formValue" :rules="rules"> <n-form
ref="formRef"
:model="formValue"
:rules="rules"
require-mark-placement="left"
>
<n-form-item path="name" label="标题"> <n-form-item path="name" label="标题">
<n-input v-model:value="formValue.name" :style="{ width: '780px' }" @keydown.enter.prevent /> <n-input
v-model:value="formValue.name"
:style="{ width: '780px' }"
placeholder="请输入过滤名称"
maxlength="15"
@keydown.enter.prevent
/>
</n-form-item> </n-form-item>
<n-form-item path="logic" label="逻辑关系" v-show="false"> <n-form-item v-show="false" path="logic" label="逻辑关系">
<n-select filterable v-model:value="formValue.logic" placeholder="请选择逻辑关系" :options="logicOptions" /> <n-select
v-model:value="formValue.logic"
filterable
placeholder="请选择逻辑关系"
:options="logicOptions"
/>
</n-form-item> </n-form-item>
<n-form-item <n-form-item
v-for="(item, index) in formValue.conditions" :key="index" :style="formItemStyle" v-for="(item, index) in formValue.conditions"
path="conditions" :label="formLabel(index)" :key="index"
:style="formItemStyle"
path="conditions"
:label="formLabel(index)"
> >
<n-select filterable <n-select
v-model:value="item.type" placeholder="请选择筛选项名称" :options="typeOptions" v-model:value="item.type"
filterable
placeholder="请选择筛选项名称"
:options="typeOptions"
@change="item.result = ''" @change="item.result = ''"
/> />
<n-select filterable <n-select
v-model:value="item.operator" style="margin-left: 8px;" placeholder="请选择" v-model:value="item.operator"
filterable
style="margin-left: 8px"
placeholder="请选择"
:options="operatorOptions" :options="operatorOptions"
/> />
<n-space v-if="item.type === 'izuptime'"> <n-space v-if="item.type === 'izyear'">
<n-date-picker <n-date-picker
v-model:value="item.result" style="margin-left: 8px;width: 240px;" type="daterange" v-model:value="item.result"
style="margin-left: 8px; width: 240px"
type="daterange"
clearable clearable
/> />
</n-space> </n-space>
<n-select filterable <n-select
v-else v-model:value="item.result" style="margin-left: 8px;" placeholder="请选择" :options="getOptions(item.type!)" v-else
v-model:value="item.result"
filterable
style="margin-left: 8px"
placeholder="请选择"
:options="getOptions(item.type!)"
/> />
<n-button :style="noBorderInput" icon-placement="right" @click="removeCondition(index)"> <n-button
:style="noBorderInput"
icon-placement="right"
@click="removeCondition(index)"
>
<template #icon> <template #icon>
<SvgIcon size="24" name="close" /> <SvgIcon size="24" name="close" />
</template> </template>
@ -302,8 +367,8 @@ defineExpose({
</n-form> </n-form>
</div> </div>
<div class="wrapper-new" @click="createCondition"> <div class="wrapper-new" @click="createCondition">
<span>+</span> <span style="font-size: 16px">+</span>
<span style="margin-left:8px">添加筛选条件</span> <span style="margin-left: 8px">添加筛选条件</span>
</div> </div>
</div> </div>
<template #footer> <template #footer>
@ -311,7 +376,7 @@ defineExpose({
<n-button type="info" @click="handleSumbit"> <n-button type="info" @click="handleSumbit">
确定 确定
</n-button> </n-button>
<n-button secondary style="margin-left:15px" @click="closeModal"> <n-button secondary style="margin-left: 15px" @click="closeModal">
取消 取消
</n-button> </n-button>
</div> </div>
@ -327,19 +392,22 @@ defineExpose({
&-title { &-title {
font-weight: bold; font-weight: bold;
font-size: 16px; font-size: 18px;
color: #333333;
} }
&-bar { &-bar {
background-color: #e8e8e8; background-color: #e8e8e8;
width: 100%; width: 100%;
margin-top: 20px; margin-top: 27px;
font-size: 16px;
color: #333333;
} }
&-form { &-form {
display: flex; display: flex;
justify-content: space-between; justify-content: space-between;
margin-top: 20px; margin-top: 24px;
} }
&-new { &-new {
@ -348,6 +416,9 @@ defineExpose({
color: #507afd; color: #507afd;
line-height: 22px; line-height: 22px;
cursor: pointer; cursor: pointer;
span {
font-size: 11px;
}
&:hover { &:hover {
color: #507aac; color: #507aac;
@ -361,6 +432,7 @@ defineExpose({
&-footer { &-footer {
display: flex; display: flex;
justify-content: flex-end; justify-content: flex-end;
margin-bottom: 6px;
} }
&-info { &-info {
@ -368,7 +440,7 @@ defineExpose({
position: relative; position: relative;
&:before { &:before {
background-color: #1980FF; background-color: #1980ff;
content: ""; content: "";
width: 5px; width: 5px;
border-radius: 2px; border-radius: 2px;
@ -378,4 +450,9 @@ defineExpose({
} }
} }
} }
::v-deep(.n-form-item .n-form-item-label) {
font-size: 14px;
color: #666666;
font-weight: 500;
}
</style> </style>

@ -363,7 +363,7 @@ function reload() {
} }
function goDetail(row) { function goDetail(row) {
router.push({ name: 'final-detail', query: { id: row.id, packageid: row.packageid } }) router.push({ name: 'final-detail', query: { id: row.id, packageid: row.packageid, taskindex: row.taskIndex } })
} }
const showActions = computed(() => { const showActions = computed(() => {

@ -1,5 +1,9 @@
<script lang="ts" setup> <script lang="ts" setup>
import type { DataTableColumns, DataTableRowKey, PaginationProps } from 'naive-ui' import type {
DataTableColumns,
DataTableRowKey,
PaginationProps,
} from 'naive-ui'
import { NButton, NDataTable, useDialog, useMessage } from 'naive-ui' import { NButton, NDataTable, useDialog, useMessage } from 'naive-ui'
import { import {
computed, computed,
@ -12,10 +16,12 @@ import {
reactive, reactive,
ref, ref,
unref, unref,
watch, watch,defineProps
} from 'vue' } from 'vue'
import { rowPropKeys } from 'naive-ui/es/legacy-grid/src/Row' import { rowPropKeys } from 'naive-ui/es/legacy-grid/src/Row'
import { useRoute, useRouter } from 'vue-router' import { useRoute, useRouter } from 'vue-router'
import dayjs from 'dayjs'
import { cloneDeep } from 'lodash-es'
import { import {
CustomTabelModal, CustomTabelModal,
ImportExcelModal, ImportExcelModal,
@ -40,7 +46,14 @@ import type { ApprovalParam } from '/#/api'
import emitter from '@/utils/mitt' import emitter from '@/utils/mitt'
import { formatToDateHMS } from '@/utils/dateUtil' import { formatToDateHMS } from '@/utils/dateUtil'
import { getAllfieldList, getfieldList, savefield } from '@/api/home/filter' import { getAllfieldList, getfieldList, savefield } from '@/api/home/filter'
import DataHeader from '@/components/DataHeader/index.vue'
const props = defineProps({
taskvalue: {
type: String,
default: ""
}
});
const emit = defineEmits(['changeShow']) const emit = defineEmits(['changeShow'])
function changeContent() { function changeContent() {
emit('changeShow') emit('changeShow')
@ -53,10 +66,12 @@ const route = useRoute()
const reviewType = 0 const reviewType = 0
const sortorder = ref('asc') const sortorder = ref('asc')
const sortname = ref('states') const sortname = ref('states')
const searchContent = route.query.searchContent as string
const actionsColumns = { const actionsColumns = {
title: '操作', title: '操作',
key: 'actions', key: 'actions',
minWidth: 200, minWidth: 200,
width: 200,
fixed: 'right', fixed: 'right',
render(row) { render(row) {
return h(ListAction, { return h(ListAction, {
@ -69,6 +84,7 @@ const actionsColumns = {
}, },
} }
const columnsRef = ref<DataTableColumns<RowData>>([]) const columnsRef = ref<DataTableColumns<RowData>>([])
// const columns: DataTableColumns<RowData> = [ // const columns: DataTableColumns<RowData> = [
// { // {
// type: "selection", // type: "selection",
@ -196,6 +212,7 @@ async function getColumns() {
width: 120, width: 120,
}) })
} }
return v
}) })
} }
else { else {
@ -207,6 +224,7 @@ async function getColumns() {
fixed: 'left', fixed: 'left',
width: 120, width: 120,
}) })
return v
}) })
userFieldUnFixed.map((v) => { userFieldUnFixed.map((v) => {
const item = allList.find(v2 => v2.name == v) const item = allList.find(v2 => v2.name == v)
@ -215,6 +233,7 @@ async function getColumns() {
key: item.name, key: item.name,
width: 120, width: 120,
}) })
return v
}) })
} }
// TODO: // TODO:
@ -272,7 +291,7 @@ async function formatColumns() {
NButton, NButton,
{ {
'strong': true, 'strong': true,
'tertiary': true, // 'tertiary': true,
'text': true, 'text': true,
'size': 'small', 'size': 'small',
'text-color': '#507AFD', 'text-color': '#507AFD',
@ -360,7 +379,10 @@ async function formatColumns() {
id: row.id, id: row.id,
style: { color: row.similarityscore === 100 ? '#FF4E4F' : '' }, style: { color: row.similarityscore === 100 ? '#FF4E4F' : '' },
}, },
{ default: () => (row.similarityscore ? `${row.similarityscore}%` : '') }, {
default: () =>
row.similarityscore ? `${row.similarityscore}%` : '',
},
) )
}, },
} }
@ -382,7 +404,7 @@ async function formatColumns() {
return h(SvgIcon, { name: 'sort-3' }) return h(SvgIcon, { name: 'sort-3' })
}, },
render(row: any) { render(row: any) {
return formatToDateHMS(row.createdate || 0) return formatToDateHMS(row.fromuptime || 0)
}, },
} }
} }
@ -405,6 +427,7 @@ async function formatColumns() {
render(row: any) { render(row: any) {
return row.fromusername return row.fromusername
}, },
} }
} }
@ -424,15 +447,6 @@ async function formatColumns() {
const deviceHeight = ref(600) const deviceHeight = ref(600)
onMounted(() => {
emitter.on('filter-final', refreshHandler)
getColumns()
nextTick(() => {
computeListHeight()
})
})
onBeforeMount(() => { onBeforeMount(() => {
dicStore.fetchizstatusListt() dicStore.fetchizstatusListt()
}) })
@ -484,10 +498,40 @@ const dialog = useDialog()
const message = useMessage() const message = useMessage()
const finalStore = useFinal() const finalStore = useFinal()
async function query(page: number, pageSize: number, filterId?: any, taskName?: string) { async function query(
const asideParmas = unref(finalStore.getAsideValue) page: number,
pageSize: number,
filterId?: any,
taskName?: string,
) {
console.log('query', taskName)
const asideParmas = cloneDeep(unref(finalStore.getAsideValue))
console.log(asideParmas);
if (asideParmas.izyear) {
asideParmas.izuptime = cloneDeep(asideParmas.izyear)
if (typeof asideParmas.izuptime == 'object') {
asideParmas.izuptime[0] = dayjs(asideParmas.izuptime[0]).format(
'YYYY/MM/DD',
)
asideParmas.izuptime[1] = dayjs(asideParmas.izuptime[1]).format(
'YYYY/MM/DD',
)
asideParmas.izuptime = asideParmas.izuptime.join('-')
delete asideParmas.izyear
}
}
// 使使 // 使使
const params = filterId ? { userSearchId: filterId } : asideParmas // let params = filterId ? { userSearchId: filterId } : asideParmas
let params = asideParmas
if (params?.izshowall == true)
{
params.isFail = true
delete params.izshowall;
}
// params = params?.izshowall ? { isFail: true } : params
const result = await getFinalList({ const result = await getFinalList({
sortorder: sortorder.value, sortorder: sortorder.value,
pageSize, pageSize,
@ -505,16 +549,13 @@ async function query(page: number, pageSize: number, filterId?: any, taskName?:
} }
async function handleSorterChange(value) { async function handleSorterChange(value) {
console.log(value)
let name = value.columnKey let name = value.columnKey
if (name === 'fromuptime') if (name === 'fromuptime')
name = 'field11' name = 'submit_date_timestamp'
else if (name === 'similarityscore') else if (name === 'similarityscore')
name = 'similarity_score' name = 'similarity_score'
else if (name === 'fromusername') else if (name === 'fromusername')
name = 'fromuserid' name = 'field1'
sortname.value = name sortname.value = name
sortorder.value = value.order === 'ascend' ? 'asc' : 'desc' sortorder.value = value.order === 'ascend' ? 'asc' : 'desc'
@ -526,7 +567,7 @@ async function handlePageChange(currentPage) {
return return
const { pageSize } = pagination const { pageSize } = pagination
pagination.page = currentPage pagination.page = currentPage
await query(currentPage, pageSize) await query(currentPage, pageSize,{},props.taskvalue)
} }
async function handlePageSizeChange(currentPageSize) { async function handlePageSizeChange(currentPageSize) {
if (loading.value) if (loading.value)
@ -535,7 +576,7 @@ async function handlePageSizeChange(currentPageSize) {
const { page } = pagination const { page } = pagination
pagination.pageSize = currentPageSize pagination.pageSize = currentPageSize
await query(page, currentPageSize) await query(page, currentPageSize,{},props.taskvalue)
} }
function handleCheck(rowKeys: DataTableRowKey[]) { function handleCheck(rowKeys: DataTableRowKey[]) {
@ -576,8 +617,20 @@ const maxHeight = computed(() => {
return tableData.value.length ? `${unref(deviceHeight)}px` : 'auto' return tableData.value.length ? `${unref(deviceHeight)}px` : 'auto'
}) })
query(pagination.page, pagination.pageSize) const scrollX = computed(() => {
const table = unref(tableRef)
if (!table)
return
const tableEl: any = table?.$el
const wrapper = tableEl.querySelector('.n-data-table-wrapper')
// const arr = columnsRef.value.filter(item => !item.fixed)
let width = 0
columnsRef.value.forEach((item) => {
width += Number(item.width) || 200
})
return width
})
const customTabelRef = ref(null) const customTabelRef = ref(null)
const importExcelRef = ref(null) const importExcelRef = ref(null)
const notPassModalRef = ref(null) // const notPassModalRef = ref(null) //
@ -684,7 +737,10 @@ function validate(items: any[]) {
} }
function goDetail(row) { function goDetail(row) {
router.push({ name: 'final-detail', query: { id: row.id, packageid: row.packageid } }) router.push({
name: 'final-detail',
query: { id: row.id, packageid: row.packageid, taskindex: row.taskIndex,type:'table' },
})
} }
function resetHandler() { function resetHandler() {
@ -817,8 +873,10 @@ function reload() {
selectionIds.value = [] selectionIds.value = []
checkedRowKeys.value = [] checkedRowKeys.value = []
const { page, pageSize } = unref(tableRef.value?.pagination) as PaginationProps const { page, pageSize } = unref(
query(page!, pageSize!) tableRef.value?.pagination,
) as PaginationProps
query(page!, pageSize!,{},props.taskvalue)
} }
watch( watch(
@ -829,6 +887,13 @@ watch(
{ deep: true }, { deep: true },
) )
watch(
() => finalStore.listKey,
(newVal, oldVal) => {
refreshHandler()
},
)
function reset() { function reset() {
pagination.page = 1 pagination.page = 1
pagination.pageCount = 1 pagination.pageCount = 1
@ -836,18 +901,81 @@ function reset() {
async function refreshHandler(searchId?: any) { async function refreshHandler(searchId?: any) {
reset() reset()
query(pagination.page, pagination.pageSize, searchId) let searchKeyword = ''
if (searchContent) {
const id_param = searchContent.match(/-\d+-/)
if (id_param)
searchKeyword = id_param[0].slice(1, -1)
}
console.log('refreshHandler', searchKeyword)
query(pagination.page, pagination.pageSize, searchId, searchKeyword)
} }
function filterTableData(keyword) { function filterTableData(keyword) {
pagination.page = 1 pagination.page = 1
pagination.pageSize = 10 pagination.pageSize = 10
if (keyword) if (keyword)
// tableData.value = tableData.value.filter(item => item.id.includes(keyword))
query(pagination.page, pagination.pageSize, '', keyword) query(pagination.page, pagination.pageSize, '', keyword)
else else query(pagination.page, pagination.pageSize)
query(pagination.page, pagination.pageSize) }
async function initData(pageSize, page, filterId?: any,
taskName?: string) {
const asideParmas = unref(finalStore.getAsideValue)
if (asideParmas.izyear) {
asideParmas.izuptime = cloneDeep(asideParmas.izyear)
if (typeof asideParmas.izuptime == 'object') {
asideParmas.izuptime[0] = dayjs(asideParmas.izuptime[0]).format(
'YYYY/MM/DD',
)
asideParmas.izuptime[1] = dayjs(asideParmas.izuptime[1]).format(
'YYYY/MM/DD',
)
asideParmas.izuptime = asideParmas.izuptime.join('-')
delete asideParmas.izyear
}
}
// 使使
// let params = filterId ? { userSearchId: filterId } : asideParmas
let params = asideParmas
if (params?.izshowall == true)
{
params.isFail = true
delete params.izshowall;
}
const result = await getFinalList({
sortorder: sortorder.value,
pageSize,
currPage: page,
sortname: sortname.value,
taskName,
...params,
})
const { data, pageCount, totalCount } = result
tableData.value = data
total.value = totalCount
pagination.page = page
pagination.pageCount = Math.ceil(totalCount / pageSize)
loading.value = false
} }
onMounted(() => {
// query(pagination.page, pagination.pageSize);
const asideParmas = cloneDeep(unref(finalStore.getAsideValue))
console.log(asideParmas)
emitter.on('filter-final', refreshHandler)
getColumns()
if (asideParmas == null) {
initData(1, 20,{},props.taskvalue)
}
else {
reset()
filterTableData(props.taskvalue)
}
// alert(1)
nextTick(() => {
computeListHeight()
})
})
defineExpose({ defineExpose({
filterTableData, filterTableData,
}) })
@ -858,7 +986,12 @@ defineExpose({
<div class="wrapper-header"> <div class="wrapper-header">
<div class="wrapper-header-left"> <div class="wrapper-header-left">
<span class="wrapper-header-font">任务管理列表</span> <span class="wrapper-header-font">任务管理列表</span>
<SvgIcon size="16" name="list-mode" @click="changeContent" /> <SvgIcon
style="cursor: pointer"
size="16"
name="list-mode"
@click="changeContent"
/>
</div> </div>
<div> <div>
<SvgIcon <SvgIcon
@ -918,10 +1051,14 @@ defineExpose({
<SvgIcon size="20" name="import" /><span style="margin-left: 5px">批量导入数据</span> <SvgIcon size="20" name="import" /><span style="margin-left: 5px">批量导入数据</span>
</li> </li>
<li @click="exportHandler"> <li @click="exportHandler">
<SvgIcon size="20" name="download" /><span style="margin-left: 5px">导出待审数据</span> <SvgIcon size="20" name="download" /><span
style="margin-left: 5px"
>导出待审数据</span>
</li> </li>
<li> <li>
<SvgIcon size="20" name="download" /><span style="margin-left: 5px">导出全部数据</span> <SvgIcon size="20" name="download" /><span
style="margin-left: 5px"
>导出全部数据</span>
</li> </li>
<li> <li>
<SvgIcon size="20" name="look" /><span style="margin-left: 5px">查看导入记录</span> <SvgIcon size="20" name="look" /><span style="margin-left: 5px">查看导入记录</span>
@ -930,6 +1067,9 @@ defineExpose({
</n-popover> </n-popover>
</div> </div>
</div> </div>
<div class="header_data">
<DataHeader :has-color="true" />
</div>
<!-- <div class="wrapper-statistic"> <!-- <div class="wrapper-statistic">
<div v-for="i in 7" :key="i" class="item"> <div v-for="i in 7" :key="i" class="item">
<div class="icon" /> <div class="icon" />
@ -953,11 +1093,12 @@ defineExpose({
</div> </div>
<div class="wrapper-content"> <div class="wrapper-content">
<NDataTable <NDataTable
id="table"
ref="tableRef" ref="tableRef"
v-model:checked-row-keys="checkedRowKeys" v-model:checked-row-keys="checkedRowKeys"
remote remote
:columns="columnsRef" :columns="columnsRef"
:scroll-x="1250" :scroll-x="scrollX"
:max-height="maxHeight" :max-height="maxHeight"
:data="tableData" :data="tableData"
:loading="loading" :loading="loading"
@ -1018,6 +1159,7 @@ defineExpose({
border-radius: 8px; border-radius: 8px;
cursor: pointer; cursor: pointer;
} }
.wrapper { .wrapper {
display: flex; display: flex;
flex: 1; flex: 1;
@ -1163,13 +1305,20 @@ defineExpose({
background: #fff; background: #fff;
} }
} }
:deep(.n-data-table .n-data-table-td.n-data-table-td--fixed-right) { :deep(.n-data-table .n-data-table-td.n-data-table-td--fixed-right) {
z-index: 100 !important; z-index: 100 !important;
} }
:deep(.n-data-table-th__title) { :deep(.n-data-table-th__title) {
color: #333; color: #333;
} }
:deep(.n-data-table .n-data-table-td) { :deep(.n-data-table .n-data-table-td) {
color: #666; color: #666;
} }
:deep(.n-data-table .n-data-table-base-table-header) {
overflow: hidden;
}
</style> </style>

File diff suppressed because it is too large Load Diff

@ -1,28 +1,56 @@
<script lang="ts" setup> <script lang="ts" setup>
import { ref } from 'vue' import { ref , onMounted} from 'vue'
import Aside from './aside/Aside.vue' import Aside from './aside/Aside.vue'
import Content from './content/Content.vue' import Content from './content/Content.vue'
import ListContent from './content/ListContent.vue' import ListContent from './content/ListContent.vue'
import Robot from '@/components/Robot/index.vue'
const showList = ref(false); defineOptions({
const contentRef:any = ref(null); name: 'FinalMain',
const inputChange = (keyword)=>{ })
contentRef.value.filterTableData(keyword) const showList = ref(true)
const contentRef: any = ref(null)
const ListRef: any = ref(null)
const asideref=ref(null)
const taskvalue=ref("")
function inputChange(keyword) {
if(asideref.value?.showSearch){
taskvalue.value=keyword
}else{
taskvalue.value=""
} }
if (ListRef.value!=null) {
ListRef.value.initData(1,20,{},keyword);
} else {
contentRef.value.filterTableData(keyword);
}
}
onMounted(()=>{
const searchParams = new URLSearchParams(window.location.search);
const type = searchParams.get('type');
if(type=='table'){
showList.value=false
}else{
showList.value=true
}
})
</script> </script>
<template> <template>
<div class="main"> <div class="main">
<!-- 侧边 --> <!-- 侧边 -->
<Aside @inputChange="inputChange" /> <Aside ref="asideref" @input-change="inputChange" />
<!-- 内容 -->
<Content @changeShow="showList=true" ref="contentRef" />
<!-- 任务管理 --> <!-- 任务管理 -->
<!-- TODO:本地演示即可 上传注释注释 --> <!-- TODO:本地演示即可 上传注释注释 -->
<!-- <ListContent /> --> <ListContent v-if="showList" ref="ListRef" @change-show="showList = false" :taskvalue="taskvalue"/>
<!-- 内容 -->
<Content v-if="!showList" ref="contentRef" @change-show="showList = true" :taskvalue="taskvalue"/>
<!-- 机器人 -->
<Robot />
</div> </div>
</template> </template>

@ -10,109 +10,112 @@ import {
shallowRef, shallowRef,
unref, unref,
watch, watch,
} from "vue"; } from 'vue'
import { CustomFilterModalVue, FilterModalVue, NewFilterModalVue } from "./comp/modals"; import dayjs from 'dayjs'
import Search from "./comp/Search.vue"; import { cloneDeep, isEqual } from 'lodash-es'
import AdvanceFilter from "./comp/AdvanceFilter.vue"; import { CustomFilterModalVue, FilterModalVue, NewFilterModalVue } from './comp/modals'
import { getViewportOffset } from "@/utils/domUtils"; import Search from './comp/Search.vue'
import { useWindowSizeFn } from "@/hooks/event/useWindowSizeFn"; import AdvanceFilter from './comp/AdvanceFilter.vue'
import { useConfig } from "@/store/modules/asideConfig"; import { getViewportOffset } from '@/utils/domUtils'
import type { Filter } from "/#/home"; import { useWindowSizeFn } from '@/hooks/event/useWindowSizeFn'
import type { AsideEntity } from "@/config/aside"; import { useConfig } from '@/store/modules/asideConfig'
import { asideMap } from "@/config/aside"; import type { Filter } from '/#/home'
import type { AsideConfig } from "/#/api"; import type { AsideEntity } from '@/config/aside'
import emitter from "@/utils/mitt"; import { asideMap } from '@/config/aside'
import { getFilterList } from "@/api/home/main"; import type { AsideConfig } from '/#/api'
import dayjs from "dayjs"; import emitter from '@/utils/mitt'
import { cloneDeep, isEqual } from "lodash-es"; import { getFilterList } from '@/api/home/main'
import { useKeydown } from '@/hooks/event/useKeydown'
const configStore = useConfig();
const configStore = useConfig()
// //
let asideValue: Record<keyof typeof asideMap, any> = reactive({}); const asideValue: Record<keyof typeof asideMap, any> = reactive({})
// : // :
const asideVisible: Partial<Record<keyof AsideConfig, boolean>> = reactive({}); const asideVisible: Partial<Record<keyof AsideConfig, boolean>> = reactive({})
// //
const showItems = shallowRef<{ key: string; config: AsideEntity }[]>([]); const showItems = shallowRef<{ key: string, config: AsideEntity }[]>([])
Object.keys(asideMap).forEach((key) => { Object.keys(asideMap).forEach((key) => {
const entity = asideMap[key]; const entity = asideMap[key]
const { defaultValue } = entity; const { defaultValue } = entity
asideValue[key] = defaultValue; asideValue[key] = defaultValue
}); })
const filterModalRef: any = ref(null); const filterModalRef: any = ref(null)
const newFilterModalRef = ref(null); const newFilterModalRef = ref(null)
const customModalRef = ref(null); const customModalRef = ref(null)
const customObjRef = ref<any>(null); // const customObjRef = ref<any>(null) //
const customTempObjRef = ref<any>(null); // () const customTempObjRef = ref<any>(null) // ()
const configFilterRef = ref<any>([]); // const configFilterRef = ref<any>([]) //
const AdvanceFilterRef: any = ref(null); const AdvanceFilterRef: any = ref(null)
function showModal(modalRef: any) { function showModal(modalRef: any) {
const modal = unref(modalRef)! as any; const modal = unref(modalRef)! as any
modal.showModal(); modal.showModal()
} }
onMounted(() => { onMounted(() => {
nextTick(() => { nextTick(() => {
computeSlideHeight(); computeSlideHeight()
let tempAsideValue = cloneDeep(asideValue); const tempAsideValue = cloneDeep(asideValue)
// configStore.setAsideValue(tempAsideValue); // configStore.setAsideValue(tempAsideValue);
console.log("asideMap和asideValue", tempAsideValue); console.log('asideMap和asideValue', tempAsideValue)
}); })
}); })
const collapse = ref(false); const collapse = ref(false)
const mousetrap = inject("mousetrap") as any; const mousetrap = inject('mousetrap') as any
mousetrap.bind("[", collapseHandler); mousetrap.bind('[', collapseHandler)
function collapseHandler() { function collapseHandler() {
collapse.value = !collapse.value; collapse.value = !collapse.value
} }
const asideWidth = computed(() => { const asideWidth = computed(() => {
return collapse.value ? 0 : 308; return collapse.value ? 0 : 308
}); })
const asideHeight = ref(500); const asideHeight = ref(500)
const asideStyle = computed(() => { const asideStyle = computed(() => {
return { return {
width: `${asideWidth.value}px`, width: `${asideWidth.value}px`,
height: `${asideHeight.value}px`, height: `${asideHeight.value}px`,
}; }
}); })
const collapseIcon = computed(() => { const collapseIcon = computed(() => {
return collapse.value ? "expand-cir" : "collapse-cir"; return collapse.value ? 'expand-cir' : 'collapse-cir'
}); })
function computeSlideHeight() { function computeSlideHeight() {
const headEl = document.querySelector(".aside-header")!; const headEl = document.querySelector('.aside-header')!
const { bottomIncludeBody } = getViewportOffset(headEl); const { bottomIncludeBody } = getViewportOffset(headEl)
const height = bottomIncludeBody; const height = bottomIncludeBody
asideHeight.value = height - 24; asideHeight.value = height - 24
} }
useWindowSizeFn(computeSlideHeight, 280); useWindowSizeFn(computeSlideHeight, 280)
onBeforeMount(async () => { onBeforeMount(async () => {
configStore.fetchConfig(); configStore.fetchConfig()
configStore.fetchCustomConfig(); configStore.fetchCustomConfig()
}); })
configStore.$subscribe(() => { nextTick(() => {
const config = configStore.getConfig; configStore.$subscribe(() => {
const customConfig = configStore.getCustomConfig; const config = configStore.getConfig
const customConfig = configStore.getCustomConfig
if ( if (
configFilterRef.value.length > 0 && configFilterRef.value.length > 0
isEqual(configFilterRef.value, configStore.getFilterConfig) && && isEqual(configFilterRef.value, configStore.getFilterConfig)
customObjRef.value && && customObjRef.value
isEqual(customObjRef.value, customTempObjRef.value) && isEqual(customObjRef.value, customTempObjRef.value)
) { )
return; return
}
if (config == null || customConfig == null) return; if (config == null || customConfig == null)
return
// console.log("config", config, "customConfig", customConfig); // console.log("config", config, "customConfig", customConfig);
/* rao /* rao
const showKeys = [...customConfig].filter(key => !asideMap[key].isDefaultFilter)// customConfig isDefaultFilter const showKeys = [...customConfig].filter(key => !asideMap[key].isDefaultFilter)// customConfig isDefaultFilter
@ -120,151 +123,170 @@ configStore.$subscribe(() => {
showKeys.unshift(...defaultKeys) showKeys.unshift(...defaultKeys)
*/ */
let sortKeyList: any = []; const sortKeyList: any = []
configStore.getFilterConfig.map((item: any) => { configStore.getFilterConfig.map((item: any) => {
sortKeyList.push(item.id); sortKeyList.push(item?.id)
}); return item
const showKeys = [...sortKeyList]; })
const showKeys = [...sortKeyList]
Object.keys(config).forEach((key) => { Object.keys(config).forEach((key) => {
if (key.startsWith("iz") && asideMap[key] !== undefined) if (key.startsWith('iz') && asideMap[key] !== undefined) {
asideVisible[key] = asideVisible[key]
(showKeys.includes(key) || asideMap[key].isDefaultFilter) && config[key] === "Y"; = (showKeys.includes(key) || asideMap[key].isDefaultFilter)
}); && config[key] === 'Y'
}
})
if (customObjRef.value) { if (customObjRef.value) {
// //
Object.keys(customObjRef.value).map((key) => { Object.keys(customObjRef.value).map((key) => {
if (asideMap.hasOwnProperty(key)) { // TODO hasOwnProperty
const str = key.toLowerCase(); // if (asideMap.hasOwnProperty(key)) {
if (Object.prototype.hasOwnProperty.call(customObjRef.value, key)) {
const str = key.toLowerCase()
// console.log("customObjRef.value[str]1111111111111", customObjRef.value[str]); // console.log("customObjRef.value[str]1111111111111", customObjRef.value[str]);
if (str == "izsimilarity") { if (str == 'izsimilarity') {
if (typeof customObjRef.value[str] == "string") { if (typeof customObjRef.value[str] == 'string')
customObjRef.value[str] = customObjRef.value[str].split(","); customObjRef.value[str] = customObjRef.value[str].split(',')
asideValue[key] = customObjRef.value[str] //
console.log('相似度2222222222', asideValue[key])
} }
asideValue[key] = customObjRef.value[str]; // else if (str == 'izyear') {
console.log("相似度2222222222", asideValue[key]); if (typeof customObjRef.value[str] == 'string') {
} else if (str == "izyear") { const time = customObjRef.value[str].split('-')
if (typeof customObjRef.value[str] == "string") { time[0] = new Date(time[0]).getTime()
let time = customObjRef.value[str].split("-"); time[1] = new Date(time[1]).getTime()
time[0] = new Date(time[0]).getTime(); customObjRef.value[str] = time
time[1] = new Date(time[1]).getTime();
customObjRef.value[str] = time;
} }
asideValue[key] = customObjRef.value[str]; // asideValue[key] = customObjRef.value[str] //
console.log("时间2222222222", asideValue[key]); console.log('时间2222222222', asideValue[key])
} else if (str != "izsimilarity" && str != "izyear" && customObjRef.value[str]) { }
console.log("customObjRef.value[str]222222", customObjRef.value[str]); else if (
str != 'izsimilarity'
&& str != 'izyear'
&& customObjRef.value[str]
) {
console.log('customObjRef.value[str]222222', customObjRef.value[str])
// let list = customObjRef.value[str].split(','); // let list = customObjRef.value[str].split(',');
// console.log("list222222", list); // console.log("list222222", list);
asideValue[key] = customObjRef.value[str]; // asideValue[key] = customObjRef.value[str] //
} else { }
asideValue[key] = null; else {
asideValue[key] = null
} }
// asideMap[str].defaultValue = customObjRef.value[str];// // asideMap[str].defaultValue = customObjRef.value[str];//
} }
}); return key
customTempObjRef.value = customObjRef.value; })
console.log("asideValue直接处理后的结果", asideValue); customTempObjRef.value = customObjRef.value
console.log("customTempObjRef.value", customTempObjRef.value); console.log('asideValue直接处理后的结果', asideValue)
let tempobj = cloneDeep(asideValue); console.log('customTempObjRef.value', customTempObjRef.value)
console.log("tempObj", tempobj); const tempobj = cloneDeep(asideValue)
configStore.setAsideValue(tempobj); console.log('tempObj', tempobj)
configStore.setAsideValue(tempobj)
} }
// console.log("showKeys", showKeys); // console.log("showKeys", showKeys);
const items = showKeys.reduce((acc, key) => { const items = showKeys.reduce((acc, key) => {
const { render } = asideMap[key]; const currentData = asideMap[key]
const render = currentData?.render
if (render !== false) { if (render !== false) {
const str = key.toLowerCase(); const str = key?.toLowerCase()
const o = { const o = {
key: str, key: str,
config: asideMap[str], config: asideMap[str],
};
return [...acc, o];
} else {
return acc;
} }
}, []); return [...acc, o]
console.log("showItems=================================", items); }
showItems.value = items; else {
configFilterRef.value = configStore.getFilterConfig; return acc
}); }
}, [])
const asideEnter = ref(false); console.log('showItems=================================', items)
showItems.value = items
configFilterRef.value = configStore.getFilterConfig
})
})
const asideEnter = ref(false)
const showCollapse = computed(() => { const showCollapse = computed(() => {
return collapse.value ? true : asideEnter.value; return collapse.value ? true : asideEnter.value
}); })
const showSearch = ref(false); const showSearch = ref(false)
function setShowSearch(value: boolean) { function setShowSearch(value: boolean) {
showSearch.value = value; showSearch.value = value
} }
const newFilterOk = () => { function newFilterOk() {
filterModalRef.value.query( filterModalRef.value.query(
filterModalRef.value.pagination.page, filterModalRef.value.pagination.page,
filterModalRef.value.pagination.pageSize filterModalRef.value.pagination.pageSize,
); )
}; filterModalRef.value.showModal()
}
// key // key
function scrollHandler(key: string) { function scrollHandler(key: string) {
const element = document.querySelector(`#${key}`); const element = document.querySelector(`#${key}`)
element?.scrollIntoView(true); element?.scrollIntoView(true)
} }
// -> // ->
async function filterHandler(searchId: string) { async function filterHandler(searchId: string) {
// emitter.emit('filter', searchId) // emitter.emit('filter', searchId)
const res = await getFilterList({ userSearchId: searchId }); const res = await getFilterList({ userSearchId: searchId })
// console.log("", res); // console.log("", res);
if (res.code == "OK") { if (res.code == 'OK') {
let obj = res.data; const obj = res.data
customObjRef.value = res.data; customObjRef.value = res.data
let showKeys: any[] = []; const showKeys: any[] = []
Object.keys(obj).map((key) => { Object.keys(obj).map((key) => {
if (asideMap.hasOwnProperty(key)) { // TODO hasOwnProperty
showKeys.push(key); // if (asideMap.hasOwnProperty(key)) {
} if (Object.prototype.hasOwnProperty.call(asideMap, key))
}); showKeys.push(key)
return key
})
// console.log(showKeys); // console.log(showKeys);
configStore.setCustomConfig(showKeys); configStore.setCustomConfig(showKeys)
} }
} }
function editFilter(filter: any) { function editFilter(filter: any) {
const modal = unref(newFilterModalRef)! as any; const modal = unref(newFilterModalRef)! as any
modal.showModal(); modal.showModal()
modal.edit(filter); modal.edit(filter)
} }
function updateComponent(key, e) { function updateComponent(key, e) {
console.log("跟新值", key, e); console.log('跟新值', key, e)
console.log("tempAsideValue跟新值", configStore.getAsideValue, asideValue); console.log('tempAsideValue跟新值', configStore.getAsideValue, asideValue)
// let tempAsideValue = configStore.getAsideValue || asideValue; // let tempAsideValue = configStore.getAsideValue || asideValue;
let tempobj = cloneDeep(asideValue); const tempobj = cloneDeep(asideValue)
console.log(tempobj, "tempobj"); console.log(tempobj, 'tempobj')
tempobj[key] = e; tempobj[key] = e
console.log(tempobj, "tempobj After"); console.log(tempobj, 'tempobj After')
customObjRef.value = tempobj; customObjRef.value = tempobj
// asideValue = Object.assign({}, asideValue, tempobj); // asideValue = Object.assign({}, asideValue, tempobj);
console.log("asideValue跟新值", tempobj); console.log('asideValue跟新值', tempobj)
configStore.setAsideValue(tempobj); configStore.setAsideValue(tempobj)
} }
const handleOk = (item: any) => { function handleOk(item: any) {
console.log("handleOk", item); console.log('handleOk', item)
if (item) { if (item) {
AdvanceFilterRef.value.setCurrentlySelectedAdvanced(item.searchname); AdvanceFilterRef.value.setCurrentlySelectedAdvanced(item.searchname)
filterHandler(item.id); filterHandler(item.id)
} else {
AdvanceFilterRef.value.setCurrentlySelectedAdvanced("高级筛选");
filterHandler("");
} }
}; else {
AdvanceFilterRef.value.setCurrentlySelectedAdvanced('高级筛选')
filterHandler('')
}
}
useKeydown('s', () => setShowSearch(true))
// watch(asideValue, (newVal) => { // watch(asideValue, (newVal) => {
// console.log("asideValue", newVal); // console.log("asideValue", newVal);
// configStore.setAsideValue(newVal) // configStore.setAsideValue(newVal)
@ -294,22 +316,22 @@ const handleOk = (item: any) => {
<!-- 高级筛选 --> <!-- 高级筛选 -->
<AdvanceFilter <AdvanceFilter
v-show="!showSearch" v-show="!showSearch"
ref="AdvanceFilterRef"
:type="0" :type="0"
@select="filterHandler" @select="filterHandler"
@update:search="setShowSearch(true)" @update:search="setShowSearch(true)"
@show-custom="showModal(customModalRef)" @show-custom="showModal(customModalRef)"
@show-filter="showModal(filterModalRef)" @show-filter="showModal(filterModalRef)"
ref="AdvanceFilterRef"
/> />
</div> </div>
<component <component
:is="item.config.component" :is="item.config?.component"
v-for="(item, index) in showItems" v-for="item in showItems"
:id="item.key" :id="item.key"
:key="item.key" :key="item.key"
v-model:value="asideValue[item.key]" v-model:value="asideValue[item.key]"
:label="item.config.label" :label="item.config?.label"
@update:value="(e) => updateComponent(item.key, e)" @update:value="(e) => updateComponent(item.key, e)"
/> />
@ -318,10 +340,10 @@ const handleOk = (item: any) => {
ref="filterModalRef" ref="filterModalRef"
@edit-filter="editFilter" @edit-filter="editFilter"
@show-new-filter="showModal(newFilterModalRef)" @show-new-filter="showModal(newFilterModalRef)"
@handleOk="handleOk" @handle-ok="handleOk"
/> />
<!-- 新增过滤 --> <!-- 新增过滤 -->
<NewFilterModalVue ref="newFilterModalRef" @onOk="newFilterOk" /> <NewFilterModalVue ref="newFilterModalRef" @on-ok="newFilterOk" />
<!-- 筛选 --> <!-- 筛选 -->
<CustomFilterModalVue ref="customModalRef" /> <CustomFilterModalVue ref="customModalRef" />
</n-scrollbar> </n-scrollbar>
@ -343,6 +365,7 @@ const handleOk = (item: any) => {
width: 100%; width: 100%;
border-bottom: 1px solid #e8e8e8; border-bottom: 1px solid #e8e8e8;
margin-bottom: 15px; margin-bottom: 15px;
height: 58px;
} }
&-divider { &-divider {

@ -1,14 +1,14 @@
<script lang="ts" setup> <script lang="ts" setup>
import { favorite, getConditionList, unfavorite, sort } from "@/api/home/filter"; import { useInfiniteScroll } from '@vueuse/core'
import { asideMap } from "@/config/aside"; import { debounce } from 'lodash-es'
import { useInfiniteScroll } from "@vueuse/core"; import { onMounted, reactive, ref, watch } from 'vue'
import { debounce } from "lodash-es"; import type { FilterSearchParam } from '/#/api'
import { onMounted, reactive, ref, watch } from "vue"; import type { Filter, FilterEntity } from '/#/home'
import type { FilterSearchParam } from "/#/api"; import { VueDraggable } from 'vue-draggable-plus'
import type { Filter, FilterEntity } from "/#/home"; import { asideMap } from '@/config/aside'
import { VueDraggable } from "vue-draggable-plus"; import { favorite, getConditionList, sort, unfavorite } from '@/api/home/filter'
defineOptions({ name: "AdvanceFilter" }); defineOptions({ name: 'AdvanceFilter' })
const props = defineProps({ const props = defineProps({
type: { type: {
@ -16,43 +16,42 @@ const props = defineProps({
default: 0, default: 0,
required: true, required: true,
}, },
}); })
const ruleForm = reactive({
keyword: "",
});
const ruleformRef = ref();
const emit = defineEmits<{ const emit = defineEmits<{
(e: "show-filter"): void; (e: 'show-filter'): void
(e: "show-custom"): void; (e: 'show-custom'): void
(e: "update:search"): void; (e: 'update:search'): void
(e: "select", id: string); (e: 'select', id: string)
}>(); }>()
const ruleForm = reactive({
const data = ref<FilterEntity[]>([]); keyword: '',
const unData = ref<FilterEntity[]>([]); })
const loading = ref(false); const ruleformRef = ref()
const canloadMore = true; const data = ref<FilterEntity[]>([])
const el = ref<HTMLDivElement | null>(null); const unData = ref<FilterEntity[]>([])
const popover = ref<ComponentRef | null>(null); const loading = ref(false)
const canloadMore = true
const el = ref<HTMLDivElement | null>(null)
const popover = ref<ComponentRef | null>(null)
const pagination = reactive({ const pagination = reactive({
pageNo: 1, pageNo: 1,
pageSize: 300, pageSize: 300,
}); })
const keyword = ref(""); const keyword = ref('')
const currentlySelectedAdvanced = ref("高级筛选"); const currentlySelectedAdvanced = ref('高级筛选')
onMounted(() => { onMounted(() => {
// data.value = generateDefaultConfig() // data.value = generateDefaultConfig()
}); })
// //
function generateDefaultConfig(): FilterEntity[] { function generateDefaultConfig(): FilterEntity[] {
return Object.keys(asideMap).reduce((acc, key) => { return Object.keys(asideMap).reduce((acc, key) => {
const { label, defaultValue, isDefaultFilter } = asideMap[key]; const { label, defaultValue, isDefaultFilter } = asideMap[key]
if (isDefaultFilter === true) { if (isDefaultFilter === true) {
const config = { const config = {
id: "", id: '',
name: label, name: label,
favorite: false, favorite: false,
isDefaultFilter, isDefaultFilter,
@ -62,70 +61,73 @@ function generateDefaultConfig(): FilterEntity[] {
value: defaultValue, value: defaultValue,
}, },
], ],
};
return [...acc, config];
} else {
return acc;
} }
}, []); return [...acc, config]
}
else {
return acc
}
}, [])
} }
useInfiniteScroll( useInfiniteScroll(
el as any, el as any,
() => { () => {
loadMore(); loadMore()
}, },
{ distance: 10, interval: 300, canLoadMore: () => false } { distance: 10, interval: 300, canLoadMore: () => false },
); )
const showClick = async () => { async function showClick() {
getSearchedList(""); getSearchedList('')
}; }
async function loadMore() { async function loadMore() {
if (loading.value || el.value == null) return; if (loading.value || el.value == null)
return
const more = await featchList(); const more = await featchList()
if (more.length === 0) return; if (more.length === 0)
return
data.value.push(...more); data.value.push(...more)
} }
async function featchList() { async function featchList() {
loading.value = true; loading.value = true
try { try {
const searchParam: FilterSearchParam = { const searchParam: FilterSearchParam = {
search_searchname: { value: ruleForm.keyword, op: "like", type: "string" }, search_searchname: { value: ruleForm.keyword, op: 'like', type: 'string' },
}; }
const result = await getConditionList(pagination, searchParam, props.type); const result = await getConditionList(pagination, searchParam, props.type)
const { data } = result; const { data } = result
// pagination.pageNo += 1 // pagination.pageNo += 1
// canloadMore = pageCount >= pagination.pageNo // canloadMore = pageCount >= pagination.pageNo
const entityList = generateFilterEntityList(data); const entityList = generateFilterEntityList(data)
return entityList; return entityList
} catch (error) { }
return []; catch (error) {
} finally { return []
loading.value = false; }
finally {
loading.value = false
} }
} }
// //
function generateFilterEntityList(data) { function generateFilterEntityList(data) {
const filterEntityList = data.map((item) => { const filterEntityList = data.map((item) => {
const { searchname, iztop, ocrUsersearchchildList, id, reorder } = item; const { searchname, iztop, ocrUsersearchchildList, id, reorder } = item
const list = ocrUsersearchchildList.map((item) => { const list = ocrUsersearchchildList.map((item) => {
const { searchfield, searchvalue } = item; const { searchfield, searchvalue } = item
return { return {
key: searchfield, key: searchfield,
value: searchvalue, value: searchvalue,
}; }
}); })
const reg = new RegExp(ruleForm.keyword, "gi"); const reg = new RegExp(ruleForm.keyword, 'gi')
const hilightText = searchname.replace(reg, `<span>${ruleForm.keyword}</span>`); const hilightText = searchname.replace(reg, `<span>${ruleForm.keyword}</span>`)
return { return {
id, id,
@ -135,131 +137,127 @@ function generateFilterEntityList(data) {
filterList: list, filterList: list,
reorder, reorder,
searchname, searchname,
}; }
}); })
return filterEntityList; return filterEntityList
} }
function selectHandler(item: FilterEntity) { function selectHandler(item: FilterEntity) {
(popover.value as any).setShow(false); (popover.value as any).setShow(false)
currentlySelectedAdvanced.value = item.searchname; currentlySelectedAdvanced.value = item.searchname
emit("select", item.id); emit('select', item.id)
} }
const inputHandler = debounce((word) => { const inputHandler = debounce((word) => {
ruleForm.keyword = word; ruleForm.keyword = word
ruleformRef.value.validate(); ruleformRef.value.validate()
if (word.length < 2 && word) { if (word.length < 2 && word)
return; return
}
getSearchedList(word); getSearchedList(word)
}, 300); }, 300)
function getSearchedList(word, isScroll = false) { function getSearchedList(word, isScroll = false) {
if (word) { if (word)
pagination.pageSize = 300; pagination.pageSize = 300
}
if (!word) { if (!word)
pagination.pageSize = 10; pagination.pageSize = 10
}
if (isScroll) { if (isScroll)
pagination.pageSize = 300; pagination.pageSize = 300
}
ruleForm.keyword = word; ruleForm.keyword = word
featchList().then((list) => { featchList().then((list) => {
let dataArr: FilterEntity[] = []; const dataArr: FilterEntity[] = []
let unDataArr: FilterEntity[] = []; const unDataArr: FilterEntity[] = []
list.map((item) => { list.forEach((item) => {
if (item.favorite && !item.isDefaultFilter) { if (item.favorite && !item.isDefaultFilter)
dataArr.push(item); dataArr.push(item)
}
if (!item.favorite && !item.isDefaultFilter) { if (!item.favorite && !item.isDefaultFilter)
unDataArr.push(item); unDataArr.push(item)
} })
});
data.value = dataArr.sort( data.value = dataArr.sort(
(a, b) => Number(new Date(a.createtime)) - Number(new Date(b.createtime)) (a, b) => Number(new Date(a.createtime)) - Number(new Date(b.createtime)),
); )
unData.value = unDataArr.sort( unData.value = unDataArr.sort(
(a, b) => Number((a as any).reorder) - Number((b as any).reorder) (a, b) => Number((a as any).reorder) - Number((b as any).reorder),
); )
}); })
} }
function favoriteHandler(event: MouseEvent, item: any) { function favoriteHandler(event: MouseEvent, item: any) {
event.stopImmediatePropagation(); event.stopImmediatePropagation()
event.stopPropagation(); event.stopPropagation()
const { isDefaultFilter, id } = item; const { isDefaultFilter, id } = item
if (!isDefaultFilter) { if (!isDefaultFilter) {
item.favorite = true; item.favorite = true
favorite(id); favorite(id)
data.value.map((v, index) => { data.value.forEach((v, index) => {
if (v.id == id) { if (v.id == id)
sort(v.id, 0); sort(v.id, 0)
} else { else sort(v.id, index + 1)
sort(v.id, index + 1); })
}
}); inputHandler(ruleForm.keyword)
inputHandler(ruleForm.keyword);
} }
} }
const rules = { const rules = {
keyword: [ keyword: [
{ {
trigger: ["blur", "input", "change"], trigger: ['blur', 'input', 'change'],
level: "error", level: 'error',
validator(_rule, value) { validator(_rule, value) {
if (value.length >= 2) { if (value.length >= 2)
return true; return true
} else { else return new Error('搜索关键字最少为两个')
return new Error("搜索关键字最少为两个");
}
}, },
}, },
], ],
}; }
function unFavoriteHandler(event: MouseEvent, item) { function unFavoriteHandler(event: MouseEvent, item) {
event.stopImmediatePropagation(); event.stopImmediatePropagation()
event.stopPropagation(); event.stopPropagation()
const { isDefaultFilter, id } = item; const { isDefaultFilter, id } = item
if (!isDefaultFilter) { if (!isDefaultFilter) {
item.favorite = false; item.favorite = false
unfavorite(id); unfavorite(id)
inputHandler(ruleForm.keyword); inputHandler(ruleForm.keyword)
} }
} }
const handleScroll = (event) => { function handleScroll(event) {
let timer; let timer
if (timer) { if (timer) {
clearTimeout(timer); clearTimeout(timer)
} else { }
else {
timer = setTimeout(() => { timer = setTimeout(() => {
getSearchedList("", true); getSearchedList('', true)
}, 2000); }, 2000)
} }
}; }
const moveEnd = () => { function moveEnd() {
unData.value.map((v, index) => { unData.value.forEach((v, index) => {
sort(v.id, index); sort(v.id, index)
}); })
}; }
const setCurrentlySelectedAdvanced = (value:string)=>{ function setCurrentlySelectedAdvanced(value: string) {
currentlySelectedAdvanced.value = value; currentlySelectedAdvanced.value = value
} }
defineExpose({ defineExpose({
setCurrentlySelectedAdvanced setCurrentlySelectedAdvanced,
}) })
</script> </script>
@ -277,9 +275,20 @@ defineExpose({
> >
<template #trigger> <template #trigger>
<div class="wrapper-left-dropdown" @click="showClick"> <div class="wrapper-left-dropdown" @click="showClick">
<span style="font-size: 20px; color: #333333; font-weight: Medium">{{ <n-tooltip trigger="hover">
currentlySelectedAdvanced <template #trigger>
}}</span> <span
style="
color: #333333;
font-weight: Medium;
font-size: 17px;
font-weight: 600;
"
>{{ currentlySelectedAdvanced }}</span>
</template>
{{ currentlySelectedAdvanced }}
</n-tooltip>
<SvgIcon <SvgIcon
:style="{ marginLeft: '5px' }" :style="{ marginLeft: '5px' }"
name="down" name="down"
@ -290,21 +299,25 @@ defineExpose({
</template> </template>
<n-spin :show="loading"> <n-spin :show="loading">
<div class="wrapper-left-popover"> <div class="wrapper-left-popover">
<n-form :rules="rules" ref="ruleformRef" :model="ruleForm"> <n-form ref="ruleformRef" :rules="rules" :model="ruleForm">
<n-form-item path="keyword"> <n-form-item path="keyword">
<n-input <n-input
:style="{ '--n-border': '0px', '--n-display': 'block' }" :style="{
placeholder="请输入关键字" '--n-border': '0px',
@input="inputHandler" '--n-display': 'block',
'--n-height': '40px',
}"
placeholder="请输入关键词"
:value="ruleForm.keyword" :value="ruleForm.keyword"
:minlength="2" :minlength="2"
@input="inputHandler"
> >
<template #prefix> <template #prefix>
<SvgIcon size="14px" name="magnifying-1" /> <SvgIcon size="14px" name="magnifying-1" />
</template> </template>
<template #suffix> <template #suffix>
<SvgIcon <SvgIcon
size="14px" size="16"
style="cursor: pointer" style="cursor: pointer"
name="setting" name="setting"
@click="emit('show-filter')" @click="emit('show-filter')"
@ -323,7 +336,7 @@ defineExpose({
> >
<SvgIcon <SvgIcon
name="drag" name="drag"
size="18" size="13"
color="#333333" color="#333333"
style="margin-right: 3px" style="margin-right: 3px"
/> />
@ -331,44 +344,44 @@ defineExpose({
v-if="item.favorite && !item.isDefaultFilter" v-if="item.favorite && !item.isDefaultFilter"
name="favorite-fill" name="favorite-fill"
color="#fd9b0a" color="#fd9b0a"
width="13" size="18"
height="12"
style="margin-right: 3px" style="margin-right: 3px"
@click="unFavoriteHandler($event, item)" @click="unFavoriteHandler($event, item)"
/> />
<SvgIcon <SvgIcon
v-else-if="!item.favorite && !item.isDefaultFilter" v-else-if="!item.favorite && !item.isDefaultFilter"
name="favorite-unfill" name="favorite-unfill"
width="13" size="18"
height="12"
style="margin-right: 3px" style="margin-right: 3px"
@click="favoriteHandler($event, item)" @click="favoriteHandler($event, item)"
/> />
<div v-html="item.name" style="color: #333333" /> <div
style="color: #333333; white-space: nowrap; overflow: hidden"
v-html="item.name"
/>
</li> </li>
<!-- filter=".draggable-li[draggable='false']" --> <!-- filter=".draggable-li[draggable='false']" -->
<VueDraggable <VueDraggable
@end="moveEnd"
v-model="unData" v-model="unData"
class="draggable-ul" class="draggable-ul"
:animation="150" :animation="150"
group="shared" group="shared"
@end="moveEnd"
> >
<li <li
v-for="(item, index) in unData" v-for="(item, index) in unData"
:key="index" :key="index"
style="display: flex; align-items: center" style="display: flex; align-items: center"
@click="selectHandler(item)"
class="cursor-move draggable-li fix" class="cursor-move draggable-li fix"
:draggable="true" :draggable="true"
@click="selectHandler(item)"
> >
<SvgIcon name="drag" size="18" style="margin-right: 3px" /> <SvgIcon name="drag" size="13" style="margin-right: 3px" />
<SvgIcon <SvgIcon
v-if="item.favorite && !item.isDefaultFilter" v-if="item.favorite && !item.isDefaultFilter"
name="favorite-fill" name="favorite-fill"
color="#fd9b0a" color="#fd9b0a"
width="13" size="18"
height="12"
fill="#666666" fill="#666666"
style="cursor: pointer !important; margin-right: 3px" style="cursor: pointer !important; margin-right: 3px"
@click="unFavoriteHandler($event, item)" @click="unFavoriteHandler($event, item)"
@ -376,13 +389,15 @@ defineExpose({
<SvgIcon <SvgIcon
v-else-if="!item.favorite && !item.isDefaultFilter" v-else-if="!item.favorite && !item.isDefaultFilter"
name="favorite-unfill" name="favorite-unfill"
width="13" size="18"
height="12"
fill="#666666" fill="#666666"
style="cursor: pointer !important; margin-right: 3px" style="cursor: pointer !important; margin-right: 3px"
@click="favoriteHandler($event, item)" @click="favoriteHandler($event, item)"
/> />
<div v-html="item.name" style="color: #333333" /> <div
style="color: #333333; white-space: nowrap; overflow: hidden"
v-html="item.name"
/>
</li> </li>
</VueDraggable> </VueDraggable>
</ul> </ul>
@ -412,7 +427,14 @@ defineExpose({
display: flex; display: flex;
justify-content: space-between; justify-content: space-between;
align-items: center; align-items: center;
position: absolute;
width: 100%;
padding: 17px 16px;
border-bottom: 1px solid #e8e8e8;
z-index: 10;
background: #ffffff;
left: 0;
top:0;
&-left { &-left {
display: flex; display: flex;
align-items: center; align-items: center;
@ -423,6 +445,12 @@ defineExpose({
align-items: center; align-items: center;
margin-left: 12px; margin-left: 12px;
cursor: pointer; cursor: pointer;
span {
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
width: 120px;
}
} }
&-popvoer { &-popvoer {
@ -461,6 +489,16 @@ defineExpose({
align-items: center; align-items: center;
} }
} }
.wrapper-left-popover {
width: 248px;
height: 288px;
position: absolute;
left: 0;
top: -10px;
border: 1px solid #f3f8ff;
z-index: 10000;
background: #fff;
}
::v-deep(.wrapper-left-popover .n-form-item) { ::v-deep(.wrapper-left-popover .n-form-item) {
display: block !important; display: block !important;
} }

@ -1,9 +1,11 @@
<script lang="ts" setup> <script lang="ts" setup>
import { ref } from 'vue' import { nextTick, onMounted, ref, watch } from 'vue'
import { debounce } from 'lodash-es' import { debounce } from 'lodash-es'
import { useRoute, useRouter } from 'vue-router'
import { asideMap } from '@/config/aside' import { asideMap } from '@/config/aside'
import type { SearchEntity } from '/#/home' import type { SearchEntity } from '/#/home'
import { useConfig } from '@/store/modules/asideConfig' import { useConfig } from '@/store/modules/asideConfig'
import { useFinal } from '@/store/modules/final'
defineOptions({ name: 'Search' }) defineOptions({ name: 'Search' })
@ -11,16 +13,22 @@ const emit = defineEmits<{
(e: 'close'): void (e: 'close'): void
(e: 'select', key: string): void (e: 'select', key: string): void
(e: 'inputChange', value: string): void (e: 'inputChange', value: string): void
(e: 'showSearch'): void
}>() }>()
const finalStore = useFinal()
const router = useRouter()
const route = useRoute()
const searchContent = route.query.searchContent as string
const data = ref<SearchEntity[]>([]) const data = ref<SearchEntity[]>([])
const popover = ref<ComponentRef | null>(null) const popover = ref<ComponentRef | null>(null)
const configStore = useConfig() const configStore = useConfig()
const searchKeyword = ref('') const searchKeyword = ref('')
const inputHandler = debounce((keyword) => { const inputHandler = debounce((keyword) => {
searchKeyword.value = keyword; searchKeyword.value = keyword
emit('inputChange',keyword) emit('inputChange', keyword)
}, 300) }, 300)
configStore.$subscribe(() => { configStore.$subscribe(() => {
@ -35,7 +43,7 @@ configStore.$subscribe(() => {
return return
const list = keys.map((key) => { const list = keys.map((key) => {
const name = asideMap[key].label const name = asideMap[key]?.label
return { return {
key, key,
@ -52,29 +60,60 @@ function selectHandler(item: SearchEntity) {
} }
// //
const searchName = () => { function searchName() {
configStore.setSearchValue(searchKeyword.value); configStore.setSearchValue(searchKeyword.value)
emit('inputChange',searchKeyword.value); finalStore.setSearchValue(searchKeyword.value)
emit('inputChange', searchKeyword.value)
} }
const close = () => { function close() {
searchKeyword.value = ""; searchKeyword.value = ''
configStore.setSearchValue(searchKeyword.value); configStore.setSearchValue(searchKeyword.value)
emit('close'); finalStore.setSearchValue(searchKeyword.value)
if (searchContent)
router.replace(route.path)
emit('close')
} }
function initSerach() {
if (searchContent) {
emit('showSearch')
const id_param = searchContent.match(/-\d+-/)
if (id_param) {
searchKeyword.value = id_param[0].slice(1, -1)
emit('inputChange', searchKeyword.value)
}
}
}
onMounted(() => {
initSerach()
})
</script> </script>
<template> <template>
<div class="wrapper"> <div class="wrapper">
<n-popover <n-popover
ref="popover" :style="{ padding: '0px' }" style="width: 248px" :show-arrow="false" placement="bottom-start" ref="popover"
:style="{ padding: '0px' }"
style="width: 248px"
:show-arrow="false"
placement="bottom-start"
trigger="focus" trigger="focus"
> >
<template #trigger> <template #trigger>
<n-input v-model:value="searchKeyword" style="width: 260px;height: 32px;" placeholder="请输入你需要搜索的内容" @input="inputHandler"> <n-input
v-model:value="searchKeyword"
style="width: 260px; height: 32px"
placeholder="请输入你需要搜索的内容"
@input="inputHandler"
>
<template #suffix> <template #suffix>
<SvgIcon size="14px" name="magnifying-1" @click="searchName" style="cursor: pointer;" /> <SvgIcon
size="14px"
name="magnifying-1"
style="cursor: pointer"
@click="searchName"
/>
</template> </template>
</n-input> </n-input>
</template> </template>
@ -87,7 +126,12 @@ const close = () => {
</div> --> </div> -->
</n-popover> </n-popover>
<SvgIcon size="16px" style="margin-left: 6px;cursor: pointer;" name="clear" @click="close" /> <SvgIcon
size="16px"
style="margin-left: 6px; cursor: pointer"
name="clear"
@click="close"
/>
</div> </div>
</template> </template>

@ -106,7 +106,7 @@ const handleDrop = async (e) => {
<div v-show="figureHovered" class="wrapper-figure-tools"> <div v-show="figureHovered" class="wrapper-figure-tools">
<SvgIcon size="28" name="view" @click="previewHandler" /> <SvgIcon size="28" name="view" @click="previewHandler" />
<div class="wrapper-figure-line" /> <div class="wrapper-figure-line" />
<SvgIcon size="28" name="delete" @click="clearHandler" /> <SvgIcon size="28" name="white_delete" @click="clearHandler" />
</div> </div>
</div> </div>
</n-upload-dragger> </n-upload-dragger>

@ -66,7 +66,7 @@ function onChange(value: Array<string>) {
<template> <template>
<n-form :model="formValue" style="padding: 0px 10px;" :rules="rules"> <n-form :model="formValue" style="padding: 0px 10px;" :rules="rules">
<n-form-item :label="label" path="plans" :label-style="labStyle"> <n-form-item :label="label" path="plans" :label-style="labStyle">
<n-select filterable <n-select filterable clearable
v-model:value="formValue.plans" :max-tag-count="2" placeholder="请选择审核状态" multiple v-model:value="formValue.plans" :max-tag-count="2" placeholder="请选择审核状态" multiple
:options="options" @update:value="onChange" :options="options" @update:value="onChange"
/> />

@ -74,7 +74,7 @@ function onChange(value: Array<string>) {
<template> <template>
<n-form :model="formValue" style="padding: 0px 10px;" :rules="rules"> <n-form :model="formValue" style="padding: 0px 10px;" :rules="rules">
<n-form-item :label="label" path="plans" :label-style="labStyle"> <n-form-item :label="label" path="plans" :label-style="labStyle">
<n-select filterable <n-select filterable clearable
v-model:value="formValue.plans" :max-tag-count="2" placeholder="请选择拜访客户级别" multiple v-model:value="formValue.plans" :max-tag-count="2" placeholder="请选择拜访客户级别" multiple
:options="options" @update:value="onChange" :options="options" @update:value="onChange"
/> />

@ -71,7 +71,7 @@ function onChange(value: Array<string>) {
<template> <template>
<n-form :model="formValue" style="padding: 0px 10px;" :rules="rules"> <n-form :model="formValue" style="padding: 0px 10px;" :rules="rules">
<n-form-item :label="label" path="plans" :label-style="labStyle"> <n-form-item :label="label" path="plans" :label-style="labStyle">
<n-select filterable <n-select filterable clearable
v-model:value="formValue.plans" :max-tag-count="2" placeholder="请选择拜访客户名称" multiple v-model:value="formValue.plans" :max-tag-count="2" placeholder="请选择拜访客户名称" multiple
:options="options" @update:value="onChange" :options="options" @update:value="onChange"
/> />

@ -70,7 +70,7 @@ function onChange(value: Array<string>) {
<template> <template>
<n-form :model="formValue" style="padding: 0px 10px;" :rules="rules"> <n-form :model="formValue" style="padding: 0px 10px;" :rules="rules">
<n-form-item :label="label" path="plans" :label-style="labStyle"> <n-form-item :label="label" path="plans" :label-style="labStyle">
<n-select filterable <n-select filterable clearable
v-model:value="formValue.plans" :max-tag-count="2" placeholder="请选择拜访客户类型" multiple v-model:value="formValue.plans" :max-tag-count="2" placeholder="请选择拜访客户类型" multiple
:options="options" @update:value="onChange" :options="options" @update:value="onChange"
/> />

@ -70,7 +70,7 @@ function onChange(value: Array<string>) {
<template> <template>
<n-form :model="formValue" style="padding: 0px 10px;" :rules="rules"> <n-form :model="formValue" style="padding: 0px 10px;" :rules="rules">
<n-form-item :label="label" path="plans" :label-style="labStyle"> <n-form-item :label="label" path="plans" :label-style="labStyle">
<n-select filterable <n-select filterable clearable
v-model:value="formValue.plans" :max-tag-count="2" placeholder="请选择产品名称" multiple v-model:value="formValue.plans" :max-tag-count="2" placeholder="请选择产品名称" multiple
:options="options" @update:value="onChange" :options="options" @update:value="onChange"
/> />

@ -3,6 +3,7 @@ import { onBeforeMount, onMounted, ref } from 'vue'
import type { FormItemRule, FormRules } from 'naive-ui' import type { FormItemRule, FormRules } from 'naive-ui'
import { useDictionary } from '@/store/modules/dictonary' import { useDictionary } from '@/store/modules/dictonary'
import { useConfig } from '@/store/modules/asideConfig' import { useConfig } from '@/store/modules/asideConfig'
import { useFinal } from '@/store/modules/final'
const configUseStore = useConfig() const configUseStore = useConfig()
@ -24,6 +25,27 @@ configUseStore.$subscribe(() => {
formValue.value.plans = []; formValue.value.plans = [];
} }
}); });
const finalStore = useFinal()
finalStore.$subscribe(() => {
if(isLoadValue.value) {
isLoadValue.value = false;
return
}
let asideValue = finalStore.getAsideValue;
if(asideValue && asideValue['izproject']) {
if(typeof asideValue['izproject'] == "string") {
let list = asideValue['izproject'].split(',');
formValue.value.plans = list;
}else {
formValue.value.plans = asideValue['izproject'];
}
console.log("formValue.value.izproject", formValue.value.plans);
}else {
formValue.value.plans = [];
}
});
const props = defineProps<{ const props = defineProps<{
value: string[] | null value: string[] | null
label: string label: string
@ -71,7 +93,7 @@ function onChange(value: Array<string>) {
<template> <template>
<n-form :model="formValue" style="padding: 0px 10px;" :rules="rules"> <n-form :model="formValue" style="padding: 0px 10px;" :rules="rules">
<n-form-item :label="label" path="plans" :label-style="labStyle"> <n-form-item :label="label" path="plans" :label-style="labStyle">
<n-select filterable <n-select filterable clearable
v-model:value="formValue.plans" :max-tag-count="2" placeholder="请选择所属项目" multiple v-model:value="formValue.plans" :max-tag-count="2" placeholder="请选择所属项目" multiple
:options="options" @update:value="onChange" :options="options" @update:value="onChange"
/> />

@ -0,0 +1,46 @@
<script lang="ts" setup>
import { ref } from 'vue'
import { useConfig } from '@/store/modules/asideConfig'
const props = defineProps({
value: {
type: Boolean,
default: false,
},
label: {
type: String,
default: '',
},
})
const emit = defineEmits<{
(e: 'update:value', value: boolean): void
}>()
const configStore = useConfig()
const download = ref(props.value)
function onChange(value: boolean) {
emit('update:value', value)
}
</script>
<template>
<div class="download">
<span class="download-title">{{ label }}</span>
<n-switch v-model:value="download" @update:value="onChange" />
</div>
</template>
<style lang="less" scoped>
.download {
display: flex;
padding: 10px;
justify-content: space-between;
&-title {
font-weight: bold;
}
}
</style>

@ -3,6 +3,7 @@ import { onBeforeMount, onMounted, ref } from 'vue'
import type { FormRules } from 'naive-ui' import type { FormRules } from 'naive-ui'
import { useDictionary } from '@/store/modules/dictonary' import { useDictionary } from '@/store/modules/dictonary'
import { useConfig } from '@/store/modules/asideConfig' import { useConfig } from '@/store/modules/asideConfig'
import { useFinal } from '@/store/modules/final'
const configUseStore = useConfig() const configUseStore = useConfig()
@ -24,6 +25,27 @@ configUseStore.$subscribe(() => {
formValue.value.plans = []; formValue.value.plans = [];
} }
}); });
const finalStore = useFinal()
finalStore.$subscribe(() => {
if(isLoadValue.value) {
isLoadValue.value = false;
return
}
let asideValue = finalStore.getAsideValue;
if(asideValue && asideValue['izstatus']) {
if(typeof asideValue['izstatus'] == "string") {
let list = asideValue['izstatus'].split(',');
formValue.value.plans = list;
}else {
formValue.value.plans = asideValue['izstatus'];
}
console.log("formValue.value.izstatus", formValue.value.plans);
}else {
formValue.value.plans = [];
}
});
const props = defineProps<{ const props = defineProps<{
value: string[] | null value: string[] | null
label: string label: string
@ -70,7 +92,7 @@ function onChange(value: Array<string>) {
<template> <template>
<n-form :model="formValue" style="padding: 0px 10px;" :rules="rules"> <n-form :model="formValue" style="padding: 0px 10px;" :rules="rules">
<n-form-item :label="label" path="plans" :label-style="labStyle"> <n-form-item :label="label" path="plans" :label-style="labStyle">
<n-select filterable <n-select filterable clearable
v-model:value="formValue.plans" :max-tag-count="2" placeholder="请选择审核状态" multiple v-model:value="formValue.plans" :max-tag-count="2" placeholder="请选择审核状态" multiple
:options="options" @update:value="onChange" :options="options" @update:value="onChange"
/> />

@ -70,7 +70,7 @@ function onChange(value: Array<string>) {
<template> <template>
<n-form :model="formValue" style="padding: 0px 10px;" :rules="rules"> <n-form :model="formValue" style="padding: 0px 10px;" :rules="rules">
<n-form-item :label="label" path="plans" :label-style="labStyle"> <n-form-item :label="label" path="plans" :label-style="labStyle">
<n-select filterable <n-select filterable clearable
v-model:value="formValue.plans" :max-tag-count="2" placeholder="请选择发布地区" multiple v-model:value="formValue.plans" :max-tag-count="2" placeholder="请选择发布地区" multiple
:options="options" @update:value="onChange" :options="options" @update:value="onChange"
/> />

@ -70,7 +70,7 @@ function onChange(value: Array<string>) {
<template> <template>
<n-form :model="formValue" style="padding: 0px 10px;" :rules="rules"> <n-form :model="formValue" style="padding: 0px 10px;" :rules="rules">
<n-form-item :label="label" path="plans" :label-style="labStyle"> <n-form-item :label="label" path="plans" :label-style="labStyle">
<n-select filterable <n-select filterable clearable
v-model:value="formValue.plans" :max-tag-count="2" placeholder="请选择厂商" multiple v-model:value="formValue.plans" :max-tag-count="2" placeholder="请选择厂商" multiple
:options="options" @update:value="onChange" :options="options" @update:value="onChange"
/> />

@ -3,6 +3,7 @@ import { onBeforeMount, onMounted, ref } from 'vue'
import { type FormItemRule, type FormRules, faIR } from 'naive-ui' import { type FormItemRule, type FormRules, faIR } from 'naive-ui'
import { useDictionary } from '@/store/modules/dictonary' import { useDictionary } from '@/store/modules/dictonary'
import { useConfig } from '@/store/modules/asideConfig' import { useConfig } from '@/store/modules/asideConfig'
import { useFinal } from '@/store/modules/final'
const configUseStore = useConfig() const configUseStore = useConfig()
@ -26,6 +27,27 @@ configUseStore.$subscribe(() => {
formValue.value.plans = []; formValue.value.plans = [];
} }
}); });
const finalStore = useFinal()
finalStore.$subscribe(() => {
if(isLoadValue.value) {
isLoadValue.value = false;
return
}
let asideValue = finalStore.getAsideValue;
if(asideValue && asideValue['iztaskrrom']) {
if(typeof asideValue['iztaskrrom'] == "string") {
let list = asideValue['iztaskrrom'].split(',');
formValue.value.plans = list;
}else {
formValue.value.plans = asideValue['iztaskrrom'];
}
console.log("formValue.value.iztaskrrom", formValue.value.plans);
}else {
formValue.value.plans = [];
}
});
const props = defineProps<{ const props = defineProps<{
value: string[] | null value: string[] | null
label: string label: string
@ -72,7 +94,7 @@ function onChange(value: Array<string>) {
<template> <template>
<n-form :model="formValue" style="padding: 0px 10px;" :rules="rules"> <n-form :model="formValue" style="padding: 0px 10px;" :rules="rules">
<n-form-item :label="label" path="plans" :label-style="labStyle"> <n-form-item :label="label" path="plans" :label-style="labStyle">
<n-select filterable <n-select filterable clearable
v-model:value="formValue.plans" :max-tag-count="2" placeholder="请选择任务来源" multiple :options="options" v-model:value="formValue.plans" :max-tag-count="2" placeholder="请选择任务来源" multiple :options="options"
@update:value="onChange" @update:value="onChange"
/> />

@ -57,7 +57,7 @@ const labStyle = {
} }
onBeforeMount(async () => { onBeforeMount(async () => {
const list = await configStore.fetchIztaskstatusList() const list = await configStore.fetchizstatusListt()
options.value = list options.value = list
}) })
const isLoadValue = ref(false) const isLoadValue = ref(false)
@ -71,7 +71,7 @@ function onChange(value: Array<string>) {
<n-form :model="formValue" style="padding: 0px 10px;" :rules="rules"> <n-form :model="formValue" style="padding: 0px 10px;" :rules="rules">
<n-form-item :label="label" path="plans" :label-style="labStyle"> <n-form-item :label="label" path="plans" :label-style="labStyle">
<n-select filterable <n-select filterable
v-model:value="formValue.plans" :max-tag-count="2" placeholder="请选择任务状态" multiple :options="options" v-model:value="formValue.plans" :max-tag-count="2" placeholder="请选择任务审批状态" multiple :options="options"
@update:value="onChange" @update:value="onChange"
/> />
</n-form-item> </n-form-item>

@ -70,7 +70,7 @@ function onChange(value: Array<string>) {
<template> <template>
<n-form :model="formValue" style="padding: 0px 10px;" :rules="rules"> <n-form :model="formValue" style="padding: 0px 10px;" :rules="rules">
<n-form-item :label="label" path="plans" :label-style="labStyle"> <n-form-item :label="label" path="plans" :label-style="labStyle">
<n-select filterable <n-select filterable clearable
v-model:value="formValue.plans" :max-tag-count="2" placeholder="请选择省份" multiple :options="options" v-model:value="formValue.plans" :max-tag-count="2" placeholder="请选择省份" multiple :options="options"
@update:value="onChange" @update:value="onChange"
/> />

@ -3,6 +3,7 @@ import { onBeforeMount, onMounted, ref } from 'vue'
import type { FormItemRule, FormRules } from 'naive-ui' import type { FormItemRule, FormRules } from 'naive-ui'
import { useDictionary } from '@/store/modules/dictonary' import { useDictionary } from '@/store/modules/dictonary'
import { useConfig } from '@/store/modules/asideConfig' import { useConfig } from '@/store/modules/asideConfig'
import { useFinal } from '@/store/modules/final'
const configUseStore = useConfig() const configUseStore = useConfig()
@ -24,6 +25,27 @@ configUseStore.$subscribe(() => {
formValue.value.plans = []; formValue.value.plans = [];
} }
}); });
const finalStore = useFinal()
finalStore.$subscribe(() => {
if(isLoadValue.value) {
isLoadValue.value = false;
return
}
let asideValue = finalStore.getAsideValue;
if(asideValue && asideValue['izplan']) {
if(typeof asideValue['izplan'] == "string") {
let list = asideValue['izplan'].split(',');
formValue.value.plans = list;
}else {
formValue.value.plans = asideValue['izplan'];
}
console.log("formValue.value.izplan", formValue.value.plans);
}else {
formValue.value.plans = [];
}
});
const props = defineProps<{ const props = defineProps<{
value: string[] | null value: string[] | null
label: string label: string
@ -70,7 +92,7 @@ function onChange(value: Array<string>) {
<template> <template>
<n-form :model="formValue" style="padding: 0px 10px;" :rules="rules"> <n-form :model="formValue" style="padding: 0px 10px;" :rules="rules">
<n-form-item :label="label" path="plans" :label-style="labStyle"> <n-form-item :label="label" path="plans" :label-style="labStyle">
<n-select filterable <n-select filterable clearable
v-model:value="formValue.plans" :max-tag-count="2" placeholder="请选择计划" multiple :options="planOptons" v-model:value="formValue.plans" :max-tag-count="2" placeholder="请选择计划" multiple :options="planOptons"
@update:value="onChange" @update:value="onChange"
/> />

@ -3,6 +3,7 @@ import { onBeforeMount, onMounted, onUpdated, ref } from 'vue'
import type { FormItemRule, FormRules } from 'naive-ui' import type { FormItemRule, FormRules } from 'naive-ui'
import { useDictionary } from '@/store/modules/dictonary' import { useDictionary } from '@/store/modules/dictonary'
import { useConfig } from '@/store/modules/asideConfig' import { useConfig } from '@/store/modules/asideConfig'
import { useFinal } from '@/store/modules/final'
const configUseStore = useConfig() const configUseStore = useConfig()
@ -26,6 +27,27 @@ configUseStore.$subscribe(() => {
} }
}); });
const finalStore = useFinal()
finalStore.$subscribe(() => {
let asideValue = finalStore.getAsideValue;
console.log("asideValue接受到的", asideValue);
if(isLoadValue.value) {
isLoadValue.value = false;
return
}
if(asideValue && asideValue['izupuser']) {
if(typeof asideValue['izupuser'] == "string") {
let list = asideValue['izupuser'].split(',');
formValue.value.users = list;
}else {
formValue.value.users = asideValue['izupuser'];
}
console.log("formValue.value.users222222222222222", formValue.value.users);
}else {
formValue.value.users = [];
}
});
const props = defineProps<{ const props = defineProps<{
value: string[] | null value: string[] | null
label: string label: string
@ -76,7 +98,7 @@ function onChange(value: Array<string>) {
<n-form :model="formValue" style="padding: 0px 10px;" :rules="rules"> <n-form :model="formValue" style="padding: 0px 10px;" :rules="rules">
<n-form-item :label="label" path="users" :label-style="labStyle"> <n-form-item :label="label" path="users" :label-style="labStyle">
<n-select filterable <n-select filterable
clearable
v-model:value="formValue.users" :max-tag-count="2" multiple placeholder="请选择提报人(可多选)" v-model:value="formValue.users" :max-tag-count="2" multiple placeholder="请选择提报人(可多选)"
:options="personOptions" @update:value="onChange" :options="personOptions" @update:value="onChange"
/> />

@ -1,47 +1,49 @@
<script lang="ts" setup> <script lang="ts" setup>
import { ref } from "vue"; import { ref } from 'vue'
import { useConfig } from "@/store/modules/asideConfig"; import { useConfig } from '@/store/modules/asideConfig'
const configUseStore = useConfig(); const props = defineProps<{
value: [number, number]
label: string
}>()
const emit = defineEmits<{
(e: 'update:value', value: string): void
}>()
const range = ref<[number, number]>(props.value || [])
const marks = {
0: '0',
50: '50',
100: '100',
}
const isLoadValue = ref(false)
const configUseStore = useConfig()
configUseStore.$subscribe(() => { configUseStore.$subscribe(() => {
if (isLoadValue.value) { if (isLoadValue.value) {
isLoadValue.value = false; isLoadValue.value = false
return; return
}
let asideValue = configUseStore.getAsideValue;
if(asideValue['izsimilarity']) {
range.value = asideValue['izsimilarity']
}else {
range.value = [0, 100];
} }
const asideValue = configUseStore.getAsideValue
if (asideValue.izsimilarity)
range.value = asideValue.izsimilarity
else
range.value = [0, 100]
console.log(range.value, 'range.value') console.log(range.value, 'range.value')
// else { // else {
// range.value = [0, 100]; // range.value = [0, 100];
// } // }
}); })
const props = defineProps<{
value: [number, number];
label: string;
}>();
const emit = defineEmits<{
(e: "update:value", value: string): void;
}>();
const range = ref<[number, number]>(props.value || []);
const marks = {
0: "0",
50: "50",
100: "100",
};
const isLoadValue = ref(false);
function onChange(value: number & number[]) { function onChange(value: number & number[]) {
range.value = value as any; value = value.sort((a, b) => a - b)
isLoadValue.value = true; range.value = value as any
let valueStr = value.join("-"); isLoadValue.value = true
emit("update:value", valueStr); const valueStr = value.join('-')
emit('update:value', valueStr)
} }
</script> </script>

@ -1,54 +1,71 @@
<script lang="ts" setup> <script lang="ts" setup>
import dayjs from 'dayjs'; import dayjs from "dayjs";
import { onUpdated, watch } from 'vue'; import { onUpdated, watch } from "vue";
import { onMounted, ref } from 'vue'; import { onMounted, ref } from "vue";
import { useConfig } from '@/store/modules/asideConfig' import { useConfig } from "@/store/modules/asideConfig";
import { useFinal } from '@/store/modules/final'
const configUseStore = useConfig() const configUseStore = useConfig();
configUseStore.$subscribe(() => { configUseStore.$subscribe(() => {
if(isLoadValue.value) { if (isLoadValue.value) {
isLoadValue.value = false; isLoadValue.value = false;
return return;
} }
let asideValue = configUseStore.getAsideValue; let asideValue = configUseStore.getAsideValue;
if(asideValue['izyear']) { if (asideValue["izyear"]) {
time.value = asideValue['izyear'] time.value = asideValue["izyear"];
}else { } else {
time.value = null; time.value = null;
} }
}); });
const finalStore = useFinal()
finalStore.$subscribe(() => {
if (isLoadValue.value) {
isLoadValue.value = false;
return;
}
let asideValue = finalStore.getAsideValue;
console.log("asideValue izyear", asideValue);
if (asideValue && asideValue["izyear"]) {
time.value = asideValue["izyear"];
} else {
time.value = null;
}
});
const props = defineProps<{ const props = defineProps<{
value: [number, number] | null value: [number, number] | null;
label: string label: string;
}>() }>();
const emit = defineEmits<{ const emit = defineEmits<{
(e: 'update:value', value: number[]): void (e: "update:value", value: number[]): void;
}>() }>();
const time = ref<[number, number] | null>(props.value) const time = ref<[number, number] | null>(props.value);
const isLoadValue = ref(false) const isLoadValue = ref(false);
function onChange(value: [number, number]) { function onChange(value: [number, number]) {
isLoadValue.value = true; isLoadValue.value = true;
emit('update:value', value) emit("update:value", value);
} }
onMounted(() => { onMounted(() => {
if(!props.value) { if (!props.value) {
// //
const currentDate = dayjs(); const currentDate = dayjs();
// //
const endDate = currentDate.toDate(); const endDate = currentDate.toDate();
const startDate = currentDate.subtract(3, 'month').toDate(); const startDate = currentDate.subtract(3, "month").toDate();
// //
time.value = [startDate.getTime(), endDate.getTime()]; time.value = [startDate.getTime(), endDate.getTime()];
console.log('time init', startDate.getTime(), endDate.getTime()); console.log("time init", startDate.getTime(), endDate.getTime());
setTimeout(() => { setTimeout(() => {
emit('update:value', [startDate.getTime(), endDate.getTime()]) emit("update:value", [startDate.getTime(), endDate.getTime()]);
},300) }, 300);
} }
}) });
</script> </script>
<template> <template>
@ -56,10 +73,14 @@ onMounted(() => {
<n-collapse :default-expanded-names="['1']" arrow-placement="right"> <n-collapse :default-expanded-names="['1']" arrow-placement="right">
<n-collapse-item :title="label" name="1"> <n-collapse-item :title="label" name="1">
<n-space> <n-space>
<n-date-picker v-model:value="time" type="daterange" clearable @update:value="onChange"> <n-date-picker
<template #separator> v-model:value="time"
type="daterange"
</template> :clearable="false"
@update:value="onChange"
placeholder="请选择"
>
<template #separator> </template>
</n-date-picker> </n-date-picker>
</n-space> </n-space>
</n-collapse-item> </n-collapse-item>
@ -78,5 +99,21 @@ onMounted(() => {
::v-deep(.n-input__separator) { ::v-deep(.n-input__separator) {
color: #999999 !important; color: #999999 !important;
; }
}</style> ::v-deep(.n-collapse
.n-collapse-item:not(.n-collapse-item--disabled).n-collapse-item--trigger-area-main
.n-collapse-item__header
.n-collapse-item__header-main) {
margin-left: 10px;
}
::v-deep(.n-collapse
.n-collapse-item:not(.n-collapse-item--disabled).n-collapse-item--trigger-area-main
.n-collapse-item__header
.n-collapse-item__header-main::before) {
content: "*";
position: absolute;
left: 0;
top: 2px;
color: red;
}
</style>

@ -20,6 +20,6 @@ import ReportUserVue from './ReportUser.vue'
import SimilarityVue from './Similarity.vue' import SimilarityVue from './Similarity.vue'
import TimeVue from './Time.vue' import TimeVue from './Time.vue'
import IzApprovalStatus from './IzApprovalStatus.vue' import IzApprovalStatus from './IzApprovalStatus.vue'
import IzShowAll from './IzShowAll.vue'
export { IzProjecttype, IzStatus, IzVisitcity, IzCustomlevel, IzCustomtype, IzCustomname, IzfirmVue, IzProductVue, IzvisitproVue, IztaskstatusVue, IztaskrromVue, IzProjectVue, PictureDownloadVue, PictureUploadVue, PlaceHolderVue, RegionVue, SimilarityVue, ReportUserVue, PlanVue, PictureTypeVue, TimeVue, IzApprovalStatus } export { IzProjecttype, IzStatus, IzVisitcity, IzCustomlevel, IzCustomtype, IzCustomname, IzfirmVue, IzProductVue, IzvisitproVue, IztaskstatusVue, IztaskrromVue, IzProjectVue, PictureDownloadVue, PictureUploadVue, PlaceHolderVue, RegionVue, SimilarityVue, ReportUserVue, PlanVue, PictureTypeVue, TimeVue, IzApprovalStatus, IzShowAll }

@ -14,6 +14,13 @@ const configStore = useConfig()
const checkAll = ref(false) const checkAll = ref(false)
const selectIds = ref<string[]>([]) const selectIds = ref<string[]>([])
const tempList = ref<string[]>([]) const tempList = ref<string[]>([])
//
const offList = ref<any[]>([])
//
const onList = ref<any[]>([])
const offKeyword = ref('')
const onKeyword = ref('')
function showModal() { function showModal() {
show.value = true show.value = true
@ -26,8 +33,6 @@ function showModal() {
return return
if (tempList.value.length > 0 && isEqual(tempList.value, configStore.getFilterConfig)) if (tempList.value.length > 0 && isEqual(tempList.value, configStore.getFilterConfig))
return return
console.log('开启了啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦筛选条件----------------', customConfig)
const { showList, hideList } = generatList(config, customConfig) const { showList, hideList } = generatList(config, customConfig)
tempList.value = cloneDeep(showList) tempList.value = cloneDeep(showList)
if (tempList.value.length > 0) if (tempList.value.length > 0)
@ -43,14 +48,11 @@ function showModal() {
} }
function closeModal() { function closeModal() {
offKeyword.value = ''
onKeyword.value = ''
show.value = false show.value = false
} }
//
const offList = ref<any[]>([])
//
const onList = ref<any[]>([])
const allCount = computed(() => { const allCount = computed(() => {
return `全部筛选(共${offList.value.length}个)` return `全部筛选(共${offList.value.length}个)`
}) })
@ -131,31 +133,28 @@ function generatList(config, customConfig) {
const fixedList = generateDefaultList(config) const fixedList = generateDefaultList(config)
offList.unshift(...fixedList) offList.unshift(...fixedList)
onList.unshift(...fixedList) onList.unshift(...fixedList)
console.log('原始筛选条件customConfig', customConfig)
// onListcustomConfig // onListcustomConfig
const tempOnList = cloneDeep(onList) const tempOnList = cloneDeep(onList)
console.log('原始筛选条件tempOnList', tempOnList)
const sortKeyList: any = [] const sortKeyList: any = []
configStore.getFilterConfig.map((item: any) => { configStore.getFilterConfig.map((item: any) => {
sortKeyList.push(item.id) sortKeyList.push(item?.id)
return item
}) })
console.log('原始筛选条件sortKeyList', sortKeyList)
const sortList: any = [] const sortList: any = []
if (sortKeyList.length > 0) { if (sortKeyList.length > 0) {
sortKeyList.map((key) => { sortKeyList.map((key) => {
const tempItem = tempOnList.find(item => item.id == key) const tempItem = tempOnList.find(item => item.id == key)
sortList.push(tempItem) sortList.push(tempItem)
return key
}) })
} }
else { else {
customConfig.map((key) => { customConfig.map((key) => {
const tempItem = tempOnList.find(item => item.id == key) const tempItem = tempOnList.find(item => item.id == key)
sortList.push(tempItem) sortList.push(tempItem)
return key
}) })
} }
console.log('原始筛选条件sortList', sortList)
console.log('原始筛选条件configStore.getFilterConfig', configStore.getFilterConfig)
// return { showList: onList, hideList: offList } // return { showList: onList, hideList: offList }
return { showList: sortList, hideList: offList } return { showList: sortList, hideList: offList }
} }
@ -166,45 +165,38 @@ configStore.$subscribe(() => {
if (config == null || customConfig == null) if (config == null || customConfig == null)
return return
console.log('tempList.value-----------', tempList.value)
console.log('configStore.getFilterConfig-----------', configStore.getFilterConfig)
if (tempList.value.length > 0 && isEqual(tempList.value, configStore.getFilterConfig)) if (tempList.value.length > 0 && isEqual(tempList.value, configStore.getFilterConfig))
return return
const { showList, hideList } = generatList(config, customConfig) const { showList, hideList } = generatList(config, customConfig)
tempList.value = cloneDeep(showList) tempList.value = cloneDeep(showList)
console.log('克隆条件', tempList.value)
if (tempList.value.length > 0) if (tempList.value.length > 0)
configStore.setFilterConfig(tempList.value) configStore.setFilterConfig(tempList.value)
onList.value = hideList.filter(item => (item as any).checked)
// setTimeout(() => {
// }, 500);
onList.value = showList
offList.value = hideList offList.value = hideList
if (!showList.length)
handleSumbit()
}) })
async function handleSumbit(e: MouseEvent) { async function handleSumbit(e?: MouseEvent) {
e.preventDefault() e?.preventDefault()
const param = onList.value.map((item) => { const param = onList.value
.map((item) => {
return item.id return item.id
}).join(',') })
.join(',')
await setFilter({ searchcount: param, type: 0 }) await setFilter({ searchcount: param, type: 0 })
const obj = await configStore.fetchCustomConfig() const obj = await configStore.fetchCustomConfig()
console.log('obj-------------------------------', obj)
const tempOnList = cloneDeep(onList.value) const tempOnList = cloneDeep(onList.value)
console.log('原始筛选条件tempOnList', tempOnList)
const sortList: any = [] const sortList: any = []
obj.map((key) => { obj.map((key) => {
const tempItem = tempOnList.find(item => item.id == key) const tempItem = tempOnList.find(item => item.id == key)
sortList.push(tempItem) sortList.push(tempItem)
return key
}) })
console.log('configStore.sortList---------------', sortList)
// setTimeout(() => {
if (sortList.length > 0) if (sortList.length > 0)
configStore.setFilterConfig(sortList) configStore.setFilterConfig(sortList)
// }, 500);
closeModal() closeModal()
} }
@ -228,15 +220,14 @@ function onCheckChange(checked: any, item: any) {
if (index === -1 && checked) if (index === -1 && checked)
selectIds.value.push(item.id) selectIds.value.push(item.id)
else else index !== -1 && selectIds.value.splice(index, 1)
index !== -1 && selectIds.value.splice(index, 1)
checkAll.value = offList.value.every(item => item.checked) checkAll.value = offList.value.every(item => item.checked)
} }
const showIds = computed(() => { const showIds = computed(() => {
return onList.value.map((item) => { return onList.value.map((item) => {
return item.id return item?.id
}) })
}) })
@ -247,7 +238,10 @@ watch(
return return
const action = newVal > oldVal ? 'add' : 'remove' const action = newVal > oldVal ? 'add' : 'remove'
const diff = action === 'add' ? difference(selectIds.value, showIds.value) : difference(showIds.value, selectIds.value) const diff
= action === 'add'
? difference(selectIds.value, showIds.value)
: difference(showIds.value, selectIds.value)
if (diff.length === 0) if (diff.length === 0)
return return
@ -314,9 +308,6 @@ function removeHandler(id: string) {
onList.value.splice(index, 1) onList.value.splice(index, 1)
} }
const offKeyword = ref('')
const onKeyword = ref('')
const leftInputHandler = debounce((keyword) => { const leftInputHandler = debounce((keyword) => {
offKeyword.value = keyword offKeyword.value = keyword
}, 300) }, 300)
@ -345,7 +336,13 @@ onMounted(() => {
<template> <template>
<n-modal v-model:show="show" transform-origin="center" :mask-closable="false"> <n-modal v-model:show="show" transform-origin="center" :mask-closable="false">
<n-card class="cardstyle" :bordered="false" size="huge" role="dialog" aria-modal="true"> <n-card
class="cardstyle"
:bordered="false"
size="huge"
role="dialog"
aria-modal="true"
>
<div class="wrapper"> <div class="wrapper">
<span class="wrapper-title">自定义筛选</span> <span class="wrapper-title">自定义筛选</span>
<div class="wrapper-bar"> <div class="wrapper-bar">
@ -357,7 +354,10 @@ onMounted(() => {
<n-grid cols="24" class="mt-4 proCard" responsive="screen" :x-gap="24"> <n-grid cols="24" class="mt-4 proCard" responsive="screen" :x-gap="24">
<n-grid-item span="11"> <n-grid-item span="11">
<NCard <NCard
:title="allCount" class="dragcardStyle" :segmented="{ content: true, footer: true }" size="small" :title="allCount"
class="dragcardStyle"
:segmented="{ content: true, footer: true }"
size="small"
:bordered="false" :bordered="false"
> >
<div class="input_wrap"> <div class="input_wrap">
@ -366,17 +366,29 @@ onMounted(() => {
<SvgIcon size="14px" name="magnifying-1-color999" /> <SvgIcon size="14px" name="magnifying-1-color999" />
</template> </template>
</n-input> </n-input>
<n-scrollbar style="max-height: 500px;border: 1px solid #cad2dd;border-radius: 2px;"> <n-scrollbar
style="max-height: 500px; border: 1px solid #cad2dd; border-radius: 2px"
>
<div class="draggable-ul"> <div class="draggable-ul">
<div class="draggable-li"> <div class="draggable-li">
<n-checkbox v-model:checked="checkAll" label="全选" :indeterminate="!checkAll" @update:checked="onCheckAllChange" /> <n-checkbox
v-model:checked="checkAll"
label="全选"
:indeterminate="!checkAll"
@update:checked="onCheckAllChange"
/>
</div> </div>
<div <div
v-for="item in offList" v-show="item.name.includes(offKeyword)" :key="item.id" :class="{ 'disable-check': item.fix }" v-for="item in offList"
v-show="item.name.includes(offKeyword)"
:key="item.id"
:class="{ 'disable-check': item.fix }"
class="draggable-li" class="draggable-li"
> >
<n-checkbox <n-checkbox
v-model:checked="item.checked" :label="item.name" :disabled="item.fix" v-model:checked="item.checked"
:label="item.name"
:disabled="item.fix"
@update:checked="onCheckChange($event, item)" @update:checked="onCheckChange($event, item)"
/> />
</div> </div>
@ -385,12 +397,15 @@ onMounted(() => {
</div> </div>
</NCard> </NCard>
</n-grid-item> </n-grid-item>
<n-grid-item style="display: flex;align-items: center;" span="2"> <n-grid-item style="display: flex; align-items: center" span="2">
<SvgIcon size="20" name="switchsvg" /> <SvgIcon size="20" name="switchsvg" />
</n-grid-item> </n-grid-item>
<n-grid-item span="11"> <n-grid-item span="11">
<NCard <NCard
:title="selectCount" class="dragcardStyle" :segmented="{ content: true, footer: true }" size="small" :title="selectCount"
class="dragcardStyle"
:segmented="{ content: true, footer: true }"
size="small"
:bordered="false" :bordered="false"
> >
<template #header-extra> <template #header-extra>
@ -402,14 +417,31 @@ onMounted(() => {
<SvgIcon size="14px" name="magnifying-1-color999" /> <SvgIcon size="14px" name="magnifying-1-color999" />
</template> </template>
</n-input> </n-input>
<n-scrollbar style="max-height: 500px;border: 1px solid #cad2dd;border-radius: 2px;" class="scroll"> <n-scrollbar
<VueDraggable v-model="onList" class="draggable-ul" :animation="150" group="shared"> style="max-height: 500px; border: 1px solid #cad2dd; border-radius: 2px"
<div v-for="item in onList" v-show="item.name.includes(onKeyword)" :key="item.id" :draggable="true" class="cursor-move draggable-li"> class="scroll"
>
<VueDraggable
v-model="onList"
class="draggable-ul"
:animation="150"
group="shared"
>
<div
v-for="item in onList"
v-show="item.name.includes(onKeyword)"
:key="item.id"
:draggable="true"
class="cursor-move draggable-li"
>
<SvgIcon name="drag" size="24" /> <SvgIcon name="drag" size="24" />
<span class="ml-2">{{ item.name }}</span> <span class="ml-2">{{ item.name }}</span>
<SvgIcon <SvgIcon
v-if="!item.fix" size="16px" style="display:block;margin-left: auto;cursor: pointer;" v-if="!item.fix"
name="clear" @click="removeHandler(item.id)" size="16px"
style="display: block; margin-left: auto; cursor: pointer"
name="clear"
@click="removeHandler(item.id)"
/> />
</div> </div>
</VueDraggable> </VueDraggable>
@ -424,7 +456,11 @@ onMounted(() => {
<n-button type="info" @click="handleSumbit"> <n-button type="info" @click="handleSumbit">
确定 确定
</n-button> </n-button>
<n-button secondary style="margin-left:15px; border: 1px solid #CAD2DD;" @click="closeModal"> <n-button
secondary
style="margin-left: 15px; border: 1px solid #cad2dd"
@click="closeModal"
>
取消 取消
</n-button> </n-button>
</div> </div>
@ -453,10 +489,10 @@ onMounted(() => {
&-footer { &-footer {
display: flex; display: flex;
justify-content: flex-end; justify-content: flex-end;
.n-button--info-type{ .n-button--info-type {
background: #507AFD !important; background: #507afd !important;
} }
.n-button--default-type{ .n-button--default-type {
background: #fff !important; background: #fff !important;
color: #333333; color: #333333;
} }
@ -468,7 +504,7 @@ onMounted(() => {
font-size: 14px; font-size: 14px;
&:before { &:before {
background-color: #1980FF; background-color: #1980ff;
content: ""; content: "";
width: 5px; width: 5px;
border-radius: 2px; border-radius: 2px;
@ -498,7 +534,7 @@ onMounted(() => {
.textbtnStyle { .textbtnStyle {
cursor: pointer; cursor: pointer;
color: #1980FF; color: #1980ff;
} }
.draggable-ul { .draggable-ul {
@ -531,33 +567,33 @@ onMounted(() => {
--n-padding-top: 0px; --n-padding-top: 0px;
--n-padding-bottom: 12px; --n-padding-bottom: 12px;
} }
::v-deep(.n-card > .n-card-header .n-card-header__main){ ::v-deep(.n-card > .n-card-header .n-card-header__main) {
font-weight: lighter !important; font-weight: lighter !important;
font-size: 14px; font-size: 14px;
color: #666; color: #666;
} }
::v-deep(.n-scrollbar){ ::v-deep(.n-scrollbar) {
border-left: 1px solid #cad2dd !important; border-left: 1px solid #cad2dd !important;
border-right: 1px solid #cad2dd !important; border-right: 1px solid #cad2dd !important;
border-bottom: 1px solid #E8E8E8 !important; border-bottom: 1px solid #e8e8e8 !important;
border-top: 1px solid #E8E8E8 !important; border-top: 1px solid #e8e8e8 !important;
} }
::v-deep(.n-card__content){ ::v-deep(.n-card__content) {
padding: 20px 24px 0 24px !important; padding: 20px 24px 0 24px !important;
} }
::v-deep(.n-card__footer){ ::v-deep(.n-card__footer) {
padding: 0 24px 16px 24px !important; padding: 0 24px 16px 24px !important;
} }
::v-deep(.n-input .n-input-wrapper){ ::v-deep(.n-input .n-input-wrapper) {
height: 44px !important; height: 44px !important;
border: 1px solid #cad2dd !important; border: 1px solid #cad2dd !important;
border-bottom: none !important; border-bottom: none !important;
// margin-bottom: -3px; // margin-bottom: -3px;
.n-input__input input{ .n-input__input input {
height: 44px !important; height: 44px !important;
} }
} }
::v-deep(.n-button--info-type){ ::v-deep(.n-button--info-type) {
background: #507AFD !important; background: #507afd !important;
} }
</style> </style>

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

Loading…
Cancel
Save