You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

315 lines
12 KiB
C#

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

using System.Text.Json;
using Microsoft.AspNetCore.Mvc;
using SlnMesnac.Config;
using SlnMesnac.Model.domain;
using SlnMesnac.Model.dto;
using SlnMesnac.Plc;
using SlnMesnac.Repository.service;
namespace SlnMesnac.Controllers;
/// <summary>
/// MCS 投料校验
/// </summary>
[Route("api/[controller]")]
[ApiController]
public class McsIngCheckController
{
private ILogger<McsIngCheckController> _logger;
private AppConfig _appConfig;
private PlcPool _plcPool;
private IWmsTaskOutService _wmsTaskOutService;
private IMcsBinToMaterService _mcsBinToMaterService;
private IMcsMaterialInfoService _mcsMaterialInfoService;
private IInputRecordService _inputRecordService;
/// <summary>
///
/// </summary>
/// <param name="logger"></param>
/// <param name="mcsBinToMaterService"></param>
/// <param name="appConfig"></param>
/// <param name="wmsTaskOutService"></param>
/// <param name="plcPool"></param>
/// <param name="mcsMaterialInfoService"></param>
public McsIngCheckController(ILogger<McsIngCheckController> logger,
IMcsBinToMaterService mcsBinToMaterService,
AppConfig appConfig,
IWmsTaskOutService wmsTaskOutService,
PlcPool plcPool,
IMcsMaterialInfoService mcsMaterialInfoService,
IInputRecordService inputRecordService)
{
_logger = logger;
_mcsBinToMaterService = mcsBinToMaterService;
_appConfig = appConfig;
_wmsTaskOutService = wmsTaskOutService;
_plcPool = plcPool;
_mcsMaterialInfoService = mcsMaterialInfoService;
_inputRecordService = inputRecordService;
}
/// <summary>
/// 根据物料条码获取MCS物料信息
/// </summary>
/// <param name="MaterialBarcode"></param>
/// <returns></returns>
[HttpGet("GetMcsMaterialInfo/{MaterialBarcode}")]
public ApiResponse GetMcsMaterialInfo(string MaterialBarcode)
{
var result = new ApiResponse();
try
{
do
{
WmsTaskOut wmsInfo = this.GetWmsTaskOutBySerialNum(MaterialBarcode);
if (wmsInfo == null)
{
result.SetFailure($"物料信息获取失败根据物料条码获取MCS物料编号为空时间{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")}");
break;
}
var info = _mcsMaterialInfoService.GetMcsMaterialInfoByMatCode(wmsInfo.MaterNo);
if(info == null)
{
result.SetFailure($"物料信息获取失败根据物料编号获取MCS物料信息为空时间{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")}");
}
else
{
string matStr = JsonSerializer.Serialize(info);
result.SetSuccess(matStr);
_logger.LogInformation($"获取物料信息成功:{matStr},时间:{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")}");
}
} while (false);
}
catch(Exception e)
{
result.SetException(e, "MCS物料信息获取异常");
_logger.LogError($"MCS物料信息获取异常:{e.Message}");
}
return result;
}
/// <summary>
/// 上辅机投料校验
/// </summary>
/// <param name="ingredientInfo"></param>
/// <returns></returns>
[HttpPost("BigMaterial")]
public ApiResponse McsMaterialCheck(IngredientInfo? ingredientInfo)
{
var result = new ApiResponse();
try
{
do
{
if (ingredientInfo == null)
{
result.SetSuccess($"上辅机校验失败,缺少必要参数,时间:{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")}");
break;
}
_logger.LogInformation($"上辅机验证参数:{JsonSerializer.Serialize(ingredientInfo)}");
McsBinToMater mcsInfo = _mcsBinToMaterService.GetMcsBinToMaterByBinNo(ingredientInfo.EquipId, ingredientInfo.CanNumber);
if (mcsInfo == null)
{
result.SetFailure($"上辅机校验失败,根据料罐获取对应信息为空,时间:{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")}");
break;
}
WmsTaskOut wmsInfo = this.GetWmsTaskOutBySerialNum(ingredientInfo.MaterialBarcode);
if (wmsInfo == null)
{
result.SetFailure($"上辅机校验失败,根据物料条码获取物料信息为空,时间:{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")}");
break;
}
if (mcsInfo.MatCode.Contains(wmsInfo.MaterNo))
{
result.SetSuccess($"上辅机校验成功,时间:{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")}");
}
else
{
result.SetFailure($"上辅机校验失败,物料不匹配,时间:{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")}");
break;
}
if (ingredientInfo.IsOpen == 1)
{
var openFlag = SendMcsOpenInstruct(mcsInfo.BinNo);
if (openFlag)
{
_logger.LogInformation($"上辅机开仓指令下发成功");
result.SetSuccess($"上辅机校验成功,开仓指令下发成功,时间:{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")}");
}
else
{
_logger.LogInformation("上辅机开仓指令下发失败");
result.SetSuccess($"上辅机校验成功,开仓指令下发失败,时间:{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")}");
break;
}
}
//保存数据
ingredientInfo.EquipId = mcsInfo.EquipId;
ingredientInfo.CanNumber = mcsInfo.BinNo.ToString();
SaveInputRecord(ingredientInfo, 1, "");
} while (false);
}
catch (Exception e)
{
result.SetException(e,"上辅机投料校验异常");
_logger.LogError($"上辅机投料校验异常:{e.Message}");
}
return result;
}
/// <summary>
/// 获取Mcs投料记录
/// </summary>
/// <param name="apiRequestParam"></param>
/// <returns></returns>
[HttpPost("GetMcsInputRecord")]
public ApiResponse GetMcsInputRecord(ApiRequestParam? apiRequestParam)
{
var result = new ApiResponse();
try
{
do
{
var inputRecordList = _inputRecordService.GetMcsInputRecordList();
if (inputRecordList != null)
{
if (!string.IsNullOrEmpty(apiRequestParam.MaterialBarcode))
inputRecordList = inputRecordList.Where(x => x.MaterialBarcode == apiRequestParam.MaterialBarcode)
.ToList();
if (!string.IsNullOrEmpty(apiRequestParam.CanNumber))
inputRecordList = inputRecordList.Where(x => x.CanNumber == apiRequestParam.CanNumber).ToList();
if (!string.IsNullOrEmpty(apiRequestParam.beginTime))
inputRecordList = inputRecordList.Where(x => x.RecordTime >= Convert.ToDateTime(apiRequestParam.beginTime)).ToList();
if (!string.IsNullOrEmpty(apiRequestParam.endTime))
inputRecordList = inputRecordList.Where(x => x.RecordTime <= Convert.ToDateTime(apiRequestParam.endTime)).ToList();
}
string matStr = JsonSerializer.Serialize(inputRecordList);
result.SetSuccess(matStr);
_logger.LogInformation($"获取Mcs投料记录成功{matStr},时间:{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")}");
} while (false);
}
catch(Exception e)
{
result.SetException(e, "获取Cwss投料记录异常");
_logger.LogError($"获取Cwss投料记录异常:{e.Message}");
}
return result;
}
/// <summary>
/// 下发MCS开仓指令
/// </summary>
/// <param name="binNo"></param>
/// <returns></returns>
/// <exception cref="ArgumentException"></exception>
private bool SendMcsOpenInstruct(int binNo)
{
bool result = false;
var plcInfo = _plcPool.GetPlcByKey("mcs");
string[] binStatusArray = _appConfig.mcsBinStatusAddr.Split(",");
List<int> binStatusResult = new List<int>();
foreach (var item in binStatusArray)
{
bool res = plcInfo.readBoolByAddress(item);
if (res)
{
binStatusResult.Add(1);
}
else
{
binStatusResult.Add(0);
}
}
var allOtherNumbersList = binStatusResult.Where((num, index) => index != binNo - 1).ToList();
bool allOtherNumbersAreZero = allOtherNumbersList.Contains(0);
if (allOtherNumbersAreZero)
{
throw new ArgumentException($"开仓指令下发异常,存在门锁未关到位的料仓,时间:{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")}");
}
result = plcInfo.writeValueByAddress(binNo, _appConfig.mcsOpenAddr);
if (!result)
{
throw new ArgumentException($"开仓指令下发失败,时间:{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")}");
}
return result;
}
/// <summary>
/// 根据物料条码获取WMS出库记录反馈信息
/// </summary>
/// <param name="MaterialBarcode"></param>
/// <returns></returns>
private WmsTaskOut GetWmsTaskOutBySerialNum(string MaterialBarcode)
{
WmsTaskOut? result = null;
try
{
result = _wmsTaskOutService.GetWmsTaskOutBySerialNum(MaterialBarcode);
_logger.LogInformation($"根据物料条码:{MaterialBarcode};获取WMS出库记录{JsonSerializer.Serialize(result)},时间:{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")}");
}
catch (Exception ex)
{
_logger.LogError($"根据物料条码:{MaterialBarcode};获取WMS出库记录异常{ex.Message}");
}
return result;
}
/// <summary>
/// 保存投料记录
/// </summary>
private void SaveInputRecord(IngredientInfo info,int isFlag,string remark)
{
try
{
McsInputRecord mcsInputRecord = new McsInputRecord()
{
MaterialBarcode = info.MaterialBarcode,
CanNumber = info.CanNumber,
EquipId = info.EquipId,
InputQuantity = info.InputQuantity,
InputWeight = info.InputWeight,
IsRemainder = info.IsRemainder,
RemainderQuantity = info.RemainderQuantity,
RemainderWeight = info.RemainderWeight,
IsOpen = info.IsOpen,
IsFlag = isFlag,
Remark = remark,
RecordTime = DateTime.Now
};
bool result = _inputRecordService.SaveMcsInputRecord(mcsInputRecord);
if (result)
{
_logger.LogInformation($"投料记录:{JsonSerializer.Serialize(mcsInputRecord)}保存成功");
}
else
{
_logger.LogInformation($"投料记录:{JsonSerializer.Serialize(mcsInputRecord)}保存失败");
}
}
catch (Exception ex)
{
_logger.LogError($"投料记录保存异常:{ex.Message}");
}
}
}