Commit 22a5a2d2 by wuqian

出库单完成

parent c5abe4eb
......@@ -5,6 +5,8 @@ export interface warehouseSearchForm {
billStatus?: string
createTimeEnd?: string
createTimeStart?: string
startTime?: string
endTime?: string
inNo?: string
outNo?: string
warehouseSku?: string
......@@ -106,6 +108,7 @@ export interface InterskuList {
price?: number | null //出库单的
usableInventory?: number | null
warehouseSku?: string
remark?: string | null
}
export interface ILocation {
id?: number
......
......@@ -817,7 +817,7 @@ import {
factoryWarehouseInventoryPrint,
OutRecordBatchCheckPrintApi,
} from '@/api/warehouse'
import { filePath } from '@/api/axios.ts'
import { filePath } from '@/api/axios'
import BigNumber from 'bignumber.js'
import { ref, onMounted, watch, nextTick } from 'vue'
import 'element-plus/dist/index.css'
......@@ -966,7 +966,7 @@ const rules = {
warehouseId: [{ required: true, message: '请选择仓库', trigger: 'change' }],
}
const isAllExport = () => {
if (exportForm.value.resource === 2) {
if (exportForm.value.resource == '2') {
ElMessage.warning('最多支持5000条!')
}
}
......@@ -994,7 +994,7 @@ const {
},
page,
pageSize,
).then((res) => res.data) as never,
).then((res) => res.data),
})
const setCostPrice = (item: InterProductList) => {
......@@ -1097,9 +1097,10 @@ const batchAddCommodity = async (sku: string): Promise<InterskuList[]> => {
}
}
interface InterImportData {
warehouseSku: string
remark?: string | null
[key: string]: unknown
warehouseSku: string;
remark?: string | null;
buyStored?: string | number | null | object; // 扩大 buyStored 类型,以兼容原始数据
[propName: string]: string | number | boolean | undefined | unknown
}
// 前端导入Excel
const excelFieldMap: Record<string, keyof InterImportData> = {
......@@ -1118,71 +1119,95 @@ const handleLocalImport = async ({
data,
}: {
path: string
data: InterImportData[]
data: Record<string, any>[]
}) => {
// 1. 将原始导入数据映射到 InterImportData[]
const importedData: InterImportData[] = data
.map((item) => {
const obj: InterImportData = { warehouseSku: '' }
Object.keys(excelFieldMap).forEach((excelKey) => {
const field = excelFieldMap[excelKey]
const value = item[excelKey]
// 根据目标字段进行可能的类型转换或处理
const importedData: InterImportData[] = data.map(item => {
const obj: InterImportData = { warehouseSku: '' };
Object.keys(excelFieldMap).forEach(excelKey => {
const field = excelFieldMap[excelKey];
const value = item[excelKey];
if (field === 'warehouseSku') {
obj[field] = typeof value === 'string' ? value : String(value ?? '') // 转换为字符串,处理 null/undefined
obj[field] = typeof value === 'string' ? value : String(value ?? '');
} else if (field === 'remark') {
obj[field] =
typeof value === 'string'
? value
: value === null || value === undefined
? null
: String(value) // 备注可以是 string | null
obj[field] = typeof value === 'string' ? value : (value === null || value === undefined ? null : String(value));
} else if (field === 'buyStored') {
// 处理 buyStored: 确保它是一个数字、数字字符串,否则设置为 null
if (typeof value === 'number') {
obj[field] = String(value); // 将数字转换为字符串
} else if (typeof value === 'string' && !isNaN(Number(value))) {
obj[field] = value; // 保持有效的数字字符串
} else {
// 如果不是数字或有效的数字字符串,则设置为 null
obj[field] = null;
}
} else {
// 处理其他字段
obj[field] = value
obj[field] = value;
}
})
return obj
})
.filter((item) => item.warehouseSku) // 过滤掉没有 SKU 的行
});
return obj;
}).filter(item => item.warehouseSku);
if (importedData.length === 0) {
ElMessage.warning('导入数据中没有有效的商品SKU')
importDialogVisible.value = false
return
ElMessage.warning('导入数据中没有有效的商品SKU');
importDialogVisible.value = false;
return;
}
// 2. 提取导入的 SKU 列表
const importedSkus = importedData.map((item) => item.warehouseSku).join(',')
const importedSkus = importedData.map(item => item.warehouseSku).join(',');
// 3. 调用 batchAddCommodity 获取商品的完整信息并过滤掉已有的 SKU
const filteredSkusList = await batchAddCommodity(importedSkus) // 使用 await 等待结果
const filteredSkusList = await batchAddCommodity(importedSkus);
if (filteredSkusList.length === 0) {
ElMessage.warning('导入的商品SKU已存在或无效')
importedFileUrl.value = path
importDialogVisible.value = false
return
ElMessage.warning('导入的商品SKU已存在或无效');
importedFileUrl.value = path;
importDialogVisible.value = false;
return;
}
// 4. 将备注信息合并到获取到的商品列表中
const mergedProductList = filteredSkusList.map((skuItem) => {
// 在导入数据中找到匹配的备注信息
const importedItem = importedData.find(
(item) => item.warehouseSku === skuItem.warehouseSku,
)
return {
skuImage: skuItem.image,
warehouseSku: skuItem.warehouseSku,
skuName: skuItem.skuName,
productNo: skuItem.productNumber,
locationCode: skuItem.locationCode ?? '',
locationId: skuItem.locationId ?? null,
costPrice: skuItem.price,
outCount: null, // 出库数量初始为 null
totalPrice: null,
usableInventory: skuItem.usableInventory,
inventoryId: skuItem.id,
remark: importedItem?.remark ?? null,
} as InterProductList // 明确类型
})
const mergedProductList = filteredSkusList.map(skuItem => {
const importedItem = importedData.find(item => item.warehouseSku === skuItem.warehouseSku);
let outCountValueForBigNumber: string | number = '0'; // 初始化为安全默认值
if (importedItem?.buyStored !== null && importedItem?.buyStored !== undefined) {
if (typeof importedItem.buyStored === 'string' && !isNaN(Number(importedItem.buyStored))) {
outCountValueForBigNumber = importedItem.buyStored;
} else if (typeof importedItem.buyStored === 'number') {
outCountValueForBigNumber = importedItem.buyStored;
} else {
// 如果是对象或其他意外类型,则默认为 '0'
outCountValueForBigNumber = '0';
}
}
const calculatedOutCount = new BigNumber(outCountValueForBigNumber).toNumber();
return {
skuImage: skuItem.image,
warehouseSku: skuItem.warehouseSku,
skuName: skuItem.skuName,
productNo: skuItem.productNumber,
locationCode: skuItem.locationCode ?? '',
locationId: skuItem.locationId ?? null,
costPrice: skuItem.price,
outCount: calculatedOutCount,
totalPrice: new BigNumber(calculatedOutCount).multipliedBy(skuItem.price ?? 0).toNumber(),
usableInventory: skuItem.usableInventory,
inventoryId: skuItem.id,
remark: importedItem?.remark ?? skuItem.remark ?? null,
} as InterProductList;
});
// 5. 更新 otherPurchaseData
otherPurchaseData.value = [...otherPurchaseData.value, ...mergedProductList]
otherPurchaseData.value = [...otherPurchaseData.value, ...mergedProductList];
importedFileUrl.value = path
importDialogVisible.value = false
}
......@@ -1198,14 +1223,18 @@ const submitExportForm = async () => {
if (exportForm.value.resource === '') {
return ElMessage.error('请选择导出类型')
}
let purchaseIds = []
let purchaseIds: number[] = []
let exportTotal: number | undefined = undefined
const params: AnyObject = {}
const resourceType = Number(exportForm.value.resource)
if (resourceType === 0) {
purchaseIds = tableData.value.map((el: InterWarehousePage) => el.id)
purchaseIds = (tableData.value as InterWarehousePage[]).map(
(el: InterWarehousePage) => Number(el.id),
)
} else if (resourceType === 1) {
purchaseIds = selections.value.map((el: InterWarehousePage) => el.id)
purchaseIds = selections.value.map((el: InterWarehousePage) =>
Number(el.id),
)
} else if (resourceType === 2) {
purchaseIds = []
exportTotal = total.value
......
......@@ -1001,7 +1001,7 @@ const rules = {
warehouseId: [{ required: true, message: '请选择仓库', trigger: 'change' }],
}
const isAllExport = () => {
if (exportForm.value.resource === 2) {
if (exportForm.value.resource == '2') {
ElMessage.warning('最多支持5000条!')
}
}
......@@ -1160,11 +1160,33 @@ const handleLocalImport = async ({
Object.keys(excelFieldMap).forEach((excelKey) => {
const field = excelFieldMap[excelKey]
const value = item[excelKey]
obj[field] = value
if (field === 'warehouseSku') {
obj[field] = typeof value === 'string' ? value : String(value ?? '')
} else if (field === 'remark') {
obj[field] =
typeof value === 'string'
? value
: value === null || value === undefined
? null
: String(value)
} else if (field === 'buyStored') {
// 确保 value 是一个有效的数字或数字字符串,否则设置为 null
if (
typeof value === 'number' ||
(typeof value === 'string' && !isNaN(Number(value)))
) {
obj[field] = String(value) // 转换为字符串
} else {
obj[field] = null // 无效值设置为 null
}
} else {
obj[field] = value
}
})
return obj
})
.filter((item) => item.warehouseSku) // 过滤掉没有 SKU 的行
.filter((item) => item.warehouseSku)
if (importedData.length === 0) {
ElMessage.warning('导入数据中没有有效的商品SKU')
importDialogVisible.value = false
......@@ -1186,9 +1208,6 @@ const handleLocalImport = async ({
const importedItem = importedData.find(
(item) => item.warehouseSku === skuItem.sku,
)
const amount = new BigNumber(importedItem?.buyStored)
.multipliedBy(skuItem.factoryPrice)
.toFixed(2)
return {
skuImage: skuItem.image,
warehouseSku: skuItem.sku,
......@@ -1198,7 +1217,11 @@ const handleLocalImport = async ({
locationId: skuItem.locationId ?? null,
costPrice: skuItem.factoryPrice,
buyStored: importedItem?.buyStored ?? null,
totalPrice: Number(amount),
totalPrice: new BigNumber(
(importedItem?.buyStored ?? 0) as number | string,
)
.multipliedBy(skuItem.price ?? 0)
.toNumber(),
usableInventory: skuItem.usableInventory,
remark: importedItem?.remark ?? null,
} as InterProductList // 明确类型
......
......@@ -112,14 +112,14 @@ const submitExportForm = async () => {
return ElMessage.error('请选择导出类型')
}
exportLoading.value = true
let purchaseIds = []
let purchaseIds: number[] = []
let exportTotal: number | undefined = undefined
const params: AnyObject = {}
const resourceType = Number(exportForm.value.resource)
if (resourceType === 0) {
purchaseIds = leftData.value.map((el: WarehouseWarning) => el.id)
purchaseIds = leftData.value.map((el: WarehouseWarning) => Number(el.id))
} else if (resourceType === 1) {
purchaseIds = selections.value.map((el: WarehouseWarning) => el.id)
purchaseIds = selections.value.map((el: WarehouseWarning) => Number(el.id))
} else if (resourceType === 2) {
purchaseIds = []
exportTotal = pagination.value.total
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment