From 492802e4fc1b371ba21a2a490c8dcd67d7c8b29c Mon Sep 17 00:00:00 2001
From: gongchunyi <deslre0381@gmail.com>
Date: 星期一, 22 六月 2026 14:03:40 +0800
Subject: [PATCH] fix: 出差和请假审批新增开始与结束日期
---
src/views/salesManagement/salesLedger/index.vue | 2159 +++++++++++++++++++++++++++++++++++++++++++++++------------
1 files changed, 1,711 insertions(+), 448 deletions(-)
diff --git a/src/views/salesManagement/salesLedger/index.vue b/src/views/salesManagement/salesLedger/index.vue
index 3498e5c..2b907dd 100644
--- a/src/views/salesManagement/salesLedger/index.vue
+++ b/src/views/salesManagement/salesLedger/index.vue
@@ -1,393 +1,1028 @@
<template>
<div class="app-container">
- <div class="search_form">
- <el-form :model="searchForm"
- :inline="true">
- <el-form-item label="瀹㈡埛鍚嶇О锛�">
- <el-select v-model="searchForm.customerId"
- filterable
- placeholder="璇烽�夋嫨瀹㈡埛鍚嶇О"
- clearable
- style="width: 220px"
- @change="handleQuery">
- <el-option v-for="item in customerOption"
- :key="item.id"
- :label="item.customerName"
- :value="item.id">
- {{ item.customerName + "鈥斺��" + item.taxpayerIdentificationNumber }}
- </el-option>
- </el-select>
- </el-form-item>
- <el-form-item label="閿�鍞悎鍚屽彿锛�">
- <el-input v-model="searchForm.salesContractNo"
- placeholder="璇疯緭鍏�"
- clearable
- prefix-icon="Search"
- @change="handleQuery" />
- </el-form-item>
- <el-form-item label="椤圭洰鍚嶇О锛�">
- <el-input v-model="searchForm.projectName"
- placeholder="璇疯緭鍏�"
- clearable
- prefix-icon="Search"
- @change="handleQuery" />
- </el-form-item>
- <el-form-item label="浜у搧瀹�(mm)锛�">
- <el-input v-model="searchForm.width"
- placeholder="璇疯緭鍏�"
- clearable
- prefix-icon="Search"
- @change="handleQuery" />
- </el-form-item>
- <el-form-item label="浜у搧楂�(mm)锛�">
- <el-input v-model="searchForm.height"
- 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="璇烽�夋嫨"
+ <template v-if="isFormPageMode">
+ <div class="sales-ledger-page-header">
+ <div class="sales-ledger-page-header-content">
+ <div class="sales-ledger-page-title">{{ pageFormTitle }}</div>
+ <div class="sales-ledger-page-subtitle">{{ pageFormSubtitle }}</div>
+ </div>
+ <el-button class="sales-ledger-page-back"
+ @click="exitFormPage()">杩斿洖鍙拌处</el-button>
+ </div>
+ <div class="sales-ledger-page-form">
+ <el-form :model="form"
+ label-width="140px"
+ label-position="top"
+ :rules="rules"
+ @keydown.capture="handleTabScrollFollow"
+ ref="formRef">
+ <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
- @change="changeDaterange" />
- </el-form-item>
- <el-form-item label="鍙戣揣鐘舵�侊細">
- <el-select v-model="searchForm.deliveryStatus"
- placeholder="璇烽�夋嫨"
- clearable
- style="width: 140px">
- <el-option label="鏈彂璐�"
- :value="1" />
- <el-option label="瀹℃壒涓�"
- :value="2" />
- <el-option label="瀹℃壒涓嶉�氳繃"
- :value="3" />
- <el-option label="瀹℃壒閫氳繃"
- :value="4" />
- <el-option label="宸插彂璐�"
- :value="5" />
- <el-option label="閮ㄥ垎鍙戣揣"
- :value="6" />
- </el-select>
- </el-form-item>
- <el-form-item label="鍏ュ簱鐘舵�侊細">
- <el-select v-model="searchForm.stockStatus"
- placeholder="璇烽�夋嫨"
- clearable
- style="width: 140px">
- <el-option label="鏈叆搴�"
- :value="0" />
- <el-option label="閮ㄥ垎鍏ュ簱"
- :value="1" />
- <el-option label="宸插叆搴�"
- :value="2" />
- </el-select>
- </el-form-item>
- <el-form-item label="璁㈠崟鐘舵�侊細">
- <el-select v-model="searchForm.orderStatus"
- placeholder="璇烽�夋嫨"
- clearable
- style="width: 140px">
- <el-option label="杩涜涓�"
- :value="0" />
- <el-option label="宸插畬鎴�"
- :value="1" />
- </el-select>
- </el-form-item>
- <el-form-item>
- <el-button type="primary"
- @click="handleQuery"> 鎼滅储 </el-button>
- </el-form-item>
+ disabled />
+ </el-form-item>
+ </el-col>
+ <el-col :span="12">
+ <el-form-item label="涓氬姟鍛橈細"
+ prop="salesman">
+ <el-select v-model="form.salesman"
+ placeholder="璇烽�夋嫨"
+ clearable
+ :disabled="isReviewedEdit">
+ <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"
+ filterable
+ placeholder="璇烽�夋嫨"
+ clearable
+ :disabled="isReviewedEdit">
+ <el-option v-for="item in customerOption"
+ :key="item.id"
+ :label="item.customerName"
+ :value="item.id">
+ {{ item.customerName + (item.taxpayerIdentificationNumber ? "鈥斺��" + item.taxpayerIdentificationNumber : "") }}
+ </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
+ :disabled="isReviewedEdit" />
+ </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="isReviewedEdit" />
+ </el-form-item>
+ </el-col>
+ <el-col :span="12">
+ <el-form-item label="浜よ揣鏃ユ湡锛�"
+ prop="deliveryDate">
+ <el-date-picker style="width: 100%"
+ v-model="form.deliveryDate"
+ value-format="YYYY-MM-DD"
+ format="YYYY-MM-DD"
+ type="date"
+ placeholder="璇烽�夋嫨"
+ clearable
+ :disabled="isReviewedEdit" />
+ </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"
+ :disabled="isReviewedEdit">
+ <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
+ :disabled="isReviewedEdit" />
+ </el-form-item>
+ </el-col>
+ </el-row>
+ <el-row>
+ <el-form-item label="浜у搧淇℃伅锛�"
+ prop="entryDate">
+ <el-button plain
+ type="danger"
+ :disabled="isReviewedEdit"
+ @click="deleteProduct">鍒犻櫎</el-button>
+ <el-button plain
+ type="primary"
+ :disabled="isReviewedEdit"
+ @click="pinSelectedProductRow">鍥哄畾</el-button>
+ </el-form-item>
+ </el-row>
+ <el-table :data="productData"
+ border
+ class="compact-product-table"
+ @selection-change="productSelected"
+ show-summary
+ :summary-method="summarizeProductTable">
+ <el-table-column align="center"
+ type="selection"
+ width="55"
+ :selectable="(row) => !isProductShipped(row)" />
+ <el-table-column align="center"
+ label="搴忓彿"
+ type="index"
+ width="60" />
+ <el-table-column label="浜у搧澶х被"
+ prop="productCategory"
+ min-width="120">
+ <template #default="scope">
+ <el-tree-select v-if="scope.row.__editing"
+ v-model="scope.row.__productCategoryId"
+ placeholder="璇烽�夋嫨"
+ clearable
+ filterable
+ check-strictly
+ :data="productOptions"
+ :render-after-expand="false"
+ style="width: 100%"
+ :filter-node-method="filterProductCategoryNode"
+ @change="(val) => handleInlineProductCategoryChange(scope.row, val)"
+ :disabled="isReviewedEdit" />
+ <span v-else>{{ scope.row.productCategory ?? "" }}</span>
+ </template>
+ </el-table-column>
+ <el-table-column label="瑙勬牸鍨嬪彿"
+ prop="specificationModel"
+ min-width="140">
+ <template #default="scope">
+ <el-select v-if="scope.row.__editing"
+ v-model="scope.row.productModelId"
+ placeholder="璇烽�夋嫨"
+ clearable
+ filterable
+ style="width: 100%"
+ @change="(val) => handleInlineProductModelChange(scope.row, val)"
+ :disabled="isReviewedEdit">
+ <el-option v-for="item in modelOptions"
+ :key="item.id"
+ :label="item.model"
+ :value="item.id" />
+ </el-select>
+ <span v-else>{{ scope.row.specificationModel ?? "" }}</span>
+ </template>
+ </el-table-column>
+ <el-table-column label="鍘氬害(mm)"
+ prop="thickness"
+ min-width="95">
+ <template #default="scope">
+ <el-input-number :controls="false" v-if="scope.row.__editing"
+ v-model="scope.row.thickness"
+ :min="0"
+ :step="1"
+ :precision="2"
+ style="width: 100%"
+ placeholder="璇疯緭鍏�"
+ clearable
+ :disabled="isReviewedEdit" />
+ <span v-else>{{ scope.row.thickness ?? "" }}</span>
+ </template>
+ </el-table-column>
+ <el-table-column label="妤煎眰缂栧彿"
+ prop="floorCode"
+ min-width="120"
+ show-overflow-tooltip>
+ <template #default="scope">
+ <el-input v-if="scope.row.__editing"
+ v-model="scope.row.floorCode"
+ placeholder="璇疯緭鍏�"
+ clearable
+ style="width: 100%"
+ :disabled="isReviewedEdit" />
+ <span v-else>{{ scope.row.floorCode ?? "" }}</span>
+ </template>
+ </el-table-column>
+ <el-table-column label="鍚◣鍗曚环(鍏�)"
+ prop="taxInclusiveUnitPrice"
+ min-width="85">
+ <template #default="scope">
+ <el-input-number v-if="scope.row.__editing"
+ :controls="false"
+ :step="0.01"
+ :min="0"
+ :precision="2"
+ style="width: 100%"
+ v-model="scope.row.taxInclusiveUnitPrice"
+ placeholder="璇疯緭鍏�"
+ clearable
+ @change="() => handleInlineUnitPriceChange(scope.row)"
+ @input="() => handleInlineUnitPriceChange(scope.row)" />
+ <span v-else>{{ formattedNumber(null, null, scope.row.taxInclusiveUnitPrice) }}</span>
+ </template>
+ </el-table-column>
+ <el-table-column label="瀹�(mm)"
+ prop="width"
+ min-width="85">
+ <template #default="scope">
+ <el-input-number v-if="scope.row.__editing"
+ :controls="false"
+ v-model="scope.row.width"
+ :min="0"
+ :step="1"
+ :precision="2"
+ style="width:100%"
+ placeholder="璇疯緭鍏�"
+ clearable
+ @change="() => handleInlineSizeChange(scope.row)"
+ @input="() => handleInlineSizeChange(scope.row)"
+ :disabled="isReviewedEdit" />
+ <span v-else>{{ scope.row.width ?? "" }}</span>
+ </template>
+ </el-table-column>
+ <el-table-column label="楂�(mm)"
+ prop="height"
+ min-width="85">
+ <template #default="scope">
+ <el-input-number v-if="scope.row.__editing"
+ :controls="false"
+ v-model="scope.row.height"
+ :min="0"
+ :step="1"
+ :precision="2"
+ style="width: 100%"
+ placeholder="璇疯緭鍏�"
+ clearable
+ @change="() => handleInlineSizeChange(scope.row)"
+ @input="() => handleInlineSizeChange(scope.row)"
+ :disabled="isReviewedEdit" />
+ <span v-else>{{ scope.row.height ?? "" }}</span>
+ </template>
+ </el-table-column>
+ <el-table-column label="鏁伴噺"
+ prop="quantity"
+ min-width="85">
+ <template #default="scope">
+ <el-input-number :controls="false" v-if="scope.row.__editing"
+ v-model="scope.row.quantity"
+ :step="1"
+ :min="0"
+ :precision="0"
+ style="width: 100%"
+ placeholder="璇疯緭鍏�"
+ clearable
+ @change="() => handleInlineQuantityChange(scope.row)"
+ @input="() => handleInlineQuantityChange(scope.row)"
+ :disabled="isReviewedEdit" />
+ <span v-else>{{ scope.row.quantity ?? "" }}</span>
+ </template>
+ </el-table-column>
+ <el-table-column label="缁撶畻鍗曠墖闈㈢Н(銕�)"
+ prop="settlePieceArea"
+ min-width="120">
+ <template #default="scope">
+ <el-input-number :controls="false" v-if="scope.row.__editing"
+ v-model="scope.row.settlePieceArea"
+ :min="0"
+ :step="1"
+ :precision="4"
+ style="width: 100%"
+ placeholder="璇疯緭鍏�"
+ clearable
+ @change="() => handleInlineSettleAreaChange(scope.row)"
+ :disabled="isReviewedEdit" />
+ <span v-else>{{ scope.row.settlePieceArea ? Number(scope.row.settlePieceArea).toFixed(4) : "" }}</span>
+ </template>
+ </el-table-column>
+ <el-table-column label="闈㈢Н(m虏)"
+ prop="actualTotalArea"
+ min-width="110">
+ <template #default="scope">
+ <el-input-number :controls="false" v-if="scope.row.__editing"
+ v-model="scope.row.actualTotalArea"
+ :min="0"
+ :step="1"
+ :precision="4"
+ style="width: 100%"
+ placeholder="鑷姩璁$畻"
+ :disabled="isReviewedEdit" />
+ <span v-else>{{ scope.row.actualTotalArea ? Number(scope.row.actualTotalArea).toFixed(4) : "" }}</span>
+ </template>
+ </el-table-column>
+ <el-table-column label="绋庣巼(%)"
+ prop="taxRate"
+ min-width="80">
+ <template #default="scope">
+ <el-select v-if="scope.row.__editing"
+ v-model="scope.row.taxRate"
+ placeholder="璇烽�夋嫨"
+ clearable
+ style="width: 100%"
+ @change="() => handleInlineTaxRateChange(scope.row)"
+ :disabled="isReviewedEdit">
+ <el-option label="1"
+ value="1" />
+ <el-option label="3"
+ value="3" />
+ <el-option label="6"
+ value="6" />
+ <el-option label="9"
+ value="9" />
+ <el-option label="13"
+ value="13" />
+ </el-select>
+ <span v-else>{{ scope.row.taxRate ?? "" }}</span>
+ </template>
+ </el-table-column>
+ <el-table-column label="鍚◣鎬讳环(鍏�)"
+ prop="taxInclusiveTotalPrice"
+ :formatter="formattedNumber"
+ min-width="100" />
+ <el-table-column label="涓嶅惈绋庢�讳环(鍏�)"
+ prop="taxExclusiveTotalPrice"
+ :formatter="formattedNumber"
+ min-width="100" />
+ <el-table-column label="鍔犲伐瑕佹眰"
+ prop="processRequirement"
+ min-width="100"
+ show-overflow-tooltip>
+ <template #default="scope">
+ <el-input v-if="scope.row.__editing"
+ v-model="scope.row.processRequirement"
+ placeholder="璇疯緭鍏�"
+ clearable
+ style="width: 100%"
+ :disabled="isReviewedEdit" />
+ <span v-else>{{ scope.row.processRequirement ?? "" }}</span>
+ </template>
+ </el-table-column>
+ <el-table-column label="鍙戠エ绫诲瀷"
+ prop="invoiceType"
+ min-width="90">
+ <template #default="scope">
+ <el-select v-if="scope.row.__editing"
+ v-model="scope.row.invoiceType"
+ placeholder="璇烽�夋嫨"
+ clearable
+ style="width: 100%"
+ :disabled="isReviewedEdit">
+ <el-option label="澧炴櫘绁�"
+ value="澧炴櫘绁�" />
+ <el-option label="澧炰笓绁�"
+ value="澧炰笓绁�" />
+ </el-select>
+ <span v-else>{{ scope.row.invoiceType ?? "" }}</span>
+ </template>
+ </el-table-column>
+ <el-table-column label="澶囨敞"
+ prop="remark"
+ min-width="100"
+ show-overflow-tooltip>
+ <template #default="scope">
+ <el-input v-if="scope.row.__editing"
+ v-model="scope.row.remark"
+ placeholder="璇疯緭鍏�"
+ clearable
+ style="width: 100%"
+ :disabled="isReviewedEdit" />
+ <span v-else>{{ scope.row.remark ?? "" }}</span>
+ </template>
+ </el-table-column>
+ <el-table-column label="閲嶇"
+ prop="heavyBox"
+ min-width="80">
+ <template #default="scope">
+ <el-input v-if="scope.row.__editing"
+ v-model="scope.row.heavyBox"
+ placeholder="璇疯緭鍏�"
+ clearable
+ style="width: 100%"
+ :disabled="isReviewedEdit" />
+ <span v-else>{{ scope.row.heavyBox ?? "" }}</span>
+ </template>
+ </el-table-column>
+ <el-table-column fixed="right"
+ label="鎿嶄綔"
+ min-width="150"
+ align="center">
+ <template #default="scope">
+ <template v-if="scope.row.__editing">
+ <el-button link
+ type="primary"
+ size="small"
+ @click="saveProductInline(scope.row, scope.$index)">淇濆瓨</el-button>
+ <el-button link
+ type="danger"
+ size="small"
+ @click="cancelProductInline(scope.row, scope.$index)">鍙栨秷</el-button>
+ <el-popover :width="560"
+ trigger="click"
+ :hide-after="0"
+ :visible="scope.row.__otherAmountPopoverVisible"
+ @update:visible="(val) => handleOtherAmountPopoverVisibleChange(scope.row, val)">
+ <template #reference>
+ <el-button link
+ type="primary"
+ size="small"
+ @click="openOtherAmountInline(scope.row)">
+ 棰濆鍔犲伐({{ (scope.row.salesProductProcessList || []).length || 0 }})
+ </el-button>
+ </template>
+ <div style="display:flex; align-items:center; justify-content:space-between; gap: 10px; margin-bottom: 8px;">
+ <div style="font-weight: 600; color:#303133;">
+ 棰濆鍔犲伐
+ </div>
+ <el-button type="primary"
+ plain
+ size="small"
+ :disabled="isReviewedEdit"
+ @click="startAddOtherAmountForRow(scope.row)">
+ 鏂板
+ </el-button>
+ </div>
+ <div v-if="scope.row.__inlineOtherAmountAdding"
+ style="display:flex; flex-direction:column; gap: 8px; margin-bottom: 10px;"
+ @click.stop>
+ <el-select v-model="scope.row.__inlineOtherAmountAddId"
+ filterable
+ clearable
+ placeholder="璇烽�夋嫨棰濆鍔犲伐椤圭洰"
+ style="width: 100%;">
+ <el-option v-for="item in otherAmountSelectOptions"
+ :key="item.id"
+ :label="item.processName"
+ :value="item.id" />
+ </el-select>
+ <div style="display:flex; justify-content:flex-end; gap: 8px;">
+ <el-button size="small"
+ @click="scope.row.__inlineOtherAmountAdding = false; scope.row.__inlineOtherAmountAddId = null">
+ 鍙栨秷
+ </el-button>
+ <el-button type="primary"
+ size="small"
+ :disabled="isReviewedEdit || scope.row.__inlineOtherAmountAddId === null || scope.row.__inlineOtherAmountAddId === undefined || scope.row.__inlineOtherAmountAddId === ''"
+ @click="confirmAddOtherAmountForRow(scope.row)">
+ 纭娣诲姞
+ </el-button>
+ </div>
+ </div>
+ <div v-if="Array.isArray(scope.row.salesProductProcessList) && scope.row.salesProductProcessList.length > 0"
+ style="display:flex; flex-wrap:wrap; gap: 8px;">
+ <div v-for="(item, idx) in scope.row.salesProductProcessList"
+ :key="String(item.id) + '_' + idx"
+ style="display:flex; align-items:center; gap: 8px; flex: 0 0 calc(50% - 4px); max-width: calc(50% - 4px);">
+ <el-tag type="info"
+ style="max-width: 170px; overflow:hidden; text-overflow:ellipsis; white-space:nowrap;">
+ {{ item.processName }}
+ </el-tag>
+ <el-input-number :controls="false" v-model="item.quantity"
+ :min="0"
+ :step="1"
+ :precision="0"
+ style="width: 120px;"
+ placeholder="鏁伴噺"
+ :disabled="isReviewedEdit"
+ @change="handleOtherAmountQuantityChange(scope.row)" />
+ <el-button type="danger"
+ link
+ size="small"
+ :disabled="isReviewedEdit"
+ @click="removeOtherAmountAtForRow(scope.row, idx)">
+ 鍒犻櫎
+ </el-button>
+ </div>
+ </div>
+ <div v-else
+ style="color:#909399; font-size: 13px;">
+ 鏆傛棤棰濆鍔犲伐
+ </div>
+ </el-popover>
+ </template>
+ <template v-else>
+ <el-button v-if="isReviewedEdit"
+ link
+ type="primary"
+ size="small"
+ :disabled="isProductShipped(scope.row)"
+ @click="editPriceOnly(scope.row)">
+ 淇敼鍗曚环
+ </el-button>
+ <template v-if="!isReviewedEdit">
+ <el-button link
+ type="primary"
+ size="small"
+ :disabled="isProductShipped(scope.row)"
+ @click="editProductInline(scope.row, scope.$index)">
+ 缂栬緫
+ </el-button>
+ <el-button link
+ type="primary"
+ size="small"
+ :disabled="isProductShipped(scope.row)"
+ @click="copyProductInline(scope.row, scope.$index)">
+ 澶嶅埗
+ </el-button>
+ </template>
+ <el-popover :width="560"
+ trigger="click"
+ :hide-after="0"
+ :visible="scope.row.__otherAmountPopoverVisible"
+ @update:visible="(val) => handleOtherAmountPopoverVisibleChange(scope.row, val)">
+ <template #reference>
+ <el-button link
+ type="primary"
+ size="small"
+ :disabled="isProductShipped(scope.row)"
+ @click="openOtherAmountInline(scope.row)">
+ 棰濆鍔犲伐({{ (scope.row.salesProductProcessList || []).length || 0 }})
+ </el-button>
+ </template>
+ <div style="display:flex; align-items:center; justify-content:space-between; gap: 10px; margin-bottom: 8px;">
+ <div style="font-weight: 600; color:#303133;">
+ 棰濆鍔犲伐
+ </div>
+ <el-button type="primary"
+ plain
+ size="small"
+ :disabled="isProductShipped(scope.row) || isReviewedEdit"
+ @click="startAddOtherAmountForRow(scope.row)">
+ 鏂板
+ </el-button>
+ </div>
+ <div v-if="scope.row.__inlineOtherAmountAdding"
+ style="display:flex; flex-direction:column; gap: 8px; margin-bottom: 10px;"
+ @click.stop>
+ <el-select v-model="scope.row.__inlineOtherAmountAddId"
+ filterable
+ clearable
+ placeholder="璇烽�夋嫨棰濆鍔犲伐椤圭洰"
+ style="width: 100%;"
+ :disabled="isProductShipped(scope.row) || isReviewedEdit">
+ <el-option v-for="item in otherAmountSelectOptions"
+ :key="item.id"
+ :label="item.processName"
+ :value="item.id" />
+ </el-select>
+ <div style="display:flex; justify-content:flex-end; gap: 8px;">
+ <el-button size="small"
+ :disabled="isProductShipped(scope.row) || isReviewedEdit"
+ @click="scope.row.__inlineOtherAmountAdding = false; scope.row.__inlineOtherAmountAddId = null">
+ 鍙栨秷
+ </el-button>
+ <el-button type="primary"
+ size="small"
+ :disabled="isProductShipped(scope.row) || isReviewedEdit || scope.row.__inlineOtherAmountAddId === null || scope.row.__inlineOtherAmountAddId === undefined || scope.row.__inlineOtherAmountAddId === ''"
+ @click="confirmAddOtherAmountForRow(scope.row)">
+ 纭娣诲姞
+ </el-button>
+ </div>
+ </div>
+ <div v-if="Array.isArray(scope.row.salesProductProcessList) && scope.row.salesProductProcessList.length > 0"
+ style="display:flex; flex-wrap:wrap; gap: 8px;">
+ <div v-for="(item, idx) in scope.row.salesProductProcessList"
+ :key="String(item.id) + '_' + idx"
+ style="display:flex; align-items:center; gap: 8px; flex: 0 0 calc(50% - 4px); max-width: calc(50% - 4px);">
+ <el-tag type="info"
+ style="max-width: 170px; overflow:hidden; text-overflow:ellipsis; white-space:nowrap;">
+ {{ item.processName }}
+ </el-tag>
+ <el-input-number :controls="false" v-model="item.quantity"
+ :min="0"
+ :step="1"
+ :precision="0"
+ style="width: 120px;"
+ placeholder="鏁伴噺"
+ :disabled="isProductShipped(scope.row) || isReviewedEdit"
+ @change="handleOtherAmountQuantityChange(scope.row)" />
+ <el-button type="danger"
+ link
+ size="small"
+ :disabled="isProductShipped(scope.row) || isReviewedEdit"
+ @click="removeOtherAmountAtForRow(scope.row, idx)">
+ 鍒犻櫎
+ </el-button>
+ </div>
+ </div>
+ <div v-else
+ style="color:#909399; font-size: 13px;">
+ 鏆傛棤棰濆鍔犲伐
+ </div>
+ </el-popover>
+ </template>
+ </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="isReviewedEdit" />
+ </el-form-item>
+ </el-col>
+ </el-row>
+ <el-row :gutter="30">
+ <el-col :span="24">
+ <el-form-item label="瀹㈡埛澶囨敞锛�"
+ prop="customerRemarks">
+ <el-input v-model="form.customerRemarks"
+ placeholder="璇疯緭鍏�"
+ clearable
+ type="textarea"
+ :rows="2"
+ :disabled="isReviewedEdit" />
+ </el-form-item>
+ </el-col>
+ </el-row>
+ <el-row :gutter="30">
+ <el-col :span="24">
+ <el-form-item label="闄勪欢鏉愭枡锛�"
+ prop="salesLedgerFiles">
+ <el-upload v-model:file-list="fileList"
+ :action="upload.url"
+ multiple
+ ref="fileUpload"
+ auto-upload
+ :headers="upload.headers"
+ :before-upload="handleBeforeUpload"
+ :on-error="handleUploadError"
+ :on-success="handleUploadSuccess"
+ :on-remove="handleRemove">
+ <el-button type="primary">涓婁紶</el-button>
+ <template #tip>
+ <div class="el-upload__tip">
+ 鏂囦欢鏍煎紡鏀寔
+ doc锛宒ocx锛寈ls锛寈lsx锛宲pt锛宲ptx锛宲df锛宼xt锛寈ml锛宩pg锛宩peg锛宲ng锛実if锛宐mp锛宺ar锛寊ip锛�7z
+ </div>
+ </template>
+ </el-upload>
+ </el-form-item>
+ </el-col>
+ </el-row>
+ <div class="sales-ledger-page-actions">
+ <el-button type="primary" @click="submitForm">鎻愪氦</el-button>
+ </div>
+ </el-form>
+ </div>
+ </template>
+ <template v-else>
+ <div class="sales-ledger-status-bar">
+ <button v-for="tab in salesLedgerStatusTabs"
+ :key="tab.key"
+ type="button"
+ class="sales-ledger-status-tab"
+ :class="{ 'is-active': activeStatusTab === tab.key }"
+ @click="handleStatusTabChange(tab.key)">
+ {{ tab.label }}
+ </button>
+ </div>
+ <ReverseAuditHistory v-if="activeStatusTab === 'reverseReviewed'" />
+ <div v-else>
+ <div class="search_form">
+ <el-form :model="searchForm" label-width="110px">
+ <el-row :gutter="20">
+ <el-col :xs="24" :sm="12" :md="8" :lg="8">
+ <el-form-item label="瀹㈡埛鍚嶇О锛�">
+ <el-select v-model="searchForm.customerId"
+ filterable
+ placeholder="璇烽�夋嫨瀹㈡埛鍚嶇О"
+ clearable
+ style="width: 100%"
+ @change="handleQuery">
+ <el-option v-for="item in customerOption"
+ :key="item.id"
+ :label="item.customerName"
+ :value="item.id">
+ {{ item.customerName + "鈥斺��" + item.taxpayerIdentificationNumber }}
+ </el-option>
+ </el-select>
+ </el-form-item>
+ </el-col>
+ <el-col :xs="24" :sm="12" :md="8" :lg="8">
+ <el-form-item label="閿�鍞悎鍚屽彿锛�">
+ <el-input v-model="searchForm.salesContractNo"
+ placeholder="璇疯緭鍏�"
+ clearable
+ prefix-icon="Search"
+ style="width: 100%"
+ @change="handleQuery" />
+ </el-form-item>
+ </el-col>
+ <el-col :xs="24" :sm="12" :md="8" :lg="8">
+ <el-form-item label="椤圭洰鍚嶇О锛�">
+ <el-input v-model="searchForm.projectName"
+ placeholder="璇疯緭鍏�"
+ clearable
+ prefix-icon="Search"
+ style="width: 100%"
+ @change="handleQuery" />
+ </el-form-item>
+ </el-col>
+ <el-col :xs="24" :sm="12" :md="8" :lg="8">
+ <el-form-item label="褰曞叆鏃ユ湡锛�">
+ <el-date-picker v-model="searchForm.entryDate"
+ value-format="YYYY-MM-DD"
+ format="YYYY-MM-DD"
+ type="daterange"
+ placeholder="璇烽�夋嫨"
+ clearable
+ style="width: 100%"
+ @change="changeDaterange" />
+ </el-form-item>
+ </el-col>
+ <el-col :xs="24" :sm="12" :md="8" :lg="8">
+ <el-form-item label="浜у搧瀹�(mm)锛�">
+ <el-input v-model="searchForm.width"
+ placeholder="璇疯緭鍏�"
+ clearable
+ prefix-icon="Search"
+ style="width: 100%"
+ @input="val => searchForm.width = val.replace(/[^\d.]/g, '')"
+ @change="handleQuery" />
+ </el-form-item>
+ </el-col>
+ <el-col :xs="24" :sm="12" :md="8" :lg="8">
+ <el-form-item label="浜у搧楂�(mm)锛�">
+ <el-input v-model="searchForm.height"
+ placeholder="璇疯緭鍏�"
+ clearable
+ prefix-icon="Search"
+ style="width: 100%"
+ @input="val => searchForm.height = val.replace(/[^\d.]/g, '')"
+ @change="handleQuery" />
+ </el-form-item>
+ </el-col>
+ <el-col :xs="24" :sm="12" :md="8" :lg="8">
+ <el-form-item label="鍙戣揣鐘舵�侊細">
+ <el-select v-model="searchForm.deliveryStatus"
+ placeholder="璇烽�夋嫨"
+ clearable
+ style="width: 100%">
+ <el-option label="鏈彂璐�" :value="1" />
+ <el-option label="瀹℃壒涓�" :value="2" />
+ <el-option label="瀹℃壒涓嶉�氳繃" :value="3" />
+ <el-option label="瀹℃壒閫氳繃" :value="4" />
+ <el-option label="宸插彂璐�" :value="5" />
+ <el-option label="閮ㄥ垎鍙戣揣" :value="6" />
+ </el-select>
+ </el-form-item>
+ </el-col>
+ <el-col :xs="24" :sm="12" :md="8" :lg="8">
+ <el-form-item label="鍏ュ簱鐘舵�侊細">
+ <el-select v-model="searchForm.stockStatus"
+ placeholder="璇烽�夋嫨"
+ clearable
+ style="width: 100%">
+ <el-option label="鏈叆搴�" :value="0" />
+ <el-option label="閮ㄥ垎鍏ュ簱" :value="1" />
+ <el-option label="宸插叆搴�" :value="2" />
+ </el-select>
+ </el-form-item>
+ </el-col>
+ <el-col :xs="24" :sm="12" :md="8" :lg="8">
+ <el-form-item label="璁㈠崟鐘舵�侊細">
+ <el-select v-model="searchForm.orderStatus"
+ placeholder="璇烽�夋嫨"
+ clearable
+ style="width: 100%">
+ <el-option label="杩涜涓�" :value="0" />
+ <el-option label="宸插畬鎴�" :value="1" />
+ </el-select>
+ </el-form-item>
+ </el-col>
+ <el-col :span="24">
+ <el-form-item label=" ">
+ <div style="width: 100%; text-align: right;">
+ <el-button type="primary" icon="Search" @click="handleQuery">鎼滅储</el-button>
+ </div>
+ </el-form-item>
+ </el-col>
+ </el-row>
</el-form>
</div>
<div class="table_list">
- <div class="actions">
- <div>
+ <div class="actions sales-ledger-toolbar">
+ <div class="sales-ledger-toolbar-group">
<OtherAmountMaintenanceButton />
<ProcessFlowMaintenanceButton />
</div>
<ProcessFlowConfigSelectDialog v-model:visible="processFlowSelectDialogVisible"
:default-route-id="processFlowSelectDefaultRouteId"
+ :default-record-list="processFlowSelectDefaultRecordList"
:bound-route-name="processFlowSelectBoundRouteName"
@confirm="handleProcessFlowSelectConfirm" />
- <el-space wrap>
- <el-button type="primary"
- @click="handleAudit"
- :disabled="isBatchButtonDisabled('audit')">瀹℃牳</el-button>
- <el-button type="primary"
- @click="handleReverseAudit"
- :disabled="isBatchButtonDisabled('reverseAudit')">鍙嶅</el-button>
- <el-button type="warning"
- @click="handleMarkCompleted"
- :disabled="isBatchButtonDisabled('markCompleted')">鏍囪瀹屾垚</el-button>
- <el-button type="primary"
- @click="handleSalesStock"
- :disabled="isBatchButtonDisabled('stock')">鍏ュ簱</el-button>
- <el-button type="primary"
- @click="openForm('add')">鏂板鍙拌处</el-button>
- <el-button type="primary"
- @click="handleBulkDelivery"
- :disabled="isBatchButtonDisabled('delivery')">鍙戣揣</el-button>
- <el-button type="primary"
- plain
- @click="handleImport">瀵煎叆</el-button>
- <el-dropdown @command="handleHistoryImportCommand">
+ <div class="sales-ledger-toolbar-actions">
+ <el-space v-if="activeStatusTab === 'pendingReview'"
+ wrap
+ class="sales-ledger-toolbar-group">
<el-button type="primary"
- plain>
- 鍘嗗彶杩佺Щ<el-icon class="el-icon--right">
- <ArrowDown />
- </el-icon>
- </el-button>
- <template #dropdown>
- <el-dropdown-menu>
- <el-dropdown-item command="notShipped">鏈嚭搴�</el-dropdown-item>
- <el-dropdown-item command="shipped">宸插嚭搴�</el-dropdown-item>
- </el-dropdown-menu>
- </template>
- </el-dropdown>
- <el-button @click="handleOut">瀵煎嚭</el-button>
- <el-button type="danger"
- plain
- @click="handleDelete"
- :disabled="isBatchButtonDisabled('delete')">鍒犻櫎</el-button>
- <el-dropdown @command="handlePrintCommand">
+ @click="handleAudit"
+ :disabled="isBatchButtonDisabled('audit')">瀹℃牳</el-button>
+ <el-button type="danger"
+ plain
+ @click="handleDelete"
+ :disabled="isBatchButtonDisabled('delete')">鍒犻櫎</el-button>
+ <el-button type="primary"
+ @click="openForm('add')">鏂板鍙拌处</el-button>
<el-button type="primary"
plain
- :disabled="isBatchButtonDisabled('print')">
- 鎵撳嵃鍗曟嵁<el-icon class="el-icon--right">
- <ArrowDown />
- </el-icon>
- </el-button>
- <template #dropdown>
- <el-dropdown-menu>
- <el-dropdown-item command="finishedProcessCard">鐢熶骇娴佺▼鍗★紙鎴愬搧锛�</el-dropdown-item>
- <el-dropdown-item command="salesOrder">閿�鍞鍗�</el-dropdown-item>
- <el-dropdown-item command="salesDeliveryNote">閿�鍞彂璐у崟</el-dropdown-item>
- </el-dropdown-menu>
- </template>
- </el-dropdown>
- <el-button type="primary"
- plain
- @click="handlePrintLabel"
- :disabled="isBatchButtonDisabled('print')">鎵撳嵃鏍囩</el-button>
- </el-space>
+ @click="handleImport">瀵煎叆</el-button>
+ <el-button @click="handleOut">瀵煎嚭</el-button>
+ </el-space>
+ <el-space v-else-if="activeStatusTab === 'reviewed'"
+ wrap
+ class="sales-ledger-toolbar-group">
+ <el-button type="primary"
+ @click="handleReverseAudit"
+ :disabled="isBatchButtonDisabled('reverseAudit')">鍙嶅</el-button>
+ <el-button type="warning"
+ @click="handleMarkCompleted"
+ :disabled="isBatchButtonDisabled('markCompleted')">鏍囪瀹屾垚</el-button>
+ <el-button type="primary"
+ @click="handleSalesStock"
+ :disabled="isBatchButtonDisabled('stock')">鍏ュ簱</el-button>
+ <el-button type="primary"
+ @click="handleBulkDelivery"
+ :disabled="isBatchButtonDisabled('delivery')">鍙戣揣</el-button>
+ <el-button @click="handleOut">瀵煎嚭</el-button>
+
+ <el-button @click="handleExportProcessRoute"
+ :disabled="isBatchButtonDisabled('export')">瀵煎嚭宸ヨ壓璺嚎</el-button>
+ </el-space>
+ <el-space v-else-if="activeStatusTab === 'stocked'"
+ wrap
+ class="sales-ledger-toolbar-group">
+ <el-button type="primary"
+ @click="handleReverseAudit"
+ :disabled="isBatchButtonDisabled('reverseAudit')">鍙嶅</el-button>
+ <el-button type="warning"
+ @click="handleMarkCompleted"
+ :disabled="isBatchButtonDisabled('markCompleted')">鏍囪瀹屾垚</el-button>
+ <el-button type="primary"
+ @click="handleBulkDelivery"
+ :disabled="isBatchButtonDisabled('delivery')">鍙戣揣</el-button>
+ <el-button @click="handleOut">瀵煎嚭</el-button>
+ </el-space>
+ <el-space v-else-if="activeStatusTab === 'delivered'"
+ wrap
+ class="sales-ledger-toolbar-group">
+ <el-button type="warning"
+ @click="handleMarkCompleted"
+ :disabled="isBatchButtonDisabled('markCompleted')">鏍囪瀹屾垚</el-button>
+ <el-button type="primary"
+ @click="handleReverseAudit"
+ :disabled="isBatchButtonDisabled('reverseAudit')">鍙嶅</el-button>
+ <el-button @click="handleOut">瀵煎嚭</el-button>
+ </el-space>
+ <el-space v-else-if="activeStatusTab === 'completed'"
+ wrap
+ class="sales-ledger-toolbar-group">
+ <el-button @click="handleOut">瀵煎嚭</el-button>
+ <el-button type="primary"
+ plain
+ @click="handlePrintCommand('salesOrder')"
+ :disabled="isBatchButtonDisabled('print')">鎵撳嵃鍗曟嵁</el-button>
+ <el-button type="primary"
+ plain
+ @click="handlePrintLabel"
+ :disabled="isBatchButtonDisabled('print')">鎵撳嵃鏍囩</el-button>
+ </el-space>
+ <el-space v-else-if="activeStatusTab === 'all'"
+ wrap
+ class="sales-ledger-toolbar-group">
+ <el-button type="primary"
+ @click="openForm('add')">鏂板鍙拌处</el-button>
+ <el-button @click="handleOut">瀵煎嚭</el-button>
+ </el-space>
+ <el-space wrap class="sales-ledger-toolbar-group sales-ledger-toolbar-group--muted">
+ <el-dropdown @command="handleHistoryImportCommand">
+ <el-button type="primary"
+ plain>
+ 鍘嗗彶杩佺Щ<el-icon class="el-icon--right">
+ <ArrowDown />
+ </el-icon>
+ </el-button>
+ <template #dropdown>
+ <el-dropdown-menu>
+ <el-dropdown-item command="notShipped">鏈嚭搴�</el-dropdown-item>
+ <el-dropdown-item command="shipped">宸插嚭搴�</el-dropdown-item>
+ </el-dropdown-menu>
+ </template>
+ </el-dropdown>
+ </el-space>
+ <el-space wrap class="sales-ledger-toolbar-group sales-ledger-toolbar-group--muted">
+ <el-dropdown @command="handlePrintCommand">
+ <el-button type="primary"
+ plain
+ :disabled="isBatchButtonDisabled('print')">
+ 鎵撳嵃鍗曟嵁<el-icon class="el-icon--right">
+ <ArrowDown />
+ </el-icon>
+ </el-button>
+ <template #dropdown>
+ <el-dropdown-menu>
+ <el-dropdown-item command="finishedProcessCard">鐢熶骇娴佺▼鍗★紙鎴愬搧锛�</el-dropdown-item>
+ <el-dropdown-item command="salesOrder">閿�鍞鍗�</el-dropdown-item>
+ <el-dropdown-item command="salesDeliveryNote">閿�鍞彂璐у崟</el-dropdown-item>
+ </el-dropdown-menu>
+ </template>
+ </el-dropdown>
+ <el-button type="primary"
+ plain
+ @click="handlePrintLabel"
+ :disabled="isBatchButtonDisabled('print')">鎵撳嵃鏍囩</el-button>
+ </el-space>
+ </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 - 22em)">
+ height="calc(100vh - 23em)"
+ :summary-method="summarizeMainTable">
<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="summarizeChildrenTable">
- <el-table-column align="center"
- label="搴忓彿"
- type="index" />
- <el-table-column label="妤煎眰缂栧彿"
- prop="floorCode"
- min-width="100"
- show-overflow-tooltip />
- <el-table-column label="浜у搧澶х被"
- prop="productCategory" />
- <el-table-column label="瑙勬牸鍨嬪彿"
- prop="specificationModel" />
- <el-table-column label="鍘氬害"
- prop="thickness"
- min-width="90">
- <template #default="scope">
- {{ scope.row.thickness ?? "" }}
- </template>
- </el-table-column>
- <el-table-column label="瀹�(mm)"
- prop="width"
- min-width="80">
- <template #default="scope">
- {{ scope.row.width ?? "" }}
- </template>
- </el-table-column>
- <el-table-column label="楂�(mm)"
- prop="height"
- min-width="80">
- <template #default="scope">
- {{ scope.row.height ?? "" }}
- </template>
- </el-table-column>
- <el-table-column label="鍛ㄩ暱(cm)"
- prop="perimeter"
- min-width="90">
- <template #default="scope">
- {{ scope.row.perimeter ?? "" }}
- </template>
- </el-table-column>
- <el-table-column label="鎬婚潰绉�(m虏)"
- prop="actualTotalArea"
- min-width="100">
- <template #default="scope">
- {{ scope.row.actualTotalArea ?? "" }}
- </template>
- </el-table-column>
- <el-table-column label="鍔犲伐瑕佹眰"
- prop="processRequirement"
- min-width="120"
- show-overflow-tooltip />
- <el-table-column label="澶囨敞"
- prop="remark"
- min-width="120"
- show-overflow-tooltip />
- <el-table-column label="閲嶇"
- prop="heavyBox"
- min-width="80">
- <template #default="scope">
- {{ scope.row.heavyBox ?? "" }}
- </template>
- </el-table-column>
- <el-table-column label="浜у搧鐘舵��"
- width="100px"
- align="center">
- <template #default="scope">
- <el-tag v-if="scope.row.approveStatus === 1 && (!scope.row.shippingDate || !scope.row.shippingCarNumber)"
- type="success">鍏呰冻</el-tag>
- <el-tag v-else-if="scope.row.approveStatus === 1 && scope.row.shippingDate && scope.row.shippingCarNumber"
- type="success">宸插嚭搴�</el-tag>
- <el-tag v-else-if="scope.row.approveStatus === 0 && (scope.row.shippingDate || scope.row.shippingCarNumber)"
- type="success">宸插嚭搴�</el-tag>
- <el-tag v-else
- type="danger">涓嶈冻</el-tag>
- </template>
- </el-table-column>
- <el-table-column label="鍏ュ簱鐘舵��"
- width="100px"
- align="center">
- <template #default="scope">
- <el-tag v-if="scope.row.productStockStatus == 1"
- type="warning">閮ㄥ垎鍏ュ簱</el-tag>
- <el-tag v-else-if="scope.row.productStockStatus == 2"
- type="success">宸插叆搴�</el-tag>
- <el-tag v-else-if="scope.row.productStockStatus == 0"
- type="info">鏈叆搴�</el-tag>
- <el-tag v-else
- type="danger">鏈叆搴�</el-tag>
- </template>
- </el-table-column>
- <!-- <el-table-column label="鍙戣揣鐘舵��" width="140" align="center">
- <template #default="scope">
- <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">
- <template #default="scope">
- <div>
- <el-tag type="success"
- v-if="scope.row.shippingCarNumber">{{ scope.row.shippingCarNumber }}</el-tag>
- <el-tag v-else
- type="info">-</el-tag>
- </div>
- </template>
- </el-table-column>
- <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>
- </template>
- </el-table-column>
- <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 Width="60px" label="鎿嶄綔" align="center">
- <template #default="scope">
- <el-button
- link
- type="primary"
- :disabled="!canShip(scope.row)"
- @click="openDeliveryForm(scope.row)">
- 鍙戣揣
- </el-button>
- </template>
- </el-table-column> -->
- </el-table>
- </template>
- </el-table-column>
<el-table-column align="center"
label="搴忓彿"
type="index"
width="60" />
- <el-table-column label="閿�鍞悎鍚屽彿"
+ <el-table-column label="璁㈠崟鍙�"
prop="salesContractNo"
- width="180"
- show-overflow-tooltip />
+ min-width="160"
+ show-overflow-tooltip>
+ <template #default="scope">
+ <el-button link
+ type="primary"
+ @click="openForm('view', scope.row)">{{ scope.row.salesContractNo || "-" }}</el-button>
+ </template>
+ </el-table-column>
<el-table-column label="瀹㈡埛鍚嶇О"
prop="customerName"
- width="300"
+ min-width="200"
show-overflow-tooltip />
<el-table-column label="涓氬姟鍛�"
prop="salesman"
- width="100"
- show-overflow-tooltip />
- <el-table-column label="椤圭洰鍚嶇О"
- prop="projectName"
- width="180"
+ min-width="80"
show-overflow-tooltip />
<el-table-column label="鍚堝悓閲戦(鍏�)"
prop="contractAmount"
- width="220"
+ min-width="120"
show-overflow-tooltip
:formatter="formattedNumber" />
<el-table-column label="闈㈢Н"
prop="productTotalArea"
- width="120"
+ min-width="80"
show-overflow-tooltip />
<el-table-column label="鏁伴噺"
prop="productTotalQuantity"
- width="120"
+ min-width="80"
show-overflow-tooltip />
<el-table-column label="鍙戣揣鐘舵��"
- width="140"
+ min-width="100"
align="center">
<template #default="scope">
<el-tag v-if="Number(scope.row.deliveryStatus) === 1"
@@ -407,19 +1042,21 @@
</template>
</el-table-column>
<el-table-column label="瀹℃牳鐘舵��"
- width="120"
+ min-width="90"
align="center">
<template #default="scope">
<el-tag v-if="Number(scope.row.reviewStatus) === 0"
type="warning">寰呭鏍�</el-tag>
<el-tag v-else-if="Number(scope.row.reviewStatus) === 1"
type="success">宸插鏍�</el-tag>
+ <el-tag v-else-if="Number(scope.row.reviewStatus) === 2"
+ type="danger">宸插弽瀹�</el-tag>
<el-tag v-else
type="info">寰呭鏍�</el-tag>
</template>
</el-table-column>
<el-table-column label="鍏ュ簱鐘舵��"
- width="120"
+ min-width="90"
align="center">
<template #default="scope">
<el-tag v-if="Number(scope.row.stockStatus) === 0"
@@ -435,7 +1072,7 @@
</template>
</el-table-column>
<el-table-column label="璁㈠崟鐘舵��"
- width="120"
+ min-width="90"
align="center">
<template #default="scope">
<el-tag v-if="Number(scope.row.orderStatus) === 1"
@@ -445,14 +1082,14 @@
</template>
</el-table-column>
<el-table-column label="鏍囩鎵撳嵃"
- width="90"
+ min-width="90"
align="center">
<template #default="scope">
<span>{{ scope.row.labelPrintCount ?? 0 }}</span>
</template>
</el-table-column>
<el-table-column label="鍗曟嵁鎵撳嵃"
- width="90"
+ min-width="90"
align="center">
<template #default="scope">
<span>{{ scope.row.documentPrintCount ?? 0 }}</span>
@@ -460,31 +1097,27 @@
</el-table-column>
<el-table-column label="褰曞叆浜�"
prop="entryPersonName"
- width="100"
+ min-width="80"
show-overflow-tooltip />
<el-table-column label="褰曞叆鏃ユ湡"
prop="entryDate"
- width="120"
- show-overflow-tooltip />
- <el-table-column label="绛捐鏃ユ湡"
- prop="executionDate"
- width="120"
+ min-width="110"
show-overflow-tooltip />
<el-table-column label="浜や粯鏃ユ湡"
prop="deliveryDate"
- width="120"
+ min-width="110"
show-overflow-tooltip />
<el-table-column label="澶囨敞"
prop="remarks"
- width="200"
+ min-width="120"
show-overflow-tooltip />
<el-table-column label="瀹㈡埛澶囨敞"
prop="customerRemarks"
- width="200"
+ min-width="120"
show-overflow-tooltip />
<el-table-column fixed="right"
label="鎿嶄綔"
- width="280"
+ width="250"
align="center">
<template #default="scope">
<el-button link
@@ -512,10 +1145,38 @@
:limit="page.size"
@pagination="paginationChange" />
</div>
- <FormDialog v-model="dialogFormVisible"
- :title="isCompletedOrder ? '鏌ョ湅閿�鍞彴璐﹂〉闈紙宸插畬鎴愶級' : operationType === 'add' ? '鏂板閿�鍞彴璐﹂〉闈�' : '缂栬緫閿�鍞彴璐﹂〉闈�'"
+ </div>
+ <!-- 瀵煎嚭宸ヨ壓璺嚎 寮圭獥 -->
+ <el-dialog title="閫夋嫨瀵煎嚭鏃堕棿鑼冨洿"
+ v-model="exportProcessRouteDialogVisible"
+ width="450px"
+ append-to-body>
+ <el-form>
+ <el-form-item label="瀹屾垚鏃堕棿锛�">
+ <el-date-picker v-model="processRouteExportDateRange"
+ type="datetimerange"
+ range-separator="鑷�"
+ start-placeholder="寮�濮嬫椂闂�"
+ end-placeholder="缁撴潫鏃堕棿"
+ value-format="YYYY-MM-DD HH:mm:ss"
+ format="YYYY-MM-DD HH:mm:ss"
+ clearable
+ style="width: 100%;" />
+ </el-form-item>
+ </el-form>
+ <template #footer>
+ <div style="text-align: right">
+ <el-button @click="exportProcessRouteDialogVisible = false">鍙栨秷</el-button>
+ <el-button type="primary" @click="confirmExportProcessRoute">纭瀵煎嚭</el-button>
+ </div>
+ </template>
+ </el-dialog>
+ </template>
+ <FormDialog v-if="!isFormPageMode"
+ v-model="dialogFormVisible"
+ :title="isCompletedOrder ? '鏌ョ湅閿�鍞彴璐﹂〉闈紙宸插畬鎴愶級' : operationType === 'add' ? '鏂板閿�鍞彴璐﹂〉闈�' : operationType === 'view' ? '鏌ョ湅閿�鍞彴璐﹂〉闈�' : '缂栬緫閿�鍞彴璐﹂〉闈�'"
:width="'70%'"
- :operation-type="isCompletedOrder ? 'detail' : operationType"
+ :operation-type="isCompletedOrder || operationType === 'view' ? 'detail' : operationType"
@close="closeDia"
@confirm="submitForm"
@cancel="closeDia">
@@ -655,23 +1316,23 @@
<el-form-item label="浜у搧淇℃伅锛�"
prop="entryDate">
<el-button v-if="operationType !== 'view'"
- type="primary"
- :disabled="hasEditingProductRow() || isReviewedEdit"
- @click="addProductInline">
- 娣诲姞
- </el-button>
- <el-button v-if="operationType !== 'view'"
plain
type="danger"
:disabled="isReviewedEdit"
@click="deleteProduct">鍒犻櫎</el-button>
+ <el-button v-if="operationType !== 'view'"
+ plain
+ type="primary"
+ :disabled="isReviewedEdit"
+ @click="pinSelectedProductRow">鍥哄畾</el-button>
</el-form-item>
</el-row>
<el-table :data="productData"
border
+ class="compact-product-table"
@selection-change="productSelected"
show-summary
- :summary-method="summarizeMainTable">
+ :summary-method="summarizeProductTable">
<el-table-column align="center"
type="selection"
width="55"
@@ -683,7 +1344,7 @@
width="60" />
<el-table-column label="浜у搧澶х被"
prop="productCategory"
- min-width="160">
+ min-width="120">
<template #default="scope">
<el-tree-select v-if="scope.row.__editing"
v-model="scope.row.__productCategoryId"
@@ -702,7 +1363,7 @@
</el-table-column>
<el-table-column label="瑙勬牸鍨嬪彿"
prop="specificationModel"
- min-width="200">
+ min-width="140">
<template #default="scope">
<el-select v-if="scope.row.__editing"
v-model="scope.row.productModelId"
@@ -722,10 +1383,9 @@
</el-table-column>
<el-table-column label="鍘氬害(mm)"
prop="thickness"
- min-width="160">
+ min-width="95">
<template #default="scope">
- <el-input-number v-if="scope.row.__editing"
- controls-position="right"
+ <el-input-number :controls="false" v-if="scope.row.__editing"
v-model="scope.row.thickness"
:min="0"
:step="1"
@@ -739,7 +1399,7 @@
</el-table-column>
<el-table-column label="妤煎眰缂栧彿"
prop="floorCode"
- min-width="250"
+ min-width="120"
show-overflow-tooltip>
<template #default="scope">
<el-input v-if="scope.row.__editing"
@@ -753,9 +1413,9 @@
</el-table-column>
<el-table-column label="鍚◣鍗曚环(鍏�)"
prop="taxInclusiveUnitPrice"
- min-width="160">
+ min-width="105">
<template #default="scope">
- <el-input-number v-if="scope.row.__editing"
+ <el-input-number :controls="false" v-if="scope.row.__editing"
:step="0.01"
:min="0"
:precision="2"
@@ -770,10 +1430,9 @@
</el-table-column>
<el-table-column label="瀹�(mm)"
prop="width"
- min-width="160">
+ min-width="85">
<template #default="scope">
- <el-input-number v-if="scope.row.__editing"
- controls-position="right"
+ <el-input-number :controls="false" v-if="scope.row.__editing"
v-model="scope.row.width"
:min="0"
:step="1"
@@ -789,10 +1448,9 @@
</el-table-column>
<el-table-column label="楂�(mm)"
prop="height"
- min-width="160">
+ min-width="85">
<template #default="scope">
- <el-input-number v-if="scope.row.__editing"
- controls-position="right"
+ <el-input-number :controls="false" v-if="scope.row.__editing"
v-model="scope.row.height"
:min="0"
:step="1"
@@ -808,10 +1466,9 @@
</el-table-column>
<el-table-column label="鏁伴噺"
prop="quantity"
- min-width="150">
+ min-width="85">
<template #default="scope">
- <el-input-number v-if="scope.row.__editing"
- controls-position="right"
+ <el-input-number :controls="false" v-if="scope.row.__editing"
v-model="scope.row.quantity"
:step="1"
:min="0"
@@ -827,10 +1484,9 @@
</el-table-column>
<el-table-column label="缁撶畻鍗曠墖闈㈢Н(銕�)"
prop="settlePieceArea"
- min-width="200">
+ min-width="120">
<template #default="scope">
- <el-input-number v-if="scope.row.__editing"
- controls-position="right"
+ <el-input-number :controls="false" v-if="scope.row.__editing"
v-model="scope.row.settlePieceArea"
:min="0"
:step="1"
@@ -845,10 +1501,9 @@
</el-table-column>
<el-table-column label="闈㈢Н(m虏)"
prop="actualTotalArea"
- min-width="200">
+ min-width="110">
<template #default="scope">
- <el-input-number v-if="scope.row.__editing"
- controls-position="right"
+ <el-input-number :controls="false" v-if="scope.row.__editing"
v-model="scope.row.actualTotalArea"
:min="0"
:step="1"
@@ -861,7 +1516,7 @@
</el-table-column>
<el-table-column label="绋庣巼(%)"
prop="taxRate"
- min-width="120">
+ min-width="80">
<template #default="scope">
<el-select v-if="scope.row.__editing"
v-model="scope.row.taxRate"
@@ -887,14 +1542,14 @@
<el-table-column label="鍚◣鎬讳环(鍏�)"
prop="taxInclusiveTotalPrice"
:formatter="formattedNumber"
- min-width="120" />
+ min-width="100" />
<el-table-column label="涓嶅惈绋庢�讳环(鍏�)"
prop="taxExclusiveTotalPrice"
:formatter="formattedNumber"
- min-width="120" />
+ min-width="100" />
<el-table-column label="鍔犲伐瑕佹眰"
prop="processRequirement"
- min-width="160"
+ min-width="100"
show-overflow-tooltip>
<template #default="scope">
<el-input v-if="scope.row.__editing"
@@ -908,7 +1563,7 @@
</el-table-column>
<el-table-column label="鍙戠エ绫诲瀷"
prop="invoiceType"
- min-width="120">
+ min-width="90">
<template #default="scope">
<el-select v-if="scope.row.__editing"
v-model="scope.row.invoiceType"
@@ -926,7 +1581,7 @@
</el-table-column>
<el-table-column label="澶囨敞"
prop="remark"
- min-width="140"
+ min-width="100"
show-overflow-tooltip>
<template #default="scope">
<el-input v-if="scope.row.__editing"
@@ -940,7 +1595,7 @@
</el-table-column>
<el-table-column label="閲嶇"
prop="heavyBox"
- min-width="100">
+ min-width="80">
<template #default="scope">
<el-input v-if="scope.row.__editing"
v-model="scope.row.heavyBox"
@@ -953,7 +1608,7 @@
</el-table-column>
<el-table-column fixed="right"
label="鎿嶄綔"
- min-width="220"
+ min-width="150"
align="center"
v-if="operationType !== 'view'">
<template #default="scope">
@@ -1025,7 +1680,7 @@
style="max-width: 170px; overflow:hidden; text-overflow:ellipsis; white-space:nowrap;">
{{ item.processName }}
</el-tag>
- <el-input-number v-model="item.quantity"
+ <el-input-number :controls="false" v-model="item.quantity"
:min="0"
:step="1"
:precision="0"
@@ -1071,7 +1726,7 @@
size="small"
:disabled="isProductShipped(scope.row)"
@click="copyProductInline(scope.row, scope.$index)">
- 澶嶅埗鏂板缓
+ 澶嶅埗
</el-button>
</template>
<el-popover :width="560"
@@ -1137,7 +1792,7 @@
style="max-width: 170px; overflow:hidden; text-overflow:ellipsis; white-space:nowrap;">
{{ item.processName }}
</el-tag>
- <el-input-number v-model="item.quantity"
+ <el-input-number :controls="false" v-model="item.quantity"
:min="0"
:step="1"
:precision="0"
@@ -1343,7 +1998,7 @@
<el-col :span="8">
<el-form-item label="鍘氬害锛�"
prop="thickness">
- <el-input-number v-model="productForm.thickness"
+ <el-input-number :controls="false" v-model="productForm.thickness"
:min="0"
:step="0.000000000000001"
:precision="15"
@@ -1358,7 +2013,7 @@
<el-col :span="8">
<el-form-item label="鍚◣鍗曚环(鍏�)锛�"
prop="taxInclusiveUnitPrice">
- <el-input-number :step="0.01"
+ <el-input-number :controls="false" :step="0.01"
:min="0"
v-model="productForm.taxInclusiveUnitPrice"
style="width: 100%"
@@ -1392,7 +2047,7 @@
<el-col :span="8">
<el-form-item label="鏁伴噺锛�"
prop="quantity">
- <el-input-number :step="0.1"
+ <el-input-number :controls="false" :step="0.1"
:min="0"
v-model="productForm.quantity"
placeholder="璇疯緭鍏�"
@@ -1443,7 +2098,7 @@
<el-col :span="8">
<el-form-item label="瀹�(mm)锛�"
prop="width">
- <el-input-number v-model="productForm.width"
+ <el-input-number :controls="false" v-model="productForm.width"
:min="0"
:step="1"
:precision="2"
@@ -1456,7 +2111,7 @@
<el-col :span="8">
<el-form-item label="楂�(mm)锛�"
prop="height">
- <el-input-number v-model="productForm.height"
+ <el-input-number :controls="false" v-model="productForm.height"
:min="0"
:step="1"
:precision="2"
@@ -1469,7 +2124,7 @@
<el-col :span="8">
<el-form-item label="鍛ㄩ暱(cm)锛�"
prop="perimeter">
- <el-input-number v-model="productForm.perimeter"
+ <el-input-number :controls="false" v-model="productForm.perimeter"
:min="0"
:step="0.01"
:precision="2"
@@ -1485,7 +2140,7 @@
<el-col :span="8">
<el-form-item label="瀹為檯鍗曠墖闈㈢Н(銕�)锛�"
prop="actualPieceArea">
- <el-input-number v-model="productForm.actualPieceArea"
+ <el-input-number :controls="false" v-model="productForm.actualPieceArea"
:min="0"
:step="0.0001"
:precision="4"
@@ -1498,7 +2153,7 @@
<el-col :span="8">
<el-form-item label="瀹為檯鎬婚潰绉�(銕�)锛�"
prop="actualTotalArea">
- <el-input-number v-model="productForm.actualTotalArea"
+ <el-input-number :controls="false" v-model="productForm.actualTotalArea"
:min="0"
:step="0.0001"
:precision="4"
@@ -1510,7 +2165,7 @@
<el-col :span="8">
<el-form-item label="缁撶畻鍗曠墖闈㈢Н(銕�)锛�"
prop="settlePieceArea">
- <el-input-number v-model="productForm.settlePieceArea"
+ <el-input-number :controls="false" v-model="productForm.settlePieceArea"
:min="0"
:step="0.0001"
:precision="4"
@@ -1523,7 +2178,7 @@
<el-col :span="8">
<el-form-item label="缁撶畻鎬婚潰绉�(銕�)锛�"
prop="settleTotalArea">
- <el-input-number v-model="productForm.settleTotalArea"
+ <el-input-number :controls="false" v-model="productForm.settleTotalArea"
:min="0"
:step="0.0001"
:precision="4"
@@ -1535,7 +2190,7 @@
<el-col :span="8">
<el-form-item label="缁撶畻鎬婚潰绉�(銕�)锛�"
prop="settleTotalArea">
- <el-input-number v-model="productForm.settleTotalArea"
+ <el-input-number :controls="false" v-model="productForm.settleTotalArea"
:min="0"
:step="0.0001"
:precision="4"
@@ -1618,7 +2273,7 @@
</el-tag>
</div>
<div style="flex: 1;">
- <el-input-number v-model="item.quantity"
+ <el-input-number :controls="false" v-model="item.quantity"
:min="0"
:step="1"
:precision="0"
@@ -1933,11 +2588,12 @@
<script setup>
import { getToken } from "@/utils/auth";
import pagination from "@/components/PIMTable/Pagination.vue";
- import { onMounted, ref, reactive, getCurrentInstance, watch, nextTick } from "vue";
+ import { onMounted, ref, reactive, getCurrentInstance, watch, nextTick, computed } from "vue";
import { addShippingInfo } from "@/api/salesManagement/deliveryLedger.js";
import { ElMessageBox, ElMessage } from "element-plus";
import { ArrowDown, WarningFilled } from "@element-plus/icons-vue";
import useUserStore from "@/store/modules/user";
+ import useAppStore from "@/store/modules/app";
import { approveUserList } from "@/api/collaborativeApproval/approvalProcess.js";
import { userListNoPage } from "@/api/system/user.js";
import FileListDialog from "@/components/Dialog/FileListDialog.vue";
@@ -1945,6 +2601,7 @@
import OtherAmountMaintenanceButton from "./components/OtherAmountMaintenanceButton.vue";
import ProcessFlowMaintenanceButton from "./components/ProcessFlowMaintenanceButton.vue";
import ProcessFlowConfigSelectDialog from "./components/ProcessFlowConfigSelectDialog.vue";
+ import ReverseAuditHistory from "../reverseAuditHistory/index.vue";
import { getQuotationList } from "@/api/salesManagement/salesQuotation.js";
import {
ledgerListPage,
@@ -1978,14 +2635,18 @@
import { printSalesDeliveryNote } from "./components/salesDeliveryPrint.js";
import { printSalesLabel } from "./components/salesLabelPrint.js";
import QRCode from "qrcode";
+ import { useRoute, useRouter } from "vue-router";
// import { salesLedgerProductSetProcessFlowConfig } from "@/api/salesManagement/salesProcessFlowConfig.js";
const userStore = useUserStore();
const { proxy } = getCurrentInstance();
+ const route = useRoute();
+ const router = useRouter();
const tableData = ref([]);
const productData = ref([]);
const selectedRows = ref([]);
const productSelectedRows = ref([]);
+ const pinnedProductTemplate = ref(null);
const userList = ref([]);
const userListApprove = ref([]);
const customerOption = ref([]);
@@ -1998,11 +2659,13 @@
});
const total = ref(0);
const fileList = ref([]);
+ const processRouteExportDateRange = ref([]);
// 宸ヨ壓璺嚎閰嶇疆閫夋嫨寮圭獥锛堢粦瀹氬埌鍙拌处浜у搧锛�
const processFlowSelectDialogVisible = ref(false);
const processFlowSelectLedgerRow = ref(null);
const processFlowSelectDefaultRouteId = ref(null);
+ const processFlowSelectDefaultRecordList = ref([]);
const processFlowSelectBoundRouteId = ref(null);
const processFlowSelectBoundRouteName = ref("");
@@ -2025,6 +2688,41 @@
const ledgerQrDialogVisible = ref(false);
const ledgerQrCompositeUrl = ref("");
const ledgerQrDownloadBaseName = ref("");
+ const pendingAddPrefillDetail = ref(null);
+ const pageMode = computed(() => String(route.query.mode || ""));
+ const isFormPageMode = computed(() =>
+ pageMode.value === "add" || pageMode.value === "edit"
+ );
+ const pageFormTitle = computed(() =>
+ pageMode.value === "edit" ? "缂栬緫閿�鍞彴璐�" : "鏂板閿�鍞彴璐�"
+ );
+ const pageFormSubtitle = computed(() =>
+ pageMode.value === "edit"
+ ? "缂栬緫瀹屾垚鍚庡皢鑷姩杩斿洖閿�鍞彴璐﹀垪琛�"
+ : "鏂板瀹屾垚鍚庡皢鑷姩杩斿洖閿�鍞彴璐﹀垪琛�"
+ );
+
+ const appStore = useAppStore();
+ watch(isFormPageMode, (val) => {
+ if (val) {
+ appStore.closeSideBar({ withoutAnimation: false });
+ } else {
+ if (!appStore.sidebar.opened) {
+ appStore.toggleSideBar(false);
+ }
+ }
+ });
+ onMounted(() => {
+ if (isFormPageMode.value) {
+ appStore.closeSideBar({ withoutAnimation: false });
+ }
+ });
+ import { onUnmounted } from "vue";
+ onUnmounted(() => {
+ if (!appStore.sidebar.opened) {
+ appStore.toggleSideBar(false);
+ }
+ });
const sanitizeLedgerQrFilename = s =>
String(s)
@@ -2296,16 +2994,56 @@
return (productData.value || []).some(r => r && r.__editing);
};
- const buildEmptyInlineProductRow = () => ({
+ const isPlaceholderRowDirty = row => {
+ if (!row || !row.__placeholder) return false;
+ const fieldsToCheck = [
+ "width",
+ "height",
+ "quantity",
+ "settlePieceArea",
+ "taxInclusiveUnitPrice",
+ "taxRate",
+ "invoiceType",
+ "floorCode",
+ "processRequirement",
+ "remark",
+ "heavyBox",
+ ];
+ return fieldsToCheck.some(key => {
+ const value = row[key];
+ return value !== null && value !== undefined && value !== "";
+ });
+ };
+
+ const getPlaceholderRowIndex = () =>
+ (productData.value || []).findIndex(r => r && r.__placeholder);
+
+ const discardPlaceholderRowIfPristine = () => {
+ const index = getPlaceholderRowIndex();
+ if (index === -1) return true;
+ const row = productData.value[index];
+ if (isPlaceholderRowDirty(row)) {
+ proxy.$modal.msgWarning("璇峰厛淇濆瓨鎴栧彇娑堝綋鍓嶅緟褰曞叆琛�");
+ return false;
+ }
+ productData.value.splice(index, 1);
+ if (editingProductRow.value === row) {
+ editingProductRow.value = null;
+ }
+ return true;
+ };
+
+ const buildEmptyInlineProductRow = (prefill = {}) => ({
id: null,
__tempKey: `__temp_${Date.now()}_${Math.random().toString(16).slice(2)}`,
__editing: true,
__isNew: true,
- __productCategoryId: null,
- productCategory: "",
- productModelId: null,
- specificationModel: "",
- thickness: null,
+ __placeholder: true,
+ __productCategoryId: prefill.__productCategoryId ?? null,
+ productCategory: prefill.productCategory ?? "",
+ productModelId: prefill.productModelId ?? null,
+ specificationModel: prefill.specificationModel ?? "",
+ thickness: prefill.thickness ?? null,
quantity: null,
taxInclusiveUnitPrice: null,
taxRate: "",
@@ -2327,19 +3065,96 @@
heavyBox: "",
});
+ const getPinnedProductPrefill = async () => {
+ await getProductOptions();
+ if (!pinnedProductTemplate.value) {
+ const models = await modelList({});
+ modelOptions.value = models || [];
+ return {};
+ }
+ if (pinnedProductTemplate.value.__productCategoryId) {
+ const models = await modelList({
+ id: pinnedProductTemplate.value.__productCategoryId,
+ });
+ modelOptions.value = models || [];
+ } else {
+ const models = await modelList({});
+ modelOptions.value = models || [];
+ }
+ return { ...pinnedProductTemplate.value };
+ };
+
+ const appendEditablePlaceholderRow = async () => {
+ if (operationType.value === "view" || isReviewedEdit.value) return;
+ const existingPlaceholder = (productData.value || []).find(
+ r => r && r.__placeholder
+ );
+ if (existingPlaceholder) {
+ if (!existingPlaceholder.__editing) existingPlaceholder.__editing = true;
+ editingProductRow.value = existingPlaceholder;
+ productForm.value = existingPlaceholder;
+ return;
+ }
+ if (hasEditingProductRow()) return;
+ await getProductOptions();
+ await fetchOtherAmountSelectOptions(true);
+ const prefill = await getPinnedProductPrefill();
+ const row = buildEmptyInlineProductRow(prefill);
+ productData.value.push(row);
+ editingProductRow.value = row;
+ productForm.value = row;
+ };
+
+ const pinSelectedProductRow = async () => {
+ if (operationType.value === "view" || isReviewedEdit.value) return;
+ if (!productSelectedRows.value || productSelectedRows.value.length !== 1) {
+ proxy.$modal.msgWarning("璇烽�夋嫨涓�鏉′骇鍝佹暟鎹繘琛屽浐瀹�");
+ return;
+ }
+ const selectedRow = productSelectedRows.value[0];
+ const categoryId =
+ selectedRow.__productCategoryId ??
+ findNodeIdByLabel(productOptions.value, selectedRow.productCategory) ??
+ null;
+ if (!selectedRow.productCategory || !selectedRow.specificationModel) {
+ proxy.$modal.msgWarning("璇峰厛閫夋嫨瀹屾暣鐨勪骇鍝佸ぇ绫诲拰瑙勬牸鍨嬪彿鍐嶅浐瀹�");
+ return;
+ }
+ if (!categoryId || !selectedRow.productModelId) {
+ proxy.$modal.msgWarning("璇峰厛淇濆瓨褰撳墠浜у搧鍚庡啀鍥哄畾");
+ return;
+ }
+ pinnedProductTemplate.value = {
+ __productCategoryId: categoryId,
+ productCategory: selectedRow.productCategory ?? "",
+ productModelId: selectedRow.productModelId ?? null,
+ specificationModel: selectedRow.specificationModel ?? "",
+ thickness:
+ selectedRow.thickness !== null &&
+ selectedRow.thickness !== undefined &&
+ selectedRow.thickness !== ""
+ ? Number(selectedRow.thickness)
+ : null,
+ };
+ proxy.$modal.msgSuccess("鍥哄畾鎴愬姛锛屽悗缁細鑷姩甯﹀嚭璇ヤ骇鍝佸拰瑙勬牸鍨嬪彿");
+ const editingRow = (productData.value || []).find(r => r?.__editing);
+ if (
+ editingRow &&
+ !editingRow.productCategory &&
+ !editingRow.productModelId &&
+ !editingRow.specificationModel
+ ) {
+ Object.assign(editingRow, await getPinnedProductPrefill());
+ }
+ };
+
const addProductInline = async () => {
if (operationType.value === "view") return;
if (hasEditingProductRow()) {
proxy.$modal.msgWarning("璇峰厛淇濆瓨鎴栧彇娑堝綋鍓嶇紪杈戣");
return;
}
- await getProductOptions();
- await fetchOtherAmountSelectOptions(true);
- const row = buildEmptyInlineProductRow();
- productData.value.push(row);
- editingProductRow.value = row;
- // 璁╃幇鏈夌殑璁$畻/鍏朵粬閲戦閫昏緫澶嶇敤褰撳墠琛�
- productForm.value = row;
+ await appendEditablePlaceholderRow();
};
const copyProductInline = async row => {
@@ -2349,14 +3164,19 @@
proxy.$modal.msgWarning("宸插彂璐ф垨瀹℃牳閫氳繃鐨勪骇鍝佷笉鑳藉鍒�");
return;
}
- if (hasEditingProductRow()) {
+ const hasBlockingEditingRow = (productData.value || []).some(
+ item => item && item.__editing && !item.__placeholder
+ );
+ if (hasBlockingEditingRow) {
proxy.$modal.msgWarning("璇峰厛淇濆瓨鎴栧彇娑堝綋鍓嶇紪杈戣");
return;
}
+ if (!discardPlaceholderRowIfPristine()) return;
await getProductOptions();
await fetchOtherAmountSelectOptions(true);
const copied = buildEmptyInlineProductRow();
+ copied.__placeholder = false;
copied.__productCategoryId =
row.__productCategoryId ??
findNodeIdByLabel(productOptions.value, row.productCategory) ??
@@ -2426,6 +3246,7 @@
proxy.$modal.msgWarning("宸插彂璐ф垨瀹℃牳閫氳繃鐨勪骇鍝佷笉鑳界紪杈�");
return;
}
+ if (!discardPlaceholderRowIfPristine()) return;
stopOtherEditingRows();
await getProductOptions();
await fetchOtherAmountSelectOptions(true);
@@ -2569,11 +3390,13 @@
if (model?.model) row.specificationModel = model.model;
if (operationType.value === "edit") {
+ row.__placeholder = false;
// 鍙拌处宸插瓨鍦細璧板師鎺ュ彛淇濆瓨鍒板悗绔紝鍐嶅洖鎷夊埛鏂�
const payload = { ...row, salesLedgerId: currentId.value, type: 1 };
delete payload.__backup;
delete payload.__editing;
delete payload.__isNew;
+ delete payload.__placeholder;
delete payload.__productCategoryId;
delete payload.__tempKey;
await addOrUpdateSalesLedgerProduct(payload);
@@ -2583,19 +3406,22 @@
productData.value = res.productData;
}
);
+ stopOtherEditingRows();
+ await appendEditablePlaceholderRow();
} else {
// 鏂板鍙拌处锛氫粎鍦ㄦ湰鍦� productData 鐢熸晥锛屾渶缁堥殢鍙拌处涓�璧锋彁浜�
row.__isNew = false;
+ row.__placeholder = false;
row.__editing = false;
delete row.__backup;
+ stopOtherEditingRows();
+ await appendEditablePlaceholderRow();
}
-
- stopOtherEditingRows();
};
- const cancelProductInline = (row, index) => {
+ const cancelProductInline = async (row, index) => {
if (!row) return;
- if (row.__isNew) {
+ if (row.__placeholder) {
productData.value.splice(index, 1);
} else if (row.__backup) {
const restored = JSON.parse(JSON.stringify(row.__backup));
@@ -2605,9 +3431,11 @@
Object.assign(row, restored);
row.id = keepId;
row.__editing = false;
+ row.__placeholder = false;
delete row.__backup;
}
stopOtherEditingRows();
+ await appendEditablePlaceholderRow();
};
const openOtherAmountInline = async row => {
@@ -3087,6 +3915,53 @@
shipped: "閿�鍞彂璐у巻鍙叉暟鎹鍏ユā鏉�-宸插彂璐�.xlsx",
};
const currentImportCommand = ref("default");
+ const activeStatusTab = ref("all");
+ const salesLedgerStatusTabs = [
+ { key: "all", label: "鍏ㄩ儴" },
+ { key: "pendingReview", label: "鏈鏍�" },
+ { key: "reviewed", label: "宸插鏍�" },
+ { key: "reverseReviewed", label: "鍙嶅鏍�" },
+ { key: "stocked", label: "宸插叆搴�" },
+ { key: "delivered", label: "宸插彂璐�" },
+ { key: "completed", label: "宸插畬鎴�" },
+ ];
+
+ const resetStatusFilters = () => {
+ searchForm.reviewStatus = undefined;
+ searchForm.stockStatus = undefined;
+ searchForm.deliveryStatus = undefined;
+ searchForm.orderStatus = undefined;
+ };
+
+ const handleStatusTabChange = tabKey => {
+ activeStatusTab.value = tabKey;
+ resetStatusFilters();
+ switch (tabKey) {
+ case "all":
+ break;
+ case "pendingReview":
+ searchForm.reviewStatus = 0;
+ break;
+ case "reviewed":
+ searchForm.reviewStatus = 1;
+ break;
+ case "reverseReviewed":
+ searchForm.reviewStatus = 2;
+ break;
+ case "stocked":
+ searchForm.stockStatus = 2;
+ break;
+ case "delivered":
+ searchForm.deliveryStatus = 5;
+ break;
+ case "completed":
+ searchForm.orderStatus = 1;
+ break;
+ default:
+ break;
+ }
+ handleQuery();
+ };
const changeDaterange = value => {
if (value) {
searchForm.entryDateStart = dayjs(value[0]).format("YYYY-MM-DD");
@@ -3238,7 +4113,7 @@
if (res.newLedgerIds.length === 1) {
const newId = res.newLedgerIds[0];
getSalesLedgerWithProducts({ id: newId, type: 1 }).then(detail => {
- openFormWithPreFill(detail);
+ enterAddPage(detail);
});
}
}
@@ -3277,11 +4152,13 @@
};
/** 鐢ㄩ濉暟鎹墦寮�鏂板鍙拌处椤甸潰锛堥噸鏂扮敓鎴愬満鏅級 */
- const openFormWithPreFill = async (detail) => {
+ const openFormWithPreFill = async (detail, keepPageMode = false) => {
operationType.value = "add";
form.value = {};
productData.value = [];
selectedQuotation.value = null;
+ fileList.value = [];
+ pinnedProductTemplate.value = null;
let userLists = await userListNoPage();
userList.value = userLists.data;
customerList().then(res => {
@@ -3302,7 +4179,8 @@
form.value.customerRemarks = detail.customerRemarks ?? detail.customer_remarks ?? "";
productData.value = detail.productData || [];
form.value.deliveryDate = dayjs(form.value.entryDate).add(7, "day").format("YYYY-MM-DD");
- dialogFormVisible.value = true;
+ await appendEditablePlaceholderRow();
+ dialogFormVisible.value = !keepPageMode;
};
const paginationChange = obj => {
@@ -3314,7 +4192,7 @@
tableLoading.value = true;
const { entryDate, ...rest } = searchForm;
// 灏嗚寖鍥存棩鏈熷瓧娈典紶閫掔粰鍚庣
- const params = { ...rest, ...page, reviewStatusList: [0, 1] };
+ const params = { ...rest, ...page, reviewStatusList: [0, 1, 2] };
// 绉婚櫎褰曞叆鏃ユ湡鐨勯粯璁ゅ�艰缃紝鍙繚鐣欒寖鍥存棩鏈熷瓧娈�
delete params.entryDate;
// 鏌ヨ瀹㈡埛鍚嶇О涓庢柊澧炰繚鎸佷竴鑷达細鍏堥�� customerId锛屽啀鏄犲皠涓� customerName 鏌ヨ
@@ -3488,6 +4366,7 @@
processFlowSelectLedgerRow.value = ledgerRow;
processFlowSelectDefaultRouteId.value = null;
+ processFlowSelectDefaultRecordList.value = [];
processFlowSelectBoundRouteId.value = null;
processFlowSelectBoundRouteName.value = "";
@@ -3497,25 +4376,29 @@
const boundId = info?.processRouteId ?? info?.routeId ?? info?.id ?? null;
const boundName =
info?.processRouteName ?? info?.routeName ?? info?.name ?? "";
+ const recordList = Array.isArray(info?.recordList) ? info.recordList : [];
processFlowSelectBoundRouteId.value = boundId;
processFlowSelectBoundRouteName.value = boundName;
processFlowSelectDefaultRouteId.value = boundId;
+ processFlowSelectDefaultRecordList.value = recordList;
} catch (e) {
// 鏌ヨ澶辫触鏃舵寜鏈粦瀹氬鐞嗭紝涓嶉樆濉炲脊绐�
processFlowSelectBoundRouteId.value = null;
processFlowSelectBoundRouteName.value = "";
processFlowSelectDefaultRouteId.value = null;
+ processFlowSelectDefaultRecordList.value = [];
}
processFlowSelectDialogVisible.value = true;
};
// 缁戝畾宸ヨ壓璺嚎鍒板綋鍓嶅彴璐︽暟鎹�
- const handleProcessFlowSelectConfirm = async routeId => {
+ const handleProcessFlowSelectConfirm = async payload => {
const ledgerRow = processFlowSelectLedgerRow.value;
if (!ledgerRow?.id) return;
- const finalRouteId = routeId ?? null;
+ const finalRouteId = payload?.routeId ?? payload ?? null;
+ const recordList = Array.isArray(payload?.recordList) ? payload.recordList : [];
if (!finalRouteId) return;
const oldRouteId = processFlowSelectBoundRouteId.value;
@@ -3545,6 +4428,7 @@
await saleProcessBind({
salesLedgerId: ledgerRow.id,
processRouteId: finalRouteId,
+ recordList,
});
proxy?.$modal?.msgSuccess?.("宸ヨ壓璺嚎缁戝畾鎴愬姛");
@@ -3627,20 +4511,30 @@
};
// 鑾峰彇tree瀛愭暟鎹�
const getModels = value => {
- // 浜у搧澶х被鍙樺寲鏃讹紝閲嶇疆瑙勬牸鍨嬪彿涓庡帤搴︼紝閬垮厤鏃у�兼畫鐣�
- productForm.value.productModelId = null;
- productForm.value.specificationModel = "";
- productForm.value.thickness = null;
-
if (!value) {
productForm.value.productCategory = "";
- modelOptions.value = [];
+ modelList({}).then(res => {
+ modelOptions.value = res || [];
+ });
return;
}
productForm.value.productCategory = findNodeById(productOptions.value, value);
modelList({ id: value }).then(res => {
modelOptions.value = res || [];
+ const currentModelId = productForm.value.productModelId;
+ if (currentModelId) {
+ const isValid = modelOptions.value.some(item => item.id === currentModelId);
+ if (!isValid) {
+ productForm.value.productModelId = null;
+ productForm.value.specificationModel = "";
+ productForm.value.thickness = null;
+ }
+ } else {
+ productForm.value.productModelId = null;
+ productForm.value.specificationModel = "";
+ productForm.value.thickness = null;
+ }
});
};
const getProductModel = value => {
@@ -3659,6 +4553,12 @@
modelThickness === ""
? null
: Number(modelThickness);
+
+ const categoryId = selectedModel?.productId;
+ if (categoryId && productForm.value.__productCategoryId !== categoryId) {
+ productForm.value.__productCategoryId = categoryId;
+ productForm.value.productCategory = findNodeById(productOptions.value, categoryId);
+ }
} else {
productForm.value.specificationModel = null;
productForm.value.thickness = null;
@@ -3778,8 +4678,120 @@
"taxExclusiveTotalPrice",
]);
};
+ const summarizeProductTable = param => {
+ return proxy.summarizeTable(param, [
+ "quantity",
+ "settlePieceArea",
+ "actualTotalArea",
+ "taxInclusiveTotalPrice",
+ "taxExclusiveTotalPrice",
+ ]);
+ };
+
+ const initAddFormState = async () => {
+ operationType.value = "add";
+ isCompletedOrder.value = false;
+ isReviewedEdit.value = false;
+ form.value = {};
+ productData.value = [];
+ fileList.value = [];
+ selectedQuotation.value = null;
+ pinnedProductTemplate.value = null;
+
+ const userLists = await userListNoPage();
+ userList.value = userLists.data;
+ customerList().then(res => {
+ customerOption.value = res;
+ });
+
+ form.value.entryPerson = userStore.id;
+ form.value.entryDate = getCurrentDate();
+ form.value.executionDate = getCurrentDate();
+ form.value.customerRemarks = "";
+ form.value.deliveryDate = dayjs(form.value.entryDate)
+ .add(7, "day")
+ .format("YYYY-MM-DD");
+ await appendEditablePlaceholderRow();
+ };
+
+ const initEditFormState = async rowId => {
+ operationType.value = "edit";
+ isCompletedOrder.value = false;
+ form.value = {};
+ productData.value = [];
+ fileList.value = [];
+ selectedQuotation.value = null;
+ pinnedProductTemplate.value = null;
+
+ const userLists = await userListNoPage();
+ userList.value = userLists.data;
+ customerList().then(res => {
+ customerOption.value = res;
+ });
+
+ currentId.value = rowId;
+ const res = await getSalesLedgerWithProducts({ id: rowId, type: 1 });
+ form.value = { ...res };
+ form.value.entryPerson = Number(res.entryPerson);
+ form.value.customerRemarks =
+ res?.customerRemarks ?? res?.customer_remarks ?? "";
+ productData.value = form.value.productData || [];
+ fileList.value = form.value.salesLedgerFiles || [];
+ isReviewedEdit.value = Number(res?.reviewStatus) === 1;
+ await appendEditablePlaceholderRow();
+ };
+
+ const enterAddPage = async detail => {
+ pendingAddPrefillDetail.value = detail || null;
+ const query = { ...route.query, mode: "add" };
+ await router.push({ path: route.path, query });
+ };
+
+ const enterEditPage = async row => {
+ const query = { ...route.query, mode: "edit", id: row?.id };
+ await router.push({ path: route.path, query });
+ };
+
+ const exitFormPage = async (shouldRefresh = false) => {
+ const query = { ...route.query };
+ delete query.mode;
+ delete query.id;
+ pendingAddPrefillDetail.value = null;
+ await router.push({ path: route.path, query });
+ closeDia(false);
+ if (shouldRefresh) {
+ getList();
+ }
+ };
+
+ watch(
+ pageMode,
+ async enabled => {
+ if (enabled === "add") {
+ await initAddFormState();
+ if (pendingAddPrefillDetail.value) {
+ await openFormWithPreFill(pendingAddPrefillDetail.value, true);
+ pendingAddPrefillDetail.value = null;
+ }
+ return;
+ }
+ if (enabled === "edit" && route.query.id) {
+ await initEditFormState(route.query.id);
+ }
+ },
+ { immediate: true }
+ );
+
// 鎵撳紑寮规
const openForm = async (type, row) => {
+ if (type === "add") {
+ await enterAddPage();
+ return;
+ }
+ if (type === "edit") {
+ await enterEditPage(row);
+ return;
+ }
// 宸插畬鎴愯鍗曞己鍒朵负鍙妯″紡锛屼絾闄勪欢涓婁紶浠嶅彲鐢�
const isCompleted = Number(row?.orderStatus) === 1;
const effectiveType = isCompleted ? 'view' : type;
@@ -3993,18 +5005,21 @@
console.log("productData.value--", productData.value);
// 琛屽唴缂栬緫鏈繚瀛樻椂涓嶅厑璁告彁浜わ紝閬垮厤鑴忔暟鎹�/涓存椂瀛楁杩涘叆鍚庣
const hasEditingRow = (productData.value || []).some(
- r => r && r.__editing
+ r => r && r.__editing && !r.__placeholder
);
if (hasEditingRow) {
proxy.$modal.msgWarning("浜у搧淇℃伅瀛樺湪鏈繚瀛樼殑缂栬緫琛岋紝璇峰厛淇濆瓨鎴栧彇娑�");
return;
}
if (productData.value !== null && productData.value.length > 0) {
- const cleanedProducts = (productData.value || []).map(p => {
+ const cleanedProducts = (productData.value || [])
+ .filter(p => p && !p.__placeholder)
+ .map(p => {
if (!p || typeof p !== "object") return p;
const {
__editing,
__isNew,
+ __placeholder,
__backup,
__productCategoryId,
__tempKey,
@@ -4015,6 +5030,10 @@
rest.quantity = Number(rest.quantity ?? 0) || 0;
return rest;
});
+ if (cleanedProducts.length === 0) {
+ proxy.$modal.msgWarning("璇锋坊鍔犱骇鍝佷俊鎭�");
+ return;
+ }
form.value.productData = proxy.HaveJson(cleanedProducts);
} else {
proxy.$modal.msgWarning("璇锋坊鍔犱骇鍝佷俊鎭�");
@@ -4032,6 +5051,10 @@
delete submitPayload.paymentMethod;
addOrUpdateSalesLedger(submitPayload).then(res => {
proxy.$modal.msgSuccess("鎻愪氦鎴愬姛");
+ if (isFormPageMode.value) {
+ exitFormPage(true);
+ return;
+ }
closeDia();
getList();
});
@@ -4039,11 +5062,16 @@
});
};
// 鍏抽棴寮规
- const closeDia = () => {
- proxy.resetForm("formRef");
+ const closeDia = (resetFormRef = true) => {
+ if (resetFormRef) {
+ proxy.resetForm("formRef");
+ }
dialogFormVisible.value = false;
isCompletedOrder.value = false;
isReviewedEdit.value = false;
+ if (!isFormPageMode.value) {
+ fileList.value = [];
+ }
};
const productIndex = ref(0);
@@ -4230,10 +5258,35 @@
productData.value.splice(index, 1);
}
});
+ appendEditablePlaceholderRow();
} else {
+ const placeholderRows = productSelectedRows.value.filter(
+ item => item?.__placeholder
+ );
+ if (placeholderRows.length > 0) {
+ placeholderRows.forEach(selectedRow => {
+ const index = productData.value.findIndex(product => {
+ if (!product || !selectedRow) return false;
+ return (
+ product.__tempKey &&
+ selectedRow.__tempKey &&
+ String(product.__tempKey) === String(selectedRow.__tempKey)
+ );
+ });
+ if (index !== -1) {
+ productData.value.splice(index, 1);
+ }
+ });
+ appendEditablePlaceholderRow();
+ }
let ids = [];
- if (productSelectedRows.value.length > 0) {
- ids = productSelectedRows.value.map(item => item.id);
+ const persistedRows = productSelectedRows.value.filter(
+ item => !item?.__placeholder && item?.id !== null && item?.id !== undefined
+ );
+ if (persistedRows.length > 0) {
+ ids = persistedRows.map(item => item.id);
+ } else {
+ return;
}
ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚垹闄わ紝鏄惁纭鍒犻櫎锛�", "瀵煎嚭", {
confirmButtonText: "纭",
@@ -4344,6 +5397,47 @@
if (!heightValue) delete params.height;
proxy.download("/sales/ledger/exportWithProducts", params, "閿�鍞彴璐�.xlsx");
+ };
+
+ const exportProcessRouteDialogVisible = ref(false);
+
+ const handleExportProcessRoute = () => {
+ if (selectedRows.value.length === 0) {
+ proxy?.$modal?.msgWarning?.("璇烽�夋嫨瑕佸鍑虹殑閿�鍞彴璐�");
+ return;
+ }
+ const salesLedgerIds = selectedRows.value
+ .map(item => item.id)
+ .filter(id => id !== null && id !== undefined && id !== "");
+ if (salesLedgerIds.length === 0) {
+ proxy?.$modal?.msgWarning?.("璇烽�夋嫨瑕佸鍑虹殑閿�鍞彴璐�");
+ return;
+ }
+ exportProcessRouteDialogVisible.value = true;
+ };
+
+ const confirmExportProcessRoute = () => {
+ const salesLedgerIds = selectedRows.value
+ .map(item => item.id)
+ .filter(id => id !== null && id !== undefined && id !== "");
+
+ const params = {
+ salesLedgerIds: salesLedgerIds.join(","),
+ };
+ if (
+ Array.isArray(processRouteExportDateRange.value) &&
+ processRouteExportDateRange.value.length === 2
+ ) {
+ params.completedTimeStart = processRouteExportDateRange.value[0];
+ params.completedTimeEnd = processRouteExportDateRange.value[1];
+ }
+
+ proxy.download(
+ "/sales/ledger/exportProcessRoute",
+ params,
+ "閿�鍞彴璐﹀伐鑹鸿矾绾垮鍑�.xlsx"
+ );
+ exportProcessRouteDialogVisible.value = false;
};
/** 鍒ゆ柇鍗曚釜浜у搧鏄惁宸插彂璐э紙鏍规嵁shippingStatus鍒ゆ柇锛屽凡鍙戣揣鎴栧鏍搁�氳繃涓嶅彲缂栬緫鍜屽垹闄わ級 */
const isProductShipped = product => {
@@ -5292,7 +6386,7 @@
currentFactoryName.value = res.user.currentFactoryName;
};
onMounted(() => {
- getList();
+ handleStatusTabChange(activeStatusTab.value);
customerList().then(res => {
customerOption.value = res;
});
@@ -5342,10 +6436,163 @@
margin-top: unset;
}
+ .sales-ledger-status-bar {
+ display: flex;
+ flex-wrap: wrap;
+ gap: 8px;
+ padding: 12px 14px;
+ margin-bottom: 14px;
+ background: linear-gradient(180deg, #f9fbff 0%, #f2f6ff 100%);
+ border: 1px solid #dbe6ff;
+ border-radius: 12px;
+ }
+
+ .sales-ledger-status-tab {
+ min-width: 88px;
+ height: 34px;
+ padding: 0 14px;
+ border: 1px solid #d7def0;
+ border-radius: 9px;
+ background: #fff;
+ color: #4b5567;
+ font-size: 13px;
+ cursor: pointer;
+ transition: all 0.18s ease;
+ }
+
+ .sales-ledger-status-tab:hover {
+ border-color: #8fb3ff;
+ color: #1d4ed8;
+ }
+
+ .sales-ledger-status-tab.is-active {
+ border-color: #1d4ed8;
+ background: linear-gradient(135deg, #2f67f6 0%, #1d4ed8 100%);
+ color: #fff;
+ box-shadow: 0 8px 18px rgba(29, 78, 216, 0.16);
+ }
+
.actions {
display: flex;
justify-content: space-between;
margin-bottom: 10px;
+ }
+
+ .sales-ledger-toolbar {
+ align-items: flex-start;
+ gap: 14px;
+ padding: 10px 12px;
+ background: #fff;
+ border: 1px solid #e7edf7;
+ border-radius: 12px;
+ }
+
+ .sales-ledger-toolbar-actions {
+ display: flex;
+ flex: 1;
+ flex-wrap: wrap;
+ justify-content: flex-end;
+ gap: 10px;
+ }
+
+ .sales-ledger-toolbar-group {
+ display: flex;
+ flex-wrap: wrap;
+ gap: 8px;
+ padding: 4px;
+ background: #f7f9fc;
+ border: 1px solid #edf1f7;
+ border-radius: 10px;
+ }
+
+ .sales-ledger-toolbar-group--muted {
+ background: #fbfcfe;
+ }
+
+ .sales-ledger-page-header {
+ display: flex;
+ justify-content: space-between;
+ align-items: flex-start;
+ gap: 16px;
+ margin-bottom: 16px;
+ }
+
+ .sales-ledger-page-header-content {
+ flex: 1;
+ }
+
+ .sales-ledger-page-title {
+ font-size: 22px;
+ font-weight: 600;
+ color: #303133;
+ line-height: 1.3;
+ }
+
+ .sales-ledger-page-back {
+ flex-shrink: 0;
+ }
+
+ .sales-ledger-page-subtitle {
+ margin-top: 6px;
+ font-size: 13px;
+ color: #909399;
+ }
+
+ .sales-ledger-page-form {
+ padding: 20px;
+ background: #fff;
+ border-radius: 8px;
+ }
+
+ .sales-ledger-page-actions {
+ display: flex;
+ justify-content: center;
+ gap: 16px;
+ margin-top: 24px;
+ }
+
+ .compact-product-table {
+ :deep(.el-table__cell) {
+ padding: 4px 0;
+ font-size: 12px;
+ }
+
+ :deep(.cell) {
+ line-height: 1.2;
+ }
+
+ :deep(.el-input__wrapper) {
+ padding: 0 8px;
+ }
+
+ :deep(.el-input-number .el-input__wrapper) {
+ padding-left: 8px;
+ padding-right: 8px;
+ }
+
+ :deep(.el-input-number),
+ :deep(.el-select),
+ :deep(.el-input),
+ :deep(.el-tree-select) {
+ font-size: 12px;
+ }
+
+ :deep(.el-input-number .el-input__inner) {
+ height: 28px;
+ font-size: 12px;
+ text-align: left;
+ }
+
+ :deep(.el-select .el-input__inner),
+ :deep(.el-input .el-input__inner) {
+ height: 28px;
+ }
+
+ :deep(.el-button--small),
+ :deep(.el-button.is-link) {
+ font-size: 12px;
+ padding: 2px 4px;
+ }
}
.ledger-qr-dialog {
@@ -5409,6 +6656,22 @@
}
@media (max-width: 768px) {
+ .sales-ledger-status-tab {
+ min-width: unset;
+ flex: 1 1 calc(50% - 8px);
+ }
+
+ .sales-ledger-toolbar,
+ .sales-ledger-page-header {
+ flex-direction: column;
+ align-items: stretch;
+ }
+
+ .sales-ledger-toolbar-actions {
+ width: 100%;
+ justify-content: flex-start;
+ }
+
.approver-node-item {
flex: 0 0 100%;
}
--
Gitblit v1.9.3