view.html 16 KB

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