From 8a3bfdab689684fe5ee19b2f69842e450fc7c60a Mon Sep 17 00:00:00 2001
From: spring <2396852758@qq.com>
Date: 星期五, 30 一月 2026 14:02:39 +0800
Subject: [PATCH] fix: 完成生产数据分析页面
---
src/views/productionManagement/productionCosting/index.vue | 302 +++++++++++++++++++++++++++++++++++++-------------
1 files changed, 224 insertions(+), 78 deletions(-)
diff --git a/src/views/productionManagement/productionCosting/index.vue b/src/views/productionManagement/productionCosting/index.vue
index ed72bd5..3547087 100644
--- a/src/views/productionManagement/productionCosting/index.vue
+++ b/src/views/productionManagement/productionCosting/index.vue
@@ -1,125 +1,161 @@
<template>
<div class="app-container">
- <div class="search_form">
- <div>
- <span class="search_title">鐢熶骇鏃ユ湡锛�</span>
- <el-date-picker v-model="searchForm.entryDate" value-format="YYYY-MM-DD" format="YYYY-MM-DD" type="daterange"
- placeholder="璇烽�夋嫨" clearable @change="changeDaterange" />
- <span class="search_title ml10">鐢熶骇浜猴細</span>
- <el-input
- v-model="searchForm.customerName"
- style="width: 240px"
- placeholder="璇疯緭鍏�"
- @change="handleQuery"
- clearable
- prefix-icon="Search"
- />
- <el-button type="primary" @click="handleQuery" style="margin-left: 10px"
- >鎼滅储</el-button
- >
+ <div class="content-layout">
+ <!-- 宸︿晶鍙拌处 + 椤堕儴绛涢�� -->
+ <div class="left-panel">
+ <div class="left-header">
+ <!-- <div class="left-title">鐢熶骇鍙拌处</div> -->
+ <el-radio-group v-model="dateType" size="small" @change="handleDateTypeChange">
+ <el-radio-button label="day">鏃�</el-radio-button>
+ <el-radio-button label="month">鏈�</el-radio-button>
+ </el-radio-group>
+
+ </div>
+ <PIMTable
+ rowKey="id"
+ :column="leftTableColumn"
+ :tableData="leftTableData"
+ :tableLoading="tableLoading"
+ :page="page"
+ :height="200"
+ @row-click="handleLeftRowClick"
+ @pagination="pagination"
+ ></PIMTable>
</div>
- <div>
- <el-button @click="handleOut">瀵煎嚭</el-button>
+
+ <!-- 鍙充晶鏄庣粏锛堝師鏈夊唴瀹癸級 -->
+ <div class="right-panel">
+ <div class="header-filters">
+ <el-button @click="handleOut" class="ml10">瀵煎嚭</el-button>
+ </div>
+ <PIMTable
+ rowKey="id"
+ :column="tableColumn"
+ :tableData="tableData"
+ :page="page1"
+ :tableLoading="tableLoading"
+ style="margin-right: 20px;"
+ @pagination="pagination1"
+ ></PIMTable>
</div>
- </div>
- <div class="table_list">
- <PIMTable
- rowKey="id"
- :column="tableColumn"
- :tableData="tableData"
- :page="page"
- :tableLoading="tableLoading"
- @pagination="pagination"
- ></PIMTable>
</div>
</div>
</template>
<script setup>
import {onMounted, ref} from "vue";
-import {
- listCustomer,
-} from "@/api/basicData/customerFile.js";
import { ElMessageBox } from "element-plus";
import dayjs from "dayjs";
+import {salesLedgerProductionAccountingListProductionDetails, salesLedgerProductionAccountingList} from "@/api/productionManagement/productionCosting.js";
const { proxy } = getCurrentInstance();
const tableColumn = ref([
{
label: "鐢熶骇鏃ユ湡",
- prop: "customerName",
- width: 120,
+ prop: "scheduleDate",
+ minWidth: 100,
},
{
label: "鐢熶骇浜�",
- prop: "customerName",
- width: 120,
+ prop: "schedulingUserName",
+ minWidth: 100,
},
{
label: "鍚堝悓鍙�",
- prop: "taxpayerIdentificationNumber",
- width: 220,
- },
- {
- label: "瀹㈡埛鍚堝悓鍙�",
- prop: "addressPhone",
- width: 250,
+ prop: "salesContractNo",
+ minWidth: 100,
},
{
label: "瀹㈡埛鍚嶇О",
- prop: "contactPerson",
- },
- {
- label: "椤圭洰鍚嶇О",
- prop: "contactPhone",
- width:150
+ prop: "customerName",
+ minWidth: 100,
},
{
label: "浜у搧澶х被",
- prop: "basicBankAccount",
- width: 220,
+ prop: "productName",
+ minWidth: 100,
},
{
label: "瑙勬牸鍨嬪彿",
- prop: "bankAccount",
- width: 220,
+ prop: "productModelName",
+ minWidth: 100,
},
{
label: "鍗曚綅",
- prop: "bankCode",
- width:220
+ prop: "unit",
+ minWidth: 100,
},
{
label: "宸ュ簭",
- prop: "maintainer",
+ prop: "process",
+ minWidth: 100,
},
{
label: "鐢熶骇鏁伴噺",
- prop: "maintenanceTime",
- width: 100,
+ prop: "quantity",
+ minWidth: 100,
},
{
label: "宸ユ椂瀹氶",
- prop: "maintenanceTime",
- width: 100,
+ prop: "workHours",
+ minWidth: 100,
},
{
label: "宸ヨ祫",
- prop: "maintenanceTime",
- width: 100,
+ prop: "wages",
+ minWidth: 100,
},
]);
+
+// 宸︿晶姹囨�诲彴璐﹀垪锛堢敓浜т汉銆佷骇閲忋�佸伐璧勩�佸悎鏍肩巼锛�
+const leftTableColumn = ref([
+ {
+ label: "鐢熶骇浜�",
+ prop: "schedulingUserName",
+ minWidth: 100,
+ },
+ {
+ label: "浜ч噺",
+ prop: "outputNum",
+ minWidth: 100,
+
+ },
+ {
+ label: "宸ヨ祫",
+ prop: "wages",
+ minWidth: 100,
+
+ },
+ {
+ label: "鍚堟牸鐜�",
+ prop: "outputRate",
+ minWidth: 100,
+
+ },
+]);
+
const tableData = ref([]);
const tableLoading = ref(false);
+const tableLoading1 = ref(false);
+const leftTableData = ref([]);
+// 鏃� / 鏈� 鍒囨崲锛堥粯璁ゆ寜鏃ワ級
+const dateType = ref("day");
const page = reactive({
current: 1,
size: 100,
total: 0,
});
+const page1 = reactive({
+ current: 1,
+ size: 100,
+ total: 0,
+});
+
const data = reactive({
searchForm: {
- customerName: "",
+ schedulingUserName: "",
+ salesContractNo: "",
entryDate: [
dayjs().format("YYYY-MM-DD"),
dayjs().add(1, "day").format("YYYY-MM-DD"),
@@ -130,35 +166,97 @@
});
const { searchForm } = toRefs(data);
-// 鏌ヨ鍒楄〃
-/** 鎼滅储鎸夐挳鎿嶄綔 */
-const handleQuery = () => {
- page.current = 1;
- getList();
-};
const pagination = (obj) => {
page.current = obj.page;
page.size = obj.limit;
getList();
};
+
+const pagination1 = (obj) => {
+ page1.current = obj.page;
+ page1.size = obj.limit;
+ getList1();
+};
+
const changeDaterange = (value) => {
if (value) {
- searchForm.entryDateStart = dayjs(value[0]).format("YYYY-MM-DD");
- searchForm.entryDateEnd = dayjs(value[1]).format("YYYY-MM-DD");
+ searchForm.value.entryDateStart = dayjs(value[0]).format("YYYY-MM-DD");
+ searchForm.value.entryDateEnd = dayjs(value[1]).format("YYYY-MM-DD");
} else {
- searchForm.entryDateStart = undefined;
- searchForm.entryDateEnd = undefined;
+ searchForm.value.entryDateStart = undefined;
+ searchForm.value.entryDateEnd = undefined;
}
handleQuery();
};
const getList = () => {
tableLoading.value = true;
- listCustomer({ ...searchForm.value, ...page }).then((res) => {
+ const params = { ...searchForm.value, ...page };
+ params.dateType = dateType.value;
+ params.entryDate = undefined
+
+ salesLedgerProductionAccountingList(params).then((res) => {
tableLoading.value = false;
- tableData.value = res.records;
- page.total = res.total;
+ const records = res.data.records || [];
+ leftTableData.value = records;
+ page.total = res.data.total || 0;
});
+
};
+
+const getList1 = () => {
+ tableLoading1.value = true;
+ const params = { ...page1, ...searchForm.value };
+ salesLedgerProductionAccountingListProductionDetails(params).then((res) => {
+ tableLoading1.value = false;
+ tableData.value = res.data.records || [];;
+ page1.total = res.data.total || 0;
+ });
+};
+
+// 鏋勫缓宸︿晶姹囨�诲彴璐︼紙鎸夌敓浜т汉姹囨�讳骇閲忋�佸伐璧勭瓑锛�
+const buildLeftTableData = (records) => {
+ const map = {};
+ records.forEach((item) => {
+ const key = item.schedulingUserName || "鏈煡";
+ if (!map[key]) {
+ map[key] = {
+ id: key,
+ schedulingUserName: key,
+ finishedNum: 0,
+ wages: 0,
+ qualifiedRate: item.qualifiedRate ?? null,
+ };
+ }
+ map[key].finishedNum += Number(item.finishedNum || 0);
+ map[key].wages += Number(item.wages || 0);
+ if (item.qualifiedRate != null) {
+ map[key].qualifiedRate = item.qualifiedRate;
+ }
+ });
+ leftTableData.value = Object.values(map);
+};
+
+// 宸︿晶鏃�/鏈堝垏鎹�
+const handleDateTypeChange = () => {
+ // 杩欓噷鍙綔涓虹瓫閫夋潯浠剁殑涓�閮ㄥ垎锛岀洿鎺ラ噸鏂版煡璇㈠垪琛�
+ page.current = 1;
+ getList();
+ handleQuery()
+};
+
+// 鐐瑰嚮宸︿晶琛岋紝鍒峰彸渚ф槑缁嗭紙鎸夌敓浜т汉杩囨护锛�
+const handleLeftRowClick = (row) => {
+ searchForm.value.schedulingUserName = row.schedulingUserName || "";
+ handleQuery();
+};
+
+// 鏌ヨ鍒楄〃
+/** 鎼滅储鎸夐挳鎿嶄綔 */
+const handleQuery = () => {
+ page1.current = 1;
+ getList1();
+};
+
// 瀵煎嚭
const handleOut = () => {
@@ -168,7 +266,7 @@
type: "warning",
})
.then(() => {
- proxy.download("/basic/customer/export", {}, "鐢熶骇鏍哥畻.xlsx");
+ proxy.download("/salesLedger/productionAccounting/export", {}, "鐢熶骇鏍哥畻.xlsx");
})
.catch(() => {
proxy.$modal.msg("宸插彇娑�");
@@ -180,4 +278,52 @@
});
</script>
-<style scoped lang="scss"></style>
+<style scoped lang="scss">
+.content-layout {
+ display: flex;
+ flex-direction: column;
+ gap: 16px;
+}
+
+.left-panel {
+ flex: 0 0 50%;
+ display: flex;
+ flex-direction: column;
+ gap: 10px;
+}
+
+.right-panel {
+ flex: 0 0 50%;
+ display: flex;
+ flex-direction: column;
+ gap: 10px;
+}
+
+.left-header {
+ display: flex;
+ align-items: center;
+ gap: 12px;
+ margin-bottom: 8px;
+}
+
+.left-title {
+ font-size: 16px;
+ color: #ffffff;
+}
+
+.header-filters {
+ display: flex;
+ align-items: center;
+ flex: 1;
+ justify-content: flex-end;
+ gap: 8px;
+}
+
+.search_title {
+ color: #ffffff;
+}
+
+.ml10 {
+ margin-left: 10px;
+}
+</style>
--
Gitblit v1.9.3