增加智能排片功能

main
rogersun 2 weeks ago
parent 41cd59eac5
commit 4ae80c965f
  1. 13
      src/apis/ai_show.js
  2. 6
      src/components/ec_api/BasicConfig.vue
  3. 6
      src/layout/components/PageAside.vue
  4. 8
      src/router/index.js
  5. 221
      src/views/ai_show/index.vue

@ -0,0 +1,13 @@
import {request} from '@/request/index.js'
export const get_ai_show_data = (cinema_code, show_date) => {
return request({
url: 'ai/report',
method: 'get',
params: {
cinema_code: cinema_code,
show_date: show_date,
force: '0'
}
})
}

@ -227,7 +227,7 @@ onMounted(() => {
<el-row justify="start"> <el-row justify="start">
<el-col :span="6"> <el-col :span="6">
<label class="name-label">环境</label> <label class="name-label">环境</label>
<el-select v-model="SelectEnv" placeholder="请选择" style="width: 240px" size="default" <el-select v-model="SelectEnv" placeholder="请选择" style="width: 200px" size="default"
@change="env_on_change"> @change="env_on_change">
<el-option <el-option
v-for="item in EnvArray" v-for="item in EnvArray"
@ -283,7 +283,7 @@ onMounted(() => {
<el-row justify="start"> <el-row justify="start">
<el-col :span="6"> <el-col :span="6">
<label class="name-label">常用场景</label> <label class="name-label">常用场景</label>
<el-select v-model="SelectApiGroup" placeholder="请选择" style="width: 240px" size="default" <el-select v-model="SelectApiGroup" placeholder="请选择" style="width: 200px" size="default"
@change="api_group_on_change"> @change="api_group_on_change">
<el-option <el-option
v-for="item in ApiGroup" v-for="item in ApiGroup"
@ -301,7 +301,7 @@ onMounted(() => {
<el-col :span="6"> <el-col :span="6">
<label class="name-label">接口</label> <label class="name-label">接口</label>
<el-select v-model="SelectApiId" placeholder="请选择" style="width: 240px" size="default" multiple collapse-tags filterable <el-select v-model="SelectApiId" placeholder="请选择" style="width: 200px" size="default" multiple collapse-tags filterable
collapse-tags-tooltip :clearable="true" @change="api_on_change"> collapse-tags-tooltip :clearable="true" @change="api_on_change">
<el-option <el-option
v-for="item in Api" v-for="item in Api"

@ -44,6 +44,12 @@ const route = useRoute()
</el-icon> </el-icon>
<span>产品文档</span> <span>产品文档</span>
</el-menu-item> </el-menu-item>
<el-menu-item index="ai_show">
<el-icon>
<icon-menu/>
</el-icon>
<span>智能排片</span>
</el-menu-item>
</el-menu> </el-menu>
</el-col> </el-col>
</el-row> </el-row>

@ -49,6 +49,14 @@ const routes = [
meta:{ meta:{
keepAlive: true, keepAlive: true,
} }
},
{
path: 'ai_show',
name: 'AiShow',
component: () => import('@/views/ai_show/index.vue'),
meta:{
keepAlive: true,
}
} }
] ]
} }

@ -0,0 +1,221 @@
<script setup>
import {onBeforeMount, ref} from 'vue';
import {get_ai_show_data} from "@/apis/ai_show.js";
// region
const tableData = ref([])
const hallData = ref({})
const hallArray = ref([''])
//
const showData = ref([])
const prompt = ref('')
const tokens = ref(0)
const takeTimes = ref(0)
const realSales = ref('')
const aiSales = ref('')
const result = ref(false)
//
const show_date = ref('2026-06-12')
const cinema_code = ref('11078801')
//
async function get_data() {
await get_ai_show_data(cinema_code.value, show_date.value).then(res => {
if (res.status === 'success') {
result.value = false
showData.value = res.data.objects
prompt.value = res.data.prompt
tokens.value = res.data.take_tokens
takeTimes.value = res.data.take_times
realSales.value = res.data.real_sales
aiSales.value = res.data.ai_sales
console.log(showData.value, prompt.value, tokens.value, takeTimes.value, realSales.value, aiSales.value)
formatTableData()
} else {
result.value = true
}
}).catch(err => {
console.log(err)
}
)
}
//
function formatTableData() {
hallArray.value = []
tableData.value = []
let temp = 0;
showData.value.forEach((item, index) => {
tableData.value.push({
hall: item[0],
ai_show: item[2],
ai_language: item[4],
ai_start: item[5],
ai_end: item[6],
ai_length: item[7],
ai_duration: item[8],
real_show: item[9],
real_language: item[11],
real_start: item[12],
real_end: item[13],
real_length: item[14],
real_duration: item[15],
})
if (hallArray.value.indexOf(item[0]) >= 0) {
hallData[temp] += 1
} else {
temp = index
hallArray.value.push(item[0])
hallData[temp] = 1
}
})
}
//
const objectSpanMethod = ({row, column, rowIndex, columnIndex}) => {
if (columnIndex === 0) {
if (!isNaN(hallData[rowIndex])) {
return {
rowspan: hallData[rowIndex],
colspan: 1,
}
} else {
return {
rowspan: 0,
colspan: 0,
}
}
}
}
//
const disabledDate = (time) => {
const start = new Date('2026-06-11T00:00:00Z')
const end = new Date()
return time.getTime() < start || time.getTime() > end
}
//
onBeforeMount(
async () => {
await get_data()
}
)
// endregion
</script>
<template>
<el-form
:inline="true"
class="search_form"
>
<el-form-item label="智能排片日期" label-width="120">
<el-date-picker
v-model="show_date"
type="date"
placeholder="选择排片日期"
size="default"
:disabled-date="disabledDate"
value-format="YYYY-MM-DD"
@change="get_data"
/>
</el-form-item>
<el-form-item>
<el-radio-group v-model="cinema_code" aria-label="cinema control" class="mb-4" @change="get_data">
<el-radio-button value="11078801">保利国际影城北京凯德大峡谷店</el-radio-button>
<el-radio-button value="31073101">SFC上影(永华店)</el-radio-button>
<el-radio-button value="33040301">宁波影都东门口店</el-radio-button>
</el-radio-group>
</el-form-item>
<!-- <el-button style="margin-right: 0">添加</el-button>-->
</el-form>
<el-row>
<el-col :span="4" align="right">
<el-text style="font-weight: bold">智能排片预估销售额</el-text>
</el-col>
<el-col :span="4" align="left">
<el-text>{{ aiSales }}</el-text>
</el-col>
</el-row>
<el-row>
<el-col :span="4" align="right">
<el-text style="font-weight: bold">真实排片销售额</el-text>
</el-col>
<el-col :span="4" align="left">
<el-text>{{ realSales }}</el-text>
</el-col>
</el-row>
<el-row>
<el-col :span="4" align="right">
<el-text style="font-weight: bold">智能排片耗时</el-text>
</el-col>
<el-col :span="4" align="left">
<el-text>{{ takeTimes }}</el-text>
</el-col>
</el-row>
<el-row>
<el-col :span="4" align="right">
<el-text style="font-weight: bold">智能排片消耗Tokens</el-text>
</el-col>
<el-col :span="4" align="left">
<el-text>{{ tokens }}</el-text>
</el-col>
</el-row>
<el-table :data="tableData" style="width: 100%" :span-method="objectSpanMethod">
<el-table-column prop="hall" label="影厅别名" min-width="160"></el-table-column>
<el-table-column label="智能排片" align="center">
<el-table-column prop="ai_show" label="影片别名" min-width="160"></el-table-column>
<el-table-column prop="ai_language" label="语言" min-width="60"></el-table-column>
<el-table-column prop="ai_start" label="开始时间" min-width="80"></el-table-column>
<el-table-column prop="ai_end" label="结束时间" min-width="80"></el-table-column>
<el-table-column prop="ai_length" label="片长" min-width="60"></el-table-column>
<el-table-column prop="ai_duration" label="场间" min-width="60"></el-table-column>
</el-table-column>
<el-table-column label="影院真实排片" align="center">
<el-table-column prop="real_show" label="影片别名" min-width="160"></el-table-column>
<el-table-column prop="real_language" label="语言" min-width="60"></el-table-column>
<el-table-column prop="real_start" label="开始时间" min-width="80"></el-table-column>
<el-table-column prop="real_end" label="结束时间" min-width="80"></el-table-column>
<el-table-column prop="real_length" label="片长" min-width="60"></el-table-column>
<el-table-column prop="real_duration" label="场间" min-width="60"></el-table-column>
</el-table-column>
</el-table>
<el-row>
<el-col :span="2" align="right">
<el-text style="font-weight: bold">提示词</el-text>
</el-col>
<el-col :span="22" align="left">
<el-text>{{ prompt }}</el-text>
</el-col>
</el-row>
</template>
<style>
.pagination-container {
display: flex;
justify-content: flex-end;
margin-top: 20px;
}
.search_form {
display: flex;
justify-content: flex-start;
}
.custom-tooltip {
max-width: 500px; /* 设置最大宽度为 300px */
}
.el-text {
white-space: pre-wrap; /* 或者使用 pre-line */
}
</style>
Loading…
Cancel
Save