Browse Source

battlePass

master
linquan 2 days ago
parent
commit
05af66fa0e
  1. 2585
      package-lock.json
  2. 2
      package.json
  3. 10
      src/api/game/gameConfig.ts
  4. 8
      src/api/game/order.ts
  5. 1
      src/views/gameCustom/feedback/index.vue
  6. 184
      src/views/gameOrder/getHuaWeiOrderList/index.vue
  7. 4
      src/views/gameOrder/getTransactionId/index.vue
  8. 158
      src/views/gameOrder/orderList/index.vue
  9. 2
      src/views/gameRole/role/index.vue
  10. 198
      src/views/serverBattlePass/log/index.vue
  11. 490
      src/views/serverBattlePass/update/index.vue

2585
package-lock.json generated

File diff suppressed because it is too large Load Diff

2
package.json

@ -22,7 +22,7 @@
"echarts": "^5.3.0",
"echarts-gl": "^2.0.9",
"echarts-wordcloud": "^2.0.0",
"element-plus": "2.3.4",
"element-plus": "2.1.1",
"express-jwt": "^8.5.1",
"jsonwebtoken": "^9.0.2",
"jsplumb": "^2.15.6",

10
src/api/game/gameConfig.ts

@ -1,7 +1,5 @@
import request from '/@/utils/request';
export function gameGetRank(params: object) {
return request({
url: '/api/v1/game/rank/get',
@ -225,3 +223,11 @@ export function gameGMGetBattlePass(params: object) {
params: params,
});
}
export function gameGMCheckPeriodIdBattlePass(params: object) {
return request({
url: '/api/v1/game/battlePass/checkPeriodId',
method: 'get',
params: params,
});
}

8
src/api/game/order.ts

@ -138,3 +138,11 @@ export function getTransactionId(params: object) {
params: params,
});
}
export function getHuaWeiOrderList(params: object) {
return request({
url: '/api/v1/game/order/getHuaWeiOrderList',
method: 'get',
params: params,
});
}

1
src/views/gameCustom/feedback/index.vue

@ -7,7 +7,6 @@
<el-form-item label="起始时间" prop="lowTime">
<el-date-picker type="datetime" size="large" v-model="tableData.param.lowTime" format="YYYY/MM/DD HH:mm:ss" value-format="x" />
</el-form-item>
<el-form-item label="终止时间" prop="time">
<el-date-picker type="datetime" v-model="tableData.param.upTime" format="YYYY/MM/DD HH:mm:ss" value-format="x" />
</el-form-item>

184
src/views/gameOrder/getHuaWeiOrderList/index.vue

@ -0,0 +1,184 @@
<template>
<div class="game-order-container">
<el-card shadow="hover">
<div class="game-order-search mb15">
<el-form label-position="right" :inline="true">
<el-form-item label="起始时间" prop="times">
<el-date-picker
type="datetimerange"
size="default"
v-model="tableData.param.times"
style="width: 400px"
range-separator="-"
start-placeholder="开始"
end-placeholder="结束"
format="YYYY-MM-DD HH:mm:ss"
value-format="x"
/>
</el-form-item>
<el-form-item label="商户单号" prop="order">
<el-input size="default" v-model="tableData.param.order" placeholder="请输入商户单号" clearable />
</el-form-item>
<el-form-item>
<el-button size="default" type="primary" class="ml10" @click="orderList">
<el-icon>
<ele-Search />
</el-icon>
查询
<div v-if="!!tableData.param.continuationToken">下一页</div>
</el-button>
</el-form-item>
</el-form>
</div>
<el-table :data="tableData.data" style="width: 100%" stripe border>
<el-table-column prop="orderNo" label="商户单号" width="300"></el-table-column>
<el-table-column prop="productName" label="商品名称" width="180"></el-table-column>
<el-table-column prop="tradeType" label="交易类型" width="100">
<template #default="scope">
<div v-if="scope.row.tradeType">支付</div>
<div v-else>退款</div>
</template>
</el-table-column>
<el-table-column prop="tradeState" label="订单状态" width="100">
<template #default="scope">
<div v-if="scope.row.tradeState==0">成功</div>
<div v-else-if="scope.row.tradeState==2">失败</div>
<div v-else-if="scope.row.tradeState==4">未支付</div>
<div v-else>{{scope.row.tradeState}}</div>
</template>
</el-table-column>
<el-table-column prop="payMoney" label="支付金额(元)" width="120"></el-table-column>
<el-table-column prop="couponAmt" label="优惠券金额(元)" width="130"></el-table-column>
<el-table-column prop="currency" label="币种" width="70"></el-table-column>
<el-table-column prop="country" label="country" width="100"></el-table-column>
<el-table-column prop="orderTime" label="下单时间" show-overflow-tooltip width="200">
<template #default="scope">
{{new Date(scope.row.orderTime).toLocaleString()}}
</template>
</el-table-column>
<el-table-column prop="tradeTime" label="支付时间" show-overflow-tooltip width="200">
<template #default="scope">
{{new Date(scope.row.tradeTime).toLocaleString()}}
</template>
</el-table-column>
</el-table>
</el-card>
</div>
</template>
<script lang="ts">
import { toRefs, reactive, onMounted, defineComponent } from 'vue';
import { allChannelList, ServerCategorize, serverList, ServerList } from '/@/utils/game';
import RechargeConfigCategory from '/@/api/config/RechargeConfigCategory.json';
import { gSwitchServer } from '/@/utils/utils';
import { getHuaWeiOrderList } from '/@/api/game/order';
import { ElMessage } from 'element-plus/es';
//
interface TableData {
id: string;
CreateTime: string;
CfgId: number;
Rmb: number;
SilverPiece: number;
Identity: string;
timeStr: string;
uid: string;
RealName: string;
StringId: string;
}
interface TableDataState {
serverSwitch: number;
serverCategorize: object;
tableData: {
data: Array<TableData>;
total: number;
param: {
times: string[];
order: string;
continuationToken: string;
};
order: object;
};
servers: object;
channels: object;
rechargeInfo: object[];
}
export default defineComponent({
name: 'apiV1GameOrderHuaWeiOrder',
setup() {
const state = reactive<TableDataState>({
serverSwitch: 0,
serverCategorize: ServerCategorize,
tableData: {
data: [],
total: 0,
param: {
times: [],
order: '',
continuationToken: '',
},
order: [],
},
servers: ServerList,
channels: [],
rechargeInfo: RechargeConfigCategory,
});
const orderList = (reset) => {
if (!reset) {
state.tableData.total = 0;
}
state.tableData.param.startAt = state.tableData.param.times[0];
state.tableData.param.endAt = state.tableData.param.times[1];
if (!state.tableData.param.endAt || !state.tableData.param.startAt) {
ElMessage.error('请填写时间!');
return;
}
if (state.tableData.param.endAt - state.tableData.param.startAt > 48 * 60 * 60 * 1000) {
ElMessage.error('时间指定在48小时之内!');
return;
}
getHuaWeiOrderList(state.tableData.param).then((res) => {
if (!res.data || !res.data.order) {
return;
}
console.log(res);
state.tableData.param.continuationToken = res.data.order.continuationToken;
state.tableData.data = res.data.order.orderInfoList || [];
if (state.tableData.param.order.length > 0) {
state.tableData.data = state.tableData.data.filter((item) => {
return item.orderNo == state.tableData.param.order;
});
if (state.tableData.data.length == 0 && !!state.tableData.param.continuationToken && state.tableData.total < 5) {
orderList(true);
state.tableData.total++;
}
}
});
};
//
onMounted(() => {
serverList().then((res) => {
state.servers = res;
});
allChannelList().then((res) => {
state.channels = res;
});
});
const switchServer = () => {
return gSwitchServer(state.serverSwitch, state.servers);
};
return {
switchServer,
orderList,
...toRefs(state),
};
},
});
</script>

4
src/views/gameOrder/getTransactionId/index.vue

@ -3,8 +3,8 @@
<el-card shadow="hover">
<div class="game-order-search mb15">
<el-form label-position="right" label-width="300px" style="max-width: 600px">
<el-form-item label="订单Id" prop="channel">
<el-input size="default" v-model="tableData.param.order" placeholder="请输入订单Id" clearable />
<el-form-item label="商户单号" prop="channel">
<el-input size="default" v-model="tableData.param.order" placeholder="请输入商户单号" clearable />
</el-form-item>
<el-form-item>
<el-button size="default" type="primary" class="ml10" @click="orderList">

158
src/views/gameOrder/orderList/index.vue

@ -2,19 +2,18 @@
<div class="game-order-container">
<el-card shadow="hover">
<div class="game-order-search mb15">
<el-form :inline="true" >
<el-form-item label="渠道" prop="channel">
<el-form :inline="true">
<el-form-item label="渠道" prop="channel" >
<el-select v-model="tableData.param.channel" class="m-2" placeholder="选择渠道">
<el-option v-for="item in channels" :key="item.value" :label="item.label" :value="item.value"/>
<el-option v-for="item in channels" :key="item.value" :label="item.label" :value="item.value" />
</el-select>
</el-form-item>
<!-- <el-form-item label="账号">-->
<!-- <el-input size="default" v-model="tableData.param.account" placeholder="请输入账号" class="w-50 m-2"-->
<!-- clearable/>-->
<!-- </el-form-item>-->
<el-form-item label="uid">
<el-input size="default" v-model="tableData.param.uid" placeholder="请输入uid" class="w-50 m-2"
clearable/>
<el-form-item label="uid" >
<el-input size="default" v-model="tableData.param.uid" placeholder="请输入uid" class="w-50 m-2" clearable />
</el-form-item>
<!-- <el-form-item label="起始时间" prop="lowTime">-->
<!-- <el-date-picker type="datetime" size="large" v-model="tableData.param.lowTime" format="YYYY/MM/DD HH:mm:ss"-->
@ -24,32 +23,41 @@
<!-- <el-date-picker type="datetime" v-model="tableData.param.upTime" format="YYYY/MM/DD HH:mm:ss"-->
<!-- value-format="x"/>-->
<!-- </el-form-item>-->
<el-form-item label="订单id">
<el-input size="default" v-model="tableData.param.orderId" placeholder="请输入渠道订单id" class="w-50 m-2"
clearable/>
<el-form-item label="订单id" >
<el-input size="default" v-model="tableData.param.orderId" placeholder="请输入渠道订单id" class="w-50 m-2" clearable />
</el-form-item>
<el-form-item label="渠道订单id">
<el-input size="default" v-model="tableData.param.externalOrderId" placeholder="请输入渠道订单id"
class="w-50 m-2"
clearable/>
<el-form-item label="渠道订单id" >
<el-input size="default" v-model="tableData.param.externalOrderId" placeholder="请输入渠道订单id" class="w-50 m-2" clearable />
</el-form-item>
<el-form-item label="订单状态">
<el-form-item label="IOS商户单号" prop="order">
<el-input size="default" v-model="tableData.param.order" placeholder="请输入商户单号" clearable />
</el-form-item>
<el-form-item label="订单状态" >
<el-select v-model="tableData.param.status" class="m-2" placeholder="选择订单状态">
<el-option label="全部" :value="0"/>
<el-option label="等待充值" :value="1"/>
<el-option label="充值成功" :value="2"/>
<el-option label="充值失败" :value="100"/>
<el-option label="全部" :value="0" />
<el-option label="等待充值" :value="1" />
<el-option label="充值成功" :value="2" />
<el-option label="充值失败" :value="100" />
<!-- <el-option label="失效订单" :value="3"/>-->
<el-option label="金额不匹配订单" :value="220110"/>
<el-option label="金额不匹配订单" :value="220110" />
</el-select>
</el-form-item>
<el-form-item>
<el-button size="default" type="primary" class="ml10" @click="orderList">
<el-button v-if="!tableData.param.order" size="default" type="primary" class="ml10" @click="orderList">
<el-icon>
<ele-Search/>
<ele-Search />
</el-icon>
查询
</el-button>
<el-button v-if="tableData.param.order" size="default" type="primary" class="ml10" @click="transactionList">
<el-icon>
<ele-Search />
</el-icon>
查询IOS订单
</el-button>
</el-form-item>
<el-form-item>
<div v-if="tableData.order">渠道订单Id: {{ tableData.order.transactionId }}</div>
</el-form-item>
</el-form>
</div>
@ -74,70 +82,72 @@
<!-- </el-table-column>-->
<el-table-column prop="status" label="状态" show-overflow-tooltip width="120">
<template #default="scope">
<div v-if="scope.row.status==1">
<div v-if="new Date(scope.row.timeStr).getTime()+900000 <= Date.now() ">
<el-tooltip :content="scope.row.status+''" placement="top">
<div v-if="scope.row.status == 1">
<div v-if="new Date(scope.row.timeStr).getTime() + 900000 <= Date.now()">
<el-tooltip :content="scope.row.status + ''" placement="top">
<span style="color: #a8a17b">等待充值</span>
</el-tooltip>
</div>
<div v-else>
<el-tooltip :content="scope.row.status+''" placement="top">
<el-button key="plain" type="text" @click="changeState(scope.row.tradeNo,3)">等待充值</el-button>
<el-tooltip :content="scope.row.status + ''" placement="top">
<el-button key="plain" type="text" @click="changeState(scope.row.tradeNo, 3)">等待充值</el-button>
</el-tooltip>
</div>
</div>
<div v-else-if="scope.row.status==2">
<el-tooltip :content="scope.row.status+''" placement="top"><span style="color: #024a08">充值成功</span>
</el-tooltip>
<div v-else-if="scope.row.status == 2">
<el-tooltip :content="scope.row.status + ''" placement="top"><span style="color: #024a08">充值成功</span> </el-tooltip>
</div>
<div v-else-if="scope.row.status==3">
<el-tooltip :content="scope.row.status+''" placement="top"><span style="color: #a8a17b">失效订单</span>
</el-tooltip>
<div v-else-if="scope.row.status == 3">
<el-tooltip :content="scope.row.status + ''" placement="top"><span style="color: #a8a17b">失效订单</span> </el-tooltip>
</div>
<div v-else-if="scope.row.status==220110">
<el-tooltip :content="scope.row.status+''" placement="top">
<el-button key="plain" type="text" @click="changeState(scope.row.tradeNo,2, '金额不匹配')">金额不匹配
</el-button>
<div v-else-if="scope.row.status == 220110">
<el-tooltip :content="scope.row.status + ''" placement="top">
<el-button key="plain" type="text" @click="changeState(scope.row.tradeNo, 2, '金额不匹配')">金额不匹配 </el-button>
</el-tooltip>
</div>
<div v-else>
<el-tooltip :content="scope.row.status+''" placement="top">
<span style='color: #e60000'>充值失败</span>
<el-tooltip :content="scope.row.status + ''" placement="top">
<span style="color: #e60000">充值失败</span>
</el-tooltip>
</div>
</template>
</el-table-column>
<el-table-column prop="channel" label="渠道" show-overflow-tooltip width="120">
<template #default="scope">
<span>{{ channels.find(r => r.value == scope.row.channel)?.label }}</span>
<span>{{ channels.find((r) => r.value == scope.row.channel)?.label }}</span>
</template>
</el-table-column>
<el-table-column prop="server" label="区服" show-overflow-tooltip width="120">
<template #default="scope">
<span>{{ servers.find(r => r.id == scope.row.server).name }}</span>
<span>{{ servers.find((r) => r.id == scope.row.server).name }}</span>
</template>
</el-table-column>
</el-table>
<el-row justify="space-evenly">
<el-pagination :hide-on-single-page="true" v-model:page-size="tableData.param.pageSize"
<el-pagination
:hide-on-single-page="true"
v-model:page-size="tableData.param.pageSize"
v-model:current-page="tableData.param.pageNum"
:pager-count="5" @current-change="orderList" layout="total, prev, pager, next"
:total="tableData.total"/>
:pager-count="5"
@current-change="orderList"
layout="total, prev, pager, next"
:total="tableData.total"
/>
</el-row>
</el-card>
</div>
</template>
<script lang="ts">
import {toRefs, reactive, onMounted, defineComponent,} from 'vue';
import {gameOrderList, gameRechargeChangeStateDelete} from "/@/api/game/order";
import {allChannelList, serverList, ServerList} from "/@/utils/game";
import RechargeConfigCategory from "/@/api/config/RechargeConfigCategory.json";
import {ElMessage, ElMessageBox} from "element-plus/es";
import { toRefs, reactive, onMounted, defineComponent } from 'vue';
import {gameOrderList, gameRechargeChangeStateDelete, getTransactionId} from '/@/api/game/order';
import { allChannelList, serverList, ServerList } from '/@/utils/game';
import RechargeConfigCategory from '/@/api/config/RechargeConfigCategory.json';
import { ElMessage, ElMessageBox } from 'element-plus/es';
//
interface TableData {
id: string
id: string;
CreateTime: string;
CfgId: number;
Rmb: number;
@ -154,7 +164,7 @@ interface TableDataState {
data: Array<TableData>;
total: number;
param: {
uid: number;
uid: string;
channel: string;
orderId: string;
externalOrderId: string;
@ -164,8 +174,9 @@ interface TableDataState {
upTime: number;
pageNum: number;
pageSize: number;
order: string;
};
order: object;
};
servers: object;
channels: object;
@ -182,24 +193,36 @@ export default defineComponent({
data: [],
total: 0,
param: {
uid: 0,
channel: "",
orderId: "",
account: "",
uid: "",
channel: '',
orderId: '',
account: '',
lowTime: 0,
upTime: 0,
pageSize: 10,
pageNum: 1,
order: '',
},
order: '',
},
servers: ServerList,
channels: [],
rechargeInfo: RechargeConfigCategory,
});
const transactionList = () => {
state.tableData.param.order = state.tableData.param.order.substring(0,10)
getTransactionId(state.tableData.param).then((res) => {
console.log(res);
state.tableData.order = res.data.order;
if (res.data.order && res.data.order.transactionId) {
state.tableData.param.externalOrderId = res.data.order.transactionId;
}
});
};
const orderList = () => {
const data: Array<TableData> = [];
gameOrderList(state.tableData.param).then(res => {
gameOrderList(state.tableData.param).then((res) => {
console.log(res);
state.tableData.total = Number(res.data.total) || 0;
const list = res.data.list || [];
@ -219,50 +242,49 @@ export default defineComponent({
});
});
state.tableData.data = data;
})
});
};
//
onMounted(() => {
serverList().then(res => {
serverList().then((res) => {
state.servers = res;
});
allChannelList().then(res => {
allChannelList().then((res) => {
state.channels = res;
});
});
const changeState = (order: string, state: number, remark: string) => {
if (state != 3 && state != 2) {
return
return;
}
if (state == 3) {
let mess = "是否确认订单失效?,点击确认后本条订单失效。";
let mess = '是否确认订单失效?,点击确认后本条订单失效。';
ElMessageBox.confirm(mess).then(() => {
gameRechargeChangeStateDelete({order: order, state: state}).then(res => {
gameRechargeChangeStateDelete({ order: order, state: state }).then((res) => {
if (res.data.data == 1) {
ElMessage.success('发送成功');
}
orderList();
})
});
});
} else if (state == 2) {
ElMessageBox.prompt('请输入修改成功理由', '提示', {
confirmButtonText: '确认',
cancelButtonText: '取消',
inputErrorMessage: 'Invalid http request',
}).then(({value}) => {
gameRechargeChangeStateDelete({order: order, state: state, remark: remark + ", " + value}).then(res => {
}).then(({ value }) => {
gameRechargeChangeStateDelete({ order: order, state: state, remark: remark + ', ' + value }).then((res) => {
if (res.data.data == 1) {
ElMessage.success('发送成功');
}
orderList();
})
});
});
}
};
return {
transactionList,
orderList,
changeState,
...toRefs(state),

2
src/views/gameRole/role/index.vue

@ -738,7 +738,6 @@ export default defineComponent({
name: 'apiV1GameRoleRole',
setup: function () {
const state = reactive<TableDataState>({
serverSwitch: 0,
item: { listShow: true },
queryParams: {
id: '',
@ -807,6 +806,7 @@ export default defineComponent({
channels: [],
servers: [],
serverCategorize: ServerCategorize,
serverSwitch: 0,
});
const roleList = (value: number) => {
if (!value) {

198
src/views/serverBattlePass/log/index.vue

@ -0,0 +1,198 @@
<template>
<div class="system-edit-post-container">
<el-form size="default" label-width="80px">
<el-card shadow="hover" header="战令历史">
<template #header>
战令历史
<el-button v-show="item.show === false" @click="item.show = true" class="button-caret" type="text">
<el-icon>
<ele-CaretBottom />
</el-icon>
</el-button>
<el-button v-show="item.show === true" @click="item.show = false" class="button-caret" type="text">
<el-icon>
<ele-CaretTop />
</el-icon>
</el-button>
</template>
<div v-show="item.show">
<div class="flex-warp">
<el-form :inline="true">
<el-form-item label="服务器">
<el-select v-model="serverSwitch" class="m-2" placeholder="选择服务器" size="large" style="width: 80px">
<el-option v-for="item in serverCategorize" :key="item.value" :label="item.label" :value="item.value" />
</el-select>
<el-select v-model="query.serverId" placeholder="选择服务器" @change="getProp" filterable>
<el-option v-for="item in switchServer()" :key="item.id" :label="item.name" :value="item.id" />
</el-select>
</el-form-item>
</el-form>
</div>
<div class="flex-warp">
<el-table ref="tableRef" :data="tableData.list" style="width: 100%" border>
<el-table-column prop="PeriodId" label="当前期数" width="85">
<template #default="scope"> {{ scope.row.PeriodId }}</template>
</el-table-column>
<el-table-column prop="State" label="状态" width="100">
<template #default="scope">
<div v-if="scope.row.State == 1" style="color: #f81f26">开启</div>
<div v-else-if="scope.row.State == 2">关闭</div>
<div v-else-if="scope.row.State == 3" style="color: #66b7cf">未开启</div>
<div v-else>{{ scope.row.State }}</div>
</template>
</el-table-column>
<el-table-column prop="BeginTime" label="开始时间" width="100" />
<el-table-column prop="EndTime" label="结束时间" width="100" />
</el-table>
</div>
</div>
</el-card>
</el-form>
</div>
</template>
<script lang="ts">
import { defineComponent, onMounted, reactive, ref, toRefs } from 'vue';
import { gameGMGetBattlePass } from '/@/api/game/gameConfig';
import BattlePassConfigCategory from '/@/api/config/BattlePassConfigCategory.json';
import { ElLoading } from 'element-plus';
import { ServerCategorize, serverList } from '/@/utils/game';
import { gSwitchServer, uniquePeriodId } from '/@/utils/utils';
interface TableDataState {
query: object;
tableData: { list: object[] };
battlePassConfig: object;
servers: object;
serverCategorize: object[];
serverSwitch: number;
}
export default defineComponent({
name: 'apiV1ServerBattlePassLog',
setup: function () {
const tableRef = ref();
const state = reactive<TableDataState>({
item: { topShow: true, show: true },
query: {
serverId: '',
periodId: '',
},
tableData: { list: [] },
battlePassConfig: BattlePassConfigCategory,
servers: [],
serverCategorize: ServerCategorize,
serverSwitch: 0,
});
onMounted(() => {
serverList().then((res) => {
state.servers = res;
console.log('serverList:', res);
state.query.serverId = res[0].id;
getProp();
});
});
const getProp = () => {
const loading = ElLoading.service({
lock: true,
text: 'Loading',
background: 'rgba(0, 0, 0, 0.7)',
});
state.tableData.list = [];
gameGMGetBattlePass({ serverId: state.query.serverId })
.then((res) => {
console.log('gameGMGetBattlePass: ', res);
if (res.code != 0 || !res.data || !res.data.list) {
return;
}
state.tableData.list = res.data.list;
let now = new Date().getTime() / 1000;
console.log('gameGMGetBattlePass: time ', now);
let BattlePassConfig = unique();
console.log('gameGMGetBattlePass: BattlePassConfig ', BattlePassConfig);
BattlePassConfig.forEach((data) => {
let item = state.tableData.list.find((r) => r.PeriodId === data.PeriodId);
if (!item) {
state.tableData.list.push({ PeriodId: data.PeriodId });
return;
}
if (item.BeginTime >= now) {
item.State = 3;
}
item.BeginTime = new Date(item.BeginTime * 1000).toLocaleDateString();
item.EndTime = new Date(item.EndTime * 1000).toLocaleDateString();
});
state.tableData.list.sort((a, b) => {
return a.PeriodId - b.PeriodId;
});
// state.tableData.list.forEach((item) => {
// if (item.BeginTime >= now) {
// item.State = 3;
// }
// item.BeginTime = new Date(item.BeginTime * 1000).toLocaleDateString();
// item.EndTime = new Date(item.EndTime * 1000).toLocaleDateString();
// });
console.log('gameGMGetBattlePass: state.tableData.data', state.tableData.list);
})
.finally(() => {
loading.close();
});
};
const unique = () => {
return uniquePeriodId(BattlePassConfigCategory);
};
const switchServer = () => {
return gSwitchServer(state.serverSwitch, state.servers);
};
return {
unique,
switchServer,
tableRef,
getProp,
...toRefs(state),
};
},
});
</script>
<style scoped lang="scss">
.el-table {
--el-table-border-color: var(--el-border-color-lighter);
--el-table-border: 2px solid var(--el-table-border-color);
}
.table-item {
margin-top: 10px;
margin-bottom: -10px;
}
.box-card .el-card__header {
background-color: #062ce6;
color: #fff;
}
::v-deep .el-table--striped .el-table__body tr.el-table__row--striped td {
background: #f0ffd5;
}
.warning-row {
background: #f0ffd5ff;
}
.white-row {
background: #ffffff;
}
::v-deep .warning-row .el-table__body tr {
background-color: #f0ffd5ff;
}
::v-deep .warning-row .el-table--enable-row-hover .el-table__body tr:hover > td {
background-color: inherit;
}
::v-deep .warning-row .el-table__cell {
background-color: #f0ffd5ff;
}
</style>

490
src/views/serverBattlePass/update/index.vue

@ -18,40 +18,23 @@
<div v-show="item.show">
<div class="flex-warp">
<el-form-item label="期数" prop="periodId">
<el-select class="m-2" placeholder="选择期数" filterable v-model="props.periodId">
<el-select class="m-2" placeholder="选择期数" filterable v-model="props.periodId" @change="onCheckPeriodId">
<el-option v-for="item in unique(battlePassConfig)" :key="item.PeriodId" :label="item.PeriodId + '期'" :value="item.PeriodId" />
</el-select>
</el-form-item>
<el-form-item label="开始时间" prop="beginTime">
<el-date-picker type="date" size="default" v-model="props.beginTime" placeholder="开始时间" format="YYYY-MM-DD" value-format="x" />
<el-form-item label="时间" prop="beginTime">
<el-date-picker
id="dateTime"
type="daterange"
size="default"
v-model="props.times"
placeholder="开始时间"
format="YYYY-MM-DD"
value-format="x"
:disabled-date="disabledDate"
/>
</el-form-item>
<el-form-item label="结束时间" prop="endTime">
<el-date-picker type="date" size="default" v-model="props.endTime" placeholder="结束时间" format="YYYY-MM-DD" value-format="x" />
</el-form-item>
<el-button size="default" :type="checkTimeColor" :disabled="query.serverIds.length == 0" class="ml10" @click="onCheckTime">
<div v-if="checkTime === 1">
<el-icon>
<ele-Check />
</el-icon>
</div>
<div v-else-if="checkTime === 2">
<el-icon>
<ele-Close />
</el-icon>
</div>
检查时间
</el-button>
<el-button size="default" class="ml10" @click="onSubmit" :disabled="query.serverIds.length == 0 || checkTime != 1">
<div v-if="checkTime === 1">
<el-icon>
<ele-Check />
</el-icon>
</div>
<div v-else-if="checkTime === 2">
<el-icon>
<ele-Close />
</el-icon>
</div>
<el-button size="default" class="ml10" @click="onSubmit" :disabled="query.serverIds.length == 0">
<el-icon>
<ele-Promotion />
</el-icon>
@ -62,23 +45,17 @@
<el-form-item prop="periodId" label="显示期数">
<el-select size="default" placeholder="请选择显示期数" filterable v-model="query.periodId" @change="getProp">
<el-option label="全部" value="" />
<el-option v-for="item in unique(battlePassConfig)" :key="item.PeriodId" :label="item.PeriodId + '期'" :value="item.PeriodId" />
<el-option v-for="item in unique()" :key="item.PeriodId" :label="item.PeriodId + '期'" :value="item.PeriodId" />
</el-select>
</el-form-item>
<el-form-item prop="showOnly" label="显示全服">
<el-switch v-model="query.showOnly" class="ml-2" width="60" inline-prompt active-text="" inactive-text="" @change="getProp" />
</el-form-item>
</div>
<div class="flex-warp">
<el-table
ref="tableRef"
:data="servers"
:span-method="objectSpanMethod"
style="width: 100%"
stripe
border
@selection-change="handleSelectionChange"
row-key="id"
>
<el-table-column prop="platform" label="平台" show-overflow-tooltip width="80">
<el-table ref="tableRef" :data="tableData.data" :span-method="objectSpanMethod" border @selection-change="handleSelectionChange">
<el-table-column prop="platform" label="平台" width="80">
<template #default="scope">
<div v-if="scope.row.sort == 0">其他</div>
<div v-else-if="scope.row.sort == 1">ios</div>
@ -90,16 +67,76 @@
<el-table-column prop="area" label="区服编号" width="85">
<template #default="scope"> {{ scope.row.area }}</template>
</el-table-column>
<el-table-column prop="name" label="服务器名称" show-overflow-tooltip width="200" />
<el-table-column prop="periodId" label="当前期数" show-overflow-tooltip width="85" />
<el-table-column prop="state" label="状态" show-overflow-tooltip width="100" />
<el-table-column prop="StartTime" label="开始时间" show-overflow-tooltip width="200" />
<el-table-column prop="EndTime" label="结束时间" show-overflow-tooltip width="200" />
<el-table-column type="selection" width="55" :selectable="selectable" />
<el-table-column prop="" label="开关" show-overflow-tooltip width="100" />
<el-table-column prop="" label="操作" width="100">
<el-table-column prop="name" label="服务器名称" width="200" />
<el-table-column prop="PeriodId" label="当前期数" width="85" />
<el-table-column prop="State" label="状态" width="100">
<template #default="scope">
<div v-if="scope.row.BeginTime > Date.now() / 1000" style="color: #66b7cf">未开启</div>
<div v-else-if="scope.row.State == 1" style="color: #f81f26">开启</div>
<div v-else-if="scope.row.State == 2">关闭</div>
<div v-else-if="scope.row.State == 3">永久关闭</div>
<div v-else>{{ scope.row.State }}</div>
</template>
</el-table-column>
<el-table-column prop="BeginTimeStr" label="开始时间" width="200">
<template #default="scope">
<div v-if="!!listVisible && scope.row.id == tableData.edit.id">
<el-date-picker
style="width: 180px"
type="date"
size="default"
v-model="tableData.edit.BeginTime"
placeholder="开始时间"
format="YYYY-MM-DD"
value-format="x"
:disabled-date="disabledDate"
/>
</div>
<div v-else>
{{ scope.row.BeginTimeStr }}
</div>
</template>
</el-table-column>
<el-table-column prop="EndTimeStr" label="结束时间" width="200">
<template #default="scope">
<div v-if="!!listVisible && scope.row.id == tableData.edit.id">
<el-date-picker
style="width: 180px"
type="date"
size="default"
v-model="tableData.edit.EndTime"
placeholder="开始时间"
format="YYYY-MM-DD"
value-format="x"
:disabled-date="disabledDate"
/>
</div>
<div v-else>
{{ scope.row.EndTimeStr }}
</div>
</template>
</el-table-column>
<el-table-column type="selection" width="40" :selectable="selectable" />
<el-table-column prop="" label="开关" width="200">
<template #default="scope">
<el-button size="default" class="ml10" @click="onUpdate(scope.row)"> 修改</el-button>
<div v-if="!!listVisible && scope.row.id == tableData.edit.id">
<el-select class="m-2" placeholder="选择期数" filterable v-model="tableData.edit.changeState">
<el-option label="不修改" :value="0" />
<el-option label="开启" :value="1" />
<el-option label="关闭" :value="2" style="color:rgba(248,31,31,0.84);" />
<el-option label="永久关闭" :value="3" />
</el-select>
</div>
</template>
</el-table-column>
<el-table-column prop="" label="操作" width="200">
<template #default="scope">
<div v-if="!!listVisible && scope.row.id == tableData.edit.id">
<el-button type="primary" @click="onUpdate(1)">确认修改</el-button>
</div>
<div v-else>
<el-button size="small" class="ml10" @click="onEdit(scope.row)"> 修改</el-button>
</div>
</template>
</el-table-column>
</el-table>
@ -110,11 +147,10 @@
</div>
</template>
<script lang="ts">
import { defineComponent, onMounted, reactive, ref, toRefs, unref } from 'vue';
import { gameGMCheckBattlePassCheck, gameGMGetBattlePass, gameGMInsertBattlePass } from '/@/api/game/gameConfig';
import { defineComponent, onMounted, reactive, ref, toRefs } from 'vue';
import { gameGMCheckPeriodIdBattlePass, gameGMGetBattlePass, gameGMInsertBattlePass, gameGMUpdateBattlePass } from '/@/api/game/gameConfig';
import BattlePassConfigCategory from '/@/api/config/BattlePassConfigCategory.json';
import { ElLoading, ElMessage } from 'element-plus';
import type { TableInstance } from 'element-plus';
import { ElLoading, ElMessage, ElMessageBox } from 'element-plus';
import { uniquePeriodId, zeroFill } from '/@/utils/utils';
import { serverList } from '/@/utils/game';
@ -123,15 +159,18 @@ interface Props {
periodId: string;
beginTime: number;
endTime: number;
times: number[];
}
interface TableDataState {
props: Props;
query: object;
tableData: { data: object[]; list: object[]; edit: object };
battlePassList: object[];
centerDialogVisible: boolean;
checkTime: number;
checkTimeColor: string;
ignoreSelectList: object[];
// checkTime: number;
// checkTimeColor: string;
listVisible: boolean;
check: boolean;
lastDate: number;
curDate: number;
@ -148,16 +187,15 @@ interface SpanMethodProps {
}
export default defineComponent({
name: 'systemServerBattlePassUpdate',
name: 'apiV1ServerBattlePass',
setup: function () {
const formRef = ref<HTMLElement | null>(null);
const tableRef = ref();
let date = new Date();
let getBeginTime = (date: number) => {
return new Date(date).setHours(0, 0, 0);
return new Date(date + 24 * 60 * 60 * 1000).setHours(0, 0, 0);
};
let getEndTime = (date: number) => {
return new Date(date + 20 * 24 * 60 * 60 * 1000).setHours(0, 0, 0);
return new Date(date + 21 * 24 * 60 * 60 * 1000).setHours(0, 0, 0);
};
const state = reactive<TableDataState>({
lastDate: 0,
@ -167,120 +205,83 @@ export default defineComponent({
query: {
serverIds: [],
periodId: '',
showOnly: true,
},
props: {
id: '',
periodId: BattlePassConfigCategory[0].PeriodId,
beginTime: getBeginTime(date.getTime()),
endTime: getEndTime(date.getTime()),
times: [getBeginTime(date.getTime()), getEndTime(date.getTime())],
},
battlePass: [],
tableData: { data: [], list: [], edit: {} },
battlePassList: [],
ignoreSelectList: [],
battlePassConfig: BattlePassConfigCategory,
centerDialogVisible: false,
checkTime: 0,
checkTimeColor: 'primary',
listVisible: false,
selectModel: '',
servers: [],
});
const onCheckTime = () => {
if (!state.props.beginTime || !state.props.endTime) {
ElMessage.error('活动时间未填写完整');
return;
}
let now = new Date();
if (new Date(state.props.endTime) < now) {
ElMessage.error('结束时间小于当前时间,请检查!');
return;
}
if (new Date(state.props.endTime) < new Date(state.props.beginTime)) {
ElMessage.error('结束时间小于开始时间,请检查!');
return;
}
if (state.query.serverIds.length == 0) {
ElMessage.error('未选择服务器,请检查!');
return;
}
const onCheckPeriodId = () => {
const loading = ElLoading.service({
lock: true,
text: 'Loading',
background: 'rgba(0, 0, 0, 0.7)',
});
console.log(state.query.serverIds);
for (let i in state.query.serverIds) {
let data = {
BeginTime: state.props.beginTime,
EndTime: state.props.endTime,
Server: state.query.serverIds[i],
PeriodId: state.props.periodId,
};
onCheck(loading, data);
}
if (state.checkTime != 0) {
state.checkTime = 2;
}
};
const onCheck = (loading, data) => {
gameGMCheckBattlePassCheck(data)
state.tableData.list = [];
gameGMCheckPeriodIdBattlePass({ periodId: state.props.periodId })
.then((res) => {
console.log('onCheckTime:', res);
if (!res || Number(res.code) != 0 || !res.data || res.data.total > 0) {
loading.close();
// state.checkTime = 2;
state.checkTimeColor = 'danger';
ElMessage.error('活动时间重合');
console.log(tableRef.value);
var value = state.servers.find((r) => r.Id == data.Server);
tableRef.value.toggleRowSelection(value, false);
state.query.serverIds.splice(state.query.serverIds.indexOf(data.Server), 1);
console.log('gameGMGetBattlePass: ', res);
if (res.code != 0 || !res.data || !res.data.list) {
return;
}
loading.close();
state.checkTime = 1;
state.checkTimeColor = 'primary';
ElMessage.success('验证通过');
state.tableData.list = res.data.list;
state.ignoreSelectList = state.tableData.list
.filter((r) => r.PeriodId == state.props.periodId || (r.PeriodId > state.props.periodId && r.BeginTime < Date.now() / 1000))
.map((item) => item.Server);
console.log('state.ignoreSelectList: ', state.ignoreSelectList);
})
.catch(() => {
.finally(() => {
loading.close();
state.checkTimeColor = 'danger';
console.log(tableRef);
var value = state.servers.find((r) => r.Id == data.Server);
tableRef.value.toggleRowSelection(value, false);
state.query.serverIds.splice(state.query.serverIds.indexOf(data.Server), 1);
});
tableRef.value.clearSelection();
console.log('state.ignoreSelectList: ', state.ignoreSelectList);
};
const onSubmit = () => {
console.log('state.props:', state.props);
if (!state.props.times[0] || !state.props.times[1]) {
ElMessage.error('有未配置完成的部分1,请检查!');
return;
}
const loading = ElLoading.service({
lock: true,
text: 'Loading',
background: 'rgba(0, 0, 0, 0.7)',
});
state.centerDialogVisible = false;
const formWrap = unref(formRef) as any;
if (!formWrap) return;
formWrap.validate((valid: boolean) => {
console.log('monthly:', valid, state.props);
if (!valid) {
ElMessage.error('有未配置完成的部分,请检查!');
return;
}
state.tableData.total = state.query.serverIds.length;
for (let i in state.query.serverIds) {
let monthly = onState();
console.log('monthly0:', monthly);
if (!monthly.BeginTime || !monthly.EndTime) {
ElMessage.error('有未配置完成的部分1,请检查!');
return;
}
monthly.Server = state.query.serverIds[i];
console.log('monthly1:', monthly);
insertData(loading, monthly);
}
};
const insertData = (loading, monthly) => {
gameGMInsertBattlePass(monthly)
.then(() => {
ElMessage.success('活动更新成功');
ElMessage.success(monthly.Server + '活动更新成功');
state.check = false;
})
.finally(() => {
loading.close();
});
state.tableData.total--;
if (state.tableData.total == 0) {
getProp();
}
});
};
onMounted(() => {
@ -288,50 +289,113 @@ export default defineComponent({
state.rows = {};
serverList().then((res) => {
state.servers = res;
for (let i in state.servers) {
let server = state.servers[i];
if (!state.rows[server.sort]) {
state.rows[server.sort] = { num: 0, id: server.id };
}
state.rows[server.sort].num++;
if (state.rows[server.sort].id > server.id) {
state.rows[server.sort].id = server.id;
}
}
console.log('serverList:', res);
});
getProp();
});
});
const onState = () => {
let data = {
BeginTime: state.props.beginTime,
EndTime: state.props.endTime,
serverIds: state.query.serverIds,
BeginTime: Math.floor(state.props.times[0] / 1000),
EndTime: Math.floor(state.props.times[1] / 1000),
Server: '',
State: 1,
PeriodId: state.props.periodId,
};
console.log('data: ', data);
return data;
};
const getProp = () => {
const loading = ElLoading.service({
lock: true,
text: 'Loading',
background: 'rgba(0, 0, 0, 0.7)',
});
state.tableData.data = [];
gameGMGetBattlePass({ periodId: state.query.periodId })
.then((res) => {
console.log('gameGMGetBattlePass: ', res);
if (res.code == 0 && res.data && res.data.list) {
if (res.code != 0 || !res.data || !res.data.list) {
return;
}
onCheckPeriodId();
let now = new Date().getTime() / 1000;
console.log('gameGMGetBattlePass: time ', now);
res.data.list.sort((a, b) => {
return b.BeginTime - a.BeginTime;
});
if (!state.query.periodId) {
for (let i in state.servers) {
let battle = res.data.list.filter((r) => r.Server == state.servers[i].id && r.BeginTime <= now);
battle.sort((a, b) => {
return b.PeriodId - a.PeriodId;
});
let data = {
id: state.servers[i].id,
name: state.servers[i].name,
area: state.servers[i].area,
sort: state.servers[i].sort,
};
if (battle.length > 0) {
data.PeriodId = battle[0].PeriodId;
data.BeginTimeStr = new Date(battle[0].BeginTime * 1000).toLocaleDateString();
data.BeginTime = battle[0].BeginTime;
data.EndTimeStr = new Date(battle[0].EndTime * 1000).toLocaleDateString();
data.EndTime = battle[0].EndTime;
data.StringId = battle[0].StringId;
data.State = battle[0].State;
data.Server = battle[0].Server;
} else {
if (!state.query.showOnly) continue;
}
state.tableData.data.push(data);
}
} else {
for (let i in state.servers) {
let battle = res.data.list.find((r) => r.Server == state.servers[i].id && r.PeriodId == state.query.periodId);
let data = {
id: state.servers[i].id,
name: state.servers[i].name,
area: state.servers[i].area,
sort: state.servers[i].sort,
};
if (battle) {
data.PeriodId = battle.PeriodId;
data.BeginTimeStr = new Date(battle.BeginTime * 1000).toLocaleDateString();
data.BeginTime = battle.BeginTime;
data.EndTimeStr = new Date(battle.EndTime * 1000).toLocaleDateString();
data.EndTime = battle.EndTime;
data.StringId = battle.StringId;
data.State = battle.State;
data.Server = battle.Server;
} else {
if (!state.query.showOnly) continue;
}
state.tableData.data.push(data);
}
}
state.tableData.data.sort((a, b) => a.sort * 100000 + a.id - (b.sort * 100000 + b.id));
state.rows = {};
for (let i in state.tableData.data) {
let server = state.tableData.data[i];
if (!state.rows[server.sort]) {
state.rows[server.sort] = { num: 0, id: server.id };
}
state.rows[server.sort].num++;
if (state.rows[server.sort].id > server.id) {
state.rows[server.sort].id = server.id;
}
}
console.log('gameGMGetBattlePass: state.tableData.data', state.tableData.data);
})
.finally(() => {
loading.close();
});
};
const unique = (arr) => {
return uniquePeriodId(arr);
const unique = () => {
return uniquePeriodId(BattlePassConfigCategory);
};
const objectSpanMethod = ({ row, column, rowIndex, columnIndex }: SpanMethodProps) => {
if (columnIndex === 0) {
@ -349,24 +413,107 @@ export default defineComponent({
}
};
const handleSelectionChange = (selection: any[]) => {
state.checkTime = 0;
// state.checkTime = 0;
if (state.ignoreSelectList.length > 0) {
selection.forEach((item) => {
if (state.ignoreSelectList.includes(item.id)) {
tableRef.value!.toggleRowSelection(item, false);
}
});
selection = tableRef.value!.getSelectionRows();
}
state.query.serverIds = selection.map((item) => item.id);
console.log(state.query.serverId, selection);
};
// const getSelectionRows = (selection: any[]) => {
const selectable = (row) => !state.ignoreSelectList.includes(row.id);
const disabledDate = (time) => {
return time.getTime() < Date.now();
};
const onUpdate = () => {
let data = {
Id: state.tableData.edit.StringId,
PeriodId: state.tableData.edit.PeriodId,
BeginTime: Math.floor(state.tableData.edit.BeginTime / 1000),
EndTime: Math.floor(state.tableData.edit.EndTime / 1000),
};
// if (state.tableData.edit.changeState != 0 && data.State != 3) {
// data.State = state.tableData.edit.changeState;
// }
ElMessageBox.confirm(
`此操作将修改:服务器【${state.tableData.edit.name}】第【${state.tableData.edit.PeriodId}】期的时间为[${new Date(
state.tableData.edit.BeginTime
).toLocaleDateString()}]-[${new Date(state.tableData.edit.EndTime).toLocaleDateString()}]是否继续?`,
'提示',
{
confirmButtonText: '确认',
cancelButtonText: '取消',
type: 'warning',
}
).then(() => {
update(data);
});
};
const onUpdate1 = (data) => {
let confirm = `此操作将开启:第${data.PeriodId}期的战令,是否继续?`;
if (data.State == 2) {
confirm = `此操作将关闭:第${data.PeriodId}期的战令,是否继续?`;
}
if (data.State == 3) {
confirm = `此操作将永久关闭:第${data.PeriodId}期的战令,是否继续?`;
}
ElMessageBox.confirm(confirm, '提示', {
confirmButtonText: '确认',
cancelButtonText: '取消',
type: 'warning',
}).then(() => {
update(data);
});
};
const update = (data) => {
gameGMUpdateBattlePass(data).then((response) => {
console.log(response);
state.listVisible = false;
getProp();
state.tableData.edit = {};
});
};
const onEdit = (row) => {
if (!row.StringId) {
ElMessage.error("未定义数据无法修改,请先发布!")
return;
}
if (row.State == 3) {
ElMessage.error("永久关闭后无法修改!")
return;
}
state.tableData.edit = { ...row };
state.tableData.edit.changeState = 0;
state.tableData.edit.EndTime = new Date(row.EndTimeStr + ' 00:00:00').getTime();
state.tableData.edit.BeginTime = new Date(row.BeginTimeStr + ' 00:00:00').getTime();
state.listVisible = true;
};
const handleClose = (done: () => void) => {
getProp();
done();
state.listVisible = false;
state.tableData.edit = {};
// state.checkTime = 0;
// state.query.serverIds = selection.map((item) => item.id);
// console.log(state.query.serverId, selection);
// };
const selectable = (row) => ![].includes(row.id);
};
return {
handleClose,
onEdit,
onUpdate1,
onUpdate,
disabledDate,
onCheckPeriodId,
tableRef,
insertData,
selectable,
handleSelectionChange,
objectSpanMethod,
onSubmit,
formRef,
unique,
onCheckTime,
getProp,
zeroFill,
...toRefs(state),
@ -376,16 +523,29 @@ export default defineComponent({
</script>
<style scoped lang="scss">
::v-deep .el-table {
--el-table-border-color: var(--el-border-color-lighter);
--el-table-border: 2px solid var(--el-table-border-color);
}
.table-item {
margin-top: 10px;
margin-bottom: -10px;
}
.box-card .el-card__header {
background-color: #409eff;
background-color: #062ce6;
color: #fff;
}
//::v-deep .el-checkbox__inner {
// border-color: rgb(63, 157, 253);
//}
//::v-deep .el-checkbox {
// --el-checkbox-disabled-input-fill: var(--el-checkbox-disabled-input-fill);
//}
::v-deep .el-table--striped .el-table__body tr.el-table__row--striped td {
background: #f0ffd5;
}

Loading…
Cancel
Save