diff --git a/.scratch/customer-rework/HANDOFF-2026-09-05-API-SUMMARY-WIP.md b/.scratch/customer-rework/HANDOFF-2026-09-05-API-SUMMARY-WIP.md new file mode 100644 index 0000000..0d5cf02 --- /dev/null +++ b/.scratch/customer-rework/HANDOFF-2026-09-05-API-SUMMARY-WIP.md @@ -0,0 +1,81 @@ +# 交接篇:票 11 API-SUMMARY 重写进行中(SESSION 2,2026-09-05) + +> 换机交接。上篇 `.scratch/customer-rework/HANDOFF-2026-09-05.md` 交接到本会话已完成票 09/12/10; +> 本篇从**票 11 第 2 项(API-SUMMARY.md 整篇重写,素材已采齐、正文未落笔)**处交接。 + +## 0. 会话框架(先读) + +- **模式**:wayfinder「Work through the map」,地图 `.scratch/customer-rework/map.md`。 +- **用户既定指令**:「继续做,把整张 map 做完」。票据在 `.scratch/customer-rework/issues/`。 +- **纪律**:每票收尾=票内追加 `## Answer` + `Status: resolved` → rework map.md「Decisions so far」追加一行索引。 +- **Do not**:票据/ADR/map 已记录的内容不重述,按路径引用(下同)。 + +## 1. 当前进度 + +| 票 | 状态 | +|---|---| +| 09(F6/F7/F8/F10)、12(战略协议) | resolved(Answer 见各票文件) | +| 10 回归重测 | **resolved**——五项验收全过,报告 `.scratch/customer-rework/RETEST-REPORT.md`;冒烟 `tmp/smoke-t10.py` 43 步全绿;服务已停、环境已还原 | +| **11 文档同步** | **进行中**(五项清单见 `issues/11-docs-sync.md`):
① customer-module/map.md 返工增补段 —— 未做
② **API-SUMMARY.md 重写 —— 素材齐备,正文未落笔(本篇 §2 是全部素材)**
③ `.scratch/customer-module/HANDOFF-2026-09-05.md` 新篇(旧篇不改写)—— 未做
④ crm-customer/CONTEXT.md 同步 —— 未做
⑤ URL 对账脚本零差异 + 票 11 Answer/resolved + rework map 加 11 行 + map Status 收官 —— 未做 | + +## 2. API-SUMMARY 重写素材包(核心交接,事实均已在源码/冒烟实证) + +### 2.1 权威端点清单 + +脚本产物 `tmp/dump_api_out.txt`(crm-customer + crm-rule + crm-preference 全部 controller:类级前缀 + 动词 + 路径 + 参数行),`tmp/dump_params_out.txt` 为路径-only 版。要点: + +**crm-customer**(写=POST 表单、读=GET 查询参数;全部无 @PathVariable/PUT/DELETE): + +- `CustomerWorkspaceController /api/customer/workspace`:POST `/page`、POST `/board/summary`、POST `/board/cards`——表单绑定 `CustomerWorkspacePageParam` +- `CustomerController /api/customer`:POST `/create`(CustomerCreateDTO)、POST `/edit`(**id + CustomerUpdateDTO**)、GET `/detail?id=`、POST `/page`(CustomerPageParam)、POST `/search`(CustomerSearchParam)、POST `/quick-create`(CustomerQuickCreateDTO)、GET `/contacts?customerId=`、GET `/check-name?name=&excludeId=`、GET `/check-credit-code?creditCode=`、GET `/company-lookup?companyName=`、POST `/company-lookup/batch-update?ids=`(F6) +- `CustomerDetailController /api/customer`:GET `/detail-head?id=`、GET `/member/list?id=`、POST `/member/add`(**id + MemberAddDTO{memberUserIds[]}**)、POST `/member/remove?id=&memberUserId=`、GET `/opportunity/page?id=`、GET `/oplog/page?id=`(+OplogPageParam)、POST `/follow/add`(id + FollowCreateDTO)、GET `/follow/page?id=` +- `CustomerContactController /api/customer/contact`:POST `/create`(ContactDTO)、POST `/edit`(**id + ContactDTO**)、POST `/delete?id=`、GET `/detail?id=`、GET `/page`(ContactPageParam=BaseParam,keyword 匹配姓名/电话/所属客户名)、GET `/search?keyword=&limit=`(**limit 默认 20**)、GET `/check-phone?phone=&excludeId=`(D26 软提示,受查重设置电话开关控制) +- `CustomerFocusController /api/customer`:POST `/focus|/unfocus|/star|/unstar?id=`、POST `/focus-batch?ids=` +- `CustomerOwnershipController /api/customer`:POST `/claim|/claim-batch`、`/assign`(**id+userId**)|`/assign-batch`(**ids+userId**)、`/release-pool|/release-pool-batch`、`/archive|/archive-batch`、`/restore?id=`(单数 id、批量 ids) +- `CustomerTransferController /api/customer/transfer`:GET `/preview`、POST `/initiate`(TransferInitiateDTO:reason 必填 resign/transfer_post/region_adjust + toDirectorId 选填 + remark)、GET `/detail?id=`、GET `/page`(TransferPageParam)、POST `/assign`(**id + customerIds + assignUserId**,BatchResult 行级部分成功)、GET `/assignable?id=`(**D-07 P1 超时已知缺陷**) +- `CustomerImportController /api/customer/import`:POST `/upload`(**MultipartFile file + importMode + duplicateStrategy 可选**)、GET `/template`、POST `/confirm?taskId=`、GET `/result?taskId=`、GET `/failures?taskId=`、GET `/page`(ImportPageParam:status/importMode) +- `CustomerAgreementController /api/customer/agreement`(票 12 五端点):POST `/create`(AgreementDTO)、POST `/edit`(**id + AgreementDTO**,归属不可换客户)、POST `/delete?id=`、GET `/detail?id=`、GET `/list?customerId=` +- `CustomerPingController`:GET `/api/customer/ping` + +**crm-rule 客户规则族**:GET `/api/rule/customer/reminder` + POST `/api/rule/customer/reminder/save`(CustomerReminderRuleDTO 表单:masterEnabled/firstTriggerEnabled/firstTriggerDays/secondIntervalEnabled/secondIntervalDays);GET `/api/rule/customer/dedup` + POST `/api/rule/customer/dedup/save`(CustomerDedupRuleDTO 表单:masterEnabled/nameEnabled/nameMatchMode(1精确2模糊)/similarityThreshold/phoneEnabled)。(crm-rule 其余族=线索池/商机池规则/方案卡模板/阶段模板/地区——**不在客户域文档范围**,勿抄进客户 API-SUMMARY) + +**crm-preference 平台偏好**(不在 ADR-0017 改造范围,**saved-view save 例外用 @RequestBody JSON**):GET `/api/preference/get?scopeKey=` + POST `/api/preference/save`(scopeKey + visibleKeys + columnOrder 可空 List);GET `/api/preference/view/list?scopeKey=` + POST `/api/preference/view/save`(scopeKey + JSON SavedView) + POST `/api/preference/view/delete?scopeKey=&viewId=` + POST `/api/preference/view/set-default?scopeKey=&viewId=`;GET `/api/preference/view-form/get?scopeKey=` + POST `/api/preference/view-form/save`(scopeKey + viewForm)(返工票 05) + +### 2.2 关键值域/事实(源码锚点) + +- **错误码 67001-67017** 全表见 `crm-customer/.../constant/CustomerConstants.java` L13-29(67017=CODE_AGREEMENT_INVALID 票 12 新增)。 +- **oplog action 值域 17 种**(同文件 L85-101):CREATE/UPDATE/FOLLOW/ARCHIVE/RESTORE/TRANSFER/CLAIM/POOL/STAGE_CHANGE/MEMBER_ADD/MEMBER_REMOVE + CONTACT_ADD/CONTACT_EDIT/CONTACT_DELETE(F10) + AGREEMENT_ADD/AGREEMENT_EDIT/AGREEMENT_DELETE(票 12)。⚠ `OplogPageParam` 的 @Schema 描述仍写 11 种(滞后,未改——票 11 不动代码,文档按 17 种真值写)。 +- **F7 终态**(票 09 Answer 澄清):ownerOnly 等布尔字段**未做**,viewType 单参数承载五内置视图 `CustomerWorkspaceViewType`:ASSIGNED/COLLABORATING/FOLLOW_UP_DUE/FOCUSED/RECENT;workspace 适配 mine 全五、overview 无 FOLLOW_UP_DUE、pool 仅 RECENT/FOCUSED;越界视图 SQL 自然空集不硬拒;savedViewId 叠加自定义视图(RECENT 不接)。customer_view_log 生产侧零写入 → detailHead upsert touchViewLog 收口(票 04 建壳挂账)。 +- **F8 duplicateStrategy**(票 09 Answer):upload 可选参数,SKIP 缺省/OVERWRITE,非法值 67013 拦;D24 冻结语义=作用面仅文件内重复组、overwrite=组内最后一条通过校验的行 UPDATE 生效、不触名称相似 SUSPECT;响应回显 duplicateStrategy。 +- **F6 batch-update**:`POST /api/customer/company-lookup/batch-update?ids=`(ids 表单绑定、上限 100、§C2 只补空缺、五种状态软处置、port stub 恒 NO_HIT、真实企查查接入自动激活)。 +- **groupColumn 白名单**(CustomerWorkspaceServiceImpl L185-191):`stage`→customer_stage / `star`→customer_star_level / 其他→relation_star_level;board/cards 必传 groupValue 否则 67001;**pool 看板 67001 拒绝**(「公海无卡片视图」,票 03)。 +- **scopeKey 清单**(CustomerConstants L53-81):saved-view/列/形态共用 `customer.overview` / `customer.mine` / `customer.pool`;列/形态另有 `contact.list`;view-form 公海仅 list/split(board 被拒);商机侧 `opportunity.mine`(冒烟实测)等。 +- **company-lookup 参数 = `companyName`**(旧 API-SUMMARY 写 `keyword=` 是错的,以代码为准)。 +- **AgreementDTO 字段**:customerId(新增必填,编辑以库内归属为准)/agreementLevel(1~3 必填)/amount(文本可空)/remark/fileFileId + customerName(仅出参);删协议联动清主表 strategic_agreement_level 快照。 +- **67017 语义**:等级缺失或越界/协议不存在或无权访问。 +- **旧文档 §0/§1/§5 骨架保留**:通用约定(Bearer/Result/PageResult/雪花串化/fail-open/脱敏现状/时间格式)+ 错误码表扩到 67017 + §5 销账(1 confirmSimilar、2 查重设置端点保持删除线;3 改为「页签 5 关联项目仍 --、页签 6 战略协议已上线→§2.x」;4/5 保持划出项;**新增 D-07 assignable 超时已知缺陷条目**)。 +- **计划段落结构**(重写时沿用旧骨架编号顺延):§2.1 三 workspace(含 F7 表格式 Param 说明)→ 2.2 公海与归属动作 → 2.3 新增/编辑/查重/工商(含 F6) → 2.4 商机快建+商机侧依赖 → 2.5 详情公共头部+8 页签(页签 6 引战略协议节)→ 2.6 战略协议五端点 → 2.7 联系人独立菜单 → 2.8 团队成员 → 2.9 关注/重点 → 2.10 归档/恢复 → 2.11 交割 → 2.12 导入(含 F8) → 2.13 规则设置 → 2.14 偏好三件套+scopeKey+JSON 例外 → 2.15 ping;§3 值域附录、§4 联调速查(冒烟范式改 `tmp/smoke-t10.py`)、§5 缺口。目标 <1000 行,旧文档 `.scratch/customer-module/API-SUMMARY.md`(194 行)供对照。 + +### 2.3 票 11 后续步骤细节 + +- **① map 增补段**:`.scratch/customer-module/map.md` 末尾(L140-142 已有「返工增补指针」一行段)扩为完整段:R1-R11 决策指针(→ rework map)+ 每张返工票(01-10、12)一行增量决策。素材=rework map「Decisions so far」11 行索引 + 各票 Answer。 +- **③ HANDOFF 新篇**:`.scratch/customer-module/HANDOFF-2026-09-05.md`(正式收工篇,区别于 customer-rework 下的交接篇);链接 RETEST-REPORT;旧 HANDOFF 不改写。 +- **④ CONTEXT.md**:`crm-customer/CONTEXT.md` 若有接口清单段,同步新 URL 契约 + 偏好能力(列/形态/saved-view)+ 战略协议。 +- **⑤ URL 对账**:写脚本从新 API-SUMMARY.md 提取全部 URL 与 `@*Mapping` 对账(可复用 `tmp/dump_api.py` 输出做基准);零差异后票 11 Answer/resolved + rework map 加 11 索引行 + 检查 map「Not yet specified」清空 → **整图收官**。 + +## 3. 工具坑(本机实证,勿重蹈) + +- **PowerShell**:`-Command` 双引号串里 `$_`/`$env:` 被吞 → 一律写 .ps1 文件用 `-File`;语句分隔用 `;` 不用 `&&`。 +- **写文件范围**:Write/SearchReplace 只限 workspace(`d:\code\crm-backend-matt`)内;docs 仓 `D:\code\crm-api-docs` 等外部路径 → 先写 workspace 内 staging 再 python 复制(先例 `.scratch/customer-rework/deploy_bru.py`)。 +- **py**:统一 `py -3 -X utf8`;`-c` 内嵌脚本引号易炸 → 落 .py 文件再跑。 +- **服务起停**(如需复跑冒烟):先例 `.scratch/customer-e2e/map.md` L29(verify profile;MINIO 凭据见该处,不在本文档重复);重打包 `tmp/pack-crmapp.ps1`(fat jar 会落后源码,核对时间戳);`tmp/run-crmapp.ps1` / `tmp/stop-crmapp.ps1`。**当前服务已停**。 +- **冒烟实测参数**(写文档校对用):`tmp/smoke-t10.py`——edit 必带 `version`+`isBizNegotiated`+`isChild`;contact/create 必填 `name/jobTitleName/phone`;preference save 用 visibleKeys/columnOrder 逗号串。 + +## 4. Suggested skills + +- `wayfinder`:Work through the map 模式续作,地图 `.scratch/customer-rework/`,从票 11 接续。 +- `bruno-sync`:仅当对账再需要时(当前 321=321 已闭环,无需重跑)。 + +## 5. 验收线(票 11) + +文档-代码对账零差异;旧 HANDOFF 不改写(历史只增);五项清单全勾 + Answer/resolved + rework map 11 行 → 整张 map 收官。 diff --git a/.scratch/customer-rework/RETEST-REPORT.md b/.scratch/customer-rework/RETEST-REPORT.md new file mode 100644 index 0000000..ddecb31 --- /dev/null +++ b/.scratch/customer-rework/RETEST-REPORT.md @@ -0,0 +1,72 @@ +# 客户模块返工 · 回归重测报告(票 10) + +- **日期**: 2026-09-05 +- **范围**: 返工票 01–09、12 全部改动后的回归验收(票 11 文档同步不在本报告内) +- **结论**: **五项验收全过,收工。** + +## 验收线逐项结果 + +### 1. `mvn test` 三模块全绿 ✅ + +全 reactor `clean test -pl crm-opportunity -am`(含 rule/customer/opportunity 传递依赖): + +| 模块 | 用例数 | 结果 | +|---|---|---| +| crm-rule | 152 | 全绿 | +| crm-customer | 158 | 全绿(基线 122,返工净增 36:风格改造 + 看板拒绝 + 查重设置 + 形态偏好 + viewTouch + 批量工商 + 战略协议 6 例 + 联系人 oplog) | +| crm-opportunity | 242 | 全绿(偏好 scopeKey 常量接入 + tags 双归属,零逻辑变更) | + +基线 521(146/122/242)→ 现 552,数量随用例变化、绿为准(票面口径)。 + +### 2. 冒烟全链 code=0 ✅ + +脚本 `tmp/smoke-t10.py`(复用 smoke-t12m.py 范式,URL 全部现行端点),服务 = 重打包后 fat jar(新代码入包,jar 时间戳 2026-09-05 11:18,启动日志可见 `customerAgreementMapper` 注册)。 + +**43 步 0 fail(SMOKE DONE)**,覆盖: + +- 登录(debug/token,verify profile) +- 客户三 workspace 列表(mine/overview/pool)+ 看板 summary/cards(mine/overview)+ **pool 看板断言 67001 拒绝**(返工票 03 口径) +- 建改查客户(quick-create → edit[CAS version] → detail → detail-head) +- 联系人 CRUD(create/edit/detail/page/delete) +- 抛公海 → 领取 → 分配(BUDDY) → 回收(ADMIN) +- 交割只读(page + assignable,见下方 D-07 说明;initiate=名下全量口径不重做,e2e-heavy 已覆盖) +- 导入全链(openpyxl 造文件 → upload[**含 duplicateStrategy=SKIP 且响应回显断言**,返工票 09-F8] → confirm → result 终态) +- 偏好存取:列偏好 save/get(visibleKeys/columnOrder 回读断言)+ 形态偏好 view-form save/get(返工票 05) +- 商机偏好存取(opportunity.mine,返工票 07) +- **战略协议五端点 + DB 快照断言**(返工票 12:create 后快照=2 → edit 后=3 → delete 后=NULL) +- **批量工商更新**(返工票 09-F6:ids 单查回填,stub 恒 NO_HIT) + +冒烟过程登记的脚本级修正(非服务缺陷):edit 需带 CAS `version` + `isBizNegotiated`;contact/edit 必填 jobTitleName/phone。 + +**已知缺陷引用(非本次回归)**: +- **D-07(P1)** `GET /api/customer/transfer/assignable` 稳定超时——票 05 已登记(e2e-heavy 30s×2 + probe 60s 双复现),本次历史单上 15s 超时复现,冒烟按「缺陷验证模式」记录不阻断(根因:根部门全树递归 + 逐用户 getDeptNames N+1)。 +- **D-04(P2)** 导入失败明细 `fail_reason` 列超长写不进(`Data too long for column 'fail_reason'`,服务日志实证);**D-05(P1)** is_biz_negotiated NOT NULL 无默认值——均为票 09 audit 已知项,维持原状。 + +### 3. bruno 产出验收 ✅ + +- 全量对账(`.scratch/customer-rework/bruno_scan_d.py`,本机 D:\ 路径版):**源码 321 钥匙 = 文档仓 321 generated 文件,new=0 / delete=0 / 钥匙冲突=0 / 无法识别=0 / 私产=0**。 +- 本次同步落盘 8 文件(票 09/12 增量): + - 新建 `A4 客户管理/战略协议/`(5 份:新增/编辑/删除/详情/页签列表,票 12 tag=`A4 客户管理/战略协议`——票 12 拍板「三页物理在客户详情下、单菜单归属」,对齐联系人先例) + - 新建 `A4 客户管理/我的客户/批量更新工商信息.bru`(F6) + - patch `上传导入文件并预校验.bru` ×2(客户公海 + 我的客户/客户导入 双 tag 副本:duplicateStrategy 参数行 + 请求示例行 + 响应骨架,F8) +- A4 目录树与 v29 对齐终验:A4 七节点(公海/总览/我的客户/客户详情/联系人/查重/交割)+ 战略协议按票 12 拍板挂 A4 根;knife4j 分组同构维持(票 07 终态无漂移)。 + +### 4. BOM 扫描 ✅ + +全仓 `*.java` 无 `EF BB BF` 前缀(AGENTS.md 编码纪律),零命中。 + +### 5. 风格 grep 终验 ✅ + +`grep "@PathVariable|@PutMapping|@DeleteMapping|@RequestBody" crm-customer/` 零命中。 + +## 用例计数明细 + +- crm-rule 152:含提醒规则 save 表单化(票 02)+ 查重设置单例栈(票 04) +- crm-customer 158:含 H2 集成 CustomerAgreementIntegrationTest 6 例(快照联动/归属不可换/软删/可见性继承/67017 校验) +- crm-opportunity 242:CustomerOpportunityQueryPortImplTest 等全量(含跨模块 port) + +## 遗留(进票 11 / 后续 effort) + +- 票 11 文档同步:customer-module 三件套 + crm-customer/CONTEXT.md + URL 对账(本报告同日完成) +- D-07 assignable 超时修复(P1,独立 effort,返工范围外) +- 导入 D-04/D-05(已知缺陷,票 09 audit 记档) diff --git a/.scratch/customer-rework/audit-findings.md b/.scratch/customer-rework/audit-findings.md index c6f63a1..38e78c5 100644 --- a/.scratch/customer-rework/audit-findings.md +++ b/.scratch/customer-rework/audit-findings.md @@ -66,3 +66,19 @@ - 机械修:S1(64022 改码)、F3(tag 补挂,确认后)、F10(oplog 参数或记账) - 需用户拍板(grill):F5(战略协议补 or 划出,唯一有完整原型三页的缺口)、F6(批量工商更新)、F7(内置视图过滤参数)、F8(导入重复策略) - 划出候选确认:F4(关联项目→A5 依赖)、F9(日志导出→导出家族) + +## 四、处置状态(票 09 收尾回填,2026-09-05) + +| 条目 | 处置 | 说明 | +|---|---|---| +| S1 | 已修 | 实改方向与上节建议**相反**(64022 已被 `CODE_SCHEME_TPL_FIELD_INVALID` 占用):`CODE_SCHEME_TPL_INVALID` 保 64018(64018-64022 归方案卡模板段),`CODE_STAGE_TPL_SEED_PROTECTED` 64018→64024 顺延补位;段位 javadoc + 引用处 + 测试同步 | +| F3 | 已修 | 六个 import 端点双 tag 增挂「客户公海」(a4-1-1 工具条实证导入入口,ADR-0024 多值) | +| F4 | 划出 | 随 A5 项目域:本工程无项目管理模块,端点与页签随项目模块建立时一并落(用户 2026-09-05 拍板) | +| F5 | 已单开票 12 | 战略协议单表 CRUD(原型三页完整);全栈实现+测试+bruno 移交 12 号票 | +| F6 | 已修 | `POST /api/customer/company-lookup/batch-update`(ids 查询参数表单绑定;逐个单查→guardCreditCodeForWrite→§C2 只补空缺不覆盖→SKIPPED/UPDATED/NO_HIT/CONFLICT/NOT_FOUND 软处置;单批上限 100);port 为 stub 恒 NO_HIT,真实企查查 Bean 接入自动激活;+4 集成用例 | +| F7 | 部分误报 + 已修 | 审计口径偏差:viewType 单参数已承载五内置视图(ASSIGNED/COLLABORATING/FOLLOW_UP_DUE/FOCUSED/RECENT,SQL 与测试俱全),无需新增过滤参数;真缺口=customer_view_log 生产侧零写入(RECENT 死视图,票 04 建壳挂账未兑现)→ detailHead 聚合时自动 upsert touchViewLog(实体 javadoc 明文设计意图),零新端点;+1 upsert 集成用例 | +| F8 | 已修 | import/upload 加 `duplicateStrategy` 参数(SKIP 缺省 / OVERWRITE;非法值 67013;D24 冻结语义:作用面仅文件内重复组,overwrite=组内自上而下最后一条通过校验的行 UPDATE 生效;不触名称相似 SUSPECT——D16 独立规则);task 实体加列 duplicate_strategy、analyzer 穿参、preview DTO、executor、+3 集成用例 | +| F9 | 划出 | 随 D2 导出家族:导出端点族整体未建,先行项不存在(用户 2026-09-05 拍板) | +| F10 | 已修(轻方案) | 客户 oplog 扩 CONTACT_ADD/EDIT/DELETE 三操作类型;联系人 create/update/delete 三处 oplogWriter.write(detail=「新增/修改/删除联系人【名】」);独立联系人日志表方案否决(用户拍板轻方案);+1 集成用例断言三行日志 | + +bruno 侧 F6/F8 新参数与 F7 行为的示例同步未在本票内做,随票 10 bruno 对账步统一核补(文档仓本机 `D:\code\crm-api-docs`)。 diff --git a/.scratch/customer-rework/bru-staging/客户公海/上传导入文件并预校验.bru b/.scratch/customer-rework/bru-staging/客户公海/上传导入文件并预校验.bru new file mode 100644 index 0000000..32a3401 --- /dev/null +++ b/.scratch/customer-rework/bru-staging/客户公海/上传导入文件并预校验.bru @@ -0,0 +1,65 @@ +meta { + name: 上传导入文件并预校验 + type: http + seq: 1 + tags: [ + generated + ] +} + +post { + url: {{baseUrl}}/api/customer/import/upload + body: multipartFormData + auth: inherit +} + +body:multipartFormData { + + file: @客户导入模板.xlsx + importMode: APPEND_ONLY + duplicateStrategy: SKIP +} + +docs { + # 上传导入文件并预校验 + `POST /api/customer/import/upload`(本行兼作对账钥匙,勿手改) + 文件守门(.xls/.xlsx、≤20MB、模板版本、单 sheet ≤5 万行)→ 行级判定(与执行同口径)→ 任务落待确认态(DRAFT),返回预计数 + 明细(上限 100 条)。已知缺陷 D-05(P1):is_biz_negotiated NOT NULL 无默认值且 createCustomer 未赋值——含 INSERT 行的导入必 FAILED(行不落库);D-04(P2):行异常文本超长致失败明细写不进 fail 表(0 行)。 + + ## 请求参数 + + | 参数 | 类型 | 必填 | 说明 | + | --- | --- | --- | --- | + | file | file | 是 | Excel 文件(.xlsx,multipart) | + | importMode | string | 是 | 导入方式:APPEND_ONLY 仅新增 / UPDATE_ONLY 仅更新 / UPSERT 有则更新 | + | duplicateStrategy | string | 否 | 重复策略:SKIP 不导入(默认)/ OVERWRITE 覆盖导入(返工票 09-F8) | + + ## 请求示例 + + 请求头:Authorization: Bearer {{token}} + Content-Type: multipart/form-data + + POST /api/customer/import/upload + file=@客户导入模板.xlsx + importMode=APPEND_ONLY + duplicateStrategy=SKIP + + ## 响应 data 结构 + + ImportPreviewDTO(taskId + duplicateStrategy + totalCount/insertCount/updateCount/failCount/suspectCount + 行级明细) + + ## 错误码 + + - 67013 导入预校验失败(文件/表头/行数/模板版本) + + ## 响应示例 + + // 示例数据(E2E 实测真值),字段结构以上表为准 + ```json + { + "code": 67013, + "success": false, + "message": "导入方式非法(仅新增/仅更新/新增或更新)", + "data": null + } + ``` +} diff --git a/.scratch/customer-rework/bru-staging/客户导入/上传导入文件并预校验.bru b/.scratch/customer-rework/bru-staging/客户导入/上传导入文件并预校验.bru new file mode 100644 index 0000000..32a3401 --- /dev/null +++ b/.scratch/customer-rework/bru-staging/客户导入/上传导入文件并预校验.bru @@ -0,0 +1,65 @@ +meta { + name: 上传导入文件并预校验 + type: http + seq: 1 + tags: [ + generated + ] +} + +post { + url: {{baseUrl}}/api/customer/import/upload + body: multipartFormData + auth: inherit +} + +body:multipartFormData { + + file: @客户导入模板.xlsx + importMode: APPEND_ONLY + duplicateStrategy: SKIP +} + +docs { + # 上传导入文件并预校验 + `POST /api/customer/import/upload`(本行兼作对账钥匙,勿手改) + 文件守门(.xls/.xlsx、≤20MB、模板版本、单 sheet ≤5 万行)→ 行级判定(与执行同口径)→ 任务落待确认态(DRAFT),返回预计数 + 明细(上限 100 条)。已知缺陷 D-05(P1):is_biz_negotiated NOT NULL 无默认值且 createCustomer 未赋值——含 INSERT 行的导入必 FAILED(行不落库);D-04(P2):行异常文本超长致失败明细写不进 fail 表(0 行)。 + + ## 请求参数 + + | 参数 | 类型 | 必填 | 说明 | + | --- | --- | --- | --- | + | file | file | 是 | Excel 文件(.xlsx,multipart) | + | importMode | string | 是 | 导入方式:APPEND_ONLY 仅新增 / UPDATE_ONLY 仅更新 / UPSERT 有则更新 | + | duplicateStrategy | string | 否 | 重复策略:SKIP 不导入(默认)/ OVERWRITE 覆盖导入(返工票 09-F8) | + + ## 请求示例 + + 请求头:Authorization: Bearer {{token}} + Content-Type: multipart/form-data + + POST /api/customer/import/upload + file=@客户导入模板.xlsx + importMode=APPEND_ONLY + duplicateStrategy=SKIP + + ## 响应 data 结构 + + ImportPreviewDTO(taskId + duplicateStrategy + totalCount/insertCount/updateCount/failCount/suspectCount + 行级明细) + + ## 错误码 + + - 67013 导入预校验失败(文件/表头/行数/模板版本) + + ## 响应示例 + + // 示例数据(E2E 实测真值),字段结构以上表为准 + ```json + { + "code": 67013, + "success": false, + "message": "导入方式非法(仅新增/仅更新/新增或更新)", + "data": null + } + ``` +} diff --git a/.scratch/customer-rework/bru-staging/我的客户/批量更新工商信息.bru b/.scratch/customer-rework/bru-staging/我的客户/批量更新工商信息.bru new file mode 100644 index 0000000..438fd9a --- /dev/null +++ b/.scratch/customer-rework/bru-staging/我的客户/批量更新工商信息.bru @@ -0,0 +1,71 @@ +meta { + name: 批量更新工商信息 + type: http + seq: 94 + tags: [ + generated + ] +} + +post { + url: {{baseUrl}}/api/customer/company-lookup/batch-update + body: formUrlEncoded + auth: inherit +} + +body:form-urlencoded { + + ids: 1,2 +} + +docs { + # 批量更新工商信息 + `POST /api/customer/company-lookup/batch-update`(本行兼作对账钥匙,勿手改) + a4-3-1 多选确认弹窗(你选择了N个客户,确认要批量查询并更新工商信息吗):逐客户按名称查工商源并回填空缺字段,行级部分成功返回每客户结果;单次上限 100;一期 stub 恒 NO_HIT。 + + ## 请求参数 + + | 参数 | 类型 | 必填 | 说明 | + | --- | --- | --- | --- | + | ids | string | 是 | 客户 id 列表(逗号分隔或多值同名参数,单次上限 100) | + + ## 请求示例 + + 请求头:Authorization: Bearer {{token}} + Content-Type: application/x-www-form-urlencoded + + POST /api/customer/company-lookup/batch-update + // 示例数据,非真实返回 + ids=1,2 + + ## 响应 data 结构 + + | 字段 | 类型 | 示例值 | + | --- | --- | --- | + | [] | array | 单客户结果条目,结构如下 | + | [].customerId | string | 1 | + | [].customerName | string | 示例客户 | + | [].status | string | NO_HIT(UPDATED 已回填 / SKIPPED 无空缺 / NO_HIT 未命中 / CONFLICT 信用代码冲突 / NOT_FOUND 客户不存在) | + | [].filledFields | number | 0 | + | [].message | string | 工商源未查询到匹配企业 | + + ## 响应示例 + + // 示例数据,字段结构以上表为准,非真实返回 + ```json + { + "code": 0, + "success": true, + "message": "success", + "data": [ + { + "customerId": "1", + "customerName": "示例客户", + "status": "NO_HIT", + "filledFields": 0, + "message": "工商源未查询到匹配企业" + } + ] + } + ``` +} diff --git a/.scratch/customer-rework/bru-staging/战略协议/删除战略协议.bru b/.scratch/customer-rework/bru-staging/战略协议/删除战略协议.bru new file mode 100644 index 0000000..139b233 --- /dev/null +++ b/.scratch/customer-rework/bru-staging/战略协议/删除战略协议.bru @@ -0,0 +1,61 @@ +meta { + name: 删除战略协议 + type: http + seq: 3 + tags: [ + generated + ] +} + +post { + url: {{baseUrl}}/api/customer/agreement/delete + body: formUrlEncoded + auth: inherit +} + +body:form-urlencoded { + + id: 1 +} + +docs { + # 删除战略协议 + `POST /api/customer/agreement/delete`(本行兼作对账钥匙,勿手改) + 软删;删空后客户战略协议等级快照回 NULL=未签。权限继承所属客户(无独立 ACL),无权 67017/67002。 + + ## 请求参数 + + | 参数 | 类型 | 必填 | 说明 | + | --- | --- | --- | --- | + | id | string | 是 | 协议 id | + + ## 请求示例 + + 请求头:Authorization: Bearer {{token}} + Content-Type: application/x-www-form-urlencoded + + POST /api/customer/agreement/delete + // 示例数据,非真实返回 + id=1 + + ## 响应 data 结构 + + null + + ## 错误码 + + - 67017 协议不存在 + - 67002 客户不存在或不可见 + + ## 响应示例 + + // 示例数据,字段结构以上文为准,非真实返回 + ```json + { + "code": 0, + "success": true, + "message": "success", + "data": null + } + ``` +} diff --git a/.scratch/customer-rework/bru-staging/战略协议/战略协议详情.bru b/.scratch/customer-rework/bru-staging/战略协议/战略协议详情.bru new file mode 100644 index 0000000..3cac01d --- /dev/null +++ b/.scratch/customer-rework/bru-staging/战略协议/战略协议详情.bru @@ -0,0 +1,78 @@ +meta { + name: 战略协议详情 + type: http + seq: 4 + tags: [ + generated + ] +} + +get { + url: {{baseUrl}}/api/customer/agreement/detail + body: none + auth: inherit +} + +params:query { + + id: 1 +} + +docs { + # 战略协议详情 + `GET /api/customer/agreement/detail`(本行兼作对账钥匙,勿手改) + 编辑回显(a4-4-10)。权限继承所属客户(无独立 ACL),无权 67017/67002。 + + ## 请求参数 + + | 参数 | 类型 | 必填 | 说明 | + | --- | --- | --- | --- | + | id | string | 是 | 协议 id | + + ## 请求示例 + + 请求头:Authorization: Bearer {{token}} + + GET /api/customer/agreement/detail?id=1 + + ## 响应 data 结构 + + | 字段 | 类型 | 示例值 | + | --- | --- | --- | + | id | string | 1 | + | createTime | string | 2024-01-01 12:00:00 | + | updateTime | string | 2024-01-01 12:00:00 | + | customerId | string | 750844477165273088 | + | agreementLevel | number | 2 | + | amount | string | 500万 | + | remark | string | 年度战略合作 | + | fileFileId | string | null | + | customerName | string | 示例客户 | + + ## 错误码 + + - 67017 协议不存在 + - 67002 客户不存在或不可见 + + ## 响应示例 + + // 示例数据,字段结构以上表为准,非真实返回 + ```json + { + "code": 0, + "success": true, + "message": "success", + "data": { + "id": "1", + "createTime": "2024-01-01 12:00:00", + "updateTime": "2024-01-01 12:00:00", + "customerId": "750844477165273088", + "agreementLevel": 2, + "amount": "500万", + "remark": "年度战略合作", + "fileFileId": null, + "customerName": "示例客户" + } + } + ``` +} diff --git a/.scratch/customer-rework/bru-staging/战略协议/战略协议页签列表.bru b/.scratch/customer-rework/bru-staging/战略协议/战略协议页签列表.bru new file mode 100644 index 0000000..75b0913 --- /dev/null +++ b/.scratch/customer-rework/bru-staging/战略协议/战略协议页签列表.bru @@ -0,0 +1,80 @@ +meta { + name: 战略协议页签列表 + type: http + seq: 5 + tags: [ + generated + ] +} + +get { + url: {{baseUrl}}/api/customer/agreement/list + body: none + auth: inherit +} + +params:query { + + customerId: 750844477165273088 +} + +docs { + # 战略协议页签列表 + `GET /api/customer/agreement/list`(本行兼作对账钥匙,勿手改) + 客户详情页签卡片(a4-4-6),时间倒序非分页;带出客户名。权限继承所属客户(无独立 ACL),无权 67002。 + + ## 请求参数 + + | 参数 | 类型 | 必填 | 说明 | + | --- | --- | --- | --- | + | customerId | string | 是 | 所属客户 id | + + ## 请求示例 + + 请求头:Authorization: Bearer {{token}} + + GET /api/customer/agreement/list?customerId=750844477165273088 + + ## 响应 data 结构 + + | 字段 | 类型 | 示例值 | + | --- | --- | --- | + | [] | array | 协议条目,结构如下 | + | [].id | string | 1 | + | [].createTime | string | 2024-01-01 12:00:00 | + | [].updateTime | string | 2024-01-01 12:00:00 | + | [].customerId | string | 750844477165273088 | + | [].agreementLevel | number | 2 | + | [].amount | string | 500万 | + | [].remark | string | 年度战略合作 | + | [].fileFileId | string | null | + | [].customerName | string | 示例客户 | + + ## 错误码 + + - 67002 客户不存在或不可见 + + ## 响应示例 + + // 示例数据,字段结构以上表为准,非真实返回 + ```json + { + "code": 0, + "success": true, + "message": "success", + "data": [ + { + "id": "1", + "createTime": "2024-01-01 12:00:00", + "updateTime": "2024-01-01 12:00:00", + "customerId": "750844477165273088", + "agreementLevel": 2, + "amount": "500万", + "remark": "年度战略合作", + "fileFileId": null, + "customerName": "示例客户" + } + ] + } + ``` +} diff --git a/.scratch/customer-rework/bru-staging/战略协议/新增战略协议.bru b/.scratch/customer-rework/bru-staging/战略协议/新增战略协议.bru new file mode 100644 index 0000000..f0f6ded --- /dev/null +++ b/.scratch/customer-rework/bru-staging/战略协议/新增战略协议.bru @@ -0,0 +1,69 @@ +meta { + name: 新增战略协议 + type: http + seq: 1 + tags: [ + generated + ] +} + +post { + url: {{baseUrl}}/api/customer/agreement/create + body: formUrlEncoded + auth: inherit +} + +body:form-urlencoded { + + customerId: 750844477165273088 + agreementLevel: 2 + amount: 500万 + remark: + fileFileId: +} + +docs { + # 新增战略协议 + `POST /api/customer/agreement/create`(本行兼作对账钥匙,勿手改) + 所属客户必填且对当前用户可见;等级 1~3 必填;写后刷新客户战略协议等级快照。权限继承所属客户(无独立 ACL),无权 67017/67002。 + + ## 请求参数 + + | 参数 | 类型 | 必填 | 说明 | + | --- | --- | --- | --- | + | customerId | string | 是 | 所属客户 id | + | agreementLevel | number | 是 | 战略协议等级 1~3:一级/二级/三级 | + | amount | string | 否 | 签订金额(文本:数字/区间/含单位) | + | remark | string | 否 | 备注 | + | fileFileId | string | 否 | 附件 fileId(crm-file 引用,单文件);下载由前端走 crm-file 通用端点 | + + ## 请求示例 + + 请求头:Authorization: Bearer {{token}} + Content-Type: application/x-www-form-urlencoded + + POST /api/customer/agreement/create + // 示例数据,非真实返回 + customerId=750844477165273088&agreementLevel=2&amount=500万 + + ## 响应 data 结构 + + 新协议 id(string) + + ## 错误码 + + - 67017 战略协议入参非法(等级须 1~3)/协议不存在 + - 67002 客户不存在或不可见 + + ## 响应示例 + + // 示例数据,字段结构以上文为准,非真实返回 + ```json + { + "code": 0, + "success": true, + "message": "success", + "data": "1" + } + ``` +} diff --git a/.scratch/customer-rework/bru-staging/战略协议/编辑战略协议.bru b/.scratch/customer-rework/bru-staging/战略协议/编辑战略协议.bru new file mode 100644 index 0000000..2faf9c2 --- /dev/null +++ b/.scratch/customer-rework/bru-staging/战略协议/编辑战略协议.bru @@ -0,0 +1,71 @@ +meta { + name: 编辑战略协议 + type: http + seq: 2 + tags: [ + generated + ] +} + +post { + url: {{baseUrl}}/api/customer/agreement/edit + body: formUrlEncoded + auth: inherit +} + +body:form-urlencoded { + + id: 1 + customerId: + agreementLevel: 3 + amount: 600万 + remark: + fileFileId: +} + +docs { + # 编辑战略协议 + `POST /api/customer/agreement/edit`(本行兼作对账钥匙,勿手改) + 归属客户不可换(customerId 以库内归属为准,传入忽略);等级 1~3;写后刷新客户快照。权限继承所属客户(无独立 ACL),无权 67017/67002。 + + ## 请求参数 + + | 参数 | 类型 | 必填 | 说明 | + | --- | --- | --- | --- | + | id | string | 是 | 协议 id | + | customerId | string | 否 | 归属客户不可换:以库内归属为准,传入忽略 | + | agreementLevel | number | 是 | 战略协议等级 1~3:一级/二级/三级 | + | amount | string | 否 | 签订金额(文本:数字/区间/含单位) | + | remark | string | 否 | 备注 | + | fileFileId | string | 否 | 附件 fileId(crm-file 引用,单文件) | + + ## 请求示例 + + 请求头:Authorization: Bearer {{token}} + Content-Type: application/x-www-form-urlencoded + + POST /api/customer/agreement/edit + // 示例数据,非真实返回 + id=1&agreementLevel=3&amount=600万 + + ## 响应 data 结构 + + null + + ## 错误码 + + - 67017 战略协议入参非法(等级须 1~3)/协议不存在 + - 67002 客户不存在或不可见 + + ## 响应示例 + + // 示例数据,字段结构以上文为准,非真实返回 + ```json + { + "code": 0, + "success": true, + "message": "success", + "data": null + } + ``` +} diff --git a/.scratch/customer-rework/bruno-recon-d.json b/.scratch/customer-rework/bruno-recon-d.json new file mode 100644 index 0000000..075fd88 --- /dev/null +++ b/.scratch/customer-rework/bruno-recon-d.json @@ -0,0 +1,4326 @@ +{ + "report": { + "source_api_count": 229, + "source_key_count": 321, + "generated_file_count": 321, + "private_file_count": 0, + "unrecognized_count": 0, + "key_conflicts": [], + "keep_count": 321, + "new_count": 0, + "delete_file_count": 0, + "delete_distinct_url_count": 0 + }, + "new": [], + "delete": [], + "docs": [ + { + "path": "A0 登录界面/注销.bru", + "key": "POST /api/auth/logout", + "generated": true, + "folder": "A0 登录界面" + }, + { + "path": "A0 登录界面/确认顶号登录.bru", + "key": "POST /api/auth/login/dingtalk/confirm", + "generated": true, + "folder": "A0 登录界面" + }, + { + "path": "A0 登录界面/获取当前用户信息.bru", + "key": "GET /api/auth/me", + "generated": true, + "folder": "A0 登录界面" + }, + { + "path": "A0 登录界面/菜单树.bru", + "key": "GET /api/system/menus/tree", + "generated": true, + "folder": "A0 登录界面" + }, + { + "path": "A0 登录界面/钉钉登录.bru", + "key": "POST /api/auth/login/dingtalk", + "generated": true, + "folder": "A0 登录界面" + }, + { + "path": "A2 线索管理/我的关注/保存列偏好.bru", + "key": "POST /api/preference/save", + "generated": true, + "folder": "我的关注" + }, + { + "path": "A2 线索管理/我的关注/历史记录.bru", + "key": "GET /api/lead/history", + "generated": true, + "folder": "我的关注" + }, + { + "path": "A2 线索管理/我的关注/取消关注.bru", + "key": "POST /api/lead/unfollow", + "generated": true, + "folder": "我的关注" + }, + { + "path": "A2 线索管理/我的关注/批量取关.bru", + "key": "POST /api/lead/unfollow-batch", + "generated": true, + "folder": "我的关注" + }, + { + "path": "A2 线索管理/我的关注/批量领取.bru", + "key": "POST /api/lead/claim-batch", + "generated": true, + "folder": "我的关注" + }, + { + "path": "A2 线索管理/我的关注/线索分页.bru", + "key": "POST /api/lead/page", + "generated": true, + "folder": "我的关注" + }, + { + "path": "A2 线索管理/我的关注/线索详情.bru", + "key": "GET /api/lead/detail", + "generated": true, + "folder": "我的关注" + }, + { + "path": "A2 线索管理/我的关注/视图统计卡片.bru", + "key": "POST /api/lead/stats", + "generated": true, + "folder": "我的关注" + }, + { + "path": "A2 线索管理/我的关注/读取列偏好.bru", + "key": "GET /api/preference/get", + "generated": true, + "folder": "我的关注" + }, + { + "path": "A2 线索管理/我的关注/领取线索.bru", + "key": "POST /api/lead/claim", + "generated": true, + "folder": "我的关注" + }, + { + "path": "A2 线索管理/我的线索/保存列偏好.bru", + "key": "POST /api/preference/save", + "generated": true, + "folder": "我的线索" + }, + { + "path": "A2 线索管理/我的线索/保存反馈草稿.bru", + "key": "POST /api/lead/feedback-draft", + "generated": true, + "folder": "我的线索" + }, + { + "path": "A2 线索管理/我的线索/删除线索.bru", + "key": "POST /api/lead/delete", + "generated": true, + "folder": "我的线索" + }, + { + "path": "A2 线索管理/我的线索/历史记录.bru", + "key": "GET /api/lead/history", + "generated": true, + "folder": "我的线索" + }, + { + "path": "A2 线索管理/我的线索/批量释放.bru", + "key": "POST /api/lead/release-batch", + "generated": true, + "folder": "我的线索" + }, + { + "path": "A2 线索管理/我的线索/提交反馈.bru", + "key": "POST /api/lead/feedback-submit", + "generated": true, + "folder": "我的线索" + }, + { + "path": "A2 线索管理/我的线索/新建线索.bru", + "key": "POST /api/lead/create", + "generated": true, + "folder": "我的线索" + }, + { + "path": "A2 线索管理/我的线索/线索分页.bru", + "key": "POST /api/lead/page", + "generated": true, + "folder": "我的线索" + }, + { + "path": "A2 线索管理/我的线索/线索详情.bru", + "key": "GET /api/lead/detail", + "generated": true, + "folder": "我的线索" + }, + { + "path": "A2 线索管理/我的线索/编辑线索.bru", + "key": "POST /api/lead/edit", + "generated": true, + "folder": "我的线索" + }, + { + "path": "A2 线索管理/我的线索/视图统计卡片.bru", + "key": "POST /api/lead/stats", + "generated": true, + "folder": "我的线索" + }, + { + "path": "A2 线索管理/我的线索/读取列偏好.bru", + "key": "GET /api/preference/get", + "generated": true, + "folder": "我的线索" + }, + { + "path": "A2 线索管理/我的线索/转商机.bru", + "key": "POST /api/lead/convert", + "generated": true, + "folder": "我的线索" + }, + { + "path": "A2 线索管理/我的线索/释放线索.bru", + "key": "POST /api/lead/release", + "generated": true, + "folder": "我的线索" + }, + { + "path": "A2 线索管理/线索公海/保存列偏好.bru", + "key": "POST /api/preference/save", + "generated": true, + "folder": "线索公海" + }, + { + "path": "A2 线索管理/线索公海/关注线索.bru", + "key": "POST /api/lead/follow", + "generated": true, + "folder": "线索公海" + }, + { + "path": "A2 线索管理/线索公海/历史记录.bru", + "key": "GET /api/lead/history", + "generated": true, + "folder": "线索公海" + }, + { + "path": "A2 线索管理/线索公海/取消关注.bru", + "key": "POST /api/lead/unfollow", + "generated": true, + "folder": "线索公海" + }, + { + "path": "A2 线索管理/线索公海/批量关注.bru", + "key": "POST /api/lead/follow-batch", + "generated": true, + "folder": "线索公海" + }, + { + "path": "A2 线索管理/线索公海/批量领取.bru", + "key": "POST /api/lead/claim-batch", + "generated": true, + "folder": "线索公海" + }, + { + "path": "A2 线索管理/线索公海/线索分页.bru", + "key": "POST /api/lead/page", + "generated": true, + "folder": "线索公海" + }, + { + "path": "A2 线索管理/线索公海/线索详情.bru", + "key": "GET /api/lead/detail", + "generated": true, + "folder": "线索公海" + }, + { + "path": "A2 线索管理/线索公海/视图统计卡片.bru", + "key": "POST /api/lead/stats", + "generated": true, + "folder": "线索公海" + }, + { + "path": "A2 线索管理/线索公海/读取列偏好.bru", + "key": "GET /api/preference/get", + "generated": true, + "folder": "线索公海" + }, + { + "path": "A2 线索管理/线索公海/释放线索.bru", + "key": "POST /api/lead/release", + "generated": true, + "folder": "线索公海" + }, + { + "path": "A2 线索管理/线索公海/领取线索.bru", + "key": "POST /api/lead/claim", + "generated": true, + "folder": "线索公海" + }, + { + "path": "A2 线索管理/线索管理/保存列偏好.bru", + "key": "POST /api/preference/save", + "generated": true, + "folder": "线索管理" + }, + { + "path": "A2 线索管理/线索管理/分配线索到池.bru", + "key": "POST /api/lead/assign-pool", + "generated": true, + "folder": "线索管理" + }, + { + "path": "A2 线索管理/线索管理/分配线索到销售.bru", + "key": "POST /api/lead/assign-user", + "generated": true, + "folder": "线索管理" + }, + { + "path": "A2 线索管理/线索管理/删除线索.bru", + "key": "POST /api/lead/delete", + "generated": true, + "folder": "线索管理" + }, + { + "path": "A2 线索管理/线索管理/历史记录.bru", + "key": "GET /api/lead/history", + "generated": true, + "folder": "线索管理" + }, + { + "path": "A2 线索管理/线索管理/批量分配到池.bru", + "key": "POST /api/lead/assign-pool-batch", + "generated": true, + "folder": "线索管理" + }, + { + "path": "A2 线索管理/线索管理/批量分配到销售.bru", + "key": "POST /api/lead/assign-user-batch", + "generated": true, + "folder": "线索管理" + }, + { + "path": "A2 线索管理/线索管理/批量删除.bru", + "key": "POST /api/lead/delete-batch", + "generated": true, + "folder": "线索管理" + }, + { + "path": "A2 线索管理/线索管理/批量激活.bru", + "key": "POST /api/lead/activate-batch", + "generated": true, + "folder": "线索管理" + }, + { + "path": "A2 线索管理/线索管理/新建线索.bru", + "key": "POST /api/lead/create", + "generated": true, + "folder": "线索管理" + }, + { + "path": "A2 线索管理/线索管理/激活线索.bru", + "key": "POST /api/lead/activate", + "generated": true, + "folder": "线索管理" + }, + { + "path": "A2 线索管理/线索管理/线索分页.bru", + "key": "POST /api/lead/page", + "generated": true, + "folder": "线索管理" + }, + { + "path": "A2 线索管理/线索管理/线索详情.bru", + "key": "GET /api/lead/detail", + "generated": true, + "folder": "线索管理" + }, + { + "path": "A2 线索管理/线索管理/视图统计卡片.bru", + "key": "POST /api/lead/stats", + "generated": true, + "folder": "线索管理" + }, + { + "path": "A2 线索管理/线索管理/读取列偏好.bru", + "key": "GET /api/preference/get", + "generated": true, + "folder": "线索管理" + }, + { + "path": "A2 线索管理/线索设置/公海池分页列表.bru", + "key": "POST /api/rule/pool/page", + "generated": true, + "folder": "线索设置" + }, + { + "path": "A2 线索管理/线索设置/公海池详情.bru", + "key": "GET /api/rule/pool/detail", + "generated": true, + "folder": "线索设置" + }, + { + "path": "A2 线索管理/线索设置/删除公海池.bru", + "key": "POST /api/rule/pool/delete", + "generated": true, + "folder": "线索设置" + }, + { + "path": "A2 线索管理/线索设置/批量删除公海池.bru", + "key": "POST /api/rule/pool/delete-batch", + "generated": true, + "folder": "线索设置" + }, + { + "path": "A2 线索管理/线索设置/新建编辑公海池.bru", + "key": "POST /api/rule/pool/saveOrUpdate", + "generated": true, + "folder": "线索设置" + }, + { + "path": "A3 商机管理/商机公海/保存列偏好.bru", + "key": "POST /api/preference/save", + "generated": true, + "folder": "商机公海" + }, + { + "path": "A3 商机管理/商机公海/保存视图形态.bru", + "key": "POST /api/preference/view-form/save", + "generated": true, + "folder": "商机公海" + }, + { + "path": "A3 商机管理/商机公海/商机分页.bru", + "key": "POST /api/opportunity/page", + "generated": true, + "folder": "商机公海" + }, + { + "path": "A3 商机管理/商机公海/读取列偏好.bru", + "key": "GET /api/preference/get", + "generated": true, + "folder": "商机公海" + }, + { + "path": "A3 商机管理/商机公海/读取视图形态.bru", + "key": "GET /api/preference/view-form/get", + "generated": true, + "folder": "商机公海" + }, + { + "path": "A3 商机管理/商机公海/看板列表/看板阶段卡片.bru", + "key": "POST /api/opportunity/board/cards", + "generated": true, + "folder": "看板列表" + }, + { + "path": "A3 商机管理/商机公海/看板列表/看板阶段汇总.bru", + "key": "POST /api/opportunity/board/stage-summary", + "generated": true, + "folder": "看板列表" + }, + { + "path": "A3 商机管理/商机管理/保存列偏好.bru", + "key": "POST /api/preference/save", + "generated": true, + "folder": "商机管理" + }, + { + "path": "A3 商机管理/商机管理/保存视图形态.bru", + "key": "POST /api/preference/view-form/save", + "generated": true, + "folder": "商机管理" + }, + { + "path": "A3 商机管理/商机管理/商机分页.bru", + "key": "POST /api/opportunity/page", + "generated": true, + "folder": "商机管理" + }, + { + "path": "A3 商机管理/商机管理/读取列偏好.bru", + "key": "GET /api/preference/get", + "generated": true, + "folder": "商机管理" + }, + { + "path": "A3 商机管理/商机管理/读取视图形态.bru", + "key": "GET /api/preference/view-form/get", + "generated": true, + "folder": "商机管理" + }, + { + "path": "A3 商机管理/商机管理/看板列表/看板阶段卡片.bru", + "key": "POST /api/opportunity/board/cards", + "generated": true, + "folder": "看板列表" + }, + { + "path": "A3 商机管理/商机管理/看板列表/看板阶段汇总.bru", + "key": "POST /api/opportunity/board/stage-summary", + "generated": true, + "folder": "看板列表" + }, + { + "path": "A3 商机管理/商机详情/主体/上报访问.bru", + "key": "POST /api/opportunity/view-touch", + "generated": true, + "folder": "主体" + }, + { + "path": "A3 商机管理/商机详情/主体/关注商机.bru", + "key": "POST /api/opportunity/focus", + "generated": true, + "folder": "主体" + }, + { + "path": "A3 商机管理/商机详情/主体/切换阶段.bru", + "key": "POST /api/opportunity/stage/switch", + "generated": true, + "folder": "主体" + }, + { + "path": "A3 商机管理/商机详情/主体/取关商机.bru", + "key": "POST /api/opportunity/unfocus", + "generated": true, + "folder": "主体" + }, + { + "path": "A3 商机管理/商机详情/主体/商机详情.bru", + "key": "GET /api/opportunity/detail", + "generated": true, + "folder": "主体" + }, + { + "path": "A3 商机管理/商机详情/主体/批量关注.bru", + "key": "POST /api/opportunity/focus-batch", + "generated": true, + "folder": "主体" + }, + { + "path": "A3 商机管理/商机详情/主体/编辑商机.bru", + "key": "POST /api/opportunity/edit", + "generated": true, + "folder": "主体" + }, + { + "path": "A3 商机管理/商机详情/主体/阶段推进历史.bru", + "key": "GET /api/opportunity/stage/history", + "generated": true, + "folder": "主体" + }, + { + "path": "A3 商机管理/商机详情/主体/阶段推进指引.bru", + "key": "GET /api/opportunity/stage/progress", + "generated": true, + "folder": "主体" + }, + { + "path": "A3 商机管理/商机详情/勘察/删除勘察.bru", + "key": "POST /api/opportunity/site-survey/delete", + "generated": true, + "folder": "勘察" + }, + { + "path": "A3 商机管理/商机详情/勘察/勘察分页.bru", + "key": "POST /api/opportunity/site-survey/page", + "generated": true, + "folder": "勘察" + }, + { + "path": "A3 商机管理/商机详情/勘察/新增勘察.bru", + "key": "POST /api/opportunity/site-survey/add", + "generated": true, + "folder": "勘察" + }, + { + "path": "A3 商机管理/商机详情/团队/团队成员列表.bru", + "key": "GET /api/opportunity/team/list", + "generated": true, + "folder": "团队" + }, + { + "path": "A3 商机管理/商机详情/团队/批量添加团队成员.bru", + "key": "POST /api/opportunity/team/add", + "generated": true, + "folder": "团队" + }, + { + "path": "A3 商机管理/商机详情/团队/移除团队成员.bru", + "key": "POST /api/opportunity/team/delete", + "generated": true, + "folder": "团队" + }, + { + "path": "A3 商机管理/商机详情/团队/编辑团队成员.bru", + "key": "POST /api/opportunity/team/update", + "generated": true, + "folder": "团队" + }, + { + "path": "A3 商机管理/商机详情/客户/候选客户搜索.bru", + "key": "POST /api/opportunity/customer/search", + "generated": true, + "folder": "客户" + }, + { + "path": "A3 商机管理/商机详情/客户/客户列表.bru", + "key": "GET /api/opportunity/customer/list", + "generated": true, + "folder": "客户" + }, + { + "path": "A3 商机管理/商机详情/客户/按客户查联系人.bru", + "key": "GET /api/opportunity/customer/contacts", + "generated": true, + "folder": "客户" + }, + { + "path": "A3 商机管理/商机详情/客户/添加关联客户.bru", + "key": "POST /api/opportunity/customer/add", + "generated": true, + "folder": "客户" + }, + { + "path": "A3 商机管理/商机详情/客户/设为主要意向客户.bru", + "key": "POST /api/opportunity/customer/set-primary", + "generated": true, + "folder": "客户" + }, + { + "path": "A3 商机管理/商机详情/工作计划/删除工作计划.bru", + "key": "POST /api/opportunity/workplan/delete", + "generated": true, + "folder": "工作计划" + }, + { + "path": "A3 商机管理/商机详情/工作计划/工作计划列表.bru", + "key": "GET /api/opportunity/workplan/list", + "generated": true, + "folder": "工作计划" + }, + { + "path": "A3 商机管理/商机详情/工作计划/新增工作计划.bru", + "key": "POST /api/opportunity/workplan/add", + "generated": true, + "folder": "工作计划" + }, + { + "path": "A3 商机管理/商机详情/工作计划/编辑工作计划.bru", + "key": "POST /api/opportunity/workplan/update", + "generated": true, + "folder": "工作计划" + }, + { + "path": "A3 商机管理/商机详情/方案卡/保存方案卡.bru", + "key": "POST /api/opportunity/scheme-card/save", + "generated": true, + "folder": "方案卡" + }, + { + "path": "A3 商机管理/商机详情/方案卡/可选模板版本.bru", + "key": "GET /api/opportunity/scheme-card/selectable-templates", + "generated": true, + "folder": "方案卡" + }, + { + "path": "A3 商机管理/商机详情/方案卡/提交方案卡.bru", + "key": "POST /api/opportunity/scheme-card/submit", + "generated": true, + "folder": "方案卡" + }, + { + "path": "A3 商机管理/商机详情/方案卡/方案卡列表.bru", + "key": "GET /api/opportunity/scheme-card/list", + "generated": true, + "folder": "方案卡" + }, + { + "path": "A3 商机管理/商机详情/方案卡/方案卡详情.bru", + "key": "GET /api/opportunity/scheme-card/detail", + "generated": true, + "folder": "方案卡" + }, + { + "path": "A3 商机管理/商机详情/日志/操作日志分页.bru", + "key": "POST /api/opportunity/oplog/page", + "generated": true, + "folder": "日志" + }, + { + "path": "A3 商机管理/商机详情/跟进/删除跟进.bru", + "key": "POST /api/opportunity/follow/delete", + "generated": true, + "folder": "跟进" + }, + { + "path": "A3 商机管理/商机详情/跟进/新增跟进.bru", + "key": "POST /api/opportunity/follow/add", + "generated": true, + "folder": "跟进" + }, + { + "path": "A3 商机管理/商机详情/跟进/跟进分页.bru", + "key": "POST /api/opportunity/follow/page", + "generated": true, + "folder": "跟进" + }, + { + "path": "A3 商机管理/商机详情/附件/删除附件.bru", + "key": "POST /api/opportunity/attachment/delete", + "generated": true, + "folder": "附件" + }, + { + "path": "A3 商机管理/商机详情/附件/新增附件.bru", + "key": "POST /api/opportunity/attachment/add", + "generated": true, + "folder": "附件" + }, + { + "path": "A3 商机管理/商机详情/附件/附件列表.bru", + "key": "GET /api/opportunity/attachment/list", + "generated": true, + "folder": "附件" + }, + { + "path": "A3 商机管理/新建商机/可关联线索下拉.bru", + "key": "GET /api/opportunity/convertible-leads", + "generated": true, + "folder": "新建商机" + }, + { + "path": "A3 商机管理/新建商机/新建商机.bru", + "key": "POST /api/opportunity", + "generated": true, + "folder": "新建商机" + }, + { + "path": "A3 商机管理/状态流转/关闭商机.bru", + "key": "POST /api/opportunity/close", + "generated": true, + "folder": "状态流转" + }, + { + "path": "A3 商机管理/状态流转/分配商机.bru", + "key": "POST /api/opportunity/assign", + "generated": true, + "folder": "状态流转" + }, + { + "path": "A3 商机管理/状态流转/取消暂缓.bru", + "key": "POST /api/opportunity/resume", + "generated": true, + "folder": "状态流转" + }, + { + "path": "A3 商机管理/状态流转/批量关闭.bru", + "key": "POST /api/opportunity/close-batch", + "generated": true, + "folder": "状态流转" + }, + { + "path": "A3 商机管理/状态流转/批量分配.bru", + "key": "POST /api/opportunity/assign-batch", + "generated": true, + "folder": "状态流转" + }, + { + "path": "A3 商机管理/状态流转/批量领取.bru", + "key": "POST /api/opportunity/claim-batch", + "generated": true, + "folder": "状态流转" + }, + { + "path": "A3 商机管理/状态流转/抛公海.bru", + "key": "POST /api/opportunity/release-pool", + "generated": true, + "folder": "状态流转" + }, + { + "path": "A3 商机管理/状态流转/暂缓.bru", + "key": "POST /api/opportunity/pause", + "generated": true, + "folder": "状态流转" + }, + { + "path": "A3 商机管理/状态流转/移交商机.bru", + "key": "POST /api/opportunity/handover", + "generated": true, + "folder": "状态流转" + }, + { + "path": "A3 商机管理/状态流转/重启商机.bru", + "key": "POST /api/opportunity/reopen", + "generated": true, + "folder": "状态流转" + }, + { + "path": "A3 商机管理/状态流转/领取商机.bru", + "key": "POST /api/opportunity/claim", + "generated": true, + "folder": "状态流转" + }, + { + "path": "A3 商机管理/销售机会/保存列偏好.bru", + "key": "POST /api/preference/save", + "generated": true, + "folder": "销售机会" + }, + { + "path": "A3 商机管理/销售机会/保存视图形态.bru", + "key": "POST /api/preference/view-form/save", + "generated": true, + "folder": "销售机会" + }, + { + "path": "A3 商机管理/销售机会/商机侧客户搜索.bru", + "key": "POST /api/customer/search", + "generated": true, + "folder": "销售机会" + }, + { + "path": "A3 商机管理/销售机会/商机分页.bru", + "key": "POST /api/opportunity/page", + "generated": true, + "folder": "销售机会" + }, + { + "path": "A3 商机管理/销售机会/按客户查联系人列表.bru", + "key": "GET /api/customer/contacts", + "generated": true, + "folder": "销售机会" + }, + { + "path": "A3 商机管理/销售机会/读取列偏好.bru", + "key": "GET /api/preference/get", + "generated": true, + "folder": "销售机会" + }, + { + "path": "A3 商机管理/销售机会/读取视图形态.bru", + "key": "GET /api/preference/view-form/get", + "generated": true, + "folder": "销售机会" + }, + { + "path": "A3 商机管理/销售机会/看板列表/看板阶段卡片.bru", + "key": "POST /api/opportunity/board/cards", + "generated": true, + "folder": "看板列表" + }, + { + "path": "A3 商机管理/销售机会/看板列表/看板阶段汇总.bru", + "key": "POST /api/opportunity/board/stage-summary", + "generated": true, + "folder": "看板列表" + }, + { + "path": "A3 商机管理/销售机会/自定义视图/保存自定义视图.bru", + "key": "POST /api/preference/view/save", + "generated": true, + "folder": "自定义视图" + }, + { + "path": "A3 商机管理/销售机会/自定义视图/删除自定义视图.bru", + "key": "POST /api/preference/view/delete", + "generated": true, + "folder": "自定义视图" + }, + { + "path": "A3 商机管理/销售机会/自定义视图/自定义视图列表.bru", + "key": "GET /api/preference/view/list", + "generated": true, + "folder": "自定义视图" + }, + { + "path": "A3 商机管理/销售机会/自定义视图/设为默认视图.bru", + "key": "POST /api/preference/view/set-default", + "generated": true, + "folder": "自定义视图" + }, + { + "path": "A4 客户管理/客户交割/交接记录分页.bru", + "key": "GET /api/customer/transfer/page", + "generated": true, + "folder": "客户交割" + }, + { + "path": "A4 客户管理/客户交割/交接详情.bru", + "key": "GET /api/customer/transfer/detail", + "generated": true, + "folder": "客户交割" + }, + { + "path": "A4 客户管理/客户交割/发起交接.bru", + "key": "POST /api/customer/transfer/initiate", + "generated": true, + "folder": "客户交割" + }, + { + "path": "A4 客户管理/客户交割/发起前客户预览.bru", + "key": "GET /api/customer/transfer/preview", + "generated": true, + "folder": "客户交割" + }, + { + "path": "A4 客户管理/客户交割/可分配销售列表.bru", + "key": "GET /api/customer/transfer/assignable", + "generated": true, + "folder": "客户交割" + }, + { + "path": "A4 客户管理/客户交割/客户分配.bru", + "key": "POST /api/customer/transfer/assign", + "generated": true, + "folder": "客户交割" + }, + { + "path": "A4 客户管理/客户公海/workspace 列表分页.bru", + "key": "POST /api/customer/workspace/page", + "generated": true, + "folder": "客户公海" + }, + { + "path": "A4 客户管理/客户公海/上传导入文件并预校验.bru", + "key": "POST /api/customer/import/upload", + "generated": true, + "folder": "客户公海" + }, + { + "path": "A4 客户管理/客户公海/下载导入模板.bru", + "key": "GET /api/customer/import/template", + "generated": true, + "folder": "客户公海" + }, + { + "path": "A4 客户管理/客户公海/任务结果.bru", + "key": "GET /api/customer/import/result", + "generated": true, + "folder": "客户公海" + }, + { + "path": "A4 客户管理/客户公海/保存列偏好.bru", + "key": "POST /api/preference/save", + "generated": true, + "folder": "客户公海" + }, + { + "path": "A4 客户管理/客户公海/保存视图形态.bru", + "key": "POST /api/preference/view-form/save", + "generated": true, + "folder": "客户公海" + }, + { + "path": "A4 客户管理/客户公海/关注客户.bru", + "key": "POST /api/customer/focus", + "generated": true, + "folder": "客户公海" + }, + { + "path": "A4 客户管理/客户公海/分配客户.bru", + "key": "POST /api/customer/assign", + "generated": true, + "folder": "客户公海" + }, + { + "path": "A4 客户管理/客户公海/取消关注客户.bru", + "key": "POST /api/customer/unfocus", + "generated": true, + "folder": "客户公海" + }, + { + "path": "A4 客户管理/客户公海/失败疑似重复明细.bru", + "key": "GET /api/customer/import/failures", + "generated": true, + "folder": "客户公海" + }, + { + "path": "A4 客户管理/客户公海/客户分页.bru", + "key": "POST /api/customer/page", + "generated": true, + "folder": "客户公海" + }, + { + "path": "A4 客户管理/客户公海/归档客户.bru", + "key": "POST /api/customer/archive", + "generated": true, + "folder": "客户公海" + }, + { + "path": "A4 客户管理/客户公海/恢复客户.bru", + "key": "POST /api/customer/restore", + "generated": true, + "folder": "客户公海" + }, + { + "path": "A4 客户管理/客户公海/批量关注客户.bru", + "key": "POST /api/customer/focus-batch", + "generated": true, + "folder": "客户公海" + }, + { + "path": "A4 客户管理/客户公海/批量分配.bru", + "key": "POST /api/customer/assign-batch", + "generated": true, + "folder": "客户公海" + }, + { + "path": "A4 客户管理/客户公海/批量归档.bru", + "key": "POST /api/customer/archive-batch", + "generated": true, + "folder": "客户公海" + }, + { + "path": "A4 客户管理/客户公海/批量抛公海.bru", + "key": "POST /api/customer/release-pool-batch", + "generated": true, + "folder": "客户公海" + }, + { + "path": "A4 客户管理/客户公海/批量领取.bru", + "key": "POST /api/customer/claim-batch", + "generated": true, + "folder": "客户公海" + }, + { + "path": "A4 客户管理/客户公海/抛公海.bru", + "key": "POST /api/customer/release-pool", + "generated": true, + "folder": "客户公海" + }, + { + "path": "A4 客户管理/客户公海/最近导入记录.bru", + "key": "GET /api/customer/import/page", + "generated": true, + "folder": "客户公海" + }, + { + "path": "A4 客户管理/客户公海/确认执行导入.bru", + "key": "POST /api/customer/import/confirm", + "generated": true, + "folder": "客户公海" + }, + { + "path": "A4 客户管理/客户公海/读取列偏好.bru", + "key": "GET /api/preference/get", + "generated": true, + "folder": "客户公海" + }, + { + "path": "A4 客户管理/客户公海/读取视图形态.bru", + "key": "GET /api/preference/view-form/get", + "generated": true, + "folder": "客户公海" + }, + { + "path": "A4 客户管理/客户公海/领取客户.bru", + "key": "POST /api/customer/claim", + "generated": true, + "folder": "客户公海" + }, + { + "path": "A4 客户管理/客户总览/workspace 列表分页.bru", + "key": "POST /api/customer/workspace/page", + "generated": true, + "folder": "客户总览" + }, + { + "path": "A4 客户管理/客户总览/保存列偏好.bru", + "key": "POST /api/preference/save", + "generated": true, + "folder": "客户总览" + }, + { + "path": "A4 客户管理/客户总览/保存视图形态.bru", + "key": "POST /api/preference/view-form/save", + "generated": true, + "folder": "客户总览" + }, + { + "path": "A4 客户管理/客户总览/分配客户.bru", + "key": "POST /api/customer/assign", + "generated": true, + "folder": "客户总览" + }, + { + "path": "A4 客户管理/客户总览/客户分页.bru", + "key": "POST /api/customer/page", + "generated": true, + "folder": "客户总览" + }, + { + "path": "A4 客户管理/客户总览/归档客户.bru", + "key": "POST /api/customer/archive", + "generated": true, + "folder": "客户总览" + }, + { + "path": "A4 客户管理/客户总览/恢复客户.bru", + "key": "POST /api/customer/restore", + "generated": true, + "folder": "客户总览" + }, + { + "path": "A4 客户管理/客户总览/批量分配.bru", + "key": "POST /api/customer/assign-batch", + "generated": true, + "folder": "客户总览" + }, + { + "path": "A4 客户管理/客户总览/批量归档.bru", + "key": "POST /api/customer/archive-batch", + "generated": true, + "folder": "客户总览" + }, + { + "path": "A4 客户管理/客户总览/批量抛公海.bru", + "key": "POST /api/customer/release-pool-batch", + "generated": true, + "folder": "客户总览" + }, + { + "path": "A4 客户管理/客户总览/批量领取.bru", + "key": "POST /api/customer/claim-batch", + "generated": true, + "folder": "客户总览" + }, + { + "path": "A4 客户管理/客户总览/抛公海.bru", + "key": "POST /api/customer/release-pool", + "generated": true, + "folder": "客户总览" + }, + { + "path": "A4 客户管理/客户总览/读取列偏好.bru", + "key": "GET /api/preference/get", + "generated": true, + "folder": "客户总览" + }, + { + "path": "A4 客户管理/客户总览/读取视图形态.bru", + "key": "GET /api/preference/view-form/get", + "generated": true, + "folder": "客户总览" + }, + { + "path": "A4 客户管理/客户总览/领取客户.bru", + "key": "POST /api/customer/claim", + "generated": true, + "folder": "客户总览" + }, + { + "path": "A4 客户管理/客户总览/看板列表/看板分组汇总.bru", + "key": "POST /api/customer/workspace/board/summary", + "generated": true, + "folder": "看板列表" + }, + { + "path": "A4 客户管理/客户总览/看板列表/看板单列卡片.bru", + "key": "POST /api/customer/workspace/board/cards", + "generated": true, + "folder": "看板列表" + }, + { + "path": "A4 客户管理/客户查重/信用代码查重.bru", + "key": "GET /api/customer/check-credit-code", + "generated": true, + "folder": "客户查重" + }, + { + "path": "A4 客户管理/客户查重/名称相似提示.bru", + "key": "GET /api/customer/check-name", + "generated": true, + "folder": "客户查重" + }, + { + "path": "A4 客户管理/客户详情/取消重点标记.bru", + "key": "POST /api/customer/unstar", + "generated": true, + "folder": "客户详情" + }, + { + "path": "A4 客户管理/客户详情/客户详情.bru", + "key": "GET /api/customer/detail", + "generated": true, + "folder": "客户详情" + }, + { + "path": "A4 客户管理/客户详情/标记重点客户.bru", + "key": "POST /api/customer/star", + "generated": true, + "folder": "客户详情" + }, + { + "path": "A4 客户管理/客户详情/编辑客户.bru", + "key": "POST /api/customer/edit", + "generated": true, + "folder": "客户详情" + }, + { + "path": "A4 客户管理/客户详情/详情公共头部.bru", + "key": "GET /api/customer/detail-head", + "generated": true, + "folder": "客户详情" + }, + { + "path": "A4 客户管理/客户详情/关联商机/关联商机页签.bru", + "key": "GET /api/customer/opportunity/page", + "generated": true, + "folder": "关联商机" + }, + { + "path": "A4 客户管理/客户详情/团队成员/团队成员页签.bru", + "key": "GET /api/customer/member/list", + "generated": true, + "folder": "团队成员" + }, + { + "path": "A4 客户管理/客户详情/团队成员/添加团队成员.bru", + "key": "POST /api/customer/member/add", + "generated": true, + "folder": "团队成员" + }, + { + "path": "A4 客户管理/客户详情/团队成员/移除团队成员.bru", + "key": "POST /api/customer/member/remove", + "generated": true, + "folder": "团队成员" + }, + { + "path": "A4 客户管理/客户详情/操作日志/操作日志分页.bru", + "key": "GET /api/customer/oplog/page", + "generated": true, + "folder": "操作日志" + }, + { + "path": "A4 客户管理/客户详情/跟进记录/新增跟进.bru", + "key": "POST /api/customer/follow/add", + "generated": true, + "folder": "跟进记录" + }, + { + "path": "A4 客户管理/客户详情/跟进记录/跟进记录分页.bru", + "key": "GET /api/customer/follow/page", + "generated": true, + "folder": "跟进记录" + }, + { + "path": "A4 客户管理/我的客户/workspace 列表分页.bru", + "key": "POST /api/customer/workspace/page", + "generated": true, + "folder": "我的客户" + }, + { + "path": "A4 客户管理/我的客户/保存列偏好.bru", + "key": "POST /api/preference/save", + "generated": true, + "folder": "我的客户" + }, + { + "path": "A4 客户管理/我的客户/保存视图形态.bru", + "key": "POST /api/preference/view-form/save", + "generated": true, + "folder": "我的客户" + }, + { + "path": "A4 客户管理/我的客户/分配客户.bru", + "key": "POST /api/customer/assign", + "generated": true, + "folder": "我的客户" + }, + { + "path": "A4 客户管理/我的客户/客户分页.bru", + "key": "POST /api/customer/page", + "generated": true, + "folder": "我的客户" + }, + { + "path": "A4 客户管理/我的客户/工商信息查询.bru", + "key": "GET /api/customer/company-lookup", + "generated": true, + "folder": "我的客户" + }, + { + "path": "A4 客户管理/我的客户/归档客户.bru", + "key": "POST /api/customer/archive", + "generated": true, + "folder": "我的客户" + }, + { + "path": "A4 客户管理/我的客户/快速创建客户.bru", + "key": "POST /api/customer/quick-create", + "generated": true, + "folder": "我的客户" + }, + { + "path": "A4 客户管理/我的客户/恢复客户.bru", + "key": "POST /api/customer/restore", + "generated": true, + "folder": "我的客户" + }, + { + "path": "A4 客户管理/我的客户/批量分配.bru", + "key": "POST /api/customer/assign-batch", + "generated": true, + "folder": "我的客户" + }, + { + "path": "A4 客户管理/我的客户/批量归档.bru", + "key": "POST /api/customer/archive-batch", + "generated": true, + "folder": "我的客户" + }, + { + "path": "A4 客户管理/我的客户/批量抛公海.bru", + "key": "POST /api/customer/release-pool-batch", + "generated": true, + "folder": "我的客户" + }, + { + "path": "A4 客户管理/我的客户/批量更新工商信息.bru", + "key": "POST /api/customer/company-lookup/batch-update", + "generated": true, + "folder": "我的客户" + }, + { + "path": "A4 客户管理/我的客户/批量领取.bru", + "key": "POST /api/customer/claim-batch", + "generated": true, + "folder": "我的客户" + }, + { + "path": "A4 客户管理/我的客户/抛公海.bru", + "key": "POST /api/customer/release-pool", + "generated": true, + "folder": "我的客户" + }, + { + "path": "A4 客户管理/我的客户/新增客户.bru", + "key": "POST /api/customer/create", + "generated": true, + "folder": "我的客户" + }, + { + "path": "A4 客户管理/我的客户/编辑客户.bru", + "key": "POST /api/customer/edit", + "generated": true, + "folder": "我的客户" + }, + { + "path": "A4 客户管理/我的客户/读取列偏好.bru", + "key": "GET /api/preference/get", + "generated": true, + "folder": "我的客户" + }, + { + "path": "A4 客户管理/我的客户/读取视图形态.bru", + "key": "GET /api/preference/view-form/get", + "generated": true, + "folder": "我的客户" + }, + { + "path": "A4 客户管理/我的客户/领取客户.bru", + "key": "POST /api/customer/claim", + "generated": true, + "folder": "我的客户" + }, + { + "path": "A4 客户管理/我的客户/客户导入/上传导入文件并预校验.bru", + "key": "POST /api/customer/import/upload", + "generated": true, + "folder": "客户导入" + }, + { + "path": "A4 客户管理/我的客户/客户导入/下载导入模板.bru", + "key": "GET /api/customer/import/template", + "generated": true, + "folder": "客户导入" + }, + { + "path": "A4 客户管理/我的客户/客户导入/任务结果.bru", + "key": "GET /api/customer/import/result", + "generated": true, + "folder": "客户导入" + }, + { + "path": "A4 客户管理/我的客户/客户导入/失败疑似重复明细.bru", + "key": "GET /api/customer/import/failures", + "generated": true, + "folder": "客户导入" + }, + { + "path": "A4 客户管理/我的客户/客户导入/最近导入记录.bru", + "key": "GET /api/customer/import/page", + "generated": true, + "folder": "客户导入" + }, + { + "path": "A4 客户管理/我的客户/客户导入/确认执行导入.bru", + "key": "POST /api/customer/import/confirm", + "generated": true, + "folder": "客户导入" + }, + { + "path": "A4 客户管理/我的客户/看板列表/看板分组汇总.bru", + "key": "POST /api/customer/workspace/board/summary", + "generated": true, + "folder": "看板列表" + }, + { + "path": "A4 客户管理/我的客户/看板列表/看板单列卡片.bru", + "key": "POST /api/customer/workspace/board/cards", + "generated": true, + "folder": "看板列表" + }, + { + "path": "A4 客户管理/战略协议/删除战略协议.bru", + "key": "POST /api/customer/agreement/delete", + "generated": true, + "folder": "战略协议" + }, + { + "path": "A4 客户管理/战略协议/战略协议详情.bru", + "key": "GET /api/customer/agreement/detail", + "generated": true, + "folder": "战略协议" + }, + { + "path": "A4 客户管理/战略协议/战略协议页签列表.bru", + "key": "GET /api/customer/agreement/list", + "generated": true, + "folder": "战略协议" + }, + { + "path": "A4 客户管理/战略协议/新增战略协议.bru", + "key": "POST /api/customer/agreement/create", + "generated": true, + "folder": "战略协议" + }, + { + "path": "A4 客户管理/战略协议/编辑战略协议.bru", + "key": "POST /api/customer/agreement/edit", + "generated": true, + "folder": "战略协议" + }, + { + "path": "A4 客户管理/联系人/保存列偏好.bru", + "key": "POST /api/preference/save", + "generated": true, + "folder": "联系人" + }, + { + "path": "A4 客户管理/联系人/保存视图形态.bru", + "key": "POST /api/preference/view-form/save", + "generated": true, + "folder": "联系人" + }, + { + "path": "A4 客户管理/联系人/删除联系人.bru", + "key": "POST /api/customer/contact/delete", + "generated": true, + "folder": "联系人" + }, + { + "path": "A4 客户管理/联系人/新增联系人.bru", + "key": "POST /api/customer/contact/create", + "generated": true, + "folder": "联系人" + }, + { + "path": "A4 客户管理/联系人/电话软提示.bru", + "key": "GET /api/customer/contact/check-phone", + "generated": true, + "folder": "联系人" + }, + { + "path": "A4 客户管理/联系人/编辑联系人.bru", + "key": "POST /api/customer/contact/edit", + "generated": true, + "folder": "联系人" + }, + { + "path": "A4 客户管理/联系人/联系人全局搜索.bru", + "key": "GET /api/customer/contact/search", + "generated": true, + "folder": "联系人" + }, + { + "path": "A4 客户管理/联系人/联系人详情.bru", + "key": "GET /api/customer/contact/detail", + "generated": true, + "folder": "联系人" + }, + { + "path": "A4 客户管理/联系人/读取列偏好.bru", + "key": "GET /api/preference/get", + "generated": true, + "folder": "联系人" + }, + { + "path": "A4 客户管理/联系人/读取视图形态.bru", + "key": "GET /api/preference/view-form/get", + "generated": true, + "folder": "联系人" + }, + { + "path": "A4 客户管理/联系人/顶级联系人列表.bru", + "key": "GET /api/customer/contact/page", + "generated": true, + "folder": "联系人" + }, + { + "path": "A7 后台管理/商机规则/公海规则/保存公海规则草稿.bru", + "key": "POST /api/rule/opp-pool-rule/save-draft", + "generated": true, + "folder": "公海规则" + }, + { + "path": "A7 后台管理/商机规则/公海规则/停用公海规则.bru", + "key": "POST /api/rule/opp-pool-rule/disable", + "generated": true, + "folder": "公海规则" + }, + { + "path": "A7 后台管理/商机规则/公海规则/公海规则分页.bru", + "key": "POST /api/rule/opp-pool-rule/page", + "generated": true, + "folder": "公海规则" + }, + { + "path": "A7 后台管理/商机规则/公海规则/公海规则版本列表.bru", + "key": "GET /api/rule/opp-pool-rule/versions", + "generated": true, + "folder": "公海规则" + }, + { + "path": "A7 后台管理/商机规则/公海规则/公海规则详情.bru", + "key": "GET /api/rule/opp-pool-rule/detail", + "generated": true, + "folder": "公海规则" + }, + { + "path": "A7 后台管理/商机规则/公海规则/删除公海规则.bru", + "key": "POST /api/rule/opp-pool-rule/delete", + "generated": true, + "folder": "公海规则" + }, + { + "path": "A7 后台管理/商机规则/公海规则/发布公海规则.bru", + "key": "POST /api/rule/opp-pool-rule/publish", + "generated": true, + "folder": "公海规则" + }, + { + "path": "A7 后台管理/商机规则/公海规则/复制公海规则.bru", + "key": "POST /api/rule/opp-pool-rule/copy", + "generated": true, + "folder": "公海规则" + }, + { + "path": "A7 后台管理/商机规则/方案卡模板/保存方案卡模板草稿.bru", + "key": "POST /api/rule/opp-scheme-template/save-draft", + "generated": true, + "folder": "方案卡模板" + }, + { + "path": "A7 后台管理/商机规则/方案卡模板/停用方案卡模板.bru", + "key": "POST /api/rule/opp-scheme-template/disable", + "generated": true, + "folder": "方案卡模板" + }, + { + "path": "A7 后台管理/商机规则/方案卡模板/删除方案卡模板.bru", + "key": "POST /api/rule/opp-scheme-template/delete", + "generated": true, + "folder": "方案卡模板" + }, + { + "path": "A7 后台管理/商机规则/方案卡模板/发布方案卡模板.bru", + "key": "POST /api/rule/opp-scheme-template/publish", + "generated": true, + "folder": "方案卡模板" + }, + { + "path": "A7 后台管理/商机规则/方案卡模板/复制方案卡模板.bru", + "key": "POST /api/rule/opp-scheme-template/copy", + "generated": true, + "folder": "方案卡模板" + }, + { + "path": "A7 后台管理/商机规则/方案卡模板/方案卡模板分页.bru", + "key": "POST /api/rule/opp-scheme-template/page", + "generated": true, + "folder": "方案卡模板" + }, + { + "path": "A7 后台管理/商机规则/方案卡模板/方案卡模板版本列表.bru", + "key": "GET /api/rule/opp-scheme-template/versions", + "generated": true, + "folder": "方案卡模板" + }, + { + "path": "A7 后台管理/商机规则/方案卡模板/方案卡模板详情.bru", + "key": "GET /api/rule/opp-scheme-template/detail", + "generated": true, + "folder": "方案卡模板" + }, + { + "path": "A7 后台管理/商机规则/方案卡模板/系统字段库列表.bru", + "key": "GET /api/rule/opp-scheme-template/field-defs", + "generated": true, + "folder": "方案卡模板" + }, + { + "path": "A7 后台管理/商机规则/阶段模板/保存阶段模板草稿.bru", + "key": "POST /api/rule/opp-stage-template/save-draft", + "generated": true, + "folder": "阶段模板" + }, + { + "path": "A7 后台管理/商机规则/阶段模板/停用阶段模板.bru", + "key": "POST /api/rule/opp-stage-template/disable", + "generated": true, + "folder": "阶段模板" + }, + { + "path": "A7 后台管理/商机规则/阶段模板/删除阶段模板.bru", + "key": "POST /api/rule/opp-stage-template/delete", + "generated": true, + "folder": "阶段模板" + }, + { + "path": "A7 后台管理/商机规则/阶段模板/发布阶段模板.bru", + "key": "POST /api/rule/opp-stage-template/publish", + "generated": true, + "folder": "阶段模板" + }, + { + "path": "A7 后台管理/商机规则/阶段模板/复制阶段模板.bru", + "key": "POST /api/rule/opp-stage-template/copy", + "generated": true, + "folder": "阶段模板" + }, + { + "path": "A7 后台管理/商机规则/阶段模板/阶段模板分页.bru", + "key": "POST /api/rule/opp-stage-template/page", + "generated": true, + "folder": "阶段模板" + }, + { + "path": "A7 后台管理/商机规则/阶段模板/阶段模板版本列表.bru", + "key": "GET /api/rule/opp-stage-template/versions", + "generated": true, + "folder": "阶段模板" + }, + { + "path": "A7 后台管理/商机规则/阶段模板/阶段模板详情.bru", + "key": "GET /api/rule/opp-stage-template/detail", + "generated": true, + "folder": "阶段模板" + }, + { + "path": "A7 后台管理/客户管理设置/查重设置/保存查重设置.bru", + "key": "POST /api/rule/customer/dedup/save", + "generated": true, + "folder": "查重设置" + }, + { + "path": "A7 后台管理/客户管理设置/查重设置/读取查重设置.bru", + "key": "GET /api/rule/customer/dedup", + "generated": true, + "folder": "查重设置" + }, + { + "path": "A7 后台管理/客户管理设置/超期未跟进提醒/保存提醒规则.bru", + "key": "POST /api/rule/customer/reminder/save", + "generated": true, + "folder": "超期未跟进提醒" + }, + { + "path": "A7 后台管理/客户管理设置/超期未跟进提醒/当前提醒规则.bru", + "key": "GET /api/rule/customer/reminder", + "generated": true, + "folder": "超期未跟进提醒" + }, + { + "path": "A7 后台管理/数据字典-分组/分组分页.bru", + "key": "POST /api/dict/group/page", + "generated": true, + "folder": "数据字典-分组" + }, + { + "path": "A7 后台管理/数据字典-分组/分组启停.bru", + "key": "POST /api/dict/group/status", + "generated": true, + "folder": "数据字典-分组" + }, + { + "path": "A7 后台管理/数据字典-分组/删除分组.bru", + "key": "POST /api/dict/group/delete", + "generated": true, + "folder": "数据字典-分组" + }, + { + "path": "A7 后台管理/数据字典-分组/启用分组列表.bru", + "key": "GET /api/dict/group/enabled-list", + "generated": true, + "folder": "数据字典-分组" + }, + { + "path": "A7 后台管理/数据字典-分组/新建编辑分组.bru", + "key": "POST /api/dict/group/saveOrUpdate", + "generated": true, + "folder": "数据字典-分组" + }, + { + "path": "A7 后台管理/数据字典-字典项/删除字典项.bru", + "key": "POST /api/dict/item/delete", + "generated": true, + "folder": "数据字典-字典项" + }, + { + "path": "A7 后台管理/数据字典-字典项/启用项列表.bru", + "key": "GET /api/dict/item/enabled-list", + "generated": true, + "folder": "数据字典-字典项" + }, + { + "path": "A7 后台管理/数据字典-字典项/字典项分页.bru", + "key": "POST /api/dict/item/page", + "generated": true, + "folder": "数据字典-字典项" + }, + { + "path": "A7 后台管理/数据字典-字典项/字典项启停.bru", + "key": "POST /api/dict/item/status", + "generated": true, + "folder": "数据字典-字典项" + }, + { + "path": "A7 后台管理/数据字典-字典项/强制删除字典项.bru", + "key": "POST /api/dict/item/force-delete", + "generated": true, + "folder": "数据字典-字典项" + }, + { + "path": "A7 后台管理/数据字典-字典项/新建编辑字典项.bru", + "key": "POST /api/dict/item/saveOrUpdate", + "generated": true, + "folder": "数据字典-字典项" + }, + { + "path": "A7 后台管理/数据字典-字典项/设为默认项.bru", + "key": "POST /api/dict/item/set-default", + "generated": true, + "folder": "数据字典-字典项" + }, + { + "path": "A7 后台管理/权限点管理/上传图标.bru", + "key": "POST /api/resources/icon/upload", + "generated": true, + "folder": "权限点管理" + }, + { + "path": "A7 后台管理/权限点管理/删除资源节点.bru", + "key": "POST /api/resources/delete", + "generated": true, + "folder": "权限点管理" + }, + { + "path": "A7 后台管理/权限点管理/新增编辑资源节点.bru", + "key": "POST /api/resources/saveOrUpdate", + "generated": true, + "folder": "权限点管理" + }, + { + "path": "A7 后台管理/权限点管理/资源树列表.bru", + "key": "GET /api/resources/list", + "generated": true, + "folder": "权限点管理" + }, + { + "path": "A7 后台管理/权限管理/角色管理/分配角色权限.bru", + "key": "POST /api/roles/assign-resources", + "generated": true, + "folder": "角色管理" + }, + { + "path": "A7 后台管理/权限管理/角色管理/删除角色.bru", + "key": "POST /api/roles/delete", + "generated": true, + "folder": "角色管理" + }, + { + "path": "A7 后台管理/权限管理/角色管理/可配数据权限模块.bru", + "key": "GET /api/data-scope/modules", + "generated": true, + "folder": "角色管理" + }, + { + "path": "A7 后台管理/权限管理/角色管理/新增编辑角色.bru", + "key": "POST /api/roles/saveOrUpdate", + "generated": true, + "folder": "角色管理" + }, + { + "path": "A7 后台管理/权限管理/角色管理/角色分页.bru", + "key": "POST /api/roles/page", + "generated": true, + "folder": "角色管理" + }, + { + "path": "A7 后台管理/权限管理/角色管理/角色详情.bru", + "key": "GET /api/roles/detail", + "generated": true, + "folder": "角色管理" + }, + { + "path": "A7 后台管理/用户管理/分配用户角色.bru", + "key": "POST /api/system/users/assign-roles", + "generated": true, + "folder": "用户管理" + }, + { + "path": "A7 后台管理/用户管理/分配用户部门.bru", + "key": "POST /api/system/users/assign-depts", + "generated": true, + "folder": "用户管理" + }, + { + "path": "A7 后台管理/用户管理/用户分页.bru", + "key": "POST /api/system/users/page", + "generated": true, + "folder": "用户管理" + }, + { + "path": "A7 后台管理/用户管理/用户统计.bru", + "key": "GET /api/system/users/stats", + "generated": true, + "folder": "用户管理" + }, + { + "path": "A7 后台管理/线索规则/公海池分页列表.bru", + "key": "POST /api/rule/pool/page", + "generated": true, + "folder": "线索规则" + }, + { + "path": "A7 后台管理/线索规则/公海池详情.bru", + "key": "GET /api/rule/pool/detail", + "generated": true, + "folder": "线索规则" + }, + { + "path": "A7 后台管理/线索规则/删除公海池.bru", + "key": "POST /api/rule/pool/delete", + "generated": true, + "folder": "线索规则" + }, + { + "path": "A7 后台管理/线索规则/批量删除公海池.bru", + "key": "POST /api/rule/pool/delete-batch", + "generated": true, + "folder": "线索规则" + }, + { + "path": "A7 后台管理/线索规则/新建编辑公海池.bru", + "key": "POST /api/rule/pool/saveOrUpdate", + "generated": true, + "folder": "线索规则" + }, + { + "path": "A7 后台管理/运维/管理员角色配置.bru", + "key": "POST /api/system/users/admin-role", + "generated": true, + "folder": "运维" + }, + { + "path": "A7 后台管理/运维/钉钉组织同步.bru", + "key": "POST /api/system/sync/dingtalk", + "generated": true, + "folder": "运维" + }, + { + "path": "A7 后台管理/部门管理/保存部门.bru", + "key": "POST /api/system/depts/save", + "generated": true, + "folder": "部门管理" + }, + { + "path": "A7 后台管理/部门管理/删除部门.bru", + "key": "POST /api/system/depts/delete", + "generated": true, + "folder": "部门管理" + }, + { + "path": "A7 后台管理/部门管理/部门树.bru", + "key": "GET /api/system/depts/tree", + "generated": true, + "folder": "部门管理" + }, + { + "path": "customer/ping/健康探针.bru", + "key": "GET /api/customer/ping", + "generated": true, + "folder": "ping" + }, + { + "path": "公共依赖/文件/上传分片.bru", + "key": "POST /api/file/multipart/upload", + "generated": true, + "folder": "文件" + }, + { + "path": "公共依赖/文件/下载文件.bru", + "key": "GET /api/file/download", + "generated": true, + "folder": "文件" + }, + { + "path": "公共依赖/文件/分片初始化.bru", + "key": "POST /api/file/multipart/init", + "generated": true, + "folder": "文件" + }, + { + "path": "公共依赖/文件/删除文件.bru", + "key": "POST /api/file/delete", + "generated": true, + "folder": "文件" + }, + { + "path": "公共依赖/文件/完成分片.bru", + "key": "POST /api/file/multipart/complete", + "generated": true, + "folder": "文件" + }, + { + "path": "公共依赖/文件/文件详情.bru", + "key": "GET /api/file/info", + "generated": true, + "folder": "文件" + }, + { + "path": "公共依赖/文件/直传上传.bru", + "key": "POST /api/file/upload", + "generated": true, + "folder": "文件" + }, + { + "path": "公共依赖/文件/缩略图.bru", + "key": "GET /api/file/thumbnail", + "generated": true, + "folder": "文件" + }, + { + "path": "公共依赖/文件/预览地址.bru", + "key": "GET /api/file/preview-url", + "generated": true, + "folder": "文件" + }, + { + "path": "公共依赖/行政区划/按上级查子区划.bru", + "key": "GET /api/rule/region/list", + "generated": true, + "folder": "行政区划" + }, + { + "path": "公共依赖/行政区划/按层级查区划.bru", + "key": "GET /api/rule/region/level", + "generated": true, + "folder": "行政区划" + }, + { + "path": "调试(验证专用)/签发调试token.bru", + "key": "GET /api/auth/debug/token", + "generated": true, + "folder": "调试(验证专用)" + } + ], + "apis": [ + { + "file": "crm-auth/src/main/java/com/crm/auth/controller/AuthController.java", + "className": "AuthController", + "http": "POST", + "url": "/api/auth/login/dingtalk", + "tags": [ + "A0 登录界面" + ], + "summary": "钉钉登录(扫码/免登通用)" + }, + { + "file": "crm-auth/src/main/java/com/crm/auth/controller/AuthController.java", + "className": "AuthController", + "http": "POST", + "url": "/api/auth/login/dingtalk/confirm", + "tags": [ + "A0 登录界面" + ], + "summary": "确认顶号登录(凭 preLoginToken 踢掉旧设备并完成登录)" + }, + { + "file": "crm-auth/src/main/java/com/crm/auth/controller/AuthController.java", + "className": "AuthController", + "http": "POST", + "url": "/api/auth/logout", + "tags": [ + "A0 登录界面" + ], + "summary": "注销" + }, + { + "file": "crm-auth/src/main/java/com/crm/auth/controller/AuthController.java", + "className": "AuthController", + "http": "GET", + "url": "/api/auth/me", + "tags": [ + "A0 登录界面" + ], + "summary": "获取当前登录用户信息" + }, + { + "file": "crm-auth/src/main/java/com/crm/auth/controller/DataScopeModuleController.java", + "className": "DataScopeModuleController", + "http": "GET", + "url": "/api/data-scope/modules", + "tags": [ + "A7 后台管理/权限管理/角色管理" + ], + "summary": "列出可配数据权限模块" + }, + { + "file": "crm-auth/src/main/java/com/crm/auth/controller/DebugTokenController.java", + "className": "DebugTokenController", + "http": "GET", + "url": "/api/auth/debug/token", + "tags": [ + "调试(验证专用)" + ], + "summary": "【验证专用】按 userId 签发 JWT" + }, + { + "file": "crm-auth/src/main/java/com/crm/auth/controller/ResourceController.java", + "className": "ResourceController", + "http": "GET", + "url": "/api/resources/list", + "tags": [ + "A7 后台管理/权限点管理" + ], + "summary": "获取权限资源树" + }, + { + "file": "crm-auth/src/main/java/com/crm/auth/controller/ResourceController.java", + "className": "ResourceController", + "http": "POST", + "url": "/api/resources/saveOrUpdate", + "tags": [ + "A7 后台管理/权限点管理" + ], + "summary": "新增编辑一级菜单/二级菜单/权限点" + }, + { + "file": "crm-auth/src/main/java/com/crm/auth/controller/ResourceController.java", + "className": "ResourceController", + "http": "POST", + "url": "/api/resources/delete", + "tags": [ + "A7 后台管理/权限点管理" + ], + "summary": "删除一级菜单/二级菜单/权限点" + }, + { + "file": "crm-auth/src/main/java/com/crm/auth/controller/ResourceController.java", + "className": "ResourceController", + "http": "POST", + "url": "/api/resources/icon/upload", + "tags": [ + "A7 后台管理/权限点管理" + ], + "summary": "上传图标" + }, + { + "file": "crm-auth/src/main/java/com/crm/auth/controller/RoleController.java", + "className": "RoleController", + "http": "POST", + "url": "/api/roles/page", + "tags": [ + "A7 后台管理/权限管理/角色管理" + ], + "summary": "分页查询角色" + }, + { + "file": "crm-auth/src/main/java/com/crm/auth/controller/RoleController.java", + "className": "RoleController", + "http": "POST", + "url": "/api/roles/saveOrUpdate", + "tags": [ + "A7 后台管理/权限管理/角色管理" + ], + "summary": "新增或编辑角色" + }, + { + "file": "crm-auth/src/main/java/com/crm/auth/controller/RoleController.java", + "className": "RoleController", + "http": "GET", + "url": "/api/roles/detail", + "tags": [ + "A7 后台管理/权限管理/角色管理" + ], + "summary": "角色详情(含授权资源集合 + 每模块档位)" + }, + { + "file": "crm-auth/src/main/java/com/crm/auth/controller/RoleController.java", + "className": "RoleController", + "http": "POST", + "url": "/api/roles/assign-resources", + "tags": [ + "A7 后台管理/权限管理/角色管理" + ], + "summary": "分配角色权限资源(祖先补全+全量替换)" + }, + { + "file": "crm-auth/src/main/java/com/crm/auth/controller/RoleController.java", + "className": "RoleController", + "http": "POST", + "url": "/api/roles/delete", + "tags": [ + "A7 后台管理/权限管理/角色管理" + ], + "summary": "删除角色(级联清理关联表)" + }, + { + "file": "crm-auth/src/main/java/com/crm/auth/controller/SystemController.java", + "className": "SystemController", + "http": "GET", + "url": "/api/system/menus/tree", + "tags": [ + "A0 登录界面" + ], + "summary": "当前用户可见菜单树(按角色权限过滤,供前端渲染左侧导航)" + }, + { + "file": "crm-auth/src/main/java/com/crm/auth/controller/SystemController.java", + "className": "SystemController", + "http": "GET", + "url": "/api/system/depts/tree", + "tags": [ + "A7 后台管理/部门管理" + ], + "summary": "部门树(全量部门层级树)" + }, + { + "file": "crm-auth/src/main/java/com/crm/auth/controller/SystemController.java", + "className": "SystemController", + "http": "POST", + "url": "/api/system/depts/save", + "tags": [ + "A7 后台管理/部门管理" + ], + "summary": "新增或编辑部门" + }, + { + "file": "crm-auth/src/main/java/com/crm/auth/controller/SystemController.java", + "className": "SystemController", + "http": "POST", + "url": "/api/system/depts/delete", + "tags": [ + "A7 后台管理/部门管理" + ], + "summary": "删除部门" + }, + { + "file": "crm-auth/src/main/java/com/crm/auth/controller/SystemController.java", + "className": "SystemController", + "http": "POST", + "url": "/api/system/users/assign-roles", + "tags": [ + "A7 后台管理/用户管理" + ], + "summary": "设置用户角色(全量替换)" + }, + { + "file": "crm-auth/src/main/java/com/crm/auth/controller/SystemController.java", + "className": "SystemController", + "http": "POST", + "url": "/api/system/users/assign-depts", + "tags": [ + "A7 后台管理/用户管理" + ], + "summary": "设置用户部门(主部门+兼职,全量替换)" + }, + { + "file": "crm-auth/src/main/java/com/crm/auth/controller/SystemController.java", + "className": "SystemController", + "http": "POST", + "url": "/api/system/users/page", + "tags": [ + "A7 后台管理/用户管理" + ], + "summary": "分页查询用户列表" + }, + { + "file": "crm-auth/src/main/java/com/crm/auth/controller/SystemController.java", + "className": "SystemController", + "http": "GET", + "url": "/api/system/users/stats", + "tags": [ + "A7 后台管理/用户管理" + ], + "summary": "用户统计(按部门)" + }, + { + "file": "crm-auth/src/main/java/com/crm/auth/controller/SystemController.java", + "className": "SystemController", + "http": "POST", + "url": "/api/system/sync/dingtalk", + "tags": [ + "A7 后台管理/运维" + ], + "summary": "钉钉组织全量同步(部门树+用户,幂等可重跑)" + }, + { + "file": "crm-auth/src/main/java/com/crm/auth/controller/SystemController.java", + "className": "SystemController", + "http": "POST", + "url": "/api/system/users/admin-role", + "tags": [ + "A7 后台管理/运维" + ], + "summary": "管理员角色配置(增量授予/回收)" + }, + { + "file": "crm-file/src/main/java/com/crm/file/controller/FileController.java", + "className": "FileController", + "http": "POST", + "url": "/api/file/upload", + "tags": [ + "公共依赖/文件" + ], + "summary": "直传(小文件,超直传上限请走分片)" + }, + { + "file": "crm-file/src/main/java/com/crm/file/controller/FileController.java", + "className": "FileController", + "http": "GET", + "url": "/api/file/info", + "tags": [ + "公共依赖/文件" + ], + "summary": "文件详情" + }, + { + "file": "crm-file/src/main/java/com/crm/file/controller/FileController.java", + "className": "FileController", + "http": "GET", + "url": "/api/file/download", + "tags": [ + "公共依赖/文件" + ], + "summary": "下载(信封例外:成功二进制流,失败 JSON 信封)" + }, + { + "file": "crm-file/src/main/java/com/crm/file/controller/FileController.java", + "className": "FileController", + "http": "GET", + "url": "/api/file/preview-url", + "tags": [ + "公共依赖/文件" + ], + "summary": "预览地址(可直接 window.open,由 kkFileView 渲染)" + }, + { + "file": "crm-file/src/main/java/com/crm/file/controller/FileController.java", + "className": "FileController", + "http": "GET", + "url": "/api/file/thumbnail", + "tags": [ + "公共依赖/文件" + ], + "summary": "缩略图(信封例外:成功返回二进制图片流,失败 JSON 信封)" + }, + { + "file": "crm-file/src/main/java/com/crm/file/controller/FileController.java", + "className": "FileController", + "http": "POST", + "url": "/api/file/delete", + "tags": [ + "公共依赖/文件" + ], + "summary": "删除(逻辑删除)" + }, + { + "file": "crm-file/src/main/java/com/crm/file/controller/FileController.java", + "className": "FileController", + "http": "POST", + "url": "/api/file/multipart/init", + "tags": [ + "公共依赖/文件" + ], + "summary": "分片上传-init(带 uploadId 为断点续传,返回已上传分片序号列表)" + }, + { + "file": "crm-file/src/main/java/com/crm/file/controller/FileController.java", + "className": "FileController", + "http": "POST", + "url": "/api/file/multipart/upload", + "tags": [ + "公共依赖/文件" + ], + "summary": "分片上传-上传单片(序号 1 起,非末片大小必须等于 init 下发的分片大小)" + }, + { + "file": "crm-file/src/main/java/com/crm/file/controller/FileController.java", + "className": "FileController", + "http": "POST", + "url": "/api/file/multipart/complete", + "tags": [ + "公共依赖/文件" + ], + "summary": "分片上传-complete(合并并返回文件详情)" + }, + { + "file": "crm-lead/src/main/java/com/crm/lead/controller/LeadController.java", + "className": "LeadController", + "http": "POST", + "url": "/api/lead/page", + "tags": [ + "A2 线索管理/线索公海", + "A2 线索管理/我的线索", + "A2 线索管理/我的关注", + "A2 线索管理/线索管理" + ], + "summary": "线索分页(四视图:PUBLIC_POOL/MY_LEAD/MY_FOLLOW/MANAGE)" + }, + { + "file": "crm-lead/src/main/java/com/crm/lead/controller/LeadController.java", + "className": "LeadController", + "http": "GET", + "url": "/api/lead/detail", + "tags": [ + "A2 线索管理/线索公海", + "A2 线索管理/我的线索", + "A2 线索管理/我的关注", + "A2 线索管理/线索管理" + ], + "summary": "线索详情" + }, + { + "file": "crm-lead/src/main/java/com/crm/lead/controller/LeadController.java", + "className": "LeadController", + "http": "GET", + "url": "/api/lead/history", + "tags": [ + "A2 线索管理/线索公海", + "A2 线索管理/我的线索", + "A2 线索管理/我的关注", + "A2 线索管理/线索管理" + ], + "summary": "历史记录(只展示 5 种:领取/释放/反馈/转商机/编辑)" + }, + { + "file": "crm-lead/src/main/java/com/crm/lead/controller/LeadController.java", + "className": "LeadController", + "http": "POST", + "url": "/api/lead/create", + "tags": [ + "A2 线索管理/我的线索", + "A2 线索管理/线索管理" + ], + "summary": "新建线索(claimOnCreate=true 销售新增即领取;followOnCreate=true 创建即关注,原型「是否领取/是否关注」复选)" + }, + { + "file": "crm-lead/src/main/java/com/crm/lead/controller/LeadController.java", + "className": "LeadController", + "http": "POST", + "url": "/api/lead/edit", + "tags": [ + "A2 线索管理/我的线索" + ], + "summary": "编辑线索(非终态可编辑)" + }, + { + "file": "crm-lead/src/main/java/com/crm/lead/controller/LeadController.java", + "className": "LeadController", + "http": "POST", + "url": "/api/lead/delete", + "tags": [ + "A2 线索管理/我的线索", + "A2 线索管理/线索管理" + ], + "summary": "删除线索(已转商机禁止删除)" + }, + { + "file": "crm-lead/src/main/java/com/crm/lead/controller/LeadController.java", + "className": "LeadController", + "http": "POST", + "url": "/api/lead/claim", + "tags": [ + "A2 线索管理/线索公海", + "A2 线索管理/我的关注" + ], + "summary": "领取线索(待领取→已领取)" + }, + { + "file": "crm-lead/src/main/java/com/crm/lead/controller/LeadController.java", + "className": "LeadController", + "http": "POST", + "url": "/api/lead/assign-pool", + "tags": [ + "A2 线索管理/线索管理" + ], + "summary": "分配线索到池(未分发→待领取)" + }, + { + "file": "crm-lead/src/main/java/com/crm/lead/controller/LeadController.java", + "className": "LeadController", + "http": "POST", + "url": "/api/lead/assign-user", + "tags": [ + "A2 线索管理/线索管理" + ], + "summary": "分配线索到销售(未分发/待领取→已领取 or 作废自环)" + }, + { + "file": "crm-lead/src/main/java/com/crm/lead/controller/LeadController.java", + "className": "LeadController", + "http": "POST", + "url": "/api/lead/feedback-draft", + "tags": [ + "A2 线索管理/我的线索" + ], + "summary": "保存反馈草稿(不改状态机)" + }, + { + "file": "crm-lead/src/main/java/com/crm/lead/controller/LeadController.java", + "className": "LeadController", + "http": "POST", + "url": "/api/lead/feedback-submit", + "tags": [ + "A2 线索管理/我的线索" + ], + "summary": "提交反馈(已领取→跟进中 or →作废)" + }, + { + "file": "crm-lead/src/main/java/com/crm/lead/controller/LeadController.java", + "className": "LeadController", + "http": "POST", + "url": "/api/lead/convert", + "tags": [ + "A2 线索管理/我的线索" + ], + "summary": "转商机(已领取/跟进中→已转商机)" + }, + { + "file": "crm-lead/src/main/java/com/crm/lead/controller/LeadController.java", + "className": "LeadController", + "http": "POST", + "url": "/api/lead/release", + "tags": [ + "A2 线索管理/线索公海", + "A2 线索管理/我的线索" + ], + "summary": "释放线索(已领取/跟进中→待领取)" + }, + { + "file": "crm-lead/src/main/java/com/crm/lead/controller/LeadController.java", + "className": "LeadController", + "http": "POST", + "url": "/api/lead/activate", + "tags": [ + "A2 线索管理/线索管理" + ], + "summary": "激活线索(过期失效→恢复失效前态)" + }, + { + "file": "crm-lead/src/main/java/com/crm/lead/controller/LeadController.java", + "className": "LeadController", + "http": "POST", + "url": "/api/lead/follow", + "tags": [ + "A2 线索管理/线索公海" + ], + "summary": "关注线索(公海页,任意状态可关注)" + }, + { + "file": "crm-lead/src/main/java/com/crm/lead/controller/LeadController.java", + "className": "LeadController", + "http": "POST", + "url": "/api/lead/unfollow", + "tags": [ + "A2 线索管理/线索公海", + "A2 线索管理/我的关注" + ], + "summary": "取消关注(公海详情弹窗/我的关注操作列)" + }, + { + "file": "crm-lead/src/main/java/com/crm/lead/controller/LeadController.java", + "className": "LeadController", + "http": "POST", + "url": "/api/lead/stats", + "tags": [ + "A2 线索管理/线索公海", + "A2 线索管理/我的线索", + "A2 线索管理/我的关注", + "A2 线索管理/线索管理" + ], + "summary": "视图统计卡片(与 /page 同套筛选口径,口径随视图)" + }, + { + "file": "crm-lead/src/main/java/com/crm/lead/controller/LeadController.java", + "className": "LeadController", + "http": "POST", + "url": "/api/lead/claim-batch", + "tags": [ + "A2 线索管理/线索公海", + "A2 线索管理/我的关注" + ], + "summary": "批量领取" + }, + { + "file": "crm-lead/src/main/java/com/crm/lead/controller/LeadController.java", + "className": "LeadController", + "http": "POST", + "url": "/api/lead/assign-pool-batch", + "tags": [ + "A2 线索管理/线索管理" + ], + "summary": "批量分配到池(未分发→待领取)" + }, + { + "file": "crm-lead/src/main/java/com/crm/lead/controller/LeadController.java", + "className": "LeadController", + "http": "POST", + "url": "/api/lead/assign-user-batch", + "tags": [ + "A2 线索管理/线索管理" + ], + "summary": "批量分配到销售(统一分配给同一销售)" + }, + { + "file": "crm-lead/src/main/java/com/crm/lead/controller/LeadController.java", + "className": "LeadController", + "http": "POST", + "url": "/api/lead/release-batch", + "tags": [ + "A2 线索管理/我的线索" + ], + "summary": "批量释放(已领取/跟进中→待领取)" + }, + { + "file": "crm-lead/src/main/java/com/crm/lead/controller/LeadController.java", + "className": "LeadController", + "http": "POST", + "url": "/api/lead/activate-batch", + "tags": [ + "A2 线索管理/线索管理" + ], + "summary": "批量激活(过期失效→恢复失效前态)" + }, + { + "file": "crm-lead/src/main/java/com/crm/lead/controller/LeadController.java", + "className": "LeadController", + "http": "POST", + "url": "/api/lead/delete-batch", + "tags": [ + "A2 线索管理/线索管理" + ], + "summary": "批量删除(已转商机禁止删除,记失败)" + }, + { + "file": "crm-lead/src/main/java/com/crm/lead/controller/LeadController.java", + "className": "LeadController", + "http": "POST", + "url": "/api/lead/follow-batch", + "tags": [ + "A2 线索管理/线索公海" + ], + "summary": "批量关注(公海页勾选任意状态执行,逐条幂等)" + }, + { + "file": "crm-lead/src/main/java/com/crm/lead/controller/LeadController.java", + "className": "LeadController", + "http": "POST", + "url": "/api/lead/unfollow-batch", + "tags": [ + "A2 线索管理/我的关注" + ], + "summary": "批量取关(我的关注页勾选执行,幂等)" + }, + { + "file": "crm-opportunity/src/main/java/com/crm/opportunity/controller/OpportunityCollabController.java", + "className": "OpportunityCollabController", + "http": "POST", + "url": "/api/opportunity/focus", + "tags": [ + "A3 商机管理/商机详情/主体" + ], + "summary": "关注商机" + }, + { + "file": "crm-opportunity/src/main/java/com/crm/opportunity/controller/OpportunityCollabController.java", + "className": "OpportunityCollabController", + "http": "POST", + "url": "/api/opportunity/unfocus", + "tags": [ + "A3 商机管理/商机详情/主体" + ], + "summary": "取关商机" + }, + { + "file": "crm-opportunity/src/main/java/com/crm/opportunity/controller/OpportunityCollabController.java", + "className": "OpportunityCollabController", + "http": "POST", + "url": "/api/opportunity/focus-batch", + "tags": [ + "A3 商机管理/商机详情/主体" + ], + "summary": "批量关注" + }, + { + "file": "crm-opportunity/src/main/java/com/crm/opportunity/controller/OpportunityCollabController.java", + "className": "OpportunityCollabController", + "http": "POST", + "url": "/api/opportunity/view-touch", + "tags": [ + "A3 商机管理/商机详情/主体" + ], + "summary": "上报商机访问(打开详情时调用)" + }, + { + "file": "crm-opportunity/src/main/java/com/crm/opportunity/controller/OpportunityCollabController.java", + "className": "OpportunityCollabController", + "http": "POST", + "url": "/api/opportunity/board/stage-summary", + "tags": [ + "A3 商机管理/商机公海/看板列表", + "A3 商机管理/商机管理/看板列表", + "A3 商机管理/销售机会/看板列表" + ], + "summary": "看板各阶段数量+金额汇总(viewType 与列表视图同口径,票 06 D-15;PUBLIC_POOL=公海看板)" + }, + { + "file": "crm-opportunity/src/main/java/com/crm/opportunity/controller/OpportunityCollabController.java", + "className": "OpportunityCollabController", + "http": "POST", + "url": "/api/opportunity/board/cards", + "tags": [ + "A3 商机管理/商机公海/看板列表", + "A3 商机管理/商机管理/看板列表", + "A3 商机管理/销售机会/看板列表" + ], + "summary": "看板单阶段卡片列表(viewType 与列表视图同口径,票 06 D-15;入参 stageName 按展示名取卡)" + }, + { + "file": "crm-opportunity/src/main/java/com/crm/opportunity/controller/OpportunityCreateController.java", + "className": "OpportunityCreateController", + "http": "POST", + "url": "/api/opportunity", + "tags": [ + "A3 商机管理/新建商机" + ], + "summary": "新建商机(oppSource=线索转入 时须选关联线索)" + }, + { + "file": "crm-opportunity/src/main/java/com/crm/opportunity/controller/OpportunityCreateController.java", + "className": "OpportunityCreateController", + "http": "GET", + "url": "/api/opportunity/convertible-leads", + "tags": [ + "A3 商机管理/新建商机" + ], + "summary": "可关联线索下拉候选(已领取/跟进中 且 未被商机占用)" + }, + { + "file": "crm-opportunity/src/main/java/com/crm/opportunity/controller/OpportunityDetailController.java", + "className": "OpportunityDetailController", + "http": "GET", + "url": "/api/opportunity/detail", + "tags": [ + "A3 商机管理/商机详情/主体" + ], + "summary": "商机详情" + }, + { + "file": "crm-opportunity/src/main/java/com/crm/opportunity/controller/OpportunityDetailController.java", + "className": "OpportunityDetailController", + "http": "POST", + "url": "/api/opportunity/edit", + "tags": [ + "A3 商机管理/商机详情/主体" + ], + "summary": "编辑商机(非终态可编辑;全量字段覆盖)" + }, + { + "file": "crm-opportunity/src/main/java/com/crm/opportunity/controller/OpportunityQueryController.java", + "className": "OpportunityQueryController", + "http": "POST", + "url": "/api/opportunity/page", + "tags": [ + "A3 商机管理/商机公海", + "A3 商机管理/商机管理", + "A3 商机管理/销售机会" + ], + "summary": "商机分页(六视图:RECENT/MINE/PARTICIPATED/FOLLOWED/MANAGE/PUBLIC_POOL)" + }, + { + "file": "crm-opportunity/src/main/java/com/crm/opportunity/controller/OpportunitySchemeCardController.java", + "className": "OpportunitySchemeCardController", + "http": "GET", + "url": "/api/opportunity/scheme-card/list", + "tags": [ + "A3 商机管理/商机详情/方案卡" + ], + "summary": "方案卡列表(一商机多张分组展示;无卡=「未创建」展示态由前端渲染)" + }, + { + "file": "crm-opportunity/src/main/java/com/crm/opportunity/controller/OpportunitySchemeCardController.java", + "className": "OpportunitySchemeCardController", + "http": "GET", + "url": "/api/opportunity/scheme-card/detail", + "tags": [ + "A3 商机管理/商机详情/方案卡" + ], + "summary": "方案卡详情(绑定模板版本显示字段项有序列表 + 已填值)" + }, + { + "file": "crm-opportunity/src/main/java/com/crm/opportunity/controller/OpportunitySchemeCardController.java", + "className": "OpportunitySchemeCardController", + "http": "GET", + "url": "/api/opportunity/scheme-card/selectable-templates", + "tags": [ + "A3 商机管理/商机详情/方案卡" + ], + "summary": "可选模板版本列表(新建方案卡手动选模板下拉;发布中且适用范围命中商机所属部门;空列表=建卡入口置灰)" + }, + { + "file": "crm-opportunity/src/main/java/com/crm/opportunity/controller/OpportunitySchemeCardController.java", + "className": "OpportunitySchemeCardController", + "http": "POST", + "url": "/api/opportunity/scheme-card/save", + "tags": [ + "A3 商机管理/商机详情/方案卡" + ], + "summary": "保存(新建草稿/编辑;新建须传 templateId 手动选模板版本,编辑续用锁定版本;草稿与已提交均可改;动态字段值以 valuesJson 表单字段上送)" + }, + { + "file": "crm-opportunity/src/main/java/com/crm/opportunity/controller/OpportunitySchemeCardController.java", + "className": "OpportunitySchemeCardController", + "http": "POST", + "url": "/api/opportunity/scheme-card/submit", + "tags": [ + "A3 商机管理/商机详情/方案卡" + ], + "summary": "提交(「确认」→已提交;提交前校验模板必填字段)" + }, + { + "file": "crm-opportunity/src/main/java/com/crm/opportunity/controller/OpportunityStageController.java", + "className": "OpportunityStageController", + "http": "GET", + "url": "/api/opportunity/stage/progress", + "tags": [ + "A3 商机管理/商机详情/主体" + ], + "summary": "阶段推进指引(三态进度:已完成/当前/未完成 + 当前节点工作目标)" + }, + { + "file": "crm-opportunity/src/main/java/com/crm/opportunity/controller/OpportunityStageController.java", + "className": "OpportunityStageController", + "http": "POST", + "url": "/api/opportunity/stage/switch", + "tags": [ + "A3 商机管理/商机详情/主体" + ], + "summary": "阶段切换(自由切换:连跳/回退;「已转项目」固定节点不可手动切)" + }, + { + "file": "crm-opportunity/src/main/java/com/crm/opportunity/controller/OpportunityStageController.java", + "className": "OpportunityStageController", + "http": "GET", + "url": "/api/opportunity/stage/history", + "tags": [ + "A3 商机管理/商机详情/主体" + ], + "summary": "阶段推进历史(按操作时间倒序)" + }, + { + "file": "crm-opportunity/src/main/java/com/crm/opportunity/controller/OpportunitySubController.java", + "className": "OpportunitySubController", + "http": "GET", + "url": "/api/opportunity/customer/list", + "tags": [ + "A3 商机管理/商机详情/客户" + ], + "summary": "客户列表" + }, + { + "file": "crm-opportunity/src/main/java/com/crm/opportunity/controller/OpportunitySubController.java", + "className": "OpportunitySubController", + "http": "POST", + "url": "/api/opportunity/customer/add", + "tags": [ + "A3 商机管理/商机详情/客户" + ], + "summary": "添加关联客户" + }, + { + "file": "crm-opportunity/src/main/java/com/crm/opportunity/controller/OpportunitySubController.java", + "className": "OpportunitySubController", + "http": "POST", + "url": "/api/opportunity/customer/search", + "tags": [ + "A3 商机管理/商机详情/客户" + ], + "summary": "候选客户池搜索" + }, + { + "file": "crm-opportunity/src/main/java/com/crm/opportunity/controller/OpportunitySubController.java", + "className": "OpportunitySubController", + "http": "GET", + "url": "/api/opportunity/customer/contacts", + "tags": [ + "A3 商机管理/商机详情/客户" + ], + "summary": "按客户查联系人(客户模块真源,票 11 切真源)" + }, + { + "file": "crm-opportunity/src/main/java/com/crm/opportunity/controller/OpportunitySubController.java", + "className": "OpportunitySubController", + "http": "POST", + "url": "/api/opportunity/customer/set-primary", + "tags": [ + "A3 商机管理/商机详情/客户" + ], + "summary": "设为主要意向客户" + }, + { + "file": "crm-opportunity/src/main/java/com/crm/opportunity/controller/OpportunitySubController.java", + "className": "OpportunitySubController", + "http": "POST", + "url": "/api/opportunity/follow/page", + "tags": [ + "A3 商机管理/商机详情/跟进" + ], + "summary": "跟进记录分页" + }, + { + "file": "crm-opportunity/src/main/java/com/crm/opportunity/controller/OpportunitySubController.java", + "className": "OpportunitySubController", + "http": "POST", + "url": "/api/opportunity/follow/add", + "tags": [ + "A3 商机管理/商机详情/跟进" + ], + "summary": "新增跟进记录" + }, + { + "file": "crm-opportunity/src/main/java/com/crm/opportunity/controller/OpportunitySubController.java", + "className": "OpportunitySubController", + "http": "POST", + "url": "/api/opportunity/follow/delete", + "tags": [ + "A3 商机管理/商机详情/跟进" + ], + "summary": "删除跟进记录" + }, + { + "file": "crm-opportunity/src/main/java/com/crm/opportunity/controller/OpportunitySubController.java", + "className": "OpportunitySubController", + "http": "POST", + "url": "/api/opportunity/site-survey/page", + "tags": [ + "A3 商机管理/商机详情/勘察" + ], + "summary": "勘察记录分页" + }, + { + "file": "crm-opportunity/src/main/java/com/crm/opportunity/controller/OpportunitySubController.java", + "className": "OpportunitySubController", + "http": "POST", + "url": "/api/opportunity/site-survey/add", + "tags": [ + "A3 商机管理/商机详情/勘察" + ], + "summary": "新增勘察记录" + }, + { + "file": "crm-opportunity/src/main/java/com/crm/opportunity/controller/OpportunitySubController.java", + "className": "OpportunitySubController", + "http": "POST", + "url": "/api/opportunity/site-survey/delete", + "tags": [ + "A3 商机管理/商机详情/勘察" + ], + "summary": "删除勘察记录" + }, + { + "file": "crm-opportunity/src/main/java/com/crm/opportunity/controller/OpportunitySubController.java", + "className": "OpportunitySubController", + "http": "GET", + "url": "/api/opportunity/attachment/list", + "tags": [ + "A3 商机管理/商机详情/附件" + ], + "summary": "附件列表" + }, + { + "file": "crm-opportunity/src/main/java/com/crm/opportunity/controller/OpportunitySubController.java", + "className": "OpportunitySubController", + "http": "POST", + "url": "/api/opportunity/attachment/add", + "tags": [ + "A3 商机管理/商机详情/附件" + ], + "summary": "新增附件" + }, + { + "file": "crm-opportunity/src/main/java/com/crm/opportunity/controller/OpportunitySubController.java", + "className": "OpportunitySubController", + "http": "POST", + "url": "/api/opportunity/attachment/delete", + "tags": [ + "A3 商机管理/商机详情/附件" + ], + "summary": "删除附件" + }, + { + "file": "crm-opportunity/src/main/java/com/crm/opportunity/controller/OpportunitySubController.java", + "className": "OpportunitySubController", + "http": "GET", + "url": "/api/opportunity/team/list", + "tags": [ + "A3 商机管理/商机详情/团队" + ], + "summary": "团队成员列表" + }, + { + "file": "crm-opportunity/src/main/java/com/crm/opportunity/controller/OpportunitySubController.java", + "className": "OpportunitySubController", + "http": "POST", + "url": "/api/opportunity/team/add", + "tags": [ + "A3 商机管理/商机详情/团队" + ], + "summary": "批量添加团队成员" + }, + { + "file": "crm-opportunity/src/main/java/com/crm/opportunity/controller/OpportunitySubController.java", + "className": "OpportunitySubController", + "http": "POST", + "url": "/api/opportunity/team/update", + "tags": [ + "A3 商机管理/商机详情/团队" + ], + "summary": "编辑团队成员" + }, + { + "file": "crm-opportunity/src/main/java/com/crm/opportunity/controller/OpportunitySubController.java", + "className": "OpportunitySubController", + "http": "POST", + "url": "/api/opportunity/team/delete", + "tags": [ + "A3 商机管理/商机详情/团队" + ], + "summary": "移除团队成员" + }, + { + "file": "crm-opportunity/src/main/java/com/crm/opportunity/controller/OpportunitySubController.java", + "className": "OpportunitySubController", + "http": "POST", + "url": "/api/opportunity/oplog/page", + "tags": [ + "A3 商机管理/商机详情/日志" + ], + "summary": "操作日志分页" + }, + { + "file": "crm-opportunity/src/main/java/com/crm/opportunity/controller/OpportunitySubController.java", + "className": "OpportunitySubController", + "http": "GET", + "url": "/api/opportunity/workplan/list", + "tags": [ + "A3 商机管理/商机详情/工作计划" + ], + "summary": "工作计划列表" + }, + { + "file": "crm-opportunity/src/main/java/com/crm/opportunity/controller/OpportunitySubController.java", + "className": "OpportunitySubController", + "http": "POST", + "url": "/api/opportunity/workplan/add", + "tags": [ + "A3 商机管理/商机详情/工作计划" + ], + "summary": "新增工作计划" + }, + { + "file": "crm-opportunity/src/main/java/com/crm/opportunity/controller/OpportunitySubController.java", + "className": "OpportunitySubController", + "http": "POST", + "url": "/api/opportunity/workplan/update", + "tags": [ + "A3 商机管理/商机详情/工作计划" + ], + "summary": "编辑工作计划(登记完成:planStatus=1 服务端回填 finishTime,0 清空)" + }, + { + "file": "crm-opportunity/src/main/java/com/crm/opportunity/controller/OpportunitySubController.java", + "className": "OpportunitySubController", + "http": "POST", + "url": "/api/opportunity/workplan/delete", + "tags": [ + "A3 商机管理/商机详情/工作计划" + ], + "summary": "删除工作计划" + }, + { + "file": "crm-opportunity/src/main/java/com/crm/opportunity/controller/OpportunityTransitionController.java", + "className": "OpportunityTransitionController", + "http": "POST", + "url": "/api/opportunity/claim", + "tags": [ + "A3 商机管理/状态流转" + ], + "summary": "领取商机(待领取→推进中,E1;命中发布中禁领规则时拒绝,票 05 D-09)" + }, + { + "file": "crm-opportunity/src/main/java/com/crm/opportunity/controller/OpportunityTransitionController.java", + "className": "OpportunityTransitionController", + "http": "POST", + "url": "/api/opportunity/claim-batch", + "tags": [ + "A3 商机管理/状态流转" + ], + "summary": "批量领取(待领取→推进中,E1;命中发布中禁领规则时拒绝,票 05 D-09)" + }, + { + "file": "crm-opportunity/src/main/java/com/crm/opportunity/controller/OpportunityTransitionController.java", + "className": "OpportunityTransitionController", + "http": "POST", + "url": "/api/opportunity/assign", + "tags": [ + "A3 商机管理/状态流转" + ], + "summary": "分配商机给指定销售(待领取→推进中,E2)" + }, + { + "file": "crm-opportunity/src/main/java/com/crm/opportunity/controller/OpportunityTransitionController.java", + "className": "OpportunityTransitionController", + "http": "POST", + "url": "/api/opportunity/assign-batch", + "tags": [ + "A3 商机管理/状态流转" + ], + "summary": "批量分配商机(待领取→推进中,E2)" + }, + { + "file": "crm-opportunity/src/main/java/com/crm/opportunity/controller/OpportunityTransitionController.java", + "className": "OpportunityTransitionController", + "http": "POST", + "url": "/api/opportunity/release-pool", + "tags": [ + "A3 商机管理/状态流转" + ], + "summary": "抛公海(推进中→待领取,E3)" + }, + { + "file": "crm-opportunity/src/main/java/com/crm/opportunity/controller/OpportunityTransitionController.java", + "className": "OpportunityTransitionController", + "http": "POST", + "url": "/api/opportunity/pause", + "tags": [ + "A3 商机管理/状态流转" + ], + "summary": "暂缓(推进中→暂缓中,E4)" + }, + { + "file": "crm-opportunity/src/main/java/com/crm/opportunity/controller/OpportunityTransitionController.java", + "className": "OpportunityTransitionController", + "http": "POST", + "url": "/api/opportunity/resume", + "tags": [ + "A3 商机管理/状态流转" + ], + "summary": "取消暂缓(暂缓中→推进中,E5)" + }, + { + "file": "crm-opportunity/src/main/java/com/crm/opportunity/controller/OpportunityTransitionController.java", + "className": "OpportunityTransitionController", + "http": "POST", + "url": "/api/opportunity/close", + "tags": [ + "A3 商机管理/状态流转" + ], + "summary": "关闭商机(推进中/暂缓中→已关闭,E6)" + }, + { + "file": "crm-opportunity/src/main/java/com/crm/opportunity/controller/OpportunityTransitionController.java", + "className": "OpportunityTransitionController", + "http": "POST", + "url": "/api/opportunity/close-batch", + "tags": [ + "A3 商机管理/状态流转" + ], + "summary": "批量关闭(推进中/暂缓中→已关闭,E6)" + }, + { + "file": "crm-opportunity/src/main/java/com/crm/opportunity/controller/OpportunityTransitionController.java", + "className": "OpportunityTransitionController", + "http": "POST", + "url": "/api/opportunity/reopen", + "tags": [ + "A3 商机管理/状态流转" + ], + "summary": "重启商机(已关闭→推进中,E7)" + }, + { + "file": "crm-opportunity/src/main/java/com/crm/opportunity/controller/OpportunityTransitionController.java", + "className": "OpportunityTransitionController", + "http": "POST", + "url": "/api/opportunity/handover", + "tags": [ + "A3 商机管理/状态流转" + ], + "summary": "移交商机(推进中/暂缓中自环换owner,E9)" + }, + { + "file": "crm-rule/src/main/java/com/crm/rule/controller/CustomerDedupRuleController.java", + "className": "CustomerDedupRuleController", + "http": "GET", + "url": "/api/rule/customer/dedup", + "tags": [ + "A7 后台管理/客户管理设置/查重设置" + ], + "summary": "读当前配置(全局单例)" + }, + { + "file": "crm-rule/src/main/java/com/crm/rule/controller/CustomerDedupRuleController.java", + "className": "CustomerDedupRuleController", + "http": "POST", + "url": "/api/rule/customer/dedup/save", + "tags": [ + "A7 后台管理/客户管理设置/查重设置" + ], + "summary": "保存配置(全量覆盖,保存即生效)" + }, + { + "file": "crm-rule/src/main/java/com/crm/rule/controller/CustomerReminderRuleController.java", + "className": "CustomerReminderRuleController", + "http": "GET", + "url": "/api/rule/customer/reminder", + "tags": [ + "A7 后台管理/客户管理设置/超期未跟进提醒" + ], + "summary": "读当前配置(全局单例)" + }, + { + "file": "crm-rule/src/main/java/com/crm/rule/controller/CustomerReminderRuleController.java", + "className": "CustomerReminderRuleController", + "http": "POST", + "url": "/api/rule/customer/reminder/save", + "tags": [ + "A7 后台管理/客户管理设置/超期未跟进提醒" + ], + "summary": "保存配置(全量覆盖,保存即生效)" + }, + { + "file": "crm-rule/src/main/java/com/crm/rule/controller/LeadPoolController.java", + "className": "LeadPoolController", + "http": "POST", + "url": "/api/rule/pool/page", + "tags": [ + "A2 线索管理/线索设置", + "A7 后台管理/线索规则" + ], + "summary": "公海池分页列表" + }, + { + "file": "crm-rule/src/main/java/com/crm/rule/controller/LeadPoolController.java", + "className": "LeadPoolController", + "http": "GET", + "url": "/api/rule/pool/detail", + "tags": [ + "A2 线索管理/线索设置", + "A7 后台管理/线索规则" + ], + "summary": "公海池详情(含省份/市/区/人员)" + }, + { + "file": "crm-rule/src/main/java/com/crm/rule/controller/LeadPoolController.java", + "className": "LeadPoolController", + "http": "POST", + "url": "/api/rule/pool/saveOrUpdate", + "tags": [ + "A2 线索管理/线索设置", + "A7 后台管理/线索规则" + ], + "summary": "新建/编辑公海池" + }, + { + "file": "crm-rule/src/main/java/com/crm/rule/controller/LeadPoolController.java", + "className": "LeadPoolController", + "http": "POST", + "url": "/api/rule/pool/delete", + "tags": [ + "A2 线索管理/线索设置", + "A7 后台管理/线索规则" + ], + "summary": "删除公海池(软删除,级联清关联表)" + }, + { + "file": "crm-rule/src/main/java/com/crm/rule/controller/LeadPoolController.java", + "className": "LeadPoolController", + "http": "POST", + "url": "/api/rule/pool/delete-batch", + "tags": [ + "A2 线索管理/线索设置", + "A7 后台管理/线索规则" + ], + "summary": "批量删除公海池(非原子、逐条、部分成功)" + }, + { + "file": "crm-rule/src/main/java/com/crm/rule/controller/OpportunityPoolRuleController.java", + "className": "OpportunityPoolRuleController", + "http": "POST", + "url": "/api/rule/opp-pool-rule/page", + "tags": [ + "A7 后台管理/商机规则/公海规则" + ], + "summary": "公海规则分页列表(按版本维度展示)" + }, + { + "file": "crm-rule/src/main/java/com/crm/rule/controller/OpportunityPoolRuleController.java", + "className": "OpportunityPoolRuleController", + "http": "GET", + "url": "/api/rule/opp-pool-rule/detail", + "tags": [ + "A7 后台管理/商机规则/公海规则" + ], + "summary": "公海规则详情(含适用部门)" + }, + { + "file": "crm-rule/src/main/java/com/crm/rule/controller/OpportunityPoolRuleController.java", + "className": "OpportunityPoolRuleController", + "http": "POST", + "url": "/api/rule/opp-pool-rule/save-draft", + "tags": [ + "A7 后台管理/商机规则/公海规则" + ], + "summary": "保存草稿(新建/原位编辑草稿/从发布中停用生成新草稿)" + }, + { + "file": "crm-rule/src/main/java/com/crm/rule/controller/OpportunityPoolRuleController.java", + "className": "OpportunityPoolRuleController", + "http": "POST", + "url": "/api/rule/opp-pool-rule/publish", + "tags": [ + "A7 后台管理/商机规则/公海规则" + ], + "summary": "保存并发布(原发布中转停用、原默认取消默认、部门覆盖校验)" + }, + { + "file": "crm-rule/src/main/java/com/crm/rule/controller/OpportunityPoolRuleController.java", + "className": "OpportunityPoolRuleController", + "http": "POST", + "url": "/api/rule/opp-pool-rule/copy", + "tags": [ + "A7 后台管理/商机规则/公海规则" + ], + "summary": "复制规则(独立新规则:新编码 + V1.0 草稿)" + }, + { + "file": "crm-rule/src/main/java/com/crm/rule/controller/OpportunityPoolRuleController.java", + "className": "OpportunityPoolRuleController", + "http": "POST", + "url": "/api/rule/opp-pool-rule/disable", + "tags": [ + "A7 后台管理/商机规则/公海规则" + ], + "summary": "停用(仅发布中可停用)" + }, + { + "file": "crm-rule/src/main/java/com/crm/rule/controller/OpportunityPoolRuleController.java", + "className": "OpportunityPoolRuleController", + "http": "POST", + "url": "/api/rule/opp-pool-rule/delete", + "tags": [ + "A7 后台管理/商机规则/公海规则" + ], + "summary": "删除(仅草稿可删)" + }, + { + "file": "crm-rule/src/main/java/com/crm/rule/controller/OpportunityPoolRuleController.java", + "className": "OpportunityPoolRuleController", + "http": "GET", + "url": "/api/rule/opp-pool-rule/versions", + "tags": [ + "A7 后台管理/商机规则/公海规则" + ], + "summary": "同族版本列表(按 ruleCode 查所有版本)" + }, + { + "file": "crm-rule/src/main/java/com/crm/rule/controller/OpportunitySchemeCardTemplateController.java", + "className": "OpportunitySchemeCardTemplateController", + "http": "POST", + "url": "/api/rule/opp-scheme-template/page", + "tags": [ + "A7 后台管理/商机规则/方案卡模板" + ], + "summary": "方案卡模板分页列表(按版本维度展示)" + }, + { + "file": "crm-rule/src/main/java/com/crm/rule/controller/OpportunitySchemeCardTemplateController.java", + "className": "OpportunitySchemeCardTemplateController", + "http": "GET", + "url": "/api/rule/opp-scheme-template/detail", + "tags": [ + "A7 后台管理/商机规则/方案卡模板" + ], + "summary": "方案卡模板详情(含适用部门 + 字段项有序列表)" + }, + { + "file": "crm-rule/src/main/java/com/crm/rule/controller/OpportunitySchemeCardTemplateController.java", + "className": "OpportunitySchemeCardTemplateController", + "http": "GET", + "url": "/api/rule/opp-scheme-template/field-defs", + "tags": [ + "A7 后台管理/商机规则/方案卡模板" + ], + "summary": "系统字段库列表(模板配置页「选字段」数据源,只读)" + }, + { + "file": "crm-rule/src/main/java/com/crm/rule/controller/OpportunitySchemeCardTemplateController.java", + "className": "OpportunitySchemeCardTemplateController", + "http": "POST", + "url": "/api/rule/opp-scheme-template/save-draft", + "tags": [ + "A7 后台管理/商机规则/方案卡模板" + ], + "summary": "保存草稿(新建/原位编辑草稿/从发布中停用生成新草稿;字段项全量替换)" + }, + { + "file": "crm-rule/src/main/java/com/crm/rule/controller/OpportunitySchemeCardTemplateController.java", + "className": "OpportunitySchemeCardTemplateController", + "http": "POST", + "url": "/api/rule/opp-scheme-template/publish", + "tags": [ + "A7 后台管理/商机规则/方案卡模板" + ], + "summary": "保存并发布(至少一个字段项;原发布中转停用、原默认取消默认)" + }, + { + "file": "crm-rule/src/main/java/com/crm/rule/controller/OpportunitySchemeCardTemplateController.java", + "className": "OpportunitySchemeCardTemplateController", + "http": "POST", + "url": "/api/rule/opp-scheme-template/copy", + "tags": [ + "A7 后台管理/商机规则/方案卡模板" + ], + "summary": "复制模板(独立新模板:新编码 + V1.0 草稿,字段配置随复制)" + }, + { + "file": "crm-rule/src/main/java/com/crm/rule/controller/OpportunitySchemeCardTemplateController.java", + "className": "OpportunitySchemeCardTemplateController", + "http": "POST", + "url": "/api/rule/opp-scheme-template/disable", + "tags": [ + "A7 后台管理/商机规则/方案卡模板" + ], + "summary": "停用(仅发布中可停用)" + }, + { + "file": "crm-rule/src/main/java/com/crm/rule/controller/OpportunitySchemeCardTemplateController.java", + "className": "OpportunitySchemeCardTemplateController", + "http": "POST", + "url": "/api/rule/opp-scheme-template/delete", + "tags": [ + "A7 后台管理/商机规则/方案卡模板" + ], + "summary": "删除(仅草稿可删,级联删字段项与适用部门)" + }, + { + "file": "crm-rule/src/main/java/com/crm/rule/controller/OpportunitySchemeCardTemplateController.java", + "className": "OpportunitySchemeCardTemplateController", + "http": "GET", + "url": "/api/rule/opp-scheme-template/versions", + "tags": [ + "A7 后台管理/商机规则/方案卡模板" + ], + "summary": "同族版本列表(按 templateCode 查所有版本)" + }, + { + "file": "crm-rule/src/main/java/com/crm/rule/controller/OpportunityStageTemplateController.java", + "className": "OpportunityStageTemplateController", + "http": "POST", + "url": "/api/rule/opp-stage-template/page", + "tags": [ + "A7 后台管理/商机规则/阶段模板" + ], + "summary": "阶段模板分页列表(按版本维度展示)" + }, + { + "file": "crm-rule/src/main/java/com/crm/rule/controller/OpportunityStageTemplateController.java", + "className": "OpportunityStageTemplateController", + "http": "GET", + "url": "/api/rule/opp-stage-template/detail", + "tags": [ + "A7 后台管理/商机规则/阶段模板" + ], + "summary": "阶段模板详情(含适用部门 + 阶段节点有序列表)" + }, + { + "file": "crm-rule/src/main/java/com/crm/rule/controller/OpportunityStageTemplateController.java", + "className": "OpportunityStageTemplateController", + "http": "POST", + "url": "/api/rule/opp-stage-template/save-draft", + "tags": [ + "A7 后台管理/商机规则/阶段模板" + ], + "summary": "保存草稿(新建/原位编辑草稿/从发布中停用生成新草稿;节点全量替换)" + }, + { + "file": "crm-rule/src/main/java/com/crm/rule/controller/OpportunityStageTemplateController.java", + "className": "OpportunityStageTemplateController", + "http": "POST", + "url": "/api/rule/opp-stage-template/publish", + "tags": [ + "A7 后台管理/商机规则/阶段模板" + ], + "summary": "保存并发布(除固定节点外至少一个阶段节点;原发布中转停用、原默认取消默认)" + }, + { + "file": "crm-rule/src/main/java/com/crm/rule/controller/OpportunityStageTemplateController.java", + "className": "OpportunityStageTemplateController", + "http": "POST", + "url": "/api/rule/opp-stage-template/copy", + "tags": [ + "A7 后台管理/商机规则/阶段模板" + ], + "summary": "复制模板(独立新模板:新编码 + V1.0 草稿,节点随复制)" + }, + { + "file": "crm-rule/src/main/java/com/crm/rule/controller/OpportunityStageTemplateController.java", + "className": "OpportunityStageTemplateController", + "http": "POST", + "url": "/api/rule/opp-stage-template/disable", + "tags": [ + "A7 后台管理/商机规则/阶段模板" + ], + "summary": "停用(仅发布中可停用)" + }, + { + "file": "crm-rule/src/main/java/com/crm/rule/controller/OpportunityStageTemplateController.java", + "className": "OpportunityStageTemplateController", + "http": "POST", + "url": "/api/rule/opp-stage-template/delete", + "tags": [ + "A7 后台管理/商机规则/阶段模板" + ], + "summary": "删除(仅草稿可删,级联删节点与适用部门)" + }, + { + "file": "crm-rule/src/main/java/com/crm/rule/controller/OpportunityStageTemplateController.java", + "className": "OpportunityStageTemplateController", + "http": "GET", + "url": "/api/rule/opp-stage-template/versions", + "tags": [ + "A7 后台管理/商机规则/阶段模板" + ], + "summary": "同族版本列表(按 templateCode 查所有版本)" + }, + { + "file": "crm-rule/src/main/java/com/crm/rule/controller/RegionController.java", + "className": "RegionController", + "http": "GET", + "url": "/api/rule/region/list", + "tags": [ + "公共依赖/行政区划" + ], + "summary": "按上级ID查子区划(parentId 不传则查省级)" + }, + { + "file": "crm-rule/src/main/java/com/crm/rule/controller/RegionController.java", + "className": "RegionController", + "http": "GET", + "url": "/api/rule/region/level", + "tags": [ + "公共依赖/行政区划" + ], + "summary": "按层级查(1=省 2=市 3=区)" + }, + { + "file": "crm-preference/src/main/java/com/crm/preference/controller/ColumnPreferenceController.java", + "className": "ColumnPreferenceController", + "http": "GET", + "url": "/api/preference/get", + "tags": [ + "A2 线索管理/线索公海", + "A2 线索管理/我的线索", + "A2 线索管理/我的关注", + "A2 线索管理/线索管理", + "A4 客户管理/客户总览", + "A4 客户管理/我的客户", + "A4 客户管理/客户公海", + "A4 客户管理/联系人", + "A3 商机管理/销售机会", + "A3 商机管理/商机管理", + "A3 商机管理/商机公海" + ], + "summary": "读取当前用户在某 scope 的列偏好" + }, + { + "file": "crm-preference/src/main/java/com/crm/preference/controller/ColumnPreferenceController.java", + "className": "ColumnPreferenceController", + "http": "POST", + "url": "/api/preference/save", + "tags": [ + "A2 线索管理/线索公海", + "A2 线索管理/我的线索", + "A2 线索管理/我的关注", + "A2 线索管理/线索管理", + "A4 客户管理/客户总览", + "A4 客户管理/我的客户", + "A4 客户管理/客户公海", + "A4 客户管理/联系人", + "A3 商机管理/销售机会", + "A3 商机管理/商机管理", + "A3 商机管理/商机公海" + ], + "summary": "保存当前用户在某 scope 的列偏好(显隐+顺序,一次写入)" + }, + { + "file": "crm-preference/src/main/java/com/crm/preference/controller/SavedViewController.java", + "className": "SavedViewController", + "http": "GET", + "url": "/api/preference/view/list", + "tags": [ + "A3 商机管理/销售机会/自定义视图" + ], + "summary": "列出当前用户在某 scope 的自定义视图(按 seqNo)" + }, + { + "file": "crm-preference/src/main/java/com/crm/preference/controller/SavedViewController.java", + "className": "SavedViewController", + "http": "POST", + "url": "/api/preference/view/save", + "tags": [ + "A3 商机管理/销售机会/自定义视图" + ], + "summary": "保存自定义视图(viewId 空=新建,非空=覆盖编辑;isDefault 单值互斥)" + }, + { + "file": "crm-preference/src/main/java/com/crm/preference/controller/SavedViewController.java", + "className": "SavedViewController", + "http": "POST", + "url": "/api/preference/view/delete", + "tags": [ + "A3 商机管理/销售机会/自定义视图" + ], + "summary": "删除自定义视图" + }, + { + "file": "crm-preference/src/main/java/com/crm/preference/controller/SavedViewController.java", + "className": "SavedViewController", + "http": "POST", + "url": "/api/preference/view/set-default", + "tags": [ + "A3 商机管理/销售机会/自定义视图" + ], + "summary": "图钉:设为该 scope 的默认视图(单值互斥)" + }, + { + "file": "crm-preference/src/main/java/com/crm/preference/controller/ViewFormController.java", + "className": "ViewFormController", + "http": "GET", + "url": "/api/preference/view-form/get", + "tags": [ + "A4 客户管理/客户总览", + "A4 客户管理/我的客户", + "A4 客户管理/客户公海", + "A4 客户管理/联系人", + "A3 商机管理/销售机会", + "A3 商机管理/商机管理", + "A3 商机管理/商机公海" + ], + "summary": "读取当前用户在某 scope 的视图形态(null=未设置,前端默认 list)" + }, + { + "file": "crm-preference/src/main/java/com/crm/preference/controller/ViewFormController.java", + "className": "ViewFormController", + "http": "POST", + "url": "/api/preference/view-form/save", + "tags": [ + "A4 客户管理/客户总览", + "A4 客户管理/我的客户", + "A4 客户管理/客户公海", + "A4 客户管理/联系人", + "A3 商机管理/销售机会", + "A3 商机管理/商机管理", + "A3 商机管理/商机公海" + ], + "summary": "保存当前用户在某 scope 的视图形态(list/split/board,一次写入)" + }, + { + "file": "crm-dict/src/main/java/com/crm/dict/controller/DictGroupController.java", + "className": "DictGroupController", + "http": "POST", + "url": "/api/dict/group/page", + "tags": [ + "A7 后台管理/数据字典-分组" + ], + "summary": "分组分页(keyword 匹配名称/编码,status 筛选)" + }, + { + "file": "crm-dict/src/main/java/com/crm/dict/controller/DictGroupController.java", + "className": "DictGroupController", + "http": "POST", + "url": "/api/dict/group/saveOrUpdate", + "tags": [ + "A7 后台管理/数据字典-分组" + ], + "summary": "新建/编辑分组(新建编码必填;编辑时编码/内置标记/状态只读)" + }, + { + "file": "crm-dict/src/main/java/com/crm/dict/controller/DictGroupController.java", + "className": "DictGroupController", + "http": "POST", + "url": "/api/dict/group/delete", + "tags": [ + "A7 后台管理/数据字典-分组" + ], + "summary": "删除分组(有字典项或内置分组则阻断)" + }, + { + "file": "crm-dict/src/main/java/com/crm/dict/controller/DictGroupController.java", + "className": "DictGroupController", + "http": "POST", + "url": "/api/dict/group/status", + "tags": [ + "A7 后台管理/数据字典-分组" + ], + "summary": "分组启停(停用保留默认项休眠,二次确认由前端承担)" + }, + { + "file": "crm-dict/src/main/java/com/crm/dict/controller/DictGroupController.java", + "className": "DictGroupController", + "http": "GET", + "url": "/api/dict/group/enabled-list", + "tags": [ + "A7 后台管理/数据字典-分组" + ], + "summary": "启用分组列表(新建字典项选分组用;基础数据,登录即可读)" + }, + { + "file": "crm-dict/src/main/java/com/crm/dict/controller/DictItemController.java", + "className": "DictItemController", + "http": "POST", + "url": "/api/dict/item/page", + "tags": [ + "A7 后台管理/数据字典-字典项" + ], + "summary": "字典项分页(groupId/keyword/status 筛选,附带默认/引用/有效可选标记)" + }, + { + "file": "crm-dict/src/main/java/com/crm/dict/controller/DictItemController.java", + "className": "DictItemController", + "http": "POST", + "url": "/api/dict/item/saveOrUpdate", + "tags": [ + "A7 后台管理/数据字典-字典项" + ], + "summary": "新建/编辑字典项(新建编码空自动生成;分组/编码创建后只读;值被引用后只读)" + }, + { + "file": "crm-dict/src/main/java/com/crm/dict/controller/DictItemController.java", + "className": "DictItemController", + "http": "POST", + "url": "/api/dict/item/delete", + "tags": [ + "A7 后台管理/数据字典-字典项" + ], + "summary": "删除字典项(内置或被引用则阻断)" + }, + { + "file": "crm-dict/src/main/java/com/crm/dict/controller/DictItemController.java", + "className": "DictItemController", + "http": "POST", + "url": "/api/dict/item/force-delete", + "tags": [ + "A7 后台管理/数据字典-字典项" + ], + "summary": "强制删除字典项(绕过引用计数校验,计数飘高兜底入口)" + }, + { + "file": "crm-dict/src/main/java/com/crm/dict/controller/DictItemController.java", + "className": "DictItemController", + "http": "POST", + "url": "/api/dict/item/status", + "tags": [ + "A7 后台管理/数据字典-字典项" + ], + "summary": "字典项启停(停用若为默认项则自动取消默认)" + }, + { + "file": "crm-dict/src/main/java/com/crm/dict/controller/DictItemController.java", + "className": "DictItemController", + "http": "POST", + "url": "/api/dict/item/set-default", + "tags": [ + "A7 后台管理/数据字典-字典项" + ], + "summary": "设为分组默认项(同事务自动取消同组原默认)" + }, + { + "file": "crm-dict/src/main/java/com/crm/dict/controller/DictItemController.java", + "className": "DictItemController", + "http": "GET", + "url": "/api/dict/item/enabled-list", + "tags": [ + "A7 后台管理/数据字典-字典项" + ], + "summary": "某分组启用项列表(业务选择器渲染用,走 10s 本地缓存;基础数据,登录即可读)" + }, + { + "file": "crm-customer/src/main/java/com/crm/customer/controller/CustomerAgreementController.java", + "className": "CustomerAgreementController", + "http": "POST", + "url": "/api/customer/agreement/create", + "tags": [ + "A4 客户管理/战略协议" + ], + "summary": "新增战略协议" + }, + { + "file": "crm-customer/src/main/java/com/crm/customer/controller/CustomerAgreementController.java", + "className": "CustomerAgreementController", + "http": "POST", + "url": "/api/customer/agreement/edit", + "tags": [ + "A4 客户管理/战略协议" + ], + "summary": "编辑战略协议" + }, + { + "file": "crm-customer/src/main/java/com/crm/customer/controller/CustomerAgreementController.java", + "className": "CustomerAgreementController", + "http": "POST", + "url": "/api/customer/agreement/delete", + "tags": [ + "A4 客户管理/战略协议" + ], + "summary": "删除战略协议" + }, + { + "file": "crm-customer/src/main/java/com/crm/customer/controller/CustomerAgreementController.java", + "className": "CustomerAgreementController", + "http": "GET", + "url": "/api/customer/agreement/detail", + "tags": [ + "A4 客户管理/战略协议" + ], + "summary": "战略协议详情" + }, + { + "file": "crm-customer/src/main/java/com/crm/customer/controller/CustomerAgreementController.java", + "className": "CustomerAgreementController", + "http": "GET", + "url": "/api/customer/agreement/list", + "tags": [ + "A4 客户管理/战略协议" + ], + "summary": "战略协议页签列表" + }, + { + "file": "crm-customer/src/main/java/com/crm/customer/controller/CustomerContactController.java", + "className": "CustomerContactController", + "http": "POST", + "url": "/api/customer/contact/create", + "tags": [ + "A4 客户管理/联系人" + ], + "summary": "新增联系人" + }, + { + "file": "crm-customer/src/main/java/com/crm/customer/controller/CustomerContactController.java", + "className": "CustomerContactController", + "http": "POST", + "url": "/api/customer/contact/edit", + "tags": [ + "A4 客户管理/联系人" + ], + "summary": "编辑联系人" + }, + { + "file": "crm-customer/src/main/java/com/crm/customer/controller/CustomerContactController.java", + "className": "CustomerContactController", + "http": "POST", + "url": "/api/customer/contact/delete", + "tags": [ + "A4 客户管理/联系人" + ], + "summary": "删除联系人" + }, + { + "file": "crm-customer/src/main/java/com/crm/customer/controller/CustomerContactController.java", + "className": "CustomerContactController", + "http": "GET", + "url": "/api/customer/contact/detail", + "tags": [ + "A4 客户管理/联系人" + ], + "summary": "联系人详情" + }, + { + "file": "crm-customer/src/main/java/com/crm/customer/controller/CustomerContactController.java", + "className": "CustomerContactController", + "http": "GET", + "url": "/api/customer/contact/page", + "tags": [ + "A4 客户管理/联系人" + ], + "summary": "顶级联系人列表" + }, + { + "file": "crm-customer/src/main/java/com/crm/customer/controller/CustomerContactController.java", + "className": "CustomerContactController", + "http": "GET", + "url": "/api/customer/contact/search", + "tags": [ + "A4 客户管理/联系人" + ], + "summary": "联系人全局搜索" + }, + { + "file": "crm-customer/src/main/java/com/crm/customer/controller/CustomerContactController.java", + "className": "CustomerContactController", + "http": "GET", + "url": "/api/customer/contact/check-phone", + "tags": [ + "A4 客户管理/联系人" + ], + "summary": "电话软提示" + }, + { + "file": "crm-customer/src/main/java/com/crm/customer/controller/CustomerController.java", + "className": "CustomerController", + "http": "POST", + "url": "/api/customer/create", + "tags": [ + "A4 客户管理/我的客户" + ], + "summary": "新增客户" + }, + { + "file": "crm-customer/src/main/java/com/crm/customer/controller/CustomerController.java", + "className": "CustomerController", + "http": "POST", + "url": "/api/customer/edit", + "tags": [ + "A4 客户管理/客户详情", + "A4 客户管理/我的客户" + ], + "summary": "编辑客户" + }, + { + "file": "crm-customer/src/main/java/com/crm/customer/controller/CustomerController.java", + "className": "CustomerController", + "http": "GET", + "url": "/api/customer/detail", + "tags": [ + "A4 客户管理/客户详情" + ], + "summary": "客户详情" + }, + { + "file": "crm-customer/src/main/java/com/crm/customer/controller/CustomerController.java", + "className": "CustomerController", + "http": "POST", + "url": "/api/customer/page", + "tags": [ + "A4 客户管理/客户总览", + "A4 客户管理/我的客户", + "A4 客户管理/客户公海" + ], + "summary": "客户分页" + }, + { + "file": "crm-customer/src/main/java/com/crm/customer/controller/CustomerController.java", + "className": "CustomerController", + "http": "POST", + "url": "/api/customer/search", + "tags": [ + "A3 商机管理/销售机会" + ], + "summary": "商机侧客户搜索" + }, + { + "file": "crm-customer/src/main/java/com/crm/customer/controller/CustomerController.java", + "className": "CustomerController", + "http": "POST", + "url": "/api/customer/quick-create", + "tags": [ + "A4 客户管理/我的客户" + ], + "summary": "快速创建客户" + }, + { + "file": "crm-customer/src/main/java/com/crm/customer/controller/CustomerController.java", + "className": "CustomerController", + "http": "GET", + "url": "/api/customer/contacts", + "tags": [ + "A3 商机管理/销售机会" + ], + "summary": "按客户查联系人列表" + }, + { + "file": "crm-customer/src/main/java/com/crm/customer/controller/CustomerController.java", + "className": "CustomerController", + "http": "GET", + "url": "/api/customer/check-name", + "tags": [ + "A4 客户管理/客户查重" + ], + "summary": "名称相似提示" + }, + { + "file": "crm-customer/src/main/java/com/crm/customer/controller/CustomerController.java", + "className": "CustomerController", + "http": "GET", + "url": "/api/customer/check-credit-code", + "tags": [ + "A4 客户管理/客户查重" + ], + "summary": "信用代码查重" + }, + { + "file": "crm-customer/src/main/java/com/crm/customer/controller/CustomerController.java", + "className": "CustomerController", + "http": "GET", + "url": "/api/customer/company-lookup", + "tags": [ + "A4 客户管理/我的客户" + ], + "summary": "工商信息查询" + }, + { + "file": "crm-customer/src/main/java/com/crm/customer/controller/CustomerController.java", + "className": "CustomerController", + "http": "POST", + "url": "/api/customer/company-lookup/batch-update", + "tags": [ + "A4 客户管理/我的客户" + ], + "summary": "批量更新工商信息" + }, + { + "file": "crm-customer/src/main/java/com/crm/customer/controller/CustomerDetailController.java", + "className": "CustomerDetailController", + "http": "GET", + "url": "/api/customer/detail-head", + "tags": [ + "A4 客户管理/客户详情" + ], + "summary": "详情公共头部" + }, + { + "file": "crm-customer/src/main/java/com/crm/customer/controller/CustomerDetailController.java", + "className": "CustomerDetailController", + "http": "GET", + "url": "/api/customer/member/list", + "tags": [ + "A4 客户管理/客户详情/团队成员" + ], + "summary": "团队成员页签" + }, + { + "file": "crm-customer/src/main/java/com/crm/customer/controller/CustomerDetailController.java", + "className": "CustomerDetailController", + "http": "POST", + "url": "/api/customer/member/add", + "tags": [ + "A4 客户管理/客户详情/团队成员" + ], + "summary": "添加团队成员" + }, + { + "file": "crm-customer/src/main/java/com/crm/customer/controller/CustomerDetailController.java", + "className": "CustomerDetailController", + "http": "POST", + "url": "/api/customer/member/remove", + "tags": [ + "A4 客户管理/客户详情/团队成员" + ], + "summary": "移除团队成员" + }, + { + "file": "crm-customer/src/main/java/com/crm/customer/controller/CustomerDetailController.java", + "className": "CustomerDetailController", + "http": "GET", + "url": "/api/customer/opportunity/page", + "tags": [ + "A4 客户管理/客户详情/关联商机" + ], + "summary": "关联商机页签" + }, + { + "file": "crm-customer/src/main/java/com/crm/customer/controller/CustomerDetailController.java", + "className": "CustomerDetailController", + "http": "GET", + "url": "/api/customer/oplog/page", + "tags": [ + "A4 客户管理/客户详情/操作日志" + ], + "summary": "操作日志分页" + }, + { + "file": "crm-customer/src/main/java/com/crm/customer/controller/CustomerDetailController.java", + "className": "CustomerDetailController", + "http": "POST", + "url": "/api/customer/follow/add", + "tags": [ + "A4 客户管理/客户详情/跟进记录" + ], + "summary": "新增跟进" + }, + { + "file": "crm-customer/src/main/java/com/crm/customer/controller/CustomerDetailController.java", + "className": "CustomerDetailController", + "http": "GET", + "url": "/api/customer/follow/page", + "tags": [ + "A4 客户管理/客户详情/跟进记录" + ], + "summary": "跟进记录分页" + }, + { + "file": "crm-customer/src/main/java/com/crm/customer/controller/CustomerFocusController.java", + "className": "CustomerFocusController", + "http": "POST", + "url": "/api/customer/focus", + "tags": [ + "A4 客户管理/客户公海" + ], + "summary": "关注客户" + }, + { + "file": "crm-customer/src/main/java/com/crm/customer/controller/CustomerFocusController.java", + "className": "CustomerFocusController", + "http": "POST", + "url": "/api/customer/unfocus", + "tags": [ + "A4 客户管理/客户公海" + ], + "summary": "取消关注客户" + }, + { + "file": "crm-customer/src/main/java/com/crm/customer/controller/CustomerFocusController.java", + "className": "CustomerFocusController", + "http": "POST", + "url": "/api/customer/star", + "tags": [ + "A4 客户管理/客户详情" + ], + "summary": "标记重点客户" + }, + { + "file": "crm-customer/src/main/java/com/crm/customer/controller/CustomerFocusController.java", + "className": "CustomerFocusController", + "http": "POST", + "url": "/api/customer/unstar", + "tags": [ + "A4 客户管理/客户详情" + ], + "summary": "取消重点标记" + }, + { + "file": "crm-customer/src/main/java/com/crm/customer/controller/CustomerFocusController.java", + "className": "CustomerFocusController", + "http": "POST", + "url": "/api/customer/focus-batch", + "tags": [ + "A4 客户管理/客户公海" + ], + "summary": "批量关注客户" + }, + { + "file": "crm-customer/src/main/java/com/crm/customer/controller/CustomerImportController.java", + "className": "CustomerImportController", + "http": "POST", + "url": "/api/customer/import/upload", + "tags": [ + "A4 客户管理/我的客户/客户导入", + "A4 客户管理/客户公海" + ], + "summary": "上传导入文件并预校验" + }, + { + "file": "crm-customer/src/main/java/com/crm/customer/controller/CustomerImportController.java", + "className": "CustomerImportController", + "http": "POST", + "url": "/api/customer/import/confirm", + "tags": [ + "A4 客户管理/我的客户/客户导入", + "A4 客户管理/客户公海" + ], + "summary": "确认执行导入" + }, + { + "file": "crm-customer/src/main/java/com/crm/customer/controller/CustomerImportController.java", + "className": "CustomerImportController", + "http": "GET", + "url": "/api/customer/import/result", + "tags": [ + "A4 客户管理/我的客户/客户导入", + "A4 客户管理/客户公海" + ], + "summary": "任务结果" + }, + { + "file": "crm-customer/src/main/java/com/crm/customer/controller/CustomerImportController.java", + "className": "CustomerImportController", + "http": "GET", + "url": "/api/customer/import/failures", + "tags": [ + "A4 客户管理/我的客户/客户导入", + "A4 客户管理/客户公海" + ], + "summary": "失败/疑似重复明细" + }, + { + "file": "crm-customer/src/main/java/com/crm/customer/controller/CustomerImportController.java", + "className": "CustomerImportController", + "http": "GET", + "url": "/api/customer/import/page", + "tags": [ + "A4 客户管理/我的客户/客户导入", + "A4 客户管理/客户公海" + ], + "summary": "最近导入记录" + }, + { + "file": "crm-customer/src/main/java/com/crm/customer/controller/CustomerImportController.java", + "className": "CustomerImportController", + "http": "GET", + "url": "/api/customer/import/template", + "tags": [ + "A4 客户管理/我的客户/客户导入", + "A4 客户管理/客户公海" + ], + "summary": "下载导入模板" + }, + { + "file": "crm-customer/src/main/java/com/crm/customer/controller/CustomerOwnershipController.java", + "className": "CustomerOwnershipController", + "http": "POST", + "url": "/api/customer/claim", + "tags": [ + "A4 客户管理/客户总览", + "A4 客户管理/我的客户", + "A4 客户管理/客户公海" + ], + "summary": "领取客户(公海→当前用户)" + }, + { + "file": "crm-customer/src/main/java/com/crm/customer/controller/CustomerOwnershipController.java", + "className": "CustomerOwnershipController", + "http": "POST", + "url": "/api/customer/claim-batch", + "tags": [ + "A4 客户管理/客户总览", + "A4 客户管理/我的客户", + "A4 客户管理/客户公海" + ], + "summary": "批量领取" + }, + { + "file": "crm-customer/src/main/java/com/crm/customer/controller/CustomerOwnershipController.java", + "className": "CustomerOwnershipController", + "http": "POST", + "url": "/api/customer/assign", + "tags": [ + "A4 客户管理/客户总览", + "A4 客户管理/我的客户", + "A4 客户管理/客户公海" + ], + "summary": "分配客户(换销售负责人)" + }, + { + "file": "crm-customer/src/main/java/com/crm/customer/controller/CustomerOwnershipController.java", + "className": "CustomerOwnershipController", + "http": "POST", + "url": "/api/customer/assign-batch", + "tags": [ + "A4 客户管理/客户总览", + "A4 客户管理/我的客户", + "A4 客户管理/客户公海" + ], + "summary": "批量分配" + }, + { + "file": "crm-customer/src/main/java/com/crm/customer/controller/CustomerOwnershipController.java", + "className": "CustomerOwnershipController", + "http": "POST", + "url": "/api/customer/release-pool", + "tags": [ + "A4 客户管理/客户总览", + "A4 客户管理/我的客户", + "A4 客户管理/客户公海" + ], + "summary": "抛公海" + }, + { + "file": "crm-customer/src/main/java/com/crm/customer/controller/CustomerOwnershipController.java", + "className": "CustomerOwnershipController", + "http": "POST", + "url": "/api/customer/release-pool-batch", + "tags": [ + "A4 客户管理/客户总览", + "A4 客户管理/我的客户", + "A4 客户管理/客户公海" + ], + "summary": "批量抛公海" + }, + { + "file": "crm-customer/src/main/java/com/crm/customer/controller/CustomerOwnershipController.java", + "className": "CustomerOwnershipController", + "http": "POST", + "url": "/api/customer/archive", + "tags": [ + "A4 客户管理/客户总览", + "A4 客户管理/我的客户", + "A4 客户管理/客户公海" + ], + "summary": "归档客户(有效→已归档)" + }, + { + "file": "crm-customer/src/main/java/com/crm/customer/controller/CustomerOwnershipController.java", + "className": "CustomerOwnershipController", + "http": "POST", + "url": "/api/customer/archive-batch", + "tags": [ + "A4 客户管理/客户总览", + "A4 客户管理/我的客户", + "A4 客户管理/客户公海" + ], + "summary": "批量归档" + }, + { + "file": "crm-customer/src/main/java/com/crm/customer/controller/CustomerOwnershipController.java", + "className": "CustomerOwnershipController", + "http": "POST", + "url": "/api/customer/restore", + "tags": [ + "A4 客户管理/客户总览", + "A4 客户管理/我的客户", + "A4 客户管理/客户公海" + ], + "summary": "恢复客户(已归档→有效)" + }, + { + "file": "crm-customer/src/main/java/com/crm/customer/controller/CustomerPingController.java", + "className": "CustomerPingController", + "http": "GET", + "url": "/api/customer/ping", + "tags": [], + "summary": "客户模块健康探针" + }, + { + "file": "crm-customer/src/main/java/com/crm/customer/controller/CustomerTransferController.java", + "className": "CustomerTransferController", + "http": "GET", + "url": "/api/customer/transfer/preview", + "tags": [ + "A4 客户管理/客户交割" + ], + "summary": "发起前客户预览" + }, + { + "file": "crm-customer/src/main/java/com/crm/customer/controller/CustomerTransferController.java", + "className": "CustomerTransferController", + "http": "POST", + "url": "/api/customer/transfer/initiate", + "tags": [ + "A4 客户管理/客户交割" + ], + "summary": "发起交接" + }, + { + "file": "crm-customer/src/main/java/com/crm/customer/controller/CustomerTransferController.java", + "className": "CustomerTransferController", + "http": "GET", + "url": "/api/customer/transfer/detail", + "tags": [ + "A4 客户管理/客户交割" + ], + "summary": "交接详情" + }, + { + "file": "crm-customer/src/main/java/com/crm/customer/controller/CustomerTransferController.java", + "className": "CustomerTransferController", + "http": "GET", + "url": "/api/customer/transfer/page", + "tags": [ + "A4 客户管理/客户交割" + ], + "summary": "交接记录分页" + }, + { + "file": "crm-customer/src/main/java/com/crm/customer/controller/CustomerTransferController.java", + "className": "CustomerTransferController", + "http": "POST", + "url": "/api/customer/transfer/assign", + "tags": [ + "A4 客户管理/客户交割" + ], + "summary": "客户分配(单个或批量)" + }, + { + "file": "crm-customer/src/main/java/com/crm/customer/controller/CustomerTransferController.java", + "className": "CustomerTransferController", + "http": "GET", + "url": "/api/customer/transfer/assignable", + "tags": [ + "A4 客户管理/客户交割" + ], + "summary": "可分配销售列表" + }, + { + "file": "crm-customer/src/main/java/com/crm/customer/controller/CustomerWorkspaceController.java", + "className": "CustomerWorkspaceController", + "http": "POST", + "url": "/api/customer/workspace/page", + "tags": [ + "A4 客户管理/客户总览", + "A4 客户管理/我的客户", + "A4 客户管理/客户公海" + ], + "summary": "workspace 列表分页" + }, + { + "file": "crm-customer/src/main/java/com/crm/customer/controller/CustomerWorkspaceController.java", + "className": "CustomerWorkspaceController", + "http": "POST", + "url": "/api/customer/workspace/board/summary", + "tags": [ + "A4 客户管理/客户总览/看板列表", + "A4 客户管理/我的客户/看板列表" + ], + "summary": "看板分组汇总" + }, + { + "file": "crm-customer/src/main/java/com/crm/customer/controller/CustomerWorkspaceController.java", + "className": "CustomerWorkspaceController", + "http": "POST", + "url": "/api/customer/workspace/board/cards", + "tags": [ + "A4 客户管理/客户总览/看板列表", + "A4 客户管理/我的客户/看板列表" + ], + "summary": "看板单列卡片" + } + ] +} \ No newline at end of file diff --git a/.scratch/customer-rework/bruno_scan_d.py b/.scratch/customer-rework/bruno_scan_d.py new file mode 100644 index 0000000..a1b2666 --- /dev/null +++ b/.scratch/customer-rework/bruno_scan_d.py @@ -0,0 +1,270 @@ +"""bruno-sync Step 2/3 (本机 D:\ 路径版, 由 bruno_scan.py 改路径而来): scan Spring controllers -> reconcile with docs repo. + +Outputs JSON: {apis: [...], report: {...}} +""" +import json +import os +import re +import sys + +if sys.stdout.encoding.lower() != "utf-8": + sys.stdout.reconfigure(encoding="utf-8") + +ROOTS = [ + "crm-auth/src/main/java", "crm-file/src/main/java", "crm-lead/src/main/java", + "crm-opportunity/src/main/java", "crm-rule/src/main/java", + "crm-preference/src/main/java", "crm-dict/src/main/java", + "crm-customer/src/main/java", +] +PROJECT = r"d:\code\crm-backend-matt" +DOCS = r"D:\code\crm-api-docs" + +def strip_comments(src): + src = re.sub(r"/\*.*?\*/", "", src, flags=re.S) + src = re.sub(r"//[^\n]*", "", src) + return src + +def extract_balanced(text, open_idx): + """text[open_idx] == '('. return inner content, end idx after ')'.""" + depth = 0 + i = open_idx + in_str = None + while i < len(text): + c = text[i] + if in_str: + if c == "\\": + i += 2 + continue + if c == in_str: + in_str = None + else: + if c in "\"'": + in_str = c + elif c == "(": + depth += 1 + elif c == ")": + depth -= 1 + if depth == 0: + return text[open_idx + 1:i], i + 1 + i += 1 + return text[open_idx + 1:], len(text) + +def parse_str_array(body): + """parse {'a','b'} or "a" -> list of strings; also allow bare string.""" + body = body.strip() + if body.startswith("{"): + return re.findall(r'"([^"]*)"', body) + m = re.match(r'^"([^"]*)"$', body) + return [m.group(1)] if m else [] + +def find_annotations(src, name): + """find all @Name(...) blocks, return list of inner contents.""" + out = [] + for m in re.finditer(r"@" + name + r"\s*\(", src): + inner, _ = extract_balanced(src, m.end() - 1) + out.append(inner) + return out + +def scan_source(): + apis = [] + conflicts = [] + for root in ROOTS: + base = os.path.join(PROJECT, root) + for dirpath, dirnames, filenames in os.walk(base): + for fn in filenames: + if not fn.endswith("Controller.java"): + continue + path = os.path.join(dirpath, fn) + src = strip_comments(open(path, encoding="utf-8").read()) + if "@RestController" not in src: + continue + cls_m = re.search(r"class\s+(\w+)", src) + cls = cls_m.group(1) if cls_m else fn[:-5] + prefixes = [] + for rm in re.finditer(r"@RequestMapping\s*\(", src): + inner, end = extract_balanced(src, rm.end() - 1) + if end <= len(src) and "class" in src[end:end + 200]: + vals = parse_str_array(inner) or re.findall(r'"([^"]*)"', inner) + pv = re.search(r'value\s*=\s*', inner) + prefixes = parse_str_array(inner[pv.end():]) if pv else vals + break + prefix = prefixes[0] if prefixes else "" + # class-level tags from @Tag(name=...) + cls_tags = [] + head = src[:cls_m.start()] + for tag_inner in find_annotations(head, "Tag"): + nm = re.search(r'name\s*=\s*"([^"]*)"', tag_inner) + if nm: + cls_tags.append(nm.group(1)) + # collect all @Operation blocks first (project style: @Operation BEFORE @Mapping) + ops = [] + for om in re.finditer(r"@Operation\s*\(", src): + op_inner, op_end = extract_balanced(src, om.end() - 1) + ops.append({"start": om.start(), "end": op_end, "inner": op_inner}) + # methods: find mapping annotations; assign the NEAREST @Operation BEFORE them + for mm in re.finditer(r"@(Get|Post|Put|Delete|Request)Mapping\s*(\(|$)", src, re.M): + anno_start = mm.start() + if mm.group(1) == "Request": + inner, end = extract_balanced(src, mm.end() - 1) if mm.group(2) == "(" else ("", mm.end()) + meth_m = re.search(r"method\s*=\s*RequestMethod\.(\w+)", inner) + if not meth_m: + continue # class-level @RequestMapping (already consumed) or no method + http = meth_m.group(1) + pv = re.search(r'(?:value\s*=\s*)?"([^"]*)"', inner) + sub = pv.group(1) if pv else "" + else: + http = mm.group(1).upper() + if mm.group(2) == "(": + inner, end = extract_balanced(src, mm.end() - 1) + pv = re.search(r'(?:value\s*=\s*)?"([^"]*)"', inner) + sub = pv.group(1) if pv else "" + else: + end = mm.end() + sub = "" + url = (prefix + sub) if sub.startswith("/") else (prefix + ("/" + sub if sub else "")) + # find owning @Operation: project has BOTH styles. + # forward style: @Operation ... @PreAuthorize? ... @Mapping (customer/lead/opp) + # trailing style: @Mapping ... @PreAuthorize ... @Operation (crm-auth role/resource) + op = None + for cand in reversed(ops): + if cand["end"] <= anno_start: + between = src[cand["end"]:anno_start] + if "{" in between: + continue # a method body separates them -> belongs to an earlier method + op = cand + break + if op is None: + body_brace = src.find("{", end) + if body_brace == -1: + body_brace = len(src) + for cand in ops: + if cand["start"] >= end and cand["start"] < body_brace: + op = cand + break + op_tags = None + summary = "" + if op is not None: + sm = re.search(r'summary\s*=\s*"([^"]*)"', op["inner"]) + if sm: + summary = sm.group(1) + tm = re.search(r"tags\s*=\s*(\{[^}]*\}|\"[^\"]*\")", op["inner"], re.S) + if tm: + op_tags = parse_str_array(tm.group(1)) + method_tags = [] + if op_tags is None: + # method-level @Tag between op end and mapping + back = src[anno_start - 800:anno_start] + t_m = None + for ti in find_annotations(back, "Tag"): + t_m = ti + if t_m: + nm = re.search(r'name\s*=\s*"([^"]*)"', t_m) + if nm: + method_tags = [nm.group(1)] + tags = op_tags if op_tags is not None else (method_tags if method_tags else cls_tags) + if not tags: + tags = [] + apis.append({ + "file": os.path.relpath(path, PROJECT).replace("\\", "/"), + "className": cls, "http": http, "url": url, + "tags": tags, "summary": summary, + }) + # key conflicts (method+url, before tag expansion) + seen = {} + for a in apis: + k = a["http"] + " " + a["url"] + seen.setdefault(k, []).append(a) + for k, v in seen.items(): + if len(v) > 1: + conflicts.append({"key": k, "files": [x["file"] for x in v]}) + return apis, conflicts + +def scan_docs(): + """return [{path, key, generated, folder}] for all .bru files.""" + out = [] + skip = {"node_modules", ".git", "environments"} + for dirpath, dirnames, filenames in os.walk(DOCS): + dirnames[:] = [d for d in dirnames if d not in skip] + for fn in filenames: + if not fn.endswith(".bru") or fn == "collection.bru" or fn == "folder.bru": + continue + path = os.path.join(dirpath, fn) + content = open(path, encoding="utf-8").read() + gen = bool(re.search(r"tags\s*:\s*\[[^\]]*generated", content, re.S)) + key = None + km = re.search(r"docs\s*\{.*?`([A-Z]+)\s+(\S+)`", content, re.S) + if km: + key = km.group(1) + " " + km.group(2) + folder = os.path.basename(dirpath) + out.append({"path": os.path.relpath(path, DOCS).replace("\\", "/"), + "key": key, "generated": gen, "folder": folder}) + return out + +def main(): + apis, conflicts = scan_source() + docs = scan_docs() + # expand source keys: one per (method+url, tag) + src_keys = {} + for a in apis: + tags = a["tags"] + if tags: + tl = list(tags) + else: + # no tag -> urlPattern fallback dir: module[/resource] + seg = [s for s in a["url"].split("/") if s] + if seg and seg[0] == "api": + seg = seg[1:] + tl = ["/".join(seg[:2])] + for t in tl: + k = (a["http"] + " " + a["url"], t) + if k in src_keys: + conflicts.append({"key": k[0] + " @" + str(t), "files": [src_keys[k]["file"], a["file"]]}) + else: + src_keys[k] = a + # file keys + file_keys = {} + for d in docs: + if not d["generated"]: + continue + if d["key"] is None: + d["unrecognized"] = True + continue + rel = d["path"] + parts = rel.split("/") + # tag = full dir path between repo root and file + tag = "/".join(parts[:-1]) + k = (d["key"], tag) + file_keys[k] = d + new_items = [] + del_items = [] + keep = 0 + for k in src_keys: + if k not in file_keys: + a = src_keys[k] + new_items.append({"key": k[0], "tag": k[1], "summary": a["summary"], + "file": a["file"], "className": a["className"]}) + for k, d in file_keys.items(): + if k not in src_keys: + del_items.append({"key": k[0], "tag": k[1], "path": d["path"]}) + for k in src_keys: + if k in file_keys: + keep += 1 + report = { + "source_api_count": len(apis), + "source_key_count": len(src_keys), + "generated_file_count": len([d for d in docs if d["generated"]]), + "private_file_count": len([d for d in docs if not d["generated"]]), + "unrecognized_count": len([d for d in docs if d.get("unrecognized")]), + "key_conflicts": conflicts, + "keep_count": keep, + "new_count": len(new_items), + "delete_file_count": len(set(x["path"] for x in del_items)), + "delete_distinct_url_count": len(set(x["key"] for x in del_items)), + } + out = {"report": report, "new": new_items, "delete": del_items, "docs": docs, "apis": apis} + with open(os.path.join(PROJECT, r".scratch\customer-rework\bruno-recon-d.json"), "w", encoding="utf-8") as f: + json.dump(out, f, ensure_ascii=False, indent=1) + print(json.dumps(report, ensure_ascii=False, indent=1)) + +if __name__ == "__main__": + main() diff --git a/.scratch/customer-rework/deploy_bru.py b/.scratch/customer-rework/deploy_bru.py new file mode 100644 index 0000000..7f0b330 --- /dev/null +++ b/.scratch/customer-rework/deploy_bru.py @@ -0,0 +1,37 @@ +"""copy staged .bru files into the docs repo (workspace-external -> python only).""" +import io +import os +import sys + +sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding="utf-8") + +STAGE = r"d:\code\crm-backend-matt\.scratch\customer-rework\bru-staging" +DOCS = r"D:\code\crm-api-docs" + +MAPPING = [ + ("战略协议", "A4 客户管理/战略协议"), # whole dir, 5 files + ("我的客户/批量更新工商信息.bru", "A4 客户管理/我的客户/批量更新工商信息.bru"), + ("客户公海/上传导入文件并预校验.bru", "A4 客户管理/客户公海/上传导入文件并预校验.bru"), + ("客户导入/上传导入文件并预校验.bru", "A4 客户管理/我的客户/客户导入/上传导入文件并预校验.bru"), +] + + +def copy_clean(src, dst): + data = open(src, "rb").read() + if data[:3] == b"\xef\xbb\xbf": + data = data[3:] + os.makedirs(os.path.dirname(dst), exist_ok=True) + open(dst, "wb").write(data) + print("OK", dst.replace(DOCS, ""), len(data), "bytes") + + +for src_rel, dst_rel in MAPPING: + s = os.path.join(STAGE, *src_rel.split("/")) + d = os.path.join(DOCS, *dst_rel.split("/")) + if os.path.isdir(s): + for root, _, files in os.walk(s): + for fn in files: + rel = os.path.relpath(os.path.join(root, fn), s) + copy_clean(os.path.join(root, fn), os.path.join(d, *rel.split(os.sep))) + else: + copy_clean(s, d) diff --git a/.scratch/customer-rework/issues/09-audit-fixes.md b/.scratch/customer-rework/issues/09-audit-fixes.md index bd462b1..0ce7a47 100644 --- a/.scratch/customer-rework/issues/09-audit-fixes.md +++ b/.scratch/customer-rework/issues/09-audit-fixes.md @@ -1,6 +1,6 @@ # 09 · 复核差异清单修复 -- **Status:** claimed +- **Status:** resolved - **Type:** task - **Blocked by:** 08-audit-prototype @@ -29,3 +29,21 @@ ## 验收 - 差异清单全部条目状态为"已修 / 已单开票 / 明确不修(记理由)",无悬空项。 + +## Answer(2026-09-05 收尾) + +**处置总览**(明细见 `audit-findings.md` §四处置状态表): + +- **已修六项**: + - S1 错误码撞号——实改与票面建议相反:64022 已被 `CODE_SCHEME_TPL_FIELD_INVALID` 占用,故 `CODE_SCHEME_TPL_INVALID` 保 64018(64018-64022 归方案卡模板段),`CODE_STAGE_TPL_SEED_PROTECTED` 64018→**64024** 顺延补位; + - F3 import 六端点双 tag 增挂「客户公海」; + - F6 批量工商更新 `POST /api/customer/company-lookup/batch-update`(ids 表单绑定、§C2 只补空缺、五种状态软处置、上限 100;port stub 恒 NO_HIT,真实企查查接入自动激活); + - F7 审计口径偏差澄清——viewType 单参数已承载五内置视图,真缺口为 customer_view_log 生产侧零写入(票 04 建壳挂账),按实体 javadoc 设计意图在 detailHead 聚合时 upsert touchViewLog,零新端点; + - F8 导入重复策略 `duplicateStrategy`(SKIP 缺省 / OVERWRITE 67013 拦非法;D24 冻结语义:作用面仅文件内重复组,overwrite=组内最后一条通过校验的行 UPDATE 生效;不触名称相似 SUSPECT); + - F10 联系人日志轻方案——客户 oplog 扩 CONTACT_ADD/EDIT/DELETE,联系人增删改三处写日志。 +- **已单开票**:F5 战略协议 → 票 12(原型三页完整,全栈实现+测试+bruno 移交)。 +- **明确不修(记理由)**:F4 关联项目随 A5 项目域划出;F9 导出日志随 D2 导出家族划出(均经用户 2026-09-05 逐项拍板)。 + +**验证**:`mvn clean test -pl crm-customer -am` BUILD SUCCESS——crm-customer 152 用例全绿(含 F6 +4、F7 +1、F8 +3、F10 +1 新用例),依赖六模块(base 38 / file 84 / auth 210 / dict 51 / rule 152 / preference 23)全绿;全模块 .java BOM 扫描 NO BOM。 + +**随票移交**:bruno 侧 F6/F8 新参数与 F7 行为示例未在本票内同步,随票 10 bruno 对账步统一核补(文档仓本机 `D:\code\crm-api-docs`)。 diff --git a/.scratch/customer-rework/issues/10-regression-retest.md b/.scratch/customer-rework/issues/10-regression-retest.md index c75f967..f2f478c 100644 --- a/.scratch/customer-rework/issues/10-regression-retest.md +++ b/.scratch/customer-rework/issues/10-regression-retest.md @@ -1,16 +1,28 @@ # 10 · 回归重测(验收线) -- **Status:** open +- **Status:** resolved - **Type:** task - **Blocked by:** 09-audit-fixes +## Answer(2026-09-05) + +五项验收全过(详见 [RETEST-REPORT.md](../RETEST-REPORT.md)): + +1. **mvn test 三模块全绿**:rule 152 / customer 158 / opp 242(基线 521 → 552,绿为准)。 +2. **冒烟全链 code=0**:`tmp/smoke-t10.py` 新写(URL 全现行端点),**43 步 0 fail**——三 workspace 列表+看板(pool 看板断言 67001 拒绝)、建改查(CAS version)、联系人 CRUD、抛公海/领取/分配、交割只读、导入全链(**duplicateStrategy=SKIP 回显断言**,F8)、列+形态偏好、商机偏好、**战略协议五端点 + DB 快照 2→3→NULL 断言**(票 12)、批量工商 NO_HIT(F6)。重打包 fat jar(新代码入包验证:启动日志 customerAgreementMapper 注册)。 +3. **bruno 对账终态**:321 源码钥匙 = 321 generated 文件,new/delete/冲突/无法识别全 0;本次落 8 文件(战略协议 5 + 批量工商 1 + upload patch ×2);A4 树对齐 v29(战略协议按票 12 拍板挂 A4 根)。 +4. **BOM 全仓零命中**。 +5. **风格 grep 零命中**。 + +已知缺陷引用(非回归,维持原状):D-07(P1) assignable 超时(票 05 登记,冒烟缺陷验证模式)、导入 D-04/D-05(票 09 audit 记档)。 + ## 验收线(R10,逐项过) -- [ ] `mvn test`:crm-rule + crm-customer + crm-opportunity 三模块全绿(基线 521:146/122/242,风格改造后数量随用例变化,绿为准); -- [ ] 冒烟脚本重跑全链 code=0:复用 `tools/smoke-t12m.py` 范式,URL 换 02 号票改造后的新端点,覆盖:登录 → 客户三 workspace 列表/看板(公海看板断言拒绝——用户复核原型确认公海无卡片视图)→ 建改查客户 → 联系人 CRUD → 认领/分配/抛公海 → 交割 → 导入全链 → 偏好存取(列 + 形态)→ 商机偏好存取; -- [ ] bruno 产出验收:`E:\code\crm-api-docs` A4 目录树对齐 v29 树,knife4j 分组同构(07 号票已建,此处终验); -- [ ] BOM 扫描:全仓 `*.java` 无 `EF BB BF` 前缀(AGENTS.md 编码纪律); -- [ ] `grep -r "PathVariable\|@PutMapping\|@DeleteMapping\|@RequestBody" crm-customer/` 零命中终验。 +- [x] `mvn test`:crm-rule + crm-customer + crm-opportunity 三模块全绿(基线 521:146/122/242,风格改造后数量随用例变化,绿为准); +- [x] 冒烟脚本重跑全链 code=0:复用 `tools/smoke-t12m.py` 范式,URL 换 02 号票改造后的新端点,覆盖:登录 → 客户三 workspace 列表/看板(公海看板断言拒绝——用户复核原型确认公海无卡片视图)→ 建改查客户 → 联系人 CRUD → 认领/分配/抛公海 → 交割 → 导入全链 → 偏好存取(列 + 形态)→ 商机偏好存取; +- [x] bruno 产出验收:`E:\code\crm-api-docs` A4 目录树对齐 v29 树,knife4j 分组同构(07 号票已建,此处终验)——本机实际路径 `D:\code\crm-api-docs`(换机),对账 321=321; +- [x] BOM 扫描:全仓 `*.java` 无 `EF BB BF` 前缀(AGENTS.md 编码纪律); +- [x] `grep -r "PathVariable\|@PutMapping\|@DeleteMapping\|@RequestBody" crm-customer/` 零命中终验。 ## 产出 diff --git a/.scratch/customer-rework/issues/12-agreement.md b/.scratch/customer-rework/issues/12-agreement.md new file mode 100644 index 0000000..b76fd41 --- /dev/null +++ b/.scratch/customer-rework/issues/12-agreement.md @@ -0,0 +1,40 @@ +# 12 · 战略协议单表 CRUD(F5) + +- **Status:** resolved +- **Type:** task +- **Blocked by:** 09-audit-fixes(F5 拍板产出) + +## Question + +原型 a4-4-6(页签)/ a4-4-9(新增)/ a4-4-10(编辑)三页有完整形态但零端点(audit-findings F5,票 09 拍板本期补、单开本票)。战略协议作为客户详情页签的单表 CRUD 全栈如何落? + +## 设计定稿(2026-09-05) + +- **表** `customer_agreement`(BaseEntity 范式,对齐 CustomerContact): + - `customer_id` bigint not null(所属客户,无独立 ACL 权限继承客户) + - `agreement_level` tinyint not null(**1~3** 一级/二级/三级——值域钉在 Customer.strategicAgreementLevel 注释「快照 1~3」) + - `amount` varchar(64)(签订金额,对齐 registeredCapital varchar 先例——允许区间/文字形态) + - `remark` varchar(500)、`file_file_id` varchar(64)(附件单文件,crm-file fileId 引用,对齐 CustomerImportTask.fileFileId 先例;下载走 crm-file 通用端点零新下载口) + - 命名策略:无孤立单大写字母,无需 @Column(name=...) 钉名 +- **URL**(ADR-0017 扁平动作动词,对齐 contact 家族):`POST /api/customer/agreement/create`、`POST /edit?id=`、`POST /delete?id=`、`GET /detail?id=`、`GET /list?customerId=`(页签卡片列表,时间倒序非分页) +- **错误码** `CODE_AGREEMENT_INVALID = 67017`(入参非法/等级越界/协议不存在或无权——防探测同码) +- **oplog**(对齐 F10 CONTACT_* 先例):ACTION_AGREEMENT_ADD/EDIT/DELETE,detail「新增/修改/删除战略协议【三级】」 +- **客户快照刷新**(兑现 Customer.strategicAgreementLevel javadoc「战略协议子域写入,本图只读」承诺):create/edit/delete 后重算该客户最新一条协议(create_time,id 倒序 limit 1)的等级回写 `customer.strategic_agreement_level`(无协议 → NULL=未签);LambdaUpdateWrapper 只更新该列不 bump version(对齐跟进锚点刷新先例) +- **tag** `A4 客户管理/战略协议`(三页均在 客户>我的客户>客户详情 下,单菜单归属) +- **编辑语义**:customerId 不可换(dto 值忽略,对齐 contact);等级必填且 ∈ 1~3 + +## 验收 + +- mvn test crm-customer 全绿(新增 H2 集成测试:CRUD 正常路径 + 校验路径 + 快照刷新 + 权限继承客户 + oplog 三动作) +- 端点 grep 无 @PathVariable/@PutMapping/@DeleteMapping/@RequestBody +- bruno 侧新端点示例随票 10 bruno 对账步统一核补(同 F6/F8 处置) + +## Answer(2026-09-05) + +**按设计定稿全栈落地**(全部与票面定稿一致,两处实现期修正见下): + +- **后端栈**:`CustomerAgreement` 实体(customer_agreement 表:customerId / agreementLevel 1~3 / amount varchar(64) / remark / fileFileId)+ `CustomerAgreementMapper`(纯 CrmBaseMapper,无自定义 SQL)+ `AgreementDTO` 双向 DTO + `ICustomerAgreementService` / `CustomerAgreementServiceImpl` + `CustomerAgreementController` 五端点(`POST /api/customer/agreement/create|edit?id=|delete?id=`、`GET /detail?id=|list?customerId=`);错误码 67017;oplog 扩 AGREEMENT_ADD/EDIT/DELETE。 +- **快照刷新兑现**:create/edit/delete 后重算最新协议等级回写 `customer.strategic_agreement_level`(删空回 NULL=未签),LambdaUpdateWrapper 不 bump version——`Customer` 实体 javadoc「战略协议子域写入,本图只读」的设计承诺自此闭环。 +- **实现期修正两处**:(1) `listByCustomer` 首版漏填出参 customerName(契约承诺带出),对齐 contact 的 listByCustomer 补上;(2) 测试对 @TableLogic 语义的断言修正——已删行 `selectById` 返回 null(非 deleted=true 行),软删位验证改原生 SQL 直读 deleted 列。 +- **验证**:`mvn test -pl crm-customer -am` BUILD SUCCESS——crm-customer **158** 用例全绿(+6:create 快照 / edit 不可换客 / delete 快照回退与回 NULL / list+detail / 校验三路 / 防探测与权限继承);规范 grep(@PathVariable|@PutMapping|@DeleteMapping|@RequestBody)零命中;BOM 扫描 NO BOM。 +- **bruno**:menuBindings 无需新增(协议端点无 viewType/scopeKey 参数);br 文件生成随票 10 对账步(文档仓 `D:\code\crm-api-docs\A4 客户管理\`)。 diff --git a/.scratch/customer-rework/map.md b/.scratch/customer-rework/map.md index 7c389da..5788139 100644 --- a/.scratch/customer-rework/map.md +++ b/.scratch/customer-rework/map.md @@ -40,6 +40,12 @@ - [08 · 双镜头全量复核(规范 + 原型)](issues/08-audit-prototype.md) — audit-findings.md:镜头一五项全绿 + S1 错误码 64018 双绑;镜头二四种子收口 + 7 差异项(机械修 S1/F3,需决策 F4-F10);09 票范围已回填。 +- [09 · 复核差异清单修复](issues/09-audit-fixes.md) — 六修一开两划:S1(实改反向:SEED_PROTECTED 顺延 64024)、F3 双 tag、F6 批量工商更新端点、F7(口径收窄:viewType 五内置视图已在,补 viewTouch upsert)、F8 duplicateStrategy(D24 语义)、F10 联系人 oplog 轻方案;F5 单开票 12、F4/F9 划出(用户逐项拍板);crm-customer 152 全绿 + BOM 无。 + +- [12 · 战略协议单表 CRUD(F5)](issues/12-agreement.md) — customer_agreement 表 + 五端点(create/edit/delete/detail/list)+ 错误码 67017 + oplog AGREEMENT_*;客户快照 strategic_agreement_level 随写刷新(javadoc「战略协议子域写入」承诺闭环);crm-customer 158 全绿。 + +- [10 · 回归重测](issues/10-regression-retest.md) — 五项验收全过:三模块 152/158/242 绿、冒烟 43 步 0 fail(新端点全覆盖 + DB 快照断言 + D-07 缺陷验证模式)、bruno 对账 321=321 终态(落 8 文件)、BOM 零、风格 grep 零;产出 [RETEST-REPORT.md](RETEST-REPORT.md)。 + ## 范围外(Out of scope) - 客户导出(原型有规则,维持 D2 划出,涉及脱敏口径,量级独立) @@ -54,10 +60,10 @@ ``` 01 ag-checklist ──┬──> 02 style-unify ──┬──> 03 board-pool-close ──┐ │ └──> 04 gap-fixes ─────────┤ - │ ├──> 08 audit ──> 09 audit-fixes ──┬──> 10 regression - │ 05 view-form-platform ──┬──> 07 tags-bruno ──┤ │ - │ 06 column-pref-scopes ──┘ │ │ - └───────────────────────────────────────────────┘ 11 docs-sync <────┘ + │ ├──> 08 audit ──> 09 audit-fixes ──┬──> 12 agreement ──┬──> 10 regression + │ 05 view-form-platform ──┬──> 07 tags-bruno ──┤ │ │ + │ 06 column-pref-scopes ──┘ │ │ │ + └───────────────────────────────────────────────┘ 11 docs-sync <────┴───────────────────┘ ``` - 01 是全部票的前置(checklist 是复核依据) diff --git a/crm-customer/src/main/java/com/crm/customer/constant/CustomerConstants.java b/crm-customer/src/main/java/com/crm/customer/constant/CustomerConstants.java index bd38825..3e71994 100644 --- a/crm-customer/src/main/java/com/crm/customer/constant/CustomerConstants.java +++ b/crm-customer/src/main/java/com/crm/customer/constant/CustomerConstants.java @@ -26,6 +26,7 @@ public interface CustomerConstants { int CODE_IMPORT_STATUS_NOT_ALLOWED = 67014; // 导入任务状态不允许此操作(重复确认/下载未生成明细) int CODE_DEDUP_RULE_MISSING = 67015; // 查重设置单例缺失(crm-rule 未初始化) int CODE_MEMBER_INVALID = 67016; // 成员管理非法:名单空/含负责人/重复加入/用户不存在或停用/成员不存在(原型 11.1) + int CODE_AGREEMENT_INVALID = 67017; // 战略协议非法:等级缺失或越界/协议不存在或无权访问(返工票 12-F5) /*-------- 编号规则--------*/ @@ -92,6 +93,12 @@ public interface CustomerConstants { String ACTION_STAGE_CHANGE = "STAGE_CHANGE"; // 阶段推进(operator=系统或人工) String ACTION_MEMBER_ADD = "MEMBER_ADD"; // 添加协同人(原型 11.1 搜索多选) String ACTION_MEMBER_REMOVE = "MEMBER_REMOVE"; // 移除协同人(原型 11.1 二次确认) + String ACTION_CONTACT_ADD = "CONTACT_ADD"; // 新增联系人(返工票 09-F10,a4-5-6) + String ACTION_CONTACT_EDIT = "CONTACT_EDIT"; // 编辑联系人(返工票 09-F10,a4-5-6) + String ACTION_CONTACT_DELETE = "CONTACT_DELETE"; // 删除联系人(返工票 09-F10,a4-5-6) + String ACTION_AGREEMENT_ADD = "AGREEMENT_ADD"; // 新增战略协议(返工票 12-F5,a4-4-6) + String ACTION_AGREEMENT_EDIT = "AGREEMENT_EDIT"; // 编辑战略协议(返工票 12-F5,a4-4-6) + String ACTION_AGREEMENT_DELETE = "AGREEMENT_DELETE"; // 删除战略协议(返工票 12-F5,a4-4-6) /*-------- 待发通知(票 09 / issues-10 §D,对称商机 notice 语义)--------*/ @@ -114,6 +121,10 @@ public interface CustomerConstants { String IMPORT_MODE_APPEND_ONLY = "APPEND_ONLY"; // 仅新增 String IMPORT_MODE_UPDATE_ONLY = "UPDATE_ONLY"; // 仅更新 String IMPORT_MODE_UPSERT = "UPSERT"; // 新增或更新 + + /** 重复策略(a4-3-2 复选框 / 旧图 D24:互斥,默认不导入;覆盖=文件内自上而下最后一条通过校验的为准) */ + String IMPORT_DUP_SKIP = "SKIP"; // 数据重复时不导入(默认,重复组全失败) + String IMPORT_DUP_OVERWRITE = "OVERWRITE"; // 数据重复时覆盖导入(重复组仅最后一条生效) int IMPORT_STATUS_DRAFT = 0; // 待确认(预校验完成,等用户 confirm) int IMPORT_STATUS_RUNNING = 1; // 处理中 diff --git a/crm-customer/src/main/java/com/crm/customer/controller/CustomerAgreementController.java b/crm-customer/src/main/java/com/crm/customer/controller/CustomerAgreementController.java new file mode 100644 index 0000000..7ad5aee --- /dev/null +++ b/crm-customer/src/main/java/com/crm/customer/controller/CustomerAgreementController.java @@ -0,0 +1,63 @@ +package com.crm.customer.controller; + +import com.crm.base.domain.result.Result; +import com.crm.customer.domain.dto.AgreementDTO; +import com.crm.customer.service.ICustomerAgreementService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import lombok.RequiredArgsConstructor; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; + +/** + * 战略协议接口(返工票 12-F5 / 原型 a4-4-6 页签 + a4-4-9 新增 + a4-4-10 编辑)。 + * + *

写入参 {@link AgreementDTO} 隐式表单绑定(ADR-0017);权限继承所属客户 + * (无独立 ACL),服务端按客户可见性校验,无权 67017/67002。附件存 crm-file + * fileId 引用,下载由前端走 crm-file 通用端点。

+ */ +@Tag(name = "A4 客户管理/战略协议", description = "战略协议页签 CRUD(客户详情)") +@RestController +@RequestMapping("/api/customer/agreement") +@RequiredArgsConstructor +public class CustomerAgreementController { + + private final ICustomerAgreementService agreementService; + + @Operation(summary = "新增战略协议", description = "所属客户必填且对当前用户可见;等级 1~3 必填;写后刷新客户战略协议等级快照") + @PostMapping("/create") + public Result create(AgreementDTO dto) { + return Result.success(agreementService.create(dto)); + } + + @Operation(summary = "编辑战略协议", description = "归属客户不可换;等级 1~3;写后刷新客户快照") + @PostMapping("/edit") + public Result update(@RequestParam("id") Long id, AgreementDTO dto) { + agreementService.update(id, dto); + return Result.success(); + } + + @Operation(summary = "删除战略协议", description = "软删;删空后客户快照回 NULL=未签") + @PostMapping("/delete") + public Result delete(@RequestParam("id") Long id) { + agreementService.delete(id); + return Result.success(); + } + + @Operation(summary = "战略协议详情", description = "编辑回显(a4-4-10)") + @GetMapping("/detail") + public Result detail(@RequestParam("id") Long id) { + return Result.success(agreementService.detail(id)); + } + + @Operation(summary = "战略协议页签列表", description = "客户详情页签卡片(a4-4-6),时间倒序非分页;带出客户名") + @GetMapping("/list") + public Result> list(@RequestParam("customerId") Long customerId) { + return Result.success(agreementService.listByCustomer(customerId)); + } +} diff --git a/crm-customer/src/main/java/com/crm/customer/controller/CustomerController.java b/crm-customer/src/main/java/com/crm/customer/controller/CustomerController.java index 016e388..1fd89ba 100644 --- a/crm-customer/src/main/java/com/crm/customer/controller/CustomerController.java +++ b/crm-customer/src/main/java/com/crm/customer/controller/CustomerController.java @@ -11,6 +11,7 @@ import com.crm.customer.domain.dto.CustomerSaveResultDTO; import com.crm.customer.domain.dto.CustomerSearchItemDTO; import com.crm.customer.domain.dto.CustomerSimilarHitDTO; import com.crm.customer.domain.dto.CustomerUpdateDTO; +import com.crm.customer.domain.dto.CompanyBatchUpdateDTO; import com.crm.customer.domain.param.CustomerPageParam; import com.crm.customer.domain.param.CustomerSearchParam; import com.crm.customer.port.CompanyLookupPort; @@ -122,4 +123,12 @@ public class CustomerController { @RequestParam("companyName") String companyName) { return Result.success(companyLookupPort.lookup(companyName)); } + + @Operation(summary = "批量更新工商信息", tags = {"A4 客户管理/我的客户"}, + description = "a4-3-1 多选确认弹窗(你选择了N个客户,确认要批量查询并更新工商信息吗):逐客户按名称查工商源并回填空缺字段," + + "行级部分成功返回每客户结果(UPDATED/SKIPPED/NO_HIT/CONFLICT/NOT_FOUND);单次上限 100;一期 stub 恒 NO_HIT") + @PostMapping("/company-lookup/batch-update") + public Result> batchCompanyUpdate(@RequestParam("ids") List ids) { + return Result.success(customerService.batchCompanyUpdate(ids)); + } } diff --git a/crm-customer/src/main/java/com/crm/customer/controller/CustomerImportController.java b/crm-customer/src/main/java/com/crm/customer/controller/CustomerImportController.java index 95c695c..6c46e97 100644 --- a/crm-customer/src/main/java/com/crm/customer/controller/CustomerImportController.java +++ b/crm-customer/src/main/java/com/crm/customer/controller/CustomerImportController.java @@ -44,12 +44,13 @@ public class CustomerImportController { private final ICustomerImportService importService; @Operation(summary = "上传导入文件并预校验", - description = "文件守门(.xls/.xlsx、≤20MB、模板版本、单 sheet ≤5 万行)→ 行级判定(与执行同口径)→ 任务落待确认态,返回预计数 + 明细(上限 100 条)", + description = "文件守门(.xls/.xlsx、≤20MB、模板版本、单 sheet ≤5 万行)→ 行级判定(与执行同口径)→ 任务落待确认态,返回预计数 + 明细(上限 100 条);duplicateStrategy=数据重复时覆盖导入(OVERWRITE)/不导入(SKIP,默认)", tags = {"A4 客户管理/我的客户/客户导入", "A4 客户管理/客户公海"}) @PostMapping("/upload") public Result upload(@RequestParam("file") MultipartFile file, - @RequestParam("importMode") String importMode) { - return Result.success(importService.upload(file, importMode)); + @RequestParam("importMode") String importMode, + @RequestParam(value = "duplicateStrategy", required = false) String duplicateStrategy) { + return Result.success(importService.upload(file, importMode, duplicateStrategy)); } @Operation(summary = "确认执行导入", description = "待确认 → 处理中 + 触发异步执行;重复确认 67014 阻断", diff --git a/crm-customer/src/main/java/com/crm/customer/domain/dto/AgreementDTO.java b/crm-customer/src/main/java/com/crm/customer/domain/dto/AgreementDTO.java new file mode 100644 index 0000000..c1a9781 --- /dev/null +++ b/crm-customer/src/main/java/com/crm/customer/domain/dto/AgreementDTO.java @@ -0,0 +1,52 @@ +package com.crm.customer.domain.dto; + +import com.crm.base.domain.dto.BaseDTO; +import com.crm.customer.domain.entity.CustomerAgreement; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.springframework.beans.BeanUtils; + +/** + * 战略协议双向 DTO(ADR-0017 Route A:写入参 + 出参同一类,对齐 {@link ContactDTO})。 + * + *

写入:customerId/agreementLevel 必填;出参带 customerName(页签卡片带出客户名, + * 与列表场景的面包屑上下文一致)。附件 fileFileId 双向透传,前端凭此走 crm-file 下载。

+ */ +@Data +@EqualsAndHashCode(callSuper = true) +@Schema(description = "战略协议(写入参/出参双向)") +public class AgreementDTO extends BaseDTO { + + @Schema(description = "所属客户 id(新增必填;编辑时以库内归属为准不可换客户)") + private Long customerId; + + @Schema(description = "战略协议等级 1~3(一级/二级/三级)", requiredMode = Schema.RequiredMode.REQUIRED) + private Integer agreementLevel; + + @Schema(description = "签订金额(文本:数字/区间/含单位,可空)") + private String amount; + + @Schema(description = "备注(可空)") + private String remark; + + @Schema(description = "附件 fileId(crm-file 引用,单文件,可空)") + private String fileFileId; + + // -------- 出参(带出客户名) -------- + + @Schema(description = "所属客户名称(仅出参)") + private String customerName; + + public static CustomerAgreement toEntity(AgreementDTO dto) { + CustomerAgreement entity = new CustomerAgreement(); + BeanUtils.copyProperties(dto, entity, "id", "createTime", "updateTime", "customerName"); + return entity; + } + + public static AgreementDTO fromEntity(CustomerAgreement entity) { + AgreementDTO dto = new AgreementDTO(); + BeanUtils.copyProperties(entity, dto); + return dto; + } +} diff --git a/crm-customer/src/main/java/com/crm/customer/domain/dto/CompanyBatchUpdateDTO.java b/crm-customer/src/main/java/com/crm/customer/domain/dto/CompanyBatchUpdateDTO.java new file mode 100644 index 0000000..a440ef6 --- /dev/null +++ b/crm-customer/src/main/java/com/crm/customer/domain/dto/CompanyBatchUpdateDTO.java @@ -0,0 +1,54 @@ +package com.crm.customer.domain.dto; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 批量更新工商信息单客户结果(返工票 09-F6 / a4-3-1 多选确认弹窗)。 + * + *

行级部分成功:单客户失败(未命中/冲突/无空缺)不影响其余客户; + * status 语义见常量。一期企查查 stub 恒空 → 全部 NO_HIT(契约先行, + * 真实 port Bean 接入后行为自动激活)。

+ */ +@Data +@Schema(description = "批量更新工商信息单客户结果") +public class CompanyBatchUpdateDTO implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + public static final String UPDATED = "UPDATED"; // 已回填 + public static final String SKIPPED = "SKIPPED"; // 无空缺字段可回填 + public static final String NO_HIT = "NO_HIT"; // 工商源未查询到匹配企业 + public static final String CONFLICT = "CONFLICT"; // 命中信用代码已被其他客户占用 + public static final String NOT_FOUND = "NOT_FOUND"; // 客户不存在(并发删除等) + + @Schema(description = "客户 ID") + private Long customerId; + + @Schema(description = "客户名称(NOT_FOUND 时为 null)") + private String customerName; + + @Schema(description = "结果:UPDATED 已回填 / SKIPPED 无空缺 / NO_HIT 未命中 / CONFLICT 信用代码冲突 / NOT_FOUND 客户不存在") + private String status; + + @Schema(description = "本次回填字段数(UPDATED 时 > 0)") + private Integer filledFields; + + @Schema(description = "说明(SKIPPED/NO_HIT/CONFLICT/NOT_FOUND 时的原因)") + private String message; + + public static CompanyBatchUpdateDTO of(Long customerId, String customerName, + String status, int filledFields, String message) { + CompanyBatchUpdateDTO dto = new CompanyBatchUpdateDTO(); + dto.setCustomerId(customerId); + dto.setCustomerName(customerName); + dto.setStatus(status); + dto.setFilledFields(filledFields); + dto.setMessage(message); + return dto; + } +} diff --git a/crm-customer/src/main/java/com/crm/customer/domain/dto/ImportPreviewDTO.java b/crm-customer/src/main/java/com/crm/customer/domain/dto/ImportPreviewDTO.java index 11de6fb..b177460 100644 --- a/crm-customer/src/main/java/com/crm/customer/domain/dto/ImportPreviewDTO.java +++ b/crm-customer/src/main/java/com/crm/customer/domain/dto/ImportPreviewDTO.java @@ -27,6 +27,9 @@ public class ImportPreviewDTO implements Serializable { @Schema(description = "导入方式:APPEND_ONLY/UPDATE_ONLY/UPSERT") private String importMode; + @Schema(description = "重复策略:SKIP 不导入(默认)/ OVERWRITE 覆盖导入(返工票 09-F8)") + private String duplicateStrategy; + @Schema(description = "数据行总数(客户 sheet)") private Integer totalCount; diff --git a/crm-customer/src/main/java/com/crm/customer/domain/entity/CustomerAgreement.java b/crm-customer/src/main/java/com/crm/customer/domain/entity/CustomerAgreement.java new file mode 100644 index 0000000..7e86c45 --- /dev/null +++ b/crm-customer/src/main/java/com/crm/customer/domain/entity/CustomerAgreement.java @@ -0,0 +1,55 @@ +package com.crm.customer.domain.entity; + +import com.baomidou.mybatisplus.annotation.TableName; +import com.crm.base.domain.entity.BaseEntity; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.Index; +import jakarta.persistence.Table; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.hibernate.annotations.Comment; + +/** + * 战略协议子表(返工票 12-F5 / 原型 a4-4-6/9/10)。 + * + *

无独立 ACL:权限继承所属客户(无 {@code @DataScope} 注解),服务层按所属 + * 客户校验(同 {@link CustomerContact} 口径)。写操作后同步刷新客户快照 + * {@code customer.strategic_agreement_level}(javadoc 明文「战略协议子域写入,本图只读」; + * 取最新一条协议等级,无协议 → NULL=未签)。

+ * + *

附件单文件走 crm-file fileId 引用(不落文件名,对齐 {@link CustomerImportTask#fileFileId} + * 先例),下载由前端走 crm-file 通用端点,本模块零下载端点。

+ * + *

命名策略:无孤立单大写字母(agreementLevel/fileFileId/customerId 均为完整词拆解), + * 无需 {@code @Column(name=...)} 钉列名。

+ */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("customer_agreement") +@Entity +@Table(name = "customer_agreement", indexes = { + @Index(name = "idx_agreement_customer", columnList = "customer_id, deleted") +}) +public class CustomerAgreement extends BaseEntity { + + @Comment("所属客户 id(NOT NULL)") + @Column(columnDefinition = "bigint not null comment '所属客户ID'") + private Long customerId; + + @Comment("战略协议等级 1~3(一级/二级/三级,值域对齐客户快照列)") + @Column(columnDefinition = "tinyint not null comment '战略协议等级1~3'") + private Integer agreementLevel; + + @Comment("签订金额(文本形态:数字/区间/含单位,对齐注册资本 varchar 先例)") + @Column(columnDefinition = "varchar(64) comment '签订金额'") + private String amount; + + @Comment("备注") + @Column(columnDefinition = "varchar(500) comment '备注'") + private String remark; + + @Comment("附件引用(crm-file fileId,单文件;下载走 crm-file 通用端点)") + @Column(columnDefinition = "varchar(64) comment '附件fileId'") + private String fileFileId; +} diff --git a/crm-customer/src/main/java/com/crm/customer/domain/entity/CustomerImportTask.java b/crm-customer/src/main/java/com/crm/customer/domain/entity/CustomerImportTask.java index 566cf09..125e236 100644 --- a/crm-customer/src/main/java/com/crm/customer/domain/entity/CustomerImportTask.java +++ b/crm-customer/src/main/java/com/crm/customer/domain/entity/CustomerImportTask.java @@ -2,6 +2,7 @@ package com.crm.customer.domain.entity; import com.baomidou.mybatisplus.annotation.TableName; import com.crm.base.domain.entity.BaseEntity; +import com.crm.customer.constant.CustomerConstants; import jakarta.persistence.Column; import jakarta.persistence.Entity; import jakarta.persistence.Index; @@ -36,6 +37,10 @@ public class CustomerImportTask extends BaseEntity { @Column(columnDefinition = "varchar(20) not null comment '导入方式'") private String importMode; + @Comment("重复策略:SKIP 不导入(默认)/ OVERWRITE 覆盖导入(返工票 09-F8,a4-3-2 复选框)") + @Column(columnDefinition = "varchar(20) not null default 'SKIP' comment '重复策略:SKIP不导入/OVERWRITE覆盖导入'") + private String duplicateStrategy = CustomerConstants.IMPORT_DUP_SKIP; + @Comment("模板版本(预校验一致性锚点)") @Column(columnDefinition = "varchar(10) not null comment '模板版本'") private String templateVersion; diff --git a/crm-customer/src/main/java/com/crm/customer/mapper/CustomerAgreementMapper.java b/crm-customer/src/main/java/com/crm/customer/mapper/CustomerAgreementMapper.java new file mode 100644 index 0000000..62c2f52 --- /dev/null +++ b/crm-customer/src/main/java/com/crm/customer/mapper/CustomerAgreementMapper.java @@ -0,0 +1,11 @@ +package com.crm.customer.mapper; + +import com.crm.base.mapper.CrmBaseMapper; +import com.crm.customer.domain.entity.CustomerAgreement; + +/** + * 战略协议 Mapper(返工票 12-F5):纯 CrmBaseMapper,无自定义 SQL + * (页签列表用 LambdaQueryWrapper 覆盖;跨客户场景不存在——协议只随客户页签出现)。 + */ +public interface CustomerAgreementMapper extends CrmBaseMapper { +} diff --git a/crm-customer/src/main/java/com/crm/customer/service/ICustomerAgreementService.java b/crm-customer/src/main/java/com/crm/customer/service/ICustomerAgreementService.java new file mode 100644 index 0000000..bf645af --- /dev/null +++ b/crm-customer/src/main/java/com/crm/customer/service/ICustomerAgreementService.java @@ -0,0 +1,29 @@ +package com.crm.customer.service; + +import com.crm.customer.domain.dto.AgreementDTO; + +import java.util.List; + +/** + * 战略协议服务(返工票 12-F5 / 原型 a4-4-6 页签)。 + * + *

权限继承所属客户(无独立 ACL):所有读写入口先定位所属客户判定可见性, + * 不存在/无权统一码防探测。写操作后同步刷新客户战略协议等级快照。

+ */ +public interface ICustomerAgreementService { + + /** 新增协议(所属客户必填且可见);返回新 id;刷新客户快照。 */ + Long create(AgreementDTO dto); + + /** 编辑协议(归属客户不可换);刷新客户快照。 */ + void update(Long id, AgreementDTO dto); + + /** 删除协议(软删);刷新客户快照(删空 → 快照回 NULL=未签)。 */ + void delete(Long id); + + /** 协议详情(编辑回显)。 */ + AgreementDTO detail(Long id); + + /** 客户页签列表:时间倒序(create_time, id),非分页(原型卡片瀑布)。 */ + List listByCustomer(Long customerId); +} diff --git a/crm-customer/src/main/java/com/crm/customer/service/ICustomerImportService.java b/crm-customer/src/main/java/com/crm/customer/service/ICustomerImportService.java index 5e5e168..fe88320 100644 --- a/crm-customer/src/main/java/com/crm/customer/service/ICustomerImportService.java +++ b/crm-customer/src/main/java/com/crm/customer/service/ICustomerImportService.java @@ -20,8 +20,11 @@ public interface ICustomerImportService extends IBaseService /** 导入模板文件名(版本号锚定 CustomerConstants.IMPORT_TEMPLATE_VERSION,票 14 评审自 Impl 上移)。 */ String TEMPLATE_NAME = "客户导入模板-" + CustomerConstants.IMPORT_TEMPLATE_VERSION + ".xlsx"; - /** 上传 + 预校验:文件守门(类型/大小/模板版本/行数)→ 行级判定 → 任务落 DRAFT,返回预计数 + 明细。 */ - ImportPreviewDTO upload(MultipartFile file, String importMode); + /** + * 上传 + 预校验:文件守门(类型/大小/模板版本/行数)→ 行级判定 → 任务落 DRAFT,返回预计数 + 明细。 + * duplicateStrategy:SKIP 不导入(默认)/ OVERWRITE 覆盖导入(返工票 09-F8,D24 语义)。 + */ + ImportPreviewDTO upload(MultipartFile file, String importMode, String duplicateStrategy); /** 确认创建正式任务(DRAFT → RUNNING + 触发异步执行);重复确认 67014。 */ Long confirm(Long taskId); diff --git a/crm-customer/src/main/java/com/crm/customer/service/ICustomerService.java b/crm-customer/src/main/java/com/crm/customer/service/ICustomerService.java index 9e0dfc3..5f70597 100644 --- a/crm-customer/src/main/java/com/crm/customer/service/ICustomerService.java +++ b/crm-customer/src/main/java/com/crm/customer/service/ICustomerService.java @@ -8,10 +8,13 @@ import com.crm.customer.domain.dto.CustomerQuickCreateDTO; import com.crm.customer.domain.dto.CustomerSaveResultDTO; import com.crm.customer.domain.dto.CustomerSearchItemDTO; import com.crm.customer.domain.dto.CustomerUpdateDTO; +import com.crm.customer.domain.dto.CompanyBatchUpdateDTO; import com.crm.customer.domain.entity.Customer; import com.crm.customer.domain.param.CustomerPageParam; import com.crm.customer.domain.param.CustomerSearchParam; +import java.util.List; + /** * 客户主表服务(票 02:新增/编辑带三层查重;三 workspace 视图查询在票 04 增强)。 */ @@ -45,4 +48,11 @@ public interface ICustomerService extends IBaseService { * DataScope 自动注入可见范围)。 */ PageResult searchForOpportunity(CustomerSearchParam param); + + /** + * 批量更新工商信息(返工票 09-F6 / a4-3-1 多选确认弹窗):逐客户按名称查工商源, + * 只回填空缺字段(对称 issues-04 §C2 回填口径),命中信用代码与他人冲突跳过不写; + * 行级部分成功,返回每客户结果。一期 stub 恒 NO_HIT。 + */ + List batchCompanyUpdate(List ids); } diff --git a/crm-customer/src/main/java/com/crm/customer/service/impl/CustomerAgreementServiceImpl.java b/crm-customer/src/main/java/com/crm/customer/service/impl/CustomerAgreementServiceImpl.java new file mode 100644 index 0000000..9d54d10 --- /dev/null +++ b/crm-customer/src/main/java/com/crm/customer/service/impl/CustomerAgreementServiceImpl.java @@ -0,0 +1,173 @@ +package com.crm.customer.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; +import com.crm.base.domain.exception.BusinessErrorException; +import com.crm.base.service.impl.BaseServiceImpl; +import com.crm.customer.constant.CustomerConstants; +import com.crm.customer.domain.dto.AgreementDTO; +import com.crm.customer.domain.entity.Customer; +import com.crm.customer.domain.entity.CustomerAgreement; +import com.crm.customer.mapper.CustomerAgreementMapper; +import com.crm.customer.mapper.CustomerMapper; +import com.crm.customer.service.CustomerOplogWriter; +import com.crm.customer.service.CustomerScopeEvaluator; +import com.crm.customer.service.ICustomerAgreementService; +import lombok.RequiredArgsConstructor; +import org.springframework.beans.BeanUtils; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * 战略协议服务实现(返工票 12-F5)。 + * + *

对齐 {@link CustomerContactServiceImpl} 口径:无独立 ACL,读写先定位所属客户, + * {@link CustomerScopeEvaluator#visibleToCurrent} 判定(不存在/无权统一码防探测—— + * 协议维度 67017、客户维度 67002);可见即可写。编辑归属客户不可换(dto.customerId 忽略)。

+ * + *

客户快照刷新(create/edit/delete 后):取该客户最新一条协议(create_time,id 倒序 + * limit 1)的等级回写 {@code customer.strategic_agreement_level},无协议 → NULL=未签; + * LambdaUpdateWrapper 只更新该列不 bump version(对齐跟进锚点刷新先例,避免干扰用户 CAS 编辑)。

+ * + *

操作日志(对齐 F10 CONTACT_* 先例):增删改写客户 oplog,detail 记等级文案。

+ */ +@Service +@RequiredArgsConstructor +public class CustomerAgreementServiceImpl + extends BaseServiceImpl + implements ICustomerAgreementService { + + /** 等级值域上界(1~3,对齐客户快照列 javadoc;原型 a4-4-6 示例「三级」)。 */ + private static final int LEVEL_MAX = 3; + + private final CustomerMapper customerMapper; + private final CustomerOplogWriter oplogWriter; + + @Override + public Long create(AgreementDTO dto) { + if (dto.getCustomerId() == null) { + throw new BusinessErrorException(CustomerConstants.CODE_CUST_INVALID, "所属客户必填"); + } + Customer customer = requireCustomerVisible(dto.getCustomerId()); + validate(dto); + CustomerAgreement entity = AgreementDTO.toEntity(dto); + entity.setCustomerId(customer.getId()); + this.save(entity); + refreshSnapshot(customer.getId()); + oplogWriter.write(customer.getId(), CustomerConstants.ACTION_AGREEMENT_ADD, + "新增战略协议【" + levelLabel(entity.getAgreementLevel()) + "】"); + return entity.getId(); + } + + @Override + public void update(Long id, AgreementDTO dto) { + CustomerAgreement exist = requireAgreementVisible(id); + validate(dto); + // 归属客户不可换(dto.customerId 忽略);系统字段与软删位不动 + BeanUtils.copyProperties(dto, exist, "id", "customerId", "createTime", "updateTime", + "creatorId", "updaterId", "deleted"); + this.updateById(exist); + refreshSnapshot(exist.getCustomerId()); + oplogWriter.write(exist.getCustomerId(), CustomerConstants.ACTION_AGREEMENT_EDIT, + "修改战略协议【" + levelLabel(exist.getAgreementLevel()) + "】"); + } + + @Override + public void delete(Long id) { + CustomerAgreement exist = requireAgreementVisible(id); + this.removeById(id); + refreshSnapshot(exist.getCustomerId()); + oplogWriter.write(exist.getCustomerId(), CustomerConstants.ACTION_AGREEMENT_DELETE, + "删除战略协议【" + levelLabel(exist.getAgreementLevel()) + "】"); + } + + @Override + public AgreementDTO detail(Long id) { + CustomerAgreement exist = requireAgreementVisible(id); + AgreementDTO dto = AgreementDTO.fromEntity(exist); + Customer customer = customerMapper.selectById(exist.getCustomerId()); + if (customer != null) { + dto.setCustomerName(customer.getCustomerName()); + } + return dto; + } + + @Override + public List listByCustomer(Long customerId) { + requireCustomerVisible(customerId); + Customer customer = customerMapper.selectById(customerId); + return this.list(new LambdaQueryWrapper() + .eq(CustomerAgreement::getCustomerId, customerId) + .orderByDesc(CustomerAgreement::getCreateTime) + .orderByDesc(CustomerAgreement::getId)) + .stream().map(a -> { + AgreementDTO dto = AgreementDTO.fromEntity(a); + if (customer != null) { + dto.setCustomerName(customer.getCustomerName()); + } + return dto; + }).toList(); + } + + // ==================== 私有:校验与权限 ==================== + + private void validate(AgreementDTO dto) { + if (dto.getAgreementLevel() == null || dto.getAgreementLevel() < 1 + || dto.getAgreementLevel() > LEVEL_MAX) { + throw new BusinessErrorException(CustomerConstants.CODE_AGREEMENT_INVALID, + "战略协议等级必填且为 1~3"); + } + if (dto.getAmount() != null && dto.getAmount().length() > 64) { + throw new BusinessErrorException(CustomerConstants.CODE_AGREEMENT_INVALID, "签订金额超长"); + } + } + + /** 协议必须存在且所属客户对当前用户可见(防探测:不存在/无权同码 67017 协议维度)。 */ + private CustomerAgreement requireAgreementVisible(Long id) { + if (id == null) { + throw new BusinessErrorException(CustomerConstants.CODE_AGREEMENT_INVALID, "协议 id 必填"); + } + CustomerAgreement exist = this.getById(id); + if (exist == null) { + throw new BusinessErrorException(CustomerConstants.CODE_AGREEMENT_INVALID, "协议不存在或无权访问"); + } + requireCustomerVisible(exist.getCustomerId()); + return exist; + } + + /** 客户必须存在且对当前用户可见(防探测:不存在/无权同码 67002);返回该客户。 */ + private Customer requireCustomerVisible(Long customerId) { + Customer customer = customerId == null ? null : customerMapper.selectById(customerId); + if (customer == null || !CustomerScopeEvaluator.visibleToCurrent( + customer.getOwnerUserId(), customer.getOwnerDeptId())) { + throw new BusinessErrorException(CustomerConstants.CODE_CUST_NOT_EXIST, "客户不存在或无权访问"); + } + return customer; + } + + /** + * 客户快照刷新:最新一条协议等级回写(无协议 → NULL=未签); + * 只更新该列不 bump version,避免干扰用户编辑的乐观锁(对齐跟进锚点刷新先例)。 + */ + private void refreshSnapshot(Long customerId) { + CustomerAgreement latest = this.getOne(new LambdaQueryWrapper() + .eq(CustomerAgreement::getCustomerId, customerId) + .orderByDesc(CustomerAgreement::getCreateTime) + .orderByDesc(CustomerAgreement::getId) + .last("LIMIT 1")); + customerMapper.update(null, new LambdaUpdateWrapper() + .eq(Customer::getId, customerId) + .set(Customer::getStrategicAgreementLevel, latest == null ? null : latest.getAgreementLevel())); + } + + /** 等级文案(oplog detail 用;原型 a4-4-6 示例「三级」)。 */ + private static String levelLabel(Integer level) { + return switch (level == null ? 0 : level) { + case 1 -> "一级"; + case 2 -> "二级"; + case 3 -> "三级"; + default -> "未知"; + }; + } +} diff --git a/crm-customer/src/main/java/com/crm/customer/service/impl/CustomerContactServiceImpl.java b/crm-customer/src/main/java/com/crm/customer/service/impl/CustomerContactServiceImpl.java index a7dbf35..185183d 100644 --- a/crm-customer/src/main/java/com/crm/customer/service/impl/CustomerContactServiceImpl.java +++ b/crm-customer/src/main/java/com/crm/customer/service/impl/CustomerContactServiceImpl.java @@ -19,6 +19,7 @@ import com.crm.customer.domain.param.ContactPageParam; import com.crm.customer.mapper.CustomerContactMapper; import com.crm.customer.mapper.CustomerMapper; import com.crm.customer.service.CustomerDedupSettingProvider; +import com.crm.customer.service.CustomerOplogWriter; import com.crm.customer.service.CustomerScopeEvaluator; import com.crm.customer.service.ICustomerContactService; import lombok.RequiredArgsConstructor; @@ -41,6 +42,9 @@ import java.util.regex.Pattern; * *

电话查重(D26):不阻断创建,仅 {@link #checkPhone} 软提示;命中行展示权限按 * 所属客户判定,不可见脱敏为「存在匹配记录」。

+ * + *

操作日志(返工票 09-F10 / a4-5-6):增删改写客户 oplog(CONTACT_ADD/EDIT/DELETE), + * 记 customerId 供客户详情日志页按联系人动作过滤;detail 文本对称客户 CRUD 形态。

*/ @Service @RequiredArgsConstructor @@ -52,6 +56,7 @@ public class CustomerContactServiceImpl extends BaseServiceImpl() + .eq(CustomerViewLog::getCustomerId, customerId) + .eq(CustomerViewLog::getUserId, userId) + .last("LIMIT 1")); + if (existing != null) { + viewLogMapper.update(null, new LambdaUpdateWrapper() + .eq(CustomerViewLog::getId, existing.getId()) + .set(CustomerViewLog::getLastViewTime, LocalDateTime.now())); + } else { + CustomerViewLog log = new CustomerViewLog(); + log.setCustomerId(customerId); + log.setUserId(userId); + log.setLastViewTime(LocalDateTime.now()); + viewLogMapper.insert(log); + } + } + /** 最近跟进摘要 + 待跟进提醒(未来最近一条 next_follow_time,null=无待跟进)。 */ private void fillFollowDigest(CustomerDetailHeadDTO head, Long customerId) { List lastRows = followMapper.selectList( diff --git a/crm-customer/src/main/java/com/crm/customer/service/impl/CustomerImportAnalyzer.java b/crm-customer/src/main/java/com/crm/customer/service/impl/CustomerImportAnalyzer.java index dad87c5..55d021e 100644 --- a/crm-customer/src/main/java/com/crm/customer/service/impl/CustomerImportAnalyzer.java +++ b/crm-customer/src/main/java/com/crm/customer/service/impl/CustomerImportAnalyzer.java @@ -5,6 +5,7 @@ import com.crm.customer.domain.entity.Customer; import com.crm.customer.domain.entity.CustomerContact; import com.crm.customer.domain.excel.ContactImportRow; import com.crm.customer.domain.excel.CustomerImportRow; +import com.crm.customer.constant.CustomerConstants; import com.crm.customer.mapper.CustomerContactMapper; import com.crm.customer.mapper.CustomerMapper; import com.crm.customer.port.CustomerNameSimilarityPort; @@ -25,9 +26,10 @@ import java.util.Set; * *

upload 预校验与 confirm 执行共用同一判定(预计数与实际结果同口径): * 匹配顺序 = ① 客户编号完全一致 → ② 统一社会信用代码完全一致;编号与信用代码 - * 分别命中不同客户 → 该行冲突禁止导入;文件内多行匹配同一客户 → 重复组全部失败 - * (Q14 默认「重复时不导入」);均未匹配 → 不凭名称自动覆盖,UPSERT 下名称相似 - * 列疑似重复不写入(对称票 02 查重口径)。

+ * 分别命中不同客户 → 该行冲突禁止导入;文件内多行匹配同一客户 → 按 duplicateStrategy + * 处置(旧图 D24 / a4-3-2 复选框:默认 SKIP 重复组全部失败;OVERWRITE 覆盖导入 = + * 自上而下最后一条通过校验的行生效,其余标失败说明未执行);均未匹配 → 不凭名称 + * 自动覆盖,UPSERT 下名称相似列疑似重复不写入(对称票 02 查重口径,策略不影响 SUSPECT)。

* *

联系人(D26 翻案后):电话命中本客户 → 更新;命中他客户 → 照常导入 + * 疑似重复软提示(跟随查重设置「联系电话」开关);电话空 → 按「客户+姓名+职务」 @@ -84,7 +86,7 @@ public class CustomerImportAnalyzer { } /** 客户行判定(两遍:逐行静态+匹配 → 文件内重复组互斥)。 */ - public List analyzeCustomers(List rows, String mode) { + public List analyzeCustomers(List rows, String mode, String duplicateStrategy) { List plans = new ArrayList<>(); for (int i = 0; i < rows.size(); i++) { CustomerImportRow r = rows.get(i); @@ -139,7 +141,9 @@ public class CustomerImportAnalyzer { } } - // 文件内重复组:多行匹配同一已有客户 → 重复组全部失败(Q14 默认「重复时不导入」) + // 文件内重复组:多行匹配同一已有客户 → 按 duplicateStrategy 处置 + //(D24:默认 SKIP 重复组全失败;OVERWRITE 仅自上而下最后一条通过校验的行生效) + boolean overwrite = CustomerConstants.IMPORT_DUP_OVERWRITE.equals(duplicateStrategy); Map> groups = new HashMap<>(); for (RowPlan p : plans) { if (p.getMatched() != null) { @@ -148,9 +152,22 @@ public class CustomerImportAnalyzer { } for (List group : groups.values()) { if (group.size() > 1) { + RowPlan survivor = null; + if (overwrite) { + for (RowPlan p : group) { + if (VERDICT_UPDATE.equals(p.getVerdict())) { + survivor = p; + } + } + } for (RowPlan p : group) { + if (p == survivor) { + continue; + } p.setVerdict(VERDICT_FAIL); - p.setReason("文件内多行匹配同一客户(重复时不导入),请合并为单行"); + p.setReason(overwrite + ? "文件内多行匹配同一客户(覆盖导入:仅最后一条通过校验的行生效),本行未执行" + : "文件内多行匹配同一客户(重复时不导入),请合并为单行"); } } } diff --git a/crm-customer/src/main/java/com/crm/customer/service/impl/CustomerImportServiceImpl.java b/crm-customer/src/main/java/com/crm/customer/service/impl/CustomerImportServiceImpl.java index 29f14f1..b396a62 100644 --- a/crm-customer/src/main/java/com/crm/customer/service/impl/CustomerImportServiceImpl.java +++ b/crm-customer/src/main/java/com/crm/customer/service/impl/CustomerImportServiceImpl.java @@ -69,14 +69,22 @@ public class CustomerImportServiceImpl extends BaseServiceImpl plans = analyzer.analyzeCustomers(rows, importMode); + List plans = analyzer.analyzeCustomers(rows, importMode, dupStrategy); List contactPlans = contacts.isEmpty() ? List.of() : analyzer.analyzeContacts(contacts, plans); int insert = 0; @@ -144,6 +152,7 @@ public class CustomerImportServiceImpl extends BaseServiceImpl batchCompanyUpdate(List ids) { + if (ids == null || ids.isEmpty()) { + throw new BusinessErrorException(CustomerConstants.CODE_CUST_INVALID, "请选择要更新工商信息的客户"); + } + if (ids.size() > MAX_BATCH_COMPANY_UPDATE) { + throw new BusinessErrorException(CustomerConstants.CODE_CUST_INVALID, + "单次最多批量更新 " + MAX_BATCH_COMPANY_UPDATE + " 个客户"); + } + List results = new ArrayList<>(ids.size()); + for (Long id : ids.stream().distinct().toList()) { + results.add(batchCompanyUpdateOne(id)); + } + return results; + } + + /** + * 单客户工商回填:按客户名称查 port → 取首个候选,只回填空缺字段(对称 + * issues-04 §C2「只回填当前为空的字段」);命中信用代码与他人占用冲突 → + * CONFLICT 不写(L3 终查同口径,软处置不中断批次);有回填才落库 + oplog。 + */ + private CompanyBatchUpdateDTO batchCompanyUpdateOne(Long id) { + Customer c = this.getById(id); + if (c == null) { + return CompanyBatchUpdateDTO.of(id, null, CompanyBatchUpdateDTO.NOT_FOUND, 0, "客户不存在"); + } + List hits = companyLookupPort.lookup(c.getCustomerName()); + if (hits.isEmpty()) { + return CompanyBatchUpdateDTO.of(id, c.getCustomerName(), CompanyBatchUpdateDTO.NO_HIT, + 0, "工商源未查询到匹配企业"); + } + CompanyLookupPort.CompanyCandidate hit = hits.get(0); + try { + dedupService.guardCreditCodeForWrite(blankToNull(hit.unifiedCreditCode()), id); + } catch (BusinessErrorException e) { + return CompanyBatchUpdateDTO.of(id, c.getCustomerName(), CompanyBatchUpdateDTO.CONFLICT, + 0, e.getMessage()); + } + int filled = 0; + filled += fillIfBlank(c.getBizNameFromLookup(), hit.bizName(), c::setBizNameFromLookup); + filled += fillIfBlank(c.getUnifiedCreditCode(), hit.unifiedCreditCode(), c::setUnifiedCreditCode); + filled += fillIfBlank(c.getLegalRepresentative(), hit.legalRepresentative(), c::setLegalRepresentative); + filled += fillDateIfBlank(c.getEstablishedDate(), hit.establishedDate(), c::setEstablishedDate); + filled += fillIfBlank(c.getRegisteredCapital(), hit.registeredCapital(), c::setRegisteredCapital); + filled += fillIfBlank(c.getBusinessScope(), hit.businessScope(), c::setBusinessScope); + filled += fillIfBlank(c.getStaffSize(), hit.staffSize(), c::setStaffSize); + filled += fillIfBlank(c.getAnnualRevenue(), hit.annualRevenue(), c::setAnnualRevenue); + filled += fillIfBlank(c.getBusinessAddress(), hit.address(), c::setBusinessAddress); + if (filled == 0) { + return CompanyBatchUpdateDTO.of(id, c.getCustomerName(), CompanyBatchUpdateDTO.SKIPPED, + 0, "工商字段均已填写,无空缺可回填"); + } + if (!this.updateById(c)) { + return CompanyBatchUpdateDTO.of(id, c.getCustomerName(), CompanyBatchUpdateDTO.CONFLICT, + 0, "客户已被他人修改,请刷新后重试"); + } + oplogWriter.write(c.getId(), CustomerConstants.ACTION_UPDATE, + "批量更新工商信息:回填 " + filled + " 个字段"); + return CompanyBatchUpdateDTO.of(id, c.getCustomerName(), CompanyBatchUpdateDTO.UPDATED, + filled, null); + } + + /** 空缺才回填(空白 incoming 跳过、非空 current 不覆盖;返回是否写入)。 */ + private static int fillIfBlank(String current, String incoming, Consumer setter) { + if (incoming == null || incoming.isBlank()) { + return 0; + } + if (current != null && !current.isBlank()) { + return 0; + } + setter.accept(incoming.trim()); + return 1; + } + + private static int fillDateIfBlank(LocalDate current, LocalDate incoming, Consumer setter) { + if (incoming == null || current != null) { + return 0; + } + setter.accept(incoming); + return 1; + } + + private static String blankToNull(String s) { + return s == null || s.isBlank() ? null : s.trim(); + } + private void appendChange(List out, String label, Object oldV, Object newV) { String o = oldV == null ? "" : String.valueOf(oldV); String n = newV == null ? "" : String.valueOf(newV); diff --git a/crm-customer/src/main/java/com/crm/customer/task/CustomerImportExecutor.java b/crm-customer/src/main/java/com/crm/customer/task/CustomerImportExecutor.java index 1b3f878..775b326 100644 --- a/crm-customer/src/main/java/com/crm/customer/task/CustomerImportExecutor.java +++ b/crm-customer/src/main/java/com/crm/customer/task/CustomerImportExecutor.java @@ -96,7 +96,8 @@ public class CustomerImportExecutor { contacts = List.of(); } - List plans = analyzer.analyzeCustomers(rows, task.getImportMode()); + List plans = analyzer.analyzeCustomers(rows, + task.getImportMode(), task.getDuplicateStrategy()); List contactPlans = contacts.isEmpty() ? List.of() : analyzer.analyzeContacts(contacts, plans); AuthUser submitter = userService.getById(Long.valueOf(task.getCreatorId())); diff --git a/crm-customer/src/test/java/com/crm/customer/service/impl/CustomerAgreementIntegrationTest.java b/crm-customer/src/test/java/com/crm/customer/service/impl/CustomerAgreementIntegrationTest.java new file mode 100644 index 0000000..5dab637 --- /dev/null +++ b/crm-customer/src/test/java/com/crm/customer/service/impl/CustomerAgreementIntegrationTest.java @@ -0,0 +1,439 @@ +package com.crm.customer.service.impl; + +import com.baomidou.mybatisplus.annotation.DbType; +import com.baomidou.mybatisplus.core.MybatisConfiguration; +import com.baomidou.mybatisplus.core.incrementer.DefaultIdentifierGenerator; +import com.baomidou.mybatisplus.core.toolkit.GlobalConfigUtils; +import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor; +import com.baomidou.mybatisplus.extension.plugins.inner.OptimisticLockerInnerInterceptor; +import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor; +import com.crm.auth.domain.entity.AuthUser; +import com.crm.auth.service.IAuthUserService; +import com.crm.auth.service.ISysDeptService; +import com.crm.base.config.MetaObjectFillHandler; +import com.crm.base.domain.exception.BusinessErrorException; +import com.crm.base.security.DataScopeLevel; +import com.crm.base.security.DataVisibility; +import com.crm.base.security.DataVisibilityContext; +import com.crm.base.security.SecurityUtils; +import com.crm.customer.constant.CustomerConstants; +import com.crm.customer.domain.dto.AgreementDTO; +import com.crm.customer.domain.entity.Customer; +import com.crm.customer.domain.entity.CustomerAgreement; +import com.crm.customer.domain.entity.CustomerOplog; +import com.crm.customer.mapper.CustomerAgreementMapper; +import com.crm.customer.mapper.CustomerMapper; +import com.crm.customer.mapper.CustomerOplogMapper; +import com.crm.customer.service.CustomerOplogWriter; +import org.apache.ibatis.mapping.Environment; +import org.apache.ibatis.session.LocalCacheScope; +import org.apache.ibatis.session.SqlSession; +import org.apache.ibatis.session.SqlSessionFactory; +import org.apache.ibatis.session.SqlSessionFactoryBuilder; +import org.apache.ibatis.transaction.jdbc.JdbcTransactionFactory; +import org.h2.jdbcx.JdbcDataSource; +import org.junit.jupiter.api.AfterAll; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.mockito.MockedStatic; +import org.mockito.Mockito; +import org.springframework.test.util.ReflectionTestUtils; + +import java.sql.Statement; +import java.util.List; +import java.util.Map; +import java.util.concurrent.atomic.AtomicBoolean; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; +import static org.mockito.ArgumentMatchers.anyLong; +import static org.mockito.ArgumentMatchers.anySet; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + +/** + * 战略协议子表 H2 集成测试(返工票 12-F5 验收 / 原型 a4-4-6/9/10)。 + * + *

范式对齐 {@code CustomerContactServiceIntegrationTest}:真实 SQL 链路 + + * mock auth 服务;覆盖 CRUD 正常与校验路径、权限继承客户(SELF 范围防探测)、 + * oplog 三动作、客户快照刷新(最新协议等级回写 / 删空回 NULL)。

+ */ +@DisplayName("战略协议:页签 CRUD + 快照刷新 + oplog(H2 集成,票 12-F5)") +class CustomerAgreementIntegrationTest { + + private static final Long OPERATOR_ID = 5001L; + private static final Long OWNER_ID = 6001L; + private static final Long OTHER_OWNER_ID = 6002L; + private static final Long DEPT_ID = 1001L; + private static final Long OTHER_DEPT_ID = 2002L; + + private static final AtomicBoolean BOOTSTRAPPED = new AtomicBoolean(false); + private static SqlSessionFactory sqlSessionFactory; + private static final JdbcDataSource DS = new JdbcDataSource(); + + private SqlSession session; + private CustomerMapper customerMapper; + private CustomerAgreementMapper agreementMapper; + private CustomerOplogMapper oplogMapper; + private CustomerAgreementServiceImpl service; + private MockedStatic securityMock; + private int noSeq = 1; + + private final IAuthUserService userService = mock(IAuthUserService.class); + private final ISysDeptService deptService = mock(ISysDeptService.class); + + @BeforeAll + static void bootstrap() throws Exception { + if (!BOOTSTRAPPED.compareAndSet(false, true)) { + return; + } + DS.setURL("jdbc:h2:mem:custagr;MODE=MySQL;DATABASE_TO_LOWER=TRUE;CASE_INSENSITIVE_IDENTIFIERS=TRUE;" + + "DB_CLOSE_DELAY=-1"); + + MybatisConfiguration configuration = new MybatisConfiguration(); + configuration.setEnvironment(new Environment("custagr-test", new JdbcTransactionFactory(), DS)); + configuration.setMapUnderscoreToCamelCase(true); + configuration.setLocalCacheScope(LocalCacheScope.STATEMENT); + + MybatisPlusInterceptor mpInterceptor = new MybatisPlusInterceptor(); + mpInterceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL)); + mpInterceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor()); + configuration.addInterceptor(mpInterceptor); + + GlobalConfigUtils.getGlobalConfig(configuration).setMetaObjectHandler(new MetaObjectFillHandler()); + GlobalConfigUtils.getGlobalConfig(configuration).setIdentifierGenerator(DefaultIdentifierGenerator.getInstance()); + + configuration.addMapper(CustomerMapper.class); + configuration.addMapper(CustomerAgreementMapper.class); + configuration.addMapper(CustomerOplogMapper.class); + sqlSessionFactory = new SqlSessionFactoryBuilder().build(configuration); + + try (SqlSession s = sqlSessionFactory.openSession(true)) { + try (Statement st = s.getConnection().createStatement()) { + for (String sql : SCHEMA) { + st.execute(sql); + } + } + } + } + + @BeforeEach + void setUp() throws Exception { + session = sqlSessionFactory.openSession(true); + try (Statement st = session.getConnection().createStatement()) { + st.execute("DELETE FROM customer"); + st.execute("DELETE FROM customer_agreement"); + st.execute("DELETE FROM customer_oplog"); + } + customerMapper = session.getMapper(CustomerMapper.class); + agreementMapper = session.getMapper(CustomerAgreementMapper.class); + oplogMapper = session.getMapper(CustomerOplogMapper.class); + + service = new CustomerAgreementServiceImpl(customerMapper, + new CustomerOplogWriter(oplogMapper, userService, deptService)); + ReflectionTestUtils.setField(service, "baseMapper", agreementMapper); + ReflectionTestUtils.setField(service, "entityClass", CustomerAgreement.class); + + securityMock = Mockito.mockStatic(SecurityUtils.class); + securityMock.when(SecurityUtils::getRequiredUserId).thenReturn(String.valueOf(OPERATOR_ID)); + + when(userService.getById(anyLong())).thenAnswer(inv -> { + AuthUser u = new AuthUser(); + u.setId(inv.getArgument(0)); + u.setUsername("用户" + inv.getArgument(0)); + u.setDeptId(DEPT_ID); + return u; + }); + when(deptService.getDeptNames(anySet())).thenReturn(Map.of(DEPT_ID, "销售一部")); + } + + @AfterEach + void tearDown() { + DataVisibilityContext.clear(); + securityMock.close(); + session.close(); + } + + @AfterAll + static void shutdown() { + // DB_CLOSE_DELAY=-1:JVM 退出即释放 + } + + // ==================== CRUD 正常路径 ==================== + + @Test + @DisplayName("新增成功:落库 + oplog AGREEMENT_ADD + 客户快照刷新为该等级") + void create_success_and_snapshot() { + Customer c = insertRaw("云启科技有限公司", OPERATOR_ID, DEPT_ID); + AgreementDTO dto = agreementDTO(c.getId(), 2, "120万元", "年度框架"); + + Long id = service.create(dto); + + CustomerAgreement saved = agreementMapper.selectById(id); + assertThat(saved).isNotNull(); + assertThat(saved.getCustomerId()).isEqualTo(c.getId()); + assertThat(saved.getAgreementLevel()).isEqualTo(2); + assertThat(saved.getAmount()).isEqualTo("120万元"); + assertThat(saved.getRemark()).isEqualTo("年度框架"); + // 客户快照同步(原 NULL → 2) + assertThat(customerMapper.selectById(c.getId()).getStrategicAgreementLevel()).isEqualTo(2); + // oplog + List logs = oplogMapper.selectList(null); + assertThat(logs).hasSize(1); + assertThat(logs.get(0).getAction()).isEqualTo(CustomerConstants.ACTION_AGREEMENT_ADD); + assertThat(logs.get(0).getDetail()).contains("二级"); + } + + @Test + @DisplayName("编辑成功:等级/金额更新 + 归属客户不可换 + 快照同步 + oplog AGREEMENT_EDIT") + void edit_success_keepCustomer() { + Customer c = insertRaw("云启科技有限公司", OPERATOR_ID, DEPT_ID); + Customer other = insertRaw("别家公司", OPERATOR_ID, DEPT_ID); + Long id = service.create(agreementDTO(c.getId(), 2, null, null)); + + AgreementDTO edit = agreementDTO(other.getId(), 3, "300万元", null); // customerId 携带别家 → 忽略 + service.update(id, edit); + + CustomerAgreement db = agreementMapper.selectById(id); + assertThat(db.getCustomerId()).isEqualTo(c.getId()); // 归属不可换 + assertThat(db.getAgreementLevel()).isEqualTo(3); + assertThat(db.getAmount()).isEqualTo("300万元"); + assertThat(customerMapper.selectById(c.getId()).getStrategicAgreementLevel()).isEqualTo(3); + List logs = oplogMapper.selectList(null); + assertThat(logs).extracting(CustomerOplog::getAction) + .containsExactly(CustomerConstants.ACTION_AGREEMENT_ADD, CustomerConstants.ACTION_AGREEMENT_EDIT); // 主键自然序=发生序 + assertThat(logs.get(1).getDetail()).contains("三级"); + } + + @Test + @DisplayName("删除:软删 + 快照回退(删最新 → 次新等级;删空 → NULL=未签)+ oplog AGREEMENT_DELETE") + void delete_snapshotFallback() throws Exception { + Customer c = insertRaw("云启科技有限公司", OPERATOR_ID, DEPT_ID); + Long olderId = service.create(agreementDTO(c.getId(), 2, null, null)); + Long newerId = service.create(agreementDTO(c.getId(), 3, null, null)); + // 显式错开 create_time,钉死「最新」语义(对齐 pageFollows 测试做法) + exec("UPDATE customer_agreement SET create_time = '2026-01-01 10:00:00' WHERE id = " + olderId); + exec("UPDATE customer_agreement SET create_time = '2026-02-01 10:00:00' WHERE id = " + newerId); + + service.delete(newerId); + assertThat(agreementMapper.selectById(newerId)).isNull(); // @TableLogic 已删行自动过滤 + assertThat(deletedFlag(newerId)).isEqualTo(1); // 软删位落库 + assertThat(customerMapper.selectById(c.getId()).getStrategicAgreementLevel()).isEqualTo(2); + + service.delete(olderId); + assertThat(customerMapper.selectById(c.getId()).getStrategicAgreementLevel()).isNull(); // 未签 + + List logs = oplogMapper.selectList(new com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper() + .eq(CustomerOplog::getAction, CustomerConstants.ACTION_AGREEMENT_DELETE) + .orderByDesc(CustomerOplog::getId)); + assertThat(logs).hasSize(2); + assertThat(logs).extracting(CustomerOplog::getDetail) + .containsExactly("删除战略协议【二级】", "删除战略协议【三级】"); // id 倒序=删除发生倒序(最后删的是二级) + } + + @Test + @DisplayName("列表与详情:时间倒序 + 带出客户名") + void list_and_detail() { + Customer c = insertRaw("云启科技有限公司", OPERATOR_ID, DEPT_ID); + Long olderId = service.create(agreementDTO(c.getId(), 1, null, "旧协议")); + service.create(agreementDTO(c.getId(), 3, null, "新协议")); + exec("UPDATE customer_agreement SET create_time = '2026-01-01 10:00:00' WHERE id = " + olderId); + + List list = service.listByCustomer(c.getId()); + assertThat(list).hasSize(2); + assertThat(list.get(0).getRemark()).isEqualTo("新协议"); // 时间倒序 + assertThat(list.get(0).getCustomerName()).isEqualTo("云启科技有限公司"); + + AgreementDTO detail = service.detail(list.get(0).getId()); + assertThat(detail.getAgreementLevel()).isEqualTo(3); + assertThat(detail.getCustomerName()).isEqualTo("云启科技有限公司"); + } + + // ==================== 校验 / 权限路径 ==================== + + @Test + @DisplayName("校验:所属客户缺失 67001 / 等级缺失或越界 67017 / 客户不存在 67002") + void create_validation() { + assertThatThrownBy(() -> service.create(agreementDTO(null, 2, null, null))) + .isInstanceOfSatisfying(BusinessErrorException.class, + e -> assertThat(e.getCode()).isEqualTo(CustomerConstants.CODE_CUST_INVALID)); + + Customer c = insertRaw("云启科技有限公司", OPERATOR_ID, DEPT_ID); + assertThatThrownBy(() -> service.create(agreementDTO(c.getId(), null, null, null))) + .isInstanceOfSatisfying(BusinessErrorException.class, + e -> assertThat(e.getCode()).isEqualTo(CustomerConstants.CODE_AGREEMENT_INVALID)); + assertThatThrownBy(() -> service.create(agreementDTO(c.getId(), 4, null, null))) + .isInstanceOfSatisfying(BusinessErrorException.class, + e -> assertThat(e.getCode()).isEqualTo(CustomerConstants.CODE_AGREEMENT_INVALID)); + assertThatThrownBy(() -> service.create(agreementDTO(999999L, 2, null, null))) + .isInstanceOfSatisfying(BusinessErrorException.class, + e -> assertThat(e.getCode()).isEqualTo(CustomerConstants.CODE_CUST_NOT_EXIST)); + } + + @Test + @DisplayName("协议不存在 67017 防探测;权限继承客户(SELF 对他人客户:页签 67002、其协议详情 67002)") + void notExist_and_visibilityInheritance() { + assertThatThrownBy(() -> service.detail(999999L)) + .isInstanceOfSatisfying(BusinessErrorException.class, + e -> assertThat(e.getCode()).isEqualTo(CustomerConstants.CODE_AGREEMENT_INVALID)); + + Customer other = insertRaw("他人客户有限公司", OTHER_OWNER_ID, OTHER_DEPT_ID); + CustomerAgreement hidden = new CustomerAgreement(); // mapper 直插他人客户名下协议 + hidden.setCustomerId(other.getId()); + hidden.setAgreementLevel(2); + agreementMapper.insert(hidden); + + loadSelfScope(); + try { + assertThatThrownBy(() -> service.listByCustomer(other.getId())) + .isInstanceOfSatisfying(BusinessErrorException.class, + e -> assertThat(e.getCode()).isEqualTo(CustomerConstants.CODE_CUST_NOT_EXIST)); + assertThatThrownBy(() -> service.detail(hidden.getId())) + .isInstanceOfSatisfying(BusinessErrorException.class, + e -> assertThat(e.getCode()).isEqualTo(CustomerConstants.CODE_CUST_NOT_EXIST)); + assertThatThrownBy(() -> service.delete(hidden.getId())) + .isInstanceOfSatisfying(BusinessErrorException.class, + e -> assertThat(e.getCode()).isEqualTo(CustomerConstants.CODE_CUST_NOT_EXIST)); + } finally { + DataVisibilityContext.clear(); + } + } + + // ==================== helpers ==================== + + private AgreementDTO agreementDTO(Long customerId, Integer level, String amount, String remark) { + AgreementDTO dto = new AgreementDTO(); + dto.setCustomerId(customerId); + dto.setAgreementLevel(level); + dto.setAmount(amount); + dto.setRemark(remark); + return dto; + } + + private Customer insertRaw(String name, Long ownerUserId, Long ownerDeptId) { + Customer c = new Customer(); + c.setCustomerNo("KHA" + String.format("%04d", noSeq++)); + c.setCustomerName(name); + c.setCustomerType("TYPE_A"); + c.setCustomerStage(1); + c.setArchiveStatus(1); + c.setOwnerUserId(ownerUserId); + c.setOwnerDeptId(ownerDeptId); + c.setVersion(0); + customerMapper.insert(c); + return c; + } + + private void loadSelfScope() { + DataVisibilityContext.load(new DataVisibility(OPERATOR_ID, DEPT_ID, + List.of(DEPT_ID), Map.of("customer", DataScopeLevel.SELF), null)); + } + + private void exec(String sql) { + try (Statement st = session.getConnection().createStatement()) { + st.execute(sql); + } catch (Exception e) { + throw new IllegalStateException("测试 SQL 执行失败:" + sql, e); + } + } + + /** 原生读取软删位(绕过 @TableLogic 自动过滤,验证 deleted 落库值)。 */ + private Integer deletedFlag(Long id) { + try (Statement st = session.getConnection().createStatement(); + var rs = st.executeQuery("SELECT deleted FROM customer_agreement WHERE id = " + id)) { + assertThat(rs.next()).as("行应存在").isTrue(); + return rs.getInt(1); + } catch (Exception e) { + throw new IllegalStateException("查询软删位失败:id=" + id, e); + } + } + + private static final List SCHEMA = List.of(""" + CREATE TABLE IF NOT EXISTS customer ( + id bigint primary key, + customer_no varchar(32), + customer_name varchar(100), + customer_type varchar(50), + province_code varchar(20), + city_code varchar(20), + district_code varchar(20), + industry_code varchar(50), + industry_child_code varchar(50), + customer_star_level tinyint, + relation_star_level tinyint, + network_units text, + owner_user_id bigint, + owner_user_name_snapshot varchar(64), + owner_dept_id bigint, + owner_dept_name_snapshot varchar(64), + enter_pool_time datetime, + customer_stage tinyint default 1, + archive_status tinyint default 1, + last_valid_follow_time datetime, + strategic_agreement_level tinyint, + vip_customer_level tinyint, + company_decision_maker varchar(100), + is_biz_negotiated tinyint, + director_visit_time datetime, + is_child tinyint default 0, + parent_customer_id bigint, + parent_customer_name_snapshot varchar(100), + cooperation_system varchar(200), + non_coop_reason varchar(200), + joined_president_class tinyint, + president_class_person varchar(100), + president_class_phone varchar(20), + joined_product_class tinyint, + product_class_person varchar(100), + product_class_phone varchar(20), + unified_credit_code varchar(18), + legal_representative varchar(100), + established_date date, + registered_capital varchar(100), + business_scope text, + staff_size varchar(50), + annual_revenue varchar(50), + business_address varchar(500), + biz_name_from_lookup varchar(200), + remark varchar(500), + version int default 0, + creator_id varchar(64), + create_time datetime, + updater_id varchar(64), + update_time datetime, + deleted tinyint default 0 + ) + """, """ + CREATE TABLE IF NOT EXISTS customer_agreement ( + id bigint primary key, + customer_id bigint not null, + agreement_level tinyint not null, + amount varchar(64), + remark varchar(500), + file_file_id varchar(64), + creator_id varchar(64), + create_time datetime, + updater_id varchar(64), + update_time datetime, + deleted tinyint default 0 + ) + """, """ + CREATE TABLE IF NOT EXISTS customer_oplog ( + id bigint primary key, + customer_id bigint, + action varchar(50), + detail varchar(1000), + operator_id bigint, + operator_name varchar(50), + operator_dept_name varchar(100), + creator_id varchar(64), + create_time datetime, + updater_id varchar(64), + update_time datetime, + deleted tinyint default 0 + ) + """); +} diff --git a/crm-customer/src/test/java/com/crm/customer/service/impl/CustomerContactServiceIntegrationTest.java b/crm-customer/src/test/java/com/crm/customer/service/impl/CustomerContactServiceIntegrationTest.java index 32b9d7f..d65e81f 100644 --- a/crm-customer/src/test/java/com/crm/customer/service/impl/CustomerContactServiceIntegrationTest.java +++ b/crm-customer/src/test/java/com/crm/customer/service/impl/CustomerContactServiceIntegrationTest.java @@ -24,6 +24,7 @@ import com.crm.customer.domain.dto.CustomerSaveResultDTO; import com.crm.customer.domain.dto.CustomerSearchItemDTO; import com.crm.customer.domain.entity.Customer; import com.crm.customer.domain.entity.CustomerContact; +import com.crm.customer.domain.entity.CustomerOplog; import com.crm.customer.domain.param.ContactPageParam; import com.crm.customer.domain.param.CustomerSearchParam; import com.crm.customer.mapper.CustomerContactMapper; @@ -152,7 +153,8 @@ class CustomerContactServiceIntegrationTest { oplogMapper = session.getMapper(CustomerOplogMapper.class); CustomerDedupSettingProvider settings = new DefaultCustomerDedupSettingProvider(); - CustomerContactServiceImpl impl = new CustomerContactServiceImpl(customerMapper, settings); + CustomerContactServiceImpl impl = new CustomerContactServiceImpl(customerMapper, settings, + new CustomerOplogWriter(oplogMapper, userService, deptService)); ReflectionTestUtils.setField(impl, "baseMapper", contactMapper); ReflectionTestUtils.setField(impl, "entityClass", CustomerContact.class); contactService = impl; @@ -162,7 +164,7 @@ class CustomerContactServiceIntegrationTest { CustomerDedupService dedup = new CustomerDedupService(customerMapper, port, settings, userService); CustomerServiceImpl custImpl = new CustomerServiceImpl( new CustomerOplogWriter(oplogMapper, userService, deptService), - dedup, userService, deptService, dictQueryService); + dedup, userService, deptService, dictQueryService, name -> List.of()); ReflectionTestUtils.setField(custImpl, "baseMapper", customerMapper); ReflectionTestUtils.setField(custImpl, "entityClass", Customer.class); customerService = custImpl; @@ -436,12 +438,36 @@ class CustomerContactServiceIntegrationTest { @Override public boolean creditCodeEnabled() { return true; } @Override public boolean phoneSoftCheckEnabled() { return false; } }; - CustomerContactServiceImpl svc = new CustomerContactServiceImpl(customerMapper, off); + CustomerContactServiceImpl svc = new CustomerContactServiceImpl(customerMapper, off, + new CustomerOplogWriter(oplogMapper, userService, deptService)); ReflectionTestUtils.setField(svc, "baseMapper", contactMapper); ReflectionTestUtils.setField(svc, "entityClass", CustomerContact.class); assertThat(svc.checkPhone("13800001111", null)).isEmpty(); } + // ==================== 操作日志(返工票 09-F10 / a4-5-6) ==================== + + @Test + @DisplayName("增删改写客户 oplog:CONTACT_ADD/EDIT/DELETE 记 customerId + 联系人名 detail") + void oplog_contactActions() { + Customer cust = insertRaw("云启科技有限公司", OPERATOR_ID, DEPT_ID); + Long id = contactService.create(contactDTO(cust.getId(), "王经理", "采购总监", "13800001111")); + + ContactDTO edit = contactDTO(cust.getId(), "王经理", "采购总监", "13800001111"); + edit.setName("王建国"); + contactService.update(id, edit); + contactService.delete(id); + + List logs = oplogMapper.selectList(new com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper() + .eq(CustomerOplog::getCustomerId, cust.getId()) + .orderByAsc(CustomerOplog::getId)); + assertThat(logs).extracting(CustomerOplog::getAction) + .containsExactly("CONTACT_ADD", "CONTACT_EDIT", "CONTACT_DELETE"); + assertThat(logs.get(0).getDetail()).contains("王经理").contains("新增联系人"); + assertThat(logs.get(1).getDetail()).contains("王建国").contains("修改联系人"); + assertThat(logs.get(2).getDetail()).contains("王建国").contains("删除联系人"); + } + // ==================== 商机侧硬依赖(CustomerService,票 03 契约) ==================== @Test diff --git a/crm-customer/src/test/java/com/crm/customer/service/impl/CustomerDetailMembersIntegrationTest.java b/crm-customer/src/test/java/com/crm/customer/service/impl/CustomerDetailMembersIntegrationTest.java index 7d32c28..c278e0f 100644 --- a/crm-customer/src/test/java/com/crm/customer/service/impl/CustomerDetailMembersIntegrationTest.java +++ b/crm-customer/src/test/java/com/crm/customer/service/impl/CustomerDetailMembersIntegrationTest.java @@ -24,6 +24,7 @@ import com.crm.customer.mapper.CustomerFollowMapper; import com.crm.customer.mapper.CustomerMapper; import com.crm.customer.mapper.CustomerOplogMapper; import com.crm.customer.mapper.CustomerTeamMemberMapper; +import com.crm.customer.mapper.CustomerViewLogMapper; import com.crm.customer.port.CustomerOpportunityQueryPort; import com.crm.customer.service.CustomerOplogWriter; import com.crm.customer.service.ICustomerDetailService; @@ -80,6 +81,7 @@ class CustomerDetailMembersIntegrationTest { private CustomerFollowMapper followMapper; private CustomerTeamMemberMapper teamMemberMapper; private CustomerOplogMapper oplogMapper; + private CustomerViewLogMapper viewLogMapper; private ICustomerDetailService detailService; private MockedStatic securityMock; private int noSeq = 1; @@ -112,6 +114,7 @@ class CustomerDetailMembersIntegrationTest { configuration.addMapper(CustomerFollowMapper.class); configuration.addMapper(CustomerTeamMemberMapper.class); configuration.addMapper(CustomerOplogMapper.class); + configuration.addMapper(CustomerViewLogMapper.class); sqlSessionFactory = new SqlSessionFactoryBuilder().build(configuration); try (SqlSession s = sqlSessionFactory.openSession(true)) { @@ -130,15 +133,17 @@ class CustomerDetailMembersIntegrationTest { st.execute("DELETE FROM customer"); st.execute("DELETE FROM customer_team_member"); st.execute("DELETE FROM customer_oplog"); + st.execute("DELETE FROM customer_view_log"); } customerMapper = session.getMapper(CustomerMapper.class); followMapper = session.getMapper(CustomerFollowMapper.class); teamMemberMapper = session.getMapper(CustomerTeamMemberMapper.class); oplogMapper = session.getMapper(CustomerOplogMapper.class); + viewLogMapper = session.getMapper(CustomerViewLogMapper.class); CustomerOplogWriter writer = new CustomerOplogWriter(oplogMapper, userService, deptService); detailService = new CustomerDetailServiceImpl(customerMapper, followMapper, - teamMemberMapper, oplogMapper, new NoopPort(), userService, deptService, writer); + teamMemberMapper, oplogMapper, viewLogMapper, new NoopPort(), userService, deptService, writer); securityMock = Mockito.mockStatic(SecurityUtils.class); securityMock.when(SecurityUtils::getRequiredUserId).thenReturn(String.valueOf(OPERATOR_ID)); @@ -433,5 +438,13 @@ class CustomerDetailMembersIntegrationTest { update_time datetime, deleted tinyint default 0 ) + """, """ + CREATE TABLE IF NOT EXISTS customer_view_log ( + id bigint primary key, + user_id bigint not null, + customer_id bigint not null, + last_view_time datetime not null, + UNIQUE (user_id, customer_id) + ) """); } diff --git a/crm-customer/src/test/java/com/crm/customer/service/impl/CustomerFollowDetailIntegrationTest.java b/crm-customer/src/test/java/com/crm/customer/service/impl/CustomerFollowDetailIntegrationTest.java index 45f16eb..b68b47b 100644 --- a/crm-customer/src/test/java/com/crm/customer/service/impl/CustomerFollowDetailIntegrationTest.java +++ b/crm-customer/src/test/java/com/crm/customer/service/impl/CustomerFollowDetailIntegrationTest.java @@ -23,10 +23,12 @@ import com.crm.customer.domain.entity.Customer; import com.crm.customer.domain.entity.CustomerFollow; import com.crm.customer.domain.entity.CustomerOplog; import com.crm.customer.domain.entity.CustomerTeamMember; +import com.crm.customer.domain.entity.CustomerViewLog; import com.crm.customer.mapper.CustomerFollowMapper; import com.crm.customer.mapper.CustomerMapper; import com.crm.customer.mapper.CustomerOplogMapper; import com.crm.customer.mapper.CustomerTeamMemberMapper; +import com.crm.customer.mapper.CustomerViewLogMapper; import com.crm.customer.port.CustomerOpportunityQueryPort; import com.crm.customer.service.CustomerOplogWriter; import com.crm.customer.service.ICustomerDetailService; @@ -85,6 +87,7 @@ class CustomerFollowDetailIntegrationTest { private CustomerFollowMapper followMapper; private CustomerTeamMemberMapper teamMemberMapper; private CustomerOplogMapper oplogMapper; + private CustomerViewLogMapper viewLogMapper; private ICustomerFollowService followService; private ICustomerDetailService detailService; private CustomerOplogWriter writer; @@ -119,6 +122,7 @@ class CustomerFollowDetailIntegrationTest { configuration.addMapper(CustomerFollowMapper.class); configuration.addMapper(CustomerTeamMemberMapper.class); configuration.addMapper(CustomerOplogMapper.class); + configuration.addMapper(CustomerViewLogMapper.class); sqlSessionFactory = new SqlSessionFactoryBuilder().build(configuration); try (SqlSession s = sqlSessionFactory.openSession(true)) { @@ -138,11 +142,13 @@ class CustomerFollowDetailIntegrationTest { st.execute("DELETE FROM customer_follow"); st.execute("DELETE FROM customer_team_member"); st.execute("DELETE FROM customer_oplog"); + st.execute("DELETE FROM customer_view_log"); } customerMapper = session.getMapper(CustomerMapper.class); followMapper = session.getMapper(CustomerFollowMapper.class); teamMemberMapper = session.getMapper(CustomerTeamMemberMapper.class); oplogMapper = session.getMapper(CustomerOplogMapper.class); + viewLogMapper = session.getMapper(CustomerViewLogMapper.class); writer = new CustomerOplogWriter(oplogMapper, userService, deptService); followService = new CustomerFollowServiceImpl(customerMapper, userService, deptService, writer); @@ -150,7 +156,7 @@ class CustomerFollowDetailIntegrationTest { ReflectionTestUtils.setField(followService, "entityClass", CustomerFollow.class); detailService = new CustomerDetailServiceImpl(customerMapper, followMapper, teamMemberMapper, - oplogMapper, new NoopPort(), userService, deptService, writer); + oplogMapper, viewLogMapper, new NoopPort(), userService, deptService, writer); securityMock = Mockito.mockStatic(SecurityUtils.class); securityMock.when(SecurityUtils::getRequiredUserId).thenReturn(String.valueOf(OPERATOR_ID)); @@ -296,7 +302,7 @@ class CustomerFollowDetailIntegrationTest { // port 异常 → 计数降级 null(前端显 "--"),头部不失败 ICustomerDetailService degraded = new CustomerDetailServiceImpl(customerMapper, followMapper, - teamMemberMapper, oplogMapper, new CustomerOpportunityQueryPort() { + teamMemberMapper, oplogMapper, viewLogMapper, new CustomerOpportunityQueryPort() { @Override public PageResult pageByCustomerId( Long customerId, BaseParam param) { @@ -381,6 +387,26 @@ class CustomerFollowDetailIntegrationTest { assertThat(page.getTotal()).isZero(); } + @Test + @DisplayName("详情触达(F7):detailHead upsert customer_view_log——已有行刷新锚点、新客户首访插入") + void detailHead_touchViewLog() { + Customer c = newCust("客户甲"); + LocalDateTime first = LocalDateTime.now().minusMinutes(1); + exec("INSERT INTO customer_view_log (id, user_id, customer_id, last_view_time) " + + "VALUES (770001, " + OPERATOR_ID + ", " + c.getId() + ", '" + first + "')"); + + detailService.detailHead(c.getId()); + + List rows = viewLogMapper.selectList(null); + assertThat(rows).hasSize(1); // UNIQUE(user_id, customer_id) 去重,upsert 不新增行 + assertThat(rows.get(0).getUserId()).isEqualTo(OPERATOR_ID); + assertThat(rows.get(0).getLastViewTime()).isAfter(first); + + Customer other = newCust("客户乙"); + detailService.detailHead(other.getId()); // 首访 → insert 第二行 + assertThat(viewLogMapper.selectList(null)).hasSize(2); + } + // ==================== helpers ==================== private FollowCreateDTO followOf(String content) { @@ -535,5 +561,13 @@ class CustomerFollowDetailIntegrationTest { update_time datetime, deleted tinyint default 0 ) + """, """ + CREATE TABLE IF NOT EXISTS customer_view_log ( + id bigint primary key, + user_id bigint not null, + customer_id bigint not null, + last_view_time datetime not null, + UNIQUE (user_id, customer_id) + ) """); } diff --git a/crm-customer/src/test/java/com/crm/customer/service/impl/CustomerImportIntegrationTest.java b/crm-customer/src/test/java/com/crm/customer/service/impl/CustomerImportIntegrationTest.java index 0063259..e8f98d4 100644 --- a/crm-customer/src/test/java/com/crm/customer/service/impl/CustomerImportIntegrationTest.java +++ b/crm-customer/src/test/java/com/crm/customer/service/impl/CustomerImportIntegrationTest.java @@ -322,8 +322,12 @@ class CustomerImportIntegrationTest { } private ImportPreviewDTO upload(byte[] bytes, String importMode) { + return upload(bytes, importMode, null); + } + + private ImportPreviewDTO upload(byte[] bytes, String importMode, String duplicateStrategy) { MockMultipartFile file = new MockMultipartFile("file", "import.xlsx", XLSX_TYPE, bytes); - return importService.upload(file, importMode); + return importService.upload(file, importMode, duplicateStrategy); } private ImportPreviewDTO uploadStandard(List> customerRows, List> contactRows, @@ -332,6 +336,12 @@ class CustomerImportIntegrationTest { importMode); } + private ImportPreviewDTO uploadStandard(List> customerRows, List> contactRows, + String importMode, String duplicateStrategy) { + return upload(excel(headOf(CustomerImportServiceImpl.CUSTOMER_HEADERS), customerRows, contactRows), + importMode, duplicateStrategy); + } + private Long singleTaskId() { return taskMapper.selectList(new LambdaQueryWrapper<>()).get(0).getId(); } @@ -450,6 +460,47 @@ class CustomerImportIntegrationTest { .containsOnly("文件内多行匹配同一客户(重复时不导入),请合并为单行"); } + @Test + @DisplayName("upload OVERWRITE:组内仅最后一条通过校验的行生效,confirm 后按此执行(返工票 09-F8)") + void upload_duplicateGroupOverwriteLastWins() { + newCust("KH0001", "客户甲", null, "旧备注", 3); + + ImportPreviewDTO preview = uploadStandard( + rowsOf( + row("KH0001", "客户甲一", null, null, null, null, null, null, "改一"), + row("KH0001", "客户甲二", null, null, null, null, null, null, "改二")), + List.of(), CustomerConstants.IMPORT_MODE_UPSERT, + CustomerConstants.IMPORT_DUP_OVERWRITE); + + assertThat(preview.getDuplicateStrategy()).isEqualTo(CustomerConstants.IMPORT_DUP_OVERWRITE); + assertThat(preview.getUpdateCount()).isEqualTo(1); + assertThat(preview.getFailCount()).isEqualTo(1); + assertThat(preview.getRows()).extracting(ImportPreviewDTO.Row::getReason) + .containsOnlyOnce("文件内多行匹配同一客户(覆盖导入:仅最后一条通过校验的行生效),本行未执行"); + + Long taskId = singleTaskId(); + importService.confirm(taskId); + + CustomerImportTask task = taskMapper.selectById(taskId); + assertThat(task.getDuplicateStrategy()).isEqualTo(CustomerConstants.IMPORT_DUP_OVERWRITE); + assertThat(task.getStatus()).isEqualTo(CustomerConstants.IMPORT_STATUS_DONE); + assertThat(task.getUpdateCount()).isEqualTo(1); + assertThat(task.getFailCount()).isEqualTo(1); + // 最后一条生效:备注=改二 + assertThat(customerMapper.selectOne(new LambdaQueryWrapper() + .eq(Customer::getCustomerNo, "KH0001")).getRemark()).isEqualTo("改二"); + assertThat(failMapper.selectCount(new LambdaQueryWrapper() + .eq(CustomerImportFail::getTaskId, taskId))).isEqualTo(1); + } + + @Test + @DisplayName("upload 重复策略非法 → 67013") + void upload_illegalDuplicateStrategy() { + assertCode(() -> uploadStandard(List.of( + row(null, "新客户甲", null, null, null, null, null, "3", null)), + List.of(), CustomerConstants.IMPORT_MODE_UPSERT, "MERGE"), 67013); + } + // ==================== 更新语义(issues-09 §C) ==================== @Test @@ -806,6 +857,7 @@ class CustomerImportIntegrationTest { CREATE TABLE IF NOT EXISTS customer_import_task ( id bigint primary key, import_mode varchar(20) not null, + duplicate_strategy varchar(20) not null default 'SKIP', template_version varchar(10) not null, file_file_id varchar(64), file_hash varchar(64), diff --git a/crm-customer/src/test/java/com/crm/customer/service/impl/CustomerServiceImplIntegrationTest.java b/crm-customer/src/test/java/com/crm/customer/service/impl/CustomerServiceImplIntegrationTest.java index b077051..aee0c87 100644 --- a/crm-customer/src/test/java/com/crm/customer/service/impl/CustomerServiceImplIntegrationTest.java +++ b/crm-customer/src/test/java/com/crm/customer/service/impl/CustomerServiceImplIntegrationTest.java @@ -19,10 +19,12 @@ import com.crm.base.security.SecurityUtils; import com.crm.customer.domain.dto.CustomerCreateDTO; import com.crm.customer.domain.dto.CustomerSaveResultDTO; import com.crm.customer.domain.dto.CustomerUpdateDTO; +import com.crm.customer.domain.dto.CompanyBatchUpdateDTO; import com.crm.customer.domain.entity.Customer; import com.crm.customer.domain.entity.CustomerOplog; import com.crm.customer.mapper.CustomerMapper; import com.crm.customer.mapper.CustomerOplogMapper; +import com.crm.customer.port.CompanyLookupPort; import com.crm.customer.port.impl.NgramNameSimilarityPortImpl; import com.crm.customer.service.CustomerDedupService; import com.crm.customer.service.CustomerDedupSettingProvider; @@ -30,6 +32,7 @@ import com.crm.customer.service.CustomerNameMatchMode; import com.crm.customer.service.CustomerOplogWriter; import com.crm.dict.service.DictQueryService; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import org.apache.ibatis.mapping.Environment; import org.apache.ibatis.session.LocalCacheScope; import org.apache.ibatis.session.SqlSession; @@ -89,6 +92,8 @@ class CustomerServiceImplIntegrationTest { private final IAuthUserService userService = mock(IAuthUserService.class); private final ISysDeptService deptService = mock(ISysDeptService.class); private final DictQueryService dictQueryService = mock(DictQueryService.class); + private final com.crm.customer.port.CompanyLookupPort companyLookupPort = + mock(com.crm.customer.port.CompanyLookupPort.class); @BeforeAll static void bootstrap() throws Exception { @@ -139,7 +144,7 @@ class CustomerServiceImplIntegrationTest { NgramNameSimilarityPortImpl port = new NgramNameSimilarityPortImpl(customerMapper, settings, DS); CustomerDedupService dedup = new CustomerDedupService(customerMapper, port, settings, userService); service = new CustomerServiceImpl(new CustomerOplogWriter(oplogMapper, userService, deptService), - dedup, userService, deptService, dictQueryService); + dedup, userService, deptService, dictQueryService, companyLookupPort); ReflectionTestUtils.setField(service, "baseMapper", customerMapper); ReflectionTestUtils.setField(service, "entityClass", Customer.class); @@ -281,6 +286,77 @@ class CustomerServiceImplIntegrationTest { e -> assertThat(e.getCode()).isEqualTo(67001)); } + // ==================== 批量工商更新(返工票 09-F6 / a4-3-1) ==================== + + @Test + @DisplayName("批量工商更新:命中候选只回填空缺字段 + oplog,行级 UPDATED") + void batchCompanyUpdate_fillsBlankFields() { + Customer c = insertRaw("云启科技有限公司", null); + when(companyLookupPort.lookup("云启科技有限公司")).thenReturn(List.of( + new CompanyLookupPort.CompanyCandidate("云启科技有限公司(沪)", "91310000MA1FL0000X", + "张三", LocalDate.of(2015, 3, 1), "1000万人民币", "软件开发", "50-99人", + "5000万", "上海市浦东新区"))); + + List results = service.batchCompanyUpdate(List.of(c.getId())); + + assertThat(results).hasSize(1); + CompanyBatchUpdateDTO r = results.get(0); + assertThat(r.getStatus()).isEqualTo(CompanyBatchUpdateDTO.UPDATED); + assertThat(r.getFilledFields()).isEqualTo(9); + Customer after = customerMapper.selectById(c.getId()); + assertThat(after.getBizNameFromLookup()).isEqualTo("云启科技有限公司(沪)"); + assertThat(after.getLegalRepresentative()).isEqualTo("张三"); + assertThat(after.getBusinessAddress()).isEqualTo("上海市浦东新区"); + List logs = oplogMapper.selectList(new LambdaQueryWrapper() + .eq(CustomerOplog::getCustomerId, c.getId()) + .eq(CustomerOplog::getAction, "UPDATE")); + assertThat(logs).hasSize(1); + assertThat(logs.get(0).getDetail()).contains("批量更新工商信息").contains("9"); + } + + @Test + @DisplayName("批量工商更新:已填字段不覆盖(§C2 只补空缺)→ SKIPPED 无 oplog") + void batchCompanyUpdate_skipsWhenFilled() { + Customer c = insertRaw("云启科技有限公司", null); + customerMapper.update(c, new LambdaUpdateWrapper() + .eq(Customer::getId, c.getId()) + .set(Customer::getLegalRepresentative, "已有法人")); + when(companyLookupPort.lookup("云启科技有限公司")).thenReturn(List.of( + new CompanyLookupPort.CompanyCandidate(null, null, + "张三", null, null, null, null, null, null))); + + CompanyBatchUpdateDTO r = service.batchCompanyUpdate(List.of(c.getId())).get(0); + + assertThat(r.getStatus()).isEqualTo(CompanyBatchUpdateDTO.SKIPPED); + assertThat(customerMapper.selectById(c.getId()).getLegalRepresentative()).isEqualTo("已有法人"); + assertThat(customerMapper.selectById(c.getId()).getBizNameFromLookup()).isNull(); + } + + @Test + @DisplayName("批量工商更新:工商源未命中 → NO_HIT;命中信用代码被他人占用 → CONFLICT 不写") + void batchCompanyUpdate_noHitAndConflict() { + Customer c = insertRaw("云启科技有限公司", null); + Customer other = insertRaw("已有公司", "91310000MA1FL0000X"); + when(companyLookupPort.lookup("云启科技有限公司")).thenReturn(List.of()); + assertThat(service.batchCompanyUpdate(List.of(c.getId())).get(0).getStatus()) + .isEqualTo(CompanyBatchUpdateDTO.NO_HIT); + + when(companyLookupPort.lookup("云启科技有限公司")).thenReturn(List.of( + new CompanyLookupPort.CompanyCandidate("云启科技有限公司(沪)", "91310000MA1FL0000X", + null, null, null, null, null, null, null))); + CompanyBatchUpdateDTO conflict = service.batchCompanyUpdate(List.of(c.getId())).get(0); + assertThat(conflict.getStatus()).isEqualTo(CompanyBatchUpdateDTO.CONFLICT); + assertThat(customerMapper.selectById(c.getId()).getUnifiedCreditCode()).isNull(); + } + + @Test + @DisplayName("批量工商更新:ids 空 → 67001") + void batchCompanyUpdate_emptyIds() { + assertThatThrownBy(() -> service.batchCompanyUpdate(List.of())) + .isInstanceOfSatisfying(BusinessErrorException.class, + e -> assertThat(e.getCode()).isEqualTo(67001)); + } + // ==================== 编辑 ==================== @Test diff --git a/logs/crm-app.log b/logs/crm-app.log index eb3984a..0de70c5 100644 --- a/logs/crm-app.log +++ b/logs/crm-app.log @@ -1,1526 +1,261 @@ -<<<<<<< Updated upstream -2026-09-04T00:00:00.002+08:00 INFO 24328 --- [crm-app] [scheduling-1] c.crm.customer.job.CustomerReminderJob : [ͻJob] ʼnow=2026-09-04T00:00:00.002723400 -2026-09-04T00:00:00.093+08:00 INFO 24328 --- [crm-app] [scheduling-1] c.crm.customer.job.CustomerReminderJob : [ͻJob] ɣ 1 êʧЧ 0 -2026-09-04T00:00:30.000+08:00 INFO 24328 --- [crm-app] [scheduling-1] c.crm.customer.job.CustomerReminderJob : [ͻJob] ʼnow=2026-09-04T00:00:30.000709700 -2026-09-04T00:00:30.085+08:00 INFO 24328 --- [crm-app] [scheduling-1] c.crm.customer.job.CustomerReminderJob : [ͻJob] ɣ 1 êʧЧ 0 -2026-09-04T00:01:00.000+08:00 INFO 24328 --- [crm-app] [scheduling-1] c.crm.customer.job.CustomerReminderJob : [ͻJob] ʼnow=2026-09-04T00:01:00.000291700 -2026-09-04T00:01:00.087+08:00 INFO 24328 --- [crm-app] [scheduling-1] c.crm.customer.job.CustomerReminderJob : [ͻJob] ɣ 1 êʧЧ 0 -2026-09-04T00:01:30.001+08:00 INFO 24328 --- [crm-app] [scheduling-1] c.crm.customer.job.CustomerReminderJob : [ͻJob] ʼnow=2026-09-04T00:01:30.001097100 -2026-09-04T00:01:30.082+08:00 INFO 24328 --- [crm-app] [scheduling-1] c.crm.customer.job.CustomerReminderJob : [ͻJob] ɣ 1 êʧЧ 0 -2026-09-04T00:02:00.012+08:00 INFO 24328 --- [crm-app] [scheduling-1] c.crm.customer.job.CustomerReminderJob : [ͻJob] ʼnow=2026-09-04T00:02:00.012911900 -2026-09-04T00:02:00.099+08:00 INFO 24328 --- [crm-app] [scheduling-1] c.crm.customer.job.CustomerReminderJob : [ͻJob] ɣ 1 êʧЧ 0 -2026-09-04T00:02:30.003+08:00 INFO 24328 --- [crm-app] [scheduling-1] c.crm.customer.job.CustomerReminderJob : [ͻJob] ʼnow=2026-09-04T00:02:30.003242700 -2026-09-04T00:02:30.086+08:00 INFO 24328 --- [crm-app] [scheduling-1] c.crm.customer.job.CustomerReminderJob : [ͻJob] ɣ 1 êʧЧ 0 -2026-09-04T00:03:00.007+08:00 INFO 24328 --- [crm-app] [scheduling-1] c.crm.customer.job.CustomerReminderJob : [ͻJob] ʼnow=2026-09-04T00:03:00.007878600 -2026-09-04T00:03:00.095+08:00 INFO 24328 --- [crm-app] [scheduling-1] c.crm.customer.job.CustomerReminderJob : [ͻJob] ɣ 1 êʧЧ 0 -2026-09-04T00:03:30.011+08:00 INFO 24328 --- [crm-app] [scheduling-1] c.crm.customer.job.CustomerReminderJob : [ͻJob] ʼnow=2026-09-04T00:03:30.011854300 -2026-09-04T00:03:30.097+08:00 INFO 24328 --- [crm-app] [scheduling-1] c.crm.customer.job.CustomerReminderJob : [ͻJob] ɣ 1 êʧЧ 0 -2026-09-04T00:03:34.954+08:00 WARN 24328 --- [crm-app] [http-nio-8080-exec-3] c.c.a.controller.DebugTokenController : [verify] Ϊ userId=739564171091247104 ǩ token -2026-09-04T00:04:00.011+08:00 INFO 24328 --- [crm-app] [scheduling-1] c.crm.customer.job.CustomerReminderJob : [ͻJob] ʼnow=2026-09-04T00:04:00.011930800 -2026-09-04T00:04:00.097+08:00 INFO 24328 --- [crm-app] [scheduling-1] c.crm.customer.job.CustomerReminderJob : [ͻJob] ɣ 1 êʧЧ 0 -2026-09-04T00:04:30.015+08:00 INFO 24328 --- [crm-app] [scheduling-1] c.crm.customer.job.CustomerReminderJob : [ͻJob] ʼnow=2026-09-04T00:04:30.015487400 -2026-09-04T00:04:30.096+08:00 INFO 24328 --- [crm-app] [scheduling-1] c.crm.customer.job.CustomerReminderJob : [ͻJob] ɣ 1 êʧЧ 0 -2026-09-04T00:04:54.675+08:00 ERROR 24328 --- [crm-app] [http-nio-8080-exec-8] c.c.b.a.GlobalExceptionHandlerAdvice : ȫ쳣 +2026-09-05T11:23:07.515+08:00 INFO 21796 --- [crm-app] [main] com.crm.app.CrmAppApplication : Starting CrmAppApplication v1.0.0-SNAPSHOT using Java 17.0.15 with PID 21796 (D:\code\crm-backend-matt\crm-app\target\crm-app-1.0.0-SNAPSHOT.jar started by luowj in D:\code\crm-backend-matt) +2026-09-05T11:23:07.541+08:00 INFO 21796 --- [crm-app] [main] com.crm.app.CrmAppApplication : The following 1 profile is active: "verify" +2026-09-05T11:23:09.924+08:00 INFO 21796 --- [crm-app] [main] .s.d.r.c.RepositoryConfigurationDelegate : Multiple Spring Data modules found, entering strict repository configuration mode +2026-09-05T11:23:09.928+08:00 INFO 21796 --- [crm-app] [main] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data JPA repositories in DEFAULT mode. +2026-09-05T11:23:09.977+08:00 INFO 21796 --- [crm-app] [main] .s.d.r.c.RepositoryConfigurationDelegate : Finished Spring Data repository scanning in 36 ms. Found 0 JPA repository interfaces. +2026-09-05T11:23:10.007+08:00 INFO 21796 --- [crm-app] [main] .s.d.r.c.RepositoryConfigurationDelegate : Multiple Spring Data modules found, entering strict repository configuration mode +2026-09-05T11:23:10.009+08:00 INFO 21796 --- [crm-app] [main] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data Redis repositories in DEFAULT mode. +2026-09-05T11:23:10.032+08:00 INFO 21796 --- [crm-app] [main] .s.d.r.c.RepositoryConfigurationDelegate : Finished Spring Data repository scanning in 3 ms. Found 0 Redis repository interfaces. +2026-09-05T11:23:10.279+08:00 WARN 21796 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'crmBaseMapper' and 'com.crm.base.mapper.CrmBaseMapper' mapperInterface. Bean already defined with the same name! +2026-09-05T11:23:10.282+08:00 WARN 21796 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'authIdentityMapper' and 'com.crm.auth.mapper.AuthIdentityMapper' mapperInterface. Bean already defined with the same name! +2026-09-05T11:23:10.283+08:00 WARN 21796 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'authUserMapper' and 'com.crm.auth.mapper.AuthUserMapper' mapperInterface. Bean already defined with the same name! +2026-09-05T11:23:10.284+08:00 WARN 21796 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'sysDataScopeModuleMapper' and 'com.crm.auth.mapper.SysDataScopeModuleMapper' mapperInterface. Bean already defined with the same name! +2026-09-05T11:23:10.284+08:00 WARN 21796 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'sysDeptMapper' and 'com.crm.auth.mapper.SysDeptMapper' mapperInterface. Bean already defined with the same name! +2026-09-05T11:23:10.285+08:00 WARN 21796 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'sysMenuMapper' and 'com.crm.auth.mapper.SysMenuMapper' mapperInterface. Bean already defined with the same name! +2026-09-05T11:23:10.286+08:00 WARN 21796 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'sysRoleDataScopeMapper' and 'com.crm.auth.mapper.SysRoleDataScopeMapper' mapperInterface. Bean already defined with the same name! +2026-09-05T11:23:10.287+08:00 WARN 21796 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'sysRoleMapper' and 'com.crm.auth.mapper.SysRoleMapper' mapperInterface. Bean already defined with the same name! +2026-09-05T11:23:10.287+08:00 WARN 21796 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'sysRoleMenuMapper' and 'com.crm.auth.mapper.SysRoleMenuMapper' mapperInterface. Bean already defined with the same name! +2026-09-05T11:23:10.288+08:00 WARN 21796 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'sysUserDeptMapper' and 'com.crm.auth.mapper.SysUserDeptMapper' mapperInterface. Bean already defined with the same name! +2026-09-05T11:23:10.288+08:00 WARN 21796 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'sysUserRoleMapper' and 'com.crm.auth.mapper.SysUserRoleMapper' mapperInterface. Bean already defined with the same name! +2026-09-05T11:23:10.289+08:00 WARN 21796 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'fileInfoMapper' and 'com.crm.file.mapper.FileInfoMapper' mapperInterface. Bean already defined with the same name! +2026-09-05T11:23:10.289+08:00 WARN 21796 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'dictGroupDefaultMapper' and 'com.crm.dict.mapper.DictGroupDefaultMapper' mapperInterface. Bean already defined with the same name! +2026-09-05T11:23:10.290+08:00 WARN 21796 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'dictGroupMapper' and 'com.crm.dict.mapper.DictGroupMapper' mapperInterface. Bean already defined with the same name! +2026-09-05T11:23:10.290+08:00 WARN 21796 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'dictItemMapper' and 'com.crm.dict.mapper.DictItemMapper' mapperInterface. Bean already defined with the same name! +2026-09-05T11:23:10.291+08:00 WARN 21796 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'dictRefCountMapper' and 'com.crm.dict.mapper.DictRefCountMapper' mapperInterface. Bean already defined with the same name! +2026-09-05T11:23:10.291+08:00 WARN 21796 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'customerDedupRuleMapper' and 'com.crm.rule.mapper.CustomerDedupRuleMapper' mapperInterface. Bean already defined with the same name! +2026-09-05T11:23:10.291+08:00 WARN 21796 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'customerReminderRuleMapper' and 'com.crm.rule.mapper.CustomerReminderRuleMapper' mapperInterface. Bean already defined with the same name! +2026-09-05T11:23:10.292+08:00 WARN 21796 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'leadPoolMapper' and 'com.crm.rule.mapper.LeadPoolMapper' mapperInterface. Bean already defined with the same name! +2026-09-05T11:23:10.292+08:00 WARN 21796 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'leadPoolMemberMapper' and 'com.crm.rule.mapper.LeadPoolMemberMapper' mapperInterface. Bean already defined with the same name! +2026-09-05T11:23:10.292+08:00 WARN 21796 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'leadPoolProvinceMapper' and 'com.crm.rule.mapper.LeadPoolProvinceMapper' mapperInterface. Bean already defined with the same name! +2026-09-05T11:23:10.295+08:00 WARN 21796 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'leadPoolRegionMapper' and 'com.crm.rule.mapper.LeadPoolRegionMapper' mapperInterface. Bean already defined with the same name! +2026-09-05T11:23:10.298+08:00 WARN 21796 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityPoolRuleDeptMapper' and 'com.crm.rule.mapper.OpportunityPoolRuleDeptMapper' mapperInterface. Bean already defined with the same name! +2026-09-05T11:23:10.299+08:00 WARN 21796 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityPoolRuleMapper' and 'com.crm.rule.mapper.OpportunityPoolRuleMapper' mapperInterface. Bean already defined with the same name! +2026-09-05T11:23:10.299+08:00 WARN 21796 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunitySchemeCardFieldMapper' and 'com.crm.rule.mapper.OpportunitySchemeCardFieldMapper' mapperInterface. Bean already defined with the same name! +2026-09-05T11:23:10.300+08:00 WARN 21796 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunitySchemeCardTemplateDeptMapper' and 'com.crm.rule.mapper.OpportunitySchemeCardTemplateDeptMapper' mapperInterface. Bean already defined with the same name! +2026-09-05T11:23:10.300+08:00 WARN 21796 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunitySchemeCardTemplateMapper' and 'com.crm.rule.mapper.OpportunitySchemeCardTemplateMapper' mapperInterface. Bean already defined with the same name! +2026-09-05T11:23:10.300+08:00 WARN 21796 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunitySchemeFieldDefMapper' and 'com.crm.rule.mapper.OpportunitySchemeFieldDefMapper' mapperInterface. Bean already defined with the same name! +2026-09-05T11:23:10.301+08:00 WARN 21796 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityStageNodeMapper' and 'com.crm.rule.mapper.OpportunityStageNodeMapper' mapperInterface. Bean already defined with the same name! +2026-09-05T11:23:10.301+08:00 WARN 21796 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityStageTemplateDeptMapper' and 'com.crm.rule.mapper.OpportunityStageTemplateDeptMapper' mapperInterface. Bean already defined with the same name! +2026-09-05T11:23:10.302+08:00 WARN 21796 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityStageTemplateMapper' and 'com.crm.rule.mapper.OpportunityStageTemplateMapper' mapperInterface. Bean already defined with the same name! +2026-09-05T11:23:10.302+08:00 WARN 21796 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'sysRegionMapper' and 'com.crm.rule.mapper.SysRegionMapper' mapperInterface. Bean already defined with the same name! +2026-09-05T11:23:10.303+08:00 WARN 21796 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'userColumnPreferenceMapper' and 'com.crm.preference.mapper.UserColumnPreferenceMapper' mapperInterface. Bean already defined with the same name! +2026-09-05T11:23:10.303+08:00 WARN 21796 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'userSavedViewMapper' and 'com.crm.preference.mapper.UserSavedViewMapper' mapperInterface. Bean already defined with the same name! +2026-09-05T11:23:10.304+08:00 WARN 21796 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'userViewFormMapper' and 'com.crm.preference.mapper.UserViewFormMapper' mapperInterface. Bean already defined with the same name! +2026-09-05T11:23:10.304+08:00 WARN 21796 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'leadAttachmentMapper' and 'com.crm.lead.mapper.LeadAttachmentMapper' mapperInterface. Bean already defined with the same name! +2026-09-05T11:23:10.305+08:00 WARN 21796 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'leadFeedbackMapper' and 'com.crm.lead.mapper.LeadFeedbackMapper' mapperInterface. Bean already defined with the same name! +2026-09-05T11:23:10.305+08:00 WARN 21796 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'leadFollowMapper' and 'com.crm.lead.mapper.LeadFollowMapper' mapperInterface. Bean already defined with the same name! +2026-09-05T11:23:10.305+08:00 WARN 21796 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'leadHistoryMapper' and 'com.crm.lead.mapper.LeadHistoryMapper' mapperInterface. Bean already defined with the same name! +2026-09-05T11:23:10.306+08:00 WARN 21796 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'leadMapper' and 'com.crm.lead.mapper.LeadMapper' mapperInterface. Bean already defined with the same name! +2026-09-05T11:23:10.306+08:00 WARN 21796 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityAttachmentMapper' and 'com.crm.opportunity.mapper.OpportunityAttachmentMapper' mapperInterface. Bean already defined with the same name! +2026-09-05T11:23:10.307+08:00 WARN 21796 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityCustomerMapper' and 'com.crm.opportunity.mapper.OpportunityCustomerMapper' mapperInterface. Bean already defined with the same name! +2026-09-05T11:23:10.307+08:00 WARN 21796 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityFocusMapper' and 'com.crm.opportunity.mapper.OpportunityFocusMapper' mapperInterface. Bean already defined with the same name! +2026-09-05T11:23:10.308+08:00 WARN 21796 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityFollowMapper' and 'com.crm.opportunity.mapper.OpportunityFollowMapper' mapperInterface. Bean already defined with the same name! +2026-09-05T11:23:10.308+08:00 WARN 21796 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityMapper' and 'com.crm.opportunity.mapper.OpportunityMapper' mapperInterface. Bean already defined with the same name! +2026-09-05T11:23:10.309+08:00 WARN 21796 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityOplogMapper' and 'com.crm.opportunity.mapper.OpportunityOplogMapper' mapperInterface. Bean already defined with the same name! +2026-09-05T11:23:10.309+08:00 WARN 21796 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityPendingNoticeMapper' and 'com.crm.opportunity.mapper.OpportunityPendingNoticeMapper' mapperInterface. Bean already defined with the same name! +2026-09-05T11:23:10.309+08:00 WARN 21796 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunitySchemeCardMapper' and 'com.crm.opportunity.mapper.OpportunitySchemeCardMapper' mapperInterface. Bean already defined with the same name! +2026-09-05T11:23:10.313+08:00 WARN 21796 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunitySchemeCardValueMapper' and 'com.crm.opportunity.mapper.OpportunitySchemeCardValueMapper' mapperInterface. Bean already defined with the same name! +2026-09-05T11:23:10.313+08:00 WARN 21796 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunitySiteSurveyMapper' and 'com.crm.opportunity.mapper.OpportunitySiteSurveyMapper' mapperInterface. Bean already defined with the same name! +2026-09-05T11:23:10.314+08:00 WARN 21796 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityStageHistoryMapper' and 'com.crm.opportunity.mapper.OpportunityStageHistoryMapper' mapperInterface. Bean already defined with the same name! +2026-09-05T11:23:10.315+08:00 WARN 21796 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityStatusHistoryMapper' and 'com.crm.opportunity.mapper.OpportunityStatusHistoryMapper' mapperInterface. Bean already defined with the same name! +2026-09-05T11:23:10.316+08:00 WARN 21796 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityTeamMapper' and 'com.crm.opportunity.mapper.OpportunityTeamMapper' mapperInterface. Bean already defined with the same name! +2026-09-05T11:23:10.316+08:00 WARN 21796 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityViewLogMapper' and 'com.crm.opportunity.mapper.OpportunityViewLogMapper' mapperInterface. Bean already defined with the same name! +2026-09-05T11:23:10.317+08:00 WARN 21796 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityWorkPlanMapper' and 'com.crm.opportunity.mapper.OpportunityWorkPlanMapper' mapperInterface. Bean already defined with the same name! +2026-09-05T11:23:10.317+08:00 WARN 21796 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'customerAgreementMapper' and 'com.crm.customer.mapper.CustomerAgreementMapper' mapperInterface. Bean already defined with the same name! +2026-09-05T11:23:10.318+08:00 WARN 21796 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'customerContactMapper' and 'com.crm.customer.mapper.CustomerContactMapper' mapperInterface. Bean already defined with the same name! +2026-09-05T11:23:10.318+08:00 WARN 21796 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'customerFocusMapper' and 'com.crm.customer.mapper.CustomerFocusMapper' mapperInterface. Bean already defined with the same name! +2026-09-05T11:23:10.318+08:00 WARN 21796 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'customerFollowMapper' and 'com.crm.customer.mapper.CustomerFollowMapper' mapperInterface. Bean already defined with the same name! +2026-09-05T11:23:10.319+08:00 WARN 21796 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'customerImportFailMapper' and 'com.crm.customer.mapper.CustomerImportFailMapper' mapperInterface. Bean already defined with the same name! +2026-09-05T11:23:10.319+08:00 WARN 21796 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'customerImportTaskMapper' and 'com.crm.customer.mapper.CustomerImportTaskMapper' mapperInterface. Bean already defined with the same name! +2026-09-05T11:23:10.319+08:00 WARN 21796 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'customerMapper' and 'com.crm.customer.mapper.CustomerMapper' mapperInterface. Bean already defined with the same name! +2026-09-05T11:23:10.320+08:00 WARN 21796 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'customerOplogMapper' and 'com.crm.customer.mapper.CustomerOplogMapper' mapperInterface. Bean already defined with the same name! +2026-09-05T11:23:10.320+08:00 WARN 21796 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'customerPendingNoticeMapper' and 'com.crm.customer.mapper.CustomerPendingNoticeMapper' mapperInterface. Bean already defined with the same name! +2026-09-05T11:23:10.320+08:00 WARN 21796 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'customerTeamMemberMapper' and 'com.crm.customer.mapper.CustomerTeamMemberMapper' mapperInterface. Bean already defined with the same name! +2026-09-05T11:23:10.321+08:00 WARN 21796 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'customerTransferDetailMapper' and 'com.crm.customer.mapper.CustomerTransferDetailMapper' mapperInterface. Bean already defined with the same name! +2026-09-05T11:23:10.321+08:00 WARN 21796 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'customerTransferMapper' and 'com.crm.customer.mapper.CustomerTransferMapper' mapperInterface. Bean already defined with the same name! +2026-09-05T11:23:10.321+08:00 WARN 21796 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'customerViewLogMapper' and 'com.crm.customer.mapper.CustomerViewLogMapper' mapperInterface. Bean already defined with the same name! +2026-09-05T11:23:10.322+08:00 WARN 21796 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : No MyBatis mapper was found in '[com.crm.**.mapper]' package. Please check your configuration. +2026-09-05T11:23:10.329+08:00 WARN 21796 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'crmBaseMapper' and 'com.crm.base.mapper.CrmBaseMapper' mapperInterface. Bean already defined with the same name! +2026-09-05T11:23:10.331+08:00 WARN 21796 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'authIdentityMapper' and 'com.crm.auth.mapper.AuthIdentityMapper' mapperInterface. Bean already defined with the same name! +2026-09-05T11:23:10.332+08:00 WARN 21796 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'authUserMapper' and 'com.crm.auth.mapper.AuthUserMapper' mapperInterface. Bean already defined with the same name! +2026-09-05T11:23:10.332+08:00 WARN 21796 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'sysDataScopeModuleMapper' and 'com.crm.auth.mapper.SysDataScopeModuleMapper' mapperInterface. Bean already defined with the same name! +2026-09-05T11:23:10.332+08:00 WARN 21796 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'sysDeptMapper' and 'com.crm.auth.mapper.SysDeptMapper' mapperInterface. Bean already defined with the same name! +2026-09-05T11:23:10.333+08:00 WARN 21796 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'sysMenuMapper' and 'com.crm.auth.mapper.SysMenuMapper' mapperInterface. Bean already defined with the same name! +2026-09-05T11:23:10.333+08:00 WARN 21796 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'sysRoleDataScopeMapper' and 'com.crm.auth.mapper.SysRoleDataScopeMapper' mapperInterface. Bean already defined with the same name! +2026-09-05T11:23:10.333+08:00 WARN 21796 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'sysRoleMapper' and 'com.crm.auth.mapper.SysRoleMapper' mapperInterface. Bean already defined with the same name! +2026-09-05T11:23:10.333+08:00 WARN 21796 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'sysRoleMenuMapper' and 'com.crm.auth.mapper.SysRoleMenuMapper' mapperInterface. Bean already defined with the same name! +2026-09-05T11:23:10.334+08:00 WARN 21796 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'sysUserDeptMapper' and 'com.crm.auth.mapper.SysUserDeptMapper' mapperInterface. Bean already defined with the same name! +2026-09-05T11:23:10.334+08:00 WARN 21796 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'sysUserRoleMapper' and 'com.crm.auth.mapper.SysUserRoleMapper' mapperInterface. Bean already defined with the same name! +2026-09-05T11:23:10.334+08:00 WARN 21796 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'fileInfoMapper' and 'com.crm.file.mapper.FileInfoMapper' mapperInterface. Bean already defined with the same name! +2026-09-05T11:23:10.335+08:00 WARN 21796 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'dictGroupDefaultMapper' and 'com.crm.dict.mapper.DictGroupDefaultMapper' mapperInterface. Bean already defined with the same name! +2026-09-05T11:23:10.335+08:00 WARN 21796 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'dictGroupMapper' and 'com.crm.dict.mapper.DictGroupMapper' mapperInterface. Bean already defined with the same name! +2026-09-05T11:23:10.335+08:00 WARN 21796 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'dictItemMapper' and 'com.crm.dict.mapper.DictItemMapper' mapperInterface. Bean already defined with the same name! +2026-09-05T11:23:10.335+08:00 WARN 21796 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'dictRefCountMapper' and 'com.crm.dict.mapper.DictRefCountMapper' mapperInterface. Bean already defined with the same name! +2026-09-05T11:23:10.335+08:00 WARN 21796 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'customerDedupRuleMapper' and 'com.crm.rule.mapper.CustomerDedupRuleMapper' mapperInterface. Bean already defined with the same name! +2026-09-05T11:23:10.336+08:00 WARN 21796 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'customerReminderRuleMapper' and 'com.crm.rule.mapper.CustomerReminderRuleMapper' mapperInterface. Bean already defined with the same name! +2026-09-05T11:23:10.336+08:00 WARN 21796 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'leadPoolMapper' and 'com.crm.rule.mapper.LeadPoolMapper' mapperInterface. Bean already defined with the same name! +2026-09-05T11:23:10.336+08:00 WARN 21796 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'leadPoolMemberMapper' and 'com.crm.rule.mapper.LeadPoolMemberMapper' mapperInterface. Bean already defined with the same name! +2026-09-05T11:23:10.337+08:00 WARN 21796 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'leadPoolProvinceMapper' and 'com.crm.rule.mapper.LeadPoolProvinceMapper' mapperInterface. Bean already defined with the same name! +2026-09-05T11:23:10.337+08:00 WARN 21796 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'leadPoolRegionMapper' and 'com.crm.rule.mapper.LeadPoolRegionMapper' mapperInterface. Bean already defined with the same name! +2026-09-05T11:23:10.338+08:00 WARN 21796 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityPoolRuleDeptMapper' and 'com.crm.rule.mapper.OpportunityPoolRuleDeptMapper' mapperInterface. Bean already defined with the same name! +2026-09-05T11:23:10.338+08:00 WARN 21796 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityPoolRuleMapper' and 'com.crm.rule.mapper.OpportunityPoolRuleMapper' mapperInterface. Bean already defined with the same name! +2026-09-05T11:23:10.339+08:00 WARN 21796 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunitySchemeCardFieldMapper' and 'com.crm.rule.mapper.OpportunitySchemeCardFieldMapper' mapperInterface. Bean already defined with the same name! +2026-09-05T11:23:10.339+08:00 WARN 21796 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunitySchemeCardTemplateDeptMapper' and 'com.crm.rule.mapper.OpportunitySchemeCardTemplateDeptMapper' mapperInterface. Bean already defined with the same name! +2026-09-05T11:23:10.340+08:00 WARN 21796 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunitySchemeCardTemplateMapper' and 'com.crm.rule.mapper.OpportunitySchemeCardTemplateMapper' mapperInterface. Bean already defined with the same name! +2026-09-05T11:23:10.340+08:00 WARN 21796 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunitySchemeFieldDefMapper' and 'com.crm.rule.mapper.OpportunitySchemeFieldDefMapper' mapperInterface. Bean already defined with the same name! +2026-09-05T11:23:10.341+08:00 WARN 21796 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityStageNodeMapper' and 'com.crm.rule.mapper.OpportunityStageNodeMapper' mapperInterface. Bean already defined with the same name! +2026-09-05T11:23:10.341+08:00 WARN 21796 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityStageTemplateDeptMapper' and 'com.crm.rule.mapper.OpportunityStageTemplateDeptMapper' mapperInterface. Bean already defined with the same name! +2026-09-05T11:23:10.341+08:00 WARN 21796 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityStageTemplateMapper' and 'com.crm.rule.mapper.OpportunityStageTemplateMapper' mapperInterface. Bean already defined with the same name! +2026-09-05T11:23:10.342+08:00 WARN 21796 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'sysRegionMapper' and 'com.crm.rule.mapper.SysRegionMapper' mapperInterface. Bean already defined with the same name! +2026-09-05T11:23:10.342+08:00 WARN 21796 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'userColumnPreferenceMapper' and 'com.crm.preference.mapper.UserColumnPreferenceMapper' mapperInterface. Bean already defined with the same name! +2026-09-05T11:23:10.343+08:00 WARN 21796 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'userSavedViewMapper' and 'com.crm.preference.mapper.UserSavedViewMapper' mapperInterface. Bean already defined with the same name! +2026-09-05T11:23:10.347+08:00 WARN 21796 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'userViewFormMapper' and 'com.crm.preference.mapper.UserViewFormMapper' mapperInterface. Bean already defined with the same name! +2026-09-05T11:23:10.347+08:00 WARN 21796 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'leadAttachmentMapper' and 'com.crm.lead.mapper.LeadAttachmentMapper' mapperInterface. Bean already defined with the same name! +2026-09-05T11:23:10.347+08:00 WARN 21796 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'leadFeedbackMapper' and 'com.crm.lead.mapper.LeadFeedbackMapper' mapperInterface. Bean already defined with the same name! +2026-09-05T11:23:10.348+08:00 WARN 21796 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'leadFollowMapper' and 'com.crm.lead.mapper.LeadFollowMapper' mapperInterface. Bean already defined with the same name! +2026-09-05T11:23:10.348+08:00 WARN 21796 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'leadHistoryMapper' and 'com.crm.lead.mapper.LeadHistoryMapper' mapperInterface. Bean already defined with the same name! +2026-09-05T11:23:10.349+08:00 WARN 21796 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'leadMapper' and 'com.crm.lead.mapper.LeadMapper' mapperInterface. Bean already defined with the same name! +2026-09-05T11:23:10.349+08:00 WARN 21796 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityAttachmentMapper' and 'com.crm.opportunity.mapper.OpportunityAttachmentMapper' mapperInterface. Bean already defined with the same name! +2026-09-05T11:23:10.349+08:00 WARN 21796 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityCustomerMapper' and 'com.crm.opportunity.mapper.OpportunityCustomerMapper' mapperInterface. Bean already defined with the same name! +2026-09-05T11:23:10.350+08:00 WARN 21796 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityFocusMapper' and 'com.crm.opportunity.mapper.OpportunityFocusMapper' mapperInterface. Bean already defined with the same name! +2026-09-05T11:23:10.350+08:00 WARN 21796 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityFollowMapper' and 'com.crm.opportunity.mapper.OpportunityFollowMapper' mapperInterface. Bean already defined with the same name! +2026-09-05T11:23:10.351+08:00 WARN 21796 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityMapper' and 'com.crm.opportunity.mapper.OpportunityMapper' mapperInterface. Bean already defined with the same name! +2026-09-05T11:23:10.351+08:00 WARN 21796 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityOplogMapper' and 'com.crm.opportunity.mapper.OpportunityOplogMapper' mapperInterface. Bean already defined with the same name! +2026-09-05T11:23:10.352+08:00 WARN 21796 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityPendingNoticeMapper' and 'com.crm.opportunity.mapper.OpportunityPendingNoticeMapper' mapperInterface. Bean already defined with the same name! +2026-09-05T11:23:10.353+08:00 WARN 21796 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunitySchemeCardMapper' and 'com.crm.opportunity.mapper.OpportunitySchemeCardMapper' mapperInterface. Bean already defined with the same name! +2026-09-05T11:23:10.353+08:00 WARN 21796 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunitySchemeCardValueMapper' and 'com.crm.opportunity.mapper.OpportunitySchemeCardValueMapper' mapperInterface. Bean already defined with the same name! +2026-09-05T11:23:10.354+08:00 WARN 21796 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunitySiteSurveyMapper' and 'com.crm.opportunity.mapper.OpportunitySiteSurveyMapper' mapperInterface. Bean already defined with the same name! +2026-09-05T11:23:10.355+08:00 WARN 21796 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityStageHistoryMapper' and 'com.crm.opportunity.mapper.OpportunityStageHistoryMapper' mapperInterface. Bean already defined with the same name! +2026-09-05T11:23:10.357+08:00 WARN 21796 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityStatusHistoryMapper' and 'com.crm.opportunity.mapper.OpportunityStatusHistoryMapper' mapperInterface. Bean already defined with the same name! +2026-09-05T11:23:10.358+08:00 WARN 21796 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityTeamMapper' and 'com.crm.opportunity.mapper.OpportunityTeamMapper' mapperInterface. Bean already defined with the same name! +2026-09-05T11:23:10.365+08:00 WARN 21796 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityViewLogMapper' and 'com.crm.opportunity.mapper.OpportunityViewLogMapper' mapperInterface. Bean already defined with the same name! +2026-09-05T11:23:10.365+08:00 WARN 21796 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityWorkPlanMapper' and 'com.crm.opportunity.mapper.OpportunityWorkPlanMapper' mapperInterface. Bean already defined with the same name! +2026-09-05T11:23:10.366+08:00 WARN 21796 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'customerAgreementMapper' and 'com.crm.customer.mapper.CustomerAgreementMapper' mapperInterface. Bean already defined with the same name! +2026-09-05T11:23:10.366+08:00 WARN 21796 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'customerContactMapper' and 'com.crm.customer.mapper.CustomerContactMapper' mapperInterface. Bean already defined with the same name! +2026-09-05T11:23:10.366+08:00 WARN 21796 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'customerFocusMapper' and 'com.crm.customer.mapper.CustomerFocusMapper' mapperInterface. Bean already defined with the same name! +2026-09-05T11:23:10.367+08:00 WARN 21796 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'customerFollowMapper' and 'com.crm.customer.mapper.CustomerFollowMapper' mapperInterface. Bean already defined with the same name! +2026-09-05T11:23:10.367+08:00 WARN 21796 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'customerImportFailMapper' and 'com.crm.customer.mapper.CustomerImportFailMapper' mapperInterface. Bean already defined with the same name! +2026-09-05T11:23:10.368+08:00 WARN 21796 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'customerImportTaskMapper' and 'com.crm.customer.mapper.CustomerImportTaskMapper' mapperInterface. Bean already defined with the same name! +2026-09-05T11:23:10.368+08:00 WARN 21796 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'customerMapper' and 'com.crm.customer.mapper.CustomerMapper' mapperInterface. Bean already defined with the same name! +2026-09-05T11:23:10.369+08:00 WARN 21796 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'customerOplogMapper' and 'com.crm.customer.mapper.CustomerOplogMapper' mapperInterface. Bean already defined with the same name! +2026-09-05T11:23:10.369+08:00 WARN 21796 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'customerPendingNoticeMapper' and 'com.crm.customer.mapper.CustomerPendingNoticeMapper' mapperInterface. Bean already defined with the same name! +2026-09-05T11:23:10.369+08:00 WARN 21796 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'customerTeamMemberMapper' and 'com.crm.customer.mapper.CustomerTeamMemberMapper' mapperInterface. Bean already defined with the same name! +2026-09-05T11:23:10.370+08:00 WARN 21796 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'customerTransferDetailMapper' and 'com.crm.customer.mapper.CustomerTransferDetailMapper' mapperInterface. Bean already defined with the same name! +2026-09-05T11:23:10.370+08:00 WARN 21796 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'customerTransferMapper' and 'com.crm.customer.mapper.CustomerTransferMapper' mapperInterface. Bean already defined with the same name! +2026-09-05T11:23:10.370+08:00 WARN 21796 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'customerViewLogMapper' and 'com.crm.customer.mapper.CustomerViewLogMapper' mapperInterface. Bean already defined with the same name! +2026-09-05T11:23:10.371+08:00 WARN 21796 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : No MyBatis mapper was found in '[com.crm.**.mapper]' package. Please check your configuration. +2026-09-05T11:23:11.588+08:00 INFO 21796 --- [crm-app] [main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port 8080 (http) +2026-09-05T11:23:11.619+08:00 INFO 21796 --- [crm-app] [main] o.apache.catalina.core.StandardService : Starting service [Tomcat] +2026-09-05T11:23:11.620+08:00 INFO 21796 --- [crm-app] [main] o.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/10.1.31] +2026-09-05T11:23:11.717+08:00 INFO 21796 --- [crm-app] [main] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext +2026-09-05T11:23:11.718+08:00 INFO 21796 --- [crm-app] [main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 4037 ms +2026-09-05T11:23:12.866+08:00 INFO 21796 --- [crm-app] [main] com.crm.auth.config.PermissionConfig : Ȩܿرɨɣ0 +2026-09-05T11:23:13.048+08:00 INFO 21796 --- [crm-app] [main] com.crm.base.config.CustomIdGenerator : ѩIDʼɣworkerId=0, datacenterId=0 +2026-09-05T11:23:13.931+08:00 INFO 21796 --- [crm-app] [main] o.hibernate.jpa.internal.util.LogHelper : HHH000204: Processing PersistenceUnitInfo [name: default] +2026-09-05T11:23:14.026+08:00 INFO 21796 --- [crm-app] [main] org.hibernate.Version : HHH000412: Hibernate ORM core version 6.5.3.Final +2026-09-05T11:23:14.082+08:00 INFO 21796 --- [crm-app] [main] o.h.c.internal.RegionFactoryInitiator : HHH000026: Second-level cache disabled +2026-09-05T11:23:14.616+08:00 INFO 21796 --- [crm-app] [main] o.s.o.j.p.SpringPersistenceUnitInfo : No LoadTimeWeaver setup: ignoring JPA class transformer +2026-09-05T11:23:14.686+08:00 INFO 21796 --- [crm-app] [main] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Starting... +2026-09-05T11:23:15.556+08:00 INFO 21796 --- [crm-app] [main] com.zaxxer.hikari.pool.HikariPool : HikariPool-1 - Added connection com.mysql.cj.jdbc.ConnectionImpl@4dcc0e3d +2026-09-05T11:23:15.559+08:00 INFO 21796 --- [crm-app] [main] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Start completed. +2026-09-05T11:23:15.876+08:00 WARN 21796 --- [crm-app] [main] org.hibernate.orm.deprecation : HHH90000025: MySQLDialect does not need to be specified explicitly using 'hibernate.dialect' (remove the property setting and it will be selected by default) +2026-09-05T11:23:18.466+08:00 INFO 21796 --- [crm-app] [main] o.h.e.t.j.p.i.JtaPlatformInitiator : HHH000489: No JTA platform available (set 'hibernate.transaction.jta.platform' to enable JTA platform integration) +2026-09-05T11:23:44.163+08:00 INFO 21796 --- [crm-app] [main] j.LocalContainerEntityManagerFactoryBean : Initialized JPA EntityManagerFactory for persistence unit 'default' +2026-09-05T11:23:44.996+08:00 WARN 21796 --- [crm-app] [main] c.c.a.controller.DebugTokenController : ============================================================ +2026-09-05T11:23:44.997+08:00 WARN 21796 --- [crm-app] [main] c.c.a.controller.DebugTokenController : token ӿ /api/auth/debug/token ãverify profile +2026-09-05T11:23:44.997+08:00 WARN 21796 --- [crm-app] [main] c.c.a.controller.DebugTokenController : Ͻκ֪ userId ˿ðû +2026-09-05T11:23:44.997+08:00 WARN 21796 --- [crm-app] [main] c.c.a.controller.DebugTokenController : μ docs/adr/0014-verify-profile-debug-token-endpoint.md +2026-09-05T11:23:44.998+08:00 WARN 21796 --- [crm-app] [main] c.c.a.controller.DebugTokenController : ============================================================ +2026-09-05T11:23:47.612+08:00 INFO 21796 --- [crm-app] [main] c.c.c.p.i.NgramNameSimilarityPortImpl : CustomerNameSimilarityPort һʵ־ԤɸģʽFULLTEXT ngram +2026-09-05T11:23:47.614+08:00 INFO 21796 --- [crm-app] [main] c.c.c.p.impl.StubCompanyLookupPortImpl : CompanyLookupPort һ stub װ䣨δ룬̺ѡؿգ +2026-09-05T11:23:48.175+08:00 INFO 21796 --- [crm-app] [main] c.c.c.p.i.NoopProjectOwnerSyncPortImpl : ProjectOwnerSyncPort no-op Ĭʵװ䣨A5 Ŀģδowner ͬ +2026-09-05T11:23:48.287+08:00 INFO 21796 --- [crm-app] [main] c.c.p.i.NoopOpportunityOwnerSyncPortImpl : OpportunityOwnerSyncPort no-op Ĭʵװ䣨Ʊ 11 ̻Դ滻 +2026-09-05T11:23:48.517+08:00 WARN 21796 --- [crm-app] [main] .s.s.UserDetailsServiceAutoConfiguration : + +Using generated security password: 3670a7ee-61c5-4d83-b7a4-d4ad28531303 -org.springframework.web.context.request.async.AsyncRequestNotUsableException: ServletOutputStream failed to write: java.io.IOException: еֹһѽӡ - at org.springframework.web.context.request.async.StandardServletAsyncWebRequest$LifecycleHttpServletResponse.handleIOException(StandardServletAsyncWebRequest.java:343) ~[spring-web-6.1.14.jar!/:6.1.14] - at org.springframework.web.context.request.async.StandardServletAsyncWebRequest$LifecycleServletOutputStream.write(StandardServletAsyncWebRequest.java:401) ~[spring-web-6.1.14.jar!/:6.1.14] - at org.springframework.util.StreamUtils$NonClosingOutputStream.write(StreamUtils.java:261) ~[spring-core-6.1.14.jar!/:6.1.14] - at com.fasterxml.jackson.core.json.UTF8JsonGenerator._flushBuffer(UTF8JsonGenerator.java:2210) ~[jackson-core-2.17.2.jar!/:2.17.2] - at com.fasterxml.jackson.core.json.UTF8JsonGenerator._writeStringSegment2(UTF8JsonGenerator.java:1522) ~[jackson-core-2.17.2.jar!/:2.17.2] - at com.fasterxml.jackson.core.json.UTF8JsonGenerator._writeStringSegment(UTF8JsonGenerator.java:1469) ~[jackson-core-2.17.2.jar!/:2.17.2] - at com.fasterxml.jackson.core.json.UTF8JsonGenerator.writeString(UTF8JsonGenerator.java:531) ~[jackson-core-2.17.2.jar!/:2.17.2] - at com.fasterxml.jackson.databind.ser.std.StringSerializer.serialize(StringSerializer.java:41) ~[jackson-databind-2.17.2.jar!/:2.17.2] - at com.fasterxml.jackson.databind.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:732) ~[jackson-databind-2.17.2.jar!/:2.17.2] - at com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:770) ~[jackson-databind-2.17.2.jar!/:2.17.2] - at com.fasterxml.jackson.databind.ser.BeanSerializer.serialize(BeanSerializer.java:183) ~[jackson-databind-2.17.2.jar!/:2.17.2] - at com.fasterxml.jackson.databind.ser.impl.IndexedListSerializer.serializeContents(IndexedListSerializer.java:119) ~[jackson-databind-2.17.2.jar!/:2.17.2] - at com.fasterxml.jackson.databind.ser.impl.IndexedListSerializer.serialize(IndexedListSerializer.java:79) ~[jackson-databind-2.17.2.jar!/:2.17.2] - at com.fasterxml.jackson.databind.ser.impl.IndexedListSerializer.serialize(IndexedListSerializer.java:18) ~[jackson-databind-2.17.2.jar!/:2.17.2] - at com.fasterxml.jackson.databind.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:732) ~[jackson-databind-2.17.2.jar!/:2.17.2] - at com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:770) ~[jackson-databind-2.17.2.jar!/:2.17.2] - at com.fasterxml.jackson.databind.ser.BeanSerializer.serialize(BeanSerializer.java:183) ~[jackson-databind-2.17.2.jar!/:2.17.2] - at com.fasterxml.jackson.databind.ser.DefaultSerializerProvider._serialize(DefaultSerializerProvider.java:502) ~[jackson-databind-2.17.2.jar!/:2.17.2] - at com.fasterxml.jackson.databind.ser.DefaultSerializerProvider.serializeValue(DefaultSerializerProvider.java:341) ~[jackson-databind-2.17.2.jar!/:2.17.2] - at com.fasterxml.jackson.databind.ObjectWriter$Prefetch.serialize(ObjectWriter.java:1574) ~[jackson-databind-2.17.2.jar!/:2.17.2] - at com.fasterxml.jackson.databind.ObjectWriter.writeValue(ObjectWriter.java:1061) ~[jackson-databind-2.17.2.jar!/:2.17.2] - at org.springframework.http.converter.json.AbstractJackson2HttpMessageConverter.writeInternal(AbstractJackson2HttpMessageConverter.java:483) ~[spring-web-6.1.14.jar!/:6.1.14] - at org.springframework.http.converter.AbstractGenericHttpMessageConverter.write(AbstractGenericHttpMessageConverter.java:114) ~[spring-web-6.1.14.jar!/:6.1.14] - at org.springframework.web.servlet.mvc.method.annotation.AbstractMessageConverterMethodProcessor.writeWithMessageConverters(AbstractMessageConverterMethodProcessor.java:297) ~[spring-webmvc-6.1.14.jar!/:6.1.14] - at org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor.handleReturnValue(RequestResponseBodyMethodProcessor.java:192) ~[spring-webmvc-6.1.14.jar!/:6.1.14] - at org.springframework.web.method.support.HandlerMethodReturnValueHandlerComposite.handleReturnValue(HandlerMethodReturnValueHandlerComposite.java:78) ~[spring-web-6.1.14.jar!/:6.1.14] - at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:136) ~[spring-webmvc-6.1.14.jar!/:6.1.14] -======= -2026-09-03T14:09:03.636+08:00 INFO 6104 --- [crm-app] [main] com.crm.app.CrmAppApplication : Starting CrmAppApplication v1.0.0-SNAPSHOT using Java 17.0.15 with PID 6104 (D:\code\crm-backend-matt\crm-app\target\crm-app-1.0.0-SNAPSHOT.jar started by luowj in D:\code\crm-backend-matt) -2026-09-03T14:09:03.776+08:00 INFO 6104 --- [crm-app] [main] com.crm.app.CrmAppApplication : The following 1 profile is active: "verify" -2026-09-03T14:09:05.972+08:00 INFO 6104 --- [crm-app] [main] .s.d.r.c.RepositoryConfigurationDelegate : Multiple Spring Data modules found, entering strict repository configuration mode -2026-09-03T14:09:05.976+08:00 INFO 6104 --- [crm-app] [main] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data JPA repositories in DEFAULT mode. -2026-09-03T14:09:06.020+08:00 INFO 6104 --- [crm-app] [main] .s.d.r.c.RepositoryConfigurationDelegate : Finished Spring Data repository scanning in 30 ms. Found 0 JPA repository interfaces. -2026-09-03T14:09:06.046+08:00 INFO 6104 --- [crm-app] [main] .s.d.r.c.RepositoryConfigurationDelegate : Multiple Spring Data modules found, entering strict repository configuration mode -2026-09-03T14:09:06.048+08:00 INFO 6104 --- [crm-app] [main] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data Redis repositories in DEFAULT mode. -2026-09-03T14:09:06.066+08:00 INFO 6104 --- [crm-app] [main] .s.d.r.c.RepositoryConfigurationDelegate : Finished Spring Data repository scanning in 4 ms. Found 0 Redis repository interfaces. -2026-09-03T14:09:06.321+08:00 WARN 6104 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'crmBaseMapper' and 'com.crm.base.mapper.CrmBaseMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T14:09:06.322+08:00 WARN 6104 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'authIdentityMapper' and 'com.crm.auth.mapper.AuthIdentityMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T14:09:06.322+08:00 WARN 6104 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'authUserMapper' and 'com.crm.auth.mapper.AuthUserMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T14:09:06.324+08:00 WARN 6104 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'sysDataScopeModuleMapper' and 'com.crm.auth.mapper.SysDataScopeModuleMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T14:09:06.326+08:00 WARN 6104 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'sysDeptMapper' and 'com.crm.auth.mapper.SysDeptMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T14:09:06.327+08:00 WARN 6104 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'sysMenuMapper' and 'com.crm.auth.mapper.SysMenuMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T14:09:06.327+08:00 WARN 6104 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'sysRoleDataScopeMapper' and 'com.crm.auth.mapper.SysRoleDataScopeMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T14:09:06.328+08:00 WARN 6104 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'sysRoleMapper' and 'com.crm.auth.mapper.SysRoleMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T14:09:06.328+08:00 WARN 6104 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'sysRoleMenuMapper' and 'com.crm.auth.mapper.SysRoleMenuMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T14:09:06.329+08:00 WARN 6104 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'sysUserDeptMapper' and 'com.crm.auth.mapper.SysUserDeptMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T14:09:06.329+08:00 WARN 6104 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'sysUserRoleMapper' and 'com.crm.auth.mapper.SysUserRoleMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T14:09:06.330+08:00 WARN 6104 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'fileInfoMapper' and 'com.crm.file.mapper.FileInfoMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T14:09:06.330+08:00 WARN 6104 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'dictGroupDefaultMapper' and 'com.crm.dict.mapper.DictGroupDefaultMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T14:09:06.332+08:00 WARN 6104 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'dictGroupMapper' and 'com.crm.dict.mapper.DictGroupMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T14:09:06.332+08:00 WARN 6104 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'dictItemMapper' and 'com.crm.dict.mapper.DictItemMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T14:09:06.333+08:00 WARN 6104 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'dictRefCountMapper' and 'com.crm.dict.mapper.DictRefCountMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T14:09:06.338+08:00 WARN 6104 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'customerReminderRuleMapper' and 'com.crm.rule.mapper.CustomerReminderRuleMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T14:09:06.342+08:00 WARN 6104 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'leadPoolMapper' and 'com.crm.rule.mapper.LeadPoolMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T14:09:06.344+08:00 WARN 6104 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'leadPoolMemberMapper' and 'com.crm.rule.mapper.LeadPoolMemberMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T14:09:06.344+08:00 WARN 6104 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'leadPoolProvinceMapper' and 'com.crm.rule.mapper.LeadPoolProvinceMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T14:09:06.345+08:00 WARN 6104 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'leadPoolRegionMapper' and 'com.crm.rule.mapper.LeadPoolRegionMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T14:09:06.346+08:00 WARN 6104 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityPoolRuleDeptMapper' and 'com.crm.rule.mapper.OpportunityPoolRuleDeptMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T14:09:06.346+08:00 WARN 6104 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityPoolRuleMapper' and 'com.crm.rule.mapper.OpportunityPoolRuleMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T14:09:06.346+08:00 WARN 6104 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunitySchemeCardFieldMapper' and 'com.crm.rule.mapper.OpportunitySchemeCardFieldMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T14:09:06.347+08:00 WARN 6104 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunitySchemeCardTemplateDeptMapper' and 'com.crm.rule.mapper.OpportunitySchemeCardTemplateDeptMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T14:09:06.349+08:00 WARN 6104 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunitySchemeCardTemplateMapper' and 'com.crm.rule.mapper.OpportunitySchemeCardTemplateMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T14:09:06.349+08:00 WARN 6104 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunitySchemeFieldDefMapper' and 'com.crm.rule.mapper.OpportunitySchemeFieldDefMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T14:09:06.350+08:00 WARN 6104 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityStageNodeMapper' and 'com.crm.rule.mapper.OpportunityStageNodeMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T14:09:06.351+08:00 WARN 6104 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityStageTemplateDeptMapper' and 'com.crm.rule.mapper.OpportunityStageTemplateDeptMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T14:09:06.351+08:00 WARN 6104 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityStageTemplateMapper' and 'com.crm.rule.mapper.OpportunityStageTemplateMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T14:09:06.352+08:00 WARN 6104 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'sysRegionMapper' and 'com.crm.rule.mapper.SysRegionMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T14:09:06.352+08:00 WARN 6104 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'userColumnPreferenceMapper' and 'com.crm.preference.mapper.UserColumnPreferenceMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T14:09:06.352+08:00 WARN 6104 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'userSavedViewMapper' and 'com.crm.preference.mapper.UserSavedViewMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T14:09:06.353+08:00 WARN 6104 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'leadAttachmentMapper' and 'com.crm.lead.mapper.LeadAttachmentMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T14:09:06.353+08:00 WARN 6104 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'leadFeedbackMapper' and 'com.crm.lead.mapper.LeadFeedbackMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T14:09:06.354+08:00 WARN 6104 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'leadFollowMapper' and 'com.crm.lead.mapper.LeadFollowMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T14:09:06.354+08:00 WARN 6104 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'leadHistoryMapper' and 'com.crm.lead.mapper.LeadHistoryMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T14:09:06.355+08:00 WARN 6104 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'leadMapper' and 'com.crm.lead.mapper.LeadMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T14:09:06.355+08:00 WARN 6104 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityAttachmentMapper' and 'com.crm.opportunity.mapper.OpportunityAttachmentMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T14:09:06.356+08:00 WARN 6104 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityCustomerMapper' and 'com.crm.opportunity.mapper.OpportunityCustomerMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T14:09:06.356+08:00 WARN 6104 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityFocusMapper' and 'com.crm.opportunity.mapper.OpportunityFocusMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T14:09:06.358+08:00 WARN 6104 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityFollowMapper' and 'com.crm.opportunity.mapper.OpportunityFollowMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T14:09:06.358+08:00 WARN 6104 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityMapper' and 'com.crm.opportunity.mapper.OpportunityMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T14:09:06.358+08:00 WARN 6104 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityOplogMapper' and 'com.crm.opportunity.mapper.OpportunityOplogMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T14:09:06.359+08:00 WARN 6104 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityPendingNoticeMapper' and 'com.crm.opportunity.mapper.OpportunityPendingNoticeMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T14:09:06.359+08:00 WARN 6104 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunitySchemeCardMapper' and 'com.crm.opportunity.mapper.OpportunitySchemeCardMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T14:09:06.360+08:00 WARN 6104 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunitySchemeCardValueMapper' and 'com.crm.opportunity.mapper.OpportunitySchemeCardValueMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T14:09:06.362+08:00 WARN 6104 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunitySiteSurveyMapper' and 'com.crm.opportunity.mapper.OpportunitySiteSurveyMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T14:09:06.398+08:00 WARN 6104 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityStageHistoryMapper' and 'com.crm.opportunity.mapper.OpportunityStageHistoryMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T14:09:06.423+08:00 WARN 6104 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityStatusHistoryMapper' and 'com.crm.opportunity.mapper.OpportunityStatusHistoryMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T14:09:06.436+08:00 WARN 6104 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityTeamMapper' and 'com.crm.opportunity.mapper.OpportunityTeamMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T14:09:06.443+08:00 WARN 6104 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityViewLogMapper' and 'com.crm.opportunity.mapper.OpportunityViewLogMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T14:09:06.448+08:00 WARN 6104 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityWorkPlanMapper' and 'com.crm.opportunity.mapper.OpportunityWorkPlanMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T14:09:06.453+08:00 WARN 6104 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'customerContactMapper' and 'com.crm.customer.mapper.CustomerContactMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T14:09:06.457+08:00 WARN 6104 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'customerFocusMapper' and 'com.crm.customer.mapper.CustomerFocusMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T14:09:06.463+08:00 WARN 6104 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'customerFollowMapper' and 'com.crm.customer.mapper.CustomerFollowMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T14:09:06.464+08:00 WARN 6104 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'customerImportFailMapper' and 'com.crm.customer.mapper.CustomerImportFailMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T14:09:06.469+08:00 WARN 6104 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'customerImportTaskMapper' and 'com.crm.customer.mapper.CustomerImportTaskMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T14:09:06.473+08:00 WARN 6104 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'customerMapper' and 'com.crm.customer.mapper.CustomerMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T14:09:06.475+08:00 WARN 6104 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'customerOplogMapper' and 'com.crm.customer.mapper.CustomerOplogMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T14:09:06.476+08:00 WARN 6104 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'customerPendingNoticeMapper' and 'com.crm.customer.mapper.CustomerPendingNoticeMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T14:09:06.494+08:00 WARN 6104 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'customerTeamMemberMapper' and 'com.crm.customer.mapper.CustomerTeamMemberMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T14:09:06.497+08:00 WARN 6104 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'customerTransferDetailMapper' and 'com.crm.customer.mapper.CustomerTransferDetailMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T14:09:06.498+08:00 WARN 6104 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'customerTransferMapper' and 'com.crm.customer.mapper.CustomerTransferMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T14:09:06.502+08:00 WARN 6104 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'customerViewLogMapper' and 'com.crm.customer.mapper.CustomerViewLogMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T14:09:06.513+08:00 WARN 6104 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : No MyBatis mapper was found in '[com.crm.**.mapper]' package. Please check your configuration. -2026-09-03T14:09:06.527+08:00 WARN 6104 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'crmBaseMapper' and 'com.crm.base.mapper.CrmBaseMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T14:09:06.531+08:00 WARN 6104 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'authIdentityMapper' and 'com.crm.auth.mapper.AuthIdentityMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T14:09:06.532+08:00 WARN 6104 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'authUserMapper' and 'com.crm.auth.mapper.AuthUserMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T14:09:06.534+08:00 WARN 6104 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'sysDataScopeModuleMapper' and 'com.crm.auth.mapper.SysDataScopeModuleMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T14:09:06.535+08:00 WARN 6104 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'sysDeptMapper' and 'com.crm.auth.mapper.SysDeptMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T14:09:06.536+08:00 WARN 6104 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'sysMenuMapper' and 'com.crm.auth.mapper.SysMenuMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T14:09:06.537+08:00 WARN 6104 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'sysRoleDataScopeMapper' and 'com.crm.auth.mapper.SysRoleDataScopeMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T14:09:06.538+08:00 WARN 6104 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'sysRoleMapper' and 'com.crm.auth.mapper.SysRoleMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T14:09:06.539+08:00 WARN 6104 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'sysRoleMenuMapper' and 'com.crm.auth.mapper.SysRoleMenuMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T14:09:06.540+08:00 WARN 6104 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'sysUserDeptMapper' and 'com.crm.auth.mapper.SysUserDeptMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T14:09:06.541+08:00 WARN 6104 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'sysUserRoleMapper' and 'com.crm.auth.mapper.SysUserRoleMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T14:09:06.542+08:00 WARN 6104 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'fileInfoMapper' and 'com.crm.file.mapper.FileInfoMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T14:09:06.543+08:00 WARN 6104 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'dictGroupDefaultMapper' and 'com.crm.dict.mapper.DictGroupDefaultMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T14:09:06.543+08:00 WARN 6104 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'dictGroupMapper' and 'com.crm.dict.mapper.DictGroupMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T14:09:06.543+08:00 WARN 6104 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'dictItemMapper' and 'com.crm.dict.mapper.DictItemMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T14:09:06.544+08:00 WARN 6104 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'dictRefCountMapper' and 'com.crm.dict.mapper.DictRefCountMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T14:09:06.544+08:00 WARN 6104 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'customerReminderRuleMapper' and 'com.crm.rule.mapper.CustomerReminderRuleMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T14:09:06.545+08:00 WARN 6104 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'leadPoolMapper' and 'com.crm.rule.mapper.LeadPoolMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T14:09:06.545+08:00 WARN 6104 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'leadPoolMemberMapper' and 'com.crm.rule.mapper.LeadPoolMemberMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T14:09:06.545+08:00 WARN 6104 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'leadPoolProvinceMapper' and 'com.crm.rule.mapper.LeadPoolProvinceMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T14:09:06.546+08:00 WARN 6104 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'leadPoolRegionMapper' and 'com.crm.rule.mapper.LeadPoolRegionMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T14:09:06.546+08:00 WARN 6104 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityPoolRuleDeptMapper' and 'com.crm.rule.mapper.OpportunityPoolRuleDeptMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T14:09:06.546+08:00 WARN 6104 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityPoolRuleMapper' and 'com.crm.rule.mapper.OpportunityPoolRuleMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T14:09:06.547+08:00 WARN 6104 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunitySchemeCardFieldMapper' and 'com.crm.rule.mapper.OpportunitySchemeCardFieldMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T14:09:06.548+08:00 WARN 6104 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunitySchemeCardTemplateDeptMapper' and 'com.crm.rule.mapper.OpportunitySchemeCardTemplateDeptMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T14:09:06.548+08:00 WARN 6104 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunitySchemeCardTemplateMapper' and 'com.crm.rule.mapper.OpportunitySchemeCardTemplateMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T14:09:06.550+08:00 WARN 6104 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunitySchemeFieldDefMapper' and 'com.crm.rule.mapper.OpportunitySchemeFieldDefMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T14:09:06.553+08:00 WARN 6104 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityStageNodeMapper' and 'com.crm.rule.mapper.OpportunityStageNodeMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T14:09:06.554+08:00 WARN 6104 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityStageTemplateDeptMapper' and 'com.crm.rule.mapper.OpportunityStageTemplateDeptMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T14:09:06.555+08:00 WARN 6104 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityStageTemplateMapper' and 'com.crm.rule.mapper.OpportunityStageTemplateMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T14:09:06.556+08:00 WARN 6104 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'sysRegionMapper' and 'com.crm.rule.mapper.SysRegionMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T14:09:06.557+08:00 WARN 6104 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'userColumnPreferenceMapper' and 'com.crm.preference.mapper.UserColumnPreferenceMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T14:09:06.557+08:00 WARN 6104 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'userSavedViewMapper' and 'com.crm.preference.mapper.UserSavedViewMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T14:09:06.557+08:00 WARN 6104 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'leadAttachmentMapper' and 'com.crm.lead.mapper.LeadAttachmentMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T14:09:06.558+08:00 WARN 6104 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'leadFeedbackMapper' and 'com.crm.lead.mapper.LeadFeedbackMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T14:09:06.559+08:00 WARN 6104 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'leadFollowMapper' and 'com.crm.lead.mapper.LeadFollowMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T14:09:06.559+08:00 WARN 6104 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'leadHistoryMapper' and 'com.crm.lead.mapper.LeadHistoryMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T14:09:06.559+08:00 WARN 6104 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'leadMapper' and 'com.crm.lead.mapper.LeadMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T14:09:06.560+08:00 WARN 6104 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityAttachmentMapper' and 'com.crm.opportunity.mapper.OpportunityAttachmentMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T14:09:06.560+08:00 WARN 6104 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityCustomerMapper' and 'com.crm.opportunity.mapper.OpportunityCustomerMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T14:09:06.563+08:00 WARN 6104 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityFocusMapper' and 'com.crm.opportunity.mapper.OpportunityFocusMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T14:09:06.564+08:00 WARN 6104 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityFollowMapper' and 'com.crm.opportunity.mapper.OpportunityFollowMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T14:09:06.564+08:00 WARN 6104 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityMapper' and 'com.crm.opportunity.mapper.OpportunityMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T14:09:06.565+08:00 WARN 6104 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityOplogMapper' and 'com.crm.opportunity.mapper.OpportunityOplogMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T14:09:06.565+08:00 WARN 6104 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityPendingNoticeMapper' and 'com.crm.opportunity.mapper.OpportunityPendingNoticeMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T14:09:06.566+08:00 WARN 6104 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunitySchemeCardMapper' and 'com.crm.opportunity.mapper.OpportunitySchemeCardMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T14:09:06.567+08:00 WARN 6104 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunitySchemeCardValueMapper' and 'com.crm.opportunity.mapper.OpportunitySchemeCardValueMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T14:09:06.568+08:00 WARN 6104 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunitySiteSurveyMapper' and 'com.crm.opportunity.mapper.OpportunitySiteSurveyMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T14:09:06.568+08:00 WARN 6104 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityStageHistoryMapper' and 'com.crm.opportunity.mapper.OpportunityStageHistoryMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T14:09:06.569+08:00 WARN 6104 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityStatusHistoryMapper' and 'com.crm.opportunity.mapper.OpportunityStatusHistoryMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T14:09:06.569+08:00 WARN 6104 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityTeamMapper' and 'com.crm.opportunity.mapper.OpportunityTeamMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T14:09:06.570+08:00 WARN 6104 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityViewLogMapper' and 'com.crm.opportunity.mapper.OpportunityViewLogMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T14:09:06.570+08:00 WARN 6104 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityWorkPlanMapper' and 'com.crm.opportunity.mapper.OpportunityWorkPlanMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T14:09:06.571+08:00 WARN 6104 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'customerContactMapper' and 'com.crm.customer.mapper.CustomerContactMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T14:09:06.573+08:00 WARN 6104 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'customerFocusMapper' and 'com.crm.customer.mapper.CustomerFocusMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T14:09:06.574+08:00 WARN 6104 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'customerFollowMapper' and 'com.crm.customer.mapper.CustomerFollowMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T14:09:06.574+08:00 WARN 6104 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'customerImportFailMapper' and 'com.crm.customer.mapper.CustomerImportFailMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T14:09:06.575+08:00 WARN 6104 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'customerImportTaskMapper' and 'com.crm.customer.mapper.CustomerImportTaskMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T14:09:06.575+08:00 WARN 6104 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'customerMapper' and 'com.crm.customer.mapper.CustomerMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T14:09:06.575+08:00 WARN 6104 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'customerOplogMapper' and 'com.crm.customer.mapper.CustomerOplogMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T14:09:06.575+08:00 WARN 6104 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'customerPendingNoticeMapper' and 'com.crm.customer.mapper.CustomerPendingNoticeMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T14:09:06.576+08:00 WARN 6104 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'customerTeamMemberMapper' and 'com.crm.customer.mapper.CustomerTeamMemberMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T14:09:06.576+08:00 WARN 6104 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'customerTransferDetailMapper' and 'com.crm.customer.mapper.CustomerTransferDetailMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T14:09:06.576+08:00 WARN 6104 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'customerTransferMapper' and 'com.crm.customer.mapper.CustomerTransferMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T14:09:06.577+08:00 WARN 6104 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'customerViewLogMapper' and 'com.crm.customer.mapper.CustomerViewLogMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T14:09:06.577+08:00 WARN 6104 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : No MyBatis mapper was found in '[com.crm.**.mapper]' package. Please check your configuration. -2026-09-03T14:09:07.731+08:00 INFO 6104 --- [crm-app] [main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port 8080 (http) -2026-09-03T14:09:07.755+08:00 INFO 6104 --- [crm-app] [main] o.apache.catalina.core.StandardService : Starting service [Tomcat] -2026-09-03T14:09:07.755+08:00 INFO 6104 --- [crm-app] [main] o.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/10.1.31] -2026-09-03T14:09:07.841+08:00 INFO 6104 --- [crm-app] [main] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext -2026-09-03T14:09:07.842+08:00 INFO 6104 --- [crm-app] [main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 3979 ms -2026-09-03T14:09:08.519+08:00 INFO 6104 --- [crm-app] [main] com.crm.auth.config.PermissionConfig : Ȩܿرɨɣ0 -2026-09-03T14:09:08.737+08:00 INFO 6104 --- [crm-app] [main] com.crm.base.config.CustomIdGenerator : ѩIDʼɣworkerId=0, datacenterId=0 -2026-09-03T14:09:09.586+08:00 INFO 6104 --- [crm-app] [main] o.hibernate.jpa.internal.util.LogHelper : HHH000204: Processing PersistenceUnitInfo [name: default] -2026-09-03T14:09:09.689+08:00 INFO 6104 --- [crm-app] [main] org.hibernate.Version : HHH000412: Hibernate ORM core version 6.5.3.Final -2026-09-03T14:09:09.747+08:00 INFO 6104 --- [crm-app] [main] o.h.c.internal.RegionFactoryInitiator : HHH000026: Second-level cache disabled -2026-09-03T14:09:10.227+08:00 INFO 6104 --- [crm-app] [main] o.s.o.j.p.SpringPersistenceUnitInfo : No LoadTimeWeaver setup: ignoring JPA class transformer -2026-09-03T14:09:10.281+08:00 INFO 6104 --- [crm-app] [main] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Starting... -2026-09-03T14:09:11.020+08:00 INFO 6104 --- [crm-app] [main] com.zaxxer.hikari.pool.HikariPool : HikariPool-1 - Added connection com.mysql.cj.jdbc.ConnectionImpl@13f358f8 -2026-09-03T14:09:11.023+08:00 INFO 6104 --- [crm-app] [main] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Start completed. -2026-09-03T14:09:11.191+08:00 WARN 6104 --- [crm-app] [main] org.hibernate.orm.deprecation : HHH90000025: MySQLDialect does not need to be specified explicitly using 'hibernate.dialect' (remove the property setting and it will be selected by default) -2026-09-03T14:09:13.480+08:00 INFO 6104 --- [crm-app] [main] o.h.e.t.j.p.i.JtaPlatformInitiator : HHH000489: No JTA platform available (set 'hibernate.transaction.jta.platform' to enable JTA platform integration) -2026-09-03T14:09:16.694+08:00 WARN 6104 --- [crm-app] [main] o.h.t.s.i.ExceptionHandlerLoggedImpl : GenerationTarget encountered exception accepting command : Error executing DDL "create table customer_oplog (id bigint comment '' not null, create_time datetime(6) comment 'ʱ', creator_id varchar(50) comment 'ûid', deleted tinyint not null default 0 comment '߼ɾλ' comment '߼ɾλ', update_time datetime(6) comment 'ʱ', updater_id varchar(50) comment 'ûid', action varchar(50) not null comment '' comment 'ͣCREATE/UPDATE/FOLLOW/ARCHIVE/RESTORE/TRANSFER/CLAIM/POOL/STAGE_CHANGE', customer_id bigint not null comment 'ͻID' comment 'ͻIDcustomer.id', detail varchar(1000) comment '' comment ' {ֶ} {} ޸Ϊ {}', operator_dept_name varchar(100) comment '˲' comment '˲գ', operator_id bigint comment 'ûID' comment 'ûIDգϵͳΪ NULL', operator_name varchar(50) not null comment '' comment 'գϵͳ='ϵͳ'', primary key (id)) engine=InnoDB" via JDBC [You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'ϵͳ'', primary key (id)) engine=InnoDB' at line 1] - -org.hibernate.tool.schema.spi.CommandAcceptanceException: Error executing DDL "create table customer_oplog (id bigint comment '' not null, create_time datetime(6) comment 'ʱ', creator_id varchar(50) comment 'ûid', deleted tinyint not null default 0 comment '߼ɾλ' comment '߼ɾλ', update_time datetime(6) comment 'ʱ', updater_id varchar(50) comment 'ûid', action varchar(50) not null comment '' comment 'ͣCREATE/UPDATE/FOLLOW/ARCHIVE/RESTORE/TRANSFER/CLAIM/POOL/STAGE_CHANGE', customer_id bigint not null comment 'ͻID' comment 'ͻIDcustomer.id', detail varchar(1000) comment '' comment ' {ֶ} {} ޸Ϊ {}', operator_dept_name varchar(100) comment '˲' comment '˲գ', operator_id bigint comment 'ûID' comment 'ûIDգϵͳΪ NULL', operator_name varchar(50) not null comment '' comment 'գϵͳ='ϵͳ'', primary key (id)) engine=InnoDB" via JDBC [You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'ϵͳ'', primary key (id)) engine=InnoDB' at line 1] - at org.hibernate.tool.schema.internal.exec.GenerationTargetToDatabase.accept(GenerationTargetToDatabase.java:94) ~[hibernate-core-6.5.3.Final.jar!/:6.5.3.Final] - at org.hibernate.tool.schema.internal.AbstractSchemaMigrator.applySqlString(AbstractSchemaMigrator.java:583) ~[hibernate-core-6.5.3.Final.jar!/:6.5.3.Final] - at org.hibernate.tool.schema.internal.AbstractSchemaMigrator.applySqlStrings(AbstractSchemaMigrator.java:523) ~[hibernate-core-6.5.3.Final.jar!/:6.5.3.Final] - at org.hibernate.tool.schema.internal.AbstractSchemaMigrator.createTable(AbstractSchemaMigrator.java:323) ~[hibernate-core-6.5.3.Final.jar!/:6.5.3.Final] - at org.hibernate.tool.schema.internal.GroupedSchemaMigratorImpl.performTablesMigration(GroupedSchemaMigratorImpl.java:80) ~[hibernate-core-6.5.3.Final.jar!/:6.5.3.Final] - at org.hibernate.tool.schema.internal.AbstractSchemaMigrator.performMigration(AbstractSchemaMigrator.java:240) ~[hibernate-core-6.5.3.Final.jar!/:6.5.3.Final] - at org.hibernate.tool.schema.internal.AbstractSchemaMigrator.doMigration(AbstractSchemaMigrator.java:119) ~[hibernate-core-6.5.3.Final.jar!/:6.5.3.Final] - at org.hibernate.tool.schema.spi.SchemaManagementToolCoordinator.performDatabaseAction(SchemaManagementToolCoordinator.java:280) ~[hibernate-core-6.5.3.Final.jar!/:6.5.3.Final] - at org.hibernate.tool.schema.spi.SchemaManagementToolCoordinator.lambda$process$5(SchemaManagementToolCoordinator.java:144) ~[hibernate-core-6.5.3.Final.jar!/:6.5.3.Final] - at java.base/java.util.HashMap.forEach(HashMap.java:1421) ~[na:na] - at org.hibernate.tool.schema.spi.SchemaManagementToolCoordinator.process(SchemaManagementToolCoordinator.java:141) ~[hibernate-core-6.5.3.Final.jar!/:6.5.3.Final] - at org.hibernate.boot.internal.SessionFactoryObserverForSchemaExport.sessionFactoryCreated(SessionFactoryObserverForSchemaExport.java:37) ~[hibernate-core-6.5.3.Final.jar!/:6.5.3.Final] - at org.hibernate.internal.SessionFactoryObserverChain.sessionFactoryCreated(SessionFactoryObserverChain.java:35) ~[hibernate-core-6.5.3.Final.jar!/:6.5.3.Final] - at org.hibernate.internal.SessionFactoryImpl.(SessionFactoryImpl.java:322) ~[hibernate-core-6.5.3.Final.jar!/:6.5.3.Final] - at org.hibernate.boot.internal.SessionFactoryBuilderImpl.build(SessionFactoryBuilderImpl.java:457) ~[hibernate-core-6.5.3.Final.jar!/:6.5.3.Final] - at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:1506) ~[hibernate-core-6.5.3.Final.jar!/:6.5.3.Final] - at org.springframework.orm.jpa.vendor.SpringHibernateJpaPersistenceProvider.createContainerEntityManagerFactory(SpringHibernateJpaPersistenceProvider.java:75) ~[spring-orm-6.1.14.jar!/:6.1.14] - at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:390) ~[spring-orm-6.1.14.jar!/:6.1.14] - at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.buildNativeEntityManagerFactory(AbstractEntityManagerFactoryBean.java:409) ~[spring-orm-6.1.14.jar!/:6.1.14] - at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:396) ~[spring-orm-6.1.14.jar!/:6.1.14] - at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.afterPropertiesSet(LocalContainerEntityManagerFactoryBean.java:366) ~[spring-orm-6.1.14.jar!/:6.1.14] - at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1853) ~[spring-beans-6.1.14.jar!/:6.1.14] - at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1802) ~[spring-beans-6.1.14.jar!/:6.1.14] - at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:600) ~[spring-beans-6.1.14.jar!/:6.1.14] - at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:522) ~[spring-beans-6.1.14.jar!/:6.1.14] - at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:337) ~[spring-beans-6.1.14.jar!/:6.1.14] - at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) ~[spring-beans-6.1.14.jar!/:6.1.14] - at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:335) ~[spring-beans-6.1.14.jar!/:6.1.14] - at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:205) ~[spring-beans-6.1.14.jar!/:6.1.14] - at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:954) ~[spring-context-6.1.14.jar!/:6.1.14] - at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:625) ~[spring-context-6.1.14.jar!/:6.1.14] - at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:146) ~[spring-boot-3.3.5.jar!/:3.3.5] - at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:754) ~[spring-boot-3.3.5.jar!/:3.3.5] - at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:456) ~[spring-boot-3.3.5.jar!/:3.3.5] - at org.springframework.boot.SpringApplication.run(SpringApplication.java:335) ~[spring-boot-3.3.5.jar!/:3.3.5] - at org.springframework.boot.SpringApplication.run(SpringApplication.java:1363) ~[spring-boot-3.3.5.jar!/:3.3.5] - at org.springframework.boot.SpringApplication.run(SpringApplication.java:1352) ~[spring-boot-3.3.5.jar!/:3.3.5] - at com.crm.app.CrmAppApplication.main(CrmAppApplication.java:19) ~[!/:1.0.0-SNAPSHOT] - at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na] - at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) ~[na:na] - at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na] - at java.base/java.lang.reflect.Method.invoke(Method.java:568) ~[na:na] - at org.springframework.boot.loader.launch.Launcher.launch(Launcher.java:102) ~[crm-app-1.0.0-SNAPSHOT.jar:1.0.0-SNAPSHOT] - at org.springframework.boot.loader.launch.Launcher.launch(Launcher.java:64) ~[crm-app-1.0.0-SNAPSHOT.jar:1.0.0-SNAPSHOT] - at org.springframework.boot.loader.launch.JarLauncher.main(JarLauncher.java:40) ~[crm-app-1.0.0-SNAPSHOT.jar:1.0.0-SNAPSHOT] -Caused by: java.sql.SQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'ϵͳ'', primary key (id)) engine=InnoDB' at line 1 - at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:121) ~[mysql-connector-j-8.3.0.jar!/:8.3.0] - at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:122) ~[mysql-connector-j-8.3.0.jar!/:8.3.0] - at com.mysql.cj.jdbc.StatementImpl.executeInternal(StatementImpl.java:770) ~[mysql-connector-j-8.3.0.jar!/:8.3.0] - at com.mysql.cj.jdbc.StatementImpl.execute(StatementImpl.java:653) ~[mysql-connector-j-8.3.0.jar!/:8.3.0] - at com.zaxxer.hikari.pool.ProxyStatement.execute(ProxyStatement.java:94) ~[HikariCP-5.1.0.jar!/:na] - at com.zaxxer.hikari.pool.HikariProxyStatement.execute(HikariProxyStatement.java) ~[HikariCP-5.1.0.jar!/:na] - at org.hibernate.tool.schema.internal.exec.GenerationTargetToDatabase.accept(GenerationTargetToDatabase.java:80) ~[hibernate-core-6.5.3.Final.jar!/:6.5.3.Final] - ... 44 common frames omitted - -2026-09-03T14:09:30.283+08:00 WARN 6104 --- [crm-app] [main] o.h.t.s.i.ExceptionHandlerLoggedImpl : GenerationTarget encountered exception accepting command : Error executing DDL "create index idx_oplog_customer on customer_oplog (customer_id, create_time)" via JDBC [Table 'crm.customer_oplog' doesn't exist] - -org.hibernate.tool.schema.spi.CommandAcceptanceException: Error executing DDL "create index idx_oplog_customer on customer_oplog (customer_id, create_time)" via JDBC [Table 'crm.customer_oplog' doesn't exist] - at org.hibernate.tool.schema.internal.exec.GenerationTargetToDatabase.accept(GenerationTargetToDatabase.java:94) ~[hibernate-core-6.5.3.Final.jar!/:6.5.3.Final] - at org.hibernate.tool.schema.internal.AbstractSchemaMigrator.applySqlString(AbstractSchemaMigrator.java:583) ~[hibernate-core-6.5.3.Final.jar!/:6.5.3.Final] - at org.hibernate.tool.schema.internal.AbstractSchemaMigrator.applySqlStrings(AbstractSchemaMigrator.java:523) ~[hibernate-core-6.5.3.Final.jar!/:6.5.3.Final] - at org.hibernate.tool.schema.internal.AbstractSchemaMigrator.applyIndexes(AbstractSchemaMigrator.java:368) ~[hibernate-core-6.5.3.Final.jar!/:6.5.3.Final] - at org.hibernate.tool.schema.internal.GroupedSchemaMigratorImpl.performTablesMigration(GroupedSchemaMigratorImpl.java:96) ~[hibernate-core-6.5.3.Final.jar!/:6.5.3.Final] - at org.hibernate.tool.schema.internal.AbstractSchemaMigrator.performMigration(AbstractSchemaMigrator.java:240) ~[hibernate-core-6.5.3.Final.jar!/:6.5.3.Final] - at org.hibernate.tool.schema.internal.AbstractSchemaMigrator.doMigration(AbstractSchemaMigrator.java:119) ~[hibernate-core-6.5.3.Final.jar!/:6.5.3.Final] - at org.hibernate.tool.schema.spi.SchemaManagementToolCoordinator.performDatabaseAction(SchemaManagementToolCoordinator.java:280) ~[hibernate-core-6.5.3.Final.jar!/:6.5.3.Final] - at org.hibernate.tool.schema.spi.SchemaManagementToolCoordinator.lambda$process$5(SchemaManagementToolCoordinator.java:144) ~[hibernate-core-6.5.3.Final.jar!/:6.5.3.Final] - at java.base/java.util.HashMap.forEach(HashMap.java:1421) ~[na:na] - at org.hibernate.tool.schema.spi.SchemaManagementToolCoordinator.process(SchemaManagementToolCoordinator.java:141) ~[hibernate-core-6.5.3.Final.jar!/:6.5.3.Final] - at org.hibernate.boot.internal.SessionFactoryObserverForSchemaExport.sessionFactoryCreated(SessionFactoryObserverForSchemaExport.java:37) ~[hibernate-core-6.5.3.Final.jar!/:6.5.3.Final] - at org.hibernate.internal.SessionFactoryObserverChain.sessionFactoryCreated(SessionFactoryObserverChain.java:35) ~[hibernate-core-6.5.3.Final.jar!/:6.5.3.Final] - at org.hibernate.internal.SessionFactoryImpl.(SessionFactoryImpl.java:322) ~[hibernate-core-6.5.3.Final.jar!/:6.5.3.Final] - at org.hibernate.boot.internal.SessionFactoryBuilderImpl.build(SessionFactoryBuilderImpl.java:457) ~[hibernate-core-6.5.3.Final.jar!/:6.5.3.Final] - at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:1506) ~[hibernate-core-6.5.3.Final.jar!/:6.5.3.Final] - at org.springframework.orm.jpa.vendor.SpringHibernateJpaPersistenceProvider.createContainerEntityManagerFactory(SpringHibernateJpaPersistenceProvider.java:75) ~[spring-orm-6.1.14.jar!/:6.1.14] - at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:390) ~[spring-orm-6.1.14.jar!/:6.1.14] - at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.buildNativeEntityManagerFactory(AbstractEntityManagerFactoryBean.java:409) ~[spring-orm-6.1.14.jar!/:6.1.14] - at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:396) ~[spring-orm-6.1.14.jar!/:6.1.14] - at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.afterPropertiesSet(LocalContainerEntityManagerFactoryBean.java:366) ~[spring-orm-6.1.14.jar!/:6.1.14] - at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1853) ~[spring-beans-6.1.14.jar!/:6.1.14] - at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1802) ~[spring-beans-6.1.14.jar!/:6.1.14] - at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:600) ~[spring-beans-6.1.14.jar!/:6.1.14] - at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:522) ~[spring-beans-6.1.14.jar!/:6.1.14] - at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:337) ~[spring-beans-6.1.14.jar!/:6.1.14] - at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) ~[spring-beans-6.1.14.jar!/:6.1.14] - at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:335) ~[spring-beans-6.1.14.jar!/:6.1.14] - at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:205) ~[spring-beans-6.1.14.jar!/:6.1.14] - at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:954) ~[spring-context-6.1.14.jar!/:6.1.14] - at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:625) ~[spring-context-6.1.14.jar!/:6.1.14] - at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:146) ~[spring-boot-3.3.5.jar!/:3.3.5] - at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:754) ~[spring-boot-3.3.5.jar!/:3.3.5] - at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:456) ~[spring-boot-3.3.5.jar!/:3.3.5] - at org.springframework.boot.SpringApplication.run(SpringApplication.java:335) ~[spring-boot-3.3.5.jar!/:3.3.5] - at org.springframework.boot.SpringApplication.run(SpringApplication.java:1363) ~[spring-boot-3.3.5.jar!/:3.3.5] - at org.springframework.boot.SpringApplication.run(SpringApplication.java:1352) ~[spring-boot-3.3.5.jar!/:3.3.5] - at com.crm.app.CrmAppApplication.main(CrmAppApplication.java:19) ~[!/:1.0.0-SNAPSHOT] - at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na] - at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) ~[na:na] - at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na] - at java.base/java.lang.reflect.Method.invoke(Method.java:568) ~[na:na] - at org.springframework.boot.loader.launch.Launcher.launch(Launcher.java:102) ~[crm-app-1.0.0-SNAPSHOT.jar:1.0.0-SNAPSHOT] - at org.springframework.boot.loader.launch.Launcher.launch(Launcher.java:64) ~[crm-app-1.0.0-SNAPSHOT.jar:1.0.0-SNAPSHOT] - at org.springframework.boot.loader.launch.JarLauncher.main(JarLauncher.java:40) ~[crm-app-1.0.0-SNAPSHOT.jar:1.0.0-SNAPSHOT] -Caused by: java.sql.SQLSyntaxErrorException: Table 'crm.customer_oplog' doesn't exist - at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:121) ~[mysql-connector-j-8.3.0.jar!/:8.3.0] - at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:122) ~[mysql-connector-j-8.3.0.jar!/:8.3.0] - at com.mysql.cj.jdbc.StatementImpl.executeInternal(StatementImpl.java:770) ~[mysql-connector-j-8.3.0.jar!/:8.3.0] - at com.mysql.cj.jdbc.StatementImpl.execute(StatementImpl.java:653) ~[mysql-connector-j-8.3.0.jar!/:8.3.0] - at com.zaxxer.hikari.pool.ProxyStatement.execute(ProxyStatement.java:94) ~[HikariCP-5.1.0.jar!/:na] - at com.zaxxer.hikari.pool.HikariProxyStatement.execute(HikariProxyStatement.java) ~[HikariCP-5.1.0.jar!/:na] - at org.hibernate.tool.schema.internal.exec.GenerationTargetToDatabase.accept(GenerationTargetToDatabase.java:80) ~[hibernate-core-6.5.3.Final.jar!/:6.5.3.Final] - ... 44 common frames omitted - -2026-09-03T14:09:31.712+08:00 INFO 6104 --- [crm-app] [main] j.LocalContainerEntityManagerFactoryBean : Initialized JPA EntityManagerFactory for persistence unit 'default' -2026-09-03T14:09:32.150+08:00 WARN 6104 --- [crm-app] [main] c.c.a.controller.DebugTokenController : ============================================================ -2026-09-03T14:09:32.150+08:00 WARN 6104 --- [crm-app] [main] c.c.a.controller.DebugTokenController : token ӿ /api/auth/debug/token ãverify profile -2026-09-03T14:09:32.151+08:00 WARN 6104 --- [crm-app] [main] c.c.a.controller.DebugTokenController : Ͻκ֪ userId ˿ðû -2026-09-03T14:09:32.151+08:00 WARN 6104 --- [crm-app] [main] c.c.a.controller.DebugTokenController : μ docs/adr/0014-verify-profile-debug-token-endpoint.md -2026-09-03T14:09:32.151+08:00 WARN 6104 --- [crm-app] [main] c.c.a.controller.DebugTokenController : ============================================================ -2026-09-03T14:09:34.215+08:00 INFO 6104 --- [crm-app] [main] c.c.c.p.i.NgramNameSimilarityPortImpl : CustomerNameSimilarityPort һʵ־ԤɸģʽFULLTEXT ngram -2026-09-03T14:09:34.375+08:00 INFO 6104 --- [crm-app] [main] c.c.c.p.impl.StubCompanyLookupPortImpl : CompanyLookupPort һ stub װ䣨δ룬̺ѡؿգ -2026-09-03T14:09:34.595+08:00 INFO 6104 --- [crm-app] [main] c.c.c.p.i.NoopProjectOwnerSyncPortImpl : ProjectOwnerSyncPort no-op Ĭʵװ䣨A5 Ŀģδowner ͬ -2026-09-03T14:09:34.673+08:00 INFO 6104 --- [crm-app] [main] c.c.p.i.NoopOpportunityOwnerSyncPortImpl : OpportunityOwnerSyncPort no-op Ĭʵװ䣨Ʊ 11 ̻Դ滻 -2026-09-03T14:09:34.864+08:00 WARN 6104 --- [crm-app] [main] .s.s.UserDetailsServiceAutoConfiguration : - -Using generated security password: 56938df4-df08-406c-9039-ad43b49523ef - -This generated password is for development use only. Your security configuration must be updated before running your application in production. - -2026-09-03T14:09:34.891+08:00 INFO 6104 --- [crm-app] [main] r$InitializeUserDetailsManagerConfigurer : Global AuthenticationManager configured with UserDetailsService bean with name inMemoryUserDetailsManager -2026-09-03T14:09:36.183+08:00 INFO 6104 --- [crm-app] [main] c.c.a.c.DataScopeModuleStartupValidator : ȨģУͨ0 ܿر4 עģ -2026-09-03T14:09:36.229+08:00 INFO 6104 --- [crm-app] [main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port 8080 (http) with context path '/' -2026-09-03T14:09:36.271+08:00 INFO 6104 --- [crm-app] [main] com.crm.app.CrmAppApplication : Started CrmAppApplication in 33.352 seconds (process running for 34.152) -2026-09-03T14:09:36.276+08:00 INFO 6104 --- [crm-app] [main] com.crm.auth.config.DataInitializer : ִȨݳʼ... -2026-09-03T14:09:37.009+08:00 INFO 6104 --- [crm-app] [main] com.crm.auth.config.DataInitializer : Ȩݳʼ -2026-09-03T14:09:37.009+08:00 INFO 6104 --- [crm-app] [main] c.c.d.config.DictPermissionInitializer : ִֵȨӻ... -2026-09-03T14:09:37.357+08:00 INFO 6104 --- [crm-app] [main] c.c.d.config.DictPermissionInitializer : ֵȨӻɣ10 Ȩ޵ -2026-09-03T14:09:37.357+08:00 INFO 6104 --- [crm-app] [main] c.c.r.config.RulePermissionInitializer : ִȨӻ飨˵... -2026-09-03T14:09:37.443+08:00 INFO 6104 --- [crm-app] [main] c.c.r.config.RulePermissionInitializer : Ȩӻɣ˵0 button -2026-09-03T14:09:37.443+08:00 INFO 6104 --- [crm-app] [main] c.c.l.config.LeadPermissionInitializer : ִȨӻ飨˵... -2026-09-03T14:09:37.812+08:00 INFO 6104 --- [crm-app] [main] c.c.l.config.LeadPermissionInitializer : Ȩӻɣ4 ˵0 button -2026-09-03T14:09:37.812+08:00 INFO 6104 --- [crm-app] [main] c.crm.rule.config.RegionDataInitializer : ִȫӵ... -2026-09-03T14:09:39.226+08:00 INFO 6104 --- [crm-app] [main] c.crm.rule.config.RegionDataInitializer : ӵɣ 3432 Уʡ 34 / 342 / 3056 3432 У 0 -2026-09-03T14:09:39.227+08:00 INFO 6104 --- [crm-app] [main] r.c.OpportunityRulePermissionInitializer : ִ̻Ȩӻ飨˵... -2026-09-03T14:09:39.322+08:00 INFO 6104 --- [crm-app] [main] r.c.OpportunityRulePermissionInitializer : ̻Ȩӻɣ˵0 button -2026-09-03T14:09:39.322+08:00 INFO 6104 --- [crm-app] [main] tunityStageTemplatePermissionInitializer : ִ̻׶ģȨӻ飨˵... -2026-09-03T14:09:39.406+08:00 INFO 6104 --- [crm-app] [main] tunityStageTemplatePermissionInitializer : ̻׶ģȨӻɣ˵0 button -2026-09-03T14:09:39.407+08:00 INFO 6104 --- [crm-app] [main] ustomerReminderRulePermissionInitializer : ִпͻѹȨӻ飨˵... -2026-09-03T14:09:39.450+08:00 INFO 6104 --- [crm-app] [main] c.c.a.service.impl.PermissionSeederImpl : Ŀ¼ڵ㣺ͻ (type=1) -2026-09-03T14:09:39.481+08:00 INFO 6104 --- [crm-app] [main] c.c.a.service.impl.PermissionSeederImpl : ˵ڵ㣺ѹ (type=2) -2026-09-03T14:09:39.577+08:00 INFO 6104 --- [crm-app] [main] ustomerReminderRulePermissionInitializer : ͻѹȨӻɣ˵0 button -2026-09-03T14:09:39.577+08:00 INFO 6104 --- [crm-app] [main] c.c.r.config.SchemeFieldDefInitializer : ִзϵͳֶοӻ... -2026-09-03T14:09:39.592+08:00 INFO 6104 --- [crm-app] [main] c.c.r.config.SchemeFieldDefInitializer : ϵͳֶοӻɣִ 16 0 -2026-09-03T14:09:39.607+08:00 INFO 6104 --- [crm-app] [main] c.c.r.config.SchemeFieldDefInitializer : ģѴڣcode=OPP_SCHEME_TPL_01ͣãӻ -2026-09-03T14:09:39.607+08:00 INFO 6104 --- [crm-app] [main] ySchemeCardTemplatePermissionInitializer : ִзģȨӻ飨˵... -2026-09-03T14:09:39.692+08:00 INFO 6104 --- [crm-app] [main] ySchemeCardTemplatePermissionInitializer : ģȨӻɣ˵0 button -2026-09-03T14:09:39.708+08:00 INFO 6104 --- [crm-app] [main] c.c.r.config.StageTemplateInitializer : ĬϽ׶ģѴڣcode=OPP_STAGE_TPL_01ͣãӻ -2026-09-03T14:09:39.747+08:00 INFO 6104 --- [crm-app] [main] c.c.r.c.CustomerReminderRuleInitializer : ֲͻѹid=1ȫã״ 30 / μ 7 죩 -2026-09-03T14:09:40.099+08:00 WARN 6104 --- [crm-app] [main] com.crm.file.config.MinioConfig : MinIO bucket [crm] ʼʧܣļܿܲãThe Access Key Id you provided does not exist in our records. -2026-09-03T14:09:40.100+08:00 INFO 6104 --- [crm-app] [main] c.crm.dict.config.DictDataInitializer : ִֵݵȳʼ... -2026-09-03T14:09:48.587+08:00 INFO 6104 --- [crm-app] [main] c.crm.dict.config.DictDataInitializer : ֵ飺ԭ (transfer_reason) -2026-09-03T14:09:48.646+08:00 INFO 6104 --- [crm-app] [main] c.crm.dict.config.DictDataInitializer : ֵԱְ (transfer_reason/resign) -2026-09-03T14:09:48.702+08:00 INFO 6104 --- [crm-app] [main] c.crm.dict.config.DictDataInitializer : ֵλ (transfer_reason/transfer_post) -2026-09-03T14:09:48.759+08:00 INFO 6104 --- [crm-app] [main] c.crm.dict.config.DictDataInitializer : ֵ (transfer_reason/region_adjust) -2026-09-03T14:09:48.770+08:00 INFO 6104 --- [crm-app] [main] c.crm.dict.config.DictDataInitializer : ֵݵȳʼɣ24 -2026-09-03T14:09:49.324+08:00 INFO 6104 --- [crm-app] [main] c.c.c.c.CustomerFulltextIndexInitializer : customer FULLTEXT idx_name_fulltext ɣngram, token_size=2 -2026-09-03T14:11:28.579+08:00 INFO 6104 --- [crm-app] [http-nio-8080-exec-1] o.s.web.servlet.DispatcherServlet : Initializing Servlet 'dispatcherServlet' -2026-09-03T14:11:28.592+08:00 INFO 6104 --- [crm-app] [http-nio-8080-exec-1] o.s.web.servlet.DispatcherServlet : Completed initialization in 12 ms -2026-09-03T14:11:46.962+08:00 WARN 6104 --- [crm-app] [http-nio-8080-exec-4] c.c.a.controller.DebugTokenController : [verify] Ϊ userId=739564171091247104 ǩ token -2026-09-03T14:13:17.005+08:00 WARN 6104 --- [crm-app] [http-nio-8080-exec-10] c.c.b.a.GlobalExceptionHandlerAdvice : ҵ쳣code=66001, msg=oppId -2026-09-03T14:14:09.831+08:00 WARN 6104 --- [crm-app] [http-nio-8080-exec-5] c.c.b.a.GlobalExceptionHandlerAdvice : ҵ쳣code=66001, msg=oppId -2026-09-03T14:14:59.866+08:00 WARN 6104 --- [crm-app] [http-nio-8080-exec-7] c.c.b.a.GlobalExceptionHandlerAdvice : ҵ쳣code=67001, msg=ͻƲΪ -2026-09-03T14:15:32.738+08:00 WARN 6104 --- [crm-app] [http-nio-8080-exec-9] c.c.b.a.GlobalExceptionHandlerAdvice : ҵ쳣code=67001, msg=ͻƲΪ -2026-09-03T14:16:09.170+08:00 WARN 6104 --- [crm-app] [http-nio-8080-exec-1] c.c.b.a.GlobalExceptionHandlerAdvice : ҵ쳣code=67001, msg=ͻƲΪ -2026-09-03T14:17:25.791+08:00 ERROR 6104 --- [crm-app] [http-nio-8080-exec-4] c.c.b.a.GlobalExceptionHandlerAdvice : ȫ쳣 - -org.springframework.jdbc.BadSqlGrammarException: -### Error updating database. Cause: java.sql.SQLSyntaxErrorException: Table 'crm.customer_oplog' doesn't exist -### The error may exist in com/crm/customer/mapper/CustomerOplogMapper.java (best guess) -### The error may involve com.crm.customer.mapper.CustomerOplogMapper.insert-Inline -### The error occurred while setting parameters -### SQL: INSERT INTO customer_oplog ( id, customer_id, action, detail, operator_id, operator_name, operator_dept_name, creator_id, create_time, updater_id, update_time, deleted ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? ) -### Cause: java.sql.SQLSyntaxErrorException: Table 'crm.customer_oplog' doesn't exist -; bad SQL grammar [] - at org.springframework.jdbc.support.SQLErrorCodeSQLExceptionTranslator.doTranslate(SQLErrorCodeSQLExceptionTranslator.java:246) ~[spring-jdbc-6.1.14.jar!/:6.1.14] - at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:107) ~[spring-jdbc-6.1.14.jar!/:6.1.14] - at org.mybatis.spring.MyBatisExceptionTranslator.translateExceptionIfPossible(MyBatisExceptionTranslator.java:92) ~[mybatis-spring-3.0.3.jar!/:3.0.3] - at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:439) ~[mybatis-spring-3.0.3.jar!/:3.0.3] - at jdk.proxy2/jdk.proxy2.$Proxy106.insert(Unknown Source) ~[na:na] - at org.mybatis.spring.SqlSessionTemplate.insert(SqlSessionTemplate.java:272) ~[mybatis-spring-3.0.3.jar!/:3.0.3] - at com.baomidou.mybatisplus.core.override.MybatisMapperMethod.execute(MybatisMapperMethod.java:59) ~[mybatis-plus-core-3.5.7.jar!/:3.5.7] - at com.baomidou.mybatisplus.core.override.MybatisMapperProxy$PlainMethodInvoker.invoke(MybatisMapperProxy.java:152) ~[mybatis-plus-core-3.5.7.jar!/:3.5.7] - at com.baomidou.mybatisplus.core.override.MybatisMapperProxy.invoke(MybatisMapperProxy.java:89) ~[mybatis-plus-core-3.5.7.jar!/:3.5.7] - at jdk.proxy2/jdk.proxy2.$Proxy227.insert(Unknown Source) ~[na:na] - at com.crm.customer.service.CustomerOplogWriter.insert(CustomerOplogWriter.java:56) ~[crm-customer-1.0.0-SNAPSHOT.jar!/:1.0.0-SNAPSHOT] - at com.crm.customer.service.CustomerOplogWriter.write(CustomerOplogWriter.java:36) ~[crm-customer-1.0.0-SNAPSHOT.jar!/:1.0.0-SNAPSHOT] - at com.crm.customer.service.impl.CustomerServiceImpl.create(CustomerServiceImpl.java:118) ~[crm-customer-1.0.0-SNAPSHOT.jar!/:1.0.0-SNAPSHOT] - at com.crm.customer.service.impl.CustomerServiceImpl.quickCreate(CustomerServiceImpl.java:224) ~[crm-customer-1.0.0-SNAPSHOT.jar!/:1.0.0-SNAPSHOT] - at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na] - at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) ~[na:na] - at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na] - at java.base/java.lang.reflect.Method.invoke(Method.java:568) ~[na:na] - at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:355) ~[spring-aop-6.1.14.jar!/:6.1.14] - at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:196) ~[spring-aop-6.1.14.jar!/:6.1.14] - at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) ~[spring-aop-6.1.14.jar!/:6.1.14] - at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:768) ~[spring-aop-6.1.14.jar!/:6.1.14] - at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:379) ~[spring-tx-6.1.14.jar!/:6.1.14] - at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:119) ~[spring-tx-6.1.14.jar!/:6.1.14] - at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184) ~[spring-aop-6.1.14.jar!/:6.1.14] - at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:768) ~[spring-aop-6.1.14.jar!/:6.1.14] - at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:720) ~[spring-aop-6.1.14.jar!/:6.1.14] - at com.crm.customer.service.impl.CustomerServiceImpl$$SpringCGLIB$$0.quickCreate() ~[crm-customer-1.0.0-SNAPSHOT.jar!/:1.0.0-SNAPSHOT] - at com.crm.customer.controller.CustomerController.quickCreate(CustomerController.java:85) ~[crm-customer-1.0.0-SNAPSHOT.jar!/:1.0.0-SNAPSHOT] - at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na] - at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) ~[na:na] - at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na] - at java.base/java.lang.reflect.Method.invoke(Method.java:568) ~[na:na] - at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:255) ~[spring-web-6.1.14.jar!/:6.1.14] - at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:188) ~[spring-web-6.1.14.jar!/:6.1.14] - at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:118) ~[spring-webmvc-6.1.14.jar!/:6.1.14] ->>>>>>> Stashed changes - at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:926) ~[spring-webmvc-6.1.14.jar!/:6.1.14] - at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:831) ~[spring-webmvc-6.1.14.jar!/:6.1.14] - at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87) ~[spring-webmvc-6.1.14.jar!/:6.1.14] - at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1089) ~[spring-webmvc-6.1.14.jar!/:6.1.14] - at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:979) ~[spring-webmvc-6.1.14.jar!/:6.1.14] - at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1014) ~[spring-webmvc-6.1.14.jar!/:6.1.14] - at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:903) ~[spring-webmvc-6.1.14.jar!/:6.1.14] - at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:564) ~[tomcat-embed-core-10.1.31.jar!/:na] - at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:885) ~[spring-webmvc-6.1.14.jar!/:6.1.14] - at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:658) ~[tomcat-embed-core-10.1.31.jar!/:na] - at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:195) ~[tomcat-embed-core-10.1.31.jar!/:na] - at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) ~[tomcat-embed-core-10.1.31.jar!/:na] - at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51) ~[tomcat-embed-websocket-10.1.31.jar!/:na] - at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164) ~[tomcat-embed-core-10.1.31.jar!/:na] - at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) ~[tomcat-embed-core-10.1.31.jar!/:na] - at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:110) ~[spring-web-6.1.14.jar!/:6.1.14] - at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164) ~[tomcat-embed-core-10.1.31.jar!/:na] - at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) ~[tomcat-embed-core-10.1.31.jar!/:na] - at org.springframework.web.filter.CompositeFilter$VirtualFilterChain.doFilter(CompositeFilter.java:108) ~[spring-web-6.1.14.jar!/:6.1.14] - at org.springframework.security.web.FilterChainProxy.lambda$doFilterInternal$3(FilterChainProxy.java:231) ~[spring-security-web-6.3.4.jar!/:6.3.4] - at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:365) ~[spring-security-web-6.3.4.jar!/:6.3.4] - at org.springframework.security.web.access.intercept.AuthorizationFilter.doFilter(AuthorizationFilter.java:100) ~[spring-security-web-6.3.4.jar!/:6.3.4] - at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:374) ~[spring-security-web-6.3.4.jar!/:6.3.4] - at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:126) ~[spring-security-web-6.3.4.jar!/:6.3.4] - at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:120) ~[spring-security-web-6.3.4.jar!/:6.3.4] - at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:374) ~[spring-security-web-6.3.4.jar!/:6.3.4] - at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:131) ~[spring-security-web-6.3.4.jar!/:6.3.4] - at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:85) ~[spring-security-web-6.3.4.jar!/:6.3.4] - at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:374) ~[spring-security-web-6.3.4.jar!/:6.3.4] - at org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:100) ~[spring-security-web-6.3.4.jar!/:6.3.4] - at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:374) ~[spring-security-web-6.3.4.jar!/:6.3.4] - at org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:179) ~[spring-security-web-6.3.4.jar!/:6.3.4] - at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:374) ~[spring-security-web-6.3.4.jar!/:6.3.4] - at org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:63) ~[spring-security-web-6.3.4.jar!/:6.3.4] - at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:374) ~[spring-security-web-6.3.4.jar!/:6.3.4] - at com.crm.auth.security.JwtAuthenticationFilter.doFilterInternal(JwtAuthenticationFilter.java:60) ~[crm-auth-1.0.0-SNAPSHOT.jar!/:1.0.0-SNAPSHOT] - at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) ~[spring-web-6.1.14.jar!/:6.1.14] - at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:374) ~[spring-security-web-6.3.4.jar!/:6.3.4] - at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:107) ~[spring-security-web-6.3.4.jar!/:6.3.4] - at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:93) ~[spring-security-web-6.3.4.jar!/:6.3.4] - at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:374) ~[spring-security-web-6.3.4.jar!/:6.3.4] - at org.springframework.security.web.header.HeaderWriterFilter.doHeadersAfter(HeaderWriterFilter.java:90) ~[spring-security-web-6.3.4.jar!/:6.3.4] - at org.springframework.security.web.header.HeaderWriterFilter.doFilterInternal(HeaderWriterFilter.java:75) ~[spring-security-web-6.3.4.jar!/:6.3.4] - at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) ~[spring-web-6.1.14.jar!/:6.1.14] - at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:374) ~[spring-security-web-6.3.4.jar!/:6.3.4] - at org.springframework.security.web.context.SecurityContextHolderFilter.doFilter(SecurityContextHolderFilter.java:82) ~[spring-security-web-6.3.4.jar!/:6.3.4] - at org.springframework.security.web.context.SecurityContextHolderFilter.doFilter(SecurityContextHolderFilter.java:69) ~[spring-security-web-6.3.4.jar!/:6.3.4] - at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:374) ~[spring-security-web-6.3.4.jar!/:6.3.4] - at org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter.doFilterInternal(WebAsyncManagerIntegrationFilter.java:62) ~[spring-security-web-6.3.4.jar!/:6.3.4] - at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) ~[spring-web-6.1.14.jar!/:6.1.14] - at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:374) ~[spring-security-web-6.3.4.jar!/:6.3.4] - at org.springframework.security.web.session.DisableEncodeUrlFilter.doFilterInternal(DisableEncodeUrlFilter.java:42) ~[spring-security-web-6.3.4.jar!/:6.3.4] - at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) ~[spring-web-6.1.14.jar!/:6.1.14] - at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:374) ~[spring-security-web-6.3.4.jar!/:6.3.4] - at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:233) ~[spring-security-web-6.3.4.jar!/:6.3.4] - at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:191) ~[spring-security-web-6.3.4.jar!/:6.3.4] - at org.springframework.web.filter.CompositeFilter$VirtualFilterChain.doFilter(CompositeFilter.java:113) ~[spring-web-6.1.14.jar!/:6.1.14] - at org.springframework.web.servlet.handler.HandlerMappingIntrospector.lambda$createCacheFilter$3(HandlerMappingIntrospector.java:195) ~[spring-webmvc-6.1.14.jar!/:6.1.14] - at org.springframework.web.filter.CompositeFilter$VirtualFilterChain.doFilter(CompositeFilter.java:113) ~[spring-web-6.1.14.jar!/:6.1.14] - at org.springframework.web.filter.CompositeFilter.doFilter(CompositeFilter.java:74) ~[spring-web-6.1.14.jar!/:6.1.14] - at org.springframework.security.config.annotation.web.configuration.WebMvcSecurityConfiguration$CompositeFilterChainProxy.doFilter(WebMvcSecurityConfiguration.java:230) ~[spring-security-config-6.3.4.jar!/:6.3.4] - at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:362) ~[spring-web-6.1.14.jar!/:6.1.14] - at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:278) ~[spring-web-6.1.14.jar!/:6.1.14] - at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164) ~[tomcat-embed-core-10.1.31.jar!/:na] - at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) ~[tomcat-embed-core-10.1.31.jar!/:na] - at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) ~[spring-web-6.1.14.jar!/:6.1.14] - at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) ~[spring-web-6.1.14.jar!/:6.1.14] - at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164) ~[tomcat-embed-core-10.1.31.jar!/:na] - at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) ~[tomcat-embed-core-10.1.31.jar!/:na] - at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) ~[spring-web-6.1.14.jar!/:6.1.14] - at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) ~[spring-web-6.1.14.jar!/:6.1.14] - at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164) ~[tomcat-embed-core-10.1.31.jar!/:na] - at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) ~[tomcat-embed-core-10.1.31.jar!/:na] - at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) ~[spring-web-6.1.14.jar!/:6.1.14] - at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) ~[spring-web-6.1.14.jar!/:6.1.14] - at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164) ~[tomcat-embed-core-10.1.31.jar!/:na] - at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) ~[tomcat-embed-core-10.1.31.jar!/:na] - at com.crm.base.filter.TraceIdFilter.doFilterInternal(TraceIdFilter.java:39) ~[crm-base-1.0.0-SNAPSHOT.jar!/:1.0.0-SNAPSHOT] - at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) ~[spring-web-6.1.14.jar!/:6.1.14] - at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164) ~[tomcat-embed-core-10.1.31.jar!/:na] - at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) ~[tomcat-embed-core-10.1.31.jar!/:na] - at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:167) ~[tomcat-embed-core-10.1.31.jar!/:na] - at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:90) ~[tomcat-embed-core-10.1.31.jar!/:na] - at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:483) ~[tomcat-embed-core-10.1.31.jar!/:na] - at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:115) ~[tomcat-embed-core-10.1.31.jar!/:na] - at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:93) ~[tomcat-embed-core-10.1.31.jar!/:na] - at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74) ~[tomcat-embed-core-10.1.31.jar!/:na] - at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:344) ~[tomcat-embed-core-10.1.31.jar!/:na] - at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:384) ~[tomcat-embed-core-10.1.31.jar!/:na] - at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:63) ~[tomcat-embed-core-10.1.31.jar!/:na] - at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:905) ~[tomcat-embed-core-10.1.31.jar!/:na] - at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1741) ~[tomcat-embed-core-10.1.31.jar!/:na] - at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52) ~[tomcat-embed-core-10.1.31.jar!/:na] - at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1190) ~[tomcat-embed-core-10.1.31.jar!/:na] - at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659) ~[tomcat-embed-core-10.1.31.jar!/:na] - at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:63) ~[tomcat-embed-core-10.1.31.jar!/:na] -<<<<<<< Updated upstream - at java.base/java.lang.Thread.run(Thread.java:840) ~[na:na] - Suppressed: org.springframework.web.context.request.async.AsyncRequestNotUsableException: Response not usable after response errors. - at org.springframework.web.context.request.async.StandardServletAsyncWebRequest$LifecycleHttpServletResponse.obtainLockOrRaiseException(StandardServletAsyncWebRequest.java:335) ~[spring-web-6.1.14.jar!/:6.1.14] - at org.springframework.web.context.request.async.StandardServletAsyncWebRequest$LifecycleServletOutputStream.write(StandardServletAsyncWebRequest.java:396) ~[spring-web-6.1.14.jar!/:6.1.14] - at org.springframework.util.StreamUtils$NonClosingOutputStream.write(StreamUtils.java:261) ~[spring-core-6.1.14.jar!/:6.1.14] - at com.fasterxml.jackson.core.json.UTF8JsonGenerator._flushBuffer(UTF8JsonGenerator.java:2210) ~[jackson-core-2.17.2.jar!/:2.17.2] - at com.fasterxml.jackson.core.json.UTF8JsonGenerator.close(UTF8JsonGenerator.java:1234) ~[jackson-core-2.17.2.jar!/:2.17.2] - at org.springframework.http.converter.json.AbstractJackson2HttpMessageConverter.writeInternal(AbstractJackson2HttpMessageConverter.java:452) ~[spring-web-6.1.14.jar!/:6.1.14] - ... 102 common frames omitted -Caused by: org.apache.catalina.connector.ClientAbortException: java.io.IOException: еֹһѽӡ - at org.apache.catalina.connector.OutputBuffer.realWriteBytes(OutputBuffer.java:341) ~[tomcat-embed-core-10.1.31.jar!/:na] - at org.apache.catalina.connector.OutputBuffer.flushByteBuffer(OutputBuffer.java:776) ~[tomcat-embed-core-10.1.31.jar!/:na] - at org.apache.catalina.connector.OutputBuffer.append(OutputBuffer.java:673) ~[tomcat-embed-core-10.1.31.jar!/:na] - at org.apache.catalina.connector.OutputBuffer.writeBytes(OutputBuffer.java:376) ~[tomcat-embed-core-10.1.31.jar!/:na] - at org.apache.catalina.connector.OutputBuffer.write(OutputBuffer.java:354) ~[tomcat-embed-core-10.1.31.jar!/:na] - at org.apache.catalina.connector.CoyoteOutputStream.write(CoyoteOutputStream.java:103) ~[tomcat-embed-core-10.1.31.jar!/:na] - at org.springframework.security.web.util.OnCommittedResponseWrapper$SaveContextServletOutputStream.write(OnCommittedResponseWrapper.java:639) ~[spring-security-web-6.3.4.jar!/:6.3.4] - at org.springframework.web.context.request.async.StandardServletAsyncWebRequest$LifecycleServletOutputStream.write(StandardServletAsyncWebRequest.java:398) ~[spring-web-6.1.14.jar!/:6.1.14] - ... 122 common frames omitted -Caused by: java.io.IOException: еֹһѽӡ - at java.base/sun.nio.ch.SocketDispatcher.write0(Native Method) ~[na:na] - at java.base/sun.nio.ch.SocketDispatcher.write(SocketDispatcher.java:54) ~[na:na] - at java.base/sun.nio.ch.IOUtil.writeFromNativeBuffer(IOUtil.java:132) ~[na:na] - at java.base/sun.nio.ch.IOUtil.write(IOUtil.java:97) ~[na:na] - at java.base/sun.nio.ch.IOUtil.write(IOUtil.java:53) ~[na:na] - at java.base/sun.nio.ch.SocketChannelImpl.write(SocketChannelImpl.java:532) ~[na:na] - at org.apache.tomcat.util.net.NioChannel.write(NioChannel.java:122) ~[tomcat-embed-core-10.1.31.jar!/:na] - at org.apache.tomcat.util.net.NioEndpoint$NioSocketWrapper.doWrite(NioEndpoint.java:1378) ~[tomcat-embed-core-10.1.31.jar!/:na] - at org.apache.tomcat.util.net.SocketWrapperBase.doWrite(SocketWrapperBase.java:764) ~[tomcat-embed-core-10.1.31.jar!/:na] - at org.apache.tomcat.util.net.SocketWrapperBase.writeBlocking(SocketWrapperBase.java:589) ~[tomcat-embed-core-10.1.31.jar!/:na] - at org.apache.tomcat.util.net.SocketWrapperBase.write(SocketWrapperBase.java:533) ~[tomcat-embed-core-10.1.31.jar!/:na] - at org.apache.coyote.http11.Http11OutputBuffer$SocketOutputBuffer.doWrite(Http11OutputBuffer.java:548) ~[tomcat-embed-core-10.1.31.jar!/:na] - at org.apache.coyote.http11.filters.ChunkedOutputFilter.doWrite(ChunkedOutputFilter.java:111) ~[tomcat-embed-core-10.1.31.jar!/:na] - at org.apache.coyote.http11.Http11OutputBuffer.doWrite(Http11OutputBuffer.java:193) ~[tomcat-embed-core-10.1.31.jar!/:na] - at org.apache.coyote.Response.doWrite(Response.java:633) ~[tomcat-embed-core-10.1.31.jar!/:na] - at org.apache.catalina.connector.OutputBuffer.realWriteBytes(OutputBuffer.java:329) ~[tomcat-embed-core-10.1.31.jar!/:na] - ... 129 common frames omitted - -2026-09-04T00:05:00.009+08:00 INFO 24328 --- [crm-app] [scheduling-1] c.crm.customer.job.CustomerReminderJob : [ͻJob] ʼnow=2026-09-04T00:05:00.009129500 -2026-09-04T00:05:00.090+08:00 INFO 24328 --- [crm-app] [scheduling-1] c.crm.customer.job.CustomerReminderJob : [ͻJob] ɣ 1 êʧЧ 0 -2026-09-04T00:05:30.012+08:00 INFO 24328 --- [crm-app] [scheduling-1] c.crm.customer.job.CustomerReminderJob : [ͻJob] ʼnow=2026-09-04T00:05:30.012018100 -2026-09-04T00:05:30.091+08:00 INFO 24328 --- [crm-app] [scheduling-1] c.crm.customer.job.CustomerReminderJob : [ͻJob] ɣ 1 êʧЧ 0 -2026-09-04T00:05:47.967+08:00 ERROR 24328 --- [crm-app] [http-nio-8080-exec-9] c.c.b.a.GlobalExceptionHandlerAdvice : ȫ쳣 - -org.springframework.web.context.request.async.AsyncRequestNotUsableException: ServletOutputStream failed to write: java.io.IOException: еֹһѽӡ - at org.springframework.web.context.request.async.StandardServletAsyncWebRequest$LifecycleHttpServletResponse.handleIOException(StandardServletAsyncWebRequest.java:343) ~[spring-web-6.1.14.jar!/:6.1.14] - at org.springframework.web.context.request.async.StandardServletAsyncWebRequest$LifecycleServletOutputStream.write(StandardServletAsyncWebRequest.java:401) ~[spring-web-6.1.14.jar!/:6.1.14] - at org.springframework.util.StreamUtils$NonClosingOutputStream.write(StreamUtils.java:261) ~[spring-core-6.1.14.jar!/:6.1.14] - at com.fasterxml.jackson.core.json.UTF8JsonGenerator._flushBuffer(UTF8JsonGenerator.java:2210) ~[jackson-core-2.17.2.jar!/:2.17.2] - at com.fasterxml.jackson.core.json.UTF8JsonGenerator._writeStringSegment2(UTF8JsonGenerator.java:1522) ~[jackson-core-2.17.2.jar!/:2.17.2] - at com.fasterxml.jackson.core.json.UTF8JsonGenerator._writeStringSegment(UTF8JsonGenerator.java:1469) ~[jackson-core-2.17.2.jar!/:2.17.2] - at com.fasterxml.jackson.core.json.UTF8JsonGenerator.writeString(UTF8JsonGenerator.java:531) ~[jackson-core-2.17.2.jar!/:2.17.2] - at com.fasterxml.jackson.databind.ser.std.StringSerializer.serialize(StringSerializer.java:41) ~[jackson-databind-2.17.2.jar!/:2.17.2] - at com.fasterxml.jackson.databind.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:732) ~[jackson-databind-2.17.2.jar!/:2.17.2] - at com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:770) ~[jackson-databind-2.17.2.jar!/:2.17.2] - at com.fasterxml.jackson.databind.ser.BeanSerializer.serialize(BeanSerializer.java:183) ~[jackson-databind-2.17.2.jar!/:2.17.2] - at com.fasterxml.jackson.databind.ser.impl.IndexedListSerializer.serializeContents(IndexedListSerializer.java:119) ~[jackson-databind-2.17.2.jar!/:2.17.2] - at com.fasterxml.jackson.databind.ser.impl.IndexedListSerializer.serialize(IndexedListSerializer.java:79) ~[jackson-databind-2.17.2.jar!/:2.17.2] - at com.fasterxml.jackson.databind.ser.impl.IndexedListSerializer.serialize(IndexedListSerializer.java:18) ~[jackson-databind-2.17.2.jar!/:2.17.2] - at com.fasterxml.jackson.databind.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:732) ~[jackson-databind-2.17.2.jar!/:2.17.2] - at com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:770) ~[jackson-databind-2.17.2.jar!/:2.17.2] - at com.fasterxml.jackson.databind.ser.BeanSerializer.serialize(BeanSerializer.java:183) ~[jackson-databind-2.17.2.jar!/:2.17.2] - at com.fasterxml.jackson.databind.ser.DefaultSerializerProvider._serialize(DefaultSerializerProvider.java:502) ~[jackson-databind-2.17.2.jar!/:2.17.2] - at com.fasterxml.jackson.databind.ser.DefaultSerializerProvider.serializeValue(DefaultSerializerProvider.java:341) ~[jackson-databind-2.17.2.jar!/:2.17.2] - at com.fasterxml.jackson.databind.ObjectWriter$Prefetch.serialize(ObjectWriter.java:1574) ~[jackson-databind-2.17.2.jar!/:2.17.2] - at com.fasterxml.jackson.databind.ObjectWriter.writeValue(ObjectWriter.java:1061) ~[jackson-databind-2.17.2.jar!/:2.17.2] - at org.springframework.http.converter.json.AbstractJackson2HttpMessageConverter.writeInternal(AbstractJackson2HttpMessageConverter.java:483) ~[spring-web-6.1.14.jar!/:6.1.14] - at org.springframework.http.converter.AbstractGenericHttpMessageConverter.write(AbstractGenericHttpMessageConverter.java:114) ~[spring-web-6.1.14.jar!/:6.1.14] - at org.springframework.web.servlet.mvc.method.annotation.AbstractMessageConverterMethodProcessor.writeWithMessageConverters(AbstractMessageConverterMethodProcessor.java:297) ~[spring-webmvc-6.1.14.jar!/:6.1.14] - at org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor.handleReturnValue(RequestResponseBodyMethodProcessor.java:192) ~[spring-webmvc-6.1.14.jar!/:6.1.14] - at org.springframework.web.method.support.HandlerMethodReturnValueHandlerComposite.handleReturnValue(HandlerMethodReturnValueHandlerComposite.java:78) ~[spring-web-6.1.14.jar!/:6.1.14] - at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:136) ~[spring-webmvc-6.1.14.jar!/:6.1.14] - at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:926) ~[spring-webmvc-6.1.14.jar!/:6.1.14] - at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:831) ~[spring-webmvc-6.1.14.jar!/:6.1.14] - at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87) ~[spring-webmvc-6.1.14.jar!/:6.1.14] - at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1089) ~[spring-webmvc-6.1.14.jar!/:6.1.14] - at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:979) ~[spring-webmvc-6.1.14.jar!/:6.1.14] - at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1014) ~[spring-webmvc-6.1.14.jar!/:6.1.14] - at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:903) ~[spring-webmvc-6.1.14.jar!/:6.1.14] - at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:564) ~[tomcat-embed-core-10.1.31.jar!/:na] - at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:885) ~[spring-webmvc-6.1.14.jar!/:6.1.14] - at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:658) ~[tomcat-embed-core-10.1.31.jar!/:na] - at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:195) ~[tomcat-embed-core-10.1.31.jar!/:na] - at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) ~[tomcat-embed-core-10.1.31.jar!/:na] - at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51) ~[tomcat-embed-websocket-10.1.31.jar!/:na] - at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164) ~[tomcat-embed-core-10.1.31.jar!/:na] - at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) ~[tomcat-embed-core-10.1.31.jar!/:na] - at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:110) ~[spring-web-6.1.14.jar!/:6.1.14] - at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164) ~[tomcat-embed-core-10.1.31.jar!/:na] - at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) ~[tomcat-embed-core-10.1.31.jar!/:na] - at org.springframework.web.filter.CompositeFilter$VirtualFilterChain.doFilter(CompositeFilter.java:108) ~[spring-web-6.1.14.jar!/:6.1.14] - at org.springframework.security.web.FilterChainProxy.lambda$doFilterInternal$3(FilterChainProxy.java:231) ~[spring-security-web-6.3.4.jar!/:6.3.4] - at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:365) ~[spring-security-web-6.3.4.jar!/:6.3.4] - at org.springframework.security.web.access.intercept.AuthorizationFilter.doFilter(AuthorizationFilter.java:100) ~[spring-security-web-6.3.4.jar!/:6.3.4] - at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:374) ~[spring-security-web-6.3.4.jar!/:6.3.4] - at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:126) ~[spring-security-web-6.3.4.jar!/:6.3.4] - at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:120) ~[spring-security-web-6.3.4.jar!/:6.3.4] - at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:374) ~[spring-security-web-6.3.4.jar!/:6.3.4] - at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:131) ~[spring-security-web-6.3.4.jar!/:6.3.4] - at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:85) ~[spring-security-web-6.3.4.jar!/:6.3.4] - at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:374) ~[spring-security-web-6.3.4.jar!/:6.3.4] - at org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:100) ~[spring-security-web-6.3.4.jar!/:6.3.4] - at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:374) ~[spring-security-web-6.3.4.jar!/:6.3.4] - at org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:179) ~[spring-security-web-6.3.4.jar!/:6.3.4] - at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:374) ~[spring-security-web-6.3.4.jar!/:6.3.4] - at org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:63) ~[spring-security-web-6.3.4.jar!/:6.3.4] - at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:374) ~[spring-security-web-6.3.4.jar!/:6.3.4] - at com.crm.auth.security.JwtAuthenticationFilter.doFilterInternal(JwtAuthenticationFilter.java:60) ~[crm-auth-1.0.0-SNAPSHOT.jar!/:1.0.0-SNAPSHOT] - at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) ~[spring-web-6.1.14.jar!/:6.1.14] - at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:374) ~[spring-security-web-6.3.4.jar!/:6.3.4] - at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:107) ~[spring-security-web-6.3.4.jar!/:6.3.4] - at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:93) ~[spring-security-web-6.3.4.jar!/:6.3.4] - at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:374) ~[spring-security-web-6.3.4.jar!/:6.3.4] - at org.springframework.security.web.header.HeaderWriterFilter.doHeadersAfter(HeaderWriterFilter.java:90) ~[spring-security-web-6.3.4.jar!/:6.3.4] - at org.springframework.security.web.header.HeaderWriterFilter.doFilterInternal(HeaderWriterFilter.java:75) ~[spring-security-web-6.3.4.jar!/:6.3.4] - at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) ~[spring-web-6.1.14.jar!/:6.1.14] - at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:374) ~[spring-security-web-6.3.4.jar!/:6.3.4] - at org.springframework.security.web.context.SecurityContextHolderFilter.doFilter(SecurityContextHolderFilter.java:82) ~[spring-security-web-6.3.4.jar!/:6.3.4] - at org.springframework.security.web.context.SecurityContextHolderFilter.doFilter(SecurityContextHolderFilter.java:69) ~[spring-security-web-6.3.4.jar!/:6.3.4] - at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:374) ~[spring-security-web-6.3.4.jar!/:6.3.4] - at org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter.doFilterInternal(WebAsyncManagerIntegrationFilter.java:62) ~[spring-security-web-6.3.4.jar!/:6.3.4] - at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) ~[spring-web-6.1.14.jar!/:6.1.14] - at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:374) ~[spring-security-web-6.3.4.jar!/:6.3.4] - at org.springframework.security.web.session.DisableEncodeUrlFilter.doFilterInternal(DisableEncodeUrlFilter.java:42) ~[spring-security-web-6.3.4.jar!/:6.3.4] - at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) ~[spring-web-6.1.14.jar!/:6.1.14] - at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:374) ~[spring-security-web-6.3.4.jar!/:6.3.4] - at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:233) ~[spring-security-web-6.3.4.jar!/:6.3.4] - at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:191) ~[spring-security-web-6.3.4.jar!/:6.3.4] - at org.springframework.web.filter.CompositeFilter$VirtualFilterChain.doFilter(CompositeFilter.java:113) ~[spring-web-6.1.14.jar!/:6.1.14] - at org.springframework.web.servlet.handler.HandlerMappingIntrospector.lambda$createCacheFilter$3(HandlerMappingIntrospector.java:195) ~[spring-webmvc-6.1.14.jar!/:6.1.14] - at org.springframework.web.filter.CompositeFilter$VirtualFilterChain.doFilter(CompositeFilter.java:113) ~[spring-web-6.1.14.jar!/:6.1.14] - at org.springframework.web.filter.CompositeFilter.doFilter(CompositeFilter.java:74) ~[spring-web-6.1.14.jar!/:6.1.14] - at org.springframework.security.config.annotation.web.configuration.WebMvcSecurityConfiguration$CompositeFilterChainProxy.doFilter(WebMvcSecurityConfiguration.java:230) ~[spring-security-config-6.3.4.jar!/:6.3.4] - at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:362) ~[spring-web-6.1.14.jar!/:6.1.14] - at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:278) ~[spring-web-6.1.14.jar!/:6.1.14] - at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164) ~[tomcat-embed-core-10.1.31.jar!/:na] - at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) ~[tomcat-embed-core-10.1.31.jar!/:na] - at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) ~[spring-web-6.1.14.jar!/:6.1.14] - at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) ~[spring-web-6.1.14.jar!/:6.1.14] - at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164) ~[tomcat-embed-core-10.1.31.jar!/:na] - at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) ~[tomcat-embed-core-10.1.31.jar!/:na] - at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) ~[spring-web-6.1.14.jar!/:6.1.14] - at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) ~[spring-web-6.1.14.jar!/:6.1.14] - at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164) ~[tomcat-embed-core-10.1.31.jar!/:na] - at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) ~[tomcat-embed-core-10.1.31.jar!/:na] - at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) ~[spring-web-6.1.14.jar!/:6.1.14] - at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) ~[spring-web-6.1.14.jar!/:6.1.14] - at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164) ~[tomcat-embed-core-10.1.31.jar!/:na] - at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) ~[tomcat-embed-core-10.1.31.jar!/:na] - at com.crm.base.filter.TraceIdFilter.doFilterInternal(TraceIdFilter.java:39) ~[crm-base-1.0.0-SNAPSHOT.jar!/:1.0.0-SNAPSHOT] - at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) ~[spring-web-6.1.14.jar!/:6.1.14] - at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164) ~[tomcat-embed-core-10.1.31.jar!/:na] - at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) ~[tomcat-embed-core-10.1.31.jar!/:na] - at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:167) ~[tomcat-embed-core-10.1.31.jar!/:na] - at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:90) ~[tomcat-embed-core-10.1.31.jar!/:na] - at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:483) ~[tomcat-embed-core-10.1.31.jar!/:na] - at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:115) ~[tomcat-embed-core-10.1.31.jar!/:na] - at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:93) ~[tomcat-embed-core-10.1.31.jar!/:na] - at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74) ~[tomcat-embed-core-10.1.31.jar!/:na] - at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:344) ~[tomcat-embed-core-10.1.31.jar!/:na] - at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:384) ~[tomcat-embed-core-10.1.31.jar!/:na] - at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:63) ~[tomcat-embed-core-10.1.31.jar!/:na] - at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:905) ~[tomcat-embed-core-10.1.31.jar!/:na] - at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1741) ~[tomcat-embed-core-10.1.31.jar!/:na] - at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52) ~[tomcat-embed-core-10.1.31.jar!/:na] - at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1190) ~[tomcat-embed-core-10.1.31.jar!/:na] - at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659) ~[tomcat-embed-core-10.1.31.jar!/:na] - at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:63) ~[tomcat-embed-core-10.1.31.jar!/:na] - at java.base/java.lang.Thread.run(Thread.java:840) ~[na:na] - Suppressed: org.springframework.web.context.request.async.AsyncRequestNotUsableException: Response not usable after response errors. - at org.springframework.web.context.request.async.StandardServletAsyncWebRequest$LifecycleHttpServletResponse.obtainLockOrRaiseException(StandardServletAsyncWebRequest.java:335) ~[spring-web-6.1.14.jar!/:6.1.14] - at org.springframework.web.context.request.async.StandardServletAsyncWebRequest$LifecycleServletOutputStream.write(StandardServletAsyncWebRequest.java:396) ~[spring-web-6.1.14.jar!/:6.1.14] - at org.springframework.util.StreamUtils$NonClosingOutputStream.write(StreamUtils.java:261) ~[spring-core-6.1.14.jar!/:6.1.14] - at com.fasterxml.jackson.core.json.UTF8JsonGenerator._flushBuffer(UTF8JsonGenerator.java:2210) ~[jackson-core-2.17.2.jar!/:2.17.2] - at com.fasterxml.jackson.core.json.UTF8JsonGenerator.close(UTF8JsonGenerator.java:1234) ~[jackson-core-2.17.2.jar!/:2.17.2] - at org.springframework.http.converter.json.AbstractJackson2HttpMessageConverter.writeInternal(AbstractJackson2HttpMessageConverter.java:452) ~[spring-web-6.1.14.jar!/:6.1.14] - ... 102 common frames omitted -Caused by: org.apache.catalina.connector.ClientAbortException: java.io.IOException: еֹһѽӡ - at org.apache.catalina.connector.OutputBuffer.realWriteBytes(OutputBuffer.java:341) ~[tomcat-embed-core-10.1.31.jar!/:na] - at org.apache.catalina.connector.OutputBuffer.flushByteBuffer(OutputBuffer.java:776) ~[tomcat-embed-core-10.1.31.jar!/:na] - at org.apache.catalina.connector.OutputBuffer.append(OutputBuffer.java:673) ~[tomcat-embed-core-10.1.31.jar!/:na] - at org.apache.catalina.connector.OutputBuffer.writeBytes(OutputBuffer.java:376) ~[tomcat-embed-core-10.1.31.jar!/:na] - at org.apache.catalina.connector.OutputBuffer.write(OutputBuffer.java:354) ~[tomcat-embed-core-10.1.31.jar!/:na] - at org.apache.catalina.connector.CoyoteOutputStream.write(CoyoteOutputStream.java:103) ~[tomcat-embed-core-10.1.31.jar!/:na] - at org.springframework.security.web.util.OnCommittedResponseWrapper$SaveContextServletOutputStream.write(OnCommittedResponseWrapper.java:639) ~[spring-security-web-6.3.4.jar!/:6.3.4] - at org.springframework.web.context.request.async.StandardServletAsyncWebRequest$LifecycleServletOutputStream.write(StandardServletAsyncWebRequest.java:398) ~[spring-web-6.1.14.jar!/:6.1.14] - ... 122 common frames omitted -Caused by: java.io.IOException: еֹһѽӡ - at java.base/sun.nio.ch.SocketDispatcher.write0(Native Method) ~[na:na] - at java.base/sun.nio.ch.SocketDispatcher.write(SocketDispatcher.java:54) ~[na:na] - at java.base/sun.nio.ch.IOUtil.writeFromNativeBuffer(IOUtil.java:132) ~[na:na] - at java.base/sun.nio.ch.IOUtil.write(IOUtil.java:97) ~[na:na] - at java.base/sun.nio.ch.IOUtil.write(IOUtil.java:53) ~[na:na] - at java.base/sun.nio.ch.SocketChannelImpl.write(SocketChannelImpl.java:532) ~[na:na] - at org.apache.tomcat.util.net.NioChannel.write(NioChannel.java:122) ~[tomcat-embed-core-10.1.31.jar!/:na] - at org.apache.tomcat.util.net.NioEndpoint$NioSocketWrapper.doWrite(NioEndpoint.java:1378) ~[tomcat-embed-core-10.1.31.jar!/:na] - at org.apache.tomcat.util.net.SocketWrapperBase.doWrite(SocketWrapperBase.java:764) ~[tomcat-embed-core-10.1.31.jar!/:na] - at org.apache.tomcat.util.net.SocketWrapperBase.writeBlocking(SocketWrapperBase.java:589) ~[tomcat-embed-core-10.1.31.jar!/:na] - at org.apache.tomcat.util.net.SocketWrapperBase.write(SocketWrapperBase.java:533) ~[tomcat-embed-core-10.1.31.jar!/:na] - at org.apache.coyote.http11.Http11OutputBuffer$SocketOutputBuffer.doWrite(Http11OutputBuffer.java:548) ~[tomcat-embed-core-10.1.31.jar!/:na] - at org.apache.coyote.http11.filters.ChunkedOutputFilter.doWrite(ChunkedOutputFilter.java:111) ~[tomcat-embed-core-10.1.31.jar!/:na] - at org.apache.coyote.http11.Http11OutputBuffer.doWrite(Http11OutputBuffer.java:193) ~[tomcat-embed-core-10.1.31.jar!/:na] - at org.apache.coyote.Response.doWrite(Response.java:633) ~[tomcat-embed-core-10.1.31.jar!/:na] - at org.apache.catalina.connector.OutputBuffer.realWriteBytes(OutputBuffer.java:329) ~[tomcat-embed-core-10.1.31.jar!/:na] - ... 129 common frames omitted - -2026-09-04T00:06:00.008+08:00 INFO 24328 --- [crm-app] [scheduling-1] c.crm.customer.job.CustomerReminderJob : [ͻJob] ʼnow=2026-09-04T00:06:00.008201700 -2026-09-04T00:06:00.097+08:00 INFO 24328 --- [crm-app] [scheduling-1] c.crm.customer.job.CustomerReminderJob : [ͻJob] ɣ 1 êʧЧ 0 -2026-09-04T00:06:30.005+08:00 INFO 24328 --- [crm-app] [scheduling-1] c.crm.customer.job.CustomerReminderJob : [ͻJob] ʼnow=2026-09-04T00:06:30.005825800 -2026-09-04T00:06:30.084+08:00 INFO 24328 --- [crm-app] [scheduling-1] c.crm.customer.job.CustomerReminderJob : [ͻJob] ɣ 1 êʧЧ 0 -2026-09-04T00:07:00.000+08:00 INFO 24328 --- [crm-app] [scheduling-1] c.crm.customer.job.CustomerReminderJob : [ͻJob] ʼnow=2026-09-04T00:07:00.000813 -2026-09-04T00:07:00.083+08:00 INFO 24328 --- [crm-app] [scheduling-1] c.crm.customer.job.CustomerReminderJob : [ͻJob] ɣ 1 êʧЧ 0 -2026-09-04T00:07:30.004+08:00 INFO 24328 --- [crm-app] [scheduling-1] c.crm.customer.job.CustomerReminderJob : [ͻJob] ʼnow=2026-09-04T00:07:30.004754 -2026-09-04T00:07:30.085+08:00 INFO 24328 --- [crm-app] [scheduling-1] c.crm.customer.job.CustomerReminderJob : [ͻJob] ɣ 1 êʧЧ 0 -2026-09-04T00:08:00.003+08:00 INFO 24328 --- [crm-app] [scheduling-1] c.crm.customer.job.CustomerReminderJob : [ͻJob] ʼnow=2026-09-04T00:08:00.003691400 -2026-09-04T00:08:00.084+08:00 INFO 24328 --- [crm-app] [scheduling-1] c.crm.customer.job.CustomerReminderJob : [ͻJob] ɣ 1 êʧЧ 0 -2026-09-04T00:08:30.002+08:00 INFO 24328 --- [crm-app] [scheduling-1] c.crm.customer.job.CustomerReminderJob : [ͻJob] ʼnow=2026-09-04T00:08:30.002628800 -2026-09-04T00:08:30.085+08:00 INFO 24328 --- [crm-app] [scheduling-1] c.crm.customer.job.CustomerReminderJob : [ͻJob] ɣ 1 êʧЧ 0 -2026-09-04T00:09:00.003+08:00 INFO 24328 --- [crm-app] [scheduling-1] c.crm.customer.job.CustomerReminderJob : [ͻJob] ʼnow=2026-09-04T00:09:00.003247700 -2026-09-04T00:09:00.087+08:00 INFO 24328 --- [crm-app] [scheduling-1] c.crm.customer.job.CustomerReminderJob : [ͻJob] ɣ 1 êʧЧ 0 -2026-09-04T00:09:30.014+08:00 INFO 24328 --- [crm-app] [scheduling-1] c.crm.customer.job.CustomerReminderJob : [ͻJob] ʼnow=2026-09-04T00:09:30.014408900 -2026-09-04T00:09:30.094+08:00 INFO 24328 --- [crm-app] [scheduling-1] c.crm.customer.job.CustomerReminderJob : [ͻJob] ɣ 1 êʧЧ 0 -2026-09-04T00:10:00.014+08:00 INFO 24328 --- [crm-app] [scheduling-1] c.crm.customer.job.CustomerReminderJob : [ͻJob] ʼnow=2026-09-04T00:10:00.014952200 -2026-09-04T00:10:00.096+08:00 INFO 24328 --- [crm-app] [scheduling-1] c.crm.customer.job.CustomerReminderJob : [ͻJob] ɣ 1 êʧЧ 0 -2026-09-04T00:10:21.635+08:00 WARN 24328 --- [crm-app] [http-nio-8080-exec-3] c.c.a.controller.DebugTokenController : [verify] Ϊ userId=739564171091247104 ǩ token -2026-09-04T00:10:21.663+08:00 WARN 24328 --- [crm-app] [http-nio-8080-exec-5] c.c.a.controller.DebugTokenController : [verify] Ϊ userId=744842318024015872 ǩ token -2026-09-04T00:10:24.651+08:00 WARN 24328 --- [crm-app] [http-nio-8080-exec-2] c.c.b.a.GlobalExceptionHandlerAdvice : ҵ쳣code=67011, msg=ԭ -2026-09-04T00:10:24.794+08:00 WARN 24328 --- [crm-app] [http-nio-8080-exec-9] c.c.b.a.GlobalExceptionHandlerAdvice : ҵ쳣code=67011, msg=ܼ಻ڿɽӷΧ -2026-09-04T00:10:25.562+08:00 WARN 24328 --- [crm-app] [http-nio-8080-exec-4] c.c.b.a.GlobalExceptionHandlerAdvice : ҵ쳣code=67010, msg=δɵĽӵظ -2026-09-04T00:10:30.000+08:00 INFO 24328 --- [crm-app] [scheduling-1] c.crm.customer.job.CustomerReminderJob : [ͻJob] ʼnow=2026-09-04T00:10:30.000808200 -2026-09-04T00:10:30.074+08:00 INFO 24328 --- [crm-app] [scheduling-1] c.crm.customer.job.CustomerReminderJob : [ͻJob] ɣ 1 êʧЧ 0 -2026-09-04T00:11:00.012+08:00 INFO 24328 --- [crm-app] [scheduling-1] c.crm.customer.job.CustomerReminderJob : [ͻJob] ʼnow=2026-09-04T00:11:00.012406300 -2026-09-04T00:11:00.032+08:00 WARN 24328 --- [crm-app] [scheduling-1] com.zaxxer.hikari.pool.PoolBase : HikariPool-1 - Failed to validate connection com.mysql.cj.jdbc.ConnectionImpl@1424c5ea (No operations allowed after connection closed.). Possibly consider using a shorter maxLifetime value. -2026-09-04T00:11:00.041+08:00 WARN 24328 --- [crm-app] [scheduling-1] com.zaxxer.hikari.pool.PoolBase : HikariPool-1 - Failed to validate connection com.mysql.cj.jdbc.ConnectionImpl@1a720a2a (No operations allowed after connection closed.). Possibly consider using a shorter maxLifetime value. -2026-09-04T00:11:00.053+08:00 WARN 24328 --- [crm-app] [scheduling-1] com.zaxxer.hikari.pool.PoolBase : HikariPool-1 - Failed to validate connection com.mysql.cj.jdbc.ConnectionImpl@28cb971b (No operations allowed after connection closed.). Possibly consider using a shorter maxLifetime value. -2026-09-04T00:11:00.072+08:00 WARN 24328 --- [crm-app] [scheduling-1] com.zaxxer.hikari.pool.PoolBase : HikariPool-1 - Failed to validate connection com.mysql.cj.jdbc.ConnectionImpl@5c978a40 (No operations allowed after connection closed.). Possibly consider using a shorter maxLifetime value. -2026-09-04T00:11:00.082+08:00 WARN 24328 --- [crm-app] [scheduling-1] com.zaxxer.hikari.pool.PoolBase : HikariPool-1 - Failed to validate connection com.mysql.cj.jdbc.ConnectionImpl@446c5ab4 (No operations allowed after connection closed.). Possibly consider using a shorter maxLifetime value. -2026-09-04T00:11:00.094+08:00 WARN 24328 --- [crm-app] [scheduling-1] com.zaxxer.hikari.pool.PoolBase : HikariPool-1 - Failed to validate connection com.mysql.cj.jdbc.ConnectionImpl@4ec53b49 (No operations allowed after connection closed.). Possibly consider using a shorter maxLifetime value. -2026-09-04T00:11:00.106+08:00 WARN 24328 --- [crm-app] [scheduling-1] com.zaxxer.hikari.pool.PoolBase : HikariPool-1 - Failed to validate connection com.mysql.cj.jdbc.ConnectionImpl@3a420ec5 (No operations allowed after connection closed.). Possibly consider using a shorter maxLifetime value. -2026-09-04T00:11:00.115+08:00 WARN 24328 --- [crm-app] [scheduling-1] com.zaxxer.hikari.pool.PoolBase : HikariPool-1 - Failed to validate connection com.mysql.cj.jdbc.ConnectionImpl@5ae75647 (No operations allowed after connection closed.). Possibly consider using a shorter maxLifetime value. -2026-09-04T00:11:00.193+08:00 INFO 24328 --- [crm-app] [scheduling-1] c.crm.customer.job.CustomerReminderJob : [ͻJob] ɣ 1 êʧЧ 0 -2026-09-04T00:11:30.004+08:00 INFO 24328 --- [crm-app] [scheduling-1] c.crm.customer.job.CustomerReminderJob : [ͻJob] ʼnow=2026-09-04T00:11:30.004591800 -2026-09-04T00:11:30.052+08:00 INFO 24328 --- [crm-app] [scheduling-1] c.crm.customer.job.CustomerReminderJob : [ͻJob] ɣ 0 êʧЧ 0 -2026-09-04T00:11:31.142+08:00 WARN 24328 --- [crm-app] [http-nio-8080-exec-9] c.c.b.a.GlobalExceptionHandlerAdvice : ҵ쳣code=67012, msg=󲻴ڡͣûְ -2026-09-04T00:11:34.547+08:00 WARN 24328 --- [crm-app] [http-nio-8080-exec-1] c.c.b.a.GlobalExceptionHandlerAdvice : ҵ쳣code=67013, msg=뷽ʽǷ//£ -2026-09-04T00:11:34.860+08:00 WARN 24328 --- [crm-app] [http-nio-8080-exec-2] c.c.b.a.GlobalExceptionHandlerAdvice : ҵ쳣code=67013, msg=ģ汾ƥ䣬µģ壨 2 бͷ -2026-09-04T00:11:35.035+08:00 WARN 24328 --- [crm-app] [http-nio-8080-exec-9] c.c.b.a.GlobalExceptionHandlerAdvice : ҵ쳣code=67013, msg=ļ -2026-09-04T00:11:35.439+08:00 ERROR 24328 --- [crm-app] [task-1] c.crm.file.task.ThumbnailGenerationTask : ͼʧܣfileId=750870573822771200, thumbKey=thumbnails/750870573822771200.jpg - -java.io.IOException: Cannot run program "soffice": CreateProcess error=2, ϵͳҲָļ - at java.base/java.lang.ProcessBuilder.start(ProcessBuilder.java:1143) ~[na:na] - at java.base/java.lang.ProcessBuilder.start(ProcessBuilder.java:1073) ~[na:na] - at com.crm.file.service.impl.OfficeThumbnailRenderer.runConversion(OfficeThumbnailRenderer.java:110) ~[crm-file-1.0.0-SNAPSHOT.jar!/:1.0.0-SNAPSHOT] - at com.crm.file.service.impl.OfficeThumbnailRenderer.render(OfficeThumbnailRenderer.java:70) ~[crm-file-1.0.0-SNAPSHOT.jar!/:1.0.0-SNAPSHOT] - at com.crm.file.task.ThumbnailGenerationTask.generateSync(ThumbnailGenerationTask.java:140) ~[crm-file-1.0.0-SNAPSHOT.jar!/:1.0.0-SNAPSHOT] - at com.crm.file.task.ThumbnailGenerationTask.generateWithLock(ThumbnailGenerationTask.java:102) ~[crm-file-1.0.0-SNAPSHOT.jar!/:1.0.0-SNAPSHOT] - at com.crm.file.task.ThumbnailGenerationTask.generate(ThumbnailGenerationTask.java:70) ~[crm-file-1.0.0-SNAPSHOT.jar!/:1.0.0-SNAPSHOT] - at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na] - at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) ~[na:na] - at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na] - at java.base/java.lang.reflect.Method.invoke(Method.java:569) ~[na:na] - at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:355) ~[spring-aop-6.1.14.jar!/:6.1.14] - at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:196) ~[spring-aop-6.1.14.jar!/:6.1.14] - at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) ~[spring-aop-6.1.14.jar!/:6.1.14] - at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:768) ~[spring-aop-6.1.14.jar!/:6.1.14] - at org.springframework.aop.interceptor.AsyncExecutionInterceptor.lambda$invoke$0(AsyncExecutionInterceptor.java:113) ~[spring-aop-6.1.14.jar!/:6.1.14] - at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264) ~[na:na] - at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136) ~[na:na] - at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635) ~[na:na] - at java.base/java.lang.Thread.run(Thread.java:840) ~[na:na] -Caused by: java.io.IOException: CreateProcess error=2, ϵͳҲָļ - at java.base/java.lang.ProcessImpl.create(Native Method) ~[na:na] - at java.base/java.lang.ProcessImpl.(ProcessImpl.java:499) ~[na:na] - at java.base/java.lang.ProcessImpl.start(ProcessImpl.java:158) ~[na:na] - at java.base/java.lang.ProcessBuilder.start(ProcessBuilder.java:1110) ~[na:na] - ... 19 common frames omitted - -2026-09-04T00:11:35.684+08:00 ERROR 24328 --- [crm-app] [task-2] c.crm.file.task.ThumbnailGenerationTask : ͼʧܣfileId=750870575089451008, thumbKey=thumbnails/750870575089451008.jpg - -java.io.IOException: Cannot run program "soffice": CreateProcess error=2, ϵͳҲָļ - at java.base/java.lang.ProcessBuilder.start(ProcessBuilder.java:1143) ~[na:na] - at java.base/java.lang.ProcessBuilder.start(ProcessBuilder.java:1073) ~[na:na] - at com.crm.file.service.impl.OfficeThumbnailRenderer.runConversion(OfficeThumbnailRenderer.java:110) ~[crm-file-1.0.0-SNAPSHOT.jar!/:1.0.0-SNAPSHOT] - at com.crm.file.service.impl.OfficeThumbnailRenderer.render(OfficeThumbnailRenderer.java:70) ~[crm-file-1.0.0-SNAPSHOT.jar!/:1.0.0-SNAPSHOT] - at com.crm.file.task.ThumbnailGenerationTask.generateSync(ThumbnailGenerationTask.java:140) ~[crm-file-1.0.0-SNAPSHOT.jar!/:1.0.0-SNAPSHOT] - at com.crm.file.task.ThumbnailGenerationTask.generateWithLock(ThumbnailGenerationTask.java:102) ~[crm-file-1.0.0-SNAPSHOT.jar!/:1.0.0-SNAPSHOT] - at com.crm.file.task.ThumbnailGenerationTask.generate(ThumbnailGenerationTask.java:70) ~[crm-file-1.0.0-SNAPSHOT.jar!/:1.0.0-SNAPSHOT] - at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na] - at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) ~[na:na] - at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na] - at java.base/java.lang.reflect.Method.invoke(Method.java:569) ~[na:na] - at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:355) ~[spring-aop-6.1.14.jar!/:6.1.14] - at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:196) ~[spring-aop-6.1.14.jar!/:6.1.14] - at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) ~[spring-aop-6.1.14.jar!/:6.1.14] - at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:768) ~[spring-aop-6.1.14.jar!/:6.1.14] - at org.springframework.aop.interceptor.AsyncExecutionInterceptor.lambda$invoke$0(AsyncExecutionInterceptor.java:113) ~[spring-aop-6.1.14.jar!/:6.1.14] - at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264) ~[na:na] - at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136) ~[na:na] - at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635) ~[na:na] - at java.base/java.lang.Thread.run(Thread.java:840) ~[na:na] -Caused by: java.io.IOException: CreateProcess error=2, ϵͳҲָļ - at java.base/java.lang.ProcessImpl.create(Native Method) ~[na:na] - at java.base/java.lang.ProcessImpl.(ProcessImpl.java:499) ~[na:na] - at java.base/java.lang.ProcessImpl.start(ProcessImpl.java:158) ~[na:na] - at java.base/java.lang.ProcessBuilder.start(ProcessBuilder.java:1110) ~[na:na] - ... 19 common frames omitted - -2026-09-04T00:11:36.049+08:00 ERROR 24328 --- [crm-app] [task-3] c.crm.file.task.ThumbnailGenerationTask : ͼʧܣfileId=750870576624566272, thumbKey=thumbnails/750870576624566272.jpg - -java.io.IOException: Cannot run program "soffice": CreateProcess error=2, ϵͳҲָļ - at java.base/java.lang.ProcessBuilder.start(ProcessBuilder.java:1143) ~[na:na] - at java.base/java.lang.ProcessBuilder.start(ProcessBuilder.java:1073) ~[na:na] - at com.crm.file.service.impl.OfficeThumbnailRenderer.runConversion(OfficeThumbnailRenderer.java:110) ~[crm-file-1.0.0-SNAPSHOT.jar!/:1.0.0-SNAPSHOT] - at com.crm.file.service.impl.OfficeThumbnailRenderer.render(OfficeThumbnailRenderer.java:70) ~[crm-file-1.0.0-SNAPSHOT.jar!/:1.0.0-SNAPSHOT] - at com.crm.file.task.ThumbnailGenerationTask.generateSync(ThumbnailGenerationTask.java:140) ~[crm-file-1.0.0-SNAPSHOT.jar!/:1.0.0-SNAPSHOT] - at com.crm.file.task.ThumbnailGenerationTask.generateWithLock(ThumbnailGenerationTask.java:102) ~[crm-file-1.0.0-SNAPSHOT.jar!/:1.0.0-SNAPSHOT] - at com.crm.file.task.ThumbnailGenerationTask.generate(ThumbnailGenerationTask.java:70) ~[crm-file-1.0.0-SNAPSHOT.jar!/:1.0.0-SNAPSHOT] - at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na] - at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) ~[na:na] - at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na] - at java.base/java.lang.reflect.Method.invoke(Method.java:569) ~[na:na] - at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:355) ~[spring-aop-6.1.14.jar!/:6.1.14] - at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:196) ~[spring-aop-6.1.14.jar!/:6.1.14] - at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) ~[spring-aop-6.1.14.jar!/:6.1.14] - at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:768) ~[spring-aop-6.1.14.jar!/:6.1.14] - at org.springframework.aop.interceptor.AsyncExecutionInterceptor.lambda$invoke$0(AsyncExecutionInterceptor.java:113) ~[spring-aop-6.1.14.jar!/:6.1.14] - at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264) ~[na:na] - at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136) ~[na:na] - at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635) ~[na:na] - at java.base/java.lang.Thread.run(Thread.java:840) ~[na:na] -Caused by: java.io.IOException: CreateProcess error=2, ϵͳҲָļ - at java.base/java.lang.ProcessImpl.create(Native Method) ~[na:na] - at java.base/java.lang.ProcessImpl.(ProcessImpl.java:499) ~[na:na] - at java.base/java.lang.ProcessImpl.start(ProcessImpl.java:158) ~[na:na] - at java.base/java.lang.ProcessBuilder.start(ProcessBuilder.java:1110) ~[na:na] - ... 19 common frames omitted - -2026-09-04T00:11:36.294+08:00 WARN 24328 --- [crm-app] [http-nio-8080-exec-8] c.c.b.a.GlobalExceptionHandlerAdvice : ҵ쳣code=67014, msg=ȷϣظύ -2026-09-04T00:11:36.488+08:00 WARN 24328 --- [crm-app] [task-4] c.c.c.task.CustomerImportExecutor : ͻ뵥ִ쳣taskId=750870574112178176, row=1 - -org.springframework.dao.DataIntegrityViolationException: -### Error updating database. Cause: java.sql.SQLException: Field 'is_biz_negotiated' doesn't have a default value -### The error may exist in com/crm/customer/mapper/CustomerMapper.java (best guess) -### The error may involve com.crm.customer.mapper.CustomerMapper.insert-Inline -### The error occurred while setting parameters -### SQL: INSERT INTO customer ( id, customer_no, customer_name, customer_type, province_code, city_code, industry_code, customer_star_level, owner_user_id, owner_user_name_snapshot, owner_dept_id, owner_dept_name_snapshot, customer_stage, archive_status, last_valid_follow_time, is_child, remark, version, creator_id, create_time, updater_id, update_time, deleted ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? ) -### Cause: java.sql.SQLException: Field 'is_biz_negotiated' doesn't have a default value -; Field 'is_biz_negotiated' doesn't have a default value - at org.springframework.jdbc.support.SQLErrorCodeSQLExceptionTranslator.doTranslate(SQLErrorCodeSQLExceptionTranslator.java:258) ~[spring-jdbc-6.1.14.jar!/:6.1.14] - at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:107) ~[spring-jdbc-6.1.14.jar!/:6.1.14] - at org.mybatis.spring.MyBatisExceptionTranslator.translateExceptionIfPossible(MyBatisExceptionTranslator.java:92) ~[mybatis-spring-3.0.3.jar!/:3.0.3] - at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:439) ~[mybatis-spring-3.0.3.jar!/:3.0.3] - at jdk.proxy2/jdk.proxy2.$Proxy106.insert(Unknown Source) ~[na:na] - at org.mybatis.spring.SqlSessionTemplate.insert(SqlSessionTemplate.java:272) ~[mybatis-spring-3.0.3.jar!/:3.0.3] - at com.baomidou.mybatisplus.core.override.MybatisMapperMethod.execute(MybatisMapperMethod.java:59) ~[mybatis-plus-core-3.5.7.jar!/:3.5.7] - at com.baomidou.mybatisplus.core.override.MybatisMapperProxy$PlainMethodInvoker.invoke(MybatisMapperProxy.java:152) ~[mybatis-plus-core-3.5.7.jar!/:3.5.7] - at com.baomidou.mybatisplus.core.override.MybatisMapperProxy.invoke(MybatisMapperProxy.java:89) ~[mybatis-plus-core-3.5.7.jar!/:3.5.7] - at jdk.proxy2/jdk.proxy2.$Proxy228.insert(Unknown Source) ~[na:na] - at com.crm.customer.task.CustomerImportExecutor.createCustomer(CustomerImportExecutor.java:243) ~[crm-customer-1.0.0-SNAPSHOT.jar!/:1.0.0-SNAPSHOT] - at com.crm.customer.task.CustomerImportExecutor.doImport(CustomerImportExecutor.java:117) ~[crm-customer-1.0.0-SNAPSHOT.jar!/:1.0.0-SNAPSHOT] - at com.crm.customer.task.CustomerImportExecutor.executeImport(CustomerImportExecutor.java:74) ~[crm-customer-1.0.0-SNAPSHOT.jar!/:1.0.0-SNAPSHOT] - at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na] - at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) ~[na:na] - at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na] - at java.base/java.lang.reflect.Method.invoke(Method.java:569) ~[na:na] - at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:355) ~[spring-aop-6.1.14.jar!/:6.1.14] - at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:196) ~[spring-aop-6.1.14.jar!/:6.1.14] - at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) ~[spring-aop-6.1.14.jar!/:6.1.14] - at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:768) ~[spring-aop-6.1.14.jar!/:6.1.14] - at org.springframework.aop.interceptor.AsyncExecutionInterceptor.lambda$invoke$0(AsyncExecutionInterceptor.java:113) ~[spring-aop-6.1.14.jar!/:6.1.14] - at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264) ~[na:na] - at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136) ~[na:na] - at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635) ~[na:na] - at java.base/java.lang.Thread.run(Thread.java:840) ~[na:na] -Caused by: java.sql.SQLException: Field 'is_biz_negotiated' doesn't have a default value - at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:130) ~[mysql-connector-j-8.3.0.jar!/:8.3.0] - at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:122) ~[mysql-connector-j-8.3.0.jar!/:8.3.0] - at com.mysql.cj.jdbc.ClientPreparedStatement.executeInternal(ClientPreparedStatement.java:912) ~[mysql-connector-j-8.3.0.jar!/:8.3.0] - at com.mysql.cj.jdbc.ClientPreparedStatement.execute(ClientPreparedStatement.java:354) ~[mysql-connector-j-8.3.0.jar!/:8.3.0] - at com.zaxxer.hikari.pool.ProxyPreparedStatement.execute(ProxyPreparedStatement.java:44) ~[HikariCP-5.1.0.jar!/:na] - at com.zaxxer.hikari.pool.HikariProxyPreparedStatement.execute(HikariProxyPreparedStatement.java) ~[HikariCP-5.1.0.jar!/:na] - at org.apache.ibatis.executor.statement.PreparedStatementHandler.update(PreparedStatementHandler.java:48) ~[mybatis-3.5.16.jar!/:3.5.16] - at org.apache.ibatis.executor.statement.RoutingStatementHandler.update(RoutingStatementHandler.java:75) ~[mybatis-3.5.16.jar!/:3.5.16] - at jdk.internal.reflect.GeneratedMethodAccessor72.invoke(Unknown Source) ~[na:na] - at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na] - at java.base/java.lang.reflect.Method.invoke(Method.java:569) ~[na:na] - at org.apache.ibatis.plugin.Plugin.invoke(Plugin.java:61) ~[mybatis-3.5.16.jar!/:3.5.16] - at jdk.proxy2/jdk.proxy2.$Proxy256.update(Unknown Source) ~[na:na] - at jdk.internal.reflect.GeneratedMethodAccessor72.invoke(Unknown Source) ~[na:na] - at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na] - at java.base/java.lang.reflect.Method.invoke(Method.java:569) ~[na:na] - at org.apache.ibatis.plugin.Plugin.invoke(Plugin.java:61) ~[mybatis-3.5.16.jar!/:3.5.16] - at jdk.proxy2/jdk.proxy2.$Proxy256.update(Unknown Source) ~[na:na] - at org.apache.ibatis.executor.SimpleExecutor.doUpdate(SimpleExecutor.java:50) ~[mybatis-3.5.16.jar!/:3.5.16] - at org.apache.ibatis.executor.BaseExecutor.update(BaseExecutor.java:117) ~[mybatis-3.5.16.jar!/:3.5.16] - at org.apache.ibatis.executor.CachingExecutor.update(CachingExecutor.java:76) ~[mybatis-3.5.16.jar!/:3.5.16] - at jdk.internal.reflect.GeneratedMethodAccessor88.invoke(Unknown Source) ~[na:na] - at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na] - at java.base/java.lang.reflect.Method.invoke(Method.java:569) ~[na:na] - at org.apache.ibatis.plugin.Invocation.proceed(Invocation.java:61) ~[mybatis-3.5.16.jar!/:3.5.16] - at com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor.intercept(MybatisPlusInterceptor.java:106) ~[mybatis-plus-extension-3.5.7.jar!/:3.5.7] - at org.apache.ibatis.plugin.Plugin.invoke(Plugin.java:59) ~[mybatis-3.5.16.jar!/:3.5.16] - at jdk.proxy2/jdk.proxy2.$Proxy255.update(Unknown Source) ~[na:na] - at org.apache.ibatis.session.defaults.DefaultSqlSession.update(DefaultSqlSession.java:197) ~[mybatis-3.5.16.jar!/:3.5.16] - at org.apache.ibatis.session.defaults.DefaultSqlSession.insert(DefaultSqlSession.java:184) ~[mybatis-3.5.16.jar!/:3.5.16] - at jdk.internal.reflect.GeneratedMethodAccessor184.invoke(Unknown Source) ~[na:na] - at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na] - at java.base/java.lang.reflect.Method.invoke(Method.java:569) ~[na:na] - at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:425) ~[mybatis-spring-3.0.3.jar!/:3.0.3] - ... 22 common frames omitted - -2026-09-04T00:11:36.517+08:00 ERROR 24328 --- [crm-app] [task-4] c.c.c.task.CustomerImportExecutor : ͻִʧܣtaskId=750870574112178176 - -org.springframework.dao.DataIntegrityViolationException: -### Error updating database. Cause: com.mysql.cj.jdbc.exceptions.MysqlDataTruncation: Data truncation: Data too long for column 'fail_reason' at row 1 -### The error may exist in com/crm/customer/mapper/CustomerImportFailMapper.java (best guess) -### The error may involve com.crm.customer.mapper.CustomerImportFailMapper.insert-Inline -### The error occurred while setting parameters -### SQL: INSERT INTO customer_import_fail ( id, task_id, sheet_name, row_num, customer_identity, fail_reason, creator_id, create_time, updater_id, update_time, deleted ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? ) -### Cause: com.mysql.cj.jdbc.exceptions.MysqlDataTruncation: Data truncation: Data too long for column 'fail_reason' at row 1 -; Data truncation: Data too long for column 'fail_reason' at row 1 - at org.springframework.jdbc.support.SQLStateSQLExceptionTranslator.doTranslate(SQLStateSQLExceptionTranslator.java:118) ~[spring-jdbc-6.1.14.jar!/:6.1.14] - at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:107) ~[spring-jdbc-6.1.14.jar!/:6.1.14] - at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:116) ~[spring-jdbc-6.1.14.jar!/:6.1.14] - at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:116) ~[spring-jdbc-6.1.14.jar!/:6.1.14] - at org.mybatis.spring.MyBatisExceptionTranslator.translateExceptionIfPossible(MyBatisExceptionTranslator.java:92) ~[mybatis-spring-3.0.3.jar!/:3.0.3] - at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:439) ~[mybatis-spring-3.0.3.jar!/:3.0.3] - at jdk.proxy2/jdk.proxy2.$Proxy106.insert(Unknown Source) ~[na:na] - at org.mybatis.spring.SqlSessionTemplate.insert(SqlSessionTemplate.java:272) ~[mybatis-spring-3.0.3.jar!/:3.0.3] - at com.baomidou.mybatisplus.core.override.MybatisMapperMethod.execute(MybatisMapperMethod.java:59) ~[mybatis-plus-core-3.5.7.jar!/:3.5.7] - at com.baomidou.mybatisplus.core.override.MybatisMapperProxy$PlainMethodInvoker.invoke(MybatisMapperProxy.java:152) ~[mybatis-plus-core-3.5.7.jar!/:3.5.7] - at com.baomidou.mybatisplus.core.override.MybatisMapperProxy.invoke(MybatisMapperProxy.java:89) ~[mybatis-plus-core-3.5.7.jar!/:3.5.7] - at jdk.proxy2/jdk.proxy2.$Proxy236.insert(Unknown Source) ~[na:na] - at com.crm.customer.task.CustomerImportExecutor.insertFail(CustomerImportExecutor.java:297) ~[crm-customer-1.0.0-SNAPSHOT.jar!/:1.0.0-SNAPSHOT] - at com.crm.customer.task.CustomerImportExecutor.doImport(CustomerImportExecutor.java:147) ~[crm-customer-1.0.0-SNAPSHOT.jar!/:1.0.0-SNAPSHOT] - at com.crm.customer.task.CustomerImportExecutor.executeImport(CustomerImportExecutor.java:74) ~[crm-customer-1.0.0-SNAPSHOT.jar!/:1.0.0-SNAPSHOT] - at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na] - at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) ~[na:na] - at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na] - at java.base/java.lang.reflect.Method.invoke(Method.java:569) ~[na:na] - at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:355) ~[spring-aop-6.1.14.jar!/:6.1.14] - at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:196) ~[spring-aop-6.1.14.jar!/:6.1.14] - at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) ~[spring-aop-6.1.14.jar!/:6.1.14] - at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:768) ~[spring-aop-6.1.14.jar!/:6.1.14] - at org.springframework.aop.interceptor.AsyncExecutionInterceptor.lambda$invoke$0(AsyncExecutionInterceptor.java:113) ~[spring-aop-6.1.14.jar!/:6.1.14] - at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264) ~[na:na] - at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136) ~[na:na] - at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635) ~[na:na] - at java.base/java.lang.Thread.run(Thread.java:840) ~[na:na] -Caused by: com.mysql.cj.jdbc.exceptions.MysqlDataTruncation: Data truncation: Data too long for column 'fail_reason' at row 1 - at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:104) ~[mysql-connector-j-8.3.0.jar!/:8.3.0] - at com.mysql.cj.jdbc.ClientPreparedStatement.executeInternal(ClientPreparedStatement.java:912) ~[mysql-connector-j-8.3.0.jar!/:8.3.0] - at com.mysql.cj.jdbc.ClientPreparedStatement.execute(ClientPreparedStatement.java:354) ~[mysql-connector-j-8.3.0.jar!/:8.3.0] - at com.zaxxer.hikari.pool.ProxyPreparedStatement.execute(ProxyPreparedStatement.java:44) ~[HikariCP-5.1.0.jar!/:na] - at com.zaxxer.hikari.pool.HikariProxyPreparedStatement.execute(HikariProxyPreparedStatement.java) ~[HikariCP-5.1.0.jar!/:na] - at org.apache.ibatis.executor.statement.PreparedStatementHandler.update(PreparedStatementHandler.java:48) ~[mybatis-3.5.16.jar!/:3.5.16] - at org.apache.ibatis.executor.statement.RoutingStatementHandler.update(RoutingStatementHandler.java:75) ~[mybatis-3.5.16.jar!/:3.5.16] - at jdk.internal.reflect.GeneratedMethodAccessor72.invoke(Unknown Source) ~[na:na] - at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na] - at java.base/java.lang.reflect.Method.invoke(Method.java:569) ~[na:na] - at org.apache.ibatis.plugin.Plugin.invoke(Plugin.java:61) ~[mybatis-3.5.16.jar!/:3.5.16] - at jdk.proxy2/jdk.proxy2.$Proxy256.update(Unknown Source) ~[na:na] - at jdk.internal.reflect.GeneratedMethodAccessor72.invoke(Unknown Source) ~[na:na] - at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na] - at java.base/java.lang.reflect.Method.invoke(Method.java:569) ~[na:na] - at org.apache.ibatis.plugin.Plugin.invoke(Plugin.java:61) ~[mybatis-3.5.16.jar!/:3.5.16] - at jdk.proxy2/jdk.proxy2.$Proxy256.update(Unknown Source) ~[na:na] - at org.apache.ibatis.executor.SimpleExecutor.doUpdate(SimpleExecutor.java:50) ~[mybatis-3.5.16.jar!/:3.5.16] - at org.apache.ibatis.executor.BaseExecutor.update(BaseExecutor.java:117) ~[mybatis-3.5.16.jar!/:3.5.16] - at org.apache.ibatis.executor.CachingExecutor.update(CachingExecutor.java:76) ~[mybatis-3.5.16.jar!/:3.5.16] - at jdk.internal.reflect.GeneratedMethodAccessor88.invoke(Unknown Source) ~[na:na] - at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na] - at java.base/java.lang.reflect.Method.invoke(Method.java:569) ~[na:na] - at org.apache.ibatis.plugin.Invocation.proceed(Invocation.java:61) ~[mybatis-3.5.16.jar!/:3.5.16] - at com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor.intercept(MybatisPlusInterceptor.java:106) ~[mybatis-plus-extension-3.5.7.jar!/:3.5.7] - at org.apache.ibatis.plugin.Plugin.invoke(Plugin.java:59) ~[mybatis-3.5.16.jar!/:3.5.16] - at jdk.proxy2/jdk.proxy2.$Proxy255.update(Unknown Source) ~[na:na] - at org.apache.ibatis.session.defaults.DefaultSqlSession.update(DefaultSqlSession.java:197) ~[mybatis-3.5.16.jar!/:3.5.16] - at org.apache.ibatis.session.defaults.DefaultSqlSession.insert(DefaultSqlSession.java:184) ~[mybatis-3.5.16.jar!/:3.5.16] - at jdk.internal.reflect.GeneratedMethodAccessor184.invoke(Unknown Source) ~[na:na] - at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na] - at java.base/java.lang.reflect.Method.invoke(Method.java:569) ~[na:na] - at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:425) ~[mybatis-spring-3.0.3.jar!/:3.0.3] - ... 22 common frames omitted - -2026-09-04T00:11:38.261+08:00 INFO 24328 --- [crm-app] [http-nio-8080-exec-5] .c.r.s.i.CustomerReminderRuleServiceImpl : [ͻѹ] ȫDZ棺operator=739564171091247104, masterEnabled=1, firstTrigger=1/1, secondInterval=1/1 -2026-09-04T00:11:38.374+08:00 WARN 24328 --- [crm-app] [http-nio-8080-exec-10] c.c.b.a.GlobalExceptionHandlerAdvice : ҵ쳣code=64023, msg=״δѼΪ -2026-09-04T00:11:38.478+08:00 WARN 24328 --- [crm-app] [http-nio-8080-exec-8] c.c.b.a.GlobalExceptionHandlerAdvice : ҵ쳣code=64023, msg=״δѼΪ -2026-09-04T00:11:38.725+08:00 INFO 24328 --- [crm-app] [http-nio-8080-exec-2] .c.r.s.i.CustomerReminderRuleServiceImpl : [ͻѹ] ȫDZ棺operator=739564171091247104, masterEnabled=0, firstTrigger=0/2, secondInterval=0/2 -2026-09-04T00:11:38.873+08:00 INFO 24328 --- [crm-app] [http-nio-8080-exec-9] .c.r.s.i.CustomerReminderRuleServiceImpl : [ͻѹ] ȫDZ棺operator=739564171091247104, masterEnabled=1, firstTrigger=1/1, secondInterval=1/1 -2026-09-04T00:11:42.949+08:00 INFO 27136 --- [crm-app] [main] com.crm.app.CrmAppApplication : Starting CrmAppApplication v1.0.0-SNAPSHOT using Java 21.0.7 with PID 27136 (E:\code\crm-backend-matt\crm-app\target\crm-app-1.0.0-SNAPSHOT.jar started by Administrator in e:\code\crm-backend-matt) -2026-09-04T00:11:42.952+08:00 INFO 27136 --- [crm-app] [main] com.crm.app.CrmAppApplication : The following 1 profile is active: "verify" -2026-09-04T00:11:44.463+08:00 INFO 27136 --- [crm-app] [main] .s.d.r.c.RepositoryConfigurationDelegate : Multiple Spring Data modules found, entering strict repository configuration mode -2026-09-04T00:11:44.465+08:00 INFO 27136 --- [crm-app] [main] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data JPA repositories in DEFAULT mode. -2026-09-04T00:11:44.502+08:00 INFO 27136 --- [crm-app] [main] .s.d.r.c.RepositoryConfigurationDelegate : Finished Spring Data repository scanning in 28 ms. Found 0 JPA repository interfaces. -2026-09-04T00:11:44.523+08:00 INFO 27136 --- [crm-app] [main] .s.d.r.c.RepositoryConfigurationDelegate : Multiple Spring Data modules found, entering strict repository configuration mode -2026-09-04T00:11:44.524+08:00 INFO 27136 --- [crm-app] [main] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data Redis repositories in DEFAULT mode. -2026-09-04T00:11:44.536+08:00 INFO 27136 --- [crm-app] [main] .s.d.r.c.RepositoryConfigurationDelegate : Finished Spring Data repository scanning in 3 ms. Found 0 Redis repository interfaces. -2026-09-04T00:11:44.723+08:00 WARN 27136 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'crmBaseMapper' and 'com.crm.base.mapper.CrmBaseMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:11:44.723+08:00 WARN 27136 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'authIdentityMapper' and 'com.crm.auth.mapper.AuthIdentityMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:11:44.723+08:00 WARN 27136 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'authUserMapper' and 'com.crm.auth.mapper.AuthUserMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:11:44.723+08:00 WARN 27136 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'sysDataScopeModuleMapper' and 'com.crm.auth.mapper.SysDataScopeModuleMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:11:44.723+08:00 WARN 27136 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'sysDeptMapper' and 'com.crm.auth.mapper.SysDeptMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:11:44.723+08:00 WARN 27136 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'sysMenuMapper' and 'com.crm.auth.mapper.SysMenuMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:11:44.723+08:00 WARN 27136 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'sysRoleDataScopeMapper' and 'com.crm.auth.mapper.SysRoleDataScopeMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:11:44.723+08:00 WARN 27136 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'sysRoleMapper' and 'com.crm.auth.mapper.SysRoleMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:11:44.723+08:00 WARN 27136 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'sysRoleMenuMapper' and 'com.crm.auth.mapper.SysRoleMenuMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:11:44.723+08:00 WARN 27136 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'sysUserDeptMapper' and 'com.crm.auth.mapper.SysUserDeptMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:11:44.724+08:00 WARN 27136 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'sysUserRoleMapper' and 'com.crm.auth.mapper.SysUserRoleMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:11:44.724+08:00 WARN 27136 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'fileInfoMapper' and 'com.crm.file.mapper.FileInfoMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:11:44.724+08:00 WARN 27136 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'dictGroupDefaultMapper' and 'com.crm.dict.mapper.DictGroupDefaultMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:11:44.724+08:00 WARN 27136 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'dictGroupMapper' and 'com.crm.dict.mapper.DictGroupMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:11:44.724+08:00 WARN 27136 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'dictItemMapper' and 'com.crm.dict.mapper.DictItemMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:11:44.724+08:00 WARN 27136 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'dictRefCountMapper' and 'com.crm.dict.mapper.DictRefCountMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:11:44.724+08:00 WARN 27136 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'customerReminderRuleMapper' and 'com.crm.rule.mapper.CustomerReminderRuleMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:11:44.724+08:00 WARN 27136 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'leadPoolMapper' and 'com.crm.rule.mapper.LeadPoolMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:11:44.724+08:00 WARN 27136 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'leadPoolMemberMapper' and 'com.crm.rule.mapper.LeadPoolMemberMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:11:44.724+08:00 WARN 27136 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'leadPoolProvinceMapper' and 'com.crm.rule.mapper.LeadPoolProvinceMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:11:44.724+08:00 WARN 27136 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'leadPoolRegionMapper' and 'com.crm.rule.mapper.LeadPoolRegionMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:11:44.724+08:00 WARN 27136 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityPoolRuleDeptMapper' and 'com.crm.rule.mapper.OpportunityPoolRuleDeptMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:11:44.724+08:00 WARN 27136 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityPoolRuleMapper' and 'com.crm.rule.mapper.OpportunityPoolRuleMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:11:44.725+08:00 WARN 27136 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunitySchemeCardFieldMapper' and 'com.crm.rule.mapper.OpportunitySchemeCardFieldMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:11:44.726+08:00 WARN 27136 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunitySchemeCardTemplateDeptMapper' and 'com.crm.rule.mapper.OpportunitySchemeCardTemplateDeptMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:11:44.726+08:00 WARN 27136 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunitySchemeCardTemplateMapper' and 'com.crm.rule.mapper.OpportunitySchemeCardTemplateMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:11:44.726+08:00 WARN 27136 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunitySchemeFieldDefMapper' and 'com.crm.rule.mapper.OpportunitySchemeFieldDefMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:11:44.726+08:00 WARN 27136 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityStageNodeMapper' and 'com.crm.rule.mapper.OpportunityStageNodeMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:11:44.726+08:00 WARN 27136 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityStageTemplateDeptMapper' and 'com.crm.rule.mapper.OpportunityStageTemplateDeptMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:11:44.726+08:00 WARN 27136 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityStageTemplateMapper' and 'com.crm.rule.mapper.OpportunityStageTemplateMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:11:44.726+08:00 WARN 27136 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'sysRegionMapper' and 'com.crm.rule.mapper.SysRegionMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:11:44.726+08:00 WARN 27136 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'userColumnPreferenceMapper' and 'com.crm.preference.mapper.UserColumnPreferenceMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:11:44.726+08:00 WARN 27136 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'userSavedViewMapper' and 'com.crm.preference.mapper.UserSavedViewMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:11:44.726+08:00 WARN 27136 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'leadAttachmentMapper' and 'com.crm.lead.mapper.LeadAttachmentMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:11:44.726+08:00 WARN 27136 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'leadFeedbackMapper' and 'com.crm.lead.mapper.LeadFeedbackMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:11:44.726+08:00 WARN 27136 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'leadFollowMapper' and 'com.crm.lead.mapper.LeadFollowMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:11:44.726+08:00 WARN 27136 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'leadHistoryMapper' and 'com.crm.lead.mapper.LeadHistoryMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:11:44.726+08:00 WARN 27136 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'leadMapper' and 'com.crm.lead.mapper.LeadMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:11:44.726+08:00 WARN 27136 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityAttachmentMapper' and 'com.crm.opportunity.mapper.OpportunityAttachmentMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:11:44.726+08:00 WARN 27136 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityCustomerMapper' and 'com.crm.opportunity.mapper.OpportunityCustomerMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:11:44.727+08:00 WARN 27136 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityFocusMapper' and 'com.crm.opportunity.mapper.OpportunityFocusMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:11:44.727+08:00 WARN 27136 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityFollowMapper' and 'com.crm.opportunity.mapper.OpportunityFollowMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:11:44.727+08:00 WARN 27136 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityMapper' and 'com.crm.opportunity.mapper.OpportunityMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:11:44.727+08:00 WARN 27136 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityOplogMapper' and 'com.crm.opportunity.mapper.OpportunityOplogMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:11:44.727+08:00 WARN 27136 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityPendingNoticeMapper' and 'com.crm.opportunity.mapper.OpportunityPendingNoticeMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:11:44.727+08:00 WARN 27136 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunitySchemeCardMapper' and 'com.crm.opportunity.mapper.OpportunitySchemeCardMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:11:44.727+08:00 WARN 27136 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunitySchemeCardValueMapper' and 'com.crm.opportunity.mapper.OpportunitySchemeCardValueMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:11:44.727+08:00 WARN 27136 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunitySiteSurveyMapper' and 'com.crm.opportunity.mapper.OpportunitySiteSurveyMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:11:44.727+08:00 WARN 27136 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityStageHistoryMapper' and 'com.crm.opportunity.mapper.OpportunityStageHistoryMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:11:44.727+08:00 WARN 27136 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityStatusHistoryMapper' and 'com.crm.opportunity.mapper.OpportunityStatusHistoryMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:11:44.728+08:00 WARN 27136 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityTeamMapper' and 'com.crm.opportunity.mapper.OpportunityTeamMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:11:44.728+08:00 WARN 27136 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityViewLogMapper' and 'com.crm.opportunity.mapper.OpportunityViewLogMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:11:44.728+08:00 WARN 27136 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityWorkPlanMapper' and 'com.crm.opportunity.mapper.OpportunityWorkPlanMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:11:44.728+08:00 WARN 27136 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'customerContactMapper' and 'com.crm.customer.mapper.CustomerContactMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:11:44.728+08:00 WARN 27136 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'customerFocusMapper' and 'com.crm.customer.mapper.CustomerFocusMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:11:44.728+08:00 WARN 27136 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'customerFollowMapper' and 'com.crm.customer.mapper.CustomerFollowMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:11:44.728+08:00 WARN 27136 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'customerImportFailMapper' and 'com.crm.customer.mapper.CustomerImportFailMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:11:44.728+08:00 WARN 27136 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'customerImportTaskMapper' and 'com.crm.customer.mapper.CustomerImportTaskMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:11:44.728+08:00 WARN 27136 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'customerMapper' and 'com.crm.customer.mapper.CustomerMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:11:44.728+08:00 WARN 27136 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'customerOplogMapper' and 'com.crm.customer.mapper.CustomerOplogMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:11:44.728+08:00 WARN 27136 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'customerPendingNoticeMapper' and 'com.crm.customer.mapper.CustomerPendingNoticeMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:11:44.728+08:00 WARN 27136 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'customerTeamMemberMapper' and 'com.crm.customer.mapper.CustomerTeamMemberMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:11:44.728+08:00 WARN 27136 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'customerTransferDetailMapper' and 'com.crm.customer.mapper.CustomerTransferDetailMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:11:44.729+08:00 WARN 27136 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'customerTransferMapper' and 'com.crm.customer.mapper.CustomerTransferMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:11:44.729+08:00 WARN 27136 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'customerViewLogMapper' and 'com.crm.customer.mapper.CustomerViewLogMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:11:44.729+08:00 WARN 27136 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : No MyBatis mapper was found in '[com.crm.**.mapper]' package. Please check your configuration. -2026-09-04T00:11:44.733+08:00 WARN 27136 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'crmBaseMapper' and 'com.crm.base.mapper.CrmBaseMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:11:44.734+08:00 WARN 27136 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'authIdentityMapper' and 'com.crm.auth.mapper.AuthIdentityMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:11:44.734+08:00 WARN 27136 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'authUserMapper' and 'com.crm.auth.mapper.AuthUserMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:11:44.734+08:00 WARN 27136 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'sysDataScopeModuleMapper' and 'com.crm.auth.mapper.SysDataScopeModuleMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:11:44.734+08:00 WARN 27136 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'sysDeptMapper' and 'com.crm.auth.mapper.SysDeptMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:11:44.734+08:00 WARN 27136 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'sysMenuMapper' and 'com.crm.auth.mapper.SysMenuMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:11:44.734+08:00 WARN 27136 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'sysRoleDataScopeMapper' and 'com.crm.auth.mapper.SysRoleDataScopeMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:11:44.734+08:00 WARN 27136 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'sysRoleMapper' and 'com.crm.auth.mapper.SysRoleMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:11:44.734+08:00 WARN 27136 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'sysRoleMenuMapper' and 'com.crm.auth.mapper.SysRoleMenuMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:11:44.734+08:00 WARN 27136 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'sysUserDeptMapper' and 'com.crm.auth.mapper.SysUserDeptMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:11:44.734+08:00 WARN 27136 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'sysUserRoleMapper' and 'com.crm.auth.mapper.SysUserRoleMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:11:44.734+08:00 WARN 27136 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'fileInfoMapper' and 'com.crm.file.mapper.FileInfoMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:11:44.735+08:00 WARN 27136 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'dictGroupDefaultMapper' and 'com.crm.dict.mapper.DictGroupDefaultMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:11:44.735+08:00 WARN 27136 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'dictGroupMapper' and 'com.crm.dict.mapper.DictGroupMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:11:44.735+08:00 WARN 27136 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'dictItemMapper' and 'com.crm.dict.mapper.DictItemMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:11:44.735+08:00 WARN 27136 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'dictRefCountMapper' and 'com.crm.dict.mapper.DictRefCountMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:11:44.735+08:00 WARN 27136 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'customerReminderRuleMapper' and 'com.crm.rule.mapper.CustomerReminderRuleMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:11:44.735+08:00 WARN 27136 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'leadPoolMapper' and 'com.crm.rule.mapper.LeadPoolMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:11:44.735+08:00 WARN 27136 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'leadPoolMemberMapper' and 'com.crm.rule.mapper.LeadPoolMemberMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:11:44.735+08:00 WARN 27136 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'leadPoolProvinceMapper' and 'com.crm.rule.mapper.LeadPoolProvinceMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:11:44.735+08:00 WARN 27136 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'leadPoolRegionMapper' and 'com.crm.rule.mapper.LeadPoolRegionMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:11:44.735+08:00 WARN 27136 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityPoolRuleDeptMapper' and 'com.crm.rule.mapper.OpportunityPoolRuleDeptMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:11:44.735+08:00 WARN 27136 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityPoolRuleMapper' and 'com.crm.rule.mapper.OpportunityPoolRuleMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:11:44.735+08:00 WARN 27136 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunitySchemeCardFieldMapper' and 'com.crm.rule.mapper.OpportunitySchemeCardFieldMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:11:44.735+08:00 WARN 27136 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunitySchemeCardTemplateDeptMapper' and 'com.crm.rule.mapper.OpportunitySchemeCardTemplateDeptMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:11:44.735+08:00 WARN 27136 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunitySchemeCardTemplateMapper' and 'com.crm.rule.mapper.OpportunitySchemeCardTemplateMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:11:44.735+08:00 WARN 27136 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunitySchemeFieldDefMapper' and 'com.crm.rule.mapper.OpportunitySchemeFieldDefMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:11:44.735+08:00 WARN 27136 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityStageNodeMapper' and 'com.crm.rule.mapper.OpportunityStageNodeMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:11:44.736+08:00 WARN 27136 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityStageTemplateDeptMapper' and 'com.crm.rule.mapper.OpportunityStageTemplateDeptMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:11:44.736+08:00 WARN 27136 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityStageTemplateMapper' and 'com.crm.rule.mapper.OpportunityStageTemplateMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:11:44.736+08:00 WARN 27136 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'sysRegionMapper' and 'com.crm.rule.mapper.SysRegionMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:11:44.736+08:00 WARN 27136 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'userColumnPreferenceMapper' and 'com.crm.preference.mapper.UserColumnPreferenceMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:11:44.736+08:00 WARN 27136 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'userSavedViewMapper' and 'com.crm.preference.mapper.UserSavedViewMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:11:44.736+08:00 WARN 27136 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'leadAttachmentMapper' and 'com.crm.lead.mapper.LeadAttachmentMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:11:44.736+08:00 WARN 27136 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'leadFeedbackMapper' and 'com.crm.lead.mapper.LeadFeedbackMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:11:44.736+08:00 WARN 27136 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'leadFollowMapper' and 'com.crm.lead.mapper.LeadFollowMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:11:44.736+08:00 WARN 27136 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'leadHistoryMapper' and 'com.crm.lead.mapper.LeadHistoryMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:11:44.736+08:00 WARN 27136 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'leadMapper' and 'com.crm.lead.mapper.LeadMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:11:44.736+08:00 WARN 27136 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityAttachmentMapper' and 'com.crm.opportunity.mapper.OpportunityAttachmentMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:11:44.736+08:00 WARN 27136 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityCustomerMapper' and 'com.crm.opportunity.mapper.OpportunityCustomerMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:11:44.736+08:00 WARN 27136 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityFocusMapper' and 'com.crm.opportunity.mapper.OpportunityFocusMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:11:44.736+08:00 WARN 27136 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityFollowMapper' and 'com.crm.opportunity.mapper.OpportunityFollowMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:11:44.736+08:00 WARN 27136 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityMapper' and 'com.crm.opportunity.mapper.OpportunityMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:11:44.736+08:00 WARN 27136 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityOplogMapper' and 'com.crm.opportunity.mapper.OpportunityOplogMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:11:44.736+08:00 WARN 27136 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityPendingNoticeMapper' and 'com.crm.opportunity.mapper.OpportunityPendingNoticeMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:11:44.737+08:00 WARN 27136 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunitySchemeCardMapper' and 'com.crm.opportunity.mapper.OpportunitySchemeCardMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:11:44.737+08:00 WARN 27136 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunitySchemeCardValueMapper' and 'com.crm.opportunity.mapper.OpportunitySchemeCardValueMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:11:44.737+08:00 WARN 27136 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunitySiteSurveyMapper' and 'com.crm.opportunity.mapper.OpportunitySiteSurveyMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:11:44.737+08:00 WARN 27136 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityStageHistoryMapper' and 'com.crm.opportunity.mapper.OpportunityStageHistoryMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:11:44.737+08:00 WARN 27136 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityStatusHistoryMapper' and 'com.crm.opportunity.mapper.OpportunityStatusHistoryMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:11:44.737+08:00 WARN 27136 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityTeamMapper' and 'com.crm.opportunity.mapper.OpportunityTeamMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:11:44.737+08:00 WARN 27136 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityViewLogMapper' and 'com.crm.opportunity.mapper.OpportunityViewLogMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:11:44.737+08:00 WARN 27136 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityWorkPlanMapper' and 'com.crm.opportunity.mapper.OpportunityWorkPlanMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:11:44.737+08:00 WARN 27136 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'customerContactMapper' and 'com.crm.customer.mapper.CustomerContactMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:11:44.737+08:00 WARN 27136 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'customerFocusMapper' and 'com.crm.customer.mapper.CustomerFocusMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:11:44.737+08:00 WARN 27136 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'customerFollowMapper' and 'com.crm.customer.mapper.CustomerFollowMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:11:44.737+08:00 WARN 27136 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'customerImportFailMapper' and 'com.crm.customer.mapper.CustomerImportFailMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:11:44.737+08:00 WARN 27136 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'customerImportTaskMapper' and 'com.crm.customer.mapper.CustomerImportTaskMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:11:44.737+08:00 WARN 27136 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'customerMapper' and 'com.crm.customer.mapper.CustomerMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:11:44.738+08:00 WARN 27136 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'customerOplogMapper' and 'com.crm.customer.mapper.CustomerOplogMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:11:44.738+08:00 WARN 27136 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'customerPendingNoticeMapper' and 'com.crm.customer.mapper.CustomerPendingNoticeMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:11:44.738+08:00 WARN 27136 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'customerTeamMemberMapper' and 'com.crm.customer.mapper.CustomerTeamMemberMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:11:44.738+08:00 WARN 27136 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'customerTransferDetailMapper' and 'com.crm.customer.mapper.CustomerTransferDetailMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:11:44.738+08:00 WARN 27136 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'customerTransferMapper' and 'com.crm.customer.mapper.CustomerTransferMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:11:44.738+08:00 WARN 27136 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'customerViewLogMapper' and 'com.crm.customer.mapper.CustomerViewLogMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:11:44.738+08:00 WARN 27136 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : No MyBatis mapper was found in '[com.crm.**.mapper]' package. Please check your configuration. -2026-09-04T00:11:45.649+08:00 INFO 27136 --- [crm-app] [main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port 8080 (http) -2026-09-04T00:11:45.670+08:00 INFO 27136 --- [crm-app] [main] o.apache.catalina.core.StandardService : Starting service [Tomcat] -2026-09-04T00:11:45.671+08:00 INFO 27136 --- [crm-app] [main] o.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/10.1.31] -2026-09-04T00:11:45.716+08:00 INFO 27136 --- [crm-app] [main] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext -2026-09-04T00:11:45.716+08:00 INFO 27136 --- [crm-app] [main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 2718 ms -2026-09-04T00:11:46.261+08:00 INFO 27136 --- [crm-app] [main] com.crm.auth.config.PermissionConfig : 数据权限受控表扫描完成:0 张 -2026-09-04T00:11:46.412+08:00 INFO 27136 --- [crm-app] [main] com.crm.base.config.CustomIdGenerator : 雪花ID生成器初始化完成,workerId=0, datacenterId=0 -2026-09-04T00:11:47.041+08:00 INFO 27136 --- [crm-app] [main] o.hibernate.jpa.internal.util.LogHelper : HHH000204: Processing PersistenceUnitInfo [name: default] -2026-09-04T00:11:47.113+08:00 INFO 27136 --- [crm-app] [main] org.hibernate.Version : HHH000412: Hibernate ORM core version 6.5.3.Final -2026-09-04T00:11:47.155+08:00 INFO 27136 --- [crm-app] [main] o.h.c.internal.RegionFactoryInitiator : HHH000026: Second-level cache disabled -2026-09-04T00:11:47.526+08:00 INFO 27136 --- [crm-app] [main] o.s.o.j.p.SpringPersistenceUnitInfo : No LoadTimeWeaver setup: ignoring JPA class transformer -2026-09-04T00:11:47.568+08:00 INFO 27136 --- [crm-app] [main] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Starting... -2026-09-04T00:11:48.116+08:00 INFO 27136 --- [crm-app] [main] com.zaxxer.hikari.pool.HikariPool : HikariPool-1 - Added connection com.mysql.cj.jdbc.ConnectionImpl@2286dfcd -2026-09-04T00:11:48.118+08:00 INFO 27136 --- [crm-app] [main] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Start completed. -2026-09-04T00:11:48.206+08:00 WARN 27136 --- [crm-app] [main] org.hibernate.orm.deprecation : HHH90000025: MySQLDialect does not need to be specified explicitly using 'hibernate.dialect' (remove the property setting and it will be selected by default) -2026-09-04T00:11:50.185+08:00 INFO 27136 --- [crm-app] [main] o.h.e.t.j.p.i.JtaPlatformInitiator : HHH000489: No JTA platform available (set 'hibernate.transaction.jta.platform' to enable JTA platform integration) -2026-09-04T00:12:05.204+08:00 INFO 27136 --- [crm-app] [main] j.LocalContainerEntityManagerFactoryBean : Initialized JPA EntityManagerFactory for persistence unit 'default' -2026-09-04T00:12:05.579+08:00 WARN 27136 --- [crm-app] [main] c.c.a.controller.DebugTokenController : ============================================================ -2026-09-04T00:12:05.579+08:00 WARN 27136 --- [crm-app] [main] c.c.a.controller.DebugTokenController : 调试 token 接口 /api/auth/debug/token 已启用(verify profile) -2026-09-04T00:12:05.579+08:00 WARN 27136 --- [crm-app] [main] c.c.a.controller.DebugTokenController : 严禁用于生产环境!任何知道 userId 的人可冒充该用户。 -2026-09-04T00:12:05.579+08:00 WARN 27136 --- [crm-app] [main] c.c.a.controller.DebugTokenController : 参见 docs/adr/0014-verify-profile-debug-token-endpoint.md -2026-09-04T00:12:05.579+08:00 WARN 27136 --- [crm-app] [main] c.c.a.controller.DebugTokenController : ============================================================ -2026-09-04T00:12:07.356+08:00 INFO 27136 --- [crm-app] [main] c.c.c.p.i.NgramNameSimilarityPortImpl : CustomerNameSimilarityPort 一期实现就绪(预筛模式:FULLTEXT ngram) -2026-09-04T00:12:07.493+08:00 INFO 27136 --- [crm-app] [main] c.c.c.p.impl.StubCompanyLookupPortImpl : CompanyLookupPort 一期 stub 已装配(企查查未接入,工商候选返回空) -2026-09-04T00:12:07.711+08:00 INFO 27136 --- [crm-app] [main] c.c.c.p.i.NoopProjectOwnerSyncPortImpl : ProjectOwnerSyncPort no-op 默认实现已装配(A5 项目模块未建,owner 同步跳过) -2026-09-04T00:12:07.784+08:00 INFO 27136 --- [crm-app] [main] c.c.p.i.NoopOpportunityOwnerSyncPortImpl : OpportunityOwnerSyncPort no-op 默认实现已装配(票 11 接商机真源后替换) -2026-09-04T00:12:07.940+08:00 WARN 27136 --- [crm-app] [main] .s.s.UserDetailsServiceAutoConfiguration : - -Using generated security password: b71fd915-dd11-4063-8729-8d1c79ff246c - -This generated password is for development use only. Your security configuration must be updated before running your application in production. - -2026-09-04T00:12:07.957+08:00 INFO 27136 --- [crm-app] [main] r$InitializeUserDetailsManagerConfigurer : Global AuthenticationManager configured with UserDetailsService bean with name inMemoryUserDetailsManager -2026-09-04T00:12:08.895+08:00 INFO 27136 --- [crm-app] [main] c.c.a.c.DataScopeModuleStartupValidator : 数据权限模块校验通过:0 张受控表,4 个注册模块 -2026-09-04T00:12:08.919+08:00 INFO 27136 --- [crm-app] [main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port 8080 (http) with context path '/' -2026-09-04T00:12:08.989+08:00 INFO 27136 --- [crm-app] [main] com.crm.app.CrmAppApplication : Started CrmAppApplication in 26.392 seconds (process running for 26.904) -2026-09-04T00:12:08.994+08:00 INFO 27136 --- [crm-app] [main] com.crm.auth.config.DataInitializer : 执行权限数据初始化检查... -2026-09-04T00:12:09.299+08:00 INFO 27136 --- [crm-app] [http-nio-8080-exec-1] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring DispatcherServlet 'dispatcherServlet' -2026-09-04T00:12:09.300+08:00 INFO 27136 --- [crm-app] [http-nio-8080-exec-1] o.s.web.servlet.DispatcherServlet : Initializing Servlet 'dispatcherServlet' -2026-09-04T00:12:09.301+08:00 INFO 27136 --- [crm-app] [http-nio-8080-exec-1] o.s.web.servlet.DispatcherServlet : Completed initialization in 1 ms -2026-09-04T00:12:09.738+08:00 INFO 27136 --- [crm-app] [main] com.crm.auth.config.DataInitializer : 权限数据初始化检查完成 -2026-09-04T00:12:09.739+08:00 INFO 27136 --- [crm-app] [main] c.c.d.config.DictPermissionInitializer : 执行数据字典权限种子化检查... -2026-09-04T00:12:10.168+08:00 INFO 27136 --- [crm-app] [main] c.c.d.config.DictPermissionInitializer : 数据字典权限种子化检查完成:10 个权限点 -2026-09-04T00:12:10.169+08:00 INFO 27136 --- [crm-app] [main] c.c.r.config.RulePermissionInitializer : 执行线索规则权限种子化检查(仅菜单)... -2026-09-04T00:12:10.274+08:00 INFO 27136 --- [crm-app] [main] c.c.r.config.RulePermissionInitializer : 线索规则权限种子化检查完成:仅菜单(0 个 button) -2026-09-04T00:12:10.274+08:00 INFO 27136 --- [crm-app] [main] c.c.l.config.LeadPermissionInitializer : 执行线索管理权限种子化检查(仅菜单)... -2026-09-04T00:12:10.686+08:00 INFO 27136 --- [crm-app] [main] c.c.l.config.LeadPermissionInitializer : 线索管理权限种子化检查完成:4 个菜单(0 个 button) -2026-09-04T00:12:10.686+08:00 INFO 27136 --- [crm-app] [main] c.crm.rule.config.RegionDataInitializer : 执行行政区划全量种子导入检查... -2026-09-04T00:12:11.923+08:00 INFO 27136 --- [crm-app] [main] c.crm.rule.config.RegionDataInitializer : 行政区划种子导入完成:对账 3432 行(省 34 / 市 342 / 区 3056),存量 3432 行,新增 0 行 -2026-09-04T00:12:11.924+08:00 INFO 27136 --- [crm-app] [main] r.c.OpportunityRulePermissionInitializer : 执行商机规则权限种子化检查(仅菜单)... -2026-09-04T00:12:12.026+08:00 INFO 27136 --- [crm-app] [main] r.c.OpportunityRulePermissionInitializer : 商机规则权限种子化检查完成:仅菜单(0 个 button) -2026-09-04T00:12:12.026+08:00 INFO 27136 --- [crm-app] [main] ustomerReminderRulePermissionInitializer : 执行客户提醒规则权限种子化检查(仅菜单)... -2026-09-04T00:12:12.127+08:00 INFO 27136 --- [crm-app] [main] ustomerReminderRulePermissionInitializer : 客户提醒规则权限种子化检查完成:仅菜单(0 个 button) -2026-09-04T00:12:12.127+08:00 INFO 27136 --- [crm-app] [main] tunityStageTemplatePermissionInitializer : 执行商机阶段模板权限种子化检查(仅菜单)... -2026-09-04T00:12:12.228+08:00 INFO 27136 --- [crm-app] [main] tunityStageTemplatePermissionInitializer : 商机阶段模板权限种子化检查完成:仅菜单(0 个 button) -2026-09-04T00:12:12.228+08:00 INFO 27136 --- [crm-app] [main] c.c.r.config.SchemeFieldDefInitializer : 执行方案卡系统字段库种子化检查... -2026-09-04T00:12:12.242+08:00 INFO 27136 --- [crm-app] [main] c.c.r.config.SchemeFieldDefInitializer : 方案卡系统字段库种子化检查完成:现存 16 个,新增 0 个 -2026-09-04T00:12:12.257+08:00 INFO 27136 --- [crm-app] [main] c.c.r.config.SchemeFieldDefInitializer : 方案卡兜底模板已存在(code=OPP_SCHEME_TPL_01,含已停用),跳过种子化 -2026-09-04T00:12:12.257+08:00 INFO 27136 --- [crm-app] [main] ySchemeCardTemplatePermissionInitializer : 执行方案卡模板权限种子化检查(仅菜单)... -2026-09-04T00:12:12.359+08:00 INFO 27136 --- [crm-app] [main] ySchemeCardTemplatePermissionInitializer : 方案卡模板权限种子化检查完成:仅菜单(0 个 button) -2026-09-04T00:12:12.375+08:00 INFO 27136 --- [crm-app] [main] c.c.r.config.StageTemplateInitializer : 默认阶段模板已存在(code=OPP_STAGE_TPL_01,含已停用),跳过种子化 -2026-09-04T00:12:12.388+08:00 INFO 27136 --- [crm-app] [main] c.c.r.c.CustomerReminderRuleInitializer : 客户提醒规则单例已存在(id=1),跳过种子化 -2026-09-04T00:12:12.401+08:00 INFO 27136 --- [crm-app] [main] c.c.c.c.CustomerFulltextIndexInitializer : customer FULLTEXT 索引 idx_name_fulltext 已存在,跳过 -2026-09-04T00:12:12.401+08:00 INFO 27136 --- [crm-app] [main] c.crm.dict.config.DictDataInitializer : 执行内置字典幂等初始化检查... -2026-09-04T00:12:22.301+08:00 INFO 27136 --- [crm-app] [main] c.crm.dict.config.DictDataInitializer : 内置字典幂等初始化检查完成:24 个分组 -2026-09-04T00:12:30.018+08:00 INFO 27136 --- [crm-app] [scheduling-1] c.crm.customer.job.CustomerReminderJob : [客户提醒Job] 开始,now=2026-09-04T00:12:30.018855900 -2026-09-04T00:12:30.080+08:00 INFO 27136 --- [crm-app] [scheduling-1] c.crm.customer.job.CustomerReminderJob : [客户提醒Job] 完成:新增待发 0 条,旧锚点失效 0 条 -2026-09-04T00:13:00.014+08:00 INFO 27136 --- [crm-app] [scheduling-1] c.crm.customer.job.CustomerReminderJob : [客户提醒Job] 开始,now=2026-09-04T00:13:00.014869 -2026-09-04T00:13:00.067+08:00 INFO 27136 --- [crm-app] [scheduling-1] c.crm.customer.job.CustomerReminderJob : [客户提醒Job] 完成:新增待发 0 条,旧锚点失效 0 条 -2026-09-04T00:13:30.002+08:00 INFO 27136 --- [crm-app] [scheduling-1] c.crm.customer.job.CustomerReminderJob : [客户提醒Job] 开始,now=2026-09-04T00:13:30.002890900 -2026-09-04T00:13:30.054+08:00 INFO 27136 --- [crm-app] [scheduling-1] c.crm.customer.job.CustomerReminderJob : [客户提醒Job] 完成:新增待发 0 条,旧锚点失效 0 条 -2026-09-04T00:14:00.008+08:00 INFO 27136 --- [crm-app] [scheduling-1] c.crm.customer.job.CustomerReminderJob : [客户提醒Job] 开始,now=2026-09-04T00:14:00.008758200 -2026-09-04T00:14:00.059+08:00 INFO 27136 --- [crm-app] [scheduling-1] c.crm.customer.job.CustomerReminderJob : [客户提醒Job] 完成:新增待发 0 条,旧锚点失效 0 条 -2026-09-04T00:14:15.119+08:00 WARN 27136 --- [crm-app] [http-nio-8080-exec-1] c.c.b.a.GlobalExceptionHandlerAdvice : 业务异常:code=67001, msg=行业一级不能为空 -2026-09-04T00:14:15.411+08:00 WARN 27136 --- [crm-app] [http-nio-8080-exec-3] c.c.b.a.GlobalExceptionHandlerAdvice : 业务异常:code=67001, msg=行业一级不能为空 -2026-09-04T00:14:30.014+08:00 INFO 27136 --- [crm-app] [scheduling-1] c.crm.customer.job.CustomerReminderJob : [客户提醒Job] 开始,now=2026-09-04T00:14:30.014442400 -2026-09-04T00:14:30.066+08:00 INFO 27136 --- [crm-app] [scheduling-1] c.crm.customer.job.CustomerReminderJob : [客户提醒Job] 完成:新增待发 0 条,旧锚点失效 0 条 -2026-09-04T00:15:00.003+08:00 INFO 27136 --- [crm-app] [scheduling-1] c.crm.customer.job.CustomerReminderJob : [客户提醒Job] 开始,now=2026-09-04T00:15:00.003820 -2026-09-04T00:15:00.057+08:00 INFO 27136 --- [crm-app] [scheduling-1] c.crm.customer.job.CustomerReminderJob : [客户提醒Job] 完成:新增待发 0 条,旧锚点失效 0 条 -2026-09-04T00:15:30.010+08:00 INFO 27136 --- [crm-app] [scheduling-1] c.crm.customer.job.CustomerReminderJob : [客户提醒Job] 开始,now=2026-09-04T00:15:30.010060 -2026-09-04T00:15:30.060+08:00 INFO 27136 --- [crm-app] [scheduling-1] c.crm.customer.job.CustomerReminderJob : [客户提醒Job] 完成:新增待发 0 条,旧锚点失效 0 条 -2026-09-04T00:16:00.005+08:00 INFO 27136 --- [crm-app] [scheduling-1] c.crm.customer.job.CustomerReminderJob : [客户提醒Job] 开始,now=2026-09-04T00:16:00.005481700 -2026-09-04T00:16:00.056+08:00 INFO 27136 --- [crm-app] [scheduling-1] c.crm.customer.job.CustomerReminderJob : [客户提醒Job] 完成:新增待发 0 条,旧锚点失效 0 条 -2026-09-04T00:16:30.014+08:00 INFO 27136 --- [crm-app] [scheduling-1] c.crm.customer.job.CustomerReminderJob : [客户提醒Job] 开始,now=2026-09-04T00:16:30.014645500 -2026-09-04T00:16:30.066+08:00 INFO 27136 --- [crm-app] [scheduling-1] c.crm.customer.job.CustomerReminderJob : [客户提醒Job] 完成:新增待发 0 条,旧锚点失效 0 条 -2026-09-04T00:17:00.013+08:00 INFO 27136 --- [crm-app] [scheduling-1] c.crm.customer.job.CustomerReminderJob : [客户提醒Job] 开始,now=2026-09-04T00:17:00.013354600 -2026-09-04T00:17:00.065+08:00 INFO 27136 --- [crm-app] [scheduling-1] c.crm.customer.job.CustomerReminderJob : [客户提醒Job] 完成:新增待发 0 条,旧锚点失效 0 条 -2026-09-04T00:17:30.005+08:00 INFO 27136 --- [crm-app] [scheduling-1] c.crm.customer.job.CustomerReminderJob : [客户提醒Job] 开始,now=2026-09-04T00:17:30.005105900 -2026-09-04T00:17:30.055+08:00 INFO 27136 --- [crm-app] [scheduling-1] c.crm.customer.job.CustomerReminderJob : [客户提醒Job] 完成:新增待发 0 条,旧锚点失效 0 条 -2026-09-04T00:18:00.004+08:00 INFO 27136 --- [crm-app] [scheduling-1] c.crm.customer.job.CustomerReminderJob : [客户提醒Job] 开始,now=2026-09-04T00:18:00.004201900 -2026-09-04T00:18:00.055+08:00 INFO 27136 --- [crm-app] [scheduling-1] c.crm.customer.job.CustomerReminderJob : [客户提醒Job] 完成:新增待发 0 条,旧锚点失效 0 条 -2026-09-04T00:18:30.007+08:00 INFO 27136 --- [crm-app] [scheduling-1] c.crm.customer.job.CustomerReminderJob : [客户提醒Job] 开始,now=2026-09-04T00:18:30.007844100 -2026-09-04T00:18:30.057+08:00 INFO 27136 --- [crm-app] [scheduling-1] c.crm.customer.job.CustomerReminderJob : [客户提醒Job] 完成:新增待发 0 条,旧锚点失效 0 条 -2026-09-04T00:19:00.002+08:00 INFO 27136 --- [crm-app] [scheduling-1] c.crm.customer.job.CustomerReminderJob : [客户提醒Job] 开始,now=2026-09-04T00:19:00.002273900 -2026-09-04T00:19:00.052+08:00 INFO 27136 --- [crm-app] [scheduling-1] c.crm.customer.job.CustomerReminderJob : [客户提醒Job] 完成:新增待发 0 条,旧锚点失效 0 条 -2026-09-04T00:19:30.010+08:00 INFO 27136 --- [crm-app] [scheduling-1] c.crm.customer.job.CustomerReminderJob : [客户提醒Job] 开始,now=2026-09-04T00:19:30.010001200 -2026-09-04T00:19:30.063+08:00 INFO 27136 --- [crm-app] [scheduling-1] c.crm.customer.job.CustomerReminderJob : [客户提醒Job] 完成:新增待发 0 条,旧锚点失效 0 条 -2026-09-04T00:20:00.010+08:00 INFO 27136 --- [crm-app] [scheduling-1] c.crm.customer.job.CustomerReminderJob : [客户提醒Job] 开始,now=2026-09-04T00:20:00.010296200 -2026-09-04T00:20:00.059+08:00 INFO 27136 --- [crm-app] [scheduling-1] c.crm.customer.job.CustomerReminderJob : [客户提醒Job] 完成:新增待发 0 条,旧锚点失效 0 条 -2026-09-04T00:20:10.618+08:00 ERROR 27136 --- [crm-app] [http-nio-8080-exec-7] c.c.b.a.GlobalExceptionHandlerAdvice : 全局异常捕获: - -org.springframework.data.redis.RedisSystemException: Redis exception - at org.springframework.data.redis.connection.lettuce.LettuceExceptionConverter.convert(LettuceExceptionConverter.java:72) ~[spring-data-redis-3.3.5.jar!/:3.3.5] - at org.springframework.data.redis.connection.lettuce.LettuceExceptionConverter.convert(LettuceExceptionConverter.java:41) ~[spring-data-redis-3.3.5.jar!/:3.3.5] - at org.springframework.data.redis.PassThroughExceptionTranslationStrategy.translate(PassThroughExceptionTranslationStrategy.java:40) ~[spring-data-redis-3.3.5.jar!/:3.3.5] - at org.springframework.data.redis.FallbackExceptionTranslationStrategy.translate(FallbackExceptionTranslationStrategy.java:38) ~[spring-data-redis-3.3.5.jar!/:3.3.5] - at org.springframework.data.redis.connection.lettuce.LettuceConnection.convertLettuceAccessException(LettuceConnection.java:310) ~[spring-data-redis-3.3.5.jar!/:3.3.5] - at org.springframework.data.redis.connection.lettuce.LettuceConnection.await(LettuceConnection.java:1012) ~[spring-data-redis-3.3.5.jar!/:3.3.5] - at org.springframework.data.redis.connection.lettuce.LettuceConnection.lambda$doInvoke$3(LettuceConnection.java:447) ~[spring-data-redis-3.3.5.jar!/:3.3.5] - at org.springframework.data.redis.connection.lettuce.LettuceInvoker$Synchronizer.invoke(LettuceInvoker.java:673) ~[spring-data-redis-3.3.5.jar!/:3.3.5] - at org.springframework.data.redis.connection.lettuce.LettuceInvoker$DefaultSingleInvocationSpec.get(LettuceInvoker.java:589) ~[spring-data-redis-3.3.5.jar!/:3.3.5] - at org.springframework.data.redis.connection.lettuce.LettuceStringCommands.setEx(LettuceStringCommands.java:134) ~[spring-data-redis-3.3.5.jar!/:3.3.5] - at org.springframework.data.redis.connection.DefaultedRedisConnection.setEx(DefaultedRedisConnection.java:340) ~[spring-data-redis-3.3.5.jar!/:3.3.5] - at org.springframework.data.redis.connection.DefaultStringRedisConnection.setEx(DefaultStringRedisConnection.java:785) ~[spring-data-redis-3.3.5.jar!/:3.3.5] - at org.springframework.data.redis.core.DefaultValueOperations$8.potentiallyUsePsetEx(DefaultValueOperations.java:265) ~[spring-data-redis-3.3.5.jar!/:3.3.5] - at org.springframework.data.redis.core.DefaultValueOperations$8.doInRedis(DefaultValueOperations.java:258) ~[spring-data-redis-3.3.5.jar!/:3.3.5] - at org.springframework.data.redis.core.RedisTemplate.execute(RedisTemplate.java:411) ~[spring-data-redis-3.3.5.jar!/:3.3.5] - at org.springframework.data.redis.core.RedisTemplate.execute(RedisTemplate.java:378) ~[spring-data-redis-3.3.5.jar!/:3.3.5] - at org.springframework.data.redis.core.AbstractOperations.execute(AbstractOperations.java:97) ~[spring-data-redis-3.3.5.jar!/:3.3.5] - at org.springframework.data.redis.core.DefaultValueOperations.set(DefaultValueOperations.java:253) ~[spring-data-redis-3.3.5.jar!/:3.3.5] - at com.crm.auth.security.impl.SessionStoreImpl.openSession(SessionStoreImpl.java:38) ~[crm-auth-1.0.0-SNAPSHOT.jar!/:1.0.0-SNAPSHOT] - at com.crm.auth.controller.DebugTokenController.token(DebugTokenController.java:67) ~[crm-auth-1.0.0-SNAPSHOT.jar!/:1.0.0-SNAPSHOT] - at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103) ~[na:na] - at java.base/java.lang.reflect.Method.invoke(Method.java:580) ~[na:na] - at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:255) ~[spring-web-6.1.14.jar!/:6.1.14] - at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:188) ~[spring-web-6.1.14.jar!/:6.1.14] - at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:118) ~[spring-webmvc-6.1.14.jar!/:6.1.14] - at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:926) ~[spring-webmvc-6.1.14.jar!/:6.1.14] - at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:831) ~[spring-webmvc-6.1.14.jar!/:6.1.14] - at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87) ~[spring-webmvc-6.1.14.jar!/:6.1.14] - at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1089) ~[spring-webmvc-6.1.14.jar!/:6.1.14] - at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:979) ~[spring-webmvc-6.1.14.jar!/:6.1.14] - at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1014) ~[spring-webmvc-6.1.14.jar!/:6.1.14] - at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:903) ~[spring-webmvc-6.1.14.jar!/:6.1.14] - at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:564) ~[tomcat-embed-core-10.1.31.jar!/:na] - at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:885) ~[spring-webmvc-6.1.14.jar!/:6.1.14] - at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:658) ~[tomcat-embed-core-10.1.31.jar!/:na] - at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:195) ~[tomcat-embed-core-10.1.31.jar!/:na] - at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) ~[tomcat-embed-core-10.1.31.jar!/:na] - at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51) ~[tomcat-embed-websocket-10.1.31.jar!/:na] - at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164) ~[tomcat-embed-core-10.1.31.jar!/:na] - at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) ~[tomcat-embed-core-10.1.31.jar!/:na] - at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:110) ~[spring-web-6.1.14.jar!/:6.1.14] - at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164) ~[tomcat-embed-core-10.1.31.jar!/:na] - at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) ~[tomcat-embed-core-10.1.31.jar!/:na] - at org.springframework.web.filter.CompositeFilter$VirtualFilterChain.doFilter(CompositeFilter.java:108) ~[spring-web-6.1.14.jar!/:6.1.14] - at org.springframework.security.web.FilterChainProxy.lambda$doFilterInternal$3(FilterChainProxy.java:231) ~[spring-security-web-6.3.4.jar!/:6.3.4] - at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:365) ~[spring-security-web-6.3.4.jar!/:6.3.4] - at org.springframework.security.web.access.intercept.AuthorizationFilter.doFilter(AuthorizationFilter.java:100) ~[spring-security-web-6.3.4.jar!/:6.3.4] - at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:374) ~[spring-security-web-6.3.4.jar!/:6.3.4] - at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:126) ~[spring-security-web-6.3.4.jar!/:6.3.4] - at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:120) ~[spring-security-web-6.3.4.jar!/:6.3.4] - at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:374) ~[spring-security-web-6.3.4.jar!/:6.3.4] - at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:131) ~[spring-security-web-6.3.4.jar!/:6.3.4] - at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:85) ~[spring-security-web-6.3.4.jar!/:6.3.4] - at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:374) ~[spring-security-web-6.3.4.jar!/:6.3.4] - at org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:100) ~[spring-security-web-6.3.4.jar!/:6.3.4] - at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:374) ~[spring-security-web-6.3.4.jar!/:6.3.4] - at org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:179) ~[spring-security-web-6.3.4.jar!/:6.3.4] - at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:374) ~[spring-security-web-6.3.4.jar!/:6.3.4] - at org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:63) ~[spring-security-web-6.3.4.jar!/:6.3.4] - at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:374) ~[spring-security-web-6.3.4.jar!/:6.3.4] - at com.crm.auth.security.JwtAuthenticationFilter.doFilterInternal(JwtAuthenticationFilter.java:60) ~[crm-auth-1.0.0-SNAPSHOT.jar!/:1.0.0-SNAPSHOT] - at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) ~[spring-web-6.1.14.jar!/:6.1.14] - at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:374) ~[spring-security-web-6.3.4.jar!/:6.3.4] - at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:107) ~[spring-security-web-6.3.4.jar!/:6.3.4] - at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:93) ~[spring-security-web-6.3.4.jar!/:6.3.4] - at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:374) ~[spring-security-web-6.3.4.jar!/:6.3.4] - at org.springframework.security.web.header.HeaderWriterFilter.doHeadersAfter(HeaderWriterFilter.java:90) ~[spring-security-web-6.3.4.jar!/:6.3.4] - at org.springframework.security.web.header.HeaderWriterFilter.doFilterInternal(HeaderWriterFilter.java:75) ~[spring-security-web-6.3.4.jar!/:6.3.4] - at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) ~[spring-web-6.1.14.jar!/:6.1.14] - at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:374) ~[spring-security-web-6.3.4.jar!/:6.3.4] - at org.springframework.security.web.context.SecurityContextHolderFilter.doFilter(SecurityContextHolderFilter.java:82) ~[spring-security-web-6.3.4.jar!/:6.3.4] - at org.springframework.security.web.context.SecurityContextHolderFilter.doFilter(SecurityContextHolderFilter.java:69) ~[spring-security-web-6.3.4.jar!/:6.3.4] - at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:374) ~[spring-security-web-6.3.4.jar!/:6.3.4] - at org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter.doFilterInternal(WebAsyncManagerIntegrationFilter.java:62) ~[spring-security-web-6.3.4.jar!/:6.3.4] - at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) ~[spring-web-6.1.14.jar!/:6.1.14] - at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:374) ~[spring-security-web-6.3.4.jar!/:6.3.4] - at org.springframework.security.web.session.DisableEncodeUrlFilter.doFilterInternal(DisableEncodeUrlFilter.java:42) ~[spring-security-web-6.3.4.jar!/:6.3.4] - at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) ~[spring-web-6.1.14.jar!/:6.1.14] - at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:374) ~[spring-security-web-6.3.4.jar!/:6.3.4] - at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:233) ~[spring-security-web-6.3.4.jar!/:6.3.4] - at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:191) ~[spring-security-web-6.3.4.jar!/:6.3.4] - at org.springframework.web.filter.CompositeFilter$VirtualFilterChain.doFilter(CompositeFilter.java:113) ~[spring-web-6.1.14.jar!/:6.1.14] - at org.springframework.web.servlet.handler.HandlerMappingIntrospector.lambda$createCacheFilter$3(HandlerMappingIntrospector.java:195) ~[spring-webmvc-6.1.14.jar!/:6.1.14] - at org.springframework.web.filter.CompositeFilter$VirtualFilterChain.doFilter(CompositeFilter.java:113) ~[spring-web-6.1.14.jar!/:6.1.14] - at org.springframework.web.filter.CompositeFilter.doFilter(CompositeFilter.java:74) ~[spring-web-6.1.14.jar!/:6.1.14] - at org.springframework.security.config.annotation.web.configuration.WebMvcSecurityConfiguration$CompositeFilterChainProxy.doFilter(WebMvcSecurityConfiguration.java:230) ~[spring-security-config-6.3.4.jar!/:6.3.4] - at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:362) ~[spring-web-6.1.14.jar!/:6.1.14] - at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:278) ~[spring-web-6.1.14.jar!/:6.1.14] - at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164) ~[tomcat-embed-core-10.1.31.jar!/:na] - at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) ~[tomcat-embed-core-10.1.31.jar!/:na] - at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) ~[spring-web-6.1.14.jar!/:6.1.14] - at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) ~[spring-web-6.1.14.jar!/:6.1.14] - at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164) ~[tomcat-embed-core-10.1.31.jar!/:na] - at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) ~[tomcat-embed-core-10.1.31.jar!/:na] - at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) ~[spring-web-6.1.14.jar!/:6.1.14] - at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) ~[spring-web-6.1.14.jar!/:6.1.14] - at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164) ~[tomcat-embed-core-10.1.31.jar!/:na] - at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) ~[tomcat-embed-core-10.1.31.jar!/:na] - at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) ~[spring-web-6.1.14.jar!/:6.1.14] - at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) ~[spring-web-6.1.14.jar!/:6.1.14] - at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164) ~[tomcat-embed-core-10.1.31.jar!/:na] - at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) ~[tomcat-embed-core-10.1.31.jar!/:na] - at com.crm.base.filter.TraceIdFilter.doFilterInternal(TraceIdFilter.java:39) ~[crm-base-1.0.0-SNAPSHOT.jar!/:1.0.0-SNAPSHOT] - at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) ~[spring-web-6.1.14.jar!/:6.1.14] - at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164) ~[tomcat-embed-core-10.1.31.jar!/:na] - at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) ~[tomcat-embed-core-10.1.31.jar!/:na] - at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:167) ~[tomcat-embed-core-10.1.31.jar!/:na] - at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:90) ~[tomcat-embed-core-10.1.31.jar!/:na] - at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:483) ~[tomcat-embed-core-10.1.31.jar!/:na] - at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:115) ~[tomcat-embed-core-10.1.31.jar!/:na] - at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:93) ~[tomcat-embed-core-10.1.31.jar!/:na] - at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74) ~[tomcat-embed-core-10.1.31.jar!/:na] - at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:344) ~[tomcat-embed-core-10.1.31.jar!/:na] - at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:384) ~[tomcat-embed-core-10.1.31.jar!/:na] - at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:63) ~[tomcat-embed-core-10.1.31.jar!/:na] - at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:905) ~[tomcat-embed-core-10.1.31.jar!/:na] - at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1741) ~[tomcat-embed-core-10.1.31.jar!/:na] - at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52) ~[tomcat-embed-core-10.1.31.jar!/:na] - at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1190) ~[tomcat-embed-core-10.1.31.jar!/:na] - at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659) ~[tomcat-embed-core-10.1.31.jar!/:na] - at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:63) ~[tomcat-embed-core-10.1.31.jar!/:na] - at java.base/java.lang.Thread.run(Thread.java:1583) ~[na:na] -Caused by: io.lettuce.core.RedisException: java.net.SocketException: Connection reset - at io.lettuce.core.internal.Exceptions.bubble(Exceptions.java:83) ~[lettuce-core-6.3.2.RELEASE.jar!/:6.3.2.RELEASE/8941aea] - at io.lettuce.core.internal.Futures.awaitOrCancel(Futures.java:250) ~[lettuce-core-6.3.2.RELEASE.jar!/:6.3.2.RELEASE/8941aea] - at io.lettuce.core.LettuceFutures.awaitOrCancel(LettuceFutures.java:74) ~[lettuce-core-6.3.2.RELEASE.jar!/:6.3.2.RELEASE/8941aea] - at org.springframework.data.redis.connection.lettuce.LettuceConnection.await(LettuceConnection.java:1010) ~[spring-data-redis-3.3.5.jar!/:3.3.5] - ... 116 common frames omitted -Caused by: java.net.SocketException: Connection reset - at java.base/sun.nio.ch.SocketChannelImpl.throwConnectionReset(SocketChannelImpl.java:401) ~[na:na] - at java.base/sun.nio.ch.SocketChannelImpl.read(SocketChannelImpl.java:434) ~[na:na] - at io.netty.buffer.PooledByteBuf.setBytes(PooledByteBuf.java:255) ~[netty-buffer-4.1.114.Final.jar!/:4.1.114.Final] - at io.netty.buffer.AbstractByteBuf.writeBytes(AbstractByteBuf.java:1132) ~[netty-buffer-4.1.114.Final.jar!/:4.1.114.Final] - at io.netty.channel.socket.nio.NioSocketChannel.doReadBytes(NioSocketChannel.java:356) ~[netty-transport-4.1.114.Final.jar!/:4.1.114.Final] - at io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:151) ~[netty-transport-4.1.114.Final.jar!/:4.1.114.Final] - at io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:788) ~[netty-transport-4.1.114.Final.jar!/:4.1.114.Final] - at io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:724) ~[netty-transport-4.1.114.Final.jar!/:4.1.114.Final] - at io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:650) ~[netty-transport-4.1.114.Final.jar!/:4.1.114.Final] - at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:562) ~[netty-transport-4.1.114.Final.jar!/:4.1.114.Final] - at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:997) ~[netty-common-4.1.114.Final.jar!/:4.1.114.Final] - at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74) ~[netty-common-4.1.114.Final.jar!/:4.1.114.Final] - at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30) ~[netty-common-4.1.114.Final.jar!/:4.1.114.Final] - ... 1 common frames omitted - -2026-09-04T00:20:10.718+08:00 INFO 27136 --- [crm-app] [lettuce-eventExecutorLoop-1-1] i.l.core.protocol.ConnectionWatchdog : Reconnecting, last destination was /8.129.84.155:6379 -2026-09-04T00:20:10.749+08:00 INFO 27136 --- [crm-app] [lettuce-nioEventLoop-4-2] i.l.core.protocol.ReconnectionHandler : Reconnected to 8.129.84.155/:6379 -2026-09-04T00:20:12.681+08:00 WARN 27136 --- [crm-app] [http-nio-8080-exec-8] c.c.a.controller.DebugTokenController : [verify] 为 userId=739564171091247104 签发调试 token -2026-09-04T00:20:12.707+08:00 WARN 27136 --- [crm-app] [http-nio-8080-exec-10] c.c.a.controller.DebugTokenController : [verify] 为 userId=744842318024015872 签发调试 token -2026-09-04T00:20:13.598+08:00 WARN 27136 --- [crm-app] [http-nio-8080-exec-2] com.zaxxer.hikari.pool.PoolBase : HikariPool-1 - Failed to validate connection com.mysql.cj.jdbc.ConnectionImpl@67c5f5ba (No operations allowed after connection closed.). Possibly consider using a shorter maxLifetime value. -2026-09-04T00:20:14.626+08:00 WARN 27136 --- [crm-app] [http-nio-8080-exec-6] c.c.b.a.GlobalExceptionHandlerAdvice : 业务异常:code=67011, msg=交接原因必填 -2026-09-04T00:20:14.767+08:00 WARN 27136 --- [crm-app] [http-nio-8080-exec-7] c.c.b.a.GlobalExceptionHandlerAdvice : 业务异常:code=67011, msg=接收总监不在可交接范围内 -2026-09-04T00:20:15.480+08:00 WARN 27136 --- [crm-app] [http-nio-8080-exec-9] c.c.b.a.GlobalExceptionHandlerAdvice : 业务异常:code=67010, msg=存在未完成的交接单,不可重复发起 -2026-09-04T00:20:30.002+08:00 INFO 27136 --- [crm-app] [scheduling-1] c.crm.customer.job.CustomerReminderJob : [客户提醒Job] 开始,now=2026-09-04T00:20:30.002168300 -2026-09-04T00:20:30.013+08:00 WARN 27136 --- [crm-app] [scheduling-1] com.zaxxer.hikari.pool.PoolBase : HikariPool-1 - Failed to validate connection com.mysql.cj.jdbc.ConnectionImpl@2d714256 (No operations allowed after connection closed.). Possibly consider using a shorter maxLifetime value. -2026-09-04T00:20:30.025+08:00 WARN 27136 --- [crm-app] [scheduling-1] com.zaxxer.hikari.pool.PoolBase : HikariPool-1 - Failed to validate connection com.mysql.cj.jdbc.ConnectionImpl@7109989d (No operations allowed after connection closed.). Possibly consider using a shorter maxLifetime value. -2026-09-04T00:20:30.037+08:00 WARN 27136 --- [crm-app] [scheduling-1] com.zaxxer.hikari.pool.PoolBase : HikariPool-1 - Failed to validate connection com.mysql.cj.jdbc.ConnectionImpl@652b7c83 (No operations allowed after connection closed.). Possibly consider using a shorter maxLifetime value. -2026-09-04T00:20:30.049+08:00 WARN 27136 --- [crm-app] [scheduling-1] com.zaxxer.hikari.pool.PoolBase : HikariPool-1 - Failed to validate connection com.mysql.cj.jdbc.ConnectionImpl@42efe182 (No operations allowed after connection closed.). Possibly consider using a shorter maxLifetime value. -2026-09-04T00:20:30.058+08:00 WARN 27136 --- [crm-app] [scheduling-1] com.zaxxer.hikari.pool.PoolBase : HikariPool-1 - Failed to validate connection com.mysql.cj.jdbc.ConnectionImpl@1d9dd25d (No operations allowed after connection closed.). Possibly consider using a shorter maxLifetime value. -2026-09-04T00:20:30.067+08:00 WARN 27136 --- [crm-app] [scheduling-1] com.zaxxer.hikari.pool.PoolBase : HikariPool-1 - Failed to validate connection com.mysql.cj.jdbc.ConnectionImpl@20ed6c03 (No operations allowed after connection closed.). Possibly consider using a shorter maxLifetime value. -2026-09-04T00:20:30.076+08:00 WARN 27136 --- [crm-app] [scheduling-1] com.zaxxer.hikari.pool.PoolBase : HikariPool-1 - Failed to validate connection com.mysql.cj.jdbc.ConnectionImpl@1e1cd3f9 (No operations allowed after connection closed.). Possibly consider using a shorter maxLifetime value. -2026-09-04T00:20:30.087+08:00 WARN 27136 --- [crm-app] [scheduling-1] com.zaxxer.hikari.pool.PoolBase : HikariPool-1 - Failed to validate connection com.mysql.cj.jdbc.ConnectionImpl@2342d249 (No operations allowed after connection closed.). Possibly consider using a shorter maxLifetime value. -2026-09-04T00:20:30.142+08:00 INFO 27136 --- [crm-app] [scheduling-1] c.crm.customer.job.CustomerReminderJob : [客户提醒Job] 完成:新增待发 0 条,旧锚点失效 0 条 -2026-09-04T00:21:00.001+08:00 INFO 27136 --- [crm-app] [scheduling-1] c.crm.customer.job.CustomerReminderJob : [客户提醒Job] 开始,now=2026-09-04T00:21:00.001741500 -2026-09-04T00:21:00.047+08:00 INFO 27136 --- [crm-app] [scheduling-1] c.crm.customer.job.CustomerReminderJob : [客户提醒Job] 完成:新增待发 0 条,旧锚点失效 0 条 -2026-09-04T00:21:20.942+08:00 WARN 27136 --- [crm-app] [http-nio-8080-exec-7] c.c.b.a.GlobalExceptionHandlerAdvice : 业务异常:code=67012, msg=分配对象不存在、已停用或已离职 -2026-09-04T00:21:24.962+08:00 WARN 27136 --- [crm-app] [http-nio-8080-exec-5] c.c.b.a.GlobalExceptionHandlerAdvice : 业务异常:code=67013, msg=导入方式非法(仅新增/仅更新/新增或更新) -2026-09-04T00:21:25.273+08:00 WARN 27136 --- [crm-app] [http-nio-8080-exec-6] c.c.b.a.GlobalExceptionHandlerAdvice : 业务异常:code=67013, msg=模板版本不匹配,请下载最新导入模板(第 2 列表头不符) -2026-09-04T00:21:25.422+08:00 WARN 27136 --- [crm-app] [http-nio-8080-exec-7] c.c.b.a.GlobalExceptionHandlerAdvice : 业务异常:code=67013, msg=文件内无数据行 -2026-09-04T00:21:25.799+08:00 ERROR 27136 --- [crm-app] [task-1] c.crm.file.task.ThumbnailGenerationTask : 缩略图生成失败:fileId=750873049946914816, thumbKey=thumbnails/750873049946914816.jpg - -java.io.IOException: Cannot run program "soffice": CreateProcess error=2, 系统找不到指定的文件。 - at java.base/java.lang.ProcessBuilder.start(ProcessBuilder.java:1170) ~[na:na] - at java.base/java.lang.ProcessBuilder.start(ProcessBuilder.java:1089) ~[na:na] - at com.crm.file.service.impl.OfficeThumbnailRenderer.runConversion(OfficeThumbnailRenderer.java:110) ~[crm-file-1.0.0-SNAPSHOT.jar!/:1.0.0-SNAPSHOT] - at com.crm.file.service.impl.OfficeThumbnailRenderer.render(OfficeThumbnailRenderer.java:70) ~[crm-file-1.0.0-SNAPSHOT.jar!/:1.0.0-SNAPSHOT] - at com.crm.file.task.ThumbnailGenerationTask.generateSync(ThumbnailGenerationTask.java:140) ~[crm-file-1.0.0-SNAPSHOT.jar!/:1.0.0-SNAPSHOT] - at com.crm.file.task.ThumbnailGenerationTask.generateWithLock(ThumbnailGenerationTask.java:102) ~[crm-file-1.0.0-SNAPSHOT.jar!/:1.0.0-SNAPSHOT] - at com.crm.file.task.ThumbnailGenerationTask.generate(ThumbnailGenerationTask.java:70) ~[crm-file-1.0.0-SNAPSHOT.jar!/:1.0.0-SNAPSHOT] - at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103) ~[na:na] - at java.base/java.lang.reflect.Method.invoke(Method.java:580) ~[na:na] - at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:355) ~[spring-aop-6.1.14.jar!/:6.1.14] - at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:196) ~[spring-aop-6.1.14.jar!/:6.1.14] - at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) ~[spring-aop-6.1.14.jar!/:6.1.14] - at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:768) ~[spring-aop-6.1.14.jar!/:6.1.14] - at org.springframework.aop.interceptor.AsyncExecutionInterceptor.lambda$invoke$0(AsyncExecutionInterceptor.java:113) ~[spring-aop-6.1.14.jar!/:6.1.14] - at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:317) ~[na:na] - at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1144) ~[na:na] - at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:642) ~[na:na] - at java.base/java.lang.Thread.run(Thread.java:1583) ~[na:na] -Caused by: java.io.IOException: CreateProcess error=2, 系统找不到指定的文件。 - at java.base/java.lang.ProcessImpl.create(Native Method) ~[na:na] - at java.base/java.lang.ProcessImpl.(ProcessImpl.java:506) ~[na:na] - at java.base/java.lang.ProcessImpl.start(ProcessImpl.java:159) ~[na:na] - at java.base/java.lang.ProcessBuilder.start(ProcessBuilder.java:1126) ~[na:na] - ... 17 common frames omitted - -2026-09-04T00:21:26.031+08:00 ERROR 27136 --- [crm-app] [task-2] c.crm.file.task.ThumbnailGenerationTask : 缩略图生成失败:fileId=750873051159068672, thumbKey=thumbnails/750873051159068672.jpg - -java.io.IOException: Cannot run program "soffice": CreateProcess error=2, 系统找不到指定的文件。 - at java.base/java.lang.ProcessBuilder.start(ProcessBuilder.java:1170) ~[na:na] - at java.base/java.lang.ProcessBuilder.start(ProcessBuilder.java:1089) ~[na:na] - at com.crm.file.service.impl.OfficeThumbnailRenderer.runConversion(OfficeThumbnailRenderer.java:110) ~[crm-file-1.0.0-SNAPSHOT.jar!/:1.0.0-SNAPSHOT] - at com.crm.file.service.impl.OfficeThumbnailRenderer.render(OfficeThumbnailRenderer.java:70) ~[crm-file-1.0.0-SNAPSHOT.jar!/:1.0.0-SNAPSHOT] - at com.crm.file.task.ThumbnailGenerationTask.generateSync(ThumbnailGenerationTask.java:140) ~[crm-file-1.0.0-SNAPSHOT.jar!/:1.0.0-SNAPSHOT] - at com.crm.file.task.ThumbnailGenerationTask.generateWithLock(ThumbnailGenerationTask.java:102) ~[crm-file-1.0.0-SNAPSHOT.jar!/:1.0.0-SNAPSHOT] - at com.crm.file.task.ThumbnailGenerationTask.generate(ThumbnailGenerationTask.java:70) ~[crm-file-1.0.0-SNAPSHOT.jar!/:1.0.0-SNAPSHOT] - at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103) ~[na:na] - at java.base/java.lang.reflect.Method.invoke(Method.java:580) ~[na:na] - at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:355) ~[spring-aop-6.1.14.jar!/:6.1.14] - at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:196) ~[spring-aop-6.1.14.jar!/:6.1.14] - at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) ~[spring-aop-6.1.14.jar!/:6.1.14] - at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:768) ~[spring-aop-6.1.14.jar!/:6.1.14] - at org.springframework.aop.interceptor.AsyncExecutionInterceptor.lambda$invoke$0(AsyncExecutionInterceptor.java:113) ~[spring-aop-6.1.14.jar!/:6.1.14] - at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:317) ~[na:na] - at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1144) ~[na:na] - at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:642) ~[na:na] - at java.base/java.lang.Thread.run(Thread.java:1583) ~[na:na] -Caused by: java.io.IOException: CreateProcess error=2, 系统找不到指定的文件。 - at java.base/java.lang.ProcessImpl.create(Native Method) ~[na:na] - at java.base/java.lang.ProcessImpl.(ProcessImpl.java:506) ~[na:na] - at java.base/java.lang.ProcessImpl.start(ProcessImpl.java:159) ~[na:na] - at java.base/java.lang.ProcessBuilder.start(ProcessBuilder.java:1126) ~[na:na] - ... 17 common frames omitted +This generated password is for development use only. Your security configuration must be updated before running your application in production. -2026-09-04T00:21:26.354+08:00 ERROR 27136 --- [crm-app] [task-3] c.crm.file.task.ThumbnailGenerationTask : 缩略图生成失败:fileId=750873052526411776, thumbKey=thumbnails/750873052526411776.jpg +2026-09-05T11:23:48.537+08:00 INFO 21796 --- [crm-app] [main] r$InitializeUserDetailsManagerConfigurer : Global AuthenticationManager configured with UserDetailsService bean with name inMemoryUserDetailsManager +2026-09-05T11:23:49.990+08:00 INFO 21796 --- [crm-app] [main] c.c.a.c.DataScopeModuleStartupValidator : ȨģУͨ0 ܿر4 עģ +2026-09-05T11:23:50.036+08:00 INFO 21796 --- [crm-app] [main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port 8080 (http) with context path '/' +2026-09-05T11:23:50.071+08:00 INFO 21796 --- [crm-app] [main] com.crm.app.CrmAppApplication : Started CrmAppApplication in 43.404 seconds (process running for 44.224) +2026-09-05T11:23:50.077+08:00 INFO 21796 --- [crm-app] [main] com.crm.auth.config.DataInitializer : ִȨݳʼ... +2026-09-05T11:23:50.750+08:00 INFO 21796 --- [crm-app] [main] com.crm.auth.config.DataInitializer : Ȩݳʼ +2026-09-05T11:23:50.752+08:00 INFO 21796 --- [crm-app] [main] c.c.d.config.DictPermissionInitializer : ִֵȨӻ... +2026-09-05T11:23:51.119+08:00 INFO 21796 --- [crm-app] [main] c.c.d.config.DictPermissionInitializer : ֵȨӻɣ10 Ȩ޵ +2026-09-05T11:23:51.119+08:00 INFO 21796 --- [crm-app] [main] c.c.r.config.RulePermissionInitializer : ִȨӻ飨˵... +2026-09-05T11:23:51.202+08:00 INFO 21796 --- [crm-app] [main] c.c.r.config.RulePermissionInitializer : Ȩӻɣ˵0 button +2026-09-05T11:23:51.203+08:00 INFO 21796 --- [crm-app] [main] c.crm.rule.config.RegionDataInitializer : ִȫӵ... +2026-09-05T11:23:53.072+08:00 INFO 21796 --- [crm-app] [main] c.crm.rule.config.RegionDataInitializer : ӵɣ 3432 Уʡ 34 / 342 / 3056 3432 У 0 +2026-09-05T11:23:53.072+08:00 INFO 21796 --- [crm-app] [main] c.c.l.config.LeadPermissionInitializer : ִȨӻ飨˵... +2026-09-05T11:23:53.398+08:00 INFO 21796 --- [crm-app] [main] c.c.l.config.LeadPermissionInitializer : Ȩӻɣ4 ˵0 button +2026-09-05T11:23:53.398+08:00 INFO 21796 --- [crm-app] [main] r.c.OpportunityRulePermissionInitializer : ִ̻Ȩӻ飨˵... +2026-09-05T11:23:53.489+08:00 INFO 21796 --- [crm-app] [main] r.c.OpportunityRulePermissionInitializer : ̻Ȩӻɣ˵0 button +2026-09-05T11:23:53.490+08:00 INFO 21796 --- [crm-app] [main] ustomerReminderRulePermissionInitializer : ִпͻѹȨӻ飨˵... +2026-09-05T11:23:53.573+08:00 INFO 21796 --- [crm-app] [main] ustomerReminderRulePermissionInitializer : ͻѹȨӻɣ˵0 button +2026-09-05T11:23:53.573+08:00 INFO 21796 --- [crm-app] [main] tunityStageTemplatePermissionInitializer : ִ̻׶ģȨӻ飨˵... +2026-09-05T11:23:53.652+08:00 INFO 21796 --- [crm-app] [main] tunityStageTemplatePermissionInitializer : ̻׶ģȨӻɣ˵0 button +2026-09-05T11:23:53.652+08:00 INFO 21796 --- [crm-app] [main] c.c.r.config.SchemeFieldDefInitializer : ִзϵͳֶοӻ... +2026-09-05T11:23:53.666+08:00 INFO 21796 --- [crm-app] [main] c.c.r.config.SchemeFieldDefInitializer : ϵͳֶοӻɣִ 16 0 +2026-09-05T11:23:53.684+08:00 INFO 21796 --- [crm-app] [main] c.c.r.config.SchemeFieldDefInitializer : ģѴڣcode=OPP_SCHEME_TPL_01ͣãӻ +2026-09-05T11:23:53.684+08:00 INFO 21796 --- [crm-app] [main] ySchemeCardTemplatePermissionInitializer : ִзģȨӻ飨˵... +2026-09-05T11:23:53.764+08:00 INFO 21796 --- [crm-app] [main] ySchemeCardTemplatePermissionInitializer : ģȨӻɣ˵0 button +2026-09-05T11:23:53.780+08:00 INFO 21796 --- [crm-app] [main] c.c.r.config.StageTemplateInitializer : ĬϽ׶ģѴڣcode=OPP_STAGE_TPL_01ͣãӻ +2026-09-05T11:23:53.795+08:00 INFO 21796 --- [crm-app] [main] c.c.r.c.CustomerReminderRuleInitializer : ͻѹѴڣid=1ӻ +2026-09-05T11:23:53.796+08:00 INFO 21796 --- [crm-app] [main] c.CustomerDedupRulePermissionInitializer : ִпͻȨӻ飨˵... +2026-09-05T11:23:53.845+08:00 INFO 21796 --- [crm-app] [main] c.c.a.service.impl.PermissionSeederImpl : ˵ڵ㣺ͻ (type=2) +2026-09-05T11:23:53.914+08:00 INFO 21796 --- [crm-app] [main] c.CustomerDedupRulePermissionInitializer : ͻȨӻɣ˵0 button +2026-09-05T11:23:53.951+08:00 INFO 21796 --- [crm-app] [main] c.c.r.c.CustomerDedupRuleInitializer : ֲͻõid=1ȫãģƥ + ׼ 80% ֵ +2026-09-05T11:23:53.952+08:00 INFO 21796 --- [crm-app] [main] c.crm.dict.config.DictDataInitializer : ִֵݵȳʼ... +2026-09-05T11:24:02.756+08:00 INFO 21796 --- [crm-app] [main] c.crm.dict.config.DictDataInitializer : ֵݵȳʼɣ24 +2026-09-05T11:24:02.767+08:00 INFO 21796 --- [crm-app] [main] c.c.c.c.CustomerFulltextIndexInitializer : customer FULLTEXT idx_name_fulltext Ѵڣ +2026-09-05T11:24:11.584+08:00 INFO 21796 --- [crm-app] [http-nio-8080-exec-1] o.s.web.servlet.DispatcherServlet : Initializing Servlet 'dispatcherServlet' +2026-09-05T11:24:11.586+08:00 INFO 21796 --- [crm-app] [http-nio-8080-exec-1] o.s.web.servlet.DispatcherServlet : Completed initialization in 2 ms +2026-09-05T11:24:13.715+08:00 WARN 21796 --- [crm-app] [http-nio-8080-exec-1] c.c.a.controller.DebugTokenController : [verify] Ϊ userId=739564171091247104 ǩ token +2026-09-05T11:24:16.127+08:00 WARN 21796 --- [crm-app] [http-nio-8080-exec-9] c.c.b.a.GlobalExceptionHandlerAdvice : ҵ쳣code=67001, msg=޿Ƭͼֿ֧ͻ/ҵĿͻ +2026-09-05T11:24:16.237+08:00 WARN 21796 --- [crm-app] [http-nio-8080-exec-10] c.c.b.a.GlobalExceptionHandlerAdvice : ҵ쳣code=67001, msg=޿Ƭͼֿ֧ͻ/ҵĿͻ +2026-09-05T11:24:16.986+08:00 WARN 21796 --- [crm-app] [http-nio-8080-exec-2] c.c.b.a.GlobalExceptionHandlerAdvice : ҵ쳣code=67001, msg=Ƿ̻ҲΪ +2026-09-05T11:24:17.734+08:00 WARN 21796 --- [crm-app] [http-nio-8080-exec-6] c.c.b.a.GlobalExceptionHandlerAdvice : ҵ쳣code=67001, msg=ְ +2026-09-05T11:24:21.774+08:00 WARN 21796 --- [crm-app] [http-nio-8080-exec-5] c.c.b.a.GlobalExceptionHandlerAdvice : ȱid +2026-09-05T11:24:26.713+08:00 ERROR 21796 --- [crm-app] [task-1] c.crm.file.task.ThumbnailGenerationTask : ͼʧܣfileId=751402289725440000, thumbKey=thumbnails/751402289725440000.jpg -java.io.IOException: Cannot run program "soffice": CreateProcess error=2, 系统找不到指定的文件。 - at java.base/java.lang.ProcessBuilder.start(ProcessBuilder.java:1170) ~[na:na] - at java.base/java.lang.ProcessBuilder.start(ProcessBuilder.java:1089) ~[na:na] +java.io.IOException: Cannot run program "soffice": CreateProcess error=2, ϵͳҲָļ + at java.base/java.lang.ProcessBuilder.start(ProcessBuilder.java:1143) ~[na:na] + at java.base/java.lang.ProcessBuilder.start(ProcessBuilder.java:1073) ~[na:na] at com.crm.file.service.impl.OfficeThumbnailRenderer.runConversion(OfficeThumbnailRenderer.java:110) ~[crm-file-1.0.0-SNAPSHOT.jar!/:1.0.0-SNAPSHOT] at com.crm.file.service.impl.OfficeThumbnailRenderer.render(OfficeThumbnailRenderer.java:70) ~[crm-file-1.0.0-SNAPSHOT.jar!/:1.0.0-SNAPSHOT] at com.crm.file.task.ThumbnailGenerationTask.generateSync(ThumbnailGenerationTask.java:140) ~[crm-file-1.0.0-SNAPSHOT.jar!/:1.0.0-SNAPSHOT] at com.crm.file.task.ThumbnailGenerationTask.generateWithLock(ThumbnailGenerationTask.java:102) ~[crm-file-1.0.0-SNAPSHOT.jar!/:1.0.0-SNAPSHOT] at com.crm.file.task.ThumbnailGenerationTask.generate(ThumbnailGenerationTask.java:70) ~[crm-file-1.0.0-SNAPSHOT.jar!/:1.0.0-SNAPSHOT] - at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103) ~[na:na] - at java.base/java.lang.reflect.Method.invoke(Method.java:580) ~[na:na] + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na] + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) ~[na:na] + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na] + at java.base/java.lang.reflect.Method.invoke(Method.java:568) ~[na:na] at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:355) ~[spring-aop-6.1.14.jar!/:6.1.14] at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:196) ~[spring-aop-6.1.14.jar!/:6.1.14] at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) ~[spring-aop-6.1.14.jar!/:6.1.14] at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:768) ~[spring-aop-6.1.14.jar!/:6.1.14] at org.springframework.aop.interceptor.AsyncExecutionInterceptor.lambda$invoke$0(AsyncExecutionInterceptor.java:113) ~[spring-aop-6.1.14.jar!/:6.1.14] - at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:317) ~[na:na] - at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1144) ~[na:na] - at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:642) ~[na:na] - at java.base/java.lang.Thread.run(Thread.java:1583) ~[na:na] -Caused by: java.io.IOException: CreateProcess error=2, 系统找不到指定的文件。 + at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264) ~[na:na] + at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136) ~[na:na] + at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635) ~[na:na] + at java.base/java.lang.Thread.run(Thread.java:842) ~[na:na] +Caused by: java.io.IOException: CreateProcess error=2, ϵͳҲָļ at java.base/java.lang.ProcessImpl.create(Native Method) ~[na:na] - at java.base/java.lang.ProcessImpl.(ProcessImpl.java:506) ~[na:na] - at java.base/java.lang.ProcessImpl.start(ProcessImpl.java:159) ~[na:na] - at java.base/java.lang.ProcessBuilder.start(ProcessBuilder.java:1126) ~[na:na] - ... 17 common frames omitted + at java.base/java.lang.ProcessImpl.(ProcessImpl.java:505) ~[na:na] + at java.base/java.lang.ProcessImpl.start(ProcessImpl.java:158) ~[na:na] + at java.base/java.lang.ProcessBuilder.start(ProcessBuilder.java:1110) ~[na:na] + ... 19 common frames omitted -2026-09-04T00:21:26.557+08:00 WARN 27136 --- [crm-app] [http-nio-8080-exec-4] c.c.b.a.GlobalExceptionHandlerAdvice : 业务异常:code=67014, msg=任务已确认,请勿重复提交 -2026-09-04T00:21:26.787+08:00 WARN 27136 --- [crm-app] [task-4] c.c.c.task.CustomerImportExecutor : 客户导入单行执行异常:taskId=750873050265681920, row=1 +2026-09-05T11:24:27.045+08:00 WARN 21796 --- [crm-app] [task-2] c.c.c.task.CustomerImportExecutor : ͻ뵥ִ쳣taskId=751402290362974208, row=1 org.springframework.dao.DataIntegrityViolationException: ### Error updating database. Cause: java.sql.SQLException: Field 'is_biz_negotiated' doesn't have a default value ### The error may exist in com/crm/customer/mapper/CustomerMapper.java (best guess) ### The error may involve com.crm.customer.mapper.CustomerMapper.insert-Inline ### The error occurred while setting parameters -### SQL: INSERT INTO customer ( id, customer_no, customer_name, customer_type, province_code, city_code, industry_code, customer_star_level, owner_user_id, owner_user_name_snapshot, owner_dept_id, owner_dept_name_snapshot, customer_stage, archive_status, last_valid_follow_time, is_child, remark, version, creator_id, create_time, updater_id, update_time, deleted ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? ) +### SQL: INSERT INTO customer ( id, customer_no, customer_name, customer_type, province_code, city_code, industry_code, customer_star_level, owner_user_id, owner_user_name_snapshot, owner_dept_id, owner_dept_name_snapshot, customer_stage, archive_status, last_valid_follow_time, is_child, version, creator_id, create_time, updater_id, update_time, deleted ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? ) ### Cause: java.sql.SQLException: Field 'is_biz_negotiated' doesn't have a default value ; Field 'is_biz_negotiated' doesn't have a default value at org.springframework.jdbc.support.SQLErrorCodeSQLExceptionTranslator.doTranslate(SQLErrorCodeSQLExceptionTranslator.java:258) ~[spring-jdbc-6.1.14.jar!/:6.1.14] @@ -1532,21 +267,23 @@ org.springframework.dao.DataIntegrityViolationException: at com.baomidou.mybatisplus.core.override.MybatisMapperMethod.execute(MybatisMapperMethod.java:59) ~[mybatis-plus-core-3.5.7.jar!/:3.5.7] at com.baomidou.mybatisplus.core.override.MybatisMapperProxy$PlainMethodInvoker.invoke(MybatisMapperProxy.java:152) ~[mybatis-plus-core-3.5.7.jar!/:3.5.7] at com.baomidou.mybatisplus.core.override.MybatisMapperProxy.invoke(MybatisMapperProxy.java:89) ~[mybatis-plus-core-3.5.7.jar!/:3.5.7] - at jdk.proxy2/jdk.proxy2.$Proxy228.insert(Unknown Source) ~[na:na] - at com.crm.customer.task.CustomerImportExecutor.createCustomer(CustomerImportExecutor.java:243) ~[crm-customer-1.0.0-SNAPSHOT.jar!/:1.0.0-SNAPSHOT] - at com.crm.customer.task.CustomerImportExecutor.doImport(CustomerImportExecutor.java:117) ~[crm-customer-1.0.0-SNAPSHOT.jar!/:1.0.0-SNAPSHOT] + at jdk.proxy2/jdk.proxy2.$Proxy229.insert(Unknown Source) ~[na:na] + at com.crm.customer.task.CustomerImportExecutor.createCustomer(CustomerImportExecutor.java:244) ~[crm-customer-1.0.0-SNAPSHOT.jar!/:1.0.0-SNAPSHOT] + at com.crm.customer.task.CustomerImportExecutor.doImport(CustomerImportExecutor.java:118) ~[crm-customer-1.0.0-SNAPSHOT.jar!/:1.0.0-SNAPSHOT] at com.crm.customer.task.CustomerImportExecutor.executeImport(CustomerImportExecutor.java:74) ~[crm-customer-1.0.0-SNAPSHOT.jar!/:1.0.0-SNAPSHOT] - at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103) ~[na:na] - at java.base/java.lang.reflect.Method.invoke(Method.java:580) ~[na:na] + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na] + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) ~[na:na] + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na] + at java.base/java.lang.reflect.Method.invoke(Method.java:568) ~[na:na] at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:355) ~[spring-aop-6.1.14.jar!/:6.1.14] at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:196) ~[spring-aop-6.1.14.jar!/:6.1.14] at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) ~[spring-aop-6.1.14.jar!/:6.1.14] at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:768) ~[spring-aop-6.1.14.jar!/:6.1.14] at org.springframework.aop.interceptor.AsyncExecutionInterceptor.lambda$invoke$0(AsyncExecutionInterceptor.java:113) ~[spring-aop-6.1.14.jar!/:6.1.14] - at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:317) ~[na:na] - at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1144) ~[na:na] - at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:642) ~[na:na] - at java.base/java.lang.Thread.run(Thread.java:1583) ~[na:na] + at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264) ~[na:na] + at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136) ~[na:na] + at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635) ~[na:na] + at java.base/java.lang.Thread.run(Thread.java:842) ~[na:na] Caused by: java.sql.SQLException: Field 'is_biz_negotiated' doesn't have a default value at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:130) ~[mysql-connector-j-8.3.0.jar!/:8.3.0] at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:122) ~[mysql-connector-j-8.3.0.jar!/:8.3.0] @@ -1556,31 +293,35 @@ Caused by: java.sql.SQLException: Field 'is_biz_negotiated' doesn't have a defau at com.zaxxer.hikari.pool.HikariProxyPreparedStatement.execute(HikariProxyPreparedStatement.java) ~[HikariCP-5.1.0.jar!/:na] at org.apache.ibatis.executor.statement.PreparedStatementHandler.update(PreparedStatementHandler.java:48) ~[mybatis-3.5.16.jar!/:3.5.16] at org.apache.ibatis.executor.statement.RoutingStatementHandler.update(RoutingStatementHandler.java:75) ~[mybatis-3.5.16.jar!/:3.5.16] - at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103) ~[na:na] - at java.base/java.lang.reflect.Method.invoke(Method.java:580) ~[na:na] + at jdk.internal.reflect.GeneratedMethodAccessor72.invoke(Unknown Source) ~[na:na] + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na] + at java.base/java.lang.reflect.Method.invoke(Method.java:568) ~[na:na] at org.apache.ibatis.plugin.Plugin.invoke(Plugin.java:61) ~[mybatis-3.5.16.jar!/:3.5.16] - at jdk.proxy2/jdk.proxy2.$Proxy256.update(Unknown Source) ~[na:na] - at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103) ~[na:na] - at java.base/java.lang.reflect.Method.invoke(Method.java:580) ~[na:na] + at jdk.proxy2/jdk.proxy2.$Proxy257.update(Unknown Source) ~[na:na] + at jdk.internal.reflect.GeneratedMethodAccessor72.invoke(Unknown Source) ~[na:na] + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na] + at java.base/java.lang.reflect.Method.invoke(Method.java:568) ~[na:na] at org.apache.ibatis.plugin.Plugin.invoke(Plugin.java:61) ~[mybatis-3.5.16.jar!/:3.5.16] - at jdk.proxy2/jdk.proxy2.$Proxy256.update(Unknown Source) ~[na:na] + at jdk.proxy2/jdk.proxy2.$Proxy257.update(Unknown Source) ~[na:na] at org.apache.ibatis.executor.SimpleExecutor.doUpdate(SimpleExecutor.java:50) ~[mybatis-3.5.16.jar!/:3.5.16] at org.apache.ibatis.executor.BaseExecutor.update(BaseExecutor.java:117) ~[mybatis-3.5.16.jar!/:3.5.16] at org.apache.ibatis.executor.CachingExecutor.update(CachingExecutor.java:76) ~[mybatis-3.5.16.jar!/:3.5.16] - at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103) ~[na:na] - at java.base/java.lang.reflect.Method.invoke(Method.java:580) ~[na:na] + at jdk.internal.reflect.GeneratedMethodAccessor79.invoke(Unknown Source) ~[na:na] + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na] + at java.base/java.lang.reflect.Method.invoke(Method.java:568) ~[na:na] at org.apache.ibatis.plugin.Invocation.proceed(Invocation.java:61) ~[mybatis-3.5.16.jar!/:3.5.16] at com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor.intercept(MybatisPlusInterceptor.java:106) ~[mybatis-plus-extension-3.5.7.jar!/:3.5.7] at org.apache.ibatis.plugin.Plugin.invoke(Plugin.java:59) ~[mybatis-3.5.16.jar!/:3.5.16] - at jdk.proxy2/jdk.proxy2.$Proxy255.update(Unknown Source) ~[na:na] + at jdk.proxy2/jdk.proxy2.$Proxy256.update(Unknown Source) ~[na:na] at org.apache.ibatis.session.defaults.DefaultSqlSession.update(DefaultSqlSession.java:197) ~[mybatis-3.5.16.jar!/:3.5.16] at org.apache.ibatis.session.defaults.DefaultSqlSession.insert(DefaultSqlSession.java:184) ~[mybatis-3.5.16.jar!/:3.5.16] - at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103) ~[na:na] - at java.base/java.lang.reflect.Method.invoke(Method.java:580) ~[na:na] + at jdk.internal.reflect.GeneratedMethodAccessor185.invoke(Unknown Source) ~[na:na] + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na] + at java.base/java.lang.reflect.Method.invoke(Method.java:568) ~[na:na] at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:425) ~[mybatis-spring-3.0.3.jar!/:3.0.3] - ... 20 common frames omitted + ... 22 common frames omitted -2026-09-04T00:21:26.815+08:00 ERROR 27136 --- [crm-app] [task-4] c.c.c.task.CustomerImportExecutor : 客户导入任务执行失败:taskId=750873050265681920 +2026-09-05T11:24:27.395+08:00 ERROR 21796 --- [crm-app] [task-2] c.c.c.task.CustomerImportExecutor : ͻִʧܣtaskId=751402290362974208 org.springframework.dao.DataIntegrityViolationException: ### Error updating database. Cause: com.mysql.cj.jdbc.exceptions.MysqlDataTruncation: Data truncation: Data too long for column 'fail_reason' at row 1 @@ -1601,490 +342,69 @@ org.springframework.dao.DataIntegrityViolationException: at com.baomidou.mybatisplus.core.override.MybatisMapperMethod.execute(MybatisMapperMethod.java:59) ~[mybatis-plus-core-3.5.7.jar!/:3.5.7] at com.baomidou.mybatisplus.core.override.MybatisMapperProxy$PlainMethodInvoker.invoke(MybatisMapperProxy.java:152) ~[mybatis-plus-core-3.5.7.jar!/:3.5.7] at com.baomidou.mybatisplus.core.override.MybatisMapperProxy.invoke(MybatisMapperProxy.java:89) ~[mybatis-plus-core-3.5.7.jar!/:3.5.7] - at jdk.proxy2/jdk.proxy2.$Proxy236.insert(Unknown Source) ~[na:na] - at com.crm.customer.task.CustomerImportExecutor.insertFail(CustomerImportExecutor.java:297) ~[crm-customer-1.0.0-SNAPSHOT.jar!/:1.0.0-SNAPSHOT] - at com.crm.customer.task.CustomerImportExecutor.doImport(CustomerImportExecutor.java:147) ~[crm-customer-1.0.0-SNAPSHOT.jar!/:1.0.0-SNAPSHOT] + at jdk.proxy2/jdk.proxy2.$Proxy238.insert(Unknown Source) ~[na:na] + at com.crm.customer.task.CustomerImportExecutor.insertFail(CustomerImportExecutor.java:298) ~[crm-customer-1.0.0-SNAPSHOT.jar!/:1.0.0-SNAPSHOT] + at com.crm.customer.task.CustomerImportExecutor.doImport(CustomerImportExecutor.java:148) ~[crm-customer-1.0.0-SNAPSHOT.jar!/:1.0.0-SNAPSHOT] at com.crm.customer.task.CustomerImportExecutor.executeImport(CustomerImportExecutor.java:74) ~[crm-customer-1.0.0-SNAPSHOT.jar!/:1.0.0-SNAPSHOT] - at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103) ~[na:na] - at java.base/java.lang.reflect.Method.invoke(Method.java:580) ~[na:na] - at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:355) ~[spring-aop-6.1.14.jar!/:6.1.14] - at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:196) ~[spring-aop-6.1.14.jar!/:6.1.14] - at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) ~[spring-aop-6.1.14.jar!/:6.1.14] - at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:768) ~[spring-aop-6.1.14.jar!/:6.1.14] - at org.springframework.aop.interceptor.AsyncExecutionInterceptor.lambda$invoke$0(AsyncExecutionInterceptor.java:113) ~[spring-aop-6.1.14.jar!/:6.1.14] - at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:317) ~[na:na] - at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1144) ~[na:na] - at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:642) ~[na:na] - at java.base/java.lang.Thread.run(Thread.java:1583) ~[na:na] -Caused by: com.mysql.cj.jdbc.exceptions.MysqlDataTruncation: Data truncation: Data too long for column 'fail_reason' at row 1 - at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:104) ~[mysql-connector-j-8.3.0.jar!/:8.3.0] - at com.mysql.cj.jdbc.ClientPreparedStatement.executeInternal(ClientPreparedStatement.java:912) ~[mysql-connector-j-8.3.0.jar!/:8.3.0] - at com.mysql.cj.jdbc.ClientPreparedStatement.execute(ClientPreparedStatement.java:354) ~[mysql-connector-j-8.3.0.jar!/:8.3.0] - at com.zaxxer.hikari.pool.ProxyPreparedStatement.execute(ProxyPreparedStatement.java:44) ~[HikariCP-5.1.0.jar!/:na] - at com.zaxxer.hikari.pool.HikariProxyPreparedStatement.execute(HikariProxyPreparedStatement.java) ~[HikariCP-5.1.0.jar!/:na] - at org.apache.ibatis.executor.statement.PreparedStatementHandler.update(PreparedStatementHandler.java:48) ~[mybatis-3.5.16.jar!/:3.5.16] - at org.apache.ibatis.executor.statement.RoutingStatementHandler.update(RoutingStatementHandler.java:75) ~[mybatis-3.5.16.jar!/:3.5.16] - at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103) ~[na:na] - at java.base/java.lang.reflect.Method.invoke(Method.java:580) ~[na:na] - at org.apache.ibatis.plugin.Plugin.invoke(Plugin.java:61) ~[mybatis-3.5.16.jar!/:3.5.16] - at jdk.proxy2/jdk.proxy2.$Proxy256.update(Unknown Source) ~[na:na] - at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103) ~[na:na] - at java.base/java.lang.reflect.Method.invoke(Method.java:580) ~[na:na] - at org.apache.ibatis.plugin.Plugin.invoke(Plugin.java:61) ~[mybatis-3.5.16.jar!/:3.5.16] - at jdk.proxy2/jdk.proxy2.$Proxy256.update(Unknown Source) ~[na:na] - at org.apache.ibatis.executor.SimpleExecutor.doUpdate(SimpleExecutor.java:50) ~[mybatis-3.5.16.jar!/:3.5.16] - at org.apache.ibatis.executor.BaseExecutor.update(BaseExecutor.java:117) ~[mybatis-3.5.16.jar!/:3.5.16] - at org.apache.ibatis.executor.CachingExecutor.update(CachingExecutor.java:76) ~[mybatis-3.5.16.jar!/:3.5.16] - at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103) ~[na:na] - at java.base/java.lang.reflect.Method.invoke(Method.java:580) ~[na:na] - at org.apache.ibatis.plugin.Invocation.proceed(Invocation.java:61) ~[mybatis-3.5.16.jar!/:3.5.16] - at com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor.intercept(MybatisPlusInterceptor.java:106) ~[mybatis-plus-extension-3.5.7.jar!/:3.5.7] - at org.apache.ibatis.plugin.Plugin.invoke(Plugin.java:59) ~[mybatis-3.5.16.jar!/:3.5.16] - at jdk.proxy2/jdk.proxy2.$Proxy255.update(Unknown Source) ~[na:na] - at org.apache.ibatis.session.defaults.DefaultSqlSession.update(DefaultSqlSession.java:197) ~[mybatis-3.5.16.jar!/:3.5.16] - at org.apache.ibatis.session.defaults.DefaultSqlSession.insert(DefaultSqlSession.java:184) ~[mybatis-3.5.16.jar!/:3.5.16] - at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103) ~[na:na] - at java.base/java.lang.reflect.Method.invoke(Method.java:580) ~[na:na] - at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:425) ~[mybatis-spring-3.0.3.jar!/:3.0.3] - ... 20 common frames omitted - -2026-09-04T00:21:26.895+08:00 ERROR 27136 --- [crm-app] [http-nio-8080-exec-1] c.c.b.a.GlobalExceptionHandlerAdvice : 全局异常捕获: - -org.springframework.web.context.request.async.AsyncRequestNotUsableException: ServletOutputStream failed to write: java.io.IOException: 你的主机中的软件中止了一个已建立的连接。 - at org.springframework.web.context.request.async.StandardServletAsyncWebRequest$LifecycleHttpServletResponse.handleIOException(StandardServletAsyncWebRequest.java:343) ~[spring-web-6.1.14.jar!/:6.1.14] - at org.springframework.web.context.request.async.StandardServletAsyncWebRequest$LifecycleServletOutputStream.write(StandardServletAsyncWebRequest.java:401) ~[spring-web-6.1.14.jar!/:6.1.14] - at org.springframework.util.StreamUtils$NonClosingOutputStream.write(StreamUtils.java:261) ~[spring-core-6.1.14.jar!/:6.1.14] - at com.fasterxml.jackson.core.json.UTF8JsonGenerator._flushBuffer(UTF8JsonGenerator.java:2210) ~[jackson-core-2.17.2.jar!/:2.17.2] - at com.fasterxml.jackson.core.json.UTF8JsonGenerator._writeStringSegment2(UTF8JsonGenerator.java:1522) ~[jackson-core-2.17.2.jar!/:2.17.2] - at com.fasterxml.jackson.core.json.UTF8JsonGenerator._writeStringSegment(UTF8JsonGenerator.java:1469) ~[jackson-core-2.17.2.jar!/:2.17.2] - at com.fasterxml.jackson.core.json.UTF8JsonGenerator.writeString(UTF8JsonGenerator.java:531) ~[jackson-core-2.17.2.jar!/:2.17.2] - at com.fasterxml.jackson.databind.ser.std.StringSerializer.serialize(StringSerializer.java:41) ~[jackson-databind-2.17.2.jar!/:2.17.2] - at com.fasterxml.jackson.databind.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:732) ~[jackson-databind-2.17.2.jar!/:2.17.2] - at com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:770) ~[jackson-databind-2.17.2.jar!/:2.17.2] - at com.fasterxml.jackson.databind.ser.BeanSerializer.serialize(BeanSerializer.java:183) ~[jackson-databind-2.17.2.jar!/:2.17.2] - at com.fasterxml.jackson.databind.ser.impl.IndexedListSerializer.serializeContents(IndexedListSerializer.java:119) ~[jackson-databind-2.17.2.jar!/:2.17.2] - at com.fasterxml.jackson.databind.ser.impl.IndexedListSerializer.serialize(IndexedListSerializer.java:79) ~[jackson-databind-2.17.2.jar!/:2.17.2] - at com.fasterxml.jackson.databind.ser.impl.IndexedListSerializer.serialize(IndexedListSerializer.java:18) ~[jackson-databind-2.17.2.jar!/:2.17.2] - at com.fasterxml.jackson.databind.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:732) ~[jackson-databind-2.17.2.jar!/:2.17.2] - at com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:770) ~[jackson-databind-2.17.2.jar!/:2.17.2] - at com.fasterxml.jackson.databind.ser.BeanSerializer.serialize(BeanSerializer.java:183) ~[jackson-databind-2.17.2.jar!/:2.17.2] - at com.fasterxml.jackson.databind.ser.DefaultSerializerProvider._serialize(DefaultSerializerProvider.java:502) ~[jackson-databind-2.17.2.jar!/:2.17.2] - at com.fasterxml.jackson.databind.ser.DefaultSerializerProvider.serializeValue(DefaultSerializerProvider.java:341) ~[jackson-databind-2.17.2.jar!/:2.17.2] - at com.fasterxml.jackson.databind.ObjectWriter$Prefetch.serialize(ObjectWriter.java:1574) ~[jackson-databind-2.17.2.jar!/:2.17.2] - at com.fasterxml.jackson.databind.ObjectWriter.writeValue(ObjectWriter.java:1061) ~[jackson-databind-2.17.2.jar!/:2.17.2] - at org.springframework.http.converter.json.AbstractJackson2HttpMessageConverter.writeInternal(AbstractJackson2HttpMessageConverter.java:483) ~[spring-web-6.1.14.jar!/:6.1.14] - at org.springframework.http.converter.AbstractGenericHttpMessageConverter.write(AbstractGenericHttpMessageConverter.java:114) ~[spring-web-6.1.14.jar!/:6.1.14] - at org.springframework.web.servlet.mvc.method.annotation.AbstractMessageConverterMethodProcessor.writeWithMessageConverters(AbstractMessageConverterMethodProcessor.java:297) ~[spring-webmvc-6.1.14.jar!/:6.1.14] - at org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor.handleReturnValue(RequestResponseBodyMethodProcessor.java:192) ~[spring-webmvc-6.1.14.jar!/:6.1.14] - at org.springframework.web.method.support.HandlerMethodReturnValueHandlerComposite.handleReturnValue(HandlerMethodReturnValueHandlerComposite.java:78) ~[spring-web-6.1.14.jar!/:6.1.14] - at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:136) ~[spring-webmvc-6.1.14.jar!/:6.1.14] - at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:926) ~[spring-webmvc-6.1.14.jar!/:6.1.14] - at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:831) ~[spring-webmvc-6.1.14.jar!/:6.1.14] - at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87) ~[spring-webmvc-6.1.14.jar!/:6.1.14] - at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1089) ~[spring-webmvc-6.1.14.jar!/:6.1.14] - at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:979) ~[spring-webmvc-6.1.14.jar!/:6.1.14] - at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1014) ~[spring-webmvc-6.1.14.jar!/:6.1.14] - at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:903) ~[spring-webmvc-6.1.14.jar!/:6.1.14] - at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:564) ~[tomcat-embed-core-10.1.31.jar!/:na] - at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:885) ~[spring-webmvc-6.1.14.jar!/:6.1.14] - at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:658) ~[tomcat-embed-core-10.1.31.jar!/:na] - at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:195) ~[tomcat-embed-core-10.1.31.jar!/:na] - at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) ~[tomcat-embed-core-10.1.31.jar!/:na] - at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51) ~[tomcat-embed-websocket-10.1.31.jar!/:na] - at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164) ~[tomcat-embed-core-10.1.31.jar!/:na] - at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) ~[tomcat-embed-core-10.1.31.jar!/:na] - at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:110) ~[spring-web-6.1.14.jar!/:6.1.14] - at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164) ~[tomcat-embed-core-10.1.31.jar!/:na] - at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) ~[tomcat-embed-core-10.1.31.jar!/:na] - at org.springframework.web.filter.CompositeFilter$VirtualFilterChain.doFilter(CompositeFilter.java:108) ~[spring-web-6.1.14.jar!/:6.1.14] - at org.springframework.security.web.FilterChainProxy.lambda$doFilterInternal$3(FilterChainProxy.java:231) ~[spring-security-web-6.3.4.jar!/:6.3.4] - at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:365) ~[spring-security-web-6.3.4.jar!/:6.3.4] - at org.springframework.security.web.access.intercept.AuthorizationFilter.doFilter(AuthorizationFilter.java:100) ~[spring-security-web-6.3.4.jar!/:6.3.4] - at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:374) ~[spring-security-web-6.3.4.jar!/:6.3.4] - at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:126) ~[spring-security-web-6.3.4.jar!/:6.3.4] - at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:120) ~[spring-security-web-6.3.4.jar!/:6.3.4] - at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:374) ~[spring-security-web-6.3.4.jar!/:6.3.4] - at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:131) ~[spring-security-web-6.3.4.jar!/:6.3.4] - at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:85) ~[spring-security-web-6.3.4.jar!/:6.3.4] - at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:374) ~[spring-security-web-6.3.4.jar!/:6.3.4] - at org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:100) ~[spring-security-web-6.3.4.jar!/:6.3.4] - at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:374) ~[spring-security-web-6.3.4.jar!/:6.3.4] - at org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:179) ~[spring-security-web-6.3.4.jar!/:6.3.4] - at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:374) ~[spring-security-web-6.3.4.jar!/:6.3.4] - at org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:63) ~[spring-security-web-6.3.4.jar!/:6.3.4] - at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:374) ~[spring-security-web-6.3.4.jar!/:6.3.4] - at com.crm.auth.security.JwtAuthenticationFilter.doFilterInternal(JwtAuthenticationFilter.java:60) ~[crm-auth-1.0.0-SNAPSHOT.jar!/:1.0.0-SNAPSHOT] - at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) ~[spring-web-6.1.14.jar!/:6.1.14] - at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:374) ~[spring-security-web-6.3.4.jar!/:6.3.4] - at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:107) ~[spring-security-web-6.3.4.jar!/:6.3.4] - at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:93) ~[spring-security-web-6.3.4.jar!/:6.3.4] - at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:374) ~[spring-security-web-6.3.4.jar!/:6.3.4] - at org.springframework.security.web.header.HeaderWriterFilter.doHeadersAfter(HeaderWriterFilter.java:90) ~[spring-security-web-6.3.4.jar!/:6.3.4] - at org.springframework.security.web.header.HeaderWriterFilter.doFilterInternal(HeaderWriterFilter.java:75) ~[spring-security-web-6.3.4.jar!/:6.3.4] - at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) ~[spring-web-6.1.14.jar!/:6.1.14] - at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:374) ~[spring-security-web-6.3.4.jar!/:6.3.4] - at org.springframework.security.web.context.SecurityContextHolderFilter.doFilter(SecurityContextHolderFilter.java:82) ~[spring-security-web-6.3.4.jar!/:6.3.4] - at org.springframework.security.web.context.SecurityContextHolderFilter.doFilter(SecurityContextHolderFilter.java:69) ~[spring-security-web-6.3.4.jar!/:6.3.4] - at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:374) ~[spring-security-web-6.3.4.jar!/:6.3.4] - at org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter.doFilterInternal(WebAsyncManagerIntegrationFilter.java:62) ~[spring-security-web-6.3.4.jar!/:6.3.4] - at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) ~[spring-web-6.1.14.jar!/:6.1.14] - at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:374) ~[spring-security-web-6.3.4.jar!/:6.3.4] - at org.springframework.security.web.session.DisableEncodeUrlFilter.doFilterInternal(DisableEncodeUrlFilter.java:42) ~[spring-security-web-6.3.4.jar!/:6.3.4] - at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) ~[spring-web-6.1.14.jar!/:6.1.14] - at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:374) ~[spring-security-web-6.3.4.jar!/:6.3.4] - at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:233) ~[spring-security-web-6.3.4.jar!/:6.3.4] - at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:191) ~[spring-security-web-6.3.4.jar!/:6.3.4] - at org.springframework.web.filter.CompositeFilter$VirtualFilterChain.doFilter(CompositeFilter.java:113) ~[spring-web-6.1.14.jar!/:6.1.14] - at org.springframework.web.servlet.handler.HandlerMappingIntrospector.lambda$createCacheFilter$3(HandlerMappingIntrospector.java:195) ~[spring-webmvc-6.1.14.jar!/:6.1.14] - at org.springframework.web.filter.CompositeFilter$VirtualFilterChain.doFilter(CompositeFilter.java:113) ~[spring-web-6.1.14.jar!/:6.1.14] - at org.springframework.web.filter.CompositeFilter.doFilter(CompositeFilter.java:74) ~[spring-web-6.1.14.jar!/:6.1.14] - at org.springframework.security.config.annotation.web.configuration.WebMvcSecurityConfiguration$CompositeFilterChainProxy.doFilter(WebMvcSecurityConfiguration.java:230) ~[spring-security-config-6.3.4.jar!/:6.3.4] - at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:362) ~[spring-web-6.1.14.jar!/:6.1.14] - at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:278) ~[spring-web-6.1.14.jar!/:6.1.14] - at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164) ~[tomcat-embed-core-10.1.31.jar!/:na] - at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) ~[tomcat-embed-core-10.1.31.jar!/:na] - at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) ~[spring-web-6.1.14.jar!/:6.1.14] - at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) ~[spring-web-6.1.14.jar!/:6.1.14] - at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164) ~[tomcat-embed-core-10.1.31.jar!/:na] - at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) ~[tomcat-embed-core-10.1.31.jar!/:na] - at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) ~[spring-web-6.1.14.jar!/:6.1.14] - at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) ~[spring-web-6.1.14.jar!/:6.1.14] - at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164) ~[tomcat-embed-core-10.1.31.jar!/:na] - at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) ~[tomcat-embed-core-10.1.31.jar!/:na] - at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) ~[spring-web-6.1.14.jar!/:6.1.14] - at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) ~[spring-web-6.1.14.jar!/:6.1.14] - at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164) ~[tomcat-embed-core-10.1.31.jar!/:na] - at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) ~[tomcat-embed-core-10.1.31.jar!/:na] - at com.crm.base.filter.TraceIdFilter.doFilterInternal(TraceIdFilter.java:39) ~[crm-base-1.0.0-SNAPSHOT.jar!/:1.0.0-SNAPSHOT] - at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) ~[spring-web-6.1.14.jar!/:6.1.14] - at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164) ~[tomcat-embed-core-10.1.31.jar!/:na] - at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) ~[tomcat-embed-core-10.1.31.jar!/:na] - at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:167) ~[tomcat-embed-core-10.1.31.jar!/:na] - at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:90) ~[tomcat-embed-core-10.1.31.jar!/:na] - at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:483) ~[tomcat-embed-core-10.1.31.jar!/:na] - at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:115) ~[tomcat-embed-core-10.1.31.jar!/:na] - at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:93) ~[tomcat-embed-core-10.1.31.jar!/:na] - at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74) ~[tomcat-embed-core-10.1.31.jar!/:na] - at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:344) ~[tomcat-embed-core-10.1.31.jar!/:na] - at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:384) ~[tomcat-embed-core-10.1.31.jar!/:na] - at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:63) ~[tomcat-embed-core-10.1.31.jar!/:na] - at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:905) ~[tomcat-embed-core-10.1.31.jar!/:na] - at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1741) ~[tomcat-embed-core-10.1.31.jar!/:na] - at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52) ~[tomcat-embed-core-10.1.31.jar!/:na] - at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1190) ~[tomcat-embed-core-10.1.31.jar!/:na] - at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659) ~[tomcat-embed-core-10.1.31.jar!/:na] - at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:63) ~[tomcat-embed-core-10.1.31.jar!/:na] - at java.base/java.lang.Thread.run(Thread.java:1583) ~[na:na] - Suppressed: org.springframework.web.context.request.async.AsyncRequestNotUsableException: Response not usable after response errors. - at org.springframework.web.context.request.async.StandardServletAsyncWebRequest$LifecycleHttpServletResponse.obtainLockOrRaiseException(StandardServletAsyncWebRequest.java:335) ~[spring-web-6.1.14.jar!/:6.1.14] - at org.springframework.web.context.request.async.StandardServletAsyncWebRequest$LifecycleServletOutputStream.write(StandardServletAsyncWebRequest.java:396) ~[spring-web-6.1.14.jar!/:6.1.14] - at org.springframework.util.StreamUtils$NonClosingOutputStream.write(StreamUtils.java:261) ~[spring-core-6.1.14.jar!/:6.1.14] - at com.fasterxml.jackson.core.json.UTF8JsonGenerator._flushBuffer(UTF8JsonGenerator.java:2210) ~[jackson-core-2.17.2.jar!/:2.17.2] - at com.fasterxml.jackson.core.json.UTF8JsonGenerator.close(UTF8JsonGenerator.java:1234) ~[jackson-core-2.17.2.jar!/:2.17.2] - at org.springframework.http.converter.json.AbstractJackson2HttpMessageConverter.writeInternal(AbstractJackson2HttpMessageConverter.java:452) ~[spring-web-6.1.14.jar!/:6.1.14] - ... 102 common frames omitted -Caused by: org.apache.catalina.connector.ClientAbortException: java.io.IOException: 你的主机中的软件中止了一个已建立的连接。 - at org.apache.catalina.connector.OutputBuffer.realWriteBytes(OutputBuffer.java:341) ~[tomcat-embed-core-10.1.31.jar!/:na] - at org.apache.catalina.connector.OutputBuffer.flushByteBuffer(OutputBuffer.java:776) ~[tomcat-embed-core-10.1.31.jar!/:na] - at org.apache.catalina.connector.OutputBuffer.append(OutputBuffer.java:673) ~[tomcat-embed-core-10.1.31.jar!/:na] - at org.apache.catalina.connector.OutputBuffer.writeBytes(OutputBuffer.java:376) ~[tomcat-embed-core-10.1.31.jar!/:na] - at org.apache.catalina.connector.OutputBuffer.write(OutputBuffer.java:354) ~[tomcat-embed-core-10.1.31.jar!/:na] - at org.apache.catalina.connector.CoyoteOutputStream.write(CoyoteOutputStream.java:103) ~[tomcat-embed-core-10.1.31.jar!/:na] - at org.springframework.security.web.util.OnCommittedResponseWrapper$SaveContextServletOutputStream.write(OnCommittedResponseWrapper.java:639) ~[spring-security-web-6.3.4.jar!/:6.3.4] - at org.springframework.web.context.request.async.StandardServletAsyncWebRequest$LifecycleServletOutputStream.write(StandardServletAsyncWebRequest.java:398) ~[spring-web-6.1.14.jar!/:6.1.14] - ... 122 common frames omitted -Caused by: java.io.IOException: 你的主机中的软件中止了一个已建立的连接。 - at java.base/sun.nio.ch.SocketDispatcher.write0(Native Method) ~[na:na] - at java.base/sun.nio.ch.SocketDispatcher.write(SocketDispatcher.java:54) ~[na:na] - at java.base/sun.nio.ch.IOUtil.writeFromNativeBuffer(IOUtil.java:137) ~[na:na] - at java.base/sun.nio.ch.IOUtil.write(IOUtil.java:102) ~[na:na] - at java.base/sun.nio.ch.IOUtil.write(IOUtil.java:58) ~[na:na] - at java.base/sun.nio.ch.SocketChannelImpl.write(SocketChannelImpl.java:542) ~[na:na] - at org.apache.tomcat.util.net.NioChannel.write(NioChannel.java:122) ~[tomcat-embed-core-10.1.31.jar!/:na] - at org.apache.tomcat.util.net.NioEndpoint$NioSocketWrapper.doWrite(NioEndpoint.java:1378) ~[tomcat-embed-core-10.1.31.jar!/:na] - at org.apache.tomcat.util.net.SocketWrapperBase.doWrite(SocketWrapperBase.java:764) ~[tomcat-embed-core-10.1.31.jar!/:na] - at org.apache.tomcat.util.net.SocketWrapperBase.writeBlocking(SocketWrapperBase.java:589) ~[tomcat-embed-core-10.1.31.jar!/:na] - at org.apache.tomcat.util.net.SocketWrapperBase.write(SocketWrapperBase.java:533) ~[tomcat-embed-core-10.1.31.jar!/:na] - at org.apache.coyote.http11.Http11OutputBuffer$SocketOutputBuffer.doWrite(Http11OutputBuffer.java:548) ~[tomcat-embed-core-10.1.31.jar!/:na] - at org.apache.coyote.http11.filters.ChunkedOutputFilter.doWrite(ChunkedOutputFilter.java:111) ~[tomcat-embed-core-10.1.31.jar!/:na] - at org.apache.coyote.http11.Http11OutputBuffer.doWrite(Http11OutputBuffer.java:193) ~[tomcat-embed-core-10.1.31.jar!/:na] - at org.apache.coyote.Response.doWrite(Response.java:633) ~[tomcat-embed-core-10.1.31.jar!/:na] - at org.apache.catalina.connector.OutputBuffer.realWriteBytes(OutputBuffer.java:329) ~[tomcat-embed-core-10.1.31.jar!/:na] - ... 129 common frames omitted - -2026-09-04T00:21:28.410+08:00 INFO 27136 --- [crm-app] [http-nio-8080-exec-10] .c.r.s.i.CustomerReminderRuleServiceImpl : [客户提醒规则] 全量覆盖保存:operator=739564171091247104, masterEnabled=1, firstTrigger=1/1天, secondInterval=1/1天 -2026-09-04T00:21:28.509+08:00 WARN 27136 --- [crm-app] [http-nio-8080-exec-3] c.c.b.a.GlobalExceptionHandlerAdvice : 业务异常:code=64023, msg=首次触发天数与二次提醒间隔天数必须为正整数 -2026-09-04T00:21:28.597+08:00 WARN 27136 --- [crm-app] [http-nio-8080-exec-4] c.c.b.a.GlobalExceptionHandlerAdvice : 业务异常:code=64023, msg=首次触发天数与二次提醒间隔天数必须为正整数 -2026-09-04T00:21:28.831+08:00 INFO 27136 --- [crm-app] [http-nio-8080-exec-5] .c.r.s.i.CustomerReminderRuleServiceImpl : [客户提醒规则] 全量覆盖保存:operator=739564171091247104, masterEnabled=0, firstTrigger=0/2天, secondInterval=0/2天 -2026-09-04T00:21:28.954+08:00 INFO 27136 --- [crm-app] [http-nio-8080-exec-6] .c.r.s.i.CustomerReminderRuleServiceImpl : [客户提醒规则] 全量覆盖保存:operator=739564171091247104, masterEnabled=1, firstTrigger=1/1天, secondInterval=1/1天 -2026-09-04T00:21:31.571+08:00 INFO 31884 --- [crm-app] [main] com.crm.app.CrmAppApplication : Starting CrmAppApplication v1.0.0-SNAPSHOT using Java 21.0.7 with PID 31884 (E:\code\crm-backend-matt\crm-app\target\crm-app-1.0.0-SNAPSHOT.jar started by Administrator in e:\code\crm-backend-matt) -2026-09-04T00:21:31.573+08:00 INFO 31884 --- [crm-app] [main] com.crm.app.CrmAppApplication : The following 1 profile is active: "verify" -2026-09-04T00:21:33.199+08:00 INFO 31884 --- [crm-app] [main] .s.d.r.c.RepositoryConfigurationDelegate : Multiple Spring Data modules found, entering strict repository configuration mode -2026-09-04T00:21:33.202+08:00 INFO 31884 --- [crm-app] [main] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data JPA repositories in DEFAULT mode. -2026-09-04T00:21:33.233+08:00 INFO 31884 --- [crm-app] [main] .s.d.r.c.RepositoryConfigurationDelegate : Finished Spring Data repository scanning in 23 ms. Found 0 JPA repository interfaces. -2026-09-04T00:21:33.254+08:00 INFO 31884 --- [crm-app] [main] .s.d.r.c.RepositoryConfigurationDelegate : Multiple Spring Data modules found, entering strict repository configuration mode -2026-09-04T00:21:33.255+08:00 INFO 31884 --- [crm-app] [main] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data Redis repositories in DEFAULT mode. -2026-09-04T00:21:33.267+08:00 INFO 31884 --- [crm-app] [main] .s.d.r.c.RepositoryConfigurationDelegate : Finished Spring Data repository scanning in 3 ms. Found 0 Redis repository interfaces. -2026-09-04T00:21:33.435+08:00 WARN 31884 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'crmBaseMapper' and 'com.crm.base.mapper.CrmBaseMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:21:33.435+08:00 WARN 31884 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'authIdentityMapper' and 'com.crm.auth.mapper.AuthIdentityMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:21:33.435+08:00 WARN 31884 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'authUserMapper' and 'com.crm.auth.mapper.AuthUserMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:21:33.435+08:00 WARN 31884 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'sysDataScopeModuleMapper' and 'com.crm.auth.mapper.SysDataScopeModuleMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:21:33.435+08:00 WARN 31884 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'sysDeptMapper' and 'com.crm.auth.mapper.SysDeptMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:21:33.435+08:00 WARN 31884 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'sysMenuMapper' and 'com.crm.auth.mapper.SysMenuMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:21:33.435+08:00 WARN 31884 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'sysRoleDataScopeMapper' and 'com.crm.auth.mapper.SysRoleDataScopeMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:21:33.436+08:00 WARN 31884 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'sysRoleMapper' and 'com.crm.auth.mapper.SysRoleMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:21:33.436+08:00 WARN 31884 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'sysRoleMenuMapper' and 'com.crm.auth.mapper.SysRoleMenuMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:21:33.436+08:00 WARN 31884 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'sysUserDeptMapper' and 'com.crm.auth.mapper.SysUserDeptMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:21:33.436+08:00 WARN 31884 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'sysUserRoleMapper' and 'com.crm.auth.mapper.SysUserRoleMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:21:33.436+08:00 WARN 31884 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'fileInfoMapper' and 'com.crm.file.mapper.FileInfoMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:21:33.436+08:00 WARN 31884 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'dictGroupDefaultMapper' and 'com.crm.dict.mapper.DictGroupDefaultMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:21:33.436+08:00 WARN 31884 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'dictGroupMapper' and 'com.crm.dict.mapper.DictGroupMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:21:33.436+08:00 WARN 31884 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'dictItemMapper' and 'com.crm.dict.mapper.DictItemMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:21:33.436+08:00 WARN 31884 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'dictRefCountMapper' and 'com.crm.dict.mapper.DictRefCountMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:21:33.436+08:00 WARN 31884 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'customerReminderRuleMapper' and 'com.crm.rule.mapper.CustomerReminderRuleMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:21:33.436+08:00 WARN 31884 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'leadPoolMapper' and 'com.crm.rule.mapper.LeadPoolMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:21:33.436+08:00 WARN 31884 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'leadPoolMemberMapper' and 'com.crm.rule.mapper.LeadPoolMemberMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:21:33.436+08:00 WARN 31884 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'leadPoolProvinceMapper' and 'com.crm.rule.mapper.LeadPoolProvinceMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:21:33.436+08:00 WARN 31884 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'leadPoolRegionMapper' and 'com.crm.rule.mapper.LeadPoolRegionMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:21:33.437+08:00 WARN 31884 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityPoolRuleDeptMapper' and 'com.crm.rule.mapper.OpportunityPoolRuleDeptMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:21:33.437+08:00 WARN 31884 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityPoolRuleMapper' and 'com.crm.rule.mapper.OpportunityPoolRuleMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:21:33.437+08:00 WARN 31884 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunitySchemeCardFieldMapper' and 'com.crm.rule.mapper.OpportunitySchemeCardFieldMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:21:33.437+08:00 WARN 31884 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunitySchemeCardTemplateDeptMapper' and 'com.crm.rule.mapper.OpportunitySchemeCardTemplateDeptMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:21:33.438+08:00 WARN 31884 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunitySchemeCardTemplateMapper' and 'com.crm.rule.mapper.OpportunitySchemeCardTemplateMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:21:33.438+08:00 WARN 31884 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunitySchemeFieldDefMapper' and 'com.crm.rule.mapper.OpportunitySchemeFieldDefMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:21:33.438+08:00 WARN 31884 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityStageNodeMapper' and 'com.crm.rule.mapper.OpportunityStageNodeMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:21:33.438+08:00 WARN 31884 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityStageTemplateDeptMapper' and 'com.crm.rule.mapper.OpportunityStageTemplateDeptMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:21:33.438+08:00 WARN 31884 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityStageTemplateMapper' and 'com.crm.rule.mapper.OpportunityStageTemplateMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:21:33.438+08:00 WARN 31884 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'sysRegionMapper' and 'com.crm.rule.mapper.SysRegionMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:21:33.438+08:00 WARN 31884 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'userColumnPreferenceMapper' and 'com.crm.preference.mapper.UserColumnPreferenceMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:21:33.438+08:00 WARN 31884 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'userSavedViewMapper' and 'com.crm.preference.mapper.UserSavedViewMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:21:33.439+08:00 WARN 31884 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'leadAttachmentMapper' and 'com.crm.lead.mapper.LeadAttachmentMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:21:33.439+08:00 WARN 31884 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'leadFeedbackMapper' and 'com.crm.lead.mapper.LeadFeedbackMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:21:33.439+08:00 WARN 31884 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'leadFollowMapper' and 'com.crm.lead.mapper.LeadFollowMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:21:33.439+08:00 WARN 31884 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'leadHistoryMapper' and 'com.crm.lead.mapper.LeadHistoryMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:21:33.439+08:00 WARN 31884 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'leadMapper' and 'com.crm.lead.mapper.LeadMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:21:33.439+08:00 WARN 31884 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityAttachmentMapper' and 'com.crm.opportunity.mapper.OpportunityAttachmentMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:21:33.439+08:00 WARN 31884 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityCustomerMapper' and 'com.crm.opportunity.mapper.OpportunityCustomerMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:21:33.439+08:00 WARN 31884 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityFocusMapper' and 'com.crm.opportunity.mapper.OpportunityFocusMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:21:33.439+08:00 WARN 31884 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityFollowMapper' and 'com.crm.opportunity.mapper.OpportunityFollowMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:21:33.439+08:00 WARN 31884 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityMapper' and 'com.crm.opportunity.mapper.OpportunityMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:21:33.439+08:00 WARN 31884 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityOplogMapper' and 'com.crm.opportunity.mapper.OpportunityOplogMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:21:33.439+08:00 WARN 31884 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityPendingNoticeMapper' and 'com.crm.opportunity.mapper.OpportunityPendingNoticeMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:21:33.439+08:00 WARN 31884 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunitySchemeCardMapper' and 'com.crm.opportunity.mapper.OpportunitySchemeCardMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:21:33.440+08:00 WARN 31884 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunitySchemeCardValueMapper' and 'com.crm.opportunity.mapper.OpportunitySchemeCardValueMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:21:33.440+08:00 WARN 31884 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunitySiteSurveyMapper' and 'com.crm.opportunity.mapper.OpportunitySiteSurveyMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:21:33.440+08:00 WARN 31884 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityStageHistoryMapper' and 'com.crm.opportunity.mapper.OpportunityStageHistoryMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:21:33.440+08:00 WARN 31884 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityStatusHistoryMapper' and 'com.crm.opportunity.mapper.OpportunityStatusHistoryMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:21:33.440+08:00 WARN 31884 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityTeamMapper' and 'com.crm.opportunity.mapper.OpportunityTeamMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:21:33.440+08:00 WARN 31884 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityViewLogMapper' and 'com.crm.opportunity.mapper.OpportunityViewLogMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:21:33.440+08:00 WARN 31884 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityWorkPlanMapper' and 'com.crm.opportunity.mapper.OpportunityWorkPlanMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:21:33.440+08:00 WARN 31884 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'customerContactMapper' and 'com.crm.customer.mapper.CustomerContactMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:21:33.440+08:00 WARN 31884 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'customerFocusMapper' and 'com.crm.customer.mapper.CustomerFocusMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:21:33.441+08:00 WARN 31884 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'customerFollowMapper' and 'com.crm.customer.mapper.CustomerFollowMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:21:33.441+08:00 WARN 31884 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'customerImportFailMapper' and 'com.crm.customer.mapper.CustomerImportFailMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:21:33.441+08:00 WARN 31884 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'customerImportTaskMapper' and 'com.crm.customer.mapper.CustomerImportTaskMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:21:33.441+08:00 WARN 31884 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'customerMapper' and 'com.crm.customer.mapper.CustomerMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:21:33.441+08:00 WARN 31884 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'customerOplogMapper' and 'com.crm.customer.mapper.CustomerOplogMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:21:33.441+08:00 WARN 31884 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'customerPendingNoticeMapper' and 'com.crm.customer.mapper.CustomerPendingNoticeMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:21:33.441+08:00 WARN 31884 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'customerTeamMemberMapper' and 'com.crm.customer.mapper.CustomerTeamMemberMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:21:33.441+08:00 WARN 31884 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'customerTransferDetailMapper' and 'com.crm.customer.mapper.CustomerTransferDetailMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:21:33.441+08:00 WARN 31884 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'customerTransferMapper' and 'com.crm.customer.mapper.CustomerTransferMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:21:33.441+08:00 WARN 31884 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'customerViewLogMapper' and 'com.crm.customer.mapper.CustomerViewLogMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:21:33.442+08:00 WARN 31884 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : No MyBatis mapper was found in '[com.crm.**.mapper]' package. Please check your configuration. -2026-09-04T00:21:33.455+08:00 WARN 31884 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'crmBaseMapper' and 'com.crm.base.mapper.CrmBaseMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:21:33.455+08:00 WARN 31884 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'authIdentityMapper' and 'com.crm.auth.mapper.AuthIdentityMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:21:33.455+08:00 WARN 31884 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'authUserMapper' and 'com.crm.auth.mapper.AuthUserMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:21:33.455+08:00 WARN 31884 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'sysDataScopeModuleMapper' and 'com.crm.auth.mapper.SysDataScopeModuleMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:21:33.456+08:00 WARN 31884 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'sysDeptMapper' and 'com.crm.auth.mapper.SysDeptMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:21:33.456+08:00 WARN 31884 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'sysMenuMapper' and 'com.crm.auth.mapper.SysMenuMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:21:33.456+08:00 WARN 31884 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'sysRoleDataScopeMapper' and 'com.crm.auth.mapper.SysRoleDataScopeMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:21:33.456+08:00 WARN 31884 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'sysRoleMapper' and 'com.crm.auth.mapper.SysRoleMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:21:33.456+08:00 WARN 31884 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'sysRoleMenuMapper' and 'com.crm.auth.mapper.SysRoleMenuMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:21:33.456+08:00 WARN 31884 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'sysUserDeptMapper' and 'com.crm.auth.mapper.SysUserDeptMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:21:33.456+08:00 WARN 31884 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'sysUserRoleMapper' and 'com.crm.auth.mapper.SysUserRoleMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:21:33.456+08:00 WARN 31884 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'fileInfoMapper' and 'com.crm.file.mapper.FileInfoMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:21:33.456+08:00 WARN 31884 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'dictGroupDefaultMapper' and 'com.crm.dict.mapper.DictGroupDefaultMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:21:33.456+08:00 WARN 31884 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'dictGroupMapper' and 'com.crm.dict.mapper.DictGroupMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:21:33.456+08:00 WARN 31884 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'dictItemMapper' and 'com.crm.dict.mapper.DictItemMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:21:33.457+08:00 WARN 31884 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'dictRefCountMapper' and 'com.crm.dict.mapper.DictRefCountMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:21:33.457+08:00 WARN 31884 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'customerReminderRuleMapper' and 'com.crm.rule.mapper.CustomerReminderRuleMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:21:33.457+08:00 WARN 31884 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'leadPoolMapper' and 'com.crm.rule.mapper.LeadPoolMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:21:33.457+08:00 WARN 31884 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'leadPoolMemberMapper' and 'com.crm.rule.mapper.LeadPoolMemberMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:21:33.457+08:00 WARN 31884 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'leadPoolProvinceMapper' and 'com.crm.rule.mapper.LeadPoolProvinceMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:21:33.457+08:00 WARN 31884 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'leadPoolRegionMapper' and 'com.crm.rule.mapper.LeadPoolRegionMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:21:33.457+08:00 WARN 31884 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityPoolRuleDeptMapper' and 'com.crm.rule.mapper.OpportunityPoolRuleDeptMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:21:33.457+08:00 WARN 31884 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityPoolRuleMapper' and 'com.crm.rule.mapper.OpportunityPoolRuleMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:21:33.457+08:00 WARN 31884 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunitySchemeCardFieldMapper' and 'com.crm.rule.mapper.OpportunitySchemeCardFieldMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:21:33.457+08:00 WARN 31884 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunitySchemeCardTemplateDeptMapper' and 'com.crm.rule.mapper.OpportunitySchemeCardTemplateDeptMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:21:33.457+08:00 WARN 31884 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunitySchemeCardTemplateMapper' and 'com.crm.rule.mapper.OpportunitySchemeCardTemplateMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:21:33.457+08:00 WARN 31884 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunitySchemeFieldDefMapper' and 'com.crm.rule.mapper.OpportunitySchemeFieldDefMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:21:33.457+08:00 WARN 31884 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityStageNodeMapper' and 'com.crm.rule.mapper.OpportunityStageNodeMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:21:33.457+08:00 WARN 31884 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityStageTemplateDeptMapper' and 'com.crm.rule.mapper.OpportunityStageTemplateDeptMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:21:33.457+08:00 WARN 31884 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityStageTemplateMapper' and 'com.crm.rule.mapper.OpportunityStageTemplateMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:21:33.457+08:00 WARN 31884 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'sysRegionMapper' and 'com.crm.rule.mapper.SysRegionMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:21:33.457+08:00 WARN 31884 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'userColumnPreferenceMapper' and 'com.crm.preference.mapper.UserColumnPreferenceMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:21:33.458+08:00 WARN 31884 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'userSavedViewMapper' and 'com.crm.preference.mapper.UserSavedViewMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:21:33.458+08:00 WARN 31884 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'leadAttachmentMapper' and 'com.crm.lead.mapper.LeadAttachmentMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:21:33.458+08:00 WARN 31884 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'leadFeedbackMapper' and 'com.crm.lead.mapper.LeadFeedbackMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:21:33.458+08:00 WARN 31884 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'leadFollowMapper' and 'com.crm.lead.mapper.LeadFollowMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:21:33.458+08:00 WARN 31884 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'leadHistoryMapper' and 'com.crm.lead.mapper.LeadHistoryMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:21:33.458+08:00 WARN 31884 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'leadMapper' and 'com.crm.lead.mapper.LeadMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:21:33.458+08:00 WARN 31884 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityAttachmentMapper' and 'com.crm.opportunity.mapper.OpportunityAttachmentMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:21:33.458+08:00 WARN 31884 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityCustomerMapper' and 'com.crm.opportunity.mapper.OpportunityCustomerMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:21:33.458+08:00 WARN 31884 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityFocusMapper' and 'com.crm.opportunity.mapper.OpportunityFocusMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:21:33.458+08:00 WARN 31884 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityFollowMapper' and 'com.crm.opportunity.mapper.OpportunityFollowMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:21:33.458+08:00 WARN 31884 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityMapper' and 'com.crm.opportunity.mapper.OpportunityMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:21:33.458+08:00 WARN 31884 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityOplogMapper' and 'com.crm.opportunity.mapper.OpportunityOplogMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:21:33.458+08:00 WARN 31884 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityPendingNoticeMapper' and 'com.crm.opportunity.mapper.OpportunityPendingNoticeMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:21:33.458+08:00 WARN 31884 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunitySchemeCardMapper' and 'com.crm.opportunity.mapper.OpportunitySchemeCardMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:21:33.458+08:00 WARN 31884 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunitySchemeCardValueMapper' and 'com.crm.opportunity.mapper.OpportunitySchemeCardValueMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:21:33.458+08:00 WARN 31884 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunitySiteSurveyMapper' and 'com.crm.opportunity.mapper.OpportunitySiteSurveyMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:21:33.458+08:00 WARN 31884 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityStageHistoryMapper' and 'com.crm.opportunity.mapper.OpportunityStageHistoryMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:21:33.458+08:00 WARN 31884 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityStatusHistoryMapper' and 'com.crm.opportunity.mapper.OpportunityStatusHistoryMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:21:33.458+08:00 WARN 31884 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityTeamMapper' and 'com.crm.opportunity.mapper.OpportunityTeamMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:21:33.459+08:00 WARN 31884 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityViewLogMapper' and 'com.crm.opportunity.mapper.OpportunityViewLogMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:21:33.459+08:00 WARN 31884 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityWorkPlanMapper' and 'com.crm.opportunity.mapper.OpportunityWorkPlanMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:21:33.459+08:00 WARN 31884 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'customerContactMapper' and 'com.crm.customer.mapper.CustomerContactMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:21:33.459+08:00 WARN 31884 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'customerFocusMapper' and 'com.crm.customer.mapper.CustomerFocusMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:21:33.459+08:00 WARN 31884 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'customerFollowMapper' and 'com.crm.customer.mapper.CustomerFollowMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:21:33.459+08:00 WARN 31884 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'customerImportFailMapper' and 'com.crm.customer.mapper.CustomerImportFailMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:21:33.459+08:00 WARN 31884 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'customerImportTaskMapper' and 'com.crm.customer.mapper.CustomerImportTaskMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:21:33.459+08:00 WARN 31884 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'customerMapper' and 'com.crm.customer.mapper.CustomerMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:21:33.459+08:00 WARN 31884 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'customerOplogMapper' and 'com.crm.customer.mapper.CustomerOplogMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:21:33.459+08:00 WARN 31884 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'customerPendingNoticeMapper' and 'com.crm.customer.mapper.CustomerPendingNoticeMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:21:33.459+08:00 WARN 31884 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'customerTeamMemberMapper' and 'com.crm.customer.mapper.CustomerTeamMemberMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:21:33.459+08:00 WARN 31884 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'customerTransferDetailMapper' and 'com.crm.customer.mapper.CustomerTransferDetailMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:21:33.459+08:00 WARN 31884 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'customerTransferMapper' and 'com.crm.customer.mapper.CustomerTransferMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:21:33.459+08:00 WARN 31884 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'customerViewLogMapper' and 'com.crm.customer.mapper.CustomerViewLogMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:21:33.459+08:00 WARN 31884 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : No MyBatis mapper was found in '[com.crm.**.mapper]' package. Please check your configuration. -2026-09-04T00:21:34.358+08:00 INFO 31884 --- [crm-app] [main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port 8080 (http) -2026-09-04T00:21:34.378+08:00 INFO 31884 --- [crm-app] [main] o.apache.catalina.core.StandardService : Starting service [Tomcat] -2026-09-04T00:21:34.378+08:00 INFO 31884 --- [crm-app] [main] o.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/10.1.31] -2026-09-04T00:21:34.422+08:00 INFO 31884 --- [crm-app] [main] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext -2026-09-04T00:21:34.422+08:00 INFO 31884 --- [crm-app] [main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 2786 ms -2026-09-04T00:21:34.927+08:00 INFO 31884 --- [crm-app] [main] com.crm.auth.config.PermissionConfig : 数据权限受控表扫描完成:0 张 -2026-09-04T00:21:35.052+08:00 INFO 31884 --- [crm-app] [main] com.crm.base.config.CustomIdGenerator : 雪花ID生成器初始化完成,workerId=0, datacenterId=0 -2026-09-04T00:21:35.645+08:00 INFO 31884 --- [crm-app] [main] o.hibernate.jpa.internal.util.LogHelper : HHH000204: Processing PersistenceUnitInfo [name: default] -2026-09-04T00:21:35.712+08:00 INFO 31884 --- [crm-app] [main] org.hibernate.Version : HHH000412: Hibernate ORM core version 6.5.3.Final -2026-09-04T00:21:35.754+08:00 INFO 31884 --- [crm-app] [main] o.h.c.internal.RegionFactoryInitiator : HHH000026: Second-level cache disabled -2026-09-04T00:21:36.072+08:00 INFO 31884 --- [crm-app] [main] o.s.o.j.p.SpringPersistenceUnitInfo : No LoadTimeWeaver setup: ignoring JPA class transformer -2026-09-04T00:21:36.112+08:00 INFO 31884 --- [crm-app] [main] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Starting... -2026-09-04T00:21:36.693+08:00 INFO 31884 --- [crm-app] [main] com.zaxxer.hikari.pool.HikariPool : HikariPool-1 - Added connection com.mysql.cj.jdbc.ConnectionImpl@6a486afb -2026-09-04T00:21:36.695+08:00 INFO 31884 --- [crm-app] [main] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Start completed. -2026-09-04T00:21:36.833+08:00 WARN 31884 --- [crm-app] [main] org.hibernate.orm.deprecation : HHH90000025: MySQLDialect does not need to be specified explicitly using 'hibernate.dialect' (remove the property setting and it will be selected by default) -2026-09-04T00:21:38.720+08:00 INFO 31884 --- [crm-app] [main] o.h.e.t.j.p.i.JtaPlatformInitiator : HHH000489: No JTA platform available (set 'hibernate.transaction.jta.platform' to enable JTA platform integration) -2026-09-04T00:21:53.301+08:00 INFO 31884 --- [crm-app] [main] j.LocalContainerEntityManagerFactoryBean : Initialized JPA EntityManagerFactory for persistence unit 'default' -2026-09-04T00:21:53.648+08:00 WARN 31884 --- [crm-app] [main] c.c.a.controller.DebugTokenController : ============================================================ -2026-09-04T00:21:53.648+08:00 WARN 31884 --- [crm-app] [main] c.c.a.controller.DebugTokenController : 调试 token 接口 /api/auth/debug/token 已启用(verify profile) -2026-09-04T00:21:53.648+08:00 WARN 31884 --- [crm-app] [main] c.c.a.controller.DebugTokenController : 严禁用于生产环境!任何知道 userId 的人可冒充该用户。 -2026-09-04T00:21:53.648+08:00 WARN 31884 --- [crm-app] [main] c.c.a.controller.DebugTokenController : 参见 docs/adr/0014-verify-profile-debug-token-endpoint.md -2026-09-04T00:21:53.648+08:00 WARN 31884 --- [crm-app] [main] c.c.a.controller.DebugTokenController : ============================================================ -2026-09-04T00:21:55.340+08:00 INFO 31884 --- [crm-app] [main] c.c.c.p.i.NgramNameSimilarityPortImpl : CustomerNameSimilarityPort 一期实现就绪(预筛模式:FULLTEXT ngram) -2026-09-04T00:21:55.491+08:00 INFO 31884 --- [crm-app] [main] c.c.c.p.impl.StubCompanyLookupPortImpl : CompanyLookupPort 一期 stub 已装配(企查查未接入,工商候选返回空) -2026-09-04T00:21:55.705+08:00 INFO 31884 --- [crm-app] [main] c.c.c.p.i.NoopProjectOwnerSyncPortImpl : ProjectOwnerSyncPort no-op 默认实现已装配(A5 项目模块未建,owner 同步跳过) -2026-09-04T00:21:55.770+08:00 INFO 31884 --- [crm-app] [main] c.c.p.i.NoopOpportunityOwnerSyncPortImpl : OpportunityOwnerSyncPort no-op 默认实现已装配(票 11 接商机真源后替换) -2026-09-04T00:21:55.943+08:00 WARN 31884 --- [crm-app] [main] .s.s.UserDetailsServiceAutoConfiguration : - -Using generated security password: a0293f12-0060-44e6-a9c6-36f407384737 - -This generated password is for development use only. Your security configuration must be updated before running your application in production. + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na] + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) ~[na:na] + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na] + at java.base/java.lang.reflect.Method.invoke(Method.java:568) ~[na:na] + at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:355) ~[spring-aop-6.1.14.jar!/:6.1.14] + at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:196) ~[spring-aop-6.1.14.jar!/:6.1.14] + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) ~[spring-aop-6.1.14.jar!/:6.1.14] + at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:768) ~[spring-aop-6.1.14.jar!/:6.1.14] + at org.springframework.aop.interceptor.AsyncExecutionInterceptor.lambda$invoke$0(AsyncExecutionInterceptor.java:113) ~[spring-aop-6.1.14.jar!/:6.1.14] + at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264) ~[na:na] + at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136) ~[na:na] + at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635) ~[na:na] + at java.base/java.lang.Thread.run(Thread.java:842) ~[na:na] +Caused by: com.mysql.cj.jdbc.exceptions.MysqlDataTruncation: Data truncation: Data too long for column 'fail_reason' at row 1 + at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:104) ~[mysql-connector-j-8.3.0.jar!/:8.3.0] + at com.mysql.cj.jdbc.ClientPreparedStatement.executeInternal(ClientPreparedStatement.java:912) ~[mysql-connector-j-8.3.0.jar!/:8.3.0] + at com.mysql.cj.jdbc.ClientPreparedStatement.execute(ClientPreparedStatement.java:354) ~[mysql-connector-j-8.3.0.jar!/:8.3.0] + at com.zaxxer.hikari.pool.ProxyPreparedStatement.execute(ProxyPreparedStatement.java:44) ~[HikariCP-5.1.0.jar!/:na] + at com.zaxxer.hikari.pool.HikariProxyPreparedStatement.execute(HikariProxyPreparedStatement.java) ~[HikariCP-5.1.0.jar!/:na] + at org.apache.ibatis.executor.statement.PreparedStatementHandler.update(PreparedStatementHandler.java:48) ~[mybatis-3.5.16.jar!/:3.5.16] + at org.apache.ibatis.executor.statement.RoutingStatementHandler.update(RoutingStatementHandler.java:75) ~[mybatis-3.5.16.jar!/:3.5.16] + at jdk.internal.reflect.GeneratedMethodAccessor72.invoke(Unknown Source) ~[na:na] + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na] + at java.base/java.lang.reflect.Method.invoke(Method.java:568) ~[na:na] + at org.apache.ibatis.plugin.Plugin.invoke(Plugin.java:61) ~[mybatis-3.5.16.jar!/:3.5.16] + at jdk.proxy2/jdk.proxy2.$Proxy257.update(Unknown Source) ~[na:na] + at jdk.internal.reflect.GeneratedMethodAccessor72.invoke(Unknown Source) ~[na:na] + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na] + at java.base/java.lang.reflect.Method.invoke(Method.java:568) ~[na:na] + at org.apache.ibatis.plugin.Plugin.invoke(Plugin.java:61) ~[mybatis-3.5.16.jar!/:3.5.16] + at jdk.proxy2/jdk.proxy2.$Proxy257.update(Unknown Source) ~[na:na] + at org.apache.ibatis.executor.SimpleExecutor.doUpdate(SimpleExecutor.java:50) ~[mybatis-3.5.16.jar!/:3.5.16] + at org.apache.ibatis.executor.BaseExecutor.update(BaseExecutor.java:117) ~[mybatis-3.5.16.jar!/:3.5.16] + at org.apache.ibatis.executor.CachingExecutor.update(CachingExecutor.java:76) ~[mybatis-3.5.16.jar!/:3.5.16] + at jdk.internal.reflect.GeneratedMethodAccessor79.invoke(Unknown Source) ~[na:na] + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na] + at java.base/java.lang.reflect.Method.invoke(Method.java:568) ~[na:na] + at org.apache.ibatis.plugin.Invocation.proceed(Invocation.java:61) ~[mybatis-3.5.16.jar!/:3.5.16] + at com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor.intercept(MybatisPlusInterceptor.java:106) ~[mybatis-plus-extension-3.5.7.jar!/:3.5.7] + at org.apache.ibatis.plugin.Plugin.invoke(Plugin.java:59) ~[mybatis-3.5.16.jar!/:3.5.16] + at jdk.proxy2/jdk.proxy2.$Proxy256.update(Unknown Source) ~[na:na] + at org.apache.ibatis.session.defaults.DefaultSqlSession.update(DefaultSqlSession.java:197) ~[mybatis-3.5.16.jar!/:3.5.16] + at org.apache.ibatis.session.defaults.DefaultSqlSession.insert(DefaultSqlSession.java:184) ~[mybatis-3.5.16.jar!/:3.5.16] + at jdk.internal.reflect.GeneratedMethodAccessor185.invoke(Unknown Source) ~[na:na] + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na] + at java.base/java.lang.reflect.Method.invoke(Method.java:568) ~[na:na] + at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:425) ~[mybatis-spring-3.0.3.jar!/:3.0.3] + ... 22 common frames omitted -2026-09-04T00:21:55.960+08:00 INFO 31884 --- [crm-app] [main] r$InitializeUserDetailsManagerConfigurer : Global AuthenticationManager configured with UserDetailsService bean with name inMemoryUserDetailsManager -2026-09-04T00:21:56.964+08:00 INFO 31884 --- [crm-app] [main] c.c.a.c.DataScopeModuleStartupValidator : 数据权限模块校验通过:0 张受控表,4 个注册模块 -2026-09-04T00:21:56.987+08:00 INFO 31884 --- [crm-app] [main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port 8080 (http) with context path '/' -2026-09-04T00:21:57.017+08:00 INFO 31884 --- [crm-app] [main] com.crm.app.CrmAppApplication : Started CrmAppApplication in 25.89 seconds (process running for 26.498) -2026-09-04T00:21:57.021+08:00 INFO 31884 --- [crm-app] [main] com.crm.auth.config.DataInitializer : 执行权限数据初始化检查... -2026-09-04T00:21:57.400+08:00 INFO 31884 --- [crm-app] [http-nio-8080-exec-1] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring DispatcherServlet 'dispatcherServlet' -2026-09-04T00:21:57.400+08:00 INFO 31884 --- [crm-app] [http-nio-8080-exec-1] o.s.web.servlet.DispatcherServlet : Initializing Servlet 'dispatcherServlet' -2026-09-04T00:21:57.403+08:00 INFO 31884 --- [crm-app] [http-nio-8080-exec-1] o.s.web.servlet.DispatcherServlet : Completed initialization in 2 ms -2026-09-04T00:21:57.785+08:00 INFO 31884 --- [crm-app] [main] com.crm.auth.config.DataInitializer : 权限数据初始化检查完成 -2026-09-04T00:21:57.785+08:00 INFO 31884 --- [crm-app] [main] c.c.d.config.DictPermissionInitializer : 执行数据字典权限种子化检查... -2026-09-04T00:21:58.196+08:00 INFO 31884 --- [crm-app] [main] c.c.d.config.DictPermissionInitializer : 数据字典权限种子化检查完成:10 个权限点 -2026-09-04T00:21:58.196+08:00 INFO 31884 --- [crm-app] [main] c.c.r.config.RulePermissionInitializer : 执行线索规则权限种子化检查(仅菜单)... -2026-09-04T00:21:58.301+08:00 INFO 31884 --- [crm-app] [main] c.c.r.config.RulePermissionInitializer : 线索规则权限种子化检查完成:仅菜单(0 个 button) -2026-09-04T00:21:58.301+08:00 INFO 31884 --- [crm-app] [main] c.crm.rule.config.RegionDataInitializer : 执行行政区划全量种子导入检查... -2026-09-04T00:21:59.424+08:00 INFO 31884 --- [crm-app] [main] c.crm.rule.config.RegionDataInitializer : 行政区划种子导入完成:对账 3432 行(省 34 / 市 342 / 区 3056),存量 3432 行,新增 0 行 -2026-09-04T00:21:59.424+08:00 INFO 31884 --- [crm-app] [main] c.c.l.config.LeadPermissionInitializer : 执行线索管理权限种子化检查(仅菜单)... -2026-09-04T00:21:59.817+08:00 INFO 31884 --- [crm-app] [main] c.c.l.config.LeadPermissionInitializer : 线索管理权限种子化检查完成:4 个菜单(0 个 button) -2026-09-04T00:21:59.818+08:00 INFO 31884 --- [crm-app] [main] r.c.OpportunityRulePermissionInitializer : 执行商机规则权限种子化检查(仅菜单)... -2026-09-04T00:21:59.917+08:00 INFO 31884 --- [crm-app] [main] r.c.OpportunityRulePermissionInitializer : 商机规则权限种子化检查完成:仅菜单(0 个 button) -2026-09-04T00:21:59.917+08:00 INFO 31884 --- [crm-app] [main] ustomerReminderRulePermissionInitializer : 执行客户提醒规则权限种子化检查(仅菜单)... -2026-09-04T00:22:00.015+08:00 INFO 31884 --- [crm-app] [main] ustomerReminderRulePermissionInitializer : 客户提醒规则权限种子化检查完成:仅菜单(0 个 button) -2026-09-04T00:22:00.015+08:00 INFO 31884 --- [crm-app] [main] tunityStageTemplatePermissionInitializer : 执行商机阶段模板权限种子化检查(仅菜单)... -2026-09-04T00:22:00.020+08:00 INFO 31884 --- [crm-app] [scheduling-1] c.crm.customer.job.CustomerReminderJob : [客户提醒Job] 开始,now=2026-09-04T00:22:00.020526 -2026-09-04T00:22:00.104+08:00 INFO 31884 --- [crm-app] [scheduling-1] c.crm.customer.job.CustomerReminderJob : [客户提醒Job] 完成:新增待发 0 条,旧锚点失效 0 条 -2026-09-04T00:22:00.115+08:00 INFO 31884 --- [crm-app] [main] tunityStageTemplatePermissionInitializer : 商机阶段模板权限种子化检查完成:仅菜单(0 个 button) -2026-09-04T00:22:00.115+08:00 INFO 31884 --- [crm-app] [main] c.c.r.config.SchemeFieldDefInitializer : 执行方案卡系统字段库种子化检查... -2026-09-04T00:22:00.129+08:00 INFO 31884 --- [crm-app] [main] c.c.r.config.SchemeFieldDefInitializer : 方案卡系统字段库种子化检查完成:现存 16 个,新增 0 个 -2026-09-04T00:22:00.144+08:00 INFO 31884 --- [crm-app] [main] c.c.r.config.SchemeFieldDefInitializer : 方案卡兜底模板已存在(code=OPP_SCHEME_TPL_01,含已停用),跳过种子化 -2026-09-04T00:22:00.144+08:00 INFO 31884 --- [crm-app] [main] ySchemeCardTemplatePermissionInitializer : 执行方案卡模板权限种子化检查(仅菜单)... -2026-09-04T00:22:00.244+08:00 INFO 31884 --- [crm-app] [main] ySchemeCardTemplatePermissionInitializer : 方案卡模板权限种子化检查完成:仅菜单(0 个 button) -2026-09-04T00:22:00.257+08:00 INFO 31884 --- [crm-app] [main] c.c.r.config.StageTemplateInitializer : 默认阶段模板已存在(code=OPP_STAGE_TPL_01,含已停用),跳过种子化 -2026-09-04T00:22:00.270+08:00 INFO 31884 --- [crm-app] [main] c.c.r.c.CustomerReminderRuleInitializer : 客户提醒规则单例已存在(id=1),跳过种子化 -2026-09-04T00:22:00.282+08:00 INFO 31884 --- [crm-app] [main] c.c.c.c.CustomerFulltextIndexInitializer : customer FULLTEXT 索引 idx_name_fulltext 已存在,跳过 -2026-09-04T00:22:00.282+08:00 INFO 31884 --- [crm-app] [main] c.crm.dict.config.DictDataInitializer : 执行内置字典幂等初始化检查... -2026-09-04T00:22:09.922+08:00 INFO 31884 --- [crm-app] [main] c.crm.dict.config.DictDataInitializer : 内置字典幂等初始化检查完成:24 个分组 -2026-09-04T00:22:30.011+08:00 INFO 31884 --- [crm-app] [scheduling-1] c.crm.customer.job.CustomerReminderJob : [客户提醒Job] 开始,now=2026-09-04T00:22:30.011741800 -2026-09-04T00:22:30.073+08:00 INFO 31884 --- [crm-app] [scheduling-1] c.crm.customer.job.CustomerReminderJob : [客户提醒Job] 完成:新增待发 0 条,旧锚点失效 0 条 -2026-09-04T00:23:00.008+08:00 INFO 31884 --- [crm-app] [scheduling-1] c.crm.customer.job.CustomerReminderJob : [客户提醒Job] 开始,now=2026-09-04T00:23:00.008669400 -2026-09-04T00:23:00.058+08:00 INFO 31884 --- [crm-app] [scheduling-1] c.crm.customer.job.CustomerReminderJob : [客户提醒Job] 完成:新增待发 0 条,旧锚点失效 0 条 -2026-09-04T00:23:30.003+08:00 INFO 31884 --- [crm-app] [scheduling-1] c.crm.customer.job.CustomerReminderJob : [客户提醒Job] 开始,now=2026-09-04T00:23:30.003643100 -2026-09-04T00:23:30.052+08:00 INFO 31884 --- [crm-app] [scheduling-1] c.crm.customer.job.CustomerReminderJob : [客户提醒Job] 完成:新增待发 0 条,旧锚点失效 0 条 -2026-09-04T00:24:00.005+08:00 INFO 31884 --- [crm-app] [scheduling-1] c.crm.customer.job.CustomerReminderJob : [客户提醒Job] 开始,now=2026-09-04T00:24:00.005309 -2026-09-04T00:24:00.056+08:00 INFO 31884 --- [crm-app] [scheduling-1] c.crm.customer.job.CustomerReminderJob : [客户提醒Job] 完成:新增待发 0 条,旧锚点失效 0 条 -2026-09-04T00:24:30.014+08:00 INFO 31884 --- [crm-app] [scheduling-1] c.crm.customer.job.CustomerReminderJob : [客户提醒Job] 开始,now=2026-09-04T00:24:30.014679 -2026-09-04T00:24:30.065+08:00 INFO 31884 --- [crm-app] [scheduling-1] c.crm.customer.job.CustomerReminderJob : [客户提醒Job] 完成:新增待发 0 条,旧锚点失效 0 条 -2026-09-04T00:25:00.010+08:00 INFO 31884 --- [crm-app] [scheduling-1] c.crm.customer.job.CustomerReminderJob : [客户提醒Job] 开始,now=2026-09-04T00:25:00.010966400 -2026-09-04T00:25:00.059+08:00 INFO 31884 --- [crm-app] [scheduling-1] c.crm.customer.job.CustomerReminderJob : [客户提醒Job] 完成:新增待发 0 条,旧锚点失效 0 条 -2026-09-04T00:25:30.012+08:00 INFO 31884 --- [crm-app] [scheduling-1] c.crm.customer.job.CustomerReminderJob : [客户提醒Job] 开始,now=2026-09-04T00:25:30.012401400 -2026-09-04T00:25:30.061+08:00 INFO 31884 --- [crm-app] [scheduling-1] c.crm.customer.job.CustomerReminderJob : [客户提醒Job] 完成:新增待发 0 条,旧锚点失效 0 条 -2026-09-04T00:26:00.016+08:00 INFO 31884 --- [crm-app] [scheduling-1] c.crm.customer.job.CustomerReminderJob : [客户提醒Job] 开始,now=2026-09-04T00:26:00.016382400 -2026-09-04T00:26:00.064+08:00 INFO 31884 --- [crm-app] [scheduling-1] c.crm.customer.job.CustomerReminderJob : [客户提醒Job] 完成:新增待发 0 条,旧锚点失效 0 条 -2026-09-04T00:26:30.014+08:00 INFO 31884 --- [crm-app] [scheduling-1] c.crm.customer.job.CustomerReminderJob : [客户提醒Job] 开始,now=2026-09-04T00:26:30.014995500 -2026-09-04T00:26:30.064+08:00 INFO 31884 --- [crm-app] [scheduling-1] c.crm.customer.job.CustomerReminderJob : [客户提醒Job] 完成:新增待发 0 条,旧锚点失效 0 条 -2026-09-04T00:26:31.160+08:00 WARN 31884 --- [crm-app] [http-nio-8080-exec-9] c.c.b.a.GlobalExceptionHandlerAdvice : 业务异常:code=67003, msg=统一社会信用代码已被占用:系统已存在该企业 -2026-09-04T00:27:00.000+08:00 INFO 31884 --- [crm-app] [scheduling-1] c.crm.customer.job.CustomerReminderJob : [客户提醒Job] 开始,now=2026-09-04T00:27:00.000703600 -2026-09-04T00:27:00.050+08:00 INFO 31884 --- [crm-app] [scheduling-1] c.crm.customer.job.CustomerReminderJob : [客户提醒Job] 完成:新增待发 0 条,旧锚点失效 0 条 -2026-09-04T00:27:30.010+08:00 INFO 31884 --- [crm-app] [scheduling-1] c.crm.customer.job.CustomerReminderJob : [客户提醒Job] 开始,now=2026-09-04T00:27:30.010222400 -2026-09-04T00:27:30.058+08:00 INFO 31884 --- [crm-app] [scheduling-1] c.crm.customer.job.CustomerReminderJob : [客户提醒Job] 完成:新增待发 0 条,旧锚点失效 0 条 -2026-09-04T00:28:00.001+08:00 INFO 31884 --- [crm-app] [scheduling-1] c.crm.customer.job.CustomerReminderJob : [客户提醒Job] 开始,now=2026-09-04T00:28:00.001271 -2026-09-04T00:28:00.049+08:00 INFO 31884 --- [crm-app] [scheduling-1] c.crm.customer.job.CustomerReminderJob : [客户提醒Job] 完成:新增待发 0 条,旧锚点失效 0 条 -2026-09-04T00:28:30.002+08:00 INFO 31884 --- [crm-app] [scheduling-1] c.crm.customer.job.CustomerReminderJob : [客户提醒Job] 开始,now=2026-09-04T00:28:30.002931500 -2026-09-04T00:28:30.052+08:00 INFO 31884 --- [crm-app] [scheduling-1] c.crm.customer.job.CustomerReminderJob : [客户提醒Job] 完成:新增待发 0 条,旧锚点失效 0 条 -2026-09-04T00:28:53.376+08:00 WARN 31884 --- [crm-app] [http-nio-8080-exec-5] c.c.a.controller.DebugTokenController : [verify] 为 userId=739564171091247104 签发调试 token -2026-09-04T00:28:53.410+08:00 WARN 31884 --- [crm-app] [http-nio-8080-exec-8] c.c.a.controller.DebugTokenController : [verify] 为 userId=739564171091247104 签发调试 token -2026-09-04T00:29:00.008+08:00 INFO 31884 --- [crm-app] [scheduling-1] c.crm.customer.job.CustomerReminderJob : [客户提醒Job] 开始,now=2026-09-04T00:29:00.008157800 -2026-09-04T00:29:00.058+08:00 INFO 31884 --- [crm-app] [scheduling-1] c.crm.customer.job.CustomerReminderJob : [客户提醒Job] 完成:新增待发 0 条,旧锚点失效 0 条 -2026-09-04T00:29:30.009+08:00 INFO 31884 --- [crm-app] [scheduling-1] c.crm.customer.job.CustomerReminderJob : [客户提醒Job] 开始,now=2026-09-04T00:29:30.009056100 -2026-09-04T00:29:30.057+08:00 INFO 31884 --- [crm-app] [scheduling-1] c.crm.customer.job.CustomerReminderJob : [客户提醒Job] 完成:新增待发 0 条,旧锚点失效 0 条 -2026-09-04T00:30:00.015+08:00 INFO 31884 --- [crm-app] [scheduling-1] c.crm.customer.job.CustomerReminderJob : [客户提醒Job] 开始,now=2026-09-04T00:30:00.015019100 -2026-09-04T00:30:00.064+08:00 INFO 31884 --- [crm-app] [scheduling-1] c.crm.customer.job.CustomerReminderJob : [客户提醒Job] 完成:新增待发 0 条,旧锚点失效 0 条 -2026-09-04T00:30:30.006+08:00 INFO 31884 --- [crm-app] [scheduling-1] c.crm.customer.job.CustomerReminderJob : [客户提醒Job] 开始,now=2026-09-04T00:30:30.006150300 -2026-09-04T00:30:30.055+08:00 INFO 31884 --- [crm-app] [scheduling-1] c.crm.customer.job.CustomerReminderJob : [客户提醒Job] 完成:新增待发 0 条,旧锚点失效 0 条 -2026-09-04T00:30:45.198+08:00 WARN 31884 --- [crm-app] [http-nio-8080-exec-3] c.c.a.controller.DebugTokenController : [verify] 为 userId=739564171091247104 签发调试 token -2026-09-04T00:30:45.227+08:00 WARN 31884 --- [crm-app] [http-nio-8080-exec-5] c.c.a.controller.DebugTokenController : [verify] 为 userId=744842318024015872 签发调试 token -2026-09-04T00:30:47.144+08:00 WARN 31884 --- [crm-app] [http-nio-8080-exec-1] c.c.b.a.GlobalExceptionHandlerAdvice : 业务异常:code=67011, msg=交接原因必填 -2026-09-04T00:30:47.306+08:00 WARN 31884 --- [crm-app] [http-nio-8080-exec-2] c.c.b.a.GlobalExceptionHandlerAdvice : 业务异常:code=67011, msg=接收总监不在可交接范围内 -2026-09-04T00:30:48.032+08:00 WARN 31884 --- [crm-app] [http-nio-8080-exec-4] c.c.b.a.GlobalExceptionHandlerAdvice : 业务异常:code=67010, msg=存在未完成的交接单,不可重复发起 -2026-09-04T00:31:00.005+08:00 INFO 31884 --- [crm-app] [scheduling-1] c.crm.customer.job.CustomerReminderJob : [客户提醒Job] 开始,now=2026-09-04T00:31:00.005962800 -2026-09-04T00:31:00.059+08:00 INFO 31884 --- [crm-app] [scheduling-1] c.crm.customer.job.CustomerReminderJob : [客户提醒Job] 完成:新增待发 0 条,旧锚点失效 0 条 -2026-09-04T00:31:30.007+08:00 INFO 31884 --- [crm-app] [scheduling-1] c.crm.customer.job.CustomerReminderJob : [客户提醒Job] 开始,now=2026-09-04T00:31:30.007249200 -2026-09-04T00:31:30.028+08:00 WARN 31884 --- [crm-app] [scheduling-1] com.zaxxer.hikari.pool.PoolBase : HikariPool-1 - Failed to validate connection com.mysql.cj.jdbc.ConnectionImpl@56ac0d3 (No operations allowed after connection closed.). Possibly consider using a shorter maxLifetime value. -2026-09-04T00:31:30.041+08:00 WARN 31884 --- [crm-app] [scheduling-1] com.zaxxer.hikari.pool.PoolBase : HikariPool-1 - Failed to validate connection com.mysql.cj.jdbc.ConnectionImpl@273b41ed (No operations allowed after connection closed.). Possibly consider using a shorter maxLifetime value. -2026-09-04T00:31:30.051+08:00 WARN 31884 --- [crm-app] [scheduling-1] com.zaxxer.hikari.pool.PoolBase : HikariPool-1 - Failed to validate connection com.mysql.cj.jdbc.ConnectionImpl@74846181 (No operations allowed after connection closed.). Possibly consider using a shorter maxLifetime value. -2026-09-04T00:31:30.063+08:00 WARN 31884 --- [crm-app] [scheduling-1] com.zaxxer.hikari.pool.PoolBase : HikariPool-1 - Failed to validate connection com.mysql.cj.jdbc.ConnectionImpl@6a67ec4c (No operations allowed after connection closed.). Possibly consider using a shorter maxLifetime value. -2026-09-04T00:31:30.076+08:00 WARN 31884 --- [crm-app] [scheduling-1] com.zaxxer.hikari.pool.PoolBase : HikariPool-1 - Failed to validate connection com.mysql.cj.jdbc.ConnectionImpl@2b08e89e (No operations allowed after connection closed.). Possibly consider using a shorter maxLifetime value. -2026-09-04T00:31:30.085+08:00 WARN 31884 --- [crm-app] [scheduling-1] com.zaxxer.hikari.pool.PoolBase : HikariPool-1 - Failed to validate connection com.mysql.cj.jdbc.ConnectionImpl@5641f03b (No operations allowed after connection closed.). Possibly consider using a shorter maxLifetime value. -2026-09-04T00:31:30.097+08:00 WARN 31884 --- [crm-app] [scheduling-1] com.zaxxer.hikari.pool.PoolBase : HikariPool-1 - Failed to validate connection com.mysql.cj.jdbc.ConnectionImpl@19e1b1b (No operations allowed after connection closed.). Possibly consider using a shorter maxLifetime value. -2026-09-04T00:31:30.109+08:00 WARN 31884 --- [crm-app] [scheduling-1] com.zaxxer.hikari.pool.PoolBase : HikariPool-1 - Failed to validate connection com.mysql.cj.jdbc.ConnectionImpl@544e92e8 (No operations allowed after connection closed.). Possibly consider using a shorter maxLifetime value. -2026-09-04T00:31:30.174+08:00 INFO 31884 --- [crm-app] [scheduling-1] c.crm.customer.job.CustomerReminderJob : [客户提醒Job] 完成:新增待发 0 条,旧锚点失效 0 条 -2026-09-04T00:31:53.594+08:00 WARN 31884 --- [crm-app] [http-nio-8080-exec-2] c.c.b.a.GlobalExceptionHandlerAdvice : 业务异常:code=67012, msg=分配对象不存在、已停用或已离职 -2026-09-04T00:31:57.591+08:00 WARN 31884 --- [crm-app] [http-nio-8080-exec-10] c.c.b.a.GlobalExceptionHandlerAdvice : 业务异常:code=67013, msg=导入方式非法(仅新增/仅更新/新增或更新) -2026-09-04T00:31:57.905+08:00 WARN 31884 --- [crm-app] [http-nio-8080-exec-1] c.c.b.a.GlobalExceptionHandlerAdvice : 业务异常:code=67013, msg=模板版本不匹配,请下载最新导入模板(第 2 列表头不符) -2026-09-04T00:31:58.075+08:00 WARN 31884 --- [crm-app] [http-nio-8080-exec-2] c.c.b.a.GlobalExceptionHandlerAdvice : 业务异常:code=67013, msg=文件内无数据行 -2026-09-04T00:31:58.412+08:00 ERROR 31884 --- [crm-app] [http-nio-8080-exec-6] c.c.b.a.GlobalExceptionHandlerAdvice : 全局异常捕获: +2026-09-05T11:26:24.692+08:00 WARN 21796 --- [crm-app] [http-nio-8080-exec-7] c.c.a.controller.DebugTokenController : [verify] Ϊ userId=739564171091247104 ǩ token +2026-09-05T11:26:26.812+08:00 WARN 21796 --- [crm-app] [http-nio-8080-exec-5] c.c.b.a.GlobalExceptionHandlerAdvice : ҵ쳣code=67001, msg=޿Ƭͼֿ֧ͻ/ҵĿͻ +2026-09-05T11:26:26.927+08:00 WARN 21796 --- [crm-app] [http-nio-8080-exec-6] c.c.b.a.GlobalExceptionHandlerAdvice : ҵ쳣code=67001, msg=޿Ƭͼֿ֧ͻ/ҵĿͻ +2026-09-05T11:28:26.664+08:00 WARN 21796 --- [crm-app] [http-nio-8080-exec-3] c.c.a.controller.DebugTokenController : [verify] Ϊ userId=739564171091247104 ǩ token +2026-09-05T11:30:11.612+08:00 WARN 21796 --- [crm-app] [http-nio-8080-exec-5] c.c.a.controller.DebugTokenController : [verify] Ϊ userId=739564171091247104 ǩ token +2026-09-05T11:30:18.195+08:00 WARN 21796 --- [crm-app] [http-nio-8080-exec-5] c.c.b.a.GlobalExceptionHandlerAdvice : ҵ쳣code=67001, msg=޿Ƭͼֿ֧ͻ/ҵĿͻ +2026-09-05T11:30:18.332+08:00 WARN 21796 --- [crm-app] [http-nio-8080-exec-6] c.c.b.a.GlobalExceptionHandlerAdvice : ҵ쳣code=67001, msg=޿Ƭͼֿ֧ͻ/ҵĿͻ +2026-09-05T11:30:40.998+08:00 ERROR 21796 --- [crm-app] [http-nio-8080-exec-2] c.c.b.a.GlobalExceptionHandlerAdvice : ȫ쳣 -org.springframework.web.context.request.async.AsyncRequestNotUsableException: ServletOutputStream failed to write: java.io.IOException: 你的主机中的软件中止了一个已建立的连接。 +org.springframework.web.context.request.async.AsyncRequestNotUsableException: ServletOutputStream failed to write: java.io.IOException: еֹһѽӡ at org.springframework.web.context.request.async.StandardServletAsyncWebRequest$LifecycleHttpServletResponse.handleIOException(StandardServletAsyncWebRequest.java:343) ~[spring-web-6.1.14.jar!/:6.1.14] at org.springframework.web.context.request.async.StandardServletAsyncWebRequest$LifecycleServletOutputStream.write(StandardServletAsyncWebRequest.java:401) ~[spring-web-6.1.14.jar!/:6.1.14] at org.springframework.util.StreamUtils$NonClosingOutputStream.write(StreamUtils.java:261) ~[spring-core-6.1.14.jar!/:6.1.14] @@ -2208,7 +528,7 @@ org.springframework.web.context.request.async.AsyncRequestNotUsableException: Se at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1190) ~[tomcat-embed-core-10.1.31.jar!/:na] at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659) ~[tomcat-embed-core-10.1.31.jar!/:na] at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:63) ~[tomcat-embed-core-10.1.31.jar!/:na] - at java.base/java.lang.Thread.run(Thread.java:1583) ~[na:na] + at java.base/java.lang.Thread.run(Thread.java:842) ~[na:na] Suppressed: org.springframework.web.context.request.async.AsyncRequestNotUsableException: Response not usable after response errors. at org.springframework.web.context.request.async.StandardServletAsyncWebRequest$LifecycleHttpServletResponse.obtainLockOrRaiseException(StandardServletAsyncWebRequest.java:335) ~[spring-web-6.1.14.jar!/:6.1.14] at org.springframework.web.context.request.async.StandardServletAsyncWebRequest$LifecycleServletOutputStream.write(StandardServletAsyncWebRequest.java:396) ~[spring-web-6.1.14.jar!/:6.1.14] @@ -2217,7 +537,7 @@ org.springframework.web.context.request.async.AsyncRequestNotUsableException: Se at com.fasterxml.jackson.core.json.UTF8JsonGenerator.close(UTF8JsonGenerator.java:1234) ~[jackson-core-2.17.2.jar!/:2.17.2] at org.springframework.http.converter.json.AbstractJackson2HttpMessageConverter.writeInternal(AbstractJackson2HttpMessageConverter.java:452) ~[spring-web-6.1.14.jar!/:6.1.14] ... 102 common frames omitted -Caused by: org.apache.catalina.connector.ClientAbortException: java.io.IOException: 你的主机中的软件中止了一个已建立的连接。 +Caused by: org.apache.catalina.connector.ClientAbortException: java.io.IOException: еֹһѽӡ at org.apache.catalina.connector.OutputBuffer.realWriteBytes(OutputBuffer.java:341) ~[tomcat-embed-core-10.1.31.jar!/:na] at org.apache.catalina.connector.OutputBuffer.flushByteBuffer(OutputBuffer.java:776) ~[tomcat-embed-core-10.1.31.jar!/:na] at org.apache.catalina.connector.OutputBuffer.append(OutputBuffer.java:673) ~[tomcat-embed-core-10.1.31.jar!/:na] @@ -2227,13 +547,13 @@ Caused by: org.apache.catalina.connector.ClientAbortException: java.io.IOExcepti at org.springframework.security.web.util.OnCommittedResponseWrapper$SaveContextServletOutputStream.write(OnCommittedResponseWrapper.java:639) ~[spring-security-web-6.3.4.jar!/:6.3.4] at org.springframework.web.context.request.async.StandardServletAsyncWebRequest$LifecycleServletOutputStream.write(StandardServletAsyncWebRequest.java:398) ~[spring-web-6.1.14.jar!/:6.1.14] ... 122 common frames omitted -Caused by: java.io.IOException: 你的主机中的软件中止了一个已建立的连接。 +Caused by: java.io.IOException: еֹһѽӡ at java.base/sun.nio.ch.SocketDispatcher.write0(Native Method) ~[na:na] at java.base/sun.nio.ch.SocketDispatcher.write(SocketDispatcher.java:54) ~[na:na] - at java.base/sun.nio.ch.IOUtil.writeFromNativeBuffer(IOUtil.java:137) ~[na:na] - at java.base/sun.nio.ch.IOUtil.write(IOUtil.java:102) ~[na:na] - at java.base/sun.nio.ch.IOUtil.write(IOUtil.java:58) ~[na:na] - at java.base/sun.nio.ch.SocketChannelImpl.write(SocketChannelImpl.java:542) ~[na:na] + at java.base/sun.nio.ch.IOUtil.writeFromNativeBuffer(IOUtil.java:132) ~[na:na] + at java.base/sun.nio.ch.IOUtil.write(IOUtil.java:97) ~[na:na] + at java.base/sun.nio.ch.IOUtil.write(IOUtil.java:53) ~[na:na] + at java.base/sun.nio.ch.SocketChannelImpl.write(SocketChannelImpl.java:532) ~[na:na] at org.apache.tomcat.util.net.NioChannel.write(NioChannel.java:122) ~[tomcat-embed-core-10.1.31.jar!/:na] at org.apache.tomcat.util.net.NioEndpoint$NioSocketWrapper.doWrite(NioEndpoint.java:1378) ~[tomcat-embed-core-10.1.31.jar!/:na] at org.apache.tomcat.util.net.SocketWrapperBase.doWrite(SocketWrapperBase.java:764) ~[tomcat-embed-core-10.1.31.jar!/:na] @@ -2246,99 +566,44 @@ Caused by: java.io.IOException: 你的主机中的软件中止了一个已建立 at org.apache.catalina.connector.OutputBuffer.realWriteBytes(OutputBuffer.java:329) ~[tomcat-embed-core-10.1.31.jar!/:na] ... 129 common frames omitted -2026-09-04T00:31:58.482+08:00 ERROR 31884 --- [crm-app] [task-1] c.crm.file.task.ThumbnailGenerationTask : 缩略图生成失败:fileId=750875703636918272, thumbKey=thumbnails/750875703636918272.jpg - -java.io.IOException: Cannot run program "soffice": CreateProcess error=2, 系统找不到指定的文件。 - at java.base/java.lang.ProcessBuilder.start(ProcessBuilder.java:1170) ~[na:na] - at java.base/java.lang.ProcessBuilder.start(ProcessBuilder.java:1089) ~[na:na] - at com.crm.file.service.impl.OfficeThumbnailRenderer.runConversion(OfficeThumbnailRenderer.java:110) ~[crm-file-1.0.0-SNAPSHOT.jar!/:1.0.0-SNAPSHOT] - at com.crm.file.service.impl.OfficeThumbnailRenderer.render(OfficeThumbnailRenderer.java:70) ~[crm-file-1.0.0-SNAPSHOT.jar!/:1.0.0-SNAPSHOT] - at com.crm.file.task.ThumbnailGenerationTask.generateSync(ThumbnailGenerationTask.java:140) ~[crm-file-1.0.0-SNAPSHOT.jar!/:1.0.0-SNAPSHOT] - at com.crm.file.task.ThumbnailGenerationTask.generateWithLock(ThumbnailGenerationTask.java:102) ~[crm-file-1.0.0-SNAPSHOT.jar!/:1.0.0-SNAPSHOT] - at com.crm.file.task.ThumbnailGenerationTask.generate(ThumbnailGenerationTask.java:70) ~[crm-file-1.0.0-SNAPSHOT.jar!/:1.0.0-SNAPSHOT] - at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103) ~[na:na] - at java.base/java.lang.reflect.Method.invoke(Method.java:580) ~[na:na] - at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:355) ~[spring-aop-6.1.14.jar!/:6.1.14] - at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:196) ~[spring-aop-6.1.14.jar!/:6.1.14] - at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) ~[spring-aop-6.1.14.jar!/:6.1.14] - at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:768) ~[spring-aop-6.1.14.jar!/:6.1.14] - at org.springframework.aop.interceptor.AsyncExecutionInterceptor.lambda$invoke$0(AsyncExecutionInterceptor.java:113) ~[spring-aop-6.1.14.jar!/:6.1.14] - at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:317) ~[na:na] - at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1144) ~[na:na] - at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:642) ~[na:na] - at java.base/java.lang.Thread.run(Thread.java:1583) ~[na:na] -Caused by: java.io.IOException: CreateProcess error=2, 系统找不到指定的文件。 - at java.base/java.lang.ProcessImpl.create(Native Method) ~[na:na] - at java.base/java.lang.ProcessImpl.(ProcessImpl.java:506) ~[na:na] - at java.base/java.lang.ProcessImpl.start(ProcessImpl.java:159) ~[na:na] - at java.base/java.lang.ProcessBuilder.start(ProcessBuilder.java:1126) ~[na:na] - ... 17 common frames omitted - -2026-09-04T00:31:58.743+08:00 ERROR 31884 --- [crm-app] [task-2] c.crm.file.task.ThumbnailGenerationTask : 缩略图生成失败:fileId=750875704945541120, thumbKey=thumbnails/750875704945541120.jpg +2026-09-05T11:30:49.113+08:00 ERROR 21796 --- [crm-app] [task-3] c.crm.file.task.ThumbnailGenerationTask : ͼʧܣfileId=751403881929375744, thumbKey=thumbnails/751403881929375744.jpg -java.io.IOException: Cannot run program "soffice": CreateProcess error=2, 系统找不到指定的文件。 - at java.base/java.lang.ProcessBuilder.start(ProcessBuilder.java:1170) ~[na:na] - at java.base/java.lang.ProcessBuilder.start(ProcessBuilder.java:1089) ~[na:na] - at com.crm.file.service.impl.OfficeThumbnailRenderer.runConversion(OfficeThumbnailRenderer.java:110) ~[crm-file-1.0.0-SNAPSHOT.jar!/:1.0.0-SNAPSHOT] - at com.crm.file.service.impl.OfficeThumbnailRenderer.render(OfficeThumbnailRenderer.java:70) ~[crm-file-1.0.0-SNAPSHOT.jar!/:1.0.0-SNAPSHOT] - at com.crm.file.task.ThumbnailGenerationTask.generateSync(ThumbnailGenerationTask.java:140) ~[crm-file-1.0.0-SNAPSHOT.jar!/:1.0.0-SNAPSHOT] - at com.crm.file.task.ThumbnailGenerationTask.generateWithLock(ThumbnailGenerationTask.java:102) ~[crm-file-1.0.0-SNAPSHOT.jar!/:1.0.0-SNAPSHOT] - at com.crm.file.task.ThumbnailGenerationTask.generate(ThumbnailGenerationTask.java:70) ~[crm-file-1.0.0-SNAPSHOT.jar!/:1.0.0-SNAPSHOT] - at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103) ~[na:na] - at java.base/java.lang.reflect.Method.invoke(Method.java:580) ~[na:na] - at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:355) ~[spring-aop-6.1.14.jar!/:6.1.14] - at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:196) ~[spring-aop-6.1.14.jar!/:6.1.14] - at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) ~[spring-aop-6.1.14.jar!/:6.1.14] - at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:768) ~[spring-aop-6.1.14.jar!/:6.1.14] - at org.springframework.aop.interceptor.AsyncExecutionInterceptor.lambda$invoke$0(AsyncExecutionInterceptor.java:113) ~[spring-aop-6.1.14.jar!/:6.1.14] - at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:317) ~[na:na] - at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1144) ~[na:na] - at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:642) ~[na:na] - at java.base/java.lang.Thread.run(Thread.java:1583) ~[na:na] -Caused by: java.io.IOException: CreateProcess error=2, 系统找不到指定的文件。 - at java.base/java.lang.ProcessImpl.create(Native Method) ~[na:na] - at java.base/java.lang.ProcessImpl.(ProcessImpl.java:506) ~[na:na] - at java.base/java.lang.ProcessImpl.start(ProcessImpl.java:159) ~[na:na] - at java.base/java.lang.ProcessBuilder.start(ProcessBuilder.java:1126) ~[na:na] - ... 17 common frames omitted - -2026-09-04T00:31:59.109+08:00 ERROR 31884 --- [crm-app] [task-3] c.crm.file.task.ThumbnailGenerationTask : 缩略图生成失败:fileId=750875706489044992, thumbKey=thumbnails/750875706489044992.jpg - -java.io.IOException: Cannot run program "soffice": CreateProcess error=2, 系统找不到指定的文件。 - at java.base/java.lang.ProcessBuilder.start(ProcessBuilder.java:1170) ~[na:na] - at java.base/java.lang.ProcessBuilder.start(ProcessBuilder.java:1089) ~[na:na] +java.io.IOException: Cannot run program "soffice": CreateProcess error=2, ϵͳҲָļ + at java.base/java.lang.ProcessBuilder.start(ProcessBuilder.java:1143) ~[na:na] + at java.base/java.lang.ProcessBuilder.start(ProcessBuilder.java:1073) ~[na:na] at com.crm.file.service.impl.OfficeThumbnailRenderer.runConversion(OfficeThumbnailRenderer.java:110) ~[crm-file-1.0.0-SNAPSHOT.jar!/:1.0.0-SNAPSHOT] at com.crm.file.service.impl.OfficeThumbnailRenderer.render(OfficeThumbnailRenderer.java:70) ~[crm-file-1.0.0-SNAPSHOT.jar!/:1.0.0-SNAPSHOT] at com.crm.file.task.ThumbnailGenerationTask.generateSync(ThumbnailGenerationTask.java:140) ~[crm-file-1.0.0-SNAPSHOT.jar!/:1.0.0-SNAPSHOT] at com.crm.file.task.ThumbnailGenerationTask.generateWithLock(ThumbnailGenerationTask.java:102) ~[crm-file-1.0.0-SNAPSHOT.jar!/:1.0.0-SNAPSHOT] at com.crm.file.task.ThumbnailGenerationTask.generate(ThumbnailGenerationTask.java:70) ~[crm-file-1.0.0-SNAPSHOT.jar!/:1.0.0-SNAPSHOT] - at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103) ~[na:na] - at java.base/java.lang.reflect.Method.invoke(Method.java:580) ~[na:na] + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na] + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) ~[na:na] + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na] + at java.base/java.lang.reflect.Method.invoke(Method.java:568) ~[na:na] at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:355) ~[spring-aop-6.1.14.jar!/:6.1.14] at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:196) ~[spring-aop-6.1.14.jar!/:6.1.14] at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) ~[spring-aop-6.1.14.jar!/:6.1.14] at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:768) ~[spring-aop-6.1.14.jar!/:6.1.14] at org.springframework.aop.interceptor.AsyncExecutionInterceptor.lambda$invoke$0(AsyncExecutionInterceptor.java:113) ~[spring-aop-6.1.14.jar!/:6.1.14] - at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:317) ~[na:na] - at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1144) ~[na:na] - at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:642) ~[na:na] - at java.base/java.lang.Thread.run(Thread.java:1583) ~[na:na] -Caused by: java.io.IOException: CreateProcess error=2, 系统找不到指定的文件。 + at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264) ~[na:na] + at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136) ~[na:na] + at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635) ~[na:na] + at java.base/java.lang.Thread.run(Thread.java:842) ~[na:na] +Caused by: java.io.IOException: CreateProcess error=2, ϵͳҲָļ at java.base/java.lang.ProcessImpl.create(Native Method) ~[na:na] - at java.base/java.lang.ProcessImpl.(ProcessImpl.java:506) ~[na:na] - at java.base/java.lang.ProcessImpl.start(ProcessImpl.java:159) ~[na:na] - at java.base/java.lang.ProcessBuilder.start(ProcessBuilder.java:1126) ~[na:na] - ... 17 common frames omitted + at java.base/java.lang.ProcessImpl.(ProcessImpl.java:505) ~[na:na] + at java.base/java.lang.ProcessImpl.start(ProcessImpl.java:158) ~[na:na] + at java.base/java.lang.ProcessBuilder.start(ProcessBuilder.java:1110) ~[na:na] + ... 19 common frames omitted -2026-09-04T00:31:59.358+08:00 WARN 31884 --- [crm-app] [http-nio-8080-exec-9] c.c.b.a.GlobalExceptionHandlerAdvice : 业务异常:code=67014, msg=任务已确认,请勿重复提交 -2026-09-04T00:31:59.573+08:00 WARN 31884 --- [crm-app] [task-4] c.c.c.task.CustomerImportExecutor : 客户导入单行执行异常:taskId=750875703951491072, row=1 +2026-09-05T11:30:49.346+08:00 WARN 21796 --- [crm-app] [task-4] c.c.c.task.CustomerImportExecutor : ͻ뵥ִ쳣taskId=751403894998827008, row=1 org.springframework.dao.DataIntegrityViolationException: ### Error updating database. Cause: java.sql.SQLException: Field 'is_biz_negotiated' doesn't have a default value ### The error may exist in com/crm/customer/mapper/CustomerMapper.java (best guess) ### The error may involve com.crm.customer.mapper.CustomerMapper.insert-Inline ### The error occurred while setting parameters -### SQL: INSERT INTO customer ( id, customer_no, customer_name, customer_type, province_code, city_code, industry_code, customer_star_level, owner_user_id, owner_user_name_snapshot, owner_dept_id, owner_dept_name_snapshot, customer_stage, archive_status, last_valid_follow_time, is_child, remark, version, creator_id, create_time, updater_id, update_time, deleted ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? ) +### SQL: INSERT INTO customer ( id, customer_no, customer_name, customer_type, province_code, city_code, industry_code, customer_star_level, owner_user_id, owner_user_name_snapshot, owner_dept_id, owner_dept_name_snapshot, customer_stage, archive_status, last_valid_follow_time, is_child, version, creator_id, create_time, updater_id, update_time, deleted ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? ) ### Cause: java.sql.SQLException: Field 'is_biz_negotiated' doesn't have a default value ; Field 'is_biz_negotiated' doesn't have a default value at org.springframework.jdbc.support.SQLErrorCodeSQLExceptionTranslator.doTranslate(SQLErrorCodeSQLExceptionTranslator.java:258) ~[spring-jdbc-6.1.14.jar!/:6.1.14] @@ -2350,21 +615,23 @@ org.springframework.dao.DataIntegrityViolationException: at com.baomidou.mybatisplus.core.override.MybatisMapperMethod.execute(MybatisMapperMethod.java:59) ~[mybatis-plus-core-3.5.7.jar!/:3.5.7] at com.baomidou.mybatisplus.core.override.MybatisMapperProxy$PlainMethodInvoker.invoke(MybatisMapperProxy.java:152) ~[mybatis-plus-core-3.5.7.jar!/:3.5.7] at com.baomidou.mybatisplus.core.override.MybatisMapperProxy.invoke(MybatisMapperProxy.java:89) ~[mybatis-plus-core-3.5.7.jar!/:3.5.7] - at jdk.proxy2/jdk.proxy2.$Proxy228.insert(Unknown Source) ~[na:na] - at com.crm.customer.task.CustomerImportExecutor.createCustomer(CustomerImportExecutor.java:243) ~[crm-customer-1.0.0-SNAPSHOT.jar!/:1.0.0-SNAPSHOT] - at com.crm.customer.task.CustomerImportExecutor.doImport(CustomerImportExecutor.java:117) ~[crm-customer-1.0.0-SNAPSHOT.jar!/:1.0.0-SNAPSHOT] + at jdk.proxy2/jdk.proxy2.$Proxy229.insert(Unknown Source) ~[na:na] + at com.crm.customer.task.CustomerImportExecutor.createCustomer(CustomerImportExecutor.java:244) ~[crm-customer-1.0.0-SNAPSHOT.jar!/:1.0.0-SNAPSHOT] + at com.crm.customer.task.CustomerImportExecutor.doImport(CustomerImportExecutor.java:118) ~[crm-customer-1.0.0-SNAPSHOT.jar!/:1.0.0-SNAPSHOT] at com.crm.customer.task.CustomerImportExecutor.executeImport(CustomerImportExecutor.java:74) ~[crm-customer-1.0.0-SNAPSHOT.jar!/:1.0.0-SNAPSHOT] - at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103) ~[na:na] - at java.base/java.lang.reflect.Method.invoke(Method.java:580) ~[na:na] + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na] + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) ~[na:na] + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na] + at java.base/java.lang.reflect.Method.invoke(Method.java:568) ~[na:na] at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:355) ~[spring-aop-6.1.14.jar!/:6.1.14] at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:196) ~[spring-aop-6.1.14.jar!/:6.1.14] at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) ~[spring-aop-6.1.14.jar!/:6.1.14] at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:768) ~[spring-aop-6.1.14.jar!/:6.1.14] at org.springframework.aop.interceptor.AsyncExecutionInterceptor.lambda$invoke$0(AsyncExecutionInterceptor.java:113) ~[spring-aop-6.1.14.jar!/:6.1.14] - at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:317) ~[na:na] - at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1144) ~[na:na] - at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:642) ~[na:na] - at java.base/java.lang.Thread.run(Thread.java:1583) ~[na:na] + at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264) ~[na:na] + at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136) ~[na:na] + at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635) ~[na:na] + at java.base/java.lang.Thread.run(Thread.java:842) ~[na:na] Caused by: java.sql.SQLException: Field 'is_biz_negotiated' doesn't have a default value at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:130) ~[mysql-connector-j-8.3.0.jar!/:8.3.0] at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:122) ~[mysql-connector-j-8.3.0.jar!/:8.3.0] @@ -2374,31 +641,35 @@ Caused by: java.sql.SQLException: Field 'is_biz_negotiated' doesn't have a defau at com.zaxxer.hikari.pool.HikariProxyPreparedStatement.execute(HikariProxyPreparedStatement.java) ~[HikariCP-5.1.0.jar!/:na] at org.apache.ibatis.executor.statement.PreparedStatementHandler.update(PreparedStatementHandler.java:48) ~[mybatis-3.5.16.jar!/:3.5.16] at org.apache.ibatis.executor.statement.RoutingStatementHandler.update(RoutingStatementHandler.java:75) ~[mybatis-3.5.16.jar!/:3.5.16] - at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103) ~[na:na] - at java.base/java.lang.reflect.Method.invoke(Method.java:580) ~[na:na] + at jdk.internal.reflect.GeneratedMethodAccessor72.invoke(Unknown Source) ~[na:na] + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na] + at java.base/java.lang.reflect.Method.invoke(Method.java:568) ~[na:na] at org.apache.ibatis.plugin.Plugin.invoke(Plugin.java:61) ~[mybatis-3.5.16.jar!/:3.5.16] - at jdk.proxy2/jdk.proxy2.$Proxy256.update(Unknown Source) ~[na:na] - at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103) ~[na:na] - at java.base/java.lang.reflect.Method.invoke(Method.java:580) ~[na:na] + at jdk.proxy2/jdk.proxy2.$Proxy257.update(Unknown Source) ~[na:na] + at jdk.internal.reflect.GeneratedMethodAccessor72.invoke(Unknown Source) ~[na:na] + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na] + at java.base/java.lang.reflect.Method.invoke(Method.java:568) ~[na:na] at org.apache.ibatis.plugin.Plugin.invoke(Plugin.java:61) ~[mybatis-3.5.16.jar!/:3.5.16] - at jdk.proxy2/jdk.proxy2.$Proxy256.update(Unknown Source) ~[na:na] + at jdk.proxy2/jdk.proxy2.$Proxy257.update(Unknown Source) ~[na:na] at org.apache.ibatis.executor.SimpleExecutor.doUpdate(SimpleExecutor.java:50) ~[mybatis-3.5.16.jar!/:3.5.16] at org.apache.ibatis.executor.BaseExecutor.update(BaseExecutor.java:117) ~[mybatis-3.5.16.jar!/:3.5.16] at org.apache.ibatis.executor.CachingExecutor.update(CachingExecutor.java:76) ~[mybatis-3.5.16.jar!/:3.5.16] - at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103) ~[na:na] - at java.base/java.lang.reflect.Method.invoke(Method.java:580) ~[na:na] + at jdk.internal.reflect.GeneratedMethodAccessor79.invoke(Unknown Source) ~[na:na] + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na] + at java.base/java.lang.reflect.Method.invoke(Method.java:568) ~[na:na] at org.apache.ibatis.plugin.Invocation.proceed(Invocation.java:61) ~[mybatis-3.5.16.jar!/:3.5.16] at com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor.intercept(MybatisPlusInterceptor.java:106) ~[mybatis-plus-extension-3.5.7.jar!/:3.5.7] at org.apache.ibatis.plugin.Plugin.invoke(Plugin.java:59) ~[mybatis-3.5.16.jar!/:3.5.16] - at jdk.proxy2/jdk.proxy2.$Proxy255.update(Unknown Source) ~[na:na] + at jdk.proxy2/jdk.proxy2.$Proxy256.update(Unknown Source) ~[na:na] at org.apache.ibatis.session.defaults.DefaultSqlSession.update(DefaultSqlSession.java:197) ~[mybatis-3.5.16.jar!/:3.5.16] at org.apache.ibatis.session.defaults.DefaultSqlSession.insert(DefaultSqlSession.java:184) ~[mybatis-3.5.16.jar!/:3.5.16] - at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103) ~[na:na] - at java.base/java.lang.reflect.Method.invoke(Method.java:580) ~[na:na] + at jdk.internal.reflect.GeneratedMethodAccessor185.invoke(Unknown Source) ~[na:na] + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na] + at java.base/java.lang.reflect.Method.invoke(Method.java:568) ~[na:na] at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:425) ~[mybatis-spring-3.0.3.jar!/:3.0.3] - ... 20 common frames omitted + ... 22 common frames omitted -2026-09-04T00:31:59.596+08:00 ERROR 31884 --- [crm-app] [task-4] c.c.c.task.CustomerImportExecutor : 客户导入任务执行失败:taskId=750875703951491072 +2026-09-05T11:30:49.379+08:00 ERROR 21796 --- [crm-app] [task-4] c.c.c.task.CustomerImportExecutor : ͻִʧܣtaskId=751403894998827008 org.springframework.dao.DataIntegrityViolationException: ### Error updating database. Cause: com.mysql.cj.jdbc.exceptions.MysqlDataTruncation: Data truncation: Data too long for column 'fail_reason' at row 1 @@ -2419,21 +690,23 @@ org.springframework.dao.DataIntegrityViolationException: at com.baomidou.mybatisplus.core.override.MybatisMapperMethod.execute(MybatisMapperMethod.java:59) ~[mybatis-plus-core-3.5.7.jar!/:3.5.7] at com.baomidou.mybatisplus.core.override.MybatisMapperProxy$PlainMethodInvoker.invoke(MybatisMapperProxy.java:152) ~[mybatis-plus-core-3.5.7.jar!/:3.5.7] at com.baomidou.mybatisplus.core.override.MybatisMapperProxy.invoke(MybatisMapperProxy.java:89) ~[mybatis-plus-core-3.5.7.jar!/:3.5.7] - at jdk.proxy2/jdk.proxy2.$Proxy236.insert(Unknown Source) ~[na:na] - at com.crm.customer.task.CustomerImportExecutor.insertFail(CustomerImportExecutor.java:297) ~[crm-customer-1.0.0-SNAPSHOT.jar!/:1.0.0-SNAPSHOT] - at com.crm.customer.task.CustomerImportExecutor.doImport(CustomerImportExecutor.java:147) ~[crm-customer-1.0.0-SNAPSHOT.jar!/:1.0.0-SNAPSHOT] + at jdk.proxy2/jdk.proxy2.$Proxy238.insert(Unknown Source) ~[na:na] + at com.crm.customer.task.CustomerImportExecutor.insertFail(CustomerImportExecutor.java:298) ~[crm-customer-1.0.0-SNAPSHOT.jar!/:1.0.0-SNAPSHOT] + at com.crm.customer.task.CustomerImportExecutor.doImport(CustomerImportExecutor.java:148) ~[crm-customer-1.0.0-SNAPSHOT.jar!/:1.0.0-SNAPSHOT] at com.crm.customer.task.CustomerImportExecutor.executeImport(CustomerImportExecutor.java:74) ~[crm-customer-1.0.0-SNAPSHOT.jar!/:1.0.0-SNAPSHOT] - at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103) ~[na:na] - at java.base/java.lang.reflect.Method.invoke(Method.java:580) ~[na:na] + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na] + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) ~[na:na] + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na] + at java.base/java.lang.reflect.Method.invoke(Method.java:568) ~[na:na] at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:355) ~[spring-aop-6.1.14.jar!/:6.1.14] at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:196) ~[spring-aop-6.1.14.jar!/:6.1.14] at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) ~[spring-aop-6.1.14.jar!/:6.1.14] at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:768) ~[spring-aop-6.1.14.jar!/:6.1.14] at org.springframework.aop.interceptor.AsyncExecutionInterceptor.lambda$invoke$0(AsyncExecutionInterceptor.java:113) ~[spring-aop-6.1.14.jar!/:6.1.14] - at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:317) ~[na:na] - at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1144) ~[na:na] - at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:642) ~[na:na] - at java.base/java.lang.Thread.run(Thread.java:1583) ~[na:na] + at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264) ~[na:na] + at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136) ~[na:na] + at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635) ~[na:na] + at java.base/java.lang.Thread.run(Thread.java:842) ~[na:na] Caused by: com.mysql.cj.jdbc.exceptions.MysqlDataTruncation: Data truncation: Data too long for column 'fail_reason' at row 1 at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:104) ~[mysql-connector-j-8.3.0.jar!/:8.3.0] at com.mysql.cj.jdbc.ClientPreparedStatement.executeInternal(ClientPreparedStatement.java:912) ~[mysql-connector-j-8.3.0.jar!/:8.3.0] @@ -2442,484 +715,16 @@ Caused by: com.mysql.cj.jdbc.exceptions.MysqlDataTruncation: Data truncation: Da at com.zaxxer.hikari.pool.HikariProxyPreparedStatement.execute(HikariProxyPreparedStatement.java) ~[HikariCP-5.1.0.jar!/:na] at org.apache.ibatis.executor.statement.PreparedStatementHandler.update(PreparedStatementHandler.java:48) ~[mybatis-3.5.16.jar!/:3.5.16] at org.apache.ibatis.executor.statement.RoutingStatementHandler.update(RoutingStatementHandler.java:75) ~[mybatis-3.5.16.jar!/:3.5.16] - at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103) ~[na:na] - at java.base/java.lang.reflect.Method.invoke(Method.java:580) ~[na:na] - at org.apache.ibatis.plugin.Plugin.invoke(Plugin.java:61) ~[mybatis-3.5.16.jar!/:3.5.16] - at jdk.proxy2/jdk.proxy2.$Proxy256.update(Unknown Source) ~[na:na] - at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103) ~[na:na] - at java.base/java.lang.reflect.Method.invoke(Method.java:580) ~[na:na] - at org.apache.ibatis.plugin.Plugin.invoke(Plugin.java:61) ~[mybatis-3.5.16.jar!/:3.5.16] - at jdk.proxy2/jdk.proxy2.$Proxy256.update(Unknown Source) ~[na:na] - at org.apache.ibatis.executor.SimpleExecutor.doUpdate(SimpleExecutor.java:50) ~[mybatis-3.5.16.jar!/:3.5.16] - at org.apache.ibatis.executor.BaseExecutor.update(BaseExecutor.java:117) ~[mybatis-3.5.16.jar!/:3.5.16] - at org.apache.ibatis.executor.CachingExecutor.update(CachingExecutor.java:76) ~[mybatis-3.5.16.jar!/:3.5.16] - at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103) ~[na:na] - at java.base/java.lang.reflect.Method.invoke(Method.java:580) ~[na:na] - at org.apache.ibatis.plugin.Invocation.proceed(Invocation.java:61) ~[mybatis-3.5.16.jar!/:3.5.16] - at com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor.intercept(MybatisPlusInterceptor.java:106) ~[mybatis-plus-extension-3.5.7.jar!/:3.5.7] - at org.apache.ibatis.plugin.Plugin.invoke(Plugin.java:59) ~[mybatis-3.5.16.jar!/:3.5.16] - at jdk.proxy2/jdk.proxy2.$Proxy255.update(Unknown Source) ~[na:na] - at org.apache.ibatis.session.defaults.DefaultSqlSession.update(DefaultSqlSession.java:197) ~[mybatis-3.5.16.jar!/:3.5.16] - at org.apache.ibatis.session.defaults.DefaultSqlSession.insert(DefaultSqlSession.java:184) ~[mybatis-3.5.16.jar!/:3.5.16] - at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103) ~[na:na] - at java.base/java.lang.reflect.Method.invoke(Method.java:580) ~[na:na] - at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:425) ~[mybatis-spring-3.0.3.jar!/:3.0.3] - ... 20 common frames omitted - -2026-09-04T00:32:00.010+08:00 INFO 31884 --- [crm-app] [scheduling-1] c.crm.customer.job.CustomerReminderJob : [客户提醒Job] 开始,now=2026-09-04T00:32:00.010104500 -2026-09-04T00:32:00.065+08:00 INFO 31884 --- [crm-app] [scheduling-1] c.crm.customer.job.CustomerReminderJob : [客户提醒Job] 完成:新增待发 0 条,旧锚点失效 0 条 -2026-09-04T00:32:01.330+08:00 INFO 31884 --- [crm-app] [http-nio-8080-exec-4] .c.r.s.i.CustomerReminderRuleServiceImpl : [客户提醒规则] 全量覆盖保存:operator=739564171091247104, masterEnabled=1, firstTrigger=1/1天, secondInterval=1/1天 -2026-09-04T00:32:01.449+08:00 WARN 31884 --- [crm-app] [http-nio-8080-exec-5] c.c.b.a.GlobalExceptionHandlerAdvice : 业务异常:code=64023, msg=首次触发天数与二次提醒间隔天数必须为正整数 -2026-09-04T00:32:01.562+08:00 WARN 31884 --- [crm-app] [http-nio-8080-exec-8] c.c.b.a.GlobalExceptionHandlerAdvice : 业务异常:code=64023, msg=首次触发天数与二次提醒间隔天数必须为正整数 -2026-09-04T00:32:01.813+08:00 INFO 31884 --- [crm-app] [http-nio-8080-exec-10] .c.r.s.i.CustomerReminderRuleServiceImpl : [客户提醒规则] 全量覆盖保存:operator=739564171091247104, masterEnabled=0, firstTrigger=0/2天, secondInterval=0/2天 -2026-09-04T00:32:01.955+08:00 INFO 31884 --- [crm-app] [http-nio-8080-exec-1] .c.r.s.i.CustomerReminderRuleServiceImpl : [客户提醒规则] 全量覆盖保存:operator=739564171091247104, masterEnabled=1, firstTrigger=1/1天, secondInterval=1/1天 -2026-09-04T00:32:04.747+08:00 INFO 22532 --- [crm-app] [main] com.crm.app.CrmAppApplication : Starting CrmAppApplication v1.0.0-SNAPSHOT using Java 21.0.7 with PID 22532 (E:\code\crm-backend-matt\crm-app\target\crm-app-1.0.0-SNAPSHOT.jar started by Administrator in e:\code\crm-backend-matt) -2026-09-04T00:32:04.750+08:00 INFO 22532 --- [crm-app] [main] com.crm.app.CrmAppApplication : The following 1 profile is active: "verify" -2026-09-04T00:32:06.091+08:00 INFO 22532 --- [crm-app] [main] .s.d.r.c.RepositoryConfigurationDelegate : Multiple Spring Data modules found, entering strict repository configuration mode -2026-09-04T00:32:06.093+08:00 INFO 22532 --- [crm-app] [main] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data JPA repositories in DEFAULT mode. -2026-09-04T00:32:06.128+08:00 INFO 22532 --- [crm-app] [main] .s.d.r.c.RepositoryConfigurationDelegate : Finished Spring Data repository scanning in 28 ms. Found 0 JPA repository interfaces. -2026-09-04T00:32:06.155+08:00 INFO 22532 --- [crm-app] [main] .s.d.r.c.RepositoryConfigurationDelegate : Multiple Spring Data modules found, entering strict repository configuration mode -2026-09-04T00:32:06.156+08:00 INFO 22532 --- [crm-app] [main] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data Redis repositories in DEFAULT mode. -2026-09-04T00:32:06.166+08:00 INFO 22532 --- [crm-app] [main] .s.d.r.c.RepositoryConfigurationDelegate : Finished Spring Data repository scanning in 2 ms. Found 0 Redis repository interfaces. -2026-09-04T00:32:06.335+08:00 WARN 22532 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'crmBaseMapper' and 'com.crm.base.mapper.CrmBaseMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:32:06.336+08:00 WARN 22532 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'authIdentityMapper' and 'com.crm.auth.mapper.AuthIdentityMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:32:06.336+08:00 WARN 22532 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'authUserMapper' and 'com.crm.auth.mapper.AuthUserMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:32:06.336+08:00 WARN 22532 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'sysDataScopeModuleMapper' and 'com.crm.auth.mapper.SysDataScopeModuleMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:32:06.336+08:00 WARN 22532 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'sysDeptMapper' and 'com.crm.auth.mapper.SysDeptMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:32:06.336+08:00 WARN 22532 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'sysMenuMapper' and 'com.crm.auth.mapper.SysMenuMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:32:06.337+08:00 WARN 22532 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'sysRoleDataScopeMapper' and 'com.crm.auth.mapper.SysRoleDataScopeMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:32:06.337+08:00 WARN 22532 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'sysRoleMapper' and 'com.crm.auth.mapper.SysRoleMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:32:06.337+08:00 WARN 22532 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'sysRoleMenuMapper' and 'com.crm.auth.mapper.SysRoleMenuMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:32:06.337+08:00 WARN 22532 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'sysUserDeptMapper' and 'com.crm.auth.mapper.SysUserDeptMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:32:06.337+08:00 WARN 22532 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'sysUserRoleMapper' and 'com.crm.auth.mapper.SysUserRoleMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:32:06.337+08:00 WARN 22532 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'fileInfoMapper' and 'com.crm.file.mapper.FileInfoMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:32:06.337+08:00 WARN 22532 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'dictGroupDefaultMapper' and 'com.crm.dict.mapper.DictGroupDefaultMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:32:06.337+08:00 WARN 22532 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'dictGroupMapper' and 'com.crm.dict.mapper.DictGroupMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:32:06.337+08:00 WARN 22532 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'dictItemMapper' and 'com.crm.dict.mapper.DictItemMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:32:06.337+08:00 WARN 22532 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'dictRefCountMapper' and 'com.crm.dict.mapper.DictRefCountMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:32:06.337+08:00 WARN 22532 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'customerReminderRuleMapper' and 'com.crm.rule.mapper.CustomerReminderRuleMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:32:06.337+08:00 WARN 22532 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'leadPoolMapper' and 'com.crm.rule.mapper.LeadPoolMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:32:06.337+08:00 WARN 22532 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'leadPoolMemberMapper' and 'com.crm.rule.mapper.LeadPoolMemberMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:32:06.337+08:00 WARN 22532 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'leadPoolProvinceMapper' and 'com.crm.rule.mapper.LeadPoolProvinceMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:32:06.338+08:00 WARN 22532 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'leadPoolRegionMapper' and 'com.crm.rule.mapper.LeadPoolRegionMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:32:06.338+08:00 WARN 22532 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityPoolRuleDeptMapper' and 'com.crm.rule.mapper.OpportunityPoolRuleDeptMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:32:06.338+08:00 WARN 22532 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityPoolRuleMapper' and 'com.crm.rule.mapper.OpportunityPoolRuleMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:32:06.338+08:00 WARN 22532 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunitySchemeCardFieldMapper' and 'com.crm.rule.mapper.OpportunitySchemeCardFieldMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:32:06.338+08:00 WARN 22532 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunitySchemeCardTemplateDeptMapper' and 'com.crm.rule.mapper.OpportunitySchemeCardTemplateDeptMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:32:06.338+08:00 WARN 22532 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunitySchemeCardTemplateMapper' and 'com.crm.rule.mapper.OpportunitySchemeCardTemplateMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:32:06.338+08:00 WARN 22532 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunitySchemeFieldDefMapper' and 'com.crm.rule.mapper.OpportunitySchemeFieldDefMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:32:06.338+08:00 WARN 22532 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityStageNodeMapper' and 'com.crm.rule.mapper.OpportunityStageNodeMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:32:06.338+08:00 WARN 22532 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityStageTemplateDeptMapper' and 'com.crm.rule.mapper.OpportunityStageTemplateDeptMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:32:06.338+08:00 WARN 22532 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityStageTemplateMapper' and 'com.crm.rule.mapper.OpportunityStageTemplateMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:32:06.338+08:00 WARN 22532 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'sysRegionMapper' and 'com.crm.rule.mapper.SysRegionMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:32:06.338+08:00 WARN 22532 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'userColumnPreferenceMapper' and 'com.crm.preference.mapper.UserColumnPreferenceMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:32:06.338+08:00 WARN 22532 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'userSavedViewMapper' and 'com.crm.preference.mapper.UserSavedViewMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:32:06.339+08:00 WARN 22532 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'leadAttachmentMapper' and 'com.crm.lead.mapper.LeadAttachmentMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:32:06.339+08:00 WARN 22532 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'leadFeedbackMapper' and 'com.crm.lead.mapper.LeadFeedbackMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:32:06.339+08:00 WARN 22532 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'leadFollowMapper' and 'com.crm.lead.mapper.LeadFollowMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:32:06.339+08:00 WARN 22532 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'leadHistoryMapper' and 'com.crm.lead.mapper.LeadHistoryMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:32:06.339+08:00 WARN 22532 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'leadMapper' and 'com.crm.lead.mapper.LeadMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:32:06.339+08:00 WARN 22532 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityAttachmentMapper' and 'com.crm.opportunity.mapper.OpportunityAttachmentMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:32:06.339+08:00 WARN 22532 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityCustomerMapper' and 'com.crm.opportunity.mapper.OpportunityCustomerMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:32:06.339+08:00 WARN 22532 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityFocusMapper' and 'com.crm.opportunity.mapper.OpportunityFocusMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:32:06.339+08:00 WARN 22532 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityFollowMapper' and 'com.crm.opportunity.mapper.OpportunityFollowMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:32:06.339+08:00 WARN 22532 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityMapper' and 'com.crm.opportunity.mapper.OpportunityMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:32:06.339+08:00 WARN 22532 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityOplogMapper' and 'com.crm.opportunity.mapper.OpportunityOplogMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:32:06.339+08:00 WARN 22532 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityPendingNoticeMapper' and 'com.crm.opportunity.mapper.OpportunityPendingNoticeMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:32:06.339+08:00 WARN 22532 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunitySchemeCardMapper' and 'com.crm.opportunity.mapper.OpportunitySchemeCardMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:32:06.339+08:00 WARN 22532 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunitySchemeCardValueMapper' and 'com.crm.opportunity.mapper.OpportunitySchemeCardValueMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:32:06.339+08:00 WARN 22532 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunitySiteSurveyMapper' and 'com.crm.opportunity.mapper.OpportunitySiteSurveyMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:32:06.340+08:00 WARN 22532 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityStageHistoryMapper' and 'com.crm.opportunity.mapper.OpportunityStageHistoryMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:32:06.340+08:00 WARN 22532 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityStatusHistoryMapper' and 'com.crm.opportunity.mapper.OpportunityStatusHistoryMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:32:06.340+08:00 WARN 22532 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityTeamMapper' and 'com.crm.opportunity.mapper.OpportunityTeamMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:32:06.340+08:00 WARN 22532 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityViewLogMapper' and 'com.crm.opportunity.mapper.OpportunityViewLogMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:32:06.340+08:00 WARN 22532 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityWorkPlanMapper' and 'com.crm.opportunity.mapper.OpportunityWorkPlanMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:32:06.340+08:00 WARN 22532 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'customerContactMapper' and 'com.crm.customer.mapper.CustomerContactMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:32:06.340+08:00 WARN 22532 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'customerFocusMapper' and 'com.crm.customer.mapper.CustomerFocusMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:32:06.340+08:00 WARN 22532 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'customerFollowMapper' and 'com.crm.customer.mapper.CustomerFollowMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:32:06.340+08:00 WARN 22532 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'customerImportFailMapper' and 'com.crm.customer.mapper.CustomerImportFailMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:32:06.340+08:00 WARN 22532 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'customerImportTaskMapper' and 'com.crm.customer.mapper.CustomerImportTaskMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:32:06.340+08:00 WARN 22532 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'customerMapper' and 'com.crm.customer.mapper.CustomerMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:32:06.340+08:00 WARN 22532 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'customerOplogMapper' and 'com.crm.customer.mapper.CustomerOplogMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:32:06.340+08:00 WARN 22532 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'customerPendingNoticeMapper' and 'com.crm.customer.mapper.CustomerPendingNoticeMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:32:06.341+08:00 WARN 22532 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'customerTeamMemberMapper' and 'com.crm.customer.mapper.CustomerTeamMemberMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:32:06.341+08:00 WARN 22532 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'customerTransferDetailMapper' and 'com.crm.customer.mapper.CustomerTransferDetailMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:32:06.341+08:00 WARN 22532 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'customerTransferMapper' and 'com.crm.customer.mapper.CustomerTransferMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:32:06.341+08:00 WARN 22532 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'customerViewLogMapper' and 'com.crm.customer.mapper.CustomerViewLogMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:32:06.341+08:00 WARN 22532 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : No MyBatis mapper was found in '[com.crm.**.mapper]' package. Please check your configuration. -2026-09-04T00:32:06.346+08:00 WARN 22532 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'crmBaseMapper' and 'com.crm.base.mapper.CrmBaseMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:32:06.346+08:00 WARN 22532 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'authIdentityMapper' and 'com.crm.auth.mapper.AuthIdentityMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:32:06.346+08:00 WARN 22532 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'authUserMapper' and 'com.crm.auth.mapper.AuthUserMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:32:06.346+08:00 WARN 22532 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'sysDataScopeModuleMapper' and 'com.crm.auth.mapper.SysDataScopeModuleMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:32:06.346+08:00 WARN 22532 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'sysDeptMapper' and 'com.crm.auth.mapper.SysDeptMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:32:06.346+08:00 WARN 22532 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'sysMenuMapper' and 'com.crm.auth.mapper.SysMenuMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:32:06.346+08:00 WARN 22532 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'sysRoleDataScopeMapper' and 'com.crm.auth.mapper.SysRoleDataScopeMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:32:06.346+08:00 WARN 22532 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'sysRoleMapper' and 'com.crm.auth.mapper.SysRoleMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:32:06.347+08:00 WARN 22532 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'sysRoleMenuMapper' and 'com.crm.auth.mapper.SysRoleMenuMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:32:06.347+08:00 WARN 22532 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'sysUserDeptMapper' and 'com.crm.auth.mapper.SysUserDeptMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:32:06.347+08:00 WARN 22532 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'sysUserRoleMapper' and 'com.crm.auth.mapper.SysUserRoleMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:32:06.347+08:00 WARN 22532 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'fileInfoMapper' and 'com.crm.file.mapper.FileInfoMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:32:06.347+08:00 WARN 22532 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'dictGroupDefaultMapper' and 'com.crm.dict.mapper.DictGroupDefaultMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:32:06.347+08:00 WARN 22532 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'dictGroupMapper' and 'com.crm.dict.mapper.DictGroupMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:32:06.347+08:00 WARN 22532 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'dictItemMapper' and 'com.crm.dict.mapper.DictItemMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:32:06.347+08:00 WARN 22532 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'dictRefCountMapper' and 'com.crm.dict.mapper.DictRefCountMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:32:06.347+08:00 WARN 22532 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'customerReminderRuleMapper' and 'com.crm.rule.mapper.CustomerReminderRuleMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:32:06.347+08:00 WARN 22532 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'leadPoolMapper' and 'com.crm.rule.mapper.LeadPoolMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:32:06.347+08:00 WARN 22532 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'leadPoolMemberMapper' and 'com.crm.rule.mapper.LeadPoolMemberMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:32:06.347+08:00 WARN 22532 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'leadPoolProvinceMapper' and 'com.crm.rule.mapper.LeadPoolProvinceMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:32:06.347+08:00 WARN 22532 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'leadPoolRegionMapper' and 'com.crm.rule.mapper.LeadPoolRegionMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:32:06.347+08:00 WARN 22532 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityPoolRuleDeptMapper' and 'com.crm.rule.mapper.OpportunityPoolRuleDeptMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:32:06.347+08:00 WARN 22532 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityPoolRuleMapper' and 'com.crm.rule.mapper.OpportunityPoolRuleMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:32:06.348+08:00 WARN 22532 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunitySchemeCardFieldMapper' and 'com.crm.rule.mapper.OpportunitySchemeCardFieldMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:32:06.348+08:00 WARN 22532 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunitySchemeCardTemplateDeptMapper' and 'com.crm.rule.mapper.OpportunitySchemeCardTemplateDeptMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:32:06.348+08:00 WARN 22532 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunitySchemeCardTemplateMapper' and 'com.crm.rule.mapper.OpportunitySchemeCardTemplateMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:32:06.348+08:00 WARN 22532 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunitySchemeFieldDefMapper' and 'com.crm.rule.mapper.OpportunitySchemeFieldDefMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:32:06.348+08:00 WARN 22532 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityStageNodeMapper' and 'com.crm.rule.mapper.OpportunityStageNodeMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:32:06.348+08:00 WARN 22532 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityStageTemplateDeptMapper' and 'com.crm.rule.mapper.OpportunityStageTemplateDeptMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:32:06.348+08:00 WARN 22532 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityStageTemplateMapper' and 'com.crm.rule.mapper.OpportunityStageTemplateMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:32:06.348+08:00 WARN 22532 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'sysRegionMapper' and 'com.crm.rule.mapper.SysRegionMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:32:06.348+08:00 WARN 22532 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'userColumnPreferenceMapper' and 'com.crm.preference.mapper.UserColumnPreferenceMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:32:06.348+08:00 WARN 22532 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'userSavedViewMapper' and 'com.crm.preference.mapper.UserSavedViewMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:32:06.348+08:00 WARN 22532 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'leadAttachmentMapper' and 'com.crm.lead.mapper.LeadAttachmentMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:32:06.348+08:00 WARN 22532 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'leadFeedbackMapper' and 'com.crm.lead.mapper.LeadFeedbackMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:32:06.348+08:00 WARN 22532 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'leadFollowMapper' and 'com.crm.lead.mapper.LeadFollowMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:32:06.348+08:00 WARN 22532 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'leadHistoryMapper' and 'com.crm.lead.mapper.LeadHistoryMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:32:06.348+08:00 WARN 22532 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'leadMapper' and 'com.crm.lead.mapper.LeadMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:32:06.348+08:00 WARN 22532 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityAttachmentMapper' and 'com.crm.opportunity.mapper.OpportunityAttachmentMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:32:06.348+08:00 WARN 22532 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityCustomerMapper' and 'com.crm.opportunity.mapper.OpportunityCustomerMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:32:06.348+08:00 WARN 22532 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityFocusMapper' and 'com.crm.opportunity.mapper.OpportunityFocusMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:32:06.349+08:00 WARN 22532 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityFollowMapper' and 'com.crm.opportunity.mapper.OpportunityFollowMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:32:06.349+08:00 WARN 22532 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityMapper' and 'com.crm.opportunity.mapper.OpportunityMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:32:06.349+08:00 WARN 22532 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityOplogMapper' and 'com.crm.opportunity.mapper.OpportunityOplogMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:32:06.349+08:00 WARN 22532 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityPendingNoticeMapper' and 'com.crm.opportunity.mapper.OpportunityPendingNoticeMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:32:06.349+08:00 WARN 22532 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunitySchemeCardMapper' and 'com.crm.opportunity.mapper.OpportunitySchemeCardMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:32:06.349+08:00 WARN 22532 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunitySchemeCardValueMapper' and 'com.crm.opportunity.mapper.OpportunitySchemeCardValueMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:32:06.349+08:00 WARN 22532 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunitySiteSurveyMapper' and 'com.crm.opportunity.mapper.OpportunitySiteSurveyMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:32:06.349+08:00 WARN 22532 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityStageHistoryMapper' and 'com.crm.opportunity.mapper.OpportunityStageHistoryMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:32:06.349+08:00 WARN 22532 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityStatusHistoryMapper' and 'com.crm.opportunity.mapper.OpportunityStatusHistoryMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:32:06.349+08:00 WARN 22532 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityTeamMapper' and 'com.crm.opportunity.mapper.OpportunityTeamMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:32:06.349+08:00 WARN 22532 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityViewLogMapper' and 'com.crm.opportunity.mapper.OpportunityViewLogMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:32:06.349+08:00 WARN 22532 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityWorkPlanMapper' and 'com.crm.opportunity.mapper.OpportunityWorkPlanMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:32:06.349+08:00 WARN 22532 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'customerContactMapper' and 'com.crm.customer.mapper.CustomerContactMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:32:06.349+08:00 WARN 22532 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'customerFocusMapper' and 'com.crm.customer.mapper.CustomerFocusMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:32:06.350+08:00 WARN 22532 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'customerFollowMapper' and 'com.crm.customer.mapper.CustomerFollowMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:32:06.350+08:00 WARN 22532 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'customerImportFailMapper' and 'com.crm.customer.mapper.CustomerImportFailMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:32:06.350+08:00 WARN 22532 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'customerImportTaskMapper' and 'com.crm.customer.mapper.CustomerImportTaskMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:32:06.350+08:00 WARN 22532 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'customerMapper' and 'com.crm.customer.mapper.CustomerMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:32:06.350+08:00 WARN 22532 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'customerOplogMapper' and 'com.crm.customer.mapper.CustomerOplogMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:32:06.350+08:00 WARN 22532 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'customerPendingNoticeMapper' and 'com.crm.customer.mapper.CustomerPendingNoticeMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:32:06.350+08:00 WARN 22532 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'customerTeamMemberMapper' and 'com.crm.customer.mapper.CustomerTeamMemberMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:32:06.350+08:00 WARN 22532 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'customerTransferDetailMapper' and 'com.crm.customer.mapper.CustomerTransferDetailMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:32:06.350+08:00 WARN 22532 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'customerTransferMapper' and 'com.crm.customer.mapper.CustomerTransferMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:32:06.350+08:00 WARN 22532 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'customerViewLogMapper' and 'com.crm.customer.mapper.CustomerViewLogMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:32:06.350+08:00 WARN 22532 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : No MyBatis mapper was found in '[com.crm.**.mapper]' package. Please check your configuration. -2026-09-04T00:32:07.164+08:00 INFO 22532 --- [crm-app] [main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port 8080 (http) -2026-09-04T00:32:07.184+08:00 INFO 22532 --- [crm-app] [main] o.apache.catalina.core.StandardService : Starting service [Tomcat] -2026-09-04T00:32:07.184+08:00 INFO 22532 --- [crm-app] [main] o.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/10.1.31] -2026-09-04T00:32:07.226+08:00 INFO 22532 --- [crm-app] [main] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext -2026-09-04T00:32:07.227+08:00 INFO 22532 --- [crm-app] [main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 2429 ms -2026-09-04T00:32:07.673+08:00 INFO 22532 --- [crm-app] [main] com.crm.auth.config.PermissionConfig : 数据权限受控表扫描完成:0 张 -2026-09-04T00:32:07.795+08:00 INFO 22532 --- [crm-app] [main] com.crm.base.config.CustomIdGenerator : 雪花ID生成器初始化完成,workerId=0, datacenterId=0 -2026-09-04T00:32:08.341+08:00 INFO 22532 --- [crm-app] [main] o.hibernate.jpa.internal.util.LogHelper : HHH000204: Processing PersistenceUnitInfo [name: default] -2026-09-04T00:32:08.406+08:00 INFO 22532 --- [crm-app] [main] org.hibernate.Version : HHH000412: Hibernate ORM core version 6.5.3.Final -2026-09-04T00:32:08.446+08:00 INFO 22532 --- [crm-app] [main] o.h.c.internal.RegionFactoryInitiator : HHH000026: Second-level cache disabled -2026-09-04T00:32:08.760+08:00 INFO 22532 --- [crm-app] [main] o.s.o.j.p.SpringPersistenceUnitInfo : No LoadTimeWeaver setup: ignoring JPA class transformer -2026-09-04T00:32:08.795+08:00 INFO 22532 --- [crm-app] [main] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Starting... -2026-09-04T00:32:09.358+08:00 INFO 22532 --- [crm-app] [main] com.zaxxer.hikari.pool.HikariPool : HikariPool-1 - Added connection com.mysql.cj.jdbc.ConnectionImpl@1407b93f -2026-09-04T00:32:09.361+08:00 INFO 22532 --- [crm-app] [main] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Start completed. -2026-09-04T00:32:09.552+08:00 WARN 22532 --- [crm-app] [main] org.hibernate.orm.deprecation : HHH90000025: MySQLDialect does not need to be specified explicitly using 'hibernate.dialect' (remove the property setting and it will be selected by default) -2026-09-04T00:32:11.197+08:00 INFO 22532 --- [crm-app] [main] o.h.e.t.j.p.i.JtaPlatformInitiator : HHH000489: No JTA platform available (set 'hibernate.transaction.jta.platform' to enable JTA platform integration) -2026-09-04T00:32:26.018+08:00 INFO 22532 --- [crm-app] [main] j.LocalContainerEntityManagerFactoryBean : Initialized JPA EntityManagerFactory for persistence unit 'default' -2026-09-04T00:32:26.474+08:00 WARN 22532 --- [crm-app] [main] c.c.a.controller.DebugTokenController : ============================================================ -2026-09-04T00:32:26.475+08:00 WARN 22532 --- [crm-app] [main] c.c.a.controller.DebugTokenController : 调试 token 接口 /api/auth/debug/token 已启用(verify profile) -2026-09-04T00:32:26.475+08:00 WARN 22532 --- [crm-app] [main] c.c.a.controller.DebugTokenController : 严禁用于生产环境!任何知道 userId 的人可冒充该用户。 -2026-09-04T00:32:26.475+08:00 WARN 22532 --- [crm-app] [main] c.c.a.controller.DebugTokenController : 参见 docs/adr/0014-verify-profile-debug-token-endpoint.md -2026-09-04T00:32:26.475+08:00 WARN 22532 --- [crm-app] [main] c.c.a.controller.DebugTokenController : ============================================================ -2026-09-04T00:32:28.709+08:00 INFO 22532 --- [crm-app] [main] c.c.c.p.i.NgramNameSimilarityPortImpl : CustomerNameSimilarityPort 一期实现就绪(预筛模式:FULLTEXT ngram) -2026-09-04T00:32:28.889+08:00 INFO 22532 --- [crm-app] [main] c.c.c.p.impl.StubCompanyLookupPortImpl : CompanyLookupPort 一期 stub 已装配(企查查未接入,工商候选返回空) -2026-09-04T00:32:29.108+08:00 INFO 22532 --- [crm-app] [main] c.c.c.p.i.NoopProjectOwnerSyncPortImpl : ProjectOwnerSyncPort no-op 默认实现已装配(A5 项目模块未建,owner 同步跳过) -2026-09-04T00:32:29.172+08:00 INFO 22532 --- [crm-app] [main] c.c.p.i.NoopOpportunityOwnerSyncPortImpl : OpportunityOwnerSyncPort no-op 默认实现已装配(票 11 接商机真源后替换) -2026-09-04T00:32:29.341+08:00 WARN 22532 --- [crm-app] [main] .s.s.UserDetailsServiceAutoConfiguration : - -Using generated security password: 949d4766-52f7-4538-8def-47edfb8cb2d5 - -This generated password is for development use only. Your security configuration must be updated before running your application in production. - -2026-09-04T00:32:29.363+08:00 INFO 22532 --- [crm-app] [main] r$InitializeUserDetailsManagerConfigurer : Global AuthenticationManager configured with UserDetailsService bean with name inMemoryUserDetailsManager -2026-09-04T00:32:30.401+08:00 INFO 22532 --- [crm-app] [main] c.c.a.c.DataScopeModuleStartupValidator : 数据权限模块校验通过:0 张受控表,4 个注册模块 -2026-09-04T00:32:30.424+08:00 INFO 22532 --- [crm-app] [main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port 8080 (http) with context path '/' -2026-09-04T00:32:30.446+08:00 INFO 22532 --- [crm-app] [main] com.crm.app.CrmAppApplication : Started CrmAppApplication in 26.167 seconds (process running for 26.854) -2026-09-04T00:32:30.450+08:00 INFO 22532 --- [crm-app] [main] com.crm.auth.config.DataInitializer : 执行权限数据初始化检查... -2026-09-04T00:32:31.191+08:00 INFO 22532 --- [crm-app] [main] com.crm.auth.config.DataInitializer : 权限数据初始化检查完成 -2026-09-04T00:32:31.191+08:00 INFO 22532 --- [crm-app] [main] c.c.d.config.DictPermissionInitializer : 执行数据字典权限种子化检查... -2026-09-04T00:32:31.610+08:00 INFO 22532 --- [crm-app] [main] c.c.d.config.DictPermissionInitializer : 数据字典权限种子化检查完成:10 个权限点 -2026-09-04T00:32:31.610+08:00 INFO 22532 --- [crm-app] [main] c.c.r.config.RulePermissionInitializer : 执行线索规则权限种子化检查(仅菜单)... -2026-09-04T00:32:31.718+08:00 INFO 22532 --- [crm-app] [main] c.c.r.config.RulePermissionInitializer : 线索规则权限种子化检查完成:仅菜单(0 个 button) -2026-09-04T00:32:31.718+08:00 INFO 22532 --- [crm-app] [main] c.crm.rule.config.RegionDataInitializer : 执行行政区划全量种子导入检查... -2026-09-04T00:32:33.177+08:00 INFO 22532 --- [crm-app] [main] c.crm.rule.config.RegionDataInitializer : 行政区划种子导入完成:对账 3432 行(省 34 / 市 342 / 区 3056),存量 3432 行,新增 0 行 -2026-09-04T00:32:33.177+08:00 INFO 22532 --- [crm-app] [main] c.c.l.config.LeadPermissionInitializer : 执行线索管理权限种子化检查(仅菜单)... -2026-09-04T00:32:33.599+08:00 INFO 22532 --- [crm-app] [main] c.c.l.config.LeadPermissionInitializer : 线索管理权限种子化检查完成:4 个菜单(0 个 button) -2026-09-04T00:32:33.600+08:00 INFO 22532 --- [crm-app] [main] r.c.OpportunityRulePermissionInitializer : 执行商机规则权限种子化检查(仅菜单)... -2026-09-04T00:32:33.702+08:00 INFO 22532 --- [crm-app] [main] r.c.OpportunityRulePermissionInitializer : 商机规则权限种子化检查完成:仅菜单(0 个 button) -2026-09-04T00:32:33.702+08:00 INFO 22532 --- [crm-app] [main] ustomerReminderRulePermissionInitializer : 执行客户提醒规则权限种子化检查(仅菜单)... -2026-09-04T00:32:33.804+08:00 INFO 22532 --- [crm-app] [main] ustomerReminderRulePermissionInitializer : 客户提醒规则权限种子化检查完成:仅菜单(0 个 button) -2026-09-04T00:32:33.804+08:00 INFO 22532 --- [crm-app] [main] tunityStageTemplatePermissionInitializer : 执行商机阶段模板权限种子化检查(仅菜单)... -2026-09-04T00:32:33.908+08:00 INFO 22532 --- [crm-app] [main] tunityStageTemplatePermissionInitializer : 商机阶段模板权限种子化检查完成:仅菜单(0 个 button) -2026-09-04T00:32:33.908+08:00 INFO 22532 --- [crm-app] [main] c.c.r.config.SchemeFieldDefInitializer : 执行方案卡系统字段库种子化检查... -2026-09-04T00:32:33.921+08:00 INFO 22532 --- [crm-app] [main] c.c.r.config.SchemeFieldDefInitializer : 方案卡系统字段库种子化检查完成:现存 16 个,新增 0 个 -2026-09-04T00:32:33.937+08:00 INFO 22532 --- [crm-app] [main] c.c.r.config.SchemeFieldDefInitializer : 方案卡兜底模板已存在(code=OPP_SCHEME_TPL_01,含已停用),跳过种子化 -2026-09-04T00:32:33.937+08:00 INFO 22532 --- [crm-app] [main] ySchemeCardTemplatePermissionInitializer : 执行方案卡模板权限种子化检查(仅菜单)... -2026-09-04T00:32:34.039+08:00 INFO 22532 --- [crm-app] [main] ySchemeCardTemplatePermissionInitializer : 方案卡模板权限种子化检查完成:仅菜单(0 个 button) -2026-09-04T00:32:34.055+08:00 INFO 22532 --- [crm-app] [main] c.c.r.config.StageTemplateInitializer : 默认阶段模板已存在(code=OPP_STAGE_TPL_01,含已停用),跳过种子化 -2026-09-04T00:32:34.069+08:00 INFO 22532 --- [crm-app] [main] c.c.r.c.CustomerReminderRuleInitializer : 客户提醒规则单例已存在(id=1),跳过种子化 -2026-09-04T00:32:34.081+08:00 INFO 22532 --- [crm-app] [main] c.c.c.c.CustomerFulltextIndexInitializer : customer FULLTEXT 索引 idx_name_fulltext 已存在,跳过 -2026-09-04T00:32:34.255+08:00 INFO 22532 --- [crm-app] [main] c.crm.dict.config.DictDataInitializer : 执行内置字典幂等初始化检查... -2026-09-04T00:32:35.417+08:00 INFO 22532 --- [crm-app] [http-nio-8080-exec-2] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring DispatcherServlet 'dispatcherServlet' -2026-09-04T00:32:35.417+08:00 INFO 22532 --- [crm-app] [http-nio-8080-exec-2] o.s.web.servlet.DispatcherServlet : Initializing Servlet 'dispatcherServlet' -2026-09-04T00:32:35.418+08:00 INFO 22532 --- [crm-app] [http-nio-8080-exec-2] o.s.web.servlet.DispatcherServlet : Completed initialization in 1 ms -2026-09-04T00:32:44.294+08:00 INFO 22532 --- [crm-app] [main] c.crm.dict.config.DictDataInitializer : 内置字典幂等初始化检查完成:24 个分组 -2026-09-04T00:33:00.018+08:00 INFO 22532 --- [crm-app] [scheduling-1] c.crm.customer.job.CustomerReminderJob : [客户提醒Job] 开始,now=2026-09-04T00:33:00.018664400 -2026-09-04T00:33:00.079+08:00 INFO 22532 --- [crm-app] [scheduling-1] c.crm.customer.job.CustomerReminderJob : [客户提醒Job] 完成:新增待发 0 条,旧锚点失效 0 条 -2026-09-04T00:33:30.002+08:00 INFO 22532 --- [crm-app] [scheduling-1] c.crm.customer.job.CustomerReminderJob : [客户提醒Job] 开始,now=2026-09-04T00:33:30.002177800 -2026-09-04T00:33:30.054+08:00 INFO 22532 --- [crm-app] [scheduling-1] c.crm.customer.job.CustomerReminderJob : [客户提醒Job] 完成:新增待发 0 条,旧锚点失效 0 条 -2026-09-04T00:34:00.009+08:00 INFO 22532 --- [crm-app] [scheduling-1] c.crm.customer.job.CustomerReminderJob : [客户提醒Job] 开始,now=2026-09-04T00:34:00.009578800 -2026-09-04T00:34:00.061+08:00 INFO 22532 --- [crm-app] [scheduling-1] c.crm.customer.job.CustomerReminderJob : [客户提醒Job] 完成:新增待发 0 条,旧锚点失效 0 条 -2026-09-04T00:34:30.001+08:00 INFO 22532 --- [crm-app] [scheduling-1] c.crm.customer.job.CustomerReminderJob : [客户提醒Job] 开始,now=2026-09-04T00:34:30.001073300 -2026-09-04T00:34:30.051+08:00 INFO 22532 --- [crm-app] [scheduling-1] c.crm.customer.job.CustomerReminderJob : [客户提醒Job] 完成:新增待发 0 条,旧锚点失效 0 条 -2026-09-04T00:35:00.010+08:00 INFO 22532 --- [crm-app] [scheduling-1] c.crm.customer.job.CustomerReminderJob : [客户提醒Job] 开始,now=2026-09-04T00:35:00.010265900 -2026-09-04T00:35:00.090+08:00 INFO 22532 --- [crm-app] [scheduling-1] c.crm.customer.job.CustomerReminderJob : [客户提醒Job] 完成:新增待发 0 条,旧锚点失效 30 条 -2026-09-04T00:35:30.005+08:00 INFO 22532 --- [crm-app] [scheduling-1] c.crm.customer.job.CustomerReminderJob : [客户提醒Job] 开始,now=2026-09-04T00:35:30.005059400 -2026-09-04T00:35:30.055+08:00 INFO 22532 --- [crm-app] [scheduling-1] c.crm.customer.job.CustomerReminderJob : [客户提醒Job] 完成:新增待发 0 条,旧锚点失效 0 条 -2026-09-04T00:36:00.008+08:00 INFO 22532 --- [crm-app] [scheduling-1] c.crm.customer.job.CustomerReminderJob : [客户提醒Job] 开始,now=2026-09-04T00:36:00.008122300 -2026-09-04T00:36:00.058+08:00 INFO 22532 --- [crm-app] [scheduling-1] c.crm.customer.job.CustomerReminderJob : [客户提醒Job] 完成:新增待发 0 条,旧锚点失效 0 条 -2026-09-04T00:36:07.855+08:00 INFO 22532 --- [crm-app] [http-nio-8080-exec-5] .c.r.s.i.CustomerReminderRuleServiceImpl : [客户提醒规则] 全量覆盖保存:operator=739564171091247104, masterEnabled=1, firstTrigger=1/30天, secondInterval=1/7天 -2026-09-04T00:36:10.796+08:00 INFO 10812 --- [crm-app] [main] com.crm.app.CrmAppApplication : Starting CrmAppApplication v1.0.0-SNAPSHOT using Java 21.0.7 with PID 10812 (E:\code\crm-backend-matt\crm-app\target\crm-app-1.0.0-SNAPSHOT.jar started by Administrator in e:\code\crm-backend-matt) -2026-09-04T00:36:10.798+08:00 INFO 10812 --- [crm-app] [main] com.crm.app.CrmAppApplication : The following 1 profile is active: "verify" -2026-09-04T00:36:12.139+08:00 INFO 10812 --- [crm-app] [main] .s.d.r.c.RepositoryConfigurationDelegate : Multiple Spring Data modules found, entering strict repository configuration mode -2026-09-04T00:36:12.142+08:00 INFO 10812 --- [crm-app] [main] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data JPA repositories in DEFAULT mode. -2026-09-04T00:36:12.171+08:00 INFO 10812 --- [crm-app] [main] .s.d.r.c.RepositoryConfigurationDelegate : Finished Spring Data repository scanning in 20 ms. Found 0 JPA repository interfaces. -2026-09-04T00:36:12.190+08:00 INFO 10812 --- [crm-app] [main] .s.d.r.c.RepositoryConfigurationDelegate : Multiple Spring Data modules found, entering strict repository configuration mode -2026-09-04T00:36:12.191+08:00 INFO 10812 --- [crm-app] [main] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data Redis repositories in DEFAULT mode. -2026-09-04T00:36:12.201+08:00 INFO 10812 --- [crm-app] [main] .s.d.r.c.RepositoryConfigurationDelegate : Finished Spring Data repository scanning in 2 ms. Found 0 Redis repository interfaces. -2026-09-04T00:36:12.363+08:00 WARN 10812 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'crmBaseMapper' and 'com.crm.base.mapper.CrmBaseMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:36:12.364+08:00 WARN 10812 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'authIdentityMapper' and 'com.crm.auth.mapper.AuthIdentityMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:36:12.364+08:00 WARN 10812 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'authUserMapper' and 'com.crm.auth.mapper.AuthUserMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:36:12.364+08:00 WARN 10812 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'sysDataScopeModuleMapper' and 'com.crm.auth.mapper.SysDataScopeModuleMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:36:12.364+08:00 WARN 10812 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'sysDeptMapper' and 'com.crm.auth.mapper.SysDeptMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:36:12.364+08:00 WARN 10812 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'sysMenuMapper' and 'com.crm.auth.mapper.SysMenuMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:36:12.364+08:00 WARN 10812 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'sysRoleDataScopeMapper' and 'com.crm.auth.mapper.SysRoleDataScopeMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:36:12.364+08:00 WARN 10812 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'sysRoleMapper' and 'com.crm.auth.mapper.SysRoleMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:36:12.364+08:00 WARN 10812 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'sysRoleMenuMapper' and 'com.crm.auth.mapper.SysRoleMenuMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:36:12.364+08:00 WARN 10812 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'sysUserDeptMapper' and 'com.crm.auth.mapper.SysUserDeptMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:36:12.364+08:00 WARN 10812 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'sysUserRoleMapper' and 'com.crm.auth.mapper.SysUserRoleMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:36:12.364+08:00 WARN 10812 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'fileInfoMapper' and 'com.crm.file.mapper.FileInfoMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:36:12.365+08:00 WARN 10812 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'dictGroupDefaultMapper' and 'com.crm.dict.mapper.DictGroupDefaultMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:36:12.365+08:00 WARN 10812 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'dictGroupMapper' and 'com.crm.dict.mapper.DictGroupMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:36:12.365+08:00 WARN 10812 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'dictItemMapper' and 'com.crm.dict.mapper.DictItemMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:36:12.365+08:00 WARN 10812 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'dictRefCountMapper' and 'com.crm.dict.mapper.DictRefCountMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:36:12.365+08:00 WARN 10812 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'customerReminderRuleMapper' and 'com.crm.rule.mapper.CustomerReminderRuleMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:36:12.365+08:00 WARN 10812 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'leadPoolMapper' and 'com.crm.rule.mapper.LeadPoolMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:36:12.365+08:00 WARN 10812 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'leadPoolMemberMapper' and 'com.crm.rule.mapper.LeadPoolMemberMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:36:12.365+08:00 WARN 10812 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'leadPoolProvinceMapper' and 'com.crm.rule.mapper.LeadPoolProvinceMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:36:12.365+08:00 WARN 10812 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'leadPoolRegionMapper' and 'com.crm.rule.mapper.LeadPoolRegionMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:36:12.365+08:00 WARN 10812 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityPoolRuleDeptMapper' and 'com.crm.rule.mapper.OpportunityPoolRuleDeptMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:36:12.365+08:00 WARN 10812 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityPoolRuleMapper' and 'com.crm.rule.mapper.OpportunityPoolRuleMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:36:12.365+08:00 WARN 10812 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunitySchemeCardFieldMapper' and 'com.crm.rule.mapper.OpportunitySchemeCardFieldMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:36:12.365+08:00 WARN 10812 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunitySchemeCardTemplateDeptMapper' and 'com.crm.rule.mapper.OpportunitySchemeCardTemplateDeptMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:36:12.365+08:00 WARN 10812 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunitySchemeCardTemplateMapper' and 'com.crm.rule.mapper.OpportunitySchemeCardTemplateMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:36:12.365+08:00 WARN 10812 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunitySchemeFieldDefMapper' and 'com.crm.rule.mapper.OpportunitySchemeFieldDefMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:36:12.365+08:00 WARN 10812 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityStageNodeMapper' and 'com.crm.rule.mapper.OpportunityStageNodeMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:36:12.365+08:00 WARN 10812 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityStageTemplateDeptMapper' and 'com.crm.rule.mapper.OpportunityStageTemplateDeptMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:36:12.366+08:00 WARN 10812 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityStageTemplateMapper' and 'com.crm.rule.mapper.OpportunityStageTemplateMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:36:12.366+08:00 WARN 10812 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'sysRegionMapper' and 'com.crm.rule.mapper.SysRegionMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:36:12.366+08:00 WARN 10812 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'userColumnPreferenceMapper' and 'com.crm.preference.mapper.UserColumnPreferenceMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:36:12.366+08:00 WARN 10812 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'userSavedViewMapper' and 'com.crm.preference.mapper.UserSavedViewMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:36:12.366+08:00 WARN 10812 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'leadAttachmentMapper' and 'com.crm.lead.mapper.LeadAttachmentMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:36:12.366+08:00 WARN 10812 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'leadFeedbackMapper' and 'com.crm.lead.mapper.LeadFeedbackMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:36:12.366+08:00 WARN 10812 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'leadFollowMapper' and 'com.crm.lead.mapper.LeadFollowMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:36:12.366+08:00 WARN 10812 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'leadHistoryMapper' and 'com.crm.lead.mapper.LeadHistoryMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:36:12.366+08:00 WARN 10812 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'leadMapper' and 'com.crm.lead.mapper.LeadMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:36:12.366+08:00 WARN 10812 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityAttachmentMapper' and 'com.crm.opportunity.mapper.OpportunityAttachmentMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:36:12.366+08:00 WARN 10812 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityCustomerMapper' and 'com.crm.opportunity.mapper.OpportunityCustomerMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:36:12.366+08:00 WARN 10812 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityFocusMapper' and 'com.crm.opportunity.mapper.OpportunityFocusMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:36:12.366+08:00 WARN 10812 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityFollowMapper' and 'com.crm.opportunity.mapper.OpportunityFollowMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:36:12.366+08:00 WARN 10812 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityMapper' and 'com.crm.opportunity.mapper.OpportunityMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:36:12.366+08:00 WARN 10812 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityOplogMapper' and 'com.crm.opportunity.mapper.OpportunityOplogMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:36:12.366+08:00 WARN 10812 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityPendingNoticeMapper' and 'com.crm.opportunity.mapper.OpportunityPendingNoticeMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:36:12.366+08:00 WARN 10812 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunitySchemeCardMapper' and 'com.crm.opportunity.mapper.OpportunitySchemeCardMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:36:12.366+08:00 WARN 10812 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunitySchemeCardValueMapper' and 'com.crm.opportunity.mapper.OpportunitySchemeCardValueMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:36:12.366+08:00 WARN 10812 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunitySiteSurveyMapper' and 'com.crm.opportunity.mapper.OpportunitySiteSurveyMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:36:12.367+08:00 WARN 10812 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityStageHistoryMapper' and 'com.crm.opportunity.mapper.OpportunityStageHistoryMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:36:12.367+08:00 WARN 10812 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityStatusHistoryMapper' and 'com.crm.opportunity.mapper.OpportunityStatusHistoryMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:36:12.367+08:00 WARN 10812 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityTeamMapper' and 'com.crm.opportunity.mapper.OpportunityTeamMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:36:12.367+08:00 WARN 10812 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityViewLogMapper' and 'com.crm.opportunity.mapper.OpportunityViewLogMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:36:12.367+08:00 WARN 10812 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityWorkPlanMapper' and 'com.crm.opportunity.mapper.OpportunityWorkPlanMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:36:12.367+08:00 WARN 10812 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'customerContactMapper' and 'com.crm.customer.mapper.CustomerContactMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:36:12.367+08:00 WARN 10812 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'customerFocusMapper' and 'com.crm.customer.mapper.CustomerFocusMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:36:12.367+08:00 WARN 10812 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'customerFollowMapper' and 'com.crm.customer.mapper.CustomerFollowMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:36:12.367+08:00 WARN 10812 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'customerImportFailMapper' and 'com.crm.customer.mapper.CustomerImportFailMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:36:12.367+08:00 WARN 10812 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'customerImportTaskMapper' and 'com.crm.customer.mapper.CustomerImportTaskMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:36:12.367+08:00 WARN 10812 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'customerMapper' and 'com.crm.customer.mapper.CustomerMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:36:12.367+08:00 WARN 10812 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'customerOplogMapper' and 'com.crm.customer.mapper.CustomerOplogMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:36:12.367+08:00 WARN 10812 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'customerPendingNoticeMapper' and 'com.crm.customer.mapper.CustomerPendingNoticeMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:36:12.367+08:00 WARN 10812 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'customerTeamMemberMapper' and 'com.crm.customer.mapper.CustomerTeamMemberMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:36:12.367+08:00 WARN 10812 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'customerTransferDetailMapper' and 'com.crm.customer.mapper.CustomerTransferDetailMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:36:12.367+08:00 WARN 10812 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'customerTransferMapper' and 'com.crm.customer.mapper.CustomerTransferMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:36:12.367+08:00 WARN 10812 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'customerViewLogMapper' and 'com.crm.customer.mapper.CustomerViewLogMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:36:12.368+08:00 WARN 10812 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : No MyBatis mapper was found in '[com.crm.**.mapper]' package. Please check your configuration. -2026-09-04T00:36:12.371+08:00 WARN 10812 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'crmBaseMapper' and 'com.crm.base.mapper.CrmBaseMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:36:12.371+08:00 WARN 10812 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'authIdentityMapper' and 'com.crm.auth.mapper.AuthIdentityMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:36:12.371+08:00 WARN 10812 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'authUserMapper' and 'com.crm.auth.mapper.AuthUserMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:36:12.371+08:00 WARN 10812 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'sysDataScopeModuleMapper' and 'com.crm.auth.mapper.SysDataScopeModuleMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:36:12.371+08:00 WARN 10812 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'sysDeptMapper' and 'com.crm.auth.mapper.SysDeptMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:36:12.371+08:00 WARN 10812 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'sysMenuMapper' and 'com.crm.auth.mapper.SysMenuMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:36:12.371+08:00 WARN 10812 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'sysRoleDataScopeMapper' and 'com.crm.auth.mapper.SysRoleDataScopeMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:36:12.371+08:00 WARN 10812 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'sysRoleMapper' and 'com.crm.auth.mapper.SysRoleMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:36:12.372+08:00 WARN 10812 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'sysRoleMenuMapper' and 'com.crm.auth.mapper.SysRoleMenuMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:36:12.372+08:00 WARN 10812 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'sysUserDeptMapper' and 'com.crm.auth.mapper.SysUserDeptMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:36:12.372+08:00 WARN 10812 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'sysUserRoleMapper' and 'com.crm.auth.mapper.SysUserRoleMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:36:12.372+08:00 WARN 10812 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'fileInfoMapper' and 'com.crm.file.mapper.FileInfoMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:36:12.372+08:00 WARN 10812 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'dictGroupDefaultMapper' and 'com.crm.dict.mapper.DictGroupDefaultMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:36:12.372+08:00 WARN 10812 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'dictGroupMapper' and 'com.crm.dict.mapper.DictGroupMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:36:12.372+08:00 WARN 10812 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'dictItemMapper' and 'com.crm.dict.mapper.DictItemMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:36:12.372+08:00 WARN 10812 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'dictRefCountMapper' and 'com.crm.dict.mapper.DictRefCountMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:36:12.372+08:00 WARN 10812 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'customerReminderRuleMapper' and 'com.crm.rule.mapper.CustomerReminderRuleMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:36:12.372+08:00 WARN 10812 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'leadPoolMapper' and 'com.crm.rule.mapper.LeadPoolMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:36:12.372+08:00 WARN 10812 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'leadPoolMemberMapper' and 'com.crm.rule.mapper.LeadPoolMemberMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:36:12.372+08:00 WARN 10812 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'leadPoolProvinceMapper' and 'com.crm.rule.mapper.LeadPoolProvinceMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:36:12.372+08:00 WARN 10812 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'leadPoolRegionMapper' and 'com.crm.rule.mapper.LeadPoolRegionMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:36:12.372+08:00 WARN 10812 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityPoolRuleDeptMapper' and 'com.crm.rule.mapper.OpportunityPoolRuleDeptMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:36:12.372+08:00 WARN 10812 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityPoolRuleMapper' and 'com.crm.rule.mapper.OpportunityPoolRuleMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:36:12.372+08:00 WARN 10812 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunitySchemeCardFieldMapper' and 'com.crm.rule.mapper.OpportunitySchemeCardFieldMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:36:12.372+08:00 WARN 10812 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunitySchemeCardTemplateDeptMapper' and 'com.crm.rule.mapper.OpportunitySchemeCardTemplateDeptMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:36:12.372+08:00 WARN 10812 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunitySchemeCardTemplateMapper' and 'com.crm.rule.mapper.OpportunitySchemeCardTemplateMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:36:12.372+08:00 WARN 10812 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunitySchemeFieldDefMapper' and 'com.crm.rule.mapper.OpportunitySchemeFieldDefMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:36:12.373+08:00 WARN 10812 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityStageNodeMapper' and 'com.crm.rule.mapper.OpportunityStageNodeMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:36:12.373+08:00 WARN 10812 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityStageTemplateDeptMapper' and 'com.crm.rule.mapper.OpportunityStageTemplateDeptMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:36:12.373+08:00 WARN 10812 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityStageTemplateMapper' and 'com.crm.rule.mapper.OpportunityStageTemplateMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:36:12.373+08:00 WARN 10812 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'sysRegionMapper' and 'com.crm.rule.mapper.SysRegionMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:36:12.373+08:00 WARN 10812 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'userColumnPreferenceMapper' and 'com.crm.preference.mapper.UserColumnPreferenceMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:36:12.373+08:00 WARN 10812 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'userSavedViewMapper' and 'com.crm.preference.mapper.UserSavedViewMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:36:12.373+08:00 WARN 10812 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'leadAttachmentMapper' and 'com.crm.lead.mapper.LeadAttachmentMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:36:12.373+08:00 WARN 10812 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'leadFeedbackMapper' and 'com.crm.lead.mapper.LeadFeedbackMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:36:12.373+08:00 WARN 10812 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'leadFollowMapper' and 'com.crm.lead.mapper.LeadFollowMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:36:12.373+08:00 WARN 10812 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'leadHistoryMapper' and 'com.crm.lead.mapper.LeadHistoryMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:36:12.373+08:00 WARN 10812 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'leadMapper' and 'com.crm.lead.mapper.LeadMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:36:12.373+08:00 WARN 10812 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityAttachmentMapper' and 'com.crm.opportunity.mapper.OpportunityAttachmentMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:36:12.373+08:00 WARN 10812 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityCustomerMapper' and 'com.crm.opportunity.mapper.OpportunityCustomerMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:36:12.373+08:00 WARN 10812 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityFocusMapper' and 'com.crm.opportunity.mapper.OpportunityFocusMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:36:12.373+08:00 WARN 10812 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityFollowMapper' and 'com.crm.opportunity.mapper.OpportunityFollowMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:36:12.373+08:00 WARN 10812 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityMapper' and 'com.crm.opportunity.mapper.OpportunityMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:36:12.373+08:00 WARN 10812 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityOplogMapper' and 'com.crm.opportunity.mapper.OpportunityOplogMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:36:12.373+08:00 WARN 10812 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityPendingNoticeMapper' and 'com.crm.opportunity.mapper.OpportunityPendingNoticeMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:36:12.373+08:00 WARN 10812 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunitySchemeCardMapper' and 'com.crm.opportunity.mapper.OpportunitySchemeCardMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:36:12.373+08:00 WARN 10812 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunitySchemeCardValueMapper' and 'com.crm.opportunity.mapper.OpportunitySchemeCardValueMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:36:12.373+08:00 WARN 10812 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunitySiteSurveyMapper' and 'com.crm.opportunity.mapper.OpportunitySiteSurveyMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:36:12.373+08:00 WARN 10812 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityStageHistoryMapper' and 'com.crm.opportunity.mapper.OpportunityStageHistoryMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:36:12.373+08:00 WARN 10812 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityStatusHistoryMapper' and 'com.crm.opportunity.mapper.OpportunityStatusHistoryMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:36:12.373+08:00 WARN 10812 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityTeamMapper' and 'com.crm.opportunity.mapper.OpportunityTeamMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:36:12.373+08:00 WARN 10812 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityViewLogMapper' and 'com.crm.opportunity.mapper.OpportunityViewLogMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:36:12.374+08:00 WARN 10812 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityWorkPlanMapper' and 'com.crm.opportunity.mapper.OpportunityWorkPlanMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:36:12.374+08:00 WARN 10812 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'customerContactMapper' and 'com.crm.customer.mapper.CustomerContactMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:36:12.374+08:00 WARN 10812 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'customerFocusMapper' and 'com.crm.customer.mapper.CustomerFocusMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:36:12.374+08:00 WARN 10812 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'customerFollowMapper' and 'com.crm.customer.mapper.CustomerFollowMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:36:12.374+08:00 WARN 10812 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'customerImportFailMapper' and 'com.crm.customer.mapper.CustomerImportFailMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:36:12.374+08:00 WARN 10812 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'customerImportTaskMapper' and 'com.crm.customer.mapper.CustomerImportTaskMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:36:12.374+08:00 WARN 10812 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'customerMapper' and 'com.crm.customer.mapper.CustomerMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:36:12.374+08:00 WARN 10812 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'customerOplogMapper' and 'com.crm.customer.mapper.CustomerOplogMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:36:12.374+08:00 WARN 10812 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'customerPendingNoticeMapper' and 'com.crm.customer.mapper.CustomerPendingNoticeMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:36:12.374+08:00 WARN 10812 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'customerTeamMemberMapper' and 'com.crm.customer.mapper.CustomerTeamMemberMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:36:12.374+08:00 WARN 10812 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'customerTransferDetailMapper' and 'com.crm.customer.mapper.CustomerTransferDetailMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:36:12.374+08:00 WARN 10812 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'customerTransferMapper' and 'com.crm.customer.mapper.CustomerTransferMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:36:12.374+08:00 WARN 10812 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'customerViewLogMapper' and 'com.crm.customer.mapper.CustomerViewLogMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T00:36:12.374+08:00 WARN 10812 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : No MyBatis mapper was found in '[com.crm.**.mapper]' package. Please check your configuration. -2026-09-04T00:36:13.125+08:00 INFO 10812 --- [crm-app] [main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port 8080 (http) -2026-09-04T00:36:13.141+08:00 INFO 10812 --- [crm-app] [main] o.apache.catalina.core.StandardService : Starting service [Tomcat] -2026-09-04T00:36:13.142+08:00 INFO 10812 --- [crm-app] [main] o.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/10.1.31] -2026-09-04T00:36:13.179+08:00 INFO 10812 --- [crm-app] [main] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext -2026-09-04T00:36:13.180+08:00 INFO 10812 --- [crm-app] [main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 2329 ms -2026-09-04T00:36:13.614+08:00 INFO 10812 --- [crm-app] [main] com.crm.auth.config.PermissionConfig : 数据权限受控表扫描完成:0 张 -2026-09-04T00:36:13.739+08:00 INFO 10812 --- [crm-app] [main] com.crm.base.config.CustomIdGenerator : 雪花ID生成器初始化完成,workerId=0, datacenterId=0 -2026-09-04T00:36:14.295+08:00 INFO 10812 --- [crm-app] [main] o.hibernate.jpa.internal.util.LogHelper : HHH000204: Processing PersistenceUnitInfo [name: default] -2026-09-04T00:36:14.354+08:00 INFO 10812 --- [crm-app] [main] org.hibernate.Version : HHH000412: Hibernate ORM core version 6.5.3.Final -2026-09-04T00:36:14.389+08:00 INFO 10812 --- [crm-app] [main] o.h.c.internal.RegionFactoryInitiator : HHH000026: Second-level cache disabled -2026-09-04T00:36:14.710+08:00 INFO 10812 --- [crm-app] [main] o.s.o.j.p.SpringPersistenceUnitInfo : No LoadTimeWeaver setup: ignoring JPA class transformer -2026-09-04T00:36:14.749+08:00 INFO 10812 --- [crm-app] [main] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Starting... -2026-09-04T00:36:15.296+08:00 INFO 10812 --- [crm-app] [main] com.zaxxer.hikari.pool.HikariPool : HikariPool-1 - Added connection com.mysql.cj.jdbc.ConnectionImpl@278df226 -2026-09-04T00:36:15.298+08:00 INFO 10812 --- [crm-app] [main] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Start completed. -2026-09-04T00:36:15.371+08:00 WARN 10812 --- [crm-app] [main] org.hibernate.orm.deprecation : HHH90000025: MySQLDialect does not need to be specified explicitly using 'hibernate.dialect' (remove the property setting and it will be selected by default) -2026-09-04T00:36:17.016+08:00 INFO 10812 --- [crm-app] [main] o.h.e.t.j.p.i.JtaPlatformInitiator : HHH000489: No JTA platform available (set 'hibernate.transaction.jta.platform' to enable JTA platform integration) -2026-09-04T00:36:31.418+08:00 INFO 10812 --- [crm-app] [main] j.LocalContainerEntityManagerFactoryBean : Initialized JPA EntityManagerFactory for persistence unit 'default' -2026-09-04T00:36:31.809+08:00 WARN 10812 --- [crm-app] [main] c.c.a.controller.DebugTokenController : ============================================================ -2026-09-04T00:36:31.809+08:00 WARN 10812 --- [crm-app] [main] c.c.a.controller.DebugTokenController : 调试 token 接口 /api/auth/debug/token 已启用(verify profile) -2026-09-04T00:36:31.809+08:00 WARN 10812 --- [crm-app] [main] c.c.a.controller.DebugTokenController : 严禁用于生产环境!任何知道 userId 的人可冒充该用户。 -2026-09-04T00:36:31.809+08:00 WARN 10812 --- [crm-app] [main] c.c.a.controller.DebugTokenController : 参见 docs/adr/0014-verify-profile-debug-token-endpoint.md -2026-09-04T00:36:31.809+08:00 WARN 10812 --- [crm-app] [main] c.c.a.controller.DebugTokenController : ============================================================ -2026-09-04T00:36:33.594+08:00 INFO 10812 --- [crm-app] [main] c.c.c.p.i.NgramNameSimilarityPortImpl : CustomerNameSimilarityPort 一期实现就绪(预筛模式:FULLTEXT ngram) -2026-09-04T00:36:33.727+08:00 INFO 10812 --- [crm-app] [main] c.c.c.p.impl.StubCompanyLookupPortImpl : CompanyLookupPort 一期 stub 已装配(企查查未接入,工商候选返回空) -2026-09-04T00:36:33.937+08:00 INFO 10812 --- [crm-app] [main] c.c.c.p.i.NoopProjectOwnerSyncPortImpl : ProjectOwnerSyncPort no-op 默认实现已装配(A5 项目模块未建,owner 同步跳过) -2026-09-04T00:36:34.011+08:00 INFO 10812 --- [crm-app] [main] c.c.p.i.NoopOpportunityOwnerSyncPortImpl : OpportunityOwnerSyncPort no-op 默认实现已装配(票 11 接商机真源后替换) -2026-09-04T00:36:34.155+08:00 WARN 10812 --- [crm-app] [main] .s.s.UserDetailsServiceAutoConfiguration : - -Using generated security password: c0c412d7-9158-456e-bed7-8924ab3a3f28 - -This generated password is for development use only. Your security configuration must be updated before running your application in production. - -2026-09-04T00:36:34.169+08:00 INFO 10812 --- [crm-app] [main] r$InitializeUserDetailsManagerConfigurer : Global AuthenticationManager configured with UserDetailsService bean with name inMemoryUserDetailsManager -2026-09-04T00:36:35.069+08:00 INFO 10812 --- [crm-app] [main] c.c.a.c.DataScopeModuleStartupValidator : 数据权限模块校验通过:0 张受控表,4 个注册模块 -2026-09-04T00:36:35.093+08:00 INFO 10812 --- [crm-app] [main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port 8080 (http) with context path '/' -2026-09-04T00:36:35.155+08:00 INFO 10812 --- [crm-app] [main] com.crm.app.CrmAppApplication : Started CrmAppApplication in 24.784 seconds (process running for 25.517) -2026-09-04T00:36:35.159+08:00 INFO 10812 --- [crm-app] [main] com.crm.auth.config.DataInitializer : 执行权限数据初始化检查... -2026-09-04T00:36:35.386+08:00 INFO 10812 --- [crm-app] [http-nio-8080-exec-1] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring DispatcherServlet 'dispatcherServlet' -2026-09-04T00:36:35.386+08:00 INFO 10812 --- [crm-app] [http-nio-8080-exec-1] o.s.web.servlet.DispatcherServlet : Initializing Servlet 'dispatcherServlet' -2026-09-04T00:36:35.388+08:00 INFO 10812 --- [crm-app] [http-nio-8080-exec-1] o.s.web.servlet.DispatcherServlet : Completed initialization in 1 ms -2026-09-04T00:36:35.927+08:00 INFO 10812 --- [crm-app] [main] com.crm.auth.config.DataInitializer : 权限数据初始化检查完成 -2026-09-04T00:36:35.928+08:00 INFO 10812 --- [crm-app] [main] c.c.d.config.DictPermissionInitializer : 执行数据字典权限种子化检查... -2026-09-04T00:36:36.356+08:00 INFO 10812 --- [crm-app] [main] c.c.d.config.DictPermissionInitializer : 数据字典权限种子化检查完成:10 个权限点 -2026-09-04T00:36:36.357+08:00 INFO 10812 --- [crm-app] [main] c.c.r.config.RulePermissionInitializer : 执行线索规则权限种子化检查(仅菜单)... -2026-09-04T00:36:36.466+08:00 INFO 10812 --- [crm-app] [main] c.c.r.config.RulePermissionInitializer : 线索规则权限种子化检查完成:仅菜单(0 个 button) -2026-09-04T00:36:36.466+08:00 INFO 10812 --- [crm-app] [main] c.c.l.config.LeadPermissionInitializer : 执行线索管理权限种子化检查(仅菜单)... -2026-09-04T00:36:36.896+08:00 INFO 10812 --- [crm-app] [main] c.c.l.config.LeadPermissionInitializer : 线索管理权限种子化检查完成:4 个菜单(0 个 button) -2026-09-04T00:36:36.897+08:00 INFO 10812 --- [crm-app] [main] c.crm.rule.config.RegionDataInitializer : 执行行政区划全量种子导入检查... -2026-09-04T00:36:37.538+08:00 WARN 10812 --- [crm-app] [http-nio-8080-exec-4] c.c.b.a.GlobalExceptionHandlerAdvice : 业务异常:code=67003, msg=统一社会信用代码已被占用:系统已存在该企业 -2026-09-04T00:36:37.824+08:00 INFO 10812 --- [crm-app] [main] c.crm.rule.config.RegionDataInitializer : 行政区划种子导入完成:对账 3432 行(省 34 / 市 342 / 区 3056),存量 3432 行,新增 0 行 -2026-09-04T00:36:37.824+08:00 INFO 10812 --- [crm-app] [main] r.c.OpportunityRulePermissionInitializer : 执行商机规则权限种子化检查(仅菜单)... -2026-09-04T00:36:37.929+08:00 INFO 10812 --- [crm-app] [main] r.c.OpportunityRulePermissionInitializer : 商机规则权限种子化检查完成:仅菜单(0 个 button) -2026-09-04T00:36:37.929+08:00 INFO 10812 --- [crm-app] [main] tunityStageTemplatePermissionInitializer : 执行商机阶段模板权限种子化检查(仅菜单)... -2026-09-04T00:36:38.035+08:00 INFO 10812 --- [crm-app] [main] tunityStageTemplatePermissionInitializer : 商机阶段模板权限种子化检查完成:仅菜单(0 个 button) -2026-09-04T00:36:38.036+08:00 INFO 10812 --- [crm-app] [main] ustomerReminderRulePermissionInitializer : 执行客户提醒规则权限种子化检查(仅菜单)... -2026-09-04T00:36:38.143+08:00 INFO 10812 --- [crm-app] [main] ustomerReminderRulePermissionInitializer : 客户提醒规则权限种子化检查完成:仅菜单(0 个 button) -2026-09-04T00:36:38.143+08:00 INFO 10812 --- [crm-app] [main] c.c.r.config.SchemeFieldDefInitializer : 执行方案卡系统字段库种子化检查... -2026-09-04T00:36:38.157+08:00 INFO 10812 --- [crm-app] [main] c.c.r.config.SchemeFieldDefInitializer : 方案卡系统字段库种子化检查完成:现存 16 个,新增 0 个 -2026-09-04T00:36:38.174+08:00 INFO 10812 --- [crm-app] [main] c.c.r.config.SchemeFieldDefInitializer : 方案卡兜底模板已存在(code=OPP_SCHEME_TPL_01,含已停用),跳过种子化 -2026-09-04T00:36:38.174+08:00 INFO 10812 --- [crm-app] [main] ySchemeCardTemplatePermissionInitializer : 执行方案卡模板权限种子化检查(仅菜单)... -2026-09-04T00:36:38.278+08:00 INFO 10812 --- [crm-app] [main] ySchemeCardTemplatePermissionInitializer : 方案卡模板权限种子化检查完成:仅菜单(0 个 button) -2026-09-04T00:36:38.293+08:00 INFO 10812 --- [crm-app] [main] c.c.r.config.StageTemplateInitializer : 默认阶段模板已存在(code=OPP_STAGE_TPL_01,含已停用),跳过种子化 -2026-09-04T00:36:38.307+08:00 INFO 10812 --- [crm-app] [main] c.c.r.c.CustomerReminderRuleInitializer : 客户提醒规则单例已存在(id=1),跳过种子化 -2026-09-04T00:36:38.515+08:00 INFO 10812 --- [crm-app] [main] c.crm.dict.config.DictDataInitializer : 执行内置字典幂等初始化检查... -2026-09-04T00:36:48.797+08:00 INFO 10812 --- [crm-app] [main] c.crm.dict.config.DictDataInitializer : 内置字典幂等初始化检查完成:24 个分组 -2026-09-04T00:36:48.810+08:00 INFO 10812 --- [crm-app] [main] c.c.c.c.CustomerFulltextIndexInitializer : customer FULLTEXT 索引 idx_name_fulltext 已存在,跳过 -======= - at java.base/java.lang.Thread.run(Thread.java:842) ~[na:na] -Caused by: java.sql.SQLSyntaxErrorException: Table 'crm.customer_oplog' doesn't exist - at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:121) ~[mysql-connector-j-8.3.0.jar!/:8.3.0] - at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:122) ~[mysql-connector-j-8.3.0.jar!/:8.3.0] - at com.mysql.cj.jdbc.ClientPreparedStatement.executeInternal(ClientPreparedStatement.java:912) ~[mysql-connector-j-8.3.0.jar!/:8.3.0] - at com.mysql.cj.jdbc.ClientPreparedStatement.execute(ClientPreparedStatement.java:354) ~[mysql-connector-j-8.3.0.jar!/:8.3.0] - at com.zaxxer.hikari.pool.ProxyPreparedStatement.execute(ProxyPreparedStatement.java:44) ~[HikariCP-5.1.0.jar!/:na] - at com.zaxxer.hikari.pool.HikariProxyPreparedStatement.execute(HikariProxyPreparedStatement.java) ~[HikariCP-5.1.0.jar!/:na] - at org.apache.ibatis.executor.statement.PreparedStatementHandler.update(PreparedStatementHandler.java:48) ~[mybatis-3.5.16.jar!/:3.5.16] - at org.apache.ibatis.executor.statement.RoutingStatementHandler.update(RoutingStatementHandler.java:75) ~[mybatis-3.5.16.jar!/:3.5.16] at jdk.internal.reflect.GeneratedMethodAccessor72.invoke(Unknown Source) ~[na:na] at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na] at java.base/java.lang.reflect.Method.invoke(Method.java:568) ~[na:na] at org.apache.ibatis.plugin.Plugin.invoke(Plugin.java:61) ~[mybatis-3.5.16.jar!/:3.5.16] - at jdk.proxy2/jdk.proxy2.$Proxy255.update(Unknown Source) ~[na:na] + at jdk.proxy2/jdk.proxy2.$Proxy257.update(Unknown Source) ~[na:na] at jdk.internal.reflect.GeneratedMethodAccessor72.invoke(Unknown Source) ~[na:na] at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na] at java.base/java.lang.reflect.Method.invoke(Method.java:568) ~[na:na] at org.apache.ibatis.plugin.Plugin.invoke(Plugin.java:61) ~[mybatis-3.5.16.jar!/:3.5.16] - at jdk.proxy2/jdk.proxy2.$Proxy255.update(Unknown Source) ~[na:na] + at jdk.proxy2/jdk.proxy2.$Proxy257.update(Unknown Source) ~[na:na] at org.apache.ibatis.executor.SimpleExecutor.doUpdate(SimpleExecutor.java:50) ~[mybatis-3.5.16.jar!/:3.5.16] at org.apache.ibatis.executor.BaseExecutor.update(BaseExecutor.java:117) ~[mybatis-3.5.16.jar!/:3.5.16] at org.apache.ibatis.executor.CachingExecutor.update(CachingExecutor.java:76) ~[mybatis-3.5.16.jar!/:3.5.16] @@ -2929,785 +734,12 @@ Caused by: java.sql.SQLSyntaxErrorException: Table 'crm.customer_oplog' doesn't at org.apache.ibatis.plugin.Invocation.proceed(Invocation.java:61) ~[mybatis-3.5.16.jar!/:3.5.16] at com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor.intercept(MybatisPlusInterceptor.java:106) ~[mybatis-plus-extension-3.5.7.jar!/:3.5.7] at org.apache.ibatis.plugin.Plugin.invoke(Plugin.java:59) ~[mybatis-3.5.16.jar!/:3.5.16] - at jdk.proxy2/jdk.proxy2.$Proxy254.update(Unknown Source) ~[na:na] + at jdk.proxy2/jdk.proxy2.$Proxy256.update(Unknown Source) ~[na:na] at org.apache.ibatis.session.defaults.DefaultSqlSession.update(DefaultSqlSession.java:197) ~[mybatis-3.5.16.jar!/:3.5.16] at org.apache.ibatis.session.defaults.DefaultSqlSession.insert(DefaultSqlSession.java:184) ~[mybatis-3.5.16.jar!/:3.5.16] - at jdk.internal.reflect.GeneratedMethodAccessor114.invoke(Unknown Source) ~[na:na] + at jdk.internal.reflect.GeneratedMethodAccessor185.invoke(Unknown Source) ~[na:na] at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na] at java.base/java.lang.reflect.Method.invoke(Method.java:568) ~[na:na] at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:425) ~[mybatis-spring-3.0.3.jar!/:3.0.3] - ... 129 common frames omitted - -2026-09-03T14:28:38.465+08:00 INFO 2472 --- [crm-app] [main] com.crm.app.CrmAppApplication : Starting CrmAppApplication v1.0.0-SNAPSHOT using Java 17.0.15 with PID 2472 (D:\code\crm-backend-matt\crm-app\target\crm-app-1.0.0-SNAPSHOT.jar started by luowj in D:\code\crm-backend-matt) -2026-09-03T14:28:38.468+08:00 INFO 2472 --- [crm-app] [main] com.crm.app.CrmAppApplication : The following 1 profile is active: "verify" -2026-09-03T14:28:40.367+08:00 INFO 2472 --- [crm-app] [main] .s.d.r.c.RepositoryConfigurationDelegate : Multiple Spring Data modules found, entering strict repository configuration mode -2026-09-03T14:28:40.370+08:00 INFO 2472 --- [crm-app] [main] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data JPA repositories in DEFAULT mode. -2026-09-03T14:28:40.425+08:00 INFO 2472 --- [crm-app] [main] .s.d.r.c.RepositoryConfigurationDelegate : Finished Spring Data repository scanning in 38 ms. Found 0 JPA repository interfaces. -2026-09-03T14:28:40.456+08:00 INFO 2472 --- [crm-app] [main] .s.d.r.c.RepositoryConfigurationDelegate : Multiple Spring Data modules found, entering strict repository configuration mode -2026-09-03T14:28:40.458+08:00 INFO 2472 --- [crm-app] [main] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data Redis repositories in DEFAULT mode. -2026-09-03T14:28:40.474+08:00 INFO 2472 --- [crm-app] [main] .s.d.r.c.RepositoryConfigurationDelegate : Finished Spring Data repository scanning in 3 ms. Found 0 Redis repository interfaces. -2026-09-03T14:28:40.696+08:00 WARN 2472 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'crmBaseMapper' and 'com.crm.base.mapper.CrmBaseMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T14:28:40.697+08:00 WARN 2472 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'authIdentityMapper' and 'com.crm.auth.mapper.AuthIdentityMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T14:28:40.698+08:00 WARN 2472 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'authUserMapper' and 'com.crm.auth.mapper.AuthUserMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T14:28:40.698+08:00 WARN 2472 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'sysDataScopeModuleMapper' and 'com.crm.auth.mapper.SysDataScopeModuleMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T14:28:40.700+08:00 WARN 2472 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'sysDeptMapper' and 'com.crm.auth.mapper.SysDeptMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T14:28:40.700+08:00 WARN 2472 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'sysMenuMapper' and 'com.crm.auth.mapper.SysMenuMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T14:28:40.701+08:00 WARN 2472 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'sysRoleDataScopeMapper' and 'com.crm.auth.mapper.SysRoleDataScopeMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T14:28:40.702+08:00 WARN 2472 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'sysRoleMapper' and 'com.crm.auth.mapper.SysRoleMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T14:28:40.702+08:00 WARN 2472 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'sysRoleMenuMapper' and 'com.crm.auth.mapper.SysRoleMenuMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T14:28:40.703+08:00 WARN 2472 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'sysUserDeptMapper' and 'com.crm.auth.mapper.SysUserDeptMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T14:28:40.704+08:00 WARN 2472 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'sysUserRoleMapper' and 'com.crm.auth.mapper.SysUserRoleMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T14:28:40.705+08:00 WARN 2472 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'fileInfoMapper' and 'com.crm.file.mapper.FileInfoMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T14:28:40.705+08:00 WARN 2472 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'dictGroupDefaultMapper' and 'com.crm.dict.mapper.DictGroupDefaultMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T14:28:40.706+08:00 WARN 2472 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'dictGroupMapper' and 'com.crm.dict.mapper.DictGroupMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T14:28:40.706+08:00 WARN 2472 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'dictItemMapper' and 'com.crm.dict.mapper.DictItemMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T14:28:40.707+08:00 WARN 2472 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'dictRefCountMapper' and 'com.crm.dict.mapper.DictRefCountMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T14:28:40.707+08:00 WARN 2472 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'customerReminderRuleMapper' and 'com.crm.rule.mapper.CustomerReminderRuleMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T14:28:40.708+08:00 WARN 2472 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'leadPoolMapper' and 'com.crm.rule.mapper.LeadPoolMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T14:28:40.708+08:00 WARN 2472 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'leadPoolMemberMapper' and 'com.crm.rule.mapper.LeadPoolMemberMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T14:28:40.710+08:00 WARN 2472 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'leadPoolProvinceMapper' and 'com.crm.rule.mapper.LeadPoolProvinceMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T14:28:40.711+08:00 WARN 2472 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'leadPoolRegionMapper' and 'com.crm.rule.mapper.LeadPoolRegionMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T14:28:40.712+08:00 WARN 2472 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityPoolRuleDeptMapper' and 'com.crm.rule.mapper.OpportunityPoolRuleDeptMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T14:28:40.712+08:00 WARN 2472 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityPoolRuleMapper' and 'com.crm.rule.mapper.OpportunityPoolRuleMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T14:28:40.713+08:00 WARN 2472 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunitySchemeCardFieldMapper' and 'com.crm.rule.mapper.OpportunitySchemeCardFieldMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T14:28:40.713+08:00 WARN 2472 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunitySchemeCardTemplateDeptMapper' and 'com.crm.rule.mapper.OpportunitySchemeCardTemplateDeptMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T14:28:40.714+08:00 WARN 2472 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunitySchemeCardTemplateMapper' and 'com.crm.rule.mapper.OpportunitySchemeCardTemplateMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T14:28:40.714+08:00 WARN 2472 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunitySchemeFieldDefMapper' and 'com.crm.rule.mapper.OpportunitySchemeFieldDefMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T14:28:40.715+08:00 WARN 2472 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityStageNodeMapper' and 'com.crm.rule.mapper.OpportunityStageNodeMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T14:28:40.715+08:00 WARN 2472 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityStageTemplateDeptMapper' and 'com.crm.rule.mapper.OpportunityStageTemplateDeptMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T14:28:40.716+08:00 WARN 2472 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityStageTemplateMapper' and 'com.crm.rule.mapper.OpportunityStageTemplateMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T14:28:40.716+08:00 WARN 2472 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'sysRegionMapper' and 'com.crm.rule.mapper.SysRegionMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T14:28:40.717+08:00 WARN 2472 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'userColumnPreferenceMapper' and 'com.crm.preference.mapper.UserColumnPreferenceMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T14:28:40.719+08:00 WARN 2472 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'userSavedViewMapper' and 'com.crm.preference.mapper.UserSavedViewMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T14:28:40.719+08:00 WARN 2472 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'leadAttachmentMapper' and 'com.crm.lead.mapper.LeadAttachmentMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T14:28:40.720+08:00 WARN 2472 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'leadFeedbackMapper' and 'com.crm.lead.mapper.LeadFeedbackMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T14:28:40.720+08:00 WARN 2472 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'leadFollowMapper' and 'com.crm.lead.mapper.LeadFollowMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T14:28:40.721+08:00 WARN 2472 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'leadHistoryMapper' and 'com.crm.lead.mapper.LeadHistoryMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T14:28:40.721+08:00 WARN 2472 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'leadMapper' and 'com.crm.lead.mapper.LeadMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T14:28:40.721+08:00 WARN 2472 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityAttachmentMapper' and 'com.crm.opportunity.mapper.OpportunityAttachmentMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T14:28:40.722+08:00 WARN 2472 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityCustomerMapper' and 'com.crm.opportunity.mapper.OpportunityCustomerMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T14:28:40.722+08:00 WARN 2472 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityFocusMapper' and 'com.crm.opportunity.mapper.OpportunityFocusMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T14:28:40.723+08:00 WARN 2472 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityFollowMapper' and 'com.crm.opportunity.mapper.OpportunityFollowMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T14:28:40.725+08:00 WARN 2472 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityMapper' and 'com.crm.opportunity.mapper.OpportunityMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T14:28:40.726+08:00 WARN 2472 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityOplogMapper' and 'com.crm.opportunity.mapper.OpportunityOplogMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T14:28:40.726+08:00 WARN 2472 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityPendingNoticeMapper' and 'com.crm.opportunity.mapper.OpportunityPendingNoticeMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T14:28:40.727+08:00 WARN 2472 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunitySchemeCardMapper' and 'com.crm.opportunity.mapper.OpportunitySchemeCardMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T14:28:40.728+08:00 WARN 2472 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunitySchemeCardValueMapper' and 'com.crm.opportunity.mapper.OpportunitySchemeCardValueMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T14:28:40.729+08:00 WARN 2472 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunitySiteSurveyMapper' and 'com.crm.opportunity.mapper.OpportunitySiteSurveyMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T14:28:40.729+08:00 WARN 2472 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityStageHistoryMapper' and 'com.crm.opportunity.mapper.OpportunityStageHistoryMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T14:28:40.730+08:00 WARN 2472 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityStatusHistoryMapper' and 'com.crm.opportunity.mapper.OpportunityStatusHistoryMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T14:28:40.731+08:00 WARN 2472 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityTeamMapper' and 'com.crm.opportunity.mapper.OpportunityTeamMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T14:28:40.731+08:00 WARN 2472 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityViewLogMapper' and 'com.crm.opportunity.mapper.OpportunityViewLogMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T14:28:40.732+08:00 WARN 2472 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityWorkPlanMapper' and 'com.crm.opportunity.mapper.OpportunityWorkPlanMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T14:28:40.732+08:00 WARN 2472 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'customerContactMapper' and 'com.crm.customer.mapper.CustomerContactMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T14:28:40.733+08:00 WARN 2472 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'customerFocusMapper' and 'com.crm.customer.mapper.CustomerFocusMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T14:28:40.735+08:00 WARN 2472 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'customerFollowMapper' and 'com.crm.customer.mapper.CustomerFollowMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T14:28:40.736+08:00 WARN 2472 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'customerImportFailMapper' and 'com.crm.customer.mapper.CustomerImportFailMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T14:28:40.737+08:00 WARN 2472 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'customerImportTaskMapper' and 'com.crm.customer.mapper.CustomerImportTaskMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T14:28:40.737+08:00 WARN 2472 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'customerMapper' and 'com.crm.customer.mapper.CustomerMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T14:28:40.738+08:00 WARN 2472 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'customerOplogMapper' and 'com.crm.customer.mapper.CustomerOplogMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T14:28:40.738+08:00 WARN 2472 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'customerPendingNoticeMapper' and 'com.crm.customer.mapper.CustomerPendingNoticeMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T14:28:40.739+08:00 WARN 2472 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'customerTeamMemberMapper' and 'com.crm.customer.mapper.CustomerTeamMemberMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T14:28:40.740+08:00 WARN 2472 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'customerTransferDetailMapper' and 'com.crm.customer.mapper.CustomerTransferDetailMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T14:28:40.741+08:00 WARN 2472 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'customerTransferMapper' and 'com.crm.customer.mapper.CustomerTransferMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T14:28:40.742+08:00 WARN 2472 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'customerViewLogMapper' and 'com.crm.customer.mapper.CustomerViewLogMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T14:28:40.743+08:00 WARN 2472 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : No MyBatis mapper was found in '[com.crm.**.mapper]' package. Please check your configuration. -2026-09-03T14:28:40.747+08:00 WARN 2472 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'crmBaseMapper' and 'com.crm.base.mapper.CrmBaseMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T14:28:40.748+08:00 WARN 2472 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'authIdentityMapper' and 'com.crm.auth.mapper.AuthIdentityMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T14:28:40.748+08:00 WARN 2472 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'authUserMapper' and 'com.crm.auth.mapper.AuthUserMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T14:28:40.749+08:00 WARN 2472 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'sysDataScopeModuleMapper' and 'com.crm.auth.mapper.SysDataScopeModuleMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T14:28:40.749+08:00 WARN 2472 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'sysDeptMapper' and 'com.crm.auth.mapper.SysDeptMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T14:28:40.750+08:00 WARN 2472 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'sysMenuMapper' and 'com.crm.auth.mapper.SysMenuMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T14:28:40.750+08:00 WARN 2472 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'sysRoleDataScopeMapper' and 'com.crm.auth.mapper.SysRoleDataScopeMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T14:28:40.751+08:00 WARN 2472 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'sysRoleMapper' and 'com.crm.auth.mapper.SysRoleMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T14:28:40.752+08:00 WARN 2472 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'sysRoleMenuMapper' and 'com.crm.auth.mapper.SysRoleMenuMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T14:28:40.753+08:00 WARN 2472 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'sysUserDeptMapper' and 'com.crm.auth.mapper.SysUserDeptMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T14:28:40.754+08:00 WARN 2472 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'sysUserRoleMapper' and 'com.crm.auth.mapper.SysUserRoleMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T14:28:40.754+08:00 WARN 2472 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'fileInfoMapper' and 'com.crm.file.mapper.FileInfoMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T14:28:40.755+08:00 WARN 2472 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'dictGroupDefaultMapper' and 'com.crm.dict.mapper.DictGroupDefaultMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T14:28:40.755+08:00 WARN 2472 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'dictGroupMapper' and 'com.crm.dict.mapper.DictGroupMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T14:28:40.756+08:00 WARN 2472 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'dictItemMapper' and 'com.crm.dict.mapper.DictItemMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T14:28:40.757+08:00 WARN 2472 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'dictRefCountMapper' and 'com.crm.dict.mapper.DictRefCountMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T14:28:40.757+08:00 WARN 2472 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'customerReminderRuleMapper' and 'com.crm.rule.mapper.CustomerReminderRuleMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T14:28:40.758+08:00 WARN 2472 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'leadPoolMapper' and 'com.crm.rule.mapper.LeadPoolMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T14:28:40.758+08:00 WARN 2472 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'leadPoolMemberMapper' and 'com.crm.rule.mapper.LeadPoolMemberMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T14:28:40.758+08:00 WARN 2472 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'leadPoolProvinceMapper' and 'com.crm.rule.mapper.LeadPoolProvinceMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T14:28:40.759+08:00 WARN 2472 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'leadPoolRegionMapper' and 'com.crm.rule.mapper.LeadPoolRegionMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T14:28:40.759+08:00 WARN 2472 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityPoolRuleDeptMapper' and 'com.crm.rule.mapper.OpportunityPoolRuleDeptMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T14:28:40.760+08:00 WARN 2472 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityPoolRuleMapper' and 'com.crm.rule.mapper.OpportunityPoolRuleMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T14:28:40.761+08:00 WARN 2472 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunitySchemeCardFieldMapper' and 'com.crm.rule.mapper.OpportunitySchemeCardFieldMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T14:28:40.761+08:00 WARN 2472 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunitySchemeCardTemplateDeptMapper' and 'com.crm.rule.mapper.OpportunitySchemeCardTemplateDeptMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T14:28:40.762+08:00 WARN 2472 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunitySchemeCardTemplateMapper' and 'com.crm.rule.mapper.OpportunitySchemeCardTemplateMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T14:28:40.762+08:00 WARN 2472 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunitySchemeFieldDefMapper' and 'com.crm.rule.mapper.OpportunitySchemeFieldDefMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T14:28:40.763+08:00 WARN 2472 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityStageNodeMapper' and 'com.crm.rule.mapper.OpportunityStageNodeMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T14:28:40.763+08:00 WARN 2472 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityStageTemplateDeptMapper' and 'com.crm.rule.mapper.OpportunityStageTemplateDeptMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T14:28:40.763+08:00 WARN 2472 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityStageTemplateMapper' and 'com.crm.rule.mapper.OpportunityStageTemplateMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T14:28:40.764+08:00 WARN 2472 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'sysRegionMapper' and 'com.crm.rule.mapper.SysRegionMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T14:28:40.764+08:00 WARN 2472 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'userColumnPreferenceMapper' and 'com.crm.preference.mapper.UserColumnPreferenceMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T14:28:40.765+08:00 WARN 2472 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'userSavedViewMapper' and 'com.crm.preference.mapper.UserSavedViewMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T14:28:40.765+08:00 WARN 2472 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'leadAttachmentMapper' and 'com.crm.lead.mapper.LeadAttachmentMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T14:28:40.765+08:00 WARN 2472 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'leadFeedbackMapper' and 'com.crm.lead.mapper.LeadFeedbackMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T14:28:40.766+08:00 WARN 2472 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'leadFollowMapper' and 'com.crm.lead.mapper.LeadFollowMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T14:28:40.766+08:00 WARN 2472 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'leadHistoryMapper' and 'com.crm.lead.mapper.LeadHistoryMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T14:28:40.766+08:00 WARN 2472 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'leadMapper' and 'com.crm.lead.mapper.LeadMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T14:28:40.767+08:00 WARN 2472 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityAttachmentMapper' and 'com.crm.opportunity.mapper.OpportunityAttachmentMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T14:28:40.767+08:00 WARN 2472 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityCustomerMapper' and 'com.crm.opportunity.mapper.OpportunityCustomerMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T14:28:40.767+08:00 WARN 2472 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityFocusMapper' and 'com.crm.opportunity.mapper.OpportunityFocusMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T14:28:40.768+08:00 WARN 2472 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityFollowMapper' and 'com.crm.opportunity.mapper.OpportunityFollowMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T14:28:40.768+08:00 WARN 2472 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityMapper' and 'com.crm.opportunity.mapper.OpportunityMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T14:28:40.769+08:00 WARN 2472 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityOplogMapper' and 'com.crm.opportunity.mapper.OpportunityOplogMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T14:28:40.770+08:00 WARN 2472 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityPendingNoticeMapper' and 'com.crm.opportunity.mapper.OpportunityPendingNoticeMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T14:28:40.773+08:00 WARN 2472 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunitySchemeCardMapper' and 'com.crm.opportunity.mapper.OpportunitySchemeCardMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T14:28:40.773+08:00 WARN 2472 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunitySchemeCardValueMapper' and 'com.crm.opportunity.mapper.OpportunitySchemeCardValueMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T14:28:40.774+08:00 WARN 2472 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunitySiteSurveyMapper' and 'com.crm.opportunity.mapper.OpportunitySiteSurveyMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T14:28:40.774+08:00 WARN 2472 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityStageHistoryMapper' and 'com.crm.opportunity.mapper.OpportunityStageHistoryMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T14:28:40.775+08:00 WARN 2472 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityStatusHistoryMapper' and 'com.crm.opportunity.mapper.OpportunityStatusHistoryMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T14:28:40.778+08:00 WARN 2472 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityTeamMapper' and 'com.crm.opportunity.mapper.OpportunityTeamMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T14:28:40.779+08:00 WARN 2472 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityViewLogMapper' and 'com.crm.opportunity.mapper.OpportunityViewLogMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T14:28:40.779+08:00 WARN 2472 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityWorkPlanMapper' and 'com.crm.opportunity.mapper.OpportunityWorkPlanMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T14:28:40.780+08:00 WARN 2472 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'customerContactMapper' and 'com.crm.customer.mapper.CustomerContactMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T14:28:40.780+08:00 WARN 2472 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'customerFocusMapper' and 'com.crm.customer.mapper.CustomerFocusMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T14:28:40.781+08:00 WARN 2472 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'customerFollowMapper' and 'com.crm.customer.mapper.CustomerFollowMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T14:28:40.781+08:00 WARN 2472 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'customerImportFailMapper' and 'com.crm.customer.mapper.CustomerImportFailMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T14:28:40.782+08:00 WARN 2472 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'customerImportTaskMapper' and 'com.crm.customer.mapper.CustomerImportTaskMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T14:28:40.782+08:00 WARN 2472 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'customerMapper' and 'com.crm.customer.mapper.CustomerMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T14:28:40.783+08:00 WARN 2472 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'customerOplogMapper' and 'com.crm.customer.mapper.CustomerOplogMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T14:28:40.783+08:00 WARN 2472 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'customerPendingNoticeMapper' and 'com.crm.customer.mapper.CustomerPendingNoticeMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T14:28:40.784+08:00 WARN 2472 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'customerTeamMemberMapper' and 'com.crm.customer.mapper.CustomerTeamMemberMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T14:28:40.784+08:00 WARN 2472 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'customerTransferDetailMapper' and 'com.crm.customer.mapper.CustomerTransferDetailMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T14:28:40.784+08:00 WARN 2472 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'customerTransferMapper' and 'com.crm.customer.mapper.CustomerTransferMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T14:28:40.785+08:00 WARN 2472 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'customerViewLogMapper' and 'com.crm.customer.mapper.CustomerViewLogMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T14:28:40.785+08:00 WARN 2472 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : No MyBatis mapper was found in '[com.crm.**.mapper]' package. Please check your configuration. -2026-09-03T14:28:41.853+08:00 INFO 2472 --- [crm-app] [main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port 8080 (http) -2026-09-03T14:28:41.877+08:00 INFO 2472 --- [crm-app] [main] o.apache.catalina.core.StandardService : Starting service [Tomcat] -2026-09-03T14:28:41.878+08:00 INFO 2472 --- [crm-app] [main] o.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/10.1.31] -2026-09-03T14:28:41.946+08:00 INFO 2472 --- [crm-app] [main] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext -2026-09-03T14:28:41.947+08:00 INFO 2472 --- [crm-app] [main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 3406 ms -2026-09-03T14:28:42.552+08:00 INFO 2472 --- [crm-app] [main] com.crm.auth.config.PermissionConfig : Ȩܿرɨɣ0 -2026-09-03T14:28:42.705+08:00 INFO 2472 --- [crm-app] [main] com.crm.base.config.CustomIdGenerator : ѩIDʼɣworkerId=0, datacenterId=0 -2026-09-03T14:28:43.437+08:00 INFO 2472 --- [crm-app] [main] o.hibernate.jpa.internal.util.LogHelper : HHH000204: Processing PersistenceUnitInfo [name: default] -2026-09-03T14:28:43.517+08:00 INFO 2472 --- [crm-app] [main] org.hibernate.Version : HHH000412: Hibernate ORM core version 6.5.3.Final -2026-09-03T14:28:43.567+08:00 INFO 2472 --- [crm-app] [main] o.h.c.internal.RegionFactoryInitiator : HHH000026: Second-level cache disabled -2026-09-03T14:28:43.977+08:00 INFO 2472 --- [crm-app] [main] o.s.o.j.p.SpringPersistenceUnitInfo : No LoadTimeWeaver setup: ignoring JPA class transformer -2026-09-03T14:28:44.023+08:00 INFO 2472 --- [crm-app] [main] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Starting... -2026-09-03T14:28:44.902+08:00 INFO 2472 --- [crm-app] [main] com.zaxxer.hikari.pool.HikariPool : HikariPool-1 - Added connection com.mysql.cj.jdbc.ConnectionImpl@2b3ee95e -2026-09-03T14:28:44.904+08:00 INFO 2472 --- [crm-app] [main] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Start completed. -2026-09-03T14:28:45.288+08:00 WARN 2472 --- [crm-app] [main] org.hibernate.orm.deprecation : HHH90000025: MySQLDialect does not need to be specified explicitly using 'hibernate.dialect' (remove the property setting and it will be selected by default) -2026-09-03T14:28:47.475+08:00 INFO 2472 --- [crm-app] [main] o.h.e.t.j.p.i.JtaPlatformInitiator : HHH000489: No JTA platform available (set 'hibernate.transaction.jta.platform' to enable JTA platform integration) -2026-09-03T14:29:18.580+08:00 INFO 2472 --- [crm-app] [main] j.LocalContainerEntityManagerFactoryBean : Initialized JPA EntityManagerFactory for persistence unit 'default' -2026-09-03T14:29:18.994+08:00 WARN 2472 --- [crm-app] [main] c.c.a.controller.DebugTokenController : ============================================================ -2026-09-03T14:29:18.994+08:00 WARN 2472 --- [crm-app] [main] c.c.a.controller.DebugTokenController : token ӿ /api/auth/debug/token ãverify profile -2026-09-03T14:29:18.994+08:00 WARN 2472 --- [crm-app] [main] c.c.a.controller.DebugTokenController : Ͻκ֪ userId ˿ðû -2026-09-03T14:29:18.995+08:00 WARN 2472 --- [crm-app] [main] c.c.a.controller.DebugTokenController : μ docs/adr/0014-verify-profile-debug-token-endpoint.md -2026-09-03T14:29:18.995+08:00 WARN 2472 --- [crm-app] [main] c.c.a.controller.DebugTokenController : ============================================================ -2026-09-03T14:29:21.028+08:00 INFO 2472 --- [crm-app] [main] c.c.c.p.i.NgramNameSimilarityPortImpl : CustomerNameSimilarityPort һʵ־ԤɸģʽFULLTEXT ngram -2026-09-03T14:29:21.199+08:00 INFO 2472 --- [crm-app] [main] c.c.c.p.impl.StubCompanyLookupPortImpl : CompanyLookupPort һ stub װ䣨δ룬̺ѡؿգ -2026-09-03T14:29:21.410+08:00 INFO 2472 --- [crm-app] [main] c.c.c.p.i.NoopProjectOwnerSyncPortImpl : ProjectOwnerSyncPort no-op Ĭʵװ䣨A5 Ŀģδowner ͬ -2026-09-03T14:29:21.488+08:00 INFO 2472 --- [crm-app] [main] c.c.p.i.NoopOpportunityOwnerSyncPortImpl : OpportunityOwnerSyncPort no-op Ĭʵװ䣨Ʊ 11 ̻Դ滻 -2026-09-03T14:29:21.659+08:00 WARN 2472 --- [crm-app] [main] .s.s.UserDetailsServiceAutoConfiguration : - -Using generated security password: 8bafa7b8-75ab-48e5-b7ec-217270f8b8ef - -This generated password is for development use only. Your security configuration must be updated before running your application in production. - -2026-09-03T14:29:21.681+08:00 INFO 2472 --- [crm-app] [main] r$InitializeUserDetailsManagerConfigurer : Global AuthenticationManager configured with UserDetailsService bean with name inMemoryUserDetailsManager -2026-09-03T14:29:22.869+08:00 INFO 2472 --- [crm-app] [main] c.c.a.c.DataScopeModuleStartupValidator : ȨģУͨ0 ܿر4 עģ -2026-09-03T14:29:22.902+08:00 INFO 2472 --- [crm-app] [main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port 8080 (http) with context path '/' -2026-09-03T14:29:22.931+08:00 INFO 2472 --- [crm-app] [main] com.crm.app.CrmAppApplication : Started CrmAppApplication in 45.089 seconds (process running for 45.709) -2026-09-03T14:29:22.936+08:00 INFO 2472 --- [crm-app] [main] com.crm.auth.config.DataInitializer : ִȨݳʼ... -2026-09-03T14:29:23.649+08:00 INFO 2472 --- [crm-app] [main] com.crm.auth.config.DataInitializer : Ȩݳʼ -2026-09-03T14:29:23.650+08:00 INFO 2472 --- [crm-app] [main] c.c.d.config.DictPermissionInitializer : ִֵȨӻ... -2026-09-03T14:29:23.980+08:00 INFO 2472 --- [crm-app] [main] c.c.d.config.DictPermissionInitializer : ֵȨӻɣ10 Ȩ޵ -2026-09-03T14:29:23.980+08:00 INFO 2472 --- [crm-app] [main] c.c.r.config.RulePermissionInitializer : ִȨӻ飨˵... -2026-09-03T14:29:24.067+08:00 INFO 2472 --- [crm-app] [main] c.c.r.config.RulePermissionInitializer : Ȩӻɣ˵0 button -2026-09-03T14:29:24.068+08:00 INFO 2472 --- [crm-app] [main] c.crm.rule.config.RegionDataInitializer : ִȫӵ... -2026-09-03T14:29:25.746+08:00 INFO 2472 --- [crm-app] [main] c.crm.rule.config.RegionDataInitializer : ӵɣ 3432 Уʡ 34 / 342 / 3056 3432 У 0 -2026-09-03T14:29:25.747+08:00 INFO 2472 --- [crm-app] [main] c.c.l.config.LeadPermissionInitializer : ִȨӻ飨˵... -2026-09-03T14:29:26.093+08:00 INFO 2472 --- [crm-app] [main] c.c.l.config.LeadPermissionInitializer : Ȩӻɣ4 ˵0 button -2026-09-03T14:29:26.094+08:00 INFO 2472 --- [crm-app] [main] r.c.OpportunityRulePermissionInitializer : ִ̻Ȩӻ飨˵... -2026-09-03T14:29:26.198+08:00 INFO 2472 --- [crm-app] [main] r.c.OpportunityRulePermissionInitializer : ̻Ȩӻɣ˵0 button -2026-09-03T14:29:26.199+08:00 INFO 2472 --- [crm-app] [main] ustomerReminderRulePermissionInitializer : ִпͻѹȨӻ飨˵... -2026-09-03T14:29:26.290+08:00 INFO 2472 --- [crm-app] [main] ustomerReminderRulePermissionInitializer : ͻѹȨӻɣ˵0 button -2026-09-03T14:29:26.291+08:00 INFO 2472 --- [crm-app] [main] tunityStageTemplatePermissionInitializer : ִ̻׶ģȨӻ飨˵... -2026-09-03T14:29:26.400+08:00 INFO 2472 --- [crm-app] [main] tunityStageTemplatePermissionInitializer : ̻׶ģȨӻɣ˵0 button -2026-09-03T14:29:26.400+08:00 INFO 2472 --- [crm-app] [main] c.c.r.config.SchemeFieldDefInitializer : ִзϵͳֶοӻ... -2026-09-03T14:29:26.412+08:00 INFO 2472 --- [crm-app] [main] c.c.r.config.SchemeFieldDefInitializer : ϵͳֶοӻɣִ 16 0 -2026-09-03T14:29:26.471+08:00 INFO 2472 --- [crm-app] [main] c.c.r.config.SchemeFieldDefInitializer : ģѴڣcode=OPP_SCHEME_TPL_01ͣãӻ -2026-09-03T14:29:26.471+08:00 INFO 2472 --- [crm-app] [main] ySchemeCardTemplatePermissionInitializer : ִзģȨӻ飨˵... -2026-09-03T14:29:26.558+08:00 INFO 2472 --- [crm-app] [main] ySchemeCardTemplatePermissionInitializer : ģȨӻɣ˵0 button -2026-09-03T14:29:26.569+08:00 INFO 2472 --- [crm-app] [main] c.c.r.config.StageTemplateInitializer : ĬϽ׶ģѴڣcode=OPP_STAGE_TPL_01ͣãӻ -2026-09-03T14:29:26.582+08:00 INFO 2472 --- [crm-app] [main] c.c.r.c.CustomerReminderRuleInitializer : ͻѹѴڣid=1ӻ -2026-09-03T14:29:26.582+08:00 INFO 2472 --- [crm-app] [main] c.crm.dict.config.DictDataInitializer : ִֵݵȳʼ... -2026-09-03T14:29:34.945+08:00 INFO 2472 --- [crm-app] [main] c.crm.dict.config.DictDataInitializer : ֵݵȳʼɣ24 -2026-09-03T14:29:36.820+08:00 WARN 2472 --- [crm-app] [main] com.crm.file.config.MinioConfig : MinIO bucket [crm] ʼʧܣļܿܲãThe Access Key Id you provided does not exist in our records. -2026-09-03T14:29:36.875+08:00 INFO 2472 --- [crm-app] [main] c.c.c.c.CustomerFulltextIndexInitializer : customer FULLTEXT idx_name_fulltext Ѵڣ -2026-09-03T14:30:20.716+08:00 INFO 2472 --- [crm-app] [http-nio-8080-exec-1] o.s.web.servlet.DispatcherServlet : Initializing Servlet 'dispatcherServlet' -2026-09-03T14:30:20.725+08:00 INFO 2472 --- [crm-app] [http-nio-8080-exec-1] o.s.web.servlet.DispatcherServlet : Completed initialization in 8 ms -2026-09-03T14:30:24.347+08:00 WARN 2472 --- [crm-app] [http-nio-8080-exec-6] c.c.b.a.GlobalExceptionHandlerAdvice : ҵ쳣code=66002, msg=̻: 1 -2026-09-03T17:53:51.694+08:00 INFO 20740 --- [crm-app] [main] com.crm.app.CrmAppApplication : Starting CrmAppApplication v1.0.0-SNAPSHOT using Java 17.0.15 with PID 20740 (D:\code\crm-backend-matt\crm-app\target\crm-app-1.0.0-SNAPSHOT.jar started by luowj in D:\code\crm-backend-matt) -2026-09-03T17:53:51.956+08:00 INFO 20740 --- [crm-app] [main] com.crm.app.CrmAppApplication : The following 1 profile is active: "verify" -2026-09-03T17:53:53.747+08:00 INFO 20740 --- [crm-app] [main] .s.d.r.c.RepositoryConfigurationDelegate : Multiple Spring Data modules found, entering strict repository configuration mode -2026-09-03T17:53:53.751+08:00 INFO 20740 --- [crm-app] [main] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data JPA repositories in DEFAULT mode. -2026-09-03T17:53:53.791+08:00 INFO 20740 --- [crm-app] [main] .s.d.r.c.RepositoryConfigurationDelegate : Finished Spring Data repository scanning in 29 ms. Found 0 JPA repository interfaces. -2026-09-03T17:53:53.816+08:00 INFO 20740 --- [crm-app] [main] .s.d.r.c.RepositoryConfigurationDelegate : Multiple Spring Data modules found, entering strict repository configuration mode -2026-09-03T17:53:53.818+08:00 INFO 20740 --- [crm-app] [main] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data Redis repositories in DEFAULT mode. -2026-09-03T17:53:53.835+08:00 INFO 20740 --- [crm-app] [main] .s.d.r.c.RepositoryConfigurationDelegate : Finished Spring Data repository scanning in 4 ms. Found 0 Redis repository interfaces. -2026-09-03T17:53:54.031+08:00 WARN 20740 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'crmBaseMapper' and 'com.crm.base.mapper.CrmBaseMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T17:53:54.033+08:00 WARN 20740 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'authIdentityMapper' and 'com.crm.auth.mapper.AuthIdentityMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T17:53:54.034+08:00 WARN 20740 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'authUserMapper' and 'com.crm.auth.mapper.AuthUserMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T17:53:54.035+08:00 WARN 20740 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'sysDataScopeModuleMapper' and 'com.crm.auth.mapper.SysDataScopeModuleMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T17:53:54.036+08:00 WARN 20740 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'sysDeptMapper' and 'com.crm.auth.mapper.SysDeptMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T17:53:54.037+08:00 WARN 20740 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'sysMenuMapper' and 'com.crm.auth.mapper.SysMenuMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T17:53:54.038+08:00 WARN 20740 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'sysRoleDataScopeMapper' and 'com.crm.auth.mapper.SysRoleDataScopeMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T17:53:54.039+08:00 WARN 20740 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'sysRoleMapper' and 'com.crm.auth.mapper.SysRoleMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T17:53:54.040+08:00 WARN 20740 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'sysRoleMenuMapper' and 'com.crm.auth.mapper.SysRoleMenuMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T17:53:54.041+08:00 WARN 20740 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'sysUserDeptMapper' and 'com.crm.auth.mapper.SysUserDeptMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T17:53:54.042+08:00 WARN 20740 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'sysUserRoleMapper' and 'com.crm.auth.mapper.SysUserRoleMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T17:53:54.044+08:00 WARN 20740 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'fileInfoMapper' and 'com.crm.file.mapper.FileInfoMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T17:53:54.046+08:00 WARN 20740 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'dictGroupDefaultMapper' and 'com.crm.dict.mapper.DictGroupDefaultMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T17:53:54.047+08:00 WARN 20740 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'dictGroupMapper' and 'com.crm.dict.mapper.DictGroupMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T17:53:54.048+08:00 WARN 20740 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'dictItemMapper' and 'com.crm.dict.mapper.DictItemMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T17:53:54.049+08:00 WARN 20740 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'dictRefCountMapper' and 'com.crm.dict.mapper.DictRefCountMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T17:53:54.050+08:00 WARN 20740 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'customerReminderRuleMapper' and 'com.crm.rule.mapper.CustomerReminderRuleMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T17:53:54.051+08:00 WARN 20740 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'leadPoolMapper' and 'com.crm.rule.mapper.LeadPoolMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T17:53:54.052+08:00 WARN 20740 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'leadPoolMemberMapper' and 'com.crm.rule.mapper.LeadPoolMemberMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T17:53:54.053+08:00 WARN 20740 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'leadPoolProvinceMapper' and 'com.crm.rule.mapper.LeadPoolProvinceMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T17:53:54.054+08:00 WARN 20740 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'leadPoolRegionMapper' and 'com.crm.rule.mapper.LeadPoolRegionMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T17:53:54.055+08:00 WARN 20740 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityPoolRuleDeptMapper' and 'com.crm.rule.mapper.OpportunityPoolRuleDeptMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T17:53:54.056+08:00 WARN 20740 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityPoolRuleMapper' and 'com.crm.rule.mapper.OpportunityPoolRuleMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T17:53:54.057+08:00 WARN 20740 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunitySchemeCardFieldMapper' and 'com.crm.rule.mapper.OpportunitySchemeCardFieldMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T17:53:54.058+08:00 WARN 20740 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunitySchemeCardTemplateDeptMapper' and 'com.crm.rule.mapper.OpportunitySchemeCardTemplateDeptMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T17:53:54.059+08:00 WARN 20740 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunitySchemeCardTemplateMapper' and 'com.crm.rule.mapper.OpportunitySchemeCardTemplateMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T17:53:54.060+08:00 WARN 20740 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunitySchemeFieldDefMapper' and 'com.crm.rule.mapper.OpportunitySchemeFieldDefMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T17:53:54.061+08:00 WARN 20740 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityStageNodeMapper' and 'com.crm.rule.mapper.OpportunityStageNodeMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T17:53:54.062+08:00 WARN 20740 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityStageTemplateDeptMapper' and 'com.crm.rule.mapper.OpportunityStageTemplateDeptMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T17:53:54.064+08:00 WARN 20740 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityStageTemplateMapper' and 'com.crm.rule.mapper.OpportunityStageTemplateMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T17:53:54.065+08:00 WARN 20740 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'sysRegionMapper' and 'com.crm.rule.mapper.SysRegionMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T17:53:54.066+08:00 WARN 20740 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'userColumnPreferenceMapper' and 'com.crm.preference.mapper.UserColumnPreferenceMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T17:53:54.067+08:00 WARN 20740 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'userSavedViewMapper' and 'com.crm.preference.mapper.UserSavedViewMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T17:53:54.068+08:00 WARN 20740 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'leadAttachmentMapper' and 'com.crm.lead.mapper.LeadAttachmentMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T17:53:54.069+08:00 WARN 20740 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'leadFeedbackMapper' and 'com.crm.lead.mapper.LeadFeedbackMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T17:53:54.070+08:00 WARN 20740 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'leadFollowMapper' and 'com.crm.lead.mapper.LeadFollowMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T17:53:54.071+08:00 WARN 20740 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'leadHistoryMapper' and 'com.crm.lead.mapper.LeadHistoryMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T17:53:54.072+08:00 WARN 20740 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'leadMapper' and 'com.crm.lead.mapper.LeadMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T17:53:54.073+08:00 WARN 20740 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityAttachmentMapper' and 'com.crm.opportunity.mapper.OpportunityAttachmentMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T17:53:54.073+08:00 WARN 20740 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityCustomerMapper' and 'com.crm.opportunity.mapper.OpportunityCustomerMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T17:53:54.074+08:00 WARN 20740 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityFocusMapper' and 'com.crm.opportunity.mapper.OpportunityFocusMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T17:53:54.075+08:00 WARN 20740 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityFollowMapper' and 'com.crm.opportunity.mapper.OpportunityFollowMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T17:53:54.076+08:00 WARN 20740 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityMapper' and 'com.crm.opportunity.mapper.OpportunityMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T17:53:54.076+08:00 WARN 20740 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityOplogMapper' and 'com.crm.opportunity.mapper.OpportunityOplogMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T17:53:54.077+08:00 WARN 20740 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityPendingNoticeMapper' and 'com.crm.opportunity.mapper.OpportunityPendingNoticeMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T17:53:54.078+08:00 WARN 20740 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunitySchemeCardMapper' and 'com.crm.opportunity.mapper.OpportunitySchemeCardMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T17:53:54.079+08:00 WARN 20740 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunitySchemeCardValueMapper' and 'com.crm.opportunity.mapper.OpportunitySchemeCardValueMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T17:53:54.080+08:00 WARN 20740 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunitySiteSurveyMapper' and 'com.crm.opportunity.mapper.OpportunitySiteSurveyMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T17:53:54.080+08:00 WARN 20740 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityStageHistoryMapper' and 'com.crm.opportunity.mapper.OpportunityStageHistoryMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T17:53:54.082+08:00 WARN 20740 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityStatusHistoryMapper' and 'com.crm.opportunity.mapper.OpportunityStatusHistoryMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T17:53:54.083+08:00 WARN 20740 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityTeamMapper' and 'com.crm.opportunity.mapper.OpportunityTeamMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T17:53:54.084+08:00 WARN 20740 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityViewLogMapper' and 'com.crm.opportunity.mapper.OpportunityViewLogMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T17:53:54.084+08:00 WARN 20740 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityWorkPlanMapper' and 'com.crm.opportunity.mapper.OpportunityWorkPlanMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T17:53:54.085+08:00 WARN 20740 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'customerContactMapper' and 'com.crm.customer.mapper.CustomerContactMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T17:53:54.086+08:00 WARN 20740 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'customerFocusMapper' and 'com.crm.customer.mapper.CustomerFocusMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T17:53:54.087+08:00 WARN 20740 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'customerFollowMapper' and 'com.crm.customer.mapper.CustomerFollowMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T17:53:54.088+08:00 WARN 20740 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'customerImportFailMapper' and 'com.crm.customer.mapper.CustomerImportFailMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T17:53:54.089+08:00 WARN 20740 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'customerImportTaskMapper' and 'com.crm.customer.mapper.CustomerImportTaskMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T17:53:54.090+08:00 WARN 20740 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'customerMapper' and 'com.crm.customer.mapper.CustomerMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T17:53:54.091+08:00 WARN 20740 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'customerOplogMapper' and 'com.crm.customer.mapper.CustomerOplogMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T17:53:54.092+08:00 WARN 20740 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'customerPendingNoticeMapper' and 'com.crm.customer.mapper.CustomerPendingNoticeMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T17:53:54.093+08:00 WARN 20740 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'customerTeamMemberMapper' and 'com.crm.customer.mapper.CustomerTeamMemberMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T17:53:54.093+08:00 WARN 20740 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'customerTransferDetailMapper' and 'com.crm.customer.mapper.CustomerTransferDetailMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T17:53:54.094+08:00 WARN 20740 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'customerTransferMapper' and 'com.crm.customer.mapper.CustomerTransferMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T17:53:54.094+08:00 WARN 20740 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'customerViewLogMapper' and 'com.crm.customer.mapper.CustomerViewLogMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T17:53:54.095+08:00 WARN 20740 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : No MyBatis mapper was found in '[com.crm.**.mapper]' package. Please check your configuration. -2026-09-03T17:53:54.099+08:00 WARN 20740 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'crmBaseMapper' and 'com.crm.base.mapper.CrmBaseMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T17:53:54.100+08:00 WARN 20740 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'authIdentityMapper' and 'com.crm.auth.mapper.AuthIdentityMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T17:53:54.101+08:00 WARN 20740 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'authUserMapper' and 'com.crm.auth.mapper.AuthUserMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T17:53:54.102+08:00 WARN 20740 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'sysDataScopeModuleMapper' and 'com.crm.auth.mapper.SysDataScopeModuleMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T17:53:54.103+08:00 WARN 20740 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'sysDeptMapper' and 'com.crm.auth.mapper.SysDeptMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T17:53:54.104+08:00 WARN 20740 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'sysMenuMapper' and 'com.crm.auth.mapper.SysMenuMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T17:53:54.105+08:00 WARN 20740 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'sysRoleDataScopeMapper' and 'com.crm.auth.mapper.SysRoleDataScopeMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T17:53:54.105+08:00 WARN 20740 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'sysRoleMapper' and 'com.crm.auth.mapper.SysRoleMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T17:53:54.106+08:00 WARN 20740 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'sysRoleMenuMapper' and 'com.crm.auth.mapper.SysRoleMenuMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T17:53:54.107+08:00 WARN 20740 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'sysUserDeptMapper' and 'com.crm.auth.mapper.SysUserDeptMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T17:53:54.108+08:00 WARN 20740 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'sysUserRoleMapper' and 'com.crm.auth.mapper.SysUserRoleMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T17:53:54.108+08:00 WARN 20740 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'fileInfoMapper' and 'com.crm.file.mapper.FileInfoMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T17:53:54.109+08:00 WARN 20740 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'dictGroupDefaultMapper' and 'com.crm.dict.mapper.DictGroupDefaultMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T17:53:54.110+08:00 WARN 20740 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'dictGroupMapper' and 'com.crm.dict.mapper.DictGroupMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T17:53:54.111+08:00 WARN 20740 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'dictItemMapper' and 'com.crm.dict.mapper.DictItemMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T17:53:54.112+08:00 WARN 20740 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'dictRefCountMapper' and 'com.crm.dict.mapper.DictRefCountMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T17:53:54.113+08:00 WARN 20740 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'customerReminderRuleMapper' and 'com.crm.rule.mapper.CustomerReminderRuleMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T17:53:54.114+08:00 WARN 20740 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'leadPoolMapper' and 'com.crm.rule.mapper.LeadPoolMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T17:53:54.114+08:00 WARN 20740 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'leadPoolMemberMapper' and 'com.crm.rule.mapper.LeadPoolMemberMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T17:53:54.115+08:00 WARN 20740 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'leadPoolProvinceMapper' and 'com.crm.rule.mapper.LeadPoolProvinceMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T17:53:54.116+08:00 WARN 20740 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'leadPoolRegionMapper' and 'com.crm.rule.mapper.LeadPoolRegionMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T17:53:54.118+08:00 WARN 20740 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityPoolRuleDeptMapper' and 'com.crm.rule.mapper.OpportunityPoolRuleDeptMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T17:53:54.118+08:00 WARN 20740 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityPoolRuleMapper' and 'com.crm.rule.mapper.OpportunityPoolRuleMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T17:53:54.120+08:00 WARN 20740 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunitySchemeCardFieldMapper' and 'com.crm.rule.mapper.OpportunitySchemeCardFieldMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T17:53:54.121+08:00 WARN 20740 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunitySchemeCardTemplateDeptMapper' and 'com.crm.rule.mapper.OpportunitySchemeCardTemplateDeptMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T17:53:54.122+08:00 WARN 20740 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunitySchemeCardTemplateMapper' and 'com.crm.rule.mapper.OpportunitySchemeCardTemplateMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T17:53:54.122+08:00 WARN 20740 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunitySchemeFieldDefMapper' and 'com.crm.rule.mapper.OpportunitySchemeFieldDefMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T17:53:54.123+08:00 WARN 20740 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityStageNodeMapper' and 'com.crm.rule.mapper.OpportunityStageNodeMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T17:53:54.124+08:00 WARN 20740 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityStageTemplateDeptMapper' and 'com.crm.rule.mapper.OpportunityStageTemplateDeptMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T17:53:54.125+08:00 WARN 20740 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityStageTemplateMapper' and 'com.crm.rule.mapper.OpportunityStageTemplateMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T17:53:54.126+08:00 WARN 20740 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'sysRegionMapper' and 'com.crm.rule.mapper.SysRegionMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T17:53:54.126+08:00 WARN 20740 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'userColumnPreferenceMapper' and 'com.crm.preference.mapper.UserColumnPreferenceMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T17:53:54.127+08:00 WARN 20740 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'userSavedViewMapper' and 'com.crm.preference.mapper.UserSavedViewMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T17:53:54.128+08:00 WARN 20740 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'leadAttachmentMapper' and 'com.crm.lead.mapper.LeadAttachmentMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T17:53:54.128+08:00 WARN 20740 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'leadFeedbackMapper' and 'com.crm.lead.mapper.LeadFeedbackMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T17:53:54.129+08:00 WARN 20740 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'leadFollowMapper' and 'com.crm.lead.mapper.LeadFollowMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T17:53:54.130+08:00 WARN 20740 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'leadHistoryMapper' and 'com.crm.lead.mapper.LeadHistoryMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T17:53:54.131+08:00 WARN 20740 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'leadMapper' and 'com.crm.lead.mapper.LeadMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T17:53:54.132+08:00 WARN 20740 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityAttachmentMapper' and 'com.crm.opportunity.mapper.OpportunityAttachmentMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T17:53:54.132+08:00 WARN 20740 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityCustomerMapper' and 'com.crm.opportunity.mapper.OpportunityCustomerMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T17:53:54.133+08:00 WARN 20740 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityFocusMapper' and 'com.crm.opportunity.mapper.OpportunityFocusMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T17:53:54.135+08:00 WARN 20740 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityFollowMapper' and 'com.crm.opportunity.mapper.OpportunityFollowMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T17:53:54.136+08:00 WARN 20740 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityMapper' and 'com.crm.opportunity.mapper.OpportunityMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T17:53:54.136+08:00 WARN 20740 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityOplogMapper' and 'com.crm.opportunity.mapper.OpportunityOplogMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T17:53:54.137+08:00 WARN 20740 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityPendingNoticeMapper' and 'com.crm.opportunity.mapper.OpportunityPendingNoticeMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T17:53:54.138+08:00 WARN 20740 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunitySchemeCardMapper' and 'com.crm.opportunity.mapper.OpportunitySchemeCardMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T17:53:54.139+08:00 WARN 20740 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunitySchemeCardValueMapper' and 'com.crm.opportunity.mapper.OpportunitySchemeCardValueMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T17:53:54.140+08:00 WARN 20740 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunitySiteSurveyMapper' and 'com.crm.opportunity.mapper.OpportunitySiteSurveyMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T17:53:54.140+08:00 WARN 20740 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityStageHistoryMapper' and 'com.crm.opportunity.mapper.OpportunityStageHistoryMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T17:53:54.141+08:00 WARN 20740 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityStatusHistoryMapper' and 'com.crm.opportunity.mapper.OpportunityStatusHistoryMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T17:53:54.142+08:00 WARN 20740 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityTeamMapper' and 'com.crm.opportunity.mapper.OpportunityTeamMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T17:53:54.143+08:00 WARN 20740 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityViewLogMapper' and 'com.crm.opportunity.mapper.OpportunityViewLogMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T17:53:54.144+08:00 WARN 20740 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityWorkPlanMapper' and 'com.crm.opportunity.mapper.OpportunityWorkPlanMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T17:53:54.144+08:00 WARN 20740 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'customerContactMapper' and 'com.crm.customer.mapper.CustomerContactMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T17:53:54.145+08:00 WARN 20740 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'customerFocusMapper' and 'com.crm.customer.mapper.CustomerFocusMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T17:53:54.146+08:00 WARN 20740 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'customerFollowMapper' and 'com.crm.customer.mapper.CustomerFollowMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T17:53:54.147+08:00 WARN 20740 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'customerImportFailMapper' and 'com.crm.customer.mapper.CustomerImportFailMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T17:53:54.148+08:00 WARN 20740 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'customerImportTaskMapper' and 'com.crm.customer.mapper.CustomerImportTaskMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T17:53:54.148+08:00 WARN 20740 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'customerMapper' and 'com.crm.customer.mapper.CustomerMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T17:53:54.150+08:00 WARN 20740 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'customerOplogMapper' and 'com.crm.customer.mapper.CustomerOplogMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T17:53:54.151+08:00 WARN 20740 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'customerPendingNoticeMapper' and 'com.crm.customer.mapper.CustomerPendingNoticeMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T17:53:54.157+08:00 WARN 20740 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'customerTeamMemberMapper' and 'com.crm.customer.mapper.CustomerTeamMemberMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T17:53:54.170+08:00 WARN 20740 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'customerTransferDetailMapper' and 'com.crm.customer.mapper.CustomerTransferDetailMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T17:53:54.262+08:00 WARN 20740 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'customerTransferMapper' and 'com.crm.customer.mapper.CustomerTransferMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T17:53:54.281+08:00 WARN 20740 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'customerViewLogMapper' and 'com.crm.customer.mapper.CustomerViewLogMapper' mapperInterface. Bean already defined with the same name! -2026-09-03T17:53:54.299+08:00 WARN 20740 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : No MyBatis mapper was found in '[com.crm.**.mapper]' package. Please check your configuration. -2026-09-03T17:53:55.375+08:00 INFO 20740 --- [crm-app] [main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port 8080 (http) -2026-09-03T17:53:55.399+08:00 INFO 20740 --- [crm-app] [main] o.apache.catalina.core.StandardService : Starting service [Tomcat] -2026-09-03T17:53:55.400+08:00 INFO 20740 --- [crm-app] [main] o.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/10.1.31] -2026-09-03T17:53:55.486+08:00 INFO 20740 --- [crm-app] [main] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext -2026-09-03T17:53:55.489+08:00 INFO 20740 --- [crm-app] [main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 3454 ms -2026-09-03T17:53:56.075+08:00 INFO 20740 --- [crm-app] [main] com.crm.auth.config.PermissionConfig : Ȩܿرɨɣ0 -2026-09-03T17:53:56.251+08:00 INFO 20740 --- [crm-app] [main] com.crm.base.config.CustomIdGenerator : ѩIDʼɣworkerId=0, datacenterId=0 -2026-09-03T17:53:57.140+08:00 INFO 20740 --- [crm-app] [main] o.hibernate.jpa.internal.util.LogHelper : HHH000204: Processing PersistenceUnitInfo [name: default] -2026-09-03T17:53:57.229+08:00 INFO 20740 --- [crm-app] [main] org.hibernate.Version : HHH000412: Hibernate ORM core version 6.5.3.Final -2026-09-03T17:53:57.279+08:00 INFO 20740 --- [crm-app] [main] o.h.c.internal.RegionFactoryInitiator : HHH000026: Second-level cache disabled -2026-09-03T17:53:57.672+08:00 INFO 20740 --- [crm-app] [main] o.s.o.j.p.SpringPersistenceUnitInfo : No LoadTimeWeaver setup: ignoring JPA class transformer -2026-09-03T17:53:57.715+08:00 INFO 20740 --- [crm-app] [main] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Starting... -2026-09-03T17:53:58.269+08:00 INFO 20740 --- [crm-app] [main] com.zaxxer.hikari.pool.HikariPool : HikariPool-1 - Added connection com.mysql.cj.jdbc.ConnectionImpl@4e797a39 -2026-09-03T17:53:58.274+08:00 INFO 20740 --- [crm-app] [main] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Start completed. -2026-09-03T17:53:58.489+08:00 WARN 20740 --- [crm-app] [main] org.hibernate.orm.deprecation : HHH90000025: MySQLDialect does not need to be specified explicitly using 'hibernate.dialect' (remove the property setting and it will be selected by default) -2026-09-03T17:54:00.407+08:00 INFO 20740 --- [crm-app] [main] o.h.e.t.j.p.i.JtaPlatformInitiator : HHH000489: No JTA platform available (set 'hibernate.transaction.jta.platform' to enable JTA platform integration) -2026-09-03T17:54:29.350+08:00 INFO 20740 --- [crm-app] [main] j.LocalContainerEntityManagerFactoryBean : Initialized JPA EntityManagerFactory for persistence unit 'default' -2026-09-03T17:54:29.777+08:00 WARN 20740 --- [crm-app] [main] c.c.a.controller.DebugTokenController : ============================================================ -2026-09-03T17:54:30.185+08:00 WARN 20740 --- [crm-app] [main] c.c.a.controller.DebugTokenController : token ӿ /api/auth/debug/token ãverify profile -2026-09-03T17:54:30.186+08:00 WARN 20740 --- [crm-app] [main] c.c.a.controller.DebugTokenController : Ͻκ֪ userId ˿ðû -2026-09-03T17:54:30.186+08:00 WARN 20740 --- [crm-app] [main] c.c.a.controller.DebugTokenController : μ docs/adr/0014-verify-profile-debug-token-endpoint.md -2026-09-03T17:54:30.187+08:00 WARN 20740 --- [crm-app] [main] c.c.a.controller.DebugTokenController : ============================================================ -2026-09-03T17:54:32.153+08:00 INFO 20740 --- [crm-app] [main] c.c.c.p.i.NgramNameSimilarityPortImpl : CustomerNameSimilarityPort һʵ־ԤɸģʽFULLTEXT ngram -2026-09-03T17:54:32.299+08:00 INFO 20740 --- [crm-app] [main] c.c.c.p.impl.StubCompanyLookupPortImpl : CompanyLookupPort һ stub װ䣨δ룬̺ѡؿգ -2026-09-03T17:54:32.548+08:00 INFO 20740 --- [crm-app] [main] c.c.c.p.i.NoopProjectOwnerSyncPortImpl : ProjectOwnerSyncPort no-op Ĭʵװ䣨A5 Ŀģδowner ͬ -2026-09-03T17:54:32.628+08:00 INFO 20740 --- [crm-app] [main] c.c.p.i.NoopOpportunityOwnerSyncPortImpl : OpportunityOwnerSyncPort no-op Ĭʵװ䣨Ʊ 11 ̻Դ滻 -2026-09-03T17:54:32.808+08:00 WARN 20740 --- [crm-app] [main] .s.s.UserDetailsServiceAutoConfiguration : - -Using generated security password: 1d0ffc06-01c9-40ff-ad41-02a5677386a5 - -This generated password is for development use only. Your security configuration must be updated before running your application in production. - -2026-09-03T17:54:32.832+08:00 INFO 20740 --- [crm-app] [main] r$InitializeUserDetailsManagerConfigurer : Global AuthenticationManager configured with UserDetailsService bean with name inMemoryUserDetailsManager -2026-09-03T17:54:33.967+08:00 INFO 20740 --- [crm-app] [main] c.c.a.c.DataScopeModuleStartupValidator : ȨģУͨ0 ܿر4 עģ -2026-09-03T17:54:34.008+08:00 INFO 20740 --- [crm-app] [main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port 8080 (http) with context path '/' -2026-09-03T17:54:34.048+08:00 INFO 20740 --- [crm-app] [main] com.crm.app.CrmAppApplication : Started CrmAppApplication in 43.079 seconds (process running for 43.72) -2026-09-03T17:54:34.054+08:00 INFO 20740 --- [crm-app] [main] com.crm.auth.config.DataInitializer : ִȨݳʼ... -2026-09-03T17:54:34.914+08:00 INFO 20740 --- [crm-app] [main] com.crm.auth.config.DataInitializer : Ȩݳʼ -2026-09-03T17:54:34.915+08:00 INFO 20740 --- [crm-app] [main] c.c.d.config.DictPermissionInitializer : ִֵȨӻ... -2026-09-03T17:54:35.553+08:00 INFO 20740 --- [crm-app] [main] c.c.d.config.DictPermissionInitializer : ֵȨӻɣ10 Ȩ޵ -2026-09-03T17:54:35.554+08:00 INFO 20740 --- [crm-app] [main] c.c.r.config.RulePermissionInitializer : ִȨӻ飨˵... -2026-09-03T17:54:35.636+08:00 INFO 20740 --- [crm-app] [main] c.c.r.config.RulePermissionInitializer : Ȩӻɣ˵0 button -2026-09-03T17:54:35.637+08:00 INFO 20740 --- [crm-app] [main] c.crm.rule.config.RegionDataInitializer : ִȫӵ... -2026-09-03T17:54:37.218+08:00 INFO 20740 --- [crm-app] [main] c.crm.rule.config.RegionDataInitializer : ӵɣ 3432 Уʡ 34 / 342 / 3056 3432 У 0 -2026-09-03T17:54:37.220+08:00 INFO 20740 --- [crm-app] [main] c.c.l.config.LeadPermissionInitializer : ִȨӻ飨˵... -2026-09-03T17:54:38.106+08:00 INFO 20740 --- [crm-app] [main] c.c.l.config.LeadPermissionInitializer : Ȩӻɣ4 ˵0 button -2026-09-03T17:54:38.107+08:00 INFO 20740 --- [crm-app] [main] r.c.OpportunityRulePermissionInitializer : ִ̻Ȩӻ飨˵... -2026-09-03T17:54:38.189+08:00 INFO 20740 --- [crm-app] [main] r.c.OpportunityRulePermissionInitializer : ̻Ȩӻɣ˵0 button -2026-09-03T17:54:38.190+08:00 INFO 20740 --- [crm-app] [main] ustomerReminderRulePermissionInitializer : ִпͻѹȨӻ飨˵... -2026-09-03T17:54:38.274+08:00 INFO 20740 --- [crm-app] [main] ustomerReminderRulePermissionInitializer : ͻѹȨӻɣ˵0 button -2026-09-03T17:54:38.275+08:00 INFO 20740 --- [crm-app] [main] tunityStageTemplatePermissionInitializer : ִ̻׶ģȨӻ飨˵... -2026-09-03T17:54:38.385+08:00 INFO 20740 --- [crm-app] [main] tunityStageTemplatePermissionInitializer : ̻׶ģȨӻɣ˵0 button -2026-09-03T17:54:38.386+08:00 INFO 20740 --- [crm-app] [main] c.c.r.config.SchemeFieldDefInitializer : ִзϵͳֶοӻ... -2026-09-03T17:54:38.644+08:00 INFO 20740 --- [crm-app] [main] c.c.r.config.SchemeFieldDefInitializer : ϵͳֶοӻɣִ 16 0 -2026-09-03T17:54:38.664+08:00 INFO 20740 --- [crm-app] [main] c.c.r.config.SchemeFieldDefInitializer : ģѴڣcode=OPP_SCHEME_TPL_01ͣãӻ -2026-09-03T17:54:38.665+08:00 INFO 20740 --- [crm-app] [main] ySchemeCardTemplatePermissionInitializer : ִзģȨӻ飨˵... -2026-09-03T17:54:38.751+08:00 INFO 20740 --- [crm-app] [main] ySchemeCardTemplatePermissionInitializer : ģȨӻɣ˵0 button -2026-09-03T17:54:38.770+08:00 INFO 20740 --- [crm-app] [main] c.c.r.config.StageTemplateInitializer : ĬϽ׶ģѴڣcode=OPP_STAGE_TPL_01ͣãӻ -2026-09-03T17:54:38.789+08:00 INFO 20740 --- [crm-app] [main] c.c.r.c.CustomerReminderRuleInitializer : ͻѹѴڣid=1ӻ -2026-09-03T17:54:38.790+08:00 INFO 20740 --- [crm-app] [main] c.crm.dict.config.DictDataInitializer : ִֵݵȳʼ... -2026-09-03T17:54:49.874+08:00 INFO 20740 --- [crm-app] [main] c.crm.dict.config.DictDataInitializer : ֵݵȳʼɣ24 -2026-09-03T17:54:50.172+08:00 WARN 20740 --- [crm-app] [main] com.crm.file.config.MinioConfig : MinIO bucket [crm] ʼʧܣļܿܲãThe Access Key Id you provided does not exist in our records. -2026-09-03T17:54:50.183+08:00 INFO 20740 --- [crm-app] [main] c.c.c.c.CustomerFulltextIndexInitializer : customer FULLTEXT idx_name_fulltext Ѵڣ -2026-09-03T17:56:10.679+08:00 INFO 20740 --- [crm-app] [http-nio-8080-exec-2] o.s.web.servlet.DispatcherServlet : Initializing Servlet 'dispatcherServlet' -2026-09-03T17:56:10.688+08:00 INFO 20740 --- [crm-app] [http-nio-8080-exec-2] o.s.web.servlet.DispatcherServlet : Completed initialization in 8 ms -2026-09-03T17:56:14.535+08:00 WARN 20740 --- [crm-app] [http-nio-8080-exec-3] c.c.b.a.GlobalExceptionHandlerAdvice : ҵ쳣code=67002, msg=ͻڻѱɾ -2026-09-03T17:56:46.784+08:00 WARN 20740 --- [crm-app] [http-nio-8080-exec-5] c.c.b.a.GlobalExceptionHandlerAdvice : ҵ쳣code=67002, msg=ͻڻѱɾ -2026-09-03T17:56:46.908+08:00 WARN 20740 --- [crm-app] [http-nio-8080-exec-6] c.c.b.a.GlobalExceptionHandlerAdvice : Ͳƥ䣺Method parameter 'id': Failed to convert value of type 'java.lang.String' to required type 'java.lang.Long'; For input string: "None" -2026-09-03T17:56:47.042+08:00 WARN 20740 --- [crm-app] [http-nio-8080-exec-7] c.c.b.a.GlobalExceptionHandlerAdvice : Ͳƥ䣺Method parameter 'id': Failed to convert value of type 'java.lang.String' to required type 'java.lang.Long'; For input string: "None" -2026-09-03T17:56:47.160+08:00 WARN 20740 --- [crm-app] [http-nio-8080-exec-8] c.c.b.a.GlobalExceptionHandlerAdvice : Ͳƥ䣺Method parameter 'id': Failed to convert value of type 'java.lang.String' to required type 'java.lang.Long'; For input string: "None" -2026-09-03T17:56:47.272+08:00 WARN 20740 --- [crm-app] [http-nio-8080-exec-9] c.c.b.a.GlobalExceptionHandlerAdvice : Ͳƥ䣺Method parameter 'id': Failed to convert value of type 'java.lang.String' to required type 'java.lang.Long'; For input string: "None" -2026-09-03T17:56:47.381+08:00 WARN 20740 --- [crm-app] [http-nio-8080-exec-10] c.c.b.a.GlobalExceptionHandlerAdvice : Ͳƥ䣺Method parameter 'ids': Failed to convert value of type 'java.lang.String' to required type 'java.util.List'; For input string: "None,None" -2026-09-03T17:56:47.496+08:00 WARN 20740 --- [crm-app] [http-nio-8080-exec-1] c.c.b.a.GlobalExceptionHandlerAdvice : Ͳƥ䣺Method parameter 'id': Failed to convert value of type 'java.lang.String' to required type 'java.lang.Long'; For input string: "None" -2026-09-03T17:56:47.608+08:00 WARN 20740 --- [crm-app] [http-nio-8080-exec-2] c.c.b.a.GlobalExceptionHandlerAdvice : Ͳƥ䣺Method parameter 'id': Failed to convert value of type 'java.lang.String' to required type 'java.lang.Long'; For input string: "None" -2026-09-03T17:56:47.735+08:00 WARN 20740 --- [crm-app] [http-nio-8080-exec-3] c.c.b.a.GlobalExceptionHandlerAdvice : Ͳƥ䣺Method parameter 'id': Failed to convert value of type 'java.lang.String' to required type 'java.lang.Long'; For input string: "None" -2026-09-03T17:59:09.736+08:00 WARN 20740 --- [crm-app] [http-nio-8080-exec-8] c.c.b.a.GlobalExceptionHandlerAdvice : ҵ쳣code=67002, msg=ͻڻѱɾ ->>>>>>> Stashed changes -2026-09-04T09:18:51.039+08:00 INFO 27256 --- [crm-app] [main] com.crm.app.CrmAppApplication : Starting CrmAppApplication v1.0.0-SNAPSHOT using Java 17.0.15 with PID 27256 (D:\code\crm-backend-matt\crm-app\target\crm-app-1.0.0-SNAPSHOT.jar started by luowj in D:\code\crm-backend-matt) -2026-09-04T09:18:51.057+08:00 INFO 27256 --- [crm-app] [main] com.crm.app.CrmAppApplication : The following 1 profile is active: "verify" -2026-09-04T09:18:52.774+08:00 INFO 27256 --- [crm-app] [main] .s.d.r.c.RepositoryConfigurationDelegate : Multiple Spring Data modules found, entering strict repository configuration mode -2026-09-04T09:18:52.776+08:00 INFO 27256 --- [crm-app] [main] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data JPA repositories in DEFAULT mode. -2026-09-04T09:18:52.812+08:00 INFO 27256 --- [crm-app] [main] .s.d.r.c.RepositoryConfigurationDelegate : Finished Spring Data repository scanning in 26 ms. Found 0 JPA repository interfaces. -2026-09-04T09:18:52.838+08:00 INFO 27256 --- [crm-app] [main] .s.d.r.c.RepositoryConfigurationDelegate : Multiple Spring Data modules found, entering strict repository configuration mode -2026-09-04T09:18:52.840+08:00 INFO 27256 --- [crm-app] [main] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data Redis repositories in DEFAULT mode. -2026-09-04T09:18:52.856+08:00 INFO 27256 --- [crm-app] [main] .s.d.r.c.RepositoryConfigurationDelegate : Finished Spring Data repository scanning in 3 ms. Found 0 Redis repository interfaces. -2026-09-04T09:18:53.035+08:00 WARN 27256 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'crmBaseMapper' and 'com.crm.base.mapper.CrmBaseMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T09:18:53.036+08:00 WARN 27256 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'authIdentityMapper' and 'com.crm.auth.mapper.AuthIdentityMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T09:18:53.036+08:00 WARN 27256 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'authUserMapper' and 'com.crm.auth.mapper.AuthUserMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T09:18:53.036+08:00 WARN 27256 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'sysDataScopeModuleMapper' and 'com.crm.auth.mapper.SysDataScopeModuleMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T09:18:53.037+08:00 WARN 27256 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'sysDeptMapper' and 'com.crm.auth.mapper.SysDeptMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T09:18:53.037+08:00 WARN 27256 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'sysMenuMapper' and 'com.crm.auth.mapper.SysMenuMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T09:18:53.038+08:00 WARN 27256 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'sysRoleDataScopeMapper' and 'com.crm.auth.mapper.SysRoleDataScopeMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T09:18:53.038+08:00 WARN 27256 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'sysRoleMapper' and 'com.crm.auth.mapper.SysRoleMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T09:18:53.038+08:00 WARN 27256 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'sysRoleMenuMapper' and 'com.crm.auth.mapper.SysRoleMenuMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T09:18:53.039+08:00 WARN 27256 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'sysUserDeptMapper' and 'com.crm.auth.mapper.SysUserDeptMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T09:18:53.039+08:00 WARN 27256 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'sysUserRoleMapper' and 'com.crm.auth.mapper.SysUserRoleMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T09:18:53.040+08:00 WARN 27256 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'fileInfoMapper' and 'com.crm.file.mapper.FileInfoMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T09:18:53.040+08:00 WARN 27256 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'dictGroupDefaultMapper' and 'com.crm.dict.mapper.DictGroupDefaultMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T09:18:53.041+08:00 WARN 27256 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'dictGroupMapper' and 'com.crm.dict.mapper.DictGroupMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T09:18:53.041+08:00 WARN 27256 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'dictItemMapper' and 'com.crm.dict.mapper.DictItemMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T09:18:53.042+08:00 WARN 27256 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'dictRefCountMapper' and 'com.crm.dict.mapper.DictRefCountMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T09:18:53.042+08:00 WARN 27256 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'customerReminderRuleMapper' and 'com.crm.rule.mapper.CustomerReminderRuleMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T09:18:53.043+08:00 WARN 27256 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'leadPoolMapper' and 'com.crm.rule.mapper.LeadPoolMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T09:18:53.044+08:00 WARN 27256 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'leadPoolMemberMapper' and 'com.crm.rule.mapper.LeadPoolMemberMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T09:18:53.044+08:00 WARN 27256 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'leadPoolProvinceMapper' and 'com.crm.rule.mapper.LeadPoolProvinceMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T09:18:53.045+08:00 WARN 27256 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'leadPoolRegionMapper' and 'com.crm.rule.mapper.LeadPoolRegionMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T09:18:53.045+08:00 WARN 27256 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityPoolRuleDeptMapper' and 'com.crm.rule.mapper.OpportunityPoolRuleDeptMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T09:18:53.045+08:00 WARN 27256 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityPoolRuleMapper' and 'com.crm.rule.mapper.OpportunityPoolRuleMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T09:18:53.046+08:00 WARN 27256 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunitySchemeCardFieldMapper' and 'com.crm.rule.mapper.OpportunitySchemeCardFieldMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T09:18:53.047+08:00 WARN 27256 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunitySchemeCardTemplateDeptMapper' and 'com.crm.rule.mapper.OpportunitySchemeCardTemplateDeptMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T09:18:53.048+08:00 WARN 27256 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunitySchemeCardTemplateMapper' and 'com.crm.rule.mapper.OpportunitySchemeCardTemplateMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T09:18:53.049+08:00 WARN 27256 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunitySchemeFieldDefMapper' and 'com.crm.rule.mapper.OpportunitySchemeFieldDefMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T09:18:53.050+08:00 WARN 27256 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityStageNodeMapper' and 'com.crm.rule.mapper.OpportunityStageNodeMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T09:18:53.050+08:00 WARN 27256 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityStageTemplateDeptMapper' and 'com.crm.rule.mapper.OpportunityStageTemplateDeptMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T09:18:53.051+08:00 WARN 27256 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityStageTemplateMapper' and 'com.crm.rule.mapper.OpportunityStageTemplateMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T09:18:53.051+08:00 WARN 27256 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'sysRegionMapper' and 'com.crm.rule.mapper.SysRegionMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T09:18:53.052+08:00 WARN 27256 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'userColumnPreferenceMapper' and 'com.crm.preference.mapper.UserColumnPreferenceMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T09:18:53.052+08:00 WARN 27256 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'userSavedViewMapper' and 'com.crm.preference.mapper.UserSavedViewMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T09:18:53.053+08:00 WARN 27256 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'leadAttachmentMapper' and 'com.crm.lead.mapper.LeadAttachmentMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T09:18:53.053+08:00 WARN 27256 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'leadFeedbackMapper' and 'com.crm.lead.mapper.LeadFeedbackMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T09:18:53.053+08:00 WARN 27256 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'leadFollowMapper' and 'com.crm.lead.mapper.LeadFollowMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T09:18:53.054+08:00 WARN 27256 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'leadHistoryMapper' and 'com.crm.lead.mapper.LeadHistoryMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T09:18:53.055+08:00 WARN 27256 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'leadMapper' and 'com.crm.lead.mapper.LeadMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T09:18:53.055+08:00 WARN 27256 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityAttachmentMapper' and 'com.crm.opportunity.mapper.OpportunityAttachmentMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T09:18:53.055+08:00 WARN 27256 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityCustomerMapper' and 'com.crm.opportunity.mapper.OpportunityCustomerMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T09:18:53.056+08:00 WARN 27256 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityFocusMapper' and 'com.crm.opportunity.mapper.OpportunityFocusMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T09:18:53.056+08:00 WARN 27256 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityFollowMapper' and 'com.crm.opportunity.mapper.OpportunityFollowMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T09:18:53.057+08:00 WARN 27256 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityMapper' and 'com.crm.opportunity.mapper.OpportunityMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T09:18:53.058+08:00 WARN 27256 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityOplogMapper' and 'com.crm.opportunity.mapper.OpportunityOplogMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T09:18:53.058+08:00 WARN 27256 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityPendingNoticeMapper' and 'com.crm.opportunity.mapper.OpportunityPendingNoticeMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T09:18:53.059+08:00 WARN 27256 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunitySchemeCardMapper' and 'com.crm.opportunity.mapper.OpportunitySchemeCardMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T09:18:53.059+08:00 WARN 27256 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunitySchemeCardValueMapper' and 'com.crm.opportunity.mapper.OpportunitySchemeCardValueMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T09:18:53.060+08:00 WARN 27256 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunitySiteSurveyMapper' and 'com.crm.opportunity.mapper.OpportunitySiteSurveyMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T09:18:53.060+08:00 WARN 27256 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityStageHistoryMapper' and 'com.crm.opportunity.mapper.OpportunityStageHistoryMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T09:18:53.060+08:00 WARN 27256 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityStatusHistoryMapper' and 'com.crm.opportunity.mapper.OpportunityStatusHistoryMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T09:18:53.061+08:00 WARN 27256 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityTeamMapper' and 'com.crm.opportunity.mapper.OpportunityTeamMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T09:18:53.061+08:00 WARN 27256 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityViewLogMapper' and 'com.crm.opportunity.mapper.OpportunityViewLogMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T09:18:53.062+08:00 WARN 27256 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityWorkPlanMapper' and 'com.crm.opportunity.mapper.OpportunityWorkPlanMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T09:18:53.062+08:00 WARN 27256 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'customerContactMapper' and 'com.crm.customer.mapper.CustomerContactMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T09:18:53.062+08:00 WARN 27256 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'customerFocusMapper' and 'com.crm.customer.mapper.CustomerFocusMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T09:18:53.063+08:00 WARN 27256 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'customerFollowMapper' and 'com.crm.customer.mapper.CustomerFollowMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T09:18:53.064+08:00 WARN 27256 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'customerImportFailMapper' and 'com.crm.customer.mapper.CustomerImportFailMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T09:18:53.064+08:00 WARN 27256 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'customerImportTaskMapper' and 'com.crm.customer.mapper.CustomerImportTaskMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T09:18:53.064+08:00 WARN 27256 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'customerMapper' and 'com.crm.customer.mapper.CustomerMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T09:18:53.065+08:00 WARN 27256 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'customerOplogMapper' and 'com.crm.customer.mapper.CustomerOplogMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T09:18:53.065+08:00 WARN 27256 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'customerPendingNoticeMapper' and 'com.crm.customer.mapper.CustomerPendingNoticeMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T09:18:53.066+08:00 WARN 27256 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'customerTeamMemberMapper' and 'com.crm.customer.mapper.CustomerTeamMemberMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T09:18:53.066+08:00 WARN 27256 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'customerTransferDetailMapper' and 'com.crm.customer.mapper.CustomerTransferDetailMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T09:18:53.067+08:00 WARN 27256 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'customerTransferMapper' and 'com.crm.customer.mapper.CustomerTransferMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T09:18:53.067+08:00 WARN 27256 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'customerViewLogMapper' and 'com.crm.customer.mapper.CustomerViewLogMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T09:18:53.067+08:00 WARN 27256 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : No MyBatis mapper was found in '[com.crm.**.mapper]' package. Please check your configuration. -2026-09-04T09:18:53.071+08:00 WARN 27256 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'crmBaseMapper' and 'com.crm.base.mapper.CrmBaseMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T09:18:53.071+08:00 WARN 27256 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'authIdentityMapper' and 'com.crm.auth.mapper.AuthIdentityMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T09:18:53.072+08:00 WARN 27256 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'authUserMapper' and 'com.crm.auth.mapper.AuthUserMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T09:18:53.072+08:00 WARN 27256 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'sysDataScopeModuleMapper' and 'com.crm.auth.mapper.SysDataScopeModuleMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T09:18:53.073+08:00 WARN 27256 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'sysDeptMapper' and 'com.crm.auth.mapper.SysDeptMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T09:18:53.073+08:00 WARN 27256 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'sysMenuMapper' and 'com.crm.auth.mapper.SysMenuMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T09:18:53.074+08:00 WARN 27256 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'sysRoleDataScopeMapper' and 'com.crm.auth.mapper.SysRoleDataScopeMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T09:18:53.074+08:00 WARN 27256 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'sysRoleMapper' and 'com.crm.auth.mapper.SysRoleMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T09:18:53.074+08:00 WARN 27256 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'sysRoleMenuMapper' and 'com.crm.auth.mapper.SysRoleMenuMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T09:18:53.075+08:00 WARN 27256 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'sysUserDeptMapper' and 'com.crm.auth.mapper.SysUserDeptMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T09:18:53.075+08:00 WARN 27256 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'sysUserRoleMapper' and 'com.crm.auth.mapper.SysUserRoleMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T09:18:53.075+08:00 WARN 27256 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'fileInfoMapper' and 'com.crm.file.mapper.FileInfoMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T09:18:53.076+08:00 WARN 27256 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'dictGroupDefaultMapper' and 'com.crm.dict.mapper.DictGroupDefaultMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T09:18:53.076+08:00 WARN 27256 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'dictGroupMapper' and 'com.crm.dict.mapper.DictGroupMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T09:18:53.076+08:00 WARN 27256 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'dictItemMapper' and 'com.crm.dict.mapper.DictItemMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T09:18:53.077+08:00 WARN 27256 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'dictRefCountMapper' and 'com.crm.dict.mapper.DictRefCountMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T09:18:53.077+08:00 WARN 27256 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'customerReminderRuleMapper' and 'com.crm.rule.mapper.CustomerReminderRuleMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T09:18:53.077+08:00 WARN 27256 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'leadPoolMapper' and 'com.crm.rule.mapper.LeadPoolMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T09:18:53.078+08:00 WARN 27256 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'leadPoolMemberMapper' and 'com.crm.rule.mapper.LeadPoolMemberMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T09:18:53.079+08:00 WARN 27256 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'leadPoolProvinceMapper' and 'com.crm.rule.mapper.LeadPoolProvinceMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T09:18:53.079+08:00 WARN 27256 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'leadPoolRegionMapper' and 'com.crm.rule.mapper.LeadPoolRegionMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T09:18:53.080+08:00 WARN 27256 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityPoolRuleDeptMapper' and 'com.crm.rule.mapper.OpportunityPoolRuleDeptMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T09:18:53.080+08:00 WARN 27256 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityPoolRuleMapper' and 'com.crm.rule.mapper.OpportunityPoolRuleMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T09:18:53.081+08:00 WARN 27256 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunitySchemeCardFieldMapper' and 'com.crm.rule.mapper.OpportunitySchemeCardFieldMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T09:18:53.081+08:00 WARN 27256 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunitySchemeCardTemplateDeptMapper' and 'com.crm.rule.mapper.OpportunitySchemeCardTemplateDeptMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T09:18:53.082+08:00 WARN 27256 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunitySchemeCardTemplateMapper' and 'com.crm.rule.mapper.OpportunitySchemeCardTemplateMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T09:18:53.082+08:00 WARN 27256 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunitySchemeFieldDefMapper' and 'com.crm.rule.mapper.OpportunitySchemeFieldDefMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T09:18:53.082+08:00 WARN 27256 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityStageNodeMapper' and 'com.crm.rule.mapper.OpportunityStageNodeMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T09:18:53.083+08:00 WARN 27256 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityStageTemplateDeptMapper' and 'com.crm.rule.mapper.OpportunityStageTemplateDeptMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T09:18:53.084+08:00 WARN 27256 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityStageTemplateMapper' and 'com.crm.rule.mapper.OpportunityStageTemplateMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T09:18:53.084+08:00 WARN 27256 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'sysRegionMapper' and 'com.crm.rule.mapper.SysRegionMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T09:18:53.085+08:00 WARN 27256 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'userColumnPreferenceMapper' and 'com.crm.preference.mapper.UserColumnPreferenceMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T09:18:53.085+08:00 WARN 27256 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'userSavedViewMapper' and 'com.crm.preference.mapper.UserSavedViewMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T09:18:53.085+08:00 WARN 27256 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'leadAttachmentMapper' and 'com.crm.lead.mapper.LeadAttachmentMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T09:18:53.086+08:00 WARN 27256 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'leadFeedbackMapper' and 'com.crm.lead.mapper.LeadFeedbackMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T09:18:53.086+08:00 WARN 27256 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'leadFollowMapper' and 'com.crm.lead.mapper.LeadFollowMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T09:18:53.086+08:00 WARN 27256 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'leadHistoryMapper' and 'com.crm.lead.mapper.LeadHistoryMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T09:18:53.087+08:00 WARN 27256 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'leadMapper' and 'com.crm.lead.mapper.LeadMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T09:18:53.087+08:00 WARN 27256 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityAttachmentMapper' and 'com.crm.opportunity.mapper.OpportunityAttachmentMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T09:18:53.088+08:00 WARN 27256 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityCustomerMapper' and 'com.crm.opportunity.mapper.OpportunityCustomerMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T09:18:53.088+08:00 WARN 27256 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityFocusMapper' and 'com.crm.opportunity.mapper.OpportunityFocusMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T09:18:53.089+08:00 WARN 27256 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityFollowMapper' and 'com.crm.opportunity.mapper.OpportunityFollowMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T09:18:53.089+08:00 WARN 27256 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityMapper' and 'com.crm.opportunity.mapper.OpportunityMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T09:18:53.089+08:00 WARN 27256 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityOplogMapper' and 'com.crm.opportunity.mapper.OpportunityOplogMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T09:18:53.090+08:00 WARN 27256 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityPendingNoticeMapper' and 'com.crm.opportunity.mapper.OpportunityPendingNoticeMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T09:18:53.090+08:00 WARN 27256 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunitySchemeCardMapper' and 'com.crm.opportunity.mapper.OpportunitySchemeCardMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T09:18:53.091+08:00 WARN 27256 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunitySchemeCardValueMapper' and 'com.crm.opportunity.mapper.OpportunitySchemeCardValueMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T09:18:53.091+08:00 WARN 27256 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunitySiteSurveyMapper' and 'com.crm.opportunity.mapper.OpportunitySiteSurveyMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T09:18:53.091+08:00 WARN 27256 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityStageHistoryMapper' and 'com.crm.opportunity.mapper.OpportunityStageHistoryMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T09:18:53.092+08:00 WARN 27256 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityStatusHistoryMapper' and 'com.crm.opportunity.mapper.OpportunityStatusHistoryMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T09:18:53.093+08:00 WARN 27256 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityTeamMapper' and 'com.crm.opportunity.mapper.OpportunityTeamMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T09:18:53.093+08:00 WARN 27256 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityViewLogMapper' and 'com.crm.opportunity.mapper.OpportunityViewLogMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T09:18:53.094+08:00 WARN 27256 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'opportunityWorkPlanMapper' and 'com.crm.opportunity.mapper.OpportunityWorkPlanMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T09:18:53.094+08:00 WARN 27256 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'customerContactMapper' and 'com.crm.customer.mapper.CustomerContactMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T09:18:53.095+08:00 WARN 27256 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'customerFocusMapper' and 'com.crm.customer.mapper.CustomerFocusMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T09:18:53.095+08:00 WARN 27256 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'customerFollowMapper' and 'com.crm.customer.mapper.CustomerFollowMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T09:18:53.095+08:00 WARN 27256 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'customerImportFailMapper' and 'com.crm.customer.mapper.CustomerImportFailMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T09:18:53.096+08:00 WARN 27256 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'customerImportTaskMapper' and 'com.crm.customer.mapper.CustomerImportTaskMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T09:18:53.096+08:00 WARN 27256 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'customerMapper' and 'com.crm.customer.mapper.CustomerMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T09:18:53.097+08:00 WARN 27256 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'customerOplogMapper' and 'com.crm.customer.mapper.CustomerOplogMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T09:18:53.097+08:00 WARN 27256 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'customerPendingNoticeMapper' and 'com.crm.customer.mapper.CustomerPendingNoticeMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T09:18:53.098+08:00 WARN 27256 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'customerTeamMemberMapper' and 'com.crm.customer.mapper.CustomerTeamMemberMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T09:18:53.098+08:00 WARN 27256 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'customerTransferDetailMapper' and 'com.crm.customer.mapper.CustomerTransferDetailMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T09:18:53.098+08:00 WARN 27256 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'customerTransferMapper' and 'com.crm.customer.mapper.CustomerTransferMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T09:18:53.099+08:00 WARN 27256 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'customerViewLogMapper' and 'com.crm.customer.mapper.CustomerViewLogMapper' mapperInterface. Bean already defined with the same name! -2026-09-04T09:18:53.099+08:00 WARN 27256 --- [crm-app] [main] o.m.s.mapper.ClassPathMapperScanner : No MyBatis mapper was found in '[com.crm.**.mapper]' package. Please check your configuration. -2026-09-04T09:18:54.125+08:00 INFO 27256 --- [crm-app] [main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port 8080 (http) -2026-09-04T09:18:54.145+08:00 INFO 27256 --- [crm-app] [main] o.apache.catalina.core.StandardService : Starting service [Tomcat] -2026-09-04T09:18:54.146+08:00 INFO 27256 --- [crm-app] [main] o.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/10.1.31] -2026-09-04T09:18:54.218+08:00 INFO 27256 --- [crm-app] [main] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext -2026-09-04T09:18:54.219+08:00 INFO 27256 --- [crm-app] [main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 3102 ms -2026-09-04T09:18:54.815+08:00 INFO 27256 --- [crm-app] [main] com.crm.auth.config.PermissionConfig : Ȩܿرɨɣ0 -2026-09-04T09:18:54.961+08:00 INFO 27256 --- [crm-app] [main] com.crm.base.config.CustomIdGenerator : ѩIDʼɣworkerId=0, datacenterId=0 -2026-09-04T09:18:55.674+08:00 INFO 27256 --- [crm-app] [main] o.hibernate.jpa.internal.util.LogHelper : HHH000204: Processing PersistenceUnitInfo [name: default] -2026-09-04T09:18:55.752+08:00 INFO 27256 --- [crm-app] [main] org.hibernate.Version : HHH000412: Hibernate ORM core version 6.5.3.Final -2026-09-04T09:18:55.801+08:00 INFO 27256 --- [crm-app] [main] o.h.c.internal.RegionFactoryInitiator : HHH000026: Second-level cache disabled -2026-09-04T09:18:56.203+08:00 INFO 27256 --- [crm-app] [main] o.s.o.j.p.SpringPersistenceUnitInfo : No LoadTimeWeaver setup: ignoring JPA class transformer -2026-09-04T09:18:56.240+08:00 INFO 27256 --- [crm-app] [main] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Starting... -2026-09-04T09:18:56.869+08:00 INFO 27256 --- [crm-app] [main] com.zaxxer.hikari.pool.HikariPool : HikariPool-1 - Added connection com.mysql.cj.jdbc.ConnectionImpl@79c4454 -2026-09-04T09:18:56.871+08:00 INFO 27256 --- [crm-app] [main] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Start completed. -2026-09-04T09:18:56.985+08:00 WARN 27256 --- [crm-app] [main] org.hibernate.orm.deprecation : HHH90000025: MySQLDialect does not need to be specified explicitly using 'hibernate.dialect' (remove the property setting and it will be selected by default) -2026-09-04T09:18:58.957+08:00 INFO 27256 --- [crm-app] [main] o.h.e.t.j.p.i.JtaPlatformInitiator : HHH000489: No JTA platform available (set 'hibernate.transaction.jta.platform' to enable JTA platform integration) -2026-09-04T09:19:16.977+08:00 INFO 27256 --- [crm-app] [main] j.LocalContainerEntityManagerFactoryBean : Initialized JPA EntityManagerFactory for persistence unit 'default' -2026-09-04T09:19:17.408+08:00 WARN 27256 --- [crm-app] [main] c.c.a.controller.DebugTokenController : ============================================================ -2026-09-04T09:19:17.408+08:00 WARN 27256 --- [crm-app] [main] c.c.a.controller.DebugTokenController : token ӿ /api/auth/debug/token ãverify profile -2026-09-04T09:19:17.409+08:00 WARN 27256 --- [crm-app] [main] c.c.a.controller.DebugTokenController : Ͻκ֪ userId ˿ðû -2026-09-04T09:19:17.409+08:00 WARN 27256 --- [crm-app] [main] c.c.a.controller.DebugTokenController : μ docs/adr/0014-verify-profile-debug-token-endpoint.md -2026-09-04T09:19:17.409+08:00 WARN 27256 --- [crm-app] [main] c.c.a.controller.DebugTokenController : ============================================================ -2026-09-04T09:19:19.394+08:00 INFO 27256 --- [crm-app] [main] c.c.c.p.i.NgramNameSimilarityPortImpl : CustomerNameSimilarityPort һʵ־ԤɸģʽFULLTEXT ngram -2026-09-04T09:19:19.559+08:00 INFO 27256 --- [crm-app] [main] c.c.c.p.impl.StubCompanyLookupPortImpl : CompanyLookupPort һ stub װ䣨δ룬̺ѡؿգ -2026-09-04T09:19:19.796+08:00 INFO 27256 --- [crm-app] [main] c.c.c.p.i.NoopProjectOwnerSyncPortImpl : ProjectOwnerSyncPort no-op Ĭʵװ䣨A5 Ŀģδowner ͬ -2026-09-04T09:19:19.871+08:00 INFO 27256 --- [crm-app] [main] c.c.p.i.NoopOpportunityOwnerSyncPortImpl : OpportunityOwnerSyncPort no-op Ĭʵװ䣨Ʊ 11 ̻Դ滻 -2026-09-04T09:19:20.044+08:00 WARN 27256 --- [crm-app] [main] .s.s.UserDetailsServiceAutoConfiguration : - -Using generated security password: b77599cd-1362-44f5-9a0b-0031f27801e3 - -This generated password is for development use only. Your security configuration must be updated before running your application in production. - -2026-09-04T09:19:20.067+08:00 INFO 27256 --- [crm-app] [main] r$InitializeUserDetailsManagerConfigurer : Global AuthenticationManager configured with UserDetailsService bean with name inMemoryUserDetailsManager -2026-09-04T09:19:21.378+08:00 INFO 27256 --- [crm-app] [main] c.c.a.c.DataScopeModuleStartupValidator : ȨģУͨ0 ܿر4 עģ -2026-09-04T09:19:21.420+08:00 INFO 27256 --- [crm-app] [main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port 8080 (http) with context path '/' -2026-09-04T09:19:21.451+08:00 INFO 27256 --- [crm-app] [main] com.crm.app.CrmAppApplication : Started CrmAppApplication in 31.112 seconds (process running for 31.808) -2026-09-04T09:19:21.455+08:00 INFO 27256 --- [crm-app] [main] com.crm.auth.config.DataInitializer : ִȨݳʼ... -2026-09-04T09:19:22.214+08:00 INFO 27256 --- [crm-app] [main] com.crm.auth.config.DataInitializer : Ȩݳʼ -2026-09-04T09:19:22.214+08:00 INFO 27256 --- [crm-app] [main] c.c.d.config.DictPermissionInitializer : ִֵȨӻ... -2026-09-04T09:19:22.593+08:00 INFO 27256 --- [crm-app] [main] c.c.d.config.DictPermissionInitializer : ֵȨӻɣ10 Ȩ޵ -2026-09-04T09:19:22.593+08:00 INFO 27256 --- [crm-app] [main] c.c.r.config.RulePermissionInitializer : ִȨӻ飨˵... -2026-09-04T09:19:22.702+08:00 INFO 27256 --- [crm-app] [main] c.c.r.config.RulePermissionInitializer : Ȩӻɣ˵0 button -2026-09-04T09:19:22.702+08:00 INFO 27256 --- [crm-app] [main] c.c.l.config.LeadPermissionInitializer : ִȨӻ飨˵... -2026-09-04T09:19:23.143+08:00 INFO 27256 --- [crm-app] [main] c.c.l.config.LeadPermissionInitializer : Ȩӻɣ4 ˵0 button -2026-09-04T09:19:23.144+08:00 INFO 27256 --- [crm-app] [main] c.crm.rule.config.RegionDataInitializer : ִȫӵ... -2026-09-04T09:19:25.128+08:00 INFO 27256 --- [crm-app] [main] c.crm.rule.config.RegionDataInitializer : ӵɣ 3432 Уʡ 34 / 342 / 3056 3432 У 0 -2026-09-04T09:19:25.129+08:00 INFO 27256 --- [crm-app] [main] r.c.OpportunityRulePermissionInitializer : ִ̻Ȩӻ飨˵... -2026-09-04T09:19:25.256+08:00 INFO 27256 --- [crm-app] [main] r.c.OpportunityRulePermissionInitializer : ̻Ȩӻɣ˵0 button -2026-09-04T09:19:25.257+08:00 INFO 27256 --- [crm-app] [main] tunityStageTemplatePermissionInitializer : ִ̻׶ģȨӻ飨˵... -2026-09-04T09:19:25.345+08:00 INFO 27256 --- [crm-app] [main] tunityStageTemplatePermissionInitializer : ̻׶ģȨӻɣ˵0 button -2026-09-04T09:19:25.346+08:00 INFO 27256 --- [crm-app] [main] ustomerReminderRulePermissionInitializer : ִпͻѹȨӻ飨˵... -2026-09-04T09:19:25.451+08:00 INFO 27256 --- [crm-app] [main] ustomerReminderRulePermissionInitializer : ͻѹȨӻɣ˵0 button -2026-09-04T09:19:25.451+08:00 INFO 27256 --- [crm-app] [main] c.c.r.config.SchemeFieldDefInitializer : ִзϵͳֶοӻ... -2026-09-04T09:19:25.471+08:00 INFO 27256 --- [crm-app] [main] c.c.r.config.SchemeFieldDefInitializer : ϵͳֶοӻɣִ 16 0 -2026-09-04T09:19:25.487+08:00 INFO 27256 --- [crm-app] [main] c.c.r.config.SchemeFieldDefInitializer : ģѴڣcode=OPP_SCHEME_TPL_01ͣãӻ -2026-09-04T09:19:25.488+08:00 INFO 27256 --- [crm-app] [main] ySchemeCardTemplatePermissionInitializer : ִзģȨӻ飨˵... -2026-09-04T09:19:25.596+08:00 INFO 27256 --- [crm-app] [main] ySchemeCardTemplatePermissionInitializer : ģȨӻɣ˵0 button -2026-09-04T09:19:25.611+08:00 INFO 27256 --- [crm-app] [main] c.c.r.config.StageTemplateInitializer : ĬϽ׶ģѴڣcode=OPP_STAGE_TPL_01ͣãӻ -2026-09-04T09:19:25.629+08:00 INFO 27256 --- [crm-app] [main] c.c.r.c.CustomerReminderRuleInitializer : ͻѹѴڣid=1ӻ -2026-09-04T09:19:25.641+08:00 INFO 27256 --- [crm-app] [main] c.c.c.c.CustomerFulltextIndexInitializer : customer FULLTEXT idx_name_fulltext Ѵڣ -2026-09-04T09:19:26.006+08:00 INFO 27256 --- [crm-app] [main] c.crm.dict.config.DictDataInitializer : ִֵݵȳʼ... -2026-09-04T09:19:35.294+08:00 INFO 27256 --- [crm-app] [main] c.crm.dict.config.DictDataInitializer : ֵݵȳʼɣ24 -2026-09-04T09:20:00.417+08:00 INFO 27256 --- [crm-app] [http-nio-8080-exec-2] o.s.web.servlet.DispatcherServlet : Initializing Servlet 'dispatcherServlet' -2026-09-04T09:20:00.425+08:00 INFO 27256 --- [crm-app] [http-nio-8080-exec-2] o.s.web.servlet.DispatcherServlet : Completed initialization in 4 ms -2026-09-04T09:20:03.666+08:00 WARN 27256 --- [crm-app] [http-nio-8080-exec-2] c.c.a.controller.DebugTokenController : [verify] Ϊ userId=739564171091247104 ǩ token -2026-09-04T09:24:35.340+08:00 WARN 27256 --- [crm-app] [http-nio-8080-exec-9] c.c.a.controller.DebugTokenController : [verify] Ϊ userId=739564171091247104 ǩ token -2026-09-04T09:24:53.300+08:00 WARN 27256 --- [crm-app] [http-nio-8080-exec-3] c.c.a.controller.DebugTokenController : [verify] Ϊ userId=739564171091247104 ǩ token -2026-09-04T09:28:25.998+08:00 WARN 27256 --- [crm-app] [http-nio-8080-exec-7] c.c.a.controller.DebugTokenController : [verify] Ϊ userId=739564171091247104 ǩ token -2026-09-04T09:28:53.907+08:00 WARN 27256 --- [crm-app] [http-nio-8080-exec-6] c.c.b.a.GlobalExceptionHandlerAdvice : ʽRequest method 'POST' is not supported -2026-09-04T09:28:55.308+08:00 WARN 27256 --- [crm-app] [http-nio-8080-exec-8] c.c.b.a.GlobalExceptionHandlerAdvice : ʽRequest method 'POST' is not supported -2026-09-04T09:28:56.110+08:00 WARN 27256 --- [crm-app] [http-nio-8080-exec-1] c.c.b.a.GlobalExceptionHandlerAdvice : ʽRequest method 'POST' is not supported -2026-09-04T09:28:56.921+08:00 WARN 27256 --- [crm-app] [http-nio-8080-exec-10] c.c.b.a.GlobalExceptionHandlerAdvice : ʽRequest method 'POST' is not supported -2026-09-04T09:42:46.833+08:00 WARN 27256 --- [crm-app] [http-nio-8080-exec-1] c.c.a.controller.DebugTokenController : [verify] Ϊ userId=739564171091247104 ǩ token -2026-09-04T09:42:47.282+08:00 WARN 27256 --- [crm-app] [http-nio-8080-exec-5] c.c.b.a.GlobalExceptionHandlerAdvice : ҵ쳣code=67004, msg=۸˿ִиò -2026-09-04T09:43:18.653+08:00 WARN 27256 --- [crm-app] [http-nio-8080-exec-8] c.c.a.controller.DebugTokenController : [verify] Ϊ userId=739564171091247104 ǩ token -2026-09-04T09:43:19.041+08:00 WARN 27256 --- [crm-app] [http-nio-8080-exec-3] c.c.b.a.GlobalExceptionHandlerAdvice : ҵ쳣code=67004, msg=۸˿ִиò -2026-09-04T09:43:45.718+08:00 WARN 27256 --- [crm-app] [http-nio-8080-exec-10] c.c.a.controller.DebugTokenController : [verify] Ϊ userId=739564171091247104 ǩ token -2026-09-04T09:44:11.986+08:00 WARN 27256 --- [crm-app] [http-nio-8080-exec-9] c.c.b.a.GlobalExceptionHandlerAdvice : ҵ쳣code=67003, msg=ͳһôѱռãϵͳѴڸҵ -2026-09-04T09:44:53.929+08:00 INFO 27256 --- [crm-app] [task-2] c.c.c.task.CustomerImportExecutor : ͻɣtaskId=751014847793070080, insert=0, update=0, unchanged=0, fail=0, suspect=1 -2026-09-04T09:44:54.214+08:00 ERROR 27256 --- [crm-app] [task-1] c.crm.file.task.ThumbnailGenerationTask : ͼʧܣfileId=751014846757076992, thumbKey=thumbnails/751014846757076992.jpg - -java.io.IOException: Cannot run program "soffice": CreateProcess error=2, ϵͳҲָļ - at java.base/java.lang.ProcessBuilder.start(ProcessBuilder.java:1143) ~[na:na] - at java.base/java.lang.ProcessBuilder.start(ProcessBuilder.java:1073) ~[na:na] - at com.crm.file.service.impl.OfficeThumbnailRenderer.runConversion(OfficeThumbnailRenderer.java:110) ~[crm-file-1.0.0-SNAPSHOT.jar!/:1.0.0-SNAPSHOT] - at com.crm.file.service.impl.OfficeThumbnailRenderer.render(OfficeThumbnailRenderer.java:70) ~[crm-file-1.0.0-SNAPSHOT.jar!/:1.0.0-SNAPSHOT] - at com.crm.file.task.ThumbnailGenerationTask.generateSync(ThumbnailGenerationTask.java:140) ~[crm-file-1.0.0-SNAPSHOT.jar!/:1.0.0-SNAPSHOT] - at com.crm.file.task.ThumbnailGenerationTask.generateWithLock(ThumbnailGenerationTask.java:102) ~[crm-file-1.0.0-SNAPSHOT.jar!/:1.0.0-SNAPSHOT] - at com.crm.file.task.ThumbnailGenerationTask.generate(ThumbnailGenerationTask.java:70) ~[crm-file-1.0.0-SNAPSHOT.jar!/:1.0.0-SNAPSHOT] - at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na] - at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) ~[na:na] - at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na] - at java.base/java.lang.reflect.Method.invoke(Method.java:568) ~[na:na] - at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:355) ~[spring-aop-6.1.14.jar!/:6.1.14] - at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:196) ~[spring-aop-6.1.14.jar!/:6.1.14] - at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) ~[spring-aop-6.1.14.jar!/:6.1.14] - at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:768) ~[spring-aop-6.1.14.jar!/:6.1.14] - at org.springframework.aop.interceptor.AsyncExecutionInterceptor.lambda$invoke$0(AsyncExecutionInterceptor.java:113) ~[spring-aop-6.1.14.jar!/:6.1.14] - at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264) ~[na:na] - at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136) ~[na:na] - at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635) ~[na:na] - at java.base/java.lang.Thread.run(Thread.java:842) ~[na:na] -Caused by: java.io.IOException: CreateProcess error=2, ϵͳҲָļ - at java.base/java.lang.ProcessImpl.create(Native Method) ~[na:na] - at java.base/java.lang.ProcessImpl.(ProcessImpl.java:505) ~[na:na] - at java.base/java.lang.ProcessImpl.start(ProcessImpl.java:158) ~[na:na] - at java.base/java.lang.ProcessBuilder.start(ProcessBuilder.java:1110) ~[na:na] - ... 19 common frames omitted - -2026-09-04T09:44:59.596+08:00 INFO 27256 --- [crm-app] [http-nio-8080-exec-4] .c.r.s.i.CustomerReminderRuleServiceImpl : [ͻѹ] ȫDZ棺operator=739564171091247104, masterEnabled=1, firstTrigger=1/31, secondInterval=1/7 -2026-09-04T09:45:02.059+08:00 WARN 27256 --- [crm-app] [http-nio-8080-exec-6] c.c.b.a.GlobalExceptionHandlerAdvice : ҵ쳣code=64023, msg=״δѼΪ -2026-09-04T09:45:04.790+08:00 INFO 27256 --- [crm-app] [http-nio-8080-exec-1] .c.r.s.i.CustomerReminderRuleServiceImpl : [ͻѹ] ȫDZ棺operator=739564171091247104, masterEnabled=1, firstTrigger=1/30, secondInterval=1/7 -2026-09-04T09:47:40.187+08:00 WARN 27256 --- [crm-app] [http-nio-8080-exec-8] c.c.a.controller.DebugTokenController : [verify] Ϊ userId=739564171091247104 ǩ token -2026-09-04T09:49:14.325+08:00 WARN 27256 --- [crm-app] [http-nio-8080-exec-5] c.c.a.controller.DebugTokenController : [verify] Ϊ userId=739564171091247104 ǩ token -2026-09-04T09:49:43.965+08:00 WARN 27256 --- [crm-app] [http-nio-8080-exec-9] c.c.a.controller.DebugTokenController : [verify] Ϊ userId=739564171091247104 ǩ token -2026-09-04T09:52:21.124+08:00 WARN 27256 --- [crm-app] [http-nio-8080-exec-5] c.c.a.controller.DebugTokenController : [verify] Ϊ userId=739564171091247104 ǩ token -2026-09-04T09:52:46.957+08:00 WARN 27256 --- [crm-app] [http-nio-8080-exec-9] c.c.b.a.GlobalExceptionHandlerAdvice : ҵ쳣code=67003, msg=ͳһôѱռãϵͳѴڸҵ -2026-09-04T09:52:57.178+08:00 ERROR 27256 --- [crm-app] [task-3] c.crm.file.task.ThumbnailGenerationTask : ͼʧܣfileId=751016877735542784, thumbKey=thumbnails/751016877735542784.jpg - -java.io.IOException: Cannot run program "soffice": CreateProcess error=2, ϵͳҲָļ - at java.base/java.lang.ProcessBuilder.start(ProcessBuilder.java:1143) ~[na:na] - at java.base/java.lang.ProcessBuilder.start(ProcessBuilder.java:1073) ~[na:na] - at com.crm.file.service.impl.OfficeThumbnailRenderer.runConversion(OfficeThumbnailRenderer.java:110) ~[crm-file-1.0.0-SNAPSHOT.jar!/:1.0.0-SNAPSHOT] - at com.crm.file.service.impl.OfficeThumbnailRenderer.render(OfficeThumbnailRenderer.java:70) ~[crm-file-1.0.0-SNAPSHOT.jar!/:1.0.0-SNAPSHOT] - at com.crm.file.task.ThumbnailGenerationTask.generateSync(ThumbnailGenerationTask.java:140) ~[crm-file-1.0.0-SNAPSHOT.jar!/:1.0.0-SNAPSHOT] - at com.crm.file.task.ThumbnailGenerationTask.generateWithLock(ThumbnailGenerationTask.java:102) ~[crm-file-1.0.0-SNAPSHOT.jar!/:1.0.0-SNAPSHOT] - at com.crm.file.task.ThumbnailGenerationTask.generate(ThumbnailGenerationTask.java:70) ~[crm-file-1.0.0-SNAPSHOT.jar!/:1.0.0-SNAPSHOT] - at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na] - at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) ~[na:na] - at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na] - at java.base/java.lang.reflect.Method.invoke(Method.java:568) ~[na:na] - at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:355) ~[spring-aop-6.1.14.jar!/:6.1.14] - at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:196) ~[spring-aop-6.1.14.jar!/:6.1.14] - at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) ~[spring-aop-6.1.14.jar!/:6.1.14] - at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:768) ~[spring-aop-6.1.14.jar!/:6.1.14] - at org.springframework.aop.interceptor.AsyncExecutionInterceptor.lambda$invoke$0(AsyncExecutionInterceptor.java:113) ~[spring-aop-6.1.14.jar!/:6.1.14] - at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264) ~[na:na] - at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136) ~[na:na] - at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635) ~[na:na] - at java.base/java.lang.Thread.run(Thread.java:842) ~[na:na] -Caused by: java.io.IOException: CreateProcess error=2, ϵͳҲָļ - at java.base/java.lang.ProcessImpl.create(Native Method) ~[na:na] - at java.base/java.lang.ProcessImpl.(ProcessImpl.java:505) ~[na:na] - at java.base/java.lang.ProcessImpl.start(ProcessImpl.java:158) ~[na:na] - at java.base/java.lang.ProcessBuilder.start(ProcessBuilder.java:1110) ~[na:na] - ... 19 common frames omitted - -2026-09-04T09:53:00.169+08:00 INFO 27256 --- [crm-app] [task-4] c.c.c.task.CustomerImportExecutor : ͻɣtaskId=751016878322745344, insert=0, update=0, unchanged=0, fail=0, suspect=1 -2026-09-04T09:53:05.717+08:00 INFO 27256 --- [crm-app] [http-nio-8080-exec-6] .c.r.s.i.CustomerReminderRuleServiceImpl : [ͻѹ] ȫDZ棺operator=739564171091247104, masterEnabled=1, firstTrigger=1/31, secondInterval=1/7 -2026-09-04T09:53:08.434+08:00 WARN 27256 --- [crm-app] [http-nio-8080-exec-8] c.c.b.a.GlobalExceptionHandlerAdvice : ҵ쳣code=64023, msg=״δѼΪ -2026-09-04T09:53:11.117+08:00 INFO 27256 --- [crm-app] [http-nio-8080-exec-5] .c.r.s.i.CustomerReminderRuleServiceImpl : [ͻѹ] ȫDZ棺operator=739564171091247104, masterEnabled=1, firstTrigger=1/30, secondInterval=1/7 -2026-09-04T09:56:24.414+08:00 WARN 27256 --- [crm-app] [http-nio-8080-exec-7] c.c.a.controller.DebugTokenController : [verify] Ϊ userId=739564171091247104 ǩ token -2026-09-04T09:56:50.693+08:00 WARN 27256 --- [crm-app] [http-nio-8080-exec-10] c.c.b.a.GlobalExceptionHandlerAdvice : ҵ쳣code=67003, msg=ͳһôѱռãϵͳѴڸҵ -2026-09-04T09:57:01.508+08:00 ERROR 27256 --- [crm-app] [task-5] c.crm.file.task.ThumbnailGenerationTask : ͼʧܣfileId=751017900113920000, thumbKey=thumbnails/751017900113920000.jpg - -java.io.IOException: Cannot run program "soffice": CreateProcess error=2, ϵͳҲָļ - at java.base/java.lang.ProcessBuilder.start(ProcessBuilder.java:1143) ~[na:na] - at java.base/java.lang.ProcessBuilder.start(ProcessBuilder.java:1073) ~[na:na] - at com.crm.file.service.impl.OfficeThumbnailRenderer.runConversion(OfficeThumbnailRenderer.java:110) ~[crm-file-1.0.0-SNAPSHOT.jar!/:1.0.0-SNAPSHOT] - at com.crm.file.service.impl.OfficeThumbnailRenderer.render(OfficeThumbnailRenderer.java:70) ~[crm-file-1.0.0-SNAPSHOT.jar!/:1.0.0-SNAPSHOT] - at com.crm.file.task.ThumbnailGenerationTask.generateSync(ThumbnailGenerationTask.java:140) ~[crm-file-1.0.0-SNAPSHOT.jar!/:1.0.0-SNAPSHOT] - at com.crm.file.task.ThumbnailGenerationTask.generateWithLock(ThumbnailGenerationTask.java:102) ~[crm-file-1.0.0-SNAPSHOT.jar!/:1.0.0-SNAPSHOT] - at com.crm.file.task.ThumbnailGenerationTask.generate(ThumbnailGenerationTask.java:70) ~[crm-file-1.0.0-SNAPSHOT.jar!/:1.0.0-SNAPSHOT] - at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na] - at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) ~[na:na] - at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na] - at java.base/java.lang.reflect.Method.invoke(Method.java:568) ~[na:na] - at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:355) ~[spring-aop-6.1.14.jar!/:6.1.14] - at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:196) ~[spring-aop-6.1.14.jar!/:6.1.14] - at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) ~[spring-aop-6.1.14.jar!/:6.1.14] - at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:768) ~[spring-aop-6.1.14.jar!/:6.1.14] - at org.springframework.aop.interceptor.AsyncExecutionInterceptor.lambda$invoke$0(AsyncExecutionInterceptor.java:113) ~[spring-aop-6.1.14.jar!/:6.1.14] - at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264) ~[na:na] - at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136) ~[na:na] - at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635) ~[na:na] - at java.base/java.lang.Thread.run(Thread.java:842) ~[na:na] -Caused by: java.io.IOException: CreateProcess error=2, ϵͳҲָļ - at java.base/java.lang.ProcessImpl.create(Native Method) ~[na:na] - at java.base/java.lang.ProcessImpl.(ProcessImpl.java:505) ~[na:na] - at java.base/java.lang.ProcessImpl.start(ProcessImpl.java:158) ~[na:na] - at java.base/java.lang.ProcessBuilder.start(ProcessBuilder.java:1110) ~[na:na] - ... 19 common frames omitted + ... 22 common frames omitted -2026-09-04T09:57:03.638+08:00 INFO 27256 --- [crm-app] [task-6] c.c.c.task.CustomerImportExecutor : ͻɣtaskId=751017903351922688, insert=0, update=0, unchanged=0, fail=0, suspect=1 -2026-09-04T09:57:09.267+08:00 INFO 27256 --- [crm-app] [http-nio-8080-exec-6] .c.r.s.i.CustomerReminderRuleServiceImpl : [ͻѹ] ȫDZ棺operator=739564171091247104, masterEnabled=1, firstTrigger=1/31, secondInterval=1/7 -2026-09-04T09:57:11.974+08:00 WARN 27256 --- [crm-app] [http-nio-8080-exec-8] c.c.b.a.GlobalExceptionHandlerAdvice : ҵ쳣code=64023, msg=״δѼΪ -2026-09-04T09:57:14.716+08:00 INFO 27256 --- [crm-app] [http-nio-8080-exec-5] .c.r.s.i.CustomerReminderRuleServiceImpl : [ͻѹ] ȫDZ棺operator=739564171091247104, masterEnabled=1, firstTrigger=1/30, secondInterval=1/7 -2026-09-04T10:52:13.073+08:00 WARN 27256 --- [crm-app] [http-nio-8080-exec-1] c.c.a.controller.DebugTokenController : [verify] Ϊ userId=739564171091247104 ǩ token -2026-09-04T14:07:04.692+08:00 WARN 27256 --- [crm-app] [http-nio-8080-exec-3] c.c.a.controller.DebugTokenController : [verify] Ϊ userId=744842318024015872 ǩ token -2026-09-04T14:13:45.451+08:00 WARN 27256 --- [crm-app] [http-nio-8080-exec-10] c.c.a.controller.DebugTokenController : [verify] Ϊ userId=739564171091247104 ǩ token -2026-09-04T14:13:47.816+08:00 WARN 27256 --- [crm-app] [http-nio-8080-exec-8] c.c.b.a.GlobalExceptionHandlerAdvice : ҵ쳣code=67001, msg=ͳһôΪ 18 λֻдĸ -2026-09-04T14:13:48.014+08:00 WARN 27256 --- [crm-app] [http-nio-8080-exec-3] c.c.b.a.GlobalExceptionHandlerAdvice : ҵ쳣code=67001, msg=ͳһôΪ 18 λֻдĸ -2026-09-04T14:13:48.275+08:00 WARN 27256 --- [crm-app] [http-nio-8080-exec-4] c.c.b.a.GlobalExceptionHandlerAdvice : ҵ쳣code=67001, msg=ͳһôΪ 18 λֻдĸ -2026-09-04T14:13:48.923+08:00 WARN 27256 --- [crm-app] [http-nio-8080-exec-5] c.c.b.a.GlobalExceptionHandlerAdvice : ҵ쳣code=67001, msg=ͳһôΪ 18 λֻдĸ -2026-09-04T14:13:49.382+08:00 WARN 27256 --- [crm-app] [http-nio-8080-exec-1] c.c.b.a.GlobalExceptionHandlerAdvice : ҵ쳣code=67001, msg=ͳһôΪ 18 λֻдĸ -2026-09-04T14:13:49.553+08:00 WARN 27256 --- [crm-app] [http-nio-8080-exec-7] c.c.b.a.GlobalExceptionHandlerAdvice : ҵ쳣code=67001, msg=ͳһôΪ 18 λֻдĸ -2026-09-04T14:13:49.706+08:00 WARN 27256 --- [crm-app] [http-nio-8080-exec-6] c.c.b.a.GlobalExceptionHandlerAdvice : ҵ쳣code=67001, msg=ͳһôΪ 18 λֻдĸ -2026-09-04T14:13:49.957+08:00 WARN 27256 --- [crm-app] [http-nio-8080-exec-2] c.c.b.a.GlobalExceptionHandlerAdvice : ҵ쳣code=67001, msg=ͳһôΪ 18 λֻдĸ -2026-09-04T14:13:50.100+08:00 WARN 27256 --- [crm-app] [http-nio-8080-exec-10] c.c.b.a.GlobalExceptionHandlerAdvice : ҵ쳣code=67001, msg=ͳһôΪ 18 λֻдĸ -2026-09-04T14:13:50.242+08:00 WARN 27256 --- [crm-app] [http-nio-8080-exec-9] c.c.b.a.GlobalExceptionHandlerAdvice : ҵ쳣code=67001, msg=ͳһôΪ 18 λֻдĸ -2026-09-04T14:13:50.376+08:00 WARN 27256 --- [crm-app] [http-nio-8080-exec-8] c.c.b.a.GlobalExceptionHandlerAdvice : ҵ쳣code=67001, msg=ͳһôΪ 18 λֻдĸ -2026-09-04T14:13:50.544+08:00 WARN 27256 --- [crm-app] [http-nio-8080-exec-3] c.c.b.a.GlobalExceptionHandlerAdvice : ҵ쳣code=67001, msg=ͳһôΪ 18 λֻдĸ -2026-09-04T14:13:50.718+08:00 WARN 27256 --- [crm-app] [http-nio-8080-exec-4] c.c.b.a.GlobalExceptionHandlerAdvice : ҵ쳣code=67001, msg=ͳһôΪ 18 λֻдĸ -2026-09-04T14:13:50.853+08:00 WARN 27256 --- [crm-app] [http-nio-8080-exec-5] c.c.b.a.GlobalExceptionHandlerAdvice : ҵ쳣code=67001, msg=ͳһôΪ 18 λֻдĸ -2026-09-04T14:13:51.035+08:00 WARN 27256 --- [crm-app] [http-nio-8080-exec-1] c.c.b.a.GlobalExceptionHandlerAdvice : ҵ쳣code=67001, msg=ͳһôΪ 18 λֻдĸ -2026-09-04T14:16:04.011+08:00 WARN 27256 --- [crm-app] [http-nio-8080-exec-6] c.c.a.controller.DebugTokenController : [verify] Ϊ userId=739564171091247104 ǩ token -2026-09-04T14:16:13.661+08:00 WARN 27256 --- [crm-app] [http-nio-8080-exec-2] c.c.b.a.GlobalExceptionHandlerAdvice : ҵ쳣code=67004, msg=۸˿ִиò -2026-09-04T14:20:07.759+08:00 WARN 27256 --- [crm-app] [http-nio-8080-exec-2] c.c.a.controller.DebugTokenController : [verify] Ϊ userId=739564171091247104 ǩ token -2026-09-04T14:23:48.778+08:00 WARN 27256 --- [crm-app] [http-nio-8080-exec-8] c.c.a.controller.DebugTokenController : [verify] Ϊ userId=739564171091247104 ǩ token -2026-09-04T14:36:24.384+08:00 WARN 27256 --- [crm-app] [http-nio-8080-exec-8] c.c.a.controller.DebugTokenController : [verify] Ϊ userId=739564171091247104 ǩ token diff --git a/logs/crm-app.log.2026-09-04.0.gz b/logs/crm-app.log.2026-09-04.0.gz new file mode 100644 index 0000000..8a00bc2 Binary files /dev/null and b/logs/crm-app.log.2026-09-04.0.gz differ