using AngleSharp.Io;
using COSXML.Network;
using Elastic.Clients.Elasticsearch;
using Elastic.Clients.Elasticsearch.Inference;
using Furion.Logging;
using NewLife.Http;
using Newtonsoft.Json;
using System.Diagnostics.CodeAnalysis;
using System.Linq;
using System.Text;
using WCS.Application.Entity;
namespace WCS.Application;
///
/// 示例开放接口
///
[ApiDescriptionSettings("开放接口", Name = "Demo", Order = 100)]
//[Authorize(AuthenticationSchemes = SignatureAuthenticationDefaults.AuthenticationScheme)]
[AllowAnonymous]
public class DemoOpenApi : IDynamicApiController
{
private static readonly ISqlSugarClient _db = SqlSugarSetup.ITenant.GetConnectionScope(SqlSugarConst.MainConfigId);
private readonly UserManager _userManager;
public DemoOpenApi(UserManager userManager)
{
_userManager = userManager;
}
//[HttpGet("helloWord")]
//public Task HelloWord()
//{
// return Task.FromResult($"Hello word. {_userManager.Account}");
//}
//
/// WCS接受WMS下发的任务
///
/// 任务信息
/// 反馈信息
[AllowAnonymous]
public ResponseModel AddWcsTasks(List modelList)
{
ResponseModel result = new ResponseModel();
result.StatusCode = 0;
try
{
foreach (var models in modelList)
{
var res = AddWcsTask(models);
if (res.StatusCode == -1)
{
result.StatusCode = -1;
result.Msg = res.Msg;
}
else if (res.StatusCode == 0)
{
result.StatusCode = 0;
result.Msg = models.TaskNo + "任务" + res.Msg;
}
}
}
catch (Exception ex)
{
return new ResponseModel() { StatusCode = -1, Msg = ex.Message };
}
return result;
}
///
/// WCS接受WMS下发的任务(单条任务)
///
/// 任务信息
/// 反馈信息
[AllowAnonymous]
public ResponseModel AddWcsTask(ResponseTasksModel models)
{
ResponseModel result = new ResponseModel();
try
{
// 验证任务是否已存在
var taskInfo = _db.Queryable().First(w => w.TaskNo == models.TaskNo);
if (taskInfo != null)
{
result.StatusCode = -1;
result.Msg = "任务:" + models.TaskNo + ";已存在!";
return result;
}
if (models.TaskType == "0")
{
models.Order = 1;
}
else
{
models.Order = 2;
}
int aaa = int.Parse(models.TaskType);
var taskAdd = new WcsTask()
{
TaskNo = models.TaskNo,
TaskType = (TaskTypeEnum)aaa,
Status = TaskStatusEnum.Wait,
//IsSuccess =TaskSuccessEnum.Success,
Origin = "WMS",
StartRoadway = models.StartRoadway,
StartLocate = models.StartLocate,
EndLocate = models.EndLocate,
EndRoadway = models.EndRoadway,
PalletNo = models.PalletNo,
Levels = 999
//LotNo =models.LotNo,
//SkuNo=models.SkuNo,
//SkuName=models.SkuName,
//Qty=models.Qty
};
_db.Insertable(taskAdd).ExecuteCommand();
return new ResponseModel() { StatusCode = 0, Msg = "插入成功" };
}
catch (Exception ex)
{
return new ResponseModel() { StatusCode = -1, Msg = ex.Message };
}
}
///
/// WCS接收WMS下发的入库单任务
///
///
///
[AllowAnonymous]
public ResponseModel AddOrderTask(List models)
{
ResponseModel result = new ResponseModel();
try
{
foreach (var item in models)
{
// 验证任务是否已存在
//var taskInfo = _db.Queryable().First(w => w.OrderNo == item.OrderNo && w.SkuNo == item.SkuNo && w.LotNo == item.LotNo);
//if (taskInfo == null)
//{
var orderAdd = new WcsOderTask()
{
OrderNo = item.OrderNo.Trim(),
TaskNo = "",
LotNo = item.LotNo.Trim(),
SkuNo = item.SkuNo.Trim(),
SkuName = item.SkuName.Trim(),
BoxType = item.BoxType,
Qty = item.Qty,
TaskType = (TaskTypeEnum)item.TaskType,
Status=TaskStatusEnum.Wait
};
_db.Insertable(orderAdd).ExecuteCommand();
//}
}
return new ResponseModel() { StatusCode = 0, Msg = "插入成功" };
}
catch (Exception ex)
{
return new ResponseModel() { StatusCode = -1, Msg = ex.Message };
}
}
///
/// 获取空托盘垛申请入库工位
///
///
[AllowAnonymous]
[HttpPost]
public ResponseModel GetNullPalletRukuStation()
{
try
{
string rukuAdress = "";
var conveyList4 = new List() { "266", "265" };//四楼入库工位
foreach (var item in conveyList4)
{
// 根据目标工位号获取输送线链接
var plcCconn = PLCCommon.GetPlcIp(item);
// 读取目标工位当前状态
var ConveyorMod = PLCTaskAction.plcDevices.First(m => m.StationNum == item && m.DeviceType == DeviceTypeEnum.Business);
var (result, value) = plcCconn.GetPlcDBValue(ConveyorMod.PosType, ConveyorMod.DbNumber, ConveyorMod.PlcPos);
if (result.IsSucceed)
{
if (value.ToString() == "120")//空闲状态
{
// 判断该工位是否存在未完成的出库任务
var modInTask = _db.Queryable().OrderBy(m => m.Levels, OrderByType.Asc).OrderBy(m => m.CreateTime, OrderByType.Asc)
.First(s => (s.Status == TaskStatusEnum.Wait || s.Status == TaskStatusEnum.Doing) && s.TaskType == TaskTypeEnum.Out && s.EndLocate == item);
if (modInTask == null)
{
// 若空闲并没有未完成的出库任务提前占用此工位
var ret = plcCconn.SetPlcDBValue(ConveyorMod.PosType, ConveyorMod.DbNumber, ConveyorMod.WcsPos, "130");
if (ret.IsSucceed)
{
rukuAdress = item;
break;
}
}
}
}
}
if (!string.IsNullOrEmpty(rukuAdress))
{
return new ResponseModel() { StatusCode = 0, Msg = rukuAdress };
}
else
{
return new ResponseModel() { StatusCode = -1, Msg = "无空闲入库工位" };
}
}
catch (Exception ex)
{
return new ResponseModel() { StatusCode = -1, Msg = ex.Message };
}
}
///
/// 小车入库口放货完成,WMS调用WCS更改PLC
///
///
///
[AllowAnonymous]
[HttpPost]
public ResponseModel UpdatePlcPosAgvTaskFinsh(AgvTaskFinshModel model)
{
try
{
var conveyList4 = new List() { "266", "265" };//四楼入库工位
if (!conveyList4.Contains(model.StationNum))
{
return new ResponseModel() { StatusCode = -1, Msg = "工位号无效" };
}
// 根据目标工位号获取输送线链接
var plcCconn = PLCCommon.GetPlcIp(model.StationNum);
// 读取目标工位当前状态
var ConveyorMod = PLCTaskAction.plcDevices.First(m => m.StationNum == model.StationNum && m.DeviceType == DeviceTypeEnum.Business);
var (result, value) = plcCconn.GetPlcDBValue(ConveyorMod.PosType, ConveyorMod.DbNumber, ConveyorMod.PlcPos);
if (result.IsSucceed)
{
if (value.ToString() != "150")//空闲状态
{
return new ResponseModel() { StatusCode = -1, Msg = "工位号PLC状态异常" };
}
// 写入160,放货完成
var ret = plcCconn.SetPlcDBValue(ConveyorMod.PosType, ConveyorMod.DbNumber, ConveyorMod.WcsPos, "160");
if (ret.IsSucceed)
{
return new ResponseModel() { StatusCode = 0, Msg = "成功" };
}
else
{
return new ResponseModel() { StatusCode = -1, Msg = "写入PLC失败" };
}
}
else
{
return new ResponseModel() { StatusCode = -1, Msg = "连接PLC失败" };
}
}
catch (Exception ex)
{
return new ResponseModel() { StatusCode = -1, Msg = ex.Message };
}
}
///
/// WCS接受赋码系统推送的箱码信息
///
/// 箱码信息
/// 反馈信息
[HttpPost("AddHttpBoxInfo")]
[AllowAnonymous]
public ResponseFuMaModel AddHttpBoxInfo(FumaBoxModel models)
{
try
{
string str = JsonConvert.SerializeObject(models);
Log.Information("接收赋码推送的箱码信息:" + str);
var num = _db.Queryable().Where(m => m.BoxNo == models.Product.BoxNo && m.IsDelete == false).ToList();
var type = "add";
if (num.Count > 0)
{
//WCS存在箱码信息,更新箱码信息(需判断箱码是否已组盘入库)
var num2 = num.Count(m => m.Status != "0" || !string.IsNullOrWhiteSpace(m.PalletNo));
if (num2 > 0)
{
throw new Exception("该箱已入盘入库,不可更新信息");
}
type = "edit";
}
if (models.Product.Barcodes.Count == 0)
{
throw new Exception("盒码集合不能为空");
}
var listBox = new List();
foreach (var item in models.Product.Barcodes)
{
if (string.IsNullOrWhiteSpace(models.Product.ProductionTime) || string.IsNullOrWhiteSpace(models.Product.ExpirationTime))
{
throw new Exception("生产日期或过期日期不能为空");
}
DateTime proTime;
DateTime expTime;
var isValid = DateTime.TryParse(models.Product.ProductionTime, out proTime);
var isValid2 = DateTime.TryParse(models.Product.ExpirationTime, out expTime);
if (!isValid || !isValid2)
{
throw new Exception("生产日期或失效日期格式错误");
};
var boxAdd = new WcsBoxInfo()
{
SkuNo = models.Product.SkuNo,
SkuName = models.Product.SkuName,
LotNo = models.Product.LotNo,
LotText = models.Product.LotText,
Custom = models.Product.Custom,
CustomName = models.Product.CustomName,
ProductionTime = proTime,
ExpirationTime = expTime,
LineNo=models.Product.Line_No,
Standard = models.Product.Standard,
PackageStandard = models.Product.PackageStandard,
PackUnit = models.Product.PackUnit,
StoreTime = DateTime.Parse(models.Product.StoreTime),
BitBoxMark = models.Product.BitBoxMark,
BoxNo = models.Product.BoxNo,
Qty = 1,//数量
FullQty = 0,//整箱数量
InsPectMark = models.Product.InsPectMark,//抽检标记
BoxNo2 = item.BoxNo2,
BoxNo3 = "",
Level = item.Level,
EndLotFlag = string.IsNullOrWhiteSpace(models.Product.BitBoxMark) ? "0" : models.Product.BitBoxMark,//结批标识
QtyCount = 0,//总件数
QtyOrd = 0,//第几件
Status = "0",
IsDelete = false
};
listBox.Add(boxAdd);
}
_db.Insertable(listBox).ExecuteCommand();
if (type == "edit")
{
_db.Deleteable(num).ExecuteCommand();
}
return new ResponseFuMaModel() { Success = true, Message = "ok" };
}
catch (Exception ex)
{
return new ResponseFuMaModel() { Success = false, Message = ex.Message };
}
}
}