using Infrastructure.Attribute; using Microsoft.Extensions.DependencyInjection; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using ZR.Model.MES.op.ZR.Model.mes.md; using ZR.Service.MES.op.IService; using ZR.Service; using ZR.Service.mes.mm.IService; using ZR.Model.MES.mm; using ZR.Model.MES.pro; using System.Globalization; using static System.Runtime.InteropServices.JavaScript.JSType; using ZR.Model.MES.mm.Dto; using SqlSugar; using Microsoft.Extensions.Hosting; using ZR.Model; using ZR.Model.MES.wms; using System.Text.Json; using Infrastructure; using ZR.Repository; using System.Numerics; using ZR.Model.mes.pro; 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 = query.datetimespan; // 获取年份和周数 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 开始的数字 //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 = workorder.PreviousNumber; 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.ClientWorkorder) .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) { 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) { // 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"; // 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(); } } }); 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; } } }