using AutoMapper; using Microsoft.AspNetCore.Mvc; using Newtonsoft.Json; using SqlSugar; using WCS.Entity.fj; using wms.api.Job; using wms.dto; using wms.dto.request.fj; using wms.dto.request.hj; using wms.dto.request.hj.dto; using wms.dto.request.share; using wms.dto.response; using wms.dto.response.fj; using wms.service.IService; using wms.service.Service; using wms.sqlsugar.model.fj; using wms.util.Check; using wms.util.Ext; using wms.util.Http; namespace wms.api.Controllers { /// /// 分拣库控制器 /// [Route("api/[controller]/[action]")] [ApiController] public class FjController : BaseController { /// /// 分拣服务 逻辑类 /// private readonly IFJService _fjService; /// /// 日志 /// private readonly ILogger _logger; /// /// 映射器 /// private readonly IMapper _mapper; #region 锁 private static object lockerCurtainProductionOrder = new object(); private static object lockerCurtainOrderStartCheck = new object(); private static object lockerFjEditorialFlow = new object(); private static object lockerSpoolMaterialInfoTrans = new object(); private static object lockerCurtainProductionStockOut = new object(); private static object lockerCurtainProductionStockOut1 = new object(); private static object lockerProductionBack = new object(); private static object lockerCreateMaterialPalletWarehouTask = new object(); private static object lockerCreateMaterialPalletWarehouTask1 = new object(); private static object lockerCreateMaterialPalletWarehouTask2 = new object(); private static object lockerMaterialReturnTaskCreator = new object(); private static object lockerErrorMaterialStockOut = new object(); private static object lockerBGradeMaterialStockOut = new object(); private static object lockerlockerStockChange = new object(); private static object lockerWetFormulaInfo = new object(); private static object lockerManualBuildEmptyStock = new object(); private static object lockFindAvailableFlatStorageSlot = new object(); /// /// 人工组盘传输接口 /// private static object lockerManualBuildStockTrans = new object(); /// /// 一层工人创建创建空托盘库存 /// private static object lockOneFloorWorkerBuildEmptyPalletsStock = new object(); /// /// /// private static object lockGroupTask = new object(); // /// /// private static object lockBingPallet = new object(); // /// /// private static object lockGetTwoPallet = new object(); /// /// 申请货位 /// private static object lockApplyStockInLoc = new object(); /// /// 完成任务 /// private static object lockerCompleteTask = new object(); /// /// 取消任务 /// private static object lockerCancelTask = new object(); /// /// 手动出库任务 /// private static object lockManualTask = new object(); /// /// 空托盘组申请出库 /// private static object lockApplyEmptyPalletGroupOutStorage = new object(); /// /// 组盘工字轮创建异常任务 /// private static object palletizingCreateseErrorTasks = new object(); /// /// 空托盘组申请出库 /// private static object lockRingApplyStockInLoc = new object(); /// /// 环形库请求码垛出库任务 /// private static object lockApplyPalletizingStockOut = new object(); /// /// 堆垛机从出库完成 /// private static object lockerSrmPickOutCompleted = new object(); private static object lockerBomInfoTrans = new object(); private static object lockFJEnteMainLineRequest = new object(); private static object lockAllocatedSpoolFlow = new object(); #endregion 锁 /// /// 分拣控制器构造函数 /// /// 分拣服务 逻辑类 /// 日志 /// 映射器 public FjController(IFJService fjService, ILogger logger, IMapper mapper) : base(fjService) { _fjService = fjService; _logger = logger; _mapper = mapper; } #region 暂时不用 /// /// 同步物料基础信息 /// /// /// //[HttpPost] //public string SyncMaterInfo(SyncMaterInfoRequest reqBody) //{ // var result = new SRes(); // //_logger.LogInformation("请求参数:{@reqBody},{aa}", reqBody,1); // FJSyncMaterInfoResponse resbody = JsonConvert.DeserializeObject(WmsServiceExportApi(reqBody)); // if (reqBody.SyncType == 1) // { // reqBody.PageIndex = 1; // while (resbody.ResData !=null && resbody.ResData.Any()) // { // _fjService.SyncMaterInfo(resbody.ResData); // reqBody.PageIndex++; // resbody = JsonConvert.DeserializeObject(WmsServiceExportApi(reqBody)); // } // } // else if (reqBody.SyncType == 2) // { // //拿到增量 // var increconf = _fjService.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 (_fjService.SyncMaterInfo(resbody.ResData)) // { // var lastdata = resbody.ResData.OrderBy(p => p.UpdatedTime).Last(); // _fjService.UpdateSysConfigModelColumns(new sqlsugar.model.UpdateModelColumns() // { // Columns = it => new fjSysConfig { 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 (_fjService.SyncMaterInfo(resbody.ResData)) // { // } // } // } // } // return result.ToCamelCaseString(); //} /// /// BOM信息传输接口 /// /// /// //[HttpPost] //public SRes BomInfoTrans(BomInfoTransRequest reqDto) //{ // return ConcurrencyReqControl(lockerBomInfoTrans, "BomInfoTrans" + reqDto.BomCode, reqDto.BomCode, reqDto, _fjService.BomInfoTrans); //} #endregion 暂时不用 /// /// 创建货位,用于少数虚拟货位及平库 /// /// 仓库号 /// 货位号 /// [HttpPost] public SRes CreatWarecell(string WarehouseCode, string Code) { return _fjService.CreatWarecell(WarehouseCode, Code); } /// /// 物料主数据推送接口(湿拉) /// /// /// [HttpPost] public SRes SyncMaterInfoList(FJSyncMaterInfoListRequest reqBody) { var res = new SRes(); if (reqBody.ListInfo == null || !reqBody.ListInfo.Any()) { res.ResCode = ResponseStatusCodeEnum.DocDetailNotExist.GetHashCode(); res.ResMsg = ResponseStatusCodeEnum.DocDetailNotExist.GetDescription(); return res; } _fjService.SyncMaterInfo(_mapper.Map>(reqBody.ListInfo)); return res; } /// /// 物料主数据推送接口(帘线) /// /// /// [HttpPost] public SRes SyncMaterInfoListForLX(SxSyncMaterInfoListRequest reqBody) { var res = new SRes(); if (reqBody.ListInfo == null || !reqBody.ListInfo.Any()) { res.ResCode = ResponseStatusCodeEnum.DocDetailNotExist.GetHashCode(); res.ResMsg = ResponseStatusCodeEnum.DocDetailNotExist.GetDescription(); return res; } _fjService.SyncMaterInfoLX(reqBody.ListInfo); return res; } /// /// 机台信息同步接口 /// /// /// [HttpPost(Name = "SyncMachineInfo")] public SRes SyncMachineInfo(SyncMachineInfoRequest reqDto) { //SyncMachineInfoResponse resbody = JsonConvert.DeserializeObject(WmsServiceExportApi(reqDto)); //if (resbody.ResCode == ResponseStatusCodeEnum.Sucess.GetHashCode() && resbody.ResData != null && resbody.ResData.Any()) //{ return _fjService.SyncMachineInfo(reqDto); //} } /// /// 创建芯股用空托入库任务 /// /// [HttpPost(Name = "CreateCoreStrandEmptyPalletEnterWarehouse")] public void CreateCoreStrandEmptyPalletEnterWarehouse() { _fjService.CreateCoreStrandEmptyPalletEnterWarehouse(); } /// /// 创建芯股站台用的空托出库任务 /// /// [HttpPost(Name = "CoreStrandSupportReplenishEmptyPallet")] public SRes CoreStrandSupportReplenishEmptyPallet() { return _fjService.CoreStrandSupportReplenishEmptyPallet(); } /// /// 投料信息同步接口 /// /// /// [HttpPost(Name = "WetFormulaInfo")] public SRes WetFormulaInfo(WetFormulaInfoRequest reqDto) { return ConcurrencyReqControl(lockerWetFormulaInfo, "WetFormulaInfo", reqDto.FeedCode, reqDto, _fjService.WetFormulaInfo); } /// /// 帘线生产工单信息传输接口 /// /// /// [HttpPost] public SRes CurtainProductionOrder(CurtainProductionOrderRequest reqDto) { var res = ConcurrencyReqControl(lockerCurtainProductionOrder, "CurtainProductionOrder", reqDto.BillCode, reqDto, _fjService.CurtainProductionOrder); try { HttpUtil.PostRequest("http://10.30.44.3:8011/api/sx/CurtainProductionOrder", JsonConvert.SerializeObject(reqDto), 30000, "UTF-8", "application/json"); } catch (Exception ex) { _logger.LogInformation("调用时效工单异常" + ex.ToString()); } return res; } /// /// 湿拉工单启动验证 /// /// /// [HttpPost] public SRes CurtainOrderStartCheck(CurtainOrderStartCheckRequest reqDto) { return ConcurrencyReqControl(lockerCurtainOrderStartCheck, "CurtainOrderStartCheck", reqDto.BillCode, reqDto, _fjService.CurtainOrderStartCheck); } /// /// 变更流向 /// /// /// [HttpPost] public SRes EditorialFlow(FjEditorialFlowRequest reqDto) { return ConcurrencyReqControl(lockerFjEditorialFlow, "EditorialFlow", reqDto.LocCode, reqDto, _fjService.EditorialFlow); } /// /// 湿拉工字轮/芯股信息传输接口 /// /// /// [HttpPost] public SRes SpoolMaterialInfoTrans(SpoolMaterialInfoTransRequest reqDto) { return ConcurrencyReqControl(lockerSpoolMaterialInfoTrans, "SpoolMaterialInfoTrans", reqDto.SpoolCode, reqDto, _fjService.SpoolMaterialInfoTrans); } /// /// AGV上报状态变更接口 /// /// /// [HttpPost] public AgvCallbackResponse AgvCallback(AgvCallbackRequest reqDto) { return _fjService.AgvCallback(reqDto); //return ConcurrencyReqControl(lockerSpoolMaterialInfoTrans, "SpoolMaterialInfoTrans", reqDto.SpoolCode, reqDto, _fjService.SpoolMaterialInfoTrans); } /// /// 获取工字轮流向(江锦调用) /// /// /// [HttpPost] public SRes AllocatedSpoolFlow(AllocatedSpoolFlowRequest reqDto) { return _fjService.AllocatedSpoolFlow(reqDto); } /// /// MES获取流向异常信息 /// /// /// [HttpPost] public SRes QueryFlowDirectionExceptions(GetFlowExceptionResultsRequest reqDto) { return _fjService.QueryFlowDirectionExceptions(reqDto); } private SRes ComPushData(SRes resbody, List ids) { var res = new SRes(); try { if (resbody.ResCode == ResponseStatusCodeEnum.Sucess.GetHashCode()) { //更新推送表数据 _fjService.UpdateBillPushinfoModelColumns(new sqlsugar.model.UpdateModelColumns() { Columns = it => new BillPushinfo { PostResult = 1, PostQty = it.PostQty + 1 }, WhereExpression = it => ids.Contains(it.Id) }); //删除单据表数据 //_fjService.DeleteDoc(p => doccodelist.Contains(p.DocNo)); } else { //更新推送表数据 _fjService.UpdateBillPushinfoModelColumns(new sqlsugar.model.UpdateModelColumns() { Columns = it => new BillPushinfo { PostResult = 2, PostQty = it.PostQty + 1 }, WhereExpression = it => ids.Contains(it.Id) }); } } catch (Exception ex) { res.ResCode = ResponseStatusCodeEnum.DataSaveErr.GetHashCode(); res.ResMsg = ResponseStatusCodeEnum.DataSaveErr.GetDescription(); _logger.LogInformation("反馈数据推送" + ex.ToString()); } return res; } /// /// 湿拉工字轮入库反馈接口 /// /// [HttpPost(Name = "WetProductStockInFeedBack")] public SRes WetProductStockInFeedBack() { var list = _fjService.GetBillPushinfoList(p => p.PostResult != 1 && p.PostQty <= 5 && p.TypeCode == fjFackbeekType.InterfaceType_FJ_StockIn.ToString()); var dtolist = _mapper.Map>(list); var dto = new WetProductStockInFeedBackRequest() { ListInfo = dtolist }; SRes resbody = JsonConvert.DeserializeObject(WmsServiceExportApi(dto)); return ComPushData(resbody, list.Select(p => p.Id).ToList()); } /// /// 数据推送接口 /// /// /// [HttpPost] public PushResponse FJPushErpDate(PushDate request) { var result = new PushResponse(); //自动推送 request.Type = FackbeekType.InterfaceType_HJ_1F_StockIn.ToString(); var onefloor = _fjService.GetBillPushinfoList(p => p.PostResult != 1 && p.PostQty <= 5 && p.TypeCode == fjFackbeekType.InterfaceType_FJ_StockIn.ToString(), true); foreach (var item in onefloor.GroupBy(p => p.RFIDBarCode)) { PushRequest push = new PushRequest() { ListInfo = new List() }; push.WareCode = "fjhouse"; push.WareName = "分拣库"; push.LocCode = item.First().WareCellCode; push.TrayCode = "TPB"; push.TrayType = "TPB"; push.ListInfo = item.Select(q => new ListInfoInfo() { MatBarCode = q.CLBarCode, SpoolCode = q.HWBarCode }).ToList(); var resbody = JsonConvert.DeserializeObject(WmsServiceExportMq(push)); var matBarCode = push.ListInfo.Select(p => p.MatBarCode).ToList(); if (resbody.success == true || resbody.ResCode == 200) { _fjService.UpdatePushModelColumns(new sqlsugar.model.UpdateModelColumns() { Columns = it => new BillPushinfo { PostResult = 1, PostQty = it.PostQty + 1, ResDesc = "自动推送", EditTime = DateTime.Now }, WhereExpression = it => matBarCode.Contains(it.CLBarCode) }); } else { _fjService.UpdatePushModelColumns(new sqlsugar.model.UpdateModelColumns() { Columns = it => new BillPushinfo { PostResult = 2, PostQty = it.PostQty + 1, EditTime = DateTime.Now, Memo = resbody.ResMsg }, WhereExpression = it => matBarCode.Contains(it.CLBarCode) }); } } return result; } /// /// 帘线叫料接口 /// /// /// [HttpPost(Name = "CurtainProductionStockOut")] public SRes CurtainProductionStockOut(CurtainProductionStockOutRequest reqDto) { return ConcurrencyReqControl(lockerCurtainProductionStockOut, "CurtainProductionStockOut" + reqDto.BillCode, reqDto.BillCode, reqDto, _fjService.CurtainProductionStockOut); } /// /// 帘线叫料接口(人工码垛托盘) /// /// /// [HttpPost(Name = "CurtainProductionStockOut1")] public SRes CurtainProductionStockOut1(CurtainProductionStockOutRequest1 reqDto) { return ConcurrencyReqControl(lockerCurtainProductionStockOut1, "CurtainProductionStockOut1" + reqDto.BillCode, reqDto.BillCode, reqDto, _fjService.CurtainProductionStockOut1); } /// /// 帘线手动叫料接口 /// /// /// [HttpPost(Name = "ManualCurtainProductionStockOut")] public SRes ManualCurtainProductionStockOut(ManualCurtainProductionStockOut reqDto) { return _fjService.ManualCurtainProductionStockOut(reqDto); } /// /// 人工创建满托入库任务 /// /// /// [HttpPost] public SRes CreateMaterialPalletWarehouTask(CreateMaterialPalletWarehouTaskRequest reqDto) { return ConcurrencyReqControl(lockerCreateMaterialPalletWarehouTask, "CreateMaterialPalletWarehouTask", reqDto.SpoolNr, reqDto, _fjService.CreateMaterialPalletWarehouTask); } /// /// 人工创建UT满托入库任务 /// /// /// [HttpPost] public SRes CreateMaterialUTPalletWarehouTask(CreateMaterialPalletWarehouTaskRequest reqDto) { return ConcurrencyReqControl(lockerCreateMaterialPalletWarehouTask, "CreateMaterialUTPalletWarehouTask", reqDto.SpoolNr, reqDto, _fjService.CreateMaterialUTPalletWarehouTask); } /// /// 芯股满托创建库存信息 /// /// /// [HttpPost] public SRes CreateMaterialPalletWarehouTask1(CreateMaterialPalletWarehouTask1Request reqDto) { return ConcurrencyReqControl(lockerCreateMaterialPalletWarehouTask1, "CreateMaterialPalletWarehouTask1", reqDto.SpoolNr, reqDto, _fjService.CreateMaterialPalletWarehouTask1); } /// /// 芯股满托创建库存信息 /// /// /// [HttpPost] public SRes CreateMaterialPalletWarehouTask2(RewindFullPalletTaskRequest reqDto) { return ConcurrencyReqControl(lockerCreateMaterialPalletWarehouTask2, "CreateMaterialPalletWarehouTask2", reqDto.TrayCode, reqDto, _fjService.CreateMaterialPalletWarehouTask2); } /// /// 创建退料任务 /// /// /// [HttpPost] public SRes MaterialReturnTaskCreator(MaterialReturnTaskCreatorRequest reqDto) { return ConcurrencyReqControl(lockerMaterialReturnTaskCreator, "lockerMaterialReturnTaskCreator", reqDto.LocCode, reqDto, _fjService.MaterialReturnTaskCreator); } /// /// 叫料信息反馈接口 /// /// /// [HttpPost(Name = "CurtainProductionStockOutFeedBack")] public SRes CurtainProductionStockOutFeedBack() { var list = _fjService.GetBillPushinfoList(p => p.PostResult != 1 && p.PostQty <= 5 && p.TypeCode == fjFackbeekType.InterfaceType_FJ_StockOut.ToString()); var dtolist = _mapper.Map>(list); var dto = new CurtainProductionStockOutFeedBackRequest() { ListInfo = dtolist }; SRes resbody = JsonConvert.DeserializeObject(WmsServiceExportApi(dto)); return ComPushData(resbody, list.Select(p => p.Id).ToList()); } /// /// 生产退料/余料接口 /// /// /// [HttpPost] public SRes ProductionBack(FjProductionBackRequest reqDto) { return ConcurrencyReqControl(lockerProductionBack, "ProductionBack", reqDto.BillCode, reqDto, _fjService.ProductionBack); } /// /// 余料反馈接口 /// /// /// [HttpPost] public SRes ProductionLeftFeedBack() { var list = _fjService.GetBillPushinfoList(p => p.PostResult != 1 && p.PostQty <= 5 && p.TypeCode == fjFackbeekType.InterfaceType_FJ_LeftStockIn.ToString()); var dtolist = _mapper.Map>(list); var dto = new ProductionLeftFeedBackRequest() { ListInfo = dtolist }; SRes resbody = JsonConvert.DeserializeObject(WmsServiceExportApi(dto)); return ComPushData(resbody, list.Select(p => p.Id).ToList()); } /// /// 异常料出库单传输接口 /// /// /// [HttpPost] public SRes ErrorMaterialStockOut(FjErrorMaterialStockOutRequest reqDto) { return ConcurrencyReqControl(lockerErrorMaterialStockOut, "ErrorMaterialStockOut", reqDto.BillCode, reqDto, _fjService.ErrorMaterialStockOut); } /// /// 异常料出库反馈接口 /// /// /// [HttpPost] public SRes ErrorMaterialStockOutFeedBack() { var list = _fjService.GetBillPushinfoList(p => p.PostResult != 1 && p.PostQty <= 5 && p.TypeCode == fjFackbeekType.InterfaceType_FJ_ErrStockOut.ToString()); var dtolist = _mapper.Map>(list); var dto = new ErrorMaterialStockOutFeedBackRequest() { ListInfo = dtolist }; SRes resbody = JsonConvert.DeserializeObject(WmsServiceExportApi(dto)); return ComPushData(resbody, list.Select(p => p.Id).ToList()); } /// /// B站叫料单传输接口 /// /// /// [HttpPost] public SRes BGradeMaterialStockOut(BGradeMaterialStockOutRequest reqDto) { return ConcurrencyReqControl(lockerBGradeMaterialStockOut, "BGradeMaterialStockOut", reqDto.BillCode, reqDto, _fjService.BGradeMaterialStockOut); } /// /// B站出库反馈接口 /// /// /// [HttpPost] public SRes BGradeMaterialStockOutFeedBack() { var list = _fjService.GetBillPushinfoList(p => p.PostResult != 1 && p.PostQty <= 5 && p.TypeCode == fjFackbeekType.InterfaceType_FJ_BGradeStockOut.ToString()); var dtolist = _mapper.Map>(list); var dto = new BGradeMaterialStockOutFeedBackRequest() { ListInfo = dtolist }; SRes resbody = JsonConvert.DeserializeObject(WmsServiceExportApi(dto)); return ComPushData(resbody, list.Select(p => p.Id).ToList()); } /// /// 库存改判 /// /// /// [HttpPost] public SRes StockChange(FjStockChangeRequest reqDto) { return ConcurrencyReqControl(lockerlockerStockChange, "FJStockChange", reqDto.BillCode, reqDto, _fjService.StockChange); } /// /// 改判反馈接口 /// /// /// [HttpPost] public SRes StockChangeFeedBack() { var list = _fjService.GetBillPushinfoList(p => p.PostResult != 1 && p.PostQty <= 5 && p.TypeCode == fjFackbeekType.InterfaceType_FJ_StockChanage.ToString()); var dtolist = _mapper.Map>(list); var dto = new dto.request.fj.StockChangeFeedBackRequest() { ListInfo = dtolist }; SRes resbody = JsonConvert.DeserializeObject(WmsServiceExportApi(dto)); return ComPushData(resbody, list.Select(p => p.Id).ToList()); } /// /// 实时库存查询接口 /// /// /// [HttpPost(Name = "GetFJCurStockList")] public GetFJCurStockListResponse GetFJCurStockList(GetFJCurStockListRequest reqDto) { return _fjService.GetCurStockList(reqDto); } /// /// 回库反馈接口(出库途中改判的,入库之后再次上传入库信息) /// /// /// [HttpPost] public SRes StockChangeStockInFeedBack() { var list = _fjService.GetBillPushinfoList(p => p.PostResult != 1 && p.PostQty <= 5 && p.TypeCode == fjFackbeekType.InterfaceType_FJ_ChanageBack.ToString()); var dtolist = _mapper.Map>(list); var dto = new StockChangeStockInFeedBackRequest() { ListInfo = dtolist }; SRes resbody = JsonConvert.DeserializeObject(WmsServiceExportApi(dto)); return resbody; } /// /// 人工组盘传输接口 /// /// /// [HttpPost] public SRes ManualBuildStockTrans(ManualBuildStockTransRequest reqDto) { return ConcurrencyReqControl(lockerManualBuildStockTrans, "ManualBuildStockTrans", reqDto.PalletCode, reqDto, _fjService.ManualBuildStockTrans); } /// /// 条码信息查询接口 /// /// /// [HttpPost] public string GetMesBarCodeInfo(string req) { return ""; } /// /// 空托组盘 /// /// /// [HttpPost] public SRes ManualBuildEmptyStock(ManualBuildEmptyStockRequest reqDto) { return ConcurrencyReqControl(lockerManualBuildEmptyStock, "ManualBuildEmptyStock", reqDto.ContGrpBarCode, reqDto, _fjService.ManualBuildEmptyStock); } #region 一楼入库任务生成接口 /// /// 一楼空托盘人工入库任务创建 /// /// /// [HttpPost] public SRes OneFloorWorkerBuildEmptyPalletsStock(FJBuildEmptyPalletsStockRequest reqDto) { return ConcurrencyReqControl(lockOneFloorWorkerBuildEmptyPalletsStock, "OneFloorWorkerBuildEmptyPalletsStock", reqDto.StartLoc, reqDto, _fjService.OneFloorWorkerBuildEmptyPalletsStock); } #endregion 一楼入库任务生成接口 /// /// 生成组盘任务,空托盘 /// /// /// [HttpPost] public SRes GroupTask(FJBuildEmptyPalletsStockDto reqDto) { return ConcurrencyReqControl(lockGroupTask, "GroupTask", reqDto.StartLoc, reqDto, _fjService.GroupTask); } /// /// 整托入库 /// /// /// [HttpPost] public SRes BingPallet(FJBingPalletDto reqDto) { return ConcurrencyReqControl(lockBingPallet, "BingPallet" + reqDto.loc, reqDto.loc, reqDto, _fjService.BingPallet); } /// /// 整托入库 /// /// /// [HttpPost] public SRes GetTwoPallet(FJGetTwoPalletDto reqDto) { return ConcurrencyReqControl>(lockGetTwoPallet, "GetTwoPallet", reqDto.WarehouseCode, reqDto, _fjService.GetTwoPallet); } /// /// 申请货位 /// /// /// [HttpPost] public SRes ApplyStockInLoc(FJApplyStockInLocRequest reqDto) { return ConcurrencyReqControl>(lockApplyStockInLoc, "ApplyStockInLoc" + reqDto.PickUpEquipmentNo, reqDto.PickUpEquipmentNo, reqDto, _fjService.ApplyStockInLoc); } /// /// 平库申请货位 /// /// /// [HttpPost] public SRes FindAvailableFlatStorageSlot(FJApplyStockInLocRequest reqDto) { return ConcurrencyReqControl>(lockFindAvailableFlatStorageSlot, "FindAvailableFlatStorageSlot" + reqDto.PickUpEquipmentNo, reqDto.PickUpEquipmentNo, reqDto, _fjService.FindAvailableFlatStorageSlot); } /// /// 空托出库任务 /// /// /// [HttpPost] public SRes ApplyEmptyPalletGroupOutStorage(FjApplyEmptyPalletGroupOutStorageRequest reqDto) { return ConcurrencyReqControl(lockApplyEmptyPalletGroupOutStorage, "ApplyEmptyPalletGroupOutStorage", reqDto.AddTo, reqDto, _fjService.ApplyEmptyPalletGroupOutStorage); } /// /// 获取垛型数组 /// /// /// [HttpPost] public SRes> FjGetSetGrpList(FjGetSetGrpListRequest req) { return _fjService.FjGetSetGrpList(req); } /// /// 环形库申请货位 /// /// /// [HttpPost] public SRes RingApplyStockInLoc(FJApplyStockInLocRequest reqDto) { return ConcurrencyReqControl>(lockRingApplyStockInLoc, "RingApplyStockInLoc" + "Robot", "Robot", reqDto, _fjService.RingApplyStockInLoc); } /// /// WCS申请码垛出库 /// /// /// [HttpPost] public SRes ApplyPalletizingStockOut(RingApplyPalletizingStockOutRequest reqDto) { return ConcurrencyReqControl(lockApplyPalletizingStockOut, "ApplyPalletizingStockOut" + reqDto.WareHouseCode, reqDto.WareHouseCode, reqDto, _fjService.ApplyPalletizingStockOut); } /// /// 手动出库 /// /// /// [HttpPost] public string ManualTask(FJManualTaskRequest request) { lock (lockManualTask) { return _fjService.ManualTask(request); } } /// /// 堆垛机出库放货完成 /// /// /// [HttpPost] public SRes SrmPickOutCompleted(SrmPickOutCompletedRequest reqDto) { lock (lockerSrmPickOutCompleted) { return _fjService.SrmPickOutCompleted(reqDto); } } /// /// 码垛创建异常任务 /// /// /// [HttpPost] public SRes PalletizingCreateseErrorTasks(PalletizingCreateseErrorTasksRequest reqDto) { return ConcurrencyReqControl(palletizingCreateseErrorTasks, "PalletizingCreateseErrorTasks" + reqDto.EquNo, reqDto.EquNo, reqDto, _fjService.PalletizingCreateseErrorTasks); } /// /// 获取任务信息 /// /// 条码 /// [HttpPost] public SRes GetTaskInfo(FJGetTaskInfoRequest dto) { return _fjService.GetTaskInfo(dto); } /// /// 完成任务 /// /// /// [HttpPost] public SRes CompleteTask(CompleteTaskRequest reqDto) { lock (lockerCompleteTask) { return _fjService.CompleteTask(reqDto); } } /// /// 取消任务 /// /// /// [HttpPost] public SRes CancelTask(CompleteTaskRequest reqDto) { lock (lockerCancelTask) { return _fjService.CancelTask(reqDto); } } #region 生成货位基础配置 /// /// 分拣自动生成货位信息 /// [HttpPost] public void FJAutoGenerateLocation() { //_fjService.FJ1NorthAutoGenerateLocation(); _fjService.FJSouthAutoGenerateLocation(); } #endregion 生成货位基础配置 #region 生成货位基础配置 /// /// 分拣环形库自动生成库位 /// [HttpPost] public void RingLibraryAutoGenerateLocation(string WareCode) { _fjService.RingLibraryAutoGenerateLocation(WareCode); } #endregion 生成货位基础配置 /// /// 工字轮/芯股进入主线扫码 /// [HttpPost] public SRes EnteMainLine(FJEnteMainLineRequest reqDto) { return ConcurrencyReqControl>(lockFJEnteMainLineRequest, "EnteMainLine" + reqDto.equNo, reqDto.equNo, reqDto, _fjService.EnteMainLine); } [HttpPost] public string GetId() { //var list = _fjService.GetBaseMatinfoList(p => p.Id < 1000); //foreach (var item in list) //{ // var id = IdFactory.NewId(); // //var tempid = item.Id; // item.WarehouseId = id; // _fjService.UpdateMaterModel(item); //} return IdFactory.NewId().ToString(); } #region 数据归档 /// /// 库存流水信息数据归档 /// /// [HttpPost] public SRes InvFlowMoveToHistory() { return ConcurrencyReqControl("InvFlowMoveToHistory", "流水数据归档", _fjService.InvFlowMoveToHistory); } #endregion 数据归档 #region 定时器 [HttpPost] public string StartJob(DetailRequest2Str req) { var res = new SRes(); var sysjob = _fjService.GetSysJobEntity(new DetailRequest2Str() { Id = req.Id }); if (sysjob == null) { res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode(); 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(DetailCodeRequest reqEntity) { var res = new SRes(); if (string.IsNullOrEmpty(reqEntity.Code)) { res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode(); res.ResMsg = "参数错误"; return res.ToCamelCaseString(); } var jobEntity = _fjService.GetSysJobEntityByCode(reqEntity.Code); if (jobEntity == null) { res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode(); res.ResMsg = "没有找到该编码"; return res.ToCamelCaseString(); } var jobapilist = _fjService.GetSysApiDetail(jobEntity.Id); if (jobapilist.Any()) { foreach (var item in jobapilist) { Task.Run(() => { HttpUtil.PostRequest(item.ApiUrl, item.RequestBody); }); } } return res.ToCamelCaseString(); } /// /// 分页Job列表 /// /// /// [HttpPost] public List GetSysJobList(GetSysJobListRequest reqEntity) { var list = _fjService.GetJobList(); 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 = _fjService.GetSysJobEntityByCode(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"; } } #endregion 定时器 } }