Admin
13 小时以前 c99808261b1b1460d22a7f7db5955a65080c3b4b
ÏîÄ¿´úÂë/WMS/WIDESEA_WMSServer/WIDESEA.Services/Services/Inbound/Partial/Dt_boxing_headService.cs
@@ -6,31 +6,32 @@
*用户信息、权限、角色等使用UserContext.Current操作
*Dt_boxing_headService对增、删、改查、导入、导出、审核业务代码扩展参照ServiceFunFilter
*/
using WIDESEA.Core.BaseProvider;
using WIDESEA.Core.Extensions.AutofacManager;
using WIDESEA.Entity.DomainModels;
using System.Linq;
using WIDESEA.Core.Utilities;
using System.Linq.Expressions;
using WIDESEA.Core.Extensions;
using Microsoft.AspNetCore.Http;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.AspNetCore.Http;
using WIDESEA.Services.IRepositories;
using Newtonsoft.Json;
using System.Text;
using System.Net;
using System.IO;
using System;
using WIDESEA.Services.Repositories;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Linq.Expressions;
using System.Net;
using System.Text;
using System.Threading;
using WIDESEA.Common;
using WIDESEA_Services;
using WIDESEA.Core.Services;
using WIDESEA.Core.BaseProvider;
using WIDESEA.Core.Enums;
using WIDESEA.Core.Extensions;
using WIDESEA.Core.Extensions.AutofacManager;
using WIDESEA.Core.ManageUser;
using System.Collections.Generic;
using WIDESEA.Core.Services;
using WIDESEA.Core.Utilities;
using WIDESEA.Entity.DomainModels;
using WIDESEA.Services.IRepositories;
using WIDESEA.Services.Repositories;
using WIDESEA.Services.Services.ToMes;
using WIDESEA_Common.LogEnum;
using WIDESEA_Services;
namespace WIDESEA.Services.Services
{
@@ -144,11 +145,51 @@
                    //newBoxDetail.boxdtl_text1 = 
                    //获取空货位
                    Dt_locationinfo emptyLocation;
                    int maxRetries = 20;
                    int retryCount = 0;
                    bool needRetry;
                    do
                    {
                        needRetry = false;  // é»˜è®¤ä¸éœ€è¦é‡è¯•
                        retryCount++;
                        //获取空货位
                        emptyLocation = CommonFunction.GetEmptyLocationAction(1);
                        if (emptyLocation == null)
                        {
                            return content.Error("无法获取库位");
                        }
                        // 2. æ£€æŸ¥åº“å­˜
                        if (IsEmptyPalletLocation(emptyLocation.location_id))
                        {
                            needRetry = true;
                            continue;  // ç›´æŽ¥è¿›å…¥ä¸‹ä¸€æ¬¡å¾ªçŽ¯ï¼ˆé‡è¯•ï¼‰
                        }
                        // 3. æ£€æŸ¥ä»»åŠ¡
                        if (Dt_taskinfoRepository.Instance.Find(x => x.task_endstation == emptyLocation.location_id).FirstOrDefault() != null)
                        {
                            needRetry = true;
                            continue;
                        }
                    } while (needRetry && retryCount < maxRetries);
                    // æ£€æŸ¥æ˜¯å¦è¶…过最大重试次数
                    if (retryCount >= maxRetries)
                    {
                        return content.Error($"无法找到可用库位(已尝试 {retryCount} æ¬¡ï¼‰");
                    }
                    LogRecord.WriteLog((int)LogEnum.InBound, $"托盘条码:{rfid},分配的货位号{emptyLocation.location_id},货位状态:{emptyLocation.location_state}");
                    Dt_boxing_headRepository.Instance.Add(newBoxHead, true);
                    Dt_boxing_detailRepository.Instance.Add(newBoxDetail, true);
                    //获取空货位
                    Dt_locationinfo emptyLocation = CommonFunction.GetEmptyLocationAction();
                    //获取任务
                    Dt_taskinfo tmpTaskInfo = CommonFunction.AddWMSTask_BoxPalletIn(emptyLocation,
                                   rfid, mesInfo.mesInfo_carType, mesInfo.mesInfo_qrCode,"");
@@ -171,6 +212,34 @@
            }
             Logger.AddLog(LoggerType.Add, saveModel, content, content);
            return content;
        }
        /// <summary>
        /// æ£€æŸ¥æŒ‡å®šè´§ä½æ˜¯å¦ä¸ºç©ºæ‰˜ç›˜è´§ä½
        /// </summary>
        /// <param name="locationId">货位ID</param>
        /// <returns>true: æ˜¯ç©ºæ‰˜ç›˜è´§ä½, false: ä¸æ˜¯ç©ºæ‰˜ç›˜è´§ä½</returns>
        public bool IsEmptyPalletLocation(string locationId)
        {
            try
            {
                // æŸ¥è¯¢ç©ºæ‰˜ç›˜è´§ä½ä¿¡æ¯
                var emptyPalletLocation = VV_ContainerInfo_EmptyPalletRepository.Instance
                    .Find(x => x.location_id == locationId).FirstOrDefault();
                // æŸ¥è¯¢è´§ä½ä¸Šçš„容器信息
                var containerInfo = VV_ContainerInfoRepository.Instance
                    .Find(x => x.location_id == locationId).FirstOrDefault();
                bool isEmptyPallet = emptyPalletLocation != null || containerInfo != null;
                return isEmptyPallet;
            }
            catch (Exception ex)
            {
                LogRecord.WriteLog((int)LogEnum.Errer, $"检查空托盘货位失败,货位ID:{locationId},错误:{ex.Message}");
                return false;
            }
        }
@@ -197,9 +266,56 @@
                VV_ContainerInfo_EmptyPallet emptyCon = VV_ContainerInfo_EmptyPalletRepository.Instance.FindFirst(x => x.containerhead_barcode == barcode);
                if (emptyCon != null)
                    throw new Exception($"库存中存在托盘号:【{barcode}】的【空托】库存,请人工核实,所在货位:{emptyCon.location_id}");
                //获取空货位
                Dt_locationinfo emptyLocation;
                //说明是空托入库
                Dt_locationinfo emptyLocation = CommonFunction.GetEmptyLocationAction();
                int maxRetries = 20;
                int retryCount = 0;
                bool needRetry;
                do
                {
                    needRetry = false;  // é»˜è®¤ä¸éœ€è¦é‡è¯•
                    retryCount++;
                    //获取空货位
                    emptyLocation = CommonFunction.GetEmptyLocationAction(1);
                    if (emptyLocation == null)
                    {
                        return content.Error("无法获取库位");
                    }
                    // 2. æ£€æŸ¥åº“å­˜
                    if (IsEmptyPalletLocation(emptyLocation.location_id))
                    {
                        needRetry = true;
                        continue;  // ç›´æŽ¥è¿›å…¥ä¸‹ä¸€æ¬¡å¾ªçŽ¯ï¼ˆé‡è¯•ï¼‰
                    }
                    // 3. æ£€æŸ¥ä»»åŠ¡
                    if (Dt_taskinfoRepository.Instance.Find(x => x.task_endstation == emptyLocation.location_id).FirstOrDefault() != null)
                    {
                        needRetry = true;
                        continue;
                    }
                } while (needRetry && retryCount < maxRetries);
                // æ£€æŸ¥æ˜¯å¦è¶…过最大重试次数
                if (retryCount >= maxRetries)
                {
                    return content.Error($"无法找到可用库位(已尝试 {retryCount} æ¬¡ï¼‰");
                }
                LogRecord.WriteLog((int)LogEnum.InBound, $"托盘条码:{barcode},分配的货位号{emptyLocation.location_id},货位状态:{emptyLocation.location_state}");
                VV_ContainerInfo_EmptyPallet SelectLocation = VV_ContainerInfo_EmptyPalletRepository.Instance.FindFirst(x => x.location_id == emptyLocation.location_id);
                VV_ContainerInfo conInfohw = VV_ContainerInfoRepository.Instance.FindFirst(x => x.location_id == emptyLocation.location_id);
                if (SelectLocation != null || conInfohw != null)
                {
                    LogRecord.WriteLog((int)LogEnum.InBound, $"分配的货位已有货,货位号{emptyLocation.location_id}");
                    throw new Exception($"分配的货位已有货,货位号{SelectLocation.location_id}");
                }
                //在此处生成WMS任务和下发WCS任务---------空托入库
                Dt_taskinfo tmpTaskInfo = null;
                content = Dt_taskinfoRepository.Instance.DbContextBeginTransaction(() =>