Files
klp-oa/klp-ui/src/views/wms/purchasePlan/panels/detail.vue
2025-08-02 13:38:04 +08:00

467 lines
15 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">
<el-row :gutter="10" class="mb8">
<el-col :span="1.5">
<el-button
type="primary"
plain
icon="el-icon-plus"
size="mini"
@click="handleAdd"
>新增</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="success"
plain
icon="el-icon-edit"
size="mini"
:disabled="single"
@click="handleUpdate"
>修改</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="danger"
plain
icon="el-icon-delete"
size="mini"
:disabled="multiple"
@click="handleDelete"
>删除</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="warning"
plain
icon="el-icon-download"
size="mini"
@click="handleExport"
>导出</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="info"
plain
icon="el-icon-plus"
size="mini"
:disabled="!hasArrivalItems"
@click="handleCreateStockIn"
>创建入库单</el-button>
</el-col>
<right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
</el-row>
<el-table v-loading="loading" :data="purchasePlanDetailList" @selection-change="handleSelectionChange" ref="purchasePlanDetailTable">
<el-table-column type="selection" width="55" align="center" />
<!-- <el-table-column label="明细ID" align="center" prop="detailId" v-if="true"/>
<el-table-column label="采购计划ID" align="center" prop="planId" /> -->
<el-table-column label="原材料" align="center">
<template slot-scope="scope">
<RawMaterialInfo :material-id="scope.row.rawMaterialId">
<template #default="{ material }">
{{ material.rawMaterialName }}<span v-if="material.rawMaterialCode">({{ material.rawMaterialCode }})</span>
</template>
</RawMaterialInfo>
</template>
</el-table-column>
<el-table-column label="BOM" align="center">
<template slot-scope="scope">
<BomInfoMini item-type="raw_material" :item-id="scope.row.rawMaterialId" />
</template>
</el-table-column>
<el-table-column label="负责人" align="center" prop="owner" />
<el-table-column label="计划采购数量" align="center" prop="quantity" />
<el-table-column label="单位" align="center" prop="unit" />
<el-table-column label="状态" align="center" prop="status">
<template slot-scope="scope">
<el-select v-model="scope.row.status" @change="handleStatusChange(scope.row, scope.row.status, scope.row.status)">
<el-option v-for="item in dict.type.pruchase_detail_status" :key="item.value" :label="item.label" :value="parseInt(item.value)">
<dict-tag :options="dict.type.pruchase_detail_status" :value="item.value" />
</el-option>
</el-select>
</template>
</el-table-column>
<el-table-column label="备注" align="center" prop="remark" />
<el-table-column label="操作" align="center" class-name="small-padding fixed-width">
<template slot-scope="scope">
<el-button
size="mini"
type="text"
icon="el-icon-edit"
@click="handleUpdate(scope.row)"
>修改</el-button>
<el-button
size="mini"
type="text"
icon="el-icon-delete"
@click="handleDelete(scope.row)"
>删除</el-button>
<!-- 状态修改按钮 -->
<el-button
v-if="scope.row.status === EPurchaseDetailStatus.NEW"
size="mini"
type="text"
icon="el-icon-refresh"
@click="handleStatusChange(scope.row, EPurchaseDetailStatus.ONWAY, '在途')"
>设为在途</el-button>
<el-button
v-if="scope.row.status === EPurchaseDetailStatus.ONWAY"
size="mini"
type="text"
icon="el-icon-refresh"
@click="handleStatusChange(scope.row, EPurchaseDetailStatus.ARRIVAL, '到货')"
>设为到货</el-button>
<el-button
v-if="scope.row.status === EPurchaseDetailStatus.ARRIVAL"
size="mini"
type="text"
icon="el-icon-refresh"
@click="handleStatusChange(scope.row, EPurchaseDetailStatus.REVIEW, '待审核')"
>设为待审核</el-button>
<el-button
v-if="scope.row.status === EPurchaseDetailStatus.REVIEW || scope.row.status === EPurchaseDetailStatus.FINISH"
size="mini"
type="text"
icon="el-icon-document"
@click="handleUploadQualityCertificate(scope.row)"
>质保单</el-button>
<el-button
v-if="scope.row.status === EPurchaseDetailStatus.REVIEW"
size="mini"
type="text"
icon="el-icon-refresh"
@click="handleStatusChange(scope.row, EPurchaseDetailStatus.FINISH, '采购完成')"
>设为完成</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="500px" append-to-body>
<el-form ref="form" :model="form" :rules="rules" label-width="80px">
<el-form-item label="原材料" prop="rawMaterialId">
<RawMaterialSelect v-model="form.rawMaterialId" placeholder="请选择原材料" @change="onRawMaterialChange" />
</el-form-item>
<el-form-item label="负责人" prop="owner">
<el-input v-model="form.owner" placeholder="请输入负责人" />
</el-form-item>
<el-form-item label="采购数量" prop="quantity">
<el-input v-model="form.quantity" placeholder="请输入计划采购数量" />
</el-form-item>
<el-form-item label="单位" prop="unit">
<el-input v-model="form.unit" placeholder="请输入单位" :disabled="true" />
</el-form-item>
<el-form-item label="备注" prop="remark">
<el-input v-model="form.remark" placeholder="请输入备注" />
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button :loading="buttonLoading" type="primary" @click="submitForm"> </el-button>
<el-button @click="cancel"> </el-button>
</div>
</el-dialog>
<!-- 入库单创建对话框 -->
<stock-in-dialog
:visible.sync="stockInVisible"
:selected-items="selectedArrivalItems"
@success="handleStockInSuccess"
/>
<el-dialog title="上传质保单" :visible.sync="uploadQualityCertificateOpen" width="800px" append-to-body>
<quality-certicate :info="uploadQualityCertificateInfo" @confirm="handleUploadQualityCertificateConfirm" />
</el-dialog>
</div>
</template>
<script>
import { listPurchasePlanDetail, getPurchasePlanDetail, delPurchasePlanDetail, addPurchasePlanDetail, updatePurchasePlanDetail } from "@/api/wms/purchasePlanDetail";
import { EPurchaseDetailStatus } from "@/utils/enums";
import StockInDialog from "./stockin.vue";
import RawMaterialSelect from '@/components/KLPService/RawMaterialSelect';
import UserSelect from '@/components/KLPService/UserSelect'
import { RawMaterialInfo } from '@/components/KLPService';
import BomInfoMini from '@/components/KLPService/Renderer/BomInfoMini.vue';
import QualityCerticate from './qualityCerticate.vue'
export default {
name: "PurchasePlanDetail",
components: {
StockInDialog,
RawMaterialSelect,
UserSelect,
RawMaterialInfo,
BomInfoMini,
QualityCerticate
},
props: {
planId: {
type: [String, Number],
default: null
}
},
dicts: ['pruchase_detail_status'],
data() {
return {
EPurchaseDetailStatus,
// 按钮loading
buttonLoading: false,
// 遮罩层
loading: true,
// 选中数组
ids: [],
// 非单个禁用
single: true,
// 非多个禁用
multiple: true,
// 显示搜索条件
showSearch: true,
// 总条数
total: 0,
// 采购计划明细表格数据
purchasePlanDetailList: [],
// 弹出层标题
title: "",
// 是否显示弹出层
open: false,
// 查询参数
queryParams: {
pageNum: 1,
pageSize: 10,
planId: undefined,
rawMaterialId: undefined,
owner: undefined,
quantity: undefined,
unit: undefined,
},
// 表单参数
form: {},
// 表单校验
rules: {
planId: [
{ required: true, message: "采购计划ID不能为空", trigger: "blur" }
],
rawMaterialId: [
{ required: true, message: "原材料ID不能为空", trigger: "blur" }
],
owner: [
{ required: true, message: "负责人不能为空", trigger: "blur" }
],
quantity: [
{ required: true, message: "计划采购数量不能为空", trigger: "blur" }
],
unit: [
{ required: true, message: "单位不能为空", trigger: "blur" }
],
},
// 入库单相关
stockInVisible: false,
selectedArrivalItems: [],
uploadQualityCertificateOpen: false,
uploadQualityCertificateInfo: undefined
};
},
computed: {
/** 是否有到货状态的明细 */
hasArrivalItems() {
return this.purchasePlanDetailList.some(item => item.status === EPurchaseDetailStatus.ARRIVAL);
}
},
created() {
this.getList();
},
watch: {
planId: {
handler(newVal) {
if (newVal) {
this.queryParams.planId = newVal;
this.getList();
}
},
immediate: true
}
},
methods: {
/** 查询采购计划明细列表 */
getList() {
this.loading = true;
listPurchasePlanDetail(this.queryParams).then(response => {
this.purchasePlanDetailList = response.rows;
this.total = response.total;
this.loading = false;
});
},
// 取消按钮
cancel() {
this.open = false;
this.reset();
},
// 表单重置
reset() {
this.form = {
detailId: undefined,
planId: undefined,
rawMaterialId: undefined,
owner: undefined,
quantity: undefined,
unit: undefined,
remark: undefined,
delFlag: undefined,
createTime: undefined,
createBy: undefined,
updateTime: undefined,
updateBy: undefined
};
this.resetForm("form");
},
/** 搜索按钮操作 */
handleQuery() {
this.queryParams.pageNum = 1;
this.getList();
},
/** 重置按钮操作 */
resetQuery() {
this.resetForm("queryForm");
this.handleQuery();
},
// 多选框选中数据
handleSelectionChange(selection) {
this.ids = selection.map(item => item.detailId)
this.single = selection.length!==1
this.multiple = !selection.length
},
/** 新增按钮操作 */
handleAdd() {
this.reset();
if (this.planId) {
this.form.planId = this.planId;
}
this.open = true;
this.title = "添加采购计划明细";
},
/** 修改按钮操作 */
handleUpdate(row) {
this.loading = true;
this.reset();
const detailId = row.detailId || this.ids
getPurchasePlanDetail(detailId).then(response => {
this.loading = false;
this.form = response.data;
this.open = true;
this.title = "修改采购计划明细";
});
},
/** 提交按钮 */
submitForm() {
this.$refs["form"].validate(valid => {
if (valid) {
this.buttonLoading = true;
if (this.form.detailId != null) {
updatePurchasePlanDetail(this.form).then(response => {
this.$modal.msgSuccess("修改成功");
this.open = false;
this.getList();
}).finally(() => {
this.buttonLoading = false;
});
} else {
addPurchasePlanDetail(this.form).then(response => {
this.$modal.msgSuccess("新增成功");
this.open = false;
this.getList();
}).finally(() => {
this.buttonLoading = false;
});
}
}
});
},
/** 删除按钮操作 */
handleDelete(row) {
const detailIds = row.detailId || this.ids;
this.$modal.confirm('是否确认删除采购计划明细编号为"' + detailIds + '"的数据项?').then(() => {
this.loading = true;
return delPurchasePlanDetail(detailIds);
}).then(() => {
this.loading = false;
this.getList();
this.$modal.msgSuccess("删除成功");
}).catch(() => {
}).finally(() => {
this.loading = false;
});
},
/** 导出按钮操作 */
handleExport() {
this.download('wms/purchasePlanDetail/export', {
...this.queryParams
}, `purchasePlanDetail_${new Date().getTime()}.xlsx`)
},
/** 状态修改按钮操作 */
handleStatusChange(row, status, label) {
// this.$modal.confirm('是否确认将采购计划明细编号为"' + row.detailId + '"的状态改为"' + label + '"').then(() => {
this.loading = true;
updatePurchasePlanDetail({ detailId: row.detailId, status: status }).then(response => {
this.$modal.msgSuccess("状态修改成功");
this.getList();
}).catch(error => {
console.error(error);
this.$modal.msgError("状态修改失败");
}).finally(() => {
this.loading = false;
});
// });
},
handleUploadQualityCertificateConfirm() {
this.handleStatusChange(this.uploadQualityCertificateInfo, EPurchaseDetailStatus.FINISH, '采购完成');
},
/** 创建入库单按钮操作 */
handleCreateStockIn() {
// 获取用户选中的明细
const selectedItems = this.$refs.purchasePlanDetailTable.selection;
if (selectedItems.length === 0) {
this.$modal.msgWarning("请先选择要入库的明细");
return;
}
// 检查选中的明细是否都是到货状态
const nonArrivalItems = selectedItems.filter(item => item.status !== EPurchaseDetailStatus.ARRIVAL);
if (nonArrivalItems.length > 0) {
this.$modal.msgWarning("只能选择到货状态的明细进行入库操作");
return;
}
this.selectedArrivalItems = selectedItems;
this.stockInVisible = true;
},
/** 入库单创建成功后的回调 */
handleStockInSuccess() {
this.$modal.msgSuccess("入库单创建成功,相关明细状态已更新为采购完成");
this.getList();
this.stockInVisible = false;
this.selectedArrivalItems = []; // 清空选中的明细
},
onRawMaterialChange(rawMaterial) {
if (rawMaterial && rawMaterial.unit) {
this.form.unit = rawMaterial.unit;
}
},
handleUploadQualityCertificate(row) {
this.uploadQualityCertificateOpen = true;
console.log(row, 'row');
this.uploadQualityCertificateInfo = row;
}
}
};
</script>