heshaofeng
2025-12-04 587f0335544a6a0be00de5f56cb31af81169121e
提交
已修改3个文件
485 ■■■■ 文件已修改
项目代码/WMS无仓储版/WIDESEA_WMSServer/WIDESEA_Core/BaseRepository/RepositoryBase.cs 426 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS无仓储版/WIDESEA_WMSServer/WIDESEA_OutboundService/OutboundPickingService.cs 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS无仓储版/WIDESEA_WMSServer/WIDESEA_TaskInfoService/TaskService_Outbound.cs 54 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ÏîÄ¿´úÂë/WMSÎÞ²Ö´¢°æ/WIDESEA_WMSServer/WIDESEA_Core/BaseRepository/RepositoryBase.cs
@@ -869,237 +869,237 @@
             .WhereIF(whereExpression != null, whereExpression).ToListAsync();
        }
        //public bool DeleteAndMoveIntoHty(TEntity entity, OperateTypeEnum operateType)
        //{
        //    Type type = entity.GetType();
        //    Assembly assembly = type.Assembly;
        //    Type? htyType = assembly.GetType(type.FullName + "_Hty");
        //    if (htyType != null)
        //    {
        //        object? obj = Activator.CreateInstance(htyType);
        //        PropertyInfo keyPro = typeof(TEntity).GetKeyProperty();
        //        PropertyInfo? operateTypePro = htyType.GetProperty(nameof(IBaseHistoryEntity.OperateType));
        //        PropertyInfo? sourceIdPro = htyType.GetProperty(nameof(IBaseHistoryEntity.SourceId));
        //        if (obj != null && keyPro != null && operateTypePro != null && sourceIdPro != null)
        //        {
        //            operateTypePro.SetValue(obj, operateType.ToString());
        //            sourceIdPro.SetValue(obj, keyPro.GetValue(entity));
        //            List<PropertyInfo> propertyInfos = htyType.GetProperties().Where(x => x.Name != operateTypePro.Name && x.Name != sourceIdPro.Name && x.Name != keyPro.Name).ToList();
        //            for (int i = 0; i < propertyInfos.Count; i++)
        //            {
        //                PropertyInfo propertyInfo = propertyInfos[i];
        //                PropertyInfo? property = type.GetProperty(propertyInfo.Name);
        //                if (property != null)
        //                {
        //                    if (propertyInfo.Name == nameof(BaseEntity.Modifier))
        //                    {
        //                        propertyInfo.SetValue(obj, App.User.UserId > 0 ? App.User.UserName : "System");
        //                    }
        //                    else if (propertyInfo.Name == nameof(BaseEntity.ModifyDate))
        //                    {
        //                        propertyInfo.SetValue(obj, DateTime.Now);
        //                    }
        //                    else
        //                    {
        //                        propertyInfo.SetValue(obj, property.GetValue(entity));
        //                    }
        //                }
        //            }
        //            if (obj != null)
        //                _db.InsertableByObject(obj).AS(type.Name + "_Hty").ExecuteCommand();
        //        }
        //    }
        //    return DeleteData(entity);
        //}
        public bool DeleteAndMoveIntoHty(TEntity entity, OperateTypeEnum operateType)
        {
            // æ ¸å¿ƒé€»è¾‘:用事务保证原子性,异常捕获避免流程中断,日志辅助排查
            bool isSuccess = false;
            string entityTypeName = entity?.GetType().Name ?? "未知实体";
            try
            Type type = entity.GetType();
            Assembly assembly = type.Assembly;
            Type? htyType = assembly.GetType(type.FullName + "_Hty");
            if (htyType != null)
            {
                // å‰ç½®æ ¡éªŒï¼šå®žä½“不能为空
                if (entity == null)
                object? obj = Activator.CreateInstance(htyType);
                PropertyInfo keyPro = typeof(TEntity).GetKeyProperty();
                PropertyInfo? operateTypePro = htyType.GetProperty(nameof(IBaseHistoryEntity.OperateType));
                PropertyInfo? sourceIdPro = htyType.GetProperty(nameof(IBaseHistoryEntity.SourceId));
                if (obj != null && keyPro != null && operateTypePro != null && sourceIdPro != null)
                {
                    return false;
                }
                    operateTypePro.SetValue(obj, operateType.ToString());
                    sourceIdPro.SetValue(obj, keyPro.GetValue(entity));
                Type entityType = entity.GetType();
                Assembly assembly = entityType.Assembly;
                string htyTypeName = $"{entityType.FullName}_Hty";
                Type? htyType = assembly.GetType(htyTypeName);
                    List<PropertyInfo> propertyInfos = htyType.GetProperties().Where(x => x.Name != operateTypePro.Name && x.Name != sourceIdPro.Name && x.Name != keyPro.Name).ToList();
                // 1. æ£€æŸ¥åŽ†å²è¡¨ç±»åž‹æ˜¯å¦å­˜åœ¨
                if (htyType == null)
                {
                    return false;
                }
                // 2. åˆ›å»ºåŽ†å²è¡¨å®žä¾‹ï¼ˆå¤„ç†æ— å‚æž„é€ å‡½æ•°ä¸å­˜åœ¨çš„æƒ…å†µï¼‰
                object? htyObj;
                try
                {
                    htyObj = Activator.CreateInstance(htyType);
                }
                catch (Exception ex)
                {
                    // _logger.LogError(ex, "DeleteAndMoveIntoHty:创建历史表实例 {HtyTypeName} å¤±è´¥", htyTypeName);
                    return false;
                }
                if (htyObj == null)
                {
                    // _logger.LogWarning("DeleteAndMoveIntoHty:历史表实例 {HtyTypeName} åˆ›å»ºç»“果为null", htyTypeName);
                    return false;
                }
                // 3. èŽ·å–æ ¸å¿ƒå±žæ€§ï¼ˆæŒ‡å®šBindingFlags确保获取公共实例属性)
                BindingFlags propFlags = BindingFlags.Public | BindingFlags.Instance;
                PropertyInfo? keyPro = typeof(TEntity).GetKeyProperty(); // è‡ªå®šä¹‰æ–¹æ³•需确保返回非空,此处增加判空
                PropertyInfo? operateTypePro = htyType.GetProperty(nameof(IBaseHistoryEntity.OperateType), propFlags);
                PropertyInfo? sourceIdPro = htyType.GetProperty(nameof(IBaseHistoryEntity.SourceId), propFlags);
                // æ ¡éªŒæ ¸å¿ƒå±žæ€§æ˜¯å¦å­˜åœ¨
                if (keyPro == null)
                {
                    //_logger.LogError("DeleteAndMoveIntoHty:实体 {EntityType} æœªæ‰¾åˆ°ä¸»é”®å±žæ€§", entityType.FullName);
                    return false;
                }
                if (operateTypePro == null)
                {
                    //_logger.LogError("DeleteAndMoveIntoHty:历史表 {HtyTypeName} æœªæ‰¾åˆ°OperateType属性", htyTypeName);
                    return false;
                }
                if (sourceIdPro == null)
                {
                    // _logger.LogError("DeleteAndMoveIntoHty:历史表 {HtyTypeName} æœªæ‰¾åˆ°SourceId属性", htyTypeName);
                    return false;
                }
                // 4. èµ‹å€¼æ ¸å¿ƒå±žæ€§ï¼ˆæ ¡éªŒç±»åž‹åŒ¹é…ï¼Œé¿å…SetValue抛异常)
                try
                {
                    // å¤„理OperateType类型匹配:若历史表属性是枚举类型,直接传枚举而非字符串
                    if (operateTypePro.PropertyType == typeof(OperateTypeEnum))
                    for (int i = 0; i < propertyInfos.Count; i++)
                    {
                        operateTypePro.SetValue(htyObj, operateType);
                    }
                    else if (operateTypePro.PropertyType == typeof(string))
                    {
                        operateTypePro.SetValue(htyObj, operateType.ToString());
                    }
                    else
                    {
                        //_logger.LogError("DeleteAndMoveIntoHty:历史表 {HtyTypeName} çš„OperateType属性类型 {PropType} ä¸åŒ¹é…ï¼ˆä»…支持枚举/字符串)", htyTypeName, operateTypePro.PropertyType.FullName);
                        return false;
                    }
                        PropertyInfo propertyInfo = propertyInfos[i];
                        PropertyInfo? property = type.GetProperty(propertyInfo.Name);
                    // èµ‹å€¼SourceId(校验类型匹配)
                    object sourceIdValue = keyPro.GetValue(entity)!;
                    if (sourceIdPro.PropertyType != sourceIdValue.GetType())
                    {
                        sourceIdValue = Convert.ChangeType(sourceIdValue, sourceIdPro.PropertyType); // ç±»åž‹è½¬æ¢
                    }
                    sourceIdPro.SetValue(htyObj, sourceIdValue);
                }
                catch (Exception ex)
                {
                    // _logger.LogError(ex, "DeleteAndMoveIntoHty:历史表 {HtyTypeName} æ ¸å¿ƒå±žæ€§èµ‹å€¼å¤±è´¥", htyTypeName);
                    return false;
                }
                // 5. èµ‹å€¼å…¶ä»–属性(排除核心属性)
                List<PropertyInfo> htyProperties = htyType.GetProperties(propFlags)
                    .Where(x => x.Name != operateTypePro.Name
                             && x.Name != sourceIdPro.Name
                             && x.Name != keyPro.Name)
                    .ToList();
                foreach (PropertyInfo htyProp in htyProperties)
                {
                    PropertyInfo? entityProp = entityType.GetProperty(htyProp.Name, propFlags);
                    if (entityProp == null) continue; // å®žä½“无该属性则跳过
                    try
                    {
                        object propValue;
                        // å¤„理修改人:避免App.User空引用
                        if (htyProp.Name == nameof(BaseEntity.Modifier))
                        if (property != null)
                        {
                            propValue = App.User?.UserId > 0 ? App.User?.UserName : "System";
                            if (propertyInfo.Name == nameof(BaseEntity.Modifier))
                            {
                                propertyInfo.SetValue(obj, App.User.UserId > 0 ? App.User.UserName : "System");
                            }
                            else if (propertyInfo.Name == nameof(BaseEntity.ModifyDate))
                            {
                                propertyInfo.SetValue(obj, DateTime.Now);
                            }
                            else
                            {
                                propertyInfo.SetValue(obj, property.GetValue(entity));
                            }
                        }
                        // å¤„理修改时间
                        else if (htyProp.Name == nameof(BaseEntity.ModifyDate))
                        {
                            propValue = DateTime.Now;
                        }
                        // å…¶ä»–属性从原实体取值
                        else
                        {
                            propValue = entityProp.GetValue(entity) ?? DBNull.Value; // å¤„理null值
                        }
                        // ç±»åž‹è½¬æ¢åŽèµ‹å€¼ï¼ˆé¿å…ç±»åž‹ä¸åŒ¹é…ï¼‰
                        if (propValue != DBNull.Value && propValue != null)
                        {
                            propValue = Convert.ChangeType(propValue, htyProp.PropertyType);
                        }
                        htyProp.SetValue(htyObj, propValue);
                    }
                    catch (Exception ex)
                    {
                        // _logger.LogWarning(ex, "DeleteAndMoveIntoHty:历史表 {HtyTypeName} å±žæ€§ {PropName} èµ‹å€¼å¤±è´¥ï¼Œè·³è¿‡è¯¥å±žæ€§", htyTypeName, htyProp.Name);
                    }
                    if (obj != null)
                        _db.InsertableByObject(obj).AS(type.Name + "_Hty").ExecuteCommand();
                }
                try
                {
                    // æ‰§è¡Œæ’入历史表
                    int insertRows = _db.InsertableByObject(htyObj).AS(entityType.Name + "_Hty").ExecuteCommand();
                    if (insertRows <= 0)
                    {
                        // _logger.LogError("DeleteAndMoveIntoHty:历史表 {HtyTypeName} æ’入失败(影响行数0)", htyTypeName);
                        _db.InsertableByObject(htyObj).AS(entityType.Name + "_Hty").ExecuteCommand();
                        return false;
                    }
                    // æ’入成功后执行删除
                    bool deleteSuccess = DeleteData(entity);
                    if (!deleteSuccess)
                    {
                        //_logger.LogError("DeleteAndMoveIntoHty:实体 {EntityType} åˆ é™¤å¤±è´¥", entityType.FullName);
                        DeleteData(entity);
                        return false;
                    }
                    // æäº¤äº‹åŠ¡
                    isSuccess = true;
                    //_logger.LogInformation("DeleteAndMoveIntoHty:实体 {EntityType} å·²æˆåŠŸç§»å…¥åŽ†å²è¡¨å¹¶åˆ é™¤åŽŸæ•°æ®", entityType.FullName);
                }
                catch (Exception ex)
                {
                    // _logger.LogError(ex, "DeleteAndMoveIntoHty:事务执行失败(插入历史表/删除原数据)", entityType.FullName);
                    return false;
                }
            }
            catch (Exception ex)
            {
                //  _logger.LogError(ex, "DeleteAndMoveIntoHty:处理实体 {EntityTypeName} æ—¶å‘生未捕获异常", entityTypeName);
                return false;
            }
            return DeleteData(entity);
            return isSuccess;
        }
        //public bool DeleteAndMoveIntoHty(TEntity entity, OperateTypeEnum operateType)
        //{
        //    // æ ¸å¿ƒé€»è¾‘:用事务保证原子性,异常捕获避免流程中断,日志辅助排查
        //    bool isSuccess = false;
        //    string entityTypeName = entity?.GetType().Name ?? "未知实体";
        //    try
        //    {
        //        // å‰ç½®æ ¡éªŒï¼šå®žä½“不能为空
        //        if (entity == null)
        //        {
        //            return false;
        //        }
        //        Type entityType = entity.GetType();
        //        Assembly assembly = entityType.Assembly;
        //        string htyTypeName = $"{entityType.FullName}_Hty";
        //        Type? htyType = assembly.GetType(htyTypeName);
        //        // 1. æ£€æŸ¥åŽ†å²è¡¨ç±»åž‹æ˜¯å¦å­˜åœ¨
        //        if (htyType == null)
        //        {
        //            return false;
        //        }
        //        // 2. åˆ›å»ºåŽ†å²è¡¨å®žä¾‹ï¼ˆå¤„ç†æ— å‚æž„é€ å‡½æ•°ä¸å­˜åœ¨çš„æƒ…å†µï¼‰
        //        object? htyObj;
        //        try
        //        {
        //            htyObj = Activator.CreateInstance(htyType);
        //        }
        //        catch (Exception ex)
        //        {
        //            // _logger.LogError(ex, "DeleteAndMoveIntoHty:创建历史表实例 {HtyTypeName} å¤±è´¥", htyTypeName);
        //            return false;
        //        }
        //        if (htyObj == null)
        //        {
        //            // _logger.LogWarning("DeleteAndMoveIntoHty:历史表实例 {HtyTypeName} åˆ›å»ºç»“果为null", htyTypeName);
        //            return false;
        //        }
        //        // 3. èŽ·å–æ ¸å¿ƒå±žæ€§ï¼ˆæŒ‡å®šBindingFlags确保获取公共实例属性)
        //        BindingFlags propFlags = BindingFlags.Public | BindingFlags.Instance;
        //        PropertyInfo? keyPro = typeof(TEntity).GetKeyProperty(); // è‡ªå®šä¹‰æ–¹æ³•需确保返回非空,此处增加判空
        //        PropertyInfo? operateTypePro = htyType.GetProperty(nameof(IBaseHistoryEntity.OperateType), propFlags);
        //        PropertyInfo? sourceIdPro = htyType.GetProperty(nameof(IBaseHistoryEntity.SourceId), propFlags);
        //        // æ ¡éªŒæ ¸å¿ƒå±žæ€§æ˜¯å¦å­˜åœ¨
        //        if (keyPro == null)
        //        {
        //            //_logger.LogError("DeleteAndMoveIntoHty:实体 {EntityType} æœªæ‰¾åˆ°ä¸»é”®å±žæ€§", entityType.FullName);
        //            return false;
        //        }
        //        if (operateTypePro == null)
        //        {
        //            //_logger.LogError("DeleteAndMoveIntoHty:历史表 {HtyTypeName} æœªæ‰¾åˆ°OperateType属性", htyTypeName);
        //            return false;
        //        }
        //        if (sourceIdPro == null)
        //        {
        //            // _logger.LogError("DeleteAndMoveIntoHty:历史表 {HtyTypeName} æœªæ‰¾åˆ°SourceId属性", htyTypeName);
        //            return false;
        //        }
        //        // 4. èµ‹å€¼æ ¸å¿ƒå±žæ€§ï¼ˆæ ¡éªŒç±»åž‹åŒ¹é…ï¼Œé¿å…SetValue抛异常)
        //        try
        //        {
        //            // å¤„理OperateType类型匹配:若历史表属性是枚举类型,直接传枚举而非字符串
        //            if (operateTypePro.PropertyType == typeof(OperateTypeEnum))
        //            {
        //                operateTypePro.SetValue(htyObj, operateType);
        //            }
        //            else if (operateTypePro.PropertyType == typeof(string))
        //            {
        //                operateTypePro.SetValue(htyObj, operateType.ToString());
        //            }
        //            else
        //            {
        //                //_logger.LogError("DeleteAndMoveIntoHty:历史表 {HtyTypeName} çš„OperateType属性类型 {PropType} ä¸åŒ¹é…ï¼ˆä»…支持枚举/字符串)", htyTypeName, operateTypePro.PropertyType.FullName);
        //                return false;
        //            }
        //            // èµ‹å€¼SourceId(校验类型匹配)
        //            object sourceIdValue = keyPro.GetValue(entity)!;
        //            if (sourceIdPro.PropertyType != sourceIdValue.GetType())
        //            {
        //                sourceIdValue = Convert.ChangeType(sourceIdValue, sourceIdPro.PropertyType); // ç±»åž‹è½¬æ¢
        //            }
        //            sourceIdPro.SetValue(htyObj, sourceIdValue);
        //        }
        //        catch (Exception ex)
        //        {
        //            // _logger.LogError(ex, "DeleteAndMoveIntoHty:历史表 {HtyTypeName} æ ¸å¿ƒå±žæ€§èµ‹å€¼å¤±è´¥", htyTypeName);
        //            return false;
        //        }
        //        // 5. èµ‹å€¼å…¶ä»–属性(排除核心属性)
        //        List<PropertyInfo> htyProperties = htyType.GetProperties(propFlags)
        //            .Where(x => x.Name != operateTypePro.Name
        //                     && x.Name != sourceIdPro.Name
        //                     && x.Name != keyPro.Name)
        //            .ToList();
        //        foreach (PropertyInfo htyProp in htyProperties)
        //        {
        //            PropertyInfo? entityProp = entityType.GetProperty(htyProp.Name, propFlags);
        //            if (entityProp == null) continue; // å®žä½“无该属性则跳过
        //            try
        //            {
        //                object propValue;
        //                // å¤„理修改人:避免App.User空引用
        //                if (htyProp.Name == nameof(BaseEntity.Modifier))
        //                {
        //                    propValue = App.User?.UserId > 0 ? App.User?.UserName : "System";
        //                }
        //                // å¤„理修改时间
        //                else if (htyProp.Name == nameof(BaseEntity.ModifyDate))
        //                {
        //                    propValue = DateTime.Now;
        //                }
        //                // å…¶ä»–属性从原实体取值
        //                else
        //                {
        //                    propValue = entityProp.GetValue(entity) ?? DBNull.Value; // å¤„理null值
        //                }
        //                // ç±»åž‹è½¬æ¢åŽèµ‹å€¼ï¼ˆé¿å…ç±»åž‹ä¸åŒ¹é…ï¼‰
        //                if (propValue != DBNull.Value && propValue != null)
        //                {
        //                    propValue = Convert.ChangeType(propValue, htyProp.PropertyType);
        //                }
        //                htyProp.SetValue(htyObj, propValue);
        //            }
        //            catch (Exception ex)
        //            {
        //                // _logger.LogWarning(ex, "DeleteAndMoveIntoHty:历史表 {HtyTypeName} å±žæ€§ {PropName} èµ‹å€¼å¤±è´¥ï¼Œè·³è¿‡è¯¥å±žæ€§", htyTypeName, htyProp.Name);
        //            }
        //        }
        //        try
        //        {
        //            // æ‰§è¡Œæ’入历史表
        //            int insertRows = _db.InsertableByObject(htyObj).AS(entityType.Name + "_Hty").ExecuteCommand();
        //            if (insertRows <= 0)
        //            {
        //                // _logger.LogError("DeleteAndMoveIntoHty:历史表 {HtyTypeName} æ’入失败(影响行数0)", htyTypeName);
        //                _db.InsertableByObject(htyObj).AS(entityType.Name + "_Hty").ExecuteCommand();
        //                return false;
        //            }
        //            // æ’入成功后执行删除
        //            bool deleteSuccess = DeleteData(entity);
        //            if (!deleteSuccess)
        //            {
        //                //_logger.LogError("DeleteAndMoveIntoHty:实体 {EntityType} åˆ é™¤å¤±è´¥", entityType.FullName);
        //                DeleteData(entity);
        //                return false;
        //            }
        //            // æäº¤äº‹åŠ¡
        //            isSuccess = true;
        //            //_logger.LogInformation("DeleteAndMoveIntoHty:实体 {EntityType} å·²æˆåŠŸç§»å…¥åŽ†å²è¡¨å¹¶åˆ é™¤åŽŸæ•°æ®", entityType.FullName);
        //        }
        //        catch (Exception ex)
        //        {
        //            // _logger.LogError(ex, "DeleteAndMoveIntoHty:事务执行失败(插入历史表/删除原数据)", entityType.FullName);
        //            return false;
        //        }
        //    }
        //    catch (Exception ex)
        //    {
        //        //  _logger.LogError(ex, "DeleteAndMoveIntoHty:处理实体 {EntityTypeName} æ—¶å‘生未捕获异常", entityTypeName);
        //        return false;
        //    }
        //    return isSuccess;
        //}
public bool DeleteAndMoveIntoHty(List<TEntity> entities, OperateTypeEnum operateType)
        public bool DeleteAndMoveIntoHty(List<TEntity> entities, OperateTypeEnum operateType)
{
    Type type = typeof(TEntity);
    Assembly assembly = type.Assembly;
ÏîÄ¿´úÂë/WMSÎÞ²Ö´¢°æ/WIDESEA_WMSServer/WIDESEA_OutboundService/OutboundPickingService.cs
@@ -1124,7 +1124,7 @@
        {
            // èŽ·å–æœ€æ–°çš„è®¢å•æ˜Žç»†æ•°æ®ï¼ˆå¸¦é”ï¼‰
            var currentOrderDetail = await _outboundOrderDetailService.Db.Queryable<Dt_OutboundOrderDetail>()
                .With(SqlWith.RowLock)
                //.With(SqlWith.RowLock)
                .FirstAsync(x => x.Id == orderDetailId);
            decimal newOverOutQuantity = currentOrderDetail.OverOutQuantity - cancelQty;
@@ -3004,7 +3004,8 @@
                    stockInfo.Details = new List<Dt_StockInfoDetail>();
                }
                var inboindId = 0; Dt_InboundOrder dt_InboundOrder = null;
                var dbinbound = _inboundOrderRepository.QueryData(x => x.InboundOrderNo == dbinboundOrderDetails.First().OrderNo).First();
                var orderno = dbinboundOrderDetails.First().OrderNo;
                var dbinbound = _inboundOrderRepository.QueryData(x => x.InboundOrderNo == orderno).FirstOrDefault();
                if (dbinbound == null)
                {
                    dt_InboundOrder = new Dt_InboundOrder
ÏîÄ¿´úÂë/WMSÎÞ²Ö´¢°æ/WIDESEA_WMSServer/WIDESEA_TaskInfoService/TaskService_Outbound.cs
@@ -159,7 +159,7 @@
                    foreach (var key in keys)
                    {
                        var detail = _outboundOrderDetailService.Db.Ado.SqlQuerySingle<Dt_OutboundOrderDetail>(
                            "SELECT * FROM Dt_OutboundOrderDetail WITH (UPDLOCK, ROWLOCK) WHERE Id = @Id",
                            "SELECT * FROM Dt_OutboundOrderDetail WITH (UPDLOCK) WHERE Id = @Id",
                            new { Id = key });
                        if (detail != null)
@@ -387,7 +387,6 @@
                            // TaskNum = BaseDal.GetTaskNum(nameof(SequenceEnum.SeqTaskNum)),
                            PalletType = stockInfo.PalletType,
                            WarehouseId = stockInfo.WarehouseId,
                        };
                        //if (taskType != TaskTypeEnum.OutEmpty)
                        //{
@@ -403,51 +402,7 @@
            return tasks;
        }
        public List<Dt_Task> GetTasks(List<Dt_StockInfo> stockInfos, TaskTypeEnum taskType)
        {
            List<Dt_Task> tasks = new List<Dt_Task>();
            List<Dt_LocationInfo> locationInfos = _locationInfoService.Repository.QueryData(x => stockInfos.Select(x => x.LocationCode).Contains(x.LocationCode));
            for (int i = 0; i < stockInfos.Count; i++)
            {
                Dt_StockInfo stockInfo = stockInfos[i];
                if (stockInfo != null)
                {
                    Dt_LocationInfo? locationInfo = locationInfos.FirstOrDefault(x => x.LocationCode == stockInfo.LocationCode);
                    if (!tasks.Exists(x => x.PalletCode == stockInfo.PalletCode))
                    {
                        Dt_Task task = new()
                        {
                            CurrentAddress = stockInfo.LocationCode,
                            Grade = 0,
                            PalletCode = stockInfo.PalletCode,
                            NextAddress = "",
                            Roadway = locationInfo.RoadwayNo,
                            SourceAddress = stockInfo.LocationCode,
                            TargetAddress = "",
                            TaskStatus = TaskStatusEnum.New.ObjToInt(),
                            TaskType = taskType.ObjToInt(),
                            //TaskNum = BaseDal.GetTaskNum(nameof(SequenceEnum.SeqTaskNum)),
                            PalletType = stockInfo.PalletType,
                            WarehouseId = stockInfo.WarehouseId,
                        };
                        //if (taskType != TaskTypeEnum.OutEmpty)
                        //{
                        //    task.MaterielCode = stockInfo.Details?.Where(x => x.StockId == stockInfo.Id).FirstOrDefault()?.MaterielCode;
                        //    task.Quantity = (float)stockInfo.Details?.Where(x => x.StockId == stockInfo.Id).Sum(x => x.StockQuantity);
                        //    task.BatchNo = stockInfo.Details?.Where(x => x.StockId == stockInfo.Id).FirstOrDefault()?.BatchNo;
                        //}
                        //if (stockInfo.StockLength > 0)
                        //{
                        //    task.TaskLength = stockInfo.StockLength;
                        //}
                        tasks.Add(task);
                    }
                }
            }
            return tasks;
        }
        #region å†…存锁管理器
        private static readonly ConcurrentDictionary<string, SemaphoreSlim> _normalmaterialLocks =
@@ -713,7 +668,8 @@
            Dt_OutboundOrderDetail? orderDetail = null;
            List<Dt_OutStockLockInfo>? outStockLockInfos = null;
            List<Dt_LocationInfo>? locationInfos = null;
            if (outboundOrderDetail.OrderDetailStatus == OrderDetailStatusEnum.New.ObjToInt())
            if (outboundOrderDetail.OrderDetailStatus == OrderDetailStatusEnum.New.ObjToInt() ||
                outboundOrderDetail.OrderDetailStatus == OrderDetailStatusEnum.Outbound.ObjToInt())
            {
                (List<Dt_StockInfo>, Dt_OutboundOrderDetail, List<Dt_OutStockLockInfo>, List<Dt_LocationInfo>) result = _outboundOrderDetailService.AssignStockOutbound(outboundOrderDetail, stockSelectViews);
                if (result.Item1 != null && result.Item1.Count > 0)
@@ -749,7 +705,7 @@
                if (stockLockInfos != null && stockLockInfos.Count > 0)
                {
                    List<Dt_StockInfo> stocks = _stockService.StockInfoService.GetStockInfosByPalletCodes(stockLockInfos.Select(x => x.PalletCode).Distinct().ToList());
                    tasks = GetTasks(stocks, TaskTypeEnum.Outbound);
                    tasks = GetTasks(stocks, TaskTypeEnum.Outbound,station);
                }
            }
@@ -1001,7 +957,7 @@
            List<Dt_Task> tasks = new List<Dt_Task>();
            // èŽ·å–è®¢å•æ˜Žç»†
            var outboundOrderDetail = await _outboundOrderDetailService.Db.Queryable<Dt_OutboundOrderDetail>().With("UPDLOCK, ROWLOCK")
            var outboundOrderDetail = await _outboundOrderDetailService.Db.Queryable<Dt_OutboundOrderDetail>().With("UPDLOCK")
                .FirstAsync(x => x.Id == orderDetailId);
            if (outboundOrderDetail == null)