feat(物料管理): 添加MRP清单功能模块
新增MRP清单管理页面及相关API接口,包括: 1. 添加mmMrpManagement.js API文件,提供MRP清单查询和生成接口 2. 创建MrpList.vue和WorkOrder.vue视图组件 3. 配置vue.config.js代理规则对接总成MES系统 4. 移除废弃的production_track.vue文件
This commit is contained in:
203
src/views/materialManagement/mmMrpManagement/MrpList.vue
Normal file
203
src/views/materialManagement/mmMrpManagement/MrpList.vue
Normal file
@@ -0,0 +1,203 @@
|
||||
<!--
|
||||
* @Descripttion: (MRP清单)
|
||||
* @Author: (admin)
|
||||
* @Date: (2025-08-13)
|
||||
-->
|
||||
<template>
|
||||
<div>
|
||||
<el-form :model="queryParams" label-position="right" inline ref="queryRef" v-show="showSearch" @submit.prevent>
|
||||
<el-form-item label="线别" prop="lineCode">
|
||||
<el-select v-model="queryParams.lineCode" placeholder="请选择线别">
|
||||
<el-option label="全部" value=""></el-option>
|
||||
<el-option v-for="line in lineOptions" :key="line.value" :label="line.label" :value="line.value"></el-option>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item label="日期" prop="workOrderDate">
|
||||
<el-date-picker v-model="queryParams.workOrderDate" :clearable="false" type="date"
|
||||
placeholder="选择日期"></el-date-picker>
|
||||
</el-form-item>
|
||||
<el-form-item>
|
||||
<el-button icon="search" type="primary" @click="handleQuery">搜索</el-button>
|
||||
<el-button icon="refresh" @click="resetQuery">重置</el-button>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
<!-- 工具区域 -->
|
||||
<el-row :gutter="15" class="mb10">
|
||||
<el-col :span="1.5">
|
||||
<el-button type="primary" plain @click="openGenerateMrpDialog">手动更新MRP清单
|
||||
</el-button>
|
||||
</el-col>
|
||||
<right-toolbar :show-search.sync="showSearch" @queryTable="getList" :columns="columns"></right-toolbar>
|
||||
</el-row>
|
||||
|
||||
<el-table :data="dataList" v-loading="loading" ref="table" border header-cell-class-name="el-table-header-cell"
|
||||
highlight-current-row @sort-change="sortChange">
|
||||
<el-table-column type="index" width="50" align="center" />
|
||||
<el-table-column prop="lineCode" label="线别" align="center" />
|
||||
<el-table-column prop="materialCode" label="物料编号" align="center" />
|
||||
<el-table-column prop="materialName" label="物料名称" align="center" />
|
||||
<el-table-column prop="quantity" label="数量" align="center" />
|
||||
<el-table-column prop="createdBy" label="创建人" align="center" />
|
||||
<el-table-column prop="createdTime" label="创建时间" />
|
||||
</el-table>
|
||||
<pagination :total="total" :page.sync="queryParams.pageNum" :limit.sync="queryParams.pageSize"
|
||||
@pagination="getList" />
|
||||
<!-- 生成MRP清单对话框 -->
|
||||
<el-dialog :title="'手动更新MRP清单'" :lock-scroll="false" :visible.sync="generateMrpOpen">
|
||||
<el-form ref="mrpFormRef" :model="mrpForm" :rules="mrpRules" label-width="100px">
|
||||
<el-row :gutter="20">
|
||||
<el-col :lg="24">
|
||||
<el-form-item label="线别" prop="lineCode">
|
||||
<el-select v-model="mrpForm.lineCode" placeholder="请选择线别" style="width: 100%">
|
||||
<el-option v-for="line in lineOptions" :key="line.value" :label="line.label"
|
||||
:value="line.value"></el-option>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :lg="24">
|
||||
<el-form-item label="日期" prop="workOrderDate">
|
||||
<el-date-picker v-model="mrpForm.workOrderDate" :clearable="false" type="date" placeholder="选择日期"
|
||||
style="width: 100%"></el-date-picker>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
</el-row>
|
||||
</el-form>
|
||||
<div slot="footer" class="dialog-footer">
|
||||
<el-button @click="cancelGenerateMrp">取消</el-button>
|
||||
<el-button type="primary" @click="submitGenerateMrp">提交</el-button>
|
||||
</div>
|
||||
</el-dialog>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import {
|
||||
listMmMrp, GenerateLineMmMrp
|
||||
}
|
||||
from '@/api/materialManagement/mmMrpManagement.js'
|
||||
|
||||
export default {
|
||||
name: 'mmMrpManagement',
|
||||
data() {
|
||||
// 线别选项 (1-28)
|
||||
const lineOptions = []
|
||||
for (let i = 1; i <= 28; i++) {
|
||||
lineOptions.push({
|
||||
value: i.toString(),
|
||||
label: `线别${i}`
|
||||
})
|
||||
}
|
||||
|
||||
return {
|
||||
ids: [],
|
||||
loading: false,
|
||||
showSearch: true,
|
||||
queryParams: {
|
||||
pageNum: 1,
|
||||
pageSize: 10,
|
||||
lineCode: '',
|
||||
workOrderDate: '',
|
||||
sort: '',
|
||||
sortType: 'asc',
|
||||
},
|
||||
lineOptions: lineOptions,
|
||||
columns: [],
|
||||
total: 0,
|
||||
dataList: [],
|
||||
queryRef: null,
|
||||
// 生成MRP相关
|
||||
generateMrpOpen: false,
|
||||
mrpFormRef: null,
|
||||
mrpForm: {
|
||||
lineCode: '1',
|
||||
workOrderDate: this.$dayjs().format('YYYY-MM-DD') // 默认今天
|
||||
},
|
||||
mrpRules: {
|
||||
lineCode: [{ required: true, message: '请选择线别', trigger: 'change' }],
|
||||
workOrderDate: [{ required: true, message: '请选择日期', trigger: 'change' }]
|
||||
}
|
||||
}
|
||||
},
|
||||
created() {
|
||||
this.queryParams.workOrderDate = this.$dayjs().format('YYYY-MM-DD')
|
||||
this.getList()
|
||||
},
|
||||
methods: {
|
||||
getList() {
|
||||
this.loading = true
|
||||
let params = { ...this.queryParams }
|
||||
params.workOrderDate = this.$dayjs(params.workOrderDate).format('YYYY-MM-DD')
|
||||
listMmMrp(params).then(res => {
|
||||
const { code, data } = res
|
||||
if (code == 200) {
|
||||
this.dataList = data.result
|
||||
this.total = data.totalNum
|
||||
this.loading = false
|
||||
}
|
||||
})
|
||||
},
|
||||
// 查询
|
||||
handleQuery() {
|
||||
this.queryParams.pageNum = 1
|
||||
this.getList()
|
||||
},
|
||||
// 重置查询操作
|
||||
resetQuery() {
|
||||
this.resetForm("queryRef")
|
||||
// 重置为默认线别和今天日期
|
||||
this.queryParams.lineCode = '1'
|
||||
this.queryParams.workOrderDate = this.$dayjs().format('YYYY-MM-DD')
|
||||
this.handleQuery()
|
||||
},
|
||||
// 自定义排序
|
||||
sortChange(column) {
|
||||
var sort = undefined
|
||||
var sortType = undefined
|
||||
|
||||
if (column.prop != null && column.order != null) {
|
||||
sort = column.prop
|
||||
sortType = column.order
|
||||
}
|
||||
this.queryParams.sort = sort
|
||||
this.queryParams.sortType = sortType
|
||||
this.handleQuery()
|
||||
},
|
||||
// 打开生成MRP对话框
|
||||
openGenerateMrpDialog() {
|
||||
this.generateMrpOpen = true
|
||||
// 重置表单
|
||||
this.mrpForm.lineCode = '1'
|
||||
this.mrpForm.workOrderDate = this.$dayjs().format('YYYY-MM-DD')
|
||||
this.resetForm("mrpFormRef")
|
||||
},
|
||||
// 关闭生成MRP对话框
|
||||
cancelGenerateMrp() {
|
||||
this.generateMrpOpen = false
|
||||
},
|
||||
// 提交生成MRP
|
||||
submitGenerateMrp() {
|
||||
this.$refs["mrpFormRef"].validate((valid) => {
|
||||
if (valid) {
|
||||
this.loading = true
|
||||
let params = { ...this.mrpForm }
|
||||
params.workOrderDate = this.$dayjs(params.workOrderDate).format('YYYY-MM-DD')
|
||||
|
||||
GenerateLineMmMrp(params).then(res => {
|
||||
this.loading = false
|
||||
if (res.code == 200) {
|
||||
this.$modal.msgSuccess('生成MRP清单成功')
|
||||
this.generateMrpOpen = false
|
||||
this.getList()
|
||||
} else {
|
||||
this.$modal.msgError(res.msg || '生成失败')
|
||||
}
|
||||
}).catch(() => {
|
||||
this.loading = false
|
||||
this.$modal.msgError('生成失败')
|
||||
})
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
208
src/views/materialManagement/mmMrpManagement/WorkOrder.vue
Normal file
208
src/views/materialManagement/mmMrpManagement/WorkOrder.vue
Normal file
@@ -0,0 +1,208 @@
|
||||
<!--
|
||||
* @Descripttion: (总成生产工单)
|
||||
* @Author: (admin)
|
||||
* @Date: (2025-08-13)
|
||||
-->
|
||||
<template>
|
||||
<div>
|
||||
<el-form :model="queryParams" label-position="right" inline ref="queryRef" v-show="showSearch" @submit.prevent>
|
||||
<div>
|
||||
<el-form-item label="工单日期" prop="workorderDate">
|
||||
<el-date-picker v-model="queryParams.workorderDate" type="daterange" range-separator="到"
|
||||
start-placeholder="开始时间" end-placeholder="结束时间" :clearable="false" placeholder="请选择工单日期区间" />
|
||||
</el-form-item>
|
||||
<!-- <el-form-item label="组别" prop="groupCode">
|
||||
<el-select v-model="queryParams.groupCode" placeholder="全部">
|
||||
<el-option label="全部" value="" />
|
||||
<el-option v-for="(item, index) in allGroupOptions" :key="index" :label="item.label"
|
||||
:value="item.value" />
|
||||
</el-select>
|
||||
</el-form-item> -->
|
||||
<el-form-item label="线别" prop="lineCode">
|
||||
<el-select v-model="queryParams.lineCode" placeholder="全部">
|
||||
<el-option label="全部" value="" />
|
||||
<el-option v-for="(item, index) in allRouteOptions" :key="index" :label="item.label"
|
||||
:value="item.value" />
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
</div>
|
||||
<el-form-item label="工单号" prop="workorder">
|
||||
<el-input v-model.trim="queryParams.workorder" clearable placeholder="请输入工单号" />
|
||||
</el-form-item>
|
||||
<el-form-item label="产品名称" prop="productionName">
|
||||
<el-input v-model.trim="queryParams.productionName" clearable placeholder="请输入产品名称" />
|
||||
</el-form-item>
|
||||
<el-form-item>
|
||||
<el-button icon="search" type="primary" @click="handleQuery">搜索</el-button>
|
||||
<el-button icon="refresh" @click="resetQuery">重置</el-button>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
<!-- 工具区域 -->
|
||||
<el-row :gutter="15" class="mb10">
|
||||
<right-toolbar v-model:showSearch="showSearch" @queryTable="getList" :columns="columns"></right-toolbar>
|
||||
</el-row>
|
||||
|
||||
<el-table :data="dataList" v-loading="loading" ref="table" border stripe size="small"
|
||||
header-row-class-name="table-header" @sort-change="sortChange">
|
||||
<el-table-column type="index" width="50" align="center" />
|
||||
<el-table-column prop="workorder" label="工单号" width="160" align="center">
|
||||
</el-table-column>
|
||||
<el-table-column prop="productionName" label="产品名称" min-width="200" align="center" />
|
||||
<el-table-column prop="productionCode" label="物料编号" width="160" align="center"></el-table-column>
|
||||
<el-table-column prop="specification" label="规格" width="160" align="center" />
|
||||
<el-table-column prop="deliveryNum" label="计划数量" align="center" />
|
||||
<el-table-column prop="unit" label="单位" align="center" />
|
||||
<el-table-column prop="lineCode" label="线别" align="center" />
|
||||
<el-table-column prop="groupCode" label="组别" align="center" />
|
||||
<el-table-column prop="isCarton" label="是否纸箱" align="center">
|
||||
</el-table-column>
|
||||
<el-table-column prop="packageCapacity" label="装箱数量" align="center" />
|
||||
<el-table-column prop="workorderDate" label="工单日期" align="center" min-width="140">
|
||||
<template #default="scope">
|
||||
<span v-if="scope.row.workorderDate != '' && scope.row.workorderDate != null">{{
|
||||
$dayjs(scope.row.workorderDate).format('YYYY-MM-DD') }}</span>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column prop="status" label="工单状态" align="center">
|
||||
</el-table-column>
|
||||
<el-table-column prop="beat" label="节拍" align="center" />
|
||||
<el-table-column prop="remark" label="备注" align="center" />
|
||||
<el-table-column prop="createdBy" label="创建人" align="center" />
|
||||
<el-table-column prop="createdTime" label="创建时间" />
|
||||
<el-table-column prop="updatedBy" label="更新人" align="center" />
|
||||
<el-table-column prop="updatedTime" label="更新时间" />
|
||||
</el-table>
|
||||
<pagination :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize"
|
||||
@pagination="getList" />
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import {
|
||||
listProWorkorderNoCheck,
|
||||
GetAllRoute,
|
||||
GetAllGroup
|
||||
} from '@/api/materialManagement/mmMrpManagement.js'
|
||||
|
||||
export default {
|
||||
name: 'WorkOrder',
|
||||
data() {
|
||||
return {
|
||||
ids: [],
|
||||
loading: false,
|
||||
showSearch: true,
|
||||
queryParams: {
|
||||
pageNum: 1,
|
||||
pageSize: 50,
|
||||
lineCode: '',
|
||||
groupCode: '',
|
||||
workorderDate: [this.$dayjs(), this.$dayjs()],
|
||||
status: -1,
|
||||
sort: 'sort',
|
||||
sortType: 'asc'
|
||||
},
|
||||
columns: [],
|
||||
total: 0,
|
||||
dataList: [],
|
||||
defaultTime: [this.$dayjs(), this.$dayjs()],
|
||||
dictParams: {
|
||||
isCarton: [],
|
||||
statusOptions: []
|
||||
},
|
||||
allList: [],
|
||||
allRouteOptions: [],
|
||||
allGroupOptions: [],
|
||||
}
|
||||
},
|
||||
created() {
|
||||
this.getAllRouteOptions()
|
||||
this.getAllGroupSelectOptions()
|
||||
this.getList()
|
||||
},
|
||||
methods: {
|
||||
// =========== 获取所有线别 ==========
|
||||
getAllRouteOptions() {
|
||||
GetAllRoute().then((res) => {
|
||||
if (res.code === 200) {
|
||||
this.allRouteOptions = res.data.map((item) => {
|
||||
return {
|
||||
id: item.id,
|
||||
label: `${item.code}-${item.name}`,
|
||||
value: `${item.code}`
|
||||
}
|
||||
})
|
||||
}
|
||||
})
|
||||
},
|
||||
// ==================================
|
||||
|
||||
// =========== 获取所有组别 ==========
|
||||
getAllGroupSelectOptions() {
|
||||
GetAllGroup().then((res) => {
|
||||
if (res.code === 200) {
|
||||
this.allGroupOptions = res.data.map((item) => {
|
||||
return {
|
||||
id: item.id,
|
||||
label: `${item.groupCode}-${item.groupName}`,
|
||||
value: `${item.groupCode}`
|
||||
}
|
||||
})
|
||||
}
|
||||
})
|
||||
},
|
||||
// ==================================
|
||||
|
||||
// 不校验搜索
|
||||
getList() {
|
||||
this.loading = true
|
||||
listProWorkorderNoCheck(this.queryParams).then((res) => {
|
||||
const { code, data } = res
|
||||
if (code == 200) {
|
||||
this.dataList = data.result
|
||||
this.total = data.totalNum
|
||||
this.loading = false
|
||||
}
|
||||
})
|
||||
let allData = JSON.parse(JSON.stringify(this.queryParams))
|
||||
allData.pageNum = 1
|
||||
allData.pageSize = 10000
|
||||
listProWorkorderNoCheck(allData).then((res) => {
|
||||
const { code, data } = res
|
||||
if (code == 200) {
|
||||
this.allList = data.result
|
||||
}
|
||||
})
|
||||
},
|
||||
|
||||
// 查询
|
||||
handleQuery() {
|
||||
this.queryParams.pageNum = 1
|
||||
this.getList()
|
||||
},
|
||||
|
||||
// 重置查询操作
|
||||
resetQuery() {
|
||||
this.$refs.queryRef.resetFields()
|
||||
this.handleQuery()
|
||||
},
|
||||
// 自定义排序
|
||||
sortChange(column) {
|
||||
var sort = undefined
|
||||
var sortType = undefined
|
||||
|
||||
if (column.prop != null && column.order != null) {
|
||||
sort = column.prop
|
||||
sortType = column.order
|
||||
}
|
||||
this.queryParams.sort = sort
|
||||
this.queryParams.sortType = sortType
|
||||
this.handleQuery()
|
||||
},
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style scoped>
|
||||
|
||||
|
||||
</style>
|
||||
Reference in New Issue
Block a user