excel导入

This commit is contained in:
qianhao.xu
2024-01-15 20:04:17 +08:00
parent 3e477195d1
commit ae1ac57d75
4 changed files with 435 additions and 21 deletions

View File

@@ -58,7 +58,8 @@
"vuedraggable": "^2.20.0",
"vuex": "3.6.0",
"vxe-table": "^3.6.13",
"xe-utils": "^3.5.11"
"xe-utils": "^3.5.11",
"xlsx": "^0.18.5"
},
"devDependencies": {
"@vue/cli-plugin-babel": "4.4.4",

View File

@@ -0,0 +1,38 @@
import request from '@/utils/request'
import { downFile } from '@/utils/request'
export function getWorkplanList(query) {
return request({
url: '/mes/pro/workplan_v2/list',
method: 'get',
params: query,
})
}
export function addNewworkplan(data) {
return request({
url: '/mes/pro/workplan_v2/addworkplan',
method: 'post',
data: data,
contextType: 'application/json',
})
}
export function deleteworkplan(id) {
return request({
url: '/mes/pro/workplan_v2/deleteitem/' + id,
method: 'get',
})
}
export function updateworkplan(data) {
return request({
url: '/mes/pro/workplan_v2/updateworkplan',
method: 'post',
data: data,
contextType: 'application/json',
})
}

View File

@@ -412,7 +412,7 @@ export default {
}
})
},
//新增按钮
//todo 新增按钮
newplan() {
this.dialog_1.open = true
this.dialog_1.title = '新增生产计划'

View File

@@ -1,43 +1,418 @@
<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="getList">搜索</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-row>
<vxe-table
border
resizable
show-overflow
ref="xTable"
v-loading="loading_1"
height="500"
:row-config="{ isHover: true }"
:data="tableData"
@cell-dblclick="cellDBLClickEvent"
:data="workplan_table_data"
>
<vxe-column type="seq" width="60"></vxe-column>
<vxe-column field="year" title="年" width="80"></vxe-column>
<vxe-column field="week" title="周" width="80"></vxe-column>
<vxe-column field="week" title="" width="80"></vxe-column>
<vxe-column field="week" title="产品名称"></vxe-column>
<vxe-column field="week" title="每挂数量"></vxe-column>
<vxe-column field="week" title="生产节拍"></vxe-column>
<vxe-column field="week" title="总挂具数"></vxe-column>
<vxe-column field="week" title="订单需生产挂具数量"></vxe-column>
<vxe-column field="week" title="实际计划数量"></vxe-column>
<vxe-column field="week" title="圈数"></vxe-column>
<vxe-column field="week" title="订单生产时间(分钟)"></vxe-column>
<vxe-column field="week" title="未排程数量"></vxe-column>
<vxe-column field="week" title="未排程数量"></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>
<vxe-button type="text" icon="vxe-icon-edit"></vxe-button>
<vxe-button type="text" icon="vxe-icon-delete"></vxe-button>
<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="dialog">
<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="产品合格率%" 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-form-item label="订单生产时间(分钟)">
<el-input v-model="calculate_productTime" placeholder="订单生产时间(分钟)" disabled></el-input>
</el-form-item>
</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>
<!-- 周汇总 -->
<el-form :model="weekAll" inline>
<el-form-item label="本周要货数量">
<el-input v-model="weekAll.requireNum" placeholder="本周要货数量" disabled></el-input>
</el-form-item>
<el-form-item label="订单需生产挂具数量">
<el-input v-model="weekAll.requireHanger" placeholder="订单需生产挂具数量" disabled></el-input>
</el-form-item>
<el-form-item label="圈数">
<el-input v-model="weekAll.turnnum" placeholder="圈数" disabled></el-input>
</el-form-item>
<el-form-item label="订单生产时间(分钟)">
<el-input v-model="weekAll.productiontime" placeholder="订单生产时间(分钟)" disabled></el-input>
</el-form-item>
</el-form>
<!-- 用户导入对话框 -->
<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>
</div>
</template>
<script>
import { getWorkplanList, addNewworkplan, deleteworkplan, updateworkplan } from '@/api/productManagement/workplan_v2.js'
export default {
name: 'workplan2',
data() {
return {
workplan_table_data: [],
search: {
year: null, // 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,
},
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: 0,
// 设置上传的请求头部
headers: { Authorization: 'Bearer ' + getToken() },
// 上传的地址
url: process.env.VUE_APP_BASE_API + '/system/user/importData',
},
}
},
mounted() {
this.getList()
},
computed: {
//计算 订单需生产挂具数量
calculate_everyHangerNum() {
this.workplanItem.requireHanger = (
this.workplanItem.requireNum /
this.workplanItem.everyHangerNum /
(this.workplanItem.qualificationRate / 100)
).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.everyHangerNum * this.workplanItem.requireHanger).toFixed(2)
return this.workplanItem.productTime
},
},
methods: {
//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
},
//todo 导入生产计划
importworkplan() {},
//todo 新增或者修改 提交按钮
submitForm() {
this.dialog.open = false
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.turnNumber = Number(query.turnNumber))
if (this.flag == 'insert') {
this.$refs['dialog'].validate((valid) => {
if (valid) {
addNewworkplan(query).then((res) => {
if (res.code == 200) {
this.$notify.success('新增成功')
this.getList()
this.dialog.open = false
}
})
}
})
} else if (this.flag == 'update') {
this.$refs['dialog'].validate((valid) => {
if (valid) {
updateworkplan(query).then((res) => {
if (res.code == 200) {
this.$notify.success('修改成功')
this.getList()
this.dialog.open = false
}
})
}
})
}
// 清空表单
this.resetForm('dialog')
},
//todo 返回
cancel() {
this.dialog.open = false
this.resetForm('dialog')
},
//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="生产计划导入"
},
},
}
</script>
<style lang="scss" scoped></style>
<style lang="scss" scoped>
.el-dropdown-link {
cursor: pointer;
color: #409eff;
}
.el-icon-arrow-down {
font-size: 12px;
}
</style>