IPC-610
2024-12-03 2f0120d0c10ac24603936911ee5812d4e71d2740
Wms/WMS.BLL/BllPdaServer/PdaCrServer.cs
@@ -1,14 +1,19 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Security.Policy;
using System.Text;
using System.Threading.Tasks;
using Model.InterFaceModel;
using Model.ModelDto.BllCheckDto;
using Model.ModelDto.PdaDto;
using Model.ModelDto.SysDto;
using Model.ModelVm;
using Newtonsoft.Json;
using SqlSugar;
using Utility.Tools;
using WMS.BLL.LogServer;
using WMS.BLL.SysServer;
using WMS.DAL;
using WMS.Entity.BllAsnEntity;
using WMS.Entity.BllCheckEntity;
@@ -1332,5 +1337,277 @@
        }
        #endregion
        #region 人工转运
        //人工转运
        public void ArtificialTransport(string palletNo, string locatNo, string endLocatNo, string mesTokenUrl, string mesUrl,int userId)
        {
            if (string.IsNullOrEmpty(palletNo))
            {
                throw new Exception("请扫描托盘条码!");
            }
            if (string.IsNullOrEmpty(locatNo))
            {
                throw new Exception("请选择起始地址!");
            }
            if (string.IsNullOrEmpty(endLocatNo))
            {
                throw new Exception("请输入目标地址!");
            }
            try
            {
                #region 判断信息
                var stockDetail = Db.Queryable<DataStockDetail>().Where(w => w.IsDel == "0" && w.PalletNo == palletNo).ToList();
                if (stockDetail.Count == 0)
                {
                    throw new Exception("托盘上物料库存明细信息不存在,请检查!");
                }
                if (string.IsNullOrEmpty(stockDetail.First().LocatNo))
                {
                    throw new Exception("托盘储位信息不存在,请检查!");
                }
                if (stockDetail.First().WareHouseNo != "W02")
                {
                    throw new Exception("该托盘未在平库内,请检查!");
                }
                //起始储位信息
                var storageLocat = Db.Queryable<SysStorageLocat>().First(w => w.IsDel == "0" && w.LocatNo == locatNo);
                if (storageLocat == null)
                {
                    throw new Exception("起始地址储位信息不存在,请检查!");
                }
                //目标储位信息
                var EndLocat = Db.Queryable<SysStorageLocat>().First(w => w.IsDel == "0" && w.LocatNo == endLocatNo);
                if (EndLocat == null)
                {
                    throw new Exception("目标地址储位信息不存在,请检查!");
                }
                #endregion
                //开启事务
                Db.BeginTran();
                //需先判断目标地址前方是否有空储位
                storageLocat.Status = "0"; //更改起始储位
                Db.Updateable(storageLocat).ExecuteCommand();
                EndLocat.Status = "1"; //更改目标储位
                Db.Updateable(storageLocat).ExecuteCommand();
                var data = new List<RequertBeiliaoInfoModel>();
                //更改库存明细
                foreach (var item in stockDetail)
                {
                    item.LocatNo = EndLocat.LocatNo;//储位更改
                    item.WareHouseNo = EndLocat.WareHouseNo;//所属仓库更改
                    item.RoadwayNo = EndLocat.RoadwayNo;//所属巷道更改
                    item.AreaNo = EndLocat.AreaNo;//所属区域更改
                    Db.Updateable(item).ExecuteCommand();
                    if (EndLocat != null && EndLocat.AreaNo == "B12") //是否是3楼缓存区 是:删除库存
                    {
                        if (string.IsNullOrWhiteSpace(item.SONo))
                        {
                            throw new Exception("当前托盘不是拼托出库托盘");
                        }
                        var boxInfo = Db.Queryable<DataBoxInfo>().Where(m => m.IsDel == "0" && m.StockDetailId == item.Id).ToList();
                        if (boxInfo.Count == 0)
                        {
                            throw new Exception("托盘上物料箱码信息不存在,请检查!");
                        }
                        //记录托盘上信息给MES
                        foreach (var item2 in boxInfo) {
                            data.Add(new RequertBeiliaoInfoModel()
                            {
                                no = item2.BoxNo,
                                materiel_no = item.SkuNo,
                                materiel_name = item.SkuName,
                                qty = item.Qty,
                                batch = item.LotNo,
                                producttime = item.ProductionTime,
                                expiry = item.ExpirationTime
                            });
                        }
                        //库存箱码明细删除
                        Db.Deleteable(boxInfo).ExecuteCommand();
                        //删除库存托盘信息
                        Db.Deleteable(item).ExecuteCommand();
                        //更改库存总表
                        var stock = Db.Queryable<DataStock>().First(w => w.IsDel == "0" && w.SkuNo == item.SkuNo && w.LotNo == item.LotNo);
                        stock.LockQty -= (decimal)item.Qty;
                        stock.Qty -= (decimal)item.Qty;
                        Db.Updateable(stock).ExecuteCommand();
                        //更改托盘状态
                        var pallet = Db.Queryable<SysPallets>().First(m => m.IsDel == "0" && m.PalletNo == palletNo);
                        if (pallet != null)
                        {
                            pallet.Status = "0";
                            Db.Updateable(pallet).ExecuteCommand();
                        }
                    }
                }
                if (EndLocat != null && EndLocat.AreaNo == "B12")
                {
                    //获取令牌
                    var token = new Token().GetMesToken(mesTokenUrl);
                    Dictionary<string, string> mesDic = new Dictionary<string, string>()
                    {
                        {"Authorization",token }
                    };
                    var mesData = new RequertBeiliaoModel()
                    {
                        morder_no = stockDetail.First().SONo,
                        pallet = stockDetail.First().PalletNo,
                        layer_no = EndLocat.LocatNo,
                        items = data
                    };
                    var jsonData = JsonConvert.SerializeObject(mesData);
                    //调用接口
                    var response = HttpHelper.DoPost(mesUrl, jsonData, "备料完成运至缓存区反馈至MES", "MES", mesDic);
                    var obj = JsonConvert.DeserializeObject<MesModel>(response);//解析返回数据
                    if (obj.status != "0")
                    {
                        throw new Exception("备料同步MES失败:" + obj.message);
                    }
                }
                //添加操作日志记录
                var k = new OperationCrServer().AddLogOperationCr("PDA模块", "AGV转运", palletNo, "移库", $"PDA呼叫小车对托盘号:{palletNo}发起转运", userId);
                //提交事务
                Db.CommitTran();
            }
            catch (Exception ex)
            {
                Db.RollbackTran();
                throw new Exception(ex.Message);
            }
        }
        #endregion
        #region 箱码查询
        /// <summary>
        /// 箱码查询
        /// </summary>
        /// <param name="boxNo">箱码</param>
        /// <returns></returns>
        public DataBoxDto GetBoxQueryList(string boxNo)
        {
            // 实例化返回类
            DataBoxDto boxModel = new DataBoxDto();
            List<DataBoxInfoDto> list = new List<DataBoxInfoDto>();
            // 根据箱码获取箱信息
            var boxData = Db.Queryable<DataBoxInfo>().Where(m => m.IsDel == "0" && m.BoxNo == boxNo);
            if (boxData.Count() == 0)
            {
                // 根据盒码获取箱信息
                boxData = Db.Queryable<DataBoxInfo>().Where(m => m.IsDel == "0" && m.BoxNo2 == boxNo);
                if (boxData.Count() == 0)
                {
                    boxModel = Db.Queryable<DataBoxInfo>().Where(m => m.IsDel == "0" && m.BoxNo3 == boxNo).Select(it => new DataBoxDto() { Qty = it.Qty }, true).First();
                    return boxModel;
                }
                list = boxData.Select(it => new DataBoxInfoDto()
                {
                    BoxNo2 = it.BoxNo3,
                    Qty2 = it.Qty
                }).ToList();
                boxData = Db.Queryable<DataBoxInfo>().Where(m => m.IsDel == "0" && m.BoxNo2 == boxNo);
                boxModel = boxData.GroupBy(m => new
                {
                    m.BoxNo,
                    m.SkuName,
                    m.SkuNo,
                    m.LotNo,
                    m.SupplierLot,
                    m.InspectStatus
                }).Select(it => new DataBoxDto()
                {
                    BoxNo = it.BoxNo,
                    SkuName = it.SkuName,
                    SkuNo = it.SkuNo,
                    LotNo = it.LotNo,
                    SupplierLot = it.SupplierLot,
                    InspectStatus = it.InspectStatus == "0" ? "待检" : it.InspectStatus == "1" ? "合格":"不合格",
                    Qty = SqlFunc.AggregateSum(it.Qty)
                }).First();
                boxModel.InfoList = list;
                return boxModel;
            }
            else  //箱码内数据
            {
                // 处理多级码
                var num = boxData.Count(m => !string.IsNullOrWhiteSpace(m.BoxNo2));
                if (num > 0)
                {
                    list = boxData.GroupBy(m => new
                    {
                        m.BoxNo2
                    }).Select(it => new DataBoxInfoDto()
                    {
                        BoxNo2 = it.BoxNo2,
                        Qty2 = SqlFunc.AggregateSum(it.Qty)
                    }).ToList();
                }
                else
                {
                    list = boxData.Select(it => new DataBoxInfoDto()
                    {
                        BoxNo2 = SqlFunc.IsNull(it.BoxNo3,""),
                        Qty2 = it.Qty
                    }).ToList();
                }
                // 箱码信息赋值
                boxData = Db.Queryable<DataBoxInfo>().Where(m => m.IsDel == "0" && m.BoxNo == boxNo);
                boxModel = boxData.GroupBy(m => new
                {
                    m.BoxNo,
                    m.SkuName,
                    m.SkuNo,
                    m.LotNo,
                    m.SupplierLot,
                    m.InspectStatus
                }).Select(it => new DataBoxDto()
                {
                    BoxNo = it.BoxNo,
                    SkuName = it.SkuName,
                    SkuNo = it.SkuNo,
                    LotNo = it.LotNo,
                    SupplierLot = it.SupplierLot,
                    InspectStatus = it.InspectStatus == "0" ? "待检" : it.InspectStatus == "1" ? "合格" : "不合格",
                    Qty = SqlFunc.AggregateSum(it.Qty)
                }).First();
                boxModel.InfoList = list;
                return boxModel;
            }
        }
        #endregion
    }
}