|
|
|
@ -1,33 +1,26 @@
|
|
|
|
<template>
|
|
|
|
<template>
|
|
|
|
<el-form
|
|
|
|
<el-form ref="formRef" :model="formData" :rules="formRules" v-loading="formLoading" label-width="0px"
|
|
|
|
ref="formRef" :model="formData" :rules="formRules" v-loading="formLoading" label-width="0px"
|
|
|
|
:inline-message="true" :disabled="false">
|
|
|
|
:inline-message="true" :disabled="disabled">
|
|
|
|
|
|
|
|
<el-table :data="formData" size="small" show-summary :summary-method="getSummaries" class="-mt-10px">
|
|
|
|
<el-table :data="formData" size="small" show-summary :summary-method="getSummaries" class="-mt-10px">
|
|
|
|
<el-table-column :label="t('common.index')" type="index" align="center" width="60" />
|
|
|
|
<el-table-column :label="t('common.index')" type="index" align="center" width="60" />
|
|
|
|
<el-table-column :label="t('ErpStock.Item.warehouse')" min-width="125">
|
|
|
|
<el-table-column v-if="!isProductStockOut" :label="t('ErpStock.Item.warehouse')" min-width="125">
|
|
|
|
<template #default="{ row, $index }">
|
|
|
|
<template #default="{ row, $index }">
|
|
|
|
<el-form-item :prop="`${$index}.warehouseId`" :rules="formRules.warehouseId" class="mb-0px!">
|
|
|
|
<el-form-item :prop="`${$index}.warehouseId`" :rules="formRules.warehouseId" class="mb-0px!">
|
|
|
|
<el-select
|
|
|
|
<el-input v-if="disabled" :model-value="getWarehouseName(row.warehouseId)" readonly />
|
|
|
|
v-model="row.warehouseId" clearable filterable
|
|
|
|
<el-select v-else v-model="row.warehouseId" clearable filterable
|
|
|
|
:placeholder="t('ErpStock.Item.placeholderWarehouse')" @change="onChangeWarehouse($event, row)">
|
|
|
|
:placeholder="t('ErpStock.Item.placeholderWarehouse')" @change="onChangeWarehouse($event, row)">
|
|
|
|
<el-option v-for="item in warehouseList" :key="item.id" :label="item.name" :value="item.id" />
|
|
|
|
<el-option v-for="item in warehouseList" :key="item.id" :label="item.name" :value="item.id" />
|
|
|
|
</el-select>
|
|
|
|
</el-select>
|
|
|
|
</el-form-item>
|
|
|
|
</el-form-item>
|
|
|
|
</template>
|
|
|
|
</template>
|
|
|
|
</el-table-column>
|
|
|
|
</el-table-column>
|
|
|
|
<el-table-column v-if="isProductMaterialStockOut" :label="t('ErpStock.Item.area')" min-width="140">
|
|
|
|
<el-table-column v-if="isProductMaterialStockOut && !isProductStockOut" :label="t('ErpStock.Item.area')" min-width="140">
|
|
|
|
<template #default="{ row, $index }">
|
|
|
|
<template #default="{ row, $index }">
|
|
|
|
<el-form-item :prop="`${$index}.areaId`" :rules="formRules.areaId" class="mb-0px!">
|
|
|
|
<el-form-item :prop="`${$index}.areaId`" :rules="formRules.areaId" class="mb-0px!">
|
|
|
|
<el-select
|
|
|
|
<el-input v-if="disabled" :model-value="getAreaName(row.areaId)" readonly />
|
|
|
|
v-model="row.areaId"
|
|
|
|
<el-select v-else v-model="row.areaId" clearable filterable :placeholder="t('ErpStock.Item.placeholderArea')"
|
|
|
|
clearable
|
|
|
|
:disabled="!row.warehouseId" @change="handleAreaChange(row)">
|
|
|
|
filterable
|
|
|
|
<el-option v-for="item in getAreaOptions(row.warehouseId)" :key="item.id" :label="getAreaLabel(item)"
|
|
|
|
:placeholder="t('ErpStock.Item.placeholderArea')"
|
|
|
|
|
|
|
|
:disabled="!row.warehouseId"
|
|
|
|
|
|
|
|
@change="handleAreaChange(row)"
|
|
|
|
|
|
|
|
>
|
|
|
|
|
|
|
|
<el-option
|
|
|
|
|
|
|
|
v-for="item in getAreaOptions(row.warehouseId)" :key="item.id" :label="getAreaLabel(item)"
|
|
|
|
|
|
|
|
:value="item.id" />
|
|
|
|
:value="item.id" />
|
|
|
|
</el-select>
|
|
|
|
</el-select>
|
|
|
|
</el-form-item>
|
|
|
|
</el-form-item>
|
|
|
|
@ -42,9 +35,8 @@ v-for="item in getAreaOptions(row.warehouseId)" :key="item.id" :label="getAreaLa
|
|
|
|
<template #default="{ row, $index }">
|
|
|
|
<template #default="{ row, $index }">
|
|
|
|
<el-form-item :prop="`${$index}.productBarCode`" class="mb-0px!">
|
|
|
|
<el-form-item :prop="`${$index}.productBarCode`" class="mb-0px!">
|
|
|
|
<div class="product-code-select">
|
|
|
|
<div class="product-code-select">
|
|
|
|
<el-input
|
|
|
|
<el-input v-model="row.productBarCode" readonly :clearable="!disabled"
|
|
|
|
v-model="row.productBarCode" readonly clearable
|
|
|
|
:placeholder="t('ErpStock.Item.placeholderBarcode')" @click="handleProductInputClick(row)"
|
|
|
|
:placeholder="t('ErpStock.Item.placeholderBarcode')" @click="openProductSelectDialog(row)"
|
|
|
|
|
|
|
|
@clear="handleProductClear(row)" />
|
|
|
|
@clear="handleProductClear(row)" />
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
</el-form-item>
|
|
|
|
</el-form-item>
|
|
|
|
@ -52,20 +44,20 @@ v-model="row.productBarCode" readonly clearable
|
|
|
|
</el-table-column>
|
|
|
|
</el-table-column>
|
|
|
|
<el-table-column :label="t('ErpStock.Item.product')" min-width="180">
|
|
|
|
<el-table-column :label="t('ErpStock.Item.product')" min-width="180">
|
|
|
|
<template #default="{ row, $index }">
|
|
|
|
<template #default="{ row, $index }">
|
|
|
|
<el-form-item
|
|
|
|
<el-form-item v-if="isProductMaterialStockOut" :prop="`${$index}.productId`" :rules="formRules.productId"
|
|
|
|
v-if="isProductMaterialStockOut" :prop="`${$index}.productId`" :rules="formRules.productId"
|
|
|
|
|
|
|
|
class="mb-0px!">
|
|
|
|
class="mb-0px!">
|
|
|
|
<el-input v-model="row.productName" disabled :placeholder="t('ErpStock.Item.placeholderProduct')" />
|
|
|
|
<el-input v-model="row.productName" disabled :placeholder="t('ErpStock.Item.placeholderProduct')" />
|
|
|
|
</el-form-item>
|
|
|
|
</el-form-item>
|
|
|
|
<el-form-item v-else :prop="`${$index}.productId`" :rules="formRules.productId" class="mb-0px!">
|
|
|
|
<el-form-item v-else :prop="`${$index}.productId`" :rules="formRules.productId" class="mb-0px!">
|
|
|
|
<el-cascader
|
|
|
|
<el-input v-if="disabled" :model-value="row.productName || '-'" readonly />
|
|
|
|
v-model="row.productId" :options="productCascaderOptions" :props="productCascaderProps"
|
|
|
|
<el-cascader v-model="row.productId" :options="productCascaderOptions" :props="productCascaderProps"
|
|
|
|
|
|
|
|
v-else
|
|
|
|
:show-all-levels="false" clearable filterable @change="onChangeProduct($event, row)"
|
|
|
|
:show-all-levels="false" clearable filterable @change="onChangeProduct($event, row)"
|
|
|
|
:placeholder="t('ErpStock.Item.placeholderProduct')" class="!w-100%" />
|
|
|
|
:placeholder="t('ErpStock.Item.placeholderProduct')" class="!w-100%" />
|
|
|
|
</el-form-item>
|
|
|
|
</el-form-item>
|
|
|
|
</template>
|
|
|
|
</template>
|
|
|
|
</el-table-column>
|
|
|
|
</el-table-column>
|
|
|
|
<el-table-column :label="t('ErpStock.Item.stock')" min-width="100">
|
|
|
|
<el-table-column v-if="!isProductStockOut" :label="t('ErpStock.Item.stock')" min-width="100">
|
|
|
|
<template #default="{ row }">
|
|
|
|
<template #default="{ row }">
|
|
|
|
<el-form-item class="mb-0px!">
|
|
|
|
<el-form-item class="mb-0px!">
|
|
|
|
<el-input disabled v-model="row.stockCount" :formatter="erpCountInputFormatter" />
|
|
|
|
<el-input disabled v-model="row.stockCount" :formatter="erpCountInputFormatter" />
|
|
|
|
@ -106,7 +98,8 @@ v-model="row.productId" :options="productCascaderOptions" :props="productCascade
|
|
|
|
<template #content>
|
|
|
|
<template #content>
|
|
|
|
{{ purchaseUnitConvertTipText }}
|
|
|
|
{{ purchaseUnitConvertTipText }}
|
|
|
|
</template>
|
|
|
|
</template>
|
|
|
|
<Icon icon="ep:question-filled" class="ml-4px" style="vertical-align: middle; color: #909399; cursor: pointer;" />
|
|
|
|
<Icon icon="ep:question-filled" class="ml-4px"
|
|
|
|
|
|
|
|
style="vertical-align: middle; color: #909399; cursor: pointer;" />
|
|
|
|
</el-tooltip>
|
|
|
|
</el-tooltip>
|
|
|
|
</template>
|
|
|
|
</template>
|
|
|
|
<template #default="{ row }">
|
|
|
|
<template #default="{ row }">
|
|
|
|
@ -118,18 +111,11 @@ v-model="row.productId" :options="productCascaderOptions" :props="productCascade
|
|
|
|
<el-table-column v-if="isSparePartStockOut" :label="t('ErpStock.Item.outboundPurpose')" min-width="140">
|
|
|
|
<el-table-column v-if="isSparePartStockOut" :label="t('ErpStock.Item.outboundPurpose')" min-width="140">
|
|
|
|
<template #default="{ row, $index }">
|
|
|
|
<template #default="{ row, $index }">
|
|
|
|
<el-form-item :prop="`${$index}.outUsageType`" :rules="formRules.outUsageType" class="mb-0px!">
|
|
|
|
<el-form-item :prop="`${$index}.outUsageType`" :rules="formRules.outUsageType" class="mb-0px!">
|
|
|
|
<el-select
|
|
|
|
<el-input v-if="disabled" :model-value="getOutboundPurposeLabel(row.outUsageType)" readonly />
|
|
|
|
v-model="row.outUsageType"
|
|
|
|
<el-select v-else v-model="row.outUsageType" clearable :placeholder="t('ErpStock.Item.placeholderOutboundPurpose')"
|
|
|
|
clearable
|
|
|
|
@change="handleOutboundPurposeChange(row)">
|
|
|
|
:placeholder="t('ErpStock.Item.placeholderOutboundPurpose')"
|
|
|
|
<el-option v-for="dict in outboundPurposeOptions" :key="dict.value" :label="dict.label"
|
|
|
|
@change="handleOutboundPurposeChange(row)"
|
|
|
|
:value="dict.value" />
|
|
|
|
>
|
|
|
|
|
|
|
|
<el-option
|
|
|
|
|
|
|
|
v-for="dict in outboundPurposeOptions"
|
|
|
|
|
|
|
|
:key="dict.value"
|
|
|
|
|
|
|
|
:label="dict.label"
|
|
|
|
|
|
|
|
:value="dict.value"
|
|
|
|
|
|
|
|
/>
|
|
|
|
|
|
|
|
</el-select>
|
|
|
|
</el-select>
|
|
|
|
</el-form-item>
|
|
|
|
</el-form-item>
|
|
|
|
</template>
|
|
|
|
</template>
|
|
|
|
@ -137,7 +123,8 @@ v-model="row.productId" :options="productCascaderOptions" :props="productCascade
|
|
|
|
<el-table-column v-if="isProductStockOut" :label="t('ErpStock.Item.outMode')" width="200">
|
|
|
|
<el-table-column v-if="isProductStockOut" :label="t('ErpStock.Item.outMode')" width="200">
|
|
|
|
<template #default="{ row, $index }">
|
|
|
|
<template #default="{ row, $index }">
|
|
|
|
<el-form-item :prop="`${$index}.outMode`" :rules="formRules.outMode" class="mb-0px!">
|
|
|
|
<el-form-item :prop="`${$index}.outMode`" :rules="formRules.outMode" class="mb-0px!">
|
|
|
|
<el-radio-group v-model="row.outMode" class="out-mode-radio-group" @change="handleOutModeChange(row)">
|
|
|
|
<el-input v-if="disabled" :model-value="getOutModeLabel(row.outMode)" readonly />
|
|
|
|
|
|
|
|
<el-radio-group v-else v-model="row.outMode" class="out-mode-radio-group" @change="handleOutModeChange(row)">
|
|
|
|
<el-radio-button :label="1">{{ t('ErpStock.Item.outModeWholePallet') }}</el-radio-button>
|
|
|
|
<el-radio-button :label="1">{{ t('ErpStock.Item.outModeWholePallet') }}</el-radio-button>
|
|
|
|
<el-radio-button :label="2">{{ t('ErpStock.Item.outModeSplitPallet') }}</el-radio-button>
|
|
|
|
<el-radio-button :label="2">{{ t('ErpStock.Item.outModeSplitPallet') }}</el-radio-button>
|
|
|
|
</el-radio-group>
|
|
|
|
</el-radio-group>
|
|
|
|
@ -147,34 +134,17 @@ v-model="row.productId" :options="productCascaderOptions" :props="productCascade
|
|
|
|
<el-table-column v-if="isProductStockOut" :label="t('ErpStock.Item.palletCode')" min-width="180">
|
|
|
|
<el-table-column v-if="isProductStockOut" :label="t('ErpStock.Item.palletCode')" min-width="180">
|
|
|
|
<template #default="{ row, $index }">
|
|
|
|
<template #default="{ row, $index }">
|
|
|
|
<el-form-item :prop="`${$index}.pallets`" :rules="formRules.pallets" class="mb-0px!">
|
|
|
|
<el-form-item :prop="`${$index}.pallets`" :rules="formRules.pallets" class="mb-0px!">
|
|
|
|
<el-input
|
|
|
|
<el-input v-model="row.palletCode" readonly :clearable="!disabled"
|
|
|
|
v-model="row.palletCode"
|
|
|
|
:placeholder="t('ErpStock.Item.placeholderPalletCode')" @click="openPalletSelectDialog(row)"
|
|
|
|
readonly
|
|
|
|
@clear="clearPallet(row)" />
|
|
|
|
clearable
|
|
|
|
|
|
|
|
:placeholder="t('ErpStock.Item.placeholderPalletCode')"
|
|
|
|
|
|
|
|
@click="openPalletSelectDialog(row)"
|
|
|
|
|
|
|
|
@clear="clearPallet(row)"
|
|
|
|
|
|
|
|
/>
|
|
|
|
|
|
|
|
</el-form-item>
|
|
|
|
</el-form-item>
|
|
|
|
</template>
|
|
|
|
</template>
|
|
|
|
</el-table-column>
|
|
|
|
</el-table-column>
|
|
|
|
<el-table-column
|
|
|
|
<el-table-column v-if="showRelatedRepairColumn" :label="t('ErpStock.Item.relatedRepairOrder')" min-width="190">
|
|
|
|
v-if="showRelatedRepairColumn"
|
|
|
|
|
|
|
|
:label="t('ErpStock.Item.relatedRepairOrder')"
|
|
|
|
|
|
|
|
min-width="190"
|
|
|
|
|
|
|
|
>
|
|
|
|
|
|
|
|
<template #default="{ row, $index }">
|
|
|
|
<template #default="{ row, $index }">
|
|
|
|
<el-form-item
|
|
|
|
<el-form-item v-if="isRepairPurpose(row.outUsageType)" :prop="`${$index}.relatedOrderNo`" class="mb-0px!">
|
|
|
|
v-if="isRepairPurpose(row.outUsageType)"
|
|
|
|
<el-input v-model="row.relatedOrderNo" readonly :placeholder="getRelatedOrderPlaceholder(row.outUsageType)">
|
|
|
|
:prop="`${$index}.relatedOrderNo`"
|
|
|
|
<template v-if="!disabled" #append>
|
|
|
|
class="mb-0px!"
|
|
|
|
|
|
|
|
>
|
|
|
|
|
|
|
|
<el-input
|
|
|
|
|
|
|
|
v-model="row.relatedOrderNo"
|
|
|
|
|
|
|
|
readonly
|
|
|
|
|
|
|
|
:placeholder="getRelatedOrderPlaceholder(row.outUsageType)"
|
|
|
|
|
|
|
|
>
|
|
|
|
|
|
|
|
<template #append>
|
|
|
|
|
|
|
|
<el-button @click="openRelatedOrderDialog(row)">
|
|
|
|
<el-button @click="openRelatedOrderDialog(row)">
|
|
|
|
<Icon icon="ep:search" />
|
|
|
|
<Icon icon="ep:search" />
|
|
|
|
</el-button>
|
|
|
|
</el-button>
|
|
|
|
@ -183,23 +153,14 @@ v-model="row.productId" :options="productCascaderOptions" :props="productCascade
|
|
|
|
</el-form-item>
|
|
|
|
</el-form-item>
|
|
|
|
</template>
|
|
|
|
</template>
|
|
|
|
</el-table-column>
|
|
|
|
</el-table-column>
|
|
|
|
<el-table-column
|
|
|
|
<el-table-column v-if="showRelatedMaintainColumn" :label="t('ErpStock.Item.relatedMaintainRecord')"
|
|
|
|
v-if="showRelatedMaintainColumn"
|
|
|
|
min-width="190">
|
|
|
|
:label="t('ErpStock.Item.relatedMaintainRecord')"
|
|
|
|
|
|
|
|
min-width="190"
|
|
|
|
|
|
|
|
>
|
|
|
|
|
|
|
|
<template #default="{ row, $index }">
|
|
|
|
<template #default="{ row, $index }">
|
|
|
|
<el-form-item
|
|
|
|
<el-form-item v-if="isMaintainPurpose(row.outUsageType)" :prop="`${$index}.relatedMaintenanceNo`"
|
|
|
|
v-if="isMaintainPurpose(row.outUsageType)"
|
|
|
|
class="mb-0px!">
|
|
|
|
:prop="`${$index}.relatedMaintenanceNo`"
|
|
|
|
<el-input v-model="row.relatedMaintenanceNo" readonly
|
|
|
|
class="mb-0px!"
|
|
|
|
:placeholder="getRelatedOrderPlaceholder(row.outUsageType)">
|
|
|
|
>
|
|
|
|
<template v-if="!disabled" #append>
|
|
|
|
<el-input
|
|
|
|
|
|
|
|
v-model="row.relatedMaintenanceNo"
|
|
|
|
|
|
|
|
readonly
|
|
|
|
|
|
|
|
:placeholder="getRelatedOrderPlaceholder(row.outUsageType)"
|
|
|
|
|
|
|
|
>
|
|
|
|
|
|
|
|
<template #append>
|
|
|
|
|
|
|
|
<el-button @click="openRelatedOrderDialog(row)">
|
|
|
|
<el-button @click="openRelatedOrderDialog(row)">
|
|
|
|
<Icon icon="ep:search" />
|
|
|
|
<Icon icon="ep:search" />
|
|
|
|
</el-button>
|
|
|
|
</el-button>
|
|
|
|
@ -208,16 +169,13 @@ v-model="row.productId" :options="productCascaderOptions" :props="productCascade
|
|
|
|
</el-form-item>
|
|
|
|
</el-form-item>
|
|
|
|
</template>
|
|
|
|
</template>
|
|
|
|
</el-table-column>
|
|
|
|
</el-table-column>
|
|
|
|
<el-table-column v-if="isProductMaterialStockOut" :label="t('ErpStock.Item.count')" prop="inputCount" min-width="140">
|
|
|
|
<el-table-column v-if="isProductMaterialStockOut" :label="t('ErpStock.Item.count')" prop="inputCount"
|
|
|
|
|
|
|
|
min-width="140">
|
|
|
|
<template #default="{ row, $index }">
|
|
|
|
<template #default="{ row, $index }">
|
|
|
|
<el-form-item :prop="`${$index}.inputCount`" :rules="formRules.inputCount" class="mb-0px!">
|
|
|
|
<el-form-item :prop="`${$index}.inputCount`" :rules="formRules.inputCount" class="mb-0px!">
|
|
|
|
<el-input v-if="isProductStockOut" :model-value="row.inputCount ?? '-'" disabled />
|
|
|
|
<el-input v-if="disabled || isProductStockOut" :model-value="row.pieceCount ?? row.inputCount ?? '-'" readonly />
|
|
|
|
<el-input-number
|
|
|
|
<el-input-number v-else v-model="row.inputCount" controls-position="right" :min="0.001" :precision="3"
|
|
|
|
v-else
|
|
|
|
class="!w-100%" @blur="handleInputCountBlur(row)" />
|
|
|
|
v-model="row.inputCount" controls-position="right" :min="0.001" :precision="3"
|
|
|
|
|
|
|
|
class="!w-100%"
|
|
|
|
|
|
|
|
@blur="handleInputCountBlur(row)"
|
|
|
|
|
|
|
|
/>
|
|
|
|
|
|
|
|
</el-form-item>
|
|
|
|
</el-form-item>
|
|
|
|
</template>
|
|
|
|
</template>
|
|
|
|
</el-table-column>
|
|
|
|
</el-table-column>
|
|
|
|
@ -244,11 +202,11 @@ v-model="row.inputCount" controls-position="right" :min="0.001" :precision="3"
|
|
|
|
<el-table-column :label="t('ErpStock.Item.remark')" fixed="right" min-width="150">
|
|
|
|
<el-table-column :label="t('ErpStock.Item.remark')" fixed="right" min-width="150">
|
|
|
|
<template #default="{ row, $index }">
|
|
|
|
<template #default="{ row, $index }">
|
|
|
|
<el-form-item :prop="`${$index}.remark`" class="mb-0px!">
|
|
|
|
<el-form-item :prop="`${$index}.remark`" class="mb-0px!">
|
|
|
|
<el-input v-model="row.remark" :placeholder="t('ErpStock.Out.placeholderRemark')" />
|
|
|
|
<el-input v-model="row.remark" :readonly="disabled" :placeholder="t('ErpStock.Out.placeholderRemark')" />
|
|
|
|
</el-form-item>
|
|
|
|
</el-form-item>
|
|
|
|
</template>
|
|
|
|
</template>
|
|
|
|
</el-table-column>
|
|
|
|
</el-table-column>
|
|
|
|
<el-table-column align="center" fixed="right" :label="t('ErpStock.Item.action')" width="60">
|
|
|
|
<el-table-column v-if="!disabled" align="center" fixed="right" :label="t('ErpStock.Item.action')" width="60">
|
|
|
|
<template #default="{ $index }">
|
|
|
|
<template #default="{ $index }">
|
|
|
|
<el-button type="danger" @click="handleDelete($index)" link>
|
|
|
|
<el-button type="danger" @click="handleDelete($index)" link>
|
|
|
|
<Icon icon="ep:delete" />
|
|
|
|
<Icon icon="ep:delete" />
|
|
|
|
@ -264,13 +222,11 @@ v-model="row.inputCount" controls-position="right" :min="0.001" :precision="3"
|
|
|
|
<Dialog :title="t('ErpStock.Item.selectCode')" v-model="productDialogVisible" width="900px">
|
|
|
|
<Dialog :title="t('ErpStock.Item.selectCode')" v-model="productDialogVisible" width="900px">
|
|
|
|
<el-form :model="productQueryParams" :inline="true" class="-mb-15px">
|
|
|
|
<el-form :model="productQueryParams" :inline="true" class="-mb-15px">
|
|
|
|
<el-form-item :label="t('ErpStock.Item.code')">
|
|
|
|
<el-form-item :label="t('ErpStock.Item.code')">
|
|
|
|
<el-input
|
|
|
|
<el-input v-model="productQueryParams.barCode" clearable :placeholder="t('ErpStock.Item.placeholderCode')"
|
|
|
|
v-model="productQueryParams.barCode" clearable :placeholder="t('ErpStock.Item.placeholderCode')"
|
|
|
|
|
|
|
|
@keyup.enter="handleProductDialogQuery" />
|
|
|
|
@keyup.enter="handleProductDialogQuery" />
|
|
|
|
</el-form-item>
|
|
|
|
</el-form-item>
|
|
|
|
<el-form-item :label="t('ErpStock.Item.name')">
|
|
|
|
<el-form-item :label="t('ErpStock.Item.name')">
|
|
|
|
<el-input
|
|
|
|
<el-input v-model="productQueryParams.name" clearable :placeholder="t('ErpStock.Item.placeholderName')"
|
|
|
|
v-model="productQueryParams.name" clearable :placeholder="t('ErpStock.Item.placeholderName')"
|
|
|
|
|
|
|
|
@keyup.enter="handleProductDialogQuery" />
|
|
|
|
@keyup.enter="handleProductDialogQuery" />
|
|
|
|
</el-form-item>
|
|
|
|
</el-form-item>
|
|
|
|
<el-form-item>
|
|
|
|
<el-form-item>
|
|
|
|
@ -279,8 +235,7 @@ v-model="productQueryParams.name" clearable :placeholder="t('ErpStock.Item.place
|
|
|
|
</el-button>
|
|
|
|
</el-button>
|
|
|
|
</el-form-item>
|
|
|
|
</el-form-item>
|
|
|
|
</el-form>
|
|
|
|
</el-form>
|
|
|
|
<el-table
|
|
|
|
<el-table v-loading="productDialogLoading" :data="productDialogList" row-key="id" :stripe="true"
|
|
|
|
v-loading="productDialogLoading" :data="productDialogList" row-key="id" :stripe="true"
|
|
|
|
|
|
|
|
:show-overflow-tooltip="true" @row-click="handleProductDialogRowClick">
|
|
|
|
:show-overflow-tooltip="true" @row-click="handleProductDialogRowClick">
|
|
|
|
<el-table-column width="55" align="center">
|
|
|
|
<el-table-column width="55" align="center">
|
|
|
|
<template #default="{ row }">
|
|
|
|
<template #default="{ row }">
|
|
|
|
@ -292,17 +247,18 @@ v-loading="productDialogLoading" :data="productDialogList" row-key="id" :stripe=
|
|
|
|
<el-table-column :label="t('ErpStock.Item.spec')" prop="standard" min-width="120" />
|
|
|
|
<el-table-column :label="t('ErpStock.Item.spec')" prop="standard" min-width="120" />
|
|
|
|
<el-table-column :label="t('ErpStock.Item.category')" prop="subCategoryName" min-width="120" />
|
|
|
|
<el-table-column :label="t('ErpStock.Item.category')" prop="subCategoryName" min-width="120" />
|
|
|
|
<el-table-column :label="t('ErpStock.Item.unit')" prop="unitName" min-width="80" />
|
|
|
|
<el-table-column :label="t('ErpStock.Item.unit')" prop="unitName" min-width="80" />
|
|
|
|
<el-table-column v-if="isPurchaseUnitStockOut" :label="t('ErpStock.Item.purchaseUnit')" prop="purchaseUnitName" min-width="100" />
|
|
|
|
<el-table-column v-if="isPurchaseUnitStockOut" :label="t('ErpStock.Item.purchaseUnit')" prop="purchaseUnitName"
|
|
|
|
|
|
|
|
min-width="100" />
|
|
|
|
<el-table-column v-if="isPurchaseUnitStockOut" :label="t('ErpStock.Item.defaultSupplier')" min-width="130">
|
|
|
|
<el-table-column v-if="isPurchaseUnitStockOut" :label="t('ErpStock.Item.defaultSupplier')" min-width="130">
|
|
|
|
<template #default="{ row }">
|
|
|
|
<template #default="{ row }">
|
|
|
|
{{ getDefaultSupplierName(row) || '-' }}
|
|
|
|
{{ getDefaultSupplierName(row) || '-' }}
|
|
|
|
</template>
|
|
|
|
</template>
|
|
|
|
</el-table-column>
|
|
|
|
</el-table-column>
|
|
|
|
<el-table-column v-if="isPurchaseUnitStockOut" :label="t('ErpStock.Item.purchaseUnitConvertQuantity')" prop="purchaseUnitConvertQuantity" min-width="120" />
|
|
|
|
<el-table-column v-if="isPurchaseUnitStockOut" :label="t('ErpStock.Item.purchaseUnitConvertQuantity')"
|
|
|
|
|
|
|
|
prop="purchaseUnitConvertQuantity" min-width="120" />
|
|
|
|
</el-table>
|
|
|
|
</el-table>
|
|
|
|
<div class="product-dialog-pagination">
|
|
|
|
<div class="product-dialog-pagination">
|
|
|
|
<Pagination
|
|
|
|
<Pagination :total="productDialogTotal" v-model:page="productQueryParams.pageNo"
|
|
|
|
:total="productDialogTotal" v-model:page="productQueryParams.pageNo"
|
|
|
|
|
|
|
|
v-model:limit="productQueryParams.pageSize" @pagination="getProductDialogList" />
|
|
|
|
v-model:limit="productQueryParams.pageSize" @pagination="getProductDialogList" />
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
<template #footer>
|
|
|
|
<template #footer>
|
|
|
|
@ -311,29 +267,16 @@ v-loading="productDialogLoading" :data="productDialogList" row-key="id" :stripe=
|
|
|
|
</template>
|
|
|
|
</template>
|
|
|
|
</Dialog>
|
|
|
|
</Dialog>
|
|
|
|
|
|
|
|
|
|
|
|
<Dialog :title="t('ErpStock.Item.selectPalletCode')" v-model="palletDialogVisible" width="980px">
|
|
|
|
<Dialog :title="t('ErpStock.Item.selectPalletCode')" v-model="palletDialogVisible" :width="disabled ? '900px' : '1280px'">
|
|
|
|
<el-form :model="palletQueryParams" :inline="true" class="-mb-15px">
|
|
|
|
<el-form v-if="!disabled" :model="palletQueryParams" :inline="true" class="-mb-15px">
|
|
|
|
<el-form-item :label="t('ErpStock.Pallet.code')">
|
|
|
|
<el-form-item :label="t('ErpStock.Pallet.code')">
|
|
|
|
<el-input
|
|
|
|
<el-input v-model="palletQueryParams.code" clearable :placeholder="t('ErpStock.Pallet.placeholderCode')"
|
|
|
|
v-model="palletQueryParams.code"
|
|
|
|
@keyup.enter="handlePalletDialogQuery" />
|
|
|
|
clearable
|
|
|
|
|
|
|
|
:placeholder="t('ErpStock.Pallet.placeholderCode')"
|
|
|
|
|
|
|
|
@keyup.enter="handlePalletDialogQuery"
|
|
|
|
|
|
|
|
/>
|
|
|
|
|
|
|
|
</el-form-item>
|
|
|
|
</el-form-item>
|
|
|
|
<el-form-item :label="t('ErpStock.Pallet.status')">
|
|
|
|
<el-form-item :label="t('ErpStock.Pallet.status')">
|
|
|
|
<el-select
|
|
|
|
<el-select v-model="palletQueryParams.status" clearable :placeholder="t('ErpStock.Pallet.placeholderStatus')"
|
|
|
|
v-model="palletQueryParams.status"
|
|
|
|
class="!w-180px">
|
|
|
|
clearable
|
|
|
|
<el-option v-for="dict in palletStatusOptions" :key="dict.value" :label="dict.label" :value="dict.value" />
|
|
|
|
:placeholder="t('ErpStock.Pallet.placeholderStatus')"
|
|
|
|
|
|
|
|
class="!w-180px"
|
|
|
|
|
|
|
|
>
|
|
|
|
|
|
|
|
<el-option
|
|
|
|
|
|
|
|
v-for="dict in getIntDictOptions(DICT_TYPE.STORAGE_PALLET_STATUS)"
|
|
|
|
|
|
|
|
:key="dict.value"
|
|
|
|
|
|
|
|
:label="dict.label"
|
|
|
|
|
|
|
|
:value="dict.value"
|
|
|
|
|
|
|
|
/>
|
|
|
|
|
|
|
|
</el-select>
|
|
|
|
</el-select>
|
|
|
|
</el-form-item>
|
|
|
|
</el-form-item>
|
|
|
|
<el-form-item>
|
|
|
|
<el-form-item>
|
|
|
|
@ -342,16 +285,32 @@ v-loading="productDialogLoading" :data="productDialogList" row-key="id" :stripe=
|
|
|
|
</el-button>
|
|
|
|
</el-button>
|
|
|
|
</el-form-item>
|
|
|
|
</el-form-item>
|
|
|
|
</el-form>
|
|
|
|
</el-form>
|
|
|
|
<el-table
|
|
|
|
<el-table v-if="disabled" :data="selectedPalletRows" row-key="id" :stripe="true" :show-overflow-tooltip="true">
|
|
|
|
ref="palletTableRef"
|
|
|
|
<el-table-column :label="t('ErpStock.Pallet.code')" prop="code" min-width="150" />
|
|
|
|
v-loading="palletDialogLoading"
|
|
|
|
<el-table-column :label="t('ErpStock.Item.warehouse')" min-width="130">
|
|
|
|
:data="palletDialogList"
|
|
|
|
<template #default="{ row }">
|
|
|
|
row-key="id"
|
|
|
|
{{ getWarehouseName(row.warehouseId) }}
|
|
|
|
:stripe="true"
|
|
|
|
</template>
|
|
|
|
:show-overflow-tooltip="true"
|
|
|
|
</el-table-column>
|
|
|
|
@row-click="handlePalletDialogRowClick"
|
|
|
|
<el-table-column :label="t('ErpStock.Item.area')" min-width="130">
|
|
|
|
@selection-change="handlePalletDialogSelectionChange"
|
|
|
|
<template #default="{ row }">
|
|
|
|
>
|
|
|
|
{{ getAreaName(row.areaId) }}
|
|
|
|
|
|
|
|
</template>
|
|
|
|
|
|
|
|
</el-table-column>
|
|
|
|
|
|
|
|
<el-table-column :label="t('ErpStock.Item.outPackageCount')" min-width="130">
|
|
|
|
|
|
|
|
<template #default="{ row }">
|
|
|
|
|
|
|
|
<el-input :model-value="row.packageCount ?? '-'" readonly />
|
|
|
|
|
|
|
|
</template>
|
|
|
|
|
|
|
|
</el-table-column>
|
|
|
|
|
|
|
|
<el-table-column :label="t('ErpStock.Item.outCount')" min-width="120">
|
|
|
|
|
|
|
|
<template #default="{ row }">
|
|
|
|
|
|
|
|
<el-input :model-value="getSelectedPalletOutCount(row)" readonly />
|
|
|
|
|
|
|
|
</template>
|
|
|
|
|
|
|
|
</el-table-column>
|
|
|
|
|
|
|
|
</el-table>
|
|
|
|
|
|
|
|
<el-table v-else ref="palletTableRef" v-loading="palletDialogLoading" :data="palletDialogList" row-key="id" :stripe="true"
|
|
|
|
|
|
|
|
:show-overflow-tooltip="true" @row-click="handlePalletDialogRowClick"
|
|
|
|
|
|
|
|
@selection-change="handlePalletDialogSelectionChange">
|
|
|
|
<el-table-column type="selection" width="55" align="center" :reserve-selection="true" />
|
|
|
|
<el-table-column type="selection" width="55" align="center" :reserve-selection="true" />
|
|
|
|
<el-table-column :label="t('ErpStock.Pallet.code')" prop="code" min-width="150" />
|
|
|
|
<el-table-column :label="t('ErpStock.Pallet.code')" prop="code" min-width="150" />
|
|
|
|
<el-table-column :label="t('ErpStock.Pallet.palletType')" prop="palletType" min-width="100">
|
|
|
|
<el-table-column :label="t('ErpStock.Pallet.palletType')" prop="palletType" min-width="100">
|
|
|
|
@ -364,54 +323,53 @@ v-loading="productDialogLoading" :data="productDialogList" row-key="id" :stripe=
|
|
|
|
<dict-tag :type="DICT_TYPE.STORAGE_PALLET_STATUS" :value="row.status" />
|
|
|
|
<dict-tag :type="DICT_TYPE.STORAGE_PALLET_STATUS" :value="row.status" />
|
|
|
|
</template>
|
|
|
|
</template>
|
|
|
|
</el-table-column>
|
|
|
|
</el-table-column>
|
|
|
|
<el-table-column :label="t('ErpStock.Pallet.planCode')" prop="planCode" min-width="150" />
|
|
|
|
<el-table-column :label="t('ErpStock.Item.warehouse')" min-width="130">
|
|
|
|
|
|
|
|
<template #default="{ row }">
|
|
|
|
|
|
|
|
{{ getWarehouseName(row.warehouseId) }}
|
|
|
|
|
|
|
|
</template>
|
|
|
|
|
|
|
|
</el-table-column>
|
|
|
|
|
|
|
|
<el-table-column :label="t('ErpStock.Item.area')" min-width="130">
|
|
|
|
|
|
|
|
<template #default="{ row }">
|
|
|
|
|
|
|
|
{{ getAreaName(row.areaId) }}
|
|
|
|
|
|
|
|
</template>
|
|
|
|
|
|
|
|
</el-table-column>
|
|
|
|
<el-table-column :label="t('ErpStock.Pallet.productId')" prop="productId" min-width="100" />
|
|
|
|
<el-table-column :label="t('ErpStock.Pallet.productId')" prop="productId" min-width="100" />
|
|
|
|
<el-table-column :label="t('ErpStock.Item.packageCount')" prop="productCount" min-width="100" />
|
|
|
|
<el-table-column :label="t('ErpStock.Item.packageCount')" prop="productCount" min-width="100" />
|
|
|
|
<el-table-column v-if="currentSelectRow?.outMode === 2" label="出库包数" min-width="130">
|
|
|
|
<el-table-column :label="t('ErpStock.Item.outCount')" min-width="120">
|
|
|
|
<template #default="{ row }">
|
|
|
|
<template #default="{ row }">
|
|
|
|
<el-input-number
|
|
|
|
<el-input :model-value="getPalletOutCount(row)" disabled />
|
|
|
|
v-model="row.packageCount"
|
|
|
|
</template>
|
|
|
|
controls-position="right"
|
|
|
|
</el-table-column>
|
|
|
|
:min="0"
|
|
|
|
<el-table-column v-if="currentSelectRow?.outMode === 2" :label="t('ErpStock.Item.outPackageCount')" min-width="130">
|
|
|
|
:precision="0"
|
|
|
|
<template #default="{ row }">
|
|
|
|
class="!w-100%"
|
|
|
|
<el-input-number v-model="row.packageCount" controls-position="right" :min="0" :precision="0" class="!w-100%"
|
|
|
|
@change="handlePalletPackageCountChange($event, row)"
|
|
|
|
@change="handlePalletPackageCountChange($event, row)" @click.stop />
|
|
|
|
@click.stop
|
|
|
|
|
|
|
|
/>
|
|
|
|
|
|
|
|
</template>
|
|
|
|
</template>
|
|
|
|
</el-table-column>
|
|
|
|
</el-table-column>
|
|
|
|
</el-table>
|
|
|
|
</el-table>
|
|
|
|
<div class="product-dialog-pagination">
|
|
|
|
<div v-if="!disabled" class="product-dialog-pagination">
|
|
|
|
<Pagination
|
|
|
|
<Pagination :total="palletDialogTotal" v-model:page="palletQueryParams.pageNo"
|
|
|
|
:total="palletDialogTotal"
|
|
|
|
v-model:limit="palletQueryParams.pageSize" @pagination="getPalletDialogList" />
|
|
|
|
v-model:page="palletQueryParams.pageNo"
|
|
|
|
|
|
|
|
v-model:limit="palletQueryParams.pageSize"
|
|
|
|
|
|
|
|
@pagination="getPalletDialogList"
|
|
|
|
|
|
|
|
/>
|
|
|
|
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
<template #footer>
|
|
|
|
<template #footer>
|
|
|
|
<el-button type="primary" @click="confirmPalletSelect">{{ t('common.ok') }}</el-button>
|
|
|
|
<el-button v-if="!disabled" type="primary" @click="confirmPalletSelect">{{ t('common.ok') }}</el-button>
|
|
|
|
<el-button @click="palletDialogVisible = false">{{ t('common.cancel') }}</el-button>
|
|
|
|
<el-button @click="palletDialogVisible = false">{{ t('common.cancel') }}</el-button>
|
|
|
|
</template>
|
|
|
|
</template>
|
|
|
|
</Dialog>
|
|
|
|
</Dialog>
|
|
|
|
|
|
|
|
|
|
|
|
<Dialog :title="relatedOrderDialogTitle" v-model="relatedOrderDialogVisible" width="1100px">
|
|
|
|
<Dialog :title="relatedOrderDialogTitle" v-model="relatedOrderDialogVisible" width="1100px">
|
|
|
|
<el-table
|
|
|
|
<el-table v-loading="relatedOrderLoading" :data="relatedOrderList" :stripe="true" :show-overflow-tooltip="true"
|
|
|
|
v-loading="relatedOrderLoading"
|
|
|
|
row-key="id" @row-click="handleRelatedOrderRowClick">
|
|
|
|
:data="relatedOrderList"
|
|
|
|
|
|
|
|
:stripe="true"
|
|
|
|
|
|
|
|
:show-overflow-tooltip="true"
|
|
|
|
|
|
|
|
row-key="id"
|
|
|
|
|
|
|
|
@row-click="handleRelatedOrderRowClick"
|
|
|
|
|
|
|
|
>
|
|
|
|
|
|
|
|
<el-table-column width="55" align="center">
|
|
|
|
<el-table-column width="55" align="center">
|
|
|
|
<template #default="{ row }">
|
|
|
|
<template #default="{ row }">
|
|
|
|
<el-radio v-model="selectedRelatedOrderId" :label="row.id"> </el-radio>
|
|
|
|
<el-radio v-model="selectedRelatedOrderId" :label="row.id"> </el-radio>
|
|
|
|
</template>
|
|
|
|
</template>
|
|
|
|
</el-table-column>
|
|
|
|
</el-table-column>
|
|
|
|
<template v-if="relatedOrderType === 'repair'">
|
|
|
|
<template v-if="relatedOrderType === 'repair'">
|
|
|
|
<el-table-column :label="t('EquipmentManagement.DvRepair.repairCode')" align="center" prop="repairCode" min-width="180" />
|
|
|
|
<el-table-column :label="t('EquipmentManagement.DvRepair.repairCode')" align="center" prop="repairCode"
|
|
|
|
<el-table-column :label="t('EquipmentManagement.DvRepair.repairName')" align="center" prop="repairName" min-width="160" />
|
|
|
|
min-width="180" />
|
|
|
|
|
|
|
|
<el-table-column :label="t('EquipmentManagement.DvRepair.repairName')" align="center" prop="repairName"
|
|
|
|
|
|
|
|
min-width="160" />
|
|
|
|
<el-table-column :label="t('EquipmentManagement.DvRepair.status')" align="center" prop="status" width="110">
|
|
|
|
<el-table-column :label="t('EquipmentManagement.DvRepair.status')" align="center" prop="status" width="110">
|
|
|
|
<template #default="scope">
|
|
|
|
<template #default="scope">
|
|
|
|
<el-tag :type="getRepairStatusTagType(scope.row.status)" effect="light">
|
|
|
|
<el-tag :type="getRepairStatusTagType(scope.row.status)" effect="light">
|
|
|
|
@ -419,32 +377,46 @@ v-loading="productDialogLoading" :data="productDialogList" row-key="id" :stripe=
|
|
|
|
</el-tag>
|
|
|
|
</el-tag>
|
|
|
|
</template>
|
|
|
|
</template>
|
|
|
|
</el-table-column>
|
|
|
|
</el-table-column>
|
|
|
|
<el-table-column :label="t('EquipmentManagement.DvRepair.repairStatus')" align="center" prop="repairStatus" min-width="120">
|
|
|
|
<el-table-column :label="t('EquipmentManagement.DvRepair.repairStatus')" align="center" prop="repairStatus"
|
|
|
|
|
|
|
|
min-width="120">
|
|
|
|
<template #default="scope">
|
|
|
|
<template #default="scope">
|
|
|
|
<el-tag :type="getRepairResultTagType(scope.row.repairStatus)" effect="light">
|
|
|
|
<el-tag :type="getRepairResultTagType(scope.row.repairStatus)" effect="light">
|
|
|
|
{{ getRepairResultLabel(scope.row.repairStatus) }}
|
|
|
|
{{ getRepairResultLabel(scope.row.repairStatus) }}
|
|
|
|
</el-tag>
|
|
|
|
</el-tag>
|
|
|
|
</template>
|
|
|
|
</template>
|
|
|
|
</el-table-column>
|
|
|
|
</el-table-column>
|
|
|
|
<el-table-column :label="t('EquipmentManagement.DvRepair.machineryName')" align="center" prop="machineryName" min-width="180" />
|
|
|
|
<el-table-column :label="t('EquipmentManagement.DvRepair.machineryName')" align="center" prop="machineryName"
|
|
|
|
<el-table-column :label="t('EquipmentManagement.DvRepair.machineryCode')" align="center" prop="machineryCode" min-width="180" />
|
|
|
|
min-width="180" />
|
|
|
|
<el-table-column :label="t('EquipmentManagement.DvRepair.machinerySpec')" align="center" prop="machinerySpec" min-width="120" />
|
|
|
|
<el-table-column :label="t('EquipmentManagement.DvRepair.machineryCode')" align="center" prop="machineryCode"
|
|
|
|
<el-table-column :label="t('EquipmentManagement.DvRepair.machineryType')" align="center" prop="machineryTypeId" width="100">
|
|
|
|
min-width="180" />
|
|
|
|
|
|
|
|
<el-table-column :label="t('EquipmentManagement.DvRepair.machinerySpec')" align="center" prop="machinerySpec"
|
|
|
|
|
|
|
|
min-width="120" />
|
|
|
|
|
|
|
|
<el-table-column :label="t('EquipmentManagement.DvRepair.machineryType')" align="center" prop="machineryTypeId"
|
|
|
|
|
|
|
|
width="100">
|
|
|
|
<template #default="scope">
|
|
|
|
<template #default="scope">
|
|
|
|
<dict-tag :type="DICT_TYPE.MES_MACHINE_TYPE" :value="scope.row.machineryTypeId" />
|
|
|
|
<dict-tag :type="DICT_TYPE.MES_MACHINE_TYPE" :value="scope.row.machineryTypeId" />
|
|
|
|
</template>
|
|
|
|
</template>
|
|
|
|
</el-table-column>
|
|
|
|
</el-table-column>
|
|
|
|
<el-table-column :label="t('EquipmentManagement.DvRepair.requireDate')" align="center" prop="requireDate" :formatter="dateFormatter2" width="110" />
|
|
|
|
<el-table-column :label="t('EquipmentManagement.DvRepair.requireDate')" align="center" prop="requireDate"
|
|
|
|
<el-table-column :label="t('EquipmentManagement.DvRepair.finishDate')" align="center" prop="finishDate" :formatter="dateFormatter2" width="110" />
|
|
|
|
:formatter="dateFormatter2" width="110" />
|
|
|
|
<el-table-column :label="t('EquipmentManagement.DvRepair.confirmDate')" align="center" prop="confirmDate" :formatter="dateFormatter2" width="110" />
|
|
|
|
<el-table-column :label="t('EquipmentManagement.DvRepair.finishDate')" align="center" prop="finishDate"
|
|
|
|
<el-table-column :label="t('EquipmentManagement.DvRepair.acceptedBy')" align="center" prop="acceptedBy" min-width="150" />
|
|
|
|
:formatter="dateFormatter2" width="110" />
|
|
|
|
<el-table-column :label="t('EquipmentManagement.DvRepair.confirmBy')" align="center" prop="confirmBy" min-width="150" />
|
|
|
|
<el-table-column :label="t('EquipmentManagement.DvRepair.confirmDate')" align="center" prop="confirmDate"
|
|
|
|
<el-table-column :label="t('EquipmentManagement.DvRepair.createTime')" align="center" prop="createTime" :formatter="dateFormatter" width="170" />
|
|
|
|
:formatter="dateFormatter2" width="110" />
|
|
|
|
|
|
|
|
<el-table-column :label="t('EquipmentManagement.DvRepair.acceptedBy')" align="center" prop="acceptedBy"
|
|
|
|
|
|
|
|
min-width="150" />
|
|
|
|
|
|
|
|
<el-table-column :label="t('EquipmentManagement.DvRepair.confirmBy')" align="center" prop="confirmBy"
|
|
|
|
|
|
|
|
min-width="150" />
|
|
|
|
|
|
|
|
<el-table-column :label="t('EquipmentManagement.DvRepair.createTime')" align="center" prop="createTime"
|
|
|
|
|
|
|
|
:formatter="dateFormatter" width="170" />
|
|
|
|
</template>
|
|
|
|
</template>
|
|
|
|
<template v-else>
|
|
|
|
<template v-else>
|
|
|
|
<el-table-column :label="t('EquipmentManagement.WorkOrderManagement.planNo')" align="center" prop="planNo" min-width="160" />
|
|
|
|
<el-table-column :label="t('EquipmentManagement.WorkOrderManagement.planNo')" align="center" prop="planNo"
|
|
|
|
<el-table-column :label="t('EquipmentManagement.WorkOrderManagement.deviceName')" align="center" prop="deviceName" min-width="160" />
|
|
|
|
min-width="160" />
|
|
|
|
<el-table-column :label="t('EquipmentManagement.WorkOrderManagement.planType')" align="center" prop="planType" width="90">
|
|
|
|
<el-table-column :label="t('EquipmentManagement.WorkOrderManagement.deviceName')" align="center"
|
|
|
|
|
|
|
|
prop="deviceName" min-width="160" />
|
|
|
|
|
|
|
|
<el-table-column :label="t('EquipmentManagement.WorkOrderManagement.planType')" align="center" prop="planType"
|
|
|
|
|
|
|
|
width="90">
|
|
|
|
<template #default="scope">
|
|
|
|
<template #default="scope">
|
|
|
|
<el-tag v-if="String(scope.row.planType) === '1'" type="primary">
|
|
|
|
<el-tag v-if="String(scope.row.planType) === '1'" type="primary">
|
|
|
|
{{ t('EquipmentManagement.WorkOrderManagement.planTypeInspect') }}
|
|
|
|
{{ t('EquipmentManagement.WorkOrderManagement.planTypeInspect') }}
|
|
|
|
@ -455,16 +427,22 @@ v-loading="productDialogLoading" :data="productDialogList" row-key="id" :stripe=
|
|
|
|
<span v-else>-</span>
|
|
|
|
<span v-else>-</span>
|
|
|
|
</template>
|
|
|
|
</template>
|
|
|
|
</el-table-column>
|
|
|
|
</el-table-column>
|
|
|
|
<el-table-column :label="t('EquipmentManagement.WorkOrderManagement.configName')" align="center" prop="configName" min-width="160" />
|
|
|
|
<el-table-column :label="t('EquipmentManagement.WorkOrderManagement.configName')" align="center"
|
|
|
|
<el-table-column :label="t('EquipmentManagement.WorkOrderManagement.jobStatus')" align="center" prop="jobStatus" width="120">
|
|
|
|
prop="configName" min-width="160" />
|
|
|
|
|
|
|
|
<el-table-column :label="t('EquipmentManagement.WorkOrderManagement.jobStatus')" align="center" prop="jobStatus"
|
|
|
|
|
|
|
|
width="120">
|
|
|
|
<template #default="scope">
|
|
|
|
<template #default="scope">
|
|
|
|
<dict-tag :type="'job_status'" :value="scope.row.jobStatus" />
|
|
|
|
<dict-tag :type="'job_status'" :value="scope.row.jobStatus" />
|
|
|
|
</template>
|
|
|
|
</template>
|
|
|
|
</el-table-column>
|
|
|
|
</el-table-column>
|
|
|
|
<el-table-column :label="t('EquipmentManagement.WorkOrderManagement.operatorName')" align="center" prop="operatorName" width="140" />
|
|
|
|
<el-table-column :label="t('EquipmentManagement.WorkOrderManagement.operatorName')" align="center"
|
|
|
|
<el-table-column :label="t('EquipmentManagement.WorkOrderManagement.taskTime')" align="center" prop="taskTime" :formatter="dateFormatter" width="180" />
|
|
|
|
prop="operatorName" width="140" />
|
|
|
|
<el-table-column :label="t('EquipmentManagement.WorkOrderManagement.taskEndTime')" align="center" prop="taskEndTime" :formatter="dateFormatter" width="180" />
|
|
|
|
<el-table-column :label="t('EquipmentManagement.WorkOrderManagement.taskTime')" align="center" prop="taskTime"
|
|
|
|
<el-table-column :label="t('EquipmentManagement.WorkOrderManagement.jobResult')" align="center" prop="jobResult" width="90">
|
|
|
|
:formatter="dateFormatter" width="180" />
|
|
|
|
|
|
|
|
<el-table-column :label="t('EquipmentManagement.WorkOrderManagement.taskEndTime')" align="center"
|
|
|
|
|
|
|
|
prop="taskEndTime" :formatter="dateFormatter" width="180" />
|
|
|
|
|
|
|
|
<el-table-column :label="t('EquipmentManagement.WorkOrderManagement.jobResult')" align="center" prop="jobResult"
|
|
|
|
|
|
|
|
width="90">
|
|
|
|
<template #default="scope">
|
|
|
|
<template #default="scope">
|
|
|
|
<el-tag v-if="scope.row.jobResult == '1'" type="success">
|
|
|
|
<el-tag v-if="scope.row.jobResult == '1'" type="success">
|
|
|
|
{{ t('EquipmentManagement.WorkOrderManagement.jobResultOk') }}
|
|
|
|
{{ t('EquipmentManagement.WorkOrderManagement.jobResultOk') }}
|
|
|
|
@ -475,16 +453,13 @@ v-loading="productDialogLoading" :data="productDialogList" row-key="id" :stripe=
|
|
|
|
<span v-else>-</span>
|
|
|
|
<span v-else>-</span>
|
|
|
|
</template>
|
|
|
|
</template>
|
|
|
|
</el-table-column>
|
|
|
|
</el-table-column>
|
|
|
|
<el-table-column :label="t('EquipmentManagement.WorkOrderManagement.createTime')" align="center" prop="createTime" :formatter="dateFormatter" width="180" />
|
|
|
|
<el-table-column :label="t('EquipmentManagement.WorkOrderManagement.createTime')" align="center"
|
|
|
|
|
|
|
|
prop="createTime" :formatter="dateFormatter" width="180" />
|
|
|
|
</template>
|
|
|
|
</template>
|
|
|
|
</el-table>
|
|
|
|
</el-table>
|
|
|
|
<div class="product-dialog-pagination">
|
|
|
|
<div class="product-dialog-pagination">
|
|
|
|
<Pagination
|
|
|
|
<Pagination :total="relatedOrderTotal" v-model:page="relatedOrderQueryParams.pageNo"
|
|
|
|
:total="relatedOrderTotal"
|
|
|
|
v-model:limit="relatedOrderQueryParams.pageSize" @pagination="getRelatedOrderList" />
|
|
|
|
v-model:page="relatedOrderQueryParams.pageNo"
|
|
|
|
|
|
|
|
v-model:limit="relatedOrderQueryParams.pageSize"
|
|
|
|
|
|
|
|
@pagination="getRelatedOrderList"
|
|
|
|
|
|
|
|
/>
|
|
|
|
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
<template #footer>
|
|
|
|
<template #footer>
|
|
|
|
<el-button type="primary" @click="confirmRelatedOrderSelect">{{ t('common.ok') }}</el-button>
|
|
|
|
<el-button type="primary" @click="confirmRelatedOrderSelect">{{ t('common.ok') }}</el-button>
|
|
|
|
@ -577,8 +552,12 @@ const palletQueryParams = reactive({
|
|
|
|
pageNo: 1,
|
|
|
|
pageNo: 1,
|
|
|
|
pageSize: 10,
|
|
|
|
pageSize: 10,
|
|
|
|
code: undefined,
|
|
|
|
code: undefined,
|
|
|
|
status: undefined
|
|
|
|
status: undefined,
|
|
|
|
|
|
|
|
excludeStatus: 3
|
|
|
|
})
|
|
|
|
})
|
|
|
|
|
|
|
|
const palletStatusOptions = computed(() =>
|
|
|
|
|
|
|
|
getIntDictOptions(DICT_TYPE.STORAGE_PALLET_STATUS).filter((dict) => Number(dict.value) !== 3)
|
|
|
|
|
|
|
|
)
|
|
|
|
const RELATED_PURPOSE_REPAIR = '1'
|
|
|
|
const RELATED_PURPOSE_REPAIR = '1'
|
|
|
|
const RELATED_PURPOSE_MAINTAIN = '2'
|
|
|
|
const RELATED_PURPOSE_MAINTAIN = '2'
|
|
|
|
const relatedOrderDialogVisible = ref(false)
|
|
|
|
const relatedOrderDialogVisible = ref(false)
|
|
|
|
@ -861,7 +840,7 @@ const getDefaultSupplierName = (product: any) => {
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
const normalizeRows = (rows: any[]) => {
|
|
|
|
const normalizeRows = (rows: any[]) => {
|
|
|
|
;(rows || []).forEach(normalizeRow)
|
|
|
|
; (rows || []).forEach(normalizeRow)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
const normalizeRow = (row: any) => {
|
|
|
|
const normalizeRow = (row: any) => {
|
|
|
|
@ -945,10 +924,16 @@ const clearProduct = (row: any) => {
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
const handleProductClear = (row: any) => {
|
|
|
|
const handleProductClear = (row: any) => {
|
|
|
|
|
|
|
|
if (props.disabled) return
|
|
|
|
clearProduct(row)
|
|
|
|
clearProduct(row)
|
|
|
|
setStockCount(row)
|
|
|
|
setStockCount(row)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
const handleProductInputClick = (row: any) => {
|
|
|
|
|
|
|
|
if (props.disabled) return
|
|
|
|
|
|
|
|
openProductSelectDialog(row)
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
const openProductSelectDialog = async (row: any) => {
|
|
|
|
const openProductSelectDialog = async (row: any) => {
|
|
|
|
if (!activeCategoryType.value) return
|
|
|
|
if (!activeCategoryType.value) return
|
|
|
|
currentSelectRow.value = row
|
|
|
|
currentSelectRow.value = row
|
|
|
|
@ -996,16 +981,19 @@ const confirmProductSelect = async () => {
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
const handleOutModeChange = (row: any) => {
|
|
|
|
const handleOutModeChange = (row: any) => {
|
|
|
|
|
|
|
|
if (props.disabled) return
|
|
|
|
clearPallet(row)
|
|
|
|
clearPallet(row)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
const openPalletSelectDialog = async (row: any) => {
|
|
|
|
const openPalletSelectDialog = async (row: any) => {
|
|
|
|
currentSelectRow.value = row
|
|
|
|
currentSelectRow.value = row
|
|
|
|
selectedPalletRows.value = []
|
|
|
|
selectedPalletRows.value = getInitialSelectedPalletRows(row)
|
|
|
|
|
|
|
|
await loadRowsWarehouseAreas(selectedPalletRows.value)
|
|
|
|
palletQueryParams.pageNo = 1
|
|
|
|
palletQueryParams.pageNo = 1
|
|
|
|
palletQueryParams.code = undefined
|
|
|
|
palletQueryParams.code = undefined
|
|
|
|
palletQueryParams.status = undefined
|
|
|
|
palletQueryParams.status = undefined
|
|
|
|
palletDialogVisible.value = true
|
|
|
|
palletDialogVisible.value = true
|
|
|
|
|
|
|
|
if (props.disabled) return
|
|
|
|
await getPalletDialogList()
|
|
|
|
await getPalletDialogList()
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
@ -1015,8 +1003,8 @@ const getPalletDialogList = async () => {
|
|
|
|
const data = await PalletApi.getPalletPage({
|
|
|
|
const data = await PalletApi.getPalletPage({
|
|
|
|
...palletQueryParams,
|
|
|
|
...palletQueryParams,
|
|
|
|
productId: currentSelectRow.value?.productId,
|
|
|
|
productId: currentSelectRow.value?.productId,
|
|
|
|
warehouseId: currentSelectRow.value?.warehouseId,
|
|
|
|
warehouseId: isProductStockOut.value ? undefined : currentSelectRow.value?.warehouseId,
|
|
|
|
areaId: currentSelectRow.value?.areaId
|
|
|
|
areaId: isProductStockOut.value ? undefined : currentSelectRow.value?.areaId
|
|
|
|
})
|
|
|
|
})
|
|
|
|
const selectedPackageMap = new Map((currentSelectRow.value?.pallets || []).map((item: any) => [item.palletId, item.packageCount]))
|
|
|
|
const selectedPackageMap = new Map((currentSelectRow.value?.pallets || []).map((item: any) => [item.palletId, item.packageCount]))
|
|
|
|
palletDialogList.value = (data?.list || []).map((pallet: any) => {
|
|
|
|
palletDialogList.value = (data?.list || []).map((pallet: any) => {
|
|
|
|
@ -1027,6 +1015,7 @@ const getPalletDialogList = async () => {
|
|
|
|
}
|
|
|
|
}
|
|
|
|
})
|
|
|
|
})
|
|
|
|
palletDialogTotal.value = data?.total || 0
|
|
|
|
palletDialogTotal.value = data?.total || 0
|
|
|
|
|
|
|
|
await loadRowsWarehouseAreas(palletDialogList.value)
|
|
|
|
await nextTick()
|
|
|
|
await nextTick()
|
|
|
|
syncPalletDialogSelection()
|
|
|
|
syncPalletDialogSelection()
|
|
|
|
} finally {
|
|
|
|
} finally {
|
|
|
|
@ -1048,12 +1037,16 @@ const handlePalletDialogSelectionChange = (rows: PalletVO[]) => {
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
const confirmPalletSelect = () => {
|
|
|
|
const confirmPalletSelect = () => {
|
|
|
|
|
|
|
|
if (props.disabled) return
|
|
|
|
if (!currentSelectRow.value) return
|
|
|
|
if (!currentSelectRow.value) return
|
|
|
|
const row = currentSelectRow.value
|
|
|
|
const row = currentSelectRow.value
|
|
|
|
row.pallets = selectedPalletRows.value.map((pallet: any) => ({
|
|
|
|
row.pallets = selectedPalletRows.value.map((pallet: any) => ({
|
|
|
|
palletId: pallet.id,
|
|
|
|
palletId: pallet.id,
|
|
|
|
palletCode: pallet.code,
|
|
|
|
palletCode: pallet.code,
|
|
|
|
packageCount: getPalletPackageCount(row, pallet)
|
|
|
|
packageCount: getPalletPackageCount(row, pallet),
|
|
|
|
|
|
|
|
warehouseId: pallet.warehouseId,
|
|
|
|
|
|
|
|
areaId: pallet.areaId,
|
|
|
|
|
|
|
|
count: getSelectedPalletOutCountValue(pallet)
|
|
|
|
}))
|
|
|
|
}))
|
|
|
|
row.palletCode = selectedPalletRows.value.map((pallet) => pallet.code).filter(Boolean).join(', ')
|
|
|
|
row.palletCode = selectedPalletRows.value.map((pallet) => pallet.code).filter(Boolean).join(', ')
|
|
|
|
syncInputCountByPallets(row)
|
|
|
|
syncInputCountByPallets(row)
|
|
|
|
@ -1061,6 +1054,7 @@ const confirmPalletSelect = () => {
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
const clearPallet = (row: any) => {
|
|
|
|
const clearPallet = (row: any) => {
|
|
|
|
|
|
|
|
if (props.disabled) return
|
|
|
|
if (!row) return
|
|
|
|
if (!row) return
|
|
|
|
row.pallets = []
|
|
|
|
row.pallets = []
|
|
|
|
row.palletCode = undefined
|
|
|
|
row.palletCode = undefined
|
|
|
|
@ -1071,6 +1065,26 @@ const clearPallet = (row: any) => {
|
|
|
|
row.count = isProductStockOut.value ? undefined : row.count
|
|
|
|
row.count = isProductStockOut.value ? undefined : row.count
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
const getInitialSelectedPalletRows = (row: any) => {
|
|
|
|
|
|
|
|
const palletCodes = String(row?.palletCode || '')
|
|
|
|
|
|
|
|
.split(',')
|
|
|
|
|
|
|
|
.map((item) => item.trim())
|
|
|
|
|
|
|
|
.filter(Boolean)
|
|
|
|
|
|
|
|
const packageQuantity = Number(row?.packageQuantity)
|
|
|
|
|
|
|
|
return (row?.pallets || []).map((item: any, index: number) => ({
|
|
|
|
|
|
|
|
id: item.palletId,
|
|
|
|
|
|
|
|
code: item.palletCode || item.code || palletCodes[index] || String(item.palletId),
|
|
|
|
|
|
|
|
packageCount:
|
|
|
|
|
|
|
|
item.packageCount ??
|
|
|
|
|
|
|
|
(Number.isFinite(packageQuantity) && Number.isFinite(Number(item.count))
|
|
|
|
|
|
|
|
? Number(item.count) / packageQuantity
|
|
|
|
|
|
|
|
: undefined),
|
|
|
|
|
|
|
|
warehouseId: item.warehouseId,
|
|
|
|
|
|
|
|
areaId: item.areaId,
|
|
|
|
|
|
|
|
count: item.count
|
|
|
|
|
|
|
|
}))
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
const syncPalletDialogSelection = () => {
|
|
|
|
const syncPalletDialogSelection = () => {
|
|
|
|
const row = currentSelectRow.value
|
|
|
|
const row = currentSelectRow.value
|
|
|
|
if (!row || !palletTableRef.value) return
|
|
|
|
if (!row || !palletTableRef.value) return
|
|
|
|
@ -1096,6 +1110,27 @@ const handlePalletPackageCountChange = (value: number | undefined, pallet: any)
|
|
|
|
message.warning(`出库包数不能大于包数,已自动调整为${availablePackageCount}`)
|
|
|
|
message.warning(`出库包数不能大于包数,已自动调整为${availablePackageCount}`)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
const getPalletOutCount = (pallet: any) => {
|
|
|
|
|
|
|
|
const packageQuantity = Number(currentSelectRow.value?.packageQuantity)
|
|
|
|
|
|
|
|
if (!Number.isFinite(packageQuantity)) return undefined
|
|
|
|
|
|
|
|
const packageCount = getPalletPackageCount(currentSelectRow.value, pallet)
|
|
|
|
|
|
|
|
return Number.isFinite(packageCount) ? packageQuantity * packageCount : undefined
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
const getSelectedPalletOutCountValue = (pallet: any) => {
|
|
|
|
|
|
|
|
const packageQuantity = Number(currentSelectRow.value?.packageQuantity)
|
|
|
|
|
|
|
|
const packageCount = Number(pallet?.packageCount)
|
|
|
|
|
|
|
|
if (Number.isFinite(packageQuantity) && Number.isFinite(packageCount)) {
|
|
|
|
|
|
|
|
return packageQuantity * packageCount
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
const currentCount = Number(pallet?.count)
|
|
|
|
|
|
|
|
return Number.isFinite(currentCount) ? currentCount : undefined
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
const getSelectedPalletOutCount = (pallet: any) => {
|
|
|
|
|
|
|
|
return getSelectedPalletOutCountValue(pallet) ?? '-'
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
const getPalletPackageCount = (row: any, pallet: any) => {
|
|
|
|
const getPalletPackageCount = (row: any, pallet: any) => {
|
|
|
|
const availablePackageCount = getPalletAvailablePackageCount(pallet)
|
|
|
|
const availablePackageCount = getPalletAvailablePackageCount(pallet)
|
|
|
|
if (Number(row.outMode) === 1) {
|
|
|
|
if (Number(row.outMode) === 1) {
|
|
|
|
@ -1157,9 +1192,21 @@ const clearRelatedOrder = (row: any) => {
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
const handleOutboundPurposeChange = (row: any) => {
|
|
|
|
const handleOutboundPurposeChange = (row: any) => {
|
|
|
|
|
|
|
|
if (props.disabled) return
|
|
|
|
clearRelatedOrder(row)
|
|
|
|
clearRelatedOrder(row)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
const getOutboundPurposeLabel = (value: any) => {
|
|
|
|
|
|
|
|
const currentValue = String(value ?? '')
|
|
|
|
|
|
|
|
return outboundPurposeOptions.value.find((item) => String(item.value) === currentValue)?.label ?? '-'
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
const getOutModeLabel = (value: any) => {
|
|
|
|
|
|
|
|
if (Number(value) === 1) return t('ErpStock.Item.outModeWholePallet')
|
|
|
|
|
|
|
|
if (Number(value) === 2) return t('ErpStock.Item.outModeSplitPallet')
|
|
|
|
|
|
|
|
return '-'
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
const getRelatedOrderPlaceholder = (purpose: any) => {
|
|
|
|
const getRelatedOrderPlaceholder = (purpose: any) => {
|
|
|
|
return String(purpose ?? '') === RELATED_PURPOSE_REPAIR
|
|
|
|
return String(purpose ?? '') === RELATED_PURPOSE_REPAIR
|
|
|
|
? t('ErpStock.Item.placeholderRelatedRepairOrder')
|
|
|
|
? t('ErpStock.Item.placeholderRelatedRepairOrder')
|
|
|
|
@ -1167,6 +1214,7 @@ const getRelatedOrderPlaceholder = (purpose: any) => {
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
const openRelatedOrderDialog = async (row: any) => {
|
|
|
|
const openRelatedOrderDialog = async (row: any) => {
|
|
|
|
|
|
|
|
if (props.disabled) return
|
|
|
|
const purpose = String(row.outUsageType ?? '')
|
|
|
|
const purpose = String(row.outUsageType ?? '')
|
|
|
|
if (!isRelatedPurpose(purpose)) return
|
|
|
|
if (!isRelatedPurpose(purpose)) return
|
|
|
|
currentRelatedRow.value = row
|
|
|
|
currentRelatedRow.value = row
|
|
|
|
@ -1316,6 +1364,15 @@ const getAreaLabel = (item: WarehouseAreaVO) => {
|
|
|
|
return item.areaCode ? `${item.areaCode} - ${item.areaName}` : item.areaName
|
|
|
|
return item.areaCode ? `${item.areaCode} - ${item.areaName}` : item.areaName
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
const getWarehouseName = (warehouseId: number | string | undefined) => {
|
|
|
|
|
|
|
|
return warehouseList.value.find((item) => String(item.id) === String(warehouseId))?.name ?? warehouseId ?? '-'
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
const getAreaName = (areaId: number | string | undefined) => {
|
|
|
|
|
|
|
|
const areaList = Object.values(warehouseAreaMap.value).flat()
|
|
|
|
|
|
|
|
return areaList.find((item) => String(item.id) === String(areaId))?.areaName ?? areaId ?? '-'
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
const fillProductNames = (rows: any[]) => {
|
|
|
|
const fillProductNames = (rows: any[]) => {
|
|
|
|
if (!productList.value.length) return
|
|
|
|
if (!productList.value.length) return
|
|
|
|
rows.forEach((row) => {
|
|
|
|
rows.forEach((row) => {
|
|
|
|
|