using Microsoft.EntityFrameworkCore;
using Newtonsoft.Json;
using OfficeOpenXml.FormulaParsing.Excel.Functions.Text;
using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using WIDESEA_Comm;
using WIDESEA_Comm.LogInfo;
using WIDESEA_Comm.MES_Info;
using WIDESEA_Comm.MES_Info.Request;
using WIDESEA_Comm.TaskNo;
using WIDESEA_Common;
using WIDESEA_Core.BaseProvider;
using WIDESEA_Core.EFDbContext;
using WIDESEA_Core.ManageUser;
using WIDESEA_Core.Utilities;
using WIDESEA_Entity.DomainModels;
using WIDESEA_Entity.DomainModels.Mes;
using WIDESEA_WMS.Common;
using WIDESEA_WMS.IRepositories;
using WIDESEA_WMS.Repositories;
using static WIDESEA_Comm.MES_Info.BasicSN;
namespace WIDESEA_WMS
{
public partial class ToMesServer
{
///
/// 人工出库
///
///
///
public WebResponseContent Outsource(SaveModel saveModel)
{
WebResponseContent content = new WebResponseContent();
VOLContext context = new VOLContext();
Idt_inventoryRepository inventoryRepository = new dt_inventoryRepository(context);
Idt_stationinfoRepository stationinfoRepository = new dt_stationinfoRepository(context);
string sn = saveModel.MainData["dataSN"].ToString(); //车轮SN号
string user = saveModel.MainData["creator"].ToString();
string str = "";
try
{
List list = new List();
foreach (var SN in sn.Split(","))
{
if (!string.IsNullOrEmpty(SN))
list.Add(SN);
}
var inventoryList = inventoryRepository.Find(x => list.Contains(x.SN)).ToList();
foreach (var inventorys in inventoryList.GroupBy(x => x.stationCode))
{
try
{
List lists = new List();
foreach (var inventory in inventorys)
{
detail detail = new detail();
detail.sn = inventory.SN;
lists.Add(detail);
str += str == "" ? inventory.SN : "," + inventory.SN;
}
agvInWarehousePara outWarehousePara = new agvInWarehousePara()
{
//WorkOrder = task.jobID,
zoneID = inventorys.Key,
//processCode = task.agv_worktype.ToString(),
details = lists,
layerNo = 1,
stackID = "1",
warehouseName = "Agv库",
Operator = UserContext.Current.UserName,
};
var postJson = JsonConvert.SerializeObject(outWarehousePara);
var mesData = Request.RequestData(postJson, MESAPIAddress.IPAddress_MES + "agvOutWarehouse");
if (mesData.Contains("连接尝试失败")) throw new Exception(mesData);
MES_Response requestMes = JsonConvert.DeserializeObject(mesData);
if (requestMes.code == "200" && requestMes.Type == "success")
{
//日志记录上传数据成功
WriteWMSLog.LogAdd("", "成功", "MES", "PDA", postJson, mesData, "人工同步MES车轮出库", "agvOutWarehouse", requestMes.message);
foreach (var inventory in inventorys)
{
var station = stationinfoRepository.Find(x => x.stationCode == inventory.stationCode).FirstOrDefault();
station.quantity = station.quantity - 1;
if (station.quantity == 0)
{
station.stationType = string.Empty;
station.heatNumber = string.Empty;
station.Number = string.Empty;
station.billetID = string.Empty;
station.bindSN = string.Empty;
station.enable = false;
station.tray_status = string.Empty;
station.location_state = LocationStateEnum.Empty.ToString();
}
else
{
var bindSNS = station.bindSN.Split(",");
station.bindSN = OperStr(bindSNS, inventory.SN);
var billetS = station.billetID.Split(",");
station.billetID = OperStr(billetS, inventory.BilletNumber.ToString());
}
#region 取消跟踪DbContext中被跟踪的实体
var currentEntry = stationinfoRepository.DbContext.ChangeTracker.Entries().FirstOrDefault();
if (currentEntry != null) currentEntry.State = EntityState.Detached;
#endregion
stationinfoRepository.Update(station, true);
inventoryRepository.Delete(inventory, true);
}
WriteDBLog.Write($"人工出库成功 ", $"货位编号:{inventorys.Key};SN号:{str}", LogState.Sucess, "PDA", user);
}
else
{
WriteWMSLog.LogAdd("", "失败", "MES", "PDA", postJson, mesData, "人工同步MES车轮出库", "agvOutWarehouse", requestMes.message);
throw new Exception("人工出库同步MES车轮出库失败!" + requestMes.message);
}
}
catch (Exception ex)
{
content.Message = ex.Message;
WriteDBLog.Write($"人工出库失败 ", new { 错误信息 = ex.Message, 数据 = str }, LogState.Error, "PDA", user);
}
}
content.OK();
}
catch (Exception ex)
{
content.Error($"人工出库失败!:{ex.Message}");
WriteDBLog.Write($"人工出库失败 ", new { 错误信息 = ex.Message, 数据 = sn }, LogState.Error, "PDA", user);
}
return content;
}
public static string OperStr(string[] strArrty, string SN)
{
string[] newstr = strArrty.Where(x => x != SN).ToArray();
string Newsn = string.Join(",", newstr);
return Newsn;
}
///
/// 外协出库(检测上料)
///
///
///
public WebResponseContent OutsourceInbound(SaveModel saveModel)
{
WebResponseContent content = new WebResponseContent();
try
{
string stationNo = saveModel.MainData["stationNo"].ToString(); //缓存架编号
if (string.IsNullOrEmpty(stationNo)) return content.Error("请选择下料口!");
string user = saveModel.MainData["creator"].ToString();
string sn = saveModel.MainData["dataSN"].ToString(); //车轮SN号
#region 判断SN号长度、是否存在相同SN号
bool strOK = false;
bool SNOK = false;
for (int i = 1; i < sn.Split(",").Length; i++)
{
for (int j = 0; j < i; j++)
{
if (sn.Split(",")[j] == sn.Split(",")[i])
strOK = true;
if (sn.Split(",")[j].Length != 10)
SNOK = true;
}
}
if (strOK)
return content.Error("存在相同SN号的车轮信息!请重新扫描!");
if (SNOK)
return content.Error("车轮SN号有误!请重新扫描!");
#endregion
//dt_mes_detail info = null;
//dt_mes_head mes_head = null;
VV_Mes_Workinfo mes_Work = null;
int count = 0; //车轮数量
string bindSN = "";
List list = new List();
foreach (var SN in sn.Split(","))
{
if (!string.IsNullOrEmpty(SN))
list.Add(SN);
}
foreach (var item in list)
{
if (item != null)
{
count++;
bindSN += bindSN == "" ? item : "," + item;
mes_Work = freeDB.Select().Where(x => x.SN == item && x.processCode == "28").First();
if (mes_Work == null)
return content.Error($"第{count}个车轮无检测上料工单信息,请核查工单后在扫描!");
//info = freeDB.Select().Where(x => x.SN == item).First();
//if (info == null)
// return content.Error($"第{count}个车轮无检测上料工单详情,请核查工单后在扫描!");
//mes_head = freeDB.Select().Where(x => x.jobID == info.jobID && x.processCode == "28").First();
//if (mes_head == null)
// return content.Error($"第{count}个车轮无检测上料工单信息,请核查工单后在扫描!");
}
}
VOLContext Context = new VOLContext();
Idt_stationinfoRepository stationinfoRepository = new dt_stationinfoRepository(Context);
var station = freeDB.Select().Where(x => x.stationCode == stationNo).First();
if (freeDB.Select().Where(x => x.agv_fromaddress == station.stationCode).Any())
return content.Error($"下料口{stationNo}存在AGV任务,请核实!");
if (!station.enable)
return content.Error($"下料口{stationNo}被禁用,请核实!");
station.quantity = count;
station.bindSN = bindSN;
station.stationType = mes_Work.drawingNo;
station.location_state = "Stroge";
station.Number = mes_Work.jobID;
if (mes_Work.heatID != null)
station.heatNumber = mes_Work.heatID;
station.tray_status = "StrogeTray";
stationinfoRepository.Update(station, true);
#region MyRegion
//dt_agvtask agvtask = new dt_agvtask
//{
// //agv_barcode = stationNo,
// //agv_code = user,
// agv_createtime = DateTime.Now,
// agv_fromaddress = stationNo,
// agv_qty = i,
// agv_grade = 1,
// agv_tasktype = AGVTaskTypeEnum.TaskType_Inbound.ToString(),
// agv_taskstate = AGVTaskStateEnum.Create.ToString(),
// agv_toaddress = "",
//};
#endregion
dt_agvtask agvtask = new dt_agvtask()
{
agv_fromaddress = station.stationCode,
agv_id = Guid.NewGuid(),
agv_tasknum = IdenxManager.GetTaskNo("KH-", "WMS"),
agv_grade = 3,
agv_createtime = DateTime.Now,
agv_taskstate = "Queue",
agv_materielid = station.stationType,
agv_qty = station.quantity,
agv_tasktype = "TaskType_OutsourceOutbound",
agv_toaddress = "",
agv_userid = user,//"系统",
jobID = mes_Work.jobID,
bindSN = station.bindSN,
agv_worktype = Convert.ToInt32(mes_Work.processCode),
agv_materbarcode = mes_Work.materialCode,
agv_Traytype = station.tray_type,
agv_TrayStatus = station.tray_status
};
freeDB.Add(agvtask);
return content.OK();
}
catch (Exception ex)
{
return content.Error($"呼叫AGV失败:{ex.Message}");
}
}
}
}