shgx_tz_mom/ZR.Service/mes/mm/MaterialInputService.cs

449 lines
18 KiB
C#
Raw Normal View History

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