public IActionResult AddOrUpdate([FromForm] Wms_warehouse model, [FromForm] string id) { var validator = new WarehouseFluent(); var results = validator.Validate(model); var success = results.IsValid; if (!success) { string msg = results.Errors.Aggregate("", (current, item) => (current + item.ErrorMessage + "</br>")); return(BootJsonH((PubEnum.Failed.ToInt32(), msg))); } if (id.IsEmptyZero()) { if (_warehouseServices.IsAny(c => c.WarehouseNo == model.WarehouseNo || c.WarehouseName == model.WarehouseName)) { return(BootJsonH((false, PubConst.Warehouse1))); } model.WarehouseId = PubId.SnowflakeId; model.CreateBy = UserDtoCache.UserId; bool flag = _warehouseServices.Insert(model); return(BootJsonH(flag ? (flag, PubConst.Add1) : (flag, PubConst.Add2))); } else { model.WarehouseId = id.ToInt64(); model.ModifiedBy = UserDtoCache.UserId; model.ModifiedDate = DateTimeExt.DateTime; var flag = _warehouseServices.Update(model); return(BootJsonH(flag ? (flag, PubConst.Update1) : (flag, PubConst.Update2))); } }
private RouteData StockCountCore( string StockInventoryId, DateTime StockCountDate, string WarehouseID, OutsideStockCountMaterial[] materials) { if (materials.Length == 0) { return(YL.Core.Dto.RouteData.From(PubMessages.E2204_STOCKCOUNT_MATERIAL_ZERO)); } string warehouseNo = string.IsNullOrWhiteSpace(WarehouseID) ? "A00" : WarehouseID; Wms_warehouse warehouse = WMSApiManager.GetWarehouse(warehouseNo); if (warehouse == null) { return(YL.Core.Dto.RouteData.From(PubMessages.E1026_SUPPLIES_WAREHOUSEID_NOTFOUND, $"warehouseId = {warehouseNo}")); } long warehouseId = warehouse.WarehouseId; IWMSBaseApiAccessor proxy = WMSApiManager.GetBaseApiAccessor(warehouseId.ToString(), _sqlClient); Wms_mestask mesTask = new Wms_mestask() { MesTaskId = PubId.SnowflakeId, MesTaskType = MESTaskTypes.StockCount, WarehousingId = StockInventoryId, //入库单编号 WarehousingType = String.Empty, //入库类型 WarehousingTime = StockCountDate, //入库时间 ProductionPlanId = String.Empty, //生产令号 BatchPlanId = String.Empty, //批次号 WorkAreaName = String.Empty, //作业区 SuppliesKinds = materials.Length, //物料种类 SuppliesInfoJson = "", // jsonSuppliesInfoStr, //物料信息 WorkStatus = MESTaskWorkStatus.WaitPlan, //等待计划 NotifyStatus = MESTaskNotifyStatus.Requested, //已接收 CreateDate = DateTime.Now }; RouteData result = null; try { result = proxy.StockCount(new OutsideStockCountRequestDto() { MesTaskId = mesTask.MesTaskId, StockCountNo = StockInventoryId, PlanDate = StockCountDate.ToString(PubConst.Format_Date), MaterialList = materials }).GetAwaiter().GetResult(); if (result == null || !result.IsSccuess) { mesTask.WorkStatus = MESTaskWorkStatus.Failed; mesTask.Remark = result.Message; } } catch (Exception ex) { mesTask.WorkStatus = MESTaskWorkStatus.Failed; mesTask.Remark = ex.Message; } _mastaskServices.Insert(mesTask); return(result); }
/// <summary> /// 获取操作API /// </summary> /// <param name="key"></param> /// <param name="sqlSugar"></param> /// <param name="user"></param> /// <returns></returns> public static IWMSOperationApiAccessor GetOperationApiAccessor(string key, ISqlSugarClient sqlSugar, SysUserDto user) { if (_operationApiInstanceMap.ContainsKey(key)) { return(_operationApiInstanceMap[key]); } if (!_warehouseMap.ContainsKey(key)) { return(null); } Wms_warehouse warehouse = _warehouseMap[key]; IWMSOperationApiAccessor accessor = null; if (string.IsNullOrWhiteSpace(warehouse.IFAddress)) { accessor = new SelfWMSOperationApiAccessor(warehouse, sqlSugar, user); } else { //TODO 操作API外部接口,第三方库暂不使用 accessor = null; // new WMSApiAccessor(warehouse); _operationApiInstanceMap.Add(key, accessor); } return(accessor); }
protected static void CreateStoragerack(SqlSugarClient sqlClient, Wms_warehouse warehouse, Wms_reservoirarea reservoirarea, int row, int columnCount, int floorCount) { for (int column = 1; column <= columnCount; column++) { for (int floor = 1; floor <= floorCount; floor++) { string code = warehouse.WarehouseId.ToString().PadLeft(2, '0') + row.ToString().PadLeft(2, '0') + column.ToString().PadLeft(2, '0') + floor.ToString().PadLeft(2, '0'); string no = row.ToString().PadLeft(2, '0') + column.ToString().PadLeft(2, '0') + floor.ToString().PadLeft(2, '0'); int id = Convert.ToInt32(code); Wms_storagerack storagerack = new Wms_storagerack() { StorageRackId = id, StorageRackNo = "KW-" + no, StorageRackName = "库位" + code, ReservoirAreaId = reservoirarea.ReservoirAreaId, ReservoirAreaName = reservoirarea.ReservoirAreaName, WarehouseId = warehouse.WarehouseId, Row = row, Floor = floor, Column = column, Remark = "", CreateBy = 1, CreateUser = "******", CreateDate = DateTime.Now, ModifiedBy = 1, ModifiedUser = "******", ModifiedDate = DateTime.Now, IsDel = DeleteFlag.Normal, }; sqlClient.Insertable(storagerack).ExecuteCommand(); Wms_inventorybox box = new Wms_inventorybox() { InventoryBoxId = id, InventoryBoxNo = "LK_LX_" + code, InventoryBoxName = "料箱-" + code, WarehouseId = reservoirarea.WarehouseId, ReservoirAreaId = reservoirarea.ReservoirAreaId, ReservoirAreaName = reservoirarea.ReservoirAreaName, StorageRackId = storagerack.StorageRackId, StorageRackName = storagerack.StorageRackName, Row = storagerack.Row, Column = storagerack.Column, Floor = storagerack.Floor, Size = 1, UsedSize = 0, Remark = "", IsDel = DeleteFlag.Normal, Status = (int)InventoryBoxStatus.InPosition, CreateBy = 1, CreateUser = "******", CreateDate = DateTime.Now, ModifiedBy = 1, ModifiedUser = "******", ModifiedDate = DateTime.Now }; sqlClient.Insertable(box).ExecuteCommand(); } } }
public IActionResult Add(string id) { var model = new Wms_warehouse(); if (id.IsEmpty()) { return(View(model)); } else { model = _warehouseServices.QueryableToEntity(c => c.WarehouseId == SqlFunc.ToInt64(id)); return(View(model)); } }
protected static void CreateReservoirArea(SqlSugarClient sqlClient, Wms_warehouse warehouse) { for (int i = 1; i <= 3; i++) { try { Wms_reservoirarea reservoirarea = new Wms_reservoirarea() { ReservoirAreaId = i, ReservoirAreaNo = "KQ000" + i, ReservoirAreaName = "库区000" + i, WarehouseId = warehouse.WarehouseId, Remark = "", CreateBy = 1, CreateUser = "******", CreateDate = DateTime.Now, ModifiedBy = 1, ModifiedUser = "******", ModifiedDate = DateTime.Now, IsDel = DeleteFlag.Normal, }; sqlClient.Insertable(reservoirarea).ExecuteCommand(); if (i == 1) { CreateStoragerack(sqlClient, warehouse, reservoirarea, 1, 10, 4); CreateStoragerack(sqlClient, warehouse, reservoirarea, 2, 10, 4); } else if (i == 2) { CreateStoragerack(sqlClient, warehouse, reservoirarea, 3, 14, 7); CreateStoragerack(sqlClient, warehouse, reservoirarea, 4, 14, 7); CreateStoragerack(sqlClient, warehouse, reservoirarea, 5, 14, 7); CreateStoragerack(sqlClient, warehouse, reservoirarea, 6, 14, 7); } else if (i == 3) { CreateStoragerack(sqlClient, warehouse, reservoirarea, 7, 14, 16); CreateStoragerack(sqlClient, warehouse, reservoirarea, 8, 14, 16); } } catch (Exception e) { throw e; } } }
public WMSBaseApiAccessor(Wms_warehouse warehouse, ISqlSugarClient client, SysUserDto userDto) { this.Warehouse = warehouse; HttpApiConfig config = new HttpApiConfig(); config.HttpHost = new Uri(warehouse.IFAddress); if (!string.IsNullOrWhiteSpace(WMSProxy)) { config.HttpHandler.UseProxy = true; config.HttpHandler.Proxy = new HttpProxy(WMSProxy); WebRequest.DefaultWebProxy = new WebProxy(WMSProxy) { BypassProxyOnLocal = false }; } _apiProxy = HttpApi.Create <IWMSApiProxy>(config); _selfAccessor = new SelfWMSBaseApiAccessor(warehouse, client, userDto); }
public static void Create(SqlSugarClient sqlClient, ILogger logger) { if (sqlClient.Queryable <Wms_warehouse>().Any()) { logger.Info("无需创建初始仓库数据"); return; } logger.Info("开始创建初始仓库数据"); try { sqlClient.BeginTran(); for (int i = 1; i <= 4; i++) { Wms_warehouse warehouse = new Wms_warehouse() { WarehouseId = i, WarehouseNo = $"A0{i - 1}", WarehouseName = "仓库000" + i, IFAddress = "", CreateBy = 1, CreateDate = DateTime.Now, ModifiedBy = 1, ModifiedDate = DateTime.Now, IsDel = DeleteFlag.Normal, Remark = "" }; sqlClient.Insertable(warehouse).ExecuteCommand(); if (i == 1) { CreateReservoirArea(sqlClient, warehouse); } } sqlClient.CommitTran(); logger.Info("创建初始仓库数据成功"); } catch (Exception ex) { logger.Error(ex, "创建初始仓库数据失败"); sqlClient.RollbackTran(); } }
/// <summary> /// 获取基本Api /// </summary> /// <param name="key"></param> /// <param name="sqlSugar"></param> /// <param name="user"></param> /// <returns></returns> public static IWMSBaseApiAccessor GetBaseApiAccessor(string key, ISqlSugarClient sqlSugar, SysUserDto user = null) { if (_baseApiInstanceMap.ContainsKey(key)) { return(_baseApiInstanceMap[key]); } if (!_warehouseMap.ContainsKey(key)) { return(null); } Wms_warehouse warehouse = _warehouseMap[key]; IWMSBaseApiAccessor accessor = null; if (string.IsNullOrWhiteSpace(warehouse.IFAddress)) { accessor = new SelfWMSBaseApiAccessor(warehouse, sqlSugar, user); } else { accessor = new WMSBaseApiAccessor(warehouse, sqlSugar, user); _baseApiInstanceMap.Add(key, accessor); } return(accessor); }
public async Task <string> DetailList(string id, MESTaskTypes mesTaskType) { long searchMesId = id.ToInt64(); if (id.IsEmptyZero()) { return(""); } //IWMSBaseApiAccessor[] proxies = WMSApiManager.GetAll(_client); if (mesTaskType == MESTaskTypes.StockIn) { List <Wms_stockin> stockins = await _client.Queryable <Wms_stockin>().Where(x => x.MesTaskId == searchMesId).ToListAsync(); List <OutsideStockInQueryResult> totalResult = new List <OutsideStockInQueryResult>(); foreach (Wms_stockin stockin in stockins) { IWMSBaseApiAccessor proxy = WMSApiManager.GetBaseApiAccessor(stockin.WarehouseId.ToString(), _client, this.UserDto); Wms_warehouse warehouse = proxy.Warehouse; try { RouteData <OutsideStockInQueryResult> result = await proxy.QueryStockIn(stockin.StockInId); result.Data.WarehouseName = warehouse.WarehouseName; totalResult.Add(result.Data); } catch (Exception ex) { this._logger.LogError(ex, $"查询入库信息失败,WarhouseId={stockin.WarehouseId},StockInId={stockin.StockInId}"); OutsideStockInQueryResult resultData = new OutsideStockInQueryResult() { WarehouseName = warehouse.WarehouseName, StockInId = stockin.StockInId.ToString(), StockInNo = stockin.StockInNo, StockInTypeName = stockin.StockInTypeName, StockInStatus = (StockInStatus)stockin.StockInStatus, MesTaskId = stockin.MesTaskId.ToString(), OrderNo = stockin.OrderNo, Remark = "详细信息查询失败,仅显示本地信息" }; totalResult.Add(resultData); } } return(JsonConvert.SerializeObject(Bootstrap.GridData(totalResult, totalResult.Count))); } else if (mesTaskType == MESTaskTypes.StockOut) { List <Wms_stockout> stockOuts = await _client.Queryable <Wms_stockout>().Where(x => x.MesTaskId == searchMesId).ToListAsync(); List <OutsideStockOutQueryResult> totalResult = new List <OutsideStockOutQueryResult>(); foreach (Wms_stockout stockout in stockOuts) { IWMSBaseApiAccessor proxy = WMSApiManager.GetBaseApiAccessor(stockout.WarehouseId.ToString(), _client, this.UserDto); Wms_warehouse warehouse = proxy.Warehouse; try { RouteData <OutsideStockOutQueryResult> result = await proxy.QueryStockOut(stockout.StockOutId); result.Data.WarehouseName = warehouse.WarehouseName; totalResult.Add(result.Data); } catch (Exception ex) { this._logger.LogError(ex, $"查询出库信息失败,WarhouseId={stockout.WarehouseId},StockOutId={stockout.StockOutId}"); OutsideStockOutQueryResult resultData = new OutsideStockOutQueryResult() { WarehouseName = warehouse.WarehouseName, StockOutId = stockout.StockOutId.ToString(), StockOutNo = stockout.StockOutNo, StockOutTypeName = stockout.StockOutTypeName, StockOutStatus = (StockOutStatus)stockout.StockOutStatus.Value, BatchNumber = stockout.BatchNumber, BatchPlanId = stockout.BatchPlanId, MesTaskId = stockout.MesTaskId.ToString(), WorkNo = stockout.WorkNo, WorkAreaName = stockout.WorkAreaName, WorkStationId = stockout.WorkStationId, OrderNo = stockout.OrderNo, Remark = "详细信息查询失败,仅显示本地信息" }; totalResult.Add(resultData); } } return(Bootstrap.GridData(totalResult, totalResult.Count).JilToJson()); } else { return(""); } }
public SelfWMSManagementApiAccessor(Wms_warehouse warehouse, SqlSugar.ISqlSugarClient sqlClient, SysUserDto userDto) { _warehouse = warehouse; _sqlClient = sqlClient; _userDto = userDto; }
private RouteData CreateWMSStockout(Wms_mestask mesTask, OutsideWarehouseEntryMaterialDto[] suppliesInfoList) { Dictionary <long, List <Wms_WarehouseEntryMaterialInventoryDto> > map = new Dictionary <long, List <Wms_WarehouseEntryMaterialInventoryDto> >(); foreach (OutsideWarehouseEntryMaterialDto materialDto in suppliesInfoList) { //Sys_dict typeDict = _sqlClient.Queryable<Sys_dict>() // .First(x => x.DictType == PubDictType.material.ToByte().ToString() && x.DictName == materialDto.SuppliesType); //if (typeDict == null) //{ // return RouteData<Wms_material>.From(PubMessages.E1001_SUPPLIESTYPE_NOTFOUND, $"SuppliesType = {materialDto.SuppliesType}"); //} //else if (typeDict.WarehouseId == null) //{ // return RouteData<Wms_material>.From(PubMessages.E1002_SUPPLIESTYPE_WAREHOUSEID_NOTSET, $"SuppliesType = {materialDto.SuppliesType}"); //} //long warehouseId = typeDict.WarehouseId.Value; string warehouseNo = string.IsNullOrWhiteSpace(materialDto.WarehouseId) ? "A00" : materialDto.WarehouseId; //MES的WarehouseID对应WMS的WarehouseNo Wms_warehouse warehouse = WMSApiManager.GetWarehouse(warehouseNo); if (warehouse == null) { return(RouteData <Wms_material> .From(PubMessages.E1026_SUPPLIES_WAREHOUSEID_NOTFOUND, $"warehouseId = {warehouseNo}")); } long warehouseId = warehouse.WarehouseId; List <Wms_WarehouseEntryMaterialInventoryDto> warehouseMaterialList = null; if (map.ContainsKey(warehouseId)) { warehouseMaterialList = map[warehouseId]; } else { warehouseMaterialList = new List <Wms_WarehouseEntryMaterialInventoryDto>(); map.Add(warehouseId, warehouseMaterialList); } warehouseMaterialList.Add(new Wms_WarehouseEntryMaterialInventoryDto() { MaterialId = "-1", SubWarehouseEntryId = materialDto.SubWarehouseEntryId, UniqueIndex = materialDto.UniqueIndex, MaterialOnlyId = materialDto.SuppliesOnlyId, MaterialNo = materialDto.SuppliesId, MaterialName = materialDto.SuppliesName, MaterialType = materialDto.SuppliesType, Qty = materialDto.SuppliesNumber, Unit = materialDto.Unit }); } List <RouteData> result = new List <RouteData>(); foreach (KeyValuePair <long, List <Wms_WarehouseEntryMaterialInventoryDto> > keyValue in map) { try { IWMSBaseApiAccessor proxy = WMSApiManager.GetBaseApiAccessor(keyValue.Key.ToString(), _sqlClient); OutsideStockOutRequestDto request = new OutsideStockOutRequestDto() { MesTaskId = mesTask.MesTaskId, WarehouseEntryId = mesTask.WarehousingId, WarehouseEntryTime = mesTask.WarehousingTime.ToString(PubConst.Format_DateTime), WarehouseEntryType = mesTask.WarehousingType, WarehouseId = keyValue.Key, OrderNo = mesTask.ProductionPlanId, WorkNo = mesTask.TotalWorkOrder, BatchNumber = mesTask.BatchNumber, WorkAreaName = mesTask.WorkAreaName, WorkStationId = mesTask.WorkStationId, BatchPlanId = mesTask.BatchPlanId, MaterialList = keyValue.Value.ToArray(), }; _logger.LogInformation("小WMS的StockOut开始", ""); RouteData data = proxy.StockOut(request).GetAwaiter().GetResult(); _logger.LogInformation("小WMS的StockOut结束", ""); if (!data.IsSccuess) { string message = $"仓库{keyValue.Key}下发出库任务失败,Code={data.Code},Message={data.Message}"; _logger.LogError(message); result.Add(data); return(new RouteData() { Code = -1, Message = message }); } else { _logger.LogInformation($"仓库{keyValue.Key}下发出库任务成功"); } } catch (Exception ex) { string message = $"仓库{keyValue.Key}下发出库任务发生异常"; _logger.LogError(ex, message); return(new RouteData() { Code = -1, Message = message }); } } return(new RouteData()); }
/// <summary> /// 通知MES入库完成 /// </summary> /// <param name="stockOutId"></param> /// <param name="result"></param> /// <returns></returns> public static async Task <RouteData> NofityStockIn(this ISqlSugarClient client, Wms_mestask mesTask) { mesTask.ModifiedDate = DateTime.Now; mesTask.WorkStatus = MESTaskWorkStatus.WorkComplated; mesTask.NotifyStatus = MESTaskNotifyStatus.WaitResponse; try { List <Wms_stockin> stockIns = await client.Queryable <Wms_stockin>().Where(x => x.MesTaskId == mesTask.MesTaskId).ToListAsync(); List <OutsideStockInResponseWarehouse> warehouseList = new List <OutsideStockInResponseWarehouse>(); foreach (Wms_stockin stockIn in stockIns) { OutsideStockInResponseWarehouse warehouse = warehouseList.FirstOrDefault(x => x.WarehouseId == stockIn.WarehouseId.ToString()); if (warehouse == null) { Wms_warehouse warehouseData = WMSApiManager.GetWarehouse(stockIn.WarehouseId); warehouse = new OutsideStockInResponseWarehouse() { //WarehouseId = stockIn.WarehouseId.ToString(), WarehouseId = warehouseData?.WarehouseNo, WarehouseName = warehouseData?.WarehouseName, WarehousePosition = "", WarehousingFinishTime = stockIn.ModifiedDate.Value.ToString("yyyy-MM-dd HH:mm:ss"), }; warehouseList.Add(warehouse); } List <Wms_stockindetail> stockInDetails = await client.Queryable <Wms_stockindetail>().Where(x => x.StockInId == stockIn.StockInId).ToListAsync(); foreach (Wms_stockindetail stockInDetail in stockInDetails) { OutsideMaterialResult material = new OutsideMaterialResult() { UniqueIndex = stockInDetail.UniqueIndex, SuppliesId = stockInDetail.MaterialNo.ToString(), SuppliesName = stockInDetail.MaterialName, SuppliesNumber = stockInDetail.ActInQty.ToString(), RefreshStock = stockInDetail.ActInQty.ToString(), ErrorId = stockInDetail.ErrorId, ErrorInfo = stockInDetail.ErrorInfo }; warehouse.SuppliesInfoList.Add(material); warehouse.SuppliesKinds = warehouse.SuppliesInfoList.Count; } } OutsideStockInResponse response = new OutsideStockInResponse() { WarehousingId = mesTask.WarehousingId, WarehousingEntryNumber = warehouseList.Count, WarehousingEntryFinishList = JsonConvert.SerializeObject(warehouseList) }; SelfReservoirAreaManager._logger.Info($"[通知MES入库完成]开始通知MES,param={JsonConvert.SerializeObject(response)}"); OutsideStockInResponseResult result = await MESApiAccessor.Instance.WarehousingFinish(response); SelfReservoirAreaManager._logger.Info($"[通知MES入库完成]通知MES成功,result={JsonConvert.SerializeObject(result)}"); if (String.IsNullOrWhiteSpace(result.IsNormalExecution)) { mesTask.NotifyStatus = MESTaskNotifyStatus.Responsed; } else { mesTask.Remark = $"Error={result.IsNormalExecution}"; mesTask.NotifyStatus = MESTaskNotifyStatus.Failed; } } catch (Exception ex) { mesTask.Remark = $"InnerError={ex.Message}"; mesTask.NotifyStatus = MESTaskNotifyStatus.Failed; //_logger.LogError(ex, "入库完成通知时发生异常"); //逻辑继续,寻找其它时机重新通知 SelfReservoirAreaManager._logger.Error($"[通知MES入库完成]通知MES时发生异常,{ex.ToString()}"); } if (client.Updateable(mesTask).ExecuteCommand() == 0) { SelfReservoirAreaManager._logger.Error($"[通知MES入库完成]E-0002-更新状态失败"); return(YL.Core.Dto.RouteData.From(PubMessages.E0002_UPDATE_COUNT_FAIL)); } SelfReservoirAreaManager._logger.Info($"[通知MES入库完成]更新状态成功,NotifyStatus={mesTask.NotifyStatus}"); if (mesTask.NotifyStatus == MESTaskNotifyStatus.Responsed) { return(new RouteData()); } else { return(YL.Core.Dto.RouteData.From(PubMessages.E3001_MES_STOCKIN_NOFITY_FAIL)); } }
public static void Regist(Wms_warehouse warehouse) { _warehouseMap.Add(warehouse.WarehouseId.ToString(), warehouse); }