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

<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>