Нет описания

index.vue 12KB

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