| | |
| | | :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"> |
| | |
| | | <ReverseAuditHistory v-if="activeStatusTab === 'reverseReviewed'" /> |
| | | <div v-else> |
| | | <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="请选择" |
| | | 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> |
| | | <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 :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"> |
| | |
| | | <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> |
| | |
| | | @click="handleBulkDelivery" |
| | | :disabled="isBatchButtonDisabled('delivery')">发货</el-button> |
| | | <el-button @click="handleOut">导出</el-button> |
| | | <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: 340px;" /> |
| | | |
| | | <el-button @click="handleExportProcessRoute" |
| | | :disabled="isBatchButtonDisabled('export')">导出工艺路线</el-button> |
| | | </el-space> |
| | |
| | | <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-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"> |
| | |
| | | :row-class-name="tableRowClassName" |
| | | show-summary |
| | | style="width: 100%" |
| | | :summary-method="summarizeMainTable" |
| | | height="calc(100vh - 22em)"> |
| | | height="calc(100vh - 23em)" |
| | | :summary-method="summarizeMainTable"> |
| | | <el-table-column align="center" |
| | | type="selection" |
| | | width="55" |
| | |
| | | width="60" /> |
| | | <el-table-column label="订单号" |
| | | prop="salesContractNo" |
| | | width="180" |
| | | min-width="160" |
| | | show-overflow-tooltip> |
| | | <template #default="scope"> |
| | | <el-button link |
| | |
| | | </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" |
| | | 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" |
| | | type="info">未发货</el-tag> |
| | | type="info">未出库</el-tag> |
| | | <el-tag v-else-if="Number(scope.row.deliveryStatus) === 2" |
| | | type="warning">审批中</el-tag> |
| | | <el-tag v-else-if="Number(scope.row.deliveryStatus) === 3" |
| | |
| | | <el-tag v-else-if="Number(scope.row.deliveryStatus) === 4" |
| | | type="primary">审批通过</el-tag> |
| | | <el-tag v-else-if="Number(scope.row.deliveryStatus) === 5" |
| | | type="success">已发货</el-tag> |
| | | type="success">已出库</el-tag> |
| | | <el-tag v-else-if="Number(scope.row.deliveryStatus) === 6" |
| | | type="warning">部分发货</el-tag> |
| | | <el-tag v-else |
| | |
| | | </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" |
| | |
| | | type="info">-</el-tag> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="订单状态" |
| | | width="120" |
| | | align="center"> |
| | | <template #default="scope"> |
| | | <el-tag v-if="Number(scope.row.orderStatus) === 1" |
| | | type="success">已完成</el-tag> |
| | | <el-tag v-else |
| | | type="info">进行中</el-tag> |
| | | </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> |
| | |
| | | </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" |
| | | 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 |
| | | type="primary" |
| | | @click="openForm('edit', scope.row)" |
| | | :disabled="Number(scope.row.orderStatus) === 1">编辑</el-button> |
| | | @click="openForm('edit', scope.row)">编辑</el-button> |
| | | <el-button link |
| | | type="primary" |
| | | @click="openProcessFlowSelect(scope.row)" |
| | | :disabled="Number(scope.row.reviewStatus) !== 1 || Number(scope.row.orderStatus) === 1">工艺路线</el-button> |
| | | :disabled="Number(scope.row.reviewStatus) !== 1">工艺路线</el-button> |
| | | <el-button link |
| | | type="primary" |
| | | @click="downLoadFile(scope.row)">附件</el-button> |
| | | <el-button link |
| | | type="primary" |
| | | @click="openLedgerQrDialog(scope.row)" |
| | | :disabled="Number(scope.row.orderStatus) === 1">二维码</el-button> |
| | | @click="openLedgerQrDialog(scope.row)">二维码</el-button> |
| | | </template> |
| | | </el-table-column> |
| | | </el-table> |
| | |
| | | @pagination="paginationChange" /> |
| | | </div> |
| | | </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' ? '查看销售台账页面' : '编辑销售台账页面'" |
| | | :title="operationType === 'add' ? '新增销售台账页面' : operationType === 'view' ? '查看销售台账页面' : '编辑销售台账页面'" |
| | | :width="'70%'" |
| | | :operation-type="isCompletedOrder || operationType === 'view' ? 'detail' : operationType" |
| | | :operation-type="operationType === 'view' ? 'detail' : operationType" |
| | | @close="closeDia" |
| | | @confirm="submitForm" |
| | | @cancel="closeDia"> |
| | |
| | | :disabled="operationType === 'view' || 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="operationType === 'view' || isReviewedEdit" /> |
| | | </el-form-item> |
| | | </el-col> |
| | | |
| | | </el-row> |
| | | <el-row :gutter="30"> |
| | | <el-col :span="12"> |
| | |
| | | :on-success="handleUploadSuccess" |
| | | :on-remove="handleRemove"> |
| | | <el-button type="primary" |
| | | v-if="operationType !== 'view' || isCompletedOrder">上传</el-button> |
| | | v-if="operationType !== 'view'">上传</el-button> |
| | | <template #tip |
| | | v-if="operationType !== 'view' || isCompletedOrder"> |
| | | v-if="operationType !== 'view'"> |
| | | <div class="el-upload__tip"> |
| | | 文件格式支持 |
| | | doc,docx,xls,xlsx,ppt,pptx,pdf,txt,xml,jpg,jpeg,png,gif,bmp,rar,zip,7z |
| | |
| | | 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"; |
| | |
| | | getSalesLabel, |
| | | salesStock, |
| | | counterReview, |
| | | markOrderCompleted, |
| | | incrementPrintCount, |
| | | } from "@/api/salesManagement/salesLedger.js"; |
| | | import { modelList, productTreeList } from "@/api/basicData/product.js"; |
| | |
| | | const tableLoading = ref(false); |
| | | const page = reactive({ |
| | | current: 1, |
| | | size: 100, |
| | | size: 50, |
| | | }); |
| | | const total = ref(0); |
| | | const fileList = ref([]); |
| | |
| | | ? "编辑完成后将自动返回销售台账列表" |
| | | : "新增完成后将自动返回销售台账列表" |
| | | ); |
| | | |
| | | 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) |
| | |
| | | // 用户信息表单弹框数据 |
| | | const operationType = ref(""); |
| | | const dialogFormVisible = ref(false); |
| | | // 已完成订单标记:view 模式但附件上传仍可用 |
| | | const isCompletedOrder = ref(false); |
| | | |
| | | // 已审核订单编辑模式:只能修改单价,其他字段禁用 |
| | | const isReviewedEdit = ref(false); |
| | | const data = reactive({ |
| | |
| | | entryDate: null, // 录入日期 |
| | | entryDateStart: undefined, |
| | | entryDateEnd: undefined, |
| | | deliveryStatus: undefined, // 发货状态:1未发货 2审批中 3审批不通过 4审批通过 5已发货 6部分发货 |
| | | deliveryStatus: undefined, // 发货状态:1未出库 2审批中 3审批不通过 4审批通过 5已出库 6部分发货 |
| | | stockStatus: undefined, // 入库状态:0未入库 1部分入库 2已入库 |
| | | reviewStatus: undefined, // 审核状态:0待审核 1已审核 2已反审 |
| | | orderStatus: undefined, // 订单状态:0进行中 1已完成 |
| | | }, |
| | | form: { |
| | | salesContractNo: "", |
| | |
| | | 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); |
| | | |
| | | // 新增台账:录入日期变更时,交货日期默认保持为录入日期后第 7 天 |
| | | watch( |
| | | () => [operationType.value, form.value?.entryDate], |
| | | () => { |
| | | if (operationType.value !== "add") return; |
| | | const ed = form.value?.entryDate; |
| | | if (!ed) return; |
| | | form.value.deliveryDate = dayjs(ed).add(7, "day").format("YYYY-MM-DD"); |
| | | } |
| | | ); |
| | | |
| | | // 产品表单弹框数据 |
| | | const productFormVisible = ref(false); |
| | | const productOperationType = ref(""); |
| | |
| | | if (operationType.value === "view") return; |
| | | if (!row) return; |
| | | if (isProductShipped(row)) { |
| | | proxy.$modal.msgWarning("已发货或审核通过的产品不能复制"); |
| | | proxy.$modal.msgWarning("已出库或审核通过的产品不能复制"); |
| | | return; |
| | | } |
| | | const hasBlockingEditingRow = (productData.value || []).some( |
| | |
| | | if (operationType.value === "view") return; |
| | | if (!row) return; |
| | | if (isProductShipped(row)) { |
| | | proxy.$modal.msgWarning("已发货或审核通过的产品不能编辑"); |
| | | proxy.$modal.msgWarning("已出库或审核通过的产品不能编辑"); |
| | | return; |
| | | } |
| | | if (!discardPlaceholderRowIfPristine()) return; |
| | |
| | | if (operationType.value === "view") return; |
| | | if (!row) return; |
| | | if (isProductShipped(row)) { |
| | | proxy.$modal.msgWarning("已发货或审核通过的产品不能编辑"); |
| | | proxy.$modal.msgWarning("已出库或审核通过的产品不能编辑"); |
| | | return; |
| | | } |
| | | // 确保 productForm 指向当前行,以复用计算逻辑 |
| | |
| | | if (!row) return; |
| | | if (operationType.value === "view") return; |
| | | if (isProductShipped(row)) { |
| | | proxy.$modal.msgWarning("已发货或审核通过的产品不能编辑"); |
| | | proxy.$modal.msgWarning("已出库或审核通过的产品不能编辑"); |
| | | return; |
| | | } |
| | | ensureProductRowDefaults(row); |
| | |
| | | if (!row) return; |
| | | if (operationType.value === "view") return; |
| | | if (isProductShipped(row)) { |
| | | proxy.$modal.msgWarning("已发货或审核通过的产品不能编辑"); |
| | | proxy.$modal.msgWarning("已出库或审核通过的产品不能编辑"); |
| | | return; |
| | | } |
| | | ensureProductRowDefaults(row); |
| | |
| | | shipped: "/sales/ledger/salesHistory/shippingImportTemplate", |
| | | }; |
| | | const HISTORY_IMPORT_TEMPLATE_FILE_NAME_MAP = { |
| | | notShipped: "销售发货历史数据导入模板-未发货.xlsx", |
| | | shipped: "销售发货历史数据导入模板-已发货.xlsx", |
| | | notShipped: "销售发货历史数据导入模板-未出库.xlsx", |
| | | shipped: "销售发货历史数据导入模板-已出库.xlsx", |
| | | }; |
| | | const currentImportCommand = ref("default"); |
| | | const activeStatusTab = ref("all"); |
| | |
| | | { key: "reviewed", label: "已审核" }, |
| | | { key: "reverseReviewed", label: "反审核" }, |
| | | { key: "stocked", label: "已入库" }, |
| | | { key: "delivered", label: "已发货" }, |
| | | { key: "completed", label: "已完成" }, |
| | | { key: "delivered", label: "已出库" }, |
| | | ]; |
| | | |
| | | const resetStatusFilters = () => { |
| | | searchForm.reviewStatus = undefined; |
| | | searchForm.stockStatus = undefined; |
| | | searchForm.deliveryStatus = undefined; |
| | | searchForm.orderStatus = undefined; |
| | | }; |
| | | |
| | | const handleStatusTabChange = tabKey => { |
| | |
| | | case "delivered": |
| | | searchForm.deliveryStatus = 5; |
| | | break; |
| | | case "completed": |
| | | searchForm.orderStatus = 1; |
| | | break; |
| | | default: |
| | | break; |
| | | } |
| | |
| | | handleQuery(); |
| | | }; |
| | | |
| | | /** 批量按钮禁用判断:根据选中行的审核状态和订单状态控制按钮可用性 |
| | | /** 批量按钮禁用判断:根据选中行的审核状态控制按钮可用性 |
| | | * 未审核(0):只能审核、删除、编辑 |
| | | * 已审核(1):可以反审、入库、发货、导出、打印、工艺路线 |
| | | * 已完成(orderStatus=1):所有操作按钮禁用 |
| | | * 未选中任何行时所有批量按钮禁用 |
| | | */ |
| | | const isBatchButtonDisabled = (action) => { |
| | | if (selectedRows.value.length === 0) return true; |
| | | const hasCompleted = selectedRows.value.some(r => Number(r.orderStatus) === 1); |
| | | // 已完成订单:所有操作按钮禁用 |
| | | if (hasCompleted && action !== 'markCompleted') return true; |
| | | const statuses = selectedRows.value.map(r => Number(r.reviewStatus)); |
| | | const allUnreviewed = statuses.every(s => s === 0); |
| | | const allReviewed = statuses.every(s => s === 1); |
| | |
| | | return !allUnreviewed; |
| | | case 'print': |
| | | return !allReviewed; |
| | | case 'markCompleted': |
| | | // 只有已审核且未完成的订单才能标记完成 |
| | | return !allReviewed || hasCompleted; |
| | | default: |
| | | return false; |
| | | } |
| | |
| | | } |
| | | }; |
| | | |
| | | /** 标记完成操作 */ |
| | | const handleMarkCompleted = async () => { |
| | | if (selectedRows.value.length === 0) { |
| | | proxy.$modal.msgWarning("请选择要标记完成的数据"); |
| | | return; |
| | | } |
| | | const cannotComplete = selectedRows.value.filter( |
| | | row => Number(row.reviewStatus) !== 1 || Number(row.orderStatus) === 1 |
| | | ); |
| | | if (cannotComplete.length > 0) { |
| | | proxy.$modal.msgWarning("选中的数据中包含非已审核或已完成的项,请重新选择"); |
| | | return; |
| | | } |
| | | try { |
| | | await ElMessageBox.confirm( |
| | | "标记完成后订单将变为只读,只能查看和上传下载附件,不可撤销。是否确认?", |
| | | "提示", |
| | | { confirmButtonText: "确定", cancelButtonText: "取消", type: "warning" } |
| | | ); |
| | | const ids = selectedRows.value.map(row => row.id); |
| | | await markOrderCompleted({ ids }); |
| | | proxy.$modal.msgSuccess("标记完成成功"); |
| | | getList(); |
| | | } catch { |
| | | // 用户取消 |
| | | } |
| | | }; |
| | | |
| | | |
| | | /** 用预填数据打开新增台账页面(重新生成场景) */ |
| | | const openFormWithPreFill = async (detail, keepPageMode = false) => { |
| | |
| | | form.value.entryPerson = Number(userStore.id); |
| | | form.value.entryDate = getCurrentDate(); |
| | | form.value.executionDate = detail.executionDate || getCurrentDate(); |
| | | form.value.deliveryDate = detail.deliveryDate; |
| | | form.value.paymentMethod = detail.paymentMethod; |
| | | form.value.contractAmount = detail.contractAmount; |
| | | form.value.remarks = detail.remarks; |
| | | 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"); |
| | | await appendEditablePlaceholderRow(); |
| | | dialogFormVisible.value = !keepPageMode; |
| | | }; |
| | |
| | | |
| | | // 添加表行类名方法 |
| | | const tableRowClassName = ({ row }) => { |
| | | if (!row.deliveryDate) return ""; |
| | | if (!row.deliveryDate || row.stockStatus === 0) return ""; |
| | | if (row.isFh) return ""; |
| | | |
| | | const diff = row.deliveryDaysDiff; |
| | |
| | | |
| | | const initAddFormState = async () => { |
| | | operationType.value = "add"; |
| | | isCompletedOrder.value = false; |
| | | isReviewedEdit.value = false; |
| | | form.value = {}; |
| | | productData.value = []; |
| | |
| | | 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 = []; |
| | |
| | | await enterEditPage(row); |
| | | return; |
| | | } |
| | | // 已完成订单强制为只读模式,但附件上传仍可用 |
| | | const isCompleted = Number(row?.orderStatus) === 1; |
| | | const effectiveType = isCompleted ? 'view' : type; |
| | | operationType.value = effectiveType; |
| | | isCompletedOrder.value = isCompleted; |
| | | operationType.value = type; |
| | | form.value = {}; |
| | | productData.value = []; |
| | | selectedQuotation.value = null; |
| | | // 已审核订单编辑时,标记只能修改单价(已完成订单已强制view,此处不会再命中) |
| | | isReviewedEdit.value = effectiveType === "edit" && Number(row?.reviewStatus) === 1; |
| | | // 已审核订单编辑时,标记只能修改单价 |
| | | isReviewedEdit.value = type === "edit" && Number(row?.reviewStatus) === 1; |
| | | let userLists = await userListNoPage(); |
| | | userList.value = userLists.data; |
| | | customerList().then(res => { |
| | |
| | | // } |
| | | // }); |
| | | form.value.entryDate = getCurrentDate(); // 设置默认录入日期为当前日期 |
| | | if (type === "add") { |
| | | form.value.deliveryDate = dayjs(form.value.entryDate) |
| | | .add(7, "day") |
| | | .format("YYYY-MM-DD"); |
| | | } |
| | | |
| | | dialogFormVisible.value = true; |
| | | }; |
| | | |
| | |
| | | proxy.resetForm("formRef"); |
| | | } |
| | | dialogFormVisible.value = false; |
| | | isCompletedOrder.value = false; |
| | | isReviewedEdit.value = false; |
| | | if (!isFormPageMode.value) { |
| | | fileList.value = []; |
| | |
| | | const productIndex = ref(0); |
| | | // 打开产品弹框 |
| | | const openProductForm = async (type, row, index) => { |
| | | // 编辑时检查产品是否已发货或审核通过 |
| | | // 编辑时检查产品是否已出库或审核通过 |
| | | if (type === "edit" && isProductShipped(row)) { |
| | | proxy.$modal.msgWarning("已发货或审核通过的产品不能编辑"); |
| | | proxy.$modal.msgWarning("已出库或审核通过的产品不能编辑"); |
| | | return; |
| | | } |
| | | |
| | |
| | | return; |
| | | } |
| | | |
| | | // 检查是否有已发货或审核通过的产品 |
| | | // 检查是否有已出库或审核通过的产品 |
| | | const shippedProducts = productSelectedRows.value.filter(row => |
| | | isProductShipped(row) |
| | | ); |
| | | if (shippedProducts.length > 0) { |
| | | proxy.$modal.msgWarning("已发货或审核通过的产品不能删除"); |
| | | proxy.$modal.msgWarning("已出库或审核通过的产品不能删除"); |
| | | return; |
| | | } |
| | | |
| | |
| | | proxy.download("/sales/ledger/exportWithProducts", params, "销售台账.xlsx"); |
| | | }; |
| | | |
| | | const exportProcessRouteDialogVisible = ref(false); |
| | | |
| | | const handleExportProcessRoute = () => { |
| | | if (selectedRows.value.length === 0) { |
| | | proxy?.$modal?.msgWarning?.("请选择要导出的销售台账"); |
| | |
| | | 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(","), |
| | |
| | | params, |
| | | "销售台账工艺路线导出.xlsx" |
| | | ); |
| | | exportProcessRouteDialogVisible.value = false; |
| | | }; |
| | | /** 判断单个产品是否已发货(根据shippingStatus判断,已发货或审核通过不可编辑和删除) */ |
| | | /** 判断单个产品是否已出库(根据shippingStatus判断,已出库或审核通过不可编辑和删除) */ |
| | | const isProductShipped = product => { |
| | | if (!product) return false; |
| | | const status = String(product.shippingStatus || "").trim(); |
| | | // 如果发货状态是"已发货"或"审核通过",则不可编辑和删除 |
| | | return status === "已发货" || status === "审核通过"; |
| | | // 如果发货状态是"已出库"或"审核通过",则不可编辑和删除 |
| | | return status === "已出库" || status === "审核通过"; |
| | | }; |
| | | |
| | | /** 判断销售订单下是否存在已发货/发货完成的产品(不可删除) */ |
| | | /** 判断销售订单下是否存在已出库/发货完成的产品(不可删除) */ |
| | | const hasShippedProducts = products => { |
| | | if (!products || !products.length) return false; |
| | | return products.some(p => { |
| | | const status = String(p.shippingStatus || "").trim(); |
| | | // 有发货日期或车牌号视为已发货 |
| | | // 有发货日期或车牌号视为已出库 |
| | | if (p.shippingDate || p.shippingCarNumber) return true; |
| | | // 已进行发货、发货完成、已发货 均不可删除 |
| | | // 已进行发货、发货完成、已出库 均不可删除 |
| | | return ( |
| | | status === "已进行发货" || status === "发货完成" || status === "已发货" |
| | | status === "已进行发货" || status === "发货完成" || status === "已出库" |
| | | ); |
| | | }); |
| | | }; |
| | |
| | | * @param row 行数据 |
| | | */ |
| | | const getShippingStatusText = row => { |
| | | // 如果已发货(有发货日期或车牌号),显示"已发货" |
| | | // 如果已出库(有发货日期或车牌号),显示"已出库" |
| | | if (row.shippingDate || row.shippingCarNumber) { |
| | | return "已发货"; |
| | | return "已出库"; |
| | | } |
| | | |
| | | // 获取发货状态字段 |
| | |
| | | 审核中: "审核中", |
| | | 审核拒绝: "审核拒绝", |
| | | 审核通过: "审核通过", |
| | | 已发货: "已发货", |
| | | 已出库: "已出库", |
| | | }; |
| | | return statusTextMap[statusStr] || "待发货"; |
| | | }; |
| | |
| | | * @param row 行数据 |
| | | */ |
| | | const getShippingStatusType = row => { |
| | | // 如果已发货(有发货日期或车牌号),显示绿色 |
| | | // 如果已出库(有发货日期或车牌号),显示绿色 |
| | | if (row.shippingDate || row.shippingCarNumber) { |
| | | return "success"; |
| | | } |
| | |
| | | 审核中: "warning", |
| | | 审核拒绝: "danger", |
| | | 审核通过: "success", |
| | | 已发货: "success", |
| | | 已出库: "success", |
| | | }; |
| | | return typeTextMap[statusStr] || "info"; |
| | | }; |
| | |
| | | return false; |
| | | } |
| | | |
| | | // 台账级发货状态(deliveryStatus):2审批中、5已发货 时不可再发起本行发货;6部分发货仍可按明细继续发 |
| | | // 台账级发货状态(deliveryStatus):2审批中、5已出库 时不可再发起本行发货;6部分发货仍可按明细继续发 |
| | | const deliveryStatus = row.deliveryStatus; |
| | | if ( |
| | | deliveryStatus !== null && |
| | |
| | | // 获取发货状态 |
| | | const shippingStatus = row.shippingStatus; |
| | | |
| | | // 如果已发货(有发货日期或车牌号),不能再次发货 |
| | | // 如果已出库(有发货日期或车牌号),不能再次发货 |
| | | if (row.shippingDate || row.shippingCarNumber) { |
| | | return false; |
| | | } |
| | |
| | | return; |
| | | } |
| | | |
| | | // 允许:1未发货、3审批不通过、4审批通过、6部分发货;不允许:2审批中、5已发货 |
| | | // 允许:1未出库、3审批不通过、4审批通过、6部分发货;不允许:2审批中、5已出库 |
| | | const statusItem = selectedRows.value[0].deliveryStatus; |
| | | const ledgerAllowsDelivery = s => [1, 3, 4, 6].includes(Number(s)); |
| | | let isTrue = true; |
| | | selectedRows.value.forEach(row => { |
| | | if (!ledgerAllowsDelivery(row.deliveryStatus)) { |
| | | proxy.$modal.msgWarning( |
| | | "仅未发货、审批不通过、审批通过或部分发货的台账可以发货" |
| | | "仅未出库、审批不通过、审批通过或部分发货的台账可以发货" |
| | | ); |
| | | isTrue = false; |
| | | return; |
| | |
| | | ); |
| | | if (shippedLedgers.length === selectedRows.value.length) { |
| | | try { |
| | | await ElMessageBox.alert("所选销售台账均已发货,不能再次发货。", "提示", { |
| | | await ElMessageBox.alert("所选销售台账均已出库,不能再次发货。", "提示", { |
| | | type: "warning", |
| | | confirmButtonText: "知道了", |
| | | }); |
| | |
| | | if (shippedLedgers.length > 0) { |
| | | try { |
| | | await ElMessageBox.alert( |
| | | "选中的销售台账中包含已发货记录,已发货的不能再次发货,系统将仅为未发货台账处理。", |
| | | "选中的销售台账中包含已出库记录,已出库的不能再次发货,系统将仅为未出库台账处理。", |
| | | "提示", |
| | | { |
| | | type: "warning", |
| | |
| | | const status = Number(row.deliveryStatus); |
| | | if (![1, 3, 4, 6].includes(status)) { |
| | | proxy.$modal.msgWarning( |
| | | "只有发货状态为未发货、审批不通过、审批通过或部分发货的记录才可以发货" |
| | | "只有发货状态为未出库、审批不通过、审批通过或部分发货的记录才可以发货" |
| | | ); |
| | | return; |
| | | } |