HH.WCS.QingXiNongfu/HH.WCS.QingXigongchang.csproj
@@ -13,6 +13,7 @@ <AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects> <Deterministic>true</Deterministic> <TargetFrameworkProfile /> <IsWebBootstrapper>false</IsWebBootstrapper> <PublishUrl>publish\</PublishUrl> <Install>true</Install> <InstallFrom>Disk</InstallFrom> @@ -25,7 +26,6 @@ <MapFileExtensions>true</MapFileExtensions> <ApplicationRevision>0</ApplicationRevision> <ApplicationVersion>1.0.0.%2a</ApplicationVersion> <IsWebBootstrapper>false</IsWebBootstrapper> <UseApplicationTrust>false</UseApplicationTrust> <BootstrapperEnabled>true</BootstrapperEnabled> </PropertyGroup> @@ -47,6 +47,27 @@ <DefineConstants>TRACE</DefineConstants> <ErrorReport>prompt</ErrorReport> <WarningLevel>4</WarningLevel> </PropertyGroup> <PropertyGroup> <SignManifests>true</SignManifests> </PropertyGroup> <PropertyGroup> <SignAssembly>true</SignAssembly> </PropertyGroup> <PropertyGroup> <ManifestCertificateThumbprint>C8059AFDFCE52C60DA32D8A0FE8AB2F99859D6B0</ManifestCertificateThumbprint> </PropertyGroup> <PropertyGroup> <ManifestKeyFile>HH.WCS.QingXigongchang_TemporaryKey.pfx</ManifestKeyFile> </PropertyGroup> <PropertyGroup> <TargetZone>LocalIntranet</TargetZone> </PropertyGroup> <PropertyGroup> <GenerateManifests>true</GenerateManifests> </PropertyGroup> <PropertyGroup> <ApplicationManifest>Properties\app.manifest</ApplicationManifest> </PropertyGroup> <ItemGroup> <Reference Include="Microsoft.Owin, Version=4.2.2.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL"> @@ -172,6 +193,7 @@ <ItemGroup> <Content Include="原物料方法概述.txt" /> <None Include="App.config" /> <None Include="HH.WCS.QingXigongchang_TemporaryKey.pfx" /> <None Include="packages.config" /> <Content Include="Static\css\app.d545ec97.css"> <CopyToOutputDirectory>Always</CopyToOutputDirectory> @@ -182,6 +204,7 @@ <Content Include="Static\js\chunk-vendors.3e768dfe.js.map"> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> </Content> <None Include="Properties\app.manifest" /> <None Include="Static\js\app.829e775c.js.map"> <CopyToOutputDirectory>Always</CopyToOutputDirectory> </None> HH.WCS.QingXiNongfu/Program.cs
@@ -1,5 +1,4 @@ using HH.WCS.QingXigongchang.api; using HH.WCS.QingXigongchang.core; using HH.WCS.QingXigongchang.device; using HH.WCS.QingXigongchang.process; using HH.WCS.QingXigongchang.util; @@ -735,33 +734,34 @@ { GetTask(Monitor.A),//计数器 清除 控制台 //添加任务推送线程 GetTask(TaskCore.Dispatch), GetTask(TaskCore.Kuronggg), //GetTask(TaskCore.Dispatch), //GetTask(TaskCore.Kuronggg), GetTask(TaskCore.ChargeHostAgv), //手动转运 GetTask(Monitor.BottleCapAuto2), /// 自动转运 GetTask(Monitor.BottleCapAuto3, 1), //锁排 - 清除 排空了才解锁。 GetTask(Monitor.BottleCapAuto4), //自动领料 - 上输送线 GetTask(Monitor.BottleCapAuto5), //空框中转,转拆框 GetTask(Monitor.BottleCapAuto6), //出库单批分 GetTask(Monitor.BottleCapAuto7), //自动中转 GetTask(Monitor.BB7), //GetTask(TaskCore.ChargeHostAgv), ////手动转运 //GetTask(Monitor.BottleCapAuto2), ///// 自动转运 //GetTask(Monitor.BottleCapAuto3, 1), ////锁排 - 清除 排空了才解锁。 //GetTask(Monitor.BottleCapAuto4), ////自动领料 - 上输送线 //GetTask(Monitor.BottleCapAuto5), ////空框中转,转拆框 //GetTask(Monitor.BottleCapAuto6), ////出库单批分 //GetTask(Monitor.BottleCapAuto7), ////自动中转 //GetTask(Monitor.BB7), //原材料 自动中转 - 展示流程。 前期测试用的 //GetTask(Monitor.AutoRun), GetTask(Monitor.YwlTKPEBQ_Auto),//标签无菌水线出入库。 //原材料的 新中转流程。 GetTask(Monitor.YWL_ZX_Turn), GetTask(Monitor.BottTask),// 纸箱自动中转 GetTask(Monitor.AutoRunABD), GetTask(Monitor.AutoRun13TSJ), GetTask(Monitor.ZdzyABArea), //GetTask(Monitor.YWL_ZX_Turn), //GetTask(Monitor.BottTask),// 纸箱自动中转 //GetTask(Monitor.AutoRunABD), //GetTask(Monitor.AutoRun13TSJ), //GetTask(Monitor.ZdzyABArea), // GetTask(Monitor.Qchc), //GetTask(Monitor.AutoTK_PE),//提扣 - PE膜出入库 HH.WCS.QingXiNongfu/Properties/app.manifest
New file @@ -0,0 +1,73 @@ <?xml version="1.0" encoding="utf-8"?> <assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1"> <assemblyIdentity version="1.0.0.0" name="MyApplication.app" /> <trustInfo xmlns="urn:schemas-microsoft-com:asm.v2"> <security> <requestedPrivileges xmlns="urn:schemas-microsoft-com:asm.v3"> <!-- UAC 清单选项 如果想要更改 Windows 用户帐户控制级别,请使用 以下节点之一替换 requestedExecutionLevel 节点。 <requestedExecutionLevel level="asInvoker" uiAccess="false" /> <requestedExecutionLevel level="requireAdministrator" uiAccess="false" /> <requestedExecutionLevel level="highestAvailable" uiAccess="false" /> 指定 requestedExecutionLevel 元素将禁用文件和注册表虚拟化。 如果你的应用程序需要此虚拟化来实现向后兼容性,则移除此 元素。 --> <requestedExecutionLevel level="asInvoker" uiAccess="false" /> </requestedPrivileges> <applicationRequestMinimum> <PermissionSet class="System.Security.PermissionSet" version="1" Unrestricted="true" ID="Custom" SameSite="site" /> <defaultAssemblyRequest permissionSetReference="Custom" /> </applicationRequestMinimum> </security> </trustInfo> <compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1"> <application> <!-- 设计此应用程序与其一起工作且已针对此应用程序进行测试的 Windows 版本的列表。取消评论适当的元素, Windows 将自动选择最兼容的环境。 --> <!-- Windows Vista --> <!--<supportedOS Id="{e2011457-1546-43c5-a5fe-008deee3d3f0}" />--> <!-- Windows 7 --> <!--<supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}" />--> <!-- Windows 8 --> <!--<supportedOS Id="{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}" />--> <!-- Windows 8.1 --> <!--<supportedOS Id="{1f676c76-80e1-4239-95bb-83d0f6d0da78}" />--> <!-- Windows 10 --> <!--<supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}" />--> </application> </compatibility> <!-- 指示该应用程序可感知 DPI 且 Windows 在 DPI 较高时将不会对其进行 自动缩放。Windows Presentation Foundation (WPF)应用程序自动感知 DPI,无需 选择加入。选择加入此设置的 Windows 窗体应用程序(面向 .NET Framework 4.6)还应 在其 app.config 中将 "EnableWindowsFormsHighDpiAutoResizing" 设置设置为 "true"。 将应用程序设为感知长路径。请参阅 https://docs.microsoft.com/windows/win32/fileio/maximum-file-path-limitation --> <!-- <application xmlns="urn:schemas-microsoft-com:asm.v3"> <windowsSettings> <dpiAware xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">true</dpiAware> <longPathAware xmlns="http://schemas.microsoft.com/SMI/2016/WindowsSettings">true</longPathAware> </windowsSettings> </application> --> <!-- 启用 Windows 公共控件和对话框的主题(Windows XP 和更高版本) --> <!-- <dependency> <dependentAssembly> <assemblyIdentity type="win32" name="Microsoft.Windows.Common-Controls" version="6.0.0.0" processorArchitecture="*" publicKeyToken="6595b64144ccf1df" language="*" /> </dependentAssembly> </dependency> --> </assembly> HH.WCS.QingXiNongfu/api/AgvController.cs
@@ -1,6 +1,5 @@ using HH.WCS.QingXigongchang.core; using HH.WCS.QingXigongchang.dispatch; using HH.WCS.QingXigongchang.process; using Newtonsoft.Json; using System.Collections.Generic; using System.Web.Http; HH.WCS.QingXiNongfu/bin/Debug/settings.xml
@@ -128,7 +128,7 @@ {"address":"10.140.3.187","deviceName":"瓶盖5L翻斗机","deviceNo":["","187"],"location":["SXFDJ-1"],"deviceType":10,"areaPriy":["PGMKCK"],"enable":1}, {"address":"10.140.3.170","deviceName":"T2提升机","deviceNo":[""],"taskPri":50,"location":["YWLT2TSJ"],"areaPriy":["YWLT2TSJCD"],"deviceType":13,"enable":1}, {"address":"10.140.8.65","deviceName":"T1提升机","deviceNo":[""],"taskPri":50,"location":["YWLT1TSJ"],"areaPriy":["YWLT1TSJCD"],"deviceType":13,"enable":1}, {"address":"10.140.9.167","deviceName":"T1提升机","deviceNo":[""],"taskPri":50,"location":["YWLT1TSJ"],"areaPriy":["YWLT1TSJCD"],"deviceType":13,"enable":1}, ]]]> HH.WCS.QingXiNongfu/core/Monitor.cs
@@ -1026,6 +1026,8 @@ static List<string> ABlist = new List<string> { "YWLAQWJ", "YWLBQWJ" }; static List<string> CDlist = new List<string> { "YWLCQSX", "YWLDQWJ" }; static bool InworkLock = false; //Dictionary<string, List<RowLock>> RGRowList = new Dictionary<string, List<RowLock>>(); public static List<RowLock> RGRow = new List<RowLock>(); /// <summary> /// 原材料 检测各流转位置。 写入托盘货位s_type 中 下一个目的地。就开始中转。 /// 原物料纸箱,入库堆叠区转运 YWLRGDD--人工堆叠区 @@ -1043,6 +1045,7 @@ { try { var lolist = LocationHelper.GetAreaNormalLocList(area);// LocationHelper.GetList<Location>(x => x.S_AREA_CODE == area && x.S_LOCK_STATE != "报废"); var lgrow = lolist.GroupBy(x => x.N_ROW).OrderBy(x => x.Key); Dictionary<string, List<Location>> dsll = new Dictionary<string, List<Location>>(); @@ -1063,6 +1066,8 @@ if (!cntritems.Any()) continue; var cir1 = cntritems.First(); //只筛选纸箱物料的库区数据。 if (!string.IsNullOrEmpty(cir1.S_ITEM_NAME) && cir1.S_ITEM_NAME.Contains("纸箱-")) if (dsll.TryGetValue(cir1.S_ITEM_CODE, out List<Location> ll)) @@ -1123,12 +1128,22 @@ if (ABlist.Contains(EdnRarea)) { var ls = LocationHelper.GetList<Location>(x => x.S_AREA_CODE == EdnRarea && (x.S_LOCK_STATE == "入库锁" || x.S_LOCK_STATE == "出库锁")); if (ls.Any()) //var ls = LocationHelper.GetList<Location>(x => x.S_AREA_CODE == EdnRarea && (x.S_LOCK_STATE == "入库锁")); if (ls.Count() > 1) { LogHelper.Info($"{EdnRarea}任务数1管制2"); continue; } } //else if (CDlist.Contains(EdnRarea)) //{ // var ls = LocationHelper.GetList<Location>(x => x.S_AREA_CODE == EdnRarea && (x.S_LOCK_STATE == "入库锁")).ToList(); // if (ls.Count() > 2) // { // LogHelper.Info($"CD区入库任务管制最大数3 {EdnRarea}"); // continue; // } //} var cntritems = ContainerHelper.GetCntrItemRel(_clrel0.S_CNTR_CODE); if (!cntritems.Any()) continue; @@ -1167,17 +1182,19 @@ if (CDlist.Contains(EdnRarea)) { isCd = true; inlockLis = LocationHelper.GetList<RowLock>(x => x.S_AREA_CODE == EdnRarea && x.S_LOCK_SRC == cir1.S_ITEM_CODE + cir1.S_ITEM_NAME + cir1.S_CJ_NAME && x.S_LOCK_STATE == "入库锁").ToList(); if (inlockLis.Count() > 0) { inlock = inlockLis.FirstOrDefault(); } //inlockLis = LocationHelper.GetList<RowLock>(x => x.S_AREA_CODE == EdnRarea && x.S_LOCK_SRC == cir1.S_ITEM_CODE + cir1.S_ITEM_NAME + cir1.S_CJ_NAME && x.S_LOCK_STATE == "入库锁").ToList(); //if (inlockLis.Count() > 0) //{ // inlock = inlockLis.FirstOrDefault(); //} inlock = RGRow.FirstOrDefault(); if (inlock != null) { //当入库的任务能放满一排并且还有余的时候 开第二排 //先判断起点有多少相同的 能入的物料 if (_cl.S_AREA_CODE == "YWLRGDD")//判断起点是否是人工堆叠区 { inlockLis = RGRow.FindAll(e => e.S_AREA_CODE == EdnRarea && e.S_LOCK_SRC == cir1.S_ITEM_CODE + cir1.S_ITEM_NAME + cir1.S_CJ_NAME).ToList(); //然后判断人工堆叠区需要入库多少托同品种物料 startMum //货位 托盘 物料表联查 LogHelper.Info($"查起点有多少同品种的物料 开始"); @@ -1187,6 +1204,7 @@ LogHelper.Info($"起点要入CD的有多少托盘数量为{lstCanOutL.Count()}"); //判断终点排能入多少 少于入库托盘数则多开一排 EndMum var EndMum = dbll.Queryable<Location>().Where(l => l.S_AREA_CODE == EdnRarea && l.N_CURRENT_NUM == 0 && l.S_LOCK_STATE == "无" && inlockLis.Select(e => e.N_ROW).ToList().Contains(l.N_ROW)).ToList(); LogHelper.Info($"终点CD排有多少空托能入{lstCanOutL.Count()}"); if (lstCanOutL.Count <= EndMum.Count()) { arloclist = arloclist.FindAll(x => inlockLis.Select(e => e.N_ROW).ToList().Contains(x.N_ROW)).ToList(); @@ -1202,6 +1220,26 @@ { arloclist = arloclist.FindAll(x => x.N_ROW == inlock.N_ROW).ToList(); } } else { if (_cl.S_AREA_CODE == "YWLRGDD") { //查询是否有已经入了的排 var ca = Expressionable.Create<Location, LocCntrRel, CntrItemRel>(); ca.And((o, p, t) => o.N_CURRENT_NUM > 0 && o.S_LOCK_STATE == "无" && t.S_ITEM_CODE == cir1.S_ITEM_CODE && t.S_ITEM_NAME == cir1.S_ITEM_NAME && t.S_CJ_NAME == cir1.S_CJ_NAME && o.S_AREA_CODE == EdnRarea); var lstCanOutL = dbll.Queryable<Location>().InnerJoin<LocCntrRel>((o, p) => o.S_LOC_CODE == p.S_LOC_CODE).InnerJoin<CntrItemRel>((o, p, t) => p.S_CNTR_CODE == t.S_CNTR_CODE).Where(ca.ToExpression()).ToList(); LogHelper.Info($"终点有相同的物料的货位有{lstCanOutL.Count()}"); if (lstCanOutL.Count() > 0) { var EndMum = dbll.Queryable<Location>().Where(l => l.S_AREA_CODE == EdnRarea && l.N_CURRENT_NUM == 0 && l.S_LOCK_STATE == "无" && lstCanOutL.Select(e => e.N_ROW).ToList().Contains(l.N_ROW)).ToList(); if (EndMum.Count() > 0) { arloclist = arloclist.FindAll(x => lstCanOutL.Select(e => e.N_ROW).ToList().Contains(x.N_ROW)).ToList(); } } } } } foreach (var rss in arloclist.GroupBy(x => x.N_ROW).OrderByDescending(x => x.Count(y => y.N_CURRENT_NUM > 0)).ThenBy(x => x.Key)) @@ -1267,12 +1305,24 @@ var sign = Settings.GetTimeStamp(); var res = TaskProcess.CreateTransport(sign, _cl.S_LOC_CODE, endbit.S_LOC_CODE, "原物料搬运-纸箱", _clrel.Select(x => x.S_CNTR_CODE).ToList(), 1, endbit.N_CURRENT_NUM + 1, 1, 50, Last);///, EdnRarea == "YWLYLTKQ" ? _clrel0.S_TYPE : ""); LogHelper.Info($"{r.Key}原物料搬运 {sign} 任务 ,创建{res} "); if (res && inlock == null && isCd) if (CDlist.Contains(endbit.S_AREA_CODE) && res) { LogHelper.Info($"添加内存排锁"); var ggf = inlockLis.Find(e => e.S_LOCK_SRC == cir1.S_ITEM_CODE + cir1.S_ITEM_NAME + cir1.S_CJ_NAME && e.S_AREA_CODE == endbit.S_AREA_CODE && e.N_ROW == endbit.N_ROW); LogHelper.Info($"添加内存排锁 是否查询到数据:{JsonConvert.SerializeObject(ggf)}"); if (ggf == null) { var rrrr = new RowLock { S_LOCK_SRC = cir1.S_ITEM_CODE + cir1.S_ITEM_NAME + cir1.S_CJ_NAME, T_LOCK_TIME = DateTime.Now, S_LOCK_STATE = "入库锁", S_AREA_CODE = endbit.S_AREA_CODE, N_ROW = endbit.N_ROW }; LogHelper.Info($"原物料入库 添加排锁信息{JsonConvert.SerializeObject(rrrr)} "); WCSHelper.Do(db => db.Insertable(rrrr).ExecuteCommand()); inlockLis.Add(rrrr); LogHelper.Info($"添加内存排锁 添加数据到内存排锁中:{JsonConvert.SerializeObject(inlockLis)}"); } } //if (res && inlock == null && isCd) //{ // var rrrr = new RowLock { S_LOCK_SRC = cir1.S_ITEM_CODE + cir1.S_ITEM_NAME + cir1.S_CJ_NAME, T_LOCK_TIME = DateTime.Now, S_LOCK_STATE = "入库锁", S_AREA_CODE = endbit.S_AREA_CODE, N_ROW = endbit.N_ROW }; // LogHelper.Info($"原物料入库 添加排锁信息{JsonConvert.SerializeObject(rrrr)} "); // WCSHelper.Do(db => db.Insertable(rrrr).ExecuteCommand()); //} if (EdnRarea == "YWLWJJB") InworkLock = false; break; } @@ -1397,6 +1447,7 @@ { try { // var yuworders = LocationHelper.GetList<YWLWorkOrder>(x => x.SQL_PLineNo == "无菌标签出库" && x.WorkType == 6 && x.SQL_State == "执行中").FindAll(x => x.OutNum > 0 && DateTime.Now.Subtract(x.SQL_Modify_TIme ?? DateTime.Now).TotalSeconds > 10).OrderBy(x => x.TagOverTime).ToList(); var yuworders = LocationHelper.GetList<YWLWorkOrder>(x => x.SQL_PLineNo == "无菌标签出库" && x.WorkType == 6 && x.SQL_State == "执行中").FindAll(x => x.OutNum > 0 && DateTime.Now.Subtract(x.SQL_Modify_TIme ?? DateTime.Now).TotalSeconds > 10).OrderBy(x => x.TagOverTime).ToList(); if (!yuworders.Any()) { @@ -1430,6 +1481,7 @@ var tklist = LocationHelper.GetList<YWLWorkOrder>(x => x.SQL_PLineNo == pline && x.WorkType == 1 && x.SQL_State == "执行中"); if (!Syuworders.Any()) { //水线标签入库 YwlBQ_CreInwork(SlocsFirst, SX_BQ.RK_BQDDQ, SX_BQ.RK_BBHJQ); } if (tklist.Count() > 0) @@ -1448,6 +1500,8 @@ LogHelper.CErrorLog($"{tk.SQL_WorkNo}-{tk.SQL_PLineNo} 退库工单开启,绑定的 零整 标记"); } Location Endbit = null; // var hjs = LocationHelper.GetList<Location>(x => x.S_AREA_CODE == SX_BQ.RK_BBHJQ).FindAll(x => x.S_LOCK_STATE == "无" && x.N_CURRENT_NUM == 0); // var hjs = db.Queryable<Location>().Where(l => l.S_AREA_CODE == SX_BQ.RK_BBHJQ && l.S_LOCK_STATE.Trim() == "无").ToList(); var hjs = LocationHelper.GetAreaNormalLocList(SX_BQ.RK_BBHJQ, true, false); Endbit = hjs.FindAll(x => x.N_LAYER == (s_type == .5 ? 1 : (s_type == .75 ? 2 : 3))).OrderBy(x => x.N_ROW).ThenBy(x => x.N_COL).FirstOrDefault(); if (Endbit != null) @@ -1487,8 +1541,8 @@ { //return; ///起点数据。 终点库区 堆叠层数。 YwlPETK_CreInwork(PElocsFirst, "YWLTKMKQ", "提扣叉运", 3);//提扣入库--PE膜 YwlPETK_CreInwork(TKlocsFirst, "YWLTKMKQ", "收缩膜叉运", 1); // PE入库 --提扣 YwlPETK_CreInwork(PElocsFirst, "YWLTKMKQ", "收缩膜叉运", 2);//PE膜 YwlPETK_CreInwork(TKlocsFirst, "YWLTKMKQ", "提扣叉运", 1); //提扣 //YwlPETKtkOrder("YWLZSXBKQ", "YWLTKMKQ", "收缩膜叉运"); //YwlPETKOutOrder("YWLTKMKQ", "YWLZSXBKQ", "收缩膜叉运");// PE中出库 @@ -1858,8 +1912,8 @@ { var s_type = ContainerHelper.GetCntrItemRel(CNTR.FirstOrDefault().S_CNTR_CODE).FirstOrDefault()?.N_BQ_TRAY_TYPE ?? 0; Location Endbit = null; if (area == area/* WJ_BQ.RK_BQJBQ*/) { //if (area == area/* WJ_BQ.RK_BQJBQ*/) //{ var hjs = LocationHelper.GetAreaNormalLocList(WJ_BQ.RK_BBHJQ, true, false); Endbit = hjs.FindAll(x => x.N_CURRENT_NUM == 0 && x.N_LAYER == (s_type == .5 ? 1 : (s_type == .75 ? 2 : 3))).OrderBy(x => x.N_ROW).ThenBy(x => x.N_COL).FirstOrDefault(); if (Endbit != null) @@ -1867,7 +1921,7 @@ var re = TaskProcess.CreateTransport("", lastfull.S_LOC_CODE.Trim(), Endbit.S_LOC_CODE, "标签叉运-线边标签退库", CNTR.Select(x => x.S_CNTR_CODE).ToList(), 1, 1, 1, 62); LogHelper.CSucessLog($"from {lastfull.S_LOC_CODE} to {Endbit.S_LOC_CODE} 标签叉运-接驳标签退库 ,创建{re}"); } } // } //else //{ @@ -2091,7 +2145,7 @@ foreach (var ptR in klocsFirst.GroupBy(x => x.N_ROW).OrderBy(x => x.Key).ToList()) { Location EndBit = null; var rsfull = ptR.OrderBy(X => X.N_COL).ToList().FindAll(x => x.N_CURRENT_NUM > 0).LastOrDefault(); var rsfull = ptR.OrderBy(X => X.N_COL).ToList().FindAll(x => x.N_CURRENT_NUM > 0).LastOrDefault();//起点 if (rsfull != null) { var rklist = LocationHelper.GetRowLock(v); @@ -3717,16 +3771,22 @@ { LogHelper.Info($"AutoRun13TSJ{od.SQL_WorkNo}对应工单的{od.S_ROW} 物料数量不足。触发转运。"); // 先看是否有到该库区的转运任务。 var zxs = LocationHelper.GetList<YWLZXtake>(X => X.S_ZX_STATE == "执行" && X.S_END_AREA == od.S_ROW); //1.查看物料是否匹配。 var itemTRUN = zxs.Any(x => x.S_ITEM_CODE == od.SQL_ItemCode && x.S_ITEM_NAME == od.SQL_ItemName && x.S_CJ_NAME == od.S_CJ_NAME); if (itemTRUN) { //有到该库区的 物料转运任务了。 不需要继续了 。 var zxs = LocationHelper.GetList<YWLZXtake>(X => X.S_ZX_STATE == "执行" && X.S_END_AREA == od.S_ROW).ToList(); //查询是否有重复的工单在执行 var ggf = zxs.Find(x => x.S_ITEM_CODE == od.SQL_ItemCode && x.S_ITEM_NAME == od.SQL_ItemName); if (ggf != null) { LogHelper.Info($"AutoRun13TSJ{od.SQL_WorkNo}已经存在转运了无需触发转运。"); return; continue; } //1.查看物料是否匹配。 //var itemTRUN = zxs.Any(x => x.S_ITEM_CODE == od.SQL_ItemCode && x.S_ITEM_NAME == od.SQL_ItemName && x.S_CJ_NAME == od.S_CJ_NAME); //if (itemTRUN) //{ //有到该库区的 物料转运任务了。 不需要继续了 。 // LogHelper.Info($"AutoRun13TSJ{od.SQL_WorkNo}已经存在转运了无需触发转运。"); // return; //} //人工转运没指定物料,我会自动写回转运单 物料数据。 //找CD 区 哪里有这个物料。 @@ -3741,17 +3801,17 @@ { lstCanOutL = newDb.Queryable<Location>().InnerJoin<LocCntrRel>((o, p) => o.S_LOC_CODE == p.S_LOC_CODE).InnerJoin<CntrItemRel>((o, p, t) => p.S_CNTR_CODE == t.S_CNTR_CODE).Where((o, p, t) => o.S_AREA_CODE == area && o.N_CURRENT_NUM > 0 && o.S_LOCK_STATE == "无" && t.S_ITEM_CODE == od.SQL_ItemCode && t.S_ITEM_NAME == od.SQL_ItemName).ToList(); } List<string> CRk = new List<string>() { "出库锁", "入库锁" }; var EndMum = newDb.Queryable<Location>().Where(l => l.S_AREA_CODE == area && CRk.Contains(l.S_LOCK_STATE)).ToList(); var RowLock = EndMum.GroupBy(e => e.N_ROW).Select(f => f.First()).ToList(); foreach (var item in RowLock) { lstCanOutL.RemoveAll(e => e.N_ROW == item.N_ROW); } //List<string> CRk = new List<string>() { "出库锁", "入库锁" }; //var EndMum = newDb.Queryable<Location>().Where(l => l.S_AREA_CODE == area && CRk.Contains(l.S_LOCK_STATE)).ToList(); //var RowLock = EndMum.GroupBy(e => e.N_ROW).Select(f => f.First()).ToList(); //foreach (var item in RowLock) //{ // lstCanOutL.RemoveAll(e => e.N_ROW == item.N_ROW); //} if (lstCanOutL.Count() > 0) { var LstCan = newDb.Queryable<LocCntrRel>().Where(a => lstCanOutL.Select(e => e.S_LOC_CODE).ToList().Contains(a.S_LOC_CODE)).ToList(); var loc = lstCanOutL.Find(e => e.S_LOC_CODE == LstCan.OrderBy(c => c.T_CREATE).FirstOrDefault().S_LOC_CODE); //var LstCan = newDb.Queryable<LocCntrRel>().Where(a => lstCanOutL.Select(e => e.S_LOC_CODE).ToList().Contains(a.S_LOC_CODE)).ToList(); var loc = lstCanOutL.OrderBy(e => e.T_FULL_TIME).FirstOrDefault(); TrunStart.area = area; TrunStart.Row = loc.N_ROW; } @@ -3771,10 +3831,10 @@ } LogHelper.Info($"ZdzyABArea{od.SQL_WorkNo}触发转运。转运来源是{JsonConvert.SerializeObject(TrunStart)}"); if (TrunStart?.area != null) WCSHelper.Do(db => { db.Insertable(new YWLZXtake var ggft = new YWLZXtake() { SQL_WorkNo = "CKD" + DateTime.Now.Ticks.ToString(), S_START_AREA = TrunStart.area, N_START_ROW = TrunStart.Row, S_END_AREA = od.S_ROW, @@ -3783,9 +3843,9 @@ S_ITEM_NAME = od.SQL_ItemName, S_CJ_NAME = od.S_CJ_NAME, S_ZZ_AREA = (od.S_ROW == "YWLAQWJ" ? "YWLWJJB" : od.S_ROW) }).ExecuteCommand(); }); }; var gf = newDb.Insertable(ggft).ExecuteCommand(); } } } } @@ -3805,6 +3865,7 @@ /// </summary> public static void AutoRun13TSJ() { //Action<YWLWorkOrder> _sAB没物料或者余量不足开始触发跟根据自动转运_名字越长越好 = (od) => //{ // LogHelper.Info($"AutoRun13TSJ{od.SQL_WorkNo}对应工单的{od.S_ROW} 物料数量不足。触发转运。"); @@ -3922,6 +3983,51 @@ foreach (var area in v) //.Concat(od.S_ROW.Split('$')).Distinct()) { if (ABlist.Contains(area)) { //AreaRowlist = LocationHelper.GetAreaNormalLocList(area);YWLBQWJ // var AreaRowlist = LocationHelper.GetAreaNormalLocList("YWLAQWJ").Union(LocationHelper.GetAreaNormalLocList("YWLBQWJ")).ToList(); var db = new SqlHelper<object>().GetInstance(); var ca = Expressionable.Create<Location, LocCntrRel, CntrItemRel>(); ca.And((o, p, t) => o.N_CURRENT_NUM > 0 && o.S_LOCK_STATE == "无" && t.S_ITEM_CODE == od.SQL_ItemCode && t.S_ITEM_NAME == od.SQL_ItemName && (o.S_AREA_CODE == "YWLAQWJ" || o.S_AREA_CODE == "YWLBQWJ")); var lstCanOutL = db.Queryable<Location>().InnerJoin<LocCntrRel>((o, p) => o.S_LOC_CODE == p.S_LOC_CODE).InnerJoin<CntrItemRel>((o, p, t) => p.S_CNTR_CODE == t.S_CNTR_CODE).Where(ca.ToExpression()).ToList(); if (lstCanOutL.Count() > 0) { var rl = lstCanOutL.OrderBy(e => e.T_FULL_TIME).FirstOrDefault(); _clrel = LocationHelper.GetLocCntrRel(rl.S_LOC_CODE); //板型相同 var _clrel0 = _clrel.OrderByDescending(xx => xx.T_CREATE).First(); if (rl != null) { StartBit = rl; } } else { LogHelper.Info($"AutoRun13TSJ 机台:{pline} 物料编码:{od.SQL_ItemCode}物料名称:{od.SQL_ItemName} AB区缺料"); } //if (rl == null) continue; //_clrel = LocationHelper.GetLocCntrRel(rl.S_LOC_CODE); ////板型相同 //var _clrel0 = _clrel.OrderByDescending(xx => xx.T_CREATE).First(); //LogHelper.Info("AutoRun13TSJ" + rl.S_LOC_CODE + "识别托盘类型。" + JsonConvert.SerializeObject(_clrel0)); //var _clcntitem = ContainerHelper.GetCntrItemRel(_clrel0.S_CNTR_CODE.Trim()).FirstOrDefault(); //LogHelper.Info("AutoRun13TSJ" + rl.S_LOC_CODE + "识别托盘上的物料信息。" + JsonConvert.SerializeObject(_clcntitem)); //if (_clcntitem != null) //{ // LogHelper.Info("AutoRun13TSJ" + "相互是否匹配 _clcntitem S_ITEM_CODE:" + _clcntitem.S_ITEM_CODE + " od" + od.SQL_ItemCode + " _clcntitem S_ITEM_NAME:" + _clcntitem.S_ITEM_NAME + "od: " + od.SQL_ItemName + " od.S_CJ_NAME:" + od.S_CJ_NAME + "结果:" + (_clcntitem.S_ITEM_CODE == od.SQL_ItemCode && _clcntitem.S_ITEM_NAME == od.SQL_ItemName && _clcntitem.S_CJ_NAME == od.S_CJ_NAME)); // if (_clcntitem.S_ITEM_CODE == od.SQL_ItemCode && _clcntitem.S_ITEM_NAME == od.SQL_ItemName) // { // StartBit = rl; // break; // } //} } else { var AreaRowlist = LocationHelper.GetAreaNormalLocList(area); foreach (var item in AreaRowlist.GroupBy(x => x.N_ROW)) { @@ -3943,8 +4049,11 @@ } } } } if (StartBit != null) { break; } } if (StartBit == null) { @@ -4110,6 +4219,11 @@ if (dsi.TryGetValue(area, out dictitems)) { var ill = dictitems.Find(x => x.Row == rl.N_ROW && x.ItemCode == _clcntitem.S_ITEM_CODE && x.ItemName == _clcntitem.S_ITEM_NAME && _clcntitem.S_CJ_NAME == x.S_CJ_NAME); if (ill == null) { ill = dictitems.Find(x => x.Row == rl.N_ROW && x.ItemCode == _clcntitem.S_ITEM_CODE && x.ItemName == _clcntitem.S_ITEM_NAME); } if (ill != null) { if (rl.N_CURRENT_NUM > ill.ItemLayer) @@ -4151,6 +4265,29 @@ LogHelper.Info($"AutoRunABD abcd物料汇总完成 >>{ReadCCK}|| {dsi.Count}"); } /// <summary> /// 格式化内存排锁 /// </summary> public static void Qchc() { try { LogHelper.Info($"内存中的排锁表中的数据" + $"{JsonConvert.SerializeObject(RGRow)}"); if (RGRow.Count() > 0) { var locs = LocationHelper.GetList<Location>(x => x.S_AREA_CODE == "YWLRGDD" && x.S_LOCK_STATE == "出库锁").ToList(); if (locs.Count() == 0) { RGRow = new List<RowLock>(); LogHelper.Info($"格式化内存中的排锁" + $"{JsonConvert.SerializeObject(RGRow)}"); } } } catch (Exception ex) { LogHelper.Info($"格式化内存中的排锁 失败" + $"{ex.Message}"); } } public static void chargeCCD() { var ods = LocationHelper.GetList<YWLWorkOrder>(x => x.WorkType == 2 && x.SQL_State == "执行中"); HH.WCS.QingXiNongfu/core/TaskCore.cs
@@ -7,8 +7,6 @@ using System; using System.Collections.Generic; using System.Linq; using System.Web.Configuration; using System.Xml.Schema; using static HH.WCS.QingXigongchang.api.ApiModel; namespace HH.WCS.QingXigongchang.core @@ -36,7 +34,7 @@ && wmsTask.S_B_STATE.Trim() != "强制完成" && wmsTask.S_B_STATE.Trim() != "取消") { if (model.State < 8 || model.State > 1000) if (model.State < 10 || model.State > 1000) { if (model.State < 7 && string.IsNullOrEmpty(model.ForkliftNo)) { @@ -99,6 +97,15 @@ if (r.ResultCode != -1) TaskHelper.BeEnd(wmsTask); break; case 9://强制取消 //起点解绑锁释放 终点锁释放 r = TaskProcess.OperateStatus(wmsTask, 9); if (r.ResultCode != -1) { wmsTask.T_END_TIME = DateTime.Now; TaskHelper.UpdateStatus(wmsTask, "取消"); } break; case 1101://取货申请 - HH.WCS.QingXiNongfu/dispatch/NDC.cs
@@ -70,6 +70,66 @@ return new AGVResult { Res = new Res { ErrCode = -1, ErrInfo = e.Message } }; } } public static bool AddTaskNew(int ts, int pri, string taskNo, Dictionary<string, string> dic) { var res = NDC.AddNewOrderNew(ts, pri, taskNo, dic); if (res != null && (res.Res.ErrCode == 0 || res.Res.ErrCode == 50009)) { return true; } else { return false; } } public static AGVResult AddNewOrderNew(int ts, int pri, string taskNo, Dictionary<string, string> param) { //< Req >< Order TS = '1' Pri = '1' No = 'TN2302020001' Ext1 = '' Ext2 = '' N_CNTR_COUNT = '' >< Param Name = 'From' Value = '2' />< Param Name = 'To' Value = '1' /></ Order ></ Req > var bufin = GetReqStrNew(ts, pri, taskNo, param); try { LogHelper.Info($"任务下发结果 OrderAdd req={bufin}", "NDC"); var result = callClient.OrderAdd(bufin); LogHelper.Info($"任务下发结果 OrderAdd req={bufin} res={result}", "NDC"); // Console.WriteLine($"任务下发结果 OrderAdd req={bufin} res={result}"); //LogHelper.Info(result.bufout, "ts"); return GetResult(result); } catch (Exception e) { LogHelper.Info($"任务下发失败 OrderAdd req={bufin} res={e.Message}", "NDC"); //Console.WriteLine($"任务下发失败 AddNewOrder req={bufin} res={e.Message}"); return new AGVResult { Res = new Res { ErrCode = -1, ErrInfo = e.Message } }; } } private static string GetReqStrNew(int ts, int pri, string taskNo, Dictionary<string, string> param) { /*<Req> <Order TS='5' Pri='80' No='666' NoCallback='0' Ext1='' Ext2='' Ext3=''> <Param Name='From' Value='10' /> <Param Name='To' Value='20' /> <Param Name='FRow' Value='1' /> <Param Name='TRow' Value='7' /> <Param Name='DispInfo' Value='1' /> <Param Name='CtrlVal' Value='12' /> <Param Name='ChgTo' Value='2' /> <Param Name='Flow' Value='111' /> <Param Name='Tlow' Value='222' /> </Order> </Req>*/ var sb = new StringBuilder(); sb.Append($"<Req><Order TS='{ts}' Pri='{pri}' No='{taskNo}'>"); foreach (var kv in param) { sb.Append($"<Param Name='{kv.Key}' Value='{kv.Value}'/>"); } sb.Append("</Order></Req>"); return sb.ToString(); } public static AGVResult CancelOrder(int ts, Dictionary<string, string> param, string RORDERs = "") { HH.WCS.QingXiNongfu/obj/Debug/HH.WCS.QingXigongchang.csproj.FileListAbsolute.txt
@@ -329,3 +329,8 @@ E:\GitProject\HH-0014_NongFu_QingXi\HH.WCS.QingXiNongfu\obj\Debug\HH.WCS.Q.FBA0BAD2.Up2Date E:\GitProject\HH-0014_NongFu_QingXi\HH.WCS.QingXiNongfu\obj\Debug\HH.WCS.QingXigongchang.exe E:\GitProject\HH-0014_NongFu_QingXi\HH.WCS.QingXiNongfu\obj\Debug\HH.WCS.QingXigongchang.pdb E:\GitProject\HH-0014_NongFu_QingXi\HH.WCS.QingXiNongfu\bin\Debug\HH.WCS.QingXigongchang.exe.manifest E:\GitProject\HH-0014_NongFu_QingXi\HH.WCS.QingXiNongfu\bin\Debug\HH.WCS.QingXigongchang.application E:\GitProject\HH-0014_NongFu_QingXi\HH.WCS.QingXiNongfu\obj\Debug\HH.WCS.QingXigongchang.TrustInfo.xml E:\GitProject\HH-0014_NongFu_QingXi\HH.WCS.QingXiNongfu\obj\Debug\HH.WCS.QingXigongchang.exe.manifest E:\GitProject\HH-0014_NongFu_QingXi\HH.WCS.QingXiNongfu\obj\Debug\HH.WCS.QingXigongchang.application HH.WCS.QingXiNongfu/process/DeviceProcess.cs
@@ -312,7 +312,7 @@ si = "0"; } else if (data.Contains("11"))// && (ods.Find(x => x.SQL_PLineNo.Contains("纸箱")) != null || plc.deviceName.Contains("T1")) if (data.Contains("11"))// && (ods.Find(x => x.SQL_PLineNo.Contains("纸箱")) != null || plc.deviceName.Contains("T1")) { //if (!ods.Any()) // return; @@ -320,13 +320,22 @@ if (_cl.N_CURRENT_NUM > 0 || _clrel.Any()) { LogHelper.Info($" time:{_clrel0?.T_CREATE} = s_type:{_clrel0.S_TYPE}"); if (_clrel.Any()) //if (DateTime.Now.Subtract(_clrel0.T_CREATE).TotalSeconds < 10 || !string.IsNullOrEmpty(_clrel0.S_TYPE)) // goto ballll; //plg 2025年6月23日 去除10秒时间限制 if (_clrel.Any()) { if (od?.SQL_PLineNo == "T1提升机") { if (!string.IsNullOrEmpty(_clrel0.S_TYPE)) goto ballll; } else { if (DateTime.Now.Subtract(_clrel0.T_CREATE).TotalSeconds < 3 || !string.IsNullOrEmpty(_clrel0.S_TYPE)) goto ballll; } } LocationHelper.DoAction(db => { db.Deleteable(_clrel).ExecuteCommand(); HH.WCS.QingXiNongfu/process/TaskProcess.cs
@@ -1112,6 +1112,12 @@ { CacheBitCancelUpdate(mst, out r, true); } if (state == 9) { var g = LocationHelper.UnLockLoc(mst.S_END_LOC.Trim()); var T = LocationHelper.UnLockLoc(mst.S_START_LOC.Trim()); CacheBitUpdate(mst, load: true); } return r; } @@ -1349,6 +1355,48 @@ else return false; } } //else if (taskType.Contains("收缩膜叉运-入库") || taskType.Contains("收缩膜叉运-入库") || taskType.Contains("收缩膜叉运-货架出提升机")) //{ // var ts = 5; // start = LocationHelper.GetAgvSite(mst.S_START_LOC);//起点站点 // end = LocationHelper.GetAgvSite(mst.S_END_LOC);//终点站点 // var dic = new Dictionary<string, string>(); // dic.Add("From", start.ToString()); // dic.Add("To", end.ToString()); // dic.Add("FUNC", "0"); // dic.Add("DATA", "0"); // int height = 0; // var itemcode = ""; // var ItemLayer = 0; // var db = new SqlHelper<object>().GetInstance(); // var cirs = ContainerHelper.GetCntrItemRel(mst.S_CNTRS.Split(',').ToList().FirstOrDefault()).First(); // LogHelper.Info($"原物料 收缩膜叉运 容器物料表数据{JsonConvert.SerializeObject(cirs)}", "HosttoagvTask"); // if (cirs != null) // { // var ItemF = db.Queryable<ItemInfo>().Where(a => a.S_ITEM_CODE == cirs.S_ITEM_CODE).First(); // itemcode = ItemF.S_ITEM_CODE; // ItemLayer = ItemF.ItemLayer; // if (mst.N_START_LAYER < 3 || mst.N_END_LAYER < 3) // { // height = ItemF.trayHeight; // } // else // { // height = ItemF.trayHeight1; // } // } // dic.Add("ItemHeight", height.ToString()); // dic.Add("StaItemHeight", "0"); // dic.Add("TrayType", $"{mst.N_START_LAYER}{mst.N_END_LAYER}"); // var ggh = NDC.AddTaskNew(ts, mst.N_PRIORITY, mst.S_TASK_NO, dic); // if (ggh) // { // TaskHelper.UpdateStatus(mst, "已推送"); // result = true; // GeneralInterFaceFunc(mst, 8 + ""); // } //} //else if ( mst.S_END_LAREA == "WJBQDDKQ" || mst.S_END_LAREA == "SXBQDDKQ"|| mst.S_START_LAREA == "WJBQDDKQ" ||mst.S_START_LAREA == "SXBQDDKQ" ) //{ // if (start == 0) HH.WCS.QingXiNongfu/settings.xml
@@ -128,7 +128,7 @@ {"address":"10.140.3.187","deviceName":"瓶盖5L翻斗机","deviceNo":["","187"],"location":["SXFDJ-1"],"deviceType":10,"areaPriy":["PGMKCK"],"enable":1}, {"address":"10.140.3.170","deviceName":"T2提升机","deviceNo":[""],"taskPri":50,"location":["YWLT2TSJ"],"areaPriy":["YWLT2TSJCD"],"deviceType":13,"enable":1}, {"address":"10.140.8.65","deviceName":"T1提升机","deviceNo":[""],"taskPri":50,"location":["YWLT1TSJ"],"areaPriy":["YWLT1TSJCD"],"deviceType":13,"enable":1}, {"address":"10.140.9.167","deviceName":"T1提升机","deviceNo":[""],"taskPri":50,"location":["YWLT1TSJ"],"areaPriy":["YWLT1TSJCD"],"deviceType":13,"enable":1}, ]]]> HH.WCS.QingXiNongfu/wms/LocationHelper.cs
@@ -1,17 +1,11 @@ using HH.WCS.QingXigongchang.process; using HH.WCS.QingXigongchang.util; using Newtonsoft.Json; using Newtonsoft.Json.Linq; using SqlSugar; using System; using System.Collections; using System.Collections.Generic; using System.Linq; using System.Linq.Expressions; using System.Security.Cryptography; using System.Text; using System.Threading.Tasks; using static HH.WCS.QingXigongchang.dispatch.NDC; namespace HH.WCS.QingXigongchang.wms { HH.WCS.QingXiNongfu/wms/WCSModel.cs
@@ -504,6 +504,7 @@ [SuGG("库库转运")] public class YWLZXtake : BaseModel { public string SQL_WorkNo { get; set; } public string S_START_AREA { get; set; } public int N_START_ROW { get; set; } public string S_ZZ_AREA { get; set; } HH.WCS.QingXiNongfu/wms/WMSModel.cs
@@ -290,6 +290,11 @@ public string S_ITEM_CODE { get; set; } public string S_ITEM_NAME { get; set; } public int trayHeight { get; set; } /// <summary> /// 原料pe膜三层TS高度 /// </summary> public int trayHeight1 { get; set; } public int ItemLayer { get; set; } //物料所在托盘的可堆叠层数。 《》与货位容量取 最小值。