From d13487486a3c3c7cf93bd3bda65dcc0d6af51aa2 Mon Sep 17 00:00:00 2001
From: gaoluyang <2820782392@qq.com>
Date: 星期二, 03 六月 2025 17:37:04 +0800
Subject: [PATCH] 销售出库页面开发

---
 src/views/production/index.vue |  275 +++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 275 insertions(+), 0 deletions(-)

diff --git a/src/views/production/index.vue b/src/views/production/index.vue
new file mode 100644
index 0000000..1838b1b
--- /dev/null
+++ b/src/views/production/index.vue
@@ -0,0 +1,275 @@
+<template>
+  <div class="production-container">
+    <div class="search-bar">
+      <el-input v-model="searchForm.keyword" placeholder="璇疯緭鍏ュ叧閿瘝" clearable />
+      <el-input v-model="searchForm.addUser" placeholder="璇疯緭鍏ヤ汉" clearable />
+      <el-button type="primary" @click="handleSearch">鏌ヨ</el-button>
+      <el-button @click="handleReset">閲嶇疆</el-button>
+    </div>
+
+    <div class="operation-bar">
+      <el-button type="primary" @click="handleAdd">鏂板閰嶉」</el-button>
+      <el-button type="success" @click="handleAddBatch">鏂板鍔犲伐</el-button>
+      <el-button type="warning">淇敼</el-button>
+      <el-button type="danger">鍒犻櫎</el-button>
+      <el-button type="info">瀵煎嚭</el-button>
+    </div>
+
+    <el-table :data="tableData" border style="width: 100%" @selection-change="handleSelectionChange">
+      <el-table-column type="selection" width="55" />
+      <el-table-column prop="sequence" label="搴忓彿" width="80" />
+      <el-table-column prop="category" label="鐓ょ" width="120" />
+      <el-table-column prop="unit" label="鍗曚綅" width="100" />
+      <el-table-column prop="productionVolume" label="鐢熶骇鏁伴噺" width="120" />
+      <el-table-column prop="laborCost" label="浜哄伐鎴愭湰" width="120" />
+      <el-table-column prop="materialCost" label="鍘熸枡鎴愭湰" width="120" />
+      <el-table-column prop="equipmentCost" label="璁惧璐圭敤" width="120" />
+      <el-table-column prop="totalCost" label="鎬绘垚鏈�" width="120" />
+      <el-table-column prop="totalPrice" label="鎬绘垚鏈�" width="120" />
+      <el-table-column prop="profit" label="鍒╂鼎" width="100" />
+      <el-table-column prop="reviewer" label="澶嶈浜�" width="120" />
+      <el-table-column prop="date" label="鏃ユ湡" width="120" />
+      <el-table-column label="鎿嶄綔" fixed="right" width="220">
+        <template #default="scope">
+          <el-button type="primary" link @click="handleEdit(scope.row)">鐧昏</el-button>
+          <el-button type="success" link @click="handleEdit(scope.row)">缂栬緫</el-button>
+          <el-button type="danger" link @click="handleDelete(scope.row)">鍒犻櫎</el-button>
+          <el-button type="warning" link @click="handleExport(scope.row)">瀵煎嚭</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+
+    <div class="pagination">
+      <el-pagination
+        v-model:current-page="pagination.currentPage"
+        v-model:page-size="pagination.pageSize"
+        :page-sizes="[10, 20, 30, 50]"
+        :total="pagination.total"
+        layout="total, sizes, prev, pager, next, jumper"
+        @size-change="handleSizeChange"
+        @current-change="handleCurrentChange"
+      />
+    </div>
+
+    <!-- 寮圭獥缁勪欢 -->
+    <ProductionDialog-dialog
+      v-model:visible="dialogVisible"
+      :type="dialogType"
+      :row-data="currentRow"
+      @success="handleDialogSuccess"
+    />
+  </div>
+</template>
+
+<script setup>
+import { ref, reactive, onMounted } from 'vue'
+import { ElMessage, ElMessageBox } from 'element-plus'
+import { getProductionList, addProduction, updateProduction, deleteProduction, exportProduction } from '@/api/production'
+import ProductionDialog from './components/ProductionDialog.vue'
+
+// 鎼滅储琛ㄥ崟鏁版嵁
+const searchForm = reactive({
+  keyword: '',
+  addUser: ''
+})
+
+// 琛ㄦ牸鏁版嵁
+const tableData = ref([])
+const loading = ref(false)
+
+// 鍒嗛〉鏁版嵁
+const pagination = reactive({
+  currentPage: 1,
+  pageSize: 10,
+  total: 0
+})
+
+// 閫変腑鐨勮鏁版嵁
+const selectedRows = ref([])
+
+// 寮圭獥鐩稿叧
+const dialogVisible = ref(false)
+const dialogType = ref('add')
+const currentRow = ref(null)
+
+// 鑾峰彇琛ㄦ牸鏁版嵁
+const getList = async () => {
+  loading.value = true
+  try {
+    const params = {
+      ...searchForm,
+      pageNum: pagination.currentPage,
+      pageSize: pagination.pageSize
+    }
+    // const res = await getProductionList(params)
+    // 鍋囨暟鎹�
+    const res = {
+      data: {
+        list: [{
+          sequence: 1,
+          category: '鐓ょ',
+          unit: '鍗曚綅',
+          productionVolume: '鐢熶骇鏁伴噺',
+          laborCost: '浜哄伐鎴愭湰',
+          materialCost: '鍘熸枡鎴愭湰',
+          equipmentCost: '璁惧璐圭敤',
+          totalCost: '鎬绘垚鏈�',
+          totalPrice: '鎬绘垚鏈�',
+          profit: '鍒╂鼎',
+          reviewer: '澶嶈浜�',
+          date: '鏃ユ湡'
+        }],
+        total: 0
+      }
+    }
+    
+
+    tableData.value = res.data.list
+    pagination.total = res.data.total
+  } catch (error) {
+    ElMessage.error('鑾峰彇鏁版嵁澶辫触')
+  } finally {
+    loading.value = false
+  }
+}
+
+// 澶勭悊琛ㄦ牸閫夋嫨鍙樺寲
+const handleSelectionChange = (selection) => {
+  selectedRows.value = selection
+}
+
+// 鎼滅储鏂规硶
+const handleSearch = () => {
+  pagination.currentPage = 1
+  getList()
+}
+
+// 閲嶇疆鎼滅储
+const handleReset = () => {
+  searchForm.keyword = ''
+  searchForm.addUser = ''
+  handleSearch()
+}
+
+// 鏂板閰嶉」
+const handleAdd = () => {
+  dialogType.value = 'add'
+  dialogVisible.value = true
+}
+
+// 鏂板鍔犲伐
+const handleAddBatch = () => {
+  dialogType.value = 'add'
+  dialogVisible.value = true
+}
+
+// 缂栬緫
+const handleEdit = (row) => {
+  currentRow.value = row
+  dialogType.value = 'edit'
+  dialogVisible.value = true
+}
+
+// 澶勭悊寮圭獥鎻愪氦
+const handleDialogSuccess = async (formData) => {
+  try {
+    if (dialogType.value === 'add') {
+      await addProduction(formData)
+      ElMessage.success('鏂板鎴愬姛')
+    } else {
+      await updateProduction({
+        ...formData,
+        id: currentRow.value.id
+      })
+      ElMessage.success('鏇存柊鎴愬姛')
+    }
+    getList()
+  } catch (error) {
+    ElMessage.error(dialogType.value === 'add' ? '鏂板澶辫触' : '鏇存柊澶辫触')
+  }
+}
+
+// 鍒犻櫎
+const handleDelete = (row) => {
+  ElMessageBox.confirm('纭鍒犻櫎璇ヨ褰曞悧锛�', '鎻愮ず', {
+    confirmButtonText: '纭畾',
+    cancelButtonText: '鍙栨秷',
+    type: 'warning'
+  }).then(async () => {
+    try {
+      await deleteProduction(row.id)
+      ElMessage.success('鍒犻櫎鎴愬姛')
+      getList()
+    } catch (error) {
+      console.error('鍒犻櫎澶辫触:', error)
+      ElMessage.error('鍒犻櫎澶辫触')
+    }
+  }).catch(() => {
+    ElMessage.info('宸插彇娑堝垹闄�')
+  })
+}
+
+// 瀵煎嚭
+const handleExport = async (row) => {
+  try {
+    const res = await exportProduction({ id: row.id })
+    const blob = new Blob([res], { type: 'application/vnd.ms-excel' })
+    const fileName = `鐢熶骇鍔犲伐璁板綍_${new Date().getTime()}.xlsx`
+    if ('download' in document.createElement('a')) {
+      const elink = document.createElement('a')
+      elink.download = fileName
+      elink.style.display = 'none'
+      elink.href = URL.createObjectURL(blob)
+      document.body.appendChild(elink)
+      elink.click()
+      URL.revokeObjectURL(elink.href)
+      document.body.removeChild(elink)
+    } else {
+      navigator.msSaveBlob(blob, fileName)
+    }
+  } catch (error) {
+    ElMessage.error('瀵煎嚭澶辫触')
+  }
+}
+
+// 澶勭悊姣忛〉鏄剧ず鏁伴噺鍙樺寲
+const handleSizeChange = (val) => {
+  pagination.pageSize = val
+  getList()
+}
+
+// 澶勭悊椤电爜鍙樺寲
+const handleCurrentChange = (val) => {
+  pagination.currentPage = val
+  getList()
+}
+
+// 缁勪欢鎸傝浇鏃跺姞杞芥暟鎹�
+onMounted(() => {
+  getList()
+})
+</script>
+
+<style scoped>
+.production-container {
+  padding: 20px;
+}
+
+.search-bar {
+  margin-bottom: 20px;
+  display: flex;
+  gap: 10px;
+}
+
+.operation-bar {
+  margin-bottom: 20px;
+  display: flex;
+  gap: 10px;
+}
+
+.pagination {
+  margin-top: 20px;
+  display: flex;
+  justify-content: flex-end;
+}
+</style> 
\ No newline at end of file

--
Gitblit v1.9.3