Sin descripción

index.html 21KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610
  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, maximum-scale=1.0, user-scalable=no">
  6. <title>统计报表</title>
  7. <link href="../css/mui.css" rel="stylesheet" />
  8. <script src="../js/tailwindcss3.4.16.js"></script>
  9. <link href="../css/mui.picker.css" rel="stylesheet" />
  10. <link href="../css/mui.poppicker.css" rel="stylesheet" />
  11. <link rel="stylesheet" type="text/css" href="../css/mui.picker.min.css" />
  12. <script>
  13. tailwind.config = {
  14. theme: {
  15. extend: {
  16. colors: {
  17. primary: '#4F46E5',
  18. secondary: '#10B981'
  19. },
  20. borderRadius: {
  21. 'none': '0px',
  22. 'sm': '2px',
  23. DEFAULT: '4px',
  24. 'md': '8px',
  25. 'lg': '12px',
  26. 'xl': '16px',
  27. '2xl': '20px',
  28. '3xl': '24px',
  29. 'full': '9999px',
  30. 'button': '4px'
  31. }
  32. }
  33. }
  34. }
  35. </script>
  36. <link rel="stylesheet" href="../css/all.min.css">
  37. <script src="../js/echarts.min.js"></script>
  38. <style>
  39. * {
  40. margin: 0;
  41. padding: 0;
  42. box-sizing: border-box;
  43. font-family: 'Segoe UI', 'PingFang SC', 'Microsoft YaHei', sans-serif;
  44. }
  45. body {
  46. background: linear-gradient(135deg, #f5f7fa 0%, #e4edf5 100%);
  47. color: #333;
  48. line-height: 1.6;
  49. min-height: 100vh;
  50. }
  51. .container {
  52. max-width: 100%;
  53. padding: 0 10px;
  54. }
  55. /* 顶部导航 */
  56. .header {
  57. /* background: linear-gradient(to right, #1a73e8, #0d5bb0); */
  58. background-color: #5470C6;
  59. color: white;
  60. padding: 15px 0;
  61. text-align: center;
  62. position: sticky;
  63. top: 0;
  64. z-index: 100;
  65. box-shadow: 0 2px 10px rgba(0, 0, 0, 0.1);
  66. }
  67. .header h1 {
  68. font-size: 1.4rem;
  69. font-weight: 600;
  70. margin-bottom: 15px;
  71. letter-spacing: 0.5px;
  72. }
  73. /* Tab切换 */
  74. .tabs-container {
  75. position: relative;
  76. overflow-x: auto;
  77. -webkit-overflow-scrolling: touch;
  78. white-space: nowrap;
  79. padding: 0 10px;
  80. margin-top: 10px;
  81. scrollbar-width: none;
  82. }
  83. .tabs-container::-webkit-scrollbar {
  84. display: none;
  85. }
  86. .tabs {
  87. display: inline-flex;
  88. gap: 8px;
  89. }
  90. .tab {
  91. background: rgba(255, 255, 255, 0.2);
  92. padding: 8px 16px;
  93. border-radius: 20px;
  94. font-size: 0.9rem;
  95. font-weight: 500;
  96. transition: all 0.3s ease;
  97. }
  98. .tab.active {
  99. background: white;
  100. color: #5470C6;
  101. font-weight: 600;
  102. }
  103. /* 控制区域 */
  104. .controls {
  105. display: flex;
  106. padding: 15px 10px;
  107. gap: 10px;
  108. background: white;
  109. border-bottom: 1px solid #eee;
  110. position: sticky;
  111. top: 78px;
  112. z-index: 90;
  113. }
  114. .date-picker, .search-box {
  115. flex: 1;
  116. padding: 0px 15px;
  117. border-radius: 8px;
  118. border: 1px solid #ddd;
  119. font-size: 0.9rem;
  120. background: #f9f9f9;
  121. }
  122. .search-box {
  123. display: flex;
  124. align-items: center;
  125. gap: 8px;
  126. }
  127. .search-box input {
  128. flex: 1;
  129. border: none;
  130. outline: none;
  131. background: transparent;
  132. font-size: 0.9rem;
  133. }
  134. /* 数据卡片 */
  135. .summary-cards {
  136. display: grid;
  137. grid-template-columns: repeat(2, 1fr);
  138. gap: 12px;
  139. padding: 15px 10px;
  140. }
  141. .card {
  142. background: white;
  143. border-radius: 12px;
  144. padding: 16px;
  145. box-shadow: 0 4px 12px rgba(0, 0, 0, 0.05);
  146. text-align: center;
  147. }
  148. .card-title {
  149. font-size: 0.9rem;
  150. color: #666;
  151. margin-bottom: 8px;
  152. }
  153. .card-value {
  154. font-size: 1.5rem;
  155. font-weight: 700;
  156. color: #1a73e8;
  157. }
  158. .card-change {
  159. font-size: 0.8rem;
  160. margin-top: 4px;
  161. color: #4caf50;
  162. }
  163. .card-change.negative {
  164. color: #f44336;
  165. }
  166. /* 报表区域 */
  167. .report-container {
  168. margin-top: 10px;
  169. background: white;
  170. border-radius: 12px;
  171. box-shadow: 0 4px 12px rgba(0, 0, 0, 0.05);
  172. overflow: hidden;
  173. }
  174. .report-header {
  175. padding: 15px;
  176. display: flex;
  177. justify-content: space-between;
  178. align-items: center;
  179. border-bottom: 1px solid #eee;
  180. position: sticky;
  181. top: 180px;
  182. background: white;
  183. z-index: 80;
  184. }
  185. .report-header h2 {
  186. font-size: 1.1rem;
  187. color: #1a73e8;
  188. }
  189. .export-btn {
  190. background: #e8f0fe;
  191. color: #1a73e8;
  192. border: none;
  193. padding: 8px 15px;
  194. border-radius: 6px;
  195. font-size: 0.9rem;
  196. font-weight: 500;
  197. display: flex;
  198. align-items: center;
  199. gap: 5px;
  200. }
  201. /* 表格样式 */
  202. .table-container {
  203. overflow-x: auto;
  204. -webkit-overflow-scrolling: touch;
  205. }
  206. table {
  207. width: 100%;
  208. border-collapse: collapse;
  209. /* min-width: 700px; */
  210. }
  211. thead {
  212. background-color: #f8f9fa;
  213. /* position: sticky;
  214. top: 230px;
  215. z-index: 70; */
  216. }
  217. th {
  218. padding: 14px 6px;
  219. text-align: center;
  220. font-weight: 600;
  221. color: #444;
  222. font-size: 0.8rem;
  223. border-bottom: 2px solid #eee;
  224. }
  225. td {
  226. padding: 6px;
  227. text-align: center;
  228. border-bottom: 1px solid #eee;
  229. font-size: 0.8rem;
  230. }
  231. tr:last-child td {
  232. border-bottom: none;
  233. }
  234. tr:nth-child(even) {
  235. background-color: #fcfcfc;
  236. }
  237. .completion-rate {
  238. color: #4caf50;
  239. font-weight: 600;
  240. }
  241. /* 响应式调整 */
  242. @media (min-width: 768px) {
  243. .container {
  244. max-width: 768px;
  245. margin: 0 auto;
  246. }
  247. .summary-cards {
  248. grid-template-columns: repeat(4, 1fr);
  249. }
  250. .card {
  251. padding: 20px;
  252. }
  253. }
  254. .chart-container {
  255. width: 100%;
  256. height: 200px;
  257. }
  258. .rate-chart {
  259. height: 120px;
  260. }
  261. .tab_div{
  262. display: none;
  263. }
  264. .submit{
  265. background-color: #5470C6;
  266. border-radius: 5px;
  267. color: #ffffff;
  268. display: inline-block;
  269. padding: 8px;
  270. }
  271. .type_con{
  272. width: 40% !important;
  273. text-align: center !important;
  274. margin: 0 !important;
  275. padding: 0 !important;
  276. }
  277. </style>
  278. </head>
  279. <body>
  280. <div class="container">
  281. <!-- 顶部标题和Tab -->
  282. <header class="header">
  283. <!-- <h1>统计报表</h1> -->
  284. <div class="tabs-container">
  285. <div class="tabs">
  286. <div class="tab active">投诉报表</div>
  287. <div class="tab">区域分析</div>
  288. </div>
  289. </div>
  290. </header>
  291. <div class="tab_div" style="display: block;">
  292. <div class="container mx-auto px-4 py-4">
  293. <div class="bg-white rounded-lg shadow-sm p-6 mb-6">
  294. <div class="flex justify-between items-center mb-4">
  295. <h2 class="text-xl font-medium">总投诉数 <span id="total">0</span> / <span name="selectType">周</span></h2>
  296. <button class="text-gray-600 hover:text-gray-900" id="changeBut">
  297. <span name="selectType">周</span> <i class="fas fa-exchange ml-1"></i>
  298. </button>
  299. </div>
  300. <div class="flex flex-col gap-4">
  301. <div class="relative w-full h-6 bg-gray-100 rounded-full overflow-hidden">
  302. <div class="absolute left-0 top-0 h-full bg-primary" style="width: 50%;" id="total_rate"></div>
  303. <!--<div class="absolute left-[50%] top-0 h-full bg-gray-300" style="width: 50%;"></div>-->
  304. </div>
  305. <div class="flex items-center justify-between">
  306. <div>
  307. <div class="text-gray-600">三大类投诉数 <span id="thisnumber">0</span></div>
  308. <div class="text-green-500 text-sm mt-1" id="thiscontrast_div">
  309. <i class="fas fa-arrow-up mr-1" id="thiscontrast_i"></i> 较上周 <span id="thiscontrast">0</span>
  310. </div>
  311. </div>
  312. <div>
  313. <div class="text-gray-600">其他投诉数 <span id="otherthisnumber">0</span></div>
  314. <div class="text-red-500 text-sm mt-1" id="othercontrast_div">
  315. <i class="fas fa-arrow-down mr-1" id="othercontrast_i"></i> 较上周 <span id="othercontrast">0</span>
  316. </div>
  317. </div>
  318. </div>
  319. </div>
  320. </div>
  321. <div class="bg-white rounded-lg shadow-sm p-6 mb-6">
  322. <h2 class="text-xl font-medium mb-6">三大类投诉情况</h2>
  323. <div class="flex flex-col lg:flex-row gap-6">
  324. <div id="complaintPie" class="chart-container lg:w-1/2"></div>
  325. <div class="flex flex-col gap-4 lg:w-1/2">
  326. <div class="space-y-2 bg-blue-50 p-4 rounded-lg cursor-pointer hover:bg-blue-100 transition-colors" onclick="highlightPieSection(0, '破袋发霉')">
  327. <div class="flex items-center justify-between">
  328. <div class="flex items-center gap-2">
  329. <div class="w-3 h-3 bg-[#5470c6]"></div>
  330. <span class="text-gray-600">破袋发霉</span>
  331. </div>
  332. <span class="font-medium" id="mustiness">0</span>
  333. </div>
  334. <div class="flex justify-between text-sm">
  335. <span class="text-gray-500">占比 <span id="mustinessRate">0%</span></span>
  336. <span class="text-green-500" id="mustinesscontrast_span"><i class="fas fa-arrow-up mr-1" id="mustinesscontrast_i"></i>较上周 <span id="mustinesscontrast">0</span></span>
  337. </div>
  338. </div>
  339. <div class="space-y-2 bg-blue-50 p-4 rounded-lg cursor-pointer hover:bg-blue-100 transition-colors" onclick="highlightPieSection(1, '杂质异物')">
  340. <div class="flex items-center justify-between">
  341. <div class="flex items-center gap-2">
  342. <div class="w-3 h-3 bg-[#91cc75]"></div>
  343. <span class="text-gray-600">杂质异物</span>
  344. </div>
  345. <span class="font-medium" id="impurity">0</span>
  346. </div>
  347. <div class="flex justify-between text-sm">
  348. <span class="text-gray-500">占比 <span id="impurityRate">0</span></span>
  349. <span class="text-red-500" id="impuritycontrast_span"><i class="fas fa-arrow-down mr-1" id="impuritycontrast_i"></i>较上周 <span id="impuritycontrast">0</span></span>
  350. </div>
  351. </div>
  352. <div class="space-y-2 bg-blue-50 p-4 rounded-lg cursor-pointer hover:bg-blue-100 transition-colors" onclick="highlightPieSection(2, '变质异味')">
  353. <div class="flex items-center justify-between">
  354. <div class="flex items-center gap-2">
  355. <div class="w-3 h-3 bg-[#fac858]"></div>
  356. <span class="text-gray-600">变质异味</span>
  357. </div>
  358. <span class="font-medium" id="gobad">0</span>
  359. </div>
  360. <div class="flex justify-between text-sm">
  361. <span class="text-gray-500">占比 <span id="gobadRate">0</span></span>
  362. <span class="text-green-500" id="gobadcontrast_span"><i class="fas fa-arrow-up mr-1" id="gobadcontrast_i"></i>较上周 <span id="gobadcontrast">0</span></span>
  363. </div>
  364. </div>
  365. </div>
  366. </div>
  367. </div>
  368. <div class="grid grid-cols-2 gap-4 mb-6">
  369. <div class="bg-white rounded-lg shadow-sm p-6">
  370. <h3 class="text-lg font-medium mb-4">接单率</h3>
  371. <div id="acceptanceRate" class="chart-container rate-chart"></div>
  372. </div>
  373. <div class="bg-white rounded-lg shadow-sm p-6">
  374. <h3 class="text-lg font-medium mb-4">完结率</h3>
  375. <div id="completionRate" class="chart-container rate-chart"></div>
  376. </div>
  377. </div>
  378. <div class="bg-white rounded-lg shadow-sm p-6">
  379. <h2 class="text-xl font-medium mb-6">三大类投诉趋势</h2>
  380. <div id="trendLine" class="chart-container"></div>
  381. </div>
  382. </div>
  383. </div>
  384. <div class="tab_div" style="display: none;">
  385. <!-- 控制区域 -->
  386. <div class="controls">
  387. <div class="search-box">
  388. <i class="fas fa-search"></i>
  389. <input type="text" id='start_data' data-options='{"type":"date","beginYear":2010,"endYear":2023}' class="ui-alert type_con btn" data-index="" readonly="readonly" placeholder="开始日期" />
  390. <input type="text" id='end_data' data-options='{"type":"date","beginYear":2010,"endYear":2023}' class="ui-alert type_con btn1" data-index="" readonly="readonly" placeholder="结束日期" />
  391. </div>
  392. <button type="button" class="submit">查询</button>
  393. <!-- <div></div> -->
  394. <!-- <ul class="mui-table-view">
  395. <li class="mui-table-view-cell btn" data-options='{"type":"date","beginYear":2010,"endYear":2023}'>
  396. <div class="mui-input-row">
  397. <label class="label">开始日期:</label>
  398. <a href=""><span class="type_down mui-icon mui-icon-arrowdown mui-pull-right"></span></a>
  399. </div>
  400. </li>
  401. <li class="mui-table-view-cell btn1" data-options='{"type":"date","beginYear":2010,"endYear":2023}'>
  402. <div class="mui-input-row">
  403. <label class="label">结束日期:</label>
  404. <input type="text" id='end_data' class="ui-alert type_con size-14" data-index="" readonly="readonly" />
  405. <a href=""><span class="type_down mui-icon mui-icon-arrowdown mui-pull-right"></span></a>
  406. </div>
  407. </li>
  408. </ul> -->
  409. </div>
  410. <!-- 数据概览卡片 -->
  411. <!-- <div class="summary-cards"></div> -->
  412. <!-- 报表区域 -->
  413. <div class="report-container">
  414. <!-- <div class="report-header">
  415. <h2>大区工单统计明细</h2>
  416. <button class="export-btn">
  417. <i class="fas fa-download"></i> 导出
  418. </button>
  419. </div> -->
  420. <div class="table-container">
  421. <table id="workOrderTable">
  422. <thead>
  423. <tr>
  424. <th>序号</th>
  425. <th>大区</th>
  426. <th>工单总数</th>
  427. <th>处理中</th>
  428. <th>已完结</th>
  429. <th>完结率</th>
  430. </tr>
  431. </thead>
  432. <tbody></tbody>
  433. </table>
  434. </div>
  435. </div>
  436. </div>
  437. </div>
  438. <script src="../js/mui.min.js?"></script>
  439. <script src="../js/mui.poppicker.js"></script>
  440. <script src="../js/mui.picker.min.js"></script>
  441. <script src="../js/zepto.js"></script>
  442. <script src="../js/jquery.min.js"></script>
  443. <script src="../js/mui.poppicker.js"></script>
  444. <script src="../js/mui.picker.min.js"></script>
  445. <script src="../js/huayi.config.js"></script>
  446. <script src="js/index.js"></script>
  447. <script>
  448. // Tab切换功能
  449. const tabs = document.querySelectorAll('.tab');
  450. var token = localStorage.getItem("token");
  451. tabs.forEach((tab,index) => {
  452. tab.addEventListener('click', () => {
  453. tabs.forEach(t => t.classList.remove('active'));
  454. tab.classList.add('active');
  455. $('.tab_div').hide();
  456. $('.tab_div').eq(index).fadeIn();
  457. });
  458. });
  459. $(document).ready(function(){
  460. // 获取当前日期
  461. const today = new Date();
  462. // 获取本月1号
  463. const firstDayOfMonth = new Date(today.getFullYear(), today.getMonth(), 1);
  464. $("#start_data").val(formatDate(firstDayOfMonth))
  465. $("#end_data").val(formatDate(today))
  466. getAPPAfterprogress()
  467. })
  468. $(".submit").click(function(){
  469. getAPPAfterprogress()
  470. })
  471. // 格式化日期为 "年-月-日" 格式
  472. function formatDate(date) {
  473. const year = date.getFullYear();
  474. // 月份从0开始,需要加1
  475. const month = String(date.getMonth() + 1).padStart(2, '0');
  476. const day = String(date.getDate()).padStart(2, '0');
  477. return `${year}-${month}-${day}`;
  478. }
  479. function getAPPAfterprogress() {
  480. $.ajax({
  481. url:huayi.config.callcenter_url + 'Business/APPAfterprogress',
  482. data: {
  483. token: token,
  484. stime:$("#start_data").val(),
  485. endtime:$("#end_data").val()
  486. },
  487. dataType: 'json', //服务器返回json格式数据
  488. crossDomain: true,
  489. type: 'get', //HTTP请求类型
  490. timeout: 10000, //超时时间设置为10秒;
  491. headers: {
  492. 'Content-Type': 'application/x-www-form-urlencoded; charset=utf-8'
  493. },
  494. success: function(data) {
  495. if(data.state === "success"){
  496. var resultData = JSON.parse(data.data).aftersalelist
  497. // 获取表格tbody元素
  498. const tableBody = $('#workOrderTable tbody');
  499. tableBody.html('')
  500. $('.summary-cards').html('')
  501. // 遍历数据数组,动态生成表格行
  502. // $.each(resultData, function(index, item) {});
  503. for(var i = 0; i <resultData.length; i++) {
  504. // 创建表格行
  505. const row = $('<tr>');
  506. // 添加表格单元格
  507. row.append(`<td>${resultData[i].serialnumbe}</td>`); // 序号(索引+1)
  508. row.append(`<td>${resultData[i].area}</td>`);
  509. row.append(`<td>${resultData[i].total}</td>`);
  510. row.append(`<td>${resultData[i].processingnumber}</td>`);
  511. row.append(`<td>${resultData[i].processednumber}</td>`);
  512. row.append(`<td class="completion-rate">${resultData[i].processedrate}</td>`);
  513. // if(resultData[i].serialnumbe === '合计'){
  514. // $('<div class="card"><div class="card-title">工单总数</div><div class="card-value">'+resultData[i].total+'</div></div>'+
  515. // '<div class="card"><div class="card-title">处理中</div><div class="card-value">'+resultData[i].processingnumber+'</div></div>'+
  516. // '<div class="card"><div class="card-title">已完结</div><div class="card-value">'+resultData[i].processednumber+'</div></div>'+
  517. // '<div class="card"><div class="card-title">平均完结率</div><div class="card-value">'+resultData[i].processedrate+'</div></div>').appendTo('.summary-cards');
  518. // }
  519. // 将行添加到tbody
  520. tableBody.append(row);
  521. }
  522. // for(var i = 0; i<resultData.length; i++) {
  523. // $('<tr>' +
  524. // '<td>'+resultData[i].serialnumbe+'</td>' +
  525. // '<td>'+resultData[i].serialnumbe+'</td>' +
  526. // '<td>'+resultData[i].serialnumbe+'</td>' +
  527. // '<td>'+resultData[i].serialnumbe+'</td>' +
  528. // '<td>'+resultData[i].serialnumbe+'</td>' +
  529. // '<td>'+resultData[i].serialnumbe+'</td>' +
  530. // '</tr>').appendTo('#workOrderTable tbody');
  531. // }
  532. }
  533. },
  534. error: function(xhr, type, errorThrown) {
  535. //异常处理;
  536. }
  537. })
  538. }
  539. // 搜索功能
  540. // const searchInput = document.querySelector('.search-box input');
  541. // searchInput.addEventListener('input', function() {
  542. // const searchTerm = this.value.toLowerCase();
  543. // const rows = document.querySelectorAll('tbody tr');
  544. // rows.forEach(row => {
  545. // const region = row.cells[1].textContent.toLowerCase();
  546. // if (region.includes(searchTerm)) {
  547. // row.style.display = '';
  548. // } else {
  549. // row.style.display = 'none';
  550. // }
  551. // });
  552. // });
  553. </script>
  554. </body>
  555. </html>