diff --git a/BPASmartClient.JXJFoodBigStation/Properties/Settings.Designer.cs b/BPASmartClient.JXJFoodBigStation/Properties/Settings.Designer.cs index 804602c2..02053c8a 100644 --- a/BPASmartClient.JXJFoodBigStation/Properties/Settings.Designer.cs +++ b/BPASmartClient.JXJFoodBigStation/Properties/Settings.Designer.cs @@ -12,7 +12,7 @@ namespace BPASmartClient.JXJFoodBigStation.Properties { [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "17.1.0.0")] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "17.3.0.0")] internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase { private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); diff --git a/BPASmartClient.MorkF/Control_MorkF.cs b/BPASmartClient.MorkF/Control_MorkF.cs index 085bf88e..28b26e12 100644 --- a/BPASmartClient.MorkF/Control_MorkF.cs +++ b/BPASmartClient.MorkF/Control_MorkF.cs @@ -33,7 +33,7 @@ namespace BPASmartClient.MorkF /// /// 菜品库while循环最大sleep次数 /// - private const int materialSleepCount = 400; + private const int materialSleepCount = 600; /// /// 菜品库while循环每次sleep时间 @@ -54,17 +54,17 @@ namespace BPASmartClient.MorkF private const int materialHigh = 34500; /// - /// + /// 菜品库第一层的起始基点,为最下层盒子的中间点 /// private const int materialOne = 34500; /// - /// + /// 菜品库第二层的起始基点,为最下层盒子的中间点 /// private const int materialTwo = 34500; /// - /// + /// 菜品库第三层的起始基点,为最下层盒子的中间点 /// private const int materialThree = 34500; @@ -153,6 +153,8 @@ namespace BPASmartClient.MorkF ///初始化菜品库 //FoodLibInit(); Task2ReadMaterialData(); + + //Json.Read(); } /// @@ -900,25 +902,43 @@ namespace BPASmartClient.MorkF /// public bool GetDistance(int x) { + bool ret = true; //是否在第一层菜品库 if (x > 0 && x <= materialLaserHigh) { //获取传感器1的距离 - return GetDistance_1(); + ret &= GetDistance_1(); + + Thread.Sleep(400); + + //获取传感器1的距离 + ret &= GetDistance_1(); } //是否在第二层菜品库 else if (x > materialLaserHigh && x <= (2 * materialLaserHigh + clapboardLaserHigh)) { - //获取传感器1的距离 - return GetDistance_2(); + //获取传感器2的距离 + ret &= GetDistance_2(); + + Thread.Sleep(400); + + ret &= GetDistance_2(); } //是否在第三层菜品库 else if (x > (2 * materialLaserHigh + clapboardLaserHigh) && x <= (3 * materialLaserHigh + 2 * clapboardLaserHigh)) { - //获取传感器1的距离 - return GetDistance_3(); + //获取传感器3的距离 + ret &= GetDistance_3(); + + Thread.Sleep(400); + + ret &= GetDistance_3(); + } + if (!ret) + { + MessageLog.GetInstance.Show($"错误:X轴:{x}获取传感器数据出错"); } - return false; + return ret; } public void PawTurnFront() @@ -1055,26 +1075,18 @@ namespace BPASmartClient.MorkF /// 取菜x轴坐标 /// 取菜y轴坐标 /// 炒锅编号 - public void GetMaterail(int x, int y, int fryNum = 0) + public bool GetMaterail(int x, int y, int fryNum) { //设置到抓菜处 if (!SetArmPosition(x, y)) { - return; - } - - if (!GetDistance(x)) - { - MessageLog.GetInstance.Show("错误:获取传感器数据出错"); - return; + return false; } - Thread.Sleep(200); - if (!GetDistance(x)) { MessageLog.GetInstance.Show("错误:获取传感器数据出错"); - return; + return false; } Thread.Sleep(1000); @@ -1087,26 +1099,26 @@ namespace BPASmartClient.MorkF if (laserHigh > 29) { MessageLog.GetInstance.Show("错误:传感器获取数据大于隔板与传感器之间的距离"); - return; + return false; } int moveX = 0; if (LaserDistance2Coordinate(laserHigh, out moveX) != Laser2CoordinateState.MaterialNormal) { MessageLog.GetInstance.Show("错误:传感器距离转坐标值失败"); - return; + return false; } if(x < moveX) { MessageLog.GetInstance.Show("错误:传感器距离转坐标值大于当前x轴坐标"); - return; + return false; } //设置到传感器感应的距离处 if (!SetArmPosition(x - moveX, y)) { - return; + return false; } ////关闭电磁阀 @@ -1117,14 +1129,14 @@ namespace BPASmartClient.MorkF //爪子去1号位抓菜 if (!PawToPoint1()) { - return; + return false; } #endif //设置到该层菜品库最高处 if (!SetArmPosition(x - materialHigh, y)) { - return; + return false; } ////移动前开启电磁阀 @@ -1135,13 +1147,13 @@ namespace BPASmartClient.MorkF //爪子去2号位放菜 if (!PawToPoint2()) { - return; + return false; } #endif ////判断炒锅是否可以放盒 - //for(int i = 0;materialSleepCount > i && !morkFs[fryIndex].FryPot1_HOBTPut;i++) + //for (int i = 0; materialSleepCount > i && !morkFs[fryIndex].FryPot1_HOBTPut; i++) //{ - // Thread.Sleep(materialSleepTime); + // Thread.Sleep(materialSleepTime); // if (i >= materialSleepCount - 1) // { // MessageLog.GetInstance.Show("等待炒锅允许放盒超时"); @@ -1169,14 +1181,14 @@ namespace BPASmartClient.MorkF //设置到炒锅1出菜处 if (!SetArmPosition(x, y)) { - return; + return false; } #if true //爪子去3号位放菜 if (!PawToPoint3()) { - return; + return false; } #endif @@ -1188,14 +1200,14 @@ namespace BPASmartClient.MorkF //设置到炒锅1出菜处 if (!SetArmPosition(x + materialToFryDistance, y)) { - return; + return false; } #if true //爪子回到2号位 if (!PawToPoint2()) { - return; + return false; } #endif ////关闭电磁阀 @@ -1205,6 +1217,62 @@ namespace BPASmartClient.MorkF { morkFs[fryNum].GetMaterialComplete = true; } + return true; + } + + /// + /// 更新菜品库存量 + /// + /// + public bool UpdateMaterialLibraryStock() + { + try + { + //判断是否初始化 + if(!ml_morkf.InitialComplete) + { + return false; + } + + foreach(var item in MaterialCoordinate.dicNoMaterialCoordinate) + { + //设置到抓菜处 + if (!SetArmPosition(item.Value.X, item.Value.Y)) + { + return false; + } + + //获取该处的距离 + if (!GetDistance(item.Value.X)) + { + MessageLog.GetInstance.Show("错误:获取传感器数据出错"); + return false; + } + + Thread.Sleep(1000); + + //获取传感器的距离 + int laserHigh = ml_morkf.LaserDistance; + int surplus = 0; + //根据距离算出菜品余量 + Laser2CoordinateState state = LaserDistance2MaterialCount(laserHigh, out surplus); + if (state != Laser2CoordinateState.MaterialNormal || state != Laser2CoordinateState.MaterialEmpty) + { + return false; + } + + //更新菜品余量 + if (!MaterialSurplusOperation.GetInstance().UpdateSurplus(item.Key, surplus)) + { + return false; + } + } + return true; + } + catch(Exception ex) + { + return false; + } } /// @@ -1259,50 +1327,86 @@ namespace BPASmartClient.MorkF } } + /// + /// 传感器距离转为菜品数量 + /// + /// + /// + /// + public Laser2CoordinateState LaserDistance2MaterialCount(int distance, out int count) + { + count = 0; + try + { + //菜盒放多了 + if (distance < 6) + { + return Laser2CoordinateState.MaterialOverdo; + } + else if (distance >= 6 && distance < 10) + { + count = 5; + return Laser2CoordinateState.MaterialNormal; + } + else if (distance >= 10 && distance < 14) + { + count = 4; + return Laser2CoordinateState.MaterialNormal; + } + else if (distance >= 14 && distance < 19) + { + count = 3; + return Laser2CoordinateState.MaterialNormal; + } + else if (distance >= 19 && distance < 23) + { + count = 2; + return Laser2CoordinateState.MaterialNormal; + } + else if (distance >= 23 && distance < 28) + { + count = 1; + return Laser2CoordinateState.MaterialNormal; + } + else + { + count = 0; + return Laser2CoordinateState.MaterialEmpty; + } + } + catch (Exception ex) + { + return Laser2CoordinateState.MaterialUnkown; + } + } + /// /// 获取菜品测试 /// /// - private void GetMaterailTest(Coordinate coordinate) + private void GetMaterailTest(MaterialOperation materialOperation) { ThreadManage.GetInstance().Start(new Action(() => { - //int x1 = 0, x2 = 0, y = 0; - - //if (getNum % 2 == 0) - //{ - // x2 = 35000; - // y = 82000; - - //} - //else if (getNum % 2 == 1) - //{ - // x2 = 35000; - // y = 9000; - //} - //else - //{ - // MessageLog.GetInstance.Show("菜品库无效操作"); - // return; - //} + bool ret = false; try { + Coordinate myCoordinate = new Coordinate(); + //获取坐标,根据菜品的位置信息 + if (!NoMaterial2Coordinate(materialOperation.materialInfo.Loc, out myCoordinate)) + { + MessageLog.GetInstance.Show($"炒锅{materialOperation.fryNum}获取菜品[{materialOperation.materialInfo.Name}]失败,找不到对应位置"); + return; + } lock (lock_Materail) { ml_morkf.MaterailIsWorking = true; } //取菜操作 - GetMaterail(coordinate.X, coordinate.Y); - - ////机械臂回原点 - //if (!SetArmPosition(0, 0)) - //{ - // MessageLog.GetInstance.Show("菜品库[机械臂操作失败]"); - // return; - //} + ret =GetMaterail(myCoordinate.X, myCoordinate.Y, materialOperation.fryNum); } catch (Exception ex) { - + ret = false; } finally { @@ -1310,6 +1414,11 @@ namespace BPASmartClient.MorkF { ml_morkf.MaterailIsWorking = false; } + if (ret == true) + { + //指定位置菜品减一 + MaterialSurplusOperation.GetInstance().ReduceSurplus(materialOperation.materialInfo.Loc); + } } }), $"菜品库操作"); @@ -1469,48 +1578,52 @@ namespace BPASmartClient.MorkF Thread.Sleep(200); } //倒菜 - public void OutFood(int num) + public void OutFood(int num,bool isMaterial = false) { if (!morkFs.ContainsKey(num)) { return; } int i = 0; - //判断是否完成取菜 - for (i = 0; i < sleepCount * 2 && !morkFs[num].GetMaterialComplete; i++) + + if(isMaterial) { - if (i == 3) + //判断是否完成取菜 + for (i = 0; i < materialSleepCount && !morkFs[num].GetMaterialComplete; i++) { - //停止搅拌 - StopStir(num); - //火力设置为2档 - SetFire(new List { 2 }, num); + if (i == 10) + { + //停止搅拌 + StopStir(num); + //火力设置为2档 + SetFire(new List { 2 }, num); + } + Thread.Sleep(materialSleepTime); + if (i >= materialSleepCount - 1) + { + MessageLog.GetInstance.Show($"炒锅{num}倒菜超时:未能等到取菜完成"); + return; + } } - Thread.Sleep(sleepTime); - if (i >= sleepCount * 2 - 1) + + if (i > 9) { - MessageLog.GetInstance.Show($"炒锅{num}倒菜超时:未能等到取菜完成"); - return; + //开启搅拌 + StartStir(num); + //火力设置回原本火力 + SetFire(new List { morkFs[num].Fire }, num); } } - if (i > 3) - { - //开启搅拌 - StartStir(num); - //火力设置回原本火力 - SetFire(new List { morkFs[num].Fire }, num); - } - FirePot_Write("LB3", true, num); MessageLog.GetInstance.Show("倒菜启动"); - Thread.Sleep(200); + Thread.Sleep(500); - for (i = 0; i < sleepCount && !morkFs[num].FryPot1_MaterialIntoPot; i++) + for (i = 0; i < materialSleepCount && !morkFs[num].FryPot1_MaterialIntoPot; i++) { - Thread.Sleep(sleepTime); - if (i >= sleepCount - 1) + Thread.Sleep(materialSleepTime); + if (i >= materialSleepCount - 1) { MessageLog.GetInstance.Show($"炒锅{num}倒菜超时"); } @@ -1519,6 +1632,7 @@ namespace BPASmartClient.MorkF FirePot_Write("LB3", false, num); Thread.Sleep(200); MessageLog.GetInstance.Show("倒菜完成"); + morkFs[num].GetMaterialComplete = false; } //搅拌臂去原点位 public void StirArmGoOrigin(int num) @@ -1645,7 +1759,17 @@ namespace BPASmartClient.MorkF FirePot_Write("LB8", true, num); Thread.Sleep(200); } -#endregion + #endregion + + private static object saveMaterialLock = new object(); + private void SaveMaterialData() + { + lock(saveMaterialLock) + { + Json.Data = MaterialSurplusOperation.GetInstance().materialSurplus; + Json.Save(); + } + } bool isInitialArrive = false; @@ -1698,6 +1822,22 @@ namespace BPASmartClient.MorkF }); } } + if(stirFry.stirFrymessage.materials.Count > 0) + { + MaterialSurplusOperation.GetInstance().UpdateSurplusAll(stirFry.stirFrymessage.materials); + //foreach (var item in stirFry.stirFrymessage.materials) + //{ + // MaterialSurplusOperation.GetInstance().materialSurplus.dicSurplus.Add(new MaterialInfo + // { + // Id = item.Id, + // Key = item.Key, + // Name = item.Name, + // Loc = item.Loc, + // Qty = item.Qty, + // }); + //} + SaveMaterialData(); + } } MessageLog.GetInstance.Show("接收到小炒流程信息"); @@ -2005,22 +2145,41 @@ namespace BPASmartClient.MorkF case nameof(StirFryPotActionEnum.取原料): //炒锅取菜状态置为未取到 morkFs[i].GetMaterialComplete = false; - if(getMaterailNum == 0) + if(potActions.MaterialLists != null) { - if (NoMaterial2Coordinate("A2", out myCoordinate)) + foreach (var item in potActions.MaterialLists) { - materialOperationQuenes.Enqueue(new MaterialOperation() { fryNum = i, coordinate = myCoordinate }); - getMaterailNum++; + //通过ID获取有效的菜品对象 + MaterialInfo materialInfo = MaterialSurplusOperation.GetInstance().GetVailedMaterial(item.MaterialId); + if (materialInfo == null) + { + MessageLog.GetInstance.Show($"炒锅{i}获取菜品[{materialInfo.Name}]失败,库存不足"); + continue; + } + + materialOperationQuenes.Enqueue(new MaterialOperation { materialInfo = materialInfo, fryNum = i }); } } - else if(getMaterailNum == 1) + else { - if (NoMaterial2Coordinate("B2", out myCoordinate)) - { - materialOperationQuenes.Enqueue(new MaterialOperation() { fryNum = i, coordinate = myCoordinate }); - getMaterailNum++; - } + MessageLog.GetInstance.Show($"炒锅{i}获取菜品失败,菜品列表为空"); } + //if(getMaterailNum == 0) + //{ + // if (NoMaterial2Coordinate(MaterialCoordinate.MLNumberList[1], out myCoordinate)) + // { + // materialOperationQuenes.Enqueue(new MaterialOperation() { fryNum = i, coordinate = myCoordinate }); + // getMaterailNum++; + // } + //} + //else if(getMaterailNum == 1) + //{ + // if (NoMaterial2Coordinate(MaterialCoordinate.MLNumberList[4], out myCoordinate)) + // { + // materialOperationQuenes.Enqueue(new MaterialOperation() { fryNum = i, coordinate = myCoordinate }); + // getMaterailNum++; + // } + //} MessageLog.GetInstance.Show(potActions.Actions); break; case nameof(StirFryPotActionEnum.开启搅拌): @@ -2047,7 +2206,7 @@ namespace BPASmartClient.MorkF MessageLog.GetInstance.Show(potActions.Actions); break; case nameof(StirFryPotActionEnum.道菜启动): - OutFood(i); + OutFood(i, true); break; case nameof(StirFryPotActionEnum.炒制菜品): Thread.Sleep(potActions.During * 1000); @@ -2099,8 +2258,6 @@ namespace BPASmartClient.MorkF } } - private int testNum = 0; - /// /// 菜品库主流程 /// @@ -2114,13 +2271,13 @@ namespace BPASmartClient.MorkF //待菜品库操作列出队列 if (materialOperationQuenes.TryDequeue(out var res)) { + ml_morkf.MaterailIsWorking = true; MessageLog.GetInstance.Show("开始操作菜品库"); //ThreadManage.GetInstance().Start(new Action(()=>{ // GetMaterail(res.x, res.y, res.fryNum); //}),"菜品库操作"); - GetMaterailTest(res.coordinate); - testNum++; + GetMaterailTest(res); } } } @@ -2194,9 +2351,9 @@ namespace BPASmartClient.MorkF try { - if(dicNoMaterialCoordinate.ContainsKey(no)) + if(MaterialCoordinate.dicNoMaterialCoordinate.ContainsKey(no)) { - coordinate = dicNoMaterialCoordinate[no]; + coordinate = MaterialCoordinate.dicNoMaterialCoordinate[no]; return true; } else @@ -2214,43 +2371,6 @@ namespace BPASmartClient.MorkF } } - /// - /// 每个取菜点的编号与坐标字典 - /// - private static Dictionary dicNoMaterialCoordinate { get; set; } = new Dictionary() - { - {"A1",new Coordinate(){ X = 34500,Y=0} }, - {"A2",new Coordinate(){ X = 34500,Y=9000} }, - {"A3",new Coordinate(){ X = 34500,Y=0} }, - {"B1",new Coordinate(){ X = 34500,Y=0} }, - {"B2",new Coordinate(){ X = 34500,Y=83000} }, - {"B3",new Coordinate(){ X = 34500,Y=0} }, - {"C1",new Coordinate(){ X = 34500,Y=0} }, - {"C2",new Coordinate(){ X = 34500,Y=0} }, - {"C3",new Coordinate(){ X = 34500,Y=0} }, - {"D1",new Coordinate(){ X = 0,Y=0} }, - {"D2",new Coordinate(){ X = 0,Y=0} }, - {"D3",new Coordinate(){ X = 0,Y=0} }, - {"E1",new Coordinate(){ X = 0,Y=0} }, - {"E2",new Coordinate(){ X = 0,Y=0} }, - {"E3",new Coordinate(){ X = 0,Y=0} }, - {"F1",new Coordinate(){ X = 0,Y=0} }, - {"F2",new Coordinate(){ X = 0,Y=0} }, - {"F3",new Coordinate(){ X = 0,Y=0} }, - {"G1",new Coordinate(){ X = 0,Y=0} }, - {"G2",new Coordinate(){ X = 0,Y=0} }, - {"G3",new Coordinate(){ X = 0,Y=0} }, - {"H1",new Coordinate(){ X = 0,Y=0} }, - {"H2",new Coordinate(){ X = 0,Y=0} }, - {"H3",new Coordinate(){ X = 0,Y=0} }, - {"I1",new Coordinate(){ X = 0,Y=0} }, - {"I2",new Coordinate(){ X = 0,Y=0} }, - {"I3",new Coordinate(){ X = 0,Y=0} }, - {"J1",new Coordinate(){ X = 0,Y=0} }, - {"J2",new Coordinate(){ X = 0,Y=0} }, - {"J3",new Coordinate(){ X = 0,Y=0} }, - }; - public enum Laser2CoordinateState { MaterialOverdo = 0,//菜品过量 diff --git a/BPASmartClient.MorkF/Model/MaterialCoordinate.cs b/BPASmartClient.MorkF/Model/MaterialCoordinate.cs new file mode 100644 index 00000000..5b00b0a1 --- /dev/null +++ b/BPASmartClient.MorkF/Model/MaterialCoordinate.cs @@ -0,0 +1,77 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace BPASmartClient.MorkF.Model +{ + internal class MaterialCoordinate + { + public static List MLNumberList = new List() { "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16" + , "17", "18", "19", "20", "21", "22", "23", "24", "25", "26", "27" }; + + public static List MLCoordinateList = new List() + { new Coordinate() { X = 34500, Y = 0 }, new Coordinate() { X = 34500, Y = 9000 } , new Coordinate() { X = 34500, Y = 0 } , //第1层 + new Coordinate(){ X = 34500,Y=0} , new Coordinate() { X = 34500, Y = 83000 }, new Coordinate(){ X = 34500,Y=0}, //第1层 + new Coordinate(){ X = 34500,Y=0} , new Coordinate() { X = 34500, Y = 0 }, new Coordinate(){ X = 34500,Y=0}, //第1层 + new Coordinate(){ X = 0,Y=0} , new Coordinate() { X = 0, Y = 0 }, new Coordinate(){ X = 0,Y=0}, //第2层 + new Coordinate(){ X = 0,Y=0} , new Coordinate() { X = 0, Y = 0 }, new Coordinate(){ X = 0,Y=0}, //第2层 + new Coordinate(){ X = 0,Y=0} , new Coordinate() { X = 0, Y = 0 }, new Coordinate(){ X = 0,Y=0}, //第2层 + new Coordinate(){ X = 0,Y=0} , new Coordinate() { X = 0, Y = 0 }, new Coordinate(){ X = 0,Y=0}, //第3层 + new Coordinate(){ X = 0,Y=0} , new Coordinate() { X = 0, Y = 0 }, new Coordinate(){ X = 0,Y=0}, //第3层 + new Coordinate(){ X = 0,Y=0} , new Coordinate() { X = 0, Y = 0 }, new Coordinate(){ X = 0,Y=0} //第3层 + }; + + public MaterialCoordinate() + { + if(MLNumberList.Count == MLCoordinateList.Count && MLNumberList.Count == 27) + { + for(int i = 0;i + /// 每个取菜点的编号与坐标字典 + /// + public static Dictionary dicNoMaterialCoordinate { get; set; } = new Dictionary(); + //{ + // {"A1",new Coordinate(){ X = 34500,Y=0} }, + // {"A2",new Coordinate(){ X = 34500,Y=9000} }, + // {"A3",new Coordinate(){ X = 34500,Y=0} }, + // {"B1",new Coordinate(){ X = 34500,Y=0} }, + // {"B2",new Coordinate(){ X = 34500,Y=83000} }, + // {"B3",new Coordinate(){ X = 34500,Y=0} }, + // {"C1",new Coordinate(){ X = 34500,Y=0} }, + // {"C2",new Coordinate(){ X = 34500,Y=0} }, + // {"C3",new Coordinate(){ X = 34500,Y=0} }, + // {"D1",new Coordinate(){ X = 0,Y=0} }, + // {"D2",new Coordinate(){ X = 0,Y=0} }, + // {"D3",new Coordinate(){ X = 0,Y=0} }, + // {"E1",new Coordinate(){ X = 0,Y=0} }, + // {"E2",new Coordinate(){ X = 0,Y=0} }, + // {"E3",new Coordinate(){ X = 0,Y=0} }, + // {"F1",new Coordinate(){ X = 0,Y=0} }, + // {"F2",new Coordinate(){ X = 0,Y=0} }, + // {"F3",new Coordinate(){ X = 0,Y=0} }, + // {"G1",new Coordinate(){ X = 0,Y=0} }, + // {"G2",new Coordinate(){ X = 0,Y=0} }, + // {"G3",new Coordinate(){ X = 0,Y=0} }, + // {"H1",new Coordinate(){ X = 0,Y=0} }, + // {"H2",new Coordinate(){ X = 0,Y=0} }, + // {"H3",new Coordinate(){ X = 0,Y=0} }, + // {"I1",new Coordinate(){ X = 0,Y=0} }, + // {"I2",new Coordinate(){ X = 0,Y=0} }, + // {"I3",new Coordinate(){ X = 0,Y=0} }, + // {"J1",new Coordinate(){ X = 0,Y=0} }, + // {"J2",new Coordinate(){ X = 0,Y=0} }, + // {"J3",new Coordinate(){ X = 0,Y=0} }, + //}; + } +} diff --git a/BPASmartClient.MorkF/MaterialOperation.cs b/BPASmartClient.MorkF/Model/MaterialOperation.cs similarity index 66% rename from BPASmartClient.MorkF/MaterialOperation.cs rename to BPASmartClient.MorkF/Model/MaterialOperation.cs index 130546bd..9beb7e10 100644 --- a/BPASmartClient.MorkF/MaterialOperation.cs +++ b/BPASmartClient.MorkF/Model/MaterialOperation.cs @@ -1,4 +1,5 @@ -using System; +using BPA.Models; +using System; using System.Collections.Generic; using System.Linq; using System.Text; @@ -20,6 +21,18 @@ namespace BPASmartClient.MorkF { public Coordinate coordinate { get; set; } = new Coordinate(); + /// + /// 菜品编号 + /// + public string id; + + /// + /// 菜品位置 + /// + public string loc; + + public MaterialInfo materialInfo; + /// /// 炒锅编号 /// diff --git a/BPASmartClient.MorkF/Model/MaterialSurplus.cs b/BPASmartClient.MorkF/Model/MaterialSurplus.cs new file mode 100644 index 00000000..494110b8 --- /dev/null +++ b/BPASmartClient.MorkF/Model/MaterialSurplus.cs @@ -0,0 +1,206 @@ +using BPA.Helper; +using BPA.Models; +using BPASmartClient.MorkF.Model; +using System; +using System.Collections.Concurrent; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace BPASmartClient.MorkF +{ + internal class MaterialSurplusOperation : Singleton + { + public MaterialSurplus materialSurplus { get; set; } = new MaterialSurplus(); + + /// + /// 更新余量 + /// + /// 编号 + /// 余量 + public bool UpdateSurplus(string id, int surplus) + { + //找到所有id对应的 + MaterialInfo material = materialSurplus.dicSurplus.Find(t => t.Id == id); + if(material == null) + { + return false; + } + else + { + material.Qty = decimal.Parse(surplus.ToString()); + return true; + } + } + + /// + /// 返回有效的菜品库对象 + /// + /// + /// + public MaterialInfo GetVailedMaterial(string id) + { + int surplus = 0; + //获取该菜品所有的余量 + if(!GetAllSurplus(id,out surplus)) + { + return null; + } + + //判断库存数量是否有效 + if(surplus <= 0) + { + return null; + } + + return GetMaterial(id); + } + + /// + /// 根据编号返回余量 + /// + /// 编号 + /// 余量 + /// + private MaterialInfo GetMaterial(string id) + { + //找到所有id对应的 + MaterialInfo material = materialSurplus.dicSurplus.Find(t => t.Id == id && t.Qty != 0); + + return material; + } + + /// + /// 根据编号返回余量 + /// + /// 编号 + /// 余量 + /// + private bool GetAllSurplus(string id, out int surplus) + { + surplus = 0; + //找到所有id对应的 + List materials = materialSurplus.dicSurplus.FindAll(t=>t.Id == id); + if (materials != null) + { + foreach(MaterialInfo material in materials) + { + surplus += int.Parse(material.Qty.ToString()); + } + return true; + } + else + { + return false; + } + } + + /// + /// 余量减少 + /// + /// + /// + public bool ReduceSurplus(string loc) + { + MaterialInfo materialInfo = materialSurplus.dicSurplus.Find(t => t.Loc == loc); + if (materialInfo != null) + { + materialInfo.Qty--; + return true; + } + else + { + return false; + } + } + + /// + /// 余量增加 + /// + /// + /// + public bool AddSurplus(string loc) + { + MaterialInfo materialInfo = materialSurplus.dicSurplus.Find(t => t.Loc == loc); + if (materialInfo != null) + { + materialInfo.Qty++; + return true; + } + else + { + return false; + } + } + + /// + /// + /// + /// + public void UpdateSurplusAll(List newMaterialSurplus) + { + if (newMaterialSurplus != null) + { + List materialInfos = materialSurplus.dicSurplus; + if(materialInfos.Count != newMaterialSurplus.Count) + { + materialInfos.Clear(); + materialSurplus.dicSurplus = newMaterialSurplus; + } + else + { + MaterialInfo findMaterial = null; + //遍历旧菜品库,是否与服务器的新菜品库一致 + foreach (MaterialInfo materialInfo in materialSurplus.dicSurplus) + { + //查找该菜品是否还在 + findMaterial = newMaterialSurplus.Find(t => (t.Id == materialInfo.Id && t.Loc == materialInfo.Loc)); + //不存在则准备移除 + if (findMaterial == null) + { + //查找该菜品是否还在 + //位置上的菜品可能会更变 + findMaterial = newMaterialSurplus.Find(t => (t.Loc == materialInfo.Loc)); + if (findMaterial != null) + { + materialInfo.Qty = findMaterial.Qty; + materialInfo.Key = findMaterial.Key; + materialInfo.Id = findMaterial.Id; + materialInfo.Name = findMaterial.Name; + } + } + //存在则更新菜品库数据 + else + { + materialInfo.Qty = findMaterial.Qty; + materialInfo.Key = findMaterial.Key; + materialInfo.Name = findMaterial.Name; + } + } + } + } + else + { + //materialSurplus.dicSurplus.Clear(); + } + } + } + internal class MaterialSurplus + { + /// + /// 余量字典,key:菜品库编号,value:余量 + /// + public List dicSurplus = new List(); + + //public MaterialSurplus() + //{ + // //增加新的 + // foreach (var item in MaterialCoordinate.MLNumberList) + // { + // dicSurplus.Add(item, 0); + // } + //} + + } +}