4 changed files with 407 additions and 5 deletions
-
391src/components/log/sprayParams/index.vue
-
8src/components/martixCraft/Edit/index.vue
-
6src/components/spray/sprayParams/index.vue
-
7src/views/log/index.vue
@ -0,0 +1,391 @@ |
|||
<script setup lang="ts"> |
|||
import { list as listMatrix } from 'apis/matrix' |
|||
import { getCraftById, list } from 'apis/matrixCraft' |
|||
import route from 'assets/images/route.png' |
|||
import route_active from 'assets/images/route_active.png' |
|||
import route_horizontal_active from 'assets/images/route_horizontal2.png' |
|||
import route_horizontal from 'assets/images/route_horizontal.png' |
|||
import route_vertical_active from 'assets/images/route_vertical2.png' |
|||
import route_vertical from 'assets/images/route_vertical.png' |
|||
import FtDialog from 'components/common/FTDialog/index.vue' |
|||
import TrayGraph from 'components/spray/trayGraph/index.vue' |
|||
import { FtMessage } from 'libs/message' |
|||
import { cloneDeep } from 'lodash' |
|||
import { Navigation, Pagination } from 'swiper/modules' |
|||
import { Swiper, SwiperSlide } from 'swiper/vue' |
|||
import { nextTick, onMounted, ref } from 'vue' |
|||
import 'swiper/css' |
|||
import 'swiper/css/pagination' |
|||
import 'swiper/css/navigation' |
|||
|
|||
const props = defineProps({ |
|||
formData: { |
|||
type: Array, |
|||
default: () => [], |
|||
}, |
|||
}) |
|||
const emits = defineEmits(['ok', 'cancel']) |
|||
const matrixList = ref<{ id: number, name: string }[]>([]) |
|||
const matrixCraftList = ref<{ id: number, name: string }[]>([]) |
|||
|
|||
const getMatrixList = async () => { |
|||
const res = await listMatrix({ pageNum: 1, pageSize: 1000, matrixName: '' }) |
|||
matrixList.value = res.list |
|||
} |
|||
|
|||
const getMatrixCraftList = async () => { |
|||
const res = await list({ pageNum: 1, pageSize: 10000 }) |
|||
matrixCraftList.value = res.list |
|||
} |
|||
|
|||
const loading = ref(false) |
|||
const slideIndex = ref(props.formData[0]?.index || 0) |
|||
onMounted(async () => { |
|||
loading.value = true |
|||
form.value = cloneDeep(props.formData[0]) |
|||
console.log(form.value) |
|||
await nextTick(() => { |
|||
form.value.times?.forEach((item: any, index: number) => { |
|||
sprayRefs.value[index].updateSelection(item.x1 * 5, item.y1 * 5, (item.x2 - item.x1) * 5, (item.y2 - item.y1) * 5) |
|||
}) |
|||
}) |
|||
await getMatrixList() |
|||
await getMatrixCraftList() |
|||
setTimeout(() => loading.value = false, 500) |
|||
}) |
|||
|
|||
const form = ref<any>({}) |
|||
|
|||
const formRef = ref() |
|||
|
|||
const okLoading = ref(false) |
|||
const okHandle = () => { |
|||
formRef.value.validate(async (valid: any, err: any) => { |
|||
if (!valid) { |
|||
const keys = Object.keys(err).filter((item: string) => item.split('.').length === 3).map((item: string) => Number(item.split('.')[1])).sort((a, b) => a - b) |
|||
if (keys.length) { |
|||
activeTab.value = keys[0] |
|||
swiperInstance?.slideTo(activeTab.value) |
|||
} |
|||
return |
|||
} |
|||
try { |
|||
okLoading.value = true |
|||
form.value.times = form.value.times.map((item: any, index: number) => { |
|||
return { |
|||
...item, |
|||
...sprayRefs.value[index].getSelection(), |
|||
} |
|||
}) |
|||
FtMessage.success('设置成功') |
|||
emits('ok', form.value) |
|||
} |
|||
catch (e) { |
|||
console.log(e) |
|||
} |
|||
}) |
|||
} |
|||
|
|||
const cancel = () => { |
|||
emits('cancel') |
|||
} |
|||
|
|||
const sprayRefs = ref<any>([]) |
|||
|
|||
const activeTab = ref(0) |
|||
|
|||
const matrixCraftChange = async (id: number) => { |
|||
loading.value = true |
|||
form.value = await getCraftById(id) |
|||
console.log(form.value) |
|||
await nextTick(() => { |
|||
form.value.times?.forEach((item: any, index: number) => { |
|||
sprayRefs.value[index].updateSelection(item.x1 * 5, item.y1 * 5, (item.x2 - item.x1) * 5, (item.y2 - item.y1) * 5) |
|||
}) |
|||
loading.value = false |
|||
}) |
|||
} |
|||
|
|||
const onSlideChange = (swiper: any) => { |
|||
activeTab.value = swiper.activeIndex |
|||
} |
|||
|
|||
let swiperInstance: any = null |
|||
const onSwiperInitialized = (swiper: any) => { |
|||
swiperInstance = swiper |
|||
} |
|||
|
|||
const tabChangeHandle = () => { |
|||
swiperInstance?.slideTo(activeTab.value) |
|||
} |
|||
|
|||
const slideChangeHandle = async () => { |
|||
form.value = cloneDeep(props.formData.find(item => item.index === slideIndex.value)) |
|||
await nextTick(() => { |
|||
form.value.times?.forEach((item: any, index: number) => { |
|||
sprayRefs.value[index].updateSelection(item.x1 * 5, item.y1 * 5, (item.x2 - item.x1) * 5, (item.y2 - item.y1) * 5) |
|||
}) |
|||
}) |
|||
} |
|||
</script> |
|||
|
|||
<template> |
|||
<FtDialog |
|||
visible |
|||
:loading="loading" |
|||
:ok-loading="okLoading" |
|||
title="喷涂参数" |
|||
width="80%" |
|||
:ok-handle="okHandle" |
|||
@cancel="cancel" |
|||
> |
|||
<el-form ref="formRef" label-width="120" :model="form"> |
|||
<el-row> |
|||
<el-col :span="8"> |
|||
<el-select v-model="slideIndex" :disabled="false" @change="slideChangeHandle"> |
|||
<el-option v-for="item in formData" :key="item.index" :label="`玻片${item.index + 1}`" :value="item.index" /> |
|||
</el-select> |
|||
</el-col> |
|||
<el-col :span="8"> |
|||
<el-form-item label="选择工艺" prop="name"> |
|||
<el-select v-model="form.id" disabled placeholder="选择工艺" @change="matrixCraftChange"> |
|||
<el-option v-for="craft in matrixCraftList" :key="craft.id" :label="craft.name" :value="craft.id" /> |
|||
</el-select> |
|||
</el-form-item> |
|||
</el-col> |
|||
<el-col :span="8"> |
|||
<el-form-item label="基质" prop="matrixId" :rules="[{ required: true, message: '请选择基质', trigger: 'change' }]"> |
|||
<el-select v-model="form.matrixId" disabled placeholder=""> |
|||
<el-option v-for="matrix in matrixList" :key="matrix.id" :label="matrix.name" :value="matrix.id" /> |
|||
</el-select> |
|||
</el-form-item> |
|||
</el-col> |
|||
</el-row> |
|||
<el-tabs v-model="activeTab" type="card" @tab-change="tabChangeHandle"> |
|||
<el-tab-pane v-for="(item, index) in form.times" :key="index" :label="`第${index + 1}次`" :name="index" /> |
|||
</el-tabs> |
|||
<Swiper |
|||
:modules="[Pagination, Navigation]" |
|||
:pagination="{ clickable: true }" |
|||
:navigation="true" |
|||
@swiper="onSwiperInitialized" |
|||
@slide-change="onSlideChange" |
|||
> |
|||
<SwiperSlide v-for="(item, index) in form.times" :key="index"> |
|||
<div class="tab-content"> |
|||
<TrayGraph ref="sprayRefs" :key="index" :edit-select="false" :container="`spray-params-${index + 1}`" select /> |
|||
<div class="content-form"> |
|||
<el-form-item label="喷涂路线"> |
|||
<div class="route-img"> |
|||
<img |
|||
style="margin-left: 20px" |
|||
:src="item.matrixPathType === 'horizontal' ? route_horizontal_active : route_horizontal" |
|||
alt="" |
|||
@click="item.matrixPathType = 'horizontal'" |
|||
> |
|||
<img |
|||
style="margin: 0 20px" |
|||
:src="item.matrixPathType === 'vertical' ? route_vertical_active : route_vertical" |
|||
alt="" |
|||
@click="item.matrixPathType = 'vertical'" |
|||
> |
|||
<img |
|||
:src="item.matrixPathType === 'grid' ? route_active : route" |
|||
alt="" |
|||
@click="item.matrixPathType = 'grid'" |
|||
> |
|||
</div> |
|||
</el-form-item> |
|||
<el-form-item |
|||
label="Z轴高度" |
|||
:prop="`times.${index}.motorZHeight`" |
|||
:rules="[ |
|||
{ |
|||
required: true, |
|||
trigger: 'blur', |
|||
validator: (rule: any, value: any, callback: any) => { |
|||
if (!value) { |
|||
callback(new Error('请输入z轴高度')); |
|||
} |
|||
else |
|||
if (value < 15) { |
|||
callback(new Error('最小安全高度为15mm')); |
|||
} |
|||
else { |
|||
callback(); |
|||
} |
|||
}, |
|||
}, |
|||
]" |
|||
> |
|||
<el-input v-model="item.motorZHeight" disabled type="number" /> |
|||
<span class="unit-text">mm</span> |
|||
</el-form-item> |
|||
<el-form-item |
|||
label="氮气气压" |
|||
:prop="`times.${index}.gasPressure`" |
|||
:rules="[{ required: true, message: '请输入氮气气压', trigger: 'blur' }]" |
|||
> |
|||
<el-input v-model="item.gasPressure" disabled type="number" /> |
|||
<span class="unit-text">Mpa</span> |
|||
</el-form-item> |
|||
<el-form-item |
|||
label="基质流速" |
|||
:prop="`times.${index}.volume`" |
|||
:rules="[{ required: true, message: '请输入基质流速', trigger: 'blur' }]" |
|||
> |
|||
<el-input v-model="item.volume" disabled type="number" /> |
|||
<span class="unit-text">uL/min</span> |
|||
</el-form-item> |
|||
<el-form-item |
|||
label="是否加电" |
|||
:prop="`times.${index}.highVoltageValue`" |
|||
:rules="[ |
|||
{ |
|||
required: true, |
|||
trigger: 'blur', |
|||
validator: (rule: any, value: any, callback: any) => { |
|||
if (item.highVoltage && !value) { |
|||
callback(new Error('请输入电压')); |
|||
} |
|||
else if (value > 6000) { |
|||
callback(new Error('最大电压为6000V')); |
|||
} |
|||
else { |
|||
callback(); |
|||
} |
|||
}, |
|||
}, |
|||
]" |
|||
> |
|||
<div class="voltage-box"> |
|||
<el-switch v-model="item.highVoltage" disabled /> |
|||
<el-input |
|||
v-show="item.highVoltage" |
|||
v-model="item.highVoltageValue" |
|||
disabled |
|||
type="number" |
|||
class="voltage-input" |
|||
/> |
|||
<span v-show="item.highVoltage" class="unit-text"> V</span> |
|||
</div> |
|||
</el-form-item> |
|||
<el-form-item |
|||
label="移动速度" |
|||
:prop="`times.${index}.movingSpeed`" |
|||
:rules="[{ required: true, message: '请输入移动速度', trigger: 'blur' }]" |
|||
> |
|||
<el-input v-model="item.movingSpeed" disabled type="number" /> |
|||
<span class="unit-text">mm/s</span> |
|||
</el-form-item> |
|||
<el-form-item |
|||
label="间距" |
|||
:prop="`times.${index}.spacing`" |
|||
:rules="[{ required: true, message: '请输入间距', trigger: 'blur' }]" |
|||
> |
|||
<el-input v-model="item.spacing" disabled type="number" /> |
|||
<span class="unit-text">mm</span> |
|||
</el-form-item> |
|||
<el-form-item |
|||
label="等待时间" |
|||
:prop="`times.${index}.delay`" |
|||
:rules="[{ required: true, message: '请输入等待时间', trigger: 'blur' }]" |
|||
> |
|||
<el-input v-model="item.delay" disabled type="number" /> |
|||
<span class="unit-text">s</span> |
|||
</el-form-item> |
|||
<el-form-item |
|||
v-if="item.matrixPathType === 'grid'" |
|||
label="中间等待时间" |
|||
:prop="`times.${index}.gridDelay`" |
|||
:rules="[{ required: true, message: '请输入等待时间', trigger: 'blur' }]" |
|||
> |
|||
<el-input v-model="item.gridDelay" disabled type="number" /> |
|||
<span class="unit-text">s</span> |
|||
</el-form-item> |
|||
</div> |
|||
</div> |
|||
</SwiperSlide> |
|||
</Swiper> |
|||
</el-form> |
|||
<template #footer> |
|||
<ft-button @click="cancel"> |
|||
关闭 |
|||
</ft-button> |
|||
</template> |
|||
</FtDialog> |
|||
</template> |
|||
|
|||
<style scoped lang="scss"> |
|||
.el-select { |
|||
width: 70%; |
|||
margin: 0 30px; |
|||
} |
|||
.el-input { |
|||
width: 70%; |
|||
margin: 0 30px; |
|||
} |
|||
.unit-text { |
|||
font-size: 40px; |
|||
color: #0349a8; |
|||
font-weight: 500; |
|||
margin-left: 20px; |
|||
} |
|||
.select-box { |
|||
display: flex; |
|||
margin: 40px; |
|||
} |
|||
.route-img { |
|||
display: flex; |
|||
height: 80px; |
|||
width: 50%; |
|||
justify-content: space-evenly; |
|||
img { |
|||
height: 100%; |
|||
} |
|||
} |
|||
|
|||
.voltage-box { |
|||
display: flex; |
|||
align-items: center; |
|||
height: 80px; |
|||
margin-left: 40px; |
|||
.voltage-input { |
|||
width: 470px; |
|||
} |
|||
} |
|||
.tab-content { |
|||
display: flex; |
|||
justify-content: space-evenly; |
|||
align-items: center; |
|||
} |
|||
.el-form-item { |
|||
margin-bottom: 55px; |
|||
} |
|||
:deep(.el-form-item__error) { |
|||
margin-left: 40px; |
|||
margin-top: 5px; |
|||
font-size: 25px; |
|||
} |
|||
:deep(.swiper-pagination-bullet) { |
|||
width: 20px; |
|||
height: 20px; |
|||
} |
|||
:deep(.el-tabs) { |
|||
.el-tabs__header { |
|||
.el-tabs__nav-wrap { |
|||
.el-tabs__nav-scroll { |
|||
.el-tabs__nav { |
|||
.el-tabs__item { |
|||
padding: 0 40px; |
|||
} |
|||
.el-tabs__item.is-active { |
|||
background: #2b6dea; |
|||
color: #fff; |
|||
} |
|||
} |
|||
} |
|||
} |
|||
} |
|||
} |
|||
</style> |
Write
Preview
Loading…
Cancel
Save
Reference in new issue