From 6a415a072a98d64d2f95d16eef73b6d7270b8d56 Mon Sep 17 00:00:00 2001
From: gaoluyang <2820782392@qq.com>
Date: 星期六, 30 五月 2026 15:14:25 +0800
Subject: [PATCH] 新疆马铃薯 1.首页问题:挪新系统ui,需要确认一下页面数据完整。 2.协同办公:挪新系统 3.营销管理:客户往来取消回款金额字段,改为点击左侧客户时显示与该客户的所有订单信息,以及发货情况。销售可以选好对应的采购订单方便质量追溯。 4.采购管理:供应商往来同上逻辑,显示是否收货,也加上采购退货和采购报表功能。 5.采购加上设备备件选项,设备备件入库到备件库存。设备,仓储不足时做采购提醒。 6.仓储物流:得区分成品库和原料库(不存在半成品,成品只有一个产品,很好确认),原材料需要有批号,采集原料库需要做好仓库字段,让他们可以区分哪个仓库,然后把数采设备信息做一个实时的显示。总库存显示好当前存在的批次信息。 7.质量:只有不通过才需要填写对应的数据信息。在外侧做好选择通过不通过。过程,出厂检验无法对应到生产订单,那就对应到销售订单。 8.决策分析:基础数据分析和进销存分析,质量数据分析需要重新设计
---
src/views/inventoryManagement/stockManagement/New.vue | 11
src/views/equipmentManagement/spareParts/index.vue | 56 +
src/api/procurementManagement/procurementInvoiceLedger.js | 132 +++
src/views/qualityManagement/finalInspection/components/formDia.vue | 41 +
src/views/reportAnalysis/dataDashboard/index.vue | 3
src/views/salesManagement/receiptPaymentLedger/index.vue | 244 ++++--
src/views/qualityManagement/rawMaterialInspection/index.vue | 62 +
src/views/salesManagement/salesLedger/index.vue | 98 +-
src/views/qualityManagement/finalInspection/index.vue | 83 +
src/api/procurementManagement/paymentEntry.js | 81 ++
src/views/qualityManagement/processInspection/index.vue | 67 +
src/views/procurementManagement/paymentLedger/index.vue | 204 ++--
src/views/procurementManagement/procurementLedger/index.vue | 289 +++++++
src/views/procurementManagement/receivingManagement/modal/ReceiptForm.vue | 338 +++++++++
src/api/qualityManagement/rawMaterialInspection.js | 9
src/views/procurementManagement/receivingManagement/index.vue | 320 ++++++++
src/api/procurementManagement/invoiceEntry.js | 69 +
src/views/reportAnalysis/dataDashboard/components/basic/center-top.vue | 24
18 files changed, 1,792 insertions(+), 339 deletions(-)
diff --git a/src/api/procurementManagement/invoiceEntry.js b/src/api/procurementManagement/invoiceEntry.js
new file mode 100644
index 0000000..8325aa7
--- /dev/null
+++ b/src/api/procurementManagement/invoiceEntry.js
@@ -0,0 +1,69 @@
+// 閲囪喘-鏉ョエ鐧昏鎺ュ彛
+import request from "@/utils/request";
+
+// 鏌ヨ閲囪喘鍚堝悓鍙�
+export function getProduct(query) {
+ return request({
+ url: "/purchase/ledger/getProduct",
+ method: "get",
+ params: query,
+ });
+}
+
+// 鏌ヨid閲囪喘鍚堝悓鍙�
+export function getPurchaseNoById(query) {
+ return request({
+ url: "/purchase/ledger/getPurchaseNoById",
+ method: "get",
+ params: query,
+ });
+}
+// 鏍规嵁閲囪喘鍚堝悓鍙锋煡璇㈣缁嗕俊鎭�
+export function getInfo(query) {
+ return request({
+ url: "/purchase/ledger/getInfo",
+ method: "get",
+ params: query,
+ });
+}
+// 涓诲垪琛ㄦ煡璇�
+export function gePurchaseList(query) {
+ return request({
+ url: "/purchase/ledger/list",
+ method: "get",
+ params: query,
+ });
+}
+// 涓诲垪琛ㄦ煡璇�
+export function getRegistrationById(query) {
+ return request({
+ url: "/purchase/registration/getRegistrationById",
+ method: "get",
+ params: query,
+ });
+}
+// 鏂板缂栬緫鏉ョエ鐧昏
+export function addOrUpdateRegistration(query) {
+ return request({
+ url: "/purchase/registration/addOrUpdateRegistration",
+ method: "post",
+ data: query,
+ });
+}
+// 鍒犻櫎鏉ョエ鐧昏
+export function delRegistration(query) {
+ return request({
+ url: "/purchase/registration/delRegistration",
+ method: "delete",
+ data: query,
+ });
+}
+
+// 涓诲垪琛ㄦ煡璇�
+export function gePurchaseListPage(query) {
+ return request({
+ url: "/purchase/ledger/listPage",
+ method: "get",
+ params: query,
+ });
+}
diff --git a/src/api/procurementManagement/paymentEntry.js b/src/api/procurementManagement/paymentEntry.js
new file mode 100644
index 0000000..6ef0eb9
--- /dev/null
+++ b/src/api/procurementManagement/paymentEntry.js
@@ -0,0 +1,81 @@
+// 閲囪喘浠樻鐧昏椤甸潰鎺ュ彛
+import request from "@/utils/request";
+
+// 鍒嗛〉鏌ヨ
+export function registrationList(query) {
+ return request({
+ url: "/purchase/paymentRegistration/list",
+ method: "get",
+ params: query,
+ });
+}
+// 鏌ヨ璇︽儏
+export function registrationInfo(query) {
+ return request({
+ url: "/purchase/paymentRegistration/" + query,
+ method: "get",
+ });
+}
+// 鏍规嵁閲囪喘鍚堝悓鍙锋煡璇㈣鎯�
+export function byPurchaseId(query) {
+ return request({
+ url: "/purchase/paymentRegistration/byPurchaseId/" + query,
+ method: "get",
+ });
+}
+// 鏌ヨ閲囪喘鍚堝悓鍙�
+export function getPurchaseNo() {
+ return request({
+ url: "/purchase/ledger/getPurchaseNo",
+ method: "get",
+ });
+}
+// 鏂板
+export function paymentRegistrationAdd(query) {
+ return request({
+ url: "/purchase/paymentRegistration",
+ method: "post",
+ data: query,
+ });
+}
+// 淇敼
+export function paymentRegistrationEdit(query) {
+ return request({
+ url: "/purchase/paymentRegistration",
+ method: "put",
+ data: query,
+ });
+}
+// 鍒犻櫎
+export function paymentRegistrationDel(query) {
+ return request({
+ url: "/purchase/paymentRegistration/delete",
+ method: "delete",
+ data: query,
+ });
+}
+// 鑾峰彇鍙戠エ鍙峰拰鍙戠エ閲戦
+export function getTicketNo(query) {
+ return request({
+ url: "/purchase/registration/getTicketNo",
+ method: "get",
+ params: query,
+ });
+}
+// 鍒嗛〉鏌ヨ
+export function paymentHistoryList(query) {
+ return request({
+ url: "/purchase/paymentRegistration/paymentHistoryList",
+ method: "get",
+ params: query,
+ });
+}
+
+// 鍒嗛〉鏌ヨ
+export function paymentHistoryListPage(query) {
+ return request({
+ url: "/purchase/paymentRegistration/paymentHistoryListPage",
+ method: "get",
+ params: query,
+ });
+}
diff --git a/src/api/procurementManagement/procurementInvoiceLedger.js b/src/api/procurementManagement/procurementInvoiceLedger.js
new file mode 100644
index 0000000..038e94f
--- /dev/null
+++ b/src/api/procurementManagement/procurementInvoiceLedger.js
@@ -0,0 +1,132 @@
+// 閲囪喘-鏉ョエ鍙拌处鎺ュ彛
+import request from "@/utils/request";
+
+// 鏌ヨ鍒楄〃
+export function invoiceList(query) {
+ return request({
+ url: "/purchase/registration/list",
+ method: "get",
+ params: query,
+ });
+}
+// 鏌ヨ璇︽儏
+// export function getInvoiceById(query) {
+// return request({
+// url: "/purchase/registration/getRegistrationById",
+// method: "get",
+// params: query,
+// });
+// }
+// 鏂板銆佺紪杈�
+export function addOrUpdateInvoice(query) {
+ return request({
+ url: "/purchase/invoice/addOrUpdateInvoice",
+ method: "post",
+ data: query,
+ });
+}
+// 鍒犻櫎
+export function delInvoice(query) {
+ return request({
+ url: "/purchase/invoice/delInvoice",
+ method: "delete",
+ data: query,
+ });
+}
+// 鍒犻櫎鏉ョエ鍙拌处
+export function delRegistration(query) {
+ return request({
+ url: "/purchase/registration/delRegistration",
+ method: "delete",
+ data: query,
+ });
+}
+// 鍒犻櫎闄勪欢
+export function delCommonFile(query) {
+ return request({
+ url: "/commonFile/delCommonFile",
+ method: "delete",
+ data: query,
+ });
+}
+// 瀛愯〃鏍兼煡璇�
+export function productRecordList(query) {
+ return request({
+ url: "/purchase/registration/productRecordList",
+ method: "get",
+ params: query,
+ });
+}
+
+// 鏌ヨ鍒楄〃
+export function invoiceListPage(query) {
+ return request({
+ url: "/sales/product/listPagePurchaseLedger",
+ method: "get",
+ params: query,
+ });
+}
+
+export function productRecordPage(query) {
+ return request({
+ url: "/purchase/registration/productRecordPage",
+ method: "get",
+ params: query,
+ });
+}
+
+export function productUploadFile(data) {
+ return request({
+ url: "/file/uploadFile",
+ method: "post",
+ data: data,
+ });
+}
+
+// export function getProductRecordById(params) {
+// return request({
+// url: "/purchase/registration/getProductRecordById",
+// method: "get",
+// params: params,
+// });
+// }
+export function getProductRecordById(data) {
+ return request({
+ url: "/purchase/registration/getProductRecordById",
+ method: "post",
+ data: data,
+ });
+}
+
+export function updateRegistration(data) {
+ return request({
+ url: "/purchase/registration/updateRegistration",
+ method: "post",
+ data: data,
+ });
+}
+
+// 鏌ヨ浠樻鐧昏瀛愬垪琛�
+export function registrationListPageGetById(query) {
+ return request({
+ url: "/purchase/registration/getById",
+ method: "get",
+ params: query,
+ });
+}
+// 淇敼浠樻娴佹按
+export function updatePaymentRegistration(query) {
+ return request({
+ url: "/purchase/registration/updatePaymentRegistration",
+ method: "put",
+ data: query,
+ });
+}
+// 鍒犻櫎浠樻娴佹按
+export function delPaymentRegistration(query) {
+ return request({
+ url: "/purchase/registration/delPaymentRegistration",
+ method: "delete",
+ data: query,
+ });
+}
diff --git a/src/api/qualityManagement/rawMaterialInspection.js b/src/api/qualityManagement/rawMaterialInspection.js
index dcb3869..f81a949 100644
--- a/src/api/qualityManagement/rawMaterialInspection.js
+++ b/src/api/qualityManagement/rawMaterialInspection.js
@@ -55,3 +55,12 @@
})
}
+// 鎵归噺蹇�熸楠�
+export function batchQuickInspect(data) {
+ return request({
+ url: '/quality/qualityInspect/batchQuickInspect',
+ method: 'post',
+ data: data,
+ })
+}
+
diff --git a/src/views/equipmentManagement/spareParts/index.vue b/src/views/equipmentManagement/spareParts/index.vue
index 45e0157..c297b63 100644
--- a/src/views/equipmentManagement/spareParts/index.vue
+++ b/src/views/equipmentManagement/spareParts/index.vue
@@ -75,6 +75,32 @@
<el-form-item label="鎻忚堪" prop="description">
<el-input v-model="form.description"></el-input>
</el-form-item>
+ <el-form-item label="搴撳瓨棰勮鏁伴噺" prop="warnNum">
+ <el-input-number
+ v-model="form.warnNum"
+ placeholder="璇疯緭鍏ュ簱瀛橀璀︽暟閲�"
+ :min="0"
+ :step="0.1"
+ :precision="2"
+ style="width: 100%"
+ ></el-input-number>
+ </el-form-item>
+ <el-form-item label="棰勮閫氱煡浜�" prop="notifyPersonId">
+ <el-select
+ v-model="form.notifyPersonId"
+ placeholder="璇烽�夋嫨棰勮閫氱煡浜�"
+ filterable
+ clearable
+ style="width: 100%"
+ >
+ <el-option
+ v-for="user in userOptions"
+ :key="user.userId"
+ :label="user.nickName || user.userName"
+ :value="user.userId"
+ />
+ </el-select>
+ </el-form-item>
<el-form-item label="浠锋牸" prop="price">
<el-input-number
v-model="form.price"
@@ -88,8 +114,8 @@
</el-form>
<template #footer>
<span class="dialog-footer">
- <el-button @click="dialogVisible = false" :disabled="formLoading">鍙栨秷</el-button>
<el-button type="primary" @click="submitForm" :loading="formLoading">纭畾</el-button>
+ <el-button @click="dialogVisible = false" :disabled="formLoading">鍙栨秷</el-button>
</span>
</template>
</el-dialog>
@@ -134,6 +160,7 @@
import { ElMessage, ElMessageBox } from 'element-plus';
import { getSparePartsList, addSparePart, editSparePart, delSparePart } from "@/api/equipmentManagement/spareParts";
import { getDeviceLedger } from "@/api/equipmentManagement/ledger";
+import { userListNoPage } from "@/api/system/user.js";
import PIMTable from "@/components/PIMTable/PIMTable.vue";
import { getSparePartsUsagePage } from "@/api/equipmentManagement/sparePartsUsage";
@@ -153,6 +180,7 @@
const operationType = ref('add')
// 璁惧閫夐」
const deviceOptions = ref([]);
+const userOptions = ref([]);
// 琛ㄥ崟寮曠敤
const formRef = ref(null);
// 鏌ヨ鍙傛暟
@@ -222,6 +250,14 @@
prop: "quantity",
},
{
+ label: "搴撳瓨棰勮鏁伴噺",
+ prop: "warnNum",
+ },
+ {
+ label: "棰勮閫氱煡浜�",
+ prop: "notifyPersonName",
+ },
+ {
label: "鎻忚堪",
prop: "description",
},
@@ -256,7 +292,9 @@
status: '',
description: '',
deviceLedgerIds: [],
- price: null
+ price: null,
+ warnNum: null,
+ notifyPersonId: null
});
// 琛ㄥ崟楠岃瘉瑙勫垯
@@ -414,9 +452,20 @@
}
};
+// 鍔犺浇鐢ㄦ埛鍒楄〃
+const loadUserOptions = async () => {
+ try {
+ const res = await userListNoPage();
+ userOptions.value = res.data || [];
+ } catch (error) {
+ ElMessage.error('鑾峰彇鐢ㄦ埛鍒楄〃澶辫触');
+ }
+};
+
// 鏂板鍒嗙被
const addCategory = async () => {
await loadDeviceName();
+ await loadUserOptions();
form.id = '';
form.name = '';
form.sparePartsNo = '';
@@ -425,6 +474,8 @@
form.deviceLedgerIds = [];
form.quantity = undefined;
form.price = null;
+ form.warnNum = null;
+ form.notifyPersonId = null;
operationType.value = 'add'
dialogVisible.value = true;
};
@@ -432,6 +483,7 @@
// 缂栬緫鍒嗙被
const editCategory = async (row) => {
await loadDeviceName();
+ await loadUserOptions();
Object.assign(form, row);
// 濡傛灉鍚庣杩斿洖鐨勬槸 deviceIds 瀛楃涓诧紝闇�瑕佽浆鎹负鏁扮粍
if (row.deviceIds && typeof row.deviceIds === 'string') {
diff --git a/src/views/inventoryManagement/stockManagement/New.vue b/src/views/inventoryManagement/stockManagement/New.vue
index 2addb95..bc83a73 100644
--- a/src/views/inventoryManagement/stockManagement/New.vue
+++ b/src/views/inventoryManagement/stockManagement/New.vue
@@ -70,6 +70,15 @@
:max="formState.qualitity"
style="width: 100%" />
</el-form-item>
+ <el-form-item label="鍏ュ簱鏃堕棿"
+ prop="createTime">
+ <el-date-picker v-model="formState.createTime"
+ type="datetime"
+ placeholder="璇烽�夋嫨鍏ュ簱鏃堕棿"
+ value-format="YYYY-MM-DD HH:mm:ss"
+ format="YYYY-MM-DD HH:mm:ss"
+ style="width: 100%" />
+ </el-form-item>
<el-form-item label="澶囨敞"
prop="remark">
<el-input v-model="formState.remark"
@@ -123,6 +132,7 @@
qualitity: 0,
batchNo: null,
warnNum: 0,
+ createTime: "",
remark: "",
});
@@ -161,6 +171,7 @@
qualitity: 0,
batchNo: null,
warnNum: 0,
+ createTime: "",
remark: "",
};
isShow.value = false;
diff --git a/src/views/procurementManagement/paymentLedger/index.vue b/src/views/procurementManagement/paymentLedger/index.vue
index 99b4b39..ba84a4c 100644
--- a/src/views/procurementManagement/paymentLedger/index.vue
+++ b/src/views/procurementManagement/paymentLedger/index.vue
@@ -17,7 +17,7 @@
<div></div>
</div>
<el-row :gutter="20">
- <el-col :span="14">
+ <el-col :span="8">
<div class="table_list">
<el-table ref="multipleTable"
border
@@ -42,10 +42,6 @@
prop="contractAmounts"
show-overflow-tooltip
:formatter="formattedNumber" />
- <el-table-column label="浠樻閲戦(鍏�)"
- prop="paymentAmount"
- show-overflow-tooltip
- :formatter="formattedNumber" />
<el-table-column label="搴斾粯閲戦(鍏�)"
prop="payableAmount"
show-overflow-tooltip>
@@ -64,25 +60,54 @@
:limit="page.size" />
</div>
</el-col>
- <el-col :span="10">
+ <el-col :span="16">
<div class="table_list">
- <PIMTable rowKey="id"
- :column="tableColumnSon"
- :tableData="originalTableDataSon"
- :isSelection="false"
- :isShowPagination="true"
- :page="sonPage"
- :tableLoading="tableLoadingSon"
- :isShowSummary="isShowSummarySon"
- :summaryMethod="summarizeMainTable1"
- height="calc(100vh - 18.5em)"
- @pagination="sonPaginationSearch">
- <template #payableAmountSlot="{ row }">
- <el-text type="danger">
- {{ parseFloat(row.payableAmount).toFixed(2) }}
- </el-text>
- </template>
- </PIMTable>
+ <div class="table-header" v-if="selectedSupplierName">
+ <span class="supplier-title">渚涘簲鍟嗭細{{ selectedSupplierName }}</span>
+ </div>
+ <el-table border
+ v-loading="tableLoadingSon"
+ :data="originalTableDataSon"
+ :header-cell-style="{ background: '#F0F1F5', color: '#333333' }"
+ height="calc(100vh - 20em)"
+ style="width: 100%"
+ tooltip-effect="dark"
+ :show-summary="isShowSummarySon"
+ :summary-method="summarizeMainTable1">
+ <el-table-column align="center"
+ label="搴忓彿"
+ type="index"
+ width="60" />
+ <el-table-column label="鍚堝悓绛捐鏃ユ湡"
+ prop="executionDate"
+ show-overflow-tooltip/>
+ <el-table-column label="閲囪喘鍚堝悓鍙�"
+ prop="purchaseContractNumber"
+ show-overflow-tooltip/>
+ <el-table-column label="椤圭洰鍚嶇О"
+ prop="projectName"
+ show-overflow-tooltip/>
+ <el-table-column label="鍚堝悓閲戦(鍏�)"
+ prop="contractAmount"
+ show-overflow-tooltip
+ :formatter="formattedNumber" />
+ <el-table-column label="鏀惰揣鐘舵��"
+ prop="status"
+ show-overflow-tooltip
+ width="100">
+ <template #default="{ row }">
+ <el-tag :type="getReceiptStatusType(row.status)" size="small">
+ {{ receiptStatusText[row.status] || '鏈煡鐘舵��' }}
+ </el-tag>
+ </template>
+ </el-table-column>
+ </el-table>
+ <pagination v-show="sonPage.total > 0"
+ @pagination="sonPaginationSearch"
+ :total="sonPage.total"
+ :layout="sonPage.layout"
+ :page="sonPage.current"
+ :limit="sonPage.size" />
</div>
</el-col>
</el-row>
@@ -90,12 +115,12 @@
</template>
<script setup>
- import { ref, toRefs } from "vue";
+ import { ref, toRefs, reactive, getCurrentInstance } from "vue";
import { Search } from "@element-plus/icons-vue";
import {
paymentLedgerList,
- paymentRecordList,
} from "@/api/procurementManagement/paymentLedger.js";
+ import { gePurchaseListPage } from "@/api/procurementManagement/invoiceEntry.js";
import Pagination from "../../../components/PIMTable/Pagination.vue";
const tableData = ref([]);
@@ -119,48 +144,13 @@
const isShowSummary = ref(true);
const { searchForm } = toRefs(data);
const currentSupplierId = ref("");
+ const selectedSupplierName = ref("");
const rowClick = row => {
currentSupplierId.value = row.supplierId;
+ selectedSupplierName.value = row.supplierName;
sonPage.current = 1;
- getPaymenRecordtList(row.supplierId);
+ getPurchaseList(row.supplierName);
};
- // 瀛愭ā鍧�
- const tableColumnSon = ref([
- {
- label: "鍚堝悓绛捐鏃ユ湡",
- prop: "executionDate",
- width: 110,
- },
- {
- label: "閲囪喘鍚堝悓鍙�",
- prop: "purchaseContractNumber",
- width: 150,
- },
- {
- label: "鍚堝悓閲戦(鍏�)",
- prop: "contractAmount",
- width: 200,
- formatData: params => {
- return params ? parseFloat(params).toFixed(2) : 0;
- },
- },
- {
- label: "浠樻閲戦(鍏�)",
- prop: "paymentAmount",
- width: 200,
- formatData: params => {
- return params ? parseFloat(params).toFixed(2) : 0;
- },
- },
- {
- label: "搴斾粯閲戦(鍏�)",
- dataType: "slot",
- width: 200,
- prop: "payableAmount",
- slot: "payableAmountSlot",
- },
- ]);
- const tableDataSon = ref([]);
const originalTableDataSon = ref([]);
const tableLoadingSon = ref(false);
const isShowSummarySon = ref(true);
@@ -170,32 +160,23 @@
const summarizeMainTable = param => {
return proxy.summarizeTable(
param,
- ["contractAmounts", "paymentAmount", "payableAmount"],
+ ["contractAmounts", "payableAmount"],
{
- ticketsNum: { noDecimal: true }, // 涓嶄繚鐣欏皬鏁�
- futureTickets: { noDecimal: true }, // 涓嶄繚鐣欏皬鏁�
+ ticketsNum: { noDecimal: true },
+ futureTickets: { noDecimal: true },
}
);
};
// 瀛愯〃鍚堣鏂规硶
const summarizeMainTable1 = param => {
- let summarizeTable = proxy.summarizeTable(
+ return proxy.summarizeTable(
param,
- ["contractAmount", "invoiceAmount", "paymentAmount"],
+ ["contractAmount"],
{
- ticketsNum: { noDecimal: true }, // 涓嶄繚鐣欏皬鏁�
- futureTickets: { noDecimal: true }, // 涓嶄繚鐣欏皬鏁�
+ ticketsNum: { noDecimal: true },
+ futureTickets: { noDecimal: true },
}
);
- if (originalTableDataSon.value.length > 0) {
- summarizeTable[summarizeTable.length - 1] =
- originalTableDataSon.value[
- originalTableDataSon.value.length - 1
- ].payableAmount.toFixed(2);
- } else {
- summarizeTable[summarizeTable.length - 1] = 0.0;
- }
- return summarizeTable;
};
/** 鎼滅储鎸夐挳鎿嶄綔 */
const handleQuery = () => {
@@ -219,16 +200,20 @@
total.value = result.total || 0;
if (tableData.value.length > 0) {
currentSupplierId.value = tableData.value[0].supplierId;
+ selectedSupplierName.value = tableData.value[0].supplierName;
sonPage.current = 1;
- getPaymenRecordtList(tableData.value[0].supplierId);
+ getPurchaseList(tableData.value[0].supplierName);
+ } else {
+ originalTableDataSon.value = [];
+ selectedSupplierName.value = "";
}
});
};
- const getPaymenRecordtList = supplierId => {
+ const getPurchaseList = supplierName => {
tableLoadingSon.value = true;
- paymentRecordList({
- supplierId: supplierId,
+ gePurchaseListPage({
+ supplierName: supplierName,
current: sonPage.current,
size: sonPage.size,
})
@@ -236,9 +221,8 @@
tableLoadingSon.value = false;
let result = res.data;
if (Array.isArray(result)) {
- tableDataSon.value = result;
+ originalTableDataSon.value = result;
sonPage.total = result.length;
- handlePagination({ page: sonPage.current, limit: sonPage.size });
} else {
originalTableDataSon.value = result.records || [];
sonPage.total = result.total || 0;
@@ -248,30 +232,37 @@
tableLoadingSon.value = false;
});
};
- const handlePagination = ({ page, limit }) => {
- console.log(page, limit);
- sonPage.current = page;
- sonPage.size = limit;
-
- const start = (page - 1) * limit;
- const end = start + limit;
-
- originalTableDataSon.value = tableDataSon.value.slice(start, end);
- };
const sonPaginationSearch = pagination => {
- // 鎺ユ敹鍒嗛〉鍣ㄥ弬鏁� { page, limit }
sonPage.current = pagination.page;
sonPage.size = pagination.limit;
- getPaymenRecordtList(currentSupplierId.value);
+ getPurchaseList(selectedSupplierName.value);
};
+
const formattedNumber = (row, column, cellValue) => {
- if (column.property !== "supplierName") {
+ if (cellValue !== undefined && cellValue !== null && !isNaN(cellValue)) {
return parseFloat(cellValue).toFixed(2);
- } else {
- return cellValue;
}
+ return "0.00";
};
+
+ // 鏀惰揣鐘舵�佹枃鏈槧灏�
+ const receiptStatusText = {
+ 1: '寰呮敹璐�',
+ 2: '鏀惰揣涓�',
+ 3: '宸叉敹璐�'
+ };
+
+ // 鏀惰揣鐘舵�佹爣绛剧被鍨�
+ const getReceiptStatusType = (status) => {
+ const typeMap = {
+ 1: 'info',
+ 2: 'warning',
+ 3: 'success'
+ };
+ return typeMap[status] || 'info';
+ };
+
getList();
</script>
@@ -291,4 +282,17 @@
.pagination-container {
margin-top: 0;
}
+
+ .table-header {
+ margin-bottom: 10px;
+ padding: 10px;
+ background-color: #f5f7fa;
+ border-radius: 4px;
+
+ .supplier-title {
+ font-weight: bold;
+ font-size: 14px;
+ color: #303133;
+ }
+ }
</style>
diff --git a/src/views/procurementManagement/procurementLedger/index.vue b/src/views/procurementManagement/procurementLedger/index.vue
index 2d42b57..8a6c27d 100644
--- a/src/views/procurementManagement/procurementLedger/index.vue
+++ b/src/views/procurementManagement/procurementLedger/index.vue
@@ -66,9 +66,9 @@
</div>
<div class="table_list">
<div style="display: flex;justify-content: flex-end;margin-bottom: 20px;">
- <el-button type="success"
- plain
- @click="handleBatchGenerate">鎵归噺鐢熸垚鏁版嵁</el-button>
+<!-- <el-button type="success"-->
+<!-- plain-->
+<!-- @click="handleBatchGenerate">鎵归噺鐢熸垚鏁版嵁</el-button>-->
<el-button type="primary"
@click="openForm('add')">鏂板鍙拌处</el-button>
<el-button type="primary"
@@ -103,12 +103,33 @@
label="搴忓彿"
type="index"
width="60" />
+ <el-table-column label="绫诲瀷"
+ prop="productType"
+ width="100">
+ <template #default="scope">
+ <el-tag :type="scope.row.productType === 2 ? 'warning' : 'success'" size="small">
+ {{ scope.row.productType === 2 ? '璁惧澶囦欢' : '浜у搧' }}
+ </el-tag>
+ </template>
+ </el-table-column>
<el-table-column label="浜у搧澶х被"
prop="productCategory" />
<el-table-column label="瑙勬牸鍨嬪彿"
- prop="specificationModel" />
+ prop="specificationModel"
+ width="120">
+ <template #default="scope">
+ <span v-if="scope.row.productType === 2">/</span>
+ <span v-else>{{ scope.row.specificationModel || '--' }}</span>
+ </template>
+ </el-table-column>
<el-table-column label="鍗曚綅"
- prop="unit" />
+ prop="unit"
+ width="100">
+ <template #default="scope">
+ <span v-if="scope.row.productType === 2">--</span>
+ <span v-else>{{ scope.row.unit || '--' }}</span>
+ </template>
+ </el-table-column>
<el-table-column label="鍏ュ簱瀹℃牳鐘舵��"
prop="stockInApprovalStatus"
width="120">
@@ -120,22 +141,59 @@
</template>
</el-table-column>
<el-table-column label="鏁伴噺"
- prop="quantity" />
+ prop="quantity"
+ width="100" />
<el-table-column label="鍙敤鏁伴噺"
- prop="availableQuality" />
+ prop="availableQuality"
+ width="100">
+ <template #default="scope">
+ <span v-if="scope.row.productType === 2">--</span>
+ <span v-else>{{ scope.row.availableQuality }}</span>
+ </template>
+ </el-table-column>
<el-table-column label="閫�璐ф暟閲�"
- prop="returnQuality" />
+ prop="returnQuality"
+ width="100">
+ <template #default="scope">
+ <span v-if="scope.row.productType === 2">--</span>
+ <span v-else>{{ scope.row.returnQuality }}</span>
+ </template>
+ </el-table-column>
<el-table-column label="绋庣巼(%)"
- prop="taxRate" />
+ prop="taxRate"
+ width="100">
+ <template #default="scope">
+ <span v-if="scope.row.productType === 2">--</span>
+ <span v-else>{{ scope.row.taxRate }}</span>
+ </template>
+ </el-table-column>
<el-table-column label="鍚◣鍗曚环(鍏�)"
prop="taxInclusiveUnitPrice"
- :formatter="formattedNumber" />
+ :formatter="formattedNumber"
+ width="130">
+ <template #default="scope">
+ <span v-if="scope.row.productType === 2">--</span>
+ <span v-else>{{ formattedNumber(null, null, scope.row.taxInclusiveUnitPrice) }}</span>
+ </template>
+ </el-table-column>
<el-table-column label="鍚◣鎬讳环(鍏�)"
prop="taxInclusiveTotalPrice"
- :formatter="formattedNumber" />
+ :formatter="formattedNumber"
+ width="130">
+ <template #default="scope">
+ <span v-if="scope.row.productType === 2">--</span>
+ <span v-else>{{ formattedNumber(null, null, scope.row.taxInclusiveTotalPrice) }}</span>
+ </template>
+ </el-table-column>
<el-table-column label="涓嶅惈绋庢�讳环(鍏�)"
prop="taxExclusiveTotalPrice"
- :formatter="formattedNumber" />
+ :formatter="formattedNumber"
+ width="140">
+ <template #default="scope">
+ <span v-if="scope.row.productType === 2">--</span>
+ <span v-else>{{ formattedNumber(null, null, scope.row.taxExclusiveTotalPrice) }}</span>
+ </template>
+ </el-table-column>
</el-table>
</template>
</el-table-column>
@@ -403,40 +461,86 @@
label="搴忓彿"
type="index"
width="60" />
+ <el-table-column label="绫诲瀷"
+ prop="productType"
+ width="100">
+ <template #default="scope">
+ <el-tag :type="scope.row.productType === 2 ? 'warning' : 'success'" size="small">
+ {{ scope.row.productType === 2 ? '璁惧澶囦欢' : '浜у搧' }}
+ </el-tag>
+ </template>
+ </el-table-column>
<el-table-column label="浜у搧澶х被"
prop="productCategory" />
<el-table-column label="瑙勬牸鍨嬪彿"
- prop="specificationModel" />
+ prop="specificationModel"
+ width="120">
+ <template #default="scope">
+ <span v-if="scope.row.productType === 2">/</span>
+ <span v-else>{{ scope.row.specificationModel || '--' }}</span>
+ </template>
+ </el-table-column>
<el-table-column label="鍗曚綅"
prop="unit"
- width="70" />
+ width="70">
+ <template #default="scope">
+ <span v-if="scope.row.productType === 2">--</span>
+ <span v-else>{{ scope.row.unit || '--' }}</span>
+ </template>
+ </el-table-column>
<el-table-column label="鏁伴噺"
prop="quantity"
width="70" />
<el-table-column label="搴撳瓨棰勮鏁伴噺"
prop="warnNum"
width="120"
- show-overflow-tooltip />
+ show-overflow-tooltip>
+ <template #default="scope">
+ <span v-if="scope.row.productType === 2">--</span>
+ <span v-else>{{ scope.row.warnNum }}</span>
+ </template>
+ </el-table-column>
<el-table-column label="绋庣巼(%)"
prop="taxRate"
- width="80" />
+ width="80">
+ <template #default="scope">
+ <span v-if="scope.row.productType === 2">--</span>
+ <span v-else>{{ scope.row.taxRate }}</span>
+ </template>
+ </el-table-column>
<el-table-column label="鍚◣鍗曚环(鍏�)"
prop="taxInclusiveUnitPrice"
:formatter="formattedNumber"
- width="150" />
+ width="130">
+ <template #default="scope">
+ <span v-if="scope.row.productType === 2">--</span>
+ <span v-else>{{ formattedNumber(null, null, scope.row.taxInclusiveUnitPrice) }}</span>
+ </template>
+ </el-table-column>
<el-table-column label="鍚◣鎬讳环(鍏�)"
prop="taxInclusiveTotalPrice"
:formatter="formattedNumber"
- width="150" />
+ width="130">
+ <template #default="scope">
+ <span v-if="scope.row.productType === 2">--</span>
+ <span v-else>{{ formattedNumber(null, null, scope.row.taxInclusiveTotalPrice) }}</span>
+ </template>
+ </el-table-column>
<el-table-column label="涓嶅惈绋庢�讳环(鍏�)"
prop="taxExclusiveTotalPrice"
:formatter="formattedNumber"
- width="150" />
+ width="140">
+ <template #default="scope">
+ <span v-if="scope.row.productType === 2">--</span>
+ <span v-else>{{ formattedNumber(null, null, scope.row.taxExclusiveTotalPrice) }}</span>
+ </template>
+ </el-table-column>
<el-table-column label="鏄惁璐ㄦ"
prop="isChecked"
- width="150">
+ width="100">
<template #default="scope">
- <el-tag :type="scope.row.isChecked ? 'success' : 'info'">
+ <span v-if="scope.row.productType === 2">--</span>
+ <el-tag v-else :type="scope.row.isChecked ? 'success' : 'info'">
{{ scope.row.isChecked ? '鏄�' : '鍚�' }}
</el-tag>
</template>
@@ -533,9 +637,21 @@
ref="productFormRef">
<el-row :gutter="30">
<el-col :span="24">
+ <el-form-item label="绫诲瀷锛�"
+ prop="productType">
+ <el-radio-group v-model="productForm.productType" @change="handleProductTypeChange">
+ <el-radio :label="1">浜у搧</el-radio>
+ <el-radio :label="2">璁惧澶囦欢</el-radio>
+ </el-radio-group>
+ </el-form-item>
+ </el-col>
+ </el-row>
+ <el-row :gutter="30">
+ <el-col :span="24">
<el-form-item label="浜у搧澶х被锛�"
prop="productId">
- <el-tree-select v-model="productForm.productId"
+ <el-tree-select v-if="productForm.productType !== 2"
+ v-model="productForm.productId"
placeholder="璇烽�夋嫨"
clearable
filterable
@@ -544,10 +660,22 @@
:data="productOptions"
:render-after-expand="false"
style="width: 100%" />
+ <el-select v-else
+ v-model="productForm.productId"
+ placeholder="璇烽�夋嫨璁惧澶囦欢"
+ filterable
+ clearable
+ @change="handleSparePartsChange"
+ style="width: 100%">
+ <el-option v-for="item in sparePartsOptions"
+ :key="item.id"
+ :label="item.name"
+ :value="item.id" />
+ </el-select>
</el-form-item>
</el-col>
</el-row>
- <el-row :gutter="30">
+ <el-row :gutter="30" v-if="productForm.productType !== 2">
<el-col :span="24">
<el-form-item label="瑙勬牸鍨嬪彿锛�"
prop="productModelId">
@@ -564,7 +692,7 @@
</el-form-item>
</el-col>
</el-row>
- <el-row :gutter="30">
+ <el-row :gutter="30" v-if="productForm.productType !== 2">
<el-col :span="12">
<el-form-item label="鍗曚綅锛�"
prop="unit">
@@ -588,7 +716,7 @@
</el-form-item>
</el-col>
</el-row>
- <el-row :gutter="30">
+ <el-row :gutter="30" v-if="productForm.productType !== 2">
<el-col :span="12">
<el-form-item label="鍚◣鍗曚环(鍏�)锛�"
prop="taxInclusiveUnitPrice">
@@ -615,7 +743,21 @@
</el-form-item>
</el-col>
</el-row>
- <el-row :gutter="30">
+ <el-row :gutter="30" v-if="productForm.productType === 2">
+ <el-col :span="24">
+ <el-form-item label="鏁伴噺锛�"
+ prop="quantity">
+ <el-input-number :step="0.1"
+ clearable
+ :precision="2"
+ :min="0"
+ style="width: 100%"
+ v-model="productForm.quantity"
+ placeholder="璇疯緭鍏�" />
+ </el-form-item>
+ </el-col>
+ </el-row>
+ <el-row :gutter="30" v-if="productForm.productType !== 2">
<el-col :span="12">
<el-form-item label="鍚◣鎬讳环(鍏�)锛�"
prop="taxInclusiveTotalPrice">
@@ -655,7 +797,7 @@
</el-select>
</el-form-item>
</el-col>
- <el-col :span="12">
+ <el-col :span="12" v-if="productForm.productType !== 2">
<el-form-item label="搴撳瓨棰勮鏁伴噺锛�"
prop="warnNum">
<el-input-number v-model="productForm.warnNum"
@@ -667,7 +809,7 @@
</el-form-item>
</el-col>
</el-row>
- <el-row :gutter="30">
+ <el-row :gutter="30" v-if="productForm.productType !== 2">
<el-col :span="12">
<el-form-item label="鏄惁璐ㄦ锛�"
prop="isChecked">
@@ -740,6 +882,7 @@
const modelOptions = ref([]);
const userList = ref([]);
const productOptions = ref([]);
+ const sparePartsOptions = ref([]);
const salesContractList = ref([]);
const supplierList = ref([]);
const tableLoading = ref(false);
@@ -753,6 +896,7 @@
const fileList = ref([]);
import useUserStore from "@/store/modules/user";
import { modelList, productTreeList } from "@/api/basicData/product.js";
+ import { getSparePartsList } from "@/api/equipmentManagement/spareParts.js";
import dayjs from "dayjs";
import FileUpload from "@/components/AttachmentUpload/file/index.vue";
@@ -956,6 +1100,7 @@
const currentId = ref("");
const productFormData = reactive({
productForm: {
+ productType: 1,
productId: "",
productCategory: "",
productModelId: "",
@@ -987,10 +1132,27 @@
{ required: true, message: "璇疯緭鍏�", trigger: "blur" },
],
invoiceType: [{ required: true, message: "璇烽�夋嫨", trigger: "change" }],
- isChecked: [{ required: true, message: "璇烽�夋嫨", trigger: "change" }],
+ // isChecked 榛樿浼犲惁锛屼笉闇�瑕侀獙璇�
},
});
- const { productForm, productRules } = toRefs(productFormData);
+ const { productForm } = toRefs(productFormData);
+
+ // 鍔ㄦ�佽绠楅獙璇佽鍒�
+ const productRules = computed(() => {
+ const isSpareParts = productForm.value.productType === 2;
+ return {
+ productId: [{ required: true, message: "璇烽�夋嫨", trigger: "change" }],
+ productModelId: isSpareParts ? [] : [{ required: true, message: "璇烽�夋嫨", trigger: "change" }],
+ unit: isSpareParts ? [] : [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
+ quantity: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
+ taxInclusiveUnitPrice: isSpareParts ? [] : [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
+ taxRate: isSpareParts ? [] : [{ required: true, message: "璇烽�夋嫨", trigger: "change" }],
+ warnNum: isSpareParts ? [] : [{ required: true, message: "璇烽�夋嫨", trigger: "change" }],
+ taxInclusiveTotalPrice: isSpareParts ? [] : [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
+ taxExclusiveTotalPrice: isSpareParts ? [] : [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
+ invoiceType: [{ required: true, message: "璇烽�夋嫨", trigger: "change" }],
+ };
+ });
const upload = reactive({
// 涓婁紶鐨勫湴鍧�
url: import.meta.env.VITE_APP_BASE_API + "/file/upload",
@@ -1472,16 +1634,27 @@
await nextTick();
if (type === "add") {
- productForm.value.isChecked = false;
+ productForm.value.isChecked = false; // 鏄惁璐ㄦ榛樿浼犲惁
+ productForm.value.productType = "product";
}
if (type === "edit") {
// 澶嶅埗琛屾暟鎹�
productForm.value = { ...row };
+ // 濡傛灉娌℃湁 productType锛岄粯璁や负 product (1)
+ if (!productForm.value.productType) {
+ productForm.value.productType = 1;
+ }
+
+ // 濡傛灉鏄澶囧浠剁被鍨嬶紝鍔犺浇璁惧澶囦欢鍒楄〃
+ if (productForm.value.productType === 2) {
+ await getSparePartsOptions();
+ }
+
// 濡傛灉鏄粠妯℃澘鍔犺浇鐨勬暟鎹紝鍙兘娌℃湁 productId 鍜� productModelId
// 闇�瑕佹牴鎹� productCategory 鍜� specificationModel 鏉ユ煡鎵惧搴旂殑 ID
- if (!productForm.value.productId && productForm.value.productCategory) {
+ if (!productForm.value.productId && productForm.value.productCategory && productForm.value.productType !== 2) {
// 鏍规嵁 productCategory 鏌ユ壘 productId
const findProductIdByCategory = (nodes, categoryName) => {
for (let i = 0; i < nodes.length; i++) {
@@ -1549,6 +1722,45 @@
return res;
});
};
+
+ // 鑾峰彇璁惧澶囦欢鍒楄〃
+ const getSparePartsOptions = () => {
+ return getSparePartsList({ current: -1, size: -1 }).then(res => {
+ if (res.data && Array.isArray(res.data.rows)) {
+ sparePartsOptions.value = res.data.rows;
+ } else if (res.data && Array.isArray(res.data.records)) {
+ sparePartsOptions.value = res.data.records;
+ } else {
+ sparePartsOptions.value = [];
+ }
+ return res;
+ });
+ };
+
+ // 澶勭悊绫诲瀷鍙樺寲
+ const handleProductTypeChange = (type) => {
+ productForm.value.productId = "";
+ productForm.value.productCategory = "";
+ productForm.value.productModelId = "";
+ productForm.value.specificationModel = "";
+ modelOptions.value = [];
+
+ if (type === 2) {
+ getSparePartsOptions();
+ }
+ };
+
+ // 澶勭悊璁惧澶囦欢閫夋嫨
+ const handleSparePartsChange = (value) => {
+ const selectedSparePart = sparePartsOptions.value.find(item => item.id === value);
+ if (selectedSparePart) {
+ productForm.value.productCategory = selectedSparePart.name;
+ productForm.value.specificationModel = "/";
+ } else {
+ productForm.value.productCategory = "";
+ productForm.value.specificationModel = "";
+ }
+ };
const getModels = value => {
if (value) {
productForm.value.productCategory =
@@ -1605,6 +1817,19 @@
// 鎻愪氦浜у搧琛ㄥ崟
const submitProduct = () => {
+ // 濡傛灉鏄澶囧浠讹紝鍏堣缃粯璁ゅ�硷紝鍐嶉獙璇�
+ if (productForm.value.productType === 2) {
+ productForm.value.specificationModel = "/";
+ productForm.value.productModelId = null;
+ productForm.value.unit = "";
+ productForm.value.taxRate = "";
+ productForm.value.taxInclusiveUnitPrice = 0;
+ productForm.value.taxInclusiveTotalPrice = 0;
+ productForm.value.taxExclusiveTotalPrice = 0;
+ productForm.value.warnNum = 0;
+ productForm.value.isChecked = false; // 鏄惁璐ㄦ榛樿浼犲惁
+ }
+
proxy.$refs["productFormRef"].validate(valid => {
if (valid) {
if (operationType.value === "edit") {
diff --git a/src/views/procurementManagement/receivingManagement/index.vue b/src/views/procurementManagement/receivingManagement/index.vue
new file mode 100644
index 0000000..a0d54a5
--- /dev/null
+++ b/src/views/procurementManagement/receivingManagement/index.vue
@@ -0,0 +1,320 @@
+<template>
+ <div class="app-container">
+ <div class="search_form">
+ <el-form :model="searchForm" :inline="true">
+ <el-form-item label="渚涘簲鍟嗗悕绉帮細">
+ <el-input
+ v-model="searchForm.supplierName"
+ placeholder="璇疯緭鍏�"
+ clearable
+ prefix-icon="Search"
+ @change="handleQuery"
+ />
+ </el-form-item>
+ <el-form-item label="閲囪喘鍚堝悓鍙凤細">
+ <el-input
+ v-model="searchForm.purchaseContractNumber"
+ style="width: 240px"
+ placeholder="璇疯緭鍏�"
+ clearable
+ prefix-icon="Search"
+ @change="handleQuery"
+ />
+ </el-form-item>
+ <el-form-item label="閿�鍞悎鍚屽彿锛�">
+ <el-input
+ v-model="searchForm.salesContractNo"
+ placeholder="璇疯緭鍏�"
+ clearable
+ prefix-icon="Search"
+ @change="handleQuery"
+ />
+ </el-form-item>
+ <el-form-item label="椤圭洰鍚嶇О锛�">
+ <el-input
+ v-model="searchForm.projectName"
+ placeholder="璇疯緭鍏�"
+ clearable
+ prefix-icon="Search"
+ @change="handleQuery"
+ />
+ </el-form-item>
+ <el-form-item label="褰曞叆鏃ユ湡锛�">
+ <el-date-picker
+ v-model="searchForm.entryDate"
+ value-format="YYYY-MM-DD"
+ format="YYYY-MM-DD"
+ type="daterange"
+ placeholder="璇烽�夋嫨"
+ clearable
+ @change="changeDaterange"
+ />
+ </el-form-item>
+ <el-form-item>
+ <el-button type="primary" @click="handleQuery">鎼滅储</el-button>
+ </el-form-item>
+ </el-form>
+ </div>
+
+ <div class="table_list">
+ <el-table
+ :data="tableData"
+ border
+ v-loading="tableLoading"
+ :expand-row-keys="expandedRowKeys"
+ :row-key="(row) => row.id"
+ show-summary
+ :summary-method="summarizeMainTable"
+ @expand-change="expandChange"
+ height="calc(100vh - 21.5em)"
+ >
+ <el-table-column type="expand">
+ <template #default="props">
+ <el-table
+ :data="props.row.children"
+ border
+ show-summary
+ :summary-method="summarizeChildrenTable"
+ >
+ <el-table-column align="center" label="搴忓彿" type="index" width="60" />
+ <el-table-column label="浜у搧澶х被" prop="productCategory" />
+ <el-table-column label="瑙勬牸鍨嬪彿" prop="specificationModel" />
+ <el-table-column label="鍗曚綅" prop="unit" />
+ <el-table-column label="鏁伴噺" prop="quantity" />
+ <el-table-column label="鍙敤鏁伴噺" prop="availableQuality" />
+ <el-table-column label="閫�璐ф暟閲�" prop="returnQuality" />
+ <el-table-column label="绋庣巼(%)" prop="taxRate" />
+ <el-table-column label="鍚◣鍗曚环(鍏�)" prop="taxInclusiveUnitPrice" :formatter="formattedNumber" />
+ <el-table-column label="鍚◣鎬讳环(鍏�)" prop="taxInclusiveTotalPrice" :formatter="formattedNumber" />
+ <el-table-column label="涓嶅惈绋庢�讳环(鍏�)" prop="taxExclusiveTotalPrice" :formatter="formattedNumber" />
+ </el-table>
+ </template>
+ </el-table-column>
+ <el-table-column align="center" label="搴忓彿" type="index" width="60" />
+ <el-table-column label="閲囪喘鍚堝悓鍙�" prop="purchaseContractNumber" width="160" show-overflow-tooltip />
+ <el-table-column label="閿�鍞悎鍚屽彿" prop="salesContractNo" width="160" show-overflow-tooltip />
+ <el-table-column label="渚涘簲鍟嗗悕绉�" prop="supplierName" width="160" show-overflow-tooltip />
+ <el-table-column label="椤圭洰鍚嶇О" prop="projectName" width="320" show-overflow-tooltip />
+ <el-table-column label="鏀惰揣鐘舵��" prop="status" width="100" show-overflow-tooltip>
+ <template #default="scope">
+ <el-tag :type="getReceiptStatusType(scope.row.status)" size="small">
+ {{ receiptStatusText[scope.row.status] || '鏈煡鐘舵��' }}
+ </el-tag>
+ </template>
+ </el-table-column>
+ <el-table-column label="瀹℃壒鐘舵��" prop="approvalStatus" width="100" show-overflow-tooltip>
+ <template #default="scope">
+ <el-tag :type="getApprovalStatusType(scope.row.approvalStatus)" size="small">
+ {{ approvalStatusText[scope.row.approvalStatus] || '鏈煡鐘舵��' }}
+ </el-tag>
+ </template>
+ </el-table-column>
+ <el-table-column label="绛捐鏃ユ湡" prop="executionDate" width="100" show-overflow-tooltip />
+ <el-table-column label="浠樻鏂瑰紡" prop="paymentMethod" width="100" show-overflow-tooltip />
+ <el-table-column label="鍚堝悓閲戦(鍏�)" prop="contractAmount" width="200" show-overflow-tooltip :formatter="formattedNumber" />
+ <el-table-column label="褰曞叆浜�" prop="recorderName" width="120" show-overflow-tooltip />
+ <el-table-column label="褰曞叆鏃ユ湡" prop="entryDate" width="100" show-overflow-tooltip />
+ <el-table-column label="澶囨敞" prop="remarks" width="200" show-overflow-tooltip />
+ <el-table-column fixed="right" label="鎿嶄綔" width="120" align="center">
+ <template #default="scope">
+ <el-button
+ link
+ type="primary"
+ :disabled="isConfirmed(scope.row)"
+ @click="confirmReceipt(scope.row)"
+ >
+ {{ isConfirmed(scope.row) ? '宸叉敹璐�' : '纭鏀惰揣' }}
+ </el-button>
+ </template>
+ </el-table-column>
+ </el-table>
+
+ <pagination
+ v-show="total > 0"
+ :total="total"
+ layout="total, sizes, prev, pager, next, jumper"
+ :page="page.current"
+ :limit="page.size"
+ @pagination="paginationChange"
+ />
+ </div>
+ </div>
+</template>
+
+<script setup>
+import { onMounted, reactive, ref } from 'vue'
+import { ElMessage, ElMessageBox } from 'element-plus'
+import dayjs from 'dayjs'
+import Pagination from '@/components/PIMTable/Pagination.vue'
+import { productList, purchaseListPage, updateApprovalStatus } from '@/api/procurementManagement/procurementLedger.js'
+
+const tableData = ref([])
+const tableLoading = ref(false)
+const total = ref(0)
+const expandedRowKeys = ref([])
+const receiptResultMap = ref({})
+
+const page = reactive({
+ current: 1,
+ size: 100
+})
+
+const searchForm = reactive({
+ supplierName: '',
+ purchaseContractNumber: '',
+ salesContractNo: '',
+ projectName: '',
+ entryDate: [],
+ entryDateStart: undefined,
+ entryDateEnd: undefined
+})
+
+const approvalStatusText = {
+ 1: '寰呭鏍�',
+ 2: '瀹℃壒涓�',
+ 3: '瀹℃壒閫氳繃',
+ 4: '瀹℃壒澶辫触'
+}
+
+const receiptStatusText = {
+ 1: '寰呮敹璐�',
+ 2: '鏀惰揣涓�',
+ 3: '宸叉敹璐�'
+}
+
+const getApprovalStatusType = (status) => {
+ const typeMap = {
+ 1: 'info',
+ 2: 'warning',
+ 3: 'success',
+ 4: 'danger'
+ }
+ return typeMap[status]
+}
+
+const getReceiptStatusType = (status) => {
+ const typeMap = {
+ 1: 'info',
+ 2: 'warning',
+ 3: 'success'
+ }
+ return typeMap[status]
+}
+
+const formattedNumber = (_row, _column, cellValue) => {
+ const value = Number(cellValue)
+ return Number.isFinite(value) ? value.toFixed(2) : '0.00'
+}
+
+const createSummary = (columns, data, sumFields) => {
+ const sums = []
+ columns.forEach((column, index) => {
+ if (index === 0) {
+ sums[index] = '鍚堣'
+ return
+ }
+ if (!sumFields.includes(column.property)) {
+ sums[index] = ''
+ return
+ }
+ const totalValue = data.reduce((sum, item) => sum + Number(item?.[column.property] || 0), 0)
+ sums[index] = Number.isFinite(totalValue) ? totalValue.toFixed(2) : '0.00'
+ })
+ return sums
+}
+
+const summarizeMainTable = ({ columns, data }) => createSummary(columns, data, ['contractAmount'])
+
+const summarizeChildrenTable = ({ columns, data }) =>
+ createSummary(columns, data, ['quantity', 'availableQuality', 'returnQuality', 'taxInclusiveUnitPrice', 'taxInclusiveTotalPrice', 'taxExclusiveTotalPrice'])
+
+const isConfirmed = (row) => Number(row?.status) === 3 || Boolean(receiptResultMap.value[row?.id])
+
+const handleQuery = () => {
+ page.current = 1
+ getList()
+}
+
+const changeDaterange = (value) => {
+ if (value) {
+ searchForm.entryDateStart = dayjs(value[0]).format('YYYY-MM-DD')
+ searchForm.entryDateEnd = dayjs(value[1]).format('YYYY-MM-DD')
+ } else {
+ searchForm.entryDateStart = undefined
+ searchForm.entryDateEnd = undefined
+ }
+ handleQuery()
+}
+
+const paginationChange = (obj) => {
+ page.current = obj.page
+ page.size = obj.limit
+ getList()
+}
+
+const expandChange = async (row, expandedRows) => {
+ if (expandedRows.length > 0) {
+ expandedRowKeys.value = []
+ try {
+ const res = await productList({ salesLedgerId: row.id, type: 2 })
+ const index = tableData.value.findIndex((item) => item.id === row.id)
+ if (index > -1) {
+ tableData.value[index].children = res.data || []
+ expandedRowKeys.value.push(row.id)
+ }
+ } catch (_error) {
+ ElMessage.error('鍔犺浇浜у搧鍒楄〃澶辫触')
+ const index = expandedRows.findIndex((item) => item.id === row.id)
+ if (index > -1) {
+ expandedRows.splice(index, 1)
+ }
+ }
+ } else {
+ expandedRowKeys.value = []
+ }
+}
+
+const getList = () => {
+ tableLoading.value = true
+ const { entryDate, ...rest } = searchForm
+ purchaseListPage({ ...rest, ...page, approvalStatus: 3 })
+ .then((res) => {
+ tableData.value = (res.data?.records || []).map((record) => ({
+ ...record,
+ children: []
+ }))
+ total.value = res.data?.total || 0
+ expandedRowKeys.value = []
+ })
+ .finally(() => {
+ tableLoading.value = false
+ })
+}
+
+const confirmReceipt = async (row) => {
+ try {
+ await ElMessageBox.confirm('鏄惁纭鏀惰揣锛�', '纭鏀惰揣', {
+ type: 'warning',
+ confirmButtonText: '纭',
+ cancelButtonText: '鍙栨秷'
+ })
+
+ await updateApprovalStatus({
+ id: row.id,
+ status: 3
+ })
+
+ receiptResultMap.value[row.id] = true
+ ElMessage.success('纭鏀惰揣鎴愬姛')
+ getList()
+ } catch (error) {
+ if (error !== 'cancel' && error !== 'close') {
+ ElMessage.error('纭鏀惰揣澶辫触')
+ }
+ }
+}
+
+onMounted(() => {
+ getList()
+})
+</script>
diff --git a/src/views/procurementManagement/receivingManagement/modal/ReceiptForm.vue b/src/views/procurementManagement/receivingManagement/modal/ReceiptForm.vue
new file mode 100644
index 0000000..345431c
--- /dev/null
+++ b/src/views/procurementManagement/receivingManagement/modal/ReceiptForm.vue
@@ -0,0 +1,338 @@
+<template>
+ <FormDialog
+ v-model="dialogVisible"
+ title="纭鏀惰揣"
+ width="70%"
+ operation-type="edit"
+ @close="handleClose"
+ @cancel="handleClose"
+ @confirm="handleConfirm"
+ >
+ <el-form ref="formRef" :model="detailData" label-width="140px" label-position="top">
+ <el-row :gutter="30">
+ <el-col :span="12">
+ <el-form-item label="閲囪喘鍚堝悓鍙凤細">
+ <el-input :model-value="detailData.purchaseContractNumber || ''" disabled />
+ </el-form-item>
+ </el-col>
+ <el-col :span="12">
+ <el-form-item label="閿�鍞悎鍚屽彿锛�">
+ <el-input :model-value="detailData.salesContractNo || ''" disabled />
+ </el-form-item>
+ </el-col>
+ </el-row>
+
+ <el-row :gutter="30">
+ <el-col :span="12">
+ <el-form-item label="渚涘簲鍟嗗悕绉帮細">
+ <el-input :model-value="detailData.supplierName || ''" disabled />
+ </el-form-item>
+ </el-col>
+ <el-col :span="12">
+ <el-form-item label="椤圭洰鍚嶇О锛�">
+ <el-input :model-value="detailData.projectName || ''" disabled />
+ </el-form-item>
+ </el-col>
+ </el-row>
+
+ <el-row :gutter="30">
+ <el-col :span="12">
+ <el-form-item label="浠樻鏂瑰紡锛�">
+ <el-input :model-value="detailData.paymentMethod || ''" disabled />
+ </el-form-item>
+ </el-col>
+ <el-col :span="12">
+ <el-form-item label="绛捐鏃ユ湡锛�">
+ <el-input :model-value="detailData.executionDate || ''" disabled />
+ </el-form-item>
+ </el-col>
+ </el-row>
+
+ <el-row :gutter="30">
+ <el-col :span="12">
+ <el-form-item label="褰曞叆浜猴細">
+ <el-input :model-value="detailData.recorderName || ''" disabled />
+ </el-form-item>
+ </el-col>
+ <el-col :span="12">
+ <el-form-item label="褰曞叆鏃ユ湡锛�">
+ <el-input :model-value="detailData.entryDate || ''" disabled />
+ </el-form-item>
+ </el-col>
+ </el-row>
+
+ <el-row :gutter="30">
+ <el-col :span="24">
+ <el-form-item label="瀹℃壒浜洪�夋嫨锛�">
+ <div class="approver-nodes-container">
+ <div v-for="(name, index) in approverNames" :key="`${name}-${index}`" class="approver-node-item">
+ <div class="approver-node-header">
+ <span class="approver-node-label">瀹℃壒鑺傜偣 {{ index + 1 }}</span>
+ </div>
+ <el-input :model-value="name" disabled />
+ </div>
+ <el-empty v-if="!approverNames.length" description="鏆傛棤瀹℃壒浜轰俊鎭�" />
+ </div>
+ </el-form-item>
+ </el-col>
+ </el-row>
+
+ <el-form-item label="浜у搧淇℃伅锛�">
+ <el-table :data="detailData.productData" border show-summary :summary-method="summarizeProductTable">
+ <el-table-column align="center" label="搴忓彿" type="index" width="60" />
+ <el-table-column label="浜у搧澶х被" prop="productCategory" />
+ <el-table-column label="瑙勬牸鍨嬪彿" prop="specificationModel" />
+ <el-table-column label="鍗曚綅" prop="unit" width="70" />
+ <el-table-column label="鏁伴噺" prop="quantity" width="90" />
+ <el-table-column label="搴撳瓨棰勮鏁伴噺" prop="warnNum" width="120" show-overflow-tooltip />
+ <el-table-column label="绋庣巼(%)" prop="taxRate" width="80" />
+ <el-table-column label="鍚◣鍗曚环(鍏�)" prop="taxInclusiveUnitPrice" width="150" :formatter="formattedNumber" />
+ <el-table-column label="鍚◣鎬讳环(鍏�)" prop="taxInclusiveTotalPrice" width="150" :formatter="formattedNumber" />
+ <el-table-column label="涓嶅惈绋庢�讳环(鍏�)" prop="taxExclusiveTotalPrice" width="150" :formatter="formattedNumber" />
+ <el-table-column label="鏄惁璐ㄦ" prop="isChecked" width="100">
+ <template #default="scope">
+ <el-tag :type="scope.row.isChecked ? 'success' : 'info'">
+ {{ scope.row.isChecked ? '鏄�' : '鍚�' }}
+ </el-tag>
+ </template>
+ </el-table-column>
+ <el-table-column label="鏄惁鍚堟牸" min-width="180">
+ <template #default="scope">
+ <el-form-item
+ :prop="`productData.${scope.$index}.isQualified`"
+ :rules="[{ required: true, message: '璇烽�夋嫨鏄惁鍚堟牸', trigger: 'change' }]"
+ class="inline-form-item"
+ >
+ <el-radio-group v-model="scope.row.isQualified">
+ <el-radio :label="1">鍚堟牸</el-radio>
+ <el-radio :label="2">涓嶅悎鏍�</el-radio>
+ </el-radio-group>
+ </el-form-item>
+ </template>
+ </el-table-column>
+ <el-table-column label="涓嶅悎鏍煎師鍥�" min-width="220">
+ <template #default="scope">
+ <el-form-item
+ :prop="`productData.${scope.$index}.reason`"
+ :rules="[{
+ validator: (_rule, value, callback) => validateReason(scope.row, value, callback),
+ trigger: 'blur'
+ }]"
+ class="inline-form-item"
+ >
+ <el-input
+ v-model="scope.row.reason"
+ :disabled="scope.row.isQualified !== 2"
+ placeholder="涓嶅悎鏍兼椂璇峰~鍐欏師鍥�"
+ clearable
+ />
+ </el-form-item>
+ </template>
+ </el-table-column>
+ </el-table>
+ </el-form-item>
+
+ <el-row :gutter="30">
+ <el-col :span="24">
+ <el-form-item label="澶囨敞锛�">
+ <el-input :model-value="detailData.remarks || ''" type="textarea" :rows="2" disabled />
+ </el-form-item>
+ </el-col>
+ </el-row>
+
+ <el-row :gutter="30">
+ <el-col :span="24">
+ <el-form-item label="闄勪欢鏉愭枡锛�">
+ <div class="file-list">
+ <el-tag v-for="file in detailData.salesLedgerFiles" :key="file.id || file.fileName" class="file-tag">
+ {{ file.fileName || file.name }}
+ </el-tag>
+ <el-empty v-if="!detailData.salesLedgerFiles?.length" description="鏆傛棤闄勪欢" />
+ </div>
+ </el-form-item>
+ </el-col>
+ </el-row>
+ </el-form>
+ </FormDialog>
+</template>
+
+<script setup>
+import { computed, reactive, ref, watch } from 'vue'
+import { ElMessage } from 'element-plus'
+import FormDialog from '@/components/Dialog/FormDialog.vue'
+
+const props = defineProps({
+ modelValue: {
+ type: Boolean,
+ default: false
+ },
+ record: {
+ type: Object,
+ default: () => ({})
+ }
+})
+
+const emit = defineEmits(['update:modelValue', 'submit'])
+
+const formRef = ref()
+
+const dialogVisible = computed({
+ get: () => props.modelValue,
+ set: (value) => emit('update:modelValue', value)
+})
+
+const createDefaultDetail = () => ({
+ id: '',
+ purchaseContractNumber: '',
+ salesContractNo: '',
+ supplierName: '',
+ projectName: '',
+ paymentMethod: '',
+ executionDate: '',
+ recorderName: '',
+ entryDate: '',
+ remarks: '',
+ approveUserIds: '',
+ approverNames: [],
+ salesLedgerFiles: [],
+ productData: []
+})
+
+const detailData = reactive(createDefaultDetail())
+
+const approverNames = computed(() => detailData.approverNames || [])
+
+const formattedNumber = (_row, _column, cellValue) => {
+ const value = Number(cellValue)
+ return Number.isFinite(value) ? value.toFixed(2) : '0.00'
+}
+
+const summarizeProductTable = ({ columns, data }) => {
+ const sumFields = ['quantity', 'taxInclusiveUnitPrice', 'taxInclusiveTotalPrice', 'taxExclusiveTotalPrice']
+ const sums = []
+ columns.forEach((column, index) => {
+ if (index === 0) {
+ sums[index] = '鍚堣'
+ return
+ }
+ if (!sumFields.includes(column.property)) {
+ sums[index] = ''
+ return
+ }
+ const total = data.reduce((sum, item) => sum + Number(item?.[column.property] || 0), 0)
+ sums[index] = Number.isFinite(total) ? total.toFixed(2) : '0.00'
+ })
+ return sums
+}
+
+const validateReason = (row, value, callback) => {
+ if (row.isQualified === 2 && (!value || !value.trim())) {
+ callback(new Error('涓嶅悎鏍兼椂蹇呴』濉啓鍘熷洜'))
+ return
+ }
+ callback()
+}
+
+watch(
+ () => props.record,
+ (value) => {
+ const nextData = createDefaultDetail()
+ Object.assign(nextData, value || {})
+ nextData.productData = (value?.productData || []).map((item) => ({
+ ...item,
+ isQualified: item.isQualified ?? undefined,
+ reason: item.reason || ''
+ }))
+ nextData.salesLedgerFiles = value?.salesLedgerFiles || []
+ nextData.approverNames = value?.approverNames || []
+ Object.assign(detailData, nextData)
+ },
+ { immediate: true, deep: true }
+)
+
+const handleClose = () => {
+ dialogVisible.value = false
+}
+
+const handleConfirm = async () => {
+ if (!formRef.value) {
+ return
+ }
+ try {
+ await formRef.value.validate()
+ const unqualifiedRows = detailData.productData.filter((item) => item.isQualified === 2)
+ emit('submit', {
+ id: detailData.id,
+ purchaseContractNumber: detailData.purchaseContractNumber,
+ supplierName: detailData.supplierName,
+ projectName: detailData.projectName,
+ productData: detailData.productData.map((item) => ({
+ id: item.id,
+ specificationModel: item.specificationModel,
+ quantity: item.quantity,
+ isQualified: item.isQualified,
+ reason: item.reason || ''
+ })),
+ unqualifiedQuantity: unqualifiedRows.reduce((sum, item) => sum + Number(item.quantity || 0), 0)
+ })
+ dialogVisible.value = false
+ } catch (_error) {
+ ElMessage.warning('璇峰厛瀹屾垚姣忔潯浜у搧鐨勬敹璐у垽鏂�')
+ }
+}
+</script>
+
+<style scoped lang="scss">
+.approver-nodes-container {
+ display: flex;
+ flex-wrap: wrap;
+ gap: 16px;
+ width: 100%;
+}
+
+.approver-node-item {
+ flex: 0 0 calc(33.333% - 12px);
+ min-width: 220px;
+ padding: 12px;
+ background-color: #fff;
+ border-radius: 4px;
+ border: 1px solid #dcdfe6;
+}
+
+.approver-node-header {
+ margin-bottom: 8px;
+}
+
+.approver-node-label {
+ font-size: 13px;
+ font-weight: 500;
+ color: #606266;
+}
+
+.inline-form-item {
+ margin-bottom: 0;
+}
+
+.file-list {
+ display: flex;
+ flex-wrap: wrap;
+ gap: 8px;
+ width: 100%;
+}
+
+.file-tag {
+ margin-right: 0;
+}
+
+@media (max-width: 1200px) {
+ .approver-node-item {
+ flex: 0 0 calc(50% - 8px);
+ }
+}
+
+@media (max-width: 768px) {
+ .approver-node-item {
+ flex: 0 0 100%;
+ }
+}
+</style>
diff --git a/src/views/qualityManagement/finalInspection/components/formDia.vue b/src/views/qualityManagement/finalInspection/components/formDia.vue
index 10bfad9..458ab96 100644
--- a/src/views/qualityManagement/finalInspection/components/formDia.vue
+++ b/src/views/qualityManagement/finalInspection/components/formDia.vue
@@ -9,6 +9,28 @@
<el-form :model="form" label-width="140px" label-position="top" :rules="rules" ref="formRef">
<el-row :gutter="30">
<el-col :span="12">
+ <el-form-item label="閿�鍞鍗曪細" prop="salesLedgerId">
+ <el-select
+ v-model="form.salesLedgerId"
+ placeholder="璇烽�夋嫨閿�鍞鍗�"
+ clearable
+ filterable
+ :disabled="isViewMode"
+ style="width: 100%"
+ @change="handleSalesLedgerChange"
+ >
+ <el-option
+ v-for="item in salesLedgerOptions"
+ :key="item.id"
+ :label="item.salesContractNo"
+ :value="item.id"
+ />
+ </el-select>
+ </el-form-item>
+ </el-col>
+ </el-row>
+ <el-row :gutter="30">
+ <el-col :span="12">
<el-form-item label="浜у搧鍚嶇О锛�" prop="productId">
<el-tree-select
v-model="form.productId"
@@ -168,6 +190,7 @@
import {userListNoPage} from "@/api/system/user.js";
import {qualityInspectDetailByProductId, getQualityTestStandardParamByTestStandardId} from "@/api/qualityManagement/metricMaintenance.js";
import {qualityInspectParamInfo} from "@/api/qualityManagement/qualityInspectParam.js";
+import {ledgerListNoPage} from "@/api/salesManagement/salesLedger.js";
const { proxy } = getCurrentInstance()
const emit = defineEmits(['close'])
@@ -189,6 +212,8 @@
unqualifiedQuantity: "",
checkCompany: "",
checkResult: "",
+ salesLedgerId: "",
+ salesContractNo: "",
},
rules: {
checkTime: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
@@ -245,6 +270,7 @@
const currentProductId = ref(0);
const testStandardOptions = ref([]); // 鎸囨爣閫夋嫨涓嬫媺妗嗘暟鎹�
const modelOptions = ref([]);
+const salesLedgerOptions = ref([]); // 閿�鍞鍗曚笅鎷夋鏁版嵁
// 鎵撳紑寮规
const openDialog = async (type, row) => {
@@ -255,11 +281,14 @@
proxy.$refs.formRef?.clearValidate();
// 骞惰鍔犺浇鍩虹鏁版嵁
- const [userListsRes] = await Promise.all([
+ const [userListsRes, salesLedgerRes] = await Promise.all([
userListNoPage(),
getProductOptions(),
getOptions().then((res) => {
supplierList.value = res.data;
+ }),
+ ledgerListNoPage({ current: -1, size: -1 }).then((res) => {
+ salesLedgerOptions.value = res.data || [];
})
]);
userList.value = userListsRes.data;
@@ -357,6 +386,16 @@
form.value.unit = modelOptions.value.find(item => item.id == value)?.unit || '';
}
+// 閿�鍞鍗曢�夋嫨鍙樺寲澶勭悊
+const handleSalesLedgerChange = (value) => {
+ const selectedItem = salesLedgerOptions.value.find(item => item.id == value);
+ if (selectedItem) {
+ form.value.salesContractNo = selectedItem.salesContractNo || '';
+ } else {
+ form.value.salesContractNo = '';
+ }
+}
+
const handleQualifiedQuantityChange = (value) => {
if (value === null || value === undefined) {
form.value.qualifiedQuantity = 0;
diff --git a/src/views/qualityManagement/finalInspection/index.vue b/src/views/qualityManagement/finalInspection/index.vue
index 4a59fa4..81d5595 100644
--- a/src/views/qualityManagement/finalInspection/index.vue
+++ b/src/views/qualityManagement/finalInspection/index.vue
@@ -5,16 +5,15 @@
:model="searchForm"
class="demo-form-inline">
<el-row :gutter="20">
- <el-col :span="4">
+ <el-col :span="6">
<el-form-item label="浜у搧鍚嶇О"
prop="productName">
<el-input v-model="searchForm.productName"
- style="width: 240px"
placeholder="璇疯緭鍏ヤ骇鍝佸悕绉版悳绱�"
clearable />
</el-form-item>
</el-col>
- <el-col :span="6">
+ <el-col :span="8">
<el-form-item label="妫�娴嬫棩鏈�"
prop="entryDate">
<el-date-picker v-model="searchForm.entryDate"
@@ -26,21 +25,12 @@
@change="changeDaterange" />
</el-form-item>
</el-col>
- <el-col :span="4">
+ <el-col :span="6">
<el-form-item label="閿�鍞崟鍙�"
prop="salesContractNo">
<el-input v-model="searchForm.salesContractNo"
style="width: 240px"
placeholder="璇疯緭鍏ラ攢鍞崟鍙锋悳绱�"
- clearable />
- </el-form-item>
- </el-col>
- <el-col :span="4">
- <el-form-item label="鐢熶骇宸ュ崟鍙�"
- prop="workOrderNo">
- <el-input v-model="searchForm.workOrderNo"
- style="width: 240px"
- placeholder="璇疯緭鍏ョ敓浜у伐鍗曞彿鎼滅储"
clearable />
</el-form-item>
</el-col>
@@ -55,16 +45,14 @@
</el-col>
</el-row>
</el-form>
- <div class="actions">
- <el-button type="primary"
- @click="openForm('add')">鏂板</el-button>
- <el-button @click="handleOut">瀵煎嚭</el-button>
- <el-button type="danger"
- plain
- @click="handleDelete">鍒犻櫎</el-button>
- </div>
</div>
<div class="table_list">
+ <div style="margin-bottom: 20px; text-align: right;">
+ <el-button type="primary" @click="openQuickCheck">蹇�熸楠�</el-button>
+ <el-button type="primary" @click="openForm('add')">鏂板</el-button>
+ <el-button @click="handleOut">瀵煎嚭</el-button>
+ <el-button type="danger" plain @click="handleDelete">鍒犻櫎</el-button>
+ </div>
<PIMTable rowKey="id"
:column="tableColumn"
:tableData="tableData"
@@ -110,6 +98,8 @@
</div>
</template>
</el-dialog>
+
+
</div>
</template>
@@ -132,6 +122,7 @@
qualityInspectListPage,
qualityInspectUpdate,
submitQualityInspect,
+ batchQuickInspect,
} from "@/api/qualityManagement/rawMaterialInspection.js";
import FilesDia from "@/views/qualityManagement/finalInspection/components/filesDia.vue";
import dayjs from "dayjs";
@@ -152,6 +143,7 @@
},
});
const { searchForm } = toRefs(data);
+
const tableColumn = ref([
{
label: "妫�娴嬫棩鏈�",
@@ -161,11 +153,6 @@
{
label: "閿�鍞崟鍙�",
prop: "salesContractNo",
- width: 120,
- },
- {
- label: "鐢熶骇宸ュ崟鍙�",
- prop: "workOrderNo",
width: 120,
},
{
@@ -399,6 +386,50 @@
formDia.value?.openDialog(type, row);
});
};
+
+ // 鎵撳紑蹇�熸楠岀‘璁ゆ
+ const openQuickCheck = () => {
+ // 妫�鏌ユ槸鍚﹂�夋嫨浜嗘暟鎹�
+ if (!selectedRows.value || selectedRows.value.length === 0) {
+ proxy.$modal.msgWarning("璇峰厛閫夋嫨瑕佹楠岀殑鏁版嵁");
+ return;
+ }
+
+ // 杩囨护鍑烘湭鎻愪氦鐨勬暟鎹�
+ const unSubmittedRows = selectedRows.value.filter(item => item.inspectState !== 1);
+ if (unSubmittedRows.length === 0) {
+ proxy.$modal.msgWarning("閫変腑鐨勬暟鎹凡鍏ㄩ儴鎻愪氦锛屾棤闇�閲嶅妫�楠�");
+ return;
+ }
+
+ const totalCount = selectedRows.value.length;
+ const submittedCount = totalCount - unSubmittedRows.length;
+
+ let confirmMessage = `宸查�夋嫨 ${totalCount} 鏉℃楠屽崟`;
+ if (submittedCount > 0) {
+ confirmMessage += `锛堝叾涓� ${submittedCount} 鏉″凡鎻愪氦锛屽皢鑷姩璺宠繃锛塦;
+ }
+ confirmMessage += `\n\n纭鍚庡皢鑷姩锛歕n路 妫�楠岀粨鏋滆涓�"鍚堟牸"\n路 鍚堟牸鏁伴噺璁句负鎬绘暟\n路 涓嶅悎鏍兼暟閲忚涓� 0\n路 鎻愪氦骞跺叆搴揱;
+
+ ElMessageBox.confirm(confirmMessage, "蹇�熸楠�", {
+ confirmButtonText: "纭",
+ cancelButtonText: "鍙栨秷",
+ type: "warning",
+ dangerouslyUseHTMLString: false,
+ })
+ .then(() => {
+ // 璋冪敤鎵归噺蹇�熸楠屾帴鍙�
+ const ids = unSubmittedRows.map(item => item.id);
+ batchQuickInspect(ids).then(res => {
+ proxy.$modal.msgSuccess(res.msg || "蹇�熸楠屽畬鎴�");
+ getList();
+ });
+ })
+ .catch(() => {
+ proxy.$modal.msg("宸插彇娑�");
+ });
+ };
+
// 鎵撳紑鏂板妫�楠屽脊妗�
const openInspectionForm = (type, row) => {
nextTick(() => {
diff --git a/src/views/qualityManagement/processInspection/index.vue b/src/views/qualityManagement/processInspection/index.vue
index 58d1a3a..85e3811 100644
--- a/src/views/qualityManagement/processInspection/index.vue
+++ b/src/views/qualityManagement/processInspection/index.vue
@@ -30,16 +30,14 @@
@click="handleQuery"
style="margin-left: 10px">鎼滅储</el-button>
</div>
- <div>
- <el-button type="primary"
- @click="openForm('add')">鏂板</el-button>
- <el-button @click="handleOut">瀵煎嚭</el-button>
- <el-button type="danger"
- plain
- @click="handleDelete">鍒犻櫎</el-button>
- </div>
</div>
<div class="table_list">
+ <div style="margin-bottom: 20px; text-align: right;">
+ <el-button type="primary" @click="openQuickCheck">蹇�熸楠�</el-button>
+ <el-button type="primary" @click="openForm('add')">鏂板</el-button>
+ <el-button @click="handleOut">瀵煎嚭</el-button>
+ <el-button type="danger" plain @click="handleDelete">鍒犻櫎</el-button>
+ </div>
<PIMTable rowKey="id"
:column="tableColumn"
:tableData="tableData"
@@ -85,6 +83,8 @@
</div>
</template>
</el-dialog>
+
+
</div>
</template>
@@ -107,6 +107,7 @@
qualityInspectListPage,
qualityInspectUpdate,
submitQualityInspect,
+ batchQuickInspect,
} from "@/api/qualityManagement/rawMaterialInspection.js";
import FilesDia from "@/views/qualityManagement/processInspection/components/filesDia.vue";
import dayjs from "dayjs";
@@ -126,15 +127,11 @@
},
});
const { searchForm } = toRefs(data);
+
const tableColumn = ref([
{
label: "妫�娴嬫棩鏈�",
prop: "checkTime",
- width: 120,
- },
- {
- label: "鐢熶骇宸ュ崟鍙�",
- prop: "workOrderNo",
width: 120,
},
{
@@ -372,6 +369,50 @@
formDia.value?.openDialog(type, row);
});
};
+
+ // 鎵撳紑蹇�熸楠岀‘璁ゆ
+ const openQuickCheck = () => {
+ // 妫�鏌ユ槸鍚﹂�夋嫨浜嗘暟鎹�
+ if (!selectedRows.value || selectedRows.value.length === 0) {
+ proxy.$modal.msgWarning("璇峰厛閫夋嫨瑕佹楠岀殑鏁版嵁");
+ return;
+ }
+
+ // 杩囨护鍑烘湭鎻愪氦鐨勬暟鎹�
+ const unSubmittedRows = selectedRows.value.filter(item => item.inspectState !== 1);
+ if (unSubmittedRows.length === 0) {
+ proxy.$modal.msgWarning("閫変腑鐨勬暟鎹凡鍏ㄩ儴鎻愪氦锛屾棤闇�閲嶅妫�楠�");
+ return;
+ }
+
+ const totalCount = selectedRows.value.length;
+ const submittedCount = totalCount - unSubmittedRows.length;
+
+ let confirmMessage = `宸查�夋嫨 ${totalCount} 鏉℃楠屽崟`;
+ if (submittedCount > 0) {
+ confirmMessage += `锛堝叾涓� ${submittedCount} 鏉″凡鎻愪氦锛屽皢鑷姩璺宠繃锛塦;
+ }
+ confirmMessage += `\n\n纭鍚庡皢鑷姩锛歕n路 妫�楠岀粨鏋滆涓�"鍚堟牸"\n路 鍚堟牸鏁伴噺璁句负鎬绘暟\n路 涓嶅悎鏍兼暟閲忚涓� 0\n路 鎻愪氦骞跺叆搴揱;
+
+ ElMessageBox.confirm(confirmMessage, "蹇�熸楠�", {
+ confirmButtonText: "纭",
+ cancelButtonText: "鍙栨秷",
+ type: "warning",
+ dangerouslyUseHTMLString: false,
+ })
+ .then(() => {
+ // 璋冪敤鎵归噺蹇�熸楠屾帴鍙�
+ const ids = unSubmittedRows.map(item => item.id);
+ batchQuickInspect(ids).then(res => {
+ proxy.$modal.msgSuccess(res.msg || "蹇�熸楠屽畬鎴�");
+ getList();
+ });
+ })
+ .catch(() => {
+ proxy.$modal.msg("宸插彇娑�");
+ });
+ };
+
// 鎵撳紑鏂板妫�楠屽脊妗�
const openInspectionForm = (type, row) => {
nextTick(() => {
diff --git a/src/views/qualityManagement/rawMaterialInspection/index.vue b/src/views/qualityManagement/rawMaterialInspection/index.vue
index 6d2acd5..609176e 100644
--- a/src/views/qualityManagement/rawMaterialInspection/index.vue
+++ b/src/views/qualityManagement/rawMaterialInspection/index.vue
@@ -31,16 +31,14 @@
style="margin-left: 10px">鎼滅储
</el-button>
</div>
- <div>
- <el-button type="primary"
- @click="openForm('add')">鏂板</el-button>
- <el-button @click="handleOut">瀵煎嚭</el-button>
- <el-button type="danger"
- plain
- @click="handleDelete">鍒犻櫎</el-button>
- </div>
</div>
<div class="table_list">
+ <div style="margin-bottom: 20px; text-align: right;">
+ <el-button type="primary" @click="openQuickCheck">蹇�熸楠�</el-button>
+ <el-button type="primary" @click="openForm('add')">鏂板</el-button>
+ <el-button @click="handleOut">瀵煎嚭</el-button>
+ <el-button type="danger" plain @click="handleDelete">鍒犻櫎</el-button>
+ </div>
<PIMTable rowKey="id"
:column="tableColumn"
:tableData="tableData"
@@ -86,6 +84,8 @@
</div>
</template>
</el-dialog>
+
+
</div>
</template>
@@ -108,6 +108,7 @@
qualityInspectListPage,
qualityInspectUpdate,
submitQualityInspect,
+ batchQuickInspect,
} from "@/api/qualityManagement/rawMaterialInspection.js";
import FilesDia from "@/views/qualityManagement/rawMaterialInspection/components/filesDia.vue";
import dayjs from "dayjs";
@@ -127,6 +128,7 @@
},
});
const { searchForm, rules } = toRefs(data);
+
const tableColumn = ref([
{
label: "妫�娴嬫棩鏈�",
@@ -378,6 +380,50 @@
formDia.value?.openDialog(type, row);
});
};
+
+ // 鎵撳紑蹇�熸楠岀‘璁ゆ
+ const openQuickCheck = () => {
+ // 妫�鏌ユ槸鍚﹂�夋嫨浜嗘暟鎹�
+ if (!selectedRows.value || selectedRows.value.length === 0) {
+ proxy.$modal.msgWarning("璇峰厛閫夋嫨瑕佹楠岀殑鏁版嵁");
+ return;
+ }
+
+ // 杩囨护鍑烘湭鎻愪氦鐨勬暟鎹�
+ const unSubmittedRows = selectedRows.value.filter(item => item.inspectState !== 1);
+ if (unSubmittedRows.length === 0) {
+ proxy.$modal.msgWarning("閫変腑鐨勬暟鎹凡鍏ㄩ儴鎻愪氦锛屾棤闇�閲嶅妫�楠�");
+ return;
+ }
+
+ const totalCount = selectedRows.value.length;
+ const unSubmittedCount = unSubmittedRows.length;
+ const submittedCount = totalCount - unSubmittedCount;
+
+ let confirmMessage = `宸查�夋嫨 ${totalCount} 鏉℃楠屽崟`;
+ if (submittedCount > 0) {
+ confirmMessage += `锛堝叾涓� ${submittedCount} 鏉″凡鎻愪氦锛屽皢鑷姩璺宠繃锛塦;
+ }
+ confirmMessage += `\n\n纭鍚庡皢鑷姩锛歕n路 妫�楠岀粨鏋滆涓�"鍚堟牸"\n路 鍚堟牸鏁伴噺璁句负鎬绘暟\n路 涓嶅悎鏍兼暟閲忚涓� 0\n路 鎻愪氦骞跺叆搴揱;
+
+ ElMessageBox.confirm(confirmMessage, "蹇�熸楠�", {
+ confirmButtonText: "纭",
+ cancelButtonText: "鍙栨秷",
+ type: "warning",
+ dangerouslyUseHTMLString: false,
+ })
+ .then(() => {
+ // 璋冪敤鎵归噺蹇�熸楠屾帴鍙�
+ const ids = unSubmittedRows.map(item => item.id);
+ batchQuickInspect(ids).then(res => {
+ proxy.$modal.msgSuccess(res.msg || "蹇�熸楠屽畬鎴�");
+ getList();
+ });
+ })
+ .catch(() => {
+ proxy.$modal.msg("宸插彇娑�");
+ });
+ };
// 鎵撳紑闄勪欢寮规
const openFilesFormDia = (type, row) => {
nextTick(() => {
diff --git a/src/views/reportAnalysis/dataDashboard/components/basic/center-top.vue b/src/views/reportAnalysis/dataDashboard/components/basic/center-top.vue
index a7d0174..d795f50 100644
--- a/src/views/reportAnalysis/dataDashboard/components/basic/center-top.vue
+++ b/src/views/reportAnalysis/dataDashboard/components/basic/center-top.vue
@@ -5,18 +5,6 @@
<div class="stat-card">
<img src="@/assets/BI/icon@2x.png" alt="鍥炬爣" class="card-icon" />
<div class="card-content">
- <span class="card-label">鍛樺伐鎬绘暟</span>
- <span class="card-value">{{ totalStaff }}</span>
- <div class="card-compare" :class="compareClass(staffYoY)">
- <span>鍚屾瘮</span>
- <span class="compare-value">{{ formatPercent(staffYoY) }}</span>
- <span class="compare-icon">{{ staffYoY >= 0 ? '鈫�' : '鈫�' }}</span>
- </div>
- </div>
- </div>
- <div class="stat-card">
- <img src="@/assets/BI/icon@2x.png" alt="鍥炬爣" class="card-icon" />
- <div class="card-content">
<span class="card-label">瀹㈡埛鎬绘暟</span>
<span class="card-value">{{ totalCustomers }}</span>
<div class="card-compare" :class="compareClass(customersYoY)">
@@ -118,11 +106,9 @@
import { measuringInstrumentListPage } from '@/api/equipmentManagement/measurementEquipment.js'
// 缁熻鏁版嵁
-const totalStaff = ref(0)
const totalCustomers = ref(0)
const totalSuppliers = ref(0)
// 鍚屾瘮
-const staffYoY = ref(0)
const customersYoY = ref(0)
const suppliersYoY = ref(0)
const equipmentNum = ref(0)
@@ -141,11 +127,9 @@
const compareClass = (val) => (val >= 0 ? 'compare-up' : 'compare-down')
-// 鑾峰彇鍛樺伐銆佸鎴枫�佷緵搴斿晢鏁伴噺
+// 鑾峰彇瀹㈡埛銆佷緵搴斿晢鏁伴噺
const getNum = () => {
summaryStatistics().then((res) => {
- totalStaff.value = res.data.totalStaff
- staffYoY.value = res.data.staffGrowthRate
totalCustomers.value = res.data.totalCustomer
customersYoY.value = res.data.customerGrowthRate
totalSuppliers.value = res.data.totalSupplier
@@ -388,6 +372,7 @@
padding: 18px;
height: 240px;
padding-top: 0px;
+ margin-bottom: 20px;
}
.equipment-header {
@@ -459,7 +444,8 @@
background-repeat: no-repeat;
padding: 20px;
padding-top: 10px;
- height: 186px;
+ height: 480px;
+ flex: 1;
}
.event-header {
@@ -483,7 +469,7 @@
list-style: none;
padding: 0;
margin: 0;
- height: 120px; /* 鎸夌敤鎴疯姹傝皟鏁撮珮搴� */
+ height: 210px;
overflow: hidden;
font-size: 15px;
}
diff --git a/src/views/reportAnalysis/dataDashboard/index.vue b/src/views/reportAnalysis/dataDashboard/index.vue
index ff53a7b..9b46494 100644
--- a/src/views/reportAnalysis/dataDashboard/index.vue
+++ b/src/views/reportAnalysis/dataDashboard/index.vue
@@ -28,8 +28,6 @@
<!-- 涓棿鍖哄煙 -->
<div class="center-panel">
<CenterTop />
-
- <CenterBottom />
</div>
<!-- 鍙充晶鍖哄煙 -->
@@ -49,7 +47,6 @@
import LeftTop from './components/basic/left-top.vue'
import LeftBottom from './components/basic/left-bottom.vue'
import CenterTop from './components/basic/center-top.vue'
-import CenterBottom from './components/basic/center-bottom.vue'
import RightTop from './components/basic/right-top.vue'
import RightBottom from './components/basic/right-bottom.vue'
import useUserStore from '@/store/modules/user'
diff --git a/src/views/salesManagement/receiptPaymentLedger/index.vue b/src/views/salesManagement/receiptPaymentLedger/index.vue
index f5a9d8f..abcef02 100644
--- a/src/views/salesManagement/receiptPaymentLedger/index.vue
+++ b/src/views/salesManagement/receiptPaymentLedger/index.vue
@@ -16,7 +16,8 @@
</div>
</div>
<el-row :gutter="20">
- <el-col :span="12">
+ <!-- 宸︿晶瀹㈡埛鍒楄〃 -->
+ <el-col :span="8">
<div class="table_list"
style="width: 100%">
<el-table :data="tableData"
@@ -40,22 +41,17 @@
prop="contractAmounts"
show-overflow-tooltip
:formatter="formattedNumber"
- width="200" />
- <el-table-column label="鍥炴閲戦(鍏�)"
- prop="receiptPaymentAmount"
- show-overflow-tooltip
- :formatter="formattedNumber"
- width="200" />
- <el-table-column label="搴旀敹閲戦(鍏�)"
- prop="receiptableAmount"
- show-overflow-tooltip
- width="200">
- <template #default="{ row, column }">
- <el-text type="danger">
- {{ formattedNumber(row, column, row.receiptableAmount) }}
- </el-text>
- </template>
- </el-table-column>
+ width="150" />
+<!-- <el-table-column label="搴旀敹閲戦(鍏�)"-->
+<!-- prop="receiptableAmount"-->
+<!-- show-overflow-tooltip-->
+<!-- width="150">-->
+<!-- <template #default="{ row, column }">-->
+<!-- <el-text type="danger">-->
+<!-- {{ formattedNumber(row, column, row.receiptableAmount) }}-->
+<!-- </el-text>-->
+<!-- </template>-->
+<!-- </el-table-column>-->
</el-table>
<pagination v-show="total > 0"
:total="total"
@@ -65,57 +61,85 @@
@pagination="paginationChange" />
</div>
</el-col>
- <el-col :span="12">
+ <!-- 鍙充晶璁㈠崟淇℃伅 -->
+ <el-col :span="16">
<div class="table_list"
style="width: 100%">
- <el-table :data="receiptRecord"
+
+ <el-table :data="orderRecord"
border
:row-key="(row) => row.id"
- show-summary
- :summary-method="summarizeMainTable1"
- height="calc(100vh - 18.5em)">
+ v-loading="orderLoading"
+ height="calc(100vh - 20em)">
<el-table-column align="center"
label="搴忓彿"
type="index"
width="60" />
- <el-table-column label="鍚堝悓绛捐鏃ユ湡"
- prop="executionDate"
- show-overflow-tooltip
- width="110" />
- <el-table-column label="閿�鍞悎鍚屽彿"
+ <el-table-column label="閿�鍞鍗�"
prop="salesContractNo"
show-overflow-tooltip
- width="200" />
- <el-table-column label="鍚堝悓閲戦(鍏�)"
- prop="contractAmount"
+ width="150" />
+ <!-- <el-table-column label="鍙戣揣璁㈠崟鍙�"
+ prop="shippingNo"
show-overflow-tooltip
- :formatter="formattedNumber"
- width="200" />
- <el-table-column label="鍥炴閲戦(鍏�)"
- prop="receiptPaymentAmount"
+ width="150" /> -->
+ <el-table-column label="瀹㈡埛鍚嶇О"
+ prop="customerName"
show-overflow-tooltip
- :formatter="formattedNumber"
- width="200" />
- <el-table-column label="搴旀敹閲戦(鍏�)"
- prop="receiptableAmount"
+ width="150" />
+ <el-table-column label="浜у搧鍚嶇О"
+ prop="productName"
show-overflow-tooltip
- width="200">
- <template #default="{ row, column }">
- <el-text type="danger">
- {{ formattedNumber(row, column, row.receiptableAmount) }}
- </el-text>
+ width="150" />
+ <el-table-column label="瑙勬牸鍨嬪彿"
+ prop="specificationModel"
+ show-overflow-tooltip
+ width="120" />
+ <el-table-column label="鍙戣揣鏃堕棿"
+ prop="shippingDate"
+ show-overflow-tooltip
+ width="110" />
+ <el-table-column label="鍙戣揣鏁伴噺"
+ prop="totalQuantity"
+ show-overflow-tooltip
+ width="100" />
+ <!-- <el-table-column label="鍙戣揣杞︾墝鍙�"
+ prop="shippingCarNumber"
+ show-overflow-tooltip
+ width="120" />
+ <el-table-column label="蹇�掑叕鍙�"
+ prop="expressCompany"
+ show-overflow-tooltip
+ width="120" />
+ <el-table-column label="蹇�掑崟鍙�"
+ prop="expressNumber"
+ show-overflow-tooltip
+ width="150" /> -->
+ <el-table-column label="鍙戣揣鐘舵��"
+ prop="status"
+ align="center"
+ width="100">
+ <template #default="{ row }">
+ <el-tag :type="getApprovalStatusType(row.status)">
+ {{ getApprovalStatusText(row.status) }}
+ </el-tag>
</template>
</el-table-column>
+ <el-table-column label="鍑哄簱鍗曞彿"
+ prop="outboundBatches"
+ show-overflow-tooltip
+ width="130" />
</el-table>
- <pagination v-show="recordTotal > 0"
- :total="recordTotal"
+ <pagination v-show="orderTotal > 0"
+ :total="orderTotal"
layout="total, sizes, prev, pager, next, jumper"
- :page="recordPage.current"
- :limit="recordPage.size"
- @pagination="recordPaginationChange" />
+ :page="orderPage.current"
+ :limit="orderPage.size"
+ @pagination="orderPaginationChange" />
</div>
</el-col>
</el-row>
+
</div>
</template>
@@ -123,23 +147,25 @@
import { onMounted, ref, reactive, toRefs, getCurrentInstance } from "vue";
import {
customewTransactions,
- customewTransactionsDetails,
} from "@/api/salesManagement/indicatorStats.js";
+ import { deliveryLedgerListPage } from "@/api/salesManagement/deliveryLedger.js";
import Pagination from "../../../components/PIMTable/Pagination.vue";
+
const { proxy } = getCurrentInstance();
const tableData = ref([]);
- const receiptRecord = ref([]);
+ const orderRecord = ref([]);
const tableLoading = ref(false);
+ const orderLoading = ref(false);
const page = reactive({
current: 1,
size: 100,
});
- const recordPage = reactive({
+ const orderPage = reactive({
current: 1,
size: 100,
});
const total = ref(0);
- const recordTotal = ref(0);
+ const orderTotal = ref(0);
const data = reactive({
searchForm: {
searchText: "",
@@ -148,7 +174,7 @@
});
const customerId = ref("");
const { searchForm } = toRefs(data);
- const originReceiptRecord = ref([]);
+
// 鏌ヨ鍒楄〃
/** 鎼滅储鎸夐挳鎿嶄綔 */
const handleQuery = () => {
@@ -167,9 +193,12 @@
tableData.value = res.data.records;
total.value = res.data.total;
if (tableData.value.length > 0) {
- recordPage.current = 1;
+ orderPage.current = 1;
customerId.value = tableData.value[0].customerId;
- receiptPaymentList(customerId.value);
+ getOrderList(customerId.value);
+ } else {
+ orderRecord.value = [];
+ customerId.value = "";
}
});
};
@@ -180,64 +209,82 @@
const summarizeMainTable = param => {
return proxy.summarizeTable(
param,
- ["invoiceTotal", "receiptPaymentAmount", "unReceiptPaymentAmount"],
+ ["contractAmounts", "receiptableAmount"],
{
- ticketsNum: { noDecimal: true }, // 涓嶄繚鐣欏皬鏁�
- futureTickets: { noDecimal: true }, // 涓嶄繚鐣欏皬鏁�
+ ticketsNum: { noDecimal: true },
+ futureTickets: { noDecimal: true },
}
);
};
- // 瀛愯〃鍚堣鏂规硶
- const summarizeMainTable1 = param => {
- var summarizeTable = proxy.summarizeTable(
- param,
- ["contractAmount", "receiptPaymentAmount", "receiptableAmount"],
- {
- ticketsNum: { noDecimal: true }, // 涓嶄繚鐣欏皬鏁�
- futureTickets: { noDecimal: true }, // 涓嶄繚鐣欏皬鏁�
+
+ // 鑾峰彇璁㈠崟鍒楄〃锛堟牴鎹鎴稩D鏌ヨ鍙戣揣鍙拌处锛�
+ const getOrderList = async (id) => {
+ orderLoading.value = true;
+ try {
+ // 浣跨敤 deliveryLedgerListPage 鎺ュ彛鏍规嵁 customerId 鏌ヨ
+ const res = await deliveryLedgerListPage({
+ customerId: id,
+ current: 1,
+ size: 1000,
+ });
+ let orders = [];
+ if (res.data) {
+ if (Array.isArray(res.data)) {
+ orders = res.data;
+ } else if (res.data.records && Array.isArray(res.data.records)) {
+ orders = res.data.records;
+ }
}
- );
- return summarizeTable;
+
+ orderTotal.value = orders.length;
+ handleOrderPagination({ page: orderPage.current, limit: orderPage.size }, orders);
+ } catch (error) {
+ console.error('鑾峰彇璁㈠崟鍒楄〃澶辫触:', error);
+ orderRecord.value = [];
+ } finally {
+ orderLoading.value = false;
+ }
};
- const receiptPaymentList = id => {
- const param = {
- customerId: id,
- current: recordPage.current,
- size: recordPage.size,
- };
- customewTransactionsDetails(param).then(res => {
- if (Array.isArray(res.data)) {
- originReceiptRecord.value = res.data;
- recordTotal.value = res.data.length;
- handlePagination({ page: 1, limit: recordPage.size });
- } else {
- receiptRecord.value = res.data.records;
- recordTotal.value = res.data.total;
- }
- });
+ // 璁㈠崟鍒楄〃鍒嗛〉
+ const orderPaginationChange = pagination => {
+ orderPage.current = pagination.page;
+ orderPage.size = pagination.limit;
+ getOrderList(customerId.value);
};
- // 姹囨璁板綍鍒楄〃鍒嗛〉
- const recordPaginationChange = pagination => {
- recordPage.current = pagination.page;
- recordPage.size = pagination.limit;
- receiptPaymentList(customerId.value);
+ const handleOrderPagination = ({ page, limit }, allOrders) => {
+ const start = (page - 1) * limit;
+ const end = start + limit;
+ orderRecord.value = allOrders.slice(start, end);
};
const rowClickMethod = row => {
customerId.value = row.customerId;
- receiptPaymentList(customerId.value);
+ orderPage.current = 1;
+ getOrderList(customerId.value);
};
- const handlePagination = ({ page, limit }) => {
- recordPage.current = page;
- recordPage.size = limit;
+ // 瀹℃牳鐘舵�佹爣绛剧被鍨�
+ const getApprovalStatusType = (status) => {
+ const statusMap = {
+ '宸插彂璐�': 'success',
+ '瀹℃牳閫氳繃': 'success',
+ '瀹℃牳涓�': 'warning',
+ '瀹℃牳涓嶉�氳繃': 'danger',
+ };
+ return statusMap[status] || 'info';
+ };
- const start = (page - 1) * limit;
- const end = start + limit;
-
- receiptRecord.value = originReceiptRecord.value.slice(start, end);
+ // 瀹℃牳鐘舵�佹枃鏈�
+ const getApprovalStatusText = (status) => {
+ const statusMap = {
+ '宸插彂璐�': '宸插彂璐�',
+ '瀹℃牳閫氳繃': '瀹℃牳閫氳繃',
+ '瀹℃牳涓�': '瀹℃牳涓�',
+ '瀹℃牳涓嶉�氳繃': '瀹℃牳涓嶉�氳繃',
+ };
+ return statusMap[status] || status || '--';
};
onMounted(() => {
@@ -247,6 +294,7 @@
<style scoped lang="scss">
.table_list {
- width: 50%;
+ width: 100%;
}
+
</style>
diff --git a/src/views/salesManagement/salesLedger/index.vue b/src/views/salesManagement/salesLedger/index.vue
index 604ba82..e7300a4 100644
--- a/src/views/salesManagement/salesLedger/index.vue
+++ b/src/views/salesManagement/salesLedger/index.vue
@@ -419,6 +419,41 @@
</el-row>
<el-row :gutter="30">
<el-col :span="12">
+ <el-form-item label="閲囪喘鍚堝悓鍙凤細" prop="purchaseContractNumber">
+ <el-select
+ v-model="form.purchaseContractNumber"
+ placeholder="璇烽�夋嫨閲囪喘鍚堝悓鍙�"
+ clearable
+ filterable
+ style="width: 100%"
+ :disabled="operationType === 'view'"
+ >
+ <el-option
+ v-for="item in purchaseContractOptions"
+ :key="item.purchaseContractNumber"
+ :label="item.purchaseContractNumber + ' - ' + item.supplierName"
+ :value="item.purchaseContractNumber"
+ />
+ </el-select>
+ </el-form-item>
+ </el-col>
+ <el-col :span="12">
+ <el-form-item label="浜よ揣鏃ユ湡锛�" prop="entryDate">
+ <el-date-picker
+ style="width: 100%"
+ v-model="form.deliveryDate"
+ value-format="YYYY-MM-DD"
+ format="YYYY-MM-DD"
+ type="date"
+ placeholder="璇烽�夋嫨"
+ clearable
+ :disabled="operationType === 'view'"
+ />
+ </el-form-item>
+ </el-col>
+ </el-row>
+ <el-row :gutter="30">
+ <el-col :span="12">
<el-form-item label="褰曞叆浜猴細" prop="entryPerson">
<el-select
v-model="form.entryPerson"
@@ -444,22 +479,6 @@
<el-date-picker
style="width: 100%"
v-model="form.entryDate"
- value-format="YYYY-MM-DD"
- format="YYYY-MM-DD"
- type="date"
- placeholder="璇烽�夋嫨"
- clearable
- :disabled="operationType === 'view'"
- />
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="浜よ揣鏃ユ湡锛�" prop="entryDate">
- <el-date-picker
- style="width: 100%"
- v-model="form.deliveryDate"
value-format="YYYY-MM-DD"
format="YYYY-MM-DD"
type="date"
@@ -527,13 +546,14 @@
prop="taxExclusiveTotalPrice"
:formatter="formattedNumber"
/>
- <el-table-column label="鏄惁鐢熶骇" prop="isProduction" width="150">
+ <!-- 鏄惁鐢熶骇鍒楀凡闅愯棌锛岄粯璁ゅ�间负 false -->
+ <!-- <el-table-column label="鏄惁鐢熶骇" prop="isProduction" width="150">
<template #default="scope">
<el-tag :type="scope.row.isProduction ? 'success' : 'info'">
{{ scope.row.isProduction ? "鏄�" : "鍚�" }}
</el-tag>
</template>
- </el-table-column>
+ </el-table-column> -->
<el-table-column
fixed="right"
label="鎿嶄綔"
@@ -823,14 +843,15 @@
</el-select>
</el-form-item>
</el-col>
- <el-col :span="12">
+ <!-- 鏄惁鐢熶骇瀛楁宸查殣钘忥紝榛樿鍊间负 false -->
+ <!-- <el-col :span="12">
<el-form-item label="鏄惁鐢熶骇锛�" prop="isProduction">
<el-radio-group v-model="productForm.isProduction">
<el-radio label="鏄�" :value="true" />
<el-radio label="鍚�" :value="false" />
</el-radio-group>
</el-form-item>
- </el-col>
+ </el-col> -->
</el-row>
</el-form>
</FormDialog>
@@ -1180,6 +1201,7 @@
} from "@/api/salesManagement/salesLedger.js";
import { getStockInventoryByModelId } from "@/api/inventoryManagement/stockInventory.js";
import { modelList, productTreeList } from "@/api/basicData/product.js";
+import { purchaseList } from "@/api/procurementManagement/procurementLedger.js";
import useFormData from "@/hooks/useFormData.js";
import dayjs from "dayjs";
import FileUpload from "@/components/AttachmentUpload/file/index.vue";
@@ -1204,6 +1226,7 @@
const customerOption = ref([]);
const productOptions = ref([]);
const modelOptions = ref([]);
+const purchaseContractOptions = ref([]);
const tableLoading = ref(false);
const page = reactive({
current: 1,
@@ -1237,6 +1260,7 @@
executionDate: "",
hasProductionRecord: false,
createTime: "",
+ purchaseContractNumber: "",
},
rules: {
salesman: [{ required: true, message: "璇烽�夋嫨", trigger: "change" }],
@@ -1264,7 +1288,7 @@
taxInclusiveTotalPrice: "",
taxExclusiveTotalPrice: "",
invoiceType: "",
- isProduction: false,
+ isProduction: false, // 榛樿鍊间负 false锛堝惁锛�
},
productRules: {
productCategory: [{ required: true, message: "璇烽�夋嫨", trigger: "change" }],
@@ -1375,22 +1399,9 @@
const getDeliveryBatchNoList = async (productModelId) => {
if (!productModelId) return [];
const res = await getStockInventoryByModelId(productModelId);
- const rawList = Array.isArray(res?.data)
- ? res.data
- : res?.data?.records || res?.data?.rows || [];
+ const rawList = res.data || [];
const seenIds = new Set();
return rawList
- .filter((item) => {
- if (!item?.id || !item?.batchNo || seenIds.has(item.id)) {
- return false;
- }
- seenIds.add(item.id);
- return true;
- })
- .map((item) => ({
- ...item,
- deliveryQuantity: 0,
- }));
};
const validateDeliveryShippingCarNumber = (_rule, value, callback) => {
if (deliveryForm.value.type === "璐ц溅" && !value) {
@@ -1742,6 +1753,8 @@
listCustomer({ current: -1, size: -1, type: 0 }).then((res) => {
customerOption.value = res.data.records;
});
+ // 鑾峰彇閲囪喘鍚堝悓鍒楄〃
+ await getPurchaseContractList();
form.value.entryPerson = userStore.id;
if (type === "add") {
// 鏂板鏃惰缃綍鍏ユ棩鏈熶负褰撳ぉ
@@ -1871,7 +1884,7 @@
taxInclusiveTotalPrice: taxInclusiveTotalPrice,
taxExclusiveTotalPrice: taxExclusiveTotalPrice,
invoiceType: "澧炴櫘绁�",
- isProduction: true,
+ isProduction: false, // 榛樿鍊间负 false锛堝惁锛�
productId: p.productId,
productModelId: p.productModelId,
};
@@ -1927,7 +1940,7 @@
productOperationType.value = type;
productForm.value = {};
if (type === "add") {
- productForm.value.isProduction = true;
+ productForm.value.isProduction = false; // 榛樿鍊间负 false锛堝惁锛�
}
proxy.resetForm("productFormRef");
if (type === "edit") {
@@ -1963,6 +1976,17 @@
}
productFormVisible.value = true;
};
+
+// 鑾峰彇閲囪喘鍚堝悓鍒楄〃
+const getPurchaseContractList = async () => {
+ try {
+ const res = await purchaseList({ current: -1, size: -1 });
+ purchaseContractOptions.value = res.rows;
+ } catch (error) {
+ console.error("鑾峰彇閲囪喘鍚堝悓鍒楄〃澶辫触", error);
+ purchaseContractOptions.value = [];
+ }
+};
// 鎻愪氦浜у搧琛ㄥ崟
const submitProduct = () => {
proxy.$refs["productFormRef"].validate((valid) => {
--
Gitblit v1.9.3