排产看板和排查异常处理页面提交

master
zhangdi 2 weeks ago
parent f61c5c3129
commit fa82126d87
  1. 57
      src/api/processManagement/specialProcess.js
  2. 94
      src/views/processManagement/components/inPlantMaintenance.vue
  3. 66
      src/views/processManagement/taskProcessing.vue
  4. 742
      src/views/productionSchedulingPlan/schedulingDashboard/index.vue
  5. 561
      src/views/productionSchedulingPlan/schedulingException/index.vue

@ -0,0 +1,57 @@
import request from '@/axios';
// 获取列表数据 bsCraftAbility/queryAllCa
export const getList = (current, size, params) => {
return request({
url: '/blade-desk/dsSpecialPro/list',
method: 'get',
params: {
...params,
current,
size,
},
});
};
// 保存
export const add = row => {
return request({
url: '/blade-desk/dsSpecialPro/save',
method: 'post',
data: row,
});
};
// 修改
export const update = row => {
return request({
url: '/blade-desk/dsSpecialPro/update',
method: 'post',
data: row,
});
};
// 删除
export const remove = ids => {
return request({
url: '/blade-desk/dsSpecialPro/remove',
method: 'post',
params: {
ids,
},
});
};
// // 详情
// export const getDetail = Id => {
// return request({
// url: '/blade-desk/dsProModel/detail',
// method: 'get',
// params: {
// Id,
// },
// });
// };

@ -1,7 +1,7 @@
<template>
<avue-crud :option="option" :table-loading="loading" :data="data" v-model="form" v-model:page="page" ref="crud"
@row-del="rowDel" @search-change="searchChange" @search-reset="searchReset" @selection-change="selectionChange"
@current-change="currentChange" @size-change="sizeChange" @refresh-change="refreshChange" @on-load="onLoad">
@current-change="currentChange" @size-change="sizeChange" @refresh-change="refreshChange" @on-load="onLoad" @row-save="rowSave" @row-update="rowUpdate">
<template #menu-left>
<el-button type="danger" @click="handleDelete">删除
</el-button>
@ -18,6 +18,7 @@
</avue-crud>
</template>
<script>
import {getList,remove,add,update } from "@/api/processManagement/specialProcess";
export default {
data() {
return {
@ -26,7 +27,6 @@ export default {
height: 'auto',
calcHeight: 32,
tip: false,
size: 'medium',
simplePage: true,
searchShow: true,
searchMenuSpan: 12,
@ -74,7 +74,7 @@ export default {
column: [
{
label: '作业中心',
prop: 'bsWorkCenter.wcName',
prop: 'wcId',
search: true,
sortable: true,
filter: true,
@ -102,7 +102,7 @@ export default {
},
{
label: '外协厂商',
label: '产线',
prop: 'bsWorkCenter.wcName',
search: true,
sortable: true,
@ -131,7 +131,7 @@ export default {
},
{
label: '确认名称',
prop: 'condition',
prop: 'proItem',
search: false,
sortable: true,
filter: true,
@ -167,7 +167,7 @@ export default {
},
{
label: '确认到期日期',
prop: 'lastTime',
prop: 'lastDueTime',
search: false,
sortable: true,
filter: true,
@ -202,8 +202,7 @@ export default {
},
{
label: '工艺员',
prop: 'proMan.userName',
bind: 'proMan.userName',
prop: 'proMan',
search: false,
sortable: true,
filter: true,
@ -231,7 +230,7 @@ export default {
},
{
label: '备注',
prop: 'memo',
prop: 'remarks',
search: false,
sortable: true,
filter: true,
@ -251,6 +250,8 @@ export default {
currentPage: 1,
total: 0,
},
query:{},
loading:false
}
},
methods: {
@ -270,18 +271,69 @@ export default {
selectionChange(list) {
this.selectionList = list;
},
onLoad() {
this.loading = true
this.data = [
{
}
]
this.page.total = this.data.length
this.loading = false
setTimeout(() => {
this.selectionClear()
}, 500)
//
rowSave(row, done, loading) {
// add(row).then(
// res => {
// //
// const data = res.data.data;
// row.id = data.id;
// this.$message({
// type: 'success',
// message: '!',
// });
// //
// done(row);
// },
// error => {
// window.console.log(error);
// loading();
// }
// );
},
//
rowUpdate(row, index, done, loading) {
// update(row).then(
// () => {
// this.$message({
// type: 'success',
// message: '!',
// });
// //
// done(row);
// },
// error => {
// window.console.log(error);
// loading();
// }
// );
},
rowDel(row, index, done) {
this.$confirm('确定将选择数据删除?', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning',
})
.then(() => {
return remove(row.id);
})
.then(() => {
this.$message({
type: 'success',
message: '操作成功!',
});
//
done(row);
});
},
onLoad(page, params = {}) {
this.loading = true;
getList(page.currentPage, page.pageSize, Object.assign(params, this.query)).then(res => {
this.data = res.data.data.records;
this.loading = false;
this.page.total = res.data.data.total
// this.selectionClear();
});
}
}
}

@ -3,7 +3,7 @@
<avue-crud :option="option" :table-loading="loading" :data="data" v-model="form" v-model:page="page" ref="crud"
@row-del="rowDel" @search-change="searchChange" @search-reset="searchReset"
@selection-change="selectionChange" @current-change="currentChange" @size-change="sizeChange"
@refresh-change="refreshChange" @on-load="onLoad">
@refresh-change="refreshChange" @on-load="onLoad" >
<template #menu-left>
<el-button @click="addFn()" type="primary">新增任务</el-button>
</template>
@ -409,40 +409,40 @@ export default {
},
//
rowSave(row, done, loading) {
// add(row).then(
// res => {
// //
// const data = res.data.data;
// row.id = data.id;
// this.$message({
// type: 'success',
// message: '!',
// });
// //
// done(row);
// },
// error => {
// window.console.log(error);
// loading();
// }
// );
add(row).then(
res => {
//
const data = res.data.data;
row.id = data.id;
this.$message({
type: 'success',
message: '操作成功!',
});
//
done(row);
},
error => {
window.console.log(error);
loading();
}
);
},
//
rowUpdate(row, index, done, loading) {
// update(row).then(
// () => {
// this.$message({
// type: 'success',
// message: '!',
// });
// //
// done(row);
// },
// error => {
// window.console.log(error);
// loading();
// }
// );
update(row).then(
() => {
this.$message({
type: 'success',
message: '操作成功!',
});
//
done(row);
},
error => {
window.console.log(error);
loading();
}
);
},
rowDel(row, index, done) {
this.$confirm('确定将选择数据删除?', {
@ -451,7 +451,7 @@ export default {
type: 'warning',
})
.then(() => {
// return remove(row.id);
return remove(row.id);
})
.then(() => {
this.$message({

@ -0,0 +1,742 @@
<template>
<basic-container>
<avue-form :option="option" @submit="submit" @error="error">
<template #menu-form>
<el-button type="primary" icon="el-icon-search" @click="handleSubmit"> 搜索 </el-button>
<el-button icon="el-icon-delete" @click="handleSubmit"> 清空 </el-button>
</template>
</avue-form>
<div class="gantt-container">
<!-- 头部标题和图例 -->
<div class="gantt-header">
<!-- <h2>设备生产任务甘特图</h2> -->
<div class="status-legend">
<div class="legend-item">
<span class="legend-color completed"></span>
<span>已完成</span>
</div>
<div class="legend-item">
<span class="legend-color processing"></span>
<span>进行中</span>
</div>
<div class="legend-item">
<span class="legend-color pending"></span>
<span>未开始</span>
</div>
</div>
</div>
<!-- 甘特图主体 -->
<div class="gantt-wrapper">
<!-- 左侧设备列表 -->
<div class="device-list">
<div class="device-item device-item-title" :style="{ height: '36px' }">设备</div>
<div
v-for="(device, index) in devices"
:key="index"
class="device-item"
:style="{ height: rowHeight + 'px' }"
>
{{ device }}
</div>
</div>
<!-- 右侧时间轴 (时间在上刻度线在下) -->
<div class="timeline-container" @wheel.prevent="handleWheel">
<!-- 图表X轴区域时间在上刻度线在下 -->
<div class="chart-axis">
<!-- 时间标签 -->
<div class="time-labels" :style="{ width: `${timelineWidth}%` }">
<!-- 主刻度标签小时 -->
<div
v-for="(time, index) in majorTickLabels"
:key="index"
class="major-label"
:style="{ left: `${(index / 24) * 100}%` }"
>
{{ time }}
</div>
<!-- 副刻度标签30分钟放大后显示 -->
<div v-if="zoomLevel >= 2" class="minor-labels">
<div
v-for="(time, index) in minorTickLabels"
:key="index"
class="minor-label"
:style="{ left: `${(index / (24 * 2)) * 100}%` }"
>
{{ time }}
</div>
</div>
</div>
<!-- 刻度线在下方 -->
<div class="tick-lines" :style="{ width: `${timelineWidth}%` }">
<!-- 主刻度线小时 -->
<div
v-for="(time, index) in majorTickLabels"
:key="index"
class="major-tick-line"
:style="{ left: `${(index / 24) * 100}%` }"
:title="time"
></div>
<!-- 副刻度线30分钟放大后显示 -->
<div v-if="zoomLevel >= 2" class="minor-tick-lines">
<div
v-for="(time, index) in minorTickLabels"
:key="index"
class="minor-tick-line"
:style="{ left: `${(index / (24 * 2)) * 100}%` }"
:title="time"
></div>
</div>
<!-- X轴基线 -->
<div class="axis-base-line"></div>
</div>
</div>
<!-- 甘特图内容区域 -->
<div class="chart-content" :style="{ width: `${timelineWidth}%` }">
<!-- 网格线 -->
<div class="grid-lines">
<div
v-for="(time, index) in majorTickLabels"
:key="index"
class="grid-line"
:style="{ left: `${(index / 24) * 100}%` }"
></div>
</div>
<!-- 任务容器 -->
<div class="tasks-container">
<div
v-for="(device, devIndex) in devices"
:key="devIndex"
class="device-task-row"
:style="{ height: rowHeight + 'px' }"
>
<div
v-for="(task, taskIndex) in getDeviceTasks(device)"
:key="taskIndex"
class="task-bar"
:style="{
left: `${getPositionPercent(task.start)}%`,
width: `${getWidthPercent(task.start, task.end)}%`,
backgroundColor: getStatusColor(task.status),
}"
@mouseenter="showTooltip($event, task, device)"
@mouseleave="hideTooltip()"
>
<span class="task-label">{{ task.task }}</span>
</div>
</div>
</div>
</div>
</div>
</div>
<!-- 悬浮提示框 -->
<div
v-if="tooltipVisible"
class="tooltip"
:style="{
left: `${tooltipX}px`,
top: `${tooltipY}px`,
}"
>
<div class="tooltip-content">
<div><strong>设备</strong>{{ tooltipData.device }}</div>
<div><strong>任务</strong>{{ tooltipData.task }}</div>
<div><strong>时间</strong>{{ tooltipData.start }} - {{ tooltipData.end }}</div>
<div><strong>状态</strong>{{ tooltipData.status }}</div>
</div>
</div>
</div>
</basic-container>
</template>
<script>
export default {
name: 'GanttChart',
data() {
return {
rowHeight: 36,
zoomLevel: 1, // (1-4)
minZoom: 1,
maxZoom: 4,
//
devices: [
'铜合金零件化学镀镍线(9652248)',
'铜合金化学镀镍烤箱(9652248-01)',
'铜合金化学镀镍烤箱(9652248-02)',
'铜合金化学镀镍烤箱(9652248-03)',
'铝合金化学镀镍生产线(9653582)',
'铝合金化学镀镍烤箱(9653582-01)',
'铝合金化学镀镍烤箱(9653582-02)',
'铝合金化学镀镍烤箱(9653582-03)',
'铝合金化学镀镍烤箱(9653582-04)',
'镀金生产线(9652249)',
'热表线烘箱(9652249-01)',
'热表线烘箱(9652249-02)',
'热表线烘箱(9652249-03)',
'热表线烘箱(9652249-04)',
'喷漆生产线(965396)',
'喷码机(9652055)',
'喷漆生产线(965396)',
'喷码机(9652055)',
],
//
taskData: [
{
device: '铜合金零件化学镀镍线(9652248)',
task: 'WO-N261026761',
start: '00:15',
end: '08:45',
status: '已完成',
},
{
device: '铜合金零件化学镀镍线(9652248)',
task: 'WO-N261026762',
start: '09:30',
end: '12:15',
status: '已完成',
},
{
device: '铜合金零件化学镀镍线(9652248)',
task: 'WO-N261026764',
start: '13:20',
end: '16:50',
status: '已完成',
},
{
device: '铜合金零件化学镀镍线(9652248)',
task: 'WO-N261026763',
start: '16:00',
end: '18:30',
status: '进行中',
},
{
device: '铜合金零件化学镀镍线(9652248)',
task: 'WO-N2610287265',
start: '19:10',
end: '23:45',
status: '未开始',
},
{
device: '铜合金化学镀镍烤箱(9652248-01)',
task: 'WO-N261026727',
start: '09:15',
end: '11:30',
status: '已完成',
},
{
device: '铜合金化学镀镍烤箱(9652248-01)',
task: 'WO-N261026729',
start: '12:20',
end: '14:40',
status: '已完成',
},
{
device: '铜合金化学镀镍烤箱(9652248-01)',
task: 'WO-N261026721',
start: '15:50',
end: '17:20',
status: '进行中',
},
{
device: '铜合金化学镀镍烤箱(9652248-01)',
task: 'WO-N2610287244',
start: '18:10',
end: '20:30',
status: '未开始',
},
{
device: '铜合金化学镀镍烤箱(9652248-01)',
task: 'WO-N261026778',
start: '21:25',
end: '23:55',
status: '未开始',
},
{
device: '铜合金化学镀镍烤箱(9652248-01)',
task: 'WO-N2610287244',
start: '18:10',
end: '20:30',
status: '未开始',
},
{
device: '铜合金化学镀镍烤箱(9652248-01)',
task: 'WO-N261026778',
start: '21:25',
end: '23:55',
status: '未开始',
},
],
//
tooltipVisible: false,
tooltipData: {},
tooltipX: 0,
tooltipY: 0,
option: {
menuSpan: 4,
submitBtn: false,
emptyBtn: false,
menuPosition: 'right',
column: [
{
label: '设备',
prop: 'name',
span: 5,
type: 'select',
dicData: [
{
label: '车间订单',
value: 1,
},
{
label: '设备',
value: 2,
},
{
label: '班组',
value: 3,
},
],
},
{
label: '车间订单号',
prop: 'name',
span: 5,
},
{
label: '班组',
prop: 'name',
span: 5,
type: 'select',
dicData: [
{
label: '班组1',
value: 1,
},
{
label: '班组2',
value: 2,
},
{
label: '班组3',
value: 3,
},
],
},
{
label: '时间',
prop: 'name',
span: 5,
type: 'date',
},
],
},
};
},
computed: {
//
timelineWidth() {
return 100 * this.zoomLevel;
},
//
majorTickLabels() {
return Array.from({ length: 24 }, (_, i) => `${i}:00`);
},
// 30
minorTickLabels() {
const labels = [];
for (let hour = 0; hour < 24; hour++) {
labels.push(''); //
labels.push(`${hour}:30`);
}
return labels;
},
},
methods: {
//
getDeviceTasks(device) {
return this.taskData.filter(task => task.device === device);
},
//
timeToMinutes(timeStr) {
const [hours, minutes] = timeStr.split(':').map(Number);
return hours * 60 + minutes;
},
//
getPositionPercent(startTime) {
const totalMinutes = 24 * 60;
const startMinutes = this.timeToMinutes(startTime);
return (startMinutes / totalMinutes) * 100;
},
//
getWidthPercent(startTime, endTime) {
const startMinutes = this.timeToMinutes(startTime);
const endMinutes = this.timeToMinutes(endTime);
const duration = endMinutes - startMinutes;
return (duration / (24 * 60)) * 100;
},
//
getStatusColor(status) {
switch (status) {
case '已完成':
return '#28a745';
case '进行中':
return '#007bff';
case '未开始':
return '#6c757d';
default:
return '#ccc';
}
},
//
handleWheel(e) {
if (e.deltaY < 0 && this.zoomLevel < this.maxZoom) {
this.zoomLevel += 0.5;
} else if (e.deltaY > 0 && this.zoomLevel > this.minZoom) {
this.zoomLevel -= 0.5;
}
},
// //
zoomIn() {
if (this.zoomLevel < this.maxZoom) this.zoomLevel += 0.5;
},
zoomOut() {
if (this.zoomLevel > this.minZoom) this.zoomLevel -= 0.5;
},
resetZoom() {
this.zoomLevel = this.minZoom;
},
//
showTooltip(e, task, device) {
this.tooltipData = { ...task, device };
this.tooltipX = e.pageX + 10;
this.tooltipY = e.pageY + 10;
this.tooltipVisible = true;
},
hideTooltip() {
this.tooltipVisible = false;
},
},
};
</script>
<style scoped>
.gantt-container {
width: 100%;
padding: 20px;
box-sizing: border-box;
font-family: Arial, sans-serif;
}
.gantt-header {
height: 40px;
}
.zoom-controls {
display: flex;
gap: 10px;
margin-bottom: 15px;
padding-left: 265px;
align-items: center;
}
.zoom-btn {
display: flex;
align-items: center;
gap: 5px;
padding: 4px 10px;
background-color: #f1f5f9;
border: 1px solid #ddd;
border-radius: 4px;
cursor: pointer;
font-size: 12px;
transition: all 0.2s;
}
.zoom-btn:hover {
background-color: #e2e8f0;
}
.zoom-info {
font-size: 12px;
color: #666;
}
.status-legend {
display: flex;
gap: 20px;
float: right;
}
.legend-item {
display: flex;
align-items: center;
gap: 5px;
font-size: 14px;
}
.legend-color {
display: inline-block;
width: 12px;
height: 12px;
border-radius: 2px;
}
.legend-color.completed {
background-color: #28a745;
}
.legend-color.processing {
background-color: #007bff;
}
.legend-color.pending {
background-color: #6c757d;
}
.gantt-wrapper {
display: flex;
height: calc(100% - 120px);
border: 1px solid #eee;
overflow: hidden;
}
.device-list {
width: 250px;
background-color: #f8f9fa;
border-right: 1px solid #eee;
/* overflow-y: auto; */
flex-shrink: 0;
}
.device-item {
font-size: 16px;
color: #333;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
position: relative;
line-height: 36px;
padding-left: 15px;
padding-right: 15px;
&::after {
content: '';
position: absolute;
bottom: 0;
left: 0;
width: 100%;
height: 1px;
background-color: #eee;
}
}
.device-item-title {
background: var(--el-color-primary);
text-align: center;
color: #fff;
}
.timeline-container {
flex: 1;
display: flex;
flex-direction: column;
overflow: auto;
}
/* 图表X轴区域样式(时间在上,刻度线在下) */
.chart-axis {
height: 36px;
position: relative;
}
/* 时间标签容器 */
.time-labels {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 30px;
display: flex;
background-color: var(--el-color-primary);
}
/* 主刻度标签(小时) */
.major-label {
position: absolute;
top: 0;
left: 0;
/* transform: translateX(-50%); */
font-size: 16px;
color: #fff;
font-weight: 500;
white-space: nowrap;
line-height: 30px;
}
/* 副刻度标签(30分钟) */
.minor-labels {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
}
.minor-label {
position: absolute;
top: 0;
left: 0;
/* transform: translateX(-50%); */
font-size: 16px;
color: #fff;
white-space: nowrap;
line-height: 30px;
padding: 0 2px;
}
/* 刻度线容器(在下方) */
.tick-lines {
position: absolute;
bottom: 0;
left: 0;
width: 100%;
height: 6px;
background-color: var(--el-color-primary);
}
/* 主刻度线(小时) */
.major-tick-line {
position: absolute;
bottom: 0;
width: 1px;
height: 4px;
background-color: #fff;
transform: translateX(-50%);
}
/* 副刻度线(30分钟) */
.minor-tick-lines {
position: absolute;
bottom: 0;
left: 0;
width: 100%;
height: 100%;
}
.minor-tick-line {
position: absolute;
bottom: 0;
width: 1px;
height: 4px;
background-color: #fff;
transform: translateX(-50%);
}
/* X轴基线 */
.axis-base-line {
position: absolute;
bottom: 0;
left: 0;
width: 100%;
height: 1px;
background-color: #dee2e6;
}
/* 图表内容区域 */
.chart-content {
flex: 1;
position: relative;
overflow-y: auto;
}
/* 网格线样式 */
.grid-lines {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
pointer-events: none;
}
.grid-line {
position: absolute;
top: 0;
bottom: 0;
width: 0px;
background-color: #e9ecef;
}
/* 任务容器 */
.tasks-container {
position: relative;
width: 100%;
height: 100%;
}
.device-task-row {
position: relative;
border-bottom: 1px solid #e9ecef;
box-sizing: border-box;
}
.task-bar {
position: absolute;
top: 5px;
height: 26px;
border-radius: 4px;
display: flex;
align-items: center;
padding: 0 10px;
box-sizing: border-box;
cursor: pointer;
overflow: hidden;
transition: all 0.2s;
}
.task-bar:hover {
transform: translateY(-2px);
box-shadow: 0 3px 6px rgba(0, 0, 0, 0.1);
}
.task-label {
font-size: 12px;
color: white;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
/* 提示框 */
.tooltip {
position: fixed;
background-color: white;
border: 1px solid #ddd;
border-radius: 4px;
padding: 10px;
box-shadow: 0 2px 10px rgba(0, 0, 0, 0.1);
z-index: 1000;
font-size: 12px;
pointer-events: none;
}
.tooltip-content div {
margin: 3px 0;
}
</style>

@ -0,0 +1,561 @@
<template>
<basic-container>
<div class="search_box">
</div>
<avue-crud :option="option" :table-loading="loading" :data="data" v-model="form" v-model:page="page" ref="crud"
@row-del="rowDel" @search-change="searchChange" @search-reset="searchReset"
@selection-change="selectionChange" @current-change="currentChange" @size-change="sizeChange"
@refresh-change="refreshChange" @on-load="onLoad">
<template #menu-left>
<!-- <el-button type="danger" @click="batchDel()">删除</el-button> -->
</template>
<template #menu-right>
<!-- <el-button type="primary" @click="batchDel()">导入</el-button> -->
</template>
<template #menu="{ row }">
</template>
<template #heatTreat="scope">
<!-- <el-tag v-if="scope.row.afterPlating" type="success"></el-tag>
<el-tag v-else type="warning"></el-tag> -->
</template>
</avue-crud>
</basic-container>
</template>
<script>
import {
add,
getRole,
getRoleAlias,
getRoleTreeById,
grant,
grantTree,
remove,
update,
} from '@/api/system/role';
import { mapGetters } from 'vuex';
import { validatenull } from '@/utils/validate';
export default {
components: {
},
data() {
return {
inBatchesOpen: false,
platingSmallOpen: false,
planOrderArr: [],
isOpen: false,
rowItem: {},
poId: null,
form: {},
box: false,
props: {
label: 'title',
value: 'key',
},
menuGrantList: [],
dataScopeGrantList: [],
apiScopeGrantList: [],
apiGrantList: [],
menuTreeObj: [],
dataScopeTreeObj: [],
apiScopeTreeObj: [],
selectionList: [],
query: {},
loading: true,
page: {
pageSize: 10,
currentPage: 1,
total: 0,
},
option: {
columnSort: true,
tip: false,
height: 'auto',
calcHeight: 32,
simplePage: false,
searchShow: true,
searchMenuSpan: 6,
searchIcon: true,
searchIndex: 3,
tree: false,
border: true,
index: true,
selection: false,
addBtn: false,
editBtn: false,
viewBtn: false,
delBtn: false,
editBtnText: '修改',
labelWidth: 120,
menuWidth: 80,
dialogWidth: 900,
dialogClickModal: false,
searchEnter: true,
excelBtn: false,
filterBtn: true,
searchShowBtn: false,
excelBtn: true,
showOverflowTooltip: true,
addBtnIcon: ' ',
viewBtnIcon: ' ',
delBtnIcon: ' ',
editBtnIcon: ' ',
gridBtn: false,
searchLabelPosition: 'left',
searchGutter: 24,
searchSpan: 6,
menuAlign: 'left',
gridBtn: false,
searchMenuPosition: 'right',
align: 'center',
column: [
{
label: '异常原因',
prop: 'partCode',
search: false,
sortable: true,
width: 150,
span: 12,
},
{
label: '处理方式',
prop: 'partName',
search: false,
sortable: true,
width: 150,
span: 12,
},
{
label: '调度员',
prop: 'cycle',
search: false,
sortable: true,
width: 150,
span: 12,
},
{
label: '生产单号',
prop: 'material',
search: true,
sortable: true,
width: 150,
span: 12,
display: false,
},
{
label: '计划单号',
prop: 'plate',
search: false,
sortable: true,
width: 150,
span: 12,
display: false,
},
{
label: '订单优先级',
prop: 'craftWay',
search: false,
sortable: true,
width: 150,
span: 12,
display: false,
},
{
label: '零件号',
prop: 'chlidPart',
search: true,
sortable: true,
width: 150,
span: 12,
},
{
label: '零件名称',
prop: 'remindContent',
search: false,
sortable: true,
width: 150,
span: 12,
},
{
label: '产品型号',
prop: 'parameter',
search: false,
sortable: true,
width: 150,
span: 12,
},
{
label: '批次号',
prop: 'metalsTest',
search: true,
sortable: true,
width: 150,
span: 12,
},
{
label: '流程卡号',
prop: 'silverTest',
search: true,
sortable: true,
width: 150,
span: 12,
display: false,
},
{
label: '流转编码',
prop: 'heatTreat',
search: true,
sortable: true,
width: 150,
span: 12,
type: 'switch',
},
{
label: '镀种',
prop: 'afterPlating',
search: false,
sortable: true,
width: 150,
span: 12,
},
{
label: '生产标识',
prop: 'afterPlating',
search: false,
sortable: true,
width: 150,
span: 12,
},
{
label: '生产数量',
prop: 'afterPlating',
search: false,
sortable: true,
width: 150,
span: 12,
},
{
label: '面积(d㎡)',
prop: 'afterPlating',
search: false,
sortable: true,
width: 150,
span: 12,
},
{
label: '需求交期',
prop: 'afterPlating',
search: false,
sortable: true,
width: 150,
span: 12,
},
{
label: '计划下达时间',
prop: 'afterPlating',
search: false,
sortable: true,
width: 150,
span: 12,
},
{
label: '备注',
prop: 'afterPlating',
search: false,
sortable: true,
width: 150,
span: 12,
},
],
},
data: [],
isRushOpen: false,//
isBatchOpen: false,//
};
},
methods: {
//
batchReceiving() {
this.$confirm('确定将选择数据批量接收?', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning',
})
.then(() => {
// return remove(row.id);
})
.then(() => {
// this.onLoad(this.page);
// this.$message({
// type: 'success',
// message: '!',
// });
});
},
//
batchDel() {
this.$confirm('确定将选择数据批量删除?', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning',
})
.then(() => {
// return remove(row.id);
})
.then(() => {
// this.onLoad(this.page);
// this.$message({
// type: 'success',
// message: '!',
// });
});
},
//
rushFn() {
this.isRushOpen = true
},
closeDialog() {
this.isRushOpen = false
this.isBatchOpen = false
},
inBatchesFn(row) {
this.rowItem = row;
this.isBatchOpen = true;
},
subclass() {
this.platingSmallOpen = true;
},
lookProcessRoute(row) {
this.isOpen = true;
this.rowItem = row;
},
cancel(refresh) {
if (refresh) {
this.$refs.myTable.load();
}
this.inBatchesOpen = false;
this.isOpen = false;
this.planFormOpen = false;
this.platingSmallOpen = false;
},
initData(roleId) {
getRoleTreeById(roleId).then(res => {
const column = this.findObject(this.option.column, 'parentId');
column.dicData = res.data.data;
});
},
submit() {
const menuList = this.$refs.treeMenu.getCheckedKeys();
const dataScopeList = this.$refs.treeDataScope.getCheckedKeys();
const apiScopeList = this.$refs.treeApiScope.getCheckedKeys();
grant(this.idsArray, menuList, dataScopeList, apiScopeList).then(() => {
this.box = false;
this.$message({
type: 'success',
message: '操作成功!',
});
this.selectionList = [];
this.onLoad(this.page);
});
},
rowSave(row, done, loading) {
add(row).then(
() => {
this.onLoad(this.page);
this.$message({
type: 'success',
message: '操作成功!',
});
done();
},
error => {
window.console.log(error);
loading();
}
);
},
rowUpdate(row, index, done, loading) {
update(row).then(
() => {
this.onLoad(this.page);
this.$message({
type: 'success',
message: '操作成功!',
});
done();
},
error => {
window.console.log(error);
loading();
}
);
},
rowDel(row) {
this.$confirm('确定将选择数据删除?', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning',
})
.then(() => {
return remove(row.id);
})
.then(() => {
this.onLoad(this.page);
this.$message({
type: 'success',
message: '操作成功!',
});
});
},
searchReset() {
this.query = {};
this.onLoad(this.page);
},
searchChange(params, done) {
this.query = params;
this.page.currentPage = 1;
this.onLoad(this.page, params);
done();
},
selectionChange(list) {
this.selectionList = list;
},
selectionClear() {
this.selectionList = [];
this.$refs.crud.toggleSelection();
},
beforeOpen(done, type) {
if (['add', 'edit'].includes(type)) {
this.initData(this.form.id);
}
if (['edit', 'view'].includes(type)) {
if (this.form.parentId === '0') {
this.form.parentId = '';
}
}
getRoleAlias().then(res => {
const column = this.findObject(this.option.column, 'currentAlias');
column.dicData = res.data.data;
});
done();
},
handleRole() {
if (this.selectionList.length !== 1) {
this.$message.warning('只能选择一条数据');
return;
}
this.menuTreeObj = [];
this.dataScopeTreeObj = [];
this.apiScopeTreeObj = [];
grantTree().then(res => {
this.menuGrantList = res.data.data.menu;
this.dataScopeGrantList = res.data.data.dataScope;
this.apiScopeGrantList = res.data.data.apiScope;
getRole(this.ids).then(res => {
this.menuTreeObj = res.data.data.menu;
this.dataScopeTreeObj = res.data.data.dataScope;
this.apiScopeTreeObj = res.data.data.apiScope;
this.box = true;
});
});
},
handleRowRole(row) {
this.menuTreeObj = [];
this.dataScopeTreeObj = [];
this.apiScopeTreeObj = [];
grantTree().then(res => {
this.menuGrantList = res.data.data.menu;
this.dataScopeGrantList = res.data.data.dataScope;
this.apiScopeGrantList = res.data.data.apiScope;
getRole(row.id).then(res => {
this.menuTreeObj = res.data.data.menu;
this.dataScopeTreeObj = res.data.data.dataScope;
this.apiScopeTreeObj = res.data.data.apiScope;
this.selectionList.push(row);
this.box = true;
});
});
},
handleDelete() {
if (this.selectionList.length === 0) {
this.$message.warning('请选择至少一条数据');
return;
}
this.$confirm('确定将选择数据删除?', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning',
})
.then(() => {
return remove(this.ids);
})
.then(() => {
this.onLoad(this.page);
this.$message({
type: 'success',
message: '操作成功!',
});
this.$refs.crud.toggleSelection();
});
},
currentChange(currentPage) {
this.page.currentPage = currentPage;
},
sizeChange(pageSize) {
this.page.pageSize = pageSize;
},
refreshChange() {
this.onLoad(this.page, this.query);
},
handleChange(file, fileList) {
// proxy.$Export.xlsx(file.raw).then((data) => {
// data.value = data.results;
// });
this.$message({
type: 'success',
message: '操作成功!',
});
},
onLoad(page, params = {}) {
this.loading = true;
this.data = [
]
this.page.total = this.data.length
// getList(page.currentPage, page.pageSize, Object.assign(params, this.query)).then(res => {
// this.data = res.data.data.records;
this.loading = false;
// this.page.total = res.data.data.total
// this.selectionClear();
// });
},
},
mounted() {
}
};
</script>
Loading…
Cancel
Save