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

640 lines
23 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="100px">
<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="soCode">
<el-input v-model="queryParams.soCode" placeholder="请输入销售订单编号" clearable @keyup.enter.native="handleQuery" />
</el-form-item>
<el-form-item label="客户名称" prop="clientName">
<el-input v-model="queryParams.clientName" 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 label="单据状态" prop="status">
<el-select v-model="queryParams.status" placeholder="请选择单据状态" clearable>
<el-option v-for="dict in dict.type.mes_order_status" :key="dict.value" :label="dict.label"
:value="dict.value" />
</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-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:rtsalse: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:rtsalse: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:rtsalse:remove']">删除</el-button>
</el-col>
<right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
</el-row>
<el-table v-loading="loading" :data="rtsalseList" @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:rtsalse:query']">{{
scope.row.rtCode }}</el-button>
</template>
</el-table-column>
<el-table-column label="退货单名称" width="150px" align="center" prop="rtName" :show-overflow-tooltip="true" />
<el-table-column label="销售出库单编号" width="120px" align="center" prop="salseCode" />
<el-table-column label="客户名称" width="150px" align="center" prop="clientName" :show-overflow-tooltip="true" />
<el-table-column label="仓库" align="center" prop="warehouseName" />
<el-table-column label="库区" align="center" prop="locationName" />
<el-table-column label="库位" align="center" prop="areaName" />
<el-table-column label="出厂编号" align="center" prop="areaName" />
<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="操作" align="center" width="120px" class-name="small-padding fixed-width">
<template slot-scope="scope">
<el-button size="mini" type="text" icon="el-icon-edit" @click="handleUpdate(scope.row)"
v-if="scope.row.status == 'PREPARE'" v-hasPermi="['mes:wm:rtsalse:edit']">修改</el-button>
<el-button size="mini" type="text" icon="el-icon-delete" @click="handleDelete(scope.row)"
v-if="scope.row.status == 'PREPARE'" v-hasPermi="['mes:wm:rtsalse:remove']">删除</el-button>
<el-button size="mini" type="text" icon="el-icon-video-play" @click="handleExecute(scope.row)"
v-if="scope.row.status == 'PREPARE'" v-hasPermi="['mes:wm:rtsalse:edit']">执行退货</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:rtsalse: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:rtsalse: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="销售出库单编号">
<el-input v-model="form.salseCode" placeholder="请选择" readonly>
<el-button slot="append" @click="handleProductSaleSelect" icon="el-icon-search"></el-button>
</el-input>
</el-form-item>
<ProductSaleSelect ref="productSaleSelect" @onSelected="productSaleSelect"></ProductSaleSelect>
</el-col>
<el-col :span="8">
<el-form-item label="客户编号" prop="clientCode">
<el-input v-model="form.clientCode" readonly="readonly" placeholder="请输入客户编码">
</el-input>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="客户名称" prop="clientName">
<el-input v-model="form.clientName" readonly="readonly" placeholder="请输入客户名称" />
</el-form-item>
</el-col>
</el-row>
<el-row>
<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-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="status">
<el-select v-model="form.status" disabled placeholder="请选择单据状态">
<el-option v-for="dict in dict.type.mes_order_status" :key="dict.value" :label="dict.label"
:value="dict.value"></el-option>
</el-select>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="24">
<el-form-item label="退货原因" prop="rtReason">
<el-input v-model="form.rtReason" type="textarea" placeholder="请输入退货原因" />
</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">
<Rtsalseline ref="rtsalseline" :rtId="form.rtId" :optType="optType"></Rtsalseline>
</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 { listRtsalse, getRtsalse, delRtsalse, addRtsalse, updateRtsalse, execute, cancelFn } from "@/api/mes/wm/rtsalse";
import { listBySalseCode } from "@/api/mes/wm/productsalseline";
import Rtsalseline from "./line.vue";
import ProductSaleSelect from "@/components/ProductSaleSelect/single.vue"
import { getTreeList } from "@/api/mes/wm/warehouse"
import { genCode } from "@/api/system/autocode/rule"
export default {
name: "Rtsalse",
dicts: ['mes_order_status'],
components: {
ProductSaleSelect, Rtsalseline
},
watch: {
"form.salseCode"(val) {
if (!val) {
return
}
listBySalseCode({ salseCode: this.form.salseCode }).then(response => {
this.$refs.rtsalseline.setProductsalselineList(response.data)
})
}
},
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,
// 产品销售退货单表格数据
rtsalseList: [],
// 弹出层标题
title: "",
// 是否显示弹出层
open: false,
// 查询参数
queryParams: {
pageNum: 1,
pageSize: 10,
rtCode: null,
rtName: null,
soCode: null,
clientId: null,
clientCode: null,
clientName: null,
clientNick: null,
warehouseId: null,
warehouseCode: null,
warehouseName: null,
locationId: null,
locationCode: null,
locationName: null,
areaId: null,
areaCode: null,
areaName: null,
rtDate: null,
rtReason: null,
status: null,
attr1: null,
attr2: null,
attr3: null,
attr4: null,
},
// 表单参数
form: {},
// 表单校验
rules: {
rtCode: [
{ required: true, message: "退货单编号不能为空", trigger: "blur" }
],
// rtName: [
// { required: true, message: "退货单名称不能为空", trigger: "blur" }
// ],
rtDate: [
{ required: true, message: "请选择退货日期", trigger: "blur" }
],
salseCode: [
{ required: true, message: "请选择销售单", trigger: "blur" }
],
clientCode: [
{ required: true, message: "请选择客户", trigger: "blur" }
],
rtReason: [
{ 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;
listRtsalse(this.queryParams).then(response => {
this.rtsalseList = 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);
});
},
//选择默认的仓库、库区、库位
handleWarehouseChanged(obj) {
if (obj != null) {
this.form.warehouseId = obj[0];
this.form.locationId = obj[1];
this.form.areaId = obj[2];
}
},
// 取消按钮
cancel() {
this.open = false;
this.reset();
},
// 表单重置
reset() {
this.form = {
rtId: null,
rtCode: null,
rtName: null,
soCode: null,
clientId: null,
clientCode: null,
clientName: null,
clientNick: null,
warehouseId: null,
warehouseCode: null,
warehouseName: null,
locationId: null,
locationCode: null,
locationName: null,
areaId: null,
areaCode: null,
areaName: null,
rtDate: new Date(),
rtReason: null,
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
},
//客户选择事件
handleProductSaleSelect() {
this.$refs.productSaleSelect.showFlag = true;
},
productSaleSelect(obj) {
if (obj != undefined && obj != null) {
this.form.salseCode = obj.salseCode;
this.form.clientId = obj.clientId;
this.form.clientCode = obj.clientCode;
this.form.clientName = obj.clientName;
this.form.clientNick = obj.clientNick;
}
},
/** 新增按钮操作 */
handleAdd() {
this.reset();
this.open = true;
this.title = "添加产品销售退货单";
this.optType = "add";
},
// 查询明细按钮操作
handleView(row) {
this.reset();
const rtIds = row.rtId
getRtsalse(rtIds).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";
});
},
//执行入库
handleExecute(row) {
const rtIds = row.rtId || this.ids;
this.$modal.confirm('确认执行退货?').then(function () {
return execute(rtIds)//执行退货
}).then(() => {
this.getList();
this.$modal.msgSuccess("退货成功");
}).catch(() => { });
},
/** 修改按钮操作 */
handleUpdate(row) {
this.reset();
const rtId = row.rtId || this.ids
getRtsalse(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 = "add";
});
},
/** 提交按钮 */
submitForm() {
this.$refs["form"].validate(valid => {
if (valid) {
if (this.form.rtId != null) {
updateRtsalse(this.form).then(response => {
this.$modal.msgSuccess("修改成功");
this.open = false;
this.getList();
});
} else {
addRtsalse(this.form).then(response => {
this.$modal.msgSuccess("新增成功");
this.open = false;
this.getList();
});
}
}
});
},
/** 删除按钮操作 */
handleDelete(row) {
const rtIds = row.rtId || this.ids;
this.$modal.confirm('是否确认删除产品销售退货单编号为"' + rtIds + '"的数据项?').then(function () {
return delRtsalse(rtIds);
}).then(() => {
this.getList();
this.$modal.msgSuccess("删除成功");
}).catch(() => { });
},
/** 导出按钮操作 */
handleExport() {
this.download('mes/wm/rtsalse/export', {
...this.queryParams
}, `rtsalse_${new Date().getTime()}.xlsx`)
},
//自动生成编码
handleAutoGenChange(autoGenFlag) {
if (autoGenFlag) {
genCode('RTSALSE_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>