Files
shanghaigangxiangtuzhuangVUE/src/views/productManagement/workplan2.vue
qianhao.xu c7782801ac 日排程
2024-01-19 13:17:10 +08:00

602 lines
22 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="app-container">
<div>
<el-form :model="search" inline>
<el-form-item label="年">
<el-input v-model="search.year" placeholder="输入年份"></el-input>
</el-form-item>
<el-form-item label="周">
<el-input v-model="search.week" placeholder="输入周"></el-input>
</el-form-item>
<el-form-item label="零件号">
<el-input v-model="search.partnumber" placeholder="输入零件号"></el-input>
</el-form-item>
<el-form-item label="颜色">
<el-input v-model="search.color" placeholder="输入颜色名称"></el-input>
</el-form-item>
<el-button type="primary" icon="el-icon-search" @click="handleClick">搜索</el-button>
</el-form>
</div>
<el-row>
<el-col :span="1.5"> <el-button type="primary" size="mini" @click="addworkplan">新建生产计划</el-button> </el-col>
<el-col :span="1.5"> <el-button type="warning" size="mini" @click="importworkplan">导入生产计划</el-button> </el-col>
<el-col :span="1.5"> <el-button type="info" size="mini" @click="download_workplan">导出生产计划</el-button> </el-col>
<el-col :span="1.5"> <el-button type="danger" size="mini" @click="handleAllworkplan">删除本周计划</el-button> </el-col>
<el-col :span="13" style="float: right">
<el-form :model="weekAll" inline class="form_define">
<!-- 周汇总 -->
<el-form-item label="本周要货数量">
<el-tag type="success">{{ weekAll.requireNum }}</el-tag>
</el-form-item>
<el-form-item label="订单需生产挂具数量">
<el-tag type="success">{{ weekAll.requireHanger }}</el-tag>
</el-form-item>
<el-form-item label="圈数">
<el-tag type="success">{{ weekAll.turnnum }}</el-tag>
</el-form-item>
<el-form-item label="订单生产时间(分钟)">
<el-tag type="success">{{ weekAll.productiontime }}</el-tag>
</el-form-item>
</el-form></el-col
>
</el-row>
<!-- 用户导入对话框 -->
<el-dialog :title="upload.title" :visible.sync="upload.open" width="400px" append-to-body>
<el-upload
name="file"
ref="upload"
:limit="1"
accept=".xlsx, .xls"
:headers="upload.headers"
:action="upload.url + '?updateSupport=' + upload.updateSupport"
:disabled="upload.isUploading"
:on-progress="handleFileUploadProgress"
:on-success="handleFileSuccess"
:auto-upload="false"
drag
>
<i class="el-icon-upload"></i>
<div class="el-upload__text">将文件拖到此处<em>点击上传</em></div>
<div class="el-upload__tip text-center" slot="tip">
<div class="el-upload__tip" slot="tip"><el-checkbox v-model="upload.updateSupport" /> 是否更新已经存在的生产计划</div>
<span>仅允许导入xlsxlsx格式文件</span>
<el-link type="primary" :underline="false" style="font-size: 12px; vertical-align: baseline" @click="importTemplate">下载模板</el-link>
</div>
</el-upload>
<div slot="footer" class="dialog-footer">
<el-button type="primary" @click="submitFileForm"> </el-button>
<el-button @click="upload.open = false"> </el-button>
</div>
</el-dialog>
<el-dialog :title="download_.title" :visible.sync="download_.open" width="400px" append-to-body>
<el-form :model="download_.query" inline>
<el-form-item label="年">
<el-input v-model="download_.query.year" placeholder="输入年份"></el-input>
</el-form-item>
<el-form-item label="周">
<el-input v-model="download_.query.week" placeholder="输入周"></el-input>
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button type="primary" @click="submitdowm"> </el-button>
<el-button @click="download_.open = false"> </el-button>
</div>
</el-dialog>
<vxe-table
border
resizable
show-overflow
ref="xTable"
v-loading="loading_1"
height="500"
:row-config="{ isHover: true }"
:data="workplan_table_data"
>
<vxe-column type="seq" width="60"></vxe-column>
<vxe-column field="blankNum" title="毛坯号"></vxe-column>
<vxe-column field="partnumber" title="零件号"></vxe-column>
<vxe-column field="productName" title="产品描述" width="250"></vxe-column>
<vxe-column field="specification" title="规格"></vxe-column>
<vxe-column field="colorCode" title="颜色代码"></vxe-column>
<vxe-column field="requireNum" title="计划数量"></vxe-column>
<vxe-column field="qualificationRate" title="产品合格率">
<template #default="{ row }">
<span>{{ row.qualificationRate * 100 }}%</span>
</template>
</vxe-column>
<vxe-column field="everyHangerNum" title="每挂数量"></vxe-column>
<vxe-column field="productionBeat" title="生产节拍(分钟)"></vxe-column>
<vxe-column field="allHangerNum" title="总挂具数"></vxe-column>
<vxe-column field="requireHanger" title="订单需生产挂具数量"></vxe-column>
<vxe-column field="turnNumber" title="圈数"></vxe-column>
<vxe-column field="productTime" title="订单生产时间(分钟)"></vxe-column>
<vxe-column field="noSchedule" title="未排程数"></vxe-column>
<vxe-column title="操作" width="100" show-overflow>
<template #default="{ row }">
<vxe-button size="mini" type="text" status="primary" content="修改" @click="updateitem(row)"></vxe-button>
<vxe-button size="mini" type="text" status="danger" content="删除" @click="deleteitem(row)"></vxe-button>
</template>
</vxe-column>
</vxe-table>
<pagination
v-show="pagination.total > 0"
:total="pagination.total"
:page.sync="pagination.pageNum"
:limit.sync="pagination.pageSize"
@pagination="getList"
/>
<!-- 添加或修改生产计划对话框 -->
<el-dialog :title="dialog.title" :visible.sync="dialog.open" width="63%">
<el-form :model="workplanItem" :rules="rules" ref="workplan">
<el-row>
<el-col :span="8"
><el-form-item label="毛坯号" prop="blankNum"> <el-input v-model="workplanItem.blankNum" placeholder="毛坯号"></el-input> </el-form-item
></el-col>
<el-col :span="8">
<el-form-item label="零件号" prop="partnumber">
<el-input v-model="workplanItem.partnumber" placeholder="零件号"></el-input> </el-form-item
></el-col>
<el-col :span="8">
<el-form-item label="产品描述" prop="productName">
<el-input v-model="workplanItem.productName" placeholder="产品描述"></el-input>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="8">
<el-form-item label="规格" prop="specification">
<el-input v-model="workplanItem.specification" placeholder="规格"></el-input> </el-form-item
></el-col>
<el-col :span="8">
<el-form-item label="颜色代码" prop="colorCode">
<el-input v-model="workplanItem.colorCode" placeholder="颜色代码"></el-input> </el-form-item
></el-col>
<el-col :span="8">
<el-form-item label="计划数量" prop="requireNum">
<el-input v-model="workplanItem.requireNum" placeholder="计划数量" type="number"></el-input> </el-form-item
></el-col>
</el-row>
<el-row>
<el-col :span="8">
<el-form-item label="产品合格率(0.9)" prop="qualificationRate">
<el-input v-model="workplanItem.qualificationRate" placeholder="产品合格率" type="number"></el-input> </el-form-item
></el-col>
<el-col :span="8">
<el-form-item label="每挂数量" prop="everyHangerNum">
<el-input v-model="workplanItem.everyHangerNum" placeholder="每挂数量" type="number"></el-input> </el-form-item
></el-col>
<el-col :span="8">
<el-form-item label="生产节拍(分钟)" prop="productionBeat">
<el-input v-model="workplanItem.productionBeat" placeholder="生产节拍(分钟)"></el-input> </el-form-item
></el-col>
</el-row>
<el-row>
<el-col :span="8">
<el-form-item label="总挂具数" prop="allHangerNum">
<el-input v-model="workplanItem.allHangerNum" placeholder="总挂具数" type="number"></el-input>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="订单需生产挂具数量">
<el-input v-model="calculate_everyHangerNum" placeholder="订单需生产挂具数量" disabled type="number"></el-input>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="圈数"> <el-input v-model="calculate_turnNumber" placeholder="圈数" disabled></el-input> </el-form-item
></el-col>
</el-row>
<el-row>
<el-col :span="8">
<el-form-item label="订单生产时间(分钟)">
<el-input v-model="calculate_productTime" placeholder="订单生产时间(分钟)" disabled></el-input> </el-form-item
></el-col>
<el-col :span="8">
<el-form-item label="年"> <el-input v-model="workplanItem.year" placeholder="年"></el-input> </el-form-item
></el-col>
<el-col :span="8">
<el-form-item label="周次"> <el-input v-model="workplanItem.week" placeholder="周次"></el-input> </el-form-item
></el-col>
</el-row>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button type="primary" @click="submitForm"> </el-button>
<el-button @click="cancel"> </el-button>
</div>
</el-dialog>
</div>
</template>
<script>
import {
getWorkplanList,
addNewworkplan,
deleteworkplan,
updateworkplan,
handleWeekSummary,
dowmloadWorkplan,
deleteAllWorkplan,
} from '@/api/productManagement/workplan_v2.js'
import { getToken } from '@/utils/auth'
export default {
name: 'workplan2',
data() {
return {
workplan_table_data: [],
search: {
year: new Date().getFullYear(),
week: null,
partnumber: '',
color: '',
},
pagination: {
total: 0,
pageNum: 1,
pageSize: 10,
},
loading_1: true,
// 新增或者修改表格
workplanItem: {
id: '',
blankNum: '',
partnumber: '',
productName: '',
specification: '',
colorCode: '',
requireNum: null,
qualificationRate: null,
everyHangerNum: null,
productionBeat: null,
allHangerNum: null,
turnNumber: null,
productTime: null,
requireHanger: null,
year: 0,
week: 0,
},
rules: {
blankNum: [{ required: true, message: '毛坯号不能为空', trigger: 'blur' }],
partnumber: [{ required: true, message: '零件号不能为空', trigger: 'blur' }],
productName: [{ required: true, message: '产品描述不能为空', trigger: 'blur' }],
specification: [{ required: true, message: '规格不能为空', trigger: 'blur' }],
colorCode: [{ required: true, message: '颜色代码不能为空', trigger: 'blur' }],
requireNum: [{ required: true, message: '本周要货数量不能为空', trigger: 'blur' }],
qualificationRate: [{ required: true, message: '合格率不能为空', trigger: 'blur' }],
everyHangerNum: [{ required: true, message: '每挂数量不能为空', trigger: 'blur' }],
productionBeat: [{ required: true, message: '生产节拍不能为空', trigger: 'blur' }],
allHangerNum: [{ required: true, message: '总挂具数不能为空', trigger: 'blur' }],
},
//本周合计
weekAll: {
requireNum: null,
requireHanger: null,
turnnum: null,
productiontime: null,
},
// 新增修改计划模态框
dialog: {
title: '',
open: false,
form: {},
},
flag: '', //判断新增还是修改
upload: {
// 用户导入参数
// 是否显示弹出层(用户导入)
open: false,
// 弹出层标题(用户导入)
title: '',
// 是否禁用上传
isUploading: false,
// 是否更新已经存在的用户数据
updateSupport: false,
// 设置上传的请求头部
headers: { Authorization: 'Bearer ' + getToken() },
// 上传的地址
url: process.env.VUE_APP_BASE_API + '/mes/pro/workplan_v2/importData',
},
download_: {
title: '下载生产计划',
open: false,
query: {
year: 0,
week: 0,
},
},
}
},
mounted() {
this.getList()
},
computed: {
//计算 订单需生产挂具数量
calculate_everyHangerNum() {
this.workplanItem.requireHanger = (
this.workplanItem.requireNum /
this.workplanItem.everyHangerNum /
this.workplanItem.qualificationRate
).toFixed(2)
return this.workplanItem.requireHanger
},
//计算 圈数
calculate_turnNumber() {
this.workplanItem.turnNumber = (this.workplanItem.requireHanger / 170).toFixed(2)
return this.workplanItem.turnNumber
},
//计算 订单生产时间(分钟)
calculate_productTime() {
this.workplanItem.productTime = (this.workplanItem.productionBeat * this.workplanItem.requireHanger).toFixed(2)
return this.workplanItem.productTime
},
// 本周合计
// 本周要货数量
// calculate_requireNum() {
// this.workplan_table_data.forEach((item) => {
// this.weekAll.requireNum += Number(item.requireNum)
// })
// return this.weekAll.requireNum
// },
// // 订单需生产挂具数量
// calculate_requireHanger() {
// this.workplan_table_data.forEach((item) => {
// this.weekAll.requireHanger += Number(item.requireHanger)
// })
// return this.weekAll.requireHanger
// },
// // 圈数
// calculate_turnnum() {
// this.workplan_table_data.forEach((item) => {
// this.weekAll.turnnum += Number(item.turnNumber)
// })
// return this.weekAll.turnnum
// },
// //订单生产时间(分钟)
// calculate_productiontime() {
// this.workplan_table_data.forEach((item) => {
// this.weekAll.productiontime += Number(item.productTime)
// })
// return this.weekAll.productiontime
// },
},
methods: {
handleClick() {
this.getList()
this.getWeekSummary()
},
//todo 获取生产计划列表
getList() {
const query = { ...this.search, ...this.pagination }
if (query.week == null || query.week == undefined || query.week == '') query.week = -1
if (query.year == null || query.year == undefined || query.year == '') query.year = -1
getWorkplanList(query).then((res) => {
if (res.code == 200) {
this.loading_1 = false
this.workplan_table_data = res.data.item1
this.pagination.total = res.data.item2
}
})
},
//todo 新增生产计划
addworkplan() {
this.dialog.title = '新增生产计划'
this.dialog.open = true
this.flag = 'insert'
},
//todo 修改生产计划
updateitem(row) {
this.dialog.open = true
this.flag = 'update'
this.dialog.title = '修改生产计划'
this.workplanItem.id = row.id
this.workplanItem.blankNum = row.blankNum
this.workplanItem.partnumber = row.partnumber
this.workplanItem.productName = row.productName
this.workplanItem.specification = row.specification
this.workplanItem.colorCode = row.colorCode
this.workplanItem.requireNum = row.requireNum
this.workplanItem.qualificationRate = row.qualificationRate
this.workplanItem.everyHangerNum = row.everyHangerNum
this.workplanItem.productionBeat = row.productionBeat
this.workplanItem.allHangerNum = row.allHangerNum
this.workplanItem.turnNumber = row.turnNumber
this.workplanItem.productTime = row.productTime
this.workplanItem.requireHanger = row.requireHanger
this.workplanItem.year = row.year
this.workplanItem.week = row.week
},
//todo 新增或者修改 提交按钮
submitForm() {
const query = { ...this.workplanItem }
;(query.requireNum = Number(query.requireNum)),
(query.qualificationRate = Number(query.qualificationRate)),
(query.everyHangerNum = Number(query.everyHangerNum)),
(query.productionBeat = Number(query.productionBeat)),
(query.allHangerNum = Number(query.allHangerNum)),
(query.productTime = Number(query.productTime)),
(query.requireHanger = Number(query.requireHanger)),
(query.year = Number(query.year)),
(query.week = Number(query.week)),
(query.turnNumber = Number(query.turnNumber))
if (this.flag == 'insert') {
this.$refs['workplan'].validate((valid) => {
if (valid) {
addNewworkplan(query).then((res) => {
if (res.code == 200) {
this.$notify.success('新增成功')
this.getList()
this.dialog.open = false
// 清空表单
this.clearworkplanItem()
}
})
}
})
} else if (this.flag == 'update') {
this.$refs['workplan'].validate((valid) => {
if (valid) {
updateworkplan(query).then((res) => {
if (res.code == 200) {
this.$notify.success('修改成功')
this.getList()
this.dialog.open = false
// 清空表单
//this.resetForm('workplan')
this.clearworkplanItem()
}
})
}
})
}
},
//todo 清空表单
clearworkplanItem() {
Object.keys(this.workplanItem).forEach((key) => {
this.workplanItem[key] = null
})
},
//todo 返回
cancel() {
this.dialog.open = false
this.clearworkplanItem()
},
//todo 删除事件
deleteitem(row) {
this.$modal
.confirm('是否确认删除生产计划名称为' + row.partnumber + '"的数据项?')
.then(function () {
return deleteworkplan(row.id)
})
.then((res) => {
if (res.code == 200) {
if (res.data == 1) {
this.$notify.success('删除成功')
this.getList()
} else {
this.$notify.error('删除失败')
}
}
})
.catch(() => {})
},
//todo 导入文件
importworkplan() {
this.upload.open = true
this.upload.title = '生产计划导入'
},
//todo 下载模板
importTemplate() {
// @/utils/ruoyi"
this.download('/mes/pro/workplan_v2/importTemplate', '生产计划导入模板')
},
// todo 文件上传中处理
handleFileUploadProgress(event, file, fileList) {
this.upload.isUploading = true
},
//todo 提交上传文件
submitFileForm() {
this.$refs.upload.submit()
},
//todo 文件上传成功处理
handleFileSuccess(response, file, fileList) {
this.upload.open = false
this.upload.isUploading = false
this.$refs.upload.clearFiles()
if (response.code == 200) {
this.$alert(response.data, '导入结果', { dangerouslyUseHTMLString: true })
} else {
this.$alert(response.msg, '导入结果', {
dangerouslyUseHTMLString: true,
type: 'error',
})
}
this.getList()
},
//todo 获取周汇总
getWeekSummary() {
const query = {}
query.year = this.search.year
query.week = this.search.week
handleWeekSummary(query).then((res) => {
if (res.code == 200) {
this.weekAll = res.data
} else if ((res.code = 210)) {
Object.keys(this.weekAll).forEach((key) => {
this.weekAll[key] = null
})
}
})
},
//todo 下载
async submitdowm() {
this.download_.open = false
await dowmloadWorkplan(this.download_.query)
},
//todo
download_workplan() {
this.download_.open = true
this.download_.query.year = this.search.year
this.download_.query.week = this.search.week
},
//todo 删除本周计划
handleAllworkplan() {
if (this.search.week == undefined) {
return
}
const query = {
year: this.search.year,
week: this.search.week,
}
this.$modal
.confirm('是否确认删除本周所有生产计划?')
.then(function () {
return deleteAllWorkplan(query)
})
.then((res) => {
if (res.code == 200) {
if (res.data >1) {
this.$notify.success('删除成功')
this.getList()
} else {
this.$notify.error('删除失败')
}
}
})
.catch(() => {})
},
},
}
</script>
<style lang="scss" scoped>
.el-dropdown-link {
cursor: pointer;
color: #409eff;
}
.el-icon-arrow-down {
font-size: 12px;
}
.form_define ::v-deep .el-form-item__content {
height: 27.6px;
}
.form_define {
height: 37px;
}
</style>