Compare commits

...

54 Commits

Author SHA1 Message Date
147c34f4f9 feat(credit): 新增信用管理小程序客户多步骤页面
- 添加 step1、step2、step3 页面实现多步骤客户管理功能
- 集成 ele-pro-table 组件实现客户数据表格展示
- 实现用户信息、拖欠金额、步骤状态等关键字段显示
- 添加文件附件预览和图片缩略图展示功能
- 实现搜索、编辑、删除、批量操作等交互功能
- 集成导出功能支持客户数据导出为 Excel
- 添加自定义列过滤和默认可见列配置
- 实现步骤标签颜色分类和状态标记功能
2026-03-20 21:02:44 +08:00
ce3f22f4ae feat(credit): 添加客户列表跟进人字段显示
- 在表格列配置中增加跟进人列定义
- 设置跟进人列的数据索引为 realName
- 配置跟进人列宽度为 120px 并居中对齐
- 将 realName 字段添加到列表查询参数中
2026-03-19 17:35:57 +08:00
54827a9876 fix(file): 解决OSS图片处理参数导致的文件访问问题
- 在SelectFile组件中为文件链接添加stripOssImageProcess处理
- 从common工具库导入并使用stripOssImageProcess函数
- 在creditMpCustomer编辑页面对文件URL进行图片处理参数清理
- 在creditMpCustomer列表页面添加sanitizeFileUrl函数处理文件URL
- 修改文件规范化逻辑以确保非图片文件移除OSS处理参数
2026-03-19 17:30:21 +08:00
a0a4cc7a8d feat(credit): 更新客户信息编辑组件功能
- 替换城市输入框为省市区级联选择组件
- 新增步骤下拉选择框用于流程状态管理
- 集成文件选择组件替代原有文件路径输入框
- 实现文件上传和删除功能
- 添加文件列表管理和同步逻辑
- 优化搜索组件中关键词搜索框位置
- 完善查询参数过滤逻辑支持数组和单一值处理
2026-03-19 17:19:03 +08:00
56063e9bcd feat(credit): 更新客户信息编辑组件功能
- 替换城市输入框为省市区级联选择组件
- 新增步骤下拉选择框用于流程状态管理
- 集成文件选择组件替代原有文件路径输入框
- 实现文件上传和删除功能
- 添加文件列表管理和同步逻辑
- 优化搜索组件中关键词搜索框位置
- 完善查询参数过滤逻辑支持数组和单一值处理
2026-03-19 17:08:20 +08:00
72c431967d feat(creditMpCustomer): 添加步骤筛选功能并优化文件展示
- 在模型中新增 step 字段用于标识处理进度
- 添加步骤筛选下拉框支持按状态搜索
- 重构文件展示逻辑支持图片预览和文件链接
- 添加步骤标签颜色区分不同处理阶段
- 优化表格列宽度布局提升显示效果
- 实现文件路径解析和缓存机制
2026-03-19 16:18:23 +08:00
1b115edabe feat(credit): 添加小程序客户用户信息展示功能
- 在模型中增加昵称、头像、手机号字段
- 实现用户信息表格列,展示头像、昵称和手机号
- 添加用户信息样式布局
- 更新导出数据配置,包含新的用户信息字段
- 调整表格列宽度和对齐方式以优化显示效果
2026-03-16 23:37:23 +08:00
41a1fcb4ed feat(creditMpCustomer): 添加导出和批量删除功能
- 在搜索组件中添加导出按钮和批量删除按钮
- 实现导出数据功能,支持导出小程序端客户列表
- 添加关键词搜索功能,支持按关键词过滤数据
- 实现批量删除功能,支持选择多个客户进行删除
- 更新表格配置,添加行选择和搜索参数传递
- 修改数据源查询逻辑,支持关键词和状态筛选
- 添加文件下载图标和删除图标依赖
2026-03-16 21:39:57 +08:00
c79c68e7a1 refactor(creditMpCustomer): 移除不必要的表单项并优化列表配置
- 移除了链接、状态、企业ID、所在省份、所在辖区、是否有数据、是否推荐等表单项
- 将文件上传字段从image重命名为files以保持一致性
- 更新了表格列配置,移除了对应的显示列
- 修改了删除功能中的主键引用从creditMpCustomerId改为id
- 调整了默认显示的核心列配置
- 移除了修改时间字段的显示与相关逻辑
2026-03-16 21:26:39 +08:00
5182112b72 feat(credit): 添加小程序端客户管理功能
- 创建小程序端客户数据模型和API接口
- 实现分页查询、新增、修改、删除等基础CRUD操作
- 添加小程序端客户管理页面和编辑弹窗组件
- 集成表格展示、搜索、批量操作等功能
- 配置开发环境API地址为http://127.0.0.1:9200/api
2026-03-16 21:08:51 +08:00
a9d008fb90 feat(credit): 添加客户导入功能并优化信用模块界面
- 在客户导入API中添加isCustomer参数标识
- 为信用相关页面集成公司ID刷新按钮组件
- 在竞争者、客户、外部、风险关系和供应商模块中添加刷新功能
- 配置开发环境变量注释API地址配置
- 统一信用模块工具栏组件导入和使用方式
2026-03-15 13:01:41 +08:00
6827855b78 feat(credit): 添加企业客户导入功能
- 在CreditCompanyParam接口中新增type和isCustomer字段
- 实现importCustomer API方法用于导入客户Excel文件
- 创建credit-company-import组件实现企业批量导入功能
- 开发credit-company-related-import组件用于企业详情子表导入
- 添加creditCompanyEdit组件提供企业信息编辑功能
- 集成导入功能到客户管理页面并更新搜索组件
- 配置表格列展示企业详细信息并设置滚动宽度
- 实现导入模板下载和文件类型验证功能
2026-03-12 22:24:58 +08:00
3f2ab2cc40 feat(credit): 添加涉案金额字段显示并调整开发环境配置
- 在信用判决债务人页面添加 involvedAmount 字段模板
- 当 involvedAmount 为空时回退到 amount 字段显示
- 注释掉开发环境中的 VITE_API_URL 配置项以避免冲突
2026-03-05 09:01:13 +08:00
a0170f820e feat(components): 添加社区和门店选择组件
- 新增 SelectCommunity 组件用于选择社区数据
- 新增 SelectShopStore 组件用于选择门店数据
- 实现社区选择的数据表格和搜索功能
- 实现门店选择的数据表格和搜索功能
- 集成弹窗模式的选择交互界面
- 添加相应的 API 接口调用支持
2026-03-04 14:10:54 +08:00
a9d513fca4 feat(shop): 添加小区、门店、配送员、店员、仓库管理功能及相关API
- 新增小区管理模块,包括查询、添加、修改、删除等功能
- 新增门店管理模块,包含门店基础信息管理功能
- 新增配送员管理模块,支持骑手信息配置及工作状态管理
- 新增店员管理模块,用于门店人员信息维护
- 新增仓库管理模块,支持不同类型的仓库信息管理
- 添加电子围栏功能,支持圆形和方形围栏设置
- 更新经销商用户模型,增加类型、头像、店铺名称等字段
- 更新订单模型,添加物流单号、昵称等字段
- 更新商品模型,调整分销佣金相关字段设计
- 修复信用模块中部分字段映射错误问题
- 优化邀请链接生成逻辑,增加租户ID参数传递
- 移除部分不必要部门字段显示,简化管理员界面
2026-03-04 14:04:57 +08:00
fe20f0f0b3 feat(credit): 新增附近企业批量导入功能并优化数据表结构
- 新增 importCreditNearbyCompanyMulti 函数支持多文件同时导入
- 提取 buildImportFormData 工具函数统一处理文件上传逻辑
- 在信用公司页面新增批量导入按钮和上传图标组件
- 将限制高消费表格中的发生时间字段从 occurrenceTime 改为 releaseDate
- 调整股权冻结页面的数据状态列顺序和显示逻辑
- 移除附近企业页面中重复和不必要的表格列配置
- 修改附近企业页面通信地址邮箱列为正确的通信地址邮编
- 更新开发环境配置文件启用本地 API 地址并
2026-03-03 16:32:16 +08:00
b1147f7a3d feat(credit): 添加附近企业批量导入功能
- 新增 ImportBatchCreditNearbyCompanyItem 和 ImportBatchCreditNearbyCompanyResult 接口定义
- 实现 importBatchCreditNearbyCompany 函数支持多文件循环导入
- 添加 stopOnError 选项控制遇到失败时是否停止导入
- 返回详细的导入结果统计(总数、成功数、失败数及明细)
- 确保即使有失败也不 reject,便于上层展示部分成功/失败明细
2026-03-02 15:17:21 +08:00
c29daa5293 feat(credit): 添加历史司法数据导入功能
- 新增立案信息历史数据导入API和组件
- 新增送达公告历史数据导入API和组件
- 新增诉前调解历史数据导入API和组件
- 在企业详情页面添加各类型历史数据导入按钮
- 实现Excel文件上传和模板下载功能
- 添加文件类型和大小验证机制
2026-03-02 14:47:10 +08:00
b4f3dcbb18 feat(credit): 更新表格选择模式并添加新的列模板
- 将多个信用模块表格的选择属性从 :selection 改为 v-model:selection
- 在信用判决债务人页面添加 appellee 列的模板显示
- 在信用执行信息页面添加 plaintiffAppellant 列的模板显示
- 优化表格组件的数据绑定方式
2026-03-02 14:25:32 +08:00
ddb311b82f fix(credit): 修正信用违约和公司信息页面字段映射错误
- 修复信用违约页面中原告/上诉人与被告/被上诉人的字段映射颠倒问题
- 修正信用公司信息组件中当事人的字段配置错误
- 注释开发环境中的API URL配置以避免冲突
2026-03-02 14:08:20 +08:00
6a9be80811 refactor(setting): 更新设置组件以支持基于键值的更新
- 将 updateSetting 替换为 updateSettingByKey 方法调用
- 为所有设置组件初始化 settingKey 和 settingId 字段
- 重构 watch 监听逻辑以支持多类型数据格式处理
- 实现对 content 字段的字符串和对象格式解析
- 添加对数组和对象数据类型的兼容性支持
- 优化表单数据赋值和重置逻辑
- 统一各组件中的数据处理流程
2026-02-27 22:59:51 +08:00
75d31dd09e fix(credit): 修复被执行人的appellee字段显示问题
- 在customRender函数中为appellee字段添加默认值'-'
- 解决当name1和appellee都为空时显示undefined的问题
- 确保被执行人的appellee字段始终有正确的显示值
2026-02-14 18:09:57 +08:00
d3345d14d6 style(credit): 格式化代码并优化表格渲染逻辑
- 统一API请求参数格式化,在多个信用模块中添加对象参数换行
- 移除多余空行和尾随逗号,保持代码整洁
- 优化信用公司组件中的表格列配置,修复被执行人字段显示逻辑
- 调整信用案件导入模板下载链接的布局格式
- 优化表格数据分页计算,改进总数判断逻辑
- 调整搜索组件中注释按钮的缩进格式
- 修复信用司法页面的导入按钮组件路径引用格式
2026-02-14 17:37:48 +08:00
ff186910da feat(credit): 更新信用 judgment debtor 模型并添加排序功能
- 在 creditJudgmentDebtor 模型中添加原告/上诉人、被告/被上诉人、其他当事人/第三人字段
- 修复模型中 name 字段注释并添加 name1 备用字段
- 在 creditCompanyInfo 组件中调整字段映射,将 name1 移至正确位置
- 修复 freezeDateEnd 字段映射错误
- 为 creditCustomer、creditJudgmentDebtor 和 creditSupplier 页面的表格列添加排序功能
- 更新相关表格列配置以支持 sorter 属性
2026-02-14 17:27:46 +08:00
338a2b9d72 feat(credit): 更新司法文书相关字段和表格列配置
- 在信用司法文书模型中添加文书类型字段 documentType
- 将导入按钮文本从"导入(多)"更改为"导入(单)"
- 统一将 plaintiffUser 字段重命名为 plaintiffAppellant,defendantUser 重命名为 appellee
- 更新多个表格列配置中的字段映射关系
- 修改文书类型列的数据索引从 type 到 documentType
- 移除重复的冻结日期结束列并优化股权冻结表格结构
2026-02-14 11:09:57 +08:00
36806bac58 feat(credit): 更新信用模块表格字段配置
- 在信用公司信息组件中为对外投资和案件相关表格添加创建时间字段
- 调整被执行人表格的列顺序并重命名相关字段如原告/上诉人、被告/被上诉人等
- 修改涉案金额字段名为involvedAmount并在判决债务人页面添加创建时间列
- 重新排列信用用户页面中标的金额和操作人列的顺序
- 更新限制高消费页面的涉案金额和法院标题文案
2026-02-14 09:55:21 +08:00
952a082752 style(table): 调整表格列宽和对齐样式
- 调整信用公司页面表格列宽:原文件导入名称和系统匹配企业名称从240调整为280
- 调整信用公司页面表格列宽:登记状态从120调整为180
- 调整信用公司页面表格列宽:参保人数所属年报从140调整为180
- 移除信用公司页面更多邮箱、企业类型和纳税人识别号的固定宽度设置
- 为信用公司页面曾用名和英文名添加省略号显示
- 为信用客户页面状态、销售金额、公开日期和数据来源列添加居中对齐和固定宽度
- 修复信用客户页面重复的排序器配置
- 在信用用户页面启用并配置创建时间列的显示和格式化
2026-02-12 15:48:47 +08:00
9febd8016c feat(credit): 信用模块历史数据导入功能优化
- 为所有信用模块的导入组件添加companyId参数支持
- 在企业详情页面为各信用分类标签页添加历史数据导入按钮
- 移除独立的历史导入按钮,整合到企业详情页的对应标签页中
- 更新导入功能的API调用以传递关联企业ID
- 修复法院公告相关组件的命名一致性问题
- 重构导入完成后的数据刷新逻辑以匹配新的标签页结构
2026-02-11 17:55:23 +08:00
f01e3359ec style(credit): 格式化代码并移除未使用的方法
- 移除了 CreditSearchToolbar 组件中的未使用 add 方法
- 格式化了多个信用模块中的组件标签换行
- 格式化了 Ant Design 图标导入语句的换行
- 为表格列添加了排序功能 (sorter: true)
- 格式化了 creditGqdj 模块中的长对象属性换行
- 格式化了 creditNearbyCompany 模块中的注释和表格配置
- 移除了重复的 sorter 属性配置
2026-02-06 18:53:54 +08:00
8d1d9d9de9 feat(credit): 更新信用判决债务人页面表格字段
- 新增原告/上诉人、被告/被上诉人、其他当事人/第三人字段
- 新增发生时间字段并调整宽度为120
- 将立案日期字段重命名为发生时间
- 将执行标的字段重命名为涉案金额
- 移除证件号/组织机构代码字段
- 调整表格列配置顺序和结构
2026-02-06 16:54:19 +08:00
c16b857505 refactor(credit): 更新搜索工具栏组件以支持动态模块配置
- 修改 CreditSearchToolbar 组件以接收 module 属性并传递给 RefreshCompanyIdButton
- 在所有信用相关页面中添加对应的 module 属性配置
- 优化组件代码格式化和导入语句
- 添加 reload 方法以在刷新 companyId 后保持搜索条件
- 修复图标组件标签闭合格式问题
2026-02-06 13:20:52 +08:00
d97d279670 refactor(credit): 移除行政许可模型中的无效注解
- 移除了 licenseContent 字段上的 TableField 注解
- 保留了许可内容字段的其他功能实现
- 清理了相关的元数据映射配置
2026-02-06 12:52:16 +08:00
c18120fe81 fix(credit): 修复信用评估页面状态字段映射错误
- 将表格列的dataIndex从'status'更正为'dataType'
- 将表格列的key从'status'更正为'dataType'
- 确保数据绑定与实际数据结构一致
2026-01-31 13:22:46 +08:00
2d7e44e0ad refactor(credit): 更新信用模块表格字段映射
- 将 plaintiffUser 字段统一重命名为 plaintiffAppellant
- 将被告字段从 plaintiffUser 更改为 appellee
- 在最终版本页面中修正 dataType 字段映射为正确的当事人字段
- 在股权冻结页面添加 appellee2 回退显示逻辑
- 修正信用修复页面的被告字段映射为 defendantUser
2026-01-31 02:17:27 +08:00
c5908f4376 refactor(credit): 移除后端标记字段并优化数据统计逻辑
- 删除了不再使用的 hasData 字段及其相关注释
- 移除了 normalizeHasData 工具函数
- 将总数统计逻辑改为基于后端返回的 count 字段或列表长度
- 更新了标签页数据检测逻辑为基于记录数判断
- 修正了标签页高亮显示的注释说明
2026-01-28 23:53:10 +08:00
f78aa97bd1 feat(credit): 为企业信用模块添加数据统计和标签高亮功能
- 在CreditCompany模型中新增多个信用相关记录数字段用于数据统计
- 实现标签页数据高亮显示功能,通过记录数判断标签是否有数据
- 添加tabCountFieldMap映射配置不同标签对应的记录数字段
- 实现syncTabsHasDataFromCounts方法同步标签数据状态
- 新增normalizeHasData方法规范化数据存在性判断逻辑
- 添加CSS样式实现有数据标签的红色高亮显示效果
- 更新开发环境API地址配置并移除注释标记
2026-01-28 23:45:27 +08:00
17487cce2b feat(credit): 更新信用模块表格列配置和字段映射
- 在信用违约、立案、法院公告、开庭公告、送达公告等页面新增当事人相关列
- 统一各信用模块表格中的原告/上诉人、被告/被上诉人、其他当事人/第三人字段
- 调整涉案金额、法院、数据状态等字段的显示标题
- 修改信用公司信息组件中的表格列配置逻辑
- 新增columns配置支持重复dataIndex的不同标题显示
- 更新招投标、对外投资、风险关系等多个子模块的字段顺序和映射
- 添加链接文本字段的自动渲染功能
- 优化表格
2026-01-28 16:16:18 +08:00
6b21547b09 feat(credit): 添加用户数据范围控制功能
- 在所有信用模块的搜索参数接口中添加 userId 字段
- 集成 withCreditUserScope 数据范围工具函数到各个 API 请求
- 实现对行政许可、破产重整、分支机构、失信被执行人等所有信用数据的用户范围过滤
- 统一处理分页和列表查询的数据范围限制
- 确保所有信用相关 API 都支持基于用户的权限控制
2026-01-21 13:15:48 +08:00
fa188f482b feat(credit): 添加信用模块主体企业归属修正功能
- 新增 refreshCreditCompanyId API 方法用于修正信用模块数据的企业归属
- 创建 RefreshCompanyIdButton 组件提供统一的修正企业归属按钮界面
- 在多个信用模块页面集成修正企业归属功能按钮
- 更新 CreditSearchToolbar 组件添加修正企业归属按钮
- 修改多个信用模块页面布局结构调整工具栏元素顺序
- 启用 .env.development 中的 API URL 配置
2026-01-20 22:12:39 +08:00
d5e2c43f4e feat(credit): 在企业详情页面添加历史破产重整导入功能
- 在企业详情的破产重整标签页中增加导入历史破产重整按钮
- 修改credit-bankruptcy-history-import组件以支持传入企业ID参数
- 将历史破产重整导入功能集成到企业详情页面的抽屉组件中
- 移除原破产重整主页面的历史导入相关代码和按钮
- 添加企业ID验证逻辑确保导入操作的安全性
- 实现导入完成后的数据重新加载和分页重置功能
2026-01-20 20:55:40 +08:00
a36cafa77a feat(credit): 在企业详情页面添加历史破产重整导入功能
- 在企业详情的破产重整标签页中增加导入历史破产重整按钮
- 修改credit-bankruptcy-history-import组件以支持传入企业ID参数
- 将历史破产重整导入功能集成到企业详情页面的抽屉组件中
- 移除原破产重整主页面的历史导入相关代码和按钮
- 添加企业ID验证逻辑确保导入操作的安全性
- 实现导入完成后的数据重新加载和分页重置功能
2026-01-20 20:45:33 +08:00
4ee9a90ab3 feat(credit): 添加被执行人企业归属修正功能和历史行政许可导入功能
- 新增 refreshCreditJudgmentDebtorCompanyId API 接口用于修正被执行人主体企业归属
- 在信用判断债务人页面添加修正主体企业归属按钮功能
- 修改行政许可历史导入组件支持传入企业ID参数
- 移除重复的历史行政许可导入按钮和弹窗组件
- 在企业详情页面的行政许可标签页添加历史行政许可导入按钮
- 更新多个信用模块的搜索工具栏引用路径
- 隐藏司法相关搜索组件中的导入按钮
2026-01-20 17:25:08 +08:00
c711c3dfe6 feat(credit): 添加信用模块通用工具栏并优化表格组件
- 新增 CreditSearchToolbar2.vue 组件,提供导出、批量删除、搜索功能
- 在所有信用相关页面中新增主体企业字段显示
- 更新表格组件配置,移除不必要的列宽设置
- 替换旧版搜索工具栏为新的统一工具栏组件
- 在信用客户和用户组件中注释掉导入按钮功能
- 为信用工商登记页面添加横向滚动支持
- 在执行债务人页面新增修正主体企业归属按钮
- 配置开发环境API地址为默认启用状态
2026-01-20 16:54:20 +08:00
183967ea4a feat(credit): 添加历史数据导入功能和操作人字段
- 在多个信用模块API中新增历史数据导入功能,包括行政许可、破产重整、失信被执行人、开庭公告、终本案件等
- 为信用相关页面表格增加操作人(realName)字段显示
- 新增历史数据导入弹窗组件,支持Excel文件上传和模板下载
- 实现导入历史数据的API接口函数,支持文件和公司ID参数
- 优化信用模块页面UI布局,添加历史导入按钮和相关组件引用
2026-01-20 02:17:36 +08:00
7890ec07d8 feat(credit): 移除历史被执行人功能并为其他信用模块添加历史导入功能
- 移除被执行人历史相关API接口文件
- 移除被执行人历史相关模型定义文件
- 移除被执行人历史相关页面组件及编辑弹窗
- 在行政许可、破产、失信、庭审、终本、股权冻结、司法文书、限制消费等信用模块中添加历史导入功能
- 为各信用模块添加showImport2变量控制历史导入弹窗显示
- 为各信用模块添加openImport2方法用于打开历史导入弹窗
2026-01-20 00:53:44 +08:00
67f649620a feat(credit): 添加历史被执行人导入功能
- 新增 importCreditJudgmentDebtorHistory API 接口用于导入历史被执行人数据
- 修复历史被执行人导入组件中的 API 路径引用错误
- 更新导入按钮文字为"导入历史被执行人"
- 在表格中添加 updateTime 列显示更新时间
- 新增历史被执行人导入弹窗组件并集成到主页面
- 重命名 createTime 列为 updateTime 以匹配实际字段
- 添加打开历史被执行人导入弹窗的功能函数
2026-01-19 23:50:31 +08:00
ec465ecc5a refactor(credit): 简化被执行人列表组件实现
- 将表格行键从 rowKey 改为 id
- 移除历史被执行人相关功能和导入按钮
- 统一编辑功能,移除区分来源的逻辑
- 移除历史被执行人相关的导入和编辑弹窗组件
- 简化数据获取逻辑,移除客户端合并和排序逻辑
- 移除来源标识字段和相关判断逻辑
- 统一删除操作,简化批量删除的实现
2026-01-19 23:09:55 +08:00
8e76658ce0 feat(credit): 添加历史数据导入功能并优化公司信息展示
- 在多个信用模块中添加历史数据导入按钮,支持导入历史行政许可、破产重整、失信被执行人等
- 引入 CloudUploadOutlined 图标用于导入功能标识
- 重构 creditCompanyInfo 组件中的数据表结构,调整各数据类型的字段顺序和显示配置
- 为附近企业模块增加更多详细字段如邮政编码、纳税人识别号、企业规模等
- 更新分支结构和破产重整等模块的字段隐藏配置
- 优化页面布局使用 a-space 组件改进工具栏样式
2026-01-19 22:36:00 +08:00
8fd96fb05c refactor(credit): 优化企业信用模块数据结构和界面展示
- 将模型中的 companyName 字段统一重命名为 name
- 更新编辑页面标题为更准确的描述
- 调整多个表格列的宽度配置
- 移除冗余的表格滚动设置
- 为主企业名称字段添加空值显示处理
- 统一表格列配置中的样式属性
- 优化表格列的数据索引和键值配置
- 移除过多的表格列宽度和省略号设置
2026-01-19 21:07:53 +08:00
882287c98b refactor(credit): 优化企业信用模块数据结构和界面展示
- 将模型中的 companyName 字段统一重命名为 name
- 更新编辑页面标题为更准确的描述
- 调整多个表格列的宽度配置
- 移除冗余的表格滚动设置
- 为主企业名称字段添加空值显示处理
- 统一表格列配置中的样式属性
- 优化表格列的数据索引和键值配置
- 移除过多的表格列宽度和省略号设置
2026-01-19 17:43:53 +08:00
cb5569a7e0 refactor(credit): 优化企业信用模块数据结构和界面展示
- 将模型中的 companyName 字段统一重命名为 name
- 更新编辑页面标题为更准确的描述
- 调整多个表格列的宽度配置
- 移除冗余的表格滚动设置
- 为主企业名称字段添加空值显示处理
- 统一表格列配置中的样式属性
- 优化表格列的数据索引和键值配置
- 移除过多的表格列宽度和省略号设置
2026-01-19 16:43:01 +08:00
6f51efe47b refactor(credit): 优化企业信用模块数据结构和界面展示
- 将模型中的 companyName 字段统一重命名为 name
- 更新编辑页面标题为更准确的描述
- 调整多个表格列的宽度配置
- 移除冗余的表格滚动设置
- 为主企业名称字段添加空值显示处理
- 统一表格列配置中的样式属性
- 优化表格列的数据索引和键值配置
- 移除过多的表格列宽度和省略号设置
2026-01-19 15:59:31 +08:00
1031ed9199 refactor(credit): 调整信用模块数据结构和界面展示
- 修改CreditFinalVersion和CreditGqdj接口字段定义,调整字段顺序和内容
- 移除搜索工具栏中的添加按钮,暂时禁用该功能
- 更新行政许可编辑弹窗样式,设置宽度为70%并移除底部操作按钮
- 移除行政许可编辑表单中的多个冗余字段,精简表单内容
- 为信用相关表格组件添加选择功能和横向滚动支持
- 调整多个信用模块表格列配置,移除省略号显示,优化列标题
- 隐藏表格操作列,暂时禁用行操作功能
- 更新企业信息表格字段配置,增加更多企业相关信息列
- 调整企业表格显示逻辑,将名称替换为匹配名称进行展示
- 为多个信用模块表格添加复选框选择功能
- 移除部分表格中的备注字段,简化数据显示
- 注释掉行双击编辑事件,暂停双击编辑功能
2026-01-19 14:21:24 +08:00
463636578d feat(credit): 更新裁判文书模块的数据结构和界面展示
- 在CreditJudicialDocument接口中新增title和releaseDate字段
- 修改裁判文书列表页面的表格列配置,更新显示字段
- 新增发布日期和修改时间的显示列
- 将部分字段名称进行调整以更好地匹配业务需求
- 解除开发环境API地址的注释以启用本地服务调用
2026-01-18 22:52:25 +08:00
225 changed files with 24127 additions and 4919 deletions

View File

@@ -1,6 +1,7 @@
VITE_APP_NAME=后台管理(开发环境) VITE_APP_NAME=后台管理(开发环境)
#VITE_API_URL=http://127.0.0.1:9200/api VITE_API_URL=http://127.0.0.1:9200/api
#VITE_SERVER_API_URL=http://127.0.0.1:8000/api #VITE_SERVER_API_URL=http://127.0.0.1:8000/api
#VITE_API_URL=https://cms-api.s209.websoft.top/api #VITE_API_URL=https://ysb-api.websoft.top/api
#VITE_SERVER_API_URL=https://server.websoft.top/api

62
a.html Normal file
View File

@@ -0,0 +1,62 @@
<p><strong>桂乐淘后台管理手册</strong></p>
<p><strong>后台登录信息:</strong></p>
<p><strong>地址:</strong><a href="login"><strong>https://glt.websoft.top/login</strong></a><strong><br /></strong><strong>账号13800010584</strong><strong><br /></strong><strong>验证码183911</strong></p>
<p><strong>一、创建管理员账号</strong></p>
<p>(一)创建流程</p>
<p>主页-用户管理-设置手机号-角色设置(将该手机号设置为对应的角色权限)-打开管理员开关,即可创建管理员账号-搜索到对应管理员手机号-勾选该账号-重置密码-复制密码给管理员-打开后台登录地址-使用手机号+登录密码+核验码进行登录-登录成功后再自行修改登录密码。</p>
<p><strong>&nbsp;<img src="https://oss.wsdns.cn/20260306/4ce09bd61eb549a3b955490ba2b489d8.png" /></strong></p>
<p><img src="https://oss.wsdns.cn/20260306/a2814cc44e5c41909a513b53b13e2918.png" /></p>
<p><img src="https://oss.wsdns.cn/20260306/205744c621a045b5a2557456dabd25de.png" /></p>
<p><img src="https://oss.wsdns.cn/20260306/f151c0a2571540f1bb54f73e0009db07.png" /></p>
<p><img src="https://oss.wsdns.cn/20260306/fcc150c5e8294b9d990c0eb7db51eed4.png" /></p>
<p>&nbsp;</p>
<p>(二)角色管理</p>
<p>新建或修改角色-分配权限(按角色需要勾选权限)</p>
<p>1.角色设置</p>
<p><img src="https://oss.wsdns.cn/20260306/44dcfdd7e424434788c52a5e3b129b05.png" /></p>
<p>2.角色名称</p>
<p><img src="https://oss.wsdns.cn/20260306/d7405372b30647f99042a1667fba1713.png" /></p>
<p><img src="https://oss.wsdns.cn/20260306/406cb1aab12c45d4ac6aa550bb76b0c2.png" /></p>
<p><strong>&nbsp;</strong></p>
<p><strong>二、业务管理(创建商品-创建水票-配送)</strong></p>
<p>(一)商品创建流程</p>
<p>新增或编辑商品,按字段填写或上传商品信息,保存后即可(可自主管理上下架及商品排序),在商品管理模块添加的是普通的快递商品,不属于水票套票</p>
<p><img src="https://oss.wsdns.cn/20260306/9547293d358c4de0834f39301a68967a.png" /></p>
<p><img src="https://oss.wsdns.cn/20260306/8f7fd971e3bf48c8bf57ee8ff88dc6b0.png" /></p>
<p>&nbsp;</p>
<p>(二)水票套票创建及配送</p>
<p>基于商品管理里的商品信息,进入水票-模板管理-填写模板规则</p>
<p><img src="https://oss.wsdns.cn/20260306/72f6691aacab43d5accacc3d585b2c57.png" /></p>
<p><img src="https://oss.wsdns.cn/20260306/62a4c06e5d7c4f35980eeb4f661fb7a2.png" /></p>
<p><img src="https://oss.wsdns.cn/20260306/4e6a9764ffe24079ae90701254d695ea.png" /></p>
<p><img src="https://oss.wsdns.cn/20260306/0528a0acf7a9483b973a521f8255e6a9.png" /></p>
<p>(三)配送</p>
<p>用户购买水票后,系统自动释放水票模板的首期水票,并自动生成配送订单到用户指定地址(须在电子围栏内)</p>
<p>配送员添加:接单-配送员管理-新增/修改配送员信息</p>
<p><img src="https://oss.wsdns.cn/20260306/853717ca88a046b7bd11f82a7dd1a17d.png" /></p>
<p><img src="https://oss.wsdns.cn/20260306/9d5b41ccbc7243629b98bd1b5e96d000.png" /></p>
<p><img src="https://oss.wsdns.cn/20260306/5bdaadaa39e14046bf1d08c34d745bc3.png" /></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><strong>&nbsp;</strong></p>
<p><strong>三、分销</strong></p>
<p>(一)分销用户</p>
<p><img src="https://oss.wsdns.cn/20260306/964092d296074f0a9df2b9f46d7ef9f4.png" /></p>
<p>(二)推荐关系</p>
<p><img src="https://oss.wsdns.cn/20260306/f299eb173590496c84cd545425c82438.png" /></p>
<p>(三)分销订单</p>
<p><strong><img src="https://oss.wsdns.cn/20260306/ddf51b18abee477eabc3335d5535e9c4.png" /></strong></p>
<p><strong>用户操作手册</strong></p>
<p><strong>一、水票购买</strong></p>
<p>用户可按指引购买水票,选择地址时,如不在电子围栏范围内,无法付款配送。</p>
<p><img src="https://oss.wsdns.cn/20260306/880543fbd60a44d98f79445df0f45115.png" /> &nbsp;<img src="https://oss.wsdns.cn/20260306/f7f628046e384e51a3df99caa320a8a8.png" /><img src="https://oss.wsdns.cn/20260306/515f0893e8d24e0c8ba4a2288f3b67f9.png" /></p>
<p><strong>二、我的水票</strong></p>
<p>用户查看自己购买过的水票明细及使用、释放情况等</p>
<p><img src="https://oss.wsdns.cn/20260306/a482517619654972a713a628109f2cf7.png" /></p>
<p><strong>&nbsp;</strong></p>
<p><strong></strong><strong></strong><strong>立即送水</strong></p>
<p>用户查看自己购买过的水票明细及使用、释放情况等</p>
<p>&nbsp; &nbsp;<img src="https://oss.wsdns.cn/20260306/66a9645153d94ca6b598ae9813516179.png" /><img src="https://oss.wsdns.cn/20260306/06ecf42a53f8411a88ade40e797ed9e9.png" /></p>
<p><strong>三、</strong><strong>分享中心</strong></p>
<p>用户查看自己的推广佣金情况、推广的用户列表,申请提现等</p>
<p>&nbsp; <img src="https://oss.wsdns.cn/20260306/eb6d0d4240374549945a14f6c6b3e179.png" /><img src="https://oss.wsdns.cn/20260306/6036ca3fe4a0438baa3a680a62d2da7b.png" /></p>

View File

@@ -0,0 +1,28 @@
import request from '@/utils/request';
import { withCreditUserScope } from '@/api/credit/utils/data-scope';
import type { ApiResult } from '@/api';
/**
* 修正某个信用模块数据的主体企业归属(按名称匹配回填 companyId
*
* 后端约定: POST /api/credit/{module}/company-id/refresh
* 例如: module = "credit-judgment-debtor"
*/
export async function refreshCreditCompanyId(
module: string,
params?: {
onlyNull?: boolean;
limit?: number;
}
) {
const res = await request.post<ApiResult<unknown>>(
`/credit/${module}/company-id/refresh`,
undefined,
{ params: withCreditUserScope(params) }
);
if (res.data.code === 0) {
return res.data.message;
}
return Promise.reject(new Error(res.data.message));
}

View File

@@ -1,4 +1,6 @@
import request from '@/utils/request'; import request from '@/utils/request';
import { withCreditUserScope } from '@/api/credit/utils/data-scope';
import type { ApiResult, PageResult } from '@/api'; import type { ApiResult, PageResult } from '@/api';
import type { import type {
CreditAdministrativeLicense, CreditAdministrativeLicense,
@@ -14,7 +16,7 @@ export async function pageCreditAdministrativeLicense(
const res = await request.get< const res = await request.get<
ApiResult<PageResult<CreditAdministrativeLicense>> ApiResult<PageResult<CreditAdministrativeLicense>>
>('/credit/credit-administrative-license/page', { >('/credit/credit-administrative-license/page', {
params params: withCreditUserScope(params)
}); });
if (res.data.code === 0) { if (res.data.code === 0) {
return res.data.data; return res.data.data;
@@ -30,9 +32,7 @@ export async function listCreditAdministrativeLicense(
) { ) {
const res = await request.get<ApiResult<CreditAdministrativeLicense[]>>( const res = await request.get<ApiResult<CreditAdministrativeLicense[]>>(
'/credit/credit-administrative-license', '/credit/credit-administrative-license',
{ { params: withCreditUserScope(params) }
params
}
); );
if (res.data.code === 0 && res.data.data) { if (res.data.code === 0 && res.data.data) {
return res.data.data; return res.data.data;
@@ -142,3 +142,30 @@ export async function importCreditAdministrativeLicense(
} }
return Promise.reject(new Error(res.data.message)); return Promise.reject(new Error(res.data.message));
} }
/**
* 导入历史行政许可
*/
export async function importCreditAdministrativeLicenseHistory(
file: File,
companyId?: number
) {
const formData = new FormData();
formData.append('file', file);
if (companyId != null) {
formData.append('companyId', String(companyId));
}
const res = await request.post<ApiResult<unknown>>(
'/credit/credit-administrative-license/import/history',
formData,
{
headers: {
'Content-Type': 'multipart/form-data'
}
}
);
if (res.data.code === 0) {
return res.data.message;
}
return Promise.reject(new Error(res.data.message));
}

View File

@@ -22,7 +22,6 @@ export interface CreditAdministrativeLicense {
validityEnd?: string; validityEnd?: string;
// 许可机关 // 许可机关
licensingAuthority?: string; licensingAuthority?: string;
@TableField("License_content")
// 许可内容 // 许可内容
licenseContent?: string; licenseContent?: string;
// 数据来源单位 // 数据来源单位
@@ -53,6 +52,8 @@ export interface CreditAdministrativeLicense {
* 行政许可搜索条件 * 行政许可搜索条件
*/ */
export interface CreditAdministrativeLicenseParam extends PageParam { export interface CreditAdministrativeLicenseParam extends PageParam {
userId?: number;
id?: number; id?: number;
keywords?: string; keywords?: string;
} }

View File

@@ -1,4 +1,6 @@
import request from '@/utils/request'; import request from '@/utils/request';
import { withCreditUserScope } from '@/api/credit/utils/data-scope';
import type { ApiResult, PageResult } from '@/api'; import type { ApiResult, PageResult } from '@/api';
import type { CreditBankruptcy, CreditBankruptcyParam } from './model'; import type { CreditBankruptcy, CreditBankruptcyParam } from './model';
@@ -8,9 +10,7 @@ import type { CreditBankruptcy, CreditBankruptcyParam } from './model';
export async function pageCreditBankruptcy(params: CreditBankruptcyParam) { export async function pageCreditBankruptcy(params: CreditBankruptcyParam) {
const res = await request.get<ApiResult<PageResult<CreditBankruptcy>>>( const res = await request.get<ApiResult<PageResult<CreditBankruptcy>>>(
'/credit/credit-bankruptcy/page', '/credit/credit-bankruptcy/page',
{ { params: withCreditUserScope(params) }
params
}
); );
if (res.data.code === 0) { if (res.data.code === 0) {
return res.data.data; return res.data.data;
@@ -24,9 +24,7 @@ export async function pageCreditBankruptcy(params: CreditBankruptcyParam) {
export async function listCreditBankruptcy(params?: CreditBankruptcyParam) { export async function listCreditBankruptcy(params?: CreditBankruptcyParam) {
const res = await request.get<ApiResult<CreditBankruptcy[]>>( const res = await request.get<ApiResult<CreditBankruptcy[]>>(
'/credit/credit-bankruptcy', '/credit/credit-bankruptcy',
{ { params: withCreditUserScope(params) }
params
}
); );
if (res.data.code === 0 && res.data.data) { if (res.data.code === 0 && res.data.data) {
return res.data.data; return res.data.data;
@@ -129,3 +127,30 @@ export async function importCreditBankruptcy(file: File, companyId?: number) {
} }
return Promise.reject(new Error(res.data.message)); return Promise.reject(new Error(res.data.message));
} }
/**
* 导入历史破产重整
*/
export async function importCreditBankruptcyHistory(
file: File,
companyId?: number
) {
const formData = new FormData();
formData.append('file', file);
if (companyId != null) {
formData.append('companyId', String(companyId));
}
const res = await request.post<ApiResult<unknown>>(
'/credit/credit-bankruptcy/import/history',
formData,
{
headers: {
'Content-Type': 'multipart/form-data'
}
}
);
if (res.data.code === 0) {
return res.data.message;
}
return Promise.reject(new Error(res.data.message));
}

View File

@@ -44,6 +44,8 @@ export interface CreditBankruptcy {
* 破产重整搜索条件 * 破产重整搜索条件
*/ */
export interface CreditBankruptcyParam extends PageParam { export interface CreditBankruptcyParam extends PageParam {
userId?: number;
id?: number; id?: number;
keywords?: string; keywords?: string;
} }

View File

@@ -1,4 +1,6 @@
import request from '@/utils/request'; import request from '@/utils/request';
import { withCreditUserScope } from '@/api/credit/utils/data-scope';
import type { ApiResult, PageResult } from '@/api'; import type { ApiResult, PageResult } from '@/api';
import type { CreditBranch, CreditBranchParam } from './model'; import type { CreditBranch, CreditBranchParam } from './model';
@@ -8,9 +10,7 @@ import type { CreditBranch, CreditBranchParam } from './model';
export async function pageCreditBranch(params: CreditBranchParam) { export async function pageCreditBranch(params: CreditBranchParam) {
const res = await request.get<ApiResult<PageResult<CreditBranch>>>( const res = await request.get<ApiResult<PageResult<CreditBranch>>>(
'/credit/credit-branch/page', '/credit/credit-branch/page',
{ { params: withCreditUserScope(params) }
params
}
); );
if (res.data.code === 0) { if (res.data.code === 0) {
return res.data.data; return res.data.data;
@@ -24,9 +24,7 @@ export async function pageCreditBranch(params: CreditBranchParam) {
export async function listCreditBranch(params?: CreditBranchParam) { export async function listCreditBranch(params?: CreditBranchParam) {
const res = await request.get<ApiResult<CreditBranch[]>>( const res = await request.get<ApiResult<CreditBranch[]>>(
'/credit/credit-branch', '/credit/credit-branch',
{ { params: withCreditUserScope(params) }
params
}
); );
if (res.data.code === 0 && res.data.data) { if (res.data.code === 0 && res.data.data) {
return res.data.data; return res.data.data;

View File

@@ -44,6 +44,8 @@ export interface CreditBranch {
* 分支机构搜索条件 * 分支机构搜索条件
*/ */
export interface CreditBranchParam extends PageParam { export interface CreditBranchParam extends PageParam {
userId?: number;
id?: number; id?: number;
keywords?: string; keywords?: string;
} }

View File

@@ -1,4 +1,6 @@
import request from '@/utils/request'; import request from '@/utils/request';
import { withCreditUserScope } from '@/api/credit/utils/data-scope';
import type { ApiResult, PageResult } from '@/api'; import type { ApiResult, PageResult } from '@/api';
import type { CreditBreachOfTrust, CreditBreachOfTrustParam } from './model'; import type { CreditBreachOfTrust, CreditBreachOfTrustParam } from './model';
@@ -10,9 +12,7 @@ export async function pageCreditBreachOfTrust(
) { ) {
const res = await request.get<ApiResult<PageResult<CreditBreachOfTrust>>>( const res = await request.get<ApiResult<PageResult<CreditBreachOfTrust>>>(
'/credit/credit-breach-of-trust/page', '/credit/credit-breach-of-trust/page',
{ { params: withCreditUserScope(params) }
params
}
); );
if (res.data.code === 0) { if (res.data.code === 0) {
return res.data.data; return res.data.data;
@@ -28,9 +28,7 @@ export async function listCreditBreachOfTrust(
) { ) {
const res = await request.get<ApiResult<CreditBreachOfTrust[]>>( const res = await request.get<ApiResult<CreditBreachOfTrust[]>>(
'/credit/credit-breach-of-trust', '/credit/credit-breach-of-trust',
{ { params: withCreditUserScope(params) }
params
}
); );
if (res.data.code === 0 && res.data.data) { if (res.data.code === 0 && res.data.data) {
return res.data.data; return res.data.data;
@@ -136,3 +134,30 @@ export async function importCreditBreachOfTrust(
} }
return Promise.reject(new Error(res.data.message)); return Promise.reject(new Error(res.data.message));
} }
/**
* 导入历史失信被执行人
*/
export async function importCreditBreachOfTrustHistory(
file: File,
companyId?: number
) {
const formData = new FormData();
formData.append('file', file);
if (companyId != null) {
formData.append('companyId', String(companyId));
}
const res = await request.post<ApiResult<unknown>>(
'/credit/credit-breach-of-trust/import/history',
formData,
{
headers: {
'Content-Type': 'multipart/form-data'
}
}
);
if (res.data.code === 0) {
return res.data.message;
}
return Promise.reject(new Error(res.data.message));
}

View File

@@ -52,6 +52,8 @@ export interface CreditBreachOfTrust {
* 失信被执行人搜索条件 * 失信被执行人搜索条件
*/ */
export interface CreditBreachOfTrustParam extends PageParam { export interface CreditBreachOfTrustParam extends PageParam {
userId?: number;
id?: number; id?: number;
keywords?: string; keywords?: string;
} }

View File

@@ -1,4 +1,6 @@
import request from '@/utils/request'; import request from '@/utils/request';
import { withCreditUserScope } from '@/api/credit/utils/data-scope';
import type { ApiResult, PageResult } from '@/api'; import type { ApiResult, PageResult } from '@/api';
import type { CreditCaseFiling, CreditCaseFilingParam } from './model'; import type { CreditCaseFiling, CreditCaseFilingParam } from './model';
@@ -8,9 +10,7 @@ import type { CreditCaseFiling, CreditCaseFilingParam } from './model';
export async function pageCreditCaseFiling(params: CreditCaseFilingParam) { export async function pageCreditCaseFiling(params: CreditCaseFilingParam) {
const res = await request.get<ApiResult<PageResult<CreditCaseFiling>>>( const res = await request.get<ApiResult<PageResult<CreditCaseFiling>>>(
'/credit/credit-case-filing/page', '/credit/credit-case-filing/page',
{ { params: withCreditUserScope(params) }
params
}
); );
if (res.data.code === 0) { if (res.data.code === 0) {
return res.data.data; return res.data.data;
@@ -24,9 +24,7 @@ export async function pageCreditCaseFiling(params: CreditCaseFilingParam) {
export async function listCreditCaseFiling(params?: CreditCaseFilingParam) { export async function listCreditCaseFiling(params?: CreditCaseFilingParam) {
const res = await request.get<ApiResult<CreditCaseFiling[]>>( const res = await request.get<ApiResult<CreditCaseFiling[]>>(
'/credit/credit-case-filing', '/credit/credit-case-filing',
{ { params: withCreditUserScope(params) }
params
}
); );
if (res.data.code === 0 && res.data.data) { if (res.data.code === 0 && res.data.data) {
return res.data.data; return res.data.data;
@@ -129,3 +127,30 @@ export async function importCreditCaseFiling(file: File, companyId?: number) {
} }
return Promise.reject(new Error(res.data.message)); return Promise.reject(new Error(res.data.message));
} }
/**
* 导入历史立案信息司法大数据
*/
export async function importCreditCaseFilingHistory(
file: File,
companyId?: number
) {
const formData = new FormData();
formData.append('file', file);
if (companyId != null) {
formData.append('companyId', String(companyId));
}
const res = await request.post<ApiResult<unknown>>(
'/credit/credit-case-filing/import/history',
formData,
{
headers: {
'Content-Type': 'multipart/form-data'
}
}
);
if (res.data.code === 0) {
return res.data.message;
}
return Promise.reject(new Error(res.data.message));
}

View File

@@ -52,6 +52,8 @@ export interface CreditCaseFiling {
* 司法大数据搜索条件 * 司法大数据搜索条件
*/ */
export interface CreditCaseFilingParam extends PageParam { export interface CreditCaseFilingParam extends PageParam {
userId?: number;
id?: number; id?: number;
keywords?: string; keywords?: string;
} }

View File

@@ -1,4 +1,6 @@
import request from '@/utils/request'; import request from '@/utils/request';
import { withCreditUserScope } from '@/api/credit/utils/data-scope';
import type { ApiResult, PageResult } from '@/api'; import type { ApiResult, PageResult } from '@/api';
import type { CreditCompany, CreditCompanyParam } from './model'; import type { CreditCompany, CreditCompanyParam } from './model';
@@ -8,9 +10,7 @@ import type { CreditCompany, CreditCompanyParam } from './model';
export async function pageCreditCompany(params: CreditCompanyParam) { export async function pageCreditCompany(params: CreditCompanyParam) {
const res = await request.get<ApiResult<PageResult<CreditCompany>>>( const res = await request.get<ApiResult<PageResult<CreditCompany>>>(
'/credit/credit-company/page', '/credit/credit-company/page',
{ { params: withCreditUserScope(params) }
params
}
); );
if (res.data.code === 0) { if (res.data.code === 0) {
return res.data.data; return res.data.data;
@@ -24,9 +24,7 @@ export async function pageCreditCompany(params: CreditCompanyParam) {
export async function listCreditCompany(params?: CreditCompanyParam) { export async function listCreditCompany(params?: CreditCompanyParam) {
const res = await request.get<ApiResult<CreditCompany[]>>( const res = await request.get<ApiResult<CreditCompany[]>>(
'/credit/credit-company', '/credit/credit-company',
{ { params: withCreditUserScope(params) }
params
}
); );
if (res.data.code === 0 && res.data.data) { if (res.data.code === 0 && res.data.data) {
return res.data.data; return res.data.data;
@@ -125,15 +123,35 @@ export async function importCreditCompany(file: File) {
return Promise.reject(new Error(res.data.message)); return Promise.reject(new Error(res.data.message));
} }
/**
* 导入客户
*/
export async function importCustomer(file: File) {
const formData = new FormData();
formData.append('file', file);
formData.append('isCustomer', '1');
const res = await request.post<ApiResult<unknown>>(
'/credit/credit-company/import',
formData,
{
headers: {
'Content-Type': 'multipart/form-data'
}
}
);
if (res.data.code === 0) {
return res.data.message;
}
return Promise.reject(new Error(res.data.message));
}
/** /**
* 根据企业匹配名称查询关联信息 * 根据企业匹配名称查询关联信息
*/ */
export async function getCompanyRelatedInfo(params: CreditCompanyParam) { export async function getCompanyRelatedInfo(params: CreditCompanyParam) {
const res = await request.get<ApiResult<CreditCompany>>( const res = await request.get<ApiResult<CreditCompany>>(
'/credit/credit-company/related', '/credit/credit-company/related',
{ { params: withCreditUserScope(params) }
params
}
); );
if (res.data.code === 0 && res.data.data) { if (res.data.code === 0 && res.data.data) {
return res.data.data; return res.data.data;

View File

@@ -108,6 +108,56 @@ export interface CreditCompany {
cechnologyLevel?: string; cechnologyLevel?: string;
// 是否小微企业 // 是否小微企业
smallEnterprise?: string; smallEnterprise?: string;
// 记录数
creditAdministrativeLicense?: number;
// 记录数
creditBankruptcy?: number;
// 记录数
creditBranch?: number;
// 记录数
creditBreachOfTrust?: number;
// 记录数
creditCaseFiling?: number;
// 记录数
creditCompetitor?: number;
// 记录数
creditCourtAnnouncement?: number;
// 记录数
creditCourtSession?: number;
// 记录数
creditCustomer?: number;
// 记录数
creditDeliveryNotice?: number;
// 记录数
creditExternal?: number;
// 记录数
creditFinalVersion?: number;
// 记录数
creditGqdj?: number;
// 记录数
creditHistoricalLegalPerson?: number;
// 记录数
creditJudgmentDebtor?: number;
// 记录数
creditJudicialDocument?: number;
// 记录数
creditJudiciary?: number;
// 记录数
creditMediation?: number;
// 记录数
creditNearbyCompany?: number;
// 记录数
creditPatent?: number;
// 记录数
creditRiskRelation?: number;
// 记录数
creditSupplier?: number;
// 记录数
creditSuspectedRelationship?: number;
// 记录数
creditUser?: number;
// 记录数
creditXgxf?: number;
// 备注 // 备注
comments?: string; comments?: string;
// 是否推荐 // 是否推荐
@@ -132,6 +182,9 @@ export interface CreditCompany {
* 企业搜索条件 * 企业搜索条件
*/ */
export interface CreditCompanyParam extends PageParam { export interface CreditCompanyParam extends PageParam {
userId?: number;
type?: number;
isCustomer?: number;
id?: number; id?: number;
keywords?: string; keywords?: string;
} }

View File

@@ -1,4 +1,6 @@
import request from '@/utils/request'; import request from '@/utils/request';
import { withCreditUserScope } from '@/api/credit/utils/data-scope';
import type { ApiResult, PageResult } from '@/api'; import type { ApiResult, PageResult } from '@/api';
import type { CreditCompetitor, CreditCompetitorParam } from './model'; import type { CreditCompetitor, CreditCompetitorParam } from './model';
@@ -8,9 +10,7 @@ import type { CreditCompetitor, CreditCompetitorParam } from './model';
export async function pageCreditCompetitor(params: CreditCompetitorParam) { export async function pageCreditCompetitor(params: CreditCompetitorParam) {
const res = await request.get<ApiResult<PageResult<CreditCompetitor>>>( const res = await request.get<ApiResult<PageResult<CreditCompetitor>>>(
'/credit/credit-competitor/page', '/credit/credit-competitor/page',
{ { params: withCreditUserScope(params) }
params
}
); );
if (res.data.code === 0) { if (res.data.code === 0) {
return res.data.data; return res.data.data;
@@ -24,9 +24,7 @@ export async function pageCreditCompetitor(params: CreditCompetitorParam) {
export async function listCreditCompetitor(params?: CreditCompetitorParam) { export async function listCreditCompetitor(params?: CreditCompetitorParam) {
const res = await request.get<ApiResult<CreditCompetitor[]>>( const res = await request.get<ApiResult<CreditCompetitor[]>>(
'/credit/credit-competitor', '/credit/credit-competitor',
{ { params: withCreditUserScope(params) }
params
}
); );
if (res.data.code === 0 && res.data.data) { if (res.data.code === 0 && res.data.data) {
return res.data.data; return res.data.data;

View File

@@ -7,7 +7,7 @@ export interface CreditCompetitor {
// 序号 // 序号
id?: number; id?: number;
// 企业名称 // 企业名称
companyName?: string; name?: string;
// 法定代表人 // 法定代表人
legalRepresentative?: string; legalRepresentative?: string;
// 注册资本 // 注册资本
@@ -46,6 +46,8 @@ export interface CreditCompetitor {
* 竞争对手搜索条件 * 竞争对手搜索条件
*/ */
export interface CreditCompetitorParam extends PageParam { export interface CreditCompetitorParam extends PageParam {
userId?: number;
id?: number; id?: number;
keywords?: string; keywords?: string;
} }

View File

@@ -1,4 +1,6 @@
import request from '@/utils/request'; import request from '@/utils/request';
import { withCreditUserScope } from '@/api/credit/utils/data-scope';
import type { ApiResult, PageResult } from '@/api'; import type { ApiResult, PageResult } from '@/api';
import type { import type {
CreditCourtAnnouncement, CreditCourtAnnouncement,
@@ -13,9 +15,7 @@ export async function pageCreditCourtAnnouncement(
) { ) {
const res = await request.get<ApiResult<PageResult<CreditCourtAnnouncement>>>( const res = await request.get<ApiResult<PageResult<CreditCourtAnnouncement>>>(
'/credit/credit-court-announcement/page', '/credit/credit-court-announcement/page',
{ { params: withCreditUserScope(params) }
params
}
); );
if (res.data.code === 0) { if (res.data.code === 0) {
return res.data.data; return res.data.data;
@@ -31,9 +31,7 @@ export async function listCreditCourtAnnouncement(
) { ) {
const res = await request.get<ApiResult<CreditCourtAnnouncement[]>>( const res = await request.get<ApiResult<CreditCourtAnnouncement[]>>(
'/credit/credit-court-announcement', '/credit/credit-court-announcement',
{ { params: withCreditUserScope(params) }
params
}
); );
if (res.data.code === 0 && res.data.data) { if (res.data.code === 0 && res.data.data) {
return res.data.data; return res.data.data;
@@ -143,3 +141,30 @@ export async function importCreditCourtAnnouncement(
} }
return Promise.reject(new Error(res.data.message)); return Promise.reject(new Error(res.data.message));
} }
/**
* 导入历史开庭公告
*/
export async function importCreditCourtAnnouncementHistory(
file: File,
companyId?: number
) {
const formData = new FormData();
formData.append('file', file);
if (companyId != null) {
formData.append('companyId', String(companyId));
}
const res = await request.post<ApiResult<unknown>>(
'/credit/credit-court-announcement/import/history',
formData,
{
headers: {
'Content-Type': 'multipart/form-data'
}
}
);
if (res.data.code === 0) {
return res.data.message;
}
return Promise.reject(new Error(res.data.message));
}

View File

@@ -52,6 +52,8 @@ export interface CreditCourtAnnouncement {
* 法院公告司法大数据搜索条件 * 法院公告司法大数据搜索条件
*/ */
export interface CreditCourtAnnouncementParam extends PageParam { export interface CreditCourtAnnouncementParam extends PageParam {
userId?: number;
id?: number; id?: number;
keywords?: string; keywords?: string;
} }

View File

@@ -1,4 +1,6 @@
import request from '@/utils/request'; import request from '@/utils/request';
import { withCreditUserScope } from '@/api/credit/utils/data-scope';
import type { ApiResult, PageResult } from '@/api'; import type { ApiResult, PageResult } from '@/api';
import type { CreditCourtSession, CreditCourtSessionParam } from './model'; import type { CreditCourtSession, CreditCourtSessionParam } from './model';
@@ -8,9 +10,7 @@ import type { CreditCourtSession, CreditCourtSessionParam } from './model';
export async function pageCreditCourtSession(params: CreditCourtSessionParam) { export async function pageCreditCourtSession(params: CreditCourtSessionParam) {
const res = await request.get<ApiResult<PageResult<CreditCourtSession>>>( const res = await request.get<ApiResult<PageResult<CreditCourtSession>>>(
'/credit/credit-court-session/page', '/credit/credit-court-session/page',
{ { params: withCreditUserScope(params) }
params
}
); );
if (res.data.code === 0) { if (res.data.code === 0) {
return res.data.data; return res.data.data;
@@ -24,9 +24,7 @@ export async function pageCreditCourtSession(params: CreditCourtSessionParam) {
export async function listCreditCourtSession(params?: CreditCourtSessionParam) { export async function listCreditCourtSession(params?: CreditCourtSessionParam) {
const res = await request.get<ApiResult<CreditCourtSession[]>>( const res = await request.get<ApiResult<CreditCourtSession[]>>(
'/credit/credit-court-session', '/credit/credit-court-session',
{ { params: withCreditUserScope(params) }
params
}
); );
if (res.data.code === 0 && res.data.data) { if (res.data.code === 0 && res.data.data) {
return res.data.data; return res.data.data;
@@ -129,3 +127,30 @@ export async function importCreditCourtSession(file: File, companyId?: number) {
} }
return Promise.reject(new Error(res.data.message)); return Promise.reject(new Error(res.data.message));
} }
/**
* 导入历史开庭公告司法大数据
*/
export async function importCreditCourtSessionHistory(
file: File,
companyId?: number
) {
const formData = new FormData();
formData.append('file', file);
if (companyId != null) {
formData.append('companyId', String(companyId));
}
const res = await request.post<ApiResult<unknown>>(
'/credit/credit-court-session/import/history',
formData,
{
headers: {
'Content-Type': 'multipart/form-data'
}
}
);
if (res.data.code === 0) {
return res.data.message;
}
return Promise.reject(new Error(res.data.message));
}

View File

@@ -6,28 +6,28 @@ import type { PageParam } from '@/api';
export interface CreditCourtSession { export interface CreditCourtSession {
// ID // ID
id?: number; id?: number;
// 数据类型
dataType?: string;
// 原告/上诉人
plaintiffAppellant?: string;
// 被告/被上诉人
appellee?: string;
// 链接地址
url?: string;
// 其他当事人/第三人
otherPartiesThirdParty?: string;
// 发生时间
occurrenceTime?: string;
// 案号 // 案号
caseNumber?: string; caseNumber?: string;
// 案由 // 案由
causeOfAction?: string; causeOfAction?: string;
// 涉案金额 // 其他当事人/第三人
involvedAmount?: string; otherPartiesThirdParty?: string;
// 法院 // 法院
courtName?: string; courtName?: string;
// 发生时间
occurrenceTime?: string;
// 数据类型
// dataType?: string;
// 原告/上诉人
// plaintiffAppellant?: string;
// 被告/被上诉人
// appellee?: string;
// 链接地址
url?: string;
// 涉案金额
// involvedAmount?: string;
// 数据状态 // 数据状态
dataStatus?: string; // dataStatus?: string;
// 备注 // 备注
comments?: string; comments?: string;
// 是否推荐 // 是否推荐
@@ -52,6 +52,8 @@ export interface CreditCourtSession {
* 开庭公告司法大数据搜索条件 * 开庭公告司法大数据搜索条件
*/ */
export interface CreditCourtSessionParam extends PageParam { export interface CreditCourtSessionParam extends PageParam {
userId?: number;
id?: number; id?: number;
keywords?: string; keywords?: string;
} }

View File

@@ -1,4 +1,6 @@
import request from '@/utils/request'; import request from '@/utils/request';
import { withCreditUserScope } from '@/api/credit/utils/data-scope';
import type { ApiResult, PageResult } from '@/api'; import type { ApiResult, PageResult } from '@/api';
import type { CreditCustomer, CreditCustomerParam } from './model'; import type { CreditCustomer, CreditCustomerParam } from './model';
@@ -8,9 +10,7 @@ import type { CreditCustomer, CreditCustomerParam } from './model';
export async function pageCreditCustomer(params: CreditCustomerParam) { export async function pageCreditCustomer(params: CreditCustomerParam) {
const res = await request.get<ApiResult<PageResult<CreditCustomer>>>( const res = await request.get<ApiResult<PageResult<CreditCustomer>>>(
'/credit/credit-customer/page', '/credit/credit-customer/page',
{ { params: withCreditUserScope(params) }
params
}
); );
if (res.data.code === 0) { if (res.data.code === 0) {
return res.data.data; return res.data.data;
@@ -24,9 +24,7 @@ export async function pageCreditCustomer(params: CreditCustomerParam) {
export async function listCreditCustomer(params?: CreditCustomerParam) { export async function listCreditCustomer(params?: CreditCustomerParam) {
const res = await request.get<ApiResult<CreditCustomer[]>>( const res = await request.get<ApiResult<CreditCustomer[]>>(
'/credit/credit-customer', '/credit/credit-customer',
{ { params: withCreditUserScope(params) }
params
}
); );
if (res.data.code === 0 && res.data.data) { if (res.data.code === 0 && res.data.data) {
return res.data.data; return res.data.data;

View File

@@ -42,6 +42,8 @@ export interface CreditCustomer {
* 客户搜索条件 * 客户搜索条件
*/ */
export interface CreditCustomerParam extends PageParam { export interface CreditCustomerParam extends PageParam {
userId?: number;
id?: number; id?: number;
keywords?: string; keywords?: string;
} }

View File

@@ -1,4 +1,6 @@
import request from '@/utils/request'; import request from '@/utils/request';
import { withCreditUserScope } from '@/api/credit/utils/data-scope';
import type { ApiResult, PageResult } from '@/api'; import type { ApiResult, PageResult } from '@/api';
import type { CreditDeliveryNotice, CreditDeliveryNoticeParam } from './model'; import type { CreditDeliveryNotice, CreditDeliveryNoticeParam } from './model';
@@ -10,9 +12,7 @@ export async function pageCreditDeliveryNotice(
) { ) {
const res = await request.get<ApiResult<PageResult<CreditDeliveryNotice>>>( const res = await request.get<ApiResult<PageResult<CreditDeliveryNotice>>>(
'/credit/credit-delivery-notice/page', '/credit/credit-delivery-notice/page',
{ { params: withCreditUserScope(params) }
params
}
); );
if (res.data.code === 0) { if (res.data.code === 0) {
return res.data.data; return res.data.data;
@@ -28,9 +28,7 @@ export async function listCreditDeliveryNotice(
) { ) {
const res = await request.get<ApiResult<CreditDeliveryNotice[]>>( const res = await request.get<ApiResult<CreditDeliveryNotice[]>>(
'/credit/credit-delivery-notice', '/credit/credit-delivery-notice',
{ { params: withCreditUserScope(params) }
params
}
); );
if (res.data.code === 0 && res.data.data) { if (res.data.code === 0 && res.data.data) {
return res.data.data; return res.data.data;
@@ -136,3 +134,30 @@ export async function importCreditDeliveryNotice(
} }
return Promise.reject(new Error(res.data.message)); return Promise.reject(new Error(res.data.message));
} }
/**
* 导入历史送达公告司法大数据
*/
export async function importCreditDeliveryNoticeHistory(
file: File,
companyId?: number
) {
const formData = new FormData();
formData.append('file', file);
if (companyId != null) {
formData.append('companyId', String(companyId));
}
const res = await request.post<ApiResult<unknown>>(
'/credit/credit-delivery-notice/import/history',
formData,
{
headers: {
'Content-Type': 'multipart/form-data'
}
}
);
if (res.data.code === 0) {
return res.data.message;
}
return Promise.reject(new Error(res.data.message));
}

View File

@@ -52,6 +52,8 @@ export interface CreditDeliveryNotice {
* 送达公告司法大数据搜索条件 * 送达公告司法大数据搜索条件
*/ */
export interface CreditDeliveryNoticeParam extends PageParam { export interface CreditDeliveryNoticeParam extends PageParam {
userId?: number;
id?: number; id?: number;
keywords?: string; keywords?: string;
} }

View File

@@ -1,4 +1,6 @@
import request from '@/utils/request'; import request from '@/utils/request';
import { withCreditUserScope } from '@/api/credit/utils/data-scope';
import type { ApiResult, PageResult } from '@/api'; import type { ApiResult, PageResult } from '@/api';
import type { CreditExternal, CreditExternalParam } from './model'; import type { CreditExternal, CreditExternalParam } from './model';
@@ -8,9 +10,7 @@ import type { CreditExternal, CreditExternalParam } from './model';
export async function pageCreditExternal(params: CreditExternalParam) { export async function pageCreditExternal(params: CreditExternalParam) {
const res = await request.get<ApiResult<PageResult<CreditExternal>>>( const res = await request.get<ApiResult<PageResult<CreditExternal>>>(
'/credit/credit-external/page', '/credit/credit-external/page',
{ { params: withCreditUserScope(params) }
params
}
); );
if (res.data.code === 0) { if (res.data.code === 0) {
return res.data.data; return res.data.data;
@@ -24,9 +24,7 @@ export async function pageCreditExternal(params: CreditExternalParam) {
export async function listCreditExternal(params?: CreditExternalParam) { export async function listCreditExternal(params?: CreditExternalParam) {
const res = await request.get<ApiResult<CreditExternal[]>>( const res = await request.get<ApiResult<CreditExternal[]>>(
'/credit/credit-external', '/credit/credit-external',
{ { params: withCreditUserScope(params) }
params
}
); );
if (res.data.code === 0 && res.data.data) { if (res.data.code === 0 && res.data.data) {
return res.data.data; return res.data.data;

View File

@@ -60,6 +60,8 @@ export interface CreditExternal {
* 对外投资搜索条件 * 对外投资搜索条件
*/ */
export interface CreditExternalParam extends PageParam { export interface CreditExternalParam extends PageParam {
userId?: number;
id?: number; id?: number;
keywords?: string; keywords?: string;
} }

View File

@@ -1,4 +1,6 @@
import request from '@/utils/request'; import request from '@/utils/request';
import { withCreditUserScope } from '@/api/credit/utils/data-scope';
import type { ApiResult, PageResult } from '@/api'; import type { ApiResult, PageResult } from '@/api';
import type { CreditFinalVersion, CreditFinalVersionParam } from './model'; import type { CreditFinalVersion, CreditFinalVersionParam } from './model';
@@ -8,9 +10,7 @@ import type { CreditFinalVersion, CreditFinalVersionParam } from './model';
export async function pageCreditFinalVersion(params: CreditFinalVersionParam) { export async function pageCreditFinalVersion(params: CreditFinalVersionParam) {
const res = await request.get<ApiResult<PageResult<CreditFinalVersion>>>( const res = await request.get<ApiResult<PageResult<CreditFinalVersion>>>(
'/credit/credit-final-version/page', '/credit/credit-final-version/page',
{ { params: withCreditUserScope(params) }
params
}
); );
if (res.data.code === 0) { if (res.data.code === 0) {
return res.data.data; return res.data.data;
@@ -24,9 +24,7 @@ export async function pageCreditFinalVersion(params: CreditFinalVersionParam) {
export async function listCreditFinalVersion(params?: CreditFinalVersionParam) { export async function listCreditFinalVersion(params?: CreditFinalVersionParam) {
const res = await request.get<ApiResult<CreditFinalVersion[]>>( const res = await request.get<ApiResult<CreditFinalVersion[]>>(
'/credit/credit-final-version', '/credit/credit-final-version',
{ { params: withCreditUserScope(params) }
params
}
); );
if (res.data.code === 0 && res.data.data) { if (res.data.code === 0 && res.data.data) {
return res.data.data; return res.data.data;
@@ -129,3 +127,30 @@ export async function importCreditFinalVersion(file: File, companyId?: number) {
} }
return Promise.reject(new Error(res.data.message)); return Promise.reject(new Error(res.data.message));
} }
/**
* 导入历史终本案件
*/
export async function importCreditFinalVersionHistory(
file: File,
companyId?: number
) {
const formData = new FormData();
formData.append('file', file);
if (companyId != null) {
formData.append('companyId', String(companyId));
}
const res = await request.post<ApiResult<unknown>>(
'/credit/credit-final-version/import/history',
formData,
{
headers: {
'Content-Type': 'multipart/form-data'
}
}
);
if (res.data.code === 0) {
return res.data.message;
}
return Promise.reject(new Error(res.data.message));
}

View File

@@ -6,28 +6,17 @@ import type { PageParam } from '@/api';
export interface CreditFinalVersion { export interface CreditFinalVersion {
// ID // ID
id?: number; id?: number;
// 数据类型
dataType?: string;
// 原告/上诉人
plaintiffAppellant?: string;
// 被告/被上诉人
appellee?: string;
// 链接地址
url?: string;
// 其他当事人/第三人
otherPartiesThirdParty?: string;
// 发生时间
occurrenceTime?: string;
// 案号 // 案号
caseNumber?: string; caseNumber?: string;
// 案由 appellee?: string;
causeOfAction?: string; plaintiffAppellant?: string;
// 涉案金额 unfulfilledAmount?: string;
involvedAmount?: string; involvedAmount?: string;
// 法院
courtName?: string; courtName?: string;
// 数据状态 occurrenceTime?: string;
dataStatus?: string; finalDate?: string;
// 链接地址
url?: string;
// 备注 // 备注
comments?: string; comments?: string;
// 是否推荐 // 是否推荐
@@ -52,6 +41,8 @@ export interface CreditFinalVersion {
* 终本案件搜索条件 * 终本案件搜索条件
*/ */
export interface CreditFinalVersionParam extends PageParam { export interface CreditFinalVersionParam extends PageParam {
userId?: number;
id?: number; id?: number;
keywords?: string; keywords?: string;
} }

View File

@@ -1,4 +1,6 @@
import request from '@/utils/request'; import request from '@/utils/request';
import { withCreditUserScope } from '@/api/credit/utils/data-scope';
import type { ApiResult, PageResult } from '@/api'; import type { ApiResult, PageResult } from '@/api';
import type { CreditGqdj, CreditGqdjParam } from './model'; import type { CreditGqdj, CreditGqdjParam } from './model';
@@ -8,9 +10,7 @@ import type { CreditGqdj, CreditGqdjParam } from './model';
export async function pageCreditGqdj(params: CreditGqdjParam) { export async function pageCreditGqdj(params: CreditGqdjParam) {
const res = await request.get<ApiResult<PageResult<CreditGqdj>>>( const res = await request.get<ApiResult<PageResult<CreditGqdj>>>(
'/credit/credit-gqdj/page', '/credit/credit-gqdj/page',
{ { params: withCreditUserScope(params) }
params
}
); );
if (res.data.code === 0) { if (res.data.code === 0) {
return res.data.data; return res.data.data;
@@ -24,9 +24,7 @@ export async function pageCreditGqdj(params: CreditGqdjParam) {
export async function listCreditGqdj(params?: CreditGqdjParam) { export async function listCreditGqdj(params?: CreditGqdjParam) {
const res = await request.get<ApiResult<CreditGqdj[]>>( const res = await request.get<ApiResult<CreditGqdj[]>>(
'/credit/credit-gqdj', '/credit/credit-gqdj',
{ { params: withCreditUserScope(params) }
params
}
); );
if (res.data.code === 0 && res.data.data) { if (res.data.code === 0 && res.data.data) {
return res.data.data; return res.data.data;
@@ -127,3 +125,27 @@ export async function importCreditGqdj(file: File, companyId?: number) {
} }
return Promise.reject(new Error(res.data.message)); return Promise.reject(new Error(res.data.message));
} }
/**
* 导入历史股权冻结
*/
export async function importCreditGqdjHistory(file: File, companyId?: number) {
const formData = new FormData();
formData.append('file', file);
if (companyId != null) {
formData.append('companyId', String(companyId));
}
const res = await request.post<ApiResult<unknown>>(
'/credit/credit-gqdj/import/history',
formData,
{
headers: {
'Content-Type': 'multipart/form-data'
}
}
);
if (res.data.code === 0) {
return res.data.message;
}
return Promise.reject(new Error(res.data.message));
}

View File

@@ -6,28 +6,34 @@ import type { PageParam } from '@/api';
export interface CreditGqdj { export interface CreditGqdj {
// ID // ID
id?: number; id?: number;
// 数据类型 // 执行通知文书号
dataType?: string; caseNumber?: string;
// 原告/上诉 // 被执行
plaintiffAppellant?: string;
// 被告/被上诉人
appellee?: string; appellee?: string;
// 冻结股权标的企业
plaintiffAppellant?: string;
// 被执行人持有股权、其他投资权益数额
involvedAmount?: string;
// 执行法院
courtName?: string;
// 类型
dataType?: string;
// 状态
dataStatus?: string;
// 冻结日期自
freezeDateStart?: string;
// 冻结日期至
freezeDateEnd?: string;
// 公示日期
publicDate?: string;
// 链接地址 // 链接地址
url?: string; url?: string;
// 其他当事人/第三人 // 其他当事人/第三人
otherPartiesThirdParty?: string; otherPartiesThirdParty?: string;
// 发生时间 // 发生时间
occurrenceTime?: string; occurrenceTime?: string;
// 案号
caseNumber?: string;
// 案由 // 案由
causeOfAction?: string; causeOfAction?: string;
// 涉案金额
involvedAmount?: string;
// 法院
courtName?: string;
// 数据状态
dataStatus?: string;
// 备注 // 备注
comments?: string; comments?: string;
// 是否推荐 // 是否推荐
@@ -52,6 +58,8 @@ export interface CreditGqdj {
* 股权冻结搜索条件 * 股权冻结搜索条件
*/ */
export interface CreditGqdjParam extends PageParam { export interface CreditGqdjParam extends PageParam {
userId?: number;
id?: number; id?: number;
keywords?: string; keywords?: string;
} }

View File

@@ -1,4 +1,6 @@
import request from '@/utils/request'; import request from '@/utils/request';
import { withCreditUserScope } from '@/api/credit/utils/data-scope';
import type { ApiResult, PageResult } from '@/api'; import type { ApiResult, PageResult } from '@/api';
import type { import type {
CreditHistoricalLegalPerson, CreditHistoricalLegalPerson,
@@ -14,7 +16,7 @@ export async function pageCreditHistoricalLegalPerson(
const res = await request.get< const res = await request.get<
ApiResult<PageResult<CreditHistoricalLegalPerson>> ApiResult<PageResult<CreditHistoricalLegalPerson>>
>('/credit/credit-historical-legal-person/page', { >('/credit/credit-historical-legal-person/page', {
params params: withCreditUserScope(params)
}); });
if (res.data.code === 0) { if (res.data.code === 0) {
return res.data.data; return res.data.data;
@@ -30,9 +32,7 @@ export async function listCreditHistoricalLegalPerson(
) { ) {
const res = await request.get<ApiResult<CreditHistoricalLegalPerson[]>>( const res = await request.get<ApiResult<CreditHistoricalLegalPerson[]>>(
'/credit/credit-historical-legal-person', '/credit/credit-historical-legal-person',
{ { params: withCreditUserScope(params) }
params
}
); );
if (res.data.code === 0 && res.data.data) { if (res.data.code === 0 && res.data.data) {
return res.data.data; return res.data.data;

View File

@@ -40,6 +40,8 @@ export interface CreditHistoricalLegalPerson {
* 历史法定代表人搜索条件 * 历史法定代表人搜索条件
*/ */
export interface CreditHistoricalLegalPersonParam extends PageParam { export interface CreditHistoricalLegalPersonParam extends PageParam {
userId?: number;
id?: number; id?: number;
keywords?: string; keywords?: string;
} }

View File

@@ -1,4 +1,6 @@
import request from '@/utils/request'; import request from '@/utils/request';
import { withCreditUserScope } from '@/api/credit/utils/data-scope';
import type { ApiResult, PageResult } from '@/api'; import type { ApiResult, PageResult } from '@/api';
import type { CreditJudgmentDebtor, CreditJudgmentDebtorParam } from './model'; import type { CreditJudgmentDebtor, CreditJudgmentDebtorParam } from './model';
@@ -10,9 +12,7 @@ export async function pageCreditJudgmentDebtor(
) { ) {
const res = await request.get<ApiResult<PageResult<CreditJudgmentDebtor>>>( const res = await request.get<ApiResult<PageResult<CreditJudgmentDebtor>>>(
'/credit/credit-judgment-debtor/page', '/credit/credit-judgment-debtor/page',
{ { params: withCreditUserScope(params) }
params
}
); );
if (res.data.code === 0) { if (res.data.code === 0) {
return res.data.data; return res.data.data;
@@ -28,9 +28,7 @@ export async function listCreditJudgmentDebtor(
) { ) {
const res = await request.get<ApiResult<CreditJudgmentDebtor[]>>( const res = await request.get<ApiResult<CreditJudgmentDebtor[]>>(
'/credit/credit-judgment-debtor', '/credit/credit-judgment-debtor',
{ { params: withCreditUserScope(params) }
params
}
); );
if (res.data.code === 0 && res.data.data) { if (res.data.code === 0 && res.data.data) {
return res.data.data; return res.data.data;
@@ -136,3 +134,52 @@ export async function importCreditJudgmentDebtor(
} }
return Promise.reject(new Error(res.data.message)); return Promise.reject(new Error(res.data.message));
} }
/**
* 导入历史被执行人
*/
export async function importCreditJudgmentDebtorHistory(
file: File,
companyId?: number
) {
const formData = new FormData();
formData.append('file', file);
if (companyId != null) {
formData.append('companyId', String(companyId));
}
const res = await request.post<ApiResult<unknown>>(
'/credit/credit-judgment-debtor/import/history',
formData,
{
headers: {
'Content-Type': 'multipart/form-data'
}
}
);
if (res.data.code === 0) {
return res.data.message;
}
return Promise.reject(new Error(res.data.message));
}
/**
* 修正被执行人主体企业归属(按企业名称匹配回填 companyId
*
* 后端: POST /api/credit/credit-judgment-debtor/company-id/refresh
* - onlyNull: 默认 true仅更新 companyId 为空的数据
* - limit: 可选,限制处理条数
*/
export async function refreshCreditJudgmentDebtorCompanyId(params?: {
onlyNull?: boolean;
limit?: number;
}) {
const res = await request.post<ApiResult<unknown>>(
'/credit/credit-judgment-debtor/company-id/refresh',
undefined,
{ params: withCreditUserScope(params) }
);
if (res.data.code === 0) {
return res.data.message;
}
return Promise.reject(new Error(res.data.message));
}

View File

@@ -8,7 +8,7 @@ export interface CreditJudgmentDebtor {
id?: number; id?: number;
// 案号 // 案号
caseNumber?: string; caseNumber?: string;
// 被执行人名称 //
name?: string; name?: string;
// 证件号/组织机构代码 // 证件号/组织机构代码
code?: string; code?: string;
@@ -34,6 +34,8 @@ export interface CreditJudgmentDebtor {
deleted?: number; deleted?: number;
// 用户ID // 用户ID
userId?: number; userId?: number;
// 真实姓名
realName?: string;
// 租户id // 租户id
tenantId?: number; tenantId?: number;
// 创建时间 // 创建时间
@@ -42,12 +44,22 @@ export interface CreditJudgmentDebtor {
updateTime?: string; updateTime?: string;
// 历史ID // 历史ID
historyId?: number; historyId?: number;
// 原告/上诉人
plaintiffAppellant?: string;
// 被告/被上诉人
appellee?: string;
// 其他当事人/第三人
otherPartiesThirdParty?: string;
// 被执行人名称
name1?: string;
} }
/** /**
* 被执行人搜索条件 * 被执行人搜索条件
*/ */
export interface CreditJudgmentDebtorParam extends PageParam { export interface CreditJudgmentDebtorParam extends PageParam {
userId?: number;
id?: number; id?: number;
keywords?: string; keywords?: string;
} }

View File

@@ -1,144 +0,0 @@
import request from '@/utils/request';
import type { ApiResult, PageResult } from '@/api';
import type {
CreditJudgmentDebtorHistory,
CreditJudgmentDebtorHistoryParam
} from './model';
/**
* 分页查询被执行人
*/
export async function pageCreditJudgmentDebtorHistory(
params: CreditJudgmentDebtorHistoryParam
) {
const res = await request.get<
ApiResult<PageResult<CreditJudgmentDebtorHistory>>
>('/credit/credit-judgment-debtor-history/page', {
params
});
if (res.data.code === 0) {
return res.data.data;
}
return Promise.reject(new Error(res.data.message));
}
/**
* 查询被执行人列表
*/
export async function listCreditJudgmentDebtorHistory(
params?: CreditJudgmentDebtorHistoryParam
) {
const res = await request.get<ApiResult<CreditJudgmentDebtorHistory[]>>(
'/credit/credit-judgment-debtor-history',
{
params
}
);
if (res.data.code === 0 && res.data.data) {
return res.data.data;
}
return Promise.reject(new Error(res.data.message));
}
/**
* 添加被执行人
*/
export async function addCreditJudgmentDebtorHistory(
data: CreditJudgmentDebtorHistory
) {
const res = await request.post<ApiResult<unknown>>(
'/credit/credit-judgment-debtor-history',
data
);
if (res.data.code === 0) {
return res.data.message;
}
return Promise.reject(new Error(res.data.message));
}
/**
* 修改被执行人
*/
export async function updateCreditJudgmentDebtorHistory(
data: CreditJudgmentDebtorHistory
) {
const res = await request.put<ApiResult<unknown>>(
'/credit/credit-judgment-debtor-history',
data
);
if (res.data.code === 0) {
return res.data.message;
}
return Promise.reject(new Error(res.data.message));
}
/**
* 删除被执行人
*/
export async function removeCreditJudgmentDebtorHistory(id?: number) {
const res = await request.delete<ApiResult<unknown>>(
'/credit/credit-judgment-debtor-history/' + id
);
if (res.data.code === 0) {
return res.data.message;
}
return Promise.reject(new Error(res.data.message));
}
/**
* 批量删除被执行人
*/
export async function removeBatchCreditJudgmentDebtorHistory(
data: (number | undefined)[]
) {
const res = await request.delete<ApiResult<unknown>>(
'/credit/credit-judgment-debtor-history/batch',
{
data
}
);
if (res.data.code === 0) {
return res.data.message;
}
return Promise.reject(new Error(res.data.message));
}
/**
* 根据id查询被执行人
*/
export async function getCreditJudgmentDebtorHistory(id: number) {
const res = await request.get<ApiResult<CreditJudgmentDebtorHistory>>(
'/credit/credit-judgment-debtor-history/' + id
);
if (res.data.code === 0 && res.data.data) {
return res.data.data;
}
return Promise.reject(new Error(res.data.message));
}
/**
* 导入历史被执行人
*/
export async function importCreditJudgmentDebtorHistory(
file: File,
companyId?: number
) {
const formData = new FormData();
formData.append('file', file);
if (companyId != null) {
formData.append('companyId', String(companyId));
}
const res = await request.post<ApiResult<unknown>>(
'/credit/credit-judgment-debtor-history/import',
formData,
{
headers: {
'Content-Type': 'multipart/form-data'
}
}
);
if (res.data.code === 0) {
return res.data.message;
}
return Promise.reject(new Error(res.data.message));
}

View File

@@ -1,57 +0,0 @@
import type { PageParam } from '@/api';
/**
* 被执行人
*/
export interface CreditJudgmentDebtorHistory {
// ID
id?: number;
// 案号
caseNumber?: string;
// 被执行人名称
name?: string;
// 被执行人
name1?: string;
// 证件号/组织机构代码
code?: string;
// 链接
url?: string;
// 是否多企业
type?: number;
// 立案日期
occurrenceTime?: string;
// 执行标的(元)
amount?: string;
// 法院
courtName?: string;
// 数据状态
dataStatus?: string;
// 企业ID
companyId?: number;
// 备注
comments?: string;
// 是否推荐
recommend?: number;
// 排序(数字越小越靠前)
sortNumber?: number;
// 状态, 0正常, 1冻结
status?: number;
// 是否删除, 0否, 1是
deleted?: number;
// 用户ID
userId?: number;
// 租户id
tenantId?: number;
// 创建时间
createTime?: string;
// 修改时间
updateTime?: string;
}
/**
* 被执行人搜索条件
*/
export interface CreditJudgmentDebtorHistoryParam extends PageParam {
id?: number;
keywords?: string;
}

View File

@@ -1,4 +1,6 @@
import request from '@/utils/request'; import request from '@/utils/request';
import { withCreditUserScope } from '@/api/credit/utils/data-scope';
import type { ApiResult, PageResult } from '@/api'; import type { ApiResult, PageResult } from '@/api';
import type { import type {
CreditJudicialDocument, CreditJudicialDocument,
@@ -13,9 +15,7 @@ export async function pageCreditJudicialDocument(
) { ) {
const res = await request.get<ApiResult<PageResult<CreditJudicialDocument>>>( const res = await request.get<ApiResult<PageResult<CreditJudicialDocument>>>(
'/credit/credit-judicial-document/page', '/credit/credit-judicial-document/page',
{ { params: withCreditUserScope(params) }
params
}
); );
if (res.data.code === 0) { if (res.data.code === 0) {
return res.data.data; return res.data.data;
@@ -31,9 +31,7 @@ export async function listCreditJudicialDocument(
) { ) {
const res = await request.get<ApiResult<CreditJudicialDocument[]>>( const res = await request.get<ApiResult<CreditJudicialDocument[]>>(
'/credit/credit-judicial-document', '/credit/credit-judicial-document',
{ { params: withCreditUserScope(params) }
params
}
); );
if (res.data.code === 0 && res.data.data) { if (res.data.code === 0 && res.data.data) {
return res.data.data; return res.data.data;
@@ -141,3 +139,30 @@ export async function importCreditJudicialDocument(
} }
return Promise.reject(new Error(res.data.message)); return Promise.reject(new Error(res.data.message));
} }
/**
* 导入历史裁判文书
*/
export async function importCreditJudicialDocumentHistory(
file: File,
companyId?: number
) {
const formData = new FormData();
formData.append('file', file);
if (companyId != null) {
formData.append('companyId', String(companyId));
}
const res = await request.post<ApiResult<unknown>>(
'/credit/credit-judicial-document/import/history',
formData,
{
headers: {
'Content-Type': 'multipart/form-data'
}
}
);
if (res.data.code === 0) {
return res.data.message;
}
return Promise.reject(new Error(res.data.message));
}

View File

@@ -6,6 +6,10 @@ import type { PageParam } from '@/api';
export interface CreditJudicialDocument { export interface CreditJudicialDocument {
// ID // ID
id?: number; id?: number;
// 文书标题
title?: string;
// 文书类型
documentType?: string;
// 数据类型 // 数据类型
dataType?: string; dataType?: string;
// 原告/上诉人 // 原告/上诉人
@@ -18,6 +22,8 @@ export interface CreditJudicialDocument {
otherPartiesThirdParty?: string; otherPartiesThirdParty?: string;
// 发生时间 // 发生时间
occurrenceTime?: string; occurrenceTime?: string;
// 发布日期
releaseDate?: string;
// 案号 // 案号
caseNumber?: string; caseNumber?: string;
// 案由 // 案由
@@ -54,6 +60,8 @@ export interface CreditJudicialDocument {
* 裁判文书司法大数据搜索条件 * 裁判文书司法大数据搜索条件
*/ */
export interface CreditJudicialDocumentParam extends PageParam { export interface CreditJudicialDocumentParam extends PageParam {
userId?: number;
id?: number; id?: number;
keywords?: string; keywords?: string;
} }

View File

@@ -1,4 +1,6 @@
import request from '@/utils/request'; import request from '@/utils/request';
import { withCreditUserScope } from '@/api/credit/utils/data-scope';
import type { ApiResult, PageResult } from '@/api'; import type { ApiResult, PageResult } from '@/api';
import type { CreditJudiciary, CreditJudiciaryParam } from './model'; import type { CreditJudiciary, CreditJudiciaryParam } from './model';
@@ -8,9 +10,7 @@ import type { CreditJudiciary, CreditJudiciaryParam } from './model';
export async function pageCreditJudiciary(params: CreditJudiciaryParam) { export async function pageCreditJudiciary(params: CreditJudiciaryParam) {
const res = await request.get<ApiResult<PageResult<CreditJudiciary>>>( const res = await request.get<ApiResult<PageResult<CreditJudiciary>>>(
'/credit/credit-judiciary/page', '/credit/credit-judiciary/page',
{ { params: withCreditUserScope(params) }
params
}
); );
if (res.data.code === 0) { if (res.data.code === 0) {
return res.data.data; return res.data.data;
@@ -24,9 +24,7 @@ export async function pageCreditJudiciary(params: CreditJudiciaryParam) {
export async function listCreditJudiciary(params?: CreditJudiciaryParam) { export async function listCreditJudiciary(params?: CreditJudiciaryParam) {
const res = await request.get<ApiResult<CreditJudiciary[]>>( const res = await request.get<ApiResult<CreditJudiciary[]>>(
'/credit/credit-judiciary', '/credit/credit-judiciary',
{ { params: withCreditUserScope(params) }
params
}
); );
if (res.data.code === 0 && res.data.data) { if (res.data.code === 0 && res.data.data) {
return res.data.data; return res.data.data;

View File

@@ -66,6 +66,8 @@ export interface CreditJudiciary {
* 司法案件搜索条件 * 司法案件搜索条件
*/ */
export interface CreditJudiciaryParam extends PageParam { export interface CreditJudiciaryParam extends PageParam {
userId?: number;
id?: number; id?: number;
keywords?: string; keywords?: string;
} }

View File

@@ -1,4 +1,6 @@
import request from '@/utils/request'; import request from '@/utils/request';
import { withCreditUserScope } from '@/api/credit/utils/data-scope';
import type { ApiResult, PageResult } from '@/api'; import type { ApiResult, PageResult } from '@/api';
import type { CreditMediation, CreditMediationParam } from './model'; import type { CreditMediation, CreditMediationParam } from './model';
@@ -8,9 +10,7 @@ import type { CreditMediation, CreditMediationParam } from './model';
export async function pageCreditMediation(params: CreditMediationParam) { export async function pageCreditMediation(params: CreditMediationParam) {
const res = await request.get<ApiResult<PageResult<CreditMediation>>>( const res = await request.get<ApiResult<PageResult<CreditMediation>>>(
'/credit/credit-mediation/page', '/credit/credit-mediation/page',
{ { params: withCreditUserScope(params) }
params
}
); );
if (res.data.code === 0) { if (res.data.code === 0) {
return res.data.data; return res.data.data;
@@ -24,9 +24,7 @@ export async function pageCreditMediation(params: CreditMediationParam) {
export async function listCreditMediation(params?: CreditMediationParam) { export async function listCreditMediation(params?: CreditMediationParam) {
const res = await request.get<ApiResult<CreditMediation[]>>( const res = await request.get<ApiResult<CreditMediation[]>>(
'/credit/credit-mediation', '/credit/credit-mediation',
{ { params: withCreditUserScope(params) }
params
}
); );
if (res.data.code === 0 && res.data.data) { if (res.data.code === 0 && res.data.data) {
return res.data.data; return res.data.data;
@@ -127,3 +125,30 @@ export async function importCreditMediation(file: File, companyId?: number) {
} }
return Promise.reject(new Error(res.data.message)); return Promise.reject(new Error(res.data.message));
} }
/**
* 导入历史诉前调解司法大数据
*/
export async function importCreditMediationHistory(
file: File,
companyId?: number
) {
const formData = new FormData();
formData.append('file', file);
if (companyId != null) {
formData.append('companyId', String(companyId));
}
const res = await request.post<ApiResult<unknown>>(
'/credit/credit-mediation/import/history',
formData,
{
headers: {
'Content-Type': 'multipart/form-data'
}
}
);
if (res.data.code === 0) {
return res.data.message;
}
return Promise.reject(new Error(res.data.message));
}

View File

@@ -52,6 +52,8 @@ export interface CreditMediation {
* 诉前调解司法大数据搜索条件 * 诉前调解司法大数据搜索条件
*/ */
export interface CreditMediationParam extends PageParam { export interface CreditMediationParam extends PageParam {
userId?: number;
id?: number; id?: number;
keywords?: string; keywords?: string;
} }

View File

@@ -0,0 +1,105 @@
import request from '@/utils/request';
import type { ApiResult, PageResult } from '@/api';
import type { CreditMpCustomer, CreditMpCustomerParam } from './model';
/**
* 分页查询小程序端客户
*/
export async function pageCreditMpCustomer(params: CreditMpCustomerParam) {
const res = await request.get<ApiResult<PageResult<CreditMpCustomer>>>(
'/credit/credit-mp-customer/page',
{
params
}
);
if (res.data.code === 0) {
return res.data.data;
}
return Promise.reject(new Error(res.data.message));
}
/**
* 查询小程序端客户列表
*/
export async function listCreditMpCustomer(params?: CreditMpCustomerParam) {
const res = await request.get<ApiResult<CreditMpCustomer[]>>(
'/credit/credit-mp-customer',
{
params
}
);
if (res.data.code === 0 && res.data.data) {
return res.data.data;
}
return Promise.reject(new Error(res.data.message));
}
/**
* 添加小程序端客户
*/
export async function addCreditMpCustomer(data: CreditMpCustomer) {
const res = await request.post<ApiResult<unknown>>(
'/credit/credit-mp-customer',
data
);
if (res.data.code === 0) {
return res.data.message;
}
return Promise.reject(new Error(res.data.message));
}
/**
* 修改小程序端客户
*/
export async function updateCreditMpCustomer(data: CreditMpCustomer) {
const res = await request.put<ApiResult<unknown>>(
'/credit/credit-mp-customer',
data
);
if (res.data.code === 0) {
return res.data.message;
}
return Promise.reject(new Error(res.data.message));
}
/**
* 删除小程序端客户
*/
export async function removeCreditMpCustomer(id?: number) {
const res = await request.delete<ApiResult<unknown>>(
'/credit/credit-mp-customer/' + id
);
if (res.data.code === 0) {
return res.data.message;
}
return Promise.reject(new Error(res.data.message));
}
/**
* 批量删除小程序端客户
*/
export async function removeBatchCreditMpCustomer(data: (number | undefined)[]) {
const res = await request.delete<ApiResult<unknown>>(
'/credit/credit-mp-customer/batch',
{
data
}
);
if (res.data.code === 0) {
return res.data.message;
}
return Promise.reject(new Error(res.data.message));
}
/**
* 根据id查询小程序端客户
*/
export async function getCreditMpCustomer(id: number) {
const res = await request.get<ApiResult<CreditMpCustomer>>(
'/credit/credit-mp-customer/' + id
);
if (res.data.code === 0 && res.data.data) {
return res.data.data;
}
return Promise.reject(new Error(res.data.message));
}

View File

@@ -0,0 +1,66 @@
import type { PageParam } from '@/api';
/**
* 小程序端客户
*/
export interface CreditMpCustomer {
// ID
id?: number;
// 拖欠方
toUser?: string;
// 拖欠金额
price?: string;
// 拖欠年数
years?: string;
// 链接
url?: string;
// 状态
statusTxt?: string;
// 企业ID
companyId?: number;
// 所在省份
province?: string;
// 所在城市
city?: string;
// 所在辖区
region?: string;
// 文件路径
files?: string;
// 步骤, 0未受理1已受理2材料提交3合同签订4执行回款5完结
step?: number;
// 是否有数据
hasData?: string;
// 备注
comments?: string;
// 是否推荐
recommend?: number;
// 排序(数字越小越靠前)
sortNumber?: number;
// 状态, 0正常, 1冻结
status?: number;
// 是否删除, 0否, 1是
deleted?: number;
// 用户ID
userId?: number;
// 昵称
nickname?: string;
// 头像
avatar?: string;
// 手机号
phone?: string;
// 租户id
tenantId?: number;
// 创建时间
createTime?: string;
// 修改时间
updateTime?: string;
}
/**
* 小程序端客户搜索条件
*/
export interface CreditMpCustomerParam extends PageParam {
id?: number;
keywords?: string;
step?: number;
}

View File

@@ -1,4 +1,6 @@
import request from '@/utils/request'; import request from '@/utils/request';
import { withCreditUserScope } from '@/api/credit/utils/data-scope';
import type { ApiResult, PageResult } from '@/api'; import type { ApiResult, PageResult } from '@/api';
import type { CreditNearbyCompany, CreditNearbyCompanyParam } from './model'; import type { CreditNearbyCompany, CreditNearbyCompanyParam } from './model';
@@ -10,9 +12,7 @@ export async function pageCreditNearbyCompany(
) { ) {
const res = await request.get<ApiResult<PageResult<CreditNearbyCompany>>>( const res = await request.get<ApiResult<PageResult<CreditNearbyCompany>>>(
'/credit/credit-nearby-company/page', '/credit/credit-nearby-company/page',
{ { params: withCreditUserScope(params) }
params
}
); );
if (res.data.code === 0) { if (res.data.code === 0) {
return res.data.data; return res.data.data;
@@ -28,9 +28,7 @@ export async function listCreditNearbyCompany(
) { ) {
const res = await request.get<ApiResult<CreditNearbyCompany[]>>( const res = await request.get<ApiResult<CreditNearbyCompany[]>>(
'/credit/credit-nearby-company', '/credit/credit-nearby-company',
{ { params: withCreditUserScope(params) }
params
}
); );
if (res.data.code === 0 && res.data.data) { if (res.data.code === 0 && res.data.data) {
return res.data.data; return res.data.data;
@@ -117,11 +115,7 @@ export async function importCreditNearbyCompany(
file: File, file: File,
companyId?: number companyId?: number
) { ) {
const formData = new FormData(); const formData = buildImportFormData(file, companyId);
formData.append('file', file);
if (companyId != null) {
formData.append('companyId', String(companyId));
}
const res = await request.post<ApiResult<unknown>>( const res = await request.post<ApiResult<unknown>>(
'/credit/credit-nearby-company/import', '/credit/credit-nearby-company/import',
formData, formData,
@@ -136,3 +130,104 @@ export async function importCreditNearbyCompany(
} }
return Promise.reject(new Error(res.data.message)); return Promise.reject(new Error(res.data.message));
} }
/**
* 导入附近企业(多文件,同一次请求)
*
* 约定:后端需支持 multipart 同名字段 `file` 多次出现(常见于 MultipartFile[] file
*/
export async function importCreditNearbyCompanyMulti(
files: File[] | FileList,
companyId?: number
) {
const formData = buildImportFormData(files, companyId);
const res = await request.post<ApiResult<unknown>>(
'/credit/credit-nearby-company/import',
formData,
{
headers: {
'Content-Type': 'multipart/form-data'
}
}
);
if (res.data.code === 0) {
return res.data.message;
}
return Promise.reject(new Error(res.data.message));
}
function buildImportFormData(
fileOrFiles: File | File[] | FileList,
companyId?: number
) {
const formData = new FormData();
if (Array.isArray(fileOrFiles)) {
fileOrFiles.forEach((f) => formData.append('file', f));
} else if (fileOrFiles instanceof FileList) {
Array.from(fileOrFiles).forEach((f) => formData.append('file', f));
} else {
formData.append('file', fileOrFiles);
}
if (companyId != null) {
formData.append('companyId', String(companyId));
}
return formData;
}
export interface ImportBatchCreditNearbyCompanyItem {
fileName: string;
success: boolean;
message: string;
}
export interface ImportBatchCreditNearbyCompanyResult {
total: number;
success: number;
failure: number;
items: ImportBatchCreditNearbyCompanyItem[];
}
/**
* 导入附近企业(多文件)
*
* 说明:
* - 目前复用单文件导入接口,前端循环调用实现“多文件导入”
* - 不会在有失败时 reject便于上层展示部分成功/失败明细)
*/
export async function importBatchCreditNearbyCompany(
files: File[] | FileList,
companyId?: number,
options?: {
/** 遇到失败是否立即停止,默认 false继续导入后续文件 */
stopOnError?: boolean;
}
): Promise<ImportBatchCreditNearbyCompanyResult> {
const list = Array.isArray(files) ? files : Array.from(files);
const items: ImportBatchCreditNearbyCompanyItem[] = [];
const stopOnError = options?.stopOnError ?? false;
for (const file of list) {
try {
const msg = await importCreditNearbyCompany(file, companyId);
items.push({ fileName: file.name, success: true, message: msg });
} catch (e: unknown) {
items.push({
fileName: file.name,
success: false,
message: e instanceof Error ? e.message : String(e)
});
if (stopOnError) {
break;
}
}
}
const success = items.filter((d) => d.success).length;
const failure = items.length - success;
return {
total: list.length,
success,
failure,
items
};
}

View File

@@ -136,6 +136,8 @@ export interface CreditNearbyCompany {
* 附近企业搜索条件 * 附近企业搜索条件
*/ */
export interface CreditNearbyCompanyParam extends PageParam { export interface CreditNearbyCompanyParam extends PageParam {
userId?: number;
id?: number; id?: number;
keywords?: string; keywords?: string;
} }

View File

@@ -1,4 +1,6 @@
import request from '@/utils/request'; import request from '@/utils/request';
import { withCreditUserScope } from '@/api/credit/utils/data-scope';
import type { ApiResult, PageResult } from '@/api'; import type { ApiResult, PageResult } from '@/api';
import type { CreditPatent, CreditPatentParam } from './model'; import type { CreditPatent, CreditPatentParam } from './model';
@@ -8,9 +10,7 @@ import type { CreditPatent, CreditPatentParam } from './model';
export async function pageCreditPatent(params: CreditPatentParam) { export async function pageCreditPatent(params: CreditPatentParam) {
const res = await request.get<ApiResult<PageResult<CreditPatent>>>( const res = await request.get<ApiResult<PageResult<CreditPatent>>>(
'/credit/credit-patent/page', '/credit/credit-patent/page',
{ { params: withCreditUserScope(params) }
params
}
); );
if (res.data.code === 0) { if (res.data.code === 0) {
return res.data.data; return res.data.data;
@@ -24,9 +24,7 @@ export async function pageCreditPatent(params: CreditPatentParam) {
export async function listCreditPatent(params?: CreditPatentParam) { export async function listCreditPatent(params?: CreditPatentParam) {
const res = await request.get<ApiResult<CreditPatent[]>>( const res = await request.get<ApiResult<CreditPatent[]>>(
'/credit/credit-patent', '/credit/credit-patent',
{ { params: withCreditUserScope(params) }
params
}
); );
if (res.data.code === 0 && res.data.data) { if (res.data.code === 0 && res.data.data) {
return res.data.data; return res.data.data;

View File

@@ -52,6 +52,8 @@ export interface CreditPatent {
* 专利搜索条件 * 专利搜索条件
*/ */
export interface CreditPatentParam extends PageParam { export interface CreditPatentParam extends PageParam {
userId?: number;
id?: number; id?: number;
keywords?: string; keywords?: string;
} }

View File

@@ -1,4 +1,6 @@
import request from '@/utils/request'; import request from '@/utils/request';
import { withCreditUserScope } from '@/api/credit/utils/data-scope';
import type { ApiResult, PageResult } from '@/api'; import type { ApiResult, PageResult } from '@/api';
import type { CreditProject, CreditProjectParam } from './model'; import type { CreditProject, CreditProjectParam } from './model';
@@ -8,9 +10,7 @@ import type { CreditProject, CreditProjectParam } from './model';
export async function pageCreditProject(params: CreditProjectParam) { export async function pageCreditProject(params: CreditProjectParam) {
const res = await request.get<ApiResult<PageResult<CreditProject>>>( const res = await request.get<ApiResult<PageResult<CreditProject>>>(
'/credit/credit-project/page', '/credit/credit-project/page',
{ { params: withCreditUserScope(params) }
params
}
); );
if (res.data.code === 0) { if (res.data.code === 0) {
return res.data.data; return res.data.data;
@@ -24,9 +24,7 @@ export async function pageCreditProject(params: CreditProjectParam) {
export async function listCreditProject(params?: CreditProjectParam) { export async function listCreditProject(params?: CreditProjectParam) {
const res = await request.get<ApiResult<CreditProject[]>>( const res = await request.get<ApiResult<CreditProject[]>>(
'/credit/credit-project', '/credit/credit-project',
{ { params: withCreditUserScope(params) }
params
}
); );
if (res.data.code === 0 && res.data.data) { if (res.data.code === 0 && res.data.data) {
return res.data.data; return res.data.data;

View File

@@ -64,6 +64,8 @@ export interface CreditProject {
* 招投标搜索条件 * 招投标搜索条件
*/ */
export interface CreditProjectParam extends PageParam { export interface CreditProjectParam extends PageParam {
userId?: number;
id?: number; id?: number;
keywords?: string; keywords?: string;
} }

View File

@@ -1,4 +1,6 @@
import request from '@/utils/request'; import request from '@/utils/request';
import { withCreditUserScope } from '@/api/credit/utils/data-scope';
import type { ApiResult, PageResult } from '@/api'; import type { ApiResult, PageResult } from '@/api';
import type { CreditRiskRelation, CreditRiskRelationParam } from './model'; import type { CreditRiskRelation, CreditRiskRelationParam } from './model';
@@ -8,9 +10,7 @@ import type { CreditRiskRelation, CreditRiskRelationParam } from './model';
export async function pageCreditRiskRelation(params: CreditRiskRelationParam) { export async function pageCreditRiskRelation(params: CreditRiskRelationParam) {
const res = await request.get<ApiResult<PageResult<CreditRiskRelation>>>( const res = await request.get<ApiResult<PageResult<CreditRiskRelation>>>(
'/credit/credit-risk-relation/page', '/credit/credit-risk-relation/page',
{ { params: withCreditUserScope(params) }
params
}
); );
if (res.data.code === 0) { if (res.data.code === 0) {
return res.data.data; return res.data.data;
@@ -24,9 +24,7 @@ export async function pageCreditRiskRelation(params: CreditRiskRelationParam) {
export async function listCreditRiskRelation(params?: CreditRiskRelationParam) { export async function listCreditRiskRelation(params?: CreditRiskRelationParam) {
const res = await request.get<ApiResult<CreditRiskRelation[]>>( const res = await request.get<ApiResult<CreditRiskRelation[]>>(
'/credit/credit-risk-relation', '/credit/credit-risk-relation',
{ { params: withCreditUserScope(params) }
params
}
); );
if (res.data.code === 0 && res.data.data) { if (res.data.code === 0 && res.data.data) {
return res.data.data; return res.data.data;

View File

@@ -44,6 +44,8 @@ export interface CreditRiskRelation {
* 风险关系表搜索条件 * 风险关系表搜索条件
*/ */
export interface CreditRiskRelationParam extends PageParam { export interface CreditRiskRelationParam extends PageParam {
userId?: number;
id?: number; id?: number;
keywords?: string; keywords?: string;
} }

View File

@@ -1,4 +1,6 @@
import request from '@/utils/request'; import request from '@/utils/request';
import { withCreditUserScope } from '@/api/credit/utils/data-scope';
import type { ApiResult, PageResult } from '@/api'; import type { ApiResult, PageResult } from '@/api';
import type { CreditSupplier, CreditSupplierParam } from './model'; import type { CreditSupplier, CreditSupplierParam } from './model';
@@ -8,9 +10,7 @@ import type { CreditSupplier, CreditSupplierParam } from './model';
export async function pageCreditSupplier(params: CreditSupplierParam) { export async function pageCreditSupplier(params: CreditSupplierParam) {
const res = await request.get<ApiResult<PageResult<CreditSupplier>>>( const res = await request.get<ApiResult<PageResult<CreditSupplier>>>(
'/credit/credit-supplier/page', '/credit/credit-supplier/page',
{ { params: withCreditUserScope(params) }
params
}
); );
if (res.data.code === 0) { if (res.data.code === 0) {
return res.data.data; return res.data.data;
@@ -24,9 +24,7 @@ export async function pageCreditSupplier(params: CreditSupplierParam) {
export async function listCreditSupplier(params?: CreditSupplierParam) { export async function listCreditSupplier(params?: CreditSupplierParam) {
const res = await request.get<ApiResult<CreditSupplier[]>>( const res = await request.get<ApiResult<CreditSupplier[]>>(
'/credit/credit-supplier', '/credit/credit-supplier',
{ { params: withCreditUserScope(params) }
params
}
); );
if (res.data.code === 0 && res.data.data) { if (res.data.code === 0 && res.data.data) {
return res.data.data; return res.data.data;

View File

@@ -42,6 +42,8 @@ export interface CreditSupplier {
* 供应商搜索条件 * 供应商搜索条件
*/ */
export interface CreditSupplierParam extends PageParam { export interface CreditSupplierParam extends PageParam {
userId?: number;
id?: number; id?: number;
keywords?: string; keywords?: string;
} }

View File

@@ -1,4 +1,6 @@
import request from '@/utils/request'; import request from '@/utils/request';
import { withCreditUserScope } from '@/api/credit/utils/data-scope';
import type { ApiResult, PageResult } from '@/api'; import type { ApiResult, PageResult } from '@/api';
import type { import type {
CreditSuspectedRelationship, CreditSuspectedRelationship,
@@ -14,7 +16,7 @@ export async function pageCreditSuspectedRelationship(
const res = await request.get< const res = await request.get<
ApiResult<PageResult<CreditSuspectedRelationship>> ApiResult<PageResult<CreditSuspectedRelationship>>
>('/credit/credit-suspected-relationship/page', { >('/credit/credit-suspected-relationship/page', {
params params: withCreditUserScope(params)
}); });
if (res.data.code === 0) { if (res.data.code === 0) {
return res.data.data; return res.data.data;
@@ -30,9 +32,7 @@ export async function listCreditSuspectedRelationship(
) { ) {
const res = await request.get<ApiResult<CreditSuspectedRelationship[]>>( const res = await request.get<ApiResult<CreditSuspectedRelationship[]>>(
'/credit/credit-suspected-relationship', '/credit/credit-suspected-relationship',
{ { params: withCreditUserScope(params) }
params
}
); );
if (res.data.code === 0 && res.data.data) { if (res.data.code === 0 && res.data.data) {
return res.data.data; return res.data.data;

View File

@@ -50,6 +50,8 @@ export interface CreditSuspectedRelationship {
* 疑似关系搜索条件 * 疑似关系搜索条件
*/ */
export interface CreditSuspectedRelationshipParam extends PageParam { export interface CreditSuspectedRelationshipParam extends PageParam {
userId?: number;
id?: number; id?: number;
keywords?: string; keywords?: string;
} }

View File

@@ -1,4 +1,6 @@
import request from '@/utils/request'; import request from '@/utils/request';
import { withCreditUserScope } from '@/api/credit/utils/data-scope';
import type { ApiResult, PageResult } from '@/api'; import type { ApiResult, PageResult } from '@/api';
import type { CreditUser, CreditUserParam } from './model'; import type { CreditUser, CreditUserParam } from './model';
@@ -8,9 +10,7 @@ import type { CreditUser, CreditUserParam } from './model';
export async function pageCreditUser(params: CreditUserParam) { export async function pageCreditUser(params: CreditUserParam) {
const res = await request.get<ApiResult<PageResult<CreditUser>>>( const res = await request.get<ApiResult<PageResult<CreditUser>>>(
'/credit/credit-user/page', '/credit/credit-user/page',
{ { params: withCreditUserScope(params) }
params
}
); );
if (res.data.code === 0) { if (res.data.code === 0) {
return res.data.data; return res.data.data;
@@ -24,9 +24,7 @@ export async function pageCreditUser(params: CreditUserParam) {
export async function listCreditUser(params?: CreditUserParam) { export async function listCreditUser(params?: CreditUserParam) {
const res = await request.get<ApiResult<CreditUser[]>>( const res = await request.get<ApiResult<CreditUser[]>>(
'/credit/credit-user', '/credit/credit-user',
{ { params: withCreditUserScope(params) }
params
}
); );
if (res.data.code === 0 && res.data.data) { if (res.data.code === 0 && res.data.data) {
return res.data.data; return res.data.data;

View File

@@ -64,6 +64,8 @@ export interface CreditUser {
* 招投标信息表搜索条件 * 招投标信息表搜索条件
*/ */
export interface CreditUserParam extends PageParam { export interface CreditUserParam extends PageParam {
userId?: number;
id?: number; id?: number;
keywords?: string; keywords?: string;
} }

View File

@@ -1,4 +1,6 @@
import request from '@/utils/request'; import request from '@/utils/request';
import { withCreditUserScope } from '@/api/credit/utils/data-scope';
import type { ApiResult, PageResult } from '@/api'; import type { ApiResult, PageResult } from '@/api';
import type { CreditXgxf, CreditXgxfParam } from './model'; import type { CreditXgxf, CreditXgxfParam } from './model';
@@ -8,9 +10,7 @@ import type { CreditXgxf, CreditXgxfParam } from './model';
export async function pageCreditXgxf(params: CreditXgxfParam) { export async function pageCreditXgxf(params: CreditXgxfParam) {
const res = await request.get<ApiResult<PageResult<CreditXgxf>>>( const res = await request.get<ApiResult<PageResult<CreditXgxf>>>(
'/credit/credit-xgxf/page', '/credit/credit-xgxf/page',
{ { params: withCreditUserScope(params) }
params
}
); );
if (res.data.code === 0) { if (res.data.code === 0) {
return res.data.data; return res.data.data;
@@ -24,9 +24,7 @@ export async function pageCreditXgxf(params: CreditXgxfParam) {
export async function listCreditXgxf(params?: CreditXgxfParam) { export async function listCreditXgxf(params?: CreditXgxfParam) {
const res = await request.get<ApiResult<CreditXgxf[]>>( const res = await request.get<ApiResult<CreditXgxf[]>>(
'/credit/credit-xgxf', '/credit/credit-xgxf',
{ { params: withCreditUserScope(params) }
params
}
); );
if (res.data.code === 0 && res.data.data) { if (res.data.code === 0 && res.data.data) {
return res.data.data; return res.data.data;
@@ -127,3 +125,27 @@ export async function importCreditXgxf(file: File, companyId?: number) {
} }
return Promise.reject(new Error(res.data.message)); return Promise.reject(new Error(res.data.message));
} }
/**
* 导入历史限制高消费
*/
export async function importCreditXgxfHistory(file: File, companyId?: number) {
const formData = new FormData();
formData.append('file', file);
if (companyId != null) {
formData.append('companyId', String(companyId));
}
const res = await request.post<ApiResult<unknown>>(
'/credit/credit-xgxf/import/history',
formData,
{
headers: {
'Content-Type': 'multipart/form-data'
}
}
);
if (res.data.code === 0) {
return res.data.message;
}
return Promise.reject(new Error(res.data.message));
}

View File

@@ -52,6 +52,8 @@ export interface CreditXgxf {
* 限制高消费搜索条件 * 限制高消费搜索条件
*/ */
export interface CreditXgxfParam extends PageParam { export interface CreditXgxfParam extends PageParam {
userId?: number;
id?: number; id?: number;
keywords?: string; keywords?: string;
} }

View File

@@ -0,0 +1,49 @@
import { hasRole } from '@/utils/permission';
import { useUserStore } from '@/store/modules/user';
function isSuperAdmin(): boolean {
try {
return hasRole('superAdmin');
} catch {
return false;
}
}
function getCurrentUserId(): number | undefined {
try {
const store = useUserStore();
const id = store?.info?.userId;
if (typeof id === 'number' && Number.isFinite(id) && id > 0) {
return id;
}
} catch {
// Pinia may not be active in some early-init code paths.
}
const raw = localStorage.getItem('UserId');
if (!raw) {
return undefined;
}
const n = Number(raw);
return Number.isFinite(n) && n > 0 ? n : undefined;
}
/**
* Credit module data scope:
* - superAdmin: see all data
* - others: only see data published by themselves (userId)
*/
export function withCreditUserScope<T extends Record<string, any> | undefined>(
params: T
): T {
if (isSuperAdmin()) {
return params;
}
const userId = getCurrentUserId();
if (!userId) {
return params;
}
if (!params) {
return { userId } as T;
}
return { ...(params as any), userId } as T;
}

View File

@@ -0,0 +1,105 @@
import request from '@/utils/request';
import type { ApiResult, PageResult } from '@/api';
import type { ShopCommunity, ShopCommunityParam } from './model';
/**
* 分页查询小区
*/
export async function pageShopCommunity(params: ShopCommunityParam) {
const res = await request.get<ApiResult<PageResult<ShopCommunity>>>(
'/shop/shop-community/page',
{
params
}
);
if (res.data.code === 0) {
return res.data.data;
}
return Promise.reject(new Error(res.data.message));
}
/**
* 查询小区列表
*/
export async function listShopCommunity(params?: ShopCommunityParam) {
const res = await request.get<ApiResult<ShopCommunity[]>>(
'/shop/shop-community',
{
params
}
);
if (res.data.code === 0 && res.data.data) {
return res.data.data;
}
return Promise.reject(new Error(res.data.message));
}
/**
* 添加小区
*/
export async function addShopCommunity(data: ShopCommunity) {
const res = await request.post<ApiResult<unknown>>(
'/shop/shop-community',
data
);
if (res.data.code === 0) {
return res.data.message;
}
return Promise.reject(new Error(res.data.message));
}
/**
* 修改小区
*/
export async function updateShopCommunity(data: ShopCommunity) {
const res = await request.put<ApiResult<unknown>>(
'/shop/shop-community',
data
);
if (res.data.code === 0) {
return res.data.message;
}
return Promise.reject(new Error(res.data.message));
}
/**
* 删除小区
*/
export async function removeShopCommunity(id?: number) {
const res = await request.delete<ApiResult<unknown>>(
'/shop/shop-community/' + id
);
if (res.data.code === 0) {
return res.data.message;
}
return Promise.reject(new Error(res.data.message));
}
/**
* 批量删除小区
*/
export async function removeBatchShopCommunity(data: (number | undefined)[]) {
const res = await request.delete<ApiResult<unknown>>(
'/shop/shop-community/batch',
{
data
}
);
if (res.data.code === 0) {
return res.data.message;
}
return Promise.reject(new Error(res.data.message));
}
/**
* 根据id查询小区
*/
export async function getShopCommunity(id: number) {
const res = await request.get<ApiResult<ShopCommunity>>(
'/shop/shop-community/' + id
);
if (res.data.code === 0 && res.data.data) {
return res.data.data;
}
return Promise.reject(new Error(res.data.message));
}

View File

@@ -0,0 +1,35 @@
import type { PageParam } from '@/api';
/**
* 小区
*/
export interface ShopCommunity {
// ID
id?: number;
// 小区名称
name?: string;
// 小区编号
code?: string;
// 详细地址
address?: string;
// 排序(数字越小越靠前)
sortNumber?: number;
// 备注
comments?: string;
// 状态, 0正常, 1冻结
status?: number;
// 租户id
tenantId?: number;
// 创建时间
createTime?: string;
}
/**
* 小区搜索条件
*/
export interface ShopCommunityParam extends PageParam {
id?: number;
name?: string;
code?: string;
keywords?: string;
}

View File

@@ -8,6 +8,8 @@ export interface ShopDealerCapital {
id?: number; id?: number;
// 分销商用户ID // 分销商用户ID
userId?: number; userId?: number;
// 分销商昵称
nickName?: string;
// 订单ID // 订单ID
orderId?: number; orderId?: number;
// 订单编号 // 订单编号

View File

@@ -12,6 +12,8 @@ export interface ShopDealerOrder {
title?: string; title?: string;
// 买家用户昵称 // 买家用户昵称
nickname?: string; nickname?: string;
// 真实姓名
realName?: string;
// 订单编号 // 订单编号
orderNo?: string; orderNo?: string;
// 订单总金额(不含运费) // 订单总金额(不含运费)
@@ -52,6 +54,10 @@ export interface ShopDealerOrder {
isSettled?: number; isSettled?: number;
// 结算时间 // 结算时间
settleTime?: number; settleTime?: number;
// 是否解冻(0否 1是)
isUnfreeze?: number;
// 解冻时间
unfreezeTime?: number;
// 订单备注 // 订单备注
comments?: string; comments?: string;
// 商城ID // 商城ID

View File

@@ -6,8 +6,16 @@ import type { PageParam } from '@/api';
export interface ShopDealerUser { export interface ShopDealerUser {
// 主键ID // 主键ID
id?: number; id?: number;
// 类型 0经销商 1企业 2集团
type?: number;
// 自增ID // 自增ID
userId?: number; userId?: number;
// 头像
avatar?: string;
// 店铺名称
dealerName?: string;
// 小区名称
community?: string;
// 姓名 // 姓名
realName?: string; realName?: string;
// 手机号 // 手机号
@@ -34,6 +42,8 @@ export interface ShopDealerUser {
thirdNum?: number; thirdNum?: number;
// 专属二维码 // 专属二维码
qrcode?: string; qrcode?: string;
// 配送员所属门店
shopName?: string;
// 是否删除 // 是否删除
isDelete?: number; isDelete?: number;
// 租户id // 租户id
@@ -56,5 +66,7 @@ export interface ShopDealerUser {
*/ */
export interface ShopDealerUserParam extends PageParam { export interface ShopDealerUserParam extends PageParam {
id?: number; id?: number;
realName?: string;
mobile?: string;
keywords?: string; keywords?: string;
} }

View File

@@ -94,7 +94,7 @@ export interface ShopGoods {
supplierMerchantId?: number; supplierMerchantId?: number;
supplierName?: string; supplierName?: string;
// 状态0未上架1上架 // 状态0未上架1上架
isShow?: number; isShow?: boolean;
// 状态, 0上架 1待上架 2待审核 3审核不通过 // 状态, 0上架 1待上架 2待审核 3审核不通过
status?: number; status?: number;
// 备注 // 备注
@@ -124,6 +124,21 @@ export interface ShopGoods {
canUseDate?: string; canUseDate?: string;
ensureTag?: string; ensureTag?: string;
expiredDay?: number; expiredDay?: number;
// --- 分销/佣金(新字段,后端保持 snake_case---
// 是否开启分销佣金0关闭 1开启
isOpenCommission?: number;
// 分佣类型10固定金额 20百分比
commissionType?: number;
// 一级/二级/三级分销佣金(单位以服务端为准)
firstMoney?: number;
secondMoney?: number;
thirdMoney?: number;
// 一级/二级分红(单位以服务端为准)
firstDividend?: number;
secondDividend?: number;
// 配送奖金
deliveryMoney?: number;
} }
export interface BathSet { export interface BathSet {

View File

@@ -135,3 +135,18 @@ export async function shopOrderTotal(params?: ShopOrderParam) {
} }
return Promise.reject(new Error(res.data.message)); return Promise.reject(new Error(res.data.message));
} }
/**
* 申请|同意退款
*/
export async function refundShopOrder(data: ShopOrder) {
const res = await request.put<ApiResult<unknown>>(
MODULES_API_URL + '/shop/shop-order/refund',
data
);
if (res.data.code === 0) {
return res.data.message;
}
return Promise.reject(new Error(res.data.message));
}

View File

@@ -37,6 +37,10 @@ export interface ShopOrder {
icCard?: string; icCard?: string;
// 头像 // 头像
avatar?: string; avatar?: string;
// 昵称(部分接口会返回)
nickname?: string;
// 兼容字段:部分接口可能返回 name
name?: string;
// 真实姓名 // 真实姓名
realName?: string; realName?: string;
// 手机号码 // 手机号码
@@ -99,6 +103,8 @@ export interface ShopOrder {
expressId?: number; expressId?: number;
// 快递公司名称 // 快递公司名称
expressName?: string; expressName?: string;
// 物流单号
expressNo?: string;
// 发货人 // 发货人
sendName?: string; sendName?: string;
// 发货人联系方式 // 发货人联系方式

View File

@@ -0,0 +1,105 @@
import request from '@/utils/request';
import type { ApiResult, PageResult } from '@/api';
import type { ShopStore, ShopStoreParam } from './model';
/**
* 分页查询门店
*/
export async function pageShopStore(params: ShopStoreParam) {
const res = await request.get<ApiResult<PageResult<ShopStore>>>(
'/shop/shop-store/page',
{
params
}
);
if (res.data.code === 0) {
return res.data.data;
}
return Promise.reject(new Error(res.data.message));
}
/**
* 查询门店列表
*/
export async function listShopStore(params?: ShopStoreParam) {
const res = await request.get<ApiResult<ShopStore[]>>(
'/shop/shop-store',
{
params
}
);
if (res.data.code === 0 && res.data.data) {
return res.data.data;
}
return Promise.reject(new Error(res.data.message));
}
/**
* 添加门店
*/
export async function addShopStore(data: ShopStore) {
const res = await request.post<ApiResult<unknown>>(
'/shop/shop-store',
data
);
if (res.data.code === 0) {
return res.data.message;
}
return Promise.reject(new Error(res.data.message));
}
/**
* 修改门店
*/
export async function updateShopStore(data: ShopStore) {
const res = await request.put<ApiResult<unknown>>(
'/shop/shop-store',
data
);
if (res.data.code === 0) {
return res.data.message;
}
return Promise.reject(new Error(res.data.message));
}
/**
* 删除门店
*/
export async function removeShopStore(id?: number) {
const res = await request.delete<ApiResult<unknown>>(
'/shop/shop-store/' + id
);
if (res.data.code === 0) {
return res.data.message;
}
return Promise.reject(new Error(res.data.message));
}
/**
* 批量删除门店
*/
export async function removeBatchShopStore(data: (number | undefined)[]) {
const res = await request.delete<ApiResult<unknown>>(
'/shop/shop-store/batch',
{
data
}
);
if (res.data.code === 0) {
return res.data.message;
}
return Promise.reject(new Error(res.data.message));
}
/**
* 根据id查询门店
*/
export async function getShopStore(id: number) {
const res = await request.get<ApiResult<ShopStore>>(
'/shop/shop-store/' + id
);
if (res.data.code === 0 && res.data.data) {
return res.data.data;
}
return Promise.reject(new Error(res.data.message));
}

View File

@@ -0,0 +1,59 @@
import type { PageParam } from '@/api';
/**
* 门店
*/
export interface ShopStore {
// 自增ID
id?: number;
// 店铺名称
name?: string;
// 门店地址
address?: string;
// 手机号码
phone?: string;
// 邮箱
email?: string;
// 门店经理
managerName?: string;
// 门店banner
shopBanner?: string;
// 所在省份
province?: string;
// 所在城市
city?: string;
// 所在辖区
region?: string;
// 经度和纬度
lngAndLat?: string;
// 位置
location?:string;
// 区域
district?: string;
// 轮廓
points?: string;
// 用户ID
userId?: number;
// 状态
status?: number;
// 备注
comments?: string;
// 排序号
sortNumber?: number;
// 是否删除
isDelete?: number;
// 租户id
tenantId?: number;
// 创建时间
createTime?: string;
// 修改时间
updateTime?: string;
}
/**
* 门店搜索条件
*/
export interface ShopStoreParam extends PageParam {
id?: number;
keywords?: string;
}

View File

@@ -0,0 +1,105 @@
import request from '@/utils/request';
import type { ApiResult, PageResult } from '@/api';
import type { ShopStoreFence, ShopStoreFenceParam } from './model';
/**
* 分页查询黄家明_电子围栏
*/
export async function pageShopStoreFence(params: ShopStoreFenceParam) {
const res = await request.get<ApiResult<PageResult<ShopStoreFence>>>(
'/shop/shop-store-fence/page',
{
params
}
);
if (res.data.code === 0) {
return res.data.data;
}
return Promise.reject(new Error(res.data.message));
}
/**
* 查询黄家明_电子围栏列表
*/
export async function listShopStoreFence(params?: ShopStoreFenceParam) {
const res = await request.get<ApiResult<ShopStoreFence[]>>(
'/shop/shop-store-fence',
{
params
}
);
if (res.data.code === 0 && res.data.data) {
return res.data.data;
}
return Promise.reject(new Error(res.data.message));
}
/**
* 添加黄家明_电子围栏
*/
export async function addShopStoreFence(data: ShopStoreFence) {
const res = await request.post<ApiResult<unknown>>(
'/shop/shop-store-fence',
data
);
if (res.data.code === 0) {
return res.data.message;
}
return Promise.reject(new Error(res.data.message));
}
/**
* 修改黄家明_电子围栏
*/
export async function updateShopStoreFence(data: ShopStoreFence) {
const res = await request.put<ApiResult<unknown>>(
'/shop/shop-store-fence',
data
);
if (res.data.code === 0) {
return res.data.message;
}
return Promise.reject(new Error(res.data.message));
}
/**
* 删除黄家明_电子围栏
*/
export async function removeShopStoreFence(id?: number) {
const res = await request.delete<ApiResult<unknown>>(
'/shop/shop-store-fence/' + id
);
if (res.data.code === 0) {
return res.data.message;
}
return Promise.reject(new Error(res.data.message));
}
/**
* 批量删除黄家明_电子围栏
*/
export async function removeBatchShopStoreFence(data: (number | undefined)[]) {
const res = await request.delete<ApiResult<unknown>>(
'/shop/shop-store-fence/batch',
{
data
}
);
if (res.data.code === 0) {
return res.data.message;
}
return Promise.reject(new Error(res.data.message));
}
/**
* 根据id查询黄家明_电子围栏
*/
export async function getShopStoreFence(id: number) {
const res = await request.get<ApiResult<ShopStoreFence>>(
'/shop/shop-store-fence/' + id
);
if (res.data.code === 0 && res.data.data) {
return res.data.data;
}
return Promise.reject(new Error(res.data.message));
}

View File

@@ -0,0 +1,43 @@
import type { PageParam } from '@/api';
/**
* 黄家明_电子围栏
*/
export interface ShopStoreFence {
// 自增ID
id?: number;
// 围栏名称
name?: string;
// 类型 0圆形 1方形
type?: number;
// 定位
location?: string;
// 经度
longitude?: string;
// 纬度
latitude?: string;
// 区域
district?: string;
// 电子围栏轮廓
points?: string;
// 排序(数字越小越靠前)
sortNumber?: number;
// 备注
comments?: string;
// 状态, 0正常, 1冻结
status?: number;
// 租户id
tenantId?: number;
// 创建时间
createTime?: string;
// 修改时间
updateTime?: string;
}
/**
* 黄家明_电子围栏搜索条件
*/
export interface ShopStoreFenceParam extends PageParam {
id?: number;
keywords?: string;
}

View File

@@ -0,0 +1,105 @@
import request from '@/utils/request';
import type { ApiResult, PageResult } from '@/api';
import type { ShopStoreRider, ShopStoreRiderParam } from './model';
/**
* 分页查询配送员
*/
export async function pageShopStoreRider(params: ShopStoreRiderParam) {
const res = await request.get<ApiResult<PageResult<ShopStoreRider>>>(
'/shop/shop-store-rider/page',
{
params
}
);
if (res.data.code === 0) {
return res.data.data;
}
return Promise.reject(new Error(res.data.message));
}
/**
* 查询配送员列表
*/
export async function listShopStoreRider(params?: ShopStoreRiderParam) {
const res = await request.get<ApiResult<ShopStoreRider[]>>(
'/shop/shop-store-rider',
{
params
}
);
if (res.data.code === 0 && res.data.data) {
return res.data.data;
}
return Promise.reject(new Error(res.data.message));
}
/**
* 添加配送员
*/
export async function addShopStoreRider(data: ShopStoreRider) {
const res = await request.post<ApiResult<unknown>>(
'/shop/shop-store-rider',
data
);
if (res.data.code === 0) {
return res.data.message;
}
return Promise.reject(new Error(res.data.message));
}
/**
* 修改配送员
*/
export async function updateShopStoreRider(data: ShopStoreRider) {
const res = await request.put<ApiResult<unknown>>(
'/shop/shop-store-rider',
data
);
if (res.data.code === 0) {
return res.data.message;
}
return Promise.reject(new Error(res.data.message));
}
/**
* 删除配送员
*/
export async function removeShopStoreRider(id?: number) {
const res = await request.delete<ApiResult<unknown>>(
'/shop/shop-store-rider/' + id
);
if (res.data.code === 0) {
return res.data.message;
}
return Promise.reject(new Error(res.data.message));
}
/**
* 批量删除配送员
*/
export async function removeBatchShopStoreRider(data: (number | undefined)[]) {
const res = await request.delete<ApiResult<unknown>>(
'/shop/shop-store-rider/batch',
{
data
}
);
if (res.data.code === 0) {
return res.data.message;
}
return Promise.reject(new Error(res.data.message));
}
/**
* 根据id查询配送员
*/
export async function getShopStoreRider(id: number) {
const res = await request.get<ApiResult<ShopStoreRider>>(
'/shop/shop-store-rider/' + id
);
if (res.data.code === 0 && res.data.data) {
return res.data.data;
}
return Promise.reject(new Error(res.data.message));
}

View File

@@ -0,0 +1,65 @@
import type { PageParam } from '@/api';
/**
* 配送员
*/
export interface ShopStoreRider {
// 主键ID
id?: string;
// 门店IDshop_store.id
storeId?: number;
// 门店名称(后端联表返回,提交时可不传)
storeName?: string;
// 配送点IDshop_dealer.id
dealerId?: number;
// 骑手编号(可选)
riderNo?: string;
// 姓名
realName?: string;
// 手机号
mobile?: string;
// 头像
avatar?: string;
// 身份证号(可选)
idCardNo?: string;
// 状态1启用0禁用
status?: number;
// 接单状态0休息/下线1在线2忙碌
workStatus?: number;
// 是否开启自动派单1是0否
autoDispatchEnabled?: number;
// 派单优先级(同小区多骑手时可用,值越大越优先)
dispatchPriority?: number;
// 最大同时配送单数0表示不限制
maxOnhandOrders?: number;
// 是否计算工资(提成)1计算0不计算如三方配送点可设0
commissionCalcEnabled?: number;
// 水每桶提成金额(元/桶)
waterBucketUnitFee?: string;
// 其他商品提成方式1按订单固定金额2按订单金额比例3按商品规则(另表)
otherGoodsCommissionType?: number;
// 其他商品提成值:固定金额(元)或比例(%)
otherGoodsCommissionValue?: string;
// 用户ID
userId?: number;
// 备注
comments?: string;
// 排序号
sortNumber?: number;
// 是否删除
isDelete?: number;
// 租户id
tenantId?: number;
// 创建时间
createTime?: string;
// 修改时间
updateTime?: string;
}
/**
* 配送员搜索条件
*/
export interface ShopStoreRiderParam extends PageParam {
id?: number;
keywords?: string;
}

View File

@@ -0,0 +1,105 @@
import request from '@/utils/request';
import type { ApiResult, PageResult } from '@/api';
import type { ShopStoreUser, ShopStoreUserParam } from './model';
/**
* 分页查询店员
*/
export async function pageShopStoreUser(params: ShopStoreUserParam) {
const res = await request.get<ApiResult<PageResult<ShopStoreUser>>>(
'/shop/shop-store-user/page',
{
params
}
);
if (res.data.code === 0) {
return res.data.data;
}
return Promise.reject(new Error(res.data.message));
}
/**
* 查询店员列表
*/
export async function listShopStoreUser(params?: ShopStoreUserParam) {
const res = await request.get<ApiResult<ShopStoreUser[]>>(
'/shop/shop-store-user',
{
params
}
);
if (res.data.code === 0 && res.data.data) {
return res.data.data;
}
return Promise.reject(new Error(res.data.message));
}
/**
* 添加店员
*/
export async function addShopStoreUser(data: ShopStoreUser) {
const res = await request.post<ApiResult<unknown>>(
'/shop/shop-store-user',
data
);
if (res.data.code === 0) {
return res.data.message;
}
return Promise.reject(new Error(res.data.message));
}
/**
* 修改店员
*/
export async function updateShopStoreUser(data: ShopStoreUser) {
const res = await request.put<ApiResult<unknown>>(
'/shop/shop-store-user',
data
);
if (res.data.code === 0) {
return res.data.message;
}
return Promise.reject(new Error(res.data.message));
}
/**
* 删除店员
*/
export async function removeShopStoreUser(id?: number) {
const res = await request.delete<ApiResult<unknown>>(
'/shop/shop-store-user/' + id
);
if (res.data.code === 0) {
return res.data.message;
}
return Promise.reject(new Error(res.data.message));
}
/**
* 批量删除店员
*/
export async function removeBatchShopStoreUser(data: (number | undefined)[]) {
const res = await request.delete<ApiResult<unknown>>(
'/shop/shop-store-user/batch',
{
data
}
);
if (res.data.code === 0) {
return res.data.message;
}
return Promise.reject(new Error(res.data.message));
}
/**
* 根据id查询店员
*/
export async function getShopStoreUser(id: number) {
const res = await request.get<ApiResult<ShopStoreUser>>(
'/shop/shop-store-user/' + id
);
if (res.data.code === 0 && res.data.data) {
return res.data.data;
}
return Promise.reject(new Error(res.data.message));
}

View File

@@ -0,0 +1,33 @@
import type { PageParam } from '@/api';
/**
* 店员
*/
export interface ShopStoreUser {
// 主键ID
id?: number;
// 配送点IDshop_dealer.id
storeId?: number;
// 用户ID
userId?: number;
// 备注
comments?: string;
// 排序号
sortNumber?: number;
// 是否删除
isDelete?: number;
// 租户id
tenantId?: number;
// 创建时间
createTime?: string;
// 修改时间
updateTime?: string;
}
/**
* 店员搜索条件
*/
export interface ShopStoreUserParam extends PageParam {
id?: number;
keywords?: string;
}

View File

@@ -0,0 +1,105 @@
import request from '@/utils/request';
import type { ApiResult, PageResult } from '@/api';
import type { ShopStoreWarehouse, ShopStoreWarehouseParam } from './model';
/**
* 分页查询仓库
*/
export async function pageShopStoreWarehouse(params: ShopStoreWarehouseParam) {
const res = await request.get<ApiResult<PageResult<ShopStoreWarehouse>>>(
'/shop/shop-store-warehouse/page',
{
params
}
);
if (res.data.code === 0) {
return res.data.data;
}
return Promise.reject(new Error(res.data.message));
}
/**
* 查询仓库列表
*/
export async function listShopStoreWarehouse(params?: ShopStoreWarehouseParam) {
const res = await request.get<ApiResult<ShopStoreWarehouse[]>>(
'/shop/shop-store-warehouse',
{
params
}
);
if (res.data.code === 0 && res.data.data) {
return res.data.data;
}
return Promise.reject(new Error(res.data.message));
}
/**
* 添加仓库
*/
export async function addShopStoreWarehouse(data: ShopStoreWarehouse) {
const res = await request.post<ApiResult<unknown>>(
'/shop/shop-store-warehouse',
data
);
if (res.data.code === 0) {
return res.data.message;
}
return Promise.reject(new Error(res.data.message));
}
/**
* 修改仓库
*/
export async function updateShopStoreWarehouse(data: ShopStoreWarehouse) {
const res = await request.put<ApiResult<unknown>>(
'/shop/shop-store-warehouse',
data
);
if (res.data.code === 0) {
return res.data.message;
}
return Promise.reject(new Error(res.data.message));
}
/**
* 删除仓库
*/
export async function removeShopStoreWarehouse(id?: number) {
const res = await request.delete<ApiResult<unknown>>(
'/shop/shop-store-warehouse/' + id
);
if (res.data.code === 0) {
return res.data.message;
}
return Promise.reject(new Error(res.data.message));
}
/**
* 批量删除仓库
*/
export async function removeBatchShopStoreWarehouse(data: (number | undefined)[]) {
const res = await request.delete<ApiResult<unknown>>(
'/shop/shop-store-warehouse/batch',
{
data
}
);
if (res.data.code === 0) {
return res.data.message;
}
return Promise.reject(new Error(res.data.message));
}
/**
* 根据id查询仓库
*/
export async function getShopStoreWarehouse(id: number) {
const res = await request.get<ApiResult<ShopStoreWarehouse>>(
'/shop/shop-store-warehouse/' + id
);
if (res.data.code === 0 && res.data.data) {
return res.data.data;
}
return Promise.reject(new Error(res.data.message));
}

View File

@@ -0,0 +1,51 @@
import type { PageParam } from '@/api';
/**
* 仓库
*/
export interface ShopStoreWarehouse {
// 自增ID
id?: number;
// 仓库名称
name?: string;
// 唯一标识
code?: string;
// 类型 中心仓,区域仓,门店仓
type?: string;
// 仓库地址
address?: string;
// 真实姓名
realName?: string;
// 联系电话
phone?: string;
// 所在省份
province?: string;
// 所在城市
city?: string;
// 所在辖区
region?: string;
// 经纬度
lngAndLat?: string;
// 用户ID
userId?: number;
// 备注
comments?: string;
// 排序号
sortNumber?: number;
// 是否删除
isDelete?: number;
// 租户id
tenantId?: number;
// 创建时间
createTime?: string;
// 修改时间
updateTime?: string;
}
/**
* 仓库搜索条件
*/
export interface ShopStoreWarehouseParam extends PageParam {
id?: number;
keywords?: string;
}

View File

@@ -0,0 +1,126 @@
<template>
<ele-modal
:width="750"
:visible="visible"
:maskClosable="false"
:title="title"
:footer="null"
:body-style="{ paddingBottom: '28px' }"
@update:visible="updateVisible"
>
<ele-pro-table
ref="tableRef"
row-key="userId"
:datasource="datasource"
:columns="columns"
:pagination="false"
>
<template #toolbar>
<a-space>
<a-input-search
allow-clear
v-model:value="where.keywords"
placeholder="请输入搜索关键词"
style="width: 200px"
@search="reload"
@pressEnter="reload"
/>
</a-space>
</template>
<template #bodyCell="{ column, record }">
<template v-if="column.key === 'roles'">
<a-tag v-for="(item, index) in record.roles" :key="index">{{
item.roleName
}}</a-tag>
</template>
<template v-if="column.key === 'action'">
<a-space>
<a-button type="primary" @click="done(record)">选择</a-button>
</a-space>
</template>
</template>
</ele-pro-table>
</ele-modal>
</template>
<script lang="ts" setup>
import { ref } from 'vue';
import {
ColumnItem,
DatasourceFunction
} from 'ele-admin-pro/es/ele-pro-table/types';
import { EleProTable } from 'ele-admin-pro';
import useSearch from '@/utils/use-search';
import { pageShopCommunity } from "@/api/shop/shopCommunity";
import { ShopDealerUser } from "@/api/shop/shopDealerUser/model";
import {ShopCommunityParam} from "@/api/shop/shopCommunity/model";
defineProps<{
// 弹窗是否打开
visible: boolean;
title?: string;
// 修改回显的数据
data?: ShopDealerUser | null;
type?: string;
}>();
const emit = defineEmits<{
(e: 'done', data: ShopDealerUser): void;
(e: 'update:visible', visible: boolean): void;
}>();
/* 更新visible */
const updateVisible = (value: boolean) => {
emit('update:visible', value);
};
// 表单数据
const { where } = useSearch<ShopCommunityParam>({
userId: undefined,
name: undefined,
keywords: ''
});
// 表格实例
const tableRef = ref<InstanceType<typeof EleProTable> | null>(null);
// 表格配置
const columns = ref<ColumnItem[]>([
{
title: 'ID',
dataIndex: 'id'
},
{
title: '小区名称',
dataIndex: 'name'
},
{
title: '操作',
key: 'action',
align: 'center',
hideInSetting: true
}
]);
// 表格数据源
const datasource: DatasourceFunction = ({ page, limit, where, orders }) => {
where.type = 1;
return pageShopCommunity({
...where,
...orders,
page,
limit
});
};
/* 搜索 */
const reload = () => {
tableRef?.value?.reload({ page: 1, where });
};
const done = (record: ShopDealerUser) => {
updateVisible(false);
emit('done', record);
};
</script>
<style lang="less"></style>

View File

@@ -0,0 +1,71 @@
<template>
<div>
<a-input-group compact>
<a-input
disabled
style="width: calc(100% - 32px)"
v-model:value="content"
:placeholder="placeholder"
/>
<a-button @click="openEdit">
<template #icon><BulbOutlined class="ele-text-warning" /></template>
</a-button>
</a-input-group>
<!-- 选择弹窗 -->
<select-data
v-model:visible="showEdit"
:data="current"
:title="placeholder"
:type="type"
@done="onChange"
/>
</div>
</template>
<script lang="ts" setup>
import { BulbOutlined } from '@ant-design/icons-vue';
import { ref } from 'vue';
import SelectData from './components/select-data.vue';
import { User } from '@/api/system/user/model';
const props = withDefaults(
defineProps<{
value?: any;
placeholder?: string;
index?: number;
type?: string;
}>(),
{
placeholder: '请选择'
}
);
const emit = defineEmits<{
(e: 'done', User): void;
(e: 'clear'): void;
}>();
// 是否显示编辑弹窗
const showEdit = ref(false);
// 当前编辑数据
const current = ref<User | null>(null);
const content = ref<any>();
/* 打开编辑弹窗 */
const openEdit = (row?: User) => {
current.value = row ?? null;
showEdit.value = true;
};
const onChange = (row) => {
console.log(row,'sdfsd111')
row.index = Number(props.index);
emit('done', row);
};
if (props.value) {
content.value = props.value;
}
// 查询租户列表
// const appList = ref<App[] | undefined>([]);
</script>

View File

@@ -34,9 +34,9 @@
</a-button> </a-button>
</a-upload> </a-upload>
<a-upload <a-upload
v-else v-else-if="type == 'image'"
:show-upload-list="false" :show-upload-list="false"
:accept="'image/*,application/*'" :accept="'image/*'"
:customRequest="onUpload" :customRequest="onUpload"
> >
<a-button type="primary" class="ele-btn-icon"> <a-button type="primary" class="ele-btn-icon">
@@ -46,6 +46,19 @@
<span>上传图片</span> <span>上传图片</span>
</a-button> </a-button>
</a-upload> </a-upload>
<a-upload
v-else
:show-upload-list="false"
:accept="'image/*,application/*,text/*'"
:customRequest="onUpload"
>
<a-button type="primary" class="ele-btn-icon">
<template #icon>
<UploadOutlined />
</template>
<span>上传文件</span>
</a-button>
</a-upload>
<a-select <a-select
show-search show-search
allow-clear allow-clear
@@ -274,16 +287,36 @@
// 上传文件 // 上传文件
const onUpload = (item) => { const onUpload = (item) => {
const { file } = item; const { file } = item;
if (!file.type.startsWith('image') && props.type != 'video') {
message.error('只能选择图片');
return;
}
if (props.type == 'video') { if (props.type == 'video') {
if (!file.type.startsWith('video')) {
message.error('只能选择视频');
return;
}
if (file.size / 1024 / 1024 > 100) { if (file.size / 1024 / 1024 > 100) {
message.error('大小不能超过 100MB'); message.error('大小不能超过 100MB');
return; return;
} }
} else if (props.type == 'image') {
if (!file.type.startsWith('image')) {
message.error('只能选择图片');
return;
}
if (file.size / 1024 / 1024 > 10) {
message.error('大小不能超过 10MB');
return;
}
} else { } else {
// 默认:允许图片/文档等附件
const isAllowed =
file.type.startsWith('image') ||
file.type.startsWith('application') ||
file.type.startsWith('text') ||
file.type === 'application/octet-stream' ||
file.type === '';
if (!isAllowed) {
message.error('只能选择图片或文件');
return;
}
if (file.size / 1024 / 1024 > 10) { if (file.size / 1024 / 1024 > 10) {
message.error('大小不能超过 10MB'); message.error('大小不能超过 10MB');
return; return;

View File

@@ -16,7 +16,16 @@
</a> </a>
</div> </div>
<div v-else class="image-upload-item"> <div v-else class="image-upload-item">
<YoutubeOutlined /> <a
class="file-item"
:href="stripOssImageProcess(item.url)"
target="_blank"
rel="noopener noreferrer"
:style="{ width: width + 'px', height: height + 'px' }"
>
<FileOutlined />
<span class="file-name">{{ item.name || guessNameFromUrl(item.url) }}</span>
</a>
<a class="image-upload-close" @click="onDeleteItem(index)"> <a class="image-upload-close" @click="onDeleteItem(index)">
<CloseOutlined /> <CloseOutlined />
</a> </a>
@@ -47,12 +56,12 @@
import { import {
PlusOutlined, PlusOutlined,
CloseOutlined, CloseOutlined,
YoutubeOutlined FileOutlined
} from '@ant-design/icons-vue'; } from '@ant-design/icons-vue';
import { ref } from 'vue'; import { ref } from 'vue';
import SelectData from './components/select-data.vue'; import SelectData from './components/select-data.vue';
import { FileRecord } from '@/api/system/file/model'; import { FileRecord } from '@/api/system/file/model';
import { isImage } from '@/utils/common'; import { isImage, stripOssImageProcess } from '@/utils/common';
const props = withDefaults( const props = withDefaults(
defineProps<{ defineProps<{
@@ -98,6 +107,16 @@
const onDeleteItem = (index: number) => { const onDeleteItem = (index: number) => {
emit('del', index); emit('del', index);
}; };
const guessNameFromUrl = (url: string) => {
const cleanUrl = (url?.split('?')[0] ?? '').trim();
const last = cleanUrl.split('/').pop() || '';
try {
return decodeURIComponent(last) || url;
} catch {
return last || url;
}
};
</script> </script>
<style lang="less" scoped> <style lang="less" scoped>
.select-picture-btn { .select-picture-btn {
@@ -112,6 +131,21 @@
.image-upload-item { .image-upload-item {
position: relative; position: relative;
} }
.file-item {
display: inline-flex;
align-items: center;
gap: 6px;
border: 1px dashed var(--grey-7);
padding: 0 10px;
border-radius: 4px;
max-width: 240px;
color: inherit;
}
.file-name {
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.image-upload-close { .image-upload-close {
width: 18px; width: 18px;
height: 18px; height: 18px;

View File

@@ -0,0 +1,106 @@
<template>
<ele-modal
:width="800"
:visible="visible"
:maskClosable="false"
:title="title"
:footer="null"
:body-style="{ paddingBottom: '28px' }"
@update:visible="updateVisible"
>
<ele-pro-table
ref="tableRef"
row-key="id"
:datasource="datasource"
:columns="columns"
:pagination="false"
>
<template #toolbar>
<a-space>
<a-input-search
allow-clear
v-model:value="where.keywords"
placeholder="请输入门店关键词"
style="width: 240px"
@search="reload"
@pressEnter="reload"
/>
</a-space>
</template>
<template #bodyCell="{ column, record }">
<template v-if="column.key === 'action'">
<a-space>
<a-button type="primary" @click="done(record)">选择</a-button>
</a-space>
</template>
</template>
</ele-pro-table>
</ele-modal>
</template>
<script lang="ts" setup>
import { ref } from 'vue';
import type {
ColumnItem,
DatasourceFunction
} from 'ele-admin-pro/es/ele-pro-table/types';
import { EleProTable } from 'ele-admin-pro';
import useSearch from '@/utils/use-search';
import { pageShopStore } from '@/api/shop/shopStore';
import type { ShopStoreParam } from '@/api/shop/shopStore/model';
import type { ShopStore } from '@/api/shop/shopStore/model';
defineProps<{
visible: boolean;
title?: string;
}>();
const emit = defineEmits<{
(e: 'done', data: ShopStore): void;
(e: 'update:visible', visible: boolean): void;
}>();
const updateVisible = (value: boolean) => {
emit('update:visible', value);
};
const { where } = useSearch<ShopStoreParam>({
id: undefined,
keywords: ''
});
const tableRef = ref<InstanceType<typeof EleProTable> | null>(null);
const columns = ref<ColumnItem[]>([
{ title: 'ID', dataIndex: 'id', width: 90 },
{ title: '门店名称', dataIndex: 'name' },
{ title: '电话', dataIndex: 'phone', width: 160 },
{ title: '地址', dataIndex: 'address' },
{
title: '操作',
key: 'action',
width: 120,
align: 'center',
hideInSetting: true
}
]);
const datasource: DatasourceFunction = ({ page, limit, where, orders }) => {
return pageShopStore({
...where,
...orders,
page,
limit
});
};
const reload = () => {
tableRef?.value?.reload({ page: 1, where: where as ShopStoreParam });
};
const done = (record: ShopStore) => {
updateVisible(false);
emit('done', record);
};
</script>

View File

@@ -0,0 +1,63 @@
<template>
<div>
<a-input-group compact>
<a-input
disabled
style="width: calc(100% - 32px)"
v-model:value="content"
:placeholder="placeholder"
/>
<a-button @click="openEdit">
<template #icon><BulbOutlined class="ele-text-warning" /></template>
</a-button>
</a-input-group>
<!-- 选择弹窗 -->
<SelectData
v-model:visible="showEdit"
:title="placeholder"
@done="onChange"
/>
</div>
</template>
<script lang="ts" setup>
import { BulbOutlined } from '@ant-design/icons-vue';
import { ref, watch } from 'vue';
import SelectData from './components/select-data.vue';
import type { ShopStore } from '@/api/shop/shopStore/model';
const props = withDefaults(
defineProps<{
value?: string;
placeholder?: string;
}>(),
{
placeholder: '选择门店'
}
);
const emit = defineEmits<{
(e: 'done', data?: ShopStore): void;
(e: 'clear'): void;
}>();
const showEdit = ref(false);
const content = ref<string>(props.value ?? '');
const openEdit = () => {
showEdit.value = true;
};
const onChange = (row?: ShopStore) => {
showEdit.value = false;
emit('done', row);
};
watch(
() => props.value,
(v) => {
content.value = v ?? '';
}
);
</script>

View File

@@ -444,6 +444,24 @@ export const isImage = (fileName) => {
}); });
}; };
// 移除 OSS 图片处理参数(非图片文件拼接该参数会导致访问失败)
export const stripOssImageProcess = (url?: string) => {
if (!url) return url;
const hashIndex = url.indexOf('#');
const withNoHash = hashIndex >= 0 ? url.slice(0, hashIndex) : url;
const hash = hashIndex >= 0 ? url.slice(hashIndex) : '';
const queryIndex = withNoHash.indexOf('?');
if (queryIndex < 0) return url;
const base = withNoHash.slice(0, queryIndex);
const query = withNoHash.slice(queryIndex + 1);
const kept = query
.split('&')
.filter(Boolean)
.filter((p) => p !== 'x-oss-process' && !p.startsWith('x-oss-process='));
const rebuilt = kept.length ? `${base}?${kept.join('&')}` : base;
return `${rebuilt}${hash}`;
};
export const getWeek = (text) => { export const getWeek = (text) => {
const week = [ const week = [
'星期日', '星期日',

View File

@@ -1,12 +1,12 @@
<!-- 信用模块通用工具栏 --> <!-- 信用模块通用工具栏 -->
<template> <template>
<a-space :size="10" style="flex-wrap: wrap"> <a-space :size="10" style="flex-wrap: wrap">
<a-button type="primary" class="ele-btn-icon" @click="add"> <!-- <a-button type="primary" class="ele-btn-icon" @click="add">-->
<template #icon> <!-- <template #icon>-->
<PlusOutlined /> <!-- <PlusOutlined />-->
</template> <!-- </template>-->
<span>添加</span> <!-- <span>添加</span>-->
</a-button> <!-- </a-button>-->
<a-button class="ele-btn-icon" @click="openImport"> <a-button class="ele-btn-icon" @click="openImport">
<template #icon> <template #icon>
<CloudUploadOutlined /> <CloudUploadOutlined />
@@ -19,6 +19,7 @@
</template> </template>
<span>导出</span> <span>导出</span>
</a-button> </a-button>
<RefreshCompanyIdButton :module="props.module" @done="reload" />
<a-button <a-button
danger danger
class="ele-btn-icon" class="ele-btn-icon"
@@ -44,14 +45,16 @@
<script lang="ts" setup> <script lang="ts" setup>
import { computed, ref } from 'vue'; import { computed, ref } from 'vue';
import { import {
PlusOutlined,
CloudUploadOutlined, CloudUploadOutlined,
CloudDownloadOutlined, CloudDownloadOutlined,
DeleteOutlined DeleteOutlined
} from '@ant-design/icons-vue'; } from '@ant-design/icons-vue';
import RefreshCompanyIdButton from '@/views/credit/components/RefreshCompanyIdButton.vue';
const props = withDefaults( const props = withDefaults(
defineProps<{ defineProps<{
/** 后端模块路径片段,如: credit-breach-of-trust */
module: string;
selection?: any[]; selection?: any[];
}>(), }>(),
{ {
@@ -71,16 +74,16 @@
const keywords = ref(''); const keywords = ref('');
const selection = computed(() => props.selection || []); const selection = computed(() => props.selection || []);
// 新增
const add = () => {
emit('add');
};
// 搜索 // 搜索
const handleSearch = () => { const handleSearch = () => {
emit('search', { keywords: keywords.value }); emit('search', { keywords: keywords.value });
}; };
// 刷新 companyId 后,保持当前条件并触发父级 reload
const reload = () => {
emit('search', { keywords: keywords.value });
};
// 导入 // 导入
const openImport = () => { const openImport = () => {
emit('importData'); emit('importData');

View File

@@ -0,0 +1,87 @@
<!-- 信用模块通用工具栏 -->
<template>
<a-space :size="10" style="flex-wrap: wrap">
<a-button class="ele-btn-icon" @click="exportData">
<template #icon>
<CloudDownloadOutlined />
</template>
<span>导出</span>
</a-button>
<a-button
danger
class="ele-btn-icon"
:disabled="!selection?.length"
@click="remove"
>
<template #icon>
<DeleteOutlined />
</template>
<span>批量删除</span>
</a-button>
<a-input-search
allow-clear
v-model:value="keywords"
placeholder="请输入关键词"
style="width: 220px"
@search="handleSearch"
@pressEnter="handleSearch"
/>
</a-space>
</template>
<script lang="ts" setup>
import { computed, ref } from 'vue';
import {
PlusOutlined,
CloudUploadOutlined,
CloudDownloadOutlined,
DeleteOutlined
} from '@ant-design/icons-vue';
import RefreshCompanyIdButton from "@/views/credit/components/RefreshCompanyIdButton.vue";
const props = withDefaults(
defineProps<{
selection?: any[];
}>(),
{
selection: () => []
}
);
const emit = defineEmits<{
(e: 'search', where?: { keywords?: string }): void;
(e: 'add'): void;
(e: 'remove'): void;
(e: 'batchMove'): void;
(e: 'importData'): void;
(e: 'exportData'): void;
}>();
const keywords = ref('');
const selection = computed(() => props.selection || []);
// 新增
const add = () => {
emit('add');
};
// 搜索
const handleSearch = () => {
emit('search', { keywords: keywords.value });
};
// 导入
const openImport = () => {
emit('importData');
};
// 导出
const exportData = () => {
emit('exportData');
};
// 批量删除
const remove = () => {
emit('remove');
};
</script>

View File

@@ -0,0 +1,59 @@
<template>
<a-button class="ele-btn-icon" @click="confirmRefresh">
修正主体企业归属
</a-button>
</template>
<script lang="ts" setup>
import { createVNode } from 'vue';
import { message, Modal } from 'ant-design-vue';
import { ExclamationCircleOutlined } from '@ant-design/icons-vue';
import { refreshCreditCompanyId } from '@/api/credit/companyId';
const props = withDefaults(
defineProps<{
/** 后端模块路径片段,如: credit-breach-of-trust */
module: string;
/** 默认 true仅更新 companyId 为空/0 的数据(由后端实现决定) */
onlyNull?: boolean;
/** 可选,限制处理条数 */
limit?: number;
/** 确认弹窗文案 */
content?: string;
}>(),
{
onlyNull: true,
content:
'将按记录名称匹配企业名称并回填 companyId默认仅更新 companyId 为0的数据确定要执行吗'
}
);
const emit = defineEmits<{
(e: 'done'): void;
}>();
const confirmRefresh = () => {
Modal.confirm({
title: '提示',
content: props.content,
icon: createVNode(ExclamationCircleOutlined),
maskClosable: true,
onOk: () => {
const hide = message.loading('请求中..', 0);
return refreshCreditCompanyId(props.module, {
onlyNull: props.onlyNull,
limit: props.limit
})
.then((msg) => {
hide();
message.success(msg || '操作成功');
emit('done');
})
.catch((e) => {
hide();
message.error(e.message);
});
}
});
};
</script>

View File

@@ -0,0 +1,97 @@
<!-- 历史行政许可导入弹窗 -->
<template>
<ele-modal
:width="520"
:footer="null"
title="历史行政许可批量导入"
:visible="visible"
@update:visible="updateVisible"
>
<a-spin :spinning="loading">
<a-upload-dragger
accept=".xls,.xlsx"
:show-upload-list="false"
:customRequest="doUpload"
style="padding: 24px 0; margin-bottom: 16px"
>
<p class="ant-upload-drag-icon">
<cloud-upload-outlined />
</p>
<p class="ant-upload-hint">将文件拖到此处或点击上传</p>
</a-upload-dragger>
</a-spin>
<div class="ele-text-center">
<span>只能上传xlsxlsx文件</span>
<a :href="templateUrl" download="历史行政许可导入模板.xlsx">
下载导入模板
</a>
</div>
</ele-modal>
</template>
<script lang="ts" setup>
import { computed, ref } from 'vue';
import { message } from 'ant-design-vue/es';
import { CloudUploadOutlined } from '@ant-design/icons-vue';
import { importCreditAdministrativeLicenseHistory } from '@/api/credit/creditAdministrativeLicense';
import { API_BASE_URL } from '@/config/setting';
const emit = defineEmits<{
(e: 'done'): void;
(e: 'update:visible', visible: boolean): void;
}>();
const props = defineProps<{
// 是否打开弹窗
visible: boolean;
// 关联企业ID企业详情下导入时需要
companyId?: number;
}>();
// 导入请求状态
const loading = ref(false);
// 模板下载地址,保持与当前接口域名一致
const templateUrl = computed(() => {
const base = (localStorage.getItem('ApiUrl') || API_BASE_URL || '').replace(
/\/$/,
''
);
return `${base}/credit/credit-administrative-license/import/history/template`;
});
/* 上传 */
const doUpload = ({ file }) => {
if (
![
'application/vnd.ms-excel',
'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'
].includes(file.type)
) {
message.error('只能选择 excel 文件');
return false;
}
if (file.size / 1024 / 1024 > 10) {
message.error('大小不能超过 10MB');
return false;
}
loading.value = true;
importCreditAdministrativeLicenseHistory(file, props.companyId)
.then((msg) => {
loading.value = false;
message.success(msg);
updateVisible(false);
emit('done');
})
.catch((e) => {
loading.value = false;
message.error(e.message);
});
return false;
};
/* 更新 visible */
const updateVisible = (value: boolean) => {
emit('update:visible', value);
};
</script>

View File

@@ -1,13 +1,14 @@
<!-- 编辑弹窗 --> <!-- 编辑弹窗 -->
<template> <template>
<ele-modal <ele-modal
:width="800" width="70%"
:visible="visible" :visible="visible"
:maskClosable="false" :maskClosable="false"
:maxable="maxable" :maxable="maxable"
:title="isUpdate ? '编辑行政许可' : '添加行政许可'" :title="isUpdate ? '行政许可详情' : '添加行政许可'"
:body-style="{ paddingBottom: '28px' }" :body-style="{ paddingBottom: '28px' }"
@update:visible="updateVisible" @update:visible="updateVisible"
:footer="null"
@ok="save" @ok="save"
> >
<a-form <a-form
@@ -47,13 +48,6 @@
v-model:value="form.type" v-model:value="form.type"
/> />
</a-form-item> </a-form-item>
<a-form-item label="链接" name="url">
<a-input
allow-clear
placeholder="请输入链接"
v-model:value="form.url"
/>
</a-form-item>
<a-form-item label="有效期自" name="validityStart"> <a-form-item label="有效期自" name="validityStart">
<a-input <a-input
allow-clear allow-clear
@@ -89,64 +83,6 @@
v-model:value="form.dataSourceUnit" v-model:value="form.dataSourceUnit"
/> />
</a-form-item> </a-form-item>
<a-form-item label="备注" name="comments">
<a-textarea
:rows="4"
:maxlength="200"
placeholder="请输入描述"
v-model:value="form.comments"
/>
</a-form-item>
<a-form-item label="企业ID" name="companyId">
<a-input
allow-clear
placeholder="请输入企业ID"
v-model:value="form.companyId"
/>
</a-form-item>
<a-form-item label="是否推荐" name="recommend">
<a-input
allow-clear
placeholder="请输入是否推荐"
v-model:value="form.recommend"
/>
</a-form-item>
<a-form-item label="排序(数字越小越靠前)" name="sortNumber">
<a-input-number
:min="0"
:max="9999"
class="ele-fluid"
placeholder="请输入排序号"
v-model:value="form.sortNumber"
/>
</a-form-item>
<a-form-item label="状态, 0正常, 1冻结" name="status">
<a-radio-group v-model:value="form.status">
<a-radio :value="0">显示</a-radio>
<a-radio :value="1">隐藏</a-radio>
</a-radio-group>
</a-form-item>
<a-form-item label="是否删除, 0否, 1是" name="deleted">
<a-input
allow-clear
placeholder="请输入是否删除, 0否, 1是"
v-model:value="form.deleted"
/>
</a-form-item>
<a-form-item label="用户ID" name="userId">
<a-input
allow-clear
placeholder="请输入用户ID"
v-model:value="form.userId"
/>
</a-form-item>
<a-form-item label="修改时间" name="updateTime">
<a-input
allow-clear
placeholder="请输入修改时间"
v-model:value="form.updateTime"
/>
</a-form-item>
</a-form> </a-form>
</ele-modal> </ele-modal>
</template> </template>

View File

@@ -7,21 +7,32 @@
:columns="columns" :columns="columns"
:datasource="datasource" :datasource="datasource"
:customRow="customRow" :customRow="customRow"
v-model:selection="selection"
:scroll="{ x: 2400 }"
tool-class="ele-toolbar-form" tool-class="ele-toolbar-form"
class="sys-org-table" class="sys-org-table"
> >
<template #toolbar> <template #toolbar>
<search <a-space class="flex">
@search="reload" <RefreshCompanyIdButton
:selection="selection" module="credit-administrative-license"
@add="openEdit" @done="reload"
@remove="removeBatch" />
@batchMove="openMove" <search
@importData="openImport" @search="reload"
@exportData="exportData" :selection="selection"
/> @add="openEdit"
@remove="removeBatch"
@batchMove="openMove"
@importData="openImport"
@exportData="exportData"
/>
</a-space>
</template> </template>
<template #bodyCell="{ column, record }"> <template #bodyCell="{ column, record }">
<template v-if="column.key === 'companyName'">
{{ record.companyName || '-' }}
</template>
<template v-if="column.key === 'image'"> <template v-if="column.key === 'image'">
<a-image :src="record.image" :width="50" /> <a-image :src="record.image" :width="50" />
</template> </template>
@@ -77,7 +88,8 @@
DatasourceFunction, DatasourceFunction,
ColumnItem ColumnItem
} from 'ele-admin-pro/es/ele-pro-table/types'; } from 'ele-admin-pro/es/ele-pro-table/types';
import Search from '@/views/credit/components/CreditSearchToolbar.vue'; import Search from '@/views/credit/components/CreditSearchToolbar2.vue';
import RefreshCompanyIdButton from '@/views/credit/components/RefreshCompanyIdButton.vue';
import { exportCreditData } from '../utils/export'; import { exportCreditData } from '../utils/export';
import { getPageTitle } from '@/utils/common'; import { getPageTitle } from '@/utils/common';
import CreditAdministrativeLicenseEdit from './components/creditAdministrativeLicenseEdit.vue'; import CreditAdministrativeLicenseEdit from './components/creditAdministrativeLicenseEdit.vue';
@@ -142,47 +154,45 @@
key: 'id', key: 'id',
width: 90 width: 90
}, },
{
title: '主体企业',
dataIndex: 'companyName',
key: 'companyName'
},
{ {
title: '决定文书/许可编号', title: '决定文书/许可编号',
dataIndex: 'code', dataIndex: 'code',
key: 'code', key: 'code'
ellipsis: true
}, },
{ {
title: '决定文书/许可证名称', title: '决定文书/许可证名称',
dataIndex: 'name', dataIndex: 'name',
key: 'name', key: 'name'
ellipsis: true
}, },
{ {
title: '许可状态', title: '许可状态',
dataIndex: 'statusText', dataIndex: 'statusText',
key: 'statusText', key: 'statusText'
ellipsis: true
}, },
{ {
title: '许可类型', title: '许可类型',
dataIndex: 'type', dataIndex: 'type',
key: 'type', key: 'type'
ellipsis: true
}, },
{ {
title: '有效期自', title: '有效期自',
dataIndex: 'validityStart', dataIndex: 'validityStart',
key: 'validityStart', key: 'validityStart'
ellipsis: true
}, },
{ {
title: '有效期至', title: '有效期至',
dataIndex: 'validityEnd', dataIndex: 'validityEnd',
key: 'validityEnd', key: 'validityEnd'
ellipsis: true
}, },
{ {
title: '许可机关', title: '许可机关',
dataIndex: 'licensingAuthority', dataIndex: 'licensingAuthority',
key: 'licensingAuthority', key: 'licensingAuthority'
ellipsis: true
}, },
{ {
title: '许可内容', title: '许可内容',
@@ -193,8 +203,14 @@
{ {
title: '数据来源单位', title: '数据来源单位',
dataIndex: 'dataSourceUnit', dataIndex: 'dataSourceUnit',
key: 'dataSourceUnit', key: 'dataSourceUnit'
ellipsis: true },
{
title: '操作人',
dataIndex: 'realName',
key: 'realName',
width: 90,
align: 'center'
}, },
{ {
title: '创建时间', title: '创建时间',
@@ -205,15 +221,15 @@
sorter: true, sorter: true,
ellipsis: true, ellipsis: true,
customRender: ({ text }) => toDateString(text, 'yyyy-MM-dd HH:mm:ss') customRender: ({ text }) => toDateString(text, 'yyyy-MM-dd HH:mm:ss')
},
{
title: '操作',
key: 'action',
width: 180,
fixed: 'right',
align: 'center',
hideInSetting: true
} }
// {
// title: '操作',
// key: 'action',
// width: 180,
// fixed: 'right',
// align: 'center',
// hideInSetting: true
// }
]); ]);
/* 搜索 */ /* 搜索 */
@@ -251,21 +267,12 @@
{ title: '决定文书/许可编号', dataIndex: 'code' }, { title: '决定文书/许可编号', dataIndex: 'code' },
{ title: '决定文书/许可证名称', dataIndex: 'name' }, { title: '决定文书/许可证名称', dataIndex: 'name' },
{ title: '许可状态', dataIndex: 'statusText' }, { title: '许可状态', dataIndex: 'statusText' },
{ title: '许可类', dataIndex: 'type' }, { title: '许可类', dataIndex: 'type' },
{ title: '有效期自', dataIndex: 'validityStart' }, { title: '有效期自', dataIndex: 'validityStart' },
{ title: '有效期至', dataIndex: 'validityEnd' }, { title: '有效期至', dataIndex: 'validityEnd' },
{ title: '许可机关', dataIndex: 'licensingAuthority' }, { title: '许可机关', dataIndex: 'licensingAuthority' },
{ title: '许可内容', dataIndex: 'licenseContent' }, { title: '许可内容', dataIndex: 'licenseContent' },
{ title: '数据来源单位', dataIndex: 'dataSourceUnit' }, { title: '数据来源单位', dataIndex: 'dataSourceUnit' }
{ title: '备注', dataIndex: 'comments' },
{
title: '创建时间',
dataIndex: 'createTime',
formatter: (record: CreditAdministrativeLicense) =>
record.createTime
? toDateString(record.createTime, 'yyyy-MM-dd HH:mm:ss')
: ''
}
], ],
fetchData: () => fetchData: () =>
listCreditAdministrativeLicense({ listCreditAdministrativeLicense({

View File

@@ -0,0 +1,97 @@
<!-- 历史破产重整导入弹窗 -->
<template>
<ele-modal
:width="520"
:footer="null"
title="历史破产重整批量导入"
:visible="visible"
@update:visible="updateVisible"
>
<a-spin :spinning="loading">
<a-upload-dragger
accept=".xls,.xlsx"
:show-upload-list="false"
:customRequest="doUpload"
style="padding: 24px 0; margin-bottom: 16px"
>
<p class="ant-upload-drag-icon">
<cloud-upload-outlined />
</p>
<p class="ant-upload-hint">将文件拖到此处或点击上传</p>
</a-upload-dragger>
</a-spin>
<div class="ele-text-center">
<span>只能上传xlsxlsx文件</span>
<a :href="templateUrl" download="历史破产重整导入模板.xlsx">
下载导入模板
</a>
</div>
</ele-modal>
</template>
<script lang="ts" setup>
import { computed, ref } from 'vue';
import { message } from 'ant-design-vue/es';
import { CloudUploadOutlined } from '@ant-design/icons-vue';
import { importCreditBankruptcyHistory } from '@/api/credit/creditBankruptcy';
import { API_BASE_URL } from '@/config/setting';
const emit = defineEmits<{
(e: 'done'): void;
(e: 'update:visible', visible: boolean): void;
}>();
const props = defineProps<{
// 是否打开弹窗
visible: boolean;
// 关联企业ID企业详情下导入时需要
companyId?: number;
}>();
// 导入请求状态
const loading = ref(false);
// 模板下载地址,保持与当前接口域名一致
const templateUrl = computed(() => {
const base = (localStorage.getItem('ApiUrl') || API_BASE_URL || '').replace(
/\/$/,
''
);
return `${base}/credit/credit-bankruptcy/import/history/template`;
});
/* 上传 */
const doUpload = ({ file }) => {
if (
![
'application/vnd.ms-excel',
'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'
].includes(file.type)
) {
message.error('只能选择 excel 文件');
return false;
}
if (file.size / 1024 / 1024 > 10) {
message.error('大小不能超过 10MB');
return false;
}
loading.value = true;
importCreditBankruptcyHistory(file, props.companyId)
.then((msg) => {
loading.value = false;
message.success(msg);
updateVisible(false);
emit('done');
})
.catch((e) => {
loading.value = false;
message.error(e.message);
});
return false;
};
/* 更新 visible */
const updateVisible = (value: boolean) => {
emit('update:visible', value);
};
</script>

View File

@@ -7,21 +7,28 @@
:columns="columns" :columns="columns"
:datasource="datasource" :datasource="datasource"
:customRow="customRow" :customRow="customRow"
v-model:selection="selection"
tool-class="ele-toolbar-form" tool-class="ele-toolbar-form"
class="sys-org-table" class="sys-org-table"
> >
<template #toolbar> <template #toolbar>
<search <a-space class="flex">
@search="reload" <RefreshCompanyIdButton module="credit-bankruptcy" @done="reload" />
:selection="selection" <search
@add="openEdit" @search="reload"
@remove="removeBatch" :selection="selection"
@batchMove="openMove" @add="openEdit"
@importData="openImport" @remove="removeBatch"
@exportData="exportData" @batchMove="openMove"
/> @importData="openImport"
@exportData="exportData"
/>
</a-space>
</template> </template>
<template #bodyCell="{ column, record }"> <template #bodyCell="{ column, record }">
<template v-if="column.key === 'companyName'">
{{ record.companyName || '-' }}
</template>
<template v-if="column.key === 'image'"> <template v-if="column.key === 'image'">
<a-image :src="record.image" :width="50" /> <a-image :src="record.image" :width="50" />
</template> </template>
@@ -74,7 +81,8 @@
DatasourceFunction, DatasourceFunction,
ColumnItem ColumnItem
} from 'ele-admin-pro/es/ele-pro-table/types'; } from 'ele-admin-pro/es/ele-pro-table/types';
import Search from '@/views/credit/components/CreditSearchToolbar.vue'; import Search from '@/views/credit/components/CreditSearchToolbar2.vue';
import RefreshCompanyIdButton from '@/views/credit/components/RefreshCompanyIdButton.vue';
import { exportCreditData } from '../utils/export'; import { exportCreditData } from '../utils/export';
import { getPageTitle } from '@/utils/common'; import { getPageTitle } from '@/utils/common';
import CreditBankruptcyEdit from './components/creditBankruptcyEdit.vue'; import CreditBankruptcyEdit from './components/creditBankruptcyEdit.vue';
@@ -139,35 +147,42 @@
key: 'id', key: 'id',
width: 90 width: 90
}, },
{
title: '主体企业',
dataIndex: 'companyName',
key: 'companyName'
},
{ {
title: '案号', title: '案号',
dataIndex: 'code', dataIndex: 'code',
key: 'code', key: 'code'
ellipsis: true
}, },
{ {
title: '案件类型', title: '案件类型',
dataIndex: 'type', dataIndex: 'type',
key: 'type', key: 'type'
ellipsis: true
}, },
{ {
title: '当事人', title: '当事人',
dataIndex: 'party', dataIndex: 'party',
key: 'party', key: 'party'
ellipsis: true
}, },
{ {
title: '经办法院', title: '经办法院',
dataIndex: 'court', dataIndex: 'court',
key: 'court', key: 'court'
ellipsis: true
}, },
{ {
title: '公开日期', title: '公开日期',
dataIndex: 'publicDate', dataIndex: 'publicDate',
key: 'publicDate', key: 'publicDate'
ellipsis: true },
{
title: '操作人',
dataIndex: 'realName',
key: 'realName',
width: 90,
align: 'center'
}, },
{ {
title: '创建时间', title: '创建时间',
@@ -178,15 +193,15 @@
sorter: true, sorter: true,
ellipsis: true, ellipsis: true,
customRender: ({ text }) => toDateString(text, 'yyyy-MM-dd HH:mm:ss') customRender: ({ text }) => toDateString(text, 'yyyy-MM-dd HH:mm:ss')
},
{
title: '操作',
key: 'action',
width: 180,
fixed: 'right',
align: 'center',
hideInSetting: true
} }
// {
// title: '操作',
// key: 'action',
// width: 180,
// fixed: 'right',
// align: 'center',
// hideInSetting: true
// }
]); ]);
/* 搜索 */ /* 搜索 */
@@ -299,7 +314,7 @@
}, },
// 行双击事件 // 行双击事件
onDblclick: () => { onDblclick: () => {
openEdit(record); // openEdit(record);
} }
}; };
}; };

View File

@@ -7,21 +7,28 @@
:columns="columns" :columns="columns"
:datasource="datasource" :datasource="datasource"
:customRow="customRow" :customRow="customRow"
v-model:selection="selection"
tool-class="ele-toolbar-form" tool-class="ele-toolbar-form"
class="sys-org-table" class="sys-org-table"
> >
<template #toolbar> <template #toolbar>
<search <a-space class="flex">
@search="reload" <RefreshCompanyIdButton module="credit-branch" @done="reload" />
:selection="selection" <search
@add="openEdit" @search="reload"
@remove="removeBatch" :selection="selection"
@batchMove="openMove" @add="openEdit"
@importData="openImport" @remove="removeBatch"
@exportData="exportData" @batchMove="openMove"
/> @importData="openImport"
@exportData="exportData"
/>
</a-space>
</template> </template>
<template #bodyCell="{ column, record }"> <template #bodyCell="{ column, record }">
<template v-if="column.key === 'companyName'">
{{ record.companyName || '-' }}
</template>
<template v-if="column.key === 'image'"> <template v-if="column.key === 'image'">
<a-image :src="record.image" :width="50" /> <a-image :src="record.image" :width="50" />
</template> </template>
@@ -74,7 +81,8 @@
DatasourceFunction, DatasourceFunction,
ColumnItem ColumnItem
} from 'ele-admin-pro/es/ele-pro-table/types'; } from 'ele-admin-pro/es/ele-pro-table/types';
import Search from '@/views/credit/components/CreditSearchToolbar.vue'; import Search from '@/views/credit/components/CreditSearchToolbar2.vue';
import RefreshCompanyIdButton from '@/views/credit/components/RefreshCompanyIdButton.vue';
import { exportCreditData } from '../utils/export'; import { exportCreditData } from '../utils/export';
import { getPageTitle } from '@/utils/common'; import { getPageTitle } from '@/utils/common';
import CreditBranchEdit from './components/creditBranchEdit.vue'; import CreditBranchEdit from './components/creditBranchEdit.vue';
@@ -139,11 +147,15 @@
key: 'id', key: 'id',
width: 90 width: 90
}, },
{
title: '主体企业',
dataIndex: 'companyName',
key: 'companyName'
},
{ {
title: '分支机构名称', title: '分支机构名称',
dataIndex: 'name', dataIndex: 'name',
key: 'name', key: 'name'
ellipsis: true
}, },
{ {
title: '负责人', title: '负责人',
@@ -169,6 +181,13 @@
key: 'statusText', key: 'statusText',
ellipsis: true ellipsis: true
}, },
{
title: '操作人',
dataIndex: 'realName',
key: 'realName',
width: 90,
align: 'center'
},
{ {
title: '创建时间', title: '创建时间',
dataIndex: 'createTime', dataIndex: 'createTime',
@@ -178,15 +197,15 @@
sorter: true, sorter: true,
ellipsis: true, ellipsis: true,
customRender: ({ text }) => toDateString(text, 'yyyy-MM-dd HH:mm:ss') customRender: ({ text }) => toDateString(text, 'yyyy-MM-dd HH:mm:ss')
},
{
title: '操作',
key: 'action',
width: 180,
fixed: 'right',
align: 'center',
hideInSetting: true
} }
// {
// title: '操作',
// key: 'action',
// width: 180,
// fixed: 'right',
// align: 'center',
// hideInSetting: true
// }
]); ]);
/* 搜索 */ /* 搜索 */
@@ -226,7 +245,6 @@
{ title: '地区', dataIndex: 'region' }, { title: '地区', dataIndex: 'region' },
{ title: '成立日期', dataIndex: 'establishDate' }, { title: '成立日期', dataIndex: 'establishDate' },
{ title: '状态', dataIndex: 'statusText' }, { title: '状态', dataIndex: 'statusText' },
{ title: '备注', dataIndex: 'comments' },
{ {
title: '创建时间', title: '创建时间',
dataIndex: 'createTime', dataIndex: 'createTime',
@@ -299,7 +317,7 @@
}, },
// 行双击事件 // 行双击事件
onDblclick: () => { onDblclick: () => {
openEdit(record); // openEdit(record);
} }
}; };
}; };

View File

@@ -0,0 +1,97 @@
<!-- 历史失信被执行人导入弹窗 -->
<template>
<ele-modal
:width="520"
:footer="null"
title="历史失信被执行人批量导入"
:visible="visible"
@update:visible="updateVisible"
>
<a-spin :spinning="loading">
<a-upload-dragger
accept=".xls,.xlsx"
:show-upload-list="false"
:customRequest="doUpload"
style="padding: 24px 0; margin-bottom: 16px"
>
<p class="ant-upload-drag-icon">
<cloud-upload-outlined />
</p>
<p class="ant-upload-hint">将文件拖到此处或点击上传</p>
</a-upload-dragger>
</a-spin>
<div class="ele-text-center">
<span>只能上传xlsxlsx文件</span>
<a :href="templateUrl" download="历史失信被执行人导入模板.xlsx">
下载导入模板
</a>
</div>
</ele-modal>
</template>
<script lang="ts" setup>
import { computed, ref } from 'vue';
import { message } from 'ant-design-vue/es';
import { CloudUploadOutlined } from '@ant-design/icons-vue';
import { importCreditBreachOfTrustHistory } from '@/api/credit/creditBreachOfTrust';
import { API_BASE_URL } from '@/config/setting';
const emit = defineEmits<{
(e: 'done'): void;
(e: 'update:visible', visible: boolean): void;
}>();
const props = defineProps<{
// 是否打开弹窗
visible: boolean;
// 关联企业ID企业详情下导入时需要
companyId?: number;
}>();
// 导入请求状态
const loading = ref(false);
// 模板下载地址,保持与当前接口域名一致
const templateUrl = computed(() => {
const base = (localStorage.getItem('ApiUrl') || API_BASE_URL || '').replace(
/\/$/,
''
);
return `${base}/credit/credit-breach-of-trust/import/history/template`;
});
/* 上传 */
const doUpload = ({ file }) => {
if (
![
'application/vnd.ms-excel',
'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'
].includes(file.type)
) {
message.error('只能选择 excel 文件');
return false;
}
if (file.size / 1024 / 1024 > 10) {
message.error('大小不能超过 10MB');
return false;
}
loading.value = true;
importCreditBreachOfTrustHistory(file, props.companyId)
.then((msg) => {
loading.value = false;
message.success(msg);
updateVisible(false);
emit('done');
})
.catch((e) => {
loading.value = false;
message.error(e.message);
});
return false;
};
/* 更新 visible */
const updateVisible = (value: boolean) => {
emit('update:visible', value);
};
</script>

View File

@@ -7,21 +7,28 @@
:columns="columns" :columns="columns"
:datasource="datasource" :datasource="datasource"
:customRow="customRow" :customRow="customRow"
v-model:selection="selection"
tool-class="ele-toolbar-form" tool-class="ele-toolbar-form"
class="sys-org-table" class="sys-org-table"
> >
<template #toolbar> <template #toolbar>
<search <a-space class="flex">
@search="reload" <search
:selection="selection" @search="reload"
@add="openEdit" module="credit-breach-of-trust"
@remove="removeBatch" :selection="selection"
@batchMove="openMove" @add="openEdit"
@importData="openImport" @remove="removeBatch"
@exportData="exportData" @batchMove="openMove"
/> @importData="openImport"
@exportData="exportData"
/>
</a-space>
</template> </template>
<template #bodyCell="{ column, record }"> <template #bodyCell="{ column, record }">
<template v-if="column.key === 'companyName'">
{{ record.companyName || '-' }}
</template>
<template v-if="column.key === 'image'"> <template v-if="column.key === 'image'">
<a-image :src="record.image" :width="50" /> <a-image :src="record.image" :width="50" />
</template> </template>
@@ -140,52 +147,57 @@
width: 80 width: 80
}, },
{ {
title: '数据类型', title: '主体企业',
dataIndex: 'dataType', dataIndex: 'companyName',
key: 'dataType', key: 'companyName'
ellipsis: true
}, },
{ {
title: '原告/上诉人', title: '原告/上诉人',
dataIndex: 'appellee',
key: 'appellee'
},
{
title: '被告/被上诉人',
dataIndex: 'plaintiffAppellant', dataIndex: 'plaintiffAppellant',
key: 'plaintiffAppellant', key: 'plaintiffAppellant'
ellipsis: true },
{
title: '其他当事人/第三人',
dataIndex: 'otherPartiesThirdParty',
key: 'otherPartiesThirdParty'
}, },
{ {
title: '发生时间', title: '发生时间',
dataIndex: 'occurrenceTime', dataIndex: 'releaseDate',
key: 'occurrenceTime', key: 'releaseDate',
width: 120 width: 120
}, },
{ {
title: '案号', title: '案号',
dataIndex: 'caseNumber', dataIndex: 'caseNumber',
key: 'caseNumber', key: 'caseNumber'
ellipsis: true
},
{
title: '案由',
dataIndex: 'causeOfAction',
key: 'causeOfAction',
ellipsis: true
}, },
{ {
title: '涉案金额', title: '涉案金额',
dataIndex: 'involvedAmount', dataIndex: 'involvedAmount',
key: 'involvedAmount', key: 'involvedAmount'
width: 120
}, },
{ {
title: '法院', title: '法院',
dataIndex: 'courtName', dataIndex: 'courtName',
key: 'courtName', key: 'courtName'
ellipsis: true
}, },
{ {
title: '数据状态', title: '数据状态',
dataIndex: 'dataStatus', dataIndex: 'dataStatus',
key: 'dataStatus', key: 'dataStatus'
ellipsis: true },
{
title: '操作人',
dataIndex: 'realName',
key: 'realName',
width: 90,
align: 'center'
}, },
{ {
title: '创建时间', title: '创建时间',
@@ -193,17 +205,18 @@
key: 'createTime', key: 'createTime',
width: 180, width: 180,
align: 'center', align: 'center',
sorter: true,
ellipsis: true, ellipsis: true,
customRender: ({ text }) => toDateString(text, 'yyyy-MM-dd HH:mm:ss') customRender: ({ text }) => toDateString(text, 'yyyy-MM-dd HH:mm:ss')
},
{
title: '操作',
key: 'action',
width: 160,
fixed: 'right',
align: 'center',
hideInSetting: true
} }
// {
// title: '操作',
// key: 'action',
// width: 160,
// fixed: 'right',
// align: 'center',
// hideInSetting: true
// }
]); ]);
/* 搜索 */ /* 搜索 */
@@ -318,7 +331,7 @@
}, },
// 行双击事件 // 行双击事件
onDblclick: () => { onDblclick: () => {
openEdit(record); // openEdit(record);
} }
}; };
}; };

View File

@@ -0,0 +1,98 @@
<!-- 历史立案信息导入弹窗 -->
<template>
<ele-modal
:width="520"
:footer="null"
title="历史立案信息批量导入"
:visible="visible"
@update:visible="updateVisible"
>
<a-spin :spinning="loading">
<a-upload-dragger
accept=".xls,.xlsx"
:show-upload-list="false"
:customRequest="doUpload"
style="padding: 24px 0; margin-bottom: 16px"
>
<p class="ant-upload-drag-icon">
<cloud-upload-outlined />
</p>
<p class="ant-upload-hint">将文件拖到此处或点击上传</p>
</a-upload-dragger>
</a-spin>
<div class="ele-text-center">
<span>只能上传xlsxlsx文件</span>
<a :href="templateUrl" download="历史立案信息导入模板.xlsx">
下载导入模板
</a>
</div>
</ele-modal>
</template>
<script lang="ts" setup>
import { computed, ref } from 'vue';
import { message } from 'ant-design-vue/es';
import { CloudUploadOutlined } from '@ant-design/icons-vue';
import { importCreditCaseFilingHistory } from '@/api/credit/creditCaseFiling';
import { API_BASE_URL } from '@/config/setting';
const emit = defineEmits<{
(e: 'done'): void;
(e: 'update:visible', visible: boolean): void;
}>();
const props = defineProps<{
// 是否打开弹窗
visible: boolean;
// 关联企业ID企业详情下导入时需要
companyId?: number;
}>();
// 导入请求状态
const loading = ref(false);
// 模板下载地址,保持与当前接口域名一致
const templateUrl = computed(() => {
const base = (localStorage.getItem('ApiUrl') || API_BASE_URL || '').replace(
/\/$/,
''
);
return `${base}/credit/credit-case-filing/import/history/template`;
});
/* 上传 */
const doUpload = ({ file }) => {
if (
![
'application/vnd.ms-excel',
'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'
].includes(file.type)
) {
message.error('只能选择 excel 文件');
return false;
}
if (file.size / 1024 / 1024 > 10) {
message.error('大小不能超过 10MB');
return false;
}
loading.value = true;
importCreditCaseFilingHistory(file, props.companyId)
.then((msg) => {
loading.value = false;
message.success(msg);
updateVisible(false);
emit('done');
})
.catch((e) => {
loading.value = false;
message.error(e.message);
});
return false;
};
/* 更新 visible */
const updateVisible = (value: boolean) => {
emit('update:visible', value);
};
</script>

View File

@@ -22,9 +22,7 @@
</a-spin> </a-spin>
<div class="ele-text-center"> <div class="ele-text-center">
<span>只能上传xlsxlsx文件</span> <span>只能上传xlsxlsx文件</span>
<a :href="templateUrl" download="立案信息导入模板.xlsx"> <a :href="templateUrl" download="立案信息导入模板.xlsx"> 下载导入模板 </a>
下载导入模板
</a>
</div> </div>
</ele-modal> </ele-modal>
</template> </template>

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