Aucune description

index.vue 12KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308
  1. <template>
  2. <div class="app-container calendar-list-container">
  3. <div v-show="visible.firstLayer">
  4. <div class="app-container">
  5. <el-input @keyup.enter.native="handleFilter" style="width: 200px;" class="filter-item" placeholder="名稱" v-model="listQuery.name">
  6. </el-input>
  7. <el-button class="filter-item" type="primary" v-waves icon="el-icon-search" @click="handleFilter">搜尋</el-button>
  8. <el-button class="filter-item" @click="handleCreate" type="primary" icon="el-icon-edit">創建代理商</el-button>
  9. <el-input style='width:100px;' placeholder="輸入檔案名稱" prefix-icon="el-icon-document" v-model="filename"></el-input>
  10. <el-button style='margin-bottom:20px;' type="primary" icon="document" @click="handleDownload" :loading="downloadLoading">匯出 excel</el-button>
  11. </div>
  12. <el-table :data="list" v-loading.body="listLoading" element-loading-text="Loading" border fit highlight-current-row
  13. style="width: 100%">
  14. <!-- <el-table-column align="center" label='ID' >
  15. <template slot-scope="scope">
  16. {{scope.row.GambleMember.id}}
  17. </template>
  18. </el-table-column> -->
  19. <el-table-column label="名稱" align="center">
  20. <template slot-scope="scope">
  21. {{scope.row.name}}
  22. </template>
  23. </el-table-column>
  24. <el-table-column label="抽水%" align="center">
  25. <template slot-scope="scope">
  26. {{scope.row.feeRatio}}
  27. </template>
  28. </el-table-column>
  29. <el-table-column label="代理商上繳金額" align="center">
  30. <template slot-scope="scope">
  31. <span :style="moneyColor(scope.row.all)">{{scope.row.all}}</span>
  32. </template>
  33. </el-table-column>
  34. <el-table-column label="上繳工作室金額70%" align="center">
  35. <template slot-scope="scope">
  36. <span :style="moneyColor(scope.row.all70)">{{scope.row.all70}}</span>
  37. </template>
  38. </el-table-column>
  39. <el-table-column align="center" label="操作" width="450">
  40. <template slot-scope="scope">
  41. <router-link to="/agent/index/gambleMemberManagement">
  42. <el-button type="primary" size="mini" icon="el-icon-tickets" @click="handlePage(scope.row)">會員管理</el-button>
  43. </router-link>
  44. </template>
  45. </el-table-column>
  46. </el-table>
  47. <div v-show="!listLoading" class="pagination-container">
  48. <!-- <el-pagination background @size-change="handleSizeChange" @current-change="handleCurrentChange" :current-page.sync="listQuery.page"
  49. :page-sizes="[10,20,30, 50]" :page-size="listQuery.limit" layout="total, sizes, prev, pager, next, jumper" :total="total">
  50. </el-pagination> -->
  51. </div>
  52. <el-dialog title="創建代理商" :visible.sync="dialogCreateFormVisible" :before-close="handleDialogClose" center>
  53. <el-form :rules="rules" ref="createForm" :model="createFormData" label-position="left" label-width="100px" style='width: 400px; margin-left:50px;'>
  54. <el-form-item label="名稱" prop="name">
  55. <el-input v-model="createFormData.name"></el-input>
  56. </el-form-item>
  57. <el-form-item label="抽水 %" prop="feeRatio">
  58. <el-input v-model="createFormData.feeRatio"></el-input>
  59. </el-form-item>
  60. </el-form>
  61. <div slot="footer" class="dialog-footer">
  62. <el-button @click="handleDialogClose">取 消</el-button>
  63. <el-button type="primary" @click="createData">確 定</el-button>
  64. </div>
  65. </el-dialog>
  66. </div>
  67. <router-view></router-view>
  68. </div>
  69. </template>
  70. <script>
  71. import { mapGetters, mapActions } from 'vuex'
  72. import { fetchList, createAgent, fetchMemberList,fetchGroupAll } from '@/api/agnetManagement'
  73. import waves from '@/directive/waves' // 水波纹指令
  74. import moment from 'moment-timezone'
  75. import _ from 'lodash'
  76. import { Decimal } from 'decimal.js';
  77. export default {
  78. directives: {
  79. waves
  80. },
  81. data() {
  82. return {
  83. list: [],
  84. total: null,
  85. listLoading: true,
  86. downloadLoading: false,
  87. listQuery: {
  88. page: 1,
  89. limit: 9999999,
  90. // startAt: moment.utc(moment().day('sunday').hour(12).minute(0).second(0).subtract(1, 'weeks').day(7).hour(16).minute(0).second(0)).format(),
  91. // endAt: moment.utc(moment().day('sunday').hour(12).minute(0).second(0).day(7).hour(11).minute(59).second(59)).format()
  92. },
  93. filename: '',
  94. dialogCreateFormVisible: false,
  95. dialogStatus: '',
  96. // agent: {},
  97. rules: {
  98. // rewardChips: [{ pattern: /^-?\d+$/, required: true, message: '請輸入整數', trigger: 'change' }],
  99. // depositChips: [{ pattern: /^-?\d+$/, required: true, message: '請輸入整數', trigger: 'change' }],
  100. // chips: [{ pattern: /^(0|[1-9][0-9]*)$/, required: true, message: '請輸入整數', trigger: 'change' }],
  101. // name: [{ type: 'string', required: true, message: '必填', trigger: 'change' }]
  102. },
  103. createFormData: {
  104. name: '',
  105. feeRatio: '',
  106. }
  107. }
  108. },
  109. created() {
  110. this.SetVisible(1)
  111. this.getList()
  112. },
  113. computed: {
  114. ...mapGetters([
  115. 'visible',
  116. 'data',
  117. ])
  118. },
  119. methods: {
  120. ...mapActions([
  121. 'SetVisible',
  122. 'SetData',
  123. ]),
  124. async getList() {
  125. this.listLoading = true
  126. await fetchList(this.listQuery).then(response => {
  127. response.data.rows.map(agent => {
  128. let combine = []
  129. this.list = []
  130. this.visible.firstLayer === true ? fetchGroupAll(agent, this.listQuery).then(response => {
  131. console.log('response' , response.data.all)
  132. this.list.push({
  133. // id: agent.GambleMember.id,
  134. // GambleMember: {
  135. // id: agent.GambleMember.id,
  136. // name: agent.GambleMember.name
  137. // },
  138. id: agent.GambleMember.id,
  139. name: agent.GambleMember.name.slice(19),
  140. createdAt: agent.GambleMember.createdAt,
  141. feeRatio: response.data.feeRatio,
  142. all: response.data.all,
  143. all70: response.data.all70
  144. })
  145. }) : false
  146. // fetchMemberList(agent, this.listQuery).then(response => {
  147. // response.data.rows.map(member => {
  148. // let row = {
  149. // id: member.id,
  150. // name: member.name,
  151. // chips: member.chips,
  152. // totalUp: 0,
  153. // totalDown: 0,
  154. // totalReward: 0,
  155. // totalPunishment: 0,
  156. // bookieEarned: 0,
  157. // memberEarned: 0,
  158. // bookieWagerFee: 0,
  159. // bookieServiceFees: 0,
  160. // memberServiceFees: 0,
  161. // totalServiceFees: 0,
  162. // memberCheckOut: 0,
  163. // }
  164. // let bookie = _.groupBy(member['GambleGame-Bucket-MemberRecords'], 'isBookie')
  165. // if (bookie.false) {
  166. // row.memberEarned = _.sumBy(bookie.false, item => {
  167. // return Math.abs(item.earned)
  168. // });
  169. // row.memberServiceFees = _.sumBy(bookie.false, 'serviceFees')*agent.feeRatio/100;
  170. // }
  171. // if (bookie.true) {
  172. // row.bookieWagerFee = _.sumBy(bookie.true, (item) => {
  173. // return item.wagerServiceFees
  174. // }) * agent.feeRatio/100;
  175. // row.bookieEarned = _.sumBy(bookie.true, item => {
  176. // return Math.abs(item.earned)
  177. // });
  178. // row.bookieServiceFees = _.sumBy(bookie.true, (item) => { return item.serviceFees })*agent.feeRatio/100;
  179. // }
  180. // row.totalServiceFees = Number(new Decimal(row.bookieServiceFees).plus(row.memberServiceFees).plus(row.bookieWagerFee).valueOf())
  181. // let chipsLog = _.groupBy(member.GambleMemberChipsLogs, 'type')
  182. // if (chipsLog['0']) {
  183. // row.totalUp = _.sumBy(chipsLog['0'], (item) => {
  184. // return item.chips > 0 ? item.chips : 0
  185. // })
  186. // row.totalDown = _.sumBy(chipsLog['0'], (item) => {
  187. // return item.chips < 0 ? item.chips : 0
  188. // })
  189. // }
  190. // row.memberCheckOut = row.totalUp + row.totalDown - row.chips
  191. // if(chipsLog['1']) {
  192. // row.totalReward = _.sumBy(chipsLog['1'], (item) => {
  193. // return item.chips > 0 ? item.chips : 0
  194. // })
  195. // row.totalPunishment = _.sumBy(chipsLog['1'], (item) => {
  196. // return item.chips < 0 ? item.chips : 0
  197. // })
  198. // }
  199. // combine.push(row)
  200. // })
  201. // let allUp = _.sumBy(combine, 'totalUp')
  202. // let allDown = _.sumBy(combine, 'totalDown')
  203. // let allChips = _.sumBy(combine, 'chips')
  204. // let allEarned = _.sumBy(combine, (item) => {return item.bookieEarned + item.memberEarned})
  205. // let allServiceFees = _.sumBy(combine, (item) => {return item.totalServiceFees}).toFixed(2)
  206. // agent.all = (allUp+allDown-allChips-allServiceFees)*(-1)
  207. // this.list.push(agent)
  208. // this.listLoading = false
  209. // })
  210. })
  211. this.list.sort(function compare(a, b) {
  212. const dateA = new Date(a.createdAt);
  213. const dateB = new Date(b.createdAt);
  214. return dateB - dateA;
  215. })
  216. // this.total = response.data.count
  217. this.listLoading = false
  218. })
  219. },
  220. resetCreateData() {
  221. this.temp = {
  222. id: undefined,
  223. name: '',
  224. chips: '',
  225. depositChips: ''
  226. }
  227. },
  228. handleCreate() {
  229. this.resetCreateData()
  230. this.dialogCreateFormVisible = true
  231. this.$nextTick(() => {
  232. this.$refs['createForm'].clearValidate()
  233. })
  234. },
  235. createData() {
  236. this.$refs['createForm'].validate((valid) => {
  237. if (valid) {
  238. createAgent(this.createFormData).then((response) => {
  239. const agent = response.data.gambleAgentSetting;
  240. agent.GambleMember = response.data.agent
  241. this.list.unshift(agent)
  242. this.dialogCreateFormVisible = false
  243. this.$notify({
  244. title: '成功',
  245. message: '創建成功',
  246. type: 'success',
  247. duration: 2000
  248. })
  249. })
  250. }
  251. })
  252. },
  253. handleDownload() {
  254. this.downloadLoading = true
  255. import('@/vendor/Export2Excel').then(excel => {
  256. const tHeader = ['名稱', '抽水%', '代理商上繳金額', '上繳工作室金額70%' ]
  257. const filterVal = ['name', 'feeRatio', 'all', 'all70' ]
  258. const list = this.list
  259. const data = this.formatJson(filterVal, list)
  260. excel.export_json_to_excel(tHeader, data, this.filename)
  261. this.downloadLoading = false
  262. })
  263. },
  264. formatJson(filterVal, jsonData) {
  265. return jsonData.map(v => filterVal.map(j => {
  266. if (j === 'timestamp') {
  267. return parseTime(v[j])
  268. } else {
  269. return v[j]
  270. }
  271. }))
  272. },
  273. // handleFilter() {
  274. // this.listQuery.page = 1
  275. // this.getList()
  276. // },
  277. // handleSizeChange(val) {
  278. // this.listQuery.limit = val
  279. // this.getList()
  280. // },
  281. // handleCurrentChange(val) {
  282. // this.listQuery.page = val
  283. // this.getList()
  284. // },
  285. handleDialogClose() {
  286. this.dialogCreateFormVisible = false;
  287. },
  288. handlePage(row) {
  289. const temp = Object.assign({}, row) // copy obj
  290. this.SetVisible(2)
  291. this.SetData({layer:2, data: temp})
  292. // this.agent = temp
  293. },
  294. moneyColor(money) {
  295. return money >= 0 ? { color: '#67C23A' } : { color: '#FA5555' }
  296. },
  297. },
  298. }
  299. </script>