|
|
|
@ -2,220 +2,274 @@
|
|
|
|
|
<div class="title-div">
|
|
|
|
|
<div class="title-span-div">
|
|
|
|
|
<div class="title-icon"></div>
|
|
|
|
|
<div class="title-span">创建算法实例</div>
|
|
|
|
|
<div class="title-span">{{`${props.modalType == 'insert'? '创建':'编辑'}算法实例`}}</div>
|
|
|
|
|
</div>
|
|
|
|
|
<div class="close-button" @click="emits('changeAddModal',false)"></div>
|
|
|
|
|
</div>
|
|
|
|
|
<div class="interval"></div>
|
|
|
|
|
<div class="modal-content">
|
|
|
|
|
<div class="content-steps-div">
|
|
|
|
|
<a-steps class="content-steps" :current="instanceSteps" label-placement="vertical" :items="items" />
|
|
|
|
|
</div>
|
|
|
|
|
<div class="step0-info-div" v-if="instanceSteps == 0">
|
|
|
|
|
<div class="left-content">
|
|
|
|
|
<div class="item-title">实例名称</div>
|
|
|
|
|
<a-input style="margin-bottom: 12px;" class="item-input" v-model:value="instanceName" placeholder="请输入的字段不得超过20字" />
|
|
|
|
|
<div class="item-title">设置封面</div>
|
|
|
|
|
<div class="instance-image-item-div">
|
|
|
|
|
<div class="default-image-div">
|
|
|
|
|
<div class="default-image"></div>
|
|
|
|
|
<div class="default-title-div">默认</div>
|
|
|
|
|
<a-spin :spinning="loading" tip="加载中...">
|
|
|
|
|
<div class="modal-content">
|
|
|
|
|
<div class="content-steps-div">
|
|
|
|
|
<a-steps class="content-steps" :current="instanceSteps" label-placement="vertical" :items="items" />
|
|
|
|
|
</div>
|
|
|
|
|
<div class="step0-info-div" v-if="instanceSteps == 0">
|
|
|
|
|
<div class="left-content">
|
|
|
|
|
<div class="item-title">实例名称</div>
|
|
|
|
|
<a-input style="margin-bottom: 12px;" class="item-input" v-model:value="name" placeholder="请输入的字段不得超过20字" />
|
|
|
|
|
<div class="item-title">设置封面</div>
|
|
|
|
|
<div class="instance-image-item-div">
|
|
|
|
|
<div class="default-image-div">
|
|
|
|
|
<div class="default-image"></div>
|
|
|
|
|
<div class="default-title-div">默认</div>
|
|
|
|
|
</div>
|
|
|
|
|
<div class="select-image-div" @click="changeSelectImageModal(true)">
|
|
|
|
|
<div style="padding-top: 26px;" v-if="cover == ''">
|
|
|
|
|
<div class="select-image-icon"></div>
|
|
|
|
|
<div style="margin-top: 9px;" class="select-image-span">支持JPG、PNG格式</div>
|
|
|
|
|
<div class="select-image-span">推荐尺寸300*200</div>
|
|
|
|
|
</div>
|
|
|
|
|
<img v-else class="show-image" :src="`${VITE_GLOB_API_URL}/${cover}`" @click="changeSelectImageModal(true)"/>
|
|
|
|
|
<div class="select-title-div">本地上传</div>
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
<div class="select-image-div" @click="changeSelectImageModal(true)">
|
|
|
|
|
<div class="select-image-icon"></div>
|
|
|
|
|
<div style="margin-top: 9px;" class="select-image-span">支持JPG、PNG格式</div>
|
|
|
|
|
<div class="select-image-span">推荐尺寸300*200</div>
|
|
|
|
|
<div class="select-title-div">本地上传</div>
|
|
|
|
|
<div class="item-title">显示文案</div>
|
|
|
|
|
<a-input style="margin-bottom: 17px;" class="item-input" v-model:value="displayScheme" placeholder="请输入的字段不得超过20字" />
|
|
|
|
|
</div>
|
|
|
|
|
<div class="right-content">
|
|
|
|
|
<div class="item-title">实例描述</div>
|
|
|
|
|
<a-input style="margin-bottom: 12px;" class="item-input" v-model:value="description" placeholder="请输入的字段不得超过200字" />
|
|
|
|
|
<div class="item-title">显示颜色</div>
|
|
|
|
|
<div class="select-item-color-div">
|
|
|
|
|
<div :style="`background: ${item.value}`" :class="`color-item ${displayColor == item.value? 'select-color-item': ''}`" v-for="item in colorOptions" @click="changeSelectColor(item.value)"></div>
|
|
|
|
|
</div>
|
|
|
|
|
<div class="item-title">关联事件</div>
|
|
|
|
|
<a-select
|
|
|
|
|
class="item-select"
|
|
|
|
|
v-model:value="selectEvents"
|
|
|
|
|
:options="selectEventsOptions"
|
|
|
|
|
/>
|
|
|
|
|
</div>
|
|
|
|
|
<div class="item-title">显示文案</div>
|
|
|
|
|
<a-input style="margin-bottom: 17px;" class="item-input" v-model:value="instanceDescription" placeholder="请输入的字段不得超过20字" />
|
|
|
|
|
</div>
|
|
|
|
|
<div class="right-content">
|
|
|
|
|
<div class="item-title">实例描述</div>
|
|
|
|
|
<a-input style="margin-bottom: 12px;" class="item-input" v-model:value="instanceDescription" placeholder="请输入的字段不得超过200字" />
|
|
|
|
|
<div class="item-title">显示颜色</div>
|
|
|
|
|
<div class="select-item-color-div">
|
|
|
|
|
<div :style="`background: ${item.value}`" class="color-item" v-for="item in colorOptions"></div>
|
|
|
|
|
</div>
|
|
|
|
|
<div class="item-title">关联事件</div>
|
|
|
|
|
<div class="step1-info-div" v-if="instanceSteps == 1">
|
|
|
|
|
<div class="item-title">AI算法</div>
|
|
|
|
|
<a-select
|
|
|
|
|
class="item-select"
|
|
|
|
|
v-model:value="selectEvents"
|
|
|
|
|
:options="selectEventsOptions"
|
|
|
|
|
style="margin-bottom: 6px;"
|
|
|
|
|
class="item-select item-multiple-select"
|
|
|
|
|
mode="multiple"
|
|
|
|
|
v-model:value="algoIdsList"
|
|
|
|
|
:options="props.algorithmOptions"
|
|
|
|
|
@change="changeSelectAlgorithm"
|
|
|
|
|
/>
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
<div class="step1-info-div" v-if="instanceSteps == 1">
|
|
|
|
|
<div class="item-title">AI算法</div>
|
|
|
|
|
<a-select
|
|
|
|
|
style="margin-bottom: 6px;"
|
|
|
|
|
class="item-select item-multiple-select"
|
|
|
|
|
mode="multiple"
|
|
|
|
|
v-model:value="selectAlgorithm"
|
|
|
|
|
:options="selectAlgorithmOptions"
|
|
|
|
|
/>
|
|
|
|
|
<div style="display: flex;justify-content: space-between;align-items: center;" class="item-title">
|
|
|
|
|
识别标签
|
|
|
|
|
<div class="tag-list-button">
|
|
|
|
|
<div class="select-all-button">全选</div>
|
|
|
|
|
<div class="clear-button">清空</div>
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
<div class="tag-show-list-div">
|
|
|
|
|
<div class="list-title">
|
|
|
|
|
<div>算法</div>
|
|
|
|
|
<div>名称</div>
|
|
|
|
|
<div>枚举值</div>
|
|
|
|
|
<div>颜色</div>
|
|
|
|
|
<div>置信度</div>
|
|
|
|
|
</div>
|
|
|
|
|
<div class="tag-list-content">
|
|
|
|
|
<div class="list-item" v-for="value in 10">
|
|
|
|
|
<a-checkbox class="item-checkbox"></a-checkbox>
|
|
|
|
|
<div style="width: 72px;margin-right: 60px;" class="item-span">高速排水沟水沟水沟</div>
|
|
|
|
|
<div style="width: 72px;margin-right: 60px;" class="item-span">高速排水沟水沟水沟</div>
|
|
|
|
|
<div style="width: 72px;margin-right: 64px;" class="item-span">0</div>
|
|
|
|
|
<div class="item-color"></div>
|
|
|
|
|
<div class="item-believe">0.75</div>
|
|
|
|
|
<div style="display: flex;justify-content: space-between;align-items: center;" class="item-title">
|
|
|
|
|
识别标签
|
|
|
|
|
<div class="tag-list-button">
|
|
|
|
|
<div class="select-all-button" @click="selectAllTagsShow">全选</div>
|
|
|
|
|
<div class="clear-button" @click="clearAllTagsSelect">清空</div>
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
<div class="item-title">画面识别区域</div>
|
|
|
|
|
<div class="identify-setting">
|
|
|
|
|
<div class="identify-setting-item" style="margin-right: 207px;">
|
|
|
|
|
<div class="item-label">水平方向</div>
|
|
|
|
|
<div class="item-value">
|
|
|
|
|
<a-input class="identify-setting-input" />
|
|
|
|
|
<div class="identify-setting-input-icon">%</div>
|
|
|
|
|
<div class="tag-show-list-div">
|
|
|
|
|
<div class="list-title">
|
|
|
|
|
<div>算法</div>
|
|
|
|
|
<div>名称</div>
|
|
|
|
|
<div>枚举值</div>
|
|
|
|
|
<div>颜色</div>
|
|
|
|
|
<div>置信度</div>
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
<div class="identify-setting-item">
|
|
|
|
|
<div class="item-label">垂直方向</div>
|
|
|
|
|
<div class="item-value">
|
|
|
|
|
<a-input class="identify-setting-input" />
|
|
|
|
|
<div class="identify-setting-input-icon">%</div>
|
|
|
|
|
<div class="tag-list-content">
|
|
|
|
|
<div class="list-item" v-for="item in tagsShowList">
|
|
|
|
|
<a-checkbox class="item-checkbox" :checked="tagsList.includes(item.id)" @click="changeChecked(item.id)"></a-checkbox>
|
|
|
|
|
<div style="width: 72px;margin-right: 60px;" class="item-span">{{item.pName}}</div>
|
|
|
|
|
<div style="width: 72px;margin-right: 60px;" class="item-span">{{item.name}}</div>
|
|
|
|
|
<div style="width: 72px;margin-right: 64px;" class="item-span">{{ item.enumValue }}</div>
|
|
|
|
|
<div class="item-color"></div>
|
|
|
|
|
<div class="item-believe">{{ item.reliability }}</div>
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
<div class="item-title">
|
|
|
|
|
空间约束
|
|
|
|
|
<a-switch v-model:checked="spaceConstraints" style="margin-left: 21px;" />
|
|
|
|
|
</div>
|
|
|
|
|
<div class="space-constraints-setting">
|
|
|
|
|
<div class="setting-hint">
|
|
|
|
|
开启后,识别对象需要在制定区域内才生效,该区域需要在算法实例开启时设置。可用于非法人员闯入,疑似非法盗采等场景。
|
|
|
|
|
</div>
|
|
|
|
|
<div class="setting-content" v-if="spaceConstraints">
|
|
|
|
|
<div class="setting-item">
|
|
|
|
|
<div class="item-label">外扩距离</div>
|
|
|
|
|
<div class="item-title">画面识别区域</div>
|
|
|
|
|
<div class="identify-setting">
|
|
|
|
|
<div class="identify-setting-item" style="margin-right: 207px;">
|
|
|
|
|
<div class="item-label">水平方向</div>
|
|
|
|
|
<div class="item-value">
|
|
|
|
|
<a-input class="setting-input" />
|
|
|
|
|
<div class="setting-input-icon">米</div>
|
|
|
|
|
<a-input class="identify-setting-input" v-model:value="recognitionX"/>
|
|
|
|
|
<div class="identify-setting-input-icon">%</div>
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
<div class="item-title">
|
|
|
|
|
时间约束
|
|
|
|
|
<a-switch v-model:checked="timeConstraints" style="margin-left: 21px;" />
|
|
|
|
|
</div>
|
|
|
|
|
<div class="time-constraints-setting">
|
|
|
|
|
<div class="setting-hint">开启后,仅在设置时间内开启AI识别。</div>
|
|
|
|
|
<div class="setting-content">
|
|
|
|
|
<div class="time-constraints-setting-item">
|
|
|
|
|
<div class="time-constraints-item-label">有效时段</div>
|
|
|
|
|
<div style="margin-right: 16px;" class="time-constraints-item-value">
|
|
|
|
|
<a-time-picker :bordered="false" placeholder="开始时间"/>
|
|
|
|
|
</div>
|
|
|
|
|
<div style="margin-right: 13px;display: flex;align-items: center;">-</div>
|
|
|
|
|
<div class="time-constraints-item-value">
|
|
|
|
|
<a-time-picker :bordered="false" placeholder="结束时间"/>
|
|
|
|
|
<div class="identify-setting-item">
|
|
|
|
|
<div class="item-label">垂直方向</div>
|
|
|
|
|
<div class="item-value">
|
|
|
|
|
<a-input class="identify-setting-input" v-model:value="recognitionY"/>
|
|
|
|
|
<div class="identify-setting-input-icon">%</div>
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
<div class="step2-info-div" v-if="instanceSteps == 2">
|
|
|
|
|
<div class="step2-title">飞行速度</div>
|
|
|
|
|
<div class="step2-setting-div">
|
|
|
|
|
<div class="step2-hint">取值范围:1m/s-20m/s,飞行速度过快会导致画面模糊,无法识别到对象。</div>
|
|
|
|
|
<div class="step2-setting-content">
|
|
|
|
|
<div class="step2-input-div step2-first-input">
|
|
|
|
|
<a-input class="step2-input"/>
|
|
|
|
|
<div class="step2-input-icon">m/s</div>
|
|
|
|
|
<div class="item-title">
|
|
|
|
|
空间约束
|
|
|
|
|
<a-switch :checked="spaceConstraint == 1" style="margin-left: 21px;" @click="changeConstraint('spaceConstraint')"/>
|
|
|
|
|
</div>
|
|
|
|
|
<div class="space-constraints-setting">
|
|
|
|
|
<div class="setting-hint">
|
|
|
|
|
开启后,识别对象需要在制定区域内才生效,该区域需要在算法实例开启时设置。可用于非法人员闯入,疑似非法盗采等场景。
|
|
|
|
|
</div>
|
|
|
|
|
<div class="step2-input-interval">-</div>
|
|
|
|
|
<div class="step2-input-div">
|
|
|
|
|
<a-input class="step2-input"/>
|
|
|
|
|
<div class="step2-input-icon">m/s</div>
|
|
|
|
|
<div class="setting-content" v-if="spaceConstraint == 1">
|
|
|
|
|
<div class="setting-item">
|
|
|
|
|
<div class="item-label">外扩距离</div>
|
|
|
|
|
<div class="item-value">
|
|
|
|
|
<a-input class="setting-input" v-model:value="expansionDistance"/>
|
|
|
|
|
<div class="setting-input-icon">米</div>
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
<div class="step2-title">云台俯仰角</div>
|
|
|
|
|
<div class="step2-setting-div">
|
|
|
|
|
<div class="step2-hint">取值范围:0~-90°,俯仰角决定对象在画面中的角度。</div>
|
|
|
|
|
<div class="step2-setting-content">
|
|
|
|
|
<div class="step2-input-div step2-first-input">
|
|
|
|
|
<a-input class="step2-input"/>
|
|
|
|
|
<div class="step2-input-icon">°</div>
|
|
|
|
|
</div>
|
|
|
|
|
<div class="step2-input-interval">-</div>
|
|
|
|
|
<div class="step2-input-div">
|
|
|
|
|
<a-input class="step2-input"/>
|
|
|
|
|
<div class="step2-input-icon">°</div>
|
|
|
|
|
<div class="item-title">
|
|
|
|
|
时间约束
|
|
|
|
|
<a-switch :checked="temporalConstraints == 1" style="margin-left: 21px;" @click="changeConstraint('temporalConstraints')"/>
|
|
|
|
|
</div>
|
|
|
|
|
<div class="time-constraints-setting">
|
|
|
|
|
<div class="setting-hint">开启后,仅在设置时间内开启AI识别。</div>
|
|
|
|
|
<div class="setting-content" v-if="temporalConstraints == 1">
|
|
|
|
|
<div class="time-constraints-setting-item">
|
|
|
|
|
<div class="time-constraints-item-label">有效时段</div>
|
|
|
|
|
<div style="margin-right: 16px;" class="time-constraints-item-value">
|
|
|
|
|
<a-time-picker :bordered="false" placeholder="开始时间" v-model:value="tcStartTime" value-format="HH:mm:ss"/>
|
|
|
|
|
</div>
|
|
|
|
|
<div style="margin-right: 13px;display: flex;align-items: center;">-</div>
|
|
|
|
|
<div class="time-constraints-item-value">
|
|
|
|
|
<a-time-picker :bordered="false" placeholder="结束时间" v-model:value="tcEndTime" value-format="HH:mm:ss"/>
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
<div class="step2-title">识别对象画面占比</div>
|
|
|
|
|
<div class="step2-setting-div">
|
|
|
|
|
<div class="step2-hint">识别对象画面占比比例直接影响识别的准确率,实际需要
|
|
|
|
|
结合航高、变焦倍率保证识别对象在画面中的占比。</div>
|
|
|
|
|
<div class="step2-setting-content">
|
|
|
|
|
<div class="step2-input-div step2-first-input">
|
|
|
|
|
<a-input class="step2-input"/>
|
|
|
|
|
<div class="step2-input-icon">%</div>
|
|
|
|
|
<div class="step2-info-div" v-if="instanceSteps == 2">
|
|
|
|
|
<div class="step2-title">飞行速度</div>
|
|
|
|
|
<div class="step2-setting-div">
|
|
|
|
|
<div class="step2-hint">取值范围:1m/s-20m/s,飞行速度过快会导致画面模糊,无法识别到对象。</div>
|
|
|
|
|
<div class="step2-setting-content">
|
|
|
|
|
<div class="step2-input-div step2-first-input">
|
|
|
|
|
<a-input class="step2-input" v-model:value="flySpeedFirst"/>
|
|
|
|
|
<div class="step2-input-icon">m/s</div>
|
|
|
|
|
</div>
|
|
|
|
|
<div class="step2-input-interval">-</div>
|
|
|
|
|
<div class="step2-input-div">
|
|
|
|
|
<a-input class="step2-input" v-model:value="flySpeedLast"/>
|
|
|
|
|
<div class="step2-input-icon">m/s</div>
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
<div class="step2-title">云台俯仰角</div>
|
|
|
|
|
<div class="step2-setting-div">
|
|
|
|
|
<div class="step2-hint">取值范围:0~-90°,俯仰角决定对象在画面中的角度。</div>
|
|
|
|
|
<div class="step2-setting-content">
|
|
|
|
|
<div class="step2-input-div step2-first-input">
|
|
|
|
|
<a-input class="step2-input" v-model:value="gimbalPitchDegreeFirst"/>
|
|
|
|
|
<div class="step2-input-icon">°</div>
|
|
|
|
|
</div>
|
|
|
|
|
<div class="step2-input-interval">-</div>
|
|
|
|
|
<div class="step2-input-div">
|
|
|
|
|
<a-input class="step2-input" v-model:value="gimbalPitchDegreeLast"/>
|
|
|
|
|
<div class="step2-input-icon">°</div>
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
<div class="step2-input-interval">-</div>
|
|
|
|
|
<div class="step2-input-div">
|
|
|
|
|
<a-input class="step2-input"/>
|
|
|
|
|
<div class="step2-input-icon">%</div>
|
|
|
|
|
</div>
|
|
|
|
|
<div class="step2-title">识别对象画面占比</div>
|
|
|
|
|
<div class="step2-setting-div">
|
|
|
|
|
<div class="step2-hint">识别对象画面占比比例直接影响识别的准确率,实际需要
|
|
|
|
|
结合航高、变焦倍率保证识别对象在画面中的占比。</div>
|
|
|
|
|
<div class="step2-setting-content">
|
|
|
|
|
<div class="step2-input-div step2-first-input">
|
|
|
|
|
<a-input class="step2-input" v-model:value="recognitionCoverageFirst"/>
|
|
|
|
|
<div class="step2-input-icon">%</div>
|
|
|
|
|
</div>
|
|
|
|
|
<div class="step2-input-interval">-</div>
|
|
|
|
|
<div class="step2-input-div">
|
|
|
|
|
<a-input class="step2-input" v-model:value="recognitionCoverageLast"/>
|
|
|
|
|
<div class="step2-input-icon">%</div>
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
<div class="interval"></div>
|
|
|
|
|
<div class="footer-div">
|
|
|
|
|
<a-button class="cancel-button" @click="emits('changeAddModal',false)">取消</a-button>
|
|
|
|
|
<a-button v-if="instanceSteps != 0" style="margin-right: 14px;" type="primary" class="next-button" @click="last">上一步</a-button>
|
|
|
|
|
<a-button v-if="instanceSteps != 2" type="primary" class="next-button" @click="next">下一步</a-button>
|
|
|
|
|
<a-button v-if="instanceSteps == 2" type="primary" class="next-button" @click="submit">确定</a-button>
|
|
|
|
|
</div>
|
|
|
|
|
<div class="interval"></div>
|
|
|
|
|
<div class="footer-div">
|
|
|
|
|
<a-button class="cancel-button" @click="emits('changeAddModal',false)">取消</a-button>
|
|
|
|
|
<a-button v-if="instanceSteps != 0" style="margin-right: 14px;" type="primary" class="next-button" @click="last">上一步</a-button>
|
|
|
|
|
<a-button v-if="instanceSteps != 2" type="primary" class="next-button" @click="next">下一步</a-button>
|
|
|
|
|
<a-button v-if="instanceSteps == 2" type="primary" class="next-button" @click="submit">确定</a-button>
|
|
|
|
|
</div>
|
|
|
|
|
</a-spin>
|
|
|
|
|
<a-modal v-model:open="selectImageModal" title="选择封面" width="1000px" :footer="null" :destroyOnClose="true">
|
|
|
|
|
<SelectImageModal @changeSelectImageModal="changeSelectImageModal"/>
|
|
|
|
|
<SelectImageModal @changeSelectImageModal="changeSelectImageModal" @getResultImage="getResultImage"/>
|
|
|
|
|
</a-modal>
|
|
|
|
|
</template>
|
|
|
|
|
|
|
|
|
|
<script setup lang="ts">
|
|
|
|
|
import { ref, h, defineEmits, defineProps } from "vue"
|
|
|
|
|
import { ref, h, defineEmits, defineProps, onMounted } from "vue"
|
|
|
|
|
import SelectImageModal from "@/views/demo/resourcemanagement/ailist/SelectImageModal.vue";
|
|
|
|
|
const emits = defineEmits(['changeAddModal'])
|
|
|
|
|
import { ModelLabelsType } from '@/views/demo/resourcemanagement/ailist/utils'
|
|
|
|
|
import { getAppEnvConfig } from '@/utils/env';
|
|
|
|
|
import { AddAlgoInstance, UpdateAlgoInstance } from '@/api/demo/aiinstance'
|
|
|
|
|
import { message } from "ant-design-vue";
|
|
|
|
|
import dayjs from "dayjs";
|
|
|
|
|
const { VITE_GLOB_API_URL } = getAppEnvConfig();
|
|
|
|
|
const props = defineProps(['algorithmOptions','modalType','showInfoData'])
|
|
|
|
|
const emits = defineEmits(['changeAddModal','query'])
|
|
|
|
|
|
|
|
|
|
onMounted(() => {
|
|
|
|
|
if(props.modalType == 'update'){
|
|
|
|
|
id.value = props.showInfoData.id
|
|
|
|
|
name.value = props.showInfoData.name
|
|
|
|
|
cover.value = props.showInfoData.cover
|
|
|
|
|
displayScheme.value = props.showInfoData.displayScheme
|
|
|
|
|
description.value = props.showInfoData.description
|
|
|
|
|
displayColor.value = props.showInfoData.displayColor
|
|
|
|
|
algoIdsList.value = props.showInfoData.algoIds.split(',')
|
|
|
|
|
changeSelectAlgorithm(algoIdsList.value)
|
|
|
|
|
tagsList.value = props.showInfoData.tags.split(',')
|
|
|
|
|
recognitionX.value = props.showInfoData.recognitionX
|
|
|
|
|
recognitionY.value = props.showInfoData.recognitionY
|
|
|
|
|
spaceConstraint.value = props.showInfoData.spaceConstraint
|
|
|
|
|
expansionDistance.value = props.showInfoData.expansionDistance
|
|
|
|
|
temporalConstraints.value = props.showInfoData.temporalConstraints
|
|
|
|
|
tcStartTime.value = dayjs(props.showInfoData.tcStartTime)
|
|
|
|
|
tcEndTime.value = dayjs(props.showInfoData.tcEndTime)
|
|
|
|
|
flySpeedFirst.value = props.showInfoData.flySpeed?.split('~')[0] || ''
|
|
|
|
|
flySpeedLast.value = props.showInfoData.flySpeed.split('~')[1] || ''
|
|
|
|
|
gimbalPitchDegreeFirst.value = props.showInfoData.gimbalPitchDegree?.split('~')[0] || ''
|
|
|
|
|
gimbalPitchDegreeLast.value = props.showInfoData.gimbalPitchDegree.split('~')[1] || ''
|
|
|
|
|
recognitionCoverageFirst.value = props.showInfoData.recognitionCoverage?.split('~')[0] || ''
|
|
|
|
|
recognitionCoverageLast.value = props.showInfoData.recognitionCoverage.split('~')[1] || ''
|
|
|
|
|
}
|
|
|
|
|
})
|
|
|
|
|
const instanceSteps = ref(0)
|
|
|
|
|
const instanceName = ref('')
|
|
|
|
|
const instanceDescription = ref('')
|
|
|
|
|
const loading = ref(false)
|
|
|
|
|
const id = ref('')
|
|
|
|
|
const name = ref('')
|
|
|
|
|
const cover = ref('')
|
|
|
|
|
const displayScheme = ref('')
|
|
|
|
|
const description = ref('')
|
|
|
|
|
const displayColor = ref('')
|
|
|
|
|
const selectEvents = ref('')
|
|
|
|
|
const selectAlgorithm = ref()
|
|
|
|
|
const spaceConstraints = ref(false)
|
|
|
|
|
const timeConstraints = ref(false)
|
|
|
|
|
const algoIdsList = ref()
|
|
|
|
|
const tagsShowList = ref<ModelLabelsType[]>([])
|
|
|
|
|
const tagsList = ref<string[]>([])
|
|
|
|
|
const recognitionX = ref('')
|
|
|
|
|
const recognitionY = ref('')
|
|
|
|
|
const spaceConstraint = ref(0)
|
|
|
|
|
const expansionDistance = ref('')
|
|
|
|
|
const temporalConstraints = ref(0)
|
|
|
|
|
const tcStartTime = ref('')
|
|
|
|
|
const tcEndTime = ref('')
|
|
|
|
|
const flySpeedFirst = ref('')
|
|
|
|
|
const flySpeedLast = ref('')
|
|
|
|
|
const gimbalPitchDegreeFirst = ref('')
|
|
|
|
|
const gimbalPitchDegreeLast = ref('')
|
|
|
|
|
const recognitionCoverageFirst = ref('')
|
|
|
|
|
const recognitionCoverageLast = ref('')
|
|
|
|
|
const selectImageModal = ref(false)
|
|
|
|
|
const selectEventsOptions = ref([
|
|
|
|
|
{ label: 'aaa', value: 'aaa' }
|
|
|
|
|
])
|
|
|
|
|
const selectAlgorithmOptions = ref([
|
|
|
|
|
{ label: 'bbb', value: 'bbb' },
|
|
|
|
|
{ label: 'ccc', value: 'ccc' }
|
|
|
|
|
])
|
|
|
|
|
const items = ref([
|
|
|
|
|
{ title: '基础信息', },
|
|
|
|
|
{ title: '配置算法', },
|
|
|
|
@ -251,11 +305,92 @@ const last = () => {
|
|
|
|
|
instanceSteps.value --
|
|
|
|
|
}
|
|
|
|
|
const submit = () => {
|
|
|
|
|
|
|
|
|
|
loading.value = true
|
|
|
|
|
let params = {
|
|
|
|
|
id: id.value,
|
|
|
|
|
name: name.value,
|
|
|
|
|
cover: cover.value,
|
|
|
|
|
displayScheme: displayScheme.value,
|
|
|
|
|
description: description.value,
|
|
|
|
|
displayColor: displayColor.value,
|
|
|
|
|
recognitionX: recognitionX.value,
|
|
|
|
|
recognitionY: recognitionY.value,
|
|
|
|
|
spaceConstraint: spaceConstraint.value,
|
|
|
|
|
expansionDistance: expansionDistance.value,
|
|
|
|
|
temporalConstraints: temporalConstraints.value,
|
|
|
|
|
tcStartTime: tcStartTime.value,
|
|
|
|
|
tcEndTime: tcEndTime.value,
|
|
|
|
|
flySpeed: `${flySpeedFirst.value}~${flySpeedLast.value}`,
|
|
|
|
|
gimbalPitchDegree: `${gimbalPitchDegreeFirst.value}~${gimbalPitchDegreeLast.value}`,
|
|
|
|
|
recognitionCoverage: `${recognitionCoverageFirst.value}~${recognitionCoverageLast.value}`,
|
|
|
|
|
tags: tagsList.value.join(','),
|
|
|
|
|
algoIds: algoIdsList.value.join(','),
|
|
|
|
|
}
|
|
|
|
|
console.log('params',params)
|
|
|
|
|
if(props.modalType == 'insert'){
|
|
|
|
|
AddAlgoInstance(params).then(res => {
|
|
|
|
|
console.log(res)
|
|
|
|
|
message.success('算法实例创建成功')
|
|
|
|
|
emits('query')
|
|
|
|
|
emits('changeAddModal',false)
|
|
|
|
|
}).finally(() => {
|
|
|
|
|
loading.value = false
|
|
|
|
|
})
|
|
|
|
|
}else{
|
|
|
|
|
UpdateAlgoInstance(params).then(res => {
|
|
|
|
|
console.log(res)
|
|
|
|
|
message.success('算法实例编辑成功')
|
|
|
|
|
emits('query')
|
|
|
|
|
emits('changeAddModal',false)
|
|
|
|
|
}).finally(() => {
|
|
|
|
|
loading.value = false
|
|
|
|
|
})
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
const changeSelectImageModal = (type: boolean) => {
|
|
|
|
|
selectImageModal.value = type
|
|
|
|
|
}
|
|
|
|
|
const getResultImage = (url: string) => {
|
|
|
|
|
cover.value = url
|
|
|
|
|
}
|
|
|
|
|
const changeSelectColor = (color) => {
|
|
|
|
|
displayColor.value = color
|
|
|
|
|
}
|
|
|
|
|
const changeSelectAlgorithm = (e:string[]) => {
|
|
|
|
|
console.log(e)
|
|
|
|
|
let selectAlgorithmOptions = props.algorithmOptions.filter(item => e.includes(item.value))
|
|
|
|
|
let list:ModelLabelsType[] = []
|
|
|
|
|
selectAlgorithmOptions.forEach(item => {
|
|
|
|
|
item.modelLabels.forEach(itemChild => {
|
|
|
|
|
list.push({...itemChild,pName:item.label})
|
|
|
|
|
})
|
|
|
|
|
})
|
|
|
|
|
tagsShowList.value = list
|
|
|
|
|
console.log('tagsShowList',tagsShowList.value)
|
|
|
|
|
}
|
|
|
|
|
const changeChecked = (id) => {
|
|
|
|
|
if(tagsList.value.includes(id)){
|
|
|
|
|
tagsList.value = tagsList.value.filter(item => item !== id)
|
|
|
|
|
}else{
|
|
|
|
|
tagsList.value.push(id)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
const changeConstraint = (type) => {
|
|
|
|
|
switch(type){
|
|
|
|
|
case 'spaceConstraint':
|
|
|
|
|
spaceConstraint.value = spaceConstraint.value == 1? 0: 1
|
|
|
|
|
break
|
|
|
|
|
case 'temporalConstraints':
|
|
|
|
|
temporalConstraints.value = temporalConstraints.value == 1? 0: 1
|
|
|
|
|
break
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
const selectAllTagsShow = () => {
|
|
|
|
|
tagsList.value = tagsShowList.value.map(item => item.id)
|
|
|
|
|
}
|
|
|
|
|
const clearAllTagsSelect = () => {
|
|
|
|
|
tagsList.value = []
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
</script>
|
|
|
|
|
|
|
|
|
@ -470,7 +605,7 @@ const changeSelectImageModal = (type: boolean) => {
|
|
|
|
|
background: #F5F5F5;
|
|
|
|
|
box-shadow: 0px 10px 30px 0px rgba(0,0,6,0.15);
|
|
|
|
|
border: 2px dashed rgba(28,29,34,0.08);
|
|
|
|
|
padding-top: 26px;
|
|
|
|
|
// padding-top: 26px;
|
|
|
|
|
cursor: pointer;
|
|
|
|
|
.select-image-icon{
|
|
|
|
|
width: 36px;
|
|
|
|
@ -507,6 +642,10 @@ const changeSelectImageModal = (type: boolean) => {
|
|
|
|
|
align-items: center;
|
|
|
|
|
justify-content: center;
|
|
|
|
|
}
|
|
|
|
|
.show-image{
|
|
|
|
|
width: 169px;
|
|
|
|
|
height: 151px;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
@ -529,6 +668,10 @@ const changeSelectImageModal = (type: boolean) => {
|
|
|
|
|
box-shadow: 0px 10px 30px 0px rgba(0,0,6,0.15), 0px 8px 6px 0px rgba(0,0,0,0.06);
|
|
|
|
|
// border: 1px solid #FFFFFF;
|
|
|
|
|
border-radius: 50%;
|
|
|
|
|
cursor: pointer;
|
|
|
|
|
}
|
|
|
|
|
.select-color-item{
|
|
|
|
|
border: 1px solid;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|