From af7fa041da9f063ca49f1f1126ec01616f14cd85 Mon Sep 17 00:00:00 2001
From: spring <2396852758@qq.com>
Date: 星期四, 28 八月 2025 14:04:17 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/dev_JLMY' into dev_JLMY
---
src/views/sales/purchaseReturn.vue | 462 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 462 insertions(+), 0 deletions(-)
diff --git a/src/views/sales/purchaseReturn.vue b/src/views/sales/purchaseReturn.vue
new file mode 100644
index 0000000..b84cc10
--- /dev/null
+++ b/src/views/sales/purchaseReturn.vue
@@ -0,0 +1,462 @@
+<template>
+ <div class="app-container">
+ <el-form :inline="true" :model="queryParams" class="search-form">
+ <el-form-item label="閫�璐у崟鍙�">
+ <el-input
+ v-model="queryParams.returnNo"
+ placeholder="璇疯緭鍏ラ��璐у崟鍙�"
+ clearable
+ :style="{ width: '200px' }"
+ />
+ </el-form-item>
+ <el-form-item label="渚涘簲鍟�">
+ <el-select
+ v-model="queryParams.supplierId"
+ placeholder="璇烽�夋嫨渚涘簲鍟�"
+ clearable
+ :style="{ width: '200px' }"
+ >
+ <el-option
+ :label="item.label"
+ v-for="item in supplierList"
+ :key="item.value"
+ :value="item.value"
+ />
+ </el-select>
+ </el-form-item>
+ <el-form-item label="鐘舵��">
+ <el-select
+ v-model="queryParams.status"
+ placeholder="璇烽�夋嫨鐘舵��"
+ clearable
+ :style="{ width: '150px' }"
+ >
+ <el-option
+ :label="item.label"
+ v-for="item in statusList"
+ :key="item.value"
+ :value="item.value"
+ />
+ </el-select>
+ </el-form-item>
+ <el-form-item label="鍗曟嵁鏃ユ湡">
+ <el-date-picker
+ v-model="queryParams.dateRange"
+ type="daterange"
+ range-separator="鑷�"
+ start-placeholder="寮�濮嬫棩鏈�"
+ end-placeholder="缁撴潫鏃ユ湡"
+ format="YYYY-MM-DD"
+ value-format="YYYY-MM-DD"
+ :style="{ width: '240px' }"
+ />
+ </el-form-item>
+ <el-form-item>
+ <el-button type="primary" @click="handleQuery">鏌ヨ</el-button>
+ <el-button @click="resetQuery">閲嶇疆</el-button>
+ </el-form-item>
+ </el-form>
+
+ <el-card>
+ <!-- 鎿嶄綔鎸夐挳鍖� -->
+ <el-row :gutter="24" class="table-toolbar" justify="space-between">
+ <el-button type="primary" :icon="Plus" @click="handleAdd">
+ 鏂板閫�璐у崟
+ </el-button>
+ <el-button type="success" :icon="Refresh" @click="handleGenerateReturn">
+ 涓�閿敓鎴愰��璐у崟
+ </el-button>
+ <el-button type="danger" :icon="Delete" @click="handleBatchDelete" :disabled="selectedIds.length === 0">
+ 鎵归噺鍒犻櫎
+ </el-button>
+ </el-row>
+
+ <!-- 琛ㄦ牸缁勪欢 -->
+ <el-table
+ v-loading="loading"
+ :data="tableData"
+ @selection-change="handleSelectionChange"
+ border
+ style="width: 100%"
+ >
+ <el-table-column type="selection" width="55" />
+ <el-table-column label="閫�璐у崟鍙�" prop="returnNo" width="180" />
+ <el-table-column label="渚涘簲鍟�" prop="supplierName" width="200" />
+ <el-table-column label="鍗曟嵁鏃ユ湡" prop="returnDate" width="120" />
+ <el-table-column label="鎿嶄綔鍛�" prop="operatorName" width="120" />
+ <el-table-column label="閫�璐у師鍥�" prop="returnReason" width="200" show-overflow-tooltip />
+ <el-table-column label="閫�璐ф暟閲�" prop="returnQuantity" width="120">
+ <template #default="scope">
+ {{ scope.row.returnQuantity }} 鍚�
+ </template>
+ </el-table-column>
+ <el-table-column label="鐘舵��" prop="status" width="100">
+ <template #default="scope">
+ <el-tag :type="getStatusType(scope.row.status)">
+ {{ getStatusText(scope.row.status) }}
+ </el-tag>
+ </template>
+ </el-table-column>
+ <el-table-column label="鍒涘缓鏃堕棿" prop="createTime" width="160" />
+ <el-table-column label="鎿嶄綔" width="200" fixed="right">
+ <template #default="scope">
+ <el-button
+ size="small"
+ type="primary"
+ @click="handleView(scope.row)"
+ >
+ 鏌ョ湅
+ </el-button>
+ <el-button
+ size="small"
+ type="warning"
+ @click="handleEdit(scope.row)"
+ v-if="scope.row.status === 'draft'"
+ >
+ 缂栬緫
+ </el-button>
+ <el-button
+ size="small"
+ type="danger"
+ @click="handleDelete(scope.row)"
+ v-if="scope.row.status === 'draft'"
+ >
+ 鍒犻櫎
+ </el-button>
+ </template>
+ </el-table-column>
+ </el-table>
+
+ <!-- 鍒嗛〉缁勪欢 -->
+ <pagination
+ v-if="total > 0"
+ :page="current"
+ :limit="pageSize"
+ :total="total"
+ @pagination="handlePagination"
+ :layout="'total, prev, pager, next, jumper'"
+ />
+ </el-card>
+
+ <!-- 鏂板/缂栬緫瀵硅瘽妗� -->
+ <PurchaseReturnDialog
+ v-model:dialogFormVisible="dialogFormVisible"
+ v-model:form="form"
+ :title="title"
+ :is-edit="isEdit"
+ @submit="handleSubmit"
+ @success="handleSuccess"
+ ref="purchaseReturnDialog"
+ />
+
+ <!-- 鏌ョ湅璇︽儏瀵硅瘽妗� -->
+ <PurchaseReturnViewDialog
+ v-model:dialogViewVisible="dialogViewVisible"
+ :form="viewForm"
+ title="閫�璐у崟璇︽儏"
+ />
+
+ <!-- 涓�閿敓鎴愰��璐у崟瀵硅瘽妗� -->
+ <GenerateReturnDialog
+ v-model:dialogGenerateVisible="dialogGenerateVisible"
+ @success="handleGenerateSuccess"
+ />
+ </div>
+</template>
+
+<script setup>
+import { ref, reactive, onMounted, getCurrentInstance } from "vue";
+import { ElMessage, ElMessageBox } from "element-plus";
+import { Plus, Edit, Delete, Refresh, View } from "@element-plus/icons-vue";
+import Pagination from "@/components/Pagination";
+import PurchaseReturnDialog from "./components/PurchaseReturnDialog.vue";
+import PurchaseReturnViewDialog from "./components/PurchaseReturnViewDialog.vue";
+import GenerateReturnDialog from "./components/GenerateReturnDialog.vue";
+
+// 鍝嶅簲寮忔暟鎹�
+const loading = ref(false);
+const tableData = ref([]);
+const selectedIds = ref([]);
+const current = ref(1);
+const pageSize = ref(10);
+const total = ref(0);
+const dialogFormVisible = ref(false);
+const dialogViewVisible = ref(false);
+const dialogGenerateVisible = ref(false);
+const isEdit = ref(false);
+const title = ref("");
+const form = ref({});
+const viewForm = ref({});
+
+// 鏌ヨ鍙傛暟
+const queryParams = reactive({
+ returnNo: "",
+ supplierId: "",
+ status: "",
+ dateRange: []
+});
+
+// 渚涘簲鍟嗗垪琛�
+const supplierList = ref([
+ { value: "1", label: "渚涘簲鍟咥" },
+ { value: "2", label: "渚涘簲鍟咮" },
+ { value: "3", label: "渚涘簲鍟咰" }
+]);
+
+// 鐘舵�佸垪琛�
+const statusList = ref([
+ { value: "draft", label: "鑽夌" },
+ { value: "pending", label: "寰呭鏍�" },
+ { value: "approved", label: "宸插鏍�" },
+ { value: "rejected", label: "宸叉嫆缁�" },
+ { value: "completed", label: "宸插畬鎴�" }
+]);
+
+// 妯℃嫙鏁版嵁
+const mockData = [
+ {
+ id: "1",
+ returnNo: "TH20241201001",
+ supplierName: "渚涘簲鍟咥",
+ returnDate: "2024-12-01",
+ operatorName: "闄堝織寮�",
+ returnReason: "璐ㄩ噺涓嶅悎鏍硷紝鐓よ川涓嶇鍚堣姹�",
+ returnQuantity: 50,
+ status: "pending",
+ createTime: "2024-12-01 10:00:00"
+ },
+ {
+ id: "2",
+ returnNo: "TH20241201002",
+ supplierName: "渚涘簲鍟咮",
+ returnDate: "2024-12-01",
+ operatorName: "鍒樼編鐜�",
+ returnReason: "浜よ揣婊炲悗锛屽奖鍝嶇敓浜ц鍒�",
+ returnQuantity: 30,
+ status: "approved",
+ createTime: "2024-12-01 14:30:00"
+ }
+];
+
+// 鑾峰彇鐘舵�佺被鍨�
+const getStatusType = (status) => {
+ const statusMap = {
+ draft: "",
+ pending: "warning",
+ approved: "success",
+ rejected: "danger",
+ completed: "info"
+ };
+ return statusMap[status] || "";
+};
+
+// 鑾峰彇鐘舵�佹枃鏈�
+const getStatusText = (status) => {
+ const statusMap = {
+ draft: "鑽夌",
+ pending: "寰呭鏍�",
+ approved: "宸插鏍�",
+ rejected: "宸叉嫆缁�",
+ completed: "宸插畬鎴�"
+ };
+ return statusMap[status] || status;
+};
+
+// 鏌ヨ
+const handleQuery = () => {
+ current.value = 1;
+ loadData();
+};
+
+// 閲嶇疆鏌ヨ
+const resetQuery = () => {
+ Object.assign(queryParams, {
+ returnNo: "",
+ supplierId: "",
+ status: "",
+ dateRange: []
+ });
+ handleQuery();
+};
+
+// 鍔犺浇鏁版嵁
+const loadData = () => {
+ loading.value = true;
+ // 妯℃嫙API璋冪敤
+ setTimeout(() => {
+ tableData.value = mockData;
+ total.value = mockData.length;
+ loading.value = false;
+ }, 500);
+};
+
+// 鍒嗛〉澶勭悊
+const handlePagination = (pagination) => {
+ current.value = pagination.page;
+ pageSize.value = pagination.limit;
+ loadData();
+};
+
+// 閫夋嫨鍙樺寲
+const handleSelectionChange = (selection) => {
+ selectedIds.value = selection.map(item => item.id);
+};
+
+// 鏂板
+const handleAdd = () => {
+ isEdit.value = false;
+ title.value = "鏂板閫�璐у崟";
+ form.value = {
+ supplierId: "",
+ returnDate: "",
+ operatorId: "",
+ returnReason: "",
+ returnQuantity: "",
+ returnAmount: "",
+ returnItems: [],
+ remark: ""
+ };
+ dialogFormVisible.value = true;
+};
+
+// 缂栬緫
+const handleEdit = (row) => {
+ isEdit.value = true;
+ title.value = "缂栬緫閫�璐у崟";
+ form.value = { ...row };
+ dialogFormVisible.value = true;
+};
+
+// 鏌ョ湅
+const handleView = (row) => {
+ viewForm.value = { ...row };
+ dialogViewVisible.value = true;
+};
+
+// 鍒犻櫎
+const handleDelete = (row) => {
+ ElMessageBox.confirm(
+ `纭畾瑕佸垹闄ら��璐у崟 ${row.returnNo} 鍚楋紵`,
+ "鎻愮ず",
+ {
+ confirmButtonText: "纭畾",
+ cancelButtonText: "鍙栨秷",
+ type: "warning"
+ }
+ ).then(() => {
+ // 妯℃嫙鍒犻櫎
+ const index = tableData.value.findIndex(item => item.id === row.id);
+ if (index > -1) {
+ tableData.value.splice(index, 1);
+ total.value--;
+ ElMessage.success("鍒犻櫎鎴愬姛");
+ }
+ });
+};
+
+// 鎵归噺鍒犻櫎
+const handleBatchDelete = () => {
+ if (selectedIds.value.length === 0) {
+ ElMessage.warning("璇烽�夋嫨瑕佸垹闄ょ殑璁板綍");
+ return;
+ }
+
+ ElMessageBox.confirm(
+ `纭畾瑕佸垹闄ら�変腑鐨� ${selectedIds.value.length} 鏉¤褰曞悧锛焋,
+ "鎻愮ず",
+ {
+ confirmButtonText: "纭畾",
+ cancelButtonText: "鍙栨秷",
+ type: "warning"
+ }
+ ).then(() => {
+ // 妯℃嫙鎵归噺鍒犻櫎
+ tableData.value = tableData.value.filter(item => !selectedIds.value.includes(item.id));
+ total.value = tableData.value.length;
+ selectedIds.value = [];
+ ElMessage.success("鎵归噺鍒犻櫎鎴愬姛");
+ });
+};
+
+// 涓�閿敓鎴愰��璐у崟
+const handleGenerateReturn = () => {
+ dialogGenerateVisible.value = true;
+};
+
+// 鎻愪氦琛ㄥ崟
+const handleSubmit = (formData) => {
+ if (isEdit.value) {
+ // 缂栬緫
+ const index = tableData.value.findIndex(item => item.id === formData.id);
+ if (index > -1) {
+ tableData.value[index] = { ...formData };
+ ElMessage.success("缂栬緫鎴愬姛");
+ }
+ } else {
+ // 鏂板
+ const newItem = {
+ id: Date.now().toString(),
+ returnNo: `TH${Date.now()}`,
+ supplierName: supplierList.value.find(item => item.value === formData.supplierId)?.label || "",
+ returnDate: formData.returnDate,
+ operatorName: "褰撳墠鐢ㄦ埛",
+ returnReason: formData.returnReason,
+ returnQuantity: formData.returnQuantity,
+ status: "draft",
+ createTime: new Date().toLocaleString()
+ };
+ tableData.value.unshift(newItem);
+ total.value++;
+ ElMessage.success("鏂板鎴愬姛");
+ }
+ dialogFormVisible.value = false;
+};
+
+// 琛ㄥ崟鎴愬姛鍥炶皟
+const handleSuccess = () => {
+ loadData();
+};
+
+// 鐢熸垚閫�璐у崟鎴愬姛鍥炶皟
+const handleGenerateSuccess = (returnOrder) => {
+ dialogGenerateVisible.value = false;
+ // 灏嗙敓鎴愮殑閫�璐у崟娣诲姞鍒板垪琛ㄤ腑
+ if (returnOrder) {
+ const newItem = {
+ id: Date.now().toString(),
+ returnNo: returnOrder.returnNo,
+ supplierName: returnOrder.supplierName,
+ returnDate: returnOrder.returnDate,
+ operatorName: returnOrder.operatorName,
+ returnReason: returnOrder.returnReason,
+ returnQuantity: returnOrder.returnQuantity,
+ status: returnOrder.status,
+ createTime: returnOrder.createTime,
+ returnItems: returnOrder.returnItems
+ };
+ tableData.value.unshift(newItem);
+ total.value++;
+ }
+ loadData();
+ ElMessage.success("閫�璐у崟鐢熸垚鎴愬姛");
+};
+
+// 椤甸潰鍔犺浇
+onMounted(() => {
+ loadData();
+});
+</script>
+
+<style scoped>
+.search-form {
+ margin-bottom: 20px;
+}
+
+.table-toolbar {
+ margin-bottom: 20px;
+}
+
+.el-card {
+ margin-bottom: 20px;
+}
+</style>
--
Gitblit v1.9.3