Browse Source

fix: 拍照功能和工艺等待

master
guoapeng 2 months ago
parent
commit
bb7e265335
  1. 5
      src/apis/home.ts
  2. 2
      src/apis/ore.ts
  3. 2
      src/components/common/FTTable/index.vue
  4. 26
      src/components/craft/AddCraft/index.vue
  5. 62
      src/components/home/Photo/index.vue
  6. 182
      src/components/home/SavePhoto/index.vue
  7. 3
      src/router/index.ts
  8. 2
      src/router/routes.ts
  9. 2
      src/stores/systemStore.ts
  10. 142
      src/views/home/index.vue
  11. 168
      src/views/ore/index.vue
  12. 3
      src/views/solution/index.vue
  13. 55
      src/views/taskLog/index.vue

5
src/apis/home.ts

@ -11,3 +11,8 @@ export const getTaskIng = (): Promise<null> => http.get(`${baseUrl}getIngTask`)
export const delTask = (params: string): Promise<null> => http.delete(`${baseUrl}${params}`)
export const trayIn = (): Promise<null> => http.post('tray/in')
export const trayOut = (): Promise<null> => http.post('tray/out')
export const photoList = (params: System.Page): Promise<null> => http.get('/photo/list', { params })
export const takePhoto = (params?: { lightIntensity: number | null }): Promise<string> => http.post('/photo/take', params)
export const savePhoto = (params: any): Promise<null> => http.post('/photo/save', params)
export const getPhoto = (id: number): Promise<string> => http.get(`/photo/id=${id}`)
export const delPhoto = (ids: string): Promise<string> => http.delete(`/photo/ids=${ids}`)

2
src/apis/ore.ts

@ -1,6 +1,6 @@
import http from 'libs/http'
export const getOreList = (): Promise<System.PageResponse<Ore.OreItem>> => http.get(`/ores/list`)
export const getOreList = (params: System.Page = { pageNum: 1, pageSize: 999 }): Promise<System.PageResponse<Ore.OreItem>> => http.get(`/ores/list`, { params })
export const saveOre = (params: { name: string }): Promise<null> => http.post(`/ores`, params)

2
src/components/common/FTTable/index.vue

@ -176,7 +176,7 @@ defineExpose({
</el-table>
</div>
<div v-if="hasPage" class="table-page">
<el-pagination v-model:current-page="state.filterObj.pageNum" v-model:page-size="state.filterObj.pageSize" size="small" background layout="sizes, prev, pager, next" :total="state.dataTotal" @change="initData" />
<el-pagination v-model:current-page="state.filterObj.pageNum" v-model:page-size="state.filterObj.pageSize" size="small" background layout="sizes, prev, pager, next, total" :total="state.dataTotal" @change="initData" />
</div>
</div>
</template>

26
src/components/craft/AddCraft/index.vue

@ -81,7 +81,7 @@ const okHandle = async () => {
})
}
if (['startHeating', 'shaking'].includes(step.method)) {
if (['startHeating', 'shaking', 'delay'].includes(step.method)) {
if (step.params.minutes || step.params.seconds) {
step.params.second = (step.params.minutes || 0) * 60 + (step.params.seconds || 0) || undefined
}
@ -102,11 +102,14 @@ const okHandle = async () => {
case 'shaking':
step.params.description = `摇匀: ${step.params.second}`
break
case 'delay':
step.params.description = `等待: ${step.params.second}`
break
case 'takePhoto':
step.params.description = `拍照`
break
}
return !allPropertiesDefined(step.params, ['minutes', 'seconds', 'coolingMinutes', 'coolingSeconds', 'description', 'inTemperature'])
return !allPropertiesDefined(step.params, ['minutes', 'seconds', 'coolingMinutes', 'coolingSeconds', 'description', 'inTemperature', 'expand'])
},
)
@ -144,6 +147,7 @@ const stepMap: Record<string, CraftTypes.StepItem> = {
startHeating: { name: '加热', method: 'startHeating', params: { temperature: undefined, second: undefined, description: undefined, minutes: undefined, seconds: undefined } },
shaking: { name: '摇匀', method: 'shaking', params: { second: undefined } },
takePhoto: { name: '拍照', method: 'takePhoto', params: { } },
delay: { name: '等待', method: 'delay', params: { second: undefined } },
}
const addStep = (data: CraftTypes.StepItem) => {
@ -168,9 +172,9 @@ const addLiquidRules = {
const addLiquidFormRef = ref()
const activeTube = ref(Array.from({ length: 16 }).fill(false))
const activeTube = ref(Array.from({ length: 16 }).fill(true))
const selectVisible = ref(false)
const selectVisible = ref(true)
const checkChange = () => {
activeTube.value = Array.from({ length: 16 }).fill(selectVisible.value)
addLiquidForm.value.tubeNums = activeTube.value.map((item, index) => index + 1).filter(item => activeTube.value[item - 1])
@ -193,6 +197,8 @@ const mousedownHandle = async (e: Event) => {
}
const addHandle = async () => {
addLiquidForm.value.tubeNums = activeTube.value.map((item, index) => index + 1).filter(item => activeTube.value[item - 1])
addLiquidFormRef.value.validateField('tubeNums')
try {
const valid = await addLiquidFormRef.value.validate()
if (!valid) {
@ -233,8 +239,8 @@ const addHandle = async () => {
],
}
activeTube.value = Array.from({ length: 16 }).fill(false)
selectVisible.value = false
activeTube.value = Array.from({ length: 16 }).fill(true)
selectVisible.value = true
addLiquidFormRef.value.resetFields()
}
catch (error) {
@ -357,12 +363,12 @@ const addHandle = async () => {
<div v-if="form.stepList?.length" class="step-box">
<div v-for="(item, index) in form.stepList" :key="index" class="step-item">
<el-form-item :label="`${index + 1}: ${item.name}`">
<div v-if="item.method === 'addLiquid'" class="list-box" :class="{ 'list-box-fold': item.params.fold }">
<div v-if="item.method === 'addLiquid'" class="list-box" :class="{ 'list-box-fold': !item.params.expand }">
<div style="display: flex; justify-content: flex-end;font-size: 18px;padding: 5px;color: #1989fa">
<el-icon v-if="item.params.fold" @click="item.params.fold = false">
<el-icon v-if="!item.params.expand" @click="item.params.expand = true">
<ArrowRightBold />
</el-icon>
<el-icon v-else @click="item.params.fold = true">
<el-icon v-else @click="item.params.expand = false">
<ArrowDownBold />
</el-icon>
</div>
@ -440,7 +446,7 @@ const addHandle = async () => {
<span class="unit-text"></span>
</div>
</div>
<template v-else-if="['shaking'].includes(item.method)">
<template v-else-if="['shaking', 'delay'].includes(item.method)">
<el-select v-model="item.params.minutes" style="width: 70px" clearable size="small" placeholder="请选择">
<el-option v-for="i in 60" :key="i" :label="i" :value="i" />
</el-select>

62
src/components/home/Photo/index.vue

@ -0,0 +1,62 @@
<script setup lang="ts">
import { getPhoto } from 'apis/home'
import FtButton from 'components/common/FTButton/index.vue'
import { onMounted, ref } from 'vue'
const props = defineProps({
id: {
type: Number,
default: 0,
},
})
const emits = defineEmits(['cancel'])
const data = ref<any>({})
onMounted(async () => {
data.value = await getPhoto(props.id)
})
const cancel = () => {
emits('cancel')
}
</script>
<template>
<FtDialog visible title="查看照片" width="40%">
<el-image
:src="data.url"
:zoom-rate="1.2"
:max-scale="7"
:min-scale="0.2"
:preview-src-list="[data.url]"
>
<template #error>
<div class="image-slot">
<el-icon><Picture /></el-icon>
</div>
</template>
</el-image>
<template #footer>
<FtButton @click="cancel">
关闭
</FtButton>
</template>
</FtDialog>
</template>
<style scoped lang="scss">
.el-image {
width: 100%;
height: 200px;
}
.image-slot {
display: flex;
justify-content: center;
align-items: center;
width: 100%;
height: 100%;
background: var(--el-fill-color-light);
color: var(--el-text-color-secondary);
font-size: 30px;
}
</style>

182
src/components/home/SavePhoto/index.vue

@ -0,0 +1,182 @@
<script setup lang="ts">
import { savePhoto } from 'apis/home'
import { getOreList } from 'apis/ore'
import { FtMessage } from 'libs/message'
import { onMounted, ref } from 'vue'
const props = defineProps({
url: {
type: String,
default: '',
},
})
const emits = defineEmits(['ok', 'cancel'])
const oreList = ref<Ore.OreItem[]>([])
onMounted(async () => {
oreList.value = (await getOreList()).list
})
const form = ref<any>({
problemList: [],
})
const formRef = ref()
const rules = {
oreId: [
{ required: true, message: '请选择矿石', trigger: 'change' },
],
}
const okHandle = async () => {
try {
const valid = await formRef.value.validate()
if (!valid) {
return
}
const params = {
...form.value,
fileName: props.url.split('/').at(-1),
problem: form.value.problemList.join(','),
}
await savePhoto(params)
FtMessage.success('保存成功')
emits('ok')
}
catch (e) {
console.log(e)
}
}
const cancel = () => {
emits('cancel')
}
const mousedownHandle = async (e: Event) => {
let event
if ('touches' in e) {
event = (e.touches as TouchList)[0]
}
else {
event = e
}
if (event.target!.classList!.contains('tube-inner')) {
const num = event.target!.getAttribute('index')
activeTube.value[Number(num) - 1] = !activeTube.value[Number(num) - 1]
form.value.problemList = activeTube.value.map((item, index) => index + 1).filter(item => activeTube.value[item - 1])
}
}
const activeTube = ref(Array.from({ length: 16 }).fill(false))
</script>
<template>
<FtDialog visible title="保存照片" width="40%" :ok-handle="okHandle" @cancel="cancel">
<el-form ref="formRef" :model="form" :rules="rules" label-width="auto">
<el-form-item label="问题试管">
<div class="tube-box">
<div class="tube-item" @click.prevent="mousedownHandle" @touch.prevent="mousedownHandle">
<span v-for="item in 16" :key="item" class="tube-inner" :class="{ 'tube-inner-active': activeTube[item - 1] }" :index="item" />
</div>
<el-image
:src="url"
:zoom-rate="1.2"
:max-scale="7"
:min-scale="0.2"
:preview-src-list="[url]"
>
<template #error>
<div class="image-slot">
<el-icon><Picture /></el-icon>
</div>
</template>
</el-image>
</div>
</el-form-item>
<el-form-item label="选择矿石" prop="oreId">
<el-select v-model="form.oreId" placeholder="请选择矿石">
<el-option v-for="item in oreList" :key="item.id" :label="item.oresName" :value="item.id" />
</el-select>
</el-form-item>
<el-form-item label="备注" prop="remarks">
<el-input v-model="form.remarks" type="textarea" placeholder="请输入备注">
<template #append>
mL
</template>
</el-input>
</el-form-item>
</el-form>
</FtDialog>
</template>
<style scoped lang="scss">
.el-tag {
margin-right: 5px;
}
.el-row {
height: 320px;
.el-col {
height: 100%;
overflow: auto;
:deep(.el-tag) {
width: 100%;
margin-bottom: 5px;
.el-tag__content {
display: flex;
width: 100%;
justify-content: space-between;
}
}
}
}
.tube-box {
display: flex;
align-items: center;
justify-content: space-between;
.el-image {
width: 50%;
height: 140px;
}
.tube-item {
padding: 5px;
background: #384D5D;
border-radius: 10px;
display: grid;
grid-template-columns: repeat(4, 1fr);
grid-template-rows: repeat(4, 1fr);
grid-gap: 5px;
position: relative;
.tube-disable {
position: absolute;
width: 100%;
height: 100%;
top: 0;
left: 0;
background: rgba(255,255,255,0.9);
border-radius: 9px;
}
.tube-inner {
display: inline-block;
width: 25px;
height: 25px;
border-radius: 50%;
background: #fff;
margin: 2px;
transition: background 0.5s;
}
.tube-inner-active {
background: #26D574;
}
}
}
.image-slot {
display: flex;
justify-content: center;
align-items: center;
width: 100%;
height: 100%;
background: var(--el-fill-color-light);
color: var(--el-text-color-secondary);
font-size: 30px;
}
</style>

3
src/router/index.ts

@ -1,5 +1,4 @@
import type { NavigationGuardNext, RouteLocationNormalized } from 'vue-router'
import { getToken } from '@/libs/token'
import { useSystemStore } from 'stores/systemStore'
import { createRouter, createWebHashHistory } from 'vue-router'
import routes from './routes'
@ -11,7 +10,7 @@ const router = createRouter({
router.beforeEach((to: RouteLocationNormalized, from: RouteLocationNormalized, next: NavigationGuardNext) => {
const systemStore = useSystemStore()
if (getToken() && (systemStore.systemStatus.currentUser?.username)) {
if (systemStore.systemStatus.currentUser?.username) {
if (to.name === 'login') {
next({ name: from.name })
}

2
src/router/routes.ts

@ -48,7 +48,7 @@ const authRoutes: RouteRecordRaw[] = [
component: () => import('views/taskLog/index.vue'),
meta: {
isDefault: true,
title: '实验记录',
title: '拍照记录',
icon: n_expe,
activeIcon: s_expe,
},

2
src/stores/systemStore.ts

@ -261,5 +261,5 @@ export const useSystemStore = defineStore('system', {
})
},
},
persist: import.meta.env.FT_NODE_ENV === 'prod',
persist: true,
})

142
src/views/home/index.vue

@ -1,7 +1,8 @@
<script setup lang="ts">
import { stopTask, trayIn, trayOut } from 'apis/home'
import { takePhoto, trayIn, trayOut } from 'apis/home'
import AddLiquid from 'components/home/AddLiquid/index.vue'
import FillSolution from 'components/home/FillSolution/index.vue'
import Photo from 'components/home/SavePhoto/index.vue'
import SelectCraft from 'components/home/SelectCraft/index.vue'
import SetTemperature from 'components/home/SetTemperature/index.vue'
import StartExperiment from 'components/home/StartExperiment/index.vue'
@ -40,22 +41,22 @@ const receiveMessage = (data: Socket.cmdData) => {
const startVisible = ref(false)
const startExperimentHandle = () => {
if (systemStore.systemStatus.currentTasks) {
FtMessage.error('当前有实验正在进行')
return
}
startVisible.value = true
}
const stopExperimentHandle = async () => {
if (!systemStore.systemStatus.currentTasks) {
FtMessage.error('当前没有实验正在进行')
return
}
await stopTask()
FtMessage.success('实验已停止')
}
// const startExperimentHandle = () => {
// if (systemStore.systemStatus.currentTasks) {
// FtMessage.error('')
// return
// }
// startVisible.value = true
// }
//
// const stopExperimentHandle = async () => {
// if (!systemStore.systemStatus.currentTasks) {
// FtMessage.error('')
// return
// }
// await stopTask()
// FtMessage.success('')
// }
const selectCraftVisible = ref(false)
const selectCraft = async () => {
@ -295,17 +296,6 @@ const shake_stop = async () => {
await homeStore.sendControl(params)
}
const take_photo = async () => {
currentCommandId = Date.now().toString()
const params = {
commandId: currentCommandId,
command: 'take_photo',
params: {
},
}
await homeStore.sendControl(params)
}
const trayInHandle = async () => {
await trayIn()
FtMessage.success('设置放入托盘成功')
@ -319,6 +309,23 @@ const trayOutHandle = async () => {
const warmUpStart = async () => {
setTemperatureVisible.value = true
}
const lightVisible = ref(false)
const lightNum = ref(0)
const photoUrl = ref('')
const take_photo = async () => {
const params = {
lightIntensity: lightVisible.value ? lightNum.value : null,
}
photoUrl.value = await takePhoto(params)
}
const photoVisible = ref(false)
const savePhoto = () => {
photoVisible.value = true
}
</script>
<template>
@ -332,9 +339,40 @@ const warmUpStart = async () => {
<el-col :span="9">
<div class="page-right">
<div class="top">
<div class="photo" @click="take_photo">
<el-icon><Camera /></el-icon>
<span>拍照</span>
<div class="image-box">
<el-image
:src="photoUrl"
:zoom-rate="1.2"
:max-scale="7"
:min-scale="0.2"
:preview-src-list="[photoUrl]"
>
<template #error>
<div class="image-slot">
<el-icon><Picture /></el-icon>
</div>
</template>
</el-image>
</div>
<div class="photo">
<el-popover placement="top" trigger="click">
<template #reference>
<div style="display: flex;align-items: center;">
<el-checkbox v-model="lightVisible" style="color: #fff;" />
<span style="margin:0 5px">补光灯</span>
</div>
</template>
<span>亮度: </span>
<el-slider v-model="lightNum" />
</el-popover>
<ft-button type="primary" :click-handle="take_photo">
拍照
</ft-button>
<ft-button v-if="photoUrl" type="primary" :click-handle="savePhoto">
保存
</ft-button>
</div>
</div>
<div class="button-box">
@ -350,22 +388,10 @@ const warmUpStart = async () => {
</ft-button>
</el-col>
<el-col :span="8">
<ft-button size="large" @click="startExperimentHandle">
开始实验
</ft-button>
</el-col>
</el-row>
<el-row :gutter="10">
<el-col :span="16">
<ft-button size="large" style="width: 100%" :click-handle="selectCraft">
执行工艺
</ft-button>
</el-col>
<el-col :span="8">
<ft-button size="large" :click-handle="stopExperimentHandle">
停止实验
</ft-button>
</el-col>
</el-row>
<el-row :gutter="10">
<el-col :span="8">
@ -458,6 +484,7 @@ const warmUpStart = async () => {
</el-row>
<StartExperiment v-if="startVisible" @ok="startVisible = false" @cancel="startVisible = false" />
<Photo v-if="photoVisible" :url="photoUrl" @ok="photoVisible = false" @cancel="photoVisible = false" />
<SelectCraft v-if="selectCraftVisible" @ok="selectCraftVisible = false" @cancel="selectCraftVisible = false" />
<SetTemperature v-if="setTemperatureVisible" @ok="setTemperatureVisible = false" @cancel="setTemperatureVisible = false" />
<StartHeat v-if="startHeatVisible" @ok="startHeatVisible = false" @cancel="startHeatVisible = false" />
@ -493,26 +520,33 @@ const warmUpStart = async () => {
flex-direction: column;
height: 100%;
.top {
height: 30%;
height: 40%;
background: #4D6882;
//border: 1px solid #4D6882;
position: relative;
border-radius: 8px;
overflow: hidden;
.image-box {
width: 100%;
height: calc(100% - 40px);
position: relative;
}
.el-image {
width: 100%;
height:100%
}
.photo {
width: 100%;
height: 40px;
background: rgba(0, 0, 0, 0.3);
position: absolute;
bottom: 0;
display: flex;
justify-content: center;
align-items: center;
color: #fff;
font-size: 15px;
}
}
.button-box {
height: 70%;
height: 60%;
display: flex;
flex-direction: column;
justify-content: flex-end;
@ -542,4 +576,14 @@ const warmUpStart = async () => {
}
}
.image-slot {
display: flex;
justify-content: center;
align-items: center;
width: 100%;
height: 100%;
background: var(--el-fill-color-light);
color: var(--el-text-color-secondary);
font-size: 30px;
}
</style>

168
src/views/ore/index.vue

@ -1,62 +1,29 @@
<script lang="ts" setup>
import { delOre, editOre, getOreList, saveOre } from '@/apis/ore'
import { ElMessage, ElMessageBox } from 'element-plus'
import { onMounted, ref, watch } from 'vue'
import { useRoute, useRouter } from 'vue-router'
import { ElMessage, ElMessageBox, ElTag } from 'element-plus'
import { h, ref } from 'vue'
import { useRoute } from 'vue-router'
onMounted(() => {
queryOresList()
})
const tableData = ref<Ore.OreItem[]>([])
const visible = ref(false)
const oreForm = ref()
const name = ref()
const loading = ref(false)
const selectedList = ref<Ore.OreItem[]>([])
const showCraftCommponent = ref(false)
const showCraftComponent = ref(false)
const router = useRouter()
const route = useRoute()
const queryOresList = () => {
getOreList().then((res) => {
if (res && res.list) {
tableData.value = res.list
}
})
}
watch(() => route.path, (newVal) => {
if (newVal === '/ore') {
queryOresList()
}
})
const onSelectionChange = (rows: Ore.OreItem[]) => {
selectedList.value = rows
}
const onAddOre = () => {
visible.value = true
}
const onEditOre = () => {
if (!selectedList.value.length) {
ElMessage.warning('请选择要编辑的数据')
return
}
if (selectedList.value.length !== 1) {
ElMessage.warning('只能编辑一条数据')
return
}
const editItem = selectedList.value[0]
const onEditOre = (data: any) => {
const editItem = data[0]
oreForm.value = { ...editItem }
name.value = editItem.oresName
visible.value = true
}
const onDelOre = () => {
if (!selectedList.value.length) {
ElMessage.warning('请选择要删除的数据')
return
}
const onDelOre = (data: any) => {
ElMessageBox.confirm(
'确认删除选中的数据吗?',
'确认提示',
@ -66,10 +33,10 @@ const onDelOre = () => {
type: 'warning',
},
).then(() => {
const ids = selectedList.value.map(item => item.id)
const ids = data.map((item: any) => item.id)
delOre(ids.join(',')).then(() => {
ElMessage.success('删除成功')
queryOresList()
tableRef.value.initData()
})
})
}
@ -102,24 +69,83 @@ const onConfirm = () => {
visible.value = false
name.value = ''
oreForm.value = {}
queryOresList()
tableRef.value.initData()
}).catch((e) => {
console.error('操作失败==', e)
loading.value = true
})
}
const onShowCraft = () => {
if (!selectedList.value.length) {
ElMessage.warning('请选择要查看的数据')
return
}
if (selectedList.value.length !== 1) {
ElMessage.warning('只能查看一条数据的工艺')
return
}
const editItem = selectedList.value[0]
showCraftCommponent.value = true
const tableRef = ref()
const btnList = [
{
name: '新增',
type: 'primary',
serverUrl: 'add',
serverCondition: 0,
},
{
name: '编辑',
type: 'primary',
serverUrl: 'edit',
serverCondition: 1,
},
{
name: '查看工艺',
type: 'primary',
serverUrl: 'showCraft',
serverCondition: 1,
},
{
name: '删除',
type: 'danger',
serverUrl: 'del',
serverCondition: 2,
},
]
const columns = [
{
type: 'selection',
},
{
title: '矿石名称',
key: 'oresName',
width: 100,
},
{
title: '工艺',
render: (row: any) => {
return h(
'div',
{
type: 'primary',
},
row.craftsList?.map((item: any) => {
return h(
ElTag,
{
type: 'primary',
style: {
marginRight: '5px',
},
},
{ default: () => item.name },
)
}),
)
},
},
{
title: '创建时间',
key: 'createTime',
width: 180,
},
]
const showCraft = (data: any) => {
const editItem = data[0]
showCraftComponent.value = true
router.push({
path: '/ore/craft',
query: { oreId: editItem.id },
@ -132,39 +158,7 @@ const onShowCraft = () => {
<router-view />
</div>
<div v-else>
<div>
<FtButton type="primary" @click="onAddOre">
添加矿石
</FtButton>
<FtButton type="primary" @click="onEditOre">
编辑矿石
</FtButton>
<FtButton @click="onDelOre">
删除矿石
</FtButton>
<FtButton @click="onShowCraft">
查看工艺
</FtButton>
</div>
<div>
<el-table :data="tableData" stripe style="width: 100%" @selection-change="onSelectionChange">
<el-table-column type="selection" width="55" />
<el-table-column type="index" width="50" />
<el-table-column prop="oresName" label="矿石名称" />
<el-table-column prop="craftNames" label="工艺名称">
<template #default="scoped">
<div class="craft-tag">
<el-tag v-for="item in scoped.row.craftsList" :key="item.id" type="info" style="margin-left: 5px;">
{{ item.name }}
</el-tag>
</div>
</template>
</el-table-column>
<el-table-column prop="createTime" label="创建时间" />
<el-table-column prop="updateTime" label="更新时间" />
</el-table>
<!-- <FtTable :columns="columns" has-header :btn-list="btnList" :get-data-fn="queryOresList" /> -->
</div>
<FtTable ref="tableRef" has-header has-page :columns="columns" :btn-list="btnList" :get-data-fn="getOreList" @show-craft="showCraft" @add="onAddOre" @edit="onEditOre" @del="onDelOre" />
<FtDialog v-model="visible" title="添加矿石" width="30%" :ok-handle="onConfirm" @cancel="closeDialog">
<div class="add-content">
<label>矿石名称</label>

3
src/views/solution/index.vue

@ -49,9 +49,6 @@ const columns = [
type: 'selection',
},
{
type: 'index',
},
{
title: '溶液名称',
key: 'name',
},

55
src/views/taskLog/index.vue

@ -1,16 +1,17 @@
<script setup lang="ts">
import { delTask, taskList } from 'apis/home'
import { ElMessageBox, ElTag } from 'element-plus'
import { delPhoto, photoList } from 'apis/home'
import Photo from 'components/home/Photo/index.vue'
import { ElMessageBox } from 'element-plus'
import { FtMessage } from 'libs/message'
import { h, useTemplateRef } from 'vue'
import { ref, useTemplateRef } from 'vue'
const searchList = [
const btnList = [
{
title: '实验名称',
key: 'name',
name: '查看照片',
type: 'primary',
serverUrl: 'edit',
serverCondition: 1,
},
]
const btnList = [
{
name: '删除',
type: 'danger',
@ -23,30 +24,20 @@ const columns = [
type: 'selection',
},
{
title: '实验名称',
key: 'name',
title: '模式',
key: 'mode',
},
{
title: '开始时间',
key: 'startTime',
title: '矿石名称',
key: 'oreName',
},
{
title: '结束时间',
key: 'endTime',
title: '工艺名称',
key: 'craftsName',
},
{
title: '状态',
key: 'status',
width: 120,
render: (row: any) => {
return h(
ElTag,
{
type: row.status === 1 ? 'primary' : 'success',
},
{ default: () => row.status === 1 ? '执行中' : '执行完毕' },
)
},
title: '创建时间',
key: 'createTime',
},
]
@ -59,19 +50,23 @@ const del = async (selectedRows: any) => {
cancelButtonText: '取消',
type: 'warning',
})
await delTask(ids)
await delPhoto(ids)
FtMessage.success('删除成功')
tableRef.value?.initData()
}
const rowClickHandle = (data: Task.Task) => {
console.log(data)
const id = ref(0)
const photoVisible = ref(false)
const edit = (selectedRows: any) => {
id.value = selectedRows[0].id
photoVisible.value = true
}
</script>
<template>
<div>
<FtTable ref="tableRef" has-header has-page :columns="columns" :btn-list="btnList" :search-list="searchList" :get-data-fn="taskList" @del="del" @row-click="rowClickHandle" />
<FtTable ref="tableRef" has-header has-page :columns="columns" :btn-list="btnList" :get-data-fn="photoList" @edit="edit" @del="del" />
<Photo v-if="photoVisible" :id @cancel="photoVisible = false" />
</div>
</template>

Loading…
Cancel
Save