Browse Source

battlePass

master
linquan 2 days ago
parent
commit
05af66fa0e
  1. 2585
      package-lock.json
  2. 2
      package.json
  3. 292
      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. 6
      src/views/gameOrder/getTransactionId/index.vue
  8. 526
      src/views/gameOrder/orderList/index.vue
  9. 2
      src/views/gameRole/role/index.vue
  10. 198
      src/views/serverBattlePass/log/index.vue
  11. 506
      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": "^5.3.0",
"echarts-gl": "^2.0.9", "echarts-gl": "^2.0.9",
"echarts-wordcloud": "^2.0.0", "echarts-wordcloud": "^2.0.0",
"element-plus": "2.3.4", "element-plus": "2.1.1",
"express-jwt": "^8.5.1", "express-jwt": "^8.5.1",
"jsonwebtoken": "^9.0.2", "jsonwebtoken": "^9.0.2",
"jsplumb": "^2.15.6", "jsplumb": "^2.15.6",

292
src/api/game/gameConfig.ts

@ -1,227 +1,233 @@
import request from '/@/utils/request'; import request from '/@/utils/request';
export function gameGetRank(params: object) { export function gameGetRank(params: object) {
return request({ return request({
url: '/api/v1/game/rank/get', url: '/api/v1/game/rank/get',
method: 'post', method: 'post',
params: params, params: params,
}); });
} }
export function gameUpdateRank(params: object) { export function gameUpdateRank(params: object) {
return request({ return request({
url: '/api/v1/game/rank/update', url: '/api/v1/game/rank/update',
method: 'post', method: 'post',
params: params, params: params,
}); });
} }
export function gameDelRank(params: object) { export function gameDelRank(params: object) {
return request({ return request({
url: '/api/v1/game/rank/del', url: '/api/v1/game/rank/del',
method: 'post', method: 'post',
params: params, params: params,
}); });
} }
export function gameCheckRank(params: object) { export function gameCheckRank(params: object) {
return request({ return request({
url: '/api/v1/game/rank/check', url: '/api/v1/game/rank/check',
method: 'post', method: 'post',
params: params, params: params,
}); });
} }
export function gameGetRankAward(params: object) { export function gameGetRankAward(params: object) {
return request({ return request({
url: '/api/v1/game/rankAward/get', url: '/api/v1/game/rankAward/get',
method: 'post', method: 'post',
params: params, params: params,
}); });
} }
export function gameUpdateRankAward(params: object) { export function gameUpdateRankAward(params: object) {
return request({ return request({
url: '/api/v1/game/rankAward/update', url: '/api/v1/game/rankAward/update',
method: 'post', method: 'post',
params: params, params: params,
}); });
} }
export function gameDelRankAward(params: object) { export function gameDelRankAward(params: object) {
return request({ return request({
url: '/api/v1/game/rankAward/del', url: '/api/v1/game/rankAward/del',
method: 'post', method: 'post',
params: params, params: params,
}); });
} }
export function getGameRank(params: object) { export function getGameRank(params: object) {
return request({ return request({
url: '/api/v1/game/rank/getGameRank', url: '/api/v1/game/rank/getGameRank',
method: 'get', method: 'get',
params: params, params: params,
}); });
} }
export function deleteGameRank(params: object) { export function deleteGameRank(params: object) {
return request({ return request({
url: '/api/v1/game/rank/deleteGameRank', url: '/api/v1/game/rank/deleteGameRank',
method: 'get', method: 'get',
params: params, params: params,
}); });
} }
export function gameGMGetBazaarActivity(params: object) { export function gameGMGetBazaarActivity(params: object) {
return request({ return request({
url: '/api/v1/game/bazaar/get', url: '/api/v1/game/bazaar/get',
method: 'get', method: 'get',
params: params, params: params,
}); });
} }
export function gameGMUpdateBazaarActivity(params: object) { export function gameGMUpdateBazaarActivity(params: object) {
return request({ return request({
url: '/api/v1/game/bazaar/update', url: '/api/v1/game/bazaar/update',
method: 'post', method: 'post',
params: params, params: params,
}); });
} }
export function gameGMInsertBazaarActivity(params: object) { export function gameGMInsertBazaarActivity(params: object) {
return request({ return request({
url: '/api/v1/game/bazaar/insert', url: '/api/v1/game/bazaar/insert',
method: 'post', method: 'post',
params: params, params: params,
}); });
} }
export function gameGMInsertBatchBazaarActivity(params: object) { export function gameGMInsertBatchBazaarActivity(params: object) {
return request({ return request({
url: '/api/v1/game/bazaar/insertBatch', url: '/api/v1/game/bazaar/insertBatch',
method: 'post', method: 'post',
params: params, params: params,
}); });
} }
export function gameGMGetMonthlyEvent(params: object) { export function gameGMGetMonthlyEvent(params: object) {
return request({ return request({
url: '/api/v1/game/monthlyLottery/get', url: '/api/v1/game/monthlyLottery/get',
method: 'get', method: 'get',
params: params, params: params,
}); });
} }
export function gameGMUpdateMonthlyEvent(params: object) { export function gameGMUpdateMonthlyEvent(params: object) {
return request({ return request({
url: '/api/v1/game/monthlyLottery/update', url: '/api/v1/game/monthlyLottery/update',
method: 'get', method: 'get',
params: params, params: params,
}); });
} }
export function gameGMInsertMonthlyEvent(params: object) { export function gameGMInsertMonthlyEvent(params: object) {
return request({ return request({
url: '/api/v1/game/monthlyLottery/insert', url: '/api/v1/game/monthlyLottery/insert',
method: 'get', method: 'get',
params: params, params: params,
}); });
} }
export function gameGMGetPropExchange(params: object) { export function gameGMGetPropExchange(params: object) {
return request({ return request({
url: '/api/v1/game/propExchange/get', url: '/api/v1/game/propExchange/get',
method: 'get', method: 'get',
params: params, params: params,
}); });
} }
export function gameGMUpdatePropExchange(params: object) { export function gameGMUpdatePropExchange(params: object) {
return request({ return request({
url: '/api/v1/game/propExchange/update', url: '/api/v1/game/propExchange/update',
method: 'get', method: 'get',
params: params, params: params,
}); });
} }
export function gameGMInsertPropExchange(params: object) { export function gameGMInsertPropExchange(params: object) {
return request({ return request({
url: '/api/v1/game/propExchange/insert', url: '/api/v1/game/propExchange/insert',
method: 'get', method: 'get',
params: params, params: params,
}); });
} }
export function gameGMCheckPropExchange(params: object) { export function gameGMCheckPropExchange(params: object) {
return request({ return request({
url: '/api/v1/game/propExchange/check', url: '/api/v1/game/propExchange/check',
method: 'get', method: 'get',
params: params, params: params,
}); });
} }
export function gameGMUpdateModel(params: object) { export function gameGMUpdateModel(params: object) {
return request({ return request({
url: '/api/v1/game/model/update', url: '/api/v1/game/model/update',
method: 'get', method: 'get',
params: params, params: params,
}); });
} }
export function gameGMInsertModel(params: object) { export function gameGMInsertModel(params: object) {
return request({ return request({
url: '/api/v1/game/model/insert', url: '/api/v1/game/model/insert',
method: 'get', method: 'get',
params: params, params: params,
}); });
} }
export function gameGMGetModel(params: object) { export function gameGMGetModel(params: object) {
return request({ return request({
url: '/api/v1/game/model/get', url: '/api/v1/game/model/get',
method: 'get', method: 'get',
params: params, params: params,
}); });
} }
export function gameGMDelModel(params: object) { export function gameGMDelModel(params: object) {
return request({ return request({
url: '/api/v1/game/model/del', url: '/api/v1/game/model/del',
method: 'get', method: 'get',
params: params, params: params,
}); });
} }
export function gameGMCheckBattlePassCheck(params: object) { export function gameGMCheckBattlePassCheck(params: object) {
return request({ return request({
url: '/api/v1/game/battlePass/check', url: '/api/v1/game/battlePass/check',
method: 'get', method: 'get',
params: params, params: params,
}); });
} }
export function gameGMUpdateBattlePass(params: object) { export function gameGMUpdateBattlePass(params: object) {
return request({ return request({
url: '/api/v1/game/battlePass/update', url: '/api/v1/game/battlePass/update',
method: 'get', method: 'get',
params: params, params: params,
}); });
} }
export function gameGMInsertBattlePass(params: object) { export function gameGMInsertBattlePass(params: object) {
return request({ return request({
url: '/api/v1/game/battlePass/insert', url: '/api/v1/game/battlePass/insert',
method: 'get', method: 'get',
params: params, params: params,
}); });
} }
export function gameGMGetBattlePass(params: object) { export function gameGMGetBattlePass(params: object) {
return request({ return request({
url: '/api/v1/game/battlePass/get', url: '/api/v1/game/battlePass/get',
method: 'get', method: 'get',
params: params, 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, 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-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-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>
<el-form-item label="终止时间" prop="time"> <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-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>

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>

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

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

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

@ -1,272 +1,294 @@
<template> <template>
<div class="game-order-container"> <div class="game-order-container">
<el-card shadow="hover"> <el-card shadow="hover">
<div class="game-order-search mb15"> <div class="game-order-search mb15">
<el-form :inline="true" > <el-form :inline="true">
<el-form-item label="渠道" prop="channel"> <el-form-item label="渠道" prop="channel" >
<el-select v-model="tableData.param.channel" class="m-2" placeholder="选择渠道"> <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-select>
</el-form-item> </el-form-item>
<!-- <el-form-item label="账号">--> <!-- <el-form-item label="账号">-->
<!-- <el-input size="default" v-model="tableData.param.account" placeholder="请输入账号" class="w-50 m-2"--> <!-- <el-input size="default" v-model="tableData.param.account" placeholder="请输入账号" class="w-50 m-2"-->
<!-- clearable/>--> <!-- clearable/>-->
<!-- </el-form-item>--> <!-- </el-form-item>-->
<el-form-item label="uid"> <el-form-item label="uid" >
<el-input size="default" v-model="tableData.param.uid" placeholder="请输入uid" class="w-50 m-2" <el-input size="default" v-model="tableData.param.uid" placeholder="请输入uid" class="w-50 m-2" clearable />
clearable/> </el-form-item>
</el-form-item> <!-- <el-form-item label="起始时间" prop="lowTime">-->
<!-- <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"-->
<!-- <el-date-picker type="datetime" size="large" v-model="tableData.param.lowTime" format="YYYY/MM/DD HH:mm:ss"--> <!-- value-format="x"/>-->
<!-- value-format="x"/>--> <!-- </el-form-item>-->
<!-- </el-form-item>--> <!-- <el-form-item label="终止时间" prop="time">-->
<!-- <el-form-item label="终止时间" prop="time">--> <!-- <el-date-picker type="datetime" v-model="tableData.param.upTime" format="YYYY/MM/DD HH:mm:ss"-->
<!-- <el-date-picker type="datetime" v-model="tableData.param.upTime" format="YYYY/MM/DD HH:mm:ss"--> <!-- value-format="x"/>-->
<!-- value-format="x"/>--> <!-- </el-form-item>-->
<!-- </el-form-item>--> <el-form-item label="订单id" >
<el-form-item label="订单id"> <el-input size="default" v-model="tableData.param.orderId" placeholder="请输入渠道订单id" class="w-50 m-2" clearable />
<el-input size="default" v-model="tableData.param.orderId" placeholder="请输入渠道订单id" class="w-50 m-2" </el-form-item>
clearable/> <el-form-item label="渠道订单id" >
</el-form-item> <el-input size="default" v-model="tableData.param.externalOrderId" placeholder="请输入渠道订单id" class="w-50 m-2" clearable />
<el-form-item label="渠道订单id"> </el-form-item>
<el-input size="default" v-model="tableData.param.externalOrderId" placeholder="请输入渠道订单id" <el-form-item label="IOS商户单号" prop="order">
class="w-50 m-2" <el-input size="default" v-model="tableData.param.order" placeholder="请输入商户单号" clearable />
clearable/> </el-form-item>
</el-form-item> <el-form-item label="订单状态" >
<el-form-item label="订单状态"> <el-select v-model="tableData.param.status" class="m-2" placeholder="选择订单状态">
<el-select v-model="tableData.param.status" class="m-2" placeholder="选择订单状态"> <el-option label="全部" :value="0" />
<el-option label="全部" :value="0"/> <el-option label="等待充值" :value="1" />
<el-option label="等待充值" :value="1"/> <el-option label="充值成功" :value="2" />
<el-option label="充值成功" :value="2"/> <el-option label="充值失败" :value="100" />
<el-option label="充值失败" :value="100"/> <!-- <el-option label="失效订单" :value="3"/>-->
<!-- <el-option label="失效订单" :value="3"/>--> <el-option label="金额不匹配订单" :value="220110" />
<el-option label="金额不匹配订单" :value="220110"/> </el-select>
</el-select> </el-form-item>
</el-form-item> <el-form-item>
<el-form-item> <el-button v-if="!tableData.param.order" size="default" type="primary" class="ml10" @click="orderList">
<el-button size="default" type="primary" class="ml10" @click="orderList"> <el-icon>
<el-icon> <ele-Search />
<ele-Search/> </el-icon>
</el-icon> 查询
查询 </el-button>
</el-button> <el-button v-if="tableData.param.order" size="default" type="primary" class="ml10" @click="transactionList">
</el-form-item> <el-icon>
</el-form> <ele-Search />
</div> </el-icon>
<el-table :data="tableData.data" style="width: 100%" border> 查询IOS订单
<!-- <el-table-column type="index" label="id" width="60"/>--> </el-button>
<el-table-column prop="tradeNo" label="订单id" show-overflow-tooltip></el-table-column> </el-form-item>
<el-table-column prop="externalTradeNo" label="渠道订单id" show-overflow-tooltip></el-table-column> <el-form-item>
<!-- <el-table-column prop="_id" label="订单id(渠道产生)" show-overflow-tooltip></el-table-column>--> <div v-if="tableData.order">渠道订单Id: {{ tableData.order.transactionId }}</div>
<el-table-column prop="uid" label="uid" show-overflow-tooltip></el-table-column> </el-form-item>
<!-- <el-table-column prop="SilverPiece" label="桃花石" show-overflow-tooltip></el-table-column>--> </el-form>
<el-table-column prop="Rmb" label="金额(元)" show-overflow-tooltip width="120"> </div>
<template #default="scope"> <el-table :data="tableData.data" style="width: 100%" border>
<span>{{ (scope.row.Rmb / 100).toFixed(2) }}</span> <!-- <el-table-column type="index" label="id" width="60"/>-->
</template> <el-table-column prop="tradeNo" label="订单id" show-overflow-tooltip></el-table-column>
</el-table-column> <el-table-column prop="externalTradeNo" label="渠道订单id" show-overflow-tooltip></el-table-column>
<el-table-column prop="timeStr" label="充值时间" show-overflow-tooltip width="180"></el-table-column> <!-- <el-table-column prop="_id" label="订单id(渠道产生)" show-overflow-tooltip></el-table-column>-->
<!-- <el-table-column prop="timeStr" label="充值时间" show-overflow-tooltip></el-table-column>--> <el-table-column prop="uid" label="uid" show-overflow-tooltip></el-table-column>
<!-- <el-table-column prop="CfgId" label="商品" show-overflow-tooltip>--> <!-- <el-table-column prop="SilverPiece" label="桃花石" show-overflow-tooltip></el-table-column>-->
<!-- <template #default="scope">--> <el-table-column prop="Rmb" label="金额(元)" show-overflow-tooltip width="120">
<!-- <span>{{rechargeInfo.find(r=>r.Id == scope.row.CfgId).Name}}</span>--> <template #default="scope">
<!-- </template>--> <span>{{ (scope.row.Rmb / 100).toFixed(2) }}</span>
<!-- </el-table-column>--> </template>
<el-table-column prop="status" label="状态" show-overflow-tooltip width="120"> </el-table-column>
<template #default="scope"> <el-table-column prop="timeStr" label="充值时间" show-overflow-tooltip width="180"></el-table-column>
<div v-if="scope.row.status==1"> <!-- <el-table-column prop="timeStr" label="充值时间" show-overflow-tooltip></el-table-column>-->
<div v-if="new Date(scope.row.timeStr).getTime()+900000 <= Date.now() "> <!-- <el-table-column prop="CfgId" label="商品" show-overflow-tooltip>-->
<el-tooltip :content="scope.row.status+''" placement="top"> <!-- <template #default="scope">-->
<span style="color: #a8a17b">等待充值</span> <!-- <span>{{rechargeInfo.find(r=>r.Id == scope.row.CfgId).Name}}</span>-->
</el-tooltip> <!-- </template>-->
</div> <!-- </el-table-column>-->
<div v-else> <el-table-column prop="status" label="状态" show-overflow-tooltip width="120">
<el-tooltip :content="scope.row.status+''" placement="top"> <template #default="scope">
<el-button key="plain" type="text" @click="changeState(scope.row.tradeNo,3)">等待充值</el-button> <div v-if="scope.row.status == 1">
</el-tooltip> <div v-if="new Date(scope.row.timeStr).getTime() + 900000 <= Date.now()">
</div> <el-tooltip :content="scope.row.status + ''" placement="top">
</div> <span style="color: #a8a17b">等待充值</span>
<div v-else-if="scope.row.status==2"> </el-tooltip>
<el-tooltip :content="scope.row.status+''" placement="top"><span style="color: #024a08">充值成功</span> </div>
</el-tooltip> <div v-else>
</div> <el-tooltip :content="scope.row.status + ''" placement="top">
<div v-else-if="scope.row.status==3"> <el-button key="plain" type="text" @click="changeState(scope.row.tradeNo, 3)">等待充值</el-button>
<el-tooltip :content="scope.row.status+''" placement="top"><span style="color: #a8a17b">失效订单</span> </el-tooltip>
</el-tooltip> </div>
</div> </div>
<div v-else-if="scope.row.status==220110"> <div v-else-if="scope.row.status == 2">
<el-tooltip :content="scope.row.status+''" placement="top"> <el-tooltip :content="scope.row.status + ''" placement="top"><span style="color: #024a08">充值成功</span> </el-tooltip>
<el-button key="plain" type="text" @click="changeState(scope.row.tradeNo,2, '金额不匹配')">金额不匹配 </div>
</el-button> <div v-else-if="scope.row.status == 3">
</el-tooltip> <el-tooltip :content="scope.row.status + ''" placement="top"><span style="color: #a8a17b">失效订单</span> </el-tooltip>
</div> </div>
<div v-else> <div v-else-if="scope.row.status == 220110">
<el-tooltip :content="scope.row.status+''" placement="top"> <el-tooltip :content="scope.row.status + ''" placement="top">
<span style='color: #e60000'>充值失败</span> <el-button key="plain" type="text" @click="changeState(scope.row.tradeNo, 2, '金额不匹配')">金额不匹配 </el-button>
</el-tooltip> </el-tooltip>
</div> </div>
</template> <div v-else>
</el-table-column> <el-tooltip :content="scope.row.status + ''" placement="top">
<el-table-column prop="channel" label="渠道" show-overflow-tooltip width="120"> <span style="color: #e60000">充值失败</span>
<template #default="scope"> </el-tooltip>
<span>{{ channels.find(r => r.value == scope.row.channel)?.label }}</span> </div>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column prop="server" label="区服" show-overflow-tooltip width="120"> <el-table-column prop="channel" label="渠道" show-overflow-tooltip width="120">
<template #default="scope"> <template #default="scope">
<span>{{ servers.find(r => r.id == scope.row.server).name }}</span> <span>{{ channels.find((r) => r.value == scope.row.channel)?.label }}</span>
</template> </template>
</el-table-column> </el-table-column>
</el-table> <el-table-column prop="server" label="区服" show-overflow-tooltip width="120">
<el-row justify="space-evenly"> <template #default="scope">
<el-pagination :hide-on-single-page="true" v-model:page-size="tableData.param.pageSize" <span>{{ servers.find((r) => r.id == scope.row.server).name }}</span>
v-model:current-page="tableData.param.pageNum" </template>
:pager-count="5" @current-change="orderList" layout="total, prev, pager, next" </el-table-column>
:total="tableData.total"/> </el-table>
</el-row> <el-row justify="space-evenly">
</el-card> <el-pagination
</div> :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"
/>
</el-row>
</el-card>
</div>
</template> </template>
<script lang="ts"> <script lang="ts">
import {toRefs, reactive, onMounted, defineComponent,} from 'vue'; import { toRefs, reactive, onMounted, defineComponent } from 'vue';
import {gameOrderList, gameRechargeChangeStateDelete} from "/@/api/game/order"; import {gameOrderList, gameRechargeChangeStateDelete, getTransactionId} from '/@/api/game/order';
import {allChannelList, serverList, ServerList} from "/@/utils/game"; import { allChannelList, serverList, ServerList } from '/@/utils/game';
import RechargeConfigCategory from "/@/api/config/RechargeConfigCategory.json"; import RechargeConfigCategory from '/@/api/config/RechargeConfigCategory.json';
import {ElMessage, ElMessageBox} from "element-plus/es"; import { ElMessage, ElMessageBox } from 'element-plus/es';
// //
interface TableData { interface TableData {
id: string id: string;
CreateTime: string; CreateTime: string;
CfgId: number; CfgId: number;
Rmb: number; Rmb: number;
SilverPiece: number; SilverPiece: number;
Identity: string; Identity: string;
timeStr: string; timeStr: string;
uid: string; uid: string;
RealName: string; RealName: string;
StringId: string; StringId: string;
} }
interface TableDataState { interface TableDataState {
tableData: { tableData: {
data: Array<TableData>; data: Array<TableData>;
total: number; total: number;
param: { param: {
uid: number; uid: string;
channel: string; channel: string;
orderId: string; orderId: string;
externalOrderId: string; externalOrderId: string;
account: string; account: string;
status: number; status: number;
lowTime: number; lowTime: number;
upTime: number; upTime: number;
pageNum: number; pageNum: number;
pageSize: number; pageSize: number;
}; order: string;
};
}; order: object;
servers: object; };
channels: object; servers: object;
rechargeInfo: object[]; channels: object;
rechargeInfo: object[];
} }
export default defineComponent({ export default defineComponent({
name: 'apiV1GameOrderList', name: 'apiV1GameOrderList',
setup() { setup() {
// const {proxy} = getCurrentInstance() as any; // const {proxy} = getCurrentInstance() as any;
const state = reactive<TableDataState>({ const state = reactive<TableDataState>({
tableData: { tableData: {
data: [], data: [],
total: 0, total: 0,
param: { param: {
uid: 0, uid: "",
channel: "", channel: '',
orderId: "", orderId: '',
account: "", account: '',
lowTime: 0, lowTime: 0,
upTime: 0, upTime: 0,
pageSize: 10, pageSize: 10,
pageNum: 1, pageNum: 1,
}, order: '',
}, },
servers: ServerList, order: '',
channels: [], },
rechargeInfo: RechargeConfigCategory, servers: ServerList,
}); channels: [],
rechargeInfo: RechargeConfigCategory,
});
const orderList = () => { const transactionList = () => {
const data: Array<TableData> = []; state.tableData.param.order = state.tableData.param.order.substring(0,10)
gameOrderList(state.tableData.param).then(res => { getTransactionId(state.tableData.param).then((res) => {
console.log(res); console.log(res);
state.tableData.total = Number(res.data.total) || 0; state.tableData.order = res.data.order;
const list = res.data.list || []; if (res.data.order && res.data.order.transactionId) {
list.map((item: TableData) => { state.tableData.param.externalOrderId = res.data.order.transactionId;
data.push({ }
tradeNo: item.tradeNo,
externalTradeNo: item.externalTradeNo,
uid: item.uid,
StringId: item.stringId,
timeStr: item.CreateTime,
CfgId: item.config,
Rmb: item.amount,
status: item.status,
CreateTime: item.CreateTime,
channel: item.channel,
server: item.server,
});
});
state.tableData.data = data;
})
};
//
onMounted(() => {
serverList().then(res => {
state.servers = res;
}); });
allChannelList().then(res => {
state.channels = res;
});
});
const changeState = (order: string, state: number, remark: string) => {
if (state != 3 && state != 2) {
return
}
if (state == 3) {
let mess = "是否确认订单失效?,点击确认后本条订单失效。";
ElMessageBox.confirm(mess).then(() => {
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 => {
if (res.data.data == 1) {
ElMessage.success('发送成功');
}
orderList();
})
});
}
}; };
return { const orderList = () => {
orderList, const data: Array<TableData> = [];
changeState, gameOrderList(state.tableData.param).then((res) => {
...toRefs(state), console.log(res);
}; state.tableData.total = Number(res.data.total) || 0;
}, const list = res.data.list || [];
list.map((item: TableData) => {
data.push({
tradeNo: item.tradeNo,
externalTradeNo: item.externalTradeNo,
uid: item.uid,
StringId: item.stringId,
timeStr: item.CreateTime,
CfgId: item.config,
Rmb: item.amount,
status: item.status,
CreateTime: item.CreateTime,
channel: item.channel,
server: item.server,
});
});
state.tableData.data = data;
});
};
//
onMounted(() => {
serverList().then((res) => {
state.servers = res;
});
allChannelList().then((res) => {
state.channels = res;
});
});
const changeState = (order: string, state: number, remark: string) => {
if (state != 3 && state != 2) {
return;
}
if (state == 3) {
let mess = '是否确认订单失效?,点击确认后本条订单失效。';
ElMessageBox.confirm(mess).then(() => {
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) => {
if (res.data.data == 1) {
ElMessage.success('发送成功');
}
orderList();
});
});
}
};
return {
transactionList,
orderList,
changeState,
...toRefs(state),
};
},
}); });
</script> </script>

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

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

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

@ -18,40 +18,23 @@
<div v-show="item.show"> <div v-show="item.show">
<div class="flex-warp"> <div class="flex-warp">
<el-form-item label="期数" prop="periodId"> <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-option v-for="item in unique(battlePassConfig)" :key="item.PeriodId" :label="item.PeriodId + '期'" :value="item.PeriodId" />
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item label="开始时间" prop="beginTime"> <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-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>
<el-form-item label="结束时间" prop="endTime"> <el-button size="default" class="ml10" @click="onSubmit" :disabled="query.serverIds.length == 0">
<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-icon> <el-icon>
<ele-Promotion /> <ele-Promotion />
</el-icon> </el-icon>
@ -62,23 +45,17 @@
<el-form-item prop="periodId" label="显示期数"> <el-form-item prop="periodId" label="显示期数">
<el-select size="default" placeholder="请选择显示期数" filterable v-model="query.periodId" @change="getProp"> <el-select size="default" placeholder="请选择显示期数" filterable v-model="query.periodId" @change="getProp">
<el-option label="全部" value="" /> <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-select>
</el-form-item> </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>
<div class="flex-warp"> <div class="flex-warp">
<el-table <el-table ref="tableRef" :data="tableData.data" :span-method="objectSpanMethod" border @selection-change="handleSelectionChange">
ref="tableRef" <el-table-column prop="platform" label="平台" width="80">
: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">
<template #default="scope"> <template #default="scope">
<div v-if="scope.row.sort == 0">其他</div> <div v-if="scope.row.sort == 0">其他</div>
<div v-else-if="scope.row.sort == 1">ios</div> <div v-else-if="scope.row.sort == 1">ios</div>
@ -90,16 +67,76 @@
<el-table-column prop="area" label="区服编号" width="85"> <el-table-column prop="area" label="区服编号" width="85">
<template #default="scope"> {{ scope.row.area }}</template> <template #default="scope"> {{ scope.row.area }}</template>
</el-table-column> </el-table-column>
<el-table-column prop="name" label="服务器名称" show-overflow-tooltip width="200" /> <el-table-column prop="name" label="服务器名称" width="200" />
<el-table-column prop="periodId" label="当前期数" show-overflow-tooltip width="85" /> <el-table-column prop="PeriodId" label="当前期数" width="85" />
<el-table-column prop="state" label="状态" show-overflow-tooltip width="100" /> <el-table-column prop="State" label="状态" width="100">
<el-table-column prop="StartTime" label="开始时间" show-overflow-tooltip width="200" /> <template #default="scope">
<el-table-column prop="EndTime" label="结束时间" show-overflow-tooltip width="200" /> <div v-if="scope.row.BeginTime > Date.now() / 1000" style="color: #66b7cf">未开启</div>
<el-table-column type="selection" width="55" :selectable="selectable" /> <div v-else-if="scope.row.State == 1" style="color: #f81f26">开启</div>
<el-table-column prop="" label="开关" show-overflow-tooltip width="100" /> <div v-else-if="scope.row.State == 2">关闭</div>
<el-table-column prop="" label="操作" width="100"> <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">
<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"> <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-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> </template>
</el-table-column> </el-table-column>
</el-table> </el-table>
@ -110,11 +147,10 @@
</div> </div>
</template> </template>
<script lang="ts"> <script lang="ts">
import { defineComponent, onMounted, reactive, ref, toRefs, unref } from 'vue'; import { defineComponent, onMounted, reactive, ref, toRefs } from 'vue';
import { gameGMCheckBattlePassCheck, gameGMGetBattlePass, gameGMInsertBattlePass } from '/@/api/game/gameConfig'; import { gameGMCheckPeriodIdBattlePass, gameGMGetBattlePass, gameGMInsertBattlePass, gameGMUpdateBattlePass } from '/@/api/game/gameConfig';
import BattlePassConfigCategory from '/@/api/config/BattlePassConfigCategory.json'; import BattlePassConfigCategory from '/@/api/config/BattlePassConfigCategory.json';
import { ElLoading, ElMessage } from 'element-plus'; import { ElLoading, ElMessage, ElMessageBox } from 'element-plus';
import type { TableInstance } from 'element-plus';
import { uniquePeriodId, zeroFill } from '/@/utils/utils'; import { uniquePeriodId, zeroFill } from '/@/utils/utils';
import { serverList } from '/@/utils/game'; import { serverList } from '/@/utils/game';
@ -123,15 +159,18 @@ interface Props {
periodId: string; periodId: string;
beginTime: number; beginTime: number;
endTime: number; endTime: number;
times: number[];
} }
interface TableDataState { interface TableDataState {
props: Props; props: Props;
query: object; query: object;
tableData: { data: object[]; list: object[]; edit: object };
battlePassList: object[]; battlePassList: object[];
centerDialogVisible: boolean; ignoreSelectList: object[];
checkTime: number; // checkTime: number;
checkTimeColor: string; // checkTimeColor: string;
listVisible: boolean;
check: boolean; check: boolean;
lastDate: number; lastDate: number;
curDate: number; curDate: number;
@ -148,16 +187,15 @@ interface SpanMethodProps {
} }
export default defineComponent({ export default defineComponent({
name: 'systemServerBattlePassUpdate', name: 'apiV1ServerBattlePass',
setup: function () { setup: function () {
const formRef = ref<HTMLElement | null>(null);
const tableRef = ref(); const tableRef = ref();
let date = new Date(); let date = new Date();
let getBeginTime = (date: number) => { 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) => { 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>({ const state = reactive<TableDataState>({
lastDate: 0, lastDate: 0,
@ -167,171 +205,197 @@ export default defineComponent({
query: { query: {
serverIds: [], serverIds: [],
periodId: '', periodId: '',
showOnly: true,
}, },
props: { props: {
id: '', id: '',
periodId: BattlePassConfigCategory[0].PeriodId, periodId: BattlePassConfigCategory[0].PeriodId,
beginTime: getBeginTime(date.getTime()), beginTime: getBeginTime(date.getTime()),
endTime: getEndTime(date.getTime()), endTime: getEndTime(date.getTime()),
times: [getBeginTime(date.getTime()), getEndTime(date.getTime())],
}, },
battlePass: [], tableData: { data: [], list: [], edit: {} },
battlePassList: [],
ignoreSelectList: [],
battlePassConfig: BattlePassConfigCategory, battlePassConfig: BattlePassConfigCategory,
centerDialogVisible: false, listVisible: false,
checkTime: 0,
checkTimeColor: 'primary',
selectModel: '', selectModel: '',
servers: [], servers: [],
}); });
const onCheckTime = () => { const onCheckPeriodId = () => {
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 loading = ElLoading.service({ const loading = ElLoading.service({
lock: true, lock: true,
text: 'Loading', text: 'Loading',
background: 'rgba(0, 0, 0, 0.7)', background: 'rgba(0, 0, 0, 0.7)',
}); });
console.log(state.query.serverIds);
for (let i in state.query.serverIds) { state.tableData.list = [];
let data = { gameGMCheckPeriodIdBattlePass({ periodId: state.props.periodId })
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)
.then((res) => { .then((res) => {
console.log('onCheckTime:', res); console.log('gameGMGetBattlePass: ', res);
if (!res || Number(res.code) != 0 || !res.data || res.data.total > 0) { if (res.code != 0 || !res.data || !res.data.list) {
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);
return; return;
} }
loading.close(); state.tableData.list = res.data.list;
state.checkTime = 1; state.ignoreSelectList = state.tableData.list
state.checkTimeColor = 'primary'; .filter((r) => r.PeriodId == state.props.periodId || (r.PeriodId > state.props.periodId && r.BeginTime < Date.now() / 1000))
ElMessage.success('验证通过'); .map((item) => item.Server);
console.log('state.ignoreSelectList: ', state.ignoreSelectList);
}) })
.catch(() => { .finally(() => {
loading.close(); 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 = () => { 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({ const loading = ElLoading.service({
lock: true, lock: true,
text: 'Loading', text: 'Loading',
background: 'rgba(0, 0, 0, 0.7)', background: 'rgba(0, 0, 0, 0.7)',
}); });
state.centerDialogVisible = false; state.tableData.total = state.query.serverIds.length;
const formWrap = unref(formRef) as any; for (let i in state.query.serverIds) {
if (!formWrap) return;
formWrap.validate((valid: boolean) => {
console.log('monthly:', valid, state.props);
if (!valid) {
ElMessage.error('有未配置完成的部分,请检查!');
return;
}
let monthly = onState(); let monthly = onState();
console.log('monthly0:', monthly); monthly.Server = state.query.serverIds[i];
if (!monthly.BeginTime || !monthly.EndTime) {
ElMessage.error('有未配置完成的部分1,请检查!');
return;
}
console.log('monthly1:', monthly); console.log('monthly1:', monthly);
gameGMInsertBattlePass(monthly) insertData(loading, monthly);
.then(() => { }
ElMessage.success('活动更新成功'); };
state.check = false; const insertData = (loading, monthly) => {
}) gameGMInsertBattlePass(monthly)
.finally(() => { .then(() => {
loading.close(); ElMessage.success(monthly.Server + '区活动更新成功');
}); state.check = false;
}); })
.finally(() => {
loading.close();
state.tableData.total--;
if (state.tableData.total == 0) {
getProp();
}
});
}; };
onMounted(() => { onMounted(() => {
state.props.id = ''; state.props.id = '';
state.rows = {}; state.rows = {};
serverList().then((res) => { serverList().then((res) => {
state.servers = 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); console.log('serverList:', res);
getProp();
}); });
getProp();
}); });
const onState = () => { const onState = () => {
let data = { let data = {
BeginTime: state.props.beginTime, BeginTime: Math.floor(state.props.times[0] / 1000),
EndTime: state.props.endTime, EndTime: Math.floor(state.props.times[1] / 1000),
serverIds: state.query.serverIds, Server: '',
State: 1,
PeriodId: state.props.periodId, PeriodId: state.props.periodId,
}; };
console.log('data: ', data); console.log('data: ', data);
return data; return data;
}; };
const getProp = () => { const getProp = () => {
const loading = ElLoading.service({ const loading = ElLoading.service({
lock: true, lock: true,
text: 'Loading', text: 'Loading',
background: 'rgba(0, 0, 0, 0.7)', background: 'rgba(0, 0, 0, 0.7)',
}); });
state.tableData.data = [];
gameGMGetBattlePass({ periodId: state.query.periodId }) gameGMGetBattlePass({ periodId: state.query.periodId })
.then((res) => { .then((res) => {
console.log('gameGMGetBattlePass: ', 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(() => { .finally(() => {
loading.close(); loading.close();
}); });
}; };
const unique = (arr) => { const unique = () => {
return uniquePeriodId(arr); return uniquePeriodId(BattlePassConfigCategory);
}; };
const objectSpanMethod = ({ row, column, rowIndex, columnIndex }: SpanMethodProps) => { const objectSpanMethod = ({ row, column, rowIndex, columnIndex }: SpanMethodProps) => {
if (columnIndex === 0) { if (columnIndex === 0) {
@ -349,24 +413,107 @@ export default defineComponent({
} }
}; };
const handleSelectionChange = (selection: any[]) => { 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); state.query.serverIds = selection.map((item) => item.id);
console.log(state.query.serverId, selection); console.log(state.query.serverId, selection);
}; };
// const getSelectionRows = (selection: any[]) => { const selectable = (row) => !state.ignoreSelectList.includes(row.id);
// state.checkTime = 0; const disabledDate = (time) => {
// state.query.serverIds = selection.map((item) => item.id); return time.getTime() < Date.now();
// console.log(state.query.serverId, selection); };
// }; const onUpdate = () => {
const selectable = (row) => ![].includes(row.id); 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;
};
return { return {
handleClose,
onEdit,
onUpdate1,
onUpdate,
disabledDate,
onCheckPeriodId,
tableRef,
insertData,
selectable, selectable,
handleSelectionChange, handleSelectionChange,
objectSpanMethod, objectSpanMethod,
onSubmit, onSubmit,
formRef,
unique, unique,
onCheckTime,
getProp, getProp,
zeroFill, zeroFill,
...toRefs(state), ...toRefs(state),
@ -376,16 +523,29 @@ export default defineComponent({
</script> </script>
<style scoped lang="scss"> <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 { .table-item {
margin-top: 10px; margin-top: 10px;
margin-bottom: -10px; margin-bottom: -10px;
} }
.box-card .el-card__header { .box-card .el-card__header {
background-color: #409eff; background-color: #062ce6;
color: #fff; 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 { ::v-deep .el-table--striped .el-table__body tr.el-table__row--striped td {
background: #f0ffd5; background: #f0ffd5;
} }

Loading…
Cancel
Save