using Infrastructure; using Infrastructure.Attribute; using SqlSugar; using System; using System.Globalization; using System.Linq; using System.Text.Json; using ZR.Model.MES.mm; using ZR.Model.MES.mm.Dto; using ZR.Model.MES.pro; using ZR.Model.MES.wms; using ZR.Service.mes.mm.IService; namespace ZR.Service.mes.mm { [AppService(ServiceType = typeof(IMaterialInputService), ServiceLifetime = LifeTime.Transient)] public class MaterialInputService : BaseService, IMaterialInputService { private NLog.Logger logger; public MaterialInputService() { logger = NLog.LogManager.GetCurrentClassLogger(); } /// /// 获取AGV上料起点 /// /// public string[] Getstart_AGV_points() { List positions = Context .Queryable() .Where(it => it.AreaCode == 2) .Where(it => it.Type == 0) .ToList(); string[] cors = new string[positions.Count]; for (int i = 0; i < positions.Count; i++) cors[i] = positions[i].Coordinate.ToString(); return cors; } /// /// 获取AGV上料终点 /// /// public string[] Getend_AGV_points() { List positions = Context .Queryable() .Where(it => it.AreaCode == 2) .Where(it => it.Type == 1) .ToList(); string[] cors = new string[positions.Count]; for (int i = 0; i < positions.Count; i++) cors[i] = positions[i].Coordinate.ToString(); return cors; } /// /// 获取工单列表 /// /// /// public (List, int) Getworkorderlist(WorkorderqueryDto query) { DateTime datetimespan = new DateTime( query.datetimespan.Year, query.datetimespan.Month, query.datetimespan.Day, 0, 0, 0 ); // 获取年份和周数 Calendar calendar = new GregorianCalendar(); int year = calendar.GetYear(datetimespan); int week = calendar.GetWeekOfYear( datetimespan, CalendarWeekRule.FirstFourDayWeek, DayOfWeek.Sunday ); // 获取这一周中的第几天 DayOfWeek dayOfWeek = datetimespan.DayOfWeek; int dayOfWeekNumber = (int)dayOfWeek; // 将 DayOfWeek 枚举转换为从 1 开始的数字 Console.WriteLine( "<-获取工单列表-> " + year + "年" + week + "周" + dayOfWeekNumber + "日" ); logger.Error("<-获取工单列表-> " + year + "年" + week + "周" + dayOfWeekNumber + "日"); //todo 已经和正在配料的工单号和毛坯号不能变?????? int total = 0; List WorkorderList = Context .Queryable() .Where(it => it.Year == year) .Where(it => it.Week == week) .Where(it => it.Date == dayOfWeekNumber) .Where(it => it.Remark3 == "是" || it.Remark1 == "调试") .ToList(); // .ToPageList(query.pageNum??1, query.pageSize??10, ref total); foreach (ProWorkorder_v2 workorder in WorkorderList) { if (string.IsNullOrEmpty(workorder.ClientWorkorder)) { workorder.ClientWorkorder = "调试:" + workorder.Id; } // 配料任务 bool isExist = Context .Queryable() .Where(it => it.FkWorkorder == workorder.ClientWorkorder) .Where(it => it.FkBlanknumber == workorder.BlankNumber) .Any(); if (!isExist) { //插入配料任务 MmFkWorkorderIngredient ingredient = new MmFkWorkorderIngredient(); ingredient.FkWorkorder = workorder.ClientWorkorder ?? ("调试:" + workorder.Id); ingredient.FkBlanknumber = workorder.BlankNumber; ingredient.Isingredient = 0; ingredient.Previous_numbered = 0; ingredient.CreatedTime = DateTime.Now; Context.Insertable(ingredient).ExecuteCommand(); } else { // todo 有个漏洞 如果计划单 修改数量 remian 就不对 var ingredient = Context .Queryable() .Where(it => it.FkWorkorder == workorder.ClientWorkorder) .Where(it => it.FkBlanknumber == workorder.BlankNumber) .First(); if (ingredient != null) { workorder.PreviousNumber = workorder.PreviousNumber - (ingredient.Previous_numbered ?? 0); } } } WorkorderList.RemoveAll(num => num.PreviousNumber <= 0); total = WorkorderList.Count; int skip = ((query.pageNum ?? 1) - 1) * (query.pageSize ?? 10); var returndata = WorkorderList .OrderBy(it => it.Sort) .Skip(skip) .Take(query.pageSize ?? 10) .ToList(); return (returndata, total); } /// /// 生成任务单 /// /// /// public int Generatetask(IngredientTaskDto task, string name) { List ingredientTasks = new List(); long taskid = SnowFlakeSingle.Instance.NextId(); foreach (var item in task.workorders) { //todo 更改待上料数量 int remian = item.previousNumber - item.previousNumbered; if (remian == 0) { //更改配料进度为完成 int result = Context .Updateable() .Where(it => it.FkWorkorder == item.workorder) .Where(it => it.FkBlanknumber == item.blanknumber) .SetColumns(it => it.Previous_numbered == item.previousNumbered) .SetColumns(it => it.Isingredient == 1) .SetColumns(it => it.UpdatedTime == DateTime.Now) .ExecuteCommand(); } else { //更改配料进度 修改配料进度 Context .Updateable() .Where(it => it.FkWorkorder == item.workorder) .Where(it => it.FkBlanknumber == item.blanknumber) .SetColumns(it => it.Previous_numbered == item.previousNumbered) .SetColumns(it => it.UpdatedTime == DateTime.Now) .SetColumns(it => it.Isingredient == 0) .ExecuteCommand(); } MmIngredientTask ingredientTask = new MmIngredientTask(); ingredientTask.AgvPosition = task.agv_position; ingredientTask.TaskId = taskid.ToString(); ingredientTask.Workorder = item.workorder; ingredientTask.Blanknumber = item.blanknumber; ingredientTask.Isfinal = 0; ingredientTask.PreviousNumber = item.previousNumber; ingredientTask.PreviousNumbered = item.previousNumbered; ingredientTask.CreatedBy = name; ingredientTask.CreatedTime = DateTime.Now; ingredientTasks.Add(ingredientTask); } return Context.Insertable(ingredientTasks).ExecuteCommand(); } /// /// 获取配料任务 /// /// /// public List GetIngredientTask(IngredientTaskQueryDto queryParams) { // 获取当天的开始时间 DateTime startOfDay = queryParams.datetimespan.Date; // 获取当天的结束时间 DateTime endOfDay = startOfDay.AddDays(1).AddTicks(-1); return Context .Queryable() .Where(it => it.CreatedTime > startOfDay && it.CreatedTime < endOfDay) .Where(it => it.Isfinal == 0) .GroupBy(it => it.TaskId) .Select(it => new MmIngredientTask() { TaskId = it.TaskId, AgvPosition = SqlFunc.AggregateMax(it.AgvPosition), CreatedTime = SqlFunc.AggregateMax(it.CreatedTime) }) .ToList(); } /// /// 获取配料任务(son) 详细情况 /// /// /// public List GetIngredientTaskSon(string taskId) { return Context.Queryable().Where(it => it.TaskId == taskId).ToList(); } /// /// 获取车间上料终点 /// /// public string[] Getfabgopoints() { return Context .Queryable() .Where(it => it.AreaCode == 3) .Select(it => it.Coordinate) .ToArray(); } /// /// agv从仓库到车间 进料 /// /// /// /// public string AGV_schedule(string start_point, string end_point, string agvCode = "1743") { // Context.Updateable().Where(it => it.Coordinate == start_point).SetColumns(it => it.Status == 0).ExecuteCommand(); // Context.Updateable().Where(it => it.Coordinate == end_point).SetColumns(it => it.Status == 1).ExecuteCommand(); string url = "https://192.168.60.1:443/rcms/services/rest/hikRpcService/genAgvSchedulingTask"; logger.Info(" 1.任务调度请求url " + url); AGVtask_third task = new AGVtask_third(); task.reqCode = SnowFlakeSingle.Instance.NextId().ToString(); task.taskTyp = "F01"; task.agvCode = agvCode.Trim(); // MmAgvLocation start_object = Context.Queryable().Where(it => it.Coordinate == start_point).First(); // MmAgvLocation end_object = Context.Queryable().Where(it => it.Coordinate == end_point).First(); //判断是否跨楼层 if (end_point == "R1" || start_point == "R1") { task.taskTyp = "KLC"; } task.positionCodePath = new List { new AGV_location_third() { positionCode = start_point, type = "00" }, new AGV_location_third() { positionCode = end_point, type = "00" } }; task.podDir = "0"; task.priority = "1"; string postData = JsonSerializer.Serialize(task); logger.Info(" 2.任务调度请求数据 " + postData); string response = HttpHelper.HttpPost(url, postData); logger.Info(" 3.任务调度请求响应 " + response); return response; } /// /// 紧急终止AGV /// /// public string EmergencyStopAgv(string reqCode) { logger.Info("\n 0.取消任务taskcode= " + reqCode); string url = "https://192.168.60.1:443/rcms/services/rest/hikRpcService/cancelTask"; logger.Info(" 1.紧急终止AGV请求url " + url); AGVtask_cancel_third req = new AGVtask_cancel_third(); req.reqCode = SnowFlakeSingle.Instance.NextId().ToString(); req.forceCancel = "0"; req.taskCode = reqCode; string postData = JsonSerializer.Serialize(req); logger.Info(" 2.紧急终止AGV请求数据 " + postData); string response = HttpHelper.HttpPost(url, postData); logger.Info(" 3.紧急终止AGV响应数据 " + response); return response; } /// /// 完成配料任务 /// 1.更改站点托盘 /// 2.完成的配料任务不可见 /// /// public int FinishBatchingTask(string start_point, string end_point, string taskId) { int result = 0; UseTran2(() => { // Context.Updateable().Where(it => it.Coordinate == start_point).SetColumns(it => it.Status == 0).ExecuteCommand(); // Context.Updateable().Where(it => it.Coordinate == end_point).SetColumns(it => it.Status == 1).ExecuteCommand(); result = Context .Updateable() .Where(it => it.TaskId.Equals(taskId)) .SetColumns(it => it.Isfinal == 1) .ExecuteCommand(); List tasks = Context .Queryable() .Where(it => it.TaskId.Equals(taskId)) .ToList(); for (int i = 0; i < tasks.Count; i++) { if (!string.IsNullOrEmpty(tasks[i].Workorder)) { Context .Updateable() .Where(it => it.ClientWorkorder == tasks[i].Workorder) .SetColumns(it => it.Status == 1) .ExecuteCommand(); } } //查询毛坯号 List TO_blankList = Context .Queryable() .Where(it => it.TaskId == taskId) .ToList(); foreach (var task in TO_blankList) { if (!string.IsNullOrEmpty(task.Blanknumber)) { WmBlankInventory blankInventory = Context .Queryable() .Where(it => it.BlankNum == task.Blanknumber) // 默认毛坯扣除 .Where(it => it.Type == 1) .Where(it => it.Status == 1) .First(); if (blankInventory == null) { continue; } //1 扣除库存 Context .Updateable() .SetColumns(it => it.Quantity == it.Quantity - task.PreviousNumbered) .Where(it => it.Id == blankInventory.Id) .ExecuteCommand(); //2 增加库存记录 WmBlankRecord res = new WmBlankRecord(); res.Id = SnowFlakeSingle.Instance.NextId().ToString(); res.FkBlankInventoryId = blankInventory.Id; res.BlankNum = task.Blanknumber; res.ChangeQuantity = task.PreviousNumbered; res.Type = 3; res.Status = 1; res.ActionTime = DateTime.Now; res.CreatedBy = "PDA上料"; res.CreatedTime = DateTime.Now; //填写库存记录 Context.Insertable(res).ExecuteCommand(); } } }); return result; } /// /// 车间返程起点 /// /// public string[] Emptycarreturn_start() { List positions = Context .Queryable() .Where(it => it.AreaCode == 3) .ToList(); string[] cors = new string[positions.Count]; for (int i = 0; i < positions.Count; i++) cors[i] = positions[i].Coordinate.ToString(); return cors; } /// /// 车间返程终点 /// /// public string[] Emptycarreturn_end() { List positions = Context .Queryable() .Where(it => it.AreaCode == 2) .ToList(); string[] cors = new string[positions.Count]; for (int i = 0; i < positions.Count; i++) cors[i] = positions[i].Coordinate.ToString(); return cors; } } }