feat: full-field display for group/call/sms (raw_json + drawers)

Mirrors the Customer/Message/Staff/Accounts pattern: backend exposes the
verbatim upstream record on the response schema; the frontend list shows
source-matching columns and a row-click opens an all-fields el-drawer with
Chinese-labeled camelCase keys (unknown keys roll up under 其他).

Backend (yunke-server/app/api/schemas.py)
- GroupOut / PhoneCallOut / SmsOut: add raw_json: dict[str, Any] | None
  (Pydantic v2 from_attributes picks up the existing ORM column).
- Tests: extend tests/test_api_{groups,calls,sms}.py with a per-schema
  raw_json round-trip assertion (phone_call + voice_call payload shapes
  both covered for calls).

Frontend (yunkes)
- src/utils/{groupFields,callFields,smsFields}.ts: 中文 label map +
  grouped sections + readField (structured-column preference) +
  toDisplayField (image / time / audio / bool / status / direction).
- src/api/types.ts: add raw_json to Group / PhoneCall / Sms.
- src/views/GroupList.vue: richer columns (群名/群ID/成员数/群主/归属微信/
  消息数/最近聊天/渠道) + all-fields drawer (chatRoomId/chatRoomName,
  memberCount/memberIds, headImageUrl, wechatId/wechatNickName,
  userName/userPhone/userId, messageCount/ownMessageCount,
  lossMembers/addMembers, lastChatTime/updateTime).
- src/views/CallList.vue: keeps existing columns + adds all-fields drawer
  (id/startCallTime, callDuration/callSeconds/ringTime, callStatus/
  incomingCall, userId/userIdName/departmentId, callNumber/simPhone/
  simNumber/imei, recordFile/isUpload/downloadCount/aiAsr/qcStatus/
  planCustomerName/version + voice-call extras ossFileName/duration/
  startTime/endTime/remark). Drawer plays recording inline via audio
  render kind; existing play-record dialog retained.
- src/views/SmsList.vue: keeps existing columns + adds all-fields drawer
  (id/customerPhone, sms/smsSub, sender, direction, userId/
  senderDepartment, receiveName, createTime, simPhone/simNumber, source)
  with a full-body preview block at the top.

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
浅念
2026-08-05 10:12:49 +08:00
parent fd86adfb63
commit 0d466c4e4a
11 changed files with 1442 additions and 92 deletions
+23
View File
@@ -92,6 +92,14 @@ export interface Group {
message_count?: number | null
/** ms-epoch of most recent message */
last_chat_time?: number | null
/**
* Verbatim upstream chatroom record (camelCase keys: chatRoomId/chatRoomName,
* memberCount/memberIds, headImageUrl, wechatId/wechatNickName, userName/
* userPhone, userId, messageCount/ownMessageCount, lossMembers/addMembers,
* lastChatTime/updateTime, ...). Surfaced so the all-fields drawer can
* render every column the 云客 群管理 page shows.
*/
raw_json?: Record<string, unknown> | null
}
/** Member of a chat group (mirrors backend GroupMemberOut). */
@@ -126,6 +134,14 @@ export interface PhoneCall {
sim_phone?: string | null
/** OSS URL of the recording — present only when a recording exists. */
record_file?: string | null
/**
* Verbatim upstream call record (camelCase keys: id/startCallTime,
* callDuration/callSeconds/ringTime, callStatus/incomingCall, userId/
* userIdName/departmentId, callNumber, simPhone/simNumber/imei, recordFile,
* isUpload/downloadCount/aiAsr/qcStatus/planCustomerName/version; voice-call
* records also carry ossFileName/duration/startTime/endTime/remark).
*/
raw_json?: Record<string, unknown> | null
}
/** SMS log row (mirrors backend SmsOut). */
@@ -143,6 +159,13 @@ export interface Sms {
/** ms-epoch */
create_time?: number | null
sim_phone?: string | null
/**
* Verbatim upstream SMS record (camelCase keys: id/customerPhone, sms/smsSub,
* sender, direction, userId, senderDepartment, receiveName, createTime,
* simPhone/simNumber, source, ...). Surfaced so the all-fields drawer can
* render every column the 云客 短信记录 page shows.
*/
raw_json?: Record<string, unknown> | null
}
/** Resumable sync cursor (mirrors backend SyncStateOut). */