using AutoMapper; using Microsoft.AspNetCore.Mvc; using Newtonsoft.Json; using SqlSugar; using wms.dto; using wms.dto.request; using wms.dto.request.fj; using wms.dto.request.share; using wms.dto.response; using wms.dto.response.fj; using wms.service.IService; using wms.sqlsugar.model.fj; using wms.util.Ext; 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 lockerSpoolMaterialInfoTrans = new object(); private static object lockerCurtainProductionStockOut = new object(); private static object lockerProductionBack = new object(); private static object lockerErrorMaterialStockOut = new object(); private static object lockerBGradeMaterialStockOut = new object(); private static object lockerlockerStockChange = new object(); /// /// 人工组盘传输接口 /// private static object lockerManualBuildStockTrans = new object(); /// /// 一层工人创建创建空托盘库存 /// private static object lockOneFloorWorkerBuildEmptyPalletsStock = new object(); private static object lockerBomInfoTrans = new object(); #endregion 锁 /// /// 分拣控制器构造函数 /// /// 分拣服务 逻辑类 /// 日志 /// 映射器 public FjController(IFJService fjService, ILogger logger, IMapper mapper) : base(fjService) { _fjService = fjService; _logger = logger; _mapper = mapper; } /// /// 同步物料基础信息 /// /// /// [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(); } /// /// 物料主数据推送接口 /// /// /// [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(Name = "SyncMachineInfo")] public SyncMachineInfoResponse SyncMachineInfo(SyncMachineInfoRequest reqDto) { SyncMachineInfoResponse resbody = JsonConvert.DeserializeObject(WmsServiceExportApi(reqDto)); if (resbody.ResCode == ResponseStatusCodeEnum.Sucess.GetHashCode() && resbody.ResData != null && resbody.ResData.Any()) { _fjService.SyncMachineInfo(resbody.ResData); } return resbody; } /// /// 帘线生产工单信息传输接口 /// /// /// [HttpPost] public SRes CurtainProductionOrder(CurtainProductionOrderRequest reqDto) { return ConcurrencyReqControl(lockerCurtainProductionOrder, "CurtainProductionOrder" + reqDto.BillCode, reqDto.BillCode, reqDto, _fjService.CurtainProductionOrder); } /// /// 工单启动验证 /// /// /// [HttpPost] public SRes CurtainOrderStartCheck(CurtainOrderStartCheckRequest reqDto) { return ConcurrencyReqControl(lockerCurtainOrderStartCheck, "CurtainOrderStartCheck" + reqDto.BillCode, reqDto.BillCode, reqDto, _fjService.CurtainOrderStartCheck); } /// /// 湿拉工字轮/芯股信息传输接口 /// /// /// [HttpPost] public SRes SpoolMaterialInfoTrans(SpoolMaterialInfoTransRequest reqDto) { return ConcurrencyReqControl(lockerSpoolMaterialInfoTrans, "SpoolMaterialInfoTrans" + reqDto.SpoolCode, reqDto.SpoolCode, reqDto, _fjService.SpoolMaterialInfoTrans); } /// /// 湿拉工字轮入库反馈接口 /// /// /// [HttpPost(Name = "WetProductStockInFeedBack")] public SRes WetProductStockInFeedBack(string doccode) { var list = _fjService.GetBillFeedbackList(p => p.BillCode == doccode); var dtolist = _mapper.Map>(list); var dto = new WetProductStockInFeedBackRequest() { ListInfo = dtolist }; SRes resbody = JsonConvert.DeserializeObject(WmsServiceExportApi(dto)); List ids = list.Select(p => p.Id).ToList(); List doccodelist = list.Select(p => p.BillCode).ToList(); if (resbody.ResCode == ResponseStatusCodeEnum.Sucess.GetHashCode()) { //更新推送表数据 _fjService.UpdateBillFeedbackPushModelColumns(new sqlsugar.model.UpdateModelColumns() { Columns = it => new fjBillFeedbackPush { PostResult = 1, PostNum = it.PostNum + 1 }, WhereExpression = it => ids.Contains(it.Id) }); //删除单据表数据 _fjService.DeleteDoc(p => doccodelist.Contains(p.DocNo)); } else { //更新推送表数据 _fjService.UpdateBillFeedbackPushModelColumns(new sqlsugar.model.UpdateModelColumns() { Columns = it => new fjBillFeedbackPush { PostResult = 2, PostNum = it.PostNum + 1 }, WhereExpression = it => ids.Contains(it.Id) }); } return resbody; } /// /// 帘线叫料接口 /// /// /// [HttpPost(Name = "CurtainProductionStockOut")] public SRes CurtainProductionStockOut(CurtainProductionStockOutRequest reqDto) { return ConcurrencyReqControl(lockerCurtainProductionStockOut, "CurtainProductionStockOut" + reqDto.BillCode, reqDto.BillCode, reqDto, _fjService.CurtainProductionStockOut); } /// /// 叫料信息反馈接口 /// /// /// [HttpPost(Name = "CurtainProductionStockOutFeedBack")] public SRes CurtainProductionStockOutFeedBack(string doccode) { var list = _fjService.GetBillFeedbackList(p => p.BillCode == doccode && p.ApiCode == "CurtainProductionStockOutFeedBack" && p.PostResult == 0 || (p.PostResult == 2 && p.PostNum < 5)); var dtolist = _mapper.Map>(list); var dto = new CurtainProductionStockOutFeedBackRequest() { ListInfo = dtolist }; SRes resbody = JsonConvert.DeserializeObject(WmsServiceExportApi(dto)); List ids = list.Select(p => p.Id).ToList(); List doccodelist = list.Select(p => p.BillCode).ToList(); if (resbody.ResCode == ResponseStatusCodeEnum.Sucess.GetHashCode()) { //更新推送表数据 _fjService.UpdateBillFeedbackPushModelColumns(new sqlsugar.model.UpdateModelColumns() { Columns = it => new fjBillFeedbackPush { PostResult = 1, PostNum = it.PostNum + 1 }, WhereExpression = it => ids.Contains(it.Id) }); //删除单据表数据 _fjService.DeleteDoc(p => doccodelist.Contains(p.DocNo)); } else { //更新推送表数据 _fjService.UpdateBillFeedbackPushModelColumns(new sqlsugar.model.UpdateModelColumns() { Columns = it => new fjBillFeedbackPush { PostResult = 2, PostNum = it.PostNum + 1 }, WhereExpression = it => ids.Contains(it.Id) }); } return resbody; } /// /// 生产退料/余料接口 /// /// /// [HttpPost] public SRes ProductionBack(FjProductionBackRequest reqDto) { return ConcurrencyReqControl(lockerProductionBack, "ProductionBack" + reqDto.BillCode, reqDto.BillCode, reqDto, _fjService.ProductionBack); } /// /// 余料反馈接口 /// /// /// [HttpPost] public SRes ProductionLeftFeedBack(string doccode) { var list = _fjService.GetBillFeedbackList(p => p.BillCode == doccode); var dtolist = _mapper.Map>(list); var dto = new ProductionLeftFeedBackRequest() { ListInfo = dtolist }; SRes resbody = JsonConvert.DeserializeObject(WmsServiceExportApi(dto)); return resbody; } /// /// 异常料出库单传输接口 /// /// /// [HttpPost] public SRes ErrorMaterialStockOut(FjErrorMaterialStockOutRequest reqDto) { return ConcurrencyReqControl(lockerErrorMaterialStockOut, "ErrorMaterialStockOut" + reqDto.BillCode, reqDto.BillCode, reqDto, _fjService.ErrorMaterialStockOut); } /// /// 异常料出库反馈接口 /// /// /// [HttpPost] public SRes ErrorMaterialStockOutFeedBack(string doccode) { var list = _fjService.GetBillFeedbackList(p => p.BillCode == doccode); var dtolist = _mapper.Map>(list); var dto = new ErrorMaterialStockOutFeedBackRequest() { ListInfo = dtolist }; SRes resbody = JsonConvert.DeserializeObject(WmsServiceExportApi(dto)); return resbody; } /// /// B站叫料单传输接口 /// /// /// [HttpPost] public SRes BGradeMaterialStockOut(BGradeMaterialStockOutRequest reqDto) { return ConcurrencyReqControl(lockerBGradeMaterialStockOut, "BGradeMaterialStockOut" + reqDto.BillCode, reqDto.BillCode, reqDto, _fjService.BGradeMaterialStockOut); } /// /// B站出库反馈接口 /// /// /// [HttpPost] public SRes BGradeMaterialStockOutFeedBack(string doccode) { var list = _fjService.GetBillFeedbackList(p => p.BillCode == doccode); var dtolist = _mapper.Map>(list); var dto = new BGradeMaterialStockOutFeedBackRequest() { ListInfo = dtolist }; SRes resbody = JsonConvert.DeserializeObject(WmsServiceExportApi(dto)); return resbody; } /// /// 库存改判 /// /// /// [HttpPost] public SRes StockChange(FjStockChangeRequest reqDto) { return ConcurrencyReqControl(lockerlockerStockChange, "StockChange" + reqDto.BillCode, reqDto.BillCode, reqDto, _fjService.StockChange); } /// /// 改判反馈接口 /// /// /// [HttpPost] public SRes StockChangeFeedBack(string doccode) { var list = _fjService.GetBillFeedbackList(p => p.BillCode == doccode); var dtolist = _mapper.Map>(list); var dto = new StockChangeFeedBackRequest() { ListInfo = dtolist }; SRes resbody = JsonConvert.DeserializeObject(WmsServiceExportApi(dto)); return resbody; } /// /// 实时库存查询接口 /// /// /// [HttpPost] public string GetCurStockList(string reqDto) { return null; } /// /// 回库反馈接口(出库途中改判的,入库之后再次上传入库信息) /// /// /// [HttpPost] public SRes StockChangeStockInFeedBack(string doccode) { var list = _fjService.GetBillFeedbackList(p => p.BillCode == doccode); var dtolist = _mapper.Map>(list); var dto = new StockChangeStockInFeedBackRequest() { ListInfo = dtolist }; SRes resbody = JsonConvert.DeserializeObject(WmsServiceExportApi(dto)); return resbody; } ///// ///// 人工组盘传输接口 ///// ///// ///// //[HttpPost] //public SRes ManualBuildStockTrans(BuildStockTransRequest reqDto) //{ // return ConcurrencyReqControl(lockerManualBuildStockTrans, "ManualBuildStockTrans" + reqDto.PalletCode, reqDto.PalletCode, reqDto, _fjService.ManualBuildStockTrans); //} /// /// 条码信息查询接口 /// /// /// [HttpPost] public string GetMesBarCodeInfo(string req) { return ""; } /// /// BOM信息传输接口 /// /// /// [HttpPost] public SRes BomInfoTrans(BomInfoTransRequest reqDto) { return ConcurrencyReqControl(lockerBomInfoTrans, "BomInfoTrans" + reqDto.BomCode, reqDto.BomCode, reqDto, _fjService.BomInfoTrans); } #region 一楼入库任务生成接口 /// /// 一楼空托盘人工入库任务创建 /// /// /// [HttpPost] public SRes OneFloorWorkerBuildEmptyPalletsStock(FJBuildEmptyPalletsStockRequest reqDto) { return ConcurrencyReqControl(lockOneFloorWorkerBuildEmptyPalletsStock, "OneFloorWorkerBuildEmptyPalletsStock" + reqDto.PalletCode, reqDto.PalletCode, reqDto, _fjService.OneFloorWorkerBuildEmptyPalletsStock); } #endregion 一楼入库任务生成接口 #region 生成货位基础配置 /// /// 分拣自动生成货位信息 /// [HttpPost] public void FJAutoGenerateLocation() { _fjService.FJ1NorthAutoGenerateLocation(); _fjService.FJSouthAutoGenerateLocation(); } #endregion 生成货位基础配置 } }