api/WmsSpaHelper.cs
@@ -43,6 +43,7 @@
using HH.WCS.Mobox3.pinggao.core;
using static HH.WCS.Mobox3.pinggao.api.OtherModel.Putaway_Order_In;
using System.Web.Http.Results;
using System.Runtime.Caching;
namespace HH.WCS.Mobox3.pinggao.api
{
@@ -2004,7 +2005,7 @@
                            S_END_LOC = endinfo.S_CODE,
                            S_END_AREA = endinfo.S_AREA_CODE,
                            S_END_WH = endinfo.S_WH_CODE,
                            N_PRIORITY=1,
                            N_TYPE = 2,
                            // S_TYPE = WMSTask.GetTypeStr(1),
                            S_TYPE = "出库空托盘",
@@ -2118,6 +2119,28 @@
            }
        }
        private static readonly ObjectCache Cache = MemoryCache.Default;
        private const string CachePrefix = "ClickProtection_";
        private const int CacheDurationInSeconds = 2;
        public static bool IsClickAllowed(string parameter)
        {
            string cacheKey = CachePrefix + parameter;
            // 检查缓存中是否已存在该参数
            if (Cache.Contains(cacheKey))
            {
                // 缓存中存在,说明5秒内已点击过
                return false;
            }
            else
            {
                // 缓存中不存在,添加到缓存并设置5秒后过期
                CacheItemPolicy policy = new CacheItemPolicy { AbsoluteExpiration = DateTimeOffset.Now.AddSeconds(CacheDurationInSeconds) };
                Cache.Set(cacheKey, parameter, policy);
                return true;
            }
        }
        /// <summary>
        /// 分拣
        /// </summary>
@@ -2127,6 +2150,17 @@
        {
            var result = new SimpleResult();
            if (!IsClickAllowed(model.cntr_code))
            {
                // 提示用户5秒内已点击过
                result.resultMsg = "您已点击过,请2秒后再试。";
                result.resultCode = 1;
                return result;
            }
            else
            {
            }
            // var db = new SqlHelper<object>().GetInstance();
            using (var db = new SqlHelper<object>().GetInstance())
@@ -2165,26 +2199,35 @@
                    }
                    LogHelper.Info($"S_OUT_TYPE{po.S_OUT_TYPE}");
                    var gzra = db.Queryable<TN_GZ_SZ>().Where(a => a.N_ENABLE == 1).First();
                    var GZRQ = DateTime.Now.ToString("yyyyMMdd");
                    if (gzra != null)
                    {
                        GZRQ = gzra.S_GZRQ.ToString("yyyyMMdd");
                    }
                    //根据不同出库类型 回调sap
                    if (po.S_OUT_TYPE == "冲销出库")
                    {
                        result = await CXAddOutboundOrder(db, model.MaterList, model.arrival_no, model.cntr_code, start);
                        result = await CXAddOutboundOrder(GZRQ,db, model.MaterList, model.arrival_no, model.cntr_code, start);
                    }
                    else
                    if (po.S_OUT_TYPE == "出库")//普通出库
                    {
                        LogHelper.Info($"S_OUT_TYPE{po.S_OUT_TYPE}");
                        result = await AddOutboundOrder(db, model.MaterList, model.arrival_no, model.cntr_code, start);
                        result = await AddOutboundOrder(GZRQ, db, model.MaterList, model.arrival_no, model.cntr_code, start);
                    }
                    else if (po.S_OUT_TYPE == "计划外发料出库")
                    {
                        result = await jhwtlAddOutboundOrder(db, model.MaterList, model.arrival_no, model.cntr_code, start);
                        result = await jhwtlAddOutboundOrder(GZRQ,db, model.MaterList, model.arrival_no, model.cntr_code, start);
                    }
                    else if (po.S_OUT_TYPE == "成本中心出库")
                    {
                        result = await CBAddOutboundOrder(db, model.MaterList, model.arrival_no, model.cntr_code, start);
                        result = await CBAddOutboundOrder(GZRQ,db, model.MaterList, model.arrival_no, model.cntr_code, start);
                    }
                    if (result.resultCode == 1)
                    {
                        return result;
                    }
                    //通用接口 对容器货品的删减 和生成回库单 都要用的接口
                    result = await TYAddOutboundOrder(db, model.MaterList, model.arrival_no, model.cntr_code, model.IsHK, start, po.S_OUT_TYPE, model.cntr_type);
                    if (result.resultCode == 1)
@@ -2443,7 +2486,7 @@
                        };
                        if (WMSHelper.CreateWmsTask(wmsTask))
                        {
                            LocationHelper.LockLoc(start, 1);
                            LocationHelper.LockLoc(start, 2);
                            result.resultMsg = $"创建作业成功,作业号{wmsTask.S_CODE}";
                        }
                    }
@@ -2514,13 +2557,25 @@
                        result.resultMsg = $"{model.cntr_code}托盘找不到货位";
                        return result;
                    }
                var startloc = db.Queryable<Location>().Where(a => a.S_CODE == model.start).First();
                var start = "";
                var startloc1 = db.Queryable<LocCntrRel>().Where(a => a.S_CNTR_CODE == model.cntr_code).First();
                if (startloc1 != null)
                {
                    start = startloc1.S_LOC_CODE;
                }
                else
                {
                    result.resultMsg = $"{model.cntr_code}容器未找到货位信息";
                    result.resultCode = 1;
                    return result;
                }
                var startloc = db.Queryable<Location>().Where(a => a.S_CODE ==start).First();
                //var location = db.Queryable<Location>().Where(a => a.S_CODE == locs.S_LOC_CODE).First();
                var wmsTask = new WMSTask
                    {
                        S_CNTR_CODE = model.cntr_code,
                        S_CODE = WMSHelper.GenerateTaskNo(),
                        S_START_LOC = model.start,
                        S_START_LOC = startloc.S_CODE,
                        S_START_AREA = startloc.S_AREA_CODE,
                        S_START_WH = startloc.S_WH_CODE,
@@ -2539,7 +2594,7 @@
                    };
                    if (WMSHelper.CreateWmsTask(wmsTask))
                    {
                        LocationHelper.LockLoc(model.start, 1);
                        LocationHelper.LockLoc(startloc.S_CODE, 1);
                        result.resultMsg = $"创建作业成功,作业号{wmsTask.S_CODE}";
                    }
                }
@@ -2562,7 +2617,7 @@
        /// <param name="cntr_code"></param>
        /// <param name="start"></param>
        /// <returns></returns>
        public static async Task<SimpleResult> CBAddOutboundOrder(SqlSugarClient db, List<Mater> MaterList, string arrival_no, string cntr_code, string start)
        public static async Task<SimpleResult> CBAddOutboundOrder(string GZRQ,SqlSugarClient db, List<Mater> MaterList, string arrival_no, string cntr_code, string start)
        {
            //using (var db = new SqlHelper<object>().GetInstance())
            //{
@@ -2590,12 +2645,12 @@
                //回参物料信息
                List<CBcenterBackDto.HEADItem> iTEMs = new List<CBcenterBackDto.HEADItem>();
                List<OutboundRecord> records = new List<OutboundRecord>();
                string GZRQ = "";
                //string GZRQ = "";
                string PZZDRQ = "";
                if (po.BUDAT != null)
                {
                    GZRQ = DateTime.Parse(po.BUDAT.ToString()).ToString("yyyyMMdd");
                }
                //if (po.BUDAT != null)
                //{
                //    GZRQ = DateTime.Parse(po.BUDAT.ToString()).ToString("yyyyMMdd");
                //}
                if (po.BLDAT != null)
                {
                    PZZDRQ = DateTime.Parse(po.BLDAT.ToString()).ToString("yyyyMMdd");
@@ -2725,7 +2780,7 @@
        /// <param name="cntr_code"></param>
        /// <param name="start"></param>
        /// <returns></returns>
        public static async Task<SimpleResult> jhwtlAddOutboundOrder(SqlSugarClient db, List<Mater> MaterList, string arrival_no, string cntr_code, string start)
        public static async Task<SimpleResult> jhwtlAddOutboundOrder(string GZRQ,SqlSugarClient db, List<Mater> MaterList, string arrival_no, string cntr_code, string start)
        {
            //using (var db = new SqlHelper<object>().GetInstance())
            //{
@@ -2743,12 +2798,12 @@
                DateTime dateTime;
                DateTime dateTime1;
                string GZRQ = "";
                //string GZRQ = "";
                string PZZDRQ = "";
                if (po.BUDAT != null)
                {
                    GZRQ = DateTime.Parse(po.BUDAT.ToString()).ToString("yyyyMMdd");
                }
                //if (po.BUDAT != null)
                //{
                //    GZRQ = DateTime.Parse(po.BUDAT.ToString()).ToString("yyyyMMdd");
                //}
                if (po.BLDAT != null)
                {
                    PZZDRQ = DateTime.Parse(po.BLDAT.ToString()).ToString("yyyyMMdd");
@@ -2917,7 +2972,7 @@
        /// <param name="cntr_code"></param>
        /// <param name="start"></param>
        /// <returns></returns>
        public static async Task<SimpleResult> CXAddOutboundOrder(SqlSugarClient db, List<Mater> MaterList, string arrival_no, string cntr_code, string start)
        public static async Task<SimpleResult> CXAddOutboundOrder(string GZRQ,SqlSugarClient db, List<Mater> MaterList, string arrival_no, string cntr_code, string start)
        {
            // var db = new SqlHelper<object>().GetInstance();
@@ -2927,15 +2982,15 @@
            try
            {
                //库位信息
                var startinfo = db.Queryable<Location>().Where(it => it.S_CODE == start).First();
                //var startinfo = db.Queryable<Location>().Where(it => it.S_CODE == start).First();
                //出库单详情
                var po = db.Queryable<TN_Outbound_Order>().Includes(s => s.Details).Where(a => a.S_NO == arrival_no).First();
                string GZRQ = "";
                if (po.BUDAT != null)
                {
                    GZRQ = DateTime.Parse(po.BUDAT.ToString()).ToString("yyyyMMdd");
                }
                //string GZRQ = "";
                //if (po.BUDAT != null)
                //{
                //    GZRQ = DateTime.Parse(po.BUDAT.ToString()).ToString("yyyyMMdd");
                //}
                //来源冲销凭证对应的物料凭证信息
                //var poIn = db.Queryable<TN_Inbound_Order>().Includes(s => s.Details).Where(a => a.S_NO == po.S_BS_NO).First();
@@ -2968,11 +3023,6 @@
                    hEAD.GZRQ = GZRQ;
                    hEAD.SRSJ = DateTime.Now.ToString("yyyyMMdd");
                    //hEAD.WLPZ = porecord.Where(s => s.S_WLBM == item.item_code && s.S_WLH == item.N_ROW_NO).First()?.S_WLPZBH;
                    //hEAD.WLPZNF = porecord.Where(s=>s.S_WLBM==item.item_code&&s.S_WLH==item.N_ROW_NO).First()?.S_WLPZND;
                    //hEAD.WLPZ = porecord.First()?.S_WLPZBH;
                    //hEAD.WLPZNF = porecord.First()?.S_WLPZND;
                    hEAD.WLPZ = porecord.FirstOrDefault()?.S_WLPZBH;
                    hEAD.WLPZNF = porecord.FirstOrDefault()?.S_WLPZND;
@@ -3093,7 +3143,7 @@
        /// <param name="cntr_code"></param>
        /// <param name="start"></param>
        /// <returns></returns>
        public static async Task<SimpleResult> AddOutboundOrder(SqlSugarClient db, List<Mater> MaterList, string arrival_no, string cntr_code, string start)
        public static async Task<SimpleResult> AddOutboundOrder(string GZRQ,SqlSugarClient db, List<Mater> MaterList, string arrival_no, string cntr_code, string start)
        {
            //using (var db = new SqlHelper<object>().GetInstance())
            //{
@@ -3106,7 +3156,7 @@
                var startinfo = db.Queryable<Location>().Where(it => it.S_CODE == start).First();
                //出库单详情
                var po = db.Queryable<TN_Outbound_Order>().Includes(s => s.Details).Where(a => a.S_NO == arrival_no).First();
                string GZRQ = "";
                //string GZRQ = "";
                string PZZDRQ = "";
                //if (po.Details[0].S_CJRQ != null)
                //{
@@ -3126,7 +3176,7 @@
                            KEY = po.S_NO,
                            ZYWLX = "2",
                            PZRQ = DateTime.Now.ToString("yyyyMMdd"),
                            GZRQ = DateTime.Now.ToString("yyyyMMdd"), // 假设日期格式为"年-月-日"
                            GZRQ = GZRQ, // 假设日期格式为"年-月-日"
                            GZRY = po.S_CREATOR_NAME,
                            ITEM = new List<CkBcakDto.ITEM>
                            {
@@ -3871,7 +3921,7 @@
        /// </summary>
        /// <param name="model"></param>
        /// <returns></returns>
        internal static WeiLiResult Out_Order_Inss(string S_NO)
        internal static WeiLiResult Out_Order_Inss(string S_NO,int N_PRIORITY)
        {
            var result = new WeiLiResult();
            //  var db = new SqlHelper<object>().GetInstance();
@@ -3897,7 +3947,7 @@
                    else
                    {
                        //var az = db.Queryable<AZInventory>().ToList();
                        var po1 = new TN_Outbound_Order { S_NO = WMSHelper.GenerateShippNo(), UNAME = po.UNAME, S_FACTORY = po.S_FACTORY, S_CBZX = po.S_CBZX, S_ZZKM = po.S_ZZKM, S_LRZX = po.S_LRZX, BLDAT = po.BLDAT, BUDAT = po.BUDAT, S_OUT_TYPE = po.S_OUT_TYPE, S_BS_TYPE = po.S_BS_TYPE, S_AREA_CODE = po.S_AREA_CODE, S_BS_NO = po.S_NO };
                        var po1 = new TN_Outbound_Order { S_NO = WMSHelper.GenerateShippNo(), N_PRIORITY=N_PRIORITY, UNAME = po.UNAME, S_FACTORY = po.S_FACTORY, S_CBZX = po.S_CBZX, S_ZZKM = po.S_ZZKM, S_LRZX = po.S_LRZX, BLDAT = po.BLDAT, BUDAT = po.BUDAT, S_OUT_TYPE = po.S_OUT_TYPE, S_BS_TYPE = po.S_BS_TYPE, S_AREA_CODE = po.S_AREA_CODE, S_BS_NO = po.S_NO };
                        List<TN_Ll_detail> tN_Ll_Details = new List<TN_Ll_detail>();
                        po1.Details = new List<TN_Outbound_Detail>();
                        var list = po.Details.Where(s => s.F_QTY > s.F_ACC_D_QTY&&s.S_ERP_WH_CODE=="4004").Select(s => s.S_ITEM_CODE).Distinct().ToArray();
@@ -4373,6 +4423,11 @@
                    db.BeginTran();
                    var po = db.Queryable<TN_Inbound_Order>().Includes(p => p.Details).Where(a => a.S_NO == model.S_NO).First();
                    LogHelper.Info($"进来了2");
                    #region MyRegion
                    if (po.Details.Count > 0)
@@ -4462,6 +4517,152 @@
                                w.S_ITEM_CODE == d.S_ITEM_CODE &&
                                w.N_ROW_NO == d.N_ROW_NO)).OrderBy(s => s.N_ROW_NO)
                            .ToList();
                    #region MyRegion
                    List<TN_Center_Inbound_Detail> tN_Center_Inbound_Details=new List<TN_Center_Inbound_Detail>();
                    foreach (var item in po.Details)
                    {
                        bool idadd = true;
                       // var cir2 = db.Queryable<CGRels>().Where(a => a.S_ITEM_CODE == item.S_ITEM_CODE && a.S_CNTR_TYPE == "半托").Select(s => s.S_CNTR_CODE).Distinct().ToArray();
                        var S_CNTR_CODE = "";
                        var lcr = db.Queryable<LocCntrRel>()
                            .InnerJoin<CGRels>((l, c) => l.S_CNTR_CODE == c.S_CNTR_CODE)
                            .Where((l, c) => c.S_ITEM_CODE == item.S_ITEM_CODE && c.S_CNTR_TYPE == "半托")
                            .OrderByDescending((l, c) => l.T_CREATE)
                            .Select((l, c) => l).ToList()
                            .FirstOrDefault();
                        //if (cir2.Count()>0)
                        //{
                           // var lcr = db.Queryable<LocCntrRel>().Where(c => cir2.Contains(c.S_CNTR_CODE)).OrderByDescending(s=>s.T_CREATE).First();
                            S_CNTR_CODE = lcr.S_CNTR_CODE;
                            if (lcr != null)
                            {
                                //起始库位
                                var startloc = db.Queryable<Location>().Where(it => it.S_CODE == lcr.S_LOC_CODE).First();
                                var wsc = db.Queryable<WCSTask>().Where(it => it.S_CNTR_CODE == S_CNTR_CODE&&it.S_TYPE.Contains("出库") && it.N_B_STATE < 3).First();
                                if (wsc != null)
                                {
                                    item.N_B_STATE = 2;
                                    db.Updateable(item).UpdateColumns(it => new { it.N_B_STATE }).ExecuteCommand();
                                }
                                else
                                {
                                    if (startloc != null)//&&
                                    {
                                        //终点货位
                                        var endloc = db.Queryable<Location>().Where(it => it.S_AREA_CODE == "QYQXHQ" && it.N_LOCK_STATE == 0 && it.N_CURRENT_NUM == 0).First();
                                        // var endloc = db.Queryable<Location>().Where(it => it.S_CODE == item.S_END_LOC).First();
                                        if (endloc != null)
                                        {
                                            var optask = new WMSTask
                                            {
                                                S_CODE = WMSHelper.GenerateTaskNo(),
                                                S_START_LOC = startloc.S_CODE,
                                                S_START_AREA = startloc.S_AREA_CODE,
                                                S_START_WH = startloc.S_WH_CODE,
                                                S_END_LOC = endloc.S_CODE,
                                                S_END_AREA = endloc.S_AREA_CODE,
                                                S_END_WH = endloc.S_WH_CODE,
                                                N_PRIORITY = 1,
                                                S_TYPE = "半托出库",
                                                N_TYPE = 2,
                                                N_B_STATE = 0,
                                                S_BS_NO = "",
                                                S_CNTR_CODE = S_CNTR_CODE,
                                                S_OP_DEF_NAME = item.S_BS_TYPE
                                            };
                                            var res = db.Insertable(optask).ExecuteCommand() > 0;
                                            if (res)
                                            {
                                                startloc.N_LOCK_STATE = 2;
                                                startloc.S_LOCK_STATE = "出库锁";
                                                db.Updateable(startloc).UpdateColumns(it => new { it.S_LOCK_STATE, it.N_LOCK_STATE }).ExecuteCommand();
                                            var models = db.Queryable<Location>().Where(a => a.S_CODE == endloc.S_CODE).First();
                                            // if (model != null && model.S_LOCK_STATE.Trim() == "无")
                                            if (models != null && models.N_LOCK_STATE == 0)
                                            {
                                                models.N_LOCK_STATE = 1;
                                                models.S_LOCK_STATE = Location.GetLockStateStr(1);
                                                res = db.Updateable(models).UpdateColumns(it => new { it.N_LOCK_STATE, it.S_LOCK_STATE }).ExecuteCommand() > 0;
                                            }
                                            //LocationHelper.LockLoc(endloc.S_CODE, 1);
                                                item.N_B_STATE = 2;
                                                db.Updateable(item).UpdateColumns(it => new { it.N_B_STATE }).ExecuteCommand();
                                        }
                                        }
                                        else
                                        {
                                        idadd = false;
                                            LogHelper.Info($" 库区AGVXHQ无空货位");
                                        }
                                    }
                                    else
                                    {
                                       idadd = false;
                                        LogHelper.Info($" 库区无货位");
                                    }
                                }
                            }
                            else
                            {
                            idadd = false;
                            LogHelper.Info($"物料{item.S_ITEM_CODE}未找到容器对应的货位信息,请联系人工绑定关系");
                            }
                        if (!idadd)
                        {
                            TN_Center_Inbound_Detail tN_Center_Inbound_Detail = new TN_Center_Inbound_Detail();
                            tN_Center_Inbound_Detail.S_IO_NO = item.S_IO_NO;
                            tN_Center_Inbound_Detail.N_ROW_NO = item.N_ROW_NO;
                            tN_Center_Inbound_Detail.S_ITEM_CODE = item.S_ITEM_CODE;
                            tN_Center_Inbound_Detail.F_QTY = item.F_QTY;
                            tN_Center_Inbound_Detail.S_ITEM_STATE = item.S_ITEM_STATE;
                            tN_Center_Inbound_Detail.S_ITEM_NAME = item.S_ITEM_NAME;
                            tN_Center_Inbound_Detail.F_ACC_B_QTY = item.F_ACC_B_QTY;
                            tN_Center_Inbound_Detail.S_KCDD = item.S_KCDD;
                            tN_Center_Inbound_Detail.S_UOM = item.S_UOM;//计量单位
                            tN_Center_Inbound_Detail.S_BATCH_NO = item.S_BATCH_NO;
                            tN_Center_Inbound_Detail.S_CGPZH = item.S_CGPZH;
                            tN_Center_Inbound_Detail.S_CGPZXMBH = item.S_CGPZXMBH;
                            tN_Center_Inbound_Detail.S_CKPZKJND = item.S_CKPZKJND;
                            tN_Center_Inbound_Detail.S_CKPZXM = item.S_CKPZXM;
                            tN_Center_Inbound_Detail.S_CXWLPZBH = item.S_CXWLPZBH;
                            tN_Center_Inbound_Detail.S_HWSJJYZT = item.S_HWSJJYZT;
                            tN_Center_Inbound_Detail.S_JYPBH = item.S_JYPBH;
                            tN_Center_Inbound_Detail.S_KJPZSSRQ = item.S_KJPZSSRQ;
                            tN_Center_Inbound_Detail.S_KJPZSRSJ = item.S_KJPZSRSJ;
                            tN_Center_Inbound_Details.Add(tN_Center_Inbound_Detail);
                        }
                        //}
                        //else
                        //{
                        //    LogHelper.Info($"未找到物料{item.S_ITEM_CODE}对应的容器");
                        //}
                    }
                    db.Insertable(tN_Center_Inbound_Details).ExecuteCommand();
                    #endregion
                    var gzra = db.Queryable<TN_GZ_SZ>().Where(a => a.N_ENABLE == 1).First();
                    var GZRQ = DateTime.Now.ToString("yyyyMMdd");
                    if (gzra!=null)
                    {
                        GZRQ= gzra.S_GZRQ.ToString("yyyyMMdd");
                    }
                    if (po.S_IN_TYPE == "内采入库")
                    {
                        List<NcRkDto.ITEM> listitem = new List<NcRkDto.ITEM>();
@@ -4517,7 +4718,7 @@
                                    {
                                        KEY = KEY,
                                        GZRQ = DateTime.Now.ToString("yyyyMMdd"),
                                        GZRQ = GZRQ,
                                        GZRY = model.GZRY,//GenerateTaskNo
                                        WLPZBH = po.S_NO,
                                        WLPZND = po.S_WLPZND
@@ -4631,12 +4832,12 @@
                    {
                        DateTime dateTime;
                        DateTime dateTime1;
                        string GZRQ = "";
                        //string GZRQ = "";
                        string PZZDRQ = "";
                        if (po.BUDAT != null)
                        {
                            GZRQ = DateTime.Parse(po.BUDAT.ToString()).ToString("yyyyMMdd");
                        }
                        //if (po.BUDAT != null)
                        //{
                        //    GZRQ = DateTime.Parse(po.BUDAT.ToString()).ToString("yyyyMMdd");
                        //}
                        if (po.BLDAT != null)
                        {
                            PZZDRQ = DateTime.Parse(po.BLDAT.ToString()).ToString("yyyyMMdd");
@@ -4849,7 +5050,7 @@
                                    HEAD = new WcRkBc.HEAD
                                    {
                                        KEY = KEY,
                                        GZRQ = DateTime.Now.ToString("yyyyMMdd"),
                                        GZRQ = GZRQ,
                                        GZRY = model.GZRY,
                                        GC = po.S_FACTORY
                                    },
@@ -4962,12 +5163,12 @@
                    {
                        var materpz = db.Queryable<TN_Inbound_Order>().Where(s => s.S_NO == po.S_NO).First();
                        string GZRQ = "";
                        //string GZRQ = "";
                        LogHelper.Info($"冲销入库入库{po.BUDAT}");
                        if (po.BUDAT != null)
                        {
                            GZRQ = DateTime.Parse(po.BUDAT.ToString()).ToString("yyyyMMdd");
                        }
                        //if (po.BUDAT != null)
                        //{
                        //    GZRQ = DateTime.Parse(po.BUDAT.ToString()).ToString("yyyyMMdd");
                        //}
                        //出库回调入参
                        CXCkBackDto.Root roots = new CXCkBackDto.Root