view.html 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461
  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. $.ajax({
  257. type : "GET",
  258. async : true, //异步请求(同步请求将会锁住浏览器,用户其他操作必须等待请求完成才可以执行)
  259. url : prefix + "/viewDetail/"+id, //请求发送到TestServlet处
  260. data : {},
  261. dataType : "json", //返回数据形式为json
  262. success : function(result) {
  263. //请求成功时执行该函数内容,result即为服务器返回的json对象
  264. names=[];
  265. Xnames=[];
  266. unsubmitted=[];
  267. submitted=[];
  268. retData=[];
  269. myChart = echarts.init(document.getElementById('chart-container'))
  270. if (result.data.length>0) {
  271. retData=result.data;
  272. for(var i=0;i<retData.length;i++){
  273. names.push(retData[i].chain); //挨个取出类别并填入类别数组
  274. Xnames.push(retData[i].orderCount);
  275. unsubmitted.push(retData[i].pendingCount);
  276. submitted.push(retData[i].completedCount);
  277. }
  278. }
  279. var updatedOption = {
  280. xAxis: {
  281. data: names
  282. },
  283. series: [{
  284. data: Xnames
  285. }]
  286. };
  287. // 使用新的数据更新图表
  288. myChart.setOption(updatedOption);
  289. $("#id").val(id);
  290. queryUserList();
  291. },
  292. error : function(errorMsg) {
  293. //请求失败时执行该函数
  294. alert("图表请求数据失败!");
  295. myChart.hideLoading();
  296. }
  297. })
  298. }
  299. /* 自定义重置-表单重置/隐藏框/树节点选择色/搜索 */
  300. function resetPre() {
  301. resetDate();
  302. $("#report-form")[0].reset();
  303. $("#deptId").val("");
  304. $("#parentId").val("");
  305. $(".curSelectedNode").removeClass("curSelectedNode");
  306. $.table.search();
  307. }
  308. $.ajax({
  309. type : "POST",
  310. async : true, //异步请求(同步请求将会锁住浏览器,用户其他操作必须等待请求完成才可以执行)
  311. url : prefix + "/listReport", //请求发送到TestServlet处
  312. data : {},
  313. dataType : "json", //返回数据形式为json
  314. success : function(result) {
  315. //请求成功时执行该函数内容,result即为服务器返回的json对象
  316. if (result.data.length>0) {
  317. retData=result.data;
  318. for(var i=0;i<retData.length;i++){
  319. names.push(retData[i].chain); //挨个取出类别并填入类别数组
  320. Xnames.push(retData[i].orderCount);
  321. unsubmitted.push(retData[i].pendingCount);
  322. submitted.push(retData[i].completedCount);
  323. }
  324. myChart.setOption(option);
  325. }
  326. },
  327. error : function(errorMsg) {
  328. //请求失败时执行该函数
  329. alert("图表请求数据失败!");
  330. myChart.hideLoading();
  331. }
  332. })
  333. </script>
  334. <style>
  335. .ant-btn-primary {
  336. color: #fff;
  337. background-color: #1890ff;
  338. border-color: #1890ff;
  339. text-shadow: 0 -1px 0 rgb(0 0 0 / 12%);
  340. box-shadow: 0 2px 0 rgb(0 0 0 / 5%);
  341. }
  342. .ant-radio-button-wrapper {
  343. position: relative;
  344. display: inline-block;
  345. height: 32px;
  346. margin: 0;
  347. padding: 0 15px;
  348. color: rgba(0,0,0,.65);
  349. line-height: 30px;
  350. background: #fff;
  351. border: 1px solid #d9d9d9;
  352. border-top-width: 1.02px;
  353. border-left: 0;
  354. cursor: pointer;
  355. transition: color .3s,background .3s,border-color .3s;
  356. }
  357. .ant-radio-button-wrapper2 {
  358. text-align: right;
  359. position: relative;
  360. display: inline-block;
  361. height: 32px;
  362. margin: 0;
  363. padding: 0 15px;
  364. color: rgba(0,0,0,.65);
  365. line-height: 30px;
  366. background: #fff;
  367. border: 1px solid #d9d9d9;
  368. border-top-width: 1.02px;
  369. border-left: 0;
  370. cursor: pointer;
  371. transition: color .3s,background .3s,border-color .3s;
  372. }
  373. .ant-card-head {
  374. min-height: 48px;
  375. margin-bottom: -1px;
  376. padding: 0 24px;
  377. color: rgba(0,0,0,.85);
  378. font-weight: 500;
  379. font-size: 16px;
  380. background: transparent;
  381. border-bottom: 1px solid #e8e8e8;
  382. border-radius: 2px 2px 0 0;
  383. zoom: 1;
  384. }
  385. .ant-card-head-wrapper {
  386. display: flex;
  387. align-items: center;
  388. }
  389. .ant-card-head-title {
  390. display: inline-block;
  391. flex: 1;
  392. padding: 16px 0;
  393. overflow: hidden;
  394. white-space: nowrap;
  395. text-overflow: ellipsis;
  396. }
  397. .index_title-2CoZR {
  398. width: 100%;
  399. justify-content: space-between;
  400. padding-left: 14px;
  401. border-left: 4px solid #e8514b;
  402. }
  403. .ChartAndTable_chart-and-table-3ib6R{
  404. display: flex;
  405. align-items: center;
  406. justify-content: space-between;
  407. }
  408. .ant-radio-group {
  409. box-sizing: border-box;
  410. margin: 0;
  411. padding: 0;
  412. color: rgba(0,0,0,.65);
  413. font-size: 14px;
  414. font-variant: tabular-nums;
  415. line-height: 1.5;
  416. list-style: none;
  417. font-feature-settings: "tnum";
  418. display: inline-block;
  419. }
  420. .ant-radio-button-wrapper>.ant-radio-button {
  421. width: 0;
  422. height: 0;
  423. margin-left: 0;
  424. }
  425. </style>
  426. </body>
  427. </html>