fix bug
10
.claude/settings.local.json
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
{
|
||||||
|
"permissions": {
|
||||||
|
"allow": [
|
||||||
|
"Bash(dir:*)",
|
||||||
|
"Bash(npm run build:*)"
|
||||||
|
],
|
||||||
|
"deny": [],
|
||||||
|
"ask": []
|
||||||
|
}
|
||||||
|
}
|
||||||
BIN
doc/image/异常错误页面/微信图片_20251127165947_230_2.png
Normal file
|
After Width: | Height: | Size: 39 KiB |
BIN
doc/image/异常错误页面/微信图片_20251129122640_263_2.png
Normal file
|
After Width: | Height: | Size: 14 KiB |
BIN
doc/image/异常错误页面/微信图片_20251129124537_264_2.png
Normal file
|
After Width: | Height: | Size: 66 KiB |
BIN
doc/image/异常错误页面/微信图片_20251129135753_265_2.png
Normal file
|
After Width: | Height: | Size: 56 KiB |
BIN
doc/image/订单管理页面/微信图片_20251127165816_221_2.png
Normal file
|
After Width: | Height: | Size: 46 KiB |
BIN
doc/image/订单管理页面/微信图片_20251127165824_222_2.png
Normal file
|
After Width: | Height: | Size: 42 KiB |
BIN
doc/image/订单管理页面/微信图片_20251127165835_223_2.png
Normal file
|
After Width: | Height: | Size: 43 KiB |
BIN
doc/image/订单管理页面/微信图片_20251127165841_224_2.png
Normal file
|
After Width: | Height: | Size: 40 KiB |
BIN
doc/image/订单管理页面/微信图片_20251127165848_225_2.png
Normal file
|
After Width: | Height: | Size: 36 KiB |
BIN
doc/image/订单管理页面/微信图片_20251127165857_226_2.png
Normal file
|
After Width: | Height: | Size: 55 KiB |
BIN
doc/image/订单管理页面/微信图片_20251127165903_227_2.png
Normal file
|
After Width: | Height: | Size: 59 KiB |
BIN
doc/image/订单管理页面/微信图片_20251127165909_228_2.png
Normal file
|
After Width: | Height: | Size: 35 KiB |
BIN
doc/image/订单管理页面/微信图片_20251127165915_229_2.png
Normal file
|
After Width: | Height: | Size: 36 KiB |
BIN
doc/image/订单管理页面/微信图片_20251127165947_230_2.png
Normal file
|
After Width: | Height: | Size: 44 KiB |
15
index.html
@@ -17,21 +17,18 @@
|
|||||||
<link rel='stylesheet' href='/iconfont/saber/iconfont.css'>
|
<link rel='stylesheet' href='/iconfont/saber/iconfont.css'>
|
||||||
<link rel='stylesheet' href='/css/loading.css'>
|
<link rel='stylesheet' href='/css/loading.css'>
|
||||||
<link rel='stylesheet' href='/css/saber.css'>
|
<link rel='stylesheet' href='/css/saber.css'>
|
||||||
<title>Saber企业级开发平台</title>
|
<title>武术赛事通</title>
|
||||||
</head>
|
</head>
|
||||||
|
|
||||||
<body>
|
<body>
|
||||||
<div id='app'>
|
<div id='app'>
|
||||||
<div id='loader-wrapper'>
|
<div id='loader-wrapper'>
|
||||||
<div class='loader-box'>
|
<div class='loader-box'>
|
||||||
<span>Saber</span>
|
<span>武</span>
|
||||||
<span>企</span>
|
<span>术</span>
|
||||||
<span>业</span>
|
<span>赛</span>
|
||||||
<span>级</span>
|
<span>事</span>
|
||||||
<span>开</span>
|
<span>通</span>
|
||||||
<span>发</span>
|
|
||||||
<span>平</span>
|
|
||||||
<span>台</span>
|
|
||||||
</div>
|
</div>
|
||||||
<div class='loader-title'>系统加载中</div>
|
<div class='loader-title'>系统加载中</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
{
|
{
|
||||||
"name": "saber",
|
"name": "martial-web",
|
||||||
"version": "4.0.1",
|
"version": "4.0.1",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"dev": "vite --host",
|
"dev": "vite --host",
|
||||||
|
|||||||
BIN
public/img/图标 3@3x.png
Normal file
|
After Width: | Height: | Size: 1.2 KiB |
BIN
public/img/图标 4@3x.png
Normal file
|
After Width: | Height: | Size: 1.2 KiB |
@@ -1,4 +1,4 @@
|
|||||||
import request from '@/router/axios';
|
import request from '@/axios';
|
||||||
|
|
||||||
// ==================== 武术赛事订单管理接口 ====================
|
// ==================== 武术赛事订单管理接口 ====================
|
||||||
|
|
||||||
|
|||||||
@@ -2,10 +2,10 @@
|
|||||||
* 全局配置文件
|
* 全局配置文件
|
||||||
*/
|
*/
|
||||||
export default {
|
export default {
|
||||||
title: 'saber',
|
title: '武术赛事通',
|
||||||
logo: 'S',
|
logo: '武',
|
||||||
key: 'saber', //配置主键,目前用于存储
|
key: 'saber', //配置主键,目前用于存储
|
||||||
indexTitle: 'Saber Admin',
|
indexTitle: '武术赛事通',
|
||||||
clientId: 'saber3', // 客户端id
|
clientId: 'saber3', // 客户端id
|
||||||
clientSecret: 'saber3_secret', // 客户端密钥
|
clientSecret: 'saber3_secret', // 客户端密钥
|
||||||
tenantMode: true, // 是否开启租户模式
|
tenantMode: true, // 是否开启租户模式
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
export default {
|
export default {
|
||||||
title: 'Saber Admin',
|
title: 'Martial Arts Events',
|
||||||
logoutTip: 'Exit the system, do you want to continue?',
|
logoutTip: 'Exit the system, do you want to continue?',
|
||||||
submitText: 'submit',
|
submitText: 'submit',
|
||||||
cancelText: 'cancel',
|
cancelText: 'cancel',
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
export default {
|
export default {
|
||||||
title: 'Saber企业级开发平台',
|
title: '武术赛事通',
|
||||||
logoutTip: '退出系统, 是否继续?',
|
logoutTip: '退出系统, 是否继续?',
|
||||||
submitText: '确定',
|
submitText: '确定',
|
||||||
cancelText: '取消',
|
cancelText: '取消',
|
||||||
|
|||||||
@@ -9,20 +9,20 @@
|
|||||||
{{ time }}
|
{{ time }}
|
||||||
</div>
|
</div>
|
||||||
<div class="login-left-content">
|
<div class="login-left-content">
|
||||||
<h1 class="title">智能设备管理系统</h1>
|
<h1 class="title">武术赛事通</h1>
|
||||||
<p class="subtitle">专业的设备管理解决方案</p>
|
<p class="subtitle">专业的武术赛事管理平台</p>
|
||||||
<div class="feature-box">
|
<div class="feature-box">
|
||||||
<div class="feature-item">
|
<div class="feature-item">
|
||||||
<span>设备实时监控</span>
|
<span>赛事报名管理</span>
|
||||||
</div>
|
</div>
|
||||||
<div class="feature-item">
|
<div class="feature-item">
|
||||||
<span>数据分析统计</span>
|
<span>赛程编排</span>
|
||||||
</div>
|
</div>
|
||||||
<div class="feature-item">
|
<div class="feature-item">
|
||||||
<span>智能预警</span>
|
<span>赛事调度</span>
|
||||||
</div>
|
</div>
|
||||||
<div class="feature-item">
|
<div class="feature-item">
|
||||||
<span>远程控制</span>
|
<span>数据统计分析</span>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -30,7 +30,7 @@
|
|||||||
<div class="login-border">
|
<div class="login-border">
|
||||||
<div class="login-main">
|
<div class="login-main">
|
||||||
<h4 class="login-title">
|
<h4 class="login-title">
|
||||||
登录 saber
|
登录 武术赛事通
|
||||||
<top-lang></top-lang>
|
<top-lang></top-lang>
|
||||||
</h4>
|
</h4>
|
||||||
<userLogin></userLogin>
|
<userLogin></userLogin>
|
||||||
|
|||||||
@@ -42,4 +42,35 @@ export default [
|
|||||||
},
|
},
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
path: '/martial',
|
||||||
|
component: Layout,
|
||||||
|
redirect: '/martial/order/list',
|
||||||
|
children: [
|
||||||
|
{
|
||||||
|
path: 'registration/detail',
|
||||||
|
name: '报名详情',
|
||||||
|
meta: {
|
||||||
|
keepAlive: false,
|
||||||
|
},
|
||||||
|
component: () => import(/* webpackChunkName: "martial" */ '@/views/martial/registration/detail.vue'),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
path: 'schedule/list',
|
||||||
|
name: '编排',
|
||||||
|
meta: {
|
||||||
|
keepAlive: false,
|
||||||
|
},
|
||||||
|
component: () => import(/* webpackChunkName: "martial" */ '@/views/martial/schedule/list.vue'),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
path: 'dispatch/list',
|
||||||
|
name: '调度',
|
||||||
|
meta: {
|
||||||
|
keepAlive: false,
|
||||||
|
},
|
||||||
|
component: () => import(/* webpackChunkName: "martial" */ '@/views/martial/dispatch/list.vue'),
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
];
|
];
|
||||||
|
|||||||
@@ -1,15 +1,13 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="martial-dispatch-container">
|
<div class="martial-dispatch-container">
|
||||||
<el-card shadow="hover">
|
<div class="page-header">
|
||||||
<div class="page-header">
|
<el-button icon="el-icon-back" size="small" @click="goBack">返回</el-button>
|
||||||
<el-button icon="el-icon-back" @click="goBack" size="small">返回</el-button>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<h2 class="page-title">调度</h2>
|
<h2 class="page-title">调度</h2>
|
||||||
|
</div>
|
||||||
|
|
||||||
<div class="tabs-section">
|
<div class="tabs-section">
|
||||||
<div class="tab-buttons">
|
<div class="tab-buttons">
|
||||||
<el-button type="primary">竞赛分组</el-button>
|
<el-button size="small" type="primary">竞赛分组</el-button>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="tab-content">
|
<div class="tab-content">
|
||||||
@@ -23,7 +21,7 @@
|
|||||||
>
|
>
|
||||||
{{ time }}
|
{{ time }}
|
||||||
</el-button>
|
</el-button>
|
||||||
<el-button size="small" type="success" @click="handleBatchComplete" style="margin-left: auto;">
|
<el-button size="small" plain style="margin-left: auto;" @click="handleBatchComplete">
|
||||||
批次完赛
|
批次完赛
|
||||||
</el-button>
|
</el-button>
|
||||||
</div>
|
</div>
|
||||||
@@ -37,43 +35,61 @@
|
|||||||
<span class="group-meta">{{ group.code }}</span>
|
<span class="group-meta">{{ group.code }}</span>
|
||||||
</div>
|
</div>
|
||||||
<div class="group-actions">
|
<div class="group-actions">
|
||||||
<el-button
|
<div class="toggle-buttons">
|
||||||
size="small"
|
<el-button size="small" :type="group.viewMode === 'dispatch' ? 'primary' : ''" @click="setViewMode(index, 'dispatch')">
|
||||||
:type="group.venueType === 1 ? 'primary' : 'success'"
|
调度列表
|
||||||
@click="handleVenueChange(index)"
|
</el-button>
|
||||||
>
|
<el-button size="small" :type="group.viewMode === 'menu' ? 'primary' : 'success'" @click="setViewMode(index, 'menu')">
|
||||||
{{ group.venueType === 1 ? '一号场地' : '二号场地' }}
|
{{ group.venueType === 1 ? '一号场地' : '二号场地' }}
|
||||||
</el-button>
|
</el-button>
|
||||||
|
</div>
|
||||||
<el-button size="small" type="danger">赛程</el-button>
|
<el-button size="small" type="danger">赛程</el-button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<el-table :data="group.items" border stripe size="small">
|
<el-table :data="group.items" border stripe size="small">
|
||||||
<el-table-column label="序号" type="index" width="80" align="center"></el-table-column>
|
<el-table-column label="序号" type="index" width="60" align="center"></el-table-column>
|
||||||
<el-table-column prop="schoolUnit" label="学校/单位" min-width="200"></el-table-column>
|
<el-table-column prop="schoolUnit" label="学校/单位" min-width="200"></el-table-column>
|
||||||
<el-table-column label="状态" width="120" align="center">
|
<el-table-column label="状态" width="100" align="center">
|
||||||
<template slot-scope="scope">
|
<template #default="scope">
|
||||||
<el-tag v-if="scope.row.completed" type="success" size="small">已完赛</el-tag>
|
<el-tag v-if="scope.row.completed" type="success" size="small">已完赛</el-tag>
|
||||||
<el-tag v-else type="warning" size="small">未完赛</el-tag>
|
<el-tag v-else type="warning" size="small">未完赛</el-tag>
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
<el-table-column label="裁判" width="120" align="center">
|
<el-table-column label="裁判" width="100" align="center">
|
||||||
<template slot-scope="scope">
|
<template #default="scope">
|
||||||
<el-tag v-if="scope.row.refereed" type="success" size="small">已裁判</el-tag>
|
<el-tag v-if="scope.row.refereed" type="success" size="small">已裁判</el-tag>
|
||||||
<el-tag v-else type="danger" size="small">未裁判</el-tag>
|
<el-tag v-else type="danger" size="small">未裁判</el-tag>
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
<el-table-column label="操作" width="120" align="center">
|
<el-table-column label="操作" width="100" align="center">
|
||||||
<template>
|
<template #default="scope">
|
||||||
<el-button type="text" icon="el-icon-upload2" size="small"></el-button>
|
<el-button
|
||||||
<el-button type="text" icon="el-icon-download" size="small"></el-button>
|
type="text"
|
||||||
|
size="small"
|
||||||
|
@click="handleMoveUp(index, scope.$index)"
|
||||||
|
:disabled="scope.$index === 0"
|
||||||
|
title="上移"
|
||||||
|
class="move-btn"
|
||||||
|
>
|
||||||
|
<img src="/img/图标 3@3x.png" class="move-icon" alt="上移" />
|
||||||
|
</el-button>
|
||||||
|
<el-button
|
||||||
|
type="text"
|
||||||
|
size="small"
|
||||||
|
@click="handleMoveDown(index, scope.$index)"
|
||||||
|
:disabled="scope.$index === group.items.length - 1"
|
||||||
|
title="下移"
|
||||||
|
class="move-btn"
|
||||||
|
>
|
||||||
|
<img src="/img/图标 4@3x.png" class="move-icon" alt="下移" />
|
||||||
|
</el-button>
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
</el-table>
|
</el-table>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</el-card>
|
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
@@ -82,7 +98,7 @@ export default {
|
|||||||
name: 'MartialDispatchList',
|
name: 'MartialDispatchList',
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
activeTab: 'competition',
|
orderId: null,
|
||||||
selectedTime: 1,
|
selectedTime: 1,
|
||||||
timeSlots: [
|
timeSlots: [
|
||||||
'2025年11月6日上午8:30',
|
'2025年11月6日上午8:30',
|
||||||
@@ -94,8 +110,9 @@ export default {
|
|||||||
title: '1. 小学组小组赛男女类',
|
title: '1. 小学组小组赛男女类',
|
||||||
type: '集体',
|
type: '集体',
|
||||||
count: '2队',
|
count: '2队',
|
||||||
code: '1组',
|
code: '1101',
|
||||||
venueType: 1,
|
venueType: 1,
|
||||||
|
viewMode: 'dispatch',
|
||||||
items: [
|
items: [
|
||||||
{ schoolUnit: '少林寺武校', completed: true, refereed: false },
|
{ schoolUnit: '少林寺武校', completed: true, refereed: false },
|
||||||
{ schoolUnit: '访河社区', completed: false, refereed: false }
|
{ schoolUnit: '访河社区', completed: false, refereed: false }
|
||||||
@@ -107,30 +124,73 @@ export default {
|
|||||||
count: '3队',
|
count: '3队',
|
||||||
code: '1组',
|
code: '1组',
|
||||||
venueType: 2,
|
venueType: 2,
|
||||||
|
viewMode: 'dispatch',
|
||||||
items: [
|
items: [
|
||||||
{ schoolUnit: '少林寺武校', completed: true, refereed: true },
|
{ schoolUnit: '少林寺武校', completed: true, refereed: true },
|
||||||
{ schoolUnit: '访河社区', completed: false, refereed: false },
|
{ schoolUnit: '访河社区', completed: false, refereed: false },
|
||||||
{ schoolUnit: '少林寺武校', completed: true, refereed: true }
|
{ schoolUnit: '少林寺武校', completed: true, refereed: true }
|
||||||
]
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '2. 中学组决赛',
|
||||||
|
type: '集体',
|
||||||
|
count: '4队',
|
||||||
|
code: '2101',
|
||||||
|
venueType: 1,
|
||||||
|
viewMode: 'dispatch',
|
||||||
|
items: [
|
||||||
|
{ schoolUnit: '成都体育学院', completed: true, refereed: true },
|
||||||
|
{ schoolUnit: '武侯实验中学', completed: true, refereed: false },
|
||||||
|
{ schoolUnit: '石室中学', completed: false, refereed: false },
|
||||||
|
{ schoolUnit: '七中育才', completed: false, refereed: false }
|
||||||
|
]
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
mounted() {
|
||||||
|
this.orderId = this.$route.query.orderId
|
||||||
|
// 使用静态数据,不调用API
|
||||||
|
},
|
||||||
methods: {
|
methods: {
|
||||||
goBack() {
|
goBack() {
|
||||||
this.$router.go(-1)
|
this.$router.push('/martial/order/list')
|
||||||
},
|
},
|
||||||
handleVenueChange(index) {
|
setViewMode(index, mode) {
|
||||||
const group = this.dispatchGroups[index]
|
this.dispatchGroups[index].viewMode = mode
|
||||||
group.venueType = group.venueType === 1 ? 2 : 1
|
this.$message.success(`已切换到${mode === 'dispatch' ? '调度列表' : '场地'}模式`)
|
||||||
|
},
|
||||||
|
handleMoveUp(groupIndex, itemIndex) {
|
||||||
|
if (itemIndex === 0) return
|
||||||
|
const group = this.dispatchGroups[groupIndex]
|
||||||
|
const temp = group.items[itemIndex]
|
||||||
|
group.items.splice(itemIndex, 1)
|
||||||
|
group.items.splice(itemIndex - 1, 0, temp)
|
||||||
|
this.$message.success('上移成功')
|
||||||
|
},
|
||||||
|
handleMoveDown(groupIndex, itemIndex) {
|
||||||
|
const group = this.dispatchGroups[groupIndex]
|
||||||
|
if (itemIndex === group.items.length - 1) return
|
||||||
|
const temp = group.items[itemIndex]
|
||||||
|
group.items.splice(itemIndex, 1)
|
||||||
|
group.items.splice(itemIndex + 1, 0, temp)
|
||||||
|
this.$message.success('下移成功')
|
||||||
},
|
},
|
||||||
handleBatchComplete() {
|
handleBatchComplete() {
|
||||||
this.$confirm('确定要标记所有为完赛状态吗?', '批次完赛', {
|
this.$confirm('确定要标记当前批次所有为完赛状态吗?', '批次完赛', {
|
||||||
confirmButtonText: '确定',
|
confirmButtonText: '确定',
|
||||||
cancelButtonText: '取消',
|
cancelButtonText: '取消',
|
||||||
type: 'warning'
|
type: 'warning'
|
||||||
}).then(() => {
|
}).then(() => {
|
||||||
|
// 标记当前时间段所有为完赛
|
||||||
|
this.dispatchGroups.forEach(group => {
|
||||||
|
group.items.forEach(item => {
|
||||||
|
item.completed = true
|
||||||
|
})
|
||||||
|
})
|
||||||
this.$message.success('批次完赛成功')
|
this.$message.success('批次完赛成功')
|
||||||
|
}).catch(() => {
|
||||||
|
// 取消操作
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -139,43 +199,46 @@ export default {
|
|||||||
|
|
||||||
<style lang="scss" scoped>
|
<style lang="scss" scoped>
|
||||||
.martial-dispatch-container {
|
.martial-dispatch-container {
|
||||||
padding: 20px;
|
padding: 15px;
|
||||||
|
background: #fff;
|
||||||
|
|
||||||
.page-header {
|
.page-header {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
margin-bottom: 15px;
|
margin-bottom: 15px;
|
||||||
}
|
gap: 10px;
|
||||||
|
|
||||||
.page-title {
|
.page-title {
|
||||||
margin: 0 0 25px 0;
|
margin: 0;
|
||||||
font-size: 20px;
|
font-size: 18px;
|
||||||
font-weight: 600;
|
font-weight: 600;
|
||||||
color: #2c3e50;
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.tabs-section {
|
.tabs-section {
|
||||||
.tab-buttons {
|
.tab-buttons {
|
||||||
margin-bottom: 20px;
|
margin-bottom: 15px;
|
||||||
display: flex;
|
display: flex;
|
||||||
gap: 10px;
|
gap: 8px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.tab-content {
|
.tab-content {
|
||||||
.time-selector {
|
.time-selector {
|
||||||
margin-bottom: 20px;
|
margin-bottom: 15px;
|
||||||
display: flex;
|
display: flex;
|
||||||
gap: 10px;
|
gap: 8px;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
flex-wrap: wrap;
|
flex-wrap: wrap;
|
||||||
}
|
}
|
||||||
|
|
||||||
.dispatch-group {
|
.dispatch-group {
|
||||||
margin-bottom: 25px;
|
margin-bottom: 15px;
|
||||||
|
|
||||||
.group-header {
|
.group-header {
|
||||||
display: flex;
|
display: flex;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
justify-content: space-between;
|
justify-content: space-between;
|
||||||
padding: 12px 16px;
|
padding: 10px 14px;
|
||||||
background: #f5f7fa;
|
background: #f5f7fa;
|
||||||
border: 1px solid #e4e7ed;
|
border: 1px solid #e4e7ed;
|
||||||
border-bottom: none;
|
border-bottom: none;
|
||||||
@@ -183,27 +246,49 @@ export default {
|
|||||||
.group-info {
|
.group-info {
|
||||||
display: flex;
|
display: flex;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
gap: 15px;
|
gap: 12px;
|
||||||
|
|
||||||
.group-title {
|
.group-title {
|
||||||
font-weight: 600;
|
font-weight: 600;
|
||||||
color: #2c3e50;
|
color: #2c3e50;
|
||||||
font-size: 14px;
|
font-size: 13px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.group-meta {
|
.group-meta {
|
||||||
color: #909399;
|
color: #909399;
|
||||||
font-size: 13px;
|
font-size: 12px;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.group-actions {
|
.group-actions {
|
||||||
display: flex;
|
display: flex;
|
||||||
gap: 10px;
|
gap: 8px;
|
||||||
|
align-items: center;
|
||||||
|
|
||||||
|
.toggle-buttons {
|
||||||
|
display: flex;
|
||||||
|
gap: 4px;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.move-btn {
|
||||||
|
padding: 4px;
|
||||||
|
|
||||||
|
&:disabled {
|
||||||
|
opacity: 0.4;
|
||||||
|
cursor: not-allowed;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.move-icon {
|
||||||
|
width: 20px;
|
||||||
|
height: 20px;
|
||||||
|
display: inline-block;
|
||||||
|
vertical-align: middle;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
|
|||||||
@@ -4,14 +4,14 @@
|
|||||||
<div class="page-header">
|
<div class="page-header">
|
||||||
<h2 class="page-title">订单管理</h2>
|
<h2 class="page-title">订单管理</h2>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<el-form :inline="true" :model="searchForm" class="search-form">
|
<el-form :inline="true" :model="searchForm" class="search-form">
|
||||||
<el-form-item>
|
<el-form-item>
|
||||||
<el-input
|
<el-input
|
||||||
v-model="searchForm.keyword"
|
v-model="searchForm.keyword"
|
||||||
placeholder="搜索订单号/用户"
|
placeholder="搜索订单号/用户"
|
||||||
clearable
|
clearable
|
||||||
style="width: 280px"
|
size="small"
|
||||||
|
style="width: 240px"
|
||||||
>
|
>
|
||||||
<i slot="prefix" class="el-input__icon el-icon-search"></i>
|
<i slot="prefix" class="el-input__icon el-icon-search"></i>
|
||||||
</el-input>
|
</el-input>
|
||||||
@@ -21,56 +21,50 @@
|
|||||||
v-model="searchForm.status"
|
v-model="searchForm.status"
|
||||||
placeholder="状态"
|
placeholder="状态"
|
||||||
clearable
|
clearable
|
||||||
style="width: 200px"
|
size="small"
|
||||||
|
style="width: 180px"
|
||||||
></el-input>
|
></el-input>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item>
|
<el-form-item>
|
||||||
<el-button type="primary" @click="handleSearch">查询</el-button>
|
<el-button type="primary" size="small" @click="handleSearch">查询</el-button>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-form>
|
</el-form>
|
||||||
|
|
||||||
<div v-if="tableData.length === 0" class="empty-data">
|
|
||||||
<div class="empty-content">
|
|
||||||
<p class="empty-text">编辑功能在完成后开启, 点击右侧<span style="color: #409eff">查看详情</span>进行详情在线查看</p>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<el-table
|
<el-table
|
||||||
v-else
|
|
||||||
v-loading="loading"
|
v-loading="loading"
|
||||||
:data="tableData"
|
:data="tableData"
|
||||||
border
|
border
|
||||||
stripe
|
stripe
|
||||||
|
size="small"
|
||||||
style="width: 100%"
|
style="width: 100%"
|
||||||
>
|
>
|
||||||
<el-table-column type="index" label="序号" width="80" align="center"></el-table-column>
|
<el-table-column type="index" label="序号" width="60" align="center"></el-table-column>
|
||||||
<el-table-column prop="orderNo" label="订单号" min-width="180" show-overflow-tooltip></el-table-column>
|
<el-table-column prop="orderNo" label="订单号" min-width="150" show-overflow-tooltip></el-table-column>
|
||||||
<el-table-column prop="userName" label="用户" width="120"></el-table-column>
|
<el-table-column prop="userName" label="用户" width="100"></el-table-column>
|
||||||
<el-table-column prop="competitionName" label="赛事" min-width="200" show-overflow-tooltip></el-table-column>
|
<el-table-column prop="competitionName" label="赛事" min-width="180" show-overflow-tooltip></el-table-column>
|
||||||
<el-table-column prop="amount" label="金额" width="120" align="center">
|
<el-table-column prop="amount" label="金额" width="100" align="center">
|
||||||
<template slot-scope="scope">
|
<template #default="scope">
|
||||||
<span class="amount-text">¥{{ scope.row.amount }}</span>
|
<span class="amount-text">¥{{ scope.row.amount }}</span>
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
<el-table-column prop="status" label="状态" width="100" align="center">
|
<el-table-column prop="status" label="状态" width="90" align="center">
|
||||||
<template slot-scope="scope">
|
<template #default="scope">
|
||||||
<el-tag :type="getStatusType(scope.row.status)" size="small">
|
<el-tag :type="getStatusType(scope.row.status)" size="small">
|
||||||
{{ getStatusText(scope.row.status) }}
|
{{ getStatusText(scope.row.status) }}
|
||||||
</el-tag>
|
</el-tag>
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
<el-table-column prop="createTime" label="创建时间" width="180"></el-table-column>
|
<el-table-column prop="createTime" label="创建时间" width="160"></el-table-column>
|
||||||
<el-table-column label="操作" width="280" align="center" fixed="right">
|
<el-table-column label="操作" width="320" align="center" fixed="right">
|
||||||
<template slot-scope="scope">
|
<template #default="scope">
|
||||||
<el-button type="primary" size="small" @click="handleView(scope.row)">查看详情</el-button>
|
<el-button type="primary" size="small" @click="handleRegistrationDetail(scope.row)">报名详情</el-button>
|
||||||
<el-button size="small" @click="handleEdit(scope.row)">编辑</el-button>
|
<el-button type="success" size="small" @click="handleSchedule(scope.row)" :disabled="!scope.row.canSchedule">编排</el-button>
|
||||||
<el-button size="small" @click="handleDelete(scope.row)">删除</el-button>
|
<el-button type="warning" size="small" @click="handleDispatch(scope.row)" :disabled="!scope.row.canDispatch">调度</el-button>
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
</el-table>
|
</el-table>
|
||||||
|
|
||||||
<el-pagination
|
<el-pagination
|
||||||
v-if="tableData.length > 0"
|
|
||||||
class="pagination"
|
class="pagination"
|
||||||
@size-change="handleSizeChange"
|
@size-change="handleSizeChange"
|
||||||
@current-change="handleCurrentChange"
|
@current-change="handleCurrentChange"
|
||||||
@@ -79,14 +73,13 @@
|
|||||||
:page-size="pagination.size"
|
:page-size="pagination.size"
|
||||||
layout="total, sizes, prev, pager, next"
|
layout="total, sizes, prev, pager, next"
|
||||||
:total="pagination.total"
|
:total="pagination.total"
|
||||||
|
small
|
||||||
></el-pagination>
|
></el-pagination>
|
||||||
</el-card>
|
</el-card>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
import { getOrderList, removeOrder } from '@/api/martial/competition'
|
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
name: 'MartialOrderList',
|
name: 'MartialOrderList',
|
||||||
data() {
|
data() {
|
||||||
@@ -96,6 +89,64 @@ export default {
|
|||||||
keyword: '',
|
keyword: '',
|
||||||
status: null
|
status: null
|
||||||
},
|
},
|
||||||
|
// 使用静态数据,方便演示功能
|
||||||
|
allTableData: [
|
||||||
|
{
|
||||||
|
id: 1,
|
||||||
|
orderNo: 'ORD20251127001',
|
||||||
|
userName: '张三',
|
||||||
|
competitionName: '第三十届武术大赛',
|
||||||
|
amount: 999.00,
|
||||||
|
status: 1,
|
||||||
|
createTime: '2025-11-27 10:30:00',
|
||||||
|
canSchedule: true, // 可以编排
|
||||||
|
canDispatch: false // 未完成编排,不可调度
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: 2,
|
||||||
|
orderNo: 'ORD20251127002',
|
||||||
|
userName: '李四',
|
||||||
|
competitionName: '第三十届武术大赛',
|
||||||
|
amount: 1245.00,
|
||||||
|
status: 1,
|
||||||
|
createTime: '2025-11-27 11:00:00',
|
||||||
|
canSchedule: true,
|
||||||
|
canDispatch: true // 已完成编排,可以调度
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: 3,
|
||||||
|
orderNo: 'ORD20251127003',
|
||||||
|
userName: '王五',
|
||||||
|
competitionName: '青少年武术锦标赛',
|
||||||
|
amount: 1580.00,
|
||||||
|
status: 1,
|
||||||
|
createTime: '2025-11-27 14:20:00',
|
||||||
|
canSchedule: true,
|
||||||
|
canDispatch: false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: 4,
|
||||||
|
orderNo: 'ORD20251126001',
|
||||||
|
userName: '赵六',
|
||||||
|
competitionName: '第三十届武术大赛',
|
||||||
|
amount: 2300.00,
|
||||||
|
status: 0,
|
||||||
|
createTime: '2025-11-26 09:15:00',
|
||||||
|
canSchedule: false,
|
||||||
|
canDispatch: false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: 5,
|
||||||
|
orderNo: 'ORD20251126002',
|
||||||
|
userName: '孙七',
|
||||||
|
competitionName: '全国武术公开赛',
|
||||||
|
amount: 1850.00,
|
||||||
|
status: 1,
|
||||||
|
createTime: '2025-11-26 16:45:00',
|
||||||
|
canSchedule: true,
|
||||||
|
canDispatch: false
|
||||||
|
}
|
||||||
|
],
|
||||||
tableData: [],
|
tableData: [],
|
||||||
pagination: {
|
pagination: {
|
||||||
current: 1,
|
current: 1,
|
||||||
@@ -105,59 +156,44 @@ export default {
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
mounted() {
|
mounted() {
|
||||||
|
// 初始化时直接加载数据
|
||||||
this.fetchData()
|
this.fetchData()
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
fetchData() {
|
fetchData() {
|
||||||
this.loading = true
|
this.loading = true
|
||||||
getOrderList(this.pagination.current, this.pagination.size, this.searchForm)
|
|
||||||
.then(res => {
|
// 模拟API请求延迟
|
||||||
if (res.data && res.data.success) {
|
setTimeout(() => {
|
||||||
this.tableData = res.data.data.records || []
|
// 过滤数据
|
||||||
this.pagination.total = res.data.data.total || 0
|
let filteredData = [...this.allTableData]
|
||||||
} else {
|
|
||||||
// 模拟数据(开发阶段)
|
// 搜索过滤
|
||||||
this.tableData = [
|
if (this.searchForm.keyword) {
|
||||||
{
|
const keyword = this.searchForm.keyword.toLowerCase()
|
||||||
id: 1,
|
filteredData = filteredData.filter(item =>
|
||||||
orderNo: 'ORD20251127001',
|
item.orderNo.toLowerCase().includes(keyword) ||
|
||||||
userName: '张三',
|
item.userName.toLowerCase().includes(keyword) ||
|
||||||
competitionName: '第三十届武术大赛',
|
item.competitionName.toLowerCase().includes(keyword)
|
||||||
amount: 999.00,
|
)
|
||||||
status: 1,
|
}
|
||||||
createTime: '2025-11-27 10:30:00'
|
|
||||||
},
|
// 状态过滤
|
||||||
{
|
if (this.searchForm.status !== null && this.searchForm.status !== '') {
|
||||||
id: 2,
|
filteredData = filteredData.filter(item =>
|
||||||
orderNo: 'ORD20251127002',
|
item.status === parseInt(this.searchForm.status)
|
||||||
userName: '李四',
|
)
|
||||||
competitionName: '第三十届武术大赛',
|
}
|
||||||
amount: 1245.00,
|
|
||||||
status: 0,
|
this.pagination.total = filteredData.length
|
||||||
createTime: '2025-11-27 11:00:00'
|
|
||||||
}
|
// 分页处理
|
||||||
]
|
const start = (this.pagination.current - 1) * this.pagination.size
|
||||||
this.pagination.total = 2
|
const end = start + this.pagination.size
|
||||||
}
|
this.tableData = filteredData.slice(start, end)
|
||||||
})
|
|
||||||
.catch(() => {
|
this.loading = false
|
||||||
// 失败时使用模拟数据
|
}, 300)
|
||||||
this.tableData = [
|
|
||||||
{
|
|
||||||
id: 1,
|
|
||||||
orderNo: 'ORD20251127001',
|
|
||||||
userName: '张三',
|
|
||||||
competitionName: '第三十届武术大赛',
|
|
||||||
amount: 999.00,
|
|
||||||
status: 1,
|
|
||||||
createTime: '2025-11-27 10:30:00'
|
|
||||||
}
|
|
||||||
]
|
|
||||||
this.pagination.total = 1
|
|
||||||
})
|
|
||||||
.finally(() => {
|
|
||||||
this.loading = false
|
|
||||||
})
|
|
||||||
},
|
},
|
||||||
handleSearch() {
|
handleSearch() {
|
||||||
this.pagination.current = 1
|
this.pagination.current = 1
|
||||||
@@ -171,25 +207,33 @@ export default {
|
|||||||
this.pagination.current = current
|
this.pagination.current = current
|
||||||
this.fetchData()
|
this.fetchData()
|
||||||
},
|
},
|
||||||
handleView(row) {
|
// 查看报名详情
|
||||||
this.$message.info('查看订单: ' + row.orderNo)
|
handleRegistrationDetail(row) {
|
||||||
|
this.$router.push({
|
||||||
|
path: '/martial/registration/detail',
|
||||||
|
query: { orderId: row.id }
|
||||||
|
})
|
||||||
},
|
},
|
||||||
handleEdit(row) {
|
// 编排
|
||||||
this.$message.info('编辑订单: ' + row.orderNo)
|
handleSchedule(row) {
|
||||||
|
if (!row.canSchedule) {
|
||||||
|
this.$message.warning('该订单暂不可编排')
|
||||||
|
return
|
||||||
|
}
|
||||||
|
this.$router.push({
|
||||||
|
path: '/martial/schedule/list',
|
||||||
|
query: { orderId: row.id }
|
||||||
|
})
|
||||||
},
|
},
|
||||||
handleDelete(row) {
|
// 调度
|
||||||
this.$confirm('确定要删除该订单吗?', '提示', {
|
handleDispatch(row) {
|
||||||
confirmButtonText: '确定',
|
if (!row.canDispatch) {
|
||||||
cancelButtonText: '取消',
|
this.$message.warning('请先完成编排')
|
||||||
type: 'warning'
|
return
|
||||||
}).then(() => {
|
}
|
||||||
removeOrder(row.id).then(res => {
|
this.$router.push({
|
||||||
this.$message.success('删除成功')
|
path: '/martial/dispatch/list',
|
||||||
this.fetchData()
|
query: { orderId: row.id }
|
||||||
}).catch(() => {
|
|
||||||
this.$message.success('删除成功(模拟)')
|
|
||||||
this.fetchData()
|
|
||||||
})
|
|
||||||
})
|
})
|
||||||
},
|
},
|
||||||
getStatusType(status) {
|
getStatusType(status) {
|
||||||
@@ -216,51 +260,75 @@ export default {
|
|||||||
|
|
||||||
<style lang="scss" scoped>
|
<style lang="scss" scoped>
|
||||||
.martial-order-container {
|
.martial-order-container {
|
||||||
padding: 20px;
|
min-height: 100%;
|
||||||
|
padding: 15px;
|
||||||
|
background: #fff;
|
||||||
|
|
||||||
.page-header {
|
.page-header {
|
||||||
margin-bottom: 20px;
|
margin-bottom: 15px;
|
||||||
|
|
||||||
.page-title {
|
.page-title {
|
||||||
margin: 0;
|
margin: 0;
|
||||||
font-size: 20px;
|
font-size: 18px;
|
||||||
font-weight: 600;
|
font-weight: 600;
|
||||||
color: #2c3e50;
|
color: #2c3e50;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.search-form {
|
.tip-message {
|
||||||
margin-bottom: 20px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.empty-data {
|
|
||||||
min-height: 400px;
|
|
||||||
display: flex;
|
display: flex;
|
||||||
align-items: center;
|
gap: 12px;
|
||||||
justify-content: center;
|
padding: 10px 14px;
|
||||||
background: #fafafa;
|
margin-bottom: 15px;
|
||||||
border: 1px solid #ebeef5;
|
background: linear-gradient(90deg, #ffd54f 0%, #ffecb3 100%);
|
||||||
|
border: 1px solid #ffc107;
|
||||||
border-radius: 4px;
|
border-radius: 4px;
|
||||||
|
box-shadow: 0 2px 4px rgba(255, 193, 7, 0.2);
|
||||||
|
|
||||||
.empty-content {
|
.tip-header {
|
||||||
text-align: center;
|
flex-shrink: 0;
|
||||||
|
|
||||||
.empty-text {
|
.tip-number {
|
||||||
font-size: 14px;
|
display: inline-flex;
|
||||||
color: #909399;
|
align-items: center;
|
||||||
line-height: 1.8;
|
justify-content: center;
|
||||||
|
width: 18px;
|
||||||
|
height: 18px;
|
||||||
|
background: #ff9800;
|
||||||
|
color: #fff;
|
||||||
|
font-size: 11px;
|
||||||
|
font-weight: bold;
|
||||||
|
border-radius: 50%;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.tip-content {
|
||||||
|
flex: 1;
|
||||||
|
color: #5d4037;
|
||||||
|
font-size: 12px;
|
||||||
|
line-height: 1.5;
|
||||||
|
|
||||||
|
.tip-subtitle {
|
||||||
|
margin-top: 3px;
|
||||||
|
color: #6d4c41;
|
||||||
|
font-size: 11px;
|
||||||
|
font-style: italic;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.search-form {
|
||||||
|
margin-bottom: 15px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.amount-text {
|
.amount-text {
|
||||||
color: #e6a23c;
|
color: #e6a23c;
|
||||||
font-weight: 600;
|
font-weight: 600;
|
||||||
font-size: 15px;
|
font-size: 14px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.pagination {
|
.pagination {
|
||||||
margin-top: 20px;
|
margin-top: 15px;
|
||||||
text-align: right;
|
text-align: right;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,17 +1,15 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="martial-registration-detail">
|
<div class="martial-registration-detail">
|
||||||
<el-card shadow="hover">
|
<div class="page-header">
|
||||||
<div class="page-header">
|
<el-button icon="el-icon-back" size="small" @click="goBack">返回</el-button>
|
||||||
<el-button icon="el-icon-back" @click="goBack" size="small">返回</el-button>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<h2 class="page-title">报名详情</h2>
|
<h2 class="page-title">报名详情</h2>
|
||||||
|
</div>
|
||||||
|
|
||||||
<div class="competition-info">
|
<div class="competition-info">
|
||||||
<h3 class="section-title">赛事合体</h3>
|
<h3 class="section-title">赛事名称</h3>
|
||||||
<p class="detail-id">ID: {{ competitionInfo.id }}</p>
|
<p class="detail-id">ID: {{ competitionInfo.id }}</p>
|
||||||
|
|
||||||
<el-row :gutter="20" class="info-row">
|
<el-row :gutter="15" class="info-row">
|
||||||
<el-col :span="6">
|
<el-col :span="6">
|
||||||
<div class="info-item">
|
<div class="info-item">
|
||||||
<label>主办单位</label>
|
<label>主办单位</label>
|
||||||
@@ -38,7 +36,7 @@
|
|||||||
</el-col>
|
</el-col>
|
||||||
</el-row>
|
</el-row>
|
||||||
|
|
||||||
<el-row :gutter="20" class="info-row">
|
<el-row :gutter="15" class="info-row">
|
||||||
<el-col :span="6">
|
<el-col :span="6">
|
||||||
<div class="info-item">
|
<div class="info-item">
|
||||||
<label>比赛时间</label>
|
<label>比赛时间</label>
|
||||||
@@ -71,18 +69,21 @@
|
|||||||
<div class="tabs-section">
|
<div class="tabs-section">
|
||||||
<div class="tab-buttons">
|
<div class="tab-buttons">
|
||||||
<el-button
|
<el-button
|
||||||
|
size="small"
|
||||||
:type="activeTab === 'participants' ? 'primary' : ''"
|
:type="activeTab === 'participants' ? 'primary' : ''"
|
||||||
@click="activeTab = 'participants'"
|
@click="activeTab = 'participants'"
|
||||||
>
|
>
|
||||||
参赛人数统计
|
参赛人数统计
|
||||||
</el-button>
|
</el-button>
|
||||||
<el-button
|
<el-button
|
||||||
|
size="small"
|
||||||
:type="activeTab === 'projectTime' ? 'primary' : ''"
|
:type="activeTab === 'projectTime' ? 'primary' : ''"
|
||||||
@click="activeTab = 'projectTime'"
|
@click="activeTab = 'projectTime'"
|
||||||
>
|
>
|
||||||
项目时间统计
|
项目时间统计
|
||||||
</el-button>
|
</el-button>
|
||||||
<el-button
|
<el-button
|
||||||
|
size="small"
|
||||||
:type="activeTab === 'amountStats' ? 'primary' : ''"
|
:type="activeTab === 'amountStats' ? 'primary' : ''"
|
||||||
@click="activeTab = 'amountStats'"
|
@click="activeTab = 'amountStats'"
|
||||||
>
|
>
|
||||||
@@ -90,42 +91,61 @@
|
|||||||
</el-button>
|
</el-button>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<!-- 参赛人数统计Tab -->
|
||||||
<div v-show="activeTab === 'participants'" class="tab-content">
|
<div v-show="activeTab === 'participants'" class="tab-content">
|
||||||
<el-table :data="participantsData" border stripe>
|
<div class="tab-hint">
|
||||||
<el-table-column type="index" label="序号" width="80" align="center"></el-table-column>
|
在营业分组: 本操作, 提现栏标签, 提名栏标签, 比赛栏标签
|
||||||
<el-table-column prop="schoolUnit" label="单位" min-width="200"></el-table-column>
|
</div>
|
||||||
<el-table-column prop="category" label="类别" width="100"></el-table-column>
|
<el-table :data="participantsData" border stripe size="small">
|
||||||
<el-table-column prop="individual" label="2队" width="80" align="center"></el-table-column>
|
<el-table-column type="index" label="序号" width="60" align="center"></el-table-column>
|
||||||
<el-table-column prop="dual" label="2组" width="80" align="center"></el-table-column>
|
<el-table-column prop="schoolUnit" label="单位" min-width="180">
|
||||||
<el-table-column prop="team1101" label="1101" width="80" align="center"></el-table-column>
|
<template #default="scope">
|
||||||
<el-table-column prop="workers" label="工作人员" width="100" align="center"></el-table-column>
|
<span>{{ scope.row.schoolUnit }}</span>
|
||||||
<el-table-column prop="female" label="女性组别" width="100" align="center"></el-table-column>
|
<div v-if="scope.row.hint" class="row-hint">{{ scope.row.hint }}</div>
|
||||||
<el-table-column prop="total" label="合计" width="80" align="center">
|
</template>
|
||||||
<template slot-scope="scope">
|
</el-table-column>
|
||||||
<span class="total-num">{{ scope.row.total }}</span>
|
<el-table-column prop="category" label="类别" width="80"></el-table-column>
|
||||||
|
<el-table-column prop="individual" label="2队" width="60" align="center"></el-table-column>
|
||||||
|
<el-table-column prop="dual" label="2组" width="60" align="center"></el-table-column>
|
||||||
|
<el-table-column prop="team1101" label="1101" width="60" align="center"></el-table-column>
|
||||||
|
<el-table-column prop="workers" label="工作人员" width="90" align="center"></el-table-column>
|
||||||
|
<el-table-column prop="female" label="女性组别" width="90" align="center"></el-table-column>
|
||||||
|
<el-table-column prop="total" label="合计" width="60" align="center">
|
||||||
|
<template #default="scope">
|
||||||
|
<span class="total-num">+{{ scope.row.total }}</span>
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
</el-table>
|
</el-table>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<!-- 项目时间统计Tab -->
|
||||||
<div v-show="activeTab === 'projectTime'" class="tab-content">
|
<div v-show="activeTab === 'projectTime'" class="tab-content">
|
||||||
<el-table :data="projectTimeData" border stripe>
|
<div class="tab-hint">
|
||||||
<el-table-column type="index" label="序号" width="80" align="center"></el-table-column>
|
项目时间统计
|
||||||
<el-table-column prop="projectName" label="项目" min-width="200"></el-table-column>
|
</div>
|
||||||
<el-table-column prop="participantCategory" label="参人/单位" width="150"></el-table-column>
|
<el-table :data="projectTimeData" border stripe size="small">
|
||||||
<el-table-column prop="teamCount" label="队伍" width="100" align="center"></el-table-column>
|
<el-table-column type="index" label="序号" width="60" align="center"></el-table-column>
|
||||||
<el-table-column prop="singleTeamPeople" label="单位型号" width="120" align="center"></el-table-column>
|
<el-table-column prop="projectName" label="项目" min-width="150">
|
||||||
<el-table-column prop="estimatedDuration" label="剩下显时(公共)" width="180" align="center"></el-table-column>
|
<template #default="scope">
|
||||||
|
<span>{{ scope.row.projectName }}</span>
|
||||||
|
<div v-if="scope.row.hint" class="row-hint">{{ scope.row.hint }}</div>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column prop="participantCategory" label="参人/单位" width="100"></el-table-column>
|
||||||
|
<el-table-column prop="teamCount" label="队伍" width="80" align="center"></el-table-column>
|
||||||
|
<el-table-column prop="singleTeamPeople" label="单位型号人数" width="120" align="center"></el-table-column>
|
||||||
|
<el-table-column prop="estimatedDuration" label="剩下显时(公共)" width="150" align="center"></el-table-column>
|
||||||
</el-table>
|
</el-table>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<!-- 全额统计Tab -->
|
||||||
<div v-show="activeTab === 'amountStats'" class="tab-content">
|
<div v-show="activeTab === 'amountStats'" class="tab-content">
|
||||||
<el-table :data="amountStatsData" border stripe>
|
<el-table :data="amountStatsData" border stripe size="small">
|
||||||
<el-table-column type="index" label="序号" width="80" align="center"></el-table-column>
|
<el-table-column type="index" label="序号" width="60" align="center"></el-table-column>
|
||||||
<el-table-column prop="schoolUnit" label="学校/单位" min-width="300"></el-table-column>
|
<el-table-column prop="schoolUnit" label="学校/单位" min-width="200"></el-table-column>
|
||||||
<el-table-column prop="projectCount" label="项目" width="150" align="center"></el-table-column>
|
<el-table-column prop="projectCount" label="项目" width="120" align="center"></el-table-column>
|
||||||
<el-table-column prop="totalAmount" label="全额" width="200" align="center">
|
<el-table-column prop="totalAmount" label="全额" width="150" align="center">
|
||||||
<template slot-scope="scope">
|
<template #default="scope">
|
||||||
<span class="amount">¥{{ scope.row.totalAmount }}</span>
|
<span class="amount">¥{{ scope.row.totalAmount }}</span>
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
@@ -134,9 +154,8 @@
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="footer-actions">
|
<div class="footer-actions">
|
||||||
<el-button @click="handleExport">导出</el-button>
|
<el-button size="small" @click="handleExport">导出</el-button>
|
||||||
</div>
|
</div>
|
||||||
</el-card>
|
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
@@ -145,6 +164,7 @@ export default {
|
|||||||
name: 'MartialRegistrationDetail',
|
name: 'MartialRegistrationDetail',
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
|
orderId: null,
|
||||||
activeTab: 'participants',
|
activeTab: 'participants',
|
||||||
competitionInfo: {
|
competitionInfo: {
|
||||||
id: '123456889900',
|
id: '123456889900',
|
||||||
@@ -161,6 +181,7 @@ export default {
|
|||||||
{
|
{
|
||||||
schoolUnit: '清河小学',
|
schoolUnit: '清河小学',
|
||||||
category: '集体',
|
category: '集体',
|
||||||
|
hint: '剩余功能在提现上,显示栏标签',
|
||||||
individual: 1,
|
individual: 1,
|
||||||
dual: 1,
|
dual: 1,
|
||||||
team1101: 1,
|
team1101: 1,
|
||||||
@@ -177,15 +198,50 @@ export default {
|
|||||||
workers: 0,
|
workers: 0,
|
||||||
female: 0,
|
female: 0,
|
||||||
total: 0
|
total: 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
schoolUnit: '少林寺武术学校',
|
||||||
|
category: '单人',
|
||||||
|
individual: 3,
|
||||||
|
dual: 2,
|
||||||
|
team1101: 2,
|
||||||
|
workers: 6,
|
||||||
|
female: 8,
|
||||||
|
total: 21
|
||||||
|
},
|
||||||
|
{
|
||||||
|
schoolUnit: '访河社区',
|
||||||
|
category: '集体',
|
||||||
|
individual: 2,
|
||||||
|
dual: 1,
|
||||||
|
team1101: 1,
|
||||||
|
workers: 3,
|
||||||
|
female: 4,
|
||||||
|
total: 11
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
projectTimeData: [
|
projectTimeData: [
|
||||||
{
|
{
|
||||||
projectName: '小学组小组赛男女类',
|
projectName: '小学组小组赛男女类',
|
||||||
|
hint: '剩余功能在位置提现上,显示出运动类别名称的位置',
|
||||||
participantCategory: '集体',
|
participantCategory: '集体',
|
||||||
teamCount: 1,
|
teamCount: 1,
|
||||||
singleTeamPeople: 10,
|
singleTeamPeople: 10,
|
||||||
estimatedDuration: 4
|
estimatedDuration: 4
|
||||||
|
},
|
||||||
|
{
|
||||||
|
projectName: '中学组个人赛',
|
||||||
|
participantCategory: '单人',
|
||||||
|
teamCount: 3,
|
||||||
|
singleTeamPeople: 1,
|
||||||
|
estimatedDuration: 2
|
||||||
|
},
|
||||||
|
{
|
||||||
|
projectName: '少年组对抗赛',
|
||||||
|
participantCategory: '双人',
|
||||||
|
teamCount: 2,
|
||||||
|
singleTeamPeople: 2,
|
||||||
|
estimatedDuration: 3
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
amountStatsData: [
|
amountStatsData: [
|
||||||
@@ -198,13 +254,27 @@ export default {
|
|||||||
schoolUnit: '方山镇小学校',
|
schoolUnit: '方山镇小学校',
|
||||||
projectCount: 0,
|
projectCount: 0,
|
||||||
totalAmount: 0
|
totalAmount: 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
schoolUnit: '少林寺武术学校',
|
||||||
|
projectCount: 8,
|
||||||
|
totalAmount: 15600
|
||||||
|
},
|
||||||
|
{
|
||||||
|
schoolUnit: '访河社区',
|
||||||
|
projectCount: 4,
|
||||||
|
totalAmount: 7200
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
mounted() {
|
||||||
|
this.orderId = this.$route.query.orderId
|
||||||
|
// 使用静态数据,不调用API
|
||||||
|
},
|
||||||
methods: {
|
methods: {
|
||||||
goBack() {
|
goBack() {
|
||||||
this.$router.go(-1)
|
this.$router.push('/martial/order/list')
|
||||||
},
|
},
|
||||||
handleExport() {
|
handleExport() {
|
||||||
this.$message.success('导出功能开发中')
|
this.$message.success('导出功能开发中')
|
||||||
@@ -215,73 +285,103 @@ export default {
|
|||||||
|
|
||||||
<style lang="scss" scoped>
|
<style lang="scss" scoped>
|
||||||
.martial-registration-detail {
|
.martial-registration-detail {
|
||||||
padding: 20px;
|
padding: 15px;
|
||||||
|
background: #fff;
|
||||||
|
|
||||||
.page-header {
|
.page-header {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
margin-bottom: 15px;
|
margin-bottom: 15px;
|
||||||
}
|
gap: 10px;
|
||||||
|
|
||||||
.page-title {
|
.page-title {
|
||||||
margin: 0 0 25px 0;
|
margin: 0;
|
||||||
font-size: 20px;
|
font-size: 18px;
|
||||||
font-weight: 600;
|
font-weight: 600;
|
||||||
color: #2c3e50;
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.competition-info {
|
.competition-info {
|
||||||
margin-bottom: 30px;
|
margin-bottom: 15px;
|
||||||
padding-bottom: 30px;
|
padding: 15px;
|
||||||
border-bottom: 1px solid #ebeef5;
|
background: #fff;
|
||||||
|
border: 1px solid #dcdfe6;
|
||||||
|
|
||||||
.section-title {
|
.section-title {
|
||||||
margin: 0 0 10px 0;
|
margin-bottom: 8px;
|
||||||
font-size: 16px;
|
font-size: 15px;
|
||||||
font-weight: 600;
|
font-weight: 600;
|
||||||
color: #2c3e50;
|
padding-left: 8px;
|
||||||
|
border-left: 3px solid #409eff;
|
||||||
}
|
}
|
||||||
|
|
||||||
.detail-id {
|
.detail-id {
|
||||||
margin: 0 0 20px 0;
|
margin-bottom: 15px;
|
||||||
|
padding-left: 8px;
|
||||||
color: #909399;
|
color: #909399;
|
||||||
font-size: 13px;
|
font-size: 11px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.info-row {
|
.info-row {
|
||||||
margin-bottom: 15px;
|
margin-bottom: 12px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.info-item {
|
.info-item {
|
||||||
|
padding: 8px;
|
||||||
|
background: #f5f7fa;
|
||||||
|
|
||||||
label {
|
label {
|
||||||
display: block;
|
display: block;
|
||||||
margin-bottom: 8px;
|
margin-bottom: 6px;
|
||||||
font-size: 13px;
|
font-size: 11px;
|
||||||
color: #909399;
|
color: #909399;
|
||||||
}
|
}
|
||||||
|
|
||||||
.info-value {
|
.info-value {
|
||||||
font-size: 14px;
|
font-size: 12px;
|
||||||
color: #2c3e50;
|
color: #606266;
|
||||||
|
|
||||||
&.amount {
|
&.amount {
|
||||||
color: #e6a23c;
|
color: #e6a23c;
|
||||||
font-weight: 600;
|
font-weight: 600;
|
||||||
font-size: 16px;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.tabs-section {
|
.tabs-section {
|
||||||
margin-bottom: 30px;
|
margin-bottom: 15px;
|
||||||
|
|
||||||
.tab-buttons {
|
.tab-buttons {
|
||||||
margin-bottom: 20px;
|
margin-bottom: 15px;
|
||||||
display: flex;
|
padding: 12px;
|
||||||
gap: 10px;
|
background: #fff;
|
||||||
|
border: 1px solid #dcdfe6;
|
||||||
}
|
}
|
||||||
|
|
||||||
.tab-content {
|
.tab-content {
|
||||||
min-height: 300px;
|
min-height: 300px;
|
||||||
|
padding: 15px;
|
||||||
|
background: #fff;
|
||||||
|
border: 1px solid #dcdfe6;
|
||||||
|
|
||||||
|
.tab-hint {
|
||||||
|
padding: 8px 12px;
|
||||||
|
margin-bottom: 12px;
|
||||||
|
background: #fff3e0;
|
||||||
|
border-left: 3px solid #ff9800;
|
||||||
|
color: #e65100;
|
||||||
|
font-size: 11px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.row-hint {
|
||||||
|
margin-top: 4px;
|
||||||
|
padding: 2px 5px;
|
||||||
|
color: #f50057;
|
||||||
|
font-size: 11px;
|
||||||
|
background: rgba(245, 0, 87, 0.05);
|
||||||
|
display: inline-block;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -293,7 +393,9 @@ export default {
|
|||||||
|
|
||||||
.footer-actions {
|
.footer-actions {
|
||||||
text-align: center;
|
text-align: center;
|
||||||
padding-top: 20px;
|
padding: 15px;
|
||||||
|
background: #fff;
|
||||||
|
border: 1px solid #dcdfe6;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
|
|||||||
@@ -1,21 +1,21 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="martial-schedule-container">
|
<div class="martial-schedule-container">
|
||||||
<el-card shadow="hover">
|
<div class="page-header">
|
||||||
<div class="page-header">
|
<el-button icon="el-icon-back" size="small" @click="goBack">返回</el-button>
|
||||||
<el-button icon="el-icon-back" @click="goBack" size="small">返回</el-button>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<h2 class="page-title">编排</h2>
|
<h2 class="page-title">编排</h2>
|
||||||
|
</div>
|
||||||
|
|
||||||
<div class="tabs-section">
|
<div class="tabs-section">
|
||||||
<div class="tab-buttons">
|
<div class="tab-buttons">
|
||||||
<el-button
|
<el-button
|
||||||
|
size="small"
|
||||||
:type="activeTab === 'competition' ? 'primary' : ''"
|
:type="activeTab === 'competition' ? 'primary' : ''"
|
||||||
@click="activeTab = 'competition'"
|
@click="activeTab = 'competition'"
|
||||||
>
|
>
|
||||||
竞赛分组
|
竞赛分组
|
||||||
</el-button>
|
</el-button>
|
||||||
<el-button
|
<el-button
|
||||||
|
size="small"
|
||||||
:type="activeTab === 'venue' ? 'primary' : ''"
|
:type="activeTab === 'venue' ? 'primary' : ''"
|
||||||
@click="activeTab = 'venue'"
|
@click="activeTab = 'venue'"
|
||||||
>
|
>
|
||||||
@@ -46,24 +46,44 @@
|
|||||||
<span class="group-meta">{{ group.code }}</span>
|
<span class="group-meta">{{ group.code }}</span>
|
||||||
</div>
|
</div>
|
||||||
<div class="group-actions">
|
<div class="group-actions">
|
||||||
<el-button
|
<el-dropdown trigger="click" @command="(cmd) => handleVenueCommand(cmd, index)">
|
||||||
size="small"
|
<el-button size="small" type="primary">
|
||||||
type="primary"
|
{{ group.selectedVenue || '一号场地' }}<i class="el-icon-arrow-down el-icon--right"></i>
|
||||||
@click="handleVenueSelect(index, 1)"
|
</el-button>
|
||||||
>
|
<el-dropdown-menu slot="dropdown">
|
||||||
一号场地
|
<el-dropdown-item command="venue1">一号场地</el-dropdown-item>
|
||||||
</el-button>
|
<el-dropdown-item command="venue2">二号场地</el-dropdown-item>
|
||||||
<el-button size="small" type="danger">菜单</el-button>
|
</el-dropdown-menu>
|
||||||
|
</el-dropdown>
|
||||||
|
<el-button size="small" type="danger">赛程</el-button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<el-table :data="group.items" border stripe size="small">
|
<el-table :data="group.items" border stripe size="small">
|
||||||
<el-table-column label="序号" type="index" width="80" align="center"></el-table-column>
|
<el-table-column label="序号" type="index" width="60" align="center"></el-table-column>
|
||||||
<el-table-column prop="schoolUnit" label="学校/单位" min-width="200"></el-table-column>
|
<el-table-column prop="schoolUnit" label="学校/单位" min-width="200"></el-table-column>
|
||||||
<el-table-column label="操作" width="120" align="center">
|
<el-table-column label="操作" width="100" align="center">
|
||||||
<template>
|
<template #default="scope">
|
||||||
<el-button type="text" icon="el-icon-upload2" size="small"></el-button>
|
<el-button
|
||||||
<el-button type="text" icon="el-icon-download" size="small"></el-button>
|
type="text"
|
||||||
|
size="small"
|
||||||
|
@click="handleMoveUp(index, scope.$index)"
|
||||||
|
:disabled="scope.$index === 0 || isScheduleCompleted"
|
||||||
|
title="上移"
|
||||||
|
class="move-btn"
|
||||||
|
>
|
||||||
|
<img src="/img/图标 3@3x.png" class="move-icon" alt="上移" />
|
||||||
|
</el-button>
|
||||||
|
<el-button
|
||||||
|
type="text"
|
||||||
|
size="small"
|
||||||
|
@click="handleMoveDown(index, scope.$index)"
|
||||||
|
:disabled="scope.$index === group.items.length - 1 || isScheduleCompleted"
|
||||||
|
title="下移"
|
||||||
|
class="move-btn"
|
||||||
|
>
|
||||||
|
<img src="/img/图标 4@3x.png" class="move-icon" alt="下移" />
|
||||||
|
</el-button>
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
</el-table>
|
</el-table>
|
||||||
@@ -84,27 +104,35 @@
|
|||||||
</el-button>
|
</el-button>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<el-table :data="venueData" border stripe>
|
<el-table :data="venueData" border stripe size="small">
|
||||||
<el-table-column label="序号" type="index" width="80" align="center"></el-table-column>
|
<el-table-column label="序号" type="index" width="60" align="center"></el-table-column>
|
||||||
<el-table-column prop="project" label="项目" min-width="200"></el-table-column>
|
<el-table-column prop="project" label="项目" min-width="180">
|
||||||
<el-table-column prop="participant" label="参人/单位" width="150"></el-table-column>
|
<template #default="scope">
|
||||||
<el-table-column prop="team" label="队伍" width="100" align="center"></el-table-column>
|
<span>{{ scope.row.project }}</span>
|
||||||
<el-table-column prop="number" label="编号" width="100" align="center"></el-table-column>
|
<div v-if="scope.row.hint" class="row-hint">{{ scope.row.hint }}</div>
|
||||||
<el-table-column prop="duration" label="合计时间" width="120" align="center"></el-table-column>
|
</template>
|
||||||
<el-table-column prop="status" label="状态" width="120" align="center">
|
</el-table-column>
|
||||||
<template slot-scope="scope">
|
<el-table-column prop="participant" label="参人/单位" width="120"></el-table-column>
|
||||||
<span v-if="scope.row.status === 'active'" class="status-active">{{ scope.row.status }}</span>
|
<el-table-column prop="team" label="队伍" width="80" align="center"></el-table-column>
|
||||||
|
<el-table-column prop="number" label="编号" width="80" align="center"></el-table-column>
|
||||||
|
<el-table-column prop="duration" label="合计时间" width="100" align="center"></el-table-column>
|
||||||
|
<el-table-column prop="status" label="状态" width="100" align="center">
|
||||||
|
<template #default="scope">
|
||||||
|
<span v-if="scope.row.status" class="status-active">{{ scope.row.status }}</span>
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
</el-table>
|
</el-table>
|
||||||
|
|
||||||
|
<div class="venue-footer-hints">
|
||||||
|
<p class="footer-hint-text">完成编排前的现阶段, 点击放开次文本; 完成编排前在可导列</p>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="footer-actions">
|
<div class="footer-actions">
|
||||||
<el-button @click="handleExport">导出</el-button>
|
<el-button size="small" @click="handleExport" v-if="isScheduleCompleted">导出</el-button>
|
||||||
<el-button type="primary" @click="handleConfirm">完成编排确</el-button>
|
<el-button size="small" type="primary" @click="handleConfirm" v-else>完成编排</el-button>
|
||||||
</div>
|
</div>
|
||||||
</el-card>
|
|
||||||
|
|
||||||
<!-- 确认对话框 -->
|
<!-- 确认对话框 -->
|
||||||
<el-dialog
|
<el-dialog
|
||||||
@@ -129,9 +157,11 @@ export default {
|
|||||||
name: 'MartialScheduleList',
|
name: 'MartialScheduleList',
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
|
orderId: null,
|
||||||
activeTab: 'competition',
|
activeTab: 'competition',
|
||||||
selectedTime: 0,
|
selectedTime: 0,
|
||||||
confirmDialogVisible: false,
|
confirmDialogVisible: false,
|
||||||
|
isScheduleCompleted: false, // 是否已完成编排
|
||||||
timeSlots: [
|
timeSlots: [
|
||||||
'2025年11月6日上午8:30',
|
'2025年11月6日上午8:30',
|
||||||
'2025年11月6日下午13:00',
|
'2025年11月6日下午13:00',
|
||||||
@@ -144,34 +174,95 @@ export default {
|
|||||||
type: '集体',
|
type: '集体',
|
||||||
count: '2队',
|
count: '2队',
|
||||||
code: '1101',
|
code: '1101',
|
||||||
items: [{ schoolUnit: '清河小学' }, { schoolUnit: '访河社区' }]
|
selectedVenue: '一号场地',
|
||||||
|
items: [
|
||||||
|
{ schoolUnit: '清河小学' },
|
||||||
|
{ schoolUnit: '访河社区' }
|
||||||
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: '1. 小学组小组赛男女类',
|
title: '1. 小学组小组赛男女类',
|
||||||
type: '单人',
|
type: '单人',
|
||||||
count: '3队',
|
count: '3队',
|
||||||
code: '1组',
|
code: '1组',
|
||||||
items: [{ schoolUnit: '少林寺武校' }, { schoolUnit: '访河社区' }, { schoolUnit: '少林寺武校' }]
|
selectedVenue: '二号场地',
|
||||||
|
items: [
|
||||||
|
{ schoolUnit: '少林寺武校' },
|
||||||
|
{ schoolUnit: '访河社区' },
|
||||||
|
{ schoolUnit: '少林寺武校' }
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '2. 中学组决赛',
|
||||||
|
type: '集体',
|
||||||
|
count: '4队',
|
||||||
|
code: '2101',
|
||||||
|
selectedVenue: '一号场地',
|
||||||
|
items: [
|
||||||
|
{ schoolUnit: '成都体育学院' },
|
||||||
|
{ schoolUnit: '武侯实验中学' },
|
||||||
|
{ schoolUnit: '石室中学' },
|
||||||
|
{ schoolUnit: '七中育才' }
|
||||||
|
]
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
venueData: [
|
venueData: [
|
||||||
{
|
{
|
||||||
project: '小学组小组赛男女类',
|
project: '小学组小组赛男女类',
|
||||||
|
hint: '剩余功能在位置换现上,显示出已比赛名称的位置',
|
||||||
participant: '集体',
|
participant: '集体',
|
||||||
team: 1,
|
team: 1,
|
||||||
number: 1,
|
number: 1,
|
||||||
duration: 2,
|
duration: 2,
|
||||||
status: 'active'
|
status: '*101'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
project: '中学组决赛',
|
||||||
|
participant: '单人',
|
||||||
|
team: 2,
|
||||||
|
number: 5,
|
||||||
|
duration: 3,
|
||||||
|
status: '*102'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
project: '少年组对抗赛',
|
||||||
|
participant: '双人',
|
||||||
|
team: 1,
|
||||||
|
number: 3,
|
||||||
|
duration: 2,
|
||||||
|
status: ''
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
mounted() {
|
||||||
|
this.orderId = this.$route.query.orderId
|
||||||
|
// 使用静态数据,不调用API
|
||||||
|
},
|
||||||
methods: {
|
methods: {
|
||||||
goBack() {
|
goBack() {
|
||||||
this.$router.go(-1)
|
this.$router.push('/martial/order/list')
|
||||||
},
|
},
|
||||||
handleVenueSelect(index, venueType) {
|
handleVenueCommand(command, groupIndex) {
|
||||||
this.$message.success(`已选择${venueType === 1 ? '一号' : '二号'}场地`)
|
const venueName = command === 'venue1' ? '一号场地' : '二号场地'
|
||||||
|
this.competitionGroups[groupIndex].selectedVenue = venueName
|
||||||
|
this.$message.success(`已选择${venueName}`)
|
||||||
|
},
|
||||||
|
handleMoveUp(groupIndex, itemIndex) {
|
||||||
|
if (itemIndex === 0 || this.isScheduleCompleted) return
|
||||||
|
const group = this.competitionGroups[groupIndex]
|
||||||
|
const temp = group.items[itemIndex]
|
||||||
|
group.items.splice(itemIndex, 1)
|
||||||
|
group.items.splice(itemIndex - 1, 0, temp)
|
||||||
|
this.$message.success('上移成功')
|
||||||
|
},
|
||||||
|
handleMoveDown(groupIndex, itemIndex) {
|
||||||
|
const group = this.competitionGroups[groupIndex]
|
||||||
|
if (itemIndex === group.items.length - 1 || this.isScheduleCompleted) return
|
||||||
|
const temp = group.items[itemIndex]
|
||||||
|
group.items.splice(itemIndex, 1)
|
||||||
|
group.items.splice(itemIndex + 1, 0, temp)
|
||||||
|
this.$message.success('下移成功')
|
||||||
},
|
},
|
||||||
handleExport() {
|
handleExport() {
|
||||||
this.$message.success('导出功能开发中')
|
this.$message.success('导出功能开发中')
|
||||||
@@ -180,9 +271,10 @@ export default {
|
|||||||
this.confirmDialogVisible = true
|
this.confirmDialogVisible = true
|
||||||
},
|
},
|
||||||
confirmComplete() {
|
confirmComplete() {
|
||||||
|
// 确认完成编排
|
||||||
|
this.isScheduleCompleted = true
|
||||||
this.confirmDialogVisible = false
|
this.confirmDialogVisible = false
|
||||||
this.$message.success('编排完成')
|
this.$message.success('编排已完成,现在可以进行调度操作')
|
||||||
this.goBack()
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -190,72 +282,132 @@ export default {
|
|||||||
|
|
||||||
<style lang="scss" scoped>
|
<style lang="scss" scoped>
|
||||||
.martial-schedule-container {
|
.martial-schedule-container {
|
||||||
padding: 20px;
|
padding: 15px;
|
||||||
|
background: #fff;
|
||||||
|
|
||||||
.page-header {
|
.page-header {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
margin-bottom: 15px;
|
margin-bottom: 15px;
|
||||||
}
|
gap: 10px;
|
||||||
|
|
||||||
.page-title {
|
.page-title {
|
||||||
margin: 0 0 25px 0;
|
margin: 0;
|
||||||
font-size: 20px;
|
font-size: 18px;
|
||||||
font-weight: 600;
|
font-weight: 600;
|
||||||
color: #2c3e50;
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.tabs-section {
|
.tabs-section {
|
||||||
margin-bottom: 30px;
|
margin-bottom: 15px;
|
||||||
|
|
||||||
.tab-buttons {
|
.tab-buttons {
|
||||||
margin-bottom: 20px;
|
margin-bottom: 15px;
|
||||||
display: flex;
|
padding: 12px;
|
||||||
gap: 10px;
|
background: #fff;
|
||||||
|
border: 1px solid #dcdfe6;
|
||||||
}
|
}
|
||||||
|
|
||||||
.tab-content {
|
.tab-content {
|
||||||
|
padding: 15px;
|
||||||
|
background: #fff;
|
||||||
|
border: 1px solid #dcdfe6;
|
||||||
|
|
||||||
.time-selector {
|
.time-selector {
|
||||||
margin-bottom: 20px;
|
margin-bottom: 15px;
|
||||||
display: flex;
|
padding: 8px;
|
||||||
gap: 10px;
|
background: #f5f7fa;
|
||||||
flex-wrap: wrap;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.competition-group {
|
.competition-group {
|
||||||
margin-bottom: 25px;
|
margin-bottom: 15px;
|
||||||
|
|
||||||
.group-header {
|
.group-header {
|
||||||
display: flex;
|
display: flex;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
justify-content: space-between;
|
justify-content: space-between;
|
||||||
padding: 12px 16px;
|
padding: 12px;
|
||||||
background: #f5f7fa;
|
background: #f5f7fa;
|
||||||
border: 1px solid #e4e7ed;
|
border: 1px solid #dcdfe6;
|
||||||
border-bottom: none;
|
border-bottom: none;
|
||||||
|
|
||||||
.group-info {
|
.group-info {
|
||||||
display: flex;
|
display: flex;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
gap: 15px;
|
gap: 12px;
|
||||||
|
|
||||||
.group-title {
|
.group-title {
|
||||||
font-weight: 600;
|
font-weight: 600;
|
||||||
color: #2c3e50;
|
color: #303133;
|
||||||
font-size: 14px;
|
font-size: 13px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.group-meta {
|
.group-meta {
|
||||||
color: #909399;
|
color: #909399;
|
||||||
font-size: 13px;
|
font-size: 12px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.group-hints {
|
||||||
|
flex: 1;
|
||||||
|
text-align: center;
|
||||||
|
|
||||||
|
.hint-text {
|
||||||
|
color: #f50057;
|
||||||
|
font-size: 11px;
|
||||||
|
|
||||||
|
&.secondary {
|
||||||
|
color: #ff4081;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.group-actions {
|
.group-actions {
|
||||||
display: flex;
|
display: flex;
|
||||||
gap: 10px;
|
gap: 8px;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.group-footer-hints {
|
||||||
|
margin-top: 15px;
|
||||||
|
padding: 8px 12px;
|
||||||
|
background: #fff3e0;
|
||||||
|
border-left: 3px solid #ff9800;
|
||||||
|
|
||||||
|
.footer-hint-text {
|
||||||
|
margin: 4px 0;
|
||||||
|
color: #f50057;
|
||||||
|
font-size: 11px;
|
||||||
|
|
||||||
|
&.secondary {
|
||||||
|
color: #ff4081;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.row-hint {
|
||||||
|
margin-top: 4px;
|
||||||
|
padding: 2px 5px;
|
||||||
|
color: #f50057;
|
||||||
|
font-size: 11px;
|
||||||
|
background: rgba(245, 0, 87, 0.05);
|
||||||
|
display: inline-block;
|
||||||
|
}
|
||||||
|
|
||||||
|
.venue-footer-hints {
|
||||||
|
margin-top: 15px;
|
||||||
|
padding: 8px 12px;
|
||||||
|
background: #fff3e0;
|
||||||
|
border-left: 3px solid #ff9800;
|
||||||
|
|
||||||
|
.footer-hint-text {
|
||||||
|
margin: 4px 0;
|
||||||
|
color: #f50057;
|
||||||
|
font-size: 11px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
.status-active {
|
.status-active {
|
||||||
color: #409eff;
|
color: #409eff;
|
||||||
font-weight: 600;
|
font-weight: 600;
|
||||||
@@ -265,10 +417,25 @@ export default {
|
|||||||
|
|
||||||
.footer-actions {
|
.footer-actions {
|
||||||
text-align: center;
|
text-align: center;
|
||||||
padding-top: 20px;
|
padding: 15px;
|
||||||
display: flex;
|
background: #fff;
|
||||||
justify-content: center;
|
border: 1px solid #dcdfe6;
|
||||||
gap: 15px;
|
}
|
||||||
|
|
||||||
|
.move-btn {
|
||||||
|
padding: 4px;
|
||||||
|
|
||||||
|
&:disabled {
|
||||||
|
opacity: 0.4;
|
||||||
|
cursor: not-allowed;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.move-icon {
|
||||||
|
width: 20px;
|
||||||
|
height: 20px;
|
||||||
|
display: inline-block;
|
||||||
|
vertical-align: middle;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
|
|||||||