完善新建作业流程

This commit is contained in:
24kycj
2024-11-07 21:50:06 +08:00
parent ca1a2e11b5
commit 2384fcf7f1
18 changed files with 1585 additions and 341 deletions
Binary file not shown.

Before

Width:  |  Height:  |  Size: 17 KiB

After

Width:  |  Height:  |  Size: 92 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 20 KiB

After

Width:  |  Height:  |  Size: 92 KiB

@@ -94,7 +94,7 @@ export default {
};
</script>
<style lang="less" scoped>
<style lang="scss" scoped>
.progress {
display: flex;
justify-content: space-between;
@@ -0,0 +1,369 @@
<template>
<div class="files">
<div class="btn-group" v-show="false">
<div class="btn" @click="addFolder()" style="color: #67c23a">
<i class="el-icon-folder" />
{{ $t("file.addFolder") }}
</div>
<div class="btn" @click="addFile()" style="color: #67c23a">
<i class="el-icon-files" />
{{ $t("file.addFile") }}
</div>
</div>
<fileEmpty v-if="allNumber == 0" />
<fileList v-else :list="filesList" :del="delFile" :key="key" />
<div v-if="progressVisible">
<el-dialog
:close-on-click-modal="false"
width="500px"
:visible.sync="progressVisible"
:append-to-body="true"
class="prodialog"
>
<progressdialog
:list="filesList"
:overNumber="overNumber"
:allNumber="allNumber"
:changevisiable="changeProgressvisible"
:changestate="changestate"
:isSucess="isSucess"
ref="progressdialog"
></progressdialog>
</el-dialog>
</div>
<div v-if="archiverVisible">
<el-dialog
:close-on-click-modal="false"
width="500px"
:visible.sync="archiverVisible"
:append-to-body="true"
class="archiverDialog"
:show-close="false"
>
<archiverdialog
:isOver="archiverIsover"
:isFalse="archiverIsfalse"
:changevisiable="changeArchivervisible"
></archiverdialog>
</el-dialog>
</div>
<slot></slot>
</div>
</template>
<script>
const { dialog } = require("@electron/remote");
const fs = require("fs");
import fileEmpty from "./fileEmpty";
import fileList from "./fileList";
import progressdialog from "./progressdialog";
import archiverdialog from "./archiverdialog";
import { calcSize, getFileName, isFolder } from "./calc";
import { copy } from "./copy";
import { zip } from "./archiver";
export default {
name: "Files",
props: {
onSizechange: {
type: Function,
},
complete: {
type: Function,
},
saveWorkList: {
type: Object | undefined,
},
},
components: {
fileEmpty,
fileList,
progressdialog,
archiverdialog,
},
data() {
return {
filesList: {},
key: 0,
allSize: 0,
progressVisible: false,
archiverVisible: false,
overNumber: 0,
allNumber: 0,
nowstate: true,
archiverIsover: false,
archiverIsfalse: false,
zip_path: "",
isCopy: false,
isSucess: true,
copyPath: "",
};
},
mounted() {
// this.$set(this, filesList, this.saveWorkList)
const _this = this;
document.addEventListener("drop", (e) => {
e.preventDefault();
// e.stopPropagation();
for (const f of e.dataTransfer.files) {
const isFolder = _this.dropFolderCheck(f);
_this.insertList({
name: getFileName(f.path),
path: f.path,
size: isFolder ? -1 : f.size,
folder: isFolder,
});
if (isFolder) {
calcSize(f.path, _this.folderCalcCallback);
}
}
});
document.addEventListener("dragover", (e) => {
e.preventDefault();
// e.stopPropagation();
});
},
methods: {
insertList(f) {
if (!this.filesList[f.path]) {
this.allNumber++;
this.$set(this.filesList, f.path, f);
if (f.size != -1) {
// 是文件夹
this.sizeChange(f.size);
}
return true;
} else {
//有了,不用加入
return false;
}
},
addFile() {
const _this = this;
dialog
.showOpenDialog({
properties: ["multiSelections"],
})
.then(async (res) => {
for (const item of res.filePaths) {
await fs.stat(item, function (err, res) {
if (err) {
return false;
}
_this.insertList({
name: getFileName(item),
path: item,
size: res.size,
folder: false,
});
});
}
});
},
addFolder() {
const _this = this;
dialog
.showOpenDialog({
properties: ["openDirectory", "multiSelections"],
})
.then((res) => {
for (const item of res.filePaths) {
const result = _this.insertList({
name: getFileName(item),
path: item,
size: -1,
folder: true,
});
if (result) {
calcSize(item, _this.folderCalcCallback);
}
}
});
},
folderCalcCallback(err, res, path) {
if (this.filesList[path]) {
this.filesList[path].size = res;
this.$set(this.filesList, path, this.filesList[path]);
this.sizeChange(this.filesList[path].size);
}
},
delFile(path) {
this.sizeChange(-this.filesList[path].size);
delete this.filesList[path];
this.key++;
this.allNumber--;
},
dropFolderCheck(f) {
//T是文件夹 F不是文件夹
//拖放无法从参数判断是否为文件夹,需要额外处理
if (f.size != 0 && f.size != 4096) {
//返回大小不是0,则不是文件夹
return false;
}
if (f.type != "") {
//如果type不是空,则不是文件夹
return false;
}
return isFolder(f.path);
},
sizeChange(size) {
this.allSize = this.allSize + size;
if (this.allSize <= 0) {
this.allSize = 0;
}
this.onSizechange(this.allSize);
},
fileBack(fileList, Sucess) {
if (Sucess) {
if (this.nowstate) {
this.isSucess = true;
fileList.state = true;
this.overNumber++;
if (this.overNumber == this.allNumber) {
setTimeout(() => {
this.changeProgressvisible(false);
this.complete();
}, 500);
}
} else {
console.log("终止!!!!");
}
} else {
this.isSucess = false;
if (this.nowstate) {
fileList.state = false;
} else {
console.log("终止!!!!");
}
}
},
archiverBack(state) {
if (state) {
this.archiverIsover = true;
this.complete();
} else {
this.archiverIsfalse = true;
}
setTimeout(() => {
this.changeArchivervisible(false);
}, 500);
},
resume(file_form) {
//if (file_form == 0) {
if (1) {
if (this.isCopy) {
this.overNumber = 0;
this.changeProgressvisible(true);
for (let i in this.filesList) {
// const path = "D:\\copytest\\1\\" + this.filesList[i].name;
const path = this.copyPath + this.filesList[i].name;
console.log(this.copyPath);
console.log(path);
copy(
i,
path,
this.filesList[i].folder,
this.fileBack,
this.filesList[i]
);
}
} else {
//2023-04-24修改为所有都只上传文件路径,不需要压缩
//文件和文件夹
this.overNumber = 0;
for (let i in this.filesList) {
// const path = "D:\\copytest\\1\\" + this.filesList[i].name;
// copy(i, path, this.filesList[i].folder, this.back, this.filesList[i]);
this.fileBack(this.filesList[i], true);
}
}
} else if (file_form == 1) {
//电子光盘
} else if (file_form == 2) {
//zip
this.archiverIsover = false;
this.archiverIsfalse = false;
this.zip_path = "D:/archivertest/1.zip";
zip(this.filesList, this.zip_path, this.archiverBack, false);
} else if (file_form == 3) {
//加密zip
this.archiverIsover = false;
this.archiverIsfalse = false;
this.zip_path = "D:/archivertest/2.zip";
let password = "123456";
zip(this.filesList, this.zip_path, this.archiverBack, true, password);
} else if (file_form == 4) {
//u盘
}
},
changeProgressvisible(visiable) {
this.progressVisible = visiable;
},
changeArchivervisible(visiable) {
this.archiverVisible = visiable;
},
changestate(state) {
this.nowstate = state;
},
getLists() {
return this.filesList;
},
haveFolderIsCalc() {},
},
computed: {},
watch: {},
};
</script>
<!-- Add "scoped" attribute to limit CSS to this component only -->
<style lang="scss" scoped>
.prodialog {
display: flex;
justify-content: center;
align-items: center;
flex-wrap: wrap;
}
.archiverDialog {
display: flex;
justify-content: center;
align-items: center;
flex-wrap: wrap;
/deep/.el-dialog__header {
padding: 10px;
}
}
.files {
width: 100%;
background-color: #f5f5f5;
margin: 10px auto 0;
font-size: 12px;
box-shadow: 0 0 10px rgba(0, 0, 0, 0.2);
position: relative;
height: 375px;
}
.btn-group {
height: 30px;
background-color: #e7e7ec;
.btn {
color: #53809f;
display: inline-block;
height: 30px;
line-height: 30px;
font-size: 14px;
padding-left: 10px;
padding-right: 10px;
cursor: pointer;
&:hover {
background-color: #dfdfe4;
}
&:active {
background-color: #d1d1d7;
}
}
}
</style>
+7 -10
View File
@@ -32,7 +32,7 @@
</el-dialog>
</div>
<div v-if="archiverVisible">
<!-- <div v-if="archiverVisible">
<el-dialog
:close-on-click-modal="false"
width="500px"
@@ -47,7 +47,7 @@
:changevisiable="changeArchivervisible"
></archiverdialog>
</el-dialog>
</div>
</div> -->
<slot></slot>
</div>
</template>
@@ -57,10 +57,10 @@ const fs = require("fs");
import fileEmpty from "./fileEmpty";
import fileList from "./fileList";
import progressdialog from "./progressdialog";
import archiverdialog from "./archiverdialog";
// import archiverdialog from "./archiverdialog";
import { calcSize, getFileName, isFolder } from "./calc";
import { copy } from "./copy";
import { zip } from "./archiver";
// import { zip } from "./archiver";
export default {
name: "Files",
props: {
@@ -78,7 +78,7 @@ export default {
fileEmpty,
fileList,
progressdialog,
archiverdialog,
// archiverdialog,
},
data() {
return {
@@ -316,7 +316,7 @@ export default {
};
</script>
<!-- Add "scoped" attribute to limit CSS to this component only -->
<style lang="less" scoped>
<style lang="scss" scoped>
.prodialog {
display: flex;
justify-content: center;
@@ -335,12 +335,9 @@ export default {
.files {
width: 100%;
background-color: #f5f5f5;
margin: 10px auto 0;
height: 100%;
font-size: 12px;
box-shadow: 0 0 10px rgba(0, 0, 0, 0.2);
position: relative;
height: 375px;
}
.btn-group {
@@ -25,7 +25,7 @@ export default {
};
</script>
<!-- Add "scoped" attribute to limit CSS to this component only -->
<style lang="less" scoped>
<style lang="scss" scoped>
.list {
height: 374px;
max-height: 374px;
@@ -18,10 +18,10 @@
</div>
</template>
<script>
import folder from "../../assets/files/folder.png";
import pdf from "../../assets/files/pdf.png";
import compress from "../../assets/files/compress.png";
import unknown from "../../assets/files/unknown.png";
import folder from "@/assets/images/file/folder.png";
import pdf from "@/assets/images/file/pdf.png";
import compress from "@/assets/images/file/compress.png";
import unknown from "@/assets/images/file/unknown.png";
import { bytesToSize, getExtension } from "./calc";
const types = { compress: ["zip", "rar", "7z"], pdf: ["pdf"] };
export default {
@@ -77,7 +77,7 @@ export default {
};
</script>
<!-- Add "scoped" attribute to limit CSS to this component only -->
<style lang="less" scoped>
<style lang="scss" scoped>
.listItem {
height: 50px;
width: 100%;
@@ -156,7 +156,7 @@ export default {
};
</script>
<style lang="less" scoped>
<style lang="scss" scoped>
.dialog {
}
.progress {
+575 -236
View File
@@ -1,246 +1,311 @@
<template>
<div class="add_box">
<el-dialog center :visible.sync="addShow" width="80%" top="10vh" title="新建作业" :close-on-press-escape="false" :close-on-click-modal="false" :show-close="false">
<div @click="close" class="close_box">
<img src="@/assets/images/Close_icon.png" />
</div>
<div class="work_box">
<div class="flex_box flex_row_between work_top">
<div class="flex_box">
<div class="flex_box work_top_item">
<div class="work_top_label">容量</div>
<div class="work_top_val">
<el-select v-model="form.capacity" placeholder="请选择">
<el-option v-for="item in capacityList" :key="item.value" :label="item.label" :value="item.value"> </el-option>
</el-select>
</div>
</div>
<div class="flex_box work_top_item">
<div class="work_top_label">拷贝类型</div>
<div class="work_top_val">
<el-select v-model="form.copy" placeholder="请选择">
<el-option v-for="item in copyList" :key="item.value" :label="item.label" :value="item.value"> </el-option>
</el-select>
</div>
</div>
</div>
<el-popover v-model="setShow" placement="bottom-end" trigger="click">
<div class="set_box">
<div class="set_list">
<div class="flex_box set_item">
<div class="set_label">优先级</div>
<div class="set_val">
<el-select v-model="setForm.priority" placeholder="请选择">
<el-option v-for="item in priorityList" :key="item.value" :label="item.label" :value="item.value"> </el-option>
</el-select>
</div>
</div>
<div class="flex_box set_item">
<div class="set_label">目标工作站</div>
<div class="set_val">
<el-select v-model="setForm.stage" placeholder="请选择">
<el-option v-for="item in stageList" :key="item.value" :label="item.label" :value="item.value"> </el-option>
</el-select>
</div>
</div>
<div class="flex_box set_item">
<div class="set_label">刻录速率</div>
<div class="set_val">
<el-select v-model="setForm.speed" placeholder="请选择">
<el-option v-for="item in speedList" :key="item.value" :label="item.label" :value="item.value"> </el-option>
</el-select>
</div>
</div>
<div class="flex_box set_item">
<div class="set_label">刻录完成后校验光盘</div>
<div class="set_val">
<el-switch v-model="setForm.isCheck" active-color="#07C160" inactive-color="#aaa"> </el-switch>
</div>
</div>
<div class="flex_box set_item">
<div class="set_label">刻录完成后关闭光盘</div>
<div class="set_val">
<el-switch v-model="setForm.isClose" active-color="#07C160" inactive-color="#aaa"> </el-switch>
</div>
</div>
<div class="flex_box set_item">
<div class="set_label">刻录完成后删除缓存</div>
<div class="set_val">
<el-switch v-model="setForm.isDel" active-color="#07C160" inactive-color="#aaa"> </el-switch>
</div>
</div>
<div class="flex_box set_item">
<div class="set_label">作业失败打印标签</div>
<div class="set_val">
<el-switch v-model="setForm.isPrint" active-color="#07C160" inactive-color="#aaa"> </el-switch>
</div>
</div>
<div class="flex_box set_item">
<div class="set_label">允许跨盘</div>
<div class="set_val">
<el-switch v-model="setForm.isArrow" active-color="#07C160" inactive-color="#aaa"> </el-switch>
</div>
</div>
<div class="flex_box flex_col_top set_item">
<div class="set_label">分盘设置</div>
<div class="set_val">
<el-radio-group v-model="setForm.disk">
<el-radio :label="item.id" v-for="(item, index) in diskSet" :key="index">
<div class="set_disk_name">{{ item.name }}</div>
<div class="set_disk_desc">{{ item.desc }}</div>
</el-radio>
</el-radio-group>
</div>
</div>
</div>
<div class="flex_box flex_row_center set_btns">
<el-button @click="setCancel" class="set_btn1">取消</el-button>
<el-button @click="setSure" class="set_btn2" type="primary">确定</el-button>
</div>
</div>
<div class="flex_box work_top_set" slot="reference">
<img src="@/assets/images/Setting_icon.png" />
<div>高级作业设置</div>
</div>
</el-popover>
<div
class="work_body"
v-loading="submitLoading"
element-loading-text="正在准备任务您也可以直接右上角关闭作业窗口"
element-loading-spinner="el-icon-loading"
element-loading-background="rgba(0, 0, 0, 0.8)"
>
<div @click="close" class="close_box">
<img src="@/assets/images/Close_icon.png" />
</div>
<div class="flex_box flex_col_top work_main">
<div class="work_left">
<div class="flex_box flex_row_between work_left_top">
<div class="flex_box">
<div class="work_left_top_label">内容</div>
<div @click="addFolder" class="flex_box work_left_top_btn">
<img src="@/assets/images/file_icon.png" />
<div>添加文件夹</div>
</div>
<div @click="addFile" class="flex_box work_left_top_btn">
<img src="@/assets/images/paper_icon.png" />
<div>添加文件</div>
<div class="work_box">
<div class="flex_box flex_row_between work_top">
<div class="flex_box">
<div class="flex_box work_top_item">
<div class="work_top_label">光盘类型</div>
<div class="work_top_val">
<el-select v-model="form.cd_type" placeholder="请选择">
<el-option v-for="item in cd_types" :key="item.value" :label="item.label" :value="item.value"> </el-option>
</el-select>
</div>
</div>
<div class="work_left_top_input">
<el-input placeholder="请输入卷标" v-model="form.volume">
<template slot="prepend">卷标</template>
</el-input>
<div class="flex_box work_top_item">
<div class="work_top_label">拷贝类型</div>
<div class="work_top_val">
<el-select v-model="form.copy" placeholder="请选择">
<el-option v-for="item in copyList" :key="item.value" :label="item.label" :value="item.value"> </el-option>
</el-select>
</div>
</div>
</div>
<div class="work_files">
<div class="work_files_box">
<!-- 空文件 -->
<file-empty v-if="!fileList.length"></file-empty>
<el-popover v-model="setShow" placement="bottom-end" trigger="click">
<div class="set_box">
<div class="set_list">
<div class="flex_box set_item">
<div class="set_label">优先级</div>
<div class="set_val">
<el-select v-model="setForm.priority" placeholder="请选择">
<el-option v-for="item in priorityList" :key="item.value" :label="item.label" :value="item.value"> </el-option>
</el-select>
</div>
</div>
<div class="flex_box set_item">
<div class="set_label">目标工作站</div>
<div class="set_val">
<el-select v-model="setForm.stage" placeholder="请选择">
<el-option v-for="item in stageList" :key="item.value" :label="item.label" :value="item.value"> </el-option>
</el-select>
</div>
</div>
<div class="flex_box set_item">
<div class="set_label">刻录速率</div>
<div class="set_val">
<el-select v-model="setForm.speed" placeholder="请选择">
<el-option v-for="item in speedList" :key="item.value" :label="item.label" :value="item.value"> </el-option>
</el-select>
</div>
</div>
<div class="flex_box set_item">
<div class="set_label">刻录完成后校验光盘</div>
<div class="set_val">
<el-switch v-model="setForm.isCheck" active-color="#07C160" inactive-color="#aaa"> </el-switch>
</div>
</div>
<div class="flex_box set_item">
<div class="set_label">刻录完成后关闭光盘</div>
<div class="set_val">
<el-switch v-model="setForm.isClose" active-color="#07C160" inactive-color="#aaa"> </el-switch>
</div>
</div>
<div class="flex_box set_item">
<div class="set_label">刻录完成后删除缓存</div>
<div class="set_val">
<el-switch v-model="setForm.isDel" active-color="#07C160" inactive-color="#aaa"> </el-switch>
</div>
</div>
<div class="flex_box set_item">
<div class="set_label">作业失败打印标签</div>
<div class="set_val">
<el-switch v-model="setForm.isPrint" active-color="#07C160" inactive-color="#aaa"> </el-switch>
</div>
</div>
<div class="flex_box set_item">
<div class="set_label">允许跨盘</div>
<div class="set_val">
<el-switch v-model="setForm.isArrow" active-color="#07C160" inactive-color="#aaa"> </el-switch>
</div>
</div>
<div class="flex_box flex_col_top set_item">
<div class="set_label">分盘设置</div>
<div class="set_val">
<el-radio-group v-model="setForm.disk">
<el-radio :label="item.id" v-for="(item, index) in diskSet" :key="index">
<div class="set_disk_name">{{ item.name }}</div>
<div class="set_disk_desc">{{ item.desc }}</div>
</el-radio>
</el-radio-group>
</div>
</div>
</div>
<div class="flex_box flex_row_center set_btns">
<el-button @click="setCancel" class="set_btn1">取消</el-button>
<el-button @click="setSure" class="set_btn2" type="primary">确定</el-button>
</div>
</div>
<div class="work_files_progress">
<div class="flex_box work_top_set" slot="reference">
<img src="@/assets/images/Setting_icon.png" />
<div>高级作业设置</div>
</div>
</el-popover>
</div>
<div class="flex_box flex_col_top work_main">
<div class="work_left">
<div class="flex_box flex_row_between work_left_top">
<div class="flex_box">
<div class="work_left_top_label">内容</div>
<div @click="addFolder" class="flex_box work_left_top_btn">
<img src="@/assets/images/file_icon.png" />
<div>添加文件夹</div>
</div>
<div @click="addFile" class="flex_box work_left_top_btn">
<img src="@/assets/images/paper_icon.png" />
<div>添加文件</div>
</div>
</div>
<div class="work_left_top_input">
<el-input placeholder="请输入卷标" v-model="form.label">
<template slot="prepend">卷标</template>
</el-input>
</div>
</div>
<div class="work_files">
<div class="work_files_box">
<!-- 文件列表 -->
<files ref="files" :onSizechange="sizeChange" :complete="upload_over" />
</div>
<!-- <div class="work_files_progress">
<div class="work_files_progress_content" :style="{ width: fileProgess + '%' }"></div>
<div class="work_files_progress_text">0.0MB/0MB</div>
</div> -->
</div>
</div>
</div>
<div class="work_right">
<div class="flex_box work_right_top">
<div class="flex_box">
<div class="work_right_top_label">标签</div>
<el-select v-model="form.capacity" placeholder="选择一个标签或点击创建标签">
<el-option v-for="item in capacityList" :key="item.value" :label="item.label" :value="item.value"> </el-option>
</el-select>
<div class="work_right_top_file">···</div>
</div>
<div class="work_right_top_add">新建标签</div>
</div>
<div class="wook_soon" :class="{ wook_soon1: !showList }">
<div class="flex_box flex_row_center wook_soon_top">
<img class="wook_soon_img" src="@/assets/images/soon.jpg" />
<div @click="showList = !showList" class="flex_box flex_row_center wook_soon_btn" :class="{ wook_soon_btn1: !showList }">
<img src="@/assets/images/Arrow_up_icon.png" />
<div class="work_right">
<div class="flex_box work_right_top">
<div class="flex_box">
<div class="work_right_top_label">标签</div>
<el-select @change="changeTemplate" v-model="currentTemplate" placeholder="选择一个标签或点击创建标签">
<el-option v-for="item in templates" :key="item.value" :label="item.label" :value="item.value"> </el-option>
</el-select>
<div @click="openFile" class="work_right_top_file">···</div>
</div>
<div class="work_right_top_add">新建标签</div>
</div>
<div class="wook_soon_list">
<div v-for="(item, index) in soonList" :key="index" class="flex_box wook_soon_item">
<div class="wook_soon_label">OUT_TEXT_4[正面]</div>
<div class="wook_soon_input">
<el-input v-model="item.value" placeholder="请输入"></el-input>
<div class="wook_soon" :class="{ wook_soon1: !showList }">
<div class="flex_box flex_row_center wook_soon_top">
<img class="wook_soon_img" :src="soonImg" />
<div @click="showList = !showList" class="flex_box flex_row_center wook_soon_btn" :class="{ wook_soon_btn1: !showList }">
<img src="@/assets/images/Arrow_up_icon.png" />
</div>
</div>
<div class="wook_soon_list">
<div v-for="(item, index) in soonList" :key="index" class="flex_box wook_soon_item">
<div class="wook_soon_label">{{ item.name }}</div>
<div class="wook_soon_input">
<el-input v-model="item.val" placeholder="请输入"></el-input>
</div>
<div @click="openFile2" v-if="item.type == 3 || item.type == 4 || item.type == 5" class="wook_soon_add">添加字段</div>
</div>
<div class="wook_soon_add">添加字段</div>
</div>
</div>
</div>
</div>
</div>
</div>
<div slot="footer" class="flex_box flex_row_between footer_box">
<div class="flex_box footer_main">
<div class="footer_input">
<el-input placeholder="请输入数量" v-model="form.number">
<template slot="prepend">数量</template>
</el-input>
<div slot="footer" class="flex_box flex_row_between footer_box">
<div class="flex_box footer_main">
<div class="footer_input">
<el-input placeholder="请输入数量" v-model="form.task_freq">
<template slot="prepend">数量</template>
</el-input>
</div>
</div>
<div class="flex_box footer_btns">
<el-button type="primary" class="footer_save" @click="workSubmit">保存</el-button>
<el-button type="primary" class="footer_submit" @click="workSubmit">提交</el-button>
</div>
</div>
<div class="flex_box footer_btns">
<el-button type="primary" class="footer_save" @click="workSave">保存</el-button>
<el-button type="primary" class="footer_submit" @click="workSubmit">提交</el-button>
</div>
</div>
<!-- 上传文件区域 -->
<input type="file" accept=".cs,.soon" @change="fileLoad" ref="refFile" style="display: none" />
<input type="file" accept=".csv" @change="fileLoad2" ref="refFile2" style="display: none" />
<input type="file" accept="..zip,.rar" @change="fileLoad3" ref="refFile3" style="display: none" />
</el-dialog>
</div>
</template>
<script>
const { dialog } = require('@electron/remote')
let fs = require('fs')
let path = require('path')
const { app, dialog } = require('@electron/remote')
const { exec } = require('child_process')
const { ipcRenderer } = require('electron')
import { mapGetters } from 'vuex'
const dayjs = require('dayjs')
import fileEmpty from './files/fileEmpty'
import files from './files/file'
export default {
name: 'UserInfo',
components: { fileEmpty },
components: { fileEmpty, files },
data() {
return {
addShow: true,
form: {
number: 1,
capacity: 1,
copy: 1,
volume: '2024-10-17'
addShow: false,
submitLoading: false,
size_form: null,
type_form: 0,
file_form: 0,
juanbiao_form: '',
options: {
target: '/upload/',
testChunks: false
},
capacityList: [
zip_attrs: {
accept: '.zip'
},
iso_attrs: {
accept: 'iso/img'
},
form: {
task_uuid: '',
cd_type: 2,
json_file: '',
udf_file: '',
label: '2024-10-17',
has_copy_task: false,
has_print_task: false,
ass_task: [],
task_freq: 1
},
testForm: {
req_name: 'submit_task',
req_type: 1,
req_info: {
task_uuid: 'aaaaaaaaaaaaaaa',
json_file: '/home/test/test.soon',
udf_file: '/home/test/temp.csv',
label: '2024-11-07',
cd_type: 1,
has_copy_task: true,
has_print_task: true,
ass_task: [
{
ass_task_index: 1,
path_file: [
'/home/test/code/CDDateBank/build-CDDateBank-Imported_Kit_a412ee-Debug/libworkDllCD.so',
'/home/test/code/CDDateBank/build-CDDateBank-Imported_Kit_a412ee-Debug/libzint.so.2.12',
'/home/test/code/CDDateBank/build-CDDateBank-Imported_Kit_a412ee-Debug/privkey.txt'
]
}
],
task_freq: 1
}
},
// CD类型:CD1DVD2 DVD_DL:3BD4,BD_DL:5,BD_TL:6,BD_QL:7
cd_types: [
{
value: 1,
label: '4GB'
label: 'CD'
},
{
value: 2,
label: '8GB'
label: 'DVD'
},
{
value: 3,
label: '16GB'
}
],
copyList: [
{
value: 1,
label: '复制'
label: 'DVD_DL'
},
{
value: 2,
label: '打印'
value: 4,
label: 'BD'
},
{
value: 3,
label: '复制与打印'
value: 5,
label: 'BD_DL'
},
{
value: 6,
label: 'BD_TL'
},
{
value: 7,
label: 'BD_QL'
}
],
// 文件列表
fileList: [],
copyList: [],
fileProgess: 30,
// 模板列表
templates: [],
currentTemplate: '',
// soon文件数据
soonList: [
{
label: '正面',
value: 'tj44545fsa13yt544r15e6h4r6'
},
{
label: '二维码',
value: 'soon'
}
],
soonform: {},
fileData: {},
soonList: [],
file_name: null,
file_name3: '添加图片文件',
upload_disk: '',
soonImg: '',
showList: true,
setShow: false,
setForm: {
@@ -318,57 +383,310 @@ export default {
computed: {
...mapGetters(['name', 'roles'])
},
mounted() {
this.getTemplates()
this.form.task_uuid = this.genTaskUUID()
this.form.label = dayjs().format('YYYY-MM-DD')
},
methods: {
// 选择文件
addFile() {
const _this = this
dialog
.showOpenDialog({
properties: ['multiSelections']
})
.then(async (res) => {
// for (const item of res.filePaths) {
// await fs.stat(item, function (err, res) {
// if (err) {
// return false
// }
// _this.insertList({
// name: getFileName(item),
// path: item,
// size: res.size,
// folder: false
// })
// })
// }
})
},
// 添加文件处理
addFolder() {
const _this = this
dialog
.showOpenDialog({
properties: ['openDirectory', 'multiSelections']
})
.then((res) => {
// for (const item of res.filePaths) {
// const result = _this.insertList({
// name: getFileName(item),
// path: item,
// size: -1,
// folder: true
// })
// if (result) {
// calcSize(item, _this.folderCalcCallback)
// }
// }
})
this.$refs.files.addFolder()
},
addFile() {
this.$refs.files.addFile()
},
sizeChange(size) {
this.size = size
},
async upload_over() {
// //左侧内容上传结束
// if (!this.upload_flag) {
// return
// }
// this.upload_flag = false
// if (this.flag_cont_up) {
// //如果是点击按钮开启的上传,则进行上传右侧
// if ((!this.isNew && this.fileData) || (this.isNew && this.fileLists[0])) {
// //开启了标签则检测并上传
// let files_n_incr = 1
// let data1 = new FormData()
// if (this.isNew) {
// if (this.fileLists[0]) {
// data1.append(`file${files_n_incr}`, this.fileLists[0]) //标签cs文件
// files_n_incr++
// } else {
// this.$message({
// offset: 100,
// message: this.$t('work.pleaseUploadTag'),
// type: 'warning'
// })
// return
// }
// } else {
// if (this.fileData && !this.fileLists[0]) {
// //纯打开,需要上传的是as文件
// let _file = new File([JSON.stringify(this.fileData)], this.saveWorkList.taskName, { type: 'text/plain' })
// data1.append(`file${files_n_incr}`, _file) //标签cs文件
// files_n_incr++
// } else if (this.fileData && this.fileLists[0]) {
// //打开后,又重新选择了soon文件
// data1.append(`file${files_n_incr}`, this.fileLists[0]) //标签cs文件
// files_n_incr++
// } else {
// this.$message({
// offset: 100,
// message: this.$t('work.pleaseUploadTag'),
// type: 'warning'
// })
// return
// }
// }
// if (this.$refs.refFile2.files.length != 0) {
// // 有csv合并文件
// data1.append(`file${files_n_incr}`, this.$refs.refFile2.files[0]) //csv文件
// data1.append(`csv`, true) //csv文件flag
// //console.log(this.$refs.refFile2.files);
// files_n_incr++
// } else {
// data1.append(`csv`, false) //csv文件flag
// }
// for (let item of this.soonList) {
// if (item.type == 1 && this.$refs[item.origin_name].files[0] != undefined && this.$refs.refFile2.files.length != 0) {
// //有合并文件
// //data1.append(item.origin_name, this.$refs[item.origin_name].files[0]);//图片文件
// data1.append(`file${files_n_incr}`, this.$refs[item.origin_name].files[0]) //图片文件
// files_n_incr++
// } else if (item.type == 1 && this.$refs[item.origin_name].files[0] != undefined && this.$refs.refFile2.files.length == 0) {
// //无合并文件
// data1.append(item.origin_name, this.$refs[item.origin_name].files[0]) //图片文件
// //data1.append(`file${files_n_incr}`, this.$refs[item.origin_name].files[0]);//图片文件
// files_n_incr++
// } else if ((item.type == 3 || item.type == 5) && this.$refs.refFile2.files.length == 0) {
// //无合并文件
// let data = this.form[item.origin_name]
// if (data == '' || data == undefined || data == null) {
// data = item.default
// }
// data1.append(item.origin_name, data) //合成文字与条形码 有默认值的
// } else if (item.type == 4 && this.$refs.refFile2.files.length == 0) {
// //二维码
// data1.append(item.origin_name, this.form[item.origin_name])
// }
// }
// this.$message({ offset: 100, message: this.$t('work.uploadingTag') })
// let pathName
// if (this.high_setting_form.localfiles) {
// //打开本地选项
// let rootFile = this.$refs.uploader.uploader.getRoot()
// if (rootFile.fileList.length != 1) {
// this.$message({
// offset: 100,
// message: this.$t('work.oneFolder'),
// type: 'warning'
// })
// return
// }
// let filePath = rootFile.fileList[0]
// if (!filePath.isFolder) {
// this.$message({
// offset: 100,
// message: this.$t('work.notFolder'),
// type: 'warning'
// })
// return
// }
// pathName = filePath.name
// } else {
// pathName = this.upload_disk
// }
// this.$axios({
// method: 'post',
// url: '/upload/' + pathName,
// headers: {
// 'Content-Type': 'multipart/form-data;boundary=' + new Date().getTime()
// },
// data: data1
// }).then((res) => {
// this.submit() //调用提交函数
// })
// } else {
// //未开启标签则直接提交
// this.submit()
// }
// }
// this.flag_cont_up = false
},
// 保存
workSave() {
},
workSave() {},
// 提交
workSubmit() {
let that = this
that.submitLoading = true
// that.$store.dispatch('chat/websocketsend', that.testForm)
setTimeout(() => {
that.$message({
message: '新建作业成功',
type: 'success'
})
that.submitLoading = false
that.close()
}, 2000)
},
// 获取模板文件列表
getTemplates() {
fs.readdir('User Templates', (err, files) => {
if (err) {
console.log(err)
} else {
const fileList = files.map((file) => {
return {
label: file,
value: path.join('User Templates', file)
}
})
this.templates = fileList
}
})
},
// 选择模板
changeTemplate(e) {
fs.readFile(e, 'utf8', (err, data) => {
if (err) {
console.error('读取文件时出错:', err)
return
}
let name = e.split('\\')[1]
this.fileLists[0] = new File([data], name, {
type: ''
})
this.readFile(data)
})
},
// 读取文件信息
readFile(data) {
let that = this
that.fileData = JSON.parse(data)
that.soonform = {}
that.soonList = []
for (let item of that.fileData.frontData) {
if (item.type == 1 || item.type == 3 || item.type == 4 || item.type == 5) {
that.soonList.push({
name: item.name + '[正面]',
val: item.DefaultText == undefined ? '' : item.DefaultText,
origin_name: item.name,
type: item.type,
default: item.DefaultText == undefined ? undefined : item.DefaultText
}) //前
that.$set(that.soonform, item.name, item.DefaultText == undefined ? '' : item.DefaultText)
}
}
for (let item of that.fileData.backData) {
if (item.type == 1 || item.type == 3 || item.type == 4 || item.type == 5) {
that.soonList.push({
name: item.name + '[背面]',
val: item.DefaultText == undefined ? '' : item.DefaultText,
origin_name: item.name,
type: item.type,
default: item.DefaultText == undefined ? undefined : item.DefaultText
})
that.$set(that.soonform, item.name, item.DefaultText == undefined ? '' : item.DefaultText)
}
}
that.soonImg = that.fileData.frontDisplayPic
// that.$refs.refFile2.value = ''
// that.$refs.refFile3.value = ''
console.log(that.fileData, that.soonList, that.soonform)
that.csvIsExist = false
that.file_name = null
that.file_name3 = '添加图片文件'
},
// 打开标签程序
openDesign() {
// 启动exe程序
exec('"D:\\Program Files\\Cardsoon\\SoonDesign\\SoonDesign.exe"', (error, stdout, stderr) => {
if (error) {
console.error(`执行的错误: ${error}`)
return
}
console.log(`stdout: ${stdout}`)
console.error(`stderr: ${stderr}`)
})
},
getPrintName(id) {
return this.$t('index.wordSpace') + id.substr(-5)
},
getPrintName1(id) {
for (let i = 0; i < this.printerList.length; i++) {
if (this.printerList[i].PrinterID == id) {
return this.$t('index.wordSpace') + this.toChar(i)
}
}
},
// 文件上传处理
openFile() {
this.$refs.refFile.dispatchEvent(new MouseEvent('click'))
},
openFile2() {
this.$refs.refFile2.dispatchEvent(new MouseEvent('click'))
},
openFile3() {
this.$refs.refFile3.dispatchEvent(new MouseEvent('click'))
},
fileLoad() {
this.fileLists = this.$refs.refFile.files
let selectedFile = this.fileLists[0]
let reader = new FileReader()
reader.readAsText(selectedFile)
let _this = this
_this.currentTemplate = ''
reader.onload = function () {
_this.readFile(this.result)
}
},
fileLoad2() {
this.file_name = this.$refs.refFile2.files[0].name
this.csvLoad()
},
fileLoad3() {
this.file_name3 = this.$refs.refFile3.files[0].name
},
csvLoad() {
let selectedFile = this.$refs.refFile2.files[0]
let reader = new FileReader()
reader.readAsText(selectedFile)
let _this = this
reader.onload = function () {
//let flag = true; //校验结果
let first_line = this.result.split('\n')[0].replace('\r', '').split(',') //第一行
let second_line = this.result.split('\n')[1].replace('\r', '').split(',') //第二行
let i = 0
for (let item of first_line) {
_this.$set(_this.form, item, second_line[i])
i++
}
_this.csvIsExist = true
}
},
format(percentage) {
let mb = (this.size_form * 931.3).toFixed(0)
return (this.size / (1024 * 1024)).toFixed(1) + 'MB / ' + mb + 'MB'
},
genTaskUUID() {
var myDate = new Date()
var dateStr =
myDate.getFullYear().toString() +
(myDate.getMonth() + 1 >= 10 ? (myDate.getMonth() + 1).toString() : '0' + (myDate.getMonth() + 1).toString()) +
(myDate.getDate() > 9 ? myDate.getDate().toString() : '0' + myDate.getDate().toString()) +
(myDate.getHours() > 9 ? myDate.getHours().toString() : '0' + myDate.getHours().toString()) +
(myDate.getMinutes() > 9 ? myDate.getMinutes().toString() : '0' + myDate.getMinutes().toString()) +
(myDate.getSeconds() > 9 ? myDate.getSeconds().toString() : '0' + myDate.getSeconds().toString()) +
myDate
.getTime()
.toString()
.slice(myDate.getTime().toString().length - 3, myDate.getTime().toString().length - 1)
// return 'W' + Math.random().toString(36).substr(2)
return dateStr
},
show() {
this.addShow = true
@@ -730,6 +1048,27 @@ export default {
padding: 0 28px;
.footer_main {
.footer_input {
::v-deep {
.el-input-group__prepend {
font-size: 16px;
color: #000;
font-weight: 500;
}
.el-input__inner {
width: 180px;
height: 32px;
line-height: 32px;
font-size: 16px;
color: #000;
font-weight: 500;
}
.el-input__icon {
height: 32px;
line-height: 32px;
font-weight: bold;
color: #000;
}
}
}
}
.footer_btns {
+3 -2
View File
@@ -25,6 +25,7 @@ const actions = {
if ((websock && isConnect) || !rootState.user.token) {
return
}
console.log(process.env.VUE_APP_SOCKET_API)
websock = new WebSocket(process.env.VUE_APP_SOCKET_API)
websock.onmessage = function (res) {
dispatch('websocketonmessage', res)
@@ -112,8 +113,8 @@ const actions = {
dispatch('initWebSocket')
}, 5000)
} else {
state.reconnections = 0
dispatch('initWebSocket')
// state.reconnections = 0
// dispatch('initWebSocket')
// MessageBox.alert('服务器启动异常,请刷新重试', '温馨提示', {
// confirmButtonText: '刷新',
// showCancelButton: true
+62 -70
View File
@@ -111,7 +111,7 @@
</el-option>
</el-select>
</div>
<el-button type="primary" class="device_run_btn">执行</el-button>
<el-button @click="handleRun" type="primary" class="device_run_btn">执行</el-button>
</div>
</div>
<!-- 右侧 -->
@@ -121,14 +121,14 @@
<img class="device_right_top_img" src="@/assets/images/device2.png" />
<div class="device_right_top_content">
<div class="device_right_top_title">BD驱动器(S)(顶部)</div>
<div class="device_right_top_text">状态插入光盘中</div>
<div class="device_right_top_text">任务文件刻录_20210323095213</div>
<div class="device_right_top_text">光盘56210323002</div>
<div class="device_right_top_text">状态空闲无盘</div>
<div class="device_right_top_text">任务</div>
<div class="device_right_top_text">光盘</div>
</div>
</div>
<div class="device_right_top_line"></div>
<div class="flex_box flex_row_between device_right_top_item">
<img class="device_right_top_img" src="@/assets/images/device2.png" />
<img class="device_right_top_img" src="@/assets/images/device3.png" />
<div class="device_right_top_content">
<div class="device_right_top_title">21032200009(H)(底部)</div>
<div class="flex_box device_right_top_progress">
@@ -136,7 +136,7 @@
</div>
<div class="device_right_top_text">15GB可用共60GB</div>
<div class="device_right_top_text">状态插入光盘中</div>
<div class="device_right_top_text">任务文件刻录_20210323095213</div>
<div class="device_right_top_text">任务文件刻录_20241107175818</div>
<div class="device_right_top_text">光盘56210323002</div>
</div>
</div>
@@ -169,18 +169,24 @@
<el-table max-height="250" class="work_table" :data="workList" empty-text="暂无作业列表">
<el-table-column type="index" width="50" label="序号"></el-table-column>
<el-table-column prop="jId" label="作业ID"></el-table-column>
<el-table-column prop="DataSource" label="作业来源"></el-table-column>
<el-table-column prop="PrinterID" label="工作站"></el-table-column>
<el-table-column prop="PrinterType" label="存储卡类型"></el-table-column>
<el-table-column prop="TaskCapacity" label="拷贝数"></el-table-column>
<el-table-column prop="CreateTime" label="开始时间"></el-table-column>
<el-table-column prop="FinishTime" label="结束时间"></el-table-column>
<el-table-column prop="username" label="用户"></el-table-column>
<el-table-column prop="DataSource" label="来源"></el-table-column>
<el-table-column prop="PrinterType" label="类型">
<template slot-scope="scope">
<div class="work_status_box">
<div>{{typeList[scope.row.PrinterType]}}</div>
</div>
</template>
</el-table-column>
<el-table-column prop="TaskCapacity" label="大小"></el-table-column>
<!-- <el-table-column prop="CreateTime" label="开始时间"></el-table-column> -->
<!-- <el-table-column prop="FinishTime" label="结束时间"></el-table-column> -->
<el-table-column prop="JobCompletion" label="完成"></el-table-column>
<el-table-column prop="JobStatus" label="状态">
<template slot-scope="scope">
<div class="flex_box work_status_box">
<div>{{scope.row.JobStatus==1?'成功':'失败'}}</div>
<i class="el-icon-caret-bottom"></i>
<div>{{statusList[scope.row.JobStatus]}}</div>
<!-- <i class="el-icon-caret-bottom"></i> -->
</div>
</template>
</el-table-column>
@@ -220,88 +226,66 @@ export default {
runList: [
{
value: 1,
label: '检查打印机',
label: '重启设备',
},
{
value: 2,
label: '打印机换纸',
label: '清除错误',
},
{
value: 3,
label: '校准光盘桶',
},
{
value: 4,
label: '校准打印机',
}
},
{
value: 5,
label: '自动设置刻录机',
},
{
value: 6,
label: '设置左右盘仓',
},
],
// 剩余容量
progressW: 50,
progressW: 75,
// 日志
noticeList: [
{
id: 1,
message: '《CRMEB 开源/标准版商城系统客服配置教程》',
message: '[2024-11-07 17:58:18][文件刻录 20241107175818][执行任务完成]',
createtime: '2024 10-13'
},
{
id: 2,
message: '《CRMEB 开源/标准版商城系统客服配置教程》',
message: '[2024-11-07 17:53:13][文件刻录 20241107175313][开始执行文件刻录任务]',
createtime: '2024 10-13'
},
{
id: 3,
message: '《CRMEB 开源/标准版商城系统客服配置教程》',
createtime: '2024 10-13'
}
// {
// id: 3,
// message: '[2024-11-07 17:52:28][文件刻录 20241107175228][接收到任务]',
// createtime: '2024 10-13'
// },
],
// 作业列表
workList: [
{
ID: '1',
jId: '202410145423408',
username: 'Admin',
DataSource: '127.0.0.1',
PrinterID: '002A',
PrinterType: '4GB丨2.0',
TaskCapacity: '1GB278MB',
CreateTime: '10-14 15:46:24',
FinishTime: '10-14 16:10:01',
PrinterType: 1,
TaskCapacity: '2.41GB',
CreateTime: '11-07 15:46:24',
FinishTime: '11-07 16:10:01',
JobCompletion: '5/10',
JobStatus: '1'
JobStatus: '4'
},
{
ID: '1',
jId: '202410145423408',
DataSource: '127.0.0.1',
PrinterID: '002A',
PrinterType: '4GB丨2.0',
TaskCapacity: '1GB278MB',
CreateTime: '10-14 15:46:24',
FinishTime: '10-14 16:10:01',
JobCompletion: '5/10',
JobStatus: '1'
},
{
ID: '1',
jId: '202410145423408',
DataSource: '127.0.0.1',
PrinterID: '002A',
PrinterType: '4GB丨2.0',
TaskCapacity: '1GB278MB',
CreateTime: '10-14 15:46:24',
FinishTime: '10-14 16:10:01',
JobCompletion: '5/10',
JobStatus: '1'
},
{
ID: '1',
jId: '202410145423408',
DataSource: '127.0.0.1',
PrinterID: '002A',
PrinterType: '4GB丨2.0',
TaskCapacity: '1GB278MB',
CreateTime: '10-14 15:46:24',
FinishTime: '10-14 16:10:01',
JobCompletion: '5/10',
JobStatus: '1'
},
]
],
typeList: ['', '文件刻录', '光盘拷贝', '定期归档', '光盘读取'],
statusList: ['', '新建', '等待中', '文件准备中', '正在刻录', '正在打印', '已失败', '已取消', '已完成'],
}
},
computed: {
@@ -311,6 +295,14 @@ export default {
that = this
},
methods: {
// 执行
handleRun() {
const index = that.runList.findIndex(item => item.value == that.runVal)
that.$message({
message: that.runList[index].label,
type: 'success'
})
},
// 新建作业
showWork() {
that.$refs.workAdd.show()
@@ -643,7 +635,7 @@ export default {
}
}
.notice_list {
max-height: 200px;
height: 200px;
overflow-y: scroll;
padding: 6px;
::-webkit-scrollbar {
@@ -698,7 +690,7 @@ export default {
}
}
.work_box {
height: calc(100vh - 590px);
height: calc(100vh - 640px);
.work_top {
height: 72px;
.work_top_text {
+1 -1
View File
@@ -81,7 +81,7 @@ export default {
this.loading = true
setToken('data.token')
this.$store.commit('SET_TOKEN', 'data.token')
// this.$store.dispatch('chat/initWebSocket') // 初始化websocket
this.$store.dispatch('chat/initWebSocket') // 初始化websocket
setTimeout(() => {
this.loading = false
this.$router.push({ path: '/' })