You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

320 lines
12 KiB
Vue

<template>
<div class="app-container">
<!-- 搜索表单 -->
<el-form :model="queryParams" ref="queryForm" size="small" :inline="true" class="search-form">
<el-form-item label="设备编号" prop="deviceCode">
<el-input v-model="queryParams.deviceCode" placeholder="请输入设备编号" clearable @keyup.enter.native="handleQuery" />
</el-form-item>
<el-form-item label="执行状态" prop="executionStatus">
<el-select v-model="queryParams.executionStatus" placeholder="请选择执行状态" clearable>
<el-option label="待执行" value="PENDING" />
<el-option label="运行中" value="RUNNING" />
<el-option label="已完成" value="COMPLETED" />
<el-option label="已暂停" value="PAUSED" />
</el-select>
</el-form-item>
<el-form-item>
<el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
<el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
</el-form-item>
</el-form>
<!-- 工单列表 -->
<el-table v-loading="loading" :data="orderList" border>
<el-table-column label="工单编号" prop="orderCode" width="150" />
<el-table-column label="物料名称" prop="materialName" show-overflow-tooltip />
<el-table-column label="计划数量" prop="orderAmount" width="100" align="center" />
<el-table-column label="完工数量" prop="actualCompleteQty" width="100" align="center">
<template slot-scope="scope">
<span>{{ scope.row.actualCompleteQty || 0 }}</span>
</template>
</el-table-column>
<el-table-column label="不良数量" prop="actualDefectQty" width="100" align="center">
<template slot-scope="scope">
<span>{{ scope.row.actualDefectQty || 0 }}</span>
</template>
</el-table-column>
<el-table-column label="执行状态" prop="executionStatus" width="100" align="center">
<template slot-scope="scope">
<el-tag :type="getStatusType(scope.row.executionStatus)">
{{ getStatusText(scope.row.executionStatus) }}
</el-tag>
</template>
</el-table-column>
<el-table-column label="操作员" prop="executionOperator" width="100" align="center" />
<el-table-column label="开始时间" prop="startTime" width="160" align="center" />
<el-table-column label="操作" width="280" fixed="right" align="center">
<template slot-scope="scope">
<el-button
v-if="!scope.row.executionStatus || scope.row.executionStatus === 'PENDING'"
size="mini"
type="primary"
@click="handleStart(scope.row)"
>开始生产</el-button>
<el-button
v-if="scope.row.executionStatus === 'RUNNING'"
size="mini"
type="warning"
@click="handleUpdateQty(scope.row)"
>更新数量</el-button>
<el-button
v-if="scope.row.executionStatus === 'RUNNING'"
size="mini"
type="success"
@click="handleComplete(scope.row)"
>完工提报</el-button>
<el-button
size="mini"
type="info"
@click="handleDetail(scope.row)"
>详情</el-button>
</template>
</el-table-column>
</el-table>
<!-- 分页 -->
<pagination
v-show="total > 0"
:total="total"
:page.sync="queryParams.pageNum"
:limit.sync="queryParams.pageSize"
@pagination="getList"
/>
<!-- 开始生产对话框 -->
<el-dialog title="开始生产" :visible.sync="startDialogVisible" width="400px" append-to-body>
<el-form :model="startForm" label-width="80px">
<el-form-item label="工单编号">
<el-input v-model="startForm.orderCode" disabled />
</el-form-item>
<el-form-item label="物料名称">
<el-input v-model="startForm.materialName" disabled />
</el-form-item>
<el-form-item label="操作员">
<el-input v-model="startForm.operator" placeholder="请输入操作员" />
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button @click="startDialogVisible = false">取 消</el-button>
<el-button type="primary" @click="confirmStart">确 定</el-button>
</div>
</el-dialog>
<!-- 更新数量对话框 -->
<el-dialog title="更新完工数量" :visible.sync="updateQtyDialogVisible" width="400px" append-to-body>
<el-form :model="updateForm" label-width="80px">
<el-form-item label="工单编号">
<el-input v-model="updateForm.orderCode" disabled />
</el-form-item>
<el-form-item label="计划数量">
<el-input v-model="updateForm.planQty" disabled />
</el-form-item>
<el-form-item label="完工数量">
<el-input-number v-model="updateForm.completeQty" :min="0" style="width: 100%" />
</el-form-item>
<el-form-item label="不良数量">
<el-input-number v-model="updateForm.defectQty" :min="0" style="width: 100%" />
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button @click="updateQtyDialogVisible = false">取 消</el-button>
<el-button type="primary" @click="confirmUpdateQty">确 定</el-button>
</div>
</el-dialog>
<!-- 完工提报对话框 -->
<el-dialog title="完工提报" :visible.sync="completeDialogVisible" width="400px" append-to-body>
<el-form :model="completeForm" label-width="80px">
<el-form-item label="工单编号">
<el-input v-model="completeForm.orderCode" disabled />
</el-form-item>
<el-form-item label="计划数量">
<el-input v-model="completeForm.planQty" disabled />
</el-form-item>
<el-form-item label="完工数量">
<el-input-number v-model="completeForm.completeQty" :min="0" style="width: 100%" />
</el-form-item>
<el-form-item label="不良数量">
<el-input-number v-model="completeForm.defectQty" :min="0" style="width: 100%" />
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button @click="completeDialogVisible = false">取 消</el-button>
<el-button type="success" @click="confirmComplete">完工提报</el-button>
</div>
</el-dialog>
<!-- 工单详情对话框 -->
<el-dialog title="工单详情" :visible.sync="detailDialogVisible" width="600px" append-to-body>
<el-descriptions :column="2" border>
<el-descriptions-item label="工单编号">{{ detailOrder.orderCode }}</el-descriptions-item>
<el-descriptions-item label="物料编码">{{ detailOrder.materialCode }}</el-descriptions-item>
<el-descriptions-item label="物料名称" :span="2">{{ detailOrder.materialName }}</el-descriptions-item>
<el-descriptions-item label="计划数量">{{ detailOrder.orderAmount }}</el-descriptions-item>
<el-descriptions-item label="执行状态">
<el-tag :type="getStatusType(detailOrder.executionStatus)">
{{ getStatusText(detailOrder.executionStatus) }}
</el-tag>
</el-descriptions-item>
<el-descriptions-item label="完工数量">{{ detailOrder.actualCompleteQty || 0 }}</el-descriptions-item>
<el-descriptions-item label="不良数量">{{ detailOrder.actualDefectQty || 0 }}</el-descriptions-item>
<el-descriptions-item label="操作员">{{ detailOrder.executionOperator || '-' }}</el-descriptions-item>
<el-descriptions-item label="设备编号">{{ detailOrder.deviceCode || '-' }}</el-descriptions-item>
<el-descriptions-item label="开始时间">{{ detailOrder.startTime || '-' }}</el-descriptions-item>
<el-descriptions-item label="完工时间">{{ detailOrder.finishTime || '-' }}</el-descriptions-item>
</el-descriptions>
<div slot="footer" class="dialog-footer">
<el-button @click="detailDialogVisible = false"> </el-button>
</div>
</el-dialog>
</div>
</template>
<script>
import { listOrderInfo, startProduction, completeProduction, updateQuantity } from "@/api/base/orderInfo";
export default {
name: "OrderExecution",
data() {
return {
loading: false,
total: 0,
orderList: [],
queryParams: {
pageNum: 1,
pageSize: 10,
deviceCode: null,
executionStatus: null
},
startDialogVisible: false,
updateQtyDialogVisible: false,
completeDialogVisible: false,
detailDialogVisible: false,
startForm: {
orderCode: '',
materialName: '',
operator: ''
},
updateForm: {
orderCode: '',
planQty: 0,
completeQty: 0,
defectQty: 0
},
completeForm: {
orderCode: '',
planQty: 0,
completeQty: 0,
defectQty: 0
},
detailOrder: {}
};
},
created() {
this.getList();
},
methods: {
getList() {
this.loading = true;
listOrderInfo(this.queryParams)
.then(response => {
const data = response && response.data ? response.data : response;
if (Array.isArray(data)) {
this.orderList = data;
this.total = data.length;
} else {
this.orderList = (data && data.rows) ? data.rows : [];
this.total = (data && data.total) ? data.total : this.orderList.length;
}
})
.catch(() => {
this.orderList = [];
this.total = 0;
})
.finally(() => {
this.loading = false;
});
},
handleQuery() {
this.queryParams.pageNum = 1;
this.getList();
},
resetQuery() {
this.resetForm("queryForm");
this.handleQuery();
},
getStatusType(status) {
const map = { 'RUNNING': 'warning', 'COMPLETED': 'success', 'PAUSED': 'info', 'PENDING': '' };
return map[status] || '';
},
getStatusText(status) {
const map = { 'RUNNING': '运行中', 'COMPLETED': '已完成', 'PAUSED': '已暂停', 'PENDING': '待执行' };
return map[status] || '待执行';
},
handleStart(row) {
this.startForm = {
orderCode: row.orderCode,
materialName: row.materialName,
operator: this.$store.state.user.name || ''
};
this.startDialogVisible = true;
},
confirmStart() {
if (!this.startForm.operator) {
this.$modal.msgWarning("请输入操作员");
return;
}
startProduction(this.startForm.orderCode, this.startForm.operator).then(response => {
this.$modal.msgSuccess("开始生产成功");
this.startDialogVisible = false;
this.getList();
});
},
handleUpdateQty(row) {
this.updateForm = {
orderCode: row.orderCode,
planQty: row.orderAmount,
completeQty: row.actualCompleteQty || 0,
defectQty: row.actualDefectQty || 0
};
this.updateQtyDialogVisible = true;
},
confirmUpdateQty() {
updateQuantity(this.updateForm.orderCode, this.updateForm.completeQty, this.updateForm.defectQty).then(response => {
this.$modal.msgSuccess("更新数量成功");
this.updateQtyDialogVisible = false;
this.getList();
});
},
handleComplete(row) {
this.completeForm = {
orderCode: row.orderCode,
planQty: row.orderAmount,
completeQty: row.actualCompleteQty || 0,
defectQty: row.actualDefectQty || 0
};
this.completeDialogVisible = true;
},
confirmComplete() {
this.$modal.confirm('确认完工提报?完工后工单状态将变为已完成').then(() => {
completeProduction(this.completeForm.orderCode, this.completeForm.completeQty, this.completeForm.defectQty).then(response => {
this.$modal.msgSuccess("完工提报成功");
this.completeDialogVisible = false;
this.getList();
});
});
},
handleDetail(row) {
this.detailOrder = row;
this.detailDialogVisible = true;
}
}
};
</script>
<style scoped>
.search-form {
margin-bottom: 15px;
}
</style>