target.vue 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883
  1. <template>
  2. <div>
  3. <div class="gva-search-box">
  4. <el-form ref="searchForm" :inline="true" :model="searchInfo">
  5. <el-form-item label="任务Id">
  6. <el-input v-model="searchInfo.task_id" placeholder="任务ID" />
  7. </el-form-item>
  8. <el-form-item label="负责人">
  9. <el-select v-model="searchInfo.user" placeholder="负责人" >
  10. <el-option
  11. v-for="item in ResponsiblePerson"
  12. :key="item.id"
  13. :label="item.name"
  14. :value="item.name"
  15. />
  16. </el-select>
  17. </el-form-item>
  18. <el-form-item label="游戏端口">
  19. <el-select v-model="searchInfo.game_port_id" placeholder="请选择" style="width:100%">
  20. <el-option
  21. v-for="item in GamePortOptions"
  22. :key="item.id"
  23. :label="`${item.name}`"
  24. :value="item.id"
  25. />
  26. </el-select>
  27. </el-form-item>
  28. <el-form-item label="状态">
  29. <el-select v-model="searchInfo.is_complete" placeholder="是否完成" >
  30. <el-option
  31. v-for="item in searchStatusOptions"
  32. :key="item.value"
  33. :label="item.label"
  34. :value="item.value"
  35. :disabled="item.disabled"
  36. />
  37. </el-select>
  38. </el-form-item>
  39. <el-form-item label="日期" prop="date">
  40. <el-date-picker
  41. v-model="searchInfo.date"
  42. size="default"
  43. type="daterange"
  44. unlink-panels
  45. range-separator="至"
  46. start-placeholder="开始日期"
  47. end-placeholder="结束日期"
  48. :disabled-date="disabledDate"
  49. :shortcuts="shortcuts"
  50. />
  51. </el-form-item>
  52. <el-form-item>
  53. <el-button size="small" type="primary" icon="search" @click="onSubmit">查询</el-button>
  54. <el-button size="small" icon="refresh" @click="onReset">重置</el-button>
  55. <el-button class="excel-btn" size="small" type="primary" icon="download" @click="handleExcelExport">导出</el-button>
  56. </el-form-item>
  57. </el-form>
  58. </div>
  59. <div class="gva-table-box">
  60. <el-table :data="tableData" border @sort-change="sortChange" @selection-change="handleSelectionChange" style="width: 100%">
  61. <el-table-column label="任务ID" width="70" prop="task_id" sortable="custom" />
  62. <el-table-column label="任务日期" min-width="100" prop="create_date" />
  63. <el-table-column label="任务名称" width="130" prop="task_name" sortable="custom" />
  64. <el-table-column label="负责人" width="75" prop="user" sortable="custom" />
  65. <el-table-column label="登录方式" width="75" prop="login_method" />
  66. <el-table-column label="新增目标" width="75" prop="new_target" />
  67. <el-table-column label="新增完成" width="75" prop="new_complete" />
  68. <el-table-column label="剩余新增" width="75" prop="new_target1">
  69. <template #default="scope">
  70. {{ scope.row.new_target <= scope.row.new_complete ? 0 : scope.row.new_complete-scope.row.new_target}}
  71. </template>
  72. </el-table-column>
  73. <el-table-column label="留存目标" width="75" prop="retained_target" />
  74. <el-table-column label="留存完成" width="75" prop="retained_complete" />
  75. <el-table-column label="剩余留存" width="75" prop="retained_target1">
  76. <template #default="scope">
  77. {{ scope.row.retained_target <= scope.row.retained_complete ? 0 : scope.row.retained_complete-scope.row.retained_target}}
  78. </template>
  79. </el-table-column>
  80. <el-table-column label="付费目标" width="75" prop="pay_target" />
  81. <el-table-column label="付费完成" width="75" prop="pay_complete" />
  82. <el-table-column label="剩余付费" width="75" prop="pay_target1">
  83. <template #default="scope">
  84. {{ scope.row.pay_target <= scope.row.pay_complete ? 0 : scope.row.pay_complete-scope.row.pay_target}}
  85. </template>
  86. </el-table-column>
  87. <el-table-column label="付费流水" width="75" prop="amount"/>
  88. <el-table-column label="群控效率" width="75" prop="game_rate"/>
  89. <el-table-column label="手动新增" width="75" prop="hand_new_complete"/>
  90. <el-table-column label="手动留存" width="75" prop="hand_retained_complete"/>
  91. <el-table-column label="手动付费" width="75" prop="hand_pay_complete"/>
  92. <el-table-column label="手动付费金额" width="75" prop="hand_amount_total"/>
  93. <el-table-column fixed="right" align="right" label="是否完成" width="75" prop="is_complete" >
  94. <template #default="scope">
  95. <div>
  96. <el-tag :type="scope.row.is_complete === -1 ? 'warning' : 'success'">{{ statusFiletr(scope.row.is_complete) }}</el-tag>
  97. </div>
  98. </template>
  99. </el-table-column>
  100. <el-table-column fixed="right" label="操作" width="160">
  101. <template #default="scope">
  102. <el-button
  103. icon="edit"
  104. size="small"
  105. type="primary"
  106. link
  107. @click="editCardFunc(scope.row)"
  108. >编辑</el-button>
  109. <el-button
  110. icon="edit"
  111. size="small"
  112. type="primary"
  113. link
  114. @click="resetFeeFunc(scope.row)"
  115. >重置付费</el-button>
  116. <el-button
  117. icon="edit"
  118. size="small"
  119. type="primary"
  120. link
  121. @click="accountListFunc(scope.row)"
  122. >可付费账号</el-button>
  123. </template>
  124. </el-table-column>
  125. </el-table>
  126. <div class="gva-pagination">
  127. <el-pagination
  128. :current-page="page"
  129. :page-size="pageSize"
  130. :page-sizes="[10, 30, 50, 100]"
  131. :total="total"
  132. layout="total, sizes, prev, pager, next, jumper"
  133. @current-change="handleCurrentChange"
  134. @size-change="handleSizeChange"
  135. />
  136. </div>
  137. </div>
  138. <el-dialog v-model="dialogFormVisible" :before-close="closeDialog" :title="dialogTitle">
  139. <el-form ref="apiForm" :model="form" :rules="rules" label-width="80px" :inline="true">
  140. <el-form-item label="任务ID" prop="task_id">
  141. <el-input v-model="form.task_id" autocomplete="off" :disabled="(form.is_add == 0)" />
  142. </el-form-item>
  143. <el-form-item label="任务名称" prop="task_name">
  144. <el-input v-model="form.task_name" autocomplete="off" :disabled="true"/>
  145. </el-form-item>
  146. <el-form-item label="负责人" prop="user" >
  147. <el-input v-model="form.user" autocomplete="off" :disabled="true"/>
  148. </el-form-item>
  149. <el-form-item label="任务日期" prop="create_date" >
  150. <el-input v-model="form.create_date" autocomplete="off" :disabled="true"/>
  151. </el-form-item>
  152. </el-form>
  153. <el-tabs type="border-card">
  154. <el-tab-pane label="目标数据">
  155. <el-form ref="apiForm" :model="form" :rules="rules" label-width="80px" :inline="true">
  156. <el-form-item label="新增目标" prop="new_target">
  157. <el-input v-model="form.new_target" autocomplete="off" />
  158. </el-form-item>
  159. <el-form-item label="付费目标" prop="pay_target">
  160. <el-input v-model="form.pay_target" autocomplete="off"/>
  161. </el-form-item>
  162. <el-form-item label="留存目标" prop="retained_target" >
  163. <el-input v-model="form.retained_target" autocomplete="off"/>
  164. </el-form-item>
  165. </el-form>
  166. </el-tab-pane>
  167. <el-tab-pane label="手动完成数据">
  168. <el-form ref="apiForm" :model="form" :rules="rules" label-width="80px" :inline="true">
  169. <el-form-item label="新增个数" prop="hand_new_complete">
  170. <el-input v-model="form.hand_new_complete" autocomplete="off" />
  171. </el-form-item>
  172. <el-form-item label="留存个数" prop="hand_retained_complete" >
  173. <el-input v-model="form.hand_retained_complete" autocomplete="off"/>
  174. </el-form-item>
  175. <el-form-item label="是否付费">
  176. <el-radio-group v-model="form.is_free">
  177. <el-radio border label="1">有付费</el-radio>
  178. <el-radio border label="-1">没有付费</el-radio>
  179. </el-radio-group>
  180. </el-form-item>
  181. <el-form-item label="支付方式" prop="free_method" v-if="(form.is_free == 1)">
  182. <el-select v-model="form.free_method" placeholder="请选择" style="width:100%">
  183. <el-option
  184. v-for="item in FreeMethodOptions"
  185. :key="item.id"
  186. :label="`${item.name}`"
  187. :value="item.id"
  188. />
  189. </el-select>
  190. </el-form-item>
  191. </el-form>
  192. <el-form ref="apiForm" :model="form" :rules="rules" label-width="100px" :inline="true">
  193. <el-form-item label="手动付费个数" prop="hand_pay_complete" v-if="(form.is_free == 1)">
  194. <el-input v-model="form.hand_pay_complete" autocomplete="off"/>
  195. </el-form-item>
  196. <el-form-item label="付费总金额" prop="hand_amount_total" v-if="(form.is_free == 1)">
  197. <el-input v-model="form.hand_amount_total" autocomplete="off"/>
  198. </el-form-item>
  199. </el-form>
  200. <div v-if="(form.is_free == 1 && form.free_method == 1)" style="margin-bottom: 10px;">
  201. <el-button
  202. style="margin-top:12px"
  203. size="small"
  204. type="primary"
  205. icon="edit"
  206. @click="addBtn(form)"
  207. >添加卡号</el-button>
  208. <el-table :data="form.card_list" style="width: 100%">
  209. <el-table-column align="left" prop="card" label="卡号" width="180">
  210. <template #default="scope">
  211. <div>
  212. <el-input v-model="scope.row.card" />
  213. </div>
  214. </template>
  215. </el-table-column>
  216. <el-table-column align="left" prop="amount" label="消费金额" width="180">
  217. <template #default="scope">
  218. <div>
  219. <el-input-number v-model="scope.row.amount" />
  220. </div>
  221. </template>
  222. </el-table-column>
  223. <el-table-column align="left">
  224. <template #default="scope">
  225. <div>
  226. <el-button
  227. type="danger"
  228. size="small"
  229. icon="delete"
  230. @click="deleteBtn(form.card_list,scope.$index)"
  231. >删除</el-button>
  232. </div>
  233. </template>
  234. </el-table-column>
  235. </el-table>
  236. </div>
  237. <el-form ref="apiForm" :model="form" :rules="rules" label-width="100px" :inline="true">
  238. <el-form-item label="上传机房" prop="is_upload_xjf">
  239. <el-radio-group v-model="form.is_upload_xjf">
  240. <el-radio border label="1">是</el-radio>
  241. <el-radio border label="-1">否</el-radio>
  242. </el-radio-group>
  243. </el-form-item>
  244. <el-form-item label="上传WT" prop="is_upload_wt" >
  245. <el-radio-group v-model="form.is_upload_wt">
  246. <el-radio border label="1">是</el-radio>
  247. <el-radio border label="-1">否</el-radio>
  248. </el-radio-group>
  249. </el-form-item>
  250. </el-form>
  251. </el-tab-pane>
  252. </el-tabs>
  253. <template #footer>
  254. <div class="dialog-footer">
  255. <el-button size="small" @click="closeDialog">取 消</el-button>
  256. <el-button size="small" type="primary" @click="enterDialog">确 定</el-button>
  257. </div>
  258. </template>
  259. </el-dialog>
  260. <el-dialog v-model="accountFormVisible" :before-close="closeAccount" :title="accountTitle">
  261. <el-table :data="tableData1">
  262. <el-table-column align="left" label="账号" show-overflow-tooltip min-width="160" prop="account" />
  263. <el-table-column align="left" label="密码" show-overflow-tooltip min-width="160" prop="password" />
  264. </el-table>
  265. <template #footer>
  266. <div class="dialog-footer">
  267. <el-button size="small" @click="closeAccount">取 消</el-button>
  268. </div>
  269. </template>
  270. </el-dialog>
  271. </div>
  272. </template>
  273. <script>
  274. export default {
  275. name: 'TargetTask',
  276. }
  277. </script>
  278. <script setup>
  279. import {
  280. getGameTaskTargetById,
  281. updateGameTaskTarget,
  282. getGameTaskTargetList,
  283. taskResetFee,
  284. getFeeAccountList,
  285. taskTargetExport
  286. } from '@/api/task'
  287. import {
  288. selectResponsiblePerson,
  289. } from '@/api/responsiblePerson'
  290. import { toSQLLine } from '@/utils/stringFun'
  291. import warningBar from '@/components/warningBar/warningBar.vue'
  292. import { ref } from 'vue'
  293. import dayjs from "dayjs";
  294. import { ElMessage, ElMessageBox } from 'element-plus'
  295. const statusFiletr = (value) => {
  296. const target = statusOptions.value.filter(item => item.value === value)[0]
  297. return target && `${target.label}`
  298. }
  299. const statusOptions = ref([
  300. {
  301. value: -1,
  302. label: '否',
  303. type: 'wain'
  304. },
  305. {
  306. value: 1,
  307. label: '是',
  308. type: 'success'
  309. },
  310. ])
  311. const ResponsiblePerson = ref([])
  312. const apis = ref([])
  313. const rules = ref({
  314. task_id: [{ required: true, message: '输入任务ID', trigger: 'blur' }],
  315. task_name: [
  316. { required: true, message: '请输入任务名称', trigger: 'blur' }
  317. ],
  318. user: [
  319. { required: true, message: '请输入使用者', trigger: 'blur' }
  320. ],
  321. new_retained: [
  322. { required: true, message: '请选择重要参数', trigger: 'blur' }
  323. ],
  324. game_name: [
  325. { required: true, message: '请选择游戏', trigger: 'blur' }
  326. ],
  327. date: [
  328. { required: true, message: '请选择开始时间', trigger: 'blur' }
  329. ],
  330. game_port_id: [
  331. { required: true, message: '请选择游戏端口', trigger: 'blur' }
  332. ],
  333. account_type: [
  334. { required: true, message: '请选择账号类型', trigger: 'blur' }
  335. ],
  336. login_method: [
  337. { required: true, message: '请选择登录方式', trigger: 'blur' }
  338. ],
  339. tx_channel: [
  340. { required: true, message: '请输入腾讯渠道号', trigger: 'blur' }
  341. ],
  342. mz_channel: [
  343. { required: true, message: '请输入魅族渠道号', trigger: 'blur' }
  344. ],
  345. new_target: [
  346. { required: true, message: '请输入新增目标', trigger: 'blur' }
  347. ],
  348. pay_target: [
  349. { required: true, message: '请输入付费目标', trigger: 'blur' }
  350. ],
  351. retained_target: [
  352. { required: true, message: '请输入留存目标', trigger: 'blur' }
  353. ],
  354. retained_target: [
  355. { required: true, message: '请输入付费单价', trigger: 'blur' }
  356. ]
  357. })
  358. const form = ref({
  359. task_id: '',
  360. task_name: '',
  361. user: '',
  362. new_retained: '1',
  363. game_name:'',
  364. date:'',
  365. game_port_id:'',
  366. account_type:'',
  367. login_method:'',
  368. tx_channel:'',
  369. tx_game_id:'',
  370. mz_channel:'',
  371. mz_game_id:'',
  372. game_id_xmy:'',
  373. new_target:'',
  374. pay_target:'',
  375. retained_target:'',
  376. pay_price:'',
  377. free:-1
  378. })
  379. const GamePortOptions = ref([
  380. {
  381. id: 1,
  382. name: '腾讯游戏',
  383. },
  384. {
  385. id: 2,
  386. name: '360游戏',
  387. },
  388. {
  389. id: 3,
  390. name: '网易游戏',
  391. },
  392. {
  393. id: 4,
  394. name: '酷派游戏',
  395. },
  396. {
  397. id: 5,
  398. name: '魅族游戏',
  399. },
  400. ])
  401. const searchStatusOptions = ref([
  402. {
  403. value: -1,
  404. label: '未完成',
  405. type: 'wain'
  406. },
  407. {
  408. value: 1,
  409. label: '已完成',
  410. type: 'success'
  411. },
  412. ])
  413. const accountTypeOptions = ref([
  414. {
  415. id: 1,
  416. name: '小绵羊账号',
  417. },
  418. {
  419. id: 2,
  420. name: 'QQ账号',
  421. },
  422. {
  423. id: 3,
  424. name: '魅族账号',
  425. },
  426. {
  427. id: 4,
  428. name: '华为账号',
  429. },
  430. {
  431. id: 5,
  432. name: '测试类型',
  433. },
  434. {
  435. id: 6,
  436. name: '微信',
  437. },
  438. {
  439. id: 7,
  440. name: '微信+QQ',
  441. },
  442. ])
  443. const loginMethodOptions = ref([
  444. {
  445. id: 1,
  446. name: '小绵羊登录',
  447. },
  448. {
  449. id: 2,
  450. name: '魅族账号登录',
  451. },
  452. {
  453. id: 3,
  454. name: 'QQ账号登录',
  455. },
  456. {
  457. id: 4,
  458. name: '网易账号登录',
  459. },
  460. {
  461. id: 5,
  462. name: '微信授权登录',
  463. },
  464. {
  465. id: 6,
  466. name: '微信+QQ授权登录',
  467. },
  468. ])
  469. const FreeMethodOptions = ref([
  470. {
  471. id: 1,
  472. name: 'QQ卡',
  473. },
  474. {
  475. id: 2,
  476. name: '微信',
  477. },
  478. {
  479. id: 3,
  480. name: '支付宝',
  481. },
  482. {
  483. id: 4,
  484. name: '银行卡',
  485. },
  486. ])
  487. // 新增可控按钮
  488. const addBtn = (form) => {
  489. if (!form.card_list) {
  490. form.card_list = []
  491. }
  492. form.card_list.push({
  493. card: '',
  494. amount: 0
  495. })
  496. }
  497. // 删除可控按钮
  498. const deleteBtn = async(btns, index) => {
  499. const btn = btns[index]
  500. if (btn.ID === 0) {
  501. btns.splice(index, 1)
  502. return
  503. }
  504. btns.splice(index, 1)
  505. }
  506. const type = ref('')
  507. const page = ref(1)
  508. const total = ref(0)
  509. const pageSize = ref(10)
  510. const tableData = ref([])
  511. const tableData1 = ref([])
  512. const searchInfo = ref({})
  513. const onReset = () => {
  514. searchInfo.value = {}
  515. }
  516. // 搜索
  517. const onSubmit = () => {
  518. page.value = 1
  519. pageSize.value = 10
  520. searchInfo.value.task_id = Number(searchInfo.value.task_id)
  521. if (typeof searchInfo.value.date != "undefined") {
  522. searchInfo.value.date[0] = dayjs(searchInfo.value.date[0]).format(
  523. "YYYY-MM-DD"
  524. );
  525. searchInfo.value.date[1] = dayjs(searchInfo.value.date[1]).format(
  526. "YYYY-MM-DD"
  527. );
  528. }
  529. getTableData()
  530. }
  531. // 分页
  532. const handleSizeChange = (val) => {
  533. pageSize.value = val
  534. getTableData()
  535. }
  536. const handleCurrentChange = (val) => {
  537. page.value = val
  538. getTableData()
  539. }
  540. // 排序
  541. const sortChange = ({ prop, order }) => {
  542. if (prop) {
  543. if (prop === 'id') {
  544. prop = 'id'
  545. }
  546. searchInfo.value.orderKey = toSQLLine(prop)
  547. searchInfo.value.desc = order === 'descending'
  548. }
  549. getTableData()
  550. }
  551. // 查询
  552. const getTableData = async() => {
  553. const table = await getGameTaskTargetList({ page: page.value, pageSize: pageSize.value, ...searchInfo.value })
  554. if (table.code === 0) {
  555. tableData.value = table.data.list
  556. total.value = table.data.total
  557. page.value = table.data.page
  558. pageSize.value = table.data.pageSize
  559. }
  560. }
  561. getTableData()
  562. const getResponsiblePerson = async() => {
  563. const table = await selectResponsiblePerson()
  564. if (table.code === 0) {
  565. ResponsiblePerson.value = table.data
  566. }
  567. }
  568. getResponsiblePerson()
  569. // 批量操作
  570. const handleSelectionChange = (val) => {
  571. apis.value = val
  572. }
  573. const handleExcelExport = async() => {
  574. var fileName = Date.parse(new Date()) + "-task.xlsx"
  575. if(searchInfo.value.create_date == null){
  576. let dt = new Date()
  577. var y = dt.getFullYear()
  578. var mt = (dt.getMonth() + 1).toString().padStart(2,'0')
  579. var day = dt.getDate().toString().padStart(2,'0')
  580. var timeStr = y + "-" + mt + "-" + day
  581. fileName = timeStr + "-task.xlsx"
  582. }else{
  583. fileName = searchInfo.value.create_date + "-task.xlsx"
  584. }
  585. taskTargetExport({ page: page.value, pageSize: pageSize.value, ...searchInfo.value },fileName)
  586. }
  587. const shortcuts = [
  588. {
  589. text: "今日",
  590. value: () => {
  591. const end = new Date();
  592. const start = new Date();
  593. return [start, end];
  594. },
  595. },
  596. {
  597. text: "最近一周",
  598. value: () => {
  599. const end = new Date();
  600. const start = new Date();
  601. start.setTime(start.getTime() - 3600 * 1000 * 24 * 7);
  602. return [start, end];
  603. },
  604. },
  605. {
  606. text: "最近一月",
  607. value: () => {
  608. const end = new Date();
  609. const start = new Date();
  610. start.setTime(start.getTime() - 3600 * 1000 * 24 * 30);
  611. return [start, end];
  612. },
  613. },
  614. ];
  615. const deleteVisible = ref(false)
  616. const onClose = async() => {
  617. const ids = apis.value.map(item => item.id)
  618. console.log(ids)
  619. const status = -1
  620. const res = await colsePc({ ids,status })
  621. if (res.code === 0) {
  622. ElMessage({
  623. type: 'success',
  624. message: res.msg
  625. })
  626. if (tableData.value.length === ids.length && page.value > 1) {
  627. page.value--
  628. }
  629. deleteVisible.value = false
  630. getTableData()
  631. }
  632. }
  633. const onOpen = async() => {
  634. const ids = apis.value.map(item => item.id)
  635. console.log(ids)
  636. const status = 1
  637. const res = await colsePc({ ids,status })
  638. if (res.code === 0) {
  639. ElMessage({
  640. type: 'success',
  641. message: res.msg
  642. })
  643. if (tableData.value.length === ids.length && page.value > 1) {
  644. page.value--
  645. }
  646. deleteVisible.value = false
  647. getTableData()
  648. }
  649. }
  650. // 弹窗相关
  651. const apiForm = ref(null)
  652. const initForm = () => {
  653. apiForm.value.resetFields()
  654. form.value = {
  655. task_id: '',
  656. task_name: '',
  657. user: '',
  658. new_retained: '1',
  659. game_name:'',
  660. date:'',
  661. game_port_id:'',
  662. account_type:'',
  663. login_method:'',
  664. tx_channel:'',
  665. tx_game_id:'',
  666. mz_channel:'',
  667. mz_game_id:'',
  668. game_id_xmy:'',
  669. new_target:'',
  670. pay_target:'',
  671. retained_target:'',
  672. pay_price:'',
  673. }
  674. }
  675. const dialogTitle = ref('新增')
  676. const dialogFormVisible = ref(false)
  677. const accountFormVisible = ref(false)
  678. const openDialog = (key) => {
  679. switch (key) {
  680. case 'addCard':
  681. dialogTitle.value = '新增'
  682. form.value.is_add = 1
  683. break
  684. case 'edit':
  685. dialogTitle.value = '编辑'
  686. form.value.is_add = 0
  687. break
  688. default:
  689. break
  690. }
  691. type.value = key
  692. dialogFormVisible.value = true
  693. }
  694. const closeDialog = () => {
  695. initForm()
  696. dialogFormVisible.value = false
  697. }
  698. const closeAccount = () => {
  699. accountFormVisible.value = false
  700. }
  701. const editCardFunc = async(row) => {
  702. const res = await getGameTaskTargetById({ id: row.task_id, create_date:row.create_date })
  703. if (res.code === 0) {
  704. form.value = res.data
  705. openDialog('edit')
  706. }
  707. }
  708. const accountListFunc = async(row) => {
  709. const res = await getFeeAccountList({ id: row.task_id, create_date:row.create_date })
  710. if (res.code === 0) {
  711. tableData1.value = res.data
  712. dialogTitle.value = '可付费账号'
  713. accountFormVisible.value = true
  714. }
  715. }
  716. const enterDialog = async() => {
  717. apiForm.value.validate(async valid => {
  718. form.value.task_id = Number(form.value.task_id)
  719. form.value.new_target = Number(form.value.new_target)
  720. form.value.pay_price = Number(form.value.pay_price)
  721. form.value.pay_target = Number(form.value.pay_target)
  722. form.value.retained_target = Number(form.value.retained_target)
  723. form.value.hand_new_complete = Number(form.value.hand_new_complete)
  724. form.value.hand_retained_complete = Number(form.value.hand_retained_complete)
  725. form.value.hand_pay_complete = Number(form.value.hand_pay_complete)
  726. form.value.hand_amount_total = Number(form.value.hand_amount_total)
  727. form.value.is_free = Number(form.value.is_free)
  728. form.value.free_method = Number(form.value.free_method)
  729. form.value.is_upload_xjf = Number(form.value.is_upload_xjf)
  730. form.value.is_upload_wt = Number(form.value.is_upload_wt)
  731. if (valid) {
  732. switch (type.value) {
  733. case 'edit':
  734. {
  735. const res = await updateGameTaskTarget(form.value)
  736. if (res.code === 0) {
  737. ElMessage({
  738. type: 'success',
  739. message: '编辑成功',
  740. showClose: true
  741. })
  742. }
  743. getTableData()
  744. closeDialog()
  745. }
  746. break
  747. default:
  748. // eslint-disable-next-line no-lone-blocks
  749. {
  750. ElMessage({
  751. type: 'error',
  752. message: '未知操作',
  753. showClose: true
  754. })
  755. }
  756. break
  757. }
  758. }
  759. })
  760. }
  761. const resetFeeFunc = async(row) => {
  762. ElMessageBox.confirm('此操作将重置付费, 是否继续?', '提示', {
  763. confirmButtonText: '确定',
  764. cancelButtonText: '取消',
  765. type: 'warning'
  766. })
  767. .then(async() => {
  768. const res = await taskResetFee(row)
  769. if (res.code === 0) {
  770. ElMessage({
  771. type: 'success',
  772. message: '重置成功!'
  773. })
  774. getTableData()
  775. }
  776. })
  777. }
  778. const switchEnable = async(row) => {
  779. const res = await statusOperation({task_id:row.task_id, status:row.status})
  780. if (res.code === 0) {
  781. ElMessage({ type: 'success', message: `${row.status === -1 ? '停止' : '开启'}成功` })
  782. }
  783. }
  784. const links = ref([])
  785. const querySearch = (queryString, cb) => {
  786. const results = queryString
  787. ? links.value.filter(createFilter(queryString))
  788. : links.value
  789. // call callback function to return suggestion objects
  790. cb(results)
  791. }
  792. const createFilter = (queryString) => {
  793. return (restaurant) => {
  794. return (
  795. restaurant.value.toLowerCase().indexOf(queryString.toLowerCase()) === 0
  796. )
  797. }
  798. }
  799. const loadAll = () => {
  800. return [
  801. { game_id: 1, game_name: '龙腾传世' },
  802. { game_id: 2, game_name: '龙皇传说' },
  803. { game_id: 3, game_name: '龙之国物语' },
  804. { game_id: 4, game_name: '黑月' },
  805. { game_id: 5, game_name: '麻将来了' },
  806. { game_id: 6, game_name: '鸿途归来' },
  807. { game_id: 7, game_name: '魔力宝贝归来' },
  808. ]
  809. }
  810. const handleSelect = (item) => {
  811. form.value.game_id = item.game_id
  812. console.log(item)
  813. }
  814. const handleIconClick = (ev) => {
  815. console.log(ev)
  816. }
  817. links.value = loadAll()
  818. </script>
  819. <style scoped lang="scss">
  820. .button-box {
  821. padding: 10px 20px;
  822. .el-button {
  823. float: right;
  824. }
  825. }
  826. :deep(.el-tabs__nav-scroll){
  827. width:35%;
  828. margin:0 auto
  829. }
  830. :deep(.el-tabs__nav-scroll)
  831. .warning {
  832. color: #dc143c;
  833. }
  834. </style>