dengjunjie
5 天以前 3ca1401ff81f256f54533110b48c68e7fa6bfca5
整体流程代码优化
已修改23个文件
已添加3个文件
2309 ■■■■ 文件已修改
新建文件夹/WIDESEA_WMSServer/ClassLibrary1/IMaterielInfoService.cs 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
新建文件夹/WIDESEA_WMSServer/ClassLibrary2/ContainerService.cs 52 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
新建文件夹/WIDESEA_WMSServer/ClassLibrary2/EquipmentAlarmInforService.cs 315 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
新建文件夹/WIDESEA_WMSServer/ClassLibrary2/MaterielInfoService.cs 276 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
新建文件夹/WIDESEA_WMSServer/WIDESEA_Core/Helper/HttpHelper.cs 9 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
新建文件夹/WIDESEA_WMSServer/WIDESEA_ISquareCabinServices/IBusiness.cs 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
新建文件夹/WIDESEA_WMSServer/WIDESEA_ISquareCabinServices/ICabinOrderServices.cs 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
新建文件夹/WIDESEA_WMSServer/WIDESEA_ISquareCabinServices/IDeliveryOrderServices.cs 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
新建文件夹/WIDESEA_WMSServer/WIDESEA_ISquareCabinServices/IMedicineGoodsServices.cs 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
新建文件夹/WIDESEA_WMSServer/WIDESEA_SquareCabinServices/Business.cs 426 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
新建文件夹/WIDESEA_WMSServer/WIDESEA_SquareCabinServices/CabinOrderServices.cs 108 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
新建文件夹/WIDESEA_WMSServer/WIDESEA_SquareCabinServices/DeliveryOrderServices.cs 235 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
新建文件夹/WIDESEA_WMSServer/WIDESEA_SquareCabinServices/InventoryServices.cs 91 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
新建文件夹/WIDESEA_WMSServer/WIDESEA_SquareCabinServices/LKBusiness/CabinOrderServicesLK.cs 231 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
新建文件夹/WIDESEA_WMSServer/WIDESEA_SquareCabinServices/LKBusiness/DeliveryOrderServicesLK.cs 119 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
新建文件夹/WIDESEA_WMSServer/WIDESEA_SquareCabinServices/MedicineGoodsServices.cs 227 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
新建文件夹/WIDESEA_WMSServer/WIDESEA_SquareCabinServices/NewBusiness.cs 154 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
新建文件夹/WIDESEA_WMSServer/WIDESEA_WMSServer/AlarmJob.cs 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
新建文件夹/WIDESEA_WMSServer/WIDESEA_WMSServer/Controllers/SquareCabin/CabinOrderController.cs 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
新建文件夹/WIDESEA_WMSServer/WIDESEA_WMSServer/Controllers/SquareCabin/MedicineGoodsController.cs 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
新建文件夹/WIDESEA_WMSServer/WIDESEA_WMSServer/Controllers/WMSInfo/MaterielInfoController.cs 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
新建文件夹/WIDESEA_WMSServer/WIDESEA_WMSServer/GoodsJob.cs 13 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
新建文件夹/WIDESEA_WMSServer/WIDESEA_WMSServer/InOrderJob.cs 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
新建文件夹/WIDESEA_WMSServer/WIDESEA_WMSServer/OutOrderJob.cs 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
新建文件夹/WIDESEA_WMSServer/WIDESEA_WMSServer/appsettings.json 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
新建文件夹/WMS/src/extension/inbound/inboundOrder.js 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
н¨Îļþ¼Ð/WIDESEA_WMSServer/ClassLibrary1/IMaterielInfoService.cs
@@ -3,6 +3,7 @@
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using WIDESEA_Core;
using WIDESEA_Core.BaseRepository;
using WIDESEA_Core.BaseServices;
using WIDESEA_Model.Models;
@@ -12,5 +13,8 @@
    public interface IMaterielInfoService : IService<Dt_MaterielInfo>
    {
        IRepository<Dt_MaterielInfo> Repository { get; }
        WebResponseContent GetMedicineGoodsInfom();
        WebResponseContent ProductSynchronous();
    }
}
н¨Îļþ¼Ð/WIDESEA_WMSServer/ClassLibrary2/ContainerService.cs
@@ -38,6 +38,58 @@
                var url = "http://172.16.1.4:8082/api/environment/sensor";
                var result = HttpHelper.Get(url);
                var response = JsonConvert.DeserializeObject<CollResponse<CoolDto>>(result);
                if (response == null || response.code != "000") throw new Exception("接口返回数据报错");
                var deviceNames = response.data.Select(x => x.name?.Trim()).Distinct().ToList();
                var containers = BaseDal.QueryData(x => deviceNames.Contains(x.deviceName)).ToList();
                List<Dt_Container> containersAdd = new List<Dt_Container>();
                List<Dt_Container> containersUp = new List<Dt_Container>();
                foreach (var item in response.data)
                {
                    Dt_Container? container = containers.Where(x => x.deviceName == item.name).FirstOrDefault();
                    if (container == null)
                    {
                        container = new Dt_Container()
                        {
                            deviceName = item.name,
                            Alarm = item.alarm,
                            CurrentTemperature = item.temperature,
                            Humidity = item.humidity,
                            CreateDate = DateTime.Now,
                            AlarmInformation = item.message
                        };
                        containersAdd.Add(container);
                    }
                    else
                    {
                        container.Alarm = item.alarm;
                        container.CurrentTemperature = item.temperature;
                        container.Humidity = item.humidity;
                        container.AlarmInformation = item.message;
                        container.ModifyDate = DateTime.Now;
                        containersUp.Add(container);
                    }
                    if (item.alarm != "正常")
                    {
                        _messageInfoService.AddMessageInfo(MessageGroupByEnum.EquipmentAlarm,
                            $"冷柜{item.alarm}", item.message, MessageStatusEnum.Undisposed);
                    }
                }
                if (containersAdd.Count > 0) BaseDal.AddData(containersAdd);
                if (containersUp.Count > 0) BaseDal.UpdateData(containersUp);
                return WebResponseContent.Instance.OK();
            }
            catch (Exception ex)
            {
                return WebResponseContent.Instance.Error(ex.Message);
            }
        }
        public WebResponseContent Sensor1()
        {
            try
            {
                var url = "http://172.16.1.4:8082/api/environment/sensor";
                var result = HttpHelper.Get(url);
                var response = JsonConvert.DeserializeObject<CollResponse<CoolDto>>(result);
                if (response.code != "000" || response.data == null)
                {
н¨Îļþ¼Ð/WIDESEA_WMSServer/ClassLibrary2/EquipmentAlarmInforService.cs
@@ -22,28 +22,111 @@
    public class EquipmentAlarmInforService : ServiceBase<Dt_EquipmentAlarmInfor, IRepository<Dt_EquipmentAlarmInfor>>, IEquipmentAlarmInforService
    {
        private readonly IMessageInfoService _messageInfoService;
        private readonly IUnitOfWorkManage _unitOfWorkManage;
        public EquipmentAlarmInforService(IRepository<Dt_EquipmentAlarmInfor> BaseDal, IMessageInfoService messageInfoService) : base(BaseDal)
        public EquipmentAlarmInforService(IRepository<Dt_EquipmentAlarmInfor> BaseDal, IMessageInfoService messageInfoService, IUnitOfWorkManage unitOfWorkManage) : base(BaseDal)
        {
            _messageInfoService = messageInfoService;
            _unitOfWorkManage = unitOfWorkManage;
        }
        public WebResponseContent getDeviceStatus()
        {
            WebResponseContent content = new WebResponseContent();
            try
            {
                var url = "http://172.16.1.2:8080/cube/taskInfo/getDeviceStatus?token=wH5zdAUCv2BEHJIinmowyki8cdc5ge8fAwFDcYZs0bVldNgmORt0O0l4GJTDv1dglRdMxb9xDK5Qb3NJAqL1Li2GkfdVa3KnIkfrQZtsP7UXhMmUz6xEuztG6d5svAJO9HENLb8JWVqCfpO2EWV6ebo/g5tJ9x7kbwwAxvCBrWdiEJv09FvaRQ==  ";
                var result = HttpHelper.Get(url);
                var response = JsonConvert.DeserializeObject<AGVResponse<DeviceStatusData>>(result);
                if (response == null || response.code != "0" || response.data == null) return content.Error($"获取设备信息失败: {response?.msg}");
                List<string> codes = new List<string>();
                if (response.data.robot.Count < 1 || response.data.sorters.Count < 0) return content.Error($"获取设备信息为空: {response?.msg}");
                // å¤„理机器人设备数据
                codes.AddRange(response.data.robot.Select(x => x.robotCode).ToList());
                // å¤„理分拣台设备数据
                codes.AddRange(response.data.sorters.Select(x => x.sorterCode).ToList());
                if (codes.Count < 1) return content;
                List<Dt_EquipmentAlarmInfor> equipmentAlarmInfors = BaseDal.QueryData(x => codes.Contains(x.RobotCode));
                List<Dt_EquipmentAlarmInfor> equipmentAlarmInforsAdd = new List<Dt_EquipmentAlarmInfor>();
                List<Dt_EquipmentAlarmInfor> equipmentAlarmInforsUp = new List<Dt_EquipmentAlarmInfor>();
                foreach (var item in response.data.robot)
                {
                    Dt_EquipmentAlarmInfor? equipmentAlarmInfor = equipmentAlarmInfors.Where(x => x.RobotCode == item.robotCode).FirstOrDefault();
                    if (equipmentAlarmInfor == null)
                    {
                        equipmentAlarmInfor = new Dt_EquipmentAlarmInfor()
                        {
                            RobotCode = item.robotCode,
                            RobotName = item.robotName,
                            Status = item.status,
                            SyncTime = DateTime.Now,
                            CreateDate = DateTime.Now,
                        };
                        equipmentAlarmInforsAdd.Add(equipmentAlarmInfor);
                    }
                    else
                    {
                        equipmentAlarmInfor.RobotName = item.robotName;
                        equipmentAlarmInfor.Status = item.status;
                        equipmentAlarmInfor.SyncTime = DateTime.Now;
                        equipmentAlarmInforsUp.Add(equipmentAlarmInfor);
                    }
                    if (string.Equals(item.status, nameof(DeviceStatus.Error), StringComparison.OrdinalIgnoreCase))
                    {
                        _messageInfoService.AddMessageInfo(MessageGroupByEnum.EquipmentAlarm, item.robotName, item.status);
                    }
                }
                foreach (var item in response.data.sorters)
                {
                    Dt_EquipmentAlarmInfor? equipmentAlarmInfor = equipmentAlarmInfors.Where(x => x.RobotCode == item.sorterCode).FirstOrDefault();
                    if (equipmentAlarmInfor == null)
                    {
                        equipmentAlarmInfor = new Dt_EquipmentAlarmInfor()
                        {
                            RobotCode = item.sorterCode,
                            RobotName = item.sorterName,
                            Status = item.status,
                            SyncTime = DateTime.Now,
                            CreateDate = DateTime.Now,
                        };
                        equipmentAlarmInforsAdd.Add(equipmentAlarmInfor);
                    }
                    else
                    {
                        equipmentAlarmInfor.RobotName = item.sorterCode;
                        equipmentAlarmInfor.Status = item.status;
                        equipmentAlarmInfor.SyncTime = DateTime.Now;
                        equipmentAlarmInforsUp.Add(equipmentAlarmInfor);
                    }
                    if (string.Equals(item.status, nameof(DeviceStatus.Error), StringComparison.OrdinalIgnoreCase))
                    {
                        _messageInfoService.AddMessageInfo(MessageGroupByEnum.EquipmentAlarm, item.sorterCode, item.status);
                    }
                }
                if (equipmentAlarmInforsAdd.Count > 0) BaseDal.AddData(equipmentAlarmInforsAdd);
                if (equipmentAlarmInforsUp.Count > 0) BaseDal.UpdateData(equipmentAlarmInforsUp);
            }
            catch (Exception ex)
            {
                content.Error(ex.Message);
            }
            return content;
        }
        /// <summary>
        /// æŸ¥çœ‹ç«‹åº“小车报警信息
        /// </summary>
        /// <returns></returns>
        public WebResponseContent getDeviceStatus()
        public WebResponseContent getDeviceStatus1()
        {
            try
            {
                var url = "http://172.16.1.2:8080/cube/taskInfo/getDeviceStatus?token=wH5zdAUCv2BEHJIinmowyki8cdc5ge8fAwFDcYZs0bVldNgmORt0O0l4GJTDv1dglRdMxb9xDK5Qb3NJAqL1Li2GkfdVa3KnIkfrQZtsP7UXhMmUz6xEuztG6d5svAJO9HENLb8JWVqCfpO2EWV6ebo/g5tJ9x7kbwwAxvCBrWdiEJv09FvaRQ==  ";
                var result = HttpHelper.Get(url);
                var response = JsonConvert.DeserializeObject<AGVResponse<DeviceStatusData>>(result);
                // æ£€æŸ¥æŽ¥å£å“åº”是否成功
                if (response == null || response.code != "0")
@@ -52,113 +135,86 @@
                }
                var syncTime = DateTime.Now;
                var saveCount = 0;
                var AddEquipList = new List<Dt_EquipmentAlarmInfor>();
                var UpdateEquipList = new List<Dt_EquipmentAlarmInfor>();
                var alarmList = new List<(string deviceType, string deviceName, string deviceCode)>();
                // æ”¶é›†æ‰€æœ‰è®¾å¤‡ç¼–码,一次性查询
                var allDeviceCodes = new List<string>();
                if (response.data?.robot != null && response.data.robot.Count > 0)
                {
                    allDeviceCodes.AddRange(response.data.robot.Select(x => x.robotCode));
                }
                if (response.data?.sorters != null && response.data.sorters.Count > 0)
                {
                    allDeviceCodes.AddRange(response.data.sorters.Select(x => x.sorterCode));
                }
                // ä¸€æ¬¡æ€§æŸ¥è¯¢æ‰€æœ‰å·²å­˜åœ¨çš„设备记录
                var existingRecords = allDeviceCodes.Any()
                    ? BaseDal.QueryData(x => allDeviceCodes.Contains(x.RobotCode))
                         .ToDictionary(x => x.RobotCode, x => x)
                    : new Dictionary<string, Dt_EquipmentAlarmInfor>();
                // å¤„理机器人设备数据
                if (response.data?.robot != null && response.data.robot.Any())
                if (response.data?.robot != null && response.data.robot.Count > 0)
                {
                    foreach (var robot in response.data.robot)
                    {
                        // æ ¹æ®è®¾å¤‡ç¼–码查询是否存在记录
                        var existingRecord = BaseDal.QueryData(x => x.RobotCode == robot.robotCode).FirstOrDefault();
                        if (existingRecord == null)
                        {
                            // åˆ›å»ºæ–°è®°å½•
                            var newRecord = new Dt_EquipmentAlarmInfor
                            {
                                RobotName = robot.robotName,
                                RobotCode = robot.robotCode,
                                Status = robot.status,
                                SyncTime = syncTime,
                                CreateDate = syncTime,
                                Creater = "System"
                            };
                            BaseDal.AddData(newRecord);
                            if (robot.status == "error")
                            {
                                _messageInfoService.AddMessageInfo(MessageGroupByEnum.EquipmentAlarm, "小车名称:" + robot.robotName, $"小车编号【{robot.robotCode}】发生错误", MessageStatusEnum.Emergency);
                            }
                        }
                        else
                        {
                            // æ›´æ–°çŽ°æœ‰è®°å½•
                            existingRecord.RobotName = robot.robotName;
                            existingRecord.Status = robot.status;
                            existingRecord.SyncTime = syncTime;
                            existingRecord.ModifyDate = syncTime;
                            existingRecord.Modifier = "System";
                            BaseDal.UpdateData(existingRecord);
                            if (robot.status == "error")
                            {
                                _messageInfoService.AddMessageInfo(MessageGroupByEnum.EquipmentAlarm, "小车名称:" + robot.robotName, $"小车编号【{robot.robotCode}】发生错误", MessageStatusEnum.Emergency);
                            }
                        }
                        saveCount++;
                        ProcessDevice(robot.robotCode, robot.robotName, robot.status, "机器人",
                            existingRecords, AddEquipList, UpdateEquipList, alarmList, syncTime);
                    }
                }
                // å¤„理分拣台设备数据
                if (response.data?.sorters != null && response.data.sorters.Any())
                if (response.data?.sorters != null && response.data.sorters.Count > 0)
                {
                    foreach (var sorter in response.data.sorters)
                    {
                        // æ ¹æ®è®¾å¤‡ç¼–码查询是否存在记录
                        var existingRecord = BaseDal.QueryData(x => x.RobotCode == sorter.sorterCode).FirstOrDefault();
                        if (existingRecord == null)
                        {
                            // åˆ›å»ºæ–°è®°å½•
                            var newRecord = new Dt_EquipmentAlarmInfor
                            {
                                RobotName = sorter.sorterName,
                                RobotCode = sorter.sorterCode,
                                Status = sorter.status,
                                SyncTime = syncTime,
                                CreateDate = syncTime,
                                Creater = "System"
                            };
                            BaseDal.AddData(newRecord);
                            if (sorter.status == "error")
                            {
                                _messageInfoService.AddMessageInfo(MessageGroupByEnum.EquipmentAlarm, "分拣台名称:" + sorter.sorterName, $"编号【{sorter.sorterCode}】发生错误", MessageStatusEnum.Emergency);
                            }
                        }
                        else
                        {
                            // æ›´æ–°çŽ°æœ‰è®°å½•
                            existingRecord.RobotName = sorter.sorterName;
                            existingRecord.Status = sorter.status;
                            existingRecord.SyncTime = syncTime;
                            existingRecord.ModifyDate = syncTime;
                            existingRecord.Modifier = "System";
                            BaseDal.UpdateData(existingRecord);
                            if (sorter.status == "error")
                            {
                                _messageInfoService.AddMessageInfo(MessageGroupByEnum.EquipmentAlarm, "分拣台名称:" + sorter.sorterName, $"编号【{sorter.sorterCode}】发生错误", MessageStatusEnum.Emergency);
                            }
                        }
                        saveCount++;
                        ProcessDevice(sorter.sorterCode, sorter.sorterName, sorter.status, "分拣台",
                            existingRecords, AddEquipList, UpdateEquipList, alarmList, syncTime);
                    }
                }
                //// è¿”回状态统计信息
                //var stateStats = response.data?.stateStatistics;
                //var statsInfo = stateStats != null ?
                //    $"可用:{stateStats.enable}, å……电:{stateStats.charging}, ä¸å¯ç”¨:{stateStats.disabled}, é”™è¯¯:{stateStats.error}, ç¦»åº“:{stateStats.down}, å ç”¨:{stateStats.occupied}"
                //    : "无统计信息";
                return new WebResponseContent
                // å¼€å¯äº‹åŠ¡
                //_unitOfWorkManage.BeginTran();
                try
                {
                    Status = true,
                    Message = $"同步成功,共处理 {saveCount} æ¡è®¾å¤‡è®°å½•。"
                };
                    // æ‰¹é‡æ“ä½œ
                    if (AddEquipList.Count > 0)
                    {
                        BaseDal.AddData(AddEquipList);
                    }
                    if (UpdateEquipList.Count > 0)
                    {
                        BaseDal.UpdateData(UpdateEquipList);
                    }
                    // æäº¤äº‹åŠ¡
                    //_unitOfWorkManage.CommitTran();
                    // å¤„理报警信息
                    ProcessAlarmMessages(alarmList);
                    var totalCount = AddEquipList.Count + UpdateEquipList.Count;
                    return new WebResponseContent
                    {
                        Status = true,
                        Message = $"同步成功,新增 {AddEquipList.Count} æ¡ï¼Œæ›´æ–° {UpdateEquipList.Count} æ¡ï¼Œå…±å¤„理 {totalCount} æ¡è®¾å¤‡è®°å½•。"
                    };
                }
                catch (Exception ex)
                {
                    //_unitOfWorkManage.RollbackTran();
                    return new WebResponseContent
                    {
                        Status = false,
                        Message = $"数据保存失败: {ex.Message}"
                    };
                }
            }
            catch (Exception ex)
            {
                // è®°å½•详细错误日志
                Console.WriteLine($"获取设备状态异常: {ex.Message}, StackTrace: {ex.StackTrace}");
                return new WebResponseContent
                {
                    Status = false,
@@ -166,5 +222,76 @@
                };
            }
        }
        /// <summary>
        /// å¤„理单个设备记录
        /// </summary>
        private void ProcessDevice(string deviceCode, string deviceName, string status, string deviceType,
            Dictionary<string, Dt_EquipmentAlarmInfor> existingRecords,
            List<Dt_EquipmentAlarmInfor> addList,
            List<Dt_EquipmentAlarmInfor> updateList,
            List<(string deviceType, string deviceName, string deviceCode)> alarmList,
            DateTime syncTime)
        {
            if (existingRecords.TryGetValue(deviceCode, out var existingRecord))
            {
                // æ£€æŸ¥çŠ¶æ€æ˜¯å¦å‘ç”Ÿå˜åŒ–ï¼Œé¿å…ä¸å¿…è¦çš„æ›´æ–°å’Œé‡å¤æŠ¥è­¦
                bool statusChanged = existingRecord.Status != status;
                // æ›´æ–°çŽ°æœ‰è®°å½•
                existingRecord.RobotName = deviceName;
                existingRecord.Status = status;
                existingRecord.SyncTime = syncTime;
                existingRecord.ModifyDate = syncTime;
                existingRecord.Modifier = "System";
                updateList.Add(existingRecord);
                // åªæœ‰çŠ¶æ€å˜ä¸ºerror时才报警
                if (statusChanged && status == "error")
                {
                    alarmList.Add((deviceType, deviceName, deviceCode));
                }
            }
            else
            {
                // åˆ›å»ºæ–°è®°å½•
                var newRecord = new Dt_EquipmentAlarmInfor
                {
                    RobotName = deviceName,
                    RobotCode = deviceCode,
                    Status = status,
                    SyncTime = syncTime,
                    CreateDate = syncTime,
                    Creater = "System"
                };
                addList.Add(newRecord);
                // æ–°è®¾å¤‡çŠ¶æ€ä¸ºerror时报警
                if (status == "error")
                {
                    alarmList.Add((deviceType, deviceName, deviceCode));
                }
            }
        }
        /// <summary>
        /// å¤„理报警信息
        /// </summary>
        private void ProcessAlarmMessages(List<(string deviceType, string deviceName, string deviceCode)> alarmList)
        {
            foreach (var alarm in alarmList)
            {
                string alarmTitle = alarm.deviceType == "机器人"
                    ? "小车名称:" + alarm.deviceName
                    : "分拣台名称:" + alarm.deviceName;
                string alarmMessage = alarm.deviceType == "机器人"
                    ? $"小车编号【{alarm.deviceCode}】发生错误"
                    : $"编号【{alarm.deviceCode}】发生错误";
                _messageInfoService.AddMessageInfo(MessageGroupByEnum.EquipmentAlarm, alarmTitle, alarmMessage, MessageStatusEnum.Emergency);
            }
        }
    }
}
}
н¨Îļþ¼Ð/WIDESEA_WMSServer/ClassLibrary2/MaterielInfoService.cs
@@ -6,12 +6,14 @@
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using WIDESEA_Common;
using WIDESEA_Core;
using WIDESEA_Core.BaseRepository;
using WIDESEA_Core.BaseServices;
using WIDESEA_Core.Helper;
using WIDESEA_IWMsInfoServices;
using WIDESEA_Model.Models;
using static WIDESEA_DTO.SquareCabin.OrderDto;
using static WIDESEA_DTO.SquareCabin.TowcsDto;
namespace WIDESEA_WMsInfoServices
@@ -22,6 +24,278 @@
        {
        }
        public IRepository<Dt_MaterielInfo> Repository => BaseDal;
        static string SearchDate = "2025-10-30 00:00:00";
        /// <summary>
        /// èŽ·å–è¯å“åŸºç¡€ä¿¡æ¯åŒæ­¥æŽ¥å£
        /// </summary>
        /// <returns></returns>
        public WebResponseContent GetMedicineGoodsInfom()
        {
            var responseContent = new WebResponseContent();
            try
            {
                var url = "http://121.37.118.63:80/GYZ2/95fck/goodsInfo";
                if (string.IsNullOrEmpty(SearchDate))
                {
                    // é»˜è®¤æŸ¥è¯¢è¿‡åŽ»24小时的数据
                    SearchDate = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
                }
                // è¯·æ±‚参数
                var requestData = new
                {
                    searchDate = SearchDate
                };
                SearchDate = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
                // å‘起请求
                var result = HttpHelper.Post(url, requestData.ToJsonString());
                // ååºåˆ—化
                var response = JsonConvert.DeserializeObject<UpstreamResponse<MedicationsInfo>>(result);
                if (response == null || response.resultCode != "0")
                {
                    // è°ƒç”¨å¼‚常接口
                    //SendErrorToUpstream(5, "", response.resultMsg ?? "上游接口返回失败", "");
                    return responseContent.Error(response?.resultMsg ?? "上游接口返回失败");
                }
                if (response.data.Count < 1)
                {
                    return responseContent.OK("无新药品数据");
                }
                var codes = response.data.Select(x => x.goods_no).ToList();
                //获取所有已存在的商品编号
                var existingGoodsNos = BaseDal.QueryData(x => codes.Contains(x.MaterielCode)).Select(x => x.MaterielCode).ToList();
                // æ”¶é›†æ‰€æœ‰è¦æ’入的实体
                var entityList = response.data.Where(Medicat => !existingGoodsNos.Contains(Medicat.goods_no)).Select(Medicat => new Dt_MaterielInfo
                {
                    MaterielCode = Medicat.goods_no,
                    MaterielErpType = Medicat.goods_type,
                    item = Medicat.goods_tym, //通用名
                    MaterielName = Medicat.goods_spm,//物料名称
                    Dosage_form = GetDosageForm(Medicat.dosage_form),//药剂
                    Barcode = Medicat.barcode,//条形吗
                    MaterielSpec = Medicat.model,
                    Factory = Medicat.factory,
                    MaterielUnit = Medicat.unit,//单位
                    MaterielSourceType = MaterielSourceTypeEnum.PurchasePart,
                    // ä½¿ç”¨ ?? è¿ç®—符提供默认值
                    MaterielLength = (float?)Medicat.item_length,
                    MaterielWide = (float?)Medicat.item_width,
                    MaterielHeight = (float?)Medicat.item_hight,
                    MaterielVolume = (float?)Medicat.item_volumn,
                    MaterielWeight = (float?)Medicat.item_weight,
                    MaterielStoragecondition = float.TryParse(Medicat.storage_confition, out var val) ? val : null, //储存条件
                    Remark = Medicat.remark,
                    GoodStatusState = "未下发",
                    ModifyDate = Medicat.modify_date
                }).ToList();
                // ä¸€æ¬¡æ€§æ‰¹é‡æ’入数据库
                BaseDal.AddData(entityList);
                //ProductSynchronous();
                return responseContent.OK("同步成功");
            }
            catch (Exception ex)
            {
                Console.WriteLine("获取ERP物料信息异常:" + ex.Message);
                //SendErrorToUpstream(5, "", ex.Message, "");
                return responseContent.Error(ex.Message);
            }
        }
        /// <summary>
        /// åˆ›å»ºè¯å‰‚å­—å…¸
        /// </summary>
        private static readonly Dictionary<string, string> _dosageFormMap = new Dictionary<string, string>
        {
            {"001", "片剂"}, {"002", "片剂"}, {"003", "片剂"}, {"004", "片剂"}, {"005", "片剂"},
            {"006", "片剂"}, {"007", "片剂"}, {"008", "片剂"}, {"009", "片剂"}, {"010", "片剂"},
            {"011", "其它"}, {"012", "片剂"}, {"013", "其它"}, {"014", "片剂"}, {"015", "片剂"},
            {"016", "片剂"}, {"017", "片剂"}, {"018", "其它"}, {"019", "其它"}, {"020", "其它"},
            {"021", "针剂"}, {"022", "针剂"}, {"023", "针剂"}, {"024", "针剂"}, {"025", "中成药"},
            {"026", "中成药"}, {"027", "其它"}, {"028", "其它"}, {"029", "其它"}, {"030", "其它"},
            {"031", "其它"}, {"032", "其它"}, {"033", "其它"}, {"034", "中成药"}, {"035", "中成药"},
            {"036", "中成药"}, {"037", "中成药"}, {"038", "其它"}, {"039", "其它"}, {"040", "其它"},
            {"041", "中成药"}, {"042", "中成药"}, {"043", "中成药"}, {"044", "其它"}, {"045", "中成药"},
            {"046", "中成药"}, {"047", "中成药"}, {"048", "中成药"}, {"049", "中成药"}, {"050", "中成药"},
            {"051", "中成药"}, {"052", "中成药"}, {"053", "中成药"}, {"054", "中成药"}, {"055", "中成药"},
            {"056", "其它"}, {"057", "其它"}, {"058", "其它"}, {"059", "其它"}, {"060", "其它"},
            {"061", "其它"}, {"062", "其它"}, {"063", "其它"}, {"064", "其它"}, {"065", "其它"},
            {"066", "其它"}, {"067", "中成药"}, {"068", "中成药"}, {"069", "中成药"}, {"070", "其它"},
            {"071", "其它"}, {"072", "其它"}, {"073", "中成药"}, {"074", "其它"}, {"075", "其它"},
            {"076", "中成药"}, {"077", "其它"}, {"078", "其它"}, {"079", "中成药"}, {"080", "中成药"},
            {"081", "中成药"}, {"082", "中成药"}, {"083", "其它"}, {"084", "中成药"}, {"085", "其它"},
            {"086", "中成药"}, {"087", "其它"}, {"088", "其它"}, {"089", "中成药"}, {"090", "中成药"},
            {"091", "其它"}, {"092", "其它"}, {"093", "其它"}, {"094", "中成药"}, {"095", "其它"},
            {"096", "其它"}, {"097", "其它"}, {"098", "其它"}, {"099", "其它"}, {"100", "其它"},
            {"101", "其它"}, {"102", "其它"}, {"103", "其它"}, {"104", "其它"}, {"105", "其它"},
            {"106", "其它"}, {"107", "其它"}, {"108", "其它"}, {"109", "其它"}, {"110", "其它"},
            {"111", "其它"}, {"112", "其它"}, {"113", "其它"}, {"114", "其它"}, {"115", "其它"},
            {"116", "其它"}, {"117", "其他"}
        };
        /// <summary>
        /// æ ¹æ®å‰‚型编号获取剂型分类
        /// </summary>
        /// <param name="dosageCode">剂型编号(001-117)</param>
        /// <returns>剂型分类(片剂/针剂/中成药/其它/其他)</returns>
        public static string GetDosageForm(string dosageCode)
        {
            if (string.IsNullOrEmpty(dosageCode))
                return "未知";
            // å¤„理编号格式,确保是3位数字
            if (dosageCode.Length == 1)
                dosageCode = "00" + dosageCode;
            else if (dosageCode.Length == 2)
                dosageCode = "0" + dosageCode;
            if (_dosageFormMap.TryGetValue(dosageCode, out string form))
            {
                return form;
            }
            return "未知";
        }
        public WebResponseContent ProductSynchronous()
        {
            try
            {
                List<Dt_MaterielInfo> materielInfos = BaseDal.QueryData(x => x.MaterielSourceType == MaterielSourceTypeEnum.SelfMadePart && x.BoxQty > 0 && x.MinQty > 0 && x.GoodStatusState == "未下发").ToList();
                if (materielInfos.Count < 1) return WebResponseContent.Instance.Error("无未下发药品");
                var url = "http://172.16.1.2:9357/file-admin/api/product/productSynchronous";
                foreach (var item in materielInfos)
                {
                    var medicineDTO = new ProductInfo
                    {
                        //用户code
                        customerCode = "905",
                        //物料类型
                        materialCode = item.MaterielErpType,
                        //产品编码
                        productCode = item.MaterielCode,
                        //产品名
                        productName = item.MaterielName,
                        //产品条码
                        productBarCode = item.Barcode,
                        //药剂
                        medicine = item.Dosage_form,//这里要调用方法,转化方法
                        //规格
                        productSpecifications = item.MaterielSpec,
                        //单位
                        unit = item.MaterielUnit,
                        //长
                        singleProductLongNum = (item.MaterielLength ?? 0).ToString(),
                        //宽
                        singleProductWideNum = (item.MaterielWide ?? 0).ToString(),
                        //高
                        singleProductHighNum = (item.MaterielHeight ?? 0).ToString(),
                        //重量
                        singleProductWeight = (item.MaterielWeight ?? 0).ToString(),
                        //体积
                        singleProductVolume = (item.MaterielVolume ?? 0).ToString(),
                        //是否取消 0是不删除,1删除
                        isDelete = "0"
                    };
                    var result = HttpHelper.Post(url, medicineDTO.ToJsonString());
                    var resp = JsonConvert.DeserializeObject<TowcsResponse<object>>(result);
                    if (resp != null && resp.code == "0") item.GoodStatusState = "下发完成";
                }
                BaseDal.UpdateData(materielInfos);
                return WebResponseContent.Instance.OK();
            }
            catch (Exception ex)
            {
                Console.WriteLine("下发WCS物料信息异常:" + ex.Message);
                return WebResponseContent.Instance.Error(ex.Message);
            }
        }
        /// <summary>
        /// å‘给下游wcs同步药品信息
        /// </summary>
        /// <returns></returns>
        public WebResponseContent ProductSynchronous1()
        {
            try
            {
                //把小件未下发的的信息和箱规为0,最低库存为0的过滤掉
                //var list = BaseDal.Db.Queryable<Dt_MaterielInfo>().Where(x => x.GoodStatusState == "未下发" && x.MaterielSourceType == MaterielSourceTypeEnum.SelfMadePart).ToList();
                var list = BaseDal.QueryData(x => x.MaterielSourceType == MaterielSourceTypeEnum.SelfMadePart && x.BoxQty > 0 && x.MinQty > 0 && x.GoodStatusState == "未下发").ToList();
                if (list.Count < 1)
                {
                    return new WebResponseContent().OK("无未下发药品");
                }
                //找到了就将整个list发给下游系统
                foreach (var item in list)
                {
                    var medicineDTO = new ProductInfo
                    {
                        //用户code
                        customerCode = "905",
                        //物料类型
                        materialCode = item.MaterielErpType,
                        //产品编码
                        productCode = item.MaterielCode,
                        //产品名
                        productName = item.MaterielName,
                        //产品条码
                        productBarCode = item.Barcode,
                        //药剂
                        medicine = item.Dosage_form,//这里要调用方法,转化方法
                        //规格
                        productSpecifications = item.MaterielSpec,
                        //单位
                        unit = item.MaterielUnit,
                        //长
                        singleProductLongNum = (item.MaterielLength ?? 0).ToString(),
                        //宽
                        singleProductWideNum = (item.MaterielWide ?? 0).ToString(),
                        //高
                        singleProductHighNum = (item.MaterielHeight ?? 0).ToString(),
                        //重量
                        singleProductWeight = (item.MaterielWeight ?? 0).ToString(),
                        //体积
                        singleProductVolume = (item.MaterielVolume ?? 0).ToString(),
                        //是否取消 0是不删除,1删除
                        isDelete = "0"
                    };
                    var url = "http://172.16.1.2:9357/file-admin/api/product/productSynchronous";
                    var result = HttpHelper.Post(url, medicineDTO.ToJsonString());
                    var resp = JsonConvert.DeserializeObject<TowcsResponse<object>>(result);
                    if (resp != null && resp.code == "0")
                    {
                        item.GoodStatusState = "下发完成";
                    }
                    else
                    {
                        continue;
                    }
                }
                BaseDal.UpdateData(list);
                //Db.Updateable(list).ExecuteCommand();
                return new WebResponseContent { Status = true, Message = "成功" };
            }
            catch (Exception ex)
            {
                Console.WriteLine("ProductSynchronous å¼‚常:" + ex.Message);
                return new WebResponseContent { Status = false, Message = ex.Message };
            }
        }
        public override WebResponseContent DeleteData(object[] keys)
        {
            WebResponseContent content = new WebResponseContent();
@@ -85,7 +359,7 @@
                saveModel.MainData.Add("goodStatusState", "未下发");
            }
            // å¦‚果现在这个物料信息是小件并且箱规或者最低库存为0,那么就要提示他
            if (saveModel.MainData["materielSourceType"].ToString() == "SelfMadePart" && (saveModel.MainData["boxQty"].ToString() =="0"|| saveModel.MainData["minQty"].ToString()=="0"))
            if (saveModel.MainData["materielSourceType"].ToString() == "SelfMadePart" && (saveModel.MainData["boxQty"].ToString() == "0" || saveModel.MainData["minQty"].ToString() == "0"))
            {
                // è¿™é‡Œæ·»åŠ ä½ çš„é€»è¾‘
                return WebResponseContent.Instance.Error("箱规和最小库存数不可已为0");
н¨Îļþ¼Ð/WIDESEA_WMSServer/WIDESEA_Core/Helper/HttpHelper.cs
@@ -21,7 +21,7 @@
            {
                using HttpClient httpClient = new HttpClient();
                httpClient.Timeout = new TimeSpan(0, 0, 60);
                if (headers != null)
                {
                    foreach (var header in headers)
@@ -105,6 +105,7 @@
        {
            string result = string.Empty;
            DateTime beginDate = DateTime.Now;
            string message = string.Empty;
            try
            {
                using (HttpContent httpContent = new StringContent(requestJson))
@@ -125,11 +126,15 @@
            }
            catch (Exception e)
            {
                message = e.Message;
                throw new Exception(e.Message);
            }
            finally
            {
                Logger.Add(serviceAddress, requestJson, result, beginDate);
                if (!string.IsNullOrEmpty(message))
                    Logger.Add(serviceAddress, requestJson, message, beginDate);
                else
                    Logger.Add(serviceAddress, requestJson, result, beginDate);
            }
        }
    }
н¨Îļþ¼Ð/WIDESEA_WMSServer/WIDESEA_ISquareCabinServices/IBusiness.cs
@@ -4,6 +4,8 @@
{
    public interface IBusiness : IDependency
    {
        WebResponseContent GetInOrder();
        WebResponseContent GetOutOrder();
        /// <summary>
        /// èŽ·å–ä¸Šæ¸¸å…¥åº“è®¢å•
        /// </summary>
н¨Îļþ¼Ð/WIDESEA_WMSServer/WIDESEA_ISquareCabinServices/ICabinOrderServices.cs
@@ -25,5 +25,6 @@
        /// <param name="key"></param>
        /// <returns></returns>
        WebResponseContent FinishInOrder(int key);
        WebResponseContent CompleteLKInOrder(Dt_CabinOrder cabinOrder, TowcsDto.EdiOrderCallbackRequest request);
    }
}
н¨Îļþ¼Ð/WIDESEA_WMSServer/WIDESEA_ISquareCabinServices/IDeliveryOrderServices.cs
@@ -68,5 +68,6 @@
        WebResponseContent CheckTaskFinish(Dt_SupplyTask supplyTask, string LocationCode = null);
        WebResponseContent CreateOutboundOrder(OrderDto.UpstramOutOrderInfo upstramOutOrderInfo);
        WebResponseContent CreateCheckOutOrder(OrderDto.UpstramOutOrderInfo outorder);
        WebResponseContent CompleteLKOutOrder(Dt_DeliveryOrder deliveryOrder, TowcsDto.EdiOrderCallbackRequest request);
    }
}
н¨Îļþ¼Ð/WIDESEA_WMSServer/WIDESEA_ISquareCabinServices/IMedicineGoodsServices.cs
@@ -16,9 +16,9 @@
        /// èŽ·å–è¯å“åŸºç¡€ä¿¡æ¯åŒæ­¥æŽ¥å£
        /// </summary>
        /// <returns></returns>
        public WebResponseContent GetMedicineGoodsInfom();
        //public WebResponseContent GetMedicineGoodsInfom();
        public WebResponseContent ProductSynchronous();
        //public WebResponseContent ProductSynchronous();
        /// <summary>
н¨Îļþ¼Ð/WIDESEA_WMSServer/WIDESEA_SquareCabinServices/Business.cs
@@ -17,24 +17,28 @@
using System.Xml.Linq;
using WIDESEA_Common.OrderEnum;
using static WIDESEA_DTO.SquareCabin.AlarmDto;
using OfficeOpenXml.Style;
using System.Security.Policy;
namespace WIDESEA_WMSServer
namespace WIDESEA_SquareCabinServices
{
    public class Business : IBusiness
    public partial class Business : IBusiness
    {
        private readonly ICabinOrderServices _cabinOrderServices;
        private readonly ICabinOrderDetailServices _cabinDetailServices;
        private readonly IDeliveryOrderServices _deliveryOrderServices;
        private readonly IDeliveryOrderDetailServices _deliveryOrderDetailServices;
        private readonly IMaterielInfoService _materielInfoService;
        private readonly IMessageInfoService _messageInfoService;
        private readonly IUnitOfWorkManage _unitOfWorkManage;
        public Business(IDeliveryOrderServices deliveryOrderServices, IUnitOfWorkManage unitOfWorkManage, IDeliveryOrderDetailServices deliveryOrderDetailServices, ICabinOrderServices cabinOrderServices, ICabinOrderDetailServices cabinDetailServices, IMessageInfoService messageInfoService)
        public Business(IDeliveryOrderServices deliveryOrderServices, IUnitOfWorkManage unitOfWorkManage, IDeliveryOrderDetailServices deliveryOrderDetailServices, ICabinOrderServices cabinOrderServices, ICabinOrderDetailServices cabinDetailServices, IMaterielInfoService materielInfoService, IMessageInfoService messageInfoService)
        {
            _deliveryOrderServices = deliveryOrderServices;
            _unitOfWorkManage = unitOfWorkManage;
            _deliveryOrderDetailServices = deliveryOrderDetailServices;
            _cabinOrderServices = cabinOrderServices;
            _cabinDetailServices = cabinDetailServices;
            _materielInfoService = materielInfoService;
            _messageInfoService = messageInfoService;
        }
        #region èŽ·å–ERP入库单
@@ -67,7 +71,7 @@
                // ååºåˆ—化
                var response = JsonConvert.DeserializeObject<UpstreamResponse<UpstreamOrderInfo>>(result);
                if (response == null || response.resultCode != "0" )
                if (response == null || response.resultCode != "0")
                {
                    // è°ƒç”¨å¼‚常接口
                    //SendErrorToUpstream(1, "", response.resultMsg ?? "上游接口返回失败", "");
@@ -111,7 +115,7 @@
                            if (!responseContent.Status) throw new Exception(responseContent.Message);
                            List<Dt_CabinOrder>? dt_CabinOrders = responseContent.Data as List<Dt_CabinOrder>;
                            if (dt_CabinOrders != null)
                                _cabinOrderServices.Db.CopyNew().InsertNav(dt_CabinOrders).Include(x => x.Details).ExecuteCommand();
                                _cabinOrderServices.Db.InsertNav(dt_CabinOrders).Include(x => x.Details).ExecuteCommand();
                        }
                        else if (order.order_type == "3")//入库退料
                        {
@@ -189,7 +193,7 @@
                var result = HttpHelper.Post(url, requestData.ToJsonString());
                var response = JsonConvert.DeserializeObject<UpstreamResponse<UpstramOutOrderInfo>>(result);
                if (response==null||response.resultCode != "0")
                if (response == null || response.resultCode != "0")
                {
                    //SendErrorToUpstream(3, "", response.resultMsg ?? "上游接口返回失败", "");
                    return responseContent.Error(response?.resultMsg ?? "上游接口返回失败");
@@ -296,44 +300,23 @@
        {
            try
            {
                //2.查询符合条件的订单(表头 = æ–°å»º && åŒ…含有效明细)
                //var orders = BaseDal.Db.Queryable<Dt_CabinOrder>()
                //    .Where(o => o.OdrderStatus == "新建")
                //    .Includes(o => o.Details, d => d.MedicineGoods)
                //    .ToList();
                //查出包含全部的入库单,包含全部明细+一个明细对应一个商品
                var reslut = WarehouseEnum.立库.ObjToInt().ToString("000");
                var orders = _cabinOrderServices.Db.CopyNew()
                .Queryable<Dt_CabinOrder>()
                .Where(o => o.OdrderStatus == "新建" && o.Warehouse_no == reslut)
                .Includes(o => o.Details, d => d.MedicineGoods)
                .ToList();
                // 3. å†è¿‡æ»¤æŽ‰ä¸ç¬¦åˆæ¡ä»¶çš„æ˜Žç»†ï¼ˆåªä¿ç•™ Status=0)
                var orders = _cabinOrderServices.Repository.QueryData(x => x.OdrderStatus == "新建" && x.Warehouse_no == reslut);
                if (orders.Count < 1) return WebResponseContent.Instance.OK();
                string url = "http://172.16.1.2:9357/file-admin/api/in/ediIn";
                var cabinOrderDetails = _cabinDetailServices.Repository.QueryData(x => orders.Select(x => x.Id).ToList().Contains(x.OrderId));
                var materielInfos = _materielInfoService.Repository.QueryData(x => cabinOrderDetails.Select(x => x.Goods_no).Contains(x.MaterielCode));
                foreach (var order in orders)
                {
                    //Console.WriteLine($"订单 {order.Order_no} åŽŸæ˜Žç»†æ•°ï¼š{order.Details.Count}");
                    order.Details = order.Details.Where(d => d.Status == 0).ToList();
                    //Console.WriteLine($"订单 {order.Order_no} è¿‡æ»¤åŽæ˜Žç»†æ•°ï¼š{order.Details.Count}");
                }
                if (orders.Count < 1)
                {
                    //Console.WriteLine("没有符合条件的订单需要推送");
                    return WebResponseContent.Instance.Error("没有符合条件的订单需要推送");
                }
                // 4. éåŽ†è®¢å•ï¼Œç»„è£… DTO å¹¶æŽ¨é€
                foreach (var order in orders)
                {
                    // ä»Žç¬¬ä¸€ä¸ªæœ‰ MedicineGoods çš„æ˜Žç»†ä¸­å–出 MaterielErpType
                    string materialCode = order.Details
                        .Select(d => d.MedicineGoods?.MaterielErpType)
                        .FirstOrDefault(x => !string.IsNullOrEmpty(x)) ?? "YY"; // é»˜è®¤å€¼YY
                    order.Details = cabinOrderDetails.Where(x => x.OrderId == order.Id).ToList();
                    foreach (var item in order.Details)
                    {
                        item.MedicineGoods = materielInfos.Where(x => x.MaterielCode == item.Goods_no).First();
                    }
                    #region ä¸‹å‘WCS
                    string materialCode = order.Details.FirstOrDefault()?.MedicineGoods?.MaterielErpType ?? "YY";
                    var ediDto = new ToediInInfo
                    {
                        //客户代码
                        customerCode = "905",
                        //物料类型
@@ -353,62 +336,234 @@
                            //产品
                            productCode = d.Goods_no,
                            //sku名称
                            productName = d.MedicineGoods?.MaterielName,
                            productName = d.MedicineGoods.MaterielName,
                            //sku规格
                            productSpecifications = d.MedicineGoods?.MaterielSpec,
                            productSpecifications = d.MedicineGoods.MaterielSpec,
                            //数量
                            quantity = (int)d.Order_qty,
                            //效期
                            validityPeriod = d.Exp_date,
                            //生产厂家
                            manufacturer = d.MedicineGoods?.Factory,
                            manufacturer = d.MedicineGoods.Factory,
                            //房号
                            libraryNo = order.Warehouse_no,
                        }).ToList()
                    };
                    var url = "http://172.16.1.2:9357/file-admin/api/in/ediIn";
                    //var url = "http://127.0.0.1:4523/m2/5660322-5340849-default/363019549";
                    var result = HttpHelper.Post(url, ediDto.ToJsonString());
                    var resp = JsonConvert.DeserializeObject<TowcsResponse<object>>(result);
                    if (resp != null && resp.code == "0")
                    {
                        // æ›´æ–°è¡¨å¤´çŠ¶æ€
                        _cabinOrderServices.Db.Updateable<Dt_CabinOrder>()
                           .SetColumns(o => new Dt_CabinOrder { OdrderStatus = "开始" })
                           .Where(o => o.Id == order.Id)
                           .ExecuteCommand();
                        // æ›´æ–°æ˜Žç»†çŠ¶æ€ä¸ºå·²åŒæ­¥  //这里要是将新建--》开始状态,在后端接口返回我们的时候在返回已完成
                        _cabinDetailServices.Db.Updateable<Dt_CabinOrderDetail>()
                          .SetColumns(d => new Dt_CabinOrderDetail { Status = 1, OrderDetailStatus = "开始" })
                          .Where(d => d.OrderId == order.Id && d.Status == 0)
                          .ExecuteCommand();
                        Console.WriteLine($"订单 {order.Order_no} æŽ¨é€æˆåŠŸ");
                        order.OdrderStatus = "开始";
                        foreach (var item in cabinOrderDetails.Where(x => x.OrderId == order.Id))
                        {
                            item.Status = 1;
                            item.OrderDetailStatus = "开始";
                        }
                    }
                    else
                    {
                        continue;
                        //SendErrorToUpstream(3, order.Order_no, resp?.msg ?? "WCS æŽ¨é€å¤±è´¥", "");
                        //Console.WriteLine($"订单 {order.Order_no} æŽ¨é€å¤±è´¥ï¼š{resp?.msg}");
                        //return new WebResponseContent { Status = false, Message = "订单推送失败" };
                    }
                    #endregion
                }
                return new WebResponseContent { Status = true, Message = "推送成功" };
                _cabinOrderServices.UpdateData(orders);
                _cabinDetailServices.UpdateData(cabinOrderDetails);
                return WebResponseContent.Instance.OK();
            }
            catch (Exception ex)
            {
                Console.WriteLine("EdiIn å¼‚常:" + ex.Message);
                return new WebResponseContent { Status = false, Message = ex.Message };
                Console.WriteLine("下发WCS入库单异常:" + ex.Message);
                return WebResponseContent.Instance.Error(ex.Message);
            }
        }
        #region MyRegion
        //public WebResponseContent EdiIn1()
        //{
        //    try
        //    {
        //        //2.查询符合条件的订单(表头 = æ–°å»º && åŒ…含有效明细)
        //        //var orders = BaseDal.Db.Queryable<Dt_CabinOrder>()
        //        //    .Where(o => o.OdrderStatus == "新建")
        //        //    .Includes(o => o.Details, d => d.MedicineGoods)
        //        //    .ToList();
        //        //查出包含全部的入库单,包含全部明细+一个明细对应一个商品
        //        var reslut = WarehouseEnum.立库.ObjToInt().ToString("000");
        //        var orders = _cabinOrderServices.Db.CopyNew()
        //        .Queryable<Dt_CabinOrder>()
        //        .Where(o => o.OdrderStatus == "新建" && o.Warehouse_no == reslut)
        //        .Includes(o => o.Details, d => d.MedicineGoods)
        //        .ToList();
        //        // 3. å†è¿‡æ»¤æŽ‰ä¸ç¬¦åˆæ¡ä»¶çš„æ˜Žç»†ï¼ˆåªä¿ç•™ Status=0)
        //        foreach (var order in orders)
        //        {
        //            //Console.WriteLine($"订单 {order.Order_no} åŽŸæ˜Žç»†æ•°ï¼š{order.Details.Count}");
        //            order.Details = order.Details.Where(d => d.Status == 0).ToList();
        //            //Console.WriteLine($"订单 {order.Order_no} è¿‡æ»¤åŽæ˜Žç»†æ•°ï¼š{order.Details.Count}");
        //        }
        //        if (orders.Count < 1)
        //        {
        //            //Console.WriteLine("没有符合条件的订单需要推送");
        //            return WebResponseContent.Instance.Error("没有符合条件的订单需要推送");
        //        }
        //        List<Dt_CabinOrderDetail> cabinOrderDetails = new List<Dt_CabinOrderDetail>();
        //        var url = "http://172.16.1.2:9357/file-admin/api/in/ediIn";
        //        // 4. éåŽ†è®¢å•ï¼Œç»„è£… DTO å¹¶æŽ¨é€
        //        foreach (var order in orders)
        //        {
        //            // ä»Žç¬¬ä¸€ä¸ªæœ‰ MedicineGoods çš„æ˜Žç»†ä¸­å–出 MaterielErpType
        //            string materialCode = order.Details
        //                .Select(d => d.MedicineGoods?.MaterielErpType)
        //                .FirstOrDefault(x => !string.IsNullOrEmpty(x)) ?? "YY"; // é»˜è®¤å€¼YY
        //            var ediDto = new ToediInInfo
        //            {
        //                //客户代码
        //                customerCode = "905",
        //                //物料类型
        //                materialCode = materialCode,
        //                //入库单号
        //                externalOrderNo = order.Order_no,
        //                //入库单类型
        //                inOrderType = order.Order_type == "5" ? "20" : "10",
        //                //优先级
        //                priority = 0,
        //                //是否取消
        //                Is_cancel = 0,
        //                details = order.Details.Select(d => new ToediInDetail
        //                {
        //                    //批号
        //                    batchNo = d.Batch_num,
        //                    //产品
        //                    productCode = d.Goods_no,
        //                    //sku名称
        //                    productName = d.MedicineGoods?.MaterielName,
        //                    //sku规格
        //                    productSpecifications = d.MedicineGoods?.MaterielSpec,
        //                    //数量
        //                    quantity = (int)d.Order_qty,
        //                    //效期
        //                    validityPeriod = d.Exp_date,
        //                    //生产厂家
        //                    manufacturer = d.MedicineGoods?.Factory,
        //                    //房号
        //                    libraryNo = order.Warehouse_no,
        //                }).ToList()
        //            };
        //            //var url = "http://127.0.0.1:4523/m2/5660322-5340849-default/363019549";
        //            var result = HttpHelper.Post(url, ediDto.ToJsonString());
        //            var resp = JsonConvert.DeserializeObject<TowcsResponse<object>>(result);
        //            if (resp != null && resp.code == "0")
        //            {
        //                order.OdrderStatus = "开始";
        //                foreach (var item in order.Details)
        //                {
        //                    item.Status = 1;
        //                    item.OrderDetailStatus = "开始";
        //                }
        //                cabinOrderDetails.AddRange(order.Details);
        //                // æ›´æ–°è¡¨å¤´çŠ¶æ€
        //                //_cabinOrderServices.Db.Updateable<Dt_CabinOrder>()
        //                //   .SetColumns(o => new Dt_CabinOrder { OdrderStatus = "开始" })
        //                //   .Where(o => o.Id == order.Id)
        //                //   .ExecuteCommand();
        //                // æ›´æ–°æ˜Žç»†çŠ¶æ€ä¸ºå·²åŒæ­¥  //这里要是将新建--》开始状态,在后端接口返回我们的时候在返回已完成
        //                //_cabinDetailServices.Db.Updateable<Dt_CabinOrderDetail>()
        //                //  .SetColumns(d => new Dt_CabinOrderDetail { Status = 1, OrderDetailStatus = "开始" })
        //                //  .Where(d => d.OrderId == order.Id && d.Status == 0)
        //                //  .ExecuteCommand();
        //                //Console.WriteLine($"订单 {order.Order_no} æŽ¨é€æˆåŠŸ");
        //            }
        //            else
        //            {
        //                continue;
        //                //SendErrorToUpstream(3, order.Order_no, resp?.msg ?? "WCS æŽ¨é€å¤±è´¥", "");
        //                //Console.WriteLine($"订单 {order.Order_no} æŽ¨é€å¤±è´¥ï¼š{resp?.msg}");
        //                //return new WebResponseContent { Status = false, Message = "订单推送失败" };
        //            }
        //        }
        //        _cabinOrderServices.UpdateData(orders);
        //        _cabinDetailServices.UpdateData(cabinOrderDetails);
        //        return new WebResponseContent { Status = true, Message = "推送成功" };
        //    }
        //    catch (Exception ex)
        //    {
        //        Console.WriteLine("EdiIn å¼‚常:" + ex.Message);
        //        return new WebResponseContent { Status = false, Message = ex.Message };
        //    }
        //}
        #endregion
        #endregion
        #region ä¸‹å‘立库出库单
        public WebResponseContent EdiOut()
        {
            try
            {
                var reslut = WarehouseEnum.立库.ObjToInt().ToString("000");
                var orders = _deliveryOrderServices.Repository.QueryData(x => x.OutStatus == "新建" && x.Warehouse_no == reslut);
                if (orders.Count < 1) return WebResponseContent.Instance.OK();
                string url = "http://172.16.1.2:9357/file-admin/api/out/ediOut";
                var deliveryOrderDetails = _deliveryOrderDetailServices.Repository.QueryData(x => orders.Select(x => x.Id).ToList().Contains(x.DeliveryOrderId));
                var materielInfos = _materielInfoService.Repository.QueryData(x => deliveryOrderDetails.Select(x => x.Goods_no).Contains(x.MaterielCode));
                foreach (var order in orders)
                {
                    order.Details = deliveryOrderDetails.Where(x => x.DeliveryOrderId == order.Id).ToList();
                    foreach (var item in order.Details)
                    {
                        item.MedicineGoods = materielInfos.Where(x => x.MaterielCode == item.Goods_no).First();
                    }
                    #region ä¸‹å‘WCS
                    string materialCode = order.Details.FirstOrDefault()?.MedicineGoods?.MaterielErpType ?? "YY";
                    var ediDto = new ToediOutInfo
                    {
                        //客户代码
                        customerCode = "905",
                        //物料类型
                        materialCode = materialCode,
                        externalOrderNo = order.Out_no,
                        outOrderType = order.Out_type,
                        priority = 1,
                        Is_cancel = 0,
                        details = order.Details.Select(d => new ToeOutdiInDetail
                        {
                            batchNo = d.Batch_num,
                            productCode = d.Goods_no,
                            productName = d.MedicineGoods.MaterielName,
                            productSpecifications = d.MedicineGoods.MaterielModel,
                            quantity = (int)d.Order_qty,
                        }).ToList()
                    };
                    var result = HttpHelper.Post(url, ediDto.ToJsonString());
                    var resp = JsonConvert.DeserializeObject<TowcsResponse<object>>(result);
                    if (resp != null && resp.code == "0")
                    {
                        order.OutStatus = "开始";
                        foreach (var item in deliveryOrderDetails.Where(x => x.DeliveryOrderId == order.Id))
                        {
                            item.Status = 1;
                            item.OotDetailStatus = "开始";
                        }
                    }
                    #endregion
                }
                _deliveryOrderServices.UpdateData(orders);
                _deliveryOrderDetailServices.UpdateData(deliveryOrderDetails);
                return WebResponseContent.Instance.OK();
            }
            catch (Exception ex)
            {
                Console.WriteLine("下发WCS出库单异常:" + ex.Message);
                return WebResponseContent.Instance.Error(ex.Message);
            }
        }
        #region MyRegion
        public WebResponseContent EdiOut1()
        {
            var responseContent = new WebResponseContent();
            var WarehouseLk = WarehouseEnum.立库.ObjToInt().ToString("000");
@@ -431,7 +586,8 @@
                    //Console.WriteLine("没有符合条件的订单需要推送");
                    return responseContent.Error("没有符合条件的订单需要推送");
                }
                List<Dt_DeliveryOrderDetail> deliveryOrderDetails = new List<Dt_DeliveryOrderDetail>();
                var url = "http://172.16.1.2:9357/file-admin/api/out/ediOut";
                foreach (var order in outOrders)
                {
                    try
@@ -480,7 +636,6 @@
                        };
                        // 4. è°ƒç”¨æŽ¥å£
                        var url = "http://172.16.1.2:9357/file-admin/api/out/ediOut";
                        //var url = "http://127.0.0.1:4523/m2/5660322-5340849-default/363076920";
                        var result = HttpHelper.Post(url, ediDto.ToJsonString());
@@ -488,18 +643,25 @@
                        if (resp != null && resp.code == "0")
                        {
                            order.OutStatus = "开始";
                            foreach (var item in order.Details)
                            {
                                item.Status = 1;
                                item.OotDetailStatus = "开始";
                            }
                            deliveryOrderDetails.AddRange(order.Details);
                            // æ›´æ–°è¡¨å¤´çŠ¶æ€
                            _cabinDetailServices.Db.CopyNew().Updateable<Dt_DeliveryOrder>()
                              .SetColumns(o => new Dt_DeliveryOrder { OutStatus = "开始" })
                              .Where(o => o.Id == order.Id)
                              .ExecuteCommand();
                            //_cabinDetailServices.Db.CopyNew().Updateable<Dt_DeliveryOrder>()
                            //  .SetColumns(o => new Dt_DeliveryOrder { OutStatus = "开始" })
                            //  .Where(o => o.Id == order.Id)
                            //  .ExecuteCommand();
                            // æ›´æ–°æ˜Žç»†çŠ¶æ€
                            _deliveryOrderDetailServices.Db.CopyNew().Updateable<Dt_DeliveryOrderDetail>()
                              .SetColumns(d => new Dt_DeliveryOrderDetail { Status = 1, OotDetailStatus = "开始" })
                              .Where(d => d.DeliveryOrderId == order.Id && d.Status == 0)
                              .ExecuteCommand();
                            Console.WriteLine($"订单 {order.Out_no} æŽ¨é€æˆåŠŸ");
                            //_deliveryOrderDetailServices.Db.CopyNew().Updateable<Dt_DeliveryOrderDetail>()
                            //  .SetColumns(d => new Dt_DeliveryOrderDetail { Status = 1, OotDetailStatus = "开始" })
                            //  .Where(d => d.DeliveryOrderId == order.Id && d.Status == 0)
                            //  .ExecuteCommand();
                            //Console.WriteLine($"订单 {order.Out_no} æŽ¨é€æˆåŠŸ");
                        }
                        else
                        {
@@ -515,7 +677,8 @@
                        //Console.WriteLine($"订单 {order.Out_no} æŽ¨é€å¼‚常:{ex.Message}");
                    }
                }
                _deliveryOrderServices.UpdateData(outOrders);
                _deliveryOrderDetailServices.UpdateData(deliveryOrderDetails);
                return responseContent.OK("出库订单推送完成");
            }
            catch (Exception ex)
@@ -524,6 +687,7 @@
                return responseContent.Error("出库订单推送失败:" + ex.Message);
            }
        }
        #endregion
        #endregion
        #region å…¥åº“完成上报ERP
@@ -537,66 +701,55 @@
            var responseContent = new WebResponseContent();
            try
            {
                _unitOfWorkManage.BeginTran();
                #region æŸ¥æ‰¾æ‰€æœ‰å·²å®Œæˆå…¥åº“单
                var inorders = _cabinOrderServices.Repository.QueryData(x => x.OdrderStatus == "已完成").Select(x => x.Order_no).Distinct().ToList();
                foreach (var inorder in inorders)
                var Orders = _cabinOrderServices.Db.Queryable<Dt_CabinOrder>().Where(x => inorders.Contains(x.Order_no)).Includes(x => x.Details).ToList();
                List<Dt_CabinOrder> cabinOrders = new List<Dt_CabinOrder>();
                List<Dt_CabinOrderDetail> cabinOrderDetails = new List<Dt_CabinOrderDetail>();
                var url = "http://121.37.118.63:80/GYZ2/95fck/inOrderOk";
                foreach (var item in Orders.GroupBy(x => x.Order_no))
                {
                    var Orders = _cabinOrderServices.Db.CopyNew().Queryable<Dt_CabinOrder>().Where(x => x.Order_no == inorder).Includes(x => x.Details).ToList();
                    if (!Orders.Where(x => x.OdrderStatus != "已完成").Any())
                    if (!item.Where(x => x.OdrderStatus != "已完成").Any())
                    {
                        if (Orders.FirstOrDefault().Order_type == InOrderTypeEnum.Allocat.ObjToInt().ToString())
                        if (item.First().Order_type == InOrderTypeEnum.Allocat.ObjToInt().ToString())
                        {
                            foreach (var item in Orders)
                            foreach (var a in item)
                            {
                                if (item.Details != null)
                                    _cabinDetailServices.Repository.DeleteAndMoveIntoHty(item.Details, OperateTypeEnum.自动完成);
                                item.Details = null;
                                if (a.Details != null) cabinOrderDetails.AddRange(a.Details);
                                a.Details = null;
                                cabinOrders.Add(a);
                            }
                            _cabinOrderServices.Repository.DeleteAndMoveIntoHty(Orders, OperateTypeEnum.自动完成);
                        }
                        else
                        {
                            // è°ƒç”¨ä¸Šæ¸¸æŽ¥å£
                            var url = "http://121.37.118.63:80/GYZ2/95fck/inOrderOk";
                            var result = HttpHelper.Post(url, new { order_no = inorder }.ToJsonString());
                            var result = HttpHelper.Post(url, new { order_no = item.Key }.ToJsonString());
                            var response = JsonConvert.DeserializeObject<UpstreamOrderResponse>(result);
                            if (response != null&&response.resultCode == "0")
                            if (response != null && response.resultCode == "0")
                            {
                                foreach (var item in Orders)
                                foreach (var a in item)
                                {
                                    if (item.Details != null)
                                        _cabinDetailServices.Repository.DeleteAndMoveIntoHty(item.Details, OperateTypeEnum.自动完成);
                                    item.Details = null;
                                    if (a.Details != null) cabinOrderDetails.AddRange(a.Details);
                                    a.Details = null;
                                    cabinOrders.Add(a);
                                }
                                _cabinOrderServices.Repository.DeleteAndMoveIntoHty(Orders, OperateTypeEnum.自动完成);
                                // æäº¤äº‹åŠ¡
                            }
                            else
                            {
                                string mess = "上报ERP无响应";
                                if (response != null) mess = response.resultMsg;
                                _messageInfoService.AddMessageInfo(MessageGroupByEnum.InOrderAlarm, $"入库单号【{inorder}】完成上报ERP失败", mess);
                                //_unitOfWorkManage.RollbackTran();
                                //SendErrorToUpstream(2, "", $"上游接口返回失败: {response.resultMsg}", inorder);
                                _messageInfoService.AddMessageInfo(MessageGroupByEnum.InOrderAlarm, $"入库单号【{item.Key}】完成上报ERP失败", mess);
                                continue;
                            }
                        }
                    }
                }
                _cabinDetailServices.Repository.DeleteAndMoveIntoHty(cabinOrderDetails, OperateTypeEnum.自动完成);
                _cabinOrderServices.Repository.DeleteAndMoveIntoHty(cabinOrders, OperateTypeEnum.自动完成);
                #endregion
                _unitOfWorkManage.CommitTran();
                return responseContent.OK();
            }
            catch (Exception ex)
            {
                _unitOfWorkManage.RollbackTran();
                return responseContent.Error("批量处理失败:" + ex.Message);
            }
        }
@@ -613,63 +766,56 @@
            var responseContent = new WebResponseContent();
            try
            {
                _unitOfWorkManage.BeginTran();
                #region æŸ¥æ‰¾æ‰€æœ‰å·²å®Œæˆå‡ºåº“单
                var outorders = _deliveryOrderServices.Repository.QueryData(x => x.OutStatus == "已完成").Select(x => x.Out_no).Distinct().ToList();
                foreach (var outorder in outorders)
                var Orders = _deliveryOrderServices.Db.Queryable<Dt_DeliveryOrder>().Where(x => outorders.Contains(x.Out_no)).Includes(x => x.Details).ToList();
                List<Dt_DeliveryOrder> cabinOrders = new List<Dt_DeliveryOrder>();
                List<Dt_DeliveryOrderDetail> cabinOrderDetails = new List<Dt_DeliveryOrderDetail>();
                var url = "http://121.37.118.63:80/GYZ2/95fck/outOrderOk";
                foreach (var item in Orders.GroupBy(x => x.Out_no))
                {
                    var Orders = _deliveryOrderServices.Db.CopyNew().Queryable<Dt_DeliveryOrder>().Where(x => x.Out_no == outorder).Includes(x => x.Details).ToList();
                    if (!Orders.Where(x => x.OutStatus != "已完成").Any())
                    if (!item.Where(x => x.OutStatus != "已完成").Any())
                    {
                        if (Orders.FirstOrDefault().Out_type == OutOrderTypeEnum.Allocate.ObjToInt().ToString())
                        if (item.First().Out_type == OutOrderTypeEnum.Allocate.ObjToInt().ToString())
                        {
                            foreach (var item in Orders)
                            foreach (var a in item)
                            {
                                if (item.Details != null)
                                    _deliveryOrderDetailServices.Repository.DeleteAndMoveIntoHty(item.Details, OperateTypeEnum.自动完成);
                                item.Details = null;
                                if (a.Details != null) cabinOrderDetails.AddRange(a.Details);
                                a.Details = null;
                                cabinOrders.Add(a);
                            }
                            _deliveryOrderServices.Repository.DeleteAndMoveIntoHty(Orders, OperateTypeEnum.自动完成);
                        }
                        else
                        {
                            var url = "http://121.37.118.63:80/GYZ2/95fck/outOrderOk";
                            var requestDate = new
                            {
                                order_no = outorder
                            };
                            var result = HttpHelper.Post(url, requestDate.ToJsonString());
                            var result = HttpHelper.Post(url, new { order_no = item.Key }.ToJsonString());
                            var response = JsonConvert.DeserializeObject<UpstreamOrderResponse>(result);
                            if (response != null && response.resultCode == "0")
                            {
                                foreach (var item in Orders)
                                foreach (var a in item)
                                {
                                    if (item.Details != null)
                                        _deliveryOrderDetailServices.Repository.DeleteAndMoveIntoHty(item.Details, OperateTypeEnum.自动完成);
                                    item.Details = null;
                                    if (a.Details != null) cabinOrderDetails.AddRange(a.Details);
                                    a.Details = null;
                                    cabinOrders.Add(a);
                                }
                                _deliveryOrderServices.Repository.DeleteAndMoveIntoHty(Orders, OperateTypeEnum.自动完成);
                            }
                            else
                            {
                                string mess = "上报ERP无响应";
                                if (response != null) mess = response.resultMsg;
                                _messageInfoService.AddMessageInfo(MessageGroupByEnum.OutOrderAlarm, $"出库单号【{outorder}】完成上报ERP失败", mess);
                                //_unitOfWorkManage.RollbackTran();
                                //SendErrorToUpstream(4, "", $"上游接口返回失败: {response.resultMsg}", outorder);
                                _messageInfoService.AddMessageInfo(MessageGroupByEnum.InOrderAlarm, $"出库单号【{item.Key}】完成上报ERP失败", mess);
                                continue;
                            }
                        }
                    }
                }
                _deliveryOrderDetailServices.Repository.DeleteAndMoveIntoHty(cabinOrderDetails, OperateTypeEnum.自动完成);
                _deliveryOrderServices.Repository.DeleteAndMoveIntoHty(cabinOrders, OperateTypeEnum.自动完成);
                #endregion
                _unitOfWorkManage.CommitTran();
                return responseContent.OK();
            }
            catch (Exception ex)
            {
                _unitOfWorkManage.RollbackTran();
                return responseContent.Error("批量处理失败:" + ex.Message);
            }
        }
н¨Îļþ¼Ð/WIDESEA_WMSServer/WIDESEA_SquareCabinServices/CabinOrderServices.cs
@@ -33,7 +33,7 @@
namespace WIDESEA_SquareCabinServices
{
    public class CabinOrderServices : ServiceBase<Dt_CabinOrder, IRepository<Dt_CabinOrder>>, ICabinOrderServices
    public partial class CabinOrderServices : ServiceBase<Dt_CabinOrder, IRepository<Dt_CabinOrder>>, ICabinOrderServices
    {
        private readonly IMedicineGoodsServices _medicineGoodsServices;
        private readonly IUnitOfWorkManage _unitOfWorkManage;
@@ -343,11 +343,13 @@
                        }).ToList()
                    };
                    dt_CabinOrders.Add(entityOrder);
                    webResponseContent.OK(data: dt_CabinOrders);
                    BaseDal.Db.InsertNav(dt_CabinOrders).Include(x => x.Details).ExecuteCommand();
                    //webResponseContent.OK(data: dt_CabinOrders);
                }
                #endregion
                else
                {
                    #region åˆ›å»ºå…¥åº“单头表、大件库和立库
                    var entityOrder = new Dt_CabinOrder//大件库订单
                    {
                        Order_no = order.order_no,
@@ -370,12 +372,16 @@
                        Warehouse_no = WarehouseEnum.立库.ObjToInt().ToString("000"),
                        Details = new List<Dt_CabinOrderDetail>()
                    };
                    #endregion
                    List<Dt_MaterielInfo> materielInfos = _materielInfoService.Repository.QueryData(x => order.details.Select(x => x.goods_no).Contains(x.MaterielCode));
                    List<Dt_MaterielInfo> materielInfosUp = new List<Dt_MaterielInfo>();
                    foreach (var item in order.details)
                    {
                        // å°†ä¸Šæ¸¸å…¥åº“数量转为正数
                        item.order_qty = Math.Abs(item.order_qty);
                        #region æ ¹æ®ç‰©æ–™ç¼–码查询物料信息
                        Dt_MaterielInfo materielInfo = _materielInfoService.Repository.QueryFirst(x => x.MaterielCode == item.goods_no);
                        Dt_MaterielInfo? materielInfo = materielInfos.Where(x => x.MaterielCode == item.goods_no).FirstOrDefault();
                        if (materielInfo == null) throw new Exception($"未找到药品编码【{item.goods_no}】的信息");
                        if (!Enum.IsDefined(typeof(MaterielSourceTypeEnum), materielInfo.MaterielSourceType))
                            throw new Exception($"请设置药品编号【{item.goods_no}】的属性分类");
@@ -464,16 +470,22 @@
                                entityOrder.Details.Add(orderDetail);
                            }
                            #endregion
                            materielInfosUp.Add(materielInfo);
                        }
                        _materielInfoService.UpdateData(materielInfo);
                        //_materielInfoService.UpdateData(materielInfo);
                    }
                    _unitOfWorkManage.BeginTran();
                    if (materielInfosUp.Count > 0) _materielInfoService.UpdateData(materielInfosUp);
                    if (entityOrder.Details.Count > 0) dt_CabinOrders.Add(entityOrder);
                    if (entityOrderLK.Details.Count > 0) dt_CabinOrders.Add(entityOrderLK);
                    webResponseContent.OK(data: dt_CabinOrders);
                    if (dt_CabinOrders.Count > 0) BaseDal.Db.InsertNav(dt_CabinOrders).Include(x => x.Details).ExecuteCommand();
                    _unitOfWorkManage.CommitTran();
                    //webResponseContent.OK(data: dt_CabinOrders);
                }
            }
            catch (Exception ex)
            {
                _unitOfWorkManage.RollbackTran();
                webResponseContent.Error(ex.Message);
            }
            return webResponseContent;
@@ -486,21 +498,27 @@
            WebResponseContent content = new WebResponseContent();
            try
            {
                _unitOfWorkManage.BeginTran();
                string WareCodeMJ = WarehouseEnum.麻精库.ObjToInt().ToString("000");
                string WareCodeLD = WarehouseEnum.冷冻库.ObjToInt().ToString("000");
                List<Dt_SupplyTask_Hty> supplyTask_Hties = new List<Dt_SupplyTask_Hty>();
                List<Dt_Inventory_Batch> batchesUp = new List<Dt_Inventory_Batch>();
                List<Dt_InventoryInfo> infosUp = new List<Dt_InventoryInfo>();
                var codes = order.details.Select(x => x.goods_no).ToList();
                #region ç‰¹æ®Šåº“房
                if (order.warehouse_no == WareCodeMJ || order.warehouse_no == WareCodeLD)
                {
                    List<Dt_Inventory_Batch> inventory_Batchs = _inventory_BatchServices.Repository.QueryData(x => codes.Contains(x.MaterielCode));
                    List<Dt_InventoryInfo> _InventoryInfos = _inventoryInfoService.Repository.QueryData(x => codes.Contains(x.MaterielCode));
                    #region åº“存、库存批次平账
                    foreach (var item in order.details)
                    {
                        //找库存批次信息
                        Dt_Inventory_Batch inventory_Batch = _inventory_BatchServices.Repository.QueryFirst(x => x.MaterielCode == item.goods_no && x.BatchNo == item.batch_num);
                        Dt_Inventory_Batch inventory_Batch = inventory_Batchs.Where(x => x.MaterielCode == item.goods_no && x.BatchNo == item.batch_num).First();
                        var Qty = Math.Abs(inventory_Batch.StockQuantity - inventory_Batch.SupplyQuantity);
                        if (Qty != item.order_qty) throw new Exception($"盘盈入库单【{order.order_no}】物料编号【{item.goods_no}】物料批次【{item.batch_num}】的盘盈数量有误");
                        //找所有库存
                        List<Dt_InventoryInfo> inventoryInfos = _inventoryInfoService.Repository.QueryData(x => x.MaterielCode == inventory_Batch.MaterielCode && x.BatchNo == inventory_Batch.BatchNo);
                        List<Dt_InventoryInfo> inventoryInfos = _InventoryInfos.Where(x => x.MaterielCode == inventory_Batch.MaterielCode && x.BatchNo == inventory_Batch.BatchNo).ToList();
                        foreach (var inventoryInfo in inventoryInfos)
                        {
                            #region æ·»åŠ ç›˜ç›ˆå…¥åº“ä»»åŠ¡
@@ -525,17 +543,20 @@
                                    SupplyQuantity = 0,
                                    Remark = "盘盈入库"
                                };
                                _supplyTaskHtyService.AddData(supplyTask_Hty);
                                //_supplyTaskHtyService.AddData(supplyTask_Hty);
                                supplyTask_Hties.Add(supplyTask_Hty);
                            }
                            #endregion
                            inventoryInfo.StockQuantity = inventoryInfo.SupplyQuantity;
                            inventoryInfo.SupplyQuantity = 0;
                            inventoryInfo.StockStatus = StockStatusEmun.入库完成.ObjToInt();
                        }
                        infosUp.AddRange(inventoryInfos);
                        inventory_Batch.StockQuantity = inventory_Batch.SupplyQuantity;
                        inventory_Batch.SupplyQuantity = 0;
                        _inventoryInfoService.UpdateData(inventoryInfos);
                        _inventory_BatchServices.UpdateData(inventory_Batch);
                        batchesUp.Add(inventory_Batch);
                        //_inventoryInfoService.UpdateData(inventoryInfos);
                        //_inventory_BatchServices.UpdateData(inventory_Batch);
                    }
                    #endregion
@@ -561,24 +582,31 @@
                            Status = 2,
                        }).ToList()
                    };
                    Db.InsertNav(entityOrder).Include(it => it.Details).ExecuteCommand();
                    _unitOfWorkManage.BeginTran();
                    _supplyTaskHtyService.AddData(supplyTask_Hties);
                    _inventoryInfoService.UpdateData(infosUp);
                    _inventory_BatchServices.UpdateData(batchesUp);
                    BaseDal.Db.InsertNav(entityOrder).Include(it => it.Details).ExecuteCommand();
                    _unitOfWorkManage.CommitTran();
                    //Repository.AddData(entityOrder);
                    #endregion
                }
                #endregion
                else
                {
                    List<Dt_CabinOrder> cabinOrdersAdd = new List<Dt_CabinOrder>();
                    string WareCodeLK = WarehouseEnum.立库.ObjToInt().ToString("000");
                    string WareCodeDJ = WarehouseEnum.大件库.ObjToInt().ToString("000");
                    List<Dt_Inventory_Batch> inventory_Batchs = _inventory_BatchServices.Repository.QueryData(x => codes.Contains(x.MaterielCode));
                    List<Dt_InventoryInfo> _InventoryInfos = _inventoryInfoService.Repository.QueryData(x => codes.Contains(x.MaterielCode));
                    foreach (var item in order.details)
                    {
                        //找库存批次信息
                        Dt_Inventory_Batch inventory_Batch = _inventory_BatchServices.Repository.QueryFirst(x => x.MaterielCode == item.goods_no && x.BatchNo == item.batch_num);
                        Dt_Inventory_Batch inventory_Batch = inventory_Batchs.Where(x => x.MaterielCode == item.goods_no && x.BatchNo == item.batch_num).First();
                        var Qty = Math.Abs(inventory_Batch.StockQuantity - inventory_Batch.SupplyQuantity);
                        if (Qty != item.order_qty) throw new Exception($"盘盈入库单【{order.order_no}】物料编号【{item.goods_no}】物料批次【{item.batch_num}】的盘盈数量有误");
                        //找所有库存
                        List<Dt_InventoryInfo> inventoryInfos = _inventoryInfoService.Repository.QueryData(x => x.MaterielCode == inventory_Batch.MaterielCode && x.BatchNo == inventory_Batch.BatchNo);
                        List<Dt_InventoryInfo> inventoryInfos = _InventoryInfos.Where(x => x.MaterielCode == inventory_Batch.MaterielCode && x.BatchNo == inventory_Batch.BatchNo).ToList();
                        //获取立库盘点差异数
                        var inventoryLK = inventoryInfos.Where(x => x.WarehouseCode == WareCodeLK).First();
                        var LkQty = Math.Abs(inventoryLK.StockQuantity - inventoryLK.SupplyQuantity);
@@ -613,17 +641,20 @@
                                        SupplyQuantity = 0,
                                        Remark = "盘盈入库"
                                    };
                                    _supplyTaskHtyService.AddData(supplyTask_Hty);
                                    //_supplyTaskHtyService.AddData(supplyTask_Hty);
                                    supplyTask_Hties.Add(supplyTask_Hty);
                                }
                                #endregion
                                inventoryInfo.StockQuantity = inventoryInfo.SupplyQuantity;
                                inventoryInfo.SupplyQuantity = 0;
                                inventoryInfo.StockStatus = StockStatusEmun.入库完成.ObjToInt();
                            }
                            _inventoryInfoService.UpdateData(inventoryInfos);
                            //_inventoryInfoService.UpdateData(inventoryInfos);
                            infosUp.AddRange(inventoryInfos);
                            inventory_Batch.StockQuantity = inventory_Batch.SupplyQuantity;
                            inventory_Batch.SupplyQuantity = 0;
                            _inventory_BatchServices.UpdateData(inventory_Batch);
                            //_inventory_BatchServices.UpdateData(inventory_Batch);
                            batchesUp.Add(inventory_Batch);
                            #endregion
                            #region åˆ›å»ºå¤§ä»¶åº“盘点单
@@ -649,8 +680,8 @@
                                }).ToList()
                            };
                            //Repository.AddData(entityOrder);
                            Db.InsertNav(entityOrder).Include(it => it.Details).ExecuteCommand();
                            //Db.InsertNav(entityOrder).Include(it => it.Details).ExecuteCommand();
                            cabinOrdersAdd.Add(entityOrder);
                            #endregion
                        }
                        else
@@ -681,14 +712,16 @@
                                        SupplyQuantity = 0,
                                        Remark = "盘盈入库"
                                    };
                                    _supplyTaskHtyService.AddData(supplyTask_Hty);
                                    //_supplyTaskHtyService.AddData(supplyTask_Hty);
                                    supplyTask_Hties.Add(supplyTask_Hty);
                                }
                                #endregion
                                inventoryInfo.StockQuantity = inventoryInfo.SupplyQuantity;
                                inventoryInfo.SupplyQuantity = 0;
                                inventoryInfo.StockStatus = StockStatusEmun.入库完成.ObjToInt();
                            }
                            _inventoryInfoService.UpdateData(inventoryInfos);
                            //_inventoryInfoService.UpdateData(inventoryInfos);
                            infosUp.AddRange(inventoryInfos);
                            #endregion
                            #region åˆ›å»ºå¤§ä»¶åº“盘点单
@@ -716,8 +749,8 @@
                                    }).ToList()
                                };
                                //Repository.AddData(cabinOrder);
                                Db.InsertNav(cabinOrder).Include(it => it.Details).ExecuteCommand();
                                //Db.InsertNav(cabinOrder).Include(it => it.Details).ExecuteCommand();
                                cabinOrdersAdd.Add(cabinOrder);
                            }
                            #endregion
@@ -743,12 +776,18 @@
                                }).ToList()
                            };
                            //Repository.AddData(entityOrder);
                            Db.InsertNav(entityOrder).Include(it => it.Details).ExecuteCommand();
                            //Db.InsertNav(entityOrder).Include(it => it.Details).ExecuteCommand();
                            cabinOrdersAdd.Add(entityOrder);
                            #endregion
                        }
                    }
                    _unitOfWorkManage.BeginTran();
                    _supplyTaskHtyService.AddData(supplyTask_Hties);
                    _inventoryInfoService.UpdateData(infosUp);
                    _inventory_BatchServices.UpdateData(batchesUp);
                    BaseDal.Db.InsertNav(cabinOrdersAdd).Include(it => it.Details).ExecuteCommand();
                    _unitOfWorkManage.CommitTran();
                }
                _unitOfWorkManage.CommitTran();
            }
            catch (Exception ex)
            {
@@ -773,20 +812,20 @@
            {
                Dt_CabinOrder cabinOrder = BaseDal.QueryFirst(x => x.Id == key);
                List<Dt_CabinOrder> cabinOrders = Db.Queryable<Dt_CabinOrder>().Where(x => x.Order_no == cabinOrder.Order_no).Includes(x => x.Details).ToList();//找出所有出库单号相同的出库单
                _unitOfWorkManage.BeginTran();
                List<Dt_CabinOrderDetail> cabinOrderDetails = new List<Dt_CabinOrderDetail>();
                foreach (var item in cabinOrders)
                {
                    if (item.Details != null)
                        _cabinOrderDetailServices.Repository.DeleteAndMoveIntoHty(item.Details, OperateTypeEnum.人工完成);
                    if (item.Details != null) cabinOrderDetails.AddRange(cabinOrderDetails);
                    item.Modifier = App.User.UserName;
                    item.ModifyDate = DateTime.Now;
                    item.Details = null;
                }
                BaseDal.DeleteAndMoveIntoHty(cabinOrders, OperateTypeEnum.人工完成);
                if (cabinOrder.Order_type == InOrderTypeEnum.Allocat.ObjToInt().ToString())
                    _unitOfWorkManage.CommitTran();
                {
                    _cabinOrderDetailServices.Repository.DeleteAndMoveIntoHty(cabinOrderDetails, OperateTypeEnum.人工完成);
                    BaseDal.DeleteAndMoveIntoHty(cabinOrders, OperateTypeEnum.人工完成);
                }
                else
                {
                    var url = "http://121.37.118.63:80/GYZ2/95fck/outOrderOk";
@@ -798,13 +837,14 @@
                    var response = JsonConvert.DeserializeObject<UpstreamOrderResponse>(result);
                    if (response == null) throw new Exception("上报ERP入库单完成失败!");
                    if (response.resultCode != "0") throw new Exception(response.resultMsg);
                    _unitOfWorkManage.CommitTran();
                    _cabinOrderDetailServices.Repository.DeleteAndMoveIntoHty(cabinOrderDetails, OperateTypeEnum.人工完成);
                    BaseDal.DeleteAndMoveIntoHty(cabinOrders, OperateTypeEnum.人工完成);
                }
                content.OK();
            }
            catch (Exception ex)
            {
                _unitOfWorkManage.RollbackTran();
                content.Error(ex.Message);
            }
            return content;
н¨Îļþ¼Ð/WIDESEA_WMSServer/WIDESEA_SquareCabinServices/DeliveryOrderServices.cs
@@ -71,7 +71,6 @@
            WebResponseContent webResponseContent = new WebResponseContent();
            try
            {
                _unitOfWorkManage.BeginTran();
                Dt_Tactics tactics = _tacticsService.Repository.QueryFirst(x => x.TacticeName == "出库策略");
                #region ç‰¹æ®Šåº“房出库
                string WareCodeMJ = WarehouseEnum.麻精库.ObjToInt().ToString("000");
@@ -99,19 +98,22 @@
                            Status = 2, // pad平库,无需同步
                        }).ToList()
                    };
                    BaseDal.Db.CopyNew().InsertNav(entityOrder).Include(x => x.Details).ExecuteCommand();
                    #endregion
                    #region å¤„理库存、库存批次、添加出库任务
                    List<Dt_SupplyTask> supplyTasks = new List<Dt_SupplyTask>();
                    List<Dt_Inventory_Batch> batchesUp = new List<Dt_Inventory_Batch>();
                    List<Dt_InventoryInfo> inventoryInfosUp = new List<Dt_InventoryInfo>();
                    var inventory_Batchs = _inventory_BatchServices.Repository.QueryData(x => entityOrder.Details.Select(e => e.Goods_no).Contains(x.MaterielCode));
                    var InventoryInfos = _inventoryInfoService.Repository.QueryData(x => entityOrder.Details.Select(e => e.Goods_no).Contains(x.MaterielCode) && x.StockStatus == StockStatusEmun.入库完成.ObjToInt() && x.AvailableQuantity > 0 && x.WarehouseCode == outorder.warehouse_no);
                    foreach (var item in entityOrder.Details)
                    {
                        Dt_Inventory_Batch inventory_Batch = _inventory_BatchServices.Repository.QueryFirst(x => x.MaterielCode == item.Goods_no && x.BatchNo == item.Batch_num);
                        Dt_Inventory_Batch? inventory_Batch = inventory_Batchs.Where(x => x.MaterielCode == item.Goods_no && x.BatchNo == item.Batch_num).FirstOrDefault();
                        if (inventory_Batch == null) throw new Exception($"未找到出库单号【{entityOrder.Out_no}】中物料编号【{item.Goods_no}】物料批次【{item.Batch_num}】的库存批次信息");
                        if (inventory_Batch.AvailableQuantity < item.Order_qty) throw new Exception($"出库单号【{entityOrder.Out_no}】中物料编号【{item.Goods_no}】物料批次【{item.Batch_num}】的库存批次信息可用数量不足");
                        inventory_Batch.AvailableQuantity -= item.Order_qty;
                        inventory_Batch.OutboundQuantity += item.Order_qty;
                        List<Dt_InventoryInfo> dt_InventoryInfos = _inventoryInfoService.Repository.QueryData(x => x.MaterielCode == item.Goods_no && x.BatchNo == item.Batch_num && x.StockStatus == StockStatusEmun.入库完成.ObjToInt() && x.AvailableQuantity > 0 && x.WarehouseCode == item.Reservoirarea);
                        if (dt_InventoryInfos.Count < 1) throw new Exception($"出库单号【{entityOrder.Out_no}】中物料编号【{item.Goods_no}】物料批次【{item.Batch_num}】的库存当前状态不可出库");
                        List<Dt_InventoryInfo> dt_InventoryInfos = InventoryInfos.Where(x => x.MaterielCode == item.Goods_no && x.BatchNo == item.Batch_num).ToList();
                        if (dt_InventoryInfos.Count < 1) throw new Exception($"出库单号【{entityOrder.Out_no}】中物料编号【{item.Goods_no}】物料批次【{item.Batch_num}】的可用库存不足");
                        #region æŒ‰å‡ºåº“策略查找库存
                        if (tactics.SelectTactice == TacticsEnum.ComeOutonFirstTime.ObjToInt())
                            dt_InventoryInfos = dt_InventoryInfos.OrderBy(x => x.ValidityPeriod).ToList();
@@ -170,11 +172,16 @@
                                supplyTasks.Add(supplyTask);
                                Order_qty = 0;
                            }
                            inventoryInfosUp.Add(InventoryInfo);
                        }
                        _inventory_BatchServices.Repository.UpdateData(inventory_Batch);
                        _inventoryInfoService.Repository.UpdateData(dt_InventoryInfos);
                        batchesUp.Add(inventory_Batch);
                    }
                    _unitOfWorkManage.BeginTran();
                    _supplyTaskService.AddData(supplyTasks);
                    _inventory_BatchServices.UpdateData(batchesUp);
                    _inventoryInfoService.UpdateData(inventoryInfosUp);
                    BaseDal.Db.CopyNew().InsertNav(entityOrder).Include(x => x.Details).ExecuteCommand();
                    _unitOfWorkManage.CommitTran();
                    #endregion
                }
                #endregion
@@ -207,16 +214,22 @@
                    };
                    #endregion
                    #region æŸ¥æ‰¾åº“å­˜
                    List<Dt_Inventory_Batch> batchesUp = new List<Dt_Inventory_Batch>();
                    List<Dt_InventoryInfo> inventoryInfosUp = new List<Dt_InventoryInfo>();
                    List<Dt_SupplyTask> supplyTasks = new List<Dt_SupplyTask>();
                    List<Dt_MaterielInfo> materielInfos = _materielInfoService.Repository.QueryData(x => outorder.details.Select(e => e.goods_no).Contains(x.MaterielCode));
                    var inventory_Batchs = _inventory_BatchServices.Repository.QueryData(x => outorder.details.Select(e => e.goods_no).Contains(x.MaterielCode));
                    var InventoryInfos = _inventoryInfoService.Repository.QueryData(x => outorder.details.Select(e => e.goods_no).Contains(x.MaterielCode) && x.StockStatus == StockStatusEmun.入库完成.ObjToInt() && x.AvailableQuantity > 0 && (x.WarehouseCode == WareCodeDJ || x.WarehouseCode == WareCodeLK));
                    foreach (var detail in outorder.details)
                    {
                        #region æŸ¥è¯¢åº“存批次和库存
                        Dt_Inventory_Batch inventory_Batch = _inventory_BatchServices.Repository.QueryFirst(x => x.MaterielCode == detail.goods_no && x.BatchNo == detail.batch_num);
                        Dt_Inventory_Batch? inventory_Batch = inventory_Batchs.Where(x => x.MaterielCode == detail.goods_no && x.BatchNo == detail.batch_num).FirstOrDefault();
                        if (inventory_Batch == null) throw new Exception($"未找到出库单号【{outorder.order_no}】中物料编号【{detail.goods_no}】物料批次【{detail.batch_num}】的库存批次信息");
                        if (inventory_Batch.AvailableQuantity < detail.order_qty) throw new Exception($"出库单号【{outorder.order_no}】中物料编号【{detail.goods_no}】物料批次【{detail.batch_num}】的库存批次信息可用数量不足");
                        inventory_Batch.AvailableQuantity -= detail.order_qty;
                        inventory_Batch.OutboundQuantity += detail.order_qty;
                        List<Dt_InventoryInfo> dt_InventoryInfos = _inventoryInfoService.Repository.QueryData(x => x.MaterielCode == inventory_Batch.MaterielCode && x.BatchNo == inventory_Batch.BatchNo && x.AvailableQuantity > 0 && (x.WarehouseCode == WareCodeDJ || x.WarehouseCode == WareCodeLK));
                        if (dt_InventoryInfos.Count < 1) throw new Exception($"出库单号【{outorder.order_no}】中物料编号【{detail.goods_no}】物料批次【{detail.batch_num}】的库存当前状态不可出库");
                        List<Dt_InventoryInfo> dt_InventoryInfos = InventoryInfos.Where(x => x.MaterielCode == inventory_Batch.MaterielCode && x.BatchNo == inventory_Batch.BatchNo).ToList();
                        if (dt_InventoryInfos.Count < 1) throw new Exception($"出库单号【{outorder.order_no}】中物料编号【{detail.goods_no}】物料批次【{detail.batch_num}】的可用库存不足");
                        #endregion
                        #region æŒ‰å‡ºåº“策略查找库存
                        if (tactics.SelectTactice == TacticsEnum.ComeOutonFirstTime.ObjToInt())
@@ -226,7 +239,7 @@
                        #endregion
                        var Order_qty = Math.Abs(detail.order_qty);//出库单数量
                        #region æ ¹æ®ç‰©æ–™ç¼–码查询物料信息
                        Dt_MaterielInfo materielInfo = _materielInfoService.Repository.QueryFirst(x => x.MaterielCode == detail.goods_no);
                        Dt_MaterielInfo? materielInfo = materielInfos.Where(x => x.MaterielCode == detail.goods_no).FirstOrDefault();
                        if (materielInfo == null) throw new Exception($"未找到药品编码【{detail.goods_no}】的信息");
                        if (!Enum.IsDefined(typeof(MaterielSourceTypeEnum), materielInfo.MaterielSourceType))
                            throw new Exception($"请设置药品编号【{detail.goods_no}】的属性分类");
@@ -249,7 +262,6 @@
                            entityOrder.Details.Add(orderDetail);
                            #endregion
                            List<Dt_SupplyTask> supplyTasks = new List<Dt_SupplyTask>();
                            #region è®¡ç®—库存、添加出库任务
                            foreach (var InventoryInfo in dt_InventoryInfos)
                            {
@@ -304,15 +316,16 @@
                                }
                            }
                            #endregion
                            _inventory_BatchServices.Repository.UpdateData(inventory_Batch);
                            _inventoryInfoService.Repository.UpdateData(dt_InventoryInfos);
                            _supplyTaskService.AddData(supplyTasks);
                            inventoryInfosUp.AddRange(dt_InventoryInfos);
                            batchesUp.Add(inventory_Batch);
                            //_inventory_BatchServices.Repository.UpdateData(inventory_Batch);
                            //_inventoryInfoService.Repository.UpdateData(dt_InventoryInfos);
                            //_supplyTaskService.AddData(supplyTasks);
                        }
                        #endregion
                        else
                        {
                            if (materielInfo.BoxQty < 1) throw new Exception($"请设置药品编号【{detail.goods_no}】的箱规数量");
                            List<Dt_SupplyTask> supplyTasks = new List<Dt_SupplyTask>();
                            Dt_DeliveryOrderDetail orderDetail = null;
                            Dt_DeliveryOrderDetail orderDetailLK = null;
                            var ys = Order_qty % materielInfo.BoxQty; //不能整除箱规的散件数 
@@ -385,7 +398,8 @@
                                    Remark = "出库"
                                };
                                supplyTasks.Add(supplyTask);
                                _inventoryInfoService.Repository.UpdateData(item);
                                inventoryInfosUp.Add(item);
                                //_inventoryInfoService.Repository.UpdateData(item);
                            }
                            #endregion
@@ -439,22 +453,28 @@
                                };
                                supplyTasks.Add(supplyTask);
                                #endregion
                                _inventoryInfoService.Repository.UpdateData(inventoryInfo);
                                //_inventoryInfoService.Repository.UpdateData(inventoryInfo);
                                inventoryInfosUp.Add(inventoryInfo);
                                entityOrderLK.Details.Add(orderDetailLK);
                            }
                            #endregion
                            if (orderDetail != null) entityOrder.Details.Add(orderDetail);
                            _inventory_BatchServices.Repository.UpdateData(inventory_Batch);
                            _supplyTaskService.AddData(supplyTasks);
                            batchesUp.Add(inventory_Batch);
                            //_inventory_BatchServices.Repository.UpdateData(inventory_Batch);
                            //_supplyTaskService.AddData(supplyTasks);
                        }
                    }
                    _unitOfWorkManage.BeginTran();
                    _supplyTaskService.AddData(supplyTasks);
                    _inventory_BatchServices.UpdateData(batchesUp);
                    _inventoryInfoService.UpdateData(inventoryInfosUp);
                    if (entityOrder.Details.Count > 0)
                        BaseDal.Db.CopyNew().InsertNav(entityOrder).Include(x => x.Details).ExecuteCommand();
                    if (entityOrderLK.Details.Count > 0)
                        BaseDal.Db.CopyNew().InsertNav(entityOrderLK).Include(x => x.Details).ExecuteCommand();
                    _unitOfWorkManage.CommitTran();
                    #endregion
                }
                _unitOfWorkManage.CommitTran();
                webResponseContent.OK();
            }
            catch (Exception ex)
@@ -472,21 +492,26 @@
            WebResponseContent content = new WebResponseContent();
            try
            {
                _unitOfWorkManage.BeginTran();
                string WareCodeMJ = WarehouseEnum.麻精库.ObjToInt().ToString("000");
                string WareCodeLD = WarehouseEnum.冷冻库.ObjToInt().ToString("000");
                List<Dt_SupplyTask_Hty> supplyTask_Hties = new List<Dt_SupplyTask_Hty>();
                List<Dt_Inventory_Batch> batchesUp = new List<Dt_Inventory_Batch>();
                List<Dt_InventoryInfo> infosUp = new List<Dt_InventoryInfo>();
                var codes = order.details.Select(x => x.goods_no).ToList();
                #region ç‰¹æ®Šåº“房
                if (order.warehouse_no == WareCodeMJ || order.warehouse_no == WareCodeLD)
                {
                    List<Dt_Inventory_Batch> inventory_Batchs = _inventory_BatchServices.Repository.QueryData(x => codes.Contains(x.MaterielCode));
                    List<Dt_InventoryInfo> _InventoryInfos = _inventoryInfoService.Repository.QueryData(x => codes.Contains(x.MaterielCode));
                    #region åº“存、库存批次平账
                    foreach (var item in order.details)
                    {
                        //找库存批次信息
                        Dt_Inventory_Batch inventory_Batch = _inventory_BatchServices.Repository.QueryFirst(x => x.MaterielCode == item.goods_no && x.BatchNo == item.batch_num);
                        Dt_Inventory_Batch inventory_Batch = inventory_Batchs.Where(x => x.MaterielCode == item.goods_no && x.BatchNo == item.batch_num).First();
                        var Qty = Math.Abs(inventory_Batch.StockQuantity - inventory_Batch.SupplyQuantity);
                        if (Qty != item.order_qty) throw new Exception($"盘亏出库单【{order.order_no}】物料编号【{item.goods_no}】物料批次【{item.batch_num}】的盘亏数量有误");
                        //找所有库存
                        List<Dt_InventoryInfo> inventoryInfos = _inventoryInfoService.Repository.QueryData(x => x.MaterielCode == inventory_Batch.MaterielCode && x.BatchNo == inventory_Batch.BatchNo);
                        List<Dt_InventoryInfo> inventoryInfos = _InventoryInfos.Where(x => x.MaterielCode == inventory_Batch.MaterielCode && x.BatchNo == inventory_Batch.BatchNo).ToList();
                        foreach (var inventoryInfo in inventoryInfos)
                        {
                            #region æ·»åŠ ç›˜äºå‡ºåº“ä»»åŠ¡
@@ -511,7 +536,8 @@
                                    SupplyQuantity = 0,
                                    Remark = "盘亏入库"
                                };
                                _supplyTaskHtyService.AddData(supplyTask_Hty);
                                //_supplyTaskHtyService.AddData(supplyTask_Hty);
                                supplyTask_Hties.Add(supplyTask_Hty);
                            }
                            #endregion
                            inventoryInfo.StockQuantity = inventoryInfo.SupplyQuantity;
@@ -520,8 +546,10 @@
                        }
                        inventory_Batch.StockQuantity = inventory_Batch.SupplyQuantity;
                        inventory_Batch.SupplyQuantity = 0;
                        _inventoryInfoService.UpdateData(inventoryInfos);
                        _inventory_BatchServices.UpdateData(inventory_Batch);
                        infosUp.AddRange(inventoryInfos);
                        batchesUp.Add(inventory_Batch);
                        //_inventoryInfoService.UpdateData(inventoryInfos);
                        //_inventory_BatchServices.UpdateData(inventory_Batch);
                    }
                    #endregion
@@ -547,23 +575,30 @@
                            Status = 2,
                        }).ToList()
                    };
                    Repository.AddData(entityOrder);
                    _unitOfWorkManage.BeginTran();
                    _supplyTaskHtyService.AddData(supplyTask_Hties);
                    _inventoryInfoService.UpdateData(infosUp);
                    _inventory_BatchServices.UpdateData(batchesUp);
                    BaseDal.Db.InsertNav(entityOrder).Include(it => it.Details).ExecuteCommand();
                    _unitOfWorkManage.CommitTran();
                    #endregion
                }
                #endregion
                else
                {
                    List<Dt_DeliveryOrder> deliveryOrdersAdd = new List<Dt_DeliveryOrder>();
                    string WareCodeLK = WarehouseEnum.立库.ObjToInt().ToString("000");
                    string WareCodeDJ = WarehouseEnum.大件库.ObjToInt().ToString("000");
                    List<Dt_Inventory_Batch> inventory_Batchs = _inventory_BatchServices.Repository.QueryData(x => codes.Contains(x.MaterielCode));
                    List<Dt_InventoryInfo> _InventoryInfos = _inventoryInfoService.Repository.QueryData(x => codes.Contains(x.MaterielCode));
                    foreach (var item in order.details)
                    {
                        //找库存批次信息
                        Dt_Inventory_Batch inventory_Batch = _inventory_BatchServices.Repository.QueryFirst(x => x.MaterielCode == item.goods_no && x.BatchNo == item.batch_num);
                        Dt_Inventory_Batch inventory_Batch = inventory_Batchs.Where(x => x.MaterielCode == item.goods_no && x.BatchNo == item.batch_num).First();
                        var Qty = Math.Abs(inventory_Batch.StockQuantity - inventory_Batch.SupplyQuantity);
                        if (Qty != item.order_qty) throw new Exception($"盘盈入库单【{order.order_no}】物料编号【{item.goods_no}】物料批次【{item.batch_num}】的盘盈数量有误");
                        if (Qty != item.order_qty) throw new Exception($"盘亏出库单【{order.order_no}】物料编号【{item.goods_no}】物料批次【{item.batch_num}】的盘亏数量有误");
                        //找所有库存
                        List<Dt_InventoryInfo> inventoryInfos = _inventoryInfoService.Repository.QueryData(x => x.MaterielCode == inventory_Batch.MaterielCode && x.BatchNo == inventory_Batch.BatchNo);
                        List<Dt_InventoryInfo> inventoryInfos = _InventoryInfos.Where(x => x.MaterielCode == inventory_Batch.MaterielCode && x.BatchNo == inventory_Batch.BatchNo).ToList();
                        //获取立库盘点差异数.。。。。。。。。。。。。
                        var inventoryLK = inventoryInfos.Where(x => x.WarehouseCode == WareCodeLK).First();
                        var LkQty = Math.Abs(inventoryLK.StockQuantity - inventoryLK.SupplyQuantity);
@@ -598,17 +633,20 @@
                                        SupplyQuantity = 0,
                                        Remark = "盘亏入库"
                                    };
                                    _supplyTaskHtyService.AddData(supplyTask_Hty);
                                    //_supplyTaskHtyService.AddData(supplyTask_Hty);
                                    supplyTask_Hties.Add(supplyTask_Hty);
                                }
                                #endregion
                                inventoryInfo.StockQuantity = inventoryInfo.SupplyQuantity;
                                inventoryInfo.SupplyQuantity = 0;
                                inventoryInfo.StockStatus = StockStatusEmun.入库完成.ObjToInt();
                            }
                            _inventoryInfoService.UpdateData(inventoryInfos);
                            //_inventoryInfoService.UpdateData(inventoryInfos);
                            inventory_Batch.StockQuantity = inventory_Batch.SupplyQuantity;
                            inventory_Batch.SupplyQuantity = 0;
                            _inventory_BatchServices.UpdateData(inventory_Batch);
                            //_inventory_BatchServices.UpdateData(inventory_Batch);
                            infosUp.AddRange(inventoryInfos);
                            batchesUp.Add(inventory_Batch);
                            #endregion
                            #region åˆ›å»ºå¤§ä»¶åº“盘点单
@@ -633,8 +671,9 @@
                                    Status = 2,
                                }).ToList()
                            };
                            Db.InsertNav(entityOrder).Include(it => it.Details).ExecuteCommand();
                            //Db.InsertNav(entityOrder).Include(it => it.Details).ExecuteCommand();
                            //Repository.AddData(entityOrder);
                            deliveryOrdersAdd.Add(entityOrder);
                            #endregion
                        }
                        else
@@ -665,14 +704,16 @@
                                        SupplyQuantity = 0,
                                        Remark = "盘亏出库"
                                    };
                                    _supplyTaskHtyService.AddData(supplyTask_Hty);
                                    //_supplyTaskHtyService.AddData(supplyTask_Hty);
                                    supplyTask_Hties.Add(supplyTask_Hty);
                                }
                                #endregion
                                inventoryInfo.StockQuantity = inventoryInfo.SupplyQuantity;
                                inventoryInfo.SupplyQuantity = 0;
                                inventoryInfo.StockStatus = StockStatusEmun.入库完成.ObjToInt();
                            }
                            _inventoryInfoService.UpdateData(inventoryInfos);
                            //_inventoryInfoService.UpdateData(inventoryInfos);
                            infosUp.AddRange(inventoryInfos);
                            #endregion
                            #region åˆ›å»ºå¤§ä»¶åº“盘点单
@@ -700,7 +741,8 @@
                                    }).ToList()
                                };
                                //Repository.AddData(cabinOrder);
                                Db.InsertNav(cabinOrder).Include(it => it.Details).ExecuteCommand();
                                //Db.InsertNav(cabinOrder).Include(it => it.Details).ExecuteCommand();
                                deliveryOrdersAdd.Add(cabinOrder);
                            }
                            #endregion
@@ -725,14 +767,20 @@
                                    Status = 0,
                                }).ToList()
                            };
                            Db.InsertNav(entityOrder).Include(it => it.Details).ExecuteCommand();
                            //Db.InsertNav(entityOrder).Include(it => it.Details).ExecuteCommand();
                            //Repository.AddData(entityOrder);
                            deliveryOrdersAdd.Add(entityOrder);
                            #endregion
                        }
                        //return WebResponseContent.Instance.OK("成功");
                    }
                    _unitOfWorkManage.BeginTran();
                    _supplyTaskHtyService.AddData(supplyTask_Hties);
                    _inventoryInfoService.UpdateData(infosUp);
                    _inventory_BatchServices.UpdateData(batchesUp);
                    BaseDal.Db.InsertNav(deliveryOrdersAdd).Include(it => it.Details).ExecuteCommand();
                    _unitOfWorkManage.CommitTran();
                }
                _unitOfWorkManage.CommitTran();
                return WebResponseContent.Instance.OK("成功");
            }
            catch (Exception ex)
@@ -880,7 +928,9 @@
                Dt_SupplyTask supplyTask = _supplyTaskService.Repository.QueryFirst(x => x.TaskId == TaskId && x.TaskStatus == SupplyStatusEnum.NewOut.ObjToInt());
                if (supplyTask == null) throw new Exception("当前出库任务已完成");
                if (supplyTask.LocationCode != LocationCode) throw new Exception($"当前出库货位【{LocationCode}】与任务分配货位不匹配");
                content = OutTaskFinish(supplyTask);
                Dt_DeliveryOrder deliveryOrder = BaseDal.Db.Queryable<Dt_DeliveryOrder>().Where(x => x.Out_no == supplyTask.OrderNo && x.Warehouse_no == supplyTask.WarehouseCode).Includes(x => x.Details).First();
                if (deliveryOrder == null) return WebResponseContent.Instance.OK($"出库单已完成");
                content = OutTaskFinish(supplyTask, deliveryOrder);
            }
            catch (Exception ex)
            {
@@ -888,17 +938,93 @@
            }
            return content;
        }
        public WebResponseContent OutTaskFinish(Dt_SupplyTask supplyTask, Dt_DeliveryOrder deliveryOrder)
        {
            WebResponseContent content = new WebResponseContent();
            try
            {
                Dt_DeliveryOrderDetail? cabinOrderDetail = deliveryOrder.Details.FirstOrDefault(x => x.Batch_num == supplyTask.BatchNo && x.Goods_no == supplyTask.MaterielCode);
                if (cabinOrderDetail == null) throw new Exception($"出库单明细未找到");
                Dt_MaterielInfo materielInfo = _materielInfoService.Repository.QueryFirst(x => x.MaterielCode == supplyTask.MaterielCode);
                if (materielInfo == null) throw new Exception($"请维护物料编号【{supplyTask.MaterielCode}】的物料信息");
                cabinOrderDetail.Order_Outqty += supplyTask.StockQuantity;
                if (cabinOrderDetail.Order_Outqty > cabinOrderDetail.Order_qty) throw new Exception($"出库数量不可超出单据数量");
                deliveryOrder.OutStatus = "开始";
                cabinOrderDetail.OotDetailStatus = "开始";
                if (cabinOrderDetail.Order_Outqty == cabinOrderDetail.Order_qty) cabinOrderDetail.OotDetailStatus = "已完成";
                #region åº“å­˜
                Dt_InventoryInfo inventoryInfo = _inventoryInfoService.Repository.QueryFirst(x => x.BatchNo == cabinOrderDetail.Batch_num && x.MaterielCode == cabinOrderDetail.Goods_no && x.LocationCode == supplyTask.LocationCode);
                if (inventoryInfo == null) throw new Exception($"未找到货位【{supplyTask.LocationCode}】的库存信息");
                inventoryInfo.StockQuantity -= supplyTask.StockQuantity;
                inventoryInfo.OutboundQuantity -= supplyTask.StockQuantity;
                #endregion
                Dt_LocationInfo location = _locationInfoService.Repository.QueryFirst(x => x.LocationCode == supplyTask.LocationCode);
                #region è´§ä½
                if (supplyTask.WarehouseCode != WarehouseEnum.立库.ObjToInt().ToString("000"))
                {
                    if (location == null)
                        return WebResponseContent.Instance.Error($"请维护货位编号【{supplyTask.LocationCode}】的货位信息");
                    Dt_InventoryInfo inventoryInfo1 = _inventoryInfoService.Repository.QueryFirst(x => x.LocationCode == supplyTask.LocationCode);
                    if (inventoryInfo1 == null) location.LocationStatus = LocationStatusEnum.Free.ObjToInt();
                }
                #endregion
                #region åº“存批次 å¦‚果任务类型是调拨出库任务(8)就不修改批次库存
                Dt_Inventory_Batch inventory_Batch = _inventory_BatchServices.Repository.QueryFirst(x => x.BatchNo == inventoryInfo.BatchNo && x.MaterielCode ==
                    inventoryInfo.MaterielCode);
                if (supplyTask.TaskType != TaskTypeEnum.AllocatOut.ObjToInt())
                {
                    inventory_Batch.StockQuantity -= supplyTask.StockQuantity;
                    inventory_Batch.OutboundQuantity -= supplyTask.StockQuantity;
                }
                #endregion
                if (supplyTask.WarehouseCode == WarehouseEnum.立库.ObjToInt().ToString("000"))
                {
                    materielInfo.Business_qty -= supplyTask.StockQuantity;
                    if (materielInfo.Business_qty < materielInfo.MinQty)
                        CreateAllocatInOut(materielInfo);//创建调拨任务
                }
                supplyTask.TaskStatus = SupplyStatusEnum.OutFinish.ObjToInt();
                _unitOfWorkManage.BeginTran();
                if (inventory_Batch.StockQuantity <= 0)
                    _inventory_BatchServices.DeleteData(inventory_Batch);
                else
                    _inventory_BatchServices.UpdateData(inventory_Batch);
                _materielInfoService.UpdateData(materielInfo);
                if (inventoryInfo.StockQuantity <= 0)
                    _inventoryInfoService.DeleteData(inventoryInfo);
                else
                    _inventoryInfoService.UpdateData(inventoryInfo);
                if (location != null) _locationInfoService.UpdateData(location);
                _deliveryOrderDetailServices.UpdateData(cabinOrderDetail);
                _supplyTaskService.Repository.DeleteAndMoveIntoHty(supplyTask, OperateTypeEnum.人工完成);
                _unitOfWorkManage.CommitTran();
                #region åˆ¤æ–­è¯¦æƒ…是否全部完成
                if (!_deliveryOrderDetailServices.Repository.QueryData(x => x.DeliveryOrderId == deliveryOrder.Id && x.OotDetailStatus != "已完成").Any())
                    deliveryOrder.OutStatus = "已完成";
                BaseDal.UpdateData(deliveryOrder);
                #endregion
            }
            catch (Exception ex)
            {
                _unitOfWorkManage.RollbackTran();
                content.Error(ex.Message);
            }
            return content;
        }
        public WebResponseContent OutTaskFinish(Dt_SupplyTask supplyTask)
        {
            WebResponseContent content = new WebResponseContent();
            try
            {
                Dt_DeliveryOrder? cabinOrder = BaseDal.Db.CopyNew().Queryable<Dt_DeliveryOrder>().Where(x => x.Out_no == supplyTask.OrderNo && x.Warehouse_no == supplyTask.WarehouseCode).Includes(x => x.Details).First();
                if (cabinOrder == null) return WebResponseContent.Instance.Error($"出库单已完成");
                if (cabinOrder == null) return WebResponseContent.Instance.OK($"出库单已完成");
                Dt_DeliveryOrderDetail? cabinOrderDetail = cabinOrder.Details.Where(x => x.Batch_num == supplyTask.BatchNo && x.Reservoirarea == supplyTask.WarehouseCode && x.Goods_no == supplyTask.MaterielCode).FirstOrDefault();
                if (cabinOrderDetail == null) return WebResponseContent.Instance.Error($"出库单明细已完成");
                if (cabinOrderDetail == null) return WebResponseContent.Instance.Error($"出库单明细未找到");
                Dt_MaterielInfo materielInfo = _materielInfoService.Repository.QueryFirst(x => x.MaterielCode == cabinOrderDetail.Goods_no);
                if (materielInfo == null) return WebResponseContent.Instance.Error($"请维护物料编号【{cabinOrderDetail.Goods_no}】的物料信息");
                cabinOrderDetail.Order_Outqty += supplyTask.StockQuantity;
@@ -907,7 +1033,7 @@
                #region å¤„理出库单,货位,库存,库存批次信息,出库任务
                _unitOfWorkManage.BeginTran();
                //_unitOfWorkManage.BeginTran();
                #region å‡ºåº“单
                cabinOrder.OutStatus = "开始";
@@ -979,7 +1105,7 @@
                    if (materielInfo.Business_qty < materielInfo.MinQty)
                        CreateAllocatInOut(materielInfo);//创建调拨任务
                }
                _unitOfWorkManage.CommitTran();
                //_unitOfWorkManage.CommitTran();
                #endregion
                content.OK();
            }
@@ -1002,23 +1128,22 @@
            {
                Dt_DeliveryOrder deliveryOrder = BaseDal.QueryFirst(x => x.Id == key);
                List<Dt_DeliveryOrder> deliveryOrders = Db.Queryable<Dt_DeliveryOrder>().Where(x => x.Out_no == deliveryOrder.Out_no).Includes(x => x.Details).ToList();//找出所有出库单号相同的出库单
                _unitOfWorkManage.BeginTran();
                List<Dt_DeliveryOrderDetail> deliveryOrderDetails = new List<Dt_DeliveryOrderDetail>();
                foreach (var item in deliveryOrders)
                {
                    if (item.Details != null)
                        _deliveryOrderDetailServices.Repository.DeleteAndMoveIntoHty(item.Details, OperateTypeEnum.人工完成);
                    if (item.Details != null) deliveryOrderDetails.AddRange(item.Details);
                    item.Modifier = App.User.UserName;
                    item.ModifyDate = DateTime.Now;
                    item.Details = null;
                }
                BaseDal.DeleteAndMoveIntoHty(deliveryOrders, OperateTypeEnum.人工完成);
                if (deliveryOrder.Out_type == OutOrderTypeEnum.Allocate.ObjToInt().ToString())
                    _unitOfWorkManage.CommitTran();
                {
                    _deliveryOrderDetailServices.Repository.DeleteAndMoveIntoHty(deliveryOrderDetails, OperateTypeEnum.人工完成);
                    BaseDal.DeleteAndMoveIntoHty(deliveryOrders, OperateTypeEnum.人工完成);
                }
                else
                {
                    var url = "http://121.37.118.63:80/GYZ2/95fck/outOrderOk";
                    var requestDate = new
                    {
                        order_no = deliveryOrder.Out_no
@@ -1027,13 +1152,13 @@
                    var response = JsonConvert.DeserializeObject<UpstreamOrderResponse>(result);
                    if (response == null) throw new Exception("上报ERP出库单完成失败!");
                    if (response.resultCode != "0") throw new Exception(response.resultMsg);
                    _unitOfWorkManage.CommitTran();
                    _deliveryOrderDetailServices.Repository.DeleteAndMoveIntoHty(deliveryOrderDetails, OperateTypeEnum.人工完成);
                    BaseDal.DeleteAndMoveIntoHty(deliveryOrders, OperateTypeEnum.人工完成);
                }
                content.OK();
            }
            catch (Exception ex)
            {
                _unitOfWorkManage.RollbackTran();
                content.Error(ex.Message);
            }
            return content;
н¨Îļþ¼Ð/WIDESEA_WMSServer/WIDESEA_SquareCabinServices/InventoryServices.cs
@@ -28,12 +28,15 @@
{
    public class InventoryServices : ServiceBase<Dt_Inventory, IRepository<Dt_Inventory>>, IInventoryServices
    {
        private readonly ICabinOrderServices _cabinOrderServices;
        private readonly IDeliveryOrderServices _deliveryOrderServices;
        public InventoryServices(IRepository<Dt_Inventory> BaseDal, IDeliveryOrderServices deliveryOrderServices) : base(BaseDal)
        private readonly ISupplyTaskService _supplyTaskService;
        public InventoryServices(IRepository<Dt_Inventory> BaseDal, ICabinOrderServices cabinOrderServices, IDeliveryOrderServices deliveryOrderServices, ISupplyTaskService supplyTaskService) : base(BaseDal)
        {
            _cabinOrderServices = cabinOrderServices;
            _deliveryOrderServices = deliveryOrderServices;
            _supplyTaskService = supplyTaskService;
        }
        /// <summary>
        /// èŽ·å–ä¸Šæ¸¸åº“å­˜ä¿¡æ¯
@@ -88,13 +91,85 @@
        }
        public ApiResponse<Dt_InventoryInfo> OrderFeedback(EdiOrderCallbackRequest request)
        {
            try
            {
                if (request == null || request.details == null || request.details.Count < 1) throw new Exception("请求参数无效");
                var Warecode = WarehouseEnum.立库.ObjToInt().ToString("000");
                switch (request.orderType)
                {
                    case "1": //入库
                        {
                            Dt_CabinOrder cabinOrder = _cabinOrderServices.Db.Queryable<Dt_CabinOrder>().Where(x => x.Order_no == request.externalOrderNo && x.Warehouse_no == Warecode).Includes(x => x.Details).First();
                            if (cabinOrder == null) throw new Exception($"未找到入库单号【{request.externalOrderNo}】的入库单信息");
                            if (cabinOrder.OdrderStatus == "已完成")
                                return new ApiResponse<Dt_InventoryInfo> { code = "0", msg = $"成功" };
                            WebResponseContent content = _cabinOrderServices.CompleteLKInOrder(cabinOrder, request);
                            if (!content.Status) throw new Exception(content.Message);
                        }
                        break;
                    case "2":
                        {
                            Dt_DeliveryOrder deliveryOrder = _deliveryOrderServices.Db.Queryable<Dt_DeliveryOrder>().Where(x => x.Out_no == request.externalOrderNo && x.Warehouse_no == Warecode).Includes(x => x.Details).First();
                            if (deliveryOrder == null) throw new Exception($"未找到出库单号【{request.externalOrderNo}】的出库单信息");
                            if (deliveryOrder.OutStatus == "已完成")
                                return new ApiResponse<Dt_InventoryInfo> { code = "0", msg = $"成功" };
                            WebResponseContent content = _deliveryOrderServices.CompleteLKOutOrder(deliveryOrder, request);
                            if (!content.Status) throw new Exception(content.Message);
                        }
                        break;
                    case "3":
                        {
                            #region æ‰¾ç›˜ç‚¹ä»»åŠ¡
                            List<Dt_SupplyTask> supplyTasks = _supplyTaskService.Repository.QueryData(x => x.OrderNo == request.externalOrderNo && x.WarehouseCode == Warecode && x.TaskStatus == SupplyStatusEnum.NewCheck.ObjToInt());
                            foreach (var detail in request.details)
                            {
                                Dt_SupplyTask? supplyTask = supplyTasks.Where(x => x.MaterielCode == detail.productCode && x.BatchNo == detail.batchNo).FirstOrDefault();
                                if (supplyTask == null) throw new Exception($"未找到订单号【{request.externalOrderNo}】物料编号【{detail.productCode}】的盘点任务");
                                if (detail.isLossOrProfit == 1) // ç›˜äº
                                {
                                    supplyTask.SupplyQuantity = supplyTask.StockQuantity - detail.ea;
                                }
                                else if (detail.isLossOrProfit == 2) // ç›˜ç›ˆ
                                {
                                    supplyTask.SupplyQuantity = supplyTask.StockQuantity + detail.ea;
                                }
                                else // ç›˜ä¸­
                                {
                                    supplyTask.SupplyQuantity = supplyTask.StockQuantity;
                                }
                                var content = _deliveryOrderServices.CheckTaskFinish(supplyTask);
                                if (!content.Status) throw new Exception(content.Message);
                            }
                            #endregion
                        }
                        break;
                    default:
                        throw new Exception($"未定义的类型【{request.orderType}】");
                }
                return new ApiResponse<Dt_InventoryInfo>
                {
                    code = "0",
                    msg = $"成功"
                };
            }
            catch (Exception ex)
            {
                return new ApiResponse<Dt_InventoryInfo>
                {
                    code = "500",
                    msg = $"处理失败: {ex.Message}"
                };
            }
        }
        /// <summary>
        /// wcs回传给我调用我的方法 ä¸ç®¡æ˜¯å…¥åº“ å‡ºåº“ ç›˜ç‚¹éƒ½ä¼šè°ƒç”¨è¿™ä¸ªæŽ¥å£
        /// </summary>
        /// <param name="request"></param>
        /// <returns></returns>
        public ApiResponse<Dt_InventoryInfo> OrderFeedback(EdiOrderCallbackRequest request)
        public ApiResponse<Dt_InventoryInfo> OrderFeedback1(EdiOrderCallbackRequest request)
        {
            try
            {
@@ -105,7 +180,7 @@
                }
                var reslut = WarehouseEnum.立库.ObjToInt().ToString("000");
                // 2️⃣ å¼€å¯äº‹åŠ¡
                BaseDal.Db.Ado.BeginTran();
                //BaseDal.Db.Ado.BeginTran();
                foreach (var detail in request.details)
                {
                    #region æŸ¥è¯¢ç‰©æ–™ä¿¡æ¯ã€è®¡ç®—总和
@@ -306,7 +381,7 @@
                        case "2":
                            {
                                Dt_DeliveryOrder cabinOrder = Db.Queryable<Dt_DeliveryOrder>().Where(x => x.Out_no == request.externalOrderNo && x.Warehouse_no == reslut).Includes(x => x.Details).First();
                                if (cabinOrder == null) throw new Exception($"未找到出库单号【{request.externalOrderNo}】的入库单信息");
                                if (cabinOrder == null) throw new Exception($"未找到出库单号【{request.externalOrderNo}】的出库单信息");
                                if (cabinOrder.Out_type == "6")
                                {
@@ -398,7 +473,7 @@
                }
                // 9️⃣ æäº¤äº‹åŠ¡
                BaseDal.Db.Ado.CommitTran();
                //BaseDal.Db.Ado.CommitTran();
                return new ApiResponse<Dt_InventoryInfo>
                {
@@ -409,13 +484,15 @@
            catch (Exception ex)
            {
                // ðŸ”Ÿ å›žæ»šäº‹åŠ¡
                BaseDal.Db.Ado.RollbackTran();
                //BaseDal.Db.Ado.RollbackTran();
                return new ApiResponse<Dt_InventoryInfo>
                {
                    code = "500",
                    msg = $"处理失败: {ex.Message}"
                };
                //Console.WriteLine(ex.Message);
            }
        }
н¨Îļþ¼Ð/WIDESEA_WMSServer/WIDESEA_SquareCabinServices/LKBusiness/CabinOrderServicesLK.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,231 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using WIDESEA_Common.OrderEnum;
using WIDESEA_Common.StockEnum;
using WIDESEA_Common.TaskEnum;
using WIDESEA_Core;
using WIDESEA_Core.Enums;
using WIDESEA_Core.Helper;
using WIDESEA_Model.Models;
using static WIDESEA_DTO.SquareCabin.OrderDto;
using static WIDESEA_DTO.SquareCabin.TowcsDto;
namespace WIDESEA_SquareCabinServices
{
    public partial class CabinOrderServices
    {
        /// <summary>
        /// ç«‹åº“入库任务完成
        /// </summary>
        /// <param name="request"></param>
        /// <returns></returns>
        public WebResponseContent CompleteLKInOrder(Dt_CabinOrder cabinOrder, EdiOrderCallbackRequest request)
        {
            WebResponseContent content = new WebResponseContent();
            try
            {
                List<Dt_CabinOrderDetail> cabinOrderDetailsUp = new List<Dt_CabinOrderDetail>();
                List<Dt_SupplyTask_Hty> supplyTask_Hties = new List<Dt_SupplyTask_Hty>();
                List<Dt_InventoryInfo> infosUp = new List<Dt_InventoryInfo>();
                List<Dt_InventoryInfo> infosAdd = new List<Dt_InventoryInfo>();
                List<Dt_Inventory_Batch> batchesUp = new List<Dt_Inventory_Batch>();
                List<Dt_Inventory_Batch> batchesAdd = new List<Dt_Inventory_Batch>();
                List<Dt_MaterielInfo> materielInfos = _materielInfoService.Repository.QueryData(x => cabinOrder.Details.Select(x => x.Goods_no).ToList().Contains(x.MaterielCode));
                List<Dt_InventoryInfo> inventoryInfos = _inventoryInfoService.Repository.QueryData(x => cabinOrder.Warehouse_no == x.WarehouseCode && cabinOrder.Details.Select(x => x.Goods_no).ToList().Contains(x.MaterielCode));
                List<Dt_Inventory_Batch> inventory_Batches = _inventory_BatchServices.Repository.QueryData(x => cabinOrder.Details.Select(x => x.Goods_no).ToList().Contains(x.MaterielCode));
                #region ç›˜ç›ˆå…¥åº“单
                if (cabinOrder.Order_type == "5")
                {
                    foreach (var detail in request.details)
                    {
                        Dt_CabinOrderDetail? orderDetail = cabinOrder.Details.FirstOrDefault(x => x.Goods_no == detail.productCode && x.Batch_num == detail.batchNo);
                        if (orderDetail == null) throw new Exception($"未找到盘点单【{cabinOrder.Order_no}】物料编号【{detail.productCode}】物料批次【{detail.batchNo}】的明细信息");
                        decimal orderQty = detail.orderDetails?.Sum(x => decimal.TryParse(x.quantity, out var q) ? Math.Abs(q) : 0) ?? 0;
                        Dt_InventoryInfo inventoryInfo = inventoryInfos.Where(x => x.MaterielCode == detail.productCode && x.BatchNo == detail.batchNo).First();
                        var qty = inventoryInfo.SupplyQuantity - inventoryInfo.StockQuantity;
                        if (orderQty != qty)
                            throw new Exception($"盘盈入库数量不一致,上传数量【{orderQty}】,库存盘盈数量【{qty}】");
                        inventoryInfo.StockQuantity = inventoryInfo.SupplyQuantity;
                        inventoryInfo.SupplyQuantity = 0;
                        inventoryInfo.StockStatus = StockStatusEmun.入库完成.ObjToInt();
                        infosUp.Add(inventoryInfo);
                        Dt_Inventory_Batch inventory_Batch = inventory_Batches.First(x => x.MaterielCode == inventoryInfo.MaterielCode && x.BatchNo == inventoryInfo.BatchNo);
                        inventory_Batch.StockQuantity = inventory_Batch.SupplyQuantity;
                        inventory_Batch.SupplyQuantity = 0;
                        batchesUp.Add(inventory_Batch);
                        orderDetail.OrderDetailStatus = "已完成";
                        cabinOrderDetailsUp.Add(orderDetail);
                        #region æ·»åŠ ç›˜ç›ˆå…¥åº“ä»»åŠ¡
                        Dt_SupplyTask_Hty supplyTask_Hty = new Dt_SupplyTask_Hty()
                        {
                            WarehouseCode = inventoryInfo.WarehouseCode,
                            OperateType = OperateTypeEnum.自动完成.ToString(),
                            InsertTime = DateTime.Now,
                            TaskStatus = SupplyStatusEnum.InFinish.ObjToInt(),
                            BatchNo = inventoryInfo.BatchNo,
                            MaterielName = inventoryInfo.MaterielName,
                            MaterielCode = inventoryInfo.MaterielCode,
                            MaterielSpec = inventoryInfo.MaterielSpec,
                            TaskType = TaskTypeEnum.ChenckIn.ObjToInt(),
                            CreateDate = DateTime.Now,
                            Creater = App.User.UserName,
                            LocationCode = inventoryInfo.LocationCode,
                            OrderNo = cabinOrder.Order_no,
                            StockQuantity = orderQty,
                            SupplyQuantity = 0,
                            Remark = "盘盈入库"
                        };
                        supplyTask_Hties.Add(supplyTask_Hty);
                        #endregion
                    }
                    cabinOrder.OdrderStatus = "已完成";
                    if (cabinOrder.Details.Where(x => !cabinOrderDetailsUp.Select(x => x.Id).Contains(x.Id)).Any())
                        cabinOrder.OdrderStatus = "开始";
                    _unitOfWorkManage.BeginTran();
                    _supplyTaskHtyService.AddData(supplyTask_Hties);
                    _inventoryInfoService.UpdateData(infosUp);
                    _inventory_BatchServices.UpdateData(batchesUp);
                    _cabinOrderDetailServices.UpdateData(cabinOrderDetailsUp);
                    BaseDal.UpdateData(cabinOrder);
                    _unitOfWorkManage.CommitTran();
                }
                #endregion
                else
                {
                    foreach (var detail in request.details)
                    {
                        Dt_CabinOrderDetail? orderDetail = cabinOrder.Details.FirstOrDefault(x => x.Goods_no == detail.productCode && x.Batch_num == detail.batchNo);
                        if (orderDetail == null) throw new Exception($"未找到盘点单【{cabinOrder.Order_no}】物料编号【{detail.productCode}】物料名称【{detail.batchNo}】的明细信息");
                        if (orderDetail.OrderDetailStatus == "已完成") continue;
                        decimal orderQty = detail.orderDetails?.Sum(x => decimal.TryParse(x.quantity, out var q) ? Math.Abs(q) : 0) ?? 0;
                        orderDetail.Order_Inqty += orderQty;
                        if (orderDetail.Order_Inqty > orderDetail.Order_qty) throw new Exception($"入库数量不可超出单据数量");
                        orderDetail.OrderDetailStatus = "开始";
                        cabinOrder.OdrderStatus = orderDetail.OrderDetailStatus;
                        if (orderDetail.Order_Inqty == orderDetail.Order_qty)
                        {
                            orderDetail.OrderDetailStatus = "已完成";
                            cabinOrder.Details.Remove(orderDetail);
                        }
                        cabinOrderDetailsUp.Add(orderDetail);
                        Dt_MaterielInfo? materielInfo = materielInfos.FirstOrDefault(x => orderDetail.Goods_no == x.MaterielCode);
                        if (materielInfo == null) throw new Exception($"未找到物料编码【{orderDetail.Goods_no}】的物料信息");
                        #region åº“å­˜
                        Dt_InventoryInfo? dt_InventoryInfo = inventoryInfos.FirstOrDefault(x => x.MaterielCode == orderDetail.Goods_no && x.BatchNo == orderDetail.Batch_num);
                        if (dt_InventoryInfo != null)
                        {
                            dt_InventoryInfo.StockQuantity += orderQty;
                            dt_InventoryInfo.AvailableQuantity += orderQty;
                            dt_InventoryInfo.InDate = DateTime.Now;
                            infosUp.Add(dt_InventoryInfo);
                        }
                        else
                        {
                            dt_InventoryInfo = new Dt_InventoryInfo
                            {
                                PalletCode = detail.orderDetails?.FirstOrDefault()?.palletCode ?? "",
                                WarehouseCode = "001",
                                LocationCode = "立库",
                                StockStatus = StockStatusEmun.入库完成.ObjToInt(),
                                MaterielCode = materielInfo.MaterielCode,
                                MaterielName = materielInfo.MaterielName,
                                MaterielSpec = materielInfo.MaterielSpec,
                                BatchNo = detail.batchNo,
                                StockQuantity = orderQty,
                                OutboundQuantity = 0,
                                SupplyQuantity = 0,
                                AvailableQuantity = orderQty,
                                InDate = DateTime.Now,
                                ProductionDate = detail.finishDate.ToString("yyyy-MM-dd"),
                                ShelfLife = 0,
                                ValidityPeriod = orderDetail.Exp_date,
                                Remark = "智能立库"
                            };
                            infosAdd.Add(dt_InventoryInfo);
                        }
                        #endregion
                        #region åº“存批次
                        if (cabinOrder.Order_type != InOrderTypeEnum.Allocat.ObjToInt().ToString())
                        {
                            Dt_Inventory_Batch? inventory_Batch = inventory_Batches.FirstOrDefault(x => x.MaterielCode == dt_InventoryInfo.MaterielCode && x.BatchNo == dt_InventoryInfo.BatchNo);
                            if (inventory_Batch != null)
                            {
                                inventory_Batch.StockQuantity += orderQty;
                                inventory_Batch.AvailableQuantity += orderQty;
                                batchesUp.Add(inventory_Batch);
                            }
                            else
                            {
                                inventory_Batch = new Dt_Inventory_Batch
                                {
                                    MaterielCode = dt_InventoryInfo.MaterielCode,
                                    MaterielName = dt_InventoryInfo.MaterielName,
                                    MaterielSpec = dt_InventoryInfo.MaterielSpec,
                                    BatchNo = dt_InventoryInfo.BatchNo,
                                    StockQuantity = dt_InventoryInfo.StockQuantity,
                                    OutboundQuantity = dt_InventoryInfo.OutboundQuantity,
                                    AvailableQuantity = dt_InventoryInfo.AvailableQuantity,
                                    SupplyQuantity = dt_InventoryInfo.SupplyQuantity,
                                    ERPStockQuantity = 0,
                                    Status = false,
                                    ProductionDate = detail.finishDate.ToString("yyyy-MM-dd"),
                                    ValidityPeriod = dt_InventoryInfo.ValidityPeriod.ObjToDate(),
                                    Remark = "自动创建"
                                };
                                batchesAdd.Add(inventory_Batch);
                            }
                        }
                        #endregion
                        #region æ·»åŠ å…¥åº“ä»»åŠ¡åŽ†å²
                        Dt_SupplyTask_Hty supplyTask_Hty = new Dt_SupplyTask_Hty()
                        {
                            WarehouseCode = dt_InventoryInfo.WarehouseCode,
                            TaskNum = dt_InventoryInfo.Id,
                            OperateType = OperateTypeEnum.自动完成.ToString(),
                            InsertTime = DateTime.Now,
                            TaskStatus = SupplyStatusEnum.InFinish.ObjToInt(),
                            BatchNo = dt_InventoryInfo.BatchNo,
                            MaterielName = dt_InventoryInfo.MaterielName,
                            MaterielCode = dt_InventoryInfo.MaterielCode,
                            MaterielSpec = dt_InventoryInfo.MaterielSpec,
                            TaskType = cabinOrder.Order_type == "1" ? TaskTypeEnum.In.ObjToInt() : TaskTypeEnum.OutReturn.ObjToInt(),
                            CreateDate = DateTime.Now,
                            Creater = App.User.UserName,
                            LocationCode = dt_InventoryInfo.LocationCode,
                            OrderNo = cabinOrder.Order_no,
                            StockQuantity = orderQty,
                            SupplyQuantity = 0,
                            Remark = "入库"
                        };
                        if (cabinOrder.Order_type == InOrderTypeEnum.Allocat.ObjToInt().ToString()) supplyTask_Hty.TaskType = TaskTypeEnum.AllocatIn.ObjToInt();
                        supplyTask_Hties.Add(supplyTask_Hty);
                        #endregion
                    }
                    if (cabinOrder.Details == null || !cabinOrder.Details.Where(x => x.OrderDetailStatus != "已完成").Any())
                        cabinOrder.OdrderStatus = "已完成";
                    _unitOfWorkManage.BeginTran();
                    _supplyTaskHtyService.AddData(supplyTask_Hties);
                    if (infosUp.Count > 0) _inventoryInfoService.UpdateData(infosUp);
                    if (infosAdd.Count > 0) _inventoryInfoService.AddData(infosAdd);
                    if (batchesUp.Count > 0) _inventory_BatchServices.UpdateData(batchesUp);
                    if (batchesAdd.Count > 0) _inventory_BatchServices.AddData(batchesAdd);
                    _cabinOrderDetailServices.UpdateData(cabinOrderDetailsUp);
                    BaseDal.UpdateData(cabinOrder);
                    _unitOfWorkManage.CommitTran();
                }
                content.OK();
            }
            catch (Exception ex)
            {
                _unitOfWorkManage.RollbackTran();
                content.Error(ex.Message);
            }
            return content;
        }
    }
}
н¨Îļþ¼Ð/WIDESEA_WMSServer/WIDESEA_SquareCabinServices/LKBusiness/DeliveryOrderServicesLK.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,119 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using static WIDESEA_DTO.SquareCabin.TowcsDto;
using WIDESEA_Core;
using WIDESEA_Model.Models;
using WIDESEA_Common.StockEnum;
using WIDESEA_Common.TaskEnum;
using WIDESEA_Core.Enums;
using WIDESEA_ISquareCabinServices;
using WIDESEA_Core.Helper;
namespace WIDESEA_SquareCabinServices
{
    public partial class DeliveryOrderServices
    {
        public WebResponseContent CompleteLKOutOrder(Dt_DeliveryOrder deliveryOrder, EdiOrderCallbackRequest request)
        {
            WebResponseContent content = new WebResponseContent();
            try
            {
                List<Dt_DeliveryOrderDetail> cabinOrderDetailsUp = new List<Dt_DeliveryOrderDetail>();
                List<Dt_SupplyTask_Hty> supplyTask_Hties = new List<Dt_SupplyTask_Hty>();
                List<Dt_InventoryInfo> infosUp = new List<Dt_InventoryInfo>();
                List<Dt_Inventory_Batch> batchesUp = new List<Dt_Inventory_Batch>();
                List<Dt_MaterielInfo> materielInfos = _materielInfoService.Repository.QueryData(x => deliveryOrder.Details.Select(x => x.Goods_no).ToList().Contains(x.MaterielCode));
                List<Dt_InventoryInfo> inventoryInfos = _inventoryInfoService.Repository.QueryData(x => deliveryOrder.Warehouse_no == x.WarehouseCode && deliveryOrder.Details.Select(x => x.Goods_no).ToList().Contains(x.MaterielCode));
                List<Dt_Inventory_Batch> inventory_Batches = _inventory_BatchServices.Repository.QueryData(x => deliveryOrder.Details.Select(x => x.Goods_no).ToList().Contains(x.MaterielCode));
                #region ç›˜äºå‡ºåº“单
                if (deliveryOrder.Out_type == "6")
                {
                    try
                    {
                        foreach (var detail in request.details)
                        {
                            Dt_DeliveryOrderDetail? orderDetail = deliveryOrder.Details.FirstOrDefault(x => x.Goods_no == detail.productCode && x.Batch_num == detail.batchNo);
                            if (orderDetail == null) throw new Exception($"未找到盘点单【{deliveryOrder.Out_no}】物料编号【{detail.productCode}】物料批次【{detail.batchNo}】的明细信息");
                            decimal orderQty = detail.orderDetails?.Sum(x => decimal.TryParse(x.quantity, out var q) ? Math.Abs(q) : 0) ?? 0;
                            Dt_InventoryInfo inventoryInfo = inventoryInfos.Where(x => x.MaterielCode == detail.productCode && x.BatchNo == detail.batchNo).First();
                            var qty = inventoryInfo.SupplyQuantity - inventoryInfo.StockQuantity;
                            if (orderQty != qty)
                                throw new Exception($"盘亏出库数量不一致,上传数量【{orderQty}】,库存盘亏数量【{qty}】");
                            inventoryInfo.StockQuantity = inventoryInfo.SupplyQuantity;
                            inventoryInfo.SupplyQuantity = 0;
                            inventoryInfo.StockStatus = StockStatusEmun.入库完成.ObjToInt();
                            infosUp.Add(inventoryInfo);
                            Dt_Inventory_Batch inventory_Batch = inventory_Batches.First(x => x.MaterielCode == inventoryInfo.MaterielCode && x.BatchNo == inventoryInfo.BatchNo);
                            inventory_Batch.StockQuantity = inventory_Batch.SupplyQuantity;
                            inventory_Batch.SupplyQuantity = 0;
                            batchesUp.Add(inventory_Batch);
                            orderDetail.OotDetailStatus = "已完成";
                            cabinOrderDetailsUp.Add(orderDetail);
                            #region æ·»åŠ ç›˜ç›ˆå…¥åº“ä»»åŠ¡
                            Dt_SupplyTask_Hty supplyTask_Hty = new Dt_SupplyTask_Hty()
                            {
                                WarehouseCode = inventoryInfo.WarehouseCode,
                                OperateType = OperateTypeEnum.自动完成.ToString(),
                                InsertTime = DateTime.Now,
                                TaskStatus = SupplyStatusEnum.OutFinish.ObjToInt(),
                                BatchNo = inventoryInfo.BatchNo,
                                MaterielName = inventoryInfo.MaterielName,
                                MaterielCode = inventoryInfo.MaterielCode,
                                MaterielSpec = inventoryInfo.MaterielSpec,
                                TaskType = TaskTypeEnum.ChenckOut.ObjToInt(),
                                CreateDate = DateTime.Now,
                                Creater = App.User.UserName,
                                LocationCode = inventoryInfo.LocationCode,
                                OrderNo = deliveryOrder.Out_no,
                                StockQuantity = orderQty,
                                SupplyQuantity = 0,
                                Remark = "盘亏出库"
                            };
                            supplyTask_Hties.Add(supplyTask_Hty);
                            #endregion
                        }
                        deliveryOrder.OutStatus = "已完成";
                        if (deliveryOrder.Details.Where(x => !cabinOrderDetailsUp.Select(x => x.Id).Contains(x.Id)).Any())
                            deliveryOrder.OutStatus = "开始";
                        _unitOfWorkManage.BeginTran();
                        _supplyTaskHtyService.AddData(supplyTask_Hties);
                        _inventoryInfoService.UpdateData(infosUp);
                        _inventory_BatchServices.UpdateData(batchesUp);
                        _deliveryOrderDetailServices.UpdateData(cabinOrderDetailsUp);
                        BaseDal.UpdateData(deliveryOrder);
                        _unitOfWorkManage.CommitTran();
                    }
                    catch (Exception ex)
                    {
                        _unitOfWorkManage.RollbackTran();
                        throw new Exception(ex.Message);
                    }
                }
                #endregion
                else
                {
                    List<Dt_SupplyTask> supplyTasks = _supplyTaskService.Repository.QueryData(x => deliveryOrder.Details.Select(x => x.Goods_no).ToList().Contains(x.MaterielCode) && x.OrderNo == request.externalOrderNo && x.WarehouseCode == deliveryOrder.Warehouse_no && x.TaskStatus == SupplyStatusEnum.NewOut.ObjToInt());
                    foreach (var detail in request.details)
                    {
                        decimal orderQty = detail.orderDetails?.Sum(x => decimal.TryParse(x.quantity, out var q) ? Math.Abs(q) : 0) ?? 0;
                        Dt_SupplyTask? supplyTask = supplyTasks.FirstOrDefault(x => x.MaterielCode == detail.productCode && x.BatchNo == detail.batchNo);
                        if (supplyTask == null) throw new Exception($"未找到订单号【{request.externalOrderNo}】物料编号【{detail.productCode}】的出库任务");
                        if (supplyTask.StockQuantity != orderQty)
                            throw new Exception($"订单号【{request.orderNo}】物料编号【{detail.productCode}】的出库数量与出库任务数量不相等");
                        content = OutTaskFinish(supplyTask, deliveryOrder);
                        if (!content.Status) throw new Exception(content.Message);
                    }
                }
                content.OK();
            }
            catch (Exception ex)
            {
                content.Error(ex.Message);
            }
            return content;
        }
    }
}
н¨Îļþ¼Ð/WIDESEA_WMSServer/WIDESEA_SquareCabinServices/MedicineGoodsServices.cs
@@ -27,179 +27,7 @@
        }
        public IRepository<Dt_MedicineGoods> Repository => BaseDal;
        static string SearchDate = "2025-10-30 00:00:00";
        /// <summary>
        /// èŽ·å–è¯å“åŸºç¡€ä¿¡æ¯åŒæ­¥æŽ¥å£
        /// </summary>
        /// <returns></returns>
        public WebResponseContent GetMedicineGoodsInfom()
        {
            var responseContent = new WebResponseContent();
            try
            {
                var url = "http://121.37.118.63:80/GYZ2/95fck/goodsInfo";
                //if (string.IsNullOrEmpty(SearchDate)) SearchDate = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
                //请求参数
                //var requestData = new
                //{
                //    searchDate = "2009-01-10 20:45:16"  // æ­£ç¡®çš„æ ¼å¼
                //};
                if (string.IsNullOrEmpty(SearchDate))
                {
                    // é»˜è®¤æŸ¥è¯¢è¿‡åŽ»24小时的数据
                    SearchDate = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
                }
                // è¯·æ±‚参数
                var requestData = new
                {
                    searchDate = SearchDate
                };
                SearchDate = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
                // å‘起请求
                var result = HttpHelper.Post(url, requestData.ToJsonString());
                // ååºåˆ—化
                var response = JsonConvert.DeserializeObject<UpstreamResponse<MedicationsInfo>>(result);
                if (response == null || response.resultCode != "0")
                {
                    // è°ƒç”¨å¼‚常接口
                    //SendErrorToUpstream(5, "", response.resultMsg ?? "上游接口返回失败", "");
                    return responseContent.Error(response?.resultMsg ?? "上游接口返回失败");
                }
                if (response.data.Count < 1)
                {
                    return responseContent.OK("无新药品数据");
                }
                //获取所有已存在的商品编号
                var existingGoodsNos = BaseDal.Db.Queryable<Dt_MaterielInfo>()
                    .Select(g => g.MaterielCode)
                    .ToList();
                // æ”¶é›†æ‰€æœ‰è¦æ’入的实体
                var entityList = response.data.Where(Medicat => !existingGoodsNos.Contains(Medicat.goods_no)).Select(Medicat => new Dt_MaterielInfo
                {
                    MaterielCode = Medicat.goods_no,
                    MaterielErpType = Medicat.goods_type,
                    item = Medicat.goods_tym, //通用名
                    MaterielName = Medicat.goods_spm,//物料名称
                    Dosage_form = GetDosageForm(Medicat.dosage_form),//药剂
                    Barcode = Medicat.barcode,//条形吗
                    MaterielSpec = Medicat.model,
                    Factory = Medicat.factory,
                    MaterielUnit = Medicat.unit,//单位
                    MaterielSourceType = MaterielSourceTypeEnum.PurchasePart,
                    // ä½¿ç”¨ ?? è¿ç®—符提供默认值
                    MaterielLength = (float?)Medicat.item_length,
                    MaterielWide = (float?)Medicat.item_width,
                    MaterielHeight = (float?)Medicat.item_hight,
                    MaterielVolume = (float?)Medicat.item_volumn,
                    MaterielWeight = (float?)Medicat.item_weight,
                    MaterielStoragecondition = float.TryParse(Medicat.storage_confition, out var val) ? val : null, //储存条件
                    Remark = Medicat.remark,
                    GoodStatusState = "未下发",
                    ModifyDate = Medicat.modify_date
                }).ToList();
                // ä¸€æ¬¡æ€§æ‰¹é‡æ’入数据库
                BaseDal.Db.Insertable(entityList).ExecuteCommand();
                //ProductSynchronous();
                return responseContent.OK("同步成功");
            }
            catch (Exception ex)
            {
                //SendErrorToUpstream(5, "", ex.Message, "");
                return responseContent.Error(ex.Message);
            }
        }
        /// <summary>
        /// å‘给下游wcs同步药品信息
        /// </summary>
        /// <returns></returns>
        public WebResponseContent ProductSynchronous()
        {
            try
            {
                //把小件未下发的的信息和箱规为0,最低库存为0的过滤掉
                //var list = BaseDal.Db.Queryable<Dt_MaterielInfo>().Where(x => x.GoodStatusState == "未下发" && x.MaterielSourceType == MaterielSourceTypeEnum.SelfMadePart).ToList();
                var list = BaseDal.Db.Queryable<Dt_MaterielInfo>().Where(x => x.MaterielSourceType == MaterielSourceTypeEnum.SelfMadePart && x.BoxQty != 0 && x.MinQty != 0 && x.GoodStatusState == "未下发").ToList();
                if (list.Count < 1)
                {
                    return new WebResponseContent().OK("无未下发药品");
                }
                //找到了就将整个list发给下游系统
                foreach (var item in list)
                {
                    var medicineDTO = new ProductInfo
                    {
                        //用户code
                        customerCode = "905",
                        //物料类型
                        materialCode = item.MaterielErpType,
                        //产品编码
                        productCode = item.MaterielCode,
                        //产品名
                        productName = item.MaterielName,
                        //产品条码
                        productBarCode = item.Barcode,
                        //药剂
                        medicine = item.Dosage_form,//这里要调用方法,转化方法
                        //规格
                        productSpecifications = item.MaterielSpec,
                        //单位
                        unit = item.MaterielUnit,
                        //长
                        singleProductLongNum = (item.MaterielLength ?? 0).ToString(),
                        //宽
                        singleProductWideNum = (item.MaterielWide ?? 0).ToString(),
                        //高
                        singleProductHighNum = (item.MaterielHeight ?? 0).ToString(),
                        //重量
                        singleProductWeight = (item.MaterielWeight ?? 0).ToString(),
                        //体积
                        singleProductVolume = (item.MaterielVolume ?? 0).ToString(),
                        //是否取消 0是不删除,1删除
                        isDelete = "0"
                    };
                    var url = "http://172.16.1.2:9357/file-admin/api/product/productSynchronous";
                    var result = HttpHelper.Post(url, medicineDTO.ToJsonString());
                    var resp = JsonConvert.DeserializeObject<TowcsResponse<object>>(result);
                    if (resp != null && resp.code == "0")
                    {
                        //更新药品状态-已完成
                        BaseDal.Db.Updateable<Dt_MaterielInfo>()
                            .SetColumns(x => x.GoodStatusState == "下发完成")
                            .Where(x => x.MaterielCode == item.MaterielCode)
                            .ExecuteCommand();
                    }
                    else
                    {
                        //SendErrorToUpstream(5, medicineDTO.materialCode, resp?.msg ?? "WCS药品信息同步失败", "");
                        //return new WebResponseContent { Status = false, Message = "订单推送失败" };
                        continue;
                    }
                }
                return new WebResponseContent { Status = true, Message = "成功" };
            }
            catch (Exception ex)
            {
                Console.WriteLine("ProductSynchronous å¼‚常:" + ex.Message);
                return new WebResponseContent { Status = false, Message = ex.Message };
            }
        }
        /// <summary>
        /// åŒæ­¥åˆ é™¤åˆ é™¤å•†å“ä¿¡æ¯ 
@@ -295,60 +123,7 @@
                Console.WriteLine("异常接口推送失败:" + e.Message);
            }
        }
        /// <summary>
        /// åˆ›å»ºè¯å‰‚å­—å…¸
        /// </summary>
        private static readonly Dictionary<string, string> _dosageFormMap = new Dictionary<string, string>
        {
            {"001", "片剂"}, {"002", "片剂"}, {"003", "片剂"}, {"004", "片剂"}, {"005", "片剂"},
            {"006", "片剂"}, {"007", "片剂"}, {"008", "片剂"}, {"009", "片剂"}, {"010", "片剂"},
            {"011", "其它"}, {"012", "片剂"}, {"013", "其它"}, {"014", "片剂"}, {"015", "片剂"},
            {"016", "片剂"}, {"017", "片剂"}, {"018", "其它"}, {"019", "其它"}, {"020", "其它"},
            {"021", "针剂"}, {"022", "针剂"}, {"023", "针剂"}, {"024", "针剂"}, {"025", "中成药"},
            {"026", "中成药"}, {"027", "其它"}, {"028", "其它"}, {"029", "其它"}, {"030", "其它"},
            {"031", "其它"}, {"032", "其它"}, {"033", "其它"}, {"034", "中成药"}, {"035", "中成药"},
            {"036", "中成药"}, {"037", "中成药"}, {"038", "其它"}, {"039", "其它"}, {"040", "其它"},
            {"041", "中成药"}, {"042", "中成药"}, {"043", "中成药"}, {"044", "其它"}, {"045", "中成药"},
            {"046", "中成药"}, {"047", "中成药"}, {"048", "中成药"}, {"049", "中成药"}, {"050", "中成药"},
            {"051", "中成药"}, {"052", "中成药"}, {"053", "中成药"}, {"054", "中成药"}, {"055", "中成药"},
            {"056", "其它"}, {"057", "其它"}, {"058", "其它"}, {"059", "其它"}, {"060", "其它"},
            {"061", "其它"}, {"062", "其它"}, {"063", "其它"}, {"064", "其它"}, {"065", "其它"},
            {"066", "其它"}, {"067", "中成药"}, {"068", "中成药"}, {"069", "中成药"}, {"070", "其它"},
            {"071", "其它"}, {"072", "其它"}, {"073", "中成药"}, {"074", "其它"}, {"075", "其它"},
            {"076", "中成药"}, {"077", "其它"}, {"078", "其它"}, {"079", "中成药"}, {"080", "中成药"},
            {"081", "中成药"}, {"082", "中成药"}, {"083", "其它"}, {"084", "中成药"}, {"085", "其它"},
            {"086", "中成药"}, {"087", "其它"}, {"088", "其它"}, {"089", "中成药"}, {"090", "中成药"},
            {"091", "其它"}, {"092", "其它"}, {"093", "其它"}, {"094", "中成药"}, {"095", "其它"},
            {"096", "其它"}, {"097", "其它"}, {"098", "其它"}, {"099", "其它"}, {"100", "其它"},
            {"101", "其它"}, {"102", "其它"}, {"103", "其它"}, {"104", "其它"}, {"105", "其它"},
            {"106", "其它"}, {"107", "其它"}, {"108", "其它"}, {"109", "其它"}, {"110", "其它"},
            {"111", "其它"}, {"112", "其它"}, {"113", "其它"}, {"114", "其它"}, {"115", "其它"},
            {"116", "其它"}, {"117", "其他"}
        };
        /// <summary>
        /// æ ¹æ®å‰‚型编号获取剂型分类
        /// </summary>
        /// <param name="dosageCode">剂型编号(001-117)</param>
        /// <returns>剂型分类(片剂/针剂/中成药/其它/其他)</returns>
        public static string GetDosageForm(string dosageCode)
        {
            if (string.IsNullOrEmpty(dosageCode))
                return "未知";
            // å¤„理编号格式,确保是3位数字
            if (dosageCode.Length == 1)
                dosageCode = "00" + dosageCode;
            else if (dosageCode.Length == 2)
                dosageCode = "0" + dosageCode;
            if (_dosageFormMap.TryGetValue(dosageCode, out string form))
            {
                return form;
            }
            return "未知";
        }
    }
н¨Îļþ¼Ð/WIDESEA_WMSServer/WIDESEA_SquareCabinServices/NewBusiness.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,154 @@
using HslCommunication;
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using WIDESEA_Core;
using WIDESEA_Core.Helper;
using WIDESEA_ISquareCabinServices;
using WIDESEA_Model.Models;
using static WIDESEA_DTO.SquareCabin.OrderDto;
namespace WIDESEA_SquareCabinServices
{
    public partial class Business
    {
        #region èŽ·å–ERP入库单
        static string SearchInOrderDate = "2025-10-30 00:00:00";
        public WebResponseContent GetInOrder()
        {
            WebResponseContent content = new WebResponseContent();
            try
            {
                var url = "http://121.37.118.63:80/GYZ2/95fck/inOrder";
                if (string.IsNullOrEmpty(SearchInOrderDate)) SearchInOrderDate = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
                var requestData = new { searchDate = SearchInOrderDate };
                SearchInOrderDate = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
                var result = HttpHelper.Post(url, requestData.ToJsonString());
                var response = JsonConvert.DeserializeObject<UpstreamResponse<UpstreamOrderInfo>>(result);
                if (response == null || response.resultCode != "0") return content;
                if (response.data.Count < 1) return content;
                var ordernos = response.data.Select(x => x.order_no).ToList();
                var existingOrderNos = _cabinOrderServices.Repository.QueryData(x => ordernos.Contains(x.Order_no)).Select(x => x.Order_no).Distinct().ToList();
                var newOrders = response.data.Where(order => !existingOrderNos.Contains(order.order_no)).ToList();
                if (newOrders.Count < 1) return content;
                foreach (var order in newOrders)
                {
                    try
                    {
                        if (order.order_type == "1")
                        {
                            _cabinOrderServices.CreateInboundOrder(order);
                        }
                        else if (order.order_type == "3")//入库退料
                        {
                            #region è½¬æ¢ä¸ºå‡ºåº“单
                            UpstramOutOrderInfo upstramOutOrderInfo = new UpstramOutOrderInfo()
                            {
                                order_no = order.order_no,
                                order_type = order.order_type,
                                warehouse_no = order.warehouse_no,
                                details = new List<UpstreamOutOrderDetail>()
                            };
                            foreach (var item in order.details)
                            {
                                UpstreamOutOrderDetail detail = new UpstreamOutOrderDetail()
                                {
                                    batch_num = item.batch_num,
                                    goods_no = item.goods_no,
                                    order_qty = item.order_qty,
                                    exp_date = item.exp_date,
                                };
                                upstramOutOrderInfo.details.Add(detail);
                            }
                            _deliveryOrderServices.CreateOutboundOrder(upstramOutOrderInfo);
                            #endregion
                        }
                        else if (order.order_type == "5")//报溢入库
                        {
                            _cabinOrderServices.CreateCheckInOrder(order);
                        }
                    }
                    catch (Exception ex)
                    {
                        continue;
                    }
                }
                return content.OK();
            }
            catch (Exception ex)
            {
                Console.WriteLine("获取ERP入库单信息异常:" + ex.Message);
                return content.Error(ex.Message);
            }
        }
        #endregion
        #region èŽ·å–ERP出库单
        static string SearchOutOrderDate = "2025-10-30 00:00:00";
        public WebResponseContent GetOutOrder()
        {
            WebResponseContent content = new WebResponseContent();
            try
            {
                var url = "http://121.37.118.63:80/GYZ2/95fck/outOrder";
                if (string.IsNullOrEmpty(SearchOutOrderDate)) SearchOutOrderDate = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
                var requestData = new { searchDate = SearchOutOrderDate };
                SearchOutOrderDate = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
                var result = HttpHelper.Post(url, requestData.ToJsonString());
                var response = JsonConvert.DeserializeObject<UpstreamResponse<UpstramOutOrderInfo>>(result);
                if (response == null || response.resultCode != "0") return content;
                if (response.data.Count < 1) return content;
                var ordernos = response.data.Select(x => x.order_no).ToList();
                var existingOutOrderNos = _deliveryOrderServices.Repository.QueryData(x => ordernos.Contains(x.Out_no)).Select(x => x.Out_no).Distinct().ToList();
                var newOutOrders = response.data.Where(outorder => !existingOutOrderNos.Contains(outorder.order_no)).ToList();
                if (newOutOrders.Count < 1) return content;
                foreach (var outorder in newOutOrders)
                {
                    if (outorder.order_type == "1")// æ­£å¸¸å‡ºåº“单
                    {
                        _deliveryOrderServices.CreateOutboundOrder(outorder);
                    }
                    else if (outorder.order_type == "2")//出库退货
                    {
                        #region è½¬æ¢æˆå…¥åº“单
                        UpstreamOrderInfo order = new UpstreamOrderInfo()
                        {
                            order_no = outorder.order_no,
                            order_type = outorder.order_type,
                            warehouse_no = outorder.warehouse_no,
                            details = new List<UpstreamOrderDetail>()
                        };
                        foreach (var item in outorder.details)
                        {
                            UpstreamOrderDetail detail = new UpstreamOrderDetail()
                            {
                                batch_num = item.batch_num,
                                goods_no = item.goods_no,
                                order_qty = item.order_qty,
                                exp_date = item.exp_date,
                            };
                            order.details.Add(detail);
                        }
                        #endregion
                        _cabinOrderServices.CreateInboundOrder(order);
                    }
                    else if (outorder.order_type == "6")//报损出库
                    {
                        _deliveryOrderServices.CreateCheckOutOrder(outorder);
                    }
                }
            }
            catch (Exception ex)
            {
                content.Error(ex.Message);
            }
            return content;
        }
        #endregion
    }
}
н¨Îļþ¼Ð/WIDESEA_WMSServer/WIDESEA_WMSServer/AlarmJob.cs
@@ -19,7 +19,7 @@
            _inventoryInfoService = inventoryInfoService;
        }
        //每隔1秒执行一次
        [Invoke(Begin = "2025-09-01", Interval = 1000 * 10, IsEnabled = true, SkipWhileExecuting = true)]
        [Invoke(Begin = "2025-09-01", Interval = 1000 * 5, IsEnabled = true, SkipWhileExecuting = true)]
        public void Run()
        {
            //冷库
н¨Îļþ¼Ð/WIDESEA_WMSServer/WIDESEA_WMSServer/Controllers/SquareCabin/CabinOrderController.cs
@@ -12,9 +12,17 @@
    [ApiController]
    public class CabinOrderController : ApiBaseController<ICabinOrderServices, Dt_CabinOrder>
    {
        public CabinOrderController(ICabinOrderServices service) : base(service)
        private readonly IBusiness _business;
        public CabinOrderController(ICabinOrderServices service, IBusiness business) : base(service)
        {
            _business = business;
        }
        [HttpPost, HttpGet, Route("GetUpstreamOrder"), AllowAnonymous]
        public WebResponseContent GetUpstreamOrder()
        {
            return _business.GetUpstreamOrder();
        }
        /// <summary>
        /// å®Œæˆå…¥åº“单
        /// </summary>
н¨Îļþ¼Ð/WIDESEA_WMSServer/WIDESEA_WMSServer/Controllers/SquareCabin/MedicineGoodsController.cs
@@ -16,11 +16,6 @@
        {
        }
        [HttpPost,Route("GetMedicineGoodsInfom"),AllowAnonymous]
        public WebResponseContent GetMedicineGoodsInfom()
        {
            return Service.GetMedicineGoodsInfom();
        }
        [HttpPost, Route("DeleteProduct"), AllowAnonymous]
        public WebResponseContent DeleteProduct(string goodsno)
н¨Îļþ¼Ð/WIDESEA_WMSServer/WIDESEA_WMSServer/Controllers/WMSInfo/MaterielInfoController.cs
@@ -1,5 +1,7 @@
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using WIDESEA_Core;
using WIDESEA_Core.BaseController;
using WIDESEA_IWMsInfoServices;
using WIDESEA_Model.Models;
@@ -13,5 +15,11 @@
        public MaterielInfoController(IMaterielInfoService service) : base(service)
        {
        }
        [HttpPost, Route("GetMedicineGoodsInfom"), AllowAnonymous]
        public WebResponseContent GetMedicineGoodsInfom()
        {
            return Service.GetMedicineGoodsInfom();
        }
    }
}
н¨Îļþ¼Ð/WIDESEA_WMSServer/WIDESEA_WMSServer/GoodsJob.cs
@@ -1,22 +1,23 @@
using Pomelo.AspNetCore.TimedJob;
using WIDESEA_ISquareCabinServices;
using WIDESEA_IWMsInfoServices;
using static WIDESEA_DTO.SquareCabin.TowcsDto;
namespace WIDESEA_WMSServer
{
    public class GoodsJob : Job
    {
        private readonly IMedicineGoodsServices _medicineGoodsServices;
        public GoodsJob(IMedicineGoodsServices medicineGoodsServices)
        private readonly IMaterielInfoService _materielInfoService;
        public GoodsJob(IMaterielInfoService materielInfoService)
        {
            _medicineGoodsServices = medicineGoodsServices;
            _materielInfoService = materielInfoService;
        }
        //每隔1秒执行一次
        [Invoke(Begin = "2025-09-01", Interval = 1000 * 60, IsEnabled = true, SkipWhileExecuting = true)]
        [Invoke(Begin = "2025-09-01", Interval = 1000 * 5, IsEnabled = true, SkipWhileExecuting = true)]
        public void Run()
        {
            _medicineGoodsServices.GetMedicineGoodsInfom();
            _medicineGoodsServices.ProductSynchronous();
            _materielInfoService.GetMedicineGoodsInfom();
            _materielInfoService.ProductSynchronous();
            Console.WriteLine($"物料信息任务执行结束:{DateTime.Now}");
        }
    }
н¨Îļþ¼Ð/WIDESEA_WMSServer/WIDESEA_WMSServer/InOrderJob.cs
@@ -11,11 +11,11 @@
            _business = business;
        }
        //每隔1秒执行一次
        [Invoke(Begin = "2025-09-01", Interval = 1000 * 60 * 10, IsEnabled = true, SkipWhileExecuting = true)]
        [Invoke(Begin = "2025-09-01", Interval = 1000 * 5, IsEnabled = true, SkipWhileExecuting = true)]
        public void Run()
        {
            _business.GetUpstreamOrder();
            _business.GetUpstreamOutOrder();
            _business.GetInOrder();
            _business.GetOutOrder();
            //_business.EdiIn();
            //_business.CompleteAllOrders();
            _business.CompleteAllOrders();
н¨Îļþ¼Ð/WIDESEA_WMSServer/WIDESEA_WMSServer/OutOrderJob.cs
@@ -11,7 +11,7 @@
            _business = business;
        }
        //每隔1秒执行一次
        [Invoke(Begin = "2025-09-01", Interval = 1000 * 60, IsEnabled = true, SkipWhileExecuting = true)]
        [Invoke(Begin = "2025-09-01", Interval = 1000 * 5, IsEnabled = true, SkipWhileExecuting = true)]
        public void Run()
        {
            //获取上游出库单数据
@@ -20,7 +20,7 @@
            _business.EdiIn();
            _business.EdiOut();
            Console.WriteLine($"WCS任务执行结束:{DateTime.Now}");
        }
н¨Îļþ¼Ð/WIDESEA_WMSServer/WIDESEA_WMSServer/appsettings.json
@@ -16,7 +16,7 @@
  //"ConnectionString": "Data Source=.;Initial Catalog=WIDESEAWMS_HUAIAN;User ID=sa;Password=P@ssw0rd;Integrated Security=False;Connect Timeout=30;Encrypt=False;TrustServerCertificate=False;ApplicationIntent=ReadWrite;MultiSubnetFailover=False",
  //"ConnectionString": "Data Source=10.30.4.92;Initial Catalog=WMS_TC;User ID=sa;Password=duo123456;Integrated Security=False;Connect Timeout=30;Encrypt=False;TrustServerCertificate=False;ApplicationIntent=ReadWrite;MultiSubnetFailover=False",
  //旧WMS数据库连接
  "ConnectionString": "Data Source=.;Initial Catalog=WIDESEA_WMSDBF_Z22;User ID=sa;Password=123456;Integrated Security=False;Connect Timeout=30;Encrypt=False;TrustServerCertificate=False;ApplicationIntent=ReadWrite;MultiSubnetFailover=False",
  "ConnectionString": "Data Source=.;Initial Catalog=WIDESEA_WMSDBF_Z22;User ID=sa;Password=P@ssw0rd;Integrated Security=False;Connect Timeout=30;Encrypt=False;TrustServerCertificate=False;ApplicationIntent=ReadWrite;MultiSubnetFailover=False",
  //"ConnectionString": "Data Source=.;Initial Catalog=WIDESEA_WMSDBF_Z22;User ID=sa;Password=48PYX_h7KS@f;Integrated Security=False;Connect Timeout=30;Encrypt=False;TrustServerCertificate=False;ApplicationIntent=ReadWrite;MultiSubnetFailover=False",
  //跨域
  "Cors": {
н¨Îļþ¼Ð/WMS/src/extension/inbound/inboundOrder.js
@@ -27,7 +27,7 @@
      const id=rows[0].id
      // è¿™é‡Œæ·»åŠ ä½ çš„ä¸šåŠ¡é€»è¾‘
      this.http.post(`/api/CabinOrder/FinishInOrder?key${id}`).then((x) => {
      this.http.post(`/api/CabinOrder/FinishInOrder?key=${id}`).then((x) => {
        if (x.status) {
          this.$Message.success('操作成功');
          this.refresh();