heshaofeng
2026-02-02 deb12fd2b06ccc821104aa475a8fb784c39dfb2c
添加音频播放和优化调拨明细查询方法
已添加2个文件
已修改3个文件
145 ■■■■ 文件已修改
项目代码/WIDESEA_WMSClient/src/assets/audio/error.mp3 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WIDESEA_WMSClient/src/assets/audio/success.mp3 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WIDESEA_WMSClient/src/extension/inbound/extend/Pallet.vue 88 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WIDESEA_WMSClient/src/views/inbound/allocateinboundOrder.vue 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS无仓储版/WIDESEA_WMSServer/WIDESEA_AllocateService/AllocateService.cs 50 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ÏîÄ¿´úÂë/WIDESEA_WMSClient/src/assets/audio/error.mp3
Binary files differ
ÏîÄ¿´úÂë/WIDESEA_WMSClient/src/assets/audio/success.mp3
Binary files differ
ÏîÄ¿´úÂë/WIDESEA_WMSClient/src/extension/inbound/extend/Pallet.vue
@@ -218,6 +218,15 @@
      isSubmitting: false,
      palletGroupedBarcodes: {},
      // éŸ³é¢‘配置
      audioConfig: {
        successPath: '/assets/audio/success.mp3', // å¯¹åº” public ä¸‹çš„路径
        errorPath: '/assets/audio/error.mp3'
     },
      // ç¼“存音频实例,避免重复创建
      successAudio: null,
      errorAudio: null,
      totalStockSum: 0,
      totalStockCount: 0,
      uniqueUnit: '',
@@ -337,9 +346,84 @@
    // ç¡®ä¿ç»„件销毁时移除监听
    this.removeKeyPressListener();
    this.clearAllTimers();
     this.removeKeyPressListener();
     this.clearAllTimers();
   //销毁音频实例
    this.successAudio = null;
    this.errorAudio = null;
  },
  
  methods: {
    /**
   * åˆå§‹åŒ–音频实例(懒加载,只创建一次)
   * @param {String} type - éŸ³é¢‘类型:success/error
   * @returns {Audio} éŸ³é¢‘实例
   */
  initAudioInstance(type) {
    if (type === 'success' && this.successAudio) {
      return this.successAudio;
    }
    if (type === 'error' && this.errorAudio) {
      return this.errorAudio;
    }
    const audioPath = type === 'success'
      ? this.audioConfig.successPath
      : this.audioConfig.errorPath;
    const audioInstance = new Audio(audioPath);
    // ç¼“存音频实例
    if (type === 'success') {
      this.successAudio = audioInstance;
    } else {
      this.errorAudio = audioInstance;
    }
    // éŸ³é¢‘加载失败回调(可选,用于调试)
    audioInstance.onerror = (err) => {
      console.error(`【${type} éŸ³é¢‘】加载失败`, err);
    };
    return audioInstance;
  },
  /**
   * æ’­æ”¾éŸ³é¢‘
   * @param {String} type - éŸ³é¢‘类型:success/error
   */
  playAudio(type) {
    try {
      const audioInstance = this.initAudioInstance(type);
      // é‡ç½®æ’­æ”¾è¿›åº¦ï¼ˆé¿å…é‡å¤æ’­æ”¾æ—¶éŸ³é¢‘未结束)
      audioInstance.currentTime = 0;
      // æ’­æ”¾éŸ³é¢‘(返回 Promise å¤„理播放结果,兼容部分浏览器限制)
      audioInstance.play().catch((err) => {
        console.warn('音频播放失败(可能是浏览器自动播放策略限制)', err);
      });
    } catch (err) {
      console.error('播放音频时发生异常', err);
    }
  },
  /**
   * æ’­æ”¾æˆåŠŸéŸ³é¢‘
   */
  playSuccessAudio() {
    this.playAudio('success');
  },
  /**
   * æ’­æ”¾å¤±è´¥éŸ³é¢‘
   */
  playErrorAudio() {
    this.playAudio('error');
  },
    // æ·»åŠ é”®ç›˜äº‹ä»¶ç›‘å¬
    addKeyPressListener() {
      if (!this.keyPressListenerAdded) {
@@ -717,6 +801,7 @@
        this.error = `条码 ${currentBarcode} å·²è¢«å½“前托盘组盘,请勿重复操作`;
        this.barcode = '';
        this.focusBarcodeInput();
        this.playErrorAudio();
        return;
      }
@@ -726,6 +811,7 @@
        .then(valid => {
          if (!valid) {
            this.isSubmitting = false;
            this.playErrorAudio();
            return;
          }
          
@@ -792,6 +878,8 @@
          this.scanCode = '';
          this.isScanning = false;
          this.playSuccessAudio();
          setTimeout(() => {
            this.focusBarcodeInput();
          }, 100);
ÏîÄ¿´úÂë/WIDESEA_WMSClient/src/views/inbound/allocateinboundOrder.vue
@@ -339,6 +339,13 @@
          bind: { key: "orderDetailStatusEnum", data: [] },
        },
        {
          field: "pallet",
          title: "已组托盘号",
          type: "string",
          width: 180,
          align: "left",
        },
        {
          field: "creater",
          title: "创建人",
          type: "string",
ÏîÄ¿´úÂë/WMSÎÞ²Ö´¢°æ/WIDESEA_WMSServer/WIDESEA_AllocateService/AllocateService.cs
@@ -666,7 +666,6 @@
        public override PageGridData<Dt_InboundOrderDetail> GetDetailPage(PageDataOptions options)
        {
            string wheres = ValidatePageOptions(options);
            //获取排序字段
            Dictionary<string, SqlSugar.OrderByType> orderbyDic = GetPageDataSort(options, TProperties);
            List<OrderByModel> orderByModels = new List<OrderByModel>();
            foreach (var item in orderbyDic)
@@ -679,7 +678,6 @@
                orderByModels.Add(orderByModel);
            }
            int totalCount = 0;
            List<SearchParameters> searchParametersList = new List<SearchParameters>();
            if (!string.IsNullOrEmpty(options.Wheres))
@@ -691,35 +689,41 @@
                }
                catch { }
            }
            //var data = BaseDal.Db.Queryable<Dt_AllocateOrderDetail>()
            //    .WhereIF(!wheres.IsNullOrEmpty(), wheres)
            //    .OrderBy(orderByModels)
            //    .ToPageList(options.Page, options.Rows, ref totalCount);
            //Dt_AllocateOrder allocateOrder = _allocateOrderRepository.QueryFirst(x => x.Id == (int)options.Value);
            //Dt_InboundOrder _InboundOrder = SqlSugarHelper.DbWMS.Queryable<Dt_InboundOrder>().Where(x => x.UpperOrderNo == allocateOrder.UpperOrderNo).First();
            //var details = _inboundOrderDetailRepository.QueryData(x => x.OrderId == _InboundOrder.Id );
            //foreach (var item in data)
            //{
            //    var detail = details.Where(x => x.MaterielCode == item.MaterielCode).FirstOrDefault();
            //    if (detail != null)
            //    {
            //        item.OrderQuantity = detail.OrderQuantity;
            //        item.ReceiptQuantity = detail.ReceiptQuantity;
            //        item.OverInQuantity = detail.OverInQuantity;
            //        item.OrderDetailStatus = detail.OrderDetailStatus;
            //    }
            //}
            //return new PageGridData<Dt_AllocateOrderDetail>(totalCount, data);
            Dt_AllocateOrder allocateOrder = _allocateOrderRepository.QueryFirst(x => x.Id == (int)options.Value);
            Dt_InboundOrder _InboundOrder = SqlSugarHelper.DbWMS.Queryable<Dt_InboundOrder>().Where(x => x.UpperOrderNo == allocateOrder.UpperOrderNo).First();
            var Id = _InboundOrder == null ? 0 : _InboundOrder.Id;
            var data = BaseDal.Db.Queryable<Dt_InboundOrderDetail>()
                .WhereIF(!wheres.IsNullOrEmpty(), wheres)
                .Where( x => x.OrderId == Id)
                .WhereIF(!string.IsNullOrEmpty(wheres), wheres)
                .Where(x => x.OrderId == Id)
                .OrderBy(orderByModels)
                .ToPageList(options.Page, options.Rows, ref totalCount);
            foreach (var detail in data)
            {
                if (string.IsNullOrEmpty(detail.Barcode))
                {
                    detail.Pallet = string.Empty;
                    continue;
                }
                var stockDetail = BaseDal.Db.Queryable<Dt_StockInfoDetail>()
                    .Where(sd => sd.Barcode == detail.Barcode)
                    .First();
                if (stockDetail == null || stockDetail.StockId <= 0)
                {
                    detail.Pallet = string.Empty;
                    continue;
                }
                var stock = BaseDal.Db.Queryable<Dt_StockInfo>()
                    .Where(s => s.Id == stockDetail.StockId)
                    .First();
                detail.Pallet = stock == null ? string.Empty : stock.PalletCode;
            }
            return new PageGridData<Dt_InboundOrderDetail>(totalCount, data);
        }