77 Commits
dev-ui ... dev

Author SHA1 Message Date
wkc
aa08ab4711 员工亲属实体关联 2026-04-24 13:29:13 +08:00
wkc
b7db711906 完成员工亲属实体关联改造并清理旧数据 2026-04-24 08:55:05 +08:00
wkc
b7d020c0b2 调整实体库管理数据来源维护规则 2026-04-23 17:31:56 +08:00
wkc
d444eafd5f 调整征信记录维护页面搜索区并去掉顶部标题 2026-04-23 17:24:52 +08:00
wkc
c9398881f3 新增员工亲属实体关联维护实施计划 2026-04-23 16:52:15 +08:00
wkc
d79a60ab8c 新增员工亲属实体关联维护设计文档 2026-04-23 16:47:26 +08:00
wkc
e9403662e2 新增信息维护页面搜索区四列栅格前端实施计划 2026-04-23 16:40:06 +08:00
wkc
fd79bfe62f 新增信息维护页面搜索区四列栅格统一设计文档 2026-04-23 16:21:13 +08:00
wkc
c7f4982451 补充招投标供应商企业详情查看 2026-04-23 16:12:56 +08:00
wkc
0b2571b962 统一信息维护页面头部按钮布局 2026-04-23 16:07:17 +08:00
wkc
129e44c808 新增信息维护页面头部按钮统一前端实施计划 2026-04-23 15:53:32 +08:00
wkc
50c177da78 新增信息维护页面头部按钮统一设计文档 2026-04-23 15:50:44 +08:00
wkc
c660025bcc 完善招投标供应商企业详情设计与计划 2026-04-23 15:40:42 +08:00
wkc
bd51991248 新增招投标供应商企业详情设计文档 2026-04-23 15:18:12 +08:00
wkc
a2ba044ebe 完成招聘双Sheet导入改造 2026-04-23 10:27:08 +08:00
wkc
110817abba 新增招聘信息双Sheet导入实施计划 2026-04-23 09:45:50 +08:00
wkc
ff9627d0d9 新增招聘信息双Sheet导入设计文档 2026-04-23 09:40:15 +08:00
wkc
2d1b02474c Add import page test guidelines 2026-04-22 16:38:52 +08:00
wkc
5a9b79d4ee 完善招投标导入测试与文档 2026-04-22 16:20:37 +08:00
wkc
0c5fa6b2c8 Remove obsolete export APIs and persist recruitment work history 2026-04-22 13:38:43 +08:00
wkc
94507e3747 Unify staff recruitment work table collation 2026-04-22 10:07:05 +08:00
wkc
fc6af5234d 修复 Redis 断连重连并更新中介导入文案 2026-04-22 09:52:32 +08:00
wkc
624b51292f 补充中介导入测试文件 2026-04-22 09:52:32 +08:00
wkc
6385778e4c 完成中介库导入改造 2026-04-22 09:52:32 +08:00
wkc
60a7906eb3 更新开发文档并调整开发环境配置 2026-04-22 09:52:32 +08:00
wkc
49118a4418 新增中介库导入实施计划 2026-04-22 09:52:32 +08:00
wkc
d2d36d75a7 补充中介库导入设计约束 2026-04-22 09:52:32 +08:00
wkc
bc2a885abf 完善中介库导入设计文档 2026-04-22 09:52:32 +08:00
wkc
018b085447 新增中介库导入改造设计文档 2026-04-22 09:52:32 +08:00
wkc
55f6eb9129 Merge pull request 'dev-ui' (#1) from dev-ui into dev
Reviewed-on: #1
2026-04-22 01:50:37 +00:00
wkc
2b321a8621 修复中介库 2026-04-20 11:24:18 +08:00
wkc
c278d11390 修复 2026-04-20 11:22:10 +08:00
wkc
e0629f22e5 docs: 新增中介库主从结构改造实施计划 2026-04-17 15:56:37 +08:00
wkc
03ecbbd204 docs: 新增中介库主从结构改造设计文档 2026-04-17 15:50:28 +08:00
wkc
eabd38fa58 新增实体库管理设计文档 2026-04-17 12:00:59 +08:00
wkc
03a4acb63a 新增员工党员字段 2026-04-17 11:04:52 +08:00
wkc
3286795f98 Integrate TongWeb into backend 2026-04-17 10:31:05 +08:00
wkc
4c6ca52e7e 合并账户库为单表 2026-04-17 10:18:13 +08:00
wkc
cc1a4538af Merge branch 'dev-ui' into dev 2026-04-16 14:42:01 +08:00
wkc
5aaf6c83be Merge remote-tracking branch 'origin/dev-ui' into dev 2026-04-07 09:39:17 +08:00
wkc
cb3265e796 修复记录 2026-04-07 09:37:41 +08:00
wkc
8798aa9230 调整lsfx-mock默认数据库配置并更新NAS部署环境 2026-03-31 23:03:14 +08:00
wkc
2fdf5f1546 记录异常账户基线同步后端实施 2026-03-31 22:18:06 +08:00
wkc
a32be65bf1 锁定异常账户流水与账户事实一致性 2026-03-31 22:16:48 +08:00
wkc
51810a325e 新增异常账户基线写库服务 2026-03-31 22:15:41 +08:00
wkc
6b24e02ba9 接入异常账户基线同步触发点 2026-03-31 22:14:03 +08:00
wkc
d831edcaa4 补充异常账户基线同步实施计划 2026-03-31 22:11:21 +08:00
wkc
af63607069 补充异常账户基线同步设计文档 2026-03-31 22:07:05 +08:00
wkc
0abc84c571 记录异常账户人员信息前端实施 2026-03-31 21:09:14 +08:00
wkc
7dafabf7cb 调整异常账户人员信息前端展示列 2026-03-31 21:08:04 +08:00
wkc
4dca2b2b63 补充异常账户人员前端查询状态 2026-03-31 21:07:24 +08:00
wkc
001597d5e8 Merge branch 'codex/project-detail-risk-details-abnormal-account-backend' into dev 2026-03-31 21:05:32 +08:00
wkc
4b5ac7388c 记录异常账户人员信息后端实施 2026-03-31 21:04:06 +08:00
wkc
1e0813a84c 补充风险明细异常账户统一导出 2026-03-31 21:03:13 +08:00
wkc
c8d45416cf 补充异常账户人员服务映射 2026-03-31 21:02:00 +08:00
wkc
09119a2365 补充异常账户人员查询SQL 2026-03-31 21:00:24 +08:00
wkc
5de46eabc5 修正异常账户流水返回账号覆盖 2026-03-31 20:58:44 +08:00
wkc
bcb2e39099 补充异常账户人员查询接口契约 2026-03-31 20:57:20 +08:00
wkc
09b4cfe3c4 Merge branch 'codex/lsfx-mock-server-abnormal-account-backend' into dev 2026-03-31 20:54:05 +08:00
wkc
c5a00f26ad 补充风险明细异常账户实施计划 2026-03-31 20:53:32 +08:00
wkc
d4dc66a514 完成异常账户Mock服务后端实施记录 2026-03-31 20:49:27 +08:00
wkc
2877e26fa5 接入异常账户命中流水主链路 2026-03-31 20:45:25 +08:00
wkc
1a19dcbc13 补充风险明细异常账户人员信息设计文档 2026-03-31 20:43:55 +08:00
wkc
f981dc9906 补充异常账户规则样本生成器 2026-03-31 20:42:22 +08:00
wkc
f0e2595a2b 补充异常账户命中计划与账户事实 2026-03-31 20:40:38 +08:00
wkc
37e0c231a7 补充异常账户Mock造数实施计划 2026-03-31 20:33:22 +08:00
wkc
1397f12057 补充异常账户Mock造数设计文档 2026-03-31 20:30:55 +08:00
wkc
46e476e35b 完成异常账户模型前端实施记录 2026-03-31 16:46:20 +08:00
wkc
bfac1f10d2 修正异常账户规则金额口径并补充后端验证记录 2026-03-31 16:46:05 +08:00
wkc
d01362cc72 补充异常账户规则SQL校验记录 2026-03-31 16:37:17 +08:00
wkc
2aee9ff76e 补充异常账户规则测试数据 2026-03-31 16:34:45 +08:00
wkc
5b91cee935 实现休眠账户大额启用打标规则 2026-03-31 16:32:52 +08:00
wkc
a3f49dc176 实现突然销户打标规则 2026-03-31 16:31:58 +08:00
wkc
127a59bf78 补充异常账户模型建表和规则元数据 2026-03-31 16:29:48 +08:00
wkc
988c2d3572 补充异常账户模型规则骨架 2026-03-31 16:28:37 +08:00
wkc
f4a72a6110 补充异常账户模型实施计划 2026-03-31 16:18:20 +08:00
wkc
3741ef5fe4 补充异常账户模型打标设计文档 2026-03-31 16:12:45 +08:00
420 changed files with 32862 additions and 4901 deletions

BIN
.DS_Store vendored

Binary file not shown.

14
.gitignore vendored
View File

@@ -80,3 +80,17 @@ output/
logs/
.DS_Store
ruoyi-ui/vue.config.js
*/src/test/
.pytest_cache/
tests/
tongweb_62318.properties
.superpowers/
tmp/

View File

@@ -1,17 +0,0 @@
{
"mcpServers": {
"mysql": {
"command": "node",
"args": [
"C:/Users/wkc/.codex/mcp-tools/mysql-server/node_modules/@fhuang/mcp-mysql-server/build/index.js"
],
"env": {
"MYSQL_DATABASE": "ccdi",
"MYSQL_HOST": "116.62.17.81",
"MYSQL_PASSWORD": "Kfcx@1234",
"MYSQL_PORT": "3306",
"MYSQL_USER": "root"
}
}
}
}

View File

@@ -1,24 +0,0 @@
{
"$schema": "https://opencode.ai/config.json",
"plugin": [
"oh-my-opencode@latest"
],
"agent": {
"Sisyphus-Junior": {
"mode": "subagent",
"model": "glm/glm-5"
},
"oracle": {
"mode": "subagent",
"model": "gmn/gpt-5.3-codex"
},
"Metis (Plan Consultant)": {
"mode": "subagent",
"model": "gmn/gpt-5.3-codex"
},
"Momus (Plan Critic)": {
"mode": "subagent",
"model": "gmn/gpt-5.3-codex"
}
}
}

View File

@@ -15,19 +15,58 @@
---
## 协作约定
## 高优先级规则
- 使用简体中文进行思考和对话
- Git 提交说明使用中文
- Git 提交前必须检查暂存区,仅允许包含本次任务相关文件
- 若暂存区存在无关文件,必须先移出暂存或与用户确认,禁止顺带提交
- 根据设计文档产出实施计划时,默认输出两份文档:
- 后端实施计划放 `docs/plans/backend/`
- 前端实施计划放 `docs/plans/frontend/`
- 前端开发直接在当前分支进行,不需要额外创建 git worktree
- Git 提交说明必须使用中文
- 忽略 `.DS_Store` 文件,不将其视为本次任务需要处理或提交的有效变更
- 仅当用户明确声明调用 `using-superpowers` 时才允许启用;未明确声明时按普通流程直接处理需求
- Git 提交前必须检查暂存区,仅允许包含本次任务相关文件;若存在无关文件,必须先移出暂存或与用户确认
- 每一次改动都需要留下实施文档,记录修改内容、影响范围与验证情况
- 功能设计同时涉及前端和后端改动时,必须分别输出后端与前端两份实施计划;若仅涉及单侧,则只输出对应实施计划
- 新增或修改设计文档、实施计划、实施记录前,必须先确认保存路径是否正确
- 前端相关安装、构建、调试、测试命令执行前,必须先通过 `nvm` 切换并确认 Node 版本
- 测试结束后,自动关闭测试过程中启动的前后端进程
- 重启后端时,必须优先使用 `bin/restart_java_backend.sh`
---
## 协作约定
### 基础协作
- 前端开发直接在当前分支进行,不需要额外创建 git worktree
- 给出方案时,必须保持最短路径实现,不允许提供兼容性、补丁性或过度设计的方案
- 不允许自行扩展出用户需求之外的兜底、降级或变体方案,避免业务逻辑偏移
- 输出方案前必须完成全链路逻辑校验,确保方案逻辑正确、链路闭环
### Git 与变更管理
- Git 提交前必须检查暂存区,仅保留本次任务相关文件
- 若暂存区存在无关文件,必须先移出暂存或与用户确认,禁止顺带提交
- `.DS_Store` 默认忽略,不纳入任务变更范围
### 文档产出
- 若需求来自设计文档,默认同时沉淀后端与前端两份实施计划
- 功能设计同时涉及前端和后端改动时,实施计划分别放在 `docs/plans/backend/``docs/plans/frontend/`
- 功能修改只涉及前端或只涉及后端时,只输出对应的实施计划
- 非前后端架构项目不强制拆分两份实施计划
- 每一次改动都需要留下实施文档,实施记录优先放在 `docs/reports/implementation/`
- 每次新增或修改设计文档、实施计划、实施记录前,都要先确认保存路径是否正确
### 测试与运行
- 测试结束后,自动关闭测试过程中启动的前后端进程
- 重启后端时,必须优先使用 `bin/restart_java_backend.sh`,不要直接手工执行 `java -jar` 替代正式重启流程
- 前端相关安装、构建、调试、测试命令执行前,必须先通过 `nvm` 切换并确认 Node 版本
### 数据库与编码
- 遇到 MCP 数据库操作时,使用项目配置文件中的数据库连接信息
- 执行包含中文内容的 MySQL SQL 脚本或数据库导入时,禁止直接手写 `mysql -e` 或普通重定向执行;必须优先使用 `bin/mysql_utf8_exec.sh <sql-file>`,确保会话字符集为 `utf8mb4`,避免导入或写入乱码
- 执行包含中文内容的 MySQL SQL 脚本或数据库导入时,禁止直接手写 `mysql -e` 或普通重定向执行;必须优先使用 `bin/mysql_utf8_exec.sh <sql-file>`,确保会话字符集为 `utf8mb4`
- 所有业务表、系统表新增或修改时,必须显式使用 `utf8mb4` 字符集与 `utf8mb4_general_ci` 排序规则
- 禁止引入 `utf8mb4_0900_ai_ci``utf8mb4_unicode_ci` 或其他混用排序规则
- 银行流水打标相关规则与参数编码需要统一使用全大写;新增或修改 `rule_code``indicator_code``param_code` 时,禁止混用大小写风格
---
@@ -41,7 +80,7 @@
mvn clean compile
# 启动主应用Jar
cd ruoyi-admin/target && java -jar ruoyi-admin.jar
sh bin/restart_java_backend.sh
# 打包全部模块
mvn clean package
@@ -61,6 +100,9 @@ mvn clean package -DskipTests
```bash
cd ruoyi-ui
# 使用 nvm 切换到项目所需 Node 版本
nvm use
# 安装依赖
npm install --registry=https://registry.npmmirror.com
@@ -164,7 +206,10 @@ return AjaxResult.success(result);
- 非业务字段如 `create_by``create_time` 由后端自动维护
- 前端表单不要暴露通用审计字段
- 新增菜单、字典、初始化数据时,同步补充 SQL 脚本
- 执行数据库脚本或导入数据库前,需确认客户端会话字符集为 `utf8mb4`;涉及中文插入、更新、导入时默认使用 `bin/mysql_utf8_exec.sh`
- 执行数据库脚本或导入数据库前,需确认客户端会话字符集为 `utf8mb4`
- 涉及中文插入、更新、导入时默认使用 `bin/mysql_utf8_exec.sh`
- 所有系统表和业务表的表级、字符字段级排序规则统一为 `utf8mb4_general_ci`
- 新增建表 SQL、字段追加 SQL、表结构修复 SQL 必须显式声明字符集与排序规则,避免因默认排序规则漂移导致联表或条件查询报错
### 前端规范
@@ -180,6 +225,18 @@ return AjaxResult.success(result);
- 返回结果仅展示失败数据
- 大数据量导入优先采用 EasyExcel + 异步处理
### 导入页面测试规范
- 导入功能测试必须进入真实业务页面执行,先在页面内下载当前导入模板,再基于该模板生成测试文件,禁止手工凭记忆新建表头或脱离页面直接构造上传文件
- 双 Sheet 模板的导入测试必须覆盖两个 Sheet 的联动关系;除“缺少 Sheet / 空 Sheet”专项场景外默认两个 Sheet 都要准备测试数据
- 导入测试文件优先放在 `output/spreadsheet/``output/playwright/`,不提交到 git
- 需要按场景拆分测试文件,避免多个互斥校验互相覆盖;至少覆盖空模板、主信息必填、主信息格式与金额、主从关系异常、供应商校验、缺少/空 Sheet、成功导入、成功与失败混合、失败记录查看、导入后清理回滚
- 主从关系异常测试至少覆盖:已存在主键、供应商有数据但主信息缺失、主信息重复、供应商 Sheet 中采购事项 ID 为空
- 供应商校验测试至少覆盖:重复供应商、多条中标、供应商名称为空、名称超长、联系人超长、银行账户超长、联系电话非法、统一信用代码非法、是否中标枚举非法
- 页面上传后必须核对页面提示、导入状态、失败记录弹窗和列表总数变化;异步导入场景还要核对任务状态从 `PROCESSING` 到最终状态的变化
- 对“成功导入 + 异常数据混合”的样本,必须额外核对成功数据是否真正入库、异常数据是否被拦截,以及是否存在被静默忽略的行
- 导入测试结束后,必须删除本轮成功写入的测试数据,清理页面本地导入任务缓存,并关闭测试过程中启动的前后端进程
---
## 当前仓库结构
@@ -225,15 +282,10 @@ ccdi/
### 主要业务代码分布
- `ccdi-info-collection/src/main/java/com/ruoyi/info/collection/`
-`controller``domain``mapper``service``annotation``validation` 等目录
- `ccdi-project/src/main/java/com/ruoyi/ccdi/project/`
-`config``controller``domain``mapper``service`
- `ccdi-lsfx/src/main/java/com/ruoyi/lsfx/`
-`client``config``constants``controller``domain/request``domain/response`
- `ruoyi-ui/src/views/`
- 当前包含 `ccdi``ccdiBaseStaff``ccdiProject``ccdiPurchaseTransaction``ccdiIntermediary`、亲属关系、员工调动、招聘等业务页面
- `ruoyi-ui/src/api/ccdi/`
- 放置纪检初核业务 API 封装
### 添加新后端模块时
@@ -294,6 +346,9 @@ ccdi/
- 只有历史资料或外部原始材料才放入 `assets/`
- 如果移动了文档,需同步修正文档内引用路径
- 若需求来自设计文档,默认同时沉淀后端与前端两份实施计划
- 功能设计同时涉及前端和后端改动时,必须分别输出后端与前端两份实施计划;若仅涉及前端或仅涉及后端,则只输出对应实施计划;非前后端架构项目不强制拆分双文档
- 每一次改动都需要留下实施文档,记录本次修改内容、影响范围与验证情况,实施记录优先放在 `docs/reports/implementation/`
- 每次新增或修改设计文档、实施计划、实施记录前,都要先确认保存路径是否正确
---
@@ -304,3 +359,4 @@ ccdi/
- `docker/backend``docker/frontend``docker/mock` 分别对应三类运行时镜像
- `sql/migration/` 用于增量迁移脚本,新增修复脚本优先按日期或功能命名
- 启动前后端或 Mock 服务做验证后,结束测试时要主动停止进程,避免残留占用端口
- 前端相关安装、构建、调试、测试命令执行前,必须先通过 `nvm` 切换并确认 Node 版本

BIN
assets/异常账户.xlsx Normal file

Binary file not shown.

View File

@@ -83,7 +83,7 @@ collect_pids() {
fi
fi
marker_pids=$(pgrep -f "$APP_MARKER" 2>/dev/null || true)
marker_pids=$(pgrep -f -- "$APP_MARKER" 2>/dev/null || true)
if [ -n "${marker_pids:-}" ]; then
for pid in $marker_pids; do
if is_managed_backend_pid "$pid"; then
@@ -92,6 +92,15 @@ collect_pids() {
done
fi
port_pids=$(lsof -tiTCP:"$SERVER_PORT" -sTCP:LISTEN 2>/dev/null || true)
if [ -n "${port_pids:-}" ]; then
for pid in $port_pids; do
if is_managed_backend_pid "$pid"; then
all_pids="$all_pids $pid"
fi
done
fi
unique_pids=""
for pid in $all_pids; do
case " $unique_pids " in
@@ -206,7 +215,7 @@ follow_logs() {
start_action() {
running_pids=$(collect_pids)
if [ -n "${running_pids:-}" ]; then
log_error "检测到已有后端进程在运行: $running_pids,请先执行 stop 或 restart"
log_error "检测到已有后端进程在运行: ${running_pids},请先执行 stop 或 restart"
exit 1
fi

View File

@@ -57,6 +57,12 @@
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.ruoyi</groupId>
<artifactId>ccdi-lsfx</artifactId>
<version>3.9.1</version>
<scope>compile</scope>
</dependency>
</dependencies>

View File

@@ -80,18 +80,6 @@ public class CcdiAccountInfoController extends BaseController {
return success(accountInfoService.selectAccountInfoById(id));
}
/**
* 导出账户库列表
*/
@Operation(summary = "导出账户库列表")
@PreAuthorize("@ss.hasPermi('ccdi:accountInfo:export')")
@Log(title = "账户库管理", businessType = BusinessType.EXPORT)
@PostMapping("/export")
public void export(HttpServletResponse response, CcdiAccountInfoQueryDTO queryDTO) {
List<CcdiAccountInfoExcel> list = accountInfoService.selectAccountInfoListForExport(queryDTO);
EasyExcelUtil.exportExcel(response, list, CcdiAccountInfoExcel.class, "账户库管理");
}
/**
* 新增账户
*/

View File

@@ -4,8 +4,10 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.info.collection.domain.dto.CcdiBaseStaffAddDTO;
import com.ruoyi.info.collection.domain.dto.CcdiBaseStaffEditDTO;
import com.ruoyi.info.collection.domain.dto.CcdiBaseStaffQueryDTO;
import com.ruoyi.info.collection.domain.excel.CcdiBaseStaffAssetInfoExcel;
import com.ruoyi.info.collection.domain.excel.CcdiBaseStaffExcel;
import com.ruoyi.info.collection.domain.vo.*;
import com.ruoyi.info.collection.service.ICcdiBaseStaffAssetImportService;
import com.ruoyi.info.collection.service.ICcdiBaseStaffImportService;
import com.ruoyi.info.collection.service.ICcdiBaseStaffService;
import com.ruoyi.info.collection.utils.EasyExcelUtil;
@@ -45,6 +47,9 @@ public class CcdiBaseStaffController extends BaseController {
@Resource
private ICcdiBaseStaffImportService importAsyncService;
@Resource
private ICcdiBaseStaffAssetImportService baseStaffAssetImportService;
/**
* 查询员工列表
*/
@@ -70,18 +75,6 @@ public class CcdiBaseStaffController extends BaseController {
return success(list);
}
/**
* 导出员工列表
*/
@Operation(summary = "导出员工列表")
@PreAuthorize("@ss.hasPermi('ccdi:baseStaff:export')")
@Log(title = "员工信息", businessType = BusinessType.EXPORT)
@PostMapping("/export")
public void export(HttpServletResponse response, CcdiBaseStaffQueryDTO queryDTO) {
List<CcdiBaseStaffExcel> list = baseStaffService.selectBaseStaffListForExport(queryDTO);
EasyExcelUtil.exportExcel(response, list, CcdiBaseStaffExcel.class, "员工信息");
}
/**
* 获取员工详细信息
*/
@@ -132,7 +125,14 @@ public class CcdiBaseStaffController extends BaseController {
@Operation(summary = "下载导入模板")
@PostMapping("/importTemplate")
public void importTemplate(HttpServletResponse response) {
EasyExcelUtil.importTemplateWithDictDropdown(response, CcdiBaseStaffExcel.class, "员工信息");
EasyExcelUtil.importTemplateWithDictDropdown(
response,
CcdiBaseStaffExcel.class,
"员工信息",
CcdiBaseStaffAssetInfoExcel.class,
"员工资产信息",
"员工信息维护导入模板"
);
}
/**
@@ -142,21 +142,33 @@ public class CcdiBaseStaffController extends BaseController {
@PreAuthorize("@ss.hasPermi('ccdi:baseStaff:import')")
@Log(title = "员工信息", businessType = BusinessType.IMPORT)
@PostMapping("/importData")
public AjaxResult importData(MultipartFile file, boolean updateSupport) throws Exception {
List<CcdiBaseStaffExcel> list = EasyExcelUtil.importExcel(file.getInputStream(), CcdiBaseStaffExcel.class);
public AjaxResult importData(MultipartFile file) throws Exception {
List<CcdiBaseStaffExcel> staffList = EasyExcelUtil.importExcel(
file.getInputStream(),
CcdiBaseStaffExcel.class,
"员工信息"
);
List<CcdiBaseStaffAssetInfoExcel> assetList = EasyExcelUtil.importExcel(
file.getInputStream(),
CcdiBaseStaffAssetInfoExcel.class,
"员工资产信息"
);
if (list == null || list.isEmpty()) {
boolean hasStaffRows = staffList != null && !staffList.isEmpty();
boolean hasAssetRows = assetList != null && !assetList.isEmpty();
if (!hasStaffRows && !hasAssetRows) {
return error("至少需要一条数据");
}
// 提交异步任务
String taskId = baseStaffService.importBaseStaff(list, updateSupport);
// 立即返回,不等待后台任务完成
ImportResultVO result = new ImportResultVO();
result.setTaskId(taskId);
result.setStatus("PROCESSING");
result.setMessage("导入任务已提交,正在后台处理");
BaseStaffImportSubmitResultVO result = new BaseStaffImportSubmitResultVO();
if (hasStaffRows) {
result.setStaffTaskId(baseStaffService.importBaseStaff(staffList));
}
if (hasAssetRows) {
result.setAssetTaskId(baseStaffAssetImportService.importAssetInfo(assetList));
}
result.setMessage(buildImportSubmitMessage(hasStaffRows, hasAssetRows));
return AjaxResult.success("导入任务已提交,正在后台处理", result);
}
@@ -202,4 +214,14 @@ public class CcdiBaseStaffController extends BaseController {
return getDataTable(pageData, failures.size());
}
private String buildImportSubmitMessage(boolean hasStaffRows, boolean hasAssetRows) {
if (hasStaffRows && hasAssetRows) {
return "已提交员工信息和员工资产信息导入任务";
}
if (hasStaffRows) {
return "已提交员工信息导入任务";
}
return "已提交员工资产信息导入任务";
}
}

View File

@@ -63,18 +63,6 @@ public class CcdiCustEnterpriseRelationController extends BaseController {
return getDataTable(result.getRecords(), result.getTotal());
}
/**
* 导出信贷客户实体关联列表
*/
@Operation(summary = "导出信贷客户实体关联列表")
@PreAuthorize("@ss.hasPermi('ccdi:custEnterpriseRelation:export')")
@Log(title = "信贷客户实体关联信息", businessType = BusinessType.EXPORT)
@PostMapping("/export")
public void export(HttpServletResponse response, CcdiCustEnterpriseRelationQueryDTO queryDTO) {
List<CcdiCustEnterpriseRelationExcel> list = relationService.selectRelationListForExport(queryDTO);
EasyExcelUtil.exportExcel(response, list, CcdiCustEnterpriseRelationExcel.class, "信贷客户实体关联信息");
}
/**
* 获取信贷客户实体关联详细信息
*/

View File

@@ -103,17 +103,6 @@ public class CcdiCustFmyRelationController extends BaseController {
return toAjax(relationService.deleteRelationByIds(ids));
}
/**
* 导出信贷客户家庭关系
*/
@Operation(summary = "导出信贷客户家庭关系")
@PreAuthorize("@ss.hasPermi('ccdi:custFmyRelation:export')")
@Log(title = "信贷客户家庭关系", businessType = BusinessType.EXPORT)
@PostMapping("/export")
public void export(HttpServletResponse response, CcdiCustFmyRelationQueryDTO query) {
relationService.exportRelations(query, response);
}
/**
* 下载带字典下拉框的导入模板
* 使用@DictDropdown注解自动添加下拉框

View File

@@ -0,0 +1,146 @@
package com.ruoyi.info.collection.controller;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.common.annotation.Log;
import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.core.page.PageDomain;
import com.ruoyi.common.core.page.TableDataInfo;
import com.ruoyi.common.core.page.TableSupport;
import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.info.collection.domain.dto.CcdiEnterpriseBaseInfoAddDTO;
import com.ruoyi.info.collection.domain.dto.CcdiEnterpriseBaseInfoEditDTO;
import com.ruoyi.info.collection.domain.dto.CcdiEnterpriseBaseInfoQueryDTO;
import com.ruoyi.info.collection.domain.excel.CcdiEnterpriseBaseInfoExcel;
import com.ruoyi.info.collection.domain.vo.CcdiEnterpriseBaseInfoVO;
import com.ruoyi.info.collection.domain.vo.EnterpriseBaseInfoImportFailureVO;
import com.ruoyi.info.collection.domain.vo.ImportResultVO;
import com.ruoyi.info.collection.domain.vo.ImportStatusVO;
import com.ruoyi.info.collection.service.ICcdiEnterpriseBaseInfoImportService;
import com.ruoyi.info.collection.service.ICcdiEnterpriseBaseInfoService;
import com.ruoyi.info.collection.utils.EasyExcelUtil;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.annotation.Resource;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
import java.util.ArrayList;
import java.util.List;
/**
* 实体库管理 Controller
*
* @author ruoyi
* @date 2026-04-17
*/
@Tag(name = "实体库管理")
@RestController
@RequestMapping("/ccdi/enterpriseBaseInfo")
public class CcdiEnterpriseBaseInfoController extends BaseController {
@Resource
private ICcdiEnterpriseBaseInfoService enterpriseBaseInfoService;
@Resource
private ICcdiEnterpriseBaseInfoImportService enterpriseBaseInfoImportService;
@Operation(summary = "查询实体库列表")
@PreAuthorize("@ss.hasPermi('ccdi:enterpriseBaseInfo:list')")
@GetMapping("/list")
public TableDataInfo list(CcdiEnterpriseBaseInfoQueryDTO queryDTO) {
PageDomain pageDomain = TableSupport.buildPageRequest();
Page<CcdiEnterpriseBaseInfoVO> page = new Page<>(pageDomain.getPageNum(), pageDomain.getPageSize());
Page<CcdiEnterpriseBaseInfoVO> result = enterpriseBaseInfoService.selectEnterpriseBaseInfoPage(page, queryDTO);
return getDataTable(result.getRecords(), result.getTotal());
}
@Operation(summary = "获取实体库详细信息")
@PreAuthorize("@ss.hasPermi('ccdi:enterpriseBaseInfo:query')")
@GetMapping("/{socialCreditCode}")
public AjaxResult getInfo(@PathVariable String socialCreditCode) {
return success(enterpriseBaseInfoService.selectEnterpriseBaseInfoById(socialCreditCode));
}
@Operation(summary = "新增实体库信息")
@PreAuthorize("@ss.hasPermi('ccdi:enterpriseBaseInfo:add')")
@Log(title = "实体库管理", businessType = BusinessType.INSERT)
@PostMapping
public AjaxResult add(@Validated @RequestBody CcdiEnterpriseBaseInfoAddDTO addDTO) {
return toAjax(enterpriseBaseInfoService.insertEnterpriseBaseInfo(addDTO));
}
@Operation(summary = "修改实体库信息")
@PreAuthorize("@ss.hasPermi('ccdi:enterpriseBaseInfo:edit')")
@Log(title = "实体库管理", businessType = BusinessType.UPDATE)
@PutMapping
public AjaxResult edit(@Validated @RequestBody CcdiEnterpriseBaseInfoEditDTO editDTO) {
return toAjax(enterpriseBaseInfoService.updateEnterpriseBaseInfo(editDTO));
}
@Operation(summary = "删除实体库信息")
@PreAuthorize("@ss.hasPermi('ccdi:enterpriseBaseInfo:remove')")
@Log(title = "实体库管理", businessType = BusinessType.DELETE)
@DeleteMapping("/{socialCreditCodes}")
public AjaxResult remove(@PathVariable String[] socialCreditCodes) {
return toAjax(enterpriseBaseInfoService.deleteEnterpriseBaseInfoByIds(socialCreditCodes));
}
@Operation(summary = "下载导入模板")
@PostMapping("/importTemplate")
public void importTemplate(HttpServletResponse response) {
EasyExcelUtil.importTemplateWithDictDropdown(response, CcdiEnterpriseBaseInfoExcel.class, "实体库管理");
}
@Operation(summary = "导入实体库信息")
@PreAuthorize("@ss.hasPermi('ccdi:enterpriseBaseInfo:import')")
@Log(title = "实体库管理", businessType = BusinessType.IMPORT)
@PostMapping("/importData")
public AjaxResult importData(MultipartFile file) throws Exception {
List<CcdiEnterpriseBaseInfoExcel> list = EasyExcelUtil.importExcel(file.getInputStream(), CcdiEnterpriseBaseInfoExcel.class);
if (list == null || list.isEmpty()) {
return error("至少需要一条数据");
}
String taskId = enterpriseBaseInfoService.importEnterpriseBaseInfo(list);
ImportResultVO result = new ImportResultVO();
result.setTaskId(taskId);
result.setStatus("PROCESSING");
result.setMessage("导入任务已提交,正在后台处理");
return AjaxResult.success("导入任务已提交,正在后台处理", result);
}
@Operation(summary = "查询导入状态")
@PreAuthorize("@ss.hasPermi('ccdi:enterpriseBaseInfo:import')")
@GetMapping("/importStatus/{taskId}")
public AjaxResult getImportStatus(@PathVariable String taskId) {
ImportStatusVO status = enterpriseBaseInfoImportService.getImportStatus(taskId);
return success(status);
}
@Operation(summary = "查询导入失败记录")
@PreAuthorize("@ss.hasPermi('ccdi:enterpriseBaseInfo:import')")
@GetMapping("/importFailures/{taskId}")
public TableDataInfo getImportFailures(@PathVariable String taskId,
@RequestParam(defaultValue = "1") Integer pageNum,
@RequestParam(defaultValue = "10") Integer pageSize) {
List<EnterpriseBaseInfoImportFailureVO> failures = enterpriseBaseInfoImportService.getImportFailures(taskId);
int fromIndex = (pageNum - 1) * pageSize;
if (fromIndex >= failures.size()) {
return getDataTable(new ArrayList<>(), failures.size());
}
int toIndex = Math.min(fromIndex + pageSize, failures.size());
return getDataTable(failures.subList(fromIndex, toIndex), failures.size());
}
}

View File

@@ -138,4 +138,30 @@ public class CcdiEnumController {
}
return AjaxResult.success(options);
}
/**
* 获取实体风险等级选项
*/
@Operation(summary = "获取实体风险等级选项")
@GetMapping("/enterpriseRiskLevel")
public AjaxResult getEnterpriseRiskLevelOptions() {
List<EnumOptionVO> options = new ArrayList<>();
for (EnterpriseRiskLevel level : EnterpriseRiskLevel.values()) {
options.add(new EnumOptionVO(level.getCode(), level.getDesc()));
}
return AjaxResult.success(options);
}
/**
* 获取企业来源选项
*/
@Operation(summary = "获取企业来源选项")
@GetMapping("/enterpriseSource")
public AjaxResult getEnterpriseSourceOptions() {
List<EnumOptionVO> options = new ArrayList<>();
for (EnterpriseSource source : EnterpriseSource.values()) {
options.add(new EnumOptionVO(source.getCode(), source.getDesc()));
}
return AjaxResult.success(options);
}
}

View File

@@ -2,10 +2,10 @@ package com.ruoyi.info.collection.controller;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.info.collection.domain.dto.*;
import com.ruoyi.info.collection.domain.excel.CcdiIntermediaryEntityExcel;
import com.ruoyi.info.collection.domain.excel.CcdiIntermediaryEnterpriseRelationExcel;
import com.ruoyi.info.collection.domain.excel.CcdiIntermediaryPersonExcel;
import com.ruoyi.info.collection.domain.vo.*;
import com.ruoyi.info.collection.service.ICcdiIntermediaryEntityImportService;
import com.ruoyi.info.collection.service.ICcdiIntermediaryEnterpriseRelationImportService;
import com.ruoyi.info.collection.service.ICcdiIntermediaryPersonImportService;
import com.ruoyi.info.collection.service.ICcdiIntermediaryService;
import com.ruoyi.info.collection.utils.EasyExcelUtil;
@@ -46,7 +46,7 @@ public class CcdiIntermediaryController extends BaseController {
private ICcdiIntermediaryPersonImportService personImportService;
@Resource
private ICcdiIntermediaryEntityImportService entityImportService;
private ICcdiIntermediaryEnterpriseRelationImportService enterpriseRelationImportService;
/**
* 查询中介列表
@@ -72,6 +72,26 @@ public class CcdiIntermediaryController extends BaseController {
return success(vo);
}
/**
* 查询中介亲属列表
*/
@Operation(summary = "查询中介亲属列表")
@PreAuthorize("@ss.hasPermi('ccdi:intermediary:query')")
@GetMapping("/{bizId}/relatives")
public AjaxResult getRelativeList(@PathVariable String bizId) {
return success(intermediaryService.selectIntermediaryRelativeList(bizId));
}
/**
* 查询中介亲属详情
*/
@Operation(summary = "查询中介亲属详情")
@PreAuthorize("@ss.hasPermi('ccdi:intermediary:query')")
@GetMapping("/relative/{relativeBizId}")
public AjaxResult getRelativeInfo(@PathVariable String relativeBizId) {
return success(intermediaryService.selectIntermediaryRelativeDetail(relativeBizId));
}
/**
* 查询实体中介详情
*/
@@ -105,6 +125,28 @@ public class CcdiIntermediaryController extends BaseController {
return toAjax(intermediaryService.updateIntermediaryPerson(editDTO));
}
/**
* 新增中介亲属
*/
@Operation(summary = "新增中介亲属")
@PreAuthorize("@ss.hasPermi('ccdi:intermediary:add')")
@Log(title = "中介亲属", businessType = BusinessType.INSERT)
@PostMapping("/{bizId}/relative")
public AjaxResult addRelative(@PathVariable String bizId, @Validated @RequestBody CcdiIntermediaryRelativeAddDTO addDTO) {
return toAjax(intermediaryService.insertIntermediaryRelative(bizId, addDTO));
}
/**
* 修改中介亲属
*/
@Operation(summary = "修改中介亲属")
@PreAuthorize("@ss.hasPermi('ccdi:intermediary:edit')")
@Log(title = "中介亲属", businessType = BusinessType.UPDATE)
@PutMapping("/relative")
public AjaxResult editRelative(@Validated @RequestBody CcdiIntermediaryRelativeEditDTO editDTO) {
return toAjax(intermediaryService.updateIntermediaryRelative(editDTO));
}
/**
* 新增实体中介
*/
@@ -127,6 +169,49 @@ public class CcdiIntermediaryController extends BaseController {
return toAjax(intermediaryService.updateIntermediaryEntity(editDTO));
}
/**
* 查询中介关联机构列表
*/
@Operation(summary = "查询中介关联机构列表")
@PreAuthorize("@ss.hasPermi('ccdi:intermediary:query')")
@GetMapping("/{bizId}/enterprise-relations")
public AjaxResult getEnterpriseRelationList(@PathVariable String bizId) {
return success(intermediaryService.selectIntermediaryEnterpriseRelationList(bizId));
}
/**
* 查询中介关联机构详情
*/
@Operation(summary = "查询中介关联机构详情")
@PreAuthorize("@ss.hasPermi('ccdi:intermediary:query')")
@GetMapping("/enterprise-relation/{id}")
public AjaxResult getEnterpriseRelationInfo(@PathVariable Long id) {
return success(intermediaryService.selectIntermediaryEnterpriseRelationDetail(id));
}
/**
* 新增中介关联机构
*/
@Operation(summary = "新增中介关联机构")
@PreAuthorize("@ss.hasPermi('ccdi:intermediary:add')")
@Log(title = "中介关联机构", businessType = BusinessType.INSERT)
@PostMapping("/{bizId}/enterprise-relation")
public AjaxResult addEnterpriseRelation(@PathVariable String bizId,
@Validated @RequestBody CcdiIntermediaryEnterpriseRelationAddDTO addDTO) {
return toAjax(intermediaryService.insertIntermediaryEnterpriseRelation(bizId, addDTO));
}
/**
* 修改中介关联机构
*/
@Operation(summary = "修改中介关联机构")
@PreAuthorize("@ss.hasPermi('ccdi:intermediary:edit')")
@Log(title = "中介关联机构", businessType = BusinessType.UPDATE)
@PutMapping("/enterprise-relation")
public AjaxResult editEnterpriseRelation(@Validated @RequestBody CcdiIntermediaryEnterpriseRelationEditDTO editDTO) {
return toAjax(intermediaryService.updateIntermediaryEnterpriseRelation(editDTO));
}
/**
* 删除中介
*/
@@ -138,6 +223,28 @@ public class CcdiIntermediaryController extends BaseController {
return toAjax(intermediaryService.deleteIntermediaryByIds(ids));
}
/**
* 删除中介亲属
*/
@Operation(summary = "删除中介亲属")
@PreAuthorize("@ss.hasPermi('ccdi:intermediary:remove')")
@Log(title = "中介亲属", businessType = BusinessType.DELETE)
@DeleteMapping("/relative/{relativeBizId}")
public AjaxResult removeRelative(@PathVariable String relativeBizId) {
return toAjax(intermediaryService.deleteIntermediaryRelative(relativeBizId));
}
/**
* 删除中介关联机构
*/
@Operation(summary = "删除中介关联机构")
@PreAuthorize("@ss.hasPermi('ccdi:intermediary:remove')")
@Log(title = "中介关联机构", businessType = BusinessType.DELETE)
@DeleteMapping("/enterprise-relation/{id}")
public AjaxResult removeEnterpriseRelation(@PathVariable Long id) {
return toAjax(intermediaryService.deleteIntermediaryEnterpriseRelation(id));
}
/**
* 校验人员ID唯一性
*/
@@ -170,10 +277,10 @@ public class CcdiIntermediaryController extends BaseController {
/**
* 下载实体中介导入模板
*/
@Operation(summary = "下载实体中介导入模板")
@PostMapping("/importEntityTemplate")
public void importEntityTemplate(HttpServletResponse response) {
EasyExcelUtil.importTemplateWithDictDropdown(response, CcdiIntermediaryEntityExcel.class, "实体中介信息");
@Operation(summary = "下载中介实体关联关系导入模板")
@PostMapping("/importEnterpriseRelationTemplate")
public void importEnterpriseRelationTemplate(HttpServletResponse response) {
EasyExcelUtil.importTemplateWithDictDropdown(response, CcdiIntermediaryEnterpriseRelationExcel.class, "中介实体关联关系信息");
}
/**
@@ -206,20 +313,19 @@ public class CcdiIntermediaryController extends BaseController {
/**
* 导入实体中介数据(异步)
*/
@Operation(summary = "导入实体中介数据")
@Operation(summary = "导入中介实体关联关系数据")
@PreAuthorize("@ss.hasPermi('ccdi:intermediary:import')")
@Log(title = "实体中介", businessType = BusinessType.IMPORT)
@PostMapping("/importEntityData")
public AjaxResult importEntityData(MultipartFile file) throws Exception {
List<CcdiIntermediaryEntityExcel> list = EasyExcelUtil.importExcel(
file.getInputStream(), CcdiIntermediaryEntityExcel.class);
@Log(title = "中介实体关联关系", businessType = BusinessType.IMPORT)
@PostMapping("/importEnterpriseRelationData")
public AjaxResult importEnterpriseRelationData(MultipartFile file) throws Exception {
List<CcdiIntermediaryEnterpriseRelationExcel> list = EasyExcelUtil.importExcel(
file.getInputStream(), CcdiIntermediaryEnterpriseRelationExcel.class);
if (list == null || list.isEmpty()) {
return error("至少需要一条数据");
}
// 提交异步任务
String taskId = intermediaryService.importIntermediaryEntity(list);
String taskId = intermediaryService.importIntermediaryEnterpriseRelation(list);
// 立即返回,不等待后台任务完成
ImportResultVO result = new ImportResultVO();
@@ -276,12 +382,12 @@ public class CcdiIntermediaryController extends BaseController {
/**
* 查询实体中介导入状态
*/
@Operation(summary = "查询实体中介导入状态")
@Operation(summary = "查询中介实体关联关系导入状态")
@PreAuthorize("@ss.hasPermi('ccdi:intermediary:import')")
@GetMapping("/importEntityStatus/{taskId}")
public AjaxResult getEntityImportStatus(@PathVariable String taskId) {
@GetMapping("/importEnterpriseRelationStatus/{taskId}")
public AjaxResult getEnterpriseRelationImportStatus(@PathVariable String taskId) {
try {
ImportStatusVO status = entityImportService.getImportStatus(taskId);
ImportStatusVO status = enterpriseRelationImportService.getImportStatus(taskId);
return success(status);
} catch (Exception e) {
return error(e.getMessage());
@@ -289,18 +395,18 @@ public class CcdiIntermediaryController extends BaseController {
}
/**
* 查询实体中介导入失败记录
* 查询中介实体关联关系导入失败记录
*/
@Operation(summary = "查询实体中介导入失败记录")
@Operation(summary = "查询中介实体关联关系导入失败记录")
@PreAuthorize("@ss.hasPermi('ccdi:intermediary:import')")
@GetMapping("/importEntityFailures/{taskId}")
public TableDataInfo getEntityImportFailures(
@GetMapping("/importEnterpriseRelationFailures/{taskId}")
public TableDataInfo getEnterpriseRelationImportFailures(
@PathVariable String taskId,
@RequestParam(defaultValue = "1") Integer pageNum,
@RequestParam(defaultValue = "10") Integer pageSize) {
List<IntermediaryEntityImportFailureVO> failures =
entityImportService.getImportFailures(taskId);
List<IntermediaryEnterpriseRelationImportFailureVO> failures =
enterpriseRelationImportService.getImportFailures(taskId);
// 手动分页
int fromIndex = (pageNum - 1) * pageSize;
@@ -311,7 +417,7 @@ public class CcdiIntermediaryController extends BaseController {
return getDataTable(new ArrayList<>(), failures.size());
}
List<IntermediaryEntityImportFailureVO> pageData = failures.subList(fromIndex, toIndex);
List<IntermediaryEnterpriseRelationImportFailureVO> pageData = failures.subList(fromIndex, toIndex);
return getDataTable(pageData, failures.size());
}

View File

@@ -5,6 +5,7 @@ import com.ruoyi.info.collection.domain.dto.CcdiPurchaseTransactionAddDTO;
import com.ruoyi.info.collection.domain.dto.CcdiPurchaseTransactionEditDTO;
import com.ruoyi.info.collection.domain.dto.CcdiPurchaseTransactionQueryDTO;
import com.ruoyi.info.collection.domain.excel.CcdiPurchaseTransactionExcel;
import com.ruoyi.info.collection.domain.excel.CcdiPurchaseTransactionSupplierExcel;
import com.ruoyi.info.collection.domain.vo.CcdiPurchaseTransactionVO;
import com.ruoyi.info.collection.domain.vo.ImportResultVO;
import com.ruoyi.info.collection.domain.vo.ImportStatusVO;
@@ -33,12 +34,12 @@ import java.util.ArrayList;
import java.util.List;
/**
* 采购交易信息Controller
* 招投标信息维护Controller
*
* @author ruoyi
* @date 2026-02-06
*/
@Tag(name = "采购交易信息管理")
@Tag(name = "招投标信息维护")
@RestController
@RequestMapping("/ccdi/purchaseTransaction")
public class CcdiPurchaseTransactionController extends BaseController {
@@ -50,9 +51,9 @@ public class CcdiPurchaseTransactionController extends BaseController {
private ICcdiPurchaseTransactionImportService transactionImportService;
/**
* 查询采购交易列表
* 查询招投标信息列表
*/
@Operation(summary = "查询采购交易列表")
@Operation(summary = "查询招投标信息列表")
@PreAuthorize("@ss.hasPermi('ccdi:purchaseTransaction:list')")
@GetMapping("/list")
public TableDataInfo list(CcdiPurchaseTransactionQueryDTO queryDTO) {
@@ -64,21 +65,9 @@ public class CcdiPurchaseTransactionController extends BaseController {
}
/**
* 导出采购交易列表
* 获取招投标信息详细信息
*/
@Operation(summary = "导出采购交易列表")
@PreAuthorize("@ss.hasPermi('ccdi:purchaseTransaction:export')")
@Log(title = "采购交易信息", businessType = BusinessType.EXPORT)
@PostMapping("/export")
public void export(HttpServletResponse response, CcdiPurchaseTransactionQueryDTO queryDTO) {
List<CcdiPurchaseTransactionExcel> list = transactionService.selectTransactionListForExport(queryDTO);
EasyExcelUtil.exportExcel(response, list, CcdiPurchaseTransactionExcel.class, "采购交易信息");
}
/**
* 获取采购交易详细信息
*/
@Operation(summary = "获取采购交易详细信息")
@Operation(summary = "获取招投标信息详细信息")
@Parameter(name = "purchaseId", description = "采购事项ID", required = true)
@PreAuthorize("@ss.hasPermi('ccdi:purchaseTransaction:query')")
@GetMapping(value = "/{purchaseId}")
@@ -87,66 +76,81 @@ public class CcdiPurchaseTransactionController extends BaseController {
}
/**
* 新增采购交易
* 新增招投标信息
*/
@Operation(summary = "新增采购交易")
@Operation(summary = "新增招投标信息")
@PreAuthorize("@ss.hasPermi('ccdi:purchaseTransaction:add')")
@Log(title = "采购交易信息", businessType = BusinessType.INSERT)
@Log(title = "招投标信息维护", businessType = BusinessType.INSERT)
@PostMapping
public AjaxResult add(@Validated @RequestBody CcdiPurchaseTransactionAddDTO addDTO) {
return toAjax(transactionService.insertTransaction(addDTO));
}
/**
* 修改采购交易
* 修改招投标信息
*/
@Operation(summary = "修改采购交易")
@Operation(summary = "修改招投标信息")
@PreAuthorize("@ss.hasPermi('ccdi:purchaseTransaction:edit')")
@Log(title = "采购交易信息", businessType = BusinessType.UPDATE)
@Log(title = "招投标信息维护", businessType = BusinessType.UPDATE)
@PutMapping
public AjaxResult edit(@Validated @RequestBody CcdiPurchaseTransactionEditDTO editDTO) {
return toAjax(transactionService.updateTransaction(editDTO));
}
/**
* 删除采购交易
* 删除招投标信息
*/
@Operation(summary = "删除采购交易")
@Operation(summary = "删除招投标信息")
@Parameter(name = "purchaseIds", description = "采购事项ID数组", required = true)
@PreAuthorize("@ss.hasPermi('ccdi:purchaseTransaction:remove')")
@Log(title = "采购交易信息", businessType = BusinessType.DELETE)
@Log(title = "招投标信息维护", businessType = BusinessType.DELETE)
@DeleteMapping("/{purchaseIds}")
public AjaxResult remove(@PathVariable String[] purchaseIds) {
return toAjax(transactionService.deleteTransactionByIds(purchaseIds));
}
/**
* 下载带字典下拉框的导入模板
* 使用@DictDropdown注解自动添加下拉框
* 下载双Sheet导入模板
*/
@Operation(summary = "下载导入模板")
@PostMapping("/importTemplate")
public void importTemplate(HttpServletResponse response) {
EasyExcelUtil.importTemplateWithDictDropdown(response, CcdiPurchaseTransactionExcel.class, "采购交易信息");
EasyExcelUtil.importTemplateWithDictDropdown(
response,
CcdiPurchaseTransactionExcel.class,
"招投标主信息",
CcdiPurchaseTransactionSupplierExcel.class,
"供应商明细",
"招投标信息维护导入模板"
);
}
/**
* 异步导入采购交易
* 异步导入招投标信息
*/
@Operation(summary = "异步导入采购交易")
@Operation(summary = "异步导入招投标信息")
@Parameter(name = "file", description = "导入文件", required = true)
@PreAuthorize("@ss.hasPermi('ccdi:purchaseTransaction:import')")
@Log(title = "采购交易信息", businessType = BusinessType.IMPORT)
@Log(title = "招投标信息维护", businessType = BusinessType.IMPORT)
@PostMapping("/importData")
public AjaxResult importData(@Parameter(description = "导入文件") MultipartFile file) throws Exception {
List<CcdiPurchaseTransactionExcel> list = EasyExcelUtil.importExcel(file.getInputStream(), CcdiPurchaseTransactionExcel.class);
List<CcdiPurchaseTransactionExcel> mainList = EasyExcelUtil.importExcel(
file.getInputStream(),
CcdiPurchaseTransactionExcel.class,
"招投标主信息"
);
List<CcdiPurchaseTransactionSupplierExcel> supplierList = EasyExcelUtil.importExcel(
file.getInputStream(),
CcdiPurchaseTransactionSupplierExcel.class,
"供应商明细"
);
if (list == null || list.isEmpty()) {
if ((mainList == null || mainList.isEmpty()) && (supplierList == null || supplierList.isEmpty())) {
return error("至少需要一条数据");
}
// 提交异步任务
String taskId = transactionService.importTransaction(list);
String taskId = transactionService.importTransaction(mainList, supplierList);
// 立即返回,不等待后台任务完成
ImportResultVO result = new ImportResultVO();

View File

@@ -5,6 +5,7 @@ import com.ruoyi.info.collection.domain.dto.CcdiStaffEnterpriseRelationAddDTO;
import com.ruoyi.info.collection.domain.dto.CcdiStaffEnterpriseRelationEditDTO;
import com.ruoyi.info.collection.domain.dto.CcdiStaffEnterpriseRelationQueryDTO;
import com.ruoyi.info.collection.domain.excel.CcdiStaffEnterpriseRelationExcel;
import com.ruoyi.info.collection.domain.vo.CcdiStaffEnterpriseRelationOptionVO;
import com.ruoyi.info.collection.domain.vo.CcdiStaffEnterpriseRelationVO;
import com.ruoyi.info.collection.domain.vo.ImportResultVO;
import com.ruoyi.info.collection.domain.vo.ImportStatusVO;
@@ -33,12 +34,12 @@ import java.util.ArrayList;
import java.util.List;
/**
* 员工实体关系信息Controller
* 员工亲属实体关Controller
*
* @author ruoyi
* @date 2026-02-09
*/
@Tag(name = "员工实体关系信息管理")
@Tag(name = "员工亲属实体关管理")
@RestController
@RequestMapping("/ccdi/staffEnterpriseRelation")
public class CcdiStaffEnterpriseRelationController extends BaseController {
@@ -50,9 +51,9 @@ public class CcdiStaffEnterpriseRelationController extends BaseController {
private ICcdiStaffEnterpriseRelationImportService relationImportService;
/**
* 查询员工实体关列表
* 查询员工亲属实体关列表
*/
@Operation(summary = "查询员工实体关列表")
@Operation(summary = "查询员工亲属实体关列表")
@PreAuthorize("@ss.hasPermi('ccdi:staffEnterpriseRelation:list')")
@GetMapping("/list")
public TableDataInfo list(CcdiStaffEnterpriseRelationQueryDTO queryDTO) {
@@ -64,21 +65,20 @@ public class CcdiStaffEnterpriseRelationController extends BaseController {
}
/**
* 导出员工实体关系列表
* 查询有效员工亲属下拉列表
*/
@Operation(summary = "导出员工实体关系列表")
@PreAuthorize("@ss.hasPermi('ccdi:staffEnterpriseRelation:export')")
@Log(title = "员工实体关系信息", businessType = BusinessType.EXPORT)
@PostMapping("/export")
public void export(HttpServletResponse response, CcdiStaffEnterpriseRelationQueryDTO queryDTO) {
List<CcdiStaffEnterpriseRelationExcel> list = relationService.selectRelationListForExport(queryDTO);
EasyExcelUtil.exportExcel(response, list, CcdiStaffEnterpriseRelationExcel.class, "员工实体关系信息");
@Operation(summary = "查询有效员工亲属下拉列表")
@PreAuthorize("@ss.hasPermi('ccdi:staffEnterpriseRelation:list')")
@GetMapping("/familyOptions")
public AjaxResult familyOptions(@RequestParam(required = false) String query) {
List<CcdiStaffEnterpriseRelationOptionVO> list = relationService.selectFamilyOptions(query);
return success(list);
}
/**
* 获取员工实体关详细信息
* 获取员工亲属实体关详细信息
*/
@Operation(summary = "获取员工实体关详细信息")
@Operation(summary = "获取员工亲属实体关详细信息")
@Parameter(name = "id", description = "主键ID", required = true)
@PreAuthorize("@ss.hasPermi('ccdi:staffEnterpriseRelation:query')")
@GetMapping(value = "/{id}")
@@ -87,34 +87,34 @@ public class CcdiStaffEnterpriseRelationController extends BaseController {
}
/**
* 新增员工实体关
* 新增员工亲属实体关
*/
@Operation(summary = "新增员工实体关")
@Operation(summary = "新增员工亲属实体关")
@PreAuthorize("@ss.hasPermi('ccdi:staffEnterpriseRelation:add')")
@Log(title = "员工实体关系信息", businessType = BusinessType.INSERT)
@Log(title = "员工亲属实体关", businessType = BusinessType.INSERT)
@PostMapping
public AjaxResult add(@Validated @RequestBody CcdiStaffEnterpriseRelationAddDTO addDTO) {
return toAjax(relationService.insertRelation(addDTO));
}
/**
* 修改员工实体关
* 修改员工亲属实体关
*/
@Operation(summary = "修改员工实体关")
@Operation(summary = "修改员工亲属实体关")
@PreAuthorize("@ss.hasPermi('ccdi:staffEnterpriseRelation:edit')")
@Log(title = "员工实体关系信息", businessType = BusinessType.UPDATE)
@Log(title = "员工亲属实体关", businessType = BusinessType.UPDATE)
@PutMapping
public AjaxResult edit(@Validated @RequestBody CcdiStaffEnterpriseRelationEditDTO editDTO) {
return toAjax(relationService.updateRelation(editDTO));
}
/**
* 删除员工实体关
* 删除员工亲属实体关
*/
@Operation(summary = "删除员工实体关")
@Operation(summary = "删除员工亲属实体关")
@Parameter(name = "ids", description = "主键ID数组", required = true)
@PreAuthorize("@ss.hasPermi('ccdi:staffEnterpriseRelation:remove')")
@Log(title = "员工实体关系信息", businessType = BusinessType.DELETE)
@Log(title = "员工亲属实体关", businessType = BusinessType.DELETE)
@DeleteMapping("/{ids}")
public AjaxResult remove(@PathVariable Long[] ids) {
return toAjax(relationService.deleteRelationByIds(ids));
@@ -127,16 +127,16 @@ public class CcdiStaffEnterpriseRelationController extends BaseController {
@Operation(summary = "下载导入模板")
@PostMapping("/importTemplate")
public void importTemplate(HttpServletResponse response) {
EasyExcelUtil.importTemplateWithDictDropdown(response, CcdiStaffEnterpriseRelationExcel.class, "员工实体关系信息");
EasyExcelUtil.importTemplateWithDictDropdown(response, CcdiStaffEnterpriseRelationExcel.class, "员工亲属实体关");
}
/**
* 异步导入员工实体关
* 异步导入员工亲属实体关
*/
@Operation(summary = "异步导入员工实体关")
@Operation(summary = "异步导入员工亲属实体关")
@Parameter(name = "file", description = "导入文件", required = true)
@PreAuthorize("@ss.hasPermi('ccdi:staffEnterpriseRelation:import')")
@Log(title = "员工实体关系信息", businessType = BusinessType.IMPORT)
@Log(title = "员工亲属实体关", businessType = BusinessType.IMPORT)
@PostMapping("/importData")
public AjaxResult importData(@Parameter(description = "导入文件") MultipartFile file) throws Exception {
List<CcdiStaffEnterpriseRelationExcel> list = EasyExcelUtil.importExcel(file.getInputStream(), CcdiStaffEnterpriseRelationExcel.class);
@@ -152,9 +152,9 @@ public class CcdiStaffEnterpriseRelationController extends BaseController {
ImportResultVO result = new ImportResultVO();
result.setTaskId(taskId);
result.setStatus("PROCESSING");
result.setMessage("导入任务已提交,正在后台处理");
result.setMessage("员工亲属实体关联导入任务已提交,正在后台处理");
return AjaxResult.success("导入任务已提交,正在后台处理", result);
return AjaxResult.success("员工亲属实体关联导入任务已提交,正在后台处理", result);
}
/**

View File

@@ -4,11 +4,13 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.info.collection.domain.dto.CcdiStaffFmyRelationAddDTO;
import com.ruoyi.info.collection.domain.dto.CcdiStaffFmyRelationEditDTO;
import com.ruoyi.info.collection.domain.dto.CcdiStaffFmyRelationQueryDTO;
import com.ruoyi.info.collection.domain.excel.CcdiAssetInfoExcel;
import com.ruoyi.info.collection.domain.excel.CcdiStaffFmyRelationExcel;
import com.ruoyi.info.collection.domain.vo.CcdiStaffFmyRelationVO;
import com.ruoyi.info.collection.domain.vo.ImportResultVO;
import com.ruoyi.info.collection.domain.vo.ImportStatusVO;
import com.ruoyi.info.collection.domain.vo.StaffFmyRelationImportFailureVO;
import com.ruoyi.info.collection.domain.vo.StaffFmyRelationImportSubmitResultVO;
import com.ruoyi.info.collection.service.ICcdiAssetInfoImportService;
import com.ruoyi.info.collection.service.ICcdiStaffFmyRelationImportService;
import com.ruoyi.info.collection.service.ICcdiStaffFmyRelationService;
import com.ruoyi.info.collection.utils.EasyExcelUtil;
@@ -49,6 +51,9 @@ public class CcdiStaffFmyRelationController extends BaseController {
@Resource
private ICcdiStaffFmyRelationImportService relationImportService;
@Resource
private ICcdiAssetInfoImportService assetInfoImportService;
/**
* 查询员工亲属关系列表
*/
@@ -63,18 +68,6 @@ public class CcdiStaffFmyRelationController extends BaseController {
return getDataTable(result.getRecords(), result.getTotal());
}
/**
* 导出员工亲属关系列表
*/
@Operation(summary = "导出员工亲属关系列表")
@PreAuthorize("@ss.hasPermi('ccdi:staffFmyRelation:export')")
@Log(title = "员工亲属关系", businessType = BusinessType.EXPORT)
@PostMapping("/export")
public void export(HttpServletResponse response, CcdiStaffFmyRelationQueryDTO queryDTO) {
List<CcdiStaffFmyRelationExcel> list = relationService.selectRelationListForExport(queryDTO);
EasyExcelUtil.exportExcel(response, list, CcdiStaffFmyRelationExcel.class, "员工亲属关系信息");
}
/**
* 获取员工亲属关系详细信息
*/
@@ -127,7 +120,14 @@ public class CcdiStaffFmyRelationController extends BaseController {
@Operation(summary = "下载导入模板")
@PostMapping("/importTemplate")
public void importTemplate(HttpServletResponse response) {
EasyExcelUtil.importTemplateWithDictDropdown(response, CcdiStaffFmyRelationExcel.class, "员工亲属关系信息");
EasyExcelUtil.importTemplateWithDictDropdown(
response,
CcdiStaffFmyRelationExcel.class,
"员工亲属关系信息",
CcdiAssetInfoExcel.class,
"亲属资产信息",
"员工亲属关系维护导入模板"
);
}
/**
@@ -139,20 +139,32 @@ public class CcdiStaffFmyRelationController extends BaseController {
@Log(title = "员工亲属关系", businessType = BusinessType.IMPORT)
@PostMapping("/importData")
public AjaxResult importData(@Parameter(description = "导入文件") MultipartFile file) throws Exception {
List<CcdiStaffFmyRelationExcel> list = EasyExcelUtil.importExcel(file.getInputStream(), CcdiStaffFmyRelationExcel.class);
List<CcdiStaffFmyRelationExcel> relationList = EasyExcelUtil.importExcel(
file.getInputStream(),
CcdiStaffFmyRelationExcel.class,
"员工亲属关系信息"
);
List<CcdiAssetInfoExcel> assetList = EasyExcelUtil.importExcel(
file.getInputStream(),
CcdiAssetInfoExcel.class,
"亲属资产信息"
);
if (list == null || list.isEmpty()) {
boolean hasRelationRows = relationList != null && !relationList.isEmpty();
boolean hasAssetRows = assetList != null && !assetList.isEmpty();
if (!hasRelationRows && !hasAssetRows) {
return error("至少需要一条数据");
}
// 提交异步任务
String taskId = relationService.importRelation(list);
// 立即返回,不等待后台任务完成
ImportResultVO result = new ImportResultVO();
result.setTaskId(taskId);
result.setStatus("PROCESSING");
result.setMessage("导入任务已提交,正在后台处理");
StaffFmyRelationImportSubmitResultVO result = new StaffFmyRelationImportSubmitResultVO();
if (hasRelationRows) {
result.setRelationTaskId(relationService.importRelation(relationList));
}
if (hasAssetRows) {
result.setAssetTaskId(assetInfoImportService.importAssetInfo(assetList));
}
result.setMessage(buildImportSubmitMessage(hasRelationRows, hasAssetRows));
return AjaxResult.success("导入任务已提交,正在后台处理", result);
}
@@ -198,4 +210,14 @@ public class CcdiStaffFmyRelationController extends BaseController {
return getDataTable(pageData, failures.size());
}
private String buildImportSubmitMessage(boolean hasRelationRows, boolean hasAssetRows) {
if (hasRelationRows && hasAssetRows) {
return "已提交员工亲属关系和亲属资产信息导入任务";
}
if (hasRelationRows) {
return "已提交员工亲属关系导入任务";
}
return "已提交亲属资产信息导入任务";
}
}

View File

@@ -64,18 +64,6 @@ public class CcdiStaffRecruitmentController extends BaseController {
return getDataTable(result.getRecords(), result.getTotal());
}
/**
* 导出招聘信息列表
*/
@Operation(summary = "导出招聘信息列表")
@PreAuthorize("@ss.hasPermi('ccdi:staffRecruitment:export')")
@Log(title = "员工招聘信息", businessType = BusinessType.EXPORT)
@PostMapping("/export")
public void export(HttpServletResponse response, CcdiStaffRecruitmentQueryDTO queryDTO) {
List<CcdiStaffRecruitmentExcel> list = recruitmentService.selectRecruitmentListForExport(queryDTO);
EasyExcelUtil.exportExcel(response, list, CcdiStaffRecruitmentExcel.class, "员工招聘信息");
}
/**
* 获取招聘信息详细信息
*/
@@ -126,16 +114,14 @@ public class CcdiStaffRecruitmentController extends BaseController {
@Operation(summary = "下载导入模板")
@PostMapping("/importTemplate")
public void importTemplate(HttpServletResponse response) {
EasyExcelUtil.importTemplateWithDictDropdown(response, CcdiStaffRecruitmentExcel.class, "员工招聘信息");
}
/**
* 下载历史工作经历导入模板
*/
@Operation(summary = "下载历史工作经历导入模板")
@PostMapping("/workImportTemplate")
public void workImportTemplate(HttpServletResponse response) {
EasyExcelUtil.importTemplateWithDictDropdown(response, CcdiStaffRecruitmentWorkExcel.class, "历史工作经历");
EasyExcelUtil.importTemplateWithDictDropdown(
response,
CcdiStaffRecruitmentExcel.class,
"招聘信息",
CcdiStaffRecruitmentWorkExcel.class,
"历史工作经历",
"招聘信息管理导入模板"
);
}
/**
@@ -147,16 +133,25 @@ public class CcdiStaffRecruitmentController extends BaseController {
@Log(title = "员工招聘信息", businessType = BusinessType.IMPORT)
@PostMapping("/importData")
public AjaxResult importData(@Parameter(description = "导入文件") MultipartFile file) throws Exception {
List<CcdiStaffRecruitmentExcel> list = EasyExcelUtil.importExcel(file.getInputStream(), CcdiStaffRecruitmentExcel.class);
List<CcdiStaffRecruitmentExcel> recruitmentList = EasyExcelUtil.importExcel(
file.getInputStream(),
CcdiStaffRecruitmentExcel.class,
"招聘信息"
);
List<CcdiStaffRecruitmentWorkExcel> workList = EasyExcelUtil.importExcel(
file.getInputStream(),
CcdiStaffRecruitmentWorkExcel.class,
"历史工作经历"
);
if (list == null || list.isEmpty()) {
boolean hasRecruitmentRows = recruitmentList != null && !recruitmentList.isEmpty();
boolean hasWorkRows = workList != null && !workList.isEmpty();
if (!hasRecruitmentRows && !hasWorkRows) {
return error("至少需要一条数据");
}
// 提交异步任务
String taskId = recruitmentService.importRecruitment(list);
String taskId = recruitmentService.importRecruitment(recruitmentList, workList);
// 立即返回,不等待后台任务完成
ImportResultVO result = new ImportResultVO();
result.setTaskId(taskId);
result.setStatus("PROCESSING");
@@ -165,31 +160,6 @@ public class CcdiStaffRecruitmentController extends BaseController {
return AjaxResult.success("导入任务已提交,正在后台处理", result);
}
/**
* 异步导入历史工作经历
*/
@Operation(summary = "异步导入历史工作经历")
@Parameter(name = "file", description = "导入文件", required = true)
@PreAuthorize("@ss.hasPermi('ccdi:staffRecruitment:import')")
@Log(title = "员工招聘历史工作经历", businessType = BusinessType.IMPORT)
@PostMapping("/importWorkData")
public AjaxResult importWorkData(@Parameter(description = "导入文件") MultipartFile file) throws Exception {
List<CcdiStaffRecruitmentWorkExcel> list = EasyExcelUtil.importExcel(file.getInputStream(), CcdiStaffRecruitmentWorkExcel.class);
if (list == null || list.isEmpty()) {
return error("至少需要一条数据");
}
String taskId = recruitmentService.importRecruitmentWork(list);
ImportResultVO result = new ImportResultVO();
result.setTaskId(taskId);
result.setStatus("PROCESSING");
result.setMessage("历史工作经历导入任务已提交,正在后台处理");
return AjaxResult.success("历史工作经历导入任务已提交,正在后台处理", result);
}
/**
* 查询导入状态
*/

View File

@@ -63,18 +63,6 @@ public class CcdiStaffTransferController extends BaseController {
return getDataTable(result.getRecords(), result.getTotal());
}
/**
* 导出员工调动记录列表
*/
@Operation(summary = "导出员工调动记录列表")
@PreAuthorize("@ss.hasPermi('ccdi:staffTransfer:export')")
@Log(title = "员工调动记录", businessType = BusinessType.EXPORT)
@PostMapping("/export")
public void export(HttpServletResponse response, CcdiStaffTransferQueryDTO queryDTO) {
List<CcdiStaffTransferExcel> list = transferService.selectTransferListForExport(queryDTO);
EasyExcelUtil.exportExcel(response, list, CcdiStaffTransferExcel.class, "员工调动记录信息");
}
/**
* 获取员工调动记录详细信息
*/

View File

@@ -9,6 +9,7 @@ import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;
/**
@@ -56,6 +57,42 @@ public class CcdiAccountInfo implements Serializable {
/** 币种 */
private String currency;
/** 是否实控账户0-否 1-是 */
@TableField("is_self_account")
private Integer isActualControl;
/** 月均交易笔数 */
@TableField("monthly_avg_trans_count")
private Integer avgMonthTxnCount;
/** 月均交易金额 */
@TableField("monthly_avg_trans_amount")
private BigDecimal avgMonthTxnAmount;
/** 交易频率等级 */
@TableField("trans_freq_type")
private String txnFrequencyLevel;
/** 借方单笔最高额 */
@TableField("dr_max_single_amount")
private BigDecimal debitSingleMaxAmount;
/** 贷方单笔最高额 */
@TableField("cr_max_single_amount")
private BigDecimal creditSingleMaxAmount;
/** 借方日累计最高额 */
@TableField("dr_max_daily_amount")
private BigDecimal debitDailyMaxAmount;
/** 贷方日累计最高额 */
@TableField("cr_max_daily_amount")
private BigDecimal creditDailyMaxAmount;
/** 风险等级 */
@TableField("trans_risk_level")
private String txnRiskLevel;
/** 状态1-正常 2-已销户 */
private Integer status;

View File

@@ -1,86 +0,0 @@
package com.ruoyi.info.collection.domain;
import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;
/**
* 账户分析结果对象 ccdi_account_result
*
* @author ruoyi
* @date 2026-04-13
*/
@Data
@TableName("ccdi_account_result")
public class CcdiAccountResult implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/** 主键ID */
@TableId(value = "result_id", type = IdType.AUTO)
private Long resultId;
/** 账户号码 */
private String accountNo;
/** 是否实控账户0-否 1-是 */
@TableField("is_self_account")
private Integer isActualControl;
/** 月均交易笔数 */
@TableField("monthly_avg_trans_count")
private Integer avgMonthTxnCount;
/** 月均交易金额 */
@TableField("monthly_avg_trans_amount")
private BigDecimal avgMonthTxnAmount;
/** 交易频率等级 */
@TableField("trans_freq_type")
private String txnFrequencyLevel;
/** 借方单笔最高额 */
@TableField("dr_max_single_amount")
private BigDecimal debitSingleMaxAmount;
/** 贷方单笔最高额 */
@TableField("cr_max_single_amount")
private BigDecimal creditSingleMaxAmount;
/** 借方日累计最高额 */
@TableField("dr_max_daily_amount")
private BigDecimal debitDailyMaxAmount;
/** 贷方日累计最高额 */
@TableField("cr_max_daily_amount")
private BigDecimal creditDailyMaxAmount;
/** 风险等级 */
@TableField("trans_risk_level")
private String txnRiskLevel;
/** 创建者 */
@TableField(fill = FieldFill.INSERT)
private String createBy;
/** 创建时间 */
@TableField(fill = FieldFill.INSERT)
private Date createTime;
/** 更新者 */
@TableField(fill = FieldFill.INSERT_UPDATE)
private String updateBy;
/** 更新时间 */
@TableField(fill = FieldFill.INSERT_UPDATE)
private Date updateTime;
}

View File

@@ -43,6 +43,10 @@ public class CcdiBaseStaff implements Serializable {
/** 入职时间 */
private Date hireDate;
/** 是否党员0-否 1-是 */
@TableField("is_party_member")
private Integer partyMember;
/** 状态 */
private String status;

View File

@@ -63,7 +63,7 @@ public class CcdiBizIntermediary implements Serializable {
/** 职位 */
private String position;
/** 关联人员ID */
/** 关联中介本人证件号码 */
private String relatedNumId;
/** 数据来源MANUAL:手动录入, SYSTEM:系统同步, IMPORT:批量导入, API:接口获取 */

View File

@@ -0,0 +1,46 @@
package com.ruoyi.info.collection.domain;
import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
import java.util.Date;
/**
* 中介关联机构关系对象 ccdi_intermediary_enterprise_relation
*/
@Data
@TableName("ccdi_intermediary_enterprise_relation")
public class CcdiIntermediaryEnterpriseRelation implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
@TableId(type = IdType.AUTO)
private Long id;
private String intermediaryBizId;
private String socialCreditCode;
private String relationPersonPost;
private String remark;
@TableField(fill = FieldFill.INSERT)
private String createdBy;
@TableField(fill = FieldFill.INSERT)
private Date createTime;
@TableField(fill = FieldFill.INSERT_UPDATE)
private String updatedBy;
@TableField(fill = FieldFill.INSERT_UPDATE)
private Date updateTime;
}

View File

@@ -0,0 +1,64 @@
package com.ruoyi.info.collection.domain;
import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
import java.util.Date;
/**
* 招投标供应商明细对象 ccdi_purchase_transaction_supplier
*/
@Data
public class CcdiPurchaseTransactionSupplier implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
@TableId(type = IdType.AUTO)
private Long id;
/** 采购事项ID */
private String purchaseId;
/** 供应商名称 */
private String supplierName;
/** 供应商统一信用代码 */
private String supplierUscc;
/** 供应商联系人 */
private String contactPerson;
/** 供应商联系电话 */
private String contactPhone;
/** 供应商银行账户 */
private String supplierBankAccount;
/** 是否中标1-是0-否 */
private Integer isBidWinner;
/** 排序 */
private Integer sortOrder;
/** 创建时间 */
@TableField(fill = FieldFill.INSERT)
private Date createTime;
/** 更新时间 */
@TableField(fill = FieldFill.INSERT_UPDATE)
private Date updateTime;
/** 创建人 */
@TableField(fill = FieldFill.INSERT)
private String createdBy;
/** 更新人 */
@TableField(fill = FieldFill.INSERT_UPDATE)
private String updatedBy;
}

View File

@@ -53,6 +53,10 @@ public class CcdiBaseStaffAddDTO implements Serializable {
/** 入职时间 */
private Date hireDate;
/** 是否党员0-否 1-是 */
@NotNull(message = "是否党员不能为空")
private Integer partyMember;
/** 状态 */
@NotBlank(message = "状态不能为空")
private String status;

View File

@@ -52,6 +52,10 @@ public class CcdiBaseStaffEditDTO implements Serializable {
/** 入职时间 */
private Date hireDate;
/** 是否党员0-否 1-是 */
@NotNull(message = "是否党员不能为空")
private Integer partyMember;
/** 状态 */
private String status;

View File

@@ -0,0 +1,105 @@
package com.ruoyi.info.collection.domain.dto;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.Pattern;
import jakarta.validation.constraints.Size;
import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
import java.util.Date;
/**
* 实体库管理新增 DTO
*
* @author ruoyi
* @date 2026-04-17
*/
@Data
@Schema(description = "实体库管理新增DTO")
public class CcdiEnterpriseBaseInfoAddDTO implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
@Schema(description = "统一社会信用代码")
@NotBlank(message = "统一社会信用代码不能为空")
@Pattern(regexp = "^[0-9A-HJ-NPQRTUWXY]{2}\\d{6}[0-9A-HJ-NPQRTUWXY]{10}$", message = "统一社会信用代码格式不正确")
private String socialCreditCode;
@Schema(description = "企业名称")
@NotBlank(message = "企业名称不能为空")
@Size(max = 200, message = "企业名称长度不能超过200个字符")
private String enterpriseName;
@Schema(description = "企业类型")
@Size(max = 50, message = "企业类型长度不能超过50个字符")
private String enterpriseType;
@Schema(description = "企业性质")
@Size(max = 50, message = "企业性质长度不能超过50个字符")
private String enterpriseNature;
@Schema(description = "行业分类")
@Size(max = 100, message = "行业分类长度不能超过100个字符")
private String industryClass;
@Schema(description = "所属行业")
@Size(max = 100, message = "所属行业长度不能超过100个字符")
private String industryName;
@Schema(description = "成立日期")
private Date establishDate;
@Schema(description = "注册地址")
@Size(max = 500, message = "注册地址长度不能超过500个字符")
private String registerAddress;
@Schema(description = "法定代表人")
@Size(max = 100, message = "法定代表人长度不能超过100个字符")
private String legalRepresentative;
@Schema(description = "法定代表人证件类型")
@Size(max = 50, message = "法定代表人证件类型长度不能超过50个字符")
private String legalCertType;
@Schema(description = "法定代表人证件号码")
@Size(max = 50, message = "法定代表人证件号码长度不能超过50个字符")
private String legalCertNo;
@Schema(description = "股东1")
@Size(max = 100, message = "股东1长度不能超过100个字符")
private String shareholder1;
@Schema(description = "股东2")
@Size(max = 100, message = "股东2长度不能超过100个字符")
private String shareholder2;
@Schema(description = "股东3")
@Size(max = 100, message = "股东3长度不能超过100个字符")
private String shareholder3;
@Schema(description = "股东4")
@Size(max = 100, message = "股东4长度不能超过100个字符")
private String shareholder4;
@Schema(description = "股东5")
@Size(max = 100, message = "股东5长度不能超过100个字符")
private String shareholder5;
@Schema(description = "经营状态")
@Size(max = 50, message = "经营状态长度不能超过50个字符")
private String status;
@Schema(description = "风险等级")
@NotBlank(message = "风险等级不能为空")
private String riskLevel;
@Schema(description = "企业来源")
@NotBlank(message = "企业来源不能为空")
private String entSource;
@Schema(description = "数据来源")
private String dataSource;
}

View File

@@ -0,0 +1,106 @@
package com.ruoyi.info.collection.domain.dto;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.Pattern;
import jakarta.validation.constraints.Size;
import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
import java.util.Date;
/**
* 实体库管理编辑 DTO
*
* @author ruoyi
* @date 2026-04-17
*/
@Data
@Schema(description = "实体库管理编辑DTO")
public class CcdiEnterpriseBaseInfoEditDTO implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
@Schema(description = "统一社会信用代码")
@NotBlank(message = "统一社会信用代码不能为空")
@Pattern(regexp = "^[0-9A-HJ-NPQRTUWXY]{2}\\d{6}[0-9A-HJ-NPQRTUWXY]{10}$", message = "统一社会信用代码格式不正确")
private String socialCreditCode;
@Schema(description = "企业名称")
@NotBlank(message = "企业名称不能为空")
@Size(max = 200, message = "企业名称长度不能超过200个字符")
private String enterpriseName;
@Schema(description = "企业类型")
@Size(max = 50, message = "企业类型长度不能超过50个字符")
private String enterpriseType;
@Schema(description = "企业性质")
@Size(max = 50, message = "企业性质长度不能超过50个字符")
private String enterpriseNature;
@Schema(description = "行业分类")
@Size(max = 100, message = "行业分类长度不能超过100个字符")
private String industryClass;
@Schema(description = "所属行业")
@Size(max = 100, message = "所属行业长度不能超过100个字符")
private String industryName;
@Schema(description = "成立日期")
private Date establishDate;
@Schema(description = "注册地址")
@Size(max = 500, message = "注册地址长度不能超过500个字符")
private String registerAddress;
@Schema(description = "法定代表人")
@Size(max = 100, message = "法定代表人长度不能超过100个字符")
private String legalRepresentative;
@Schema(description = "法定代表人证件类型")
@Size(max = 50, message = "法定代表人证件类型长度不能超过50个字符")
private String legalCertType;
@Schema(description = "法定代表人证件号码")
@Size(max = 50, message = "法定代表人证件号码长度不能超过50个字符")
private String legalCertNo;
@Schema(description = "股东1")
@Size(max = 100, message = "股东1长度不能超过100个字符")
private String shareholder1;
@Schema(description = "股东2")
@Size(max = 100, message = "股东2长度不能超过100个字符")
private String shareholder2;
@Schema(description = "股东3")
@Size(max = 100, message = "股东3长度不能超过100个字符")
private String shareholder3;
@Schema(description = "股东4")
@Size(max = 100, message = "股东4长度不能超过100个字符")
private String shareholder4;
@Schema(description = "股东5")
@Size(max = 100, message = "股东5长度不能超过100个字符")
private String shareholder5;
@Schema(description = "经营状态")
@Size(max = 50, message = "经营状态长度不能超过50个字符")
private String status;
@Schema(description = "风险等级")
@NotBlank(message = "风险等级不能为空")
private String riskLevel;
@Schema(description = "企业来源")
@NotBlank(message = "企业来源不能为空")
private String entSource;
@Schema(description = "数据来源")
@NotBlank(message = "数据来源不能为空")
private String dataSource;
}

View File

@@ -0,0 +1,45 @@
package com.ruoyi.info.collection.domain.dto;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
/**
* 实体库管理查询 DTO
*
* @author ruoyi
* @date 2026-04-17
*/
@Data
@Schema(description = "实体库管理查询DTO")
public class CcdiEnterpriseBaseInfoQueryDTO implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
@Schema(description = "企业名称")
private String enterpriseName;
@Schema(description = "统一社会信用代码")
private String socialCreditCode;
@Schema(description = "企业类型")
private String enterpriseType;
@Schema(description = "企业性质")
private String enterpriseNature;
@Schema(description = "行业分类")
private String industryClass;
@Schema(description = "经营状态")
private String status;
@Schema(description = "风险等级")
private String riskLevel;
@Schema(description = "企业来源")
private String entSource;
}

View File

@@ -0,0 +1,33 @@
package com.ruoyi.info.collection.domain.dto;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.Size;
import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
/**
* 中介关联机构新增DTO
*/
@Data
@Schema(description = "中介关联机构新增DTO")
public class CcdiIntermediaryEnterpriseRelationAddDTO implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
@Schema(description = "统一社会信用代码")
@NotBlank(message = "统一社会信用代码不能为空")
@Size(max = 18, message = "统一社会信用代码长度不能超过18个字符")
private String socialCreditCode;
@Schema(description = "关联角色/职务")
@Size(max = 100, message = "关联角色/职务长度不能超过100个字符")
private String relationPersonPost;
@Schema(description = "备注")
@Size(max = 500, message = "备注长度不能超过500个字符")
private String remark;
}

View File

@@ -0,0 +1,38 @@
package com.ruoyi.info.collection.domain.dto;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import jakarta.validation.constraints.Size;
import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
/**
* 中介关联机构编辑DTO
*/
@Data
@Schema(description = "中介关联机构编辑DTO")
public class CcdiIntermediaryEnterpriseRelationEditDTO implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
@Schema(description = "主键ID")
@NotNull(message = "主键ID不能为空")
private Long id;
@Schema(description = "统一社会信用代码")
@NotBlank(message = "统一社会信用代码不能为空")
@Size(max = 18, message = "统一社会信用代码长度不能超过18个字符")
private String socialCreditCode;
@Schema(description = "关联角色/职务")
@Size(max = 100, message = "关联角色/职务长度不能超过100个字符")
private String relationPersonPost;
@Schema(description = "备注")
@Size(max = 500, message = "备注长度不能超过500个字符")
private String remark;
}

View File

@@ -67,8 +67,8 @@ public class CcdiIntermediaryPersonAddDTO implements Serializable {
@Size(max = 100, message = "职位长度不能超过100个字符")
private String position;
@Schema(description = "关联人员ID")
@Size(max = 50, message = "关联人员ID长度不能超过50个字符")
@Schema(description = "关联中介本人证件号码")
@Size(max = 50, message = "关联中介本人证件号码长度不能超过50个字符")
private String relatedNumId;
@Schema(description = "关联关系")

View File

@@ -70,8 +70,8 @@ public class CcdiIntermediaryPersonEditDTO implements Serializable {
@Size(max = 100, message = "职位长度不能超过100个字符")
private String position;
@Schema(description = "关联人员ID")
@Size(max = 50, message = "关联人员ID长度不能超过50个字符")
@Schema(description = "关联中介本人证件号码")
@Size(max = 50, message = "关联中介本人证件号码长度不能超过50个字符")
private String relatedNumId;
@Schema(description = "关联关系")

View File

@@ -19,12 +19,15 @@ public class CcdiIntermediaryQueryDTO implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
@Schema(description = "姓名/机构名称")
@Schema(description = "名称")
private String name;
@Schema(description = "证件号/统一社会信用代码")
@Schema(description = "证件号")
private String certificateNo;
@Schema(description = "中介类型(1=个人, 2=实体)")
private String intermediaryType;
@Schema(description = "记录类型(INTERMEDIARY/RELATIVE/ENTERPRISE_RELATION)")
private String recordType;
@Schema(description = "关联中介信息(姓名或证件号)")
private String relatedIntermediaryKeyword;
}

View File

@@ -0,0 +1,72 @@
package com.ruoyi.info.collection.domain.dto;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.Size;
import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
/**
* 中介亲属新增DTO
*/
@Data
@Schema(description = "中介亲属新增DTO")
public class CcdiIntermediaryRelativeAddDTO implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
@Schema(description = "姓名")
@NotBlank(message = "姓名不能为空")
@Size(max = 100, message = "姓名长度不能超过100个字符")
private String name;
@Schema(description = "人员类型")
private String personType;
@Schema(description = "亲属关系")
@NotBlank(message = "亲属关系不能为空")
@Size(max = 50, message = "亲属关系长度不能超过50个字符")
private String personSubType;
@Schema(description = "性别")
private String gender;
@Schema(description = "证件类型")
private String idType;
@Schema(description = "证件号码")
@NotBlank(message = "证件号码不能为空")
@Size(max = 50, message = "证件号码长度不能超过50个字符")
private String personId;
@Schema(description = "手机号码")
@Size(max = 20, message = "手机号码长度不能超过20个字符")
private String mobile;
@Schema(description = "微信号")
@Size(max = 50, message = "微信号长度不能超过50个字符")
private String wechatNo;
@Schema(description = "联系地址")
@Size(max = 200, message = "联系地址长度不能超过200个字符")
private String contactAddress;
@Schema(description = "所在公司")
@Size(max = 200, message = "所在公司长度不能超过200个字符")
private String company;
@Schema(description = "企业统一信用码")
@Size(max = 50, message = "企业统一信用码长度不能超过50个字符")
private String socialCreditCode;
@Schema(description = "职位")
@Size(max = 100, message = "职位长度不能超过100个字符")
private String position;
@Schema(description = "备注")
@Size(max = 500, message = "备注长度不能超过500个字符")
private String remark;
}

View File

@@ -0,0 +1,75 @@
package com.ruoyi.info.collection.domain.dto;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.Size;
import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
/**
* 中介亲属编辑DTO
*/
@Data
@Schema(description = "中介亲属编辑DTO")
public class CcdiIntermediaryRelativeEditDTO implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
@Schema(description = "人员ID")
@NotBlank(message = "人员ID不能为空")
private String bizId;
@Schema(description = "姓名")
@NotBlank(message = "姓名不能为空")
@Size(max = 100, message = "姓名长度不能超过100个字符")
private String name;
@Schema(description = "人员类型")
private String personType;
@Schema(description = "亲属关系")
@NotBlank(message = "亲属关系不能为空")
@Size(max = 50, message = "亲属关系长度不能超过50个字符")
private String personSubType;
@Schema(description = "性别")
private String gender;
@Schema(description = "证件类型")
private String idType;
@Schema(description = "证件号码")
@Size(max = 50, message = "证件号码长度不能超过50个字符")
private String personId;
@Schema(description = "手机号码")
@Size(max = 20, message = "手机号码长度不能超过20个字符")
private String mobile;
@Schema(description = "微信号")
@Size(max = 50, message = "微信号长度不能超过50个字符")
private String wechatNo;
@Schema(description = "联系地址")
@Size(max = 200, message = "联系地址长度不能超过200个字符")
private String contactAddress;
@Schema(description = "所在公司")
@Size(max = 200, message = "所在公司长度不能超过200个字符")
private String company;
@Schema(description = "企业统一信用码")
@Size(max = 50, message = "企业统一信用码长度不能超过50个字符")
private String socialCreditCode;
@Schema(description = "职位")
@Size(max = 100, message = "职位长度不能超过100个字符")
private String position;
@Schema(description = "备注")
@Size(max = 500, message = "备注长度不能超过500个字符")
private String remark;
}

View File

@@ -2,6 +2,7 @@ package com.ruoyi.info.collection.domain.dto;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.Valid;
import jakarta.validation.constraints.*;
import lombok.Data;
@@ -9,15 +10,16 @@ import java.io.Serial;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
/**
* 采购交易信息新增DTO
* 招投标信息新增DTO
*
* @author ruoyi
* @date 2026-02-06
*/
@Data
@Schema(description = "采购交易信息新增")
@Schema(description = "招投标信息新增")
public class CcdiPurchaseTransactionAddDTO implements Serializable {
@Serial
@@ -88,30 +90,10 @@ public class CcdiPurchaseTransactionAddDTO implements Serializable {
@Schema(description = "采购方式")
private String purchaseMethod;
/** 中标供应商名称 */
@Size(max = 200, message = "中标供应商名称长度不能超过200个字符")
@Schema(description = "中标供应商名称")
private String supplierName;
/** 供应商联系人 */
@Size(max = 50, message = "供应商联系人长度不能超过50个字符")
@Schema(description = "供应商联系人")
private String contactPerson;
/** 供应商联系电话 */
@Pattern(regexp = "^1[3-9]\\d{9}$|^0\\d{2,3}-?\\d{7,8}$", message = "供应商联系电话格式不正确")
@Schema(description = "供应商联系电话")
private String contactPhone;
/** 供应商统一信用代码 */
@Pattern(regexp = "^[0-9A-HJ-NPQRTUWXY]{2}\\d{6}[0-9A-HJ-NPQRTUWXY]{10}$", message = "供应商统一信用代码格式不正确")
@Schema(description = "供应商统一信用代码")
private String supplierUscc;
/** 供应商银行账户 */
@Size(max = 50, message = "供应商银行账户长度不能超过50个字符")
@Schema(description = "供应商银行账户")
private String supplierBankAccount;
/** 供应商明细 */
@Valid
@Schema(description = "供应商明细列表")
private List<CcdiPurchaseTransactionSupplierDTO> supplierList;
/** 采购申请日期(或立项日期) */
@NotNull(message = "采购申请日期不能为空")

View File

@@ -2,6 +2,7 @@ package com.ruoyi.info.collection.domain.dto;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.Valid;
import jakarta.validation.constraints.*;
import lombok.Data;
@@ -9,15 +10,16 @@ import java.io.Serial;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
/**
* 采购交易信息编辑DTO
* 招投标信息编辑DTO
*
* @author ruoyi
* @date 2026-02-06
*/
@Data
@Schema(description = "采购交易信息编辑")
@Schema(description = "招投标信息编辑")
public class CcdiPurchaseTransactionEditDTO implements Serializable {
@Serial
@@ -88,30 +90,10 @@ public class CcdiPurchaseTransactionEditDTO implements Serializable {
@Schema(description = "采购方式")
private String purchaseMethod;
/** 中标供应商名称 */
@Size(max = 200, message = "中标供应商名称长度不能超过200个字符")
@Schema(description = "中标供应商名称")
private String supplierName;
/** 供应商联系人 */
@Size(max = 50, message = "供应商联系人长度不能超过50个字符")
@Schema(description = "供应商联系人")
private String contactPerson;
/** 供应商联系电话 */
@Pattern(regexp = "^1[3-9]\\d{9}$|^0\\d{2,3}-?\\d{7,8}$", message = "供应商联系电话格式不正确")
@Schema(description = "供应商联系电话")
private String contactPhone;
/** 供应商统一信用代码 */
@Pattern(regexp = "^[0-9A-HJ-NPQRTUWXY]{2}\\d{6}[0-9A-HJ-NPQRTUWXY]{10}$", message = "供应商统一信用代码格式不正确")
@Schema(description = "供应商统一信用代码")
private String supplierUscc;
/** 供应商银行账户 */
@Size(max = 50, message = "供应商银行账户长度不能超过50个字符")
@Schema(description = "供应商银行账户")
private String supplierBankAccount;
/** 供应商明细 */
@Valid
@Schema(description = "供应商明细列表")
private List<CcdiPurchaseTransactionSupplierDTO> supplierList;
/** 采购申请日期(或立项日期) */
@NotNull(message = "采购申请日期不能为空")

View File

@@ -9,13 +9,13 @@ import java.io.Serializable;
import java.util.Date;
/**
* 采购交易信息查询DTO
* 招投标信息查询DTO
*
* @author ruoyi
* @date 2026-02-06
*/
@Data
@Schema(description = "采购交易信息查询条件")
@Schema(description = "招投标信息查询条件")
public class CcdiPurchaseTransactionQueryDTO implements Serializable {
@Serial

View File

@@ -0,0 +1,42 @@
package com.ruoyi.info.collection.domain.dto;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotBlank;
import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
/**
* 招投标供应商明细DTO
*/
@Data
@Schema(description = "招投标供应商明细")
public class CcdiPurchaseTransactionSupplierDTO implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
@NotBlank(message = "供应商名称不能为空")
@Schema(description = "供应商名称")
private String supplierName;
@NotBlank(message = "供应商统一信用代码不能为空")
@Schema(description = "供应商统一信用代码")
private String supplierUscc;
@Schema(description = "供应商联系人")
private String contactPerson;
@Schema(description = "供应商联系电话")
private String contactPhone;
@Schema(description = "供应商银行账户")
private String supplierBankAccount;
@Schema(description = "是否中标1-是0-否")
private Integer isBidWinner;
@Schema(description = "排序")
private Integer sortOrder;
}

View File

@@ -10,22 +10,22 @@ import java.io.Serial;
import java.io.Serializable;
/**
* 员工实体关系信息新增DTO
* 员工亲属实体关新增DTO
*
* @author ruoyi
* @date 2026-02-09
*/
@Data
@Schema(description = "员工实体关系信息新增")
@Schema(description = "员工亲属实体关新增")
public class CcdiStaffEnterpriseRelationAddDTO implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/** 身份证号 */
@NotBlank(message = "身份证号不能为空")
@Pattern(regexp = "^[1-9]\\d{5}(18|19|20)\\d{2}(0[1-9]|1[0-2])(0[1-9]|[12]\\d|3[01])\\d{3}[0-9Xx]$", message = "身份证号格式不正确")
@Schema(description = "身份证号")
/** 亲属身份证号 */
@NotBlank(message = "亲属身份证号不能为空")
@Pattern(regexp = "^[1-9]\\d{5}(18|19|20)\\d{2}(0[1-9]|1[0-2])(0[1-9]|[12]\\d|3[01])\\d{3}[0-9Xx]$", message = "亲属身份证号格式不正确")
@Schema(description = "亲属身份证号")
private String personId;
/** 关联人在企业的职务 */

View File

@@ -10,13 +10,13 @@ import java.io.Serial;
import java.io.Serializable;
/**
* 员工实体关系信息编辑DTO
* 员工亲属实体关编辑DTO
*
* @author ruoyi
* @date 2026-02-09
*/
@Data
@Schema(description = "员工实体关系信息编辑")
@Schema(description = "员工亲属实体关编辑")
public class CcdiStaffEnterpriseRelationEditDTO implements Serializable {
@Serial
@@ -27,8 +27,8 @@ public class CcdiStaffEnterpriseRelationEditDTO implements Serializable {
@Schema(description = "主键ID")
private Long id;
/** 身份证号 */
@Schema(description = "身份证号(不可修改)")
/** 亲属身份证号 */
@Schema(description = "亲属身份证号(不可修改)")
private String personId;
/** 关联人在企业的职务 */

View File

@@ -7,22 +7,30 @@ import java.io.Serial;
import java.io.Serializable;
/**
* 员工实体关系信息查询DTO
* 员工亲属实体关查询DTO
*
* @author ruoyi
* @date 2026-02-09
*/
@Data
@Schema(description = "员工实体关系信息查询条件")
@Schema(description = "员工亲属实体关查询条件")
public class CcdiStaffEnterpriseRelationQueryDTO implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/** 身份证号 */
@Schema(description = "身份证号")
/** 亲属身份证号 */
@Schema(description = "亲属身份证号")
private String personId;
/** 亲属姓名 */
@Schema(description = "亲属姓名")
private String relationName;
/** 关联员工 */
@Schema(description = "关联员工")
private String staffPersonName;
/** 统一社会信用代码 */
@Schema(description = "统一社会信用代码")
private String socialCreditCode;

View File

@@ -7,10 +7,12 @@ import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import jakarta.validation.constraints.Pattern;
import jakarta.validation.constraints.Size;
import jakarta.validation.Valid;
import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
import java.util.List;
/**
* 员工招聘信息编辑DTO
@@ -91,4 +93,8 @@ public class CcdiStaffRecruitmentEditDTO implements Serializable {
/** 面试官2工号 */
@Size(max = 10, message = "面试官2工号长度不能超过10个字符")
private String interviewerId2;
/** 历史工作经历列表 */
@Valid
private List<CcdiStaffRecruitmentWorkEditDTO> workExperienceList;
}

View File

@@ -0,0 +1,56 @@
package com.ruoyi.info.collection.domain.dto;
import jakarta.validation.constraints.Pattern;
import jakarta.validation.constraints.Size;
import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
/**
* 招聘记录历史工作经历编辑DTO
*
* @author ruoyi
* @date 2026-04-22
*/
@Data
public class CcdiStaffRecruitmentWorkEditDTO implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/** 排序号 */
private Integer sortOrder;
/** 工作单位 */
@Size(max = 200, message = "工作单位长度不能超过200个字符")
private String companyName;
/** 所属部门 */
@Size(max = 100, message = "所属部门长度不能超过100个字符")
private String departmentName;
/** 岗位名称 */
@Size(max = 100, message = "岗位名称长度不能超过100个字符")
private String positionName;
/** 入职年月 */
@Pattern(regexp = "^$|^((19|20)\\d{2})-(0[1-9]|1[0-2])$", message = "入职年月格式不正确,应为YYYY-MM")
private String jobStartMonth;
/** 离职年月 */
@Pattern(regexp = "^$|^((19|20)\\d{2})-(0[1-9]|1[0-2])$", message = "离职年月格式不正确,应为YYYY-MM")
private String jobEndMonth;
/** 离职原因 */
@Size(max = 500, message = "离职原因长度不能超过500个字符")
private String departureReason;
/** 主要工作内容 */
@Size(max = 1000, message = "主要工作内容长度不能超过1000个字符")
private String workContent;
/** 备注 */
@Size(max = 500, message = "备注长度不能超过500个字符")
private String remark;
}

View File

@@ -63,8 +63,15 @@ public class CcdiBaseStaffExcel implements Serializable {
@ColumnWidth(15)
private Date hireDate;
/** 是否党员 */
@ExcelProperty(value = "是否党员", index = 7)
@ColumnWidth(12)
@DictDropdown(dictType = "ccdi_yes_no_flag")
@Required
private Integer partyMember;
/** 状态 */
@ExcelProperty(value = "状态", index = 7)
@ExcelProperty(value = "状态", index = 8)
@ColumnWidth(10)
@DictDropdown(dictType = "ccdi_employee_status")
@Required

View File

@@ -0,0 +1,102 @@
package com.ruoyi.info.collection.domain.excel;
import com.alibaba.excel.annotation.ExcelProperty;
import com.alibaba.excel.annotation.write.style.ColumnWidth;
import com.ruoyi.common.annotation.DictDropdown;
import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
import java.util.Date;
/**
* 实体库管理 Excel 导入模板对象
*
* @author ruoyi
* @date 2026-04-17
*/
@Data
public class CcdiEnterpriseBaseInfoExcel implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
@ExcelProperty(value = "统一社会信用代码*", index = 0)
@ColumnWidth(24)
private String socialCreditCode;
@ExcelProperty(value = "企业名称*", index = 1)
@ColumnWidth(30)
private String enterpriseName;
@ExcelProperty(value = "企业类型", index = 2)
@ColumnWidth(18)
@DictDropdown(dictType = "ccdi_entity_type")
private String enterpriseType;
@ExcelProperty(value = "企业性质", index = 3)
@ColumnWidth(18)
@DictDropdown(dictType = "ccdi_enterprise_nature")
private String enterpriseNature;
@ExcelProperty(value = "行业分类", index = 4)
@ColumnWidth(18)
private String industryClass;
@ExcelProperty(value = "所属行业", index = 5)
@ColumnWidth(18)
private String industryName;
@ExcelProperty(value = "成立日期", index = 6)
@ColumnWidth(16)
private Date establishDate;
@ExcelProperty(value = "注册地址", index = 7)
@ColumnWidth(36)
private String registerAddress;
@ExcelProperty(value = "法定代表人", index = 8)
@ColumnWidth(18)
private String legalRepresentative;
@ExcelProperty(value = "法定代表人证件类型", index = 9)
@ColumnWidth(22)
@DictDropdown(dictType = "ccdi_certificate_type")
private String legalCertType;
@ExcelProperty(value = "法定代表人证件号码", index = 10)
@ColumnWidth(24)
private String legalCertNo;
@ExcelProperty(value = "股东1", index = 11)
@ColumnWidth(18)
private String shareholder1;
@ExcelProperty(value = "股东2", index = 12)
@ColumnWidth(18)
private String shareholder2;
@ExcelProperty(value = "股东3", index = 13)
@ColumnWidth(18)
private String shareholder3;
@ExcelProperty(value = "股东4", index = 14)
@ColumnWidth(18)
private String shareholder4;
@ExcelProperty(value = "股东5", index = 15)
@ColumnWidth(18)
private String shareholder5;
@ExcelProperty(value = "经营状态", index = 16)
@ColumnWidth(16)
private String status;
@ExcelProperty(value = "风险等级*", index = 17)
@ColumnWidth(16)
private String riskLevel;
@ExcelProperty(value = "企业来源*", index = 18)
@ColumnWidth(18)
private String entSource;
}

View File

@@ -0,0 +1,38 @@
package com.ruoyi.info.collection.domain.excel;
import com.alibaba.excel.annotation.ExcelProperty;
import com.alibaba.excel.annotation.write.style.ColumnWidth;
import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
/**
* 中介实体关联关系导入对象
*/
@Data
public class CcdiIntermediaryEnterpriseRelationExcel implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/** 中介本人证件号码 */
@ExcelProperty(value = "中介本人证件号码*", index = 0)
@ColumnWidth(24)
private String ownerPersonId;
/** 统一社会信用代码 */
@ExcelProperty(value = "统一社会信用代码*", index = 1)
@ColumnWidth(24)
private String socialCreditCode;
/** 关联人职务 */
@ExcelProperty(value = "关联人职务", index = 2)
@ColumnWidth(20)
private String relationPersonPost;
/** 备注 */
@ExcelProperty(value = "备注", index = 3)
@ColumnWidth(30)
private String remark;
}

View File

@@ -34,6 +34,7 @@ public class CcdiIntermediaryPersonExcel implements Serializable {
/** 人员子类型 */
@ExcelProperty(value = "人员子类型", index = 2)
@ColumnWidth(15)
@DictDropdown(dictType = "ccdi_person_sub_type")
private String personSubType;
/** 性别 */
@@ -83,19 +84,13 @@ public class CcdiIntermediaryPersonExcel implements Serializable {
@ColumnWidth(15)
private String position;
/** 关联人员ID */
@ExcelProperty(value = "关联人员ID", index = 12)
@ColumnWidth(15)
/** 关联中介本人证件号码 */
@ExcelProperty(value = "关联中介本人证件号码", index = 12)
@ColumnWidth(24)
private String relatedNumId;
/** 关系类型 */
@ExcelProperty(value = "关系类型", index = 13)
@ColumnWidth(15)
@DictDropdown(dictType = "ccdi_relation_type")
private String relationType;
/** 备注 */
@ExcelProperty(value = "备注", index = 14)
@ExcelProperty(value = "备注", index = 13)
@ColumnWidth(30)
private String remark;
}

View File

@@ -11,7 +11,7 @@ import java.math.BigDecimal;
import java.util.Date;
/**
* 采购交易信息Excel导入导出对象
* 招投标主信息Excel导入导出对象
*
* @author ruoyi
* @date 2026-02-06
@@ -88,107 +88,82 @@ public class CcdiPurchaseTransactionExcel implements Serializable {
@Required
private String purchaseMethod;
/** 中标供应商名称 */
@ExcelProperty(value = "中标供应商名称", index = 12)
@ColumnWidth(25)
private String supplierName;
/** 供应商联系人 */
@ExcelProperty(value = "供应商联系人", index = 13)
@ColumnWidth(15)
private String contactPerson;
/** 供应商联系电话 */
@ExcelProperty(value = "供应商联系电话", index = 14)
@ColumnWidth(18)
private String contactPhone;
/** 供应商统一信用代码 */
@ExcelProperty(value = "供应商统一信用代码", index = 15)
@ColumnWidth(25)
private String supplierUscc;
/** 供应商银行账户 */
@ExcelProperty(value = "供应商银行账户", index = 16)
@ColumnWidth(20)
private String supplierBankAccount;
/** 采购申请日期(或立项日期) */
@ExcelProperty(value = "采购申请日期", index = 17)
@ExcelProperty(value = "采购申请日期", index = 12)
@ColumnWidth(18)
@Required
private Date applyDate;
/** 采购计划批准日期 */
@ExcelProperty(value = "采购计划批准日期", index = 18)
@ExcelProperty(value = "采购计划批准日期", index = 13)
@ColumnWidth(18)
private Date planApproveDate;
/** 采购公告发布日期 */
@ExcelProperty(value = "采购公告发布日期", index = 19)
@ExcelProperty(value = "采购公告发布日期", index = 14)
@ColumnWidth(18)
private Date announceDate;
/** 开标日期 */
@ExcelProperty(value = "开标日期", index = 20)
@ExcelProperty(value = "开标日期", index = 15)
@ColumnWidth(18)
private Date bidOpenDate;
/** 合同签订日期 */
@ExcelProperty(value = "合同签订日期", index = 21)
@ExcelProperty(value = "合同签订日期", index = 16)
@ColumnWidth(18)
private Date contractSignDate;
/** 预计交货日期 */
@ExcelProperty(value = "预计交货日期", index = 22)
@ExcelProperty(value = "预计交货日期", index = 17)
@ColumnWidth(18)
private Date expectedDeliveryDate;
/** 实际交货日期 */
@ExcelProperty(value = "实际交货日期", index = 23)
@ExcelProperty(value = "实际交货日期", index = 18)
@ColumnWidth(18)
private Date actualDeliveryDate;
/** 验收日期 */
@ExcelProperty(value = "验收日期", index = 24)
@ExcelProperty(value = "验收日期", index = 19)
@ColumnWidth(18)
private Date acceptanceDate;
/** 结算日期 */
@ExcelProperty(value = "结算日期", index = 25)
@ExcelProperty(value = "结算日期", index = 20)
@ColumnWidth(18)
private Date settlementDate;
/** 申请人工号 */
@ExcelProperty(value = "申请人工号", index = 26)
@ExcelProperty(value = "申请人工号", index = 21)
@ColumnWidth(15)
@Required
private String applicantId;
/** 申请人姓名 */
@ExcelProperty(value = "申请人姓名", index = 27)
@ExcelProperty(value = "申请人姓名", index = 22)
@ColumnWidth(15)
@Required
private String applicantName;
/** 申请部门 */
@ExcelProperty(value = "申请部门", index = 28)
@ExcelProperty(value = "申请部门", index = 23)
@ColumnWidth(18)
@Required
private String applyDepartment;
/** 采购负责人工号 */
@ExcelProperty(value = "采购负责人工号", index = 29)
@ExcelProperty(value = "采购负责人工号", index = 24)
@ColumnWidth(15)
private String purchaseLeaderId;
/** 采购负责人姓名 */
@ExcelProperty(value = "采购负责人姓名", index = 30)
@ExcelProperty(value = "采购负责人姓名", index = 25)
@ColumnWidth(15)
private String purchaseLeaderName;
/** 采购部门 */
@ExcelProperty(value = "采购部门", index = 31)
@ExcelProperty(value = "采购部门", index = 26)
@ColumnWidth(18)
private String purchaseDepartment;
}

View File

@@ -0,0 +1,55 @@
package com.ruoyi.info.collection.domain.excel;
import com.alibaba.excel.annotation.ExcelProperty;
import com.alibaba.excel.annotation.write.style.ColumnWidth;
import com.ruoyi.common.annotation.DictDropdown;
import com.ruoyi.common.annotation.Required;
import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
/**
* 招投标供应商明细Excel对象
*/
@Data
public class CcdiPurchaseTransactionSupplierExcel implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
@ExcelProperty(value = "采购事项ID", index = 0)
@ColumnWidth(20)
@Required
private String purchaseId;
@ExcelProperty(value = "供应商名称", index = 1)
@ColumnWidth(25)
@Required
private String supplierName;
@ExcelProperty(value = "供应商统一信用代码", index = 2)
@ColumnWidth(25)
private String supplierUscc;
@ExcelProperty(value = "供应商联系人", index = 3)
@ColumnWidth(15)
private String contactPerson;
@ExcelProperty(value = "供应商联系电话", index = 4)
@ColumnWidth(18)
private String contactPhone;
@ExcelProperty(value = "供应商银行账户", index = 5)
@ColumnWidth(20)
private String supplierBankAccount;
@ExcelProperty(value = "是否中标", index = 6)
@ColumnWidth(12)
@DictDropdown(dictType = "ccdi_yes_no_flag")
private String isBidWinner;
@ExcelProperty(value = "排序", index = 7)
@ColumnWidth(10)
private Integer sortOrder;
}

View File

@@ -10,23 +10,23 @@ import java.io.Serial;
import java.io.Serializable;
/**
* 员工实体关系信息Excel导入导出对象
* 员工亲属实体关Excel导入导出对象
*
* @author ruoyi
* @date 2026-02-09
*/
@Data
@Schema(description = "员工实体关系信息Excel导入导出对象")
@Schema(description = "员工亲属实体关Excel导入导出对象")
public class CcdiStaffEnterpriseRelationExcel implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/** 身份证号 */
@ExcelProperty(value = "身份证号", index = 0)
/** 亲属身份证号 */
@ExcelProperty(value = "亲属身份证号", index = 0)
@ColumnWidth(20)
@Required
@Schema(description = "身份证号")
@Schema(description = "亲属身份证号")
private String personId;
/** 统一社会信用代码 */

View File

@@ -15,6 +15,14 @@ import java.math.BigDecimal;
@Schema(description = "亲属资产信息导入失败记录")
public class AssetImportFailureVO {
/** Sheet名称 */
@Schema(description = "Sheet名称")
private String sheetName;
/** Excel行号 */
@Schema(description = "Excel行号")
private Integer rowNum;
/** 亲属证件号 */
@Schema(description = "亲属证件号")
private String personId;

View File

@@ -15,6 +15,14 @@ import java.math.BigDecimal;
@Schema(description = "员工资产信息导入失败记录")
public class BaseStaffAssetImportFailureVO {
/** Sheet名称 */
@Schema(description = "Sheet名称")
private String sheetName;
/** Excel行号 */
@Schema(description = "Excel行号")
private Integer rowNum;
/** 员工身份证号 */
@Schema(description = "员工身份证号")
private String personId;

View File

@@ -0,0 +1,23 @@
package com.ruoyi.info.collection.domain.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
/**
* 员工双Sheet导入提交结果
*
* @author ruoyi
*/
@Data
@Schema(description = "员工双Sheet导入提交结果")
public class BaseStaffImportSubmitResultVO {
@Schema(description = "员工信息导入任务ID")
private String staffTaskId;
@Schema(description = "员工资产信息导入任务ID")
private String assetTaskId;
@Schema(description = "提交说明")
private String message;
}

View File

@@ -44,6 +44,9 @@ public class CcdiBaseStaffVO implements Serializable {
/** 入职时间 */
private Date hireDate;
/** 是否党员0-否 1-是 */
private Integer partyMember;
/** 状态 */
private String status;

View File

@@ -0,0 +1,85 @@
package com.ruoyi.info.collection.domain.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
import java.util.Date;
/**
* 实体库管理 VO
*
* @author ruoyi
* @date 2026-04-17
*/
@Data
@Schema(description = "实体库管理VO")
public class CcdiEnterpriseBaseInfoVO implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
@Schema(description = "统一社会信用代码")
private String socialCreditCode;
@Schema(description = "企业名称")
private String enterpriseName;
@Schema(description = "企业类型")
private String enterpriseType;
@Schema(description = "企业性质")
private String enterpriseNature;
@Schema(description = "行业分类")
private String industryClass;
@Schema(description = "所属行业")
private String industryName;
@Schema(description = "成立日期")
private Date establishDate;
@Schema(description = "注册地址")
private String registerAddress;
@Schema(description = "法定代表人")
private String legalRepresentative;
@Schema(description = "法定代表人证件类型")
private String legalCertType;
@Schema(description = "法定代表人证件号码")
private String legalCertNo;
@Schema(description = "股东1")
private String shareholder1;
@Schema(description = "股东2")
private String shareholder2;
@Schema(description = "股东3")
private String shareholder3;
@Schema(description = "股东4")
private String shareholder4;
@Schema(description = "股东5")
private String shareholder5;
@Schema(description = "经营状态")
private String status;
@Schema(description = "风险等级")
private String riskLevel;
@Schema(description = "企业来源")
private String entSource;
@Schema(description = "数据来源")
private String dataSource;
@Schema(description = "创建时间")
private Date createTime;
}

View File

@@ -0,0 +1,48 @@
package com.ruoyi.info.collection.domain.vo;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
import java.util.Date;
/**
* 中介关联机构VO
*/
@Data
@Schema(description = "中介关联机构VO")
public class CcdiIntermediaryEnterpriseRelationVO implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
@Schema(description = "主键ID")
private Long id;
@Schema(description = "所属中介ID")
private String intermediaryBizId;
@Schema(description = "所属中介姓名")
private String intermediaryName;
@Schema(description = "所属中介证件号")
private String intermediaryPersonId;
@Schema(description = "统一社会信用代码")
private String socialCreditCode;
@Schema(description = "机构名称")
private String enterpriseName;
@Schema(description = "关联角色/职务")
private String relationPersonPost;
@Schema(description = "备注")
private String remark;
@Schema(description = "创建时间")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date createTime;
}

View File

@@ -63,7 +63,7 @@ public class CcdiIntermediaryPersonDetailVO implements Serializable {
@Schema(description = "职位")
private String position;
@Schema(description = "关联人员ID")
@Schema(description = "关联中介本人证件号码")
private String relatedNumId;
@Schema(description = "关联关系")

View File

@@ -0,0 +1,69 @@
package com.ruoyi.info.collection.domain.vo;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
import java.util.Date;
/**
* 中介亲属VO
*/
@Data
@Schema(description = "中介亲属VO")
public class CcdiIntermediaryRelativeVO implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
@Schema(description = "人员ID")
private String bizId;
@Schema(description = "关联中介本人证件号码")
private String relatedNumId;
@Schema(description = "姓名")
private String name;
@Schema(description = "人员类型")
private String personType;
@Schema(description = "亲属关系")
private String personSubType;
@Schema(description = "性别")
private String gender;
@Schema(description = "证件类型")
private String idType;
@Schema(description = "证件号码")
private String personId;
@Schema(description = "手机号码")
private String mobile;
@Schema(description = "微信号")
private String wechatNo;
@Schema(description = "联系地址")
private String contactAddress;
@Schema(description = "所在公司")
private String company;
@Schema(description = "企业统一信用码")
private String socialCreditCode;
@Schema(description = "职位")
private String position;
@Schema(description = "备注")
private String remark;
@Schema(description = "创建时间")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date createTime;
}

View File

@@ -21,32 +21,25 @@ public class CcdiIntermediaryVO implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
@Schema(description = "ID")
private String id;
@Schema(description = "记录类型")
private String recordType;
@Schema(description = "姓名/机构名称")
@Schema(description = "记录ID")
private String recordId;
@Schema(description = "名称")
private String name;
@Schema(description = "证件号/统一社会信用代码")
@Schema(description = "证件号")
private String certificateNo;
@Schema(description = "中介类型(1=个人, 2=实体)")
private String intermediaryType;
@Schema(description = "关联中介姓名")
private String relatedIntermediaryName;
@Schema(description = "人员类型")
private String personType;
@Schema(description = "公司")
private String company;
@Schema(description = "数据来源")
private String dataSource;
@Schema(description = "关联关系")
private String relationText;
@Schema(description = "创建时间")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date createTime;
@Schema(description = "修改时间")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date updateTime;
}

View File

@@ -0,0 +1,45 @@
package com.ruoyi.info.collection.domain.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
/**
* 招投标供应商明细VO
*/
@Data
@Schema(description = "招投标供应商明细")
public class CcdiPurchaseTransactionSupplierVO implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
@Schema(description = "主键ID")
private Long id;
@Schema(description = "采购事项ID")
private String purchaseId;
@Schema(description = "供应商名称")
private String supplierName;
@Schema(description = "供应商统一信用代码")
private String supplierUscc;
@Schema(description = "供应商联系人")
private String contactPerson;
@Schema(description = "供应商联系电话")
private String contactPhone;
@Schema(description = "供应商银行账户")
private String supplierBankAccount;
@Schema(description = "是否中标1-是0-否")
private Integer isBidWinner;
@Schema(description = "排序")
private Integer sortOrder;
}

View File

@@ -8,15 +8,16 @@ import java.io.Serial;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
/**
* 采购交易信息VO
* 招投标信息VO
*
* @author ruoyi
* @date 2026-02-06
*/
@Data
@Schema(description = "采购交易信息")
@Schema(description = "招投标信息")
public class CcdiPurchaseTransactionVO implements Serializable {
@Serial
@@ -90,6 +91,14 @@ public class CcdiPurchaseTransactionVO implements Serializable {
@Schema(description = "供应商银行账户")
private String supplierBankAccount;
/** 参与供应商数 */
@Schema(description = "参与供应商数")
private Integer supplierCount;
/** 供应商明细 */
@Schema(description = "供应商明细列表")
private List<CcdiPurchaseTransactionSupplierVO> supplierList;
/** 采购申请日期(或立项日期) */
@JsonFormat(pattern = "yyyy-MM-dd")
@Schema(description = "采购申请日期")

View File

@@ -0,0 +1,37 @@
package com.ruoyi.info.collection.domain.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
/**
* 员工亲属实体关联下拉选项VO
*
* @author ruoyi
* @date 2026-04-23
*/
@Data
@Schema(description = "员工亲属实体关联下拉选项")
public class CcdiStaffEnterpriseRelationOptionVO implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/** 亲属身份证号 */
@Schema(description = "亲属身份证号")
private String relationCertNo;
/** 亲属姓名 */
@Schema(description = "亲属姓名")
private String relationName;
/** 关联员工身份证号 */
@Schema(description = "关联员工身份证号")
private String staffPersonId;
/** 关联员工姓名 */
@Schema(description = "关联员工姓名")
private String staffPersonName;
}

View File

@@ -9,13 +9,13 @@ import java.io.Serializable;
import java.util.Date;
/**
* 员工实体关系信息VO
* 员工亲属实体关VO
*
* @author ruoyi
* @date 2026-02-09
*/
@Data
@Schema(description = "员工实体关系信息")
@Schema(description = "员工亲属实体关")
public class CcdiStaffEnterpriseRelationVO implements Serializable {
@Serial
@@ -25,13 +25,21 @@ public class CcdiStaffEnterpriseRelationVO implements Serializable {
@Schema(description = "主键ID")
private Long id;
/** 身份证号 */
@Schema(description = "身份证号")
/** 亲属身份证号 */
@Schema(description = "亲属身份证号")
private String personId;
/** 员工姓名 */
@Schema(description = "员工姓名")
private String personName;
/** 亲属姓名 */
@Schema(description = "亲属姓名")
private String relationName;
/** 关联员工身份证号 */
@Schema(description = "关联员工身份证号")
private String staffPersonId;
/** 关联员工姓名 */
@Schema(description = "关联员工姓名")
private String staffPersonName;
/** 关联人在企业的职务 */
@Schema(description = "关联人在企业的职务")

View File

@@ -0,0 +1,51 @@
package com.ruoyi.info.collection.domain.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
/**
* 实体库导入失败记录 VO
*
* @author ruoyi
* @date 2026-04-17
*/
@Data
@Schema(description = "实体库导入失败记录")
public class EnterpriseBaseInfoImportFailureVO {
@Schema(description = "企业名称")
private String enterpriseName;
@Schema(description = "统一社会信用代码")
private String socialCreditCode;
@Schema(description = "企业类型")
private String enterpriseType;
@Schema(description = "企业性质")
private String enterpriseNature;
@Schema(description = "行业分类")
private String industryClass;
@Schema(description = "所属行业")
private String industryName;
@Schema(description = "法定代表人")
private String legalRepresentative;
@Schema(description = "经营状态")
private String status;
@Schema(description = "风险等级")
private String riskLevel;
@Schema(description = "企业来源")
private String entSource;
@Schema(description = "数据来源")
private String dataSource;
@Schema(description = "错误信息")
private String errorMessage;
}

View File

@@ -14,8 +14,14 @@ import java.math.BigDecimal;
@Schema(description = "导入失败记录")
public class ImportFailureVO {
@Schema(description = "Sheet名称")
private String sheetName;
@Schema(description = "Excel行号")
private Integer rowNum;
@Schema(description = "柜员号")
private Long employeeId;
private Long staffId;
@Schema(description = "姓名")
private String name;
@@ -32,6 +38,9 @@ public class ImportFailureVO {
@Schema(description = "年收入")
private BigDecimal annualIncome;
@Schema(description = "是否党员0-否 1-是")
private Integer partyMember;
@Schema(description = "状态")
private String status;

View File

@@ -0,0 +1,33 @@
package com.ruoyi.info.collection.domain.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
/**
* 中介实体关联关系导入失败记录
*/
@Data
@Schema(description = "中介实体关联关系导入失败记录")
public class IntermediaryEnterpriseRelationImportFailureVO implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
@Schema(description = "中介本人证件号码")
private String ownerPersonId;
@Schema(description = "统一社会信用代码")
private String socialCreditCode;
@Schema(description = "关联人职务")
private String relationPersonPost;
@Schema(description = "备注")
private String remark;
@Schema(description = "错误信息")
private String errorMessage;
}

View File

@@ -22,21 +22,45 @@ public class IntermediaryPersonImportFailureVO implements Serializable {
@Schema(description = "姓名")
private String name;
@Schema(description = "证件号码")
private String personId;
@Schema(description = "人员类型")
private String personType;
@Schema(description = "人员子类型")
private String personSubType;
@Schema(description = "性别")
private String gender;
@Schema(description = "证件类型")
private String idType;
@Schema(description = "证件号码")
private String personId;
@Schema(description = "手机号码")
private String mobile;
@Schema(description = "微信号")
private String wechatNo;
@Schema(description = "联系地址")
private String contactAddress;
@Schema(description = "所在公司")
private String company;
@Schema(description = "企业统一信用码")
private String socialCreditCode;
@Schema(description = "职位")
private String position;
@Schema(description = "关联中介本人证件号码")
private String relatedNumId;
@Schema(description = "备注")
private String remark;
@Schema(description = "错误信息")
private String errorMessage;
}

View File

@@ -6,15 +6,23 @@ import lombok.Data;
import java.math.BigDecimal;
/**
* 采购交易信息导入失败记录VO
* 招投标信息导入失败记录VO
*
* @author ruoyi
* @date 2026-02-06
*/
@Data
@Schema(description = "采购交易信息导入失败记录")
@Schema(description = "招投标信息导入失败记录")
public class PurchaseTransactionImportFailureVO {
/** 失败来源Sheet */
@Schema(description = "失败来源Sheet")
private String sheetName;
/** 失败行号 */
@Schema(description = "失败行号")
private String sheetRowNum;
/** 采购事项ID */
@Schema(description = "采购事项ID")
private String purchaseId;

View File

@@ -13,6 +13,12 @@ import lombok.Data;
@Schema(description = "招聘信息导入失败记录")
public class RecruitmentImportFailureVO {
@Schema(description = "失败Sheet")
private String sheetName;
@Schema(description = "失败行号")
private String sheetRowNum;
@Schema(description = "招聘项目编号")
private String recruitId;

View File

@@ -7,22 +7,26 @@ import java.io.Serial;
import java.io.Serializable;
/**
* 员工实体关系信息导入失败记录VO
* 员工亲属实体关导入失败记录VO
*
* @author ruoyi
* @date 2026-02-09
*/
@Data
@Schema(description = "员工实体关系信息导入失败记录")
@Schema(description = "员工亲属实体关导入失败记录")
public class StaffEnterpriseRelationImportFailureVO implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/** 身份证号 */
@Schema(description = "身份证号")
/** 亲属身份证号 */
@Schema(description = "亲属身份证号")
private String personId;
/** 亲属姓名 */
@Schema(description = "亲属姓名")
private String relationName;
/** 统一社会信用代码 */
@Schema(description = "统一社会信用代码")
private String socialCreditCode;

View File

@@ -15,6 +15,14 @@ import java.math.BigDecimal;
@Schema(description = "员工亲属关系信息导入失败记录")
public class StaffFmyRelationImportFailureVO {
/** Sheet名称 */
@Schema(description = "Sheet名称")
private String sheetName;
/** Excel行号 */
@Schema(description = "Excel行号")
private Integer rowNum;
/** 员工身份证号 */
@Schema(description = "员工身份证号")
private String personId;

View File

@@ -0,0 +1,24 @@
package com.ruoyi.info.collection.domain.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
/**
* 员工亲属关系双Sheet导入提交结果
*
* @author ruoyi
* @date 2026-04-22
*/
@Data
@Schema(description = "员工亲属关系双Sheet导入提交结果")
public class StaffFmyRelationImportSubmitResultVO {
@Schema(description = "员工亲属关系导入任务ID")
private String relationTaskId;
@Schema(description = "亲属资产信息导入任务ID")
private String assetTaskId;
@Schema(description = "提交结果提示")
private String message;
}

View File

@@ -0,0 +1,56 @@
package com.ruoyi.info.collection.enums;
/**
* 实体风险等级枚举
*
* @author ruoyi
*/
public enum EnterpriseRiskLevel {
HIGH("1", "高风险"),
MEDIUM("2", "中风险"),
LOW("3", "低风险");
private final String code;
private final String desc;
EnterpriseRiskLevel(String code, String desc) {
this.code = code;
this.desc = desc;
}
public String getCode() {
return code;
}
public String getDesc() {
return desc;
}
public static String getDescByCode(String code) {
for (EnterpriseRiskLevel value : values()) {
if (value.code.equals(code)) {
return value.desc;
}
}
return null;
}
public static boolean contains(String code) {
for (EnterpriseRiskLevel value : values()) {
if (value.code.equals(code)) {
return true;
}
}
return false;
}
public static String resolveCode(String value) {
for (EnterpriseRiskLevel item : values()) {
if (item.code.equals(value) || item.desc.equals(value)) {
return item.code;
}
}
return null;
}
}

View File

@@ -0,0 +1,58 @@
package com.ruoyi.info.collection.enums;
/**
* 企业来源枚举
*
* @author ruoyi
*/
public enum EnterpriseSource {
GENERAL("GENERAL", "一般企业"),
EMP_RELATION("EMP_RELATION", "员工关系人"),
CREDIT_CUSTOMER("CREDIT_CUSTOMER", "信贷客户"),
INTERMEDIARY("INTERMEDIARY", "中介"),
BOTH("BOTH", "兼有");
private final String code;
private final String desc;
EnterpriseSource(String code, String desc) {
this.code = code;
this.desc = desc;
}
public String getCode() {
return code;
}
public String getDesc() {
return desc;
}
public static String getDescByCode(String code) {
for (EnterpriseSource value : values()) {
if (value.code.equals(code)) {
return value.desc;
}
}
return null;
}
public static boolean contains(String code) {
for (EnterpriseSource value : values()) {
if (value.code.equals(code)) {
return true;
}
}
return false;
}
public static String resolveCode(String value) {
for (EnterpriseSource item : values()) {
if (item.code.equals(value) || item.desc.equals(value)) {
return item.code;
}
}
return null;
}
}

View File

@@ -1,13 +0,0 @@
package com.ruoyi.info.collection.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ruoyi.info.collection.domain.CcdiAccountResult;
/**
* 账户分析结果数据层
*
* @author ruoyi
* @date 2026-04-13
*/
public interface CcdiAccountResultMapper extends BaseMapper<CcdiAccountResult> {
}

View File

@@ -1,7 +1,10 @@
package com.ruoyi.info.collection.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.info.collection.domain.CcdiEnterpriseBaseInfo;
import com.ruoyi.info.collection.domain.dto.CcdiEnterpriseBaseInfoQueryDTO;
import com.ruoyi.info.collection.domain.vo.CcdiEnterpriseBaseInfoVO;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
@@ -16,6 +19,16 @@ import java.util.List;
@Mapper
public interface CcdiEnterpriseBaseInfoMapper extends BaseMapper<CcdiEnterpriseBaseInfo> {
/**
* 分页查询实体库列表
*
* @param page 分页参数
* @param queryDTO 查询条件
* @return 分页结果
*/
Page<CcdiEnterpriseBaseInfoVO> selectEnterpriseBaseInfoPage(Page<CcdiEnterpriseBaseInfoVO> page,
@Param("queryDTO") CcdiEnterpriseBaseInfoQueryDTO queryDTO);
/**
* 批量插入实体中介
*

View File

@@ -0,0 +1,27 @@
package com.ruoyi.info.collection.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ruoyi.info.collection.domain.CcdiIntermediaryEnterpriseRelation;
import com.ruoyi.info.collection.domain.vo.CcdiIntermediaryEnterpriseRelationVO;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import java.util.List;
/**
* 中介关联机构关系Mapper
*/
@Mapper
public interface CcdiIntermediaryEnterpriseRelationMapper extends BaseMapper<CcdiIntermediaryEnterpriseRelation> {
int insertBatch(@Param("list") List<CcdiIntermediaryEnterpriseRelation> list);
List<CcdiIntermediaryEnterpriseRelationVO> selectByIntermediaryBizId(@Param("bizId") String bizId);
CcdiIntermediaryEnterpriseRelationVO selectDetailById(@Param("id") Long id);
boolean existsByIntermediaryBizIdAndSocialCreditCode(@Param("bizId") String bizId,
@Param("socialCreditCode") String socialCreditCode);
List<String> batchExistsByCombinations(@Param("combinations") List<String> combinations);
}

View File

@@ -35,6 +35,14 @@ public interface CcdiPurchaseTransactionMapper extends BaseMapper<CcdiPurchaseTr
*/
CcdiPurchaseTransactionVO selectTransactionById(@Param("purchaseId") String purchaseId);
/**
* 删除指定采购事项ID对应的供应商明细
*
* @param purchaseIds 采购事项ID列表
* @return 删除行数
*/
int deleteSuppliersByPurchaseIds(@Param("purchaseIds") List<String> purchaseIds);
/**
* 批量插入采购交易数据
*

View File

@@ -0,0 +1,12 @@
package com.ruoyi.info.collection.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ruoyi.info.collection.domain.CcdiPurchaseTransactionSupplier;
import org.apache.ibatis.annotations.Mapper;
/**
* 招投标供应商明细Mapper
*/
@Mapper
public interface CcdiPurchaseTransactionSupplierMapper extends BaseMapper<CcdiPurchaseTransactionSupplier> {
}

View File

@@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.info.collection.domain.CcdiStaffEnterpriseRelation;
import com.ruoyi.info.collection.domain.dto.CcdiStaffEnterpriseRelationQueryDTO;
import com.ruoyi.info.collection.domain.vo.CcdiStaffEnterpriseRelationOptionVO;
import com.ruoyi.info.collection.domain.vo.CcdiStaffEnterpriseRelationVO;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
@@ -38,6 +39,14 @@ public interface CcdiStaffEnterpriseRelationMapper extends BaseMapper<CcdiStaffE
*/
CcdiStaffEnterpriseRelationVO selectRelationById(@Param("id") Long id);
/**
* 查询有效员工亲属下拉选项
*
* @param query 搜索关键词
* @return 下拉选项
*/
List<CcdiStaffEnterpriseRelationOptionVO> selectFamilyOptions(@Param("query") String query);
/**
* 判断身份证号和统一社会信用代码的组合是否已存在
*
@@ -57,6 +66,14 @@ public interface CcdiStaffEnterpriseRelationMapper extends BaseMapper<CcdiStaffE
*/
Set<String> batchExistsByCombinations(@Param("combinations") List<String> combinations);
/**
* 根据亲属身份证号批量置无效
*
* @param personId 亲属身份证号
* @return 影响行数
*/
int invalidateByFamilyCertNo(@Param("personId") String personId);
/**
* 批量插入员工实体关系数据
*

View File

@@ -16,9 +16,8 @@ public interface ICcdiBaseStaffImportService {
* 异步导入员工数据
*
* @param excelList Excel数据列表
* @param isUpdateSupport 是否更新已存在的数据
*/
void importBaseStaffAsync(List<CcdiBaseStaffExcel> excelList, Boolean isUpdateSupport, String taskId);
void importBaseStaffAsync(List<CcdiBaseStaffExcel> excelList, String taskId);
/**
* 查询导入状态

View File

@@ -79,10 +79,9 @@ public interface ICcdiBaseStaffService {
* 导入员工数据
*
* @param excelList Excel实体列表
* @param isUpdateSupport 是否更新支持
* @return 结果
*/
String importBaseStaff(List<CcdiBaseStaffExcel> excelList, Boolean isUpdateSupport);
String importBaseStaff(List<CcdiBaseStaffExcel> excelList);
/**
* 查询员工下拉列表

View File

@@ -0,0 +1,29 @@
package com.ruoyi.info.collection.service;
import com.ruoyi.info.collection.domain.CcdiEnterpriseBaseInfo;
import com.ruoyi.info.collection.domain.excel.CcdiEnterpriseBaseInfoExcel;
import com.ruoyi.info.collection.domain.vo.EnterpriseBaseInfoImportFailureVO;
import com.ruoyi.info.collection.domain.vo.ImportStatusVO;
import java.util.List;
import java.util.Set;
/**
* 实体库管理导入 Service 接口
*
* @author ruoyi
* @date 2026-04-17
*/
public interface ICcdiEnterpriseBaseInfoImportService {
void importEnterpriseBaseInfoAsync(List<CcdiEnterpriseBaseInfoExcel> excelList, String taskId, String userName);
ImportStatusVO getImportStatus(String taskId);
List<EnterpriseBaseInfoImportFailureVO> getImportFailures(String taskId);
CcdiEnterpriseBaseInfo validateAndBuildEntity(CcdiEnterpriseBaseInfoExcel excel,
Set<String> existingCreditCodes,
Set<String> processedCreditCodes,
String userName);
}

View File

@@ -0,0 +1,34 @@
package com.ruoyi.info.collection.service;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.info.collection.domain.dto.CcdiEnterpriseBaseInfoAddDTO;
import com.ruoyi.info.collection.domain.dto.CcdiEnterpriseBaseInfoEditDTO;
import com.ruoyi.info.collection.domain.dto.CcdiEnterpriseBaseInfoQueryDTO;
import com.ruoyi.info.collection.domain.excel.CcdiEnterpriseBaseInfoExcel;
import com.ruoyi.info.collection.domain.vo.CcdiEnterpriseBaseInfoVO;
import java.util.List;
/**
* 实体库管理 Service 接口
*
* @author ruoyi
* @date 2026-04-17
*/
public interface ICcdiEnterpriseBaseInfoService {
Page<CcdiEnterpriseBaseInfoVO> selectEnterpriseBaseInfoPage(Page<CcdiEnterpriseBaseInfoVO> page,
CcdiEnterpriseBaseInfoQueryDTO queryDTO);
CcdiEnterpriseBaseInfoVO selectEnterpriseBaseInfoById(String socialCreditCode);
int insertEnterpriseBaseInfo(CcdiEnterpriseBaseInfoAddDTO addDTO);
int updateEnterpriseBaseInfo(CcdiEnterpriseBaseInfoEditDTO editDTO);
int deleteEnterpriseBaseInfoByIds(String[] socialCreditCodes);
List<CcdiEnterpriseBaseInfoExcel> selectEnterpriseBaseInfoListForExport(CcdiEnterpriseBaseInfoQueryDTO queryDTO);
String importEnterpriseBaseInfo(List<CcdiEnterpriseBaseInfoExcel> excelList);
}

View File

@@ -0,0 +1,38 @@
package com.ruoyi.info.collection.service;
import com.ruoyi.info.collection.domain.excel.CcdiIntermediaryEnterpriseRelationExcel;
import com.ruoyi.info.collection.domain.vo.ImportStatusVO;
import com.ruoyi.info.collection.domain.vo.IntermediaryEnterpriseRelationImportFailureVO;
import java.util.List;
/**
* 中介实体关联关系异步导入服务接口
*/
public interface ICcdiIntermediaryEnterpriseRelationImportService {
/**
* 异步导入中介实体关联关系
*
* @param excelList Excel数据
* @param taskId 任务ID
* @param userName 当前用户名
*/
void importAsync(List<CcdiIntermediaryEnterpriseRelationExcel> excelList, String taskId, String userName);
/**
* 查询导入状态
*
* @param taskId 任务ID
* @return 导入状态
*/
ImportStatusVO getImportStatus(String taskId);
/**
* 查询导入失败记录
*
* @param taskId 任务ID
* @return 失败记录
*/
List<IntermediaryEnterpriseRelationImportFailureVO> getImportFailures(String taskId);
}

View File

@@ -7,7 +7,7 @@ import com.ruoyi.info.collection.domain.vo.IntermediaryPersonImportFailureVO;
import java.util.List;
/**
* 个人中介异步导入Service接口
* 中介信息异步导入Service接口
*
* @author ruoyi
* @date 2026-02-06
@@ -15,7 +15,7 @@ import java.util.List;
public interface ICcdiIntermediaryPersonImportService {
/**
* 异步导入个人中介数据
* 异步导入中介信息
*
* @param excelList Excel数据列表
* @param taskId 任务ID

View File

@@ -2,10 +2,13 @@ package com.ruoyi.info.collection.service;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.info.collection.domain.dto.*;
import com.ruoyi.info.collection.domain.excel.CcdiIntermediaryEnterpriseRelationExcel;
import com.ruoyi.info.collection.domain.excel.CcdiIntermediaryEntityExcel;
import com.ruoyi.info.collection.domain.excel.CcdiIntermediaryPersonExcel;
import com.ruoyi.info.collection.domain.vo.CcdiIntermediaryEnterpriseRelationVO;
import com.ruoyi.info.collection.domain.vo.CcdiIntermediaryEntityDetailVO;
import com.ruoyi.info.collection.domain.vo.CcdiIntermediaryPersonDetailVO;
import com.ruoyi.info.collection.domain.vo.CcdiIntermediaryRelativeVO;
import com.ruoyi.info.collection.domain.vo.CcdiIntermediaryVO;
import java.util.List;
@@ -35,6 +38,22 @@ public interface ICcdiIntermediaryService {
*/
CcdiIntermediaryPersonDetailVO selectIntermediaryPersonDetail(String bizId);
/**
* 查询中介亲属列表
*
* @param bizId 中介本人ID
* @return 亲属列表
*/
List<CcdiIntermediaryRelativeVO> selectIntermediaryRelativeList(String bizId);
/**
* 查询中介亲属详情
*
* @param relativeBizId 亲属ID
* @return 亲属详情
*/
CcdiIntermediaryRelativeVO selectIntermediaryRelativeDetail(String relativeBizId);
/**
* 查询实体中介详情
*
@@ -59,6 +78,31 @@ public interface ICcdiIntermediaryService {
*/
int updateIntermediaryPerson(CcdiIntermediaryPersonEditDTO editDTO);
/**
* 新增中介亲属
*
* @param bizId 中介本人ID
* @param addDTO 新增DTO
* @return 结果
*/
int insertIntermediaryRelative(String bizId, CcdiIntermediaryRelativeAddDTO addDTO);
/**
* 修改中介亲属
*
* @param editDTO 编辑DTO
* @return 结果
*/
int updateIntermediaryRelative(CcdiIntermediaryRelativeEditDTO editDTO);
/**
* 删除中介亲属
*
* @param relativeBizId 亲属ID
* @return 结果
*/
int deleteIntermediaryRelative(String relativeBizId);
/**
* 新增实体中介
*
@@ -75,6 +119,47 @@ public interface ICcdiIntermediaryService {
*/
int updateIntermediaryEntity(CcdiIntermediaryEntityEditDTO editDTO);
/**
* 查询中介关联机构列表
*
* @param bizId 中介本人ID
* @return 关联机构列表
*/
List<CcdiIntermediaryEnterpriseRelationVO> selectIntermediaryEnterpriseRelationList(String bizId);
/**
* 查询中介关联机构详情
*
* @param id 主键ID
* @return 关联机构详情
*/
CcdiIntermediaryEnterpriseRelationVO selectIntermediaryEnterpriseRelationDetail(Long id);
/**
* 新增中介关联机构
*
* @param bizId 中介本人ID
* @param addDTO 新增DTO
* @return 结果
*/
int insertIntermediaryEnterpriseRelation(String bizId, CcdiIntermediaryEnterpriseRelationAddDTO addDTO);
/**
* 修改中介关联机构
*
* @param editDTO 编辑DTO
* @return 结果
*/
int updateIntermediaryEnterpriseRelation(CcdiIntermediaryEnterpriseRelationEditDTO editDTO);
/**
* 删除中介关联机构
*
* @param id 主键ID
* @return 结果
*/
int deleteIntermediaryEnterpriseRelation(Long id);
/**
* 批量删除中介
*
@@ -84,7 +169,7 @@ public interface ICcdiIntermediaryService {
int deleteIntermediaryByIds(String[] ids);
/**
* 校验人员ID唯一性
* 校验中介本人证件号码唯一性
*
* @param personId 人员ID
* @param bizId 排除的人员ID
@@ -109,6 +194,14 @@ public interface ICcdiIntermediaryService {
*/
String importIntermediaryPerson(List<CcdiIntermediaryPersonExcel> list);
/**
* 导入中介实体关联关系
*
* @param list Excel实体列表
* @return 任务ID
*/
String importIntermediaryEnterpriseRelation(List<CcdiIntermediaryEnterpriseRelationExcel> list);
/**
* 导入实体中介数据
*

View File

@@ -1,6 +1,7 @@
package com.ruoyi.info.collection.service;
import com.ruoyi.info.collection.domain.excel.CcdiPurchaseTransactionExcel;
import com.ruoyi.info.collection.domain.excel.CcdiPurchaseTransactionSupplierExcel;
import com.ruoyi.info.collection.domain.vo.PurchaseTransactionImportFailureVO;
import com.ruoyi.info.collection.domain.vo.ImportStatusVO;
@@ -17,11 +18,17 @@ public interface ICcdiPurchaseTransactionImportService {
/**
* 异步导入采购交易数据
*
* @param excelList Excel数据列表
* @param mainExcelList 主信息Excel数据列表
* @param supplierExcelList 供应商明细Excel数据列表
* @param taskId 任务ID
* @param userName 当前用户名
*/
void importTransactionAsync(List<CcdiPurchaseTransactionExcel> excelList, String taskId, String userName);
void importTransactionAsync(
List<CcdiPurchaseTransactionExcel> mainExcelList,
List<CcdiPurchaseTransactionSupplierExcel> supplierExcelList,
String taskId,
String userName
);
/**
* 查询导入状态

View File

@@ -5,6 +5,7 @@ import com.ruoyi.info.collection.domain.dto.CcdiPurchaseTransactionAddDTO;
import com.ruoyi.info.collection.domain.dto.CcdiPurchaseTransactionEditDTO;
import com.ruoyi.info.collection.domain.dto.CcdiPurchaseTransactionQueryDTO;
import com.ruoyi.info.collection.domain.excel.CcdiPurchaseTransactionExcel;
import com.ruoyi.info.collection.domain.excel.CcdiPurchaseTransactionSupplierExcel;
import com.ruoyi.info.collection.domain.vo.CcdiPurchaseTransactionVO;
import java.util.List;
@@ -77,8 +78,12 @@ public interface ICcdiPurchaseTransactionService {
/**
* 导入采购交易数据(异步)
*
* @param excelList Excel实体列表
* @param mainExcelList 主信息Excel实体列表
* @param supplierExcelList 供应商明细Excel实体列表
* @return 任务ID
*/
String importTransaction(List<CcdiPurchaseTransactionExcel> excelList);
String importTransaction(
List<CcdiPurchaseTransactionExcel> mainExcelList,
List<CcdiPurchaseTransactionSupplierExcel> supplierExcelList
);
}

View File

@@ -7,7 +7,7 @@ import com.ruoyi.info.collection.domain.vo.StaffEnterpriseRelationImportFailureV
import java.util.List;
/**
* 员工实体关系信息异步导入服务层
* 员工亲属实体关异步导入服务层
*
* @author ruoyi
* @date 2026-02-09

View File

@@ -5,6 +5,7 @@ import com.ruoyi.info.collection.domain.dto.CcdiStaffEnterpriseRelationAddDTO;
import com.ruoyi.info.collection.domain.dto.CcdiStaffEnterpriseRelationEditDTO;
import com.ruoyi.info.collection.domain.dto.CcdiStaffEnterpriseRelationQueryDTO;
import com.ruoyi.info.collection.domain.excel.CcdiStaffEnterpriseRelationExcel;
import com.ruoyi.info.collection.domain.vo.CcdiStaffEnterpriseRelationOptionVO;
import com.ruoyi.info.collection.domain.vo.CcdiStaffEnterpriseRelationVO;
import java.util.List;
@@ -42,6 +43,14 @@ public interface ICcdiStaffEnterpriseRelationService {
*/
List<CcdiStaffEnterpriseRelationExcel> selectRelationListForExport(CcdiStaffEnterpriseRelationQueryDTO queryDTO);
/**
* 查询有效员工亲属下拉选项
*
* @param query 搜索关键词
* @return 下拉选项
*/
List<CcdiStaffEnterpriseRelationOptionVO> selectFamilyOptions(String query);
/**
* 查询员工实体关系详情
*

View File

@@ -22,18 +22,8 @@ public interface ICcdiStaffRecruitmentImportService {
* @param taskId 任务ID
* @param userName 用户名
*/
void importRecruitmentAsync(List<CcdiStaffRecruitmentExcel> excelList,
String taskId,
String userName);
/**
* 异步导入招聘记录历史工作经历数据
*
* @param excelList Excel数据列表
* @param taskId 任务ID
* @param userName 用户名
*/
void importRecruitmentWorkAsync(List<CcdiStaffRecruitmentWorkExcel> excelList,
void importRecruitmentAsync(List<CcdiStaffRecruitmentExcel> recruitmentList,
List<CcdiStaffRecruitmentWorkExcel> workList,
String taskId,
String userName);

View File

@@ -81,13 +81,6 @@ public interface ICcdiStaffRecruitmentService {
* @param excelList Excel实体列表
* @return 结果
*/
String importRecruitment(List<CcdiStaffRecruitmentExcel> excelList);
/**
* 导入招聘记录历史工作经历数据(异步)
*
* @param excelList Excel实体列表
* @return 任务ID
*/
String importRecruitmentWork(List<CcdiStaffRecruitmentWorkExcel> excelList);
String importRecruitment(List<CcdiStaffRecruitmentExcel> recruitmentList,
List<CcdiStaffRecruitmentWorkExcel> workList);
}

View File

@@ -4,7 +4,6 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.info.collection.domain.CcdiAccountInfo;
import com.ruoyi.info.collection.domain.CcdiAccountResult;
import com.ruoyi.info.collection.domain.CcdiBaseStaff;
import com.ruoyi.info.collection.domain.CcdiStaffFmyRelation;
import com.ruoyi.info.collection.domain.dto.CcdiAccountInfoAddDTO;
@@ -16,7 +15,6 @@ import com.ruoyi.info.collection.domain.vo.CcdiAccountInfoVO;
import com.ruoyi.info.collection.domain.vo.CcdiAccountRelationOptionVO;
import com.ruoyi.info.collection.domain.vo.ImportResult;
import com.ruoyi.info.collection.mapper.CcdiAccountInfoMapper;
import com.ruoyi.info.collection.mapper.CcdiAccountResultMapper;
import com.ruoyi.info.collection.mapper.CcdiBaseStaffMapper;
import com.ruoyi.info.collection.mapper.CcdiStaffFmyRelationMapper;
import com.ruoyi.info.collection.service.ICcdiAccountInfoService;
@@ -56,9 +54,6 @@ public class CcdiAccountInfoServiceImpl implements ICcdiAccountInfoService {
@Resource
private CcdiAccountInfoMapper accountInfoMapper;
@Resource
private CcdiAccountResultMapper accountResultMapper;
@Resource
private CcdiBaseStaffMapper baseStaffMapper;
@@ -87,9 +82,8 @@ public class CcdiAccountInfoServiceImpl implements ICcdiAccountInfoService {
CcdiAccountInfo accountInfo = new CcdiAccountInfo();
BeanUtils.copyProperties(addDTO, accountInfo);
int result = accountInfoMapper.insert(accountInfo);
syncAccountResult(accountInfo.getBankScope(), null, accountInfo.getAccountNo(), addDTO);
return result;
prepareAnalysisFields(accountInfo);
return accountInfoMapper.insert(accountInfo);
}
@Override
@@ -110,26 +104,13 @@ public class CcdiAccountInfoServiceImpl implements ICcdiAccountInfoService {
CcdiAccountInfo accountInfo = new CcdiAccountInfo();
BeanUtils.copyProperties(editDTO, accountInfo);
int result = accountInfoMapper.updateById(accountInfo);
syncAccountResult(accountInfo.getBankScope(), existing, accountInfo.getAccountNo(), editDTO);
return result;
prepareAnalysisFields(accountInfo);
return accountInfoMapper.updateById(accountInfo);
}
@Override
@Transactional
public int deleteAccountInfoByIds(Long[] ids) {
List<CcdiAccountInfo> accountList = accountInfoMapper.selectBatchIds(Arrays.asList(ids));
if (!accountList.isEmpty()) {
List<String> accountNos = accountList.stream()
.map(CcdiAccountInfo::getAccountNo)
.filter(StringUtils::isNotEmpty)
.toList();
if (!accountNos.isEmpty()) {
LambdaQueryWrapper<CcdiAccountResult> resultWrapper = new LambdaQueryWrapper<>();
resultWrapper.in(CcdiAccountResult::getAccountNo, accountNos);
accountResultMapper.delete(resultWrapper);
}
}
return accountInfoMapper.deleteBatchIds(Arrays.asList(ids));
}
@@ -250,51 +231,38 @@ public class CcdiAccountInfoServiceImpl implements ICcdiAccountInfoService {
}
}
private void syncAccountResult(String newBankScope, CcdiAccountInfo existing, String accountNo, Object dto) {
String oldBankScope = existing == null ? null : existing.getBankScope();
String oldAccountNo = existing == null ? null : existing.getAccountNo();
if (existing != null && "EXTERNAL".equals(oldBankScope)
&& (!"EXTERNAL".equals(newBankScope) || !StringUtils.equals(oldAccountNo, accountNo))) {
LambdaQueryWrapper<CcdiAccountResult> deleteWrapper = new LambdaQueryWrapper<>();
deleteWrapper.eq(CcdiAccountResult::getAccountNo, oldAccountNo);
accountResultMapper.delete(deleteWrapper);
}
if (!"EXTERNAL".equals(newBankScope)) {
private void prepareAnalysisFields(CcdiAccountInfo accountInfo) {
if (!"EXTERNAL".equals(accountInfo.getBankScope())) {
clearAnalysisFields(accountInfo);
return;
}
LambdaQueryWrapper<CcdiAccountResult> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(CcdiAccountResult::getAccountNo, accountNo);
CcdiAccountResult existingResult = accountResultMapper.selectOne(wrapper);
CcdiAccountResult accountResult = new CcdiAccountResult();
BeanUtils.copyProperties(dto, accountResult);
accountResult.setAccountNo(accountNo);
if (accountResult.getIsActualControl() == null) {
accountResult.setIsActualControl(1);
if (accountInfo.getIsActualControl() == null) {
accountInfo.setIsActualControl(1);
}
if (accountResult.getAvgMonthTxnCount() == null) {
accountResult.setAvgMonthTxnCount(0);
if (accountInfo.getAvgMonthTxnCount() == null) {
accountInfo.setAvgMonthTxnCount(0);
}
if (accountResult.getAvgMonthTxnAmount() == null) {
accountResult.setAvgMonthTxnAmount(BigDecimal.ZERO);
if (accountInfo.getAvgMonthTxnAmount() == null) {
accountInfo.setAvgMonthTxnAmount(BigDecimal.ZERO);
}
if (StringUtils.isEmpty(accountResult.getTxnFrequencyLevel())) {
accountResult.setTxnFrequencyLevel("MEDIUM");
if (StringUtils.isEmpty(accountInfo.getTxnFrequencyLevel())) {
accountInfo.setTxnFrequencyLevel("MEDIUM");
}
if (StringUtils.isEmpty(accountInfo.getTxnRiskLevel())) {
accountInfo.setTxnRiskLevel("LOW");
}
if (StringUtils.isEmpty(accountResult.getTxnRiskLevel())) {
accountResult.setTxnRiskLevel("LOW");
}
if (existingResult == null) {
accountResultMapper.insert(accountResult);
return;
}
accountResult.setResultId(existingResult.getResultId());
accountResultMapper.updateById(accountResult);
private void clearAnalysisFields(CcdiAccountInfo accountInfo) {
accountInfo.setIsActualControl(null);
accountInfo.setAvgMonthTxnCount(null);
accountInfo.setAvgMonthTxnAmount(null);
accountInfo.setTxnFrequencyLevel(null);
accountInfo.setDebitSingleMaxAmount(null);
accountInfo.setCreditSingleMaxAmount(null);
accountInfo.setDebitDailyMaxAmount(null);
accountInfo.setCreditDailyMaxAmount(null);
accountInfo.setTxnRiskLevel(null);
}
private void validateAmount(BigDecimal amount, String fieldLabel) {

View File

@@ -39,6 +39,8 @@ import java.util.concurrent.TimeUnit;
public class CcdiAssetInfoImportServiceImpl implements ICcdiAssetInfoImportService {
private static final String STATUS_KEY_PREFIX = "import:assetInfo:";
private static final String SHEET_NAME = "亲属资产信息";
private static final int EXCEL_DATA_START_ROW = 2;
@Resource
private CcdiAssetInfoMapper assetInfoMapper;
@@ -91,7 +93,8 @@ public class CcdiAssetInfoImportServiceImpl implements ICcdiAssetInfoImportServi
Map<String, Set<String>> ownerMap = buildOwnerMap(personIds);
for (CcdiAssetInfoExcel excel : excelList) {
for (int i = 0; i < excelList.size(); i++) {
CcdiAssetInfoExcel excel = excelList.get(i);
try {
validateExcel(excel);
Set<String> familyIds = ownerMap.get(excel.getPersonId());
@@ -111,6 +114,8 @@ public class CcdiAssetInfoImportServiceImpl implements ICcdiAssetInfoImportServi
} catch (Exception e) {
AssetImportFailureVO failureVO = new AssetImportFailureVO();
BeanUtils.copyProperties(excel, failureVO);
failureVO.setSheetName(SHEET_NAME);
failureVO.setRowNum(i + EXCEL_DATA_START_ROW);
failureVO.setErrorMessage(e.getMessage());
failures.add(failureVO);
}

View File

@@ -1,6 +1,7 @@
package com.ruoyi.info.collection.service.impl;
import com.alibaba.fastjson2.JSON;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.info.collection.domain.CcdiAssetInfo;
@@ -90,14 +91,24 @@ public class CcdiBaseStaffAssetImportServiceImpl implements ICcdiBaseStaffAssetI
.toList();
Map<String, Set<String>> ownerMap = buildOwnerMap(personIds);
Set<String> existingAssetKeys = buildExistingAssetKeys(personIds);
Set<String> importedAssetKeys = new java.util.LinkedHashSet<>();
for (CcdiBaseStaffAssetInfoExcel excel : excelList) {
for (int i = 0; i < excelList.size(); i++) {
CcdiBaseStaffAssetInfoExcel excel = excelList.get(i);
try {
validateExcel(excel);
Set<String> familyIds = ownerMap.get(excel.getPersonId());
if (familyIds == null || familyIds.isEmpty()) {
throw new RuntimeException("员工资产导入仅支持员工本人证件号");
}
String assetKey = buildAssetKey(excel.getPersonId(), excel.getAssetMainType(), excel.getAssetSubType(), excel.getAssetName());
if (existingAssetKeys.contains(assetKey)) {
throw new RuntimeException("资产记录已存在");
}
if (!importedAssetKeys.add(assetKey)) {
throw new RuntimeException("资产记录在导入文件中重复");
}
CcdiAssetInfo assetInfo = new CcdiAssetInfo();
BeanUtils.copyProperties(excel, assetInfo);
@@ -109,6 +120,8 @@ public class CcdiBaseStaffAssetImportServiceImpl implements ICcdiBaseStaffAssetI
} catch (Exception e) {
BaseStaffAssetImportFailureVO failureVO = new BaseStaffAssetImportFailureVO();
BeanUtils.copyProperties(excel, failureVO);
failureVO.setSheetName("员工资产信息");
failureVO.setRowNum(i + 2);
failureVO.setErrorMessage(e.getMessage());
failures.add(failureVO);
}
@@ -168,6 +181,18 @@ public class CcdiBaseStaffAssetImportServiceImpl implements ICcdiBaseStaffAssetI
return result;
}
private Set<String> buildExistingAssetKeys(List<String> personIds) {
if (personIds == null || personIds.isEmpty()) {
return Set.of();
}
LambdaQueryWrapper<CcdiAssetInfo> wrapper = new LambdaQueryWrapper<>();
wrapper.in(CcdiAssetInfo::getPersonId, personIds);
return assetInfoMapper.selectList(wrapper).stream()
.filter(asset -> StringUtils.equals(asset.getFamilyId(), asset.getPersonId()))
.map(asset -> buildAssetKey(asset.getPersonId(), asset.getAssetMainType(), asset.getAssetSubType(), asset.getAssetName()))
.collect(java.util.stream.Collectors.toCollection(java.util.LinkedHashSet::new));
}
private void mergeOwnerMappings(Map<String, Set<String>> result, List<Map<String, String>> mappings) {
if (mappings == null) {
return;
@@ -203,6 +228,14 @@ public class CcdiBaseStaffAssetImportServiceImpl implements ICcdiBaseStaffAssetI
}
}
private String buildAssetKey(String personId, String assetMainType, String assetSubType, String assetName) {
return String.join("|",
StringUtils.nvl(personId, ""),
StringUtils.nvl(assetMainType, ""),
StringUtils.nvl(assetSubType, ""),
StringUtils.nvl(assetName, ""));
}
private void updateImportStatus(String taskId, String status, ImportResult result) {
Map<String, Object> statusData = new HashMap<>();
statusData.put("status", status);

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