You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
3383 lines
120 KiB
3383 lines
120 KiB
<template>
|
|
<div class="customer-css">
|
|
<!-- 查询条件 -->
|
|
<el-form :inline="true" label-position="top" class="search-form-inline">
|
|
<div class="search-row">
|
|
<el-form-item v-if="!isSupplierPageMode" class="search-item">
|
|
<span style="cursor: pointer" slot="label" @click="getBaseList(520)"><a href="#">供应商编码</a></span>
|
|
<el-input v-model="searchData.supplierNo" style="width: 120px" @keyup.enter.native="getMainData"/>
|
|
</el-form-item>
|
|
<el-form-item v-if="!isSupplierPageMode" label="供应商名称" class="search-item">
|
|
<el-input v-model="searchData.supplierName" style="width: 250px" @keyup.enter.native="getMainData"/>
|
|
</el-form-item>
|
|
<el-form-item v-if="!isSupplierPageMode" class="search-item">
|
|
<span style="cursor: pointer" slot="label" @click="getBaseList(530, 'mainPlanner')"><a href="#">Planner</a></span>
|
|
<el-input v-model="searchData.planner" clearable style="width: 120px" @keyup.enter.native="getMainData"/>
|
|
</el-form-item>
|
|
<el-form-item label="申请日期" class="search-item">
|
|
<div class="date-range">
|
|
<el-date-picker v-model="searchData.requestDateStart" type="date" value-format="yyyy-MM-dd" placeholder="开始" style="width: 150px"/>
|
|
<span class="split">-</span>
|
|
<el-date-picker v-model="searchData.requestDateEnd" type="date" value-format="yyyy-MM-dd" placeholder="结束" style="width: 150px"/>
|
|
</div>
|
|
</el-form-item>
|
|
<el-form-item label="状态" class="search-item">
|
|
<el-select v-model="searchData.status" clearable placeholder="全部" style="width: 60%">
|
|
<el-option label="全部" value="" />
|
|
<el-option label="草稿" value="Draft" />
|
|
<el-option label="待审核" value="Confirmed" />
|
|
<el-option label="已下达" value="Audited" />
|
|
<el-option label="已排程" value="Scheduled" />
|
|
<el-option label="申请变更中" value="ChangeApplying" />
|
|
<el-option label="验货中" value="Inspecting" />
|
|
<el-option label="验货完成" value="InspectionCompleted" />
|
|
|
|
<el-option label="已完成" value="Completed" />
|
|
<el-option label="已取消" value="Cancelled" />
|
|
</el-select>
|
|
</el-form-item>
|
|
|
|
</div>
|
|
|
|
<div class="search-row">
|
|
<el-form-item v-if="!isSupplierPageMode" class="search-item">
|
|
<span style="cursor: pointer" slot="label" @click="getBaseList(2016, 'createBy')"><a href="#">申请人员</a></span>
|
|
<el-input v-model="searchData.createBy" clearable style="width: 120px" @keyup.enter.native="getMainData"/>
|
|
</el-form-item>
|
|
<el-form-item v-if="!isSupplierPageMode" class="search-item">
|
|
<span style="cursor: pointer" slot="label" @click="getBaseList(2016, 'qcOperator')"><a href="#">QC人员</a></span>
|
|
<el-input v-model="searchData.qcOperator" clearable style="width: 120px" @keyup.enter.native="getMainData"/>
|
|
</el-form-item>
|
|
<el-form-item label="申请单号" class="search-item">
|
|
<el-input v-model="searchData.requestNo" style="width: 120px" @keyup.enter.native="getMainData"/>
|
|
</el-form-item>
|
|
<el-form-item label="建议验货日期" class="search-item">
|
|
<div class="date-range">
|
|
<el-date-picker v-model="searchData.needInspectDateStart" type="date" value-format="yyyy-MM-dd" placeholder="开始" style="width: 150px"/>
|
|
<span class="split">-</span>
|
|
<el-date-picker v-model="searchData.needInspectDateEnd" type="date" value-format="yyyy-MM-dd" placeholder="结束" style="width: 150px"/>
|
|
</div>
|
|
</el-form-item>
|
|
<el-form-item v-if="!isSupplierPageMode" label="计划验货日期" class="search-item">
|
|
<div class="date-range">
|
|
<el-date-picker v-model="searchData.planStartDate" type="date" value-format="yyyy-MM-dd" placeholder="开始" style="width: 150px"/>
|
|
<span class="split">-</span>
|
|
<el-date-picker v-model="searchData.planEndDate" type="date" value-format="yyyy-MM-dd" placeholder="结束" style="width: 150px"/>
|
|
</div>
|
|
</el-form-item>
|
|
<el-form-item label=" " class="search-item search-btn-item">
|
|
<el-button type="primary" @click="getMainData" style="">查询</el-button>
|
|
<el-button type="primary" @click="addInspectionRequest" style="margin-left: 2px">新增</el-button>
|
|
<el-button type="primary" @click="importExcel" style="margin-left: 2px">Excel导入</el-button>
|
|
<el-button type="primary" @click="exportExcel" style="margin-left: 2px">导出</el-button>
|
|
</el-form-item>
|
|
</div>
|
|
</el-form>
|
|
|
|
<Chooselist ref="baseList" @getBaseData="getBaseData"></Chooselist>
|
|
|
|
<el-table
|
|
:height="height"
|
|
:data="mainDataList"
|
|
border
|
|
ref="mainTable"
|
|
highlight-current-row
|
|
@row-click="changeData"
|
|
v-loading="dataListLoading"
|
|
style="margin-top: 0px; width: 100%;">
|
|
<el-table-column
|
|
v-for="(item,index) in columnArray1" :key="index"
|
|
:sortable="item.columnSortable"
|
|
:prop="item.columnProp"
|
|
:header-align="item.headerAlign"
|
|
:show-overflow-tooltip="item.showOverflowTooltip"
|
|
:align="item.align"
|
|
:fixed="item.fixed==''?false:item.fixed"
|
|
:min-width="item.columnWidth"
|
|
:label="item.columnLabel">
|
|
<template slot-scope="scope">
|
|
<span v-if="!item.columnHidden">{{ scope.row[item.columnProp] }}</span>
|
|
<span v-if="item.columnImage"><img :src="scope.row[item.columnProp]"
|
|
style="width: 100px; height: 100px"/></span>
|
|
</template>
|
|
</el-table-column>
|
|
<el-table-column fixed="right" header-align="center" align="center" width="120" label="操作">
|
|
<template slot-scope="scope">
|
|
<a v-if="isRowStatus(scope.row, ['Draft'])"
|
|
class="customer-a" @click="confirmInspection(scope.row)">确认</a>
|
|
<a v-if="isRowStatus(scope.row, ['Draft', 'Confirmed'])"
|
|
class="customer-a"
|
|
:style="isRowStatus(scope.row, ['Draft']) ? 'margin-left: 3px;' : ''"
|
|
@click="deleteInspectionRequest(scope.row)">删除</a>
|
|
<a v-if="isRowStatus(scope.row, ['Draft'])"
|
|
class="customer-a"
|
|
:style="(isRowStatus(scope.row, ['Draft']) || isRowStatus(scope.row, ['Confirmed'])) ? 'margin-left: 3px;' : ''"
|
|
@click="editInspectionRequest(scope.row)">编辑</a>
|
|
<a v-if="isRowStatus(scope.row, ['Audited', 'Scheduled'])"
|
|
class="customer-a"
|
|
:style="(isRowStatus(scope.row, ['Draft']) || isRowStatus(scope.row, ['Confirmed'])) ? 'margin-left: 3px;' : ''"
|
|
@click="applyChangeRequest(scope.row)">申请变更</a>
|
|
<span v-if="!isRowStatus(scope.row, ['Draft', 'Confirmed', 'Audited', 'Scheduled'])"
|
|
class="customer-a"
|
|
style="color: #909399; cursor: default;">{{ scope.row.status }}</span>
|
|
</template>
|
|
</el-table-column>
|
|
</el-table>
|
|
|
|
<el-dialog
|
|
title="申请变更"
|
|
:visible.sync="applyChangeDialogVisible"
|
|
width="480px"
|
|
v-drag
|
|
append-to-body
|
|
:close-on-click-modal="false">
|
|
<el-form label-position="top">
|
|
<el-form-item label="申请单号">
|
|
<el-input v-model="applyChangeForm.requestNo" readonly />
|
|
</el-form-item>
|
|
<el-form-item label="变更备注">
|
|
<el-input
|
|
v-model="applyChangeForm.changeRemark"
|
|
type="textarea"
|
|
resize="none"
|
|
:autosize="{ minRows: 3, maxRows: 3 }"
|
|
placeholder="请填写变更备注" />
|
|
</el-form-item>
|
|
</el-form>
|
|
|
|
<el-footer style="height:25px;margin-top: 45px;text-align:center">
|
|
<el-button type="primary" :loading="applyChangeLoading" @click="submitApplyChangeRequest">保存</el-button>
|
|
<el-button :disabled="applyChangeLoading" @click="applyChangeDialogVisible = false">取消</el-button>
|
|
</el-footer>
|
|
</el-dialog>
|
|
|
|
<!-- 分页插件 -->
|
|
<el-pagination style="margin-top: 0px"
|
|
@size-change="sizeChangeHandle"
|
|
@current-change="currentChangeHandle"
|
|
:current-page="pageIndex"
|
|
:page-sizes="[20, 50, 100, 200, 500]"
|
|
:page-size="pageSize"
|
|
:total="totalPage"
|
|
layout="total, sizes, prev, pager, next, jumper">
|
|
</el-pagination>
|
|
|
|
<!-- 详情页签 -->
|
|
<el-tabs v-model="activeTab" style="margin-top: 0px; width: 99%;" @tab-click="handleTabClick" class="customer-tab" type="border-card">
|
|
<!-- 基本信息 -->
|
|
<el-tab-pane label="基本信息" name="base">
|
|
<div class="tab-pane-content" :style="tabPaneContentStyle">
|
|
<inspection-request-detail ref="inspectionRequestDetail" :detail-data="currentRow" @update-success="getMainData"/>
|
|
</div>
|
|
</el-tab-pane>
|
|
<!-- 验货明细 -->
|
|
<el-tab-pane label="验货明细" name="detail">
|
|
<div class="tab-pane-content" :style="tabPaneContentStyle">
|
|
<inspection-request-detail-tab ref="inspectionDetailTab" :detail-data="currentRow" :table-height="tabTableHeight" />
|
|
</div>
|
|
</el-tab-pane>
|
|
<!-- 验货关联PO明细 -->
|
|
<el-tab-pane label="验货关联PO明细" name="poDetail">
|
|
<div class="tab-pane-content" :style="tabPaneContentStyle">
|
|
<inspection-request-po-detail-tab ref="poDetailTab" :detail-data="currentRow" :table-height="tabTableHeight" />
|
|
</div>
|
|
</el-tab-pane>
|
|
<!-- 验货结果 -->
|
|
<el-tab-pane label="验货结果" name="result">
|
|
<div class="tab-pane-content" :style="tabPaneContentStyle">
|
|
<inspection-result-tab ref="resultTab" :detail-data="currentRow" :table-height="tabTableHeight" />
|
|
</div>
|
|
</el-tab-pane>
|
|
<!-- 费用明细(供应商专用页不展示) -->
|
|
<el-tab-pane v-if="!isSupplierPageMode" label="费用明细" name="fee">
|
|
<div class="tab-pane-content" :style="tabPaneContentStyle">
|
|
<inspection-request-fee-tab ref="feeTab" :detail-data="currentRow" :table-height="tabTableHeight" />
|
|
</div>
|
|
</el-tab-pane>
|
|
<!-- 附件管理(供应商专用页不展示) -->
|
|
<el-tab-pane v-if="!isSupplierPageMode" label="附件管理" name="attachment">
|
|
<div class="tab-pane-content" :style="tabPaneContentStyle">
|
|
<inspection-request-attachment-tab ref="attachmentTab" :detail-data="currentRow" :table-height="tabTableHeight" />
|
|
</div>
|
|
</el-tab-pane>
|
|
</el-tabs>
|
|
|
|
<!-- 新增弹窗 -->
|
|
<el-dialog
|
|
:title="isEditDialogMode ? '编辑验货申请' : '新增验货申请'"
|
|
v-drag
|
|
:visible.sync="addDialogVisible"
|
|
width="1050px"
|
|
top="5vh"
|
|
:close-on-click-modal="false"
|
|
@close="handleCloseAddDialog">
|
|
|
|
<el-form :model="addFormData" :rules="addRules" ref="addFormData" label-width="90px" size="mini" class="add-dialog-form">
|
|
<div class="form-section">
|
|
<el-row :gutter="10">
|
|
<el-col :span="6">
|
|
<el-form-item label="申请单号" prop="requestNo">
|
|
<el-input v-model="addFormData.requestNo" :placeholder="isEditDialogMode ? '' : '自动生成'" disabled size="mini"></el-input>
|
|
</el-form-item>
|
|
</el-col>
|
|
<el-col :span="6">
|
|
<el-form-item label="申请日期" prop="requestDate">
|
|
<el-date-picker
|
|
v-model="addFormData.requestDate"
|
|
type="date"
|
|
value-format="yyyy-MM-dd"
|
|
placeholder="选择日期"
|
|
:disabled="isEditDialogMode"
|
|
size="mini"
|
|
style="width: 100%">
|
|
</el-date-picker>
|
|
</el-form-item>
|
|
</el-col>
|
|
<el-col :span="12">
|
|
<el-form-item label=" " >
|
|
<div style="height: 28px;"></div>
|
|
</el-form-item>
|
|
</el-col>
|
|
</el-row>
|
|
|
|
<el-row :gutter="10">
|
|
<el-col :span="6">
|
|
<el-form-item prop="supplierNo"><span slot="label" :class="{ 'choose-label': !isEditDialogMode && !isSupplierPageMode }" @click="!isEditDialogMode && !isSupplierPageMode && openPoSupplierDialog()">供应商编码</span>
|
|
<el-input
|
|
v-model="addFormData.supplierNo"
|
|
readonly
|
|
size="mini">
|
|
</el-input>
|
|
</el-form-item>
|
|
</el-col>
|
|
<el-col :span="10">
|
|
<el-form-item label="供应商名称" prop="supplierName">
|
|
<el-input v-model="addFormData.supplierName" disabled size="mini"></el-input>
|
|
</el-form-item>
|
|
</el-col>
|
|
<el-col :span="8">
|
|
<el-form-item label=" " >
|
|
<el-button v-if="!isEditDialogMode && !isSupplierPageMode" type="primary" size="medium" style="margin-top:13px;" @click="openOrderSupplierDialog">从订单选择供应商</el-button>
|
|
|
|
</el-form-item>
|
|
</el-col>
|
|
</el-row>
|
|
|
|
<el-row :gutter="10">
|
|
<el-col :span="6">
|
|
<el-form-item label="建议验货日期" prop="needInspectDate">
|
|
<el-date-picker
|
|
v-model="addFormData.needInspectDate"
|
|
type="date"
|
|
value-format="yyyy-MM-dd"
|
|
placeholder="选择日期"
|
|
size="mini"
|
|
style="width: 100%">
|
|
</el-date-picker>
|
|
</el-form-item>
|
|
</el-col>
|
|
<el-col :span="8">
|
|
<el-form-item prop="inspectAddress">
|
|
<span slot="label" class="choose-label" @click="openAddressDialog">验货地址</span>
|
|
<el-input
|
|
v-model="addFormData.inspectAddress"
|
|
readonly
|
|
@click.native="openAddressDialog"
|
|
placeholder="点击标签选择验货地址"
|
|
size="mini">
|
|
</el-input>
|
|
</el-form-item>
|
|
</el-col>
|
|
<el-col :span="4">
|
|
<el-form-item label="城市简称">
|
|
<el-input v-model="addFormData.inspectCityShort" readonly size="mini"></el-input>
|
|
</el-form-item>
|
|
</el-col>
|
|
<el-col :span="6">
|
|
<el-form-item label="联系人" prop="contact">
|
|
<el-input v-model="addFormData.contact" placeholder="请输入联系人及电话" size="mini"></el-input>
|
|
</el-form-item>
|
|
</el-col>
|
|
</el-row>
|
|
</div>
|
|
|
|
<!-- 步骤2:批量选择PO / 编辑态PO明细 -->
|
|
<div class="po-section">
|
|
<div class="section-title">{{ isEditDialogMode ? 'PO明细' : '批量选择PO' }}</div>
|
|
|
|
<!-- PO号筛选和排序工具栏 -->
|
|
<div v-if="!isEditDialogMode" class="po-toolbar">
|
|
<el-form :inline="true" label-width="70px" size="mini" class="add-po-search-form">
|
|
<el-form-item label="PO">
|
|
<el-input
|
|
v-model="addPoFilter.orderNo"
|
|
clearable
|
|
style="width: 80px"
|
|
@keyup.enter.native="filterAddPoList"/>
|
|
</el-form-item>
|
|
<!-- <el-form-item label="产品编码">-->
|
|
<!-- <el-input-->
|
|
<!-- v-model="addPoFilter.partNo"-->
|
|
<!-- clearable-->
|
|
<!-- style="width: 80px"-->
|
|
<!-- @keyup.enter.native="filterAddPoList"/>-->
|
|
<!-- </el-form-item>-->
|
|
<!-- <el-form-item label="Item">-->
|
|
<!-- <el-input-->
|
|
<!-- v-model="addPoFilter.item"-->
|
|
<!-- clearable-->
|
|
<!-- style="width: 80px"-->
|
|
<!-- @keyup.enter.native="filterAddPoList"/>-->
|
|
<!-- </el-form-item>-->
|
|
<el-form-item label="SKU">
|
|
<el-input
|
|
v-model="addPoFilter.sku"
|
|
clearable
|
|
style="width: 80px"
|
|
@keyup.enter.native="filterAddPoList"/>
|
|
</el-form-item>
|
|
<el-form-item label="物料名称">
|
|
<el-input
|
|
v-model="addPoFilter.partDesc"
|
|
clearable
|
|
style="width: 80px"
|
|
@keyup.enter.native="filterAddPoList"/>
|
|
</el-form-item>
|
|
<el-form-item v-if="!isSupplierPageMode" label="供应商名称">
|
|
<el-input
|
|
v-model="addPoFilter.supplierName"
|
|
clearable
|
|
style="width: 100px"
|
|
@keyup.enter.native="filterAddPoList"/>
|
|
</el-form-item>
|
|
<el-form-item v-if="!isSupplierPageMode">
|
|
<span style="cursor: pointer" slot="label" @click="getBaseList(530, 'addPoPlanner')"><a href="#">Planner</a></span>
|
|
<el-input
|
|
v-model="addPoFilter.planner"
|
|
clearable
|
|
style="width: 100px"
|
|
@input="handleAddPoPlannerInput"
|
|
@keyup.enter.native="filterAddPoList"
|
|
/>
|
|
</el-form-item>
|
|
<el-form-item label=" ">
|
|
<el-button type="primary" size="medium" style="margin-top:13px;" @click="filterAddPoList">查询</el-button>
|
|
</el-form-item>
|
|
</el-form>
|
|
</div>
|
|
|
|
<el-table
|
|
v-if="!isEditDialogMode"
|
|
key="create-po-table"
|
|
ref="addPoTable"
|
|
:data="filteredPoList"
|
|
border
|
|
size="small"
|
|
table-layout="fixed"
|
|
height="350px"
|
|
style="width: 100%; margin-top: -10px;"
|
|
@selection-change="handleSelectionChange">
|
|
<el-table-column v-if="!isEditDialogMode" type="selection" width="30" align="center" fixed="left" />
|
|
<el-table-column prop="orderRef1" label="PO号" header-align="center" align="center" width="120"/>
|
|
<el-table-column prop="orderRef2" label="PO行号" header-align="center" align="center" width="60"/>
|
|
<el-table-column prop="partNo" label="产品编码" header-align="center" align="left" min-width="120" show-overflow-tooltip/>
|
|
<el-table-column prop="item" label="Item" header-align="center" align="left" min-width="100" show-overflow-tooltip/>
|
|
<el-table-column prop="sku" label="SKU" header-align="center" align="left" min-width="120" show-overflow-tooltip/>
|
|
<el-table-column prop="partDesc" label="物料名称" header-align="center" align="left" min-width="150" show-overflow-tooltip/>
|
|
<el-table-column prop="planner" label="Planner" header-align="center" align="left" min-width="120" show-overflow-tooltip/>
|
|
<el-table-column prop="qty" label="订单数量" header-align="center" align="right" width="80"/>
|
|
<el-table-column prop="waitInspectQty" label="未验货数量" header-align="center" align="right" width="80"/>
|
|
<el-table-column label="此次验货数量" header-align="center" align="center" width="150">
|
|
<template slot-scope="scope">
|
|
<el-input-number
|
|
v-model="scope.row.inspectQty"
|
|
:min="0"
|
|
:max="scope.row.waitInspectQty || 999999"
|
|
size="mini"
|
|
:controls="false"
|
|
style="width: 100%; box-sizing: border-box;">
|
|
</el-input-number>
|
|
</template>
|
|
</el-table-column>
|
|
<el-table-column prop="shipMethod" label="运输方式" header-align="center" align="center" width="100">
|
|
<template slot-scope="scope">
|
|
<el-select v-model="scope.row.shipMethod" placeholder="请选择" size="mini" style="width: 100%; box-sizing: border-box;">
|
|
<el-option label="空运" value="空运"></el-option>
|
|
<el-option label="海运" value="海运"></el-option>
|
|
<el-option label="陆运" value="陆运"></el-option>
|
|
</el-select>
|
|
</template>
|
|
</el-table-column>
|
|
<el-table-column
|
|
prop="crd"
|
|
label="CRD日期"
|
|
header-align="center"
|
|
align="center"
|
|
width="160"
|
|
sortable
|
|
:sort-method="(a, b) => sortCrdDate(a, b)">
|
|
<template slot-scope="scope">
|
|
<el-date-picker
|
|
v-model="scope.row.crd"
|
|
type="date"
|
|
value-format="yyyy-MM-dd"
|
|
format="yyyy-MM-dd"
|
|
placeholder="选择日期"
|
|
size="mini"
|
|
style="width: 100%;"
|
|
/>
|
|
</template>
|
|
</el-table-column>
|
|
</el-table>
|
|
|
|
<el-table
|
|
v-else
|
|
key="edit-po-table"
|
|
:data="editPoDetailList"
|
|
border
|
|
size="small"
|
|
table-layout="fixed"
|
|
height="350px"
|
|
v-loading="editPoDetailLoading"
|
|
style="width: 100%; margin-top: -10px;">
|
|
<el-table-column prop="orderRef1" label="PO号" header-align="center" align="center" width="120"/>
|
|
<el-table-column prop="orderRef2" label="PO行号" header-align="center" align="center" width="80"/>
|
|
<el-table-column prop="partNo" label="产品编码" header-align="center" align="left" min-width="120" show-overflow-tooltip/>
|
|
<el-table-column prop="item" label="Item" header-align="center" align="left" min-width="100" show-overflow-tooltip/>
|
|
<el-table-column prop="sku" label="SKU" header-align="center" align="left" min-width="120" show-overflow-tooltip/>
|
|
<el-table-column prop="partDesc" label="物料名称" header-align="center" align="left" min-width="150" show-overflow-tooltip/>
|
|
<el-table-column prop="qty" label="验货数量" header-align="center" align="right" width="110"/>
|
|
<el-table-column prop="shipMothod" label="运输方式" header-align="center" align="center" width="100"/>
|
|
<el-table-column prop="crd" label="CRD日期" header-align="center" align="center" width="120"/>
|
|
</el-table>
|
|
</div>
|
|
</el-form>
|
|
|
|
<div slot="footer" class="dialog-footer">
|
|
<el-button type="primary" @click="handleSaveAdd">保存</el-button>
|
|
<el-button @click="handleCloseAddDialog">关闭</el-button>
|
|
</div>
|
|
</el-dialog>
|
|
|
|
<el-dialog
|
|
title="选择供应商"
|
|
:visible.sync="poSupplierDialogVisible"
|
|
width="760px"
|
|
append-to-body
|
|
:close-on-click-modal="false">
|
|
<el-form :inline="true" label-width="80px" size="mini" class="po-supplier-search-form">
|
|
<el-form-item label="供应商编码">
|
|
<el-input
|
|
v-model="poSupplierSearch.supplierNo"
|
|
clearable
|
|
style="width: 120px"
|
|
@keyup.enter.native="searchPoSupplierList"/>
|
|
</el-form-item>
|
|
<el-form-item label="供应商名称">
|
|
<el-input
|
|
v-model="poSupplierSearch.supplierName"
|
|
clearable
|
|
style="width: 200px"
|
|
@keyup.enter.native="searchPoSupplierList"/>
|
|
</el-form-item>
|
|
<el-form-item label=" ">
|
|
<el-button type="primary" size="medium" @click="searchPoSupplierList">查询</el-button>
|
|
<el-button size="medium" @click="resetPoSupplierSearch">重置</el-button>
|
|
</el-form-item>
|
|
</el-form>
|
|
|
|
<el-table
|
|
ref="poSupplierTable"
|
|
:data="poSupplierList"
|
|
border
|
|
height="360px"
|
|
v-loading="poSupplierLoading"
|
|
highlight-current-row
|
|
@current-change="onPoSupplierCurrentChange"
|
|
@row-dblclick="onPoSupplierRowDblClick">
|
|
<el-table-column prop="supplierNo" label="供应商编码" header-align="center" align="left" min-width="140" show-overflow-tooltip />
|
|
<el-table-column prop="supplierName" label="供应商名称" header-align="center" align="left" min-width="220" show-overflow-tooltip />
|
|
<el-table-column prop="poDetailCount" label="PO明细数" header-align="center" align="right" min-width="120" />
|
|
<el-table-column prop="planner" label="Planner" header-align="center" align="left" min-width="120" show-overflow-tooltip />
|
|
</el-table>
|
|
|
|
<el-pagination
|
|
style="margin-top: 10px; text-align: right"
|
|
@size-change="onPoSupplierPageSizeChange"
|
|
@current-change="onPoSupplierPageCurrentChange"
|
|
:current-page="poSupplierPageIndex"
|
|
:page-sizes="[20, 50, 100, 200]"
|
|
:page-size="poSupplierPageSize"
|
|
:total="poSupplierTotal"
|
|
layout="total, sizes, prev, pager, next, jumper">
|
|
</el-pagination>
|
|
|
|
<div slot="footer" class="dialog-footer">
|
|
<el-button type="primary" @click="confirmPoSupplierSelect">确认</el-button>
|
|
<el-button @click="poSupplierDialogVisible = false">取消</el-button>
|
|
</div>
|
|
</el-dialog>
|
|
|
|
<el-dialog
|
|
title="选择验货地址"
|
|
:visible.sync="addressDialogVisible"
|
|
width="980px"
|
|
append-to-body
|
|
:close-on-click-modal="false">
|
|
<el-form :inline="true" label-width="80px" label-position="top" size="mini" class="po-supplier-search-form">
|
|
<el-form-item label="供应商编码">
|
|
<el-input v-model="addFormData.supplierNo" readonly style="width: 140px" />
|
|
</el-form-item>
|
|
<el-form-item label="供应商名称">
|
|
<el-input v-model="addFormData.supplierName" readonly style="width: 220px" />
|
|
</el-form-item>
|
|
<el-form-item label=" ">
|
|
<el-button
|
|
type="primary"
|
|
size="medium"
|
|
style="margin-top: 0px"
|
|
@click="openAddressCreateDialog">新增地址</el-button>
|
|
</el-form-item>
|
|
<!-- <el-form-item label="地址关键词">-->
|
|
<!-- <el-input-->
|
|
<!-- v-model="addressSearch.keyword"-->
|
|
<!-- clearable-->
|
|
<!-- style="width: 260px"-->
|
|
<!-- @keyup.enter.native="searchAddressList" />-->
|
|
<!-- </el-form-item>-->
|
|
<!-- <el-form-item label=" ">-->
|
|
<!-- <el-button type="primary" size="medium" @click="searchAddressList">查询</el-button>-->
|
|
<!-- <el-button size="medium" @click="resetAddressSearch">重置</el-button>-->
|
|
<!-- </el-form-item>-->
|
|
</el-form>
|
|
|
|
<el-table
|
|
ref="addressTable"
|
|
:data="addressList"
|
|
border
|
|
height="360px"
|
|
v-loading="addressLoading"
|
|
highlight-current-row
|
|
@current-change="onAddressCurrentChange"
|
|
@row-dblclick="onAddressRowDblClick">
|
|
<el-table-column prop="addressId" label="地址ID" header-align="center" align="left" min-width="120" show-overflow-tooltip />
|
|
<el-table-column prop="companyName" label="公司名称" header-align="center" align="left" min-width="180" show-overflow-tooltip />
|
|
<el-table-column prop="cityShort" label="城市简称" header-align="center" align="left" min-width="120" show-overflow-tooltip />
|
|
<el-table-column prop="address" label="验货地址" header-align="center" align="left" min-width="280" show-overflow-tooltip />
|
|
<el-table-column prop="contact" label="联系人" header-align="center" align="left" min-width="120" show-overflow-tooltip />
|
|
<el-table-column prop="phoneNo" label="联系电话" header-align="center" align="left" min-width="140" show-overflow-tooltip />
|
|
<el-table-column prop="email" label="邮箱" header-align="center" align="left" min-width="180" show-overflow-tooltip />
|
|
</el-table>
|
|
|
|
<el-pagination
|
|
style="margin-top: 10px; text-align: right"
|
|
@size-change="onAddressPageSizeChange"
|
|
@current-change="onAddressPageCurrentChange"
|
|
:current-page="addressPageIndex"
|
|
:page-sizes="[20, 50, 100, 200]"
|
|
:page-size="addressPageSize"
|
|
:total="addressTotal"
|
|
layout="total, sizes, prev, pager, next, jumper">
|
|
</el-pagination>
|
|
|
|
<div slot="footer" class="dialog-footer">
|
|
<el-button type="primary" @click="confirmAddressSelect">确认</el-button>
|
|
<el-button @click="addressDialogVisible = false">取消</el-button>
|
|
</div>
|
|
</el-dialog>
|
|
|
|
<!-- 新增供应商地址(与供应商主数据地址页签新增弹窗保持一致) -->
|
|
<el-dialog
|
|
title="供应商地址"
|
|
:close-on-click-modal="false"
|
|
v-drag
|
|
:visible.sync="addressCreateDialogVisible"
|
|
@closed="handleAddressCreateDialogClosed"
|
|
width="600px"
|
|
append-to-body>
|
|
<el-form
|
|
ref="addressCreateFormRef"
|
|
:model="addressCreateForm"
|
|
:rules="addressCreateRules"
|
|
label-position="top"
|
|
label-width="100px">
|
|
<!-- 供应商ID / 城市简称 / 是否在用 -->
|
|
<el-row :gutter="20">
|
|
<el-col :span="8">
|
|
<el-form-item label="供应商ID" prop="supplierId">
|
|
<el-input v-model="addressCreateForm.supplierId" disabled />
|
|
</el-form-item>
|
|
</el-col>
|
|
<el-col :span="8">
|
|
<el-form-item label="所在城市简称" prop="cityShort">
|
|
<el-input v-model="addressCreateForm.cityShort" />
|
|
</el-form-item>
|
|
</el-col>
|
|
<el-col :span="8">
|
|
<el-form-item label="是否在用" prop="active">
|
|
<el-select v-model="addressCreateForm.active" style="width: 100%">
|
|
<el-option label="Y" value="Y" />
|
|
<el-option label="N" value="N" />
|
|
</el-select>
|
|
</el-form-item>
|
|
</el-col>
|
|
</el-row>
|
|
|
|
<!-- 公司名称 -->
|
|
<el-row :gutter="20">
|
|
<el-col :span="24">
|
|
<el-form-item label="公司名称" prop="companyName">
|
|
<el-input v-model="addressCreateForm.companyName" />
|
|
</el-form-item>
|
|
</el-col>
|
|
</el-row>
|
|
|
|
<!-- 联系人 / 电话 / 地址类型 -->
|
|
<el-row :gutter="20">
|
|
<el-col :span="8">
|
|
<el-form-item label="联系人" prop="contact">
|
|
<el-input v-model="addressCreateForm.contact" />
|
|
</el-form-item>
|
|
</el-col>
|
|
<el-col :span="8">
|
|
<el-form-item label="联系电话" prop="phoneNo">
|
|
<el-input v-model="addressCreateForm.phoneNo" />
|
|
</el-form-item>
|
|
</el-col>
|
|
<el-col :span="8">
|
|
<el-form-item label="地址类型" prop="addressType">
|
|
<sys-dict-select
|
|
v-model="addressCreateForm.addressType"
|
|
dict-type="address_type"
|
|
placeholder="请选择地址类型"
|
|
width="100%"
|
|
filterable
|
|
/>
|
|
</el-form-item>
|
|
</el-col>
|
|
</el-row>
|
|
|
|
<!-- 邮箱 -->
|
|
<el-row :gutter="20">
|
|
<el-col :span="24">
|
|
<el-form-item label="邮箱" prop="email">
|
|
<el-input v-model="addressCreateForm.email" />
|
|
</el-form-item>
|
|
</el-col>
|
|
</el-row>
|
|
|
|
<!-- 原产国 / 装运港 -->
|
|
<el-row :gutter="20">
|
|
<el-col :span="12">
|
|
<el-form-item label="原产国" prop="originCountry">
|
|
<el-input v-model="addressCreateForm.originCountry" />
|
|
</el-form-item>
|
|
</el-col>
|
|
<el-col :span="12">
|
|
<el-form-item prop="portOfLoading">
|
|
<span slot="label" style="cursor: pointer" @click="getBaseList(2018, 'addressPortOfLoading')"><a href="#">装运港</a></span>
|
|
<el-input v-model="addressCreateForm.portOfLoading" readonly />
|
|
</el-form-item>
|
|
</el-col>
|
|
</el-row>
|
|
|
|
<!-- 地址 -->
|
|
<el-row :gutter="20">
|
|
<el-col :span="24">
|
|
<el-form-item label="地址" prop="address">
|
|
<el-input v-model="addressCreateForm.address" />
|
|
</el-form-item>
|
|
</el-col>
|
|
</el-row>
|
|
|
|
<!-- 备注 -->
|
|
<el-row :gutter="20">
|
|
<el-col :span="24">
|
|
<el-form-item label="备注" prop="memo">
|
|
<el-input v-model="addressCreateForm.memo" type="textarea" :rows="1" />
|
|
</el-form-item>
|
|
</el-col>
|
|
</el-row>
|
|
</el-form>
|
|
<span slot="footer" class="dialog-footer" style="margin-top: 10px; display: block">
|
|
<el-button type="primary" :loading="addressCreateSaving" @click="saveCreatedAddress">保存</el-button>
|
|
<el-button :disabled="addressCreateSaving" @click="addressCreateDialogVisible = false">关闭</el-button>
|
|
</span>
|
|
</el-dialog>
|
|
|
|
<el-dialog
|
|
title="从订单选择供应商"
|
|
:visible.sync="orderSupplierDialogVisible"
|
|
width="1260px"
|
|
append-to-body
|
|
:close-on-click-modal="false">
|
|
<el-form :inline="true" label-position="top" class="search-form-inline">
|
|
<el-form-item label="PO">
|
|
<el-input
|
|
v-model="orderSupplierSearch.orderNo"
|
|
clearable
|
|
style="width: 150px"
|
|
@keyup.enter.native="searchOrderSupplierByPo"/>
|
|
</el-form-item>
|
|
<el-form-item label="产品编码">
|
|
<el-input
|
|
v-model="orderSupplierSearch.partNo"
|
|
clearable
|
|
style="width: 150px"
|
|
@keyup.enter.native="searchOrderSupplierByPo"/>
|
|
</el-form-item>
|
|
<el-form-item label="Item">
|
|
<el-input
|
|
v-model="orderSupplierSearch.item"
|
|
clearable
|
|
style="width: 140px"
|
|
@keyup.enter.native="searchOrderSupplierByPo"/>
|
|
</el-form-item>
|
|
<el-form-item label="SKU">
|
|
<el-input
|
|
v-model="orderSupplierSearch.sku"
|
|
clearable
|
|
style="width: 140px"
|
|
@keyup.enter.native="searchOrderSupplierByPo"/>
|
|
</el-form-item>
|
|
<el-form-item label="物料名称">
|
|
<el-input
|
|
v-model="orderSupplierSearch.partDesc"
|
|
clearable
|
|
style="width: 200px"
|
|
@keyup.enter.native="searchOrderSupplierByPo"/>
|
|
</el-form-item>
|
|
<el-form-item label="供应商名称">
|
|
<el-input
|
|
v-model="orderSupplierSearch.supplierName"
|
|
clearable
|
|
style="width: 200px"
|
|
@keyup.enter.native="searchOrderSupplierByPo"/>
|
|
</el-form-item>
|
|
<el-form-item>
|
|
<span style="cursor: pointer" slot="label" @click="getBaseList(530, 'orderSupplierPlanner')"><a href="#">Planner</a></span>
|
|
<el-input
|
|
v-model="orderSupplierSearch.planner"
|
|
clearable
|
|
style="width: 140px"
|
|
@keyup.enter.native="searchOrderSupplierByPo"
|
|
/>
|
|
</el-form-item>
|
|
<el-form-item label=" ">
|
|
<el-button type="primary" @click="searchOrderSupplierByPo">查询</el-button>
|
|
<el-button @click="resetOrderSupplierSearch">重置</el-button>
|
|
</el-form-item>
|
|
</el-form>
|
|
|
|
<el-table
|
|
ref="orderSupplierTable"
|
|
:data="orderSupplierList"
|
|
border
|
|
height="430px"
|
|
v-loading="orderSupplierLoading"
|
|
highlight-current-row
|
|
@current-change="onOrderSupplierCurrentChange"
|
|
@row-dblclick="onOrderSupplierRowDblClick"
|
|
:default-sort="{ prop: 'crd', order: 'descending' }">
|
|
<el-table-column prop="supplierNo" label="供应商编码" header-align="center" align="left" min-width="120" fixed="left" show-overflow-tooltip />
|
|
<el-table-column prop="supplierName" label="供应商名称" header-align="center" align="left" min-width="180" fixed="left" show-overflow-tooltip />
|
|
<el-table-column prop="planner" label="Planner" header-align="center" align="left" min-width="120" show-overflow-tooltip />
|
|
<el-table-column prop="orderRef1" label="PO号" header-align="center" align="center" min-width="120" show-overflow-tooltip />
|
|
<el-table-column prop="orderRef2" label="PO行号" header-align="center" align="center" min-width="80" show-overflow-tooltip />
|
|
<el-table-column prop="partNo" label="产品编码" header-align="center" align="left" min-width="140" show-overflow-tooltip />
|
|
<el-table-column prop="item" label="Item" header-align="center" align="left" min-width="120" show-overflow-tooltip />
|
|
<el-table-column prop="sku" label="SKU" header-align="center" align="left" min-width="140" show-overflow-tooltip />
|
|
<el-table-column prop="partDesc" label="物料名称" header-align="center" align="left" min-width="170" show-overflow-tooltip />
|
|
<el-table-column prop="waitInspectQty" label="未验货数量" header-align="center" align="right" min-width="100" />
|
|
<el-table-column
|
|
prop="crd"
|
|
label="CRD日期"
|
|
header-align="center"
|
|
align="center"
|
|
min-width="120"
|
|
sortable
|
|
:sort-method="(a, b) => sortCrdDate(a, b)" />
|
|
</el-table>
|
|
|
|
<el-pagination
|
|
style="margin-top: 10px; text-align: right"
|
|
@size-change="onOrderSupplierPageSizeChange"
|
|
@current-change="onOrderSupplierPageCurrentChange"
|
|
:current-page="orderSupplierPageIndex"
|
|
:page-sizes="[20, 50, 100, 200]"
|
|
:page-size="orderSupplierPageSize"
|
|
:total="orderSupplierTotal"
|
|
layout="total, sizes, prev, pager, next, jumper">
|
|
</el-pagination>
|
|
|
|
<div slot="footer" class="dialog-footer">
|
|
<el-button type="primary" @click="confirmOrderSupplierSelect">确认</el-button>
|
|
<el-button @click="orderSupplierDialogVisible = false">取消</el-button>
|
|
</div>
|
|
</el-dialog>
|
|
|
|
<!-- 导入弹窗 -->
|
|
<el-dialog title="验货申请数据导入" :visible.sync="uploadDialogVisible" width="800px">
|
|
<!-- 选择文件 -->
|
|
<div style="margin-bottom:15px;display:flex;align-items:center">
|
|
<span style="margin-right:10px">请选择文件</span>
|
|
<el-input v-model="uploadFileName" style="width:400px;margin-right:10px" readonly></el-input>
|
|
<el-upload ref="upload" action="/api/inspection/upload"
|
|
:show-file-list="false" :on-change="handleFileChange"
|
|
:auto-upload="false">
|
|
<el-button type="primary">选择文件</el-button>
|
|
</el-upload>
|
|
<el-button type="success" style="margin-left:10px" @click="previewUpload">上传</el-button>
|
|
<el-button type="primary" @click="downloadTemplate" style="margin-left:10px">
|
|
<i class="el-icon-download"></i> 下载模板
|
|
</el-button>
|
|
</div>
|
|
<!-- 预览表格 -->
|
|
<el-table
|
|
:data="uploadPreviewList"
|
|
border
|
|
height="250"
|
|
style="width:100%;margin-top:10px"
|
|
>
|
|
<el-table-column prop="poNo" label="PO号" align="center" width="auto"></el-table-column>
|
|
<el-table-column prop="poItemNo" label="PO行号" align="center" width="auto"></el-table-column>
|
|
<el-table-column prop="partNo" label="产品编码" align="center" width="auto"></el-table-column>
|
|
<el-table-column prop="qty" label="验货数量" align="center" width="auto"></el-table-column>
|
|
<el-table-column prop="shipMethod" label="运输方式" align="center" width="auto"></el-table-column>
|
|
<el-table-column prop="crd" label="CRD" align="center" width="auto"></el-table-column>
|
|
<el-table-column prop="suggestInspectDate" label="建议验货日期" align="center" width="auto"></el-table-column>
|
|
<el-table-column prop="inspectAddress" label="验货地址" align="center" width="auto"></el-table-column>
|
|
<el-table-column prop="inspectContract" label="联系人" align="center" width="auto"></el-table-column>
|
|
</el-table>
|
|
<!-- 按钮 -->
|
|
<div style="margin-top:20px;text-align:center">
|
|
<el-button type="primary" @click="confirmUpload">保存</el-button>
|
|
<el-button @click="uploadDialogVisible=false" style="margin-right:30px">关闭</el-button>
|
|
</div>
|
|
</el-dialog>
|
|
</div>
|
|
</template>
|
|
|
|
<script>
|
|
import { searchInspectionRequestHeaderList, queryPoPage, queryPoSupplierPage, queryPoSupplierOrderPage, saveInspectionRequest, deleteInspectionRequest, confirmInspectionRequest, applyChangeInspectionRequest, getInspectionRequestDetailSubList, updateInspectionRequest, downloadTemplate, previewUpload, batchSave } from '@/api/inspection/inspectionRequestHeader.js'
|
|
import { searchSrmSupplierAddressList, createSrmSupplierAddress, searchSrmSupplierList } from '@/api/srm/srmSupplier.js'
|
|
import Chooselist from '@/views/modules/common/Chooselist_eam'
|
|
import SysDictSelect from '@/components/dict/SysDictSelect.vue'
|
|
import ComInspectionRequestDetail from './com_inspectionRequestDetail.vue'
|
|
import ComInspectionRequestDetailTab from './com_inspectionRequestDetailTab.vue'
|
|
import ComInspectionRequestPoDetailTab from './com_inspectionRequestPoDetailTab.vue'
|
|
import ComInspectionResultTab from './com_inspectionResultTab.vue'
|
|
import ComInspectionRequestAttachmentTab from './com_inspectionRequestAttachmentTab.vue'
|
|
import ComInspectionRequestFeeTab from './com_inspectionRequestFeeTab.vue'
|
|
import { fetchSupplierDetail } from '@/utils/supplierChooselistHelper'
|
|
import excel from '@/utils/excel-util.js'
|
|
|
|
export default {
|
|
props: {
|
|
/**
|
|
* 供应商专用模式开关
|
|
* - false:通用验货申请页(默认,内部人员场景)
|
|
* - true :供应商专用页(由 inspectionRequestListSupplier.vue 传入)
|
|
*
|
|
* 打开后会触发:
|
|
* 1) 查询条件精简;
|
|
* 2) 查询强制按当前登录用户绑定供应商编码过滤;
|
|
* 3) 新增时供应商固定为当前登录用户供应商;
|
|
* 4) 隐藏从订单选择供应商入口及部分PO筛选项。
|
|
*/
|
|
supplierMode: {
|
|
type: Boolean,
|
|
default: false
|
|
}
|
|
},
|
|
components: {
|
|
Chooselist,
|
|
SysDictSelect,
|
|
InspectionRequestDetail: ComInspectionRequestDetail,
|
|
InspectionRequestDetailTab: ComInspectionRequestDetailTab,
|
|
InspectionRequestPoDetailTab: ComInspectionRequestPoDetailTab,
|
|
InspectionResultTab: ComInspectionResultTab,
|
|
InspectionRequestAttachmentTab: ComInspectionRequestAttachmentTab,
|
|
InspectionRequestFeeTab: ComInspectionRequestFeeTab
|
|
},
|
|
data () {
|
|
return {
|
|
functionId: this.$route.meta.menuId,
|
|
height: 400,
|
|
detailHeight: 400,
|
|
currentRow: {},
|
|
tagNo: '',
|
|
searchType: '',
|
|
// 供应商模式上下文:来自 /sys/user/info(user.supplierNo / user.supplierName)
|
|
currentSupplierNo: '',
|
|
currentSupplierName: '',
|
|
activeTab: 'base',
|
|
// 新增弹窗相关数据
|
|
addDialogVisible: false,
|
|
addDialogMode: 'create',
|
|
addFormData: {
|
|
requestNo: '',
|
|
requestDate: '',
|
|
supplierNo: '',
|
|
supplierName: '',
|
|
inspectAddressId: '',
|
|
inspectAddress: '',
|
|
inspectCityShort: '',
|
|
contact: '',
|
|
needInspectDate: ''
|
|
},
|
|
addRules: {
|
|
requestDate: [
|
|
{ required: true, message: '请选择申请日期', trigger: 'change' }
|
|
],
|
|
supplierNo: [
|
|
{ required: true, message: '请选择供应商', trigger: 'change' }
|
|
],
|
|
inspectAddress: [
|
|
{ required: true, message: '请选择验货地址', trigger: 'change' }
|
|
],
|
|
needInspectDate: [
|
|
{ required: true, message: '请选择建议验货日期', trigger: 'change' }
|
|
]
|
|
},
|
|
poList: [],
|
|
filteredPoList: [],
|
|
editPoDetailList: [],
|
|
editPoDetailLoading: false,
|
|
addPoFilter: {
|
|
orderNo: '',
|
|
partNo: '',
|
|
item: '',
|
|
sku: '',
|
|
partDesc: '',
|
|
supplierName: '',
|
|
planner: ''
|
|
},
|
|
addPoPlannerCodeFromChooser: '',
|
|
addPoPlannerDisplayFromChooser: '',
|
|
selectedPoList: [],
|
|
poSupplierDialogVisible: false,
|
|
poSupplierLoading: false,
|
|
poSupplierList: [],
|
|
poSupplierCurrentRow: null,
|
|
poSupplierPageIndex: 1,
|
|
poSupplierPageSize: 20,
|
|
poSupplierTotal: 0,
|
|
poSupplierSearch: {
|
|
supplierNo: '',
|
|
supplierName: ''
|
|
},
|
|
addressDialogVisible: false,
|
|
addressLoading: false,
|
|
addressList: [],
|
|
addressCurrentRow: null,
|
|
addressPageIndex: 1,
|
|
addressPageSize: 20,
|
|
addressTotal: 0,
|
|
addressSearch: {
|
|
keyword: ''
|
|
},
|
|
// 新增供应商地址弹窗(用于验货地址弹窗内快速维护地址)
|
|
addressCreateDialogVisible: false,
|
|
addressCreateSaving: false,
|
|
addressCreateForm: {
|
|
supplierId: '',
|
|
site: this.$store.state.user.site || this.$store.state.user.currentSite || '',
|
|
addressId: '',
|
|
companyName: '',
|
|
cityShort: '',
|
|
contact: '',
|
|
phoneNo: '',
|
|
address: '',
|
|
addressType: '验货地址',
|
|
active: 'Y',
|
|
email: '',
|
|
originCountry: '',
|
|
portOfLoading: '',
|
|
memo: '',
|
|
createBy: this.$store.state.user.name,
|
|
updateBy: this.$store.state.user.name
|
|
},
|
|
addressCreateRules: {
|
|
supplierId: [
|
|
{ required: true, validator: this.validateAddressCreateField, trigger: 'blur' }
|
|
],
|
|
site: [
|
|
{ required: true, validator: this.validateAddressCreateField, trigger: 'blur' }
|
|
],
|
|
cityShort: [
|
|
{ required: true, validator: this.validateAddressCreateField, message: ' ', trigger: 'blur' }
|
|
],
|
|
address: [
|
|
{ required: true, validator: this.validateAddressCreateField, message: ' ', trigger: 'blur' }
|
|
],
|
|
companyName: [
|
|
{ required: true, validator: this.validateAddressCreateField, message: ' ', trigger: 'blur' }
|
|
],
|
|
contact: [
|
|
{ required: true, validator: this.validateAddressCreateField, message: ' ', trigger: 'blur' }
|
|
],
|
|
phoneNo: [
|
|
{ required: true, validator: this.validateAddressCreateField, message: ' ', trigger: 'blur' }
|
|
],
|
|
addressType: [
|
|
{ required: true, validator: this.validateAddressCreateField, message: ' ', trigger: 'change' }
|
|
]
|
|
},
|
|
applyChangeDialogVisible: false,
|
|
applyChangeLoading: false,
|
|
applyChangeForm: {
|
|
requestNo: '',
|
|
statusDb: '',
|
|
changeRemark: ''
|
|
},
|
|
orderSupplierDialogVisible: false,
|
|
orderSupplierLoading: false,
|
|
orderSupplierList: [],
|
|
orderSupplierCurrentRow: null,
|
|
orderSupplierPageIndex: 1,
|
|
orderSupplierPageSize: 50,
|
|
orderSupplierTotal: 0,
|
|
orderSupplierSearch: {
|
|
orderNo: '',
|
|
partNo: '',
|
|
item: '',
|
|
sku: '',
|
|
partDesc: '',
|
|
supplierName: '',
|
|
planner: ''
|
|
},
|
|
pendingAutoSelectPoRow: null,
|
|
// 上传相关
|
|
uploadDialogVisible: false,
|
|
uploadFileName: '',
|
|
uploadFile: null,
|
|
uploadPreviewList: [],
|
|
searchData: {
|
|
requestNo: '',
|
|
supplierNo: '',
|
|
supplierName: '',
|
|
planner: '',
|
|
status: '',
|
|
qcOperator: '',
|
|
createBy: '',
|
|
requestDateStart: '',
|
|
requestDateEnd: '',
|
|
needInspectDateStart: '',
|
|
needInspectDateEnd: '',
|
|
planStartDate: '',
|
|
planEndDate: '',
|
|
planStartDateStr: '',
|
|
planEndDateStr: '',
|
|
page: 1,
|
|
limit: 50
|
|
},
|
|
pageIndex: 1,
|
|
pageSize: 50,
|
|
totalPage: 0,
|
|
mainDataList: [],
|
|
dataListLoading: false,
|
|
columnArray1: [
|
|
{
|
|
userId: this.$store.state.user.name,
|
|
functionId: this.functionId,
|
|
serialNumber: 'InspectionTable1RequestNo',
|
|
tableId: 'InspectionTable1',
|
|
tableName: '检验申请单',
|
|
columnProp: 'requestNo',
|
|
headerAlign: 'center',
|
|
align: 'left',
|
|
columnLabel: '申请单号',
|
|
columnWidth: '120',
|
|
columnHidden: false,
|
|
columnImage: false,
|
|
columnSortable: false,
|
|
sortLv: 0,
|
|
status: true,
|
|
fixed: false
|
|
},
|
|
{
|
|
userId: this.$store.state.user.name,
|
|
functionId: this.functionId,
|
|
serialNumber: 'InspectionTable1RequestDate',
|
|
tableId: 'InspectionTable1',
|
|
tableName: '检验申请单',
|
|
columnProp: 'requestDate',
|
|
headerAlign: 'center',
|
|
align: 'center',
|
|
columnLabel: '申请日期',
|
|
columnWidth: '120',
|
|
columnHidden: false,
|
|
columnImage: false,
|
|
columnSortable: false,
|
|
sortLv: 0,
|
|
status: true,
|
|
fixed: false
|
|
},
|
|
{
|
|
userId: this.$store.state.user.name,
|
|
functionId: this.functionId,
|
|
serialNumber: 'InspectionTable1PlanStartDate',
|
|
tableId: 'InspectionTable1',
|
|
tableName: '检验申请单',
|
|
columnProp: 'planStartDate',
|
|
headerAlign: 'center',
|
|
align: 'center',
|
|
columnLabel: '计划验货日期',
|
|
columnWidth: '120',
|
|
columnHidden: false,
|
|
columnImage: false,
|
|
columnSortable: false,
|
|
sortLv: 0,
|
|
status: true,
|
|
fixed: false
|
|
},
|
|
{
|
|
userId: this.$store.state.user.name,
|
|
functionId: this.functionId,
|
|
serialNumber: 'InspectionTable1SupplierNo',
|
|
tableId: 'InspectionTable1',
|
|
tableName: '检验申请单',
|
|
columnProp: 'supplierNo',
|
|
headerAlign: 'center',
|
|
align: 'left',
|
|
columnLabel: '供应商编码',
|
|
columnWidth: '120',
|
|
columnHidden: false,
|
|
columnImage: false,
|
|
columnSortable: false,
|
|
sortLv: 0,
|
|
status: true,
|
|
fixed: false
|
|
},
|
|
{
|
|
userId: this.$store.state.user.name,
|
|
functionId: this.functionId,
|
|
serialNumber: 'InspectionTable1SupplierName',
|
|
tableId: 'InspectionTable1',
|
|
tableName: '检验申请单',
|
|
columnProp: 'supplierName',
|
|
headerAlign: 'center',
|
|
align: 'left',
|
|
columnLabel: '供应商名称',
|
|
columnWidth: '150',
|
|
columnHidden: false,
|
|
columnImage: false,
|
|
columnSortable: false,
|
|
sortLv: 0,
|
|
status: true,
|
|
fixed: false
|
|
},
|
|
{
|
|
userId: this.$store.state.user.name,
|
|
functionId: this.functionId,
|
|
serialNumber: 'InspectionTable1Planner',
|
|
tableId: 'InspectionTable1',
|
|
tableName: '检验申请单',
|
|
columnProp: 'planner',
|
|
headerAlign: 'center',
|
|
align: 'left',
|
|
columnLabel: 'Planner',
|
|
columnWidth: '120',
|
|
columnHidden: false,
|
|
columnImage: false,
|
|
columnSortable: false,
|
|
sortLv: 0,
|
|
status: true,
|
|
fixed: false
|
|
},
|
|
{
|
|
userId: this.$store.state.user.name,
|
|
functionId: this.functionId,
|
|
serialNumber: 'InspectionTable1CreateBy',
|
|
tableId: 'InspectionTable1',
|
|
tableName: '检验申请单',
|
|
columnProp: 'createBy',
|
|
headerAlign: 'center',
|
|
align: 'left',
|
|
columnLabel: '申请人员',
|
|
columnWidth: '100',
|
|
columnHidden: false,
|
|
columnImage: false,
|
|
columnSortable: false,
|
|
sortLv: 0,
|
|
status: true,
|
|
fixed: false
|
|
},
|
|
{
|
|
userId: this.$store.state.user.name,
|
|
functionId: this.functionId,
|
|
serialNumber: 'InspectionTable1NeedInspectDate',
|
|
tableId: 'InspectionTable1',
|
|
tableName: '检验申请单',
|
|
columnProp: 'needInspectDate',
|
|
headerAlign: 'center',
|
|
align: 'center',
|
|
columnLabel: '建议验货日期',
|
|
columnWidth: '120',
|
|
columnHidden: false,
|
|
columnImage: false,
|
|
columnSortable: false,
|
|
sortLv: 0,
|
|
status: true,
|
|
fixed: false
|
|
},
|
|
{
|
|
userId: this.$store.state.user.name,
|
|
functionId: this.functionId,
|
|
serialNumber: 'InspectionTable1InspectAddress',
|
|
tableId: 'InspectionTable1',
|
|
tableName: '检验申请单',
|
|
columnProp: 'inspectAddress',
|
|
headerAlign: 'center',
|
|
align: 'left',
|
|
columnLabel: '验货地址',
|
|
columnWidth: '200',
|
|
columnHidden: false,
|
|
columnImage: false,
|
|
columnSortable: false,
|
|
sortLv: 0,
|
|
status: true,
|
|
fixed: false
|
|
},
|
|
{
|
|
userId: this.$store.state.user.name,
|
|
functionId: this.functionId,
|
|
serialNumber: 'InspectionTable1InspectCityShort',
|
|
tableId: 'InspectionTable1',
|
|
tableName: '检验申请单',
|
|
columnProp: 'inspectCityShort',
|
|
headerAlign: 'center',
|
|
align: 'left',
|
|
columnLabel: '城市简称',
|
|
columnWidth: '120',
|
|
columnHidden: false,
|
|
columnImage: false,
|
|
columnSortable: false,
|
|
sortLv: 0,
|
|
status: true,
|
|
fixed: false
|
|
},
|
|
{
|
|
userId: this.$store.state.user.name,
|
|
functionId: this.functionId,
|
|
serialNumber: 'InspectionTable1Contact',
|
|
tableId: 'InspectionTable1',
|
|
tableName: '检验申请单',
|
|
columnProp: 'inspectContract',
|
|
headerAlign: 'center',
|
|
align: 'left',
|
|
columnLabel: '联系人',
|
|
columnWidth: '150',
|
|
columnHidden: false,
|
|
columnImage: false,
|
|
columnSortable: false,
|
|
sortLv: 0,
|
|
status: true,
|
|
fixed: false
|
|
},
|
|
{
|
|
userId: this.$store.state.user.name,
|
|
functionId: this.functionId,
|
|
serialNumber: 'InspectionTable1Remark',
|
|
tableId: 'InspectionTable1',
|
|
tableName: '检验申请单',
|
|
columnProp: 'remark',
|
|
headerAlign: 'center',
|
|
align: 'left',
|
|
columnLabel: '备注',
|
|
columnWidth: '150',
|
|
columnHidden: false,
|
|
columnImage: false,
|
|
columnSortable: false,
|
|
sortLv: 0,
|
|
status: true,
|
|
fixed: false
|
|
},
|
|
{
|
|
userId: this.$store.state.user.name,
|
|
functionId: this.functionId,
|
|
serialNumber: 'InspectionTable1Status',
|
|
tableId: 'InspectionTable1',
|
|
tableName: '检验申请单',
|
|
columnProp: 'status',
|
|
headerAlign: 'center',
|
|
align: 'center',
|
|
columnLabel: '状态',
|
|
columnWidth: '100',
|
|
columnHidden: false,
|
|
columnImage: false,
|
|
columnSortable: false,
|
|
sortLv: 0,
|
|
status: true,
|
|
fixed: false
|
|
},
|
|
|
|
{
|
|
userId: this.$store.state.user.name,
|
|
functionId: this.functionId,
|
|
serialNumber: 'InspectionTable1QcOperator',
|
|
tableId: 'InspectionTable1',
|
|
tableName: '检验申请单',
|
|
columnProp: 'qcOperator',
|
|
headerAlign: 'center',
|
|
align: 'left',
|
|
columnLabel: 'QC人员',
|
|
columnWidth: '100',
|
|
columnHidden: false,
|
|
columnImage: false,
|
|
columnSortable: false,
|
|
sortLv: 0,
|
|
status: true,
|
|
fixed: false
|
|
}
|
|
]
|
|
}
|
|
},
|
|
computed: {
|
|
isEditDialogMode () {
|
|
return this.addDialogMode === 'edit'
|
|
},
|
|
// 统一封装模式判断,避免模板与方法里反复写 this.supplierMode === true
|
|
isSupplierPageMode () {
|
|
return this.supplierMode === true
|
|
},
|
|
/**
|
|
* 统一页签内容容器高度(单位:px)。
|
|
* 业务意图:
|
|
* - 验货申请各页签切换时保持同一视觉高度,避免忽高忽低导致页面跳动;
|
|
* - 当窗口高度异常或未初始化时提供安全兜底,避免出现 0 高度导致内容不可见。
|
|
*/
|
|
normalizedTabPaneHeight () {
|
|
const rawHeight = Number(this.detailHeight)
|
|
if (!rawHeight || rawHeight <= 0) {
|
|
return 300
|
|
}
|
|
return Math.floor(rawHeight)
|
|
},
|
|
/**
|
|
* 页签内容区内联样式(供所有 tab pane 复用)。
|
|
* 关键输出:
|
|
* - 固定高度:所有页签保持一致;
|
|
* - 自动滚动:当单个页签内容超出时在页签内部滚动,不撑高外层布局。
|
|
*/
|
|
tabPaneContentStyle () {
|
|
return {
|
|
height: `${this.normalizedTabPaneHeight}px`
|
|
}
|
|
},
|
|
/**
|
|
* 表格类页签统一高度(单位:px)。
|
|
* 设计说明:
|
|
* - 预留少量内边距,避免表格底部与容器边框贴边;
|
|
* - 设置最小值,防止极端窗口尺寸下表格渲染异常。
|
|
*/
|
|
tabTableHeight () {
|
|
return Math.max(this.normalizedTabPaneHeight - 10, 120)
|
|
}
|
|
},
|
|
mounted () {
|
|
this.$nextTick(() => {
|
|
// 统一计算主表格和详情页签的高度,确保一致
|
|
const calculatedHeight = (window.innerHeight - 250) / 2
|
|
this.height = calculatedHeight
|
|
this.detailHeight = calculatedHeight
|
|
this.initPageData()
|
|
})
|
|
},
|
|
methods: {
|
|
/**
|
|
* 页面初始化入口:
|
|
* - 通用模式:直接查询;
|
|
* - 供应商模式:先加载当前用户供应商信息,再按供应商过滤查询。
|
|
*/
|
|
async initPageData () {
|
|
if (!this.isSupplierPageMode) {
|
|
this.getMainData()
|
|
return
|
|
}
|
|
const loaded = await this.loadCurrentUserSupplierContext()
|
|
if (!loaded) {
|
|
this.mainDataList = []
|
|
this.changeData(null)
|
|
return
|
|
}
|
|
this.pageIndex = 1
|
|
this.getMainData()
|
|
},
|
|
/**
|
|
* 读取当前登录用户绑定的供应商信息。
|
|
* 数据来源:GET /sys/user/info
|
|
* 结果用途:
|
|
* - currentSupplierNo:查询强制过滤 + 新增固定回填
|
|
* - currentSupplierName:新增供应商名称展示
|
|
*/
|
|
async loadCurrentUserSupplierContext () {
|
|
try {
|
|
const { data } = await this.$http({
|
|
url: this.$http.adornUrl('/sys/user/info'),
|
|
method: 'get',
|
|
params: this.$http.adornParams()
|
|
})
|
|
if (!data || data.code !== 0 || !data.user) {
|
|
this.$message.error((data && data.msg) || '获取当前用户信息失败')
|
|
return false
|
|
}
|
|
const supplierNo = String(data.user.supplierNo || '').trim()
|
|
if (!supplierNo) {
|
|
this.$message.warning('当前账号未维护供应商编码,请先在用户维护中配置')
|
|
return false
|
|
}
|
|
this.currentSupplierNo = supplierNo
|
|
this.currentSupplierName = String(data.user.supplierName || '').trim()
|
|
if (!this.currentSupplierName) {
|
|
const detail = await fetchSupplierDetail(supplierNo, this.$store.state.user.site)
|
|
this.currentSupplierName = detail
|
|
? String(detail.supplierName || detail.supplier_name || '').trim()
|
|
: ''
|
|
}
|
|
this.applyCurrentSupplierToSearchFilters()
|
|
return true
|
|
} catch (error) {
|
|
console.error('获取当前用户供应商信息失败:', error)
|
|
this.$message.error('获取当前用户供应商信息失败')
|
|
return false
|
|
}
|
|
},
|
|
/**
|
|
* 将当前用户供应商写入查询条件。
|
|
* 说明:supplierName 这里清空,避免名称模糊匹配干扰 supplierNo 精准过滤。
|
|
*/
|
|
applyCurrentSupplierToSearchFilters () {
|
|
if (!this.currentSupplierNo) {
|
|
return false
|
|
}
|
|
this.searchData.supplierNo = this.currentSupplierNo
|
|
this.searchData.supplierName = ''
|
|
return true
|
|
},
|
|
/**
|
|
* 将当前用户供应商写入新增表单(只读展示)。
|
|
*/
|
|
applyCurrentSupplierToAddForm () {
|
|
if (!this.currentSupplierNo) {
|
|
return false
|
|
}
|
|
this.$set(this.addFormData, 'supplierNo', this.currentSupplierNo)
|
|
this.$set(this.addFormData, 'supplierName', this.currentSupplierName || '')
|
|
return true
|
|
},
|
|
// 统一状态判断,兼容中文和英文状态值 - rqrq
|
|
isRowStatus (row, statusDbList) {
|
|
if (!row || !Array.isArray(statusDbList) || statusDbList.length === 0) {
|
|
return false
|
|
}
|
|
const rowStatusDb = row.statusDb ? String(row.statusDb).trim() : ''
|
|
if (statusDbList.indexOf(rowStatusDb) !== -1) {
|
|
return true
|
|
}
|
|
const statusLabelMap = {
|
|
Draft: '草稿',
|
|
Confirmed: '待审核',
|
|
Audited: '已下达',
|
|
Scheduled: '已排程',
|
|
ChangeApplying: '申请变更中'
|
|
}
|
|
const rowStatusLabel = row.status ? String(row.status).trim() : ''
|
|
return statusDbList.some(item => statusLabelMap[item] === rowStatusLabel)
|
|
},
|
|
resolveUserCode (val, tagNo) {
|
|
if (!val) return ''
|
|
if (tagNo === 2016) {
|
|
// ChooseList 2016: username, user_display
|
|
return val.username || ''
|
|
}
|
|
if (tagNo === 528 || tagNo === 529 || tagNo === 530) {
|
|
// ChooseList 528/529/530: UserName, User_display
|
|
return val.UserName || ''
|
|
}
|
|
return ''
|
|
},
|
|
resolveUserDisplay (val, tagNo) {
|
|
if (!val) return ''
|
|
if (tagNo === 2016) {
|
|
return val.user_display || ''
|
|
}
|
|
if (tagNo === 528 || tagNo === 529 || tagNo === 530) {
|
|
return val.User_display || ''
|
|
}
|
|
return ''
|
|
},
|
|
// 获取基础数据列表
|
|
getBaseList (val, type) {
|
|
this.tagNo = val
|
|
this.searchType = type || ''
|
|
this.$nextTick(() => {
|
|
let strVal = ''
|
|
let conSql = ''
|
|
if (val === 520) {
|
|
// 判断是搜索条件还是新增弹窗
|
|
if (this.addDialogVisible) {
|
|
strVal = this.addFormData.supplierNo || ''
|
|
} else {
|
|
strVal = this.searchData.supplierNo || ''
|
|
}
|
|
conSql = " and site = '" + this.$store.state.user.site + "'"
|
|
}
|
|
if (val === 530) {
|
|
if (type === 'mainPlanner') {
|
|
strVal = this.searchData.planner || ''
|
|
} else if (type === 'addPoPlanner') {
|
|
strVal = this.addPoFilter.planner || ''
|
|
} else if (type === 'orderSupplierPlanner') {
|
|
strVal = this.orderSupplierSearch.planner || ''
|
|
}
|
|
// 530 已在 ChooseList 中限定 PLANNER,这里仅做空值防御
|
|
conSql = " and username <> '' "
|
|
}
|
|
if (val === 2016) {
|
|
if (type === 'createBy') {
|
|
strVal = this.searchData.createBy || ''
|
|
} else if (type === 'qcOperator') {
|
|
strVal = this.searchData.qcOperator || ''
|
|
}
|
|
|
|
// 防止 Druid 拦截 where 1=1
|
|
conSql = " and username <> '' "
|
|
}
|
|
if (val === 2018) {
|
|
if (type === 'addressPortOfLoading') {
|
|
strVal = this.addressCreateForm.portOfLoading || ''
|
|
}
|
|
conSql = " and port_name <> '' "
|
|
}
|
|
this.$refs.baseList.init(val, strVal, conSql)
|
|
})
|
|
},
|
|
|
|
/* 列表方法的回调 */
|
|
getBaseData (val) {
|
|
if (this.tagNo === 520) {
|
|
// 判断是搜索条件还是新增弹窗
|
|
if (this.addDialogVisible) {
|
|
// 新增弹窗:SQL返回: supplier_no, supplier_name
|
|
const supplierNoVal = val.supplier_no || ''
|
|
const supplierNameVal = val.supplier_name || ''
|
|
this.$set(this.addFormData, 'supplierNo', supplierNoVal)
|
|
this.$set(this.addFormData, 'supplierName', supplierNameVal)
|
|
this.$set(this.addFormData, 'inspectAddressId', '')
|
|
this.$set(this.addFormData, 'inspectAddress', '')
|
|
this.$set(this.addFormData, 'inspectCityShort', '')
|
|
this.$set(this.addFormData, 'contact', '')
|
|
console.log('供应商编码赋值:', supplierNoVal, '供应商名称赋值:', supplierNameVal)
|
|
this.loadPoList()
|
|
// 查询供应商地址获取验货地址和联系人
|
|
if (supplierNoVal) {
|
|
this.fetchSupplierAddress(supplierNoVal)
|
|
}
|
|
} else {
|
|
// 搜索条件:SQL返回: supplier_no, supplier_name
|
|
const supplierNoVal = val.supplier_no || ''
|
|
this.searchData.supplierNo = supplierNoVal
|
|
console.log('供应商编码赋值:', supplierNoVal)
|
|
}
|
|
}
|
|
if (this.tagNo === 2016) {
|
|
const userCode = this.resolveUserCode(val, 2016)
|
|
if (this.searchType === 'createBy') {
|
|
this.searchData.createBy = userCode
|
|
} else if (this.searchType === 'qcOperator') {
|
|
this.searchData.qcOperator = userCode
|
|
}
|
|
}
|
|
if (this.tagNo === 530) {
|
|
const plannerVal = this.resolveUserCode(val, 530)
|
|
const plannerDisplay = this.resolveUserDisplay(val, 530) || plannerVal
|
|
if (this.searchType === 'mainPlanner') {
|
|
this.searchData.planner = plannerVal
|
|
} else if (this.searchType === 'addPoPlanner') {
|
|
this.addPoFilter.planner = plannerVal
|
|
this.addPoPlannerCodeFromChooser = plannerVal
|
|
this.addPoPlannerDisplayFromChooser = plannerDisplay
|
|
this.filterAddPoList()
|
|
} else if (this.searchType === 'orderSupplierPlanner') {
|
|
this.orderSupplierSearch.planner = plannerVal
|
|
}
|
|
}
|
|
if (this.tagNo === 2018) {
|
|
if (this.searchType === 'addressPortOfLoading') {
|
|
this.addressCreateForm.portOfLoading = val.port_name || val.code || ''
|
|
}
|
|
}
|
|
},
|
|
|
|
// 查询数据
|
|
getMainData () {
|
|
if (this.isSupplierPageMode) {
|
|
if (!this.currentSupplierNo && !this.applyCurrentSupplierToSearchFilters()) {
|
|
this.mainDataList = []
|
|
this.totalPage = 0
|
|
this.changeData(null)
|
|
return
|
|
}
|
|
this.applyCurrentSupplierToSearchFilters()
|
|
}
|
|
this.searchData.limit = this.pageSize
|
|
this.searchData.page = this.pageIndex
|
|
// 后端查询字段使用 planStartDateStr/planEndDateStr - rqrq
|
|
this.searchData.planStartDateStr = this.searchData.planStartDate || ''
|
|
this.searchData.planEndDateStr = this.searchData.planEndDate || ''
|
|
this.dataListLoading = true
|
|
|
|
searchInspectionRequestHeaderList(this.searchData).then(({ data }) => {
|
|
if (data.code === 0) {
|
|
this.mainDataList = data.page.list
|
|
|
|
// 调试信息:打印第一条数据的 hasModifiedQty 字段
|
|
if (this.mainDataList.length > 0) {
|
|
console.log('=== 主表格数据调试 ===')
|
|
console.log('第一条数据:', this.mainDataList[0])
|
|
console.log('hasModifiedQty 值:', this.mainDataList[0].hasModifiedQty)
|
|
console.log('=====================')
|
|
}
|
|
|
|
this.pageIndex = data.page.currPage
|
|
this.pageSize = data.page.pageSize
|
|
this.totalPage = data.page.totalCount
|
|
|
|
this.$nextTick(() => {
|
|
if (this.$refs.mainTable) {
|
|
this.$refs.mainTable.clearSelection()
|
|
}
|
|
})
|
|
|
|
// 判断是否有数据
|
|
if (this.mainDataList.length > 0) {
|
|
this.$refs.mainTable.setCurrentRow(this.mainDataList[0])
|
|
this.changeData(this.mainDataList[0])
|
|
} else {
|
|
this.changeData(null)
|
|
}
|
|
}
|
|
this.dataListLoading = false
|
|
}).catch(() => {
|
|
this.dataListLoading = false
|
|
})
|
|
},
|
|
|
|
// 每页数
|
|
sizeChangeHandle (val) {
|
|
this.pageSize = val
|
|
this.pageIndex = 1
|
|
this.getMainData()
|
|
},
|
|
|
|
// 当前页
|
|
currentChangeHandle (val) {
|
|
this.pageIndex = val
|
|
this.getMainData()
|
|
},
|
|
|
|
// 页签点击事件
|
|
handleTabClick (tab) {
|
|
// 每次点击页签都触发对应页签的查询
|
|
if (tab.name === 'detail') {
|
|
// 验货明细页签 - 组件内部 watch 会自动触发
|
|
this.$nextTick(() => {
|
|
if (this.$refs.inspectionDetailTab) {
|
|
this.$refs.inspectionDetailTab.loadDetailList()
|
|
}
|
|
})
|
|
} else if (tab.name === 'poDetail') {
|
|
// 验货关联PO明细页签
|
|
this.$nextTick(() => {
|
|
if (this.$refs.poDetailTab) {
|
|
this.$refs.poDetailTab.loadDetailList()
|
|
}
|
|
})
|
|
} else if (tab.name === 'result') {
|
|
// 验货结果页签
|
|
this.$nextTick(() => {
|
|
if (this.$refs.resultTab) {
|
|
this.$refs.resultTab.loadDetailList()
|
|
}
|
|
})
|
|
} else if (tab.name === 'attachment') {
|
|
// 附件管理页签 - 组件内部 watch 会自动触发
|
|
this.$nextTick(() => {
|
|
if (this.$refs.attachmentTab) {
|
|
this.$refs.attachmentTab.loadAttachmentTypeList()
|
|
}
|
|
})
|
|
} else if (tab.name === 'fee') {
|
|
// 费用明细页签 - 组件内部 watch 会自动触发
|
|
this.$nextTick(() => {
|
|
if (this.$refs.feeTab) {
|
|
this.$refs.feeTab.loadFeeDetailList()
|
|
}
|
|
})
|
|
}
|
|
},
|
|
|
|
// 行点击事件
|
|
changeData (row) {
|
|
this.currentRow = row ? JSON.parse(JSON.stringify(row)) : {}
|
|
},
|
|
|
|
// 新增验货申请
|
|
addInspectionRequest () {
|
|
this.addDialogMode = 'create'
|
|
this.resetAddForm()
|
|
if (this.isSupplierPageMode) {
|
|
if (!this.applyCurrentSupplierToAddForm()) {
|
|
this.$message.warning('当前账号未维护供应商编码,请先在用户维护中配置')
|
|
return
|
|
}
|
|
this.loadPoList()
|
|
this.fetchSupplierAddress(this.addFormData.supplierNo)
|
|
}
|
|
this.addDialogVisible = true
|
|
},
|
|
|
|
// 关闭新增弹窗
|
|
handleCloseAddDialog () {
|
|
this.addDialogVisible = false
|
|
this.resetAddForm()
|
|
this.addDialogMode = 'create'
|
|
},
|
|
|
|
// 重置表单
|
|
resetAddForm () {
|
|
const today = new Date()
|
|
const year = today.getFullYear()
|
|
const month = String(today.getMonth() + 1).padStart(2, '0')
|
|
const day = String(today.getDate()).padStart(2, '0')
|
|
const todayStr = `${year}-${month}-${day}`
|
|
|
|
this.addFormData = {
|
|
requestNo: '',
|
|
requestDate: todayStr,
|
|
supplierNo: '',
|
|
supplierName: '',
|
|
inspectAddressId: '',
|
|
inspectAddress: '',
|
|
inspectCityShort: '',
|
|
contact: '',
|
|
needInspectDate: ''
|
|
}
|
|
this.poList = []
|
|
this.filteredPoList = []
|
|
this.editPoDetailList = []
|
|
this.editPoDetailLoading = false
|
|
this.selectedPoList = []
|
|
this.addPoFilter = {
|
|
orderNo: '',
|
|
partNo: '',
|
|
item: '',
|
|
sku: '',
|
|
partDesc: '',
|
|
supplierName: '',
|
|
planner: ''
|
|
}
|
|
this.addPoPlannerCodeFromChooser = ''
|
|
this.addPoPlannerDisplayFromChooser = ''
|
|
this.poSupplierDialogVisible = false
|
|
this.poSupplierLoading = false
|
|
this.poSupplierList = []
|
|
this.poSupplierCurrentRow = null
|
|
this.poSupplierPageIndex = 1
|
|
this.poSupplierPageSize = 20
|
|
this.poSupplierTotal = 0
|
|
this.poSupplierSearch = {
|
|
supplierNo: '',
|
|
supplierName: ''
|
|
}
|
|
this.addressDialogVisible = false
|
|
this.addressLoading = false
|
|
this.addressList = []
|
|
this.addressCurrentRow = null
|
|
this.addressPageIndex = 1
|
|
this.addressPageSize = 20
|
|
this.addressTotal = 0
|
|
this.addressSearch = {
|
|
keyword: ''
|
|
}
|
|
this.addressCreateDialogVisible = false
|
|
this.addressCreateSaving = false
|
|
this.addressCreateForm = this.buildAddressCreateFormBySupplier('')
|
|
this.orderSupplierDialogVisible = false
|
|
this.orderSupplierLoading = false
|
|
this.orderSupplierList = []
|
|
this.orderSupplierCurrentRow = null
|
|
this.orderSupplierPageIndex = 1
|
|
this.orderSupplierPageSize = 50
|
|
this.orderSupplierTotal = 0
|
|
this.orderSupplierSearch = {
|
|
orderNo: '',
|
|
partNo: '',
|
|
item: '',
|
|
sku: '',
|
|
partDesc: '',
|
|
supplierName: '',
|
|
planner: ''
|
|
}
|
|
if (this.isSupplierPageMode) {
|
|
this.applyCurrentSupplierToAddForm()
|
|
}
|
|
this.pendingAutoSelectPoRow = null
|
|
if (this.$refs.addFormData) {
|
|
this.$refs.addFormData.clearValidate()
|
|
}
|
|
},
|
|
|
|
// 仅格式化到 yyyy-MM-dd,兼容 Date / 字符串 - rqrq
|
|
formatToDateOnly (value) {
|
|
if (!value) {
|
|
return ''
|
|
}
|
|
if (value instanceof Date) {
|
|
const year = value.getFullYear()
|
|
const month = String(value.getMonth() + 1).padStart(2, '0')
|
|
const day = String(value.getDate()).padStart(2, '0')
|
|
return `${year}-${month}-${day}`
|
|
}
|
|
const text = String(value).trim()
|
|
return text ? text.split(' ')[0] : ''
|
|
},
|
|
|
|
// 打开草稿编辑弹窗:仅允许修改建议验货日期/验货地址/联系人 - rqrq
|
|
async openEditInspectionDialog (row) {
|
|
this.resetAddForm()
|
|
this.addDialogMode = 'edit'
|
|
this.addDialogVisible = true
|
|
this.addFormData = {
|
|
requestNo: row.requestNo || '',
|
|
requestDate: this.formatToDateOnly(row.requestDate),
|
|
supplierNo: row.supplierNo || '',
|
|
supplierName: row.supplierName || '',
|
|
inspectAddressId: row.inspectAddressId || '',
|
|
inspectAddress: row.inspectAddress || '',
|
|
inspectCityShort: row.inspectCityShort || '',
|
|
contact: row.inspectContract || '',
|
|
needInspectDate: this.formatToDateOnly(row.needInspectDate)
|
|
}
|
|
await this.loadEditPoDetailList(row.requestNo, row.site || this.$store.state.user.site)
|
|
},
|
|
|
|
// 加载编辑弹窗PO明细(只读展示)
|
|
async loadEditPoDetailList (requestNo, site) {
|
|
if (!requestNo) {
|
|
this.editPoDetailList = []
|
|
return
|
|
}
|
|
this.editPoDetailLoading = true
|
|
try {
|
|
const { data } = await getInspectionRequestDetailSubList({
|
|
requestNo,
|
|
site: site || this.$store.state.user.site,
|
|
page: 1,
|
|
limit: 1000
|
|
})
|
|
if (data && data.code === 0) {
|
|
const rawList = (data.page && data.page.list) || []
|
|
const exactList = rawList.filter(item => {
|
|
const itemRequestNo = item.requestNo || item.request_no || ''
|
|
return !itemRequestNo || String(itemRequestNo) === String(requestNo)
|
|
})
|
|
this.editPoDetailList = exactList.map(item => ({
|
|
...item,
|
|
crd: this.formatToDateOnly(item.crd)
|
|
}))
|
|
} else {
|
|
this.editPoDetailList = []
|
|
this.$message.warning(data.msg || '加载PO明细失败')
|
|
}
|
|
} catch (error) {
|
|
this.editPoDetailList = []
|
|
console.error('加载编辑PO明细失败:', error)
|
|
this.$message.error('加载PO明细失败,请稍后重试')
|
|
} finally {
|
|
this.editPoDetailLoading = false
|
|
}
|
|
},
|
|
|
|
// 选择供应商
|
|
selectSupplier () {
|
|
this.tagNo = 520 // 设置tagNo,确保回调时能正确识别
|
|
this.$nextTick(() => {
|
|
const conSql = " and site = '" + this.$store.state.user.site + "'"
|
|
this.$refs.baseList.init(520, this.addFormData.supplierNo || '', conSql)
|
|
})
|
|
},
|
|
/**
|
|
* 新增供应商地址弹窗字段校验(与供应商地址页签新增逻辑保持一致)。
|
|
* 规则:必填字段不能为空字符串(仅空格也视为无效)。
|
|
*/
|
|
validateAddressCreateField (rule, value, callback) {
|
|
const normalizedValue = value === null || value === undefined ? '' : String(value).trim()
|
|
if (!normalizedValue) {
|
|
callback(new Error())
|
|
return
|
|
}
|
|
callback()
|
|
},
|
|
/**
|
|
* 构建“新增供应商地址”弹窗的默认表单对象。
|
|
* supplierId 固定使用当前验货申请选中的供应商编码,避免录错供应商。
|
|
*/
|
|
buildAddressCreateFormBySupplier (supplierId) {
|
|
const currentSite = String(this.$store.state.user.site || this.$store.state.user.currentSite || '').trim()
|
|
return {
|
|
supplierId: supplierId || '',
|
|
site: currentSite,
|
|
addressId: '',
|
|
companyName: '',
|
|
cityShort: '',
|
|
contact: '',
|
|
phoneNo: '',
|
|
address: '',
|
|
addressType: '验货地址',
|
|
active: 'Y',
|
|
email: '',
|
|
originCountry: '',
|
|
portOfLoading: '',
|
|
memo: '',
|
|
createBy: this.$store.state.user.name,
|
|
updateBy: this.$store.state.user.name
|
|
}
|
|
},
|
|
/**
|
|
* 在“选择验货地址”弹窗内快速新增供应商地址。
|
|
* 界面字段与 /srmSupplier-supplierList 地址页签新增弹窗保持一致。
|
|
*/
|
|
openAddressCreateDialog () {
|
|
const supplierNo = (this.addFormData.supplierNo || '').trim()
|
|
if (!supplierNo) {
|
|
this.$message.warning('请先选择供应商')
|
|
return
|
|
}
|
|
this.addressCreateForm = this.buildAddressCreateFormBySupplier(supplierNo)
|
|
this.addressCreateDialogVisible = true
|
|
this.$nextTick(() => {
|
|
if (this.$refs.addressCreateFormRef) {
|
|
this.$refs.addressCreateFormRef.clearValidate()
|
|
}
|
|
})
|
|
this.fetchSupplierInfoForAddressCreate(supplierNo)
|
|
},
|
|
/**
|
|
* 根据供应商编码回填默认信息(公司名称/联系人/电话/邮箱/地址)。
|
|
* 仅在新增地址弹窗中用于提高录入效率,不覆盖用户已输入内容。
|
|
*/
|
|
fetchSupplierInfoForAddressCreate (supplierNo) {
|
|
const normalizedSupplierNo = String(supplierNo || '').trim()
|
|
const currentSite = String(this.$store.state.user.site || this.$store.state.user.currentSite || '').trim()
|
|
if (!normalizedSupplierNo || !currentSite) {
|
|
return
|
|
}
|
|
searchSrmSupplierList({
|
|
site: currentSite,
|
|
supplierNo: normalizedSupplierNo,
|
|
page: 1,
|
|
limit: 1
|
|
}).then(({ data }) => {
|
|
if (!(data && data.code === 0)) {
|
|
return
|
|
}
|
|
const pageData = data.data || data.page
|
|
const supplierList = pageData && pageData.list ? pageData.list : (Array.isArray(pageData) ? pageData : [])
|
|
if (!supplierList || supplierList.length === 0) {
|
|
return
|
|
}
|
|
const supplierData = supplierList[0] || {}
|
|
this.addressCreateForm.companyName = supplierData.supplierName || supplierData.companyName || this.addressCreateForm.companyName || ''
|
|
if (!this.addressCreateForm.contact) {
|
|
this.addressCreateForm.contact = supplierData.contact || ''
|
|
}
|
|
if (!this.addressCreateForm.phoneNo) {
|
|
this.addressCreateForm.phoneNo = supplierData.phoneNo || supplierData.phoneNo1 || ''
|
|
}
|
|
if (!this.addressCreateForm.email) {
|
|
this.addressCreateForm.email = supplierData.email || supplierData.email1 || ''
|
|
}
|
|
if (!this.addressCreateForm.address) {
|
|
this.addressCreateForm.address = supplierData.address || ''
|
|
}
|
|
}).catch((error) => {
|
|
console.error('查询供应商信息失败:', error)
|
|
})
|
|
},
|
|
/**
|
|
* 保存新增供应商地址并刷新地址列表。
|
|
* 保存成功后不关闭“选择验货地址”弹窗,便于用户立即选择新地址。
|
|
*/
|
|
saveCreatedAddress () {
|
|
if (!this.$refs.addressCreateFormRef) {
|
|
return
|
|
}
|
|
this.$refs.addressCreateFormRef.validate((valid) => {
|
|
if (!valid) {
|
|
return
|
|
}
|
|
this.addressCreateSaving = true
|
|
this.addressCreateForm.createBy = this.$store.state.user.name
|
|
this.addressCreateForm.updateBy = this.$store.state.user.name
|
|
createSrmSupplierAddress(this.addressCreateForm).then(({ data }) => {
|
|
if (data && data.code === 0) {
|
|
this.$message.success('新增供应商地址成功')
|
|
this.addressCreateDialogVisible = false
|
|
this.loadAddressList()
|
|
} else {
|
|
this.$alert(data.msg || '新增供应商地址失败', '错误', { confirmButtonText: '确定' })
|
|
}
|
|
}).catch((error) => {
|
|
console.error('保存供应商地址失败:', error)
|
|
this.$message.error('保存失败: ' + (error.message || '网络错误'))
|
|
}).finally(() => {
|
|
this.addressCreateSaving = false
|
|
})
|
|
})
|
|
},
|
|
/**
|
|
* 新增地址弹窗关闭后的收尾动作:
|
|
* - 清理校验状态
|
|
* - 重置为当前供应商默认表单,避免残留上次输入
|
|
*/
|
|
handleAddressCreateDialogClosed () {
|
|
if (this.$refs.addressCreateFormRef) {
|
|
this.$refs.addressCreateFormRef.clearValidate()
|
|
}
|
|
this.addressCreateForm = this.buildAddressCreateFormBySupplier(this.addFormData.supplierNo || '')
|
|
this.addressCreateSaving = false
|
|
},
|
|
|
|
// 打开验货地址选择弹窗(仅查询当前供应商的验货地址)
|
|
openAddressDialog () {
|
|
if (!this.addFormData.supplierNo) {
|
|
this.$message.warning('请先选择供应商')
|
|
return
|
|
}
|
|
this.addressDialogVisible = true
|
|
this.addressPageIndex = 1
|
|
this.addressSearch.keyword = ''
|
|
this.addressCurrentRow = null
|
|
this.addressCreateForm = this.buildAddressCreateFormBySupplier(this.addFormData.supplierNo || '')
|
|
this.loadAddressList()
|
|
},
|
|
|
|
// 标准化地址列表字段,兼容下划线和驼峰返回
|
|
normalizeAddressRows (list) {
|
|
return (list || []).map(item => ({
|
|
...item,
|
|
supplierId: item.supplierId || item.supplier_id || '',
|
|
addressId: item.addressId || item.address_id || '',
|
|
cityShort: item.cityShort || item.city_short || '',
|
|
companyName: item.companyName || item.company_name || '',
|
|
contact: item.contact || '',
|
|
phoneNo: item.phoneNo || item.phone_no || '',
|
|
email: item.email || '',
|
|
address: item.address || '',
|
|
addressType: item.addressType || item.address_type || ''
|
|
}))
|
|
},
|
|
|
|
// 根据供应商加载验货地址列表
|
|
loadAddressList () {
|
|
if (!this.addFormData.supplierNo) {
|
|
this.addressList = []
|
|
this.addressTotal = 0
|
|
return
|
|
}
|
|
const params = {
|
|
site: this.$store.state.user.site,
|
|
supplierId: this.addFormData.supplierNo,
|
|
addressType: '验货地址',
|
|
page: this.addressPageIndex,
|
|
limit: this.addressPageSize
|
|
}
|
|
if (this.addressSearch.keyword) {
|
|
params.address = this.addressSearch.keyword
|
|
}
|
|
this.addressLoading = true
|
|
searchSrmSupplierAddressList(params).then(({ data }) => {
|
|
if (data && data.code === 0) {
|
|
const pageData = data.page || data.data || {}
|
|
const rawList = Array.isArray(pageData.list) ? pageData.list : (Array.isArray(pageData) ? pageData : [])
|
|
this.addressList = this.normalizeAddressRows(rawList)
|
|
this.addressTotal = pageData.totalCount || this.addressList.length
|
|
this.addressPageIndex = pageData.currPage || this.addressPageIndex
|
|
this.addressPageSize = pageData.pageSize || this.addressPageSize
|
|
this.$nextTick(() => {
|
|
if (this.addressList.length > 0) {
|
|
this.addressCurrentRow = this.addressList[0]
|
|
if (this.$refs.addressTable) {
|
|
this.$refs.addressTable.setCurrentRow(this.addressCurrentRow)
|
|
}
|
|
} else {
|
|
this.addressCurrentRow = null
|
|
if (this.$refs.addressTable) {
|
|
this.$refs.addressTable.setCurrentRow()
|
|
}
|
|
}
|
|
})
|
|
} else {
|
|
this.addressList = []
|
|
this.addressCurrentRow = null
|
|
this.addressTotal = 0
|
|
}
|
|
}).catch(error => {
|
|
this.addressList = []
|
|
this.addressCurrentRow = null
|
|
this.addressTotal = 0
|
|
console.error('查询供应商地址失败:', error)
|
|
this.$message.error('查询验货地址失败')
|
|
}).finally(() => {
|
|
this.addressLoading = false
|
|
})
|
|
},
|
|
|
|
searchAddressList () {
|
|
this.addressPageIndex = 1
|
|
this.loadAddressList()
|
|
},
|
|
|
|
resetAddressSearch () {
|
|
this.addressSearch.keyword = ''
|
|
this.addressPageIndex = 1
|
|
this.loadAddressList()
|
|
},
|
|
|
|
onAddressPageSizeChange (val) {
|
|
this.addressPageSize = val
|
|
this.addressPageIndex = 1
|
|
this.loadAddressList()
|
|
},
|
|
|
|
onAddressPageCurrentChange (val) {
|
|
this.addressPageIndex = val
|
|
this.loadAddressList()
|
|
},
|
|
|
|
onAddressCurrentChange (row) {
|
|
this.addressCurrentRow = row || null
|
|
},
|
|
|
|
onAddressRowDblClick (row) {
|
|
this.selectAddressRow(row)
|
|
},
|
|
|
|
confirmAddressSelect () {
|
|
this.selectAddressRow(this.addressCurrentRow)
|
|
},
|
|
|
|
selectAddressRow (row, overwriteContact = true) {
|
|
if (!row || !row.addressId) {
|
|
this.$message.warning('请选择验货地址')
|
|
return
|
|
}
|
|
this.$set(this.addFormData, 'inspectAddressId', row.addressId || '')
|
|
this.$set(this.addFormData, 'inspectAddress', row.address || '')
|
|
this.$set(this.addFormData, 'inspectCityShort', row.cityShort || '')
|
|
if (overwriteContact || !this.addFormData.contact) {
|
|
this.$set(this.addFormData, 'contact', row.contact || '')
|
|
}
|
|
this.addressDialogVisible = false
|
|
},
|
|
|
|
// 根据供应商ID预带默认验货地址(若存在)
|
|
fetchSupplierAddress (supplierId) {
|
|
if (!supplierId) {
|
|
return
|
|
}
|
|
const params = {
|
|
site: this.$store.state.user.site,
|
|
supplierId: supplierId,
|
|
addressType: '验货地址',
|
|
page: 1,
|
|
limit: 1
|
|
}
|
|
|
|
searchSrmSupplierAddressList(params).then(({ data }) => {
|
|
if (data && data.code === 0) {
|
|
const pageData = data.page || data.data || {}
|
|
const rawList = Array.isArray(pageData.list) ? pageData.list : (Array.isArray(pageData) ? pageData : [])
|
|
const addressList = this.normalizeAddressRows(rawList)
|
|
if (addressList.length > 0) {
|
|
this.selectAddressRow(addressList[0], true)
|
|
} else {
|
|
this.$set(this.addFormData, 'inspectAddressId', '')
|
|
this.$set(this.addFormData, 'inspectAddress', '')
|
|
this.$set(this.addFormData, 'inspectCityShort', '')
|
|
this.$set(this.addFormData, 'contact', '')
|
|
}
|
|
}
|
|
}).catch(error => {
|
|
console.error('查询供应商地址失败:', error)
|
|
})
|
|
},
|
|
|
|
// 打开新增弹窗专用供应商查询
|
|
openPoSupplierDialog () {
|
|
if (this.isSupplierPageMode) {
|
|
return
|
|
}
|
|
this.poSupplierDialogVisible = true
|
|
this.poSupplierPageIndex = 1
|
|
this.poSupplierCurrentRow = null
|
|
this.poSupplierSearch.supplierNo = this.addFormData.supplierNo || ''
|
|
this.poSupplierSearch.supplierName = ''
|
|
this.loadPoSupplierList()
|
|
},
|
|
|
|
// 查询新增弹窗专用供应商列表
|
|
loadPoSupplierList () {
|
|
const params = {
|
|
site: this.$store.state.user.site,
|
|
supplierNo: this.poSupplierSearch.supplierNo || '',
|
|
supplierName: this.poSupplierSearch.supplierName || '',
|
|
page: this.poSupplierPageIndex,
|
|
limit: this.poSupplierPageSize
|
|
}
|
|
this.poSupplierLoading = true
|
|
queryPoSupplierPage(params).then(({ data }) => {
|
|
if (data.code === 0 && data.page) {
|
|
this.poSupplierList = (data.page.list || []).map(item => ({
|
|
...item,
|
|
supplierNo: item.supplierNo || item.supplier_no || '',
|
|
supplierName: item.supplierName || item.supplier_name || '',
|
|
planner: item.planner || ''
|
|
}))
|
|
this.poSupplierTotal = data.page.totalCount || 0
|
|
this.poSupplierPageIndex = data.page.currPage || this.poSupplierPageIndex
|
|
this.poSupplierPageSize = data.page.pageSize || this.poSupplierPageSize
|
|
this.$nextTick(() => {
|
|
if (this.poSupplierList.length > 0) {
|
|
this.poSupplierCurrentRow = this.poSupplierList[0]
|
|
if (this.$refs.poSupplierTable) {
|
|
this.$refs.poSupplierTable.setCurrentRow(this.poSupplierCurrentRow)
|
|
}
|
|
} else {
|
|
this.poSupplierCurrentRow = null
|
|
if (this.$refs.poSupplierTable) {
|
|
this.$refs.poSupplierTable.setCurrentRow()
|
|
}
|
|
}
|
|
})
|
|
} else {
|
|
this.poSupplierList = []
|
|
this.poSupplierTotal = 0
|
|
this.poSupplierCurrentRow = null
|
|
}
|
|
}).catch(() => {
|
|
this.poSupplierList = []
|
|
this.poSupplierTotal = 0
|
|
this.poSupplierCurrentRow = null
|
|
this.$message.error('加载供应商列表失败')
|
|
}).finally(() => {
|
|
this.poSupplierLoading = false
|
|
})
|
|
},
|
|
|
|
// 供应商弹框查询
|
|
searchPoSupplierList () {
|
|
this.poSupplierPageIndex = 1
|
|
this.loadPoSupplierList()
|
|
},
|
|
|
|
// 供应商弹框重置查询
|
|
resetPoSupplierSearch () {
|
|
this.poSupplierSearch.supplierNo = ''
|
|
this.poSupplierSearch.supplierName = ''
|
|
this.poSupplierPageIndex = 1
|
|
this.loadPoSupplierList()
|
|
},
|
|
|
|
// 供应商弹框页大小变化
|
|
onPoSupplierPageSizeChange (val) {
|
|
this.poSupplierPageSize = val
|
|
this.poSupplierPageIndex = 1
|
|
this.loadPoSupplierList()
|
|
},
|
|
|
|
// 供应商弹框页码变化
|
|
onPoSupplierPageCurrentChange (val) {
|
|
this.poSupplierPageIndex = val
|
|
this.loadPoSupplierList()
|
|
},
|
|
|
|
// 供应商弹框选中行变化
|
|
onPoSupplierCurrentChange (row) {
|
|
this.poSupplierCurrentRow = row || null
|
|
},
|
|
|
|
// 供应商弹框双击选择
|
|
onPoSupplierRowDblClick (row) {
|
|
this.selectPoSupplier(row)
|
|
},
|
|
|
|
// 供应商弹框点击确认
|
|
confirmPoSupplierSelect () {
|
|
this.selectPoSupplier(this.poSupplierCurrentRow)
|
|
},
|
|
|
|
// 回填供应商并刷新PO明细
|
|
selectPoSupplier (row) {
|
|
if (!row || !row.supplierNo) {
|
|
this.$message.warning('请选择供应商')
|
|
return
|
|
}
|
|
const supplierNoVal = row.supplierNo || ''
|
|
const supplierNameVal = row.supplierName || ''
|
|
this.$set(this.addFormData, 'supplierNo', supplierNoVal)
|
|
this.$set(this.addFormData, 'supplierName', supplierNameVal)
|
|
this.$set(this.addFormData, 'inspectAddressId', '')
|
|
this.$set(this.addFormData, 'inspectAddress', '')
|
|
this.$set(this.addFormData, 'inspectCityShort', '')
|
|
this.$set(this.addFormData, 'contact', '')
|
|
this.addPoFilter = {
|
|
orderNo: '',
|
|
partNo: '',
|
|
item: '',
|
|
sku: '',
|
|
partDesc: '',
|
|
supplierName: '',
|
|
planner: ''
|
|
}
|
|
this.addPoPlannerCodeFromChooser = ''
|
|
this.addPoPlannerDisplayFromChooser = ''
|
|
this.poSupplierDialogVisible = false
|
|
this.orderSupplierDialogVisible = false
|
|
this.loadPoList()
|
|
this.fetchSupplierAddress(supplierNoVal)
|
|
},
|
|
|
|
// 判断两条PO明细是否为同一行(优先用内部主键,再回退到展示字段)
|
|
isSamePoDetailRow (sourceRow, targetRow) {
|
|
if (!sourceRow || !targetRow) {
|
|
return false
|
|
}
|
|
const sourceOrderNo = String(sourceRow.orderNo || sourceRow.order_no || '')
|
|
const sourceItemNo = String(sourceRow.itemNo || sourceRow.item_no || '')
|
|
const targetOrderNo = String(targetRow.orderNo || targetRow.order_no || '')
|
|
const targetItemNo = String(targetRow.itemNo || targetRow.item_no || '')
|
|
if (sourceOrderNo && sourceItemNo && targetOrderNo && targetItemNo) {
|
|
return sourceOrderNo === targetOrderNo && sourceItemNo === targetItemNo
|
|
}
|
|
return String(sourceRow.orderRef1 || '') === String(targetRow.orderRef1 || '') &&
|
|
String(sourceRow.orderRef2 || '') === String(targetRow.orderRef2 || '') &&
|
|
String(sourceRow.partNo || '') === String(targetRow.partNo || '')
|
|
},
|
|
|
|
// 供应商回填后,自动勾选“从订单选择供应商”时选中的那条PO明细
|
|
applyPendingAutoSelectPoRow () {
|
|
if (!this.pendingAutoSelectPoRow) {
|
|
return
|
|
}
|
|
const targetRow = this.pendingAutoSelectPoRow
|
|
this.$nextTick(() => {
|
|
const tableRef = this.$refs.addPoTable
|
|
if (!tableRef) {
|
|
this.pendingAutoSelectPoRow = null
|
|
return
|
|
}
|
|
let matchedRow = null
|
|
for (let i = 0; i < this.filteredPoList.length; i++) {
|
|
if (this.isSamePoDetailRow(this.filteredPoList[i], targetRow)) {
|
|
matchedRow = this.filteredPoList[i]
|
|
break
|
|
}
|
|
}
|
|
if (matchedRow) {
|
|
tableRef.toggleRowSelection(matchedRow, true)
|
|
}
|
|
this.pendingAutoSelectPoRow = null
|
|
})
|
|
},
|
|
|
|
// 打开“从订单选择供应商”弹框(不默认筛供应商)
|
|
openOrderSupplierDialog () {
|
|
if (this.isSupplierPageMode) {
|
|
return
|
|
}
|
|
this.orderSupplierDialogVisible = true
|
|
this.orderSupplierCurrentRow = null
|
|
this.orderSupplierPageIndex = 1
|
|
this.orderSupplierTotal = 0
|
|
this.orderSupplierSearch = {
|
|
orderNo: '',
|
|
partNo: '',
|
|
item: '',
|
|
sku: '',
|
|
partDesc: '',
|
|
supplierName: '',
|
|
planner: ''
|
|
}
|
|
this.loadOrderSupplierList()
|
|
},
|
|
|
|
// 订单来源供应商弹框查询
|
|
searchOrderSupplierByPo () {
|
|
this.orderSupplierPageIndex = 1
|
|
this.loadOrderSupplierList()
|
|
},
|
|
|
|
// 加载订单来源供应商分页列表(专用后端方法)
|
|
loadOrderSupplierList () {
|
|
const params = {
|
|
site: this.$store.state.user.site,
|
|
page: this.orderSupplierPageIndex,
|
|
limit: this.orderSupplierPageSize,
|
|
orderNo: this.orderSupplierSearch.orderNo || '',
|
|
partNo: this.orderSupplierSearch.partNo || '',
|
|
item: this.orderSupplierSearch.item || '',
|
|
sku: this.orderSupplierSearch.sku || '',
|
|
partDesc: this.orderSupplierSearch.partDesc || '',
|
|
supplierName: this.orderSupplierSearch.supplierName || '',
|
|
planner: this.orderSupplierSearch.planner || ''
|
|
}
|
|
this.orderSupplierLoading = true
|
|
queryPoSupplierOrderPage(params).then(({ data }) => {
|
|
if (data.code === 0 && data.page) {
|
|
const list = (data.page.list || []).map(item => ({
|
|
...item,
|
|
supplierNo: item.supplierNo || item.supplier_no || '',
|
|
supplierName: item.supplierName || item.supplier_name || '',
|
|
planner: item.planner || '',
|
|
crd: item.crd ? String(item.crd).split(' ')[0] : ''
|
|
}))
|
|
this.orderSupplierList = list
|
|
this.orderSupplierTotal = data.page.totalCount || 0
|
|
this.orderSupplierPageIndex = data.page.currPage || this.orderSupplierPageIndex
|
|
this.orderSupplierPageSize = data.page.pageSize || this.orderSupplierPageSize
|
|
this.$nextTick(() => {
|
|
if (this.orderSupplierList.length > 0) {
|
|
this.orderSupplierCurrentRow = this.orderSupplierList[0]
|
|
if (this.$refs.orderSupplierTable) {
|
|
this.$refs.orderSupplierTable.setCurrentRow(this.orderSupplierCurrentRow)
|
|
}
|
|
} else {
|
|
this.orderSupplierCurrentRow = null
|
|
if (this.$refs.orderSupplierTable) {
|
|
this.$refs.orderSupplierTable.setCurrentRow()
|
|
}
|
|
}
|
|
})
|
|
} else {
|
|
this.orderSupplierList = []
|
|
this.orderSupplierCurrentRow = null
|
|
this.orderSupplierTotal = 0
|
|
}
|
|
}).catch(() => {
|
|
this.orderSupplierList = []
|
|
this.orderSupplierCurrentRow = null
|
|
this.orderSupplierTotal = 0
|
|
this.$message.error('加载订单来源供应商失败')
|
|
}).finally(() => {
|
|
this.orderSupplierLoading = false
|
|
})
|
|
},
|
|
|
|
// 重置“从订单选择供应商”筛选条件
|
|
resetOrderSupplierSearch () {
|
|
this.orderSupplierSearch = {
|
|
orderNo: '',
|
|
partNo: '',
|
|
item: '',
|
|
sku: '',
|
|
partDesc: '',
|
|
supplierName: '',
|
|
planner: ''
|
|
}
|
|
this.orderSupplierPageIndex = 1
|
|
this.loadOrderSupplierList()
|
|
},
|
|
|
|
// 订单来源供应商弹框页大小变化
|
|
onOrderSupplierPageSizeChange (val) {
|
|
this.orderSupplierPageSize = val
|
|
this.orderSupplierPageIndex = 1
|
|
this.loadOrderSupplierList()
|
|
},
|
|
|
|
// 订单来源供应商弹框页码变化
|
|
onOrderSupplierPageCurrentChange (val) {
|
|
this.orderSupplierPageIndex = val
|
|
this.loadOrderSupplierList()
|
|
},
|
|
|
|
// “从订单选择供应商”选中行变化
|
|
onOrderSupplierCurrentChange (row) {
|
|
this.orderSupplierCurrentRow = row || null
|
|
},
|
|
|
|
// “从订单选择供应商”双击选择
|
|
onOrderSupplierRowDblClick (row) {
|
|
this.selectSupplierByOrderRow(row)
|
|
},
|
|
|
|
// “从订单选择供应商”点击确认
|
|
confirmOrderSupplierSelect () {
|
|
this.selectSupplierByOrderRow(this.orderSupplierCurrentRow)
|
|
},
|
|
|
|
// 从订单行回填供应商并触发原有后续流程
|
|
selectSupplierByOrderRow (row) {
|
|
if (!row) {
|
|
this.$message.warning('请选择订单行')
|
|
return
|
|
}
|
|
const supplierNo = row.supplierNo || row.supplier_no || ''
|
|
const supplierName = row.supplierName || row.supplier_name || ''
|
|
if (!supplierNo) {
|
|
this.$message.warning('所选订单行缺少供应商编码')
|
|
return
|
|
}
|
|
this.pendingAutoSelectPoRow = {
|
|
orderNo: row.orderNo || row.order_no || '',
|
|
itemNo: row.itemNo || row.item_no || '',
|
|
orderRef1: row.orderRef1 || '',
|
|
orderRef2: row.orderRef2 || '',
|
|
partNo: row.partNo || ''
|
|
}
|
|
this.selectPoSupplier({
|
|
supplierNo: supplierNo,
|
|
supplierName: supplierName
|
|
})
|
|
},
|
|
|
|
// 加载PO列表(选择供应商后调用)
|
|
loadPoList () {
|
|
if (!this.addFormData.supplierNo) {
|
|
this.$message.warning('请先选择供应商')
|
|
return
|
|
}
|
|
|
|
const params = {
|
|
supplierNo: this.addFormData.supplierNo,
|
|
site: this.$store.state.user.site,
|
|
page: 1,
|
|
limit: 1000
|
|
}
|
|
|
|
queryPoPage(params).then(({ data }) => {
|
|
if (data.code === 0 && data.page) {
|
|
this.poList = data.page.list.map(item => ({
|
|
...item,
|
|
supplierNo: item.supplierNo || item.supplier_no || this.addFormData.supplierNo || '',
|
|
supplierName: item.supplierName || item.supplier_name || this.addFormData.supplierName || '',
|
|
planner: item.planner || '',
|
|
inspectQty: item.waitInspectQty || 0, // 默认值为未验货数量
|
|
shipMethod: item.shipMethod || '',// 运输方式
|
|
crd: item.crd ? item.crd.split(' ')[0] : ''
|
|
}))
|
|
this.filterAddPoList()
|
|
this.applyPendingAutoSelectPoRow()
|
|
} else {
|
|
this.poList = []
|
|
this.filteredPoList = []
|
|
this.pendingAutoSelectPoRow = null
|
|
this.$message.info('该供应商暂无可申请验货的PO')
|
|
}
|
|
}).catch(() => {
|
|
this.poList = []
|
|
this.filteredPoList = []
|
|
this.pendingAutoSelectPoRow = null
|
|
this.$message.error('加载PO列表失败')
|
|
})
|
|
},
|
|
|
|
// 表格选择变化
|
|
handleSelectionChange (selection) {
|
|
this.selectedPoList = selection
|
|
},
|
|
// Planner 输入若被手工改动,则清理双击选择时缓存的显示名映射
|
|
handleAddPoPlannerInput (value) {
|
|
const plannerKeyword = String(value || '').trim()
|
|
const chooserPlannerCode = String(this.addPoPlannerCodeFromChooser || '').trim()
|
|
if (!plannerKeyword || plannerKeyword !== chooserPlannerCode) {
|
|
this.addPoPlannerCodeFromChooser = ''
|
|
this.addPoPlannerDisplayFromChooser = ''
|
|
}
|
|
},
|
|
|
|
// 新增验货申请-PO明细筛选
|
|
filterAddPoList () {
|
|
let result = [...this.poList]
|
|
const filter = this.addPoFilter || {}
|
|
const orderNoKeyword = (filter.orderNo || '').toLowerCase().trim()
|
|
const partNoKeyword = (filter.partNo || '').toLowerCase().trim()
|
|
const itemKeyword = (filter.item || '').toLowerCase().trim()
|
|
const skuKeyword = (filter.sku || '').toLowerCase().trim()
|
|
const partDescKeyword = (filter.partDesc || '').toLowerCase().trim()
|
|
const supplierNameKeyword = (filter.supplierName || '').toLowerCase().trim()
|
|
const plannerKeyword = (filter.planner || '').toLowerCase().trim()
|
|
const chooserPlannerCode = String(this.addPoPlannerCodeFromChooser || '').toLowerCase().trim()
|
|
const chooserPlannerDisplay = String(this.addPoPlannerDisplayFromChooser || '').toLowerCase().trim()
|
|
const useChooserDisplayKeyword = plannerKeyword && chooserPlannerCode && plannerKeyword === chooserPlannerCode
|
|
? chooserPlannerDisplay
|
|
: ''
|
|
|
|
if (orderNoKeyword) {
|
|
result = result.filter(item => {
|
|
const orderRef1 = String(item.orderRef1 || '').toLowerCase()
|
|
const orderNo = String(item.orderNo || item.order_no || '').toLowerCase()
|
|
return orderRef1.includes(orderNoKeyword) || orderNo.includes(orderNoKeyword)
|
|
})
|
|
}
|
|
if (partNoKeyword) {
|
|
result = result.filter(item => String(item.partNo || '').toLowerCase().includes(partNoKeyword))
|
|
}
|
|
if (itemKeyword) {
|
|
result = result.filter(item => String(item.item || '').toLowerCase().includes(itemKeyword))
|
|
}
|
|
if (skuKeyword) {
|
|
result = result.filter(item => String(item.sku || '').toLowerCase().includes(skuKeyword))
|
|
}
|
|
if (partDescKeyword) {
|
|
result = result.filter(item => String(item.partDesc || '').toLowerCase().includes(partDescKeyword))
|
|
}
|
|
if (supplierNameKeyword) {
|
|
result = result.filter(item => String(item.supplierName || '').toLowerCase().includes(supplierNameKeyword))
|
|
}
|
|
if (plannerKeyword) {
|
|
result = result.filter(item => {
|
|
const plannerText = String(item.planner || '').toLowerCase()
|
|
if (plannerText.includes(plannerKeyword)) {
|
|
return true
|
|
}
|
|
return useChooserDisplayKeyword ? plannerText.includes(useChooserDisplayKeyword) : false
|
|
})
|
|
}
|
|
this.filteredPoList = result
|
|
},
|
|
|
|
// 新增验货申请-PO筛选重置
|
|
resetAddPoFilter () {
|
|
this.addPoFilter = {
|
|
orderNo: '',
|
|
partNo: '',
|
|
item: '',
|
|
sku: '',
|
|
partDesc: '',
|
|
supplierName: '',
|
|
planner: ''
|
|
}
|
|
this.addPoPlannerCodeFromChooser = ''
|
|
this.addPoPlannerDisplayFromChooser = ''
|
|
this.filterAddPoList()
|
|
},
|
|
|
|
// CRD日期排序方法
|
|
sortCrdDate (a, b) {
|
|
const dateA = a.crd || ''
|
|
const dateB = b.crd || ''
|
|
|
|
if (!dateA && !dateB) return 0
|
|
if (!dateA) return -1
|
|
if (!dateB) return 1
|
|
|
|
return dateA.localeCompare(dateB)
|
|
},
|
|
|
|
// 验货数量变化
|
|
handleInspectQtyChange (row, value) {
|
|
console.log('验货数量变化:', row.orderRef1, value)
|
|
// 确保数据被正确更新
|
|
this.$set(row, 'inspectQty', value)
|
|
},
|
|
|
|
|
|
// 保存
|
|
handleSaveAdd () {
|
|
if (this.isEditDialogMode) {
|
|
this.handleSaveEdit()
|
|
return
|
|
}
|
|
console.log('开始保存,当前选择的PO列表:', this.selectedPoList)
|
|
console.log('表单数据:', this.addFormData)
|
|
|
|
this.$refs.addFormData.validate((valid) => {
|
|
console.log('表单验证结果:', valid)
|
|
if (valid) {
|
|
if (this.selectedPoList.length === 0) {
|
|
this.$message.warning('请至少选择一条PO明细')
|
|
return
|
|
}
|
|
|
|
// 检查验货数量
|
|
const hasInvalidQty = this.selectedPoList.some(item => !item.inspectQty || item.inspectQty <= 0)
|
|
if (hasInvalidQty) {
|
|
this.$message.warning('请填写有效的验货数量')
|
|
return
|
|
}
|
|
|
|
// 构建提交数据
|
|
const submitData = {
|
|
requestDate: this.addFormData.requestDate,
|
|
needInspectDate: this.addFormData.needInspectDate,
|
|
supplierNo: this.addFormData.supplierNo,
|
|
inspectAddress: this.addFormData.inspectAddressId || this.addFormData.inspectAddress,
|
|
inspectAddressId: this.addFormData.inspectAddressId || '',
|
|
inspectCityShort: this.addFormData.inspectCityShort || '',
|
|
inspectContract: this.addFormData.contact,
|
|
remark: '',
|
|
items: this.selectedPoList.map(item => ({
|
|
orderNo: item.orderNo || item.order_ref1 || item.orderRef1,
|
|
itemNo: item.itemNo || item.item_no || item.order_ref2 || item.orderRef2,
|
|
partNo: item.partNo,
|
|
orderRef1: item.orderRef1,
|
|
orderRef2: item.orderRef2,
|
|
qty: item.inspectQty,
|
|
shipMethod: item.shipMethod,
|
|
crd: item.crd
|
|
}))
|
|
}
|
|
|
|
console.log('提交的数据:', submitData)
|
|
|
|
saveInspectionRequest(submitData).then(({ data }) => {
|
|
console.log('保存接口返回:', data)
|
|
if (data.code === 0) {
|
|
this.$message.success('保存成功')
|
|
this.handleCloseAddDialog()
|
|
this.getMainData()
|
|
} else {
|
|
this.$message.error(data.msg || '保存失败')
|
|
}
|
|
}).catch((error) => {
|
|
console.error('保存接口错误:', error)
|
|
this.$message.error('保存失败,请稍后重试')
|
|
})
|
|
} else {
|
|
console.log('表单验证失败')
|
|
this.$message.warning('请填写完整的表单信息')
|
|
}
|
|
})
|
|
},
|
|
|
|
// 草稿编辑保存:仅更新基础信息中的可编辑字段 - rqrq
|
|
handleSaveEdit () {
|
|
this.$refs.addFormData.validate((valid) => {
|
|
if (!valid) {
|
|
this.$message.warning('请填写完整的表单信息')
|
|
return
|
|
}
|
|
const submitData = {
|
|
requestNo: this.addFormData.requestNo,
|
|
needInspectDate: this.addFormData.needInspectDate,
|
|
inspectAddress: this.addFormData.inspectAddressId || this.addFormData.inspectAddress,
|
|
inspectAddressId: this.addFormData.inspectAddressId || '',
|
|
inspectContract: this.addFormData.contact
|
|
}
|
|
updateInspectionRequest(submitData).then(({ data }) => {
|
|
if (data.code === 0) {
|
|
this.$message.success('修改成功')
|
|
this.handleCloseAddDialog()
|
|
this.getMainData()
|
|
} else {
|
|
this.$message.error(data.msg || '修改失败')
|
|
}
|
|
}).catch((error) => {
|
|
console.error('修改接口错误:', error)
|
|
this.$message.error('修改失败,请稍后重试')
|
|
})
|
|
})
|
|
},
|
|
|
|
// Excel导入
|
|
importExcel () {
|
|
this.uploadDialogVisible = true
|
|
this.uploadFileName = ''
|
|
this.uploadFile = null
|
|
this.uploadPreviewList = []
|
|
},
|
|
|
|
// 文件选择变化
|
|
handleFileChange (file) {
|
|
this.uploadFile = file.raw
|
|
this.uploadFileName = file.name
|
|
},
|
|
|
|
// 预览上传数据
|
|
previewUpload () {
|
|
if (!this.uploadFile) {
|
|
this.$message.warning('请先选择文件')
|
|
return
|
|
}
|
|
|
|
const formData = new FormData()
|
|
formData.append('file', this.uploadFile)
|
|
|
|
// 调用后端预览接口
|
|
previewUpload(this.uploadFile).then(({ data }) => {
|
|
if (data && data.code === 0) {
|
|
this.uploadPreviewList = data.data || []
|
|
this.$message.success('文件解析成功,请确认数据后点击保存')
|
|
} else {
|
|
this.$message.error(data.msg || '文件解析失败')
|
|
}
|
|
}).catch((error) => {
|
|
console.error('文件解析失败:', error)
|
|
const errorMsg = (error.response && error.response.data && error.response.data.msg) || error.message || '未知错误'
|
|
this.$message.error('文件解析失败: ' + errorMsg)
|
|
})
|
|
},
|
|
|
|
// 确认上传
|
|
confirmUpload () {
|
|
if (this.uploadPreviewList.length === 0) {
|
|
this.$message.warning('没有可保存的数据')
|
|
return
|
|
}
|
|
|
|
this.$confirm(`确认保存 ${this.uploadPreviewList.length} 条数据吗?`, '提示', {
|
|
confirmButtonText: '确定',
|
|
cancelButtonText: '取消',
|
|
type: 'warning'
|
|
}).then(() => {
|
|
// 调用后端保存接口
|
|
batchSave(this.uploadFile).then(({ data }) => {
|
|
if (data && data.code === 0) {
|
|
this.$message.success('数据保存成功')
|
|
this.uploadDialogVisible = false
|
|
this.getMainData()
|
|
} else {
|
|
this.$message.error(data.msg || '数据保存失败')
|
|
}
|
|
}).catch((error) => {
|
|
console.error('数据保存失败:', error)
|
|
const errorMsg = (error.response && error.response.data && error.response.data.msg) || error.message || '未知错误'
|
|
this.$message.error('数据保存失败: ' + errorMsg)
|
|
})
|
|
}).catch(() => {})
|
|
},
|
|
|
|
// 下载模板
|
|
downloadTemplate () {
|
|
const loading = this.$loading({
|
|
lock: true,
|
|
text: '正在下载模板...',
|
|
spinner: 'el-icon-loading',
|
|
background: 'rgba(0, 0, 0, 0.7)'
|
|
})
|
|
|
|
this.$http({
|
|
url: this.$http.adornUrl('/inspection/downloadTemplate'),
|
|
method: 'post',
|
|
responseType: 'blob'
|
|
}).then(response => {
|
|
loading.close()
|
|
|
|
// 创建下载文件
|
|
const blob = new Blob([response.data], {
|
|
type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'
|
|
})
|
|
|
|
const url = window.URL.createObjectURL(blob)
|
|
const link = document.createElement('a')
|
|
link.href = url
|
|
link.download = '验货申请导入模板.xlsx'
|
|
|
|
document.body.appendChild(link)
|
|
link.click()
|
|
document.body.removeChild(link)
|
|
|
|
window.URL.revokeObjectURL(url)
|
|
|
|
this.$message.success('模板下载成功')
|
|
}).catch(error => {
|
|
loading.close()
|
|
console.error('模板下载失败:', error)
|
|
this.$message.error('模板下载失败,请联系管理员')
|
|
})
|
|
},
|
|
|
|
// 导出
|
|
exportExcel () {
|
|
console.log('开始导出...')
|
|
|
|
// 生成文件名(使用原生 Date)
|
|
const now = new Date()
|
|
const year = now.getFullYear()
|
|
const month = String(now.getMonth() + 1).padStart(2, '0')
|
|
const day = String(now.getDate()).padStart(2, '0')
|
|
const hour = String(now.getHours()).padStart(2, '0')
|
|
const minute = String(now.getMinutes()).padStart(2, '0')
|
|
const second = String(now.getSeconds()).padStart(2, '0')
|
|
const exportName = `检验申请单${year}${month}${day}${hour}${minute}${second}`
|
|
|
|
console.log('导出参数:', this.searchData)
|
|
|
|
// 获取当前查询条件
|
|
const exportParams = {
|
|
...this.searchData,
|
|
limit: 99999,
|
|
page: 1
|
|
}
|
|
|
|
try {
|
|
excel.exportTable({
|
|
url: 'inspection/searchInspectionRequestHeaderList',
|
|
columnMapping: this.columnArray1,
|
|
mergeSetting: [],
|
|
params: exportParams,
|
|
fileName: exportName + '.xlsx',
|
|
rowFetcher: res => {
|
|
console.log('导出数据响应:', res)
|
|
if (res.data && res.data.page && res.data.page.list) {
|
|
return res.data.page.list
|
|
}
|
|
console.error('响应数据结构异常:', res.data)
|
|
this.$message.error('导出数据格式异常,请查看控制台')
|
|
return []
|
|
},
|
|
columnFormatter: [],
|
|
dropColumns: []
|
|
})
|
|
console.log('导出请求已发送')
|
|
} catch (error) {
|
|
console.error('导出失败:', error)
|
|
this.$message.error('导出失败: ' + error.message)
|
|
}
|
|
},
|
|
|
|
// 确认验货申请
|
|
confirmInspection (row) {
|
|
this.$confirm('确定要确认该验货申请吗?', '提示', {
|
|
confirmButtonText: '确定',
|
|
cancelButtonText: '取消',
|
|
type: 'warning'
|
|
}).then(() => {
|
|
confirmInspectionRequest(row.requestNo).then(({ data }) => {
|
|
if (data.code === 0) {
|
|
this.$message.success('确认成功')
|
|
this.getMainData()
|
|
} else {
|
|
this.$message.error(data.msg || '确认失败')
|
|
}
|
|
}).catch((error) => {
|
|
console.error('确认接口错误:', error)
|
|
this.$message.error('确认失败,请稍后重试')
|
|
})
|
|
}).catch(() => {
|
|
this.$message.info('已取消确认')
|
|
})
|
|
},
|
|
|
|
// 删除验货申请
|
|
deleteInspectionRequest (row) {
|
|
if (!this.isRowStatus(row, ['Draft', 'Confirmed'])) {
|
|
this.$message.warning('只有草稿和待审核状态允许删除')
|
|
return
|
|
}
|
|
this.$confirm('确定要删除该验货申请吗?', '提示', {
|
|
confirmButtonText: '确定',
|
|
cancelButtonText: '取消',
|
|
type: 'warning'
|
|
}).then(() => {
|
|
deleteInspectionRequest(row.requestNo).then(({ data }) => {
|
|
if (data.code === 0) {
|
|
this.$message.success('删除成功')
|
|
this.getMainData()
|
|
} else {
|
|
this.$message.error(data.msg || '删除失败')
|
|
}
|
|
}).catch((error) => {
|
|
console.error('删除接口错误:', error)
|
|
this.$message.error('删除失败,请稍后重试')
|
|
})
|
|
}).catch(() => {
|
|
this.$message.info('已取消删除')
|
|
})
|
|
},
|
|
|
|
// 草稿编辑:仅可编辑建议验货日期、验货地址、联系人 - rqrq
|
|
editInspectionRequest (row) {
|
|
if (!this.isRowStatus(row, ['Draft'])) {
|
|
this.$message.warning('只有草稿状态允许编辑')
|
|
return
|
|
}
|
|
this.openEditInspectionDialog(row)
|
|
},
|
|
|
|
// 申请变更(已下达/已排程) - rqrq
|
|
applyChangeRequest (row) {
|
|
if (!this.isRowStatus(row, ['Audited', 'Scheduled'])) {
|
|
this.$message.warning('只有已下达或已排程状态允许申请变更')
|
|
return
|
|
}
|
|
const isScheduled = this.isRowStatus(row, ['Scheduled'])
|
|
if (isScheduled) {
|
|
this.applyChangeForm = {
|
|
requestNo: row.requestNo || '',
|
|
statusDb: 'Scheduled',
|
|
changeRemark: ''
|
|
}
|
|
this.applyChangeDialogVisible = true
|
|
return
|
|
}
|
|
const tipText = '已下达申请单申请变更后将回到【草稿】,是否继续?'
|
|
this.$confirm(tipText, '提示', {
|
|
confirmButtonText: '确定',
|
|
cancelButtonText: '取消',
|
|
type: 'warning'
|
|
}).then(() => {
|
|
this.executeApplyChangeRequest(row.requestNo, '')
|
|
}).catch(() => {
|
|
this.$message.info('已取消申请变更')
|
|
})
|
|
},
|
|
|
|
// 提交已排程的变更申请(需填写备注)- rqrq
|
|
submitApplyChangeRequest () {
|
|
const requestNo = this.applyChangeForm.requestNo || ''
|
|
const changeRemark = this.applyChangeForm.changeRemark ? this.applyChangeForm.changeRemark.trim() : ''
|
|
if (!requestNo) {
|
|
this.$message.warning('申请单号不能为空')
|
|
return
|
|
}
|
|
if (!changeRemark) {
|
|
this.$message.warning('请填写变更备注')
|
|
return
|
|
}
|
|
this.$confirm('确定提交变更申请吗?', '提示', {
|
|
confirmButtonText: '确定',
|
|
cancelButtonText: '取消',
|
|
type: 'warning'
|
|
}).then(() => {
|
|
this.executeApplyChangeRequest(requestNo, changeRemark)
|
|
}).catch(() => {
|
|
this.$message.info('已取消提交')
|
|
})
|
|
},
|
|
|
|
executeApplyChangeRequest (requestNo, changeRemark) {
|
|
this.applyChangeLoading = true
|
|
applyChangeInspectionRequest(requestNo, { changeRemark }).then(({ data }) => {
|
|
if (data && data.code === 0) {
|
|
this.$message.success('申请变更成功')
|
|
this.applyChangeDialogVisible = false
|
|
this.getMainData()
|
|
} else {
|
|
this.$message.error((data && data.msg) || '申请变更失败')
|
|
}
|
|
}).catch((error) => {
|
|
console.error('申请变更接口错误:', error)
|
|
this.$message.error('申请变更失败,请稍后重试')
|
|
}).finally(() => {
|
|
this.applyChangeLoading = false
|
|
})
|
|
}
|
|
}
|
|
}
|
|
</script>
|
|
|
|
<style scoped lang="scss">
|
|
.search-form-inline {
|
|
background: #fff;
|
|
padding: 0;
|
|
margin-bottom: 0;
|
|
}
|
|
|
|
.search-row {
|
|
display: flex;
|
|
align-items: flex-end;
|
|
flex-wrap: wrap;
|
|
gap: 0;
|
|
margin-bottom: 0;
|
|
}
|
|
|
|
.search-item {
|
|
flex: none;
|
|
margin-bottom: 0;
|
|
margin-right: 12px;
|
|
}
|
|
|
|
/* 使用 Element UI 默认字体大小,不再覆盖 */
|
|
.search-item /deep/ .el-form-item__label {
|
|
padding-bottom: 0;
|
|
line-height: 1.2;
|
|
}
|
|
|
|
.search-btn-item {
|
|
flex: none;
|
|
margin-bottom: 0;
|
|
margin-right: 0;
|
|
}
|
|
|
|
.search-item /deep/ .el-form-item__content {
|
|
line-height: normal;
|
|
}
|
|
|
|
.date-range {
|
|
display: flex;
|
|
align-items: center;
|
|
}
|
|
|
|
.split {
|
|
padding: 0 6px;
|
|
color: #606266;
|
|
font-size: 13px;
|
|
}
|
|
|
|
/**
|
|
* 验货申请详情页签统一高度容器:
|
|
* 1) 固定高度:保证“基本信息/明细/结果/费用/附件”视觉高度一致;
|
|
* 2) 内部滚动:内容超高时在当前页签滚动,避免整体布局抖动。
|
|
*/
|
|
.tab-pane-content {
|
|
width: 100%;
|
|
overflow-y: auto;
|
|
overflow-x: hidden;
|
|
}
|
|
|
|
/deep/ .customer-tab .el-tabs__content {
|
|
padding: 5px !important;
|
|
}
|
|
|
|
.form-section {
|
|
margin-bottom: 15px;
|
|
padding-bottom: 15px;
|
|
border-bottom: 1px solid #ebeef5;
|
|
padding: 5px 10px;
|
|
}
|
|
|
|
.add-dialog-form /deep/ .el-form-item {
|
|
margin-bottom: 10px;
|
|
}
|
|
|
|
.add-dialog-form /deep/ .el-form-item__label {
|
|
text-align: left;
|
|
float: none;
|
|
display: block;
|
|
padding: 0 0 5px 0;
|
|
line-height: 1;
|
|
font-size: 13px;
|
|
}
|
|
|
|
.add-dialog-form /deep/ .el-form-item__content {
|
|
margin-left: 0 !important;
|
|
}
|
|
|
|
.po-section {
|
|
.section-title {
|
|
font-size: 14px;
|
|
font-weight: bold;
|
|
color: #303133;
|
|
margin-bottom: 8px;
|
|
}
|
|
|
|
.section-desc {
|
|
font-size: 12px;
|
|
color: #909399;
|
|
margin-bottom: 10px;
|
|
}
|
|
}
|
|
|
|
.dialog-footer {
|
|
text-align: center;
|
|
}
|
|
|
|
/deep/ .el-input-number .el-input__inner {
|
|
text-align: right !important;
|
|
padding-right: 32px !important;
|
|
padding-left: 8px !important;
|
|
box-sizing: border-box;
|
|
}
|
|
|
|
/deep/ .el-input .el-input--mini {
|
|
line-height: 20px;
|
|
}
|
|
|
|
/deep/ .el-input-number .el-input--mini {
|
|
line-height: 20px;
|
|
}
|
|
|
|
/* PO表格输入控件防遮挡 */
|
|
.po-section {
|
|
|
|
/deep/ .el-table .cell {
|
|
height: auto;
|
|
line-height: 20px;
|
|
overflow: hidden !important;
|
|
text-overflow: ellipsis;
|
|
white-space: nowrap;
|
|
padding-left: 4px;
|
|
padding-right: 4px;
|
|
}
|
|
|
|
/deep/ .el-input,
|
|
/deep/ .el-select {
|
|
width: 100% !important;
|
|
}
|
|
|
|
/deep/ .el-input-number .el-input__inner {
|
|
padding-left: 8px !important;
|
|
padding-right: 35px !important;
|
|
text-align: right;
|
|
}
|
|
|
|
/deep/ .el-input-number {
|
|
width: 120px !important;
|
|
min-width: 120px !important;
|
|
}
|
|
|
|
/deep/ .el-select .el-input__inner {
|
|
padding-right: 25px !important;
|
|
}
|
|
}
|
|
|
|
// 数字输入框按钮样式修复
|
|
/deep/ .el-input-number {
|
|
position: relative;
|
|
|
|
.el-input-number__increase,
|
|
.el-input-number__decrease {
|
|
width: 28px;
|
|
height: 50%;
|
|
position: absolute;
|
|
right: 0;
|
|
display: flex;
|
|
align-items: center;
|
|
justify-content: center;
|
|
background-color: #f5f7fa;
|
|
border: none;
|
|
cursor: pointer;
|
|
transition: all 0.2s;
|
|
font-size: 12px;
|
|
|
|
&:hover {
|
|
background-color: #ecf5ff;
|
|
color: #409eff;
|
|
}
|
|
|
|
&:active {
|
|
background-color: #d9e1f0;
|
|
}
|
|
}
|
|
|
|
.el-input-number__increase {
|
|
top: 0;
|
|
bottom: auto;
|
|
border-bottom: 1px solid #dcdfe6;
|
|
border-top-right-radius: 4px;
|
|
}
|
|
|
|
.el-input-number__decrease {
|
|
top: auto;
|
|
bottom: 0;
|
|
border-bottom-right-radius: 4px;
|
|
}
|
|
|
|
// 确保输入框右边留出按钮空间
|
|
.el-input__inner {
|
|
padding-right: 32px !important;
|
|
}
|
|
}
|
|
|
|
// 数字输入框按钮样式修复
|
|
/deep/ .el-input-number {
|
|
position: relative;
|
|
|
|
.el-input-number__increase,
|
|
.el-input-number__decrease {
|
|
width: 28px;
|
|
height: 50%;
|
|
position: absolute;
|
|
right: 0;
|
|
display: flex;
|
|
align-items: center;
|
|
justify-content: center;
|
|
background-color: #f5f7fa;
|
|
border: none;
|
|
cursor: pointer;
|
|
transition: all 0.2s;
|
|
font-size: 12px;
|
|
|
|
&:hover {
|
|
background-color: #ecf5ff;
|
|
color: #409eff;
|
|
}
|
|
|
|
&:active {
|
|
background-color: #d9e1f0;
|
|
}
|
|
}
|
|
|
|
.el-input-number__increase {
|
|
top: 0;
|
|
bottom: auto;
|
|
border-bottom: 1px solid #dcdfe6;
|
|
border-top-right-radius: 4px;
|
|
}
|
|
|
|
.el-input-number__decrease {
|
|
top: auto;
|
|
bottom: 0;
|
|
border-bottom-right-radius: 4px;
|
|
}
|
|
|
|
.el-input__inner {
|
|
padding-right: 32px !important;
|
|
}
|
|
}
|
|
|
|
/deep/ .el-input-number--mini {
|
|
.el-input-number__increase,
|
|
.el-input-number__decrease {
|
|
width: 24px;
|
|
font-size: 10px;
|
|
}
|
|
|
|
.el-input__inner {
|
|
padding-right: 28px !important;
|
|
}
|
|
}
|
|
|
|
|
|
.po-section {
|
|
|
|
/deep/ .el-date-editor.el-input,
|
|
/deep/ .el-date-editor.el-input__inner {
|
|
width: 100%;
|
|
}
|
|
|
|
/deep/ .el-date-editor .el-input__inner {
|
|
height: 28px;
|
|
line-height: 28px;
|
|
padding-left: 10px;
|
|
padding-right: 10px;
|
|
font-size: 12px;
|
|
}
|
|
|
|
/deep/ .el-date-editor .el-input__prefix {
|
|
display: none;
|
|
}
|
|
|
|
/deep/ .el-date-editor .el-input__suffix {
|
|
right: 5px;
|
|
}
|
|
}
|
|
|
|
.choose-label {
|
|
color: #2ec7c9;
|
|
cursor: pointer;
|
|
font-weight: 500;
|
|
}
|
|
|
|
.choose-label:hover {
|
|
text-decoration: underline;
|
|
}
|
|
|
|
.po-supplier-search-form {
|
|
margin-bottom: 8px;
|
|
}
|
|
|
|
.order-supplier-search-form {
|
|
margin-bottom: 8px;
|
|
}
|
|
|
|
.add-po-search-form {
|
|
margin-bottom: 8px;
|
|
}
|
|
</style>
|