list.vue 26 KB

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