Browse Source

Revert "收货-增加组合商品扫描"

This reverts commit 718497185205b5b80187e637e2852f1dbb116dec.
zhaohuanhuan 2 tuần trước cách đây
mục cha
commit
43afc7a115

+ 0 - 100
src/views/inbound/takeDelivery/components/BarcodeCombine.vue

@@ -1,100 +0,0 @@
-<template>
-  <div class="goods">
-    <van-dialog v-model:show="goodsTrueFalseBy"
-                :beforeClose="beforeClose"
-                title="组合商品包含"
-                show-cancel-button>
-        <div style="width:100%;max-height:150px;overflow:auto">
-          <div v-for="(item,index) in matchedSkuList" :key="index">
-            <van-cell center :title="item.matchedJson.barcode" :label="item.matchedJson.skuName">
-              <template #value>
-                <div>{{ item.matchedJson.quantity }}件</div>
-                <div class="goods-tips">预期数量:{{ (item.expectedQuantity || 0) - (item.receivedQuantity || 0) }}件</div>
-              </template>
-            </van-cell>
-          </div>
-        </div>
-        <div class="goods-number">应收数量:{{ maxCount }}</div>
-        <van-field label="实收数" type="number" class="code-input" v-model="count" ref="countRef" placeholder="实收数" />
-    </van-dialog>
-  </div>
-</template>
-<script setup>
-/** 组合商品弹框 */
-import { computed, ref } from 'vue'
-import { showToast } from 'vant'
-const goodsTrueFalseBy = ref(false)
-const countRef = ref(null)
-const count = ref('')
-const props = defineProps({
-  matchedSku: { type: Array, default: () => [] },
-  container: { type: String, default: '' }
-})
-const matchedSkuList = computed(() => props.matchedSku)
-const maxCount = computed(() => {
-  const min = Math.min(
-    ...props.matchedSku.map((item) => ((item.expectedQuantity || 0) - (item.receivedQuantity || 0)) / (item.matchedJson?.quantity || 1))
-  )
-  return Number.isFinite(min) ? Math.floor(min) : 0
-})
-const show = () => {
-  count.value = ''
-  goodsTrueFalseBy.value = true
-  setTimeout(() => {
-    countRef.value?.focus()
-  }, 200)
-}
-const dataResult = (data) =>
-  data.map((item) => {
-    const { matchedJson, ...rest } = item
-    return { ...rest, quantity: matchedJson.quantity * Number(count.value), containerId: props.container }
-  })
-const emit = defineEmits(['setCombine', 'cancel'])
-const beforeClose = (action) =>
-  new Promise((resolve) => {
-    if (action === 'confirm') {
-      if (count.value == '') {
-        showToast('请输入收货数量')
-        return resolve(false)
-      }
-      if (Number(count.value) <= 0) {
-        showToast('请输入标准收货数量')
-        return resolve(false)
-      }
-      if (Number(count.value) > maxCount.value) {
-        showToast({ duration: 3000, message: '收货数量不能大于应收数量' })
-        return resolve(false)
-      }
-      const dataList = dataResult(matchedSkuList.value)
-      emit('setCombine', { dataList, count: Number(count.value) })
-    } else {
-      emit('cancel')
-    }
-    resolve(true)
-  })
-defineExpose({ show })
-</script>
-<style scoped lang="sass">
-.goods
-  .code-input
-    font-size: 16px
-    font-weight: bold
-    border-bottom: 2px solid #0077ff
-  :deep(.van-cell--center)
-    padding: 5px 20px
-  :deep(.van-cell__title)
-    text-align: left !important
-  :deep(.van-cell__value)
-    width: 40% !important
-    flex: 0 0 40% !important
-    color: #000
-  .goods-number
-    text-align: left
-    font-size: 16px
-    padding-left: 20px
-    margin-top: 5px
-  .goods-tips
-    font-size: 12px
-    text-align: right
-    color: #333
-</style>

+ 0 - 19
src/views/inbound/takeDelivery/task/hooks/barcodeCombine.js

@@ -1,19 +0,0 @@
-import { barcodeToUpperCase } from '@/utils/dataType'
-
-/** 组合商品:匹配ASN明细中条码,附加 matchedJson */
-export function receivingBarcodeCombine(asnDetailList, combineSkuMap) {
-  if (!combineSkuMap || !Array.isArray(asnDetailList) || !asnDetailList.length) return []
-  const mapUpper = Object.fromEntries(
-    Object.entries(combineSkuMap).filter(([barcode]) => barcode).map(([barcode, config]) => [barcodeToUpperCase(barcode), config])
-  )
-  return asnDetailList
-    .map((item) => {
-      const barcodes = [item.barcode, item.barcode2, item.sku].filter(Boolean)
-      const matchedBar = barcodes.find((bar) => mapUpper[barcodeToUpperCase(bar)])
-      if (!matchedBar) return null
-      const matched = mapUpper[barcodeToUpperCase(matchedBar)]
-      const remaining = (item.expectedQuantity || 0) - (item.receivedQuantity || 0)
-      return remaining >= matched.quantity ? { ...item, matchedJson: matched } : null
-    })
-    .filter(Boolean)
-}

+ 57 - 118
src/views/inbound/takeDelivery/task/index.vue

@@ -129,8 +129,6 @@
   <attribute ref="attributeRef" @set-attribute="setAttribute" />
   <!--  商品批次属性-->
   <lot-date ref="lotDateRef" @select-lot-date="selectLotDate" />
-  <!--  组合商品-->
-  <barcode-combine ref="barcodeCombineRef" @setCombine="setCombineReceiving" @cancel="onCombineCancel" :container="containerNo" :matched-sku="combineMatchedSku" />
   <!--  唯一码-->
   <unique-code-input ref="uniqueCodeRef"
                      v-model:uniqueCodeList="uniqueCodeList"
@@ -170,7 +168,6 @@ import {
   getReceivingAsnDetails,
   setProductAttribute, setReceiving,
 } from '@/api/takeDelivery/index'
-import { getListCombineSku } from '@/api/picking'
 import { closeLoading, showLoading } from '@/utils/loading'
 import { useStore } from '@/store/modules/user'
 import { showNotify, showToast } from 'vant'
@@ -178,9 +175,7 @@ import { isAttribute } from '@/views/inbound/takeDelivery/task/hooks/attribute'
 import Attribute from '@/views/inbound/takeDelivery/components/Attribute.vue'
 import LotDate from '@/views/inbound/takeDelivery/components/LotDate.vue'
 import UniqueCodeInput from '@/views/inbound/takeDelivery/components/UniqueCodeInput.vue'
-import BarcodeCombine from '@/views/inbound/takeDelivery/components/BarcodeCombine.vue'
-import { receivingBarcodeCombine } from '@/views/inbound/takeDelivery/task/hooks/barcodeCombine'
-import { barcodeToUpperCase, toMap } from '@/utils/dataType'
+import { barcodeToUpperCase, toMap } from '@/utils/dataType.js'
 import { getCurrentTime } from '@/utils/date'
 
 const router = useRouter()
@@ -193,7 +188,7 @@ try {
 }
 const warehouse = store.warehouse
 //开单任务号
-const taskNo = ref('BSSH20260318000003')
+const taskNo = ref('')
 //容器号
 const containerNo = ref('')
 //商品条码
@@ -206,8 +201,6 @@ const taskInfo = ref({ receivedQty: 0, expectedQty: 0 })
 const currentTime = ref('--')
 const scanType = ref(2)
 
-//任务号下所有asn单数据
-const allAsnDetailList=ref([])
 const type=localStorage.getItem('checkAllType')?JSON.parse(localStorage.getItem('checkAllType')):true
 const checkAllType=ref(type)
 // 页面初始化
@@ -251,9 +244,10 @@ const stopTimer = () => {
 
 const back = ref(true)
 const inputBarcodeType = ref('task')
+//输入框组件
 const inputBarcodeRef = ref(null)
 const oldSearchBarcode = ref('')
-// 任务号/容器号:code 为任务号时拉取任务及ASN明细
+// 设置容器号
 const setBarcode = (code, type) => {
   if (inputBarcodeType.value === 'lot') {
     lotData.value.forEach((lot) => {
@@ -277,6 +271,9 @@ const setBarcode = (code, type) => {
         taskNo.value=''
         taskInfo.value={}
         switchTask()
+      }else {
+        taskInfo.value=res.data
+        taskNo.value=code
       }
       containerNo.value=''
       stopTimer()
@@ -287,15 +284,11 @@ const setBarcode = (code, type) => {
         startTimer()
         containerNo.value=''
       }
+      taskInfo.value=res.data
+      taskNo.value=code
     }
-    taskInfo.value=res.data
-    taskNo.value=code
     scanType.value=2
     uniqueCodeList.value=[]
-    const params = { warehouse, asnNos: taskInfo.value?.asnNos.join(',') }
-    getReceivingAsnDetails(params).then(res => {
-      allAsnDetailList.value = res.data
-    })
     scanSuccess()
   }).catch(err=>{
     inputBarcodeRef.value?.show('', '请扫描开单任务号',err.message)
@@ -305,8 +298,9 @@ const setBarcode = (code, type) => {
     closeLoading()
   })
 }
-setBarcode('BSSH20260318000003')
+// setBarcode('BSSH20250605000006')
 
+//切换任务
 const switchTask = () => {
   inputBarcodeType.value = 'switchTask'
   back.value = false
@@ -324,19 +318,13 @@ const reset = () => {
   searchBarcode.value = ''
   oldSearchBarcode.value = ''
   uniqueCodeList.value = []
-  combineMatchedSku.value = []
-  combineAsnSelectList.value = []
-  isCombineSelectMode.value = false
-  combineReceivingData.value = []
 }
+// 选择单据
 const onDetailActive = (item) => {
-  if (isCombineSelectMode.value) {
-    _onCombineAsnSelected(item)
-    return
-  }
   asnInfo.value = item
   asnDetailsTrueFalseBy.value = false
   searchCount.value=1
+  // searchCount.value = asnInfo.value.expectedQuantity - asnInfo.value.receivedQuantity
   _getProductAttribute(item)
   _getProductLot(item)
   _getCommodityRule(item)
@@ -350,104 +338,29 @@ const onAsnCancel = () => {
 }
 const uniqueCodeList = ref([])
 
-// 组合商品
-const barcodeCombineRef = ref(null)
-const combineMatchedSku = ref([])
-const combineAsnSelectList = ref([])
-const isCombineSelectMode = ref(false)
-const combineReceivingData = ref([]) // 确认实收数后暂存,完成收货时提交
-
-// 组合商品只支持1个
-const _handleCombineProduct = (code) => {
-  showLoading()
-  getListCombineSku({ combineSku: barcodeToUpperCase(code), workEnvironment: 'receiving' }).then((res) => {
-    const _err = (msg) => { closeLoading(); scanError(); showNotify({ type: 'danger', duration: 3000, message: msg }); reset() }
-    if (!res.data?.length) return _err(`${code}-商品条码不匹配,请重新扫描`)
-    if (res.data.length > 1) return _err('不支持多商品组合商品')
-    const combineData = res.data
-    const matchedList = receivingBarcodeCombine(allAsnDetailList.value, toMap(combineData, 'barcode'))
-    if (!matchedList.length) return _err('组合商品与待收货数据不匹配,请检查组合商品配置!')
-    const asnGroupMap = matchedList.reduce((acc, detail) => {
-      const key = detail.asnNo
-      if (!acc[key]) acc[key] = { asnNo: detail.asnNo, customerId: detail.customerId, expectedQuantity: 0, list: [] }
-      acc[key].list.push(detail)
-      acc[key].expectedQuantity += (detail.expectedQuantity || 0) - (detail.receivedQuantity || 0)
-      return acc
-    }, {})
-    const asnOptions = Object.values(asnGroupMap)
-    if (asnOptions.length > 1) {
-      isCombineSelectMode.value = true
-      combineAsnSelectList.value = asnOptions
-      combineMatchedSku.value = matchedList
-      asnDetailsList.value = asnOptions.map((opt) => ({ asnNo: opt.asnNo, customerId: opt.customerId, expectedQuantity: opt.expectedQuantity }))
-      asnDetailsTrueFalseBy.value = true
-    } else {
-      _showCombineDialog(matchedList)
-    }
-    closeLoading()
-    scanSuccess()
-  }).catch(() => { closeLoading(); scanError() })
-}
-
-const _showCombineDialog = (matchedList) => {
-  combineMatchedSku.value = matchedList
-  asnInfo.value = matchedList[0]
-  _getProductAttribute(matchedList[0])
-  _getProductLot(matchedList[0])
-  _getCommodityRule(matchedList[0])
-  barcodeCombineRef.value?.show()
-}
-
-// 组合商品取消:收货数量=1套总件数
-const onCombineCancel = () => {
-  const total = combineMatchedSku.value.reduce((sum, row) => sum + (row.matchedJson?.quantity || 0), 0)
-  searchCount.value = total ? String(total) : '1'
-  combineReceivingData.value = []
-}
-
-const _onCombineAsnSelected = (item) => {
-  const selected = combineAsnSelectList.value.find((opt) => opt.asnNo === item.asnNo)
-  if (selected?.list) _showCombineDialog(selected.list)
-  asnDetailsTrueFalseBy.value = isCombineSelectMode.value = false
-  combineAsnSelectList.value = []
-}
-
-// 组合商品确认实收数
-const setCombineReceiving = ({ dataList }) => {
-  if (!dataList?.length) return
-  const total = dataList.reduce((sum, row) => sum + (row.quantity || 0), 0)
-  searchCount.value = String(total)
-  combineReceivingData.value = dataList
-  showNotify({ type: 'success', duration: 2000, message: `已填入收货数量:${total},请点击完成收货提交` })
-}
-
-// 条码扫描:scanType 2商品/4数量/3唯一码/5容器
+// 扫描条码监听
 const _handlerScan = (code) => {
   if (scanType.value == 2) {
     searchBarcode.value = code
     oldSearchBarcode.value = code
-      if ( allAsnDetailList.value.length > 0) {
-        const upperCode = barcodeToUpperCase(code) || ''
-        const clientMatched = allAsnDetailList.value.filter((detail) => {
-          const bars = [detail.barcode, detail.barcode2, detail.sku].filter(Boolean)
-          return bars.some((bar) => bar && barcodeToUpperCase(bar) === upperCode)
-        })
-        asnDetailsList.value = clientMatched
-      }
+    const params = { warehouse, barcode: code, asnNos: taskInfo.value?.asnNos.join(',') }
+    showLoading()
+    getReceivingAsnDetails(params).then(res => {
       uniqueCodeList.value=[]
-
-      if (asnDetailsList.value.length > 0) {
+      asnDetailsList.value = res.data
+      if (res.data.length > 0) {
         scanSuccess()
         closeLoading()
-        if (asnDetailsList.value.length == 1) {
-          const item = asnDetailsList.value[0]
+        if (res.data.length == 1) {
+          const item = res.data[0]
           asnInfo.value = item
-          searchCount.value = 1
+          // searchCount.value = item.expectedQuantity - item.receivedQuantity
+          searchCount.value=1
           _getProductAttribute(item)
           _getProductLot(item)
           _getCommodityRule(item)
         }
-        if (asnDetailsList.value.length > 1) {
+        if (res.data.length > 1) {
           asnInfo.value = {}
           lotData.value = []
           searchCount.value = ''
@@ -455,14 +368,21 @@ const _handlerScan = (code) => {
           asnDetailsTrueFalseBy.value = true
         }
       } else {
-        _handleCombineProduct(code)
+        scanError()
+        showNotify({ type: 'danger', duration: 3000, message: `暂未查询到条码《${code}》信息请重试` })
+        reset()
+        closeLoading()
       }
+    }).catch(() => {
+      scanError()
+      closeLoading()
+    })
   } else if (scanType.value == 3) {
     if (code) {
       const uniqueCodeScanType = uniqueCodeRef.value?.uniqueCodeScanType
       if (checkAllType.value && uniqueCodeScanType === 'barcode') {
         const barcode = Array.from(new Set([asnInfo.value.barcode, asnInfo.value.barcode2, asnInfo.value.sku].filter(Boolean)));
-        if (barcode.some((bar) => barcodeToUpperCase(bar) === barcodeToUpperCase(code))) {
+        if (barcode.some(item => barcodeToUpperCase(item) === barcodeToUpperCase(code))) {
           scanSuccess();
           uniqueCodeRef.value.uniqueCodeScanType = 'unique'
           uniqueCodeRef.value.uniqueBarcode = code
@@ -508,7 +428,9 @@ const _handlerScan = (code) => {
     scanType.value=2
   }
 }
-// 物理属性
+/**
+ * 物理属性
+ */
 const attributeRef = ref(null)
 const attributeMap = ref({})
 const attributeTrueFalseBy = ref(true)
@@ -539,8 +461,14 @@ const setAttribute = (data) => {
     scanError()
   })
 }
+/**
+ * 物理属性 end
+ */
 
-// 批次属性
+/**
+ * 商品批次属性
+ */
+// 获取商品批次属性
 const lotData = ref([])
 const _getProductLot = (item) => {
   const params = { warehouse: item.warehouse, owner: item.customerId, barcode: item.sku }
@@ -646,7 +574,12 @@ const selectLotDate = (date) => {
   inputBarcodeType.value = 'task'
 }
 
-// 唯一码
+/**
+ * 商品批次属性end
+ */
+/**
+ * 唯一码
+ */
 const uniqueCodeRef = ref(null)
 //规则列表
 const uniqueRuleList = ref([])
@@ -666,9 +599,12 @@ const _getCommodityRule = (item) => {
     uniqueRuleMap.value = toMap(res.data, 'type', 'uniqueRegExp')
   })
 }
+/**
+ * 唯一码end
+ */
 const containerNoRef = ref(null)
 const numberRef = ref(null)
-// 完成收货前校验
+// 完成收货校验
 const isCheck = () => {
   if (!asnInfo.value.asnNo) {
     scanError()
@@ -744,7 +680,7 @@ const isCheck = () => {
   }
   return true
 }
-// 完成收货
+// 收货
 const onConfirm = () => {
   if(isCheck()){
     const lotMap = toMap(lotData.value, 'field', 'mapping')
@@ -787,6 +723,9 @@ const loadData = () => {
   if (!taskNo.value) {
     inputBarcodeRef.value?.show('', '请扫描开单任务号','')
     return
+  } else {
+    // currentTime.value=getCurrentTime()
+    // startTimer()
   }
 }
 onUnmounted(() => {