index.html 38 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933
  1. <!DOCTYPE html>
  2. <html lang="zh-CN">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  6. <title>A+在建客户动态管理系统</title>
  7. <link rel="stylesheet" href="styles.css">
  8. </head>
  9. <body>
  10. <section class="login-screen" id="loginScreen" aria-label="系统登录">
  11. <div class="login-card">
  12. <div class="login-copy">
  13. <p class="eyebrow">正式运行版</p>
  14. <h1>A+在建客户动态管理系统</h1>
  15. <p>通过后台账号密码登录,权限由服务器统一校验。账号信息由系统管理员统一发放和维护。</p>
  16. </div>
  17. <div class="login-panel">
  18. <form class="login-form" id="loginForm">
  19. <label>
  20. <span>账号</span>
  21. <input id="loginUsername" name="username" type="text" autocomplete="username" placeholder="输入后台账号" required>
  22. </label>
  23. <label>
  24. <span>密码</span>
  25. <input id="loginPassword" name="password" type="password" autocomplete="current-password" placeholder="输入密码" required>
  26. </label>
  27. <button class="primary-button" type="submit">登录系统</button>
  28. <p class="login-message" id="loginMessage" role="status"></p>
  29. </form>
  30. <form class="login-form register-form" id="registerForm">
  31. <div class="form-heading">
  32. <strong>名册注册</strong>
  33. <small>仅限花名册内姓名与手机号一致的人员注册</small>
  34. </div>
  35. <label>
  36. <span>姓名</span>
  37. <input id="registerName" name="name" type="text" autocomplete="name" placeholder="输入花名册姓名" required>
  38. </label>
  39. <label>
  40. <span>手机号</span>
  41. <input id="registerPhone" name="phone" type="tel" inputmode="numeric" autocomplete="tel" placeholder="输入花名册手机号" required>
  42. </label>
  43. <div class="register-password-grid">
  44. <label>
  45. <span>设置密码</span>
  46. <input id="registerPassword" name="password" type="password" autocomplete="new-password" placeholder="至少 6 位" minlength="6" required>
  47. </label>
  48. <label>
  49. <span>确认密码</span>
  50. <input id="registerPasswordConfirm" name="confirmPassword" type="password" autocomplete="new-password" placeholder="再次输入密码" minlength="6" required>
  51. </label>
  52. </div>
  53. <button class="ghost-button" type="submit">注册并进入系统</button>
  54. <p class="login-message" id="registerMessage" role="status"></p>
  55. </form>
  56. </div>
  57. </div>
  58. </section>
  59. <div class="app-shell" id="appShell" hidden>
  60. <aside class="sidebar" aria-label="主导航">
  61. <div class="brand">
  62. <span class="brand-mark">KI</span>
  63. <div>
  64. <strong>A+在建客户</strong>
  65. <small>动态管理系统</small>
  66. </div>
  67. </div>
  68. <nav class="nav-list">
  69. <button class="nav-item active" type="button" data-page="dashboard"><span>动态驾驶舱</span><b>01</b></button>
  70. <button class="nav-item" type="button" data-page="customers"><span>A/A+客户库</span><b>02</b></button>
  71. <button class="nav-item" type="button" data-page="inspections"><span>每日线上巡查</span><b>03</b></button>
  72. <button class="nav-item" type="button" data-page="issues"><span>问题反馈池</span><b>04</b></button>
  73. <button class="nav-item" type="button" data-page="audit"><span>监察核查</span><b>05</b></button>
  74. <button class="nav-item" type="button" data-page="analysis"><span>问题分析</span><b>06</b></button>
  75. <button class="nav-item" type="button" data-page="rules"><span>预警规则</span><b>07</b></button>
  76. <button class="nav-item" type="button" data-page="admin"><span>系统后台</span><b>08</b></button>
  77. </nav>
  78. <div class="sidebar-card">
  79. <span class="status-dot"></span>
  80. <p>今日需高层关注</p>
  81. <strong id="sideAlertCount">5 件</strong>
  82. </div>
  83. </aside>
  84. <main class="main">
  85. <header class="topbar">
  86. <div>
  87. <p class="eyebrow">监察部 / 交付中心</p>
  88. <h1 id="pageTitle">A+在建客户动态管理驾驶舱</h1>
  89. </div>
  90. <div class="top-actions">
  91. <div class="user-panel" aria-label="当前登录人">
  92. <span>当前登录</span>
  93. <strong id="currentUserName">未登录</strong>
  94. <em id="currentRoleName">-</em>
  95. <button class="small-button" type="button" id="logoutBtn">退出</button>
  96. </div>
  97. <button class="ghost-button" type="button" data-open-modal="customerModal" data-requires="customer:submit">新增客户</button>
  98. <button class="ghost-button" type="button" data-open-modal="inspectionModal" data-requires="inspection:create">每日巡查</button>
  99. <button class="primary-button" type="button" data-open-modal="issueModal" data-requires="issue:create">新增问题反馈</button>
  100. </div>
  101. </header>
  102. <section class="filter-bar" aria-label="筛选条件">
  103. <label>
  104. <span>时间范围</span>
  105. <select id="periodFilter">
  106. <option>本周</option>
  107. <option>本月</option>
  108. <option>近 30 天</option>
  109. <option>全年</option>
  110. </select>
  111. </label>
  112. <label>
  113. <span>客户等级</span>
  114. <select id="tierFilter">
  115. <option value="all">全部等级</option>
  116. <option value="A">A 客户</option>
  117. <option value="A+">A+ 客户</option>
  118. </select>
  119. </label>
  120. <label>
  121. <span>责任部门</span>
  122. <select id="departmentFilter">
  123. <option value="all">全部部门</option>
  124. <option value="光宸">光宸</option>
  125. <option value="澜光">澜光</option>
  126. <option value="蘭堂">蘭堂</option>
  127. <option value="焕境">焕境</option>
  128. </select>
  129. </label>
  130. <label class="search-field">
  131. <span>搜索</span>
  132. <input id="searchInput" type="search" placeholder="客户、地址、问题关键词">
  133. </label>
  134. </section>
  135. <section class="page-section active" data-section="dashboard">
  136. <div class="kpi-grid" aria-label="核心指标">
  137. <article class="metric-card">
  138. <span>今日已巡查</span>
  139. <strong id="kpiInspectionDone">0</strong>
  140. <em>每日线上巡查覆盖</em>
  141. </article>
  142. <article class="metric-card">
  143. <span>异常巡查</span>
  144. <strong id="kpiAbnormalInspections">0</strong>
  145. <em>需转入问题处置</em>
  146. </article>
  147. <article class="metric-card">
  148. <span>红色预警问题</span>
  149. <strong id="kpiRedIssues">0</strong>
  150. <em>需管理层介入</em>
  151. </article>
  152. <article class="metric-card">
  153. <span>待监察核查</span>
  154. <strong id="kpiAuditIssues">0</strong>
  155. <em>处置后等待复核</em>
  156. </article>
  157. </div>
  158. <div class="insight-grid">
  159. <article class="panel">
  160. <div class="panel-heading">
  161. <div>
  162. <p class="eyebrow">问题分层</p>
  163. <h2>预警级别分布</h2>
  164. </div>
  165. <button class="ghost-button" type="button" data-page-jump="rules" data-requires="page:rules">查看规则</button>
  166. </div>
  167. <div class="funnel">
  168. <div class="funnel-row tier-a" style="--w: 100%;"><span>红色预警</span><strong id="funnelRed">0 件</strong></div>
  169. <div class="funnel-row tier-b" style="--w: 78%;"><span>橙色预警</span><strong id="funnelOrange">0 件</strong></div>
  170. <div class="funnel-row tier-c" style="--w: 52%;"><span>蓝色关注</span><strong id="funnelBlue">0 件</strong></div>
  171. </div>
  172. </article>
  173. <article class="panel">
  174. <div class="panel-heading">
  175. <div>
  176. <p class="eyebrow">问题归因</p>
  177. <h2>高频问题类型</h2>
  178. </div>
  179. </div>
  180. <div class="bar-list" id="issueTypeBars" aria-label="问题类型分布"></div>
  181. </article>
  182. <article class="panel">
  183. <div class="panel-heading">
  184. <div>
  185. <p class="eyebrow">预警雷达</p>
  186. <h2>今日需关注</h2>
  187. </div>
  188. </div>
  189. <div class="risk-list">
  190. <div class="risk-item danger">
  191. <b>重复反馈未解决</b>
  192. <span>同一客户同类问题超过 2 次自动升级红色预警。</span>
  193. </div>
  194. <div class="risk-item warning">
  195. <b>满意度下滑</b>
  196. <span>满意度低于 3 分进入管理层关注池。</span>
  197. </div>
  198. <div class="risk-item info">
  199. <b>核查待确认</b>
  200. <span>处置完成后必须经监察部核查才可标记已处理。</span>
  201. </div>
  202. </div>
  203. </article>
  204. </div>
  205. <article class="panel">
  206. <div class="panel-heading">
  207. <div>
  208. <p class="eyebrow">重点问题</p>
  209. <h2>高优先级问题清单</h2>
  210. </div>
  211. <button class="primary-button" type="button" data-page-jump="issues" data-requires="page:issues">进入问题池</button>
  212. </div>
  213. <div class="table-wrap">
  214. <table>
  215. <thead>
  216. <tr>
  217. <th>客户</th>
  218. <th>等级</th>
  219. <th>部门</th>
  220. <th>问题来源</th>
  221. <th>问题类型</th>
  222. <th>预警状态</th>
  223. <th>责任人</th>
  224. <th>当前处置</th>
  225. <th>操作</th>
  226. </tr>
  227. </thead>
  228. <tbody id="dashboardRows"></tbody>
  229. </table>
  230. </div>
  231. </article>
  232. </section>
  233. <section class="page-section" data-section="customers">
  234. <div class="section-grid">
  235. <article class="panel">
  236. <div class="panel-heading">
  237. <div>
  238. <p class="eyebrow">客户库</p>
  239. <h2>A/A+ 客户动态库</h2>
  240. </div>
  241. <button class="primary-button" type="button" data-open-modal="customerModal" data-requires="customer:submit">新增客户</button>
  242. </div>
  243. <div class="table-wrap">
  244. <table>
  245. <thead>
  246. <tr>
  247. <th>客户</th>
  248. <th>等级</th>
  249. <th>新居地址</th>
  250. <th>客管负责人</th>
  251. <th>入选说明</th>
  252. <th>部门</th>
  253. <th>设计师</th>
  254. <th>项目经理</th>
  255. <th>施工阶段</th>
  256. <th>开工日期</th>
  257. <th>计划完工日期</th>
  258. <th>当前进度</th>
  259. <th>巡查与否</th>
  260. <th>巡查状态</th>
  261. <th>最近巡查</th>
  262. <th>问题数</th>
  263. <th>操作</th>
  264. </tr>
  265. </thead>
  266. <tbody id="customerRows"></tbody>
  267. </table>
  268. </div>
  269. </article>
  270. </div>
  271. </section>
  272. <section class="page-section" data-section="inspections">
  273. <article class="panel">
  274. <div class="panel-heading">
  275. <div>
  276. <p class="eyebrow">每日线上巡查</p>
  277. <h2>A/A+ 客户日查情况</h2>
  278. </div>
  279. <button class="primary-button" type="button" data-open-modal="inspectionModal" data-requires="inspection:create">提交巡查</button>
  280. </div>
  281. <div class="inspection-summary" id="inspectionSummaryCards"></div>
  282. <div class="table-wrap">
  283. <table>
  284. <thead>
  285. <tr>
  286. <th>巡查编号</th>
  287. <th>客户</th>
  288. <th>巡查与否</th>
  289. <th>巡查状态</th>
  290. <th>巡查人</th>
  291. <th>巡查时间</th>
  292. <th>施工质量</th>
  293. <th>文明施工</th>
  294. <th>客户群反馈</th>
  295. <th>巡查结论</th>
  296. </tr>
  297. </thead>
  298. <tbody id="inspectionRows"></tbody>
  299. </table>
  300. </div>
  301. </article>
  302. </section>
  303. <section class="page-section" data-section="issues">
  304. <article class="panel">
  305. <div class="panel-heading">
  306. <div>
  307. <p class="eyebrow">反馈池</p>
  308. <h2>问题反馈与预警清单</h2>
  309. </div>
  310. <div class="segmented" role="tablist" aria-label="预警状态">
  311. <button class="active" type="button" data-status="all">全部</button>
  312. <button type="button" data-status="红色预警">红色</button>
  313. <button type="button" data-status="处理中">处理中</button>
  314. <button type="button" data-status="待核查">待核查</button>
  315. </div>
  316. </div>
  317. <div class="table-wrap">
  318. <table>
  319. <thead>
  320. <tr>
  321. <th>反馈编号</th>
  322. <th>客户</th>
  323. <th>问题来源</th>
  324. <th>问题类型</th>
  325. <th>问题描述</th>
  326. <th>预警状态</th>
  327. <th>责任人</th>
  328. <th>根因</th>
  329. <th>当前处置</th>
  330. <th>处置后满意度</th>
  331. <th>操作</th>
  332. </tr>
  333. </thead>
  334. <tbody id="issueRows"></tbody>
  335. </table>
  336. </div>
  337. </article>
  338. </section>
  339. <section class="page-section" data-section="audit">
  340. <div class="section-grid two">
  341. <article class="panel">
  342. <div class="panel-heading">
  343. <div>
  344. <p class="eyebrow">监察核查</p>
  345. <h2>待核查问题</h2>
  346. </div>
  347. <span class="panel-chip" id="auditCount">0 件</span>
  348. </div>
  349. <div class="table-wrap">
  350. <table>
  351. <thead>
  352. <tr>
  353. <th>客户</th>
  354. <th>问题</th>
  355. <th>处置说明</th>
  356. <th>提交人</th>
  357. <th>操作</th>
  358. </tr>
  359. </thead>
  360. <tbody id="auditRows"></tbody>
  361. </table>
  362. </div>
  363. </article>
  364. <article class="panel">
  365. <div class="panel-heading">
  366. <div>
  367. <p class="eyebrow">闭环标准</p>
  368. <h2>核查判定</h2>
  369. </div>
  370. </div>
  371. <div class="checklist">
  372. <label><input type="checkbox" checked> 客户反馈的问题点已逐项回应</label>
  373. <label><input type="checkbox" checked> 现场整改或解释材料已上传</label>
  374. <label><input type="checkbox"> 客户满意度回升到 4 分以上</label>
  375. <label><input type="checkbox"> 同类问题 7 天内未复发</label>
  376. </div>
  377. </article>
  378. </div>
  379. </section>
  380. <section class="page-section" data-section="analysis">
  381. <div class="analysis-grid">
  382. <article class="panel">
  383. <div class="panel-heading">
  384. <div>
  385. <p class="eyebrow">趋势</p>
  386. <h2>近 7 日反馈趋势</h2>
  387. </div>
  388. </div>
  389. <div class="trend" aria-label="近 7 日反馈趋势">
  390. <span style="--h: 44%"><b>周一</b></span>
  391. <span style="--h: 62%"><b>周二</b></span>
  392. <span style="--h: 48%"><b>周三</b></span>
  393. <span style="--h: 78%"><b>周四</b></span>
  394. <span style="--h: 70%"><b>周五</b></span>
  395. <span style="--h: 36%"><b>周六</b></span>
  396. <span style="--h: 52%"><b>周日</b></span>
  397. </div>
  398. </article>
  399. <article class="panel">
  400. <div class="panel-heading">
  401. <div>
  402. <p class="eyebrow">部门</p>
  403. <h2>部门预警排行</h2>
  404. </div>
  405. </div>
  406. <div id="departmentRanks" class="rank-list"></div>
  407. </article>
  408. <article class="panel">
  409. <div class="panel-heading">
  410. <div>
  411. <p class="eyebrow">复盘</p>
  412. <h2>本周问题洞察</h2>
  413. </div>
  414. </div>
  415. <div class="insight-note">
  416. <p>施工质量、文明施工和客户群反馈是每日线上巡查的三个重点观察项。</p>
  417. <p>建议把“日查异常转问题反馈”和“处置后满意度回访”作为下周重点动作。</p>
  418. </div>
  419. </article>
  420. </div>
  421. </section>
  422. <section class="page-section" data-section="rules">
  423. <div class="section-grid two">
  424. <article class="panel">
  425. <div class="panel-heading">
  426. <div>
  427. <p class="eyebrow">规则配置</p>
  428. <h2>预警触发条件</h2>
  429. </div>
  430. <button class="primary-button" type="button" id="saveRulesBtn" data-requires="rules:edit">保存规则</button>
  431. </div>
  432. <form class="settings-form">
  433. <label>
  434. <span>红色预警条件</span>
  435. <select>
  436. <option>A/A+ 客户重复反馈 2 次以上</option>
  437. <option>满意度低于 3 分</option>
  438. <option>客户明确投诉或停工风险</option>
  439. </select>
  440. </label>
  441. <label>
  442. <span>橙色预警条件</span>
  443. <select>
  444. <option>同类问题未形成处置方案</option>
  445. <option>材料/设计变更影响节点</option>
  446. </select>
  447. </label>
  448. <label>
  449. <span>核查要求</span>
  450. <select>
  451. <option>所有红色预警必须监察部核查</option>
  452. <option>A/A+ 客户所有反馈必须核查</option>
  453. </select>
  454. </label>
  455. </form>
  456. </article>
  457. <article class="panel">
  458. <div class="panel-heading">
  459. <div>
  460. <p class="eyebrow">后台权限</p>
  461. <h2>角色操作授权</h2>
  462. </div>
  463. </div>
  464. <div class="permission-list">
  465. <div><strong>管理层</strong><span>查看全局、督办、指派责任人</span></div>
  466. <div><strong>交付助理</strong><span>提交反馈、上传现场证据</span></div>
  467. <div><strong>项目经理</strong><span>补充根因、提交处置完成</span></div>
  468. <div><strong>监察部</strong><span>通过/驳回核查、标记已处理</span></div>
  469. </div>
  470. </article>
  471. </div>
  472. </section>
  473. <section class="page-section" data-section="admin">
  474. <div class="kpi-grid admin-kpis" aria-label="后台管理指标">
  475. <article class="metric-card">
  476. <span>后台账号</span>
  477. <strong id="adminUserCount">0</strong>
  478. <em>可登录系统账号</em>
  479. </article>
  480. <article class="metric-card">
  481. <span>启用账号</span>
  482. <strong id="adminActiveUserCount">0</strong>
  483. <em>当前允许登录</em>
  484. </article>
  485. <article class="metric-card">
  486. <span>角色数量</span>
  487. <strong id="adminRoleCount">0</strong>
  488. <em>后台权限角色</em>
  489. </article>
  490. <article class="metric-card">
  491. <span>操作权限</span>
  492. <strong id="adminPermissionCount">0</strong>
  493. <em>由服务器统一校验</em>
  494. </article>
  495. <article class="metric-card">
  496. <span>待审核客户</span>
  497. <strong id="adminPendingCustomerCount">0</strong>
  498. <em>非管理员提交后进入审核池</em>
  499. </article>
  500. </div>
  501. <article class="panel">
  502. <div class="panel-heading">
  503. <div>
  504. <p class="eyebrow">客户入池审核</p>
  505. <h2>管理员审核池</h2>
  506. </div>
  507. <span class="panel-chip" id="adminCustomerReviewCount">0 单待审核</span>
  508. </div>
  509. <div class="table-wrap admin-review-wrap">
  510. <table class="admin-review-table">
  511. <thead>
  512. <tr>
  513. <th>审核单</th>
  514. <th>客户</th>
  515. <th>等级</th>
  516. <th>提交人</th>
  517. <th>客管负责人</th>
  518. <th>入选说明</th>
  519. <th>提交时间</th>
  520. <th>状态</th>
  521. <th>操作</th>
  522. </tr>
  523. </thead>
  524. <tbody id="customerReviewRows"></tbody>
  525. </table>
  526. </div>
  527. </article>
  528. <div class="section-grid two admin-grid">
  529. <article class="panel">
  530. <div class="panel-heading">
  531. <div>
  532. <p class="eyebrow">账号管理</p>
  533. <h2>登录账号与角色</h2>
  534. </div>
  535. </div>
  536. <form class="settings-form compact-form" id="adminUserForm">
  537. <label><span>登录账号</span><input name="username" type="text" placeholder="例如:service01" required></label>
  538. <label><span>登录密码</span><input name="password" type="password" placeholder="初始密码" required></label>
  539. <label><span>姓名/显示名</span><input name="displayName" type="text" placeholder="例如:服务部主管" required></label>
  540. <label><span>手机号</span><input name="phone" type="tel" inputmode="numeric" placeholder="用于名册匹配,可选"></label>
  541. <label><span>所属部门</span><input name="department" type="text" placeholder="例如:光宸筑境设计工作室"></label>
  542. <label><span>岗位</span><input name="position" type="text" placeholder="例如:设计经理"></label>
  543. <label><span>角色</span><select name="role" id="adminUserRoleSelect"></select></label>
  544. <label><span>状态</span><select name="status"><option>启用</option><option>停用</option></select></label>
  545. <div class="form-actions">
  546. <button class="primary-button" type="submit">新增账号</button>
  547. </div>
  548. </form>
  549. <div class="table-wrap admin-table-wrap">
  550. <table class="admin-table">
  551. <thead>
  552. <tr>
  553. <th>账号</th>
  554. <th>姓名</th>
  555. <th>手机号</th>
  556. <th>部门</th>
  557. <th>岗位</th>
  558. <th>角色</th>
  559. <th>状态</th>
  560. <th>重置密码</th>
  561. <th>操作</th>
  562. </tr>
  563. </thead>
  564. <tbody id="adminUserRows"></tbody>
  565. </table>
  566. </div>
  567. </article>
  568. <article class="panel">
  569. <div class="panel-heading">
  570. <div>
  571. <p class="eyebrow">后台权限</p>
  572. <h2>角色页面与操作授权</h2>
  573. </div>
  574. </div>
  575. <div class="role-card-list" id="adminRoleCards"></div>
  576. </article>
  577. </div>
  578. <article class="panel">
  579. <div class="panel-heading">
  580. <div>
  581. <p class="eyebrow">基础配置</p>
  582. <h2>字典与下拉项</h2>
  583. </div>
  584. <button class="primary-button" type="submit" form="adminDictionaryForm">保存字典</button>
  585. </div>
  586. <form class="dictionary-form" id="adminDictionaryForm">
  587. <label>
  588. <span>责任部门</span>
  589. <textarea name="departments" rows="5" placeholder="每行一个部门"></textarea>
  590. </label>
  591. <label>
  592. <span>客户来源</span>
  593. <textarea name="customerSources" rows="5" placeholder="每行一个来源"></textarea>
  594. </label>
  595. <label>
  596. <span>问题来源</span>
  597. <textarea name="issueSources" rows="5" placeholder="线下巡检&#10;客户群反馈"></textarea>
  598. </label>
  599. <label>
  600. <span>问题类型</span>
  601. <textarea name="issueTypes" rows="5" placeholder="每行一个问题类型"></textarea>
  602. </label>
  603. <label>
  604. <span>当前进度</span>
  605. <textarea name="progressStatuses" rows="5" placeholder="正常&#10;延期"></textarea>
  606. </label>
  607. </form>
  608. </article>
  609. </section>
  610. </main>
  611. </div>
  612. <div class="drawer-backdrop" id="drawerBackdrop" hidden></div>
  613. <aside class="detail-drawer" id="detailDrawer" aria-label="问题详情" aria-hidden="true">
  614. <div class="drawer-header">
  615. <div>
  616. <p class="eyebrow">问题详情</p>
  617. <h2 id="drawerName">客户姓名</h2>
  618. </div>
  619. <button class="icon-button" type="button" data-close-drawer aria-label="关闭详情">×</button>
  620. </div>
  621. <div class="drawer-body">
  622. <div class="detail-score">
  623. <span>问题影响评分</span>
  624. <strong id="drawerScore">88</strong>
  625. </div>
  626. <dl class="detail-list">
  627. <div><dt>预警状态</dt><dd id="drawerStatus"></dd></div>
  628. <div><dt>责任部门</dt><dd id="drawerDepartment"></dd></div>
  629. <div><dt>问题类型</dt><dd id="drawerType"></dd></div>
  630. <div><dt>责任人</dt><dd id="drawerOwner"></dd></div>
  631. <div><dt>处置后满意度</dt><dd id="drawerPostSatisfaction"></dd></div>
  632. <div><dt>最近处置</dt><dd id="drawerLatestHandle"></dd></div>
  633. </dl>
  634. <section class="detail-block">
  635. <h3>问题描述</h3>
  636. <p id="drawerSummary"></p>
  637. </section>
  638. <section class="detail-block">
  639. <h3>处置记录</h3>
  640. <div class="record-list" id="drawerHandlingRecords"></div>
  641. </section>
  642. <section class="timeline">
  643. <h3>问题链路与分析</h3>
  644. <ol id="drawerTimeline"></ol>
  645. </section>
  646. <div class="drawer-actions">
  647. <button class="ghost-button" type="button" data-drawer-action="assign" data-requires="issue:assign">指派责任人</button>
  648. <button class="primary-button" type="button" data-drawer-action="handle" data-requires="issue:handle">提交处置</button>
  649. <button class="success-button" type="button" data-drawer-action="approve" data-requires="audit:review">核查通过</button>
  650. <button class="danger-button" type="button" data-drawer-action="reject" data-requires="audit:review">驳回整改</button>
  651. </div>
  652. </div>
  653. </aside>
  654. <aside class="detail-drawer" id="customerDrawer" aria-label="客户详情" aria-hidden="true">
  655. <div class="drawer-header">
  656. <div>
  657. <p class="eyebrow">客户详情</p>
  658. <h2 id="customerDrawerName">客户姓名</h2>
  659. </div>
  660. <button class="icon-button" type="button" data-close-customer-drawer aria-label="关闭客户详情">×</button>
  661. </div>
  662. <div class="drawer-body">
  663. <div class="detail-score">
  664. <span>巡查与否</span>
  665. <strong id="customerDrawerInspectionFlag">未巡查</strong>
  666. </div>
  667. <dl class="detail-list">
  668. <div><dt>客户等级</dt><dd id="customerDrawerTier"></dd></div>
  669. <div><dt>客户来源</dt><dd id="customerDrawerSource"></dd></div>
  670. <div><dt>客管负责人</dt><dd id="customerDrawerCustomerOwner"></dd></div>
  671. <div><dt>责任部门</dt><dd id="customerDrawerDepartment"></dd></div>
  672. <div><dt>设计师</dt><dd id="customerDrawerDesigner"></dd></div>
  673. <div><dt>项目经理</dt><dd id="customerDrawerManager"></dd></div>
  674. <div><dt>施工阶段</dt><dd id="customerDrawerStage"></dd></div>
  675. <div><dt>开工日期</dt><dd id="customerDrawerStartDate"></dd></div>
  676. <div><dt>计划完工日期</dt><dd id="customerDrawerPlannedFinishDate"></dd></div>
  677. <div><dt>当前进度</dt><dd id="customerDrawerProgressStatus"></dd></div>
  678. <div><dt>满意度</dt><dd id="customerDrawerSatisfaction"></dd></div>
  679. <div><dt>巡查状态</dt><dd id="customerDrawerInspectionStatus"></dd></div>
  680. <div><dt>巡查人</dt><dd id="customerDrawerInspector"></dd></div>
  681. <div><dt>最近巡查</dt><dd id="customerDrawerInspectionAt"></dd></div>
  682. </dl>
  683. <section class="detail-block">
  684. <h3>新居地址</h3>
  685. <p id="customerDrawerAddress"></p>
  686. </section>
  687. <section class="detail-block">
  688. <h3>重点客户入选说明</h3>
  689. <p id="customerDrawerKeyReason"></p>
  690. </section>
  691. <section class="detail-block">
  692. <h3>巡查结论</h3>
  693. <p id="customerDrawerInspectionSummary"></p>
  694. </section>
  695. <section class="detail-block">
  696. <h3>关联问题</h3>
  697. <div class="record-list" id="customerDrawerIssues"></div>
  698. </section>
  699. <div class="drawer-actions">
  700. <button class="ghost-button" type="button" data-customer-drawer-action="inspection" data-requires="inspection:create">提交日查</button>
  701. <button class="primary-button" type="button" data-customer-drawer-action="feedback" data-requires="issue:create">提交反馈</button>
  702. </div>
  703. </div>
  704. </aside>
  705. <div class="modal-backdrop" id="modalBackdrop" hidden></div>
  706. <section class="modal" id="inspectionModal" aria-label="每日线上巡查" aria-hidden="true">
  707. <div class="modal-header">
  708. <div>
  709. <p class="eyebrow">内部巡查入口</p>
  710. <h2>提交每日线上巡查</h2>
  711. </div>
  712. <button class="icon-button" type="button" data-close-modal aria-label="关闭">×</button>
  713. </div>
  714. <form id="inspectionForm" class="modal-form">
  715. <label>
  716. <span>巡查客户</span>
  717. <select name="customerId" id="inspectionCustomerSelect"></select>
  718. </label>
  719. <label>
  720. <span>巡查状态</span>
  721. <select name="status">
  722. <option>已巡查</option>
  723. <option>异常</option>
  724. <option>未巡查</option>
  725. </select>
  726. </label>
  727. <label>
  728. <span>巡查人</span>
  729. <input name="inspector" type="text" placeholder="默认使用当前登录人">
  730. </label>
  731. <label>
  732. <span>施工质量</span>
  733. <select name="siteQuality">
  734. <option>正常</option>
  735. <option>存在施工质量疑问</option>
  736. <option>需现场复核</option>
  737. </select>
  738. </label>
  739. <label>
  740. <span>文明施工</span>
  741. <select name="civility">
  742. <option>现场整洁</option>
  743. <option>现场杂乱</option>
  744. <option>材料堆放需整改</option>
  745. <option>抽烟/卫生问题</option>
  746. </select>
  747. </label>
  748. <label>
  749. <span>客户群反馈</span>
  750. <select name="groupFeedback">
  751. <option>暂无新增反馈</option>
  752. <option>客户群有疑问待回复</option>
  753. <option>客户明确表达不满</option>
  754. <option>需设计师/项目经理介入</option>
  755. </select>
  756. </label>
  757. <label class="full">
  758. <span>巡查结论</span>
  759. <textarea name="summary" rows="3" placeholder="记录线上巡查看到的客户群情况、现场照片反馈、需要转办的问题"></textarea>
  760. </label>
  761. <div class="form-actions full">
  762. <button class="ghost-button" type="button" data-close-modal>取消</button>
  763. <button class="primary-button" type="submit">保存日查情况</button>
  764. </div>
  765. </form>
  766. </section>
  767. <section class="modal" id="issueModal" aria-label="新增问题反馈" aria-hidden="true">
  768. <div class="modal-header">
  769. <div>
  770. <p class="eyebrow">表单提交界面</p>
  771. <h2>新增问题反馈</h2>
  772. </div>
  773. <button class="icon-button" type="button" data-close-modal aria-label="关闭">×</button>
  774. </div>
  775. <form id="issueForm" class="modal-form">
  776. <label>
  777. <span>客户搜索</span>
  778. <input id="issueCustomerSearch" type="search" placeholder="输入客户姓名或地址">
  779. </label>
  780. <label>
  781. <span>关联客户</span>
  782. <select name="customerId" id="issueCustomerSelect"></select>
  783. </label>
  784. <label>
  785. <span>问题来源</span>
  786. <select name="source">
  787. <option>线下巡检</option>
  788. <option>客户群反馈</option>
  789. <option>每日线上巡查</option>
  790. <option>客户主动反馈</option>
  791. <option>管理层转办</option>
  792. <option>监察部发现</option>
  793. </select>
  794. </label>
  795. <label>
  796. <span>问题类型</span>
  797. <select name="type">
  798. <option>施工质量</option>
  799. <option>设计变更</option>
  800. <option>沟通响应</option>
  801. <option>材料交付</option>
  802. <option>客户满意度</option>
  803. </select>
  804. </label>
  805. <label>
  806. <span>预警级别</span>
  807. <select name="status">
  808. <option>红色预警</option>
  809. <option>橙色预警</option>
  810. <option>蓝色关注</option>
  811. </select>
  812. </label>
  813. <label>
  814. <span>责任人</span>
  815. <input name="owner" type="text" placeholder="输入责任人姓名" required>
  816. </label>
  817. <label>
  818. <span>预计核查时间</span>
  819. <input name="auditDue" type="date" required>
  820. </label>
  821. <label class="full">
  822. <span>问题描述 / 客户反馈原文</span>
  823. <textarea name="summary" rows="3" placeholder="记录客户原话、现场情况、影响程度" required></textarea>
  824. </label>
  825. <label class="full">
  826. <span>初步根因分析</span>
  827. <textarea name="rootCause" rows="3" placeholder="例如:设计交底不清、材料延期、现场沟通断点"></textarea>
  828. </label>
  829. <div class="form-actions full">
  830. <button class="ghost-button" type="button" data-close-modal>取消</button>
  831. <button class="primary-button" type="submit">提交并进入预警池</button>
  832. </div>
  833. </form>
  834. </section>
  835. <section class="modal" id="handleModal" aria-label="提交处置记录" aria-hidden="true">
  836. <div class="modal-header">
  837. <div>
  838. <p class="eyebrow">处置流水</p>
  839. <h2>提交处置记录</h2>
  840. </div>
  841. <button class="icon-button" type="button" data-close-modal aria-label="关闭">×</button>
  842. </div>
  843. <form id="handleForm" class="modal-form">
  844. <label class="full">
  845. <span>处置说明</span>
  846. <textarea name="handlerNote" rows="3" placeholder="记录处理方案、已完成动作、下一步安排" required></textarea>
  847. </label>
  848. <label>
  849. <span>处置后满意度</span>
  850. <select name="satisfaction">
  851. <option>满意</option>
  852. <option>一般</option>
  853. <option>不满意</option>
  854. <option>待回访</option>
  855. </select>
  856. </label>
  857. <label>
  858. <span>客户回访结果</span>
  859. <input name="customerFeedback" type="text" placeholder="例如:客户认可整改,要求持续观察">
  860. </label>
  861. <div class="form-actions full">
  862. <button class="ghost-button" type="button" data-close-modal>取消</button>
  863. <button class="primary-button" type="submit">提交并转监察核查</button>
  864. </div>
  865. </form>
  866. </section>
  867. <section class="modal" id="customerModal" aria-label="新增客户" aria-hidden="true">
  868. <div class="modal-header">
  869. <div>
  870. <p class="eyebrow">客户录入</p>
  871. <h2>新增重要客户</h2>
  872. </div>
  873. <button class="icon-button" type="button" data-close-modal aria-label="关闭">×</button>
  874. </div>
  875. <form id="customerForm" class="modal-form">
  876. <label><span>客户姓名</span><input name="name" type="text" placeholder="例如:李女士" required></label>
  877. <label><span>客户等级</span><select name="tier"><option>A</option><option>A+</option></select></label>
  878. <label><span>客户来源</span><select name="source"><option>转介绍</option><option>公司特殊关系</option><option>标杆项目</option><option>风险关注</option></select></label>
  879. <label><span>责任部门</span><select name="department"><option>光宸</option><option>澜光</option><option>蘭堂</option><option>焕境</option></select></label>
  880. <label><span>客管人员负责人</span><input name="customerOwner" type="text" placeholder="例如:客管负责人姓名" required></label>
  881. <label><span>设计师</span><input name="designer" type="text" required></label>
  882. <label><span>项目经理</span><input name="manager" type="text" required></label>
  883. <label class="full"><span>新居地址</span><input name="address" type="text" placeholder="楼盘/楼栋/房号" required></label>
  884. <label><span>施工阶段</span><input name="stage" type="text" placeholder="例如:木作安装"></label>
  885. <label><span>开工日期</span><input name="startDate" type="date"></label>
  886. <label><span>计划完工日期</span><input name="plannedFinishDate" type="date"></label>
  887. <label><span>当前进度</span><select name="progressStatus"><option>正常</option><option>延期</option></select></label>
  888. <label><span>满意度</span><select name="satisfaction"><option>5</option><option>4</option><option>3</option><option>2</option><option>1</option></select></label>
  889. <label class="full"><span>重点客户入选说明</span><textarea name="keyCustomerReason" rows="3" placeholder="说明推荐关系、标杆价值、特殊关注原因或问题风险" required></textarea></label>
  890. <div class="form-actions full">
  891. <button class="ghost-button" type="button" data-close-modal>取消</button>
  892. <button class="primary-button" type="submit">提交客户入池</button>
  893. </div>
  894. </form>
  895. </section>
  896. <div class="toast" id="toast" role="status" aria-live="polite"></div>
  897. <script src="app.js"></script>
  898. </body>
  899. </html>