list.vue 26 KB

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