| | |
| | | using SqlSugar; |
| | | using static HH.WCS.Mobox3.pinggao.models.SapRoot.GYSDto; |
| | | using System.Web.Services.Protocols; |
| | | using System.Web.Http.ValueProviders; |
| | | |
| | | namespace HH.WCS.Mobox3.pinggao.api |
| | | { |
| | |
| | | using (var db = new SqlHelper<object>().GetInstance()) |
| | | { |
| | | var locinfo = db.Queryable<Location>().Where(a => a.S_CODE == model.start).First(); |
| | | |
| | | if (locinfo?.N_LOCK_STATE != 0) |
| | | { |
| | | result.resultCode = 3; |
| | |
| | | } |
| | | |
| | | } |
| | | /// <summary> |
| | | /// 分拣 |
| | | /// </summary> |
| | | /// <param name="model"></param> |
| | | /// <returns></returns> |
| | | internal static async Task<SimpleResult> KtSorting(KtSorting model) |
| | | { |
| | | |
| | | var result = new SimpleResult(); |
| | | |
| | | // var db = new SqlHelper<object>().GetInstance(); |
| | | |
| | | using (var db = new SqlHelper<object>().GetInstance()) |
| | | { |
| | | try |
| | | { |
| | | |
| | | |
| | | result.resultMsg = "成功"; |
| | | result.resultCode = 0; |
| | | var locinfo = db.Queryable<Location>().Where(a => a.S_CODE == model.start).First(); |
| | | |
| | | if (locinfo?.N_LOCK_STATE != 0) |
| | | { |
| | | result.resultCode = 3; |
| | | result.resultMsg = $"起始库位已锁/不存在"; |
| | | return result; |
| | | } |
| | | //判断托盘是否已经生成任务,如果没有则生成 |
| | | var wmsTaskcs = WMSHelper.GetWmsTaskByCntr(model.cntr_code); |
| | | if (wmsTaskcs != null) |
| | | { |
| | | result.resultCode = 3; |
| | | result.resultMsg = $"起点{model.start} 托盘{model.cntr_code}已经创建任务,请勿重复申请"; |
| | | return result; |
| | | } |
| | | //出库 |
| | | if (model.Type==2) |
| | | { |
| | | Location start = new Location(); |
| | | if (!string.IsNullOrEmpty(model.cntr_code)) |
| | | { |
| | | var loc= db.Queryable<LocCntrRel>().Where(it => it.S_CNTR_CODE == model.cntr_code).First(); |
| | | |
| | | |
| | | if (loc==null) |
| | | { |
| | | LogHelper.Info($"容器{model.cntr_code}找不到对应货位"); |
| | | result.resultMsg = $"容器{model.cntr_code}找不到对应货位"; |
| | | result.resultCode = 1; |
| | | return result; |
| | | } |
| | | else |
| | | { |
| | | start= db.Queryable<Location>().Where(it => it.S_CODE == loc.S_LOC_CODE).First(); |
| | | } |
| | | } |
| | | else |
| | | { |
| | | #region MyRegion |
| | | //var list = db.Queryable<CntrItemRel>().Select(s => s.S_CNTR_CODE).ToArray(); |
| | | //var S_LOC_CODElist = db.Queryable<LocCntrRel>().Where(s=>!list.Contains(s.S_CNTR_CODE)).Select(s=>s.S_LOC_CODE).ToArray(); |
| | | //start = db.Queryable<Location>().Where(it => S_LOC_CODElist.Contains(it.S_CODE)).First(); |
| | | |
| | | //// 获取所有被占用的容器编码 |
| | | //var usedContainerCodes = db.Queryable<CntrItemRel>().Select(s => s.S_CNTR_CODE).ToList(); |
| | | |
| | | //// 获取未被占用的容器对应的货位编码 |
| | | //var availableLocationCodes = db.Queryable<LocCntrRel>() |
| | | // .Where(s => !usedContainerCodes.Contains(s.S_CNTR_CODE)) |
| | | // .Select(s => s.S_LOC_CODE) |
| | | // .ToList(); |
| | | |
| | | //// 获取第一个可用货位(如果没有则返回null) |
| | | //var startLocation = db.Queryable<Location>() |
| | | // .Where(it => availableLocationCodes.Contains(it.S_CODE)) |
| | | // .ToList().FirstOrDefault(); |
| | | |
| | | |
| | | #endregion |
| | | start = db.Queryable<LocCntrRel>() |
| | | .LeftJoin<CntrItemRel>((lcr, cir) => lcr.S_CNTR_CODE == cir.S_CNTR_CODE) |
| | | .Where((lcr, cir) => cir.S_CNTR_CODE == null) // 找出未被占用的容器 |
| | | .LeftJoin<Location>((lcr, cir, loc) => lcr.S_LOC_CODE == loc.S_CODE&&loc.S_AREA_CODE== "HJQ") |
| | | .Select((lcr, cir, loc) => loc).ToList() // 返回 Location 对象 |
| | | .FirstOrDefault(); // 或者 Take(1).ToList()[0] |
| | | } |
| | | if (start==null) |
| | | { |
| | | LogHelper.Info($"{model.cntr_code}未找到可用货位"); |
| | | result.resultMsg = $"{model.cntr_code}未找到可用货位"; |
| | | result.resultCode = 1; |
| | | return result; |
| | | } |
| | | //库位信息 |
| | | |
| | | var endinfo = db.Queryable<Location>().Where(it => it.S_CODE == model.start).First(); |
| | | var wmsTask = new WMSTask |
| | | { |
| | | S_CNTR_CODE = model.cntr_code, |
| | | S_CODE = WMSHelper.GenerateTaskNo(), |
| | | S_START_LOC = start.S_CODE, |
| | | S_START_AREA = start.S_AREA_CODE, |
| | | S_START_WH = start.S_WH_CODE, |
| | | S_END_LOC = endinfo.S_CODE, |
| | | S_END_AREA = endinfo.S_AREA_CODE, |
| | | S_END_WH = endinfo.S_WH_CODE, |
| | | |
| | | N_TYPE = 2, |
| | | // S_TYPE = WMSTask.GetTypeStr(1), |
| | | S_TYPE = "出库空托盘", |
| | | S_OP_DEF_CODE = "", |
| | | S_OP_DEF_NAME = "pda出库" |
| | | }; |
| | | if (WMSHelper.CreateWmsTask(wmsTask)) |
| | | { |
| | | LocationHelper.LockLoc(start.S_CODE, 1); |
| | | result.resultMsg = $"创建作业成功,作业号{wmsTask.S_CODE}"; |
| | | } |
| | | |
| | | |
| | | } |
| | | else //入库 |
| | | { |
| | | Location end = new Location(); |
| | | if (!string.IsNullOrEmpty(model.cntr_code)) |
| | | { |
| | | #region MyRegion |
| | | //var list = db.Queryable<CntrItemRel>().Select(s => s.S_CNTR_CODE).ToArray(); |
| | | //var S_LOC_CODElist = db.Queryable<LocCntrRel>().Where(s=>!list.Contains(s.S_CNTR_CODE)).Select(s=>s.S_LOC_CODE).ToArray(); |
| | | //start = db.Queryable<Location>().Where(it => S_LOC_CODElist.Contains(it.S_CODE)).First(); |
| | | |
| | | //// 获取所有被占用的容器编码 |
| | | //var usedContainerCodes = db.Queryable<CntrItemRel>().Select(s => s.S_CNTR_CODE).ToList(); |
| | | |
| | | // 获取未被占用的容器对应的货位编码 |
| | | var availableLocationCodes = db.Queryable<LocCntrRel>() |
| | | .Select(s => s.S_LOC_CODE) |
| | | .ToList(); |
| | | |
| | | // 获取第一个可用货位(如果没有则返回null) |
| | | end = db.Queryable<Location>() |
| | | .Where(it => !availableLocationCodes.Contains(it.S_CODE)&&it.S_AREA_CODE== "HJQ") |
| | | .ToList().FirstOrDefault(); |
| | | |
| | | |
| | | #endregion |
| | | } |
| | | else |
| | | { |
| | | LogHelper.Info($"入库 容器{model.cntr_code}不能为空"); |
| | | result.resultMsg = $"入库 容器{model.cntr_code}不能为空"; |
| | | result.resultCode = 1; |
| | | return result; |
| | | |
| | | } |
| | | if (end==null) |
| | | { |
| | | LogHelper.Info($"{model.cntr_code}未找到可用货位"); |
| | | result.resultMsg = $"{model.cntr_code}未找到可用货位"; |
| | | result.resultCode = 1; |
| | | return result; |
| | | } |
| | | var sart = db.Queryable<Location>().Where(it => it.S_CODE == model.start).First(); |
| | | var wmsTask = new WMSTask |
| | | { |
| | | S_CNTR_CODE = model.cntr_code, |
| | | S_CODE = WMSHelper.GenerateTaskNo(), |
| | | S_START_LOC = sart.S_CODE, |
| | | S_START_AREA = sart.S_AREA_CODE, |
| | | S_START_WH = sart.S_WH_CODE, |
| | | S_END_LOC = end.S_CODE, |
| | | S_END_AREA = end.S_AREA_CODE, |
| | | S_END_WH = end.S_WH_CODE, |
| | | |
| | | N_TYPE = 1, |
| | | // S_TYPE = WMSTask.GetTypeStr(1), |
| | | S_TYPE = "入库空托盘", |
| | | S_OP_DEF_CODE = "", |
| | | S_OP_DEF_NAME = "pda入库" |
| | | }; |
| | | if (WMSHelper.CreateWmsTask(wmsTask)) |
| | | { |
| | | LocationHelper.LockLoc(end.S_CODE, 1); |
| | | result.resultMsg = $"创建作业成功,作业号{wmsTask.S_CODE}"; |
| | | } |
| | | |
| | | } |
| | | //通用接口 对容器货品的删减 和生成回库单 都要用的接口 |
| | | |
| | | return result; |
| | | |
| | | } |
| | | catch (Exception e) |
| | | { |
| | | result.resultMsg = e.Message; |
| | | db.RollbackTran(); |
| | | return result; |
| | | throw; |
| | | } |
| | | } |
| | | |
| | | } |
| | | /// <summary> |
| | | /// 分拣 |
| | | /// </summary> |
| | |
| | | return result; |
| | | |
| | | } |
| | | |
| | | LogHelper.Info($"S_OUT_TYPE{po.S_OUT_TYPE}"); |
| | | //根据不同出库类型 回调sap |
| | | if (po.S_OUT_TYPE == "冲销出库") |
| | | { |
| | |
| | | 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, model.start); |
| | | } |
| | | else if (po.S_OUT_TYPE == "计划外发料出库") |
| | |
| | | if (string.IsNullOrEmpty(po.S_WH_CODE)) |
| | | { |
| | | S_WH_CODE = util.Settings.WHCode; |
| | | } |
| | | } |
| | | else |
| | | { |
| | | S_WH_CODE = po.S_WH_CODE; |
| | | } |
| | | if (string.IsNullOrEmpty(po.S_AREA_CODE)) |
| | | { |
| | | S_AREA_CODE = util.Settings.AREACode; |
| | | } |
| | | model.MaterList.ForEach(a => |
| | | else |
| | | { |
| | | LogHelper.Info($"填充数据{util.Settings.WHCode}"); |
| | | LogHelper.Info($"减仓库量{util.Settings.AREACode}表数据 仓库{po.S_WH_CODE} 物料编码{a.item_code} 物料名称 数量{a.qty}"); |
| | | req.item_info.Add(new AddChangeModel.itemModel |
| | | S_AREA_CODE = po.S_AREA_CODE; |
| | | } |
| | | model.MaterList.ForEach(a => |
| | | { |
| | | wh_code = S_WH_CODE, |
| | | item_code = a.item_code, |
| | | item_name = "", |
| | | qty = a.qty |
| | | LogHelper.Info($"填充数据{util.Settings.WHCode}"); |
| | | LogHelper.Info($"减仓库量{util.Settings.AREACode}表数据 仓库{po.S_WH_CODE} 物料编码{a.item_code} 物料名称 数量{a.qty}"); |
| | | req.item_info.Add(new AddChangeModel.itemModel |
| | | { |
| | | wh_code = S_WH_CODE, |
| | | item_code = a.item_code, |
| | | item_name = "", |
| | | qty = a.qty |
| | | }); |
| | | LogHelper.Info($"减库区量表数据 库区{po.S_AREA_CODE} 物料编码{a.item_code} 物料名称 数量{a.qty}"); |
| | | req2.item_info.Add(new AddChangeModel.itemModel |
| | | { |
| | | wh_code = S_WH_CODE, |
| | | area_code = S_AREA_CODE, |
| | | item_code = a.item_code, |
| | | item_name = "", |
| | | qty = a.qty |
| | | }); |
| | | }); |
| | | LogHelper.Info($"减库区量表数据 库区{po.S_AREA_CODE} 物料编码{a.item_code} 物料名称 数量{a.qty}"); |
| | | req2.item_info.Add(new AddChangeModel.itemModel |
| | | { |
| | | wh_code = S_WH_CODE, |
| | | area_code = S_AREA_CODE, |
| | | item_code = a.item_code, |
| | | item_name = "", |
| | | qty = a.qty |
| | | }); |
| | | }); |
| | | var reqData = JsonConvert.SerializeObject(req); |
| | | var AppKey = Settings.AppKey; |
| | | var AppSecret = Settings.AppSecret; |
| | |
| | | var po = db.Queryable<TN_Outbound_Order>().Includes(s => s.Details).Where(a => a.S_NO == arrival_no).First(); |
| | | string GZRQ = ""; |
| | | string PZZDRQ = ""; |
| | | if (po.BUDAT != null) |
| | | { |
| | | GZRQ = DateTime.Parse(po.BUDAT.ToString()).ToString("yyyyMMdd"); |
| | | } |
| | | if (po.BLDAT != null) |
| | | { |
| | | PZZDRQ = DateTime.Parse(po.BLDAT.ToString()).ToString("yyyyMMdd"); |
| | | //if (po.Details[0].S_CJRQ != null) |
| | | //{ |
| | | // GZRQ = DateTime.Parse(po.Details[0].S_CJRQ.ToString()).ToString("yyyyMMdd"); |
| | | //} |
| | | //if (po.Details[0].S_XQRQ != null) |
| | | //{ |
| | | // PZZDRQ = DateTime.Parse(po.Details[0].S_XQRQ.ToString()).ToString("yyyyMMdd"); |
| | | |
| | | } |
| | | //} |
| | | CkBcakDto.Root myRoot = new CkBcakDto.Root |
| | | { |
| | | ROOT = new CkBcakDto.ROOT |
| | |
| | | WLPZ = new CkBcakDto.WLPZ |
| | | { |
| | | KEY = po.S_NO, |
| | | ZYWLX = "业务类型值", |
| | | PZRQ = PZZDRQ, |
| | | GZRQ = GZRQ, // 假设日期格式为"年-月-日" |
| | | GZRY = po.UNAME, |
| | | ZYWLX = "2", |
| | | PZRQ = DateTime.Now.ToString("yyyyMMdd"), |
| | | GZRQ =DateTime.Now.ToString("yyyyMMdd"), // 假设日期格式为"年-月-日" |
| | | GZRY = po.S_CREATOR_NAME, |
| | | ITEM = new List<CkBcakDto.ITEM> |
| | | { |
| | | } |
| | |
| | | //var serialNos = string.Join(",", CntrItemRels |
| | | // .Where(s => s.S_ITEM_CODE == item.item_code) |
| | | // .Select(s => s.S_SERIAL_NO)); |
| | | listitem1.XLH = podetail?.S_SERIAL_NO.Split(',').ToList(); |
| | | listitem1.XLH = podetail?.S_SERIAL_NO==null?null: podetail?.S_SERIAL_NO.Split(',').ToList(); |
| | | //foreach (var xlhValue in xlhValues) |
| | | //{ |
| | | // CkBcakDto.ITEM1 newItem = new CkBcakDto.ITEM1 { XLH = xlhValue }; |
| | |
| | | iTEMs.Add(ckbitem); |
| | | } |
| | | myRoot.ROOT.WLPZ.ITEM = iTEMs; |
| | | if (myRoot.ROOT.WLPZ.ITEM.Where(s=>!string.IsNullOrEmpty(s.SCDD) && !string.IsNullOrEmpty(s.YLBH) && !string.IsNullOrEmpty(s.YLXMH)).Count()==0) |
| | | { |
| | | myRoot.ROOT.WLPZ.ZYWLX = "2"; |
| | | } |
| | | //db.Insertable<OutboundRecord>(records).ExecuteCommand(); |
| | | #region wms-sap回调 |
| | | //类转json |
| | |
| | | lLDReturnRoots.MSGDESP = $"物料{a.WLBM}物料主数据不存在该物料"; |
| | | iTEMs.Add(lLDReturnRoots); |
| | | |
| | | continue; |
| | | break ; |
| | | } |
| | | po.Details.Add(new TN_Ll_detail |
| | | { |
| | |
| | | S_ITEM_CODE = a.WLBM, |
| | | S_ITEM_NAME = item.S_ITEM_NAME, |
| | | F_QTY = a.XQSL, |
| | | S_ZJBM = a.ZJBM, |
| | | S_YLBH = a.YLBH, |
| | | S_YLXMH = a.YLHXM, |
| | | S_BATCH_NO = "", |
| | | S_ERP_WH_CODE = a.KCDD, |
| | | S_ZJWLTH = a.ZJWLTH, |
| | | S_ZJWLMS = a.ZJWLMS, |
| | | S_ZHFHBS = a.ZHFHBS, |
| | | S_CJRQ = a.CJRQ, |
| | | S_LLDSCBS = a.LLDSCBS, |
| | | S_SCGLY = a.SCGLY, |
| | | S_GXH = a.GXH, |
| | | S_XQRQ = a.XQRQ, |
| | | N_ITEM_STATE = 1 |
| | | }); |
| | | } |
| | | |
| | | var result1 = db.Insertable<TN_Ll_Order>(po).ExecuteCommand() > 0; |
| | | db.Insertable<TN_Ll_detail>(po.Details).ExecuteCommand(); |
| | | if (po.Details.Count()>0) |
| | | { |
| | | var result1 = db.Insertable<TN_Ll_Order>(po).ExecuteCommand() > 0; |
| | | db.Insertable<TN_Ll_detail>(po.Details).ExecuteCommand(); |
| | | } |
| | | |
| | | } |
| | | } |
| | |
| | | lLDReturnRoots.MSGCODE = 1; |
| | | lLDReturnRoots.MSGDESP = $"执行中领料单,物料{a.WLBM}物料不允许删除"; |
| | | iTEMs.Add(lLDReturnRoots); |
| | | continue; |
| | | break; |
| | | } |
| | | var po1 = po.Details.Where(s => a.WLBM == s.S_ITEM_CODE).ToList(); |
| | | if (po1.Count() == 0) //无则新增物料明细 |
| | |
| | | lLDReturnRoots.MSGCODE = 1; |
| | | lLDReturnRoots.MSGDESP = $"物料{a.WLBM}物料主数据不存在该物料"; |
| | | iTEMs.Add(lLDReturnRoots); |
| | | continue; |
| | | break; |
| | | } |
| | | TN_Ll_detail tN_Outbound_Detail = new TN_Ll_detail |
| | | { |
| | |
| | | S_ITEM_CODE = a.WLBM, |
| | | S_ITEM_NAME = item.S_ITEM_NAME, |
| | | F_QTY = a.XQSL, |
| | | S_ZJBM = a.ZJBM, |
| | | S_YLBH = a.YLBH, |
| | | S_YLXMH = a.YLHXM, |
| | | S_ZJWLTH = a.ZJWLTH, |
| | | S_ZJWLMS = a.ZJWLMS, |
| | | S_ZHFHBS = a.ZHFHBS, |
| | | S_CJRQ = a.CJRQ, |
| | | S_LLDSCBS = a.LLDSCBS, |
| | | S_GXH = a.GXH, |
| | | S_XQRQ = a.XQRQ, |
| | | S_SCGLY = a.SCGLY, |
| | | S_BATCH_NO = "无", |
| | | S_ERP_WH_CODE = a.KCDD, |
| | | N_ITEM_STATE = 1 |
| | |
| | | lLDReturnRoots.MSGCODE = 1; |
| | | lLDReturnRoots.MSGDESP = $"更新失败,更新数量必须大于当前物料数量{a.WLBM}"; |
| | | iTEMs.Add(lLDReturnRoots); |
| | | continue; |
| | | break; |
| | | } |
| | | } |
| | | } |
| | |
| | | lLDReturnRoots.MSGCODE = 1; |
| | | lLDReturnRoots.MSGDESP = $"物料{a.WLBM}物料数据不存在 无法删除"; |
| | | iTEMs.Add(lLDReturnRoots); |
| | | continue; |
| | | break; |
| | | } |
| | | } |
| | | else |
| | |
| | | lLDReturnRoots.MSGCODE = 1; |
| | | lLDReturnRoots.MSGDESP = $"物料{a.WLBM}物料主数据不存在该物料"; |
| | | iTEMs.Add(lLDReturnRoots); |
| | | continue; |
| | | break; |
| | | } |
| | | TN_Ll_detail tN_Outbound_Detail = new TN_Ll_detail |
| | | { |
| | |
| | | S_ITEM_CODE = a.WLBM, |
| | | S_ITEM_NAME = item.S_ITEM_NAME, |
| | | F_QTY = a.XQSL, |
| | | S_ZJBM = a.ZJBM, |
| | | S_YLBH = a.YLBH, |
| | | S_YLXMH = a.YLHXM, |
| | | S_ZJWLTH = a.ZJWLTH, |
| | | S_ZJWLMS = a.ZJWLMS, |
| | | S_ZHFHBS = a.ZHFHBS, |
| | | S_CJRQ = a.CJRQ, |
| | | S_LLDSCBS = a.LLDSCBS, |
| | | S_SCGLY = a.SCGLY, |
| | | S_GXH = a.GXH, |
| | | S_XQRQ = a.XQRQ, |
| | | S_BATCH_NO = "无", |
| | | S_ERP_WH_CODE = a.KCDD, |
| | | N_ITEM_STATE = 1 |
| | |
| | | db.Insertable<TN_Ll_detail>(listtn).ExecuteCommand(); |
| | | } |
| | | } |
| | | |
| | | |
| | | lLDReturnRoots.GC = itemscddll.GC; |
| | | lLDReturnRoots.LLDH = itemscddll.LLDH; |
| | | lLDReturnRoots.MSGCODE = 0; |
| | | lLDReturnRoots.MSGDESP = $"成功"; |
| | | iTEMs.Add(lLDReturnRoots); |
| | | db.CommitTran(); |
| | | } |
| | | |
| | |
| | | S_BATCH_NO = a.S_BATCH_NO, |
| | | S_SERIAL_NO = a.S_SERIAL_NO, |
| | | S_CGPZH = a.S_CGPZH, |
| | | S_ZJBM = a.S_ZJBM, |
| | | S_YLBH = a.S_YLBH, |
| | | S_ZJWLTH = a.S_ZJWLTH, |
| | | S_ZJWLMS = a.S_ZJWLMS, |
| | | S_ZHFHBS = a.S_ZHFHBS, |
| | | S_CJRQ = a.S_CJRQ, |
| | | S_LLDSCBS = a.S_LLDSCBS, |
| | | S_SCGLY = a.S_SCGLY, |
| | | S_GXH = a.S_GXH, |
| | | S_XQRQ = a.S_XQRQ, |
| | | S_YLXMH = a.S_YLXMH, |
| | | S_CGPZXMBH = a.S_CGPZXMBH, |
| | | S_ERP_WH_CODE = a.S_ERP_WH_CODE, |
| | | N_ITEM_STATE = a.N_ITEM_STATE |