using Microsoft.AspNetCore.Http.HttpResults;
using Microsoft.AspNetCore.Mvc;
using Microsoft.CodeAnalysis.Text;
using ServerApp.Interfaces;
using ServerApp.Interfaces.Repositories;
using ServerApp.Models.Controller;
using ServerApp.Models.Entities;
using ServerApp.Services;
namespace ServerApp.Controllers
public class CallbackService : Controller
private readonly MqttClientService _mqttService;
private readonly ILogger<CallbackService> _logger;
private ILogDataService _logDataService;
private IUnitOfWork _unit;
private ICTUService _ctuService;
private object lockHung = new object();
public CallbackService(ILogger<CallbackService> logger, ILogDataService logDataService,
IUnitOfWork initwork, ICTUService ctuService, MqttClientService mqttService)
_logDataService = logDataService;
_ctuService = ctuService;
_logger.LogInformation("Callback Controller is running");
_mqttService = mqttService;
[HttpPost("agv/agvCallbackService/agvCallback")]
public async Task<IActionResult> CTUCallbackAsync([FromBody] CTUCallbackModel data)
_logger.LogWarning(JsonConvert.SerializeObject(data));
_logDataService.Update(JsonConvert.SerializeObject(data));
CallBackMsgResp resp = new CallBackMsgResp();
resp.reqCode = data.reqCode;
var _mission = await _unit.CTUMissions.GetByCMDReturn(data.taskCode);
if (data.method == "start")
_mission.MissionStatus = MissionStatus.START;
_mission.ModifiedAt = DateTime.Now;
_unit.CTUMissions.Modify(_mission);
else if (data.method == "cancel")
if (_mission.TaskType == BufferTypes.INPUT)
var _rack = _unit.MaterialMagRacks.Find(s => s.PositionCode == _mission.EndPosCode).FirstOrDefault();
_rack.RackStatus = RackStatus.UNDEFINED;
_rack.ModifiedAt = DateTime.Now;
_unit.MaterialMagRacks.Modify(_rack);
_unit.CTUMissions.Remove(_mission);
else if (data.method == "outbin")
_mission.MissionStatus = MissionStatus.OUT_BIN;
if (_mission.TaskType == BufferTypes.OUTPUT || _mission.TaskType == BufferTypes.BOTH)
var _rack = _unit.MaterialMagRacks.Find(s => s.PositionCode == _mission.StartPosCode).FirstOrDefault();
var _mgz = _unit.MaterialMgzes.Find(s => s.Id == _rack.MagazineId).FirstOrDefault();
_rack.RackStatus = RackStatus.EMPTY;
_rack.ModifiedAt = DateTime.Now;
_rack.MagazineId = Guid.Empty;
_unit.MaterialMagRacks.Modify(_rack);
_mgz.Tracking = MagazineTracking.IN_CTU;
_mgz.ModifiedAt = DateTime.Now;
_unit.MaterialMgzes.Modify(_mgz);
var request = new MccBin_In()
zName = $"{_rack.RackNumber}",
bName = $"{_rack.RowNumber.ToString("D2")}-{_rack.ColNumber}"
await _mqttService.PublishAsync("res/smart-transfer/BIN_OUT", JsonConvert.SerializeObject(request));
_mission.MissionStatus = MissionStatus.MAGAZINE_NOT_FOUND;
_mission.MissionStatus = MissionStatus.RACK_NOT_FOUND;
else if (_mission.TaskType == BufferTypes.INPUT)
_mission.ModifiedAt = DateTime.Now;
_unit.CTUMissions.Modify(_mission);
else if (data.method == "complete")
var _mathung = data.ctnrCode;
if (_mission.TaskType == BufferTypes.INPUT)
_mission.MissionStatus = MissionStatus.MAGAZINE_ON_BOX;
var _rack = _unit.MaterialMagRacks.Find(s => s.PositionCode == _mission.EndPosCode).FirstOrDefault();
var _mgz = _unit.MaterialMgzes.Find(s => s.Id == _mission.MagazineId).FirstOrDefault();
if (_rack != null && _mgz != null)
if (_mgz.Type == MagType.NO_GMES)
var _plan = _unit.MccMaterialTransPlans.Find(s => s.code == _mgz.code).FirstOrDefault();
if (_mgz.Qty + _plan.actqty < _plan.qty)
_mgz.depTime = _plan.deptime;
_mgz.Type = MagType.GMES;
_plan.actqty += _mgz.Qty;
_unit.MccMaterialTransPlans.Modify(_plan);
_rack.RackStatus = _mgz.Type == MagType.NO_GMES ? RackStatus.HASNT_DPT : RackStatus.HAS_DPT;
_rack.ModifiedAt = DateTime.Now;
_rack.MagazineId = _mgz.Id;
_unit.MaterialMagRacks.Modify(_rack);
_mgz.Tracking = MagazineTracking.IN_RACK;
_mgz.ModifiedAt = DateTime.Now;
_unit.MaterialMgzes.Modify(_mgz);
var requestmgzID = _mission.MagazineId;
var request = new MccBin_In()
zName = $"{_rack.RackNumber}",
bName = $"{_rack.RowNumber.ToString("D2")}-{_rack.ColNumber}"
await _mqttService.PublishAsync("res/smart-transfer/BIN_IN", JsonConvert.SerializeObject(request));
_unit.CTUMissions.Remove(_mission);
else if (_mission.TaskType == BufferTypes.OUTPUT)
var _rack = _unit.MaterialMagRacks.Find(s => s.PositionCode == _mission.StartPosCode).FirstOrDefault();
var _mgz = _unit.MaterialMgzes.Find(s => s.Id == _mission.MagazineId).FirstOrDefault();
if (_rack != null && _mgz != null)
_mgz.Status = MagazineStatus.TRANSFERED;
_mgz.Tracking = MagazineTracking.IN_BUFFER;
_mgz.ModifiedAt = DateTime.Now;
_unit.MaterialMgzes.Modify(_mgz);
_unit.CTUMissions.Remove(_mission);
else if(_mission.TaskType == BufferTypes.BOTH)
_unit.CTUMissions.Remove(_mission);
var _box1 = _unit.MaterialMagBoxes.Find(s => s.BoxName == _mathung).FirstOrDefault();
var _mgz = _unit.MaterialMgzes.Find(s => s.Id == _box1.MagazineId).FirstOrDefault();
if(_mgz.Status == MagazineStatus.KITTING)
_mgz.Status = MagazineStatus.TRANSFERED;
_mgz.Tracking = MagazineTracking.IN_BUFFER;
_mgz.ModifiedAt = DateTime.Now;
_unit.MaterialMgzes.Modify(_mgz);
var _magazinExist = await _unit.MaterialTransPlanKitMgzHises.GetMagazinInfo(_mgz.MagazineCode);
if (_magazinExist != null)
_unit.MaterialTransPlanOutMgzHises.Add(new MaterialTransPlanOutMgzHisEntity()
MagazineId = _magazinExist.MgzId,
PlanId = _magazinExist.PlanId,
OutputType = OutputTypes.AUTO
var _magTransPlan = _unit.MaterialTransPlans.Find(s => s.Id == _magazinExist.PlanId).FirstOrDefault();
if (_magTransPlan != null)
_magTransPlan.OutputRemainQty = _magTransPlan.OutputRemainQty - (_mgz != null ? _mgz.PCBQty : 0);
_unit.MaterialTransPlans.Modify(_magTransPlan);
_box1.BoxStatus = BoxStatus.NOT_PCB;
_box1.MagazineId = Guid.Empty;
_box1.ModifiedAt = DateTime.Now;
_unit.MaterialMagBoxes.Modify(_box1);
_unit.MaterialMagBoxMgzHises.Add(new MaterialMagBoxMgzHisEntity()
var _mgzDivHis = _unit.MaterialTransPlanDivMgzHises.Find(p=>p.Status == MagazineStatusDivHis.WAITING_DIV && p.MgzId == _mgz.Id).ToList();
if( _mgzDivHis.Count != 0)
_mgz.Status = MagazineStatus.DIVIDED;
_mgz.Tracking = MagazineTracking.IN_BUFFER;
_mgz.ModifiedAt = DateTime.Now;
_unit.MaterialMgzes.Modify(_mgz);
foreach (var _his in _mgzDivHis)
_his.Status = MagazineStatusDivHis.WAITING_DIV;
_his.ModifiedAt = DateTime.Now;
_unit.MaterialTransPlanDivMgzHises.Modify(_his);
_mgz.Status = MagazineStatus.INSTOCK;
_mgz.Tracking = MagazineTracking.IN_BUFFER;
_mgz.ModifiedAt = DateTime.Now;
_unit.MaterialMgzes.Modify(_mgz);
_unit.CTUMissions.Remove(_mission);
var _his2 = JsonConvert.DeserializeObject<CTUMissionHisEntity>(JsonConvert.SerializeObject(_mission));
_his2.Id = Guid.NewGuid();
_unit.CTUMissionHises.Add(_his2);
var b = _unit.Complete();
_logDataService.Update($"agvCallback Save => {b}");
[HttpPost("buf/bufCallbackService/bufCallback")]
public async Task<IActionResult> BufferCheckAsync([FromBody] BoxApplyPassMsg data)
_logDataService.Update($"bufCallback {JsonConvert.SerializeObject(data)}");
_logger.LogWarning($"bufCallback {JsonConvert.SerializeObject(data)}");
CommonResMsg resp = new CommonResMsg();
resp.reqCode = data.reqCode;
var _mission = await _unit.CTUMissions.GetByCMDReturn(data.taskCode);
var _ctucode = _mission.EndPosCode;
var _bufferOut = await _unit.MaterialMagBuffes.GetPos1ByCTUCode(_ctucode, BufferTypes.OUTPUT);
if(_bufferOut.PosStatus == 1 && (DateTime.Now - _bufferOut.ModifiedAt).TotalSeconds < 6)
_logDataService.Update($"[WRN] buffer output ip {_mission.Remark} - {_ctucode} allow");
_logger.LogWarning($"[WRN] buffer output ip {_mission.Remark} - {_ctucode} allow");
_logDataService.Update($"[WRN] buffer output ip {_mission.Remark} - {_ctucode} not ready");
_logger.LogWarning($"[WRN] buffer output ip {_mission.Remark} - {_ctucode} not ready");
_logDataService.Update($"[ERR] buffer output ip {_mission.Remark} - {_ctucode} not found");
_logger.LogWarning($"[ERR] buffer output ip {_mission.Remark} - {_ctucode} not found");
resp.message = $"[ERR] buffer output ip {_mission.Remark} - {_ctucode} not found";
_logDataService.Update($"[ERR] mission task code {data.taskCode} not found");
_logger.LogWarning($"[ERR] mission task code {data.taskCode} not found");
resp.message = $"[ERR] mission task code {data.taskCode} not found";
public async Task<IActionResult> BufferStatusUpdate([FromBody] List<BufferInterfaceModel_temp> data_temp)
_logDataService.Update(JsonConvert.SerializeObject(data_temp));
_logger.LogWarning(JsonConvert.SerializeObject(data_temp));
dynamic response = new ExpandoObject();
var _buffers = await _unit.MaterialMagBuffes.GetBufferInfor(data_temp.ipAddress, data_temp.bufferType);
if (_buffers.Count() > 0)
if (data_temp.bufferType == BufferTypes.INPUT)
BufferInterfaceModel data = new BufferInterfaceModel();
data.reqCode = data_temp.reqCode;
data.bufferType = data_temp.bufferType;
data.posQty = data_temp.posQty;
data.bufferStatus = data_temp.statusId.Split(',')
.Select((statusId, index) => new BufferData
bool bStatusIdonMission = false;
foreach (var _buf in _buffers)
foreach (var _a in data.bufferStatus)
if (_buf.BufferNumber == _a.posCode)
_buf.PosStatus = (!string.IsNullOrEmpty(_a.statusId) && _a.statusId != "0") ? BufferStatus.HAS_BOX : BufferStatus.NO_BOX;
_buf.StatusId = _a.statusId;
_buf.ModifiedAt = DateTime.Now;
_buf.LastTimeAt = (_buf.StatusId != _a.statusId || string.IsNullOrEmpty(_buf.StatusId)) ? DateTime.Now : _buf.LastTimeAt;
_unit.MaterialMagBuffes.Modify(_buf);
if (!_buffers.Any(s => s.StatusId == _a.statusId))
_unit.MaterialMagBuffMgzHises.Add(new Models.Entities.MaterialMagBuffMgzHisEntity()
if (!string.IsNullOrEmpty(_a.statusId))
var _c = await _unit.CTUMissions.GetStatusIdExist(_a.statusId, data_temp.bufferType);
if (_c != null && _buf.PosStatus == 1)
bStatusIdonMission = true;
var _lastTimeofBuffer = (DateTime.Now - _buffers.Min(s => s.LastTimeAt)).TotalMinutes;
var _boxOnBuffer = _buffers.Where(s => s.PosStatus == 1).ToList();
var _numberBox = _boxOnBuffer.Count();
List<CTUMissionEntity> listMissionToCTU = new List<CTUMissionEntity>();
var _rack = await _unit.MaterialMagRacks.GetRackPriority(_numberBox);
if (_rack.Count() == _numberBox)
for (int i = 0; i < _numberBox; i++)
CTUMissionEntity _ctu = new CTUMissionEntity();
_ctu.StartPosCode = _boxOnBuffer[i].PositionCode;
_ctu.EndPosCode = _rack[i].PositionCode;
_ctu.CreateAt = DateTime.Now;
_ctu.TaskType = data_temp.bufferType;
_ctu.ModifiedAt = DateTime.Now;
_ctu.UseStatus = UseStatus.USE;
_ctu.MissionStatus = MissionStatus.PENDING;
_ctu.Remark = _rack[i].Id.ToString();
_ctu.StatusId = _boxOnBuffer[i].StatusId;
var a = await _ctuService.RunTask(_ctu.StartPosCode, _ctu.EndPosCode, _ctu.TaskType == BufferTypes.INPUT ? true : false);
_logDataService.Update(JsonConvert.SerializeObject(a));
if (a.TaskResponseInfo.code != "99")
_rack[i].MissionId = _ctu.Id;
_rack[i].RackStatus = RackStatus.UNDEFINED;
_rack[i].ModifiedAt = DateTime.Now;
_unit.MaterialMagRacks.Modify(_rack[i]);
_ctu.MissionStatus = MissionStatus.SEND_CTU_OK;
_ctu.CMDReturn = a.TaskResponseInfo.data;
listMissionToCTU.Add(_ctu);
_rack[i].MissionId = _ctu.Id;
_rack[i].RackStatus = RackStatus.IN_WAITING;
_rack[i].ModifiedAt = DateTime.Now;
_unit.MaterialMagRacks.Modify(_rack[i]);
_unit.CTUMissions.AddRange(listMissionToCTU);
else if (data_temp.bufferType == BufferTypes.BOTH)
var _materialcode = data_temp.materialCode.Split(',');
var _statusid = data_temp.statusId.Split(',');
BufferInterfaceModel data = new BufferInterfaceModel();
data.reqCode = data_temp.reqCode;
data.bufferType = data_temp.bufferType;
data.posQty = data_temp.posQty;
data.bufferStatus = data_temp.status.Split(',')
.Select((status, index) => new BufferData
materialCode = _materialcode.Count() > index ? _materialcode[index] : "",
status = (string.IsNullOrEmpty(status) || status == "0") ? BufferStatus.NO_BOX : BufferStatus.HAS_BOX,
statusId = _statusid.Count() > index ? _statusid[index] : "",
foreach (var _buf in _buffers)
foreach (var _a in data.bufferStatus)
if (_buf.BufferNumber == _a.posCode)
_buf.PosStatus = _a.status;
_buf.StatusId = _a.statusId;
_buf.ModifiedAt = DateTime.Now;
_buf.LastTimeAt = _buf.StatusId != _a.materialCode ? DateTime.Now : _buf.LastTimeAt;
_unit.MaterialMagBuffes.Modify(_buf);
if (!_buffers.Any(s => s.StatusId == _a.statusId))
_unit.MaterialMagBuffMgzHises.Add(new Models.Entities.MaterialMagBuffMgzHisEntity()
if (!string.IsNullOrEmpty(_a.statusId))
var _misinput = await _unit.CTUMissions.GetStatusIdExist(_a.statusId, BufferTypes.INPUT);
var _rack = await _unit.MaterialMagRacks.GetRackPriority(1);
CTUMissionEntity _ctu = new CTUMissionEntity();
_ctu.StartPosCode = _buf.PositionCode;
_ctu.EndPosCode = _rack[0].PositionCode;
_ctu.CreateAt = DateTime.Now;
_ctu.TaskType = BufferTypes.INPUT;
_ctu.ModifiedAt = DateTime.Now;
_ctu.UseStatus = UseStatus.USE;
_ctu.MissionStatus = MissionStatus.PENDING;
_ctu.MagazineId = Guid.Empty;
_ctu.Remark = _rack[0].Id.ToString();
_ctu.StatusId = _buf.StatusId;
var a = await _ctuService.RunTask(_ctu.StartPosCode, _ctu.EndPosCode, _ctu.TaskType == BufferTypes.INPUT ? true : false);
_logDataService.Update(JsonConvert.SerializeObject(a));
if (a.TaskResponseInfo.code != "99")
_rack[0].MissionId = _ctu.Id;
_rack[0].RackStatus = RackStatus.UNDEFINED;
_rack[0].ModifiedAt = DateTime.Now;
_unit.MaterialMagRacks.Modify(_rack[0]);
_ctu.MissionStatus = MissionStatus.SEND_CTU_OK;
_ctu.CMDReturn = a.TaskResponseInfo.data;
_unit.CTUMissions.Add(_ctu);
_rack[0].MissionId = _ctu.Id;
_rack[0].RackStatus = RackStatus.IN_WAITING;
_rack[0].ModifiedAt = DateTime.Now;
_unit.MaterialMagRacks.Modify(_rack[0]);
Console.WriteLine(ex.Message);
response.msg = ex.Message;
[HttpPost("buf/getinfor")]
public IActionResult BufferGetInfo([FromBody] string ip)
_logDataService.Update(JsonConvert.SerializeObject(ip));
_logger.LogWarning(JsonConvert.SerializeObject(ip));
[HttpPost("buf/get-boxcode-infor")]
public async Task<IActionResult> BufferGetBoxCodeInfoAsync([FromBody] string dsboxcode)
_logDataService.Update(JsonConvert.SerializeObject(dsboxcode));
_logger.LogWarning(JsonConvert.SerializeObject(dsboxcode));
dynamic response = new ExpandoObject();
if(!string.IsNullOrEmpty(dsboxcode))
var lstLineName = new List<string>();
var _dsboxcode = dsboxcode.Split(';').ToList();
foreach(var _mathung in _dsboxcode)
var _box1 = _unit.MaterialMagBoxes.Find(s => s.BoxName == _mathung).FirstOrDefault();
var _mgz = _unit.MaterialMgzes.Find(s => s.Id == _box1.MagazineId).FirstOrDefault();
var _magazinExist1 = await _unit.MaterialTransPlanKitMgzHises.GetMagazinInfo(_mgz.MagazineCode);
if (_magazinExist1 != null)
var _magTransPlan = _unit.MaterialTransPlans.Find(s => s.Id == _magazinExist1.PlanId).FirstOrDefault();
if (_magTransPlan != null)
_lineName = _magTransPlan.LineName;
lstLineName.Add(_lineName);
response.info = lstLineName;
response.msg = "data null";