杨前锦
2025-05-26 d0a265713fd18162f3a82bdcd22e267df7298c7b
HH.WCS.Mobox3/HH.WCS.Mobox3.YNJT_PT/wms/ContainerHelper.cs
@@ -57,6 +57,22 @@
        }
        internal static bool AddCntr(string cntrCode)
        {
            var res = false;
            var db = new SqlHelper<object>().GetInstance();
            var TN_Container = new Container { S_CODE = cntrCode };
            try
            {
                res = db.Insertable<Container>(TN_Container).ExecuteCommand() > 0;
            }
            catch (Exception ex)
            {
                LogHelper.Info($"添加容器错误,错误原因:{ex.Message}", "WMS");
            }
            return res;
        }
        internal static bool AddCntr(string cntrCode, string itemCode) {
            var res = false;
            var db = new SqlHelper<object>().GetInstance();
@@ -107,99 +123,7 @@
            var list = db.Queryable<CntrItemRel>().Where(a => a.S_CNTR_CODE == cntr).ToList();
            return list;
        }
        internal static bool BindNewCntrItem(string loc,string cntrCode, string itemCode) {
            var res = false;
            var itemName = ItemHelper.GetItemInfo(itemCode).S_ITEM_NAME;
            var db = new SqlHelper<object>().GetInstance();
            try {
                db.BeginTran();
                var cntr = new Container { S_CODE = cntrCode, N_DETAIL_COUNT = 1 };
                db.Insertable(cntr).ExecuteCommand();
                //获取物料信息,填充到容器货品明细,方便人工查看
                var cir = new CntrItemRel { S_CNTR_CODE = cntr.S_CODE.Trim(), F_QTY = 1, S_ITEM_CODE = itemCode, S_ITEM_NAME = itemName };
                db.Insertable<CntrItemRel>(cir).ExecuteCommand();
                var lcr = new LocCntrRel { S_CNTR_CODE = cntrCode, S_LOC_CODE = loc };
                db.Insertable<LocCntrRel>(lcr).ExecuteCommand();
                db.CommitTran();
                res = true;
            }
            catch (Exception ex) {
                db.RollbackTran();
                Console.WriteLine(ex.Message);
            }
            return res;
        }
        /// <summary>
        /// 物料信息绑定到满容器上
        /// </summary>
        /// <param name="cntrCode"></param>
        /// <param name="itemCode"></param>
        /// <param name="batchNo"></param>
        /// <param name="qty"></param>
        /// <returns></returns>
        internal static bool BindCntrItem(Container cntr, string itemCode, string batchNo, float qty, string putawayNo) {
            var res = false;
            var db = new SqlHelper<object>().GetInstance();
            try {
                db.BeginTran();
                //1.查看是否有相同物料批次的信息,如果有要累加,不同批次的可以分开
                var cir = db.Queryable<CntrItemRel>().Where(a => a.S_CNTR_CODE == cntr.S_CODE && a.S_ITEM_CODE == itemCode && a.S_BATCH_NO == batchNo).First();
                if (cir != null) {
                    cir.F_QTY += qty;
                    db.Updateable(cir).UpdateColumns(it => new { it.F_QTY }).ExecuteCommand();
                }
                else {
                    //2.插入新的容器物料信息(容器号不变)
                    cir = new CntrItemRel { S_CNTR_CODE = cntr.S_CODE.Trim(), S_BATCH_NO = batchNo, F_QTY = qty, S_ITEM_CODE = itemCode, S_PUTAWAY_NO = putawayNo };
                    db.Insertable<CntrItemRel>(cir).ExecuteCommand();
                }
                var count = db.Queryable<CntrItemRel>().Count(a => a.S_CNTR_CODE == cntr.S_CODE);
                cntr.N_DETAIL_COUNT = count;
                cntr.C_ENABLE = "N";//码盘后将托盘设置为不可用状态,入库后变成可用
                db.Updateable(cntr).UpdateColumns(it => new { it.N_DETAIL_COUNT, it.C_ENABLE, it.S_SRC }).ExecuteCommand();
                db.CommitTran();
                res = true;
            }
            catch (Exception ex) {
                db.RollbackTran();
                Console.WriteLine(ex.Message);
            }
            return res;
        }
        /// <summary>
        /// 物料信息绑定到满容器上
        /// </summary>
        /// <param name="cntrCode"></param>
        /// <param name="itemCode"></param>
        /// <param name="batchNo"></param>
        /// <param name="qty"></param>
        /// <param name="purpose">容器用途,用于哪个线边还是目的点</param>
        /// <returns></returns>
        internal static bool BindCntrItemSingle(Container cntr, string itemCode, string batchNo, float qty) {
            var res = false;
            var db = new SqlHelper<object>().GetInstance();
            try {
                db.BeginTran();
                db.Updateable(cntr).UpdateColumns(it => new { it.S_DEST }).ExecuteCommand();
                //1.将原有容器物料信息删除
                db.Deleteable<CntrItemRel>().Where(it => it.S_CNTR_CODE == cntr.S_CODE.Trim()).ExecuteCommand();
                //2.插入新的容器物料信息(容器号不变)
                var cir = new CntrItemRel { S_CNTR_CODE = cntr.S_CODE.Trim(), S_BATCH_NO = batchNo, F_QTY = qty, S_ITEM_CODE = itemCode };
                db.Insertable<CntrItemRel>(cir).ExecuteCommand();
                db.CommitTran();
                res = true;
            }
            catch (Exception ex) {
                db.RollbackTran();
            }
            return res;
        }
        /// <summary>
        /// 根据容器来源和状态获取托盘
        /// </summary>
@@ -308,98 +232,6 @@
                return db.Queryable<Container>().Where(a => a.S_SRC == src && a.N_B_STATE == state && a.S_TYPE == cntrType).ToList();
            }
        }
        /// <summary>
        /// enable 让托盘允许被出库计算到,同时增加量表数据
        /// </summary>
        /// <param name="cntr"></param>
        internal static void Enable(string cntr, string loc) {
            var db = new SqlHelper<object>().GetInstance();
            var cntrInfo = db.Queryable<Container>().Where(a => a.S_CODE == cntr).First();
            //获取仓库量表
            //获取物理库区
            //获取逻辑库区
            if (cntrInfo != null) {
                try {
                    db.BeginTran();
                    //防止接口重复调用,量表重复增加
                    if (cntrInfo.C_ENABLE == "N") {
                        cntrInfo.C_ENABLE = "Y";
                        db.Updateable(cntrInfo).UpdateColumns(a => new { a.C_ENABLE, a.T_MODIFY }).ExecuteCommand();
                        var cirList = db.Queryable<CntrItemRel>().Where(a => a.S_CNTR_CODE == cntr).ToList();
                        if (cirList.Count > 0) {
                            cirList.ForEach(a => {
                                var wh = db.Queryable<WHInventory>().Where(b => b.S_ITEM_CODE == a.S_ITEM_CODE).First();
                                if (wh != null) {
                                    //更新仓库量表
                                    wh.F_QTY += a.F_QTY;
                                    wh.T_MODIFY = DateTime.Now;
                                    db.Updateable(wh).UpdateColumns(it => new { it.F_QTY, it.T_MODIFY }).ExecuteCommand();
                                }
                                else {
                                    //新增仓库量表
                                    wh = new WHInventory { F_QTY = a.F_QTY, S_ITEM_CODE = a.S_ITEM_CODE };
                                    db.Insertable(wh).ExecuteCommand();
                                }
                                //写入第三方中间表
                                var di = new DayuanIn
                                {
                                    CN_S_ARRIVAL_NO = a.S_PUTAWAY_NO,
                                    CN_F_QUANTITY = a.F_QTY,
                                    CN_S_BATCH_NO = a.S_BATCH_NO,
                                    CN_S_ITEM_CODE = a.S_ITEM_CODE,
                                };
                                db.Insertable(di).ExecuteCommand();
                                //如果要统计分拣中,分拣回的量,无法跟踪托盘,除非对托盘加标识,属于哪个库区。
                                //另外分拣回可能去别的巷道,别的逻辑库区,逻辑库区的量控制更复杂,不能计算分拣中和分拣回。所以库区量表本项目暂不考虑
                                /*
                                //获取货位的物理库区和所有逻辑库区
                                var location = db.Queryable<Location>().Where(l => l.S_CODE == loc).First();
                                if (location != null) {
                                    var az = db.Queryable<AZInventory>().Where(b => b.S_ITEM_CODE == a.S_ITEM_CODE && b.S_AREA_CODE == location.S_AREA_CODE).First();
                                    if (az != null) {
                                        //更新库区量表
                                        az.F_QTY += a.F_QTY;
                                        az.T_MODIFY = DateTime.Now;
                                        db.Updateable(az).UpdateColumns(it => new { it.F_QTY, it.T_MODIFY }).ExecuteCommand();
                                    }
                                    else {
                                        //新增库区量表
                                        az = new AZInventory { F_QTY = a.F_QTY, S_ITEM_CODE = a.S_ITEM_CODE, S_AREA_CODE = location.S_AREA_CODE };
                                        db.Insertable(az).ExecuteCommand();
                                    }
                                }
                                //逻辑库区的量表
                                var zoneList = db.Queryable<ZoneLoc>().Where(l => l.S_LOC_CODE == loc).ToList();
                                if (zoneList.Count > 0) {
                                    zoneList.ForEach(z => {
                                        var az = db.Queryable<AZInventory>().Where(b => b.S_ITEM_CODE == a.S_ITEM_CODE && b.S_AREA_CODE == z.S_ZONE_CODE).First();
                                        if (az != null) {
                                            //更新库区量表
                                            az.F_QTY += a.F_QTY;
                                            az.T_MODIFY = DateTime.Now;
                                            db.Updateable(az).UpdateColumns(it => new { it.F_QTY, it.T_MODIFY }).ExecuteCommand();
                                        }
                                        else {
                                            //新增库区量表
                                            az = new AZInventory { F_QTY = a.F_QTY, S_ITEM_CODE = a.S_ITEM_CODE, S_AREA_CODE = z.S_ZONE_CODE, C_IS_LOGIC_AREA = "Y" };
                                            db.Insertable(az).ExecuteCommand();
                                        }
                                    });
                                }
                                */
                            });
                        }
                    }
                    db.CommitTran();
                }
                catch (Exception ex) {
                    Console.WriteLine(ex.Message);
                    db.RollbackTran();
                }
            }
        }
    }
}