feat:产品入库、出库-清单修改

master
黄伟杰 3 days ago
parent ba1bdb3164
commit 0ea75db468

@ -1,4 +1,4 @@
<template>
<template>
<view class="page-container">
<NavBar :title="t('productInbound.createTitle')" />
@ -89,7 +89,7 @@
</view>
<view v-if="itemList.length" class="item-list">
<view v-for="(item, idx) in itemList" :key="idx" class="item-card">
<view v-for="(item, idx) in itemList" :key="idx" class="item-card" @click="editItem(idx)">
<view class="image-box">
<image v-if="getItemImage(item)" :src="getItemImage(item)" class="item-image" mode="aspectFill" />
<uni-icons v-else type="image" size="34" color="#cbd5e1"></uni-icons>
@ -97,7 +97,7 @@
<view class="item-info">
<view class="item-header">
<text class="item-name">{{ textValue(item.productName) }}</text>
<view class="delete-btn" @click="removeItem(idx)">
<view class="delete-btn" @click.stop="removeItem(idx)">
<uni-icons type="trash" size="18" color="#ef4444"></uni-icons>
</view>
</view>
@ -172,6 +172,10 @@ function handleDateChange(e) {
inboundDate.value = e.detail.value
}
function handleAddProduct() {
const gd = getApp().globalData
gd._productInboundEditIndex = null
gd._productInboundEditItem = null
gd._productInboundItems = [...itemList.value]
uni.navigateTo({ url: '/pages_function/pages/productInbound/productConfirm' })
}
function goSelectOperator() {
@ -191,6 +195,15 @@ function removeItem(idx) {
itemList.value.splice(idx, 1)
getApp().globalData._productInboundItems = [...itemList.value]
}
function editItem(idx) {
const item = itemList.value[idx]
if (!item) return
const gd = getApp().globalData
gd._productInboundItems = [...itemList.value]
gd._productInboundEditIndex = idx
gd._productInboundEditItem = JSON.parse(JSON.stringify(item))
uni.navigateTo({ url: '/pages_function/pages/productInbound/productConfirm?mode=edit' })
}
function handleCancel() {
getApp().globalData._productInboundItems = []
uni.navigateBack()

@ -1,4 +1,4 @@
<template>
<template>
<view class="page-container">
<NavBar :title="t('productInbound.createTitle')" />
@ -168,7 +168,7 @@
<script setup>
import { computed, ref } from 'vue'
import { onShow } from '@dcloudio/uni-app'
import { onLoad, onShow } from '@dcloudio/uni-app'
import { useI18n } from 'vue-i18n'
import NavBar from '@/components/common/NavBar.vue'
import { getTaskDefaultPackagingSchemes } from '@/api/mes/productInbound'
@ -182,6 +182,7 @@ const taskCode = ref('')
const selectedTaskData = ref(null)
const selectedTaskProduct = ref(null)
const selectedPallets = ref([])
const editingIndex = ref(null)
const warehouseOptions = ref([])
const warehouseAreaMap = ref({})
@ -208,7 +209,77 @@ const count = computed(() => {
})
const palletCode = computed(() => selectedPallets.value.map((item) => getPalletCode(item)).filter(Boolean).join(', '))
function textValue(v) {
function cloneData(value) {
if (value === null || value === undefined) return value
return JSON.parse(JSON.stringify(value))
}
function buildSchemeFromItem(item) {
return {
id: item?.packagingSchemeRelationId,
packagingSchemeId: item?.packagingSchemeId,
packagingSchemeName: item?.packagingSchemeName,
packageQuantity: item?.packageQuantity,
palletPackageQuantity: item?.palletPackageQuantity,
palletTotalQuantity: item?.palletTotalQuantity,
defaultStatus: 1
}
}
function normalizeEditPallets(item) {
return (Array.isArray(item?.pallets) ? item.pallets : []).map((pallet) => ({
...pallet,
id: pallet.id || pallet.palletId,
code: pallet.code || pallet.palletCode,
palletCode: pallet.palletCode || pallet.code,
packageCount: Number(pallet.packageCount) || 0,
warehouseId: pallet.warehouseId,
areaId: pallet.areaId
}))
}
async function hydrateEditItem(item) {
if (!item) return
const scheme = buildSchemeFromItem(item)
relateTask.value = item.relateTask === true || item.relateTask === 1 || item.relateTask === '1'
taskId.value = relateTask.value ? item.taskId : null
taskCode.value = relateTask.value ? (item.taskCode || '') : ''
selectedTaskData.value = item._selectedTaskData ? cloneData(item._selectedTaskData) : null
product.value = item._product
? cloneData(item._product)
: {
id: item.productId,
name: item.productName,
barCode: item.productBarCode,
code: item.productBarCode,
unitName: item.productUnitName,
images: item.images,
packagingSchemes: [scheme]
}
if (relateTask.value) {
selectedTaskProduct.value = item._selectedTaskProduct
? cloneData(item._selectedTaskProduct)
: {
productId: item.productId,
productName: item.productName,
productCode: item.productBarCode,
taskDetailIds: item.taskDetailIds,
packagingSchemes: [scheme]
}
if (taskId.value) {
try {
const res = await getTaskDefaultPackagingSchemes(taskId.value)
selectedTaskData.value = res?.data || res || selectedTaskData.value || {}
taskProductList.value = Array.isArray(selectedTaskData.value?.products) ? selectedTaskData.value.products : []
} catch (e) {
taskProductList.value = Array.isArray(selectedTaskData.value?.products) ? selectedTaskData.value.products : []
}
}
} else {
selectedTaskProduct.value = null
selectedTaskData.value = null
taskProductList.value = []
}
selectedPallets.value = normalizeEditPallets(item)
await loadAreasForPallets(selectedPallets.value)
}function textValue(v) {
if (v === 0) return '0'
if (v == null) return '-'
const s = String(v).trim()
@ -329,6 +400,9 @@ async function loadAreasForPallets(pallets) {
await Promise.all(warehouseIds.map((id) => loadAreasForWarehouse(id)))
}
function handleCancel() {
const gd = getApp().globalData
gd._productInboundEditIndex = null
gd._productInboundEditItem = null
uni.navigateBack()
}
function handleConfirm() {
@ -386,14 +460,35 @@ function handleConfirm() {
count: (Number(pallet.packageCount) || 0) * (packageQuantity.value || 1)
})),
images: product.value.images,
_product: { ...product.value }
_product: { ...product.value },
_selectedTaskProduct: selectedTaskProduct.value ? { ...selectedTaskProduct.value } : null,
_selectedTaskData: selectedTaskData.value ? { ...selectedTaskData.value } : null
}
const gd = getApp().globalData
if (!gd._productInboundItems) gd._productInboundItems = []
const index = Number(editingIndex.value)
if (Number.isInteger(index) && index >= 0 && index < gd._productInboundItems.length) {
gd._productInboundItems.splice(index, 1, item)
} else {
gd._productInboundItems.push(item)
}
if (!getApp().globalData._productInboundItems) getApp().globalData._productInboundItems = []
getApp().globalData._productInboundItems.push(item)
gd._productInboundEditIndex = null
gd._productInboundEditItem = null
uni.showToast({ title: t('productInbound.productAdded'), icon: 'success', duration: 1000 })
setTimeout(() => uni.navigateBack(), 700)
}
onLoad(async () => {
const gd = getApp().globalData
const index = gd?._productInboundEditIndex
const item = gd?._productInboundEditItem
if (item && index !== null && index !== undefined) {
editingIndex.value = Number(index)
gd._productInboundEditIndex = null
gd._productInboundEditItem = null
await hydrateEditItem(item)
}
})
onShow(async () => {
const gd = getApp().globalData
const taskResult = gd?._productInboundTaskSelectResult

@ -89,7 +89,7 @@
</view>
<view v-if="itemList.length" class="item-list">
<view v-for="(item, idx) in itemList" :key="idx" class="item-card">
<view v-for="(item, idx) in itemList" :key="idx" class="item-card" @click="editItem(idx)">
<view class="image-box">
<image v-if="getItemImage(item)" :src="getItemImage(item)" class="item-image" mode="aspectFill" />
<uni-icons v-else type="image" size="34" color="#cbd5e1"></uni-icons>
@ -97,7 +97,7 @@
<view class="item-info">
<view class="item-header">
<text class="item-name">{{ textValue(item.productName) }}</text>
<view class="delete-btn" @click="removeItem(idx)">
<view class="delete-btn" @click.stop="removeItem(idx)">
<uni-icons type="trash" size="18" color="#ef4444"></uni-icons>
</view>
</view>
@ -172,6 +172,10 @@ function handleDateChange(e) {
outboundDate.value = e.detail.value
}
function handleAddProduct() {
const gd = getApp().globalData
gd._productOutboundEditIndex = null
gd._productOutboundEditItem = null
gd._productOutboundItems = [...itemList.value]
uni.navigateTo({ url: '/pages_function/pages/productOutbound/productConfirm' })
}
function goSelectOperator() {
@ -196,6 +200,15 @@ function removeItem(idx) {
itemList.value.splice(idx, 1)
getApp().globalData._productOutboundItems = [...itemList.value]
}
function editItem(idx) {
const item = itemList.value[idx]
if (!item) return
const gd = getApp().globalData
gd._productOutboundItems = [...itemList.value]
gd._productOutboundEditIndex = idx
gd._productOutboundEditItem = JSON.parse(JSON.stringify(item))
uni.navigateTo({ url: '/pages_function/pages/productOutbound/productConfirm?mode=edit' })
}
function handleCancel() {
getApp().globalData._productOutboundItems = []
uni.navigateBack()

@ -141,7 +141,7 @@
<script setup>
import { computed, ref } from 'vue'
import { onShow } from '@dcloudio/uni-app'
import { onLoad, onShow } from '@dcloudio/uni-app'
import { useI18n } from 'vue-i18n'
import NavBar from '@/components/common/NavBar.vue'
import { getWarehouseAreaSimpleList, getWarehouseSimpleList } from '@/api/mes/moldget'
@ -150,6 +150,7 @@ const { t } = useI18n()
const product = ref({})
const outMode = ref(1)
const selectedPallets = ref([])
const editingIndex = ref(null)
const warehouseOptions = ref([])
const warehouseAreaMap = ref({})
@ -166,6 +167,53 @@ const packageCount = computed(() => selectedPallets.value.reduce((sum, pallet) =
const count = computed(() => selectedPallets.value.reduce((sum, pallet) => sum + getPalletItemCountValue(pallet), 0))
const palletCode = computed(() => selectedPallets.value.map((item) => getPalletCode(item)).filter(Boolean).join(', '))
function cloneData(value) {
if (value === null || value === undefined) return value
return JSON.parse(JSON.stringify(value))
}
function buildSchemeFromItem(item) {
return {
id: item?.packagingSchemeRelationId,
packagingSchemeId: item?.packagingSchemeId,
packagingSchemeName: item?.packagingSchemeName,
packageQuantity: item?.packageQuantity,
palletPackageQuantity: item?.palletPackageQuantity,
palletTotalQuantity: item?.palletTotalQuantity,
defaultStatus: 1
}
}
function normalizeEditPallets(item) {
const source = Array.isArray(item?._selectedPallets) ? item._selectedPallets : item?.pallets
return (Array.isArray(source) ? source : []).map((pallet) => ({
...pallet,
id: pallet.id || pallet.palletId,
code: pallet.code || pallet.palletCode,
palletCode: pallet.palletCode || pallet.code,
availablePackageCount: Number(pallet.availablePackageCount ?? pallet.productCount ?? pallet.packageCount ?? 0),
productCount: Number(pallet.productCount ?? pallet.availablePackageCount ?? pallet.packageCount ?? 0),
packageCount: Number(pallet.packageCount) || 0,
warehouseId: pallet.warehouseId,
areaId: pallet.areaId
}))
}
async function hydrateEditItem(item) {
if (!item) return
const scheme = buildSchemeFromItem(item)
product.value = item._product
? cloneData(item._product)
: {
id: item.productId,
name: item.productName,
barCode: item.productBarCode,
code: item.productBarCode,
unitName: item.productUnitName,
images: item.images,
packagingSchemes: [scheme]
}
outMode.value = Number(item.outMode) === 2 ? 2 : 1
selectedPallets.value = normalizeEditPallets(item)
await loadAreasForPallets(selectedPallets.value)
}
function textValue(v) {
if (v === 0) return '0'
if (v == null) return '-'
@ -253,6 +301,9 @@ async function loadAreasForPallets(pallets) {
await Promise.all(warehouseIds.map((id) => loadAreasForWarehouse(id)))
}
function handleCancel() {
const gd = getApp().globalData
gd._productOutboundEditIndex = null
gd._productOutboundEditItem = null
uni.navigateBack()
}
function handleConfirm() {
@ -302,14 +353,35 @@ function handleConfirm() {
count: getPalletItemCountValue(pallet)
})),
images: product.value.images,
_product: { ...product.value }
_product: { ...product.value },
_selectedPallets: selectedPallets.value.map((pallet) => ({ ...pallet }))
}
const gd = getApp().globalData
if (!gd._productOutboundItems) gd._productOutboundItems = []
const index = Number(editingIndex.value)
if (Number.isInteger(index) && index >= 0 && index < gd._productOutboundItems.length) {
gd._productOutboundItems.splice(index, 1, item)
} else {
gd._productOutboundItems.push(item)
}
if (!getApp().globalData._productOutboundItems) getApp().globalData._productOutboundItems = []
getApp().globalData._productOutboundItems.push(item)
gd._productOutboundEditIndex = null
gd._productOutboundEditItem = null
uni.showToast({ title: t('productOutbound.productAdded'), icon: 'success', duration: 1000 })
setTimeout(() => uni.navigateBack(), 700)
}
onLoad(async () => {
const gd = getApp().globalData
const index = gd?._productOutboundEditIndex
const item = gd?._productOutboundEditItem
if (item && index !== null && index !== undefined) {
editingIndex.value = Number(index)
gd._productOutboundEditIndex = null
gd._productOutboundEditItem = null
await hydrateEditItem(item)
}
})
onShow(async () => {
const gd = getApp().globalData
const productResult = gd?._productOutboundProductSelectResult

Loading…
Cancel
Save