Files
zhongxinmes-IMPM-UI/src/views/mes/wm/rtissue/index.vue
2025-07-09 08:58:29 +08:00

580 lines
21 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.

/*
2024 12 16
Name:"生产退料父组件"
*/
<template>
<div class="app-container">
<el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="90px">
<el-form-item label="退料单编号" prop="rtCode">
<el-input v-model="queryParams.rtCode" placeholder="请输入退料单编号" clearable @keyup.enter.native="handleQuery" />
</el-form-item>
<el-form-item label="生产工单" prop="workorderCode">
<el-input v-model="queryParams.workorderCode" placeholder="请输入生产工单编号" clearable
@keyup.enter.native="handleQuery" />
</el-form-item>
<el-form-item label="仓库名称" prop="warehouseName">
<el-input v-model="queryParams.warehouseName" placeholder="请输入仓库名称" clearable
@keyup.enter.native="handleQuery" />
</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-row :gutter="10" class="mb8">
<el-col :span="1.5">
<el-button type="primary" plain icon="el-icon-plus" size="mini" @click="handleAdd"
v-hasPermi="['mes:wm:rtissue:add']">新增</el-button>
</el-col>
<el-col :span="1.5">
<el-button type="success" plain icon="el-icon-edit" size="mini" :disabled="single" @click="handleUpdate"
v-hasPermi="['mes:wm:rtissue:edit']">修改</el-button>
</el-col>
<el-col :span="1.5">
<el-button type="danger" plain icon="el-icon-delete" size="mini" :disabled="multiple" @click="handleDelete"
v-hasPermi="['mes:wm:rtissue:remove']">删除</el-button>
</el-col>
<right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
</el-row>
<el-table v-loading="loading" :data="rtissueList" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" align="center" />
<el-table-column label="退料单编号" width="140px" align="center" prop="rtCode">
<template slot-scope="scope">
<el-button type="text" @click="handleView(scope.row)" v-hasPermi="['mes:wm:rtissue:query']">{{
scope.row.rtCode }}</el-button>
</template>
</el-table-column>
<el-table-column label="退料单名称" width="120px" align="center" prop="rtName" :show-overflow-tooltip="true" />
<el-table-column label="生产工单" width="140px" align="center" prop="workorderCode" />
<el-table-column label="仓库名称" align="center" prop="warehouseName" />
<el-table-column label="库区名称" width="100px" align="center" prop="locationName" />
<el-table-column label="库位名称" align="center" prop="areaName" />
<el-table-column label="退料日期" align="center" prop="rtDate" width="120">
<template slot-scope="scope">
<span>{{ parseTime(scope.row.rtDate, '{y}-{m}-{d}') }}</span>
</template>
</el-table-column>
<el-table-column label="单据状态" align="center" prop="status">
<template slot-scope="scope">
<dict-tag :options="dict.type.mes_order_status" :value="scope.row.status" />
</template>
</el-table-column>
<el-table-column label="操作" width="150px" align="center" class-name="small-padding fixed-width">
<template slot-scope="scope">
<el-button size="mini" type="text" icon="el-icon-video-play" v-if="scope.row.status == 'PREPARE'"
@click="handleExecute(scope.row)" v-hasPermi="['mes:wm:rtissue:edit']">执行退料</el-button>
<el-button size="mini" type="text" icon="el-icon-edit" v-if="scope.row.status == 'PREPARE'"
@click="handleUpdate(scope.row)" v-hasPermi="['mes:wm:rtissue:edit']">修改</el-button>
<el-button size="mini" type="text" icon="el-icon-delete" v-if="scope.row.status == 'PREPARE'"
@click="handleDelete(scope.row)" v-hasPermi="['mes:wm:rtissue:remove']">删除</el-button>
<!-- 需求八 单据撤销 -->
<!-- 标记 此处的按钮鉴权 待优化 -->
<el-button size="mini" type="text" icon="el-icon-refresh-left" v-if="scope.row.status == 'FINISHED'"
@click="handleWithdrawn(scope.row)" v-hasPermi="['mes:wm:rtissue:edit']">撤销</el-button>
<el-button size="mini" type="text" icon="el-icon-view" v-if="scope.row.status == 'CANCEL'"
@click="handleLookWithdrawn(scope.row)" v-hasPermi="['mes:wm:rtissue:edit']">查看撤销原因</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="title" :visible.sync="open" width="960px" append-to-body>
<el-form ref="form" :model="form" :rules="rules" label-width="100px">
<el-row>
<el-col :span="8">
<el-form-item label="退料单编号" prop="rtCode">
<el-input v-model="form.rtCode" placeholder="请输入退料单编号" />
</el-form-item>
</el-col>
<el-col :span="4">
<el-form-item label-width="80">
<el-switch v-model="autoGenFlag" active-color="#13ce66" active-text="自动生成"
@change="handleAutoGenChange(autoGenFlag)" v-if="optType != 'view' && form.status == 'PREPARE'">
</el-switch>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="退料单名称" prop="rtName">
<el-input v-model="form.rtName" placeholder="请输入退料单名称" />
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="8">
<el-form-item label="生产工单" prop="workorderCode">
<el-input v-model="form.workorderCode" placeholder="请输入生产工单">
<el-button slot="append" icon="el-icon-search" @click="handleWorkorderSelect"></el-button>
</el-input>
</el-form-item>
<WorkorderSelect ref="woSelect" @onSelected="onWorkorderSelected"></WorkorderSelect>
</el-col>
<el-col :span="8">
<el-form-item label="接收仓库">
<el-cascader v-model="warehouseInfo" :options="warehouseOptions" :props="warehouseProps"
@change="handleWarehouseChanged">
</el-cascader>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="退料日期" prop="rtDate">
<el-date-picker clearable v-model="form.rtDate" type="date" value-format="yyyy-MM-dd"
placeholder="请选择退料日期">
</el-date-picker>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="8">
<el-form-item label="生产炉子">
<el-input v-model="form.machineryName" readonly="readonly" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="生产炉号">
<el-input v-model="form.machineryNo" readonly="readonly" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="生产班组">
<el-input v-model="form.teamName" readonly="readonly" />
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="24">
<el-form-item label="备注" prop="remark">
<el-input v-model="form.remark" type="textarea" placeholder="请输入内容" />
</el-form-item>
</el-col>
</el-row>
</el-form>
<el-divider v-if="form.rtId != null" content-position="center">物料信息</el-divider>
<el-card shadow="always" v-if="form.rtId != null" class="box-card">
<Rtissueline :rtId="form.rtId" :optType="optType"></Rtissueline>
</el-card>
<div slot="footer" class="dialog-footer">
<el-button type="primary" @click="cancel" v-if="optType == 'view' || form.status != 'PREPARE'">返回</el-button>
<el-button type="primary" @click="submitForm" v-if="form.status == 'PREPARE' && optType != 'view'">
</el-button>
<el-button @click="cancel"> </el-button>
</div>
</el-dialog>
<!-- 需求八 单据撤销 对话框 -->
<el-dialog title="单据撤销" :visible.sync="WithdrawnFlag" width="30%">
<el-form ref="WithdrawnForm" :model="WithdrawnForm" :rules="WithdrawnRules" label-width="120px">
<el-form-item label="撤销原因:" prop="cancelRemark">
<el-input type="textarea" v-model="WithdrawnForm.cancelRemark" placeholder="请输入备注"></el-input>
</el-form-item>
</el-form>
<span slot="footer" class="dialog-footer">
<el-button @click="WithdrawnFlag = false"> </el-button>
<el-button type="primary" @click="handleWithdrawnSubmit"> </el-button>
</span>
</el-dialog>
<!-- 查看撤销原因 对话框 -->
<el-dialog title="单据撤销原因" :visible.sync="LookWithdrawnFlag" width="30%">
<p>
{{ LookWithdrawn }}
</p>
<span slot="footer" class="dialog-footer">
<el-button type="primary" @click="LookWithdrawnFlag = false"> </el-button>
</span>
</el-dialog>
<!-- 撤销错误 对话框 提示 需求八 -->
<el-dialog title="提示" :visible.sync="WithdrawnErrorFlag" width="45%">
<div>
<p style="margin-top: 0px;">当前单据部分产品物料已出库相关单据</p>
<p v-for="(value, name, index) in WithdrawnErrorObj" :key="index">
<span>{{ WithdrawnErrorObjMap[name].CNName }}</span>
<router-link :to="{
path: WithdrawnErrorObjMap[name].path,
query: { Parameters: item },
}" v-for="(item, ind) in value" :key="ind">
<span style="
color: #02a7f1;
border-bottom: 1px solid #02a7f1;
margin-right: 8px;
" :id="value.length - 1 == ind ? '' : 'WithdrawnErrorObj'" @click="WithdrawnErrorFlag = false">{{ item
}}</span>
</router-link>
</p>
<p style="margin-bottom: 0px;">请溯源后撤销该单据</p>
</div>
</el-dialog>
</div>
</template>
<script>
import { listRtissue, getRtissue, delRtissue, addRtissue, updateRtissue, execute, cancelFn } from "@/api/mes/wm/rtissue";
import WorkorderSelect from "@/components/workorderSelect/single.vue"
import Rtissueline from "./line.vue";
import { getTreeList } from "@/api/mes/wm/warehouse"
import { genCode } from "@/api/system/autocode/rule"
export default {
name: "Rtissue",
dicts: ['mes_order_status'],
components: {
Rtissueline, WorkorderSelect
},
data() {
return {
autoGenFlag: false,
optType: undefined,
warehouseInfo: [],
warehouseOptions: [],
warehouseProps: {
multiple: false,
value: 'pId',
label: 'pName',
},
// 遮罩层
loading: true,
// 选中数组
ids: [],
// 非单个禁用
single: true,
// 非多个禁用
multiple: true,
// 显示搜索条件
showSearch: true,
// 总条数
total: 0,
// 生产退料单头表格数据
rtissueList: [],
// 弹出层标题
title: "",
// 是否显示弹出层
open: false,
// 查询参数
queryParams: {
pageNum: 1,
pageSize: 10,
rtCode: null,
rtName: null,
workorderId: null,
workorderCode: null,
warehouseId: null,
warehouseCode: null,
warehouseName: null,
locationId: null,
locationCode: null,
locationName: null,
areaId: null,
areaCode: null,
areaName: null,
rtDate: null,
status: null,
},
// 表单参数
form: {},
// 表单校验
rules: {
rtCode: [
{ required: true, message: "退料单编号不能为空", trigger: "blur" }
],
workorderCode: [
{ required: true, message: "请选择要退料的生产工单", trigger: "blur" }
]
},
// 单据撤销 对话框 开关
WithdrawnFlag: false,
// 单据撤销 对话框 表单参数
WithdrawnForm: {
rtId: null,
cancelRemark: null
},
// 撤销单 表单校验
WithdrawnRules: {
cancelRemark: [
{ required: true, message: "撤销原因不能为空", trigger: "blur" }
]
},
// 查看撤销原因 以及 开关
LookWithdrawnFlag: false,
LookWithdrawn: null,
// 撤销错误 提示 开关
WithdrawnErrorFlag: false,
// 撤销错误 提示 内容
WithdrawnErrorObj: null,
// 映射
WithdrawnErrorObjMap: {
ps: {
CNName: "销售出库",
path: "/mes/wm/productsalse",
},
ih: {
CNName: "生产领料",
path: "/mes/wm/issue",
},
rv: {
CNName: "供应商退货",
path: "/mes/wm/rtvendor",
},
},
};
},
created() {
this.getList();
this.getWarehouseList();
},
methods: {
/** 查询生产退料单头列表 */
getList() {
this.loading = true;
listRtissue(this.queryParams).then(response => {
this.rtissueList = response.rows;
this.total = response.total;
this.loading = false;
});
},
getWarehouseList() {
getTreeList().then(response => {
if (response.data) {
this.warehouseOptions = response.data.filter((el) => {
return el.warehouseCode.indexOf('VIR') == -1;
});;
}
this.warehouseOptions.map(w => {
w.children.map(l => {
let lstr = JSON.stringify(l.children).replace(/locationId/g, 'lId').replace(/areaId/g, 'pId').replace(/areaName/g, 'pName');
l.children = JSON.parse(lstr);
});
let wstr = JSON.stringify(w.children).replace(/warehouseId/g, 'wId').replace(/locationId/g, 'pId').replace(/locationName/g, 'pName');
w.children = JSON.parse(wstr);
});
let ostr = JSON.stringify(this.warehouseOptions).replace(/warehouseId/g, 'pId').replace(/warehouseName/g, 'pName');
this.warehouseOptions = JSON.parse(ostr);
});
},
// 取消按钮
cancel() {
this.open = false;
this.reset();
},
// 表单重置
reset() {
this.form = {
rtId: null,
rtCode: null,
rtName: null,
workorderId: null,
workorderCode: null,
warehouseId: null,
warehouseCode: null,
warehouseName: null,
locationId: null,
locationCode: null,
locationName: null,
areaId: null,
areaCode: null,
areaName: null,
rtDate: new Date(),
status: "PREPARE",
remark: null,
attr1: null,
attr2: null,
attr3: null,
attr4: null,
createBy: null,
createTime: null,
updateBy: null,
updateTime: null
};
this.autoGenFlag = false;
this.resetForm("form");
},
/** 搜索按钮操作 */
handleQuery() {
this.queryParams.pageNum = 1;
this.getList();
},
/** 重置按钮操作 */
resetQuery() {
this.resetForm("queryForm");
this.handleQuery();
},
// 多选框选中数据
handleSelectionChange(selection) {
this.ids = selection.map(item => item.rtId)
this.single = selection.length !== 1
this.multiple = !selection.length
},
/** 新增按钮操作 */
handleAdd() {
this.reset();
this.open = true;
this.title = "添加生产退料单头";
this.optType = "add";
},
/** 修改按钮操作 */
handleUpdate(row) {
this.reset();
const rtId = row.rtId || this.ids
getRtissue(rtId).then(response => {
this.form = response.data;
this.warehouseInfo[0] = response.data.warehouseId;
this.warehouseInfo[1] = response.data.locationId;
this.warehouseInfo[2] = response.data.areaId;
this.open = true;
this.title = "修改生产退料单头";
this.optType = "edit";
});
},
// 查询明细按钮操作
handleView(row) {
this.reset();
const rtId = row.rtId
getRtissue(rtId).then(response => {
this.form = response.data;
this.warehouseInfo[0] = response.data.warehouseId;
this.warehouseInfo[1] = response.data.locationId;
this.warehouseInfo[2] = response.data.areaId;
this.open = true;
this.title = "查看退料单信息";
this.optType = "view";
});
},
/** 提交按钮 */
submitForm() {
this.$refs["form"].validate(valid => {
if (valid) {
if (this.form.rtId != null) {
updateRtissue(this.form).then(response => {
this.$modal.msgSuccess("修改成功");
this.open = false;
this.getList();
});
} else {
addRtissue(this.form).then(response => {
this.$modal.msgSuccess("新增成功");
this.open = false;
this.getList();
});
}
}
});
},
//执行退料
handleExecute(row) {
const rtIds = row.rtId || this.ids;
this.$modal.confirm('确认执行退料?').then(function () {
return execute(rtIds)//执行退料
}).then(() => {
this.getList();
this.$modal.msgSuccess("退料成功");
}).catch(() => { });
},
/** 删除按钮操作 */
handleDelete(row) {
const rtIds = row.rtId || this.ids;
this.$modal.confirm('是否确认删除生产退料单头编号为"' + rtIds + '"的数据项?').then(function () {
return delRtissue(rtIds);
}).then(() => {
this.getList();
this.$modal.msgSuccess("删除成功");
}).catch(() => { });
},
/** 导出按钮操作 */
handleExport() {
this.download('mes/wm/rtissue/export', {
...this.queryParams
}, `rtissue_${new Date().getTime()}.xlsx`)
},
//选择默认的仓库、库区、库位
handleWarehouseChanged(obj) {
if (obj != null) {
this.form.warehouseId = obj[0];
this.form.locationId = obj[1];
this.form.areaId = obj[2];
}
},
//选择生产工单
handleWorkorderSelect() {
this.$refs.woSelect.showFlag = true;
},
onWorkorderSelected(row) {
if (row != undefined && row != null) {
this.form.workorderId = row.workorderId;
this.form.workorderCode = row.workorderCode;
this.form.machineryId = row.machineryId
this.form.machineryCode = row.machineryCode
this.form.machineryName = row.machineryName
this.form.machineryNo = row.machineryNo
this.form.teamId = row.teamId
this.form.teamCode = row.teamCode
this.form.teamName = row.teamName
}
},
//自动生成编码
handleAutoGenChange(autoGenFlag) {
if (autoGenFlag) {
genCode('RTISSUE_CODE').then(response => {
this.form.rtCode = response;
});
} else {
this.form.rtCode = null;
}
},
// 撤销单据 点击撤销按钮
handleWithdrawn(row) {
console.log(row);
this.WithdrawnFlag = true;
this.WithdrawnForm.rtId = row.rtId;
},
// 撤销原因 提交
handleWithdrawnSubmit(formName) {
this.$refs['WithdrawnForm'].validate((valid) => {
if (valid) {
cancelFn(this.WithdrawnForm).then((res) => {
console.log(res);
if (res.code == 200) {
this.$modal.msgSuccess(res.msg);
}
}).catch((res) => {
console.log(res.data);
// 错误提示 对象 (内容)
this.WithdrawnErrorObj = res.data;
// 打开错误提示 对话框
this.WithdrawnErrorFlag = true;
}).finally(() => {
this.WithdrawnFlag = false;
this.$refs['WithdrawnForm'].resetFields();
this.getList();
});
} else {
console.log('error submit!!');
return false;
}
});
},
// 查看撤销原因
handleLookWithdrawn(val) {
console.log(val.cancelRemark);
this.LookWithdrawn = val.cancelRemark;
this.LookWithdrawnFlag = true;
},
}
};
</script>
<style scoped>
#WithdrawnErrorObj::after {
content: "、";
color: #ccc;
/* 设置下划线颜色为红色 */
text-decoration: none;
position: absolute;
}
</style>