From 7726b6cdab80596d2e2f7dd3fe1ec3dfbdeee155 Mon Sep 17 00:00:00 2001
From: yuan <123@>
Date: 星期五, 12 六月 2026 09:42:40 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/dev_pro_河南鹤壁' into dev_pro_河南鹤壁
---
src/views/procurementManagement/procurementLedger/index.vue | 1172 +++++++++++++++++++++++++---------------------------------
1 files changed, 512 insertions(+), 660 deletions(-)
diff --git a/src/views/procurementManagement/procurementLedger/index.vue b/src/views/procurementManagement/procurementLedger/index.vue
index 1991342..9bbe87e 100644
--- a/src/views/procurementManagement/procurementLedger/index.vue
+++ b/src/views/procurementManagement/procurementLedger/index.vue
@@ -2,49 +2,37 @@
<div class="app-container">
<div class="search_form">
<div>
- <el-form :model="searchForm"
- :inline="true">
+ <el-form :model="searchForm" :inline="true">
<el-form-item label="渚涘簲鍟嗗悕绉帮細">
- <el-input v-model="searchForm.supplierName"
- placeholder="璇疯緭鍏�"
- clearable
- prefix-icon="Search"
- @change="handleQuery"/>
+ <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="璇疯緭鍏�"
- @change="handleQuery"
- clearable
- :prefix-icon="Search"/>
+ <el-input v-model="searchForm.purchaseContractNumber" style="width: 240px" placeholder="璇疯緭鍏�"
+ @change="handleQuery" clearable :prefix-icon="Search" />
</el-form-item>
- <el-form-item label="閿�鍞悎鍚屽彿锛�">
- <el-input v-model="searchForm.salesContractNo"
- placeholder="璇疯緭鍏�"
- clearable
- prefix-icon="Search"
- @change="handleQuery"/>
+ <el-form-item v-if="showSalesContractBinding" 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-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-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 label="鍏ュ簱鐘舵�侊細">
+ <el-select v-model="searchForm.stockInStatus" placeholder="璇烽�夋嫨" clearable style="width: 240px"
+ @change="handleQuery">
+ <el-option label="寰呭叆搴�" value="寰呭叆搴�" />
+ <el-option label="鍏ュ簱涓�" value="鍏ュ簱涓�" />
+ <el-option label="瀹屽叏鍏ュ簱" value="瀹屽叏鍏ュ簱" />
+ </el-select>
</el-form-item>
<el-form-item>
- <el-button type="primary"
- @click="handleQuery"> 鎼滅储
+ <el-button type="primary" @click="handleQuery"> 鎼滅储
</el-button>
</el-form-item>
</el-form>
@@ -52,407 +40,225 @@
</div>
<div class="table_list">
<div style="display: flex;justify-content: flex-end;margin-bottom: 20px;">
- <el-button type="primary"
- @click="openForm('add')">鏂板鍙拌处</el-button>
+ <el-button type="primary" @click="openForm('add')">鏂板鍙拌处</el-button>
<el-button type="primary" plain @click="handleImport">瀵煎叆</el-button>
<el-button @click="handleOut">瀵煎嚭</el-button>
- <el-button type="danger"
- plain
- @click="handleDelete">鍒犻櫎
+ <el-button type="danger" plain @click="handleDelete">鍒犻櫎
</el-button>
</div>
- <el-table :data="tableData"
- border
- v-loading="tableLoading"
- @selection-change="handleSelectionChange"
- :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 align="center"
- type="selection"
- width="55"/>
+ <el-table :data="tableData" border v-loading="tableLoading" @selection-change="handleSelectionChange"
+ :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 align="center" type="selection" width="55" />
<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 :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="stockInApprovalStatus" width="120">
+ <template #default="scope">
+ <el-tag :type="getStockInApprovalStatusType(scope.row.stockInApprovalStatus)" size="small">
+ {{ scope.row.stockInApprovalStatus || '--' }}
+ </el-tag>
+ </template>
+ </el-table-column>
+ <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="approvalStatus"
- width="100"
- show-overflow-tooltip>
+ <el-table-column align="center" label="搴忓彿" type="index" width="60" />
+ <el-table-column label="閲囪喘鍚堝悓鍙�" prop="purchaseContractNumber" width="160" show-overflow-tooltip />
+ <el-table-column v-if="showSalesContractBinding" 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="approvalStatus" width="100" show-overflow-tooltip>
<template #default="scope">
- <el-tag
- :type="getApprovalStatusType(scope.row.approvalStatus)"
- size="small">
+ <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="浠樻鏂瑰紡"
- width="100"
- prop="paymentMethod"
- 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">
+ <el-table-column label="鍏ュ簱鐘舵��" prop="stockInStatus" width="100" show-overflow-tooltip>
<template #default="scope">
- <el-button link
- type="primary"
- @click="openForm('edit', scope.row)"
- :disabled="scope.row.approvalStatus !== 1 && scope.row.approvalStatus !== 4">缂栬緫
+ <el-tag :type="getStockInStatusType(scope.row.stockInStatus)" size="small">
+ {{ scope.row.stockInStatus || '--' }}
+ </el-tag>
+ </template>
+ </el-table-column>
+ <el-table-column label="绛捐鏃ユ湡" prop="executionDate" width="100" show-overflow-tooltip />
+ <el-table-column label="浠樻鏂瑰紡" width="100" prop="paymentMethod" 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="180" align="center">
+ <template #default="scope">
+ <el-button link type="primary" @click="openForm('detail', scope.row)">璇︽儏
</el-button>
- <el-button link
- type="primary"
- @click="openFileDialog(scope.row)">闄勪欢</el-button>
+ <el-button link type="primary" @click="openForm('edit', scope.row)"
+ :disabled="scope.row.stockInStatus === '瀹屽叏鍏ュ簱'">缂栬緫
+ </el-button>
+ <el-button link type="primary" @click="openFileDialog(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"/>
+ <pagination v-show="total > 0" :total="total" layout="total, sizes, prev, pager, next, jumper"
+ :page="page.current" :limit="page.size" @pagination="paginationChange" />
</div>
<FormDialog v-model="dialogFormVisible"
- :title="operationType === 'add' ? '鏂板閲囪喘鍙拌处椤甸潰' : '缂栬緫閲囪喘鍙拌处椤甸潰'"
- :width="'70%'"
- :operation-type="operationType"
- @close="closeDia"
- @confirm="submitForm"
- @cancel="closeDia">
- <el-form :model="form"
- label-width="140px"
- label-position="top"
- :rules="rules"
- ref="formRef">
+ :title="operationType === 'add' ? '鏂板閲囪喘鍙拌处椤甸潰' : operationType === 'edit' ? '缂栬緫閲囪喘鍙拌处椤甸潰' : '閲囪喘鍙拌处璇︽儏'" :width="'70%'"
+ :operation-type="operationType" @close="closeDia" @confirm="submitForm" @cancel="closeDia">
+ <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="purchaseContractNumber">
- <el-input v-model="form.purchaseContractNumber"
- placeholder="璇疯緭鍏�"
- clearable/>
+ <el-form-item label="閲囪喘鍚堝悓鍙凤細" prop="purchaseContractNumber">
+ <el-input v-model="form.purchaseContractNumber" placeholder="璇疯緭鍏�" clearable />
</el-form-item>
</el-col>
- <el-col :span="12">
- <el-form-item label="閿�鍞悎鍚屽彿锛�"
- prop="salesLedgerId">
- <el-select v-model="form.salesLedgerId"
- placeholder="璇烽�夋嫨"
- filterable
- clearable
- @change="salesLedgerChange">
- <el-option v-for="item in salesContractList"
- :key="item.id"
- :label="item.salesContractNo"
- :value="item.id"/>
+ <el-col v-if="showSalesContractBinding" :span="12">
+ <el-form-item label="閿�鍞悎鍚屽彿锛�" prop="salesLedgerId">
+ <el-select v-model="form.salesLedgerId" placeholder="璇烽�夋嫨" filterable clearable @change="salesLedgerChange">
+ <el-option v-for="item in salesContractList" :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="supplierId">
- <el-select v-model="form.supplierId"
- placeholder="璇烽�夋嫨"
- filterable
- clearable>
- <el-option v-for="item in supplierList"
- :key="item.id"
- :label="item.supplierName"
- :value="item.id">{{ item.supplierName + '---' + item.supplierType }}
- </el-option>
+ <el-form-item label="渚涘簲鍟嗗悕绉帮細" prop="supplierId">
+ <el-select v-model="form.supplierId" placeholder="璇烽�夋嫨" filterable clearable>
+ <el-option v-for="item in supplierList" :key="item.id" :label="item.supplierName" :value="item.id">{{ item.supplierName + '---' + item.supplierType }}</el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
- <el-form-item label="椤圭洰鍚嶇О"
- prop="projectName">
- <el-input v-model="form.projectName"
- placeholder="璇疯緭鍏�"
- clearable/>
+ <el-form-item label="椤圭洰鍚嶇О" prop="projectName">
+ <el-input v-model="form.projectName" placeholder="璇疯緭鍏�" clearable />
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="30">
<el-col :span="12">
<el-form-item label="浠樻鏂瑰紡">
- <el-input v-model="form.paymentMethod"
- placeholder="璇疯緭鍏�"
- clearable/>
+ <el-input v-model="form.paymentMethod" placeholder="璇疯緭鍏�" clearable />
</el-form-item>
</el-col>
<el-col :span="12">
- <el-form-item label="绛捐鏃ユ湡锛�"
- prop="executionDate">
- <el-date-picker style="width: 100%"
- v-model="form.executionDate"
- value-format="YYYY-MM-DD"
- format="YYYY-MM-DD"
- type="date"
- placeholder="璇烽�夋嫨"
- clearable/>
+ <el-form-item label="绛捐鏃ユ湡锛�" prop="executionDate">
+ <el-date-picker style="width: 100%" v-model="form.executionDate" value-format="YYYY-MM-DD" format="YYYY-MM-DD" type="date" placeholder="璇烽�夋嫨" clearable />
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="30">
<el-col :span="12">
- <el-form-item label="褰曞叆浜猴細"
- prop="recorderId">
- <el-input v-model="form.recorderName" placeholder="鑷姩濉厖" disabled/>
+ <el-form-item label="褰曞叆浜猴細" prop="recorderId">
+ <el-select v-model="form.recorderId" placeholder="璇烽�夋嫨" clearable filterable>
+ <el-option v-for="item in userList" :key="item.userId" :label="item.nickName" :value="item.userId" />
+ </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.entryDate"
- value-format="YYYY-MM-DD"
- format="YYYY-MM-DD"
- type="date"
- placeholder="璇烽�夋嫨"
- clearable/>
+ <el-form-item label="褰曞叆鏃ユ湡锛�" prop="entryDate">
+ <el-date-picker style="width: 100%" v-model="form.entryDate" value-format="YYYY-MM-DD" format="YYYY-MM-DD" type="date" placeholder="璇烽�夋嫨" clearable />
</el-form-item>
</el-col>
</el-row>
<el-row>
- <el-form-item label="浜у搧淇℃伅锛�"
- prop="entryDate">
- <el-button type="primary"
- @click="openProductForm('add')">娣诲姞
- </el-button>
- <el-button plain
- type="danger"
- @click="deleteProduct">鍒犻櫎
- </el-button>
+ <el-form-item label="浜у搧淇℃伅锛�" prop="entryDate">
+ <el-button type="primary" @click="openProductForm('add')">娣诲姞</el-button>
+ <el-button plain type="danger" @click="deleteProduct">鍒犻櫎</el-button>
</el-form-item>
- <div class="select-button-group"
- style="width: 500px; margin: 20px 0;"
- v-if="operationType === 'add'">
- <el-select filterable
- allow-create
- :reserve-keyword="true"
- :default-first-option="false"
- clearable
- v-model="templateName"
- :input-value="filterInputValue"
- @filter-change="onTemplateFilterChange"
- @change="onTemplateChange"
- @focus="getTemplateList"
- style="width: 500px;"
- placeholder="璇烽�夋嫨妯$増鎴栬�呰緭鍏ユ柊鐨勬ā鐗堝悕绉板悗閫夋嫨"
- class="no-arrow-select">
- <el-option v-for="item in templateList"
- :key="item.id || item.value"
- :label="item.templateName"
- :value="item.templateName">
+ <div class="select-button-group" style="width: 500px; margin: 20px 0;" v-if="operationType === 'add'">
+ <el-select filterable allow-create :reserve-keyword="true" :default-first-option="false" clearable
+ v-model="templateName" :input-value="filterInputValue" @filter-change="onTemplateFilterChange"
+ @change="onTemplateChange" @focus="getTemplateList" style="width: 500px;" placeholder="璇烽�夋嫨妯$増鎴栬�呰緭鍏ユ柊鐨勬ā鐗堝悕绉板悗閫夋嫨"
+ class="no-arrow-select">
+ <el-option v-for="item in templateList" :key="item.id || item.value" :label="item.templateName"
+ :value="item.templateName">
<div style="display: flex; justify-content: space-between; align-items: center;">
<span>{{ item.templateName }}</span>
- <el-icon
- v-if="item.id"
- class="delete-icon"
- @click.stop="handleDeleteTemplate(item)"
- style="cursor: pointer; color: #f56c6c; font-size: 14px; margin-left: 8px;">
- <Delete/>
+ <el-icon v-if="item.id" class="delete-icon" @click.stop="handleDeleteTemplate(item)"
+ style="cursor: pointer; color: #f56c6c; font-size: 14px; margin-left: 8px;">
+ <Delete />
</el-icon>
</div>
</el-option>
</el-select>
<!-- 鎸夐挳锛氫笌 Select 楂樺害鍖归厤锛屽幓鎺夊乏渚ц竟妗嗭紝鏃犵紳琛旀帴 -->
- <el-button size="small"
- style="height: 32px;margin-left: 8px;"
- @click="handleButtonClick"
- :disabled="!templateName || templateName.trim() === '' || (!currentTemplateId && isTemplateNameDuplicate)">
+ <el-button size="small" style="height: 32px;margin-left: 8px;" @click="handleButtonClick"
+ :disabled="!templateName || templateName.trim() === '' || (!currentTemplateId && isTemplateNameDuplicate)">
淇濆瓨
</el-button>
</div>
</el-row>
- <el-table :data="productData"
- border
- @selection-change="productSelected"
- show-summary
- :summary-method="summarizeProTable">
- <el-table-column align="center"
- type="selection"
- width="55"/>
- <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="70"/>
- <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"
- :formatter="formattedNumber"
- width="150"/>
- <el-table-column label="鍚◣鎬讳环(鍏�)"
- prop="taxInclusiveTotalPrice"
- :formatter="formattedNumber"
- width="150"/>
- <el-table-column label="涓嶅惈绋庢�讳环(鍏�)"
- prop="taxExclusiveTotalPrice"
- :formatter="formattedNumber"
- width="150"/>
- <el-table-column label="鏄惁璐ㄦ"
- prop="isChecked"
- width="150">
+ <el-table :data="productData" border @selection-change="productSelected" show-summary
+ :summary-method="summarizeProTable">
+ <el-table-column align="center" type="selection" width="55" />
+ <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="70" />
+ <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" :formatter="formattedNumber" width="150" />
+ <el-table-column label="鍚◣鎬讳环(鍏�)" prop="taxInclusiveTotalPrice" :formatter="formattedNumber" width="150" />
+ <el-table-column label="涓嶅惈绋庢�讳环(鍏�)" prop="taxExclusiveTotalPrice" :formatter="formattedNumber" width="150" />
+ <el-table-column label="鏄惁璐ㄦ" prop="isChecked" width="150">
<template #default="scope">
<el-tag :type="scope.row.isChecked ? 'success' : 'info'">
{{ scope.row.isChecked ? '鏄�' : '鍚�' }}
</el-tag>
</template>
</el-table-column>
- <el-table-column fixed="right"
- label="鎿嶄綔"
- min-width="60"
- align="center">
+ <el-table-column label="鍏ュ簱瀹℃牳鐘舵��" prop="stockInApprovalStatus" width="120">
<template #default="scope">
- <el-button link
- type="primary"
- @click="openProductForm('edit', scope.row, scope.$index)">缂栬緫
+ <el-tag :type="getStockInApprovalStatusType(scope.row.stockInApprovalStatus)" size="small">
+ {{ scope.row.stockInApprovalStatus || '--' }}
+ </el-tag>
+ </template>
+ </el-table-column>
+ <el-table-column fixed="right" label="鎿嶄綔" min-width="60" align="center">
+ <template #default="scope">
+ <el-button link type="primary"
+ @click="openProductForm('edit', scope.row, scope.$index)"
+ :disabled="scope.row.stockInApprovalStatus === '瀹屽叏鍏ュ簱'">缂栬緫
</el-button>
</template>
</el-table-column>
</el-table>
<el-row :gutter="30">
<el-col :span="24">
- <el-form-item label="澶囨敞路锛�"
- prop="remarks">
- <el-input v-model="form.remarks"
- placeholder="璇疯緭鍏�"
- clearable
- type="textarea"
- :rows="2"/>
+ <el-form-item label="澶囨敞路锛�" prop="remarks">
+ <el-input v-model="form.remarks" placeholder="璇疯緭鍏�" clearable type="textarea" :rows="2" />
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="30">
<el-col :span="24">
- <el-form-item label="闄勪欢鏉愭枡锛�"
- prop="purchaseLedgerFiles">
- <FileUpload v-model:file-list="fileList"/>
+ <el-form-item label="闄勪欢鏉愭枡锛�" prop="purchaseLedgerFiles">
+ <FileUpload v-model:file-list="fileList" />
</el-form-item>
</el-col>
</el-row>
</el-form>
</FormDialog>
<!-- 瀵煎叆寮圭獥 -->
- <FormDialog
- v-model="importUpload.open"
- :title="importUpload.title"
- :width="'600px'"
- @close="importUpload.open = false"
- @confirm="submitImportFile"
- @cancel="importUpload.open = false"
- >
- <el-upload
- ref="importUploadRef"
- :limit="1"
- accept=".xlsx,.xls"
- :action="importUpload.url"
- :headers="importUpload.headers"
- :before-upload="importUpload.beforeUpload"
- :on-success="importUpload.onSuccess"
- :on-error="importUpload.onError"
- :on-progress="importUpload.onProgress"
- :on-change="importUpload.onChange"
- :auto-upload="false"
- drag
- >
+ <FormDialog v-model="importUpload.open" :title="importUpload.title" :width="'600px'"
+ @close="importUpload.open = false" @confirm="submitImportFile" @cancel="importUpload.open = false">
+ <el-upload ref="importUploadRef" :limit="1" accept=".xlsx,.xls" :action="importUpload.url"
+ :headers="importUpload.headers" :before-upload="importUpload.beforeUpload" :on-success="importUpload.onSuccess"
+ :on-error="importUpload.onError" :on-progress="importUpload.onProgress" :on-change="importUpload.onChange"
+ :auto-upload="false" drag>
<i class="el-icon-upload"></i>
<div class="el-upload__text">
灏嗘枃浠舵嫋鍒版澶勶紝鎴�<em>鐐瑰嚮涓婁紶</em>
@@ -465,225 +271,162 @@
</template>
</el-upload>
</FormDialog>
- <FormDialog v-model="productFormVisible"
- :title="productOperationType === 'add' ? '鏂板浜у搧' : '缂栬緫浜у搧'"
- :width="'40%'"
- :operation-type="productOperationType"
- @close="closeProductDia"
- @confirm="submitProduct"
- @cancel="closeProductDia">
- <el-form :model="productForm"
- label-width="140px"
- label-position="top"
- :rules="productRules"
- ref="productFormRef">
+ <FormDialog v-model="productFormVisible" :title="productOperationType === 'add' ? '鏂板浜у搧' : '缂栬緫浜у搧'" :width="'40%'"
+ :operation-type="productOperationType" @close="closeProductDia" @confirm="submitProduct"
+ @cancel="closeProductDia">
+ <el-form :model="productForm" label-width="140px" label-position="top" :rules="productRules" ref="productFormRef">
<el-row :gutter="30">
<el-col :span="24">
- <el-form-item label="浜у搧澶х被锛�"
- prop="productId">
- <el-tree-select v-model="productForm.productId"
- placeholder="璇烽�夋嫨"
- clearable
- filterable
- check-strictly
- @change="getModels"
- :data="productOptions"
- :render-after-expand="false"
- style="width: 100%"/>
+ <el-form-item label="浜у搧澶х被锛�" prop="productId">
+ <el-tree-select v-model="productForm.productId" placeholder="璇烽�夋嫨" clearable filterable check-strictly
+ @change="getModels" :data="productOptions" :render-after-expand="false" style="width: 100%" />
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="30">
<el-col :span="24">
- <el-form-item label="瑙勬牸鍨嬪彿锛�"
- prop="productModelId">
- <el-select v-model="productForm.productModelId"
- placeholder="璇烽�夋嫨"
- filterable
- clearable
- @change="getProductModel">
- <el-option v-for="item in modelOptions"
- :key="item.id"
- :label="item.model"
- :value="item.id"/>
+ <el-form-item label="瑙勬牸鍨嬪彿锛�" prop="productModelId">
+ <el-select v-model="productForm.productModelId" placeholder="璇烽�夋嫨" filterable clearable
+ @change="getProductModel">
+ <el-option v-for="item in modelOptions" :key="item.id" :label="item.model" :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="unit">
- <el-input v-model="productForm.unit"
- placeholder="璇疯緭鍏�"
- clearable/>
+ <el-form-item label="鍗曚綅锛�" prop="unit">
+ <el-input v-model="productForm.unit" placeholder="璇疯緭鍏�" clearable />
</el-form-item>
</el-col>
<el-col :span="12">
- <el-form-item label="绋庣巼(%)锛�"
- prop="taxRate">
- <el-select v-model="productForm.taxRate"
- placeholder="璇烽�夋嫨"
- clearable
- @change="mathNum">
- <el-option label="1"
- value="1"/>
- <el-option label="6"
- value="6"/>
- <el-option label="13"
- value="13"/>
+ <el-form-item label="绋庣巼(%)锛�" prop="taxRate">
+ <el-select v-model="productForm.taxRate" placeholder="璇烽�夋嫨" clearable @change="mathNum">
+ <el-option v-for="dict in tax_rate" :key="dict.value" :label="dict.label" :value="dict.value" />
</el-select>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="30">
<el-col :span="12">
- <el-form-item label="鍚◣鍗曚环(鍏�)锛�"
- prop="taxInclusiveUnitPrice">
- <el-input-number v-model="productForm.taxInclusiveUnitPrice"
- :precision="2"
- :step="0.1"
- :min="0"
- clearable
- style="width: 100%"
- @change="mathNum"/>
+ <el-form-item label="鍚◣鍗曚环(鍏�)锛�" prop="taxInclusiveUnitPrice">
+ <el-input-number v-model="productForm.taxInclusiveUnitPrice" :precision="2" :step="0.1" :min="0" clearable
+ style="width: 100%" @change="mathNum" />
</el-form-item>
</el-col>
<el-col :span="12">
- <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="璇疯緭鍏�"
- @change="mathNum"/>
+ <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="璇疯緭鍏�" @change="mathNum" />
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="30">
<el-col :span="12">
- <el-form-item label="鍚◣鎬讳环(鍏�)锛�"
- prop="taxInclusiveTotalPrice">
- <el-input-number v-model="productForm.taxInclusiveTotalPrice"
- :precision="2"
- :step="0.1"
- :min="0"
- clearable
- style="width: 100%"
- @change="reverseMathNum('taxInclusiveTotalPrice')"/>
+ <el-form-item label="鍚◣鎬讳环(鍏�)锛�" prop="taxInclusiveTotalPrice">
+ <el-input-number v-model="productForm.taxInclusiveTotalPrice" :precision="2" :step="0.1" :min="0"
+ clearable style="width: 100%" @change="reverseMathNum('taxInclusiveTotalPrice')" />
</el-form-item>
</el-col>
<el-col :span="12">
- <el-form-item label="涓嶅惈绋庢�讳环(鍏�)锛�"
- prop="taxExclusiveTotalPrice">
- <el-input-number v-model="productForm.taxExclusiveTotalPrice"
- :precision="2"
- :step="0.1"
- :min="0"
- clearable
- style="width: 100%"
- @change="reverseMathNum('taxExclusiveTotalPrice')"/>
+ <el-form-item label="涓嶅惈绋庢�讳环(鍏�)锛�" prop="taxExclusiveTotalPrice">
+ <el-input-number v-model="productForm.taxExclusiveTotalPrice" :precision="2" :step="0.1" :min="0"
+ clearable style="width: 100%" @change="reverseMathNum('taxExclusiveTotalPrice')" />
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="30">
<el-col :span="12">
- <el-form-item label="鍙戠エ绫诲瀷锛�"
- prop="invoiceType">
- <el-select v-model="productForm.invoiceType"
- placeholder="璇烽�夋嫨"
- clearable>
- <el-option label="澧炴櫘绁�"
- value="澧炴櫘绁�"/>
- <el-option label="澧炰笓绁�"
- value="澧炰笓绁�"/>
+ <el-form-item label="鍙戠エ绫诲瀷锛�" prop="invoiceType">
+ <el-select v-model="productForm.invoiceType" placeholder="璇烽�夋嫨" clearable>
+ <el-option label="澧炴櫘绁�" value="澧炴櫘绁�" />
+ <el-option label="澧炰笓绁�" value="澧炰笓绁�" />
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
- <el-form-item label="搴撳瓨棰勮鏁伴噺锛�"
- prop="warnNum">
- <el-input-number v-model="productForm.warnNum"
- :precision="2"
- :step="0.1"
- :min="0"
- clearable
- style="width: 100%"/>
+ <el-form-item label="搴撳瓨棰勮鏁伴噺锛�" prop="warnNum">
+ <el-input-number v-model="productForm.warnNum" :precision="2" :step="0.1" :min="0" clearable
+ style="width: 100%" />
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="30">
<el-col :span="12">
- <el-form-item label="鏄惁璐ㄦ锛�"
- prop="isChecked">
+ <el-form-item label="鏄惁璐ㄦ锛�" prop="isChecked">
<el-radio-group v-model="productForm.isChecked">
- <el-radio label="鏄�"
- :value="true"/>
- <el-radio label="鍚�"
- :value="false"/>
+ <el-radio label="鏄�" :value="true" />
+ <el-radio label="鍚�" :value="false" />
</el-radio-group>
</el-form-item>
</el-col>
</el-row>
</el-form>
</FormDialog>
- <FileList v-if="fileListDialogVisible" v-model:visible="fileListDialogVisible" record-type="purchase_ledger" :record-id="recordId" />
+ <FileList v-if="fileListDialogVisible" v-model:visible="fileListDialogVisible" record-type="purchase_ledger"
+ :record-id="recordId" />
+ <Detail ref="detailRef" />
</div>
</template>
<script setup>
-import {Search, Delete} from "@element-plus/icons-vue";
-import FormDialog from '@/components/Dialog/FormDialog.vue';
-import FileListDialog from '@/components/Dialog/FileListDialog.vue';
- import { getToken } from "@/utils/auth";
- import pagination from "@/components/PIMTable/Pagination.vue";
- import {
- ref,
- onMounted,
- reactive,
- toRefs,
- getCurrentInstance,
- nextTick,
- } from "vue";
- import { Search, Delete } from "@element-plus/icons-vue";
- import { ElMessageBox, ElMessage } from "element-plus";
- import {
- addOrUpdateSalesLedgerProduct,
- delProduct,
- delLedgerFile,
- getProductInfoByContractNo,
- } from "@/api/salesManagement/salesLedger.js";
- import {
- addOrEditPurchase,
- addPurchaseTemplate,
- updatePurchaseTemplate,
- createPurchaseNo,
- delPurchase,
- getSalesNo,
- purchaseListPage,
- productList,
- getPurchaseById,
- getOptions,
- getPurchaseTemplateList,
- delPurchaseTemplate,
- } from "@/api/procurementManagement/procurementLedger.js";
- import useFormData from "@/hooks/useFormData.js";
- const FileList = defineAsyncComponent(() => import("@/components/Dialog/FileList.vue"));
+import FormDialog from "@/components/Dialog/FormDialog.vue";
+import FileListDialog from "@/components/Dialog/FileListDialog.vue";
+import Detail from "./detail.vue";
+import { getToken } from "@/utils/auth";
+import pagination from "@/components/PIMTable/Pagination.vue";
+import {
+ ref,
+ onMounted,
+ reactive,
+ toRefs,
+ getCurrentInstance,
+ nextTick,
+} from "vue";
+import { Search, Delete } from "@element-plus/icons-vue";
+import { ElMessageBox, ElMessage } from "element-plus";
+import { userListNoPage } from "@/api/system/user.js";
+import {
+ addOrUpdateSalesLedgerProduct,
+ delProduct,
+ delLedgerFile,
+ getProductInfoByContractNo,
+} from "@/api/salesManagement/salesLedger.js";
+import {
+ addOrEditPurchase,
+ addPurchaseTemplate,
+ updatePurchaseTemplate,
+ createPurchaseNo,
+ delPurchase,
+ getSalesNo,
+ purchaseListPage,
+ productList,
+ getPurchaseById,
+ getOptions,
+ getPurchaseTemplateList,
+ delPurchaseTemplate,
+} from "@/api/procurementManagement/procurementLedger.js";
+import useFormData from "@/hooks/useFormData.js";
+const FileList = defineAsyncComponent(() =>
+ import("@/components/Dialog/FileList.vue")
+);
-const {proxy} = getCurrentInstance();
+const detailRef = ref(null);
+
+const { proxy } = getCurrentInstance();
+const { tax_rate } = proxy.useDict("tax_rate");
const tableData = ref([]);
const productData = ref([]);
const selectedRows = ref([]);
const productSelectedRows = ref([]);
const modelOptions = ref([]);
+const userList = ref([]);
const productOptions = ref([]);
const salesContractList = ref([]);
const supplierList = ref([]);
const tableLoading = ref(false);
-const fileListDialogVisible = ref(false)
+const recordId = ref();
+const fileListDialogVisible = ref(false);
const page = reactive({
current: 1,
size: 100,
@@ -691,11 +434,14 @@
const total = ref(0);
const fileList = ref([]);
import useUserStore from "@/store/modules/user";
-import {modelList, productTreeList} from "@/api/basicData/product.js";
+import { modelList, productTreeList } from "@/api/basicData/product.js";
import dayjs from "dayjs";
import FileUpload from "@/components/AttachmentUpload/file/index.vue";
const userStore = useUserStore();
+
+// 鏄惁鏄剧ず閿�鍞悎鍚屽彿缁戝畾
+const showSalesContractBinding = false;
// 璁㈠崟瀹℃壒鐘舵�佹樉绀烘枃鏈�
const approvalStatusText = {
@@ -706,12 +452,32 @@
};
// 鑾峰彇瀹℃壒鐘舵�佹爣绛剧被鍨�
-const getApprovalStatusType = (status) => {
+const getApprovalStatusType = status => {
const typeMap = {
- 1: "info", // 寰呭鏍� - 鐏拌壊
- 2: "warning", // 瀹℃壒涓� - 姗欒壊
- 3: "success", // 瀹℃壒閫氳繃 - 缁胯壊
- 4: "danger", // 瀹℃壒澶辫触 - 绾㈣壊
+ 1: "info", // 寰呭鏍� - 鐏拌壊
+ 2: "warning", // 瀹℃壒涓� - 姗欒壊
+ 3: "success", // 瀹℃壒閫氳繃 - 缁胯壊
+ 4: "danger", // 瀹℃壒澶辫触 - 绾㈣壊
+ };
+ return typeMap[status] || "";
+};
+
+// 鑾峰彇鍏ュ簱鐘舵�佹爣绛剧被鍨�
+const getStockInStatusType = status => {
+ const typeMap = {
+ "寰呭叆搴�": "info", // 寰呭叆搴� - 鐏拌壊
+ "鍏ュ簱涓�": "warning", // 鍏ュ簱涓� - 姗欒壊
+ "瀹屽叏鍏ュ簱": "success", // 瀹屽叏鍏ュ簱 - 缁胯壊
+ };
+ return typeMap[status] || "";
+};
+
+// 鑾峰彇鍏ュ簱瀹℃牳鐘舵�佹爣绛剧被鍨�
+const getStockInApprovalStatusType = status => {
+ const typeMap = {
+ "寰呭叆搴�": "info", // 寰呭叆搴� - 鐏拌壊
+ "鍏ュ簱涓�": "warning", // 鍏ュ簱涓� - 姗欒壊
+ "瀹屽叏鍏ュ簱": "success", // 瀹屽叏鍏ュ簱 - 缁胯壊
};
return typeMap[status] || "";
};
@@ -730,10 +496,17 @@
return false;
}
const isDuplicate = templateList.value.some(
- item => item.templateName === name.trim()
+ item => item.templateName === name.trim()
);
isTemplateNameDuplicate.value = isDuplicate;
return isDuplicate;
+};
+
+// 鍒ゆ柇鏂囦欢鏄惁涓哄浘鐗�
+const isImage = (filename) => {
+ if (!filename) return false;
+ const ext = filename.substring(filename.lastIndexOf('.')).toLowerCase();
+ return ['.png', '.jpg', '.jpeg', '.gif', '.webp', '.bmp'].includes(ext);
};
// 闃叉姈瀹氭椂鍣�
@@ -771,7 +544,7 @@
// 杩囨护鏁版嵁锛屾煡鎵惧尮閰嶇殑妯℃澘
const matchedTemplate = templateList.value.find(
- item => item.templateName === val
+ item => item.templateName === val
);
if (matchedTemplate?.id) {
@@ -793,12 +566,13 @@
form.value.paymentMethod = matchedTemplate.paymentMethod;
}
// 妯℃澘鏁版嵁涓殑浜у搧瀛楁鏄� productList锛岄渶瑕佽浆鎹负 productData
- productData.value = matchedTemplate.productList || matchedTemplate.productData || [];
+ productData.value =
+ matchedTemplate.productList || matchedTemplate.productData || [];
} else {
// 鏈尮閰嶅埌宸叉湁妯℃澘锛岃涓烘柊妯℃澘
currentTemplateId.value = null;
// 濡傛灉娌℃湁鎵惧埌妯℃澘锛岄噸缃〃鍗曪紙淇濇寔褰撳墠琛ㄥ崟鐘舵�侊級
- const currentFormData = {...form.value};
+ const currentFormData = { ...form.value };
const currentProductData = [...productData.value];
// 濡傛灉瀵硅瘽妗嗘湭鎵撳紑锛屽厛鎵撳紑
@@ -835,7 +609,6 @@
salesLedgerId: "",
projectName: "",
recorderId: "",
- recorderName: "",
entryDate: "",
productData: [],
supplierName: "",
@@ -846,18 +619,18 @@
},
rules: {
purchaseContractNumber: [
- {required: true, message: "璇疯緭鍏�", trigger: "blur"},
+ { required: true, message: "璇疯緭鍏�", trigger: "blur" },
],
projectName: [
- {required: true, message: "璇疯緭鍏ラ」鐩悕绉�", trigger: "blur"},
+ { required: true, message: "璇疯緭鍏ラ」鐩悕绉�", trigger: "blur" },
],
- supplierId: [{required: true, message: "璇疯緭鍏�", trigger: "blur"}],
- entryDate: [{required: true, message: "璇烽�夋嫨", trigger: "change"}],
- executionDate: [{required: true, message: "璇烽�夋嫨", trigger: "change"}],
+ supplierId: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
+ entryDate: [{ required: true, message: "璇烽�夋嫨", trigger: "change" }],
+ executionDate: [{ required: true, message: "璇烽�夋嫨", trigger: "change" }],
},
});
-const {form, rules} = toRefs(data);
-const {form: searchForm} = useFormData({
+const { form, rules } = toRefs(data);
+const { form: searchForm } = useFormData({
...data.searchForm,
// 璁剧疆褰曞叆鏃ユ湡鑼冨洿涓哄綋澶�
entryDate: [
@@ -890,31 +663,31 @@
isChecked: false,
},
productRules: {
- productId: [{required: true, message: "璇烽�夋嫨", trigger: "change"}],
- productModelId: [{required: true, message: "璇烽�夋嫨", trigger: "change"}],
- unit: [{required: true, message: "璇疯緭鍏�", trigger: "blur"}],
- quantity: [{required: true, message: "璇疯緭鍏�", trigger: "blur"}],
+ productId: [{ required: true, message: "璇烽�夋嫨", trigger: "change" }],
+ productModelId: [{ required: true, message: "璇烽�夋嫨", trigger: "change" }],
+ unit: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
+ quantity: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
taxInclusiveUnitPrice: [
- {required: true, message: "璇疯緭鍏�", trigger: "blur"},
+ { required: true, message: "璇疯緭鍏�", trigger: "blur" },
],
- taxRate: [{required: true, message: "璇烽�夋嫨", trigger: "change"}],
- warnNum: [{required: true, message: "璇烽�夋嫨", trigger: "change"}],
+ taxRate: [{ required: true, message: "璇烽�夋嫨", trigger: "change" }],
+ warnNum: [{ required: true, message: "璇烽�夋嫨", trigger: "change" }],
taxInclusiveTotalPrice: [
- {required: true, message: "璇疯緭鍏�", trigger: "blur"},
+ { required: true, message: "璇疯緭鍏�", trigger: "blur" },
],
taxExclusiveTotalPrice: [
- {required: true, message: "璇疯緭鍏�", trigger: "blur"},
+ { required: true, message: "璇疯緭鍏�", trigger: "blur" },
],
- invoiceType: [{required: true, message: "璇烽�夋嫨", trigger: "change"}],
- isChecked: [{required: true, message: "璇烽�夋嫨", trigger: "change"}],
+ invoiceType: [{ required: true, message: "璇烽�夋嫨", trigger: "change" }],
+ isChecked: [{ required: true, message: "璇烽�夋嫨", trigger: "change" }],
},
});
-const {productForm, productRules} = toRefs(productFormData);
+const { productForm, productRules } = toRefs(productFormData);
const upload = reactive({
// 涓婁紶鐨勫湴鍧�
url: import.meta.env.VITE_APP_BASE_API + "/file/upload",
// 璁剧疆涓婁紶鐨勮姹傚ご閮�
- headers: {Authorization: "Bearer " + getToken()},
+ headers: { Authorization: "Bearer " + getToken() },
});
// 瀵煎叆鐩稿叧
@@ -923,9 +696,9 @@
title: "瀵煎叆閲囪喘鍙拌处",
open: false,
url: import.meta.env.VITE_APP_BASE_API + "/purchase/ledger/import",
- headers: {Authorization: "Bearer " + getToken()},
+ headers: { Authorization: "Bearer " + getToken() },
isUploading: false,
- beforeUpload: (file) => {
+ beforeUpload: file => {
const isExcel = file.name.endsWith(".xlsx") || file.name.endsWith(".xls");
const isLt10M = file.size / 1024 / 1024 < 10;
if (!isExcel) {
@@ -974,7 +747,11 @@
// 涓嬭浇瀵煎叆妯℃澘锛堝鍚庣璺緞涓嶅悓锛屽彲鍦ㄦ澶勮皟鏁达級
const downloadTemplate = () => {
- proxy.download("/purchase/ledger/exportTemplate", {}, "閲囪喘鍙拌处瀵煎叆妯℃澘.xlsx");
+ proxy.download(
+ "/purchase/ledger/exportTemplate",
+ {},
+ "閲囪喘鍙拌处瀵煎叆妯℃澘.xlsx"
+ );
};
const submitImportFile = () => {
@@ -1039,8 +816,8 @@
// 妫�鏌ユ槸鍚︽湁浜у搧鏁版嵁
if (!productData.value || productData.value.length === 0) {
ElMessage({
- message: '璇峰厛娣诲姞浜у搧淇℃伅',
- type: 'warning',
+ message: "璇峰厛娣诲姞浜у搧淇℃伅",
+ type: "warning",
});
return;
}
@@ -1051,11 +828,15 @@
supplierId: form.value.supplierId,
paymentMethod: form.value.paymentMethod,
recorderId: form.value.recorderId,
- recorderName: form.value.recorderName,
projectName: form.value.projectName,
templateName: templateName.value.trim(),
};
- console.log("template params ===>", params, "currentTemplateId:", currentTemplateId.value);
+ console.log(
+ "template params ===>",
+ params,
+ "currentTemplateId:",
+ currentTemplateId.value
+ );
// 濡傛灉 currentTemplateId 鏈夊�硷紝璇存槑褰撳墠鏄�滅紪杈戝凡鏈夋ā鏉库�� 鈫� 璋冪敤鏇存柊鎺ュ彛
// 鍚﹀垯涓衡�滄柊寤烘ā鏉库�� 鈫� 璋冪敤鏂板鎺ュ彛
@@ -1099,20 +880,20 @@
// 瀛愯〃鍚堣鏂规硶
const summarizeChildrenTable = param => {
return proxy.summarizeTable(
- param,
- [
- "taxInclusiveUnitPrice",
- "taxInclusiveTotalPrice",
- "taxExclusiveTotalPrice",
- "ticketsNum",
- "ticketsAmount",
- "futureTickets",
- "futureTicketsAmount",
- ],
- {
- ticketsNum: {noDecimal: true}, // 涓嶄繚鐣欏皬鏁�
- futureTickets: {noDecimal: true}, // 涓嶄繚鐣欏皬鏁�
- }
+ param,
+ [
+ "taxInclusiveUnitPrice",
+ "taxInclusiveTotalPrice",
+ "taxExclusiveTotalPrice",
+ "ticketsNum",
+ "ticketsAmount",
+ "futureTickets",
+ "futureTicketsAmount",
+ ],
+ {
+ ticketsNum: { noDecimal: true }, // 涓嶄繚鐣欏皬鏁�
+ futureTickets: { noDecimal: true }, // 涓嶄繚鐣欏皬鏁�
+ }
);
};
const paginationChange = obj => {
@@ -1122,24 +903,24 @@
};
const getList = () => {
tableLoading.value = true;
- const {entryDate, ...rest} = searchForm;
- purchaseListPage({...rest, ...page})
- .then(res => {
- tableLoading.value = false;
- // tableData.value = res.data.records;
- tableData.value = res.data.records.map(record => ({
- ...record,
- }));
- // 鍒濆鍖栧瓙鏁版嵁鏁扮粍
- tableData.value.forEach(item => {
- item.children = [];
- });
- total.value = res.data.total;
- expandedRowKeys.value = [];
- })
- .catch(() => {
- tableLoading.value = false;
+ const { entryDate, ...rest } = searchForm;
+ purchaseListPage({ ...rest, ...page })
+ .then(res => {
+ tableLoading.value = false;
+ // tableData.value = res.data.records;
+ tableData.value = res.data.records.map(record => ({
+ ...record,
+ }));
+ // 鍒濆鍖栧瓙鏁版嵁鏁扮粍
+ tableData.value.forEach(item => {
+ item.children = [];
});
+ total.value = res.data.total;
+ expandedRowKeys.value = [];
+ })
+ .catch(() => {
+ tableLoading.value = false;
+ });
};
// 琛ㄦ牸閫夋嫨鏁版嵁
const handleSelectionChange = selection => {
@@ -1154,7 +935,7 @@
if (expandedRows.length > 0) {
expandedRowKeys.value = [];
try {
- const res = await productList({salesLedgerId: row.id, type: 2});
+ 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 || [];
@@ -1187,15 +968,22 @@
};
// 鎵撳紑寮规
const openForm = async (type, row) => {
- // 缂栬緫鏃舵鏌ュ鏍哥姸鎬侊紝鍙湁寰呭鏍�(1)鍜屽鎵瑰け璐�(4)鎵嶈兘缂栬緫
+ if (type === 'detail') {
+ detailRef.value.open(row.id);
+ return;
+ }
+ // 缂栬緫鏃舵鏌ュ叆搴撶姸鎬侊紝瀹屽叏鍏ュ簱鏃朵笉鑳界紪杈�
if (type === "edit" && row) {
- if (row.approvalStatus !== 1 && row.approvalStatus !== 4) {
- proxy.$modal.msgWarning("鍙湁寰呭鏍稿拰瀹℃壒澶辫触鐘舵�佺殑璁板綍鎵嶈兘缂栬緫");
+ if (row.stockInStatus === '瀹屽叏鍏ュ簱') {
+ proxy.$modal.msgWarning("瀹屽叏鍏ュ簱鐘舵�佺殑璁板綍涓嶈兘缂栬緫");
return;
}
}
await getTemplateList();
+ await userListNoPage().then(res => {
+ userList.value = res.data;
+ });
operationType.value = type;
form.value = {};
productData.value = [];
@@ -1213,11 +1001,9 @@
salesContractList.value = salesRes || [];
// 渚涘簲鍟嗚繃婊ゅ嚭isWhite=0 鐨勬暟鎹�
supplierList.value = (supplierRes.data || []).filter(
- item => item.isWhite === 0
+ item => item.isWhite === 0
);
- // 璁剧疆榛樿鍊�
- form.value.recorderName = userStore.nickName;
form.value.entryDate = getCurrentDate();
if (type === "add") {
@@ -1235,10 +1021,12 @@
// 缂栬緫鏃跺姞杞芥暟鎹�
currentId.value = row.id;
try {
- const purchaseRes = await getPurchaseById({id: row.id, type: 2});
- form.value = {...purchaseRes};
- productData.value = purchaseRes.productData || [];
+ const purchaseRes = await getPurchaseById({ id: row.id, type: 2 });
+ form.value = { ...purchaseRes, stockInStatus: row.stockInStatus };
fileList.value = purchaseRes.storageBlobVOS || [];
+ // 浣跨敤 productList 鎺ュ彛鑾峰彇浜у搧鍒楄〃锛屼互鑾峰彇鍏ュ簱瀹℃牳鐘舵��
+ const productRes = await productList({ salesLedgerId: row.id, type: 2 });
+ productData.value = productRes.data || [];
} catch (error) {
console.error("鍔犺浇閲囪喘鍙拌处鏁版嵁澶辫触:", error);
proxy.$modal.msgError("鍔犺浇鏁版嵁澶辫触");
@@ -1249,7 +1037,6 @@
if (form.value.salesLedgerId == -1) {
form.value.salesLedgerId = null;
}
- console.log(form.value, "form.value===========");
dialogFormVisible.value = true;
} catch (error) {
console.error("鎵撳紑琛ㄥ崟澶辫触:", error);
@@ -1317,7 +1104,7 @@
let processedProductData = productData.value;
if (operationType.value === "add") {
processedProductData = productData.value.map(product => {
- const {id, ...rest} = product;
+ const { id, ...rest } = product;
return rest;
});
}
@@ -1335,7 +1122,7 @@
}
// 鏂板鏃朵笉浼犻�抜d
- const submitData = {...form.value};
+ const submitData = { ...form.value };
if (operationType.value === "add") {
delete submitData.id;
}
@@ -1355,6 +1142,12 @@
};
// 鎵撳紑浜у搧寮规
const openProductForm = async (type, row, index) => {
+ // 缂栬緫鏃舵鏌ヤ骇鍝佸叆搴撳鏍哥姸鎬侊紝瀹屽叏鍏ュ簱鏃朵笉鑳界紪杈�
+ if (type === "edit" && row && row.stockInApprovalStatus === '瀹屽叏鍏ュ簱') {
+ proxy.$modal.msgWarning("瀹屽叏鍏ュ簱鐘舵�佺殑浜у搧涓嶈兘缂栬緫");
+ return;
+ }
+
productOperationType.value = type;
productOperationIndex.value = index;
productForm.value = {};
@@ -1373,7 +1166,7 @@
if (type === "edit") {
// 澶嶅埗琛屾暟鎹�
- productForm.value = {...row};
+ productForm.value = { ...row };
// 濡傛灉鏄粠妯℃澘鍔犺浇鐨勬暟鎹紝鍙兘娌℃湁 productId 鍜� productModelId
// 闇�瑕佹牴鎹� productCategory 鍜� specificationModel 鏉ユ煡鎵惧搴旂殑 ID
@@ -1385,27 +1178,36 @@
return nodes[i].value;
}
if (nodes[i].children && nodes[i].children.length > 0) {
- const found = findProductIdByCategory(nodes[i].children, categoryName);
+ const found = findProductIdByCategory(
+ nodes[i].children,
+ categoryName
+ );
if (found) return found;
}
}
return null;
};
- const productId = findProductIdByCategory(productOptions.value, productForm.value.productCategory);
+ const productId = findProductIdByCategory(
+ productOptions.value,
+ productForm.value.productCategory
+ );
if (productId) {
productForm.value.productId = productId;
// 鑾峰彇鍨嬪彿鍒楄〃骞剁瓑寰呭畬鎴�
- const modelRes = await modelList({id: productId});
+ const modelRes = await modelList({ id: productId });
modelOptions.value = modelRes;
// 绛夊緟 DOM 鏇存柊
await nextTick();
// 鏍规嵁 specificationModel 鏌ユ壘 productModelId
- if (productForm.value.specificationModel && modelOptions.value.length > 0) {
+ if (
+ productForm.value.specificationModel &&
+ modelOptions.value.length > 0
+ ) {
const modelItem = modelOptions.value.find(
- item => item.model === productForm.value.specificationModel
+ item => item.model === productForm.value.specificationModel
);
if (modelItem) {
productForm.value.productModelId = modelItem.id;
@@ -1439,8 +1241,8 @@
const getModels = value => {
if (value) {
productForm.value.productCategory =
- findNodeById(productOptions.value, value) || "";
- return modelList({id: value}).then(res => {
+ findNodeById(productOptions.value, value) || "";
+ return modelList({ id: value }).then(res => {
modelOptions.value = res;
return res;
});
@@ -1477,7 +1279,7 @@
function convertIdToValue(data) {
return data.map(item => {
- const {id, children, ...rest} = item;
+ const { id, children, ...rest } = item;
const newItem = {
...rest,
value: id, // 灏� id 鏀逛负 value
@@ -1498,7 +1300,7 @@
submitProductEdit();
} else {
if (productOperationType.value === "add") {
- productData.value.push({...productForm.value});
+ productData.value.push({ ...productForm.value });
console.log("productData.value---", productData.value);
} else {
productData.value[productOperationIndex.value] = {
@@ -1516,8 +1318,9 @@
addOrUpdateSalesLedgerProduct(productForm.value).then(res => {
proxy.$modal.msgSuccess("鎻愪氦鎴愬姛");
closeProductDia();
- getPurchaseById({id: currentId.value, type: 2}).then(res => {
- productData.value = res.productData;
+ // 浣跨敤 productList 鎺ュ彛鍒锋柊浜у搧鍒楄〃锛屼互鑾峰彇鍏ュ簱瀹℃牳鐘舵��
+ productList({ salesLedgerId: currentId.value, type: 2 }).then(res => {
+ productData.value = res.data || [];
});
});
};
@@ -1527,15 +1330,19 @@
proxy.$modal.msgWarning("璇烽�夋嫨鏁版嵁");
return;
}
+ // 妫�鏌ラ�変腑鐨勪骇鍝佷腑鏄惁鏈夊畬鍏ㄥ叆搴撶殑
+ const hasFullyStocked = productSelectedRows.value.some(
+ row => row.stockInApprovalStatus === '瀹屽叏鍏ュ簱'
+ );
+ if (hasFullyStocked) {
+ proxy.$modal.msgWarning("閫変腑鐨勪骇鍝佷腑鍖呭惈瀹屽叏鍏ュ簱鐨勪骇鍝侊紝鏃犳硶鍒犻櫎");
+ return;
+ }
if (operationType.value === "add") {
- productSelectedRows.value.forEach(selectedRow => {
- const index = productData.value.findIndex(
- product => product.id === selectedRow.id
- );
- if (index !== -1) {
- productData.value.splice(index, 1);
- }
- });
+ productData.value = productData.value.filter(
+ item => !productSelectedRows.value.includes(item)
+ );
+ productSelectedRows.value = [];
} else {
let ids = [];
if (productSelectedRows.value.length > 0) {
@@ -1546,20 +1353,19 @@
cancelButtonText: "鍙栨秷",
type: "warning",
})
- .then(() => {
- delProduct(ids).then(res => {
- proxy.$modal.msgSuccess("鍒犻櫎鎴愬姛");
- closeProductDia();
- getPurchaseById({id: currentId.value, type: 2}).then(
- res => {
- productData.value = res.productData;
- }
- );
+ .then(() => {
+ delProduct(ids).then(res => {
+ proxy.$modal.msgSuccess("鍒犻櫎鎴愬姛");
+ closeProductDia();
+ // 浣跨敤 productList 鎺ュ彛鍒锋柊浜у搧鍒楄〃锛屼互鑾峰彇鍏ュ簱瀹℃牳鐘舵��
+ productList({ salesLedgerId: currentId.value, type: 2 }).then(res => {
+ productData.value = res.data || [];
});
- })
- .catch(() => {
- proxy.$modal.msg("宸插彇娑�");
});
+ })
+ .catch(() => {
+ proxy.$modal.msg("宸插彇娑�");
+ });
}
};
// 鍏抽棴浜у搧寮规
@@ -1574,18 +1380,20 @@
cancelButtonText: "鍙栨秷",
type: "warning",
})
- .then(() => {
- proxy.download("/purchase/ledger/export", {}, "閲囪喘鍙拌处.xlsx");
- })
- .catch(() => {
- proxy.$modal.msg("宸插彇娑�");
- });
+ .then(() => {
+ proxy.download("/purchase/ledger/export", {}, "閲囪喘鍙拌处.xlsx");
+ })
+ .catch(() => {
+ proxy.$modal.msg("宸插彇娑�");
+ });
};
// 鍒犻櫎
const handleDelete = () => {
let ids = [];
if (selectedRows.value.length > 0) {
- ids = selectedRows.value.filter(item => item.salesLedgerId === null).map(item => item.id);
+ ids = selectedRows.value
+ .filter(item => item.salesLedgerId === null)
+ .map(item => item.id);
} else {
proxy.$modal.msgWarning("璇烽�夋嫨鏁版嵁");
return;
@@ -1595,15 +1403,15 @@
cancelButtonText: "鍙栨秷",
type: "warning",
})
- .then(() => {
- delPurchase(ids).then(res => {
- proxy.$modal.msgSuccess("鍒犻櫎鎴愬姛");
- getList();
- });
- })
- .catch(() => {
- proxy.$modal.msg("宸插彇娑�");
+ .then(() => {
+ delPurchase(ids).then(res => {
+ proxy.$modal.msgSuccess("鍒犻櫎鎴愬姛");
+ getList();
});
+ })
+ .catch(() => {
+ proxy.$modal.msg("宸插彇娑�");
+ });
};
// 鑾峰彇褰撳墠鏃ユ湡骞舵牸寮忓寲涓� YYYY-MM-DD
@@ -1628,17 +1436,17 @@
}
// 鍚◣鎬讳环璁$畻
productForm.value.taxInclusiveTotalPrice =
- proxy.calculateTaxIncludeTotalPrice(
- productForm.value.taxInclusiveUnitPrice,
- productForm.value.quantity
- );
+ proxy.calculateTaxIncludeTotalPrice(
+ productForm.value.taxInclusiveUnitPrice,
+ productForm.value.quantity
+ );
if (productForm.value.taxRate) {
// 涓嶅惈绋庢�讳环璁$畻
productForm.value.taxExclusiveTotalPrice =
- proxy.calculateTaxExclusiveTotalPrice(
- productForm.value.taxInclusiveTotalPrice,
- productForm.value.taxRate
- );
+ proxy.calculateTaxExclusiveTotalPrice(
+ productForm.value.taxInclusiveTotalPrice,
+ productForm.value.taxRate
+ );
}
};
const reverseMathNum = field => {
@@ -1651,8 +1459,8 @@
// 纭繚杈撳叆鍊间笉涓鸿礋鏁�
if (
- field === "taxInclusiveTotalPrice" ||
- field === "taxExclusiveTotalPrice"
+ field === "taxInclusiveTotalPrice" ||
+ field === "taxExclusiveTotalPrice"
) {
const value = Number(productForm.value[field]);
if (value < 0) {
@@ -1666,8 +1474,8 @@
// 宸茬煡鍚◣鎬讳环鍜屾暟閲忥紝鍙嶇畻鍚◣鍗曚环
if (productForm.value.quantity) {
productForm.value.taxInclusiveUnitPrice = (
- Number(productForm.value.taxInclusiveTotalPrice) /
- Number(productForm.value.quantity)
+ Number(productForm.value.taxInclusiveTotalPrice) /
+ Number(productForm.value.quantity)
).toFixed(2);
// 纭繚缁撴灉涓嶄负璐熸暟
if (Number(productForm.value.taxInclusiveUnitPrice) < 0) {
@@ -1677,8 +1485,8 @@
// 宸茬煡鍚◣鎬讳环鍜屽惈绋庡崟浠凤紝鍙嶇畻鏁伴噺
else if (productForm.value.taxInclusiveUnitPrice) {
productForm.value.quantity = (
- Number(productForm.value.taxInclusiveTotalPrice) /
- Number(productForm.value.taxInclusiveUnitPrice)
+ Number(productForm.value.taxInclusiveTotalPrice) /
+ Number(productForm.value.taxInclusiveUnitPrice)
).toFixed(2);
// 纭繚缁撴灉涓嶄负璐熸暟
if (Number(productForm.value.quantity) < 0) {
@@ -1687,8 +1495,8 @@
}
// 鍙嶇畻涓嶅惈绋庢�讳环
productForm.value.taxExclusiveTotalPrice = (
- Number(productForm.value.taxInclusiveTotalPrice) /
- (1 + taxRate / 100)
+ Number(productForm.value.taxInclusiveTotalPrice) /
+ (1 + taxRate / 100)
).toFixed(2);
// 纭繚缁撴灉涓嶄负璐熸暟
if (Number(productForm.value.taxExclusiveTotalPrice) < 0) {
@@ -1697,8 +1505,8 @@
} else if (field === "taxExclusiveTotalPrice") {
// 鍙嶇畻鍚◣鎬讳环
productForm.value.taxInclusiveTotalPrice = (
- Number(productForm.value.taxExclusiveTotalPrice) *
- (1 + taxRate / 100)
+ Number(productForm.value.taxExclusiveTotalPrice) *
+ (1 + taxRate / 100)
).toFixed(2);
// 纭繚缁撴灉涓嶄负璐熸暟
if (Number(productForm.value.taxInclusiveTotalPrice) < 0) {
@@ -1707,8 +1515,8 @@
// 宸茬煡鏁伴噺锛屽弽绠楀惈绋庡崟浠�
if (productForm.value.quantity) {
productForm.value.taxInclusiveUnitPrice = (
- Number(productForm.value.taxInclusiveTotalPrice) /
- Number(productForm.value.quantity)
+ Number(productForm.value.taxInclusiveTotalPrice) /
+ Number(productForm.value.quantity)
).toFixed(2);
// 纭繚缁撴灉涓嶄负璐熸暟
if (Number(productForm.value.taxInclusiveUnitPrice) < 0) {
@@ -1718,8 +1526,8 @@
// 宸茬煡鍚◣鍗曚环锛屽弽绠楁暟閲�
else if (productForm.value.taxInclusiveUnitPrice) {
productForm.value.quantity = (
- Number(productForm.value.taxInclusiveTotalPrice) /
- Number(productForm.value.taxInclusiveUnitPrice)
+ Number(productForm.value.taxInclusiveTotalPrice) /
+ Number(productForm.value.taxInclusiveUnitPrice)
).toFixed(2);
// 纭繚缁撴灉涓嶄负璐熸暟
if (Number(productForm.value.quantity) < 0) {
@@ -1730,16 +1538,14 @@
};
// 閿�鍞悎鍚岄�夋嫨鏀瑰彉鏂规硶
const salesLedgerChange = async row => {
- console.log("row", row);
var index = salesContractList.value.findIndex(item => item.id == row);
- console.log("index", index);
if (index > -1) {
await querygProductInfoByContractNo();
}
};
const querygProductInfoByContractNo = async () => {
- const {code, data} = await getProductInfoByContractNo({
+ const { code, data } = await getProductInfoByContractNo({
contractNo: form.value.salesLedgerId,
});
if (code == 200) {
@@ -1756,13 +1562,13 @@
};
// 鎵撳紑闄勪欢寮规
-const openFileDialog = async (row) => {
- recordId.value = row.id
- fileListDialogVisible.value = true
-}
+const openFileDialog = async row => {
+ recordId.value = row.id;
+ fileListDialogVisible.value = true;
+};
// 鍒犻櫎妯℃澘
-const handleDeleteTemplate = async (item) => {
+const handleDeleteTemplate = async item => {
if (!item.id) {
proxy.$modal.msgWarning("鏃犳硶鍒犻櫎璇ユā鏉�");
return;
@@ -1770,13 +1576,13 @@
try {
await ElMessageBox.confirm(
- `纭畾瑕佸垹闄ゆā鏉�"${item.templateName}"鍚楋紵`,
- "鍒犻櫎纭",
- {
- confirmButtonText: "纭畾",
- cancelButtonText: "鍙栨秷",
- type: "warning",
- }
+ `纭畾瑕佸垹闄ゆā鏉�"${item.templateName}"鍚楋紵`,
+ "鍒犻櫎纭",
+ {
+ confirmButtonText: "纭畾",
+ cancelButtonText: "鍙栨秷",
+ type: "warning",
+ }
);
const res = await delPurchaseTemplate([item.id]);
@@ -1827,7 +1633,53 @@
}
.no-arrow-select {
- --el-select-suffix-icon-color: transparent; /* 闅愯棌榛樿涓嬫媺绠ご */
+ --el-select-suffix-icon-color: transparent;
+ /* 闅愯棌榛樿涓嬫媺绠ご */
+}
+
+.readonly-text {
+ display: inline-block;
+ width: 100%;
+ padding: 0 15px;
+ height: 32px;
+ line-height: 32px;
+ background-color: var(--el-fill-color-light);
+ border-radius: var(--el-border-radius-base);
+ color: var(--el-text-color-regular);
+ font-size: var(--el-font-size-base);
+ box-sizing: border-box;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+}
+
+.readonly-text-area {
+ width: 100%;
+ min-height: 52px;
+ padding: 5px 15px;
+ background-color: var(--el-fill-color-light);
+ border-radius: var(--el-border-radius-base);
+ color: var(--el-text-color-regular);
+ font-size: var(--el-font-size-base);
+ box-sizing: border-box;
+ white-space: pre-wrap;
+ word-break: break-all;
+}
+
+.detail-file-list {
+ width: 100%;
+ padding: 10px 15px;
+ background-color: var(--el-fill-color-light);
+ border-radius: var(--el-border-radius-base);
+}
+
+.detail-file-item {
+ line-height: 24px;
+ margin-bottom: 5px;
+}
+
+.detail-file-item:last-child {
+ margin-bottom: 0;
}
.select-button-group {
--
Gitblit v1.9.3