z8018
2025-12-18 708880e13eb29c306ff9255c0516ff3d9d99c69c
调拨出库条码记录
已添加2个文件
已删除4个文件
已修改10个文件
641 ■■■■■ 文件已修改
项目代码/WMS无仓储版/WIDESEA_WMSServer/.vs/WIDESEA_WMSServer/CopilotIndices/17.14.1204.46620/CodeChunks.db 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS无仓储版/WIDESEA_WMSServer/.vs/WIDESEA_WMSServer/CopilotIndices/17.14.1204.46620/CodeChunks.db-shm 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS无仓储版/WIDESEA_WMSServer/.vs/WIDESEA_WMSServer/CopilotIndices/17.14.1204.46620/CodeChunks.db-wal 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS无仓储版/WIDESEA_WMSServer/.vs/WIDESEA_WMSServer/CopilotIndices/17.14.1204.46620/SemanticSymbols.db 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS无仓储版/WIDESEA_WMSServer/.vs/WIDESEA_WMSServer/CopilotIndices/17.14.1204.46620/SemanticSymbols.db-shm 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS无仓储版/WIDESEA_WMSServer/.vs/WIDESEA_WMSServer/CopilotIndices/17.14.1204.46620/SemanticSymbols.db-wal 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS无仓储版/WIDESEA_WMSServer/WIDESEA_BasicService/BasicService.cs 7 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS无仓储版/WIDESEA_WMSServer/WIDESEA_BasicService/MESOperation/FeedbackMesService.cs 91 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS无仓储版/WIDESEA_WMSServer/WIDESEA_Core/AOP/SqlSugarAop.cs 17 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS无仓储版/WIDESEA_WMSServer/WIDESEA_Core/BaseRepository/RepositoryBase.cs 191 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS无仓储版/WIDESEA_WMSServer/WIDESEA_DTO/ReturnMES/BarcodeReturnDTO.cs 70 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS无仓储版/WIDESEA_WMSServer/WIDESEA_IBasicService/MESOperation/IFeedbackMesService.cs 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS无仓储版/WIDESEA_WMSServer/WIDESEA_Model/Models/Allocate/Dt_AllocateMaterialInfo.cs 95 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS无仓储版/WIDESEA_WMSServer/WIDESEA_Model/Models/Basic/Dt_MaterielCodeInfo.cs 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS无仓储版/WIDESEA_WMSServer/WIDESEA_Model/Models/Record/Dt_MesReturnRecord.cs 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS无仓储版/WIDESEA_WMSServer/WIDESEA_OutboundService/OutboundService.cs 138 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ÏîÄ¿´úÂë/WMSÎÞ²Ö´¢°æ/WIDESEA_WMSServer/.vs/WIDESEA_WMSServer/CopilotIndices/17.14.1204.46620/CodeChunks.db
Binary files differ
ÏîÄ¿´úÂë/WMSÎÞ²Ö´¢°æ/WIDESEA_WMSServer/.vs/WIDESEA_WMSServer/CopilotIndices/17.14.1204.46620/CodeChunks.db-shm
Binary files differ
ÏîÄ¿´úÂë/WMSÎÞ²Ö´¢°æ/WIDESEA_WMSServer/.vs/WIDESEA_WMSServer/CopilotIndices/17.14.1204.46620/CodeChunks.db-wal
Binary files differ
ÏîÄ¿´úÂë/WMSÎÞ²Ö´¢°æ/WIDESEA_WMSServer/.vs/WIDESEA_WMSServer/CopilotIndices/17.14.1204.46620/SemanticSymbols.db
Binary files differ
ÏîÄ¿´úÂë/WMSÎÞ²Ö´¢°æ/WIDESEA_WMSServer/.vs/WIDESEA_WMSServer/CopilotIndices/17.14.1204.46620/SemanticSymbols.db-shm
Binary files differ
ÏîÄ¿´úÂë/WMSÎÞ²Ö´¢°æ/WIDESEA_WMSServer/.vs/WIDESEA_WMSServer/CopilotIndices/17.14.1204.46620/SemanticSymbols.db-wal
Binary files differ
ÏîÄ¿´úÂë/WMSÎÞ²Ö´¢°æ/WIDESEA_WMSServer/WIDESEA_BasicService/BasicService.cs
@@ -40,7 +40,11 @@
        }
        #region
        static object lockObj = new object();
        public string CreateCodeByRule(string ruleCode)
        {
            lock (lockObj)
        {
            string code = string.Empty;
            DateTime dataTime = DateTime.Now;
@@ -81,10 +85,11 @@
            }
            catch (Exception ex)
            {
                    throw new Exception(ex.Message);
            }
            return code;
        }
        }
        #endregion
        #region å•位转换
ÏîÄ¿´úÂë/WMSÎÞ²Ö´¢°æ/WIDESEA_WMSServer/WIDESEA_BasicService/MESOperation/FeedbackMesService.cs
@@ -4,6 +4,7 @@
using System.Text;
using System.Threading.Tasks;
using Newtonsoft.Json;
using SqlSugar;
using WIDESEA_Core;
using WIDESEA_Core.BaseRepository;
using WIDESEA_Core.BaseServices;
@@ -25,14 +26,16 @@
        private readonly IRepository<Dt_OutboundOrder> _outboundOrderRepository;
        private readonly IBasicService _basicService;
        private readonly IRepository<Dt_AllocateOrder> _allocateRepository;
        private readonly IRepository<Dt_MaterialCodeInfo> _materialCodeInfoRepository;
        public FeedbackMesService(IRepository<Dt_MesReturnRecord> BaseDal, IUnitOfWorkManage unitOfWorkManage, HttpClientHelper httpClientHelper, IRepository<Dt_OutboundOrder> outboundOrderRepository, IBasicService basicService, IRepository<Dt_AllocateOrder> allocateRepository) : base(BaseDal)
        public FeedbackMesService(IRepository<Dt_MesReturnRecord> BaseDal, IUnitOfWorkManage unitOfWorkManage, HttpClientHelper httpClientHelper, IRepository<Dt_OutboundOrder> outboundOrderRepository, IBasicService basicService, IRepository<Dt_AllocateOrder> allocateRepository, IRepository<Dt_MaterialCodeInfo> materialCodeInfoRepository) : base(BaseDal)
        {
            _unitOfWorkManage = unitOfWorkManage;
            _httpClientHelper = httpClientHelper;
            _outboundOrderRepository = outboundOrderRepository;
            _basicService = basicService;
            _allocateRepository = allocateRepository;
            _materialCodeInfoRepository = materialCodeInfoRepository;
        }
        public WebResponseContent OutboundFeedback(string orderNo)
@@ -105,7 +108,6 @@
                    InterfaceType = 1,
                    OrderId = outboundOrder.Id,
                    OrderNo = outboundOrder.OrderNo,
                    OrderType = outboundOrder.OrderType,
                    RequestCode = reqCode,
                    RequestData = requestData,
                    FailureReason = message,
@@ -234,7 +236,6 @@
                        InterfaceType = 1,
                        OrderId = outboundOrder.Id,
                        OrderNo = outboundOrder.OrderNo,
                        OrderType = outboundOrder.OrderType,
                        RequestCode = returnDTO.ReqCode,
                        RequestData = returnDTO.Serialize(),
                        FailureReason = message,
@@ -329,5 +330,89 @@
                return null;
            }
        }
        public WebResponseContent BarcodeFeedback(string newBarcode)
        {
            try
            {
                Dt_MaterialCodeInfo materialCodeInfo = _materialCodeInfoRepository.QueryFirst(x => x.NewBarcode == newBarcode, new Dictionary<string, OrderByType> { { nameof(Dt_MaterialCodeInfo.Id), OrderByType.Desc } });
                if (materialCodeInfo == null)
                {
                    return WebResponseContent.Instance.Error($"未找到物料条码信息{newBarcode}");
                }
                string apiUrl = "";
                BarcodeReturnDTO returnDTO = new BarcodeReturnDTO()
                {
                    BatchNo = materialCodeInfo.BatchNo,
                    FactoryArea = materialCodeInfo.FactoryArea,
                    OperationType = 1,
                    MaterialCode = materialCodeInfo.MaterialCode,
                    NewmaterialCode = materialCodeInfo.NewBarcode,
                    OldmaterialCode = materialCodeInfo.OldBarcode,
                    Operator = materialCodeInfo.Creater,
                    Qty = materialCodeInfo.AfterQuantity,
                    SupplyCode = materialCodeInfo.SuplierCode,
                    Unit = materialCodeInfo.Unit,
                    WarehouseCode = materialCodeInfo.WarehouseCode
                };
                string reqCode = Guid.NewGuid().ToString();
                string reqTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
                string requestData = returnDTO.Serialize();
                HttpResponseResult<MesResponseDTO> httpResponseResult = _httpClientHelper.Post<MesResponseDTO>(apiUrl, requestData);
                httpResponseResult.ApiUrl = apiUrl;
                bool isSuccess = httpResponseResult.IsSuccess && httpResponseResult.Data != null && httpResponseResult.Data.Code == "200";
                string message = "成功";
                if (!isSuccess)
                {
                    if (!httpResponseResult.IsSuccess)
                    {
                        message = $"MES接口返回错误,HTTP代码:{httpResponseResult.StatusCode},信息:{httpResponseResult.ErrorMessage}";
                    }
                    else if (httpResponseResult.Data.Code != "200")
                    {
                        message = $"调用MES接口失败,代码:{httpResponseResult.Data.Code},信息:{httpResponseResult.Data.Message}";
                    }
                }
                Dt_MesReturnRecord mesReturnRecord = new Dt_MesReturnRecord()
                {
                    ApiUrl = httpResponseResult.ApiUrl,
                    InterfaceType = 1,
                    OrderId = materialCodeInfo.OrderId ?? 0,
                    OrderNo = materialCodeInfo.OrderNo ?? "",
                    RequestCode = reqCode,
                    RequestData = requestData,
                    FailureReason = message,
                    LastReturnTime = DateTime.Now,
                    HttpStatusCode = httpResponseResult.StatusCode.ObjToInt(),
                    ResponseData = httpResponseResult.Content,
                    ReturnType = 0,
                    ReturnCount = 1,
                    ReturnStatus = httpResponseResult.IsSuccess ? 1 : 2,
                    SuccessTime = httpResponseResult.IsSuccess ? DateTime.Now : null
                };
                _unitOfWorkManage.BeginTran();
                _unitOfWorkManage.Db.Insertable(mesReturnRecord).ExecuteCommand();
                materialCodeInfo.ReturnStatus = httpResponseResult.IsSuccess ? 1 : 2;
                _materialCodeInfoRepository.UpdateData(materialCodeInfo);
                _unitOfWorkManage.CommitTran();
                WebResponseContent responseContent = new WebResponseContent();
                responseContent.Status = isSuccess;
                responseContent.Message = message;
                return responseContent;
            }
            catch (Exception ex)
            {
                return WebResponseContent.Instance.Error(ex.Message);
            }
        }
    }
}
ÏîÄ¿´úÂë/WMSÎÞ²Ö´¢°æ/WIDESEA_WMSServer/WIDESEA_Core/AOP/SqlSugarAop.cs
@@ -72,7 +72,14 @@
                }
            }
            if (entityInfo.EntityValue is BaseEntity baseEntity)
            if (entityInfo.EntityValue is BaseEntity entity && entityInfo.EntityValue is IBaseHistoryEntity historyEntity)
            {
                if (entityInfo.OperationType == DataFilterType.InsertByObject && entityInfo.PropertyName == nameof(BaseEntity.CreateDate))
                {
                    historyEntity.InsertTime = DateTime.Now;
                }
            }
            else if (entityInfo.EntityValue is BaseEntity baseEntity)
            {
                // æ–°å¢žæ“ä½œ
                if (entityInfo.OperationType == DataFilterType.InsertByObject && entityInfo.PropertyName == nameof(BaseEntity.CreateDate))
@@ -96,14 +103,6 @@
                            baseEntity.Creater = App.User.UserName;
                            break;
                    }
                }
            }
            if (entityInfo.EntityValue is IBaseHistoryEntity baseHistoryEntity)
            {
                if (entityInfo.OperationType == DataFilterType.InsertByObject && entityInfo.PropertyName == nameof(IBaseHistoryEntity.InsertTime))
                {
                    baseHistoryEntity.InsertTime = DateTime.Now;
                }
            }
        }
ÏîÄ¿´úÂë/WMSÎÞ²Ö´¢°æ/WIDESEA_WMSServer/WIDESEA_Core/BaseRepository/RepositoryBase.cs
@@ -898,10 +898,6 @@
                            {
                                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));
@@ -915,188 +911,6 @@
            return DeleteData(entity);
        }
        //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)
@@ -1152,10 +966,5 @@
    }
    return DeleteData(entities);
}
        //List<TResult> QueryMuch<T, T2, T3, TResult>(
        //    Expression<Func<T, T2, T3, object[]>> joinExpression,
        //    Expression<Func<T, T2, T3, TResult>> selectExpression,
        //    Expression<Func<T, T2, T3, bool>> whereLambda = null) where T : class, new(){throw new NotImplementedException();}
        //Task<PageModel<TEntity>> QueryPage(PaginationModel pagination){throw new NotImplementedException();}
    }
}
ÏîÄ¿´úÂë/WMSÎÞ²Ö´¢°æ/WIDESEA_WMSServer/WIDESEA_DTO/ReturnMES/BarcodeReturnDTO.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,70 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace WIDESEA_DTO.ReturnMES
{
    /// <summary>
    ///
    /// </summary>
    public class BarcodeReturnDTO : BaseReturnDTO
    {
        /// <summary>
        ///
        /// </summary>
        public string OldmaterialCode {  get; set; }
        /// <summary>
        ///
        /// </summary>
        public string NewmaterialCode {  get; set; }
        /// <summary>
        ///
        /// </summary>
        public string Unit {  get; set; }
        /// <summary>
        ///
        /// </summary>
        public string FactoryArea {  get; set; }
        /// <summary>
        ///
        /// </summary>
        public decimal Qty {  get; set; }
        /// <summary>
        ///
        /// </summary>
        public string SupplyCode {  get; set; }
        /// <summary>
        ///
        /// </summary>
        public string BatchNo {  get; set; }
        /// <summary>
        ///
        /// </summary>
        public string MaterialCode {  get; set; }
        /// <summary>
        ///
        /// </summary>
        public string WarehouseCode {  get; set; }
        /// <summary>
        ///
        /// </summary>
        public int OperationType {  get; set; }
        /// <summary>
        ///
        /// </summary>
        public string Operator {  get; set; }
    }
}
ÏîÄ¿´úÂë/WMSÎÞ²Ö´¢°æ/WIDESEA_WMSServer/WIDESEA_IBasicService/MESOperation/IFeedbackMesService.cs
@@ -10,5 +10,7 @@
    public interface IFeedbackMesService : IDependency
    {
        WebResponseContent OutboundFeedback(string orderNo);
        WebResponseContent BarcodeFeedback(string newBarcode);
    }
}
ÏîÄ¿´úÂë/WMSÎÞ²Ö´¢°æ/WIDESEA_WMSServer/WIDESEA_Model/Models/Allocate/Dt_AllocateMaterialInfo.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,95 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using SqlSugar;
using WIDESEA_Core.DB.Models;
namespace WIDESEA_Model.Models
{
    /// <summary>
    ///
    /// </summary>
    [SugarTable(nameof(Dt_AllocateMaterialInfo))]
    public class Dt_AllocateMaterialInfo : BaseEntity
    {
        /// <summary>
        /// ä¸»é”®
        /// </summary>
        [SugarColumn(IsPrimaryKey = true, IsIdentity = true, ColumnDescription = "主键")]
        public int Id { get; set; }
        /// <summary>
        /// è®¢å•主键
        /// </summary>
        [SugarColumn(IsNullable = false, ColumnDescription = "订单主键")]
        public int OrderId { get; set; }
        /// <summary>
        /// è®¢å•号
        /// </summary>
        [SugarColumn(IsNullable = false, Length = 50, ColumnDescription = "订单号")]
        public string OrderNo { get; set; }
        /// <summary>
        /// ç‰©æ–™ç¼–号
        /// </summary>
        [SugarColumn(IsNullable = false, Length = 50, ColumnDescription = "物料编号")]
        public string MaterialCode { get; set; }
        /// <summary>
        /// ç‰©æ–™åç§°
        /// </summary>
        [SugarColumn(IsNullable = true, Length = 200, ColumnDescription = "物料名称")]
        public string MaterialName { get; set; }
        /// <summary>
        /// åŽ‚åŒº
        /// </summary>
        [SugarColumn(IsNullable = true, Length = 20, ColumnDescription = "厂区")]
        public string FactoryArea { get; set; }
        /// <summary>
        /// æ‰¹æ¬¡
        /// </summary>
        [SugarColumn(IsNullable = true, Length = 50, ColumnDescription = "批次")]
        public string BatchNo { get; set; }
        /// <summary>
        /// æ•°é‡
        /// </summary>
        [SugarColumn(IsNullable = false, DecimalDigits = 3, ColumnDescription = "数量")]
        public decimal Quantity { get; set; }
        /// <summary>
        /// å•位
        /// </summary>
        [SugarColumn(IsNullable = false, Length = 20, ColumnDescription = "单位")]
        public string Unit { get; set; }
        /// <summary>
        /// ä¾›åº”商
        /// </summary>
        [SugarColumn(IsNullable = true, Length = 50, ColumnDescription = "供应商")]
        public string SupplyCode { get; set; }
        /// <summary>
        /// ä»“库
        /// </summary>
        [SugarColumn(IsNullable = true, Length = 50, ColumnDescription = "仓库")]
        public string WarehouseCode { get; set; }
        /// <summary>
        /// ç‰©æ–™ç 
        /// </summary>
        [SugarColumn(IsNullable = false, Length = 50, ColumnDescription = "物料码")]
        public string Barcode { get; set; }
        /// <summary>
        /// å¤‡æ³¨
        /// </summary>
        [SugarColumn(IsNullable = true, Length = 500, ColumnDescription = "备注")]
        public string Remark { get; set; }
    }
}
ÏîÄ¿´úÂë/WMSÎÞ²Ö´¢°æ/WIDESEA_WMSServer/WIDESEA_Model/Models/Basic/Dt_MaterielCodeInfo.cs
@@ -40,6 +40,18 @@
        public string? SuplierCode { get; set; }
        /// <summary>
        ///
        /// </summary>
        [SugarColumn(IsNullable = true)]
        public int? OrderId { get; set; }
        /// <summary>
        ///
        /// </summary>
        [SugarColumn(IsNullable = true, Length = 50)]
        public string? OrderNo { get; set; }
        /// <summary>
        /// é‡‡è´­å•号
        /// </summary>
        [SugarColumn(IsNullable = true, Length = 50, ColumnDescription = "采购单号")]
@@ -62,6 +74,12 @@
        /// </summary>
        [SugarColumn(IsNullable = true, Length = 50, ColumnDescription = "厂区")]
        public string? FactoryArea { get; set; }
        /// <summary>
        ///
        /// </summary>
        [SugarColumn(IsNullable = true, Length = 50, ColumnDescription = "厂区")]
        public string? WarehouseCode { get; set; }
        /// <summary>
        /// æ—¥æœŸ
@@ -101,6 +119,12 @@
        public string Unit {  get; set; }
        /// <summary>
        ///
        /// </summary>
        [SugarColumn(IsNullable = false)]
        public int ReturnStatus { get; set; }
        /// <summary>
        /// å¤‡æ³¨
        /// </summary>
        [SugarColumn(IsNullable = true, Length = 500, ColumnDescription = "备注")]
ÏîÄ¿´úÂë/WMSÎÞ²Ö´¢°æ/WIDESEA_WMSServer/WIDESEA_Model/Models/Record/Dt_MesReturnRecord.cs
@@ -17,12 +17,6 @@
        public int Id { get; set; }
        /// <summary>
        /// å•据类型
        /// </summary>
        [SugarColumn(IsNullable = false)]
        public int OrderType { get; set; }
        /// <summary>
        /// å•据主表ID
        /// </summary>
        [SugarColumn(IsNullable = false)]
ÏîÄ¿´úÂë/WMSÎÞ²Ö´¢°æ/WIDESEA_WMSServer/WIDESEA_OutboundService/OutboundService.cs
@@ -1,4 +1,5 @@
using AutoMapper;
using System.Reflection.Emit;
using AutoMapper;
using Dm.filter;
using MailKit.Search;
using Mapster;
@@ -7,7 +8,6 @@
using Org.BouncyCastle.Asn1.Ocsp;
using Org.BouncyCastle.Crypto;
using SqlSugar;
using System.Reflection.Emit;
using WIDESEA_BasicService;
using WIDESEA_Common.CommonEnum;
using WIDESEA_Common.LocationEnum;
@@ -26,6 +26,7 @@
using WIDESEA_IRecordService;
using WIDESEA_IStockService;
using WIDESEA_Model.Models;
using static HslCommunication.Profinet.Knx.KnxCode;
namespace WIDESEA_OutboundService
{
@@ -56,6 +57,8 @@
        private readonly IRepository<Dt_Task> _taskRepository;
        private readonly ILocationInfoService _locationInfoService;
        private readonly IESSApiService _eSSApiService;
        private readonly IRepository<Dt_AllocateOrder> _allocateOrderRepository;
        private readonly IRepository<Dt_AllocateMaterialInfo> _allocateMaterialInfoRepository;
        private Dictionary<string, string> stations = new Dictionary<string, string>
        {
@@ -69,7 +72,7 @@
            {"3-1","3-5" },
        };
        public OutboundService(IMapper mapper, IUnitOfWorkManage unitOfWorkManage, IRepository<Dt_OutboundOrderDetail> detailRepository, IRepository<Dt_OutboundOrder> outboundRepository, IRepository<Dt_OutStockLockInfo> outboundLockInfoRepository, IRepository<Dt_StockInfo> stockInfoRepository, IRepository<Dt_StockInfoDetail> stockDetailRepository, IRepository<Dt_StockQuantityChangeRecord> stockChangeRepository, IRepository<Dt_StockInfoDetail_Hty> stockDetailHistoryRepository, IBasicService basicService, IOutboundOrderDetailService outboundOrderDetailService, IOutboundOrderService outboundOrderService, IOutStockLockInfoService outboundStockLockInfoService, IFeedbackMesService feedbackMesService, IRepository<Dt_Task> taskRepository, ILocationInfoService locationInfoService, IESSApiService eSSApiService)
        public OutboundService(IMapper mapper, IUnitOfWorkManage unitOfWorkManage, IRepository<Dt_OutboundOrderDetail> detailRepository, IRepository<Dt_OutboundOrder> outboundRepository, IRepository<Dt_OutStockLockInfo> outboundLockInfoRepository, IRepository<Dt_StockInfo> stockInfoRepository, IRepository<Dt_StockInfoDetail> stockDetailRepository, IRepository<Dt_StockQuantityChangeRecord> stockChangeRepository, IRepository<Dt_StockInfoDetail_Hty> stockDetailHistoryRepository, IBasicService basicService, IOutboundOrderDetailService outboundOrderDetailService, IOutboundOrderService outboundOrderService, IOutStockLockInfoService outboundStockLockInfoService, IFeedbackMesService feedbackMesService, IRepository<Dt_Task> taskRepository, ILocationInfoService locationInfoService, IESSApiService eSSApiService, IRepository<Dt_AllocateOrder> allocateOrderRepository, IRepository<Dt_AllocateMaterialInfo> allocateMaterialInfoRepository)
        {
            _mapper = mapper;
            _unitOfWorkManage = unitOfWorkManage;
@@ -90,6 +93,8 @@
            _taskRepository = taskRepository;
            _locationInfoService = locationInfoService;
            _eSSApiService = eSSApiService;
            _allocateOrderRepository = allocateOrderRepository;
            _allocateMaterialInfoRepository = allocateMaterialInfoRepository;
        }
        #region å‡ºåº“分配
@@ -838,8 +843,7 @@
        }
        #endregion
        #region æ•´ç®±å‡ºåº“
        public WebResponseContent CompleteOutboundWithPallet(OutboundCompletePalletRequestDTO request)
        {
            WebResponseContent content = WebResponseContent.Instance;
@@ -953,6 +957,34 @@
                    // æ•´ç®±å‡ºåº“无需拆包
                    PerformFullOutboundOperation(stockInfo, request, lockInfo.TaskNum.GetValueOrDefault());
                    if (outboundOrder.OrderType != 0)
                    {
                        Dt_AllocateOrder allocateOrder = _allocateOrderRepository.QueryFirst(x => x.OrderNo == outboundOrder.OrderNo);
                        if (allocateOrder != null)
                        {
                            List<Dt_AllocateMaterialInfo> allocateMaterialInfos = new List<Dt_AllocateMaterialInfo>();
                            foreach (var item in stockInfo.Details)
                            {
                                Dt_AllocateMaterialInfo allocateMaterialInfo = new Dt_AllocateMaterialInfo()
                                {
                                    Barcode = item.Barcode,
                                    BatchNo = item.BatchNo,
                                    FactoryArea = item.FactoryArea,
                                    MaterialCode = item.MaterielCode,
                                    MaterialName = item.MaterielName,
                                    OrderId = outboundOrder.Id,
                                    OrderNo = outboundOrder.OrderNo,
                                    Quantity = item.StockQuantity,
                                    SupplyCode = item.SupplyCode,
                                    Unit = item.Unit,
                                    WarehouseCode = allocateOrder.ToWarehouse
                                };
                                allocateMaterialInfos.Add(allocateMaterialInfo);
                            }
                            _allocateMaterialInfoRepository.AddData(allocateMaterialInfos);
                        }
                    }
                    decimal allocatedQuantity = actualOutboundQuantity;
                    List<Dt_OutboundOrderDetail> updateDetails = new();
@@ -1163,6 +1195,7 @@
            _stockDetailRepository.DeleteData(stockInfo.Details);
            _stockChangeRepository.AddData(changeRecords);
        }
        #endregion
        #region æ‹£é€‰
        /// <summary>
@@ -1269,21 +1302,76 @@
                // 8. åˆ¤æ–­æ˜¯å¦éœ€è¦æ‹†åŒ…(当出库数量小于库存数量时需要拆包)
                bool isUnpacked = actualOutboundQuantity < stockDetail.StockQuantity;
                List<MaterialCodeReturnDTO> returnDTOs = new List<MaterialCodeReturnDTO>();
                string newBarcode = string.Empty;
                // 9. å¼€å¯äº‹åŠ¡
                _unitOfWorkManage.BeginTran();
                try
                {
                    decimal beforeQuantity = stockDetail.StockQuantity; // åŽŸå§‹åº“å­˜é‡
                    Dt_AllocateMaterialInfo allocateMaterialInfo = new Dt_AllocateMaterialInfo();
                    // æ ¹æ®æ˜¯å¦æ‹†åŒ…执行不同的操作
                    if (isUnpacked)
                    {
                        returnDTOs = PerformUnpackOperation(stockDetail, stockInfo, actualOutboundQuantity, request, beforeQuantity, lockInfo.TaskNum.GetValueOrDefault());
                        (string NewBarcode, List<MaterialCodeReturnDTO> MaterialCodeReturnDTOs) result = PerformUnpackOperation(stockDetail, stockInfo, actualOutboundQuantity, request, beforeQuantity, lockInfo.TaskNum.GetValueOrDefault(), outboundOrder.Id, outboundOrder.OrderNo);
                        returnDTOs = result.MaterialCodeReturnDTOs;
                        newBarcode = result.NewBarcode;
                        MaterialCodeReturnDTO returnDTO = returnDTOs.First(x => x.Barcode == newBarcode);
                        if (outboundOrder.OrderType != 0)
                        {
                            allocateMaterialInfo = new Dt_AllocateMaterialInfo()
                            {
                                Barcode = returnDTO.Barcode,
                                BatchNo = returnDTO.BatchNo,
                                FactoryArea = returnDTO.FactoryArea,
                                MaterialCode = returnDTO.MaterialCode,
                                MaterialName = returnDTO.MaterialName,
                                OrderId = outboundOrder.Id,
                                OrderNo = outboundOrder.OrderNo,
                                Quantity = returnDTO.Quantity,
                                SupplyCode = returnDTO.SuplierCode,
                                Unit = stockDetail.Unit
                            };
                        }
                    }
                    else
                    {
                        PerformFullOutboundOperation(stockDetail, stockInfo, actualOutboundQuantity, request, beforeQuantity, lockInfo.TaskNum.GetValueOrDefault());
                        if (outboundOrder.OrderType != 0)
                        {
                            allocateMaterialInfo = new Dt_AllocateMaterialInfo()
                            {
                                Barcode = stockDetail.Barcode,
                                BatchNo = stockDetail.BatchNo,
                                FactoryArea = stockDetail.FactoryArea,
                                MaterialCode = stockDetail.MaterielCode,
                                MaterialName = stockDetail.MaterielName,
                                OrderId = outboundOrder.Id,
                                OrderNo = outboundOrder.OrderNo,
                                Quantity = stockDetail.StockQuantity,
                                SupplyCode = stockDetail.SupplyCode,
                                Unit = stockDetail.Unit
                            };
                        }
                    }
                    // åˆ¤æ–­æ˜¯å¦æ˜¯è°ƒæ‹¨å•
                    if (outboundOrder.OrderType != 0)
                    {
                        Dt_AllocateOrder allocateOrder = _allocateOrderRepository.QueryFirst(x => x.OrderNo == outboundOrder.OrderNo);
                        if (allocateOrder != null)
                        {
                            allocateMaterialInfo.WarehouseCode = allocateOrder.ToWarehouse;
                            _allocateMaterialInfoRepository.AddData(allocateMaterialInfo);
                        }
                    }
                    decimal allocatedQuantity = actualOutboundQuantity;
@@ -1385,6 +1473,12 @@
                    response.ScannedDetail = scannedDetail;
                    response.UpdatedDetails = updateDetails;
                    if (!string.IsNullOrEmpty(newBarcode))
                    {
                        // ç‰©æ–™æ–°æ¡ç å›žä¼ 
                        _feedbackMesService.BarcodeFeedback(newBarcode);
                    }
                    // æ£€æŸ¥å‡ºåº“单是否完成
                    if (CheckOutboundOrderCompleted(request.OrderNo))
                    {
@@ -1458,14 +1552,14 @@
        /// <param name="beforeQuantity"></param>
        /// <param name="taskNum"></param>
        /// <returns></returns>
        private List<MaterialCodeReturnDTO> PerformUnpackOperation(Dt_StockInfoDetail stockDetail, Dt_StockInfo stockInfo,
            decimal actualOutboundQuantity, OutboundCompleteRequestDTO request, decimal beforeQuantity, int taskNum)
        private (string NewBarcode, List<MaterialCodeReturnDTO> MaterialCodeReturnDTOs) PerformUnpackOperation(Dt_StockInfoDetail stockDetail, Dt_StockInfo stockInfo,
            decimal actualOutboundQuantity, OutboundCompleteRequestDTO request, decimal beforeQuantity, int taskNum, int orderId, string orderNo)
        {
            string newBarcode = GenerateNewBarcode();
            string remark = $"拆包记录,原条码:{request.Barcode},原数量:{stockDetail.StockQuantity},出库条码:{newBarcode}, å‡ºåº“数量:{actualOutboundQuantity},回库条码:{request.Barcode},回库数量:{stockDetail.StockQuantity - actualOutboundQuantity},操作者:{request.Operator}";
            List<Dt_MaterialCodeInfo> materialCodeInfos = CreateMaterialCodeInfos(stockDetail, newBarcode, actualOutboundQuantity, remark);
            List<Dt_MaterialCodeInfo> materialCodeInfos = CreateMaterialCodeInfos(stockDetail, newBarcode, actualOutboundQuantity, remark, taskNum, orderId, orderNo);
            List<MaterialCodeReturnDTO> returnDTOs = _mapper.Map<List<MaterialCodeReturnDTO>>(materialCodeInfos);
@@ -1491,7 +1585,7 @@
                SupplyCode = stockDetail.SupplyCode,
                FactoryArea = stockDetail.FactoryArea,
                WarehouseCode = stockDetail.WarehouseCode,
                Remark = $"拆包前原始记录,原条码:{request.Barcode},原数量:{stockDetail.StockQuantity},出库数量:{actualOutboundQuantity},操作者:{request.Operator}"
                Remark = $"拆包前原始记录,出库单号:{orderNo},出库单主键:{orderId},原条码:{request.Barcode},原数量:{stockDetail.StockQuantity},出库数量:{actualOutboundQuantity},操作者:{request.Operator}"
            };
            _stockDetailHistoryRepository.AddData(originalHistoryRecord);
@@ -1502,7 +1596,7 @@
                // æ›´æ–°åŽŸåº“å­˜æ˜Žç»†
                stockDetail.StockQuantity = remainingQuantity;
                //stockDetail.Barcode = newBarcode;
                stockDetail.Remark = $"拆包后更新,原条码:{request.Barcode},新数量:{remainingQuantity},操作者:{request.Operator}";
                stockDetail.Remark = $"拆包后更新,出库单号:{orderNo},出库单主键:{orderId},原条码:{request.Barcode},新数量:{remainingQuantity},操作者:{request.Operator}";
                _stockDetailRepository.UpdateData(stockDetail);
            }
@@ -1524,11 +1618,11 @@
                AfterQuantity = beforeQuantity - actualOutboundQuantity,
                SupplyCode = stockDetail.SupplyCode,
                WarehouseCode = stockDetail.WarehouseCode,
                Remark = $"拆包出库,原条码:{request.Barcode},新条码:{newBarcode},出库数量:{actualOutboundQuantity},剩余:{remainingQuantity},操作者:{request.Operator}"
                Remark = $"拆包出库,出库单号:{orderNo},出库单主键:{orderId},原条码:{request.Barcode},新条码:{newBarcode},出库数量:{actualOutboundQuantity},剩余:{remainingQuantity},操作者:{request.Operator}"
            };
            _stockChangeRepository.AddData(unpackChangeRecord);
            return returnDTOs;
            return (newBarcode, returnDTOs);
        }
        /// <summary>
@@ -1612,7 +1706,7 @@
        /// <param name="afterQuantity"></param>
        /// <param name="remark"></param>
        /// <returns></returns>
        private List<Dt_MaterialCodeInfo> CreateMaterialCodeInfos(Dt_StockInfoDetail stockDetail, string newBarcode, decimal splitQuantity, string remark)
        private List<Dt_MaterialCodeInfo> CreateMaterialCodeInfos(Dt_StockInfoDetail stockDetail, string newBarcode, decimal splitQuantity, string remark, int taskNum, int orderId, string orderNo)
        {
            List<Dt_MaterialCodeInfo> materialCodeInfos = new List<Dt_MaterialCodeInfo>();
@@ -1633,7 +1727,11 @@
                SuplierCode = stockDetail.SupplyCode,
                Unit = stockDetail.Unit,
                Date = DateTime.Now.ToString("yyyy-MM-dd"),
                Remark = remark
                Remark = remark,
                WarehouseCode = stockDetail.WarehouseCode,
                OrderNo = orderNo,
                OrderId = orderId,
                ReturnStatus = 0
            };
            materialCodeInfos.Add(outMaterialCodeInfo);
@@ -1652,7 +1750,11 @@
                SuplierCode = stockDetail.SupplyCode,
                Unit = stockDetail.Unit,
                Date = DateTime.Now.ToString("yyyy-MM-dd"),
                Remark = remark
                Remark = remark,
                WarehouseCode = stockDetail.WarehouseCode,
                OrderNo = orderNo,
                OrderId = orderId,
                ReturnStatus = 0
            };
            materialCodeInfos.Add(returnMaterialCodeInfo);
@@ -1742,7 +1844,7 @@
        #endregion
        #region
        #region å›žåº“
        public async Task<WebResponseContent> ReturnToWarehouse(string palletCode, string OrderNo, string station)
        {
            WebResponseContent content = new WebResponseContent();