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;
|
|
/// <summary>
|
/// 示例开放接口
|
/// </summary>
|
[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<string> HelloWord()
|
//{
|
// return Task.FromResult($"Hello word. {_userManager.Account}");
|
//}
|
|
// <summary>
|
/// WCS接受WMS下发的任务
|
/// </summary>
|
/// <param name="models">任务信息</param>
|
/// <returns>反馈信息</returns>
|
[AllowAnonymous]
|
public ResponseModel AddWcsTasks(List<ResponseTasksModel> 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;
|
}
|
/// <summary>
|
/// WCS接受WMS下发的任务(单条任务)
|
/// </summary>
|
/// <param name="models">任务信息</param>
|
/// <returns>反馈信息</returns>
|
[AllowAnonymous]
|
public ResponseModel AddWcsTask(ResponseTasksModel models)
|
{
|
ResponseModel result = new ResponseModel();
|
try
|
{
|
// 验证任务是否已存在
|
var taskInfo = _db.Queryable<WcsTask>().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 };
|
}
|
}
|
|
/// <summary>
|
/// WCS接收WMS下发的入库单任务
|
/// </summary>
|
/// <param name="models"></param>
|
/// <returns></returns>
|
[AllowAnonymous]
|
public ResponseModel AddOrderTask(List<ResponseOrderTaskModel> models)
|
{
|
ResponseModel result = new ResponseModel();
|
try
|
{
|
foreach (var item in models)
|
{
|
// 验证任务是否已存在
|
//var taskInfo = _db.Queryable<WcsOderTask>().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 };
|
}
|
}
|
|
/// <summary>
|
/// 获取空托盘垛申请入库工位
|
/// </summary>
|
/// <returns></returns>
|
[AllowAnonymous]
|
[HttpPost]
|
public ResponseModel GetNullPalletRukuStation()
|
{
|
try
|
{
|
string rukuAdress = "";
|
var conveyList4 = new List<string>() { "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<WcsTask>().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 };
|
}
|
}
|
/// <summary>
|
/// 小车入库口放货完成,WMS调用WCS更改PLC
|
/// </summary>
|
/// <param name="StationNum"></param>
|
/// <returns></returns>
|
[AllowAnonymous]
|
[HttpPost]
|
public ResponseModel UpdatePlcPosAgvTaskFinsh(AgvTaskFinshModel model)
|
{
|
try
|
{
|
var conveyList4 = new List<string>() { "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 };
|
}
|
}
|
|
/// <summary>
|
/// WCS接受赋码系统推送的箱码信息
|
/// </summary>
|
/// <param name="models">箱码信息</param>
|
/// <returns>反馈信息</returns>
|
[HttpPost("AddHttpBoxInfo")]
|
[AllowAnonymous]
|
public ResponseFuMaModel AddHttpBoxInfo(FumaBoxModel models)
|
{
|
try
|
{
|
string str = JsonConvert.SerializeObject(models);
|
Log.Information("接收赋码推送的箱码信息:" + str);
|
|
var num = _db.Queryable<WcsBoxInfo>().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<WcsBoxInfo>();
|
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 };
|
}
|
}
|
}
|