diff --git a/.env.development b/.env.development index daa0fc6d3307463531e311af6c87afa56dd5b2f0..11466b5062c93901790901464a368efc570f6d70 100644 --- a/.env.development +++ b/.env.development @@ -1,14 +1,8 @@ ## 开发环境 - -# 变量必须以 VITE_ 为前缀才能暴露给外部读取 NODE_ENV='development' +# 应用端口 VITE_APP_PORT = 3000 -# API请求前缀 -VITE_APP_BASE_API = '/dev-api' - -# proxy代理配置 -VITE_APP_API_URL = 'http://vapi.youlai.tech' # 线上接口 -# VITE_APP_API_URL = 'http://localhost:8989' # 本地接口,本地启动后端:https://gitee.com/youlaiorg/youlai-boot -# VITE_APP_API_URL = 'http://localhost:3000' # 本地Mock +# 代理前缀 +VITE_APP_BASE_API = '/prod-api' diff --git a/.env.production b/.env.production index c8c69313c5eb52555804170b895847db21ae5f59..a2d828cb21d19bfee5fb3bf7e51506ef38780a2c 100644 --- a/.env.production +++ b/.env.production @@ -1,9 +1,6 @@ ## 生产环境 +NODE_ENV='production' -VITE_APP_PORT = 3000 - -# API请求前缀 +# 代理前缀 VITE_APP_BASE_API = '/prod-api' -# proxy代理配置 -VITE_APP_API_URL = "http://vapi.youlai.tech" diff --git a/.gitignore b/.gitignore index 1fd449a71e4486e3776d184cf894fc1a23a3ba05..ce69d70d1bce4e63f4f5ebb41cd6d8f1156b93ab 100644 --- a/.gitignore +++ b/.gitignore @@ -1,9 +1,9 @@ node_modules .DS_Store -dist +dist* dist-ssr *.local - +.vscode # Editor directories and files .idea *.suo @@ -11,6 +11,7 @@ dist-ssr *.njsproj *.sln *.local +*.d.ts package-lock.json pnpm-lock.yaml diff --git a/.npmrc b/.npmrc new file mode 100644 index 0000000000000000000000000000000000000000..37c19b070a264c5051f7ee72ff65efc019f2991e --- /dev/null +++ b/.npmrc @@ -0,0 +1 @@ +use-node-version=16.20.2 \ No newline at end of file diff --git a/.vscode/extensions.json b/.vscode/extensions.json deleted file mode 100644 index 7528cf214ecd4464b3b6d1534526ab74248d5b4a..0000000000000000000000000000000000000000 --- a/.vscode/extensions.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "recommendations": ["Vue.volar", "lokalise.i18n-ally","esbenp.prettier-vscode"] -} diff --git a/.vscode/settings.json b/.vscode/settings.json deleted file mode 100644 index 1e824bfafc3e62015f4236fb5227673f056795ae..0000000000000000000000000000000000000000 --- a/.vscode/settings.json +++ /dev/null @@ -1,80 +0,0 @@ -{ - "typescript.tsdk": "./node_modules/typescript/lib", - "npm.packageManager": "pnpm", - "editor.tabSize": 2, - "editor.formatOnSave": true, - "editor.defaultFormatter": "esbenp.prettier-vscode", - "editor.quickSuggestions": { - "other": true, - "comments": true, - "strings": true - }, - "editor.codeActionsOnSave": { - "source.fixAll": true, - "source.fixAll.eslint": true, - "source.fixAll.stylelint": true - }, - "files.eol": "\n", - "search.exclude": { - "**/node_modules": true, - "**/*.log": true, - "**/*.log*": true, - "**/bower_components": true, - "**/dist": true, - "**/elehukouben": true, - "**/.git": true, - "**/.gitignore": true, - "**/.svn": true, - "**/.DS_Store": true, - "**/.idea": true, - "**/.vscode": false, - "**/yarn.lock": true, - "**/tmp": true, - "out": true, - "dist": true, - "node_modules": true, - "CHANGELOG.md": true, - "examples": true, - "res": true, - "screenshots": true, - "yarn-error.log": true, - "**/.yarn": true - }, - "files.exclude": { - "**/.cache": true, - "**/.editorconfig": true, - "**/.eslintcache": true, - "**/bower_components": true, - "**/.idea": true, - "**/tmp": true, - "**/.git": true, - "**/.svn": true, - "**/.hg": true, - "**/CVS": true, - "**/.DS_Store": true - }, - "files.watcherExclude": { - "**/.git/objects/**": true, - "**/.git/subtree-cache/**": true, - "**/.vscode/**": true, - "**/node_modules/**": true, - "**/tmp/**": true, - "**/bower_components/**": true, - "**/dist/**": true, - "**/yarn.lock": true - }, - "i18n-ally.keystyle": "nested", - "i18n-ally.sortKeys": true, - "i18n-ally.namespace": false, - "i18n-ally.pathMatcher": "{locale}/{namespaces}.{ext}", - "i18n-ally.enabledParsers": ["ts"], - "i18n-ally.sourceLanguage": "en", - "i18n-ally.displayLanguage": "zh-CN", - "i18n-ally.enabledFrameworks": [ - "vue", - "react" - ], - "i18n-ally.localesPaths": [ - "src/lang" - ], -} diff --git a/CHANGELOG.md b/CHANGELOG.md index b0559d8c6fe08fb933685600d3db9e5bee8a8b0b..b71e95173f4ab6787ca4d170df13b40690d5bd4c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,40 @@ +# 2.8.1 (2023/01/10) + +### ✨ feat +- 替换 Mock 解决方案 vite-plugin-mock 为 vite-plugin-mock-dev-server 适配 Vite5 + +# 2.8.0 (2023/12/27) + +### ⬆️ chore +- 升级 Vite4 至 Vite5 + +# 2.7.1 (2023/12/12) + +### 🔄 refactor +- 将打包后的文件进行分类 (author by [ityangzhiwen](https://gitee.com/ityangzhiwen)) + +# 2.7.0 (2023/11/19) + +### 🔄 refactor +- 代码重构优化 +- 修改自动导入组件类型声明文件路径 +- 完善 typescript 类型 + +### 🐛 fix +- 修复管理页面部分弹窗无法打开问题 + + +# 2.7.0 (2023/11/19) + +### 🔄 refactor +- 代码重构 +- 修改自动导入组件类型声明文件路径 +- 完善 typescript 类型 + +### 🐛 fix +- 修复管理页面部分弹窗无法打开问题 + + # 2.6.3 (2023/10/22) ### ✨ feat diff --git a/README.md b/README.md index 1ce8018396d9eaeac42b521592ae5807b8197345..be4623a02ad4560e0df86898592b69308a004daf 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@

- - - + + + @@ -14,7 +14,7 @@ ## 项目介绍 -[vue3-element-admin](https://gitee.com/youlaiorg/vue3-element-admin) 是基于 Vue3 + Vite4+ TypeScript5 + Element-Plus + Pinia 等最新主流技术栈构建的后台管理前端模板(配套后端源码)。 +[vue3-element-admin](https://gitee.com/youlaiorg/vue3-element-admin) 是基于 Vue3 + Vite5+ TypeScript5 + Element-Plus + Pinia 等最新主流技术栈构建的后台管理前端模板(配套[后端源码](https://gitee.com/youlaiorg/youlai-boot))。 项目有以下特性: @@ -55,7 +55,7 @@ | 环境 | 名称版本 | 备注 | | -------------------- | :----------------------------------------------------------- | ------------------------------------------------------------ | | **开发工具** | VSCode | [下载地址](https://code.visualstudio.com/Download) | -| **运行环境** | Node 16+ | [下载地址](http://nodejs.cn/download) | +| **运行环境** | Node 18+ | [下载地址](http://nodejs.cn/download) | | **VSCode插件(必装)** | 1. `Vue Language Features (Volar) `
2. `TypeScript Vue Plugin (Volar) `
3. 禁用 Vetur | ![vscode-plugin](https://foruda.gitee.com/images/1687755823108948048/d0198b2d_716974.png) | @@ -78,6 +78,10 @@ pnpm install pnpm run dev ``` +## 开启Mock + +项目同时支持在线和 Mock 接口,默认使用线上接口,如需替换为 Mock 接口,只需在 `vite.config.ts` 文件的 `plugins` 配置中取消对 `mockDevServerPlugin()` 的注释**即可**。 + ## 项目部署 ```bash @@ -122,27 +126,23 @@ server { 重启 VSCode 尝试 -- **接口切换 Mock** - - v2.5.0 版本支持 Mock , 修改 `.env.development` 的 `VITE_APP_API_URL` 值为 `http://localhost:3000` 即可 。 - - **其他问题** 如果有其他问题或者建议,建议 [ISSUE](https://gitee.com/youlaiorg/vue3-element-admin/issues/new) -## 接口支持 +## 后端接口 -- **接口调用地址**:[https://vapi.youlai.tech](https://vapi.youlai.tech) +- **后端接口地址**:[https://vapi.youlai.tech](https://vapi.youlai.tech) - **接口文档地址**:[在线接口文档](https://www.apifox.cn/apidoc/shared-195e783f-4d85-4235-a038-eec696de4ea5) -- **OpenAPI文档地址**:[http://vapi.youlai.tech/v3/api-docs](http://vapi.youlai.tech/v3/api-docs) +- **OpenAPI地址**:[http://vapi.youlai.tech/v3/api-docs](http://vapi.youlai.tech/v3/api-docs) -- **本地接口**:默认使用线上接口,你可以通过以下步骤完成本地接口环境搭建: +- **本地接口环境搭建**: + - 首先,获取基于 `Java` 和 `SpringBoot` 开发的后端 [youlai-boot](https://gitee.com/youlaiorg/youlai-boot.git) 源码。 + - 其次,根据后端工程的说明文档 [README.md](https://gitee.com/youlaiorg/youlai-boot#%E9%A1%B9%E7%9B%AE%E8%BF%90%E8%A1%8C) 完成本地启动。 + - 最后,修改 `vite.config.ts` 文件中的 `server.proxy` 配置项,将 target 的值从 `http://vapi.youlai.tech` 更改为 `http://localhost:8989`。 - > 1. 获取基于 `Java 、SpringBoot` 开发的后端 [youlai-boot](https://gitee.com/youlaiorg/youlai-boot.git) 源码 ; - > 2. 根据后端工程说明文档 [README.md](https://gitee.com/youlaiorg/youlai-boot#%E9%A1%B9%E7%9B%AE%E8%BF%90%E8%A1%8C) 完成本地启动; - > 3. 替换 [.env.development](.env.development) 的代理目标地址 `VITE_APP_API_URL` 的值 `vapi.youlai.tech` 为本地的 `localhost:8989` diff --git "a/api\346\226\207\346\241\243.md" "b/api\346\226\207\346\241\243.md" new file mode 100644 index 0000000000000000000000000000000000000000..8b0aa1d56fcb6ccd501d6b4946d8e418138b8a0c --- /dev/null +++ "b/api\346\226\207\346\241\243.md" @@ -0,0 +1,393 @@ +# api文档 # +## 接口说明: + +***开发测试接口*** +> http://192.168.50.55:8989 + +***测试测试接口*** +> 暂无 + +***生产环境接口*** +> http://weilin.faxinai.cn + + +### 响应参数 +| 参数 | 说明 | +|:-----|:-------| +| data | 响应数据 | +| msg | 响应消息内容 | +| code | 响应状态码 | +### 响应状态 +| 状态码 | 说明 | +|:-----:|:---------| +| 00000 | 请求成功 | +| A0400 | 用户请求参数错误 | +| B0001 | 系统异常 | + + + +****** +## 案件相关APi接口 +***请求前缀*** +> /api/v1/case/main + +### 获取案件列表 + +***接口地址:*** +> `/listCases` + +***请求方式:*** `GET` + +***接口描述:*** -- + +***请求参数:*** + +| 参数名称 | 说明 | 参数类型 | 必填 | 备注 | +|:---------------------------|:--------------------|:-------|:------|:-------------------------------------------------------------------------------------------------------------------------------------------------| +| keywords | 关键字(法院/被告姓名/省市区/案号) | string | false | | +| keywordsFollowup | 关键字(办案日志) | string | false | | +| eventRecordMethod | 录入方式 | int | false | 0:系统录入 1:人工录入 | | +| eventTypes | 跟进类型 | array | false | 110: "联系法院",120: "联系被告",130: "法院回联",140: "被告回联",150: "立案平台",160: "法院消息",170: "邮寄",180: "缴费",185: "开庭",188: "履行",190: "法律文书",200: "其他",6: "系统录入", | +| lawyerIds | 律师id | array | false | | +| lawyerAccountIds | 提交律师账号 | array | false | | +| fromLawyerIds | 交接律师id | array | false | | +| batchIds | 批次模板id | array | false | | +| clientIds | 案源方ID | array | false | | +| spvIds | 原告id | array | false | | +| stateIds | 案件系统自身状态 | array | false | | +| sueTplIds | 资金模板结构id | array | false | | +| submitStates | 提交立案状态 | array | false | | +| platformStates | 立案平台状态 | array | false | | +| courtIds | 法院id | array | false | | +| followStartTime | 跟进时间-开始 | string | false | | +| followEndTime | 跟进时间-结束 | string | false | | +| rpaPlatformUpdateStartTime | 立案平台更新时间-开始 | string | false | | +| rpaPlatformUpdateEndTime | 立案平台更新时间-结束 | string | false | | +| categories | 标签类别 | array | false | 立案情况 案件状态 还款方式 | +| labelKeys | 标签名 | array | false | | +| labelValues | 标签值 | array | false | | +| provinces | 法院省份 | array | false | | +| areaCodes | 法院城市区号 | array | false | | +| caseIds | 案件id | array | false | | +| repayIntentIndex | 是否高潜 | string | false | 是/否 | +| sortProp | 排序字段 | string | false | | +| sortOrder | 升序/降序 | string | false | | | string |false|| + +***请求示例:*** +> http://localhost:3000/prod-api/api/v1/case/main/listCases?pageNum=1&pageSize=10&lawyerIds=42&lawyerIds=30&sortProp=lastFollowTime&lawyerAccountIds=9&provinces=%E9%99%95%E8%A5%BF%E7%9C%81&areaCodes=0910&keywords=&eventRecordMethod=0 + +***响应参数:*** + + +| 参数名称 | 说明 | 参数类型 | 必填 | 备注 | +|:-------------------------|:-----------|:-------|:------|:-------------------------------------| +| data | 数据 | object | true | | +| list | 数据列表 | array | true | | +| id | id | int | true | | +| lawyerId | 办案律师id | int | true | | +| lawyer | 办案律师 | string | true | | +| batchId | 批次号 | int | true | | +| opsBatchName | 委案批次 | string | true | | +| client | 案源方 | string | true | | +| spvId | 原告id | string | true | | +| spvName | 原告公司 | string | true | | +| sueTplId | 诉讼模板id | string | true | | +| sueTpl | 诉讼模板 | string | true | | +| repayIntentIndex | 高潜客户指数 | string | false | | +| courtShortName | 法院名称 | string | true | | +| ccProjectAlias | 法院预计名称 | string | true | | +| areaCode | 地区code | string | true | | +| areaCodeFullname | 地区名称 | string | true | | +| assetCount | 起诉的资产笔数 | int | false | | +| borrowerName | 被告姓名 | string | true | | +| idCardNumber | 被告身份证号 | string | true | | +| sex | 性别 | string | false | | +| birthDate | 生日 | date | false | | +| ethnicity | 种族 | string | false | | +| province | 被告住址省份 | string | false | | +| city | 被告住址城市 | string | false | | +| county | 被告住址区县 | string | false | | +| submitLawyerName | 提交律师名称 | string | true | | +| submitSpvTel | 提交原告电话 | string | false | | +| submitLawyerTel | 提交律师电话 | string | false | | +| state | 案件状态 | string | true | | +| submitState | 案件提交状态 | string | true | | +| rpaCaseId | 提交立案的ID | string | false | | +| platformState | 立案平台案件状态 | string | false | | +| caseNumbersInfo | 案号 | string | false | | +| lastFollowTime | 最后跟进时间 | date | false | | +| followRecords | 办案日志 | array | true | | +| smsEntranceBOs | 短信信息 | array | false | | +| effectiveActions | 案件跟进日志 | array | false | | +| labels | 案件标签 | object | false | | +| todoNotes | 待办笔记 | string | false | | +| mailRequirements | 邮寄要求 | string | false | | +| mailInfo | 邮寄信息 | string | false | | +| remarks | 备注 | string | false | | +| printSubmissionCount | 打印提交次数 | int | false | | +| lastPrintSubmissionTime | 最近一次打印提交时间 | date | false | | +| sueDate | 起诉日期 | date | false | | +| overdueBaseAmount | 诉讼本金基数 | double | false | 用于计算诉讼利息的诉讼本金基数(未代偿即为剩余未还本金,否则为代偿总额) | +| overdueInterestStartDate | 逾期利息起算日期 | date | false | (通常为最后一笔代偿日期的次日) | +| overdueDays | 逾期天数 | int | false | (逾期利息起算日期至起诉日期) | +| overdueInterestRate | 逾期利息年利率 | double | false | | +| overdueInterestAmount | 逾期利息 | double | false | (代偿本金 x 逾期利息年利率 x 逾期天数/360) | +| lawyerFeeAmount | 律师费 | double | false | | +| travelFeeAmount | 差旅费 | double | false | | +| sueDebtTotalAmount | 债务总额 | double | false | (代偿总额 + 逾期利息) | +| sueClaimTotalAmount | 诉讼请求总额 | double | false | (债务总额 + 律师费 + 差旅费) | +| total | 页数 | int | false | | + +| 参数名称 | 说明 | 参数类型 | 必填 | 备注 | +|:------------------|:--------|:-------|:-----|:------------------------------------------------------------| +| followRecords | 数据列表 | array | true | | +| id | id | int | true | | +| caseId | 案件id | int | true | | +| followTime | 跟踪时间 | date | true | | +| deleteTime | 删除时间 | date | false | | +| eventType | 信息来源 | int | true | 1:主动联系法院; 2:法院回联; 3:法院短信通知; 4:律师平台反馈; 5:执行操作; 6:系统录入; 7:其他' | +| content | 内容 | String | true | | +| readTime | 读取时间 | date | true | | +| lsptMessageId | | string | true | | +| isCreatedBySystem | 是否管理员创建 | Byte | false | | +| createUserId | 创建人id | int | false | | +| createUserName | 创建人名称 | string | false | | +| infoId | 信息ID | int | false | | +| infoSource | 信息来源 | string | false | | + +| 参数名称 | 说明 | 参数类型 | 必填 | 备注 | +|:---------------|:-----|:------|:-----|:---| +| smsEntranceBOs | 数据列表 | array | true | | + +| 参数名称 | 说明 | 参数类型 | 必填 | 备注 | +|:-----------------|:-----|:------|:-----|:---| +| effectiveActions | 数据列表 | array | true | | + +| 参数名称 | 说明 | 参数类型 | 必填 | 备注 | +|:-------|:-----|:------|:-----|:---| +| labels | 数据列表 | array | true | | + + +***响应示例:*** + + +```json +{ + "code": "00000", + "msg": "OK", + "data": { + "list": [ + { + "id": 22271, + "lawyerId": 42, + "lawyer": "龙亮平", + "batchId": null, + "opsBatchName": "洋钱罐第3批-240406", + "client": "洋钱罐", + "spvId": null, + "spvName": "武汉红色森林商务咨询有限公司", + "sueTplId": null, + "sueTpl": "洋钱罐3全国第3批-20240406", + "repayIntentIndex": null, + "courtShortName": "礼泉县人民法院", + "ccProjectAlias": "洋钱罐第二批", + "areaCode": "0910", + "areaCodeFullname": "陕西省咸阳市", + "assetCount": 1, + "borrowerName": "张文鹏", + "idCardNumber": "610425199601092814", + "sex": "男", + "birthDate": "1996-01-09", + "ethnicity": "汉", + "province": "陕西省", + "city": "咸阳市", + "county": "礼泉县", + "submitLawyerName": null, + "submitSpvTel": null, + "submitLawyerTel": null, + "state": "审查中", + "submitState": "已提交", + "rpaCaseId": "24500", + "platformState": "审查不通过", + "caseNumbersInfo": null, + "lastFollowTime": "2024-05-17 17:55:02", + "smsEntranceBOs": [], + "effectiveActions": [], + "labels": {}, + "todoNotes": null, + "mailRequirements": null, + "mailInfo": null, + "remarks": null, + "printSubmissionCount": null, + "lastPrintSubmissionTime": null, + "sueDate": "2024-04-06", + "overdueBaseAmount": null, + "overdueInterestStartDate": null, + "overdueDays": null, + "overdueInterestRate": null, + "overdueInterestAmount": null, + "lawyerFeeAmount": null, + "travelFeeAmount": null, + "sueDebtTotalAmount": 6861.47, + "sueClaimTotalAmount": 9361.47, + "followRecords": [ + { + "createTime": "2024-05-17 17:56:38", + "updateTime": "2024-05-17 17:56:38", + "id": 324147, + "caseId": 22271, + "followTime": "2024-05-17 17:55:02", + "deleteTime": null, + "eventType": 130, + "content": "18710369012先转诉前联调。", + "readTime": "2024-05-17 17:56:38", + "lsptMessageId": null, + "isCreatedBySystem": 0, + "createUserId": 42, + "createUserName": "龙亮平", + "infoId": null, + "infoSource": null + } + ] + } + ] + } +} +``` + +### 通过案件ID查询案件 + +***接口地址:*** +> `/{id}` + +***请求方式:*** `GET` + +***接口描述:*** -- + +***请求参数:*** + + +| 参数名称 | 说明 | 参数类型 | 必填 | 备注 | +|:-------------|:-----|:-------|:------|:---| +| id | 案件id | int | true | | + +***请求示例:*** +> http://localhost:3000/prod-api/api/v1/case/main/184515 + +***响应参数:*** +> 同案件列表查询接口请求参数一致 + + +***响应示例:*** + + +```json +{ + "code": "00000", + "msg": "OK", + "data": { + ... + } +} +``` + +### 批量退案 + +***接口地址:*** +> `/addBatchOpsBackCase` + +***请求方式:*** `POST` + +***接口描述:*** -- + +***请求参数:*** + + +| 参数名称 | 说明 | 参数类型 | 必填 | 备注 | +|:-------------|:-----|:-------|:------|:---| +| caseIds | 案件id | array | true | | +| type | 退案类型 | string | true | | +| remark | 备注 | string | false | | | +| sendbackDate | 退案时间 | array | true | | + +**请求示例:** +```json +{ + "caseIds": [1,2,3,4,5], + "type": "退案", + "remark": "xxxx", + "sendbackDate": "2024-06-13" +} +``` + +***响应参数:*** + + +| 参数名称 | 说明 | 参数类型 | 必填 | 备注 | +|:-----|:---|:-------|:-----|:---| +| data | | object | true | | + + + +***响应示例:*** + + +```json +{ + "code": "00000", + "msg": "OK", + "data": { + + } +} +``` + +****** + + +## 获取案件信息相关下拉选择数据源API +***请求前缀*** +> /api/v1/case/misc + + +### 获取原告列表 + +***接口地址:*** +> `/listSpvs` + +***请求方式:*** `GET` + +***接口描述:*** -- + +***请求参数:*** +> 同案件列表查询接口请求参数一致 + +***响应参数:*** + + +| 参数名称 | 说明 | 参数类型 | 必填 | 备注 | +|:------|:------|:-------|:-----|:---| +| data | | array | true | | +| id | key | int | true | | +| name | value | string | true | | +| alias | 别名 | string | true | | +| count | 数量 | int | true | | + +***响应示例:*** + + +```json +{ + "code": "00000", + "msg": "OK", + "data": [ + { + "id": 3, + "name": "xxxx", + "alias": null, + "count": 14996 + } + ] +} +``` +****** \ No newline at end of file diff --git a/index.html b/index.html index 3dcc439a69d7e9bad60481eee2b5ae2c803a4bc4..d3da7dc188fb8c1283412dcf9a42c4594ba2e5a8 100644 --- a/index.html +++ b/index.html @@ -4,12 +4,9 @@ - - - vue3-element-admin + + + 广东云云律师事务所 @@ -62,7 +59,6 @@ .mesh-loader > div .circle:last-child { animation-delay: 0s; - animation-delay: 0s; } .mesh-loader > div { @@ -73,65 +69,48 @@ .mesh-loader > div:last-child { transform: rotate(90deg); - transform: rotate(90deg); } @keyframes mesh { 0% { - transform: rotate(0); transform: rotate(0); transform-origin: 50% -100%; - transform-origin: 50% -100%; } 50% { - transform: rotate(360deg); transform: rotate(360deg); transform-origin: 50% -100%; - transform-origin: 50% -100%; } 50.00001% { - transform: rotate(0deg); transform: rotate(0deg); transform-origin: 50% 200%; - transform-origin: 50% 200%; } 100% { - transform: rotate(360deg); transform: rotate(360deg); transform-origin: 50% 200%; - transform-origin: 50% 200%; } } @keyframes mesh { 0% { transform: rotate(0); - transform: rotate(0); - transform-origin: 50% -100%; transform-origin: 50% -100%; } 50% { transform: rotate(360deg); - transform: rotate(360deg); - transform-origin: 50% -100%; transform-origin: 50% -100%; } 50.00001% { transform: rotate(0deg); - transform: rotate(0deg); - transform-origin: 50% 200%; transform-origin: 50% 200%; } 100% { transform: rotate(360deg); - transform: rotate(360deg); - transform-origin: 50% 200%; transform-origin: 50% 200%; } } diff --git a/mock/article.ts b/mock/article.ts deleted file mode 100644 index 8563e6edebe094c9f075bae70bf4b37b1c70091a..0000000000000000000000000000000000000000 --- a/mock/article.ts +++ /dev/null @@ -1,168 +0,0 @@ -import { MockMethod } from "vite-plugin-mock"; - -const article_list: any = []; -const count = 100; - -for (let i = 0; i < count; i++) { - article_list.push({ - id: i, - timestamp: new Date().getTime(), - author: `Author ${i}`, - reviewer: `reviewer ${i}`, - title: `Title ${i}`, - importance: Math.floor(Math.random() * 3) + 1, - type: ["CN", "US", "JP", "EU"][Math.floor(Math.random() * 4)], - status: ["published", "draft"][Math.floor(Math.random() * 2)], - display_time: new Date().toISOString(), - pageviews: Math.floor(Math.random() * (5000 - 300)) + 300, - remark: `remark ${i}`, - }); -} - -export default [ - { - url: "/api/v1/article/list", - timeout: 200, - method: "get", - response: ({ query }) => { - const { importance, type, title, page = 1, limit = 10, sort } = query; - let mock_list = article_list.filter((item: any) => { - if (importance && item.importance !== +importance) return false; - if (type && item.type !== type) return false; - if (title && item.title.indexOf(title) < 0) return false; - if (item.status === "deleted") return false; - return true; - }); - if (sort === "-id") { - mock_list = mock_list.reverse(); - } - const page_list = mock_list.filter( - (item: any, index: number) => - index < limit * page && index >= limit * (page - 1) - ); - - return { - code: "00000", - data: { total: mock_list.length, page: page, items: page_list }, - msg: "一切ok", - }; - }, - }, - { - url: "/api/v1/article/detail", - timeout: 200, - method: "get", - response: ({ query }) => { - const { id } = query; - for (const article of article_list) { - if (article.id === +id) { - return { - code: "00000", - data: article, - msg: "一切ok", - }; - } - } - }, - }, - { - url: "/api/v1/article/pv", - timeout: 200, - method: "get", - response: ({ query }) => { - const { id } = query; - for (const article of article_list) { - if (article.id === +id) { - return { - code: "00000", - data: { - pv: article.pageviews, - pvData: [ - { key: "PC", pv: 1024 }, - { key: "mobile", pv: 1024 }, - { key: "ios", pv: 1024 }, - { key: "android", pv: 1024 }, - ], - }, - msg: "一切ok", - }; - } - } - }, - }, - { - url: "/api/v1/article/update", - timeout: 200, - method: "post", - response: ({ body }) => { - const { id, ...updatedFields } = body; - // 查找要更新的文章 - const articleToUpdate = article_list.find( - (article: any) => article.id === id - ); - - // 如果找到了要更新的文章 - if (articleToUpdate) { - // 使用 Object.assign 方法更新文章 - Object.assign(articleToUpdate, updatedFields); - return { - code: "00000", - data: { - article: articleToUpdate, - }, - msg: "一切ok", - }; - } else { - console.error(`Article with id ${id} not found.`); - } - }, - }, - { - url: "/api/v1/article/create", - timeout: 200, - method: "post", - response: ({ body }) => { - const { title, author, importance, type, status, remark, timestamp } = - body; - // article_list最大的id值; - const maxId = article_list.reduce((maxId: number, article: any) => { - return Math.max(maxId, article.id); - }, -1); - const article = { - id: maxId + 1, - timestamp, - author, - reviewer: `reviewer ${maxId + 1}`, - title, - importance, - type, - status, - display_time: new Date(timestamp).toISOString(), - pageviews: Math.floor(Math.random() * (5000 - 300)) + 300, - remark, - }; - article_list.push(article); - return { - code: "00000", - data: { - article, - }, - msg: "一切ok", - }; - }, - }, - { - url: "/api/v1/article/delete", - timeout: 200, - method: "post", - response: ({ body }) => { - const { id } = body; - const index = article_list.findIndex((article: any) => article.id === id); - article_list.splice(index, 1); - return { - code: "00000", - msg: "一切ok", - }; - }, - }, -] as MockMethod[]; diff --git a/mock/auth.mock.ts b/mock/auth.mock.ts new file mode 100644 index 0000000000000000000000000000000000000000..73a7359d7e83406b1850e1e6b7ca6076ed0dc06f --- /dev/null +++ b/mock/auth.mock.ts @@ -0,0 +1,48 @@ +import path from "path"; +import { createDefineMock } from "vite-plugin-mock-dev-server"; + +const defineMock = createDefineMock((mock) => { + mock.url = path.join(import.meta.env.VITE_APP_BASE_API, mock.url); // 路径会拼接为: /dev-api + url +}); + +export default defineMock([ + { + url: "/api/v1/auth/captcha", + method: ["GET"], + body: { + code: "00000", + data: { + captchaKey: "534b8ef2b0a24121bec76391ddd159f9", + captchaBase64: + "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAHgAAAAkCAIAAADNSmkJAAAFKUlEQVR4Xu2ZXUwcVRiGV70wMWo08V5NvPXCrDbFaGpMaZW2hqQxaoiJTRsaMBCNSYtpa2JTKiFSelFa+Q/QZcMWqEhBlh+htbEpZhMrBQrlJ0hBywLLyrJ0WZbje3bqOvPNLHPWrDvdOE9ONmfe78zkzMs335wzWJhJQrBQweS/wTQ6QWgYHdoIOcecOe05O+t2WkutO+p2ZF3Ksg/YV9ZW6FATYajR3nveg60H9327r3O8c35lHgp+r05dPdJzBL73TPSQ8SaCKIxGLsPlop+K0JHrEkPuoT31e5qGmmjARACF0agYyGVNlyVm/pzZXrN9fHGcBkz0UBid+31u93i3XFFT80vN8cvHqWqih8Lo1NpUqS5vwh3vnd223VQ10UNh9NbyrcFQUK6oCawHUipSqGqiB83oBf+CXFGDMp1mS6OqiR4Ko7FexkpOrqhpHGw82nOUqiZ6KIzGrkRuorW0dJMmOy+hOCfYGzb2RBFv6HRO0gEJw/U7y+pgL1bwmTxexN6sZ31TdEwEhdG+gA+7EqyXpUO1uZH20cWL8hMTRt1N9tBXzCJrOIRoCPJpSO2RAp4HmtCdIfZ+2JWgEBN9LbR28seTGU0Zue1tMLp+YIAMSADzfvbkKX4/eb28j4YODiGin3heqmIlLja5hAUCu+nmGY3JWKvpMAlqNGgebsauBOvlqSX+JEx7p7EbTLen53XlzfmWUioqXikrc68Y8N2juJ/fyVsNChGHEE//rBANYWaZz+TRQqpLaBgNsPfDrgSpbS21YtV87IdjrlkX9JZbt5DOma2t9ITo5F+5glN22WwL/n+yDv00mw06orKxOqQ5+J04hhViwzAXETIcJDVm8uxZqktoGx2Nj9t43Wgaul/ERQiGQvtbWnDWgZYW9CXlQFjZ/7ciyHNn+Z2MexTimIeLz59TiIln0M1e+IbPpOAaDUnEYPTi6iqKxpbycs/qKo1tCslfKcffPn9enuMiPPY1vxO/ckeFQ4h46cdGqUWoidE/y54q5tPY5WDrGzQqIXot4BgchEE57e00IMCw2/1qZSVO/7SjA78o9INzcxsbrL+fnTnDDh9mmZn8F30oG1Hm+nABv5mQMopDS/h1HxtqTzWbABMe9sxpPoe9zezeOo1GELqWhPS8t46M0IAYHbdvR1aHbaOjbjfLz2eFhez6dba4yAfgF30o0BFVE8+Mjh/wFxPI+I5mAEHU6Ls+38vhTFwOBGhMDF8gkFpbC5ffsdv/uBs6dIj19dExEtARVXv9YNbop8NFY3aZ6gRRo+tu3IBHnzmdNCBMXldXJKPfL74WzWUJRE+coDUknqsOdZXQbAJYwluVTbOZI3Qt8GFzMwxyjo3RgBiN4fr+elXVpZGRLWXl6PdOTtJBSlBDUK/lnIrjOlrtqWYTQDJaF6FrTXu9sOa1ysrVoM5HVE1GFxZQcyJ/p+xzv6K/rbr6N6+XDpUBl0tKFIrbz78qWB6YnWFMCBld4XLBms+7df75ook/GNzb0GCV7U1Qfz9p64TyQWNjYD3qe9rj4SMJtQP3MyjSDPzWIRHPjH7X4YAvfXoPuyZf9Pbi3PcuXIh4mp3NllYC6XY79C+jl2o8PBipxjnBttn4MgMNnWgfcRJGPI2OL8hTj3LloIlmRicvBhiNykvecpqoa3RSY4DRcLAwyicuOepVR1JjgNFYHWONHL04czTX0UmNAUYD7Pr+xc4wqTHGaBb2OtZvHUmNYUazcA2J6etdUmOk0f8rTKMTxF91RG0D1SwYGwAAAABJRU5ErkJggg==", + }, + msg: "一切ok", + }, + }, + + { + url: "/api/v1/auth/login", + method: ["POST"], + body: { + code: "00000", + data: { + accessToken: + "eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJhZG1pbiIsImp0aSI6IjE2YWJkNTlkOTAxNzQwZDliYmI3ZjczODBhZDkyNzNhIiwidXNlcklkIjoyLCJ1c2VybmFtZSI6ImFkbWluIiwiZGVwdElkIjoxLCJkYXRhU2NvcGUiOjEsImF1dGhvcml0aWVzIjpbIlJPTEVfQURNSU4iXSwiZXhwIjoxNjkxMTAzMzgyfQ.P4cuIfmPepl3HuguhMS7NXn5a7IUPpsLbmtA_rHOhHk", + tokenType: "Bearer", + refreshToken: null, + expires: null, + }, + msg: "一切ok", + }, + }, + + { + url: "/api/v1/auth/logout", + method: ["DELETE"], + body: { + code: "00000", + data: {}, + msg: "string", + }, + }, +]); diff --git a/mock/case.mock.ts b/mock/case.mock.ts new file mode 100644 index 0000000000000000000000000000000000000000..2ea76e88782a0cfc0d8cab71cbce3bcd83eaad7f --- /dev/null +++ b/mock/case.mock.ts @@ -0,0 +1,121 @@ +import path from "path"; +import { createDefineMock } from "vite-plugin-mock-dev-server"; + +const defineMock = createDefineMock((mock) => { + mock.url = path.join(import.meta.env.VITE_APP_BASE_API, mock.url); // 路径会拼接为: /dev-api + url +}); + +export default defineMock([ + { + url: "/api/v1/case/llm/action/update", + method: ["GET", "POST"], + body: { code: "00000", data: 11380, msg: "一切ok" }, + }, + { + url: "/api/v1/case/push/l1ist", + method: ["GET"], + body: { + code: "00000", + data: { + list: [ + { + id: 1043, + userId: 9, + pushTime: "2024-04-05 20:51:16", + content: + "24年4月5日08:28贵公司帐户尾号0231转入人民币650.00[互联汇入24040500071478]杜晶,尾号6530杜晶【浦发银行】", + createTime: "2024-04-05 23:13:35", + updateTime: "2024-04-06T18:27:25", + userName: "杜晶", + }, + { + id: 1044, + userId: 58, + pushTime: "2024-04-05 20:51:16", + content: + "24年4月5日10:43贵公司帐户尾号0231转入人民币1,250.00[互联汇入24040500167257]手机银行转账,尾号1867李波【浦发银行】", + createTime: "2024-04-05 23:14:46", + updateTime: "2024-04-06T18:27:25", + userName: "李波", + }, + { + id: 1040, + userId: 46, + pushTime: "2024-04-04 20:51:16", + content: + "24年4月4日01:30贵公司帐户尾号0231转入人民币490.00[互联汇入24040400021606],尾号4267张盼盼【浦发银行】", + createTime: "2024-04-04 21:13:15", + updateTime: "2024-04-06T18:27:25", + userName: "张盼盼", + }, + { + id: 1041, + userId: 40, + pushTime: "2024-04-04 20:51:16", + content: + "24年4月4日10:50贵公司帐户尾号0231转入人民币4,141.58[互联汇入24040400168962]还款,尾号8072马翔【浦发银行】", + createTime: "2024-04-04 21:14:04", + updateTime: "2024-04-06T18:27:25", + userName: "马翔", + }, + { + id: 1029, + userId: 42, + pushTime: "2024-04-03 20:51:16", + content: null, + createTime: "2024-04-03 20:51:16", + updateTime: "2024-04-06T18:27:25", + userName: "蒋桂勇", + }, + { + id: 1030, + userId: 76, + pushTime: "2024-04-03 20:51:16", + content: null, + createTime: "2024-04-03 20:51:49", + updateTime: "2024-04-06T18:27:25", + userName: "吴勇庆", + }, + { + id: 1031, + userId: 11, + pushTime: "2024-04-03 20:51:16", + content: null, + createTime: "2024-04-03 20:52:10", + updateTime: "2024-04-06T18:27:25", + userName: "房金泉", + }, + { + id: 1032, + userId: 25, + pushTime: "2024-04-03 20:51:16", + content: null, + createTime: "2024-04-03 20:52:30", + updateTime: "2024-04-06T18:27:25", + userName: "唐俊", + }, + { + id: 1033, + userId: 14, + pushTime: "2024-04-03 20:51:16", + content: null, + createTime: "2024-04-03 20:52:46", + updateTime: "2024-04-06T18:27:25", + userName: "李宇", + }, + { + id: 1034, + userId: 36, + pushTime: "2024-04-03 20:51:16", + content: null, + createTime: "2024-04-03 20:53:07", + updateTime: "2024-04-06T18:27:25", + userName: "施源", + }, + ], + total: 530, + }, + msg: "一切ok", + }, + }, +]); diff --git a/mock/dept.mock.ts b/mock/dept.mock.ts new file mode 100644 index 0000000000000000000000000000000000000000..46e628d87754d4d045644d8743a9bcde78868fff --- /dev/null +++ b/mock/dept.mock.ts @@ -0,0 +1,75 @@ +import path from "path"; +import { createDefineMock } from "vite-plugin-mock-dev-server"; + +const defineMock = createDefineMock((mock) => { + mock.url = path.join(import.meta.env.VITE_APP_BASE_API, mock.url); // 路径会拼接为: /dev-api + url +}); + +export default defineMock([ + { + url: "/api/v1/dept/options", + method: ["GET"], + body: { + code: "00000", + data: [ + { + value: 1, + label: "有来技术", + children: [ + { + value: 2, + label: "研发部门", + }, + { + value: 3, + label: "测试部门", + }, + ], + }, + ], + msg: "一切ok", + }, + }, + + { + url: "/api/v1/dept", + method: ["GET"], + body: { + code: "00000", + data: [ + { + id: 1, + parentId: 0, + name: "有来技术", + sort: 1, + status: 1, + children: [ + { + id: 2, + parentId: 1, + name: "研发部门", + sort: 1, + status: 1, + children: [], + createTime: null, + updateTime: "2022-04-19 12:46", + }, + { + id: 3, + parentId: 1, + name: "测试部门", + sort: 1, + status: 1, + children: [], + createTime: null, + updateTime: "2022-04-19 12:46", + }, + ], + createTime: null, + updateTime: null, + }, + ], + msg: "一切ok", + }, + }, +]); diff --git a/mock/dept.ts b/mock/dept.ts deleted file mode 100644 index 91746f4f2d79827111cffafb5637c29f93d04658..0000000000000000000000000000000000000000 --- a/mock/dept.ts +++ /dev/null @@ -1,30 +0,0 @@ -import { MockMethod } from "vite-plugin-mock"; - -export default [ - { - url: "/api/v1/dept/options", - method: "get", - response: () => { - return { - code: "00000", - data: [ - { - value: 1, - label: "有来技术", - children: [ - { - value: 2, - label: "研发部门", - }, - { - value: 3, - label: "测试部门", - }, - ], - }, - ], - msg: "一切ok", - }; - }, - }, -] as MockMethod[]; diff --git a/mock/dict.mock.ts b/mock/dict.mock.ts new file mode 100644 index 0000000000000000000000000000000000000000..9f4a17de44c5e8e33a16a0586bca0be950727865 --- /dev/null +++ b/mock/dict.mock.ts @@ -0,0 +1,99 @@ +import path from "path"; +import { createDefineMock } from "vite-plugin-mock-dev-server"; + +const defineMock = createDefineMock((mock) => { + mock.url = path.join(import.meta.env.VITE_APP_BASE_API, mock.url); // 路径会拼接为: /dev-api + url +}); + +export default defineMock([ + { + url: "/api/v1/dict/:code/options", + method: ["GET"], + body: ({ params }) => { + const typeCode = params.code; + + let list = null; + + if (typeCode == "gender") { + list = [ + { + value: "1", + label: "男", + }, + { + value: "2", + label: "女", + }, + { + value: "0", + label: "未知", + }, + ]; + } + + return { + code: "00000", + data: list, + msg: "一切ok", + }; + }, + }, + + { + url: "/api/v1/dict/types/page", + method: ["GET"], + body: { + code: "00000", + data: { + list: [ + { + id: 1, + name: "性别", + code: "gender", + status: 1, + }, + { + id: 2, + name: "状态", + code: "status", + status: 1, + }, + ], + total: 2, + }, + msg: "一切ok", + }, + }, + + { + url: "/api/v1/dict/page", + method: ["GET"], + body: { + code: "00000", + data: { + list: [ + { + id: 1, + name: "男", + value: "1", + status: 1, + }, + { + id: 2, + name: "女", + value: "2", + status: 1, + }, + { + id: 3, + name: "未知", + value: "0", + status: 1, + }, + ], + total: 3, + }, + msg: "一切ok", + }, + }, +]); diff --git a/mock/dict.ts b/mock/dict.ts deleted file mode 100644 index 4ee38c38d13e1db70b2fa765341e28251589bebc..0000000000000000000000000000000000000000 --- a/mock/dict.ts +++ /dev/null @@ -1,36 +0,0 @@ -import { MockMethod } from "vite-plugin-mock"; - -export default [ - { - url: "/api/v1/dict/:code/options", - method: "get", - response: ({ url }) => { - const typeCode = url.match(/\/api\/v1\/dict\/(\w+)\/options/)[1]; - - let list = null; - - if (typeCode == "gender") { - list = [ - { - value: "1", - label: "男", - }, - { - value: "2", - label: "女", - }, - { - value: "0", - label: "未知", - }, - ]; - } - - return { - code: "00000", - data: list, - msg: "一切ok", - }; - }, - }, -] as MockMethod[]; diff --git a/mock/menu.mock.ts b/mock/menu.mock.ts new file mode 100644 index 0000000000000000000000000000000000000000..b26f1fc29b6adb9f184e560004ec051c6676ae2b --- /dev/null +++ b/mock/menu.mock.ts @@ -0,0 +1,1573 @@ +import path from "path"; +import { createDefineMock } from "vite-plugin-mock-dev-server"; + +const defineMock = createDefineMock((mock) => { + mock.url = path.join(import.meta.env.VITE_APP_BASE_API, mock.url); // 路径会拼接为: /dev-api + url +}); + +export default defineMock([ + { + url: "/api/v1/menus/routes", // 路径会拼接为: /dev-api/api/v1/menus/routes + method: ["GET"], + body: { + code: "00000", + data: [ + { + path: "/case", + component: "Layout", + name: "/case", + meta: { + title: "案件管理", + icon: "dict", + hidden: false, + roles: [ + "ADMIN_ASSISTANT", + "CASE_SUBMIT", + "WORKER", + "ADMIN", + "REPAY_CHECKER", + "DATA_INPUT", + "CASE_ADMIN", + "CASE_SYSTEM_ADMIN", + "CASE_LABEL", + ], + externalUrl: null, + alwaysShow: true, + }, + children: [ + { + path: "main", + component: "case/main/index", + name: "Main", + meta: { + title: "案件列表", + icon: "document", + hidden: false, + roles: [ + "ADMIN_ASSISTANT", + "CASE_SUBMIT", + "WORKER", + "ADMIN", + "CASE_ADMIN", + "CASE_SYSTEM_ADMIN", + "CASE_LABEL", + ], + externalUrl: null, + keepAlive: true, + }, + }, + { + path: "execution-input", + component: "bi/index", + name: "ExecutionInput", + meta: { + title: "执行录入", + icon: "peoples", + hidden: false, + roles: ["ADMIN", "DATA_INPUT", "CASE_SYSTEM_ADMIN"], + externalUrl: + "http://superset.faxinai.cn/token3rd/dataform/view.htm?id=b96b8773-b1db-464a-aee1-a94dee0a5a19&accessToken=5d531f6b925c6879585ddfdbd1443244", + }, + }, + { + path: "fulfill-entry", + component: "case/fulfill/fulfill", + name: "FulfillEntry", + meta: { + title: "现金回款录入", + icon: "peoples", + hidden: false, + roles: [ + "CASE_SYSTEM_ADMIN", + "REPAY_CHECKER", + "ADMIN", + "DATA_INPUT", + ], + externalUrl: null, + keepAlive: true, + }, + }, + { + path: "push", + component: "case/push/index", + name: "Push", + meta: { + title: "沟通记录", + icon: "edit", + hidden: false, + roles: ["CASE_SYSTEM_ADMIN", "ADMIN", "CASE_ADMIN"], + externalUrl: "", + keepAlive: true, + }, + }, + ], + }, + { + path: "/call-center", + component: "Layout", + name: "/callCenter", + meta: { + title: "呼叫中心", + icon: "tree", + hidden: false, + roles: [ + "CALL_CENTER_RECORDS", + "ADMIN_ASSISTANT", + "CALL_CENTER_ADMIN", + "CASE_SYSTEM_ADMIN", + "LAWYER", + "WORKER", + "ASSISTANT", + "ADMIN", + ], + externalUrl: null, + alwaysShow: true, + }, + children: [ + { + path: "route", + component: "call-center/route/index", + name: "Route", + meta: { + title: "路由配置", + icon: "user", + hidden: false, + roles: [ + "ADMIN", + "ADMIN_ASSISTANT", + "CALL_CENTER_ADMIN", + "CASE_SYSTEM_ADMIN", + ], + externalUrl: null, + keepAlive: true, + }, + }, + { + path: "seat", + component: "call-center/seat/index", + name: "Seat", + meta: { + title: "坐席管理", + icon: "peoples", + hidden: false, + roles: [ + "ADMIN", + "ADMIN_ASSISTANT", + "CALL_CENTER_ADMIN", + "CASE_SYSTEM_ADMIN", + ], + externalUrl: null, + keepAlive: true, + }, + }, + { + path: "cdr", + component: "call-center/cdr/index", + name: "Cdr", + meta: { + title: "通话记录", + icon: "download", + hidden: false, + roles: [ + "CALL_CENTER_RECORDS", + "ADMIN", + "LAWYER", + "ADMIN_ASSISTANT", + "WORKER", + "CASE_SYSTEM_ADMIN", + "ASSISTANT", + ], + externalUrl: null, + keepAlive: true, + }, + }, + ], + }, + { + path: "/bi", + component: "Layout", + name: "/bi", + meta: { + title: "数据报表", + icon: "table", + hidden: false, + roles: [ + "CASE_ADMIN", + "CASE_SOURCE_FOLLOW", + "FULFILL_CHECKER", + "ADMIN", + "REPAY_CHECKER", + "WORKER", + "CASE_SYSTEM_ADMIN", + "HR", + "DATA_ADMIN", + ], + externalUrl: null, + alwaysShow: true, + }, + children: [ + { + path: "followup/feedback", + component: "bi/index", + name: "Followup/feedback", + meta: { + title: "案件跟进 - 日清日结", + icon: "peoples", + hidden: false, + roles: [ + "DATA_ADMIN", + "CASE_ADMIN", + "ADMIN", + "WORKER", + "CASE_SYSTEM_ADMIN", + ], + externalUrl: + "http://superset.faxinai.cn/token3rd/dashboard/view/pc.htm?pageId=92f515b8-1fd9-4e08-af2c-c314ab8eefb7&accessToken=dab2963e1e415e5b78765c7694929dd2&dd_orientation=auto", + keepAlive: true, + }, + }, + { + path: "/sec", + component: "components/AppMain", + name: "/sec", + meta: { + title: "二级目录", + icon: "api", + hidden: false, + roles: ["ADMIN"], + externalUrl: null, + alwaysShow: true, + type: 2, + }, + children: [ + { + path: "followup/feedback", + component: "bi/index", + name: "Followup/feedback", + meta: { + title: "二级 - Page1", + icon: "edit", + hidden: false, + roles: ["ADMIN"], + externalUrl: null, + keepAlive: true, + }, + }, + { + path: "followup/follow", + component: "bi/index", + name: "Followup/follow", + meta: { + title: "二级 - Page2", + icon: "drag", + hidden: false, + roles: ["ADMIN"], + externalUrl: null, + keepAlive: true, + }, + }, + ], + }, + { + path: "followup/follow", + component: "bi/index", + name: "Followup/follow", + meta: { + title: "案件跟进 - 整体办案", + icon: "peoples", + hidden: false, + roles: [ + "WORKER", + "CASE_SYSTEM_ADMIN", + "ADMIN", + "DATA_ADMIN", + "CASE_ADMIN", + ], + externalUrl: + "http://superset.faxinai.cn/token3rd/dashboard/view/pc.htm?pageId=3184821d-257f-4936-b78d-970571232840&accessToken=02e85cf27d75188aa7797721ee04b2f9&dd_orientation=auto", + keepAlive: true, + }, + }, + { + path: "fulfill", + component: "bi/index", + name: "Fulfill", + meta: { + title: "确权回款表", + icon: "peoples", + hidden: false, + roles: [ + "WORKER", + "CASE_SYSTEM_ADMIN", + "ADMIN", + "DATA_ADMIN", + "CASE_ADMIN", + "FULFILL_CHECKER", + ], + externalUrl: + "http://superset.faxinai.cn/token3rd/dashboard/view/pc.htm?pageId=7e7ea663-abbe-46f7-bb2c-882c6cda37b4&accessToken=d208c704b568623950e5074d55be5993&dd_orientation=auto", + keepAlive: true, + }, + }, + { + path: "repay", + component: "bi/index", + name: "Repay", + meta: { + title: "现金回款表", + icon: "peoples", + hidden: false, + roles: [ + "WORKER", + "CASE_SYSTEM_ADMIN", + "ADMIN", + "DATA_ADMIN", + "CASE_ADMIN", + "REPAY_CHECKER", + ], + externalUrl: + "http://superset.faxinai.cn/token3rd/dashboard/view/pc.htm?pageId=256c9aca-6156-424a-a05d-7f6e5499f50f&accessToken=b5bfedc80df2772c483d515d765df5ea&dd_orientation=auto", + keepAlive: true, + }, + }, + { + path: "lawyer_basic", + component: "bi/index", + name: "Lawyer_basic", + meta: { + title: "基础数据报表", + icon: "peoples", + hidden: false, + roles: [ + "WORKER", + "CASE_SYSTEM_ADMIN", + "ADMIN", + "CASE_ADMIN", + "DATA_ADMIN", + ], + externalUrl: + "http://superset.faxinai.cn/token3rd/dashboard/view/pc.htm?pageId=55dbf075-7651-4316-9810-ca2f5ecd369c&accessToken=350bfe1c604e3085641723f0a4326a08&dd_orientation=auto", + }, + }, + { + path: "source", + component: "bi/dispatch/case-source", + name: "Source", + meta: { + title: "律师VS案源分布", + icon: "peoples", + hidden: false, + roles: [ + "HR", + "DATA_ADMIN", + "WORKER", + "CASE_SYSTEM_ADMIN", + "ADMIN", + "CASE_ADMIN", + ], + externalUrl: null, + keepAlive: true, + }, + }, + { + path: "lawyer-state", + component: "bi/dispatch/case-lawyer-state", + name: "LawyerState", + meta: { + title: "律师VS案件状态", + icon: "peoples", + hidden: false, + roles: [ + "CASE_ADMIN", + "HR", + "DATA_ADMIN", + "WORKER", + "CASE_SYSTEM_ADMIN", + "ADMIN", + ], + externalUrl: null, + keepAlive: true, + }, + }, + { + path: "state", + component: "bi/dispatch/case-state", + name: "State", + meta: { + title: "案源方VS案件状态", + icon: "peoples", + hidden: false, + roles: [ + "HR", + "CASE_SOURCE_FOLLOW", + "DATA_ADMIN", + "WORKER", + "CASE_SYSTEM_ADMIN", + "ADMIN", + "CASE_ADMIN", + ], + externalUrl: null, + keepAlive: true, + }, + }, + { + path: "fulfill-detail", + component: "bi/index", + name: "FulfillDetail", + meta: { + title: "履行明细", + icon: "peoples", + hidden: false, + roles: [ + "WORKER", + "CASE_SYSTEM_ADMIN", + "ADMIN", + "FULFILL_CHECKER", + "CASE_SOURCE_FOLLOW", + ], + externalUrl: + "http://bi.aliyuncs.com/token3rd/dashboard/view/pc.htm?pageId=892a5bf6-be72-40f2-ab93-14111ea3b7b9&accessToken=e8df45c2f55cd3860410785be3464177&dd_orientation=auto", + keepAlive: true, + }, + }, + { + path: "detail", + component: "bi/index", + name: "Detail", + meta: { + title: "案件明细表", + icon: "table", + hidden: false, + roles: [ + "CASE_ADMIN", + "CASE_SOURCE_FOLLOW", + "WORKER", + "CASE_SYSTEM_ADMIN", + "ADMIN", + ], + externalUrl: + "http://superset.faxinai.cn/token3rd/dashboard/view/pc.htm?pageId=b93422d2-c7d2-4453-9161-4797102a5a52&accessToken=e433b0a8ee73c5f6782a6ffe00ceaf6d&dd_orientation=auto", + keepAlive: true, + }, + }, + { + path: "order-detail", + component: "bi/index", + name: "OrderDetail", + meta: { + title: "全量订单列表", + icon: "peoples", + hidden: false, + roles: [ + "CASE_SYSTEM_ADMIN", + "ADMIN", + "WORKER", + "CASE_SOURCE_FOLLOW", + ], + externalUrl: + "http://superset.faxinai.cn/token3rd/dashboard/view/pc.htm?pageId=90d42a51-7efa-4dd5-b9ea-551ec5e9e26e&accessToken=4ce84011f17011737e2ace8af93a5988&dd_orientation=auto", + keepAlive: true, + }, + }, + ], + }, + { + path: "/basic-data", + component: "Layout", + name: "/basicData", + meta: { + title: "基础数据报表", + icon: "monitor", + hidden: false, + roles: ["CASE_SYSTEM_ADMIN", "ADMIN", "WORKER", "DATA_INPUT"], + externalUrl: "", + alwaysShow: true, + }, + children: [ + { + path: "followup_reocrds", + component: "bi/index", + name: "Followup_reocrds", + meta: { + title: "办案日志", + icon: "peoples", + hidden: false, + roles: ["CASE_SYSTEM_ADMIN", "ADMIN"], + externalUrl: + "http://superset.faxinai.cn/token3rd/dashboard/view/pc.htm?pageId=e4c07415-34dd-473c-98d8-843d03b0dfbb&accessToken=340f59d851d58743b598afa2e625c12b&dd_orientation=auto", + }, + }, + { + path: "print", + component: "bi/index", + name: "Print", + meta: { + title: "打印邮寄表", + icon: "peoples", + hidden: false, + roles: ["WORKER", "CASE_SYSTEM_ADMIN", "ADMIN"], + externalUrl: + "http://superset.faxinai.cn/token3rd/dashboard/view/pc.htm?pageId=2e997dc5-06bc-4849-89dc-d5393de6dabb&accessToken=39827e33e1baf2bd56dbdb9c09e885d8&dd_orientation=auto", + }, + }, + { + path: "sms", + component: "bi/index", + name: "Sms", + meta: { + title: "短信数据", + icon: "peoples", + hidden: false, + roles: ["CASE_SYSTEM_ADMIN", "ADMIN"], + externalUrl: + "http://superset.faxinai.cn/token3rd/dashboard/view/pc.htm?pageId=32a7fee5-12fa-4baa-b788-5bcf03e69197&accessToken=e35610ef18c0956e073848efc0fc30d9&dd_orientation=auto", + keepAlive: true, + }, + }, + { + path: "execution", + component: "bi/index", + name: "Execution", + meta: { + title: "执行数据", + icon: "peoples", + hidden: false, + roles: ["DATA_INPUT", "CASE_SYSTEM_ADMIN", "ADMIN"], + externalUrl: + "http://superset.faxinai.cn/token3rd/dashboard/view/pc.htm?pageId=2baa485d-6f27-4ce9-80d8-e1740ba7a523&accessToken=44831b1f66df2d2eb55139697cb71a8d&dd_orientation=auto", + }, + }, + { + path: "fee", + component: "bi/index", + name: "Fee", + meta: { + title: "缴费数据", + icon: "peoples", + hidden: false, + roles: ["CASE_SYSTEM_ADMIN", "ADMIN"], + externalUrl: + "http://superset.faxinai.cn/token3rd/dashboard/view/pc.htm?pageId=8a3b43b3-154a-455c-8f84-807885023af1&accessToken=68b041c79751431d4ee5db6ebe278d7b&dd_orientation=auto", + }, + }, + { + path: "case_number", + component: "bi/index", + name: "Case_number", + meta: { + title: "案号数据", + icon: "peoples", + hidden: false, + roles: ["CASE_SYSTEM_ADMIN", "ADMIN"], + externalUrl: + "http://superset.faxinai.cn/token3rd/dashboard/view/pc.htm?pageId=75b232ec-0cc5-47d8-9a2f-52b3193c496a&accessToken=d3898401e39f841fb96ec90d33a21342&dd_orientation=auto", + }, + }, + { + path: "court", + component: "bi/index", + name: "Court", + meta: { + title: "开庭和滴滴律师数据", + icon: "peoples", + hidden: false, + roles: ["DATA_INPUT", "CASE_SYSTEM_ADMIN", "ADMIN"], + externalUrl: + "http://superset.faxinai.cn/token3rd/dashboard/view/pc.htm?pageId=1f736da6-03ea-4b83-a49b-28c8644c0f43&accessToken=523e15a7267344ac2d67bed5ec6c76ed&dd_orientation=auto", + }, + }, + ], + }, + { + path: "/system", + component: "Layout", + redirect: "/system/user", + name: "/system", + meta: { + title: "系统管理", + icon: "system", + hidden: false, + roles: ["ADMIN"], + externalUrl: null, + }, + children: [ + { + path: "user", + component: "system/user/index", + name: "User", + meta: { + title: "用户管理", + icon: "user", + hidden: false, + roles: ["ADMIN"], + externalUrl: null, + keepAlive: true, + }, + }, + { + path: "role", + component: "system/role/index", + name: "Role", + meta: { + title: "角色管理", + icon: "role", + hidden: false, + roles: ["ADMIN"], + externalUrl: null, + keepAlive: true, + }, + }, + { + path: "menu", + component: "system/menu/index", + name: "Menu", + meta: { + title: "菜单管理", + icon: "menu", + hidden: false, + roles: ["ADMIN"], + externalUrl: null, + keepAlive: true, + }, + }, + { + path: "dept", + component: "system/dept/index", + name: "Dept", + meta: { + title: "部门管理", + icon: "tree", + hidden: false, + roles: ["ADMIN"], + externalUrl: null, + keepAlive: true, + }, + }, + { + path: "dict", + component: "system/dict/index", + name: "Dict", + meta: { + title: "字典管理", + icon: "dict", + hidden: false, + roles: ["ADMIN"], + externalUrl: null, + keepAlive: true, + }, + }, + ], + }, + ], + msg: "一切ok", + }, + }, + + { + url: "/api/v1/menus", // 路径会拼接为: /dev-api/api/v1/menus/routes + method: ["GET"], + body: { + code: "00000", + data: [ + { + id: 1, + parentId: 0, + name: "系统管理", + type: "CATALOG", + path: "/system", + component: "Layout", + sort: 1, + visible: 1, + icon: "system", + redirect: "/system/user", + perm: null, + children: [ + { + id: 2, + parentId: 1, + name: "用户管理", + type: "MENU", + path: "user", + component: "system/user/index", + sort: 1, + visible: 1, + icon: "user", + redirect: null, + perm: null, + children: [ + { + id: 31, + parentId: 2, + name: "用户新增", + type: "BUTTON", + path: "", + component: null, + sort: 1, + visible: 1, + icon: "", + redirect: "", + perm: "sys:user:add", + children: [], + }, + { + id: 32, + parentId: 2, + name: "用户编辑", + type: "BUTTON", + path: "", + component: null, + sort: 2, + visible: 1, + icon: "", + redirect: "", + perm: "sys:user:edit", + children: [], + }, + { + id: 33, + parentId: 2, + name: "用户删除", + type: "BUTTON", + path: "", + component: null, + sort: 3, + visible: 1, + icon: "", + redirect: "", + perm: "sys:user:delete", + children: [], + }, + { + id: 88, + parentId: 2, + name: "重置密码", + type: "BUTTON", + path: "", + component: null, + sort: 4, + visible: 1, + icon: "", + redirect: null, + perm: "sys:user:reset_pwd", + children: [], + }, + ], + }, + { + id: 3, + parentId: 1, + name: "角色管理", + type: "MENU", + path: "role", + component: "system/role/index", + sort: 2, + visible: 1, + icon: "role", + redirect: null, + perm: null, + children: [ + { + id: 70, + parentId: 3, + name: "角色新增", + type: "BUTTON", + path: "", + component: null, + sort: 1, + visible: 1, + icon: "", + redirect: null, + perm: "sys:role:add", + children: [], + }, + { + id: 71, + parentId: 3, + name: "角色编辑", + type: "BUTTON", + path: "", + component: null, + sort: 2, + visible: 1, + icon: "", + redirect: null, + perm: "sys:role:edit", + children: [], + }, + { + id: 72, + parentId: 3, + name: "角色删除", + type: "BUTTON", + path: "", + component: null, + sort: 3, + visible: 1, + icon: "", + redirect: null, + perm: "sys:role:delete", + children: [], + }, + ], + }, + { + id: 4, + parentId: 1, + name: "菜单管理", + type: "MENU", + path: "menu", + component: "system/menu/index", + sort: 3, + visible: 1, + icon: "menu", + redirect: null, + perm: null, + children: [ + { + id: 73, + parentId: 4, + name: "菜单新增", + type: "BUTTON", + path: "", + component: null, + sort: 1, + visible: 1, + icon: "", + redirect: null, + perm: "sys:menu:add", + children: [], + }, + { + id: 74, + parentId: 4, + name: "菜单编辑", + type: "BUTTON", + path: "", + component: null, + sort: 3, + visible: 1, + icon: "", + redirect: null, + perm: "sys:menu:edit", + children: [], + }, + { + id: 75, + parentId: 4, + name: "菜单删除", + type: "BUTTON", + path: "", + component: null, + sort: 3, + visible: 1, + icon: "", + redirect: null, + perm: "sys:menu:delete", + children: [], + }, + ], + }, + { + id: 5, + parentId: 1, + name: "部门管理", + type: "MENU", + path: "dept", + component: "system/dept/index", + sort: 4, + visible: 1, + icon: "tree", + redirect: null, + perm: null, + children: [ + { + id: 76, + parentId: 5, + name: "部门新增", + type: "BUTTON", + path: "", + component: null, + sort: 1, + visible: 1, + icon: "", + redirect: null, + perm: "sys:dept:add", + children: [], + }, + { + id: 77, + parentId: 5, + name: "部门编辑", + type: "BUTTON", + path: "", + component: null, + sort: 2, + visible: 1, + icon: "", + redirect: null, + perm: "sys:dept:edit", + children: [], + }, + { + id: 78, + parentId: 5, + name: "部门删除", + type: "BUTTON", + path: "", + component: null, + sort: 3, + visible: 1, + icon: "", + redirect: null, + perm: "sys:dept:delete", + children: [], + }, + ], + }, + { + id: 6, + parentId: 1, + name: "字典管理", + type: "MENU", + path: "dict", + component: "system/dict/index", + sort: 5, + visible: 1, + icon: "dict", + redirect: null, + perm: null, + children: [ + { + id: 79, + parentId: 6, + name: "字典类型新增", + type: "BUTTON", + path: "", + component: null, + sort: 1, + visible: 1, + icon: "", + redirect: null, + perm: "sys:dict_type:add", + children: [], + }, + { + id: 81, + parentId: 6, + name: "字典类型编辑", + type: "BUTTON", + path: "", + component: null, + sort: 2, + visible: 1, + icon: "", + redirect: null, + perm: "sys:dict_type:edit", + children: [], + }, + { + id: 84, + parentId: 6, + name: "字典类型删除", + type: "BUTTON", + path: "", + component: null, + sort: 3, + visible: 1, + icon: "", + redirect: null, + perm: "sys:dict_type:delete", + children: [], + }, + { + id: 85, + parentId: 6, + name: "字典数据新增", + type: "BUTTON", + path: "", + component: null, + sort: 4, + visible: 1, + icon: "", + redirect: null, + perm: "sys:dict:add", + children: [], + }, + { + id: 86, + parentId: 6, + name: "字典数据编辑", + type: "BUTTON", + path: "", + component: null, + sort: 5, + visible: 1, + icon: "", + redirect: null, + perm: "sys:dict:edit", + children: [], + }, + { + id: 87, + parentId: 6, + name: "字典数据删除", + type: "BUTTON", + path: "", + component: null, + sort: 6, + visible: 1, + icon: "", + redirect: null, + perm: "sys:dict:delete", + children: [], + }, + ], + }, + ], + }, + { + id: 115, + parentId: 0, + name: "数据报表", + type: "CATALOG", + path: "/bi", + component: "Layout", + sort: 3, + visible: 1, + icon: "table", + redirect: null, + perm: null, + children: [ + { + id: 133, + parentId: 115, + name: "案件跟进 - 日清日结", + type: "MENU", + path: "followup/feedback", + component: "bi/dispatch/case-feedback", + externalUrl: + "http://superset.faxinai.cn/token3rd/dashboard/view/pc.htm?pageId=92f515b8-1fd9-4e08-af2c-c314ab8eefb7&accessToken=dab2963e1e415e5b78765c7694929dd2&dd_orientation=auto", + sort: 1, + visible: 1, + icon: "peoples", + redirect: null, + perm: null, + children: [], + }, + { + id: 135, + parentId: 115, + name: "基础数据", + type: "CATALOG", + path: "basic", + component: "Layout", + sort: 1, + visible: 1, + icon: "dict", + redirect: null, + perm: null, + children: [ + { + id: 136, + parentId: 135, + name: "基础数据报表", + type: "MENU", + path: "基础数据报表原型", + component: "bi/lawyer/lawyer-basic", + sort: 1, + visible: 1, + icon: "", + redirect: null, + perm: null, + children: [], + }, + ], + }, + { + id: 134, + parentId: 115, + name: "案件跟进 - 整体办案", + type: "MENU", + path: "followup/follow", + component: "bi/dispatch/case-follow", + sort: 2, + visible: 1, + icon: "peoples", + redirect: null, + perm: null, + children: [], + }, + { + id: 124, + parentId: 115, + name: "确权回款表", + type: "MENU", + path: "fulfill", + component: "bi/fulfill/fulfill-plan", + sort: 3, + visible: 1, + icon: "peoples", + redirect: null, + perm: null, + children: [], + }, + { + id: 117, + parentId: 115, + name: "律师VS案源分布", + type: "MENU", + path: "source", + component: "bi/dispatch/case-source", + sort: 4, + visible: 1, + icon: "peoples", + redirect: null, + perm: null, + children: [], + }, + { + id: 128, + parentId: 115, + name: "现金回款表", + type: "MENU", + path: "repay", + component: "bi/repay/repay", + sort: 5, + visible: 1, + icon: "peoples", + redirect: null, + perm: null, + children: [], + }, + { + id: 120, + parentId: 115, + name: "案源方VS案件状态", + type: "MENU", + path: "state", + component: "bi/dispatch/case-state", + sort: 10, + visible: 1, + icon: "peoples", + redirect: null, + perm: null, + children: [], + }, + { + id: 122, + parentId: 115, + name: "律师VS案件状态", + type: "MENU", + path: "lawyer-state", + component: "bi/dispatch/case-lawyer-state", + sort: 10, + visible: 1, + icon: "peoples", + redirect: null, + perm: null, + children: [], + }, + { + id: 119, + parentId: 115, + name: "案件明细表", + type: "MENU", + path: "detail", + component: "bi/dispatch/detail", + sort: 20, + visible: 1, + icon: "table", + redirect: null, + perm: null, + children: [], + }, + { + id: 125, + parentId: 115, + name: "履行明细", + type: "MENU", + path: "fulfill-detail", + component: "bi/fulfill/fulfill-detail", + sort: 20, + visible: 1, + icon: "peoples", + redirect: null, + perm: null, + children: [], + }, + { + id: 126, + parentId: 115, + name: "全量订单列表", + type: "MENU", + path: "order-detail", + component: "bi/case/order-detail", + sort: 25, + visible: 1, + icon: "peoples", + redirect: null, + perm: null, + children: [], + }, + ], + }, + { + id: 40, + parentId: 0, + name: "接口文档", + type: "CATALOG", + path: "/api", + component: "Layout", + sort: 7, + visible: 1, + icon: "api", + redirect: "", + perm: null, + children: [ + { + id: 41, + parentId: 40, + name: "Apifox", + type: "MENU", + path: "apifox", + component: "demo/api/apifox", + sort: 1, + visible: 1, + icon: "api", + redirect: "", + perm: null, + children: [], + }, + { + id: 103, + parentId: 40, + name: "Swagger", + type: "MENU", + path: "swagger", + component: "demo/api/swagger", + sort: 2, + visible: 0, + icon: "api", + redirect: "", + perm: null, + children: [], + }, + { + id: 104, + parentId: 40, + name: "Knife4j", + type: "MENU", + path: "knife4j", + component: "demo/api/knife4j", + sort: 3, + visible: 0, + icon: "api", + redirect: "", + perm: null, + children: [], + }, + ], + }, + { + id: 26, + parentId: 0, + name: "平台文档", + type: "CATALOG", + path: "/doc", + component: "Layout", + sort: 8, + visible: 1, + icon: "document", + redirect: null, + perm: null, + children: [ + { + id: 102, + parentId: 26, + name: "平台文档(内嵌)", + type: "EXTLINK", + path: "internal-doc", + component: "demo/internal-doc", + sort: 1, + visible: 1, + icon: "document", + redirect: "", + perm: null, + children: [], + }, + { + id: 30, + parentId: 26, + name: "平台文档(外链)", + type: "EXTLINK", + path: "https://juejin.cn/post/7228990409909108793", + component: "", + sort: 2, + visible: 1, + icon: "link", + redirect: "", + perm: null, + children: [], + }, + ], + }, + { + id: 20, + parentId: 0, + name: "多级菜单", + type: "CATALOG", + path: "/multi-level", + component: "Layout", + sort: 9, + visible: 1, + icon: "cascader", + redirect: "/multi-level/multi-level1", + perm: null, + children: [ + { + id: 21, + parentId: 20, + name: "菜单一级", + type: "MENU", + path: "multi-level1", + component: "demo/multi-level/level1", + sort: 1, + visible: 1, + icon: "", + redirect: "/multi-level/multi-level2", + perm: null, + children: [ + { + id: 22, + parentId: 21, + name: "菜单二级", + type: "MENU", + path: "multi-level2", + component: "demo/multi-level/children/level2", + sort: 1, + visible: 1, + icon: "", + redirect: "/multi-level/multi-level2/multi-level3-1", + perm: null, + children: [ + { + id: 23, + parentId: 22, + name: "菜单三级-1", + type: "MENU", + path: "multi-level3-1", + component: "demo/multi-level/children/children/level3-1", + sort: 1, + visible: 1, + icon: "", + redirect: "", + perm: null, + children: [], + }, + { + id: 24, + parentId: 22, + name: "菜单三级-2", + type: "MENU", + path: "multi-level3-2", + component: "demo/multi-level/children/children/level3-2", + sort: 2, + visible: 1, + icon: "", + redirect: "", + perm: null, + children: [], + }, + ], + }, + ], + }, + ], + }, + { + id: 36, + parentId: 0, + name: "组件封装", + type: "CATALOG", + path: "/component", + component: "Layout", + sort: 10, + visible: 1, + icon: "menu", + redirect: "", + perm: null, + children: [ + { + id: 37, + parentId: 36, + name: "富文本编辑器", + type: "MENU", + path: "wang-editor", + component: "demo/wang-editor", + sort: 1, + visible: 1, + icon: "", + redirect: "", + perm: null, + children: [], + }, + { + id: 38, + parentId: 36, + name: "图片上传", + type: "MENU", + path: "upload", + component: "demo/upload", + sort: 2, + visible: 1, + icon: "", + redirect: "", + perm: null, + children: [], + }, + { + id: 39, + parentId: 36, + name: "图标选择器", + type: "MENU", + path: "icon-selector", + component: "demo/icon-selector", + sort: 3, + visible: 1, + icon: "", + redirect: "", + perm: null, + children: [], + }, + { + id: 95, + parentId: 36, + name: "字典组件", + type: "MENU", + path: "dict-demo", + component: "demo/dict", + sort: 4, + visible: 1, + icon: "", + redirect: "", + perm: null, + children: [], + }, + { + id: 93, + parentId: 36, + name: "签名", + type: "MENU", + path: "signature", + component: "demo/signature", + sort: 6, + visible: 1, + icon: "", + redirect: "", + perm: null, + children: [], + }, + { + id: 94, + parentId: 36, + name: "表格", + type: "MENU", + path: "table", + component: "demo/table", + sort: 7, + visible: 1, + icon: "", + redirect: "", + perm: null, + children: [], + }, + ], + }, + { + id: 89, + parentId: 0, + name: "功能演示", + type: "CATALOG", + path: "/function", + component: "Layout", + sort: 11, + visible: 1, + icon: "menu", + redirect: "", + perm: null, + children: [ + { + id: 97, + parentId: 89, + name: "Icons", + type: "MENU", + path: "icon-demo", + component: "demo/icons", + sort: 2, + visible: 1, + icon: "el-icon-edit", + redirect: "", + perm: null, + children: [], + }, + { + id: 90, + parentId: 89, + name: "Websocket", + type: "MENU", + path: "/function/websocket", + component: "demo/websocket", + sort: 3, + visible: 1, + icon: "", + redirect: "", + perm: null, + children: [], + }, + { + id: 91, + parentId: 89, + name: "敬请期待...", + type: "CATALOG", + path: "other", + component: "demo/other", + sort: 4, + visible: 1, + icon: "", + redirect: "", + perm: null, + children: [], + }, + ], + }, + ], + msg: "一切ok", + }, + }, + + { + url: "/api/v1/menus/:id/form", // 路径会拼接为: /dev-api/api/v1/menus/routes + method: ["GET"], + body: { + code: "00000", + data: { + id: 133, + parentId: 115, + name: "案件跟进 - 日清日结", + type: "MENU", + path: "followup/feedback", + component: "bi/dispatch/case-feedback", + externalUrl: + "http://superset.faxinai.cn/token3rd/dashboard/view/pc.htm?pageId=92f515b8-1fd9-4e08-af2c-c314ab8eefb7&accessToken=dab2963e1e415e5b78765c7694929dd2&dd_orientation=auto", + perm: null, + visible: 1, + sort: 1, + icon: "peoples", + redirect: null, + keepAlive: 1, + alwaysShow: null, + }, + msg: "一切ok", + }, + }, +]); diff --git a/mock/role.mock.ts b/mock/role.mock.ts new file mode 100644 index 0000000000000000000000000000000000000000..f86c8ae286cff251ac4051dfe9dc053b795398f6 --- /dev/null +++ b/mock/role.mock.ts @@ -0,0 +1,210 @@ +import path from "path"; +import { createDefineMock } from "vite-plugin-mock-dev-server"; + +const defineMock = createDefineMock((mock) => { + mock.url = path.join(import.meta.env.VITE_APP_BASE_API, mock.url); // 路径会拼接为: /dev-api + url +}); + +export default defineMock([ + { + url: "/api/v1/roles/options", + method: ["GET"], + body: { + code: "00000", + data: [ + { + value: 2, + label: "系统管理员", + }, + { + value: 4, + label: "系统管理员1", + }, + { + value: 5, + label: "系统管理员2", + }, + { + value: 6, + label: "系统管理员3", + }, + { + value: 7, + label: "系统管理员4", + }, + { + value: 8, + label: "系统管理员5", + }, + { + value: 9, + label: "系统管理员6", + }, + { + value: 10, + label: "系统管理员7", + }, + { + value: 11, + label: "系统管理员8", + }, + { + value: 12, + label: "系统管理员9", + }, + { + value: 3, + label: "访问游客", + }, + ], + msg: "一切ok", + }, + }, + + { + url: "/api/v1/roles/page", + method: ["GET"], + body: { + code: "00000", + data: { + list: [ + { + id: 2, + name: "系统管理员", + code: "ADMIN", + status: 1, + sort: 2, + createTime: "2021-03-25 12:39:54", + updateTime: null, + }, + { + id: 3, + name: "访问游客", + code: "GUEST", + status: 1, + sort: 3, + createTime: "2021-05-26 15:49:05", + updateTime: "2019-05-05 16:00:00", + }, + { + id: 4, + name: "系统管理员1", + code: "ADMIN1", + status: 1, + sort: 2, + createTime: "2021-03-25 12:39:54", + updateTime: null, + }, + { + id: 5, + name: "系统管理员2", + code: "ADMIN2", + status: 1, + sort: 2, + createTime: "2021-03-25 12:39:54", + updateTime: null, + }, + { + id: 6, + name: "系统管理员3", + code: "ADMIN3", + status: 1, + sort: 2, + createTime: "2021-03-25 12:39:54", + updateTime: null, + }, + { + id: 7, + name: "系统管理员4", + code: "ADMIN4", + status: 1, + sort: 2, + createTime: "2021-03-25 12:39:54", + updateTime: null, + }, + { + id: 8, + name: "系统管理员5", + code: "ADMIN5", + status: 1, + sort: 2, + createTime: "2021-03-25 12:39:54", + updateTime: null, + }, + { + id: 9, + name: "系统管理员6", + code: "ADMIN6", + status: 1, + sort: 2, + createTime: "2021-03-25 12:39:54", + updateTime: "2023-12-04 11:43:15", + }, + { + id: 10, + name: "系统管理员7", + code: "ADMIN7", + status: 1, + sort: 2, + createTime: "2021-03-25 12:39:54", + updateTime: null, + }, + { + id: 11, + name: "系统管理员8", + code: "ADMIN8", + status: 1, + sort: 2, + createTime: "2021-03-25 12:39:54", + updateTime: null, + }, + ], + total: 10, + }, + msg: "一切ok", + }, + }, + + { + url: "/api/v1/roles/:id/form", + method: ["GET"], + body: ({ params }) => { + const id = params.id; + let formData = null; + if (id == 2) { + formData = { + id: 2, + name: "系统管理员", + code: "ADMIN", + sort: 2, + status: 1, + dataScope: 1, + }; + } else if (id == 3) { + formData = { + id: 3, + name: "访问游客", + code: "GUEST", + sort: 3, + status: 1, + dataScope: 2, + }; + } else { + formData = { + id: 4, + name: "系统管理员1", + code: "ADMIN1", + sort: 2, + status: 1, + dataScope: 1, + }; + } + + return { + code: "00000", + data: formData, + msg: "一切ok", + }; + }, + }, +]); diff --git a/mock/role.ts b/mock/role.ts deleted file mode 100644 index 6c3419f614b6fa598e957022820245361791339b..0000000000000000000000000000000000000000 --- a/mock/role.ts +++ /dev/null @@ -1,165 +0,0 @@ -import { MockMethod } from "vite-plugin-mock"; - -export default [ - { - url: "/api/v1/roles/options", - method: "get", - response: () => { - return { - code: "00000", - data: [ - { - value: 2, - label: "系统管理员", - }, - { - value: 4, - label: "系统管理员1", - }, - { - value: 5, - label: "系统管理员2", - }, - { - value: 6, - label: "系统管理员3", - }, - { - value: 7, - label: "系统管理员4", - }, - { - value: 8, - label: "系统管理员5", - }, - { - value: 9, - label: "系统管理员6", - }, - { - value: 10, - label: "系统管理员7", - }, - { - value: 11, - label: "系统管理员8", - }, - { - value: 12, - label: "系统管理员9", - }, - { - value: 3, - label: "访问游客", - }, - ], - msg: "一切ok", - }; - }, - }, - { - url: "/api/v1/roles/page", - method: "get", - response: () => { - return { - code: "00000", - data: { - list: [ - { - id: 2, - name: "系统管理员", - code: "ADMIN", - status: 1, - sort: 2, - createTime: "2021-03-25 12:39:54", - updateTime: null, - }, - { - id: 3, - name: "访问游客", - code: "GUEST", - status: 1, - sort: 3, - createTime: "2021-05-26 15:49:05", - updateTime: "2019-05-05 16:00:00", - }, - { - id: 4, - name: "系统管理员1", - code: "ADMIN1", - status: 1, - sort: 2, - createTime: "2021-03-25 12:39:54", - updateTime: null, - }, - { - id: 5, - name: "系统管理员2", - code: "ADMIN1", - status: 1, - sort: 2, - createTime: "2021-03-25 12:39:54", - updateTime: null, - }, - { - id: 6, - name: "系统管理员3", - code: "ADMIN1", - status: 1, - sort: 2, - createTime: "2021-03-25 12:39:54", - updateTime: null, - }, - { - id: 7, - name: "系统管理员4", - code: "ADMIN1", - status: 1, - sort: 2, - createTime: "2021-03-25 12:39:54", - updateTime: null, - }, - { - id: 8, - name: "系统管理员5", - code: "ADMIN1", - status: 1, - sort: 2, - createTime: "2021-03-25 12:39:54", - updateTime: null, - }, - { - id: 9, - name: "系统管理员6", - code: "ADMIN1", - status: 1, - sort: 2, - createTime: "2021-03-25 12:39:54", - updateTime: null, - }, - { - id: 10, - name: "系统管理员7", - code: "ADMIN1", - status: 1, - sort: 2, - createTime: "2021-03-25 12:39:54", - updateTime: null, - }, - { - id: 11, - name: "系统管理员8", - code: "ADMIN1", - status: 1, - sort: 2, - createTime: "2021-03-25 12:39:54", - updateTime: null, - }, - ], - total: 11, - }, - msg: "一切ok", - }; - }, - }, -] as MockMethod[]; diff --git a/mock/router.ts b/mock/router.ts deleted file mode 100644 index 60375071f7630d8d5993786ebbe2bbadfb431873..0000000000000000000000000000000000000000 --- a/mock/router.ts +++ /dev/null @@ -1,412 +0,0 @@ -import { MockMethod } from "vite-plugin-mock"; -const url = "/api/v1/menus/routes"; -const method = "get"; -const data = { - code: "00000", - data: [ - { - path: "/system", - component: "Layout", - redirect: "/system/user", - meta: { - title: "系统管理", - icon: "system", - hidden: false, - roles: ["ADMIN"], - keepAlive: true, - }, - children: [ - { - path: "user", - component: "system/user/index", - name: "User", - meta: { - title: "用户管理", - icon: "user", - hidden: false, - roles: ["ADMIN"], - keepAlive: true, - }, - }, - { - path: "role", - component: "system/role/index", - name: "Role", - meta: { - title: "角色管理", - icon: "role", - hidden: false, - roles: ["ADMIN"], - keepAlive: true, - }, - }, - { - path: "menu", - component: "system/menu/index", - name: "Menu", - meta: { - title: "菜单管理", - icon: "menu", - hidden: false, - roles: ["ADMIN"], - keepAlive: true, - }, - }, - { - path: "dept", - component: "system/dept/index", - name: "Dept", - meta: { - title: "部门管理", - icon: "tree", - hidden: false, - roles: ["ADMIN"], - keepAlive: true, - }, - }, - { - path: "dict", - component: "system/dict/index", - name: "DictType", - meta: { - title: "字典管理", - icon: "dict", - hidden: false, - roles: ["ADMIN"], - keepAlive: true, - }, - }, - ], - }, - - { - path: "/api", - component: "Layout", - meta: { - title: "接口", - icon: "api", - hidden: false, - roles: ["ADMIN"], - keepAlive: true, - }, - children: [ - { - path: "apidoc", - component: "demo/api-doc", - name: "Apidoc", - meta: { - title: "接口文档", - icon: "api", - hidden: false, - roles: ["ADMIN"], - keepAlive: false, - }, - }, - ], - }, - { - path: "/external-link", - component: "Layout", - redirect: "noredirect", - meta: { - title: "外部链接", - icon: "link", - hidden: false, - roles: ["ADMIN"], - keepAlive: true, - }, - children: [ - { - path: "https://juejin.cn/post/7228990409909108793", - meta: { - title: "document", - icon: "document", - hidden: false, - roles: ["ADMIN"], - keepAlive: true, - }, - }, - ], - }, - { - path: "/multi-level", - component: "Layout", - redirect: "/multi-level/multi-level1", - meta: { - title: "多级菜单", - icon: "multi_level", - hidden: false, - roles: ["ADMIN"], - keepAlive: true, - }, - children: [ - { - path: "multi-level1", - component: "demo/multi-level/level1", - redirect: "/multi-level/multi-level2", - meta: { - title: "菜单一级", - icon: "", - hidden: false, - roles: ["ADMIN"], - keepAlive: true, - }, - children: [ - { - path: "multi-level2", - component: "demo/multi-level/children/level2", - redirect: "/multi-level/multi-level2/multi-level3-1", - meta: { - title: "菜单二级", - icon: "", - hidden: false, - roles: ["ADMIN"], - keepAlive: true, - }, - children: [ - { - path: "multi-level3-1", - component: "demo/multi-level/children/children/level3-1", - name: "MultiLevel31", - meta: { - title: "菜单三级-1", - icon: "", - hidden: false, - roles: ["ADMIN"], - keepAlive: true, - }, - }, - { - path: "multi-level3-2", - component: "demo/multi-level/children/children/level3-2", - name: "MultiLevel32", - meta: { - title: "菜单三级-2", - icon: "", - hidden: false, - roles: ["ADMIN"], - keepAlive: true, - }, - }, - ], - }, - ], - }, - ], - }, - { - path: "/component", - component: "Layout", - meta: { - title: "组件封装", - icon: "menu", - hidden: false, - roles: ["ADMIN"], - keepAlive: true, - }, - children: [ - { - path: "wang-editor", - component: "demo/wang-editor", - name: "wang-editor", - meta: { - title: "富文本编辑器", - icon: "", - hidden: false, - roles: ["ADMIN"], - keepAlive: true, - }, - }, - { - path: "upload", - component: "demo/upload", - name: "upload", - meta: { - title: "图片上传", - icon: "", - hidden: false, - roles: ["ADMIN"], - keepAlive: true, - }, - }, - { - path: "icon-selector", - component: "demo/icon-selector", - name: "icon-selector", - meta: { - title: "图标选择器", - icon: "", - hidden: false, - roles: ["ADMIN"], - keepAlive: true, - }, - }, - { - path: "dict-demo", - component: "demo/dict", - name: "DictDemo", - meta: { - title: "字典组件", - icon: "", - hidden: false, - roles: ["ADMIN"], - keepAlive: true, - }, - }, - { - path: "taginput", - component: "demo/taginput", - name: "taginput", - meta: { - title: "标签输入框", - icon: "", - hidden: false, - roles: ["ADMIN"], - keepAlive: true, - }, - }, - { - path: "signature", - component: "demo/signature", - name: "signature", - meta: { - title: "签名", - icon: "", - hidden: false, - roles: ["ADMIN"], - keepAlive: true, - }, - }, - { - path: "table", - component: "demo/table", - name: "Table", - meta: { - title: "表格", - icon: "", - hidden: false, - roles: ["ADMIN"], - keepAlive: true, - }, - }, - ], - }, - { - path: "/table", - component: "Layout", - meta: { - title: "Table", - icon: "table", - hidden: false, - roles: ["ADMIN"], - keepAlive: true, - }, - children: [ - { - path: "dynamic-table", - component: "demo/table/dynamic-table/index", - name: "DynamicTable", - meta: { - title: "动态Table", - hidden: false, - roles: ["ADMIN"], - keepAlive: true, - }, - }, - { - path: "drag-table", - component: "demo/table/drag-table", - name: "DragTable", - meta: { - title: "拖拽Table", - hidden: false, - roles: ["ADMIN"], - keepAlive: true, - }, - }, - { - path: "complex-table", - component: "demo/table/complex-table", - name: "ComplexTable", - meta: { - title: "综合Table", - hidden: false, - roles: ["ADMIN"], - keepAlive: true, - }, - }, - ], - }, - { - path: "/function", - component: "Layout", - meta: { - title: "功能演示", - icon: "menu", - hidden: false, - roles: ["ADMIN"], - keepAlive: true, - }, - children: [ - { - path: "permission", - component: "demo/permission/page", - name: "Permission", - meta: { - title: "Permission", - icon: "", - hidden: false, - roles: ["ADMIN"], - keepAlive: true, - }, - }, - { - path: "icon-demo", - component: "demo/icons", - name: "Icons", - meta: { - title: "图标", - icon: "", - hidden: false, - roles: ["ADMIN"], - keepAlive: true, - }, - }, - { - path: "websocket", - component: "demo/websocket", - name: "Websocket", - meta: { - title: "Websocket", - icon: "", - hidden: false, - roles: ["ADMIN"], - keepAlive: true, - }, - }, - { - path: "other", - component: "demo/other", - meta: { - title: "敬请期待...", - icon: "", - hidden: false, - roles: ["ADMIN"], - keepAlive: true, - }, - }, - ], - }, - ], - msg: "一切ok", -}; - -export default [ - { - url: url, - method: method, - response: () => { - return data; - }, - }, -] as MockMethod[]; diff --git a/mock/user.mock.ts b/mock/user.mock.ts new file mode 100644 index 0000000000000000000000000000000000000000..bc30fb7a0f14cfcd9ef7951332614e06e05c259b --- /dev/null +++ b/mock/user.mock.ts @@ -0,0 +1,131 @@ +import path from "path"; +import { createDefineMock } from "vite-plugin-mock-dev-server"; + +const defineMock = createDefineMock((mock) => { + mock.url = path.join(import.meta.env.VITE_APP_BASE_API, mock.url); // 路径会拼接为: /dev-api + url +}); + +export default defineMock([ + { + url: "/api/v1/users/me", + method: ["GET"], + body: { + code: "00000", + data: { + userId: 2, + nickname: "系统管理员", + avatar: + "https://oss.youlai.tech/youlai-boot/2023/05/16/811270ef31f548af9cffc026dfc3777b.gif", + roles: ["ADMIN"], + perms: [ + "sys:menu:delete", + "sys:dept:edit", + "sys:dict_type:add", + "sys:dict:edit", + "sys:dict:delete", + "sys:dict_type:edit", + "sys:menu:add", + "sys:user:add", + "sys:role:edit", + "sys:dept:delete", + "sys:user:edit", + "sys:user:delete", + "sys:user:reset_pwd", + "sys:dept:add", + "sys:role:delete", + "sys:dict_type:delete", + "sys:menu:edit", + "sys:dict:add", + "sys:role:add", + ], + }, + msg: "一切ok", + }, + }, + + { + url: "/api/v1/users/page", + method: ["GET"], + body: { + code: "00000", + data: { + list: [ + { + id: 2, + username: "admin", + nickname: "系统管理员", + mobile: "17621210366", + genderLabel: "男", + avatar: + "https://oss.youlai.tech/youlai-boot/2023/05/16/811270ef31f548af9cffc026dfc3777b.gif", + email: null, + status: 1, + deptName: "有来技术", + roleNames: "系统管理员", + createTime: "2019-10-10", + }, + { + id: 3, + username: "test", + nickname: "测试小用户", + mobile: "17621210366", + genderLabel: "男", + avatar: + "https://oss.youlai.tech/youlai-boot/2023/05/16/811270ef31f548af9cffc026dfc3777b.gif", + email: null, + status: 1, + deptName: "测试部门", + roleNames: "访问游客", + createTime: "2021-06-04", + }, + ], + total: 2, + }, + msg: "一切ok", + }, + }, + + { + url: "/api/v1/users/:userId/form", + method: ["GET"], + body: ({ params }) => { + const userId = params.userId; + let formData = null; + if (userId == 2) { + formData = { + id: 2, + username: "admin", + nickname: "系统管理员", + mobile: "17621210366", + gender: 1, + avatar: + "https://oss.youlai.tech/youlai-boot/2023/05/16/811270ef31f548af9cffc026dfc3777b.gif", + email: "", + status: 1, + deptId: 1, + roleIds: [2], + }; + } else if (userId == 3) { + formData = { + id: 3, + username: "test", + nickname: "测试小用户", + mobile: "17621210366", + gender: 1, + avatar: + "https://oss.youlai.tech/youlai-boot/2023/05/16/811270ef31f548af9cffc026dfc3777b.gif", + email: "youlaitech@163.com", + status: 1, + deptId: 3, + roleIds: [3], + }; + } + + return { + code: "00000", + data: formData, + msg: "一切ok", + }; + }, + }, +]); diff --git a/mock/user.ts b/mock/user.ts deleted file mode 100644 index 690f8ea781ff8db84819b25ece341cee80ebb7c8..0000000000000000000000000000000000000000 --- a/mock/user.ts +++ /dev/null @@ -1,182 +0,0 @@ -import { MockMethod } from "vite-plugin-mock"; - -export default [ - { - url: "/api/hello_world", - method: "get", - response: (request) => { - return { - msg: "hello world", - headers: request.headers, - }; - }, - }, - { - url: "/api/v1/auth/captcha", - method: "get", - response: () => { - return { - code: "00000", - data: { - captchaKey: "534b8ef2b0a24121bec76391ddd159f9", - captchaBase64: - "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAHgAAAAkCAIAAADNSmkJAAAFKUlEQVR4Xu2ZXUwcVRiGV70wMWo08V5NvPXCrDbFaGpMaZW2hqQxaoiJTRsaMBCNSYtpa2JTKiFSelFa+Q/QZcMWqEhBlh+htbEpZhMrBQrlJ0hBywLLyrJ0WZbje3bqOvPNLHPWrDvdOE9ONmfe78zkzMs335wzWJhJQrBQweS/wTQ6QWgYHdoIOcecOe05O+t2WkutO+p2ZF3Ksg/YV9ZW6FATYajR3nveg60H9327r3O8c35lHgp+r05dPdJzBL73TPSQ8SaCKIxGLsPlop+K0JHrEkPuoT31e5qGmmjARACF0agYyGVNlyVm/pzZXrN9fHGcBkz0UBid+31u93i3XFFT80vN8cvHqWqih8Lo1NpUqS5vwh3vnd223VQ10UNh9NbyrcFQUK6oCawHUipSqGqiB83oBf+CXFGDMp1mS6OqiR4Ko7FexkpOrqhpHGw82nOUqiZ6KIzGrkRuorW0dJMmOy+hOCfYGzb2RBFv6HRO0gEJw/U7y+pgL1bwmTxexN6sZ31TdEwEhdG+gA+7EqyXpUO1uZH20cWL8hMTRt1N9tBXzCJrOIRoCPJpSO2RAp4HmtCdIfZ+2JWgEBN9LbR28seTGU0Zue1tMLp+YIAMSADzfvbkKX4/eb28j4YODiGin3heqmIlLja5hAUCu+nmGY3JWKvpMAlqNGgebsauBOvlqSX+JEx7p7EbTLen53XlzfmWUioqXikrc68Y8N2juJ/fyVsNChGHEE//rBANYWaZz+TRQqpLaBgNsPfDrgSpbS21YtV87IdjrlkX9JZbt5DOma2t9ITo5F+5glN22WwL/n+yDv00mw06orKxOqQ5+J04hhViwzAXETIcJDVm8uxZqktoGx2Nj9t43Wgaul/ERQiGQvtbWnDWgZYW9CXlQFjZ/7ciyHNn+Z2MexTimIeLz59TiIln0M1e+IbPpOAaDUnEYPTi6iqKxpbycs/qKo1tCslfKcffPn9enuMiPPY1vxO/ckeFQ4h46cdGqUWoidE/y54q5tPY5WDrGzQqIXot4BgchEE57e00IMCw2/1qZSVO/7SjA78o9INzcxsbrL+fnTnDDh9mmZn8F30oG1Hm+nABv5mQMopDS/h1HxtqTzWbABMe9sxpPoe9zezeOo1GELqWhPS8t46M0IAYHbdvR1aHbaOjbjfLz2eFhez6dba4yAfgF30o0BFVE8+Mjh/wFxPI+I5mAEHU6Ls+38vhTFwOBGhMDF8gkFpbC5ffsdv/uBs6dIj19dExEtARVXv9YNbop8NFY3aZ6gRRo+tu3IBHnzmdNCBMXldXJKPfL74WzWUJRE+coDUknqsOdZXQbAJYwluVTbOZI3Qt8GFzMwxyjo3RgBiN4fr+elXVpZGRLWXl6PdOTtJBSlBDUK/lnIrjOlrtqWYTQDJaF6FrTXu9sOa1ysrVoM5HVE1GFxZQcyJ/p+xzv6K/rbr6N6+XDpUBl0tKFIrbz78qWB6YnWFMCBld4XLBms+7df75ook/GNzb0GCV7U1Qfz9p64TyQWNjYD3qe9rj4SMJtQP3MyjSDPzWIRHPjH7X4YAvfXoPuyZf9Pbi3PcuXIh4mp3NllYC6XY79C+jl2o8PBipxjnBttn4MgMNnWgfcRJGPI2OL8hTj3LloIlmRicvBhiNykvecpqoa3RSY4DRcLAwyicuOepVR1JjgNFYHWONHL04czTX0UmNAUYD7Pr+xc4wqTHGaBb2OtZvHUmNYUazcA2J6etdUmOk0f8rTKMTxF91RG0D1SwYGwAAAABJRU5ErkJggg==", - }, - msg: "一切ok", - }; - }, - }, - { - url: "/api/v1/auth/login", - method: "post", - response: () => { - return { - code: "00000", - data: { - accessToken: - "eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJhZG1pbiIsImp0aSI6IjE2YWJkNTlkOTAxNzQwZDliYmI3ZjczODBhZDkyNzNhIiwidXNlcklkIjoyLCJ1c2VybmFtZSI6ImFkbWluIiwiZGVwdElkIjoxLCJkYXRhU2NvcGUiOjEsImF1dGhvcml0aWVzIjpbIlJPTEVfQURNSU4iXSwiZXhwIjoxNjkxMTAzMzgyfQ.P4cuIfmPepl3HuguhMS7NXn5a7IUPpsLbmtA_rHOhHk", - tokenType: "Bearer", - refreshToken: null, - expires: null, - }, - msg: "一切ok", - }; - }, - }, - { - url: "/api/v1/users/me", - method: "get", - response: () => { - return { - code: "00000", - data: { - userId: 2, - nickname: "系统管理员", - avatar: - "https://oss.youlai.tech/youlai-boot/2023/05/16/811270ef31f548af9cffc026dfc3777b.gif", - roles: ["ADMIN"], - perms: [ - "sys:menu:delete", - "sys:dept:edit", - "sys:dict_type:add", - "sys:dict:edit", - "sys:dict:delete", - "sys:dict_type:edit", - "sys:menu:add", - "sys:user:add", - "sys:role:edit", - "sys:dept:delete", - "sys:user:edit", - "sys:user:delete", - "sys:user:reset_pwd", - "sys:dept:add", - "sys:role:delete", - "sys:dict_type:delete", - "sys:menu:edit", - "sys:dict:add", - "sys:role:add", - ], - }, - msg: "一切ok", - }; - }, - }, - { - url: "/api/v1/auth/logout", - method: "delete", - response: () => { - return { - code: "00000", - data: {}, - msg: "string", - }; - }, - }, - { - url: "/api/v1/users/page", - method: "get", - response: () => { - return { - code: "00000", - data: { - list: [ - { - id: 2, - username: "admin", - nickname: "系统管理员", - mobile: "17621210366", - genderLabel: "男", - avatar: - "https://oss.youlai.tech/youlai-boot/2023/05/16/811270ef31f548af9cffc026dfc3777b.gif", - email: null, - status: 1, - deptName: "有来技术", - roleNames: "系统管理员", - createTime: "2019-10-10", - }, - { - id: 3, - username: "test", - nickname: "测试小用户", - mobile: "17621210366", - genderLabel: "男", - avatar: - "https://oss.youlai.tech/youlai-boot/2023/05/16/811270ef31f548af9cffc026dfc3777b.gif", - email: null, - status: 1, - deptName: "测试部门", - roleNames: "访问游客", - createTime: "2021-06-04", - }, - ], - total: 2, - }, - msg: "一切ok", - }; - }, - }, - - { - url: "/api/v1/users/:id/form", - method: "get", - response: ({ url }) => { - const id = url.match(/\/api\/v1\/users\/(\d+)\/form/)[1]; - let formData = null; - if (id == 2) { - formData = { - id: 2, - username: "admin", - nickname: "系统管理员", - mobile: "17621210366", - gender: 1, - avatar: - "https://oss.youlai.tech/youlai-boot/2023/05/16/811270ef31f548af9cffc026dfc3777b.gif", - email: "", - status: 1, - deptId: 1, - roleIds: [2], - }; - } else if (id == 3) { - formData = { - id: 3, - username: "test", - nickname: "测试小用户", - mobile: "17621210366", - gender: 1, - avatar: - "https://oss.youlai.tech/youlai-boot/2023/05/16/811270ef31f548af9cffc026dfc3777b.gif", - email: "youlaitech@163.com", - status: 1, - deptId: 3, - roleIds: [3], - }; - } - - return { - code: "00000", - data: formData, - msg: "一切ok", - }; - }, - }, -] as MockMethod[]; diff --git a/package.json b/package.json index a71aeed8c8d0ae503e642e84f115acea46c3aa67..db06906811c9edfc02488aea7cbf17caa36aaa34 100644 --- a/package.json +++ b/package.json @@ -1,11 +1,13 @@ { "name": "vue3-element-admin", - "version": "2.7.0", + "version": "2.8.2", "private": true, + "type": "module", "scripts": { "preinstall": "npx only-allow pnpm", "dev": "vite serve --mode development", - "build:prod": "vite build --mode production && vue-tsc --noEmit", + "build:prod": "vite build --mode production", + "build:dev": "vite build --mode development", "prepare": "husky install", "lint:eslint": "eslint --fix --ext .ts,.js,.vue ./src ", "lint:prettier": "prettier --write \"**/*.{js,cjs,ts,json,tsx,css,less,scss,vue,html,md}\"", @@ -40,82 +42,85 @@ ] }, "dependencies": { - "@element-plus/icons-vue": "^2.1.0", - "@vitejs/plugin-vue": "^4.4.0", - "@vueuse/core": "^10.5.0", + "@element-plus/icons-vue": "^2.3.1", + "@vitejs/plugin-vue": "^4.6.2", + "@vueuse/components": "^10.9.0", + "@vueuse/core": "^10.7.1", "@wangeditor/editor": "^5.1.23", "@wangeditor/editor-for-vue": "5.1.10", - "axios": "^1.6.0", + "axios": "^1.6.5", + "date-fns": "^3.6.0", "echarts": "^5.4.3", - "element-plus": "^2.4.2", + "element-plus": "^2.7.3", "lodash-es": "^4.17.21", - "mockjs": "^1.1.0", "net": "^1.0.2", "nprogress": "^0.2.0", "path-browserify": "^1.0.1", "path-to-regexp": "^6.2.1", "pinia": "^2.1.7", + "qs": "^6.11.2", "screenfull": "^6.0.2", "sockjs-client": "1.6.1", - "sortablejs": "^1.15.0", + "sortablejs": "^1.15.1", "stompjs": "^2.3.3", - "terser": "^5.24.0", - "vue": "^3.3.8", + "terser": "^5.26.0", + "vue": "^3.4.8", "vue-i18n": "9.2.2", "vue-router": "^4.2.5", - "xlsx": "^0.18.5", - "dayjs": "^1.11.10" + "xlsx": "^0.18.5" }, "devDependencies": { "@commitlint/cli": "^17.8.1", "@commitlint/config-conventional": "^17.8.1", - "@iconify-json/ep": "^1.1.12", - "@types/lodash": "^4.14.201", + "@iconify-json/ep": "^1.1.14", + "@types/lodash": "^4.14.202", + "@types/lodash-es": "^4.17.12", + "@types/node": "^20.14.2", "@types/nprogress": "^0.2.3", "@types/path-browserify": "^1.0.2", "@types/sockjs-client": "^1.5.4", - "@types/sortablejs": "^1.15.5", - "@types/stompjs": "^2.3.8", + "@types/sortablejs": "^1.15.7", + "@types/stompjs": "^2.3.9", "@typescript-eslint/eslint-plugin": "^5.62.0", "@typescript-eslint/parser": "^5.62.0", - "@vitejs/plugin-vue-jsx": "^3.0.2", + "@vitejs/plugin-vue-jsx": "^3.1.0", "autoprefixer": "^10.4.16", "commitizen": "^4.3.0", - "cz-git": "^1.7.1", - "eslint": "^8.53.0", + "cz-git": "^1.8.0", + "eslint": "^8.56.0", "eslint-config-prettier": "^8.10.0", - "eslint-plugin-import": "^2.29.0", + "eslint-plugin-import": "^2.29.1", "eslint-plugin-prettier": "^4.2.1", - "eslint-plugin-vue": "^9.18.1", + "eslint-plugin-vue": "^9.20.0", "fast-glob": "^3.3.2", "husky": "^8.0.3", "lint-staged": "^13.3.0", - "postcss": "^8.4.31", + "postcss": "^8.4.33", "postcss-html": "^1.5.0", "postcss-scss": "^4.0.9", "prettier": "^2.8.8", - "sass": "^1.69.5", + "sass": "^1.69.7", "stylelint": "^15.11.0", "stylelint-config-html": "^1.1.0", - "stylelint-config-recess-order": "^4.3.0", + "stylelint-config-recess-order": "^4.4.0", "stylelint-config-recommended-scss": "^13.1.0", "stylelint-config-recommended-vue": "^1.5.0", "stylelint-config-standard": "^34.0.0", "stylelint-config-standard-scss": "^11.1.0", - "typescript": "^5.2.2", - "unocss": "^0.51.13", + "typescript": "^5.3.3", + "unocss": "^0.58.3", "unplugin-auto-import": "^0.15.3", "unplugin-icons": "^0.16.6", "unplugin-vue-components": "^0.24.1", - "vite": "^4.5.0", - "vite-plugin-mock": "^3.0.0", + "vite": "^5.0.11", + "vite-plugin-mock-dev-server": "^1.4.5", "vite-plugin-svg-icons": "^2.0.1", - "vue-tsc": "^1.8.22" + "vue-tsc": "^1.8.27" }, "repository": "https://gitee.com/youlaiorg/vue3-element-admin.git", "author": "有来开源组织", "license": "MIT", "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } } diff --git a/public/favicon.ico b/public/favicon.ico index df36fcfb72584e00488330b560ebcf34a41c64c2..c590820d96a83391ff7265603432c514a4326693 100644 Binary files a/public/favicon.ico and b/public/favicon.ico differ diff --git a/src/App.vue b/src/App.vue index dd2ac67225d7bedb53a392b031c8f05e291dcd29..4a3acc95f0497c1484b4ade390bcd2c10868115d 100644 --- a/src/App.vue +++ b/src/App.vue @@ -9,3 +9,29 @@ const appStore = useAppStore(); + + diff --git a/src/api/auth/index.ts b/src/api/auth/index.ts index 645628e1c3c7041589c4f86dbcf171d51d1a5b6c..b6b5a5aa1f708543717d7d41b8fa31b6521a184b 100644 --- a/src/api/auth/index.ts +++ b/src/api/auth/index.ts @@ -43,3 +43,17 @@ export function getCaptchaApi(): AxiosPromise { method: "get", }); } + +//企微code登录 +export function wxLoginApi(code: string): AxiosPromise { + return request({ + url: "/api/v1/auth/login/wxCode/" + code, + method: "post", + data: { + wxCode: code, + }, + /*headers: { + "Content-Type": "multipart/form-data", + },*/ + }); +} diff --git a/src/api/bi/case/index.ts b/src/api/bi/case/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..694d4c2ba2e55398a54efa07f8a1c72c36d0bddf --- /dev/null +++ b/src/api/bi/case/index.ts @@ -0,0 +1,44 @@ +import { CasePageVO } from "@/api/case/main/types"; +import request from "@/utils/request"; +import { AxiosPromise } from "axios"; +import qs from "qs"; + +import { PivotResult, PivotConfig } from "./types"; + +const root_path = "/api/v1/bi/case/"; + +/** + * 统计图生成 + * + */ +export function listAllCasesForStatistics(): AxiosPromise { + return request({ + url: root_path + "listAllCasesPivotForStatistics", + method: "get", + }); +} + +/** + * 统计图生成 + * + */ +export function listAllCasesPivotForStatistics( + pivotConfig: PivotConfig +): AxiosPromise { + return request({ + url: root_path + "listAllCasesPivotForStatistics", + method: "get", + params: pivotConfig, + paramsSerializer: function (params) { + return qs.stringify(params, { arrayFormat: "repeat" }); + }, + }); +} + +export function getQuickBiShareUrl(pageId: string): AxiosPromise { + return request({ + url: root_path + "getQuickBiShareUrl", + method: "get", + params: { pageId: pageId }, + }); +} diff --git a/src/api/bi/case/types.ts b/src/api/bi/case/types.ts new file mode 100644 index 0000000000000000000000000000000000000000..ff5aa0c1e5bbf6ea19a8306aae8c7386200a4168 --- /dev/null +++ b/src/api/bi/case/types.ts @@ -0,0 +1,12 @@ +export interface PivotResult { + rows?: string[]; + cols?: string[]; + data?: any[]; +} + +export interface PivotConfig { + rowFields?: string[]; + columnFields?: string[]; + aggregateField?: string; + funcName?: string; +} diff --git a/src/api/call-center/cdr/index.ts b/src/api/call-center/cdr/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..d4ce745baafe66d8b82a32e43606a12077e32cdb --- /dev/null +++ b/src/api/call-center/cdr/index.ts @@ -0,0 +1,33 @@ +import request from "@/utils/request"; +import { AxiosPromise } from "axios"; +import { CdrPageQuery, CdrPageVO, CdrPageResult, CdrRecordVO } from "./types"; + +/** + * 查询通话记录 + * + * @param queryParams + */ +export function getCdrPage( + queryParams?: CdrPageQuery +): AxiosPromise { + return request({ + url: "/api/v1/cc/cdr/page", + method: "get", + params: queryParams, + }); +} + +/** + * 查询录音 + * + * @param ids + */ +export function listCdrRecords( + sessioinId: string +): AxiosPromise { + return request({ + url: "/api/v1/cc/cdr/records", + method: "get", + params: { sessionId: sessioinId }, + }); +} diff --git a/src/api/call-center/cdr/types.ts b/src/api/call-center/cdr/types.ts new file mode 100644 index 0000000000000000000000000000000000000000..998f845ae87708d35467142057c642dd9dc38103 --- /dev/null +++ b/src/api/call-center/cdr/types.ts @@ -0,0 +1,59 @@ +/** + * 角色查询参数 + */ +export interface CdrPageQuery extends PageQuery { + keywords?: string; + + userId?: string; + + direction?: string; + + seat?: string; + + endStatusString?: string; + + startTime?: string; + + endTime?: string; +} + +export interface CdrPageVO { + id: number; + sessionId: string; + sdkAppId: number; + caller: string; + callee: string; + direction: string; + duration: number; + seatName?: string; + seatNick?: string; + seatPhone?: string; + telNumber?: string; + telProvince?: string; + telCity?: string; + telOperator?: string; + userId?: number; + userName?: string; + ivrDuration?: number; + ringTimestamp?: Date; // 这里假设 LocalDateTime 被转换为 Date + acceptTimestamp?: Date; + endedTimestamp?: Date; + startTimestamp?: Date; + queuedTimestamp?: Date; + hungupSide: string; + endStatusString: string; + createTime: Date; +} + +export type CdrPageResult = PageResult; + +export interface CdrRecordVO { + id: number; + sdkAppId: number; + sessionId: string; + recordId: string; + timestamp: Date; // 这里假设 LocalDateTime 被转换为 Date + endpointUser: string; + recordUrl: string; + customRecordUrl?: string; +} diff --git a/src/api/call-center/route/index.ts b/src/api/call-center/route/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..40df334dd42841ae40864ff65182dac16f011111 --- /dev/null +++ b/src/api/call-center/route/index.ts @@ -0,0 +1,112 @@ +import request from "@/utils/request"; +import { AxiosPromise } from "axios"; +import { + PhoneRouteQuery, + PhoneRoutePageResult, + PhoneRouteForm, + Project, + AreaCode, +} from "./types"; + +/** + * 接口: + * 1. 获取坐席分配分页列表 + * 2. 增加坐席分配项 + * 3. 删除坐席分配项 + * 4. 编辑坐席分配项 + * 5. 增加/编辑坐席——查询被叫号码列表 + * 6. 增加/编辑坐席——根据省份或者城市名查询区号 + * 7. 增加/编辑坐席——根据姓名模糊搜索助理 + */ + +const root_path = "/api/v1/cc/route/"; + +/** + * 获取坐席分配分页列表 + * + * @param queryParams + */ +export function getPhoneRoutePage( + queryParams?: PhoneRouteQuery +): AxiosPromise { + return request({ + url: root_path + "page", + method: "get", + params: queryParams, + }); +} + +/** + * 获取角色详情 + * + * @param id + */ +export function getPhoneRouteForm(id: number): AxiosPromise { + return request({ + url: root_path + id, + method: "get", + }); +} + +/** + * 增加坐席分配项 + * + * @param data + */ +export function addPhoneRoute(data: PhoneRouteForm) { + return request({ + url: root_path + "add", + method: "post", + data: data, + }); +} + +/** + * 编辑坐席分配项 + * + * @param id + * @param data + */ +export function updatePhoneRoute(id: number, data: PhoneRouteForm) { + return request({ + url: root_path + id, + method: "put", + data: data, + }); +} + +/** + * 删除坐席分配项,多个以英文逗号(,)分割 + * + * @param ids + */ +export function deletePhoneRoute(ids: string) { + return request({ + url: root_path + ids, + method: "delete", + }); +} + +/** + * 获取所有项目 + * + * @param ids + */ +export function listProject(): AxiosPromise { + return request({ + url: root_path + "listProject", + method: "get", + }); +} + +/** + * 获取所有区号 + * + * @param ids + */ +export function listAreaCode(): AxiosPromise { + return request({ + url: root_path + "listAreaCode", + method: "get", + }); +} diff --git a/src/api/call-center/route/types.ts b/src/api/call-center/route/types.ts new file mode 100644 index 0000000000000000000000000000000000000000..64208f0edcbcd5ea7ad5c9715dda55b51f91d093 --- /dev/null +++ b/src/api/call-center/route/types.ts @@ -0,0 +1,126 @@ +/** + * 角色查询参数 + */ +export interface PhoneRouteQuery extends PageQuery { + keywords?: string; + project?: string; + userId?: string; +} + +/** + * 电话路由分页对象 + */ +export interface PhoneRoutePageVO { + /** + * ID + */ + id?: number; + /** + * 被叫号码标签 + */ + calleeNumber?: string; + /** + * 被叫号码技能组ID + */ + calleeSkillId?: number; + /** + * 座机区号 + */ + areaCode?: string; + /** + * 省份 + */ + province?: string; + /** + * 城市 + */ + city?: string; + /** + * 电话号码,去掉0086前缀 + */ + callerNumber?: string; + /** + * 坐席人员ID + */ + userId?: number; + /** + * 坐席人员姓名 + */ + userName?: string; + /** + * 创建时间 + */ + createTime?: string; + + /** + * 是否禁用 + */ + deleted?: number; +} + +/** + * 电话坐席分配分页 + */ +export type PhoneRoutePageResult = PageResult; + +export interface Project { + /** + * ID + */ + id: number; + /** + * 项目名称 + */ + name: string; + /** + * 项目名称 + */ + alias: string; +} + +export interface AreaCode { + /** + * ID + */ + id: number; + /** + * 座机区号 + */ + code: string; + /** + * 座机区号对应省份 + */ + province: string; + /** + * 座机区号对应城市 + */ + city: string; +} + +/** + * 电话坐席表单对象 + */ +export interface PhoneRouteForm { + /** + * ID + */ + id?: number; + /** + * 项目名称 + */ + project?: string; + projectAlias?: string; + /** + * 座机区号 + */ + areaCode?: string[]; + /** + * 电话号码,去掉0086前缀 + */ + callerNumber?: string; + /** + * 坐席人员 + */ + userName?: string; + userId?: number; +} diff --git a/src/api/call-center/seat/index.ts b/src/api/call-center/seat/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..d0a05eefd21c81918f8d3bcb0ca3f7411829757c --- /dev/null +++ b/src/api/call-center/seat/index.ts @@ -0,0 +1,54 @@ +import request from "@/utils/request"; +import { AxiosPromise } from "axios"; +import { Seat, SeatForm, SeatQuery } from "./types"; + +const root_path = "/api/v1/cc/seat/"; +/** + * 获取所有用户 + * + * @param ids + */ +export function listSeat(seatQuery: SeatQuery | null): AxiosPromise { + return request({ + url: root_path + "listSeat", + method: "get", + params: seatQuery, + }); +} + +/** + * 新增坐席 + * + * @param data + */ +export function addSeat(data: SeatForm) { + return request({ + url: root_path + "add", + method: "post", + data: data, + }); +} + +/** + * 删除坐席,多个以英文逗号(,)分割 + * + * @param ids + */ +export function deleteSeats(ids: string) { + return request({ + url: root_path + ids, + method: "delete", + }); +} + +/** + * 回收坐席重新分配 + * @param ids + * @returns + */ +export function reuseSeats(ids: string) { + return request({ + url: root_path + "reuse/" + ids, + method: "put", + }); +} diff --git a/src/api/call-center/seat/types.ts b/src/api/call-center/seat/types.ts new file mode 100644 index 0000000000000000000000000000000000000000..b01433447794b8c80c681b17e4743cbaae0e4625 --- /dev/null +++ b/src/api/call-center/seat/types.ts @@ -0,0 +1,46 @@ +export interface SeatForm { + /** + * 坐席号码/名称 + */ + seatName?: string; +} + +export interface SeatQuery { + keywords?: string; + status?: number; +} + +export interface Seat { + /** + * ID + */ + id: number; + + /** + * 坐席号码/名称 + */ + seatName: string; + + /** + * 用户ID + */ + userId: number; + /** + * 用户名称 + */ + userName: string; + /** + * 话机类型 + */ + telType: string; + /** + * 坐席话机号码 + */ + innerNumber: string; + /** + * 创建时间 + */ + createTime: string; + + deleted: number; +} diff --git a/src/api/case/answer/index.ts b/src/api/case/answer/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..f62ffdd9eadf3e2b1ad395cc7691569336d8b77a --- /dev/null +++ b/src/api/case/answer/index.ts @@ -0,0 +1,76 @@ +import request from "@/utils/request"; +import { AxiosPromise } from "axios"; +import { AnswerForm, AnswerPageQuery, AnswerVO } from "@/api/case/answer/types"; + +const root_path = "/api/v1/answerAndRegisterTickets/"; + +// 获取表格列表 +export function getList( + queryParams: AnswerPageQuery +): AxiosPromise> { + return request({ + url: root_path + "page", + method: "get", + params: queryParams, + }); +} + +// 新增表单 +export function doCreate(data: AnswerForm): AxiosPromise { + return request({ + url: root_path + "add", + method: "post", + data: data, + }); +} + +// 修改表单 +export function doEdit(data: AnswerForm): AxiosPromise { + return request({ + url: root_path + data.id, + method: "put", + data: data, + }); +} + +// 删除表格条目 +export function doDelete(ids: string) { + return request({ + url: root_path + ids, + method: "delete", + }); +} + +// 获取条目详情 +export function getDetail(ticketId: number | undefined) { + return request({ + url: root_path + ticketId + "/form", + method: "get", + }); +} + +// 筛选项 +//自定义标签 +export function getLabelOption() { + return request({ + url: root_path + "listLabel", + method: "get", + }); +} + +//推送对象 +export function getCaseLawyersOption() { + return request({ + url: "/api/v1/case/misc/listAllCaseLawyersAndAssistant", + method: "get", + }); +} + +//接听人 +export function getAnswerUserIdOption(queryParams: AnswerPageQuery) { + return request({ + url: root_path + "listAnswerUserId", + method: "get", + params: queryParams, + }); +} diff --git a/src/api/case/answer/types.ts b/src/api/case/answer/types.ts new file mode 100644 index 0000000000000000000000000000000000000000..e68717ce4fc16164dab9114e88f1a33ca0041e1d --- /dev/null +++ b/src/api/case/answer/types.ts @@ -0,0 +1,62 @@ +export interface AnswerPageQuery extends PageQuery { + keywords?: string; + startTime?: string; + endTime?: string; + callType?: string; + answerUserId?: string; + answerUserIds?: string; + pushUserId?: string; + pushUserIds?: string; + label?: string; + callTimeRange?: string; +} + +export interface AnswerVO { + id?: number; + callTime?: Date; + calleePhone?: string; + callPhone?: number; + callType?: string; + callName?: string; + callDemands?: string; + caseId?: number; + plaintiffName?: string; + borrowerName?: string; + courtName?: string; + lawyerName?: string; + pushUserId?: string; + type?: string; + label?: string; + answerUserName?: string; + createTime?: Date; + duration?: number; + recordUrl?: string; +} + +export interface AnswerForm { + id?: number; + callTime?: Date; + callPhone?: string; + calleePhone?: string; + callType?: string; + callName?: string; + callDemands?: string; + caseId?: number | string; + plaintiffName?: string; + borrowerName?: string; + courtId?: number; + courtName?: string; + lawyerId?: number; + lawyerName?: string; + answerUserId?: number; + answerUserName?: string; + label?: string; + pushUserId?: string; + pushUserIds?: string[]; + spvName?: string; + type?: string; + hasCaseDetail?: boolean; + ifPushCaseManage?: boolean | number; + recordUrl?: ""; + ifPush?: number; +} diff --git a/src/api/case/dispatch/index.ts b/src/api/case/dispatch/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..592433d9217c19b061a8b2ca33cbaefec8f06a0e --- /dev/null +++ b/src/api/case/dispatch/index.ts @@ -0,0 +1,15 @@ +import request from "@/utils/request"; +import { AxiosPromise } from "axios"; +import { CaseDispatchBatchVO } from "./types"; + +const root_path = "/api/v1/case/dispatch/"; + +export function doDispatch( + dispatch?: CaseDispatchBatchVO +): AxiosPromise { + return request({ + url: root_path + "doDispatch", + method: "post", + data: dispatch, + }); +} diff --git a/src/api/case/dispatch/types.ts b/src/api/case/dispatch/types.ts new file mode 100644 index 0000000000000000000000000000000000000000..21ca51812468149127ce4988add93317432cacdc --- /dev/null +++ b/src/api/case/dispatch/types.ts @@ -0,0 +1,44 @@ +export interface CaseStatisticsVO { + id?: number; + type?: string; + name?: string; + count?: number; + rows?: number; +} + +export interface SeatStatisticsVO { + id?: number; + project?: string; + areaCode?: string; + areaCodeFullname?: string; + count?: number; + update?: boolean; +} + +export interface CaseDispatchDetailVO { + id?: number; + batchId?: number; + caseId?: number; + fromLawyerId?: number; + fromLawyerName?: string; + toLawyerId?: number; + toLawyerName?: string; + createUserId?: number; + createUserName?: string; + createTime?: Date; + deleted?: number; +} + +export interface CaseDispatchBatchVO { + id?: number; + toLawyerId?: number; + toLawyerName?: string; + cases?: CaseDispatchDetailVO[]; + seatStatistics?: SeatStatisticsVO[]; + caseStatistics?: CaseStatisticsVO[]; + createUserId?: number; + createUserName?: string; + createTime?: Date; + updateTime?: Date; + deleted?: number; +} diff --git a/src/api/case/llm/index.ts b/src/api/case/llm/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..55d693d310fb92becc731bbb8e2fdebdb23cd35d --- /dev/null +++ b/src/api/case/llm/index.ts @@ -0,0 +1,95 @@ +import request from "@/utils/request"; +import { AxiosPromise } from "axios"; +import { LlmLabelCategoryVO, LlmLabelVO, LlmEffectiveActionVO } from "./types"; +import { OptionVO } from "../misc/types"; + +const root_path = "/api/v1/case/llm/"; +/** + * + * + */ +export function addEffectiveAction( + effectiveAction?: LlmEffectiveActionVO +): AxiosPromise { + return request({ + url: root_path + "action/add", + method: "post", + data: effectiveAction, + }); +} + +export function updateEffectiveAction( + effectiveAction?: LlmEffectiveActionVO +): AxiosPromise { + return request({ + url: root_path + "action/update", + method: "post", + data: effectiveAction, + }); +} + +export function deleteEffectiveAction( + effectiveActionId: number +): AxiosPromise { + return request({ + url: root_path + "action/" + effectiveActionId, + method: "delete", + }); +} + +export function listRemarks(): AxiosPromise { + return request({ + url: root_path + "action/listRemarks", + method: "get", + }); +} + +export function addLabel(label: LlmLabelVO): AxiosPromise { + return request({ + url: root_path + "label/add", + method: "post", + data: label, + }); +} + +export function deleteLabel(labelId: number): AxiosPromise { + return request({ + url: root_path + "label/" + labelId, + method: "delete", + }); +} + +export function updateLabel(label: LlmLabelVO): AxiosPromise { + return request({ + url: root_path + "label/" + label.id, + method: "put", + data: label, + }); +} + +export function listLabelCategory(): AxiosPromise { + return request({ + url: root_path + "label/listLabelCategory", + method: "get", + }); +} + +export function addLabelCategory( + labelCategory: LlmLabelCategoryVO +): AxiosPromise { + return request({ + url: root_path + "label/addLabelCategory", + method: "post", + data: labelCategory, + }); +} + +export function queryLabelTypes( + llmLabelVO?: LlmLabelVO +): AxiosPromise { + return request({ + url: root_path + "label/queryLabelTypes", + method: "get", + params: llmLabelVO, + }); +} diff --git a/src/api/case/llm/types.ts b/src/api/case/llm/types.ts new file mode 100644 index 0000000000000000000000000000000000000000..26115857f6a5864ba19f804edfddd4e2d3481630 --- /dev/null +++ b/src/api/case/llm/types.ts @@ -0,0 +1,35 @@ +export interface LlmLabelCategoryVO { + id?: number; + name: string; + createTime?: Date; + multipleKey?: number; + hasValue?: number; + hasRemark?: number; + createdByUserId?: number; + createdByUserName?: string; +} + +export interface LlmLabelVO { + id?: number; + category?: string; + labelKey?: string; + labelValue?: string; + remark?: string; + labelUserId?: number; + labelUserName?: string; + caseId?: number; + followupRecordId?: number; + multipleKey?: number; + hasValue?: number; + hasRemark?: number; +} + +export interface LlmEffectiveActionVO { + id?: number; + caseId?: number; + followRecordId?: number; + eventType?: number; + content?: string; + remark?: string; + actionTime?: Date; +} diff --git a/src/api/case/main/index.ts b/src/api/case/main/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..5bb547bf81969fa7a7664038d509e98cc792153d --- /dev/null +++ b/src/api/case/main/index.ts @@ -0,0 +1,117 @@ +import request from "@/utils/request"; +import { AxiosPromise } from "axios"; +import { + CasePageResult, + CasePageQuery, + CaseQuery, + CaseBatchVO, + MaterialVO, + CaseMaterialVO, + CasePageVO, + RpaCaseVO, + AsyncLoadedData, +} from "./types"; +import qs from "qs"; + +const root_path = "/api/v1/case/main/"; + +/** + * 获取所有案件 + * + * @param pageQuery + */ +export function listCases( + pageQuery?: CasePageQuery +): AxiosPromise { + return request({ + url: root_path + "listCases", + method: "get", + params: pageQuery, + paramsSerializer: function (params) { + return qs.stringify(params, { arrayFormat: "repeat" }); + }, + }); +} + +export function queryCaseByDefendant( + caseQuery?: CaseQuery +): AxiosPromise { + return request({ + url: root_path + "queryCaseByDefendant", + method: "get", + params: caseQuery, + paramsSerializer: function (params) { + return qs.stringify(params, { arrayFormat: "repeat" }); + }, + }); +} + +export function udpateCaseStatus( + caseBatchVO?: CaseBatchVO +): AxiosPromise { + return request({ + url: root_path + "updateCaseStatus", + method: "post", + data: caseBatchVO, + }); +} + +/** + * 获取所有案件材料 + * + * @param pageQuery + */ +export function listCaseMaterials( + casePageVO?: CasePageVO +): AxiosPromise { + return request({ + url: root_path + "listCaseMaterials", + method: "get", + params: casePageVO, + }); +} + +/** + * 获取所有上传的附件材料 + * + */ +export function listCaseAttachments( + casePageVO?: CasePageVO +): AxiosPromise { + return request({ + url: root_path + "listCaseAttachments", + method: "get", + params: casePageVO, + }); +} + +export function submitCase(rpaCaseVO?: RpaCaseVO): AxiosPromise { + return request({ + url: root_path + "submitCase", + method: "post", + data: rpaCaseVO, + }); +} + +export function getCaseInfo(id: string) { + return request({ + url: root_path + id, + method: "get", + }); +} + +export function getAsyncData(id: number): AxiosPromise { + return request({ + url: root_path + "listAsyncLoadedData/" + id, + method: "get", + }); +} + +// 批量退案接口 +export function batchDelete(params: any): AxiosPromise { + return request({ + url: root_path + "addBatchOpsBackCase", + method: "post", + data: params, + }); +} diff --git a/src/api/case/main/types.ts b/src/api/case/main/types.ts new file mode 100644 index 0000000000000000000000000000000000000000..e08ca9c92a758916c186d170ee05b9ebc5b94770 --- /dev/null +++ b/src/api/case/main/types.ts @@ -0,0 +1,129 @@ +import { FeePaymentVO } from "../../fee/types"; +import { OpsSendbackCaseVO } from "../sendback-mail/types"; + +export interface CasePageQuery extends PageQuery { + keywords?: string; + keywordsFollowup?: string; + eventRecordMethod?: number; + eventTypes?: number[]; + spvIds?: string[]; + lawyerIds?: number[]; + lawyerAccountIds?: number[]; + fromLawyerIds?: number[]; + batchIds?: number[]; + clientIds?: number[]; + stateIds?: string[]; + sueTplIds?: number[]; + submitStates?: string[]; + platformStates?: string[]; + courtIds?: number[]; + followStartTime?: string; + followEndTime?: string; + rpaPlatformUpdateStartTime?: string; + rpaPlatformUpdateEndTime?: string; + labelKeys?: string[]; + labelValues?: string[]; + provinces?: string[]; + areaCodes?: string[]; + + repayIntentIndex?: string; + + sortProp?: string; + sortOrder?: string; +} + +export interface CaseQuery { + defendants?: string[]; + courts?: string[]; +} + +export type CasePageResult = PageResult; + +export interface CasePageVO { + id?: number; + lawyerId?: number; + lawyer?: string; + client?: string; + spvName?: string; + sueTpl?: string; + courtShortName?: string; + ccProjectAlias?: string; + areaCode?: string; + areaCodeFullname?: string; + assetCount?: number; + borrowerName?: string; + idCardNumber?: string; + sex?: string; + birthDate?: Date | undefined; + ethnicity?: string; + province?: string; + city?: string; + county?: string; + state?: string; + submitLawyerName?: string; + submitSpvTel?: string; + submitLawyerTel?: string; + submitState?: string; + rpaCaseId?: number; + platformState?: string; + caseNumbersInfo?: string; + lastFollowTime?: Date | undefined; + lastManuallyFollowTime?: Date | undefined; + followRecords?: any; + + effectiveActions?: any; + caseMaterials?: CaseMaterialVO[]; + caseAttachments?: CaseMaterialVO[]; + fees?: FeePaymentVO[]; + opsSendbackCases?: OpsSendbackCaseVO[]; + + labels?: any; + todoNotes?: string; + mailRequirements?: string; + mailInfo?: string; + remarks?: string; + printSubmissionCount?: number; + lastPrintSubmissionTime?: Date | undefined; + sueDate?: Date | undefined; + overdueBaseAmount?: number; + overdueInterestStartDate?: Date | undefined; + overdueDays?: number; + overdueInterestRate?: number; + overdueInterestAmount?: number; + lawyerFeeAmount?: number; + travelFeeAmount?: number; + sueDebtTotalAmount?: number; + sueClaimTotalAmount?: number; +} + +export interface CaseBatchVO { + cases?: CasePageVO[]; + statusId?: string; +} + +export interface MaterialVO { + id: number; + fullpath: string; + filename: string; + createTime?: string; +} + +export interface CaseMaterialVO { + complaintDocs: MaterialVO[]; + identityDocs: MaterialVO[]; + evidenceDocs: MaterialVO[]; + otherDocs: MaterialVO[]; +} + +export interface RpaCaseVO { + caseIds?: (number | undefined)[]; + directly?: boolean; +} + +export interface AsyncLoadedData { + followRecords?: any; + caseMaterials: CaseMaterialVO[]; + caseAttachments: CaseMaterialVO[]; + fees: FeePaymentVO[]; + opsSendbackCases: OpsSendbackCaseVO[]; +} diff --git a/src/api/case/message/index.ts b/src/api/case/message/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..7d79a41fbf74c4dc24f8de245acedbbd6e8c00b1 --- /dev/null +++ b/src/api/case/message/index.ts @@ -0,0 +1,110 @@ +import request from "@/utils/request"; +import { AxiosPromise } from "axios"; +import { IMessageSearch, IMessageInfo, IAttachment } from "./types"; +import { OptionVO } from "@/api/case/misc/types"; + +const root_path = "/api/v1/case/sms/entrance/"; +export const uploadPath = "/prod-api/api/v1/files"; + +export function getList( + queryParams: IMessageSearch +): AxiosPromise> { + return request({ + url: root_path + "list", + method: "get", + params: queryParams, + }); +} + +export function phoneNameDistribution( + queryParams: IMessageSearch +): AxiosPromise { + return request({ + url: root_path + "phoneNameDistribution", + method: "get", + params: queryParams, + }); +} + +export function createUserNameDistribution( + queryParams: any +): AxiosPromise { + return request({ + url: root_path + "createUserNameDistribution", + method: "get", + params: queryParams, + }); +} + +export function lastEditUserNameDistribution( + queryParams: IMessageSearch +): AxiosPromise { + return request({ + url: root_path + "lastEditUserNameDistribution", + method: "get", + params: queryParams, + }); +} + +export function getRecord(id: number): AxiosPromise { + return request({ + url: root_path + id, + method: "get", + }); +} + +export function addRecord(data: IMessageInfo) { + return request({ + url: root_path + "add", + method: "post", + data: data, + }); +} + +export function updateRecord(data: IMessageInfo) { + return request({ + url: root_path + "update", + method: "put", + data: data, + }); +} + +export function deleteRecord(id: number) { + return request({ + url: root_path + id, + method: "delete", + }); +} + +export function addAttachment(attachment: IAttachment) { + return request({ + url: root_path + "attachment/add", + method: "post", + data: attachment, + }); +} + +export function deleteAttachment(id: number) { + return request({ + url: root_path + "attachment/" + id, + method: "delete", + }); +} + +export function batchIgoreRecords(ids: number[]) { + return request({ + url: root_path + "ignore", + method: "post", + data: { + ids, + }, + }); +} + +export function batchConfirmRecords(records: IMessageInfo[]) { + return request({ + url: root_path + "confirm", + method: "post", + data: records, + }); +} diff --git a/src/api/case/message/types.ts b/src/api/case/message/types.ts new file mode 100644 index 0000000000000000000000000000000000000000..d1e28cec31c3fc2cd1c0c5d21e0b6117ca7b73c6 --- /dev/null +++ b/src/api/case/message/types.ts @@ -0,0 +1,90 @@ +import { UploadUserFile } from "element-plus"; + +export interface IMessageSearch extends PageQuery { + keywords?: string; + idStart?: number; + idEnd?: number; + hasUrl?: string; + hasCaseNumber?: string; + hasCaseId?: string; + opsFeeType?: string; + isFeePayed?: string; + updateUserName?: string; + infoSource?: string; + feeLabel?: string; + phoneName?: string; + state?: string; + processType?: string; + createUserName?: string; + lastEditUserName?: string; + startTime?: string; + endTime?: string; + updateStartTime?: string; + updateEndTime?: string; +} + +export interface IMessageInfo extends IMessageForm, IAutoNoticeInfo { + id?: number; + smsId?: number; + phoneName?: string; + phoneNumber?: string; + receiveTime?: string; + sendPhoneNumber?: string; + content?: string; + state?: string; + createTime?: string; + createUserName?: string; + lastEditUserName?: string; + attachments?: any; + tagWithTooltips?: TagWithTooltip[]; +} + +// 录入表单信息 +export interface IMessageForm { + caseId?: number; + opsCourtName?: string; + opsPlaintiff?: string; + opsDefendant?: string; + opsCaseNumber?: string; + opsExecutor?: string; + opsIdentity?: string; + opsPhone?: string; + opsFeeType?: string; + opsFeeAmount?: number; + opsCourtTime?: string; + opsRemark?: string; + caseLawyer?: string; + attachments?: IAttachment[]; + isFeePayed?: string; + hasCaseDetail?: boolean; +} + +// 附件信息 +export interface IAttachment extends UploadUserFile { + id?: number; + type?: string; + ossKey?: string; +} + +// 自动提取的关键信息 +export interface IAutoNoticeInfo { + courtName?: string; + person?: string; + caseNumber?: string; + phone?: string; + link?: string; + entities?: string[]; + + predictedCaseId?: number; + predictedCaseLawyerName?: string; + predictedCasePlaintiffName?: string; + predictedCaseDefendantName?: string; + predictedCaseCourtName?: string; + predictedCaseCourtProvince?: string; + predictedCaseCourtCity?: string; +} + +export interface TagWithTooltip { + tooltip?: string; + content: string; +} diff --git a/src/api/case/misc/index.ts b/src/api/case/misc/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..6c2eecd58accf414a7e5406707579911b17f7298 --- /dev/null +++ b/src/api/case/misc/index.ts @@ -0,0 +1,243 @@ +import request from "@/utils/request"; +import { AxiosPromise } from "axios"; +import { + ClientVO, + SueTplVO, + CaseStateVO, + CourtVO, + LawyerVO, + OptionVO, +} from "./types"; +import { CasePageQuery } from "../main/types"; +import qs from "qs"; + +const root_path = "/api/v1/case/misc/"; +/** + * 获取案源方 + * + */ +export async function listClients( + pageQuery?: CasePageQuery +): AxiosPromise { + return request({ + url: root_path + "listClients", + method: "get", + params: pageQuery, + paramsSerializer: function (params) { + return qs.stringify(params, { arrayFormat: "repeat" }); + }, + }); +} + +/** + * 获取案源方 + * + */ +export async function listBatches( + pageQuery?: CasePageQuery +): AxiosPromise { + return request({ + url: root_path + "listBatches", + method: "get", + params: pageQuery, + paramsSerializer: function (params) { + return qs.stringify(params, { arrayFormat: "repeat" }); + }, + }); +} + +export async function listCaseLawyers( + pageQuery?: CasePageQuery +): AxiosPromise { + return request({ + url: root_path + "listCaseLawyers", + method: "get", + params: pageQuery, + paramsSerializer: function (params) { + return qs.stringify(params, { arrayFormat: "repeat" }); + }, + }); +} + +export async function listLawyerAccounts( + pageQuery?: CasePageQuery +): AxiosPromise { + return request({ + url: root_path + "listLawyerAccounts", + method: "get", + params: pageQuery, + paramsSerializer: function (params) { + return qs.stringify(params, { arrayFormat: "repeat" }); + }, + }); +} + +export async function listAllCaseLawyers(): AxiosPromise { + return request({ + url: root_path + "listAllCaseLawyers", + method: "get", + }); +} + +export async function listCaseCourts( + pageQuery?: CasePageQuery +): AxiosPromise { + return request({ + url: root_path + "listCaseCourts", + method: "get", + params: pageQuery, + paramsSerializer: function (params) { + return qs.stringify(params, { arrayFormat: "repeat" }); + }, + }); +} + +/** + * 获取所有案件状态 + * + */ +export async function listCaseStates( + pageQuery?: CasePageQuery +): AxiosPromise { + return request({ + url: root_path + "listCaseStates", + method: "get", + params: pageQuery, + paramsSerializer: function (params) { + return qs.stringify(params, { arrayFormat: "repeat" }); + }, + }); +} + +/** + * 获取所有模板 + * + */ +export async function listSueTpls( + pageQuery?: CasePageQuery +): AxiosPromise { + return request({ + url: root_path + "listSueTpls", + method: "get", + params: pageQuery, + paramsSerializer: function (params) { + return qs.stringify(params, { arrayFormat: "repeat" }); + }, + }); +} + +/** + * 获取所有模板 + * + */ +export async function listLabelKeys( + pageQuery?: CasePageQuery +): AxiosPromise { + return request({ + url: root_path + "listLabelKeys", + method: "get", + params: pageQuery, + paramsSerializer: function (params) { + return qs.stringify(params, { arrayFormat: "repeat" }); + }, + }); +} + +export async function listLabelValues( + pageQuery?: CasePageQuery +): AxiosPromise { + return request({ + url: root_path + "listLabelValues", + method: "get", + params: pageQuery, + paramsSerializer: function (params) { + return qs.stringify(params, { arrayFormat: "repeat" }); + }, + }); +} + +export async function listProvinces( + pageQuery?: CasePageQuery +): AxiosPromise { + return request({ + url: root_path + "listProvinces", + method: "get", + params: pageQuery, + paramsSerializer: function (params) { + return qs.stringify(params, { arrayFormat: "repeat" }); + }, + }); +} + +export async function listAreaCodes( + pageQuery?: CasePageQuery +): AxiosPromise { + return request({ + url: root_path + "listAreaCodes", + method: "get", + params: pageQuery, + paramsSerializer: function (params) { + return qs.stringify(params, { arrayFormat: "repeat" }); + }, + }); +} + +export async function listSubmitStates( + pageQuery?: CasePageQuery +): AxiosPromise { + return request({ + url: root_path + "listSubmitStates", + method: "get", + params: pageQuery, + paramsSerializer: function (params) { + return qs.stringify(params, { arrayFormat: "repeat" }); + }, + }); +} + +export async function listPlatformStates( + pageQuery?: CasePageQuery +): AxiosPromise { + return request({ + url: root_path + "listPlatformStates", + method: "get", + params: pageQuery, + paramsSerializer: function (params) { + return qs.stringify(params, { arrayFormat: "repeat" }); + }, + }); +} + +export async function listFromLawyers( + pageQuery?: CasePageQuery +): AxiosPromise { + return request({ + url: root_path + "listFromLawyers", + method: "get", + params: pageQuery, + paramsSerializer: function (params) { + return qs.stringify(params, { arrayFormat: "repeat" }); + }, + }); +} + +export async function listOriginalStates(): AxiosPromise { + return request({ + url: root_path + "listOriginalStates", + method: "get", + }); +} + +// 原告列表 +export async function listSpvs( + pageQuery?: CasePageQuery +): AxiosPromise { + return request({ + url: root_path + "listSpvs", + method: "get", + params: pageQuery, + paramsSerializer: function (params) { + return qs.stringify(params, { arrayFormat: "repeat" }); + }, + }); +} diff --git a/src/api/case/misc/types.ts b/src/api/case/misc/types.ts new file mode 100644 index 0000000000000000000000000000000000000000..e44966da7e387c4d9598fcb3fcf09ecf50143c35 --- /dev/null +++ b/src/api/case/misc/types.ts @@ -0,0 +1,48 @@ +export interface ClientVO { + id: number; + name?: string; + count?: number; +} + +export interface LawyerVO { + id: number; + name?: string; + count?: number; +} + +export interface CourtVO { + id: number; + name?: string; + count?: number; +} + +export interface CaseStateVO { + id: number; + name?: string; + count?: number; +} + +export interface SueTplVO { + id: number; + name?: string; + count?: number; +} + +export interface OptionVO { + id?: any; + name?: string; + alias?: string; + count?: number; +} + +export interface FollowRecordVO { + id: number; + caseId?: number; + followTime?: Date; + eventType?: number; + content?: string; + readTime?: Date; + createUserId?: number; + createUserName?: string; + createTime?: Date; +} diff --git a/src/api/case/pre-check/index.ts b/src/api/case/pre-check/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..a26367a46b9f3ad928d328a29a1f53f519cb6341 --- /dev/null +++ b/src/api/case/pre-check/index.ts @@ -0,0 +1,39 @@ +import request from "@/utils/request"; +import { AxiosPromise } from "axios"; +import { + PreCheckForm, + PreCheckPageQuery, + PreCheckVO, +} from "@/api/case/pre-check/types"; + +const root_path = "/api/v1/preCommissionScreening/"; + +// 获取表格列表 +export function getList( + queryParams: PreCheckPageQuery +): AxiosPromise> { + return request({ + url: root_path + "page", + method: "get", + params: queryParams, + }); +} + +//上传文件 +export function upload(data: any) { + return request({ + url: root_path + "upload", + method: "post", + data: data, + }); +} + +// 筛选项 +//上传人 +export function uploader(queryParams: PreCheckPageQuery) { + return request({ + url: root_path + "list/handlers", + method: "get", + params: queryParams, + }); +} diff --git a/src/api/case/pre-check/types.ts b/src/api/case/pre-check/types.ts new file mode 100644 index 0000000000000000000000000000000000000000..70df77367c3060a9b42765571e26a76b253845f7 --- /dev/null +++ b/src/api/case/pre-check/types.ts @@ -0,0 +1,25 @@ +export interface PreCheckPageQuery extends PageQuery { + fileName?: string; + startTime?: string; + endTime?: string; + uploader?: string; +} + +export interface PreCheckVO { + id?: number; + uploader?: string; + uploadTime?: string; + fileName?: string; + fileLine?: number; + completeLine?: number; + serialVersionUID?: number; +} + +export interface PreCheckForm { + id?: number; + flag?: number; + nameHead?: string; + idCardHead?: string; + areaHead?: string; + phoneHead?: string; +} diff --git a/src/api/case/push/index.ts b/src/api/case/push/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..12b2b535da33c9981387ad870004a326c71cfeb4 --- /dev/null +++ b/src/api/case/push/index.ts @@ -0,0 +1,45 @@ +import request from "@/utils/request"; +import { AxiosPromise } from "axios"; +import { IPushSearch, IOpsCasePushLog } from "./types"; + +const root_path = "/api/v1/case/push/"; + +export function getList( + queryParams: IPushSearch +): AxiosPromise> { + return request({ + url: root_path + "list", + method: "get", + params: queryParams, + }); +} + +export function getRecord(id: number): AxiosPromise { + return request({ + url: root_path + id, + method: "get", + }); +} + +export function addRecord(data: IOpsCasePushLog) { + return request({ + url: root_path + "add", + method: "post", + data: data, + }); +} + +export function updateRecord(data: IOpsCasePushLog) { + return request({ + url: root_path + "update", + method: "put", + data: data, + }); +} + +export function deleteRecords(ids: string) { + return request({ + url: root_path + ids, + method: "delete", + }); +} diff --git a/src/api/case/push/types.ts b/src/api/case/push/types.ts new file mode 100644 index 0000000000000000000000000000000000000000..c91837a3cd651b200bc1cd4d7ef5972bb797e1c9 --- /dev/null +++ b/src/api/case/push/types.ts @@ -0,0 +1,14 @@ +export interface IPushSearch extends PageQuery { + keywords?: string; + startTime?: string; + endTime?: string; +} + +export interface IOpsCasePushLog { + id?: number; + userId: number; + userName: string; + pushTime: Date; + content: string; + createTime?: Date; +} diff --git a/src/api/case/scan-doc/index.ts b/src/api/case/scan-doc/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..24ce0229ebebb80e8f208959af605bcecccd98ab --- /dev/null +++ b/src/api/case/scan-doc/index.ts @@ -0,0 +1,77 @@ +import request from "@/utils/request"; +import { AxiosPromise } from "axios"; +import { IFileSearch, IFileInfo, IAttachment } from "./types"; +import { OptionVO } from "@/api/case/misc/types"; +import qs from "qs"; + +const root_path = "/api/v1/case/scanned_doc/entrance/"; + +export function getList( + queryParams: IFileSearch +): AxiosPromise> { + return request({ + url: root_path + "list", + method: "get", + params: queryParams, + paramsSerializer: function (params) { + return qs.stringify(params, { arrayFormat: "repeat" }); + }, + }); +} + +export function getDatails(id: number) { + return request({ + url: root_path + id, + method: "get", + }); +} + +export function createUserNameDistribution( + queryParams: IFileSearch +): AxiosPromise { + return request({ + url: root_path + "createUserNameDistribution", + method: "get", + params: queryParams, + paramsSerializer: function (params) { + return qs.stringify(params, { arrayFormat: "repeat" }); + }, + }); +} + +export function lastEditUserNameDistribution( + queryParams: IFileSearch +): AxiosPromise { + return request({ + url: root_path + "lastEditUserNameDistribution", + method: "get", + params: queryParams, + paramsSerializer: function (params) { + return qs.stringify(params, { arrayFormat: "repeat" }); + }, + }); +} + +export function updateRecord(data: IFileInfo) { + return request({ + url: root_path + "update", + method: "put", + data: data, + }); +} + +export function resetRecord(data: IFileInfo) { + return request({ + url: root_path + "reset", + method: "delete", + data: data, + }); +} + +export function batchConfirmRecords(data: any) { + return request({ + url: root_path + "ignoreOrConfirm", + method: "post", + data: data, + }); +} diff --git a/src/api/case/scan-doc/types.ts b/src/api/case/scan-doc/types.ts new file mode 100644 index 0000000000000000000000000000000000000000..637b5ed5b2940c546fa4e7e94fa9a0580e695927 --- /dev/null +++ b/src/api/case/scan-doc/types.ts @@ -0,0 +1,89 @@ +import { UploadUserFile } from "element-plus"; + +export interface IFileSearch extends PageQuery { + pageNum: number; + pageSize: number; + keywords?: string | undefined; + idStart?: number | undefined; + idEnd?: number | undefined; + + hasCaseNumber?: string; + hasCaseId?: string; + feeType?: string; + isFeePayed?: any; + docTypes?: any; + state?: string; + createUserName?: string | undefined; + lastEditUserName?: string | undefined; + dateTimeRange?: string | undefined; + startTime?: string | undefined; + endTime?: string | undefined; + updateTimeRange?: string | undefined; + updateStartTime?: string | undefined; + updateEndTime?: string | undefined; +} + +export interface IFileInfo extends IFileForm, IAutoNoticeInfo { + id?: number; + idStart?: number; + idEnd?: number; + filename?: string; + pages?: string; + ossKey?: string; + url?: string; + state?: string; + opsFeeType?: string; + scanTime?: string; + createTime?: string; + updateTime?: string; + createUserId?: number; + createUserName?: string; + lastEditUserId?: number; + lastEditUserName?: string; +} + +// 录入表单信息 +export interface IFileForm { + caseId?: number; + caseLawyer?: string; + court?: string; + plaintiff?: string; + defendant?: string; + caseNumber?: string; + executor?: string; + executorIdentity?: string; + executorPhone?: string; + feeType?: string; + isFeePayed?: any; + feeAmount?: number; + courtTime?: string; + remark?: string; + docTypes?: string[]; + hasCaseDetail?: boolean; +} + +// 附件信息 +export interface IAttachment extends UploadUserFile { + id?: number; + type?: string; + ossKey?: string; +} + +// 自动提取的关键信息 +export interface IAutoNoticeInfo { + entities?: string[]; + ocrText?: string; + ocrCaseNumber?: string; + ocrPerson?: string; + ocrCourt?: string; + ocrPlaintiff?: string; + ocrPredictedCaseId?: number; + ocrPredictedDefendantName?: string; + ocrPredictedLawyerName?: string; + ocrPredictedCourt?: string; +} + +export interface TagWithTooltip { + tooltip?: string; + content: string; +} diff --git a/src/api/case/sendback-mail/index.ts b/src/api/case/sendback-mail/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..0bb78a28659f420f1e7b15caad288c6f883419d0 --- /dev/null +++ b/src/api/case/sendback-mail/index.ts @@ -0,0 +1,28 @@ +import request from "@/utils/request"; +import { AxiosPromise } from "axios"; +import { OptionVO } from "@/api/case/misc/types"; +import { OpsSendbackCaseVO } from "./types"; + +const root_path = "/api/v1/case/main/"; + +export function addSendbackCase(data: OpsSendbackCaseVO) { + return request({ + url: root_path + "addOpsBackCase", + method: "post", + data: data, + }); +} + +export function deleteSendbackCase(id: number) { + return request({ + url: root_path + "deleteOpsBackCase/" + id, + method: "delete", + }); +} + +export function listSendbackCaseTypes(): AxiosPromise { + return request({ + url: root_path + "listOpsBackCaseTypes", + method: "get", + }); +} diff --git a/src/api/case/sendback-mail/types.ts b/src/api/case/sendback-mail/types.ts new file mode 100644 index 0000000000000000000000000000000000000000..a0b84ce4877b9e510bd29c0458a6916d3c004fe0 --- /dev/null +++ b/src/api/case/sendback-mail/types.ts @@ -0,0 +1,9 @@ +export interface OpsSendbackCaseVO { + id?: number | undefined; + caseId?: any; + sendbackDate?: string | undefined; + type: string | undefined; + remark?: string; + createTime?: Date; + updateTime?: Date; +} diff --git a/src/api/fee/index.ts b/src/api/fee/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..cea1c22472c991aec71787bcad8f49ef1936c2a3 --- /dev/null +++ b/src/api/fee/index.ts @@ -0,0 +1,77 @@ +import request from "@/utils/request"; +import { AxiosPromise } from "axios"; +import { FeePaymentPageQuery, FeePaymentVO, FeePaymentForm } from "./types"; + +const root_path = "/api/v1/fee/"; + +export function listFeePayments( + queryParams: FeePaymentPageQuery +): AxiosPromise> { + return request({ + url: root_path + "listFeePayments", + method: "get", + params: queryParams, + }); +} + +export function listCaseFeePayments( + caseId: number | string +): AxiosPromise { + return request({ + url: root_path + "listCaseFeePayments/" + caseId, + method: "get", + }); +} + +export function getFeePayment(id: number): AxiosPromise { + return request({ + url: root_path + id, + method: "get", + }); +} + +export function addFeePayment(data: FeePaymentForm) { + return request({ + url: root_path + "add", + method: "post", + data: data, + }); +} + +export function updateFeePayment(data: FeePaymentForm) { + return request({ + url: root_path + "update", + method: "put", + data: data, + }); +} + +export function deleteFeePayments(ids: string) { + return request({ + url: root_path + ids, + method: "delete", + }); +} + +export function listFeeLabel() { + return request({ + url: root_path + "listFeeLabel", + method: "get", + }); +} + +export function getCreateUserNameOption(queryParams: FeePaymentPageQuery) { + return request({ + url: root_path + "createUserNameDistribution", + method: "get", + params: queryParams, + }); +} + +export function getLastEditUserNameOption(queryParams: FeePaymentPageQuery) { + return request({ + url: root_path + "lastEditUserNameDistribution", + method: "get", + params: queryParams, + }); +} diff --git a/src/api/fee/types.ts b/src/api/fee/types.ts new file mode 100644 index 0000000000000000000000000000000000000000..ceb710c1aa4989346dd4c589ac06810ec2a877e1 --- /dev/null +++ b/src/api/fee/types.ts @@ -0,0 +1,67 @@ +export interface FeePaymentPageQuery extends PageQuery { + keywords?: string; + infoId?: number; + feeStatus?: string; + createUserName?: string; + updateUserName?: string; + infoSource?: string; + feeLabel?: string; + feePaymentDateStart?: string; + feePaymentDateEnd?: string; + cutOffDateTimeStart?: string; + cutOffDateTimeEnd?: string; +} + +export interface FeePaymentVO { + id?: number; + caseId?: number; + feePaymentDate: string; + feeAmount: number; + feeType?: string; + defendantName?: string; + remarks?: string; + createTime: Date; + updateTime: Date; + lawyerName?: string; + batchId?: number; + batchName?: string; + createUserId?: number; + createUserName?: number; + attachments?: attachments | []; +} + +export interface FeePaymentForm { + id?: number; + caseId?: number; + feeStatus?: any; + feeLabel?: string; + infoId?: number; + infoSource?: string; + feePaymentDate?: string; + feeType?: string; + feeAmount?: number; + remarks?: string; + cutOffDateTime?: string; + lawyerName?: string; + batchName?: string; + defendantName?: string; + hasCaseDetail?: boolean; + attachments?: attachments | any; + otherAttachments?: any; + feeAttachments?: any; + value?: any; + isEdit?: boolean | undefined; + lishi?: any; + content?: string; + links?: any; +} + +export interface attachments { + id?: number; + caseId?: number; + feeId?: number; + name?: string; + type?: string; + ossKey?: string; + url?: string; +} diff --git a/src/api/fulfill/real/index.ts b/src/api/fulfill/real/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..6d109b78d4c789cffaf5db0961103a5575419106 --- /dev/null +++ b/src/api/fulfill/real/index.ts @@ -0,0 +1,51 @@ +import request from "@/utils/request"; +import { AxiosPromise } from "axios"; +import { + FulfillmentRepaymentPageQuery, + OpsFulfillmentRepaymentVO, + OpsFulfillmentRepaymentForm, +} from "./types"; + +const root_path = "/api/v1/repayment/real/"; + +export function listRepayments( + queryParams: FulfillmentRepaymentPageQuery +): AxiosPromise> { + return request({ + url: root_path + "listRepayments", + method: "get", + params: queryParams, + }); +} + +export function getRepayment( + id: number +): AxiosPromise { + return request({ + url: root_path + id, + method: "get", + }); +} + +export function addRepayment(data: OpsFulfillmentRepaymentForm) { + return request({ + url: root_path + "add", + method: "post", + data: data, + }); +} + +export function updateRepayment(data: OpsFulfillmentRepaymentForm) { + return request({ + url: root_path + "update", + method: "put", + data: data, + }); +} + +export function deleteRepayments(ids: string) { + return request({ + url: root_path + ids, + method: "delete", + }); +} diff --git a/src/api/fulfill/real/types.ts b/src/api/fulfill/real/types.ts new file mode 100644 index 0000000000000000000000000000000000000000..f13e0d22df8f0a320e2c0561ea45249d4044f67e --- /dev/null +++ b/src/api/fulfill/real/types.ts @@ -0,0 +1,38 @@ +export interface FulfillmentRepaymentPageQuery extends PageQuery { + keywords?: string; + repayDateStart?: string; + repayDateEnd?: string; + state?: string; + groupSyncState?: string; +} + +export interface OpsFulfillmentRepaymentVO { + id?: number; + caseId?: number; + repayDate: Date; + repayAmount: number; + defendantName?: string; + remarks?: string; + matchResult?: string; + createTime: Date; + updateTime: Date; + lawyer?: string; + batchId?: number; + batchName?: string; + clientName?: string; + state?: string; + groupSyncState?: string; +} + +export interface OpsFulfillmentRepaymentForm { + id?: number; + caseId?: number; + repayDate?: string; + repayAmount?: number; + sourceRepay?: boolean; + remarks?: string; + lawyer?: string; + batchName?: string; + defendantName?: string; + hasCaseDetail?: boolean; +} diff --git a/src/api/menu/types.ts b/src/api/menu/types.ts index 38101e8a1bfdc321c2bea8f45c8f968048ee8e3e..b09e6063612e4fa96e746767ad36a99249127c39 100644 --- a/src/api/menu/types.ts +++ b/src/api/menu/types.ts @@ -98,6 +98,10 @@ export interface MenuForm { * 路由路径 */ path?: string; + /** + * 内嵌外部链接 + */ + externalUrl?: string; /** * 跳转路由路径 */ diff --git a/src/api/operate/employee/index.ts b/src/api/operate/employee/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..024a167571da16ca5ee9507e9f5b2a066c92d6c8 --- /dev/null +++ b/src/api/operate/employee/index.ts @@ -0,0 +1,104 @@ +import request from "@/utils/request"; +import { AxiosPromise } from "axios"; +import { + EmployeeForm, + EmployeePageQuery, + EmployeeVO, +} from "@/api/operate/employee/types"; +import qs from "qs"; + +const root_path = "/api/v1/ops/employee/"; + +// 获取表格列表 +export function getList( + queryParams: EmployeePageQuery +): AxiosPromise> { + return request({ + url: root_path + "page", + method: "get", + params: queryParams, + paramsSerializer: function (params) { + return qs.stringify(params, { arrayFormat: "repeat" }); + }, + }); +} + +// 新增表单 +export function doCreate(data: EmployeeForm): AxiosPromise { + return request({ + url: root_path + "add", + method: "post", + data: data, + }); +} + +// 修改表单 +export function doEdit(data: EmployeeForm): AxiosPromise { + return request({ + url: root_path + "update", + method: "put", + data: data, + }); +} + +// 获取条目详情 +export function getDetail(id: number | undefined) { + return request({ + url: root_path + id, + method: "get", + }); +} + +// 导出 +export function exportDataApi(queryParams: EmployeePageQuery) { + return request({ + url: root_path + "_export", + method: "get", + params: queryParams, + responseType: "arraybuffer", + }); +} + +// 筛选项 +//员工标签 +export function getLabelOption() { + return request({ + url: root_path + "get/label/list", + method: "get", + }); +} + +//职位 +export function getPositionOption() { + return request({ + url: root_path + "get/position/list", + method: "get", + }); +} + +// 上传文件 +export function uploadFileApi(data: any) { + return request({ + url: "/api/v1/files/other", + method: "post", + data: data, + }); +} + +// 保存文件 +export function saveFile(data: any) { + return request({ + url: root_path + "addOrUpdate/attachment", + method: "post", + data: data, + }); +} + +// 案管打标 +export function createCaseManageLabel(data: any) { + return request({ + url: root_path + "addOrUpdate/caseMangeLabel", + method: "post", + data: data, + }); +} diff --git a/src/api/operate/employee/types.ts b/src/api/operate/employee/types.ts new file mode 100644 index 0000000000000000000000000000000000000000..d8cee39eb4d93cfdf390d2b0ff60b6ff7a217d91 --- /dev/null +++ b/src/api/operate/employee/types.ts @@ -0,0 +1,109 @@ +export interface EmployeePageQuery extends PageQuery { + userName?: string; + formalTimeFakeValue?: 0 | 1 | undefined; + contractDateFlag?: 0 | 1 | undefined; + positionStatusList?: string[]; + entryStartTime?: string; + entryEndTime?: string; + formalStartTime?: string; + formalEndTime?: string; + turnoverStartTime?: string; + turnoverEndTime?: string; + practiceStartTime?: string; + practiceEndTime?: string; + positionId?: string; + positionStatus?: number; + politicalOutlook?: string; + caseManageLabels?: string[]; + socialSecurityExpire?: 0 | 1 | undefined; + deptId?: number; +} + +export interface EmployeeVO { + id?: number; + userName?: string; + sex?: 0 | 1; + idCard?: string; + age?: number; + phone?: string; + deptId?: number; + politicalOutlook?: string; + positionId?: number; + positionName?: string; + positionStatus?: number; + entryTime?: string; + formalTime?: any; + probationaryTimeLimit?: number; + surplusDay?: number; + probationarySalary?: number; + formalSalary?: number; + bank?: string; + bankCard?: string; + contractNumber?: string; + contractTimeLimit?: number; + contractDate?: string; + contractExpire?: number; + socialSecurityExpire?: number; + socialSecurityNumber?: string; + socialSecurityOut?: number; + socialSecurityStatus?: number; + turnoverTime?: string; + turnoverStatus?: number; + practiceNumber?: string; + practiceDate?: string; + practiceExpire?: number; + emergencyContact?: string; + emergencyContactRelationship?: string; + emergencyContactPhone?: string; + householdAddress?: string; + presentAddress?: string; + caseManageLabels?: string[]; + cmRemark?: string; + remark?: string; + jianliFile?: any; + ruzhicailiaoFile?: any; + hetongFile?: any; +} + +export interface EmployeeForm { + id?: number; + userName?: string; + sex?: 0 | 1; + idCard?: string; + age?: number; + phone?: string; + positionName?: string; + positionStatus?: number; + entryTime?: string; + formalTime?: string; + probationaryTimeLimit?: number; + surplusDay?: number; + probationarySalary?: number; + formalSalary?: number; + bank?: string; + bankCard?: string; + contractNumber?: string; + contractTimeLimit?: number; + contractDate?: string; + contractExpire?: number; + socialSecurityExpire?: number; + socialSecurityNumber?: string; + socialSecurityOut?: number; + socialSecurityStatus?: number; + turnoverTime?: string; + turnoverStatus?: number; + practiceNumber?: string; + practiceDate?: string; + practiceExpire?: number; + emergencyContact?: string; + emergencyContactRelationship?: string; + emergencyContactPhone?: string; + householdAddress?: string; + presentAddress?: string; + caseManageLabels?: string[]; + cmRemark?: string; + remark?: string; + jianliFile?: string; + ruzhicailiaoFile?: string; + hetongFile?: string; +} diff --git a/src/api/operate/letter/index.ts b/src/api/operate/letter/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..3dc312f7d859a13c797132769301cc268fe6887e --- /dev/null +++ b/src/api/operate/letter/index.ts @@ -0,0 +1,103 @@ +import request from "@/utils/request"; +import { AxiosPromise } from "axios"; +import { + LetterForm, + LetterPageQuery, + LetterVO, +} from "@/api/operate/letter/types"; + +const root_path = "/api/v1/letter/number/"; + +// 获取表格列表 +export function getList( + queryParams: LetterPageQuery +): AxiosPromise> { + return request({ + url: root_path + "details/page", + method: "get", + params: queryParams, + }); +} + +// 修改表单 +export function doEdit(data: LetterForm): AxiosPromise { + return request({ + url: root_path + "update/details/" + data.id, + method: "put", + data: data, + }); +} + +// 确认保存表单 +export function doSave(data: LetterForm): AxiosPromise { + return request({ + url: root_path + "save/details/" + data.id, + method: "post", + data: data, + }); +} + +// 生成函号 +export function createHanNumber(data: any) { + return request({ + url: root_path + "add/details", + method: "post", + data: data, + }); +} + +// 所函号生效 +export function changeSuccessStatus(data: any) { + return request({ + url: root_path + "update/details/success/status", + method: "put", + params: data, + }); +} + +// 所函号失效 +export function changeLoseStatus(id: { id: number }) { + return request({ + url: root_path + "update/details/lose/status/" + id.id, + method: "put", + params: id, + }); +} + +// 导出 +export function exportDataApi(queryParams: LetterPageQuery) { + return request({ + url: root_path + "_export", + method: "get", + params: queryParams, + responseType: "arraybuffer", + }); +} + +// 筛选项 +// 申请人 +export function getApplicantOption(queryParams: any) { + return request({ + url: root_path + "listApplicant", + method: "get", + params: queryParams, + }); +} + +// 操作人 +export function getOperationOption(queryParams: any) { + return request({ + url: root_path + "listOperation", + method: "get", + params: queryParams, + }); +} + +// 原告委托人 +export function getPlaintiffOption(queryParams: any) { + return request({ + url: root_path + "listPlaintiff", + method: "get", + params: queryParams, + }); +} diff --git a/src/api/operate/letter/types.ts b/src/api/operate/letter/types.ts new file mode 100644 index 0000000000000000000000000000000000000000..6b108f5b72f0a1b3450853901add7b6c0ca8402e --- /dev/null +++ b/src/api/operate/letter/types.ts @@ -0,0 +1,69 @@ +export interface LetterPageQuery extends PageQuery { + levelNumStr?: string; + firstLevelNum?: number; + letterNumberType?: 1 | 2 | 3; + levelType?: 0 | 1; + numStatus?: 0 | 1 | 2; + batchId?: number; + plaintiff?: string; + plaintiffId?: number; + applicantDateStart?: string; + applicantDateEnd?: string; + successTimeStart?: string; + successTimeEnd?: string; + applicant?: string; + updateUserId?: string; + ifOvertime?: 1 | 0; +} + +export interface LetterVO { + id?: number; + levelNumStr?: string; + secondLevelNumStr?: string; + levelType?: number; + letterNumberType?: number; + plaintiff?: string; + defendant?: string; + applicant?: string; + applicantDate?: string; + caseId?: number; + batchId?: number; + batchName?: string; + numStatus?: number; + successTime?: string; + contractUrl?: string; + letterUrl?: string; + remark?: string; + createUserId?: number; + createUserName?: string; + createTime?: string; + updateUserId?: number; + updateUserName?: string; + updateTime?: string; +} + +export interface LetterForm { + id?: number; + firstLevelNumStr?: string; + secondLevelNumStr?: string; + levelType?: number; + letterNumberType?: number; + plaintiff?: string; + defendant?: string; + applicant?: string; + applicantDate?: string; + caseId?: number; + batchId?: number; + batchName?: string; + numStatus?: number; + successTime?: string; + contractUrl?: string; + letterUrl?: string; + remark?: string; + createUserId?: number; + createUserName?: string; + createTime?: string; + updateUserId?: number; + updateUserName?: string; + updateTime?: string; +} diff --git a/src/api/operate/phone/index.ts b/src/api/operate/phone/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..c015a794288ae2bf9f48722b61aa1fa88a544b02 --- /dev/null +++ b/src/api/operate/phone/index.ts @@ -0,0 +1,79 @@ +import request from "@/utils/request"; +import { AxiosPromise } from "axios"; +import qs from "qs"; +import { PhoneForm, PhonePageQuery, PhoneVO } from "@/api/operate/phone/types"; + +const root_path = "/api/v1/ops/phone/manage/"; + +// 获取表格列表 +export function getList( + queryParams: PhonePageQuery +): AxiosPromise> { + return request({ + url: root_path + "page", + method: "get", + params: queryParams, + paramsSerializer: function (params) { + return qs.stringify(params, { arrayFormat: "repeat" }); + }, + }); +} + +// 新增表单 +export function doCreate(data: PhoneForm): AxiosPromise { + return request({ + url: root_path + "add", + method: "post", + data: data, + }); +} + +// 修改表单 +export function doEdit(data: PhoneForm): AxiosPromise { + return request({ + url: root_path + "update", + method: "put", + data: data, + }); +} + +// 置失效 +export function doDelete(id: number) { + return request({ + url: root_path + "update/status/" + id, + method: "put", + }); +} + +// 获取条目详情 +export function getDetail(id: number | undefined) { + return request({ + url: root_path + id, + method: "get", + }); +} + +// 筛选项 +//用途标签 +export function getPhoneUsesOption() { + return request({ + url: root_path + "listUses", + method: "get", + }); +} + +//绑定立案人 +export function getCaseLawyersOption() { + return request({ + url: "/api/v1/case/misc/listRoleLawyerAccounts", + method: "get", + }); +} + +//手机型号 +export function getPhoneModelOption() { + return request({ + url: root_path + "listModel", + method: "get", + }); +} diff --git a/src/api/operate/phone/types.ts b/src/api/operate/phone/types.ts new file mode 100644 index 0000000000000000000000000000000000000000..bc6c1a9cbb3212b6e01f8341c75c9ec15843b3bd --- /dev/null +++ b/src/api/operate/phone/types.ts @@ -0,0 +1,53 @@ +export interface PhonePageQuery extends PageQuery { + phonePerson?: string; + phone?: string; + cardOperator?: string; + plaintiffId?: number; + batchId?: number; + lawyerId?: number; + status?: number; + phoneUses?: number; + checkDateExpire?: number; +} + +export interface PhoneVO { + id?: number; + phonePerson?: string; + phone?: string; + cardType?: number; + cardOperator?: string; + status?: number; + phoneUses?: number; + phoneModel?: string; + storagePoint?: string; + plaintiffId?: number; + batchIds?: number; + lawyerId?: number; + wxData?: string; + checkDate?: string; + balance?: number; + description?: string; +} + +export interface PhoneForm { + id?: number; + phonePerson: string; + phone?: string; + parentPhone?: string; + cardType: number; + cardOperator: string; + status: number; + phoneUses: number; + phoneModel: string; + storagePoint?: string; + plaintiffId: number; + plaintiffName?: string; + batchId: number; + batchOpsName?: string; + lawyerId: number; + lawyerName?: string; + wxData?: string; + checkDate: string; + balance: number; + description?: string; +} diff --git a/src/api/repay/index.ts b/src/api/repay/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..bdda6013d5be71200b61da888dd6f72baa455e41 --- /dev/null +++ b/src/api/repay/index.ts @@ -0,0 +1,36 @@ +import request from "@/utils/request"; +import { AxiosPromise } from "axios"; + +const root_path = "/api/v1/refund/pay/list/"; + +// 获取已履行回款列表 +export function getPerformedList(): AxiosPromise { + return request({ + url: root_path + "performed", + method: "get", + }); +} + +// 获取待履行回款列表 +export function getUnPerformedList(): AxiosPromise { + return request({ + url: root_path + "toBePerformed", + method: "get", + }); +} + +// 获取违约回款列表 +export function getBreakPerformedList(): AxiosPromise { + return request({ + url: root_path + "performanceBreach", + method: "get", + }); +} + +// 获取违约回款列表 +export function getKpiList(): AxiosPromise { + return request({ + url: root_path + "listKpiDataReport", + method: "get", + }); +} diff --git a/src/api/user/types.ts b/src/api/user/types.ts index c0060f271079dd7e127008cc338ff8fa81fb604c..e15506593ad724b266110137a04016985829926c 100644 --- a/src/api/user/types.ts +++ b/src/api/user/types.ts @@ -8,6 +8,7 @@ export interface UserInfo { avatar?: string; roles: string[]; perms: string[]; + mobile?: string; } /** @@ -49,6 +50,7 @@ export interface UserPageVO { * 用户ID */ id?: number; + seatName?: string; /** * 手机号 */ @@ -95,6 +97,9 @@ export interface UserForm { * 用户ID */ id?: number; + + seatName?: string; + mobile?: string; /** * 昵称 diff --git a/src/assets/logo.png b/src/assets/logo.png index f3d2503fc2a44b5053b0837ebea6e87a2d339a43..c590820d96a83391ff7265603432c514a4326693 100644 Binary files a/src/assets/logo.png and b/src/assets/logo.png differ diff --git a/src/common/index.ts b/src/common/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..2b6bd33aff8e48ce64fb01f86a89128a548fe612 --- /dev/null +++ b/src/common/index.ts @@ -0,0 +1,30 @@ +import { useUserStoreHook } from "@/store/modules/user"; + +function matchPermPrefix(requiredPerm: string, perm: string): boolean { + if (requiredPerm.endsWith("*")) { + requiredPerm = requiredPerm.slice(0, -1); + return perm.startsWith(requiredPerm); + } else { + return requiredPerm === perm; + } +} + +function anyMatchPermPrefix(requiredPerms: string[], perm: string): boolean { + for (const requiredPerm of requiredPerms) { + if (matchPermPrefix(requiredPerm, perm)) { + return true; + } + } + return false; +} + +export function hasPermission(requiredPerms: string[]) { + const { roles, perms } = useUserStoreHook().user; + if (roles.includes("ROOT")) { + return true; + } + const hasPerm = perms?.some((perm) => { + return anyMatchPermPrefix(requiredPerms, perm); + }); + return hasPerm; +} diff --git a/src/components/AudioPlayer/index.vue b/src/components/AudioPlayer/index.vue new file mode 100644 index 0000000000000000000000000000000000000000..d1db7bd2b0665797022c1883f0dfeb65457bcffe --- /dev/null +++ b/src/components/AudioPlayer/index.vue @@ -0,0 +1,175 @@ + + + + + diff --git a/src/components/Pagination/index.vue b/src/components/Pagination/index.vue index 84e8f3e03c2b9ab320da25fe8cbe6f01f667d10b..c1d8ee4ac38f5da45c74d980b6c175422ea5b31f 100644 --- a/src/components/Pagination/index.vue +++ b/src/components/Pagination/index.vue @@ -5,6 +5,7 @@ v-model:page-size="pageSize" :background="background" :layout="layout" + :small="small" :page-sizes="pageSizes" :total="total" @size-change="handleSizeChange" @@ -23,6 +24,10 @@ const props = defineProps({ type: Number as PropType, default: 0, }, + small: { + type: Boolean, + default: false, + }, page: { type: Number, default: 1, diff --git a/src/components/table.vue b/src/components/table.vue new file mode 100644 index 0000000000000000000000000000000000000000..3fa8de019d74da2c2abb39621fdfebeca0864a67 --- /dev/null +++ b/src/components/table.vue @@ -0,0 +1,81 @@ + + + diff --git a/src/directive/index.ts b/src/directive/index.ts index 9c22eb69f123730bfb405a6e74c88ee538ea0dea..26d27d041cd3d628656b263bf2d2bb99e4ffa791 100644 --- a/src/directive/index.ts +++ b/src/directive/index.ts @@ -1,9 +1,12 @@ import type { App } from "vue"; -import { hasPerm } from "./permission"; +import { hasPerm, hasRole } from "./permission"; +import { changeHeight } from "@/directive/tableHeight"; // 全局注册 directive export function setupDirective(app: App) { // 使 v-hasPerm 在所有组件中都可用 app.directive("hasPerm", hasPerm); + app.directive("hasRole", hasRole); + app.directive("changeHeight", changeHeight); } diff --git a/src/directive/permission/index.ts b/src/directive/permission/index.ts index 2bd2c7054f514cf74c2776fa39de656c97213584..9df1853aa6c778729e4948411c08ef18233ad259 100644 --- a/src/directive/permission/index.ts +++ b/src/directive/permission/index.ts @@ -1,6 +1,24 @@ import { useUserStoreHook } from "@/store/modules/user"; import { Directive, DirectiveBinding } from "vue"; +function matchPermPrefix(requiredPerm: string, perm: string): boolean { + if (requiredPerm.endsWith("*")) { + requiredPerm = requiredPerm.slice(0, -1); + return perm.startsWith(requiredPerm); + } else { + return requiredPerm === perm; + } +} + +function anyMatchPermPrefix(requiredPerms: string[], perm: string): boolean { + for (const requiredPerm of requiredPerms) { + if (matchPermPrefix(requiredPerm, perm)) { + return true; + } + } + return false; +} + /** * 按钮权限 */ @@ -17,7 +35,7 @@ export const hasPerm: Directive = { const requiredPerms = value; // DOM绑定需要的按钮权限标识 const hasPerm = perms?.some((perm) => { - return requiredPerms.includes(perm); + return anyMatchPermPrefix(requiredPerms, perm); }); if (!hasPerm) { @@ -36,8 +54,12 @@ export const hasPerm: Directive = { */ export const hasRole: Directive = { mounted(el: HTMLElement, binding: DirectiveBinding) { + // 「超级管理员」拥有所有的按钮权限 + const { roles, perms } = useUserStoreHook().user; + if (roles.includes("ROOT")) { + return true; + } const { value } = binding; - if (value) { const requiredRoles = value; // DOM绑定需要的角色编码 const { roles } = useUserStoreHook().user; diff --git a/src/directive/tableHeight/index.ts b/src/directive/tableHeight/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..3172bdb82f96234663cdfcd75add5ab91c22ef57 --- /dev/null +++ b/src/directive/tableHeight/index.ts @@ -0,0 +1,34 @@ +import { Directive, DirectiveBinding } from "vue"; + +/** + * 按钮权限 + */ +export const changeHeight: Directive = { + mounted(el: HTMLElement, binding: DirectiveBinding) { + console.log("el", el); + console.log("binding", binding); + console.log(binding.value); + // // 「超级管理员」拥有所有的按钮权限 + // const { roles, perms } = useUserStoreHook().user; + // if (roles.includes("ROOT")) { + // return true; + // } + // // 「其他角色」按钮权限校验 + // const { value } = binding; + // if (value) { + // const requiredPerms = value; // DOM绑定需要的按钮权限标识 + // + // const hasPerm = perms?.some((perm) => { + // return anyMatchPermPrefix(requiredPerms, perm); + // }); + // + // if (!hasPerm) { + // el.parentNode && el.parentNode.removeChild(el); + // } + // } else { + // throw new Error( + // "need perms! Like v-has-perm=\"['sys:user:add','sys:user:edit']\"" + // ); + // } + }, +}; diff --git a/src/lang/package/zh-cn.ts b/src/lang/package/zh-cn.ts index ed901433f8072c10c483507a0b7c80d34351d296..24a4715bc15851586528927007a5d22e5243ed07 100644 --- a/src/lang/package/zh-cn.ts +++ b/src/lang/package/zh-cn.ts @@ -14,6 +14,7 @@ export default { // 导航栏国际化 navbar: { dashboard: "首页", + case_sys: "办案系统", logout: "注销", document: "项目文档", gitee: "码云", diff --git a/src/layout/components/AppMain.vue b/src/layout/components/AppMain.vue index 4d24b3ff07b7ed0e4ead73860a326af1a2bec4c0..13427fe8e6b8617a019924dcd20fad56bd7a3464 100644 --- a/src/layout/components/AppMain.vue +++ b/src/layout/components/AppMain.vue @@ -9,7 +9,7 @@ const tagsViewStore = useTagsViewStore();