5b8bf171b9afda52fa366a72e54eedbd9e6d4d17..208ba32323f73ade277e230b78fde2db04f860ac
4 天以前 dengjunjie
优化处理出库单逻辑
208ba3 对比 | 目录
4 天以前 dengjunjie
优化出库单前端显示
5a23c3 对比 | 目录
4 天以前 dengjunjie
优化抓取ERP数据
26699e 对比 | 目录
4 天以前 yanjinhui
优化
3d3598 对比 | 目录
已修改10个文件
471 ■■■■■ 文件已修改
新建文件夹/WIDESEA_WMSServer/ClassLibrary2/ContainerService.cs 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
新建文件夹/WIDESEA_WMSServer/ClassLibrary2/EquipmentAlarmInforService.cs 182 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
新建文件夹/WIDESEA_WMSServer/ClassLibrary2/MaterielInfoService.cs 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
新建文件夹/WIDESEA_WMSServer/ClassLibrary2/MessageInfoService.cs 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
新建文件夹/WIDESEA_WMSServer/WIDESEA_SquareCabinServices/DeliveryOrderServices.cs 11 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
新建文件夹/WIDESEA_WMSServer/WIDESEA_SquareCabinServices/NewBusiness.cs 52 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
新建文件夹/WIDESEA_WMSServer/WIDESEA_SquareCabinServices/extend/Check.cs 40 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
新建文件夹/WMS/src/extension/outbound/outboundOrder.js 167 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
新建文件夹/WMS/src/extension/stock/Dt_Inventory_Batch.js 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
新建文件夹/WMS/src/views/outbound/outboundOrder.vue 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
н¨Îļþ¼Ð/WIDESEA_WMSServer/ClassLibrary2/ContainerService.cs
@@ -71,7 +71,7 @@
                    if (item.alarm != "正常")
                    {
                        _messageInfoService.AddMessageInfo(MessageGroupByEnum.EquipmentAlarm,
                            $"冷柜{item.alarm}", item.message, MessageStatusEnum.Undisposed);
                            $"冷柜{item.name}{item.alarm}", item.message, MessageStatusEnum.Undisposed);
                    }
                }
                if (containersAdd.Count > 0) BaseDal.AddData(containersAdd);
н¨Îļþ¼Ð/WIDESEA_WMSServer/ClassLibrary2/EquipmentAlarmInforService.cs
@@ -76,7 +76,7 @@
                    }
                    if (string.Equals(item.status, nameof(DeviceStatus.Error), StringComparison.OrdinalIgnoreCase))
                    {
                        _messageInfoService.AddMessageInfo(MessageGroupByEnum.EquipmentAlarm, item.robotName, item.status);
                        _messageInfoService.AddMessageInfo(MessageGroupByEnum.EquipmentAlarm,"小车编号"+ item.robotCode, item.status);
                    }
                }
                foreach (var item in response.data.sorters)
@@ -103,7 +103,7 @@
                    }
                    if (string.Equals(item.status, nameof(DeviceStatus.Error), StringComparison.OrdinalIgnoreCase))
                    {
                        _messageInfoService.AddMessageInfo(MessageGroupByEnum.EquipmentAlarm, item.sorterCode, item.status);
                        _messageInfoService.AddMessageInfo(MessageGroupByEnum.EquipmentAlarm, "分拣台名字"+ item.sorterCode, item.status);
                    }
                }
                if (equipmentAlarmInforsAdd.Count > 0) BaseDal.AddData(equipmentAlarmInforsAdd);
@@ -116,182 +116,6 @@
            return content;
        }
        /// <summary>
        /// æŸ¥çœ‹ç«‹åº“小车报警信息
        /// </summary>
        /// <returns></returns>
        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")
                {
                    return new WebResponseContent { Status = false, Message = $"WCS接口调用失败: {response?.msg}" };
                }
                var syncTime = DateTime.Now;
                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.Count > 0)
                {
                    foreach (var robot in response.data.robot)
                    {
                        ProcessDevice(robot.robotCode, robot.robotName, robot.status, "机器人",
                            existingRecords, AddEquipList, UpdateEquipList, alarmList, syncTime);
                    }
                }
                // å¤„理分拣台设备数据
                if (response.data?.sorters != null && response.data.sorters.Count > 0)
                {
                    foreach (var sorter in response.data.sorters)
                    {
                        ProcessDevice(sorter.sorterCode, sorter.sorterName, sorter.status, "分拣台",
                            existingRecords, AddEquipList, UpdateEquipList, alarmList, syncTime);
                    }
                }
                // å¼€å¯äº‹åŠ¡
                //_unitOfWorkManage.BeginTran();
                try
                {
                    // æ‰¹é‡æ“ä½œ
                    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)
            {
                return new WebResponseContent
                {
                    Status = false,
                    Message = $"获取设备状态失败: {ex.Message}"
                };
            }
        }
        /// <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
@@ -44,12 +44,13 @@
                    // é»˜è®¤æŸ¥è¯¢è¿‡åŽ»24小时的数据
                    SearchDate = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
                }
                string getDate = 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());
@@ -64,6 +65,7 @@
                }
                if (response.data.Count < 1)
                {
                    SearchDate = getDate;
                    return responseContent.OK("无新药品数据");
                }
@@ -98,7 +100,7 @@
                }).ToList();
                // ä¸€æ¬¡æ€§æ‰¹é‡æ’入数据库
                BaseDal.AddData(entityList);
                SearchDate = getDate;
                //ProductSynchronous();
                return responseContent.OK("同步成功");
            }
н¨Îļþ¼Ð/WIDESEA_WMSServer/ClassLibrary2/MessageInfoService.cs
@@ -135,6 +135,7 @@
                    }
                }
                var messinfo = BaseDal.QueryData(x => x.MessageStatus < MessageStatusEnum.Wait.ObjToInt());
                messagesinfo = messagesinfo.Where(x => !messinfo.Select(x => x.Id).Contains(x.Id)).ToList();
                foreach (var item in messinfo)
                {
                    Message message = new Message()
н¨Îļþ¼Ð/WIDESEA_WMSServer/WIDESEA_SquareCabinServices/DeliveryOrderServices.cs
@@ -60,6 +60,11 @@
            _materielInfoService = materielInfoService;
            _locationInfoService = locationInfoService;
        }
        public override WebResponseContent UpdateData(SaveModel saveModel)
        {
            return base.UpdateData(saveModel);
        }
        #region åˆ›å»ºå‡ºåº“单
        /// <summary>
        /// åˆ›å»ºå‡ºåº“单
@@ -350,7 +355,7 @@
                            #region æ•´ä»¶ä¼˜å…ˆåˆ†é…å¤§ä»¶åº“,计划库存,添加出库任务
                            foreach (var item in dt_InventoryInfos.Where(x => x.WarehouseCode == WareCodeDJ))
                            {
                                if (xs <= 0) break;
                                if (xs <= 0 || item.AvailableQuantity <= 0) break;
                                decimal outqty = 0;
                                while (item.AvailableQuantity > 0 && xs > 0)
                                {
@@ -431,7 +436,9 @@
                            if (orderDetailLK != null)
                            {
                                #region æ·»åŠ å‡ºåº“ä»»åŠ¡ã€ä¿®æ”¹åº“å­˜ä¿¡æ¯
                                Dt_InventoryInfo inventoryInfo = dt_InventoryInfos.Where(x => x.WarehouseCode == WareCodeLK).First();
                                Dt_InventoryInfo? inventoryInfo = dt_InventoryInfos.FirstOrDefault(x => x.WarehouseCode == WareCodeLK);
                                if (inventoryInfo == null)
                                    throw new Exception($"未找到物料编号【{detail.goods_no}】物料批次【{detail.batch_num}】在立库中的库存信息;所需数量【{orderDetailLK.Order_qty}】请补货");
                                inventoryInfo.AvailableQuantity -= orderDetailLK.Order_qty;
                                inventoryInfo.OutboundQuantity += orderDetailLK.Order_qty;
                                Dt_SupplyTask supplyTask = new Dt_SupplyTask()
н¨Îļþ¼Ð/WIDESEA_WMSServer/WIDESEA_SquareCabinServices/NewBusiness.cs
@@ -23,24 +23,35 @@
            try
            {
                var url = "http://121.37.118.63:80/GYZ2/95fck/inOrder";
                string GetOutOrderDate = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
                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");
                //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;
                if (response.data.Count < 1)
                {
                    SearchInOrderDate = GetOutOrderDate;
                    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;
                if (newOrders.Count < 1)
                {
                    SearchInOrderDate = GetOutOrderDate;
                    return content;
                }
                int messQty = 0;
                foreach (var order in newOrders)
                {
                    try
                    {
                        if (order.order_type == "1")
                        {
                            _cabinOrderServices.CreateInboundOrder(order);
                            content = _cabinOrderServices.CreateInboundOrder(order);
                            if (!content.Status) messQty++;
                        }
                        else if (order.order_type == "3")//入库退料
                        {
@@ -63,12 +74,14 @@
                                };
                                upstramOutOrderInfo.details.Add(detail);
                            }
                            _deliveryOrderServices.CreateOutboundOrder(upstramOutOrderInfo);
                            #endregion
                            content = _deliveryOrderServices.CreateOutboundOrder(upstramOutOrderInfo);
                            if (!content.Status) messQty++;
                        }
                        else if (order.order_type == "5")//报溢入库
                        {
                            _cabinOrderServices.CreateCheckInOrder(order);
                            content = _cabinOrderServices.CreateCheckInOrder(order);
                            if (!content.Status) messQty++;
                        }
                    }
                    catch (Exception ex)
@@ -76,6 +89,7 @@
                        continue;
                    }
                }
                if (messQty == 0) SearchInOrderDate = GetOutOrderDate;
                return content.OK();
            }
            catch (Exception ex)
@@ -94,24 +108,33 @@
            try
            {
                var url = "http://121.37.118.63:80/GYZ2/95fck/outOrder";
                string GetOutOrderDate = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
                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;
                if (response.data.Count < 1)
                {
                    SearchOutOrderDate = GetOutOrderDate;
                    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;
                if (newOutOrders.Count < 1)
                {
                    SearchOutOrderDate = GetOutOrderDate;
                    return content;
                }
                int messQty = 0;
                foreach (var outorder in newOutOrders)
                {
                    if (outorder.order_type == "1")// æ­£å¸¸å‡ºåº“单
                    {
                        _deliveryOrderServices.CreateOutboundOrder(outorder);
                        content = _deliveryOrderServices.CreateOutboundOrder(outorder);
                        if (!content.Status) messQty++;
                    }
                    else if (outorder.order_type == "2")//出库退货
                    {
@@ -135,13 +158,16 @@
                            order.details.Add(detail);
                        }
                        #endregion
                        _cabinOrderServices.CreateInboundOrder(order);
                        content = _cabinOrderServices.CreateInboundOrder(order);
                        if (!content.Status) messQty++;
                    }
                    else if (outorder.order_type == "6")//报损出库
                    {
                        _deliveryOrderServices.CreateCheckOutOrder(outorder);
                        content = _deliveryOrderServices.CreateCheckOutOrder(outorder);
                        if (!content.Status) messQty++;
                    }
                }
                if (messQty == 0) SearchOutOrderDate = GetOutOrderDate;
            }
            catch (Exception ex)
            {
н¨Îļþ¼Ð/WIDESEA_WMSServer/WIDESEA_SquareCabinServices/extend/Check.cs
@@ -44,14 +44,21 @@
                    {
                        foreach (var items in inventoryInfos.GroupBy(x => x.WarehouseCode))
                        {
                            Dt_DeliveryOrder deliveryOrder = new Dt_DeliveryOrder()
                            Dt_DeliveryOrder? deliveryOrder = deliveryOrders.Where(x => x.Warehouse_no == items.Key).FirstOrDefault();
                            bool isNull = false;
                            if (deliveryOrder == null)
                            {
                                Out_no = item.MaterielCode + "_" + item.BatchNo,
                                Out_type = "20",
                                OutStatus = "新建",
                                Warehouse_no = items.Key,
                                Details = new List<Dt_DeliveryOrderDetail>()
                            };
                                isNull = true;
                                deliveryOrder = new Dt_DeliveryOrder()
                                {
                                    //Out_no = item.MaterielCode + "_" + item.BatchNo,
                                    Out_no = $"PD{items.Key}{DateTime.Now.ToString("yyMMddHHmmss")}",
                                    Out_type = "20",
                                    OutStatus = "新建",
                                    Warehouse_no = items.Key,
                                    Details = new List<Dt_DeliveryOrderDetail>()
                                };
                            }
                            var Status = items.Key == "001" ? 0 : 2;//判断是否为立库区域
                            Dt_DeliveryOrderDetail deliveryOrderDetail = new Dt_DeliveryOrderDetail()
                            {
@@ -66,7 +73,7 @@
                                Reservoirarea = items.Key
                            };
                            deliveryOrder.Details.Add(deliveryOrderDetail);
                            deliveryOrders.Add(deliveryOrder);
                            if (isNull) deliveryOrders.Add(deliveryOrder);
                            #region åˆ›å»ºç›˜ç‚¹ä»»åŠ¡
                            foreach (var inventory in items)
                            {
@@ -254,15 +261,15 @@
                #endregion
                #region åˆ¤æ–­å½“前物料批次的盘点任务是否全部完成
                List<Dt_SupplyTask> supplyTasks = _supplyTaskService.Repository.QueryData(x => x.MaterielCode == supplyTask.MaterielCode && x.BatchNo == supplyTask.BatchNo && x.TaskStatus == SupplyStatusEnum.NewCheck.ObjToInt() && x.WarehouseCode == supplyTask.WarehouseCode).ToList();
                List<Dt_SupplyTask> supplyTasks1 = _supplyTaskService.Repository.QueryData(x => x.MaterielCode == supplyTask.MaterielCode && x.BatchNo == supplyTask.BatchNo && x.TaskStatus == SupplyStatusEnum.NewCheck.ObjToInt()).ToList();
                List<Dt_SupplyTask> supplyTasks = _supplyTaskService.Repository.QueryData(x => x.MaterielCode == supplyTask.MaterielCode && x.BatchNo == supplyTask.BatchNo && x.TaskStatus == SupplyStatusEnum.NewCheck.ObjToInt() && x.WarehouseCode == supplyTask.WarehouseCode && x.TaskId != supplyTask.TaskId).ToList();
                List<Dt_SupplyTask> supplyTasks1 = _supplyTaskService.Repository.QueryData(x => x.MaterielCode == supplyTask.MaterielCode && x.BatchNo == supplyTask.BatchNo && x.TaskStatus == SupplyStatusEnum.NewCheck.ObjToInt() && x.TaskId != supplyTask.TaskId).ToList();
                Dt_Inventory_Batch inventory_Batch = new Dt_Inventory_Batch();
                List<Dt_InventoryInfo> inventoryInfos = new List<Dt_InventoryInfo>();
                if (supplyTasks1.Count < 1)
                {
                    #region æŸ¥æ‰¾åº“å­˜
                    inventoryInfos = _inventoryInfoService.Repository.QueryData(x => x.BatchNo == cabinOrderDetail.Batch_num && x.MaterielCode == cabinOrderDetail.Goods_no);
                    var SupplyQuantitys = inventoryInfos.Sum(x => x.SupplyQuantity);
                    inventoryInfos = _inventoryInfoService.Repository.QueryData(x => x.BatchNo == cabinOrderDetail.Batch_num && x.MaterielCode == cabinOrderDetail.Goods_no && x.Id != inventoryInfo.Id);
                    var SupplyQuantitys = inventoryInfos.Sum(x => x.SupplyQuantity) + supplyTask.SupplyQuantity;
                    #endregion
                    #region åº“存批次
@@ -276,6 +283,9 @@
                            item.SupplyQuantity = 0;
                            item.StockStatus = StockStatusEmun.入库完成.ObjToInt();
                        }
                        inventoryInfo.StockQuantity = supplyTask.SupplyQuantity;
                        inventoryInfo.SupplyQuantity = 0;
                        inventoryInfo.StockStatus = StockStatusEmun.入库完成.ObjToInt();
                    }
                    else
                    {
@@ -295,19 +305,19 @@
                    });
                    _deliveryOrderDetailServices.Repository.DeleteAndMoveIntoHty(cabinOrder.Details, OperateTypeEnum.自动完成);
                    cabinOrder.Details = null;
                    Repository.DeleteAndMoveIntoHty(cabinOrder, OperateTypeEnum.自动完成);
                    BaseDal.DeleteAndMoveIntoHty(cabinOrder, OperateTypeEnum.自动完成);
                    #endregion
                }
                else
                {
                    Repository.UpdateData(cabinOrder);
                    BaseDal.UpdateData(cabinOrder);
                    _deliveryOrderDetailServices.Repository.UpdateData(cabinOrderDetail);
                }
                #endregion
                _inventoryInfoService.UpdateData(inventoryInfo);
                _supplyTaskService.Repository.DeleteAndMoveIntoHty(supplyTask, OperateTypeEnum.自动完成);
                if (inventoryInfos.Count > 1)
                if (inventoryInfos.Count >= 1)
                {
                    _inventoryInfoService.UpdateData(inventoryInfos);
                    _inventory_BatchServices.UpdateData(inventory_Batch);
н¨Îļþ¼Ð/WMS/src/extension/outbound/outboundOrder.js
@@ -2,79 +2,106 @@
//此js文件是用来自定义扩展业务代码,可以扩展一些自定义页面或者重新配置生成的代码
import gridBody from './extend/outOrderDetail.vue'
import http from '../../api/http';
import { el } from 'element-plus/es/locales.mjs';
let extension = {
    components: {
      //查询界面扩展组件
      gridHeader: '',
      gridBody: gridBody,
      gridFooter: '',
      //新建、编辑弹出框扩展组件
      modelHeader: '',
      modelBody: '',
      modelFooter: ''
  components: {
    //查询界面扩展组件
    gridHeader: '',
    gridBody: gridBody,
    gridFooter: '',
    //新建、编辑弹出框扩展组件
    modelHeader: '',
    modelBody: '',
    modelFooter: ''
  },
  tableAction: '', //指定某张表的权限(这里填写表名,默认不用填写)
  buttons: { view: [], box: [], detail: [] }, //扩展的按钮
  methods: {
    //下面这些方法可以保留也可以删除
    onInit() {
      //扩展页面初始化操作
      let Bt = this.buttons.find(x => x.value == "Complete")
      if (Bt) {
        Bt.onClick = function () {
          let rows = this.$refs.table.getSelected();
          if (rows.length == 0) return this.$error("请选择数据!");
          if (rows.length > 1) return this.$error("只能选择一条数据")
          const id = rows[0].id;
          //const allIds = rows.map(item => item.id);
          // è¿™é‡Œæ·»åŠ ä½ çš„ä¸šåŠ¡é€»è¾‘
          this.http.post(`/api/DeliveryOrder/FinishOutOrder?key=${id}`).then((x) => {
            if (x.status) {
              this.$Message.success('操作成功');
              this.refresh();
            } else {
              return this.$error(x.message);
            }
          });
        }
      }
    },
    tableAction: '', //指定某张表的权限(这里填写表名,默认不用填写)
    buttons: { view: [], box: [], detail: [] }, //扩展的按钮
    methods: {
       //下面这些方法可以保留也可以删除
      onInit() {
        //扩展页面初始化操作
       let Bt=this.buttons.find(x=>x.value=="Complete")
        if(Bt){
    Bt.onClick = function () {
      let rows = this.$refs.table.getSelected();
      if (rows.length == 0) return this.$error("请选择数据!");
      if (rows.length>1)return this.$error("只能选择一条数据")
        const id=rows[0].id;
      //const allIds = rows.map(item => item.id);
      // è¿™é‡Œæ·»åŠ ä½ çš„ä¸šåŠ¡é€»è¾‘
      this.http.post(`/api/DeliveryOrder/FinishOutOrder?key=${id}`).then((x) => {
        if (x.status) {
          this.$Message.success('操作成功');
          this.refresh();
        } else {
          return this.$error(x.message);
    onInited() {
      //框架初始化配置后
      //如果要配置明细表,在此方法操作
      //this.detailOptions.columns.forEach(column=>{ });
      this.buttons.forEach(x => {//name改为要隐藏的按钮名字
        if (x.name == '编 è¾‘') {
          x.hidden = true;
        }
      })
    },
    searchBefore(param) {
      //界面查询前,可以给param.wheres添加查询参数
      //返回false,则不会执行查询
      return true;
    },
    searchAfter(result) {
      //查询后,result返回的查询数据,可以在显示到表格前处理表格的值
      return true;
    },
    addBefore(formData) {
      //新建保存前formData为对象,包括明细表,可以给给表单设置值,自己输出看formData的值
      return true;
    },
    updateBefore(formData) {
      //编辑保存前formData为对象,包括明细表、删除行的Id
      return true;
    },
    rowClick({ row, column, event }) {
      //查询界面点击行事件
      this.$refs.table.$refs.table.toggleRowSelection(row); //单击行时选中当前行;
    },
    modelOpenAfter(row) {
      //点击编辑、新建按钮弹出框后,可以在此处写逻辑,如,从后台获取数据
      //(1)判断是编辑还是新建操作: this.currentAction=='Add';
      //(2)给弹出框设置默认值
      //(3)this.editFormFields.字段='xxx';
      //如果需要给下拉框设置默认值,请遍历this.editFormOptions找到字段配置对应data属性的key值
      //看不懂就把输出看:console.log(this.editFormOptions)
      this.editFormOptions.forEach((editForm) => {
        editForm.forEach((x) => {
          x.readonly = true
        })
      })
      this.detailOptions.buttons.forEach((btn) => {
        if (btn.name != '添加行') {
          btn.hidden = true;
          //或者设置只读
          //btn.readonly=true;
        }
      });
    }
  }
      },
      onInited() {
        //框架初始化配置后
        //如果要配置明细表,在此方法操作
        //this.detailOptions.columns.forEach(column=>{ });
      },
      searchBefore(param) {
        //界面查询前,可以给param.wheres添加查询参数
        //返回false,则不会执行查询
        return true;
      },
      searchAfter(result) {
        //查询后,result返回的查询数据,可以在显示到表格前处理表格的值
        return true;
      },
      addBefore(formData) {
        //新建保存前formData为对象,包括明细表,可以给给表单设置值,自己输出看formData的值
        return true;
      },
      updateBefore(formData) {
        //编辑保存前formData为对象,包括明细表、删除行的Id
        return true;
      },
      rowClick({ row, column, event }) {
        //查询界面点击行事件
        this.$refs.table.$refs.table.toggleRowSelection(row); //单击行时选中当前行;
      },
      modelOpenAfter(row) {
        //点击编辑、新建按钮弹出框后,可以在此处写逻辑,如,从后台获取数据
        //(1)判断是编辑还是新建操作: this.currentAction=='Add';
        //(2)给弹出框设置默认值
        //(3)this.editFormFields.字段='xxx';
        //如果需要给下拉框设置默认值,请遍历this.editFormOptions找到字段配置对应data属性的key值
        //看不懂就把输出看:console.log(this.editFormOptions)
      if (row.out_type == "20") {
        this.detail.columns.forEach((x) => {
          if (x.field == "order_Outqty") {
            x.title = "盘点数量",
              x.edit = true
          }
        })
      } else {
      }
    }
  };
  export default extension;
  }
};
export default extension;
н¨Îļþ¼Ð/WMS/src/extension/stock/Dt_Inventory_Batch.js
@@ -28,7 +28,7 @@
            .post("api/DeliveryOrder/CreateCheckOrder", allIds)
            .then((x) => {
              if (x.status) {
                this.$Message.success('盘点任务完成');
                this.$Message.success('创建盘点单成功');
                this.refresh();
              } else {
                return this.$error(x.message);
н¨Îļþ¼Ð/WMS/src/views/outbound/outboundOrder.vue
@@ -233,7 +233,7 @@
            ]);
            
            const detail = ref({
                cnName: "历史出库单明细",
                cnName: "出库单明细",
                table: "DeliveryOrderDetail",
                url: "/DeliveryOrderDetail/",
                columns: [
@@ -303,7 +303,7 @@
                        width: 100,
                        require: true,
                        align: 'left',
                        // edit:{type:"number"}
                        edit:{type:"number"}
                    },
                    {
                        field: 'batch_num',
@@ -312,7 +312,7 @@
                        width: 120,
                        require: true,
                        align: 'left',
                        // edit:{type:""}
                        edit:{type:""}
                    },
                    {
                        field: 'exp_date',
@@ -320,7 +320,7 @@
                        type: 'string',
                        width: 120,
                        align: 'left',
                        // edit:{type:""}
                        edit:{type:""}
                    },
                    {
                        field: 'ootDetailStatus',