|
|
|
|
@ -0,0 +1,903 @@
|
|
|
|
|
<template>
|
|
|
|
|
<div class="p-2">
|
|
|
|
|
<!-- 审批按钮组件 -->
|
|
|
|
|
<el-card shadow="never" style="margin-top: 0">
|
|
|
|
|
<approvalButton
|
|
|
|
|
@submitForm="submitForm"
|
|
|
|
|
@approvalVerifyOpen="approvalVerifyOpen"
|
|
|
|
|
@handleApprovalRecord="handleApprovalRecord"
|
|
|
|
|
:buttonLoading="buttonLoading"
|
|
|
|
|
:id="form.shippingBillId"
|
|
|
|
|
:status="form.flowStatus"
|
|
|
|
|
:pageType="routeParams.type"
|
|
|
|
|
:mode="false"
|
|
|
|
|
/>
|
|
|
|
|
</el-card>
|
|
|
|
|
|
|
|
|
|
<!-- 基本信息区域 -->
|
|
|
|
|
<el-card shadow="never" style="margin-top: 0">
|
|
|
|
|
<template #header>
|
|
|
|
|
<div style="text-align: left; font-weight: bold; font-size: 18px">基本信息</div>
|
|
|
|
|
</template>
|
|
|
|
|
<el-form
|
|
|
|
|
ref="shippingBillFormRef"
|
|
|
|
|
:model="form"
|
|
|
|
|
:loading="buttonLoading"
|
|
|
|
|
:disabled="routeParams.type === 'view' || routeParams.type === 'approval'"
|
|
|
|
|
:rules="rules"
|
|
|
|
|
label-width="120px"
|
|
|
|
|
>
|
|
|
|
|
<el-row :gutter="20">
|
|
|
|
|
<el-col :span="12">
|
|
|
|
|
<el-form-item label="发货单号" prop="shippingCode">
|
|
|
|
|
<el-input v-model="form.shippingCode" placeholder="请输入发货单号">
|
|
|
|
|
<template #append>
|
|
|
|
|
<el-button type="primary" @click="generateShippingCode" :disabled="isCodeGenerated">生成单号</el-button>
|
|
|
|
|
</template>
|
|
|
|
|
</el-input>
|
|
|
|
|
</el-form-item>
|
|
|
|
|
</el-col>
|
|
|
|
|
<el-col :span="12">
|
|
|
|
|
<el-form-item label="发货方式" prop="shippingMode">
|
|
|
|
|
<el-select v-model="form.shippingMode" placeholder="请选择发货方式" style="width: 100%">
|
|
|
|
|
<el-option v-for="dict in shipping_mode" :key="dict.value" :label="dict.label" :value="dict.value" />
|
|
|
|
|
</el-select>
|
|
|
|
|
</el-form-item>
|
|
|
|
|
</el-col>
|
|
|
|
|
<el-col :span="12">
|
|
|
|
|
<el-form-item label="绑定类型" prop="bindType">
|
|
|
|
|
<el-radio-group v-model="form.bindType">
|
|
|
|
|
<el-radio-button label="1">按项目</el-radio-button>
|
|
|
|
|
<el-radio-button label="2">按合同</el-radio-button>
|
|
|
|
|
</el-radio-group>
|
|
|
|
|
</el-form-item>
|
|
|
|
|
</el-col>
|
|
|
|
|
<el-col :span="12" v-if="form.bindType === '1'">
|
|
|
|
|
<el-form-item label="项目" prop="projectId">
|
|
|
|
|
<el-input v-model="selectedProjectName" placeholder="请选择项目" readonly>
|
|
|
|
|
<template #suffix>
|
|
|
|
|
<el-icon style="cursor: pointer" @click="openProjectSelect">
|
|
|
|
|
<Search />
|
|
|
|
|
</el-icon>
|
|
|
|
|
</template>
|
|
|
|
|
</el-input>
|
|
|
|
|
</el-form-item>
|
|
|
|
|
</el-col>
|
|
|
|
|
<el-col :span="12" v-if="form.bindType === '1'">
|
|
|
|
|
<el-form-item label="项目编号" prop="projectCode">
|
|
|
|
|
<el-input v-model="form.projectCode" disabled placeholder="自动带入" />
|
|
|
|
|
</el-form-item>
|
|
|
|
|
</el-col>
|
|
|
|
|
<el-col :span="12" v-if="form.bindType === '2'">
|
|
|
|
|
<el-form-item label="合同" prop="contractId">
|
|
|
|
|
<el-input v-model="selectedContractName" placeholder="请选择合同" readonly>
|
|
|
|
|
<template #suffix>
|
|
|
|
|
<el-icon style="cursor: pointer" @click="openContractSelect">
|
|
|
|
|
<Search />
|
|
|
|
|
</el-icon>
|
|
|
|
|
</template>
|
|
|
|
|
</el-input>
|
|
|
|
|
</el-form-item>
|
|
|
|
|
</el-col>
|
|
|
|
|
<el-col :span="12" v-if="form.bindType === '2'">
|
|
|
|
|
<el-form-item label="合同编号" prop="contractCode">
|
|
|
|
|
<el-input v-model="form.contractCode" disabled placeholder="自动带入" />
|
|
|
|
|
</el-form-item>
|
|
|
|
|
</el-col>
|
|
|
|
|
<el-col :span="12" v-if="form.bindType === '2' && selectedSapOrderCode">
|
|
|
|
|
<el-form-item label="SAP订单号">
|
|
|
|
|
<el-input v-model="selectedSapOrderCode" disabled placeholder="自动带入" />
|
|
|
|
|
</el-form-item>
|
|
|
|
|
</el-col>
|
|
|
|
|
<el-col :span="12">
|
|
|
|
|
<el-form-item label="客户" prop="customerId">
|
|
|
|
|
<el-select v-model="form.customerId" placeholder="请选择客户" filterable style="width: 100%" @change="handleCustomerChange">
|
|
|
|
|
<el-option v-for="item in customerList" :key="item.customerId" :label="item.customerName" :value="item.customerId" />
|
|
|
|
|
</el-select>
|
|
|
|
|
</el-form-item>
|
|
|
|
|
</el-col>
|
|
|
|
|
<el-col :span="12">
|
|
|
|
|
<el-form-item label="收货地址" prop="shippingAddress">
|
|
|
|
|
<el-input v-model="form.shippingAddress" placeholder="请输入收货地址" />
|
|
|
|
|
</el-form-item>
|
|
|
|
|
</el-col>
|
|
|
|
|
<el-col :span="12">
|
|
|
|
|
<el-form-item label="收货联系人" prop="receiverName">
|
|
|
|
|
<el-input v-model="form.receiverName" placeholder="请输入收货联系人" />
|
|
|
|
|
</el-form-item>
|
|
|
|
|
</el-col>
|
|
|
|
|
<el-col :span="12">
|
|
|
|
|
<el-form-item label="收货联系电话" prop="receiverPhone">
|
|
|
|
|
<el-input v-model="form.receiverPhone" placeholder="请输入收货联系电话" />
|
|
|
|
|
</el-form-item>
|
|
|
|
|
</el-col>
|
|
|
|
|
<el-col :span="12">
|
|
|
|
|
<el-form-item label="计划到货时间" prop="planArrivalTime">
|
|
|
|
|
<el-date-picker
|
|
|
|
|
v-model="form.planArrivalTime"
|
|
|
|
|
type="datetime"
|
|
|
|
|
value-format="YYYY-MM-DD HH:mm:ss"
|
|
|
|
|
placeholder="请选择计划到货时间"
|
|
|
|
|
style="width: 100%"
|
|
|
|
|
/>
|
|
|
|
|
</el-form-item>
|
|
|
|
|
</el-col>
|
|
|
|
|
<el-col :span="12" v-if="form.shippingMode === '2'">
|
|
|
|
|
<el-form-item label="供应商" prop="supplierId">
|
|
|
|
|
<el-select v-model="form.supplierId" placeholder="请选择供应商" filterable style="width: 100%" @change="handleSupplierChange">
|
|
|
|
|
<el-option v-for="item in supplierList" :key="item.supplierId" :label="item.supplierName" :value="item.supplierId" />
|
|
|
|
|
</el-select>
|
|
|
|
|
</el-form-item>
|
|
|
|
|
</el-col>
|
|
|
|
|
<el-col :span="12" v-if="form.shippingMode === '1'">
|
|
|
|
|
<el-form-item label="发货仓库" prop="warehouseId">
|
|
|
|
|
<el-select v-model="form.warehouseId" placeholder="请选择仓库" filterable style="width: 100%" @change="handleWarehouseChange">
|
|
|
|
|
<el-option v-for="item in warehouseList" :key="item.warehouseId" :label="item.warehouseName" :value="item.warehouseId" />
|
|
|
|
|
</el-select>
|
|
|
|
|
</el-form-item>
|
|
|
|
|
</el-col>
|
|
|
|
|
<el-col :span="24">
|
|
|
|
|
<el-form-item label="发货说明" prop="directions">
|
|
|
|
|
<el-input v-model="form.directions" type="textarea" placeholder="请输入发货说明" :rows="2" />
|
|
|
|
|
</el-form-item>
|
|
|
|
|
</el-col>
|
|
|
|
|
</el-row>
|
|
|
|
|
</el-form>
|
|
|
|
|
</el-card>
|
|
|
|
|
|
|
|
|
|
<!-- 物流信息区域 -->
|
|
|
|
|
<el-card shadow="never" style="margin-top: 0">
|
|
|
|
|
<template #header>
|
|
|
|
|
<div style="text-align: left; font-weight: bold; font-size: 18px">物流信息</div>
|
|
|
|
|
</template>
|
|
|
|
|
<el-form :model="form" :disabled="routeParams.type === 'view' || routeParams.type === 'approval'" label-width="120px">
|
|
|
|
|
<el-row :gutter="20">
|
|
|
|
|
<el-col :span="12">
|
|
|
|
|
<el-form-item label="物流公司" prop="logisticsCompany">
|
|
|
|
|
<el-input v-model="form.logisticsCompany" placeholder="请输入物流公司" />
|
|
|
|
|
</el-form-item>
|
|
|
|
|
</el-col>
|
|
|
|
|
<el-col :span="12">
|
|
|
|
|
<el-form-item label="运单号" prop="trackingNo">
|
|
|
|
|
<el-input v-model="form.trackingNo" placeholder="请输入运单号" />
|
|
|
|
|
</el-form-item>
|
|
|
|
|
</el-col>
|
|
|
|
|
<el-col :span="12">
|
|
|
|
|
<el-form-item label="物流联系电话" prop="logisticsPhone">
|
|
|
|
|
<el-input v-model="form.logisticsPhone" placeholder="请输入物流联系电话" />
|
|
|
|
|
</el-form-item>
|
|
|
|
|
</el-col>
|
|
|
|
|
</el-row>
|
|
|
|
|
</el-form>
|
|
|
|
|
</el-card>
|
|
|
|
|
|
|
|
|
|
<!-- 发货明细区域 -->
|
|
|
|
|
<el-card shadow="never" style="margin-top: 0">
|
|
|
|
|
<template #header>
|
|
|
|
|
<el-row :gutter="10" type="flex" align="middle">
|
|
|
|
|
<el-col :span="1.5">
|
|
|
|
|
<span style="font-weight: bold; font-size: 18px">发货明细</span>
|
|
|
|
|
</el-col>
|
|
|
|
|
<el-col :span="3">
|
|
|
|
|
<!-- 物料来源切换 -->
|
|
|
|
|
<el-radio-group
|
|
|
|
|
v-model="materialSourceType"
|
|
|
|
|
size="small"
|
|
|
|
|
@change="handleMaterialSourceChange"
|
|
|
|
|
:disabled="routeParams.type === 'view' || routeParams.type === 'approval'"
|
|
|
|
|
>
|
|
|
|
|
<el-radio-button value="1">ERP物料</el-radio-button>
|
|
|
|
|
<el-radio-button value="2">WMS物料</el-radio-button>
|
|
|
|
|
</el-radio-group>
|
|
|
|
|
</el-col>
|
|
|
|
|
<el-col :span="1.5">
|
|
|
|
|
<el-button type="primary" icon="Plus" @click="handleAddDetail" v-if="routeParams.type !== 'view' && routeParams.type !== 'approval'">
|
|
|
|
|
新增物料
|
|
|
|
|
</el-button>
|
|
|
|
|
</el-col>
|
|
|
|
|
</el-row>
|
|
|
|
|
</template>
|
|
|
|
|
|
|
|
|
|
<el-table :data="detailsList" v-loading="buttonLoading" border>
|
|
|
|
|
<el-table-column type="index" label="序号" width="60" align="center" />
|
|
|
|
|
<el-table-column label="物料编码" align="center" prop="materialCode" min-width="120" />
|
|
|
|
|
<el-table-column label="物料名称" align="center" prop="materialName" min-width="150" />
|
|
|
|
|
<el-table-column label="规格型号" align="center" prop="materielSpecification" min-width="120" />
|
|
|
|
|
<el-table-column label="批次号" align="center" prop="batchNumber" width="120" />
|
|
|
|
|
<el-table-column label="发货数量" align="center" prop="shippingStockAmount" width="120">
|
|
|
|
|
<template #default="scope">
|
|
|
|
|
<el-input-number
|
|
|
|
|
v-model="scope.row.shippingStockAmount"
|
|
|
|
|
:min="0"
|
|
|
|
|
:precision="2"
|
|
|
|
|
size="small"
|
|
|
|
|
style="width: 100%"
|
|
|
|
|
:disabled="routeParams.type === 'view' || routeParams.type === 'approval'"
|
|
|
|
|
/>
|
|
|
|
|
</template>
|
|
|
|
|
</el-table-column>
|
|
|
|
|
<el-table-column label="单位" align="center" prop="unitName" width="80" />
|
|
|
|
|
<el-table-column label="单价" align="center" prop="unitPrice" width="100">
|
|
|
|
|
<template #default="scope">
|
|
|
|
|
<el-input-number
|
|
|
|
|
v-model="scope.row.unitPrice"
|
|
|
|
|
:min="0"
|
|
|
|
|
:precision="2"
|
|
|
|
|
:controls="false"
|
|
|
|
|
size="small"
|
|
|
|
|
style="width: 100%"
|
|
|
|
|
:disabled="routeParams.type === 'view' || routeParams.type === 'approval'"
|
|
|
|
|
@change="calculateTotalPrice(scope.row)"
|
|
|
|
|
/>
|
|
|
|
|
</template>
|
|
|
|
|
</el-table-column>
|
|
|
|
|
<el-table-column label="总价" align="center" prop="totalPrice" width="100">
|
|
|
|
|
<template #default="scope">
|
|
|
|
|
{{ scope.row.totalPrice ? Number(scope.row.totalPrice).toFixed(2) : '0.00' }}
|
|
|
|
|
</template>
|
|
|
|
|
</el-table-column>
|
|
|
|
|
<el-table-column label="备注" align="center" prop="remark" min-width="120">
|
|
|
|
|
<template #default="scope">
|
|
|
|
|
<el-input
|
|
|
|
|
v-model="scope.row.remark"
|
|
|
|
|
placeholder="备注"
|
|
|
|
|
size="small"
|
|
|
|
|
:disabled="routeParams.type === 'view' || routeParams.type === 'approval'"
|
|
|
|
|
/>
|
|
|
|
|
</template>
|
|
|
|
|
</el-table-column>
|
|
|
|
|
<el-table-column label="操作" align="center" width="80" fixed="right" v-if="routeParams.type !== 'view' && routeParams.type !== 'approval'">
|
|
|
|
|
<template #default="scope">
|
|
|
|
|
<el-button link type="danger" icon="Delete" @click="handleDeleteDetail(scope.$index)">删除</el-button>
|
|
|
|
|
</template>
|
|
|
|
|
</el-table-column>
|
|
|
|
|
</el-table>
|
|
|
|
|
</el-card>
|
|
|
|
|
|
|
|
|
|
<!-- ERP物料选择对话框 -->
|
|
|
|
|
<SaleMaterialSelect ref="saleMaterialSelectRef" :multiple="true" @confirm-call-back="erpMaterialSelectCallBack" />
|
|
|
|
|
|
|
|
|
|
<!-- 项目选择对话框 -->
|
|
|
|
|
<ProjectSelect ref="projectSelectRef" :multiple="false" @confirm-call-back="projectInfoSelectCallBack" />
|
|
|
|
|
|
|
|
|
|
<!-- 合同选择对话框 -->
|
|
|
|
|
<el-dialog title="选择合同" v-model="contractDialog.visible" width="900px" append-to-body>
|
|
|
|
|
<el-form :model="contractQueryParams" :inline="true" label-width="100px">
|
|
|
|
|
<el-form-item label="合同编号">
|
|
|
|
|
<el-input
|
|
|
|
|
v-model="contractQueryParams.contractCode"
|
|
|
|
|
placeholder="请输入合同编号"
|
|
|
|
|
clearable
|
|
|
|
|
style="width: 200px"
|
|
|
|
|
@keyup.enter="getContractList"
|
|
|
|
|
/>
|
|
|
|
|
</el-form-item>
|
|
|
|
|
<el-form-item label="合同名称">
|
|
|
|
|
<el-input
|
|
|
|
|
v-model="contractQueryParams.contractName"
|
|
|
|
|
placeholder="请输入合同名称"
|
|
|
|
|
clearable
|
|
|
|
|
style="width: 200px"
|
|
|
|
|
@keyup.enter="getContractList"
|
|
|
|
|
/>
|
|
|
|
|
</el-form-item>
|
|
|
|
|
<el-form-item>
|
|
|
|
|
<el-button type="primary" icon="Search" @click="getContractList">搜索</el-button>
|
|
|
|
|
<el-button icon="Refresh" @click="resetContractQuery">重置</el-button>
|
|
|
|
|
</el-form-item>
|
|
|
|
|
</el-form>
|
|
|
|
|
<el-table v-loading="contractLoading" :data="contractList" border @row-click="handleContractRowClick" max-height="400">
|
|
|
|
|
<el-table-column label="合同编号" align="center" prop="contractCode" min-width="120" />
|
|
|
|
|
<el-table-column label="合同名称" align="center" prop="contractName" min-width="180" show-overflow-tooltip />
|
|
|
|
|
<el-table-column label="合同总价" align="center" prop="totalPrice" min-width="120" />
|
|
|
|
|
</el-table>
|
|
|
|
|
<pagination
|
|
|
|
|
v-show="contractTotal > 0"
|
|
|
|
|
:total="contractTotal"
|
|
|
|
|
v-model:page="contractQueryParams.pageNum"
|
|
|
|
|
v-model:limit="contractQueryParams.pageSize"
|
|
|
|
|
@pagination="getContractList"
|
|
|
|
|
/>
|
|
|
|
|
<template #footer>
|
|
|
|
|
<div class="dialog-footer">
|
|
|
|
|
<el-button type="primary" @click="submitContractSelect">确 定</el-button>
|
|
|
|
|
<el-button @click="contractDialog.visible = false">取 消</el-button>
|
|
|
|
|
</div>
|
|
|
|
|
</template>
|
|
|
|
|
</el-dialog>
|
|
|
|
|
|
|
|
|
|
<!-- WMS物料选择对话框 -->
|
|
|
|
|
<el-dialog title="选择WMS物料" v-model="wmsMaterialDialog.visible" width="900px" append-to-body>
|
|
|
|
|
<el-form :model="wmsMaterialQueryParams" :inline="true" label-width="100px">
|
|
|
|
|
<el-form-item label="物料编码">
|
|
|
|
|
<el-input
|
|
|
|
|
v-model="wmsMaterialQueryParams.productCode"
|
|
|
|
|
placeholder="请输入物料编码"
|
|
|
|
|
clearable
|
|
|
|
|
style="width: 180px"
|
|
|
|
|
@keyup.enter="getWmsMaterialList"
|
|
|
|
|
/>
|
|
|
|
|
</el-form-item>
|
|
|
|
|
<el-form-item label="物料名称">
|
|
|
|
|
<el-input
|
|
|
|
|
v-model="wmsMaterialQueryParams.productName"
|
|
|
|
|
placeholder="请输入物料名称"
|
|
|
|
|
clearable
|
|
|
|
|
style="width: 180px"
|
|
|
|
|
@keyup.enter="getWmsMaterialList"
|
|
|
|
|
/>
|
|
|
|
|
</el-form-item>
|
|
|
|
|
<el-form-item label="仓库">
|
|
|
|
|
<el-select v-model="wmsMaterialQueryParams.warehouseId" placeholder="请选择仓库" clearable style="width: 180px">
|
|
|
|
|
<el-option v-for="item in warehouseList" :key="item.warehouseId" :label="item.warehouseName" :value="item.warehouseId" />
|
|
|
|
|
</el-select>
|
|
|
|
|
</el-form-item>
|
|
|
|
|
<el-form-item>
|
|
|
|
|
<el-button type="primary" icon="Search" @click="getWmsMaterialList">搜索</el-button>
|
|
|
|
|
</el-form-item>
|
|
|
|
|
</el-form>
|
|
|
|
|
<el-table
|
|
|
|
|
ref="wmsMaterialTableRef"
|
|
|
|
|
:data="wmsMaterialList"
|
|
|
|
|
v-loading="wmsMaterialLoading"
|
|
|
|
|
border
|
|
|
|
|
@selection-change="handleWmsMaterialSelectionChange"
|
|
|
|
|
>
|
|
|
|
|
<el-table-column type="selection" width="55" align="center" />
|
|
|
|
|
<el-table-column label="物料编码" align="center" prop="productCode" min-width="120" />
|
|
|
|
|
<el-table-column label="物料名称" align="center" prop="productName" min-width="150" />
|
|
|
|
|
<el-table-column label="规格型号" align="center" prop="productSpe" min-width="120" />
|
|
|
|
|
<el-table-column label="仓库" align="center" prop="warehouseName" width="100" />
|
|
|
|
|
<el-table-column label="批次号" align="center" prop="batchNumber" width="120" />
|
|
|
|
|
<el-table-column label="库存数量" align="center" prop="inventoryAmount" width="100" />
|
|
|
|
|
<el-table-column label="单价" align="center" prop="unitPrice" width="80" />
|
|
|
|
|
</el-table>
|
|
|
|
|
<pagination
|
|
|
|
|
v-show="wmsMaterialTotal > 0"
|
|
|
|
|
:total="wmsMaterialTotal"
|
|
|
|
|
v-model:page="wmsMaterialQueryParams.pageNum"
|
|
|
|
|
v-model:limit="wmsMaterialQueryParams.pageSize"
|
|
|
|
|
@pagination="getWmsMaterialList"
|
|
|
|
|
/>
|
|
|
|
|
<template #footer>
|
|
|
|
|
<div class="dialog-footer">
|
|
|
|
|
<el-button type="primary" @click="confirmWmsMaterialSelect">确 定</el-button>
|
|
|
|
|
<el-button @click="wmsMaterialDialog.visible = false">取 消</el-button>
|
|
|
|
|
</div>
|
|
|
|
|
</template>
|
|
|
|
|
</el-dialog>
|
|
|
|
|
|
|
|
|
|
<!-- 提交审批组件 -->
|
|
|
|
|
<submitVerify ref="submitVerifyRef" :task-variables="taskVariables" @submit-callback="submitCallback" />
|
|
|
|
|
<!-- 审批记录 -->
|
|
|
|
|
<approvalRecord ref="approvalRecordRef" />
|
|
|
|
|
</div>
|
|
|
|
|
</template>
|
|
|
|
|
|
|
|
|
|
<script setup name="WmsShippingBillEdit" lang="ts">
|
|
|
|
|
import { addWmsShippingBill, getWmsShippingBill, shippingBillSubmitAndFlowStart, updateWmsShippingBill } from '@/api/wms/wmsShippingBill';
|
|
|
|
|
import { WmsShippingBillForm } from '@/api/wms/wmsShippingBill/types';
|
|
|
|
|
import { WmsShippingDetailsForm } from '@/api/wms/wmsShippingDetails/types';
|
|
|
|
|
import { listInventoryDetails } from '@/api/wms/inventoryDetails';
|
|
|
|
|
import { InventoryDetailsQuery, InventoryDetailsVO } from '@/api/wms/inventoryDetails/types';
|
|
|
|
|
import { getWmsWarehouseInfoList } from '@/api/wms/warehouseInfo';
|
|
|
|
|
import { getCrmCustomerInfoList } from '@/api/oa/crm/customerInfo';
|
|
|
|
|
import { getCrmSupplierInfoList } from '@/api/oa/crm/crmSupplierInfo';
|
|
|
|
|
import { getRuleGenerateCode } from '@/api/system/codeRule';
|
|
|
|
|
import SaleMaterialSelect from '@/components/SaleMaterialSelect/index.vue';
|
|
|
|
|
import SubmitVerify from '@/components/Process/submitVerify.vue';
|
|
|
|
|
import ApprovalRecord from '@/components/Process/approvalRecord.vue';
|
|
|
|
|
import ApprovalButton from '@/components/Process/approvalButton.vue';
|
|
|
|
|
import ProjectSelect from '@/components/ProjectSelect/index.vue';
|
|
|
|
|
import type { ProjectInfoVO } from '@/api/oa/erp/projectInfo/types';
|
|
|
|
|
import { listContractInfo } from '@/api/oa/erp/contractInfo';
|
|
|
|
|
import type { ContractInfoQuery, ContractInfoVO } from '@/api/oa/erp/contractInfo/types';
|
|
|
|
|
import { CodeRuleEnum, FlowCodeEnum } from '@/enums/OAEnum';
|
|
|
|
|
import { Search } from '@element-plus/icons-vue';
|
|
|
|
|
|
|
|
|
|
const { proxy } = getCurrentInstance() as ComponentInternalInstance;
|
|
|
|
|
const route = useRoute();
|
|
|
|
|
const router = useRouter();
|
|
|
|
|
|
|
|
|
|
// 路由参数
|
|
|
|
|
const routeParams = ref<Record<string, any>>({});
|
|
|
|
|
|
|
|
|
|
// 字典
|
|
|
|
|
const { shipping_mode, shipping_status, shipping_bill_status, material_source_type } = toRefs<any>(
|
|
|
|
|
proxy?.useDict('shipping_mode', 'shipping_status', 'shipping_bill_status', 'material_source_type')
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
const buttonLoading = ref(false);
|
|
|
|
|
const shippingBillFormRef = ref<ElFormInstance>();
|
|
|
|
|
|
|
|
|
|
// 审批相关组件引用
|
|
|
|
|
const submitVerifyRef = ref<InstanceType<typeof SubmitVerify>>();
|
|
|
|
|
const approvalRecordRef = ref<InstanceType<typeof ApprovalRecord>>();
|
|
|
|
|
|
|
|
|
|
// 任务变量
|
|
|
|
|
const taskVariables = ref<Record<string, any>>({});
|
|
|
|
|
|
|
|
|
|
// 发货单号生成状态
|
|
|
|
|
const isCodeGenerated = ref(false);
|
|
|
|
|
|
|
|
|
|
// 物料来源类型(1-ERP物料,2-WMS物料),默认使用WMS物料
|
|
|
|
|
const materialSourceType = ref('2');
|
|
|
|
|
|
|
|
|
|
// 下拉数据源
|
|
|
|
|
const customerList = ref<any[]>([]);
|
|
|
|
|
const supplierList = ref<any[]>([]);
|
|
|
|
|
const warehouseList = ref<any[]>([]);
|
|
|
|
|
|
|
|
|
|
// 项目选择
|
|
|
|
|
const selectedProjectName = ref<string>('');
|
|
|
|
|
const projectSelectRef = ref<InstanceType<typeof ProjectSelect>>();
|
|
|
|
|
|
|
|
|
|
// 合同选择
|
|
|
|
|
const selectedContractName = ref<string>('');
|
|
|
|
|
const selectedSapOrderCode = ref<string>(''); // SAP订单号(来自合同)
|
|
|
|
|
const contractDialog = reactive({ visible: false });
|
|
|
|
|
const contractLoading = ref(false);
|
|
|
|
|
const contractList = ref<ContractInfoVO[]>([]);
|
|
|
|
|
const contractTotal = ref(0);
|
|
|
|
|
const contractQueryParams = ref<ContractInfoQuery>({
|
|
|
|
|
pageNum: 1,
|
|
|
|
|
pageSize: 10,
|
|
|
|
|
contractStatus: '3'
|
|
|
|
|
});
|
|
|
|
|
const selectedContract = ref<ContractInfoVO | null>(null);
|
|
|
|
|
|
|
|
|
|
// 发货明细列表
|
|
|
|
|
const detailsList = ref<WmsShippingDetailsForm[]>([]);
|
|
|
|
|
|
|
|
|
|
// ERP物料选择组件引用
|
|
|
|
|
const saleMaterialSelectRef = ref();
|
|
|
|
|
|
|
|
|
|
// WMS物料选择对话框
|
|
|
|
|
const wmsMaterialDialog = reactive({ visible: false });
|
|
|
|
|
const wmsMaterialLoading = ref(false);
|
|
|
|
|
const wmsMaterialList = ref<InventoryDetailsVO[]>([]);
|
|
|
|
|
const wmsMaterialTotal = ref(0);
|
|
|
|
|
const selectedWmsMaterials = ref<InventoryDetailsVO[]>([]);
|
|
|
|
|
const wmsMaterialQueryParams = ref<InventoryDetailsQuery>({
|
|
|
|
|
pageNum: 1,
|
|
|
|
|
pageSize: 10,
|
|
|
|
|
productCode: undefined,
|
|
|
|
|
productName: undefined,
|
|
|
|
|
warehouseId: undefined
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
// 表单初始数据
|
|
|
|
|
const initFormData: WmsShippingBillForm = {
|
|
|
|
|
shippingBillId: undefined,
|
|
|
|
|
shippingCode: undefined,
|
|
|
|
|
shippingType: undefined,
|
|
|
|
|
shippingMode: '1', // 默认公司仓库发货
|
|
|
|
|
bindType: '1',
|
|
|
|
|
projectId: undefined,
|
|
|
|
|
projectCode: undefined,
|
|
|
|
|
projectName: undefined,
|
|
|
|
|
customerId: undefined,
|
|
|
|
|
customerName: undefined,
|
|
|
|
|
shippingAddress: undefined,
|
|
|
|
|
receiverName: undefined,
|
|
|
|
|
receiverPhone: undefined,
|
|
|
|
|
supplierId: undefined,
|
|
|
|
|
supplier: undefined,
|
|
|
|
|
contactUser: undefined,
|
|
|
|
|
contactNumber: undefined,
|
|
|
|
|
logisticsCompany: undefined,
|
|
|
|
|
trackingNo: undefined,
|
|
|
|
|
logisticsPhone: undefined,
|
|
|
|
|
directions: undefined,
|
|
|
|
|
planArrivalTime: undefined,
|
|
|
|
|
shippingTime: undefined,
|
|
|
|
|
warehouseId: undefined,
|
|
|
|
|
warehouseName: undefined,
|
|
|
|
|
outStockBillStatus: '1', // 默认暂存
|
|
|
|
|
flowStatus: 'draft',
|
|
|
|
|
shippingStatus: '1', // 默认待发货
|
|
|
|
|
remark: undefined,
|
|
|
|
|
detailsList: []
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
const validateProjectOrContract = (rule: any, value: any, callback: any) => {
|
|
|
|
|
if (form.value.bindType === '1' && !form.value.projectId) {
|
|
|
|
|
callback(new Error('项目不能为空'));
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
callback();
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
const validateContractWhenBind = (rule: any, value: any, callback: any) => {
|
|
|
|
|
if (form.value.bindType === '2' && !form.value.contractId) {
|
|
|
|
|
callback(new Error('合同不能为空'));
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
callback();
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
const data = reactive<{ form: WmsShippingBillForm; rules: any }>({
|
|
|
|
|
form: { ...initFormData },
|
|
|
|
|
rules: {
|
|
|
|
|
shippingCode: [{ required: true, message: '发货单号不能为空', trigger: 'blur' }],
|
|
|
|
|
shippingMode: [{ required: true, message: '发货方式不能为空', trigger: 'change' }],
|
|
|
|
|
bindType: [{ required: true, message: '绑定类型不能为空', trigger: 'change' }],
|
|
|
|
|
projectId: [{ validator: validateProjectOrContract, trigger: 'change' }],
|
|
|
|
|
contractId: [{ validator: validateContractWhenBind, trigger: 'change' }],
|
|
|
|
|
customerId: [{ required: true, message: '客户不能为空', trigger: 'change' }]
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
const { form, rules } = toRefs(data);
|
|
|
|
|
|
|
|
|
|
/** 生成发货单号 */
|
|
|
|
|
const generateShippingCode = async () => {
|
|
|
|
|
if (isCodeGenerated.value) return; // 如果已经生成过,直接返回
|
|
|
|
|
try {
|
|
|
|
|
const params = { codeRuleCode: CodeRuleEnum.SHIPPING_BILL } as any;
|
|
|
|
|
const res = await getRuleGenerateCode(params);
|
|
|
|
|
form.value.shippingCode = res.msg;
|
|
|
|
|
isCodeGenerated.value = true;
|
|
|
|
|
proxy?.$modal.msgSuccess('发货单号生成成功');
|
|
|
|
|
} catch (error) {
|
|
|
|
|
console.error('生成发货单号失败:', error);
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
const getContractList = async () => {
|
|
|
|
|
try {
|
|
|
|
|
contractLoading.value = true;
|
|
|
|
|
const res = await listContractInfo(contractQueryParams.value);
|
|
|
|
|
contractList.value = res.rows || [];
|
|
|
|
|
contractTotal.value = (res.total as number) || contractList.value.length;
|
|
|
|
|
} catch (error) {
|
|
|
|
|
console.error('查询合同列表失败:', error);
|
|
|
|
|
} finally {
|
|
|
|
|
contractLoading.value = false;
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
const resetContractQuery = () => {
|
|
|
|
|
contractQueryParams.value.contractCode = undefined;
|
|
|
|
|
contractQueryParams.value.contractName = undefined;
|
|
|
|
|
contractQueryParams.value.pageNum = 1;
|
|
|
|
|
getContractList();
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
const handleContractRowClick = (row: ContractInfoVO) => {
|
|
|
|
|
selectedContract.value = row;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
const submitContractSelect = () => {
|
|
|
|
|
if (selectedContract.value) {
|
|
|
|
|
const contract = selectedContract.value;
|
|
|
|
|
form.value.contractId = contract.contractId as any;
|
|
|
|
|
form.value.contractCode = contract.contractCode || '';
|
|
|
|
|
form.value.contractName = contract.contractName || '';
|
|
|
|
|
selectedContractName.value = contract.contractName || '';
|
|
|
|
|
// SAP订单号来自合同的 orderContractCode
|
|
|
|
|
selectedSapOrderCode.value = (contract as any).orderContractCode || '';
|
|
|
|
|
}
|
|
|
|
|
contractDialog.visible = false;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
/** 打开项目选择弹窗 */
|
|
|
|
|
const openProjectSelect = () => {
|
|
|
|
|
if (routeParams.value.type === 'view' || routeParams.value.type === 'approval') return;
|
|
|
|
|
projectSelectRef.value?.open();
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
/** 打开合同选择弹窗 */
|
|
|
|
|
const openContractSelect = () => {
|
|
|
|
|
if (routeParams.value.type === 'view' || routeParams.value.type === 'approval') return;
|
|
|
|
|
contractDialog.visible = true;
|
|
|
|
|
contractQueryParams.value.pageNum = 1;
|
|
|
|
|
getContractList();
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
/** 项目选择回调 */
|
|
|
|
|
const projectInfoSelectCallBack = (data: ProjectInfoVO[]) => {
|
|
|
|
|
if (data && data.length > 0) {
|
|
|
|
|
const project = data[0];
|
|
|
|
|
form.value.projectId = project.projectId;
|
|
|
|
|
form.value.projectCode = project.projectCode || '';
|
|
|
|
|
form.value.projectName = project.projectName || '';
|
|
|
|
|
selectedProjectName.value = project.projectName || '';
|
|
|
|
|
// 如果项目有关联客户,自动带入
|
|
|
|
|
if (project.customerId) {
|
|
|
|
|
form.value.customerId = project.customerId;
|
|
|
|
|
handleCustomerChange(project.customerId);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
/** 客户选择变化 */
|
|
|
|
|
const handleCustomerChange = (customerId: any) => {
|
|
|
|
|
const customer = customerList.value.find((c) => c.customerId === customerId);
|
|
|
|
|
if (customer) {
|
|
|
|
|
form.value.customerName = customer.customerName;
|
|
|
|
|
form.value.shippingAddress = customer.address;
|
|
|
|
|
form.value.receiverName = customer.contactPerson;
|
|
|
|
|
form.value.receiverPhone = customer.contactPhone;
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
/** 供应商选择变化 */
|
|
|
|
|
const handleSupplierChange = (supplierId: any) => {
|
|
|
|
|
const supplier = supplierList.value.find((s) => s.supplierId === supplierId);
|
|
|
|
|
if (supplier) {
|
|
|
|
|
form.value.supplier = supplier.supplierName;
|
|
|
|
|
form.value.contactUser = supplier.contactPerson;
|
|
|
|
|
form.value.contactNumber = supplier.contactPhone;
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
/** 仓库选择变化 */
|
|
|
|
|
const handleWarehouseChange = (warehouseId: any) => {
|
|
|
|
|
const warehouse = warehouseList.value.find((w) => w.warehouseId === warehouseId);
|
|
|
|
|
if (warehouse) {
|
|
|
|
|
form.value.warehouseName = warehouse.warehouseName;
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
/** 物料来源切换 */
|
|
|
|
|
const handleMaterialSourceChange = () => {
|
|
|
|
|
// 切换物料来源时,可以选择是否清空已选物料
|
|
|
|
|
// 这里暂不清空,允许混合选择
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
/** 新增物料 */
|
|
|
|
|
const handleAddDetail = () => {
|
|
|
|
|
if (materialSourceType.value === '1') {
|
|
|
|
|
// ERP物料选择
|
|
|
|
|
saleMaterialSelectRef.value?.openDialog();
|
|
|
|
|
} else {
|
|
|
|
|
// WMS物料选择
|
|
|
|
|
wmsMaterialDialog.visible = true;
|
|
|
|
|
getWmsMaterialList();
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
/** ERP物料选择回调 */
|
|
|
|
|
const erpMaterialSelectCallBack = (materials: any[]) => {
|
|
|
|
|
if (materials && materials.length > 0) {
|
|
|
|
|
materials.forEach((material) => {
|
|
|
|
|
// 检查是否已存在
|
|
|
|
|
const exists = detailsList.value.some((d) => d.materialSourceType === '1' && d.erpMaterialId === material.materialId);
|
|
|
|
|
if (!exists) {
|
|
|
|
|
detailsList.value.push({
|
|
|
|
|
shippingDetailsId: undefined,
|
|
|
|
|
shippingBillId: form.value.shippingBillId,
|
|
|
|
|
materialSourceType: '1', // ERP物料
|
|
|
|
|
erpMaterialId: material.materialId,
|
|
|
|
|
wmsMaterialId: undefined,
|
|
|
|
|
materialCode: material.materialCode,
|
|
|
|
|
materialName: material.materialName,
|
|
|
|
|
materielSpecification: material.specificationModel,
|
|
|
|
|
batchNumber: undefined,
|
|
|
|
|
unitPrice: material.unitPrice || 0,
|
|
|
|
|
shippingStockAmount: 1,
|
|
|
|
|
unitId: material.unitId,
|
|
|
|
|
unitName: material.unitName,
|
|
|
|
|
totalPrice: material.unitPrice || 0,
|
|
|
|
|
remark: undefined
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
/** 获取WMS物料列表 */
|
|
|
|
|
const getWmsMaterialList = async () => {
|
|
|
|
|
wmsMaterialLoading.value = true;
|
|
|
|
|
try {
|
|
|
|
|
const res = await listInventoryDetails(wmsMaterialQueryParams.value);
|
|
|
|
|
wmsMaterialList.value = res.rows;
|
|
|
|
|
wmsMaterialTotal.value = res.total;
|
|
|
|
|
} finally {
|
|
|
|
|
wmsMaterialLoading.value = false;
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
/** WMS物料选择变化 */
|
|
|
|
|
const handleWmsMaterialSelectionChange = (selection: InventoryDetailsVO[]) => {
|
|
|
|
|
selectedWmsMaterials.value = selection;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
/** 确认WMS物料选择 */
|
|
|
|
|
const confirmWmsMaterialSelect = () => {
|
|
|
|
|
if (selectedWmsMaterials.value.length > 0) {
|
|
|
|
|
selectedWmsMaterials.value.forEach((material) => {
|
|
|
|
|
// 检查是否已存在
|
|
|
|
|
const exists = detailsList.value.some((d) => d.materialSourceType === '2' && d.wmsMaterialId === material.inventoryDetailsId);
|
|
|
|
|
if (!exists) {
|
|
|
|
|
detailsList.value.push({
|
|
|
|
|
shippingDetailsId: undefined,
|
|
|
|
|
shippingBillId: form.value.shippingBillId,
|
|
|
|
|
materialSourceType: '2', // WMS物料
|
|
|
|
|
erpMaterialId: undefined,
|
|
|
|
|
wmsMaterialId: material.inventoryDetailsId,
|
|
|
|
|
warehouseId: material.warehouseId,
|
|
|
|
|
materielId: material.materielId,
|
|
|
|
|
materialCode: material.productCode,
|
|
|
|
|
materialName: material.productName,
|
|
|
|
|
materielSpecification: material.materialModel,
|
|
|
|
|
batchNumber: material.batchNumber,
|
|
|
|
|
unitPrice: material.unitPrice || 0,
|
|
|
|
|
shippingStockAmount: 1,
|
|
|
|
|
unitId: undefined,
|
|
|
|
|
unitName: undefined,
|
|
|
|
|
totalPrice: material.unitPrice || 0,
|
|
|
|
|
remark: undefined
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
wmsMaterialDialog.visible = false;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
/** 删除明细 */
|
|
|
|
|
const handleDeleteDetail = (index: number) => {
|
|
|
|
|
detailsList.value.splice(index, 1);
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
/** 计算总价 */
|
|
|
|
|
const calculateTotalPrice = (row: WmsShippingDetailsForm) => {
|
|
|
|
|
row.totalPrice = (row.unitPrice || 0) * (row.shippingStockAmount || 0);
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
/** 提交表单 */
|
|
|
|
|
const submitForm = async (status: string, mode: boolean) => {
|
|
|
|
|
try {
|
|
|
|
|
await shippingBillFormRef.value?.validate();
|
|
|
|
|
buttonLoading.value = true;
|
|
|
|
|
|
|
|
|
|
// 将明细列表设置到表单
|
|
|
|
|
form.value.detailsList = detailsList.value;
|
|
|
|
|
|
|
|
|
|
// 准备提交数据
|
|
|
|
|
const submitData = { ...form.value };
|
|
|
|
|
|
|
|
|
|
if (status !== 'draft') {
|
|
|
|
|
// 提交审批 - 后端发起流程模式
|
|
|
|
|
submitData.flowCode = FlowCodeEnum.SHIPPING_BILL_CODE;
|
|
|
|
|
// 流程变量
|
|
|
|
|
submitData.variables = {
|
|
|
|
|
shippingBillId: submitData.shippingBillId,
|
|
|
|
|
shippingCode: submitData.shippingCode,
|
|
|
|
|
projectName: submitData.projectName,
|
|
|
|
|
customerName: submitData.customerName
|
|
|
|
|
};
|
|
|
|
|
// 流程实例业务扩展字段
|
|
|
|
|
submitData.bizExt = {
|
|
|
|
|
businessTitle: '发货单审批',
|
|
|
|
|
businessCode: submitData.shippingCode
|
|
|
|
|
};
|
|
|
|
|
submitData.outStockBillStatus = '2'; // 审批中
|
|
|
|
|
submitData.flowStatus = 'waiting';
|
|
|
|
|
|
|
|
|
|
// 调用提交审批接口
|
|
|
|
|
const res = await shippingBillSubmitAndFlowStart(submitData);
|
|
|
|
|
form.value = res.data;
|
|
|
|
|
proxy?.$modal.msgSuccess('提交成功');
|
|
|
|
|
} else {
|
|
|
|
|
// 暂存
|
|
|
|
|
submitData.outStockBillStatus = '1';
|
|
|
|
|
submitData.flowStatus = 'draft';
|
|
|
|
|
if (submitData.shippingBillId) {
|
|
|
|
|
await updateWmsShippingBill(submitData);
|
|
|
|
|
} else {
|
|
|
|
|
await addWmsShippingBill(submitData);
|
|
|
|
|
}
|
|
|
|
|
proxy?.$modal.msgSuccess('暂存成功');
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
proxy?.$tab.closePage();
|
|
|
|
|
router.go(-1);
|
|
|
|
|
} catch (error) {
|
|
|
|
|
console.error('提交失败:', error);
|
|
|
|
|
} finally {
|
|
|
|
|
buttonLoading.value = false;
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
/** 加载下拉数据 */
|
|
|
|
|
const loadSelectOptions = async () => {
|
|
|
|
|
try {
|
|
|
|
|
// 加载客户列表
|
|
|
|
|
const customerRes = await getCrmCustomerInfoList(null);
|
|
|
|
|
customerList.value = customerRes.data || [];
|
|
|
|
|
|
|
|
|
|
// 加载供应商列表
|
|
|
|
|
const supplierRes = await getCrmSupplierInfoList(null);
|
|
|
|
|
supplierList.value = supplierRes.data || [];
|
|
|
|
|
|
|
|
|
|
// 加载仓库列表
|
|
|
|
|
const warehouseRes = await getWmsWarehouseInfoList(null);
|
|
|
|
|
warehouseList.value = warehouseRes.data || [];
|
|
|
|
|
} catch (error) {
|
|
|
|
|
console.error('加载下拉数据失败:', error);
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
/** 加载表单数据 */
|
|
|
|
|
const loadFormData = async (id: string | number) => {
|
|
|
|
|
try {
|
|
|
|
|
const res = await getWmsShippingBill(id);
|
|
|
|
|
Object.assign(form.value, res.data);
|
|
|
|
|
selectedProjectName.value = form.value.projectName || '';
|
|
|
|
|
selectedContractName.value = form.value.contractName || '';
|
|
|
|
|
// SAP订单号(来自后端联查合同表)
|
|
|
|
|
selectedSapOrderCode.value = (res.data as any).orderContractCode || '';
|
|
|
|
|
|
|
|
|
|
// 加载明细列表
|
|
|
|
|
if (res.data.itemsVo && res.data.itemsVo.length > 0) {
|
|
|
|
|
detailsList.value = res.data.itemsVo.map((item: any) => ({
|
|
|
|
|
shippingDetailsId: item.shippingDetailsId,
|
|
|
|
|
shippingBillId: item.shippingBillId,
|
|
|
|
|
materialSourceType: item.materialSourceType,
|
|
|
|
|
erpMaterialId: item.erpMaterialId,
|
|
|
|
|
wmsMaterialId: item.wmsMaterialId,
|
|
|
|
|
warehouseId: item.warehouseId,
|
|
|
|
|
materielId: item.materielId,
|
|
|
|
|
materialCode: item.materialCode,
|
|
|
|
|
materialName: item.materialName,
|
|
|
|
|
materielSpecification: item.materielSpecification,
|
|
|
|
|
batchNumber: item.batchNumber,
|
|
|
|
|
unitPrice: item.unitPrice,
|
|
|
|
|
shippingStockAmount: item.shippingStockAmount,
|
|
|
|
|
unitId: item.unitId,
|
|
|
|
|
unitName: item.unitName,
|
|
|
|
|
totalPrice: item.totalPrice,
|
|
|
|
|
remark: item.remark
|
|
|
|
|
}));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 如果已有单号,禁用生成按钮
|
|
|
|
|
if (form.value.shippingCode) {
|
|
|
|
|
isCodeGenerated.value = true;
|
|
|
|
|
}
|
|
|
|
|
} catch (error) {
|
|
|
|
|
console.error('加载表单数据失败:', error);
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
// 审批记录
|
|
|
|
|
const handleApprovalRecord = () => {
|
|
|
|
|
approvalRecordRef.value?.init(form.value.shippingBillId);
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
// 提交回调
|
|
|
|
|
const submitCallback = async () => {
|
|
|
|
|
await proxy?.$tab.closePage(route);
|
|
|
|
|
router.go(-1);
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
// 审批
|
|
|
|
|
const approvalVerifyOpen = async () => {
|
|
|
|
|
await submitVerifyRef.value?.openDialog(routeParams.value.taskId);
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
onMounted(async () => {
|
|
|
|
|
nextTick(async () => {
|
|
|
|
|
routeParams.value = route.query;
|
|
|
|
|
proxy?.$modal.loading('正在加载数据,请稍后...');
|
|
|
|
|
|
|
|
|
|
await loadSelectOptions();
|
|
|
|
|
|
|
|
|
|
const id = routeParams.value.id as string | number;
|
|
|
|
|
if (id && (routeParams.value.type === 'update' || routeParams.value.type === 'view' || routeParams.value.type === 'approval')) {
|
|
|
|
|
await loadFormData(id);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
proxy?.$modal.closeLoading();
|
|
|
|
|
});
|
|
|
|
|
});
|
|
|
|
|
</script>
|
|
|
|
|
|
|
|
|
|
<style scoped>
|
|
|
|
|
.card-title {
|
|
|
|
|
font-weight: bold;
|
|
|
|
|
font-size: 18px;
|
|
|
|
|
}
|
|
|
|
|
</style>
|