using AutoMapper; using MathNet.Numerics.Distributions; using Microsoft.AspNetCore.Mvc; using Newtonsoft.Json; using Org.BouncyCastle.Crypto; using Quartz.Util; using System.Text.RegularExpressions; using wms.api.Job; using wms.dto; using wms.dto.request; using wms.dto.request.cp; using wms.dto.request.hj; using wms.dto.request.hj.dto; using wms.dto.request.pt; using wms.dto.request.pt.dto; using wms.dto.request.share; using wms.dto.response; using wms.dto.response.pt; using wms.service.IService; using wms.service.Service; using wms.sqlsugar; using wms.sqlsugar.model.pt; using wms.util.Ext; using wms.util.Http; namespace wms.api.Controllers { /// /// 盘条库控制器 /// [Route("api/[controller]/[action]")] [ApiController] public class PtController : BaseController { private readonly IPTService _ptService; private readonly ILogger _logger; private readonly IMapper _mapper; static object lockerPurchaseBillTrans = new object(); static object lockerErpUnlockStock = new object(); static object lockerProductionStockOut = new object(); static object lockerProductionFeedBack = new object(); static object lockerStockChange = new object(); static object lockerProductionBack = new object(); static object lockerPtPurchTaskIn = new object(); static object lockerPtApplyStockInLoc = new object(); static object lockerPtCompleteTask = new object(); static object lockerPtSrmPickOutCompleted = new object(); static object lockerSyncMaterInfoList = new object(); static object lockerPtWcsProductionOutTask = new object(); static object lockerGetPtTunnelList = new object(); static object lockerManualTaskOut = new object(); static object lockerPinkuInfoUpdate = new object(); static object lockerPinkucarryInTask = new object(); static object lockerPinkucarryOutTask = new object(); static object lockerPtCancelOrComplet = new object(); static object lockerPtCarryTask = new object(); static object lockerUpdatePuchState = new object(); static object lockerForceCancelTask = new object(); static object lockerDeleteStockInfo = new object(); static object lockerUpdateStockState = new object(); static object lockerUpdateCellState = new object(); static object lockerDataSwapCell = new object(); static object lockerDataBasePatch = new object(); static object lockerDataMoveCell = new object(); static object lockerProductRequisition = new object(); static object lockerPdaInsterInTask = new object(); static object lockerHandErrTask = new object(); static object lockerJKArriveInfo = new object(); static object lockerJKTransPTInfo = new object(); static object lockerPurchaseBillTransCheck = new object(); static object lockerFlowDataMoveJob = new object(); Repository _sysJobrepository => new Repository(); public PtController(IPTService ptService, ILogger logger, IMapper mapper) : base(ptService) { _ptService = ptService; _logger = logger; _mapper = mapper; } /// /// 同步物料基础信息 /// /// /// [HttpPost] public string SyncMaterInfo(SyncMaterInfoRequest reqBody) { var result = new SRes(); //_logger.LogInformation("请求参数:{@reqBody},{aa}", reqBody,1); PTSyncMaterInfoResponse resbody = JsonConvert.DeserializeObject(WmsServiceExportApi(reqBody)); if (reqBody.SyncType == 1) { reqBody.PageIndex = 1; while (resbody.ResData.Any()) { _ptService.SyncMaterInfo(resbody.ResData); reqBody.PageIndex++; resbody = JsonConvert.DeserializeObject(WmsServiceExportApi(reqBody)); } } else if (reqBody.SyncType == 2) { //拿到增量 var increconf = _ptService.GetSysConfigByCode(Const.MESMaterialInitIncrement); if (increconf != null) { reqBody.StartTime = DateTime.Parse(increconf.SContent); //reqBody.Count = int.Parse(increconf.Remark); resbody = JsonConvert.DeserializeObject(WmsServiceExportApi(reqBody)); if (resbody.ResData.Any()) { if (_ptService.SyncMaterInfo(resbody.ResData)) { var lastdata = resbody.ResData.OrderBy(p => p.UpdatedTime).Last(); _ptService.UpdateSysConfigModelColumns(new sqlsugar.model.UpdateModelColumns() { Columns = it => new ptSysConfig { SContent = lastdata.UpdatedTime.ToString("yyyy-MM-dd HH:mm:ss.fff") }, WhereExpression = it => it.Code == Const.MESMaterialInitIncrement }); } } else { result.ResCode = ResponseStatusCodeEnum.NoResult.GetHashCode(); result.ResMsg = ResponseStatusCodeEnum.NoResult.GetDescription(); } } else { result.ResCode = ResponseStatusCodeEnum.AccountError.GetHashCode(); result.ResMsg = "没有配置信息" + Const.MESMaterialInitIncrement; } } else { if (!string.IsNullOrEmpty(reqBody.MatCode)) { resbody = JsonConvert.DeserializeObject(WmsServiceExportApi(reqBody)); if (resbody.ResData.Any()) { if (_ptService.SyncMaterInfo(resbody.ResData)) { } } } } return result.ToCamelCaseString(); } /// /// 采购到货单/采购退货单/到货重挂清单接口(二楼入库默认传2999) /// /// /// [HttpPost] public SRes PurchaseBillTrans(PurchaseBillTransReqest reqDto) { reqDto.ListInfo = reqDto.ListInfo.Where(p => p.RFID.StartsWith("PT")).ToList(); var res = ConcurrencyReqControl(lockerPurchaseBillTrans, "PurchaseBillTrans", reqDto.BillCode, reqDto, _ptService.PurchaseBillTrans); if (res.ResCode != 200) { return res; } if (string.IsNullOrEmpty(reqDto.Equip)) { res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode(); res.ResMsg = "请扫描地码,地码没有传值"; return res; } if (!string.IsNullOrEmpty(reqDto.Equip) && res.ResCode == 200) { if (reqDto.ListInfo.Count > 1) { res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode(); res.ResMsg = "只能绑定一个盘条信息,当前接口传递多条数据F"; return res; } res = PdaPurchaseTask(new PtPurchaseTaskReqest() { Equip = reqDto.Equip, ConBarCode = reqDto.ListInfo.First().RFID, MatBarCode = reqDto.ListInfo.First().MatBarCode }); } return res; } /// /// 采购到货单验证 /// /// /// [HttpPost] public SRes PurchaseBillTransCheck(PurchaseBillTransReqestCheck reqDto) { lock (lockerPurchaseBillTransCheck) { return _ptService.InsertBillInvinitCheck(reqDto); } } /// /// 盘条RFID验证 /// /// /// [HttpPost] public SRes PurchaseRFIDCheck(PurchaseRFIDCheckReqest reqDto) { lock (lockerPurchaseBillTransCheck) { return _ptService.PurchaseRFIDCheck(reqDto); ; } } /// /// 盘条主数据接收 /// /// /// [HttpPost] public SRes PtSyncMaterInfoList(PtSyncMaterInfoListRequest reqDto) { var res = new SRes(); return ConcurrencyReqControl(lockerSyncMaterInfoList, "PtSyncMaterInfoList", "物料主数据推送", reqDto, _ptService.GetSyncMaterInfo); } /// /// 采购到货单入库反馈/采购退货出库反馈/异常出库重挂反馈接口 /// /// /// [HttpPost] public SRes PurchaseBillTransFeedBack(PtAutoPurchData request) { var res = new SRes(); //自动推送 if (request.Type == "1") { var list = _ptService.GetBillFeedbackList(PtFackbeekType.InterfaceType_PT_PurchaseStockIn.ToString()); if (!list.Any()) { res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode(); res.ResMsg = "没有取到符合条件的数据"; } //采购入库单 if (list.Where(p => p.TypeCode == PtFackbeekType.InterfaceType_PT_PurchaseStockIn.ToString()).ToList().Any()) { var purch = list.Where(p => p.TypeCode == PtFackbeekType.InterfaceType_PT_PurchaseStockIn.ToString()).ToList(); PurchaseBillTransFeedBackRequest purchaseBill = new PurchaseBillTransFeedBackRequest(); var dtolist = _mapper.Map>(purch); var purchs = purch.First(); purchaseBill.ListInfo = dtolist; purchaseBill.BillCode = purchs.DocsNo; purchaseBill.BillType = purchs.TypeCode; purchaseBill.ReqId = purchs.ReqNo; var resbody = JsonConvert.DeserializeObject(WmsServiceExportApi(purchaseBill)); var ids = purch.Select(p => p.Id).ToList(); if (resbody.ResCode == ResponseStatusCodeEnum.Sucess.GetHashCode()) { _ptService.UpdatePuchinfoModelColumns(new sqlsugar.model.UpdateModelColumns() { Columns = it => new ptBillPushinfo() { PostResult = 1, PostQty = it.PostQty + 1, ResDesc = "自动推送", EditTime = DateTime.Now }, WhereExpression = it => ids.Contains(it.Id) }); } else { _ptService.UpdatePuchinfoModelColumns(new sqlsugar.model.UpdateModelColumns() { Columns = it => new ptBillPushinfo() { PostResult = 2, PostQty = it.PostQty + 1, ResDesc = "自动推送", EditTime = DateTime.Now }, WhereExpression = it => ids.Contains(it.Id) }); } } var listAnewStockIn = _ptService.GetBillFeedbackList(PtFackbeekType.InterfaceType_PT_AnewStockIn.ToString()); //重挂 if (listAnewStockIn.Where(p => p.TypeCode == PtFackbeekType.InterfaceType_PT_AnewStockIn.ToString()).ToList().Any()) { var purch = listAnewStockIn.Where(p => p.TypeCode == PtFackbeekType.InterfaceType_PT_AnewStockIn.ToString()).ToList(); PurchaseBillTransFeedBackRequest purchaseBill = new PurchaseBillTransFeedBackRequest(); var dtolist = _mapper.Map>(purch); var purchs = purch.First(); purchaseBill.ListInfo = dtolist; purchaseBill.BillCode = purchs.DocsNo; purchaseBill.BillType = purchs.TypeCode; purchaseBill.ReqId = purchs.ReqNo; var resbody = JsonConvert.DeserializeObject(WmsServiceExportApi(purchaseBill)); var ids = purch.Select(p => p.Id).ToList(); if (resbody.ResCode == ResponseStatusCodeEnum.Sucess.GetHashCode()) { _ptService.UpdatePuchinfoModelColumns(new sqlsugar.model.UpdateModelColumns() { Columns = it => new ptBillPushinfo() { PostResult = 1, PostQty = it.PostQty + 1, ResDesc = "自动推送", EditTime = DateTime.Now }, WhereExpression = it => ids.Contains(it.Id) }); } else { _ptService.UpdatePuchinfoModelColumns(new sqlsugar.model.UpdateModelColumns() { Columns = it => new ptBillPushinfo() { PostResult = 2, PostQty = it.PostQty + 1, ResDesc = "自动推送", EditTime = DateTime.Now }, WhereExpression = it => ids.Contains(it.Id) }); } } } return res; } /// /// 放行单传输接口 /// /// /// [HttpPost] public ErpUnlockStockResponse ErpUnlockStock(ErpUnlockStockRequest reqDto) { return ConcurrencyReqControl(lockerErpUnlockStock, "PtErpUnlockStock", reqDto.BillCode, reqDto, _ptService.ErpUnlockStock); } /// /// 生产领料单传输接口 /// /// /// [HttpPost] public SRes ProductionStockOut(ProductionStockOutRequest reqDto) { return ConcurrencyReqControl(lockerProductionStockOut, "PtProductionStockOut", reqDto.BillCode, reqDto, _ptService.ProductionStockOut); } /// /// 自动叫料 /// /// /// //[HttpPost] //public SRes WcsProductionOutRequest(WcsProductionOutRequest request) //{ // return ConcurrencyReqControl(lockerPtWcsProductionOutTask, "PtWcsProductionOutRequest" , "自动叫料", request, _ptService.WcsProductionOutRequest); //} /// /// 自动叫料新 /// /// /// [HttpPost] public SRes WcsProductionOutRequestNew(WcsProductionOutRequest request) { return ConcurrencyReqControl(lockerPtWcsProductionOutTask, "PtWcsProductionOutRequest", "自动叫料", request, _ptService.WcsProductionOutRequest2); } /// /// 生产领料/退料/改判反馈接口 /// /// /// [HttpPost] public SRes ProductionFeedBack(PtAutoPurchData request) { var res = new SRes(); //自动推送 if (request.Type == "1") { var list = _ptService.GetProductionFeedBack(); if (!list.Any()) { res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode(); res.ResMsg = "没有取到符合条件的数据"; return res; } //生产领料反馈 if (list.Where(p => p.TypeCode == PtFackbeekType.PickMat.ToString()).ToList().Any()) { var purch = list.Where(p => p.TypeCode == PtFackbeekType.PickMat.ToString()).ToList(); var purchs = purch.First(); purch = purch.Where(p => p.DocsNo == purchs.DocsNo).ToList(); ProductionFeedBackRequest purchaseBill = new ProductionFeedBackRequest(); var dtolist = _mapper.Map>(purch); purchaseBill.ListInfo = dtolist; purchaseBill.BillCode = purchs.DocsNo; purchaseBill.BillType = purchs.TypeCode; WmsServiceExportMq(purchaseBill); var ids = purch.Select(p => p.Id).ToList(); _ptService.UpdatePuchinfoModelColumns(new sqlsugar.model.UpdateModelColumns() { Columns = it => new ptBillPushinfo() { PostResult = 1, PostQty = it.PostQty + 1, ResDesc = "自动推送", EditTime = DateTime.Now }, WhereExpression = it => ids.Contains(it.Id) }); } //退料 if (true) { } //改判 if (true) { } } return res; } /// /// 手动出库反馈接口 /// /// /// [HttpPost] public SRes ProductionFeedBackManual(PtAutoPurchData request) { var res = new SRes(); //自动推送 if (request.Type == "1") { var list = _ptService.GetProductionFeedBack(); if (!list.Any()) { res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode(); res.ResMsg = "没有取到符合条件的数据"; return res; } if (list.Where(p => p.TypeCode == "Manual").ToList().Any()) { var purch = list.Where(p => p.TypeCode == "Manual").ToList(); var purchs = purch.First(); purch = purch.Where(p => p.DocsNo == purchs.DocsNo).ToList(); ProductionFeedBackRequest purchaseBill = new ProductionFeedBackRequest(); var dtolist = _mapper.Map>(purch); purchaseBill.ListInfo = dtolist; purchaseBill.BillCode = purchs.DocsNo; purchaseBill.BillType = purchs.TypeCode; WmsServiceExportApi(purchaseBill); var ids = purch.Select(p => p.Id).ToList(); _ptService.UpdatePuchinfoModelColumns(new sqlsugar.model.UpdateModelColumns() { Columns = it => new ptBillPushinfo() { PostResult = 1, PostQty = it.PostQty + 1, ResDesc = "自动推送", EditTime = DateTime.Now }, WhereExpression = it => ids.Contains(it.Id) }); } } return res; } /// /// 炉号用完反馈给mes /// /// /// [HttpPost] public SRes BoilerNoFeedBack(PtAutoPurchData request) { var res = new SRes(); var list = _ptService.GetSysConfigListByExpression(p=>p.Default1 == "ProductPinKu" && p.Default6 == "0" && p.Default5 == p.Default7); if (!list.Any()) { res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode(); res.ResMsg = "没有取到符合条件的数据"; return res; } foreach (var item in list) { BoilerNoRequest boilerNoRequest = new BoilerNoRequest(); boilerNoRequest.BoilerNo = item.Default5; _logger.LogInformation("推送mes炉号用完信号请求:" + JsonConvert.SerializeObject(boilerNoRequest)); var resbody = JsonConvert.DeserializeObject(WmsServiceExportApi(boilerNoRequest)); _logger.LogInformation("推送mes炉号用完信号返回:" + JsonConvert.SerializeObject(resbody)); if (resbody.Success == true || resbody.Code == "200") { _ptService.UpdateSysConfigModelColumns(new sqlsugar.model.UpdateModelColumns() { Columns = it => new ptSysConfig() { Default6 = "1", EditTime = DateTime.Now }, WhereExpression = it => it.Id == item.Id }); } } return res; } /// /// 库存改判 /// /// /// [HttpPost] public SRes StockChange(PtStockChangeRequest reqDto) { lock (lockerStockChange) { return _ptService.StockChange(reqDto); } //return ConcurrencyReqControl>(lockerStockChange, "PtStockChange", "PtStockChange", reqDto, _ptService.StockChange); } /// /// 生产退料单接口 /// /// /// [HttpPost] public SRes ProductionBack(ProductionBackRequest reqDto) { return ConcurrencyReqControl(lockerProductionBack, "PtProductionBack", reqDto.BillCode, reqDto, _ptService.ProductionBack); } [HttpPost] public SRes WareCellInit(int row, int col, int deot, int rowcount, int tun) { return _ptService.WareCellInit(row, col, deot, rowcount, tun); } /// /// 实时库存查询接口 /// /// /// [HttpPost] public PTGetCurStockListResponse GetPtCurStockList(PtGetCurStockListRequest reqDto) { return _ptService.GetCurStockList(reqDto); } #region 盘条PDA功能 /// /// 盘条解绑 /// /// /// [HttpPost] public SRes Unbounding(PtUnboundRequest request) { return _ptService.Unbounding(request); } /// /// pda单据查询 /// /// /// [HttpPost] public string GetDocumentsAll(PtDocumentsRequest request) { return _ptService.GetPageDocumentsList(request).ToCamelCaseString(); } /// /// pda单据明细查询(传单号) /// /// /// [HttpPost] public string GetDocumentDetails(PtDocumentsRequest request) { return _ptService.GetDocumentDetailListByDocsNo(request).ToCamelCaseString(); } /// /// pda指定出库确定 /// /// /// [HttpPost] public string PdaManualTask(PtManualTaskRequest request) { request.BusType = TaskBusType.TaskBusType_HJ_PdaManualOut.GetDescription(); return _ptService.ManualTask(request); } /// /// pda质检领料出库确定 /// /// /// [HttpPost] public string PdaQualityTask(PtManualTaskRequest request) { request.BusType = TaskBusType.TaskBusType_HJ_QualityOut.GetDescription(); return _ptService.ManualTask(request); } /// /// pda重挂出库确定 /// /// /// [HttpPost] public string PdaInactionStockTask(PtManualTaskRequest request) { request.BusType = TaskBusType.TaskBusType_HJ_AnewOut.GetDescription(); return _ptService.ManualTask(request); } /// /// 获取设备报警信息 /// /// /// [HttpPost] public string GetEquipErrorInfo(PtErrorInfoRequest request) { return ""; } /// /// 获取物料报警信息 /// /// /// [HttpPost] public string GetMaterErrorInfo(PtErrorInfoRequest request) { return ""; } /// /// 获取业务报警信息 /// /// /// [HttpPost] public string GetBusinessErrorInfo(PtErrorInfoRequest request) { return ""; } /// /// 手动入库 /// /// /// [HttpPost] public SRes PdaInsterInTask(PtGroupInTaskRequest request) { lock (lockerPdaInsterInTask) { request.Equip = Regex.Replace(request.Equip.Trim(), @"[\r\n]", ""); request.Rfid = Regex.Replace(request.Rfid.Trim(), @"[\r\n]", ""); return _ptService.PdaInsterInTask(request); } } /// /// PDA 采购入库 /// /// /// [HttpPost] public SRes PdaPurchaseTask(PtPurchaseTaskReqest request) { if (string.IsNullOrWhiteSpace(request.ConBarCode)) { return new SRes() { ResCode = 0, ResMsg = "条码不能传空值" }; } lock (lockerPtPurchTaskIn) { request.Equip = Regex.Replace(request.Equip.Trim(), @"[\r\n]", ""); return _ptService.PtPurchaseTask(request); } } /// /// PDA 生产领料确定 /// /// /// [HttpPost] public SRes PdaProductRequisition(PtUnboundRequest request) { lock (lockerProductRequisition) { return _ptService.PdaProductRequisition(request); } } /// /// PDA 生产领料空架子发回 /// /// /// [HttpPost] public SRes PdaProductRequisition2(PtUnboundRequest request) { lock (lockerProductRequisition) { return _ptService.PdaProductRequisition2(request); } } /// /// 监控领料出扫过码的架子搬走 /// /// /// [HttpPost] public SRes MoniterEmptCon(PtUnboundRequest request) { lock (lockerProductRequisition) { return _ptService.MoniterEmptCon(request); } } #endregion /// /// 手动出库确定 /// /// /// [HttpPost] public string ManualTask(PtManualTaskRequest request) { lock (lockerManualTaskOut) { request.BusType = TaskBusType.TaskBusType_HJ_ManualOut.GetDescription(); return _ptService.ManualTask(request); } } #region WCS调用 /// /// 获取巷道 /// /// /// [HttpPost] public SRes GetTunnelPriorityList(GetTunnelPriorityListRequest reqEntity) { lock (lockerGetPtTunnelList) { return _ptService.GetPtTunnelPriorityList(reqEntity); } } /// /// 分配货位 /// /// /// [HttpPost] public SRes ApplyStockInLoc(PtApplyStockInLocRequest reqEntity) { return ConcurrencyReqControl>(lockerPtApplyStockInLoc, "PtApplyStockInLoc", "分配货位" + reqEntity.PickUpEquipmentNo, reqEntity, _ptService.PtApplyStockInLoc); } /// /// 完成任务 /// /// /// [HttpPost] public SRes CompleteTask(CompleteTaskRequest reqDto) { lock (lockerPtCompleteTask) { var res = new SRes(); res = _ptService.PtCompleteTask(reqDto); //如果是二楼入库,调用下机科的接口 if (res.Memo3 == "1") { //try //{ // var tsk = _ptService.GetTask(reqDto.TaskNum); // var req = new JKPalletizerRequest() // { // wmsNo = "YL01", // taskId = tsk.ResData.Id.ToString(), // rfId = tsk.ResData.BarCode, // rowNo = tsk.ResData.Tunnel, // palletizerNo = Math.Ceiling(decimal.Parse(tsk.ResData.Tunnel) / 2).ToString() // }; // _logger.LogInformation("调用机科接口请求:" + JsonConvert.SerializeObject(req)); // var apiurl = wms.util.AppSettings.GetConfig("JKPushUrl"); // var strpost = HttpUtil.PostRequest(apiurl, JsonConvert.SerializeObject(req), 30000, "UTF-8", "application/json"); // _logger.LogInformation("调用机科接口返回:" + strpost); //} //catch (Exception ex) //{ // _logger.LogInformation("调用机科接口异常:" + ex.ToString()); //} } return res; } } /// /// 堆垛机取货完成通知机科 /// /// /// [HttpPost] public SRes NoticeToJK(CompleteTaskRequest reqDto) { lock (lockerPtCompleteTask) { var res = new SRes(); try { var tsk = _ptService.GetCurTask(reqDto.TaskNum); if (tsk.ResData == null) { tsk.ResData = _mapper.Map(_ptService.GetTask(reqDto.TaskNum).ResData); } if (tsk.ResData.Type != TaskType.EnterDepot || tsk.ResData.AddrFrom != "2999") { res.ResMsg = reqDto.TaskNum + "不符合回调任务"; return res; } var tasknum = RedisHelper.Get("Pt:NoticeToJK:Tun" + tsk.ResData.Tunnel); if (reqDto.TaskNum.ToString() == tasknum && reqDto.OperationType == 1) { res.ResMsg = tasknum + "重复请求"; return res; } var req = new JKPalletizerRequest() { wmsNo = "YL01", taskId = tsk.ResData.ID.ToString(), rfId = tsk.ResData.BarCode, rowNo = tsk.ResData.Tunnel, palletizerNo = Math.Ceiling(decimal.Parse(tsk.ResData.Tunnel) / 2).ToString() }; _logger.LogInformation("调用机科接口请求:" + JsonConvert.SerializeObject(req)); var apiurl = wms.util.AppSettings.GetConfig("JKPushUrl"); var strpost = HttpUtil.PostRequest(apiurl, JsonConvert.SerializeObject(req), 30000, "UTF-8", "application/json"); _logger.LogInformation("调用机科接口返回:" + strpost); RedisHelper.Set("Pt:NoticeToJK:Tun" + tsk.ResData.Tunnel, reqDto.TaskNum); } catch (Exception ex) { _logger.LogInformation("调用机科接口异常:" + ex.ToString()); } return res; } } /// /// 堆垛机出库放货完成 /// /// /// [HttpPost] public SRes SrmPickOutCompleted(PtSrmPickOutCompletedRequest reqDto) { lock (lockerPtSrmPickOutCompleted) { return _ptService.PtSrmPickOutCompleted(reqDto); } } /// /// 盘条库 取消/完成任务验证(只验证不做业务处理,开放wcs系统调用) /// /// /// [HttpPost] public SRes CancelTaskVerify(CancelTaskRequest request) { lock (lockerPtCancelOrComplet) { return _ptService.PtCancelTaskVerify(request); } } /// /// 盘条库 执行任务(开放wcs调用,前端不调用) /// /// /// [HttpPost] public SRes CarryTaskInfo(CancelTaskRequest request) { lock (lockerPtCarryTask) { return _ptService.PtCarryTaskInfo(request); } } /// /// 移库确定 /// /// /// [HttpPost] public SRes MoveTaskInfo(MoveTaskRequest request) { lock (lockerPtCarryTask) { return _ptService.MoveTaskInfo(request); } } /// /// 架子管理接口,wcs上报agv取货完成信号,清除起始位置 /// /// /// [HttpPost] public SRes PinkuInfoManagement(PtSrmPickOutCompletedRequest request) { return ConcurrencyReqControl(lockerPinkuInfoUpdate, "PinkuInfoManagement", request.TaskNum.ToString(), request, _ptService.PinkuInfoManagement); } /// /// 堆垛机入库站台架子搬运任务请求(入库站台到22支架) /// /// /// [HttpPost] public SRes PinKuCarryInTask(PinkucarryTaskRequest request) { lock (lockerProductRequisition) { return ConcurrencyReqControl(lockerPinkucarryInTask, "PinKuCarryInTask", request.Equip, request, _ptService.PinKuCarryInTask); } } /// /// 堆垛机出库站台架子搬运任务请求(交接区支架到出库口) /// /// /// [HttpPost] public SRes PinKuCarryOutTask(PinkucarryTaskRequest request) { return ConcurrencyReqControl(lockerPinkucarryOutTask, "PinKuCarryOutTask", request.Equip, request, _ptService.PinKuCarryOutTask); } #endregion /// /// 生产交接区6个点位的物料编码接收绑定 /// /// /// [HttpPost] public SRes ProductMaterInfo(ProductMaterInfoRequest request) { return ConcurrencyReqControl(lockerPinkucarryOutTask, "ProductMaterInfo", request.Equip, request, _ptService.ProductMaterInfo); } #region 异常处理功能 /// /// 强制取消任务 /// /// /// [HttpPost] public SRes ForceCancelTask(ErrorTaskRequest request) { lock (lockerForceCancelTask) { return _ptService.ForceCancelTask(request); } } /// /// 删除库存信息 /// /// /// [HttpPost] public SRes DeleteStockInfo(DetailCodeStrRequest request) { lock (lockerDeleteStockInfo) { return _ptService.DeleteStockInfo(request); } } /// /// 删除条码信息 /// /// /// [HttpPost] public SRes DeleteBarCodeInfo(DetailCodeStrRequest request) { lock (lockerDeleteStockInfo) { return _ptService.DeleteBarCodeInfo(request); } } /// /// 修改库存状态 /// /// /// [HttpPost] public SRes UpdateStockState(DetailCodeStr1Requestdto request) { lock (lockerUpdateStockState) { return _ptService.UpdateStockState(request); } } /// /// 修改货位状态 /// /// /// [HttpPost] public SRes UpdateCellState(DetailCodeStr1Requestdto request) { lock (lockerUpdateCellState) { return _ptService.UpdateCellState(request); } } /// /// 货位数据互换 /// /// /// [HttpPost] public SRes DataSwapCell(DataSwapCellStrRequest request) { lock (lockerDataSwapCell) { return _ptService.DataSwapCell(request); } } /// /// 补数据 /// /// /// [HttpPost] public SRes DataBasePatch(DetailCodeStrRequest request) { lock (lockerDataBasePatch) { return _ptService.DataBasePatch(request); } } /// /// 货位数据转移 /// /// /// [HttpPost] public SRes DataMoveCell(DataSwapCellStrRequest request) { lock (lockerDataMoveCell) { return _ptService.DataMoveCell(request); } } #endregion #region 定时器 /// /// 启用job /// /// /// [HttpPost] public string StartJob(AutoDetailRequest req) { var res = new SRes(); var sysjob = _ptService.GetJobEntityByid(req.Id); if (sysjob == null) { res.ResCode = 0; res.ResMsg = "没有找到对应的定时任务"; return res.ToCamelCaseString(); } JobScheduler.Start(sysjob.Code, Type.GetType("wms.api.Job.PostJob"), sysjob.CronExpression); return res.ToCamelCaseString(); } /// /// 执行job /// /// /// [HttpPost] public string ExecuteJob(DetailCodeStrRequest reqEntity) { var res = new SRes(); if (string.IsNullOrEmpty(reqEntity.Code)) { res.ResCode = 0; res.ResMsg = "参数错误"; return res.ToCamelCaseString(); } var jobEntity = _ptService.GetJobEntityByCode(reqEntity.Code); if (jobEntity == null) { res.ResCode = 0; res.ResMsg = "没有找到该编码"; return res.ToCamelCaseString(); } var jobapilist = _ptService.GetJobapilist(jobEntity.Id); if (jobapilist.Any()) { foreach (var item in jobapilist) { Task.Run(() => { HttpUtil.PostRequest(item.ApiUrl, item.RequestBody); }); } } return res.ToCamelCaseString(); } #endregion [HttpPost] public SRes UpdatePurchState(UpdatePurchStateRequest request) { lock (lockerUpdatePuchState) { return _ptService.UpdatePurchState(request); } } /// /// 监控遗留的库存数据 /// /// /// [HttpPost] public SRes MonitorLeftStock(WebErrorRequest request) { return _ptService.MonitorLeftStock(request); } /// /// 分页Job列表 /// /// /// [HttpPost] public List GetSysJobList(GetSysJobListRequest reqEntity) { var list = _sysJobrepository.GetList(); var listdto = _mapper.Map>(list); if (listdto != null && listdto.Any()) { for (int i = 0; i < list.Count; i++) { listdto[i].JobExecuteStatus = GetExecuteStatus(new DetailCodeRequest() { Code = listdto[i].Code }); } return listdto; } return new List(); } /// /// 获取执行状态 /// /// /// [HttpPost] public string GetExecuteStatus(DetailCodeRequest reqEntity) { var jobInfo = _sysJobrepository.GetFirst(p => p.Code == reqEntity.Code); var jobs = JobScheduler.GetJobList(Const.JobGroupName).Result; if (jobs != null) { var temp = jobs.Where(p => p.JobName == jobInfo.Code); if (temp.Any()) { return temp.First().JobStatus; } else { return "Stop"; } } else { return "Stop"; } } [HttpPost] public SRes HandErrTask(DetailListRequest2Str request) { lock (lockerHandErrTask) { foreach (var item in request.IdList) { var res = _ptService.HandErrTask(new DetailRequest2Str() { Id = item }); if (res.ResCode != 200) { return res; } } return new SRes(); } } /// /// 更新单据状态 /// /// /// [HttpPost] public SRes UpdateDocState(UpdateDocStateReqest req) { return _ptService.UpdateDocState(req); } /// /// 修改任务RFID /// /// /// [HttpPost] public SRes UpdateTaskCont(UpdateTaskContRequest req) { return _ptService.UpdateTaskCont(req); } /// /// 修改货位RFID /// /// /// [HttpPost] public SRes UpdateLocationContGrpBarCode(UpdateLocationContGrpBarCode req) { return _ptService.UpdateLocationContGrpBarCode(req); } /// /// 添加组盘信息 /// /// /// [HttpPost] public SRes AddStock(UpdateTaskContRequest req) { return _ptService.AddStock(req); } /// /// 机科对接-获取巷道 /// /// /// [HttpPost] public JKGetTunRes JKGetTun1(JKGetTunRequest req) { var res = new JKGetTunRes(); var task = _ptService.GetTaskNum(req.rfId); if (task.ResData == 0) { res.palletizerNo = task.ResMsg; return res; } var tun = GetTunnelPriorityList(new GetTunnelPriorityListRequest() { TaskNum = task.ResData }).ResData.Split(',')[0]; if (string.IsNullOrEmpty(tun)) { res.palletizerNo = "没有可用的巷道"; return res; } res.rowNo = tun; res.palletizerNo = Math.Ceiling(decimal.Parse(tun) / 2).ToString(); return res; } /// /// 机科对接-获取巷道 /// /// /// [HttpPost] public JKGetTunResNew JKGetTun(JKGetTunRequest req) { var res = new JKGetTunResNew() { ListData = new List() }; var task = _ptService.GetTaskNum(req.rfId); if (task.ResData == 0) { //res.palletizerNo = task.ResMsg; return res; } var tun = GetTunnelPriorityList(new GetTunnelPriorityListRequest() { TaskNum = task.ResData }).ResData.Split(','); if (tun !=null && tun.Any()) { foreach (var item in tun) { res.ListData.Add(new JKGetTunRes() { rowNo = item, palletizerNo = Math.Ceiling(decimal.Parse(item) / 2).ToString() }); } } //res.rowNo = tun; //res.palletizerNo = Math.Ceiling(decimal.Parse(tun) / 2).ToString(); return res; } /// /// 机科对接-达到二楼取货站台通知 /// /// /// [HttpPost] public JKPalletizerRes JKArriveInfo(JKArrRequest req) { lock (lockerJKArriveInfo) { var res = new JKPalletizerRes(); var task = _ptService.GetTaskNum(req.rfId); if (task.ResData == 0) { res.code = 0; res.message = task.ResMsg; return res; } //更新任务表当前位置 var curpoint = ""; var srm = ""; switch (req.rowNo) { case "1": curpoint = "1027"; srm = "SRM1"; break; case "2": curpoint = "1028"; srm = "SRM1"; break; case "3": curpoint = "1029"; srm = "SRM2"; break; case "4": curpoint = "1030"; srm = "SRM2"; break; case "5": curpoint = "1031"; srm = "SRM3"; break; case "6": curpoint = "1032"; srm = "SRM3"; break; case "7": curpoint = "1033"; srm = "SRM4"; break; case "8": curpoint = "1034"; srm = "SRM4"; break; } if (string.IsNullOrEmpty(curpoint)) { res.code = 0; res.message = "请确认巷道编号传输是否正确"; return res; } _ptService.UpdateTask(task.ResData, curpoint, srm, req.rowNo); return res; } } /// /// 机科对接-接收盘条信息接口 /// /// /// [HttpPost] public JKPalletizerRes JKTransPTInfo(JKTransPTInfo req) { lock (lockerJKTransPTInfo) { var res = new JKPalletizerRes(); var temp = PurchaseBillTrans(new PurchaseBillTransReqest() { BillCode = req.BillCode, BillType = req.BillType, Equip = "2999", ReqId = req.ReqId, SupCode = req.SupCode, SupName = req.SupName, WareCode = req.WareCode, ListInfo = new List() { new ListInfoItem(){ Batch= req.Batch, BoilerNo = req.BoilerNo, Brand = req.Brand, Carbon = req.Carbon, Describe = req.Describe, ExecStandard = req.ExecStandard, HoldDuration = req.HoldDuration, Licence = req.Licence, MatBarCode = req.MatBarCode, MatCode = req.MatCode, PackNo = req.PackNo, ProductDate = req.ProductDate, RFID = req.RFID, RodBar = req.RodBar, Weight = req.Weight } } }); if (temp.ResCode != 200) { res.code = 0; res.message = temp.ResMsg; return res; } return res; } } /// /// 流水数据归档 /// /// /// [HttpPost] public SRes FlowDataMoveJob(PtAutoPurchData request) { lock (lockerFlowDataMoveJob) { return _ptService.FlowDataMoveJob(request); } } } }