From 28fc65c34d1642b007dc45b83782e23be58d718c Mon Sep 17 00:00:00 2001
From: huminmin <mac@MacBook-Pro.local>
Date: 星期三, 08 七月 2026 16:43:58 +0800
Subject: [PATCH] 已进行排班并且人员已打卡的前提下,对应的班次配置不能编辑删除。

---
 src/views/financialManagement/receivable/salesOut.vue |  202 ++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 202 insertions(+), 0 deletions(-)

diff --git a/src/views/financialManagement/receivable/salesOut.vue b/src/views/financialManagement/receivable/salesOut.vue
new file mode 100644
index 0000000..f6205d8
--- /dev/null
+++ b/src/views/financialManagement/receivable/salesOut.vue
@@ -0,0 +1,202 @@
+<template>
+  <!-- 閿�鍞嚭搴� -->
+  <div class="app-container">
+    <el-form :model="filters"
+             :inline="true">
+      <el-form-item label="鍑哄簱鍗曞彿:">
+        <el-input v-model="filters.outboundBatches"
+                  placeholder="璇疯緭鍏ュ嚭搴撳崟鍙�"
+                  clearable
+                  style="width: 200px;" />
+      </el-form-item>
+      <el-form-item label="瀹㈡埛鍚嶇О:">
+        <el-input v-model="filters.customerName"
+                  placeholder="璇疯緭鍏ュ鎴峰悕绉�"
+                  clearable
+                  style="width: 200px;" />
+      </el-form-item>
+      <el-form-item label="鍑哄簱鏃ユ湡:">
+        <el-date-picker v-model="filters.dateRange"
+                        value-format="YYYY-MM-DD"
+                        format="YYYY-MM-DD"
+                        type="daterange"
+                        range-separator="鑷�"
+                        start-placeholder="寮�濮嬫棩鏈�"
+                        end-placeholder="缁撴潫鏃ユ湡"
+                        clearable />
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary"
+                   @click="onSearch">鎼滅储</el-button>
+        <el-button @click="resetFilters">閲嶇疆</el-button>
+      </el-form-item>
+    </el-form>
+    <div class="table_list">
+      <div class="actions">
+        <div></div>
+        <div>
+          <el-button @click="handleOut"
+                     icon="Download">瀵煎嚭</el-button>
+        </div>
+      </div>
+      <PIMTable rowKey="id"
+                :column="columns"
+                :tableData="dataList"
+                :tableLoading="tableLoading"
+                isShowSummary
+                :summaryMethod="getSummaries"
+                :page="{
+          current: pagination.currentPage,
+          size: pagination.pageSize,
+          total: pagination.total,
+        }"
+                @pagination="changePage" />
+    </div>
+  </div>
+</template>
+
+<script setup>
+  import { ref, reactive, onMounted, getCurrentInstance } from "vue";
+  import { ElMessage } from "element-plus";
+  import { listPageAccountSales } from "@/api/financialManagement/accountSales";
+
+  defineOptions({
+    name: "閿�鍞嚭搴�",
+  });
+
+  const { proxy } = getCurrentInstance();
+
+  const filters = reactive({
+    outboundBatches: "",
+    customerName: "",
+    dateRange: [],
+  });
+
+  const pagination = reactive({
+    currentPage: 1,
+    pageSize: 10,
+    total: 0,
+  });
+
+  const columns = [
+    { label: "鍑哄簱鍗曞彿", prop: "outboundBatches", minWidth: "150" },
+    { label: "瀹㈡埛鍚嶇О", prop: "customerName", minWidth: "180" },
+    { label: "鍑哄簱鏃ユ湡", prop: "shippingDate", width: "170" },
+    { label: "浜у搧鍚嶇О", prop: "productName", minWidth: "140" },
+    { label: "瑙勬牸鍨嬪彿", prop: "specificationModel", minWidth: "140" },
+    {
+      label: "閲戦",
+      prop: "outboundAmount",
+      minWidth: "120",
+      formatData: val =>
+        val === null || val === undefined || val === ""
+          ? ""
+          : Number(val).toLocaleString("zh-CN", {
+              minimumFractionDigits: 2,
+              maximumFractionDigits: 2,
+            }),
+    },
+    { label: "鍙戣揣缂栧彿", prop: "shippingNo", minWidth: "140" },
+    { label: "閿�鍞鍗曞彿", prop: "salesContractNo", minWidth: "150" },
+  ];
+
+  const dataList = ref([]);
+  const tableLoading = ref(false);
+
+  function buildFilterParams() {
+    const params = {
+      outboundBatches: filters.outboundBatches || undefined,
+      customerName: filters.customerName || undefined,
+    };
+    if (filters.dateRange && filters.dateRange.length === 2) {
+      params.startDate = filters.dateRange[0];
+      params.endDate = filters.dateRange[1];
+    }
+    return params;
+  }
+
+  const onSearch = () => {
+    pagination.currentPage = 1;
+    getTableData();
+  };
+
+  const getTableData = () => {
+    tableLoading.value = true;
+    listPageAccountSales({
+      ...buildFilterParams(),
+      current: pagination.currentPage,
+      size: pagination.pageSize,
+    })
+      .then(res => {
+        const ok = res.code === 200 || res.code === 0;
+        if (ok && res.data) {
+          pagination.total = res.data.total ?? 0;
+          dataList.value = res.data.records ?? [];
+        } else {
+          ElMessage.error(res.msg || "鏌ヨ澶辫触");
+          dataList.value = [];
+        }
+      })
+      .catch(() => {
+        dataList.value = [];
+      })
+      .finally(() => {
+        tableLoading.value = false;
+      });
+  };
+
+  const resetFilters = () => {
+    filters.outboundBatches = "";
+    filters.customerName = "";
+    filters.dateRange = [];
+    pagination.currentPage = 1;
+    getTableData();
+  };
+
+  const changePage = ({ page, limit }) => {
+    pagination.currentPage = page;
+    pagination.pageSize = limit;
+    getTableData();
+  };
+
+  const getSummaries = ({ columns, data }) => {
+    const sums = [];
+    columns.forEach((col, index) => {
+      if (index === 0) {
+        sums[index] = "鍚堣";
+      } else if (col.property === "outboundAmount") {
+        const total = data.reduce((prev, cur) => {
+          const v = Number(cur.outboundAmount);
+          return prev + (isNaN(v) ? 0 : v);
+        }, 0);
+        sums[index] = total.toLocaleString("zh-CN", {
+          minimumFractionDigits: 2,
+          maximumFractionDigits: 2,
+        });
+      } else {
+        sums[index] = "";
+      }
+    });
+    return sums;
+  };
+
+  const handleOut = () => {
+    proxy.download(
+      "/accountSales/exportAccountSalesOutbound",
+      buildFilterParams(),
+      `閿�鍞嚭搴揰${new Date().getTime()}.xlsx`
+    );
+  };
+
+  onMounted(() => {
+    getTableData();
+  });
+</script>
+
+<style lang="scss" scoped>
+  .actions {
+    display: flex;
+    justify-content: space-between;
+    margin-bottom: 15px;
+  }
+</style>

--
Gitblit v1.9.3