.vs/HH.WCS.Mobox3.DSZSH/FileContentIndex/5c57b4d0-dbd7-49e3-9f10-3d5a4d6dc3f3.vsidxBinary files differ
.vs/HH.WCS.Mobox3.DSZSH/FileContentIndex/7b1f7e4e-45eb-4263-a455-827cb67bccfe.vsidxBinary files differ
.vs/HH.WCS.Mobox3.DSZSH/FileContentIndex/ab784fdf-fa93-4eaa-9449-8122428bc0ae.vsidxBinary files differ
Controllers/DebugController.cs
@@ -29,37 +29,15 @@ { return DebugService.AgvSeriesReports(model); } /// <summary> /// 初始化数据库 /// </summary> /// <returns></returns> [HttpPost] [Route("CreateDatabase")] public string CreateDatabase() { return DebugService.CreateDatabase(); } [HttpPost] [Route("InsertLocation")] public string InsertLocation(InsertLocationInfo model) { try { var db = DbHelper.GetDbClient(); var locList = new List<TN_Location>(); locList.Add(new TN_Location { S_AREA_CODE = model.AreaCode, S_CODE = model.Code}); if (db.Insertable<TN_Location>(locList).ExecuteCommand() <= 0) { return "失败"; } } catch (Exception ex) { LogHelper.Info($"发生了异常"); return "添加货位错误" + ex.Message; } //return res ? "成功" : "失败"; return "成功"; public string CreateDatabase(CoverInfo model) { return DebugService.CreateDatabase(model.IsCover); } /// <summary> @@ -71,22 +49,5 @@ public string InsertLocCntrCg() { return DebugService.InsertLocCntrCg(); } } public class CgInfo { public string ItemCode { get; set; } public string CntId { get; set; } public string LocId { get; set; } } public class InsertLocationInfo { public string Code { set; get; } public string AreaCode { set; get; } } public class UpdateTaskWeightInfo { public string TaskID { set; get; } public float Weight { set; get; } } } Controllers/MesController.cs
New file @@ -0,0 +1,18 @@ using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Web.Http; using HH.WCS.Mobox3.DSZSH.Services; namespace HH.WCS.Mobox3.DSZSH.Controllers { /// <summary> /// MES 调用的接口 /// </summary> [RoutePrefix("api")] public class MesController : ApiController { } } Controllers/MoboxController.cs
@@ -9,7 +9,6 @@ using static HH.WCS.Mobox3.DSZSH.Dtos.Request.MoboxRequest; using static HH.WCS.Mobox3.DSZSH.Dtos.Response.MoboxResponse; using static HH.WCS.Mobox3.DSZSH.Helpers.ResultHelper; namespace HH.WCS.Mobox3.DSZSH.Controllers { /// <summary> @@ -62,30 +61,14 @@ public SimpleResult EmptyInbound(EmptyInboundInfo model) { LogHelper.InfoApi("空托/空箱入库", model); var db = DbHelper.GetDbClient(); var locCntrRel = db.Queryable<TN_Loc_Container>() .Where(lc => lc.S_CNTR_CODE == model.CntrCode).First(); if (locCntrRel == null) { return BuildSimpleResult(-1, $"不存在已绑定容器的货位号:'{model.CnteType}'"); if (model.CntrType == "托盘") { return MoboxService.EmptyInboundPallet(model); } if (locCntrRel.S_CNTR_TYPE == "托盘") { return MoboxService.EmptyInboundPallet(new EmptyInboundDetailInfo { StartLoc = locCntrRel.S_LOC_CODE, CntId = locCntrRel.S_CNTR_TYPE }); } else if (locCntrRel.S_CNTR_TYPE == "好运箱") { return MoboxService.EmptyInboundGoodpack(new EmptyInboundDetailInfo { StartLoc = locCntrRel.S_LOC_CODE, CntId = locCntrRel.S_CNTR_TYPE }); else if (model.CntrType == "好运箱") { return MoboxService.EmptyInboundGoodpack(model); } else { return BuildSimpleResult(-2, $"不合法的容器类型:'{locCntrRel.S_CNTR_CODE}'"); return BuildSimpleResult(-1, $"容器类型 '{model.CntrType}' 不合法:应为 '托盘' 或 '好运箱'"); } } @@ -191,9 +174,7 @@ public SimpleResult RestBack(RestBackInfo model) { return MoboxService.RestBack(model); } #endregion #region Mobox 接口 /// <summary> /// 成品胶出库(PDA) /// </summary> @@ -203,12 +184,17 @@ [Route("finished-outbound")] public SimpleResult FinishedOutbound(FinishedOutboundInfo model) { LogHelper.InfoApi("成品胶出库(PDA)", model); if (model.ForcedOut) { return MoboxService.FinishedOutboundForce(model); } return MoboxService.FinishedOutbound(model); else { return MoboxService.FinishedOutbound(model); } } #endregion #region Mobox 接口 /// <summary> /// 抽检-创建抽检单(WMS) /// </summary> Controllers/WmsController.cs
@@ -1,7 +1,12 @@ using HH.WCS.Mobox3.DSZSH.AppStart; using HH.WCS.Mobox3.DSZSH.Services; using Newtonsoft.Json; using System.Collections.Generic; using System.Web.Http; using static HH.WCS.Mobox3.DSZSH.Dtos.Request.WmsRequest; using static HH.WCS.Mobox3.DSZSH.Dtos.Response.WmsResponse; namespace HH.WCS.Mobox3.DSZSH.Controllers { @@ -9,8 +14,16 @@ /// 第三方调用的接口 /// </summary> [RoutePrefix("api")] public class WmsController : ApiController { public class WMSController : ApiController { /// <summary> /// 博实物料信息下发同步(MES) /// </summary> /// <param name="model"></param> /// <returns></returns> [HttpPost] //[Route("WMS/CgInfoSync")] public WmsResult CgInfoSync(CgInfoSyncInfo model) { return WmsService.CgInfoSync(model); } } } Dtos/Request/AgvRequest.cs
@@ -10,14 +10,25 @@ /// HostToAGV 上报任务状态 /// </summary> public class AgvTaskState { /// <summary> /// AGV 回报状态号 /// </summary> public int state { get; set; } /// <summary> /// 任务号 /// </summary> public string task_no { get; set; } /// <summary> /// AGV 车号 /// </summary> public string forklift_no { get; set; } /// <summary> /// 安全门编号 /// </summary> public string lock_no { get; set; } /// <summary> /// 附加信息 /// </summary> public string ext_data { get; set; } } Dtos/Request/DebugRequest.cs
@@ -25,5 +25,9 @@ /// </summary> public int NextState { set; get; } } public class CoverInfo { public bool IsCover { set; get; } = true; } } } Dtos/Request/MoboxRequest.cs
@@ -13,20 +13,17 @@ /// <summary> /// 物料编码 /// </summary> [JsonProperty("s_item_code")] public string ItemCode { get; set; } ///// <summary> ///// 物料名称 ///// </summary> // //[JsonProperty("item_name")] //public string ItemName { get; set; } /// <summary> /// 批次号 /// </summary> [JsonProperty("s_batch_no")] [JsonProperty("s_batch")] public string BatchNo { get; set; } /// <summary> /// 物料规格 @@ -39,7 +36,7 @@ [JsonProperty("n_num")] public int Qty { get; set; } /// <summary> /// 货位信息 /// 起点货位信息 /// </summary> [JsonProperty("s_start_loc")] public string StartLoc { get; set; } @@ -117,12 +114,17 @@ /// 容器类型 /// </summary> [JsonProperty("cntr_type")] public string CnteType { get; set; } public string CntrType { get; set; } /// <summary> /// 终点库区编码 /// </summary> [JsonProperty("end_area")] public string EndArea { get; set; } /// <summary> /// 起点货位 /// </summary> [JsonProperty("start_loc")] public string StartLoc { get; set; } } public class EmptyInboundDetailInfo : StartCntInfo { } @@ -220,7 +222,9 @@ [JsonProperty("end_area")] public string EndArea { get; set; } } /// <summary> /// 抽检-合格回库(PDA) 数据类 /// </summary> public class QualifiedBackInfo { /// <summary> /// 物料编码 @@ -256,13 +260,11 @@ /// <summary> /// 物料编码 /// </summary> [JsonProperty("item_code")] public string ItemCode { get; set; } ///// <summary> ///// 物料名称 ///// </summary> // //[JsonProperty("item_name")] //public string ItemName { get; set; } /// <summary> @@ -273,7 +275,6 @@ /// <summary> /// 批次号 /// </summary> [JsonProperty("batch_no")] public string BatchNo { get; set; } /// <summary> @@ -284,20 +285,16 @@ /// <summary> /// 容器类型 /// </summary> [JsonProperty("cntr_type")] public string CntrType { get; set; } /// <summary> /// 出库终点货区 /// </summary> [JsonProperty("end_area")] public string EndArea { get; set; } /// <summary> /// 是否强制出库 /// </summary> [JsonProperty("force_out")] public bool ForcedOut { get; set; } } Dtos/Request/WmsRequest.cs
New file @@ -0,0 +1,52 @@ using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using Newtonsoft.Json; namespace HH.WCS.Mobox3.DSZSH.Dtos.Request { public class WmsRequest { /// <summary> /// 物料信息下发同步 数据类 /// </summary> public class CgInfoSyncInfo { /// <summary> /// 物料名称 /// </summary> [JsonProperty("itemName")] public string ItemName { get; set; } /// <summary> /// 产品牌号 /// </summary> [JsonProperty("itemCode")] public string ItemCode { get; set; } /// <summary> /// 批次号 /// </summary> [JsonProperty("batchNo")] public string BatchNo { get; set; } /// <summary> /// 执行标准 /// </summary> [JsonProperty("standard")] public string Standard { get; set; } /// <summary> /// 净含量 /// </summary> [JsonProperty("netWeight")] public string NetWeight { get; set; } /// <summary> /// 质量等级 /// </summary> [JsonProperty("qualityGrade")] public string QualityGrade { get; set; } } } } Dtos/Response/MoboxResponse.cs
@@ -24,6 +24,34 @@ } /// <summary> /// 构建 <see cref="SimpleResult"/> 返回值,选择打印日志信息(默认打印) /// </summary> /// <param name="code"></param> /// <param name="message"></param> /// <param name="pringLog"></param> /// <returns></returns> public static SimpleResult BuildSimpleResult(int code, string message, bool pringLog = true) { if (pringLog) { LogHelper.Info(message); } return new SimpleResult { Code = code, Message = message }; } /// <summary> /// 构建 <see cref="SimpleResult"/> 异常返回值,选择打印异常日志信息(默认打印) /// </summary> /// <param name="ex"></param> /// <param name="exCode"></param> /// <param name="pringLog"></param> /// <returns></returns> public static SimpleResult BuildSimpleEx(Exception ex, int exCode = 1, bool pringLog = true) { if (pringLog) { LogHelper.InfoEx(ex); } return new SimpleResult { Code = exCode, Message = ex.Message }; } /// <summary> /// mobox 取消任务、标记完成任务 /// </summary> public class MoboxTaskBase { Dtos/Response/WmsResponse.cs
New file @@ -0,0 +1,45 @@ using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using Newtonsoft.Json; namespace HH.WCS.Mobox3.DSZSH.Dtos.Response { public class WmsResponse { /// <summary> /// MES API 响应结果类 /// </summary> public class WmsResult { /// <summary> /// 接口调用结果 1-成功 0-失败 /// </summary> [JsonProperty("result")] public int Result { get; set; } /// <summary> /// 是否成功 True-成功,False:失败 /// </summary> [JsonProperty("success")] public bool Success { get; set; } /// <summary> /// 这里是string类型,对结果的描述 /// </summary> [JsonProperty("data")] public string Data { get; set; } } public static WmsResult MesResultBuilder(int code, string message = "", bool printLog = true) { if (printLog && string.IsNullOrEmpty(message)) { LogHelper.Info(message); } return new WmsResult { Result = code, Success = code == 0, // 仅当code=0时,success=true Data = message, }; } } } HH.WCS.Mobox3.DSZSH.csproj
@@ -235,16 +235,18 @@ <Compile Include="Consts\TaskName.cs" /> <Compile Include="Controllers\DebugController.cs" /> <Compile Include="Controllers\ErpController.cs" /> <Compile Include="Controllers\MesController.cs" /> <Compile Include="Controllers\MoboxController.cs" /> <Compile Include="Controllers\AgvController.cs" /> <Compile Include="App_Start\SwaggerControllerDescProvider.cs" /> <Compile Include="Dtos\Request\WmsRequest.cs" /> <Compile Include="Dtos\Response\WmsResponse.cs" /> <Compile Include="Models\DebugModel.cs" /> <Compile Include="Dtos\Request\DebugRequest.cs" /> <Compile Include="Dtos\Response\DebugResponse.cs" /> <Compile Include="Helpers\AgvHelper.cs" /> <Compile Include="Helpers\ExprHelper.cs" /> <Compile Include="Helpers\PathHelper.cs" /> <Compile Include="Helpers\ResultHelper.cs" /> <Compile Include="Helpers\DbHelper.cs" /> <Compile Include="Models\TN_CNTR_ITEM.cs" /> <Compile Include="Models\TN_Check_Detail.cs" /> @@ -256,6 +258,7 @@ <Compile Include="Models\TN_Shift_Detail.cs" /> <Compile Include="Models\TN_Shift_Order.cs" /> <Compile Include="ServiceCore\CheckCore.cs" /> <Compile Include="ServiceCore\DebugCore.cs" /> <Compile Include="ServiceCore\OutboundCore.cs" /> <Compile Include="ServiceCore\ShiftCore.cs" /> <Compile Include="Services\DebugService.cs" /> @@ -286,10 +289,11 @@ <Compile Include="Models\TN_Task_Action.cs" /> <Compile Include="Helpers\DeviceProcess.cs" /> <Compile Include="ServiceCore\TaskCore.cs" /> <Compile Include="Controllers\WmsController.cs" /> <Compile Include="Controllers\WMSController.cs" /> <Compile Include="Dispatch\HostToAGV.cs" /> <Compile Include="Helpers\TaskHelper.cs" /> <Compile Include="Services\AgvService.cs" /> <Compile Include="Services\WmsService.cs" /> <Compile Include="Services\MoboxService.cs" /> <Compile Include="Helpers\LogHelper.cs" /> <Compile Include="Helpers\ContainerHelper.cs" /> @@ -331,8 +335,6 @@ <Install>false</Install> </BootstrapperPackage> </ItemGroup> <ItemGroup> <Folder Include="Dtos\Internal\" /> </ItemGroup> <ItemGroup /> <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" /> </Project> Helpers/ResultHelper.cs
File was deleted Helpers/TaskHelper.cs
@@ -12,7 +12,6 @@ using SqlSugar; using static HH.WCS.Mobox3.DSZSH.Dtos.Response.MoboxResponse; using static HH.WCS.Mobox3.DSZSH.Helpers.ResultHelper; namespace HH.WCS.Mobox3.DSZSH.Helpers { /// <summary> @@ -57,6 +56,8 @@ N_B_STATE = 0, S_CNTR_CODE = cnt, T_START_TIME = DateTime.Now, //T_END_TIME = null, }; var db = DbHelper.GetDbClient(); Models/DebugModel.cs
@@ -7,20 +7,14 @@ namespace HH.WCS.Mobox3.DSZSH.Models { public class DebugModel { public class LocCntrCg { public string Note { get; set; } // 仅用于备注 public string LocCode { get; set; } public string LocArea { get; set; } public string CntrCode { get; set; } public string CntrType { get; set; } public string CgId { get; set; } public string ItemCode { get; set; } public string BatchNo { get; set; } } public class OutboundOrder { public string No { get; set; } public string CgId { get; set; } public string BatchNo { get; set; } public string EndArea { get; set; } public int Qty { get; set; } } } } Models/TN_CG_Detail.cs
@@ -9,7 +9,7 @@ /// <summary> /// 料箱商品标识 /// </summary> public string S_CG_ID { get; set; } = ""; public string S_CG_ID { get; set; } = string.Empty; // 暂时用不到,默认为空 /// <summary> /// 物料编码 @@ -17,9 +17,9 @@ public string S_ITEM_CODE { get; set; } /// <summary> /// 物料规格 /// 物料名称 /// </summary> public string S_SPE { get; set; } public string S_ITEM_NAME { get; set; } = string.Empty; /// <summary> /// 容器编码 @@ -44,6 +44,31 @@ /// <summary> /// 货品数量 /// </summary> public int N_QTY { get; set; } public int N_QTY { get; set; } = 0; /// <summary> /// 物料规格 /// </summary> public string S_SPE { get; set; } = string.Empty; /// <summary> /// 执行标准 /// </summary> public string S_STANDARD { get; set; } = string.Empty; /// <summary> /// 净含量 /// </summary> public string S_NET_WEIGHT { get; set; } = string.Empty; /// <summary> /// 质量等级 /// </summary> public string S_QUALITY_GRADE { get; set; } = string.Empty; /// <summary> /// 产线号 /// </summary> public int N_PRODUCT_LINE { get; set; } = 0; // NOTE 后续MES可能会提供,先创建 } } Models/TN_Outbound_Detail.cs
@@ -31,7 +31,7 @@ /// <summary> /// 出库货品数量(整数,用于生成任务数) /// </summary> public int N_QTY { get; set; } public int N_COUNT { get; set; } /// <summary> /// 终点库区(由WMS下发任务时指定) Models/TN_Outbound_Order.cs
@@ -26,11 +26,13 @@ /// <summary> /// 批次号 /// </summary> public string S_BATCH_NO { get; set; } public string S_BATCH { get; set; } /// <summary> /// 出库数量 /// </summary> public int N_END_NUM { get; set; } public float F_QTY { get; set; } public float F_OUT_QTY { get; set; } //public float F_OUT_QTY { get; set; } /// <summary> /// 终点库区(由WMS下发任务时指定) Models/TN_Shift_Detail.cs
@@ -6,6 +6,9 @@ using System.Threading.Tasks; namespace HH.WCS.Mobox3.DSZSH.Models { /// <summary> /// 移库单明细 /// </summary> internal class TN_Shift_Detail : BaseModel { public string S_NO { get; set; } public string S_ITEM_CODE { get; set; } Models/TN_Task.cs
@@ -46,10 +46,11 @@ /// <summary> /// 完成时间 /// </summary> [SugarColumn(IsNullable = true)] public DateTime? T_END_TIME { get; set; } /// <summary> /// AGV 车号 /// AGV 车号 /// </summary> public string S_EQ_NO { get; set; } Program.cs
@@ -129,7 +129,7 @@ //tasks.Add(GetTask(CheckCore.CheckOrderState)); //tasks.Add(GetTask(OutboundCore.CheckOrderState)); tasks.Add(GetTask(OutboundCore.CheckOrderState)); // 添加任务推送线程 ServiceCore/DebugCore.cs
New file @@ -0,0 +1,11 @@ using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace HH.WCS.Mobox3.DSZSH.ServiceCore { public class DebugCore { } } Services/DebugService.cs
@@ -76,7 +76,6 @@ return returnResults; } /// <summary> /// 初始数据库建立 /// </summary> @@ -175,16 +174,6 @@ loc = newLoc; } //if (loc.N_CURRENT_NUM == 0) { // loc.N_CURRENT_NUM = 1; // if (db.Updateable<TN_Location>(loc).UpdateColumns( // it => new { it.N_CURRENT_NUM, it.T_MODIFY }).ExecuteCommand() <= 0) { // tran.RollbackTran(); // LogHelper.Info($"修改位置{locCntrCg.LocCode}失败"); // continue; // } //} if (string.IsNullOrEmpty(locCntrCg.CntrCode)) { LogHelper.Info("容器号为空,不再读取后面的数据"); continue; @@ -210,23 +199,23 @@ } } if (string.IsNullOrEmpty(locCntrCg.CgId)) { if (string.IsNullOrEmpty(locCntrCg.ItemCode)) { LogHelper.Info("物料号为空,不再读取后面的数据"); continue; } var cgDetail = db.Queryable<TN_CG_Detail>().First(a => a.S_CNTR_CODE == locCntrCg.CntrCode && a.S_ITEM_CODE == locCntrCg.CgId); && a.S_ITEM_CODE == locCntrCg.ItemCode); if (cgDetail == null) { var locList = new List<TN_CG_Detail>(); locList.Add(new TN_CG_Detail { S_CNTR_CODE = locCntrCg.CntrCode, S_ITEM_CODE = locCntrCg.CgId, S_BATCH_NO = locCntrCg.BatchNo ?? "" }); locList.Add(new TN_CG_Detail { S_CNTR_CODE = locCntrCg.CntrCode, S_ITEM_CODE = locCntrCg.ItemCode, S_BATCH_NO = locCntrCg.BatchNo ?? "" }); if (db.Insertable<TN_CG_Detail>(locList).ExecuteCommand() <= 0) { tran.RollbackTran(); LogHelper.Info($"插入托盘物料关系{locCntrCg.CntrCode}-{locCntrCg}失败"); return "插入失败"; } } } } tran.CommitTran(); } @@ -240,42 +229,5 @@ return $"Error reading CSV file: {ex.Message}"; } } /// <summary> /// /// </summary> /// <returns></returns> //public string InsertOutboundOrder() { // string filePath = PathHelper.GetProjDir("./debug/outbound_order.csv"); // var db = DbHelper.GetDbClient(); // try { // var configuration = new CsvConfiguration(CultureInfo.InvariantCulture) { // // 配置选项 // Delimiter = ",", // 分隔符 // HasHeaderRecord = true, // 有标题行 // MissingFieldFound = null, // 忽略缺失字段 // HeaderValidated = null, // 跳过标题验证 // BadDataFound = context => { } // 处理错误数据 // }; // var locCntrCgList = new List<DebugModel.OutboundOrder>(); // using (var reader = new StreamReader(filePath)) // using (var csv = new CsvReader(reader, configuration)) { // // 读取记录 // locCntrCgList = csv.GetRecords<DebugModel.OutboundOrder>().ToList(); // } // using (var tran = db.Ado.UseTran()) { // } // } // catch (Exception) { // throw; // } //} } } Services/MoboxService.cs
@@ -13,7 +13,6 @@ using static HH.WCS.Mobox3.DSZSH.Dtos.Request.MoboxRequest; using static HH.WCS.Mobox3.DSZSH.Dtos.Response.MoboxResponse; using static HH.WCS.Mobox3.DSZSH.Helpers.ResultHelper; namespace HH.WCS.Mobox3.DSZSH.Services { public class MoboxService { @@ -30,169 +29,185 @@ var db = DbHelper.GetDbClient(); try { // TODO 将PDA提供的物料编码与贴标机的信息比对 // 将PDA提供的物料编码与贴标机的信息比对 var cgDetail = db.Queryable<TN_CG_Detail>() .Where(d => d.S_ITEM_CODE == model.ItemCode && d.S_BATCH_NO == model.BatchNo) // 指定:物料编码、批次号 .Where(d => d.N_ITEM_STATE == 1 && d.S_ITEM_STATE == "待检") // NOTE 冗余检查:物料状态应该为 1待检 .First(); var startLoc = db.Queryable<TN_Location>() .Where(ExprHelper.LocCode(model.StartLoc)) .Where(ExprHelper.LocIsFree) .Where(ExprHelper.LocIsEmpty.Negate()).First(); if (startLoc == null) { return BuildSimpleResult(2, $"起点位置 '{model.StartLoc}' 不存在或不具备取货要求"); if (cgDetail == null) { return BuildSimpleResult(2, $"PDA扫码物料信息与贴标机传递的信息不一致:" + JsonConvert.SerializeObject(model)); } // 查看容器与起点货位是否绑定 var locCntrRel = db.Queryable<TN_Loc_Container>().First( a => a.S_LOC_CODE == startLoc.S_CODE); if (locCntrRel == null) { return BuildSimpleResult(3, $"起点位置 '{model.StartLoc}' 无可出库的物料"); var startLoc = db.Queryable<TN_Location>() .Where(ExprHelper.LocCode(model.StartLoc)) // 指定:起点货位 .Where(ExprHelper.LocIsFree) //.Where(ExprHelper.LocIsEmpty) .First(); if (startLoc == null) { return BuildSimpleResult(3, $"起点位置 '{model.StartLoc}' 不存在或不具备取货要求"); } // 绑定货位和容器号 var locCntrRel = new TN_Loc_Container { S_LOC_CODE = model.StartLoc, S_CNTR_CODE = cgDetail.S_CNTR_CODE, S_CNTR_TYPE = "好运箱", }; if (db.Insertable<TN_Loc_Container>(locCntrRel).ExecuteCommand() <= 0) { return BuildSimpleResult(4, $"插入货位容器关系失败:" + JsonConvert.SerializeObject(locCntrRel)); } // TODO 满箱入库算法待优化 var endLoc = db.Queryable<TN_Location>() .Where(ExprHelper.LocBelongsToArea(AreaName.满箱存放区)) .Where(ExprHelper.LocIsFree) .Where(ExprHelper.LocIsFree) .Where(ExprHelper.LocIsEmpty) .OrderBy(l => l.N_LAYER) .OrderBy(l => l.S_AREA_CODE).First(); if (endLoc == null) { return BuildSimpleResult(4, "满箱入库暂时没有合适的货位可以入库"); return BuildSimpleResult(5, "满箱入库暂时没有合适的货位可以入库"); } return TaskHelper.SimpleCreateTask(startLoc.S_CODE, locCntrRel.S_CNTR_CODE, endLoc.S_CODE, taskName); return TaskHelper.SimpleCreateTask(startLoc.S_CODE, locCntrRel.S_CNTR_CODE, endLoc.S_CODE, taskName, failCode: 6); } catch (Exception ex) { return BuildSimpleResult(1, $"发生了异常:{ex.Message}"); } } /// <summary> /// 空托盘绑定(PDA) /// </summary> /// <param name="model"></param> /// <returns></returns> public static SimpleResult EmptyBindPallet(EmptyBindInfo model) { var db = DbHelper.GetDbClient(); ///// <summary> ///// 空托盘绑定(PDA) ///// </summary> ///// <param name="model"></param> ///// <returns></returns> //public static SimpleResult EmptyBindPallet(EmptyBindInfo model) { // var db = DbHelper.GetDbClient(); try { var loc = db.Queryable<TN_Location>() .Where(ExprHelper.LocCode(model.LocCode)) .Where(ExprHelper.LocBelongsToArea(AreaName.空托盘接驳区)) .Where(ExprHelper.LocIsFree) .Where(ExprHelper.LocIsEmpty).First(); // try { // var loc = db.Queryable<TN_Location>() // .Where(ExprHelper.LocCode(model.LocCode)) // .Where(ExprHelper.LocBelongsToArea(AreaName.空托盘接驳区)) // .Where(ExprHelper.LocIsFree) // .Where(ExprHelper.LocIsEmpty).First(); if (loc == null) { return BuildSimpleResult(2, $"当前货位 '{model.LocCode}' 无法再绑定容器"); } // if (loc == null) { // return BuildSimpleResult(2, $"当前货位 '{model.LocCode}' 无法再绑定容器"); // } var locCntrRel = db.Queryable<TN_Loc_Container>() .Where(lc => lc.S_CNTR_CODE == model.LocCode).First(); // var locCntrRel = db.Queryable<TN_Loc_Container>() // .Where(lc => lc.S_CNTR_CODE == model.LocCode).First(); if (locCntrRel != null) { return BuildSimpleResult(3, $"当前容器 '{model.CntrCode}' 已经与 '{locCntrRel.S_LOC_CODE}' 绑定"); } // if (locCntrRel != null) { // return BuildSimpleResult(3, $"当前容器 '{model.CntrCode}' 已经与 '{locCntrRel.S_LOC_CODE}' 绑定"); // } //loc.N_CURRENT_NUM = model.PalletCount; // //loc.N_CURRENT_NUM = model.PalletCount; locCntrRel = new TN_Loc_Container { S_LOC_CODE = model.LocCode, S_CNTR_CODE = model.CntrCode }; // locCntrRel = new TN_Loc_Container { // S_LOC_CODE = model.LocCode, // S_CNTR_CODE = model.CntrCode // }; using (var tran = db.Ado.UseTran()) { if (db.Insertable<TN_Loc_Container>(locCntrRel).ExecuteCommand() > 0 && db.Updateable<TN_Location>(loc).UpdateColumns(it => it.N_CURRENT_NUM).ExecuteCommand() > 0) { tran.CommitTran(); return BuildSimpleResult(0, $"绑定容器 '{model.CntrCode}' 与货位 '{model.LocCode}' 成功"); } else { tran.RollbackTran(); return BuildSimpleResult(4, $"绑定容器 '{model.CntrCode}' 与货位 '{model.LocCode}' 失败"); } } } catch (Exception ex) { return BuildSimpleEx(ex); } } // using (var tran = db.Ado.UseTran()) { // if (db.Insertable<TN_Loc_Container>(locCntrRel).ExecuteCommand() > 0 // && db.Updateable<TN_Location>(loc).UpdateColumns(it => it.N_CURRENT_NUM).ExecuteCommand() > 0) { // tran.CommitTran(); // return BuildSimpleResult(0, $"绑定容器 '{model.CntrCode}' 与货位 '{model.LocCode}' 成功"); // } // else { // tran.RollbackTran(); // return BuildSimpleResult(4, $"绑定容器 '{model.CntrCode}' 与货位 '{model.LocCode}' 失败"); // } // } // } // catch (Exception ex) { // return BuildSimpleEx(ex); // } //} /// <summary> /// 空箱绑定(PDA) /// </summary> /// <param name="model"></param> /// <returns></returns> public static SimpleResult EmptyBindGoodpack(EmptyBindInfo model) { var db = DbHelper.GetDbClient(); ///// <summary> ///// 空箱绑定(PDA) ///// </summary> ///// <param name="model"></param> ///// <returns></returns> //public static SimpleResult EmptyBindGoodpack(EmptyBindInfo model) { // var db = DbHelper.GetDbClient(); try { var loc = db.Queryable<TN_Location>() .Where(ExprHelper.LocCode(model.LocCode)) .Where(ExprHelper.LocBelongsToArea(AreaName.空箱接驳区)) .Where(ExprHelper.LocIsFree) .Where(ExprHelper.LocIsEmpty).First(); // try { // var loc = db.Queryable<TN_Location>() // .Where(ExprHelper.LocCode(model.LocCode)) // .Where(ExprHelper.LocBelongsToArea(AreaName.空箱接驳区)) // .Where(ExprHelper.LocIsFree) // .Where(ExprHelper.LocIsEmpty).First(); if (loc == null) { return BuildSimpleResult(2, $"当前货位 '{model.LocCode}' 无法再绑定容器"); } // if (loc == null) { // return BuildSimpleResult(2, $"当前货位 '{model.LocCode}' 无法再绑定容器"); // } var locCntrRel = db.Queryable<TN_Loc_Container>() .Where(lc => lc.S_CNTR_CODE == model.LocCode).First(); // var locCntrRel = db.Queryable<TN_Loc_Container>() // .Where(lc => lc.S_CNTR_CODE == model.LocCode).First(); if (locCntrRel != null) { return BuildSimpleResult(3, $"当前容器 '{model.CntrCode}' 已经与 '{locCntrRel.S_LOC_CODE}' 绑定"); } // if (locCntrRel != null) { // return BuildSimpleResult(3, $"当前容器 '{model.CntrCode}' 已经与 '{locCntrRel.S_LOC_CODE}' 绑定"); // } loc.N_CURRENT_NUM = 1; // 空箱绑定时容器数必然为 1 // loc.N_CURRENT_NUM = 1; // 空箱绑定时容器数必然为 1 locCntrRel = new TN_Loc_Container { S_LOC_CODE = model.LocCode, S_CNTR_CODE = model.CntrCode }; // locCntrRel = new TN_Loc_Container { // S_LOC_CODE = model.LocCode, // S_CNTR_CODE = model.CntrCode // }; using (var tran = db.Ado.UseTran()) { if (db.Insertable<TN_Loc_Container>(locCntrRel).ExecuteCommand() > 0 && db.Updateable<TN_Location>(loc).UpdateColumns(it => it.N_CURRENT_NUM).ExecuteCommand() > 0) { tran.CommitTran(); return BuildSimpleResult(0, $"绑定容器 '{model.CntrCode}' 与货位 '{model.LocCode}' 成功"); } else { tran.RollbackTran(); return BuildSimpleResult(4, $"绑定容器 '{model.CntrCode}' 与货位 '{model.LocCode}' 失败"); } } } catch (Exception ex) { return BuildSimpleEx(ex); } } // using (var tran = db.Ado.UseTran()) { // if (db.Insertable<TN_Loc_Container>(locCntrRel).ExecuteCommand() > 0 // && db.Updateable<TN_Location>(loc).UpdateColumns(it => it.N_CURRENT_NUM).ExecuteCommand() > 0) { // tran.CommitTran(); // return BuildSimpleResult(0, $"绑定容器 '{model.CntrCode}' 与货位 '{model.LocCode}' 成功"); // } // else { // tran.RollbackTran(); // return BuildSimpleResult(4, $"绑定容器 '{model.CntrCode}' 与货位 '{model.LocCode}' 失败"); // } // } // } // catch (Exception ex) { // return BuildSimpleEx(ex); // } //} /// <summary> /// 托盘-空托入库(PDA) /// </summary> /// <param name="model"></param> /// <returns></returns> public static SimpleResult EmptyInboundPallet(EmptyInboundDetailInfo model) { public static SimpleResult EmptyInboundPallet(EmptyInboundInfo model) { var taskName = TaskName.托盘_空托入库; var db = DbHelper.GetDbClient(); try { var startLoc = db.Queryable<TN_Location>() .Where(ExprHelper.LocCode(model.StartLoc)) .Where(ExprHelper.LocIsFree) .Where(ExprHelper.LocIsEmpty.Negate()).First(); .Where(ExprHelper.LocIsEmpty.Negate()) .First(); if (startLoc == null) { return BuildSimpleResult(2, $"起点位置 '{model.StartLoc}' 不存在或不具备取货要求"); } // 查看容器与起点货位是否绑定 var locCntrRel = db.Queryable<TN_Loc_Container>().First( a => a.S_LOC_CODE == model.StartLoc && a.S_CNTR_CODE == model.CntId); var locCntrRel = db.Queryable<TN_Loc_Container>() .Where(c => c.S_LOC_CODE == model.StartLoc && c.S_CNTR_CODE == model.CntrCode) .First(); if (locCntrRel == null) { return BuildSimpleResult(3, $"起点位置 '{model.StartLoc}' 没有绑定容器 '{model.CntId}'"); return BuildSimpleResult(3, $"起点位置 '{model.StartLoc}' 没有绑定容器 '{model.CntrCode}'"); } // TODO 暂定选择最低层按区位顺序入库,后面待修改 @@ -216,7 +231,7 @@ /// 好运箱-空箱入库(PDA) /// </summary> /// <returns></returns> public static SimpleResult EmptyInboundGoodpack(EmptyInboundDetailInfo model) { public static SimpleResult EmptyInboundGoodpack(EmptyInboundInfo model) { var taskName = TaskName.好运箱_空箱入库; var db = DbHelper.GetDbClient(); @@ -231,11 +246,12 @@ } // 查看容器与起点货位是否绑定 var locCntrRel = db.Queryable<TN_Loc_Container>().First( a => a.S_LOC_CODE == model.StartLoc && a.S_CNTR_CODE == model.CntId); var locCntrRel = db.Queryable<TN_Loc_Container>() .Where(c => c.S_LOC_CODE == model.StartLoc && c.S_CNTR_CODE == model.CntrCode) .First(); if (locCntrRel == null) { return BuildSimpleResult(3, $"起点位置 '{model.StartLoc}' 没有绑定容器 '{model.CntId}'"); return BuildSimpleResult(3, $"起点位置 '{model.StartLoc}' 没有绑定容器 '{model.CntrCode}'"); } // TODO 暂定选择最低层按区位顺序入库,后面待修改 @@ -394,28 +410,31 @@ return BuildSimpleEx(ex); } } /// <summary> /// 抽检-合格回库(PDA) /// </summary> /// <param name="model"></param> /// <returns></returns> public static SimpleResult QualifiedBack(QualifiedBackInfo model) { var db = DbHelper.GetDbClient(); try { var cgDetail = db.Queryable<TN_CG_Detail>() .Where(d => d.S_ITEM_CODE == model.ItemCode && d.S_CNTR_CODE == model.CntrCode) .First(); if (cgDetail == null) { return BuildSimpleResult(2, "没有找到待回库的抽检物料"); return BuildSimpleResult(2, "没有找到待回库的抽检物料:" + JsonConvert.SerializeObject(model)); } cgDetail.N_ITEM_STATE = 0; cgDetail.S_ITEM_STATE = "合格"; // TODO 不需要联立三个表 var startLocCntrRel = db.Queryable<TN_Location, TN_Loc_Container> ((l, c) => l.S_CODE == c.S_LOC_CODE) .Where(ExprHelper.LocIsFree) .Select((l, c) => c) .Where((l, c) => c.S_CNTR_CODE == cgDetail.S_CNTR_CODE) // 指定容器号 .Where(ExprHelper.LocIsFree) // NOTE 检查 .Select((l, c) => c) // 筛选 Loc_Container .First(); if (startLocCntrRel == null) { @@ -468,7 +487,6 @@ cgDetail.N_ITEM_STATE = 2; cgDetail.S_ITEM_STATE = "不合格"; // TODO 不需要联立三个表 var startLocCntrRel = db.Queryable<TN_Location, TN_Loc_Container> ((l, c) => l.S_CODE == c.S_LOC_CODE) .Where(ExprHelper.LocIsFree) @@ -573,6 +591,7 @@ S_ITEM_CODE = cgDetail.S_ITEM_CODE, S_BATCH_NO = cgDetail.S_BATCH_NO, S_CNTR_CODE = cgDetail.S_CNTR_CODE, N_COUNT = cgDetail.N_QTY, S_END_AREA = model.EndArea }; @@ -585,9 +604,9 @@ var order = new TN_Outbound_Order { S_NO = orderNo, S_ITEM_CODE = model.ItemCode, S_BATCH_NO = model.BatchNo, F_QTY = model.Qty, F_OUT_QTY = cgDetailList.Sum(a => a.N_QTY), S_BATCH = model.BatchNo, N_END_NUM = model.Qty, //F_OUT_QTY = cgDetailList.Sum(a => a.N_QTY), S_END_AREA = model.EndArea }; @@ -646,9 +665,9 @@ var order = new TN_Outbound_Order { S_NO = orderNo, S_ITEM_CODE = model.ItemCode, S_BATCH_NO = model.BatchNo, F_QTY = model.Qty, F_OUT_QTY = cgDetailList.Sum(a => a.N_QTY), S_BATCH = model.BatchNo, N_END_NUM = model.Qty, //F_OUT_QTY = cgDetailList.Sum(a => a.N_QTY), S_END_AREA = model.EndArea }; @@ -692,7 +711,7 @@ .OrderBy(d => d.N_QTY, OrderByType.Desc) .OrderBy(d => d.N_ITEM_STATE, OrderByType.Asc).ToList(); if (sortedMaterials.Count == 0)//没有满足条件的 if (sortedMaterials.Count == 0) //没有满足条件的 { return result; } Services/WmsService.cs
New file @@ -0,0 +1,67 @@ using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using HH.WCS.Mobox3.DSZSH.AppStart; using HH.WCS.Mobox3.DSZSH.Helpers; using HH.WCS.Mobox3.DSZSH.Models; using Newtonsoft.Json; using static HH.WCS.Mobox3.DSZSH.Dtos.Request.WmsRequest; using static HH.WCS.Mobox3.DSZSH.Dtos.Response.WmsResponse; namespace HH.WCS.Mobox3.DSZSH.Services { public class WmsService { /// <summary> /// 博实物料信息下发同步 /// </summary> /// <param name="model"></param> /// <returns></returns> public static WmsResult CgInfoSync(CgInfoSyncInfo model) { var db = DbHelper.GetDbClient(); var random = new Random(); try { var detail = new TN_CG_Detail { S_ITEM_CODE = model.ItemCode, S_ITEM_NAME = model.ItemName, S_CNTR_CODE = Guid.NewGuid().ToString("D"), // NOTE 容器号:目前随机(后期可能会指定,或者PDA绑定时再填入) S_BATCH_NO = model.BatchNo, S_STANDARD = model.Standard, S_NET_WEIGHT = model.NetWeight, S_QUALITY_GRADE = model.QualityGrade, N_PRODUCT_LINE = random.Next(0, 3), // NOTE 产线号:目前随机(后期可能会指定,或者PDA绑定时再填入) }; // 货位容器绑定的逻辑,在好运箱下线PDA的流程中操作 //var locCntrRel = new TN_Loc_Container { // //S_LOC_CODE = Settings.Config.ProductionLines[detail.N_PRODUCT_LINE].OffLoc[0], // 好运箱的位置是操作区,不是产线 // S_CNTR_CODE = detail.S_CNTR_CODE, // S_CNTR_TYPE = "好运箱", // 贴标机只针对好运箱 //}; //using (var tran = db.Ado.UseTran()) { // if (db.Insertable<TN_CG_Detail>(detail).ExecuteCommand() <= 0 // && db.Insertable<TN_Loc_Container>(detail).ExecuteCommand() <= 0) { // tran.RollbackTran(); // return MesResultBuilder(2, "插入物料信息失败:" + JsonConvert.SerializeObject(detail)); // } // tran.CommitTran(); //} if (db.Insertable<TN_CG_Detail>(detail).ExecuteCommand() <= 0) { return MesResultBuilder(2, "插入物料信息失败:" + JsonConvert.SerializeObject(detail)); } return MesResultBuilder(0, "插入物料信息成功"); } catch (Exception ex) { return MesResultBuilder(1, ex.Message); } } } } config/config.json
@@ -1,7 +1,7 @@ { "WebApiUrl": "http://192.168.1.141:8901/", "WebApiUrl": "http://192.168.1.141:8901", "NdcApiUrl": "http://127.0.0.1:5201/api/order/", "SqlServer": "Data Source=(local);Initial Catalog=DSZSHTest;User ID=sa;Password=123456;", "SqlServer": "Data Source=192.168.1.87;Initial Catalog=AMS_OIMobox;User ID=sa;Password=123456;", "TcpServerIp": "127.0.0.1", "TcpServerPort": 8085, "Areas": [ @@ -108,12 +108,6 @@ }, { "Name": "成品胶出库" }, { "Name": "托盘-空托绑定" }, { "Name": "好运箱-空箱绑定" } ], "ProductionLines": [