Commit 430b72bd by 李金轩

ljx

1 parent a911ba00
...@@ -19,7 +19,7 @@ ...@@ -19,7 +19,7 @@
"less-loader": "^7.3.0", "less-loader": "^7.3.0",
"lodash": "^4.17.21", "lodash": "^4.17.21",
"moment": "^2.29.1", "moment": "^2.29.1",
"vue": "^3.2.22", "vue": "^3.2.27",
"vue-router": "^4.0.8", "vue-router": "^4.0.8",
"vuex": "^4.0.0" "vuex": "^4.0.0"
}, },
......
...@@ -55,4 +55,5 @@ html, body, #app, .el-container { ...@@ -55,4 +55,5 @@ html, body, #app, .el-container {
justify-content: center; justify-content: center;
} }
</style> </style>
...@@ -15,7 +15,7 @@ axiosInstance.interceptors.request.use( ...@@ -15,7 +15,7 @@ axiosInstance.interceptors.request.use(
config => { config => {
if (['localhost', '192.168.1.104'].includes(window.location.hostname)) if (['localhost', '192.168.1.104'].includes(window.location.hostname))
{ {
config.headers.Authorization = '34cdfc09-4ff1-44ac-9e9b-0b0da9b3047a' config.headers.Authorization = 'a1c28c12-cb12-439a-ae1e-e816e3f8f809'
} }
else else
{ {
......
<template> <template>
<div class="result-wrapper"> <div class="result-wrapper">
<div class="result-header">结果展示</div> <div class="result-header">结果展示</div>
<div id="showDiv" class="scrollbar-wrapper"> <div id="showDiv" class="scrollbar-wrapper" style="padding: 20px">
<div v-for="item in informationList">
{{ item }}
</div>
</div> </div>
</div> </div>
</template> </template>
<script> <script>
import $ from 'jquery' import $ from 'jquery'
import {onMounted, onUpdated} from 'vue' import {computed, onMounted, onUpdated, watch} from 'vue'
export default { export default {
props: ['data'], props: ['data'],
setup(props, {emit}) { setup(props, {emit}) {
const informationList = props.data const data = props.data
const informationList = computed(() => {
return data
})
// function // function
const renderResultToHtml = function(data, hasSccessDetail) { const renderResultToHtml = function(data, hasSccessDetail) {
...@@ -67,9 +69,16 @@ export default { ...@@ -67,9 +69,16 @@ export default {
$("#showDiv").append(text) $("#showDiv").append(text)
} }
onUpdated( watch(
() => { () => {
log(informationList) return informationList.value.toString()
},
(newData) => {
$("#showDiv").empty()
for (const item of informationList.value)
{
renderResultToHtml(item)
}
} }
) )
......
...@@ -29,6 +29,10 @@ const menuRoute = [ ...@@ -29,6 +29,10 @@ const menuRoute = [
path: 'SnapshotCluster', path: 'SnapshotCluster',
component: () => import("@/views/SnapshotCluster/SnapshotCluster.vue"), component: () => import("@/views/SnapshotCluster/SnapshotCluster.vue"),
}, },
{
path: 'EquipmentTimeErrorVerification',
component: () => import("@/views/EquipmentTimeErrorVerification/EquipmentTimeErrorVerification.vue"),
},
] ]
}, },
] ]
......
<template>
<a-menu v-model:selectedKeys="currentMenu" mode="horizontal">
<a-menu-item :key="'客流数据'">
客流数据
</a-menu-item>
<a-menu-item :key="'人脸数据'">
人脸数据
</a-menu-item>
</a-menu>
<div v-show="currentMenu[0] === '客流数据'">
<PassengerFlowData></PassengerFlowData>
</div>
<div v-show="currentMenu[0] === '人脸数据'">
<FaceData></FaceData>
</div>
</template>
<script>
import {ref} from 'vue'
import FaceData from './FaceData/FaceData.vue'
import PassengerFlowData from './PassengerFlowData/PassengerFlowData.vue'
export default {
components: {
FaceData,
PassengerFlowData,
},
setup() {
// scalar
const currentMenu = ref(['客流数据'])
// sequence
// mapping
// function
return {
// scalar
currentMenu,
// sequence
// mapping
// function
}
}
}
</script>
<style scoped>
</style>
import axiosInstance from "@/Request/PublicAxiosInstance"
import {filterEmptyValueInObject} from "@/PublicUtil/PublicUtil"
class SnapshotRecordApi {
getGateList(data) {
return axiosInstance.request(
{
method: 'GET',
url: `/gates/gateByInfo`,
params: filterEmptyValueInObject(
{
account_id: data.account_id,
plaza_id: data.plaza_id,
zone_id: data.zone_id,
type: data.type,
},
)
}
)
}
}
const snapshotRecordApi = new SnapshotRecordApi()
export default snapshotRecordApi
.single-image {
height: 300px;
width: 100%;
}
<template>
</template>
<script>
export default {
setup() {
return {}
}
}
</script>
<style lang="less" scoped>
@import "./FaceData";
</style>
import axiosInstance from "@/Request/PublicAxiosInstance"
import {filterEmptyValueInObject} from "@/PublicUtil/PublicUtil"
class PassengerFlowDataApi {
preview(data) {
return axiosInstance.request(
{
method: 'POST',
url: `/preview/viewCountData`,
}
)
}
}
const passengerFlowDataApi = new PassengerFlowDataApi()
export default passengerFlowDataApi
.single-image {
height: 300px;
width: 100%;
}
<template>
<a-form :model="queryForm" layout="inline">
<a-form-item label="集团:">
<a-select v-model:value="queryForm.account_id"
style="width: 200px"
mode="multiple"
:maxTagCount="1"
@change="onAccountChange"
>
<a-select-option
v-for="item in accountList"
:value="item.id"
>
{{ item.name }}
</a-select-option>
</a-select>
</a-form-item>
<a-form-item label="广场:">
<a-select v-model:value="queryForm.plaza_id"
style="width: 200px"
mode="multiple"
:maxTagCount="1"
@change="onPlazaChange"
>
<a-select-option
v-for="item in plazaList"
:value="item.id">
{{ item.name }}
</a-select-option>
</a-select>
</a-form-item>
<a-form-item label="监控点:">
<a-select v-model:value="queryForm.gate_id"
style="width: 200px"
mode="multiple"
:maxTagCount="1">
<a-select-option
v-for="item in gateList"
:value="item.id"
>
{{ item.name }}
</a-select-option>
</a-select>
</a-form-item>
<a-form-item label="开始日期:">
<a-date-picker v-model:value="queryForm.startDate"/>
</a-form-item>
<a-form-item label="结束日期:">
<a-date-picker v-model:value="queryForm.endDate"/>
</a-form-item>
<a-form-item>
<a-button type="primary" @click="confirmSearch">开始</a-button>
</a-form-item>
</a-form>
</template>
<script>
import {reactive, ref, toRaw} from 'vue'
import moment from 'moment'
import snapshotRecordApi from '@/views/SnapshotCluster/SnapshotRecord/SnapshotRecordApi'
import {isArray} from '@/PublicUtil/Judgment'
import {formatDate, formatTime} from '@/PublicUtil/PublicUtil'
import InformationDisplay from '@/component/InformationDisplay/InformationDisplay'
import dataRerunApi from '@/views/DataRerun/DataRerunApi'
import passengerFlowDataApi from '@/views/DataRepair/PassengerFlowData/PassengerFlowData'
export default {
components: {
InformationDisplay,
},
setup() {
const resultList = ref([])
const informationList = ref([])
// sequence
const accountList = ref([])
const plazaList = ref([])
const zoneList = ref([])
const gateList = ref([])
let webSocketMap = {
mallcountData: undefined,
floorcountData: undefined,
zonecountData: undefined,
gatecountData: undefined,
mallfaceSta: undefined,
floorfaceSta: undefined,
zonefaceSta: undefined,
gatefaceSta: undefined,
}
// mapping
const progressMap = {
mallcountData: "商场客流",
floorcountData: "楼层客流",
zonecountData: "店铺客流",
gatecountData: "监控点客流",
mallfaceSta: "商场人脸",
floorfaceSta: "楼层人脸",
zonefaceSta: "店铺人脸",
gatefaceSta: "监控点人脸"
}
const queryForm = reactive(
{
account_id: [],
plaza_id: [],
gate_id: [],
channel: [],
startDate: moment(moment().format('YYYY-MM-DD'), 'YYYY-MM-DD'),
endDate: moment(moment().format('YYYY-MM-DD'), 'YYYY-MM-DD'),
}
)
const onAccountChange = function() {
getPlazaList()
}
const onPlazaChange = function() {
getGateList()
}
const getGateList = function() {
queryForm.gate_id = []
gateList.value = []
passengerFlowDataApi.getGateList(
{
accountIds: queryForm.account_id.toString(),
mallIds: queryForm.plaza_id.toString(),
}
).then(
(r) => {
if (isArray(r))
{
gateList.value = r
}
}
)
}
const getPlazaList = function() {
queryForm.plaza_id = []
plazaList.value = []
snapshotRecordApi.getPlazaList(
{
account_id: queryForm.account_id.toString()
}
).then(
(r) => {
if (isArray(r))
{
plazaList.value = r
}
}
)
}
const getAccountList = function() {
queryForm.account_id = []
accountList.value = []
snapshotRecordApi.getAccountList().then(
(r) => {
if (isArray(r))
{
accountList.value = r
}
}
)
}
const floatToPercent = function(floatNum) {
if (!floatNum)
{
return 0
}
let formatNum = Math.floor(floatNum * 100)
return formatNum >= 100 ? 100 : formatNum
}
const dealMessage = function(message) {
// scheduleType
const {dates, mallIds, mallNames, status, stepCount, scheduleType, counter} = message
let resObj = {}
resObj.dates = dates
resObj.mallIds = mallIds
resObj.mallNames = mallNames
resObj.status = status
resObj.progress = floatToPercent(stepCount)
resObj.totalNum = 0
resObj.totalPage = 0
resObj.current = 0
resObj.curPageSize = 0
resObj.currentPage = 0
resObj.scheduleType = scheduleType
if (counter)
{
// dataNum dateMallNum step totalData totalDate totalMall totalMallDateProduct allDataCount
resObj.totalNum = counter.allDataCount
resObj.totalPage = counter.totalMallDateProduct
resObj.current = counter.dataNum
resObj.curPageSize = counter.totalData
resObj.currentPage = counter.dateMallNum
}
if (resultList.value.length)
{
const isSameScheduleType = resultList.value.some(item => item.scheduleType === scheduleType)
isSameScheduleType
? resultList.value.forEach(item => {
//
item.progress = floatToPercent(stepCount)
if (counter)
{
item.totalNum = counter.allDataCount
item.totalPage = counter.totalMallDateProduct
item.current = counter.dataNum
item.curPageSize = counter.totalData
item.currentPage = counter.dateMallNum
}
})
: resultList.value.push(resObj)
resObj = {}
}
else
{
resultList.value.push(resObj)
resObj = {}
}
}
const initializeWebSocket = function(scheduleType) {
if (webSocketMap[scheduleType] !== undefined)
{
webSocketMap[scheduleType].close()
}
webSocketMap[scheduleType] = new WebSocket(`ws://store.keliuyun.com:9998/recal/schedule/${scheduleType}`)
webSocketMap[scheduleType].onopen = () => {
queryData(scheduleType)
}
webSocketMap[scheduleType].onmessage = function(event) {
let message = JSON.parse(event.data)
dealMessage(message)
if (message.stepCount === 1)
{
webSocketMap[scheduleType].close()
}
}
}
const queryData = function(scheduleType) {
const rawData = toRaw(queryForm)
const data = {
mallIds: rawData.plaza_id,
scheduleType: scheduleType,
startDate: formatDate(rawData.startDate) + ' ' + '00:00:00',
endDate: formatDate(rawData.endDate) + ' ' + '00:00:00',
}
dataRerunApi.getResult(data, scheduleType).then(
(r) => {
informationList.value.push(r)
}
)
}
const confirmSearch = function() {
passengerFlowDataApi.preview()
}
const __main = function() {
getAccountList()
}
__main()
return {
// sequence
accountList,
plazaList,
zoneList,
gateList,
resultList,
informationList,
// mapping
progressMap,
queryForm,
onAccountChange,
initializeWebSocket,
confirmSearch,
onPlazaChange,
}
}
}
</script>
<style lang="less" scoped>
@import "./PassengerFlowData.less";
</style>
.result-wrapper-2 {
width: 50%;
min-width: 600px;
border-radius: 4px;
margin: 20px auto 0;
position: relative;
overflow: auto;
}
<template> <template>
<a-form :model="querySnapshotRecordForm" layout="inline"> <a-form :model="queryForm" layout="inline">
<a-form-item label="集团:"> <a-form-item label="集团:">
<a-select v-model:value="querySnapshotRecordForm.account_id" <a-select v-model:value="queryForm.account_id"
style="width: 200px" style="width: 200px"
mode="multiple" mode="multiple"
:maxTagCount="1" :maxTagCount="1"
...@@ -16,7 +16,7 @@ ...@@ -16,7 +16,7 @@
</a-select> </a-select>
</a-form-item> </a-form-item>
<a-form-item label="广场:"> <a-form-item label="广场:">
<a-select v-model:value="querySnapshotRecordForm.plaza_id" <a-select v-model:value="queryForm.plaza_id"
style="width: 200px" style="width: 200px"
mode="multiple" mode="multiple"
:maxTagCount="1" :maxTagCount="1"
...@@ -29,7 +29,7 @@ ...@@ -29,7 +29,7 @@
</a-select> </a-select>
</a-form-item> </a-form-item>
<a-form-item label="数据:"> <a-form-item label="数据:">
<a-select v-model:value="querySnapshotRecordForm.scheduleTypeList" <a-select v-model:value="queryForm.scheduleTypeList"
style="width: 200px" style="width: 200px"
mode="multiple" mode="multiple"
:maxTagCount="1" :maxTagCount="1"
...@@ -43,17 +43,27 @@ ...@@ -43,17 +43,27 @@
</a-select> </a-select>
</a-form-item> </a-form-item>
<a-form-item label="开始日期:"> <a-form-item label="开始日期:">
<a-date-picker v-model:value="querySnapshotRecordForm.startDate"/> <a-date-picker v-model:value="queryForm.startDate"/>
</a-form-item> </a-form-item>
<a-form-item label="结束日期:"> <a-form-item label="结束日期:">
<a-date-picker v-model:value="querySnapshotRecordForm.endDate"/> <a-date-picker v-model:value="queryForm.endDate"/>
</a-form-item> </a-form-item>
<a-form-item> <a-form-item>
<a-button type="primary" @click="confirmSearch">开始</a-button> <a-button type="primary" @click="confirmSearch">开始</a-button>
</a-form-item> </a-form-item>
</a-form> </a-form>
<InformationDisplay :data="informationList" :key="resultList"></InformationDisplay> <div class="result-wrapper-2">
<el-row v-for="item in resultList">
<el-col :span="3">
{{ progressMap[item.scheduleType] + ':' }}
</el-col>
<el-col :span="21">
<el-progress :text-inside="true" :stroke-width="26" :percentage="item?.progress"/>
</el-col>
</el-row>
</div>
<InformationDisplay :data="informationList" :key="informationList"></InformationDisplay>
</template> </template>
<script> <script>
...@@ -100,7 +110,7 @@ export default { ...@@ -100,7 +110,7 @@ export default {
gatefaceSta: "监控点人脸" gatefaceSta: "监控点人脸"
} }
const querySnapshotRecordForm = reactive( const queryForm = reactive(
{ {
account_id: [], account_id: [],
plaza_id: [], plaza_id: [],
...@@ -115,11 +125,11 @@ export default { ...@@ -115,11 +125,11 @@ export default {
} }
const getPlazaList = function() { const getPlazaList = function() {
querySnapshotRecordForm.plaza_id = [] queryForm.plaza_id = []
plazaList.value = [] plazaList.value = []
snapshotRecordApi.getPlazaList( snapshotRecordApi.getPlazaList(
{ {
account_id: querySnapshotRecordForm.account_id.toString() account_id: queryForm.account_id.toString()
} }
).then( ).then(
(r) => { (r) => {
...@@ -132,7 +142,7 @@ export default { ...@@ -132,7 +142,7 @@ export default {
} }
const getAccountList = function() { const getAccountList = function() {
querySnapshotRecordForm.account_id = [] queryForm.account_id = []
accountList.value = [] accountList.value = []
snapshotRecordApi.getAccountList().then( snapshotRecordApi.getAccountList().then(
(r) => { (r) => {
...@@ -226,7 +236,7 @@ export default { ...@@ -226,7 +236,7 @@ export default {
} }
const queryData = function(scheduleType) { const queryData = function(scheduleType) {
const rawData = toRaw(querySnapshotRecordForm) const rawData = toRaw(queryForm)
const data = { const data = {
mallIds: rawData.plaza_id, mallIds: rawData.plaza_id,
scheduleType: scheduleType, scheduleType: scheduleType,
...@@ -243,7 +253,7 @@ export default { ...@@ -243,7 +253,7 @@ export default {
const confirmSearch = function() { const confirmSearch = function() {
resultList.value = [] resultList.value = []
informationList.value = [] informationList.value = []
for (const scheduleType of querySnapshotRecordForm.scheduleTypeList) for (const scheduleType of queryForm.scheduleTypeList)
{ {
initializeWebSocket(scheduleType) initializeWebSocket(scheduleType)
} }
...@@ -265,7 +275,7 @@ export default { ...@@ -265,7 +275,7 @@ export default {
informationList, informationList,
// mapping // mapping
progressMap, progressMap,
querySnapshotRecordForm, queryForm,
onAccountChange, onAccountChange,
initializeWebSocket, initializeWebSocket,
confirmSearch, confirmSearch,
...@@ -274,6 +284,6 @@ export default { ...@@ -274,6 +284,6 @@ export default {
} }
</script> </script>
<style scoped> <style lang="less" scoped>
@import "./DataRerun.less";
</style> </style>
<template>
132231
</template>
<script>
export default {
setup() {
return {}
}
}
</script>
<style scoped>
</style>
<template> <template>
<a-form :model="querySnapshotRecordForm" layout="inline"> <a-form :model="queryForm" layout="inline">
<a-form-item label="集团:"> <a-form-item label="集团:">
<a-select v-model:value="querySnapshotRecordForm.account_id" <a-select v-model:value="queryForm.account_id"
style="width: 200px" style="width: 200px"
mode="multiple" mode="multiple"
:maxTagCount="1" :maxTagCount="1"
...@@ -16,7 +16,7 @@ ...@@ -16,7 +16,7 @@
</a-select> </a-select>
</a-form-item> </a-form-item>
<a-form-item label="广场:"> <a-form-item label="广场:">
<a-select v-model:value="querySnapshotRecordForm.plaza_id" <a-select v-model:value="queryForm.plaza_id"
style="width: 200px" style="width: 200px"
mode="multiple" mode="multiple"
:maxTagCount="1" :maxTagCount="1"
...@@ -29,13 +29,13 @@ ...@@ -29,13 +29,13 @@
</a-select> </a-select>
</a-form-item> </a-form-item>
<a-form-item label="特征重提类型:"> <a-form-item label="特征重提类型:">
<a-select v-model:value="querySnapshotRecordForm.featureRevisitType" style="width: 200px"> <a-select v-model:value="queryForm.featureRevisitType" style="width: 200px">
<a-select-option :value="1">店员库重建</a-select-option> <a-select-option :value="1">店员库重建</a-select-option>
<a-select-option :value="2">顾客库重建</a-select-option> <a-select-option :value="2">顾客库重建</a-select-option>
</a-select> </a-select>
</a-form-item> </a-form-item>
<a-form-item label="选择日期:" v-if="querySnapshotRecordForm.featureRevisitType === 2"> <a-form-item label="选择日期:" v-if="queryForm.featureRevisitType === 2">
<a-date-picker v-model:value="querySnapshotRecordForm.date"/> <a-date-picker v-model:value="queryForm.date"/>
</a-form-item> </a-form-item>
<a-form-item> <a-form-item>
<a-button type="primary" @click="initializeWebSocket">开始</a-button> <a-button type="primary" @click="initializeWebSocket">开始</a-button>
...@@ -68,7 +68,7 @@ export default { ...@@ -68,7 +68,7 @@ export default {
const zoneList = ref([]) const zoneList = ref([])
const gateList = ref([]) const gateList = ref([])
const querySnapshotRecordForm = reactive( const queryForm = reactive(
{ {
account_id: [], account_id: [],
plaza_id: [], plaza_id: [],
...@@ -82,11 +82,11 @@ export default { ...@@ -82,11 +82,11 @@ export default {
} }
const getPlazaList = function() { const getPlazaList = function() {
querySnapshotRecordForm.plaza_id = [] queryForm.plaza_id = []
plazaList.value = [] plazaList.value = []
snapshotRecordApi.getPlazaList( snapshotRecordApi.getPlazaList(
{ {
account_id: querySnapshotRecordForm.account_id.toString() account_id: queryForm.account_id.toString()
} }
).then( ).then(
(r) => { (r) => {
...@@ -99,7 +99,7 @@ export default { ...@@ -99,7 +99,7 @@ export default {
} }
const getAccountList = function() { const getAccountList = function() {
querySnapshotRecordForm.account_id = [] queryForm.account_id = []
accountList.value = [] accountList.value = []
snapshotRecordApi.getAccountList().then( snapshotRecordApi.getAccountList().then(
(r) => { (r) => {
...@@ -177,7 +177,7 @@ export default { ...@@ -177,7 +177,7 @@ export default {
} }
resultList.value = [] resultList.value = []
webSocket = new WebSocket(`ws://store.keliuyun.com:9998/recal/schedule/rebuildFeatureLib${querySnapshotRecordForm.featureRevisitType}`) webSocket = new WebSocket(`ws://store.keliuyun.com:9998/recal/schedule/rebuildFeatureLib${queryForm.featureRevisitType}`)
webSocket.onopen = queryData webSocket.onopen = queryData
...@@ -192,7 +192,7 @@ export default { ...@@ -192,7 +192,7 @@ export default {
} }
const queryData = function() { const queryData = function() {
const rawData = toRaw(querySnapshotRecordForm) const rawData = toRaw(queryForm)
switch (rawData.featureRevisitType) switch (rawData.featureRevisitType)
{ {
case 1: case 1:
...@@ -231,7 +231,7 @@ export default { ...@@ -231,7 +231,7 @@ export default {
zoneList, zoneList,
gateList, gateList,
resultList, resultList,
querySnapshotRecordForm, queryForm,
onAccountChange, onAccountChange,
initializeWebSocket, initializeWebSocket,
} }
......
<template> <template>
<a-form :model="querySnapshotRecordForm" layout="inline"> <a-form :model="queryForm" layout="inline">
<a-form-item label="集团:"> <a-form-item label="集团:">
<a-select v-model:value="querySnapshotRecordForm.account_id" <a-select v-model:value="queryForm.account_id"
style="width: 200px" style="width: 200px"
mode="multiple" mode="multiple"
:maxTagCount="1" :maxTagCount="1"
...@@ -16,7 +16,7 @@ ...@@ -16,7 +16,7 @@
</a-select> </a-select>
</a-form-item> </a-form-item>
<a-form-item label="广场:"> <a-form-item label="广场:">
<a-select v-model:value="querySnapshotRecordForm.plaza_id" <a-select v-model:value="queryForm.plaza_id"
style="width: 200px" style="width: 200px"
mode="multiple" mode="multiple"
:maxTagCount="1" :maxTagCount="1"
...@@ -29,15 +29,15 @@ ...@@ -29,15 +29,15 @@
</a-select> </a-select>
</a-form-item> </a-form-item>
<a-form-item label="特征重提类型:"> <a-form-item label="特征重提类型:">
<a-select v-model:value="querySnapshotRecordForm.featureRevisitType" style="width: 200px"> <a-select v-model:value="queryForm.featureRevisitType" style="width: 200px">
<a-select-option :value="0">人脸+全身照特征</a-select-option> <a-select-option :value="0">人脸+全身照特征</a-select-option>
<a-select-option :value="1">人脸特征</a-select-option> <a-select-option :value="1">人脸特征</a-select-option>
<a-select-option :value="2">全身照特征</a-select-option> <a-select-option :value="2">全身照特征</a-select-option>
<a-select-option :value="3">店员特征</a-select-option> <a-select-option :value="3">店员特征</a-select-option>
</a-select> </a-select>
</a-form-item> </a-form-item>
<a-form-item label="选择日期:" v-if="querySnapshotRecordForm.featureRevisitType !== 3"> <a-form-item label="选择日期:" v-if="queryForm.featureRevisitType !== 3">
<a-date-picker v-model:value="querySnapshotRecordForm.date"/> <a-date-picker v-model:value="queryForm.date"/>
</a-form-item> </a-form-item>
<a-form-item> <a-form-item>
<a-button type="primary" @click="initializeWebSocket">开始</a-button> <a-button type="primary" @click="initializeWebSocket">开始</a-button>
...@@ -71,7 +71,7 @@ export default { ...@@ -71,7 +71,7 @@ export default {
const zoneList = ref([]) const zoneList = ref([])
const gateList = ref([]) const gateList = ref([])
const querySnapshotRecordForm = reactive( const queryForm = reactive(
{ {
account_id: [], account_id: [],
plaza_id: [], plaza_id: [],
...@@ -85,11 +85,11 @@ export default { ...@@ -85,11 +85,11 @@ export default {
} }
const getPlazaList = function() { const getPlazaList = function() {
querySnapshotRecordForm.plaza_id = [] queryForm.plaza_id = []
plazaList.value = [] plazaList.value = []
snapshotRecordApi.getPlazaList( snapshotRecordApi.getPlazaList(
{ {
account_id: querySnapshotRecordForm.account_id.toString() account_id: queryForm.account_id.toString()
} }
).then( ).then(
(r) => { (r) => {
...@@ -102,7 +102,7 @@ export default { ...@@ -102,7 +102,7 @@ export default {
} }
const getAccountList = function() { const getAccountList = function() {
querySnapshotRecordForm.account_id = [] queryForm.account_id = []
accountList.value = [] accountList.value = []
snapshotRecordApi.getAccountList().then( snapshotRecordApi.getAccountList().then(
(r) => { (r) => {
...@@ -180,7 +180,7 @@ export default { ...@@ -180,7 +180,7 @@ export default {
} }
resultList.value = [] resultList.value = []
webSocket = new WebSocket(`ws://store.keliuyun.com:9998/recal/schedule/revisitFeature${querySnapshotRecordForm.featureRevisitType}`) webSocket = new WebSocket(`ws://store.keliuyun.com:9998/recal/schedule/revisitFeature${queryForm.featureRevisitType}`)
webSocket.onopen = queryData webSocket.onopen = queryData
...@@ -195,7 +195,7 @@ export default { ...@@ -195,7 +195,7 @@ export default {
} }
const queryData = function() { const queryData = function() {
const rawData = toRaw(querySnapshotRecordForm) const rawData = toRaw(queryForm)
if ([0, 1, 2].includes(rawData.featureRevisitType)) if ([0, 1, 2].includes(rawData.featureRevisitType))
{ {
const data = { const data = {
...@@ -231,7 +231,7 @@ export default { ...@@ -231,7 +231,7 @@ export default {
zoneList, zoneList,
gateList, gateList,
resultList, resultList,
querySnapshotRecordForm, queryForm,
onAccountChange, onAccountChange,
initializeWebSocket, initializeWebSocket,
} }
......
...@@ -20,6 +20,9 @@ ...@@ -20,6 +20,9 @@
<a-menu-item :key="'/Main/SnapshotCluster'"> <a-menu-item :key="'/Main/SnapshotCluster'">
<span>抓拍聚类</span> <span>抓拍聚类</span>
</a-menu-item> </a-menu-item>
<a-menu-item :key="'/Main/EquipmentTimeErrorVerification'">
<span>设备时间错误校验</span>
</a-menu-item>
</a-menu> </a-menu>
</el-aside> </el-aside>
<el-main> <el-main>
......
<template> <template>
<a-form :model="querySnapshotRecordForm" layout="inline"> <a-form :model="queryForm" layout="inline">
<a-form-item label="集团:"> <a-form-item label="集团:">
<a-select v-model:value="querySnapshotRecordForm.account_id" <a-select v-model:value="queryForm.account_id"
style="width: 200px" style="width: 200px"
mode="multiple" mode="multiple"
:maxTagCount="1" :maxTagCount="1"
...@@ -16,7 +16,7 @@ ...@@ -16,7 +16,7 @@
</a-select> </a-select>
</a-form-item> </a-form-item>
<a-form-item label="广场:"> <a-form-item label="广场:">
<a-select v-model:value="querySnapshotRecordForm.plaza_id" <a-select v-model:value="queryForm.plaza_id"
style="width: 200px" style="width: 200px"
mode="multiple" mode="multiple"
:maxTagCount="1" :maxTagCount="1"
...@@ -29,13 +29,13 @@ ...@@ -29,13 +29,13 @@
</a-select> </a-select>
</a-form-item> </a-form-item>
<a-form-item label="比对类型:"> <a-form-item label="比对类型:">
<a-select v-model:value="querySnapshotRecordForm.featureRevisitType" style="width: 200px"> <a-select v-model:value="queryForm.featureRevisitType" style="width: 200px">
<a-select-option :value="1">店员对比</a-select-option> <a-select-option :value="1">店员对比</a-select-option>
<a-select-option :value="2">顾客对比</a-select-option> <a-select-option :value="2">顾客对比</a-select-option>
</a-select> </a-select>
</a-form-item> </a-form-item>
<a-form-item label="选择日期:"> <a-form-item label="选择日期:">
<a-date-picker v-model:value="querySnapshotRecordForm.date"/> <a-date-picker v-model:value="queryForm.date"/>
</a-form-item> </a-form-item>
<a-form-item> <a-form-item>
<a-button type="primary" @click="initializeWebSocket">开始</a-button> <a-button type="primary" @click="initializeWebSocket">开始</a-button>
...@@ -68,7 +68,7 @@ export default { ...@@ -68,7 +68,7 @@ export default {
const zoneList = ref([]) const zoneList = ref([])
const gateList = ref([]) const gateList = ref([])
const querySnapshotRecordForm = reactive( const queryForm = reactive(
{ {
account_id: [], account_id: [],
plaza_id: [], plaza_id: [],
...@@ -82,11 +82,11 @@ export default { ...@@ -82,11 +82,11 @@ export default {
} }
const getPlazaList = function() { const getPlazaList = function() {
querySnapshotRecordForm.plaza_id = [] queryForm.plaza_id = []
plazaList.value = [] plazaList.value = []
snapshotRecordApi.getPlazaList( snapshotRecordApi.getPlazaList(
{ {
account_id: querySnapshotRecordForm.account_id.toString() account_id: queryForm.account_id.toString()
} }
).then( ).then(
(r) => { (r) => {
...@@ -99,7 +99,7 @@ export default { ...@@ -99,7 +99,7 @@ export default {
} }
const getAccountList = function() { const getAccountList = function() {
querySnapshotRecordForm.account_id = [] queryForm.account_id = []
accountList.value = [] accountList.value = []
snapshotRecordApi.getAccountList().then( snapshotRecordApi.getAccountList().then(
(r) => { (r) => {
...@@ -177,7 +177,7 @@ export default { ...@@ -177,7 +177,7 @@ export default {
} }
resultList.value = [] resultList.value = []
webSocket = new WebSocket(`ws://store.keliuyun.com:9998/recal/schedule/rematchPerson${querySnapshotRecordForm.featureRevisitType}`) webSocket = new WebSocket(`ws://store.keliuyun.com:9998/recal/schedule/rematchPerson${queryForm.featureRevisitType}`)
webSocket.onopen = queryData webSocket.onopen = queryData
...@@ -192,7 +192,7 @@ export default { ...@@ -192,7 +192,7 @@ export default {
} }
const queryData = function() { const queryData = function() {
const rawData = toRaw(querySnapshotRecordForm) const rawData = toRaw(queryForm)
switch (rawData.featureRevisitType) switch (rawData.featureRevisitType)
{ {
case 1: case 1:
...@@ -233,7 +233,7 @@ export default { ...@@ -233,7 +233,7 @@ export default {
zoneList, zoneList,
gateList, gateList,
resultList, resultList,
querySnapshotRecordForm, queryForm,
onAccountChange, onAccountChange,
initializeWebSocket, initializeWebSocket,
} }
......
<template> <template>
<a-form :model="queryClusterResultForm" layout="inline" :label-col="{span: 4}" :wrapper-col="{span: 14}"> <a-form :model="queryForm" layout="inline" :label-col="{span: 4}" :wrapper-col="{span: 14}">
<a-form-item label="集团:"> <a-form-item label="集团:">
<a-select v-model:value="queryClusterResultForm.account_id" <a-select v-model:value="queryForm.account_id"
style="width: 200px" style="width: 200px"
mode="multiple" mode="multiple"
:maxTagCount="1" :maxTagCount="1"
...@@ -16,7 +16,7 @@ ...@@ -16,7 +16,7 @@
</a-select> </a-select>
</a-form-item> </a-form-item>
<a-form-item label="广场:"> <a-form-item label="广场:">
<a-select v-model:value="queryClusterResultForm.plaza_id" <a-select v-model:value="queryForm.plaza_id"
style="width: 200px" style="width: 200px"
mode="multiple" mode="multiple"
:maxTagCount="1" :maxTagCount="1"
...@@ -30,7 +30,7 @@ ...@@ -30,7 +30,7 @@
</a-select> </a-select>
</a-form-item> </a-form-item>
<a-form-item label="出入类型:"> <a-form-item label="出入类型:">
<a-select v-model:value="queryClusterResultForm.type" style="width: 200px"> <a-select v-model:value="queryForm.type" style="width: 200px">
<a-select-option :value="0">全场</a-select-option> <a-select-option :value="0">全场</a-select-option>
<a-select-option :value="1">广场出入口</a-select-option> <a-select-option :value="1">广场出入口</a-select-option>
<a-select-option :value="2">楼层出入口</a-select-option> <a-select-option :value="2">楼层出入口</a-select-option>
...@@ -39,7 +39,7 @@ ...@@ -39,7 +39,7 @@
</a-select> </a-select>
</a-form-item> </a-form-item>
<a-form-item label="区域信息:"> <a-form-item label="区域信息:">
<a-select v-model:value="queryClusterResultForm.zone_id" <a-select v-model:value="queryForm.zone_id"
style="width: 200px" style="width: 200px"
mode="multiple" mode="multiple"
:maxTagCount="1" :maxTagCount="1"
...@@ -53,7 +53,7 @@ ...@@ -53,7 +53,7 @@
</a-select> </a-select>
</a-form-item> </a-form-item>
<a-form-item label="监控点:"> <a-form-item label="监控点:">
<a-select v-model:value="queryClusterResultForm.gate_id" <a-select v-model:value="queryForm.gate_id"
style="width: 200px" style="width: 200px"
mode="multiple" mode="multiple"
:maxTagCount="1"> :maxTagCount="1">
...@@ -66,7 +66,7 @@ ...@@ -66,7 +66,7 @@
</a-select> </a-select>
</a-form-item> </a-form-item>
<a-form-item label="方向:"> <a-form-item label="方向:">
<a-select v-model:value="queryClusterResultForm.direction" <a-select v-model:value="queryForm.direction"
mode="multiple" mode="multiple"
:maxTagCount="1" :maxTagCount="1"
style="width: 200px"> style="width: 200px">
...@@ -76,13 +76,13 @@ ...@@ -76,13 +76,13 @@
</a-select> </a-select>
</a-form-item> </a-form-item>
<a-form-item label="抓怕类型:"> <a-form-item label="抓怕类型:">
<a-select v-model:value="queryClusterResultForm.picType" style="width: 200px"> <a-select v-model:value="queryForm.picType" style="width: 200px">
<a-select-option :value="1">半身照</a-select-option> <a-select-option :value="1">半身照</a-select-option>
<a-select-option :value="2">全身照</a-select-option> <a-select-option :value="2">全身照</a-select-option>
</a-select> </a-select>
</a-form-item> </a-form-item>
<a-form-item label="人员类型:"> <a-form-item label="人员类型:">
<a-select v-model:value="queryClusterResultForm.personType" <a-select v-model:value="queryForm.personType"
mode="multiple" mode="multiple"
:maxTagCount="1" :maxTagCount="1"
style="width: 200px"> style="width: 200px">
...@@ -91,16 +91,16 @@ ...@@ -91,16 +91,16 @@
</a-select> </a-select>
</a-form-item> </a-form-item>
<a-form-item label="选择日期:"> <a-form-item label="选择日期:">
<a-date-picker v-model:value="queryClusterResultForm.date" :format="'YYYY-MM-DD'"/> <a-date-picker v-model:value="queryForm.date" :format="'YYYY-MM-DD'"/>
</a-form-item> </a-form-item>
<a-form-item label="选择时间:"> <a-form-item label="选择时间:">
<a-time-picker v-model:value="queryClusterResultForm.startTime"/> <a-time-picker v-model:value="queryForm.startTime"/>
<a-time-picker v-model:value="queryClusterResultForm.endTime"/> <a-time-picker v-model:value="queryForm.endTime"/>
</a-form-item> </a-form-item>
<a-form-item label="图片数量:"> <a-form-item label="图片数量:">
<a-input v-model:value="queryClusterResultForm.minPic" style="width: 100px"/> <a-input v-model:value="queryForm.minPic" style="width: 100px"/>
<a-input v-model:value="queryClusterResultForm.maxPic" style="width: 100px"/> <a-input v-model:value="queryForm.maxPic" style="width: 100px"/>
</a-form-item> </a-form-item>
<a-form-item> <a-form-item>
<a-button type="primary" @click="confirmSearch" :loading="isLoading">查询</a-button> <a-button type="primary" @click="confirmSearch" :loading="isLoading">查询</a-button>
...@@ -173,7 +173,7 @@ export default { ...@@ -173,7 +173,7 @@ export default {
} }
) )
const queryClusterResultForm = reactive( const queryForm = reactive(
{ {
account_id: [], account_id: [],
plaza_id: [], plaza_id: [],
...@@ -222,11 +222,11 @@ export default { ...@@ -222,11 +222,11 @@ export default {
} }
const getPlazaList = function() { const getPlazaList = function() {
queryClusterResultForm.plaza_id = [] queryForm.plaza_id = []
plazaList.value = [] plazaList.value = []
clusterResultApi.getPlazaList( clusterResultApi.getPlazaList(
{ {
account_id: queryClusterResultForm.account_id.toString() account_id: queryForm.account_id.toString()
} }
).then( ).then(
(r) => { (r) => {
...@@ -239,12 +239,12 @@ export default { ...@@ -239,12 +239,12 @@ export default {
} }
const getZoneList = function() { const getZoneList = function() {
queryClusterResultForm.zone_id = [] queryForm.zone_id = []
zoneList.value = [] zoneList.value = []
clusterResultApi.getZoneList( clusterResultApi.getZoneList(
{ {
account_id: queryClusterResultForm.account_id.toString(), account_id: queryForm.account_id.toString(),
plaza_id: queryClusterResultForm.plaza_id.toString(), plaza_id: queryForm.plaza_id.toString(),
} }
).then( ).then(
(r) => { (r) => {
...@@ -257,14 +257,14 @@ export default { ...@@ -257,14 +257,14 @@ export default {
} }
const getGateList = function() { const getGateList = function() {
queryClusterResultForm.gate_id = [] queryForm.gate_id = []
gateList.value = [] gateList.value = []
clusterResultApi.getGateList( clusterResultApi.getGateList(
{ {
account_id: queryClusterResultForm.account_id.toString(), account_id: queryForm.account_id.toString(),
plaza_id: queryClusterResultForm.plaza_id.toString(), plaza_id: queryForm.plaza_id.toString(),
zone_id: queryClusterResultForm.zone_id.toString(), zone_id: queryForm.zone_id.toString(),
type: queryClusterResultForm.type, type: queryForm.type,
} }
).then( ).then(
(r) => { (r) => {
...@@ -277,7 +277,7 @@ export default { ...@@ -277,7 +277,7 @@ export default {
} }
const getAccountList = function() { const getAccountList = function() {
queryClusterResultForm.account_id = [] queryForm.account_id = []
accountList.value = [] accountList.value = []
clusterResultApi.getAccountList().then( clusterResultApi.getAccountList().then(
(r) => { (r) => {
...@@ -291,7 +291,7 @@ export default { ...@@ -291,7 +291,7 @@ export default {
const confirmSearch = function() { const confirmSearch = function() {
isLoading.value = true isLoading.value = true
const rawData = toRaw(queryClusterResultForm) const rawData = toRaw(queryForm)
const data = filterEmptyValueInObject( const data = filterEmptyValueInObject(
{ {
account_id: rawData.account_id.toString(), account_id: rawData.account_id.toString(),
...@@ -375,7 +375,7 @@ export default { ...@@ -375,7 +375,7 @@ export default {
pagedTableDataList, pagedTableDataList,
dataList, dataList,
// mapping // mapping
queryClusterResultForm, queryForm,
// function // function
onPageNumChange, onPageNumChange,
onPageSizeChange, onPageSizeChange,
......
<template> <template>
<a-form :model="querySnapshotRecordForm" layout="inline"> <a-form :model="queryForm" layout="inline">
<a-form-item label="集团:"> <a-form-item label="集团:">
<a-select v-model:value="querySnapshotRecordForm.account_id" <a-select v-model:value="queryForm.account_id"
style="width: 200px" style="width: 200px"
mode="multiple" mode="multiple"
:maxTagCount="1" :maxTagCount="1"
...@@ -16,7 +16,7 @@ ...@@ -16,7 +16,7 @@
</a-select> </a-select>
</a-form-item> </a-form-item>
<a-form-item label="广场:"> <a-form-item label="广场:">
<a-select v-model:value="querySnapshotRecordForm.plaza_id" <a-select v-model:value="queryForm.plaza_id"
style="width: 200px" style="width: 200px"
mode="multiple" mode="multiple"
:maxTagCount="1" :maxTagCount="1"
...@@ -30,7 +30,7 @@ ...@@ -30,7 +30,7 @@
</a-select> </a-select>
</a-form-item> </a-form-item>
<a-form-item label="出入类型:"> <a-form-item label="出入类型:">
<a-select v-model:value="querySnapshotRecordForm.type" style="width: 200px"> <a-select v-model:value="queryForm.type" style="width: 200px">
<a-select-option :value="0">全场</a-select-option> <a-select-option :value="0">全场</a-select-option>
<a-select-option :value="1">广场出入口</a-select-option> <a-select-option :value="1">广场出入口</a-select-option>
<a-select-option :value="2">楼层出入口</a-select-option> <a-select-option :value="2">楼层出入口</a-select-option>
...@@ -39,7 +39,7 @@ ...@@ -39,7 +39,7 @@
</a-select> </a-select>
</a-form-item> </a-form-item>
<a-form-item label="区域信息:"> <a-form-item label="区域信息:">
<a-select v-model:value="querySnapshotRecordForm.zone_id" <a-select v-model:value="queryForm.zone_id"
style="width: 200px" style="width: 200px"
mode="multiple" mode="multiple"
:maxTagCount="1" :maxTagCount="1"
...@@ -53,7 +53,7 @@ ...@@ -53,7 +53,7 @@
</a-select> </a-select>
</a-form-item> </a-form-item>
<a-form-item label="监控点:"> <a-form-item label="监控点:">
<a-select v-model:value="querySnapshotRecordForm.gate_id" <a-select v-model:value="queryForm.gate_id"
style="width: 200px" style="width: 200px"
mode="multiple" mode="multiple"
:maxTagCount="1"> :maxTagCount="1">
...@@ -66,7 +66,7 @@ ...@@ -66,7 +66,7 @@
</a-select> </a-select>
</a-form-item> </a-form-item>
<a-form-item label="方向:"> <a-form-item label="方向:">
<a-select v-model:value="querySnapshotRecordForm.direction" <a-select v-model:value="queryForm.direction"
mode="multiple" mode="multiple"
:maxTagCount="1" :maxTagCount="1"
style="width: 200px"> style="width: 200px">
...@@ -76,13 +76,13 @@ ...@@ -76,13 +76,13 @@
</a-select> </a-select>
</a-form-item> </a-form-item>
<a-form-item label="抓怕类型:"> <a-form-item label="抓怕类型:">
<a-select v-model:value="querySnapshotRecordForm.picType" style="width: 200px"> <a-select v-model:value="queryForm.picType" style="width: 200px">
<a-select-option :value="1">半身照</a-select-option> <a-select-option :value="1">半身照</a-select-option>
<a-select-option :value="2">全身照</a-select-option> <a-select-option :value="2">全身照</a-select-option>
</a-select> </a-select>
</a-form-item> </a-form-item>
<a-form-item label="人员类型:"> <a-form-item label="人员类型:">
<a-select v-model:value="querySnapshotRecordForm.personType" <a-select v-model:value="queryForm.personType"
mode="multiple" mode="multiple"
:maxTagCount="1" :maxTagCount="1"
style="width: 200px"> style="width: 200px">
...@@ -91,11 +91,11 @@ ...@@ -91,11 +91,11 @@
</a-select> </a-select>
</a-form-item> </a-form-item>
<a-form-item label="选择日期:"> <a-form-item label="选择日期:">
<a-date-picker v-model:value="querySnapshotRecordForm.date" :format="'YYYY-MM-DD'"/> <a-date-picker v-model:value="queryForm.date" :format="'YYYY-MM-DD'"/>
</a-form-item> </a-form-item>
<a-form-item label="选择时间:"> <a-form-item label="选择时间:">
<a-time-picker v-model:value="querySnapshotRecordForm.startTime"/> <a-time-picker v-model:value="queryForm.startTime"/>
<a-time-picker v-model:value="querySnapshotRecordForm.endTime"/> <a-time-picker v-model:value="queryForm.endTime"/>
</a-form-item> </a-form-item>
<a-form-item> <a-form-item>
<a-button type="primary" @click="confirmSearch" :loading="isLoading">查询</a-button> <a-button type="primary" @click="confirmSearch" :loading="isLoading">查询</a-button>
...@@ -165,7 +165,7 @@ export default { ...@@ -165,7 +165,7 @@ export default {
} }
) )
const querySnapshotRecordForm = reactive( const queryForm = reactive(
{ {
account_id: [], account_id: [],
plaza_id: [], plaza_id: [],
...@@ -212,11 +212,11 @@ export default { ...@@ -212,11 +212,11 @@ export default {
} }
const getPlazaList = function() { const getPlazaList = function() {
querySnapshotRecordForm.plaza_id = [] queryForm.plaza_id = []
plazaList.value = [] plazaList.value = []
snapshotRecordApi.getPlazaList( snapshotRecordApi.getPlazaList(
{ {
account_id: querySnapshotRecordForm.account_id.toString() account_id: queryForm.account_id.toString()
} }
).then( ).then(
(r) => { (r) => {
...@@ -229,12 +229,12 @@ export default { ...@@ -229,12 +229,12 @@ export default {
} }
const getZoneList = function() { const getZoneList = function() {
querySnapshotRecordForm.zone_id = [] queryForm.zone_id = []
zoneList.value = [] zoneList.value = []
snapshotRecordApi.getZoneList( snapshotRecordApi.getZoneList(
{ {
account_id: querySnapshotRecordForm.account_id.toString(), account_id: queryForm.account_id.toString(),
plaza_id: querySnapshotRecordForm.plaza_id.toString(), plaza_id: queryForm.plaza_id.toString(),
} }
).then( ).then(
(r) => { (r) => {
...@@ -247,14 +247,14 @@ export default { ...@@ -247,14 +247,14 @@ export default {
} }
const getGateList = function() { const getGateList = function() {
querySnapshotRecordForm.gate_id = [] queryForm.gate_id = []
gateList.value = [] gateList.value = []
snapshotRecordApi.getGateList( snapshotRecordApi.getGateList(
{ {
account_id: querySnapshotRecordForm.account_id.toString(), account_id: queryForm.account_id.toString(),
plaza_id: querySnapshotRecordForm.plaza_id.toString(), plaza_id: queryForm.plaza_id.toString(),
zone_id: querySnapshotRecordForm.zone_id.toString(), zone_id: queryForm.zone_id.toString(),
type: querySnapshotRecordForm.type, type: queryForm.type,
} }
).then( ).then(
(r) => { (r) => {
...@@ -267,7 +267,7 @@ export default { ...@@ -267,7 +267,7 @@ export default {
} }
const getAccountList = function() { const getAccountList = function() {
querySnapshotRecordForm.account_id = [] queryForm.account_id = []
accountList.value = [] accountList.value = []
snapshotRecordApi.getAccountList().then( snapshotRecordApi.getAccountList().then(
(r) => { (r) => {
...@@ -281,7 +281,7 @@ export default { ...@@ -281,7 +281,7 @@ export default {
const confirmSearch = function() { const confirmSearch = function() {
isLoading.value = true isLoading.value = true
const rawData = toRaw(querySnapshotRecordForm) const rawData = toRaw(queryForm)
const data = filterEmptyValueInObject( const data = filterEmptyValueInObject(
{ {
account_id: rawData.account_id.toString(), account_id: rawData.account_id.toString(),
...@@ -354,7 +354,7 @@ export default { ...@@ -354,7 +354,7 @@ export default {
gateList, gateList,
pagedTableDataList, pagedTableDataList,
// mapping // mapping
querySnapshotRecordForm, queryForm,
// function // function
onPageNumChange, onPageNumChange,
onPageSizeChange, onPageSizeChange,
......
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!