statPanelToday.vue 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233
  1. <template>
  2. <!-- 历史数据统计面板(最近7天,本月,本季度,本月,总和 -->
  3. <view class="uni-stat--x p-m">
  4. <view class="uni-stat-card-header">今日数据</view>
  5. <uni-table :loading="loading" border stripe emptyText="暂无更多数据" style="min-height: 100px;">
  6. <!-- 表头行 -->
  7. <uni-tr>
  8. <uni-th align="center" class="th"></uni-th>
  9. <uni-th align="center" class="th" v-for="(item,index) in panelData" :key="index">
  10. <uni-tooltip>
  11. <view class="uni-stat--sum-item-title">
  12. {{ item.title }}
  13. <uni-icons class="ml-s" type="help" color="#666" />
  14. </view>
  15. <template v-slot:content>
  16. <view class="uni-stat-tooltip-s">
  17. <view v-for="(item2,index2) in item.list" :key="index2">{{ item2.tooltip }}</view>
  18. </view>
  19. </template>
  20. </uni-tooltip>
  21. </uni-th>
  22. </uni-tr>
  23. <!-- 表格数据行 -->
  24. <uni-tr>
  25. <uni-td align="center" class="td">下单</uni-td>
  26. <uni-td align="center" class="td" v-for="(item, index) in panelData" :key="index">{{ item.list[0].value }}</uni-td>
  27. </uni-tr>
  28. <uni-tr>
  29. <uni-td align="center" class="td">收款</uni-td>
  30. <uni-td align="center" class="td" v-for="(item, index) in panelData" :key="index">{{ item.list[1].value }}</uni-td>
  31. </uni-tr>
  32. <uni-tr>
  33. <uni-td align="center" class="td">退款</uni-td>
  34. <uni-td align="center" class="td" v-for="(item, index) in panelData" :key="index">{{ item.list[2].value }}</uni-td>
  35. </uni-tr>
  36. </uni-table>
  37. </view>
  38. </template>
  39. <script>
  40. import {
  41. formatterData,
  42. stringifyQuery,
  43. stringifyField,
  44. stringifyGroupField,
  45. getTimeOfSomeDayAgo,
  46. formatDate,
  47. parseDateTime,
  48. debounce,
  49. } from '@/js_sdk/uni-stat/util.js'
  50. import timeUtil from "@/js_sdk/uni-stat/timeUtil.js"
  51. import {
  52. fieldsMap,
  53. fieldsGroupMap,
  54. } from '../fieldsMap.js'
  55. export default {
  56. props: {
  57. query: {
  58. type: [Object],
  59. default: function(){
  60. return {}
  61. }
  62. },
  63. },
  64. data() {
  65. return {
  66. tableName: 'uni-stat-pay-result',
  67. panelData: fieldsGroupMap,
  68. loading: false
  69. }
  70. },
  71. created() {
  72. this.getCloudDataDebounce = debounce(() => {
  73. this.getCloudData();
  74. }, 300);
  75. this.getCloudDataDebounce();
  76. },
  77. methods: {
  78. // 获取云端数据
  79. getCloudData() {
  80. let query = this.query;
  81. if (!query.appid) return;
  82. this.loading = true;
  83. const where = stringifyQuery({
  84. ...query,
  85. start_time: [getTimeOfSomeDayAgo(0), Date.now()]
  86. }, true, ['uni_platform']);
  87. //console.log('where: ', where)
  88. const db = uniCloud.database();
  89. const subTable = db.collection(this.tableName)
  90. .where(where)
  91. .field(`${stringifyField(fieldsMap)}, dimension, stat_date.date_str as stat_time, start_time`)
  92. .groupBy(`stat_time, dimension`)
  93. .groupField(stringifyGroupField(fieldsMap))
  94. .orderBy('stat_time', 'desc')
  95. .get()
  96. .then(res => {
  97. let data = res.result.data;
  98. // 数据格式化
  99. data = formatterData({
  100. fieldsMap,
  101. data
  102. });
  103. //console.log('data: ', data)
  104. // 获取今日数据
  105. let today = data.find((item) => {
  106. return item.dimension === 'day' && item.stat_time === parseDateTime(getTimeOfSomeDayAgo(0), '');
  107. });
  108. if (!today) {
  109. today = data.find((item) => {
  110. return item.dimension === 'hour' && item.stat_time === parseDateTime(getTimeOfSomeDayAgo(0), '');
  111. }) || {};
  112. }
  113. this.loading = false;
  114. this.panelData = this.setPanelData(today);
  115. })
  116. },
  117. // 设置面板数据
  118. setPanelData(data){
  119. let panelData = this.panelData;
  120. panelData.map((item1, index1) => {
  121. item1.list.map((item2, index2) => {
  122. item2.value = data[item2.field] || 0;
  123. });
  124. });
  125. return panelData;
  126. }
  127. },
  128. watch: {
  129. query: {
  130. deep: true,
  131. handler(val) {
  132. this.getCloudDataDebounce()
  133. }
  134. }
  135. },
  136. }
  137. </script>
  138. <style lang="scss" scoped>
  139. .uni-stat-tooltip-s {
  140. width: 350px;
  141. white-space: normal;
  142. }
  143. .uni-stat--sum {
  144. &-x {
  145. display: flex;
  146. align-items: center;
  147. justify-content: center;
  148. flex-wrap: wrap;
  149. border-radius: 4px;
  150. padding: 15px;
  151. box-shadow: -1px -1px 5px 0 rgba(0, 0, 0, 0.1);
  152. }
  153. &-item {
  154. white-space: nowrap;
  155. text-align: center;
  156. margin: 10px 18px;
  157. &-width {
  158. width: 100px
  159. }
  160. }
  161. &-item-title {
  162. display: flex;
  163. align-items: center;
  164. justify-content: center;
  165. min-height: 17px;
  166. font-size: 12px;
  167. color: #666;
  168. }
  169. &-item-value {
  170. font-size: 24px;
  171. line-height: 48px;
  172. font-weight: 700;
  173. color: #333;
  174. }
  175. &-item-contrast {
  176. font-size: 14px;
  177. color: #666;
  178. }
  179. }
  180. /* #ifndef APP-NVUE */
  181. @media screen and (max-width: 500px) {
  182. .uni-stat--sum-x {
  183. padding: 15px 0;
  184. align-items: center;
  185. justify-content: center;
  186. flex-wrap: unset;
  187. overflow-x: auto !important;
  188. }
  189. ::-webkit-scrollbar {
  190. display: none;
  191. }
  192. }
  193. /* #endif */
  194. .uni-stat--sum-flex{
  195. flex:1;
  196. display: flex;
  197. justify-content: flex-start;
  198. flex-wrap: wrap;
  199. border-radius: 4px;
  200. padding: 15px;
  201. .uni-stat--sum-item{
  202. min-width: 300rpx;
  203. max-width: 500rpx;
  204. flex:1;
  205. }
  206. }
  207. .uni-stat-card-header {
  208. justify-content: space-between;
  209. color: #555;
  210. font-size: 14px;
  211. font-weight: 600;
  212. padding: 10px 0;
  213. margin-bottom: 15px;
  214. }
  215. .td.main{
  216. color:#e43d33;
  217. }
  218. </style>