From 28fc65c34d1642b007dc45b83782e23be58d718c Mon Sep 17 00:00:00 2001
From: huminmin <mac@MacBook-Pro.local>
Date: 星期三, 08 七月 2026 16:43:58 +0800
Subject: [PATCH] 已进行排班并且人员已打卡的前提下,对应的班次配置不能编辑删除。
---
src/views/salesManagement/salesLedger/index.vue | 2672 +++++++++++++++++++++++++++++++++--------------------------
1 files changed, 1,495 insertions(+), 1,177 deletions(-)
diff --git a/src/views/salesManagement/salesLedger/index.vue b/src/views/salesManagement/salesLedger/index.vue
index 7849b60..d2e82b5 100644
--- a/src/views/salesManagement/salesLedger/index.vue
+++ b/src/views/salesManagement/salesLedger/index.vue
@@ -1,42 +1,47 @@
<template>
<div class="app-container">
<div class="search_form">
- <el-form :model="searchForm"
- :inline="true">
+ <el-form :model="searchForm" :inline="true">
<el-form-item label="瀹㈡埛鍚嶇О锛�">
- <el-input v-model="searchForm.customerName"
- placeholder="璇疯緭鍏�"
- clearable
- prefix-icon="Search"
- @change="handleQuery"/>
+ <el-input
+ v-model="searchForm.customerName"
+ 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-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>
- <el-button type="primary"
- @click="handleQuery"> 鎼滅储
- </el-button>
+ <el-button type="primary" @click="handleQuery"> 鎼滅储 </el-button>
</el-form-item>
</el-form>
</div>
@@ -44,141 +49,137 @@
<div class="actions">
<div></div>
<div>
- <el-button type="primary"
- @click="openForm('add')">
+ <el-button type="primary" @click="openForm('add')">
鏂板鍙拌处
</el-button>
- <el-button type="primary"
- plain
- @click="handleImport">瀵煎叆
+ <el-button type="primary" plain @click="handleImport"
+ >瀵煎叆
</el-button>
<el-button @click="handleOut">瀵煎嚭</el-button>
- <el-button type="danger"
- plain
- @click="handleDelete">鍒犻櫎
- </el-button>
- <el-button type="primary"
- plain
- @click="handlePrint">鎵撳嵃
- </el-button>
+ <el-button type="danger" plain @click="handleDelete">鍒犻櫎 </el-button>
+ <el-button type="primary" plain @click="handlePrint">鎵撳嵃 </el-button>
</div>
</div>
- <el-table :data="tableData"
- border
- v-loading="tableLoading"
- @selection-change="handleSelectionChange"
- :expand-row-keys="expandedRowKeys"
- :row-key="(row) => row.id"
- :row-class-name="tableRowClassName"
- show-summary
- style="width: 100%"
- :summary-method="summarizeMainTable"
- @expand-change="expandChange"
- height="calc(100vh - 18.5em)">
- <el-table-column align="center"
- type="selection"
- width="55"
- fixed="left"/>
- <el-table-column type="expand"
- width="60"
- fixed="left">
+ <el-table
+ :data="tableData"
+ border
+ v-loading="tableLoading"
+ @selection-change="handleSelectionChange"
+ :expand-row-keys="expandedRowKeys"
+ :row-key="(row) => row.id"
+ :row-class-name="tableRowClassName"
+ show-summary
+ style="width: 100%"
+ :summary-method="summarizeMainTable"
+ @expand-change="expandChange"
+ height="calc(100vh - 18.5em)"
+ >
+ <el-table-column
+ align="center"
+ type="selection"
+ width="55"
+ fixed="left"
+ />
+ <el-table-column type="expand" width="60" fixed="left">
<template #default="props">
- <el-table :data="props.row.children"
- border
- show-summary
- :summary-method="(param) => summarizeChildrenTable(param, props.row)">
- <el-table-column align="center"
- label="搴忓彿"
- type="index"/>
- <el-table-column label="浜у搧澶х被"
- prop="productCategory"/>
- <el-table-column label="瑙勬牸鍨嬪彿"
- prop="specificationModel"/>
- <el-table-column label="鍗曚綅"
- prop="unit"/>
- <el-table-column label="浜у搧鐘舵��"
- width="100px"
- align="center">
+ <el-table
+ :data="props.row.children"
+ border
+ show-summary
+ :summary-method="
+ (param) => summarizeChildrenTable(param, props.row)
+ "
+ >
+ <el-table-column align="center" label="搴忓彿" type="index" />
+ <el-table-column label="浜у搧澶х被" prop="productCategory" />
+ <el-table-column label="瑙勬牸鍨嬪彿" prop="specificationModel" />
+ <el-table-column label="鍗曚綅" prop="unit" />
+ <el-table-column label="浜у搧鐘舵��" width="100px" align="center">
<template #default="scope">
- <el-tag
- v-if="scope.row.approveStatus === 1 && scope.row.noQuantity !== 0"
- type="success">鍏呰冻
+ <el-tag v-if="scope.row.approveStatus === 1" type="success"
+ >鍏呰冻
</el-tag>
<el-tag
- v-else-if="scope.row.approveStatus === 0 && scope.row.noQuantity === 0"
- type="success">宸插嚭搴�
+ v-else-if="
+ scope.row.approveStatus === 0 &&
+ scope.row.noQuantity === 0
+ "
+ type="success"
+ >宸插嚭搴�
</el-tag>
- <el-tag v-else
- type="danger">涓嶈冻
- </el-tag>
+ <el-tag v-else type="danger">涓嶈冻 </el-tag>
</template>
</el-table-column>
- <el-table-column label="鍙戣揣鐘舵��"
- width="140"
- align="center">
+ <el-table-column label="鍙戣揣鐘舵��" width="140" align="center">
<template #default="scope">
- <el-tag :type="getShippingStatusType(scope.row)"
- size="small">
+ <el-tag :type="getShippingStatusType(scope.row)" size="small">
{{ getShippingStatusText(scope.row) }}
</el-tag>
</template>
</el-table-column>
- <el-table-column label="蹇�掑叕鍙�"
- prop="expressCompany"
- show-overflow-tooltip/>
- <el-table-column label="蹇�掑崟鍙�"
- prop="expressNumber"
- show-overflow-tooltip/>
- <el-table-column label="鍙戣揣杞︾墝"
- minWidth="100px"
- align="center">
+ <el-table-column label="瀹℃壒涓暟閲�" width="120" align="center">
+ <template #default="scope">
+ <span>{{ scope.row.pendingApprovalQuantity || 0 }}</span>
+ </template>
+ </el-table-column>
+ <el-table-column
+ label="蹇�掑叕鍙�"
+ prop="expressCompany"
+ show-overflow-tooltip
+ />
+ <el-table-column
+ label="蹇�掑崟鍙�"
+ prop="expressNumber"
+ show-overflow-tooltip
+ />
+ <el-table-column label="鍙戣揣杞︾墝" minWidth="100px" align="center">
<template #default="scope">
<div>
- <el-tag type="success"
- v-if="scope.row.shippingCarNumber">{{ scope.row.shippingCarNumber }}
+ <el-tag type="success" v-if="scope.row.shippingCarNumber"
+ >{{ scope.row.shippingCarNumber }}
</el-tag>
- <el-tag v-else
- type="info">-
- </el-tag>
+ <el-tag v-else type="info">- </el-tag>
</div>
</template>
</el-table-column>
- <el-table-column label="鍙戣揣鏃ユ湡"
- minWidth="100px"
- align="center">
+ <el-table-column label="鍙戣揣鏃ユ湡" minWidth="100px" align="center">
<template #default="scope">
<div>
- <div v-if="scope.row.shippingDate">{{ scope.row.shippingDate }}</div>
- <el-tag v-else
- type="info">-
- </el-tag>
+ <div v-if="scope.row.shippingDate">
+ {{ scope.row.shippingDate }}
+ </div>
+ <el-tag v-else type="info">- </el-tag>
</div>
</template>
</el-table-column>
- <el-table-column label="鏁伴噺"
- prop="quantity"/>
- <el-table-column label="寰呭彂璐ф暟閲�"
- prop="noQuantity"/>
- <el-table-column label="绋庣巼(%)"
- prop="taxRate"/>
- <el-table-column label="鍚◣鍗曚环(鍏�)"
- prop="taxInclusiveUnitPrice"
- :formatter="sensitiveAmountFormatter"/>
- <el-table-column label="鍚◣鎬讳环(鍏�)"
- prop="taxInclusiveTotalPrice"
- :formatter="sensitiveAmountFormatter"/>
- <el-table-column label="涓嶅惈绋庢�讳环(鍏�)"
- prop="taxExclusiveTotalPrice"
- :formatter="sensitiveAmountFormatter"/>
+ <el-table-column label="鏁伴噺" prop="quantity" />
+ <el-table-column label="閫�璐ф暟閲�" prop="returnQuantity" />
+ <el-table-column label="寰呭彂璐ф暟閲�" prop="noQuantity" />
+ <el-table-column label="绋庣巼(%)" prop="taxRate" />
+ <el-table-column
+ label="鍚◣鍗曚环(鍏�)"
+ prop="taxInclusiveUnitPrice"
+ :formatter="sensitiveAmountFormatter"
+ />
+ <el-table-column
+ label="鍚◣鎬讳环(鍏�)"
+ prop="taxInclusiveTotalPrice"
+ :formatter="sensitiveAmountFormatter"
+ />
+ <el-table-column
+ label="涓嶅惈绋庢�讳环(鍏�)"
+ prop="taxExclusiveTotalPrice"
+ :formatter="sensitiveAmountFormatter"
+ />
<!--鎿嶄綔-->
- <el-table-column Width="60px"
- label="鎿嶄綔"
- align="center">
+ <el-table-column Width="60px" label="鎿嶄綔" align="center">
<template #default="scope">
- <el-button link
- type="primary"
- :disabled="!canShip(scope.row)"
- @click="openDeliveryForm(scope.row)">
+ <el-button
+ link
+ type="primary"
+ :disabled="!canShip(scope.row)"
+ @click="openDeliveryForm(scope.row)"
+ >
鍙戣揣
</el-button>
</template>
@@ -186,141 +187,205 @@
</el-table>
</template>
</el-table-column>
- <el-table-column align="center"
- label="搴忓彿"
- type="index"
- width="60"/>
- <el-table-column label="閿�鍞悎鍚屽彿"
- prop="salesContractNo"
- width="180"
- show-overflow-tooltip/>
- <el-table-column label="瀹㈡埛鍚嶇О"
- prop="customerName"
- width="300"
- show-overflow-tooltip/>
- <el-table-column label="涓氬姟鍛�"
- prop="salesman"
- width="100"
- show-overflow-tooltip/>
- <el-table-column label="椤圭洰鍚嶇О"
- prop="projectName"
- width="180"
- show-overflow-tooltip/>
- <el-table-column label="浠樻鏂瑰紡"
- prop="paymentMethod"
- show-overflow-tooltip/>
- <el-table-column label="鍚堝悓閲戦(鍏�)"
- prop="contractAmount"
- width="220"
- show-overflow-tooltip
- :formatter="formattedNumber"/>
- <el-table-column label="褰曞叆浜�"
- prop="entryPersonName"
- width="100"
- show-overflow-tooltip/>
- <el-table-column label="褰曞叆鏃ユ湡"
- prop="entryDate"
- width="120"
- show-overflow-tooltip/>
- <el-table-column label="绛捐鏃ユ湡"
- prop="executionDate"
- width="120"
- show-overflow-tooltip/>
- <el-table-column label="浜や粯鏃ユ湡"
- prop="deliveryDate"
- width="120"
- show-overflow-tooltip/>
- <el-table-column label="澶囨敞"
- prop="remarks"
- width="200"
- show-overflow-tooltip/>
- <el-table-column fixed="right"
- label="鎿嶄綔"
- width="130"
- align="center">
+ <el-table-column align="center" label="搴忓彿" type="index" width="60" />
+ <el-table-column
+ label="閿�鍞悎鍚屽彿"
+ prop="salesContractNo"
+ width="180"
+ show-overflow-tooltip
+ />
+ <el-table-column
+ label="瀹㈡埛鍚嶇О"
+ prop="customerName"
+ width="300"
+ show-overflow-tooltip
+ />
+ <el-table-column
+ label="涓氬姟鍛�"
+ prop="salesman"
+ width="100"
+ show-overflow-tooltip
+ />
+ <el-table-column
+ label="椤圭洰鍚嶇О"
+ prop="projectName"
+ width="180"
+ show-overflow-tooltip
+ />
+ <el-table-column
+ label="浠樻鏂瑰紡"
+ prop="paymentMethod"
+ show-overflow-tooltip
+ />
+ <el-table-column
+ label="鍚堝悓閲戦(鍏�)"
+ prop="contractAmount"
+ width="220"
+ show-overflow-tooltip
+ :formatter="formattedNumber"
+ />
+ <el-table-column
+ label="瀹為檯鍚堝悓閲戦(鍏�)"
+ prop="netContractAmount"
+ width="220"
+ show-overflow-tooltip
+ :formatter="formattedNumber"
+ />
+ <el-table-column
+ label="褰曞叆浜�"
+ prop="entryPersonName"
+ width="100"
+ show-overflow-tooltip
+ />
+ <el-table-column
+ label="褰曞叆鏃ユ湡"
+ prop="entryDate"
+ width="120"
+ show-overflow-tooltip
+ />
+ <el-table-column
+ label="绛捐鏃ユ湡"
+ prop="executionDate"
+ width="120"
+ show-overflow-tooltip
+ />
+ <el-table-column
+ label="浜や粯鏃ユ湡"
+ prop="deliveryDate"
+ width="120"
+ show-overflow-tooltip
+ />
+ <el-table-column
+ label="澶囨敞"
+ prop="remarks"
+ width="200"
+ show-overflow-tooltip
+ />
+ <el-table-column fixed="right" label="鎿嶄綔" width="220" align="center">
<template #default="scope">
- <el-button link
- type="primary"
- @click="openForm('edit', scope.row)"
- :disabled="!scope.row.isEdit || scope.row.hasProductionRecord || !canEditLedger(scope.row)">缂栬緫
+ <el-button link type="primary" @click="openForm('view', scope.row)"
+ >璇︽儏
</el-button>
- <el-button link
- type="primary"
- @click="openFileDialog(scope.row)">闄勪欢
+ <el-button
+ link
+ type="primary"
+ @click="openForm('edit', scope.row)"
+ :disabled="
+ !scope.row.isEdit ||
+ scope.row.hasProductionRecord ||
+ !canEditLedger(scope.row)
+ "
+ >缂栬緫
+ </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">
+ <FormDialog
+ v-model="dialogFormVisible"
+ :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"
+ >
<!-- 鎶ヤ环鍗曞鍏ュ叆鍙o細鏀惧湪琛ㄥ崟椤堕儴锛岄�夋嫨鍚庡弽鏄惧鎴�/涓氬姟鍛樼瓑 -->
- <el-row v-if="operationType === 'add'"
- style="margin-bottom: 10px;">
- <el-col :span="24"
- style="text-align: right;">
- <el-button type="primary"
- plain
- @click="openQuotationDialog">
+ <el-row v-if="operationType === 'add'" style="margin-bottom: 10px">
+ <el-col :span="24" style="text-align: right">
+ <el-button type="primary" plain @click="openQuotationDialog">
浠庨攢鍞姤浠峰鍏�
</el-button>
</el-col>
</el-row>
<el-row :gutter="30">
<el-col :span="12">
- <el-form-item label="閿�鍞悎鍚屽彿锛�"
- prop="salesContractNo">
- <el-input v-model="form.salesContractNo"
- placeholder="鑷姩鐢熸垚"
- clearable
- disabled/>
+ <el-form-item label="閿�鍞悎鍚屽彿锛�" prop="salesContractNo">
+ <div
+ style="
+ display: flex;
+ align-items: center;
+ gap: 12px;
+ width: 100%;
+ "
+ >
+ <el-checkbox
+ v-model="form.autoGenerateContractNo"
+ v-if="operationType === 'add'"
+ >鑷姩鐢熸垚
+ </el-checkbox>
+ <el-input
+ v-model="form.salesContractNo"
+ :placeholder="
+ form.autoGenerateContractNo ? '淇濆瓨鍚庤嚜鍔ㄧ敓鎴�' : '璇疯緭鍏�'
+ "
+ clearable
+ :disabled="
+ form.autoGenerateContractNo || operationType === 'view'
+ "
+ />
+ </div>
</el-form-item>
</el-col>
<el-col :span="12">
- <el-form-item label="涓氬姟鍛橈細"
- prop="salesman">
- <el-select v-model="form.salesman"
- placeholder="璇烽�夋嫨"
- clearable
- :disabled="operationType === 'view'"
- filterable>
- <el-option v-for="item in userList"
- :key="item.nickName"
- :label="item.nickName"
- :value="item.nickName"/>
+ <el-form-item label="涓氬姟鍛橈細" prop="salesman">
+ <el-select
+ v-model="form.salesman"
+ placeholder="璇烽�夋嫨"
+ clearable
+ :disabled="operationType === 'view'"
+ filterable
+ >
+ <el-option
+ v-for="item in userList"
+ :key="item.nickName"
+ :label="item.nickName"
+ :value="item.nickName"
+ />
</el-select>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="30">
<el-col :span="12">
- <el-form-item label="瀹㈡埛鍚嶇О锛�"
- prop="customerId">
- <el-select v-model="form.customerId"
- placeholder="璇烽�夋嫨"
- clearable
- :disabled="operationType === 'view'"
- filterable>
- <el-option v-for="item in customerOption"
- :key="item.id"
- :label="item.customerName"
- :value="item.id">
+ <el-form-item label="瀹㈡埛鍚嶇О锛�" prop="customerId">
+ <el-select
+ v-model="form.customerId"
+ placeholder="璇烽�夋嫨"
+ clearable
+ :disabled="operationType === 'view'"
+ filterable
+ >
+ <el-option
+ v-for="item in customerOption"
+ :key="item.id"
+ :label="item.customerName"
+ :value="item.id"
+ >
{{
item.customerName + "鈥斺��" + item.taxpayerIdentificationNumber
}}
@@ -329,397 +394,453 @@
</el-form-item>
</el-col>
<el-col :span="12">
- <el-form-item label="椤圭洰鍚嶇О锛�"
- prop="projectName">
- <el-input v-model="form.projectName"
- placeholder="璇疯緭鍏�"
- clearable
- :disabled="operationType === 'view'"/>
+ <el-form-item label="椤圭洰鍚嶇О锛�" prop="projectName">
+ <el-input
+ v-model="form.projectName"
+ 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="executionDate">
- <el-date-picker style="width: 100%"
- v-model="form.executionDate"
- value-format="YYYY-MM-DD"
- format="YYYY-MM-DD"
- type="date"
- placeholder="璇烽�夋嫨"
- clearable
- :disabled="operationType === 'view'"/>
+ <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
+ :disabled="operationType === 'view'"
+ />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="浠樻鏂瑰紡">
- <el-input v-model="form.paymentMethod"
- placeholder="璇疯緭鍏�"
- clearable
- :disabled="operationType === 'view'"/>
+ <el-input
+ v-model="form.paymentMethod"
+ 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"
- filterable
- default-first-option
- :reserve-keyword="false"
- placeholder="璇烽�夋嫨"
- clearable
- @change="changs">
- <el-option v-for="item in userList"
- :key="item.userId"
- :label="item.nickName"
- :value="item.userId"/>
+ <el-form-item label="褰曞叆浜猴細" prop="entryPerson">
+ <el-select
+ v-model="form.entryPerson"
+ filterable
+ default-first-option
+ :reserve-keyword="false"
+ placeholder="璇烽�夋嫨"
+ clearable
+ :disabled="operationType === 'view'"
+ @change="changs"
+ >
+ <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
+ :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"
- placeholder="璇烽�夋嫨"
- clearable/>
+ <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>
- <el-form-item label="浜у搧淇℃伅锛�"
- prop="entryDate">
- <el-button v-if="operationType !== 'view'"
- type="primary"
- @click="openProductForm('add')">娣诲姞
+ <el-form-item label="浜у搧淇℃伅锛�" prop="entryDate">
+ <el-button
+ v-if="operationType !== 'view'"
+ type="primary"
+ @click="openProductForm('add')"
+ >娣诲姞
</el-button>
- <el-button v-if="operationType !== 'view'"
- plain
- type="danger"
- @click="deleteProduct">鍒犻櫎
+ <el-button
+ v-if="operationType !== 'view'"
+ plain
+ type="danger"
+ @click="deleteProduct"
+ >鍒犻櫎
</el-button>
</el-form-item>
</el-row>
- <el-table :data="productData"
- border
- @selection-change="productSelected"
- show-summary
- :summary-method="summarizeMainTable">
- <el-table-column align="center"
- type="selection"
- width="55"
- v-if="operationType !== 'view'"
- :selectable="(row) => !isProductShipped(row)"/>
- <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="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-column label="鏄惁鐢熶骇"
- prop="isProduction"
- width="150">
+ <el-table
+ :data="productData"
+ border
+ @selection-change="productSelected"
+ show-summary
+ :summary-method="summarizeMainTable"
+ >
+ <el-table-column
+ align="center"
+ type="selection"
+ width="55"
+ v-if="operationType !== 'view'"
+ :selectable="(row) => !isProductShipped(row)"
+ />
+ <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="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-column label="鏄惁鐢熶骇" prop="isProduction" width="150">
<template #default="scope">
<el-tag :type="scope.row.isProduction ? 'success' : 'info'">
- {{ scope.row.isProduction ? '鏄�' : '鍚�' }}
+ {{ scope.row.isProduction ? "鏄�" : "鍚�" }}
</el-tag>
</template>
</el-table-column>
- <el-table-column fixed="right"
- label="鎿嶄綔"
- min-width="60"
- align="center"
- v-if="operationType !== 'view'">
+ <el-table-column
+ fixed="right"
+ label="鎿嶄綔"
+ min-width="60"
+ align="center"
+ v-if="operationType !== 'view'"
+ >
<template #default="scope">
- <el-button link
- type="primary"
- size="small"
- :disabled="isProductShipped(scope.row)"
- @click="openProductForm('edit', scope.row,scope.$index)">缂栬緫
+ <el-button
+ link
+ type="primary"
+ size="small"
+ :disabled="isProductShipped(scope.row)"
+ @click="openProductForm('edit', scope.row, scope.$index)"
+ >缂栬緫
</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"
- :disabled="operationType === 'view'"/>
+ <el-form-item label="澶囨敞锛�" prop="remarks">
+ <el-input
+ v-model="form.remarks"
+ placeholder="璇疯緭鍏�"
+ clearable
+ type="textarea"
+ :rows="2"
+ :disabled="operationType === 'view'"
+ />
</el-form-item>
</el-col>
</el-row>
- <el-row :gutter="30">
+ <el-row v-if="operationType !== 'view'" :gutter="30">
<el-col :span="24">
- <el-form-item label="闄勪欢鏉愭枡锛�"
- prop="salesLedgerFiles">
- <FileUpload v-model:file-list="fileList"/>
+ <el-form-item label="闄勪欢鏉愭枡锛�" prop="salesLedgerFiles">
+ <FileUpload
+ v-model:file-list="fileList"
+ :disabled="operationType === 'view'"
+ />
</el-form-item>
</el-col>
</el-row>
</el-form>
</FormDialog>
<!-- 浠庢姤浠峰崟瀵煎叆锛堜粎瀹℃壒閫氳繃锛� -->
- <el-dialog v-model="quotationDialogVisible"
- title="閫夋嫨瀹℃壒閫氳繃鐨勯攢鍞姤浠峰崟"
- width="80%"
- :close-on-click-modal="false">
- <div style="margin-bottom: 12px; display:flex; gap: 12px; align-items:center;">
- <el-input v-model="quotationSearchForm.quotationNo"
- placeholder="璇疯緭鍏ユ姤浠峰崟鍙�"
- clearable
- style="max-width: 260px;"
- @change="fetchQuotationList"/>
- <el-input v-model="quotationSearchForm.customer"
- placeholder="璇疯緭鍏ュ鎴峰悕绉�"
- clearable
- style="max-width: 260px;"
- @change="fetchQuotationList"/>
- <el-button type="primary"
- @click="fetchQuotationList">鎼滅储
- </el-button>
+ <el-dialog
+ v-model="quotationDialogVisible"
+ title="閫夋嫨瀹℃壒閫氳繃鐨勯攢鍞姤浠峰崟"
+ width="80%"
+ :close-on-click-modal="false"
+ >
+ <div
+ style="
+ margin-bottom: 12px;
+ display: flex;
+ gap: 12px;
+ align-items: center;
+ "
+ >
+ <el-input
+ v-model="quotationSearchForm.quotationNo"
+ placeholder="璇疯緭鍏ユ姤浠峰崟鍙�"
+ clearable
+ style="max-width: 260px"
+ @change="fetchQuotationList"
+ />
+ <el-input
+ v-model="quotationSearchForm.customer"
+ placeholder="璇疯緭鍏ュ鎴峰悕绉�"
+ clearable
+ style="max-width: 260px"
+ @change="fetchQuotationList"
+ />
+ <el-button type="primary" @click="fetchQuotationList">鎼滅储 </el-button>
<el-button @click="resetQuotationSearch">閲嶇疆</el-button>
</div>
- <el-table :data="quotationList"
- border
- stripe
- v-loading="quotationLoading"
- height="420px">
- <el-table-column align="center"
- label="搴忓彿"
- type="index"
- width="60"/>
- <el-table-column prop="quotationNo"
- label="鎶ヤ环鍗曞彿"
- width="180"
- show-overflow-tooltip/>
- <el-table-column prop="customer"
- label="瀹㈡埛鍚嶇О"
- min-width="220"
- show-overflow-tooltip/>
- <el-table-column prop="salesperson"
- label="涓氬姟鍛�"
- width="120"
- show-overflow-tooltip/>
- <el-table-column prop="quotationDate"
- label="鎶ヤ环鏃ユ湡"
- width="140"/>
- <el-table-column prop="status"
- label="瀹℃壒鐘舵��"
- width="120"
- align="center"/>
- <el-table-column prop="totalAmount"
- label="鎶ヤ环閲戦(鍏�)"
- width="160"
- align="right">
+ <el-table
+ :data="quotationList"
+ border
+ stripe
+ v-loading="quotationLoading"
+ height="420px"
+ >
+ <el-table-column align="center" label="搴忓彿" type="index" width="60" />
+ <el-table-column
+ prop="quotationNo"
+ label="鎶ヤ环鍗曞彿"
+ width="180"
+ show-overflow-tooltip
+ />
+ <el-table-column
+ prop="customer"
+ label="瀹㈡埛鍚嶇О"
+ min-width="220"
+ show-overflow-tooltip
+ />
+ <el-table-column
+ prop="salesperson"
+ label="涓氬姟鍛�"
+ width="120"
+ show-overflow-tooltip
+ />
+ <el-table-column prop="quotationDate" label="鎶ヤ环鏃ユ湡" width="140" />
+ <el-table-column
+ prop="status"
+ label="瀹℃壒鐘舵��"
+ width="120"
+ align="center"
+ />
+ <el-table-column
+ prop="totalAmount"
+ label="鎶ヤ环閲戦(鍏�)"
+ width="160"
+ align="right"
+ >
<template #default="scope">
{{ Number(scope.row.totalAmount ?? 0).toFixed(2) }}
</template>
</el-table-column>
- <el-table-column fixed="right"
- label="鎿嶄綔"
- width="120"
- align="center">
+ <el-table-column fixed="right" label="鎿嶄綔" width="120" align="center">
<template #default="scope">
- <el-button type="primary"
- link
- @click="applyQuotation(scope.row)">閫夋嫨
+ <el-button type="primary" link @click="applyQuotation(scope.row)"
+ >閫夋嫨
</el-button>
</template>
</el-table-column>
</el-table>
- <pagination v-show="quotationPage.total > 0"
- :total="quotationPage.total"
- layout="total, sizes, prev, pager, next, jumper"
- :page="quotationPage.current"
- :limit="quotationPage.size"
- @pagination="quotationPaginationChange"/>
+ <pagination
+ v-show="quotationPage.total > 0"
+ :total="quotationPage.total"
+ layout="total, sizes, prev, pager, next, jumper"
+ :page="quotationPage.current"
+ :limit="quotationPage.size"
+ @pagination="quotationPaginationChange"
+ />
<template #footer>
<el-button @click="quotationDialogVisible = false">鍏抽棴</el-button>
</template>
</el-dialog>
- <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="productCategory">
- <el-tree-select v-model="productForm.productCategory"
- placeholder="璇烽�夋嫨"
- clearable
- filterable
- check-strictly
- @change="getModels"
- :data="productOptions"
- :render-after-expand="false"
- style="width: 100%"/>
+ <el-form-item label="浜у搧澶х被锛�" prop="productCategory">
+ <el-tree-select
+ v-model="productForm.productCategory"
+ 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="璇烽�夋嫨"
- clearable
- @change="getProductModel"
- filterable>
- <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="璇烽�夋嫨"
+ clearable
+ @change="getProductModel"
+ filterable
+ >
+ <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="calculateFromTaxRate">
- <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="calculateFromTaxRate"
+ >
+ <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 :step="0.01"
- :min="0"
- v-model="productForm.taxInclusiveUnitPrice"
- style="width: 100%"
- :precision="2"
- placeholder="璇疯緭鍏�"
- clearable
- @change="calculateFromUnitPrice"/>
+ <el-form-item label="鍚◣鍗曚环(鍏�)锛�" prop="taxInclusiveUnitPrice">
+ <el-input-number
+ :step="0.01"
+ :min="0"
+ v-model="productForm.taxInclusiveUnitPrice"
+ style="width: 100%"
+ :precision="2"
+ placeholder="璇疯緭鍏�"
+ clearable
+ @change="calculateFromUnitPrice"
+ />
</el-form-item>
</el-col>
<el-col :span="12">
- <el-form-item label="鏁伴噺锛�"
- prop="quantity">
- <el-input-number :step="0.1"
- :min="0"
- v-model="productForm.quantity"
- placeholder="璇疯緭鍏�"
- clearable
- :precision="2"
- @change="calculateFromQuantity"
- style="width: 100%"/>
+ <el-form-item label="鏁伴噺锛�" prop="quantity">
+ <el-input-number
+ :step="0.1"
+ :min="0"
+ v-model="productForm.quantity"
+ placeholder="璇疯緭鍏�"
+ clearable
+ :precision="2"
+ @change="calculateFromQuantity"
+ style="width: 100%"
+ />
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="30">
<el-col :span="12">
- <el-form-item label="鍚◣鎬讳环(鍏�)锛�"
- prop="taxInclusiveTotalPrice">
- <el-input v-model="productForm.taxInclusiveTotalPrice"
- placeholder="璇疯緭鍏�"
- clearable
- @change="calculateFromTotalPrice"/>
+ <el-form-item label="鍚◣鎬讳环(鍏�)锛�" prop="taxInclusiveTotalPrice">
+ <el-input
+ v-model="productForm.taxInclusiveTotalPrice"
+ placeholder="璇疯緭鍏�"
+ clearable
+ @change="calculateFromTotalPrice"
+ />
</el-form-item>
</el-col>
<el-col :span="12">
- <el-form-item label="涓嶅惈绋庢�讳环(鍏�)锛�"
- prop="taxExclusiveTotalPrice">
- <el-input v-model="productForm.taxExclusiveTotalPrice"
- placeholder="璇疯緭鍏�"
- clearable
- @change="calculateFromExclusiveTotalPrice"/>
+ <el-form-item
+ label="涓嶅惈绋庢�讳环(鍏�)锛�"
+ prop="taxExclusiveTotalPrice"
+ >
+ <el-input
+ v-model="productForm.taxExclusiveTotalPrice"
+ placeholder="璇疯緭鍏�"
+ clearable
+ @change="calculateFromExclusiveTotalPrice"
+ />
</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="isProduction">
+ <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 label="鏄�" :value="true" />
+ <el-radio label="鍚�" :value="false" />
</el-radio-group>
</el-form-item>
</el-col>
@@ -727,34 +848,35 @@
</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>
- </div>
+ <div class="el-upload__text">灏嗘枃浠舵嫋鍒版澶勶紝鎴�<em>鐐瑰嚮涓婁紶</em></div>
<template #tip>
<div class="el-upload__tip">
浠呮敮鎸� xls/xlsx锛屽ぇ灏忎笉瓒呰繃 10MB銆�
- <el-button link
- type="primary"
- @click="downloadTemplate">涓嬭浇瀵煎叆妯℃澘
+ <el-button link type="primary" @click="downloadTemplate"
+ >涓嬭浇瀵煎叆妯℃澘
</el-button>
</div>
</template>
@@ -762,33 +884,50 @@
</FormDialog>
<!-- // todo 闄勪欢棰勮鐩稿叧 -->
<!-- 闄勪欢鍒楄〃寮圭獥 -->
- <FileList v-if="fileDialogVisible" v-model:visible="fileDialogVisible" record-type="sales_ledger"
- :record-id="recordId"/>
+ <FileList
+ v-if="fileDialogVisible"
+ v-model:visible="fileDialogVisible"
+ record-type="sales_ledger"
+ :record-id="recordId"
+ />
<!-- 鎵撳嵃棰勮寮圭獥 -->
- <el-dialog v-model="printPreviewVisible"
- title="鎵撳嵃棰勮"
- width="90%"
- :close-on-click-modal="false"
- class="print-preview-dialog">
+ <el-dialog
+ v-model="printPreviewVisible"
+ title="鎵撳嵃棰勮"
+ width="90%"
+ :close-on-click-modal="false"
+ class="print-preview-dialog"
+ >
<div class="print-preview-container">
<div class="print-preview-header">
- <el-button type="primary"
- @click="executePrint">鎵ц鎵撳嵃
- </el-button>
+ <el-button type="primary" @click="executePrint">鎵ц鎵撳嵃 </el-button>
<el-button @click="printPreviewVisible = false">鍏抽棴棰勮</el-button>
</div>
<div class="print-preview-content">
- <div v-if="printData.length === 0"
- style="text-align: center; padding: 50px; color: #999;">
+ <div
+ v-if="printData.length === 0"
+ style="text-align: center; padding: 50px; color: #999"
+ >
鏆傛棤鎵撳嵃鏁版嵁
</div>
- <div v-else
- style="text-align: center; padding: 10px; color: #666; font-size: 14px; background: #e8f4fd; margin-bottom: 10px;">
+ <div
+ v-else
+ style="
+ text-align: center;
+ padding: 10px;
+ color: #666;
+ font-size: 14px;
+ background: #e8f4fd;
+ margin-bottom: 10px;
+ "
+ >
鍏� {{ printData.length }} 鏉℃暟鎹緟鎵撳嵃
</div>
- <div v-for="(item, index) in printData"
- :key="index"
- class="print-page">
+ <div
+ v-for="(item, index) in printData"
+ :key="index"
+ class="print-page"
+ >
<div class="delivery-note">
<div class="header">
<div class="document-title">闆跺敭鍙戣揣鍗�</div>
@@ -816,40 +955,43 @@
<div class="table-section">
<table class="product-table">
<thead>
- <tr>
- <th>浜у搧鍚嶇О</th>
- <th>瑙勬牸鍨嬪彿</th>
- <th>鍗曚綅</th>
- <th>鍗曚环</th>
- <th>闆跺敭鏁伴噺</th>
- <th>闆跺敭閲戦</th>
- </tr>
+ <tr>
+ <th>浜у搧鍚嶇О</th>
+ <th>瑙勬牸鍨嬪彿</th>
+ <th>鍗曚綅</th>
+ <th>鍗曚环</th>
+ <th>闆跺敭鏁伴噺</th>
+ <th>闆跺敭閲戦</th>
+ </tr>
</thead>
<tbody>
- <tr v-for="product in item.products"
- :key="product.id">
- <td>{{ product.productCategory || '' }}</td>
- <td>{{ product.specificationModel || '' }}</td>
- <td>{{ product.unit || '' }}</td>
- <td>{{ product.taxInclusiveUnitPrice || '0' }}</td>
- <td>{{ product.quantity || '0' }}</td>
- <td>{{ product.taxInclusiveTotalPrice || '0' }}</td>
- </tr>
- <tr v-if="!item.products || item.products.length === 0">
- <td colspan="6"
- style="text-align: center; color: #999;">鏆傛棤浜у搧鏁版嵁
- </td>
- </tr>
+ <tr v-for="product in item.products" :key="product.id">
+ <td>{{ product.productCategory || "" }}</td>
+ <td>{{ product.specificationModel || "" }}</td>
+ <td>{{ product.unit || "" }}</td>
+ <td>{{ product.taxInclusiveUnitPrice || "0" }}</td>
+ <td>{{ product.quantity || "0" }}</td>
+ <td>{{ product.taxInclusiveTotalPrice || "0" }}</td>
+ </tr>
+ <tr v-if="!item.products || item.products.length === 0">
+ <td colspan="6" style="text-align: center; color: #999">
+ 鏆傛棤浜у搧鏁版嵁
+ </td>
+ </tr>
</tbody>
<tfoot>
- <tr>
- <td class="label">鍚堣</td>
- <td class="total-value"></td>
- <td class="total-value"></td>
- <td class="total-value"></td>
- <td class="total-value">{{ getTotalQuantity(item.products) }}</td>
- <td class="total-value">{{ getTotalAmount(item.products) }}</td>
- </tr>
+ <tr>
+ <td class="label">鍚堣</td>
+ <td class="total-value"></td>
+ <td class="total-value"></td>
+ <td class="total-value"></td>
+ <td class="total-value">
+ {{ getTotalQuantity(item.products) }}
+ </td>
+ <td class="total-value">
+ {{ getTotalAmount(item.products) }}
+ </td>
+ </tr>
</tfoot>
</table>
</div>
@@ -871,7 +1013,9 @@
<div class="footer-row">
<div class="footer-item">
<span class="label">鎿嶄綔鍛橈細</span>
- <span class="value">{{ userStore.nickName || '鎾曞紑鍓�' }}</span>
+ <span class="value">{{
+ userStore.nickName || "鎾曞紑鍓�"
+ }}</span>
</div>
<div class="footer-item">
<span class="label">鎵撳嵃鏃ユ湡锛�</span>
@@ -885,61 +1029,127 @@
</div>
</el-dialog>
<!-- 鍙戣揣寮规 -->
- <el-dialog v-model="deliveryFormVisible"
- title="鍙戣揣淇℃伅"
- width="40%"
- @close="closeDeliveryDia">
- <el-form :model="deliveryForm"
- label-width="120px"
- label-position="top"
- :rules="deliveryRules"
- ref="deliveryFormRef">
+ <el-dialog
+ v-model="deliveryFormVisible"
+ title="鍙戣揣淇℃伅"
+ width="40%"
+ @close="closeDeliveryDia"
+ >
+ <el-form
+ :model="deliveryForm"
+ label-width="120px"
+ label-position="top"
+ :rules="deliveryRules"
+ ref="deliveryFormRef"
+ >
<el-row :gutter="30">
<el-col :span="24">
- <el-form-item label="鍙戣揣绫诲瀷锛�"
- prop="type">
- <el-select v-model="deliveryForm.type"
- placeholder="璇烽�夋嫨鍙戣揣绫诲瀷"
- style="width: 100%">
- <el-option label="璐ц溅"
- value="璐ц溅"/>
- <el-option label="蹇��"
- value="蹇��"/>
+ <el-form-item label="鍙戣揣绫诲瀷锛�" prop="type">
+ <el-select
+ v-model="deliveryForm.type"
+ placeholder="璇烽�夋嫨鍙戣揣绫诲瀷"
+ style="width: 100%"
+ @change="handleDeliveryTypeChange"
+ >
+ <el-option label="璐ц溅" value="璐ц溅" />
+ <el-option label="蹇��" value="蹇��" />
</el-select>
+ </el-form-item>
+ </el-col>
+ <el-col :span="24">
+ <el-form-item label="寰呭彂璐ф暟閲忥細">
+ <el-input
+ :model-value="currentDeliveryRow?.noQuantity"
+ disabled
+ />
+ </el-form-item>
+ </el-col>
+ </el-row>
+ <el-row :gutter="30">
+ <el-col :span="24" v-if="deliveryForm.type === '璐ц溅'">
+ <el-form-item label="鍙戣揣杞︾墝鍙凤細" prop="shippingCarNumber">
+ <el-input
+ v-model="deliveryForm.shippingCarNumber"
+ placeholder="璇疯緭鍏ュ彂璐ц溅鐗屽彿"
+ clearable
+ />
+ </el-form-item>
+ </el-col>
+ <el-col :span="24" v-else>
+ <el-form-item label="蹇�掑叕鍙革細" prop="expressCompany">
+ <el-input
+ v-model="deliveryForm.expressCompany"
+ placeholder="璇疯緭鍏ュ揩閫掑叕鍙�"
+ clearable
+ />
+ </el-form-item>
+ </el-col>
+ </el-row>
+ <el-row :gutter="30" v-if="deliveryForm.type === '蹇��'">
+ <el-col :span="24">
+ <el-form-item label="蹇�掑崟鍙凤細" prop="expressNumber">
+ <el-input
+ v-model="deliveryForm.expressNumber"
+ placeholder="璇疯緭鍏ュ揩閫掑崟鍙�"
+ clearable
+ />
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="30">
<el-col :span="24">
- <el-form-item label="鎵瑰彿锛�"
- prop="batchNo">
- <el-table :data="deliveryForm.batchNoList"
- border
- size="small"
- max-height="260"
- style="width: 100%;">
- <el-table-column label="鎵瑰彿"
- prop="batchNo"
- min-width="180"/>
- <el-table-column label="鏁伴噺"
- min-width="120"
- align="center">
+ <el-form-item label="鍙戣揣鍥剧墖锛�">
+ <ImageUpload v-model:file-list="deliveryFileList" :limit="9" />
+ </el-form-item>
+ </el-col>
+ </el-row>
+ <el-row :gutter="30">
+ <el-col :span="24">
+ <el-form-item label="搴撳瓨锛�" prop="batchNo">
+ <el-table
+ :data="deliveryForm.batchNoList"
+ border
+ size="small"
+ max-height="260"
+ style="width: 100%"
+ >
+ <el-table-column label="鎵瑰彿" prop="batchNo" min-width="180" />
+ <el-table-column
+ label="浜у搧澶х被"
+ prop="productName"
+ min-width="100"
+ />
+ <el-table-column
+ label="瑙勬牸鍨嬪彿"
+ prop="model"
+ min-width="100"
+ />
+ <el-table-column label="鍗曚綅" prop="unit" min-width="100" />
+ <el-table-column
+ label="搴撳瓨鏁伴噺"
+ min-width="120"
+ align="center"
+ >
<template #default="scope">
{{ getDeliveryBatchQuantity(scope.row) }}
</template>
</el-table-column>
- <el-table-column label="鍙戣揣鏁伴噺"
- min-width="160"
- align="center">
+ <el-table-column
+ label="鍙戣揣鏁伴噺"
+ min-width="160"
+ align="center"
+ >
<template #default="scope">
- <el-input-number v-model="scope.row.deliveryQuantity"
- :min="0"
- :max="getDeliveryBatchDeliveryMax(scope.row)"
- :precision="2"
- :step="0.01"
- controls-position="right"
- @change="handleDeliveryBatchQuantityChange(scope.row)"
- style="width: 100%;"/>
+ <el-input-number
+ v-model="scope.row.deliveryQuantity"
+ :min="0"
+ :max="getDeliveryBatchDeliveryMax(scope.row)"
+ :precision="2"
+ :step="0.01"
+ controls-position="right"
+ @change="handleDeliveryBatchQuantityChange(scope.row)"
+ style="width: 100%"
+ />
</template>
</el-table-column>
</el-table>
@@ -949,8 +1159,8 @@
</el-form>
<template #footer>
<div class="dialog-footer">
- <el-button type="primary"
- @click="submitDelivery">纭鍙戣揣
+ <el-button type="primary" @click="submitDelivery"
+ >纭鍙戣揣
</el-button>
<el-button @click="closeDeliveryDia">鍙栨秷</el-button>
</div>
@@ -960,15 +1170,15 @@
</template>
<script setup>
-import {getToken} from "@/utils/auth";
+import { getToken } from "@/utils/auth";
import pagination from "@/components/PIMTable/Pagination.vue";
-import {onMounted, ref, getCurrentInstance} from "vue";
-import {addShippingInfo} from "@/api/salesManagement/deliveryLedger.js";
-import {ElMessageBox, ElMessage} from "element-plus";
+import { onMounted, ref, getCurrentInstance } from "vue";
+import { addShippingInfo } from "@/api/salesManagement/deliveryLedger.js";
+import { ElMessageBox, ElMessage } from "element-plus";
import useUserStore from "@/store/modules/user";
-import {userListNoPage} from "@/api/system/user.js";
+import { userListNoPage } from "@/api/system/user.js";
import FormDialog from "@/components/Dialog/FormDialog.vue";
-import {getQuotationList} from "@/api/salesManagement/salesQuotation.js";
+import { getQuotationList } from "@/api/salesManagement/salesQuotation.js";
import {
ledgerListPage,
productList,
@@ -981,21 +1191,24 @@
delLedgerFile,
getProductInventory,
} from "@/api/salesManagement/salesLedger.js";
-import {getStockInventoryByModelId} from "@/api/inventoryManagement/stockInventory.js";
-import {modelList, productTreeList} from "@/api/basicData/product.js";
+import { getStockInventoryByModelId } from "@/api/inventoryManagement/stockInventory.js";
+import { modelList, productTreeList } from "@/api/basicData/product.js";
import useFormData from "@/hooks/useFormData.js";
import dayjs from "dayjs";
-import {getCurrentDate} from "@/utils/index.js";
-import {useRouter, useRoute} from "vue-router";
-import {listCustomerPrivatePool} from "@/api/basicData/customerFile.js";
import FileUpload from "@/components/AttachmentUpload/file/index.vue";
+import ImageUpload from "@/components/AttachmentUpload/image/index.vue";
+import { getCurrentDate } from "@/utils/index.js";
+import { listCustomer } from "@/api/basicData/customer.js";
-const FileList = defineAsyncComponent(() => import("@/components/Dialog/FileList.vue"));
+const FileList = defineAsyncComponent(() =>
+ import("@/components/Dialog/FileList.vue")
+);
const router = useRouter();
const route = useRoute();
const userStore = useUserStore();
-const {proxy} = getCurrentInstance();
+const { proxy } = getCurrentInstance();
+const { tax_rate } = proxy.useDict("tax_rate");
const tableData = ref([]);
const productData = ref([]);
const selectedRows = ref([]);
@@ -1011,6 +1224,7 @@
});
const total = ref(0);
const fileList = ref([]);
+const deliveryFileList = ref([]);
// 鐢ㄦ埛淇℃伅琛ㄥ崟寮规鏁版嵁
const operationType = ref("");
@@ -1025,6 +1239,7 @@
},
form: {
salesContractNo: "",
+ autoGenerateContractNo: true,
salesman: "",
customerId: "",
entryPerson: "",
@@ -1034,18 +1249,19 @@
productData: [],
executionDate: "",
hasProductionRecord: false,
+ createTime: "",
},
rules: {
- salesman: [{required: true, message: "璇烽�夋嫨", trigger: "change"}],
- customerId: [{required: true, message: "璇烽�夋嫨", trigger: "change"}],
- entryPerson: [{required: true, message: "璇烽�夋嫨", trigger: "change"}],
- entryDate: [{required: true, message: "璇烽�夋嫨", trigger: "change"}],
- deliveryDate: [{required: true, message: "璇烽�夋嫨", trigger: "change"}],
- executionDate: [{required: true, message: "璇烽�夋嫨", trigger: "change"}],
+ salesman: [{ required: true, message: "璇烽�夋嫨", trigger: "change" }],
+ customerId: [{ required: true, message: "璇烽�夋嫨", trigger: "change" }],
+ entryPerson: [{ required: true, message: "璇烽�夋嫨", trigger: "change" }],
+ entryDate: [{ required: true, message: "璇烽�夋嫨", trigger: "change" }],
+ deliveryDate: [{ required: true, message: "璇烽�夋嫨", trigger: "change" }],
+ executionDate: [{ required: true, message: "璇烽�夋嫨", trigger: "change" }],
},
});
-const {form, rules} = toRefs(data);
-const {form: searchForm} = useFormData(data.searchForm);
+const { form, rules } = toRefs(data);
+const { form: searchForm } = useFormData(data.searchForm);
// 浜у搧琛ㄥ崟寮规鏁版嵁
const productFormVisible = ref(false);
const productOperationType = ref("");
@@ -1064,28 +1280,28 @@
isProduction: false,
},
productRules: {
- productCategory: [{required: true, message: "璇烽�夋嫨", trigger: "change"}],
- productModelId: [{required: true, message: "璇烽�夋嫨", trigger: "change"}],
+ productCategory: [{ required: true, message: "璇烽�夋嫨", trigger: "change" }],
+ productModelId: [{ required: true, message: "璇烽�夋嫨", trigger: "change" }],
specificationModel: [
- {required: true, message: "璇烽�夋嫨", trigger: "change"},
+ { required: true, message: "璇烽�夋嫨", trigger: "change" },
],
- unit: [{required: true, message: "璇疯緭鍏�", trigger: "blur"}],
- quantity: [{required: true, message: "璇疯緭鍏�", trigger: "blur"}],
+ 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"}],
+ taxRate: [{ 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"}],
- isProduction: [{required: true, message: "璇烽�夋嫨", trigger: "change"}],
+ invoiceType: [{ required: true, message: "璇烽�夋嫨", trigger: "change" }],
+ isProduction: [{ required: true, message: "璇烽�夋嫨", trigger: "change" }],
},
});
-const {productForm, productRules} = toRefs(productFormData);
+const { productForm, productRules } = toRefs(productFormData);
// 闃叉寰幆璁$畻鐨勬爣蹇�
const isCalculating = ref(false);
// 鎵撳嵃鐩稿叧
@@ -1111,74 +1327,114 @@
// 鍙戣揣鐩稿叧
const deliveryFormVisible = ref(false);
const currentDeliveryRow = ref(null);
-const getDeliveryBatchQuantity = item => {
- const quantity = item?.qualitity
- ?? item?.quantity
- ?? item?.unLockedQuantity
- ?? item?.qualifiedUnLockedQuantity
- ?? item?.qualifiedQuantity
- ?? item?.stockQuantity;
+const getDeliveryBatchQuantity = (item) => {
+ const quantity =
+ item?.qualitity ??
+ item?.quantity ??
+ item?.unLockedQuantity ??
+ item?.qualifiedUnLockedQuantity ??
+ item?.qualifiedQuantity ??
+ item?.stockQuantity;
return quantity ?? 0;
};
const getCurrentDeliveryRowQuantity = () => {
return Number(currentDeliveryRow.value?.noQuantity || 0);
};
-const getDeliveryBatchDeliveryMax = row => {
+const getDeliveryBatchDeliveryMax = (row) => {
const productQuantity = getCurrentDeliveryRowQuantity();
const batchQuantity = Number(getDeliveryBatchQuantity(row) || 0);
const otherBatchTotal = (deliveryForm.value.batchNoList || []).reduce(
- (sum, item) => {
- if (item?.id === row?.id) return sum;
- return sum + Number(item?.deliveryQuantity || 0);
- },
- 0
+ (sum, item) => {
+ if (item?.id === row?.id) return sum;
+ return sum + Number(item?.deliveryQuantity || 0);
+ },
+ 0
);
const remainingProductQuantity = Math.max(
- 0,
- productQuantity - otherBatchTotal
+ 0,
+ productQuantity - otherBatchTotal
);
return Math.max(0, Math.min(batchQuantity, remainingProductQuantity));
};
-const handleDeliveryBatchQuantityChange = row => {
- const max = getDeliveryBatchDeliveryMax(row);
+const handleDeliveryBatchQuantityChange = (row) => {
+ const productQuantity = getCurrentDeliveryRowQuantity();
+ const batchQuantity = Number(getDeliveryBatchQuantity(row) || 0);
+ const otherBatchTotal = (deliveryForm.value.batchNoList || []).reduce(
+ (sum, item) => {
+ if (item?.id === row?.id) return sum;
+ return sum + Number(item?.deliveryQuantity || 0);
+ },
+ 0
+ );
+ const remainingProductQuantity = Math.max(
+ 0,
+ productQuantity - otherBatchTotal
+ );
const currentValue = Number(row?.deliveryQuantity || 0);
- if (currentValue > max) {
- row.deliveryQuantity = max;
- proxy.$modal.msgWarning("鍙戣揣鏁伴噺涓嶈兘瓒呰繃杩欎釜浜у搧鐨勬暟閲�");
+
+ if (currentValue > batchQuantity) {
+ row.deliveryQuantity = batchQuantity;
+ proxy.$modal.msgWarning("鍙戣揣鏁伴噺涓嶈兘澶т簬搴撳瓨鏁伴噺");
+ } else if (currentValue > remainingProductQuantity) {
+ row.deliveryQuantity = remainingProductQuantity;
+ proxy.$modal.msgWarning("鎵�鏈夋壒娆″彂璐ф暟閲忎箣鍜屼笉鑳藉ぇ浜庡緟鍙戣揣鏁伴噺");
}
};
const getSelectedDeliveryBatchRows = () => {
return (deliveryForm.value.batchNoList || []).filter(
- item => Number(item?.deliveryQuantity || 0) > 0
+ (item) => Number(item?.deliveryQuantity || 0) > 0
);
};
-const getDeliveryBatchNoList = async productModelId => {
+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 || [];
+ ? res.data
+ : res?.data?.records || res?.data?.rows || [];
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,
- }));
+ 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) {
+ return callback(new Error("璇疯緭鍏ュ彂璐ц溅鐗屽彿"));
+ }
+ callback();
+};
+const validateDeliveryExpressCompany = (_rule, value, callback) => {
+ if (deliveryForm.value.type === "蹇��" && !value) {
+ return callback(new Error("璇疯緭鍏ュ揩閫掑叕鍙�"));
+ }
+ callback();
};
const deliveryFormData = reactive({
deliveryForm: {
+ shippingCarNumber: "",
+ expressCompany: "",
+ expressNumber: "",
type: "璐ц溅", // 璐ц溅, 蹇��
},
deliveryRules: {
- type: [{required: true, message: "璇烽�夋嫨鍙戣揣绫诲瀷", trigger: "change"}],
+ shippingCarNumber: [
+ { validator: validateDeliveryShippingCarNumber, trigger: "blur" },
+ ],
+ expressCompany: [
+ { validator: validateDeliveryExpressCompany, trigger: "blur" },
+ ],
+ type: [{ required: true, message: "璇烽�夋嫨鍙戣揣绫诲瀷", trigger: "change" }],
},
});
-const {deliveryForm, deliveryRules} = toRefs(deliveryFormData);
+const { deliveryForm, deliveryRules } = toRefs(deliveryFormData);
// 瀵煎叆鐩稿叧
const importUploadRef = ref(null);
@@ -1186,9 +1442,9 @@
title: "瀵煎叆閿�鍞彴璐�",
open: false,
url: import.meta.env.VITE_APP_BASE_API + "/sales/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) {
@@ -1228,7 +1484,7 @@
},
});
-const changeDaterange = value => {
+const changeDaterange = (value) => {
if (value) {
searchForm.entryDateStart = dayjs(value[0]).format("YYYY-MM-DD");
searchForm.entryDateEnd = dayjs(value[1]).format("YYYY-MM-DD");
@@ -1250,36 +1506,36 @@
expandedRowKeys.value = [];
getList();
};
-const paginationChange = obj => {
+const paginationChange = (obj) => {
page.current = obj.page;
page.size = obj.limit;
getList();
};
const getList = () => {
tableLoading.value = true;
- const {entryDate, ...rest} = searchForm;
+ const { entryDate, ...rest } = searchForm;
// 灏嗚寖鍥存棩鏈熷瓧娈典紶閫掔粰鍚庣
- const params = {...rest, ...page};
+ const params = { ...rest, ...page };
// 绉婚櫎褰曞叆鏃ユ湡鐨勯粯璁ゅ�艰缃紝鍙繚鐣欒寖鍥存棩鏈熷瓧娈�
delete params.entryDate;
return ledgerListPage(params)
- .then(res => {
- tableLoading.value = false;
- tableData.value = res.records;
- tableData.value.map(item => {
- item.children = [];
- });
- total.value = res.total;
- return res;
- })
- .catch(() => {
- tableLoading.value = false;
+ .then((res) => {
+ tableLoading.value = false;
+ tableData.value = res.records;
+ tableData.value.map((item) => {
+ item.children = [];
});
+ total.value = res.total;
+ return res;
+ })
+ .catch(() => {
+ tableLoading.value = false;
+ });
};
// 鑾峰彇浜у搧澶х被tree鏁版嵁
const getProductOptions = () => {
// 杩斿洖 Promise锛屼究浜庡湪缂栬緫浜у搧鏃剁瓑寰呭姞杞藉畬鎴�
- return productTreeList().then(res => {
+ return productTreeList().then((res) => {
productOptions.value = convertIdToValue(res);
return productOptions.value;
});
@@ -1290,53 +1546,53 @@
}
return parseFloat(cellValue).toFixed(2);
};
-const findLedgerRecordByRow = row => {
+const findLedgerRecordByRow = (row) => {
if (!row) return null;
if (
- row.maintainer !== undefined ||
- row.maintainerName !== undefined ||
- row.entryPerson !== undefined ||
- row.entryPersonName !== undefined
+ row.maintainer !== undefined ||
+ row.maintainerName !== undefined ||
+ row.entryPerson !== undefined ||
+ row.entryPersonName !== undefined
) {
return row;
}
if (row.salesLedgerId !== undefined && row.salesLedgerId !== null) {
return (
- tableData.value.find(
- item => String(item.id) === String(row.salesLedgerId)
- ) || null
+ tableData.value.find(
+ (item) => String(item.id) === String(row.salesLedgerId)
+ ) || null
);
}
return null;
};
-const isCurrentUserMaintainer = row => {
+const isCurrentUserMaintainer = (row) => {
const ledgerRecord = findLedgerRecordByRow(row);
if (!ledgerRecord) return true;
const currentUserId = String(userStore.id ?? "");
const currentNickName = String(userStore.nickName ?? "").trim();
const maintainerId = ledgerRecord.maintainerId ?? ledgerRecord.entryPerson;
const maintainerName =
- ledgerRecord.maintainerName ??
- ledgerRecord.maintainer ??
- ledgerRecord.entryPersonName;
+ ledgerRecord.maintainerName ??
+ ledgerRecord.maintainer ??
+ ledgerRecord.entryPersonName;
if (
- maintainerId !== undefined &&
- maintainerId !== null &&
- String(maintainerId) !== ""
+ maintainerId !== undefined &&
+ maintainerId !== null &&
+ String(maintainerId) !== ""
) {
return String(maintainerId) === currentUserId;
}
if (
- maintainerName !== undefined &&
- maintainerName !== null &&
- String(maintainerName).trim() !== ""
+ maintainerName !== undefined &&
+ maintainerName !== null &&
+ String(maintainerName).trim() !== ""
) {
return String(maintainerName).trim() === currentNickName;
}
return true;
};
-const canEditLedger = row => isCurrentUserMaintainer(row);
-const canDeleteLedger = row => isCurrentUserMaintainer(row);
+const canEditLedger = (row) => isCurrentUserMaintainer(row);
+const canDeleteLedger = (row) => isCurrentUserMaintainer(row);
const sensitiveAmountFormatter = (row, column, cellValue) => {
if (!isCurrentUserMaintainer(row)) {
return "*****";
@@ -1344,14 +1600,14 @@
return formattedNumber(row, column, cellValue);
};
// 鑾峰彇tree瀛愭暟鎹�
-const getModels = value => {
+const getModels = (value) => {
productForm.value.productCategory = findNodeById(productOptions.value, value);
- modelList({id: value}).then(res => {
+ modelList({ id: value }).then((res) => {
modelOptions.value = res;
});
};
-const getProductModel = value => {
- const index = modelOptions.value.findIndex(item => item.id === value);
+const getProductModel = (value) => {
+ const index = modelOptions.value.findIndex((item) => item.id === value);
if (index !== -1) {
productForm.value.specificationModel = modelOptions.value[index].model;
productForm.value.unit = modelOptions.value[index].unit;
@@ -1376,8 +1632,8 @@
};
function convertIdToValue(data) {
- return data.map(item => {
- const {id, children, ...rest} = item;
+ return data.map((item) => {
+ const { id, children, ...rest } = item;
const newItem = {
...rest,
value: id, // 灏� id 鏀逛负 value
@@ -1405,12 +1661,12 @@
}
// 琛ㄦ牸閫夋嫨鏁版嵁
-const handleSelectionChange = selection => {
+const handleSelectionChange = (selection) => {
// 杩囨护鎺夊瓙鏁版嵁
- selectedRows.value = selection.filter(item => item.children !== undefined);
+ selectedRows.value = selection.filter((item) => item.children !== undefined);
console.log("selection", selectedRows.value);
};
-const productSelected = selectedRows => {
+const productSelected = (selectedRows) => {
productSelectedRows.value = selectedRows;
};
const expandedRowKeys = ref([]);
@@ -1419,8 +1675,8 @@
if (expandedRows.length > 0) {
expandedRowKeys.value = [];
try {
- productList({salesLedgerId: row.id, type: 1}).then(res => {
- const index = tableData.value.findIndex(item => item.id === row.id);
+ productList({ salesLedgerId: row.id, type: 1 }).then((res) => {
+ const index = tableData.value.findIndex((item) => item.id === row.id);
if (index > -1) {
tableData.value[index].children = res.data;
}
@@ -1435,7 +1691,7 @@
};
// 娣诲姞琛ㄨ绫诲悕鏂规硶
-const tableRowClassName = ({row}) => {
+const tableRowClassName = ({ row }) => {
if (!row.deliveryDate) return "";
if (row.isFh) return "";
@@ -1451,7 +1707,7 @@
}
};
// 涓昏〃鍚堣鏂规硶
-const summarizeMainTable = param => {
+const summarizeMainTable = (param) => {
return proxy.summarizeTable(param, [
"contractAmount",
"taxInclusiveTotalPrice",
@@ -1461,17 +1717,17 @@
// 瀛愯〃鍚堣鏂规硶
const summarizeChildrenTable = (param, parentRow) => {
if (!isCurrentUserMaintainer(parentRow)) {
- const {columns} = param;
+ const { columns } = param;
return columns.map((column, index) => {
if (index === 0) {
return "鍚堣";
}
if (
- [
- "taxInclusiveUnitPrice",
- "taxInclusiveTotalPrice",
- "taxExclusiveTotalPrice",
- ].includes(column.property)
+ [
+ "taxInclusiveUnitPrice",
+ "taxInclusiveTotalPrice",
+ "taxExclusiveTotalPrice",
+ ].includes(column.property)
) {
return "*****";
}
@@ -1496,7 +1752,7 @@
selectedQuotation.value = null;
let userLists = await userListNoPage();
userList.value = userLists.data;
- listCustomerPrivatePool({current: -1, size: -1}).then(res => {
+ listCustomer({ current: -1, size: -1, type: 0 }).then((res) => {
customerOption.value = res.data.records;
});
form.value.entryPerson = userStore.id;
@@ -1505,13 +1761,19 @@
form.value.entryDate = getCurrentDate();
// 绛捐鏃ユ湡榛樿涓哄綋澶�
form.value.executionDate = getCurrentDate();
+ // 鍒涘缓鏃堕棿榛樿涓哄綋澶�
+ form.value.createTime = dayjs().format("YYYY-MM-DD HH:mm:ss");
+ // 榛樿鑷姩鐢熸垚閿�鍞悎鍚屽彿
+ form.value.autoGenerateContractNo = true;
} else {
currentId.value = row.id;
- getSalesLedgerWithProducts({id: row.id, type: 1}).then(res => {
- form.value = {...res};
+ getSalesLedgerWithProducts({ id: row.id, type: 1 }).then((res) => {
+ form.value = { ...res };
form.value.entryPerson = Number(res.entryPerson);
productData.value = form.value.productData;
fileList.value = form.value.storageBlobVOs;
+ // 缂栬緫鏃惰缃嚜鍔ㄧ敓鎴愪负false锛屽厑璁告墜鍔ㄤ慨鏀�
+ form.value.autoGenerateContractNo = false;
});
}
// let userAll = await userStore.getInfo()
@@ -1533,7 +1795,7 @@
// 鍏堢‘淇濆鎴峰垪琛ㄥ凡鍔犺浇锛屼究浜庡悗缁洖濉� customerId
if (!customerOption.value || customerOption.value.length === 0) {
try {
- listCustomerPrivatePool({current: -1, size: -1}).then(res => {
+ listCustomer({ current: -1, size: -1 }).then((res) => {
customerOption.value = res.data.records;
});
} catch (e) {
@@ -1569,14 +1831,14 @@
};
// 鎶ヤ环鍗曞脊妗嗗垎椤靛垏鎹�
-const quotationPaginationChange = obj => {
+const quotationPaginationChange = (obj) => {
quotationPage.current = obj.page;
quotationPage.size = obj.limit;
fetchQuotationList();
};
// 閫変腑鎶ヤ环鍗曞悗鍥炲~鍒板彴璐﹁〃鍗�
-const applyQuotation = row => {
+const applyQuotation = (row) => {
if (!row) return;
selectedQuotation.value = row;
@@ -1585,12 +1847,12 @@
// 瀹㈡埛鍚嶇О -> customerId
const qCustomerName = String(row.customer || "").trim();
- const customer = (customerOption.value || []).find(c => {
+ const customer = (customerOption.value || []).find((c) => {
const name = String(c.customerName || "").trim();
return (
- name === qCustomerName ||
- name.includes(qCustomerName) ||
- qCustomerName.includes(name)
+ name === qCustomerName ||
+ name.includes(qCustomerName) ||
+ qCustomerName.includes(name)
);
});
if (customer?.id) {
@@ -1602,14 +1864,14 @@
// 浜у搧淇℃伅鏄犲皠锛氭姤浠� products -> 鍙拌处 productData
const products = Array.isArray(row.products) ? row.products : [];
- productData.value = products.map(p => {
+ productData.value = products.map((p) => {
const quantity = Number(p.quantity ?? 0) || 0;
const unitPrice = Number(p.unitPrice ?? 0) || 0;
const taxRate = "13"; // 榛樿 13%锛屼究浜庣洿鎺ユ彁浜わ紙濡傞渶鍙湪浜у搧涓嚜琛屼慨鏀癸級
const taxInclusiveTotalPrice = (unitPrice * quantity).toFixed(2);
const taxExclusiveTotalPrice = proxy.calculateTaxExclusiveTotalPrice(
- taxInclusiveTotalPrice,
- taxRate
+ taxInclusiveTotalPrice,
+ taxRate
);
return {
// 鍙拌处瀛楁
@@ -1623,6 +1885,8 @@
taxExclusiveTotalPrice: taxExclusiveTotalPrice,
invoiceType: "澧炴櫘绁�",
isProduction: true,
+ productId: p.productId,
+ productModelId: p.productModelId,
};
});
@@ -1635,7 +1899,7 @@
// 鎻愪氦琛ㄥ崟
const submitForm = () => {
- proxy.$refs["formRef"].validate(valid => {
+ proxy.$refs["formRef"].validate((valid) => {
if (valid) {
console.log("productData.value--", productData.value);
if (productData.value !== null && productData.value.length > 0) {
@@ -1646,7 +1910,10 @@
}
form.value.storageBlobDTOs = fileList;
form.value.type = 1;
- addOrUpdateSalesLedger(form.value).then(res => {
+ if (form.value.autoGenerateContractNo) {
+ form.value.salesContractNo = "";
+ }
+ addOrUpdateSalesLedger(form.value).then((res) => {
proxy.$modal.msgSuccess("鎻愪氦鎴愬姛");
closeDia();
expandedRowKeys.value = [];
@@ -1677,24 +1944,24 @@
}
proxy.resetForm("productFormRef");
if (type === "edit") {
- productForm.value = {...row};
+ productForm.value = { ...row };
productIndex.value = index;
// 缂栬緫鏃舵牴鎹骇鍝佸ぇ绫诲悕绉板弽鏌� tree 鑺傜偣 id锛屽苟鍔犺浇瑙勬牸鍨嬪彿鍒楄〃
try {
const options =
- productOptions.value && productOptions.value.length > 0
- ? productOptions.value
- : await getProductOptions();
+ productOptions.value && productOptions.value.length > 0
+ ? productOptions.value
+ : await getProductOptions();
const categoryId = findNodeIdByLabel(
- options,
- productForm.value.productCategory
+ options,
+ productForm.value.productCategory
);
if (categoryId) {
- const models = await modelList({id: categoryId});
+ const models = await modelList({ id: categoryId });
modelOptions.value = models || [];
// 鏍规嵁褰撳墠瑙勬牸鍨嬪彿鍚嶇О鍙嶆煡骞惰缃� productModelId锛屼究浜庝笅鎷夋鏄剧ず宸查�夊��
const currentModel = (modelOptions.value || []).find(
- m => m.model === productForm.value.specificationModel
+ (m) => m.model === productForm.value.specificationModel
);
if (currentModel) {
productForm.value.productModelId = currentModel.id;
@@ -1711,15 +1978,15 @@
};
// 鎻愪氦浜у搧琛ㄥ崟
const submitProduct = () => {
- proxy.$refs["productFormRef"].validate(valid => {
+ proxy.$refs["productFormRef"].validate((valid) => {
if (valid) {
if (operationType.value === "edit") {
submitProductEdit();
} else {
if (productOperationType.value === "add") {
- productData.value.push({...productForm.value});
+ productData.value.push({ ...productForm.value });
} else {
- productData.value[productIndex.value] = {...productForm.value};
+ productData.value[productIndex.value] = { ...productForm.value };
}
closeProductDia();
}
@@ -1729,10 +1996,10 @@
const submitProductEdit = () => {
productForm.value.salesLedgerId = currentId.value;
productForm.value.type = 1;
- addOrUpdateSalesLedgerProduct(productForm.value).then(res => {
+ addOrUpdateSalesLedgerProduct(productForm.value).then((res) => {
proxy.$modal.msgSuccess("鎻愪氦鎴愬姛");
closeProductDia();
- getSalesLedgerWithProducts({id: currentId.value, type: 1}).then(res => {
+ getSalesLedgerWithProducts({ id: currentId.value, type: 1 }).then((res) => {
productData.value = res.productData;
});
});
@@ -1745,47 +2012,49 @@
}
// 妫�鏌ユ槸鍚︽湁宸插彂璐ф垨瀹℃牳閫氳繃鐨勪骇鍝�
- const shippedProducts = productSelectedRows.value.filter(row =>
- isProductShipped(row)
+ const shippedProducts = productSelectedRows.value.filter((row) =>
+ isProductShipped(row)
);
if (shippedProducts.length > 0) {
proxy.$modal.msgWarning("宸插彂璐ф垨瀹℃牳閫氳繃鐨勪骇鍝佷笉鑳藉垹闄�");
return;
}
+ // 妫�鏌ユ槸鍚﹀彧鍓╀竴鏉℃暟鎹紝閿�鍞彴璐﹁嚦灏戜繚鐣欎竴鏉′骇鍝�
+ if (productData.value.length <= 1) {
+ 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) {
- ids = productSelectedRows.value.map(item => item.id);
+ ids = productSelectedRows.value.map((item) => item.id);
}
ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚垹闄わ紝鏄惁纭鍒犻櫎锛�", "瀵煎嚭", {
confirmButtonText: "纭",
cancelButtonText: "鍙栨秷",
type: "warning",
})
- .then(() => {
- delProduct(ids).then(res => {
- proxy.$modal.msgSuccess("鍒犻櫎鎴愬姛");
- closeProductDia();
- getSalesLedgerWithProducts({id: currentId.value, type: 1}).then(
- res => {
- productData.value = res.productData;
- }
- );
- });
- })
- .catch(() => {
- proxy.$modal.msg("宸插彇娑�");
+ .then(() => {
+ delProduct(ids).then((res) => {
+ proxy.$modal.msgSuccess("鍒犻櫎鎴愬姛");
+ closeProductDia();
+ getSalesLedgerWithProducts({ id: currentId.value, type: 1 }).then(
+ (res) => {
+ productData.value = res.productData;
+ }
+ );
});
+ })
+ .catch(() => {
+ proxy.$modal.msg("宸插彇娑�");
+ });
}
};
// 鍏抽棴浜у搧寮规
@@ -1820,15 +2089,15 @@
cancelButtonText: "鍙栨秷",
type: "warning",
})
- .then(() => {
- proxy.download("/sales/ledger/export", {}, "閿�鍞彴璐�.xlsx");
- })
- .catch(() => {
- proxy.$modal.msg("宸插彇娑�");
- });
+ .then(() => {
+ proxy.download("/sales/ledger/export", {}, "閿�鍞彴璐�.xlsx");
+ })
+ .catch(() => {
+ proxy.$modal.msg("宸插彇娑�");
+ });
};
/** 鍒ゆ柇鍗曚釜浜у搧鏄惁宸插彂璐э紙鏍规嵁shippingStatus鍒ゆ柇锛屽凡鍙戣揣鎴栧鏍搁�氳繃涓嶅彲缂栬緫鍜屽垹闄わ級 */
-const isProductShipped = product => {
+const isProductShipped = (product) => {
if (!product) return false;
const status = String(product.shippingStatus || "").trim();
// 濡傛灉鍙戣揣鐘舵�佹槸"宸插彂璐�"鎴�"瀹℃牳閫氳繃"锛屽垯涓嶅彲缂栬緫鍜屽垹闄�
@@ -1836,15 +2105,15 @@
};
/** 鍒ゆ柇閿�鍞鍗曚笅鏄惁瀛樺湪宸插彂璐�/鍙戣揣瀹屾垚鐨勪骇鍝侊紙涓嶅彲鍒犻櫎锛� */
-const hasShippedProducts = products => {
+const hasShippedProducts = (products) => {
if (!products || !products.length) return false;
- return products.some(p => {
+ return products.some((p) => {
const status = String(p.shippingStatus || "").trim();
// 鏈夊彂璐ф棩鏈熸垨杞︾墝鍙疯涓哄凡鍙戣揣
if (p.shippingDate || p.shippingCarNumber) return true;
// 宸茶繘琛屽彂璐с�佸彂璐у畬鎴愩�佸凡鍙戣揣 鍧囦笉鍙垹闄�
return (
- status === "宸茶繘琛屽彂璐�" || status === "鍙戣揣瀹屾垚" || status === "宸插彂璐�"
+ status === "宸茶繘琛屽彂璐�" || status === "鍙戣揣瀹屾垚" || status === "宸插彂璐�"
);
});
};
@@ -1856,22 +2125,22 @@
return;
}
const unauthorizedRows = selectedRows.value.filter(
- row => !canDeleteLedger(row)
+ (row) => !canDeleteLedger(row)
);
if (unauthorizedRows.length > 0) {
proxy.$modal.msgWarning("褰撳墠鐧诲綍鐢ㄦ埛涓嶆槸褰曞叆浜猴紝涓嶈兘鍒犻櫎璇ユ暟鎹�");
return;
}
- const ids = selectedRows.value.map(item => item.id);
+ const ids = selectedRows.value.map((item) => item.id);
// 妫�鏌ユ槸鍚︽湁宸茶繘琛屽彂璐ф垨鍙戣揣瀹屾垚鐨勯攢鍞鍗曪紝鑻ユ湁鍒欎笉鍏佽鍒犻櫎
const cannotDeleteNames = [];
for (const row of selectedRows.value) {
let products =
- row.children && row.children.length > 0 ? row.children : null;
+ row.children && row.children.length > 0 ? row.children : null;
if (!products) {
try {
- const res = await productList({salesLedgerId: row.id, type: 1});
+ const res = await productList({ salesLedgerId: row.id, type: 1 });
products = res.data || [];
} catch {
products = [];
@@ -1883,7 +2152,7 @@
}
if (cannotDeleteNames.length > 0) {
proxy.$modal.msgWarning(
- "宸茶繘琛屽彂璐ф垨鍙戣揣瀹屾垚鐨勯攢鍞鍗曚笉鑳藉垹闄わ細" + cannotDeleteNames.join("銆�")
+ "宸茶繘琛屽彂璐ф垨鍙戣揣瀹屾垚鐨勯攢鍞鍗曚笉鑳藉垹闄わ細" + cannotDeleteNames.join("銆�")
);
return;
}
@@ -1893,19 +2162,19 @@
cancelButtonText: "鍙栨秷",
type: "warning",
})
- .then(() => {
- delLedger(ids).then(res => {
- proxy.$modal.msgSuccess("鍒犻櫎鎴愬姛");
- getList();
- });
- })
- .catch(() => {
- proxy.$modal.msg("宸插彇娑�");
+ .then(() => {
+ delLedger(ids).then((res) => {
+ proxy.$modal.msgSuccess("鍒犻櫎鎴愬姛");
+ getList();
});
+ })
+ .catch(() => {
+ proxy.$modal.msg("宸插彇娑�");
+ });
};
// 鎵撳嵃鍔熻兘
-const handlePrint = async () => {
+ const handlePrint = async () => {
if (selectedRows.value.length === 0) {
proxy.$modal.msgWarning("璇烽�夋嫨瑕佹墦鍗扮殑鏁版嵁");
return;
@@ -1963,282 +2232,288 @@
// 鏋勫缓鎵撳嵃鍐呭
let printContent = `
- <!DOCTYPE html>
- <html>
- <head>
- <meta charset="UTF-8">
- <title>鎵撳嵃棰勮</title>
- <style>
- body {
- margin: 0;
- padding: 0;
- font-family: "SimSun", serif;
- background: white;
- }
- .print-page {
- width: 200mm;
- height: 75mm;
- padding: 10mm;
- padding-left: 20mm;
- background: white;
- box-sizing: border-box;
- page-break-after: always;
- page-break-inside: avoid;
- }
- .print-page:last-child {
- page-break-after: avoid;
- }
- .delivery-note {
- width: 100%;
- height: 100%;
- font-size: 12px;
- line-height: 1.2;
- display: flex;
- flex-direction: column;
- color: #000;
- }
- .header {
- text-align: center;
- margin-bottom: 8px;
- }
- .company-name {
- font-size: 18px;
- font-weight: bold;
- margin-bottom: 4px;
- }
- .document-title {
- font-size: 16px;
- font-weight: bold;
- }
- .info-section {
- margin-bottom: 8px;
- display: flex;
- justify-content: space-between;
- align-items: center;
- }
- .info-row {
- line-height: 20px;
- }
- .label {
- font-weight: bold;
- width: 60px;
- font-size: 12px;
- }
- .value {
- margin-right: 20px;
- min-width: 80px;
- font-size: 12px;
- }
- .table-section {
- margin-bottom: 40px;
- // flex: 0.6;
- }
- .product-table {
- width: 100%;
- border-collapse: collapse;
- border: 1px solid #000;
- }
- .product-table th, .product-table td {
- border: 1px solid #000;
- padding: 6px;
- text-align: center;
- font-size: 12px;
- line-height: 1.4;
- }
- .product-table th {
- font-weight: bold;
- }
- .total-value {
- font-weight: bold;
- }
- .footer-section {
- margin-top: auto;
- }
- .footer-row {
- display: flex;
- margin-bottom: 3px;
- line-height: 22px;
- justify-content: space-between;
- }
- .footer-item {
- display: flex;
- margin-right: 20px;
- }
- .footer-item .label {
- font-weight: bold;
- width: 80px;
- font-size: 12px;
- }
- .footer-item .value {
- min-width: 80px;
- font-size: 12px;
- }
- .address-item .address-value {
- min-width: 200px;
- }
- @media print {
- body {
- margin: 0;
- padding: 0;
- }
- .print-page {
- margin: 0;
- padding: 10mm;
- /* padding-left: 20mm; */
- page-break-inside: avoid;
- page-break-after: always;
- }
- .print-page:last-child {
- page-break-after: avoid;
- }
- }
- </style>
- </head>
- <body>
- `;
+ <!DOCTYPE html>
+ <html>
+ <head>
+ <meta charset="UTF-8">
+ <title>鎵撳嵃棰勮</title>
+ <style>
+ body {
+ margin: 0;
+ padding: 0;
+ font-family: "SimSun", serif;
+ background: white;
+ }
+ .print-page {
+ width: 200mm;
+ height: 75mm;
+ padding: 10mm;
+ padding-left: 20mm;
+ background: white;
+ box-sizing: border-box;
+ page-break-after: always;
+ page-break-inside: avoid;
+ }
+ .print-page:last-child {
+ page-break-after: avoid;
+ }
+ .delivery-note {
+ width: 100%;
+ height: 100%;
+ font-size: 12px;
+ line-height: 1.2;
+ display: flex;
+ flex-direction: column;
+ color: #000;
+ }
+ .header {
+ text-align: center;
+ margin-bottom: 8px;
+ }
+ .company-name {
+ font-size: 18px;
+ font-weight: bold;
+ margin-bottom: 4px;
+ }
+ .document-title {
+ font-size: 16px;
+ font-weight: bold;
+ }
+ .info-section {
+ margin-bottom: 8px;
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ }
+ .info-row {
+ line-height: 20px;
+ }
+ .label {
+ font-weight: bold;
+ width: 60px;
+ font-size: 12px;
+ }
+ .value {
+ margin-right: 20px;
+ min-width: 80px;
+ font-size: 12px;
+ }
+ .table-section {
+ margin-bottom: 40px;
+ // flex: 0.6;
+ }
+ .product-table {
+ width: 100%;
+ border-collapse: collapse;
+ border: 1px solid #000;
+ }
+ .product-table th, .product-table td {
+ border: 1px solid #000;
+ padding: 6px;
+ text-align: center;
+ font-size: 12px;
+ line-height: 1.4;
+ }
+ .product-table th {
+ font-weight: bold;
+ }
+ .total-value {
+ font-weight: bold;
+ }
+ .footer-section {
+ margin-top: auto;
+ }
+ .footer-row {
+ display: flex;
+ margin-bottom: 3px;
+ line-height: 22px;
+ justify-content: space-between;
+ }
+ .footer-item {
+ display: flex;
+ margin-right: 20px;
+ }
+ .footer-item .label {
+ font-weight: bold;
+ width: 80px;
+ font-size: 12px;
+ }
+ .footer-item .value {
+ min-width: 80px;
+ font-size: 12px;
+ }
+ .address-item .address-value {
+ min-width: 200px;
+ }
+ @media print {
+ body {
+ margin: 0;
+ padding: 0;
+ }
+ .print-page {
+ margin: 0;
+ padding: 10mm;
+ /* padding-left: 20mm; */
+ page-break-inside: avoid;
+ page-break-after: always;
+ }
+ .print-page:last-child {
+ page-break-after: avoid;
+ }
+ }
+ </style>
+ </head>
+ <body>
+ `;
// 涓烘瘡鏉℃暟鎹敓鎴愭墦鍗伴〉闈�
printData.value.forEach((item, index) => {
printContent += `
- <div class="print-page">
- <div class="delivery-note">
- <div class="header">
- <div class="document-title">闆跺敭鍙戣揣鍗�</div>
- </div>
-
- <div class="info-section">
- <div class="info-row">
- <div>
- <span class="label">鍙戣揣鏃ユ湡锛�</span>
- <span class="value">${formatDate(
- item.createTime
- )}</span>
- </div>
- <div>
- <span class="label">瀹㈡埛鍚嶇О锛�</span>
- <span class="value">${
- item.customerName
- }</span>
- </div>
- </div>
- <div class="info-row">
- <span class="label">鍗曞彿锛�</span>
- <span class="value">${
- item.salesContractNo ||
- ""
- }</span>
- </div>
- </div>
+ <div class="print-page">
+ <div class="delivery-note">
+ <div class="header">
+ <div class="document-title">闆跺敭鍙戣揣鍗�</div>
+ </div>
- <div class="table-section">
- <table class="product-table">
- <thead>
- <tr>
- <th>浜у搧鍚嶇О</th>
- <th>瑙勬牸鍨嬪彿</th>
- <th>鍗曚綅</th>
- <th>鍗曚环</th>
- <th>闆跺敭鏁伴噺</th>
- <th>闆跺敭閲戦</th>
- </tr>
- </thead>
- <tbody>
- ${
- item.products &&
- item.products
- .length > 0
- ? item.products
- .map(
- product => `
- <tr>
- <td>${
- product.productCategory ||
- ""
- }</td>
- <td>${
- product.specificationModel ||
- ""
- }</td>
- <td>${
- product.unit ||
- ""
- }</td>
- <td>${
- product.taxInclusiveUnitPrice ||
- "0"
- }</td>
- <td>${
- product.quantity ||
- "0"
- }</td>
- <td>${
- product.taxInclusiveTotalPrice ||
- "0"
- }</td>
- </tr>
- `
- )
- .join("")
- : '<tr><td colspan="6" style="text-align: center; color: #999;">鏆傛棤浜у搧鏁版嵁</td></tr>'
- }
- </tbody>
- <tfoot>
- <tr>
- <td class="label">鍚堣</td>
- <td class="total-value"></td>
- <td class="total-value"></td>
- <td class="total-value"></td>
- <td class="total-value">${getTotalQuantityForPrint(
- item.products
- )}</td>
- <td class="total-value">${getTotalAmountForPrint(
- item.products
- )}</td>
- </tr>
- </tfoot>
- </table>
- </div>
+ <div class="info-section">
+ <div class="info-row">
+ <div>
+ <span class="label">鍙戣揣鏃ユ湡锛�</span>
+ <span class="value">${formatDate(
+ item.createTime
+ )}</span>
+ </div>
+ <div>
+ <span class="label">瀹㈡埛鍚嶇О锛�</span>
+ <span class="value">${
+ item.customerName
+ }</span>
+ </div>
+ </div>
+ <div class="info-row">
+ <span class="label">鍗曞彿锛�</span>
+ <span class="value">${
+ item.salesContractNo ||
+ ""
+ }</span>
+ </div>
+ </div>
- <div class="footer-section">
- <div class="footer-row">
- <div class="footer-item">
- <span class="label">鏀惰揣鐢佃瘽锛�</span>
- <span class="value"></span>
- </div>
- <div class="footer-item">
- <span class="label">鏀惰揣浜猴細</span>
- <span class="value"></span>
- </div>
- <div class="footer-item address-item">
- <span class="label">鏀惰揣鍦板潃锛�</span>
- <span class="value address-value"></span>
- </div>
- </div>
- <div class="footer-row">
- <div class="footer-item">
- <span class="label">鎿嶄綔鍛橈細</span>
- <span class="value">${
- userStore.nickName ||
- "鎾曞紑鍓�"
- }</span>
- </div>
- <div class="footer-item">
- <span class="label">鎵撳嵃鏃ユ湡锛�</span>
- <span class="value">${formatDateTime(
- new Date()
- )}</span>
- </div>
- </div>
- </div>
- </div>
- </div>
- `;
+ <div class="table-section">
+ <table class="product-table">
+ <thead>
+ <tr>
+ <th>浜у搧鍚嶇О</th>
+ <th>瑙勬牸鍨嬪彿</th>
+ <th>鍗曚綅</th>
+ <th>鍗曚环</th>
+ <th>闆跺敭鏁伴噺</th>
+ <th>闆跺敭閲戦</th>
+ </tr>
+ </thead>
+ <tbody>
+ ${
+ item.products &&
+ item
+ .products
+ .length >
+ 0
+ ? item.products
+ .map(
+ (
+ product
+ ) => `
+ <tr>
+ <td>${
+ product.productCategory ||
+ ""
+ }</td>
+ <td>${
+ product.specificationModel ||
+ ""
+ }</td>
+ <td>${
+ product.unit ||
+ ""
+ }</td>
+ <td>${
+ product.taxInclusiveUnitPrice ||
+ "0"
+ }</td>
+ <td>${
+ product.quantity ||
+ "0"
+ }</td>
+ <td>${
+ product.taxInclusiveTotalPrice ||
+ "0"
+ }</td>
+ </tr>
+ `
+ )
+ .join(
+ ""
+ )
+ : '<tr><td colspan="6" style="text-align: center; color: #999;">鏆傛棤浜у搧鏁版嵁</td></tr>'
+ }
+ </tbody>
+ <tfoot>
+ <tr>
+ <td class="label">鍚堣</td>
+ <td class="total-value"></td>
+ <td class="total-value"></td>
+ <td class="total-value"></td>
+ <td class="total-value">${getTotalQuantityForPrint(
+ item.products
+ )}</td>
+ <td class="total-value">${getTotalAmountForPrint(
+ item.products
+ )}</td>
+ </tr>
+ </tfoot>
+ </table>
+ </div>
+
+ <div class="footer-section">
+ <div class="footer-row">
+ <div class="footer-item">
+ <span class="label">鏀惰揣鐢佃瘽锛�</span>
+ <span class="value"></span>
+ </div>
+ <div class="footer-item">
+ <span class="label">鏀惰揣浜猴細</span>
+ <span class="value"></span>
+ </div>
+ <div class="footer-item address-item">
+ <span class="label">鏀惰揣鍦板潃锛�</span>
+ <span class="value address-value"></span>
+ </div>
+ </div>
+ <div class="footer-row">
+ <div class="footer-item">
+ <span class="label">鎿嶄綔鍛橈細</span>
+ <span class="value">${
+ userStore.nickName ||
+ "鎾曞紑鍓�"
+ }</span>
+ </div>
+ <div class="footer-item">
+ <span class="label">鎵撳嵃鏃ユ湡锛�</span>
+ <span class="value">${formatDateTime(
+ new Date()
+ )}</span>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+ `;
});
printContent += `
- </body>
- </html>
- `;
+ </body>
+ </html>
+ `;
// 鍐欏叆鍐呭鍒版柊绐楀彛
printWindow.document.write(printContent);
@@ -2254,16 +2529,12 @@
};
};
// 鏍煎紡鍖栨棩鏈�
-const formatDate = dateString => {
+const formatDate = (dateString) => {
if (!dateString) return getCurrentDate();
- const date = new Date(dateString);
- const year = date.getFullYear();
- const month = String(date.getMonth() + 1).padStart(2, "0");
- const day = String(date.getDate()).padStart(2, "0");
- return `${year}/${month}/${day}`;
+ return dayjs(dateString).format("YYYY/MM/DD HH:mm:ss");
};
// 鏍煎紡鍖栨棩鏈熸椂闂�
-const formatDateTime = date => {
+const formatDateTime = (date) => {
const year = date.getFullYear();
const month = String(date.getMonth() + 1).padStart(2, "0");
const day = String(date.getDate()).padStart(2, "0");
@@ -2273,7 +2544,7 @@
return `${year}/${month}/${day} ${hours}:${minutes}:${seconds}`;
};
// 璁$畻浜у搧鎬绘暟閲�
-const getTotalQuantity = products => {
+const getTotalQuantity = (products) => {
if (!products || products.length === 0) return "0";
const total = products.reduce((sum, product) => {
return sum + (parseFloat(product.quantity) || 0);
@@ -2282,7 +2553,7 @@
};
// 璁$畻浜у搧鎬婚噾棰�
-const getTotalAmount = products => {
+const getTotalAmount = (products) => {
if (!products || products.length === 0) return "0";
const total = products.reduce((sum, product) => {
return sum + (parseFloat(product.taxInclusiveTotalPrice) || 0);
@@ -2291,7 +2562,7 @@
};
// 鐢ㄤ簬鎵撳嵃鐨勮绠楀嚱鏁�
-const getTotalQuantityForPrint = products => {
+const getTotalQuantityForPrint = (products) => {
if (!products || products.length === 0) return "0";
const total = products.reduce((sum, product) => {
return sum + (parseFloat(product.quantity) || 0);
@@ -2299,7 +2570,7 @@
return total.toFixed(2);
};
-const getTotalAmountForPrint = products => {
+const getTotalAmountForPrint = (products) => {
if (!products || products.length === 0) return "0";
const total = products.reduce((sum, product) => {
return sum + (parseFloat(product.taxInclusiveTotalPrice) || 0);
@@ -2317,17 +2588,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
+ );
}
};
@@ -2350,10 +2621,10 @@
// 濡傛灉鏈夌◣鐜囷紝璁$畻涓嶅惈绋庢�讳环
if (productForm.value.taxRate) {
productForm.value.taxExclusiveTotalPrice =
- proxy.calculateTaxExclusiveTotalPrice(
- totalPrice,
- productForm.value.taxRate
- );
+ proxy.calculateTaxExclusiveTotalPrice(
+ totalPrice,
+ productForm.value.taxRate
+ );
}
isCalculating.value = false;
@@ -2368,7 +2639,7 @@
if (isCalculating.value) return;
const exclusiveTotalPrice = parseFloat(
- productForm.value.taxExclusiveTotalPrice
+ productForm.value.taxExclusiveTotalPrice
);
const quantity = parseFloat(productForm.value.quantity);
const taxRate = parseFloat(productForm.value.taxRate);
@@ -2386,7 +2657,7 @@
// 璁$畻鍚◣鍗曚环 = 鍚◣鎬讳环 / 鏁伴噺
productForm.value.taxInclusiveUnitPrice = (
- inclusiveTotalPrice / quantity
+ inclusiveTotalPrice / quantity
).toFixed(2);
isCalculating.value = false;
@@ -2415,10 +2686,10 @@
// 濡傛灉鏈夌◣鐜囷紝璁$畻涓嶅惈绋庢�讳环
if (productForm.value.taxRate) {
productForm.value.taxExclusiveTotalPrice =
- proxy.calculateTaxExclusiveTotalPrice(
- productForm.value.taxInclusiveTotalPrice,
- productForm.value.taxRate
- );
+ proxy.calculateTaxExclusiveTotalPrice(
+ productForm.value.taxInclusiveTotalPrice,
+ productForm.value.taxRate
+ );
}
isCalculating.value = false;
@@ -2447,10 +2718,10 @@
// 濡傛灉鏈夌◣鐜囷紝璁$畻涓嶅惈绋庢�讳环
if (productForm.value.taxRate) {
productForm.value.taxExclusiveTotalPrice =
- proxy.calculateTaxExclusiveTotalPrice(
- productForm.value.taxInclusiveTotalPrice,
- productForm.value.taxRate
- );
+ proxy.calculateTaxExclusiveTotalPrice(
+ productForm.value.taxInclusiveTotalPrice,
+ productForm.value.taxRate
+ );
}
isCalculating.value = false;
@@ -2465,7 +2736,7 @@
if (isCalculating.value) return;
const inclusiveTotalPrice = parseFloat(
- productForm.value.taxInclusiveTotalPrice
+ productForm.value.taxInclusiveTotalPrice
);
const taxRate = parseFloat(productForm.value.taxRate);
@@ -2477,7 +2748,7 @@
// 璁$畻涓嶅惈绋庢�讳环
productForm.value.taxExclusiveTotalPrice =
- proxy.calculateTaxExclusiveTotalPrice(inclusiveTotalPrice, taxRate);
+ proxy.calculateTaxExclusiveTotalPrice(inclusiveTotalPrice, taxRate);
isCalculating.value = false;
};
@@ -2485,7 +2756,7 @@
* 鑾峰彇鍙戣揣鐘舵�佹枃鏈�
* @param row 琛屾暟鎹�
*/
-const getShippingStatusText = row => {
+const getShippingStatusText = (row) => {
// 濡傛灉宸插彂璐э紙鏈夊彂璐ф棩鏈熸垨杞︾墝鍙凤級锛屾樉绀�"宸插彂璐�"
// if (row.shippingDate || row.shippingCarNumber) {
// return "宸插彂璐�";
@@ -2508,6 +2779,7 @@
瀹℃牳鎷掔粷: "瀹℃牳鎷掔粷",
瀹℃牳閫氳繃: "瀹℃牳閫氳繃",
宸插彂璐�: "宸插彂璐�",
+ 閮ㄥ垎鍙戣揣: "閮ㄥ垎鍙戣揣",
};
return statusTextMap[statusStr] || "寰呭彂璐�";
};
@@ -2516,7 +2788,7 @@
* 鑾峰彇鍙戣揣鐘舵�佹爣绛剧被鍨嬶紙棰滆壊锛�
* @param row 琛屾暟鎹�
*/
-const getShippingStatusType = row => {
+const getShippingStatusType = (row) => {
// 濡傛灉宸插彂璐э紙鏈夊彂璐ф棩鏈熸垨杞︾墝鍙凤級锛屾樉绀虹豢鑹�
if (row.shippingStatus === "宸插彂璐�") {
return "success";
@@ -2539,16 +2811,17 @@
瀹℃牳鎷掔粷: "danger",
瀹℃牳閫氳繃: "success",
宸插彂璐�: "success",
+ 閮ㄥ垎鍙戣揣: "warning",
};
return typeTextMap[statusStr] || "info";
};
/**
* 鍒ゆ柇鏄惁鍙互鍙戣揣
- * 鍙湁鍦ㄤ骇鍝佺姸鎬佹槸鍏呰冻锛屽彂璐х姸鎬佹槸寰呭彂璐у拰瀹℃牳鎷掔粷鐨勬椂鍊欐墠鍙互鍙戣揣
+ * 鍙湁鍦ㄤ骇鍝佺姸鎬佹槸鍏呰冻锛屽彂璐х姸鎬佹槸寰呭彂璐с�佸鎵逛腑銆佸鏍告嫆缁濄�侀儴鍒嗗彂璐х殑鏃跺�欐墠鍙互鍙戣揣
* @param row 琛屾暟鎹�
*/
-const canShip = row => {
+const canShip = (row) => {
// 浜у搧鐘舵�佸繀椤绘槸鍏呰冻锛坅pproveStatus === 1锛�
if (row.approveStatus !== 1) {
return false;
@@ -2557,51 +2830,66 @@
// 鑾峰彇鍙戣揣鐘舵��
const shippingStatus = row.shippingStatus;
- // 濡傛灉宸插彂璐э紙鏈夊彂璐ф棩鏈熸垨杞︾墝鍙凤級锛屼笉鑳藉啀娆″彂璐�
+ // 濡傛灉宸插彂璐э紝涓嶈兘鍐嶆鍙戣揣
if (shippingStatus === "宸插彂璐�") {
return false;
}
- // 鍙戣揣鐘舵�佸繀椤绘槸"寰呭彂璐�"鎴�"瀹℃牳鎷掔粷"
+ // 鍙戣揣鐘舵�佸繀椤绘槸"寰呭彂璐�"銆�"瀹℃壒涓�"銆�"瀹℃牳鎷掔粷"鎴�"閮ㄥ垎鍙戣揣"
const statusStr = shippingStatus ? String(shippingStatus).trim() : "";
- return statusStr === "寰呭彂璐�" || statusStr === "瀹℃牳鎷掔粷";
+ return (
+ statusStr === "寰呭彂璐�" ||
+ statusStr === "瀹℃壒涓�" ||
+ statusStr === "瀹℃牳鎷掔粷" ||
+ statusStr === "閮ㄥ垎鍙戣揣"
+ );
};
// 鎵撳紑闄勪欢寮圭獥
-const recordId = ref(0)
-const fileDialogVisible = ref(false)
+const recordId = ref(0);
+const fileDialogVisible = ref(false);
// 鎵撳紑闄勪欢寮规
const openFileDialog = async (row) => {
- recordId.value = row.id
- fileDialogVisible.value = true
-}
+ recordId.value = row.id;
+ fileDialogVisible.value = true;
+};
// 鎵撳紑鍙戣揣寮规
-const openDeliveryForm = async row => {
+const openDeliveryForm = async (row) => {
// 妫�鏌ユ槸鍚﹀彲浠ュ彂璐�
if (!canShip(row)) {
proxy.$modal.msgWarning(
- "鍙湁鍦ㄤ骇鍝佺姸鎬佹槸鍏呰冻锛屽彂璐х姸鎬佹槸寰呭彂璐ф垨瀹℃牳鎷掔粷鐨勬椂鍊欐墠鍙互鍙戣揣"
+ "鍙湁鍦ㄤ骇鍝佺姸鎬佹槸鍏呰冻锛屽彂璐х姸鎬佹槸寰呭彂璐с�佸鎵逛腑銆佸鏍告嫆缁濇垨閮ㄥ垎鍙戣揣鐨勬椂鍊欐墠鍙互鍙戣揣"
);
return;
}
+ // 瀹℃壒涓椂鎻愮ず鐢ㄦ埛宸叉湁寰呭鎵圭殑鍙戣揣璁板綍
+ const statusStr = row.shippingStatus ? String(row.shippingStatus).trim() : "";
+ if (statusStr === "瀹℃壒涓�") {
+ proxy.$modal.msgWarning("璇ヤ骇鍝佸瓨鍦ㄥ緟瀹℃壒鐨勫彂璐ц褰曪紝璇锋敞鎰忛伩鍏嶉噸澶嶆彁浜�");
+ }
+
currentDeliveryRow.value = row;
const batchNoList = await getDeliveryBatchNoList(
- row.productModelId || row.modelId
+ row.productModelId || row.modelId
);
deliveryForm.value = {
+ shippingCarNumber: "",
+ expressCompany: "",
+ expressNumber: "",
type: "璐ц溅",
batchNo: [],
batchNoList,
};
+ deliveryFileList.value = [];
deliveryFormVisible.value = true;
};
// 鎻愪氦鍙戣揣琛ㄥ崟
const submitDelivery = () => {
- proxy.$refs["deliveryFormRef"].validate(valid => {
+ proxy.$refs["deliveryFormRef"].validate((valid) => {
if (valid) {
const selectedBatchRows = getSelectedDeliveryBatchRows();
if (selectedBatchRows.length === 0) {
@@ -2609,25 +2897,45 @@
return;
}
const totalDeliveryQuantity = selectedBatchRows.reduce(
- (sum, item) => sum + Number(item.deliveryQuantity || 0),
- 0
+ (sum, item) => sum + Number(item.deliveryQuantity || 0),
+ 0
);
- const currentRowQuantity = Number(currentDeliveryRow.value?.quantity || 0);
- if (currentRowQuantity > 0 && totalDeliveryQuantity > currentRowQuantity) {
- proxy.$modal.msgWarning("鎵瑰彿鍙戣揣鎬绘暟涓嶈兘瓒呰繃褰撳墠浜у搧鏁伴噺");
+ const currentRowNoQuantity = Number(
+ currentDeliveryRow.value?.noQuantity || 0
+ );
+ if (
+ currentRowNoQuantity > 0 &&
+ totalDeliveryQuantity > currentRowNoQuantity
+ ) {
+ proxy.$modal.msgWarning("鎵瑰彿鍙戣揣鎬绘暟涓嶈兘瓒呰繃寰呭彂璐ф暟閲�");
return;
}
// 淇濆瓨褰撳墠灞曞紑鐨勮ID锛屼互渚垮彂璐у悗閲嶆柊鍔犺浇瀛愯〃鏍兼暟鎹�
const currentExpandedKeys = [...expandedRowKeys.value];
const salesLedgerId = currentDeliveryRow.value.salesLedgerId;
- deliveryForm.value.batchNo = selectedBatchRows.map(item => item.id);
- const productModelId = currentDeliveryRow.value.productModelId || currentDeliveryRow.value.modelId;
+ deliveryForm.value.batchNo = selectedBatchRows.map((item) => item.id);
+ const productModelId =
+ currentDeliveryRow.value.productModelId ||
+ currentDeliveryRow.value.modelId;
addShippingInfo({
salesLedgerId: salesLedgerId,
salesLedgerProductId: currentDeliveryRow.value.id,
type: deliveryForm.value.type,
+ shippingCarNumber:
+ deliveryForm.value.type === "璐ц溅"
+ ? deliveryForm.value.shippingCarNumber
+ : "",
+ expressCompany:
+ deliveryForm.value.type === "蹇��"
+ ? deliveryForm.value.expressCompany
+ : "",
+ expressNumber:
+ deliveryForm.value.type === "蹇��"
+ ? deliveryForm.value.expressNumber
+ : "",
+ storageBlobDTOs: deliveryFileList.value || [],
batchNo: deliveryForm.value.batchNo,
- batchNoDetailList: selectedBatchRows.map(item => ({
+ batchNoDetailList: selectedBatchRows.map((item) => ({
stockInventoryId: item.id,
batchNo: item.batchNo,
quantity: Number(item.deliveryQuantity || 0),
@@ -2641,16 +2949,16 @@
// 濡傛灉涔嬪墠鏈夊睍寮�鐨勮锛岄噸鏂板姞杞借繖浜涜鐨勫瓙琛ㄦ牸鏁版嵁
if (currentExpandedKeys.length > 0) {
// 浣跨敤 Promise.all 骞惰鍔犺浇鎵�鏈夊睍寮�琛岀殑瀛愯〃鏍兼暟鎹�
- const loadPromises = currentExpandedKeys.map(ledgerId => {
- return productList({salesLedgerId: ledgerId, type: 1}).then(
- res => {
- const index = tableData.value.findIndex(
- item => item.id === ledgerId
- );
- if (index > -1) {
- tableData.value[index].children = res.data;
- }
+ const loadPromises = currentExpandedKeys.map((ledgerId) => {
+ return productList({ salesLedgerId: ledgerId, type: 1 }).then(
+ (res) => {
+ const index = tableData.value.findIndex(
+ (item) => item.id === ledgerId
+ );
+ if (index > -1) {
+ tableData.value[index].children = res.data;
}
+ }
);
});
Promise.all(loadPromises).then(() => {
@@ -2665,8 +2973,18 @@
};
// 鍏抽棴鍙戣揣寮规
+const handleDeliveryTypeChange = (val) => {
+ if (val === "璐ц溅") {
+ deliveryForm.value.expressCompany = "";
+ deliveryForm.value.expressNumber = "";
+ } else {
+ deliveryForm.value.shippingCarNumber = "";
+ }
+};
+
const closeDeliveryDia = () => {
proxy.resetForm("deliveryFormRef");
+ deliveryFileList.value = [];
deliveryFormVisible.value = false;
currentDeliveryRow.value = null;
};
@@ -2678,7 +2996,7 @@
onMounted(() => {
searchForm.salesContractNo = route.query.salesContractNo;
getList();
- userListNoPage().then(res => {
+ userListNoPage().then((res) => {
userList.value = res.data;
});
getCurrentFactoryName();
--
Gitblit v1.9.3