暂无描述

index.vue 14KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369
  1. <template>
  2. <div class="app-container">
  3. <div v-show="visible.secondLayer">
  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="allCombine" v-loading.body="listLoading" element-loading-text="Loading" border fit highlight-current-row>
  20. <el-table-column label="代理商名稱" align="center">
  21. <template slot-scope="scope">
  22. <span>{{scope.row.name}}</span>
  23. </template>
  24. </el-table-column>
  25. <el-table-column label="總上分額" align="center">
  26. <template slot-scope="scope">
  27. <span>{{scope.row.allUp}}</span>
  28. </template>
  29. </el-table-column>
  30. <el-table-column label="總下分額" align="center">
  31. <template slot-scope="scope">
  32. <span>{{scope.row.allDown}}</span>
  33. </template>
  34. </el-table-column>
  35. <el-table-column label="所有會員點數" align="center">
  36. <template slot-scope="scope">
  37. <span>{{scope.row.allChips}}</span>
  38. </template>
  39. </el-table-column>
  40. <el-table-column label="有效投注量" align="center">
  41. <template slot-scope="scope">
  42. <span>{{scope.row.allEarned}}</span>
  43. </template>
  44. </el-table-column>
  45. <el-table-column label="總水量" align="center">
  46. <template slot-scope="scope">
  47. <span>{{scope.row.allServiceFees}}</span>
  48. </template>
  49. </el-table-column>
  50. <el-table-column label="上繳工作室金額" align="center">
  51. <template slot-scope="scope">
  52. <span :style="moneyColor(all(scope))">{{all(scope)}}</span>
  53. </template>
  54. </el-table-column>
  55. </el-table>
  56. <el-table :data="combine" v-loading.body="listLoading" element-loading-text="Loading" border fit highlight-current-row>
  57. <el-table-column :label="`${this.data.secondLayer.GambleMember.name}的會員`" align="center">
  58. <el-table-column label="名稱" align="center">
  59. <template slot-scope="scope">
  60. <span>{{scope.row.name}}</span>
  61. </template>
  62. </el-table-column>
  63. <el-table-column label="會員當前分數" align="center">
  64. <template slot-scope="scope">
  65. <span>{{scope.row.chips}}</span>
  66. </template>
  67. </el-table-column>
  68. <el-table-column label="總上分額" align="center">
  69. <template slot-scope="scope">
  70. <span>{{scope.row.totalUp}}</span>
  71. </template>
  72. </el-table-column>
  73. <el-table-column label="總下分額" align="center">
  74. <template slot-scope="scope">
  75. <span>{{scope.row.totalDown}}</span>
  76. </template>
  77. </el-table-column>
  78. <el-table-column label="總獎勵" align="center">
  79. <template slot-scope="scope">
  80. <span>{{scope.row.totalReward}}</span>
  81. </template>
  82. </el-table-column>
  83. <el-table-column label="總懲罰" align="center">
  84. <template slot-scope="scope">
  85. <span>{{scope.row.totalPunishment}}</span>
  86. </template>
  87. </el-table-column>
  88. <el-table-column label="有效投注量" align="center">
  89. <template slot-scope="scope">
  90. <span>{{0}}</span>
  91. </template>
  92. </el-table-column>
  93. <!-- <el-table-column label="莊家贏錢" align="center">
  94. <template slot-scope="scope">
  95. <span :style="moneyColor(scope.row.bookieEarned)">{{scope.row.bookieEarned}}</span>
  96. </template>
  97. </el-table-column>
  98. <el-table-column label="閒家贏錢" align="center">
  99. <template slot-scope="scope">
  100. <span :style="moneyColor(scope.row.memberEarned)">{{scope.row.memberEarned}}</span>
  101. </template>
  102. </el-table-column> -->
  103. <el-table-column label="莊家總投注量抽水" align="center">
  104. <template slot-scope="scope">
  105. <span>{{scope.row.bookieWagerFee}}</span>
  106. </template>
  107. </el-table-column>
  108. <el-table-column label="莊家總投注量退水" align="center">
  109. <template slot-scope="scope">
  110. <span>{{scope.row.feeRatio.times(scope.row.bookieWagerFee).valueOf()}}</span>
  111. </template>
  112. </el-table-column>
  113. <el-table-column label="莊家總抽水" align="center">
  114. <template slot-scope="scope">
  115. <span>{{scope.row.bookieServiceFees}}</span>
  116. </template>
  117. </el-table-column>
  118. <el-table-column label="莊家退水" align="center">
  119. <template slot-scope="scope">
  120. <span>{{scope.row.feeRatio.times(scope.row.bookieServiceFees).valueOf()}}</span>
  121. </template>
  122. </el-table-column>
  123. <el-table-column label="閒家總抽水" align="center">
  124. <template slot-scope="scope">
  125. <span>{{scope.row.memberServiceFees}}</span>
  126. </template>
  127. </el-table-column>
  128. <el-table-column label="閒家退水" align="center">
  129. <template slot-scope="scope">
  130. <span>{{scope.row.feeRatio.times(scope.row.memberServiceFees).valueOf()}}</span>
  131. </template>
  132. </el-table-column>
  133. <el-table-column label="總退水" align="center">
  134. <template slot-scope="scope">
  135. <span>{{scope.row.totalServiceFees}}</span>
  136. </template>
  137. </el-table-column>
  138. <el-table-column label="會員結帳" align="center">
  139. <template slot-scope="scope">
  140. <span :style="moneyColor((scope.row.memberCheckOut)*(-1))">{{(scope.row.memberCheckOut)*(-1)}}</span>
  141. </template>
  142. </el-table-column>
  143. <el-table-column align="center" label="操作" width="100">
  144. <template slot-scope="scope">
  145. <router-link to="/agent/index/gambleMemberManagement/index/gameHistory">
  146. <el-button type="primary" size="mini" icon="el-icon-tickets" @click="handlePersonDetail(scope.row)">紀錄</el-button>
  147. </router-link>
  148. </template>
  149. </el-table-column>
  150. </el-table-column>
  151. </el-table>
  152. </div>
  153. <router-view></router-view>
  154. </div>
  155. </template>
  156. <script>
  157. import { mapActions, mapGetters } from 'vuex'
  158. import { fetchMemberList } from '@/api/agnetManagement'
  159. import waves from '@/directive/waves' // 水波纹指令
  160. import moment from 'moment-timezone'
  161. import config from '../../../../config'
  162. import _ from 'lodash'
  163. import { Decimal } from 'decimal.js';
  164. export default {
  165. directives: {
  166. waves
  167. },
  168. data() {
  169. return {
  170. // chipLogList: [],
  171. // gameRecordList: [],
  172. list: [],
  173. // member: {},
  174. dialogList: null,
  175. total: null,
  176. listLoading: true,
  177. allCombine: [],
  178. combine: [],
  179. listQuery: {
  180. // page: 1,
  181. // limit: 20,
  182. startAt: moment.utc(moment().startOf('isoweek').subtract(1, 'weeks').day(7).hour(16).minute(0).second(0)).format(),
  183. endAt: moment.utc(moment().startOf('isoweek').day(7).hour(11).minute(59).second(59)).format()
  184. },
  185. pickerOptions: {
  186. shortcuts: [{
  187. text: '本週',
  188. onClick(picker) {
  189. const end = moment().startOf('isoweek').day(7).hour(11).minute(59).second(59)
  190. const start = moment().startOf('isoweek').subtract(1, 'weeks').day(7).hour(16).minute(0).second(0)
  191. picker.$emit('pick', [start, end])
  192. }
  193. }, {
  194. text: '上週',
  195. onClick(picker) {
  196. const end = moment().startOf('isoweek').subtract(1, 'weeks').day(7).hour(11).minute(59).second(59)
  197. const start = moment().startOf('isoweek').subtract(2, 'weeks').day(7).hour(16).minute(0).second(0)
  198. picker.$emit('pick', [start, end])
  199. }
  200. }]
  201. },
  202. date: null,
  203. dialogFormVisible: false
  204. }
  205. },
  206. created() {
  207. this.SetVisible(2)
  208. this.getList()
  209. },
  210. computed: {
  211. ...mapGetters([
  212. 'visible',
  213. 'data',
  214. ])
  215. },
  216. // props: ['agent'],
  217. methods: {
  218. ...mapActions([
  219. 'SetVisible',
  220. 'SetData',
  221. ]),
  222. getList() {
  223. this.listLoading = true
  224. this.allCombine = []
  225. this.combine = []
  226. fetchMemberList(this.data.secondLayer, this.listQuery).then(response => {
  227. response.data.rows.map(member => {
  228. let row = {
  229. id: member.id,
  230. name: member.name,
  231. chips: member.chips,
  232. totalUp: 0,
  233. totalDown: 0,
  234. totalReward: 0,
  235. totalPunishment: 0,
  236. bookieEarned: 0,
  237. memberEarned: 0,
  238. bookieWagerFee: 0,
  239. bookieServiceFees: 0,
  240. memberServiceFees: 0,
  241. totalServiceFees: 0,
  242. memberCheckOut: 0,
  243. feeRatio: new Decimal(this.data.secondLayer.feeRatio/100),
  244. }
  245. let bookie = _.groupBy(member['GambleGame-Bucket-MemberRecords'], 'isBookie')
  246. if (bookie.false) {
  247. row.memberEarned = _.sumBy(bookie.false, item => {
  248. return Math.abs(item.earned)
  249. });
  250. console.log('membeEarned', row.memberEarned)
  251. row.memberServiceFees = _.sumBy(bookie.false, 'serviceFees');
  252. }
  253. if (bookie.true) {
  254. row.bookieWagerFee = _.sumBy(bookie.true, (item) => {
  255. return item.wagerServiceFees
  256. });
  257. console.log('eeee', bookie.true)
  258. row.bookieEarned = _.sumBy(bookie.true, item => {
  259. return Math.abs(item.earned)
  260. });
  261. console.log('bookieEarned' , row.bookieEarned)
  262. row.bookieServiceFees = _.sumBy(bookie.true, (item) => { return item.serviceFees});
  263. }
  264. row.totalServiceFees = Number(new Decimal(row.bookieServiceFees).plus(row.memberServiceFees).plus(row.bookieWagerFee).times(row.feeRatio).valueOf())
  265. let chipsLog = _.groupBy(member.GambleMemberChipsLogs, 'type')
  266. // console.log('type', chipsLog)
  267. if (chipsLog['0'] || chipsLog['2']) {
  268. row.totalUp = _.sumBy(chipsLog['0'], (item) => {
  269. return item.chips > 0 ? item.chips : 0
  270. })
  271. row.totalDown = _.sumBy(chipsLog['0'], (item) => {
  272. return item.chips < 0 ? item.chips : 0
  273. }) + _.sumBy(chipsLog['2'], (item) => {
  274. return item.chips < 0 ? item.chips : 0
  275. })
  276. }
  277. row.memberCheckOut = row.totalUp + row.totalDown - row.chips
  278. // TODO CHECK 是否需要
  279. if(chipsLog['1']) {
  280. row.totalReward = _.sumBy(chipsLog['1'], (item) => {
  281. return item.chips > 0 ? item.chips : 0
  282. })
  283. row.totalPunishment = _.sumBy(chipsLog['1'], (item) => {
  284. return item.chips < 0 ? item.chips : 0
  285. })
  286. }
  287. // console.log('www',row)
  288. this.combine.push(row)
  289. })
  290. console.log('cimbine' , this.combine)
  291. this.allCombine.push({
  292. name: this.data.secondLayer.GambleMember.name,
  293. allUp: _.sumBy(this.combine, 'totalUp'),
  294. allDown: _.sumBy(this.combine, 'totalDown'),
  295. allChips: _.sumBy(this.combine, 'chips'),
  296. allEarned: _.sumBy(this.combine, (item) => {return item.bookieEarned + item.memberEarned}),
  297. allServiceFees: _.sumBy(this.combine, (item) => {return item.totalServiceFees }),
  298. })
  299. this.listLoading = false
  300. })
  301. },
  302. handlePersonDetail(row) {
  303. const temp = Object.assign({}, row) // copy obj
  304. this.SetVisible(3)
  305. this.SetData({layer:3, data: temp})
  306. },
  307. handleFilter() {
  308. this.listQuery.page = 1
  309. if (this.date) {
  310. this.listQuery.startAt = moment.utc(this.date[0]).format()
  311. this.listQuery.endAt = moment.utc(this.date[1]).format()
  312. } else {
  313. this.listQuery.startAt = null
  314. this.listQuery.endAt = null
  315. }
  316. this.getList()
  317. },
  318. handleSizeChange(val) {
  319. this.listQuery.limit = val
  320. this.getList()
  321. },
  322. handleCurrentChange(val) {
  323. this.listQuery.page = val
  324. this.getList()
  325. },
  326. moment(time) {
  327. return moment(time).tz('Asia/Taipei').format('YYYY-MM-DD HH:mm:ss')
  328. },
  329. // getSummaries() {
  330. // const sums = []
  331. // let totalWager = 0
  332. // let totalEarned = 0
  333. // let totalServiceFees = 0
  334. // if (this.dialogList) {
  335. // this.dialogList.map((memberRecord) => {
  336. // totalWager += memberRecord.wager
  337. // totalEarned += memberRecord.earned
  338. // totalServiceFees += memberRecord.serviceFees
  339. // })
  340. // }
  341. // sums[0] = '合計'
  342. // sums[1] = 'N/A'
  343. // sums[2] = totalWager
  344. // sums[3] = totalEarned
  345. // sums[4] = totalServiceFees
  346. // return sums
  347. // },
  348. moneyColor(money) {
  349. return money >= 0 ? { color: '#67C23A' } : { color: '#FA5555' }
  350. },
  351. all(scope) {
  352. return (scope.row.allUp+scope.row.allDown-scope.row.allChips-scope.row.allServiceFees)*(-1)
  353. }
  354. },
  355. destroyed() {
  356. this.SetVisible(1)
  357. }
  358. }
  359. </script>