Files
SoonWorkerD/src/renderer/views/dashboard/index.vue
T
2025-04-09 12:13:26 +08:00

1760 lines
59 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<template>
<div class="container_box" v-loading="serviceLoading" :element-loading-text="serviceText" element-loading-spinner="el-icon-loading" element-loading-background="rgba(0, 0, 0, 0.8)">
<!-- 头部 -->
<div class="flex_box flex_row_between top_box">
<div class="flex_box top_left">
<div @click="showWork" class="flex_box flex_row_center top_btn1">
<img src="@/assets/images/Plus1_icon.png" />
<div>新建作业</div>
</div>
<div @click="openWork" class="flex_box flex_row_center top_btn2">
<img src="@/assets/images/Search_icon.png" />
<div>打开作业文件</div>
</div>
<div @click="goSet('/manage')" class="flex_box flex_row_center top_btn2">
<img src="@/assets/images/Setting_icon.png" />
<div>系统设置</div>
</div>
<div class="top_left_line"></div>
<el-tooltip :content="workStatus ? '关闭服务' : '打开服务'" placement="bottom">
<div class="flex_box flex_row_center top_left_status_box">
<el-switch @change="serviceChange" class="top_left_status" :value="workStatus" active-color="#07C160" inactive-color="#aaa"> </el-switch>
</div>
</el-tooltip>
<div class="flex_box top_left_option">
<div class="top_left_text">完成刻录数:</div>
<div class="top_left_num top_left_num1">{{ taskNum[0] }}</div>
</div>
<div class="flex_box top_left_option">
<div class="top_left_text">废弃刻录数:</div>
<div class="top_left_num top_left_num1">{{ taskNum[1] }}</div>
</div>
<div class="flex_box top_left_option">
<div class="top_left_text">错误:</div>
<div class="top_left_num top_left_num1">{{ taskNum[2] }}</div>
</div>
<div class="top_left_line"></div>
</div>
<div class="flex_box">
<div v-if="printer_info.test_use" class="top_tip">试用版 {{printer_info.test_use}}</div>
<user-info></user-info>
</div>
</div>
<div class="content_body">
<!-- 设备 -->
<div class="flex_box device_box">
<!-- 左侧 -->
<div class="device_left">
<div class="flex_box device_left_top">
<img v-if="!printer_info.cover_flag" class="flex_shrink device_img" :src="printer_info.printer_name?deviceImg[printer_info.printer_name].img1:deviceImg['4200'].img1" />
<img v-else class="flex_shrink device_img" :src="printer_info.printer_name?deviceImg[printer_info.printer_name].img2:deviceImg['4200'].img2" />
<div class="flex_box flex_row_between device_info">
<div class="device_info_box">
<div class="device_info_main" :class="{ device_info_main1: infoStatus === 1 }">
<div class="device_info_item">
<div class="device_info_title">光盘刻录一体机{{ printer_info.printer_name }}</div>
<div class="flex_box flex_row_between device_info_options">
<div v-if="printer_info.strongList[2]" class="device_info_option">
<div class="device_info_option_box">
<img src="@/assets/images/device4.png" />
<div class="device_info_option_cap">
<div
class="device_info_option_cap_box"
:class="{ device_info_option_cap_box1: printer_info.strongList[2].cd_num < deviceImg[printer_info.printer_name || '4200'].num2, device_info_option_cap_box2: printer_info.strongList[2].cd_num < deviceImg[printer_info.printer_name || '4200'].num1 }"
:style="{ height: $accDiv(printer_info.strongList[2].cd_num, 50) * 100 + '%' }"
></div>
</div>
</div>
<div class="flex_box flex_row_center">
<el-dropdown trigger="click" :disabled="currentRunVal !== 6" @command="(e) => handleCommandCD(e, 2)">
<div class="el-dropdown-link flex_box flex_row_center device_info_option_b">
<div class="device_info_option_b_text">{{ printer_info.printer_name === 'SE3' ? '组合' : CDTypes[printer_info.strongList[2].cd_type] }} {{ printer_info.strongList[2].cd_num }}</div>
<i v-if="currentRunVal === 6" class="el-icon-caret-bottom"></i>
</div>
<el-dropdown-menu slot="dropdown">
<el-dropdown-item v-for="(item, index) in CDTypes" :key="index" :command="index"
><span
:style="{ color: index === printer_info.strongList[2].cd_type ? '#409EFF' : '#000', 'font-weight': index === printer_info.strongList[2].cd_type ? '600' : '400' }"
>{{ item }}</span
></el-dropdown-item
>
</el-dropdown-menu>
</el-dropdown>
</div>
</div>
<div v-if="printer_info.strongList[1]" class="device_info_option">
<div class="device_info_option_box">
<img src="@/assets/images/device4.png" />
<div class="device_info_option_cap">
<div
class="device_info_option_cap_box"
:class="{ device_info_option_cap_box1: printer_info.strongList[1].cd_num < deviceImg[printer_info.printer_name || '4200'].num2, device_info_option_cap_box2: printer_info.strongList[1].cd_num < deviceImg[printer_info.printer_name || '4200'].num1 }"
:style="{ height: $accDiv(printer_info.strongList[1].cd_num, 50) * 100 + '%' }"
></div>
</div>
</div>
<div class="flex_box flex_row_center">
<el-dropdown trigger="click" :disabled="currentRunVal !== 6" @command="(e) => handleCommandCD(e, 1)">
<div class="el-dropdown-link flex_box flex_row_center device_info_option_b">
<div class="device_info_option_b_text">{{ printer_info.printer_name === 'SE3' ? '组合' : CDTypes[printer_info.strongList[1].cd_type] }} {{ printer_info.strongList[1].cd_num }}</div>
<i v-if="currentRunVal === 6" class="el-icon-caret-bottom"></i>
</div>
<el-dropdown-menu slot="dropdown">
<el-dropdown-item v-for="(item, index) in CDTypes" :key="index" :command="index"
><span
:style="{ color: index === printer_info.strongList[1].cd_type ? '#409EFF' : '#000', 'font-weight': index === printer_info.strongList[1].cd_type ? '600' : '400' }"
>{{ item }}</span
></el-dropdown-item
>
</el-dropdown-menu>
</el-dropdown>
</div>
</div>
<div class="device_info_option">
<div class="flex_box flex_row_between device_info_option_list">
<div class="device_info_option_item device_info_option_blue">
<div :style="{ height: parseInt(printer_info.blue_last) + '%' }" class="device_info_option_content"></div>
</div>
<div class="device_info_option_item device_info_option_red">
<div :style="{ height: parseInt(printer_info.red_last) + '%' }" class="device_info_option_content"></div>
</div>
<div class="device_info_option_item device_info_option_yellow">
<div :style="{ height: parseInt(printer_info.yellow_last) + '%' }" class="device_info_option_content"></div>
</div>
</div>
<div v-if="!isLast" @click="isLast = true" class="flex_box flex_row_between device_info_option_b">
<div class="device_info_option_b_text device_info_option_b_text1">{{ parseInt(printer_info.blue_last) }}%</div>
<div class="device_info_option_b_text device_info_option_b_text1">{{ parseInt(printer_info.red_last) }}%</div>
<div class="device_info_option_b_text device_info_option_b_text1">{{ parseInt(printer_info.yellow_last) }}%</div>
</div>
<div v-if="isLast" @click="isLast = false" class="flex_box flex_row_center device_info_option_b">
<div class="device_info_option_b_text device_info_option_b_text1">
{{ parseInt($accDiv($accAdd($accAdd(printer_info.blue_last, printer_info.red_last), printer_info.yellow_last), 3)) }}%
</div>
</div>
</div>
</div>
<div class="device_info_sure">
<div v-if="currentRunVal === 6" class="flex_box flex_row_between device_info_sure_box">
<div class="device_info_sure_text">{{ sureText }}</div>
<el-button @click="sureCD" class="device_info_sure_btn" type="primary">确定</el-button>
</div>
</div>
</div>
<div class="device_info_item">
<div class="device_info_text">系统序列号</div>
<div class="device_info_text">主机名{{ printer_info.system_name }}</div>
<div class="device_info_text">主机IP{{ printer_info.system_ip }}</div>
<div class="device_info_text">缓存空间0G共0G</div>
</div>
</div>
</div>
<div class="device_info_right">
<div v-if="infoStatus === 1" @click="infoStatus = 0" class="device_info_right_item">
<img src="@/assets/images/Arrow_right1_icon.png" />
</div>
<div v-if="infoStatus === 0" @click="infoStatus = 1" class="device_info_right_item">
<img src="@/assets/images/Arrow_left1_icon.png" />
</div>
</div>
</div>
</div>
<div
class="flex_box device_status"
:class="{
device_status1: printer_info.printer_status === 'I',
device_status2: printer_info.printer_status === 'B' || printer_info.printer_status === 'P',
device_status3: printer_info.lack_ink || !isConnect || !serviceStatus
}"
>
<div class="device_status_dot"></div>
<div class="device_status_text">{{ runText }}</div>
</div>
<div class="flex_box device_run">
<div class="flex_box device_run_input">
<el-select v-model="runVal" placeholder="请选择">
<el-option v-for="item in runList" :key="item.value" :label="item.label" :value="item.value"> </el-option>
</el-select>
</div>
<el-button @click="handleRun" type="primary" class="device_run_btn">执行</el-button>
</div>
</div>
<!-- 右侧 -->
<div class="device_right">
<div class="flex_box device_right_top">
<div class="flex_box flex_row_between device_right_top_item">
<div class="device_right_top_img">
<img v-if="cd_list[0].cd_status == 4 && cd_list[0].cd_type" src="@/assets/images/device3.png" />
<img v-else src="@/assets/images/device2.png" />
<div class="device_right_top_img_text device_right_top_img_text1" v-if="cd_list[0].cd_status == 4 && cd_list[0].cd_type">{{ CDTypes[cd_list[0].cd_type] }}</div>
<div class="device_right_top_img_text" v-else>{{ diskTypes[cd_list[0].dev_type] }}</div>
</div>
<div class="device_right_top_content">
<div class="device_right_top_title">{{ cd_list[0].dev_path || '' }}({{ $store.state.chat.CDName[cd_list[0].cd_pos] }})</div>
<template v-if="cd_list[0].copy_scheduler > 0">
<div class="flex_box device_right_top_progress">
<div class="device_right_top_progress_box" :style="{ width: cd_list[0].copy_scheduler + '%' }"></div>
</div>
<div class="device_right_top_text">
已刻录{{ $filterSize(cd_list[0].use_size) }}{{ $filterSize(cd_list[0].total_size) }}<span v-if="cd_list[0].burn_speed">速度{{ cd_list[0].burn_speed.toFixed(2) }}X</span>
</div>
</template>
<div class="device_right_top_text">状态{{ $store.state.chat.CDStatus[cd_list[0].cd_status] }}</div>
<div class="device_right_top_text">任务{{ cd_list[0].cd_taskid && cd_list[0].copy_scheduler ? cd_list[0].cd_taskid : '' }}</div>
<div class="device_right_top_text">光盘{{ cd_list[0].cd_assid && cd_list[0].copy_scheduler ? cd_list[0].cd_assid : '' }}</div>
</div>
</div>
<div v-if="cd_list[1]" class="device_right_top_line"></div>
<div v-if="cd_list[1]" class="flex_box flex_row_between device_right_top_item">
<div class="device_right_top_img">
<img v-if="cd_list[1].cd_status == 4 && cd_list[1].cd_type" src="@/assets/images/device3.png" />
<img v-else src="@/assets/images/device2.png" />
<div class="device_right_top_img_text device_right_top_img_text1" v-if="cd_list[1].cd_status == 4 && cd_list[1].cd_type">{{ CDTypes[cd_list[1].cd_type] }}</div>
<div class="device_right_top_img_text" v-else>{{ diskTypes[cd_list[1].dev_type] }}</div>
</div>
<div class="device_right_top_content">
<div class="device_right_top_title">{{ cd_list[1].dev_path || '' }}({{ $store.state.chat.CDName[cd_list[1].cd_pos] }})</div>
<template v-if="cd_list[1].copy_scheduler">
<div class="flex_box device_right_top_progress">
<div class="device_right_top_progress_box" :style="{ width: cd_list[1].copy_scheduler + '%' }"></div>
</div>
<div class="device_right_top_text">
已刻录{{ $filterSize(cd_list[1].use_size) }}{{ $filterSize(cd_list[1].total_size) }}<span v-if="cd_list[1].burn_speed">速度{{ cd_list[1].burn_speed.toFixed(2) }}X</span>
</div>
</template>
<div class="device_right_top_text">状态{{ $store.state.chat.CDStatus[cd_list[1].cd_status] }}</div>
<div class="device_right_top_text">任务{{ cd_list[1].cd_taskid && cd_list[1].copy_scheduler ? cd_list[1].cd_taskid : '' }}</div>
<div class="device_right_top_text">光盘{{ cd_list[1].cd_assid && cd_list[1].copy_scheduler ? cd_list[1].cd_assid : '' }}</div>
</div>
</div>
</div>
<div class="notice_box">
<div class="flex_box flex_row_between notice_top">
<div class="flex_box notice_title">
<img src="@/assets/images/inform1_icon.png" />
<div>动态</div>
</div>
<div @click="noticeChange" class="flex_box notice_all">
<img src="@/assets/images/Calendar_icon.png" />
<div>{{ showAll ? '最新日志' : '全部日志' }}</div>
</div>
</div>
<div class="notice_list">
<template v-if="!showAll">
<div v-for="(item, index) in logList" :key="index" :class="`flex_box flex_row_between notice_item notice_${item.status}`">
<div class="notice_content">
<span>{{ index + 1 }}</span
>[{{ item.status }}]{{ item.text }}
</div>
<div class="notice_time">{{ item.time }}</div>
</div>
</template>
<template v-if="showAll">
<div v-for="(item, index) in allLogList" :key="index" :class="`flex_box flex_row_between notice_item notice_${item.status}`">
<div class="notice_content">
<span>{{ index + 1 }}</span
>[{{ item.status }}]{{ item.text }}
</div>
<div class="notice_time">{{ item.time }}</div>
</div>
</template>
</div>
</div>
</div>
</div>
<!-- 作业队列 -->
<div class="work_box">
<div class="flex_box work_top">
<div class="work_top_text">作业列表</div>
</div>
<el-table row-key="id" default-expand-all class="work_table" :data="task_list" empty-text="暂无作业列表" :tree-props="{ children: 'ass_task', hasChildren: 'hasChildren' }">
<!-- <el-table-column type="index" width="80" label="序号"></el-table-column> -->
<el-table-column prop="task_uuid" label="作业ID"></el-table-column>
<el-table-column prop="task_name" label="任务名称"></el-table-column>
<el-table-column label="类型" prop="cdType"></el-table-column>
<el-table-column prop="task_size" label="大小">
<template slot-scope="scope">
<div>{{ $filterSize(scope.row.task_size) }}</div>
</template>
</el-table-column>
<el-table-column prop="start_time" label="开始时间"></el-table-column>
<el-table-column prop="finish_time" label="结束时间"></el-table-column>
<el-table-column label="完成">
<template slot-scope="scope">
<div>{{ scope.row.finish_freq }}/{{ scope.row.total_freq }}</div>
</template>
</el-table-column>
<el-table-column prop="task_status" label="状态">
<template slot-scope="scope">
<div v-if="scope.row.task_status == 5 && scope.row.task_uuid">
<el-dropdown trigger="click" @command="(e) => workCommand(scope.row, e)">
<div class="el-dropdown-link flex_box work_status_box">
<div>{{ statusList[scope.row.task_status] }}</div>
<i class="el-icon-caret-bottom"></i>
</div>
<el-dropdown-menu slot="dropdown">
<el-dropdown-item icon="el-icon-refresh-right" command="retry">重试</el-dropdown-item>
<el-dropdown-item icon="el-icon-circle-close" command="cancel">取消</el-dropdown-item>
</el-dropdown-menu>
</el-dropdown>
</div>
<div v-else class="flex_box work_status_box">
<div>{{ statusList[scope.row.task_status] }}</div>
</div>
</template>
</el-table-column>
</el-table>
</div>
</div>
<!-- 底部 -->
<div class="flex_box flex_row_center footer_box">
<div>Copyright @ 2023 CARDSOON Corporation</div>
<div class="footer_line"></div>
<div class="footer_text">帮助</div>
<div class="footer_line"></div>
<div class="footer_text">关于我们</div>
</div>
<!-- 新建作业 -->
<work-add v-if="workShow" @close="workShow = false" :isNew="isNew" :saveWorkList="saveWorkList" ref="workAdd"></work-add>
</div>
</template>
<script>
let that
let outTimer
let fs = require('fs')
let path = require('path')
import { mapGetters } from 'vuex'
const { app, dialog } = require('@electron/remote')
import UserInfo from '@/components/userInfo/userInfo.vue'
import WorkAdd from '@/components/workAdd/workAdd.vue'
const exePath = !app.isPackaged ? process.cwd() : path.dirname(process.execPath)
const shPath = path.join(exePath, 'CardsoonServer', 'control.sh')
export default {
name: 'dashboard',
components: { UserInfo, WorkAdd },
data() {
return {
deviceImg: {
4200: {
img1: require('@/assets/images/4200.png'),
img2: require('@/assets/images/4200-open.png'),
num1: 5,
num2: 10
},
SE3: {
img1: require('@/assets/images/SE3.png'),
img2: require('@/assets/images/SE3-open.png'),
num1: 3,
num2: 6
}
},
// 服务状态
isConnect: false,
serviceStatus: false,
serviceLoading: false,
serviceText: '服务关闭中',
// 工作状态
infoStatus: 0,
// 运行选项
runVal: '',
currentRunVal: '',
sureText: '请设置左右光盘桶类型并按确定键',
sureTime: 0,
runList: [
{
value: 1,
label: '重启设备'
},
{
value: 2,
label: '清除错误'
},
{
value: 6,
label: '设置光盘桶'
}
],
// 剩余容量
progressW: 75,
// 作业列表
taskNum: [0, 0, 0],
task_list: [],
statusList: {
0: '新建中',
1: '准备中',
2: '等待中',
3: '正在刻录',
4: '正在打印',
5: '已失败',
6: '运行中',
7: '已取消',
100: '已完成'
},
// 设备信息
printer_info: {},
isLast: false,
// 光盘信息
default_cd: {},
diskTypes: {},
CDTypes: {},
cd_list: [],
// 光盘更换命令
changeCD: {
req_name: 'setCDStrong',
req_type: 2,
req_info: {
strong_list: [
{
strong_pos: 1,
strong_type: 1
},
{
strong_pos: 2,
strong_type: 1
}
]
}
},
// 日志信息
logList: [],
allLogList: [],
showAll: false,
workShow: false,
isNew: true,
saveWorkList: {},
is_set_cddev: false
}
},
watch: {
'$store.state.chat.firstConnect': {
handler(val) {
if (val && this.$store.state.user.oneLogin) {
this.$store.dispatch('setDatas', { name: 'oneLogin', data: false })
this.$store.dispatch('chat/setDatas', { name: 'firstConnect', data: false })
this.startService()
}
},
deep: true,
immediate: true
},
'$store.state.chat.task_list': {
handler(val) {
if (val && val.length) {
let tasks = [...val]
let list = []
let nums = [0, 0, 0]
tasks.forEach((item, index) => {
if (item.task_status == 100) {
nums[0]++
} else if (item.task_status == 7) {
nums[1]++
} else if (item.task_status == 5) {
nums[2]++
}
if (item.ass_task && item.ass_task.length) {
let task_size = 0
item.cdType = this.$store.state.chat.CDTypes[item.ass_task[0].cd_type]
item.id = item.task_uuid
item.ass_task.forEach((item2, idx) => {
item2.id = item.task_uuid + '_' + (idx + 1)
item2.cdType = this.$store.state.chat.CDTypes[item2.cd_type] + '_' + (idx + 1)
task_size = this.$accAdd(task_size, item2.task_size)
})
item.task_size = task_size
}
list.push(item)
})
this.taskNum = nums
this.task_list = list
} else {
this.task_list = []
}
},
deep: true,
immediate: true
},
'$store.state.chat.printer_info': {
handler(val) {
let data = { ...val }
if (this.currentRunVal === 6) {
data.strongList = this.printer_info.strongList
}
this.default_cd = data.strongList
this.printer_info = { ...data }
if (val.printer_name && val.printer_name === 'SE3') {
this.runList = [
{
value: 1,
label: '重启设备'
},
{
value: 2,
label: '清除错误'
}
]
} else {
this.runList = [
{
value: 1,
label: '重启设备'
},
{
value: 2,
label: '清除错误'
},
{
value: 6,
label: '设置光盘桶'
}
]
}
if (this.printer_info.is_set_cddev == 1) {
if (this.is_set_cddev) return
this.is_set_cddev = true
this.goSet('/manage?type=cddev')
}
},
deep: true,
immediate: true
},
'$store.state.chat.diskTypes': {
handler(val) {
this.diskTypes = { ...val }
},
deep: true,
immediate: true
},
'$store.state.chat.CDTypes': {
handler(val) {
this.CDTypes = { ...val }
},
deep: true,
immediate: true
},
'$store.state.chat.cd_list': {
handler(val) {
this.cd_list = [...val]
},
deep: true,
immediate: true
},
'$store.state.chat.logList': {
handler(val) {
this.logList = [...val]
},
deep: true,
immediate: true
},
'$store.state.chat.allLogList': {
handler(val) {
this.allLogList = [...val]
},
deep: true,
immediate: true
},
'$store.state.chat.isConnect': {
handler(val) {
if (val) {
// this.$message({
// message: '服务已连接',
// type: 'success'
// })
this.serviceLoading = false
}
this.isConnect = val
},
deep: true,
immediate: true
},
'$store.state.chat.serviceStatus': {
handler(val) {
this.serviceStatus = val
},
deep: true,
immediate: true
}
},
computed: {
...mapGetters(['name', 'roles']),
runText() {
let text = this.$store.state.chat.PrinterStatus[this.printer_info.printer_status]
// if (this.printer_info.cover_flag) {
// text = '设备门盖被打开,请关闭门盖。'
// }
// if (this.printer_info.calibration_flag) {
// text = '请先校准设备'
// this.runVal = 4
// }
if (this.printer_info.lack_ink) {
text = '缺墨警告'
}
if (!this.isConnect) {
text = '服务已关闭'
}
if (!this.serviceStatus) {
text = '正在连接服务器,请检查服务器是否正常'
}
return text
},
workStatus() {
return this.isConnect && this.serviceStatus
}
},
mounted() {
that = this
},
methods: {
// 服务打开/关闭
serviceChange(e) {
let that = this
// if (!that.serviceStatus) {
// return
// }
if (e) {
that.startService()
} else {
that.stopService()
}
},
startService() {
let that = this
that
.$prompt('请输入管理员密码并点击确定以执行开启服务操作', '温馨提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
inputType: 'password'
})
.then(({ value }) => {
that.serviceLoading = true
that.serviceText = '服务启动中'
that
.$runCmd(`bash ${shPath} start ${value}`)
.then((res) => {
that.$store.dispatch('chat/setDatas', { name: 'workStatus', data: true })
setTimeout(() => {
that.$store.dispatch('chat/initWebSocket')
}, 500)
})
.catch((err) => {
that.$message({
message: err,
type: 'error'
})
that.serviceLoading = false
})
})
.catch(() => {
that.serviceLoading = false
})
},
stopService() {
let that = this
that
.$prompt('请输入管理员密码并点击确定以执行关闭服务操作', '温馨提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
inputType: 'password'
})
.then(({ value }) => {
that.serviceLoading = true
that.serviceText = '服务关闭中'
that
.$runCmd(`bash ${shPath} stop ${value}`)
.then((res) => {
that.$store.dispatch('chat/setDatas', { name: 'workStatus', data: false })
setTimeout(() => {
that.$store.dispatch('chat/closeWebsocket')
that.serviceLoading = false
that.$message({
message: '服务已关闭',
type: 'success'
})
}, 500)
})
.catch((err) => {
that.$message({
message: err,
type: 'error'
})
that.serviceLoading = false
})
})
.catch(() => {
that.serviceLoading = false
})
},
// 执行
handleRun() {
if (!that.workStatus) {
that.$message({
message: '请先连接服务',
type: 'warning'
})
return
}
if (!that.runVal) {
that.$message({
message: '请先选择需要执行的操作',
type: 'warning'
})
return
}
if ((that.cd_list[0]&&that.cd_list[0].copy_scheduler) || (that.cd_list[1]&&that.cd_list[1].copy_scheduler)) {
that.$message({
message: '正在任务中,无法进行操作',
type: 'warning'
})
return
}
// that.$message({
// message: that.runList[index].label,
// type: 'success'
// })
clearTimeout(outTimer)
switch (that.runVal) {
case 1:
// 重启设备
that
.$confirm('确定执行重启设备操作吗?', '温馨提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
})
.then(() => {
that.$store
.dispatch('chat/websocketsend', {
req_name: 'resetPrinter',
req_type: 2,
req_info: {}
})
.then(() => {
that.$message({
message: '执行成功',
type: 'success'
})
})
})
break
case 2:
// 清除错误
that
.$confirm('确定执行清除错误操作吗?', '温馨提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
})
.then(() => {
that.$store
.dispatch('chat/websocketsend', {
req_name: 'cleanError',
req_type: 2,
req_info: {}
})
.then(() => {
that.$message({
message: '执行成功',
type: 'success'
})
})
})
break
case 3:
// 校准光盘桶
that
.$confirm('确定执行校准光盘桶操作吗?', '温馨提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
})
.then(() => {
that.$store
.dispatch('chat/websocketsend', {
req_name: 'CaliCDStone',
req_type: 2,
req_info: {}
})
.then(() => {
that.$message({
message: '执行成功',
type: 'success'
})
})
})
break
case 4:
// 校准设备
that
.$confirm('确定执行校准设备操作吗?', '温馨提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
})
.then(() => {
that.$store
.dispatch('chat/websocketsend', {
req_name: 'CaliPrinter',
req_type: 1,
req_info: {}
})
.then(() => {
that.$message({
message: '执行成功',
type: 'success'
})
})
})
break
case 5:
// 自动匹配光驱
that
.$confirm('确定执行自动匹配光驱操作吗?', '温馨提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
})
.then(() => {
that.$store
.dispatch('chat/websocketsend', {
req_name: 'autoSetCDDev',
req_type: 2,
req_info: {}
})
.then(() => {
that.$message({
message: '执行成功',
type: 'success'
})
})
})
break
case 6:
outTimer = setTimeout(() => {
that.currentRunVal = 0
that.printer_info.strongList = that.default_cd
}, 120000)
break
case 7:
// 进入运输模式
that
.$confirm('请确保已经取掉左右光盘桶托架,再点击确定', '温馨提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
})
.then(() => {
that.$store
.dispatch('chat/websocketsend', {
req_name: 'TransportMode',
req_type: 2,
req_info: {}
})
.then(() => {
that.$message({
message: '执行成功',
type: 'success'
})
})
})
break
}
that.currentRunVal = that.runVal
},
// 更换左右磁盘类型
handleCommandCD(e, type) {
that.printer_info.strongList[type].cd_type = parseInt(e)
that.changeCD.req_info.strong_list[type - 1].strong_type = parseInt(e)
},
sureCD() {
// if (that.changeCD.req_info.strong_list[0]&&that.changeCD.req_info.strong_list[1]&&that.changeCD.req_info.strong_list[0].strong_type == that.changeCD.req_info.strong_list[1].strong_type) {
// that.$message({
// message: '光盘桶类型不能相同',
// type: 'warning'
// })
// return
// }
that.$store
.dispatch('chat/websocketsend', that.changeCD)
.then(() => {
clearTimeout(outTimer)
that.currentRunVal = 0
let typeLists = [
{
value: 1,
label: 'CD 700MB',
size: 700 * 1024 * 1024
},
{
value: 2,
label: 'DVD 4.7GB',
size: 4.7 * 1024 * 1024 * 1024
},
{
value: 3,
label: 'DVD_DL 8.5GB',
size: 8.5 * 1024 * 1024 * 1024
},
{
value: 4,
label: 'BD 25GB',
size: 25 * 1024 * 1024 * 1024
},
{
value: 5,
label: 'BD_DL 50GB',
size: 50 * 1024 * 1024 * 1024
},
{
value: 6,
label: 'BD_TL 100GB',
size: 100 * 1024 * 1024 * 1024
},
{
value: 7,
label: 'BD_QL 128GB',
size: 128 * 1024 * 1024 * 1024
}
]
let isBD = that.changeCD.req_info.strong_list.findIndex(item => parseInt(item.strong_type) > 3)
if (isBD === -1) {
typeLists = typeLists.slice(0, 3)
}
that.$store.dispatch('chat/setDatas', { name: 'cd_types', data: typeLists })
})
.catch(() => {
clearTimeout(outTimer)
that.currentRunVal = 0
})
},
// 新建作业
showWork() {
// if (!that.workStatus) {
// that.$message({
// message: '请先连接服务',
// type: 'warning'
// })
// return
// }
// if (that.printer_info.is_set_cddev == 1) {
// that.$confirm('上下光驱未设置,请前往设置', '温馨提示', {
// confirmButtonText: '确定',
// cancelButtonText: '取消',
// type: 'warning'
// }).then(() => {
// that.goSet('/manage?type=cddev')
// }).catch(() => {
// });
// return
// }
that.isNew = true
that.workShow = true
that.$nextTick(() => {
that.$refs.workAdd.show()
})
},
// 打开作业文件
openWork() {
if (!that.workStatus) {
that.$message({
message: '请先连接服务',
type: 'warning'
})
return
}
if (that.printer_info.is_set_cddev == 1) {
that.$confirm('上下光驱未设置,请前往设置', '温馨提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
that.goSet('/manage?type=cddev')
}).catch(() => {
});
return
}
that.isNew = false
dialog
.showOpenDialog({
title: '打开作业文件',
filters: [{ name: 'Soon Work', extensions: ['dwk'] }]
})
.then((res) => {
fs.readFile(res.filePaths[0], (err, data) => {
let fName = res.filePaths[0].trim()
let fileName = fName.substring(fName.lastIndexOf('\\') + 1)
that.saveWorkList = JSON.parse(data)
that.saveWorkList.task_name = fileName
that.workShow = true
that.$nextTick(() => {
that.$refs.workAdd.show()
})
})
})
},
// 显示日志
noticeChange() {
if (!that.workStatus) {
that.$message({
message: '请先连接服务',
type: 'warning'
})
return
}
that.showAll = !that.showAll
},
// 下拉操作
workCommand(row, e) {
if (e === 'retry') {
that.workRetry(row)
}
if (e === 'cancel') {
that.workCancel(row)
}
},
// 作业重试
workRetry(row) {
that.$store
.dispatch('chat/websocketsend', {
req_name: 'retry_task',
req_type: 1,
req_info: {
task_uuid: row.task_uuid
}
})
.then(() => {
that.$message({
message: '重试成功',
type: 'success'
})
row.task_status = 1
if (row.ass_task && row.ass_task.length > 0) {
row.ass_task.forEach((item) => {
item.task_status = 1
})
}
})
},
// 作业取消
workCancel(e) {
that.$store
.dispatch('chat/websocketsend', {
req_name: 'cancle_task',
req_type: 1,
req_info: {
task_uuid: that.task_list[e].task_uuid
}
})
.then(() => {
that.$message({
message: '取消成功',
type: 'success'
})
that.task_list[e].task_status = 7
if (that.task_list[e].ass_task && that.task_list[e].ass_task.length > 0) {
that.task_list[e].ass_task.forEach((item) => {
item.task_status = 7
})
}
})
},
// 跳转设置
goSet(e) {
if ((that.cd_list[0]&&that.cd_list[0].copy_scheduler) || (that.cd_list[1]&&that.cd_list[1].copy_scheduler)) {
that.$message({
message: '正在任务中,无法进行操作',
type: 'warning'
})
return
}
that.$router.push({ path: e })
},
// 退出登录
goOut() {
this.$store.dispatch('FedLogOut').then(() => {
location.reload()
})
}
}
}
</script>
<style rel="stylesheet/scss" lang="scss" scoped>
$green: #00c325;
$yellow: #f5a623;
$red: #ff0000;
.container_box {
height: 100vh;
.top_box {
height: 78px;
padding: 0 32px;
background-color: #ffffff;
.top_left {
.top_btn1 {
cursor: pointer;
padding: 0 16px;
height: 40px;
background: #00c325;
border-radius: 6px;
margin-right: 16px;
font-weight: 500;
font-size: 18px;
color: #ffffff;
img {
width: 18px;
height: 18px;
margin-right: 8px;
}
}
.top_btn2 {
cursor: pointer;
padding: 0 16px;
height: 40px;
border: 2px solid #999;
color: #333;
border-radius: 6px;
margin-right: 16px;
font-weight: 500;
font-size: 18px;
&:hover {
background: rgba(0, 195, 37, 0.12);
border: 2px solid rgba(0, 195, 37, 0.32);
color: #00c325;
}
img {
width: 18px;
height: 18px;
margin-right: 8px;
}
}
.top_left_line {
width: 2px;
height: 40px;
background: #e0e0e0;
margin: 0 16px;
}
.top_left_status_box {
width: 90px;
.top_left_status {
padding: 0 16px;
zoom: 1.3;
}
}
.top_left_option {
margin-left: 16px;
.top_left_text {
font-weight: 500;
font-size: 18px;
color: #000000;
text-decoration: underline;
}
.top_left_num {
padding: 0 10px;
height: 28px;
background: #00c325;
border-radius: 6px;
font-weight: 500;
font-size: 18px;
color: #ffffff;
line-height: 28px;
margin-left: 12px;
}
.top_left_num1 {
background: #b8b8b8;
}
}
}
.top_tip {
font-size: 14px;
color: #000;
}
}
.content_body {
background-color: #f8f8f8;
padding: 0 100px;
}
.device_box {
padding: 16px 0;
background-color: #f8f8f8;
.device_left {
width: 50%;
padding: 0 45px;
.device_left_top {
margin-bottom: 24px;
.device_img {
width: 255px;
margin-right: 35px;
}
.device_info {
width: calc(100% - 290px);
.device_info_box {
width: calc(100% - 40px);
overflow: hidden;
.device_info_main {
white-space: nowrap;
transition: all 0.5s;
.device_info_item {
width: 100%;
display: inline-block;
.device_info_text {
font-weight: 500;
font-size: 19px;
color: #000000;
line-height: 38px;
}
.device_info_title {
font-weight: bold;
font-size: 25px;
color: #000000;
line-height: 38px;
padding-bottom: 10px;
}
.device_info_sure {
padding: 10px 0 0;
.device_info_sure_box {
width: 100%;
height: 100%;
}
.device_info_sure_text {
font-size: 15px;
color: $green;
}
.device_info_sure_btn {
width: 80px;
height: 30px;
line-height: 30px;
padding: 0;
background: #00bcc3;
border-radius: 6px;
font-weight: 500;
font-size: 16px;
margin: 0;
color: #ffffff;
}
}
.device_info_options {
.device_info_option {
padding: 0 10px;
&:last-child {
margin-right: 0;
}
.device_info_option_box {
width: 84px;
height: 67px;
margin: 0 auto;
position: relative;
img {
width: 100%;
}
.device_info_option_cap {
position: absolute;
left: 20px;
bottom: 20px;
width: 42px;
height: 47px;
z-index: 3;
.device_info_option_cap_box {
position: absolute;
left: 0;
bottom: 0;
width: 100%;
height: 0;
background-color: $green;
border-radius: 4px;
z-index: 4;
}
.device_info_option_cap_box1 {
background-color: $yellow;
}
.device_info_option_cap_box2 {
background-color: $red;
}
}
}
.device_info_option_img {
width: 118px;
height: 67px;
}
.device_info_option_b {
height: 30px;
padding-top: 10px;
font-size: 24px;
cursor: pointer;
.device_info_option_b_text {
font-weight: 500;
font-size: 18px;
color: #000000;
}
.device_info_option_b_text1 {
width: 36px;
text-align: center;
font-size: 16px;
}
.el-icon-caret-bottom {
transition: all 0.5s;
}
}
.device_info_option_b1 {
.el-icon-caret-bottom {
transform: rotate(90deg);
}
}
.device_info_option_list {
width: 130px;
.device_info_option_item {
width: 36px;
height: 67px;
border-radius: 2px;
background: linear-gradient(270deg, #e1fbfe 0%, #ffffff 50%, #e5f9ff 100%);
border: 1px solid #b1cdd0;
position: relative;
.device_info_option_content {
position: absolute;
bottom: 0;
left: 0;
width: 34px;
height: 32px;
}
}
.device_info_option_blue {
background: linear-gradient(270deg, #e1fbfe 0%, #ffffff 50%, #e5f9ff 100%);
border: 1px solid #b1cdd0;
.device_info_option_content {
background: linear-gradient(90deg, #279fd0 0%, #80e1f7 48%, #2fb0e0 100%);
}
}
.device_info_option_red {
background: linear-gradient(270deg, #fbe5f7 0%, #ffffff 50%, #f6e1f1 100%);
border: 1px solid #e6bcd6;
.device_info_option_content {
background: linear-gradient(90deg, #d02886 0%, #f56abe 48%, #d02991 100%);
}
}
.device_info_option_yellow {
background: linear-gradient(270deg, #fefdc5 0%, #ffffff 50%, #fefdc5 100%);
border: 1px solid #eaecc6;
.device_info_option_content {
background: linear-gradient(90deg, #f7ea32 0%, #fefaaa 48%, #f8e94b 100%);
}
}
}
}
}
}
}
.device_info_main1 {
transform: translateX(-100%);
}
}
.device_info_right {
.device_info_right_item {
width: 28px;
padding: 8px 0;
cursor: pointer;
img {
width: 28px;
height: 28px;
}
}
}
}
}
.device_status {
height: 44px;
background: #ffffff;
border-radius: 4px;
margin-bottom: 24px;
padding: 0 18px;
.device_status_dot {
width: 22px;
height: 22px;
border-radius: 50%;
background: #e54d4d;
margin-right: 18px;
}
.device_status_text {
font-weight: 500;
font-size: 19px;
color: #e54d4d;
line-height: 30px;
}
}
.device_status1 {
.device_status_dot {
background-color: $green;
}
.device_status_text {
color: $green;
}
}
.device_status2 {
.device_status_dot {
background-color: $yellow;
}
.device_status_text {
color: $yellow;
}
}
.device_status3 {
.device_status_dot {
background-color: $red;
}
.device_status_text {
color: $red;
}
}
.device_run {
width: 100%;
height: 44px;
overflow: hidden;
background: #ffffff;
box-shadow: 0px 5 9px 2px rgba(102, 102, 102, 0.18);
border-radius: 6px;
.device_run_input {
width: calc(100% - 140px);
height: 44px;
overflow: hidden;
border-radius: 6px 0 0 6px;
border-style: solid;
border-width: 1px 0 1px 1px;
border-color: #999;
.el-select {
width: 100%;
padding-left: 10px;
::v-deep {
.el-input__inner {
border: none;
font-weight: 500;
background-color: transparent;
font-size: 20px;
height: 40px;
line-height: 40px;
color: #000000;
}
.el-input__icon {
height: 40px;
font-size: 20px;
line-height: 40px;
font-weight: bold;
color: #000;
}
}
}
}
.device_run_btn {
width: 140px;
height: 44px;
background: transparent;
border-style: solid;
border-width: 1px;
border-color: #999;
border-radius: 0px 6px 6px 0px;
font-weight: 500;
font-size: 19px;
margin: 0;
color: #333;
&:hover {
background: rgba(0, 195, 37, 0.12);
border: 2px solid rgba(0, 195, 37, 0.32);
color: #00c325;
}
}
}
}
.device_right {
width: 50%;
.device_right_top {
height: 210px;
background: #ffffff;
border-radius: 4px;
margin-bottom: 18px;
padding: 0 24px;
.device_right_top_item {
width: calc(50% - 25px);
.device_right_top_img {
width: 120px;
height: 120px;
position: relative;
img {
width: 100%;
height: 100%;
}
.device_right_top_img_text {
position: absolute;
background: #000;
border-radius: 4px;
padding: 4px 10px;
font-size: 18px;
font-weight: 500;
color: #fff;
text-align: center;
left: 15px;
bottom: 45px;
}
.device_right_top_img_text1 {
left: 0;
bottom: 0;
padding: 6px;
font-size: 18px;
width: 100%;
}
}
.device_right_top_content {
width: calc(100% - 136px);
.device_right_top_title {
font-weight: 500;
font-size: 19px;
color: #000000;
line-height: 34px;
}
.device_right_top_text {
font-weight: 500;
font-size: 16px;
color: #666666;
line-height: 30px;
}
.device_right_top_progress {
height: 18px;
background: #ffffff;
border-radius: 3px;
border: 2px solid #707070;
margin: 2px 0 2px;
.device_right_top_progress_box {
width: 0;
height: 15px;
background: #00c325;
transition: all 0.5s;
}
}
}
}
.device_right_top_line {
width: 2px;
height: 170px;
background: #e1f5e5;
margin: 0 24px;
}
}
.notice_box {
background: #ffffff;
border-radius: 6px;
.notice_top {
height: 50px;
padding: 0 30px;
border-bottom: 2px solid #e1f5e5;
.notice_title {
font-weight: 500;
font-size: 19px;
color: #000000;
img {
width: 28px;
height: 28px;
margin-right: 18px;
}
}
.notice_all {
font-weight: 500;
font-size: 19px;
color: #333;
cursor: pointer;
img {
width: 28px;
height: 28px;
margin-right: 18px;
}
}
}
.notice_list {
height: 200px;
overflow-y: scroll;
padding: 6px;
::-webkit-scrollbar {
width: 6px; /* 设置滚动条的宽度 */
height: 6px;
}
/* 滚动条滑块样式 */
::-webkit-scrollbar-thumb {
background-color: #b5b5b5; /* 设置滑块背景颜色 */
}
/* 滚动条轨道hover状态样式 */
::-webkit-scrollbar-track:hover {
background-color: #efefef; /* 设置轨道hover状态时的背景颜色 */
}
/* 滚动条滑块hover状态样式 */
::-webkit-scrollbar-thumb:hover {
background-color: #b5b5b5; /* 设置滑块hover状态时的背景颜色 */
}
.notice_item {
height: 42px;
background-color: #f8f8f8;
margin-bottom: 3px;
cursor: pointer;
.notice_content {
width: calc(100% - 108px);
font-size: 16px;
color: #000000;
line-height: 24px;
span {
display: inline-block;
width: 42px;
text-align: center;
}
}
.notice_time {
width: 160px;
text-align: center;
font-size: 14px;
color: #000000;
line-height: 24px;
}
}
.notice_INFO {
.notice_content,
.notice_time {
color: #000000;
}
}
.notice_DEBUG {
.notice_content,
.notice_time {
color: $yellow;
}
}
.notice_ERROR {
.notice_content,
.notice_time {
color: $red;
}
}
}
}
}
}
.work_box {
height: calc(100vh - 625px);
::-webkit-scrollbar {
width: 0; /* 设置滚动条的宽度 */
height: 0;
}
.el-table.work_table {
height: calc(100vh - 685px) !important;
::v-deep .el-table__body-wrapper {
height: calc(100% - 48px) !important;
overflow: scroll !important;
}
}
.work_top {
background-color: #fff;
height: 50px;
.work_top_text {
width: 132px;
height: 50px;
background: linear-gradient(180deg, #c1ffcd 0%, #ffffff 100%);
font-weight: bold;
font-size: 19px;
color: #00c325;
line-height: 50px;
text-align: center;
}
}
.work_table {
background-color: #ffffff;
&::before {
height: 0;
}
::v-deep {
tr {
background-color: #ffffff;
}
td.el-table__cell {
background-color: #ffffff;
border-bottom: 1px dashed #ddd;
}
th.el-table__cell {
background-color: #f2f9f4;
border-bottom: 1px dashed #ddd;
}
.el-table__cell {
padding: 6px 0;
}
.cell {
line-height: 28px;
font-size: 16px;
color: #000000;
}
}
.work_progress {
width: 80%;
::v-deep {
.el-progress-bar__outer {
height: 16px !important;
line-height: 16px !important;
.el-progress-bar__innerText {
font-size: 12px !important;
color: #fff !important;
}
}
}
}
.work_status_box {
font-weight: 500;
font-size: 14px;
color: #000000;
height: 30px;
cursor: pointer;
.work_status_retry {
width: 40px;
height: 22px;
line-height: 22px;
font-size: 12px;
padding: 0;
margin-left: 12px;
}
}
}
.child_table {
&::before {
height: 0;
}
::v-deep {
td.el-table__cell {
border-bottom: 2px solid #f8f8f8;
}
tr {
&:last-child {
td.el-table__cell {
border-bottom: none;
}
}
}
th.el-table__cell {
border-bottom: 2px solid #f8f8f8;
}
}
}
}
.footer_box {
height: 36px;
background: #dcf5e1;
font-weight: 500;
font-size: 14px;
color: #666666;
.footer_line {
width: 2px;
height: 14px;
background-color: #666666;
margin: 0 20px;
}
.footer_text {
cursor: pointer;
&:hover {
color: #00c325;
}
}
}
}
</style>