No Description

index.vue 11KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301
  1. <template>
  2. <div class="app-container">
  3. <div v-show="visible.thirdLayer">
  4. <div class="app-container">
  5. <div class="block">
  6. <!-- <span class="demonstration">時間篩選</span> -->
  7. <el-date-picker
  8. v-model="date"
  9. type="datetimerange"
  10. :picker-options="pickerOptions"
  11. range-separator="至"
  12. start-placeholder="開始日期"
  13. end-placeholder="结束日期"
  14. align="right">
  15. </el-date-picker>
  16. <el-button class="filter-item" type="primary" v-waves icon="el-icon-search" @click="handleFilter">搜尋</el-button>
  17. </div>
  18. </div>
  19. <el-table :data="list" v-loading.body="listLoading" element-loading-text="Loading" border fit highlight-current-row>
  20. <el-table-column :label="data.thirdLayer.name" align="center">
  21. <el-table-column label="時間" align="center">
  22. <template slot-scope="scope" prop="createdAt">
  23. <span>{{moment(scope.row.createdAt)}}</span>
  24. </template>
  25. </el-table-column>
  26. <el-table-column label="事件" align="center">
  27. <template slot-scope="scope">
  28. {{scope.row.type}}
  29. </template>
  30. </el-table-column>
  31. <el-table-column label="金額" align="center">
  32. <template slot-scope="scope">
  33. <span :style="moneyColor(scope.row.amount)">{{scope.row.amount}}</span>
  34. </template>
  35. </el-table-column>
  36. <el-table-column label="錢包" align="center">
  37. <template slot-scope="scope">
  38. <span>{{scope.row.wallet}}</span>
  39. </template>
  40. </el-table-column>
  41. <el-table-column align="center" label="操作" width="250">
  42. <template slot-scope="scope">
  43. <el-button v-show="scope.row.type==='遊戲'" type="primary" size="mini" icon="el-icon-tickets" @click="handlePersonDetail(scope.row)">個人明細</el-button>
  44. <router-link to="/room/index/gambleMember/index/gameHistory/index/detail/index">
  45. <el-button v-show="scope.row.type==='遊戲'" type="primary" size="mini" icon="el-icon-tickets" @click="handleGameDetail(scope.row)">此場明細</el-button>
  46. </router-link>
  47. </template>
  48. </el-table-column>
  49. </el-table-column>
  50. </el-table>
  51. <!-- <div v-show="!listLoading" class="pagination-container">
  52. <el-pagination background @size-change="handleSizeChange" @current-change="handleCurrentChange" :current-page.sync="listQuery.page"
  53. :page-sizes="[10,20,30, 50]" :page-size="listQuery.limit" layout="total, sizes, prev, pager, next, jumper" :total="total">
  54. </el-pagination>
  55. </div> -->
  56. <el-dialog title="個人詳細資料" :visible.sync="dialogFormVisible" width="75%" center>
  57. <el-table :data="dialogList" v-loading.body="listLoading" element-loading-text="Loading" border fit highlight-current-row
  58. style="width: 100%" :summary-method="getSummaries" show-summary>
  59. <el-table-column label="關" align="center">
  60. <template slot-scope="scope">
  61. {{scope.row.round}}
  62. </template>
  63. </el-table-column>
  64. <el-table-column label="門" align="center">
  65. <template slot-scope="scope">
  66. <span>{{scope.row.door}}</span>
  67. </template>
  68. </el-table-column>
  69. <el-table-column label="押注" align="center">
  70. <template slot-scope="scope">
  71. <span>{{scope.row.wager}}</span>
  72. </template>
  73. </el-table-column>
  74. <el-table-column label="輸贏" align="center">
  75. <template slot-scope="scope">
  76. <span :style="moneyColor(scope.row.earned)">{{scope.row.earned}}</span>
  77. </template>
  78. </el-table-column>
  79. <el-table-column label="抽水" align="center">
  80. <template slot-scope="scope">
  81. <span>{{scope.row.serviceFees}}</span>
  82. </template>
  83. </el-table-column>
  84. </el-table>
  85. <div slot="footer" class="dialog-footer">
  86. <el-button @click="dialogFormVisible = false" type="danger">關 閉</el-button>
  87. </div>
  88. </el-dialog>
  89. </div>
  90. <router-view></router-view>
  91. </div>
  92. </template>
  93. <script>
  94. import { mapActions, mapGetters } from 'vuex'
  95. import { fetchGameHistory, fetchChipsHistory, fetchPersonGameDetail, fetchPunishment } from '@/api/gambleMember'
  96. import { fetchCurrentChips } from '@/api/gambleGameBucket'
  97. import waves from '@/directive/waves' // 水波纹指令
  98. import moment from 'moment-timezone'
  99. import config from '../../../../config'
  100. import _ from 'lodash'
  101. export default {
  102. directives: {
  103. waves
  104. },
  105. data() {
  106. return {
  107. chipLogList: [],
  108. gameRecordList: [],
  109. list: [],
  110. dialogList: null,
  111. total: null,
  112. listLoading: true,
  113. listQuery: {
  114. page: 1,
  115. limit: 9999999999,
  116. startAt: null,
  117. endAt: null
  118. },
  119. tempCurrentChips: [],
  120. pickerOptions: {
  121. shortcuts: [{
  122. text: '本週',
  123. onClick(picker) {
  124. const end = moment().day('sunday').hour(12).minute(0).second(0).day(7).hour(11).minute(59).second(59)
  125. const start = moment().day('sunday').hour(12).minute(0).second(0).subtract(1, 'weeks').day(7).hour(16).minute(0).second(0)
  126. picker.$emit('pick', [start, end])
  127. }
  128. }, {
  129. text: '上週',
  130. onClick(picker) {
  131. const end = moment().day('sunday').hour(12).minute(0).second(0).subtract(1, 'weeks').day(7).hour(11).minute(59).second(59)
  132. const startAt = moment().day('sunday').hour(12).minute(0).second(0).subtract(2, 'weeks').day(7).hour(16).minute(0).second(0)
  133. picker.$emit('pick', [start, end])
  134. }
  135. }]
  136. },
  137. date: null,
  138. dialogFormVisible: false
  139. }
  140. },
  141. created() {
  142. this.date = this.p_date
  143. this.SetVisible(3)
  144. this.getList()
  145. },
  146. computed: {
  147. ...mapGetters([
  148. 'visible',
  149. 'data',
  150. // 'query',
  151. // 'p_date'
  152. ])
  153. },
  154. methods: {
  155. ...mapActions([
  156. 'SetVisible',
  157. 'SetData',
  158. // 'SetQuery',
  159. // 'SetDate'
  160. ]),
  161. async getList() {
  162. this.listLoading = true
  163. //this.list = []
  164. await fetchGameHistory(this.data.thirdLayer, this.listQuery).then(response => {
  165. this.list = []
  166. this.chipLogList = response.data
  167. this.tempCurrentChips = []
  168. this.chipLogList.map((item) => {
  169. fetchCurrentChips(item['GambleGame-Bucket'], this.data.thirdLayer).then(response => {
  170. item.earned = _.sumBy(response.data, item => {
  171. return item.earned - item.serviceFees - item.wagerServiceFees - item.FixedServiceFees
  172. })
  173. let round = _.groupBy(response.data, 'round')
  174. round = Object.values(round)
  175. item.currentChips = _.sumBy(round[round.length-1], 'chips') + round[round.length-1][0].currentChips
  176. this.list.unshift({
  177. id: item.game,
  178. createdAt: item['GambleGame-Bucket'].createdAt,
  179. type: '遊戲',
  180. amount: item.earned,
  181. wallet: item.currentChips
  182. })
  183. })
  184. })
  185. })
  186. await fetchChipsHistory(this.data.thirdLayer, this.listQuery).then(response => {
  187. this.gameRecordList = response.data
  188. this.gameRecordList.map((item) => {
  189. if(item.type === config.const.GambleMemberChipsLog.type.deposit) item.type = '上 / 下 分';
  190. if(item.type === config.const.GambleMemberChipsLog.type.reward) item.type = '獎勵 / 懲罰';
  191. if(item.type === config.const.GambleMemberChipsLog.type.reset) item.type = '歸零';
  192. this.list.unshift({
  193. id: item.id,
  194. createdAt: item.createdAt,
  195. type: item.type,
  196. amount: item.chips,
  197. wallet: item.totalChips
  198. })
  199. })
  200. })
  201. await fetchPunishment(this.data.thirdLayer).then(response => {
  202. response.data.map(item => {
  203. this.list.unshift({
  204. id: item.id,
  205. createdAt: item.createdAt,
  206. type: item.rule,
  207. amount: (item.chips)*(-1),
  208. wallet: ` `
  209. })
  210. })
  211. })
  212. this.list.sort(function compare(a, b) {
  213. const dateA = new Date(a.createdAt);
  214. const dateB = new Date(b.createdAt);
  215. return dateB - dateA;
  216. });
  217. this.total = this.list.length
  218. this.listLoading = false
  219. },
  220. handlePersonDetail(row) {
  221. this.listLoading = true
  222. this.dialogFormVisible = true
  223. fetchPersonGameDetail(this.data.thirdLayer.id, row.id).then(response => {
  224. console.log('params', this.data.thirdLayer.id, row.id)
  225. console.log('rows', response.data.rows)
  226. this.dialogList = response.data.rows.map(row => {
  227. row.serviceFees = row.serviceFees + row.wagerServiceFees + row.FixedServiceFees
  228. })
  229. this.listLoading = false
  230. })
  231. },
  232. handleGameDetail(row) {
  233. console.log('Game detail', row)
  234. const temp = Object.assign({}, row) // copy obj
  235. this.SetVisible(4)
  236. this.SetData({layer:4, data: temp})
  237. },
  238. handleFilter() {
  239. // this.listQuery.page = 1
  240. if (this.date) {
  241. this.listQuery.startAt = moment.utc(this.date[0]).format()
  242. this.listQuery.endAt = moment.utc(this.date[1]).format()
  243. } else {
  244. this.listQuery.startAt = null
  245. this.listQuery.endAt = null
  246. }
  247. this.getList()
  248. },
  249. // handleSizeChange(val) {
  250. // this.listQuery.limit = val
  251. // this.getList()
  252. // },
  253. // handleCurrentChange(val) {
  254. // this.listQuery.page = val
  255. // this.getList()
  256. // },
  257. moment(time) {
  258. return moment(time).tz('Asia/Taipei').format('YYYY-MM-DD HH:mm:ss')
  259. },
  260. getSummaries() {
  261. const sums = []
  262. let totalWager = 0
  263. let totalEarned = 0
  264. let totalServiceFees = 0
  265. if (this.dialogList) {
  266. this.dialogList.map((memberRecord) => {
  267. totalWager += memberRecord.wager
  268. totalEarned += memberRecord.earned
  269. totalServiceFees += memberRecord.serviceFees
  270. })
  271. }
  272. sums[0] = '合計'
  273. sums[1] = 'N/A'
  274. sums[2] = totalWager
  275. sums[3] = totalEarned
  276. sums[4] = totalServiceFees
  277. return sums
  278. },
  279. moneyColor(money) {
  280. return money >= 0 ? { color: '#67C23A' } : { color: '#FA5555' }
  281. }
  282. },
  283. destroyed() {
  284. this.SetVisible(2)
  285. },
  286. // time 持久化
  287. // watch: {
  288. // 'date': function(val) {
  289. // this.SetDate(val)
  290. // }
  291. // }
  292. }
  293. </script>