wangxinhui
2026-03-06 65a231315d1dcc35d2996106d36e9cca9aba6ce6
更新码垛分配工位优化,老厂退库称重上报设定差异范围
已修改8个文件
249 ■■■■■ 文件已修改
项目代码/WCS/WCSServices/WIDESEAWCS_Model/Models/PackInfo/Dt_StationPackInfo.cs 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WCS/WCSServices/WIDESEAWCS_TaskInfoService/PackaxisTaskService.cs 187 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WCS/WCSServices/WIDESEAWCS_Tasks/成品仓/ConveyorLineJob_CPH.cs 10 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSServices/WIDESEA_TaskInfoService/TaskService.cs 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSServices/WIDESEA_TaskInfoService/TaskService_Inbound.cs 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSServices/WIDESEA_TaskInfoService/TaskService_Outbound.cs 38 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSServices/WIDESEA_WMSServer/appsettings.json 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目资料/通信协议/二楼环线20250715.xlsx 补丁 | 查看 | 原始文档 | blame | 历史
ÏîÄ¿´úÂë/WCS/WCSServices/WIDESEAWCS_Model/Models/PackInfo/Dt_StationPackInfo.cs
@@ -78,6 +78,12 @@
        public int ExecutingNum { get; set; }
        /// <summary>
        /// æŽ’序
        /// </summary>
        [SugarColumn(IsNullable = true, ColumnDescription = "排序")]
        public int OrderIndex { get; set; }
        /// <summary>
        /// ç åž›å·²å®Œæˆæ•°é‡
        /// </summary>
        [SugarColumn(IsNullable = false, ColumnDescription = "码垛已完成数量")]
ÏîÄ¿´úÂë/WCS/WCSServices/WIDESEAWCS_TaskInfoService/PackaxisTaskService.cs
@@ -1,4 +1,5 @@
using Newtonsoft.Json;
using SqlSugar;
using System;
using System.Collections.Generic;
using System.ComponentModel;
@@ -39,6 +40,7 @@
            _stationMangerRepository = stationMangerRepository;
            _unitOfWorkManage = unitOfWorkManage;
        }
        private static object lock_reqPackTask = new object();
        /// <summary>
        /// åˆ†é…ç åž›ä»»åŠ¡
        /// </summary>
@@ -47,103 +49,106 @@
        /// <returns></returns>
        public WebResponseContent ReqPackTask(string barCode,string deviceCode)
        {
            WebResponseContent content= new WebResponseContent();
            try
            lock (lock_reqPackTask)
            {
                Dt_Packinfo packinfo = _packinfoRepository.QueryFirst(x=>x.BarCode==barCode && x.PackStatus==StationOccupiedEnum.None.ObjToInt());
                if (packinfo==null)
                WebResponseContent content = new WebResponseContent();
                try
                {
                    return content.Error($"未找到条码{barCode}");
                }
                List<Dt_StationPackInfo> stationPackInfos = _stationPackInfoRepository.QueryData();
                Dt_StationPackInfo? stationPackInfo=stationPackInfos.FirstOrDefault(x=>x.PackType==packinfo.PackType && x.OrderNo==packinfo.OrderNo && x.AssignNum<x.PackNum);
                //如果订单相同、垛型一致并且分配数量少于码垛结托数量则分配到一起
                if (stationPackInfo!=null)
                {
                    Dt_PackaxisTask packaxisTask = new Dt_PackaxisTask()
                    Dt_Packinfo packinfo = _packinfoRepository.QueryFirst(x => x.BarCode == barCode && x.PackStatus == StationOccupiedEnum.None.ObjToInt());
                    if (packinfo == null)
                    {
                        DeviceCode=deviceCode,
                        SourceAddress= "2421",
                        BarCode=barCode,
                        CurrentAddress= "2421",
                        TargetAddress=stationPackInfo.StationCode,
                        NextAddress=stationPackInfo.LineCode,
                        TaskState =TaskStatusEnum.Line_Executing.ObjToInt(),
                        PackLength=packinfo.Length,
                        PackWidth=packinfo.Width,
                        PackHeight=packinfo.Height,
                        PackType=packinfo.PackType,
                        Dispatchertime=DateTime.Now,
                    };
                    stationPackInfo.AssignNum += 1;
                    stationPackInfo.ExecutingNum += 1;
                    packinfo.PackStatus = StationOccupiedEnum.Sure.ObjToInt();
                    _unitOfWorkManage.BeginTran();
                    //更新码垛执行工位
                    _stationPackInfoRepository.UpdateData(stationPackInfo);
                    //更新待码垛信息表
                    _packinfoRepository.UpdateData(packinfo);
                    //添加码垛任务
                    BaseDal.AddData(packaxisTask);
                    _unitOfWorkManage.CommitTran();
                    return content.OK(barCode, packaxisTask);
                }
                else//分配新工位
                {
                    //获取当前空盘准备的码垛工位
                    List<string> stations = _stationMangerRepository.QueryData(x => x.StationDeviceCode == "CLC_CP" && x.IsOccupied == StationOccupiedEnum.None.ObjToInt()).Select(x => x.StationCode).ToList();
                    //获取码垛配置表查询有配置的码垛工位
                    List<Dt_Packaxis> packaxes = _packaxisRepository.QueryData(x => x.PackType == packinfo.PackType);
                    if (packaxes.Count==0)
                    {
                        return content.Error("未找到码垛坐标配置");
                        return content.Error($"未找到条码{barCode}");
                    }
                    List<string> packStations = packaxes.Select(x => x.StationCode).ToList();
                    Dt_StationPackInfo? packInfoAssign = stationPackInfos.Where(x => x.PackType == 0 && x.AssignNum == 0 && stations.Contains(x.StationCode) && packStations.Contains(x.StationCode)).OrderByDescending(x => x.StationCode).FirstOrDefault();
                    if (packInfoAssign == null)
                    List<Dt_StationPackInfo> stationPackInfos = _stationPackInfoRepository.QueryData();
                    Dt_StationPackInfo? stationPackInfo = stationPackInfos.FirstOrDefault(x => x.PackType == packinfo.PackType && x.OrderNo == packinfo.OrderNo && x.AssignNum < x.PackNum);
                    //如果订单相同、垛型一致并且分配数量少于码垛结托数量则分配到一起
                    if (stationPackInfo != null)
                    {
                        return content.Error("未找到可分配垛位");
                        Dt_PackaxisTask packaxisTask = new Dt_PackaxisTask()
                        {
                            DeviceCode = deviceCode,
                            SourceAddress = "2421",
                            BarCode = barCode,
                            CurrentAddress = "2421",
                            TargetAddress = stationPackInfo.StationCode,
                            NextAddress = stationPackInfo.LineCode,
                            TaskState = TaskStatusEnum.Line_Executing.ObjToInt(),
                            PackLength = packinfo.Length,
                            PackWidth = packinfo.Width,
                            PackHeight = packinfo.Height,
                            PackType = packinfo.PackType,
                            Dispatchertime = DateTime.Now,
                        };
                        stationPackInfo.AssignNum += 1;
                        stationPackInfo.ExecutingNum += 1;
                        packinfo.PackStatus = StationOccupiedEnum.Sure.ObjToInt();
                        _unitOfWorkManage.BeginTran();
                        //更新码垛执行工位
                        _stationPackInfoRepository.UpdateData(stationPackInfo);
                        //更新待码垛信息表
                        _packinfoRepository.UpdateData(packinfo);
                        //添加码垛任务
                        BaseDal.AddData(packaxisTask);
                        _unitOfWorkManage.CommitTran();
                        return content.OK(barCode, packaxisTask);
                    }
                    packInfoAssign.PackType = packinfo.PackType;
                    packInfoAssign.OrderNo = packinfo.OrderNo;
                    packInfoAssign.MakeCode = packinfo.MakeCode;
                    packInfoAssign.MaterielCode = packInfoAssign.MaterielCode;
                    packInfoAssign.PackNum = packaxes.FirstOrDefault(x=>x.StationCode== packInfoAssign.StationCode).PackNum;
                    Dt_PackaxisTask packaxisTask = new Dt_PackaxisTask()
                    else//分配新工位
                    {
                        DeviceCode = deviceCode,
                        SourceAddress = "2421",
                        BarCode = barCode,
                        CurrentAddress = "2421",
                        TargetAddress = packInfoAssign.StationCode,
                        NextAddress = packInfoAssign.LineCode,
                        TaskState = TaskStatusEnum.Line_Executing.ObjToInt(),
                        PackLength = packinfo.Length,
                        PackWidth = packinfo.Width,
                        PackHeight = packinfo.Height,
                        PackType = packinfo.PackType,
                        Dispatchertime = DateTime.Now,
                    };
                    packInfoAssign.AssignNum += 1;
                    packInfoAssign.ExecutingNum += 1;
                    packinfo.PackStatus = StationOccupiedEnum.Sure.ObjToInt();
                    _unitOfWorkManage.BeginTran();
                    //更新码垛执行工位
                    _stationPackInfoRepository.UpdateData(packInfoAssign);
                    //更新待码垛信息表
                    _packinfoRepository.UpdateData(packinfo);
                    //添加码垛任务
                    BaseDal.AddData(packaxisTask);
                    _unitOfWorkManage.CommitTran();
                    return content.OK(barCode, packaxisTask);
                        //获取当前空盘准备的码垛工位
                        List<string> stations = _stationMangerRepository.QueryData(x => x.StationDeviceCode == "CLC_CP" && x.IsOccupied == StationOccupiedEnum.None.ObjToInt()).Select(x => x.StationCode).ToList();
                        //获取码垛配置表查询可分配并已配置的码垛工位
                        List<Dt_Packaxis> packaxes = _packaxisRepository.QueryData(x => x.PackType == packinfo.PackType && stations.Contains(x.StationCode));
                        if (packaxes.Count == 0)
                        {
                            return content.Error("未找到可分配码垛配置");
                        }
                        List<string> packStations = packaxes.Select(x => x.StationCode).ToList();
                        Dt_StationPackInfo? packInfoAssign = stationPackInfos.Where(x => x.PackType == 0 && x.AssignNum == 0 && packStations.Contains(x.StationCode)).OrderBy(x => x.OrderIndex).FirstOrDefault();
                        if (packInfoAssign == null)
                        {
                            return content.Error("未找到可分配垛位");
                        }
                        packInfoAssign.PackType = packinfo.PackType;
                        packInfoAssign.OrderNo = packinfo.OrderNo;
                        packInfoAssign.MakeCode = packinfo.MakeCode;
                        packInfoAssign.MaterielCode = packInfoAssign.MaterielCode;
                        packInfoAssign.PackNum = packaxes.FirstOrDefault(x => x.StationCode == packInfoAssign.StationCode).PackNum;
                        Dt_PackaxisTask packaxisTask = new Dt_PackaxisTask()
                        {
                            DeviceCode = deviceCode,
                            SourceAddress = "2421",
                            BarCode = barCode,
                            CurrentAddress = "2421",
                            TargetAddress = packInfoAssign.StationCode,
                            NextAddress = packInfoAssign.LineCode,
                            TaskState = TaskStatusEnum.Line_Executing.ObjToInt(),
                            PackLength = packinfo.Length,
                            PackWidth = packinfo.Width,
                            PackHeight = packinfo.Height,
                            PackType = packinfo.PackType,
                            Dispatchertime = DateTime.Now,
                        };
                        packInfoAssign.AssignNum += 1;
                        packInfoAssign.ExecutingNum += 1;
                        packinfo.PackStatus = StationOccupiedEnum.Sure.ObjToInt();
                        _unitOfWorkManage.BeginTran();
                        //更新码垛执行工位
                        _stationPackInfoRepository.UpdateData(packInfoAssign);
                        //更新待码垛信息表
                        _packinfoRepository.UpdateData(packinfo);
                        //添加码垛任务
                        BaseDal.AddData(packaxisTask);
                        _unitOfWorkManage.CommitTran();
                        return content.OK(barCode, packaxisTask);
                    }
                }
                catch (Exception ex)
                {
                    _unitOfWorkManage.RollbackTran();
                    content.Error(ex.Message);
                }
                return content;
            }
            catch (Exception ex)
            {
                _unitOfWorkManage.RollbackTran();
                content.Error(ex.Message);
            }
            return content;
        }
        /// <summary>
        /// ç åž›ç»“托并上传码垛工位码垛明细数据
@@ -247,4 +252,10 @@
            }
        }
    }
    public class MDCount
    {
        public string MDNo { get; set; }
        public int Count { get; set; }
    }
}
ÏîÄ¿´úÂë/WCS/WCSServices/WIDESEAWCS_Tasks/³ÉÆ·²Ö/ConveyorLineJob_CPH.cs
@@ -97,7 +97,7 @@
                                    {
                                        shouldRestart = false;
                                        Dt_StationManger? RequestIn = stationMangers.FirstOrDefault(x => x.StationDeviceCode == device.DeviceCode && x.StationType == StationTypeEnum.StationType_OnlyInbound.ObjToInt());
                                        WriteError($"线程 {Thread.CurrentThread.ManagedThreadId}","开始执行");
                                        WriteInfo($"线程 {Thread.CurrentThread.ManagedThreadId}分垛口","开始执行");
                                        while (true)
                                        {
                                            if (RequestIn != null)
@@ -111,7 +111,7 @@
                                                    if (conveyorLineInfoRead != null && (conveyorLineInfoRead.R_State == 2 || conveyorLineInfoRead.R_State == 3) && conveyorLineInfoRead.R_TaskNo <= 0 && !string.IsNullOrEmpty(conveyorLineInfoRead.R_BoxCode) && conveyorLineInfoRead.R_Request == 1)
                                                    {
                                                        //判断是否任务已经存在
                                                        Dt_PackaxisTask packaxisTask = _packaxisTaskRepository.QueryFirst(x => x.BarCode == conveyorLineInfoRead.R_BoxCode.Trim() && x.TaskState == TaskStatusEnum.Line_Executing.ObjToInt());
                                                        Dt_PackaxisTask packaxisTask = _packaxisTaskRepository.Db.Queryable<Dt_PackaxisTask>().Where(x => x.BarCode == conveyorLineInfoRead.R_BoxCode.Trim() && x.TaskState == TaskStatusEnum.Line_Executing.ObjToInt()).First();
                                                        if (packaxisTask != null)
                                                        {
                                                            //写入执行数据
@@ -165,7 +165,7 @@
                                    }
                                    catch (Exception ex)
                                    {
                                        WriteError($"线程 {Thread.CurrentThread.ManagedThreadId}", $"异常:{ex.Message}");
                                        WriteInfo($"线程 {Thread.CurrentThread.ManagedThreadId}分垛口", $"异常:{ex.Message}");
                                        Thread.Sleep(1500);
                                        shouldRestart = true;
                                    }
@@ -182,7 +182,7 @@
                                        shouldRestart = false;
                                        //获取所有码垛口
                                        List<Dt_StationManger> stationMangersMD = stationMangers.Where(x => x.StationDeviceCode == device.DeviceCode && x.StationType == StationTypeEnum.StationType_OnlyOutbound.ObjToInt()).ToList();
                                        WriteError($"线程 {Thread.CurrentThread.ManagedThreadId}", "开始执行");
                                        WriteInfo($"线程 {Thread.CurrentThread.ManagedThreadId}码垛口", "开始执行");
                                        while (true)
                                        {
                                            if (stationMangersMD.Count > 0)
@@ -230,7 +230,7 @@
                                    }
                                    catch (Exception ex)
                                    {
                                        WriteError($"线程 {Thread.CurrentThread.ManagedThreadId}", $"异常:{ex.Message}");
                                        WriteInfo($"线程 {Thread.CurrentThread.ManagedThreadId}码垛口", $"异常:{ex.Message}");
                                        Thread.Sleep(1500);
                                        shouldRestart = true;
                                    }
ÏîÄ¿´úÂë/WMS/WMSServices/WIDESEA_TaskInfoService/TaskService.cs
@@ -195,7 +195,7 @@
                        return content;
                    }
                    //获取所有的出库详情判断是否满足出库量小于5万且小于17卷
                    List<Dt_OutStockLockInfo> outStockLockInfos = _outboundRepository.OutStockLockInfoRepository.QueryData(x=>x.OrderType==OutOrderTypeEnum.OutSGPick.ObjToInt() && x.Status<=OutLockStockStatusEnum.关闭.ObjToInt());
                    List<Dt_OutStockLockInfo> outStockLockInfos = _outboundRepository.OutStockLockInfoRepository.QueryData(x=>x.OrderType==OutOrderTypeEnum.OutSGPick.ObjToInt() && x.Status<OutLockStockStatusEnum.关闭.ObjToInt());
                    decimal sumAssignQty = outStockLockInfos.Sum(x => x.AssignQuantity);
                    int outCount= outStockLockInfos.Select(x=>x.PalletCode).Distinct().Count();
                    if (sumAssignQty < AppSettings.Get("OutSGLength").ObjToInt() && outCount < AppSettings.Get("OutSGCount").ObjToInt())
ÏîÄ¿´úÂë/WMS/WMSServices/WIDESEA_TaskInfoService/TaskService_Inbound.cs
@@ -367,7 +367,8 @@
                BSTStockInfoDTO bSTStockInfoDTO = bSTResponse.Data ?? throw new Exception($"一期ERP未返回{stockInfoOld.PalletCode}的库存信息");
                stockInfoOld.IsPick = WhetherEnum.False.ObjToInt();
                decimal stockLength = bSTStockInfoDTO.StockMeter;
                if (weight != bSTStockInfoDTO.Qty && weight < stockInfoOld.InitialWeight)
                decimal errWeight = Math.Abs(weight - bSTStockInfoDTO.Qty);
                if (weight != bSTStockInfoDTO.Qty && weight < stockInfoOld.InitialWeight && errWeight <= AppSettings.Get("ErrWeight").ObjToInt())
                {
                    Dt_MaterielInfo materielInfo = _basicRepository.MaterielInfoRepository.QueryFirst(x => x.MaterialSourceId == stockInfoOld.MaterielId);
                    int gramWeight = (int)(materielInfo.MaterielWeight * 1000);
@@ -376,7 +377,7 @@
                        Paper_code = stockInfoOld.PalletCode,
                        Estimate_weight = bSTStockInfoDTO.Qty,
                        Actual_weight = weight,
                        Error_weight = Math.Abs(weight - bSTStockInfoDTO.Qty),
                        Error_weight = errWeight,
                        Weigh_time = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"),
                        Operator = "LiKu",
                        Width = bSTStockInfoDTO.W,
ÏîÄ¿´úÂë/WMS/WMSServices/WIDESEA_TaskInfoService/TaskService_Outbound.cs
@@ -947,6 +947,7 @@
        public WebResponseContent ReceiveOutBound(List<OutMESOrderDTO> outMESOrderDTOs)
        {
            WebResponseContent content = new WebResponseContent();
            string ErrorMsg = "";
            try
            {
                if (outMESOrderDTOs == null || outMESOrderDTOs.Count <= 0)
@@ -976,11 +977,11 @@
                //获取所有加工中心
                List<Dt_MakeCenterInfo> makeCenterInfos = _basicRepository.MakeCenterInfoRepository.QueryData();
                OutMESOrderDTO? CheckMaterialCode = outMESOrderDTOs.FirstOrDefault(x => !materielInfos.Select(x => x.MaterielCode).Contains(x.MaterialCode));
                if (CheckMaterialCode != null)
                {
                    return content.Error($"物料编码{nameof(OutMESOrderDTO.MaterialCode)}:{CheckMaterialCode.MaterialCode}信息不存在");
                }
                //OutMESOrderDTO? CheckMaterialCode = outMESOrderDTOs.FirstOrDefault(x => !materielInfos.Select(x => x.MaterielCode).Contains(x.MaterialCode));
                //if (CheckMaterialCode != null)
                //{
                //    return content.Error($"物料编码{nameof(OutMESOrderDTO.MaterialCode)}:{CheckMaterialCode.MaterialCode}信息不存在");
                //}
                OutMESOrderDTO? CheckMakeCenterCode = outMESOrderDTOs.FirstOrDefault(x => !makeCenterInfos.Select(x => x.MakeCode).Contains(x.MakeCode));
                if (CheckMakeCenterCode!=null)
                {
@@ -991,17 +992,23 @@
                {
                    return content.Error($"领料计划{nameof(OutMESOrderDTO.OutDetailId)}:{OldoutMESOrder.OutDetailId}信息已存在");
                }
                List<Dt_OutMESOrder> AddoutMESOrders = outMESOrderDTOs.Select(x => _mapper.Map<Dt_OutMESOrder>(x)).ToList();
                foreach (var item in AddoutMESOrders)
                List<Dt_OutMESOrder> AddoutMESOrders = new List<Dt_OutMESOrder>();
                foreach (var item in outMESOrderDTOs)
                {
                    Dt_MaterielInfo materielInfo = materielInfos.FirstOrDefault(x => x.MaterielCode == item.MaterialCode);
                    Dt_MakeCenterInfo makeCenterInfo=makeCenterInfos.FirstOrDefault(x => x.MakeCode == item.MakeCode);
                    item.MakeArea = makeCenterInfo.MakeArea;
                    item.WarehouseId = materielInfo.WarehouseId;
                    item.MaterielUnit = materielInfo.MaterielUnit;
                    item.AssistUnitCode = materielInfo.AssistUnitCode;
                    Dt_MaterielInfo? materielInfo = materielInfos.FirstOrDefault(x => x.MaterielCode == item.MaterialCode);
                    if (materielInfo==null)
                    {
                        ErrorMsg += $"物料编码:{item.MaterialCode}信息不存在;";
                        continue;
                    }
                    Dt_MakeCenterInfo makeCenterInfo = makeCenterInfos.FirstOrDefault(x => x.MakeCode == item.MakeCode);
                    Dt_OutMESOrder outMESOrder = _mapper.Map<Dt_OutMESOrder>(item);
                    outMESOrder.MakeArea = makeCenterInfo.MakeArea;
                    outMESOrder.WarehouseId = materielInfo.WarehouseId;
                    outMESOrder.MaterielUnit = materielInfo.MaterielUnit;
                    outMESOrder.AssistUnitCode = materielInfo.AssistUnitCode;
                    AddoutMESOrders.Add(outMESOrder);
                }
                _unitOfWorkManage.BeginTran();
                //操作数据,并分配需求库存
                _outboundRepository.OutMESOrderRepository.AddData(AddoutMESOrders);
@@ -1090,8 +1097,7 @@
                //    }
                //}
                _unitOfWorkManage.CommitTran();
                return content.OK("接收成功");
                return content.OK(ErrorMsg.IsNullOrEmpty()? "接收成功" : $"信息:{ErrorMsg}");
            }
            catch (Exception ex)
            {
ÏîÄ¿´úÂë/WMS/WMSServices/WIDESEA_WMSServer/appsettings.json
@@ -33,6 +33,7 @@
  "ExpMinutes": 360,
  "QuartzJobAutoStart": true,
  "OutSGLength": "50000",
  "ErrWeight": "60", //误差重量不超过
  "OutSGCount": "17",
  "PDAVersion": "4",
  "WebSocketPort": 9296
ÏîÄ¿×ÊÁÏ/ͨÐÅЭÒé/¶þÂ¥»·Ïß20250715.xlsx
Binary files differ