index.vue 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244
  1. <template>
  2. <div class="ma-content-block">
  3. <sa-table ref="crudRef" :options="options" :columns="columns" :searchForm="searchForm">
  4. <!-- 搜索区 tableSearch -->
  5. <template #tableSearch>
  6. <a-col :sm="6" :xs="24">
  7. <a-form-item label="游戏" field="game_id">
  8. <game-select v-model="searchForm.game_id" multiple />
  9. </a-form-item>
  10. </a-col>
  11. <a-col :sm="6" :xs="24">
  12. <a-form-item label="注册日期" field="tdate">
  13. <a-range-picker class="w-full" v-model="searchForm.tdate" :show-time="false" mode="date" />
  14. </a-form-item>
  15. </a-col>
  16. <a-col :sm="6" :xs="24">
  17. <a-form-item label="媒体类型" field="media_id">
  18. <media-select v-model="searchForm.media_id" />
  19. </a-form-item>
  20. </a-col>
  21. <a-col :sm="6" :xs="24">
  22. <a-form-item label="渠道ID" field="agent_id">
  23. <a-input v-model="searchForm.agent_id" placeholder="请输入渠道ID" allow-clear />
  24. </a-form-item>
  25. </a-col>
  26. <a-col :sm="6" :xs="24">
  27. <a-form-item label="广告位ID" field="site_id">
  28. <a-input v-model="searchForm.site_id" placeholder="请输入广告位ID" allow-clear />
  29. </a-form-item>
  30. </a-col>
  31. <a-col :sm="6" :xs="24">
  32. <a-form-item label="负责人" field="auth_id">
  33. <auth-select v-model="searchForm.auth_id" multiple />
  34. </a-form-item>
  35. </a-col>
  36. <a-col :sm="6" :xs="24">
  37. <a-form-item label="分组" field="group">
  38. <a-select v-model="searchForm.group" placeholder="请选择分组" allow-clear>
  39. <a-option value="">按渠道ID</a-option>
  40. <a-option :value="1">按游戏ID</a-option>
  41. <!-- <a-option :value="4">按游戏组</a-option> -->
  42. <a-option :value="2">按负责人</a-option>
  43. <a-option :value="3">按渠道组</a-option>
  44. </a-select>
  45. </a-form-item>
  46. </a-col>
  47. <a-col :sm="6" :xs="24">
  48. <a-form-item label="忽略" field="filter">
  49. <a-checkbox-group v-model="searchForm.filter">
  50. <a-checkbox value="igz">忽略0投入</a-checkbox>
  51. <a-checkbox value="fak">忽略后台录入</a-checkbox>
  52. </a-checkbox-group>
  53. </a-form-item>
  54. </a-col>
  55. </template>
  56. <template #tableSearchExtend>
  57. <div>
  58. 大盘数据:注册成本 {{ total.reg_cost }}, roi {{ total.roi }}, 付费成本 {{ total.p_cost }}, 付费率
  59. {{ total.p_per }}
  60. </div>
  61. </template>
  62. <!-- Table 自定义渲染 -->
  63. </sa-table>
  64. </div>
  65. </template>
  66. <script setup>
  67. import { onMounted, ref, reactive } from 'vue'
  68. import api from '../../api/gameLog/channelAnalysis'
  69. import dayjs from 'dayjs'
  70. import GameSelect from '@/components/game-select/index.vue'
  71. import MediaSelect from '@/components/media-select/index.vue'
  72. import AuthSelect from '@/components/auth-select/index.vue'
  73. // 引用定义
  74. const crudRef = ref()
  75. const gameList = ref([])
  76. const total = ref({
  77. reg_cost: 0,
  78. roi: 0,
  79. p_cost: 0,
  80. p_per: 0,
  81. })
  82. // 搜索表单
  83. const searchForm = ref({
  84. game_id: '',
  85. media_id: '',
  86. auth_id: '',
  87. agent_id: '',
  88. site_id: '',
  89. tdate: [],
  90. group: '',
  91. filter: [],
  92. })
  93. // SaTable 基础配置
  94. const options = reactive({
  95. api: api.getAgentDataList,
  96. pk: 'akey',
  97. showSort: true,
  98. showSummary: true,
  99. summary: [
  100. {
  101. action: 'totalRow',
  102. dataIndex: 'akey',
  103. },
  104. {
  105. action: 'totalRow',
  106. dataIndex: 'cost',
  107. },
  108. {
  109. action: 'totalRow',
  110. dataIndex: 'install',
  111. },
  112. {
  113. action: 'totalRow',
  114. dataIndex: 'reg_dev',
  115. },
  116. {
  117. action: 'totalRow',
  118. dataIndex: 'reg_total',
  119. },
  120. {
  121. action: 'totalRow',
  122. dataIndex: 'role_total',
  123. },
  124. {
  125. action: 'totalRow',
  126. dataIndex: 'role_per',
  127. },
  128. {
  129. action: 'totalRow',
  130. dataIndex: 'active',
  131. },
  132. {
  133. action: 'totalRow',
  134. dataIndex: 'a_cost',
  135. },
  136. {
  137. action: 'totalRow',
  138. dataIndex: 'a_per',
  139. },
  140. {
  141. action: 'totalRow',
  142. dataIndex: 'reg_pay_num',
  143. },
  144. {
  145. action: 'totalRow',
  146. dataIndex: 'reg_pay_total',
  147. },
  148. {
  149. action: 'totalRow',
  150. dataIndex: 'p_per',
  151. },
  152. {
  153. action: 'totalRow',
  154. dataIndex: 'da_per',
  155. },
  156. {
  157. action: 'totalRow',
  158. dataIndex: 're_per',
  159. },
  160. {
  161. action: 'totalRow',
  162. dataIndex: 're_amount_per',
  163. },
  164. {
  165. action: 'totalRow',
  166. dataIndex: 're_amount_per_7',
  167. },
  168. {
  169. action: 'totalRow',
  170. dataIndex: 'p_cost',
  171. },
  172. {
  173. action: 'totalRow',
  174. dataIndex: 'arpu',
  175. },
  176. {
  177. action: 'totalRow',
  178. dataIndex: 'r_arpu',
  179. },
  180. {
  181. action: 'totalRow',
  182. dataIndex: 'old_login_total',
  183. },
  184. ],
  185. operationColumn: false,
  186. })
  187. // SaTable 列配置
  188. const columns = reactive([
  189. { title: 'ID', dataIndex: 'akey', width: 100, fixed: 'left' },
  190. { title: '支出', dataIndex: 'cost', width: 100 },
  191. { title: '激活', dataIndex: 'install', width: 100 },
  192. { title: '注册设备', dataIndex: 'reg_dev', width: 100 },
  193. { title: '注册数', dataIndex: 'reg_total', width: 100 },
  194. { title: '注册成本', dataIndex: 'reg_cost', width: 100 },
  195. { title: '创角数', dataIndex: 'role_total', width: 100 },
  196. { title: '创角率', dataIndex: 'role_per', width: 100 },
  197. { title: '次留数', dataIndex: 'active', width: 100 },
  198. { title: '次留成本', dataIndex: 'a_cost', width: 100 },
  199. { title: '次留率', dataIndex: 'a_per', width: 100 },
  200. { title: '总付费人数', dataIndex: 'reg_pay_num', width: 100 },
  201. { title: '总付费金额', dataIndex: 'reg_pay_total', width: 100 },
  202. { title: '付费率', dataIndex: 'p_per', width: 100 },
  203. { title: '当天回本率', dataIndex: 'da_per', width: 100 },
  204. { title: '累计回本率', dataIndex: 're_per', width: 100 },
  205. { title: '实际回本率', dataIndex: 're_amount_per', width: 100 },
  206. { title: '7天实际回本率', dataIndex: 're_amount_per_7', width: 100 },
  207. { title: '付费成本', dataIndex: 'p_cost', width: 100 },
  208. { title: 'ARPU', dataIndex: 'arpu', width: 100 },
  209. { title: '注册ARPU', dataIndex: 'r_arpu', width: 100 },
  210. { title: '老用户数', dataIndex: 'old_login_total', width: 100 },
  211. { title: '分组名称', dataIndex: 'name', width: 100 },
  212. { title: '负责人', dataIndex: 'auth_name', width: 100 },
  213. ])
  214. // 页面数据初始化
  215. const initPage = () => {
  216. searchForm.value.tdate = [dayjs().format('YYYY-MM-DD'), dayjs().format('YYYY-MM-DD')]
  217. }
  218. // SaTable 数据请求
  219. const refresh = async () => {
  220. crudRef.value?.refresh()
  221. }
  222. // 页面加载完成执行
  223. onMounted(async () => {
  224. initPage()
  225. refresh()
  226. })
  227. </script>
  228. <script>
  229. export default { name: 'v1/channelAnalysis/agent' }
  230. </script>