view.html 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460
  1. <!DOCTYPE html>
  2. <html lang="zh" xmlns:th="http://www.thymeleaf.org" xmlns:shiro="http://www.pollix.at/thymeleaf/shiro">
  3. <head>
  4. <th:block th:include="include :: header('DTP处方登记概览')" />
  5. <th:block th:include="include :: layout-latest-css" />
  6. <th:block th:include="include :: ztree-css" />
  7. <script th:src="@{/health/js/echarts.min.js}"></script>
  8. <style>
  9. #chart-container {
  10. width: 100%;
  11. height: 500px;
  12. }
  13. </style>
  14. </head>
  15. <body class="gray-bg">
  16. <div class="ui-layout-center">
  17. <div class="ant-card-head">
  18. <div class="ant-card-head-wrapper">
  19. <div class="ant-card-head-title">
  20. <div class="index_title-2CoZR">
  21. <h1>DTP处方登记概览</h1>
  22. </div>
  23. </div>
  24. </div>
  25. </div>
  26. <div class="query-condition-container">
  27. <h4 class="query-condition-title">查询条件</h4>
  28. <div class="query-buttons">
  29. <button onclick="" class="ant-btn-primary">导出订单</button>
  30. <!-- <a class="btn btn-primary btn-rounded btn-sm" onclick="$.table.search()"><i class="fa fa-search"></i>&nbsp;搜索</a>-->
  31. <!-- <a class="btn btn-warning btn-rounded btn-sm" onclick="resetPre()"><i class="fa fa-refresh"></i>&nbsp;重置</a>-->
  32. </div>
  33. </div>
  34. <div class="container-div">
  35. <form id="report-form">
  36. <input type="text" class="" hidden="true" value="" name="id">
  37. <div class="ChartAndTable_chart-and-table-3ib6R">
  38. <div class="ant-radio-group ant-radio-group-outline">
  39. <label class="ant-radio-button-wrapper ant-radio-button-wrapper-checked">
  40. <span class="ant-radio-button ant-radio-button-checked">
  41. <input type="radio" class="ant-radio-button-input" value="1" checked="">
  42. <span class="ant-radio-button-inner">
  43. </span>
  44. </span>
  45. <span>订单量模式</span>
  46. </label>
  47. <label class="ant-radio-button-wrapper">
  48. <span class="ant-radio-button">
  49. <input type="radio" class="ant-radio-button-input" value="2">
  50. <span class="ant-radio-button-inner">
  51. </span>
  52. </span>
  53. <span>百分比模式</span>
  54. </label>
  55. </div>
  56. <div class="ant-radio-group ant-radio-group-outline">
  57. <label class="ant-radio-button-wrapper2">
  58. <span class="ant-radio-button ant-radio-button-checked">
  59. <input type="radio" class="ant-radio-button-input" value="7" checked="">
  60. <span class="ant-radio-button-inner"></span>
  61. </span><span>本周</span></label>
  62. <label class="ant-radio-button-wrapper2">
  63. <span class="ant-radio-button">
  64. <input type="radio" class="ant-radio-button-input" value="30">
  65. <span class="ant-radio-button-inner">
  66. </span></span><span>本月</span></label>
  67. <label class="ant-radio-button-wrapper2">
  68. <span class="ant-radio-button">
  69. <input type="radio" class="ant-radio-button-input" value="60">
  70. <span class="ant-radio-button-inner">
  71. </span></span><span>上月</span></label>
  72. <label class="ant-radio-button-wrapper2">
  73. <span class="ant-radio-button">
  74. <input type="radio" class="ant-radio-button-input" value="365">
  75. <span class="ant-radio-button-inner">
  76. </span></span>
  77. <span>本年</span>
  78. </label>
  79. <label>订单日期 </label>
  80. <input type="text" class="styled-input time-input" id="startTime" placeholder="开始时间" name="beginTime"/>
  81. <span>-</span>
  82. <input type="text" class="styled-input time-input" id="endTime" placeholder="结束时间" name="endTime"/>
  83. </div>
  84. </div>
  85. </form>
  86. <div id="chart-container"></div>
  87. <div class="col-sm-12 select-table table-striped">
  88. <table id="bootstrap-table"></table>
  89. </div>
  90. </div>
  91. </div>
  92. <th:block th:include="include :: footer" />
  93. <th:block th:include="include :: layout-latest-js" />
  94. <th:block th:include="include :: bootstrap-table-fixed-columns-js" />
  95. <th:block th:include="include :: ztree-js" />
  96. <script th:inline="javascript">
  97. var prefix = ctx + "dtp/report";
  98. var names=[];
  99. var Xnames=[];
  100. var submitted=[];
  101. var unsubmitted=[];
  102. var retData=[];
  103. // 初始化 ECharts 图表
  104. var myChart = echarts.init(document.getElementById('chart-container'));
  105. // 指定图表的配置项和数据
  106. var option = {
  107. title: {
  108. text: 'DTP 处方登记概览',
  109. left: 'center'
  110. },
  111. tooltip: {
  112. trigger: 'axis',
  113. axisPointer: {
  114. type: 'shadow'
  115. },
  116. formatter: function(params) {
  117. var submitted = retData[params[0].dataIndex].completedCount;
  118. var unsubmitted = retData[params[0].dataIndex].pendingCount;
  119. return '<p>' + params[0].name + '</p><p>已提交:' + submitted + ' 单 | 未提交:' + unsubmitted + ' 单</p>';
  120. }
  121. },
  122. legend: {
  123. data: ['已提交', '未提交']
  124. },
  125. xAxis: {
  126. type: 'category',
  127. data: names,
  128. name: '店铺名称', // X 轴的显示说明
  129. nameLocation: 'end', // 名称的位置,可选值有 'start', 'middle', 'end'
  130. nameGap: 30, // 名称与轴线之间的距离
  131. nameTextStyle: {
  132. fontSize: 14,
  133. color: 'black'
  134. },
  135. axisLabel: {
  136. formatter: function (value, index) {
  137. // 获取对应的数据点
  138. var data = option.series[0].data[index];
  139. // 判断 y 轴数值是否超过 250
  140. if (data > 100) {
  141. return `{red|${value}}`;
  142. } else {
  143. return value;
  144. }
  145. },
  146. rich: {
  147. red: {
  148. color: 'red'
  149. }
  150. }
  151. }
  152. },
  153. yAxis: {
  154. type: 'value',
  155. name: '订单量', // Y 轴的显示说明
  156. nameLocation: 'end', // 名称的位置,可选值有 'start', 'middle', 'end'
  157. nameGap: 30, // 名称与轴线之间的距离
  158. nameTextStyle: {
  159. fontSize: 14,
  160. color: 'black'
  161. },
  162. },
  163. series: [
  164. {
  165. data:Xnames,
  166. type: 'bar',
  167. showBackground: true,
  168. backgroundStyle: {
  169. color: 'rgba(180, 180, 180, 0.2)'
  170. },
  171. itemStyle: {
  172. color: function(params) {
  173. // 根据 y 轴数值设置颜色
  174. if (params.value > 100) {
  175. return 'red';
  176. } else {
  177. return 'blue'; // 默认颜色
  178. }
  179. }
  180. }
  181. }
  182. ]
  183. };
  184. // 使用刚指定的配置项和数据显示图表。
  185. myChart.setOption(option);
  186. $(function() {
  187. var panehHidden = false;
  188. if ($(this).width() < 1590) {
  189. panehHidden = true;
  190. }
  191. $('body').layout({ initClosed: panehHidden, west__size: 185, resizeWithWindow: false });
  192. // 回到顶部绑定
  193. if ($.fn.toTop !== undefined) {
  194. var opt = {
  195. win:$('.ui-layout-center'),
  196. doc:$('.ui-layout-center')
  197. };
  198. $('#scroll-up').toTop(opt);
  199. }
  200. queryUserList();
  201. });
  202. function queryUserList() {
  203. var options = {
  204. url: prefix + "/list",
  205. viewUrl: prefix + "/view/{id}",
  206. exportUrl: prefix + "/export",
  207. importUrl: prefix + "/importData",
  208. importTemplateUrl: prefix + "/importTemplate",
  209. sortName: "createTime",
  210. sortOrder: "desc",
  211. modalName: "DTP处方登记概览",
  212. columns: [
  213. {
  214. field: "id",
  215. title: "id",
  216. //hidden:false
  217. visible: false,
  218. },
  219. {
  220. field: "chain",
  221. title: "连锁店",
  222. align: "center",
  223. sortable: true,
  224. formatter: function(value, row, index) {
  225. if (row.id) {
  226. // 假设 row.id 是你要传递的 ID 参数
  227. return '<a href="javascript:void(0)" onclick="detail(\'' + row.id + '\')">' + value + '</a>';
  228. }
  229. }
  230. },
  231. {
  232. field: "orderCount",
  233. title: "订单量",
  234. align: "center"
  235. },
  236. {
  237. field: "pendingCount",
  238. title: "待完成订单数量",
  239. align: "center"
  240. },
  241. {
  242. field: "completedCount",
  243. title: "已完成订单数量",
  244. align: "center"
  245. },
  246. {
  247. field: "completionRate",
  248. title: "订单完成率(%)",
  249. align: "center"
  250. }]
  251. };
  252. $.table.init(options);
  253. }
  254. /*门店列表-详细*/
  255. function detail(id) {
  256. debugger
  257. $.ajax({
  258. type : "GET",
  259. async : true, //异步请求(同步请求将会锁住浏览器,用户其他操作必须等待请求完成才可以执行)
  260. url : prefix + "/viewDetail/"+id, //请求发送到TestServlet处
  261. data : {},
  262. dataType : "json", //返回数据形式为json
  263. success : function(result) {
  264. debugger
  265. //请求成功时执行该函数内容,result即为服务器返回的json对象
  266. names=[];
  267. Xnames=[];
  268. unsubmitted=[];
  269. submitted=[];
  270. retData=[];
  271. myChart = echarts.init(document.getElementById('chart-container'))
  272. if (result.data.length>0) {
  273. retData=result.data;
  274. for(var i=0;i<retData.length;i++){
  275. names.push(retData[i].chain); //挨个取出类别并填入类别数组
  276. Xnames.push(retData[i].orderCount);
  277. unsubmitted.push(retData[i].pendingCount);
  278. submitted.push(retData[i].completedCount);
  279. }
  280. }
  281. var updatedOption = {
  282. xAxis: {
  283. data: names
  284. },
  285. series: [{
  286. data: Xnames
  287. }]
  288. };
  289. // 使用新的数据更新图表
  290. myChart.setOption(updatedOption);
  291. $("#id").val(id);
  292. queryUserList();
  293. },
  294. error : function(errorMsg) {
  295. //请求失败时执行该函数
  296. alert("图表请求数据失败!");
  297. myChart.hideLoading();
  298. }
  299. })
  300. }
  301. /* 自定义重置-表单重置/隐藏框/树节点选择色/搜索 */
  302. function resetPre() {
  303. resetDate();
  304. $("#report-form")[0].reset();
  305. $("#deptId").val("");
  306. $("#parentId").val("");
  307. $(".curSelectedNode").removeClass("curSelectedNode");
  308. $.table.search();
  309. }
  310. $.ajax({
  311. type : "POST",
  312. async : true, //异步请求(同步请求将会锁住浏览器,用户其他操作必须等待请求完成才可以执行)
  313. url : prefix + "/listReport", //请求发送到TestServlet处
  314. data : {},
  315. dataType : "json", //返回数据形式为json
  316. success : function(result) {
  317. debugger
  318. //请求成功时执行该函数内容,result即为服务器返回的json对象
  319. if (result.data.length>0) {
  320. retData=result.data;
  321. for(var i=0;i<retData.length;i++){
  322. names.push(retData[i].chain); //挨个取出类别并填入类别数组
  323. Xnames.push(retData[i].orderCount);
  324. unsubmitted.push(retData[i].pendingCount);
  325. submitted.push(retData[i].completedCount);
  326. }
  327. myChart.setOption(option);
  328. }
  329. },
  330. error : function(errorMsg) {
  331. //请求失败时执行该函数
  332. alert("图表请求数据失败!");
  333. myChart.hideLoading();
  334. }
  335. })
  336. </script>
  337. <style>
  338. .ant-btn-primary {
  339. color: #fff;
  340. background-color: #1890ff;
  341. border-color: #1890ff;
  342. text-shadow: 0 -1px 0 rgb(0 0 0 / 12%);
  343. box-shadow: 0 2px 0 rgb(0 0 0 / 5%);
  344. }
  345. .ant-radio-button-wrapper {
  346. position: relative;
  347. display: inline-block;
  348. height: 32px;
  349. margin: 0;
  350. padding: 0 15px;
  351. color: rgba(0,0,0,.65);
  352. line-height: 30px;
  353. background: #fff;
  354. border: 1px solid #d9d9d9;
  355. border-top-width: 1.02px;
  356. border-left: 0;
  357. cursor: pointer;
  358. transition: color .3s,background .3s,border-color .3s;
  359. }
  360. .ant-radio-button-wrapper2 {
  361. text-align: right;
  362. position: relative;
  363. display: inline-block;
  364. height: 32px;
  365. margin: 0;
  366. padding: 0 15px;
  367. color: rgba(0,0,0,.65);
  368. line-height: 30px;
  369. background: #fff;
  370. border: 1px solid #d9d9d9;
  371. border-top-width: 1.02px;
  372. border-left: 0;
  373. cursor: pointer;
  374. transition: color .3s,background .3s,border-color .3s;
  375. }
  376. .ant-card-head {
  377. min-height: 48px;
  378. margin-bottom: -1px;
  379. padding: 0 24px;
  380. color: rgba(0,0,0,.85);
  381. font-weight: 500;
  382. font-size: 16px;
  383. background: transparent;
  384. border-bottom: 1px solid #e8e8e8;
  385. border-radius: 2px 2px 0 0;
  386. zoom: 1;
  387. }
  388. .ant-card-head-wrapper {
  389. display: flex;
  390. align-items: center;
  391. }
  392. .ant-card-head-title {
  393. display: inline-block;
  394. flex: 1;
  395. padding: 16px 0;
  396. overflow: hidden;
  397. white-space: nowrap;
  398. text-overflow: ellipsis;
  399. }
  400. .index_title-2CoZR {
  401. width: 100%;
  402. justify-content: space-between;
  403. padding-left: 14px;
  404. border-left: 4px solid #e8514b;
  405. }
  406. .ChartAndTable_chart-and-table-3ib6R{
  407. display: flex;
  408. align-items: center;
  409. justify-content: space-between;
  410. }
  411. .ant-radio-group {
  412. box-sizing: border-box;
  413. margin: 0;
  414. padding: 0;
  415. color: rgba(0,0,0,.65);
  416. font-size: 14px;
  417. font-variant: tabular-nums;
  418. line-height: 1.5;
  419. list-style: none;
  420. font-feature-settings: "tnum";
  421. display: inline-block;
  422. }
  423. .ant-radio-button-wrapper>.ant-radio-button {
  424. width: 0;
  425. height: 0;
  426. margin-left: 0;
  427. }
  428. </style>
  429. </body>
  430. </html>