using Microsoft.AspNetCore.Mvc;
using WCS.BLL.DbModels;
using WCS.BLL.Services.IService;
using WCS.BLL.Services.Service;
using WCS.DAL.Db;
using WCS.DAL.DbModels;
using WCS.Model;
using WCS.Model.ApiModel.MatBaseInfo;
using WCS.Model.ApiModel.MatDetailCurrentInfo;
using WCS.Model.ApiModel.PDAProductionLineCallIn;
using WCS.Model.ApiModel.PDAShelfLocationBindUnbind;
using WCS.Model.ApiModel.Stocktaking;
namespace WCS.WebApi.Controllers
{
///
/// PDA产线呼叫功能
///
[ApiController]
[Route("[controller]")]
public class PDAProductionLineCallInController : ControllerBase
{
public PDAProductionLineCallInController(IStockTakingService stockTakingService)
{
}
///
/// 扫描工位码 获取工位信息 返回工位是否可以呼叫货架等信息
///
///
///
[Route("getLocationInfoForCallIn")]
[HttpPost(Name = "getLocationInfoForCallIn")]
public async Task getLocationInfoForCallIn(GetLocationInfoForCallInRequest request)
{
try
{
#region 参数校验
if (string.IsNullOrEmpty(request.LocationCode))
{
return new ResponseCommon()
{
Code = 201,
Message = $"参数错误:请重新扫描工位码!",
Data = null,
};
}
#endregion
//获取位置信息
var locationInfo = await DbHelp.db.Queryable()
.Where(t => t.LocationCode == request.LocationCode)
.FirstAsync();
if (locationInfo == null)
{
return new ResponseCommon()
{
Code = 201,
Message = $"获取失败:工位{request.LocationCode}不存在!",
Data = null,
};
}
if (locationInfo.IsEnable == false)
{
return new ResponseCommon()
{
Code = 201,
Message = $"获取失败:工位{locationInfo.LocationCode}已被禁用!",
Data = null,
};
}
var shelfInfo = await DbHelp.db.Queryable()
.Where(t => t.CurrentLocationId == locationInfo.Id)
.FirstAsync();
return new ResponseCommon()
{
Code = 200,
Message = $"success",
Data = new GetLocationInfoForCallInResponseData()
{
LocationId = locationInfo.Id,
LocationCode = locationInfo.LocationCode,
ShelfTransStatusStr = shelfInfo?.TransStatus.ToString(),
ShelfCode = shelfInfo?.ShelfCode,
},
};
}
catch (Exception ex)
{
return new ResponseCommon()
{
Code = 201,
Message = ex.Message,
Data = null,
};
}
}
///
/// 通过工位码、模糊搜索条件 返回库存存量数据(带货架信息的)
///
///
///
[Route("getMatDetailCurrentInfosForCallIn")]
[HttpPost(Name = "getMatDetailCurrentInfosForCallIn")]
public async Task getMatDetailCurrentInfosForCallIn(GetMatDetailCurrentInfosForCallInRequest request)
{
try
{
#region 校验位置是否可以呼叫货架
if (request.LocationId == 0)
{
return new ResponseCommon()
{
Code = 201,
Message = $"参数错误:请重新扫描工位码!",
Data = null,
};
}
//获取位置信息
var locationInfo = await DbHelp.db.Queryable()
.Where(t => t.Id == request.LocationId)
.FirstAsync();
if (locationInfo == null)
{
return new ResponseCommon()
{
Code = 201,
Message = $"获取失败:工位{request.LocationCode}不存在!",
Data = null,
};
}
if (locationInfo.IsEnable == false)
{
return new ResponseCommon()
{
Code = 201,
Message = $"获取失败:工位{locationInfo.LocationCode}已被禁用!",
Data = null,
};
}
var shelfInfo = await DbHelp.db.Queryable()
.Where(t => t.CurrentLocationId == locationInfo.Id)
.FirstAsync();
if (shelfInfo != null)
{
return new ResponseCommon()
{
Code = 301,
Message = $"获取失败:工位{locationInfo.LocationCode}已被货架{shelfInfo.ShelfCode}占用!",
Data = null,
};
}
#endregion
#region 查询货架当前存量
var recordsQueryable = DbHelp.db.Queryable()
.LeftJoin((mci, si) => mci.ShelfId == si.Id)
//货架状态是静止的 代表这个货架没有被呼叫走哦
.LeftJoin((mci, si, li) => (si.TransStatus == TransStatusEnum.静止 && si.CurrentLocationId == li.Id))
.WhereIF(!string.IsNullOrEmpty(request.MatCodeCondition), (mci, si, li) => mci.MatCode.Contains(request.MatCodeCondition))
.Select((mci, si, li) => new MatDetailCurrentInfoModel()
{
Id = mci.Id,
ShelfId = mci.ShelfId,
ShelfCode = mci.ShelfCode,
ShelfType = mci.ShelfType,
LocationArea = li.LocationArea,
LocationCode = li.LocationCode,
MatCode = mci.MatCode,
MatName = mci.MatName,
MatSpec = mci.MatSpec,
MatUnit = mci.MatUnit,
MatCustomer = mci.MatCustomer,
MatQty = mci.MatQty,
MatSupplier = mci.MatSupplier,
StationCode = mci.StationCode,
ModifyUser = mci.ModifyUser,
ModifyTime = mci.ModifyTime
});
//分页
var totalCount = await recordsQueryable.CountAsync();
var records = await recordsQueryable
.OrderByDescending(mci => mci.Id)
.Skip((1 - 1) * 300).Take(300)
.ToListAsync();
return new PageQueryResponse()
{
Code = 200,
Message = $"success",
Data = new PageQueryResponseData()
{
TotalCount = totalCount,
MaxPage = 1,
Count = records.Count,
Lists = records.ToList()
}
};
#endregion
}
catch (Exception ex)
{
return new ResponseCommon()
{
Code = 201,
Message = ex.Message,
Data = null,
};
}
}
///
/// 呼叫货架 通过工位ID(终点) 货架ID 等信息呼叫货架
///
///
///
[Route("callIn")]
[HttpPost(Name = "callIn")]
public async Task callIn(CallOutRequest request)
{
try
{
#region 校验位置是否可以呼叫货架
if (request.LocationId == 0)
{
return new ResponseCommon()
{
Code = 201,
Message = $"呼叫失败:请重新扫描工位码!",
Data = null,
};
}
//获取位置信息
var locationInfo = await DbHelp.db.Queryable()
.Where(t => t.Id == request.LocationId)
.FirstAsync();
if (locationInfo == null)
{
return new ResponseCommon()
{
Code = 201,
Message = $"呼叫失败:工位{request.LocationCode}不存在!",
Data = null,
};
}
if (locationInfo.IsEnable == false)
{
return new ResponseCommon()
{
Code = 201,
Message = $"呼叫失败:工位{locationInfo.LocationCode}已被禁用!",
Data = null,
};
}
var shelfInfo = await DbHelp.db.Queryable()
.Where(t => t.CurrentLocationId == locationInfo.Id)
.FirstAsync();
if (shelfInfo != null)
{
return new ResponseCommon()
{
Code = 301,
Message = $"呼叫失败:工位{locationInfo.LocationCode}已被货架{shelfInfo.ShelfCode}占用!",
Data = null,
};
}
#endregion
#region 获取货架是否可以被呼叫
shelfInfo = await DbHelp.db.Queryable()
.Where(t => t.Id == request.ShelfId)
.Where(t => t.IsEnable)
.FirstAsync();
if (shelfInfo == null)
{
return new ResponseCommon()
{
Code = 201,
Message = $"呼叫失败:货架{shelfInfo.ShelfCode}不存在或已被禁用!",
Data = null,
};
}
if (shelfInfo.TransStatus == TransStatusEnum.运输中)
{
return new ResponseCommon()
{
Code = 201,
Message = $"呼叫失败:货架{shelfInfo.ShelfCode}正在运输中!",
Data = null,
};
}
#endregion
#region
//TO DO 调用AGV接口开始呼叫 呼叫成功更新运输状态和目标库位
return new ResponseCommon()
{
Code = 200,
Message = $"呼叫成功!",
Data = null,
};
#endregion
}
catch (Exception ex)
{
return new ResponseCommon()
{
Code = 201,
Message = ex.Message,
Data = null,
};
}
}
}
}